From 57ed098c946f714cacac5833f74cb5fd89304a7a Mon Sep 17 00:00:00 2001 From: jajugoguma Date: Sat, 19 Jun 2021 03:59:55 +0900 Subject: [PATCH] 1.1.0 --- dist/toastui-select-box.css | 10 +- dist/toastui-select-box.js | 1194 +++++++++++++++++-------------- dist/toastui-select-box.min.css | 4 +- dist/toastui-select-box.min.js | 4 +- index.d.ts | 2 +- 5 files changed, 661 insertions(+), 553 deletions(-) diff --git a/dist/toastui-select-box.css b/dist/toastui-select-box.css index f6da676..db27fb0 100644 --- a/dist/toastui-select-box.css +++ b/dist/toastui-select-box.css @@ -1,6 +1,6 @@ /*! * TOAST UI Select Box - * @version 1.0.1 | Fri May 21 2021 + * @version 1.1.0 | Sat Jun 19 2021 * @author NHN FE Development Lab * @license MIT */ @@ -19,6 +19,12 @@ border: 1px solid #ddd; } +.tui-select-box-input:focus { + outline: 5px auto Highlight; + outline: 5px auto -webkit-focus-ring-color; +} + + .tui-select-box-input.tui-select-box-open, .tui-select-box-dropdown { border: 1px solid #aaa; @@ -124,4 +130,4 @@ display: none; /* for test */ } -/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vc3JjL2Nzcy9zZWxlY3RCb3guY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0I7QUFDaEIsQyIsImZpbGUiOiJ0b2FzdHVpLXNlbGVjdC1ib3guY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnR1aS1zZWxlY3QtYm94IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4udHVpLXNlbGVjdC1ib3gtaW5wdXQsXG4udHVpLXNlbGVjdC1ib3gtZHJvcGRvd24sXG4udHVpLXNlbGVjdC1ib3gtaXRlbS1ncm91cC1sYWJlbCxcbi50dWktc2VsZWN0LWJveC1pdGVtIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLnR1aS1zZWxlY3QtYm94LWlucHV0IHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbn1cblxuLnR1aS1zZWxlY3QtYm94LWlucHV0LnR1aS1zZWxlY3QtYm94LW9wZW4sXG4udHVpLXNlbGVjdC1ib3gtZHJvcGRvd24ge1xuICBib3JkZXI6IDFweCBzb2xpZCAjYWFhO1xufVxuXG4udHVpLXNlbGVjdC1ib3gtaW5wdXQsXG4udHVpLXNlbGVjdC1ib3gtZHJvcGRvd24ge1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xufVxuXG4udHVpLXNlbGVjdC1ib3gtaW5wdXQsXG4udHVpLXNlbGVjdC1ib3gtaXRlbS1ncm91cC1sYWJlbCxcbi50dWktc2VsZWN0LWJveC1pdGVtIHtcbiAgcGFkZGluZzogMCA4cHg7XG4gIGhlaWdodDogMjlweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogIzMzMztcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4udHVpLXNlbGVjdC1ib3gtcGxhY2Vob2xkZXIsXG4udHVpLXNlbGVjdC1ib3gtaXRlbS1ncm91cC1sYWJlbCxcbi50dWktc2VsZWN0LWJveC1pdGVtIHtcbiAgbGluZS1oZWlnaHQ6IDI5cHg7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG4udHVpLXNlbGVjdC1ib3gtcGxhY2Vob2xkZXIsXG4udHVpLXNlbGVjdC1ib3gtaWNvbiB7XG4gIGhlaWdodDogMTAwJVxufVxuXG4udHVpLXNlbGVjdC1ib3gtcGxhY2Vob2xkZXIge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDgwJTtcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDEycHgpO1xuICB2ZXJ0aWNhbC1hbGlnbjogc3ViO1xufVxuXG4udHVpLXNlbGVjdC1ib3gtaWNvbiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmbG9hdDogcmlnaHQ7XG4gIGJhY2tncm91bmQ6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQUVDQVlBQUFDSHRML3NBQUFBQVhOU1IwSUFyczRjNlFBQUJCRnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlsaE5VQ0JEYjNKbElEVXVOQzR3SWo0S0lDQWdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRLSUNBZ0lDQWdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlLSUNBZ0lDQWdJQ0FnSUNBZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUNpQWdJQ0FnSUNBZ0lDQWdJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklnb2dJQ0FnSUNBZ0lDQWdJQ0I0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUNpQWdJQ0FnSUNBZ0lDQWdJSGh0Ykc1ek9uUnBabVk5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmRHbG1aaTh4TGpBdklqNEtJQ0FnSUNBZ0lDQWdQSGh0Y0UxTk9rUmxjbWwyWldSR2NtOXRJSEprWmpwd1lYSnpaVlI1Y0dVOUlsSmxjMjkxY21ObElqNEtJQ0FnSUNBZ0lDQWdJQ0FnUEhOMFVtVm1PbWx1YzNSaGJtTmxTVVErZUcxd0xtbHBaRG96T1RVME1EWkZNMEpFUWpFeE1VVTJPRVExTWtVeU4wTTBORGRFTWtJeE1Ud3ZjM1JTWldZNmFXNXpkR0Z1WTJWSlJENEtJQ0FnSUNBZ0lDQWdJQ0FnUEhOMFVtVm1PbVJ2WTNWdFpXNTBTVVErZUcxd0xtUnBaRG96T1RVME1EWkZORUpFUWpFeE1VVTJPRVExTWtVeU4wTTBORGRFTWtJeE1Ud3ZjM1JTWldZNlpHOWpkVzFsYm5SSlJENEtJQ0FnSUNBZ0lDQWdQQzk0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiVDRLSUNBZ0lDQWdJQ0FnUEhodGNFMU5Pa1J2WTNWdFpXNTBTVVErZUcxd0xtUnBaRG96T1RVME1EWkZOa0pFUWpFeE1VVTJPRVExTWtVeU4wTTBORGRFTWtJeE1Ud3ZlRzF3VFUwNlJHOWpkVzFsYm5SSlJENEtJQ0FnSUNBZ0lDQWdQSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUStlRzF3TG1scFpEb3pPVFUwTURaRk5VSkVRakV4TVVVMk9FUTFNa1V5TjBNME5EZEVNa0l4TVR3dmVHMXdUVTA2U1c1emRHRnVZMlZKUkQ0S0lDQWdJQ0FnSUNBZ1BIaHRjRHBEY21WaGRHOXlWRzl2YkQ1QlpHOWlaU0JRYUc5MGIzTm9iM0FnUTFNMklDaFhhVzVrYjNkektUd3ZlRzF3T2tOeVpXRjBiM0pVYjI5c1Bnb2dJQ0FnSUNBZ0lDQThkR2xtWmpwUGNtbGxiblJoZEdsdmJqNHhQQzkwYVdabU9rOXlhV1Z1ZEdGMGFXOXVQZ29nSUNBZ0lDQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNEtJQ0FnUEM5eVpHWTZVa1JHUGdvOEwzZzZlRzF3YldWMFlUNEsvWnFrVmdBQUFFUkpSRUZVR0Jsak5EWTIvcytBQTV3OWU1WVJYUXFxWGdBbzl4RWtCMWFBelJBOG1tRm1nZzFoZ3ZJRVlLSWdtZ2pOSUdVZlFBVGNpVUJYOElNRWlkUU0wZ3NHQVBhYkhKN1piZ3g1QUFBQUFFbEZUa1N1UW1DQykgbGVmdCBjZW50ZXIgbm8tcmVwZWF0O1xuICB3aWR0aDogN3B4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LWluZGVudDogMTAwJTtcbn1cblxuLnR1aS1zZWxlY3QtYm94LW9wZW4gPiAudHVpLXNlbGVjdC1ib3gtaWNvbiB7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IHJpZ2h0IGNlbnRlcjtcbn1cblxuLnR1aS1zZWxlY3QtYm94LWRyb3Bkb3duLFxuLnR1aS1zZWxlY3QtYm94LWl0ZW0tZ3JvdXAge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbn1cblxuLnR1aS1zZWxlY3QtYm94LWRyb3Bkb3duIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3JkZXItdG9wOiBub25lO1xuICAvKiBtYXgtaGVpZ2h0OiAxNDVweDsgKi9cbiAgb3ZlcmZsb3c6IGF1dG87XG4gIHotaW5kZXg6IDE7XG4gIHdpZHRoOiAxMDAlO1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG59XG5cbi50dWktc2VsZWN0LWJveC1pdGVtLWdyb3VwLWxhYmVsIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG59XG5cbi50dWktc2VsZWN0LWJveC1pdGVtLWdyb3VwID4gLnR1aS1zZWxlY3QtYm94LWl0ZW0ge1xuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XG59XG5cbi50dWktc2VsZWN0LWJveC1zZWxlY3RlZCB7XG4gIGJhY2tncm91bmQ6ICNmNGY0ZjQ7XG59XG5cbi50dWktc2VsZWN0LWJveC1oaWdobGlnaHQge1xuICBiYWNrZ3JvdW5kOiAjZTVmNmZmO1xuICBvdXRsaW5lOiBub25lO1xufVxuXG4udHVpLXNlbGVjdC1ib3gtZGlzYWJsZWQge1xuICBiYWNrZ3JvdW5kOiAjZjlmOWY5O1xuICBjb2xvcjogI2M4YzhjODtcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4udHVpLXNlbGVjdC1ib3gtaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTsgLyogZm9yIHRlc3QgKi9cbn0iXSwic291cmNlUm9vdCI6IiJ9*/ \ No newline at end of file +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vc3JjL2Nzcy9zZWxlY3RCb3guY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCO0FBQ2hCLEMiLCJmaWxlIjoidG9hc3R1aS1zZWxlY3QtYm94LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi50dWktc2VsZWN0LWJveCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLnR1aS1zZWxlY3QtYm94LWlucHV0LFxuLnR1aS1zZWxlY3QtYm94LWRyb3Bkb3duLFxuLnR1aS1zZWxlY3QtYm94LWl0ZW0tZ3JvdXAtbGFiZWwsXG4udHVpLXNlbGVjdC1ib3gtaXRlbSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi50dWktc2VsZWN0LWJveC1pbnB1dCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG59XG5cbi50dWktc2VsZWN0LWJveC1pbnB1dDpmb2N1cyB7XG4gIG91dGxpbmU6IDVweCBhdXRvIEhpZ2hsaWdodDtcbiAgb3V0bGluZTogNXB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yO1xufVxuXG5cbi50dWktc2VsZWN0LWJveC1pbnB1dC50dWktc2VsZWN0LWJveC1vcGVuLFxuLnR1aS1zZWxlY3QtYm94LWRyb3Bkb3duIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2FhYTtcbn1cblxuLnR1aS1zZWxlY3QtYm94LWlucHV0LFxuLnR1aS1zZWxlY3QtYm94LWRyb3Bkb3duIHtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbn1cblxuLnR1aS1zZWxlY3QtYm94LWlucHV0LFxuLnR1aS1zZWxlY3QtYm94LWl0ZW0tZ3JvdXAtbGFiZWwsXG4udHVpLXNlbGVjdC1ib3gtaXRlbSB7XG4gIHBhZGRpbmc6IDAgOHB4O1xuICBoZWlnaHQ6IDI5cHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY29sb3I6ICMzMzM7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnR1aS1zZWxlY3QtYm94LXBsYWNlaG9sZGVyLFxuLnR1aS1zZWxlY3QtYm94LWl0ZW0tZ3JvdXAtbGFiZWwsXG4udHVpLXNlbGVjdC1ib3gtaXRlbSB7XG4gIGxpbmUtaGVpZ2h0OiAyOXB4O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLnR1aS1zZWxlY3QtYm94LXBsYWNlaG9sZGVyLFxuLnR1aS1zZWxlY3QtYm94LWljb24ge1xuICBoZWlnaHQ6IDEwMCVcbn1cblxuLnR1aS1zZWxlY3QtYm94LXBsYWNlaG9sZGVyIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiA4MCU7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLSAxMnB4KTtcbiAgdmVydGljYWwtYWxpZ246IHN1Yjtcbn1cblxuLnR1aS1zZWxlY3QtYm94LWljb24ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgZmxvYXQ6IHJpZ2h0O1xuICBiYWNrZ3JvdW5kOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFFQ0FZQUFBQ0h0TC9zQUFBQUFYTlNSMElBcnM0YzZRQUFCQkZwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJbGhOVUNCRGIzSmxJRFV1TkM0d0lqNEtJQ0FnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0S0lDQWdJQ0FnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJS0lDQWdJQ0FnSUNBZ0lDQWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlDaUFnSUNBZ0lDQWdJQ0FnSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJZ29nSUNBZ0lDQWdJQ0FnSUNCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlDaUFnSUNBZ0lDQWdJQ0FnSUhodGJHNXpPblJwWm1ZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZkR2xtWmk4eExqQXZJajRLSUNBZ0lDQWdJQ0FnUEhodGNFMU5Pa1JsY21sMlpXUkdjbTl0SUhKa1pqcHdZWEp6WlZSNWNHVTlJbEpsYzI5MWNtTmxJajRLSUNBZ0lDQWdJQ0FnSUNBZ1BITjBVbVZtT21sdWMzUmhibU5sU1VRK2VHMXdMbWxwWkRvek9UVTBNRFpGTTBKRVFqRXhNVVUyT0VRMU1rVXlOME0wTkRkRU1rSXhNVHd2YzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDRLSUNBZ0lDQWdJQ0FnSUNBZ1BITjBVbVZtT21SdlkzVnRaVzUwU1VRK2VHMXdMbVJwWkRvek9UVTBNRFpGTkVKRVFqRXhNVVUyT0VRMU1rVXlOME0wTkRkRU1rSXhNVHd2YzNSU1pXWTZaRzlqZFcxbGJuUkpSRDRLSUNBZ0lDQWdJQ0FnUEM5NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlQ0S0lDQWdJQ0FnSUNBZ1BIaHRjRTFOT2tSdlkzVnRaVzUwU1VRK2VHMXdMbVJwWkRvek9UVTBNRFpGTmtKRVFqRXhNVVUyT0VRMU1rVXlOME0wTkRkRU1rSXhNVHd2ZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDRLSUNBZ0lDQWdJQ0FnUEhodGNFMU5Pa2x1YzNSaGJtTmxTVVErZUcxd0xtbHBaRG96T1RVME1EWkZOVUpFUWpFeE1VVTJPRVExTWtVeU4wTTBORGRFTWtJeE1Ud3ZlRzF3VFUwNlNXNXpkR0Z1WTJWSlJENEtJQ0FnSUNBZ0lDQWdQSGh0Y0RwRGNtVmhkRzl5Vkc5dmJENUJaRzlpWlNCUWFHOTBiM05vYjNBZ1ExTTJJQ2hYYVc1a2IzZHpLVHd2ZUcxd09rTnlaV0YwYjNKVWIyOXNQZ29nSUNBZ0lDQWdJQ0E4ZEdsbVpqcFBjbWxsYm5SaGRHbHZiajR4UEM5MGFXWm1Pazl5YVdWdWRHRjBhVzl1UGdvZ0lDQWdJQ0E4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRLSUNBZ1BDOXlaR1k2VWtSR1BnbzhMM2c2ZUcxd2JXVjBZVDRLL1pxa1ZnQUFBRVJKUkVGVUdCbGpORFkyL3MrQUE1dzllNVlSWFFxcVhnQW85eEVrQjFhQXpSQThtbUZtZ2cxaGd2SUVZS0lnbWdqTklHVWZRQVRjaVVCWDhJTUVpZFFNMGdzR0FQYWJISjdaYmd4NUFBQUFBRWxGVGtTdVFtQ0MpIGxlZnQgY2VudGVyIG5vLXJlcGVhdDtcbiAgd2lkdGg6IDdweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1pbmRlbnQ6IDEwMCU7XG59XG5cbi50dWktc2VsZWN0LWJveC1vcGVuID4gLnR1aS1zZWxlY3QtYm94LWljb24ge1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCBjZW50ZXI7XG59XG5cbi50dWktc2VsZWN0LWJveC1kcm9wZG93bixcbi50dWktc2VsZWN0LWJveC1pdGVtLWdyb3VwIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG59XG5cbi50dWktc2VsZWN0LWJveC1kcm9wZG93biB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm9yZGVyLXRvcDogbm9uZTtcbiAgLyogbWF4LWhlaWdodDogMTQ1cHg7ICovXG4gIG92ZXJmbG93OiBhdXRvO1xuICB6LWluZGV4OiAxO1xuICB3aWR0aDogMTAwJTtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xufVxuXG4udHVpLXNlbGVjdC1ib3gtaXRlbS1ncm91cC1sYWJlbCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY3Vyc29yOiBkZWZhdWx0O1xufVxuXG4udHVpLXNlbGVjdC1ib3gtaXRlbS1ncm91cCA+IC50dWktc2VsZWN0LWJveC1pdGVtIHtcbiAgcGFkZGluZy1sZWZ0OiAyMHB4O1xufVxuXG4udHVpLXNlbGVjdC1ib3gtc2VsZWN0ZWQge1xuICBiYWNrZ3JvdW5kOiAjZjRmNGY0O1xufVxuXG4udHVpLXNlbGVjdC1ib3gtaGlnaGxpZ2h0IHtcbiAgYmFja2dyb3VuZDogI2U1ZjZmZjtcbiAgb3V0bGluZTogbm9uZTtcbn1cblxuLnR1aS1zZWxlY3QtYm94LWRpc2FibGVkIHtcbiAgYmFja2dyb3VuZDogI2Y5ZjlmOTtcbiAgY29sb3I6ICNjOGM4Yzg7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLnR1aS1zZWxlY3QtYm94LWhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7IC8qIGZvciB0ZXN0ICovXG59Il0sInNvdXJjZVJvb3QiOiIifQ==*/ \ No newline at end of file diff --git a/dist/toastui-select-box.js b/dist/toastui-select-box.js index fdff59c..f95aa19 100644 --- a/dist/toastui-select-box.js +++ b/dist/toastui-select-box.js @@ -1,6 +1,6 @@ /*! * TOAST UI Select Box - * @version 1.0.1 | Fri May 21 2021 + * @version 1.1.0 | Sat Jun 19 2021 * @author NHN FE Development Lab * @license MIT */ @@ -79,7 +79,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ /******/ var hotApplyOnUpdate = true; /******/ // eslint-disable-next-line no-unused-vars -/******/ var hotCurrentHash = "834074beb9ecec874d30"; +/******/ var hotCurrentHash = "a97d433f9d2297db2180"; /******/ var hotRequestTimeout = 10000; /******/ var hotCurrentModuleData = {}; /******/ var hotCurrentChildModule; @@ -172,6 +172,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ _declinedDependencies: {}, /******/ _selfAccepted: false, /******/ _selfDeclined: false, +/******/ _selfInvalidated: false, /******/ _disposeHandlers: [], /******/ _main: hotCurrentChildModule !== moduleId, /******/ @@ -202,6 +203,29 @@ return /******/ (function(modules) { // webpackBootstrap /******/ var idx = hot._disposeHandlers.indexOf(callback); /******/ if (idx >= 0) hot._disposeHandlers.splice(idx, 1); /******/ }, +/******/ invalidate: function() { +/******/ this._selfInvalidated = true; +/******/ switch (hotStatus) { +/******/ case "idle": +/******/ hotUpdate = {}; +/******/ hotUpdate[moduleId] = modules[moduleId]; +/******/ hotSetStatus("ready"); +/******/ break; +/******/ case "ready": +/******/ hotApplyInvalidatedModule(moduleId); +/******/ break; +/******/ case "prepare": +/******/ case "check": +/******/ case "dispose": +/******/ case "apply": +/******/ (hotQueuedInvalidatedModules = +/******/ hotQueuedInvalidatedModules || []).push(moduleId); +/******/ break; +/******/ default: +/******/ // ignore requests in error states +/******/ break; +/******/ } +/******/ }, /******/ /******/ // Management API /******/ check: hotCheck, @@ -243,7 +267,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ var hotDeferred; /******/ /******/ // The update info -/******/ var hotUpdate, hotUpdateNewHash; +/******/ var hotUpdate, hotUpdateNewHash, hotQueuedInvalidatedModules; /******/ /******/ function toModuleId(id) { /******/ var isNumber = +id + "" === id; @@ -258,7 +282,7 @@ return /******/ (function(modules) { // webpackBootstrap /******/ hotSetStatus("check"); /******/ return hotDownloadManifest(hotRequestTimeout).then(function(update) { /******/ if (!update) { -/******/ hotSetStatus("idle"); +/******/ hotSetStatus(hotApplyInvalidatedModules() ? "ready" : "idle"); /******/ return null; /******/ } /******/ hotRequestedFilesMap = {}; @@ -277,7 +301,6 @@ return /******/ (function(modules) { // webpackBootstrap /******/ var chunkId = "main"; /******/ // eslint-disable-next-line no-lone-blocks /******/ { -/******/ /*globals chunkId */ /******/ hotEnsureUpdateChunk(chunkId); /******/ } /******/ if ( @@ -352,6 +375,11 @@ return /******/ (function(modules) { // webpackBootstrap /******/ if (hotStatus !== "ready") /******/ throw new Error("apply() is only allowed in ready status"); /******/ options = options || {}; +/******/ return hotApplyInternal(options); +/******/ } +/******/ +/******/ function hotApplyInternal(options) { +/******/ hotApplyInvalidatedModules(); /******/ /******/ var cb; /******/ var i; @@ -374,7 +402,11 @@ return /******/ (function(modules) { // webpackBootstrap /******/ var moduleId = queueItem.id; /******/ var chain = queueItem.chain; /******/ module = installedModules[moduleId]; -/******/ if (!module || module.hot._selfAccepted) continue; +/******/ if ( +/******/ !module || +/******/ (module.hot._selfAccepted && !module.hot._selfInvalidated) +/******/ ) +/******/ continue; /******/ if (module.hot._selfDeclined) { /******/ return { /******/ type: "self-declined", @@ -542,10 +574,13 @@ return /******/ (function(modules) { // webpackBootstrap /******/ installedModules[moduleId] && /******/ installedModules[moduleId].hot._selfAccepted && /******/ // removed self-accepted modules should not be required -/******/ appliedUpdate[moduleId] !== warnUnexpectedRequire +/******/ appliedUpdate[moduleId] !== warnUnexpectedRequire && +/******/ // when called invalidate self-accepting is not possible +/******/ !installedModules[moduleId].hot._selfInvalidated /******/ ) { /******/ outdatedSelfAcceptedModules.push({ /******/ module: moduleId, +/******/ parents: installedModules[moduleId].parents.slice(), /******/ errorHandler: installedModules[moduleId].hot._selfAccepted /******/ }); /******/ } @@ -618,7 +653,11 @@ return /******/ (function(modules) { // webpackBootstrap /******/ // Now in "apply" phase /******/ hotSetStatus("apply"); /******/ -/******/ hotCurrentHash = hotUpdateNewHash; +/******/ if (hotUpdateNewHash !== undefined) { +/******/ hotCurrentHash = hotUpdateNewHash; +/******/ hotUpdateNewHash = undefined; +/******/ } +/******/ hotUpdate = undefined; /******/ /******/ // insert new code /******/ for (moduleId in appliedUpdate) { @@ -671,7 +710,8 @@ return /******/ (function(modules) { // webpackBootstrap /******/ for (i = 0; i < outdatedSelfAcceptedModules.length; i++) { /******/ var item = outdatedSelfAcceptedModules[i]; /******/ moduleId = item.module; -/******/ hotCurrentParents = [moduleId]; +/******/ hotCurrentParents = item.parents; +/******/ hotCurrentChildModule = moduleId; /******/ try { /******/ __webpack_require__(moduleId); /******/ } catch (err) { @@ -713,12 +753,35 @@ return /******/ (function(modules) { // webpackBootstrap /******/ return Promise.reject(error); /******/ } /******/ +/******/ if (hotQueuedInvalidatedModules) { +/******/ return hotApplyInternal(options).then(function(list) { +/******/ outdatedModules.forEach(function(moduleId) { +/******/ if (list.indexOf(moduleId) < 0) list.push(moduleId); +/******/ }); +/******/ return list; +/******/ }); +/******/ } +/******/ /******/ hotSetStatus("idle"); /******/ return new Promise(function(resolve) { /******/ resolve(outdatedModules); /******/ }); /******/ } /******/ +/******/ function hotApplyInvalidatedModules() { +/******/ if (hotQueuedInvalidatedModules) { +/******/ if (!hotUpdate) hotUpdate = {}; +/******/ hotQueuedInvalidatedModules.forEach(hotApplyInvalidatedModule); +/******/ hotQueuedInvalidatedModules = undefined; +/******/ return true; +/******/ } +/******/ } +/******/ +/******/ function hotApplyInvalidatedModule(moduleId) { +/******/ if (!Object.prototype.hasOwnProperty.call(hotUpdate, moduleId)) +/******/ hotUpdate[moduleId] = modules[moduleId]; +/******/ } +/******/ /******/ // The module cache /******/ var installedModules = {}; /******/ @@ -852,26 +915,26 @@ var isArray = __webpack_require__(/*! ../type/isArray */ "./node_modules/tui-cod * var idx2 = inArray('one', arr); // 0 */ function inArray(searchElement, array, startIndex) { - var i; - var length; - startIndex = startIndex || 0; + var i; + var length; + startIndex = startIndex || 0; - if (!isArray(array)) { - return -1; - } + if (!isArray(array)) { + return -1; + } - if (Array.prototype.indexOf) { - return Array.prototype.indexOf.call(array, searchElement, startIndex); - } + if (Array.prototype.indexOf) { + return Array.prototype.indexOf.call(array, searchElement, startIndex); + } - length = array.length; - for (i = startIndex; startIndex >= 0 && i < length; i += 1) { - if (array[i] === searchElement) { - return i; - } + length = array.length; + for (i = startIndex; startIndex >= 0 && i < length; i += 1) { + if (array[i] === searchElement) { + return i; } + } - return -1; + return -1; } module.exports = inArray; @@ -907,9 +970,9 @@ var forEachOwnProperties = __webpack_require__(/*! ../collection/forEachOwnPrope * If the object is Array-like object(ex-arguments object), It needs to transform to Array.(see 'ex2' of example). * If the callback function returns false, the loop will be stopped. * Callback function(iteratee) is invoked with three arguments: - * - The value of the property(or The value of the element) - * - The name of the property(or The index of the element) - * - The object being traversed + * 1) The value of the property(or The value of the element) + * 2) The name of the property(or The index of the element) + * 3) The object being traversed * @param {Object} obj The object that will be traversed * @param {function} iteratee Callback function * @param {Object} [context] Context(this) of callback function @@ -931,11 +994,11 @@ var forEachOwnProperties = __webpack_require__(/*! ../collection/forEachOwnPrope * }); */ function forEach(obj, iteratee, context) { - if (isArray(obj)) { - forEachArray(obj, iteratee, context); - } else { - forEachOwnProperties(obj, iteratee, context); - } + if (isArray(obj)) { + forEachArray(obj, iteratee, context); + } else { + forEachOwnProperties(obj, iteratee, context); + } } module.exports = forEach; @@ -963,10 +1026,10 @@ module.exports = forEach; * in the array(or Array-like object) in ascending order. * If the callback function returns false, the loop will be stopped. * Callback function(iteratee) is invoked with three arguments: - * - The value of the element - * - The index of the element - * - The array(or Array-like object) being traversed - * @param {Array} arr The array(or Array-like object) that will be traversed + * 1) The value of the element + * 2) The index of the element + * 3) The array(or Array-like object) being traversed + * @param {Array|Arguments|NodeList} arr The array(or Array-like object) that will be traversed * @param {function} iteratee Callback function * @param {Object} [context] Context(this) of callback function * @memberof module:collection @@ -981,16 +1044,16 @@ module.exports = forEach; * alert(sum); // 6 */ function forEachArray(arr, iteratee, context) { - var index = 0; - var len = arr.length; + var index = 0; + var len = arr.length; - context = context || null; + context = context || null; - for (; index < len; index += 1) { - if (iteratee.call(context, arr[index], index, arr) === false) { - break; - } + for (; index < len; index += 1) { + if (iteratee.call(context, arr[index], index, arr) === false) { + break; } + } } module.exports = forEachArray; @@ -1017,9 +1080,9 @@ module.exports = forEachArray; * Execute the provided callback once for each property of object which actually exist. * If the callback function returns false, the loop will be stopped. * Callback function(iteratee) is invoked with three arguments: - * - The value of the property - * - The name of the property - * - The object being traversed + * 1) The value of the property + * 2) The name of the property + * 3) The object being traversed * @param {Object} obj The object that will be traversed * @param {function} iteratee Callback function * @param {Object} [context] Context(this) of callback function @@ -1035,17 +1098,17 @@ module.exports = forEachArray; * alert(sum); // 6 */ function forEachOwnProperties(obj, iteratee, context) { - var key; + var key; - context = context || null; + context = context || null; - for (key in obj) { - if (obj.hasOwnProperty(key)) { - if (iteratee.call(context, obj[key], key, obj) === false) { - break; - } - } + for (key in obj) { + if (obj.hasOwnProperty(key)) { + if (iteratee.call(context, obj[key], key, obj) === false) { + break; + } } + } } module.exports = forEachOwnProperties; @@ -1092,17 +1155,17 @@ var forEachArray = __webpack_require__(/*! ./forEachArray */ "./node_modules/tui * alert(result); // one,two,three,four */ function toArray(arrayLike) { - var arr; - try { - arr = Array.prototype.slice.call(arrayLike); - } catch (e) { - arr = []; - forEachArray(arrayLike, function(value) { - arr.push(value); - }); - } + var arr; + try { + arr = Array.prototype.slice.call(arrayLike); + } catch (e) { + arr = []; + forEachArray(arrayLike, function(value) { + arr.push(value); + }); + } - return arr; + return arr; } module.exports = toArray; @@ -1142,16 +1205,16 @@ var R_EVENTNAME_SPLIT = /\s+/g; * var CustomEvents = require('tui-code-snippet/customEvents/customEvents'); */ function CustomEvents() { - /** + /** * @type {HandlerItem[]} */ - this.events = null; + this.events = null; - /** + /** * only for checking specific context event was binded * @type {object[]} */ - this.contexts = null; + this.contexts = null; } /** @@ -1172,7 +1235,7 @@ function CustomEvents() { * alert(model.name); // 'model'; */ CustomEvents.mixin = function(func) { - extend(func.prototype, CustomEvents.prototype); + extend(func.prototype, CustomEvents.prototype); }; /** @@ -1183,13 +1246,13 @@ CustomEvents.mixin = function(func) { * @private */ CustomEvents.prototype._getHandlerItem = function(handler, context) { - var item = {handler: handler}; + var item = {handler: handler}; - if (context) { - item.context = context; - } + if (context) { + item.context = context; + } - return item; + return item; }; /** @@ -1200,25 +1263,25 @@ CustomEvents.prototype._getHandlerItem = function(handler, context) { * @private */ CustomEvents.prototype._safeEvent = function(eventName) { - var events = this.events; - var byName; - - if (!events) { - events = this.events = {}; - } + var events = this.events; + var byName; - if (eventName) { - byName = events[eventName]; + if (!events) { + events = this.events = {}; + } - if (!byName) { - byName = []; - events[eventName] = byName; - } + if (eventName) { + byName = events[eventName]; - events = byName; + if (!byName) { + byName = []; + events[eventName] = byName; } - return events; + events = byName; + } + + return events; }; /** @@ -1227,13 +1290,13 @@ CustomEvents.prototype._safeEvent = function(eventName) { * @private */ CustomEvents.prototype._safeContext = function() { - var context = this.contexts; + var context = this.contexts; - if (!context) { - context = this.contexts = []; - } + if (!context) { + context = this.contexts = []; + } - return context; + return context; }; /** @@ -1243,18 +1306,18 @@ CustomEvents.prototype._safeContext = function() { * @private */ CustomEvents.prototype._indexOfContext = function(ctx) { - var context = this._safeContext(); - var index = 0; - - while (context[index]) { - if (ctx === context[index][0]) { - return index; - } + var context = this._safeContext(); + var index = 0; - index += 1; + while (context[index]) { + if (ctx === context[index][0]) { + return index; } - return -1; + index += 1; + } + + return -1; }; /** @@ -1264,20 +1327,20 @@ CustomEvents.prototype._indexOfContext = function(ctx) { * @private */ CustomEvents.prototype._memorizeContext = function(ctx) { - var context, index; + var context, index; - if (!isExisty(ctx)) { - return; - } + if (!isExisty(ctx)) { + return; + } - context = this._safeContext(); - index = this._indexOfContext(ctx); + context = this._safeContext(); + index = this._indexOfContext(ctx); - if (index > -1) { - context[index][1] += 1; - } else { - context.push([ctx, 1]); - } + if (index > -1) { + context[index][1] += 1; + } else { + context.push([ctx, 1]); + } }; /** @@ -1286,22 +1349,22 @@ CustomEvents.prototype._memorizeContext = function(ctx) { * @private */ CustomEvents.prototype._forgetContext = function(ctx) { - var context, contextIndex; + var context, contextIndex; - if (!isExisty(ctx)) { - return; - } + if (!isExisty(ctx)) { + return; + } - context = this._safeContext(); - contextIndex = this._indexOfContext(ctx); + context = this._safeContext(); + contextIndex = this._indexOfContext(ctx); - if (contextIndex > -1) { - context[contextIndex][1] -= 1; + if (contextIndex > -1) { + context[contextIndex][1] -= 1; - if (context[contextIndex][1] <= 0) { - context.splice(contextIndex, 1); - } + if (context[contextIndex][1] <= 0) { + context.splice(contextIndex, 1); } + } }; /** @@ -1313,9 +1376,9 @@ CustomEvents.prototype._forgetContext = function(ctx) { * @private */ CustomEvents.prototype._bindEvent = function(eventName, handler, context) { - var events = this._safeEvent(eventName); - this._memorizeContext(context); - events.push(this._getHandlerItem(handler, context)); + var events = this._safeEvent(eventName); + this._memorizeContext(context); + events.push(this._getHandlerItem(handler, context)); }; /** @@ -1346,21 +1409,21 @@ CustomEvents.prototype._bindEvent = function(eventName, handler, context) { * }, myObj); */ CustomEvents.prototype.on = function(eventName, handler, context) { - var self = this; + var self = this; - if (isString(eventName)) { - // [syntax 1, 2] - eventName = eventName.split(R_EVENTNAME_SPLIT); - forEach(eventName, function(name) { - self._bindEvent(name, handler, context); - }); - } else if (isObject(eventName)) { - // [syntax 3, 4] - context = handler; - forEach(eventName, function(func, name) { - self.on(name, func, context); - }); - } + if (isString(eventName)) { + // [syntax 1, 2] + eventName = eventName.split(R_EVENTNAME_SPLIT); + forEach(eventName, function(name) { + self._bindEvent(name, handler, context); + }); + } else if (isObject(eventName)) { + // [syntax 3, 4] + context = handler; + forEach(eventName, function(func, name) { + self.on(name, func, context); + }); + } }; /** @@ -1371,23 +1434,23 @@ CustomEvents.prototype.on = function(eventName, handler, context) { * @param {object} [context] - context for binding */ CustomEvents.prototype.once = function(eventName, handler, context) { - var self = this; + var self = this; - if (isObject(eventName)) { - context = handler; - forEach(eventName, function(func, name) { - self.once(name, func, context); - }); + if (isObject(eventName)) { + context = handler; + forEach(eventName, function(func, name) { + self.once(name, func, context); + }); - return; - } + return; + } - function onceHandler() { // eslint-disable-line require-jsdoc - handler.apply(context, arguments); - self.off(eventName, onceHandler, context); - } + function onceHandler() { // eslint-disable-line require-jsdoc + handler.apply(context, arguments); + self.off(eventName, onceHandler, context); + } - this.on(eventName, onceHandler, context); + this.on(eventName, onceHandler, context); }; /** @@ -1397,20 +1460,20 @@ CustomEvents.prototype.once = function(eventName, handler, context) { * @private */ CustomEvents.prototype._spliceMatches = function(arr, predicate) { - var i = 0; - var len; + var i = 0; + var len; - if (!isArray(arr)) { - return; - } + if (!isArray(arr)) { + return; + } - for (len = arr.length; i < len; i += 1) { - if (predicate(arr[i]) === true) { - arr.splice(i, 1); - len -= 1; - i -= 1; - } + for (len = arr.length; i < len; i += 1) { + if (predicate(arr[i]) === true) { + arr.splice(i, 1); + len -= 1; + i -= 1; } + } }; /** @@ -1420,17 +1483,17 @@ CustomEvents.prototype._spliceMatches = function(arr, predicate) { * @private */ CustomEvents.prototype._matchHandler = function(handler) { - var self = this; + var self = this; - return function(item) { - var needRemove = handler === item.handler; + return function(item) { + var needRemove = handler === item.handler; - if (needRemove) { - self._forgetContext(item.context); - } + if (needRemove) { + self._forgetContext(item.context); + } - return needRemove; - }; + return needRemove; + }; }; /** @@ -1440,17 +1503,17 @@ CustomEvents.prototype._matchHandler = function(handler) { * @private */ CustomEvents.prototype._matchContext = function(context) { - var self = this; + var self = this; - return function(item) { - var needRemove = context === item.context; + return function(item) { + var needRemove = context === item.context; - if (needRemove) { - self._forgetContext(item.context); - } + if (needRemove) { + self._forgetContext(item.context); + } - return needRemove; - }; + return needRemove; + }; }; /** @@ -1461,19 +1524,19 @@ CustomEvents.prototype._matchContext = function(context) { * @private */ CustomEvents.prototype._matchHandlerAndContext = function(handler, context) { - var self = this; + var self = this; - return function(item) { - var matchHandler = (handler === item.handler); - var matchContext = (context === item.context); - var needRemove = (matchHandler && matchContext); + return function(item) { + var matchHandler = (handler === item.handler); + var matchContext = (context === item.context); + var needRemove = (matchHandler && matchContext); - if (needRemove) { - self._forgetContext(item.context); - } + if (needRemove) { + self._forgetContext(item.context); + } - return needRemove; - }; + return needRemove; + }; }; /** @@ -1483,25 +1546,25 @@ CustomEvents.prototype._matchHandlerAndContext = function(handler, context) { * @private */ CustomEvents.prototype._offByEventName = function(eventName, handler) { - var self = this; - var andByHandler = isFunction(handler); - var matchHandler = self._matchHandler(handler); + var self = this; + var andByHandler = isFunction(handler); + var matchHandler = self._matchHandler(handler); - eventName = eventName.split(R_EVENTNAME_SPLIT); + eventName = eventName.split(R_EVENTNAME_SPLIT); - forEach(eventName, function(name) { - var handlerItems = self._safeEvent(name); + forEach(eventName, function(name) { + var handlerItems = self._safeEvent(name); - if (andByHandler) { - self._spliceMatches(handlerItems, matchHandler); - } else { - forEach(handlerItems, function(item) { - self._forgetContext(item.context); - }); + if (andByHandler) { + self._spliceMatches(handlerItems, matchHandler); + } else { + forEach(handlerItems, function(item) { + self._forgetContext(item.context); + }); - self.events[name] = []; - } - }); + self.events[name] = []; + } + }); }; /** @@ -1510,12 +1573,12 @@ CustomEvents.prototype._offByEventName = function(eventName, handler) { * @private */ CustomEvents.prototype._offByHandler = function(handler) { - var self = this; - var matchHandler = this._matchHandler(handler); + var self = this; + var matchHandler = this._matchHandler(handler); - forEach(this._safeEvent(), function(handlerItems) { - self._spliceMatches(handlerItems, matchHandler); - }); + forEach(this._safeEvent(), function(handlerItems) { + self._spliceMatches(handlerItems, matchHandler); + }); }; /** @@ -1525,30 +1588,30 @@ CustomEvents.prototype._offByHandler = function(handler) { * @private */ CustomEvents.prototype._offByObject = function(obj, handler) { - var self = this; - var matchFunc; + var self = this; + var matchFunc; - if (this._indexOfContext(obj) < 0) { - forEach(obj, function(func, name) { - self.off(name, func); - }); - } else if (isString(handler)) { - matchFunc = this._matchContext(obj); + if (this._indexOfContext(obj) < 0) { + forEach(obj, function(func, name) { + self.off(name, func); + }); + } else if (isString(handler)) { + matchFunc = this._matchContext(obj); - self._spliceMatches(this._safeEvent(handler), matchFunc); - } else if (isFunction(handler)) { - matchFunc = this._matchHandlerAndContext(handler, obj); + self._spliceMatches(this._safeEvent(handler), matchFunc); + } else if (isFunction(handler)) { + matchFunc = this._matchHandlerAndContext(handler, obj); - forEach(this._safeEvent(), function(handlerItems) { - self._spliceMatches(handlerItems, matchFunc); - }); - } else { - matchFunc = this._matchContext(obj); + forEach(this._safeEvent(), function(handlerItems) { + self._spliceMatches(handlerItems, matchFunc); + }); + } else { + matchFunc = this._matchContext(obj); - forEach(this._safeEvent(), function(handlerItems) { - self._spliceMatches(handlerItems, matchFunc); - }); - } + forEach(this._safeEvent(), function(handlerItems) { + self._spliceMatches(handlerItems, matchFunc); + }); + } }; /** @@ -1589,20 +1652,20 @@ CustomEvents.prototype._offByObject = function(obj, handler) { * CustomEvents.off(); */ CustomEvents.prototype.off = function(eventName, handler) { - if (isString(eventName)) { - // [syntax 1, 2] - this._offByEventName(eventName, handler); - } else if (!arguments.length) { - // [syntax 8] - this.events = {}; - this.contexts = []; - } else if (isFunction(eventName)) { - // [syntax 3] - this._offByHandler(eventName); - } else if (isObject(eventName)) { - // [syntax 4, 5, 6] - this._offByObject(eventName, handler); - } + if (isString(eventName)) { + // [syntax 1, 2] + this._offByEventName(eventName, handler); + } else if (!arguments.length) { + // [syntax 8] + this.events = {}; + this.contexts = []; + } else if (isFunction(eventName)) { + // [syntax 3] + this._offByHandler(eventName); + } else if (isObject(eventName)) { + // [syntax 4, 5, 6] + this._offByObject(eventName, handler); + } }; /** @@ -1610,7 +1673,7 @@ CustomEvents.prototype.off = function(eventName, handler) { * @param {string} eventName - name of custom event */ CustomEvents.prototype.fire = function(eventName) { // eslint-disable-line - this.invoke.apply(this, arguments); + this.invoke.apply(this, arguments); }; /** @@ -1642,27 +1705,27 @@ CustomEvents.prototype.fire = function(eventName) { // eslint-disable-line * } */ CustomEvents.prototype.invoke = function(eventName) { - var events, args, index, item; - - if (!this.hasListener(eventName)) { - return true; - } + var events, args, index, item; - events = this._safeEvent(eventName); - args = Array.prototype.slice.call(arguments, 1); - index = 0; + if (!this.hasListener(eventName)) { + return true; + } - while (events[index]) { - item = events[index]; + events = this._safeEvent(eventName); + args = Array.prototype.slice.call(arguments, 1); + index = 0; - if (item.handler.apply(item.context, args) === false) { - return false; - } + while (events[index]) { + item = events[index]; - index += 1; + if (item.handler.apply(item.context, args) === false) { + return false; } - return true; + index += 1; + } + + return true; }; /** @@ -1672,7 +1735,7 @@ CustomEvents.prototype.invoke = function(eventName) { * @returns {boolean} Is there at least one handler in event name? */ CustomEvents.prototype.hasListener = function(eventName) { - return this.getListenerLength(eventName) > 0; + return this.getListenerLength(eventName) > 0; }; /** @@ -1681,9 +1744,9 @@ CustomEvents.prototype.hasListener = function(eventName) { * @returns {number} number of event */ CustomEvents.prototype.getListenerLength = function(eventName) { - var events = this._safeEvent(eventName); + var events = this._safeEvent(eventName); - return events.length; + return events.length; }; module.exports = CustomEvents; @@ -1716,19 +1779,19 @@ var EVENT_KEY = '_feEventKey'; * @private */ function safeEvent(element, type) { - var events = element[EVENT_KEY]; - var handlers; + var events = element[EVENT_KEY]; + var handlers; - if (!events) { - events = element[EVENT_KEY] = {}; - } + if (!events) { + events = element[EVENT_KEY] = {}; + } - handlers = events[type]; - if (!handlers) { - handlers = events[type] = []; - } + handlers = events[type]; + if (!handlers) { + handlers = events[type] = []; + } - return handlers; + return handlers; } module.exports = safeEvent; @@ -1758,7 +1821,7 @@ module.exports = safeEvent; * @memberof module:domEvent */ function getTarget(e) { - return e.target || e.srcElement; + return e.target || e.srcElement; } module.exports = getTarget; @@ -1789,24 +1852,42 @@ var safeEvent = __webpack_require__(/*! ./_safeEvent */ "./node_modules/tui-code /** * Unbind DOM events * If a handler function is not passed, remove all events of that type. - * @param {HTMLElement} element - element to unbindbind events - * @param {(string|object)} types - Space splitted events names or - * eventName:handler object + * @param {HTMLElement} element - element to unbind events + * @param {(string|object)} types - Space splitted events names or eventName:handler object * @param {function} [handler] - handler function * @memberof module:domEvent + * @example + * // Following the example of domEvent#on + * + * // Unbind one event from an element. + * off(div, 'click', toggle); + * + * // Unbind multiple events with a same handler from multiple elements at once. + * // Use event names splitted by a space. + * off(element, 'mouseenter mouseleave', changeColor); + * + * // Unbind multiple events with different handlers from an element at once. + * // Use an object which of key is an event name and value is a handler function. + * off(div, { + * keydown: highlight, + * keyup: dehighlight + * }); + * + * // Unbind events without handlers. + * off(div, 'drag'); */ function off(element, types, handler) { - if (isString(types)) { - forEach(types.split(/\s+/g), function(type) { - unbindEvent(element, type, handler); - }); + if (isString(types)) { + forEach(types.split(/\s+/g), function(type) { + unbindEvent(element, type, handler); + }); - return; - } + return; + } - forEach(types, function(func, type) { - unbindEvent(element, type, func); - }); + forEach(types, function(func, type) { + unbindEvent(element, type, func); + }); } /** @@ -1818,27 +1899,27 @@ function off(element, types, handler) { * @private */ function unbindEvent(element, type, handler) { - var events = safeEvent(element, type); - var index; - - if (!handler) { - forEach(events, function(item) { - removeHandler(element, type, item.wrappedHandler); - }); - events.splice(0, events.length); - } else { - forEach(events, function(item, idx) { - if (handler === item.handler) { - removeHandler(element, type, item.wrappedHandler); - index = idx; + var events = safeEvent(element, type); + var index; - return false; - } + if (!handler) { + forEach(events, function(item) { + removeHandler(element, type, item.wrappedHandler); + }); + events.splice(0, events.length); + } else { + forEach(events, function(item, idx) { + if (handler === item.handler) { + removeHandler(element, type, item.wrappedHandler); + index = idx; + + return false; + } - return true; - }); - events.splice(index, 1); - } + return true; + }); + events.splice(index, 1); + } } /** @@ -1849,11 +1930,11 @@ function unbindEvent(element, type, handler) { * @private */ function removeHandler(element, type, handler) { - if ('removeEventListener' in element) { - element.removeEventListener(type, handler); - } else if ('detachEvent' in element) { - element.detachEvent('on' + type, handler); - } + if ('removeEventListener' in element) { + element.removeEventListener(type, handler); + } else if ('detachEvent' in element) { + element.detachEvent('on' + type, handler); + } } module.exports = off; @@ -1882,53 +1963,74 @@ var forEach = __webpack_require__(/*! ../collection/forEach */ "./node_modules/t var safeEvent = __webpack_require__(/*! ./_safeEvent */ "./node_modules/tui-code-snippet/domEvent/_safeEvent.js"); /** - * Bind DOM events + * Bind DOM events. * @param {HTMLElement} element - element to bind events - * @param {(string|object)} types - Space splitted events names or - * eventName:handler object - * @param {(function|object)} handler - handler function or context for handler - * method + * @param {(string|object)} types - Space splitted events names or eventName:handler object + * @param {(function|object)} handler - handler function or context for handler method * @param {object} [context] context - context for handler method. * @memberof module:domEvent + * @example + * var div = document.querySelector('div'); + * + * // Bind one event to an element. + * on(div, 'click', toggle); + * + * // Bind multiple events with a same handler to multiple elements at once. + * // Use event names splitted by a space. + * on(div, 'mouseenter mouseleave', changeColor); + * + * // Bind multiple events with different handlers to an element at once. + * // Use an object which of key is an event name and value is a handler function. + * on(div, { + * keydown: highlight, + * keyup: dehighlight + * }); + * + * // Set a context for handler method. + * var name = 'global'; + * var repository = {name: 'CodeSnippet'}; + * on(div, 'drag', function() { + * console.log(this.name); + * }, repository); + * // Result when you drag a div: "CodeSnippet" */ function on(element, types, handler, context) { - if (isString(types)) { - forEach(types.split(/\s+/g), function(type) { - bindEvent(element, type, handler, context); - }); + if (isString(types)) { + forEach(types.split(/\s+/g), function(type) { + bindEvent(element, type, handler, context); + }); - return; - } + return; + } - forEach(types, function(func, type) { - bindEvent(element, type, func, handler); - }); + forEach(types, function(func, type) { + bindEvent(element, type, func, handler); + }); } /** * Bind DOM events * @param {HTMLElement} element - element to bind events * @param {string} type - events name - * @param {function} handler - handler function or context for handler - * method + * @param {function} handler - handler function or context for handler method * @param {object} [context] context - context for handler method. * @private */ function bindEvent(element, type, handler, context) { - /** + /** * Event handler * @param {Event} e - event object */ - function eventHandler(e) { - handler.call(context || element, e || window.event); - } - - if ('addEventListener' in element) { - element.addEventListener(type, eventHandler); - } else if ('attachEvent' in element) { - element.attachEvent('on' + type, eventHandler); - } - memorizeHandler(element, type, handler, eventHandler); + function eventHandler(e) { + handler.call(context || element, e || window.event); + } + + if ('addEventListener' in element) { + element.addEventListener(type, eventHandler); + } else if ('attachEvent' in element) { + element.attachEvent('on' + type, eventHandler); + } + memorizeHandler(element, type, handler, eventHandler); } /** @@ -1940,25 +2042,25 @@ function bindEvent(element, type, handler, context) { * @private */ function memorizeHandler(element, type, handler, wrappedHandler) { - var events = safeEvent(element, type); - var existInEvents = false; + var events = safeEvent(element, type); + var existInEvents = false; - forEach(events, function(obj) { - if (obj.handler === handler) { - existInEvents = true; + forEach(events, function(obj) { + if (obj.handler === handler) { + existInEvents = true; - return false; - } + return false; + } - return true; - }); + return true; + }); - if (!existInEvents) { - events.push({ - handler: handler, - wrappedHandler: wrappedHandler - }); - } + if (!existInEvents) { + events.push({ + handler: handler, + wrappedHandler: wrappedHandler + }); + } } module.exports = on; @@ -1987,13 +2089,13 @@ module.exports = on; * @memberof module:domEvent */ function preventDefault(e) { - if (e.preventDefault) { - e.preventDefault(); + if (e.preventDefault) { + e.preventDefault(); - return; - } + return; + } - e.returnValue = false; + e.returnValue = false; } module.exports = preventDefault; @@ -2026,17 +2128,17 @@ var isUndefined = __webpack_require__(/*! ../type/isUndefined */ "./node_modules * @private */ function setClassName(element, cssClass) { - cssClass = isArray(cssClass) ? cssClass.join(' ') : cssClass; + cssClass = isArray(cssClass) ? cssClass.join(' ') : cssClass; - cssClass = cssClass.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + cssClass = cssClass.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); - if (isUndefined(element.className.baseVal)) { - element.className = cssClass; + if (isUndefined(element.className.baseVal)) { + element.className = cssClass; - return; - } + return; + } - element.className.baseVal = cssClass; + element.className.baseVal = cssClass; } module.exports = setClassName; @@ -2076,32 +2178,32 @@ var setClassName = __webpack_require__(/*! ./_setClassName */ "./node_modules/tu * @memberof module:domUtil */ function addClass(element) { - var cssClass = Array.prototype.slice.call(arguments, 1); - var classList = element.classList; - var newClass = []; - var origin; - - if (classList) { - forEach(cssClass, function(name) { - element.classList.add(name); - }); + var cssClass = Array.prototype.slice.call(arguments, 1); + var classList = element.classList; + var newClass = []; + var origin; + + if (classList) { + forEach(cssClass, function(name) { + element.classList.add(name); + }); - return; - } + return; + } - origin = getClass(element); + origin = getClass(element); - if (origin) { - cssClass = [].concat(origin.split(/\s+/), cssClass); - } + if (origin) { + cssClass = [].concat(origin.split(/\s+/), cssClass); + } - forEach(cssClass, function(cls) { - if (inArray(cls, newClass) < 0) { - newClass.push(cls); - } - }); + forEach(cssClass, function(cls) { + if (inArray(cls, newClass) < 0) { + newClass.push(cls); + } + }); - setClassName(element, newClass); + setClassName(element, newClass); } module.exports = addClass; @@ -2134,21 +2236,21 @@ var matches = __webpack_require__(/*! ./matches */ "./node_modules/tui-code-snip * @memberof module:domUtil */ function closest(element, selector) { - var parent = element.parentNode; - - if (matches(element, selector)) { - return element; - } + var parent = element.parentNode; - while (parent && parent !== document) { - if (matches(parent, selector)) { - return parent; - } + if (matches(element, selector)) { + return element; + } - parent = parent.parentNode; + while (parent && parent !== document) { + if (matches(parent, selector)) { + return parent; } - return null; + parent = parent.parentNode; + } + + return null; } module.exports = closest; @@ -2180,15 +2282,15 @@ var isUndefined = __webpack_require__(/*! ../type/isUndefined */ "./node_modules * @memberof module:domUtil */ function getClass(element) { - if (!element || !element.className) { - return ''; - } + if (!element || !element.className) { + return ''; + } - if (isUndefined(element.className.baseVal)) { - return element.className; - } + if (isUndefined(element.className.baseVal)) { + return element.className; + } - return element.className.baseVal; + return element.className.baseVal; } module.exports = getClass; @@ -2220,9 +2322,9 @@ var matchSelector = elProto.matches || elProto.mozMatchesSelector || elProto.msMatchesSelector || function(selector) { - var doc = this.document || this.ownerDocument; + var doc = this.document || this.ownerDocument; - return inArray(this, toArray(doc.querySelectorAll(selector))) > -1; + return inArray(this, toArray(doc.querySelectorAll(selector))) > -1; }; /** @@ -2233,7 +2335,7 @@ var matchSelector = elProto.matches || * @memberof module:domUtil */ function matches(element, selector) { - return matchSelector.call(element, selector); + return matchSelector.call(element, selector); } module.exports = matches; @@ -2268,27 +2370,27 @@ var setClassName = __webpack_require__(/*! ./_setClassName */ "./node_modules/tu * @memberof module:domUtil */ function removeClass(element) { - var cssClass = Array.prototype.slice.call(arguments, 1); - var classList = element.classList; - var origin, newClass; + var cssClass = Array.prototype.slice.call(arguments, 1); + var classList = element.classList; + var origin, newClass; - if (classList) { - forEachArray(cssClass, function(name) { - classList.remove(name); - }); + if (classList) { + forEachArray(cssClass, function(name) { + classList.remove(name); + }); - return; - } + return; + } - origin = getClass(element).split(/\s+/); - newClass = []; - forEachArray(origin, function(name) { - if (inArray(name, cssClass) < 0) { - newClass.push(name); - } - }); + origin = getClass(element).split(/\s+/); + newClass = []; + forEachArray(origin, function(name) { + if (inArray(name, cssClass) < 0) { + newClass.push(name); + } + }); - setClassName(element, newClass); + setClassName(element, newClass); } module.exports = removeClass; @@ -2317,9 +2419,9 @@ module.exports = removeClass; * @memberof module:domUtil */ function removeElement(element) { - if (element && element.parentNode) { - element.parentNode.removeChild(element); - } + if (element && element.parentNode) { + element.parentNode.removeChild(element); + } } module.exports = removeElement; @@ -2354,19 +2456,19 @@ module.exports = removeElement; * @memberof module:object */ function extend(target, objects) { // eslint-disable-line no-unused-vars - var hasOwnProp = Object.prototype.hasOwnProperty; - var source, prop, i, len; - - for (i = 1, len = arguments.length; i < len; i += 1) { - source = arguments[i]; - for (prop in source) { - if (hasOwnProp.call(source, prop)) { - target[prop] = source[prop]; - } - } + var hasOwnProp = Object.prototype.hasOwnProperty; + var source, prop, i, len; + + for (i = 1, len = arguments.length; i < len; i += 1) { + source = arguments[i]; + for (prop in source) { + if (hasOwnProp.call(source, prop)) { + target[prop] = source[prop]; + } } + } - return target; + return target; } module.exports = extend; @@ -2414,20 +2516,20 @@ var forEachOwnProperties = __webpack_require__(/*! ../collection/forEachOwnPrope * }); */ function imagePing(url, trackingInfo) { - var trackingElement = document.createElement('img'); - var queryString = ''; - forEachOwnProperties(trackingInfo, function(value, key) { - queryString += '&' + key + '=' + value; - }); - queryString = queryString.substring(1); + var trackingElement = document.createElement('img'); + var queryString = ''; + forEachOwnProperties(trackingInfo, function(value, key) { + queryString += '&' + key + '=' + value; + }); + queryString = queryString.substring(1); - trackingElement.src = url + '?' + queryString; + trackingElement.src = url + '?' + queryString; - trackingElement.style.display = 'none'; - document.body.appendChild(trackingElement); - document.body.removeChild(trackingElement); + trackingElement.style.display = 'none'; + document.body.appendChild(trackingElement); + document.body.removeChild(trackingElement); - return trackingElement; + return trackingElement; } module.exports = imagePing; @@ -2462,9 +2564,9 @@ var ms7days = 7 * 24 * 60 * 60 * 1000; * @private */ function isExpired(date) { - var now = new Date().getTime(); + var now = new Date().getTime(); - return now - date > ms7days; + return now - date > ms7days; } /** @@ -2475,39 +2577,39 @@ function isExpired(date) { * @ignore */ function sendHostname(appName, trackingId) { - var url = 'https://www.google-analytics.com/collect'; - var hostname = location.hostname; - var hitType = 'event'; - var eventCategory = 'use'; - var applicationKeyForStorage = 'TOAST UI ' + appName + ' for ' + hostname + ': Statistics'; - var date = window.localStorage.getItem(applicationKeyForStorage); - - // skip if the flag is defined and is set to false explicitly - if (!isUndefined(window.tui) && window.tui.usageStatistics === false) { - return; - } - - // skip if not pass seven days old - if (date && !isExpired(date)) { - return; + var url = 'https://www.google-analytics.com/collect'; + var hostname = location.hostname; + var hitType = 'event'; + var eventCategory = 'use'; + var applicationKeyForStorage = 'TOAST UI ' + appName + ' for ' + hostname + ': Statistics'; + var date = window.localStorage.getItem(applicationKeyForStorage); + + // skip if the flag is defined and is set to false explicitly + if (!isUndefined(window.tui) && window.tui.usageStatistics === false) { + return; + } + + // skip if not pass seven days old + if (date && !isExpired(date)) { + return; + } + + window.localStorage.setItem(applicationKeyForStorage, new Date().getTime()); + + setTimeout(function() { + if (document.readyState === 'interactive' || document.readyState === 'complete') { + imagePing(url, { + v: 1, + t: hitType, + tid: trackingId, + cid: hostname, + dp: hostname, + dh: appName, + el: appName, + ec: eventCategory + }); } - - window.localStorage.setItem(applicationKeyForStorage, new Date().getTime()); - - setTimeout(function() { - if (document.readyState === 'interactive' || document.readyState === 'complete') { - imagePing(url, { - v: 1, - t: hitType, - tid: trackingId, - cid: hostname, - dp: hostname, - dh: appName, - el: appName, - ec: eventCategory - }); - } - }, 1000); + }, 1000); } module.exports = sendHostname; @@ -2538,7 +2640,7 @@ module.exports = sendHostname; * @memberof module:type */ function isArray(obj) { - return obj instanceof Array; + return obj instanceof Array; } module.exports = isArray; @@ -2569,7 +2671,7 @@ module.exports = isArray; * @memberof module:type */ function isBoolean(obj) { - return typeof obj === 'boolean' || obj instanceof Boolean; + return typeof obj === 'boolean' || obj instanceof Boolean; } module.exports = isBoolean; @@ -2612,7 +2714,7 @@ var isNull = __webpack_require__(/*! ./isNull */ "./node_modules/tui-code-snippe * isExisty(undefined); //false */ function isExisty(param) { - return !isUndefined(param) && !isNull(param); + return !isUndefined(param) && !isNull(param); } module.exports = isExisty; @@ -2643,7 +2745,7 @@ module.exports = isExisty; * @memberof module:type */ function isFunction(obj) { - return obj instanceof Function; + return obj instanceof Function; } module.exports = isFunction; @@ -2674,11 +2776,11 @@ module.exports = isFunction; * @memberof module:type */ function isHTMLNode(html) { - if (typeof HTMLElement === 'object') { - return (html && (html instanceof HTMLElement || !!html.nodeType)); - } + if (typeof HTMLElement === 'object') { + return (html && (html instanceof HTMLElement || !!html.nodeType)); + } - return !!(html && html.nodeType); + return !!(html && html.nodeType); } module.exports = isHTMLNode; @@ -2709,7 +2811,7 @@ module.exports = isHTMLNode; * @memberof module:type */ function isNull(obj) { - return obj === null; + return obj === null; } module.exports = isNull; @@ -2740,7 +2842,7 @@ module.exports = isNull; * @memberof module:type */ function isNumber(obj) { - return typeof obj === 'number' || obj instanceof Number; + return typeof obj === 'number' || obj instanceof Number; } module.exports = isNumber; @@ -2771,7 +2873,7 @@ module.exports = isNumber; * @memberof module:type */ function isObject(obj) { - return obj === Object(obj); + return obj === Object(obj); } module.exports = isObject; @@ -2802,7 +2904,7 @@ module.exports = isObject; * @memberof module:type */ function isString(obj) { - return typeof obj === 'string' || obj instanceof String; + return typeof obj === 'string' || obj instanceof String; } module.exports = isString; @@ -2833,7 +2935,7 @@ module.exports = isString; * @memberof module:type */ function isUndefined(obj) { - return obj === undefined; // eslint-disable-line no-undefined + return obj === undefined; // eslint-disable-line no-undefined } module.exports = isUndefined; @@ -2866,7 +2968,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else { var mod; } -})(this, function (_exports, _forEachOwnProperties) { +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _forEachOwnProperties) { "use strict"; _exports.__esModule = true; @@ -2926,7 +3028,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else { var mod; } -})(this, function (_exports, _forEachArray, _isExisty, _isNumber, _addClass, _removeClass, _removeElement, _utils, _constants, _itemGroup, _item) { +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _forEachArray, _isExisty, _isNumber, _addClass, _removeClass, _removeElement, _utils, _constants, _itemGroup, _item) { "use strict"; _exports.__esModule = true; @@ -2942,9 +3044,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } - function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } @@ -2956,9 +3058,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ * @param {array} options.data - data for ItemGroups and Items * @param {boolean} [options.disabled=false] - whether a dropdown should be disabled or not */ - var Dropdown = - /*#__PURE__*/ - function () { + var Dropdown = /*#__PURE__*/function () { function Dropdown(_ref) { var placeholder = _ref.placeholder, data = _ref.data, @@ -3401,7 +3501,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else { var mod; } -})(this, function (_exports, _selectBox, _selectBox2) { +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _selectBox, _selectBox2) { "use strict"; _exports.__esModule = true; @@ -3434,7 +3534,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else { var mod; } -})(this, function (_exports, _addClass, _removeClass, _removeElement, _utils, _constants) { +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _addClass, _removeClass, _removeElement, _utils, _constants) { "use strict"; _exports.__esModule = true; @@ -3458,9 +3558,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ * @param {string} [options.disabled] - whether an input should be disabled or not * @param {boolean} [options.showIcon] - whether an arrow icon in the input should be shown */ - var Input = - /*#__PURE__*/ - function () { + var Input = /*#__PURE__*/function () { function Input(_ref) { var placeholder = _ref.placeholder, disabled = _ref.disabled, @@ -3560,9 +3658,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ _proto.changeText = function changeText(item) { if (item) { - this.placeholderEl.innerText = item.getLabel(); + this.placeholderEl.textContent = item.getLabel(); } else { - this.placeholderEl.innerText = this.placeholderText; + this.placeholderEl.textContent = this.placeholderText; } } /** @@ -3606,7 +3704,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else { var mod; } -})(this, function (_exports, _addClass, _removeClass, _removeElement, _utils, _constants) { +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _addClass, _removeClass, _removeElement, _utils, _constants) { "use strict"; _exports.__esModule = true; @@ -3628,9 +3726,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ * An item. * You can get Item by {@link SelectBox#getItem SelectBox.getItem()} and {@link SelectBox#getItems SelectBox.getItems()}. */ - var Item = - /*#__PURE__*/ - function () { + var Item = /*#__PURE__*/function () { /** * @hideconstructor * @param {object} options - options @@ -3930,7 +4026,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else { var mod; } -})(this, function (_exports, _addClass, _removeClass, _removeElement, _utils, _constants, _item) { +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _addClass, _removeClass, _removeElement, _utils, _constants, _item) { "use strict"; _exports.__esModule = true; @@ -3942,9 +4038,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } - function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } @@ -3954,9 +4050,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ * A group of items. * You can get ItemGroup by {@link SelectBox#getItemGroup SelectBox.getItemGroup()} and {@link SelectBox#getItemGroups SelectBox.getItemGroups()}. */ - var ItemGroup = - /*#__PURE__*/ - function () { + var ItemGroup = /*#__PURE__*/function () { /** * @hideconstructor * @param {object} options - options @@ -4177,7 +4271,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else { var mod; } -})(this, function (_exports) { +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports) { "use strict"; _exports.__esModule = true; @@ -4243,7 +4337,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else { var mod; } -})(this, function (_exports, _customEvents, _on, _off, _preventDefault, _getTarget, _closest, _removeElement, _isObject, _isExisty, _isHTMLNode, _sendHostname, _utils, _keyEventUtils, _constants, _input, _dropdown, _itemGroup, _item, _theme) { +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _customEvents, _on, _off, _preventDefault, _getTarget, _closest, _removeElement, _isObject, _isExisty, _isHTMLNode, _sendHostname, _utils, _keyEventUtils, _constants, _input, _dropdown, _itemGroup, _item, _theme) { "use strict"; _exports.__esModule = true; @@ -4392,9 +4486,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ * disabled: true * }; */ - var SelectBox = - /*#__PURE__*/ - function () { + var SelectBox = /*#__PURE__*/function () { function SelectBox(container, _ref) { var data = _ref.data, _ref$placeholder = _ref.placeholder, @@ -4468,7 +4560,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ this.appendToContainer(container); if (autofocus) { - this.input.focus(); + this.focus(); } if (usageStatistics) { @@ -4567,6 +4659,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ } else if ((0, _closest["default"])(target, "." + INPUT)) { this.toggle(); } + + this.focus(); } /** * Handle mouseover events @@ -4623,7 +4717,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ this.close(); if (key === 'escape') { - this.input.focus(); + this.focus(); } } else if (activeKeys.indexOf(key) > -1) { (0, _preventDefault["default"])(ev); @@ -4647,7 +4741,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ if (key === 'escape' && this.opened) { this.close(); - this.input.focus(); + this.focus(); } else if (itemEl) { this.pressKeyOnItem(key, itemEl); } else if ((0, _closest["default"])(target, "." + INPUT)) { @@ -4693,7 +4787,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ _proto.selectByKeydown = function selectByKeydown(itemEl) { this.select(itemEl.getAttribute('data-value')); this.close(); - this.input.focus(); + this.focus(); } /** * Disable a select box, {@link ItemGroup item group} or {@link Item item}. @@ -4869,6 +4963,16 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ this.open(); } } + /** + * Focus to select box. + * @example + * selectBox.focus(); + */ + ; + + _proto.focus = function focus() { + this.input.focus(); + } /** * Select an {@link Item item}. * If it takes string, an item with the same value as the argument is selected. @@ -5065,7 +5169,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else { var mod; } -})(this, function (_exports, _forEachOwnProperties, _removeElement, _isArray, _isBoolean, _isString, _utils, _constants, _themeConfig) { +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _forEachOwnProperties, _removeElement, _isArray, _isBoolean, _isString, _utils, _constants, _themeConfig) { "use strict"; _exports.__esModule = true; @@ -5079,9 +5183,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } - function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } @@ -5091,9 +5195,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ * @param {object} customTheme - theme object for custom style * @param {HTMLElement|string} container - container element or selector */ - var Theme = - /*#__PURE__*/ - function () { + var Theme = /*#__PURE__*/function () { function Theme(customTheme, container) { this.containerSelector = (0, _utils.getSelector)(container); this.cssString = this.buildAll((0, _utils.transform)(customTheme)); @@ -5134,13 +5236,13 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ border: '', background: '' }; - return this.buildInput(_objectSpread({}, theme.common, {}, theme.input)) + this.buildDropdown(_objectSpread({}, theme.common, { + return this.buildInput(_objectSpread(_objectSpread({}, theme.common), theme.input)) + this.buildDropdown(_objectSpread(_objectSpread(_objectSpread({}, theme.common), {}, { borderTop: '0' - }, theme.dropdown, { + }, theme.dropdown), {}, { height: '' - })) + this.buildItemGroup(theme.itemGroup ? _objectSpread({}, theme.common, {}, exclude, {}, theme.itemGroup.label) : _objectSpread({}, theme.common, {}, exclude)) + this.buildItem(theme.itemGroup ? _objectSpread({}, theme.common, {}, exclude, {}, theme.item, { + })) + this.buildItemGroup(theme.itemGroup ? _objectSpread(_objectSpread(_objectSpread({}, theme.common), exclude), theme.itemGroup.label) : _objectSpread(_objectSpread({}, theme.common), exclude)) + this.buildItem(theme.itemGroup ? _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, theme.common), exclude), theme.item), {}, { inItemGroup: theme.itemGroup.items - }) : _objectSpread({}, theme.common, {}, exclude, {}, theme.item)); + }) : _objectSpread(_objectSpread(_objectSpread({}, theme.common), exclude), theme.item)); } /** * Build css strings for Input @@ -5207,9 +5309,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ if (theme.selected) { var base = (0, _utils.transform)(_themeConfig["default"]); - theme.selected = _objectSpread({}, base.item.selected, {}, theme.selected); - theme.disabled = _objectSpread({}, base.item.disabled, {}, theme.disabled); - theme.highlighted = _objectSpread({}, base.item.highlighted, {}, theme.highlighted); + theme.selected = _objectSpread(_objectSpread({}, base.item.selected), theme.selected); + theme.disabled = _objectSpread(_objectSpread({}, base.item.disabled), theme.disabled); + theme.highlighted = _objectSpread(_objectSpread({}, base.item.highlighted), theme.highlighted); } return this.buildCssString(_constants.cls.ITEM, theme) + this.buildCssString([_constants.cls.ITEM, _constants.cls.SELECTED], theme.selected) + this.buildCssString([_constants.cls.ITEM, _constants.cls.DISABLED], theme.disabled) + this.buildCssString([_constants.cls.ITEM, _constants.cls.HIGHLIGHT], theme.highlighted) + this.buildCssString(_constants.cls.ITEM_GROUP + ">." + _constants.cls.ITEM, theme.inItemGroup); @@ -5270,7 +5372,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else { var mod; } -})(this, function (_exports) { +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports) { "use strict"; _exports.__esModule = true; @@ -5440,7 +5542,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } else { var mod; } -})(this, function (_exports, _forEachOwnProperties, _isString) { +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _forEachOwnProperties, _isString) { "use strict"; _exports.__esModule = true; @@ -5493,7 +5595,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ var el = document.createElement(tagName); if (content) { - el.innerText = content; + el.textContent = content; } (0, _forEachOwnProperties["default"])(options, function (value, key) { @@ -5549,4 +5651,4 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ /******/ })["default"]; }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9hcnJheS9pbkFycmF5LmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL2ZvckVhY2guanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2NvbGxlY3Rpb24vZm9yRWFjaEFycmF5LmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL2ZvckVhY2hPd25Qcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL3RvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2N1c3RvbUV2ZW50cy9jdXN0b21FdmVudHMuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2RvbUV2ZW50L19zYWZlRXZlbnQuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2RvbUV2ZW50L2dldFRhcmdldC5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvZG9tRXZlbnQvb2ZmLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9kb21FdmVudC9vbi5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvZG9tRXZlbnQvcHJldmVudERlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvX3NldENsYXNzTmFtZS5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9hZGRDbGFzcy5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9jbG9zZXN0LmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9kb21VdGlsL2dldENsYXNzLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9kb21VdGlsL21hdGNoZXMuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvcmVtb3ZlQ2xhc3MuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvcmVtb3ZlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvb2JqZWN0L2V4dGVuZC5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvcmVxdWVzdC9pbWFnZVBpbmcuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3JlcXVlc3Qvc2VuZEhvc3RuYW1lLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC90eXBlL2lzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3R5cGUvaXNCb29sZWFuLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC90eXBlL2lzRXhpc3R5LmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC90eXBlL2lzRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3R5cGUvaXNIVE1MTm9kZS5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvdHlwZS9pc051bGwuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3R5cGUvaXNOdW1iZXIuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3R5cGUvaXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3R5cGUvaXNTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3R5cGUvaXNVbmRlZmluZWQuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL3NyYy9jc3Mvc2VsZWN0Qm94LmNzcz83ZWJkIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9zcmMvanMvY29uc3RhbnRzLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9zcmMvanMvZHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL3NyYy9qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vc3JjL2pzL2lucHV0LmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9zcmMvanMvaXRlbS5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vc3JjL2pzL2l0ZW1Hcm91cC5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vc3JjL2pzL2tleUV2ZW50VXRpbHMuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL3NyYy9qcy9zZWxlY3RCb3guanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL3NyYy9qcy90aGVtZS5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vc3JjL2pzL3RoZW1lQ29uZmlnLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9zcmMvanMvdXRpbHMuanMiXSwibmFtZXMiOlsiQ1NTX1BSRUZJWCIsImNsYXNzTmFtZXMiLCJTRUxFQ1RfQk9YIiwiSVRFTSIsIklURU1fR1JPVVAiLCJJVEVNX0dST1VQX0xBQkVMIiwiRFJPUERPV04iLCJJTlBVVCIsIlBMQUNFSE9MREVSIiwiSUNPTiIsIk9QRU4iLCJISURERU4iLCJESVNBQkxFRCIsIlNFTEVDVEVEIiwiSElHSExJR0hUIiwiY2xzIiwidmFsdWUiLCJrZXkiLCJEcm9wZG93biIsInBsYWNlaG9sZGVyIiwiZGF0YSIsImRpc2FibGVkIiwiZWwiLCJjbGFzc05hbWUiLCJuYXRpdmVFbCIsInRhYkluZGV4IiwiaXRlbXMiLCJpdGVtTGVuZ3RoIiwic2VsZWN0ZWRJdGVtIiwiaGlnaGxpZ2h0ZWRJdGVtIiwiaW5pdGlhbGl6ZSIsImluaXRpYWxpemVJdGVtcyIsIml0ZW0iLCJpdGVtSW5kZXgiLCJpdGVtR3JvdXBJbmRleCIsImZvckVhY2giLCJkYXR1bSIsIkl0ZW1Hcm91cCIsImluZGV4IiwibGVuZ3RoIiwiSXRlbSIsInB1c2giLCJhcHBlbmRUb0NvbnRhaW5lciIsImxhYmVsIiwiaXRlcmF0ZUl0ZW1zIiwiaXNTZWxlY3RlZCIsImRlc2VsZWN0IiwiZGlzYWJsZSIsImNhbGxiYWNrIiwiYXJncyIsInJlc3VsdCIsImdldEl0ZW1zIiwiaXRlbUluR3JvdXAiLCJhcHBseSIsIm9wZW4iLCJpc0Rpc2FibGVkIiwiaGlnaGxpZ2h0IiwiY2xvc2UiLCJkZWhpZ2hsaWdodCIsImVuYWJsZSIsInNlbGVjdCIsImdldEl0ZW0iLCJtb3ZlSGlnaGxpZ2h0ZWRJdGVtIiwiZGlyZWN0aW9uIiwiZ2V0SGlnaGxpZ2h0ZWRJdGVtIiwiaW5kZXhPZiIsImdldEl0ZW1JbmRleCIsIm51bWJlciIsImlzVmFsaWRJdGVtIiwiY29tcGFyZWRJdGVtIiwiZ2V0SW5kZXgiLCJnZXRWYWx1ZSIsImdldEl0ZW1Hcm91cHMiLCJpdGVtR3JvdXBzIiwiaXRlbUdyb3VwIiwiZ2V0SXRlbUdyb3VwIiwiZ2V0SXRlbUxlbmd0aCIsImdldFNlbGVjdGVkSXRlbSIsImNvbnRhaW5lciIsImFwcGVuZENoaWxkIiwiZGVzdHJveSIsIlNlbGVjdEJveCIsIklucHV0Iiwic2hvd0ljb24iLCJwbGFjZWhvbGRlclRleHQiLCJwbGFjZWhvbGRlckVsIiwid2lkdGgiLCJmb2N1cyIsImNoYW5nZVRleHQiLCJpbm5lclRleHQiLCJnZXRMYWJlbCIsInNlbGVjdGVkIiwiaXRlbUdyb3VwRGlzYWJsZWQiLCJpdGVtRGlzYWJsZWQiLCJtYWtlRGlzYWJsZSIsIm1ha2VFbmFibGUiLCJkaXNhYmxlSXRlbUdyb3VwIiwiZW5hYmxlSXRlbUdyb3VwIiwiYmx1ciIsIm5hdGl2ZUNvbnRhaW5lciIsImxhYmVsRWwiLCJpdGVtQ29udGFpbmVyRWwiLCJjcmVhdGVJdGVtcyIsIm1hcCIsImtleUNvZGVNYXAiLCJrZXlNYXAiLCJBcnJvd1VwIiwiVXAiLCJBcnJvd0Rvd24iLCJEb3duIiwiU3BhY2ViYXIiLCJFbnRlciIsIkVzY2FwZSIsIkVzYyIsIlRhYiIsImlkZW50aWZ5S2V5IiwiZXYiLCJrZXlDb2RlIiwiYXV0b2ZvY3VzIiwiYXV0b2Nsb3NlIiwidGhlbWUiLCJ1c2FnZVN0YXRpc3RpY3MiLCJpbnB1dCIsImRyb3Bkb3duIiwib3BlbmVkIiwiZGlhYmxlZCIsIlRoZW1lIiwiY29udGFpbmVyRWwiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJvcHRpb25zIiwiYmluZEV2ZW50cyIsInRhcmdldCIsImhhbmRsZUNsaWNrIiwiaGFuZGxlTW91c2VvdmVyIiwiaGFuZGxlS2V5ZG93biIsInVuYmluZEV2ZW50cyIsIml0ZW1FbCIsImdldEF0dHJpYnV0ZSIsInRvZ2dsZSIsImNoZWNrTW91c2Vtb3ZlIiwiY2xpZW50WCIsImNsaWVudFkiLCJ4IiwieSIsInByZXZYIiwicHJldlkiLCJjbG9zZUtleXMiLCJhY3RpdmVLZXlzIiwiYWN0aXZhdGVLZXlkb3duIiwicHJlc3NLZXlPbkl0ZW0iLCJwcmVzc0tleU9uSW5wdXQiLCJzZWxlY3RCeUtleWRvd24iLCJmaXJlIiwidHlwZSIsImRpc2FibGVkSXRlbSIsInByZXZTZWxlY3RlZEl0ZW0iLCJwcmV2IiwiY3VyciIsIkN1c3RvbUV2ZW50cyIsIm1peGluIiwiY3VzdG9tVGhlbWUiLCJjb250YWluZXJTZWxlY3RvciIsImNzc1N0cmluZyIsImJ1aWxkQWxsIiwic3R5bGVFbCIsImNyZWF0ZVN0eWxlRWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiY3JlYXRlRWxlbWVudCIsInN0eWxlU2hlZXQiLCJjc3NUZXh0IiwiY3JlYXRlVGV4dE5vZGUiLCJleGNsdWRlIiwiYm9yZGVyIiwiYmFja2dyb3VuZCIsImJ1aWxkSW5wdXQiLCJjb21tb24iLCJidWlsZERyb3Bkb3duIiwiYm9yZGVyVG9wIiwiaGVpZ2h0IiwiYnVpbGRJdGVtR3JvdXAiLCJidWlsZEl0ZW0iLCJpbkl0ZW1Hcm91cCIsImxpbmVIZWlnaHQiLCJpY29uIiwiZGlzcGxheSIsImJ1aWxkQ3NzU3RyaW5nIiwiYmFzZSIsImJhc2VUaGVtZSIsImhpZ2hsaWdodGVkIiwiam9pbiIsInJlcGxhY2UiLCJ0b0xvd2VyQ2FzZSIsInRyYW5zZm9ybSIsIm9iaiIsInByb3AiLCJrZXlzIiwic3BsaXQiLCJ0YWdOYW1lIiwiY29udGVudCIsInNldEF0dHJpYnV0ZSIsImdldFNlbGVjdG9yIiwiaWQiLCJlbGVtcyIsInF1ZXJ5U2VsZWN0b3JBbGwiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakMsQ0FBQztBQUNELE87UUNWQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsR0FBRzs7UUFFSDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsS0FBSztRQUNMO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLE1BQU07UUFDTjtRQUNBO1FBQ0EsTUFBTTtRQUNOO1FBQ0E7UUFDQSxNQUFNO1FBQ047UUFDQTtRQUNBO1FBQ0EsT0FBTztRQUNQO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLElBQUk7UUFDSjs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLE1BQU07UUFDTjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxNQUFNO1FBQ047UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLEtBQUs7O1FBRUw7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsNkJBQTZCO1FBQzdCLDZCQUE2QjtRQUM3QjtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxxQkFBcUIsZ0JBQWdCO1FBQ3JDO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTtRQUNBO1FBQ0EscUJBQXFCLGdCQUFnQjtRQUNyQztRQUNBO1FBQ0EsS0FBSztRQUNMO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBO1FBQ0E7UUFDQSxLQUFLOztRQUVMO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBO1FBQ0EsS0FBSztRQUNMO1FBQ0E7UUFDQTtRQUNBLEtBQUs7O1FBRUw7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBLGtCQUFrQiw4QkFBOEI7UUFDaEQ7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsSUFBSTtRQUNKOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsSUFBSTtRQUNKO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsTUFBTTtRQUNOO1FBQ0E7UUFDQTtRQUNBLE9BQU87UUFDUDtRQUNBO1FBQ0E7UUFDQTtRQUNBLElBQUk7UUFDSjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0Esb0JBQW9CLDJCQUEyQjtRQUMvQztRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsT0FBTztRQUNQO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxtQkFBbUIsY0FBYztRQUNqQztRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsZ0JBQWdCLEtBQUs7UUFDckI7UUFDQTtRQUNBO1FBQ0EsTUFBTTtRQUNOO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxnQkFBZ0IsWUFBWTtRQUM1QjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBLGNBQWMsNEJBQTRCO1FBQzFDO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsTUFBTTtRQUNOO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsSUFBSTs7UUFFSjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7O1FBRUE7UUFDQTtRQUNBLGVBQWUsNEJBQTRCO1FBQzNDO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0EsZUFBZSw0QkFBNEI7UUFDM0M7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLGlCQUFpQix1Q0FBdUM7UUFDeEQ7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxpQkFBaUIsdUNBQXVDO1FBQ3hEO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsaUJBQWlCLHNCQUFzQjtRQUN2QztRQUNBO1FBQ0E7UUFDQSxRQUFRO1FBQ1I7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsVUFBVTtRQUNWO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLGNBQWMsd0NBQXdDO1FBQ3REO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTtRQUNBO1FBQ0EsT0FBTztRQUNQO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLFNBQVM7UUFDVDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxNQUFNO1FBQ047UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLFFBQVE7UUFDUjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLElBQUk7UUFDSjs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLGVBQWU7UUFDZjtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7UUFFQTtRQUNBLHNDQUFzQyx1QkFBdUI7OztRQUc3RDtRQUNBOzs7Ozs7Ozs7Ozs7O0FDeHhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViLGNBQWMsbUJBQU8sQ0FBQyx3RUFBaUI7O0FBRXZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsT0FBTztBQUNsQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IsK0JBQStCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWIsY0FBYyxtQkFBTyxDQUFDLHdFQUFpQjtBQUN2QyxtQkFBbUIsbUJBQU8sQ0FBQyw4RkFBNEI7QUFDdkQsMkJBQTJCLG1CQUFPLENBQUMsOEdBQW9DOztBQUV2RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQSxnRUFBZ0U7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixjQUFjO0FBQ2Q7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7OztBQ25EQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFdBQVcsU0FBUztBQUNwQixXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBLDBFQUEwRTtBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxVQUFVLGFBQWE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7OztBQzFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQSwwRkFBMEY7QUFDMUY7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFlBQVk7QUFDckM7QUFDQSxJQUFJO0FBQ0osY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViLG1CQUFtQixtQkFBTyxDQUFDLGtGQUFnQjs7QUFFM0M7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQSxnRUFBZ0U7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEMsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWIsYUFBYSxtQkFBTyxDQUFDLDBFQUFrQjtBQUN2QyxlQUFlLG1CQUFPLENBQUMsMEVBQWtCO0FBQ3pDLGVBQWUsbUJBQU8sQ0FBQywwRUFBa0I7QUFDekMsZUFBZSxtQkFBTyxDQUFDLDBFQUFrQjtBQUN6QyxjQUFjLG1CQUFPLENBQUMsd0VBQWlCO0FBQ3ZDLGlCQUFpQixtQkFBTyxDQUFDLDhFQUFvQjtBQUM3QyxjQUFjLG1CQUFPLENBQUMsb0ZBQXVCOztBQUU3Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHFCQUFxQixFQUFFO0FBQ3pEO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsWUFBWTtBQUN6QjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxlQUFlO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsU0FBUyw4QkFBOEIsRUFBRTtBQUNwRCw2QkFBNkI7QUFDN0IsV0FBVyxrQkFBa0I7QUFDN0IsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFNBQVMsOEJBQThCLEVBQUU7QUFDcEQsNkJBQTZCO0FBQzdCLFdBQVcsa0JBQWtCO0FBQzdCLFdBQVcsT0FBTztBQUNsQjtBQUNBLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsU0FBUyw2QkFBNkIsRUFBRTtBQUNuRCw2QkFBNkI7QUFDN0IsV0FBVyxnQkFBZ0I7QUFDM0IsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCLFNBQVM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsT0FBTztBQUNsQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLFdBQVcsT0FBTyxtQkFBbUIsY0FBYztBQUNuRCxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyx5QkFBeUI7QUFDcEMsS0FBSyxjQUFjO0FBQ25CLFdBQVcsV0FBVztBQUN0QjtBQUNBO0FBQ0EsNEVBQTRFO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHdCQUF3QjtBQUNyRDtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxLQUFLO0FBQ2hCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7OztBQ3hqQkE7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7O0FBRUE7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QixXQUFXLE9BQU87QUFDbEIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixhQUFhLFlBQVk7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYixlQUFlLG1CQUFPLENBQUMsMEVBQWtCO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxvRkFBdUI7O0FBRTdDLGdCQUFnQixtQkFBTyxDQUFDLDRFQUFjOztBQUV0QztBQUNBO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QixXQUFXLE9BQU87QUFDbEIsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7O0FDbEZBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViLGVBQWUsbUJBQU8sQ0FBQywwRUFBa0I7QUFDekMsY0FBYyxtQkFBTyxDQUFDLG9GQUF1Qjs7QUFFN0MsZ0JBQWdCLG1CQUFPLENBQUMsNEVBQWM7O0FBRXRDO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsV0FBVyxnQkFBZ0I7QUFDM0I7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QjtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEI7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsTUFBTTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7OztBQzVGQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViLGNBQWMsbUJBQU8sQ0FBQyx3RUFBaUI7QUFDdkMsa0JBQWtCLG1CQUFPLENBQUMsZ0ZBQXFCOztBQUUvQztBQUNBO0FBQ0EsV0FBVyx5QkFBeUI7QUFDcEMsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWIsY0FBYyxtQkFBTyxDQUFDLG9GQUF1QjtBQUM3QyxjQUFjLG1CQUFPLENBQUMsMEVBQWtCO0FBQ3hDLGVBQWUsbUJBQU8sQ0FBQyx1RUFBWTtBQUNuQyxtQkFBbUIsbUJBQU8sQ0FBQyxpRkFBaUI7O0FBRTVDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLFVBQVU7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7OztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYixjQUFjLG1CQUFPLENBQUMscUVBQVc7O0FBRWpDO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsWUFBWTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7O0FDbENBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViLGtCQUFrQixtQkFBTyxDQUFDLGdGQUFxQjs7QUFFL0M7QUFDQTtBQUNBLFdBQVcseUJBQXlCO0FBQ3BDLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWIsY0FBYyxtQkFBTyxDQUFDLDBFQUFrQjtBQUN4QyxjQUFjLG1CQUFPLENBQUMsb0ZBQXVCOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFlBQVk7QUFDdkIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7O0FDaENBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViLG1CQUFtQixtQkFBTyxDQUFDLDhGQUE0QjtBQUN2RCxjQUFjLG1CQUFPLENBQUMsMEVBQWtCO0FBQ3hDLGVBQWUsbUJBQU8sQ0FBQyx1RUFBWTtBQUNuQyxtQkFBbUIsbUJBQU8sQ0FBQyxpRkFBaUI7O0FBRTVDO0FBQ0E7QUFDQSxXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLFVBQVU7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7OztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFVBQVU7QUFDckIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTs7QUFFQSx1Q0FBdUMsU0FBUztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7O0FDbENBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViLDJCQUEyQixtQkFBTyxDQUFDLDhHQUFvQzs7QUFFdkU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLGFBQWE7QUFDYjtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7O0FDaERBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViLGtCQUFrQixtQkFBTyxDQUFDLGdGQUFxQjtBQUMvQyxnQkFBZ0IsbUJBQU8sQ0FBQyx5RUFBYTs7QUFFckM7O0FBRUE7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsS0FBSztBQUNMOztBQUVBOzs7Ozs7Ozs7Ozs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViLGtCQUFrQixtQkFBTyxDQUFDLDBFQUFlO0FBQ3pDLGFBQWEsbUJBQU8sQ0FBQyxnRUFBVTs7QUFFL0I7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQ7QUFDQSxnQkFBZ0I7QUFDaEIsZUFBZTtBQUNmLGdCQUFnQjtBQUNoQixjQUFjLEVBQUU7QUFDaEIsa0JBQWtCO0FBQ2xCLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7OztBQzlCQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7OztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3Qjs7QUFFQTs7Ozs7Ozs7Ozs7O0FDbEJBLHVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTs7OztBQU9BLE1BQU1BLFVBQVUsR0FBRyxnQkFBbkI7QUFFQSxNQUFNQyxVQUFVLEdBQUc7QUFDakJDLGNBQVUsRUFBRSxFQURLO0FBRWpCQyxRQUFJLEVBQUUsTUFGVztBQUdqQkMsY0FBVSxFQUFFLFlBSEs7QUFJakJDLG9CQUFnQixFQUFFLGtCQUpEO0FBS2pCQyxZQUFRLEVBQUUsVUFMTztBQU1qQkMsU0FBSyxFQUFFLE9BTlU7QUFPakJDLGVBQVcsRUFBRSxhQVBJO0FBUWpCQyxRQUFJLEVBQUUsTUFSVztBQVNqQkMsUUFBSSxFQUFFLE1BVFc7QUFVakJDLFVBQU0sRUFBRSxRQVZTO0FBV2pCQyxZQUFRLEVBQUUsVUFYTztBQVlqQkMsWUFBUSxFQUFFLFVBWk87QUFhakJDLGFBQVMsRUFBRTtBQWJNLEdBQW5COztBQWdCTyxNQUFNQyxHQUFHLEdBQUksWUFBVztBQUM3QiwwQ0FBcUJkLFVBQXJCLEVBQWlDLFVBQUNlLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUMvQyxVQUFJRCxLQUFKLEVBQVc7QUFDVGYsa0JBQVUsQ0FBQ2dCLEdBQUQsQ0FBVixHQUFxQmpCLFVBQXJCLFNBQW1DZ0IsS0FBbkM7QUFDRCxPQUZELE1BRU87QUFDTGYsa0JBQVUsQ0FBQ2dCLEdBQUQsQ0FBVixHQUFrQmpCLFVBQWxCO0FBQ0Q7QUFDRixLQU5EO0FBUUEsV0FBT0MsVUFBUDtBQUNELEdBVmtCLEVBQVo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUUDs7Ozs7Ozs7TUFRcUJpQixROzs7QUFDbkIsNEJBQXFEO0FBQUEsVUFBdkNDLFdBQXVDLFFBQXZDQSxXQUF1QztBQUFBLFVBQTFCQyxJQUEwQixRQUExQkEsSUFBMEI7QUFBQSwrQkFBcEJDLFFBQW9CO0FBQUEsVUFBcEJBLFFBQW9CLDhCQUFULEtBQVM7O0FBQ25EOzs7O0FBSUEsV0FBS0MsRUFBTCxHQUFVLDBCQUFjLElBQWQsRUFBb0IsRUFBcEIsRUFBd0I7QUFBRUMsaUJBQVMsRUFBS1IsZUFBSVQsUUFBVCxTQUFxQlMsZUFBSUo7QUFBcEMsT0FBeEIsQ0FBVjtBQUVBOzs7OztBQUlBLFdBQUthLFFBQUwsR0FBZ0IsMEJBQWMsUUFBZCxFQUF3QixFQUF4QixFQUE0QjtBQUFFRCxpQkFBUyxFQUFFUixlQUFJSixNQUFqQjtBQUF5QmMsZ0JBQVEsRUFBRSxDQUFDO0FBQXBDLE9BQTVCLENBQWhCO0FBRUE7Ozs7OztBQUtBLFdBQUtDLEtBQUwsR0FBYSxFQUFiO0FBRUE7Ozs7OztBQUtBLFdBQUtDLFVBQUwsR0FBa0IsQ0FBbEI7QUFFQTs7Ozs7QUFJQSxXQUFLQyxZQUFMLEdBQW9CLElBQXBCO0FBRUE7Ozs7O0FBSUEsV0FBS0MsZUFBTCxHQUF1QixJQUF2QjtBQUVBLFdBQUtDLFVBQUwsQ0FBZ0JWLElBQWhCLEVBQXNCQyxRQUF0QixFQUFnQ0YsV0FBaEM7QUFDRDtBQUVEOzs7Ozs7Ozs7V0FLQVksZSxHQUFBLHlCQUFnQlgsSUFBaEIsRUFBc0I7QUFBQTs7QUFDcEIsVUFBSVksSUFBSjtBQUNBLFVBQUlDLFNBQVMsR0FBRyxDQUFoQjtBQUNBLFVBQUlDLGNBQWMsR0FBRyxDQUFyQjtBQUNBZCxVQUFJLENBQUNlLE9BQUwsQ0FBYSxVQUFBQyxLQUFLLEVBQUk7QUFDcEIsWUFBSUEsS0FBSyxDQUFDaEIsSUFBVixFQUFnQjtBQUNkWSxjQUFJLEdBQUcsSUFBSUsscUJBQUo7QUFBZ0JDLGlCQUFLLEVBQUVMLFNBQXZCO0FBQWtDQywwQkFBYyxFQUFkQTtBQUFsQyxhQUFxREUsS0FBckQsRUFBUDtBQUNBSCxtQkFBUyxJQUFJRyxLQUFLLENBQUNoQixJQUFOLENBQVdtQixNQUFYLEdBQW9CLENBQWpDO0FBQ0FMLHdCQUFjLElBQUksQ0FBbEI7QUFDRCxTQUpELE1BSU87QUFDTEYsY0FBSSxHQUFHLElBQUlRLGdCQUFKO0FBQVdGLGlCQUFLLEVBQUVMO0FBQWxCLGFBQWdDRyxLQUFoQyxFQUFQO0FBQ0Q7O0FBRUQsYUFBSSxDQUFDVixLQUFMLENBQVdlLElBQVgsQ0FBZ0JULElBQWhCOztBQUNBQSxZQUFJLENBQUNVLGlCQUFMLENBQXVCLEtBQUksQ0FBQ3BCLEVBQTVCLEVBQWdDLEtBQUksQ0FBQ0UsUUFBckM7QUFDQVMsaUJBQVMsSUFBSSxDQUFiO0FBQ0QsT0FaRDtBQWNBLFdBQUtOLFVBQUwsR0FBa0JNLFNBQWxCO0FBQ0Q7QUFFRDs7Ozs7O1dBSUFILFUsR0FBQSxvQkFBV1YsSUFBWCxFQUFpQkMsUUFBakIsRUFBMkJGLFdBQTNCLEVBQXdDO0FBQUE7O0FBQ3RDLFVBQUlBLFdBQUosRUFBaUI7QUFDZixrQ0FBYyxRQUFkLEVBQXdCLEVBQXhCLEVBQTRCO0FBQUV3QixlQUFLLEVBQUV4QixXQUFUO0FBQXNCSCxlQUFLLEVBQUU7QUFBN0IsU0FBNUIsRUFBK0QsS0FBS1EsUUFBcEU7QUFDRDs7QUFFRCxXQUFLTyxlQUFMLENBQXFCWCxJQUFyQjtBQUVBLFdBQUt3QixZQUFMLENBQWtCLFVBQUFaLElBQUksRUFBSTtBQUN4QixZQUFJLENBQUMsTUFBSSxDQUFDSixZQUFOLElBQXNCSSxJQUFJLENBQUNhLFVBQUwsRUFBMUIsRUFBNkM7QUFDM0MsZ0JBQUksQ0FBQ2pCLFlBQUwsR0FBb0JJLElBQXBCO0FBQ0QsU0FGRCxNQUVPLElBQUksTUFBSSxDQUFDSixZQUFMLElBQXFCSSxJQUFJLENBQUNhLFVBQUwsRUFBekIsRUFBNEM7QUFDakRiLGNBQUksQ0FBQ2MsUUFBTDtBQUNEO0FBQ0YsT0FORDs7QUFRQSxVQUFJekIsUUFBSixFQUFjO0FBQ1osYUFBSzBCLE9BQUw7QUFDRDtBQUNGO0FBRUQ7Ozs7Ozs7O1dBTUFILFksR0FBQSxzQkFBYUksUUFBYixFQUFnQztBQUFBOztBQUFBLHdDQUFOQyxJQUFNO0FBQU5BLFlBQU07QUFBQTs7QUFDOUIsVUFBSVgsS0FBSyxHQUFHLENBQVo7QUFFQSxvQ0FBYSxLQUFLWixLQUFsQixFQUF5QixVQUFBTSxJQUFJLEVBQUk7QUFDL0IsWUFBSWtCLE1BQU0sR0FBRyxJQUFiOztBQUNBLFlBQUlsQixJQUFJLFlBQVlLLHFCQUFwQixFQUErQjtBQUM3Qix3Q0FBYUwsSUFBSSxDQUFDbUIsUUFBTCxFQUFiLEVBQThCLFVBQUFDLFdBQVcsRUFBSTtBQUMzQ0Ysa0JBQU0sR0FBR0YsUUFBUSxDQUFDSyxLQUFULENBQWUsTUFBZixHQUFzQkQsV0FBdEIsRUFBbUNkLEtBQW5DLFNBQTZDVyxJQUE3QyxNQUF1RCxLQUFoRTtBQUNBWCxpQkFBSyxJQUFJLENBQVQ7QUFFQSxtQkFBT1ksTUFBUDtBQUNELFdBTEQ7QUFPQSxpQkFBT0EsTUFBUDtBQUNEOztBQUVEQSxjQUFNLEdBQUdGLFFBQVEsQ0FBQ0ssS0FBVCxDQUFlLE1BQWYsR0FBc0JyQixJQUF0QixFQUE0Qk0sS0FBNUIsU0FBc0NXLElBQXRDLEVBQVQ7QUFDQVgsYUFBSyxJQUFJLENBQVQ7QUFFQSxlQUFPWSxNQUFQO0FBQ0QsT0FqQkQ7QUFrQkQ7QUFFRDs7Ozs7V0FHQUksSSxHQUFBLGdCQUFPO0FBQ0wsbUNBQVksS0FBS2hDLEVBQWpCLEVBQXFCUCxlQUFJSixNQUF6QjtBQUNBLFVBQU1rQixlQUFlLEdBQ25CLENBQUMsS0FBS0QsWUFBTixJQUFzQixLQUFLQSxZQUFMLENBQWtCMkIsVUFBbEIsRUFBdEIsR0FDSSxLQUFLSixRQUFMLENBQWMsVUFBQW5CLElBQUk7QUFBQSxlQUFJLENBQUNBLElBQUksQ0FBQ3VCLFVBQUwsRUFBTDtBQUFBLE9BQWxCLEVBQTBDLENBQTFDLENBREosR0FFSSxLQUFLM0IsWUFIWDtBQUlBLFdBQUs0QixTQUFMLENBQWUzQixlQUFmO0FBQ0Q7QUFFRDs7Ozs7V0FHQTRCLEssR0FBQSxpQkFBUTtBQUNOLGdDQUFTLEtBQUtuQyxFQUFkLEVBQWtCUCxlQUFJSixNQUF0QjtBQUNBLFdBQUsrQyxXQUFMO0FBQ0Q7QUFFRDs7Ozs7V0FHQVgsTyxHQUFBLG1CQUFVO0FBQ1IsV0FBS3ZCLFFBQUwsQ0FBY0gsUUFBZCxHQUF5QixJQUF6QjtBQUNBLGdDQUFTLEtBQUtDLEVBQWQsRUFBa0JQLGVBQUlILFFBQXRCO0FBQ0Q7QUFFRDs7Ozs7V0FHQStDLE0sR0FBQSxrQkFBUztBQUNQLFdBQUtuQyxRQUFMLENBQWNILFFBQWQsR0FBeUIsS0FBekI7QUFDQSxtQ0FBWSxLQUFLQyxFQUFqQixFQUFxQlAsZUFBSUgsUUFBekI7QUFDRDtBQUVEOzs7Ozs7O1dBS0FnRCxNLEdBQUEsZ0JBQU81QyxLQUFQLEVBQWM7QUFDWixVQUFNWSxZQUFZLEdBQUdaLEtBQUssWUFBWXdCLGdCQUFqQixHQUF3QnhCLEtBQXhCLEdBQWdDLEtBQUs2QyxPQUFMLENBQWE3QyxLQUFiLENBQXJEO0FBQ0EsV0FBSzhCLFFBQUw7O0FBRUEsVUFBSSxDQUFDbEIsWUFBRCxJQUFrQkEsWUFBWSxJQUFJQSxZQUFZLENBQUMyQixVQUFiLEVBQXRDLEVBQWtFO0FBQ2hFLGVBQU8sSUFBUDtBQUNEOztBQUVEM0Isa0JBQVksQ0FBQ2dDLE1BQWI7QUFDQSxXQUFLaEMsWUFBTCxHQUFvQkEsWUFBcEI7QUFFQSxhQUFPQSxZQUFQO0FBQ0Q7QUFFRDs7Ozs7V0FHQWtCLFEsR0FBQSxvQkFBVztBQUNULFVBQUksS0FBS2xCLFlBQVQsRUFBdUI7QUFDckIsYUFBS0EsWUFBTCxDQUFrQmtCLFFBQWxCO0FBQ0EsYUFBS2xCLFlBQUwsR0FBb0IsSUFBcEI7QUFDRDtBQUNGO0FBRUQ7Ozs7OztXQUlBNEIsUyxHQUFBLG1CQUFVeEMsS0FBVixFQUFpQjtBQUNmLFVBQUlhLGVBQUo7O0FBQ0EsVUFBSWIsS0FBSyxZQUFZd0IsZ0JBQXJCLEVBQTJCO0FBQ3pCWCx1QkFBZSxHQUFHYixLQUFsQjtBQUNELE9BRkQsTUFFTyxJQUFJLDBCQUFTQSxLQUFULENBQUosRUFBcUI7QUFDMUJhLHVCQUFlLEdBQUcsS0FBS2dDLE9BQUwsQ0FBYTdDLEtBQWIsQ0FBbEI7QUFDRDs7QUFFRCxVQUFJYSxlQUFlLElBQUlBLGVBQWUsS0FBSyxLQUFLQSxlQUFoRCxFQUFpRTtBQUMvRCxhQUFLNkIsV0FBTDtBQUNBN0IsdUJBQWUsQ0FBQzJCLFNBQWhCO0FBQ0EsYUFBSzNCLGVBQUwsR0FBdUJBLGVBQXZCO0FBQ0Q7QUFDRjtBQUVEOzs7OztXQUdBNkIsVyxHQUFBLHVCQUFjO0FBQ1osVUFBSSxLQUFLN0IsZUFBVCxFQUEwQjtBQUN4QixhQUFLQSxlQUFMLENBQXFCNkIsV0FBckI7QUFDQSxhQUFLN0IsZUFBTCxHQUF1QixJQUF2QjtBQUNEO0FBQ0Y7QUFFRDs7Ozs7O1dBSUFpQyxtQixHQUFBLDZCQUFvQkMsU0FBcEIsRUFBK0I7QUFDN0IsVUFBTWxDLGVBQWUsR0FBRyxLQUFLbUMsa0JBQUwsRUFBeEI7QUFDQSxVQUFNdEMsS0FBSyxHQUFHLEtBQUt5QixRQUFMLEVBQWQ7QUFGNkIsVUFHckJaLE1BSHFCLEdBR1ZiLEtBSFUsQ0FHckJhLE1BSHFCO0FBSzdCLFVBQUlELEtBQUssR0FBR1osS0FBSyxDQUFDdUMsT0FBTixDQUFjcEMsZUFBZCxDQUFaOztBQUNBLFVBQUlTLEtBQUssR0FBRyxDQUFDLENBQWIsRUFBZ0I7QUFDZEEsYUFBSyxHQUFHLEtBQUs0QixZQUFMLENBQWtCNUIsS0FBbEIsRUFBeUJDLE1BQXpCLEVBQWlDd0IsU0FBakMsQ0FBUjs7QUFFQSxlQUFPekIsS0FBSyxHQUFHQyxNQUFmLEVBQXVCO0FBQ3JCLGNBQUksQ0FBQ2IsS0FBSyxDQUFDWSxLQUFELENBQUwsQ0FBYWlCLFVBQWIsRUFBTCxFQUFnQztBQUM5QixpQkFBS0MsU0FBTCxDQUFlOUIsS0FBSyxDQUFDWSxLQUFELENBQXBCO0FBQ0E7QUFDRDs7QUFFREEsZUFBSyxHQUFHLEtBQUs0QixZQUFMLENBQWtCNUIsS0FBbEIsRUFBeUJDLE1BQXpCLEVBQWlDd0IsU0FBakMsQ0FBUjtBQUNEO0FBQ0Y7QUFDRixLOztXQUVERyxZLEdBQUEsc0JBQWE1QixLQUFiLEVBQW9CQyxNQUFwQixFQUE0QndCLFNBQTVCLEVBQXVDO0FBQ3JDLGFBQU8sQ0FBQ3pCLEtBQUssR0FBR3lCLFNBQVIsR0FBb0J4QixNQUFyQixJQUErQkEsTUFBdEM7QUFDRDtBQUVEOzs7Ozs7Ozs7V0FPQVksUSxHQUFBLGtCQUFTSCxRQUFULEVBQWdDbUIsTUFBaEMsRUFBNkM7QUFBQSxVQUFwQ25CLFFBQW9DO0FBQXBDQSxnQkFBb0MsR0FBekI7QUFBQSxpQkFBTSxJQUFOO0FBQUEsU0FBeUI7QUFBQTs7QUFBQSxVQUFibUIsTUFBYTtBQUFiQSxjQUFhLEdBQUosQ0FBQyxDQUFHO0FBQUE7O0FBQzNDLFVBQU16QyxLQUFLLEdBQUcsRUFBZDtBQUNBLFdBQUtrQixZQUFMLENBQWtCLFVBQUFaLElBQUksRUFBSTtBQUN4QixZQUFJZ0IsUUFBUSxDQUFDaEIsSUFBRCxDQUFaLEVBQW9CO0FBQ2xCTixlQUFLLENBQUNlLElBQU4sQ0FBV1QsSUFBWDtBQUNBbUMsZ0JBQU0sSUFBSSxDQUFWO0FBRUEsaUJBQU9BLE1BQU0sS0FBSyxDQUFsQjtBQUNEOztBQUVELGVBQU8sSUFBUDtBQUNELE9BVEQ7QUFXQSxhQUFPekMsS0FBUDtBQUNEO0FBRUQ7Ozs7Ozs7V0FLQW1DLE8sR0FBQSxpQkFBUTdDLEtBQVIsRUFBZTtBQUNiLFVBQU1vRCxXQUFXLEdBQUcsMEJBQVNwRCxLQUFULElBQ2hCLFVBQUFxRCxZQUFZO0FBQUEsZUFBSUEsWUFBWSxDQUFDQyxRQUFiLE9BQTRCdEQsS0FBaEM7QUFBQSxPQURJLEdBRWhCLFVBQUFxRCxZQUFZO0FBQUEsZUFBSUEsWUFBWSxDQUFDRSxRQUFiLE9BQTRCdkQsS0FBaEM7QUFBQSxPQUZoQjtBQUlBLGFBQU8sS0FBS21DLFFBQUwsQ0FBY2lCLFdBQWQsRUFBMkIsQ0FBM0IsRUFBOEIsQ0FBOUIsQ0FBUDtBQUNEO0FBRUQ7Ozs7Ozs7OztXQU9BSSxhLEdBQUEsdUJBQWN4QixRQUFkLEVBQXFDbUIsTUFBckMsRUFBa0Q7QUFBQSxVQUFwQ25CLFFBQW9DO0FBQXBDQSxnQkFBb0MsR0FBekI7QUFBQSxpQkFBTSxJQUFOO0FBQUEsU0FBeUI7QUFBQTs7QUFBQSxVQUFibUIsTUFBYTtBQUFiQSxjQUFhLEdBQUosQ0FBQyxDQUFHO0FBQUE7O0FBQ2hELFVBQU1NLFVBQVUsR0FBRyxFQUFuQjtBQUNBLG9DQUFhLEtBQUsvQyxLQUFsQixFQUF5QixVQUFBZ0QsU0FBUyxFQUFJO0FBQ3BDLFlBQUlBLFNBQVMsWUFBWXJDLHFCQUFyQixJQUFrQ1csUUFBUSxDQUFDMEIsU0FBRCxDQUE5QyxFQUEyRDtBQUN6REQsb0JBQVUsQ0FBQ2hDLElBQVgsQ0FBZ0JpQyxTQUFoQjtBQUNBUCxnQkFBTSxJQUFJLENBQVY7QUFFQSxpQkFBT0EsTUFBTSxLQUFLLENBQWxCO0FBQ0Q7O0FBRUQsZUFBTyxJQUFQO0FBQ0QsT0FURDtBQVdBLGFBQU9NLFVBQVA7QUFDRDtBQUVEOzs7Ozs7O1dBS0FFLFksR0FBQSxzQkFBYXJDLEtBQWIsRUFBb0I7QUFDbEIsYUFBTyxLQUFLa0MsYUFBTCxDQUFtQixVQUFBRSxTQUFTO0FBQUEsZUFBSUEsU0FBUyxDQUFDSixRQUFWLE9BQXlCaEMsS0FBN0I7QUFBQSxPQUE1QixFQUFnRSxDQUFoRSxFQUFtRSxDQUFuRSxDQUFQO0FBQ0Q7QUFFRDs7Ozs7O1dBSUFzQyxhLEdBQUEseUJBQWdCO0FBQ2QsYUFBTyxLQUFLakQsVUFBWjtBQUNEO0FBRUQ7Ozs7OztXQUlBa0QsZSxHQUFBLDJCQUFrQjtBQUNoQixhQUFPLEtBQUtqRCxZQUFaO0FBQ0Q7QUFFRDs7Ozs7O1dBSUFvQyxrQixHQUFBLDhCQUFxQjtBQUNuQixhQUFPLEtBQUtuQyxlQUFaO0FBQ0Q7QUFFRDs7Ozs7O1dBSUFhLGlCLEdBQUEsMkJBQWtCb0MsU0FBbEIsRUFBNkI7QUFDM0JBLGVBQVMsQ0FBQ0MsV0FBVixDQUFzQixLQUFLekQsRUFBM0I7QUFDQXdELGVBQVMsQ0FBQ0MsV0FBVixDQUFzQixLQUFLdkQsUUFBM0I7QUFDRDtBQUVEOzs7OztXQUdBd0QsTyxHQUFBLG1CQUFVO0FBQ1IsV0FBS3RELEtBQUwsQ0FBV1MsT0FBWCxDQUFtQixVQUFBSCxJQUFJO0FBQUEsZUFBSUEsSUFBSSxDQUFDZ0QsT0FBTCxFQUFKO0FBQUEsT0FBdkI7QUFDQSxxQ0FBYyxLQUFLMUQsRUFBbkI7QUFDQSxxQ0FBYyxLQUFLRSxRQUFuQjtBQUNBLFdBQUtGLEVBQUwsR0FBVSxLQUFLRSxRQUFMLEdBQWdCLEtBQUtFLEtBQUwsR0FBYSxLQUFLRSxZQUFMLEdBQW9CLEtBQUtDLGVBQUwsR0FBdUIsSUFBbEY7QUFDRCxLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6WEg7Ozs7aUJBUWVvRCxxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1JmOzs7OztBQVdBOzs7Ozs7OztNQVFxQkMsSzs7O0FBQ25CLHlCQUFpRDtBQUFBLFVBQW5DL0QsV0FBbUMsUUFBbkNBLFdBQW1DO0FBQUEsVUFBdEJFLFFBQXNCLFFBQXRCQSxRQUFzQjtBQUFBLFVBQVo4RCxRQUFZLFFBQVpBLFFBQVk7O0FBQy9DOzs7OztBQUtBLFdBQUtDLGVBQUwsR0FBdUJqRSxXQUF2QjtBQUVBOzs7OztBQUlBLFdBQUtHLEVBQUwsR0FBVSwwQkFBYyxLQUFkLEVBQXFCLEVBQXJCLEVBQXlCO0FBQUVDLGlCQUFTLEVBQUVSLGVBQUlSLEtBQWpCO0FBQXdCa0IsZ0JBQVEsRUFBRTtBQUFsQyxPQUF6QixDQUFWO0FBRUE7Ozs7O0FBSUEsV0FBSzRELGFBQUwsR0FBcUIsMEJBQ25CLEdBRG1CLEVBRW5CLEtBQUtELGVBRmMsRUFHbkI7QUFBRTdELGlCQUFTLEVBQUVSLGVBQUlQO0FBQWpCLE9BSG1CLEVBSW5CLEtBQUtjLEVBSmMsQ0FBckI7QUFPQSxXQUFLUSxVQUFMLENBQWdCVCxRQUFoQixFQUEwQjhELFFBQTFCO0FBQ0Q7QUFFRDs7Ozs7Ozs7V0FJQXJELFUsR0FBQSxvQkFBV1QsUUFBWCxFQUFxQjhELFFBQXJCLEVBQStCO0FBQzdCLFVBQUlBLFFBQUosRUFBYztBQUNaLGtDQUFjLE1BQWQsRUFBc0IsUUFBdEIsRUFBZ0M7QUFBRTVELG1CQUFTLEVBQUVSLGVBQUlOO0FBQWpCLFNBQWhDLEVBQXlELEtBQUthLEVBQTlEO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsYUFBSytELGFBQUwsQ0FBbUJDLEtBQW5CLEdBQTJCLE1BQTNCO0FBQ0Q7O0FBRUQsVUFBSWpFLFFBQUosRUFBYztBQUNaLGFBQUswQixPQUFMO0FBQ0Q7QUFDRjtBQUVEOzs7OztXQUdBQSxPLEdBQUEsbUJBQVU7QUFDUixnQ0FBUyxLQUFLekIsRUFBZCxFQUFrQlAsZUFBSUgsUUFBdEI7QUFDRDtBQUVEOzs7OztXQUdBK0MsTSxHQUFBLGtCQUFTO0FBQ1AsbUNBQVksS0FBS3JDLEVBQWpCLEVBQXFCUCxlQUFJSCxRQUF6QjtBQUNEO0FBRUQ7Ozs7O1dBR0EwQyxJLEdBQUEsZ0JBQU87QUFDTCxnQ0FBUyxLQUFLaEMsRUFBZCxFQUFrQlAsZUFBSUwsSUFBdEI7QUFDRDtBQUVEOzs7OztXQUdBK0MsSyxHQUFBLGlCQUFRO0FBQ04sbUNBQVksS0FBS25DLEVBQWpCLEVBQXFCUCxlQUFJTCxJQUF6QjtBQUNEO0FBRUQ7Ozs7O1dBR0E2RSxLLEdBQUEsaUJBQVE7QUFDTixXQUFLakUsRUFBTCxDQUFRaUUsS0FBUjtBQUNEO0FBRUQ7Ozs7OztXQUlBQyxVLEdBQUEsb0JBQVd4RCxJQUFYLEVBQWlCO0FBQ2YsVUFBSUEsSUFBSixFQUFVO0FBQ1IsYUFBS3FELGFBQUwsQ0FBbUJJLFNBQW5CLEdBQStCekQsSUFBSSxDQUFDMEQsUUFBTCxFQUEvQjtBQUNELE9BRkQsTUFFTztBQUNMLGFBQUtMLGFBQUwsQ0FBbUJJLFNBQW5CLEdBQStCLEtBQUtMLGVBQXBDO0FBQ0Q7QUFDRjtBQUVEOzs7Ozs7V0FJQTFDLGlCLEdBQUEsMkJBQWtCb0MsU0FBbEIsRUFBNkI7QUFDM0JBLGVBQVMsQ0FBQ0MsV0FBVixDQUFzQixLQUFLekQsRUFBM0I7QUFDRDtBQUVEOzs7OztXQUdBMEQsTyxHQUFBLG1CQUFVO0FBQ1IscUNBQWMsS0FBSzFELEVBQW5CO0FBQ0EsV0FBS0EsRUFBTCxHQUFVLEtBQUsrRCxhQUFMLEdBQXFCLElBQS9CO0FBQ0QsSzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3SEg7Ozs7O0FBV0E7Ozs7OztNQU1xQjdDLEk7OztBQUNuQjs7Ozs7Ozs7O0FBU0Esd0JBQXlEO0FBQUEsVUFBM0N4QixLQUEyQyxRQUEzQ0EsS0FBMkM7QUFBQSxVQUFwQzJCLEtBQW9DLFFBQXBDQSxLQUFvQztBQUFBLFVBQTdCdEIsUUFBNkIsUUFBN0JBLFFBQTZCO0FBQUEsVUFBbkJzRSxRQUFtQixRQUFuQkEsUUFBbUI7QUFBQSxVQUFUckQsS0FBUyxRQUFUQSxLQUFTOztBQUN2RDs7Ozs7QUFLQSxXQUFLdEIsS0FBTCxRQUFnQkEsS0FBaEI7QUFFQTs7Ozs7OztBQU1BLFdBQUsyQixLQUFMLEdBQWFBLEtBQUssSUFBSSxLQUFLM0IsS0FBM0I7QUFFQTs7Ozs7QUFJQSxXQUFLc0IsS0FBTCxHQUFhQSxLQUFiO0FBRUE7Ozs7OztBQUtBLFdBQUtzRCxpQkFBTCxHQUF5QixLQUF6QjtBQUVBOzs7Ozs7QUFLQSxXQUFLQyxZQUFMLEdBQW9CLEtBQXBCO0FBRUE7Ozs7O0FBSUEsV0FBS0YsUUFBTCxHQUFnQixLQUFoQjtBQUVBOzs7Ozs7QUFLQSxXQUFLckUsRUFBTCxHQUFVLDBCQUFjLElBQWQsRUFBb0IsS0FBS3FCLEtBQXpCLEVBQWdDO0FBQ3hDcEIsaUJBQVMsRUFBRVIsZUFBSVosSUFEeUI7QUFFeENzQixnQkFBUSxFQUFFLENBQUMsQ0FGNkI7QUFHeEMsc0JBQWMsS0FBS1QsS0FIcUI7QUFJeEMsc0JBQWMsS0FBS3NCO0FBSnFCLE9BQWhDLENBQVY7QUFPQTs7Ozs7O0FBS0EsV0FBS2QsUUFBTCxHQUFnQiwwQkFBYyxRQUFkLEVBQXdCLEVBQXhCLEVBQTRCO0FBQzFDUixhQUFLLEVBQUUsS0FBS0EsS0FEOEI7QUFFMUMyQixhQUFLLEVBQUUsS0FBS0E7QUFGOEIsT0FBNUIsQ0FBaEI7QUFLQSxXQUFLYixVQUFMLENBQWdCVCxRQUFoQixFQUEwQnNFLFFBQTFCO0FBQ0Q7QUFFRDs7Ozs7Ozs7V0FJQTdELFUsR0FBQSxvQkFBV1QsUUFBWCxFQUFxQnNFLFFBQXJCLEVBQStCO0FBQzdCLFVBQUlBLFFBQUosRUFBYztBQUNaLGFBQUsvQixNQUFMO0FBQ0Q7O0FBRUQsVUFBSXZDLFFBQUosRUFBYztBQUNaLGFBQUswQixPQUFMO0FBQ0Q7QUFDRjtBQUVEOzs7Ozs7V0FJQStDLFcsR0FBQSx1QkFBYztBQUNaLFdBQUt0RSxRQUFMLENBQWNILFFBQWQsR0FBeUIsSUFBekI7QUFDQSxnQ0FBUyxLQUFLQyxFQUFkLEVBQWtCUCxlQUFJSCxRQUF0QjtBQUNEO0FBRUQ7Ozs7OztXQUlBbUYsVSxHQUFBLHNCQUFhO0FBQ1gsV0FBS3ZFLFFBQUwsQ0FBY0gsUUFBZCxHQUF5QixLQUF6QjtBQUNBLG1DQUFZLEtBQUtDLEVBQWpCLEVBQXFCUCxlQUFJSCxRQUF6QjtBQUNEO0FBRUQ7Ozs7OztXQUlBb0YsZ0IsR0FBQSw0QkFBbUI7QUFDakIsV0FBS0osaUJBQUwsR0FBeUIsSUFBekI7QUFDQSxXQUFLRSxXQUFMO0FBQ0Q7QUFFRDs7Ozs7O1dBSUFHLGUsR0FBQSwyQkFBa0I7QUFDaEIsV0FBS0wsaUJBQUwsR0FBeUIsS0FBekI7O0FBQ0EsVUFBSSxDQUFDLEtBQUtyQyxVQUFMLEVBQUwsRUFBd0I7QUFDdEIsYUFBS3dDLFVBQUw7QUFDRDtBQUNGO0FBRUQ7Ozs7OztXQUlBaEQsTyxHQUFBLG1CQUFVO0FBQ1IsV0FBSzhDLFlBQUwsR0FBb0IsSUFBcEI7QUFDQSxXQUFLQyxXQUFMO0FBQ0Q7QUFFRDs7Ozs7O1dBSUFuQyxNLEdBQUEsa0JBQVM7QUFDUCxXQUFLa0MsWUFBTCxHQUFvQixLQUFwQjs7QUFDQSxVQUFJLENBQUMsS0FBS3RDLFVBQUwsRUFBTCxFQUF3QjtBQUN0QixhQUFLd0MsVUFBTDtBQUNEO0FBQ0Y7QUFFRDs7Ozs7O1dBSUFuQyxNLEdBQUEsa0JBQVM7QUFDUCxVQUFJLENBQUMsS0FBS0wsVUFBTCxFQUFMLEVBQXdCO0FBQ3RCLGFBQUtvQyxRQUFMLEdBQWdCLEtBQUtuRSxRQUFMLENBQWNtRSxRQUFkLEdBQXlCLElBQXpDO0FBQ0Esa0NBQVMsS0FBS3JFLEVBQWQsRUFBa0JQLGVBQUlGLFFBQXRCO0FBQ0Q7QUFDRjtBQUVEOzs7Ozs7V0FJQWlDLFEsR0FBQSxvQkFBVztBQUNULFdBQUs2QyxRQUFMLEdBQWdCLEtBQUtuRSxRQUFMLENBQWNtRSxRQUFkLEdBQXlCLEtBQXpDO0FBQ0EsbUNBQVksS0FBS3JFLEVBQWpCLEVBQXFCUCxlQUFJRixRQUF6QjtBQUNEO0FBRUQ7Ozs7OztXQUlBMkMsUyxHQUFBLHFCQUFZO0FBQ1YsVUFBSSxDQUFDLEtBQUtELFVBQUwsRUFBTCxFQUF3QjtBQUN0QixrQ0FBUyxLQUFLakMsRUFBZCxFQUFrQlAsZUFBSUQsU0FBdEI7QUFDQSxhQUFLUSxFQUFMLENBQVFpRSxLQUFSO0FBQ0Q7QUFDRjtBQUVEOzs7Ozs7V0FJQTdCLFcsR0FBQSx1QkFBYztBQUNaLG1DQUFZLEtBQUtwQyxFQUFqQixFQUFxQlAsZUFBSUQsU0FBekI7QUFDQSxXQUFLUSxFQUFMLENBQVE0RSxJQUFSO0FBQ0Q7QUFFRDs7Ozs7O1dBSUEzQixRLEdBQUEsb0JBQVc7QUFDVCxhQUFPLEtBQUt2RCxLQUFaO0FBQ0Q7QUFFRDs7Ozs7O1dBSUEwRSxRLEdBQUEsb0JBQVc7QUFDVCxhQUFPLEtBQUsvQyxLQUFaO0FBQ0Q7QUFFRDs7Ozs7O1dBSUEyQixRLEdBQUEsb0JBQVc7QUFDVCxhQUFPLEtBQUtoQyxLQUFaO0FBQ0Q7QUFFRDs7Ozs7O1dBSUFPLFUsR0FBQSxzQkFBYTtBQUNYLGFBQU8sS0FBSzhDLFFBQVo7QUFDRDtBQUVEOzs7Ozs7O1dBS0FwQyxVLEdBQUEsc0JBQWE7QUFDWCxhQUFPLEtBQUtzQyxZQUFMLElBQXFCLEtBQUtELGlCQUFqQztBQUNEO0FBRUQ7Ozs7Ozs7O1dBTUFsRCxpQixHQUFBLDJCQUFrQm9DLFNBQWxCLEVBQTZCcUIsZUFBN0IsRUFBOEM7QUFDNUNyQixlQUFTLENBQUNDLFdBQVYsQ0FBc0IsS0FBS3pELEVBQTNCO0FBQ0E2RSxxQkFBZSxDQUFDcEIsV0FBaEIsQ0FBNEIsS0FBS3ZELFFBQWpDO0FBQ0Q7QUFFRDs7Ozs7O1dBSUF3RCxPLEdBQUEsbUJBQVU7QUFDUixxQ0FBYyxLQUFLMUQsRUFBbkI7QUFDQSxxQ0FBYyxLQUFLRSxRQUFuQjtBQUNBLFdBQUtGLEVBQUwsR0FBVSxLQUFLRSxRQUFMLEdBQWdCLElBQTFCO0FBQ0QsSzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOVBIOzs7Ozs7TUFNcUJhLFM7OztBQUNuQjs7Ozs7Ozs7O0FBU0EsNkJBQTJFO0FBQUEsNEJBQTdETSxLQUE2RDtBQUFBLFVBQTdEQSxLQUE2RCwyQkFBckQsRUFBcUQ7QUFBQSxVQUFqRHZCLElBQWlELFFBQWpEQSxJQUFpRDtBQUFBLCtCQUEzQ0MsUUFBMkM7QUFBQSxVQUEzQ0EsUUFBMkMsOEJBQWhDLEtBQWdDO0FBQUEsVUFBekJpQixLQUF5QixRQUF6QkEsS0FBeUI7QUFBQSxVQUFsQkosY0FBa0IsUUFBbEJBLGNBQWtCOztBQUN6RTs7OztBQUlBLFdBQUtaLEVBQUwsR0FBVSwwQkFBYyxJQUFkLEVBQW9CLEVBQXBCLEVBQXdCO0FBQUUsNEJBQW9CWTtBQUF0QixPQUF4QixDQUFWO0FBRUE7Ozs7O0FBSUEsV0FBS2tFLE9BQUwsR0FBZSwwQkFBYyxNQUFkLEVBQXNCekQsS0FBdEIsRUFBNkI7QUFBRXBCLGlCQUFTLEVBQUVSLGVBQUlWO0FBQWpCLE9BQTdCLEVBQWtFLEtBQUtpQixFQUF2RSxDQUFmO0FBRUE7Ozs7O0FBSUEsV0FBSytFLGVBQUwsR0FBdUIsMEJBQWMsSUFBZCxFQUFvQixFQUFwQixFQUF3QjtBQUFFOUUsaUJBQVMsRUFBRVIsZUFBSVg7QUFBakIsT0FBeEIsRUFBdUQsS0FBS2tCLEVBQTVELENBQXZCO0FBRUE7Ozs7O0FBSUEsV0FBS0UsUUFBTCxHQUFnQiwwQkFBYyxVQUFkLEVBQTBCbUIsS0FBMUIsQ0FBaEI7QUFFQTs7Ozs7QUFJQSxXQUFLakIsS0FBTCxHQUFhLEtBQUs0RSxXQUFMLENBQWlCbEYsSUFBakIsRUFBdUJrQixLQUF2QixDQUFiO0FBRUE7Ozs7O0FBSUEsV0FBS0EsS0FBTCxHQUFhSixjQUFiO0FBRUE7Ozs7O0FBSUEsV0FBS1MsS0FBTCxHQUFhQSxLQUFiO0FBRUE7Ozs7OztBQUtBLFdBQUt0QixRQUFMLEdBQWdCLEtBQWhCO0FBRUEsV0FBS1MsVUFBTCxDQUFnQlQsUUFBaEI7QUFDRDtBQUVEOzs7Ozs7Ozs7V0FLQWlGLFcsR0FBQSxxQkFBWWxGLElBQVosRUFBa0JrQixLQUFsQixFQUF5QjtBQUFBOztBQUN2QixhQUFPbEIsSUFBSSxDQUFDbUYsR0FBTCxDQUFTLFVBQUNuRSxLQUFELEVBQVFILFNBQVIsRUFBc0I7QUFDcEMsWUFBTUQsSUFBSSxHQUFHLElBQUlRLGdCQUFKO0FBQVdGLGVBQUssRUFBRUEsS0FBSyxHQUFHTDtBQUExQixXQUF3Q0csS0FBeEMsRUFBYjtBQUNBSixZQUFJLENBQUNVLGlCQUFMLENBQXVCLEtBQUksQ0FBQzJELGVBQTVCLEVBQTZDLEtBQUksQ0FBQzdFLFFBQWxEO0FBRUEsZUFBT1EsSUFBUDtBQUNELE9BTE0sQ0FBUDtBQU1EO0FBRUQ7Ozs7OztXQUlBRixVLEdBQUEsb0JBQVdULFFBQVgsRUFBcUI7QUFDbkIsVUFBSUEsUUFBSixFQUFjO0FBQ1osYUFBSzBCLE9BQUw7QUFDRDtBQUNGO0FBRUQ7Ozs7OztXQUlBQSxPLEdBQUEsbUJBQVU7QUFDUixXQUFLMUIsUUFBTCxHQUFnQixLQUFLRyxRQUFMLENBQWNILFFBQWQsR0FBeUIsSUFBekM7QUFDQSxnQ0FBUyxLQUFLK0UsT0FBZCxFQUF1QnJGLGVBQUlILFFBQTNCO0FBQ0EsV0FBS2MsS0FBTCxDQUFXUyxPQUFYLENBQW1CLFVBQUFILElBQUk7QUFBQSxlQUFJQSxJQUFJLENBQUNnRSxnQkFBTCxFQUFKO0FBQUEsT0FBdkI7QUFDRDtBQUVEOzs7Ozs7V0FJQXJDLE0sR0FBQSxrQkFBUztBQUNQLFdBQUt0QyxRQUFMLEdBQWdCLEtBQUtHLFFBQUwsQ0FBY0gsUUFBZCxHQUF5QixLQUF6QztBQUNBLG1DQUFZLEtBQUsrRSxPQUFqQixFQUEwQnJGLGVBQUlILFFBQTlCO0FBQ0EsV0FBS2MsS0FBTCxDQUFXUyxPQUFYLENBQW1CLFVBQUFILElBQUk7QUFBQSxlQUFJQSxJQUFJLENBQUNpRSxlQUFMLEVBQUo7QUFBQSxPQUF2QjtBQUNEO0FBRUQ7Ozs7Ozs7Ozs7V0FRQTlDLFEsR0FBQSxvQkFBVztBQUNULGFBQU8sS0FBS3pCLEtBQVo7QUFDRDtBQUVEOzs7Ozs7V0FJQTRDLFEsR0FBQSxvQkFBVztBQUNULGFBQU8sS0FBS2hDLEtBQVo7QUFDRDtBQUVEOzs7Ozs7V0FJQW9ELFEsR0FBQSxvQkFBVztBQUNULGFBQU8sS0FBSy9DLEtBQVo7QUFDRDtBQUVEOzs7Ozs7V0FJQVksVSxHQUFBLHNCQUFhO0FBQ1gsYUFBTyxLQUFLbEMsUUFBWjtBQUNEO0FBRUQ7Ozs7Ozs7O1dBTUFxQixpQixHQUFBLDJCQUFrQm9DLFNBQWxCLEVBQTZCcUIsZUFBN0IsRUFBOEM7QUFDNUNyQixlQUFTLENBQUNDLFdBQVYsQ0FBc0IsS0FBS3pELEVBQTNCO0FBQ0E2RSxxQkFBZSxDQUFDcEIsV0FBaEIsQ0FBNEIsS0FBS3ZELFFBQWpDO0FBQ0Q7QUFFRDs7Ozs7O1dBSUF3RCxPLEdBQUEsbUJBQVU7QUFDUixXQUFLdEQsS0FBTCxDQUFXUyxPQUFYLENBQW1CLFVBQUFILElBQUk7QUFBQSxlQUFJQSxJQUFJLENBQUNnRCxPQUFMLEVBQUo7QUFBQSxPQUF2QjtBQUNBLHFDQUFjLEtBQUsxRCxFQUFuQjtBQUNBLHFDQUFjLEtBQUtFLFFBQW5CO0FBQ0EsV0FBS0YsRUFBTCxHQUFVLEtBQUs4RSxPQUFMLEdBQWUsS0FBS0MsZUFBTCxHQUF1QixLQUFLN0UsUUFBTCxHQUFnQixLQUFLRSxLQUFMLEdBQWEsSUFBN0U7QUFDRCxLOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyTEg7Ozs7QUFLQSxNQUFNOEUsVUFBVSxHQUFHO0FBQ2pCLFFBQUksU0FEYTtBQUVqQixRQUFJLFdBRmE7QUFHakIsUUFBSSxPQUhhO0FBSWpCLFFBQUksT0FKYTtBQUtqQixRQUFJLFFBTGE7QUFNakIsUUFBSTtBQU5hLEdBQW5CO0FBU0EsTUFBTUMsTUFBTSxHQUFHO0FBQ2JDLFdBQU8sRUFBRSxTQURJO0FBRWJDLE1BQUUsRUFBRSxTQUZTO0FBR2JDLGFBQVMsRUFBRSxXQUhFO0FBSWJDLFFBQUksRUFBRSxXQUpPO0FBS2IsU0FBSyxPQUxRO0FBTWJDLFlBQVEsRUFBRSxPQU5HO0FBT2JDLFNBQUssRUFBRSxPQVBNO0FBUWJDLFVBQU0sRUFBRSxRQVJLO0FBU2JDLE9BQUcsRUFBRSxRQVRRO0FBVWJDLE9BQUcsRUFBRTtBQVZRLEdBQWY7QUFhQTs7Ozs7O0FBS08sTUFBTUMsV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQUMsRUFBRSxFQUFJO0FBQUEsUUFDdkJuRyxHQUR1QixHQUNObUcsRUFETSxDQUN2Qm5HLEdBRHVCO0FBQUEsUUFDbEJvRyxPQURrQixHQUNORCxFQURNLENBQ2xCQyxPQURrQjs7QUFHL0IsUUFBSXBHLEdBQUosRUFBUztBQUNQLGFBQU93RixNQUFNLENBQUN4RixHQUFELENBQU4sSUFBZUEsR0FBdEI7QUFDRDs7QUFFRCxXQUFPdUYsVUFBVSxDQUFDYSxPQUFELENBQVYsSUFBdUJBLE9BQTlCO0FBQ0QsR0FSTTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaENQOzs7OztBQXlCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BbUJNcEMsUzs7O0FBQ0osdUJBQ0VILFNBREYsUUFZRTtBQUFBLFVBVEUxRCxJQVNGLFFBVEVBLElBU0Y7QUFBQSxrQ0FSRUQsV0FRRjtBQUFBLFVBUkVBLFdBUUYsaUNBUmdCLEVBUWhCO0FBQUEsK0JBUEVFLFFBT0Y7QUFBQSxVQVBFQSxRQU9GLDhCQVBhLEtBT2I7QUFBQSxnQ0FORWlHLFNBTUY7QUFBQSxVQU5FQSxTQU1GLCtCQU5jLEtBTWQ7QUFBQSxnQ0FMRUMsU0FLRjtBQUFBLFVBTEVBLFNBS0YsK0JBTGMsSUFLZDtBQUFBLCtCQUpFcEMsUUFJRjtBQUFBLFVBSkVBLFFBSUYsOEJBSmEsSUFJYjtBQUFBLFVBSEVxQyxLQUdGLFFBSEVBLEtBR0Y7QUFBQSxzQ0FGRUMsZUFFRjtBQUFBLFVBRkVBLGVBRUYscUNBRm9CLElBRXBCOztBQUNBOzs7O0FBSUEsV0FBS25HLEVBQUwsR0FBVSwwQkFBYyxLQUFkLEVBQXFCLEVBQXJCLEVBQXlCO0FBQUVDLGlCQUFTLEVBQUVSLGVBQUliO0FBQWpCLE9BQXpCLENBQVY7QUFFQTs7Ozs7QUFJQSxXQUFLd0gsS0FBTCxHQUFhLElBQUl4QyxpQkFBSixDQUFVO0FBQUUvRCxtQkFBVyxFQUFYQSxXQUFGO0FBQWVFLGdCQUFRLEVBQVJBLFFBQWY7QUFBeUI4RCxnQkFBUSxFQUFSQTtBQUF6QixPQUFWLENBQWI7QUFFQTs7Ozs7QUFJQSxXQUFLd0MsUUFBTCxHQUFnQixJQUFJekcsb0JBQUosQ0FBYTtBQUFFQyxtQkFBVyxFQUFYQSxXQUFGO0FBQWVFLGdCQUFRLEVBQVJBLFFBQWY7QUFBeUJELFlBQUksRUFBSkE7QUFBekIsT0FBYixDQUFoQjtBQUVBOzs7OztBQUlBLFdBQUt3RyxNQUFMLEdBQWMsS0FBZDtBQUVBOzs7OztBQUlBLFdBQUtDLE9BQUwsR0FBZSxLQUFmO0FBRUE7Ozs7QUFHQSxXQUFLTixTQUFMLEdBQWlCQSxTQUFqQjtBQUVBOzs7OztBQUlBLFdBQUtDLEtBQUwsR0FBYSwwQkFBU0EsS0FBVCxJQUFrQixJQUFJTSxpQkFBSixDQUFVTixLQUFWLEVBQWlCMUMsU0FBakIsQ0FBbEIsR0FBZ0QsSUFBN0Q7QUFFQSxXQUFLaEQsVUFBTCxDQUFnQjtBQUFFWCxtQkFBVyxFQUFYQSxXQUFGO0FBQWVFLGdCQUFRLEVBQVJBO0FBQWYsT0FBaEI7QUFDQSxXQUFLcUIsaUJBQUwsQ0FBdUJvQyxTQUF2Qjs7QUFFQSxVQUFJd0MsU0FBSixFQUFlO0FBQ2IsYUFBS0ksS0FBTCxDQUFXbkMsS0FBWDtBQUNEOztBQUVELFVBQUlrQyxlQUFKLEVBQXFCO0FBQ25CLHNDQUFhLFlBQWIsRUFBMkIsZ0JBQTNCO0FBQ0Q7QUFDRjtBQUVEOzs7Ozs7Ozs7V0FLQS9FLGlCLEdBQUEsMkJBQWtCb0MsU0FBbEIsRUFBNkI7QUFDM0IsVUFBTWlELFdBQVcsR0FBRyw0QkFBV2pELFNBQVgsSUFBd0JBLFNBQXhCLEdBQW9Da0QsUUFBUSxDQUFDQyxhQUFULENBQXVCbkQsU0FBdkIsQ0FBeEQ7QUFDQWlELGlCQUFXLENBQUNoRCxXQUFaLENBQXdCLEtBQUt6RCxFQUE3QjtBQUNEO0FBRUQ7Ozs7Ozs7V0FLQVEsVSxHQUFBLG9CQUFXb0csT0FBWCxFQUFvQjtBQUNsQixVQUFNdEcsWUFBWSxHQUFHLEtBQUtpRCxlQUFMLEVBQXJCOztBQUNBLFVBQUlqRCxZQUFKLEVBQWtCO0FBQ2hCLGFBQUs4RixLQUFMLENBQVdsQyxVQUFYLENBQXNCNUQsWUFBdEI7QUFDRCxPQUZELE1BRU8sSUFBSSxDQUFDc0csT0FBTyxDQUFDL0csV0FBYixFQUEwQjtBQUMvQixhQUFLeUMsTUFBTCxDQUFZLENBQVo7QUFDRDs7QUFFRCxVQUFJc0UsT0FBTyxDQUFDN0csUUFBWixFQUFzQjtBQUNwQixhQUFLMEIsT0FBTDtBQUNEOztBQUVELFdBQUtvRixVQUFMO0FBRUEsV0FBS1QsS0FBTCxDQUFXaEYsaUJBQVgsQ0FBNkIsS0FBS3BCLEVBQWxDO0FBQ0EsV0FBS3FHLFFBQUwsQ0FBY2pGLGlCQUFkLENBQWdDLEtBQUtwQixFQUFyQztBQUNEO0FBRUQ7Ozs7OztXQUlBNkcsVSxHQUFBLHNCQUFhO0FBQUE7O0FBQ1gsMEJBQ0VILFFBREYsRUFFRSxPQUZGLEVBR0UsVUFBQVosRUFBRSxFQUFJO0FBQ0osWUFBTWdCLE1BQU0sR0FBRywyQkFBVWhCLEVBQVYsQ0FBZjs7QUFDQSxZQUFJLENBQUMseUJBQVFnQixNQUFSLFFBQW9CckgsZUFBSWIsVUFBeEIsQ0FBRCxJQUEwQyxLQUFJLENBQUMwSCxNQUFuRCxFQUEyRDtBQUN6RCxlQUFJLENBQUNuRSxLQUFMO0FBQ0Q7QUFDRixPQVJILEVBU0UsSUFURjtBQVdBLDBCQUFHLEtBQUtuQyxFQUFSLEVBQVksT0FBWixFQUFxQixVQUFBOEYsRUFBRTtBQUFBLGVBQUksS0FBSSxDQUFDaUIsV0FBTCxDQUFpQmpCLEVBQWpCLEVBQXFCckcsY0FBckIsQ0FBSjtBQUFBLE9BQXZCO0FBQ0EsMEJBQUcsS0FBS08sRUFBUixFQUFZLFdBQVosRUFBeUIsVUFBQThGLEVBQUU7QUFBQSxlQUFJLEtBQUksQ0FBQ2tCLGVBQUwsQ0FBcUJsQixFQUFyQixFQUF5QnJHLGNBQXpCLENBQUo7QUFBQSxPQUEzQjtBQUNBLDBCQUFHLEtBQUtPLEVBQVIsRUFBWSxTQUFaLEVBQXVCLFVBQUE4RixFQUFFO0FBQUEsZUFBSSxLQUFJLENBQUNtQixhQUFMLENBQW1CbkIsRUFBbkIsRUFBdUJyRyxjQUF2QixDQUFKO0FBQUEsT0FBekI7QUFDRDtBQUVEOzs7Ozs7V0FJQXlILFksR0FBQSx3QkFBZTtBQUNiLDJCQUFJUixRQUFKLEVBQWMsT0FBZDtBQUNBLDJCQUFJLEtBQUsxRyxFQUFULEVBQWEseUJBQWI7QUFDRDtBQUVEOzs7Ozs7OztXQU1BK0csVyxHQUFBLHFCQUFZakIsRUFBWixTQUFpQztBQUFBLFVBQWY3RyxLQUFlLFNBQWZBLEtBQWU7QUFBQSxVQUFSSixJQUFRLFNBQVJBLElBQVE7QUFDL0IsVUFBTWlJLE1BQU0sR0FBRywyQkFBVWhCLEVBQVYsQ0FBZjtBQUNBLFVBQU1xQixNQUFNLEdBQUcseUJBQVFMLE1BQVIsUUFBb0JqSSxJQUFwQixDQUFmOztBQUVBLFVBQUlzSSxNQUFKLEVBQVk7QUFDVixhQUFLN0UsTUFBTCxDQUFZNkUsTUFBTSxDQUFDQyxZQUFQLENBQW9CLFlBQXBCLENBQVo7QUFDRCxPQUZELE1BRU8sSUFBSSx5QkFBUU4sTUFBUixRQUFvQjdILEtBQXBCLENBQUosRUFBa0M7QUFDdkMsYUFBS29JLE1BQUw7QUFDRDtBQUNGO0FBRUQ7Ozs7Ozs7O1dBTUFMLGUsR0FBQSx5QkFBZ0JsQixFQUFoQixTQUE4QjtBQUFBLFVBQVJqSCxJQUFRLFNBQVJBLElBQVE7O0FBQzVCLFVBQUksS0FBS3lJLGNBQUwsQ0FBb0J4QixFQUFFLENBQUN5QixPQUF2QixFQUFnQ3pCLEVBQUUsQ0FBQzBCLE9BQW5DLENBQUosRUFBaUQ7QUFDL0MsWUFBTVYsTUFBTSxHQUFHLDJCQUFVaEIsRUFBVixDQUFmO0FBQ0EsWUFBTXFCLE1BQU0sR0FBRyx5QkFBUUwsTUFBUixRQUFvQmpJLElBQXBCLENBQWY7O0FBRUEsWUFBSXNJLE1BQUosRUFBWTtBQUNWLGVBQUtkLFFBQUwsQ0FBY25FLFNBQWQsQ0FBd0JpRixNQUFNLENBQUNDLFlBQVAsQ0FBb0IsWUFBcEIsQ0FBeEI7QUFDRDtBQUNGO0FBQ0Y7QUFFRDs7Ozs7Ozs7O1dBT0FFLGMsR0FBQSx3QkFBZUcsQ0FBZixFQUFrQkMsQ0FBbEIsRUFBcUI7QUFDbkIsVUFBSSxLQUFLQyxLQUFMLEtBQWVGLENBQWYsSUFBb0IsS0FBS0csS0FBTCxLQUFlRixDQUF2QyxFQUEwQztBQUN4QyxhQUFLQyxLQUFMLEdBQWFGLENBQWI7QUFDQSxhQUFLRyxLQUFMLEdBQWFGLENBQWI7QUFFQSxlQUFPLElBQVA7QUFDRDs7QUFFRCxhQUFPLEtBQVA7QUFDRDtBQUVEOzs7Ozs7OztXQU1BVCxhLEdBQUEsdUJBQWNuQixFQUFkLEVBQWtCbkgsVUFBbEIsRUFBOEI7QUFDNUIsVUFBTWdCLEdBQUcsR0FBRyxnQ0FBWW1HLEVBQVosQ0FBWjtBQUNBLFVBQU0rQixTQUFTLEdBQUcsQ0FBQyxLQUFELEVBQVEsUUFBUixDQUFsQjtBQUNBLFVBQU1DLFVBQVUsR0FBRyxDQUFDLFNBQUQsRUFBWSxXQUFaLEVBQXlCLE9BQXpCLEVBQWtDLE9BQWxDLENBQW5COztBQUVBLFVBQUlELFNBQVMsQ0FBQ2xGLE9BQVYsQ0FBa0JoRCxHQUFsQixJQUF5QixDQUFDLENBQTFCLElBQStCLEtBQUsyRyxNQUF4QyxFQUFnRDtBQUM5QyxhQUFLbkUsS0FBTDs7QUFDQSxZQUFJeEMsR0FBRyxLQUFLLFFBQVosRUFBc0I7QUFDcEIsZUFBS3lHLEtBQUwsQ0FBV25DLEtBQVg7QUFDRDtBQUNGLE9BTEQsTUFLTyxJQUFJNkQsVUFBVSxDQUFDbkYsT0FBWCxDQUFtQmhELEdBQW5CLElBQTBCLENBQUMsQ0FBL0IsRUFBa0M7QUFDdkMsd0NBQWVtRyxFQUFmO0FBQ0EsYUFBS2lDLGVBQUwsQ0FBcUJqQyxFQUFyQixFQUF5Qm5HLEdBQXpCLEVBQThCaEIsVUFBOUI7QUFDRDtBQUNGO0FBRUQ7Ozs7Ozs7OztXQU9Bb0osZSxHQUFBLHlCQUFnQmpDLEVBQWhCLEVBQW9CbkcsR0FBcEIsU0FBMEM7QUFBQSxVQUFmZCxJQUFlLFNBQWZBLElBQWU7QUFBQSxVQUFUSSxLQUFTLFNBQVRBLEtBQVM7QUFDeEMsVUFBTTZILE1BQU0sR0FBRywyQkFBVWhCLEVBQVYsQ0FBZjtBQUNBLFVBQU1xQixNQUFNLEdBQUcseUJBQVFMLE1BQVIsUUFBb0JqSSxJQUFwQixDQUFmOztBQUVBLFVBQUljLEdBQUcsS0FBSyxRQUFSLElBQW9CLEtBQUsyRyxNQUE3QixFQUFxQztBQUNuQyxhQUFLbkUsS0FBTDtBQUNBLGFBQUtpRSxLQUFMLENBQVduQyxLQUFYO0FBQ0QsT0FIRCxNQUdPLElBQUlrRCxNQUFKLEVBQVk7QUFDakIsYUFBS2EsY0FBTCxDQUFvQnJJLEdBQXBCLEVBQXlCd0gsTUFBekI7QUFDRCxPQUZNLE1BRUEsSUFBSSx5QkFBUUwsTUFBUixRQUFvQjdILEtBQXBCLENBQUosRUFBa0M7QUFDdkMsYUFBS2dKLGVBQUwsQ0FBcUJ0SSxHQUFyQjtBQUNEO0FBQ0Y7QUFFRDs7Ozs7OztXQUtBc0ksZSxHQUFBLHlCQUFnQnRJLEdBQWhCLEVBQXFCO0FBQ25CLFVBQUksQ0FBQyxLQUFLMkcsTUFBVixFQUFrQjtBQUNoQixhQUFLdEUsSUFBTDtBQUNELE9BRkQsTUFFTyxJQUFJckMsR0FBRyxLQUFLLFNBQVIsSUFBcUJBLEdBQUcsS0FBSyxXQUFqQyxFQUE4QztBQUNuRCxhQUFLMEcsUUFBTCxDQUFjN0QsbUJBQWQsQ0FBa0M3QyxHQUFHLEtBQUssU0FBUixHQUFvQixDQUFDLENBQXJCLEdBQXlCLENBQTNEO0FBQ0Q7QUFDRjtBQUVEOzs7Ozs7OztXQU1BcUksYyxHQUFBLHdCQUFlckksR0FBZixFQUFvQndILE1BQXBCLEVBQTRCO0FBQzFCLFVBQUl4SCxHQUFHLEtBQUssT0FBUixJQUFtQkEsR0FBRyxLQUFLLE9BQS9CLEVBQXdDO0FBQ3RDLGFBQUt1SSxlQUFMLENBQXFCZixNQUFyQjtBQUNELE9BRkQsTUFFTyxJQUFJeEgsR0FBRyxLQUFLLFNBQVIsSUFBcUJBLEdBQUcsS0FBSyxXQUFqQyxFQUE4QztBQUNuRCxhQUFLMEcsUUFBTCxDQUFjN0QsbUJBQWQsQ0FBa0M3QyxHQUFHLEtBQUssU0FBUixHQUFvQixDQUFDLENBQXJCLEdBQXlCLENBQTNEO0FBQ0Q7QUFDRjtBQUVEOzs7Ozs7O1dBS0F1SSxlLEdBQUEseUJBQWdCZixNQUFoQixFQUF3QjtBQUN0QixXQUFLN0UsTUFBTCxDQUFZNkUsTUFBTSxDQUFDQyxZQUFQLENBQW9CLFlBQXBCLENBQVo7QUFDQSxXQUFLakYsS0FBTDtBQUNBLFdBQUtpRSxLQUFMLENBQVduQyxLQUFYO0FBQ0Q7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O1dBYUF4QyxPLEdBQUEsaUJBQVEvQixLQUFSLEVBQWU7QUFDYixVQUFJLENBQUMsMEJBQVNBLEtBQVQsQ0FBTCxFQUFzQjtBQUNwQixhQUFLSyxRQUFMLEdBQWdCLElBQWhCO0FBQ0EsYUFBS3FHLEtBQUwsQ0FBVzNFLE9BQVg7QUFDQSxhQUFLNEUsUUFBTCxDQUFjNUUsT0FBZDtBQUVBOzs7Ozs7Ozs7Ozs7QUFXQSxhQUFLMEcsSUFBTCxDQUFVLFNBQVYsRUFBcUI7QUFBRUMsY0FBSSxFQUFFLFNBQVI7QUFBbUJ0QixnQkFBTSxFQUFFO0FBQTNCLFNBQXJCO0FBQ0QsT0FqQkQsTUFpQk8sSUFBSXBILEtBQUssWUFBWXdCLGdCQUFqQixJQUF5QnhCLEtBQUssWUFBWXFCLHFCQUE5QyxFQUF5RDtBQUM5RHJCLGFBQUssQ0FBQytCLE9BQU47QUFDQSxhQUFLMEcsSUFBTCxDQUFVLFNBQVYsRUFBcUI7QUFBRUMsY0FBSSxFQUFFLFNBQVI7QUFBbUJ0QixnQkFBTSxFQUFFcEg7QUFBM0IsU0FBckI7QUFDRCxPQUhNLE1BR0E7QUFDTCxZQUFNMkksWUFBWSxHQUFHLEtBQUtoQyxRQUFMLENBQWM5RCxPQUFkLENBQXNCN0MsS0FBdEIsQ0FBckI7O0FBQ0EsWUFBSTJJLFlBQUosRUFBa0I7QUFDaEJBLHNCQUFZLENBQUM1RyxPQUFiO0FBQ0EsZUFBSzBHLElBQUwsQ0FBVSxTQUFWLEVBQXFCO0FBQUVDLGdCQUFJLEVBQUUsU0FBUjtBQUFtQnRCLGtCQUFNLEVBQUV1QjtBQUEzQixXQUFyQjtBQUNEO0FBQ0Y7QUFDRjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7V0FhQWhHLE0sR0FBQSxnQkFBTzNDLEtBQVAsRUFBYztBQUNaLFVBQUksQ0FBQywwQkFBU0EsS0FBVCxDQUFMLEVBQXNCO0FBQ3BCLGFBQUtLLFFBQUwsR0FBZ0IsS0FBaEI7QUFDQSxhQUFLcUcsS0FBTCxDQUFXL0QsTUFBWDtBQUNBLGFBQUtnRSxRQUFMLENBQWNoRSxNQUFkO0FBRUE7Ozs7Ozs7Ozs7OztBQVdBLGFBQUs4RixJQUFMLENBQVUsUUFBVixFQUFvQjtBQUFFQyxjQUFJLEVBQUUsUUFBUjtBQUFrQnRCLGdCQUFNLEVBQUU7QUFBMUIsU0FBcEI7QUFDRCxPQWpCRCxNQWlCTyxJQUFJcEgsS0FBSyxZQUFZd0IsZ0JBQWpCLElBQXlCeEIsS0FBSyxZQUFZcUIscUJBQTlDLEVBQXlEO0FBQzlEckIsYUFBSyxDQUFDMkMsTUFBTjtBQUNBLGFBQUs4RixJQUFMLENBQVUsUUFBVixFQUFvQjtBQUFFQyxjQUFJLEVBQUUsUUFBUjtBQUFrQnRCLGdCQUFNLEVBQUVwSDtBQUExQixTQUFwQjtBQUNELE9BSE0sTUFHQTtBQUNMLFlBQU0ySSxZQUFZLEdBQUcsS0FBS2hDLFFBQUwsQ0FBYzlELE9BQWQsQ0FBc0I3QyxLQUF0QixDQUFyQjs7QUFDQSxZQUFJMkksWUFBSixFQUFrQjtBQUNoQkEsc0JBQVksQ0FBQ2hHLE1BQWI7QUFDQSxlQUFLOEYsSUFBTCxDQUFVLFFBQVYsRUFBb0I7QUFBRUMsZ0JBQUksRUFBRSxRQUFSO0FBQWtCdEIsa0JBQU0sRUFBRXVCO0FBQTFCLFdBQXBCO0FBQ0Q7QUFDRjtBQUNGO0FBRUQ7Ozs7Ozs7V0FLQXJHLEksR0FBQSxnQkFBTztBQUNMLFVBQUksQ0FBQyxLQUFLakMsUUFBVixFQUFvQjtBQUNsQixhQUFLdUcsTUFBTCxHQUFjLElBQWQ7QUFDQSxhQUFLRCxRQUFMLENBQWNyRSxJQUFkO0FBQ0EsYUFBS29FLEtBQUwsQ0FBV3BFLElBQVg7QUFFQTs7Ozs7Ozs7OztBQVNBLGFBQUttRyxJQUFMLENBQVUsTUFBVixFQUFrQjtBQUFFQyxjQUFJLEVBQUU7QUFBUixTQUFsQjtBQUNEO0FBQ0Y7QUFFRDs7Ozs7OztXQUtBakcsSyxHQUFBLGlCQUFRO0FBQ04sV0FBS21FLE1BQUwsR0FBYyxLQUFkO0FBQ0EsV0FBS0QsUUFBTCxDQUFjbEUsS0FBZDtBQUNBLFdBQUtpRSxLQUFMLENBQVdqRSxLQUFYO0FBRUE7Ozs7Ozs7Ozs7QUFTQSxXQUFLZ0csSUFBTCxDQUFVLE9BQVYsRUFBbUI7QUFBRUMsWUFBSSxFQUFFO0FBQVIsT0FBbkI7QUFDRDtBQUVEOzs7Ozs7O1dBS0FmLE0sR0FBQSxrQkFBUztBQUNQLFVBQUksS0FBS2YsTUFBVCxFQUFpQjtBQUNmLGFBQUtuRSxLQUFMO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsYUFBS0gsSUFBTDtBQUNEO0FBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7OztXQVdBTSxNLEdBQUEsZ0JBQU81QyxLQUFQLEVBQWM7QUFDWixVQUFJWSxZQUFZLEdBQUcsSUFBbkI7QUFDQSxVQUFNZ0ksZ0JBQWdCLEdBQUcsS0FBSy9FLGVBQUwsRUFBekI7O0FBRUEsVUFBSSxDQUFDLEtBQUt4RCxRQUFWLEVBQW9CO0FBQ2xCTyxvQkFBWSxHQUFHLEtBQUsrRixRQUFMLENBQWMvRCxNQUFkLENBQXFCNUMsS0FBckIsQ0FBZjs7QUFFQSxZQUFJWSxZQUFKLEVBQWtCO0FBQ2hCLGVBQUs4RixLQUFMLENBQVdsQyxVQUFYLENBQXNCNUQsWUFBdEI7QUFFQTs7Ozs7Ozs7Ozs7OztBQVlBLGVBQUs2SCxJQUFMLENBQVUsUUFBVixFQUFvQjtBQUFFQyxnQkFBSSxFQUFFLFFBQVI7QUFBa0J0QixrQkFBTSxFQUFFeEc7QUFBMUIsV0FBcEI7O0FBRUEsY0FBSWdJLGdCQUFnQixLQUFLaEksWUFBekIsRUFBdUM7QUFDckM7Ozs7Ozs7Ozs7OztBQVlBLGlCQUFLNkgsSUFBTCxDQUFVLFFBQVYsRUFBb0I7QUFDbEJDLGtCQUFJLEVBQUUsUUFEWTtBQUVsQkcsa0JBQUksRUFBRUQsZ0JBRlk7QUFHbEJFLGtCQUFJLEVBQUVsSTtBQUhZLGFBQXBCO0FBS0Q7O0FBRUQsY0FBSSxLQUFLMkYsU0FBTCxJQUFrQixLQUFLSyxNQUEzQixFQUFtQztBQUNqQyxpQkFBS25FLEtBQUw7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQsYUFBTzdCLFlBQVA7QUFDRDtBQUVEOzs7Ozs7Ozs7V0FPQWtCLFEsR0FBQSxvQkFBVztBQUNULFVBQUksQ0FBQyxLQUFLekIsUUFBVixFQUFvQjtBQUNsQixhQUFLc0csUUFBTCxDQUFjN0UsUUFBZDtBQUNBLGFBQUs0RSxLQUFMLENBQVdsQyxVQUFYO0FBQ0Q7QUFDRjtBQUVEOzs7Ozs7V0FJQVgsZSxHQUFBLDJCQUFrQjtBQUNoQixhQUFPLEtBQUs4QyxRQUFMLENBQWM5QyxlQUFkLEVBQVA7QUFDRDtBQUVEOzs7Ozs7Ozs7Ozs7OztXQVlBMUIsUSxHQUFBLGtCQUFTSCxRQUFULEVBQW1CbUIsTUFBbkIsRUFBMkI7QUFDekIsYUFBTyxLQUFLd0QsUUFBTCxDQUFjeEUsUUFBZCxDQUF1QkgsUUFBdkIsRUFBaUNtQixNQUFqQyxDQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7OztXQVFBTixPLEdBQUEsaUJBQVE3QyxLQUFSLEVBQWU7QUFDYixhQUFPLEtBQUsyRyxRQUFMLENBQWM5RCxPQUFkLENBQXNCN0MsS0FBdEIsQ0FBUDtBQUNEO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O1dBWUF3RCxhLEdBQUEsdUJBQWN4QixRQUFkLEVBQXdCbUIsTUFBeEIsRUFBZ0M7QUFDOUIsYUFBTyxLQUFLd0QsUUFBTCxDQUFjbkQsYUFBZCxDQUE0QnhCLFFBQTVCLEVBQXNDbUIsTUFBdEMsQ0FBUDtBQUNEO0FBRUQ7Ozs7Ozs7OztXQU9BUSxZLEdBQUEsc0JBQWFyQyxLQUFiLEVBQW9CO0FBQ2xCLGFBQU8sS0FBS3FGLFFBQUwsQ0FBY2hELFlBQWQsQ0FBMkJyQyxLQUEzQixDQUFQO0FBQ0Q7QUFFRDs7Ozs7OztXQUtBMEMsTyxHQUFBLG1CQUFVO0FBQ1IsV0FBS3dELFlBQUw7QUFFQSxXQUFLZCxLQUFMLENBQVcxQyxPQUFYO0FBQ0EsV0FBSzJDLFFBQUwsQ0FBYzNDLE9BQWQ7O0FBQ0EsVUFBSSxLQUFLd0MsS0FBVCxFQUFnQjtBQUNkLGFBQUtBLEtBQUwsQ0FBV3hDLE9BQVg7QUFDRDs7QUFFRCxxQ0FBYyxLQUFLMUQsRUFBbkI7QUFDQSxXQUFLd0QsU0FBTCxHQUFpQixLQUFLeEQsRUFBTCxHQUFVLEtBQUtvRyxLQUFMLEdBQWEsS0FBS0MsUUFBTCxHQUFnQixLQUFLSCxLQUFMLEdBQWEsSUFBckU7QUFDRCxLOzs7OztBQUdIdUMsMkJBQWFDLEtBQWIsQ0FBbUIvRSxTQUFuQjs7aUJBRWVBLFM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3ckJmOzs7Ozs7TUFNcUI2QyxLOzs7QUFDbkIsbUJBQVltQyxXQUFaLEVBQXlCbkYsU0FBekIsRUFBb0M7QUFDbEMsV0FBS29GLGlCQUFMLEdBQXlCLHdCQUFZcEYsU0FBWixDQUF6QjtBQUNBLFdBQUtxRixTQUFMLEdBQWlCLEtBQUtDLFFBQUwsQ0FBYyxzQkFBVUgsV0FBVixDQUFkLENBQWpCO0FBQ0EsV0FBS0ksT0FBTCxHQUFlLEtBQUtDLGtCQUFMLEVBQWY7QUFFQXRDLGNBQVEsQ0FBQ3VDLG9CQUFULENBQThCLE1BQTlCLEVBQXNDLENBQXRDLEVBQXlDeEYsV0FBekMsQ0FBcUQsS0FBS3NGLE9BQTFEO0FBQ0Q7QUFFRDs7Ozs7Ozs7O1dBS0FDLGtCLEdBQUEsOEJBQXFCO0FBQ25CLFVBQU1ELE9BQU8sR0FBR3JDLFFBQVEsQ0FBQ3dDLGFBQVQsQ0FBdUIsT0FBdkIsQ0FBaEI7QUFDQUgsYUFBTyxDQUFDWCxJQUFSLEdBQWUsVUFBZjs7QUFFQSxVQUFJVyxPQUFPLENBQUNJLFVBQVosRUFBd0I7QUFDdEJKLGVBQU8sQ0FBQ0ksVUFBUixDQUFtQkMsT0FBbkIsR0FBNkIsS0FBS1AsU0FBbEM7QUFDRCxPQUZELE1BRU87QUFDTEUsZUFBTyxDQUFDdEYsV0FBUixDQUFvQmlELFFBQVEsQ0FBQzJDLGNBQVQsQ0FBd0IsS0FBS1IsU0FBN0IsQ0FBcEI7QUFDRDs7QUFFRCxhQUFPRSxPQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7V0FNQUQsUSxHQUFBLGtCQUFTNUMsS0FBVCxFQUFnQjtBQUNkLFVBQU1vRCxPQUFPLEdBQUc7QUFBRUMsY0FBTSxFQUFFLEVBQVY7QUFBY0Msa0JBQVUsRUFBRTtBQUExQixPQUFoQjtBQUVBLGFBQ0UsS0FBS0MsVUFBTCxtQkFBcUJ2RCxLQUFLLENBQUN3RCxNQUEzQixNQUFzQ3hELEtBQUssQ0FBQ0UsS0FBNUMsS0FDQSxLQUFLdUQsYUFBTCxtQkFBd0J6RCxLQUFLLENBQUN3RCxNQUE5QjtBQUFzQ0UsaUJBQVMsRUFBRTtBQUFqRCxTQUF5RDFELEtBQUssQ0FBQ0csUUFBL0Q7QUFBeUV3RCxjQUFNLEVBQUU7QUFBakYsU0FEQSxHQUVBLEtBQUtDLGNBQUwsQ0FDRTVELEtBQUssQ0FBQzlDLFNBQU4scUJBQ1M4QyxLQUFLLENBQUN3RCxNQURmLE1BQzBCSixPQUQxQixNQUNzQ3BELEtBQUssQ0FBQzlDLFNBQU4sQ0FBZ0IvQixLQUR0RCxzQkFFUzZFLEtBQUssQ0FBQ3dELE1BRmYsTUFFMEJKLE9BRjFCLENBREYsQ0FGQSxHQU9BLEtBQUtTLFNBQUwsQ0FDRTdELEtBQUssQ0FBQzlDLFNBQU4scUJBQ1M4QyxLQUFLLENBQUN3RCxNQURmLE1BQzBCSixPQUQxQixNQUNzQ3BELEtBQUssQ0FBQ3hGLElBRDVDO0FBQ2tEc0osbUJBQVcsRUFBRTlELEtBQUssQ0FBQzlDLFNBQU4sQ0FBZ0JoRDtBQUQvRSw2QkFFUzhGLEtBQUssQ0FBQ3dELE1BRmYsTUFFMEJKLE9BRjFCLE1BRXNDcEQsS0FBSyxDQUFDeEYsSUFGNUMsQ0FERixDQVJGO0FBY0Q7QUFFRDs7Ozs7Ozs7V0FNQStJLFUsR0FBQSxvQkFBV3ZELEtBQVgsRUFBa0I7QUFDaEJBLFdBQUssQ0FBQ3JHLFdBQU4sR0FBb0IsRUFBcEI7O0FBQ0EsVUFBSXFHLEtBQUssQ0FBQzJELE1BQVYsRUFBa0I7QUFDaEIzRCxhQUFLLENBQUNyRyxXQUFOLENBQWtCb0ssVUFBbEIsR0FBK0IvRCxLQUFLLENBQUMyRCxNQUFyQztBQUNEOztBQUNELFVBQUksMkJBQVUzRCxLQUFLLENBQUNyQyxRQUFoQixLQUE2QixDQUFDcUMsS0FBSyxDQUFDckMsUUFBeEMsRUFBa0Q7QUFDaERxQyxhQUFLLENBQUNnRSxJQUFOLEdBQWE7QUFBRUMsaUJBQU8sRUFBRTtBQUFYLFNBQWI7QUFDQWpFLGFBQUssQ0FBQ3JHLFdBQU4sQ0FBa0JtRSxLQUFsQixHQUEwQixNQUExQjtBQUNEOztBQUVELGFBQ0UsS0FBS29HLGNBQUwsQ0FBb0IzSyxlQUFJUixLQUF4QixFQUErQmlILEtBQS9CLElBQ0EsS0FBS2tFLGNBQUwsQ0FBb0IsQ0FBQzNLLGVBQUlSLEtBQUwsRUFBWVEsZUFBSUwsSUFBaEIsQ0FBcEIsRUFBMkM4RyxLQUFLLENBQUNsRSxJQUFqRCxDQURBLEdBRUEsS0FBS29JLGNBQUwsQ0FBb0IsQ0FBQzNLLGVBQUlSLEtBQUwsRUFBWVEsZUFBSUgsUUFBaEIsQ0FBcEIsRUFBK0M0RyxLQUFLLENBQUNuRyxRQUFyRCxDQUZBLEdBR0EsS0FBS3FLLGNBQUwsQ0FBb0IzSyxlQUFJUCxXQUF4QixFQUFxQ2dILEtBQUssQ0FBQ3JHLFdBQTNDLENBSEEsR0FJQSxLQUFLdUssY0FBTCxDQUFvQjNLLGVBQUlOLElBQXhCLEVBQThCK0csS0FBSyxDQUFDZ0UsSUFBcEMsQ0FMRjtBQU9EO0FBRUQ7Ozs7Ozs7O1dBTUFQLGEsR0FBQSx1QkFBY3pELEtBQWQsRUFBcUI7QUFDbkIsYUFBTyxLQUFLa0UsY0FBTCxDQUFvQjNLLGVBQUlULFFBQXhCLEVBQWtDa0gsS0FBbEMsQ0FBUDtBQUNEO0FBRUQ7Ozs7Ozs7O1dBTUE0RCxjLEdBQUEsd0JBQWU1RCxLQUFmLEVBQXNCO0FBQ3BCLFVBQUlBLEtBQUssQ0FBQzJELE1BQVYsRUFBa0I7QUFDaEIzRCxhQUFLLENBQUMrRCxVQUFOLEdBQW1CL0QsS0FBSyxDQUFDMkQsTUFBekI7QUFDRDs7QUFFRCxhQUNFLEtBQUtPLGNBQUwsQ0FBb0IzSyxlQUFJVixnQkFBeEIsRUFBMENtSCxLQUExQyxJQUNBLEtBQUtrRSxjQUFMLENBQW9CLENBQUMzSyxlQUFJVixnQkFBTCxFQUF1QlUsZUFBSUgsUUFBM0IsQ0FBcEIsRUFBMEQ0RyxLQUFLLENBQUNuRyxRQUFoRSxDQUZGO0FBSUQ7QUFFRDs7Ozs7Ozs7V0FNQWdLLFMsR0FBQSxtQkFBVTdELEtBQVYsRUFBaUI7QUFDZixVQUFJQSxLQUFLLENBQUMyRCxNQUFWLEVBQWtCO0FBQ2hCM0QsYUFBSyxDQUFDK0QsVUFBTixHQUFtQi9ELEtBQUssQ0FBQzJELE1BQXpCO0FBQ0Q7O0FBQ0QsVUFBSTNELEtBQUssQ0FBQzdCLFFBQVYsRUFBb0I7QUFDbEIsWUFBTWdHLElBQUksR0FBRyxzQkFBVUMsdUJBQVYsQ0FBYjtBQUVBcEUsYUFBSyxDQUFDN0IsUUFBTixxQkFBc0JnRyxJQUFJLENBQUMzSixJQUFMLENBQVUyRCxRQUFoQyxNQUE2QzZCLEtBQUssQ0FBQzdCLFFBQW5EO0FBQ0E2QixhQUFLLENBQUNuRyxRQUFOLHFCQUFzQnNLLElBQUksQ0FBQzNKLElBQUwsQ0FBVVgsUUFBaEMsTUFBNkNtRyxLQUFLLENBQUNuRyxRQUFuRDtBQUNBbUcsYUFBSyxDQUFDcUUsV0FBTixxQkFBeUJGLElBQUksQ0FBQzNKLElBQUwsQ0FBVTZKLFdBQW5DLE1BQW1EckUsS0FBSyxDQUFDcUUsV0FBekQ7QUFDRDs7QUFFRCxhQUNFLEtBQUtILGNBQUwsQ0FBb0IzSyxlQUFJWixJQUF4QixFQUE4QnFILEtBQTlCLElBQ0EsS0FBS2tFLGNBQUwsQ0FBb0IsQ0FBQzNLLGVBQUlaLElBQUwsRUFBV1ksZUFBSUYsUUFBZixDQUFwQixFQUE4QzJHLEtBQUssQ0FBQzdCLFFBQXBELENBREEsR0FFQSxLQUFLK0YsY0FBTCxDQUFvQixDQUFDM0ssZUFBSVosSUFBTCxFQUFXWSxlQUFJSCxRQUFmLENBQXBCLEVBQThDNEcsS0FBSyxDQUFDbkcsUUFBcEQsQ0FGQSxHQUdBLEtBQUtxSyxjQUFMLENBQW9CLENBQUMzSyxlQUFJWixJQUFMLEVBQVdZLGVBQUlELFNBQWYsQ0FBcEIsRUFBK0MwRyxLQUFLLENBQUNxRSxXQUFyRCxDQUhBLEdBSUEsS0FBS0gsY0FBTCxDQUF1QjNLLGVBQUlYLFVBQTNCLFVBQTBDVyxlQUFJWixJQUE5QyxFQUFzRHFILEtBQUssQ0FBQzhELFdBQTVELENBTEY7QUFPRDtBQUVEOzs7Ozs7Ozs7V0FPQUksYyxHQUFBLHdCQUFlbkssU0FBZixFQUEwQmlHLEtBQTFCLEVBQWlDO0FBQy9CLFVBQUkseUJBQVFqRyxTQUFSLENBQUosRUFBd0I7QUFDdEJBLGlCQUFTLEdBQUdBLFNBQVMsQ0FBQ3VLLElBQVYsQ0FBZSxHQUFmLENBQVo7QUFDRDs7QUFDRHZLLGVBQVMsU0FBT0EsU0FBaEI7QUFFQSxVQUFJNEksU0FBUyxHQUFHLEVBQWhCO0FBQ0EsNENBQXFCM0MsS0FBckIsRUFBNEIsVUFBQ3hHLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUMxQyxZQUFJLDBCQUFTRCxLQUFULEtBQW1CQSxLQUF2QixFQUE4QjtBQUM1QkMsYUFBRyxHQUFHQSxHQUFHLENBQUM4SyxPQUFKLENBQVksb0JBQVosRUFBa0MsT0FBbEMsRUFBMkNDLFdBQTNDLEVBQU47QUFDQTdCLG1CQUFTLElBQU9sSixHQUFQLFNBQWNELEtBQWQsTUFBVDtBQUNEO0FBQ0YsT0FMRDtBQU9BLGFBQU9tSixTQUFTLEdBQU0sS0FBS0QsaUJBQVgsU0FBZ0MzSSxTQUFoQyxTQUE2QzRJLFNBQTdDLFNBQTRELEVBQTVFO0FBQ0Q7QUFFRDs7Ozs7V0FHQW5GLE8sR0FBQSxtQkFBVTtBQUNSLHFDQUFjLEtBQUtxRixPQUFuQjtBQUNBLFdBQUtBLE9BQUwsR0FBZSxJQUFmO0FBQ0QsSzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckxIOzs7OztBQUtBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2lCQStFZTtBQUNiLHFCQUFpQixnQkFESjtBQUNzQjtBQUNuQyx5QkFBcUIsTUFGUjtBQUdiLG9CQUFnQixNQUhIO0FBSWIsb0JBQWdCLE1BSkg7QUFLYixxQkFBaUIsTUFMSjtBQUtZO0FBRXpCLGtDQUE4QixTQVBqQjtBQVFiLDZCQUF5QixRQVJaO0FBVWI7QUFDQSxvQkFBZ0IsZ0JBWEg7QUFZYiwwQkFBc0IsRUFaVDtBQWFiLHdCQUFvQixTQWJQO0FBY2IsbUJBQWUsTUFkRjtBQWViLG1CQUFlLE1BZkY7QUFnQmIsb0JBQWdCLE1BaEJIO0FBa0JiO0FBQ0EseUJBQXFCLGdCQW5CUjtBQW9CYiw2QkFBeUIsU0FwQlo7QUFxQmIsd0JBQW9CLE1BckJQO0FBdUJiO0FBQ0EsNkJBQXlCLGdCQXhCWjtBQXlCYixpQ0FBNkIsU0F6QmhCO0FBMEJiLDRCQUF3QixTQTFCWDtBQTRCYjtBQUNBLHVCQUFtQixnQkE3Qk47QUE4QmIsMEJBQXNCLEdBOUJUO0FBK0JiLDJCQUF1QixTQS9CVjtBQWdDYixzQkFBa0IsTUFoQ0w7QUFpQ2IsMEJBQXNCLEVBakNUO0FBbUNiO0FBQ0EsbUNBQStCLE1BcENsQjtBQXNDYjtBQUNBLDhCQUEwQixHQXZDYjtBQXdDYixrQ0FBOEIsU0F4Q2pCO0FBeUNiLDZCQUF5QixNQXpDWjtBQTBDYixrQ0FBOEIsTUExQ2pCO0FBMkNiLDhCQUEwQixNQTNDYjtBQTZDYjtBQUNBLHVDQUFtQyxHQTlDdEI7QUErQ2IsMkNBQXVDLFNBL0MxQjtBQWdEYixzQ0FBa0MsTUFoRHJCO0FBa0RiO0FBQ0EsbUJBQWUsR0FuREY7QUFvRGIsdUJBQW1CLFNBcEROO0FBcURiLGtCQUFjLE1BckREO0FBc0RiLG1CQUFlLE1BdERGO0FBd0RiO0FBQ0EsNEJBQXdCLEdBekRYO0FBMERiLGdDQUE0QixTQTFEZjtBQTJEYiwyQkFBdUIsTUEzRFY7QUE2RGI7QUFDQSw0QkFBd0IsR0E5RFg7QUErRGIsZ0NBQTRCLFNBL0RmO0FBZ0ViLDJCQUF1QixTQWhFVjtBQWtFYjtBQUNBLCtCQUEyQixHQW5FZDtBQW9FYixtQ0FBK0IsU0FwRWxCO0FBcUViLDhCQUEwQjtBQXJFYixHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwRmY7Ozs7O0FBUUE7Ozs7O0FBS08sTUFBTTRCLFNBQVMsR0FBRyxTQUFaQSxTQUFZLENBQUFDLEdBQUcsRUFBSTtBQUM5QixRQUFNaEosTUFBTSxHQUFHLEVBQWY7QUFFQSwwQ0FBcUJnSixHQUFyQixFQUEwQixVQUFDbEwsS0FBRCxFQUFRbUwsSUFBUixFQUFpQjtBQUN6QyxVQUFNQyxJQUFJLEdBQUdELElBQUksQ0FBQ0UsS0FBTCxDQUFXLEdBQVgsQ0FBYjtBQUNBLFVBQUl2QyxJQUFJLEdBQUc1RyxNQUFYO0FBRUFrSixVQUFJLENBQUNqSyxPQUFMLENBQWEsVUFBQ2xCLEdBQUQsRUFBTXFCLEtBQU4sRUFBZ0I7QUFDM0IsWUFBSUEsS0FBSyxLQUFLOEosSUFBSSxDQUFDN0osTUFBTCxHQUFjLENBQTVCLEVBQStCO0FBQzdCdUgsY0FBSSxDQUFDN0ksR0FBRCxDQUFKLEdBQVlELEtBQVo7QUFDRCxTQUZELE1BRU8sSUFBSSxDQUFDOEksSUFBSSxDQUFDN0ksR0FBRCxDQUFULEVBQWdCO0FBQ3JCNkksY0FBSSxDQUFDN0ksR0FBRCxDQUFKLEdBQVksRUFBWjtBQUNEOztBQUNENkksWUFBSSxHQUFHQSxJQUFJLENBQUM3SSxHQUFELENBQVg7QUFDRCxPQVBEO0FBUUQsS0FaRDtBQWNBLFdBQU9pQyxNQUFQO0FBQ0QsR0FsQk07QUFvQlA7Ozs7Ozs7Ozs7OztBQVFPLE1BQU1zSCxhQUFhLEdBQUcsU0FBaEJBLGFBQWdCLENBQUM4QixPQUFELEVBQVVDLE9BQVYsRUFBbUJyRSxPQUFuQixFQUE0QnBELFNBQTVCLEVBQTBDO0FBQ3JFLFFBQU14RCxFQUFFLEdBQUcwRyxRQUFRLENBQUN3QyxhQUFULENBQXVCOEIsT0FBdkIsQ0FBWDs7QUFFQSxRQUFJQyxPQUFKLEVBQWE7QUFDWGpMLFFBQUUsQ0FBQ21FLFNBQUgsR0FBZThHLE9BQWY7QUFDRDs7QUFFRCwwQ0FBcUJyRSxPQUFyQixFQUE4QixVQUFDbEgsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQzVDLFVBQUlBLEdBQUcsQ0FBQ2dELE9BQUosQ0FBWSxPQUFaLElBQXVCLENBQUMsQ0FBNUIsRUFBK0I7QUFDN0IzQyxVQUFFLENBQUNrTCxZQUFILENBQWdCdkwsR0FBaEIsRUFBcUJELEtBQXJCO0FBQ0QsT0FGRCxNQUVPO0FBQ0xNLFVBQUUsQ0FBQ0wsR0FBRCxDQUFGLEdBQVVELEtBQVY7QUFDRDtBQUNGLEtBTkQ7O0FBUUEsUUFBSThELFNBQUosRUFBZTtBQUNiQSxlQUFTLENBQUNDLFdBQVYsQ0FBc0J6RCxFQUF0QjtBQUNEOztBQUVELFdBQU9BLEVBQVA7QUFDRCxHQXBCTTtBQXNCUDs7Ozs7Ozs7O0FBS08sTUFBTW1MLFdBQVcsR0FBRyxTQUFkQSxXQUFjLENBQUFuTCxFQUFFLEVBQUk7QUFDL0IsUUFBSSwwQkFBU0EsRUFBVCxDQUFKLEVBQWtCO0FBQ2hCLGFBQU9BLEVBQVA7QUFDRDs7QUFFRCxRQUFJQSxFQUFFLENBQUNvTCxFQUFQLEVBQVc7QUFDVCxtQkFBV3BMLEVBQUUsQ0FBQ29MLEVBQWQ7QUFDRDs7QUFFRCxRQUFNbkwsU0FBUyxTQUFPRCxFQUFFLENBQUNDLFNBQUgsQ0FBYXdLLE9BQWIsQ0FBcUIsTUFBckIsRUFBNkIsR0FBN0IsQ0FBdEI7O0FBQ0EsUUFBSXhLLFNBQUosRUFBZTtBQUNiLFVBQU1vTCxLQUFLLEdBQUczRSxRQUFRLENBQUM0RSxnQkFBVCxDQUEwQnJMLFNBQTFCLENBQWQ7O0FBRUEsVUFBSW9MLEtBQUssQ0FBQ3BLLE1BQU4sS0FBaUIsQ0FBckIsRUFBd0I7QUFDdEIsZUFBT2hCLFNBQVA7QUFDRDtBQUNGOztBQUVELFFBQU0rSyxPQUFPLEdBQUdoTCxFQUFFLENBQUNnTCxPQUFILENBQVdOLFdBQVgsRUFBaEI7QUFFQSxnQkFBVU0sT0FBVixHQUFvQi9LLFNBQXBCO0FBQ0QsR0FyQk0iLCJmaWxlIjoidG9hc3R1aS1zZWxlY3QtYm94LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiU2VsZWN0Qm94XCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInR1aVwiXSA9IHJvb3RbXCJ0dWlcIl0gfHwge30sIHJvb3RbXCJ0dWlcIl1bXCJTZWxlY3RCb3hcIl0gPSBmYWN0b3J5KCk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdGZ1bmN0aW9uIGhvdERpc3Bvc2VDaHVuayhjaHVua0lkKSB7XG4gXHRcdGRlbGV0ZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF07XG4gXHR9XG4gXHR2YXIgcGFyZW50SG90VXBkYXRlQ2FsbGJhY2sgPSB3aW5kb3dbXCJ3ZWJwYWNrSG90VXBkYXRlXCJdO1xuIFx0d2luZG93W1wid2VicGFja0hvdFVwZGF0ZVwiXSA9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0ZnVuY3Rpb24gd2VicGFja0hvdFVwZGF0ZUNhbGxiYWNrKGNodW5rSWQsIG1vcmVNb2R1bGVzKSB7XG4gXHRcdGhvdEFkZFVwZGF0ZUNodW5rKGNodW5rSWQsIG1vcmVNb2R1bGVzKTtcbiBcdFx0aWYgKHBhcmVudEhvdFVwZGF0ZUNhbGxiYWNrKSBwYXJlbnRIb3RVcGRhdGVDYWxsYmFjayhjaHVua0lkLCBtb3JlTW9kdWxlcyk7XG4gXHR9IDtcblxuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHRmdW5jdGlvbiBob3REb3dubG9hZFVwZGF0ZUNodW5rKGNodW5rSWQpIHtcbiBcdFx0dmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gXHRcdHNjcmlwdC5jaGFyc2V0ID0gXCJ1dGYtOFwiO1xuIFx0XHRzY3JpcHQuc3JjID0gX193ZWJwYWNrX3JlcXVpcmVfXy5wICsgXCJcIiArIGNodW5rSWQgKyBcIi5cIiArIGhvdEN1cnJlbnRIYXNoICsgXCIuaG90LXVwZGF0ZS5qc1wiO1xuIFx0XHRpZiAobnVsbCkgc2NyaXB0LmNyb3NzT3JpZ2luID0gbnVsbDtcbiBcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuIFx0fVxuXG4gXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiBcdGZ1bmN0aW9uIGhvdERvd25sb2FkTWFuaWZlc3QocmVxdWVzdFRpbWVvdXQpIHtcbiBcdFx0cmVxdWVzdFRpbWVvdXQgPSByZXF1ZXN0VGltZW91dCB8fCAxMDAwMDtcbiBcdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuIFx0XHRcdGlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgPT09IFwidW5kZWZpbmVkXCIpIHtcbiBcdFx0XHRcdHJldHVybiByZWplY3QobmV3IEVycm9yKFwiTm8gYnJvd3NlciBzdXBwb3J0XCIpKTtcbiBcdFx0XHR9XG4gXHRcdFx0dHJ5IHtcbiBcdFx0XHRcdHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gXHRcdFx0XHR2YXIgcmVxdWVzdFBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBcIlwiICsgaG90Q3VycmVudEhhc2ggKyBcIi5ob3QtdXBkYXRlLmpzb25cIjtcbiBcdFx0XHRcdHJlcXVlc3Qub3BlbihcIkdFVFwiLCByZXF1ZXN0UGF0aCwgdHJ1ZSk7XG4gXHRcdFx0XHRyZXF1ZXN0LnRpbWVvdXQgPSByZXF1ZXN0VGltZW91dDtcbiBcdFx0XHRcdHJlcXVlc3Quc2VuZChudWxsKTtcbiBcdFx0XHR9IGNhdGNoIChlcnIpIHtcbiBcdFx0XHRcdHJldHVybiByZWplY3QoZXJyKTtcbiBcdFx0XHR9XG4gXHRcdFx0cmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiBcdFx0XHRcdGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHJldHVybjtcbiBcdFx0XHRcdGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCkge1xuIFx0XHRcdFx0XHQvLyB0aW1lb3V0XG4gXHRcdFx0XHRcdHJlamVjdChcbiBcdFx0XHRcdFx0XHRuZXcgRXJyb3IoXCJNYW5pZmVzdCByZXF1ZXN0IHRvIFwiICsgcmVxdWVzdFBhdGggKyBcIiB0aW1lZCBvdXQuXCIpXG4gXHRcdFx0XHRcdCk7XG4gXHRcdFx0XHR9IGVsc2UgaWYgKHJlcXVlc3Quc3RhdHVzID09PSA0MDQpIHtcbiBcdFx0XHRcdFx0Ly8gbm8gdXBkYXRlIGF2YWlsYWJsZVxuIFx0XHRcdFx0XHRyZXNvbHZlKCk7XG4gXHRcdFx0XHR9IGVsc2UgaWYgKHJlcXVlc3Quc3RhdHVzICE9PSAyMDAgJiYgcmVxdWVzdC5zdGF0dXMgIT09IDMwNCkge1xuIFx0XHRcdFx0XHQvLyBvdGhlciBmYWlsdXJlXG4gXHRcdFx0XHRcdHJlamVjdChuZXcgRXJyb3IoXCJNYW5pZmVzdCByZXF1ZXN0IHRvIFwiICsgcmVxdWVzdFBhdGggKyBcIiBmYWlsZWQuXCIpKTtcbiBcdFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRcdC8vIHN1Y2Nlc3NcbiBcdFx0XHRcdFx0dHJ5IHtcbiBcdFx0XHRcdFx0XHR2YXIgdXBkYXRlID0gSlNPTi5wYXJzZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XG4gXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcbiBcdFx0XHRcdFx0XHRyZWplY3QoZSk7XG4gXHRcdFx0XHRcdFx0cmV0dXJuO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdHJlc29sdmUodXBkYXRlKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9O1xuIFx0XHR9KTtcbiBcdH1cblxuIFx0dmFyIGhvdEFwcGx5T25VcGRhdGUgPSB0cnVlO1xuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHR2YXIgaG90Q3VycmVudEhhc2ggPSBcIjgzNDA3NGJlYjllY2VjODc0ZDMwXCI7XG4gXHR2YXIgaG90UmVxdWVzdFRpbWVvdXQgPSAxMDAwMDtcbiBcdHZhciBob3RDdXJyZW50TW9kdWxlRGF0YSA9IHt9O1xuIFx0dmFyIGhvdEN1cnJlbnRDaGlsZE1vZHVsZTtcbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0dmFyIGhvdEN1cnJlbnRQYXJlbnRzID0gW107XG4gXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiBcdHZhciBob3RDdXJyZW50UGFyZW50c1RlbXAgPSBbXTtcblxuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHRmdW5jdGlvbiBob3RDcmVhdGVSZXF1aXJlKG1vZHVsZUlkKSB7XG4gXHRcdHZhciBtZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xuIFx0XHRpZiAoIW1lKSByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXztcbiBcdFx0dmFyIGZuID0gZnVuY3Rpb24ocmVxdWVzdCkge1xuIFx0XHRcdGlmIChtZS5ob3QuYWN0aXZlKSB7XG4gXHRcdFx0XHRpZiAoaW5zdGFsbGVkTW9kdWxlc1tyZXF1ZXN0XSkge1xuIFx0XHRcdFx0XHRpZiAoaW5zdGFsbGVkTW9kdWxlc1tyZXF1ZXN0XS5wYXJlbnRzLmluZGV4T2YobW9kdWxlSWQpID09PSAtMSkge1xuIFx0XHRcdFx0XHRcdGluc3RhbGxlZE1vZHVsZXNbcmVxdWVzdF0ucGFyZW50cy5wdXNoKG1vZHVsZUlkKTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0fSBlbHNlIHtcbiBcdFx0XHRcdFx0aG90Q3VycmVudFBhcmVudHMgPSBbbW9kdWxlSWRdO1xuIFx0XHRcdFx0XHRob3RDdXJyZW50Q2hpbGRNb2R1bGUgPSByZXF1ZXN0O1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0aWYgKG1lLmNoaWxkcmVuLmluZGV4T2YocmVxdWVzdCkgPT09IC0xKSB7XG4gXHRcdFx0XHRcdG1lLmNoaWxkcmVuLnB1c2gocmVxdWVzdCk7XG4gXHRcdFx0XHR9XG4gXHRcdFx0fSBlbHNlIHtcbiBcdFx0XHRcdGNvbnNvbGUud2FybihcbiBcdFx0XHRcdFx0XCJbSE1SXSB1bmV4cGVjdGVkIHJlcXVpcmUoXCIgK1xuIFx0XHRcdFx0XHRcdHJlcXVlc3QgK1xuIFx0XHRcdFx0XHRcdFwiKSBmcm9tIGRpc3Bvc2VkIG1vZHVsZSBcIiArXG4gXHRcdFx0XHRcdFx0bW9kdWxlSWRcbiBcdFx0XHRcdCk7XG4gXHRcdFx0XHRob3RDdXJyZW50UGFyZW50cyA9IFtdO1xuIFx0XHRcdH1cbiBcdFx0XHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhyZXF1ZXN0KTtcbiBcdFx0fTtcbiBcdFx0dmFyIE9iamVjdEZhY3RvcnkgPSBmdW5jdGlvbiBPYmplY3RGYWN0b3J5KG5hbWUpIHtcbiBcdFx0XHRyZXR1cm4ge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG4gXHRcdFx0XHRcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fW25hbWVdO1xuIFx0XHRcdFx0fSxcbiBcdFx0XHRcdHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiBcdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfX1tuYW1lXSA9IHZhbHVlO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH07XG4gXHRcdH07XG4gXHRcdGZvciAodmFyIG5hbWUgaW4gX193ZWJwYWNrX3JlcXVpcmVfXykge1xuIFx0XHRcdGlmIChcbiBcdFx0XHRcdE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfX3dlYnBhY2tfcmVxdWlyZV9fLCBuYW1lKSAmJlxuIFx0XHRcdFx0bmFtZSAhPT0gXCJlXCIgJiZcbiBcdFx0XHRcdG5hbWUgIT09IFwidFwiXG4gXHRcdFx0KSB7XG4gXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIG5hbWUsIE9iamVjdEZhY3RvcnkobmFtZSkpO1xuIFx0XHRcdH1cbiBcdFx0fVxuIFx0XHRmbi5lID0gZnVuY3Rpb24oY2h1bmtJZCkge1xuIFx0XHRcdGlmIChob3RTdGF0dXMgPT09IFwicmVhZHlcIikgaG90U2V0U3RhdHVzKFwicHJlcGFyZVwiKTtcbiBcdFx0XHRob3RDaHVua3NMb2FkaW5nKys7XG4gXHRcdFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uZShjaHVua0lkKS50aGVuKGZpbmlzaENodW5rTG9hZGluZywgZnVuY3Rpb24oZXJyKSB7XG4gXHRcdFx0XHRmaW5pc2hDaHVua0xvYWRpbmcoKTtcbiBcdFx0XHRcdHRocm93IGVycjtcbiBcdFx0XHR9KTtcblxuIFx0XHRcdGZ1bmN0aW9uIGZpbmlzaENodW5rTG9hZGluZygpIHtcbiBcdFx0XHRcdGhvdENodW5rc0xvYWRpbmctLTtcbiBcdFx0XHRcdGlmIChob3RTdGF0dXMgPT09IFwicHJlcGFyZVwiKSB7XG4gXHRcdFx0XHRcdGlmICghaG90V2FpdGluZ0ZpbGVzTWFwW2NodW5rSWRdKSB7XG4gXHRcdFx0XHRcdFx0aG90RW5zdXJlVXBkYXRlQ2h1bmsoY2h1bmtJZCk7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0aWYgKGhvdENodW5rc0xvYWRpbmcgPT09IDAgJiYgaG90V2FpdGluZ0ZpbGVzID09PSAwKSB7XG4gXHRcdFx0XHRcdFx0aG90VXBkYXRlRG93bmxvYWRlZCgpO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHR9XG4gXHRcdFx0fVxuIFx0XHR9O1xuIFx0XHRmbi50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0XHRpZiAobW9kZSAmIDEpIHZhbHVlID0gZm4odmFsdWUpO1xuIFx0XHRcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLnQodmFsdWUsIG1vZGUgJiB+MSk7XG4gXHRcdH07XG4gXHRcdHJldHVybiBmbjtcbiBcdH1cblxuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHRmdW5jdGlvbiBob3RDcmVhdGVNb2R1bGUobW9kdWxlSWQpIHtcbiBcdFx0dmFyIGhvdCA9IHtcbiBcdFx0XHQvLyBwcml2YXRlIHN0dWZmXG4gXHRcdFx0X2FjY2VwdGVkRGVwZW5kZW5jaWVzOiB7fSxcbiBcdFx0XHRfZGVjbGluZWREZXBlbmRlbmNpZXM6IHt9LFxuIFx0XHRcdF9zZWxmQWNjZXB0ZWQ6IGZhbHNlLFxuIFx0XHRcdF9zZWxmRGVjbGluZWQ6IGZhbHNlLFxuIFx0XHRcdF9kaXNwb3NlSGFuZGxlcnM6IFtdLFxuIFx0XHRcdF9tYWluOiBob3RDdXJyZW50Q2hpbGRNb2R1bGUgIT09IG1vZHVsZUlkLFxuXG4gXHRcdFx0Ly8gTW9kdWxlIEFQSVxuIFx0XHRcdGFjdGl2ZTogdHJ1ZSxcbiBcdFx0XHRhY2NlcHQ6IGZ1bmN0aW9uKGRlcCwgY2FsbGJhY2spIHtcbiBcdFx0XHRcdGlmIChkZXAgPT09IHVuZGVmaW5lZCkgaG90Ll9zZWxmQWNjZXB0ZWQgPSB0cnVlO1xuIFx0XHRcdFx0ZWxzZSBpZiAodHlwZW9mIGRlcCA9PT0gXCJmdW5jdGlvblwiKSBob3QuX3NlbGZBY2NlcHRlZCA9IGRlcDtcbiBcdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiBkZXAgPT09IFwib2JqZWN0XCIpXG4gXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGVwLmxlbmd0aDsgaSsrKVxuIFx0XHRcdFx0XHRcdGhvdC5fYWNjZXB0ZWREZXBlbmRlbmNpZXNbZGVwW2ldXSA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gXHRcdFx0XHRlbHNlIGhvdC5fYWNjZXB0ZWREZXBlbmRlbmNpZXNbZGVwXSA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gXHRcdFx0fSxcbiBcdFx0XHRkZWNsaW5lOiBmdW5jdGlvbihkZXApIHtcbiBcdFx0XHRcdGlmIChkZXAgPT09IHVuZGVmaW5lZCkgaG90Ll9zZWxmRGVjbGluZWQgPSB0cnVlO1xuIFx0XHRcdFx0ZWxzZSBpZiAodHlwZW9mIGRlcCA9PT0gXCJvYmplY3RcIilcbiBcdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkZXAubGVuZ3RoOyBpKyspXG4gXHRcdFx0XHRcdFx0aG90Ll9kZWNsaW5lZERlcGVuZGVuY2llc1tkZXBbaV1dID0gdHJ1ZTtcbiBcdFx0XHRcdGVsc2UgaG90Ll9kZWNsaW5lZERlcGVuZGVuY2llc1tkZXBdID0gdHJ1ZTtcbiBcdFx0XHR9LFxuIFx0XHRcdGRpc3Bvc2U6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gXHRcdFx0XHRob3QuX2Rpc3Bvc2VIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTtcbiBcdFx0XHR9LFxuIFx0XHRcdGFkZERpc3Bvc2VIYW5kbGVyOiBmdW5jdGlvbihjYWxsYmFjaykge1xuIFx0XHRcdFx0aG90Ll9kaXNwb3NlSGFuZGxlcnMucHVzaChjYWxsYmFjayk7XG4gXHRcdFx0fSxcbiBcdFx0XHRyZW1vdmVEaXNwb3NlSGFuZGxlcjogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiBcdFx0XHRcdHZhciBpZHggPSBob3QuX2Rpc3Bvc2VIYW5kbGVycy5pbmRleE9mKGNhbGxiYWNrKTtcbiBcdFx0XHRcdGlmIChpZHggPj0gMCkgaG90Ll9kaXNwb3NlSGFuZGxlcnMuc3BsaWNlKGlkeCwgMSk7XG4gXHRcdFx0fSxcblxuIFx0XHRcdC8vIE1hbmFnZW1lbnQgQVBJXG4gXHRcdFx0Y2hlY2s6IGhvdENoZWNrLFxuIFx0XHRcdGFwcGx5OiBob3RBcHBseSxcbiBcdFx0XHRzdGF0dXM6IGZ1bmN0aW9uKGwpIHtcbiBcdFx0XHRcdGlmICghbCkgcmV0dXJuIGhvdFN0YXR1cztcbiBcdFx0XHRcdGhvdFN0YXR1c0hhbmRsZXJzLnB1c2gobCk7XG4gXHRcdFx0fSxcbiBcdFx0XHRhZGRTdGF0dXNIYW5kbGVyOiBmdW5jdGlvbihsKSB7XG4gXHRcdFx0XHRob3RTdGF0dXNIYW5kbGVycy5wdXNoKGwpO1xuIFx0XHRcdH0sXG4gXHRcdFx0cmVtb3ZlU3RhdHVzSGFuZGxlcjogZnVuY3Rpb24obCkge1xuIFx0XHRcdFx0dmFyIGlkeCA9IGhvdFN0YXR1c0hhbmRsZXJzLmluZGV4T2YobCk7XG4gXHRcdFx0XHRpZiAoaWR4ID49IDApIGhvdFN0YXR1c0hhbmRsZXJzLnNwbGljZShpZHgsIDEpO1xuIFx0XHRcdH0sXG5cbiBcdFx0XHQvL2luaGVyaXQgZnJvbSBwcmV2aW91cyBkaXNwb3NlIGNhbGxcbiBcdFx0XHRkYXRhOiBob3RDdXJyZW50TW9kdWxlRGF0YVttb2R1bGVJZF1cbiBcdFx0fTtcbiBcdFx0aG90Q3VycmVudENoaWxkTW9kdWxlID0gdW5kZWZpbmVkO1xuIFx0XHRyZXR1cm4gaG90O1xuIFx0fVxuXG4gXHR2YXIgaG90U3RhdHVzSGFuZGxlcnMgPSBbXTtcbiBcdHZhciBob3RTdGF0dXMgPSBcImlkbGVcIjtcblxuIFx0ZnVuY3Rpb24gaG90U2V0U3RhdHVzKG5ld1N0YXR1cykge1xuIFx0XHRob3RTdGF0dXMgPSBuZXdTdGF0dXM7XG4gXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgaG90U3RhdHVzSGFuZGxlcnMubGVuZ3RoOyBpKyspXG4gXHRcdFx0aG90U3RhdHVzSGFuZGxlcnNbaV0uY2FsbChudWxsLCBuZXdTdGF0dXMpO1xuIFx0fVxuXG4gXHQvLyB3aGlsZSBkb3dubG9hZGluZ1xuIFx0dmFyIGhvdFdhaXRpbmdGaWxlcyA9IDA7XG4gXHR2YXIgaG90Q2h1bmtzTG9hZGluZyA9IDA7XG4gXHR2YXIgaG90V2FpdGluZ0ZpbGVzTWFwID0ge307XG4gXHR2YXIgaG90UmVxdWVzdGVkRmlsZXNNYXAgPSB7fTtcbiBcdHZhciBob3RBdmFpbGFibGVGaWxlc01hcCA9IHt9O1xuIFx0dmFyIGhvdERlZmVycmVkO1xuXG4gXHQvLyBUaGUgdXBkYXRlIGluZm9cbiBcdHZhciBob3RVcGRhdGUsIGhvdFVwZGF0ZU5ld0hhc2g7XG5cbiBcdGZ1bmN0aW9uIHRvTW9kdWxlSWQoaWQpIHtcbiBcdFx0dmFyIGlzTnVtYmVyID0gK2lkICsgXCJcIiA9PT0gaWQ7XG4gXHRcdHJldHVybiBpc051bWJlciA/ICtpZCA6IGlkO1xuIFx0fVxuXG4gXHRmdW5jdGlvbiBob3RDaGVjayhhcHBseSkge1xuIFx0XHRpZiAoaG90U3RhdHVzICE9PSBcImlkbGVcIikge1xuIFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNoZWNrKCkgaXMgb25seSBhbGxvd2VkIGluIGlkbGUgc3RhdHVzXCIpO1xuIFx0XHR9XG4gXHRcdGhvdEFwcGx5T25VcGRhdGUgPSBhcHBseTtcbiBcdFx0aG90U2V0U3RhdHVzKFwiY2hlY2tcIik7XG4gXHRcdHJldHVybiBob3REb3dubG9hZE1hbmlmZXN0KGhvdFJlcXVlc3RUaW1lb3V0KS50aGVuKGZ1bmN0aW9uKHVwZGF0ZSkge1xuIFx0XHRcdGlmICghdXBkYXRlKSB7XG4gXHRcdFx0XHRob3RTZXRTdGF0dXMoXCJpZGxlXCIpO1xuIFx0XHRcdFx0cmV0dXJuIG51bGw7XG4gXHRcdFx0fVxuIFx0XHRcdGhvdFJlcXVlc3RlZEZpbGVzTWFwID0ge307XG4gXHRcdFx0aG90V2FpdGluZ0ZpbGVzTWFwID0ge307XG4gXHRcdFx0aG90QXZhaWxhYmxlRmlsZXNNYXAgPSB1cGRhdGUuYztcbiBcdFx0XHRob3RVcGRhdGVOZXdIYXNoID0gdXBkYXRlLmg7XG5cbiBcdFx0XHRob3RTZXRTdGF0dXMoXCJwcmVwYXJlXCIpO1xuIFx0XHRcdHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gXHRcdFx0XHRob3REZWZlcnJlZCA9IHtcbiBcdFx0XHRcdFx0cmVzb2x2ZTogcmVzb2x2ZSxcbiBcdFx0XHRcdFx0cmVqZWN0OiByZWplY3RcbiBcdFx0XHRcdH07XG4gXHRcdFx0fSk7XG4gXHRcdFx0aG90VXBkYXRlID0ge307XG4gXHRcdFx0dmFyIGNodW5rSWQgPSBcIm1haW5cIjtcbiBcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9uZS1ibG9ja3NcbiBcdFx0XHR7XG4gXHRcdFx0XHQvKmdsb2JhbHMgY2h1bmtJZCAqL1xuIFx0XHRcdFx0aG90RW5zdXJlVXBkYXRlQ2h1bmsoY2h1bmtJZCk7XG4gXHRcdFx0fVxuIFx0XHRcdGlmIChcbiBcdFx0XHRcdGhvdFN0YXR1cyA9PT0gXCJwcmVwYXJlXCIgJiZcbiBcdFx0XHRcdGhvdENodW5rc0xvYWRpbmcgPT09IDAgJiZcbiBcdFx0XHRcdGhvdFdhaXRpbmdGaWxlcyA9PT0gMFxuIFx0XHRcdCkge1xuIFx0XHRcdFx0aG90VXBkYXRlRG93bmxvYWRlZCgpO1xuIFx0XHRcdH1cbiBcdFx0XHRyZXR1cm4gcHJvbWlzZTtcbiBcdFx0fSk7XG4gXHR9XG5cbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0ZnVuY3Rpb24gaG90QWRkVXBkYXRlQ2h1bmsoY2h1bmtJZCwgbW9yZU1vZHVsZXMpIHtcbiBcdFx0aWYgKCFob3RBdmFpbGFibGVGaWxlc01hcFtjaHVua0lkXSB8fCAhaG90UmVxdWVzdGVkRmlsZXNNYXBbY2h1bmtJZF0pXG4gXHRcdFx0cmV0dXJuO1xuIFx0XHRob3RSZXF1ZXN0ZWRGaWxlc01hcFtjaHVua0lkXSA9IGZhbHNlO1xuIFx0XHRmb3IgKHZhciBtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuIFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuIFx0XHRcdFx0aG90VXBkYXRlW21vZHVsZUlkXSA9IG1vcmVNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0XHR9XG4gXHRcdH1cbiBcdFx0aWYgKC0taG90V2FpdGluZ0ZpbGVzID09PSAwICYmIGhvdENodW5rc0xvYWRpbmcgPT09IDApIHtcbiBcdFx0XHRob3RVcGRhdGVEb3dubG9hZGVkKCk7XG4gXHRcdH1cbiBcdH1cblxuIFx0ZnVuY3Rpb24gaG90RW5zdXJlVXBkYXRlQ2h1bmsoY2h1bmtJZCkge1xuIFx0XHRpZiAoIWhvdEF2YWlsYWJsZUZpbGVzTWFwW2NodW5rSWRdKSB7XG4gXHRcdFx0aG90V2FpdGluZ0ZpbGVzTWFwW2NodW5rSWRdID0gdHJ1ZTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHRob3RSZXF1ZXN0ZWRGaWxlc01hcFtjaHVua0lkXSA9IHRydWU7XG4gXHRcdFx0aG90V2FpdGluZ0ZpbGVzKys7XG4gXHRcdFx0aG90RG93bmxvYWRVcGRhdGVDaHVuayhjaHVua0lkKTtcbiBcdFx0fVxuIFx0fVxuXG4gXHRmdW5jdGlvbiBob3RVcGRhdGVEb3dubG9hZGVkKCkge1xuIFx0XHRob3RTZXRTdGF0dXMoXCJyZWFkeVwiKTtcbiBcdFx0dmFyIGRlZmVycmVkID0gaG90RGVmZXJyZWQ7XG4gXHRcdGhvdERlZmVycmVkID0gbnVsbDtcbiBcdFx0aWYgKCFkZWZlcnJlZCkgcmV0dXJuO1xuIFx0XHRpZiAoaG90QXBwbHlPblVwZGF0ZSkge1xuIFx0XHRcdC8vIFdyYXAgZGVmZXJyZWQgb2JqZWN0IGluIFByb21pc2UgdG8gbWFyayBpdCBhcyBhIHdlbGwtaGFuZGxlZCBQcm9taXNlIHRvXG4gXHRcdFx0Ly8gYXZvaWQgdHJpZ2dlcmluZyB1bmNhdWdodCBleGNlcHRpb24gd2FybmluZyBpbiBDaHJvbWUuXG4gXHRcdFx0Ly8gU2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ2NTY2NlxuIFx0XHRcdFByb21pc2UucmVzb2x2ZSgpXG4gXHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcbiBcdFx0XHRcdFx0cmV0dXJuIGhvdEFwcGx5KGhvdEFwcGx5T25VcGRhdGUpO1xuIFx0XHRcdFx0fSlcbiBcdFx0XHRcdC50aGVuKFxuIFx0XHRcdFx0XHRmdW5jdGlvbihyZXN1bHQpIHtcbiBcdFx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7XG4gXHRcdFx0XHRcdH0sXG4gXHRcdFx0XHRcdGZ1bmN0aW9uKGVycikge1xuIFx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdChlcnIpO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHQpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdHZhciBvdXRkYXRlZE1vZHVsZXMgPSBbXTtcbiBcdFx0XHRmb3IgKHZhciBpZCBpbiBob3RVcGRhdGUpIHtcbiBcdFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaG90VXBkYXRlLCBpZCkpIHtcbiBcdFx0XHRcdFx0b3V0ZGF0ZWRNb2R1bGVzLnB1c2godG9Nb2R1bGVJZChpZCkpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0XHRkZWZlcnJlZC5yZXNvbHZlKG91dGRhdGVkTW9kdWxlcyk7XG4gXHRcdH1cbiBcdH1cblxuIFx0ZnVuY3Rpb24gaG90QXBwbHkob3B0aW9ucykge1xuIFx0XHRpZiAoaG90U3RhdHVzICE9PSBcInJlYWR5XCIpXG4gXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiYXBwbHkoKSBpcyBvbmx5IGFsbG93ZWQgaW4gcmVhZHkgc3RhdHVzXCIpO1xuIFx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuIFx0XHR2YXIgY2I7XG4gXHRcdHZhciBpO1xuIFx0XHR2YXIgajtcbiBcdFx0dmFyIG1vZHVsZTtcbiBcdFx0dmFyIG1vZHVsZUlkO1xuXG4gXHRcdGZ1bmN0aW9uIGdldEFmZmVjdGVkU3R1ZmYodXBkYXRlTW9kdWxlSWQpIHtcbiBcdFx0XHR2YXIgb3V0ZGF0ZWRNb2R1bGVzID0gW3VwZGF0ZU1vZHVsZUlkXTtcbiBcdFx0XHR2YXIgb3V0ZGF0ZWREZXBlbmRlbmNpZXMgPSB7fTtcblxuIFx0XHRcdHZhciBxdWV1ZSA9IG91dGRhdGVkTW9kdWxlcy5tYXAoZnVuY3Rpb24oaWQpIHtcbiBcdFx0XHRcdHJldHVybiB7XG4gXHRcdFx0XHRcdGNoYWluOiBbaWRdLFxuIFx0XHRcdFx0XHRpZDogaWRcbiBcdFx0XHRcdH07XG4gXHRcdFx0fSk7XG4gXHRcdFx0d2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiBcdFx0XHRcdHZhciBxdWV1ZUl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiBcdFx0XHRcdHZhciBtb2R1bGVJZCA9IHF1ZXVlSXRlbS5pZDtcbiBcdFx0XHRcdHZhciBjaGFpbiA9IHF1ZXVlSXRlbS5jaGFpbjtcbiBcdFx0XHRcdG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xuIFx0XHRcdFx0aWYgKCFtb2R1bGUgfHwgbW9kdWxlLmhvdC5fc2VsZkFjY2VwdGVkKSBjb250aW51ZTtcbiBcdFx0XHRcdGlmIChtb2R1bGUuaG90Ll9zZWxmRGVjbGluZWQpIHtcbiBcdFx0XHRcdFx0cmV0dXJuIHtcbiBcdFx0XHRcdFx0XHR0eXBlOiBcInNlbGYtZGVjbGluZWRcIixcbiBcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4sXG4gXHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkXG4gXHRcdFx0XHRcdH07XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHRpZiAobW9kdWxlLmhvdC5fbWFpbikge1xuIFx0XHRcdFx0XHRyZXR1cm4ge1xuIFx0XHRcdFx0XHRcdHR5cGU6IFwidW5hY2NlcHRlZFwiLFxuIFx0XHRcdFx0XHRcdGNoYWluOiBjaGFpbixcbiBcdFx0XHRcdFx0XHRtb2R1bGVJZDogbW9kdWxlSWRcbiBcdFx0XHRcdFx0fTtcbiBcdFx0XHRcdH1cbiBcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbW9kdWxlLnBhcmVudHMubGVuZ3RoOyBpKyspIHtcbiBcdFx0XHRcdFx0dmFyIHBhcmVudElkID0gbW9kdWxlLnBhcmVudHNbaV07XG4gXHRcdFx0XHRcdHZhciBwYXJlbnQgPSBpbnN0YWxsZWRNb2R1bGVzW3BhcmVudElkXTtcbiBcdFx0XHRcdFx0aWYgKCFwYXJlbnQpIGNvbnRpbnVlO1xuIFx0XHRcdFx0XHRpZiAocGFyZW50LmhvdC5fZGVjbGluZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0XHRcdFx0cmV0dXJuIHtcbiBcdFx0XHRcdFx0XHRcdHR5cGU6IFwiZGVjbGluZWRcIixcbiBcdFx0XHRcdFx0XHRcdGNoYWluOiBjaGFpbi5jb25jYXQoW3BhcmVudElkXSksXG4gXHRcdFx0XHRcdFx0XHRtb2R1bGVJZDogbW9kdWxlSWQsXG4gXHRcdFx0XHRcdFx0XHRwYXJlbnRJZDogcGFyZW50SWRcbiBcdFx0XHRcdFx0XHR9O1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdGlmIChvdXRkYXRlZE1vZHVsZXMuaW5kZXhPZihwYXJlbnRJZCkgIT09IC0xKSBjb250aW51ZTtcbiBcdFx0XHRcdFx0aWYgKHBhcmVudC5ob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXSkge1xuIFx0XHRcdFx0XHRcdGlmICghb3V0ZGF0ZWREZXBlbmRlbmNpZXNbcGFyZW50SWRdKVxuIFx0XHRcdFx0XHRcdFx0b3V0ZGF0ZWREZXBlbmRlbmNpZXNbcGFyZW50SWRdID0gW107XG4gXHRcdFx0XHRcdFx0YWRkQWxsVG9TZXQob3V0ZGF0ZWREZXBlbmRlbmNpZXNbcGFyZW50SWRdLCBbbW9kdWxlSWRdKTtcbiBcdFx0XHRcdFx0XHRjb250aW51ZTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRkZWxldGUgb3V0ZGF0ZWREZXBlbmRlbmNpZXNbcGFyZW50SWRdO1xuIFx0XHRcdFx0XHRvdXRkYXRlZE1vZHVsZXMucHVzaChwYXJlbnRJZCk7XG4gXHRcdFx0XHRcdHF1ZXVlLnB1c2goe1xuIFx0XHRcdFx0XHRcdGNoYWluOiBjaGFpbi5jb25jYXQoW3BhcmVudElkXSksXG4gXHRcdFx0XHRcdFx0aWQ6IHBhcmVudElkXG4gXHRcdFx0XHRcdH0pO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH1cblxuIFx0XHRcdHJldHVybiB7XG4gXHRcdFx0XHR0eXBlOiBcImFjY2VwdGVkXCIsXG4gXHRcdFx0XHRtb2R1bGVJZDogdXBkYXRlTW9kdWxlSWQsXG4gXHRcdFx0XHRvdXRkYXRlZE1vZHVsZXM6IG91dGRhdGVkTW9kdWxlcyxcbiBcdFx0XHRcdG91dGRhdGVkRGVwZW5kZW5jaWVzOiBvdXRkYXRlZERlcGVuZGVuY2llc1xuIFx0XHRcdH07XG4gXHRcdH1cblxuIFx0XHRmdW5jdGlvbiBhZGRBbGxUb1NldChhLCBiKSB7XG4gXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0XHR2YXIgaXRlbSA9IGJbaV07XG4gXHRcdFx0XHRpZiAoYS5pbmRleE9mKGl0ZW0pID09PSAtMSkgYS5wdXNoKGl0ZW0pO1xuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIGF0IGJlZ2luIGFsbCB1cGRhdGVzIG1vZHVsZXMgYXJlIG91dGRhdGVkXG4gXHRcdC8vIHRoZSBcIm91dGRhdGVkXCIgc3RhdHVzIGNhbiBwcm9wYWdhdGUgdG8gcGFyZW50cyBpZiB0aGV5IGRvbid0IGFjY2VwdCB0aGUgY2hpbGRyZW5cbiBcdFx0dmFyIG91dGRhdGVkRGVwZW5kZW5jaWVzID0ge307XG4gXHRcdHZhciBvdXRkYXRlZE1vZHVsZXMgPSBbXTtcbiBcdFx0dmFyIGFwcGxpZWRVcGRhdGUgPSB7fTtcblxuIFx0XHR2YXIgd2FyblVuZXhwZWN0ZWRSZXF1aXJlID0gZnVuY3Rpb24gd2FyblVuZXhwZWN0ZWRSZXF1aXJlKCkge1xuIFx0XHRcdGNvbnNvbGUud2FybihcbiBcdFx0XHRcdFwiW0hNUl0gdW5leHBlY3RlZCByZXF1aXJlKFwiICsgcmVzdWx0Lm1vZHVsZUlkICsgXCIpIHRvIGRpc3Bvc2VkIG1vZHVsZVwiXG4gXHRcdFx0KTtcbiBcdFx0fTtcblxuIFx0XHRmb3IgKHZhciBpZCBpbiBob3RVcGRhdGUpIHtcbiBcdFx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhvdFVwZGF0ZSwgaWQpKSB7XG4gXHRcdFx0XHRtb2R1bGVJZCA9IHRvTW9kdWxlSWQoaWQpO1xuIFx0XHRcdFx0LyoqIEB0eXBlIHtUT0RPfSAqL1xuIFx0XHRcdFx0dmFyIHJlc3VsdDtcbiBcdFx0XHRcdGlmIChob3RVcGRhdGVbaWRdKSB7XG4gXHRcdFx0XHRcdHJlc3VsdCA9IGdldEFmZmVjdGVkU3R1ZmYobW9kdWxlSWQpO1xuIFx0XHRcdFx0fSBlbHNlIHtcbiBcdFx0XHRcdFx0cmVzdWx0ID0ge1xuIFx0XHRcdFx0XHRcdHR5cGU6IFwiZGlzcG9zZWRcIixcbiBcdFx0XHRcdFx0XHRtb2R1bGVJZDogaWRcbiBcdFx0XHRcdFx0fTtcbiBcdFx0XHRcdH1cbiBcdFx0XHRcdC8qKiBAdHlwZSB7RXJyb3J8ZmFsc2V9ICovXG4gXHRcdFx0XHR2YXIgYWJvcnRFcnJvciA9IGZhbHNlO1xuIFx0XHRcdFx0dmFyIGRvQXBwbHkgPSBmYWxzZTtcbiBcdFx0XHRcdHZhciBkb0Rpc3Bvc2UgPSBmYWxzZTtcbiBcdFx0XHRcdHZhciBjaGFpbkluZm8gPSBcIlwiO1xuIFx0XHRcdFx0aWYgKHJlc3VsdC5jaGFpbikge1xuIFx0XHRcdFx0XHRjaGFpbkluZm8gPSBcIlxcblVwZGF0ZSBwcm9wYWdhdGlvbjogXCIgKyByZXN1bHQuY2hhaW4uam9pbihcIiAtPiBcIik7XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHRzd2l0Y2ggKHJlc3VsdC50eXBlKSB7XG4gXHRcdFx0XHRcdGNhc2UgXCJzZWxmLWRlY2xpbmVkXCI6XG4gXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25EZWNsaW5lZCkgb3B0aW9ucy5vbkRlY2xpbmVkKHJlc3VsdCk7XG4gXHRcdFx0XHRcdFx0aWYgKCFvcHRpb25zLmlnbm9yZURlY2xpbmVkKVxuIFx0XHRcdFx0XHRcdFx0YWJvcnRFcnJvciA9IG5ldyBFcnJvcihcbiBcdFx0XHRcdFx0XHRcdFx0XCJBYm9ydGVkIGJlY2F1c2Ugb2Ygc2VsZiBkZWNsaW5lOiBcIiArXG4gXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0Lm1vZHVsZUlkICtcbiBcdFx0XHRcdFx0XHRcdFx0XHRjaGFpbkluZm9cbiBcdFx0XHRcdFx0XHRcdCk7XG4gXHRcdFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0XHRcdGNhc2UgXCJkZWNsaW5lZFwiOlxuIFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uRGVjbGluZWQpIG9wdGlvbnMub25EZWNsaW5lZChyZXN1bHQpO1xuIFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVEZWNsaW5lZClcbiBcdFx0XHRcdFx0XHRcdGFib3J0RXJyb3IgPSBuZXcgRXJyb3IoXG4gXHRcdFx0XHRcdFx0XHRcdFwiQWJvcnRlZCBiZWNhdXNlIG9mIGRlY2xpbmVkIGRlcGVuZGVuY3k6IFwiICtcbiBcdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHQubW9kdWxlSWQgK1xuIFx0XHRcdFx0XHRcdFx0XHRcdFwiIGluIFwiICtcbiBcdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHQucGFyZW50SWQgK1xuIFx0XHRcdFx0XHRcdFx0XHRcdGNoYWluSW5mb1xuIFx0XHRcdFx0XHRcdFx0KTtcbiBcdFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdFx0Y2FzZSBcInVuYWNjZXB0ZWRcIjpcbiBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vblVuYWNjZXB0ZWQpIG9wdGlvbnMub25VbmFjY2VwdGVkKHJlc3VsdCk7XG4gXHRcdFx0XHRcdFx0aWYgKCFvcHRpb25zLmlnbm9yZVVuYWNjZXB0ZWQpXG4gXHRcdFx0XHRcdFx0XHRhYm9ydEVycm9yID0gbmV3IEVycm9yKFxuIFx0XHRcdFx0XHRcdFx0XHRcIkFib3J0ZWQgYmVjYXVzZSBcIiArIG1vZHVsZUlkICsgXCIgaXMgbm90IGFjY2VwdGVkXCIgKyBjaGFpbkluZm9cbiBcdFx0XHRcdFx0XHRcdCk7XG4gXHRcdFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0XHRcdGNhc2UgXCJhY2NlcHRlZFwiOlxuIFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uQWNjZXB0ZWQpIG9wdGlvbnMub25BY2NlcHRlZChyZXN1bHQpO1xuIFx0XHRcdFx0XHRcdGRvQXBwbHkgPSB0cnVlO1xuIFx0XHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0XHRjYXNlIFwiZGlzcG9zZWRcIjpcbiBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkRpc3Bvc2VkKSBvcHRpb25zLm9uRGlzcG9zZWQocmVzdWx0KTtcbiBcdFx0XHRcdFx0XHRkb0Rpc3Bvc2UgPSB0cnVlO1xuIFx0XHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0XHRkZWZhdWx0OlxuIFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVuZXhjZXB0aW9uIHR5cGUgXCIgKyByZXN1bHQudHlwZSk7XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHRpZiAoYWJvcnRFcnJvcikge1xuIFx0XHRcdFx0XHRob3RTZXRTdGF0dXMoXCJhYm9ydFwiKTtcbiBcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGFib3J0RXJyb3IpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0aWYgKGRvQXBwbHkpIHtcbiBcdFx0XHRcdFx0YXBwbGllZFVwZGF0ZVttb2R1bGVJZF0gPSBob3RVcGRhdGVbbW9kdWxlSWRdO1xuIFx0XHRcdFx0XHRhZGRBbGxUb1NldChvdXRkYXRlZE1vZHVsZXMsIHJlc3VsdC5vdXRkYXRlZE1vZHVsZXMpO1xuIFx0XHRcdFx0XHRmb3IgKG1vZHVsZUlkIGluIHJlc3VsdC5vdXRkYXRlZERlcGVuZGVuY2llcykge1xuIFx0XHRcdFx0XHRcdGlmIChcbiBcdFx0XHRcdFx0XHRcdE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiBcdFx0XHRcdFx0XHRcdFx0cmVzdWx0Lm91dGRhdGVkRGVwZW5kZW5jaWVzLFxuIFx0XHRcdFx0XHRcdFx0XHRtb2R1bGVJZFxuIFx0XHRcdFx0XHRcdFx0KVxuIFx0XHRcdFx0XHRcdCkge1xuIFx0XHRcdFx0XHRcdFx0aWYgKCFvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0pXG4gXHRcdFx0XHRcdFx0XHRcdG91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXSA9IFtdO1xuIFx0XHRcdFx0XHRcdFx0YWRkQWxsVG9TZXQoXG4gXHRcdFx0XHRcdFx0XHRcdG91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXSxcbiBcdFx0XHRcdFx0XHRcdFx0cmVzdWx0Lm91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXVxuIFx0XHRcdFx0XHRcdFx0KTtcbiBcdFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH1cbiBcdFx0XHRcdGlmIChkb0Rpc3Bvc2UpIHtcbiBcdFx0XHRcdFx0YWRkQWxsVG9TZXQob3V0ZGF0ZWRNb2R1bGVzLCBbcmVzdWx0Lm1vZHVsZUlkXSk7XG4gXHRcdFx0XHRcdGFwcGxpZWRVcGRhdGVbbW9kdWxlSWRdID0gd2FyblVuZXhwZWN0ZWRSZXF1aXJlO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIFN0b3JlIHNlbGYgYWNjZXB0ZWQgb3V0ZGF0ZWQgbW9kdWxlcyB0byByZXF1aXJlIHRoZW0gbGF0ZXIgYnkgdGhlIG1vZHVsZSBzeXN0ZW1cbiBcdFx0dmFyIG91dGRhdGVkU2VsZkFjY2VwdGVkTW9kdWxlcyA9IFtdO1xuIFx0XHRmb3IgKGkgPSAwOyBpIDwgb3V0ZGF0ZWRNb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0bW9kdWxlSWQgPSBvdXRkYXRlZE1vZHVsZXNbaV07XG4gXHRcdFx0aWYgKFxuIFx0XHRcdFx0aW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gJiZcbiBcdFx0XHRcdGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmhvdC5fc2VsZkFjY2VwdGVkICYmXG4gXHRcdFx0XHQvLyByZW1vdmVkIHNlbGYtYWNjZXB0ZWQgbW9kdWxlcyBzaG91bGQgbm90IGJlIHJlcXVpcmVkXG4gXHRcdFx0XHRhcHBsaWVkVXBkYXRlW21vZHVsZUlkXSAhPT0gd2FyblVuZXhwZWN0ZWRSZXF1aXJlXG4gXHRcdFx0KSB7XG4gXHRcdFx0XHRvdXRkYXRlZFNlbGZBY2NlcHRlZE1vZHVsZXMucHVzaCh7XG4gXHRcdFx0XHRcdG1vZHVsZTogbW9kdWxlSWQsXG4gXHRcdFx0XHRcdGVycm9ySGFuZGxlcjogaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uaG90Ll9zZWxmQWNjZXB0ZWRcbiBcdFx0XHRcdH0pO1xuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIE5vdyBpbiBcImRpc3Bvc2VcIiBwaGFzZVxuIFx0XHRob3RTZXRTdGF0dXMoXCJkaXNwb3NlXCIpO1xuIFx0XHRPYmplY3Qua2V5cyhob3RBdmFpbGFibGVGaWxlc01hcCkuZm9yRWFjaChmdW5jdGlvbihjaHVua0lkKSB7XG4gXHRcdFx0aWYgKGhvdEF2YWlsYWJsZUZpbGVzTWFwW2NodW5rSWRdID09PSBmYWxzZSkge1xuIFx0XHRcdFx0aG90RGlzcG9zZUNodW5rKGNodW5rSWQpO1xuIFx0XHRcdH1cbiBcdFx0fSk7XG5cbiBcdFx0dmFyIGlkeDtcbiBcdFx0dmFyIHF1ZXVlID0gb3V0ZGF0ZWRNb2R1bGVzLnNsaWNlKCk7XG4gXHRcdHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gXHRcdFx0bW9kdWxlSWQgPSBxdWV1ZS5wb3AoKTtcbiBcdFx0XHRtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0XHRpZiAoIW1vZHVsZSkgY29udGludWU7XG5cbiBcdFx0XHR2YXIgZGF0YSA9IHt9O1xuXG4gXHRcdFx0Ly8gQ2FsbCBkaXNwb3NlIGhhbmRsZXJzXG4gXHRcdFx0dmFyIGRpc3Bvc2VIYW5kbGVycyA9IG1vZHVsZS5ob3QuX2Rpc3Bvc2VIYW5kbGVycztcbiBcdFx0XHRmb3IgKGogPSAwOyBqIDwgZGlzcG9zZUhhbmRsZXJzLmxlbmd0aDsgaisrKSB7XG4gXHRcdFx0XHRjYiA9IGRpc3Bvc2VIYW5kbGVyc1tqXTtcbiBcdFx0XHRcdGNiKGRhdGEpO1xuIFx0XHRcdH1cbiBcdFx0XHRob3RDdXJyZW50TW9kdWxlRGF0YVttb2R1bGVJZF0gPSBkYXRhO1xuXG4gXHRcdFx0Ly8gZGlzYWJsZSBtb2R1bGUgKHRoaXMgZGlzYWJsZXMgcmVxdWlyZXMgZnJvbSB0aGlzIG1vZHVsZSlcbiBcdFx0XHRtb2R1bGUuaG90LmFjdGl2ZSA9IGZhbHNlO1xuXG4gXHRcdFx0Ly8gcmVtb3ZlIG1vZHVsZSBmcm9tIGNhY2hlXG4gXHRcdFx0ZGVsZXRlIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xuXG4gXHRcdFx0Ly8gd2hlbiBkaXNwb3NpbmcgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIGRpc3Bvc2UgaGFuZGxlclxuIFx0XHRcdGRlbGV0ZSBvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF07XG5cbiBcdFx0XHQvLyByZW1vdmUgXCJwYXJlbnRzXCIgcmVmZXJlbmNlcyBmcm9tIGFsbCBjaGlsZHJlblxuIFx0XHRcdGZvciAoaiA9IDA7IGogPCBtb2R1bGUuY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiBcdFx0XHRcdHZhciBjaGlsZCA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlLmNoaWxkcmVuW2pdXTtcbiBcdFx0XHRcdGlmICghY2hpbGQpIGNvbnRpbnVlO1xuIFx0XHRcdFx0aWR4ID0gY2hpbGQucGFyZW50cy5pbmRleE9mKG1vZHVsZUlkKTtcbiBcdFx0XHRcdGlmIChpZHggPj0gMCkge1xuIFx0XHRcdFx0XHRjaGlsZC5wYXJlbnRzLnNwbGljZShpZHgsIDEpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIHJlbW92ZSBvdXRkYXRlZCBkZXBlbmRlbmN5IGZyb20gbW9kdWxlIGNoaWxkcmVuXG4gXHRcdHZhciBkZXBlbmRlbmN5O1xuIFx0XHR2YXIgbW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXM7XG4gXHRcdGZvciAobW9kdWxlSWQgaW4gb3V0ZGF0ZWREZXBlbmRlbmNpZXMpIHtcbiBcdFx0XHRpZiAoXG4gXHRcdFx0XHRPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3V0ZGF0ZWREZXBlbmRlbmNpZXMsIG1vZHVsZUlkKVxuIFx0XHRcdCkge1xuIFx0XHRcdFx0bW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0XHRpZiAobW9kdWxlKSB7XG4gXHRcdFx0XHRcdG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzID0gb3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdO1xuIFx0XHRcdFx0XHRmb3IgKGogPSAwOyBqIDwgbW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXMubGVuZ3RoOyBqKyspIHtcbiBcdFx0XHRcdFx0XHRkZXBlbmRlbmN5ID0gbW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXNbal07XG4gXHRcdFx0XHRcdFx0aWR4ID0gbW9kdWxlLmNoaWxkcmVuLmluZGV4T2YoZGVwZW5kZW5jeSk7XG4gXHRcdFx0XHRcdFx0aWYgKGlkeCA+PSAwKSBtb2R1bGUuY2hpbGRyZW4uc3BsaWNlKGlkeCwgMSk7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBOb3cgaW4gXCJhcHBseVwiIHBoYXNlXG4gXHRcdGhvdFNldFN0YXR1cyhcImFwcGx5XCIpO1xuXG4gXHRcdGhvdEN1cnJlbnRIYXNoID0gaG90VXBkYXRlTmV3SGFzaDtcblxuIFx0XHQvLyBpbnNlcnQgbmV3IGNvZGVcbiBcdFx0Zm9yIChtb2R1bGVJZCBpbiBhcHBsaWVkVXBkYXRlKSB7XG4gXHRcdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcHBsaWVkVXBkYXRlLCBtb2R1bGVJZCkpIHtcbiBcdFx0XHRcdG1vZHVsZXNbbW9kdWxlSWRdID0gYXBwbGllZFVwZGF0ZVttb2R1bGVJZF07XG4gXHRcdFx0fVxuIFx0XHR9XG5cbiBcdFx0Ly8gY2FsbCBhY2NlcHQgaGFuZGxlcnNcbiBcdFx0dmFyIGVycm9yID0gbnVsbDtcbiBcdFx0Zm9yIChtb2R1bGVJZCBpbiBvdXRkYXRlZERlcGVuZGVuY2llcykge1xuIFx0XHRcdGlmIChcbiBcdFx0XHRcdE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvdXRkYXRlZERlcGVuZGVuY2llcywgbW9kdWxlSWQpXG4gXHRcdFx0KSB7XG4gXHRcdFx0XHRtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0XHRcdGlmIChtb2R1bGUpIHtcbiBcdFx0XHRcdFx0bW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXMgPSBvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF07XG4gXHRcdFx0XHRcdHZhciBjYWxsYmFja3MgPSBbXTtcbiBcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0XHRcdFx0ZGVwZW5kZW5jeSA9IG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzW2ldO1xuIFx0XHRcdFx0XHRcdGNiID0gbW9kdWxlLmhvdC5fYWNjZXB0ZWREZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gXHRcdFx0XHRcdFx0aWYgKGNiKSB7XG4gXHRcdFx0XHRcdFx0XHRpZiAoY2FsbGJhY2tzLmluZGV4T2YoY2IpICE9PSAtMSkgY29udGludWU7XG4gXHRcdFx0XHRcdFx0XHRjYWxsYmFja3MucHVzaChjYik7XG4gXHRcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiBcdFx0XHRcdFx0XHRjYiA9IGNhbGxiYWNrc1tpXTtcbiBcdFx0XHRcdFx0XHR0cnkge1xuIFx0XHRcdFx0XHRcdFx0Y2IobW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXMpO1xuIFx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuIFx0XHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25FcnJvcmVkKSB7XG4gXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMub25FcnJvcmVkKHtcbiBcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdC1lcnJvcmVkXCIsXG4gXHRcdFx0XHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkLFxuIFx0XHRcdFx0XHRcdFx0XHRcdGRlcGVuZGVuY3lJZDogbW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXNbaV0sXG4gXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3I6IGVyclxuIFx0XHRcdFx0XHRcdFx0XHR9KTtcbiBcdFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVFcnJvcmVkKSB7XG4gXHRcdFx0XHRcdFx0XHRcdGlmICghZXJyb3IpIGVycm9yID0gZXJyO1xuIFx0XHRcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIExvYWQgc2VsZiBhY2NlcHRlZCBtb2R1bGVzXG4gXHRcdGZvciAoaSA9IDA7IGkgPCBvdXRkYXRlZFNlbGZBY2NlcHRlZE1vZHVsZXMubGVuZ3RoOyBpKyspIHtcbiBcdFx0XHR2YXIgaXRlbSA9IG91dGRhdGVkU2VsZkFjY2VwdGVkTW9kdWxlc1tpXTtcbiBcdFx0XHRtb2R1bGVJZCA9IGl0ZW0ubW9kdWxlO1xuIFx0XHRcdGhvdEN1cnJlbnRQYXJlbnRzID0gW21vZHVsZUlkXTtcbiBcdFx0XHR0cnkge1xuIFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCk7XG4gXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG4gXHRcdFx0XHRpZiAodHlwZW9mIGl0ZW0uZXJyb3JIYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiBcdFx0XHRcdFx0dHJ5IHtcbiBcdFx0XHRcdFx0XHRpdGVtLmVycm9ySGFuZGxlcihlcnIpO1xuIFx0XHRcdFx0XHR9IGNhdGNoIChlcnIyKSB7XG4gXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25FcnJvcmVkKSB7XG4gXHRcdFx0XHRcdFx0XHRvcHRpb25zLm9uRXJyb3JlZCh7XG4gXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwic2VsZi1hY2NlcHQtZXJyb3ItaGFuZGxlci1lcnJvcmVkXCIsXG4gXHRcdFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZCxcbiBcdFx0XHRcdFx0XHRcdFx0ZXJyb3I6IGVycjIsXG4gXHRcdFx0XHRcdFx0XHRcdG9yaWdpbmFsRXJyb3I6IGVyclxuIFx0XHRcdFx0XHRcdFx0fSk7XG4gXHRcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVFcnJvcmVkKSB7XG4gXHRcdFx0XHRcdFx0XHRpZiAoIWVycm9yKSBlcnJvciA9IGVycjI7XG4gXHRcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRcdGlmICghZXJyb3IpIGVycm9yID0gZXJyO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkVycm9yZWQpIHtcbiBcdFx0XHRcdFx0XHRvcHRpb25zLm9uRXJyb3JlZCh7XG4gXHRcdFx0XHRcdFx0XHR0eXBlOiBcInNlbGYtYWNjZXB0LWVycm9yZWRcIixcbiBcdFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZCxcbiBcdFx0XHRcdFx0XHRcdGVycm9yOiBlcnJcbiBcdFx0XHRcdFx0XHR9KTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRpZiAoIW9wdGlvbnMuaWdub3JlRXJyb3JlZCkge1xuIFx0XHRcdFx0XHRcdGlmICghZXJyb3IpIGVycm9yID0gZXJyO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHR9XG4gXHRcdFx0fVxuIFx0XHR9XG5cbiBcdFx0Ly8gaGFuZGxlIGVycm9ycyBpbiBhY2NlcHQgaGFuZGxlcnMgYW5kIHNlbGYgYWNjZXB0ZWQgbW9kdWxlIGxvYWRcbiBcdFx0aWYgKGVycm9yKSB7XG4gXHRcdFx0aG90U2V0U3RhdHVzKFwiZmFpbFwiKTtcbiBcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuIFx0XHR9XG5cbiBcdFx0aG90U2V0U3RhdHVzKFwiaWRsZVwiKTtcbiBcdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiBcdFx0XHRyZXNvbHZlKG91dGRhdGVkTW9kdWxlcyk7XG4gXHRcdH0pO1xuIFx0fVxuXG4gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRob3Q6IGhvdENyZWF0ZU1vZHVsZShtb2R1bGVJZCksXG4gXHRcdFx0cGFyZW50czogKGhvdEN1cnJlbnRQYXJlbnRzVGVtcCA9IGhvdEN1cnJlbnRQYXJlbnRzLCBob3RDdXJyZW50UGFyZW50cyA9IFtdLCBob3RDdXJyZW50UGFyZW50c1RlbXApLFxuIFx0XHRcdGNoaWxkcmVuOiBbXVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBob3RDcmVhdGVSZXF1aXJlKG1vZHVsZUlkKSk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJkaXN0XCI7XG5cbiBcdC8vIF9fd2VicGFja19oYXNoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18uaCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gaG90Q3VycmVudEhhc2g7IH07XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gaG90Q3JlYXRlUmVxdWlyZShcIi4vc3JjL2pzL2luZGV4LmpzXCIpKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvanMvaW5kZXguanNcIik7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggYXQgd2hpY2ggYSBnaXZlbiBlbGVtZW50IGNhbiBiZSBmb3VuZCBpbiB0aGUgYXJyYXkuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vdHlwZS9pc0FycmF5Jyk7XG5cbi8qKlxuICogQG1vZHVsZSBhcnJheVxuICovXG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggYXQgd2hpY2ggYSBnaXZlbiBlbGVtZW50IGNhbiBiZSBmb3VuZCBpbiB0aGUgYXJyYXlcbiAqIGZyb20gc3RhcnQgaW5kZXgoZGVmYXVsdCAwKSwgb3IgLTEgaWYgaXQgaXMgbm90IHByZXNlbnQuXG4gKiBJdCBjb21wYXJlcyBzZWFyY2hFbGVtZW50IHRvIGVsZW1lbnRzIG9mIHRoZSBBcnJheSB1c2luZyBzdHJpY3QgZXF1YWxpdHlcbiAqICh0aGUgc2FtZSBtZXRob2QgdXNlZCBieSB0aGUgPT09LCBvciB0cmlwbGUtZXF1YWxzLCBvcGVyYXRvcikuXG4gKiBAcGFyYW0geyp9IHNlYXJjaEVsZW1lbnQgRWxlbWVudCB0byBsb2NhdGUgaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBBcnJheSB0aGF0IHdpbGwgYmUgdHJhdmVyc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0SW5kZXggU3RhcnQgaW5kZXggaW4gYXJyYXkgZm9yIHNlYXJjaGluZyAoZGVmYXVsdCAwKVxuICogQHJldHVybnMge251bWJlcn0gdGhlIEZpcnN0IGluZGV4IGF0IHdoaWNoIGEgZ2l2ZW4gZWxlbWVudCwgb3IgLTEgaWYgaXQgaXMgbm90IHByZXNlbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6YXJyYXlcbiAqIEBleGFtcGxlXG4gKiB2YXIgaW5BcnJheSA9IHJlcXVpcmUoJ3R1aS1jb2RlLXNuaXBwZXQvYXJyYXkvaW5BcnJheScpOyAvLyBub2RlLCBjb21tb25qc1xuICpcbiAqIHZhciBhcnIgPSBbJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91ciddO1xuICogdmFyIGlkeDEgPSBpbkFycmF5KCdvbmUnLCBhcnIsIDMpOyAvLyAtMVxuICogdmFyIGlkeDIgPSBpbkFycmF5KCdvbmUnLCBhcnIpOyAvLyAwXG4gKi9cbmZ1bmN0aW9uIGluQXJyYXkoc2VhcmNoRWxlbWVudCwgYXJyYXksIHN0YXJ0SW5kZXgpIHtcbiAgICB2YXIgaTtcbiAgICB2YXIgbGVuZ3RoO1xuICAgIHN0YXJ0SW5kZXggPSBzdGFydEluZGV4IHx8IDA7XG5cbiAgICBpZiAoIWlzQXJyYXkoYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYXJyYXksIHNlYXJjaEVsZW1lbnQsIHN0YXJ0SW5kZXgpO1xuICAgIH1cblxuICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICBmb3IgKGkgPSBzdGFydEluZGV4OyBzdGFydEluZGV4ID49IDAgJiYgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChhcnJheVtpXSA9PT0gc2VhcmNoRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5BcnJheTtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBFeGVjdXRlIHRoZSBwcm92aWRlZCBjYWxsYmFjayBvbmNlIGZvciBlYWNoIHByb3BlcnR5IG9mIG9iamVjdChvciBlbGVtZW50IG9mIGFycmF5KSB3aGljaCBhY3R1YWxseSBleGlzdC5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi90eXBlL2lzQXJyYXknKTtcbnZhciBmb3JFYWNoQXJyYXkgPSByZXF1aXJlKCcuLi9jb2xsZWN0aW9uL2ZvckVhY2hBcnJheScpO1xudmFyIGZvckVhY2hPd25Qcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbi9mb3JFYWNoT3duUHJvcGVydGllcycpO1xuXG4vKipcbiAqIEBtb2R1bGUgY29sbGVjdGlvblxuICovXG5cbi8qKlxuICogRXhlY3V0ZSB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgb25jZSBmb3IgZWFjaCBwcm9wZXJ0eSBvZiBvYmplY3Qob3IgZWxlbWVudCBvZiBhcnJheSkgd2hpY2ggYWN0dWFsbHkgZXhpc3QuXG4gKiBJZiB0aGUgb2JqZWN0IGlzIEFycmF5LWxpa2Ugb2JqZWN0KGV4LWFyZ3VtZW50cyBvYmplY3QpLCBJdCBuZWVkcyB0byB0cmFuc2Zvcm0gdG8gQXJyYXkuKHNlZSAnZXgyJyBvZiBleGFtcGxlKS5cbiAqIElmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgbG9vcCB3aWxsIGJlIHN0b3BwZWQuXG4gKiBDYWxsYmFjayBmdW5jdGlvbihpdGVyYXRlZSkgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICAtIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkob3IgVGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50KVxuICogIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5KG9yIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudClcbiAqICAtIFRoZSBvYmplY3QgYmVpbmcgdHJhdmVyc2VkXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIHRyYXZlcnNlZFxuICogQHBhcmFtIHtmdW5jdGlvbn0gaXRlcmF0ZWUgQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dF0gQ29udGV4dCh0aGlzKSBvZiBjYWxsYmFjayBmdW5jdGlvblxuICogQG1lbWJlcm9mIG1vZHVsZTpjb2xsZWN0aW9uXG4gKiBAZXhhbXBsZVxuICogdmFyIGZvckVhY2ggPSByZXF1aXJlKCd0dWktY29kZS1zbmlwcGV0L2NvbGxlY3Rpb24vZm9yRWFjaCcpOyAvLyBub2RlLCBjb21tb25qc1xuICpcbiAqIHZhciBzdW0gPSAwO1xuICpcbiAqIGZvckVhY2goWzEsMiwzXSwgZnVuY3Rpb24odmFsdWUpe1xuICogICAgIHN1bSArPSB2YWx1ZTtcbiAqIH0pO1xuICogYWxlcnQoc3VtKTsgLy8gNlxuICpcbiAqIC8vIEluIGNhc2Ugb2YgQXJyYXktbGlrZSBvYmplY3RcbiAqIHZhciBhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFycmF5TGlrZSk7IC8vIGNoYW5nZSB0byBhcnJheVxuICogZm9yRWFjaChhcnJheSwgZnVuY3Rpb24odmFsdWUpe1xuICogICAgIHN1bSArPSB2YWx1ZTtcbiAqIH0pO1xuICovXG5mdW5jdGlvbiBmb3JFYWNoKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgIGZvckVhY2hBcnJheShvYmosIGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3JFYWNoT3duUHJvcGVydGllcyhvYmosIGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaDtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBFeGVjdXRlIHRoZSBwcm92aWRlZCBjYWxsYmFjayBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkob3IgQXJyYXktbGlrZSBvYmplY3QpIGluIGFzY2VuZGluZyBvcmRlci5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBFeGVjdXRlIHRoZSBwcm92aWRlZCBjYWxsYmFjayBvbmNlIGZvciBlYWNoIGVsZW1lbnQgcHJlc2VudFxuICogaW4gdGhlIGFycmF5KG9yIEFycmF5LWxpa2Ugb2JqZWN0KSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gKiBJZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIGxvb3Agd2lsbCBiZSBzdG9wcGVkLlxuICogQ2FsbGJhY2sgZnVuY3Rpb24oaXRlcmF0ZWUpIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAgLSBUaGUgdmFsdWUgb2YgdGhlIGVsZW1lbnRcbiAqICAtIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudFxuICogIC0gVGhlIGFycmF5KG9yIEFycmF5LWxpa2Ugb2JqZWN0KSBiZWluZyB0cmF2ZXJzZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGFyciBUaGUgYXJyYXkob3IgQXJyYXktbGlrZSBvYmplY3QpIHRoYXQgd2lsbCBiZSB0cmF2ZXJzZWRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGl0ZXJhdGVlIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdIENvbnRleHQodGhpcykgb2YgY2FsbGJhY2sgZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29sbGVjdGlvblxuICogQGV4YW1wbGVcbiAqIHZhciBmb3JFYWNoQXJyYXkgPSByZXF1aXJlKCd0dWktY29kZS1zbmlwcGV0L2NvbGxlY3Rpb24vZm9yRWFjaEFycmF5Jyk7IC8vIG5vZGUsIGNvbW1vbmpzXG4gKlxuICogdmFyIHN1bSA9IDA7XG4gKlxuICogZm9yRWFjaEFycmF5KFsxLDIsM10sIGZ1bmN0aW9uKHZhbHVlKXtcbiAqICAgICBzdW0gKz0gdmFsdWU7XG4gKiB9KTtcbiAqIGFsZXJ0KHN1bSk7IC8vIDZcbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEFycmF5KGFyciwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gICAgY29udGV4dCA9IGNvbnRleHQgfHwgbnVsbDtcblxuICAgIGZvciAoOyBpbmRleCA8IGxlbjsgaW5kZXggKz0gMSkge1xuICAgICAgICBpZiAoaXRlcmF0ZWUuY2FsbChjb250ZXh0LCBhcnJbaW5kZXhdLCBpbmRleCwgYXJyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2hBcnJheTtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBFeGVjdXRlIHRoZSBwcm92aWRlZCBjYWxsYmFjayBvbmNlIGZvciBlYWNoIHByb3BlcnR5IG9mIG9iamVjdCB3aGljaCBhY3R1YWxseSBleGlzdC5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBFeGVjdXRlIHRoZSBwcm92aWRlZCBjYWxsYmFjayBvbmNlIGZvciBlYWNoIHByb3BlcnR5IG9mIG9iamVjdCB3aGljaCBhY3R1YWxseSBleGlzdC5cbiAqIElmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgbG9vcCB3aWxsIGJlIHN0b3BwZWQuXG4gKiBDYWxsYmFjayBmdW5jdGlvbihpdGVyYXRlZSkgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICAtIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHlcbiAqICAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eVxuICogIC0gVGhlIG9iamVjdCBiZWluZyB0cmF2ZXJzZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgdHJhdmVyc2VkXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBpdGVyYXRlZSAgQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dF0gQ29udGV4dCh0aGlzKSBvZiBjYWxsYmFjayBmdW5jdGlvblxuICogQG1lbWJlcm9mIG1vZHVsZTpjb2xsZWN0aW9uXG4gKiBAZXhhbXBsZVxuICogdmFyIGZvckVhY2hPd25Qcm9wZXJ0aWVzID0gcmVxdWlyZSgndHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL2ZvckVhY2hPd25Qcm9wZXJ0aWVzJyk7IC8vIG5vZGUsIGNvbW1vbmpzXG4gKlxuICogdmFyIHN1bSA9IDA7XG4gKlxuICogZm9yRWFjaE93blByb3BlcnRpZXMoe2E6MSxiOjIsYzozfSwgZnVuY3Rpb24odmFsdWUpe1xuICogICAgIHN1bSArPSB2YWx1ZTtcbiAqIH0pO1xuICogYWxlcnQoc3VtKTsgLy8gNlxuICovXG5mdW5jdGlvbiBmb3JFYWNoT3duUHJvcGVydGllcyhvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgdmFyIGtleTtcblxuICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IG51bGw7XG5cbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBpZiAoaXRlcmF0ZWUuY2FsbChjb250ZXh0LCBvYmpba2V5XSwga2V5LCBvYmopID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2hPd25Qcm9wZXJ0aWVzO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFRyYW5zZm9ybSB0aGUgQXJyYXktbGlrZSBvYmplY3QgdG8gQXJyYXkuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBmb3JFYWNoQXJyYXkgPSByZXF1aXJlKCcuL2ZvckVhY2hBcnJheScpO1xuXG4vKipcbiAqIFRyYW5zZm9ybSB0aGUgQXJyYXktbGlrZSBvYmplY3QgdG8gQXJyYXkuXG4gKiBJbiBsb3cgSUUgKGJlbG93IDgpLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCBpcyBub3QgcGVyZmVjdC4gU28sIHRyeS1jYXRjaCBzdGF0ZW1lbnQgaXMgdXNlZC5cbiAqIEBwYXJhbSB7Kn0gYXJyYXlMaWtlIEFycmF5LWxpa2Ugb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbGxlY3Rpb25cbiAqIEBleGFtcGxlXG4gKiB2YXIgdG9BcnJheSA9IHJlcXVpcmUoJ3R1aS1jb2RlLXNuaXBwZXQvY29sbGVjdGlvbi90b0FycmF5Jyk7IC8vIG5vZGUsIGNvbW1vbmpzXG4gKlxuICogdmFyIGFycmF5TGlrZSA9IHtcbiAqICAgICAwOiAnb25lJyxcbiAqICAgICAxOiAndHdvJyxcbiAqICAgICAyOiAndGhyZWUnLFxuICogICAgIDM6ICdmb3VyJyxcbiAqICAgICBsZW5ndGg6IDRcbiAqIH07XG4gKiB2YXIgcmVzdWx0ID0gdG9BcnJheShhcnJheUxpa2UpO1xuICpcbiAqIGFsZXJ0KHJlc3VsdCBpbnN0YW5jZW9mIEFycmF5KTsgLy8gdHJ1ZVxuICogYWxlcnQocmVzdWx0KTsgLy8gb25lLHR3byx0aHJlZSxmb3VyXG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkoYXJyYXlMaWtlKSB7XG4gICAgdmFyIGFycjtcbiAgICB0cnkge1xuICAgICAgICBhcnIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcnJheUxpa2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXJyID0gW107XG4gICAgICAgIGZvckVhY2hBcnJheShhcnJheUxpa2UsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBhcnIucHVzaCh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9BcnJheTtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBUaGlzIG1vZHVsZSBwcm92aWRlcyBzb21lIGZ1bmN0aW9ucyBmb3IgY3VzdG9tIGV2ZW50cy4gQW5kIGl0IGlzIGltcGxlbWVudGVkIGluIHRoZSBvYnNlcnZlciBkZXNpZ24gcGF0dGVybi5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGV4dGVuZCA9IHJlcXVpcmUoJy4uL29iamVjdC9leHRlbmQnKTtcbnZhciBpc0V4aXN0eSA9IHJlcXVpcmUoJy4uL3R5cGUvaXNFeGlzdHknKTtcbnZhciBpc1N0cmluZyA9IHJlcXVpcmUoJy4uL3R5cGUvaXNTdHJpbmcnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL3R5cGUvaXNPYmplY3QnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vdHlwZS9pc0FycmF5Jyk7XG52YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL3R5cGUvaXNGdW5jdGlvbicpO1xudmFyIGZvckVhY2ggPSByZXF1aXJlKCcuLi9jb2xsZWN0aW9uL2ZvckVhY2gnKTtcblxudmFyIFJfRVZFTlROQU1FX1NQTElUID0gL1xccysvZztcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiAvLyBub2RlLCBjb21tb25qc1xuICogdmFyIEN1c3RvbUV2ZW50cyA9IHJlcXVpcmUoJ3R1aS1jb2RlLXNuaXBwZXQvY3VzdG9tRXZlbnRzL2N1c3RvbUV2ZW50cycpO1xuICovXG5mdW5jdGlvbiBDdXN0b21FdmVudHMoKSB7XG4gICAgLyoqXG4gICAgICogQHR5cGUge0hhbmRsZXJJdGVtW119XG4gICAgICovXG4gICAgdGhpcy5ldmVudHMgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogb25seSBmb3IgY2hlY2tpbmcgc3BlY2lmaWMgY29udGV4dCBldmVudCB3YXMgYmluZGVkXG4gICAgICogQHR5cGUge29iamVjdFtdfVxuICAgICAqL1xuICAgIHRoaXMuY29udGV4dHMgPSBudWxsO1xufVxuXG4vKipcbiAqIE1peGluIGN1c3RvbSBldmVudHMgZmVhdHVyZSB0byBzcGVjaWZpYyBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtmdW5jdGlvbn0gZnVuYyAtIGNvbnN0cnVjdG9yXG4gKiBAZXhhbXBsZVxuICogdmFyIEN1c3RvbUV2ZW50cyA9IHJlcXVpcmUoJ3R1aS1jb2RlLXNuaXBwZXQvY3VzdG9tRXZlbnRzL2N1c3RvbUV2ZW50cycpOyAvLyBub2RlLCBjb21tb25qc1xuICpcbiAqIHZhciBtb2RlbDtcbiAqIGZ1bmN0aW9uIE1vZGVsKCkge1xuICogICAgIHRoaXMubmFtZSA9ICcnO1xuICogfVxuICogQ3VzdG9tRXZlbnRzLm1peGluKE1vZGVsKTtcbiAqXG4gKiBtb2RlbCA9IG5ldyBNb2RlbCgpO1xuICogbW9kZWwub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyB0aGlzLm5hbWUgPSAnbW9kZWwnOyB9LCB0aGlzKTtcbiAqIG1vZGVsLmZpcmUoJ2NoYW5nZScpO1xuICogYWxlcnQobW9kZWwubmFtZSk7IC8vICdtb2RlbCc7XG4gKi9cbkN1c3RvbUV2ZW50cy5taXhpbiA9IGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICBleHRlbmQoZnVuYy5wcm90b3R5cGUsIEN1c3RvbUV2ZW50cy5wcm90b3R5cGUpO1xufTtcblxuLyoqXG4gKiBHZXQgSGFuZGxlckl0ZW0gb2JqZWN0XG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBoYW5kbGVyIC0gaGFuZGxlciBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIGNvbnRleHQgZm9yIGhhbmRsZXJcbiAqIEByZXR1cm5zIHtIYW5kbGVySXRlbX0gSGFuZGxlckl0ZW0gb2JqZWN0XG4gKiBAcHJpdmF0ZVxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLl9nZXRIYW5kbGVySXRlbSA9IGZ1bmN0aW9uKGhhbmRsZXIsIGNvbnRleHQpIHtcbiAgICB2YXIgaXRlbSA9IHtoYW5kbGVyOiBoYW5kbGVyfTtcblxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICAgIGl0ZW0uY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW07XG59O1xuXG4vKipcbiAqIEdldCBldmVudCBvYmplY3Qgc2FmZWx5XG4gKiBAcGFyYW0ge3N0cmluZ30gW2V2ZW50TmFtZV0gLSBjcmVhdGUgc3ViIGV2ZW50IG1hcCBpZiBub3QgZXhpc3QuXG4gKiBAcmV0dXJucyB7KG9iamVjdHxhcnJheSl9IGV2ZW50IG9iamVjdC4gaWYgeW91IHN1cHBsaWVkIGBldmVudE5hbWVgXG4gKiAgcGFyYW1ldGVyIHRoZW4gbWFrZSBuZXcgYXJyYXkgYW5kIHJldHVybiBpdFxuICogQHByaXZhdGVcbiAqL1xuQ3VzdG9tRXZlbnRzLnByb3RvdHlwZS5fc2FmZUV2ZW50ID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgdmFyIGV2ZW50cyA9IHRoaXMuZXZlbnRzO1xuICAgIHZhciBieU5hbWU7XG5cbiAgICBpZiAoIWV2ZW50cykge1xuICAgICAgICBldmVudHMgPSB0aGlzLmV2ZW50cyA9IHt9O1xuICAgIH1cblxuICAgIGlmIChldmVudE5hbWUpIHtcbiAgICAgICAgYnlOYW1lID0gZXZlbnRzW2V2ZW50TmFtZV07XG5cbiAgICAgICAgaWYgKCFieU5hbWUpIHtcbiAgICAgICAgICAgIGJ5TmFtZSA9IFtdO1xuICAgICAgICAgICAgZXZlbnRzW2V2ZW50TmFtZV0gPSBieU5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBldmVudHMgPSBieU5hbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50cztcbn07XG5cbi8qKlxuICogR2V0IGNvbnRleHQgYXJyYXkgc2FmZWx5XG4gKiBAcmV0dXJucyB7YXJyYXl9IGNvbnRleHQgYXJyYXlcbiAqIEBwcml2YXRlXG4gKi9cbkN1c3RvbUV2ZW50cy5wcm90b3R5cGUuX3NhZmVDb250ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHRzO1xuXG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQgPSB0aGlzLmNvbnRleHRzID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG59O1xuXG4vKipcbiAqIEdldCBpbmRleCBvZiBjb250ZXh0XG4gKiBAcGFyYW0ge29iamVjdH0gY3R4IC0gY29udGV4dCB0aGF0IHVzZWQgZm9yIGJpbmQgY3VzdG9tIGV2ZW50XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBpbmRleCBvZiBjb250ZXh0XG4gKiBAcHJpdmF0ZVxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLl9pbmRleE9mQ29udGV4dCA9IGZ1bmN0aW9uKGN0eCkge1xuICAgIHZhciBjb250ZXh0ID0gdGhpcy5fc2FmZUNvbnRleHQoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuXG4gICAgd2hpbGUgKGNvbnRleHRbaW5kZXhdKSB7XG4gICAgICAgIGlmIChjdHggPT09IGNvbnRleHRbaW5kZXhdWzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiAtMTtcbn07XG5cbi8qKlxuICogTWVtb3JpemUgc3VwcGxpZWQgY29udGV4dCBmb3IgcmVjb2duaXplIHN1cHBsaWVkIG9iamVjdCBpcyBjb250ZXh0IG9yXG4gKiAgbmFtZTogaGFuZGxlciBwYWlyIG9iamVjdCB3aGVuIG9mZigpXG4gKiBAcGFyYW0ge29iamVjdH0gY3R4IC0gY29udGV4dCBvYmplY3QgdG8gbWVtb3JpemVcbiAqIEBwcml2YXRlXG4gKi9cbkN1c3RvbUV2ZW50cy5wcm90b3R5cGUuX21lbW9yaXplQ29udGV4dCA9IGZ1bmN0aW9uKGN0eCkge1xuICAgIHZhciBjb250ZXh0LCBpbmRleDtcblxuICAgIGlmICghaXNFeGlzdHkoY3R4KSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29udGV4dCA9IHRoaXMuX3NhZmVDb250ZXh0KCk7XG4gICAgaW5kZXggPSB0aGlzLl9pbmRleE9mQ29udGV4dChjdHgpO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgY29udGV4dFtpbmRleF1bMV0gKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0LnB1c2goW2N0eCwgMV0pO1xuICAgIH1cbn07XG5cbi8qKlxuICogRm9yZ2V0IHN1cHBsaWVkIGNvbnRleHQgb2JqZWN0XG4gKiBAcGFyYW0ge29iamVjdH0gY3R4IC0gY29udGV4dCBvYmplY3QgdG8gZm9yZ2V0XG4gKiBAcHJpdmF0ZVxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLl9mb3JnZXRDb250ZXh0ID0gZnVuY3Rpb24oY3R4KSB7XG4gICAgdmFyIGNvbnRleHQsIGNvbnRleHRJbmRleDtcblxuICAgIGlmICghaXNFeGlzdHkoY3R4KSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29udGV4dCA9IHRoaXMuX3NhZmVDb250ZXh0KCk7XG4gICAgY29udGV4dEluZGV4ID0gdGhpcy5faW5kZXhPZkNvbnRleHQoY3R4KTtcblxuICAgIGlmIChjb250ZXh0SW5kZXggPiAtMSkge1xuICAgICAgICBjb250ZXh0W2NvbnRleHRJbmRleF1bMV0gLT0gMTtcblxuICAgICAgICBpZiAoY29udGV4dFtjb250ZXh0SW5kZXhdWzFdIDw9IDApIHtcbiAgICAgICAgICAgIGNvbnRleHQuc3BsaWNlKGNvbnRleHRJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vKipcbiAqIEJpbmQgZXZlbnQgaGFuZGxlclxuICogQHBhcmFtIHsoc3RyaW5nfHtuYW1lOnN0cmluZywgaGFuZGxlcjpmdW5jdGlvbn0pfSBldmVudE5hbWUgLSBjdXN0b21cbiAqICBldmVudCBuYW1lIG9yIGFuIG9iamVjdCB7ZXZlbnROYW1lOiBoYW5kbGVyfVxuICogQHBhcmFtIHsoZnVuY3Rpb258b2JqZWN0KX0gW2hhbmRsZXJdIC0gaGFuZGxlciBmdW5jdGlvbiBvciBjb250ZXh0XG4gKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gY29udGV4dCBmb3IgYmluZGluZ1xuICogQHByaXZhdGVcbiAqL1xuQ3VzdG9tRXZlbnRzLnByb3RvdHlwZS5fYmluZEV2ZW50ID0gZnVuY3Rpb24oZXZlbnROYW1lLCBoYW5kbGVyLCBjb250ZXh0KSB7XG4gICAgdmFyIGV2ZW50cyA9IHRoaXMuX3NhZmVFdmVudChldmVudE5hbWUpO1xuICAgIHRoaXMuX21lbW9yaXplQ29udGV4dChjb250ZXh0KTtcbiAgICBldmVudHMucHVzaCh0aGlzLl9nZXRIYW5kbGVySXRlbShoYW5kbGVyLCBjb250ZXh0KSk7XG59O1xuXG4vKipcbiAqIEJpbmQgZXZlbnQgaGFuZGxlcnNcbiAqIEBwYXJhbSB7KHN0cmluZ3x7bmFtZTpzdHJpbmcsIGhhbmRsZXI6ZnVuY3Rpb259KX0gZXZlbnROYW1lIC0gY3VzdG9tXG4gKiAgZXZlbnQgbmFtZSBvciBhbiBvYmplY3Qge2V2ZW50TmFtZTogaGFuZGxlcn1cbiAqIEBwYXJhbSB7KGZ1bmN0aW9ufG9iamVjdCl9IFtoYW5kbGVyXSAtIGhhbmRsZXIgZnVuY3Rpb24gb3IgY29udGV4dFxuICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIGNvbnRleHQgZm9yIGJpbmRpbmdcbiAqIC8vLS0gIzEuIEdldCBNb2R1bGUgLS0vL1xuICogdmFyIEN1c3RvbUV2ZW50cyA9IHJlcXVpcmUoJ3R1aS1jb2RlLXNuaXBwZXQvY3VzdG9tRXZlbnRzL2N1c3RvbUV2ZW50cycpOyAvLyBub2RlLCBjb21tb25qc1xuICpcbiAqIC8vLS0gIzIuIFVzZSBtZXRob2QgLS0vL1xuICogLy8gIyAyLjEgQmFzaWMgVXNhZ2VcbiAqIEN1c3RvbUV2ZW50cy5vbignb25sb2FkJywgaGFuZGxlcik7XG4gKlxuICogLy8gIyAyLjIgV2l0aCBjb250ZXh0XG4gKiBDdXN0b21FdmVudHMub24oJ29ubG9hZCcsIGhhbmRsZXIsIG15T2JqKTtcbiAqXG4gKiAvLyAjIDIuMyBCaW5kIGJ5IG9iamVjdCB0aGF0IG5hbWUsIGhhbmRsZXIgcGFpcnNcbiAqIEN1c3RvbUV2ZW50cy5vbih7XG4gKiAgICAgJ3BsYXknOiBoYW5kbGVyLFxuICogICAgICdwYXVzZSc6IGhhbmRsZXIyXG4gKiB9KTtcbiAqXG4gKiAvLyAjIDIuNCBCaW5kIGJ5IG9iamVjdCB0aGF0IG5hbWUsIGhhbmRsZXIgcGFpcnMgd2l0aCBjb250ZXh0IG9iamVjdFxuICogQ3VzdG9tRXZlbnRzLm9uKHtcbiAqICAgICAncGxheSc6IGhhbmRsZXJcbiAqIH0sIG15T2JqKTtcbiAqL1xuQ3VzdG9tRXZlbnRzLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgaGFuZGxlciwgY29udGV4dCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGlmIChpc1N0cmluZyhldmVudE5hbWUpKSB7XG4gICAgICAgIC8vIFtzeW50YXggMSwgMl1cbiAgICAgICAgZXZlbnROYW1lID0gZXZlbnROYW1lLnNwbGl0KFJfRVZFTlROQU1FX1NQTElUKTtcbiAgICAgICAgZm9yRWFjaChldmVudE5hbWUsIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgIHNlbGYuX2JpbmRFdmVudChuYW1lLCBoYW5kbGVyLCBjb250ZXh0KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChldmVudE5hbWUpKSB7XG4gICAgICAgIC8vIFtzeW50YXggMywgNF1cbiAgICAgICAgY29udGV4dCA9IGhhbmRsZXI7XG4gICAgICAgIGZvckVhY2goZXZlbnROYW1lLCBmdW5jdGlvbihmdW5jLCBuYW1lKSB7XG4gICAgICAgICAgICBzZWxmLm9uKG5hbWUsIGZ1bmMsIGNvbnRleHQpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEJpbmQgb25lLXNob3QgZXZlbnQgaGFuZGxlcnNcbiAqIEBwYXJhbSB7KHN0cmluZ3x7bmFtZTpzdHJpbmcsaGFuZGxlcjpmdW5jdGlvbn0pfSBldmVudE5hbWUgLSBjdXN0b21cbiAqICBldmVudCBuYW1lIG9yIGFuIG9iamVjdCB7ZXZlbnROYW1lOiBoYW5kbGVyfVxuICogQHBhcmFtIHtmdW5jdGlvbnxvYmplY3R9IFtoYW5kbGVyXSAtIGhhbmRsZXIgZnVuY3Rpb24gb3IgY29udGV4dFxuICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIGNvbnRleHQgZm9yIGJpbmRpbmdcbiAqL1xuQ3VzdG9tRXZlbnRzLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24oZXZlbnROYW1lLCBoYW5kbGVyLCBjb250ZXh0KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKGlzT2JqZWN0KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgY29udGV4dCA9IGhhbmRsZXI7XG4gICAgICAgIGZvckVhY2goZXZlbnROYW1lLCBmdW5jdGlvbihmdW5jLCBuYW1lKSB7XG4gICAgICAgICAgICBzZWxmLm9uY2UobmFtZSwgZnVuYywgY29udGV4dCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmNlSGFuZGxlcigpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWpzZG9jXG4gICAgICAgIGhhbmRsZXIuYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICAgICAgc2VsZi5vZmYoZXZlbnROYW1lLCBvbmNlSGFuZGxlciwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgdGhpcy5vbihldmVudE5hbWUsIG9uY2VIYW5kbGVyLCBjb250ZXh0KTtcbn07XG5cbi8qKlxuICogU3BsaWNlIHN1cHBsaWVkIGFycmF5IGJ5IGNhbGxiYWNrIHJlc3VsdFxuICogQHBhcmFtIHthcnJheX0gYXJyIC0gYXJyYXkgdG8gc3BsaWNlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBwcmVkaWNhdGUgLSBmdW5jdGlvbiByZXR1cm4gYm9vbGVhblxuICogQHByaXZhdGVcbiAqL1xuQ3VzdG9tRXZlbnRzLnByb3RvdHlwZS5fc3BsaWNlTWF0Y2hlcyA9IGZ1bmN0aW9uKGFyciwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBsZW47XG5cbiAgICBpZiAoIWlzQXJyYXkoYXJyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZW4gPSBhcnIubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZShhcnJbaV0pID09PSB0cnVlKSB7XG4gICAgICAgICAgICBhcnIuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgbGVuIC09IDE7XG4gICAgICAgICAgICBpIC09IDE7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vKipcbiAqIEdldCBtYXRjaGVyIGZvciB1bmJpbmQgc3BlY2lmaWMgaGFuZGxlciBldmVudHNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXIgLSBoYW5kbGVyIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IGhhbmRsZXIgbWF0Y2hlclxuICogQHByaXZhdGVcbiAqL1xuQ3VzdG9tRXZlbnRzLnByb3RvdHlwZS5fbWF0Y2hIYW5kbGVyID0gZnVuY3Rpb24oaGFuZGxlcikge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHJldHVybiBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHZhciBuZWVkUmVtb3ZlID0gaGFuZGxlciA9PT0gaXRlbS5oYW5kbGVyO1xuXG4gICAgICAgIGlmIChuZWVkUmVtb3ZlKSB7XG4gICAgICAgICAgICBzZWxmLl9mb3JnZXRDb250ZXh0KGl0ZW0uY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmVlZFJlbW92ZTtcbiAgICB9O1xufTtcblxuLyoqXG4gKiBHZXQgbWF0Y2hlciBmb3IgdW5iaW5kIHNwZWNpZmljIGNvbnRleHQgZXZlbnRzXG4gKiBAcGFyYW0ge29iamVjdH0gY29udGV4dCAtIGNvbnRleHRcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gb2JqZWN0IG1hdGNoZXJcbiAqIEBwcml2YXRlXG4gKi9cbkN1c3RvbUV2ZW50cy5wcm90b3R5cGUuX21hdGNoQ29udGV4dCA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICB2YXIgbmVlZFJlbW92ZSA9IGNvbnRleHQgPT09IGl0ZW0uY29udGV4dDtcblxuICAgICAgICBpZiAobmVlZFJlbW92ZSkge1xuICAgICAgICAgICAgc2VsZi5fZm9yZ2V0Q29udGV4dChpdGVtLmNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5lZWRSZW1vdmU7XG4gICAgfTtcbn07XG5cbi8qKlxuICogR2V0IG1hdGNoZXIgZm9yIHVuYmluZCBzcGVjaWZpYyBoYW5kZXIsIGNvbnRleHQgcGFpciBldmVudHNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXIgLSBoYW5kbGVyIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gY29udGV4dCAtIGNvbnRleHRcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gaGFuZGxlciwgY29udGV4dCBtYXRjaGVyXG4gKiBAcHJpdmF0ZVxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLl9tYXRjaEhhbmRsZXJBbmRDb250ZXh0ID0gZnVuY3Rpb24oaGFuZGxlciwgY29udGV4dCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHJldHVybiBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHZhciBtYXRjaEhhbmRsZXIgPSAoaGFuZGxlciA9PT0gaXRlbS5oYW5kbGVyKTtcbiAgICAgICAgdmFyIG1hdGNoQ29udGV4dCA9IChjb250ZXh0ID09PSBpdGVtLmNvbnRleHQpO1xuICAgICAgICB2YXIgbmVlZFJlbW92ZSA9IChtYXRjaEhhbmRsZXIgJiYgbWF0Y2hDb250ZXh0KTtcblxuICAgICAgICBpZiAobmVlZFJlbW92ZSkge1xuICAgICAgICAgICAgc2VsZi5fZm9yZ2V0Q29udGV4dChpdGVtLmNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5lZWRSZW1vdmU7XG4gICAgfTtcbn07XG5cbi8qKlxuICogVW5iaW5kIGV2ZW50IGJ5IGV2ZW50IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBjdXN0b20gZXZlbnQgbmFtZSB0byB1bmJpbmRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtoYW5kbGVyXSAtIGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwcml2YXRlXG4gKi9cbkN1c3RvbUV2ZW50cy5wcm90b3R5cGUuX29mZkJ5RXZlbnROYW1lID0gZnVuY3Rpb24oZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBhbmRCeUhhbmRsZXIgPSBpc0Z1bmN0aW9uKGhhbmRsZXIpO1xuICAgIHZhciBtYXRjaEhhbmRsZXIgPSBzZWxmLl9tYXRjaEhhbmRsZXIoaGFuZGxlcik7XG5cbiAgICBldmVudE5hbWUgPSBldmVudE5hbWUuc3BsaXQoUl9FVkVOVE5BTUVfU1BMSVQpO1xuXG4gICAgZm9yRWFjaChldmVudE5hbWUsIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgdmFyIGhhbmRsZXJJdGVtcyA9IHNlbGYuX3NhZmVFdmVudChuYW1lKTtcblxuICAgICAgICBpZiAoYW5kQnlIYW5kbGVyKSB7XG4gICAgICAgICAgICBzZWxmLl9zcGxpY2VNYXRjaGVzKGhhbmRsZXJJdGVtcywgbWF0Y2hIYW5kbGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvckVhY2goaGFuZGxlckl0ZW1zLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5fZm9yZ2V0Q29udGV4dChpdGVtLmNvbnRleHQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNlbGYuZXZlbnRzW25hbWVdID0gW107XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbi8qKlxuICogVW5iaW5kIGV2ZW50IGJ5IGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXIgLSBoYW5kbGVyIGZ1bmN0aW9uXG4gKiBAcHJpdmF0ZVxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLl9vZmZCeUhhbmRsZXIgPSBmdW5jdGlvbihoYW5kbGVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBtYXRjaEhhbmRsZXIgPSB0aGlzLl9tYXRjaEhhbmRsZXIoaGFuZGxlcik7XG5cbiAgICBmb3JFYWNoKHRoaXMuX3NhZmVFdmVudCgpLCBmdW5jdGlvbihoYW5kbGVySXRlbXMpIHtcbiAgICAgICAgc2VsZi5fc3BsaWNlTWF0Y2hlcyhoYW5kbGVySXRlbXMsIG1hdGNoSGFuZGxlcik7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIFVuYmluZCBldmVudCBieSBvYmplY3QobmFtZTogaGFuZGxlciBwYWlyIG9iamVjdCBvciBjb250ZXh0IG9iamVjdClcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmogLSBjb250ZXh0IG9yIHtuYW1lOiBoYW5kbGVyfSBwYWlyIG9iamVjdFxuICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlciAtIGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwcml2YXRlXG4gKi9cbkN1c3RvbUV2ZW50cy5wcm90b3R5cGUuX29mZkJ5T2JqZWN0ID0gZnVuY3Rpb24ob2JqLCBoYW5kbGVyKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBtYXRjaEZ1bmM7XG5cbiAgICBpZiAodGhpcy5faW5kZXhPZkNvbnRleHQob2JqKSA8IDApIHtcbiAgICAgICAgZm9yRWFjaChvYmosIGZ1bmN0aW9uKGZ1bmMsIG5hbWUpIHtcbiAgICAgICAgICAgIHNlbGYub2ZmKG5hbWUsIGZ1bmMpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKGhhbmRsZXIpKSB7XG4gICAgICAgIG1hdGNoRnVuYyA9IHRoaXMuX21hdGNoQ29udGV4dChvYmopO1xuXG4gICAgICAgIHNlbGYuX3NwbGljZU1hdGNoZXModGhpcy5fc2FmZUV2ZW50KGhhbmRsZXIpLCBtYXRjaEZ1bmMpO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgICAgICBtYXRjaEZ1bmMgPSB0aGlzLl9tYXRjaEhhbmRsZXJBbmRDb250ZXh0KGhhbmRsZXIsIG9iaik7XG5cbiAgICAgICAgZm9yRWFjaCh0aGlzLl9zYWZlRXZlbnQoKSwgZnVuY3Rpb24oaGFuZGxlckl0ZW1zKSB7XG4gICAgICAgICAgICBzZWxmLl9zcGxpY2VNYXRjaGVzKGhhbmRsZXJJdGVtcywgbWF0Y2hGdW5jKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbWF0Y2hGdW5jID0gdGhpcy5fbWF0Y2hDb250ZXh0KG9iaik7XG5cbiAgICAgICAgZm9yRWFjaCh0aGlzLl9zYWZlRXZlbnQoKSwgZnVuY3Rpb24oaGFuZGxlckl0ZW1zKSB7XG4gICAgICAgICAgICBzZWxmLl9zcGxpY2VNYXRjaGVzKGhhbmRsZXJJdGVtcywgbWF0Y2hGdW5jKTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBVbmJpbmQgY3VzdG9tIGV2ZW50c1xuICogQHBhcmFtIHsoc3RyaW5nfG9iamVjdHxmdW5jdGlvbil9IGV2ZW50TmFtZSAtIGV2ZW50IG5hbWUgb3IgY29udGV4dCBvclxuICogIHtuYW1lOiBoYW5kbGVyfSBwYWlyIG9iamVjdCBvciBoYW5kbGVyIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyhmdW5jdGlvbil9IGhhbmRsZXIgLSBoYW5kbGVyIGZ1bmN0aW9uXG4gKiBAZXhhbXBsZVxuICogLy8tLSAjMS4gR2V0IE1vZHVsZSAtLS8vXG4gKiB2YXIgQ3VzdG9tRXZlbnRzID0gcmVxdWlyZSgndHVpLWNvZGUtc25pcHBldC9jdXN0b21FdmVudHMvY3VzdG9tRXZlbnRzJyk7IC8vIG5vZGUsIGNvbW1vbmpzXG4gKlxuICogLy8tLSAjMi4gVXNlIG1ldGhvZCAtLS8vXG4gKiAvLyAjIDIuMSBvZmYgYnkgZXZlbnQgbmFtZVxuICogQ3VzdG9tRXZlbnRzLm9mZignb25sb2FkJyk7XG4gKlxuICogLy8gIyAyLjIgb2ZmIGJ5IGV2ZW50IG5hbWUgYW5kIGhhbmRsZXJcbiAqIEN1c3RvbUV2ZW50cy5vZmYoJ3BsYXknLCBoYW5kbGVyKTtcbiAqXG4gKiAvLyAjIDIuMyBvZmYgYnkgaGFuZGxlclxuICogQ3VzdG9tRXZlbnRzLm9mZihoYW5kbGVyKTtcbiAqXG4gKiAvLyAjIDIuNCBvZmYgYnkgY29udGV4dFxuICogQ3VzdG9tRXZlbnRzLm9mZihteU9iaik7XG4gKlxuICogLy8gIyAyLjUgb2ZmIGJ5IGNvbnRleHQgYW5kIGhhbmRsZXJcbiAqIEN1c3RvbUV2ZW50cy5vZmYobXlPYmosIGhhbmRsZXIpO1xuICpcbiAqIC8vICMgMi42IG9mZiBieSBjb250ZXh0IGFuZCBldmVudCBuYW1lXG4gKiBDdXN0b21FdmVudHMub2ZmKG15T2JqLCAnb25sb2FkJyk7XG4gKlxuICogLy8gIyAyLjcgb2ZmIGJ5IGFuIE9iamVjdC48c3RyaW5nLCBmdW5jdGlvbj4gdGhhdCBpcyB7ZXZlbnROYW1lOiBoYW5kbGVyfVxuICogQ3VzdG9tRXZlbnRzLm9mZih7XG4gKiAgICdwbGF5JzogaGFuZGxlcixcbiAqICAgJ3BhdXNlJzogaGFuZGxlcjJcbiAqIH0pO1xuICpcbiAqIC8vICMgMi44IG9mZiB0aGUgYWxsIGV2ZW50c1xuICogQ3VzdG9tRXZlbnRzLm9mZigpO1xuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgaGFuZGxlcikge1xuICAgIGlmIChpc1N0cmluZyhldmVudE5hbWUpKSB7XG4gICAgICAgIC8vIFtzeW50YXggMSwgMl1cbiAgICAgICAgdGhpcy5fb2ZmQnlFdmVudE5hbWUoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICB9IGVsc2UgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFtzeW50YXggOF1cbiAgICAgICAgdGhpcy5ldmVudHMgPSB7fTtcbiAgICAgICAgdGhpcy5jb250ZXh0cyA9IFtdO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihldmVudE5hbWUpKSB7XG4gICAgICAgIC8vIFtzeW50YXggM11cbiAgICAgICAgdGhpcy5fb2ZmQnlIYW5kbGVyKGV2ZW50TmFtZSk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChldmVudE5hbWUpKSB7XG4gICAgICAgIC8vIFtzeW50YXggNCwgNSwgNl1cbiAgICAgICAgdGhpcy5fb2ZmQnlPYmplY3QoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEZpcmUgY3VzdG9tIGV2ZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gbmFtZSBvZiBjdXN0b20gZXZlbnRcbiAqL1xuQ3VzdG9tRXZlbnRzLnByb3RvdHlwZS5maXJlID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgdGhpcy5pbnZva2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogRmlyZSBhIGV2ZW50IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2Ygb3BlcmF0aW9uICdib29sZWFuIEFORCcgd2l0aCBhbGxcbiAqICBsaXN0ZW5lcidzIHJlc3VsdHMuXG4gKlxuICogU28sIEl0IGlzIGRpZmZlcmVudCBmcm9tIHtAbGluayBDdXN0b21FdmVudHMjZmlyZX0uXG4gKlxuICogSW4gc2VydmljZSBjb2RlLCB1c2UgdGhpcyBhcyBhIGJlZm9yZSBldmVudCBpbiBjb21wb25lbnQgbGV2ZWwgdXN1YWxseVxuICogIGZvciBub3RpZnlpbmcgdGhhdCB0aGUgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBDdXN0b20gZXZlbnQgbmFtZVxuICogQHBhcmFtIHsuLi4qfSBkYXRhIC0gRGF0YSBmb3IgZXZlbnRcbiAqIEByZXR1cm5zIHtib29sZWFufSBUaGUgcmVzdWx0IG9mIG9wZXJhdGlvbiAnYm9vbGVhbiBBTkQnXG4gKiBAZXhhbXBsZVxuICogdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAqIG1hcC5vbih7XG4gKiAgICAgJ2JlZm9yZVpvb20nOiBmdW5jdGlvbigpIHtcbiAqICAgICAgICAgLy8gSXQgc2hvdWxkIGNhbmNlbCB0aGUgJ3pvb20nIGV2ZW50IGJ5IHNvbWUgY29uZGl0aW9ucy5cbiAqICAgICAgICAgaWYgKHRoYXQuZGlzYWJsZWQgJiYgdGhpcy5nZXRTdGF0ZSgpKSB7XG4gKiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gKiAgICAgICAgIH1cbiAqICAgICAgICAgcmV0dXJuIHRydWU7XG4gKiAgICAgfVxuICogfSk7XG4gKlxuICogaWYgKHRoaXMuaW52b2tlKCdiZWZvcmVab29tJykpIHsgICAgLy8gY2hlY2sgdGhlIHJlc3VsdCBvZiAnYmVmb3JlWm9vbSdcbiAqICAgICAvLyBpZiB0cnVlLFxuICogICAgIC8vIGRvU29tZXRoaW5nXG4gKiB9XG4gKi9cbkN1c3RvbUV2ZW50cy5wcm90b3R5cGUuaW52b2tlID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgdmFyIGV2ZW50cywgYXJncywgaW5kZXgsIGl0ZW07XG5cbiAgICBpZiAoIXRoaXMuaGFzTGlzdGVuZXIoZXZlbnROYW1lKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBldmVudHMgPSB0aGlzLl9zYWZlRXZlbnQoZXZlbnROYW1lKTtcbiAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICBpbmRleCA9IDA7XG5cbiAgICB3aGlsZSAoZXZlbnRzW2luZGV4XSkge1xuICAgICAgICBpdGVtID0gZXZlbnRzW2luZGV4XTtcblxuICAgICAgICBpZiAoaXRlbS5oYW5kbGVyLmFwcGx5KGl0ZW0uY29udGV4dCwgYXJncykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciBhdCBsZWFzdCBvbmUgb2YgdGhlIGhhbmRsZXJzIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIGdpdmVuXG4gKiAgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBDdXN0b20gZXZlbnQgbmFtZVxuICogQHJldHVybnMge2Jvb2xlYW59IElzIHRoZXJlIGF0IGxlYXN0IG9uZSBoYW5kbGVyIGluIGV2ZW50IG5hbWU/XG4gKi9cbkN1c3RvbUV2ZW50cy5wcm90b3R5cGUuaGFzTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxlbmd0aChldmVudE5hbWUpID4gMDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGEgY291bnQgb2YgZXZlbnRzIHJlZ2lzdGVyZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gQ3VzdG9tIGV2ZW50IG5hbWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IG51bWJlciBvZiBldmVudFxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLmdldExpc3RlbmVyTGVuZ3RoID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgdmFyIGV2ZW50cyA9IHRoaXMuX3NhZmVFdmVudChldmVudE5hbWUpO1xuXG4gICAgcmV0dXJuIGV2ZW50cy5sZW5ndGg7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEN1c3RvbUV2ZW50cztcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBHZXQgZXZlbnQgY29sbGVjdGlvbiBmb3Igc3BlY2lmaWMgSFRNTCBlbGVtZW50XG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFVkVOVF9LRVkgPSAnX2ZlRXZlbnRLZXknO1xuXG4vKipcbiAqIEdldCBldmVudCBjb2xsZWN0aW9uIGZvciBzcGVjaWZpYyBIVE1MIGVsZW1lbnRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBIVE1MIGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gZXZlbnQgdHlwZVxuICogQHJldHVybnMge2FycmF5fVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2FmZUV2ZW50KGVsZW1lbnQsIHR5cGUpIHtcbiAgICB2YXIgZXZlbnRzID0gZWxlbWVudFtFVkVOVF9LRVldO1xuICAgIHZhciBoYW5kbGVycztcblxuICAgIGlmICghZXZlbnRzKSB7XG4gICAgICAgIGV2ZW50cyA9IGVsZW1lbnRbRVZFTlRfS0VZXSA9IHt9O1xuICAgIH1cblxuICAgIGhhbmRsZXJzID0gZXZlbnRzW3R5cGVdO1xuICAgIGlmICghaGFuZGxlcnMpIHtcbiAgICAgICAgaGFuZGxlcnMgPSBldmVudHNbdHlwZV0gPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlcnM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2FmZUV2ZW50O1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEdldCBhIHRhcmdldCBlbGVtZW50IGZyb20gYW4gZXZlbnQgb2JqZWN0LlxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEdldCBhIHRhcmdldCBlbGVtZW50IGZyb20gYW4gZXZlbnQgb2JqZWN0LlxuICogQHBhcmFtIHtFdmVudH0gZSAtIGV2ZW50IG9iamVjdFxuICogQHJldHVybnMge0hUTUxFbGVtZW50fSAtIHRhcmdldCBlbGVtZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmRvbUV2ZW50XG4gKi9cbmZ1bmN0aW9uIGdldFRhcmdldChlKSB7XG4gICAgcmV0dXJuIGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRUYXJnZXQ7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgVW5iaW5kIERPTSBldmVudHNcbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzU3RyaW5nID0gcmVxdWlyZSgnLi4vdHlwZS9pc1N0cmluZycpO1xudmFyIGZvckVhY2ggPSByZXF1aXJlKCcuLi9jb2xsZWN0aW9uL2ZvckVhY2gnKTtcblxudmFyIHNhZmVFdmVudCA9IHJlcXVpcmUoJy4vX3NhZmVFdmVudCcpO1xuXG4vKipcbiAqIFVuYmluZCBET00gZXZlbnRzXG4gKiBJZiBhIGhhbmRsZXIgZnVuY3Rpb24gaXMgbm90IHBhc3NlZCwgcmVtb3ZlIGFsbCBldmVudHMgb2YgdGhhdCB0eXBlLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIGVsZW1lbnQgdG8gdW5iaW5kYmluZCBldmVudHNcbiAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSB0eXBlcyAtIFNwYWNlIHNwbGl0dGVkIGV2ZW50cyBuYW1lcyBvclxuICogIGV2ZW50TmFtZTpoYW5kbGVyIG9iamVjdFxuICogQHBhcmFtIHtmdW5jdGlvbn0gW2hhbmRsZXJdIC0gaGFuZGxlciBmdW5jdGlvblxuICogQG1lbWJlcm9mIG1vZHVsZTpkb21FdmVudFxuICovXG5mdW5jdGlvbiBvZmYoZWxlbWVudCwgdHlwZXMsIGhhbmRsZXIpIHtcbiAgICBpZiAoaXNTdHJpbmcodHlwZXMpKSB7XG4gICAgICAgIGZvckVhY2godHlwZXMuc3BsaXQoL1xccysvZyksIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgICAgIHVuYmluZEV2ZW50KGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yRWFjaCh0eXBlcywgZnVuY3Rpb24oZnVuYywgdHlwZSkge1xuICAgICAgICB1bmJpbmRFdmVudChlbGVtZW50LCB0eXBlLCBmdW5jKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBVbmJpbmQgRE9NIGV2ZW50c1xuICogSWYgYSBoYW5kbGVyIGZ1bmN0aW9uIGlzIG5vdCBwYXNzZWQsIHJlbW92ZSBhbGwgZXZlbnRzIG9mIHRoYXQgdHlwZS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBlbGVtZW50IHRvIHVuYmluZCBldmVudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gZXZlbnRzIG5hbWVcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtoYW5kbGVyXSAtIGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHVuYmluZEV2ZW50KGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIpIHtcbiAgICB2YXIgZXZlbnRzID0gc2FmZUV2ZW50KGVsZW1lbnQsIHR5cGUpO1xuICAgIHZhciBpbmRleDtcblxuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICBmb3JFYWNoKGV2ZW50cywgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCB0eXBlLCBpdGVtLndyYXBwZWRIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGV2ZW50cy5zcGxpY2UoMCwgZXZlbnRzLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yRWFjaChldmVudHMsIGZ1bmN0aW9uKGl0ZW0sIGlkeCkge1xuICAgICAgICAgICAgaWYgKGhhbmRsZXIgPT09IGl0ZW0uaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgdHlwZSwgaXRlbS53cmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpZHg7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgZXZlbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSBhbiBldmVudCBoYW5kbGVyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gQW4gZWxlbWVudCB0byByZW1vdmUgYW4gZXZlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gZXZlbnQgdHlwZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlciAtIGV2ZW50IGhhbmRsZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgdHlwZSwgaGFuZGxlcikge1xuICAgIGlmICgncmVtb3ZlRXZlbnRMaXN0ZW5lcicgaW4gZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlcik7XG4gICAgfSBlbHNlIGlmICgnZGV0YWNoRXZlbnQnIGluIGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5kZXRhY2hFdmVudCgnb24nICsgdHlwZSwgaGFuZGxlcik7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9mZjtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBCaW5kIERPTSBldmVudHNcbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzU3RyaW5nID0gcmVxdWlyZSgnLi4vdHlwZS9pc1N0cmluZycpO1xudmFyIGZvckVhY2ggPSByZXF1aXJlKCcuLi9jb2xsZWN0aW9uL2ZvckVhY2gnKTtcblxudmFyIHNhZmVFdmVudCA9IHJlcXVpcmUoJy4vX3NhZmVFdmVudCcpO1xuXG4vKipcbiAqIEJpbmQgRE9NIGV2ZW50c1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIGVsZW1lbnQgdG8gYmluZCBldmVudHNcbiAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSB0eXBlcyAtIFNwYWNlIHNwbGl0dGVkIGV2ZW50cyBuYW1lcyBvclxuICogIGV2ZW50TmFtZTpoYW5kbGVyIG9iamVjdFxuICogQHBhcmFtIHsoZnVuY3Rpb258b2JqZWN0KX0gaGFuZGxlciAtIGhhbmRsZXIgZnVuY3Rpb24gb3IgY29udGV4dCBmb3IgaGFuZGxlclxuICogIG1ldGhvZFxuICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSBjb250ZXh0IC0gY29udGV4dCBmb3IgaGFuZGxlciBtZXRob2QuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmRvbUV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uKGVsZW1lbnQsIHR5cGVzLCBoYW5kbGVyLCBjb250ZXh0KSB7XG4gICAgaWYgKGlzU3RyaW5nKHR5cGVzKSkge1xuICAgICAgICBmb3JFYWNoKHR5cGVzLnNwbGl0KC9cXHMrL2cpLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgICAgICBiaW5kRXZlbnQoZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgY29udGV4dCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3JFYWNoKHR5cGVzLCBmdW5jdGlvbihmdW5jLCB0eXBlKSB7XG4gICAgICAgIGJpbmRFdmVudChlbGVtZW50LCB0eXBlLCBmdW5jLCBoYW5kbGVyKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCaW5kIERPTSBldmVudHNcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBlbGVtZW50IHRvIGJpbmQgZXZlbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIGV2ZW50cyBuYW1lXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBoYW5kbGVyIC0gaGFuZGxlciBmdW5jdGlvbiBvciBjb250ZXh0IGZvciBoYW5kbGVyXG4gKiAgbWV0aG9kXG4gKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIGNvbnRleHQgLSBjb250ZXh0IGZvciBoYW5kbGVyIG1ldGhvZC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGJpbmRFdmVudChlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBjb250ZXh0KSB7XG4gICAgLyoqXG4gICAgICogRXZlbnQgaGFuZGxlclxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGUgLSBldmVudCBvYmplY3RcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBldmVudEhhbmRsZXIoZSkge1xuICAgICAgICBoYW5kbGVyLmNhbGwoY29udGV4dCB8fCBlbGVtZW50LCBlIHx8IHdpbmRvdy5ldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKCdhZGRFdmVudExpc3RlbmVyJyBpbiBlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEhhbmRsZXIpO1xuICAgIH0gZWxzZSBpZiAoJ2F0dGFjaEV2ZW50JyBpbiBlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuYXR0YWNoRXZlbnQoJ29uJyArIHR5cGUsIGV2ZW50SGFuZGxlcik7XG4gICAgfVxuICAgIG1lbW9yaXplSGFuZGxlcihlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBldmVudEhhbmRsZXIpO1xufVxuXG4vKipcbiAqIE1lbW9yaXplIERPTSBldmVudCBoYW5kbGVyIGZvciB1bmJpbmRpbmcuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gZWxlbWVudCB0byBiaW5kIGV2ZW50c1xuICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBldmVudHMgbmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlciAtIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB1c2VyIHBhc3NlZCBhdCBvbigpIHVzZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gd3JhcHBlZEhhbmRsZXIgLSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgd3JhcHBlZCBieSBkb21ldmVudCBmb3IgaW1wbGVtZW50aW5nIHNvbWUgZmVhdHVyZXNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG1lbW9yaXplSGFuZGxlcihlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCB3cmFwcGVkSGFuZGxlcikge1xuICAgIHZhciBldmVudHMgPSBzYWZlRXZlbnQoZWxlbWVudCwgdHlwZSk7XG4gICAgdmFyIGV4aXN0SW5FdmVudHMgPSBmYWxzZTtcblxuICAgIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbihvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYW5kbGVyID09PSBoYW5kbGVyKSB7XG4gICAgICAgICAgICBleGlzdEluRXZlbnRzID0gdHJ1ZTtcblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBpZiAoIWV4aXN0SW5FdmVudHMpIHtcbiAgICAgICAgZXZlbnRzLnB1c2goe1xuICAgICAgICAgICAgaGFuZGxlcjogaGFuZGxlcixcbiAgICAgICAgICAgIHdyYXBwZWRIYW5kbGVyOiB3cmFwcGVkSGFuZGxlclxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb247XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgUHJldmVudCBkZWZhdWx0IGFjdGlvblxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFByZXZlbnQgZGVmYXVsdCBhY3Rpb25cbiAqIEBwYXJhbSB7RXZlbnR9IGUgLSBldmVudCBvYmplY3RcbiAqIEBtZW1iZXJvZiBtb2R1bGU6ZG9tRXZlbnRcbiAqL1xuZnVuY3Rpb24gcHJldmVudERlZmF1bHQoZSkge1xuICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHByZXZlbnREZWZhdWx0O1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFNldCBjbGFzc05hbWUgdmFsdWVcbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi90eXBlL2lzQXJyYXknKTtcbnZhciBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL3R5cGUvaXNVbmRlZmluZWQnKTtcblxuLyoqXG4gKiBTZXQgY2xhc3NOYW1lIHZhbHVlXG4gKiBAcGFyYW0geyhIVE1MRWxlbWVudHxTVkdFbGVtZW50KX0gZWxlbWVudCAtIHRhcmdldCBlbGVtZW50XG4gKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSBjc3NDbGFzcyAtIGNsYXNzIG5hbWVzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXRDbGFzc05hbWUoZWxlbWVudCwgY3NzQ2xhc3MpIHtcbiAgICBjc3NDbGFzcyA9IGlzQXJyYXkoY3NzQ2xhc3MpID8gY3NzQ2xhc3Muam9pbignICcpIDogY3NzQ2xhc3M7XG5cbiAgICBjc3NDbGFzcyA9IGNzc0NsYXNzLnJlcGxhY2UoL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLCAnJyk7XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoZWxlbWVudC5jbGFzc05hbWUuYmFzZVZhbCkpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBjc3NDbGFzcztcblxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZWxlbWVudC5jbGFzc05hbWUuYmFzZVZhbCA9IGNzc0NsYXNzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENsYXNzTmFtZTtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBBZGQgY3NzIGNsYXNzIHRvIGVsZW1lbnRcbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGZvckVhY2ggPSByZXF1aXJlKCcuLi9jb2xsZWN0aW9uL2ZvckVhY2gnKTtcbnZhciBpbkFycmF5ID0gcmVxdWlyZSgnLi4vYXJyYXkvaW5BcnJheScpO1xudmFyIGdldENsYXNzID0gcmVxdWlyZSgnLi9nZXRDbGFzcycpO1xudmFyIHNldENsYXNzTmFtZSA9IHJlcXVpcmUoJy4vX3NldENsYXNzTmFtZScpO1xuXG4vKipcbiAqIGRvbVV0aWwgbW9kdWxlXG4gKiBAbW9kdWxlIGRvbVV0aWxcbiAqL1xuXG4vKipcbiAqIEFkZCBjc3MgY2xhc3MgdG8gZWxlbWVudFxuICogQHBhcmFtIHsoSFRNTEVsZW1lbnR8U1ZHRWxlbWVudCl9IGVsZW1lbnQgLSB0YXJnZXQgZWxlbWVudFxuICogQHBhcmFtIHsuLi5zdHJpbmd9IGNzc0NsYXNzIC0gY3NzIGNsYXNzZXMgdG8gYWRkXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmRvbVV0aWxcbiAqL1xuZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudCkge1xuICAgIHZhciBjc3NDbGFzcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgdmFyIGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICAgIHZhciBuZXdDbGFzcyA9IFtdO1xuICAgIHZhciBvcmlnaW47XG5cbiAgICBpZiAoY2xhc3NMaXN0KSB7XG4gICAgICAgIGZvckVhY2goY3NzQ2xhc3MsIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChuYW1lKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG9yaWdpbiA9IGdldENsYXNzKGVsZW1lbnQpO1xuXG4gICAgaWYgKG9yaWdpbikge1xuICAgICAgICBjc3NDbGFzcyA9IFtdLmNvbmNhdChvcmlnaW4uc3BsaXQoL1xccysvKSwgY3NzQ2xhc3MpO1xuICAgIH1cblxuICAgIGZvckVhY2goY3NzQ2xhc3MsIGZ1bmN0aW9uKGNscykge1xuICAgICAgICBpZiAoaW5BcnJheShjbHMsIG5ld0NsYXNzKSA8IDApIHtcbiAgICAgICAgICAgIG5ld0NsYXNzLnB1c2goY2xzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0Q2xhc3NOYW1lKGVsZW1lbnQsIG5ld0NsYXNzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhZGRDbGFzcztcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBGaW5kIHBhcmVudCBlbGVtZW50IHJlY3Vyc2l2ZWx5XG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBtYXRjaGVzID0gcmVxdWlyZSgnLi9tYXRjaGVzJyk7XG5cbi8qKlxuICogRmluZCBwYXJlbnQgZWxlbWVudCByZWN1cnNpdmVseVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIGJhc2UgZWxlbWVudCB0byBzdGFydCBmaW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBzZWxlY3RvciBzdHJpbmcgZm9yIGZpbmRcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gLSBlbGVtZW50IGZpbmRlZCBvciBudWxsXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmRvbVV0aWxcbiAqL1xuZnVuY3Rpb24gY2xvc2VzdChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIHZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG5cbiAgICBpZiAobWF0Y2hlcyhlbGVtZW50LCBzZWxlY3RvcikpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQgIT09IGRvY3VtZW50KSB7XG4gICAgICAgIGlmIChtYXRjaGVzKHBhcmVudCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvc2VzdDtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBHZXQgSFRNTCBlbGVtZW50J3MgZGVzaWduIGNsYXNzZXMuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL3R5cGUvaXNVbmRlZmluZWQnKTtcblxuLyoqXG4gKiBHZXQgSFRNTCBlbGVtZW50J3MgZGVzaWduIGNsYXNzZXMuXG4gKiBAcGFyYW0geyhIVE1MRWxlbWVudHxTVkdFbGVtZW50KX0gZWxlbWVudCB0YXJnZXQgZWxlbWVudFxuICogQHJldHVybnMge3N0cmluZ30gZWxlbWVudCBjc3MgY2xhc3MgbmFtZVxuICogQG1lbWJlcm9mIG1vZHVsZTpkb21VdGlsXG4gKi9cbmZ1bmN0aW9uIGdldENsYXNzKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuY2xhc3NOYW1lKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQoZWxlbWVudC5jbGFzc05hbWUuYmFzZVZhbCkpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTmFtZS5iYXNlVmFsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldENsYXNzO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IENoZWNrIGVsZW1lbnQgbWF0Y2ggc2VsZWN0b3JcbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGluQXJyYXkgPSByZXF1aXJlKCcuLi9hcnJheS9pbkFycmF5Jyk7XG52YXIgdG9BcnJheSA9IHJlcXVpcmUoJy4uL2NvbGxlY3Rpb24vdG9BcnJheScpO1xuXG52YXIgZWxQcm90byA9IEVsZW1lbnQucHJvdG90eXBlO1xudmFyIG1hdGNoU2VsZWN0b3IgPSBlbFByb3RvLm1hdGNoZXMgfHxcbiAgICBlbFByb3RvLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuICAgIGVsUHJvdG8ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgZWxQcm90by5tc01hdGNoZXNTZWxlY3RvciB8fFxuICAgIGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBkb2MgPSB0aGlzLmRvY3VtZW50IHx8IHRoaXMub3duZXJEb2N1bWVudDtcblxuICAgICAgICByZXR1cm4gaW5BcnJheSh0aGlzLCB0b0FycmF5KGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSkpID4gLTE7XG4gICAgfTtcblxuLyoqXG4gKiBDaGVjayBlbGVtZW50IG1hdGNoIHNlbGVjdG9yXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gZWxlbWVudCB0byBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gc2VsZWN0b3IgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufSBpcyBzZWxlY3RvciBtYXRjaGVkIHRvIGVsZW1lbnQ/XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmRvbVV0aWxcbiAqL1xuZnVuY3Rpb24gbWF0Y2hlcyhlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBtYXRjaFNlbGVjdG9yLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hdGNoZXM7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgUmVtb3ZlIGNzcyBjbGFzcyBmcm9tIGVsZW1lbnRcbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGZvckVhY2hBcnJheSA9IHJlcXVpcmUoJy4uL2NvbGxlY3Rpb24vZm9yRWFjaEFycmF5Jyk7XG52YXIgaW5BcnJheSA9IHJlcXVpcmUoJy4uL2FycmF5L2luQXJyYXknKTtcbnZhciBnZXRDbGFzcyA9IHJlcXVpcmUoJy4vZ2V0Q2xhc3MnKTtcbnZhciBzZXRDbGFzc05hbWUgPSByZXF1aXJlKCcuL19zZXRDbGFzc05hbWUnKTtcblxuLyoqXG4gKiBSZW1vdmUgY3NzIGNsYXNzIGZyb20gZWxlbWVudFxuICogQHBhcmFtIHsoSFRNTEVsZW1lbnR8U1ZHRWxlbWVudCl9IGVsZW1lbnQgLSB0YXJnZXQgZWxlbWVudFxuICogQHBhcmFtIHsuLi5zdHJpbmd9IGNzc0NsYXNzIC0gY3NzIGNsYXNzZXMgdG8gcmVtb3ZlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmRvbVV0aWxcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWxlbWVudCkge1xuICAgIHZhciBjc3NDbGFzcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgdmFyIGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICAgIHZhciBvcmlnaW4sIG5ld0NsYXNzO1xuXG4gICAgaWYgKGNsYXNzTGlzdCkge1xuICAgICAgICBmb3JFYWNoQXJyYXkoY3NzQ2xhc3MsIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgIGNsYXNzTGlzdC5yZW1vdmUobmFtZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcmlnaW4gPSBnZXRDbGFzcyhlbGVtZW50KS5zcGxpdCgvXFxzKy8pO1xuICAgIG5ld0NsYXNzID0gW107XG4gICAgZm9yRWFjaEFycmF5KG9yaWdpbiwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICBpZiAoaW5BcnJheShuYW1lLCBjc3NDbGFzcykgPCAwKSB7XG4gICAgICAgICAgICBuZXdDbGFzcy5wdXNoKG5hbWUpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBzZXRDbGFzc05hbWUoZWxlbWVudCwgbmV3Q2xhc3MpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlbW92ZUNsYXNzO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFJlbW92ZSBlbGVtZW50IGZyb20gcGFyZW50IG5vZGUuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUmVtb3ZlIGVsZW1lbnQgZnJvbSBwYXJlbnQgbm9kZS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBlbGVtZW50IHRvIHJlbW92ZS5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6ZG9tVXRpbFxuICovXG5mdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZW1vdmVFbGVtZW50O1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEV4dGVuZCB0aGUgdGFyZ2V0IG9iamVjdCBmcm9tIG90aGVyIG9iamVjdHMuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQG1vZHVsZSBvYmplY3RcbiAqL1xuXG4vKipcbiAqIEV4dGVuZCB0aGUgdGFyZ2V0IG9iamVjdCBmcm9tIG90aGVyIG9iamVjdHMuXG4gKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0IC0gT2JqZWN0IHRoYXQgd2lsbCBiZSBleHRlbmRlZFxuICogQHBhcmFtIHsuLi5vYmplY3R9IG9iamVjdHMgLSBPYmplY3RzIGFzIHNvdXJjZXNcbiAqIEByZXR1cm5zIHtvYmplY3R9IEV4dGVuZGVkIG9iamVjdFxuICogQG1lbWJlcm9mIG1vZHVsZTpvYmplY3RcbiAqL1xuZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgb2JqZWN0cykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIGhhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICAgIHZhciBzb3VyY2UsIHByb3AsIGksIGxlbjtcblxuICAgIGZvciAoaSA9IDEsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICAgIGZvciAocHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wLmNhbGwoc291cmNlLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXh0ZW5kO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFJlcXVlc3QgaW1hZ2UgcGluZy5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGZvckVhY2hPd25Qcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbi9mb3JFYWNoT3duUHJvcGVydGllcycpO1xuXG4vKipcbiAqIEBtb2R1bGUgcmVxdWVzdFxuICovXG5cbi8qKlxuICogUmVxdWVzdCBpbWFnZSBwaW5nLlxuICogQHBhcmFtIHtTdHJpbmd9IHVybCB1cmwgZm9yIHBpbmcgcmVxdWVzdFxuICogQHBhcmFtIHtPYmplY3R9IHRyYWNraW5nSW5mbyBpbmZvcyBmb3IgbWFrZSBxdWVyeSBzdHJpbmdcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6cmVxdWVzdFxuICogQGV4YW1wbGVcbiAqIHZhciBpbWFnZVBpbmcgPSByZXF1aXJlKCd0dWktY29kZS1zbmlwcGV0L3JlcXVlc3QvaW1hZ2VQaW5nJyk7IC8vIG5vZGUsIGNvbW1vbmpzXG4gKlxuICogaW1hZ2VQaW5nKCdodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9jb2xsZWN0Jywge1xuICogICAgIHY6IDEsXG4gKiAgICAgdDogJ2V2ZW50JyxcbiAqICAgICB0aWQ6ICd0cmFja2luZ2lkJyxcbiAqICAgICBjaWQ6ICdjaWQnLFxuICogICAgIGRwOiAnZHAnLFxuICogICAgIGRoOiAnZGgnXG4gKiB9KTtcbiAqL1xuZnVuY3Rpb24gaW1hZ2VQaW5nKHVybCwgdHJhY2tpbmdJbmZvKSB7XG4gICAgdmFyIHRyYWNraW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgIHZhciBxdWVyeVN0cmluZyA9ICcnO1xuICAgIGZvckVhY2hPd25Qcm9wZXJ0aWVzKHRyYWNraW5nSW5mbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgICBxdWVyeVN0cmluZyArPSAnJicgKyBrZXkgKyAnPScgKyB2YWx1ZTtcbiAgICB9KTtcbiAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nLnN1YnN0cmluZygxKTtcblxuICAgIHRyYWNraW5nRWxlbWVudC5zcmMgPSB1cmwgKyAnPycgKyBxdWVyeVN0cmluZztcblxuICAgIHRyYWNraW5nRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodHJhY2tpbmdFbGVtZW50KTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRyYWNraW5nRWxlbWVudCk7XG5cbiAgICByZXR1cm4gdHJhY2tpbmdFbGVtZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGltYWdlUGluZztcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBTZW5kIGhvc3RuYW1lIG9uIERPTUNvbnRlbnRMb2FkZWQuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL3R5cGUvaXNVbmRlZmluZWQnKTtcbnZhciBpbWFnZVBpbmcgPSByZXF1aXJlKCcuL2ltYWdlUGluZycpO1xuXG52YXIgbXM3ZGF5cyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBkYXRlIGhhcyBwYXNzZWQgNyBkYXlzXG4gKiBAcGFyYW0ge251bWJlcn0gZGF0ZSAtIG1pbGxpc2Vjb25kc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpc0V4cGlyZWQoZGF0ZSkge1xuICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAgIHJldHVybiBub3cgLSBkYXRlID4gbXM3ZGF5cztcbn1cblxuLyoqXG4gKiBTZW5kIGhvc3RuYW1lIG9uIERPTUNvbnRlbnRMb2FkZWQuXG4gKiBUbyBwcmV2ZW50IGhvc3RuYW1lIHNldCB0dWkudXNhZ2VTdGF0aXN0aWNzIHRvIGZhbHNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcE5hbWUgLSBhcHBsaWNhdGlvbiBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gdHJhY2tpbmdJZCAtIEdBIHRyYWNraW5nIElEXG4gKiBAaWdub3JlXG4gKi9cbmZ1bmN0aW9uIHNlbmRIb3N0bmFtZShhcHBOYW1lLCB0cmFja2luZ0lkKSB7XG4gICAgdmFyIHVybCA9ICdodHRwczovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9jb2xsZWN0JztcbiAgICB2YXIgaG9zdG5hbWUgPSBsb2NhdGlvbi5ob3N0bmFtZTtcbiAgICB2YXIgaGl0VHlwZSA9ICdldmVudCc7XG4gICAgdmFyIGV2ZW50Q2F0ZWdvcnkgPSAndXNlJztcbiAgICB2YXIgYXBwbGljYXRpb25LZXlGb3JTdG9yYWdlID0gJ1RPQVNUIFVJICcgKyBhcHBOYW1lICsgJyBmb3IgJyArIGhvc3RuYW1lICsgJzogU3RhdGlzdGljcyc7XG4gICAgdmFyIGRhdGUgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oYXBwbGljYXRpb25LZXlGb3JTdG9yYWdlKTtcblxuICAgIC8vIHNraXAgaWYgdGhlIGZsYWcgaXMgZGVmaW5lZCBhbmQgaXMgc2V0IHRvIGZhbHNlIGV4cGxpY2l0bHlcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHdpbmRvdy50dWkpICYmIHdpbmRvdy50dWkudXNhZ2VTdGF0aXN0aWNzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc2tpcCBpZiBub3QgcGFzcyBzZXZlbiBkYXlzIG9sZFxuICAgIGlmIChkYXRlICYmICFpc0V4cGlyZWQoZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShhcHBsaWNhdGlvbktleUZvclN0b3JhZ2UsIG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgICAgICAgIGltYWdlUGluZyh1cmwsIHtcbiAgICAgICAgICAgICAgICB2OiAxLFxuICAgICAgICAgICAgICAgIHQ6IGhpdFR5cGUsXG4gICAgICAgICAgICAgICAgdGlkOiB0cmFja2luZ0lkLFxuICAgICAgICAgICAgICAgIGNpZDogaG9zdG5hbWUsXG4gICAgICAgICAgICAgICAgZHA6IGhvc3RuYW1lLFxuICAgICAgICAgICAgICAgIGRoOiBhcHBOYW1lLFxuICAgICAgICAgICAgICAgIGVsOiBhcHBOYW1lLFxuICAgICAgICAgICAgICAgIGVjOiBldmVudENhdGVnb3J5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sIDEwMDApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbmRIb3N0bmFtZTtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhbiBpbnN0YW5jZSBvZiBBcnJheSBvciBub3QuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYW4gaW5zdGFuY2Ugb2YgQXJyYXkgb3Igbm90LlxuICogSWYgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGFuIGluc3RhbmNlIG9mIEFycmF5LCByZXR1cm4gdHJ1ZS5cbiAqIEBwYXJhbSB7Kn0gb2JqIC0gVGFyZ2V0IGZvciBjaGVja2luZ1xuICogQHJldHVybnMge2Jvb2xlYW59IElzIGFycmF5IGluc3RhbmNlP1xuICogQG1lbWJlcm9mIG1vZHVsZTp0eXBlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7XG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBzdHJpbmcgb3Igbm90LlxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiBvciBub3QuXG4gKiAgSWYgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiwgcmV0dXJuIHRydWUuXG4gKiBAcGFyYW0geyp9IG9iaiAtIFRhcmdldCBmb3IgY2hlY2tpbmdcbiAqIEByZXR1cm5zIHtib29sZWFufSBJcyBib29sZWFuP1xuICogQG1lbWJlcm9mIG1vZHVsZTp0eXBlXG4gKi9cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ2Jvb2xlYW4nIHx8IG9iaiBpbnN0YW5jZW9mIEJvb2xlYW47XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNCb29sZWFuO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGV4aXN0aW5nIG9yIG5vdC5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzVW5kZWZpbmVkID0gcmVxdWlyZSgnLi9pc1VuZGVmaW5lZCcpO1xudmFyIGlzTnVsbCA9IHJlcXVpcmUoJy4vaXNOdWxsJyk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgZXhpc3Rpbmcgb3Igbm90LlxuICogSWYgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIG5vdCBudWxsIGFuZCBub3QgdW5kZWZpbmVkLCByZXR1cm5zIHRydWUuXG4gKiBAcGFyYW0geyp9IHBhcmFtIC0gVGFyZ2V0IGZvciBjaGVja2luZ1xuICogQHJldHVybnMge2Jvb2xlYW59IElzIGV4aXN0eT9cbiAqIEBtZW1iZXJvZiBtb2R1bGU6dHlwZVxuICogQGV4YW1wbGVcbiAqIHZhciBpc0V4aXN0eSA9IHJlcXVpcmUoJ3R1aS1jb2RlLXNuaXBwZXQvdHlwZS9pc0V4aXN0eScpOyAvLyBub2RlLCBjb21tb25qc1xuICpcbiAqIGlzRXhpc3R5KCcnKTsgLy90cnVlXG4gKiBpc0V4aXN0eSgwKTsgLy90cnVlXG4gKiBpc0V4aXN0eShbXSk7IC8vdHJ1ZVxuICogaXNFeGlzdHkoe30pOyAvL3RydWVcbiAqIGlzRXhpc3R5KG51bGwpOyAvL2ZhbHNlXG4gKiBpc0V4aXN0eSh1bmRlZmluZWQpOyAvL2ZhbHNlXG4qL1xuZnVuY3Rpb24gaXNFeGlzdHkocGFyYW0pIHtcbiAgICByZXR1cm4gIWlzVW5kZWZpbmVkKHBhcmFtKSAmJiAhaXNOdWxsKHBhcmFtKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0V4aXN0eTtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhIGZ1bmN0aW9uIG9yIG5vdC5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhIGZ1bmN0aW9uIG9yIG5vdC5cbiAqIElmIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhIGZ1bmN0aW9uLCByZXR1cm4gdHJ1ZS5cbiAqIEBwYXJhbSB7Kn0gb2JqIC0gVGFyZ2V0IGZvciBjaGVja2luZ1xuICogQHJldHVybnMge2Jvb2xlYW59IElzIGZ1bmN0aW9uP1xuICogQG1lbWJlcm9mIG1vZHVsZTp0eXBlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqKSB7XG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb247XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBpbnN0YW5jZSBvZiBIVE1MTm9kZSBvciBub3QuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBpbnN0YW5jZSBvZiBIVE1MTm9kZSBvciBub3QuXG4gKiBJZiB0aGUgZ2l2ZW4gdmFyaWFibGVzIGlzIGEgaW5zdGFuY2Ugb2YgSFRNTE5vZGUsIHJldHVybiB0cnVlLlxuICogQHBhcmFtIHsqfSBodG1sIC0gVGFyZ2V0IGZvciBjaGVja2luZ1xuICogQHJldHVybnMge2Jvb2xlYW59IElzIEhUTUxOb2RlID9cbiAqIEBtZW1iZXJvZiBtb2R1bGU6dHlwZVxuICovXG5mdW5jdGlvbiBpc0hUTUxOb2RlKGh0bWwpIHtcbiAgICBpZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gKGh0bWwgJiYgKGh0bWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCAhIWh0bWwubm9kZVR5cGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gISEoaHRtbCAmJiBodG1sLm5vZGVUeXBlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0hUTUxOb2RlO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIG51bGwgb3Igbm90LlxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIG51bGwgb3Igbm90LlxuICogSWYgdGhlIGdpdmVuIHZhcmlhYmxlKGFyZ3VtZW50c1swXSkgaXMgbnVsbCwgcmV0dXJucyB0cnVlLlxuICogQHBhcmFtIHsqfSBvYmogLSBUYXJnZXQgZm9yIGNoZWNraW5nXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gSXMgbnVsbD9cbiAqIEBtZW1iZXJvZiBtb2R1bGU6dHlwZVxuICovXG5mdW5jdGlvbiBpc051bGwob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc051bGw7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBudW1iZXIgb3Igbm90LlxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGEgbnVtYmVyIG9yIG5vdC5cbiAqIElmIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhIG51bWJlciwgcmV0dXJuIHRydWUuXG4gKiBAcGFyYW0geyp9IG9iaiAtIFRhcmdldCBmb3IgY2hlY2tpbmdcbiAqIEByZXR1cm5zIHtib29sZWFufSBJcyBudW1iZXI/XG4gKiBAbWVtYmVyb2YgbW9kdWxlOnR5cGVcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdudW1iZXInIHx8IG9iaiBpbnN0YW5jZW9mIE51bWJlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc051bWJlcjtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhbiBvYmplY3Qgb3Igbm90LlxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGFuIG9iamVjdCBvciBub3QuXG4gKiBJZiB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYW4gb2JqZWN0LCByZXR1cm4gdHJ1ZS5cbiAqIEBwYXJhbSB7Kn0gb2JqIC0gVGFyZ2V0IGZvciBjaGVja2luZ1xuICogQHJldHVybnMge2Jvb2xlYW59IElzIG9iamVjdD9cbiAqIEBtZW1iZXJvZiBtb2R1bGU6dHlwZVxuICovXG5mdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSBPYmplY3Qob2JqKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhIHN0cmluZyBvciBub3QuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBzdHJpbmcgb3Igbm90LlxuICogSWYgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGEgc3RyaW5nLCByZXR1cm4gdHJ1ZS5cbiAqIEBwYXJhbSB7Kn0gb2JqIC0gVGFyZ2V0IGZvciBjaGVja2luZ1xuICogQHJldHVybnMge2Jvb2xlYW59IElzIHN0cmluZz9cbiAqIEBtZW1iZXJvZiBtb2R1bGU6dHlwZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyhvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHwgb2JqIGluc3RhbmNlb2YgU3RyaW5nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaW5nO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCBvciBub3QuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgdW5kZWZpbmVkIG9yIG5vdC5cbiAqIElmIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHJldHVybnMgdHJ1ZS5cbiAqIEBwYXJhbSB7Kn0gb2JqIC0gVGFyZ2V0IGZvciBjaGVja2luZ1xuICogQHJldHVybnMge2Jvb2xlYW59IElzIHVuZGVmaW5lZD9cbiAqIEBtZW1iZXJvZiBtb2R1bGU6dHlwZVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZpbmVkXG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNVbmRlZmluZWQ7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgVGhlIHN0YXRpYyB2YWx1ZXNcbiAqIEBhdXRob3IgTkhOLiBGRSBkZXYgdGVhbS48ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbmltcG9ydCBmb3JFYWNoT3duUHJvcGVydGllcyBmcm9tICd0dWktY29kZS1zbmlwcGV0L2NvbGxlY3Rpb24vZm9yRWFjaE93blByb3BlcnRpZXMnO1xuXG5jb25zdCBDU1NfUFJFRklYID0gJ3R1aS1zZWxlY3QtYm94JztcblxuY29uc3QgY2xhc3NOYW1lcyA9IHtcbiAgU0VMRUNUX0JPWDogJycsXG4gIElURU06ICdpdGVtJyxcbiAgSVRFTV9HUk9VUDogJ2l0ZW0tZ3JvdXAnLFxuICBJVEVNX0dST1VQX0xBQkVMOiAnaXRlbS1ncm91cC1sYWJlbCcsXG4gIERST1BET1dOOiAnZHJvcGRvd24nLFxuICBJTlBVVDogJ2lucHV0JyxcbiAgUExBQ0VIT0xERVI6ICdwbGFjZWhvbGRlcicsXG4gIElDT046ICdpY29uJyxcbiAgT1BFTjogJ29wZW4nLFxuICBISURERU46ICdoaWRkZW4nLFxuICBESVNBQkxFRDogJ2Rpc2FibGVkJyxcbiAgU0VMRUNURUQ6ICdzZWxlY3RlZCcsXG4gIEhJR0hMSUdIVDogJ2hpZ2hsaWdodCdcbn07XG5cbmV4cG9ydCBjb25zdCBjbHMgPSAoZnVuY3Rpb24oKSB7XG4gIGZvckVhY2hPd25Qcm9wZXJ0aWVzKGNsYXNzTmFtZXMsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBjbGFzc05hbWVzW2tleV0gPSBgJHtDU1NfUFJFRklYfS0ke3ZhbHVlfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsYXNzTmFtZXNba2V5XSA9IENTU19QUkVGSVg7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY2xhc3NOYW1lcztcbn0pKCk7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgRHJvcGRvd25cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbmltcG9ydCBmb3JFYWNoQXJyYXkgZnJvbSAndHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL2ZvckVhY2hBcnJheSc7XG5pbXBvcnQgaXNFeGlzdHkgZnJvbSAndHVpLWNvZGUtc25pcHBldC90eXBlL2lzRXhpc3R5JztcbmltcG9ydCBpc051bWJlciBmcm9tICd0dWktY29kZS1zbmlwcGV0L3R5cGUvaXNOdW1iZXInO1xuaW1wb3J0IGFkZENsYXNzIGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9hZGRDbGFzcyc7XG5pbXBvcnQgcmVtb3ZlQ2xhc3MgZnJvbSAndHVpLWNvZGUtc25pcHBldC9kb21VdGlsL3JlbW92ZUNsYXNzJztcbmltcG9ydCByZW1vdmVFbGVtZW50IGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9yZW1vdmVFbGVtZW50JztcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGNscyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBJdGVtR3JvdXAgZnJvbSAnLi9pdGVtR3JvdXAnO1xuaW1wb3J0IEl0ZW0gZnJvbSAnLi9pdGVtJztcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICogICBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucGxhY2Vob2xkZXJdIC0gcGxhY2Vob2xkZXIgZm9yIGFuIGlucHV0XG4gKiAgIEBwYXJhbSB7YXJyYXk8aXRlbURhdGF8aXRlbUdyb3VwRGF0YT59IG9wdGlvbnMuZGF0YSAtIGRhdGEgZm9yIEl0ZW1Hcm91cHMgYW5kIEl0ZW1zXG4gKiAgIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlzYWJsZWQ9ZmFsc2VdIC0gd2hldGhlciBhIGRyb3Bkb3duIHNob3VsZCBiZSBkaXNhYmxlZCBvciBub3RcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJvcGRvd24ge1xuICBjb25zdHJ1Y3Rvcih7IHBsYWNlaG9sZGVyLCBkYXRhLCBkaXNhYmxlZCA9IGZhbHNlIH0pIHtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmVsID0gY3JlYXRlRWxlbWVudCgndWwnLCAnJywgeyBjbGFzc05hbWU6IGAke2Nscy5EUk9QRE9XTn0gJHtjbHMuSElEREVOfWAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLm5hdGl2ZUVsID0gY3JlYXRlRWxlbWVudCgnc2VsZWN0JywgJycsIHsgY2xhc3NOYW1lOiBjbHMuSElEREVOLCB0YWJJbmRleDogLTEgfSk7XG5cbiAgICAvKipcbiAgICAgKiBJdGVtcyBhbmQgSXRlbUdyb3Vwc1xuICAgICAqIEB0eXBlIHtBcnJheS48SXRlbXxJdGVtR3JvdXA+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pdGVtcyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogdGhlIG51bWJlciBvZiBJdGVtXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaXRlbUxlbmd0aCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5oaWdobGlnaHRlZEl0ZW0gPSBudWxsO1xuXG4gICAgdGhpcy5pbml0aWFsaXplKGRhdGEsIGRpc2FibGVkLCBwbGFjZWhvbGRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEl0ZW1zIGFuZCBJdGVtR3JvdXBzIGFuZCBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBJdGVtc1xuICAgKiBAcmV0dXJuIHthcnJheTxJdGVtfEl0ZW1Hcm91cD59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0aWFsaXplSXRlbXMoZGF0YSkge1xuICAgIGxldCBpdGVtO1xuICAgIGxldCBpdGVtSW5kZXggPSAwO1xuICAgIGxldCBpdGVtR3JvdXBJbmRleCA9IDA7XG4gICAgZGF0YS5mb3JFYWNoKGRhdHVtID0+IHtcbiAgICAgIGlmIChkYXR1bS5kYXRhKSB7XG4gICAgICAgIGl0ZW0gPSBuZXcgSXRlbUdyb3VwKHsgaW5kZXg6IGl0ZW1JbmRleCwgaXRlbUdyb3VwSW5kZXgsIC4uLmRhdHVtIH0pO1xuICAgICAgICBpdGVtSW5kZXggKz0gZGF0dW0uZGF0YS5sZW5ndGggLSAxO1xuICAgICAgICBpdGVtR3JvdXBJbmRleCArPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbSA9IG5ldyBJdGVtKHsgaW5kZXg6IGl0ZW1JbmRleCwgLi4uZGF0dW0gfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIGl0ZW0uYXBwZW5kVG9Db250YWluZXIodGhpcy5lbCwgdGhpcy5uYXRpdmVFbCk7XG4gICAgICBpdGVtSW5kZXggKz0gMTtcbiAgICB9KTtcblxuICAgIHRoaXMuaXRlbUxlbmd0aCA9IGl0ZW1JbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0aWFsaXplKGRhdGEsIGRpc2FibGVkLCBwbGFjZWhvbGRlcikge1xuICAgIGlmIChwbGFjZWhvbGRlcikge1xuICAgICAgY3JlYXRlRWxlbWVudCgnb3B0aW9uJywgJycsIHsgbGFiZWw6IHBsYWNlaG9sZGVyLCB2YWx1ZTogJycgfSwgdGhpcy5uYXRpdmVFbCk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXplSXRlbXMoZGF0YSk7XG5cbiAgICB0aGlzLml0ZXJhdGVJdGVtcyhpdGVtID0+IHtcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZEl0ZW0gJiYgaXRlbS5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkSXRlbSAmJiBpdGVtLmlzU2VsZWN0ZWQoKSkge1xuICAgICAgICBpdGVtLmRlc2VsZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gd2hpbGUgaXRlcmF0aW5nIGl0ZW1zXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gZnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3MgLSBhcmd1bWVudHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGl0ZXJhdGVJdGVtcyhjYWxsYmFjaywgLi4uYXJncykge1xuICAgIGxldCBpbmRleCA9IDA7XG5cbiAgICBmb3JFYWNoQXJyYXkodGhpcy5pdGVtcywgaXRlbSA9PiB7XG4gICAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgSXRlbUdyb3VwKSB7XG4gICAgICAgIGZvckVhY2hBcnJheShpdGVtLmdldEl0ZW1zKCksIGl0ZW1Jbkdyb3VwID0+IHtcbiAgICAgICAgICByZXN1bHQgPSBjYWxsYmFjay5hcHBseSh0aGlzLCBbaXRlbUluR3JvdXAsIGluZGV4LCAuLi5hcmdzXSkgfHwgZmFsc2U7XG4gICAgICAgICAgaW5kZXggKz0gMTtcblxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCA9IGNhbGxiYWNrLmFwcGx5KHRoaXMsIFtpdGVtLCBpbmRleCwgLi4uYXJnc10pO1xuICAgICAgaW5kZXggKz0gMTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgZHJvcGRvd24gbGlzdFxuICAgKi9cbiAgb3BlbigpIHtcbiAgICByZW1vdmVDbGFzcyh0aGlzLmVsLCBjbHMuSElEREVOKTtcbiAgICBjb25zdCBoaWdobGlnaHRlZEl0ZW0gPVxuICAgICAgIXRoaXMuc2VsZWN0ZWRJdGVtIHx8IHRoaXMuc2VsZWN0ZWRJdGVtLmlzRGlzYWJsZWQoKVxuICAgICAgICA/IHRoaXMuZ2V0SXRlbXMoaXRlbSA9PiAhaXRlbS5pc0Rpc2FibGVkKCkpWzBdXG4gICAgICAgIDogdGhpcy5zZWxlY3RlZEl0ZW07XG4gICAgdGhpcy5oaWdobGlnaHQoaGlnaGxpZ2h0ZWRJdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBhIGRyb3Bkb3duIGxpc3RcbiAgICovXG4gIGNsb3NlKCkge1xuICAgIGFkZENsYXNzKHRoaXMuZWwsIGNscy5ISURERU4pO1xuICAgIHRoaXMuZGVoaWdobGlnaHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGFuIGRyb3Bkb3duXG4gICAqL1xuICBkaXNhYmxlKCkge1xuICAgIHRoaXMubmF0aXZlRWwuZGlzYWJsZWQgPSB0cnVlO1xuICAgIGFkZENsYXNzKHRoaXMuZWwsIGNscy5ESVNBQkxFRCk7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIGFuIGRyb3Bkb3duXG4gICAqL1xuICBlbmFibGUoKSB7XG4gICAgdGhpcy5uYXRpdmVFbC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHJlbW92ZUNsYXNzKHRoaXMuZWwsIGNscy5ESVNBQkxFRCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IGFuIEl0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfEl0ZW19IHZhbHVlIC0gaWYgc3RyaW5nLCBmaW5kIGFuIEl0ZW0gYnkgaXRzIHZhbHVlLiBpZiBudW1iZXIsIGZpbmQgYW4gSXRlbSBieSBpdHMgaW5kZXguXG4gICAqIEByZXR1cm4ge0l0ZW19IHJlc3VsdCBvZiBzZWxlY3Rpb25cbiAgICovXG4gIHNlbGVjdCh2YWx1ZSkge1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHZhbHVlIGluc3RhbmNlb2YgSXRlbSA/IHZhbHVlIDogdGhpcy5nZXRJdGVtKHZhbHVlKTtcbiAgICB0aGlzLmRlc2VsZWN0KCk7XG5cbiAgICBpZiAoIXNlbGVjdGVkSXRlbSB8fCAoc2VsZWN0ZWRJdGVtICYmIHNlbGVjdGVkSXRlbS5pc0Rpc2FibGVkKCkpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzZWxlY3RlZEl0ZW0uc2VsZWN0KCk7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBzZWxlY3RlZEl0ZW07XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRJdGVtO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VsZWN0IGFuIEl0ZW1cbiAgICovXG4gIGRlc2VsZWN0KCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0uZGVzZWxlY3QoKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGlnaGxpZ2h0IGFuIEl0ZW1cbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfEl0ZW19IHZhbHVlIC0gaWYgc3RyaW5nLCBmaW5kIGFuIEl0ZW0gYnkgaXRzIHZhbHVlLiBpZiBudW1iZXIsIGZpbmQgYW4gSXRlbSBieSBpdHMgaW5kZXguXG4gICAqL1xuICBoaWdobGlnaHQodmFsdWUpIHtcbiAgICBsZXQgaGlnaGxpZ2h0ZWRJdGVtO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEl0ZW0pIHtcbiAgICAgIGhpZ2hsaWdodGVkSXRlbSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoaXNFeGlzdHkodmFsdWUpKSB7XG4gICAgICBoaWdobGlnaHRlZEl0ZW0gPSB0aGlzLmdldEl0ZW0odmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChoaWdobGlnaHRlZEl0ZW0gJiYgaGlnaGxpZ2h0ZWRJdGVtICE9PSB0aGlzLmhpZ2hsaWdodGVkSXRlbSkge1xuICAgICAgdGhpcy5kZWhpZ2hsaWdodCgpO1xuICAgICAgaGlnaGxpZ2h0ZWRJdGVtLmhpZ2hsaWdodCgpO1xuICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW0gPSBoaWdobGlnaHRlZEl0ZW07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlaGlnaGxpZ2h0IGFuIEl0ZW1cbiAgICovXG4gIGRlaGlnaGxpZ2h0KCkge1xuICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbSkge1xuICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW0uZGVoaWdobGlnaHQoKTtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBhIGhpZ2hsaWdodGVkIEl0ZW1cbiAgICogQHBhcmFtIHtudW1iZXJ9IGRpcmVjdGlvbiAtIGRpcmVjdGlvbiB0byBtb3ZlXG4gICAqL1xuICBtb3ZlSGlnaGxpZ2h0ZWRJdGVtKGRpcmVjdGlvbikge1xuICAgIGNvbnN0IGhpZ2hsaWdodGVkSXRlbSA9IHRoaXMuZ2V0SGlnaGxpZ2h0ZWRJdGVtKCk7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IGl0ZW1zO1xuXG4gICAgbGV0IGluZGV4ID0gaXRlbXMuaW5kZXhPZihoaWdobGlnaHRlZEl0ZW0pO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICBpbmRleCA9IHRoaXMuZ2V0SXRlbUluZGV4KGluZGV4LCBsZW5ndGgsIGRpcmVjdGlvbik7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBpZiAoIWl0ZW1zW2luZGV4XS5pc0Rpc2FibGVkKCkpIHtcbiAgICAgICAgICB0aGlzLmhpZ2hsaWdodChpdGVtc1tpbmRleF0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggPSB0aGlzLmdldEl0ZW1JbmRleChpbmRleCwgbGVuZ3RoLCBkaXJlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldEl0ZW1JbmRleChpbmRleCwgbGVuZ3RoLCBkaXJlY3Rpb24pIHtcbiAgICByZXR1cm4gKGluZGV4ICsgZGlyZWN0aW9uICsgbGVuZ3RoKSAlIGxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIEl0ZW1zIHRoYXQgcGFzcyB0aGUgdGVzdCBpbXBsZW1lbnRlZCBieSB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAgICogSWYgZmlsdGVyIGZ1bmN0aW9uIGlzIG5vdCBwYXNzZWQsIGl0IHJldHVybnMgYWxsIEl0ZW1zXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIC0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gZmlsdGVyIGl0ZW1zXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgLSB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGZpbmQuIC0xIG1lYW5zIGFsbCBpdGVtcy5cbiAgICogQHJldHVybiB7YXJyYXk8SXRlbT59XG4gICAqL1xuICBnZXRJdGVtcyhjYWxsYmFjayA9ICgpID0+IHRydWUsIG51bWJlciA9IC0xKSB7XG4gICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICB0aGlzLml0ZXJhdGVJdGVtcyhpdGVtID0+IHtcbiAgICAgIGlmIChjYWxsYmFjayhpdGVtKSkge1xuICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICBudW1iZXIgLT0gMTtcblxuICAgICAgICByZXR1cm4gbnVtYmVyICE9PSAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gSXRlbSBieSBpdHMgaW5kZXggb3IgdmFsdWVcbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB2YWx1ZSAtIGlmIHN0cmluZywgdGhlIEl0ZW0ncyB2YWx1ZS4gaWYgbnVtYmVyLCB0aGUgSXRlbSdzIGluZGV4LlxuICAgKiBAcmV0dXJuIHtJdGVtfVxuICAgKi9cbiAgZ2V0SXRlbSh2YWx1ZSkge1xuICAgIGNvbnN0IGlzVmFsaWRJdGVtID0gaXNOdW1iZXIodmFsdWUpXG4gICAgICA/IGNvbXBhcmVkSXRlbSA9PiBjb21wYXJlZEl0ZW0uZ2V0SW5kZXgoKSA9PT0gdmFsdWVcbiAgICAgIDogY29tcGFyZWRJdGVtID0+IGNvbXBhcmVkSXRlbS5nZXRWYWx1ZSgpID09PSB2YWx1ZTtcblxuICAgIHJldHVybiB0aGlzLmdldEl0ZW1zKGlzVmFsaWRJdGVtLCAxKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIEl0ZW1Hcm91cHMgdGhhdCBwYXNzIHRoZSB0ZXN0IGltcGxlbWVudGVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgKiBJZiBmaWx0ZXIgZnVuY3Rpb24gaXMgbm90IHBhc3NlZCwgaXQgcmV0dXJucyBhbGwgSXRlbUdyb3Vwc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGZpbHRlciBpdGVtIGdyb3Vwc1xuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIC0gdGhlIG51bWJlciBvZiBpdGVtIGdyb3VwcyB0byBmaW5kLiAtMSBtZWFucyBhbGwgaXRlbSBncm91cHMuXG4gICAqIEByZXR1cm4ge2FycmF5PEl0ZW1Hcm91cD59XG4gICAqL1xuICBnZXRJdGVtR3JvdXBzKGNhbGxiYWNrID0gKCkgPT4gdHJ1ZSwgbnVtYmVyID0gLTEpIHtcbiAgICBjb25zdCBpdGVtR3JvdXBzID0gW107XG4gICAgZm9yRWFjaEFycmF5KHRoaXMuaXRlbXMsIGl0ZW1Hcm91cCA9PiB7XG4gICAgICBpZiAoaXRlbUdyb3VwIGluc3RhbmNlb2YgSXRlbUdyb3VwICYmIGNhbGxiYWNrKGl0ZW1Hcm91cCkpIHtcbiAgICAgICAgaXRlbUdyb3Vwcy5wdXNoKGl0ZW1Hcm91cCk7XG4gICAgICAgIG51bWJlciAtPSAxO1xuXG4gICAgICAgIHJldHVybiBudW1iZXIgIT09IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGl0ZW1Hcm91cHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIEl0ZW1Hcm91cCBieSBpdHMgaW5kZXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gZ3JvdXBJbmRleCBvZiB0aGUgSXRlbUdyb3VwXG4gICAqIEByZXR1cm4ge0l0ZW1Hcm91cH1cbiAgICovXG4gIGdldEl0ZW1Hcm91cChpbmRleCkge1xuICAgIHJldHVybiB0aGlzLmdldEl0ZW1Hcm91cHMoaXRlbUdyb3VwID0+IGl0ZW1Hcm91cC5nZXRJbmRleCgpID09PSBpbmRleCwgMSlbMF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgSXRlbXNcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0SXRlbUxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtTGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc2VsZWN0ZWQgSXRlbVxuICAgKiBAcmV0dXJuIHtJdGVtfVxuICAgKi9cbiAgZ2V0U2VsZWN0ZWRJdGVtKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGhpZ2hsaWdodGVkIEl0ZW1cbiAgICogQHJldHVybiB7SXRlbX1cbiAgICovXG4gIGdldEhpZ2hsaWdodGVkSXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRlZEl0ZW07XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kIHRoZSBlbGVtZW50IGFuZCBuYXRpdmUgZWxlbWVudCB0byB0aGUgY29udGFpbmVyXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIGNvbnRhaW5lciBlbGVtZW50XG4gICAqL1xuICBhcHBlbmRUb0NvbnRhaW5lcihjb250YWluZXIpIHtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lbCk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMubmF0aXZlRWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3RvcnkgYSBkcm9wZG93blxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiBpdGVtLmRlc3Ryb3koKSk7XG4gICAgcmVtb3ZlRWxlbWVudCh0aGlzLmVsKTtcbiAgICByZW1vdmVFbGVtZW50KHRoaXMubmF0aXZlRWwpO1xuICAgIHRoaXMuZWwgPSB0aGlzLm5hdGl2ZUVsID0gdGhpcy5pdGVtcyA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5oaWdobGlnaHRlZEl0ZW0gPSBudWxsO1xuICB9XG59XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbmltcG9ydCBTZWxlY3RCb3ggZnJvbSAnLi9zZWxlY3RCb3gnO1xuaW1wb3J0ICcuLi9jc3Mvc2VsZWN0Qm94LmNzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdEJveDtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBJbnB1dFxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuaW1wb3J0IGFkZENsYXNzIGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9hZGRDbGFzcyc7XG5pbXBvcnQgcmVtb3ZlQ2xhc3MgZnJvbSAndHVpLWNvZGUtc25pcHBldC9kb21VdGlsL3JlbW92ZUNsYXNzJztcbmltcG9ydCByZW1vdmVFbGVtZW50IGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9yZW1vdmVFbGVtZW50JztcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGNscyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICogICBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucGxhY2Vob2xkZXJdIC0gcGxhY2Vob2xkZXIgZm9yIGEgc2VsZWN0IGJveFxuICogICBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZGlzYWJsZWRdIC0gd2hldGhlciBhbiBpbnB1dCBzaG91bGQgYmUgZGlzYWJsZWQgb3Igbm90XG4gKiAgIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2hvd0ljb25dIC0gd2hldGhlciBhbiBhcnJvdyBpY29uIGluIHRoZSBpbnB1dCBzaG91bGQgYmUgc2hvd25cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW5wdXQge1xuICBjb25zdHJ1Y3Rvcih7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCwgc2hvd0ljb24gfSkge1xuICAgIC8qKlxuICAgICAqIHRleHQgZm9yIGEgcGxhY2Vob2xkZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5wbGFjZWhvbGRlclRleHQgPSBwbGFjZWhvbGRlcjtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuZWwgPSBjcmVhdGVFbGVtZW50KCdkaXYnLCAnJywgeyBjbGFzc05hbWU6IGNscy5JTlBVVCwgdGFiSW5kZXg6IDAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnBsYWNlaG9sZGVyRWwgPSBjcmVhdGVFbGVtZW50KFxuICAgICAgJ3AnLFxuICAgICAgdGhpcy5wbGFjZWhvbGRlclRleHQsXG4gICAgICB7IGNsYXNzTmFtZTogY2xzLlBMQUNFSE9MREVSIH0sXG4gICAgICB0aGlzLmVsXG4gICAgKTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZShkaXNhYmxlZCwgc2hvd0ljb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGluaXRpYWxpemUoZGlzYWJsZWQsIHNob3dJY29uKSB7XG4gICAgaWYgKHNob3dJY29uKSB7XG4gICAgICBjcmVhdGVFbGVtZW50KCdzcGFuJywgJ3NlbGVjdCcsIHsgY2xhc3NOYW1lOiBjbHMuSUNPTiB9LCB0aGlzLmVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGFjZWhvbGRlckVsLndpZHRoID0gJzEwMCUnO1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgYW4gaW5wdXRcbiAgICovXG4gIGRpc2FibGUoKSB7XG4gICAgYWRkQ2xhc3ModGhpcy5lbCwgY2xzLkRJU0FCTEVEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgYW4gaW5wdXRcbiAgICovXG4gIGVuYWJsZSgpIHtcbiAgICByZW1vdmVDbGFzcyh0aGlzLmVsLCBjbHMuRElTQUJMRUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gYW4gaW5wdXRcbiAgICovXG4gIG9wZW4oKSB7XG4gICAgYWRkQ2xhc3ModGhpcy5lbCwgY2xzLk9QRU4pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGFuIGlucHV0XG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICByZW1vdmVDbGFzcyh0aGlzLmVsLCBjbHMuT1BFTik7XG4gIH1cblxuICAvKipcbiAgICogRm9jdXNcbiAgICovXG4gIGZvY3VzKCkge1xuICAgIHRoaXMuZWwuZm9jdXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIHRleHQgaW4gdGhlIHBsYWNlaG9sZGVyXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbSAtIHNlbGVjdGVkIEl0ZW1cbiAgICovXG4gIGNoYW5nZVRleHQoaXRlbSkge1xuICAgIGlmIChpdGVtKSB7XG4gICAgICB0aGlzLnBsYWNlaG9sZGVyRWwuaW5uZXJUZXh0ID0gaXRlbS5nZXRMYWJlbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYWNlaG9sZGVyRWwuaW5uZXJUZXh0ID0gdGhpcy5wbGFjZWhvbGRlclRleHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZCB0aGUgZWxlbWVudCB0byB0aGUgY29udGFpbmVyXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIGNvbnRhaW5lciBlbGVtZW50XG4gICAqL1xuICBhcHBlbmRUb0NvbnRhaW5lcihjb250YWluZXIpIHtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lbCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveSBhbiBpbnB1dFxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICByZW1vdmVFbGVtZW50KHRoaXMuZWwpO1xuICAgIHRoaXMuZWwgPSB0aGlzLnBsYWNlaG9sZGVyRWwgPSBudWxsO1xuICB9XG59XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgSXRlbVxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuaW1wb3J0IGFkZENsYXNzIGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9hZGRDbGFzcyc7XG5pbXBvcnQgcmVtb3ZlQ2xhc3MgZnJvbSAndHVpLWNvZGUtc25pcHBldC9kb21VdGlsL3JlbW92ZUNsYXNzJztcbmltcG9ydCByZW1vdmVFbGVtZW50IGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9yZW1vdmVFbGVtZW50JztcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGNscyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBkZXNjcmlwdGlvblxuICogQW4gaXRlbS5cbiAqIFlvdSBjYW4gZ2V0IEl0ZW0gYnkge0BsaW5rIFNlbGVjdEJveCNnZXRJdGVtIFNlbGVjdEJveC5nZXRJdGVtKCl9IGFuZCB7QGxpbmsgU2VsZWN0Qm94I2dldEl0ZW1zIFNlbGVjdEJveC5nZXRJdGVtcygpfS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSXRlbSB7XG4gIC8qKlxuICAgKiBAaGlkZWNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICAgKiAgIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0gLSBsYWJlbCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGRyb3AtZG93biBsaXN0XG4gICAqICAgQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudmFsdWUgLSB2YWx1ZSBvZiBhbiBpdGVtXG4gICAqICAgQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kaXNhYmxlZD1mYWxzZV0gLSB3aGV0aGVyIGFuIEl0ZW0gc2hvdWxkIGJlIGRpc2FibGVkIG9yIG5vdFxuICAgKiAgIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VsZWN0ZWQ9ZmFsc2VdIC0gd2hldGhlciBhbiBJdGVtIHNob3VsZCBiZSBwcmUtc2VsZWN0ZWQgb3Igbm90XG4gICAqICAgQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMuaW5kZXggLSBJdGVtJ3MgaW5kZXhcbiAgICovXG4gIGNvbnN0cnVjdG9yKHsgdmFsdWUsIGxhYmVsLCBkaXNhYmxlZCwgc2VsZWN0ZWQsIGluZGV4IH0pIHtcbiAgICAvKipcbiAgICAgKiB2YWx1ZSBvZiBhbiBpdGVtXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMudmFsdWUgPSBgJHt2YWx1ZX1gO1xuXG4gICAgLyoqXG4gICAgICogbGFiZWwgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBkcm9wLWRvd24gbGlzdFxuICAgICAqIGlmIGxhYmVsIGlzIGFuIGVtcHR5IHN0cmluZywgaXQgc2hvdWxkIGJlIHNhbWUgYXMgaXRzIHZhbHVlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubGFiZWwgPSBsYWJlbCB8fCB0aGlzLnZhbHVlO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaW5kZXggPSBpbmRleDtcblxuICAgIC8qKlxuICAgICAqIHdoZXRoZXIgYW4gSXRlbUdyb3VwIG9mIHRoZSBJdGVtIGlzIGRpc2FibGVkIG9yIG5vdFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pdGVtR3JvdXBEaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogd2hldGhlciBhbiBJdGVtIGlzIGRpc2FibGVkIG9yIG5vdFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pdGVtRGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5zZWxlY3RlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogPGxpPiBlbGVtZW50IGZvciBhIGN1c3RvbSBkcm9wZG93biBpdGVtXG4gICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5lbCA9IGNyZWF0ZUVsZW1lbnQoJ2xpJywgdGhpcy5sYWJlbCwge1xuICAgICAgY2xhc3NOYW1lOiBjbHMuSVRFTSxcbiAgICAgIHRhYkluZGV4OiAtMSxcbiAgICAgICdkYXRhLXZhbHVlJzogdGhpcy52YWx1ZSxcbiAgICAgICdkYXRhLWluZGV4JzogdGhpcy5pbmRleFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogPG9wdGlvbj4gZWxlbWVudCBmb3IgYSBzZWxlY3QgZWxlbWVudFxuICAgICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubmF0aXZlRWwgPSBjcmVhdGVFbGVtZW50KCdvcHRpb24nLCAnJywge1xuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICBsYWJlbDogdGhpcy5sYWJlbFxuICAgIH0pO1xuXG4gICAgdGhpcy5pbml0aWFsaXplKGRpc2FibGVkLCBzZWxlY3RlZCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5pdGlhbGl6ZShkaXNhYmxlZCwgc2VsZWN0ZWQpIHtcbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0KCk7XG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhbiBJdGVtIGRpc2FibGVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG1ha2VEaXNhYmxlKCkge1xuICAgIHRoaXMubmF0aXZlRWwuZGlzYWJsZWQgPSB0cnVlO1xuICAgIGFkZENsYXNzKHRoaXMuZWwsIGNscy5ESVNBQkxFRCk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhbiBJdGVtIGVuYWJsZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbWFrZUVuYWJsZSgpIHtcbiAgICB0aGlzLm5hdGl2ZUVsLmRpc2FibGVkID0gZmFsc2U7XG4gICAgcmVtb3ZlQ2xhc3ModGhpcy5lbCwgY2xzLkRJU0FCTEVEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGFuIEl0ZW0gZHVlIHRvIGFuIEl0ZW1Hcm91cFxuICAgKiBAaWdub3JlXG4gICAqL1xuICBkaXNhYmxlSXRlbUdyb3VwKCkge1xuICAgIHRoaXMuaXRlbUdyb3VwRGlzYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMubWFrZURpc2FibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgYW4gSXRlbSBkdWUgdG8gYW4gSXRlbUdyb3VwXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGVuYWJsZUl0ZW1Hcm91cCgpIHtcbiAgICB0aGlzLml0ZW1Hcm91cERpc2FibGVkID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmlzRGlzYWJsZWQoKSkge1xuICAgICAgdGhpcy5tYWtlRW5hYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgYW4gSXRlbVxuICAgKiBAaWdub3JlXG4gICAqL1xuICBkaXNhYmxlKCkge1xuICAgIHRoaXMuaXRlbURpc2FibGVkID0gdHJ1ZTtcbiAgICB0aGlzLm1ha2VEaXNhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIGFuIEl0ZW1cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZW5hYmxlKCkge1xuICAgIHRoaXMuaXRlbURpc2FibGVkID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmlzRGlzYWJsZWQoKSkge1xuICAgICAgdGhpcy5tYWtlRW5hYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhbiBJdGVtXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHNlbGVjdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNEaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy5uYXRpdmVFbC5zZWxlY3RlZCA9IHRydWU7XG4gICAgICBhZGRDbGFzcyh0aGlzLmVsLCBjbHMuU0VMRUNURUQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlbGVjdCBhbiBJdGVtXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGRlc2VsZWN0KCkge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLm5hdGl2ZUVsLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgcmVtb3ZlQ2xhc3ModGhpcy5lbCwgY2xzLlNFTEVDVEVEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWdobGlnaHQgYW4gSXRlbVxuICAgKiBAaWdub3JlXG4gICAqL1xuICBoaWdobGlnaHQoKSB7XG4gICAgaWYgKCF0aGlzLmlzRGlzYWJsZWQoKSkge1xuICAgICAgYWRkQ2xhc3ModGhpcy5lbCwgY2xzLkhJR0hMSUdIVCk7XG4gICAgICB0aGlzLmVsLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGhpZ2hsaWdodCBmcm9tIGFuIEl0ZW1cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZGVoaWdobGlnaHQoKSB7XG4gICAgcmVtb3ZlQ2xhc3ModGhpcy5lbCwgY2xzLkhJR0hMSUdIVCk7XG4gICAgdGhpcy5lbC5ibHVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGl0ZW0ncyB2YWx1ZS5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGl0ZW0ncyBsYWJlbC5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0TGFiZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMubGFiZWw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGl0ZW0ncyBpbmRleC5cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0SW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgYW4gaXRlbSBpcyBzZWxlY3RlZCBvciBub3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBpc1NlbGVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIGFuIGl0ZW0gaXMgZGlzYWJsZWQgb3Igbm90LlxuICAgKiBUaGUgcmVzdWx0IGlzIHRydWUgaWYgYW55IG9mIHRoZSBpdGVtcyBhbmQgaXRlbSBncm91cHMgYXJlIGRpc2FibGVkLlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaXNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtRGlzYWJsZWQgfHwgdGhpcy5pdGVtR3JvdXBEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgdGhlIGVsZW1lbnQgYW5kIG5hdGl2ZSBlbGVtZW50IHRvIHRoZSBjb250YWluZXJzXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIGNvbnRhaW5lciBlbGVtZW50XG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5hdGl2ZUNvbnRhaW5lciAtIG5hdGl2ZSBjb250YWluZXIgZWxlbWVudFxuICAgKiBAaWdub3JlXG4gICAqL1xuICBhcHBlbmRUb0NvbnRhaW5lcihjb250YWluZXIsIG5hdGl2ZUNvbnRhaW5lcikge1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmVsKTtcbiAgICBuYXRpdmVDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5uYXRpdmVFbCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveSBhbiBJdGVtXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgcmVtb3ZlRWxlbWVudCh0aGlzLmVsKTtcbiAgICByZW1vdmVFbGVtZW50KHRoaXMubmF0aXZlRWwpO1xuICAgIHRoaXMuZWwgPSB0aGlzLm5hdGl2ZUVsID0gbnVsbDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEl0ZW1Hcm91cFxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuaW1wb3J0IGFkZENsYXNzIGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9hZGRDbGFzcyc7XG5pbXBvcnQgcmVtb3ZlQ2xhc3MgZnJvbSAndHVpLWNvZGUtc25pcHBldC9kb21VdGlsL3JlbW92ZUNsYXNzJztcbmltcG9ydCByZW1vdmVFbGVtZW50IGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9yZW1vdmVFbGVtZW50JztcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGNscyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBJdGVtIGZyb20gJy4vaXRlbSc7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgZ3JvdXAgb2YgaXRlbXMuXG4gKiBZb3UgY2FuIGdldCBJdGVtR3JvdXAgYnkge0BsaW5rIFNlbGVjdEJveCNnZXRJdGVtR3JvdXAgU2VsZWN0Qm94LmdldEl0ZW1Hcm91cCgpfSBhbmQge0BsaW5rIFNlbGVjdEJveCNnZXRJdGVtR3JvdXBzIFNlbGVjdEJveC5nZXRJdGVtR3JvdXBzKCl9LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJdGVtR3JvdXAge1xuICAvKipcbiAgICogQGhpZGVjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnNcbiAgICogICBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWxdIC0gbGFiZWwgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBkcm9wZG93biBsaXN0XG4gICAqICAgQHBhcmFtIHthcnJheTxpdGVtRGF0YT59IG9wdGlvbnMuZGF0YSAtIGRhdGEgZm9yIEl0ZW1zIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBJdGVtR3JvdXBcbiAgICogICBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRpc2FibGVkPWZhbHNlXSAtIHdoZXRoZXIgYW4gSXRlbUdyb3VwIHNob3VsZCBiZSBkaXNhYmxlZCBvciBub3RcbiAgICogICBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5pbmRleCAtIGluZGV4IG9mIHRoZSBmaXJzdCBJdGVtIGluIHRoZSBJdGVtR3JvdXBcbiAgICogICBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5pdGVtR3JvdXBJbmRleCAtIGluZGV4IG9mIHRoZSBJdGVtR3JvdXBcbiAgICovXG4gIGNvbnN0cnVjdG9yKHsgbGFiZWwgPSAnJywgZGF0YSwgZGlzYWJsZWQgPSBmYWxzZSwgaW5kZXgsIGl0ZW1Hcm91cEluZGV4IH0pIHtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmVsID0gY3JlYXRlRWxlbWVudCgnbGknLCAnJywgeyAnZGF0YS1ncm91cC1pbmRleCc6IGl0ZW1Hcm91cEluZGV4IH0pO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5sYWJlbEVsID0gY3JlYXRlRWxlbWVudCgnc3BhbicsIGxhYmVsLCB7IGNsYXNzTmFtZTogY2xzLklURU1fR1JPVVBfTEFCRUwgfSwgdGhpcy5lbCk7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLml0ZW1Db250YWluZXJFbCA9IGNyZWF0ZUVsZW1lbnQoJ3VsJywgJycsIHsgY2xhc3NOYW1lOiBjbHMuSVRFTV9HUk9VUCB9LCB0aGlzLmVsKTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMubmF0aXZlRWwgPSBjcmVhdGVFbGVtZW50KCdvcHRncm91cCcsIGxhYmVsKTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHthcnJheTxJdGVtPn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaXRlbXMgPSB0aGlzLmNyZWF0ZUl0ZW1zKGRhdGEsIGluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmluZGV4ID0gaXRlbUdyb3VwSW5kZXg7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuXG4gICAgLyoqXG4gICAgICogd2hldGhlciBhbiBJdGVtR3JvdXAgaXMgZGlzYWJsZWQgb3Igbm90XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLmluaXRpYWxpemUoZGlzYWJsZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBJdGVtcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgSXRlbUdyb3VwXG4gICAqIEByZXR1cm4ge2FycmF5PEl0ZW0+fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlSXRlbXMoZGF0YSwgaW5kZXgpIHtcbiAgICByZXR1cm4gZGF0YS5tYXAoKGRhdHVtLCBpdGVtSW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBuZXcgSXRlbSh7IGluZGV4OiBpbmRleCArIGl0ZW1JbmRleCwgLi4uZGF0dW0gfSk7XG4gICAgICBpdGVtLmFwcGVuZFRvQ29udGFpbmVyKHRoaXMuaXRlbUNvbnRhaW5lckVsLCB0aGlzLm5hdGl2ZUVsKTtcblxuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5pdGlhbGl6ZShkaXNhYmxlZCkge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgYW4gSXRlbUdyb3VwXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGRpc2FibGUoKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IHRoaXMubmF0aXZlRWwuZGlzYWJsZWQgPSB0cnVlO1xuICAgIGFkZENsYXNzKHRoaXMubGFiZWxFbCwgY2xzLkRJU0FCTEVEKTtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiBpdGVtLmRpc2FibGVJdGVtR3JvdXAoKSk7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIGFuIEl0ZW1Hcm91cFxuICAgKiBAaWdub3JlXG4gICAqL1xuICBlbmFibGUoKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IHRoaXMubmF0aXZlRWwuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICByZW1vdmVDbGFzcyh0aGlzLmxhYmVsRWwsIGNscy5ESVNBQkxFRCk7XG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5lbmFibGVJdGVtR3JvdXAoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHtAbGluayBJdGVtIGl0ZW1zfSBpbiB0aGUgaXRlbSBncm91cC5cbiAgICogQHJldHVybiB7YXJyYXk8SXRlbT59XG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGl0ZW1zID0gaXRlbUdyb3VwLmdldEl0ZW1zKCk7XG4gICAqIGNvbnNvbGUubG9nKGl0ZW1zWzBdKTsgLy8gZmlyc3QgaXRlbSBpbiB0aGUgaXRlbSBncm91cFxuICAgKiBjb25zb2xlLmxvZyhpdGVtcy5sZW5ndGgpOyAvLyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBpdGVtIGdyb3VwXG4gICAqL1xuICBnZXRJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gaXRlbSBncm91cCdzIGluZGV4LlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXRJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gaXRlbSBncm91cCdzIGxhYmVsLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRMYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciBhbiBJdGVtR3JvdXAgaXMgZGlzYWJsZWQgb3Igbm90LlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaXNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgdGhlIGVsZW1lbnQgYW5kIG5hdGl2ZSBlbGVtZW50IHRvIHRoZSBjb250YWluZXJzXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIGNvbnRhaW5lciBlbGVtZW50XG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5hdGl2ZUNvbnRhaW5lciAtIG5hdGl2ZSBjb250YWluZXIgZWxlbWVudFxuICAgKiBAaWdub3JlXG4gICAqL1xuICBhcHBlbmRUb0NvbnRhaW5lcihjb250YWluZXIsIG5hdGl2ZUNvbnRhaW5lcikge1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmVsKTtcbiAgICBuYXRpdmVDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5uYXRpdmVFbCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdG9yeSBhbiBJdGVtR3JvdXBcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiBpdGVtLmRlc3Ryb3koKSk7XG4gICAgcmVtb3ZlRWxlbWVudCh0aGlzLmVsKTtcbiAgICByZW1vdmVFbGVtZW50KHRoaXMubmF0aXZlRWwpO1xuICAgIHRoaXMuZWwgPSB0aGlzLmxhYmVsRWwgPSB0aGlzLml0ZW1Db250YWluZXJFbCA9IHRoaXMubmF0aXZlRWwgPSB0aGlzLml0ZW1zID0gbnVsbDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFV0aWxpdHkgZnVuY3Rpb25zIHJlbGF0ZWQgdG8ga2V5IGV2ZW50c1xuICogQGF1dGhvciBOSE4uIEZFIGRldiB0ZWFtLjxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuY29uc3Qga2V5Q29kZU1hcCA9IHtcbiAgMzg6ICdhcnJvd1VwJyxcbiAgNDA6ICdhcnJvd0Rvd24nLFxuICAzMjogJ3NwYWNlJyxcbiAgMTM6ICdlbnRlcicsXG4gIDI3OiAnZXNjYXBlJyxcbiAgNjE6ICd0YWInXG59O1xuXG5jb25zdCBrZXlNYXAgPSB7XG4gIEFycm93VXA6ICdhcnJvd1VwJyxcbiAgVXA6ICdhcnJvd1VwJyxcbiAgQXJyb3dEb3duOiAnYXJyb3dEb3duJyxcbiAgRG93bjogJ2Fycm93RG93bicsXG4gICcgJzogJ3NwYWNlJyxcbiAgU3BhY2ViYXI6ICdzcGFjZScsXG4gIEVudGVyOiAnZW50ZXInLFxuICBFc2NhcGU6ICdlc2NhcGUnLFxuICBFc2M6ICdlc2NhcGUnLFxuICBUYWI6ICd0YWInXG59O1xuXG4vKipcbiAqIElkZW50aWZ5IHRoZSBrZXkgKHBvbHlmaWxsIGZvciBJRSlcbiAqIEBwYXJhbSB7c3RyaW5nfSBldiAtIGtleWJvYXJkIGV2ZW50XG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0ga2V5XG4gKi9cbmV4cG9ydCBjb25zdCBpZGVudGlmeUtleSA9IGV2ID0+IHtcbiAgY29uc3QgeyBrZXksIGtleUNvZGUgfSA9IGV2O1xuXG4gIGlmIChrZXkpIHtcbiAgICByZXR1cm4ga2V5TWFwW2tleV0gfHwga2V5O1xuICB9XG5cbiAgcmV0dXJuIGtleUNvZGVNYXBba2V5Q29kZV0gfHwga2V5Q29kZTtcbn07XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgU2VsZWN0Qm94XG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG5pbXBvcnQgQ3VzdG9tRXZlbnRzIGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvY3VzdG9tRXZlbnRzL2N1c3RvbUV2ZW50cyc7XG5pbXBvcnQgb24gZnJvbSAndHVpLWNvZGUtc25pcHBldC9kb21FdmVudC9vbic7XG5pbXBvcnQgb2ZmIGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tRXZlbnQvb2ZmJztcbmltcG9ydCBwcmV2ZW50RGVmYXVsdCBmcm9tICd0dWktY29kZS1zbmlwcGV0L2RvbUV2ZW50L3ByZXZlbnREZWZhdWx0JztcbmltcG9ydCBnZXRUYXJnZXQgZnJvbSAndHVpLWNvZGUtc25pcHBldC9kb21FdmVudC9nZXRUYXJnZXQnO1xuaW1wb3J0IGNsb3Nlc3QgZnJvbSAndHVpLWNvZGUtc25pcHBldC9kb21VdGlsL2Nsb3Nlc3QnO1xuaW1wb3J0IHJlbW92ZUVsZW1lbnQgZnJvbSAndHVpLWNvZGUtc25pcHBldC9kb21VdGlsL3JlbW92ZUVsZW1lbnQnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvdHlwZS9pc09iamVjdCc7XG5pbXBvcnQgaXNFeGlzdHkgZnJvbSAndHVpLWNvZGUtc25pcHBldC90eXBlL2lzRXhpc3R5JztcbmltcG9ydCBpc0hUTUxOb2RlIGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvdHlwZS9pc0hUTUxOb2RlJztcbmltcG9ydCBzZW5kSG9zdG5hbWUgZnJvbSAndHVpLWNvZGUtc25pcHBldC9yZXF1ZXN0L3NlbmRIb3N0bmFtZSc7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBpZGVudGlmeUtleSB9IGZyb20gJy4va2V5RXZlbnRVdGlscyc7XG5pbXBvcnQgeyBjbHMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgSW5wdXQgZnJvbSAnLi9pbnB1dCc7XG5pbXBvcnQgRHJvcGRvd24gZnJvbSAnLi9kcm9wZG93bic7XG5pbXBvcnQgSXRlbUdyb3VwIGZyb20gJy4vaXRlbUdyb3VwJztcbmltcG9ydCBJdGVtIGZyb20gJy4vaXRlbSc7XG5pbXBvcnQgVGhlbWUgZnJvbSAnLi90aGVtZSc7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fHN0cmluZ30gY29udGFpbmVyIC0gY29udGFpbmVyIGVsZW1lbnQgb3Igc2VsZWN0b3JcbiAqIEBtaXhlcyBDdXN0b21FdmVudHNcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiAgIEBwYXJhbSB7YXJyYXk8aXRlbURhdGF8aXRlbUdyb3VwRGF0YT59IG9wdGlvbnMuZGF0YSAtIGFycmF5IG9mIHtAbGluayBpdGVtRGF0YX0gYW5kIHtAbGluayBpdGVtR3JvdXBEYXRhfVxuICogICBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucGxhY2Vob2xkZXJdIC0gcGxhY2Vob2xkZXIgZm9yIGFuIGlucHV0XG4gKiAgIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlzYWJsZWRdIC0gd2hldGhlciBhbiBJdGVtIHNob3VsZCBiZSBkaXNhYmxlZCBvciBub3RcbiAqICAgQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hdXRvZm9jdXNdIC0gd2hldGhlciBhIHNlbGVjdGJveCBzaG91bGQgZ2V0IGZvY3VzIHdoZW4gdGhlIHNlbGVjdCBib3ggYXBwZW5kcyB0byB0aGUgY29udGFpbmVyXG4gKiAgIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXV0b2Nsb3NlXSAtIHdoZXRoZXIgYSBzZWxlY3Rib3ggc2hvdWxkIGNsb3NlIGFmdGVyIHNlbGVjdGlvblxuICogICBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNob3dJY29uXSAtIHdoZXRoZXIgYW4gYXJyb3cgaWNvbiBpbiB0aGUgaW5wdXQgc2hvdWxkIGJlIHNob3duXG4gKiAgIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy50aGVtZV0gLSB7QGxpbmsgdGhlbWVDb25maWd9IGZvciBjdXN0b20gc3R5bGVcbiAqICAgQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy51c2FnZVN0YXRpc3RpY3NdIC0gd2hldGhlciBzZW5kIGhvc3RuYW1lIHRvIGdvb2dsZSBhbmFseXRpY3MuIElmIHlvdSBkb24ndCB3YW50IHRvIHNlbmQgdGhlIGhvc3RuYW1lLCBwbGVhc2Ugc2V0IHRvIGZhbHNlLlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCBTZWxlY3RCb3ggZnJvbSAnQHRvYXN0LXVpL3NlbGVjdC1ib3gnO1xuICogLy8gb3IgY29uc3QgU2VsZWN0Qm94ID0gcmVxdWlyZSgnQHRvYXN0LXVpL3NlbGVjdC1ib3gnKTtcbiAqIC8vIG9yIGNvbnN0IFNlbGVjdEJveCA9IHR1aS5TZWxlY3RCb3g7XG4gKlxuICogY29uc3Qgc2VsZWN0Qm94ID0gbmV3IFNlbGVjdEJveCgnI3NlbGVjdC1ib3gnLCB7XG4gKiAgIHBsYWNlaG9sZGVyOiAnUGxlYXNlIHNlbGVjdCBhbiBvcHRpb24uJyxcbiAqICAgZGF0YTogW1xuICogICAgIHtcbiAqICAgICAgIGxhYmVsOiAnRnJ1aXRzJyxcbiAqICAgICAgIGRhdGE6IFsgeyBsYWJlbDogJ0FwcGxlJywgdmFsdWU6ICdhcHBsZScgfSwgeyBsYWJlbDogJ0JhbmFuYScsIHZhbHVlOiAnYmFuYW5hJyB9IF1cbiAqICAgICB9LFxuICogICAgIHsgbGFiZWw6ICdUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLicsIHZhbHVlOiAnbm9uZScgfSxcbiAqICAgICB7XG4gKiAgICAgICBsYWJlbDogJ0NvbG9ycycsXG4gKiAgICAgICBkYXRhOiBbXG4gKiAgICAgICAgIHsgbGFiZWw6ICdSZWQnLCB2YWx1ZTogJ3JlZCcgfSxcbiAqICAgICAgICAgeyBsYWJlbDogJ1llbGxvdycsIHZhbHVlOiAneWVsbG93JyB9LFxuICogICAgICAgICB7IGxhYmVsOiAnR3JlZW4nLCB2YWx1ZTogJ2dyZWVuJywgZGlzYWJsZWQ6IHRydWUgfSxcbiAqICAgICAgICAgeyBsYWJlbDogJ0JsdWUnLCB2YWx1ZTogJ2JsdWUnLCBkaXNhYmxlZDogdHJ1ZSB9LFxuICogICAgICAgICB7IGxhYmVsOiAnUHVycGxlJywgdmFsdWU6ICdwdXJwbGUnIH1cbiAqICAgICAgIF1cbiAqICAgICB9XG4gKiAgIF0sXG4gKiAgIGF1dG9mb2N1czogdHJ1ZSxcbiAqICAgc2hvd0ljb246IGZhbHNlLFxuICogICB0aGVtZToge1xuICogICAgICdjb21tb24uYm9yZGVyJzogJzFweCBzb2xpZCBibGFjaycsXG4gKiAgICAgJ2NvbW1vbi5jb2xvcic6ICdibGFjaycsXG4gKiAgICAgJ2l0ZW0uaGlnaGxpZ2h0ZWQuYmFja2dyb3VuZCc6ICd5ZWxsb3cnXG4gKiAgIH1cbiAqIH0pO1xuICovXG5cbi8qKlxuICogU2VsZWN0Qm94IHByb3ZpZGVzIHNvbWUgY3VzdG9tIGV2ZW50czogKHtAbGluayBTZWxlY3RCb3gjZXZlbnQtb3BlbiBvcGVufSwge0BsaW5rIFNlbGVjdEJveCNldmVudC1jbG9zZSBjbG9zZX0sIHtAbGluayBTZWxlY3RCb3gjZXZlbnQtZGlzYWJsZSBkaXNhYmxlfSwge0BsaW5rIFNlbGVjdEJveCNldmVudC1lbmFibGUgZW5hYmxlfSwge0BsaW5rIFNlbGVjdEJveCNldmVudC1jaGFuZ2UgY2hhbmdlfSkuXG4gKiBZb3UgY2FuIGJpbmQgZXZlbnQgaGFuZGxlcnMgYnkge0BsaW5rIGh0dHBzOi8vbmhuLmdpdGh1Yi5pby90dWkuY29kZS1zbmlwcGV0L2xhdGVzdC9DdXN0b21FdmVudHMjb24gc2VsZWN0Qm94Lm9uKGV2ZW50TmFtZSwgaGFuZGxlcil9IGFuZCB1bmJpbmQgYnkge0BsaW5rIGh0dHBzOi8vbmhuLmdpdGh1Yi5pby90dWkuY29kZS1zbmlwcGV0L2xhdGVzdC9DdXN0b21FdmVudHMjb2ZmIHNlbGVjdEJveC5vZmYoZXZlbnROYW1lLCBoYW5kbGVyKX0uXG4gKiBSZWZlciB0byB0aGUge0BsaW5rIGh0dHBzOi8vbmhuLmdpdGh1Yi5pby90dWkuY29kZS1zbmlwcGV0L2xhdGVzdC9DdXN0b21FdmVudHMgQ3VzdG9tRXZlbnRzfSBkb2N1bWVudCBhdCB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL25obi90dWkuY29kZS1zbmlwcGV0IHR1aS1jb2RlLXNuaXBwZXR9IHRvIGtub3cgaG93IHRvIGJpbmQsIGFuZCB1bmJpbmQgY3VzdG9tIGV2ZW50cy5cbiAqIFRoZSBleGFtcGxlIHVzaW5nIGN1c3RvbSBldmVudHMgY2FuIGJlIGZvdW5kIHtAbGluayB0dXRvcmlhbC1leGFtcGxlMDMtY3VzdG9tLWV2ZW50cyBoZXJlfS5cbiAqIEB0eXBlZGVmIHtjbGFzc30gQ3VzdG9tRXZlbnRzXG4gKiBAZXhhbXBsZVxuICogLy8gYmluZCAnY2hhbmdlJyBldmVudFxuICogc2VsZWN0Qm94Lm9uKCdjaGFuZ2UnLCBldiA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGBzZWxlY3RlZCBpdGVtIGlzIGNoYW5nZWQgZnJvbSAke2V2LnByZXYuZ2V0TGFiZWwoKX0gdG8gJHtldi5jdXJyLmdldExhYmVsKCl9LmApO1xuICogfSk7XG4gKlxuICogLy8gYmluZCAnZGlzYWJsZScgYW5kIGVuYWJsZSBldmVudFxuICogY29uc3QgcHJpbnQgPSBldiA9PiB7XG4gKiAgIGxldCB0YXJnZXQgPSAnJztcbiAqICAgaWYgKGV2LnRhcmdldCBpbnN0YW5jZW9mIFNlbGVjdEJveCkge1xuICogICAgIHRhcmdldCA9ICdTZWxlY3QgYm94JztcbiAqICAgfSBlbHNlIHtcbiAqICAgICB0YXJnZXQgPSBldi50YXJnZXQuZ2V0TGFiZWwoKTtcbiAqICAgfVxuICogICBjb25zb2xlLmxvZyhgJHt0YXJnZXR9IGlzICR7ZXYudHlwZX0uYCk7XG4gKiB9XG4gKiBzZWxlY3RCb3gub24oe1xuICogICBkaXNhYmxlOiBwcmludCxcbiAqICAgZW5hYmxlOiBwcmludFxuICogfSk7XG4gKlxuICogLy8gdW5iaW5kIGNoYW5nZSBldmVudFxuICogc2VsZWN0Qm94Lm9mZignY2hhbmdlJyk7XG4gKlxuICogLy8gdW5iaW5kIGRpc2FibGUgZXZlbnRcbiAqIHNlbGVjdEJveC5vZmYoZGlzYWJsZSwgcHJpbnQpO1xuICpcbiAqIC8vIHVuYmluZCBhbGwgZXZlbnRzXG4gKiBzZWxlY3RCb3gub2ZmKCk7XG4gKi9cblxuLyoqXG4gKiBEYXRhIG9mIGFuIHtAbGluayBJdGVtIGl0ZW19LlxuICogSXQgaXMgdXNlZCBmb3IgY3JlYXRpbmcgYSB7QGxpbmsgU2VsZWN0Qm94fS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IGl0ZW1EYXRhIC0gZGF0YSBmb3Ige0BsaW5rIEl0ZW0gaXRlbX1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsYWJlbCAtIGxhYmVsIHRvIGJlIGRpc3BsYXllZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gdmFsdWUgb2YgYW4gaXRlbVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzYWJsZWQ9ZmFsc2VdIC0gd2hldGhlciBhbiBpdGVtIHNob3VsZCBiZSBkaXNhYmxlZCBvciBub3RcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NlbGVjdGVkPWZhbHNlXSAtIHdoZXRoZXIgYW4gaXRlbSBzaG91bGQgYmUgcHJlLXNlbGVjdGVkIG9yIG5vdFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGl0ZW1EYXRhID0ge1xuICogICBsYWJlbDogJ2Rpc2FibGVkIGl0ZW0nLFxuICogICB2YWx1ZTogJzAnLFxuICogICBkaXNhYmxlZDogdHJ1ZSxcbiAqICAgc2VsZWN0ZWQ6IGZhbHNlXG4gKiB9O1xuICovXG5cbi8qKlxuICogRGF0YSBvZiBhbiB7QGxpbmsgSXRlbUdyb3VwIGl0ZW0gZ3JvdXB9LlxuICogSXQgaXMgdXNlZCBmb3IgY3JlYXRpbmcgYSB7QGxpbmsgU2VsZWN0Qm94fS5cbiAqIEl0ZW1Hcm91cCBzdXBwb3J0cyBvbmx5IDEgbGV2ZWwgY2hvaWNlcywgc28gaXQgZG9lcyBub3Qgd29yayB0byBhZGQgaXRlbSBncm91cHMgaW4gdGhlIGl0ZW0gZ3JvdXAuXG4gKiBUaGUgZXhhbXBsZSB1c2luZyBpdGVtIGdyb3VwcyBjYW4gYmUgZm91bmQge0BsaW5rIHR1dG9yaWFsLWV4YW1wbGUwMS1iYXNpYyBoZXJlfS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IGl0ZW1Hcm91cERhdGEgLSBkYXRhIGZvciB7QGxpbmsgSXRlbUdyb3VwIGl0ZW0gZ3JvdXB9XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbGFiZWwgLSBsYWJlbCB0byBiZSBkaXNwbGF5ZWRcbiAqIEBwcm9wZXJ0eSB7YXJyYXl9IGRhdGEgLSB7QGxpbmsgaXRlbURhdGEgZGF0YSBmb3IgaXRlbX1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Rpc2FibGVkPWZhbHNlXSAtIHdoZXRoZXIgYW4gaXRlbSBncm91cCBzaG91bGQgYmUgZGlzYWJsZWQgb3Igbm90XG4gKiBAZXhhbXBsZVxuICogY29uc3QgaXRlbUdyb3VwRGF0YSA9IHtcbiAqICAgbGFiZWw6ICdkaXNhYmxlZCBpdGVtcycsXG4gKiAgIGRhdGE6IFtcbiAqICAgICB7IGxhYmVsOiAnZGlzYWJsZScsIHZhbHVlOiAnZGlzYWJsZScgfSxcbiAqICAgICB7IGxhYmVsOiAnbm9uZScsIHZhbHVlOiAnMCcgfVxuICogICBdLFxuICogICBkaXNhYmxlZDogdHJ1ZVxuICogfTtcbiAqL1xuY2xhc3MgU2VsZWN0Qm94IHtcbiAgY29uc3RydWN0b3IoXG4gICAgY29udGFpbmVyLFxuICAgIHtcbiAgICAgIGRhdGEsXG4gICAgICBwbGFjZWhvbGRlciA9ICcnLFxuICAgICAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgICAgIGF1dG9mb2N1cyA9IGZhbHNlLFxuICAgICAgYXV0b2Nsb3NlID0gdHJ1ZSxcbiAgICAgIHNob3dJY29uID0gdHJ1ZSxcbiAgICAgIHRoZW1lLFxuICAgICAgdXNhZ2VTdGF0aXN0aWNzID0gdHJ1ZVxuICAgIH1cbiAgKSB7XG4gICAgLyoqXG4gICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5lbCA9IGNyZWF0ZUVsZW1lbnQoJ2RpdicsICcnLCB7IGNsYXNzTmFtZTogY2xzLlNFTEVDVF9CT1ggfSk7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7SW5wdXR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmlucHV0ID0gbmV3IElucHV0KHsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCBzaG93SWNvbiB9KTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtEcm9wZG93bn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuZHJvcGRvd24gPSBuZXcgRHJvcGRvd24oeyBwbGFjZWhvbGRlciwgZGlzYWJsZWQsIGRhdGEgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMub3BlbmVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuZGlhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5hdXRvY2xvc2UgPSBhdXRvY2xvc2U7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7VGhlbWV9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnRoZW1lID0gaXNPYmplY3QodGhlbWUpID8gbmV3IFRoZW1lKHRoZW1lLCBjb250YWluZXIpIDogbnVsbDtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZSh7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCB9KTtcbiAgICB0aGlzLmFwcGVuZFRvQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICBpZiAoYXV0b2ZvY3VzKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgaWYgKHVzYWdlU3RhdGlzdGljcykge1xuICAgICAgc2VuZEhvc3RuYW1lKCdzZWxlY3QtYm94JywgJ1VBLTEyOTk4NzQ2Mi0xJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZCB0aGUgc2VsZWN0IGJveCBlbGVtZW50IHRvIHRoZSBjb250YWluZXJcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IGNvbnRhaW5lciAtIGNvbnRhaW5lciBlbGVtZW50IG9yIHNlbGVjdG9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhcHBlbmRUb0NvbnRhaW5lcihjb250YWluZXIpIHtcbiAgICBjb25zdCBjb250YWluZXJFbCA9IGlzSFRNTE5vZGUoY29udGFpbmVyKSA/IGNvbnRhaW5lciA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGFpbmVyKTtcbiAgICBjb250YWluZXJFbC5hcHBlbmRDaGlsZCh0aGlzLmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5pdGlhbGl6ZShvcHRpb25zKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW0oKTtcbiAgICBpZiAoc2VsZWN0ZWRJdGVtKSB7XG4gICAgICB0aGlzLmlucHV0LmNoYW5nZVRleHQoc2VsZWN0ZWRJdGVtKTtcbiAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLnNlbGVjdCgwKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5iaW5kRXZlbnRzKCk7XG5cbiAgICB0aGlzLmlucHV0LmFwcGVuZFRvQ29udGFpbmVyKHRoaXMuZWwpO1xuICAgIHRoaXMuZHJvcGRvd24uYXBwZW5kVG9Db250YWluZXIodGhpcy5lbCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZCBldmVudHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGJpbmRFdmVudHMoKSB7XG4gICAgb24oXG4gICAgICBkb2N1bWVudCxcbiAgICAgICdjbGljaycsXG4gICAgICBldiA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldik7XG4gICAgICAgIGlmICghY2xvc2VzdCh0YXJnZXQsIGAuJHtjbHMuU0VMRUNUX0JPWH1gKSAmJiB0aGlzLm9wZW5lZCkge1xuICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRoaXNcbiAgICApO1xuICAgIG9uKHRoaXMuZWwsICdjbGljaycsIGV2ID0+IHRoaXMuaGFuZGxlQ2xpY2soZXYsIGNscykpO1xuICAgIG9uKHRoaXMuZWwsICdtb3VzZW92ZXInLCBldiA9PiB0aGlzLmhhbmRsZU1vdXNlb3ZlcihldiwgY2xzKSk7XG4gICAgb24odGhpcy5lbCwgJ2tleWRvd24nLCBldiA9PiB0aGlzLmhhbmRsZUtleWRvd24oZXYsIGNscykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuYmluZCBldmVudHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHVuYmluZEV2ZW50cygpIHtcbiAgICBvZmYoZG9jdW1lbnQsICdjbGljaycpO1xuICAgIG9mZih0aGlzLmVsLCAnY2xpY2sgbW91c2VvdmVyIGtleWRvd24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2xpY2sgZXZlbnRzXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2IC0gYW4gZXZlbnRcbiAgICogQHBhcmFtIHtvYmplY3R9IGNscyAtIGNsc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGFuZGxlQ2xpY2soZXYsIHsgSU5QVVQsIElURU0gfSkge1xuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldChldik7XG4gICAgY29uc3QgaXRlbUVsID0gY2xvc2VzdCh0YXJnZXQsIGAuJHtJVEVNfWApO1xuXG4gICAgaWYgKGl0ZW1FbCkge1xuICAgICAgdGhpcy5zZWxlY3QoaXRlbUVsLmdldEF0dHJpYnV0ZSgnZGF0YS12YWx1ZScpKTtcbiAgICB9IGVsc2UgaWYgKGNsb3Nlc3QodGFyZ2V0LCBgLiR7SU5QVVR9YCkpIHtcbiAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBtb3VzZW92ZXIgZXZlbnRzXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2IC0gYW4gZXZlbnRcbiAgICogQHBhcmFtIHtvYmplY3R9IGNscyAtIGNsc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGFuZGxlTW91c2VvdmVyKGV2LCB7IElURU0gfSkge1xuICAgIGlmICh0aGlzLmNoZWNrTW91c2Vtb3ZlKGV2LmNsaWVudFgsIGV2LmNsaWVudFkpKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXQoZXYpO1xuICAgICAgY29uc3QgaXRlbUVsID0gY2xvc2VzdCh0YXJnZXQsIGAuJHtJVEVNfWApO1xuXG4gICAgICBpZiAoaXRlbUVsKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd24uaGlnaGxpZ2h0KGl0ZW1FbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcG9pbnRlciBpcyBtb3ZlZFxuICAgKiBAcGFyYW0ge251bWJlcn0geCAtIG1vdXNlRXZlbnQuY2xpZW50WFxuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIG1vdXNlRXZlbnQuY2xpZW50WVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2hlY2tNb3VzZW1vdmUoeCwgeSkge1xuICAgIGlmICh0aGlzLnByZXZYICE9PSB4IHx8IHRoaXMucHJldlkgIT09IHkpIHtcbiAgICAgIHRoaXMucHJldlggPSB4O1xuICAgICAgdGhpcy5wcmV2WSA9IHk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUga2V5ZG93biBldmVudHNcbiAgICogQHBhcmFtIHtFdmVudH0gZXYgLSBhbiBldmVudFxuICAgKiBAcGFyYW0ge29iamVjdH0gY2xhc3NOYW1lcyAtIGNsc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGFuZGxlS2V5ZG93bihldiwgY2xhc3NOYW1lcykge1xuICAgIGNvbnN0IGtleSA9IGlkZW50aWZ5S2V5KGV2KTtcbiAgICBjb25zdCBjbG9zZUtleXMgPSBbJ3RhYicsICdlc2NhcGUnXTtcbiAgICBjb25zdCBhY3RpdmVLZXlzID0gWydhcnJvd1VwJywgJ2Fycm93RG93bicsICdzcGFjZScsICdlbnRlciddO1xuXG4gICAgaWYgKGNsb3NlS2V5cy5pbmRleE9mKGtleSkgPiAtMSAmJiB0aGlzLm9wZW5lZCkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgaWYgKGtleSA9PT0gJ2VzY2FwZScpIHtcbiAgICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWN0aXZlS2V5cy5pbmRleE9mKGtleSkgPiAtMSkge1xuICAgICAgcHJldmVudERlZmF1bHQoZXYpO1xuICAgICAgdGhpcy5hY3RpdmF0ZUtleWRvd24oZXYsIGtleSwgY2xhc3NOYW1lcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGtleWRvd24gZXZlbnRzXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2IC0gYW4gZXZlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIGtleSBwcmVzc2VkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjbGFzc05hbWVzIC0gY2xzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhY3RpdmF0ZUtleWRvd24oZXYsIGtleSwgeyBJVEVNLCBJTlBVVCB9KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2KTtcbiAgICBjb25zdCBpdGVtRWwgPSBjbG9zZXN0KHRhcmdldCwgYC4ke0lURU19YCk7XG5cbiAgICBpZiAoa2V5ID09PSAnZXNjYXBlJyAmJiB0aGlzLm9wZW5lZCkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpO1xuICAgIH0gZWxzZSBpZiAoaXRlbUVsKSB7XG4gICAgICB0aGlzLnByZXNzS2V5T25JdGVtKGtleSwgaXRlbUVsKTtcbiAgICB9IGVsc2UgaWYgKGNsb3Nlc3QodGFyZ2V0LCBgLiR7SU5QVVR9YCkpIHtcbiAgICAgIHRoaXMucHJlc3NLZXlPbklucHV0KGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBrZXlkb3duIGV2ZW50cyB3aGVuIGl0IG9jY3VycyBvbiB0aGUgSW5wdXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIGtleVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJlc3NLZXlPbklucHV0KGtleSkge1xuICAgIGlmICghdGhpcy5vcGVuZWQpIHtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnYXJyb3dVcCcgfHwga2V5ID09PSAnYXJyb3dEb3duJykge1xuICAgICAgdGhpcy5kcm9wZG93bi5tb3ZlSGlnaGxpZ2h0ZWRJdGVtKGtleSA9PT0gJ2Fycm93VXAnID8gLTEgOiAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGtleWRvd24gZXZlbnRzIHdoZW4gaXQgb2NjdXJzIG9uIHRoZSBJdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBrZXlcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gaXRlbUVsIC0gSXRlbS5lbFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJlc3NLZXlPbkl0ZW0oa2V5LCBpdGVtRWwpIHtcbiAgICBpZiAoa2V5ID09PSAnZW50ZXInIHx8IGtleSA9PT0gJ3NwYWNlJykge1xuICAgICAgdGhpcy5zZWxlY3RCeUtleWRvd24oaXRlbUVsKTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2Fycm93VXAnIHx8IGtleSA9PT0gJ2Fycm93RG93bicpIHtcbiAgICAgIHRoaXMuZHJvcGRvd24ubW92ZUhpZ2hsaWdodGVkSXRlbShrZXkgPT09ICdhcnJvd1VwJyA/IC0xIDogMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhbiBJdGVtIGJ5IHNwYWNlIG9yIGVudGVyXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGl0ZW1FbCAtIEl0ZW0uZWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbGVjdEJ5S2V5ZG93bihpdGVtRWwpIHtcbiAgICB0aGlzLnNlbGVjdChpdGVtRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykpO1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBhIHNlbGVjdCBib3gsIHtAbGluayBJdGVtR3JvdXAgaXRlbSBncm91cH0gb3Ige0BsaW5rIEl0ZW0gaXRlbX0uXG4gICAqIElmIGl0IHRha2VzIG5vIGFyZ3VtZW50cywgYSBzZWxlY3QgYm94IGlzIGRpc2FibGVkLlxuICAgKiBJZiBpdCB0YWtlcyBzdHJpbmcsIGFuIGl0ZW0gd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYXJndW1lbnQgaXMgZGlzYWJsZWQuXG4gICAqIElmIGl0IHRha2VzIG51bWJlciwgYW4gaXRlbSB3aXRoIHRoZSBzYW1lIGluZGV4IGFzIHRoZSBhcmd1bWVudCBpcyBkaXNhYmxlZC5cbiAgICogSWYgaXQgdGFrZXMgSXRlbSBvciBJdGVtR3JvdXAsIGFuIGFyZ3VtZW50IGl0c2VsZiBpcyBkaXNhYmxlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfEl0ZW18SXRlbUdyb3VwfSB2YWx1ZSAtIGlmIHN0cmluZywgZmluZCBhbiBJdGVtIGJ5IGl0cyB2YWx1ZS4gaWYgbnVtYmVyLCBmaW5kIGFuIEl0ZW0gYnkgaXRzIGluZGV4LlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guZGlzYWJsZSgpOyAvLyBzZWxlY3QgYm94IGlzIGRpc2FibGVkLlxuICAgKiBzZWxlY3RCb3guZGlzYWJsZSgxKTsgLy8gc2Vjb25kIGl0ZW0gaXMgZGlzYWJsZWQuXG4gICAqIHNlbGVjdEJveC5kaXNhYmxlKCd2YWx1ZScpIC8vIGl0ZW0gd2hpY2ggb2YgdmFsdWUgaXMgJ3ZhbHVlJyBpcyBkaXNhYmxlZC5cbiAgICogc2VsZWN0Qm94LmRpc2FibGUoc2VsZWN0Qm94LmdldFNlbGVjdGVkSXRlbSgpKTsgLy8gc2VsZWN0ZWQgaXRlbSBpcyBkaXNhYmxlZC5cbiAgICovXG4gIGRpc2FibGUodmFsdWUpIHtcbiAgICBpZiAoIWlzRXhpc3R5KHZhbHVlKSkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLmlucHV0LmRpc2FibGUoKTtcbiAgICAgIHRoaXMuZHJvcGRvd24uZGlzYWJsZSgpO1xuXG4gICAgICAvKipcbiAgICAgICAqIE9jY3VycyB3aGVuIGEgc2VsZWN0IGJveCwge0BsaW5rIEl0ZW1Hcm91cCBpdGVtIGdyb3VwfSBvciB7QGxpbmsgSXRlbSBpdGVtfSBpcyBkaXNhYmxlZC5cbiAgICAgICAqIEBldmVudCBTZWxlY3RCb3gjZGlzYWJsZVxuICAgICAgICogQHR5cGUge29iamVjdH0gZXZcbiAgICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIC0gZXZlbnQgbmFtZSAoJ2Rpc2FibGUnKVxuICAgICAgICogQHByb3BlcnR5IHtTZWxlY3RCb3h8SXRlbUdyb3VwfEl0ZW19IHRhcmdldCAtIGRpc2FibGVkIHRhcmdldFxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqIHNlbGVjdEJveC5vbignZGlzYWJsZScsIGV2ID0+IHtcbiAgICAgICAqICAgY29uc29sZS5sb2coZXYudGFyZ2V0KTtcbiAgICAgICAqIH0pO1xuICAgICAgICovXG4gICAgICB0aGlzLmZpcmUoJ2Rpc2FibGUnLCB7IHR5cGU6ICdkaXNhYmxlJywgdGFyZ2V0OiB0aGlzIH0pO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJdGVtIHx8IHZhbHVlIGluc3RhbmNlb2YgSXRlbUdyb3VwKSB7XG4gICAgICB2YWx1ZS5kaXNhYmxlKCk7XG4gICAgICB0aGlzLmZpcmUoJ2Rpc2FibGUnLCB7IHR5cGU6ICdkaXNhYmxlJywgdGFyZ2V0OiB2YWx1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGlzYWJsZWRJdGVtID0gdGhpcy5kcm9wZG93bi5nZXRJdGVtKHZhbHVlKTtcbiAgICAgIGlmIChkaXNhYmxlZEl0ZW0pIHtcbiAgICAgICAgZGlzYWJsZWRJdGVtLmRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5maXJlKCdkaXNhYmxlJywgeyB0eXBlOiAnZGlzYWJsZScsIHRhcmdldDogZGlzYWJsZWRJdGVtIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgYSBzZWxlY3QgYm94LCB7QGxpbmsgSXRlbUdyb3VwIGl0ZW0gZ3JvdXB9IG9yIHtAbGluayBJdGVtIGl0ZW19LlxuICAgKiBJZiBpdCB0YWtlcyBubyBhcmd1bWVudHMsIGEgc2VsZWN0IGJveCBpcyBlbmFibGVkLlxuICAgKiBJZiBpdCB0YWtlcyBzdHJpbmcsIGFuIGl0ZW0gd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYXJndW1lbnQgaXMgZW5hYmxlZC5cbiAgICogSWYgaXQgdGFrZXMgbnVtYmVyLCBhbiBpdGVtIHdpdGggdGhlIHNhbWUgaW5kZXggYXMgdGhlIGFyZ3VtZW50IGlzIGVuYWJsZWQuXG4gICAqIElmIGl0IHRha2VzIEl0ZW0gb3IgSXRlbUdyb3VwLCBhbiBhcmd1bWVudCBpdHNlbGYgaXMgZW5hYmxlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfEl0ZW18SXRlbUdyb3VwfSB2YWx1ZSAtIGlmIHN0cmluZywgZmluZCBhbiBJdGVtIGJ5IGl0cyB2YWx1ZS4gaWYgbnVtYmVyLCBmaW5kIGFuIEl0ZW0gYnkgaXRzIGluZGV4LlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guZW5hYmxlKCk7IC8vIHNlbGVjdCBib3ggaXMgZW5hYmxlZC5cbiAgICogc2VsZWN0Qm94LmVuYWJsZSgxKTsgLy8gc2Vjb25kIGl0ZW0gaXMgZW5hYmxlZC5cbiAgICogc2VsZWN0Qm94LmVuYWJsZSgndmFsdWUnKSAvLyBpdGVtIHdoaWNoIG9mIHZhbHVlIGlzICd2YWx1ZScgaXMgZW5hYmxlZC5cbiAgICogc2VsZWN0Qm94LmVuYWJsZShzZWxlY3RCb3guZ2V0U2VsZWN0ZWRJdGVtKCkpOyAvLyBzZWxlY3RlZCBpdGVtIGlzIGVuYWJsZWQuXG4gICAqL1xuICBlbmFibGUodmFsdWUpIHtcbiAgICBpZiAoIWlzRXhpc3R5KHZhbHVlKSkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5pbnB1dC5lbmFibGUoKTtcbiAgICAgIHRoaXMuZHJvcGRvd24uZW5hYmxlKCk7XG5cbiAgICAgIC8qKlxuICAgICAgICogT2NjdXJzIHdoZW4gYSBzZWxlY3QgYm94LCB7QGxpbmsgSXRlbUdyb3VwIGl0ZW0gZ3JvdXB9IG9yIHtAbGluayBJdGVtIGl0ZW19IGlzIGVuYWJsZWQuXG4gICAgICAgKiBAZXZlbnQgU2VsZWN0Qm94I2VuYWJsZVxuICAgICAgICogQHR5cGUge29iamVjdH0gZXZcbiAgICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIC0gZXZlbnQgbmFtZSAoJ2VuYWJsZScpXG4gICAgICAgKiBAcHJvcGVydHkge1NlbGVjdEJveHxJdGVtR3JvdXB8SXRlbX0gdGFyZ2V0IC0gZW5hYmxlIHRhcmdldFxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqIHNlbGVjdEJveC5vbignZW5hYmxlJywgZXYgPT4ge1xuICAgICAgICogICBjb25zb2xlLmxvZyhldi50YXJnZXQpO1xuICAgICAgICogfSk7XG4gICAgICAgKi9cbiAgICAgIHRoaXMuZmlyZSgnZW5hYmxlJywgeyB0eXBlOiAnZW5hYmxlJywgdGFyZ2V0OiB0aGlzIH0pO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJdGVtIHx8IHZhbHVlIGluc3RhbmNlb2YgSXRlbUdyb3VwKSB7XG4gICAgICB2YWx1ZS5lbmFibGUoKTtcbiAgICAgIHRoaXMuZmlyZSgnZW5hYmxlJywgeyB0eXBlOiAnZW5hYmxlJywgdGFyZ2V0OiB2YWx1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGlzYWJsZWRJdGVtID0gdGhpcy5kcm9wZG93bi5nZXRJdGVtKHZhbHVlKTtcbiAgICAgIGlmIChkaXNhYmxlZEl0ZW0pIHtcbiAgICAgICAgZGlzYWJsZWRJdGVtLmVuYWJsZSgpO1xuICAgICAgICB0aGlzLmZpcmUoJ2VuYWJsZScsIHsgdHlwZTogJ2VuYWJsZScsIHRhcmdldDogZGlzYWJsZWRJdGVtIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgZHJvcGRvd24gbGlzdC5cbiAgICogQGV4YW1wbGVcbiAgICogc2VsZWN0Qm94Lm9wZW4oKTtcbiAgICovXG4gIG9wZW4oKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLm9wZW5lZCA9IHRydWU7XG4gICAgICB0aGlzLmRyb3Bkb3duLm9wZW4oKTtcbiAgICAgIHRoaXMuaW5wdXQub3BlbigpO1xuXG4gICAgICAvKipcbiAgICAgICAqIE9jY3VycyB3aGVuIGEgc2VsZWN0IGJveCBvcGVucy5cbiAgICAgICAqIEBldmVudCBTZWxlY3RCb3gjb3BlblxuICAgICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBldmVudCBuYW1lICgnb3BlbicpXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICogc2VsZWN0Qm94Lm9uKCdvcGVuJywgZXYgPT4ge1xuICAgICAgICogICBjb25zb2xlLmxvZygnb3BlbicpO1xuICAgICAgICogfSk7XG4gICAgICAgKi9cbiAgICAgIHRoaXMuZmlyZSgnb3BlbicsIHsgdHlwZTogJ29wZW4nIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBhIGRyb3Bkb3duIGxpc3QuXG4gICAqIEBleGFtcGxlXG4gICAqIHNlbGVjdEJveC5jbG9zZSgpO1xuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5vcGVuZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRyb3Bkb3duLmNsb3NlKCk7XG4gICAgdGhpcy5pbnB1dC5jbG9zZSgpO1xuXG4gICAgLyoqXG4gICAgICogT2NjdXJzIHdoZW4gYSBzZWxlY3QgYm94IGNsb3Nlcy5cbiAgICAgKiBAZXZlbnQgU2VsZWN0Qm94I2Nsb3NlXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBldmVudCBuYW1lICgnY2xvc2UnKVxuICAgICAqIEBleGFtcGxlXG4gICAgICogc2VsZWN0Qm94Lm9uKCdjbG9zZScsIGV2ID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdjbG9zZScpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHRoaXMuZmlyZSgnY2xvc2UnLCB7IHR5cGU6ICdjbG9zZScgfSk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIGEgZHJvcGRvd24gbGlzdC5cbiAgICogQGV4YW1wbGVcbiAgICogc2VsZWN0Qm94LnRvZ2dsZSgpO1xuICAgKi9cbiAgdG9nZ2xlKCkge1xuICAgIGlmICh0aGlzLm9wZW5lZCkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IGFuIHtAbGluayBJdGVtIGl0ZW19LlxuICAgKiBJZiBpdCB0YWtlcyBzdHJpbmcsIGFuIGl0ZW0gd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYXJndW1lbnQgaXMgc2VsZWN0ZWQuXG4gICAqIElmIGl0IHRha2VzIG51bWJlciwgYW4gaXRlbSB3aXRoIHRoZSBzYW1lIGluZGV4IGFzIHRoZSBhcmd1bWVudCBpcyBzZWxlY3RlZC5cbiAgICogSWYgaXQgdGFrZXMgSXRlbSwgYW4gYXJndW1lbnQgaXRzZWxmIGlzIHNlbGVjdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8SXRlbX0gdmFsdWUgLSBpZiBzdHJpbmcsIGZpbmQgYW4gSXRlbSBieSBpdHMgdmFsdWUuIGlmIG51bWJlciwgZmluZCBhbiBJdGVtIGJ5IGl0cyBpbmRleC5cbiAgICogQHJldHVybiB7SXRlbX0gLSBzZWxlY3RlZCBJdGVtLlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guc2VsZWN0KDEpOyAvLyBzZWNvbmQgaXRlbSBpcyBzZWxlY3RlZC5cbiAgICogc2VsZWN0Qm94LnNlbGVjdCgndmFsdWUnKSAvLyBpdGVtIHdoaWNoIG9mIHZhbHVlIGlzICd2YWx1ZScgaXMgc2VsZWN0ZWQuXG4gICAqL1xuICBzZWxlY3QodmFsdWUpIHtcbiAgICBsZXQgc2VsZWN0ZWRJdGVtID0gbnVsbDtcbiAgICBjb25zdCBwcmV2U2VsZWN0ZWRJdGVtID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW0oKTtcblxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgc2VsZWN0ZWRJdGVtID0gdGhpcy5kcm9wZG93bi5zZWxlY3QodmFsdWUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgIHRoaXMuaW5wdXQuY2hhbmdlVGV4dChzZWxlY3RlZEl0ZW0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPY2N1cnMgd2hlbiBhbiB7QGxpbmsgSXRlbSBpdGVtfSBpcyBzZWxlY3RlZC5cbiAgICAgICAgICogQGV2ZW50IFNlbGVjdEJveCNzZWxlY3RcbiAgICAgICAgICogQHR5cGUge29iamVjdH0gZXZcbiAgICAgICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBldmVudCBuYW1lICgnc2VsZWN0JylcbiAgICAgICAgICogQHByb3BlcnR5IHtJdGVtfSB0YXJnZXQgLSBzZWxlY3RlZCBpdGVtXG4gICAgICAgICAqIEBpZ25vcmVcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogc2VsZWN0Qm94Lm9uKCdzZWxlY3QnLCBldiA9PiB7XG4gICAgICAgICAqICAgY29uc29sZS5sb2coYCR7ZXYudGFyZ2V0LmdldExhYmVsKCl9IGlzIHNlbGVjdGVkLmApO1xuICAgICAgICAgKiB9KTtcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlyZSgnc2VsZWN0JywgeyB0eXBlOiAnc2VsZWN0JywgdGFyZ2V0OiBzZWxlY3RlZEl0ZW0gfSk7XG5cbiAgICAgICAgaWYgKHByZXZTZWxlY3RlZEl0ZW0gIT09IHNlbGVjdGVkSXRlbSkge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIE9jY3VycyB3aGVuIGEgc2VsZWN0ZWQge0BsaW5rIEl0ZW0gaXRlbX0gaXMgY2hhbmdlZC5cbiAgICAgICAgICAgKiBAZXZlbnQgU2VsZWN0Qm94I2NoYW5nZVxuICAgICAgICAgICAqIEB0eXBlIHtvYmplY3R9IGV2XG4gICAgICAgICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBldmVudCBuYW1lICgnY2hhbmdlJylcbiAgICAgICAgICAgKiBAcHJvcGVydHkge0l0ZW19IHByZXYgLSBwcmV2aW91cyBzZWxlY3RlZCBpdGVtXG4gICAgICAgICAgICogQHByb3BlcnR5IHtJdGVtfSBjdXJyIC0gY3VycmVudCBzZWxlY3RlZCBpdGVtXG4gICAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICAgKiBzZWxlY3RCb3gub24oJ2NoYW5nZScsIGV2ID0+IHtcbiAgICAgICAgICAgKiAgIGNvbnNvbGUubG9nKGBzZWxlY3RlZCBpdGVtIGlzIGNoYW5nZWQgZnJvbSAke2V2LnByZXYuZ2V0TGFiZWwoKX0gdG8gJHtldi5jdXJyLmdldExhYmVsKCl9LmApO1xuICAgICAgICAgICAqIH0pO1xuICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuZmlyZSgnY2hhbmdlJywge1xuICAgICAgICAgICAgdHlwZTogJ2NoYW5nZScsXG4gICAgICAgICAgICBwcmV2OiBwcmV2U2VsZWN0ZWRJdGVtLFxuICAgICAgICAgICAgY3Vycjogc2VsZWN0ZWRJdGVtXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hdXRvY2xvc2UgJiYgdGhpcy5vcGVuZWQpIHtcbiAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRJdGVtO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VsZWN0IGFuIGl0ZW0uXG4gICAqIElmIHNlbGVjdEJveCBoYXMgYSBwbGFjZWhvbGRlciwgdGhlIGlucHV0J3MgdGV4dCBpcyBhIHBsYWNlaG9sZGVyLlxuICAgKiBJZiBubyBwbGFjZWhvbGRlciwgdGhzIGlucHV0IGlzIGVtcHR5LlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guZGVzZWxlY3QoKTtcbiAgICovXG4gIGRlc2VsZWN0KCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5kcm9wZG93bi5kZXNlbGVjdCgpO1xuICAgICAgdGhpcy5pbnB1dC5jaGFuZ2VUZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc2VsZWN0ZWQge0BsaW5rIEl0ZW0gaXRlbX0uXG4gICAqIEByZXR1cm4ge0l0ZW19XG4gICAqL1xuICBnZXRTZWxlY3RlZEl0ZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZHJvcGRvd24uZ2V0U2VsZWN0ZWRJdGVtKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB7QGxpbmsgSXRlbSBpdGVtc30gdGhhdCBwYXNzIHRoZSB0ZXN0IGltcGxlbWVudGVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvbi5cbiAgICogSWYgZmlsdGVyIGZ1bmN0aW9uIGlzIG5vdCBwYXNzZWQsIGl0IHJldHVybnMgYWxsIGl0ZW1zLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGZpbHRlciBpdGVtc1xuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIC0gdGhlIG51bWJlciBvZiBpdGVtcyB0byBmaW5kLiBJZiBpdCBpcyBub3QgcGFzc2VkLCBpdGVyYXRlIGFsbCBpdGVtcy5cbiAgICogQHJldHVybiB7YXJyYXk8SXRlbT59XG4gICAqIEBleGFtcGxlXG4gICAqIHNlbGVjdEJveC5nZXRJdGVtcygpOyAvLyBhbGwgaXRlbXNcbiAgICogc2VsZWN0Qm94LmdldEl0ZW1zKGl0ZW0gPT4ge1xuICAgKiAgcmV0dXJuICFpdGVtLmlzRGlzYWJsZWQoKTtcbiAgICogfSk7IC8vIGFsbCBlbmFibGVkIGl0ZW1zXG4gICAqL1xuICBnZXRJdGVtcyhjYWxsYmFjaywgbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZHJvcGRvd24uZ2V0SXRlbXMoY2FsbGJhY2ssIG51bWJlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIHtAbGluayBJdGVtIGl0ZW19IGJ5IGl0cyBpbmRleCBvciB2YWx1ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB2YWx1ZSAtIGlmIHN0cmluZywgdGhlIEl0ZW0ncyB2YWx1ZS4gaWYgbnVtYmVyLCB0aGUgSXRlbSdzIGluZGV4LlxuICAgKiBAcmV0dXJuIHtJdGVtfVxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guZ2V0SXRlbSgwKTsgLy8gZmlyc3QgaXRlbVxuICAgKiBzZWxlY3RCb3guZ2V0SXRlbSgndmFsdWUnKSAvLyBpdGVtIHdoaWNoIG9mIHZhbHVlIGlzICd2YWx1ZSdcbiAgICovXG4gIGdldEl0ZW0odmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5kcm9wZG93bi5nZXRJdGVtKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHtAbGluayBJdGVtR3JvdXAgaXRlbSBncm91cHN9IHRoYXQgcGFzcyB0aGUgdGVzdCBpbXBsZW1lbnRlZCBieSB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uXG4gICAqIElmIGZpbHRlciBmdW5jdGlvbiBpcyBub3QgcGFzc2VkLCBpdCByZXR1cm5zIGFsbCBpdGVtIGdyb3Vwcy5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBjYWxsYmFjayBmdW5jdGlvbiB0byBmaWx0ZXIgaXRlbSBncm91cHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciAtIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gZmluZC4gSWYgaXQgaXMgbm90IHBhc3NlZCwgaXRlcmF0ZSBhbGwgaXRlbSBncm91cHMuXG4gICAqIEByZXR1cm4ge2FycmF5PEl0ZW1Hcm91cD59XG4gICAqIEBleGFtcGxlXG4gICAqIHNlbGVjdEJveC5nZXRJdGVtR3JvdXBzKCk7IC8vIGFsbCBpdGVtIGdyb3Vwc1xuICAgKiBzZWxlY3RCb3guZ2V0SXRlbUdyb3VwcyhpdGVtR3JvdXAgPT4ge1xuICAgKiAgcmV0dXJuICFpdGVtR3JvdXAuaXNEaXNhYmxlZCgpO1xuICAgKiB9KTsgLy8gYWxsIGVuYWJsZWQgaXRlbSBncm91cHNcbiAgICovXG4gIGdldEl0ZW1Hcm91cHMoY2FsbGJhY2ssIG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmRyb3Bkb3duLmdldEl0ZW1Hcm91cHMoY2FsbGJhY2ssIG51bWJlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIHtAbGluayBJdGVtR3JvdXAgaXRlbSBncm91cH0gYnkgaXRzIGluZGV4LlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBncm91cEluZGV4IG9mIHRoZSBJdGVtR3JvdXBcbiAgICogQHJldHVybiB7SXRlbUdyb3VwfVxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guZ2V0SXRlbUdyb3VwKDApOyAvLyBmaXJzdCBpdGVtIGdyb3VwXG4gICAqL1xuICBnZXRJdGVtR3JvdXAoaW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5kcm9wZG93bi5nZXRJdGVtR3JvdXAoaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3RvcnkgYSBzZWxlY3QgYm94LlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guZGVzdHJveSgpO1xuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xuXG4gICAgdGhpcy5pbnB1dC5kZXN0cm95KCk7XG4gICAgdGhpcy5kcm9wZG93bi5kZXN0cm95KCk7XG4gICAgaWYgKHRoaXMudGhlbWUpIHtcbiAgICAgIHRoaXMudGhlbWUuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHJlbW92ZUVsZW1lbnQodGhpcy5lbCk7XG4gICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmVsID0gdGhpcy5pbnB1dCA9IHRoaXMuZHJvcGRvd24gPSB0aGlzLnRoZW1lID0gbnVsbDtcbiAgfVxufVxuXG5DdXN0b21FdmVudHMubWl4aW4oU2VsZWN0Qm94KTtcblxuZXhwb3J0IGRlZmF1bHQgU2VsZWN0Qm94O1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFRoZW1lXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG5pbXBvcnQgZm9yRWFjaE93blByb3BlcnRpZXMgZnJvbSAndHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL2ZvckVhY2hPd25Qcm9wZXJ0aWVzJztcbmltcG9ydCByZW1vdmVFbGVtZW50IGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9yZW1vdmVFbGVtZW50JztcbmltcG9ydCBpc0FycmF5IGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvdHlwZS9pc0FycmF5JztcbmltcG9ydCBpc0Jvb2xlYW4gZnJvbSAndHVpLWNvZGUtc25pcHBldC90eXBlL2lzQm9vbGVhbic7XG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAndHVpLWNvZGUtc25pcHBldC90eXBlL2lzU3RyaW5nJztcbmltcG9ydCB7IHRyYW5zZm9ybSwgZ2V0U2VsZWN0b3IgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGNscyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBiYXNlVGhlbWUgZnJvbSAnLi90aGVtZUNvbmZpZyc7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge29iamVjdH0gY3VzdG9tVGhlbWUgLSB0aGVtZSBvYmplY3QgZm9yIGN1c3RvbSBzdHlsZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IGNvbnRhaW5lciAtIGNvbnRhaW5lciBlbGVtZW50IG9yIHNlbGVjdG9yXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRoZW1lIHtcbiAgY29uc3RydWN0b3IoY3VzdG9tVGhlbWUsIGNvbnRhaW5lcikge1xuICAgIHRoaXMuY29udGFpbmVyU2VsZWN0b3IgPSBnZXRTZWxlY3Rvcihjb250YWluZXIpO1xuICAgIHRoaXMuY3NzU3RyaW5nID0gdGhpcy5idWlsZEFsbCh0cmFuc2Zvcm0oY3VzdG9tVGhlbWUpKTtcbiAgICB0aGlzLnN0eWxlRWwgPSB0aGlzLmNyZWF0ZVN0eWxlRWxlbWVudCgpO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0eWxlIGVsZW1lbnRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVTdHlsZUVsZW1lbnQoKSB7XG4gICAgY29uc3Qgc3R5bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGVFbC50eXBlID0gJ3RleHQvY3NzJztcblxuICAgIGlmIChzdHlsZUVsLnN0eWxlU2hlZXQpIHtcbiAgICAgIHN0eWxlRWwuc3R5bGVTaGVldC5jc3NUZXh0ID0gdGhpcy5jc3NTdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlRWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5jc3NTdHJpbmcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGVFbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBjc3Mgc3RyaW5ncyBmb3IgSW5wdXQsIERyb3Bkb3duLCBJdGVtR3JvdXAsIGFuZCBJdGVtLlxuICAgKiBAcGFyYW0ge29iamVjdH0gdGhlbWUgLSB0aGVtZSBvYmplY3RcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYnVpbGRBbGwodGhlbWUpIHtcbiAgICBjb25zdCBleGNsdWRlID0geyBib3JkZXI6ICcnLCBiYWNrZ3JvdW5kOiAnJyB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYnVpbGRJbnB1dCh7IC4uLnRoZW1lLmNvbW1vbiwgLi4udGhlbWUuaW5wdXQgfSkgK1xuICAgICAgdGhpcy5idWlsZERyb3Bkb3duKHsgLi4udGhlbWUuY29tbW9uLCBib3JkZXJUb3A6ICcwJywgLi4udGhlbWUuZHJvcGRvd24sIGhlaWdodDogJycgfSkgK1xuICAgICAgdGhpcy5idWlsZEl0ZW1Hcm91cChcbiAgICAgICAgdGhlbWUuaXRlbUdyb3VwXG4gICAgICAgICAgPyB7IC4uLnRoZW1lLmNvbW1vbiwgLi4uZXhjbHVkZSwgLi4udGhlbWUuaXRlbUdyb3VwLmxhYmVsIH1cbiAgICAgICAgICA6IHsgLi4udGhlbWUuY29tbW9uLCAuLi5leGNsdWRlIH1cbiAgICAgICkgK1xuICAgICAgdGhpcy5idWlsZEl0ZW0oXG4gICAgICAgIHRoZW1lLml0ZW1Hcm91cFxuICAgICAgICAgID8geyAuLi50aGVtZS5jb21tb24sIC4uLmV4Y2x1ZGUsIC4uLnRoZW1lLml0ZW0sIGluSXRlbUdyb3VwOiB0aGVtZS5pdGVtR3JvdXAuaXRlbXMgfVxuICAgICAgICAgIDogeyAuLi50aGVtZS5jb21tb24sIC4uLmV4Y2x1ZGUsIC4uLnRoZW1lLml0ZW0gfVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgY3NzIHN0cmluZ3MgZm9yIElucHV0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSB0aGVtZSAtIHRoZW1lIG9iamVjdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBidWlsZElucHV0KHRoZW1lKSB7XG4gICAgdGhlbWUucGxhY2Vob2xkZXIgPSB7fTtcbiAgICBpZiAodGhlbWUuaGVpZ2h0KSB7XG4gICAgICB0aGVtZS5wbGFjZWhvbGRlci5saW5lSGVpZ2h0ID0gdGhlbWUuaGVpZ2h0O1xuICAgIH1cbiAgICBpZiAoaXNCb29sZWFuKHRoZW1lLnNob3dJY29uKSAmJiAhdGhlbWUuc2hvd0ljb24pIHtcbiAgICAgIHRoZW1lLmljb24gPSB7IGRpc3BsYXk6ICdub25lJyB9O1xuICAgICAgdGhlbWUucGxhY2Vob2xkZXIud2lkdGggPSAnMTAwJSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYnVpbGRDc3NTdHJpbmcoY2xzLklOUFVULCB0aGVtZSkgK1xuICAgICAgdGhpcy5idWlsZENzc1N0cmluZyhbY2xzLklOUFVULCBjbHMuT1BFTl0sIHRoZW1lLm9wZW4pICtcbiAgICAgIHRoaXMuYnVpbGRDc3NTdHJpbmcoW2Nscy5JTlBVVCwgY2xzLkRJU0FCTEVEXSwgdGhlbWUuZGlzYWJsZWQpICtcbiAgICAgIHRoaXMuYnVpbGRDc3NTdHJpbmcoY2xzLlBMQUNFSE9MREVSLCB0aGVtZS5wbGFjZWhvbGRlcikgK1xuICAgICAgdGhpcy5idWlsZENzc1N0cmluZyhjbHMuSUNPTiwgdGhlbWUuaWNvbilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGNzcyBzdHJpbmdzIGZvciBEcm9wZG93blxuICAgKiBAcGFyYW0ge29iamVjdH0gdGhlbWUgLSB0aGVtZSBvYmplY3RcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYnVpbGREcm9wZG93bih0aGVtZSkge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ3NzU3RyaW5nKGNscy5EUk9QRE9XTiwgdGhlbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGNzcyBzdHJpbmdzIGZvciBJdGVtR3JvdXBcbiAgICogQHBhcmFtIHtvYmplY3R9IHRoZW1lIC0gdGhlbWUgb2JqZWN0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGJ1aWxkSXRlbUdyb3VwKHRoZW1lKSB7XG4gICAgaWYgKHRoZW1lLmhlaWdodCkge1xuICAgICAgdGhlbWUubGluZUhlaWdodCA9IHRoZW1lLmhlaWdodDtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5idWlsZENzc1N0cmluZyhjbHMuSVRFTV9HUk9VUF9MQUJFTCwgdGhlbWUpICtcbiAgICAgIHRoaXMuYnVpbGRDc3NTdHJpbmcoW2Nscy5JVEVNX0dST1VQX0xBQkVMLCBjbHMuRElTQUJMRURdLCB0aGVtZS5kaXNhYmxlZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGNzcyBzdHJpbmdzIGZvciBJdGVtXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB0aGVtZSAtIHRoZW1lIG9iamVjdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBidWlsZEl0ZW0odGhlbWUpIHtcbiAgICBpZiAodGhlbWUuaGVpZ2h0KSB7XG4gICAgICB0aGVtZS5saW5lSGVpZ2h0ID0gdGhlbWUuaGVpZ2h0O1xuICAgIH1cbiAgICBpZiAodGhlbWUuc2VsZWN0ZWQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB0cmFuc2Zvcm0oYmFzZVRoZW1lKTtcblxuICAgICAgdGhlbWUuc2VsZWN0ZWQgPSB7IC4uLmJhc2UuaXRlbS5zZWxlY3RlZCwgLi4udGhlbWUuc2VsZWN0ZWQgfTtcbiAgICAgIHRoZW1lLmRpc2FibGVkID0geyAuLi5iYXNlLml0ZW0uZGlzYWJsZWQsIC4uLnRoZW1lLmRpc2FibGVkIH07XG4gICAgICB0aGVtZS5oaWdobGlnaHRlZCA9IHsgLi4uYmFzZS5pdGVtLmhpZ2hsaWdodGVkLCAuLi50aGVtZS5oaWdobGlnaHRlZCB9O1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmJ1aWxkQ3NzU3RyaW5nKGNscy5JVEVNLCB0aGVtZSkgK1xuICAgICAgdGhpcy5idWlsZENzc1N0cmluZyhbY2xzLklURU0sIGNscy5TRUxFQ1RFRF0sIHRoZW1lLnNlbGVjdGVkKSArXG4gICAgICB0aGlzLmJ1aWxkQ3NzU3RyaW5nKFtjbHMuSVRFTSwgY2xzLkRJU0FCTEVEXSwgdGhlbWUuZGlzYWJsZWQpICtcbiAgICAgIHRoaXMuYnVpbGRDc3NTdHJpbmcoW2Nscy5JVEVNLCBjbHMuSElHSExJR0hUXSwgdGhlbWUuaGlnaGxpZ2h0ZWQpICtcbiAgICAgIHRoaXMuYnVpbGRDc3NTdHJpbmcoYCR7Y2xzLklURU1fR1JPVVB9Pi4ke2Nscy5JVEVNfWAsIHRoZW1lLmluSXRlbUdyb3VwKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgY3NzIHN0cmluZ3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAtIGNsYXNzTmFtZVxuICAgKiBAcGFyYW0ge29iamVjdH0gdGhlbWUgLSB0aGVtZSBvYmplY3RcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYnVpbGRDc3NTdHJpbmcoY2xhc3NOYW1lLCB0aGVtZSkge1xuICAgIGlmIChpc0FycmF5KGNsYXNzTmFtZSkpIHtcbiAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5qb2luKCcuJyk7XG4gICAgfVxuICAgIGNsYXNzTmFtZSA9IGAuJHtjbGFzc05hbWV9YDtcblxuICAgIGxldCBjc3NTdHJpbmcgPSAnJztcbiAgICBmb3JFYWNoT3duUHJvcGVydGllcyh0aGVtZSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUpIHtcbiAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNzc1N0cmluZyArPSBgJHtrZXl9OiR7dmFsdWV9O2A7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3NzU3RyaW5nID8gYCR7dGhpcy5jb250YWluZXJTZWxlY3Rvcn0gJHtjbGFzc05hbWV9eyR7Y3NzU3RyaW5nfX1gIDogJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzdG9yeSBhIHRoZW1lXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHJlbW92ZUVsZW1lbnQodGhpcy5zdHlsZUVsKTtcbiAgICB0aGlzLnN0eWxlRWwgPSBudWxsO1xuICB9XG59XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgVGhlbWUgY29uZmlndXJhdGlvblxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuLyoqXG4gKiBUaGVtZSBjb25maWd1cmF0aW9uLlxuICogXCJjb21tb25cIiBwcmVmaXggaXMgZm9yIHRoZSBlbnRpcmUgc2VsZWN0IGJveC4gSXRzIHByb3BlcnRpZXMgYXJlIG92ZXJyaWRlbiBieSBcImlucHV0XCIsIFwiZHJvcGRvd25cIiwgXCJpdGVtR3JvdXBcIiwgYW5kIFwiaXRlbVwiLlxuICogVGhlIGV4YW1wbGUgdXNpbmcgdGhlbWUgY2FuIGJlIGZvdW5kIHtAbGluayB0dXRvcmlhbC1leGFtcGxlMDItdGhlbWUgaGVyZX0uXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSB0aGVtZUNvbmZpZ1xuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRoZW1lQ29uZmlnID0ge1xuICogICAnY29tbW9uLmJvcmRlcic6ICcxcHggc29saWQgI2RkZCcsIC8vIGJvcmRlciBmb3IgaW5wdXQgYW5kIGRyb3Bkb3duIChub3QgaXRlbUdyb3VwIGFuZCBpdGVtKVxuICogICAnY29tbW9uLmJhY2tncm91bmQnOiAnI2ZmZicsXG4gKiAgICdjb21tb24uY29sb3InOiAnIzMzMycsXG4gKiAgICdjb21tb24ud2lkdGgnOiAnMTAwJScsXG4gKiAgICdjb21tb24uaGVpZ2h0JzogJzI5cHgnLCAvLyBoZWlnaHQgZm9yIGl0ZW0gYW5kIGl0ZW1Hcm91cCBsYWJlbCAobm90IGVudGlyZSBzZWxlY3QgYm94KVxuICpcbiAqICAgJ2NvbW1vbi5kaXNhYmxlZC5iYWNrZ3JvdW5kJzogJyNmOWY5ZjknLFxuICogICAnY29tbW9uLmRpc2FibGVkLmNvbG9yJzogJ2M4YzhjOCcsXG4gKlxuICogICAvLyBJbnB1dFxuICogICAnaW5wdXQuYm9yZGVyJzogJzFweCBzb2xpZCAjZGRkJyxcbiAqICAgJ2lucHV0LmJvcmRlckJvdHRvbSc6ICcnLFxuICogICAnaW5wdXQuYmFja2dyb3VuZCc6ICdpbmhlcml0JyxcbiAqICAgJ2lucHV0LmNvbG9yJzogJyMzMzMnLFxuICogICAnaW5wdXQud2lkdGgnOiAnMTAwJScsXG4gKiAgICdpbnB1dC5oZWlnaHQnOiAnMjlweCcsXG4gKlxuICogICAvLyBJbnB1dCB3aGVuIGRyb3Bkb3duIGlzIG9wZW5cbiAqICAgJ2lucHV0Lm9wZW4uYm9yZGVyJzogJzFweCBzb2xpZCAjYWFhJyxcbiAqICAgJ2lucHV0Lm9wZW4uYmFja2dyb3VuZCc6ICdpbmhlcml0JyxcbiAqICAgJ2lucHV0Lm9wZW4uY29sb3InOiAnIzMzMycsXG4gKlxuICogICAvLyBJbnB1dCB3aGVuIHNlbGVjdGJveCBpcyBkaXNhYmxlZFxuICogICAnaW5wdXQuZGlzYWJsZWQuYm9yZGVyJzogJzFweCBzb2xpZCAjYWFhJyxcbiAqICAgJ2lucHV0LmRpc2FibGVkLmJhY2tncm91bmQnOiAnI2Y5ZjlmOScsXG4gKiAgICdpbnB1dC5kaXNhYmxlZC5jb2xvcic6ICcjYzhjOGM4JyxcbiAqXG4gKiAgIC8vIERyb3Bkb3duXG4gKiAgICdkcm9wZG93bi5ib3JkZXInOiAnMXB4IHNvbGlkICNhYWEnLFxuICogICAnZHJvcGRvd24uYm9yZGVyVG9wJzogJzAnLFxuICogICAnZHJvcGRvd24uYmFja2dyb3VuZCc6ICdpbmhlcml0JyxcbiAqICAgJ2Ryb3Bkb3duLndpZHRoJzogJzEwMCUnLFxuICogICAnZHJvcGRvd24ubWF4SGVpZ2h0JzogJycsXG4gKlxuICogICAvLyBJdGVtR3JvdXAncyBpdGVtc1xuICogICAvLyBpZiB5b3Ugd2FudCB0byBzZXQgdGhlIHNhbWUgcGFkZGluZyB2YWx1ZSBhcyB0aGUgaXRlbUdyb3VwLmxhYmVsLCBzZXQgdG8gJzhweCcuXG4gKiAgICdpdGVtR3JvdXAuaXRlbXMucGFkZGluZ0xlZnQnOiAnMjBweCcsXG4gKlxuICogICAvLyBJdGVtR3JvdXAncyBsYWJlbFxuICogICAnaXRlbUdyb3VwLmxhYmVsLmJvcmRlcic6ICcwJyxcbiAqICAgJ2l0ZW1Hcm91cC5sYWJlbC5iYWNrZ3JvdW5kJzogJ2luaGVyaXQnLFxuICogICAnaXRlbUdyb3VwLmxhYmVsLmNvbG9yJzogJyMzMzMnLFxuICogICAnaXRlbUdyb3VwLmxhYmVsLmZvbnRXZWlnaHQnOiAnYm9sZCcsXG4gKiAgICdpdGVtR3JvdXAubGFiZWwuaGVpZ2h0JzogJzI5cHgnLFxuICpcbiAqICAgLy8gZGlzYWJsZWQgSXRlbUdyb3VwJ3MgbGFiZWxcbiAqICAgJ2l0ZW1Hcm91cC5sYWJlbC5kaXNhYmxlZC5ib3JkZXInOiAnMCcsXG4gKiAgICdpdGVtR3JvdXAubGFiZWwuZGlzYWJsZWQuYmFja2dyb3VuZCc6ICdpbmhlcml0JyxcbiAqICAgJ2l0ZW1Hcm91cC5sYWJlbC5kaXNhYmxlZC5jb2xvcic6ICcjMzMzJyxcbiAqXG4gKiAgIC8vIEl0ZW1cbiAqICAgJ2l0ZW0uYm9yZGVyJzogJzAnLFxuICogICAnaXRlbS5iYWNrZ3JvdW5kJzogJ2luaGVyaXQnLFxuICogICAnaXRlbS5jb2xvcic6ICcjMzMzJyxcbiAqICAgJ2l0ZW0uaGVpZ2h0JzogJzI5cHgnLFxuICpcbiAqICAgLy8gc2VsZWN0ZWQgSXRlbVxuICogICAnaXRlbS5zZWxlY3RlZC5ib3JkZXInOiAnMCcsXG4gKiAgICdpdGVtLnNlbGVjdGVkLmJhY2tncm91bmQnOiAnI2Y0ZjRmNCcsXG4gKiAgICdpdGVtLnNlbGVjdGVkLmNvbG9yJzogJyMzMzMnLFxuICpcbiAqICAgLy8gZGlzYWJsZWQgSXRlbVxuICogICAnaXRlbS5kaXNhYmxlZC5ib3JkZXInOiAnMCcsXG4gKiAgICdpdGVtLmRpc2FibGVkLmJhY2tncm91bmQnOiAnI2Y5ZjlmOScsXG4gKiAgICdpdGVtLmRpc2FibGVkLmNvbG9yJzogJyNjOGM4YzgnLFxuICpcbiAqICAgLy8gaGlnaGxpZ2h0ZWQgSXRlbVxuICogICAnaXRlbS5oaWdobGlnaHRlZC5ib3JkZXInOiAnMCcsXG4gKiAgICdpdGVtLmhpZ2hsaWdodGVkLmJhY2tncm91bmQnOiAnI2U1ZjZmZicsXG4gKiAgICdpdGVtLmhpZ2hsaWdodGVkLmNvbG9yJzogJyMzMzMnXG4gKiB9O1xuICovXG5leHBvcnQgZGVmYXVsdCB7XG4gICdjb21tb24uYm9yZGVyJzogJzFweCBzb2xpZCAjZGRkJywgLy8gYm9yZGVyIGZvciBpbnB1dCBhbmQgZHJvcGRvd24gKG5vdCBpdGVtR3JvdXAgYW5kIGl0ZW0pXG4gICdjb21tb24uYmFja2dyb3VuZCc6ICcjZmZmJyxcbiAgJ2NvbW1vbi5jb2xvcic6ICcjMzMzJyxcbiAgJ2NvbW1vbi53aWR0aCc6ICcxMDAlJyxcbiAgJ2NvbW1vbi5oZWlnaHQnOiAnMjlweCcsIC8vIGhlaWdodCBmb3IgaXRlbSBhbmQgaXRlbUdyb3VwIGxhYmVsIChub3QgZW50aXJlIHNlbGVjdCBib3gpXG5cbiAgJ2NvbW1vbi5kaXNhYmxlZC5iYWNrZ3JvdW5kJzogJyNmOWY5ZjknLFxuICAnY29tbW9uLmRpc2FibGVkLmNvbG9yJzogJ2M4YzhjOCcsXG5cbiAgLy8gSW5wdXRcbiAgJ2lucHV0LmJvcmRlcic6ICcxcHggc29saWQgI2RkZCcsXG4gICdpbnB1dC5ib3JkZXJCb3R0b20nOiAnJyxcbiAgJ2lucHV0LmJhY2tncm91bmQnOiAnaW5oZXJpdCcsXG4gICdpbnB1dC5jb2xvcic6ICcjMzMzJyxcbiAgJ2lucHV0LndpZHRoJzogJzEwMCUnLFxuICAnaW5wdXQuaGVpZ2h0JzogJzI5cHgnLFxuXG4gIC8vIElucHV0IHdoZW4gZHJvcGRvd24gaXMgb3BlblxuICAnaW5wdXQub3Blbi5ib3JkZXInOiAnMXB4IHNvbGlkICNhYWEnLFxuICAnaW5wdXQub3Blbi5iYWNrZ3JvdW5kJzogJ2luaGVyaXQnLFxuICAnaW5wdXQub3Blbi5jb2xvcic6ICcjMzMzJyxcblxuICAvLyBJbnB1dCB3aGVuIHNlbGVjdGJveCBpcyBkaXNhYmxlZFxuICAnaW5wdXQuZGlzYWJsZWQuYm9yZGVyJzogJzFweCBzb2xpZCAjYWFhJyxcbiAgJ2lucHV0LmRpc2FibGVkLmJhY2tncm91bmQnOiAnI2Y5ZjlmOScsXG4gICdpbnB1dC5kaXNhYmxlZC5jb2xvcic6ICcjYzhjOGM4JyxcblxuICAvLyBEcm9wZG93blxuICAnZHJvcGRvd24uYm9yZGVyJzogJzFweCBzb2xpZCAjYWFhJyxcbiAgJ2Ryb3Bkb3duLmJvcmRlclRvcCc6ICcwJyxcbiAgJ2Ryb3Bkb3duLmJhY2tncm91bmQnOiAnaW5oZXJpdCcsXG4gICdkcm9wZG93bi53aWR0aCc6ICcxMDAlJyxcbiAgJ2Ryb3Bkb3duLm1heEhlaWdodCc6ICcnLFxuXG4gIC8vIEl0ZW1Hcm91cCdzIGl0ZW1zXG4gICdpdGVtR3JvdXAuaXRlbXMucGFkZGluZ0xlZnQnOiAnMjBweCcsXG5cbiAgLy8gSXRlbUdyb3VwJ3MgbGFiZWxcbiAgJ2l0ZW1Hcm91cC5sYWJlbC5ib3JkZXInOiAnMCcsXG4gICdpdGVtR3JvdXAubGFiZWwuYmFja2dyb3VuZCc6ICdpbmhlcml0JyxcbiAgJ2l0ZW1Hcm91cC5sYWJlbC5jb2xvcic6ICcjMzMzJyxcbiAgJ2l0ZW1Hcm91cC5sYWJlbC5mb250V2VpZ2h0JzogJ2JvbGQnLFxuICAnaXRlbUdyb3VwLmxhYmVsLmhlaWdodCc6ICcyOXB4JyxcblxuICAvLyBkaXNhYmxlZCBJdGVtR3JvdXAncyBsYWJlbFxuICAnaXRlbUdyb3VwLmxhYmVsLmRpc2FibGVkLmJvcmRlcic6ICcwJyxcbiAgJ2l0ZW1Hcm91cC5sYWJlbC5kaXNhYmxlZC5iYWNrZ3JvdW5kJzogJ2luaGVyaXQnLFxuICAnaXRlbUdyb3VwLmxhYmVsLmRpc2FibGVkLmNvbG9yJzogJyMzMzMnLFxuXG4gIC8vIEl0ZW1cbiAgJ2l0ZW0uYm9yZGVyJzogJzAnLFxuICAnaXRlbS5iYWNrZ3JvdW5kJzogJ2luaGVyaXQnLFxuICAnaXRlbS5jb2xvcic6ICcjMzMzJyxcbiAgJ2l0ZW0uaGVpZ2h0JzogJzI5cHgnLFxuXG4gIC8vIHNlbGVjdGVkIEl0ZW1cbiAgJ2l0ZW0uc2VsZWN0ZWQuYm9yZGVyJzogJzAnLFxuICAnaXRlbS5zZWxlY3RlZC5iYWNrZ3JvdW5kJzogJyNmNGY0ZjQnLFxuICAnaXRlbS5zZWxlY3RlZC5jb2xvcic6ICcjMzMzJyxcblxuICAvLyBkaXNhYmxlZCBJdGVtXG4gICdpdGVtLmRpc2FibGVkLmJvcmRlcic6ICcwJyxcbiAgJ2l0ZW0uZGlzYWJsZWQuYmFja2dyb3VuZCc6ICcjZjlmOWY5JyxcbiAgJ2l0ZW0uZGlzYWJsZWQuY29sb3InOiAnI2M4YzhjOCcsXG5cbiAgLy8gaGlnaGxpZ2h0ZWQgSXRlbVxuICAnaXRlbS5oaWdobGlnaHRlZC5ib3JkZXInOiAnMCcsXG4gICdpdGVtLmhpZ2hsaWdodGVkLmJhY2tncm91bmQnOiAnI2U1ZjZmZicsXG4gICdpdGVtLmhpZ2hsaWdodGVkLmNvbG9yJzogJyMzMzMnXG59O1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFV0aWxpdHkgZnVuY3Rpb25zXG4gKiBAYXV0aG9yIE5ITi4gRkUgZGV2IHRlYW0uPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG5pbXBvcnQgZm9yRWFjaE93blByb3BlcnRpZXMgZnJvbSAndHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL2ZvckVhY2hPd25Qcm9wZXJ0aWVzJztcbmltcG9ydCBpc1N0cmluZyBmcm9tICd0dWktY29kZS1zbmlwcGV0L3R5cGUvaXNTdHJpbmcnO1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBvYmplY3QgdXNpbmcgZG90IG5vdGF0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqIC0gb2JqZWN0IHRvIHRyYW5zZm9ybVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtID0gb2JqID0+IHtcbiAgY29uc3QgcmVzdWx0ID0ge307XG5cbiAgZm9yRWFjaE93blByb3BlcnRpZXMob2JqLCAodmFsdWUsIHByb3ApID0+IHtcbiAgICBjb25zdCBrZXlzID0gcHJvcC5zcGxpdCgnLicpO1xuICAgIGxldCBjdXJyID0gcmVzdWx0O1xuXG4gICAga2V5cy5mb3JFYWNoKChrZXksIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPT09IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgICBjdXJyW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIWN1cnJba2V5XSkge1xuICAgICAgICBjdXJyW2tleV0gPSB7fTtcbiAgICAgIH1cbiAgICAgIGN1cnIgPSBjdXJyW2tleV07XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIEhUTUwgZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgLSB0YWcgbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBjb250ZW50IGluIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIG90aGVyIHByb3BlcnRpZXMgZm9yIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIgLSBwYXJlbnQgZWxlbWVudCBmb3IgdGhlIGVsZW1lbnRcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRWxlbWVudCA9ICh0YWdOYW1lLCBjb250ZW50LCBvcHRpb25zLCBjb250YWluZXIpID0+IHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuXG4gIGlmIChjb250ZW50KSB7XG4gICAgZWwuaW5uZXJUZXh0ID0gY29udGVudDtcbiAgfVxuXG4gIGZvckVhY2hPd25Qcm9wZXJ0aWVzKG9wdGlvbnMsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgaWYgKGtleS5pbmRleE9mKCdkYXRhLScpID4gLTEpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbCk7XG4gIH1cblxuICByZXR1cm4gZWw7XG59O1xuXG4vKipcbiAqIEdldCBzZWxlY3RvcnMgZm9yIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIC0gZWxlbWVudFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgZ2V0U2VsZWN0b3IgPSBlbCA9PiB7XG4gIGlmIChpc1N0cmluZyhlbCkpIHtcbiAgICByZXR1cm4gZWw7XG4gIH1cblxuICBpZiAoZWwuaWQpIHtcbiAgICByZXR1cm4gYCMke2VsLmlkfWA7XG4gIH1cblxuICBjb25zdCBjbGFzc05hbWUgPSBgLiR7ZWwuY2xhc3NOYW1lLnJlcGxhY2UoL1xccysvZywgJy4nKX1gO1xuICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgY29uc3QgZWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGNsYXNzTmFtZSk7XG5cbiAgICBpZiAoZWxlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gY2xhc3NOYW1lO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRhZ05hbWUgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgcmV0dXJuIGAke3RhZ05hbWV9JHtjbGFzc05hbWV9YDtcbn07XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9hcnJheS9pbkFycmF5LmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL2ZvckVhY2guanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2NvbGxlY3Rpb24vZm9yRWFjaEFycmF5LmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL2ZvckVhY2hPd25Qcm9wZXJ0aWVzLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL3RvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2N1c3RvbUV2ZW50cy9jdXN0b21FdmVudHMuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2RvbUV2ZW50L19zYWZlRXZlbnQuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2RvbUV2ZW50L2dldFRhcmdldC5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvZG9tRXZlbnQvb2ZmLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9kb21FdmVudC9vbi5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvZG9tRXZlbnQvcHJldmVudERlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvX3NldENsYXNzTmFtZS5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9hZGRDbGFzcy5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9jbG9zZXN0LmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9kb21VdGlsL2dldENsYXNzLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC9kb21VdGlsL21hdGNoZXMuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvcmVtb3ZlQ2xhc3MuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvcmVtb3ZlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvb2JqZWN0L2V4dGVuZC5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvcmVxdWVzdC9pbWFnZVBpbmcuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3JlcXVlc3Qvc2VuZEhvc3RuYW1lLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC90eXBlL2lzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3R5cGUvaXNCb29sZWFuLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC90eXBlL2lzRXhpc3R5LmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9ub2RlX21vZHVsZXMvdHVpLWNvZGUtc25pcHBldC90eXBlL2lzRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3R5cGUvaXNIVE1MTm9kZS5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vbm9kZV9tb2R1bGVzL3R1aS1jb2RlLXNuaXBwZXQvdHlwZS9pc051bGwuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3R5cGUvaXNOdW1iZXIuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3R5cGUvaXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3R5cGUvaXNTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL25vZGVfbW9kdWxlcy90dWktY29kZS1zbmlwcGV0L3R5cGUvaXNVbmRlZmluZWQuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL3NyYy9jc3Mvc2VsZWN0Qm94LmNzcz83ZWJkIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9zcmMvanMvY29uc3RhbnRzLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9zcmMvanMvZHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL3NyYy9qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vc3JjL2pzL2lucHV0LmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9zcmMvanMvaXRlbS5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vc3JjL2pzL2l0ZW1Hcm91cC5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vc3JjL2pzL2tleUV2ZW50VXRpbHMuanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL3NyYy9qcy9zZWxlY3RCb3guanMiLCJ3ZWJwYWNrOi8vdHVpLlNlbGVjdEJveC8uL3NyYy9qcy90aGVtZS5qcyIsIndlYnBhY2s6Ly90dWkuU2VsZWN0Qm94Ly4vc3JjL2pzL3RoZW1lQ29uZmlnLmpzIiwid2VicGFjazovL3R1aS5TZWxlY3RCb3gvLi9zcmMvanMvdXRpbHMuanMiXSwibmFtZXMiOlsiQ1NTX1BSRUZJWCIsImNsYXNzTmFtZXMiLCJTRUxFQ1RfQk9YIiwiSVRFTSIsIklURU1fR1JPVVAiLCJJVEVNX0dST1VQX0xBQkVMIiwiRFJPUERPV04iLCJJTlBVVCIsIlBMQUNFSE9MREVSIiwiSUNPTiIsIk9QRU4iLCJISURERU4iLCJESVNBQkxFRCIsIlNFTEVDVEVEIiwiSElHSExJR0hUIiwiY2xzIiwidmFsdWUiLCJrZXkiLCJEcm9wZG93biIsInBsYWNlaG9sZGVyIiwiZGF0YSIsImRpc2FibGVkIiwiZWwiLCJjbGFzc05hbWUiLCJuYXRpdmVFbCIsInRhYkluZGV4IiwiaXRlbXMiLCJpdGVtTGVuZ3RoIiwic2VsZWN0ZWRJdGVtIiwiaGlnaGxpZ2h0ZWRJdGVtIiwiaW5pdGlhbGl6ZSIsImluaXRpYWxpemVJdGVtcyIsIml0ZW0iLCJpdGVtSW5kZXgiLCJpdGVtR3JvdXBJbmRleCIsImZvckVhY2giLCJkYXR1bSIsIkl0ZW1Hcm91cCIsImluZGV4IiwibGVuZ3RoIiwiSXRlbSIsInB1c2giLCJhcHBlbmRUb0NvbnRhaW5lciIsImxhYmVsIiwiaXRlcmF0ZUl0ZW1zIiwiaXNTZWxlY3RlZCIsImRlc2VsZWN0IiwiZGlzYWJsZSIsImNhbGxiYWNrIiwiYXJncyIsInJlc3VsdCIsImdldEl0ZW1zIiwiaXRlbUluR3JvdXAiLCJhcHBseSIsIm9wZW4iLCJpc0Rpc2FibGVkIiwiaGlnaGxpZ2h0IiwiY2xvc2UiLCJkZWhpZ2hsaWdodCIsImVuYWJsZSIsInNlbGVjdCIsImdldEl0ZW0iLCJtb3ZlSGlnaGxpZ2h0ZWRJdGVtIiwiZGlyZWN0aW9uIiwiZ2V0SGlnaGxpZ2h0ZWRJdGVtIiwiaW5kZXhPZiIsImdldEl0ZW1JbmRleCIsIm51bWJlciIsImlzVmFsaWRJdGVtIiwiY29tcGFyZWRJdGVtIiwiZ2V0SW5kZXgiLCJnZXRWYWx1ZSIsImdldEl0ZW1Hcm91cHMiLCJpdGVtR3JvdXBzIiwiaXRlbUdyb3VwIiwiZ2V0SXRlbUdyb3VwIiwiZ2V0SXRlbUxlbmd0aCIsImdldFNlbGVjdGVkSXRlbSIsImNvbnRhaW5lciIsImFwcGVuZENoaWxkIiwiZGVzdHJveSIsIlNlbGVjdEJveCIsIklucHV0Iiwic2hvd0ljb24iLCJwbGFjZWhvbGRlclRleHQiLCJwbGFjZWhvbGRlckVsIiwid2lkdGgiLCJmb2N1cyIsImNoYW5nZVRleHQiLCJ0ZXh0Q29udGVudCIsImdldExhYmVsIiwic2VsZWN0ZWQiLCJpdGVtR3JvdXBEaXNhYmxlZCIsIml0ZW1EaXNhYmxlZCIsIm1ha2VEaXNhYmxlIiwibWFrZUVuYWJsZSIsImRpc2FibGVJdGVtR3JvdXAiLCJlbmFibGVJdGVtR3JvdXAiLCJibHVyIiwibmF0aXZlQ29udGFpbmVyIiwibGFiZWxFbCIsIml0ZW1Db250YWluZXJFbCIsImNyZWF0ZUl0ZW1zIiwibWFwIiwia2V5Q29kZU1hcCIsImtleU1hcCIsIkFycm93VXAiLCJVcCIsIkFycm93RG93biIsIkRvd24iLCJTcGFjZWJhciIsIkVudGVyIiwiRXNjYXBlIiwiRXNjIiwiVGFiIiwiaWRlbnRpZnlLZXkiLCJldiIsImtleUNvZGUiLCJhdXRvZm9jdXMiLCJhdXRvY2xvc2UiLCJ0aGVtZSIsInVzYWdlU3RhdGlzdGljcyIsImlucHV0IiwiZHJvcGRvd24iLCJvcGVuZWQiLCJkaWFibGVkIiwiVGhlbWUiLCJjb250YWluZXJFbCIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsIm9wdGlvbnMiLCJiaW5kRXZlbnRzIiwidGFyZ2V0IiwiaGFuZGxlQ2xpY2siLCJoYW5kbGVNb3VzZW92ZXIiLCJoYW5kbGVLZXlkb3duIiwidW5iaW5kRXZlbnRzIiwiaXRlbUVsIiwiZ2V0QXR0cmlidXRlIiwidG9nZ2xlIiwiY2hlY2tNb3VzZW1vdmUiLCJjbGllbnRYIiwiY2xpZW50WSIsIngiLCJ5IiwicHJldlgiLCJwcmV2WSIsImNsb3NlS2V5cyIsImFjdGl2ZUtleXMiLCJhY3RpdmF0ZUtleWRvd24iLCJwcmVzc0tleU9uSXRlbSIsInByZXNzS2V5T25JbnB1dCIsInNlbGVjdEJ5S2V5ZG93biIsImZpcmUiLCJ0eXBlIiwiZGlzYWJsZWRJdGVtIiwicHJldlNlbGVjdGVkSXRlbSIsInByZXYiLCJjdXJyIiwiQ3VzdG9tRXZlbnRzIiwibWl4aW4iLCJjdXN0b21UaGVtZSIsImNvbnRhaW5lclNlbGVjdG9yIiwiY3NzU3RyaW5nIiwiYnVpbGRBbGwiLCJzdHlsZUVsIiwiY3JlYXRlU3R5bGVFbGVtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJjcmVhdGVFbGVtZW50Iiwic3R5bGVTaGVldCIsImNzc1RleHQiLCJjcmVhdGVUZXh0Tm9kZSIsImV4Y2x1ZGUiLCJib3JkZXIiLCJiYWNrZ3JvdW5kIiwiYnVpbGRJbnB1dCIsImNvbW1vbiIsImJ1aWxkRHJvcGRvd24iLCJib3JkZXJUb3AiLCJoZWlnaHQiLCJidWlsZEl0ZW1Hcm91cCIsImJ1aWxkSXRlbSIsImluSXRlbUdyb3VwIiwibGluZUhlaWdodCIsImljb24iLCJkaXNwbGF5IiwiYnVpbGRDc3NTdHJpbmciLCJiYXNlIiwiYmFzZVRoZW1lIiwiaGlnaGxpZ2h0ZWQiLCJqb2luIiwicmVwbGFjZSIsInRvTG93ZXJDYXNlIiwidHJhbnNmb3JtIiwib2JqIiwicHJvcCIsImtleXMiLCJzcGxpdCIsInRhZ05hbWUiLCJjb250ZW50Iiwic2V0QXR0cmlidXRlIiwiZ2V0U2VsZWN0b3IiLCJpZCIsImVsZW1zIiwicXVlcnlTZWxlY3RvckFsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxDQUFDO0FBQ0QsTztRQ1ZBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxHQUFHOztRQUVIO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsTUFBTTtRQUNOO1FBQ0E7UUFDQSxNQUFNO1FBQ047UUFDQTtRQUNBLE1BQU07UUFDTjtRQUNBO1FBQ0E7UUFDQSxPQUFPO1FBQ1A7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsSUFBSTtRQUNKOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsTUFBTTtRQUNOO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLE1BQU07UUFDTjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsS0FBSzs7UUFFTDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQSw2QkFBNkI7UUFDN0IsNkJBQTZCO1FBQzdCO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EscUJBQXFCLGdCQUFnQjtRQUNyQztRQUNBO1FBQ0EsS0FBSztRQUNMO1FBQ0E7UUFDQTtRQUNBLHFCQUFxQixnQkFBZ0I7UUFDckM7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBO1FBQ0EsS0FBSztRQUNMO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTtRQUNBO1FBQ0EsS0FBSztRQUNMO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsS0FBSzs7UUFFTDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBO1FBQ0E7UUFDQSxLQUFLOztRQUVMO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQSxrQkFBa0IsOEJBQThCO1FBQ2hEO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsS0FBSztRQUNMO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxJQUFJO1FBQ0o7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSxJQUFJO1FBQ0o7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxNQUFNO1FBQ047UUFDQTtRQUNBO1FBQ0EsT0FBTztRQUNQO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsSUFBSTtRQUNKO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsS0FBSztRQUNMO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLG9CQUFvQiwyQkFBMkI7UUFDL0M7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLE9BQU87UUFDUDtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0EsbUJBQW1CLGNBQWM7UUFDakM7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLGdCQUFnQixLQUFLO1FBQ3JCO1FBQ0E7UUFDQTtRQUNBLE1BQU07UUFDTjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsZ0JBQWdCLFlBQVk7UUFDNUI7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQSxjQUFjLDRCQUE0QjtRQUMxQztRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLE1BQU07UUFDTjtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLElBQUk7O1FBRUo7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBOztRQUVBO1FBQ0E7UUFDQSxlQUFlLDRCQUE0QjtRQUMzQztRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBLGVBQWUsNEJBQTRCO1FBQzNDO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxpQkFBaUIsdUNBQXVDO1FBQ3hEO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtR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QUFQO0FBQ0Q7QUFDRjs7QUFFRCxRQUFNK0ssT0FBTyxHQUFHaEwsRUFBRSxDQUFDZ0wsT0FBSCxDQUFXTixXQUFYLEVBQWhCO0FBRUEsZ0JBQVVNLE9BQVYsR0FBb0IvSyxTQUFwQjtBQUNELEdBckJNIiwiZmlsZSI6InRvYXN0dWktc2VsZWN0LWJveC5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlNlbGVjdEJveFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJ0dWlcIl0gPSByb290W1widHVpXCJdIHx8IHt9LCByb290W1widHVpXCJdW1wiU2VsZWN0Qm94XCJdID0gZmFjdG9yeSgpO1xufSkod2luZG93LCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIgXHRmdW5jdGlvbiBob3REaXNwb3NlQ2h1bmsoY2h1bmtJZCkge1xuIFx0XHRkZWxldGUgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdO1xuIFx0fVxuIFx0dmFyIHBhcmVudEhvdFVwZGF0ZUNhbGxiYWNrID0gd2luZG93W1wid2VicGFja0hvdFVwZGF0ZVwiXTtcbiBcdHdpbmRvd1tcIndlYnBhY2tIb3RVcGRhdGVcIl0gPSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiBcdGZ1bmN0aW9uIHdlYnBhY2tIb3RVcGRhdGVDYWxsYmFjayhjaHVua0lkLCBtb3JlTW9kdWxlcykge1xuIFx0XHRob3RBZGRVcGRhdGVDaHVuayhjaHVua0lkLCBtb3JlTW9kdWxlcyk7XG4gXHRcdGlmIChwYXJlbnRIb3RVcGRhdGVDYWxsYmFjaykgcGFyZW50SG90VXBkYXRlQ2FsbGJhY2soY2h1bmtJZCwgbW9yZU1vZHVsZXMpO1xuIFx0fSA7XG5cbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0ZnVuY3Rpb24gaG90RG93bmxvYWRVcGRhdGVDaHVuayhjaHVua0lkKSB7XG4gXHRcdHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuIFx0XHRzY3JpcHQuY2hhcnNldCA9IFwidXRmLThcIjtcbiBcdFx0c2NyaXB0LnNyYyA9IF9fd2VicGFja19yZXF1aXJlX18ucCArIFwiXCIgKyBjaHVua0lkICsgXCIuXCIgKyBob3RDdXJyZW50SGFzaCArIFwiLmhvdC11cGRhdGUuanNcIjtcbiBcdFx0aWYgKG51bGwpIHNjcmlwdC5jcm9zc09yaWdpbiA9IG51bGw7XG4gXHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiBcdH1cblxuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHRmdW5jdGlvbiBob3REb3dubG9hZE1hbmlmZXN0KHJlcXVlc3RUaW1lb3V0KSB7XG4gXHRcdHJlcXVlc3RUaW1lb3V0ID0gcmVxdWVzdFRpbWVvdXQgfHwgMTAwMDA7XG4gXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiBcdFx0XHRpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gXHRcdFx0XHRyZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcIk5vIGJyb3dzZXIgc3VwcG9ydFwiKSk7XG4gXHRcdFx0fVxuIFx0XHRcdHRyeSB7XG4gXHRcdFx0XHR2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuIFx0XHRcdFx0dmFyIHJlcXVlc3RQYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXy5wICsgXCJcIiArIGhvdEN1cnJlbnRIYXNoICsgXCIuaG90LXVwZGF0ZS5qc29uXCI7XG4gXHRcdFx0XHRyZXF1ZXN0Lm9wZW4oXCJHRVRcIiwgcmVxdWVzdFBhdGgsIHRydWUpO1xuIFx0XHRcdFx0cmVxdWVzdC50aW1lb3V0ID0gcmVxdWVzdFRpbWVvdXQ7XG4gXHRcdFx0XHRyZXF1ZXN0LnNlbmQobnVsbCk7XG4gXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG4gXHRcdFx0XHRyZXR1cm4gcmVqZWN0KGVycik7XG4gXHRcdFx0fVxuIFx0XHRcdHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gXHRcdFx0XHRpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSByZXR1cm47XG4gXHRcdFx0XHRpZiAocmVxdWVzdC5zdGF0dXMgPT09IDApIHtcbiBcdFx0XHRcdFx0Ly8gdGltZW91dFxuIFx0XHRcdFx0XHRyZWplY3QoXG4gXHRcdFx0XHRcdFx0bmV3IEVycm9yKFwiTWFuaWZlc3QgcmVxdWVzdCB0byBcIiArIHJlcXVlc3RQYXRoICsgXCIgdGltZWQgb3V0LlwiKVxuIFx0XHRcdFx0XHQpO1xuIFx0XHRcdFx0fSBlbHNlIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gNDA0KSB7XG4gXHRcdFx0XHRcdC8vIG5vIHVwZGF0ZSBhdmFpbGFibGVcbiBcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuIFx0XHRcdFx0fSBlbHNlIGlmIChyZXF1ZXN0LnN0YXR1cyAhPT0gMjAwICYmIHJlcXVlc3Quc3RhdHVzICE9PSAzMDQpIHtcbiBcdFx0XHRcdFx0Ly8gb3RoZXIgZmFpbHVyZVxuIFx0XHRcdFx0XHRyZWplY3QobmV3IEVycm9yKFwiTWFuaWZlc3QgcmVxdWVzdCB0byBcIiArIHJlcXVlc3RQYXRoICsgXCIgZmFpbGVkLlwiKSk7XG4gXHRcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0XHQvLyBzdWNjZXNzXG4gXHRcdFx0XHRcdHRyeSB7XG4gXHRcdFx0XHRcdFx0dmFyIHVwZGF0ZSA9IEpTT04ucGFyc2UocmVxdWVzdC5yZXNwb25zZVRleHQpO1xuIFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG4gXHRcdFx0XHRcdFx0cmVqZWN0KGUpO1xuIFx0XHRcdFx0XHRcdHJldHVybjtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRyZXNvbHZlKHVwZGF0ZSk7XG4gXHRcdFx0XHR9XG4gXHRcdFx0fTtcbiBcdFx0fSk7XG4gXHR9XG5cbiBcdHZhciBob3RBcHBseU9uVXBkYXRlID0gdHJ1ZTtcbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0dmFyIGhvdEN1cnJlbnRIYXNoID0gXCJhOTdkNDMzZjlkMjI5N2RiMjE4MFwiO1xuIFx0dmFyIGhvdFJlcXVlc3RUaW1lb3V0ID0gMTAwMDA7XG4gXHR2YXIgaG90Q3VycmVudE1vZHVsZURhdGEgPSB7fTtcbiBcdHZhciBob3RDdXJyZW50Q2hpbGRNb2R1bGU7XG4gXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiBcdHZhciBob3RDdXJyZW50UGFyZW50cyA9IFtdO1xuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHR2YXIgaG90Q3VycmVudFBhcmVudHNUZW1wID0gW107XG5cbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0ZnVuY3Rpb24gaG90Q3JlYXRlUmVxdWlyZShtb2R1bGVJZCkge1xuIFx0XHR2YXIgbWUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0aWYgKCFtZSkgcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX187XG4gXHRcdHZhciBmbiA9IGZ1bmN0aW9uKHJlcXVlc3QpIHtcbiBcdFx0XHRpZiAobWUuaG90LmFjdGl2ZSkge1xuIFx0XHRcdFx0aWYgKGluc3RhbGxlZE1vZHVsZXNbcmVxdWVzdF0pIHtcbiBcdFx0XHRcdFx0aWYgKGluc3RhbGxlZE1vZHVsZXNbcmVxdWVzdF0ucGFyZW50cy5pbmRleE9mKG1vZHVsZUlkKSA9PT0gLTEpIHtcbiBcdFx0XHRcdFx0XHRpbnN0YWxsZWRNb2R1bGVzW3JlcXVlc3RdLnBhcmVudHMucHVzaChtb2R1bGVJZCk7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRcdGhvdEN1cnJlbnRQYXJlbnRzID0gW21vZHVsZUlkXTtcbiBcdFx0XHRcdFx0aG90Q3VycmVudENoaWxkTW9kdWxlID0gcmVxdWVzdDtcbiBcdFx0XHRcdH1cbiBcdFx0XHRcdGlmIChtZS5jaGlsZHJlbi5pbmRleE9mKHJlcXVlc3QpID09PSAtMSkge1xuIFx0XHRcdFx0XHRtZS5jaGlsZHJlbi5wdXNoKHJlcXVlc3QpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRjb25zb2xlLndhcm4oXG4gXHRcdFx0XHRcdFwiW0hNUl0gdW5leHBlY3RlZCByZXF1aXJlKFwiICtcbiBcdFx0XHRcdFx0XHRyZXF1ZXN0ICtcbiBcdFx0XHRcdFx0XHRcIikgZnJvbSBkaXNwb3NlZCBtb2R1bGUgXCIgK1xuIFx0XHRcdFx0XHRcdG1vZHVsZUlkXG4gXHRcdFx0XHQpO1xuIFx0XHRcdFx0aG90Q3VycmVudFBhcmVudHMgPSBbXTtcbiBcdFx0XHR9XG4gXHRcdFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18ocmVxdWVzdCk7XG4gXHRcdH07XG4gXHRcdHZhciBPYmplY3RGYWN0b3J5ID0gZnVuY3Rpb24gT2JqZWN0RmFjdG9yeShuYW1lKSB7XG4gXHRcdFx0cmV0dXJuIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuIFx0XHRcdFx0XHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfX1tuYW1lXTtcbiBcdFx0XHRcdH0sXG4gXHRcdFx0XHRzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gXHRcdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX19bbmFtZV0gPSB2YWx1ZTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9O1xuIFx0XHR9O1xuIFx0XHRmb3IgKHZhciBuYW1lIGluIF9fd2VicGFja19yZXF1aXJlX18pIHtcbiBcdFx0XHRpZiAoXG4gXHRcdFx0XHRPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoX193ZWJwYWNrX3JlcXVpcmVfXywgbmFtZSkgJiZcbiBcdFx0XHRcdG5hbWUgIT09IFwiZVwiICYmXG4gXHRcdFx0XHRuYW1lICE9PSBcInRcIlxuIFx0XHRcdCkge1xuIFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBuYW1lLCBPYmplY3RGYWN0b3J5KG5hbWUpKTtcbiBcdFx0XHR9XG4gXHRcdH1cbiBcdFx0Zm4uZSA9IGZ1bmN0aW9uKGNodW5rSWQpIHtcbiBcdFx0XHRpZiAoaG90U3RhdHVzID09PSBcInJlYWR5XCIpIGhvdFNldFN0YXR1cyhcInByZXBhcmVcIik7XG4gXHRcdFx0aG90Q2h1bmtzTG9hZGluZysrO1xuIFx0XHRcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLmUoY2h1bmtJZCkudGhlbihmaW5pc2hDaHVua0xvYWRpbmcsIGZ1bmN0aW9uKGVycikge1xuIFx0XHRcdFx0ZmluaXNoQ2h1bmtMb2FkaW5nKCk7XG4gXHRcdFx0XHR0aHJvdyBlcnI7XG4gXHRcdFx0fSk7XG5cbiBcdFx0XHRmdW5jdGlvbiBmaW5pc2hDaHVua0xvYWRpbmcoKSB7XG4gXHRcdFx0XHRob3RDaHVua3NMb2FkaW5nLS07XG4gXHRcdFx0XHRpZiAoaG90U3RhdHVzID09PSBcInByZXBhcmVcIikge1xuIFx0XHRcdFx0XHRpZiAoIWhvdFdhaXRpbmdGaWxlc01hcFtjaHVua0lkXSkge1xuIFx0XHRcdFx0XHRcdGhvdEVuc3VyZVVwZGF0ZUNodW5rKGNodW5rSWQpO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdGlmIChob3RDaHVua3NMb2FkaW5nID09PSAwICYmIGhvdFdhaXRpbmdGaWxlcyA9PT0gMCkge1xuIFx0XHRcdFx0XHRcdGhvdFVwZGF0ZURvd25sb2FkZWQoKTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0fTtcbiBcdFx0Zm4udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdFx0aWYgKG1vZGUgJiAxKSB2YWx1ZSA9IGZuKHZhbHVlKTtcbiBcdFx0XHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy50KHZhbHVlLCBtb2RlICYgfjEpO1xuIFx0XHR9O1xuIFx0XHRyZXR1cm4gZm47XG4gXHR9XG5cbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0ZnVuY3Rpb24gaG90Q3JlYXRlTW9kdWxlKG1vZHVsZUlkKSB7XG4gXHRcdHZhciBob3QgPSB7XG4gXHRcdFx0Ly8gcHJpdmF0ZSBzdHVmZlxuIFx0XHRcdF9hY2NlcHRlZERlcGVuZGVuY2llczoge30sXG4gXHRcdFx0X2RlY2xpbmVkRGVwZW5kZW5jaWVzOiB7fSxcbiBcdFx0XHRfc2VsZkFjY2VwdGVkOiBmYWxzZSxcbiBcdFx0XHRfc2VsZkRlY2xpbmVkOiBmYWxzZSxcbiBcdFx0XHRfc2VsZkludmFsaWRhdGVkOiBmYWxzZSxcbiBcdFx0XHRfZGlzcG9zZUhhbmRsZXJzOiBbXSxcbiBcdFx0XHRfbWFpbjogaG90Q3VycmVudENoaWxkTW9kdWxlICE9PSBtb2R1bGVJZCxcblxuIFx0XHRcdC8vIE1vZHVsZSBBUElcbiBcdFx0XHRhY3RpdmU6IHRydWUsXG4gXHRcdFx0YWNjZXB0OiBmdW5jdGlvbihkZXAsIGNhbGxiYWNrKSB7XG4gXHRcdFx0XHRpZiAoZGVwID09PSB1bmRlZmluZWQpIGhvdC5fc2VsZkFjY2VwdGVkID0gdHJ1ZTtcbiBcdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiBkZXAgPT09IFwiZnVuY3Rpb25cIikgaG90Ll9zZWxmQWNjZXB0ZWQgPSBkZXA7XG4gXHRcdFx0XHRlbHNlIGlmICh0eXBlb2YgZGVwID09PSBcIm9iamVjdFwiKVxuIFx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRlcC5sZW5ndGg7IGkrKylcbiBcdFx0XHRcdFx0XHRob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW2RlcFtpXV0gPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuIFx0XHRcdFx0ZWxzZSBob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW2RlcF0gPSBjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9O1xuIFx0XHRcdH0sXG4gXHRcdFx0ZGVjbGluZTogZnVuY3Rpb24oZGVwKSB7XG4gXHRcdFx0XHRpZiAoZGVwID09PSB1bmRlZmluZWQpIGhvdC5fc2VsZkRlY2xpbmVkID0gdHJ1ZTtcbiBcdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiBkZXAgPT09IFwib2JqZWN0XCIpXG4gXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGVwLmxlbmd0aDsgaSsrKVxuIFx0XHRcdFx0XHRcdGhvdC5fZGVjbGluZWREZXBlbmRlbmNpZXNbZGVwW2ldXSA9IHRydWU7XG4gXHRcdFx0XHRlbHNlIGhvdC5fZGVjbGluZWREZXBlbmRlbmNpZXNbZGVwXSA9IHRydWU7XG4gXHRcdFx0fSxcbiBcdFx0XHRkaXNwb3NlOiBmdW5jdGlvbihjYWxsYmFjaykge1xuIFx0XHRcdFx0aG90Ll9kaXNwb3NlSGFuZGxlcnMucHVzaChjYWxsYmFjayk7XG4gXHRcdFx0fSxcbiBcdFx0XHRhZGREaXNwb3NlSGFuZGxlcjogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiBcdFx0XHRcdGhvdC5fZGlzcG9zZUhhbmRsZXJzLnB1c2goY2FsbGJhY2spO1xuIFx0XHRcdH0sXG4gXHRcdFx0cmVtb3ZlRGlzcG9zZUhhbmRsZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gXHRcdFx0XHR2YXIgaWR4ID0gaG90Ll9kaXNwb3NlSGFuZGxlcnMuaW5kZXhPZihjYWxsYmFjayk7XG4gXHRcdFx0XHRpZiAoaWR4ID49IDApIGhvdC5fZGlzcG9zZUhhbmRsZXJzLnNwbGljZShpZHgsIDEpO1xuIFx0XHRcdH0sXG4gXHRcdFx0aW52YWxpZGF0ZTogZnVuY3Rpb24oKSB7XG4gXHRcdFx0XHR0aGlzLl9zZWxmSW52YWxpZGF0ZWQgPSB0cnVlO1xuIFx0XHRcdFx0c3dpdGNoIChob3RTdGF0dXMpIHtcbiBcdFx0XHRcdFx0Y2FzZSBcImlkbGVcIjpcbiBcdFx0XHRcdFx0XHRob3RVcGRhdGUgPSB7fTtcbiBcdFx0XHRcdFx0XHRob3RVcGRhdGVbbW9kdWxlSWRdID0gbW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0XHRcdFx0aG90U2V0U3RhdHVzKFwicmVhZHlcIik7XG4gXHRcdFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0XHRcdGNhc2UgXCJyZWFkeVwiOlxuIFx0XHRcdFx0XHRcdGhvdEFwcGx5SW52YWxpZGF0ZWRNb2R1bGUobW9kdWxlSWQpO1xuIFx0XHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0XHRjYXNlIFwicHJlcGFyZVwiOlxuIFx0XHRcdFx0XHRjYXNlIFwiY2hlY2tcIjpcbiBcdFx0XHRcdFx0Y2FzZSBcImRpc3Bvc2VcIjpcbiBcdFx0XHRcdFx0Y2FzZSBcImFwcGx5XCI6XG4gXHRcdFx0XHRcdFx0KGhvdFF1ZXVlZEludmFsaWRhdGVkTW9kdWxlcyA9XG4gXHRcdFx0XHRcdFx0XHRob3RRdWV1ZWRJbnZhbGlkYXRlZE1vZHVsZXMgfHwgW10pLnB1c2gobW9kdWxlSWQpO1xuIFx0XHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0XHRkZWZhdWx0OlxuIFx0XHRcdFx0XHRcdC8vIGlnbm9yZSByZXF1ZXN0cyBpbiBlcnJvciBzdGF0ZXNcbiBcdFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdH1cbiBcdFx0XHR9LFxuXG4gXHRcdFx0Ly8gTWFuYWdlbWVudCBBUElcbiBcdFx0XHRjaGVjazogaG90Q2hlY2ssXG4gXHRcdFx0YXBwbHk6IGhvdEFwcGx5LFxuIFx0XHRcdHN0YXR1czogZnVuY3Rpb24obCkge1xuIFx0XHRcdFx0aWYgKCFsKSByZXR1cm4gaG90U3RhdHVzO1xuIFx0XHRcdFx0aG90U3RhdHVzSGFuZGxlcnMucHVzaChsKTtcbiBcdFx0XHR9LFxuIFx0XHRcdGFkZFN0YXR1c0hhbmRsZXI6IGZ1bmN0aW9uKGwpIHtcbiBcdFx0XHRcdGhvdFN0YXR1c0hhbmRsZXJzLnB1c2gobCk7XG4gXHRcdFx0fSxcbiBcdFx0XHRyZW1vdmVTdGF0dXNIYW5kbGVyOiBmdW5jdGlvbihsKSB7XG4gXHRcdFx0XHR2YXIgaWR4ID0gaG90U3RhdHVzSGFuZGxlcnMuaW5kZXhPZihsKTtcbiBcdFx0XHRcdGlmIChpZHggPj0gMCkgaG90U3RhdHVzSGFuZGxlcnMuc3BsaWNlKGlkeCwgMSk7XG4gXHRcdFx0fSxcblxuIFx0XHRcdC8vaW5oZXJpdCBmcm9tIHByZXZpb3VzIGRpc3Bvc2UgY2FsbFxuIFx0XHRcdGRhdGE6IGhvdEN1cnJlbnRNb2R1bGVEYXRhW21vZHVsZUlkXVxuIFx0XHR9O1xuIFx0XHRob3RDdXJyZW50Q2hpbGRNb2R1bGUgPSB1bmRlZmluZWQ7XG4gXHRcdHJldHVybiBob3Q7XG4gXHR9XG5cbiBcdHZhciBob3RTdGF0dXNIYW5kbGVycyA9IFtdO1xuIFx0dmFyIGhvdFN0YXR1cyA9IFwiaWRsZVwiO1xuXG4gXHRmdW5jdGlvbiBob3RTZXRTdGF0dXMobmV3U3RhdHVzKSB7XG4gXHRcdGhvdFN0YXR1cyA9IG5ld1N0YXR1cztcbiBcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBob3RTdGF0dXNIYW5kbGVycy5sZW5ndGg7IGkrKylcbiBcdFx0XHRob3RTdGF0dXNIYW5kbGVyc1tpXS5jYWxsKG51bGwsIG5ld1N0YXR1cyk7XG4gXHR9XG5cbiBcdC8vIHdoaWxlIGRvd25sb2FkaW5nXG4gXHR2YXIgaG90V2FpdGluZ0ZpbGVzID0gMDtcbiBcdHZhciBob3RDaHVua3NMb2FkaW5nID0gMDtcbiBcdHZhciBob3RXYWl0aW5nRmlsZXNNYXAgPSB7fTtcbiBcdHZhciBob3RSZXF1ZXN0ZWRGaWxlc01hcCA9IHt9O1xuIFx0dmFyIGhvdEF2YWlsYWJsZUZpbGVzTWFwID0ge307XG4gXHR2YXIgaG90RGVmZXJyZWQ7XG5cbiBcdC8vIFRoZSB1cGRhdGUgaW5mb1xuIFx0dmFyIGhvdFVwZGF0ZSwgaG90VXBkYXRlTmV3SGFzaCwgaG90UXVldWVkSW52YWxpZGF0ZWRNb2R1bGVzO1xuXG4gXHRmdW5jdGlvbiB0b01vZHVsZUlkKGlkKSB7XG4gXHRcdHZhciBpc051bWJlciA9ICtpZCArIFwiXCIgPT09IGlkO1xuIFx0XHRyZXR1cm4gaXNOdW1iZXIgPyAraWQgOiBpZDtcbiBcdH1cblxuIFx0ZnVuY3Rpb24gaG90Q2hlY2soYXBwbHkpIHtcbiBcdFx0aWYgKGhvdFN0YXR1cyAhPT0gXCJpZGxlXCIpIHtcbiBcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJjaGVjaygpIGlzIG9ubHkgYWxsb3dlZCBpbiBpZGxlIHN0YXR1c1wiKTtcbiBcdFx0fVxuIFx0XHRob3RBcHBseU9uVXBkYXRlID0gYXBwbHk7XG4gXHRcdGhvdFNldFN0YXR1cyhcImNoZWNrXCIpO1xuIFx0XHRyZXR1cm4gaG90RG93bmxvYWRNYW5pZmVzdChob3RSZXF1ZXN0VGltZW91dCkudGhlbihmdW5jdGlvbih1cGRhdGUpIHtcbiBcdFx0XHRpZiAoIXVwZGF0ZSkge1xuIFx0XHRcdFx0aG90U2V0U3RhdHVzKGhvdEFwcGx5SW52YWxpZGF0ZWRNb2R1bGVzKCkgPyBcInJlYWR5XCIgOiBcImlkbGVcIik7XG4gXHRcdFx0XHRyZXR1cm4gbnVsbDtcbiBcdFx0XHR9XG4gXHRcdFx0aG90UmVxdWVzdGVkRmlsZXNNYXAgPSB7fTtcbiBcdFx0XHRob3RXYWl0aW5nRmlsZXNNYXAgPSB7fTtcbiBcdFx0XHRob3RBdmFpbGFibGVGaWxlc01hcCA9IHVwZGF0ZS5jO1xuIFx0XHRcdGhvdFVwZGF0ZU5ld0hhc2ggPSB1cGRhdGUuaDtcblxuIFx0XHRcdGhvdFNldFN0YXR1cyhcInByZXBhcmVcIik7XG4gXHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiBcdFx0XHRcdGhvdERlZmVycmVkID0ge1xuIFx0XHRcdFx0XHRyZXNvbHZlOiByZXNvbHZlLFxuIFx0XHRcdFx0XHRyZWplY3Q6IHJlamVjdFxuIFx0XHRcdFx0fTtcbiBcdFx0XHR9KTtcbiBcdFx0XHRob3RVcGRhdGUgPSB7fTtcbiBcdFx0XHR2YXIgY2h1bmtJZCA9IFwibWFpblwiO1xuIFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb25lLWJsb2Nrc1xuIFx0XHRcdHtcbiBcdFx0XHRcdGhvdEVuc3VyZVVwZGF0ZUNodW5rKGNodW5rSWQpO1xuIFx0XHRcdH1cbiBcdFx0XHRpZiAoXG4gXHRcdFx0XHRob3RTdGF0dXMgPT09IFwicHJlcGFyZVwiICYmXG4gXHRcdFx0XHRob3RDaHVua3NMb2FkaW5nID09PSAwICYmXG4gXHRcdFx0XHRob3RXYWl0aW5nRmlsZXMgPT09IDBcbiBcdFx0XHQpIHtcbiBcdFx0XHRcdGhvdFVwZGF0ZURvd25sb2FkZWQoKTtcbiBcdFx0XHR9XG4gXHRcdFx0cmV0dXJuIHByb21pc2U7XG4gXHRcdH0pO1xuIFx0fVxuXG4gXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiBcdGZ1bmN0aW9uIGhvdEFkZFVwZGF0ZUNodW5rKGNodW5rSWQsIG1vcmVNb2R1bGVzKSB7XG4gXHRcdGlmICghaG90QXZhaWxhYmxlRmlsZXNNYXBbY2h1bmtJZF0gfHwgIWhvdFJlcXVlc3RlZEZpbGVzTWFwW2NodW5rSWRdKVxuIFx0XHRcdHJldHVybjtcbiBcdFx0aG90UmVxdWVzdGVkRmlsZXNNYXBbY2h1bmtJZF0gPSBmYWxzZTtcbiBcdFx0Zm9yICh2YXIgbW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcbiBcdFx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcbiBcdFx0XHRcdGhvdFVwZGF0ZVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0fVxuIFx0XHR9XG4gXHRcdGlmICgtLWhvdFdhaXRpbmdGaWxlcyA9PT0gMCAmJiBob3RDaHVua3NMb2FkaW5nID09PSAwKSB7XG4gXHRcdFx0aG90VXBkYXRlRG93bmxvYWRlZCgpO1xuIFx0XHR9XG4gXHR9XG5cbiBcdGZ1bmN0aW9uIGhvdEVuc3VyZVVwZGF0ZUNodW5rKGNodW5rSWQpIHtcbiBcdFx0aWYgKCFob3RBdmFpbGFibGVGaWxlc01hcFtjaHVua0lkXSkge1xuIFx0XHRcdGhvdFdhaXRpbmdGaWxlc01hcFtjaHVua0lkXSA9IHRydWU7XG4gXHRcdH0gZWxzZSB7XG4gXHRcdFx0aG90UmVxdWVzdGVkRmlsZXNNYXBbY2h1bmtJZF0gPSB0cnVlO1xuIFx0XHRcdGhvdFdhaXRpbmdGaWxlcysrO1xuIFx0XHRcdGhvdERvd25sb2FkVXBkYXRlQ2h1bmsoY2h1bmtJZCk7XG4gXHRcdH1cbiBcdH1cblxuIFx0ZnVuY3Rpb24gaG90VXBkYXRlRG93bmxvYWRlZCgpIHtcbiBcdFx0aG90U2V0U3RhdHVzKFwicmVhZHlcIik7XG4gXHRcdHZhciBkZWZlcnJlZCA9IGhvdERlZmVycmVkO1xuIFx0XHRob3REZWZlcnJlZCA9IG51bGw7XG4gXHRcdGlmICghZGVmZXJyZWQpIHJldHVybjtcbiBcdFx0aWYgKGhvdEFwcGx5T25VcGRhdGUpIHtcbiBcdFx0XHQvLyBXcmFwIGRlZmVycmVkIG9iamVjdCBpbiBQcm9taXNlIHRvIG1hcmsgaXQgYXMgYSB3ZWxsLWhhbmRsZWQgUHJvbWlzZSB0b1xuIFx0XHRcdC8vIGF2b2lkIHRyaWdnZXJpbmcgdW5jYXVnaHQgZXhjZXB0aW9uIHdhcm5pbmcgaW4gQ2hyb21lLlxuIFx0XHRcdC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NjU2NjZcbiBcdFx0XHRQcm9taXNlLnJlc29sdmUoKVxuIFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG4gXHRcdFx0XHRcdHJldHVybiBob3RBcHBseShob3RBcHBseU9uVXBkYXRlKTtcbiBcdFx0XHRcdH0pXG4gXHRcdFx0XHQudGhlbihcbiBcdFx0XHRcdFx0ZnVuY3Rpb24ocmVzdWx0KSB7XG4gXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpO1xuIFx0XHRcdFx0XHR9LFxuIFx0XHRcdFx0XHRmdW5jdGlvbihlcnIpIHtcbiBcdFx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3QoZXJyKTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0KTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHR2YXIgb3V0ZGF0ZWRNb2R1bGVzID0gW107XG4gXHRcdFx0Zm9yICh2YXIgaWQgaW4gaG90VXBkYXRlKSB7XG4gXHRcdFx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhvdFVwZGF0ZSwgaWQpKSB7XG4gXHRcdFx0XHRcdG91dGRhdGVkTW9kdWxlcy5wdXNoKHRvTW9kdWxlSWQoaWQpKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZShvdXRkYXRlZE1vZHVsZXMpO1xuIFx0XHR9XG4gXHR9XG5cbiBcdGZ1bmN0aW9uIGhvdEFwcGx5KG9wdGlvbnMpIHtcbiBcdFx0aWYgKGhvdFN0YXR1cyAhPT0gXCJyZWFkeVwiKVxuIFx0XHRcdHRocm93IG5ldyBFcnJvcihcImFwcGx5KCkgaXMgb25seSBhbGxvd2VkIGluIHJlYWR5IHN0YXR1c1wiKTtcbiBcdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gXHRcdHJldHVybiBob3RBcHBseUludGVybmFsKG9wdGlvbnMpO1xuIFx0fVxuXG4gXHRmdW5jdGlvbiBob3RBcHBseUludGVybmFsKG9wdGlvbnMpIHtcbiBcdFx0aG90QXBwbHlJbnZhbGlkYXRlZE1vZHVsZXMoKTtcblxuIFx0XHR2YXIgY2I7XG4gXHRcdHZhciBpO1xuIFx0XHR2YXIgajtcbiBcdFx0dmFyIG1vZHVsZTtcbiBcdFx0dmFyIG1vZHVsZUlkO1xuXG4gXHRcdGZ1bmN0aW9uIGdldEFmZmVjdGVkU3R1ZmYodXBkYXRlTW9kdWxlSWQpIHtcbiBcdFx0XHR2YXIgb3V0ZGF0ZWRNb2R1bGVzID0gW3VwZGF0ZU1vZHVsZUlkXTtcbiBcdFx0XHR2YXIgb3V0ZGF0ZWREZXBlbmRlbmNpZXMgPSB7fTtcblxuIFx0XHRcdHZhciBxdWV1ZSA9IG91dGRhdGVkTW9kdWxlcy5tYXAoZnVuY3Rpb24oaWQpIHtcbiBcdFx0XHRcdHJldHVybiB7XG4gXHRcdFx0XHRcdGNoYWluOiBbaWRdLFxuIFx0XHRcdFx0XHRpZDogaWRcbiBcdFx0XHRcdH07XG4gXHRcdFx0fSk7XG4gXHRcdFx0d2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiBcdFx0XHRcdHZhciBxdWV1ZUl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiBcdFx0XHRcdHZhciBtb2R1bGVJZCA9IHF1ZXVlSXRlbS5pZDtcbiBcdFx0XHRcdHZhciBjaGFpbiA9IHF1ZXVlSXRlbS5jaGFpbjtcbiBcdFx0XHRcdG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xuIFx0XHRcdFx0aWYgKFxuIFx0XHRcdFx0XHQhbW9kdWxlIHx8XG4gXHRcdFx0XHRcdChtb2R1bGUuaG90Ll9zZWxmQWNjZXB0ZWQgJiYgIW1vZHVsZS5ob3QuX3NlbGZJbnZhbGlkYXRlZClcbiBcdFx0XHRcdClcbiBcdFx0XHRcdFx0Y29udGludWU7XG4gXHRcdFx0XHRpZiAobW9kdWxlLmhvdC5fc2VsZkRlY2xpbmVkKSB7XG4gXHRcdFx0XHRcdHJldHVybiB7XG4gXHRcdFx0XHRcdFx0dHlwZTogXCJzZWxmLWRlY2xpbmVkXCIsXG4gXHRcdFx0XHRcdFx0Y2hhaW46IGNoYWluLFxuIFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZFxuIFx0XHRcdFx0XHR9O1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0aWYgKG1vZHVsZS5ob3QuX21haW4pIHtcbiBcdFx0XHRcdFx0cmV0dXJuIHtcbiBcdFx0XHRcdFx0XHR0eXBlOiBcInVuYWNjZXB0ZWRcIixcbiBcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4sXG4gXHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkXG4gXHRcdFx0XHRcdH07XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG1vZHVsZS5wYXJlbnRzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0XHRcdHZhciBwYXJlbnRJZCA9IG1vZHVsZS5wYXJlbnRzW2ldO1xuIFx0XHRcdFx0XHR2YXIgcGFyZW50ID0gaW5zdGFsbGVkTW9kdWxlc1twYXJlbnRJZF07XG4gXHRcdFx0XHRcdGlmICghcGFyZW50KSBjb250aW51ZTtcbiBcdFx0XHRcdFx0aWYgKHBhcmVudC5ob3QuX2RlY2xpbmVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXSkge1xuIFx0XHRcdFx0XHRcdHJldHVybiB7XG4gXHRcdFx0XHRcdFx0XHR0eXBlOiBcImRlY2xpbmVkXCIsXG4gXHRcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4uY29uY2F0KFtwYXJlbnRJZF0pLFxuIFx0XHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkLFxuIFx0XHRcdFx0XHRcdFx0cGFyZW50SWQ6IHBhcmVudElkXG4gXHRcdFx0XHRcdFx0fTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRpZiAob3V0ZGF0ZWRNb2R1bGVzLmluZGV4T2YocGFyZW50SWQpICE9PSAtMSkgY29udGludWU7XG4gXHRcdFx0XHRcdGlmIChwYXJlbnQuaG90Ll9hY2NlcHRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRcdFx0XHRpZiAoIW91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXSlcbiBcdFx0XHRcdFx0XHRcdG91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXSA9IFtdO1xuIFx0XHRcdFx0XHRcdGFkZEFsbFRvU2V0KG91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXSwgW21vZHVsZUlkXSk7XG4gXHRcdFx0XHRcdFx0Y29udGludWU7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0ZGVsZXRlIG91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXTtcbiBcdFx0XHRcdFx0b3V0ZGF0ZWRNb2R1bGVzLnB1c2gocGFyZW50SWQpO1xuIFx0XHRcdFx0XHRxdWV1ZS5wdXNoKHtcbiBcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4uY29uY2F0KFtwYXJlbnRJZF0pLFxuIFx0XHRcdFx0XHRcdGlkOiBwYXJlbnRJZFxuIFx0XHRcdFx0XHR9KTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG5cbiBcdFx0XHRyZXR1cm4ge1xuIFx0XHRcdFx0dHlwZTogXCJhY2NlcHRlZFwiLFxuIFx0XHRcdFx0bW9kdWxlSWQ6IHVwZGF0ZU1vZHVsZUlkLFxuIFx0XHRcdFx0b3V0ZGF0ZWRNb2R1bGVzOiBvdXRkYXRlZE1vZHVsZXMsXG4gXHRcdFx0XHRvdXRkYXRlZERlcGVuZGVuY2llczogb3V0ZGF0ZWREZXBlbmRlbmNpZXNcbiBcdFx0XHR9O1xuIFx0XHR9XG5cbiBcdFx0ZnVuY3Rpb24gYWRkQWxsVG9TZXQoYSwgYikge1xuIFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykge1xuIFx0XHRcdFx0dmFyIGl0ZW0gPSBiW2ldO1xuIFx0XHRcdFx0aWYgKGEuaW5kZXhPZihpdGVtKSA9PT0gLTEpIGEucHVzaChpdGVtKTtcbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBhdCBiZWdpbiBhbGwgdXBkYXRlcyBtb2R1bGVzIGFyZSBvdXRkYXRlZFxuIFx0XHQvLyB0aGUgXCJvdXRkYXRlZFwiIHN0YXR1cyBjYW4gcHJvcGFnYXRlIHRvIHBhcmVudHMgaWYgdGhleSBkb24ndCBhY2NlcHQgdGhlIGNoaWxkcmVuXG4gXHRcdHZhciBvdXRkYXRlZERlcGVuZGVuY2llcyA9IHt9O1xuIFx0XHR2YXIgb3V0ZGF0ZWRNb2R1bGVzID0gW107XG4gXHRcdHZhciBhcHBsaWVkVXBkYXRlID0ge307XG5cbiBcdFx0dmFyIHdhcm5VbmV4cGVjdGVkUmVxdWlyZSA9IGZ1bmN0aW9uIHdhcm5VbmV4cGVjdGVkUmVxdWlyZSgpIHtcbiBcdFx0XHRjb25zb2xlLndhcm4oXG4gXHRcdFx0XHRcIltITVJdIHVuZXhwZWN0ZWQgcmVxdWlyZShcIiArIHJlc3VsdC5tb2R1bGVJZCArIFwiKSB0byBkaXNwb3NlZCBtb2R1bGVcIlxuIFx0XHRcdCk7XG4gXHRcdH07XG5cbiBcdFx0Zm9yICh2YXIgaWQgaW4gaG90VXBkYXRlKSB7XG4gXHRcdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChob3RVcGRhdGUsIGlkKSkge1xuIFx0XHRcdFx0bW9kdWxlSWQgPSB0b01vZHVsZUlkKGlkKTtcbiBcdFx0XHRcdC8qKiBAdHlwZSB7VE9ET30gKi9cbiBcdFx0XHRcdHZhciByZXN1bHQ7XG4gXHRcdFx0XHRpZiAoaG90VXBkYXRlW2lkXSkge1xuIFx0XHRcdFx0XHRyZXN1bHQgPSBnZXRBZmZlY3RlZFN0dWZmKG1vZHVsZUlkKTtcbiBcdFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRcdHJlc3VsdCA9IHtcbiBcdFx0XHRcdFx0XHR0eXBlOiBcImRpc3Bvc2VkXCIsXG4gXHRcdFx0XHRcdFx0bW9kdWxlSWQ6IGlkXG4gXHRcdFx0XHRcdH07XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHQvKiogQHR5cGUge0Vycm9yfGZhbHNlfSAqL1xuIFx0XHRcdFx0dmFyIGFib3J0RXJyb3IgPSBmYWxzZTtcbiBcdFx0XHRcdHZhciBkb0FwcGx5ID0gZmFsc2U7XG4gXHRcdFx0XHR2YXIgZG9EaXNwb3NlID0gZmFsc2U7XG4gXHRcdFx0XHR2YXIgY2hhaW5JbmZvID0gXCJcIjtcbiBcdFx0XHRcdGlmIChyZXN1bHQuY2hhaW4pIHtcbiBcdFx0XHRcdFx0Y2hhaW5JbmZvID0gXCJcXG5VcGRhdGUgcHJvcGFnYXRpb246IFwiICsgcmVzdWx0LmNoYWluLmpvaW4oXCIgLT4gXCIpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0c3dpdGNoIChyZXN1bHQudHlwZSkge1xuIFx0XHRcdFx0XHRjYXNlIFwic2VsZi1kZWNsaW5lZFwiOlxuIFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uRGVjbGluZWQpIG9wdGlvbnMub25EZWNsaW5lZChyZXN1bHQpO1xuIFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVEZWNsaW5lZClcbiBcdFx0XHRcdFx0XHRcdGFib3J0RXJyb3IgPSBuZXcgRXJyb3IoXG4gXHRcdFx0XHRcdFx0XHRcdFwiQWJvcnRlZCBiZWNhdXNlIG9mIHNlbGYgZGVjbGluZTogXCIgK1xuIFx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdC5tb2R1bGVJZCArXG4gXHRcdFx0XHRcdFx0XHRcdFx0Y2hhaW5JbmZvXG4gXHRcdFx0XHRcdFx0XHQpO1xuIFx0XHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0XHRjYXNlIFwiZGVjbGluZWRcIjpcbiBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkRlY2xpbmVkKSBvcHRpb25zLm9uRGVjbGluZWQocmVzdWx0KTtcbiBcdFx0XHRcdFx0XHRpZiAoIW9wdGlvbnMuaWdub3JlRGVjbGluZWQpXG4gXHRcdFx0XHRcdFx0XHRhYm9ydEVycm9yID0gbmV3IEVycm9yKFxuIFx0XHRcdFx0XHRcdFx0XHRcIkFib3J0ZWQgYmVjYXVzZSBvZiBkZWNsaW5lZCBkZXBlbmRlbmN5OiBcIiArXG4gXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0Lm1vZHVsZUlkICtcbiBcdFx0XHRcdFx0XHRcdFx0XHRcIiBpbiBcIiArXG4gXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0LnBhcmVudElkICtcbiBcdFx0XHRcdFx0XHRcdFx0XHRjaGFpbkluZm9cbiBcdFx0XHRcdFx0XHRcdCk7XG4gXHRcdFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0XHRcdGNhc2UgXCJ1bmFjY2VwdGVkXCI6XG4gXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25VbmFjY2VwdGVkKSBvcHRpb25zLm9uVW5hY2NlcHRlZChyZXN1bHQpO1xuIFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVVbmFjY2VwdGVkKVxuIFx0XHRcdFx0XHRcdFx0YWJvcnRFcnJvciA9IG5ldyBFcnJvcihcbiBcdFx0XHRcdFx0XHRcdFx0XCJBYm9ydGVkIGJlY2F1c2UgXCIgKyBtb2R1bGVJZCArIFwiIGlzIG5vdCBhY2NlcHRlZFwiICsgY2hhaW5JbmZvXG4gXHRcdFx0XHRcdFx0XHQpO1xuIFx0XHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0XHRjYXNlIFwiYWNjZXB0ZWRcIjpcbiBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkFjY2VwdGVkKSBvcHRpb25zLm9uQWNjZXB0ZWQocmVzdWx0KTtcbiBcdFx0XHRcdFx0XHRkb0FwcGx5ID0gdHJ1ZTtcbiBcdFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdFx0Y2FzZSBcImRpc3Bvc2VkXCI6XG4gXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25EaXNwb3NlZCkgb3B0aW9ucy5vbkRpc3Bvc2VkKHJlc3VsdCk7XG4gXHRcdFx0XHRcdFx0ZG9EaXNwb3NlID0gdHJ1ZTtcbiBcdFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdFx0ZGVmYXVsdDpcbiBcdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmV4Y2VwdGlvbiB0eXBlIFwiICsgcmVzdWx0LnR5cGUpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0aWYgKGFib3J0RXJyb3IpIHtcbiBcdFx0XHRcdFx0aG90U2V0U3RhdHVzKFwiYWJvcnRcIik7XG4gXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChhYm9ydEVycm9yKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHRcdGlmIChkb0FwcGx5KSB7XG4gXHRcdFx0XHRcdGFwcGxpZWRVcGRhdGVbbW9kdWxlSWRdID0gaG90VXBkYXRlW21vZHVsZUlkXTtcbiBcdFx0XHRcdFx0YWRkQWxsVG9TZXQob3V0ZGF0ZWRNb2R1bGVzLCByZXN1bHQub3V0ZGF0ZWRNb2R1bGVzKTtcbiBcdFx0XHRcdFx0Zm9yIChtb2R1bGVJZCBpbiByZXN1bHQub3V0ZGF0ZWREZXBlbmRlbmNpZXMpIHtcbiBcdFx0XHRcdFx0XHRpZiAoXG4gXHRcdFx0XHRcdFx0XHRPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gXHRcdFx0XHRcdFx0XHRcdHJlc3VsdC5vdXRkYXRlZERlcGVuZGVuY2llcyxcbiBcdFx0XHRcdFx0XHRcdFx0bW9kdWxlSWRcbiBcdFx0XHRcdFx0XHRcdClcbiBcdFx0XHRcdFx0XHQpIHtcbiBcdFx0XHRcdFx0XHRcdGlmICghb3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdKVxuIFx0XHRcdFx0XHRcdFx0XHRvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0gPSBbXTtcbiBcdFx0XHRcdFx0XHRcdGFkZEFsbFRvU2V0KFxuIFx0XHRcdFx0XHRcdFx0XHRvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0sXG4gXHRcdFx0XHRcdFx0XHRcdHJlc3VsdC5vdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF1cbiBcdFx0XHRcdFx0XHRcdCk7XG4gXHRcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHRpZiAoZG9EaXNwb3NlKSB7XG4gXHRcdFx0XHRcdGFkZEFsbFRvU2V0KG91dGRhdGVkTW9kdWxlcywgW3Jlc3VsdC5tb2R1bGVJZF0pO1xuIFx0XHRcdFx0XHRhcHBsaWVkVXBkYXRlW21vZHVsZUlkXSA9IHdhcm5VbmV4cGVjdGVkUmVxdWlyZTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBTdG9yZSBzZWxmIGFjY2VwdGVkIG91dGRhdGVkIG1vZHVsZXMgdG8gcmVxdWlyZSB0aGVtIGxhdGVyIGJ5IHRoZSBtb2R1bGUgc3lzdGVtXG4gXHRcdHZhciBvdXRkYXRlZFNlbGZBY2NlcHRlZE1vZHVsZXMgPSBbXTtcbiBcdFx0Zm9yIChpID0gMDsgaSA8IG91dGRhdGVkTW9kdWxlcy5sZW5ndGg7IGkrKykge1xuIFx0XHRcdG1vZHVsZUlkID0gb3V0ZGF0ZWRNb2R1bGVzW2ldO1xuIFx0XHRcdGlmIChcbiBcdFx0XHRcdGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdICYmXG4gXHRcdFx0XHRpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5ob3QuX3NlbGZBY2NlcHRlZCAmJlxuIFx0XHRcdFx0Ly8gcmVtb3ZlZCBzZWxmLWFjY2VwdGVkIG1vZHVsZXMgc2hvdWxkIG5vdCBiZSByZXF1aXJlZFxuIFx0XHRcdFx0YXBwbGllZFVwZGF0ZVttb2R1bGVJZF0gIT09IHdhcm5VbmV4cGVjdGVkUmVxdWlyZSAmJlxuIFx0XHRcdFx0Ly8gd2hlbiBjYWxsZWQgaW52YWxpZGF0ZSBzZWxmLWFjY2VwdGluZyBpcyBub3QgcG9zc2libGVcbiBcdFx0XHRcdCFpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5ob3QuX3NlbGZJbnZhbGlkYXRlZFxuIFx0XHRcdCkge1xuIFx0XHRcdFx0b3V0ZGF0ZWRTZWxmQWNjZXB0ZWRNb2R1bGVzLnB1c2goe1xuIFx0XHRcdFx0XHRtb2R1bGU6IG1vZHVsZUlkLFxuIFx0XHRcdFx0XHRwYXJlbnRzOiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5wYXJlbnRzLnNsaWNlKCksXG4gXHRcdFx0XHRcdGVycm9ySGFuZGxlcjogaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uaG90Ll9zZWxmQWNjZXB0ZWRcbiBcdFx0XHRcdH0pO1xuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIE5vdyBpbiBcImRpc3Bvc2VcIiBwaGFzZVxuIFx0XHRob3RTZXRTdGF0dXMoXCJkaXNwb3NlXCIpO1xuIFx0XHRPYmplY3Qua2V5cyhob3RBdmFpbGFibGVGaWxlc01hcCkuZm9yRWFjaChmdW5jdGlvbihjaHVua0lkKSB7XG4gXHRcdFx0aWYgKGhvdEF2YWlsYWJsZUZpbGVzTWFwW2NodW5rSWRdID09PSBmYWxzZSkge1xuIFx0XHRcdFx0aG90RGlzcG9zZUNodW5rKGNodW5rSWQpO1xuIFx0XHRcdH1cbiBcdFx0fSk7XG5cbiBcdFx0dmFyIGlkeDtcbiBcdFx0dmFyIHF1ZXVlID0gb3V0ZGF0ZWRNb2R1bGVzLnNsaWNlKCk7XG4gXHRcdHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gXHRcdFx0bW9kdWxlSWQgPSBxdWV1ZS5wb3AoKTtcbiBcdFx0XHRtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0XHRpZiAoIW1vZHVsZSkgY29udGludWU7XG5cbiBcdFx0XHR2YXIgZGF0YSA9IHt9O1xuXG4gXHRcdFx0Ly8gQ2FsbCBkaXNwb3NlIGhhbmRsZXJzXG4gXHRcdFx0dmFyIGRpc3Bvc2VIYW5kbGVycyA9IG1vZHVsZS5ob3QuX2Rpc3Bvc2VIYW5kbGVycztcbiBcdFx0XHRmb3IgKGogPSAwOyBqIDwgZGlzcG9zZUhhbmRsZXJzLmxlbmd0aDsgaisrKSB7XG4gXHRcdFx0XHRjYiA9IGRpc3Bvc2VIYW5kbGVyc1tqXTtcbiBcdFx0XHRcdGNiKGRhdGEpO1xuIFx0XHRcdH1cbiBcdFx0XHRob3RDdXJyZW50TW9kdWxlRGF0YVttb2R1bGVJZF0gPSBkYXRhO1xuXG4gXHRcdFx0Ly8gZGlzYWJsZSBtb2R1bGUgKHRoaXMgZGlzYWJsZXMgcmVxdWlyZXMgZnJvbSB0aGlzIG1vZHVsZSlcbiBcdFx0XHRtb2R1bGUuaG90LmFjdGl2ZSA9IGZhbHNlO1xuXG4gXHRcdFx0Ly8gcmVtb3ZlIG1vZHVsZSBmcm9tIGNhY2hlXG4gXHRcdFx0ZGVsZXRlIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xuXG4gXHRcdFx0Ly8gd2hlbiBkaXNwb3NpbmcgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIGRpc3Bvc2UgaGFuZGxlclxuIFx0XHRcdGRlbGV0ZSBvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF07XG5cbiBcdFx0XHQvLyByZW1vdmUgXCJwYXJlbnRzXCIgcmVmZXJlbmNlcyBmcm9tIGFsbCBjaGlsZHJlblxuIFx0XHRcdGZvciAoaiA9IDA7IGogPCBtb2R1bGUuY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiBcdFx0XHRcdHZhciBjaGlsZCA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlLmNoaWxkcmVuW2pdXTtcbiBcdFx0XHRcdGlmICghY2hpbGQpIGNvbnRpbnVlO1xuIFx0XHRcdFx0aWR4ID0gY2hpbGQucGFyZW50cy5pbmRleE9mKG1vZHVsZUlkKTtcbiBcdFx0XHRcdGlmIChpZHggPj0gMCkge1xuIFx0XHRcdFx0XHRjaGlsZC5wYXJlbnRzLnNwbGljZShpZHgsIDEpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIHJlbW92ZSBvdXRkYXRlZCBkZXBlbmRlbmN5IGZyb20gbW9kdWxlIGNoaWxkcmVuXG4gXHRcdHZhciBkZXBlbmRlbmN5O1xuIFx0XHR2YXIgbW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXM7XG4gXHRcdGZvciAobW9kdWxlSWQgaW4gb3V0ZGF0ZWREZXBlbmRlbmNpZXMpIHtcbiBcdFx0XHRpZiAoXG4gXHRcdFx0XHRPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3V0ZGF0ZWREZXBlbmRlbmNpZXMsIG1vZHVsZUlkKVxuIFx0XHRcdCkge1xuIFx0XHRcdFx0bW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0XHRpZiAobW9kdWxlKSB7XG4gXHRcdFx0XHRcdG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzID0gb3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdO1xuIFx0XHRcdFx0XHRmb3IgKGogPSAwOyBqIDwgbW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXMubGVuZ3RoOyBqKyspIHtcbiBcdFx0XHRcdFx0XHRkZXBlbmRlbmN5ID0gbW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXNbal07XG4gXHRcdFx0XHRcdFx0aWR4ID0gbW9kdWxlLmNoaWxkcmVuLmluZGV4T2YoZGVwZW5kZW5jeSk7XG4gXHRcdFx0XHRcdFx0aWYgKGlkeCA+PSAwKSBtb2R1bGUuY2hpbGRyZW4uc3BsaWNlKGlkeCwgMSk7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBOb3cgaW4gXCJhcHBseVwiIHBoYXNlXG4gXHRcdGhvdFNldFN0YXR1cyhcImFwcGx5XCIpO1xuXG4gXHRcdGlmIChob3RVcGRhdGVOZXdIYXNoICE9PSB1bmRlZmluZWQpIHtcbiBcdFx0XHRob3RDdXJyZW50SGFzaCA9IGhvdFVwZGF0ZU5ld0hhc2g7XG4gXHRcdFx0aG90VXBkYXRlTmV3SGFzaCA9IHVuZGVmaW5lZDtcbiBcdFx0fVxuIFx0XHRob3RVcGRhdGUgPSB1bmRlZmluZWQ7XG5cbiBcdFx0Ly8gaW5zZXJ0IG5ldyBjb2RlXG4gXHRcdGZvciAobW9kdWxlSWQgaW4gYXBwbGllZFVwZGF0ZSkge1xuIFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXBwbGllZFVwZGF0ZSwgbW9kdWxlSWQpKSB7XG4gXHRcdFx0XHRtb2R1bGVzW21vZHVsZUlkXSA9IGFwcGxpZWRVcGRhdGVbbW9kdWxlSWRdO1xuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIGNhbGwgYWNjZXB0IGhhbmRsZXJzXG4gXHRcdHZhciBlcnJvciA9IG51bGw7XG4gXHRcdGZvciAobW9kdWxlSWQgaW4gb3V0ZGF0ZWREZXBlbmRlbmNpZXMpIHtcbiBcdFx0XHRpZiAoXG4gXHRcdFx0XHRPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3V0ZGF0ZWREZXBlbmRlbmNpZXMsIG1vZHVsZUlkKVxuIFx0XHRcdCkge1xuIFx0XHRcdFx0bW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0XHRpZiAobW9kdWxlKSB7XG4gXHRcdFx0XHRcdG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzID0gb3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdO1xuIFx0XHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gW107XG4gXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuIFx0XHRcdFx0XHRcdGRlcGVuZGVuY3kgPSBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llc1tpXTtcbiBcdFx0XHRcdFx0XHRjYiA9IG1vZHVsZS5ob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuIFx0XHRcdFx0XHRcdGlmIChjYikge1xuIFx0XHRcdFx0XHRcdFx0aWYgKGNhbGxiYWNrcy5pbmRleE9mKGNiKSAhPT0gLTEpIGNvbnRpbnVlO1xuIFx0XHRcdFx0XHRcdFx0Y2FsbGJhY2tzLnB1c2goY2IpO1xuIFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0XHRcdFx0Y2IgPSBjYWxsYmFja3NbaV07XG4gXHRcdFx0XHRcdFx0dHJ5IHtcbiBcdFx0XHRcdFx0XHRcdGNiKG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzKTtcbiBcdFx0XHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcbiBcdFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uRXJyb3JlZCkge1xuIFx0XHRcdFx0XHRcdFx0XHRvcHRpb25zLm9uRXJyb3JlZCh7XG4gXHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJhY2NlcHQtZXJyb3JlZFwiLFxuIFx0XHRcdFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZCxcbiBcdFx0XHRcdFx0XHRcdFx0XHRkZXBlbmRlbmN5SWQ6IG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzW2ldLFxuIFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yOiBlcnJcbiBcdFx0XHRcdFx0XHRcdFx0fSk7XG4gXHRcdFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdFx0XHRpZiAoIW9wdGlvbnMuaWdub3JlRXJyb3JlZCkge1xuIFx0XHRcdFx0XHRcdFx0XHRpZiAoIWVycm9yKSBlcnJvciA9IGVycjtcbiBcdFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBMb2FkIHNlbGYgYWNjZXB0ZWQgbW9kdWxlc1xuIFx0XHRmb3IgKGkgPSAwOyBpIDwgb3V0ZGF0ZWRTZWxmQWNjZXB0ZWRNb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0dmFyIGl0ZW0gPSBvdXRkYXRlZFNlbGZBY2NlcHRlZE1vZHVsZXNbaV07XG4gXHRcdFx0bW9kdWxlSWQgPSBpdGVtLm1vZHVsZTtcbiBcdFx0XHRob3RDdXJyZW50UGFyZW50cyA9IGl0ZW0ucGFyZW50cztcbiBcdFx0XHRob3RDdXJyZW50Q2hpbGRNb2R1bGUgPSBtb2R1bGVJZDtcbiBcdFx0XHR0cnkge1xuIFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCk7XG4gXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG4gXHRcdFx0XHRpZiAodHlwZW9mIGl0ZW0uZXJyb3JIYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiBcdFx0XHRcdFx0dHJ5IHtcbiBcdFx0XHRcdFx0XHRpdGVtLmVycm9ySGFuZGxlcihlcnIpO1xuIFx0XHRcdFx0XHR9IGNhdGNoIChlcnIyKSB7XG4gXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25FcnJvcmVkKSB7XG4gXHRcdFx0XHRcdFx0XHRvcHRpb25zLm9uRXJyb3JlZCh7XG4gXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwic2VsZi1hY2NlcHQtZXJyb3ItaGFuZGxlci1lcnJvcmVkXCIsXG4gXHRcdFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZCxcbiBcdFx0XHRcdFx0XHRcdFx0ZXJyb3I6IGVycjIsXG4gXHRcdFx0XHRcdFx0XHRcdG9yaWdpbmFsRXJyb3I6IGVyclxuIFx0XHRcdFx0XHRcdFx0fSk7XG4gXHRcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVFcnJvcmVkKSB7XG4gXHRcdFx0XHRcdFx0XHRpZiAoIWVycm9yKSBlcnJvciA9IGVycjI7XG4gXHRcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRcdGlmICghZXJyb3IpIGVycm9yID0gZXJyO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkVycm9yZWQpIHtcbiBcdFx0XHRcdFx0XHRvcHRpb25zLm9uRXJyb3JlZCh7XG4gXHRcdFx0XHRcdFx0XHR0eXBlOiBcInNlbGYtYWNjZXB0LWVycm9yZWRcIixcbiBcdFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZCxcbiBcdFx0XHRcdFx0XHRcdGVycm9yOiBlcnJcbiBcdFx0XHRcdFx0XHR9KTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRpZiAoIW9wdGlvbnMuaWdub3JlRXJyb3JlZCkge1xuIFx0XHRcdFx0XHRcdGlmICghZXJyb3IpIGVycm9yID0gZXJyO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHR9XG4gXHRcdFx0fVxuIFx0XHR9XG5cbiBcdFx0Ly8gaGFuZGxlIGVycm9ycyBpbiBhY2NlcHQgaGFuZGxlcnMgYW5kIHNlbGYgYWNjZXB0ZWQgbW9kdWxlIGxvYWRcbiBcdFx0aWYgKGVycm9yKSB7XG4gXHRcdFx0aG90U2V0U3RhdHVzKFwiZmFpbFwiKTtcbiBcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuIFx0XHR9XG5cbiBcdFx0aWYgKGhvdFF1ZXVlZEludmFsaWRhdGVkTW9kdWxlcykge1xuIFx0XHRcdHJldHVybiBob3RBcHBseUludGVybmFsKG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24obGlzdCkge1xuIFx0XHRcdFx0b3V0ZGF0ZWRNb2R1bGVzLmZvckVhY2goZnVuY3Rpb24obW9kdWxlSWQpIHtcbiBcdFx0XHRcdFx0aWYgKGxpc3QuaW5kZXhPZihtb2R1bGVJZCkgPCAwKSBsaXN0LnB1c2gobW9kdWxlSWQpO1xuIFx0XHRcdFx0fSk7XG4gXHRcdFx0XHRyZXR1cm4gbGlzdDtcbiBcdFx0XHR9KTtcbiBcdFx0fVxuXG4gXHRcdGhvdFNldFN0YXR1cyhcImlkbGVcIik7XG4gXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG4gXHRcdFx0cmVzb2x2ZShvdXRkYXRlZE1vZHVsZXMpO1xuIFx0XHR9KTtcbiBcdH1cblxuIFx0ZnVuY3Rpb24gaG90QXBwbHlJbnZhbGlkYXRlZE1vZHVsZXMoKSB7XG4gXHRcdGlmIChob3RRdWV1ZWRJbnZhbGlkYXRlZE1vZHVsZXMpIHtcbiBcdFx0XHRpZiAoIWhvdFVwZGF0ZSkgaG90VXBkYXRlID0ge307XG4gXHRcdFx0aG90UXVldWVkSW52YWxpZGF0ZWRNb2R1bGVzLmZvckVhY2goaG90QXBwbHlJbnZhbGlkYXRlZE1vZHVsZSk7XG4gXHRcdFx0aG90UXVldWVkSW52YWxpZGF0ZWRNb2R1bGVzID0gdW5kZWZpbmVkO1xuIFx0XHRcdHJldHVybiB0cnVlO1xuIFx0XHR9XG4gXHR9XG5cbiBcdGZ1bmN0aW9uIGhvdEFwcGx5SW52YWxpZGF0ZWRNb2R1bGUobW9kdWxlSWQpIHtcbiBcdFx0aWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaG90VXBkYXRlLCBtb2R1bGVJZCkpXG4gXHRcdFx0aG90VXBkYXRlW21vZHVsZUlkXSA9IG1vZHVsZXNbbW9kdWxlSWRdO1xuIFx0fVxuXG4gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fSxcbiBcdFx0XHRob3Q6IGhvdENyZWF0ZU1vZHVsZShtb2R1bGVJZCksXG4gXHRcdFx0cGFyZW50czogKGhvdEN1cnJlbnRQYXJlbnRzVGVtcCA9IGhvdEN1cnJlbnRQYXJlbnRzLCBob3RDdXJyZW50UGFyZW50cyA9IFtdLCBob3RDdXJyZW50UGFyZW50c1RlbXApLFxuIFx0XHRcdGNoaWxkcmVuOiBbXVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBob3RDcmVhdGVSZXF1aXJlKG1vZHVsZUlkKSk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJkaXN0XCI7XG5cbiBcdC8vIF9fd2VicGFja19oYXNoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18uaCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gaG90Q3VycmVudEhhc2g7IH07XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gaG90Q3JlYXRlUmVxdWlyZShcIi4vc3JjL2pzL2luZGV4LmpzXCIpKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvanMvaW5kZXguanNcIik7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggYXQgd2hpY2ggYSBnaXZlbiBlbGVtZW50IGNhbiBiZSBmb3VuZCBpbiB0aGUgYXJyYXkuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vdHlwZS9pc0FycmF5Jyk7XG5cbi8qKlxuICogQG1vZHVsZSBhcnJheVxuICovXG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggYXQgd2hpY2ggYSBnaXZlbiBlbGVtZW50IGNhbiBiZSBmb3VuZCBpbiB0aGUgYXJyYXlcbiAqIGZyb20gc3RhcnQgaW5kZXgoZGVmYXVsdCAwKSwgb3IgLTEgaWYgaXQgaXMgbm90IHByZXNlbnQuXG4gKiBJdCBjb21wYXJlcyBzZWFyY2hFbGVtZW50IHRvIGVsZW1lbnRzIG9mIHRoZSBBcnJheSB1c2luZyBzdHJpY3QgZXF1YWxpdHlcbiAqICh0aGUgc2FtZSBtZXRob2QgdXNlZCBieSB0aGUgPT09LCBvciB0cmlwbGUtZXF1YWxzLCBvcGVyYXRvcikuXG4gKiBAcGFyYW0geyp9IHNlYXJjaEVsZW1lbnQgRWxlbWVudCB0byBsb2NhdGUgaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBBcnJheSB0aGF0IHdpbGwgYmUgdHJhdmVyc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0SW5kZXggU3RhcnQgaW5kZXggaW4gYXJyYXkgZm9yIHNlYXJjaGluZyAoZGVmYXVsdCAwKVxuICogQHJldHVybnMge251bWJlcn0gdGhlIEZpcnN0IGluZGV4IGF0IHdoaWNoIGEgZ2l2ZW4gZWxlbWVudCwgb3IgLTEgaWYgaXQgaXMgbm90IHByZXNlbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6YXJyYXlcbiAqIEBleGFtcGxlXG4gKiB2YXIgaW5BcnJheSA9IHJlcXVpcmUoJ3R1aS1jb2RlLXNuaXBwZXQvYXJyYXkvaW5BcnJheScpOyAvLyBub2RlLCBjb21tb25qc1xuICpcbiAqIHZhciBhcnIgPSBbJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91ciddO1xuICogdmFyIGlkeDEgPSBpbkFycmF5KCdvbmUnLCBhcnIsIDMpOyAvLyAtMVxuICogdmFyIGlkeDIgPSBpbkFycmF5KCdvbmUnLCBhcnIpOyAvLyAwXG4gKi9cbmZ1bmN0aW9uIGluQXJyYXkoc2VhcmNoRWxlbWVudCwgYXJyYXksIHN0YXJ0SW5kZXgpIHtcbiAgdmFyIGk7XG4gIHZhciBsZW5ndGg7XG4gIHN0YXJ0SW5kZXggPSBzdGFydEluZGV4IHx8IDA7XG5cbiAgaWYgKCFpc0FycmF5KGFycmF5KSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGFycmF5LCBzZWFyY2hFbGVtZW50LCBzdGFydEluZGV4KTtcbiAgfVxuXG4gIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgZm9yIChpID0gc3RhcnRJbmRleDsgc3RhcnRJbmRleCA+PSAwICYmIGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChhcnJheVtpXSA9PT0gc2VhcmNoRWxlbWVudCkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluQXJyYXk7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgRXhlY3V0ZSB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgb25jZSBmb3IgZWFjaCBwcm9wZXJ0eSBvZiBvYmplY3Qob3IgZWxlbWVudCBvZiBhcnJheSkgd2hpY2ggYWN0dWFsbHkgZXhpc3QuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi4vdHlwZS9pc0FycmF5Jyk7XG52YXIgZm9yRWFjaEFycmF5ID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbi9mb3JFYWNoQXJyYXknKTtcbnZhciBmb3JFYWNoT3duUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2NvbGxlY3Rpb24vZm9yRWFjaE93blByb3BlcnRpZXMnKTtcblxuLyoqXG4gKiBAbW9kdWxlIGNvbGxlY3Rpb25cbiAqL1xuXG4vKipcbiAqIEV4ZWN1dGUgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIG9uY2UgZm9yIGVhY2ggcHJvcGVydHkgb2Ygb2JqZWN0KG9yIGVsZW1lbnQgb2YgYXJyYXkpIHdoaWNoIGFjdHVhbGx5IGV4aXN0LlxuICogSWYgdGhlIG9iamVjdCBpcyBBcnJheS1saWtlIG9iamVjdChleC1hcmd1bWVudHMgb2JqZWN0KSwgSXQgbmVlZHMgdG8gdHJhbnNmb3JtIHRvIEFycmF5LihzZWUgJ2V4Micgb2YgZXhhbXBsZSkuXG4gKiBJZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIGxvb3Agd2lsbCBiZSBzdG9wcGVkLlxuICogQ2FsbGJhY2sgZnVuY3Rpb24oaXRlcmF0ZWUpIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAgMSkgVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eShvciBUaGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQpXG4gKiAgMikgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5KG9yIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudClcbiAqICAzKSBUaGUgb2JqZWN0IGJlaW5nIHRyYXZlcnNlZFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRoYXQgd2lsbCBiZSB0cmF2ZXJzZWRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGl0ZXJhdGVlIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdIENvbnRleHQodGhpcykgb2YgY2FsbGJhY2sgZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29sbGVjdGlvblxuICogQGV4YW1wbGVcbiAqIHZhciBmb3JFYWNoID0gcmVxdWlyZSgndHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL2ZvckVhY2gnKTsgLy8gbm9kZSwgY29tbW9uanNcbiAqXG4gKiB2YXIgc3VtID0gMDtcbiAqXG4gKiBmb3JFYWNoKFsxLDIsM10sIGZ1bmN0aW9uKHZhbHVlKXtcbiAqICAgICBzdW0gKz0gdmFsdWU7XG4gKiB9KTtcbiAqIGFsZXJ0KHN1bSk7IC8vIDZcbiAqXG4gKiAvLyBJbiBjYXNlIG9mIEFycmF5LWxpa2Ugb2JqZWN0XG4gKiB2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcnJheUxpa2UpOyAvLyBjaGFuZ2UgdG8gYXJyYXlcbiAqIGZvckVhY2goYXJyYXksIGZ1bmN0aW9uKHZhbHVlKXtcbiAqICAgICBzdW0gKz0gdmFsdWU7XG4gKiB9KTtcbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICBmb3JFYWNoQXJyYXkob2JqLCBpdGVyYXRlZSwgY29udGV4dCk7XG4gIH0gZWxzZSB7XG4gICAgZm9yRWFjaE93blByb3BlcnRpZXMob2JqLCBpdGVyYXRlZSwgY29udGV4dCk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmb3JFYWNoO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEV4ZWN1dGUgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIG9uY2UgZm9yIGVhY2ggZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheShvciBBcnJheS1saWtlIG9iamVjdCkgaW4gYXNjZW5kaW5nIG9yZGVyLlxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEV4ZWN1dGUgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIG9uY2UgZm9yIGVhY2ggZWxlbWVudCBwcmVzZW50XG4gKiBpbiB0aGUgYXJyYXkob3IgQXJyYXktbGlrZSBvYmplY3QpIGluIGFzY2VuZGluZyBvcmRlci5cbiAqIElmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgbG9vcCB3aWxsIGJlIHN0b3BwZWQuXG4gKiBDYWxsYmFjayBmdW5jdGlvbihpdGVyYXRlZSkgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICAxKSBUaGUgdmFsdWUgb2YgdGhlIGVsZW1lbnRcbiAqICAyKSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnRcbiAqICAzKSBUaGUgYXJyYXkob3IgQXJyYXktbGlrZSBvYmplY3QpIGJlaW5nIHRyYXZlcnNlZFxuICogQHBhcmFtIHtBcnJheXxBcmd1bWVudHN8Tm9kZUxpc3R9IGFyciBUaGUgYXJyYXkob3IgQXJyYXktbGlrZSBvYmplY3QpIHRoYXQgd2lsbCBiZSB0cmF2ZXJzZWRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGl0ZXJhdGVlIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdIENvbnRleHQodGhpcykgb2YgY2FsbGJhY2sgZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29sbGVjdGlvblxuICogQGV4YW1wbGVcbiAqIHZhciBmb3JFYWNoQXJyYXkgPSByZXF1aXJlKCd0dWktY29kZS1zbmlwcGV0L2NvbGxlY3Rpb24vZm9yRWFjaEFycmF5Jyk7IC8vIG5vZGUsIGNvbW1vbmpzXG4gKlxuICogdmFyIHN1bSA9IDA7XG4gKlxuICogZm9yRWFjaEFycmF5KFsxLDIsM10sIGZ1bmN0aW9uKHZhbHVlKXtcbiAqICAgICBzdW0gKz0gdmFsdWU7XG4gKiB9KTtcbiAqIGFsZXJ0KHN1bSk7IC8vIDZcbiAqL1xuZnVuY3Rpb24gZm9yRWFjaEFycmF5KGFyciwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgY29udGV4dCA9IGNvbnRleHQgfHwgbnVsbDtcblxuICBmb3IgKDsgaW5kZXggPCBsZW47IGluZGV4ICs9IDEpIHtcbiAgICBpZiAoaXRlcmF0ZWUuY2FsbChjb250ZXh0LCBhcnJbaW5kZXhdLCBpbmRleCwgYXJyKSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2hBcnJheTtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBFeGVjdXRlIHRoZSBwcm92aWRlZCBjYWxsYmFjayBvbmNlIGZvciBlYWNoIHByb3BlcnR5IG9mIG9iamVjdCB3aGljaCBhY3R1YWxseSBleGlzdC5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBFeGVjdXRlIHRoZSBwcm92aWRlZCBjYWxsYmFjayBvbmNlIGZvciBlYWNoIHByb3BlcnR5IG9mIG9iamVjdCB3aGljaCBhY3R1YWxseSBleGlzdC5cbiAqIElmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgbG9vcCB3aWxsIGJlIHN0b3BwZWQuXG4gKiBDYWxsYmFjayBmdW5jdGlvbihpdGVyYXRlZSkgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICAxKSBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5XG4gKiAgMikgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5XG4gKiAgMykgVGhlIG9iamVjdCBiZWluZyB0cmF2ZXJzZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgdHJhdmVyc2VkXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBpdGVyYXRlZSAgQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dF0gQ29udGV4dCh0aGlzKSBvZiBjYWxsYmFjayBmdW5jdGlvblxuICogQG1lbWJlcm9mIG1vZHVsZTpjb2xsZWN0aW9uXG4gKiBAZXhhbXBsZVxuICogdmFyIGZvckVhY2hPd25Qcm9wZXJ0aWVzID0gcmVxdWlyZSgndHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL2ZvckVhY2hPd25Qcm9wZXJ0aWVzJyk7IC8vIG5vZGUsIGNvbW1vbmpzXG4gKlxuICogdmFyIHN1bSA9IDA7XG4gKlxuICogZm9yRWFjaE93blByb3BlcnRpZXMoe2E6MSxiOjIsYzozfSwgZnVuY3Rpb24odmFsdWUpe1xuICogICAgIHN1bSArPSB2YWx1ZTtcbiAqIH0pO1xuICogYWxlcnQoc3VtKTsgLy8gNlxuICovXG5mdW5jdGlvbiBmb3JFYWNoT3duUHJvcGVydGllcyhvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gIHZhciBrZXk7XG5cbiAgY29udGV4dCA9IGNvbnRleHQgfHwgbnVsbDtcblxuICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGlmIChpdGVyYXRlZS5jYWxsKGNvbnRleHQsIG9ialtrZXldLCBrZXksIG9iaikgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2hPd25Qcm9wZXJ0aWVzO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFRyYW5zZm9ybSB0aGUgQXJyYXktbGlrZSBvYmplY3QgdG8gQXJyYXkuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBmb3JFYWNoQXJyYXkgPSByZXF1aXJlKCcuL2ZvckVhY2hBcnJheScpO1xuXG4vKipcbiAqIFRyYW5zZm9ybSB0aGUgQXJyYXktbGlrZSBvYmplY3QgdG8gQXJyYXkuXG4gKiBJbiBsb3cgSUUgKGJlbG93IDgpLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCBpcyBub3QgcGVyZmVjdC4gU28sIHRyeS1jYXRjaCBzdGF0ZW1lbnQgaXMgdXNlZC5cbiAqIEBwYXJhbSB7Kn0gYXJyYXlMaWtlIEFycmF5LWxpa2Ugb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbGxlY3Rpb25cbiAqIEBleGFtcGxlXG4gKiB2YXIgdG9BcnJheSA9IHJlcXVpcmUoJ3R1aS1jb2RlLXNuaXBwZXQvY29sbGVjdGlvbi90b0FycmF5Jyk7IC8vIG5vZGUsIGNvbW1vbmpzXG4gKlxuICogdmFyIGFycmF5TGlrZSA9IHtcbiAqICAgICAwOiAnb25lJyxcbiAqICAgICAxOiAndHdvJyxcbiAqICAgICAyOiAndGhyZWUnLFxuICogICAgIDM6ICdmb3VyJyxcbiAqICAgICBsZW5ndGg6IDRcbiAqIH07XG4gKiB2YXIgcmVzdWx0ID0gdG9BcnJheShhcnJheUxpa2UpO1xuICpcbiAqIGFsZXJ0KHJlc3VsdCBpbnN0YW5jZW9mIEFycmF5KTsgLy8gdHJ1ZVxuICogYWxlcnQocmVzdWx0KTsgLy8gb25lLHR3byx0aHJlZSxmb3VyXG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkoYXJyYXlMaWtlKSB7XG4gIHZhciBhcnI7XG4gIHRyeSB7XG4gICAgYXJyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJyYXlMaWtlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGFyciA9IFtdO1xuICAgIGZvckVhY2hBcnJheShhcnJheUxpa2UsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBhcnIucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvQXJyYXk7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgVGhpcyBtb2R1bGUgcHJvdmlkZXMgc29tZSBmdW5jdGlvbnMgZm9yIGN1c3RvbSBldmVudHMuIEFuZCBpdCBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgb2JzZXJ2ZXIgZGVzaWduIHBhdHRlcm4uXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBleHRlbmQgPSByZXF1aXJlKCcuLi9vYmplY3QvZXh0ZW5kJyk7XG52YXIgaXNFeGlzdHkgPSByZXF1aXJlKCcuLi90eXBlL2lzRXhpc3R5Jyk7XG52YXIgaXNTdHJpbmcgPSByZXF1aXJlKCcuLi90eXBlL2lzU3RyaW5nJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi90eXBlL2lzT2JqZWN0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL3R5cGUvaXNBcnJheScpO1xudmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuLi90eXBlL2lzRnVuY3Rpb24nKTtcbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbi9mb3JFYWNoJyk7XG5cbnZhciBSX0VWRU5UTkFNRV9TUExJVCA9IC9cXHMrL2c7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAZXhhbXBsZVxuICogLy8gbm9kZSwgY29tbW9uanNcbiAqIHZhciBDdXN0b21FdmVudHMgPSByZXF1aXJlKCd0dWktY29kZS1zbmlwcGV0L2N1c3RvbUV2ZW50cy9jdXN0b21FdmVudHMnKTtcbiAqL1xuZnVuY3Rpb24gQ3VzdG9tRXZlbnRzKCkge1xuICAvKipcbiAgICAgKiBAdHlwZSB7SGFuZGxlckl0ZW1bXX1cbiAgICAgKi9cbiAgdGhpcy5ldmVudHMgPSBudWxsO1xuXG4gIC8qKlxuICAgICAqIG9ubHkgZm9yIGNoZWNraW5nIHNwZWNpZmljIGNvbnRleHQgZXZlbnQgd2FzIGJpbmRlZFxuICAgICAqIEB0eXBlIHtvYmplY3RbXX1cbiAgICAgKi9cbiAgdGhpcy5jb250ZXh0cyA9IG51bGw7XG59XG5cbi8qKlxuICogTWl4aW4gY3VzdG9tIGV2ZW50cyBmZWF0dXJlIHRvIHNwZWNpZmljIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5jIC0gY29uc3RydWN0b3JcbiAqIEBleGFtcGxlXG4gKiB2YXIgQ3VzdG9tRXZlbnRzID0gcmVxdWlyZSgndHVpLWNvZGUtc25pcHBldC9jdXN0b21FdmVudHMvY3VzdG9tRXZlbnRzJyk7IC8vIG5vZGUsIGNvbW1vbmpzXG4gKlxuICogdmFyIG1vZGVsO1xuICogZnVuY3Rpb24gTW9kZWwoKSB7XG4gKiAgICAgdGhpcy5uYW1lID0gJyc7XG4gKiB9XG4gKiBDdXN0b21FdmVudHMubWl4aW4oTW9kZWwpO1xuICpcbiAqIG1vZGVsID0gbmV3IE1vZGVsKCk7XG4gKiBtb2RlbC5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7IHRoaXMubmFtZSA9ICdtb2RlbCc7IH0sIHRoaXMpO1xuICogbW9kZWwuZmlyZSgnY2hhbmdlJyk7XG4gKiBhbGVydChtb2RlbC5uYW1lKTsgLy8gJ21vZGVsJztcbiAqL1xuQ3VzdG9tRXZlbnRzLm1peGluID0gZnVuY3Rpb24oZnVuYykge1xuICBleHRlbmQoZnVuYy5wcm90b3R5cGUsIEN1c3RvbUV2ZW50cy5wcm90b3R5cGUpO1xufTtcblxuLyoqXG4gKiBHZXQgSGFuZGxlckl0ZW0gb2JqZWN0XG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBoYW5kbGVyIC0gaGFuZGxlciBmdW5jdGlvblxuICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIGNvbnRleHQgZm9yIGhhbmRsZXJcbiAqIEByZXR1cm5zIHtIYW5kbGVySXRlbX0gSGFuZGxlckl0ZW0gb2JqZWN0XG4gKiBAcHJpdmF0ZVxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLl9nZXRIYW5kbGVySXRlbSA9IGZ1bmN0aW9uKGhhbmRsZXIsIGNvbnRleHQpIHtcbiAgdmFyIGl0ZW0gPSB7aGFuZGxlcjogaGFuZGxlcn07XG5cbiAgaWYgKGNvbnRleHQpIHtcbiAgICBpdGVtLmNvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAgcmV0dXJuIGl0ZW07XG59O1xuXG4vKipcbiAqIEdldCBldmVudCBvYmplY3Qgc2FmZWx5XG4gKiBAcGFyYW0ge3N0cmluZ30gW2V2ZW50TmFtZV0gLSBjcmVhdGUgc3ViIGV2ZW50IG1hcCBpZiBub3QgZXhpc3QuXG4gKiBAcmV0dXJucyB7KG9iamVjdHxhcnJheSl9IGV2ZW50IG9iamVjdC4gaWYgeW91IHN1cHBsaWVkIGBldmVudE5hbWVgXG4gKiAgcGFyYW1ldGVyIHRoZW4gbWFrZSBuZXcgYXJyYXkgYW5kIHJldHVybiBpdFxuICogQHByaXZhdGVcbiAqL1xuQ3VzdG9tRXZlbnRzLnByb3RvdHlwZS5fc2FmZUV2ZW50ID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLmV2ZW50cztcbiAgdmFyIGJ5TmFtZTtcblxuICBpZiAoIWV2ZW50cykge1xuICAgIGV2ZW50cyA9IHRoaXMuZXZlbnRzID0ge307XG4gIH1cblxuICBpZiAoZXZlbnROYW1lKSB7XG4gICAgYnlOYW1lID0gZXZlbnRzW2V2ZW50TmFtZV07XG5cbiAgICBpZiAoIWJ5TmFtZSkge1xuICAgICAgYnlOYW1lID0gW107XG4gICAgICBldmVudHNbZXZlbnROYW1lXSA9IGJ5TmFtZTtcbiAgICB9XG5cbiAgICBldmVudHMgPSBieU5hbWU7XG4gIH1cblxuICByZXR1cm4gZXZlbnRzO1xufTtcblxuLyoqXG4gKiBHZXQgY29udGV4dCBhcnJheSBzYWZlbHlcbiAqIEByZXR1cm5zIHthcnJheX0gY29udGV4dCBhcnJheVxuICogQHByaXZhdGVcbiAqL1xuQ3VzdG9tRXZlbnRzLnByb3RvdHlwZS5fc2FmZUNvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNvbnRleHQgPSB0aGlzLmNvbnRleHRzO1xuXG4gIGlmICghY29udGV4dCkge1xuICAgIGNvbnRleHQgPSB0aGlzLmNvbnRleHRzID0gW107XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn07XG5cbi8qKlxuICogR2V0IGluZGV4IG9mIGNvbnRleHRcbiAqIEBwYXJhbSB7b2JqZWN0fSBjdHggLSBjb250ZXh0IHRoYXQgdXNlZCBmb3IgYmluZCBjdXN0b20gZXZlbnRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IGluZGV4IG9mIGNvbnRleHRcbiAqIEBwcml2YXRlXG4gKi9cbkN1c3RvbUV2ZW50cy5wcm90b3R5cGUuX2luZGV4T2ZDb250ZXh0ID0gZnVuY3Rpb24oY3R4KSB7XG4gIHZhciBjb250ZXh0ID0gdGhpcy5fc2FmZUNvbnRleHQoKTtcbiAgdmFyIGluZGV4ID0gMDtcblxuICB3aGlsZSAoY29udGV4dFtpbmRleF0pIHtcbiAgICBpZiAoY3R4ID09PSBjb250ZXh0W2luZGV4XVswXSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGluZGV4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59O1xuXG4vKipcbiAqIE1lbW9yaXplIHN1cHBsaWVkIGNvbnRleHQgZm9yIHJlY29nbml6ZSBzdXBwbGllZCBvYmplY3QgaXMgY29udGV4dCBvclxuICogIG5hbWU6IGhhbmRsZXIgcGFpciBvYmplY3Qgd2hlbiBvZmYoKVxuICogQHBhcmFtIHtvYmplY3R9IGN0eCAtIGNvbnRleHQgb2JqZWN0IHRvIG1lbW9yaXplXG4gKiBAcHJpdmF0ZVxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLl9tZW1vcml6ZUNvbnRleHQgPSBmdW5jdGlvbihjdHgpIHtcbiAgdmFyIGNvbnRleHQsIGluZGV4O1xuXG4gIGlmICghaXNFeGlzdHkoY3R4KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnRleHQgPSB0aGlzLl9zYWZlQ29udGV4dCgpO1xuICBpbmRleCA9IHRoaXMuX2luZGV4T2ZDb250ZXh0KGN0eCk7XG5cbiAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICBjb250ZXh0W2luZGV4XVsxXSArPSAxO1xuICB9IGVsc2Uge1xuICAgIGNvbnRleHQucHVzaChbY3R4LCAxXSk7XG4gIH1cbn07XG5cbi8qKlxuICogRm9yZ2V0IHN1cHBsaWVkIGNvbnRleHQgb2JqZWN0XG4gKiBAcGFyYW0ge29iamVjdH0gY3R4IC0gY29udGV4dCBvYmplY3QgdG8gZm9yZ2V0XG4gKiBAcHJpdmF0ZVxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLl9mb3JnZXRDb250ZXh0ID0gZnVuY3Rpb24oY3R4KSB7XG4gIHZhciBjb250ZXh0LCBjb250ZXh0SW5kZXg7XG5cbiAgaWYgKCFpc0V4aXN0eShjdHgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29udGV4dCA9IHRoaXMuX3NhZmVDb250ZXh0KCk7XG4gIGNvbnRleHRJbmRleCA9IHRoaXMuX2luZGV4T2ZDb250ZXh0KGN0eCk7XG5cbiAgaWYgKGNvbnRleHRJbmRleCA+IC0xKSB7XG4gICAgY29udGV4dFtjb250ZXh0SW5kZXhdWzFdIC09IDE7XG5cbiAgICBpZiAoY29udGV4dFtjb250ZXh0SW5kZXhdWzFdIDw9IDApIHtcbiAgICAgIGNvbnRleHQuc3BsaWNlKGNvbnRleHRJbmRleCwgMSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEJpbmQgZXZlbnQgaGFuZGxlclxuICogQHBhcmFtIHsoc3RyaW5nfHtuYW1lOnN0cmluZywgaGFuZGxlcjpmdW5jdGlvbn0pfSBldmVudE5hbWUgLSBjdXN0b21cbiAqICBldmVudCBuYW1lIG9yIGFuIG9iamVjdCB7ZXZlbnROYW1lOiBoYW5kbGVyfVxuICogQHBhcmFtIHsoZnVuY3Rpb258b2JqZWN0KX0gW2hhbmRsZXJdIC0gaGFuZGxlciBmdW5jdGlvbiBvciBjb250ZXh0XG4gKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gY29udGV4dCBmb3IgYmluZGluZ1xuICogQHByaXZhdGVcbiAqL1xuQ3VzdG9tRXZlbnRzLnByb3RvdHlwZS5fYmluZEV2ZW50ID0gZnVuY3Rpb24oZXZlbnROYW1lLCBoYW5kbGVyLCBjb250ZXh0KSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9zYWZlRXZlbnQoZXZlbnROYW1lKTtcbiAgdGhpcy5fbWVtb3JpemVDb250ZXh0KGNvbnRleHQpO1xuICBldmVudHMucHVzaCh0aGlzLl9nZXRIYW5kbGVySXRlbShoYW5kbGVyLCBjb250ZXh0KSk7XG59O1xuXG4vKipcbiAqIEJpbmQgZXZlbnQgaGFuZGxlcnNcbiAqIEBwYXJhbSB7KHN0cmluZ3x7bmFtZTpzdHJpbmcsIGhhbmRsZXI6ZnVuY3Rpb259KX0gZXZlbnROYW1lIC0gY3VzdG9tXG4gKiAgZXZlbnQgbmFtZSBvciBhbiBvYmplY3Qge2V2ZW50TmFtZTogaGFuZGxlcn1cbiAqIEBwYXJhbSB7KGZ1bmN0aW9ufG9iamVjdCl9IFtoYW5kbGVyXSAtIGhhbmRsZXIgZnVuY3Rpb24gb3IgY29udGV4dFxuICogQHBhcmFtIHtvYmplY3R9IFtjb250ZXh0XSAtIGNvbnRleHQgZm9yIGJpbmRpbmdcbiAqIC8vLS0gIzEuIEdldCBNb2R1bGUgLS0vL1xuICogdmFyIEN1c3RvbUV2ZW50cyA9IHJlcXVpcmUoJ3R1aS1jb2RlLXNuaXBwZXQvY3VzdG9tRXZlbnRzL2N1c3RvbUV2ZW50cycpOyAvLyBub2RlLCBjb21tb25qc1xuICpcbiAqIC8vLS0gIzIuIFVzZSBtZXRob2QgLS0vL1xuICogLy8gIyAyLjEgQmFzaWMgVXNhZ2VcbiAqIEN1c3RvbUV2ZW50cy5vbignb25sb2FkJywgaGFuZGxlcik7XG4gKlxuICogLy8gIyAyLjIgV2l0aCBjb250ZXh0XG4gKiBDdXN0b21FdmVudHMub24oJ29ubG9hZCcsIGhhbmRsZXIsIG15T2JqKTtcbiAqXG4gKiAvLyAjIDIuMyBCaW5kIGJ5IG9iamVjdCB0aGF0IG5hbWUsIGhhbmRsZXIgcGFpcnNcbiAqIEN1c3RvbUV2ZW50cy5vbih7XG4gKiAgICAgJ3BsYXknOiBoYW5kbGVyLFxuICogICAgICdwYXVzZSc6IGhhbmRsZXIyXG4gKiB9KTtcbiAqXG4gKiAvLyAjIDIuNCBCaW5kIGJ5IG9iamVjdCB0aGF0IG5hbWUsIGhhbmRsZXIgcGFpcnMgd2l0aCBjb250ZXh0IG9iamVjdFxuICogQ3VzdG9tRXZlbnRzLm9uKHtcbiAqICAgICAncGxheSc6IGhhbmRsZXJcbiAqIH0sIG15T2JqKTtcbiAqL1xuQ3VzdG9tRXZlbnRzLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgaGFuZGxlciwgY29udGV4dCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKGlzU3RyaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAvLyBbc3ludGF4IDEsIDJdXG4gICAgZXZlbnROYW1lID0gZXZlbnROYW1lLnNwbGl0KFJfRVZFTlROQU1FX1NQTElUKTtcbiAgICBmb3JFYWNoKGV2ZW50TmFtZSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgc2VsZi5fYmluZEV2ZW50KG5hbWUsIGhhbmRsZXIsIGNvbnRleHQpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGV2ZW50TmFtZSkpIHtcbiAgICAvLyBbc3ludGF4IDMsIDRdXG4gICAgY29udGV4dCA9IGhhbmRsZXI7XG4gICAgZm9yRWFjaChldmVudE5hbWUsIGZ1bmN0aW9uKGZ1bmMsIG5hbWUpIHtcbiAgICAgIHNlbGYub24obmFtZSwgZnVuYywgY29udGV4dCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogQmluZCBvbmUtc2hvdCBldmVudCBoYW5kbGVyc1xuICogQHBhcmFtIHsoc3RyaW5nfHtuYW1lOnN0cmluZyxoYW5kbGVyOmZ1bmN0aW9ufSl9IGV2ZW50TmFtZSAtIGN1c3RvbVxuICogIGV2ZW50IG5hbWUgb3IgYW4gb2JqZWN0IHtldmVudE5hbWU6IGhhbmRsZXJ9XG4gKiBAcGFyYW0ge2Z1bmN0aW9ufG9iamVjdH0gW2hhbmRsZXJdIC0gaGFuZGxlciBmdW5jdGlvbiBvciBjb250ZXh0XG4gKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIC0gY29udGV4dCBmb3IgYmluZGluZ1xuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbihldmVudE5hbWUsIGhhbmRsZXIsIGNvbnRleHQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIGlmIChpc09iamVjdChldmVudE5hbWUpKSB7XG4gICAgY29udGV4dCA9IGhhbmRsZXI7XG4gICAgZm9yRWFjaChldmVudE5hbWUsIGZ1bmN0aW9uKGZ1bmMsIG5hbWUpIHtcbiAgICAgIHNlbGYub25jZShuYW1lLCBmdW5jLCBjb250ZXh0KTtcbiAgICB9KTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uY2VIYW5kbGVyKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtanNkb2NcbiAgICBoYW5kbGVyLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gICAgc2VsZi5vZmYoZXZlbnROYW1lLCBvbmNlSGFuZGxlciwgY29udGV4dCk7XG4gIH1cblxuICB0aGlzLm9uKGV2ZW50TmFtZSwgb25jZUhhbmRsZXIsIGNvbnRleHQpO1xufTtcblxuLyoqXG4gKiBTcGxpY2Ugc3VwcGxpZWQgYXJyYXkgYnkgY2FsbGJhY2sgcmVzdWx0XG4gKiBAcGFyYW0ge2FycmF5fSBhcnIgLSBhcnJheSB0byBzcGxpY2VcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHByZWRpY2F0ZSAtIGZ1bmN0aW9uIHJldHVybiBib29sZWFuXG4gKiBAcHJpdmF0ZVxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLl9zcGxpY2VNYXRjaGVzID0gZnVuY3Rpb24oYXJyLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbGVuO1xuXG4gIGlmICghaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChsZW4gPSBhcnIubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycltpXSkgPT09IHRydWUpIHtcbiAgICAgIGFyci5zcGxpY2UoaSwgMSk7XG4gICAgICBsZW4gLT0gMTtcbiAgICAgIGkgLT0gMTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IG1hdGNoZXIgZm9yIHVuYmluZCBzcGVjaWZpYyBoYW5kbGVyIGV2ZW50c1xuICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlciAtIGhhbmRsZXIgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gaGFuZGxlciBtYXRjaGVyXG4gKiBAcHJpdmF0ZVxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLl9tYXRjaEhhbmRsZXIgPSBmdW5jdGlvbihoYW5kbGVyKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xuICAgIHZhciBuZWVkUmVtb3ZlID0gaGFuZGxlciA9PT0gaXRlbS5oYW5kbGVyO1xuXG4gICAgaWYgKG5lZWRSZW1vdmUpIHtcbiAgICAgIHNlbGYuX2ZvcmdldENvbnRleHQoaXRlbS5jb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmVlZFJlbW92ZTtcbiAgfTtcbn07XG5cbi8qKlxuICogR2V0IG1hdGNoZXIgZm9yIHVuYmluZCBzcGVjaWZpYyBjb250ZXh0IGV2ZW50c1xuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgLSBjb250ZXh0XG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IG9iamVjdCBtYXRjaGVyXG4gKiBAcHJpdmF0ZVxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLl9tYXRjaENvbnRleHQgPSBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xuICAgIHZhciBuZWVkUmVtb3ZlID0gY29udGV4dCA9PT0gaXRlbS5jb250ZXh0O1xuXG4gICAgaWYgKG5lZWRSZW1vdmUpIHtcbiAgICAgIHNlbGYuX2ZvcmdldENvbnRleHQoaXRlbS5jb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmVlZFJlbW92ZTtcbiAgfTtcbn07XG5cbi8qKlxuICogR2V0IG1hdGNoZXIgZm9yIHVuYmluZCBzcGVjaWZpYyBoYW5kZXIsIGNvbnRleHQgcGFpciBldmVudHNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXIgLSBoYW5kbGVyIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gY29udGV4dCAtIGNvbnRleHRcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gaGFuZGxlciwgY29udGV4dCBtYXRjaGVyXG4gKiBAcHJpdmF0ZVxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLl9tYXRjaEhhbmRsZXJBbmRDb250ZXh0ID0gZnVuY3Rpb24oaGFuZGxlciwgY29udGV4dCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICB2YXIgbWF0Y2hIYW5kbGVyID0gKGhhbmRsZXIgPT09IGl0ZW0uaGFuZGxlcik7XG4gICAgdmFyIG1hdGNoQ29udGV4dCA9IChjb250ZXh0ID09PSBpdGVtLmNvbnRleHQpO1xuICAgIHZhciBuZWVkUmVtb3ZlID0gKG1hdGNoSGFuZGxlciAmJiBtYXRjaENvbnRleHQpO1xuXG4gICAgaWYgKG5lZWRSZW1vdmUpIHtcbiAgICAgIHNlbGYuX2ZvcmdldENvbnRleHQoaXRlbS5jb250ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmVlZFJlbW92ZTtcbiAgfTtcbn07XG5cbi8qKlxuICogVW5iaW5kIGV2ZW50IGJ5IGV2ZW50IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBjdXN0b20gZXZlbnQgbmFtZSB0byB1bmJpbmRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtoYW5kbGVyXSAtIGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwcml2YXRlXG4gKi9cbkN1c3RvbUV2ZW50cy5wcm90b3R5cGUuX29mZkJ5RXZlbnROYW1lID0gZnVuY3Rpb24oZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGFuZEJ5SGFuZGxlciA9IGlzRnVuY3Rpb24oaGFuZGxlcik7XG4gIHZhciBtYXRjaEhhbmRsZXIgPSBzZWxmLl9tYXRjaEhhbmRsZXIoaGFuZGxlcik7XG5cbiAgZXZlbnROYW1lID0gZXZlbnROYW1lLnNwbGl0KFJfRVZFTlROQU1FX1NQTElUKTtcblxuICBmb3JFYWNoKGV2ZW50TmFtZSwgZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBoYW5kbGVySXRlbXMgPSBzZWxmLl9zYWZlRXZlbnQobmFtZSk7XG5cbiAgICBpZiAoYW5kQnlIYW5kbGVyKSB7XG4gICAgICBzZWxmLl9zcGxpY2VNYXRjaGVzKGhhbmRsZXJJdGVtcywgbWF0Y2hIYW5kbGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yRWFjaChoYW5kbGVySXRlbXMsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgc2VsZi5fZm9yZ2V0Q29udGV4dChpdGVtLmNvbnRleHQpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlbGYuZXZlbnRzW25hbWVdID0gW107XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogVW5iaW5kIGV2ZW50IGJ5IGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXIgLSBoYW5kbGVyIGZ1bmN0aW9uXG4gKiBAcHJpdmF0ZVxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLl9vZmZCeUhhbmRsZXIgPSBmdW5jdGlvbihoYW5kbGVyKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIG1hdGNoSGFuZGxlciA9IHRoaXMuX21hdGNoSGFuZGxlcihoYW5kbGVyKTtcblxuICBmb3JFYWNoKHRoaXMuX3NhZmVFdmVudCgpLCBmdW5jdGlvbihoYW5kbGVySXRlbXMpIHtcbiAgICBzZWxmLl9zcGxpY2VNYXRjaGVzKGhhbmRsZXJJdGVtcywgbWF0Y2hIYW5kbGVyKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFVuYmluZCBldmVudCBieSBvYmplY3QobmFtZTogaGFuZGxlciBwYWlyIG9iamVjdCBvciBjb250ZXh0IG9iamVjdClcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmogLSBjb250ZXh0IG9yIHtuYW1lOiBoYW5kbGVyfSBwYWlyIG9iamVjdFxuICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlciAtIGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwcml2YXRlXG4gKi9cbkN1c3RvbUV2ZW50cy5wcm90b3R5cGUuX29mZkJ5T2JqZWN0ID0gZnVuY3Rpb24ob2JqLCBoYW5kbGVyKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIG1hdGNoRnVuYztcblxuICBpZiAodGhpcy5faW5kZXhPZkNvbnRleHQob2JqKSA8IDApIHtcbiAgICBmb3JFYWNoKG9iaiwgZnVuY3Rpb24oZnVuYywgbmFtZSkge1xuICAgICAgc2VsZi5vZmYobmFtZSwgZnVuYyk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcoaGFuZGxlcikpIHtcbiAgICBtYXRjaEZ1bmMgPSB0aGlzLl9tYXRjaENvbnRleHQob2JqKTtcblxuICAgIHNlbGYuX3NwbGljZU1hdGNoZXModGhpcy5fc2FmZUV2ZW50KGhhbmRsZXIpLCBtYXRjaEZ1bmMpO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICBtYXRjaEZ1bmMgPSB0aGlzLl9tYXRjaEhhbmRsZXJBbmRDb250ZXh0KGhhbmRsZXIsIG9iaik7XG5cbiAgICBmb3JFYWNoKHRoaXMuX3NhZmVFdmVudCgpLCBmdW5jdGlvbihoYW5kbGVySXRlbXMpIHtcbiAgICAgIHNlbGYuX3NwbGljZU1hdGNoZXMoaGFuZGxlckl0ZW1zLCBtYXRjaEZ1bmMpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG1hdGNoRnVuYyA9IHRoaXMuX21hdGNoQ29udGV4dChvYmopO1xuXG4gICAgZm9yRWFjaCh0aGlzLl9zYWZlRXZlbnQoKSwgZnVuY3Rpb24oaGFuZGxlckl0ZW1zKSB7XG4gICAgICBzZWxmLl9zcGxpY2VNYXRjaGVzKGhhbmRsZXJJdGVtcywgbWF0Y2hGdW5jKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBVbmJpbmQgY3VzdG9tIGV2ZW50c1xuICogQHBhcmFtIHsoc3RyaW5nfG9iamVjdHxmdW5jdGlvbil9IGV2ZW50TmFtZSAtIGV2ZW50IG5hbWUgb3IgY29udGV4dCBvclxuICogIHtuYW1lOiBoYW5kbGVyfSBwYWlyIG9iamVjdCBvciBoYW5kbGVyIGZ1bmN0aW9uXG4gKiBAcGFyYW0geyhmdW5jdGlvbil9IGhhbmRsZXIgLSBoYW5kbGVyIGZ1bmN0aW9uXG4gKiBAZXhhbXBsZVxuICogLy8tLSAjMS4gR2V0IE1vZHVsZSAtLS8vXG4gKiB2YXIgQ3VzdG9tRXZlbnRzID0gcmVxdWlyZSgndHVpLWNvZGUtc25pcHBldC9jdXN0b21FdmVudHMvY3VzdG9tRXZlbnRzJyk7IC8vIG5vZGUsIGNvbW1vbmpzXG4gKlxuICogLy8tLSAjMi4gVXNlIG1ldGhvZCAtLS8vXG4gKiAvLyAjIDIuMSBvZmYgYnkgZXZlbnQgbmFtZVxuICogQ3VzdG9tRXZlbnRzLm9mZignb25sb2FkJyk7XG4gKlxuICogLy8gIyAyLjIgb2ZmIGJ5IGV2ZW50IG5hbWUgYW5kIGhhbmRsZXJcbiAqIEN1c3RvbUV2ZW50cy5vZmYoJ3BsYXknLCBoYW5kbGVyKTtcbiAqXG4gKiAvLyAjIDIuMyBvZmYgYnkgaGFuZGxlclxuICogQ3VzdG9tRXZlbnRzLm9mZihoYW5kbGVyKTtcbiAqXG4gKiAvLyAjIDIuNCBvZmYgYnkgY29udGV4dFxuICogQ3VzdG9tRXZlbnRzLm9mZihteU9iaik7XG4gKlxuICogLy8gIyAyLjUgb2ZmIGJ5IGNvbnRleHQgYW5kIGhhbmRsZXJcbiAqIEN1c3RvbUV2ZW50cy5vZmYobXlPYmosIGhhbmRsZXIpO1xuICpcbiAqIC8vICMgMi42IG9mZiBieSBjb250ZXh0IGFuZCBldmVudCBuYW1lXG4gKiBDdXN0b21FdmVudHMub2ZmKG15T2JqLCAnb25sb2FkJyk7XG4gKlxuICogLy8gIyAyLjcgb2ZmIGJ5IGFuIE9iamVjdC48c3RyaW5nLCBmdW5jdGlvbj4gdGhhdCBpcyB7ZXZlbnROYW1lOiBoYW5kbGVyfVxuICogQ3VzdG9tRXZlbnRzLm9mZih7XG4gKiAgICdwbGF5JzogaGFuZGxlcixcbiAqICAgJ3BhdXNlJzogaGFuZGxlcjJcbiAqIH0pO1xuICpcbiAqIC8vICMgMi44IG9mZiB0aGUgYWxsIGV2ZW50c1xuICogQ3VzdG9tRXZlbnRzLm9mZigpO1xuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgaGFuZGxlcikge1xuICBpZiAoaXNTdHJpbmcoZXZlbnROYW1lKSkge1xuICAgIC8vIFtzeW50YXggMSwgMl1cbiAgICB0aGlzLl9vZmZCeUV2ZW50TmFtZShldmVudE5hbWUsIGhhbmRsZXIpO1xuICB9IGVsc2UgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgLy8gW3N5bnRheCA4XVxuICAgIHRoaXMuZXZlbnRzID0ge307XG4gICAgdGhpcy5jb250ZXh0cyA9IFtdO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oZXZlbnROYW1lKSkge1xuICAgIC8vIFtzeW50YXggM11cbiAgICB0aGlzLl9vZmZCeUhhbmRsZXIoZXZlbnROYW1lKTtcbiAgfSBlbHNlIGlmIChpc09iamVjdChldmVudE5hbWUpKSB7XG4gICAgLy8gW3N5bnRheCA0LCA1LCA2XVxuICAgIHRoaXMuX29mZkJ5T2JqZWN0KGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gIH1cbn07XG5cbi8qKlxuICogRmlyZSBjdXN0b20gZXZlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBuYW1lIG9mIGN1c3RvbSBldmVudFxuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLmZpcmUgPSBmdW5jdGlvbihldmVudE5hbWUpIHsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgdGhpcy5pbnZva2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogRmlyZSBhIGV2ZW50IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2Ygb3BlcmF0aW9uICdib29sZWFuIEFORCcgd2l0aCBhbGxcbiAqICBsaXN0ZW5lcidzIHJlc3VsdHMuXG4gKlxuICogU28sIEl0IGlzIGRpZmZlcmVudCBmcm9tIHtAbGluayBDdXN0b21FdmVudHMjZmlyZX0uXG4gKlxuICogSW4gc2VydmljZSBjb2RlLCB1c2UgdGhpcyBhcyBhIGJlZm9yZSBldmVudCBpbiBjb21wb25lbnQgbGV2ZWwgdXN1YWxseVxuICogIGZvciBub3RpZnlpbmcgdGhhdCB0aGUgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBDdXN0b20gZXZlbnQgbmFtZVxuICogQHBhcmFtIHsuLi4qfSBkYXRhIC0gRGF0YSBmb3IgZXZlbnRcbiAqIEByZXR1cm5zIHtib29sZWFufSBUaGUgcmVzdWx0IG9mIG9wZXJhdGlvbiAnYm9vbGVhbiBBTkQnXG4gKiBAZXhhbXBsZVxuICogdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAqIG1hcC5vbih7XG4gKiAgICAgJ2JlZm9yZVpvb20nOiBmdW5jdGlvbigpIHtcbiAqICAgICAgICAgLy8gSXQgc2hvdWxkIGNhbmNlbCB0aGUgJ3pvb20nIGV2ZW50IGJ5IHNvbWUgY29uZGl0aW9ucy5cbiAqICAgICAgICAgaWYgKHRoYXQuZGlzYWJsZWQgJiYgdGhpcy5nZXRTdGF0ZSgpKSB7XG4gKiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gKiAgICAgICAgIH1cbiAqICAgICAgICAgcmV0dXJuIHRydWU7XG4gKiAgICAgfVxuICogfSk7XG4gKlxuICogaWYgKHRoaXMuaW52b2tlKCdiZWZvcmVab29tJykpIHsgICAgLy8gY2hlY2sgdGhlIHJlc3VsdCBvZiAnYmVmb3JlWm9vbSdcbiAqICAgICAvLyBpZiB0cnVlLFxuICogICAgIC8vIGRvU29tZXRoaW5nXG4gKiB9XG4gKi9cbkN1c3RvbUV2ZW50cy5wcm90b3R5cGUuaW52b2tlID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gIHZhciBldmVudHMsIGFyZ3MsIGluZGV4LCBpdGVtO1xuXG4gIGlmICghdGhpcy5oYXNMaXN0ZW5lcihldmVudE5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBldmVudHMgPSB0aGlzLl9zYWZlRXZlbnQoZXZlbnROYW1lKTtcbiAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIGluZGV4ID0gMDtcblxuICB3aGlsZSAoZXZlbnRzW2luZGV4XSkge1xuICAgIGl0ZW0gPSBldmVudHNbaW5kZXhdO1xuXG4gICAgaWYgKGl0ZW0uaGFuZGxlci5hcHBseShpdGVtLmNvbnRleHQsIGFyZ3MpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGluZGV4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYXQgbGVhc3Qgb25lIG9mIHRoZSBoYW5kbGVycyBpcyByZWdpc3RlcmVkIGluIHRoZSBnaXZlblxuICogIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIC0gQ3VzdG9tIGV2ZW50IG5hbWVcbiAqIEByZXR1cm5zIHtib29sZWFufSBJcyB0aGVyZSBhdCBsZWFzdCBvbmUgaGFuZGxlciBpbiBldmVudCBuYW1lP1xuICovXG5DdXN0b21FdmVudHMucHJvdG90eXBlLmhhc0xpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gIHJldHVybiB0aGlzLmdldExpc3RlbmVyTGVuZ3RoKGV2ZW50TmFtZSkgPiAwO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYSBjb3VudCBvZiBldmVudHMgcmVnaXN0ZXJlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgLSBDdXN0b20gZXZlbnQgbmFtZVxuICogQHJldHVybnMge251bWJlcn0gbnVtYmVyIG9mIGV2ZW50XG4gKi9cbkN1c3RvbUV2ZW50cy5wcm90b3R5cGUuZ2V0TGlzdGVuZXJMZW5ndGggPSBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX3NhZmVFdmVudChldmVudE5hbWUpO1xuXG4gIHJldHVybiBldmVudHMubGVuZ3RoO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDdXN0b21FdmVudHM7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgR2V0IGV2ZW50IGNvbGxlY3Rpb24gZm9yIHNwZWNpZmljIEhUTUwgZWxlbWVudFxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRVZFTlRfS0VZID0gJ19mZUV2ZW50S2V5JztcblxuLyoqXG4gKiBHZXQgZXZlbnQgY29sbGVjdGlvbiBmb3Igc3BlY2lmaWMgSFRNTCBlbGVtZW50XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gSFRNTCBlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIGV2ZW50IHR5cGVcbiAqIEByZXR1cm5zIHthcnJheX1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhZmVFdmVudChlbGVtZW50LCB0eXBlKSB7XG4gIHZhciBldmVudHMgPSBlbGVtZW50W0VWRU5UX0tFWV07XG4gIHZhciBoYW5kbGVycztcblxuICBpZiAoIWV2ZW50cykge1xuICAgIGV2ZW50cyA9IGVsZW1lbnRbRVZFTlRfS0VZXSA9IHt9O1xuICB9XG5cbiAgaGFuZGxlcnMgPSBldmVudHNbdHlwZV07XG4gIGlmICghaGFuZGxlcnMpIHtcbiAgICBoYW5kbGVycyA9IGV2ZW50c1t0eXBlXSA9IFtdO1xuICB9XG5cbiAgcmV0dXJuIGhhbmRsZXJzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNhZmVFdmVudDtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBHZXQgYSB0YXJnZXQgZWxlbWVudCBmcm9tIGFuIGV2ZW50IG9iamVjdC5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBHZXQgYSB0YXJnZXQgZWxlbWVudCBmcm9tIGFuIGV2ZW50IG9iamVjdC5cbiAqIEBwYXJhbSB7RXZlbnR9IGUgLSBldmVudCBvYmplY3RcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gLSB0YXJnZXQgZWxlbWVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpkb21FdmVudFxuICovXG5mdW5jdGlvbiBnZXRUYXJnZXQoZSkge1xuICByZXR1cm4gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFRhcmdldDtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBVbmJpbmQgRE9NIGV2ZW50c1xuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNTdHJpbmcgPSByZXF1aXJlKCcuLi90eXBlL2lzU3RyaW5nJyk7XG52YXIgZm9yRWFjaCA9IHJlcXVpcmUoJy4uL2NvbGxlY3Rpb24vZm9yRWFjaCcpO1xuXG52YXIgc2FmZUV2ZW50ID0gcmVxdWlyZSgnLi9fc2FmZUV2ZW50Jyk7XG5cbi8qKlxuICogVW5iaW5kIERPTSBldmVudHNcbiAqIElmIGEgaGFuZGxlciBmdW5jdGlvbiBpcyBub3QgcGFzc2VkLCByZW1vdmUgYWxsIGV2ZW50cyBvZiB0aGF0IHR5cGUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gZWxlbWVudCB0byB1bmJpbmQgZXZlbnRzXG4gKiBAcGFyYW0geyhzdHJpbmd8b2JqZWN0KX0gdHlwZXMgLSBTcGFjZSBzcGxpdHRlZCBldmVudHMgbmFtZXMgb3IgZXZlbnROYW1lOmhhbmRsZXIgb2JqZWN0XG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbaGFuZGxlcl0gLSBoYW5kbGVyIGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmRvbUV2ZW50XG4gKiBAZXhhbXBsZVxuICogLy8gRm9sbG93aW5nIHRoZSBleGFtcGxlIG9mIGRvbUV2ZW50I29uXG4gKiBcbiAqIC8vIFVuYmluZCBvbmUgZXZlbnQgZnJvbSBhbiBlbGVtZW50LlxuICogb2ZmKGRpdiwgJ2NsaWNrJywgdG9nZ2xlKTtcbiAqIFxuICogLy8gVW5iaW5kIG11bHRpcGxlIGV2ZW50cyB3aXRoIGEgc2FtZSBoYW5kbGVyIGZyb20gbXVsdGlwbGUgZWxlbWVudHMgYXQgb25jZS5cbiAqIC8vIFVzZSBldmVudCBuYW1lcyBzcGxpdHRlZCBieSBhIHNwYWNlLlxuICogb2ZmKGVsZW1lbnQsICdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCBjaGFuZ2VDb2xvcik7XG4gKiBcbiAqIC8vIFVuYmluZCBtdWx0aXBsZSBldmVudHMgd2l0aCBkaWZmZXJlbnQgaGFuZGxlcnMgZnJvbSBhbiBlbGVtZW50IGF0IG9uY2UuXG4gKiAvLyBVc2UgYW4gb2JqZWN0IHdoaWNoIG9mIGtleSBpcyBhbiBldmVudCBuYW1lIGFuZCB2YWx1ZSBpcyBhIGhhbmRsZXIgZnVuY3Rpb24uXG4gKiBvZmYoZGl2LCB7XG4gKiAgIGtleWRvd246IGhpZ2hsaWdodCxcbiAqICAga2V5dXA6IGRlaGlnaGxpZ2h0XG4gKiB9KTtcbiAqIFxuICogLy8gVW5iaW5kIGV2ZW50cyB3aXRob3V0IGhhbmRsZXJzLlxuICogb2ZmKGRpdiwgJ2RyYWcnKTtcbiAqL1xuZnVuY3Rpb24gb2ZmKGVsZW1lbnQsIHR5cGVzLCBoYW5kbGVyKSB7XG4gIGlmIChpc1N0cmluZyh0eXBlcykpIHtcbiAgICBmb3JFYWNoKHR5cGVzLnNwbGl0KC9cXHMrL2cpLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICB1bmJpbmRFdmVudChlbGVtZW50LCB0eXBlLCBoYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvckVhY2godHlwZXMsIGZ1bmN0aW9uKGZ1bmMsIHR5cGUpIHtcbiAgICB1bmJpbmRFdmVudChlbGVtZW50LCB0eXBlLCBmdW5jKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVW5iaW5kIERPTSBldmVudHNcbiAqIElmIGEgaGFuZGxlciBmdW5jdGlvbiBpcyBub3QgcGFzc2VkLCByZW1vdmUgYWxsIGV2ZW50cyBvZiB0aGF0IHR5cGUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gZWxlbWVudCB0byB1bmJpbmQgZXZlbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIGV2ZW50cyBuYW1lXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbaGFuZGxlcl0gLSBoYW5kbGVyIGZ1bmN0aW9uXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB1bmJpbmRFdmVudChlbGVtZW50LCB0eXBlLCBoYW5kbGVyKSB7XG4gIHZhciBldmVudHMgPSBzYWZlRXZlbnQoZWxlbWVudCwgdHlwZSk7XG4gIHZhciBpbmRleDtcblxuICBpZiAoIWhhbmRsZXIpIHtcbiAgICBmb3JFYWNoKGV2ZW50cywgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCB0eXBlLCBpdGVtLndyYXBwZWRIYW5kbGVyKTtcbiAgICB9KTtcbiAgICBldmVudHMuc3BsaWNlKDAsIGV2ZW50cy5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbihpdGVtLCBpZHgpIHtcbiAgICAgIGlmIChoYW5kbGVyID09PSBpdGVtLmhhbmRsZXIpIHtcbiAgICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCB0eXBlLCBpdGVtLndyYXBwZWRIYW5kbGVyKTtcbiAgICAgICAgaW5kZXggPSBpZHg7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBldmVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSBhbiBldmVudCBoYW5kbGVyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gQW4gZWxlbWVudCB0byByZW1vdmUgYW4gZXZlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gZXZlbnQgdHlwZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlciAtIGV2ZW50IGhhbmRsZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgdHlwZSwgaGFuZGxlcikge1xuICBpZiAoJ3JlbW92ZUV2ZW50TGlzdGVuZXInIGluIGVsZW1lbnQpIHtcbiAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlcik7XG4gIH0gZWxzZSBpZiAoJ2RldGFjaEV2ZW50JyBpbiBlbGVtZW50KSB7XG4gICAgZWxlbWVudC5kZXRhY2hFdmVudCgnb24nICsgdHlwZSwgaGFuZGxlcik7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvZmY7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgQmluZCBET00gZXZlbnRzXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpc1N0cmluZyA9IHJlcXVpcmUoJy4uL3R5cGUvaXNTdHJpbmcnKTtcbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbi9mb3JFYWNoJyk7XG5cbnZhciBzYWZlRXZlbnQgPSByZXF1aXJlKCcuL19zYWZlRXZlbnQnKTtcblxuLyoqXG4gKiBCaW5kIERPTSBldmVudHMuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gZWxlbWVudCB0byBiaW5kIGV2ZW50c1xuICogQHBhcmFtIHsoc3RyaW5nfG9iamVjdCl9IHR5cGVzIC0gU3BhY2Ugc3BsaXR0ZWQgZXZlbnRzIG5hbWVzIG9yIGV2ZW50TmFtZTpoYW5kbGVyIG9iamVjdFxuICogQHBhcmFtIHsoZnVuY3Rpb258b2JqZWN0KX0gaGFuZGxlciAtIGhhbmRsZXIgZnVuY3Rpb24gb3IgY29udGV4dCBmb3IgaGFuZGxlciBtZXRob2RcbiAqIEBwYXJhbSB7b2JqZWN0fSBbY29udGV4dF0gY29udGV4dCAtIGNvbnRleHQgZm9yIGhhbmRsZXIgbWV0aG9kLlxuICogQG1lbWJlcm9mIG1vZHVsZTpkb21FdmVudFxuICogQGV4YW1wbGVcbiAqIHZhciBkaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdkaXYnKTtcbiAqIFxuICogLy8gQmluZCBvbmUgZXZlbnQgdG8gYW4gZWxlbWVudC5cbiAqIG9uKGRpdiwgJ2NsaWNrJywgdG9nZ2xlKTtcbiAqIFxuICogLy8gQmluZCBtdWx0aXBsZSBldmVudHMgd2l0aCBhIHNhbWUgaGFuZGxlciB0byBtdWx0aXBsZSBlbGVtZW50cyBhdCBvbmNlLlxuICogLy8gVXNlIGV2ZW50IG5hbWVzIHNwbGl0dGVkIGJ5IGEgc3BhY2UuXG4gKiBvbihkaXYsICdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCBjaGFuZ2VDb2xvcik7XG4gKiBcbiAqIC8vIEJpbmQgbXVsdGlwbGUgZXZlbnRzIHdpdGggZGlmZmVyZW50IGhhbmRsZXJzIHRvIGFuIGVsZW1lbnQgYXQgb25jZS5cbiAqIC8vIFVzZSBhbiBvYmplY3Qgd2hpY2ggb2Yga2V5IGlzIGFuIGV2ZW50IG5hbWUgYW5kIHZhbHVlIGlzIGEgaGFuZGxlciBmdW5jdGlvbi5cbiAqIG9uKGRpdiwge1xuICogICBrZXlkb3duOiBoaWdobGlnaHQsXG4gKiAgIGtleXVwOiBkZWhpZ2hsaWdodFxuICogfSk7XG4gKiBcbiAqIC8vIFNldCBhIGNvbnRleHQgZm9yIGhhbmRsZXIgbWV0aG9kLlxuICogdmFyIG5hbWUgPSAnZ2xvYmFsJztcbiAqIHZhciByZXBvc2l0b3J5ID0ge25hbWU6ICdDb2RlU25pcHBldCd9O1xuICogb24oZGl2LCAnZHJhZycsIGZ1bmN0aW9uKCkge1xuICogIGNvbnNvbGUubG9nKHRoaXMubmFtZSk7XG4gKiB9LCByZXBvc2l0b3J5KTtcbiAqIC8vIFJlc3VsdCB3aGVuIHlvdSBkcmFnIGEgZGl2OiBcIkNvZGVTbmlwcGV0XCJcbiAqL1xuZnVuY3Rpb24gb24oZWxlbWVudCwgdHlwZXMsIGhhbmRsZXIsIGNvbnRleHQpIHtcbiAgaWYgKGlzU3RyaW5nKHR5cGVzKSkge1xuICAgIGZvckVhY2godHlwZXMuc3BsaXQoL1xccysvZyksIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIGJpbmRFdmVudChlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBjb250ZXh0KTtcbiAgICB9KTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvckVhY2godHlwZXMsIGZ1bmN0aW9uKGZ1bmMsIHR5cGUpIHtcbiAgICBiaW5kRXZlbnQoZWxlbWVudCwgdHlwZSwgZnVuYywgaGFuZGxlcik7XG4gIH0pO1xufVxuXG4vKipcbiAqIEJpbmQgRE9NIGV2ZW50c1xuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIGVsZW1lbnQgdG8gYmluZCBldmVudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gZXZlbnRzIG5hbWVcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXIgLSBoYW5kbGVyIGZ1bmN0aW9uIG9yIGNvbnRleHQgZm9yIGhhbmRsZXIgbWV0aG9kXG4gKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdIGNvbnRleHQgLSBjb250ZXh0IGZvciBoYW5kbGVyIG1ldGhvZC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGJpbmRFdmVudChlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBjb250ZXh0KSB7XG4gIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXJcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBlIC0gZXZlbnQgb2JqZWN0XG4gICAgICovXG4gIGZ1bmN0aW9uIGV2ZW50SGFuZGxlcihlKSB7XG4gICAgaGFuZGxlci5jYWxsKGNvbnRleHQgfHwgZWxlbWVudCwgZSB8fCB3aW5kb3cuZXZlbnQpO1xuICB9XG5cbiAgaWYgKCdhZGRFdmVudExpc3RlbmVyJyBpbiBlbGVtZW50KSB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50SGFuZGxlcik7XG4gIH0gZWxzZSBpZiAoJ2F0dGFjaEV2ZW50JyBpbiBlbGVtZW50KSB7XG4gICAgZWxlbWVudC5hdHRhY2hFdmVudCgnb24nICsgdHlwZSwgZXZlbnRIYW5kbGVyKTtcbiAgfVxuICBtZW1vcml6ZUhhbmRsZXIoZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgZXZlbnRIYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBNZW1vcml6ZSBET00gZXZlbnQgaGFuZGxlciBmb3IgdW5iaW5kaW5nLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIGVsZW1lbnQgdG8gYmluZCBldmVudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gZXZlbnRzIG5hbWVcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXIgLSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgdXNlciBwYXNzZWQgYXQgb24oKSB1c2VcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHdyYXBwZWRIYW5kbGVyIC0gaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdyYXBwZWQgYnkgZG9tZXZlbnQgZm9yIGltcGxlbWVudGluZyBzb21lIGZlYXR1cmVzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBtZW1vcml6ZUhhbmRsZXIoZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgd3JhcHBlZEhhbmRsZXIpIHtcbiAgdmFyIGV2ZW50cyA9IHNhZmVFdmVudChlbGVtZW50LCB0eXBlKTtcbiAgdmFyIGV4aXN0SW5FdmVudHMgPSBmYWxzZTtcblxuICBmb3JFYWNoKGV2ZW50cywgZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKG9iai5oYW5kbGVyID09PSBoYW5kbGVyKSB7XG4gICAgICBleGlzdEluRXZlbnRzID0gdHJ1ZTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICBpZiAoIWV4aXN0SW5FdmVudHMpIHtcbiAgICBldmVudHMucHVzaCh7XG4gICAgICBoYW5kbGVyOiBoYW5kbGVyLFxuICAgICAgd3JhcHBlZEhhbmRsZXI6IHdyYXBwZWRIYW5kbGVyXG4gICAgfSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvbjtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBQcmV2ZW50IGRlZmF1bHQgYWN0aW9uXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUHJldmVudCBkZWZhdWx0IGFjdGlvblxuICogQHBhcmFtIHtFdmVudH0gZSAtIGV2ZW50IG9iamVjdFxuICogQG1lbWJlcm9mIG1vZHVsZTpkb21FdmVudFxuICovXG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChlKSB7XG4gIGlmIChlLnByZXZlbnREZWZhdWx0KSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHByZXZlbnREZWZhdWx0O1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFNldCBjbGFzc05hbWUgdmFsdWVcbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi90eXBlL2lzQXJyYXknKTtcbnZhciBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4uL3R5cGUvaXNVbmRlZmluZWQnKTtcblxuLyoqXG4gKiBTZXQgY2xhc3NOYW1lIHZhbHVlXG4gKiBAcGFyYW0geyhIVE1MRWxlbWVudHxTVkdFbGVtZW50KX0gZWxlbWVudCAtIHRhcmdldCBlbGVtZW50XG4gKiBAcGFyYW0geyhzdHJpbmd8c3RyaW5nW10pfSBjc3NDbGFzcyAtIGNsYXNzIG5hbWVzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXRDbGFzc05hbWUoZWxlbWVudCwgY3NzQ2xhc3MpIHtcbiAgY3NzQ2xhc3MgPSBpc0FycmF5KGNzc0NsYXNzKSA/IGNzc0NsYXNzLmpvaW4oJyAnKSA6IGNzc0NsYXNzO1xuXG4gIGNzc0NsYXNzID0gY3NzQ2xhc3MucmVwbGFjZSgvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csICcnKTtcblxuICBpZiAoaXNVbmRlZmluZWQoZWxlbWVudC5jbGFzc05hbWUuYmFzZVZhbCkpIHtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGNzc0NsYXNzO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZWxlbWVudC5jbGFzc05hbWUuYmFzZVZhbCA9IGNzc0NsYXNzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENsYXNzTmFtZTtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBBZGQgY3NzIGNsYXNzIHRvIGVsZW1lbnRcbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGZvckVhY2ggPSByZXF1aXJlKCcuLi9jb2xsZWN0aW9uL2ZvckVhY2gnKTtcbnZhciBpbkFycmF5ID0gcmVxdWlyZSgnLi4vYXJyYXkvaW5BcnJheScpO1xudmFyIGdldENsYXNzID0gcmVxdWlyZSgnLi9nZXRDbGFzcycpO1xudmFyIHNldENsYXNzTmFtZSA9IHJlcXVpcmUoJy4vX3NldENsYXNzTmFtZScpO1xuXG4vKipcbiAqIGRvbVV0aWwgbW9kdWxlXG4gKiBAbW9kdWxlIGRvbVV0aWxcbiAqL1xuXG4vKipcbiAqIEFkZCBjc3MgY2xhc3MgdG8gZWxlbWVudFxuICogQHBhcmFtIHsoSFRNTEVsZW1lbnR8U1ZHRWxlbWVudCl9IGVsZW1lbnQgLSB0YXJnZXQgZWxlbWVudFxuICogQHBhcmFtIHsuLi5zdHJpbmd9IGNzc0NsYXNzIC0gY3NzIGNsYXNzZXMgdG8gYWRkXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmRvbVV0aWxcbiAqL1xuZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudCkge1xuICB2YXIgY3NzQ2xhc3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB2YXIgY2xhc3NMaXN0ID0gZWxlbWVudC5jbGFzc0xpc3Q7XG4gIHZhciBuZXdDbGFzcyA9IFtdO1xuICB2YXIgb3JpZ2luO1xuXG4gIGlmIChjbGFzc0xpc3QpIHtcbiAgICBmb3JFYWNoKGNzc0NsYXNzLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQobmFtZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBvcmlnaW4gPSBnZXRDbGFzcyhlbGVtZW50KTtcblxuICBpZiAob3JpZ2luKSB7XG4gICAgY3NzQ2xhc3MgPSBbXS5jb25jYXQob3JpZ2luLnNwbGl0KC9cXHMrLyksIGNzc0NsYXNzKTtcbiAgfVxuXG4gIGZvckVhY2goY3NzQ2xhc3MsIGZ1bmN0aW9uKGNscykge1xuICAgIGlmIChpbkFycmF5KGNscywgbmV3Q2xhc3MpIDwgMCkge1xuICAgICAgbmV3Q2xhc3MucHVzaChjbHMpO1xuICAgIH1cbiAgfSk7XG5cbiAgc2V0Q2xhc3NOYW1lKGVsZW1lbnQsIG5ld0NsYXNzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhZGRDbGFzcztcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBGaW5kIHBhcmVudCBlbGVtZW50IHJlY3Vyc2l2ZWx5XG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBtYXRjaGVzID0gcmVxdWlyZSgnLi9tYXRjaGVzJyk7XG5cbi8qKlxuICogRmluZCBwYXJlbnQgZWxlbWVudCByZWN1cnNpdmVseVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIGJhc2UgZWxlbWVudCB0byBzdGFydCBmaW5kXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBzZWxlY3RvciBzdHJpbmcgZm9yIGZpbmRcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gLSBlbGVtZW50IGZpbmRlZCBvciBudWxsXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmRvbVV0aWxcbiAqL1xuZnVuY3Rpb24gY2xvc2VzdChlbGVtZW50LCBzZWxlY3Rvcikge1xuICB2YXIgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuXG4gIGlmIChtYXRjaGVzKGVsZW1lbnQsIHNlbGVjdG9yKSkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQgIT09IGRvY3VtZW50KSB7XG4gICAgaWYgKG1hdGNoZXMocGFyZW50LCBzZWxlY3RvcikpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9zZXN0O1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEdldCBIVE1MIGVsZW1lbnQncyBkZXNpZ24gY2xhc3Nlcy5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vdHlwZS9pc1VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIEdldCBIVE1MIGVsZW1lbnQncyBkZXNpZ24gY2xhc3Nlcy5cbiAqIEBwYXJhbSB7KEhUTUxFbGVtZW50fFNWR0VsZW1lbnQpfSBlbGVtZW50IHRhcmdldCBlbGVtZW50XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBlbGVtZW50IGNzcyBjbGFzcyBuYW1lXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmRvbVV0aWxcbiAqL1xuZnVuY3Rpb24gZ2V0Q2xhc3MoZWxlbWVudCkge1xuICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKGlzVW5kZWZpbmVkKGVsZW1lbnQuY2xhc3NOYW1lLmJhc2VWYWwpKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuY2xhc3NOYW1lO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQuY2xhc3NOYW1lLmJhc2VWYWw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0Q2xhc3M7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgQ2hlY2sgZWxlbWVudCBtYXRjaCBzZWxlY3RvclxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW5BcnJheSA9IHJlcXVpcmUoJy4uL2FycmF5L2luQXJyYXknKTtcbnZhciB0b0FycmF5ID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbi90b0FycmF5Jyk7XG5cbnZhciBlbFByb3RvID0gRWxlbWVudC5wcm90b3R5cGU7XG52YXIgbWF0Y2hTZWxlY3RvciA9IGVsUHJvdG8ubWF0Y2hlcyB8fFxuICAgIGVsUHJvdG8ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgZWxQcm90by5tb3pNYXRjaGVzU2VsZWN0b3IgfHxcbiAgICBlbFByb3RvLm1zTWF0Y2hlc1NlbGVjdG9yIHx8XG4gICAgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgICAgIHZhciBkb2MgPSB0aGlzLmRvY3VtZW50IHx8IHRoaXMub3duZXJEb2N1bWVudDtcblxuICAgICAgcmV0dXJuIGluQXJyYXkodGhpcywgdG9BcnJheShkb2MucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpKSA+IC0xO1xuICAgIH07XG5cbi8qKlxuICogQ2hlY2sgZWxlbWVudCBtYXRjaCBzZWxlY3RvclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIGVsZW1lbnQgdG8gY2hlY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIHNlbGVjdG9yIHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gaXMgc2VsZWN0b3IgbWF0Y2hlZCB0byBlbGVtZW50P1xuICogQG1lbWJlcm9mIG1vZHVsZTpkb21VdGlsXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXMoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgcmV0dXJuIG1hdGNoU2VsZWN0b3IuY2FsbChlbGVtZW50LCBzZWxlY3Rvcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWF0Y2hlcztcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBSZW1vdmUgY3NzIGNsYXNzIGZyb20gZWxlbWVudFxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZm9yRWFjaEFycmF5ID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbi9mb3JFYWNoQXJyYXknKTtcbnZhciBpbkFycmF5ID0gcmVxdWlyZSgnLi4vYXJyYXkvaW5BcnJheScpO1xudmFyIGdldENsYXNzID0gcmVxdWlyZSgnLi9nZXRDbGFzcycpO1xudmFyIHNldENsYXNzTmFtZSA9IHJlcXVpcmUoJy4vX3NldENsYXNzTmFtZScpO1xuXG4vKipcbiAqIFJlbW92ZSBjc3MgY2xhc3MgZnJvbSBlbGVtZW50XG4gKiBAcGFyYW0geyhIVE1MRWxlbWVudHxTVkdFbGVtZW50KX0gZWxlbWVudCAtIHRhcmdldCBlbGVtZW50XG4gKiBAcGFyYW0gey4uLnN0cmluZ30gY3NzQ2xhc3MgLSBjc3MgY2xhc3NlcyB0byByZW1vdmVcbiAqIEBtZW1iZXJvZiBtb2R1bGU6ZG9tVXRpbFxuICovXG5mdW5jdGlvbiByZW1vdmVDbGFzcyhlbGVtZW50KSB7XG4gIHZhciBjc3NDbGFzcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHZhciBjbGFzc0xpc3QgPSBlbGVtZW50LmNsYXNzTGlzdDtcbiAgdmFyIG9yaWdpbiwgbmV3Q2xhc3M7XG5cbiAgaWYgKGNsYXNzTGlzdCkge1xuICAgIGZvckVhY2hBcnJheShjc3NDbGFzcywgZnVuY3Rpb24obmFtZSkge1xuICAgICAgY2xhc3NMaXN0LnJlbW92ZShuYW1lKTtcbiAgICB9KTtcblxuICAgIHJldHVybjtcbiAgfVxuXG4gIG9yaWdpbiA9IGdldENsYXNzKGVsZW1lbnQpLnNwbGl0KC9cXHMrLyk7XG4gIG5ld0NsYXNzID0gW107XG4gIGZvckVhY2hBcnJheShvcmlnaW4sIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBpZiAoaW5BcnJheShuYW1lLCBjc3NDbGFzcykgPCAwKSB7XG4gICAgICBuZXdDbGFzcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgc2V0Q2xhc3NOYW1lKGVsZW1lbnQsIG5ld0NsYXNzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZW1vdmVDbGFzcztcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBSZW1vdmUgZWxlbWVudCBmcm9tIHBhcmVudCBub2RlLlxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFJlbW92ZSBlbGVtZW50IGZyb20gcGFyZW50IG5vZGUuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gZWxlbWVudCB0byByZW1vdmUuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmRvbVV0aWxcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlbW92ZUVsZW1lbnQ7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgRXh0ZW5kIHRoZSB0YXJnZXQgb2JqZWN0IGZyb20gb3RoZXIgb2JqZWN0cy5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAbW9kdWxlIG9iamVjdFxuICovXG5cbi8qKlxuICogRXh0ZW5kIHRoZSB0YXJnZXQgb2JqZWN0IGZyb20gb3RoZXIgb2JqZWN0cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgLSBPYmplY3QgdGhhdCB3aWxsIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0gey4uLm9iamVjdH0gb2JqZWN0cyAtIE9iamVjdHMgYXMgc291cmNlc1xuICogQHJldHVybnMge29iamVjdH0gRXh0ZW5kZWQgb2JqZWN0XG4gKiBAbWVtYmVyb2YgbW9kdWxlOm9iamVjdFxuICovXG5mdW5jdGlvbiBleHRlbmQodGFyZ2V0LCBvYmplY3RzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIGhhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICB2YXIgc291cmNlLCBwcm9wLCBpLCBsZW47XG5cbiAgZm9yIChpID0gMSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgIGZvciAocHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wLmNhbGwoc291cmNlLCBwcm9wKSkge1xuICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHRlbmQ7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgUmVxdWVzdCBpbWFnZSBwaW5nLlxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZm9yRWFjaE93blByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9jb2xsZWN0aW9uL2ZvckVhY2hPd25Qcm9wZXJ0aWVzJyk7XG5cbi8qKlxuICogQG1vZHVsZSByZXF1ZXN0XG4gKi9cblxuLyoqXG4gKiBSZXF1ZXN0IGltYWdlIHBpbmcuXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsIHVybCBmb3IgcGluZyByZXF1ZXN0XG4gKiBAcGFyYW0ge09iamVjdH0gdHJhY2tpbmdJbmZvIGluZm9zIGZvciBtYWtlIHF1ZXJ5IHN0cmluZ1xuICogQHJldHVybnMge0hUTUxFbGVtZW50fVxuICogQG1lbWJlcm9mIG1vZHVsZTpyZXF1ZXN0XG4gKiBAZXhhbXBsZVxuICogdmFyIGltYWdlUGluZyA9IHJlcXVpcmUoJ3R1aS1jb2RlLXNuaXBwZXQvcmVxdWVzdC9pbWFnZVBpbmcnKTsgLy8gbm9kZSwgY29tbW9uanNcbiAqXG4gKiBpbWFnZVBpbmcoJ2h0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2NvbGxlY3QnLCB7XG4gKiAgICAgdjogMSxcbiAqICAgICB0OiAnZXZlbnQnLFxuICogICAgIHRpZDogJ3RyYWNraW5naWQnLFxuICogICAgIGNpZDogJ2NpZCcsXG4gKiAgICAgZHA6ICdkcCcsXG4gKiAgICAgZGg6ICdkaCdcbiAqIH0pO1xuICovXG5mdW5jdGlvbiBpbWFnZVBpbmcodXJsLCB0cmFja2luZ0luZm8pIHtcbiAgdmFyIHRyYWNraW5nRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICB2YXIgcXVlcnlTdHJpbmcgPSAnJztcbiAgZm9yRWFjaE93blByb3BlcnRpZXModHJhY2tpbmdJbmZvLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgcXVlcnlTdHJpbmcgKz0gJyYnICsga2V5ICsgJz0nICsgdmFsdWU7XG4gIH0pO1xuICBxdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nLnN1YnN0cmluZygxKTtcblxuICB0cmFja2luZ0VsZW1lbnQuc3JjID0gdXJsICsgJz8nICsgcXVlcnlTdHJpbmc7XG5cbiAgdHJhY2tpbmdFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodHJhY2tpbmdFbGVtZW50KTtcbiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0cmFja2luZ0VsZW1lbnQpO1xuXG4gIHJldHVybiB0cmFja2luZ0VsZW1lbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW1hZ2VQaW5nO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFNlbmQgaG9zdG5hbWUgb24gRE9NQ29udGVudExvYWRlZC5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGlzVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vdHlwZS9pc1VuZGVmaW5lZCcpO1xudmFyIGltYWdlUGluZyA9IHJlcXVpcmUoJy4vaW1hZ2VQaW5nJyk7XG5cbnZhciBtczdkYXlzID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGRhdGUgaGFzIHBhc3NlZCA3IGRheXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBkYXRlIC0gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzRXhwaXJlZChkYXRlKSB7XG4gIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICByZXR1cm4gbm93IC0gZGF0ZSA+IG1zN2RheXM7XG59XG5cbi8qKlxuICogU2VuZCBob3N0bmFtZSBvbiBET01Db250ZW50TG9hZGVkLlxuICogVG8gcHJldmVudCBob3N0bmFtZSBzZXQgdHVpLnVzYWdlU3RhdGlzdGljcyB0byBmYWxzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBOYW1lIC0gYXBwbGljYXRpb24gbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IHRyYWNraW5nSWQgLSBHQSB0cmFja2luZyBJRFxuICogQGlnbm9yZVxuICovXG5mdW5jdGlvbiBzZW5kSG9zdG5hbWUoYXBwTmFtZSwgdHJhY2tpbmdJZCkge1xuICB2YXIgdXJsID0gJ2h0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2NvbGxlY3QnO1xuICB2YXIgaG9zdG5hbWUgPSBsb2NhdGlvbi5ob3N0bmFtZTtcbiAgdmFyIGhpdFR5cGUgPSAnZXZlbnQnO1xuICB2YXIgZXZlbnRDYXRlZ29yeSA9ICd1c2UnO1xuICB2YXIgYXBwbGljYXRpb25LZXlGb3JTdG9yYWdlID0gJ1RPQVNUIFVJICcgKyBhcHBOYW1lICsgJyBmb3IgJyArIGhvc3RuYW1lICsgJzogU3RhdGlzdGljcyc7XG4gIHZhciBkYXRlID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGFwcGxpY2F0aW9uS2V5Rm9yU3RvcmFnZSk7XG5cbiAgLy8gc2tpcCBpZiB0aGUgZmxhZyBpcyBkZWZpbmVkIGFuZCBpcyBzZXQgdG8gZmFsc2UgZXhwbGljaXRseVxuICBpZiAoIWlzVW5kZWZpbmVkKHdpbmRvdy50dWkpICYmIHdpbmRvdy50dWkudXNhZ2VTdGF0aXN0aWNzID09PSBmYWxzZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHNraXAgaWYgbm90IHBhc3Mgc2V2ZW4gZGF5cyBvbGRcbiAgaWYgKGRhdGUgJiYgIWlzRXhwaXJlZChkYXRlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShhcHBsaWNhdGlvbktleUZvclN0b3JhZ2UsIG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcblxuICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGltYWdlUGluZyh1cmwsIHtcbiAgICAgICAgdjogMSxcbiAgICAgICAgdDogaGl0VHlwZSxcbiAgICAgICAgdGlkOiB0cmFja2luZ0lkLFxuICAgICAgICBjaWQ6IGhvc3RuYW1lLFxuICAgICAgICBkcDogaG9zdG5hbWUsXG4gICAgICAgIGRoOiBhcHBOYW1lLFxuICAgICAgICBlbDogYXBwTmFtZSxcbiAgICAgICAgZWM6IGV2ZW50Q2F0ZWdvcnlcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgMTAwMCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2VuZEhvc3RuYW1lO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGFuIGluc3RhbmNlIG9mIEFycmF5IG9yIG5vdC5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhbiBpbnN0YW5jZSBvZiBBcnJheSBvciBub3QuXG4gKiBJZiB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYW4gaW5zdGFuY2Ugb2YgQXJyYXksIHJldHVybiB0cnVlLlxuICogQHBhcmFtIHsqfSBvYmogLSBUYXJnZXQgZm9yIGNoZWNraW5nXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gSXMgYXJyYXkgaW5zdGFuY2U/XG4gKiBAbWVtYmVyb2YgbW9kdWxlOnR5cGVcbiAqL1xuZnVuY3Rpb24gaXNBcnJheShvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBzdHJpbmcgb3Igbm90LlxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiBvciBub3QuXG4gKiAgSWYgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGEgYm9vbGVhbiwgcmV0dXJuIHRydWUuXG4gKiBAcGFyYW0geyp9IG9iaiAtIFRhcmdldCBmb3IgY2hlY2tpbmdcbiAqIEByZXR1cm5zIHtib29sZWFufSBJcyBib29sZWFuP1xuICogQG1lbWJlcm9mIG1vZHVsZTp0eXBlXG4gKi9cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdib29sZWFuJyB8fCBvYmogaW5zdGFuY2VvZiBCb29sZWFuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQm9vbGVhbjtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBleGlzdGluZyBvciBub3QuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpc1VuZGVmaW5lZCA9IHJlcXVpcmUoJy4vaXNVbmRlZmluZWQnKTtcbnZhciBpc051bGwgPSByZXF1aXJlKCcuL2lzTnVsbCcpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGV4aXN0aW5nIG9yIG5vdC5cbiAqIElmIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBub3QgbnVsbCBhbmQgbm90IHVuZGVmaW5lZCwgcmV0dXJucyB0cnVlLlxuICogQHBhcmFtIHsqfSBwYXJhbSAtIFRhcmdldCBmb3IgY2hlY2tpbmdcbiAqIEByZXR1cm5zIHtib29sZWFufSBJcyBleGlzdHk/XG4gKiBAbWVtYmVyb2YgbW9kdWxlOnR5cGVcbiAqIEBleGFtcGxlXG4gKiB2YXIgaXNFeGlzdHkgPSByZXF1aXJlKCd0dWktY29kZS1zbmlwcGV0L3R5cGUvaXNFeGlzdHknKTsgLy8gbm9kZSwgY29tbW9uanNcbiAqXG4gKiBpc0V4aXN0eSgnJyk7IC8vdHJ1ZVxuICogaXNFeGlzdHkoMCk7IC8vdHJ1ZVxuICogaXNFeGlzdHkoW10pOyAvL3RydWVcbiAqIGlzRXhpc3R5KHt9KTsgLy90cnVlXG4gKiBpc0V4aXN0eShudWxsKTsgLy9mYWxzZVxuICogaXNFeGlzdHkodW5kZWZpbmVkKTsgLy9mYWxzZVxuKi9cbmZ1bmN0aW9uIGlzRXhpc3R5KHBhcmFtKSB7XG4gIHJldHVybiAhaXNVbmRlZmluZWQocGFyYW0pICYmICFpc051bGwocGFyYW0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRXhpc3R5O1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24gb3Igbm90LlxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24gb3Igbm90LlxuICogSWYgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24sIHJldHVybiB0cnVlLlxuICogQHBhcmFtIHsqfSBvYmogLSBUYXJnZXQgZm9yIGNoZWNraW5nXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gSXMgZnVuY3Rpb24/XG4gKiBAbWVtYmVyb2YgbW9kdWxlOnR5cGVcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbihvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb247XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBpbnN0YW5jZSBvZiBIVE1MTm9kZSBvciBub3QuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBpbnN0YW5jZSBvZiBIVE1MTm9kZSBvciBub3QuXG4gKiBJZiB0aGUgZ2l2ZW4gdmFyaWFibGVzIGlzIGEgaW5zdGFuY2Ugb2YgSFRNTE5vZGUsIHJldHVybiB0cnVlLlxuICogQHBhcmFtIHsqfSBodG1sIC0gVGFyZ2V0IGZvciBjaGVja2luZ1xuICogQHJldHVybnMge2Jvb2xlYW59IElzIEhUTUxOb2RlID9cbiAqIEBtZW1iZXJvZiBtb2R1bGU6dHlwZVxuICovXG5mdW5jdGlvbiBpc0hUTUxOb2RlKGh0bWwpIHtcbiAgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gKGh0bWwgJiYgKGh0bWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCAhIWh0bWwubm9kZVR5cGUpKTtcbiAgfVxuXG4gIHJldHVybiAhIShodG1sICYmIGh0bWwubm9kZVR5cGUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzSFRNTE5vZGU7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgbnVsbCBvciBub3QuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgbnVsbCBvciBub3QuXG4gKiBJZiB0aGUgZ2l2ZW4gdmFyaWFibGUoYXJndW1lbnRzWzBdKSBpcyBudWxsLCByZXR1cm5zIHRydWUuXG4gKiBAcGFyYW0geyp9IG9iaiAtIFRhcmdldCBmb3IgY2hlY2tpbmdcbiAqIEByZXR1cm5zIHtib29sZWFufSBJcyBudWxsP1xuICogQG1lbWJlcm9mIG1vZHVsZTp0eXBlXG4gKi9cbmZ1bmN0aW9uIGlzTnVsbChvYmopIHtcbiAgcmV0dXJuIG9iaiA9PT0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc051bGw7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBudW1iZXIgb3Igbm90LlxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGEgbnVtYmVyIG9yIG5vdC5cbiAqIElmIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhIG51bWJlciwgcmV0dXJuIHRydWUuXG4gKiBAcGFyYW0geyp9IG9iaiAtIFRhcmdldCBmb3IgY2hlY2tpbmdcbiAqIEByZXR1cm5zIHtib29sZWFufSBJcyBudW1iZXI/XG4gKiBAbWVtYmVyb2YgbW9kdWxlOnR5cGVcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCBvYmogaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOdW1iZXI7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYW4gb2JqZWN0IG9yIG5vdC5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhbiBvYmplY3Qgb3Igbm90LlxuICogSWYgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGFuIG9iamVjdCwgcmV0dXJuIHRydWUuXG4gKiBAcGFyYW0geyp9IG9iaiAtIFRhcmdldCBmb3IgY2hlY2tpbmdcbiAqIEByZXR1cm5zIHtib29sZWFufSBJcyBvYmplY3Q/XG4gKiBAbWVtYmVyb2YgbW9kdWxlOnR5cGVcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gIHJldHVybiBvYmogPT09IE9iamVjdChvYmopO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0O1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGEgc3RyaW5nIG9yIG5vdC5cbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyBhIHN0cmluZyBvciBub3QuXG4gKiBJZiB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgYSBzdHJpbmcsIHJldHVybiB0cnVlLlxuICogQHBhcmFtIHsqfSBvYmogLSBUYXJnZXQgZm9yIGNoZWNraW5nXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gSXMgc3RyaW5nP1xuICogQG1lbWJlcm9mIG1vZHVsZTp0eXBlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHwgb2JqIGluc3RhbmNlb2YgU3RyaW5nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzU3RyaW5nO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCBvciBub3QuXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdmFyaWFibGUgaXMgdW5kZWZpbmVkIG9yIG5vdC5cbiAqIElmIHRoZSBnaXZlbiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHJldHVybnMgdHJ1ZS5cbiAqIEBwYXJhbSB7Kn0gb2JqIC0gVGFyZ2V0IGZvciBjaGVja2luZ1xuICogQHJldHVybnMge2Jvb2xlYW59IElzIHVuZGVmaW5lZD9cbiAqIEBtZW1iZXJvZiBtb2R1bGU6dHlwZVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChvYmopIHtcbiAgcmV0dXJuIG9iaiA9PT0gdW5kZWZpbmVkOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmaW5lZFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVW5kZWZpbmVkO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFRoZSBzdGF0aWMgdmFsdWVzXG4gKiBAYXV0aG9yIE5ITi4gRkUgZGV2IHRlYW0uPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG5pbXBvcnQgZm9yRWFjaE93blByb3BlcnRpZXMgZnJvbSAndHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL2ZvckVhY2hPd25Qcm9wZXJ0aWVzJztcblxuY29uc3QgQ1NTX1BSRUZJWCA9ICd0dWktc2VsZWN0LWJveCc7XG5cbmNvbnN0IGNsYXNzTmFtZXMgPSB7XG4gIFNFTEVDVF9CT1g6ICcnLFxuICBJVEVNOiAnaXRlbScsXG4gIElURU1fR1JPVVA6ICdpdGVtLWdyb3VwJyxcbiAgSVRFTV9HUk9VUF9MQUJFTDogJ2l0ZW0tZ3JvdXAtbGFiZWwnLFxuICBEUk9QRE9XTjogJ2Ryb3Bkb3duJyxcbiAgSU5QVVQ6ICdpbnB1dCcsXG4gIFBMQUNFSE9MREVSOiAncGxhY2Vob2xkZXInLFxuICBJQ09OOiAnaWNvbicsXG4gIE9QRU46ICdvcGVuJyxcbiAgSElEREVOOiAnaGlkZGVuJyxcbiAgRElTQUJMRUQ6ICdkaXNhYmxlZCcsXG4gIFNFTEVDVEVEOiAnc2VsZWN0ZWQnLFxuICBISUdITElHSFQ6ICdoaWdobGlnaHQnXG59O1xuXG5leHBvcnQgY29uc3QgY2xzID0gKGZ1bmN0aW9uKCkge1xuICBmb3JFYWNoT3duUHJvcGVydGllcyhjbGFzc05hbWVzLCAodmFsdWUsIGtleSkgPT4ge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgY2xhc3NOYW1lc1trZXldID0gYCR7Q1NTX1BSRUZJWH0tJHt2YWx1ZX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbGFzc05hbWVzW2tleV0gPSBDU1NfUFJFRklYO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGNsYXNzTmFtZXM7XG59KSgpO1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IERyb3Bkb3duXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG5pbXBvcnQgZm9yRWFjaEFycmF5IGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvY29sbGVjdGlvbi9mb3JFYWNoQXJyYXknO1xuaW1wb3J0IGlzRXhpc3R5IGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvdHlwZS9pc0V4aXN0eSc7XG5pbXBvcnQgaXNOdW1iZXIgZnJvbSAndHVpLWNvZGUtc25pcHBldC90eXBlL2lzTnVtYmVyJztcbmltcG9ydCBhZGRDbGFzcyBmcm9tICd0dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvYWRkQ2xhc3MnO1xuaW1wb3J0IHJlbW92ZUNsYXNzIGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9yZW1vdmVDbGFzcyc7XG5pbXBvcnQgcmVtb3ZlRWxlbWVudCBmcm9tICd0dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvcmVtb3ZlRWxlbWVudCc7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBjbHMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgSXRlbUdyb3VwIGZyb20gJy4vaXRlbUdyb3VwJztcbmltcG9ydCBJdGVtIGZyb20gJy4vaXRlbSc7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnNcbiAqICAgQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnBsYWNlaG9sZGVyXSAtIHBsYWNlaG9sZGVyIGZvciBhbiBpbnB1dFxuICogICBAcGFyYW0ge2FycmF5PGl0ZW1EYXRhfGl0ZW1Hcm91cERhdGE+fSBvcHRpb25zLmRhdGEgLSBkYXRhIGZvciBJdGVtR3JvdXBzIGFuZCBJdGVtc1xuICogICBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRpc2FibGVkPWZhbHNlXSAtIHdoZXRoZXIgYSBkcm9wZG93biBzaG91bGQgYmUgZGlzYWJsZWQgb3Igbm90XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyb3Bkb3duIHtcbiAgY29uc3RydWN0b3IoeyBwbGFjZWhvbGRlciwgZGF0YSwgZGlzYWJsZWQgPSBmYWxzZSB9KSB7XG4gICAgLyoqXG4gICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5lbCA9IGNyZWF0ZUVsZW1lbnQoJ3VsJywgJycsIHsgY2xhc3NOYW1lOiBgJHtjbHMuRFJPUERPV059ICR7Y2xzLkhJRERFTn1gIH0pO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5uYXRpdmVFbCA9IGNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcsICcnLCB7IGNsYXNzTmFtZTogY2xzLkhJRERFTiwgdGFiSW5kZXg6IC0xIH0pO1xuXG4gICAgLyoqXG4gICAgICogSXRlbXMgYW5kIEl0ZW1Hcm91cHNcbiAgICAgKiBAdHlwZSB7QXJyYXkuPEl0ZW18SXRlbUdyb3VwPn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaXRlbXMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIHRoZSBudW1iZXIgb2YgSXRlbVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLml0ZW1MZW5ndGggPSAwO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtID0gbnVsbDtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZShkYXRhLCBkaXNhYmxlZCwgcGxhY2Vob2xkZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBJdGVtcyBhbmQgSXRlbUdyb3VwcyBhbmQgY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgSXRlbXNcbiAgICogQHJldHVybiB7YXJyYXk8SXRlbXxJdGVtR3JvdXA+fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5pdGlhbGl6ZUl0ZW1zKGRhdGEpIHtcbiAgICBsZXQgaXRlbTtcbiAgICBsZXQgaXRlbUluZGV4ID0gMDtcbiAgICBsZXQgaXRlbUdyb3VwSW5kZXggPSAwO1xuICAgIGRhdGEuZm9yRWFjaChkYXR1bSA9PiB7XG4gICAgICBpZiAoZGF0dW0uZGF0YSkge1xuICAgICAgICBpdGVtID0gbmV3IEl0ZW1Hcm91cCh7IGluZGV4OiBpdGVtSW5kZXgsIGl0ZW1Hcm91cEluZGV4LCAuLi5kYXR1bSB9KTtcbiAgICAgICAgaXRlbUluZGV4ICs9IGRhdHVtLmRhdGEubGVuZ3RoIC0gMTtcbiAgICAgICAgaXRlbUdyb3VwSW5kZXggKz0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW0gPSBuZXcgSXRlbSh7IGluZGV4OiBpdGVtSW5kZXgsIC4uLmRhdHVtIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLml0ZW1zLnB1c2goaXRlbSk7XG4gICAgICBpdGVtLmFwcGVuZFRvQ29udGFpbmVyKHRoaXMuZWwsIHRoaXMubmF0aXZlRWwpO1xuICAgICAgaXRlbUluZGV4ICs9IDE7XG4gICAgfSk7XG5cbiAgICB0aGlzLml0ZW1MZW5ndGggPSBpdGVtSW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5pdGlhbGl6ZShkYXRhLCBkaXNhYmxlZCwgcGxhY2Vob2xkZXIpIHtcbiAgICBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICAgIGNyZWF0ZUVsZW1lbnQoJ29wdGlvbicsICcnLCB7IGxhYmVsOiBwbGFjZWhvbGRlciwgdmFsdWU6ICcnIH0sIHRoaXMubmF0aXZlRWwpO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdGlhbGl6ZUl0ZW1zKGRhdGEpO1xuXG4gICAgdGhpcy5pdGVyYXRlSXRlbXMoaXRlbSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRJdGVtICYmIGl0ZW0uaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEl0ZW0gJiYgaXRlbS5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgaXRlbS5kZXNlbGVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIHdoaWxlIGl0ZXJhdGluZyBpdGVtc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIGZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIC0gYXJndW1lbnRzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpdGVyYXRlSXRlbXMoY2FsbGJhY2ssIC4uLmFyZ3MpIHtcbiAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgZm9yRWFjaEFycmF5KHRoaXMuaXRlbXMsIGl0ZW0gPT4ge1xuICAgICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEl0ZW1Hcm91cCkge1xuICAgICAgICBmb3JFYWNoQXJyYXkoaXRlbS5nZXRJdGVtcygpLCBpdGVtSW5Hcm91cCA9PiB7XG4gICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2suYXBwbHkodGhpcywgW2l0ZW1Jbkdyb3VwLCBpbmRleCwgLi4uYXJnc10pIHx8IGZhbHNlO1xuICAgICAgICAgIGluZGV4ICs9IDE7XG5cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICByZXN1bHQgPSBjYWxsYmFjay5hcHBseSh0aGlzLCBbaXRlbSwgaW5kZXgsIC4uLmFyZ3NdKTtcbiAgICAgIGluZGV4ICs9IDE7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiBhIGRyb3Bkb3duIGxpc3RcbiAgICovXG4gIG9wZW4oKSB7XG4gICAgcmVtb3ZlQ2xhc3ModGhpcy5lbCwgY2xzLkhJRERFTik7XG4gICAgY29uc3QgaGlnaGxpZ2h0ZWRJdGVtID1cbiAgICAgICF0aGlzLnNlbGVjdGVkSXRlbSB8fCB0aGlzLnNlbGVjdGVkSXRlbS5pc0Rpc2FibGVkKClcbiAgICAgICAgPyB0aGlzLmdldEl0ZW1zKGl0ZW0gPT4gIWl0ZW0uaXNEaXNhYmxlZCgpKVswXVxuICAgICAgICA6IHRoaXMuc2VsZWN0ZWRJdGVtO1xuICAgIHRoaXMuaGlnaGxpZ2h0KGhpZ2hsaWdodGVkSXRlbSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgYSBkcm9wZG93biBsaXN0XG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICBhZGRDbGFzcyh0aGlzLmVsLCBjbHMuSElEREVOKTtcbiAgICB0aGlzLmRlaGlnaGxpZ2h0KCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBhbiBkcm9wZG93blxuICAgKi9cbiAgZGlzYWJsZSgpIHtcbiAgICB0aGlzLm5hdGl2ZUVsLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBhZGRDbGFzcyh0aGlzLmVsLCBjbHMuRElTQUJMRUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBhbiBkcm9wZG93blxuICAgKi9cbiAgZW5hYmxlKCkge1xuICAgIHRoaXMubmF0aXZlRWwuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICByZW1vdmVDbGFzcyh0aGlzLmVsLCBjbHMuRElTQUJMRUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhbiBJdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxJdGVtfSB2YWx1ZSAtIGlmIHN0cmluZywgZmluZCBhbiBJdGVtIGJ5IGl0cyB2YWx1ZS4gaWYgbnVtYmVyLCBmaW5kIGFuIEl0ZW0gYnkgaXRzIGluZGV4LlxuICAgKiBAcmV0dXJuIHtJdGVtfSByZXN1bHQgb2Ygc2VsZWN0aW9uXG4gICAqL1xuICBzZWxlY3QodmFsdWUpIHtcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSB2YWx1ZSBpbnN0YW5jZW9mIEl0ZW0gPyB2YWx1ZSA6IHRoaXMuZ2V0SXRlbSh2YWx1ZSk7XG4gICAgdGhpcy5kZXNlbGVjdCgpO1xuXG4gICAgaWYgKCFzZWxlY3RlZEl0ZW0gfHwgKHNlbGVjdGVkSXRlbSAmJiBzZWxlY3RlZEl0ZW0uaXNEaXNhYmxlZCgpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc2VsZWN0ZWRJdGVtLnNlbGVjdCgpO1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gc2VsZWN0ZWRJdGVtO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkSXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlbGVjdCBhbiBJdGVtXG4gICAqL1xuICBkZXNlbGVjdCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW0pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtLmRlc2VsZWN0KCk7XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhpZ2hsaWdodCBhbiBJdGVtXG4gICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ3xJdGVtfSB2YWx1ZSAtIGlmIHN0cmluZywgZmluZCBhbiBJdGVtIGJ5IGl0cyB2YWx1ZS4gaWYgbnVtYmVyLCBmaW5kIGFuIEl0ZW0gYnkgaXRzIGluZGV4LlxuICAgKi9cbiAgaGlnaGxpZ2h0KHZhbHVlKSB7XG4gICAgbGV0IGhpZ2hsaWdodGVkSXRlbTtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJdGVtKSB7XG4gICAgICBoaWdobGlnaHRlZEl0ZW0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGlzRXhpc3R5KHZhbHVlKSkge1xuICAgICAgaGlnaGxpZ2h0ZWRJdGVtID0gdGhpcy5nZXRJdGVtKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoaGlnaGxpZ2h0ZWRJdGVtICYmIGhpZ2hsaWdodGVkSXRlbSAhPT0gdGhpcy5oaWdobGlnaHRlZEl0ZW0pIHtcbiAgICAgIHRoaXMuZGVoaWdobGlnaHQoKTtcbiAgICAgIGhpZ2hsaWdodGVkSXRlbS5oaWdobGlnaHQoKTtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtID0gaGlnaGxpZ2h0ZWRJdGVtO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWhpZ2hsaWdodCBhbiBJdGVtXG4gICAqL1xuICBkZWhpZ2hsaWdodCgpIHtcbiAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW0pIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtLmRlaGlnaGxpZ2h0KCk7XG4gICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgYSBoaWdobGlnaHRlZCBJdGVtXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkaXJlY3Rpb24gLSBkaXJlY3Rpb24gdG8gbW92ZVxuICAgKi9cbiAgbW92ZUhpZ2hsaWdodGVkSXRlbShkaXJlY3Rpb24pIHtcbiAgICBjb25zdCBoaWdobGlnaHRlZEl0ZW0gPSB0aGlzLmdldEhpZ2hsaWdodGVkSXRlbSgpO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBpdGVtcztcblxuICAgIGxldCBpbmRleCA9IGl0ZW1zLmluZGV4T2YoaGlnaGxpZ2h0ZWRJdGVtKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgaW5kZXggPSB0aGlzLmdldEl0ZW1JbmRleChpbmRleCwgbGVuZ3RoLCBkaXJlY3Rpb24pO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKCFpdGVtc1tpbmRleF0uaXNEaXNhYmxlZCgpKSB7XG4gICAgICAgICAgdGhpcy5oaWdobGlnaHQoaXRlbXNbaW5kZXhdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ID0gdGhpcy5nZXRJdGVtSW5kZXgoaW5kZXgsIGxlbmd0aCwgZGlyZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRJdGVtSW5kZXgoaW5kZXgsIGxlbmd0aCwgZGlyZWN0aW9uKSB7XG4gICAgcmV0dXJuIChpbmRleCArIGRpcmVjdGlvbiArIGxlbmd0aCkgJSBsZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBJdGVtcyB0aGF0IHBhc3MgdGhlIHRlc3QgaW1wbGVtZW50ZWQgYnkgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gICAqIElmIGZpbHRlciBmdW5jdGlvbiBpcyBub3QgcGFzc2VkLCBpdCByZXR1cm5zIGFsbCBJdGVtc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGZpbHRlciBpdGVtc1xuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIC0gdGhlIG51bWJlciBvZiBpdGVtcyB0byBmaW5kLiAtMSBtZWFucyBhbGwgaXRlbXMuXG4gICAqIEByZXR1cm4ge2FycmF5PEl0ZW0+fVxuICAgKi9cbiAgZ2V0SXRlbXMoY2FsbGJhY2sgPSAoKSA9PiB0cnVlLCBudW1iZXIgPSAtMSkge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgdGhpcy5pdGVyYXRlSXRlbXMoaXRlbSA9PiB7XG4gICAgICBpZiAoY2FsbGJhY2soaXRlbSkpIHtcbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgbnVtYmVyIC09IDE7XG5cbiAgICAgICAgcmV0dXJuIG51bWJlciAhPT0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIEl0ZW0gYnkgaXRzIGluZGV4IG9yIHZhbHVlXG4gICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWUgLSBpZiBzdHJpbmcsIHRoZSBJdGVtJ3MgdmFsdWUuIGlmIG51bWJlciwgdGhlIEl0ZW0ncyBpbmRleC5cbiAgICogQHJldHVybiB7SXRlbX1cbiAgICovXG4gIGdldEl0ZW0odmFsdWUpIHtcbiAgICBjb25zdCBpc1ZhbGlkSXRlbSA9IGlzTnVtYmVyKHZhbHVlKVxuICAgICAgPyBjb21wYXJlZEl0ZW0gPT4gY29tcGFyZWRJdGVtLmdldEluZGV4KCkgPT09IHZhbHVlXG4gICAgICA6IGNvbXBhcmVkSXRlbSA9PiBjb21wYXJlZEl0ZW0uZ2V0VmFsdWUoKSA9PT0gdmFsdWU7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtcyhpc1ZhbGlkSXRlbSwgMSlbMF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBJdGVtR3JvdXBzIHRoYXQgcGFzcyB0aGUgdGVzdCBpbXBsZW1lbnRlZCBieSB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAgICogSWYgZmlsdGVyIGZ1bmN0aW9uIGlzIG5vdCBwYXNzZWQsIGl0IHJldHVybnMgYWxsIEl0ZW1Hcm91cHNcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBjYWxsYmFjayBmdW5jdGlvbiB0byBmaWx0ZXIgaXRlbSBncm91cHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciAtIHRoZSBudW1iZXIgb2YgaXRlbSBncm91cHMgdG8gZmluZC4gLTEgbWVhbnMgYWxsIGl0ZW0gZ3JvdXBzLlxuICAgKiBAcmV0dXJuIHthcnJheTxJdGVtR3JvdXA+fVxuICAgKi9cbiAgZ2V0SXRlbUdyb3VwcyhjYWxsYmFjayA9ICgpID0+IHRydWUsIG51bWJlciA9IC0xKSB7XG4gICAgY29uc3QgaXRlbUdyb3VwcyA9IFtdO1xuICAgIGZvckVhY2hBcnJheSh0aGlzLml0ZW1zLCBpdGVtR3JvdXAgPT4ge1xuICAgICAgaWYgKGl0ZW1Hcm91cCBpbnN0YW5jZW9mIEl0ZW1Hcm91cCAmJiBjYWxsYmFjayhpdGVtR3JvdXApKSB7XG4gICAgICAgIGl0ZW1Hcm91cHMucHVzaChpdGVtR3JvdXApO1xuICAgICAgICBudW1iZXIgLT0gMTtcblxuICAgICAgICByZXR1cm4gbnVtYmVyICE9PSAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpdGVtR3JvdXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBJdGVtR3JvdXAgYnkgaXRzIGluZGV4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIGdyb3VwSW5kZXggb2YgdGhlIEl0ZW1Hcm91cFxuICAgKiBAcmV0dXJuIHtJdGVtR3JvdXB9XG4gICAqL1xuICBnZXRJdGVtR3JvdXAoaW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJdGVtR3JvdXBzKGl0ZW1Hcm91cCA9PiBpdGVtR3JvdXAuZ2V0SW5kZXgoKSA9PT0gaW5kZXgsIDEpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIEl0ZW1zXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldEl0ZW1MZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbUxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHNlbGVjdGVkIEl0ZW1cbiAgICogQHJldHVybiB7SXRlbX1cbiAgICovXG4gIGdldFNlbGVjdGVkSXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBoaWdobGlnaHRlZCBJdGVtXG4gICAqIEByZXR1cm4ge0l0ZW19XG4gICAqL1xuICBnZXRIaWdobGlnaHRlZEl0ZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZCB0aGUgZWxlbWVudCBhbmQgbmF0aXZlIGVsZW1lbnQgdG8gdGhlIGNvbnRhaW5lclxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIgLSBjb250YWluZXIgZWxlbWVudFxuICAgKi9cbiAgYXBwZW5kVG9Db250YWluZXIoY29udGFpbmVyKSB7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZWwpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm5hdGl2ZUVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0b3J5IGEgZHJvcGRvd25cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5kZXN0cm95KCkpO1xuICAgIHJlbW92ZUVsZW1lbnQodGhpcy5lbCk7XG4gICAgcmVtb3ZlRWxlbWVudCh0aGlzLm5hdGl2ZUVsKTtcbiAgICB0aGlzLmVsID0gdGhpcy5uYXRpdmVFbCA9IHRoaXMuaXRlbXMgPSB0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMuaGlnaGxpZ2h0ZWRJdGVtID0gbnVsbDtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG5pbXBvcnQgU2VsZWN0Qm94IGZyb20gJy4vc2VsZWN0Qm94JztcbmltcG9ydCAnLi4vY3NzL3NlbGVjdEJveC5jc3MnO1xuXG5leHBvcnQgZGVmYXVsdCBTZWxlY3RCb3g7XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgSW5wdXRcbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbmltcG9ydCBhZGRDbGFzcyBmcm9tICd0dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvYWRkQ2xhc3MnO1xuaW1wb3J0IHJlbW92ZUNsYXNzIGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9yZW1vdmVDbGFzcyc7XG5pbXBvcnQgcmVtb3ZlRWxlbWVudCBmcm9tICd0dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvcmVtb3ZlRWxlbWVudCc7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBjbHMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnNcbiAqICAgQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnBsYWNlaG9sZGVyXSAtIHBsYWNlaG9sZGVyIGZvciBhIHNlbGVjdCBib3hcbiAqICAgQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRpc2FibGVkXSAtIHdoZXRoZXIgYW4gaW5wdXQgc2hvdWxkIGJlIGRpc2FibGVkIG9yIG5vdFxuICogICBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNob3dJY29uXSAtIHdoZXRoZXIgYW4gYXJyb3cgaWNvbiBpbiB0aGUgaW5wdXQgc2hvdWxkIGJlIHNob3duXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIElucHV0IHtcbiAgY29uc3RydWN0b3IoeyBwbGFjZWhvbGRlciwgZGlzYWJsZWQsIHNob3dJY29uIH0pIHtcbiAgICAvKipcbiAgICAgKiB0ZXh0IGZvciBhIHBsYWNlaG9sZGVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMucGxhY2Vob2xkZXJUZXh0ID0gcGxhY2Vob2xkZXI7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmVsID0gY3JlYXRlRWxlbWVudCgnZGl2JywgJycsIHsgY2xhc3NOYW1lOiBjbHMuSU5QVVQsIHRhYkluZGV4OiAwIH0pO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5wbGFjZWhvbGRlckVsID0gY3JlYXRlRWxlbWVudChcbiAgICAgICdwJyxcbiAgICAgIHRoaXMucGxhY2Vob2xkZXJUZXh0LFxuICAgICAgeyBjbGFzc05hbWU6IGNscy5QTEFDRUhPTERFUiB9LFxuICAgICAgdGhpcy5lbFxuICAgICk7XG5cbiAgICB0aGlzLmluaXRpYWxpemUoZGlzYWJsZWQsIHNob3dJY29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0aWFsaXplKGRpc2FibGVkLCBzaG93SWNvbikge1xuICAgIGlmIChzaG93SWNvbikge1xuICAgICAgY3JlYXRlRWxlbWVudCgnc3BhbicsICdzZWxlY3QnLCB7IGNsYXNzTmFtZTogY2xzLklDT04gfSwgdGhpcy5lbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxhY2Vob2xkZXJFbC53aWR0aCA9ICcxMDAlJztcbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGFuIGlucHV0XG4gICAqL1xuICBkaXNhYmxlKCkge1xuICAgIGFkZENsYXNzKHRoaXMuZWwsIGNscy5ESVNBQkxFRCk7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIGFuIGlucHV0XG4gICAqL1xuICBlbmFibGUoKSB7XG4gICAgcmVtb3ZlQ2xhc3ModGhpcy5lbCwgY2xzLkRJU0FCTEVEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGFuIGlucHV0XG4gICAqL1xuICBvcGVuKCkge1xuICAgIGFkZENsYXNzKHRoaXMuZWwsIGNscy5PUEVOKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBhbiBpbnB1dFxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgcmVtb3ZlQ2xhc3ModGhpcy5lbCwgY2xzLk9QRU4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvY3VzXG4gICAqL1xuICBmb2N1cygpIHtcbiAgICB0aGlzLmVsLmZvY3VzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSB0ZXh0IGluIHRoZSBwbGFjZWhvbGRlclxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW0gLSBzZWxlY3RlZCBJdGVtXG4gICAqL1xuICBjaGFuZ2VUZXh0KGl0ZW0pIHtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgdGhpcy5wbGFjZWhvbGRlckVsLnRleHRDb250ZW50ID0gaXRlbS5nZXRMYWJlbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYWNlaG9sZGVyRWwudGV4dENvbnRlbnQgPSB0aGlzLnBsYWNlaG9sZGVyVGV4dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kIHRoZSBlbGVtZW50IHRvIHRoZSBjb250YWluZXJcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyIC0gY29udGFpbmVyIGVsZW1lbnRcbiAgICovXG4gIGFwcGVuZFRvQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IGFuIGlucHV0XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHJlbW92ZUVsZW1lbnQodGhpcy5lbCk7XG4gICAgdGhpcy5lbCA9IHRoaXMucGxhY2Vob2xkZXJFbCA9IG51bGw7XG4gIH1cbn1cbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBJdGVtXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG5pbXBvcnQgYWRkQ2xhc3MgZnJvbSAndHVpLWNvZGUtc25pcHBldC9kb21VdGlsL2FkZENsYXNzJztcbmltcG9ydCByZW1vdmVDbGFzcyBmcm9tICd0dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvcmVtb3ZlQ2xhc3MnO1xuaW1wb3J0IHJlbW92ZUVsZW1lbnQgZnJvbSAndHVpLWNvZGUtc25pcHBldC9kb21VdGlsL3JlbW92ZUVsZW1lbnQnO1xuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgY2xzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIEBjbGFzc1xuICogQGRlc2NyaXB0aW9uXG4gKiBBbiBpdGVtLlxuICogWW91IGNhbiBnZXQgSXRlbSBieSB7QGxpbmsgU2VsZWN0Qm94I2dldEl0ZW0gU2VsZWN0Qm94LmdldEl0ZW0oKX0gYW5kIHtAbGluayBTZWxlY3RCb3gjZ2V0SXRlbXMgU2VsZWN0Qm94LmdldEl0ZW1zKCl9LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJdGVtIHtcbiAgLyoqXG4gICAqIEBoaWRlY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zXG4gICAqICAgQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhYmVsXSAtIGxhYmVsIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZHJvcC1kb3duIGxpc3RcbiAgICogICBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy52YWx1ZSAtIHZhbHVlIG9mIGFuIGl0ZW1cbiAgICogICBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRpc2FibGVkPWZhbHNlXSAtIHdoZXRoZXIgYW4gSXRlbSBzaG91bGQgYmUgZGlzYWJsZWQgb3Igbm90XG4gICAqICAgQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZWxlY3RlZD1mYWxzZV0gLSB3aGV0aGVyIGFuIEl0ZW0gc2hvdWxkIGJlIHByZS1zZWxlY3RlZCBvciBub3RcbiAgICogICBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5pbmRleCAtIEl0ZW0ncyBpbmRleFxuICAgKi9cbiAgY29uc3RydWN0b3IoeyB2YWx1ZSwgbGFiZWwsIGRpc2FibGVkLCBzZWxlY3RlZCwgaW5kZXggfSkge1xuICAgIC8qKlxuICAgICAqIHZhbHVlIG9mIGFuIGl0ZW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy52YWx1ZSA9IGAke3ZhbHVlfWA7XG5cbiAgICAvKipcbiAgICAgKiBsYWJlbCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGRyb3AtZG93biBsaXN0XG4gICAgICogaWYgbGFiZWwgaXMgYW4gZW1wdHkgc3RyaW5nLCBpdCBzaG91bGQgYmUgc2FtZSBhcyBpdHMgdmFsdWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5sYWJlbCA9IGxhYmVsIHx8IHRoaXMudmFsdWU7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xuXG4gICAgLyoqXG4gICAgICogd2hldGhlciBhbiBJdGVtR3JvdXAgb2YgdGhlIEl0ZW0gaXMgZGlzYWJsZWQgb3Igbm90XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLml0ZW1Hcm91cERpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiB3aGV0aGVyIGFuIEl0ZW0gaXMgZGlzYWJsZWQgb3Igbm90XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLml0ZW1EaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLnNlbGVjdGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiA8bGk+IGVsZW1lbnQgZm9yIGEgY3VzdG9tIGRyb3Bkb3duIGl0ZW1cbiAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmVsID0gY3JlYXRlRWxlbWVudCgnbGknLCB0aGlzLmxhYmVsLCB7XG4gICAgICBjbGFzc05hbWU6IGNscy5JVEVNLFxuICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgJ2RhdGEtdmFsdWUnOiB0aGlzLnZhbHVlLFxuICAgICAgJ2RhdGEtaW5kZXgnOiB0aGlzLmluZGV4XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiA8b3B0aW9uPiBlbGVtZW50IGZvciBhIHNlbGVjdCBlbGVtZW50XG4gICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5uYXRpdmVFbCA9IGNyZWF0ZUVsZW1lbnQoJ29wdGlvbicsICcnLCB7XG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsXG4gICAgfSk7XG5cbiAgICB0aGlzLmluaXRpYWxpemUoZGlzYWJsZWQsIHNlbGVjdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0aWFsaXplKGRpc2FibGVkLCBzZWxlY3RlZCkge1xuICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgdGhpcy5zZWxlY3QoKTtcbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGFuIEl0ZW0gZGlzYWJsZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbWFrZURpc2FibGUoKSB7XG4gICAgdGhpcy5uYXRpdmVFbC5kaXNhYmxlZCA9IHRydWU7XG4gICAgYWRkQ2xhc3ModGhpcy5lbCwgY2xzLkRJU0FCTEVEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGFuIEl0ZW0gZW5hYmxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYWtlRW5hYmxlKCkge1xuICAgIHRoaXMubmF0aXZlRWwuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICByZW1vdmVDbGFzcyh0aGlzLmVsLCBjbHMuRElTQUJMRUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgYW4gSXRlbSBkdWUgdG8gYW4gSXRlbUdyb3VwXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGRpc2FibGVJdGVtR3JvdXAoKSB7XG4gICAgdGhpcy5pdGVtR3JvdXBEaXNhYmxlZCA9IHRydWU7XG4gICAgdGhpcy5tYWtlRGlzYWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBhbiBJdGVtIGR1ZSB0byBhbiBJdGVtR3JvdXBcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZW5hYmxlSXRlbUdyb3VwKCkge1xuICAgIHRoaXMuaXRlbUdyb3VwRGlzYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuaXNEaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLm1ha2VFbmFibGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBhbiBJdGVtXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGRpc2FibGUoKSB7XG4gICAgdGhpcy5pdGVtRGlzYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMubWFrZURpc2FibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgYW4gSXRlbVxuICAgKiBAaWdub3JlXG4gICAqL1xuICBlbmFibGUoKSB7XG4gICAgdGhpcy5pdGVtRGlzYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuaXNEaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLm1ha2VFbmFibGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IGFuIEl0ZW1cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc2VsZWN0KCkge1xuICAgIGlmICghdGhpcy5pc0Rpc2FibGVkKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLm5hdGl2ZUVsLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIGFkZENsYXNzKHRoaXMuZWwsIGNscy5TRUxFQ1RFRCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc2VsZWN0IGFuIEl0ZW1cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZGVzZWxlY3QoKSB7XG4gICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMubmF0aXZlRWwuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICByZW1vdmVDbGFzcyh0aGlzLmVsLCBjbHMuU0VMRUNURUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZ2hsaWdodCBhbiBJdGVtXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGhpZ2hsaWdodCgpIHtcbiAgICBpZiAoIXRoaXMuaXNEaXNhYmxlZCgpKSB7XG4gICAgICBhZGRDbGFzcyh0aGlzLmVsLCBjbHMuSElHSExJR0hUKTtcbiAgICAgIHRoaXMuZWwuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgaGlnaGxpZ2h0IGZyb20gYW4gSXRlbVxuICAgKiBAaWdub3JlXG4gICAqL1xuICBkZWhpZ2hsaWdodCgpIHtcbiAgICByZW1vdmVDbGFzcyh0aGlzLmVsLCBjbHMuSElHSExJR0hUKTtcbiAgICB0aGlzLmVsLmJsdXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gaXRlbSdzIHZhbHVlLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gaXRlbSdzIGxhYmVsLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRMYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gaXRlbSdzIGluZGV4LlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXRJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciBhbiBpdGVtIGlzIHNlbGVjdGVkIG9yIG5vdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzU2VsZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgYW4gaXRlbSBpcyBkaXNhYmxlZCBvciBub3QuXG4gICAqIFRoZSByZXN1bHQgaXMgdHJ1ZSBpZiBhbnkgb2YgdGhlIGl0ZW1zIGFuZCBpdGVtIGdyb3VwcyBhcmUgZGlzYWJsZWQuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBpc0Rpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1EaXNhYmxlZCB8fCB0aGlzLml0ZW1Hcm91cERpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZCB0aGUgZWxlbWVudCBhbmQgbmF0aXZlIGVsZW1lbnQgdG8gdGhlIGNvbnRhaW5lcnNcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyIC0gY29udGFpbmVyIGVsZW1lbnRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbmF0aXZlQ29udGFpbmVyIC0gbmF0aXZlIGNvbnRhaW5lciBlbGVtZW50XG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGFwcGVuZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgbmF0aXZlQ29udGFpbmVyKSB7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZWwpO1xuICAgIG5hdGl2ZUNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm5hdGl2ZUVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IGFuIEl0ZW1cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICByZW1vdmVFbGVtZW50KHRoaXMuZWwpO1xuICAgIHJlbW92ZUVsZW1lbnQodGhpcy5uYXRpdmVFbCk7XG4gICAgdGhpcy5lbCA9IHRoaXMubmF0aXZlRWwgPSBudWxsO1xuICB9XG59XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgSXRlbUdyb3VwXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG5pbXBvcnQgYWRkQ2xhc3MgZnJvbSAndHVpLWNvZGUtc25pcHBldC9kb21VdGlsL2FkZENsYXNzJztcbmltcG9ydCByZW1vdmVDbGFzcyBmcm9tICd0dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvcmVtb3ZlQ2xhc3MnO1xuaW1wb3J0IHJlbW92ZUVsZW1lbnQgZnJvbSAndHVpLWNvZGUtc25pcHBldC9kb21VdGlsL3JlbW92ZUVsZW1lbnQnO1xuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgY2xzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IEl0ZW0gZnJvbSAnLi9pdGVtJztcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBkZXNjcmlwdGlvblxuICogQSBncm91cCBvZiBpdGVtcy5cbiAqIFlvdSBjYW4gZ2V0IEl0ZW1Hcm91cCBieSB7QGxpbmsgU2VsZWN0Qm94I2dldEl0ZW1Hcm91cCBTZWxlY3RCb3guZ2V0SXRlbUdyb3VwKCl9IGFuZCB7QGxpbmsgU2VsZWN0Qm94I2dldEl0ZW1Hcm91cHMgU2VsZWN0Qm94LmdldEl0ZW1Hcm91cHMoKX0uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEl0ZW1Hcm91cCB7XG4gIC8qKlxuICAgKiBAaGlkZWNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gb3B0aW9uc1xuICAgKiAgIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0gLSBsYWJlbCB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGRyb3Bkb3duIGxpc3RcbiAgICogICBAcGFyYW0ge2FycmF5PGl0ZW1EYXRhPn0gb3B0aW9ucy5kYXRhIC0gZGF0YSBmb3IgSXRlbXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIEl0ZW1Hcm91cFxuICAgKiAgIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlzYWJsZWQ9ZmFsc2VdIC0gd2hldGhlciBhbiBJdGVtR3JvdXAgc2hvdWxkIGJlIGRpc2FibGVkIG9yIG5vdFxuICAgKiAgIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLmluZGV4IC0gaW5kZXggb2YgdGhlIGZpcnN0IEl0ZW0gaW4gdGhlIEl0ZW1Hcm91cFxuICAgKiAgIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLml0ZW1Hcm91cEluZGV4IC0gaW5kZXggb2YgdGhlIEl0ZW1Hcm91cFxuICAgKi9cbiAgY29uc3RydWN0b3IoeyBsYWJlbCA9ICcnLCBkYXRhLCBkaXNhYmxlZCA9IGZhbHNlLCBpbmRleCwgaXRlbUdyb3VwSW5kZXggfSkge1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuZWwgPSBjcmVhdGVFbGVtZW50KCdsaScsICcnLCB7ICdkYXRhLWdyb3VwLWluZGV4JzogaXRlbUdyb3VwSW5kZXggfSk7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmxhYmVsRWwgPSBjcmVhdGVFbGVtZW50KCdzcGFuJywgbGFiZWwsIHsgY2xhc3NOYW1lOiBjbHMuSVRFTV9HUk9VUF9MQUJFTCB9LCB0aGlzLmVsKTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaXRlbUNvbnRhaW5lckVsID0gY3JlYXRlRWxlbWVudCgndWwnLCAnJywgeyBjbGFzc05hbWU6IGNscy5JVEVNX0dST1VQIH0sIHRoaXMuZWwpO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5uYXRpdmVFbCA9IGNyZWF0ZUVsZW1lbnQoJ29wdGdyb3VwJywgbGFiZWwpO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge2FycmF5PEl0ZW0+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5pdGVtcyA9IHRoaXMuY3JlYXRlSXRlbXMoZGF0YSwgaW5kZXgpO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaW5kZXggPSBpdGVtR3JvdXBJbmRleDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG5cbiAgICAvKipcbiAgICAgKiB3aGV0aGVyIGFuIEl0ZW1Hcm91cCBpcyBkaXNhYmxlZCBvciBub3RcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZShkaXNhYmxlZCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEl0ZW1zIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBJdGVtR3JvdXBcbiAgICogQHJldHVybiB7YXJyYXk8SXRlbT59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVJdGVtcyhkYXRhLCBpbmRleCkge1xuICAgIHJldHVybiBkYXRhLm1hcCgoZGF0dW0sIGl0ZW1JbmRleCkgPT4ge1xuICAgICAgY29uc3QgaXRlbSA9IG5ldyBJdGVtKHsgaW5kZXg6IGluZGV4ICsgaXRlbUluZGV4LCAuLi5kYXR1bSB9KTtcbiAgICAgIGl0ZW0uYXBwZW5kVG9Db250YWluZXIodGhpcy5pdGVtQ29udGFpbmVyRWwsIHRoaXMubmF0aXZlRWwpO1xuXG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0aWFsaXplKGRpc2FibGVkKSB7XG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBhbiBJdGVtR3JvdXBcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZGlzYWJsZSgpIHtcbiAgICB0aGlzLmRpc2FibGVkID0gdGhpcy5uYXRpdmVFbC5kaXNhYmxlZCA9IHRydWU7XG4gICAgYWRkQ2xhc3ModGhpcy5sYWJlbEVsLCBjbHMuRElTQUJMRUQpO1xuICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0uZGlzYWJsZUl0ZW1Hcm91cCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgYW4gSXRlbUdyb3VwXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLmRpc2FibGVkID0gdGhpcy5uYXRpdmVFbC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHJlbW92ZUNsYXNzKHRoaXMubGFiZWxFbCwgY2xzLkRJU0FCTEVEKTtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiBpdGVtLmVuYWJsZUl0ZW1Hcm91cCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQge0BsaW5rIEl0ZW0gaXRlbXN9IGluIHRoZSBpdGVtIGdyb3VwLlxuICAgKiBAcmV0dXJuIHthcnJheTxJdGVtPn1cbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgaXRlbXMgPSBpdGVtR3JvdXAuZ2V0SXRlbXMoKTtcbiAgICogY29uc29sZS5sb2coaXRlbXNbMF0pOyAvLyBmaXJzdCBpdGVtIGluIHRoZSBpdGVtIGdyb3VwXG4gICAqIGNvbnNvbGUubG9nKGl0ZW1zLmxlbmd0aCk7IC8vIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGl0ZW0gZ3JvdXBcbiAgICovXG4gIGdldEl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBpdGVtIGdyb3VwJ3MgaW5kZXguXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldEluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLmluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBpdGVtIGdyb3VwJ3MgbGFiZWwuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldExhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLmxhYmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIGFuIEl0ZW1Hcm91cCBpcyBkaXNhYmxlZCBvciBub3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBpc0Rpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZCB0aGUgZWxlbWVudCBhbmQgbmF0aXZlIGVsZW1lbnQgdG8gdGhlIGNvbnRhaW5lcnNcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyIC0gY29udGFpbmVyIGVsZW1lbnRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbmF0aXZlQ29udGFpbmVyIC0gbmF0aXZlIGNvbnRhaW5lciBlbGVtZW50XG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGFwcGVuZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgbmF0aXZlQ29udGFpbmVyKSB7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZWwpO1xuICAgIG5hdGl2ZUNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm5hdGl2ZUVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0b3J5IGFuIEl0ZW1Hcm91cFxuICAgKiBAaWdub3JlXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0uZGVzdHJveSgpKTtcbiAgICByZW1vdmVFbGVtZW50KHRoaXMuZWwpO1xuICAgIHJlbW92ZUVsZW1lbnQodGhpcy5uYXRpdmVFbCk7XG4gICAgdGhpcy5lbCA9IHRoaXMubGFiZWxFbCA9IHRoaXMuaXRlbUNvbnRhaW5lckVsID0gdGhpcy5uYXRpdmVFbCA9IHRoaXMuaXRlbXMgPSBudWxsO1xuICB9XG59XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgVXRpbGl0eSBmdW5jdGlvbnMgcmVsYXRlZCB0byBrZXkgZXZlbnRzXG4gKiBAYXV0aG9yIE5ITi4gRkUgZGV2IHRlYW0uPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG5jb25zdCBrZXlDb2RlTWFwID0ge1xuICAzODogJ2Fycm93VXAnLFxuICA0MDogJ2Fycm93RG93bicsXG4gIDMyOiAnc3BhY2UnLFxuICAxMzogJ2VudGVyJyxcbiAgMjc6ICdlc2NhcGUnLFxuICA2MTogJ3RhYidcbn07XG5cbmNvbnN0IGtleU1hcCA9IHtcbiAgQXJyb3dVcDogJ2Fycm93VXAnLFxuICBVcDogJ2Fycm93VXAnLFxuICBBcnJvd0Rvd246ICdhcnJvd0Rvd24nLFxuICBEb3duOiAnYXJyb3dEb3duJyxcbiAgJyAnOiAnc3BhY2UnLFxuICBTcGFjZWJhcjogJ3NwYWNlJyxcbiAgRW50ZXI6ICdlbnRlcicsXG4gIEVzY2FwZTogJ2VzY2FwZScsXG4gIEVzYzogJ2VzY2FwZScsXG4gIFRhYjogJ3RhYidcbn07XG5cbi8qKlxuICogSWRlbnRpZnkgdGhlIGtleSAocG9seWZpbGwgZm9yIElFKVxuICogQHBhcmFtIHtzdHJpbmd9IGV2IC0ga2V5Ym9hcmQgZXZlbnRcbiAqIEByZXR1cm4ge3N0cmluZ30gLSBrZXlcbiAqL1xuZXhwb3J0IGNvbnN0IGlkZW50aWZ5S2V5ID0gZXYgPT4ge1xuICBjb25zdCB7IGtleSwga2V5Q29kZSB9ID0gZXY7XG5cbiAgaWYgKGtleSkge1xuICAgIHJldHVybiBrZXlNYXBba2V5XSB8fCBrZXk7XG4gIH1cblxuICByZXR1cm4ga2V5Q29kZU1hcFtrZXlDb2RlXSB8fCBrZXlDb2RlO1xufTtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBTZWxlY3RCb3hcbiAqIEBhdXRob3IgTkhOIEZFIERldmVsb3BtZW50IExhYiA8ZGxfamF2YXNjcmlwdEBuaG4uY29tPlxuICovXG5cbmltcG9ydCBDdXN0b21FdmVudHMgZnJvbSAndHVpLWNvZGUtc25pcHBldC9jdXN0b21FdmVudHMvY3VzdG9tRXZlbnRzJztcbmltcG9ydCBvbiBmcm9tICd0dWktY29kZS1zbmlwcGV0L2RvbUV2ZW50L29uJztcbmltcG9ydCBvZmYgZnJvbSAndHVpLWNvZGUtc25pcHBldC9kb21FdmVudC9vZmYnO1xuaW1wb3J0IHByZXZlbnREZWZhdWx0IGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tRXZlbnQvcHJldmVudERlZmF1bHQnO1xuaW1wb3J0IGdldFRhcmdldCBmcm9tICd0dWktY29kZS1zbmlwcGV0L2RvbUV2ZW50L2dldFRhcmdldCc7XG5pbXBvcnQgY2xvc2VzdCBmcm9tICd0dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvY2xvc2VzdCc7XG5pbXBvcnQgcmVtb3ZlRWxlbWVudCBmcm9tICd0dWktY29kZS1zbmlwcGV0L2RvbVV0aWwvcmVtb3ZlRWxlbWVudCc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAndHVpLWNvZGUtc25pcHBldC90eXBlL2lzT2JqZWN0JztcbmltcG9ydCBpc0V4aXN0eSBmcm9tICd0dWktY29kZS1zbmlwcGV0L3R5cGUvaXNFeGlzdHknO1xuaW1wb3J0IGlzSFRNTE5vZGUgZnJvbSAndHVpLWNvZGUtc25pcHBldC90eXBlL2lzSFRNTE5vZGUnO1xuaW1wb3J0IHNlbmRIb3N0bmFtZSBmcm9tICd0dWktY29kZS1zbmlwcGV0L3JlcXVlc3Qvc2VuZEhvc3RuYW1lJztcbmltcG9ydCB7IGNyZWF0ZUVsZW1lbnQgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGlkZW50aWZ5S2V5IH0gZnJvbSAnLi9rZXlFdmVudFV0aWxzJztcbmltcG9ydCB7IGNscyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBJbnB1dCBmcm9tICcuL2lucHV0JztcbmltcG9ydCBEcm9wZG93biBmcm9tICcuL2Ryb3Bkb3duJztcbmltcG9ydCBJdGVtR3JvdXAgZnJvbSAnLi9pdGVtR3JvdXAnO1xuaW1wb3J0IEl0ZW0gZnJvbSAnLi9pdGVtJztcbmltcG9ydCBUaGVtZSBmcm9tICcuL3RoZW1lJztcblxuLyoqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8c3RyaW5nfSBjb250YWluZXIgLSBjb250YWluZXIgZWxlbWVudCBvciBzZWxlY3RvclxuICogQG1peGVzIEN1c3RvbUV2ZW50c1xuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqICAgQHBhcmFtIHthcnJheTxpdGVtRGF0YXxpdGVtR3JvdXBEYXRhPn0gb3B0aW9ucy5kYXRhIC0gYXJyYXkgb2Yge0BsaW5rIGl0ZW1EYXRhfSBhbmQge0BsaW5rIGl0ZW1Hcm91cERhdGF9XG4gKiAgIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5wbGFjZWhvbGRlcl0gLSBwbGFjZWhvbGRlciBmb3IgYW4gaW5wdXRcbiAqICAgQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kaXNhYmxlZF0gLSB3aGV0aGVyIGFuIEl0ZW0gc2hvdWxkIGJlIGRpc2FibGVkIG9yIG5vdFxuICogICBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmF1dG9mb2N1c10gLSB3aGV0aGVyIGEgc2VsZWN0Ym94IHNob3VsZCBnZXQgZm9jdXMgd2hlbiB0aGUgc2VsZWN0IGJveCBhcHBlbmRzIHRvIHRoZSBjb250YWluZXJcbiAqICAgQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hdXRvY2xvc2VdIC0gd2hldGhlciBhIHNlbGVjdGJveCBzaG91bGQgY2xvc2UgYWZ0ZXIgc2VsZWN0aW9uXG4gKiAgIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2hvd0ljb25dIC0gd2hldGhlciBhbiBhcnJvdyBpY29uIGluIHRoZSBpbnB1dCBzaG91bGQgYmUgc2hvd25cbiAqICAgQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zLnRoZW1lXSAtIHtAbGluayB0aGVtZUNvbmZpZ30gZm9yIGN1c3RvbSBzdHlsZVxuICogICBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnVzYWdlU3RhdGlzdGljc10gLSB3aGV0aGVyIHNlbmQgaG9zdG5hbWUgdG8gZ29vZ2xlIGFuYWx5dGljcy4gSWYgeW91IGRvbid0IHdhbnQgdG8gc2VuZCB0aGUgaG9zdG5hbWUsIHBsZWFzZSBzZXQgdG8gZmFsc2UuXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IFNlbGVjdEJveCBmcm9tICdAdG9hc3QtdWkvc2VsZWN0LWJveCc7XG4gKiAvLyBvciBjb25zdCBTZWxlY3RCb3ggPSByZXF1aXJlKCdAdG9hc3QtdWkvc2VsZWN0LWJveCcpO1xuICogLy8gb3IgY29uc3QgU2VsZWN0Qm94ID0gdHVpLlNlbGVjdEJveDtcbiAqXG4gKiBjb25zdCBzZWxlY3RCb3ggPSBuZXcgU2VsZWN0Qm94KCcjc2VsZWN0LWJveCcsIHtcbiAqICAgcGxhY2Vob2xkZXI6ICdQbGVhc2Ugc2VsZWN0IGFuIG9wdGlvbi4nLFxuICogICBkYXRhOiBbXG4gKiAgICAge1xuICogICAgICAgbGFiZWw6ICdGcnVpdHMnLFxuICogICAgICAgZGF0YTogWyB7IGxhYmVsOiAnQXBwbGUnLCB2YWx1ZTogJ2FwcGxlJyB9LCB7IGxhYmVsOiAnQmFuYW5hJywgdmFsdWU6ICdiYW5hbmEnIH0gXVxuICogICAgIH0sXG4gKiAgICAgeyBsYWJlbDogJ1RoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuJywgdmFsdWU6ICdub25lJyB9LFxuICogICAgIHtcbiAqICAgICAgIGxhYmVsOiAnQ29sb3JzJyxcbiAqICAgICAgIGRhdGE6IFtcbiAqICAgICAgICAgeyBsYWJlbDogJ1JlZCcsIHZhbHVlOiAncmVkJyB9LFxuICogICAgICAgICB7IGxhYmVsOiAnWWVsbG93JywgdmFsdWU6ICd5ZWxsb3cnIH0sXG4gKiAgICAgICAgIHsgbGFiZWw6ICdHcmVlbicsIHZhbHVlOiAnZ3JlZW4nLCBkaXNhYmxlZDogdHJ1ZSB9LFxuICogICAgICAgICB7IGxhYmVsOiAnQmx1ZScsIHZhbHVlOiAnYmx1ZScsIGRpc2FibGVkOiB0cnVlIH0sXG4gKiAgICAgICAgIHsgbGFiZWw6ICdQdXJwbGUnLCB2YWx1ZTogJ3B1cnBsZScgfVxuICogICAgICAgXVxuICogICAgIH1cbiAqICAgXSxcbiAqICAgYXV0b2ZvY3VzOiB0cnVlLFxuICogICBzaG93SWNvbjogZmFsc2UsXG4gKiAgIHRoZW1lOiB7XG4gKiAgICAgJ2NvbW1vbi5ib3JkZXInOiAnMXB4IHNvbGlkIGJsYWNrJyxcbiAqICAgICAnY29tbW9uLmNvbG9yJzogJ2JsYWNrJyxcbiAqICAgICAnaXRlbS5oaWdobGlnaHRlZC5iYWNrZ3JvdW5kJzogJ3llbGxvdydcbiAqICAgfVxuICogfSk7XG4gKi9cblxuLyoqXG4gKiBTZWxlY3RCb3ggcHJvdmlkZXMgc29tZSBjdXN0b20gZXZlbnRzOiAoe0BsaW5rIFNlbGVjdEJveCNldmVudC1vcGVuIG9wZW59LCB7QGxpbmsgU2VsZWN0Qm94I2V2ZW50LWNsb3NlIGNsb3NlfSwge0BsaW5rIFNlbGVjdEJveCNldmVudC1kaXNhYmxlIGRpc2FibGV9LCB7QGxpbmsgU2VsZWN0Qm94I2V2ZW50LWVuYWJsZSBlbmFibGV9LCB7QGxpbmsgU2VsZWN0Qm94I2V2ZW50LWNoYW5nZSBjaGFuZ2V9KS5cbiAqIFlvdSBjYW4gYmluZCBldmVudCBoYW5kbGVycyBieSB7QGxpbmsgaHR0cHM6Ly9uaG4uZ2l0aHViLmlvL3R1aS5jb2RlLXNuaXBwZXQvbGF0ZXN0L0N1c3RvbUV2ZW50cyNvbiBzZWxlY3RCb3gub24oZXZlbnROYW1lLCBoYW5kbGVyKX0gYW5kIHVuYmluZCBieSB7QGxpbmsgaHR0cHM6Ly9uaG4uZ2l0aHViLmlvL3R1aS5jb2RlLXNuaXBwZXQvbGF0ZXN0L0N1c3RvbUV2ZW50cyNvZmYgc2VsZWN0Qm94Lm9mZihldmVudE5hbWUsIGhhbmRsZXIpfS5cbiAqIFJlZmVyIHRvIHRoZSB7QGxpbmsgaHR0cHM6Ly9uaG4uZ2l0aHViLmlvL3R1aS5jb2RlLXNuaXBwZXQvbGF0ZXN0L0N1c3RvbUV2ZW50cyBDdXN0b21FdmVudHN9IGRvY3VtZW50IGF0IHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbmhuL3R1aS5jb2RlLXNuaXBwZXQgdHVpLWNvZGUtc25pcHBldH0gdG8ga25vdyBob3cgdG8gYmluZCwgYW5kIHVuYmluZCBjdXN0b20gZXZlbnRzLlxuICogVGhlIGV4YW1wbGUgdXNpbmcgY3VzdG9tIGV2ZW50cyBjYW4gYmUgZm91bmQge0BsaW5rIHR1dG9yaWFsLWV4YW1wbGUwMy1jdXN0b20tZXZlbnRzIGhlcmV9LlxuICogQHR5cGVkZWYge2NsYXNzfSBDdXN0b21FdmVudHNcbiAqIEBleGFtcGxlXG4gKiAvLyBiaW5kICdjaGFuZ2UnIGV2ZW50XG4gKiBzZWxlY3RCb3gub24oJ2NoYW5nZScsIGV2ID0+IHtcbiAqICAgY29uc29sZS5sb2coYHNlbGVjdGVkIGl0ZW0gaXMgY2hhbmdlZCBmcm9tICR7ZXYucHJldi5nZXRMYWJlbCgpfSB0byAke2V2LmN1cnIuZ2V0TGFiZWwoKX0uYCk7XG4gKiB9KTtcbiAqXG4gKiAvLyBiaW5kICdkaXNhYmxlJyBhbmQgZW5hYmxlIGV2ZW50XG4gKiBjb25zdCBwcmludCA9IGV2ID0+IHtcbiAqICAgbGV0IHRhcmdldCA9ICcnO1xuICogICBpZiAoZXYudGFyZ2V0IGluc3RhbmNlb2YgU2VsZWN0Qm94KSB7XG4gKiAgICAgdGFyZ2V0ID0gJ1NlbGVjdCBib3gnO1xuICogICB9IGVsc2Uge1xuICogICAgIHRhcmdldCA9IGV2LnRhcmdldC5nZXRMYWJlbCgpO1xuICogICB9XG4gKiAgIGNvbnNvbGUubG9nKGAke3RhcmdldH0gaXMgJHtldi50eXBlfS5gKTtcbiAqIH1cbiAqIHNlbGVjdEJveC5vbih7XG4gKiAgIGRpc2FibGU6IHByaW50LFxuICogICBlbmFibGU6IHByaW50XG4gKiB9KTtcbiAqXG4gKiAvLyB1bmJpbmQgY2hhbmdlIGV2ZW50XG4gKiBzZWxlY3RCb3gub2ZmKCdjaGFuZ2UnKTtcbiAqXG4gKiAvLyB1bmJpbmQgZGlzYWJsZSBldmVudFxuICogc2VsZWN0Qm94Lm9mZihkaXNhYmxlLCBwcmludCk7XG4gKlxuICogLy8gdW5iaW5kIGFsbCBldmVudHNcbiAqIHNlbGVjdEJveC5vZmYoKTtcbiAqL1xuXG4vKipcbiAqIERhdGEgb2YgYW4ge0BsaW5rIEl0ZW0gaXRlbX0uXG4gKiBJdCBpcyB1c2VkIGZvciBjcmVhdGluZyBhIHtAbGluayBTZWxlY3RCb3h9LlxuICogQHR5cGVkZWYge29iamVjdH0gaXRlbURhdGEgLSBkYXRhIGZvciB7QGxpbmsgSXRlbSBpdGVtfVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxhYmVsIC0gbGFiZWwgdG8gYmUgZGlzcGxheWVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWUgLSB2YWx1ZSBvZiBhbiBpdGVtXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkaXNhYmxlZD1mYWxzZV0gLSB3aGV0aGVyIGFuIGl0ZW0gc2hvdWxkIGJlIGRpc2FibGVkIG9yIG5vdFxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2VsZWN0ZWQ9ZmFsc2VdIC0gd2hldGhlciBhbiBpdGVtIHNob3VsZCBiZSBwcmUtc2VsZWN0ZWQgb3Igbm90XG4gKiBAZXhhbXBsZVxuICogY29uc3QgaXRlbURhdGEgPSB7XG4gKiAgIGxhYmVsOiAnZGlzYWJsZWQgaXRlbScsXG4gKiAgIHZhbHVlOiAnMCcsXG4gKiAgIGRpc2FibGVkOiB0cnVlLFxuICogICBzZWxlY3RlZDogZmFsc2VcbiAqIH07XG4gKi9cblxuLyoqXG4gKiBEYXRhIG9mIGFuIHtAbGluayBJdGVtR3JvdXAgaXRlbSBncm91cH0uXG4gKiBJdCBpcyB1c2VkIGZvciBjcmVhdGluZyBhIHtAbGluayBTZWxlY3RCb3h9LlxuICogSXRlbUdyb3VwIHN1cHBvcnRzIG9ubHkgMSBsZXZlbCBjaG9pY2VzLCBzbyBpdCBkb2VzIG5vdCB3b3JrIHRvIGFkZCBpdGVtIGdyb3VwcyBpbiB0aGUgaXRlbSBncm91cC5cbiAqIFRoZSBleGFtcGxlIHVzaW5nIGl0ZW0gZ3JvdXBzIGNhbiBiZSBmb3VuZCB7QGxpbmsgdHV0b3JpYWwtZXhhbXBsZTAxLWJhc2ljIGhlcmV9LlxuICogQHR5cGVkZWYge29iamVjdH0gaXRlbUdyb3VwRGF0YSAtIGRhdGEgZm9yIHtAbGluayBJdGVtR3JvdXAgaXRlbSBncm91cH1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsYWJlbCAtIGxhYmVsIHRvIGJlIGRpc3BsYXllZFxuICogQHByb3BlcnR5IHthcnJheX0gZGF0YSAtIHtAbGluayBpdGVtRGF0YSBkYXRhIGZvciBpdGVtfVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzYWJsZWQ9ZmFsc2VdIC0gd2hldGhlciBhbiBpdGVtIGdyb3VwIHNob3VsZCBiZSBkaXNhYmxlZCBvciBub3RcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBpdGVtR3JvdXBEYXRhID0ge1xuICogICBsYWJlbDogJ2Rpc2FibGVkIGl0ZW1zJyxcbiAqICAgZGF0YTogW1xuICogICAgIHsgbGFiZWw6ICdkaXNhYmxlJywgdmFsdWU6ICdkaXNhYmxlJyB9LFxuICogICAgIHsgbGFiZWw6ICdub25lJywgdmFsdWU6ICcwJyB9XG4gKiAgIF0sXG4gKiAgIGRpc2FibGVkOiB0cnVlXG4gKiB9O1xuICovXG5jbGFzcyBTZWxlY3RCb3gge1xuICBjb25zdHJ1Y3RvcihcbiAgICBjb250YWluZXIsXG4gICAge1xuICAgICAgZGF0YSxcbiAgICAgIHBsYWNlaG9sZGVyID0gJycsXG4gICAgICBkaXNhYmxlZCA9IGZhbHNlLFxuICAgICAgYXV0b2ZvY3VzID0gZmFsc2UsXG4gICAgICBhdXRvY2xvc2UgPSB0cnVlLFxuICAgICAgc2hvd0ljb24gPSB0cnVlLFxuICAgICAgdGhlbWUsXG4gICAgICB1c2FnZVN0YXRpc3RpY3MgPSB0cnVlXG4gICAgfVxuICApIHtcbiAgICAvKipcbiAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB0aGlzLmVsID0gY3JlYXRlRWxlbWVudCgnZGl2JywgJycsIHsgY2xhc3NOYW1lOiBjbHMuU0VMRUNUX0JPWCB9KTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtJbnB1dH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuaW5wdXQgPSBuZXcgSW5wdXQoeyBwbGFjZWhvbGRlciwgZGlzYWJsZWQsIHNob3dJY29uIH0pO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0Ryb3Bkb3dufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5kcm9wZG93biA9IG5ldyBEcm9wZG93bih7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCwgZGF0YSB9KTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5vcGVuZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5kaWFibGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLmF1dG9jbG9zZSA9IGF1dG9jbG9zZTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtUaGVtZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMudGhlbWUgPSBpc09iamVjdCh0aGVtZSkgPyBuZXcgVGhlbWUodGhlbWUsIGNvbnRhaW5lcikgOiBudWxsO1xuXG4gICAgdGhpcy5pbml0aWFsaXplKHsgcGxhY2Vob2xkZXIsIGRpc2FibGVkIH0pO1xuICAgIHRoaXMuYXBwZW5kVG9Db250YWluZXIoY29udGFpbmVyKTtcblxuICAgIGlmIChhdXRvZm9jdXMpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBpZiAodXNhZ2VTdGF0aXN0aWNzKSB7XG4gICAgICBzZW5kSG9zdG5hbWUoJ3NlbGVjdC1ib3gnLCAnVUEtMTI5OTg3NDYyLTEnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kIHRoZSBzZWxlY3QgYm94IGVsZW1lbnQgdG8gdGhlIGNvbnRhaW5lclxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fHN0cmluZ30gY29udGFpbmVyIC0gY29udGFpbmVyIGVsZW1lbnQgb3Igc2VsZWN0b3JcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFwcGVuZFRvQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGNvbnRhaW5lckVsID0gaXNIVE1MTm9kZShjb250YWluZXIpID8gY29udGFpbmVyIDogZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250YWluZXIpO1xuICAgIGNvbnRhaW5lckVsLmFwcGVuZENoaWxkKHRoaXMuZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpbml0aWFsaXplKG9wdGlvbnMpIHtcbiAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLmdldFNlbGVjdGVkSXRlbSgpO1xuICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcbiAgICAgIHRoaXMuaW5wdXQuY2hhbmdlVGV4dChzZWxlY3RlZEl0ZW0pO1xuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMucGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuc2VsZWN0KDApO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmJpbmRFdmVudHMoKTtcblxuICAgIHRoaXMuaW5wdXQuYXBwZW5kVG9Db250YWluZXIodGhpcy5lbCk7XG4gICAgdGhpcy5kcm9wZG93bi5hcHBlbmRUb0NvbnRhaW5lcih0aGlzLmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kIGV2ZW50c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYmluZEV2ZW50cygpIHtcbiAgICBvbihcbiAgICAgIGRvY3VtZW50LFxuICAgICAgJ2NsaWNrJyxcbiAgICAgIGV2ID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2KTtcbiAgICAgICAgaWYgKCFjbG9zZXN0KHRhcmdldCwgYC4ke2Nscy5TRUxFQ1RfQk9YfWApICYmIHRoaXMub3BlbmVkKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdGhpc1xuICAgICk7XG4gICAgb24odGhpcy5lbCwgJ2NsaWNrJywgZXYgPT4gdGhpcy5oYW5kbGVDbGljayhldiwgY2xzKSk7XG4gICAgb24odGhpcy5lbCwgJ21vdXNlb3ZlcicsIGV2ID0+IHRoaXMuaGFuZGxlTW91c2VvdmVyKGV2LCBjbHMpKTtcbiAgICBvbih0aGlzLmVsLCAna2V5ZG93bicsIGV2ID0+IHRoaXMuaGFuZGxlS2V5ZG93bihldiwgY2xzKSk7XG4gIH1cblxuICAvKipcbiAgICogVW5iaW5kIGV2ZW50c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdW5iaW5kRXZlbnRzKCkge1xuICAgIG9mZihkb2N1bWVudCwgJ2NsaWNrJyk7XG4gICAgb2ZmKHRoaXMuZWwsICdjbGljayBtb3VzZW92ZXIga2V5ZG93bicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjbGljayBldmVudHNcbiAgICogQHBhcmFtIHtFdmVudH0gZXYgLSBhbiBldmVudFxuICAgKiBAcGFyYW0ge29iamVjdH0gY2xzIC0gY2xzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBoYW5kbGVDbGljayhldiwgeyBJTlBVVCwgSVRFTSB9KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2KTtcbiAgICBjb25zdCBpdGVtRWwgPSBjbG9zZXN0KHRhcmdldCwgYC4ke0lURU19YCk7XG5cbiAgICBpZiAoaXRlbUVsKSB7XG4gICAgICB0aGlzLnNlbGVjdChpdGVtRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykpO1xuICAgIH0gZWxzZSBpZiAoY2xvc2VzdCh0YXJnZXQsIGAuJHtJTlBVVH1gKSkge1xuICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICB9XG4gICAgdGhpcy5mb2N1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBtb3VzZW92ZXIgZXZlbnRzXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2IC0gYW4gZXZlbnRcbiAgICogQHBhcmFtIHtvYmplY3R9IGNscyAtIGNsc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGFuZGxlTW91c2VvdmVyKGV2LCB7IElURU0gfSkge1xuICAgIGlmICh0aGlzLmNoZWNrTW91c2Vtb3ZlKGV2LmNsaWVudFgsIGV2LmNsaWVudFkpKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXQoZXYpO1xuICAgICAgY29uc3QgaXRlbUVsID0gY2xvc2VzdCh0YXJnZXQsIGAuJHtJVEVNfWApO1xuXG4gICAgICBpZiAoaXRlbUVsKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd24uaGlnaGxpZ2h0KGl0ZW1FbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmFsdWUnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcG9pbnRlciBpcyBtb3ZlZFxuICAgKiBAcGFyYW0ge251bWJlcn0geCAtIG1vdXNlRXZlbnQuY2xpZW50WFxuICAgKiBAcGFyYW0ge251bWJlcn0geSAtIG1vdXNlRXZlbnQuY2xpZW50WVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2hlY2tNb3VzZW1vdmUoeCwgeSkge1xuICAgIGlmICh0aGlzLnByZXZYICE9PSB4IHx8IHRoaXMucHJldlkgIT09IHkpIHtcbiAgICAgIHRoaXMucHJldlggPSB4O1xuICAgICAgdGhpcy5wcmV2WSA9IHk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUga2V5ZG93biBldmVudHNcbiAgICogQHBhcmFtIHtFdmVudH0gZXYgLSBhbiBldmVudFxuICAgKiBAcGFyYW0ge29iamVjdH0gY2xhc3NOYW1lcyAtIGNsc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGFuZGxlS2V5ZG93bihldiwgY2xhc3NOYW1lcykge1xuICAgIGNvbnN0IGtleSA9IGlkZW50aWZ5S2V5KGV2KTtcbiAgICBjb25zdCBjbG9zZUtleXMgPSBbJ3RhYicsICdlc2NhcGUnXTtcbiAgICBjb25zdCBhY3RpdmVLZXlzID0gWydhcnJvd1VwJywgJ2Fycm93RG93bicsICdzcGFjZScsICdlbnRlciddO1xuXG4gICAgaWYgKGNsb3NlS2V5cy5pbmRleE9mKGtleSkgPiAtMSAmJiB0aGlzLm9wZW5lZCkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgaWYgKGtleSA9PT0gJ2VzY2FwZScpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWN0aXZlS2V5cy5pbmRleE9mKGtleSkgPiAtMSkge1xuICAgICAgcHJldmVudERlZmF1bHQoZXYpO1xuICAgICAgdGhpcy5hY3RpdmF0ZUtleWRvd24oZXYsIGtleSwgY2xhc3NOYW1lcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGtleWRvd24gZXZlbnRzXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2IC0gYW4gZXZlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIGtleSBwcmVzc2VkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjbGFzc05hbWVzIC0gY2xzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhY3RpdmF0ZUtleWRvd24oZXYsIGtleSwgeyBJVEVNLCBJTlBVVCB9KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2KTtcbiAgICBjb25zdCBpdGVtRWwgPSBjbG9zZXN0KHRhcmdldCwgYC4ke0lURU19YCk7XG5cbiAgICBpZiAoa2V5ID09PSAnZXNjYXBlJyAmJiB0aGlzLm9wZW5lZCkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH0gZWxzZSBpZiAoaXRlbUVsKSB7XG4gICAgICB0aGlzLnByZXNzS2V5T25JdGVtKGtleSwgaXRlbUVsKTtcbiAgICB9IGVsc2UgaWYgKGNsb3Nlc3QodGFyZ2V0LCBgLiR7SU5QVVR9YCkpIHtcbiAgICAgIHRoaXMucHJlc3NLZXlPbklucHV0KGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBrZXlkb3duIGV2ZW50cyB3aGVuIGl0IG9jY3VycyBvbiB0aGUgSW5wdXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIGtleVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJlc3NLZXlPbklucHV0KGtleSkge1xuICAgIGlmICghdGhpcy5vcGVuZWQpIHtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnYXJyb3dVcCcgfHwga2V5ID09PSAnYXJyb3dEb3duJykge1xuICAgICAgdGhpcy5kcm9wZG93bi5tb3ZlSGlnaGxpZ2h0ZWRJdGVtKGtleSA9PT0gJ2Fycm93VXAnID8gLTEgOiAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGtleWRvd24gZXZlbnRzIHdoZW4gaXQgb2NjdXJzIG9uIHRoZSBJdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBrZXlcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gaXRlbUVsIC0gSXRlbS5lbFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJlc3NLZXlPbkl0ZW0oa2V5LCBpdGVtRWwpIHtcbiAgICBpZiAoa2V5ID09PSAnZW50ZXInIHx8IGtleSA9PT0gJ3NwYWNlJykge1xuICAgICAgdGhpcy5zZWxlY3RCeUtleWRvd24oaXRlbUVsKTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2Fycm93VXAnIHx8IGtleSA9PT0gJ2Fycm93RG93bicpIHtcbiAgICAgIHRoaXMuZHJvcGRvd24ubW92ZUhpZ2hsaWdodGVkSXRlbShrZXkgPT09ICdhcnJvd1VwJyA/IC0xIDogMSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhbiBJdGVtIGJ5IHNwYWNlIG9yIGVudGVyXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGl0ZW1FbCAtIEl0ZW0uZWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbGVjdEJ5S2V5ZG93bihpdGVtRWwpIHtcbiAgICB0aGlzLnNlbGVjdChpdGVtRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykpO1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgICB0aGlzLmZvY3VzKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBhIHNlbGVjdCBib3gsIHtAbGluayBJdGVtR3JvdXAgaXRlbSBncm91cH0gb3Ige0BsaW5rIEl0ZW0gaXRlbX0uXG4gICAqIElmIGl0IHRha2VzIG5vIGFyZ3VtZW50cywgYSBzZWxlY3QgYm94IGlzIGRpc2FibGVkLlxuICAgKiBJZiBpdCB0YWtlcyBzdHJpbmcsIGFuIGl0ZW0gd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYXJndW1lbnQgaXMgZGlzYWJsZWQuXG4gICAqIElmIGl0IHRha2VzIG51bWJlciwgYW4gaXRlbSB3aXRoIHRoZSBzYW1lIGluZGV4IGFzIHRoZSBhcmd1bWVudCBpcyBkaXNhYmxlZC5cbiAgICogSWYgaXQgdGFrZXMgSXRlbSBvciBJdGVtR3JvdXAsIGFuIGFyZ3VtZW50IGl0c2VsZiBpcyBkaXNhYmxlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfEl0ZW18SXRlbUdyb3VwfSB2YWx1ZSAtIGlmIHN0cmluZywgZmluZCBhbiBJdGVtIGJ5IGl0cyB2YWx1ZS4gaWYgbnVtYmVyLCBmaW5kIGFuIEl0ZW0gYnkgaXRzIGluZGV4LlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guZGlzYWJsZSgpOyAvLyBzZWxlY3QgYm94IGlzIGRpc2FibGVkLlxuICAgKiBzZWxlY3RCb3guZGlzYWJsZSgxKTsgLy8gc2Vjb25kIGl0ZW0gaXMgZGlzYWJsZWQuXG4gICAqIHNlbGVjdEJveC5kaXNhYmxlKCd2YWx1ZScpIC8vIGl0ZW0gd2hpY2ggb2YgdmFsdWUgaXMgJ3ZhbHVlJyBpcyBkaXNhYmxlZC5cbiAgICogc2VsZWN0Qm94LmRpc2FibGUoc2VsZWN0Qm94LmdldFNlbGVjdGVkSXRlbSgpKTsgLy8gc2VsZWN0ZWQgaXRlbSBpcyBkaXNhYmxlZC5cbiAgICovXG4gIGRpc2FibGUodmFsdWUpIHtcbiAgICBpZiAoIWlzRXhpc3R5KHZhbHVlKSkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLmlucHV0LmRpc2FibGUoKTtcbiAgICAgIHRoaXMuZHJvcGRvd24uZGlzYWJsZSgpO1xuXG4gICAgICAvKipcbiAgICAgICAqIE9jY3VycyB3aGVuIGEgc2VsZWN0IGJveCwge0BsaW5rIEl0ZW1Hcm91cCBpdGVtIGdyb3VwfSBvciB7QGxpbmsgSXRlbSBpdGVtfSBpcyBkaXNhYmxlZC5cbiAgICAgICAqIEBldmVudCBTZWxlY3RCb3gjZGlzYWJsZVxuICAgICAgICogQHR5cGUge29iamVjdH0gZXZcbiAgICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIC0gZXZlbnQgbmFtZSAoJ2Rpc2FibGUnKVxuICAgICAgICogQHByb3BlcnR5IHtTZWxlY3RCb3h8SXRlbUdyb3VwfEl0ZW19IHRhcmdldCAtIGRpc2FibGVkIHRhcmdldFxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqIHNlbGVjdEJveC5vbignZGlzYWJsZScsIGV2ID0+IHtcbiAgICAgICAqICAgY29uc29sZS5sb2coZXYudGFyZ2V0KTtcbiAgICAgICAqIH0pO1xuICAgICAgICovXG4gICAgICB0aGlzLmZpcmUoJ2Rpc2FibGUnLCB7IHR5cGU6ICdkaXNhYmxlJywgdGFyZ2V0OiB0aGlzIH0pO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJdGVtIHx8IHZhbHVlIGluc3RhbmNlb2YgSXRlbUdyb3VwKSB7XG4gICAgICB2YWx1ZS5kaXNhYmxlKCk7XG4gICAgICB0aGlzLmZpcmUoJ2Rpc2FibGUnLCB7IHR5cGU6ICdkaXNhYmxlJywgdGFyZ2V0OiB2YWx1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGlzYWJsZWRJdGVtID0gdGhpcy5kcm9wZG93bi5nZXRJdGVtKHZhbHVlKTtcbiAgICAgIGlmIChkaXNhYmxlZEl0ZW0pIHtcbiAgICAgICAgZGlzYWJsZWRJdGVtLmRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5maXJlKCdkaXNhYmxlJywgeyB0eXBlOiAnZGlzYWJsZScsIHRhcmdldDogZGlzYWJsZWRJdGVtIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgYSBzZWxlY3QgYm94LCB7QGxpbmsgSXRlbUdyb3VwIGl0ZW0gZ3JvdXB9IG9yIHtAbGluayBJdGVtIGl0ZW19LlxuICAgKiBJZiBpdCB0YWtlcyBubyBhcmd1bWVudHMsIGEgc2VsZWN0IGJveCBpcyBlbmFibGVkLlxuICAgKiBJZiBpdCB0YWtlcyBzdHJpbmcsIGFuIGl0ZW0gd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYXJndW1lbnQgaXMgZW5hYmxlZC5cbiAgICogSWYgaXQgdGFrZXMgbnVtYmVyLCBhbiBpdGVtIHdpdGggdGhlIHNhbWUgaW5kZXggYXMgdGhlIGFyZ3VtZW50IGlzIGVuYWJsZWQuXG4gICAqIElmIGl0IHRha2VzIEl0ZW0gb3IgSXRlbUdyb3VwLCBhbiBhcmd1bWVudCBpdHNlbGYgaXMgZW5hYmxlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfEl0ZW18SXRlbUdyb3VwfSB2YWx1ZSAtIGlmIHN0cmluZywgZmluZCBhbiBJdGVtIGJ5IGl0cyB2YWx1ZS4gaWYgbnVtYmVyLCBmaW5kIGFuIEl0ZW0gYnkgaXRzIGluZGV4LlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guZW5hYmxlKCk7IC8vIHNlbGVjdCBib3ggaXMgZW5hYmxlZC5cbiAgICogc2VsZWN0Qm94LmVuYWJsZSgxKTsgLy8gc2Vjb25kIGl0ZW0gaXMgZW5hYmxlZC5cbiAgICogc2VsZWN0Qm94LmVuYWJsZSgndmFsdWUnKSAvLyBpdGVtIHdoaWNoIG9mIHZhbHVlIGlzICd2YWx1ZScgaXMgZW5hYmxlZC5cbiAgICogc2VsZWN0Qm94LmVuYWJsZShzZWxlY3RCb3guZ2V0U2VsZWN0ZWRJdGVtKCkpOyAvLyBzZWxlY3RlZCBpdGVtIGlzIGVuYWJsZWQuXG4gICAqL1xuICBlbmFibGUodmFsdWUpIHtcbiAgICBpZiAoIWlzRXhpc3R5KHZhbHVlKSkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5pbnB1dC5lbmFibGUoKTtcbiAgICAgIHRoaXMuZHJvcGRvd24uZW5hYmxlKCk7XG5cbiAgICAgIC8qKlxuICAgICAgICogT2NjdXJzIHdoZW4gYSBzZWxlY3QgYm94LCB7QGxpbmsgSXRlbUdyb3VwIGl0ZW0gZ3JvdXB9IG9yIHtAbGluayBJdGVtIGl0ZW19IGlzIGVuYWJsZWQuXG4gICAgICAgKiBAZXZlbnQgU2VsZWN0Qm94I2VuYWJsZVxuICAgICAgICogQHR5cGUge29iamVjdH0gZXZcbiAgICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIC0gZXZlbnQgbmFtZSAoJ2VuYWJsZScpXG4gICAgICAgKiBAcHJvcGVydHkge1NlbGVjdEJveHxJdGVtR3JvdXB8SXRlbX0gdGFyZ2V0IC0gZW5hYmxlIHRhcmdldFxuICAgICAgICogQGV4YW1wbGVcbiAgICAgICAqIHNlbGVjdEJveC5vbignZW5hYmxlJywgZXYgPT4ge1xuICAgICAgICogICBjb25zb2xlLmxvZyhldi50YXJnZXQpO1xuICAgICAgICogfSk7XG4gICAgICAgKi9cbiAgICAgIHRoaXMuZmlyZSgnZW5hYmxlJywgeyB0eXBlOiAnZW5hYmxlJywgdGFyZ2V0OiB0aGlzIH0pO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJdGVtIHx8IHZhbHVlIGluc3RhbmNlb2YgSXRlbUdyb3VwKSB7XG4gICAgICB2YWx1ZS5lbmFibGUoKTtcbiAgICAgIHRoaXMuZmlyZSgnZW5hYmxlJywgeyB0eXBlOiAnZW5hYmxlJywgdGFyZ2V0OiB2YWx1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGlzYWJsZWRJdGVtID0gdGhpcy5kcm9wZG93bi5nZXRJdGVtKHZhbHVlKTtcbiAgICAgIGlmIChkaXNhYmxlZEl0ZW0pIHtcbiAgICAgICAgZGlzYWJsZWRJdGVtLmVuYWJsZSgpO1xuICAgICAgICB0aGlzLmZpcmUoJ2VuYWJsZScsIHsgdHlwZTogJ2VuYWJsZScsIHRhcmdldDogZGlzYWJsZWRJdGVtIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgZHJvcGRvd24gbGlzdC5cbiAgICogQGV4YW1wbGVcbiAgICogc2VsZWN0Qm94Lm9wZW4oKTtcbiAgICovXG4gIG9wZW4oKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLm9wZW5lZCA9IHRydWU7XG4gICAgICB0aGlzLmRyb3Bkb3duLm9wZW4oKTtcbiAgICAgIHRoaXMuaW5wdXQub3BlbigpO1xuXG4gICAgICAvKipcbiAgICAgICAqIE9jY3VycyB3aGVuIGEgc2VsZWN0IGJveCBvcGVucy5cbiAgICAgICAqIEBldmVudCBTZWxlY3RCb3gjb3BlblxuICAgICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBldmVudCBuYW1lICgnb3BlbicpXG4gICAgICAgKiBAZXhhbXBsZVxuICAgICAgICogc2VsZWN0Qm94Lm9uKCdvcGVuJywgZXYgPT4ge1xuICAgICAgICogICBjb25zb2xlLmxvZygnb3BlbicpO1xuICAgICAgICogfSk7XG4gICAgICAgKi9cbiAgICAgIHRoaXMuZmlyZSgnb3BlbicsIHsgdHlwZTogJ29wZW4nIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBhIGRyb3Bkb3duIGxpc3QuXG4gICAqIEBleGFtcGxlXG4gICAqIHNlbGVjdEJveC5jbG9zZSgpO1xuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5vcGVuZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRyb3Bkb3duLmNsb3NlKCk7XG4gICAgdGhpcy5pbnB1dC5jbG9zZSgpO1xuXG4gICAgLyoqXG4gICAgICogT2NjdXJzIHdoZW4gYSBzZWxlY3QgYm94IGNsb3Nlcy5cbiAgICAgKiBAZXZlbnQgU2VsZWN0Qm94I2Nsb3NlXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBldmVudCBuYW1lICgnY2xvc2UnKVxuICAgICAqIEBleGFtcGxlXG4gICAgICogc2VsZWN0Qm94Lm9uKCdjbG9zZScsIGV2ID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdjbG9zZScpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHRoaXMuZmlyZSgnY2xvc2UnLCB7IHR5cGU6ICdjbG9zZScgfSk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIGEgZHJvcGRvd24gbGlzdC5cbiAgICogQGV4YW1wbGVcbiAgICogc2VsZWN0Qm94LnRvZ2dsZSgpO1xuICAgKi9cbiAgdG9nZ2xlKCkge1xuICAgIGlmICh0aGlzLm9wZW5lZCkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9jdXMgdG8gc2VsZWN0IGJveC5cbiAgICogQGV4YW1wbGVcbiAgICogc2VsZWN0Qm94LmZvY3VzKCk7XG4gICAqL1xuICBmb2N1cygpIHtcbiAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IGFuIHtAbGluayBJdGVtIGl0ZW19LlxuICAgKiBJZiBpdCB0YWtlcyBzdHJpbmcsIGFuIGl0ZW0gd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYXJndW1lbnQgaXMgc2VsZWN0ZWQuXG4gICAqIElmIGl0IHRha2VzIG51bWJlciwgYW4gaXRlbSB3aXRoIHRoZSBzYW1lIGluZGV4IGFzIHRoZSBhcmd1bWVudCBpcyBzZWxlY3RlZC5cbiAgICogSWYgaXQgdGFrZXMgSXRlbSwgYW4gYXJndW1lbnQgaXRzZWxmIGlzIHNlbGVjdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8SXRlbX0gdmFsdWUgLSBpZiBzdHJpbmcsIGZpbmQgYW4gSXRlbSBieSBpdHMgdmFsdWUuIGlmIG51bWJlciwgZmluZCBhbiBJdGVtIGJ5IGl0cyBpbmRleC5cbiAgICogQHJldHVybiB7SXRlbX0gLSBzZWxlY3RlZCBJdGVtLlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guc2VsZWN0KDEpOyAvLyBzZWNvbmQgaXRlbSBpcyBzZWxlY3RlZC5cbiAgICogc2VsZWN0Qm94LnNlbGVjdCgndmFsdWUnKSAvLyBpdGVtIHdoaWNoIG9mIHZhbHVlIGlzICd2YWx1ZScgaXMgc2VsZWN0ZWQuXG4gICAqL1xuICBzZWxlY3QodmFsdWUpIHtcbiAgICBsZXQgc2VsZWN0ZWRJdGVtID0gbnVsbDtcbiAgICBjb25zdCBwcmV2U2VsZWN0ZWRJdGVtID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW0oKTtcblxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgc2VsZWN0ZWRJdGVtID0gdGhpcy5kcm9wZG93bi5zZWxlY3QodmFsdWUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgIHRoaXMuaW5wdXQuY2hhbmdlVGV4dChzZWxlY3RlZEl0ZW0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPY2N1cnMgd2hlbiBhbiB7QGxpbmsgSXRlbSBpdGVtfSBpcyBzZWxlY3RlZC5cbiAgICAgICAgICogQGV2ZW50IFNlbGVjdEJveCNzZWxlY3RcbiAgICAgICAgICogQHR5cGUge29iamVjdH0gZXZcbiAgICAgICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBldmVudCBuYW1lICgnc2VsZWN0JylcbiAgICAgICAgICogQHByb3BlcnR5IHtJdGVtfSB0YXJnZXQgLSBzZWxlY3RlZCBpdGVtXG4gICAgICAgICAqIEBpZ25vcmVcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogc2VsZWN0Qm94Lm9uKCdzZWxlY3QnLCBldiA9PiB7XG4gICAgICAgICAqICAgY29uc29sZS5sb2coYCR7ZXYudGFyZ2V0LmdldExhYmVsKCl9IGlzIHNlbGVjdGVkLmApO1xuICAgICAgICAgKiB9KTtcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlyZSgnc2VsZWN0JywgeyB0eXBlOiAnc2VsZWN0JywgdGFyZ2V0OiBzZWxlY3RlZEl0ZW0gfSk7XG5cbiAgICAgICAgaWYgKHByZXZTZWxlY3RlZEl0ZW0gIT09IHNlbGVjdGVkSXRlbSkge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIE9jY3VycyB3aGVuIGEgc2VsZWN0ZWQge0BsaW5rIEl0ZW0gaXRlbX0gaXMgY2hhbmdlZC5cbiAgICAgICAgICAgKiBAZXZlbnQgU2VsZWN0Qm94I2NoYW5nZVxuICAgICAgICAgICAqIEB0eXBlIHtvYmplY3R9IGV2XG4gICAgICAgICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBldmVudCBuYW1lICgnY2hhbmdlJylcbiAgICAgICAgICAgKiBAcHJvcGVydHkge0l0ZW19IHByZXYgLSBwcmV2aW91cyBzZWxlY3RlZCBpdGVtXG4gICAgICAgICAgICogQHByb3BlcnR5IHtJdGVtfSBjdXJyIC0gY3VycmVudCBzZWxlY3RlZCBpdGVtXG4gICAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICAgKiBzZWxlY3RCb3gub24oJ2NoYW5nZScsIGV2ID0+IHtcbiAgICAgICAgICAgKiAgIGNvbnNvbGUubG9nKGBzZWxlY3RlZCBpdGVtIGlzIGNoYW5nZWQgZnJvbSAke2V2LnByZXYuZ2V0TGFiZWwoKX0gdG8gJHtldi5jdXJyLmdldExhYmVsKCl9LmApO1xuICAgICAgICAgICAqIH0pO1xuICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuZmlyZSgnY2hhbmdlJywge1xuICAgICAgICAgICAgdHlwZTogJ2NoYW5nZScsXG4gICAgICAgICAgICBwcmV2OiBwcmV2U2VsZWN0ZWRJdGVtLFxuICAgICAgICAgICAgY3Vycjogc2VsZWN0ZWRJdGVtXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hdXRvY2xvc2UgJiYgdGhpcy5vcGVuZWQpIHtcbiAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRJdGVtO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VsZWN0IGFuIGl0ZW0uXG4gICAqIElmIHNlbGVjdEJveCBoYXMgYSBwbGFjZWhvbGRlciwgdGhlIGlucHV0J3MgdGV4dCBpcyBhIHBsYWNlaG9sZGVyLlxuICAgKiBJZiBubyBwbGFjZWhvbGRlciwgdGhzIGlucHV0IGlzIGVtcHR5LlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guZGVzZWxlY3QoKTtcbiAgICovXG4gIGRlc2VsZWN0KCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5kcm9wZG93bi5kZXNlbGVjdCgpO1xuICAgICAgdGhpcy5pbnB1dC5jaGFuZ2VUZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc2VsZWN0ZWQge0BsaW5rIEl0ZW0gaXRlbX0uXG4gICAqIEByZXR1cm4ge0l0ZW19XG4gICAqL1xuICBnZXRTZWxlY3RlZEl0ZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZHJvcGRvd24uZ2V0U2VsZWN0ZWRJdGVtKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB7QGxpbmsgSXRlbSBpdGVtc30gdGhhdCBwYXNzIHRoZSB0ZXN0IGltcGxlbWVudGVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvbi5cbiAgICogSWYgZmlsdGVyIGZ1bmN0aW9uIGlzIG5vdCBwYXNzZWQsIGl0IHJldHVybnMgYWxsIGl0ZW1zLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGZpbHRlciBpdGVtc1xuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIC0gdGhlIG51bWJlciBvZiBpdGVtcyB0byBmaW5kLiBJZiBpdCBpcyBub3QgcGFzc2VkLCBpdGVyYXRlIGFsbCBpdGVtcy5cbiAgICogQHJldHVybiB7YXJyYXk8SXRlbT59XG4gICAqIEBleGFtcGxlXG4gICAqIHNlbGVjdEJveC5nZXRJdGVtcygpOyAvLyBhbGwgaXRlbXNcbiAgICogc2VsZWN0Qm94LmdldEl0ZW1zKGl0ZW0gPT4ge1xuICAgKiAgcmV0dXJuICFpdGVtLmlzRGlzYWJsZWQoKTtcbiAgICogfSk7IC8vIGFsbCBlbmFibGVkIGl0ZW1zXG4gICAqL1xuICBnZXRJdGVtcyhjYWxsYmFjaywgbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZHJvcGRvd24uZ2V0SXRlbXMoY2FsbGJhY2ssIG51bWJlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIHtAbGluayBJdGVtIGl0ZW19IGJ5IGl0cyBpbmRleCBvciB2YWx1ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB2YWx1ZSAtIGlmIHN0cmluZywgdGhlIEl0ZW0ncyB2YWx1ZS4gaWYgbnVtYmVyLCB0aGUgSXRlbSdzIGluZGV4LlxuICAgKiBAcmV0dXJuIHtJdGVtfVxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guZ2V0SXRlbSgwKTsgLy8gZmlyc3QgaXRlbVxuICAgKiBzZWxlY3RCb3guZ2V0SXRlbSgndmFsdWUnKSAvLyBpdGVtIHdoaWNoIG9mIHZhbHVlIGlzICd2YWx1ZSdcbiAgICovXG4gIGdldEl0ZW0odmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5kcm9wZG93bi5nZXRJdGVtKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHtAbGluayBJdGVtR3JvdXAgaXRlbSBncm91cHN9IHRoYXQgcGFzcyB0aGUgdGVzdCBpbXBsZW1lbnRlZCBieSB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uXG4gICAqIElmIGZpbHRlciBmdW5jdGlvbiBpcyBub3QgcGFzc2VkLCBpdCByZXR1cm5zIGFsbCBpdGVtIGdyb3Vwcy5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgLSBjYWxsYmFjayBmdW5jdGlvbiB0byBmaWx0ZXIgaXRlbSBncm91cHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciAtIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gZmluZC4gSWYgaXQgaXMgbm90IHBhc3NlZCwgaXRlcmF0ZSBhbGwgaXRlbSBncm91cHMuXG4gICAqIEByZXR1cm4ge2FycmF5PEl0ZW1Hcm91cD59XG4gICAqIEBleGFtcGxlXG4gICAqIHNlbGVjdEJveC5nZXRJdGVtR3JvdXBzKCk7IC8vIGFsbCBpdGVtIGdyb3Vwc1xuICAgKiBzZWxlY3RCb3guZ2V0SXRlbUdyb3VwcyhpdGVtR3JvdXAgPT4ge1xuICAgKiAgcmV0dXJuICFpdGVtR3JvdXAuaXNEaXNhYmxlZCgpO1xuICAgKiB9KTsgLy8gYWxsIGVuYWJsZWQgaXRlbSBncm91cHNcbiAgICovXG4gIGdldEl0ZW1Hcm91cHMoY2FsbGJhY2ssIG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmRyb3Bkb3duLmdldEl0ZW1Hcm91cHMoY2FsbGJhY2ssIG51bWJlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIHtAbGluayBJdGVtR3JvdXAgaXRlbSBncm91cH0gYnkgaXRzIGluZGV4LlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBncm91cEluZGV4IG9mIHRoZSBJdGVtR3JvdXBcbiAgICogQHJldHVybiB7SXRlbUdyb3VwfVxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guZ2V0SXRlbUdyb3VwKDApOyAvLyBmaXJzdCBpdGVtIGdyb3VwXG4gICAqL1xuICBnZXRJdGVtR3JvdXAoaW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5kcm9wZG93bi5nZXRJdGVtR3JvdXAoaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3RvcnkgYSBzZWxlY3QgYm94LlxuICAgKiBAZXhhbXBsZVxuICAgKiBzZWxlY3RCb3guZGVzdHJveSgpO1xuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xuXG4gICAgdGhpcy5pbnB1dC5kZXN0cm95KCk7XG4gICAgdGhpcy5kcm9wZG93bi5kZXN0cm95KCk7XG4gICAgaWYgKHRoaXMudGhlbWUpIHtcbiAgICAgIHRoaXMudGhlbWUuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHJlbW92ZUVsZW1lbnQodGhpcy5lbCk7XG4gICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmVsID0gdGhpcy5pbnB1dCA9IHRoaXMuZHJvcGRvd24gPSB0aGlzLnRoZW1lID0gbnVsbDtcbiAgfVxufVxuXG5DdXN0b21FdmVudHMubWl4aW4oU2VsZWN0Qm94KTtcblxuZXhwb3J0IGRlZmF1bHQgU2VsZWN0Qm94O1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFRoZW1lXG4gKiBAYXV0aG9yIE5ITiBGRSBEZXZlbG9wbWVudCBMYWIgPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG5pbXBvcnQgZm9yRWFjaE93blByb3BlcnRpZXMgZnJvbSAndHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL2ZvckVhY2hPd25Qcm9wZXJ0aWVzJztcbmltcG9ydCByZW1vdmVFbGVtZW50IGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvZG9tVXRpbC9yZW1vdmVFbGVtZW50JztcbmltcG9ydCBpc0FycmF5IGZyb20gJ3R1aS1jb2RlLXNuaXBwZXQvdHlwZS9pc0FycmF5JztcbmltcG9ydCBpc0Jvb2xlYW4gZnJvbSAndHVpLWNvZGUtc25pcHBldC90eXBlL2lzQm9vbGVhbic7XG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAndHVpLWNvZGUtc25pcHBldC90eXBlL2lzU3RyaW5nJztcbmltcG9ydCB7IHRyYW5zZm9ybSwgZ2V0U2VsZWN0b3IgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGNscyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBiYXNlVGhlbWUgZnJvbSAnLi90aGVtZUNvbmZpZyc7XG5cbi8qKlxuICogQGNsYXNzXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge29iamVjdH0gY3VzdG9tVGhlbWUgLSB0aGVtZSBvYmplY3QgZm9yIGN1c3RvbSBzdHlsZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IGNvbnRhaW5lciAtIGNvbnRhaW5lciBlbGVtZW50IG9yIHNlbGVjdG9yXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRoZW1lIHtcbiAgY29uc3RydWN0b3IoY3VzdG9tVGhlbWUsIGNvbnRhaW5lcikge1xuICAgIHRoaXMuY29udGFpbmVyU2VsZWN0b3IgPSBnZXRTZWxlY3Rvcihjb250YWluZXIpO1xuICAgIHRoaXMuY3NzU3RyaW5nID0gdGhpcy5idWlsZEFsbCh0cmFuc2Zvcm0oY3VzdG9tVGhlbWUpKTtcbiAgICB0aGlzLnN0eWxlRWwgPSB0aGlzLmNyZWF0ZVN0eWxlRWxlbWVudCgpO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0eWxlIGVsZW1lbnRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVTdHlsZUVsZW1lbnQoKSB7XG4gICAgY29uc3Qgc3R5bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGVFbC50eXBlID0gJ3RleHQvY3NzJztcblxuICAgIGlmIChzdHlsZUVsLnN0eWxlU2hlZXQpIHtcbiAgICAgIHN0eWxlRWwuc3R5bGVTaGVldC5jc3NUZXh0ID0gdGhpcy5jc3NTdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlRWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5jc3NTdHJpbmcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3R5bGVFbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBjc3Mgc3RyaW5ncyBmb3IgSW5wdXQsIERyb3Bkb3duLCBJdGVtR3JvdXAsIGFuZCBJdGVtLlxuICAgKiBAcGFyYW0ge29iamVjdH0gdGhlbWUgLSB0aGVtZSBvYmplY3RcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYnVpbGRBbGwodGhlbWUpIHtcbiAgICBjb25zdCBleGNsdWRlID0geyBib3JkZXI6ICcnLCBiYWNrZ3JvdW5kOiAnJyB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYnVpbGRJbnB1dCh7IC4uLnRoZW1lLmNvbW1vbiwgLi4udGhlbWUuaW5wdXQgfSkgK1xuICAgICAgdGhpcy5idWlsZERyb3Bkb3duKHsgLi4udGhlbWUuY29tbW9uLCBib3JkZXJUb3A6ICcwJywgLi4udGhlbWUuZHJvcGRvd24sIGhlaWdodDogJycgfSkgK1xuICAgICAgdGhpcy5idWlsZEl0ZW1Hcm91cChcbiAgICAgICAgdGhlbWUuaXRlbUdyb3VwXG4gICAgICAgICAgPyB7IC4uLnRoZW1lLmNvbW1vbiwgLi4uZXhjbHVkZSwgLi4udGhlbWUuaXRlbUdyb3VwLmxhYmVsIH1cbiAgICAgICAgICA6IHsgLi4udGhlbWUuY29tbW9uLCAuLi5leGNsdWRlIH1cbiAgICAgICkgK1xuICAgICAgdGhpcy5idWlsZEl0ZW0oXG4gICAgICAgIHRoZW1lLml0ZW1Hcm91cFxuICAgICAgICAgID8geyAuLi50aGVtZS5jb21tb24sIC4uLmV4Y2x1ZGUsIC4uLnRoZW1lLml0ZW0sIGluSXRlbUdyb3VwOiB0aGVtZS5pdGVtR3JvdXAuaXRlbXMgfVxuICAgICAgICAgIDogeyAuLi50aGVtZS5jb21tb24sIC4uLmV4Y2x1ZGUsIC4uLnRoZW1lLml0ZW0gfVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgY3NzIHN0cmluZ3MgZm9yIElucHV0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSB0aGVtZSAtIHRoZW1lIG9iamVjdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBidWlsZElucHV0KHRoZW1lKSB7XG4gICAgdGhlbWUucGxhY2Vob2xkZXIgPSB7fTtcbiAgICBpZiAodGhlbWUuaGVpZ2h0KSB7XG4gICAgICB0aGVtZS5wbGFjZWhvbGRlci5saW5lSGVpZ2h0ID0gdGhlbWUuaGVpZ2h0O1xuICAgIH1cbiAgICBpZiAoaXNCb29sZWFuKHRoZW1lLnNob3dJY29uKSAmJiAhdGhlbWUuc2hvd0ljb24pIHtcbiAgICAgIHRoZW1lLmljb24gPSB7IGRpc3BsYXk6ICdub25lJyB9O1xuICAgICAgdGhlbWUucGxhY2Vob2xkZXIud2lkdGggPSAnMTAwJSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYnVpbGRDc3NTdHJpbmcoY2xzLklOUFVULCB0aGVtZSkgK1xuICAgICAgdGhpcy5idWlsZENzc1N0cmluZyhbY2xzLklOUFVULCBjbHMuT1BFTl0sIHRoZW1lLm9wZW4pICtcbiAgICAgIHRoaXMuYnVpbGRDc3NTdHJpbmcoW2Nscy5JTlBVVCwgY2xzLkRJU0FCTEVEXSwgdGhlbWUuZGlzYWJsZWQpICtcbiAgICAgIHRoaXMuYnVpbGRDc3NTdHJpbmcoY2xzLlBMQUNFSE9MREVSLCB0aGVtZS5wbGFjZWhvbGRlcikgK1xuICAgICAgdGhpcy5idWlsZENzc1N0cmluZyhjbHMuSUNPTiwgdGhlbWUuaWNvbilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGNzcyBzdHJpbmdzIGZvciBEcm9wZG93blxuICAgKiBAcGFyYW0ge29iamVjdH0gdGhlbWUgLSB0aGVtZSBvYmplY3RcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYnVpbGREcm9wZG93bih0aGVtZSkge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQ3NzU3RyaW5nKGNscy5EUk9QRE9XTiwgdGhlbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGNzcyBzdHJpbmdzIGZvciBJdGVtR3JvdXBcbiAgICogQHBhcmFtIHtvYmplY3R9IHRoZW1lIC0gdGhlbWUgb2JqZWN0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGJ1aWxkSXRlbUdyb3VwKHRoZW1lKSB7XG4gICAgaWYgKHRoZW1lLmhlaWdodCkge1xuICAgICAgdGhlbWUubGluZUhlaWdodCA9IHRoZW1lLmhlaWdodDtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5idWlsZENzc1N0cmluZyhjbHMuSVRFTV9HUk9VUF9MQUJFTCwgdGhlbWUpICtcbiAgICAgIHRoaXMuYnVpbGRDc3NTdHJpbmcoW2Nscy5JVEVNX0dST1VQX0xBQkVMLCBjbHMuRElTQUJMRURdLCB0aGVtZS5kaXNhYmxlZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGNzcyBzdHJpbmdzIGZvciBJdGVtXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB0aGVtZSAtIHRoZW1lIG9iamVjdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBidWlsZEl0ZW0odGhlbWUpIHtcbiAgICBpZiAodGhlbWUuaGVpZ2h0KSB7XG4gICAgICB0aGVtZS5saW5lSGVpZ2h0ID0gdGhlbWUuaGVpZ2h0O1xuICAgIH1cbiAgICBpZiAodGhlbWUuc2VsZWN0ZWQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB0cmFuc2Zvcm0oYmFzZVRoZW1lKTtcblxuICAgICAgdGhlbWUuc2VsZWN0ZWQgPSB7IC4uLmJhc2UuaXRlbS5zZWxlY3RlZCwgLi4udGhlbWUuc2VsZWN0ZWQgfTtcbiAgICAgIHRoZW1lLmRpc2FibGVkID0geyAuLi5iYXNlLml0ZW0uZGlzYWJsZWQsIC4uLnRoZW1lLmRpc2FibGVkIH07XG4gICAgICB0aGVtZS5oaWdobGlnaHRlZCA9IHsgLi4uYmFzZS5pdGVtLmhpZ2hsaWdodGVkLCAuLi50aGVtZS5oaWdobGlnaHRlZCB9O1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmJ1aWxkQ3NzU3RyaW5nKGNscy5JVEVNLCB0aGVtZSkgK1xuICAgICAgdGhpcy5idWlsZENzc1N0cmluZyhbY2xzLklURU0sIGNscy5TRUxFQ1RFRF0sIHRoZW1lLnNlbGVjdGVkKSArXG4gICAgICB0aGlzLmJ1aWxkQ3NzU3RyaW5nKFtjbHMuSVRFTSwgY2xzLkRJU0FCTEVEXSwgdGhlbWUuZGlzYWJsZWQpICtcbiAgICAgIHRoaXMuYnVpbGRDc3NTdHJpbmcoW2Nscy5JVEVNLCBjbHMuSElHSExJR0hUXSwgdGhlbWUuaGlnaGxpZ2h0ZWQpICtcbiAgICAgIHRoaXMuYnVpbGRDc3NTdHJpbmcoYCR7Y2xzLklURU1fR1JPVVB9Pi4ke2Nscy5JVEVNfWAsIHRoZW1lLmluSXRlbUdyb3VwKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgY3NzIHN0cmluZ3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAtIGNsYXNzTmFtZVxuICAgKiBAcGFyYW0ge29iamVjdH0gdGhlbWUgLSB0aGVtZSBvYmplY3RcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYnVpbGRDc3NTdHJpbmcoY2xhc3NOYW1lLCB0aGVtZSkge1xuICAgIGlmIChpc0FycmF5KGNsYXNzTmFtZSkpIHtcbiAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5qb2luKCcuJyk7XG4gICAgfVxuICAgIGNsYXNzTmFtZSA9IGAuJHtjbGFzc05hbWV9YDtcblxuICAgIGxldCBjc3NTdHJpbmcgPSAnJztcbiAgICBmb3JFYWNoT3duUHJvcGVydGllcyh0aGVtZSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUpIHtcbiAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNzc1N0cmluZyArPSBgJHtrZXl9OiR7dmFsdWV9O2A7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY3NzU3RyaW5nID8gYCR7dGhpcy5jb250YWluZXJTZWxlY3Rvcn0gJHtjbGFzc05hbWV9eyR7Y3NzU3RyaW5nfX1gIDogJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzdG9yeSBhIHRoZW1lXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHJlbW92ZUVsZW1lbnQodGhpcy5zdHlsZUVsKTtcbiAgICB0aGlzLnN0eWxlRWwgPSBudWxsO1xuICB9XG59XG4iLCIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgVGhlbWUgY29uZmlndXJhdGlvblxuICogQGF1dGhvciBOSE4gRkUgRGV2ZWxvcG1lbnQgTGFiIDxkbF9qYXZhc2NyaXB0QG5obi5jb20+XG4gKi9cblxuLyoqXG4gKiBUaGVtZSBjb25maWd1cmF0aW9uLlxuICogXCJjb21tb25cIiBwcmVmaXggaXMgZm9yIHRoZSBlbnRpcmUgc2VsZWN0IGJveC4gSXRzIHByb3BlcnRpZXMgYXJlIG92ZXJyaWRlbiBieSBcImlucHV0XCIsIFwiZHJvcGRvd25cIiwgXCJpdGVtR3JvdXBcIiwgYW5kIFwiaXRlbVwiLlxuICogVGhlIGV4YW1wbGUgdXNpbmcgdGhlbWUgY2FuIGJlIGZvdW5kIHtAbGluayB0dXRvcmlhbC1leGFtcGxlMDItdGhlbWUgaGVyZX0uXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSB0aGVtZUNvbmZpZ1xuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRoZW1lQ29uZmlnID0ge1xuICogICAnY29tbW9uLmJvcmRlcic6ICcxcHggc29saWQgI2RkZCcsIC8vIGJvcmRlciBmb3IgaW5wdXQgYW5kIGRyb3Bkb3duIChub3QgaXRlbUdyb3VwIGFuZCBpdGVtKVxuICogICAnY29tbW9uLmJhY2tncm91bmQnOiAnI2ZmZicsXG4gKiAgICdjb21tb24uY29sb3InOiAnIzMzMycsXG4gKiAgICdjb21tb24ud2lkdGgnOiAnMTAwJScsXG4gKiAgICdjb21tb24uaGVpZ2h0JzogJzI5cHgnLCAvLyBoZWlnaHQgZm9yIGl0ZW0gYW5kIGl0ZW1Hcm91cCBsYWJlbCAobm90IGVudGlyZSBzZWxlY3QgYm94KVxuICpcbiAqICAgJ2NvbW1vbi5kaXNhYmxlZC5iYWNrZ3JvdW5kJzogJyNmOWY5ZjknLFxuICogICAnY29tbW9uLmRpc2FibGVkLmNvbG9yJzogJ2M4YzhjOCcsXG4gKlxuICogICAvLyBJbnB1dFxuICogICAnaW5wdXQuYm9yZGVyJzogJzFweCBzb2xpZCAjZGRkJyxcbiAqICAgJ2lucHV0LmJvcmRlckJvdHRvbSc6ICcnLFxuICogICAnaW5wdXQuYmFja2dyb3VuZCc6ICdpbmhlcml0JyxcbiAqICAgJ2lucHV0LmNvbG9yJzogJyMzMzMnLFxuICogICAnaW5wdXQud2lkdGgnOiAnMTAwJScsXG4gKiAgICdpbnB1dC5oZWlnaHQnOiAnMjlweCcsXG4gKlxuICogICAvLyBJbnB1dCB3aGVuIGRyb3Bkb3duIGlzIG9wZW5cbiAqICAgJ2lucHV0Lm9wZW4uYm9yZGVyJzogJzFweCBzb2xpZCAjYWFhJyxcbiAqICAgJ2lucHV0Lm9wZW4uYmFja2dyb3VuZCc6ICdpbmhlcml0JyxcbiAqICAgJ2lucHV0Lm9wZW4uY29sb3InOiAnIzMzMycsXG4gKlxuICogICAvLyBJbnB1dCB3aGVuIHNlbGVjdGJveCBpcyBkaXNhYmxlZFxuICogICAnaW5wdXQuZGlzYWJsZWQuYm9yZGVyJzogJzFweCBzb2xpZCAjYWFhJyxcbiAqICAgJ2lucHV0LmRpc2FibGVkLmJhY2tncm91bmQnOiAnI2Y5ZjlmOScsXG4gKiAgICdpbnB1dC5kaXNhYmxlZC5jb2xvcic6ICcjYzhjOGM4JyxcbiAqXG4gKiAgIC8vIERyb3Bkb3duXG4gKiAgICdkcm9wZG93bi5ib3JkZXInOiAnMXB4IHNvbGlkICNhYWEnLFxuICogICAnZHJvcGRvd24uYm9yZGVyVG9wJzogJzAnLFxuICogICAnZHJvcGRvd24uYmFja2dyb3VuZCc6ICdpbmhlcml0JyxcbiAqICAgJ2Ryb3Bkb3duLndpZHRoJzogJzEwMCUnLFxuICogICAnZHJvcGRvd24ubWF4SGVpZ2h0JzogJycsXG4gKlxuICogICAvLyBJdGVtR3JvdXAncyBpdGVtc1xuICogICAvLyBpZiB5b3Ugd2FudCB0byBzZXQgdGhlIHNhbWUgcGFkZGluZyB2YWx1ZSBhcyB0aGUgaXRlbUdyb3VwLmxhYmVsLCBzZXQgdG8gJzhweCcuXG4gKiAgICdpdGVtR3JvdXAuaXRlbXMucGFkZGluZ0xlZnQnOiAnMjBweCcsXG4gKlxuICogICAvLyBJdGVtR3JvdXAncyBsYWJlbFxuICogICAnaXRlbUdyb3VwLmxhYmVsLmJvcmRlcic6ICcwJyxcbiAqICAgJ2l0ZW1Hcm91cC5sYWJlbC5iYWNrZ3JvdW5kJzogJ2luaGVyaXQnLFxuICogICAnaXRlbUdyb3VwLmxhYmVsLmNvbG9yJzogJyMzMzMnLFxuICogICAnaXRlbUdyb3VwLmxhYmVsLmZvbnRXZWlnaHQnOiAnYm9sZCcsXG4gKiAgICdpdGVtR3JvdXAubGFiZWwuaGVpZ2h0JzogJzI5cHgnLFxuICpcbiAqICAgLy8gZGlzYWJsZWQgSXRlbUdyb3VwJ3MgbGFiZWxcbiAqICAgJ2l0ZW1Hcm91cC5sYWJlbC5kaXNhYmxlZC5ib3JkZXInOiAnMCcsXG4gKiAgICdpdGVtR3JvdXAubGFiZWwuZGlzYWJsZWQuYmFja2dyb3VuZCc6ICdpbmhlcml0JyxcbiAqICAgJ2l0ZW1Hcm91cC5sYWJlbC5kaXNhYmxlZC5jb2xvcic6ICcjMzMzJyxcbiAqXG4gKiAgIC8vIEl0ZW1cbiAqICAgJ2l0ZW0uYm9yZGVyJzogJzAnLFxuICogICAnaXRlbS5iYWNrZ3JvdW5kJzogJ2luaGVyaXQnLFxuICogICAnaXRlbS5jb2xvcic6ICcjMzMzJyxcbiAqICAgJ2l0ZW0uaGVpZ2h0JzogJzI5cHgnLFxuICpcbiAqICAgLy8gc2VsZWN0ZWQgSXRlbVxuICogICAnaXRlbS5zZWxlY3RlZC5ib3JkZXInOiAnMCcsXG4gKiAgICdpdGVtLnNlbGVjdGVkLmJhY2tncm91bmQnOiAnI2Y0ZjRmNCcsXG4gKiAgICdpdGVtLnNlbGVjdGVkLmNvbG9yJzogJyMzMzMnLFxuICpcbiAqICAgLy8gZGlzYWJsZWQgSXRlbVxuICogICAnaXRlbS5kaXNhYmxlZC5ib3JkZXInOiAnMCcsXG4gKiAgICdpdGVtLmRpc2FibGVkLmJhY2tncm91bmQnOiAnI2Y5ZjlmOScsXG4gKiAgICdpdGVtLmRpc2FibGVkLmNvbG9yJzogJyNjOGM4YzgnLFxuICpcbiAqICAgLy8gaGlnaGxpZ2h0ZWQgSXRlbVxuICogICAnaXRlbS5oaWdobGlnaHRlZC5ib3JkZXInOiAnMCcsXG4gKiAgICdpdGVtLmhpZ2hsaWdodGVkLmJhY2tncm91bmQnOiAnI2U1ZjZmZicsXG4gKiAgICdpdGVtLmhpZ2hsaWdodGVkLmNvbG9yJzogJyMzMzMnXG4gKiB9O1xuICovXG5leHBvcnQgZGVmYXVsdCB7XG4gICdjb21tb24uYm9yZGVyJzogJzFweCBzb2xpZCAjZGRkJywgLy8gYm9yZGVyIGZvciBpbnB1dCBhbmQgZHJvcGRvd24gKG5vdCBpdGVtR3JvdXAgYW5kIGl0ZW0pXG4gICdjb21tb24uYmFja2dyb3VuZCc6ICcjZmZmJyxcbiAgJ2NvbW1vbi5jb2xvcic6ICcjMzMzJyxcbiAgJ2NvbW1vbi53aWR0aCc6ICcxMDAlJyxcbiAgJ2NvbW1vbi5oZWlnaHQnOiAnMjlweCcsIC8vIGhlaWdodCBmb3IgaXRlbSBhbmQgaXRlbUdyb3VwIGxhYmVsIChub3QgZW50aXJlIHNlbGVjdCBib3gpXG5cbiAgJ2NvbW1vbi5kaXNhYmxlZC5iYWNrZ3JvdW5kJzogJyNmOWY5ZjknLFxuICAnY29tbW9uLmRpc2FibGVkLmNvbG9yJzogJ2M4YzhjOCcsXG5cbiAgLy8gSW5wdXRcbiAgJ2lucHV0LmJvcmRlcic6ICcxcHggc29saWQgI2RkZCcsXG4gICdpbnB1dC5ib3JkZXJCb3R0b20nOiAnJyxcbiAgJ2lucHV0LmJhY2tncm91bmQnOiAnaW5oZXJpdCcsXG4gICdpbnB1dC5jb2xvcic6ICcjMzMzJyxcbiAgJ2lucHV0LndpZHRoJzogJzEwMCUnLFxuICAnaW5wdXQuaGVpZ2h0JzogJzI5cHgnLFxuXG4gIC8vIElucHV0IHdoZW4gZHJvcGRvd24gaXMgb3BlblxuICAnaW5wdXQub3Blbi5ib3JkZXInOiAnMXB4IHNvbGlkICNhYWEnLFxuICAnaW5wdXQub3Blbi5iYWNrZ3JvdW5kJzogJ2luaGVyaXQnLFxuICAnaW5wdXQub3Blbi5jb2xvcic6ICcjMzMzJyxcblxuICAvLyBJbnB1dCB3aGVuIHNlbGVjdGJveCBpcyBkaXNhYmxlZFxuICAnaW5wdXQuZGlzYWJsZWQuYm9yZGVyJzogJzFweCBzb2xpZCAjYWFhJyxcbiAgJ2lucHV0LmRpc2FibGVkLmJhY2tncm91bmQnOiAnI2Y5ZjlmOScsXG4gICdpbnB1dC5kaXNhYmxlZC5jb2xvcic6ICcjYzhjOGM4JyxcblxuICAvLyBEcm9wZG93blxuICAnZHJvcGRvd24uYm9yZGVyJzogJzFweCBzb2xpZCAjYWFhJyxcbiAgJ2Ryb3Bkb3duLmJvcmRlclRvcCc6ICcwJyxcbiAgJ2Ryb3Bkb3duLmJhY2tncm91bmQnOiAnaW5oZXJpdCcsXG4gICdkcm9wZG93bi53aWR0aCc6ICcxMDAlJyxcbiAgJ2Ryb3Bkb3duLm1heEhlaWdodCc6ICcnLFxuXG4gIC8vIEl0ZW1Hcm91cCdzIGl0ZW1zXG4gICdpdGVtR3JvdXAuaXRlbXMucGFkZGluZ0xlZnQnOiAnMjBweCcsXG5cbiAgLy8gSXRlbUdyb3VwJ3MgbGFiZWxcbiAgJ2l0ZW1Hcm91cC5sYWJlbC5ib3JkZXInOiAnMCcsXG4gICdpdGVtR3JvdXAubGFiZWwuYmFja2dyb3VuZCc6ICdpbmhlcml0JyxcbiAgJ2l0ZW1Hcm91cC5sYWJlbC5jb2xvcic6ICcjMzMzJyxcbiAgJ2l0ZW1Hcm91cC5sYWJlbC5mb250V2VpZ2h0JzogJ2JvbGQnLFxuICAnaXRlbUdyb3VwLmxhYmVsLmhlaWdodCc6ICcyOXB4JyxcblxuICAvLyBkaXNhYmxlZCBJdGVtR3JvdXAncyBsYWJlbFxuICAnaXRlbUdyb3VwLmxhYmVsLmRpc2FibGVkLmJvcmRlcic6ICcwJyxcbiAgJ2l0ZW1Hcm91cC5sYWJlbC5kaXNhYmxlZC5iYWNrZ3JvdW5kJzogJ2luaGVyaXQnLFxuICAnaXRlbUdyb3VwLmxhYmVsLmRpc2FibGVkLmNvbG9yJzogJyMzMzMnLFxuXG4gIC8vIEl0ZW1cbiAgJ2l0ZW0uYm9yZGVyJzogJzAnLFxuICAnaXRlbS5iYWNrZ3JvdW5kJzogJ2luaGVyaXQnLFxuICAnaXRlbS5jb2xvcic6ICcjMzMzJyxcbiAgJ2l0ZW0uaGVpZ2h0JzogJzI5cHgnLFxuXG4gIC8vIHNlbGVjdGVkIEl0ZW1cbiAgJ2l0ZW0uc2VsZWN0ZWQuYm9yZGVyJzogJzAnLFxuICAnaXRlbS5zZWxlY3RlZC5iYWNrZ3JvdW5kJzogJyNmNGY0ZjQnLFxuICAnaXRlbS5zZWxlY3RlZC5jb2xvcic6ICcjMzMzJyxcblxuICAvLyBkaXNhYmxlZCBJdGVtXG4gICdpdGVtLmRpc2FibGVkLmJvcmRlcic6ICcwJyxcbiAgJ2l0ZW0uZGlzYWJsZWQuYmFja2dyb3VuZCc6ICcjZjlmOWY5JyxcbiAgJ2l0ZW0uZGlzYWJsZWQuY29sb3InOiAnI2M4YzhjOCcsXG5cbiAgLy8gaGlnaGxpZ2h0ZWQgSXRlbVxuICAnaXRlbS5oaWdobGlnaHRlZC5ib3JkZXInOiAnMCcsXG4gICdpdGVtLmhpZ2hsaWdodGVkLmJhY2tncm91bmQnOiAnI2U1ZjZmZicsXG4gICdpdGVtLmhpZ2hsaWdodGVkLmNvbG9yJzogJyMzMzMnXG59O1xuIiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFV0aWxpdHkgZnVuY3Rpb25zXG4gKiBAYXV0aG9yIE5ITi4gRkUgZGV2IHRlYW0uPGRsX2phdmFzY3JpcHRAbmhuLmNvbT5cbiAqL1xuXG5pbXBvcnQgZm9yRWFjaE93blByb3BlcnRpZXMgZnJvbSAndHVpLWNvZGUtc25pcHBldC9jb2xsZWN0aW9uL2ZvckVhY2hPd25Qcm9wZXJ0aWVzJztcbmltcG9ydCBpc1N0cmluZyBmcm9tICd0dWktY29kZS1zbmlwcGV0L3R5cGUvaXNTdHJpbmcnO1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBvYmplY3QgdXNpbmcgZG90IG5vdGF0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqIC0gb2JqZWN0IHRvIHRyYW5zZm9ybVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtID0gb2JqID0+IHtcbiAgY29uc3QgcmVzdWx0ID0ge307XG5cbiAgZm9yRWFjaE93blByb3BlcnRpZXMob2JqLCAodmFsdWUsIHByb3ApID0+IHtcbiAgICBjb25zdCBrZXlzID0gcHJvcC5zcGxpdCgnLicpO1xuICAgIGxldCBjdXJyID0gcmVzdWx0O1xuXG4gICAga2V5cy5mb3JFYWNoKChrZXksIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPT09IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgICBjdXJyW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIWN1cnJba2V5XSkge1xuICAgICAgICBjdXJyW2tleV0gPSB7fTtcbiAgICAgIH1cbiAgICAgIGN1cnIgPSBjdXJyW2tleV07XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIEhUTUwgZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgLSB0YWcgbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBjb250ZW50IGluIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIG90aGVyIHByb3BlcnRpZXMgZm9yIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXIgLSBwYXJlbnQgZWxlbWVudCBmb3IgdGhlIGVsZW1lbnRcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRWxlbWVudCA9ICh0YWdOYW1lLCBjb250ZW50LCBvcHRpb25zLCBjb250YWluZXIpID0+IHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuXG4gIGlmIChjb250ZW50KSB7XG4gICAgZWwudGV4dENvbnRlbnQgPSBjb250ZW50O1xuICB9XG5cbiAgZm9yRWFjaE93blByb3BlcnRpZXMob3B0aW9ucywgKHZhbHVlLCBrZXkpID0+IHtcbiAgICBpZiAoa2V5LmluZGV4T2YoJ2RhdGEtJykgPiAtMSkge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9KTtcblxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsKTtcbiAgfVxuXG4gIHJldHVybiBlbDtcbn07XG5cbi8qKlxuICogR2V0IHNlbGVjdG9ycyBmb3IgYW4gZWxlbWVudFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgLSBlbGVtZW50XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZWxlY3RvciA9IGVsID0+IHtcbiAgaWYgKGlzU3RyaW5nKGVsKSkge1xuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIGlmIChlbC5pZCkge1xuICAgIHJldHVybiBgIyR7ZWwuaWR9YDtcbiAgfVxuXG4gIGNvbnN0IGNsYXNzTmFtZSA9IGAuJHtlbC5jbGFzc05hbWUucmVwbGFjZSgvXFxzKy9nLCAnLicpfWA7XG4gIGlmIChjbGFzc05hbWUpIHtcbiAgICBjb25zdCBlbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoY2xhc3NOYW1lKTtcblxuICAgIGlmIChlbGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBjbGFzc05hbWU7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGFnTmFtZSA9IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gYCR7dGFnTmFtZX0ke2NsYXNzTmFtZX1gO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/dist/toastui-select-box.min.css b/dist/toastui-select-box.min.css index 87caf3a..f68d206 100644 --- a/dist/toastui-select-box.min.css +++ b/dist/toastui-select-box.min.css @@ -1,6 +1,6 @@ /*! * TOAST UI Select Box - * @version 1.0.1 | Fri May 21 2021 + * @version 1.1.0 | Sat Jun 19 2021 * @author NHN FE Development Lab * @license MIT - */.tui-select-box{position:relative}.tui-select-box-dropdown,.tui-select-box-input,.tui-select-box-item,.tui-select-box-item-group-label{box-sizing:border-box}.tui-select-box-input{border:1px solid #ddd}.tui-select-box-dropdown,.tui-select-box-input.tui-select-box-open{border:1px solid #aaa}.tui-select-box-dropdown,.tui-select-box-input{background:#fff}.tui-select-box-input,.tui-select-box-item,.tui-select-box-item-group-label{padding:0 8px;height:29px;font-size:13px;color:#333;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.tui-select-box-item,.tui-select-box-item-group-label,.tui-select-box-placeholder{line-height:29px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tui-select-box-icon,.tui-select-box-placeholder{height:100%}.tui-select-box-placeholder{display:inline-block;margin:0;width:80%;width:calc(100% - 12px);vertical-align:sub}.tui-select-box-icon{display:block;float:right;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAECAYAAACHtL/sAAAAAXNSR0IArs4c6QAABBFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj4KICAgICAgICAgPHhtcE1NOkRlcml2ZWRGcm9tIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgPHN0UmVmOmluc3RhbmNlSUQ+eG1wLmlpZDozOTU0MDZFM0JEQjExMUU2OEQ1MkUyN0M0NDdEMkIxMTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDozOTU0MDZFNEJEQjExMUU2OEQ1MkUyN0M0NDdEMkIxMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgPC94bXBNTTpEZXJpdmVkRnJvbT4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDozOTU0MDZFNkJEQjExMUU2OEQ1MkUyN0M0NDdEMkIxMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkluc3RhbmNlSUQ+eG1wLmlpZDozOTU0MDZFNUJEQjExMUU2OEQ1MkUyN0M0NDdEMkIxMTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K/ZqkVgAAAERJREFUGBljNDY2/s+AA5w9e5YRXQqqXgAo9xEkB1aAzRA8mmFmgg1hgvIEYKIgmgjNIGUfQATciUBX8IMEidQM0gsGAPabHJ7Zbgx5AAAAAElFTkSuQmCC) 0 no-repeat;width:7px;overflow:hidden;text-indent:100%}.tui-select-box-open>.tui-select-box-icon{background-position:100%}.tui-select-box-dropdown,.tui-select-box-item-group{margin:0;padding:0;list-style-type:none}.tui-select-box-dropdown{position:absolute;border-top:none;overflow:auto;z-index:1;width:100%;overflow-x:hidden}.tui-select-box-item-group-label{display:block;font-weight:700;cursor:default}.tui-select-box-item-group>.tui-select-box-item{padding-left:20px}.tui-select-box-selected{background:#f4f4f4}.tui-select-box-highlight{background:#e5f6ff;outline:none}.tui-select-box-disabled{background:#f9f9f9;color:#c8c8c8;cursor:default}.tui-select-box-hidden{display:none} \ No newline at end of file + */.tui-select-box{position:relative}.tui-select-box-dropdown,.tui-select-box-input,.tui-select-box-item,.tui-select-box-item-group-label{box-sizing:border-box}.tui-select-box-input{border:1px solid #ddd}.tui-select-box-input:focus{outline:5px auto Highlight;outline:5px auto -webkit-focus-ring-color}.tui-select-box-dropdown,.tui-select-box-input.tui-select-box-open{border:1px solid #aaa}.tui-select-box-dropdown,.tui-select-box-input{background:#fff}.tui-select-box-input,.tui-select-box-item,.tui-select-box-item-group-label{padding:0 8px;height:29px;font-size:13px;color:#333;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.tui-select-box-item,.tui-select-box-item-group-label,.tui-select-box-placeholder{line-height:29px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tui-select-box-icon,.tui-select-box-placeholder{height:100%}.tui-select-box-placeholder{display:inline-block;margin:0;width:80%;width:calc(100% - 12px);vertical-align:sub}.tui-select-box-icon{display:block;float:right;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAECAYAAACHtL/sAAAAAXNSR0IArs4c6QAABBFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj4KICAgICAgICAgPHhtcE1NOkRlcml2ZWRGcm9tIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgPHN0UmVmOmluc3RhbmNlSUQ+eG1wLmlpZDozOTU0MDZFM0JEQjExMUU2OEQ1MkUyN0M0NDdEMkIxMTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDozOTU0MDZFNEJEQjExMUU2OEQ1MkUyN0M0NDdEMkIxMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgPC94bXBNTTpEZXJpdmVkRnJvbT4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDozOTU0MDZFNkJEQjExMUU2OEQ1MkUyN0M0NDdEMkIxMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOkluc3RhbmNlSUQ+eG1wLmlpZDozOTU0MDZFNUJEQjExMUU2OEQ1MkUyN0M0NDdEMkIxMTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K/ZqkVgAAAERJREFUGBljNDY2/s+AA5w9e5YRXQqqXgAo9xEkB1aAzRA8mmFmgg1hgvIEYKIgmgjNIGUfQATciUBX8IMEidQM0gsGAPabHJ7Zbgx5AAAAAElFTkSuQmCC) 0 no-repeat;width:7px;overflow:hidden;text-indent:100%}.tui-select-box-open>.tui-select-box-icon{background-position:100%}.tui-select-box-dropdown,.tui-select-box-item-group{margin:0;padding:0;list-style-type:none}.tui-select-box-dropdown{position:absolute;border-top:none;overflow:auto;z-index:1;width:100%;overflow-x:hidden}.tui-select-box-item-group-label{display:block;font-weight:700;cursor:default}.tui-select-box-item-group>.tui-select-box-item{padding-left:20px}.tui-select-box-selected{background:#f4f4f4}.tui-select-box-highlight{background:#e5f6ff;outline:none}.tui-select-box-disabled{background:#f9f9f9;color:#c8c8c8;cursor:default}.tui-select-box-hidden{display:none} \ No newline at end of file diff --git a/dist/toastui-select-box.min.js b/dist/toastui-select-box.min.js index 1e37481..1a97619 100644 --- a/dist/toastui-select-box.min.js +++ b/dist/toastui-select-box.min.js @@ -1,7 +1,7 @@ /*! * TOAST UI Select Box - * @version 1.0.1 | Fri May 21 2021 + * @version 1.1.0 | Sat Jun 19 2021 * @author NHN FE Development Lab * @license MIT */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.SelectBox=e():(t.tui=t.tui||{},t.tui.SelectBox=e())}(window,(function(){return function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="dist",n(n.s=19)}([function(t,e,n){"use strict";t.exports=function(t){t&&t.parentNode&&t.parentNode.removeChild(t)}},function(t,e,n){var i,o,r;o=[e,n(5),n(3)],void 0===(r="function"==typeof(i=function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{default:t}}t.__esModule=!0,t.getSelector=t.createElement=t.transform=void 0,e=i(e),n=i(n),t.transform=function(t){var n={};return(0,e.default)(t,(function(t,e){var i=e.split("."),o=n;i.forEach((function(e,n){n===i.length-1?o[e]=t:o[e]||(o[e]={}),o=o[e]}))})),n},t.createElement=function(t,n,i,o){var r=document.createElement(t);return n&&(r.innerText=n),(0,e.default)(i,(function(t,e){e.indexOf("data-")>-1?r.setAttribute(e,t):r[e]=t})),o&&o.appendChild(r),r},t.getSelector=function(t){if((0,n.default)(t))return t;if(t.id)return"#"+t.id;var e="."+t.className.replace(/\s+/g,".");return e&&1===document.querySelectorAll(e).length?e:""+t.tagName.toLowerCase()+e}})?i.apply(e,o):i)||(t.exports=r)},function(t,e,n){var i,o,r;o=[e,n(5)],void 0===(r="function"==typeof(i=function(t,e){"use strict";var n;t.__esModule=!0,t.cls=void 0,e=(n=e)&&n.__esModule?n:{default:n};var i={SELECT_BOX:"",ITEM:"item",ITEM_GROUP:"item-group",ITEM_GROUP_LABEL:"item-group-label",DROPDOWN:"dropdown",INPUT:"input",PLACEHOLDER:"placeholder",ICON:"icon",OPEN:"open",HIDDEN:"hidden",DISABLED:"disabled",SELECTED:"selected",HIGHLIGHT:"highlight"},o=((0,e.default)(i,(function(t,e){i[e]=t?"tui-select-box-"+t:"tui-select-box"})),i);t.cls=o})?i.apply(e,o):i)||(t.exports=r)},function(t,e,n){"use strict";t.exports=function(t){return"string"==typeof t||t instanceof String}},function(t,e,n){"use strict";t.exports=function(t){return t instanceof Array}},function(t,e,n){"use strict";t.exports=function(t,e,n){var i;for(i in n=n||null,t)if(t.hasOwnProperty(i)&&!1===e.call(n,t[i],i,t))break}},function(t,e,n){"use strict";t.exports=function(t){return void 0===t}},function(t,e,n){"use strict";var i=n(4),o=n(8),r=n(5);t.exports=function(t,e,n){i(t)?o(t,e,n):r(t,e,n)}},function(t,e,n){"use strict";t.exports=function(t,e,n){var i=0,o=t.length;for(n=n||null;i=0&&o-1&&this.opened?(this.close(),"escape"===n&&this.input.focus()):["arrowUp","arrowDown","space","enter"].indexOf(n)>-1&&((0,o.default)(t),this.activateKeydown(t,n,e))},e.activateKeydown=function(t,e,n){var i=n.ITEM,o=n.INPUT,l=(0,r.default)(t),a=(0,s.default)(l,"."+i);"escape"===e&&this.opened?(this.close(),this.input.focus()):a?this.pressKeyOnItem(e,a):(0,s.default)(l,"."+o)&&this.pressKeyOnInput(e)},e.pressKeyOnInput=function(t){this.opened?"arrowUp"!==t&&"arrowDown"!==t||this.dropdown.moveHighlightedItem("arrowUp"===t?-1:1):this.open()},e.pressKeyOnItem=function(t,e){"enter"===t||"space"===t?this.selectByKeydown(e):"arrowUp"!==t&&"arrowDown"!==t||this.dropdown.moveHighlightedItem("arrowUp"===t?-1:1)},e.selectByKeydown=function(t){this.select(t.getAttribute("data-value")),this.close(),this.input.focus()},e.disable=function(t){if((0,u.default)(t))if(t instanceof g.default||t instanceof v.default)t.disable(),this.fire("disable",{type:"disable",target:t});else{var e=this.dropdown.getItem(t);e&&(e.disable(),this.fire("disable",{type:"disable",target:e}))}else this.disabled=!0,this.input.disable(),this.dropdown.disable(),this.fire("disable",{type:"disable",target:this})},e.enable=function(t){if((0,u.default)(t))if(t instanceof g.default||t instanceof v.default)t.enable(),this.fire("enable",{type:"enable",target:t});else{var e=this.dropdown.getItem(t);e&&(e.enable(),this.fire("enable",{type:"enable",target:e}))}else this.disabled=!1,this.input.enable(),this.dropdown.enable(),this.fire("enable",{type:"enable",target:this})},e.open=function(){this.disabled||(this.opened=!0,this.dropdown.open(),this.input.open(),this.fire("open",{type:"open"}))},e.close=function(){this.opened=!1,this.dropdown.close(),this.input.close(),this.fire("close",{type:"close"})},e.toggle=function(){this.opened?this.close():this.open()},e.select=function(t){var e=null,n=this.getSelectedItem();return this.disabled||(e=this.dropdown.select(t))&&(this.input.changeText(e),this.fire("select",{type:"select",target:e}),n!==e&&this.fire("change",{type:"change",prev:n,curr:e}),this.autoclose&&this.opened&&this.close()),e},e.deselect=function(){this.disabled||(this.dropdown.deselect(),this.input.changeText())},e.getSelectedItem=function(){return this.dropdown.getSelectedItem()},e.getItems=function(t,e){return this.dropdown.getItems(t,e)},e.getItem=function(t){return this.dropdown.getItem(t)},e.getItemGroups=function(t,e){return this.dropdown.getItemGroups(t,e)},e.getItemGroup=function(t){return this.dropdown.getItemGroup(t)},e.destroy=function(){this.unbindEvents(),this.input.destroy(),this.dropdown.destroy(),this.theme&&this.theme.destroy(),(0,l.default)(this.el),this.container=this.el=this.input=this.dropdown=this.theme=null},t}();e.default.mixin(I);var x=I;t.default=x})?i.apply(e,o):i)||(t.exports=r)},function(t,e,n){"use strict";var i=n(22),o=n(11),r=n(3),s=n(14),l=n(4),a=n(24),u=n(7),c=/\s+/g;function d(){this.events=null,this.contexts=null}d.mixin=function(t){i(t.prototype,d.prototype)},d.prototype._getHandlerItem=function(t,e){var n={handler:t};return e&&(n.context=e),n},d.prototype._safeEvent=function(t){var e,n=this.events;return n||(n=this.events={}),t&&((e=n[t])||(e=[],n[t]=e),n=e),n},d.prototype._safeContext=function(){var t=this.contexts;return t||(t=this.contexts=[]),t},d.prototype._indexOfContext=function(t){for(var e=this._safeContext(),n=0;e[n];){if(t===e[n][0])return n;n+=1}return-1},d.prototype._memorizeContext=function(t){var e,n;o(t)&&(e=this._safeContext(),(n=this._indexOfContext(t))>-1?e[n][1]+=1:e.push([t,1]))},d.prototype._forgetContext=function(t){var e,n;o(t)&&(e=this._safeContext(),(n=this._indexOfContext(t))>-1&&(e[n][1]-=1,e[n][1]<=0&&e.splice(n,1)))},d.prototype._bindEvent=function(t,e,n){var i=this._safeEvent(t);this._memorizeContext(n),i.push(this._getHandlerItem(e,n))},d.prototype.on=function(t,e,n){var i=this;r(t)?(t=t.split(c),u(t,(function(t){i._bindEvent(t,e,n)}))):s(t)&&(n=e,u(t,(function(t,e){i.on(e,t,n)})))},d.prototype.once=function(t,e,n){var i=this;if(s(t))return n=e,void u(t,(function(t,e){i.once(e,t,n)}));this.on(t,(function o(){e.apply(n,arguments),i.off(t,o,n)}),n)},d.prototype._spliceMatches=function(t,e){var n,i=0;if(l(t))for(n=t.length;i0},d.prototype.getListenerLength=function(t){return this._safeEvent(t).length},t.exports=d},function(t,e,n){"use strict";t.exports=function(t,e){var n,i,o,r,s=Object.prototype.hasOwnProperty;for(o=1,r=arguments.length;o-1};t.exports=function(t,e){return s.call(t,e)}},function(t,e,n){"use strict";var i=n(8);t.exports=function(t){var e;try{e=Array.prototype.slice.call(t)}catch(n){e=[],i(t,(function(t){e.push(t)}))}return e}},function(t,e,n){"use strict";t.exports=function(t){return"object"==typeof HTMLElement?t&&(t instanceof HTMLElement||!!t.nodeType):!(!t||!t.nodeType)}},function(t,e,n){"use strict";var i=n(6),o=n(34);t.exports=function(t,e){var n=location.hostname,r="TOAST UI "+t+" for "+n+": Statistics",s=window.localStorage.getItem(r);(i(window.tui)||!1!==window.tui.usageStatistics)&&(s&&!function(t){return(new Date).getTime()-t>6048e5}(s)||(window.localStorage.setItem(r,(new Date).getTime()),setTimeout((function(){"interactive"!==document.readyState&&"complete"!==document.readyState||o("https://www.google-analytics.com/collect",{v:1,t:"event",tid:e,cid:n,dp:n,dh:t,el:t,ec:"use"})}),1e3)))}},function(t,e,n){"use strict";var i=n(5);t.exports=function(t,e){var n=document.createElement("img"),o="";return i(e,(function(t,e){o+="&"+e+"="+t})),o=o.substring(1),n.src=t+"?"+o,n.style.display="none",document.body.appendChild(n),document.body.removeChild(n),n}},function(t,e,n){var i,o,r;o=[e],void 0===(r="function"==typeof(i=function(t){"use strict";t.__esModule=!0,t.identifyKey=void 0;var e={38:"arrowUp",40:"arrowDown",32:"space",13:"enter",27:"escape",61:"tab"},n={ArrowUp:"arrowUp",Up:"arrowUp",ArrowDown:"arrowDown",Down:"arrowDown"," ":"space",Spacebar:"space",Enter:"enter",Escape:"escape",Esc:"escape",Tab:"tab"};t.identifyKey=function(t){var i=t.key,o=t.keyCode;return i?n[i]||i:e[o]||o}})?i.apply(e,o):i)||(t.exports=r)},function(t,e,n){var i,o,r;o=[e,n(9),n(10),n(0),n(1),n(2)],void 0===(r="function"==typeof(i=function(t,e,n,i,o,r){"use strict";function s(t){return t&&t.__esModule?t:{default:t}}t.__esModule=!0,t.default=void 0,e=s(e),n=s(n),i=s(i);var l=function(){function t(t){var e=t.placeholder,n=t.disabled,i=t.showIcon;this.placeholderText=e,this.el=(0,o.createElement)("div","",{className:r.cls.INPUT,tabIndex:0}),this.placeholderEl=(0,o.createElement)("p",this.placeholderText,{className:r.cls.PLACEHOLDER},this.el),this.initialize(n,i)}var s=t.prototype;return s.initialize=function(t,e){e?(0,o.createElement)("span","select",{className:r.cls.ICON},this.el):this.placeholderEl.width="100%",t&&this.disable()},s.disable=function(){(0,e.default)(this.el,r.cls.DISABLED)},s.enable=function(){(0,n.default)(this.el,r.cls.DISABLED)},s.open=function(){(0,e.default)(this.el,r.cls.OPEN)},s.close=function(){(0,n.default)(this.el,r.cls.OPEN)},s.focus=function(){this.el.focus()},s.changeText=function(t){this.placeholderEl.innerText=t?t.getLabel():this.placeholderText},s.appendToContainer=function(t){t.appendChild(this.el)},s.destroy=function(){(0,i.default)(this.el),this.el=this.placeholderEl=null},t}();t.default=l})?i.apply(e,o):i)||(t.exports=r)},function(t,e,n){var i,o,r;o=[e,n(8),n(11),n(38),n(9),n(10),n(0),n(1),n(2),n(18),n(13)],void 0===(r="function"==typeof(i=function(t,e,n,i,o,r,s,l,a,u,c){"use strict";function d(t){return t&&t.__esModule?t:{default:t}}function f(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,i)}return n}function h(t){for(var e=1;e1?i-1:0),r=1;r-1)for(o=this.getItemIndex(o,i,t);o."+l.cls.ITEM,t.inItemGroup)},u.buildCssString=function(t,n){(0,i.default)(t)&&(t=t.join(".")),t="."+t;var o="";return(0,e.default)(n,(function(t,e){(0,r.default)(t)&&t&&(e=e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),o+=e+":"+t+";")})),o?this.containerSelector+" "+t+"{"+o+"}":""},u.destroy=function(){(0,n.default)(this.styleEl),this.styleEl=null},t}();t.default=h})?i.apply(e,o):i)||(t.exports=r)},function(t,e,n){"use strict";t.exports=function(t){return"boolean"==typeof t||t instanceof Boolean}},function(t,e,n){var i,o,r;o=[e],void 0===(r="function"==typeof(i=function(t){"use strict";t.__esModule=!0,t.default=void 0,t.default={"common.border":"1px solid #ddd","common.background":"#fff","common.color":"#333","common.width":"100%","common.height":"29px","common.disabled.background":"#f9f9f9","common.disabled.color":"c8c8c8","input.border":"1px solid #ddd","input.borderBottom":"","input.background":"inherit","input.color":"#333","input.width":"100%","input.height":"29px","input.open.border":"1px solid #aaa","input.open.background":"inherit","input.open.color":"#333","input.disabled.border":"1px solid #aaa","input.disabled.background":"#f9f9f9","input.disabled.color":"#c8c8c8","dropdown.border":"1px solid #aaa","dropdown.borderTop":"0","dropdown.background":"inherit","dropdown.width":"100%","dropdown.maxHeight":"","itemGroup.items.paddingLeft":"20px","itemGroup.label.border":"0","itemGroup.label.background":"inherit","itemGroup.label.color":"#333","itemGroup.label.fontWeight":"bold","itemGroup.label.height":"29px","itemGroup.label.disabled.border":"0","itemGroup.label.disabled.background":"inherit","itemGroup.label.disabled.color":"#333","item.border":"0","item.background":"inherit","item.color":"#333","item.height":"29px","item.selected.border":"0","item.selected.background":"#f4f4f4","item.selected.color":"#333","item.disabled.border":"0","item.disabled.background":"#f9f9f9","item.disabled.color":"#c8c8c8","item.highlighted.border":"0","item.highlighted.background":"#e5f6ff","item.highlighted.color":"#333"}})?i.apply(e,o):i)||(t.exports=r)},function(t,e,n){}]).default})); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SelectBox=t():(e.tui=e.tui||{},e.tui.SelectBox=t())}(window,(function(){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="dist",n(n.s=19)}([function(e,t,n){"use strict";e.exports=function(e){e&&e.parentNode&&e.parentNode.removeChild(e)}},function(e,t,n){var i,o,s;"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,o=[t,n(5),n(3)],void 0===(s="function"==typeof(i=function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}e.__esModule=!0,e.getSelector=e.createElement=e.transform=void 0,t=i(t),n=i(n),e.transform=function(e){var n={};return(0,t.default)(e,(function(e,t){var i=t.split("."),o=n;i.forEach((function(t,n){n===i.length-1?o[t]=e:o[t]||(o[t]={}),o=o[t]}))})),n},e.createElement=function(e,n,i,o){var s=document.createElement(e);return n&&(s.textContent=n),(0,t.default)(i,(function(e,t){t.indexOf("data-")>-1?s.setAttribute(t,e):s[t]=e})),o&&o.appendChild(s),s},e.getSelector=function(e){if((0,n.default)(e))return e;if(e.id)return"#"+e.id;var t="."+e.className.replace(/\s+/g,".");return t&&1===document.querySelectorAll(t).length?t:""+e.tagName.toLowerCase()+t}})?i.apply(t,o):i)||(e.exports=s)},function(e,t,n){var i,o,s;"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,o=[t,n(5)],void 0===(s="function"==typeof(i=function(e,t){"use strict";var n;e.__esModule=!0,e.cls=void 0,t=(n=t)&&n.__esModule?n:{default:n};var i={SELECT_BOX:"",ITEM:"item",ITEM_GROUP:"item-group",ITEM_GROUP_LABEL:"item-group-label",DROPDOWN:"dropdown",INPUT:"input",PLACEHOLDER:"placeholder",ICON:"icon",OPEN:"open",HIDDEN:"hidden",DISABLED:"disabled",SELECTED:"selected",HIGHLIGHT:"highlight"},o=((0,t.default)(i,(function(e,t){i[t]=e?"tui-select-box-"+e:"tui-select-box"})),i);e.cls=o})?i.apply(t,o):i)||(e.exports=s)},function(e,t,n){"use strict";e.exports=function(e){return"string"==typeof e||e instanceof String}},function(e,t,n){"use strict";e.exports=function(e){return e instanceof Array}},function(e,t,n){"use strict";e.exports=function(e,t,n){var i;for(i in n=n||null,e)if(e.hasOwnProperty(i)&&!1===t.call(n,e[i],i,e))break}},function(e,t,n){"use strict";e.exports=function(e){return void 0===e}},function(e,t,n){"use strict";var i=n(4),o=n(8),s=n(5);e.exports=function(e,t,n){i(e)?o(e,t,n):s(e,t,n)}},function(e,t,n){"use strict";e.exports=function(e,t,n){var i=0,o=e.length;for(n=n||null;i=0&&o-1&&this.opened?(this.close(),"escape"===n&&this.focus()):["arrowUp","arrowDown","space","enter"].indexOf(n)>-1&&((0,o.default)(e),this.activateKeydown(e,n,t))},t.activateKeydown=function(e,t,n){var i=n.ITEM,o=n.INPUT,l=(0,s.default)(e),a=(0,r.default)(l,"."+i);"escape"===t&&this.opened?(this.close(),this.focus()):a?this.pressKeyOnItem(t,a):(0,r.default)(l,"."+o)&&this.pressKeyOnInput(t)},t.pressKeyOnInput=function(e){this.opened?"arrowUp"!==e&&"arrowDown"!==e||this.dropdown.moveHighlightedItem("arrowUp"===e?-1:1):this.open()},t.pressKeyOnItem=function(e,t){"enter"===e||"space"===e?this.selectByKeydown(t):"arrowUp"!==e&&"arrowDown"!==e||this.dropdown.moveHighlightedItem("arrowUp"===e?-1:1)},t.selectByKeydown=function(e){this.select(e.getAttribute("data-value")),this.close(),this.focus()},t.disable=function(e){if((0,u.default)(e))if(e instanceof v.default||e instanceof g.default)e.disable(),this.fire("disable",{type:"disable",target:e});else{var t=this.dropdown.getItem(e);t&&(t.disable(),this.fire("disable",{type:"disable",target:t}))}else this.disabled=!0,this.input.disable(),this.dropdown.disable(),this.fire("disable",{type:"disable",target:this})},t.enable=function(e){if((0,u.default)(e))if(e instanceof v.default||e instanceof g.default)e.enable(),this.fire("enable",{type:"enable",target:e});else{var t=this.dropdown.getItem(e);t&&(t.enable(),this.fire("enable",{type:"enable",target:t}))}else this.disabled=!1,this.input.enable(),this.dropdown.enable(),this.fire("enable",{type:"enable",target:this})},t.open=function(){this.disabled||(this.opened=!0,this.dropdown.open(),this.input.open(),this.fire("open",{type:"open"}))},t.close=function(){this.opened=!1,this.dropdown.close(),this.input.close(),this.fire("close",{type:"close"})},t.toggle=function(){this.opened?this.close():this.open()},t.focus=function(){this.input.focus()},t.select=function(e){var t=null,n=this.getSelectedItem();return this.disabled||(t=this.dropdown.select(e))&&(this.input.changeText(t),this.fire("select",{type:"select",target:t}),n!==t&&this.fire("change",{type:"change",prev:n,curr:t}),this.autoclose&&this.opened&&this.close()),t},t.deselect=function(){this.disabled||(this.dropdown.deselect(),this.input.changeText())},t.getSelectedItem=function(){return this.dropdown.getSelectedItem()},t.getItems=function(e,t){return this.dropdown.getItems(e,t)},t.getItem=function(e){return this.dropdown.getItem(e)},t.getItemGroups=function(e,t){return this.dropdown.getItemGroups(e,t)},t.getItemGroup=function(e){return this.dropdown.getItemGroup(e)},t.destroy=function(){this.unbindEvents(),this.input.destroy(),this.dropdown.destroy(),this.theme&&this.theme.destroy(),(0,l.default)(this.el),this.container=this.el=this.input=this.dropdown=this.theme=null},e}();t.default.mixin(I);var x=I;e.default=x})?i.apply(t,o):i)||(e.exports=s)},function(e,t,n){"use strict";var i=n(22),o=n(11),s=n(3),r=n(14),l=n(4),a=n(24),u=n(7),c=/\s+/g;function d(){this.events=null,this.contexts=null}d.mixin=function(e){i(e.prototype,d.prototype)},d.prototype._getHandlerItem=function(e,t){var n={handler:e};return t&&(n.context=t),n},d.prototype._safeEvent=function(e){var t,n=this.events;return n||(n=this.events={}),e&&((t=n[e])||(t=[],n[e]=t),n=t),n},d.prototype._safeContext=function(){var e=this.contexts;return e||(e=this.contexts=[]),e},d.prototype._indexOfContext=function(e){for(var t=this._safeContext(),n=0;t[n];){if(e===t[n][0])return n;n+=1}return-1},d.prototype._memorizeContext=function(e){var t,n;o(e)&&(t=this._safeContext(),(n=this._indexOfContext(e))>-1?t[n][1]+=1:t.push([e,1]))},d.prototype._forgetContext=function(e){var t,n;o(e)&&(t=this._safeContext(),(n=this._indexOfContext(e))>-1&&(t[n][1]-=1,t[n][1]<=0&&t.splice(n,1)))},d.prototype._bindEvent=function(e,t,n){var i=this._safeEvent(e);this._memorizeContext(n),i.push(this._getHandlerItem(t,n))},d.prototype.on=function(e,t,n){var i=this;s(e)?(e=e.split(c),u(e,(function(e){i._bindEvent(e,t,n)}))):r(e)&&(n=t,u(e,(function(e,t){i.on(t,e,n)})))},d.prototype.once=function(e,t,n){var i=this;if(r(e))return n=t,void u(e,(function(e,t){i.once(t,e,n)}));this.on(e,(function o(){t.apply(n,arguments),i.off(e,o,n)}),n)},d.prototype._spliceMatches=function(e,t){var n,i=0;if(l(e))for(n=e.length;i0},d.prototype.getListenerLength=function(e){return this._safeEvent(e).length},e.exports=d},function(e,t,n){"use strict";e.exports=function(e,t){var n,i,o,s,r=Object.prototype.hasOwnProperty;for(o=1,s=arguments.length;o-1};e.exports=function(e,t){return r.call(e,t)}},function(e,t,n){"use strict";var i=n(8);e.exports=function(e){var t;try{t=Array.prototype.slice.call(e)}catch(n){t=[],i(e,(function(e){t.push(e)}))}return t}},function(e,t,n){"use strict";e.exports=function(e){return"object"==typeof HTMLElement?e&&(e instanceof HTMLElement||!!e.nodeType):!(!e||!e.nodeType)}},function(e,t,n){"use strict";var i=n(6),o=n(34);e.exports=function(e,t){var n=location.hostname,s="TOAST UI "+e+" for "+n+": Statistics",r=window.localStorage.getItem(s);(i(window.tui)||!1!==window.tui.usageStatistics)&&(r&&!function(e){return(new Date).getTime()-e>6048e5}(r)||(window.localStorage.setItem(s,(new Date).getTime()),setTimeout((function(){"interactive"!==document.readyState&&"complete"!==document.readyState||o("https://www.google-analytics.com/collect",{v:1,t:"event",tid:t,cid:n,dp:n,dh:e,el:e,ec:"use"})}),1e3)))}},function(e,t,n){"use strict";var i=n(5);e.exports=function(e,t){var n=document.createElement("img"),o="";return i(t,(function(e,t){o+="&"+t+"="+e})),o=o.substring(1),n.src=e+"?"+o,n.style.display="none",document.body.appendChild(n),document.body.removeChild(n),n}},function(e,t,n){var i,o,s;"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,o=[t],void 0===(s="function"==typeof(i=function(e){"use strict";e.__esModule=!0,e.identifyKey=void 0;var t={38:"arrowUp",40:"arrowDown",32:"space",13:"enter",27:"escape",61:"tab"},n={ArrowUp:"arrowUp",Up:"arrowUp",ArrowDown:"arrowDown",Down:"arrowDown"," ":"space",Spacebar:"space",Enter:"enter",Escape:"escape",Esc:"escape",Tab:"tab"};e.identifyKey=function(e){var i=e.key,o=e.keyCode;return i?n[i]||i:t[o]||o}})?i.apply(t,o):i)||(e.exports=s)},function(e,t,n){var i,o,s;"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,o=[t,n(9),n(10),n(0),n(1),n(2)],void 0===(s="function"==typeof(i=function(e,t,n,i,o,s){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}e.__esModule=!0,e.default=void 0,t=r(t),n=r(n),i=r(i);var l=function(){function e(e){var t=e.placeholder,n=e.disabled,i=e.showIcon;this.placeholderText=t,this.el=(0,o.createElement)("div","",{className:s.cls.INPUT,tabIndex:0}),this.placeholderEl=(0,o.createElement)("p",this.placeholderText,{className:s.cls.PLACEHOLDER},this.el),this.initialize(n,i)}var r=e.prototype;return r.initialize=function(e,t){t?(0,o.createElement)("span","select",{className:s.cls.ICON},this.el):this.placeholderEl.width="100%",e&&this.disable()},r.disable=function(){(0,t.default)(this.el,s.cls.DISABLED)},r.enable=function(){(0,n.default)(this.el,s.cls.DISABLED)},r.open=function(){(0,t.default)(this.el,s.cls.OPEN)},r.close=function(){(0,n.default)(this.el,s.cls.OPEN)},r.focus=function(){this.el.focus()},r.changeText=function(e){this.placeholderEl.textContent=e?e.getLabel():this.placeholderText},r.appendToContainer=function(e){e.appendChild(this.el)},r.destroy=function(){(0,i.default)(this.el),this.el=this.placeholderEl=null},e}();e.default=l})?i.apply(t,o):i)||(e.exports=s)},function(e,t,n){var i,o,s;"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,o=[t,n(8),n(11),n(38),n(9),n(10),n(0),n(1),n(2),n(18),n(13)],void 0===(s="function"==typeof(i=function(e,t,n,i,o,s,r,l,a,u,c){"use strict";function d(e){return e&&e.__esModule?e:{default:e}}function f(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function h(e){for(var t=1;t1?i-1:0),s=1;s-1)for(o=this.getItemIndex(o,i,e);o."+l.cls.ITEM,e.inItemGroup)},u.buildCssString=function(e,n){(0,i.default)(e)&&(e=e.join(".")),e="."+e;var o="";return(0,t.default)(n,(function(e,t){(0,s.default)(e)&&e&&(t=t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),o+=t+":"+e+";")})),o?this.containerSelector+" "+e+"{"+o+"}":""},u.destroy=function(){(0,n.default)(this.styleEl),this.styleEl=null},e}();e.default=h})?i.apply(t,o):i)||(e.exports=s)},function(e,t,n){"use strict";e.exports=function(e){return"boolean"==typeof e||e instanceof Boolean}},function(e,t,n){var i,o,s;"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self&&self,o=[t],void 0===(s="function"==typeof(i=function(e){"use strict";e.__esModule=!0,e.default=void 0,e.default={"common.border":"1px solid #ddd","common.background":"#fff","common.color":"#333","common.width":"100%","common.height":"29px","common.disabled.background":"#f9f9f9","common.disabled.color":"c8c8c8","input.border":"1px solid #ddd","input.borderBottom":"","input.background":"inherit","input.color":"#333","input.width":"100%","input.height":"29px","input.open.border":"1px solid #aaa","input.open.background":"inherit","input.open.color":"#333","input.disabled.border":"1px solid #aaa","input.disabled.background":"#f9f9f9","input.disabled.color":"#c8c8c8","dropdown.border":"1px solid #aaa","dropdown.borderTop":"0","dropdown.background":"inherit","dropdown.width":"100%","dropdown.maxHeight":"","itemGroup.items.paddingLeft":"20px","itemGroup.label.border":"0","itemGroup.label.background":"inherit","itemGroup.label.color":"#333","itemGroup.label.fontWeight":"bold","itemGroup.label.height":"29px","itemGroup.label.disabled.border":"0","itemGroup.label.disabled.background":"inherit","itemGroup.label.disabled.color":"#333","item.border":"0","item.background":"inherit","item.color":"#333","item.height":"29px","item.selected.border":"0","item.selected.background":"#f4f4f4","item.selected.color":"#333","item.disabled.border":"0","item.disabled.background":"#f9f9f9","item.disabled.color":"#c8c8c8","item.highlighted.border":"0","item.highlighted.background":"#e5f6ff","item.highlighted.color":"#333"}})?i.apply(t,o):i)||(e.exports=s)},function(e,t,n){}]).default})); \ No newline at end of file diff --git a/index.d.ts b/index.d.ts index 59f8a3b..998c280 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,4 +1,4 @@ -// Type definitions for TOAST UI Select Box v1.0.1 +// Type definitions for TOAST UI Select Box v1.1.0 // TypeScript Version: 3.6.4 export interface IItemData {