@labelbee/lb-components 1.24.0-alpha.3 → 1.24.0-alpha.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/2DViewWorker.js +1 -1
- package/dist/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +2 -2
- package/dist/_virtual/highlightSegmentWorker.js +1 -1
- package/dist/assets/annotation/rectTool/three_points_rect.svg.js +1 -0
- package/dist/assets/annotation/rectTool/two_points_rect.svg.js +1 -0
- package/dist/components/DynamicResizer/DynamicResizer.js +1 -1
- package/dist/components/DynamicResizer/hooks/useDrag.js +1 -1
- package/dist/components/DynamicResizer/hooks/useDraggingAllowed.js +1 -0
- package/dist/components/DynamicResizer/hooks/useUpdateHeight.js +1 -1
- package/dist/components/DynamicResizer/utils/index.js +1 -0
- package/dist/components/LLMMultiWheelView/dialogView/index.js +1 -1
- package/dist/components/LLMMultiWheelView/index.js +1 -1
- package/dist/components/LLMMultiWheelView/sidebar/index.js +1 -1
- package/dist/components/LLMToolView/index.js +1 -1
- package/dist/components/LLMToolView/questionView/components/audioView/index.js +1 -0
- package/dist/components/LLMToolView/questionView/components/header/index.js +1 -1
- package/dist/components/LLMToolView/questionView/index.js +1 -1
- package/dist/components/attributeList/index.js +1 -1
- package/dist/components/audioAnnotate/index.js +1 -1
- package/dist/components/audioAnnotate/textInput/index.js +1 -1
- package/dist/components/audioAnnotate/textInput/index.module.scss.js +1 -1
- package/dist/components/audioPlayer/index.js +1 -1
- package/dist/components/longText/index.js +1 -1
- package/dist/components/pointCloud2DRectOperationView/index.js +1 -1
- package/dist/components/pointCloudView/PointCloud2DView.js +1 -1
- package/dist/components/pointCloudView/PointCloud3DView.js +1 -1
- package/dist/components/pointCloudView/PointCloudContext.js +1 -1
- package/dist/components/pointCloudView/PointCloudListener.js +1 -1
- package/dist/components/pointCloudView/PointCloudTopView.js +1 -1
- package/dist/components/pointCloudView/components/TitleButton/index.js +1 -1
- package/dist/components/pointCloudView/components/UnifyParamsModal/index.js +1 -1
- package/dist/components/pointCloudView/hooks/useHighlight.js +1 -1
- package/dist/components/pointCloudView/hooks/usePointCloudAttribute.js +1 -0
- package/dist/components/pointCloudView/hooks/usePointCloudViews.js +1 -1
- package/dist/components/pointCloudView/index.js +1 -1
- package/dist/components/tagList/index.js +1 -1
- package/dist/constant/index.js +1 -1
- package/dist/index.css +118 -90
- package/dist/store/annotation/actionCreators.js +1 -1
- package/dist/store/annotation/reducer.js +1 -1
- package/dist/store/toolConfig/pointCloudToolConfig.js +1 -1
- package/dist/types/components/DynamicResizer/DynamicResizer.d.ts +3 -3
- package/dist/types/components/DynamicResizer/hooks/useDrag.d.ts +24 -7
- package/dist/types/components/DynamicResizer/hooks/useDraggingAllowed.d.ts +12 -0
- package/dist/types/components/DynamicResizer/hooks/useUpdateHeight.d.ts +10 -21
- package/dist/types/components/DynamicResizer/types/interface.d.ts +14 -6
- package/dist/types/components/DynamicResizer/utils/index.d.ts +4 -0
- package/dist/types/components/LLMMultiWheelView/dialogView/index.d.ts +2 -0
- package/dist/types/components/LLMMultiWheelView/index.d.ts +2 -0
- package/dist/types/components/LLMToolView/questionView/components/audioView/index.d.ts +8 -0
- package/dist/types/components/LLMToolView/questionView/components/header/index.d.ts +3 -1
- package/dist/types/components/attributeList/components/limitPopover/index.d.ts +2 -2
- package/dist/types/components/longText/index.d.ts +1 -1
- package/dist/types/components/pointCloud2DRectOperationView/useUpdateRectList.d.ts +0 -1
- package/dist/types/components/pointCloudView/PointCloudContext.d.ts +4 -0
- package/dist/types/components/pointCloudView/PointCloudListener.d.ts +1 -0
- package/dist/types/components/pointCloudView/hooks/usePointCloudAttribute.d.ts +3 -0
- package/dist/types/components/pointCloudView/hooks/useRotate.d.ts +1 -2
- package/dist/types/components/pointCloudView/hooks/useRotateEdge.d.ts +1 -2
- package/dist/types/components/pointCloudView/index.d.ts +2 -0
- package/dist/types/constant/index.d.ts +2 -1
- package/dist/types/store/annotation/actionCreators.d.ts +1 -1
- package/dist/types/store/annotation/map.d.ts +1 -0
- package/dist/types/store/annotation/reducer.d.ts +4 -0
- package/dist/types/store/annotation/types.d.ts +3 -2
- package/dist/types/store/toolConfig/types.d.ts +2 -0
- package/dist/types/views/MainView/index.d.ts +2 -0
- package/dist/types/views/MainView/sidebar/GeneralOperation/ActionsConfirm.d.ts +3 -0
- package/dist/types/views/MainView/sidebar/GeneralOperation/index.d.ts +9 -0
- package/dist/types/views/MainView/sidebar/index.d.ts +2 -0
- package/dist/utils/ToolPointCloudBoxRenderHelper.js +1 -1
- package/dist/views/MainView/LLMMultiWheelLayout/index.js +1 -1
- package/dist/views/MainView/index.js +1 -1
- package/dist/views/MainView/sidebar/GeneralOperation/ActionsConfirm.js +1 -1
- package/dist/views/MainView/sidebar/GeneralOperation/index.js +1 -1
- package/dist/views/MainView/sidebar/PointCloudToolSidebar/index.js +1 -1
- package/dist/views/MainView/sidebar/ToolIcons.js +1 -1
- package/dist/views/MainView/sidebar/index.js +1 -1
- package/es/_virtual/2DViewWorker.js +1 -1
- package/es/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +2 -2
- package/es/_virtual/highlightSegmentWorker.js +1 -1
- package/es/assets/annotation/rectTool/three_points_rect.svg.js +1 -0
- package/es/assets/annotation/rectTool/two_points_rect.svg.js +1 -0
- package/es/components/DynamicResizer/DynamicResizer.js +1 -1
- package/es/components/DynamicResizer/hooks/useDrag.js +1 -1
- package/es/components/DynamicResizer/hooks/useDraggingAllowed.js +1 -0
- package/es/components/DynamicResizer/hooks/useUpdateHeight.js +1 -1
- package/es/components/DynamicResizer/utils/index.js +1 -0
- package/es/components/LLMMultiWheelView/dialogView/index.js +1 -1
- package/es/components/LLMMultiWheelView/index.js +1 -1
- package/es/components/LLMMultiWheelView/sidebar/index.js +1 -1
- package/es/components/LLMToolView/index.js +1 -1
- package/es/components/LLMToolView/questionView/components/audioView/index.js +1 -0
- package/es/components/LLMToolView/questionView/components/header/index.js +1 -1
- package/es/components/LLMToolView/questionView/index.js +1 -1
- package/es/components/attributeList/index.js +1 -1
- package/es/components/audioAnnotate/index.js +1 -1
- package/es/components/audioAnnotate/textInput/index.js +1 -1
- package/es/components/audioAnnotate/textInput/index.module.scss.js +1 -1
- package/es/components/audioPlayer/index.js +1 -1
- package/es/components/longText/index.js +1 -1
- package/es/components/pointCloud2DRectOperationView/index.js +1 -1
- package/es/components/pointCloudView/PointCloud2DView.js +1 -1
- package/es/components/pointCloudView/PointCloud3DView.js +1 -1
- package/es/components/pointCloudView/PointCloudContext.js +1 -1
- package/es/components/pointCloudView/PointCloudListener.js +1 -1
- package/es/components/pointCloudView/PointCloudTopView.js +1 -1
- package/es/components/pointCloudView/components/TitleButton/index.js +1 -1
- package/es/components/pointCloudView/components/UnifyParamsModal/index.js +1 -1
- package/es/components/pointCloudView/hooks/useHighlight.js +1 -1
- package/es/components/pointCloudView/hooks/usePointCloudAttribute.js +1 -0
- package/es/components/pointCloudView/hooks/usePointCloudViews.js +1 -1
- package/es/components/pointCloudView/index.js +1 -1
- package/es/components/tagList/index.js +1 -1
- package/es/constant/index.js +1 -1
- package/es/index.css +118 -90
- package/es/store/annotation/actionCreators.js +1 -1
- package/es/store/annotation/reducer.js +1 -1
- package/es/store/toolConfig/pointCloudToolConfig.js +1 -1
- package/es/utils/ToolPointCloudBoxRenderHelper.js +1 -1
- package/es/views/MainView/LLMMultiWheelLayout/index.js +1 -1
- package/es/views/MainView/index.js +1 -1
- package/es/views/MainView/sidebar/GeneralOperation/ActionsConfirm.js +1 -1
- package/es/views/MainView/sidebar/GeneralOperation/index.js +1 -1
- package/es/views/MainView/sidebar/PointCloudToolSidebar/index.js +1 -1
- package/es/views/MainView/sidebar/ToolIcons.js +1 -1
- package/es/views/MainView/sidebar/index.js +1 -1
- package/package.json +6 -6
- package/dist/components/DynamicResizer/assets/bottomToZero.svg.js +0 -1
- package/dist/components/DynamicResizer/assets/divider.svg.js +0 -1
- package/dist/components/DynamicResizer/assets/topToZero.svg.js +0 -1
- package/es/components/DynamicResizer/assets/bottomToZero.svg.js +0 -1
- package/es/components/DynamicResizer/assets/divider.svg.js +0 -1
- package/es/components/DynamicResizer/assets/topToZero.svg.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createBase64WorkerFactory as d}from"./_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js";var l=d("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgVGY9TWF0aC5wb3c7IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuKHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KShlKX1mdW5jdGlvbiBlKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbihlKXt2YXIgbj1mdW5jdGlvbihlLG4pe2lmKCJvYmplY3QiIT10KGUpfHwhZSlyZXR1cm4gZTt2YXIgcj1lW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09cil7dmFyIGk9ci5jYWxsKGUsbnx8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9dChpKSlyZXR1cm4gaTt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PW4/U3RyaW5nOk51bWJlcikoZSl9KGUsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT10KG4pP246bisiIn1mdW5jdGlvbiByKHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuKGkua2V5KSxpKX19ZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIGUmJnIodC5wcm90b3R5cGUsZSksbiYmcih0LG4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLHR9ZnVuY3Rpb24gbyh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9ZnVuY3Rpb24gcyh0LGUpe3JldHVybihzPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0pKHQsZSl9ZnVuY3Rpb24gYSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlJiZzKHQsZSl9ZnVuY3Rpb24gdShlLG4pe2lmKG4mJigib2JqZWN0Ij09dChuKXx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pKXJldHVybiBuO2lmKHZvaWQgMCE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTtyZXR1cm4gbyhlKX1mdW5jdGlvbiBjKHQpe3JldHVybihjPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gbCh0LGUscil7cmV0dXJuKGU9bihlKSlpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPXIsdH1mdW5jdGlvbiBoKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1BcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn1mdW5jdGlvbiBmKHQpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fSh0KXx8ZnVuY3Rpb24odCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJm51bGwhPXRbU3ltYm9sLml0ZXJhdG9yXXx8bnVsbCE9dFsiQEBpdGVyYXRvciJdKXJldHVybiBBcnJheS5mcm9tKHQpfSh0KXx8ZnVuY3Rpb24odCxlKXtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGgodCxlKTt2YXIgbj17fS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpO3JldHVybiJPYmplY3QiPT09biYmdC5jb25zdHJ1Y3RvciYmKG49dC5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PW58fCJTZXQiPT09bj9BcnJheS5mcm9tKHQpOiJBcmd1bWVudHMiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/aCh0LGUpOnZvaWQgMH19KHQpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gcCh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gZCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9wKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bCh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6cChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH12YXIgZz17dHlwZToibG9nZ2VyIixsb2c6ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoImxvZyIsdCl9LHdhcm46ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoIndhcm4iLHQpfSxlcnJvcjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgiZXJyb3IiLHQpfSxvdXRwdXQ6ZnVuY3Rpb24odCxlKXtjb25zb2xlJiZjb25zb2xlW3RdfX0seT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2UodGhpcyx0KSx0aGlzLmluaXQobixyKX1yZXR1cm4gaSh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307dGhpcy5wcmVmaXg9ZS5wcmVmaXh8fCJpMThuZXh0OiIsdGhpcy5sb2dnZXI9dHx8Zyx0aGlzLm9wdGlvbnM9ZSx0aGlzLmRlYnVnPWUuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZChlLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiB0WzBdJiYodFswXT0iIi5jb25jYXQobikuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltlXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCh0aGlzLmxvZ2dlcixkKGQoe30se3ByZWZpeDoiIi5jb25jYXQodGhpcy5wcmVmaXgsIjoiKS5jb25jYXQoZSwiOiIpfSksdGhpcy5vcHRpb25zKSl9fSx7a2V5OiJjbG9uZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuKGU9ZXx8dGhpcy5vcHRpb25zKS5wcmVmaXg9ZS5wcmVmaXh8fHRoaXMucHJlZml4LG5ldyB0KHRoaXMubG9nZ2VyLGUpfX1dKSx0fSgpLG09bmV3IHksdj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtlKHRoaXMsdCksdGhpcy5vYnNlcnZlcnM9e319cmV0dXJuIGkodCxbe2tleToib24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gdC5zcGxpdCgiICIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe24ub2JzZXJ2ZXJzW3RdPW4ub2JzZXJ2ZXJzW3RdfHxbXSxuLm9ic2VydmVyc1t0XS5wdXNoKGUpfSkpLHRoaXN9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5vYnNlcnZlcnNbdF0pe2lmKCFlKXJldHVybiB2b2lkIGRlbGV0ZSB0aGlzLm9ic2VydmVyc1t0XTt0aGlzLm9ic2VydmVyc1t0XT10aGlzLm9ic2VydmVyc1t0XS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09ZX0pKX19fSx7a2V5OiJlbWl0Iix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07dGhpcy5vYnNlcnZlcnNbdF0mJltdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1t0XSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hcHBseSh2b2lkIDAsbil9KSk7dGhpcy5vYnNlcnZlcnNbIioiXSYmW10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzWyIqIl0pLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuYXBwbHkoZSxbdF0uY29uY2F0KG4pKX0pKX19XSksdH0oKTtmdW5jdGlvbiBfKCl7dmFyIHQsZSxuPW5ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe3Q9bixlPXJ9KSk7cmV0dXJuIG4ucmVzb2x2ZT10LG4ucmVqZWN0PWUsbn1mdW5jdGlvbiB4KHQpe3JldHVybiBudWxsPT10PyIiOiIiK3R9ZnVuY3Rpb24gdyh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mdW5jdGlvbiBpKCl7cmV0dXJuIXR8fCJzdHJpbmciPT10eXBlb2YgdH1mb3IodmFyIG89InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7by5sZW5ndGg+MTspe2lmKGkoKSlyZXR1cm57fTt2YXIgcz1yKG8uc2hpZnQoKSk7IXRbc10mJm4mJih0W3NdPW5ldyBuKSx0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHMpP3Rbc106e319cmV0dXJuIGkoKT97fTp7b2JqOnQsazpyKG8uc2hpZnQoKSl9fWZ1bmN0aW9uIGIodCxlLG4pe3ZhciByPXcodCxlLE9iamVjdCk7ci5vYmpbci5rXT1ufWZ1bmN0aW9uIEQodCxlKXt2YXIgbj13KHQsZSkscj1uLm9iaixpPW4uaztpZihyKXJldHVybiByW2ldfWZ1bmN0aW9uIEUodCxlLG4pe3ZhciByPUQodCxuKTtyZXR1cm4gdm9pZCAwIT09cj9yOkQoZSxuKX1mdW5jdGlvbiBDKHQsZSxuKXtmb3IodmFyIHIgaW4gZSkiX19wcm90b19fIiE9PXImJiJjb25zdHJ1Y3RvciIhPT1yJiYociBpbiB0PyJzdHJpbmciPT10eXBlb2YgdFtyXXx8dFtyXWluc3RhbmNlb2YgU3RyaW5nfHwic3RyaW5nIj09dHlwZW9mIGVbcl18fGVbcl1pbnN0YW5jZW9mIFN0cmluZz9uJiYodFtyXT1lW3JdKTpDKHRbcl0sZVtyXSxuKTp0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIFModCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCJcXCQmIil9dmFyIEE9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiBOKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnJlcGxhY2UoL1smPD4iJ1wvXS9nLChmdW5jdGlvbih0KXtyZXR1cm4gQVt0XX0pKTp0fXZhciBJPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ2b2lkIDA9PT13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudERhdGEmJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIik+LTEsTT1bIiAiLCIsIiwiPyIsIiEiLCI7Il07ZnVuY3Rpb24gRih0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gVCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9GKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bCh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6RihPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBPKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1jKHQpO2lmKGUpe3ZhciBpPWModGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHUodGhpcyxuKX19ZnVuY3Rpb24gTCh0LGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXToiLiI7aWYodCl7aWYodFtlXSlyZXR1cm4gdFtlXTtmb3IodmFyIHI9ZS5zcGxpdChuKSxpPXQsbz0wO288ci5sZW5ndGg7KytvKXtpZighaXx8InN0cmluZyI9PXR5cGVvZiBpW3Jbb11dJiZvKzE8ci5sZW5ndGgpcmV0dXJuO2lmKHZvaWQgMD09PWlbcltvXV0pe2Zvcih2YXIgcz0yLGE9ci5zbGljZShvLG8rcykuam9pbihuKSx1PWlbYV07dm9pZCAwPT09dSYmci5sZW5ndGg+bytzOylzKyssdT1pW2E9ci5zbGljZShvLG8rcykuam9pbihuKV07aWYodm9pZCAwPT09dSlyZXR1cm47aWYobnVsbD09PXUpcmV0dXJuIG51bGw7aWYoZS5lbmRzV2l0aChhKSl7aWYoInN0cmluZyI9PXR5cGVvZiB1KXJldHVybiB1O2lmKGEmJiJzdHJpbmciPT10eXBlb2YgdVthXSlyZXR1cm4gdVthXX12YXIgYz1yLnNsaWNlKG8rcykuam9pbihuKTtyZXR1cm4gYz9MKHUsYyxuKTp2b2lkIDB9aT1pW3Jbb11dfXJldHVybiBpfX12YXIgUD1mdW5jdGlvbih0KXthKHIsdCk7dmFyIG49TyhyKTtmdW5jdGlvbiByKHQpe3ZhciBpLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOiJ0cmFuc2xhdGlvbiJ9O3JldHVybiBlKHRoaXMsciksaT1uLmNhbGwodGhpcyksSSYmdi5jYWxsKG8oaSkpLGkuZGF0YT10fHx7fSxpLm9wdGlvbnM9cyx2b2lkIDA9PT1pLm9wdGlvbnMua2V5U2VwYXJhdG9yJiYoaS5vcHRpb25zLmtleVNlcGFyYXRvcj0iLiIpLHZvaWQgMD09PWkub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlJiYoaS5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmU9ITApLGl9cmV0dXJuIGkocixbe2tleToiYWRkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm5zLmluZGV4T2YodCk8MCYmdGhpcy5vcHRpb25zLm5zLnB1c2godCl9fSx7a2V5OiJyZW1vdmVOYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTtlPi0xJiZ0aGlzLm9wdGlvbnMubnMuc3BsaWNlKGUsMSl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxpPXZvaWQgMCE9PXIua2V5U2VwYXJhdG9yP3Iua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3Isbz12b2lkIDAhPT1yLmlnbm9yZUpTT05TdHJ1Y3R1cmU/ci5pZ25vcmVKU09OU3RydWN0dXJlOnRoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlLHM9W3QsZV07biYmInN0cmluZyIhPXR5cGVvZiBuJiYocz1zLmNvbmNhdChuKSksbiYmInN0cmluZyI9PXR5cGVvZiBuJiYocz1zLmNvbmNhdChpP24uc3BsaXQoaSk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYocz10LnNwbGl0KCIuIikpO3ZhciBhPUQodGhpcy5kYXRhLHMpO3JldHVybiBhfHwhb3x8InN0cmluZyIhPXR5cGVvZiBuP2E6TCh0aGlzLmRhdGEmJnRoaXMuZGF0YVt0XSYmdGhpcy5kYXRhW3RdW2VdLG4saSl9fSx7a2V5OiJhZGRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOntzaWxlbnQ6ITF9LG89dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcjt2b2lkIDA9PT1vJiYobz0iLiIpO3ZhciBzPVt0LGVdO24mJihzPXMuY29uY2F0KG8/bi5zcGxpdChvKTpuKSksdC5pbmRleE9mKCIuIik+LTEmJihyPWUsZT0ocz10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSksYih0aGlzLmRhdGEscyxyKSxpLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4scil9fSx7a2V5OiJhZGRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e3NpbGVudDohMX07Zm9yKHZhciBpIGluIG4pKCJzdHJpbmciPT10eXBlb2YgbltpXXx8IltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkobltpXSkpJiZ0aGlzLmFkZFJlc291cmNlKHQsZSxpLG5baV0se3NpbGVudDohMH0pO3Iuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e3NpbGVudDohMX0scz1bdCxlXTt0LmluZGV4T2YoIi4iKT4tMSYmKHI9bixuPWUsZT0ocz10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSk7dmFyIGE9RCh0aGlzLmRhdGEscyl8fHt9O3I/QyhhLG4saSk6YT1UKFQoe30sYSksbiksYih0aGlzLmRhdGEscyxhKSxvLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4pfX0se2tleToicmVtb3ZlUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5oYXNSZXNvdXJjZUJ1bmRsZSh0LGUpJiZkZWxldGUgdGhpcy5kYXRhW3RdW2VdLHRoaXMucmVtb3ZlTmFtZXNwYWNlcyhlKSx0aGlzLmVtaXQoInJlbW92ZWQiLHQsZSl9fSx7a2V5OiJoYXNSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5nZXRSZXNvdXJjZSh0LGUpfX0se2tleToiZ2V0UmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fChlPXRoaXMub3B0aW9ucy5kZWZhdWx0TlMpLCJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQST9UKFQoe30se30pLHRoaXMuZ2V0UmVzb3VyY2UodCxlKSk6dGhpcy5nZXRSZXNvdXJjZSh0LGUpfX0se2tleToiZ2V0RGF0YUJ5TGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGFbdF19fSx7a2V5OiJoYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RGF0YUJ5TGFuZ3VhZ2UodCk7cmV0dXJuISEoZSYmT2JqZWN0LmtleXMoZSl8fFtdKS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XSYmT2JqZWN0LmtleXMoZVt0XSkubGVuZ3RoPjB9KSl9fSx7a2V5OiJ0b0pTT04iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX19XSkscn0odiksUj17cHJvY2Vzc29yczp7fSxhZGRQb3N0UHJvY2Vzc29yOmZ1bmN0aW9uKHQpe3RoaXMucHJvY2Vzc29yc1t0Lm5hbWVdPXR9LGhhbmRsZTpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXRoaXM7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7by5wcm9jZXNzb3JzW3RdJiYoZT1vLnByb2Nlc3NvcnNbdF0ucHJvY2VzcyhlLG4scixpKSl9KSksZX19O2Z1bmN0aW9uIEIodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIGsodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/QihPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOkIoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24geih0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9Yyh0KTtpZihlKXt2YXIgaT1jKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB1KHRoaXMsbil9fXZhciBqPXt9LFU9ZnVuY3Rpb24obil7YShzLG4pO3ZhciByPXoocyk7ZnVuY3Rpb24gcyh0KXt2YXIgbixpPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4gZSh0aGlzLHMpLG49ci5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKG4pKSxmdW5jdGlvbih0LGUsbil7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3RdJiYoblt0XT1lW3RdKX0pKX0oWyJyZXNvdXJjZVN0b3JlIiwibGFuZ3VhZ2VVdGlscyIsInBsdXJhbFJlc29sdmVyIiwiaW50ZXJwb2xhdG9yIiwiYmFja2VuZENvbm5lY3RvciIsImkxOG5Gb3JtYXQiLCJ1dGlscyJdLHQsbyhuKSksbi5vcHRpb25zPWksdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxuLmxvZ2dlcj1tLmNyZWF0ZSgidHJhbnNsYXRvciIpLG59cmV0dXJuIGkocyxbe2tleToiY2hhbmdlTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3QmJih0aGlzLmxhbmd1YWdlPXQpfX0se2tleToiZXhpc3RzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319O2lmKG51bGw9PXQpcmV0dXJuITE7dmFyIG49dGhpcy5yZXNvbHZlKHQsZSk7cmV0dXJuIG4mJnZvaWQgMCE9PW4ucmVzfX0se2tleToiZXh0cmFjdEZyb21LZXkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dm9pZCAwIT09ZS5uc1NlcGFyYXRvcj9lLm5zU2VwYXJhdG9yOnRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjt2b2lkIDA9PT1uJiYobj0iOiIpO3ZhciByPXZvaWQgMCE9PWUua2V5U2VwYXJhdG9yP2Uua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsaT1lLm5zfHx0aGlzLm9wdGlvbnMuZGVmYXVsdE5TfHxbXSxvPW4mJnQuaW5kZXhPZihuKT4tMSxzPSEodGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkS2V5U2VwYXJhdG9yfHxlLmtleVNlcGFyYXRvcnx8dGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkTnNTZXBhcmF0b3J8fGUubnNTZXBhcmF0b3J8fGZ1bmN0aW9uKHQsZSxuKXtlPWV8fCIiLG49bnx8IiI7dmFyIHI9TS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmluZGV4T2YodCk8MCYmbi5pbmRleE9mKHQpPDB9KSk7aWYoMD09PXIubGVuZ3RoKXJldHVybiEwO3ZhciBpPW5ldyBSZWdFeHAoIigiLmNvbmNhdChyLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIj8iPT09dD8iXFw/Ijp0fSkpLmpvaW4oInwiKSwiKSIpKSxvPSFpLnRlc3QodCk7aWYoIW8pe3ZhciBzPXQuaW5kZXhPZihuKTtzPjAmJiFpLnRlc3QodC5zdWJzdHJpbmcoMCxzKSkmJihvPSEwKX1yZXR1cm4gb30odCxuLHIpKTtpZihvJiYhcyl7dmFyIGE9dC5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtpZihhJiZhLmxlbmd0aD4wKXJldHVybntrZXk6dCxuYW1lc3BhY2VzOml9O3ZhciB1PXQuc3BsaXQobik7KG4hPT1yfHxuPT09ciYmdGhpcy5vcHRpb25zLm5zLmluZGV4T2YodVswXSk+LTEpJiYoaT11LnNoaWZ0KCkpLHQ9dS5qb2luKHIpfXJldHVybiJzdHJpbmciPT10eXBlb2YgaSYmKGk9W2ldKSx7a2V5OnQsbmFtZXNwYWNlczppfX19LHtrZXk6InRyYW5zbGF0ZSIsdmFsdWU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPXRoaXM7aWYoIm9iamVjdCIhPT10KG4pJiZ0aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXImJihuPXRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihhcmd1bWVudHMpKSxufHwobj17fSksbnVsbD09ZSlyZXR1cm4iIjtBcnJheS5pc0FycmF5KGUpfHwoZT1bU3RyaW5nKGUpXSk7dmFyIG89dm9pZCAwIT09bi5yZXR1cm5EZXRhaWxzP24ucmV0dXJuRGV0YWlsczp0aGlzLm9wdGlvbnMucmV0dXJuRGV0YWlscyxhPXZvaWQgMCE9PW4ua2V5U2VwYXJhdG9yP24ua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsdT10aGlzLmV4dHJhY3RGcm9tS2V5KGVbZS5sZW5ndGgtMV0sbiksYz11LmtleSxsPXUubmFtZXNwYWNlcyxoPWxbbC5sZW5ndGgtMV0sZj1uLmxuZ3x8dGhpcy5sYW5ndWFnZSxwPW4uYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGV8fHRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZTtpZihmJiYiY2ltb2RlIj09PWYudG9Mb3dlckNhc2UoKSl7aWYocCl7dmFyIGQ9bi5uc1NlcGFyYXRvcnx8dGhpcy5vcHRpb25zLm5zU2VwYXJhdG9yO3JldHVybiBvPyhnLnJlcz0iIi5jb25jYXQoaCkuY29uY2F0KGQpLmNvbmNhdChjKSxnKToiIi5jb25jYXQoaCkuY29uY2F0KGQpLmNvbmNhdChjKX1yZXR1cm4gbz8oZy5yZXM9YyxnKTpjfXZhciBnPXRoaXMucmVzb2x2ZShlLG4pLHk9ZyYmZy5yZXMsbT1nJiZnLnVzZWRLZXl8fGMsdj1nJiZnLmV4YWN0VXNlZEtleXx8YyxfPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoeSkseD12b2lkIDAhPT1uLmpvaW5BcnJheXM/bi5qb2luQXJyYXlzOnRoaXMub3B0aW9ucy5qb2luQXJyYXlzLHc9IXRoaXMuaTE4bkZvcm1hdHx8dGhpcy5pMThuRm9ybWF0LmhhbmRsZUFzT2JqZWN0O2lmKHcmJnkmJigic3RyaW5nIiE9dHlwZW9mIHkmJiJib29sZWFuIiE9dHlwZW9mIHkmJiJudW1iZXIiIT10eXBlb2YgeSkmJlsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXS5pbmRleE9mKF8pPDAmJigic3RyaW5nIiE9dHlwZW9mIHh8fCJbb2JqZWN0IEFycmF5XSIhPT1fKSl7aWYoIW4ucmV0dXJuT2JqZWN0cyYmIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKXt0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyfHx0aGlzLmxvZ2dlci53YXJuKCJhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEiKTt2YXIgYj10aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyP3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIobSx5LGsoayh7fSxuKSx7fSx7bnM6bH0pKToia2V5ICciLmNvbmNhdChjLCIgKCIpLmNvbmNhdCh0aGlzLmxhbmd1YWdlLCIpJyByZXR1cm5lZCBhbiBvYmplY3QgaW5zdGVhZCBvZiBzdHJpbmcuIik7cmV0dXJuIG8/KGcucmVzPWIsZyk6Yn1pZihhKXt2YXIgRD0iW29iamVjdCBBcnJheV0iPT09XyxFPUQ/W106e30sQz1EP3Y6bTtmb3IodmFyIFMgaW4geSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeSxTKSl7dmFyIEE9IiIuY29uY2F0KEMpLmNvbmNhdChhKS5jb25jYXQoUyk7RVtTXT10aGlzLnRyYW5zbGF0ZShBLGsoayh7fSxuKSx7am9pbkFycmF5czohMSxuczpsfSkpLEVbU109PT1BJiYoRVtTXT15W1NdKX15PUV9fWVsc2UgaWYodyYmInN0cmluZyI9PXR5cGVvZiB4JiYiW29iamVjdCBBcnJheV0iPT09XykoeT15LmpvaW4oeCkpJiYoeT10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKHksZSxuLHIpKTtlbHNle3ZhciBOPSExLEk9ITEsTT12b2lkIDAhPT1uLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIG4uY291bnQsRj1zLmhhc0RlZmF1bHRWYWx1ZShuKSxUPU0/dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoZixuLmNvdW50LG4pOiIiLE89blsiZGVmYXVsdFZhbHVlIi5jb25jYXQoVCldfHxuLmRlZmF1bHRWYWx1ZTshdGhpcy5pc1ZhbGlkTG9va3VwKHkpJiZGJiYoTj0hMCx5PU8pLHRoaXMuaXNWYWxpZExvb2t1cCh5KXx8KEk9ITAseT1jKTt2YXIgTD0obi5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXl8fHRoaXMub3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXkpJiZJP3ZvaWQgMDp5LFA9RiYmTyE9PXkmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKEl8fE58fFApe2lmKHRoaXMubG9nZ2VyLmxvZyhQPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixmLGgsYyxQP086eSksYSl7dmFyIFI9dGhpcy5yZXNvbHZlKGMsayhrKHt9LG4pLHt9LHtrZXlTZXBhcmF0b3I6ITF9KSk7UiYmUi5yZXMmJnRoaXMubG9nZ2VyLndhcm4oIlNlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4iKX12YXIgQj1bXSx6PXRoaXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxuLmxuZ3x8dGhpcy5sYW5ndWFnZSk7aWYoImZhbGxiYWNrIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvJiZ6JiZ6WzBdKWZvcih2YXIgaj0wO2o8ei5sZW5ndGg7aisrKUIucHVzaCh6W2pdKTtlbHNlImFsbCI9PT10aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz9CPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobi5sbmd8fHRoaXMubGFuZ3VhZ2UpOkIucHVzaChuLmxuZ3x8dGhpcy5sYW5ndWFnZSk7dmFyIFU9ZnVuY3Rpb24odCxlLHIpe3ZhciBvPUYmJnIhPT15P3I6TDtpLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXI/aS5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyKHQsaCxlLG8sUCxuKTppLmJhY2tlbmRDb25uZWN0b3ImJmkuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyYmaS5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nKHQsaCxlLG8sUCxuKSxpLmVtaXQoIm1pc3NpbmdLZXkiLHQsaCxlLHkpfTt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmcmJih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZNP0IuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXhlcyh0LG4pLmZvckVhY2goKGZ1bmN0aW9uKGUpe1UoW3RdLGMrZSxuWyJkZWZhdWx0VmFsdWUiLmNvbmNhdChlKV18fE8pfSkpfSkpOlUoQixjLE8pKX15PXRoaXMuZXh0ZW5kVHJhbnNsYXRpb24oeSxlLG4sZyxyKSxJJiZ5PT09YyYmdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSYmKHk9IiIuY29uY2F0KGgsIjoiKS5jb25jYXQoYykpLChJfHxOKSYmdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXImJih5PSJ2MSIhPT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQST90aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcih0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5PyIiLmNvbmNhdChoLCI6IikuY29uY2F0KGMpOmMsTj95OnZvaWQgMCk6dGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIoeSkpfXJldHVybiBvPyhnLnJlcz15LGcpOnl9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKXQ9dGhpcy5pMThuRm9ybWF0LnBhcnNlKHQsayhrKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLG4pLHIudXNlZExuZyxyLnVzZWROUyxyLnVzZWRLZXkse3Jlc29sdmVkOnJ9KTtlbHNlIGlmKCFuLnNraXBJbnRlcnBvbGF0aW9uKXtuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLmluaXQoayhrKHt9LG4pLHtpbnRlcnBvbGF0aW9uOmsoayh7fSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiksbi5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgcyxhPSJzdHJpbmciPT10eXBlb2YgdCYmKG4mJm4uaW50ZXJwb2xhdGlvbiYmdm9pZCAwIT09bi5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcz9uLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzOnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyk7aWYoYSl7dmFyIHU9dC5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtzPXUmJnUubGVuZ3RofXZhciBjPW4ucmVwbGFjZSYmInN0cmluZyIhPXR5cGVvZiBuLnJlcGxhY2U/bi5yZXBsYWNlOm47aWYodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyYmKGM9ayhrKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLGMpKSx0PXRoaXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKHQsYyxuLmxuZ3x8dGhpcy5sYW5ndWFnZSxuKSxhKXt2YXIgbD10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO3M8KGwmJmwubGVuZ3RoKSYmKG4ubmVzdD0hMSl9ITEhPT1uLm5lc3QmJih0PXRoaXMuaW50ZXJwb2xhdG9yLm5lc3QodCwoZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheSh0KSxzPTA7czx0O3MrKylyW3NdPWFyZ3VtZW50c1tzXTtyZXR1cm4gaSYmaVswXT09PXJbMF0mJiFuLmNvbnRleHQ/KG8ubG9nZ2VyLndhcm4oIkl0IHNlZW1zIHlvdSBhcmUgbmVzdGluZyByZWN1cnNpdmVseSBrZXk6ICIuY29uY2F0KHJbMF0sIiBpbiBrZXk6ICIpLmNvbmNhdChlWzBdKSksbnVsbCk6by50cmFuc2xhdGUuYXBwbHkobyxyLmNvbmNhdChbZV0pKX0pLG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIGg9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLGY9InN0cmluZyI9PXR5cGVvZiBoP1toXTpoO3JldHVybiBudWxsIT10JiZmJiZmLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKHQ9Ui5oYW5kbGUoZix0LGUsdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMucG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQ/ayh7aTE4blJlc29sdmVkOnJ9LG4pOm4sdGhpcykpLHR9fSx7a2V5OiJyZXNvbHZlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHM9dGhpcyxhPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighcy5pc1ZhbGlkTG9va3VwKGUpKXt2YXIgdT1zLmV4dHJhY3RGcm9tS2V5KHQsYSksYz11LmtleTtuPWM7dmFyIGw9dS5uYW1lc3BhY2VzO3Mub3B0aW9ucy5mYWxsYmFja05TJiYobD1sLmNvbmNhdChzLm9wdGlvbnMuZmFsbGJhY2tOUykpO3ZhciBoPXZvaWQgMCE9PWEuY291bnQmJiJzdHJpbmciIT10eXBlb2YgYS5jb3VudCxmPWgmJiFhLm9yZGluYWwmJjA9PT1hLmNvdW50JiZzLnBsdXJhbFJlc29sdmVyLnNob3VsZFVzZUludGxBcGkoKSxwPXZvaWQgMCE9PWEuY29udGV4dCYmKCJzdHJpbmciPT10eXBlb2YgYS5jb250ZXh0fHwibnVtYmVyIj09dHlwZW9mIGEuY29udGV4dCkmJiIiIT09YS5jb250ZXh0LGQ9YS5sbmdzP2EubG5nczpzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KGEubG5nfHxzLmxhbmd1YWdlLGEuZmFsbGJhY2tMbmcpO2wuZm9yRWFjaCgoZnVuY3Rpb24odCl7cy5pc1ZhbGlkTG9va3VwKGUpfHwobz10LCFqWyIiLmNvbmNhdChkWzBdLCItIikuY29uY2F0KHQpXSYmcy51dGlscyYmcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiFzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShvKSYmKGpbIiIuY29uY2F0KGRbMF0sIi0iKS5jb25jYXQodCldPSEwLHMubG9nZ2VyLndhcm4oJ2tleSAiJy5jb25jYXQobiwnIiBmb3IgbGFuZ3VhZ2VzICInKS5jb25jYXQoZC5qb2luKCIsICIpLCciIHdvblwndCBnZXQgcmVzb2x2ZWQgYXMgbmFtZXNwYWNlICInKS5jb25jYXQobywnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIikpLGQuZm9yRWFjaCgoZnVuY3Rpb24obil7aWYoIXMuaXNWYWxpZExvb2t1cChlKSl7aT1uO3ZhciBvLHU9W2NdO2lmKHMuaTE4bkZvcm1hdCYmcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMpcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXModSxjLG4sdCxhKTtlbHNle3ZhciBsO2gmJihsPXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KG4sYS5jb3VudCxhKSk7dmFyIGQ9IiIuY29uY2F0KHMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IsInplcm8iKTtpZihoJiYodS5wdXNoKGMrbCksZiYmdS5wdXNoKGMrZCkpLHApe3ZhciBnPSIiLmNvbmNhdChjKS5jb25jYXQocy5vcHRpb25zLmNvbnRleHRTZXBhcmF0b3IpLmNvbmNhdChhLmNvbnRleHQpO3UucHVzaChnKSxoJiYodS5wdXNoKGcrbCksZiYmdS5wdXNoKGcrZCkpfX1mb3IoO289dS5wb3AoKTspcy5pc1ZhbGlkTG9va3VwKGUpfHwocj1vLGU9cy5nZXRSZXNvdXJjZShuLHQsbyxhKSl9fSkpKX0pKX19KSkse3JlczplLHVzZWRLZXk6bixleGFjdFVzZWRLZXk6cix1c2VkTG5nOmksdXNlZE5TOm99fX0se2tleToiaXNWYWxpZExvb2t1cCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuISh2b2lkIDA9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybk51bGwmJm51bGw9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybkVtcHR5U3RyaW5nJiYiIj09PXQpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e307cmV0dXJuIHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlP3RoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZSh0LGUsbixyKTp0aGlzLnJlc291cmNlU3RvcmUuZ2V0UmVzb3VyY2UodCxlLG4scil9fV0sW3trZXk6Imhhc0RlZmF1bHRWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9ImRlZmF1bHRWYWx1ZSI7Zm9yKHZhciBuIGluIHQpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJmU9PT1uLnN1YnN0cmluZygwLDEyKSYmdm9pZCAwIT09dFtuXSlyZXR1cm4hMDtyZXR1cm4hMX19XSksc30odik7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfXZhciBWPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuKXtlKHRoaXMsdCksdGhpcy5vcHRpb25zPW4sdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1tLmNyZWF0ZSgibGFuZ3VhZ2VVdGlscyIpfXJldHVybiBpKHQsW3trZXk6ImdldFNjcmlwdFBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIG51bGw7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiAyPT09ZS5sZW5ndGh8fChlLnBvcCgpLCJ4Ij09PWVbZS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKSk/bnVsbDp0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlLmpvaW4oIi0iKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIHQ7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMSl7dmFyIGU9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/bj1uLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKX0pKToyPT09bi5sZW5ndGg/KG5bMF09blswXS50b0xvd2VyQ2FzZSgpLG5bMV09blsxXS50b1VwcGVyQ2FzZSgpLGUuaW5kZXhPZihuWzFdLnRvTG93ZXJDYXNlKCkpPi0xJiYoblsxXT1xKG5bMV0udG9Mb3dlckNhc2UoKSkpKTozPT09bi5sZW5ndGgmJihuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSwyPT09blsxXS5sZW5ndGgmJihuWzFdPW5bMV0udG9VcHBlckNhc2UoKSksInNnbiIhPT1uWzBdJiYyPT09blsyXS5sZW5ndGgmJihuWzJdPW5bMl0udG9VcHBlckNhc2UoKSksZS5pbmRleE9mKG5bMV0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzFdPXEoblsxXS50b0xvd2VyQ2FzZSgpKSksZS5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPXEoblsyXS50b0xvd2VyQ2FzZSgpKSkpLG4uam9pbigiLSIpfXJldHVybiB0aGlzLm9wdGlvbnMuY2xlYW5Db2RlfHx0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nP3QudG9Mb3dlckNhc2UoKTp0fX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO3JldHVybiB0Pyh0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmZvcm1hdExhbmd1YWdlQ29kZSh0KTsoIW4ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHxuLmlzU3VwcG9ydGVkQ29kZShyKSkmJihlPXIpfX0pKSwhZSYmdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MmJnQuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIWUpe3ZhciByPW4uZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCk7aWYobi5pc1N1cHBvcnRlZENvZGUocikpcmV0dXJuIGU9cjtlPW4ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzLmZpbmQoKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YocikpcmV0dXJuIHR9KSl9fSkpLGV8fChlPXRoaXMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpWzBdKSxlKTpudWxsfX0se2tleToiZ2V0RmFsbGJhY2tDb2RlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm5bXTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dChlKSksInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLCJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KHQpKXJldHVybiB0O2lmKCFlKXJldHVybiB0LmRlZmF1bHR8fFtdO3ZhciBuPXRbZV07cmV0dXJuIG58fChuPXRbdGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUoZSldKSxufHwobj10W3RoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGUpXSksbnx8KG49dFt0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGUpXSksbnx8KG49dC5kZWZhdWx0KSxufHxbXX19LHtrZXk6InRvUmVzb2x2ZUhpZXJhcmNoeSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dGhpcy5nZXRGYWxsYmFja0NvZGVzKGV8fHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZ3x8W10sdCksaT1bXSxvPWZ1bmN0aW9uKHQpeyF0fHwobi5pc1N1cHBvcnRlZENvZGUodCk/aS5wdXNoKHQpOm4ubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdCh0KSkpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigiLSIpPi0xPygibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZvKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSwibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiYiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJm8odGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUodCkpLCJjdXJyZW50T25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmbyh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSk6InN0cmluZyI9PXR5cGVvZiB0JiZvKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSxyLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuaW5kZXhPZih0KTwwJiZvKG4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKX0pKSxpfX1dKSx0fSgpLEc9W3tsbmdzOlsiYWNoIiwiYWsiLCJhbSIsImFybiIsImJyIiwiZmlsIiwiZ3VuIiwibG4iLCJtZmUiLCJtZyIsIm1pIiwib2MiLCJwdCIsInB0LUJSIiwidGciLCJ0bCIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtrIiwia24iLCJrdSIsImxiIiwibWFpIiwibWwiLCJtbiIsIm1yIiwibmFoIiwibmFwIiwibmIiLCJuZSIsIm5sIiwibm4iLCJubyIsIm5zbyIsInBhIiwicGFwIiwicG1zIiwicHMiLCJwdC1QVCIsInJtIiwic2NvIiwic2UiLCJzaSIsInNvIiwic29uIiwic3EiLCJzdiIsInN3IiwidGEiLCJ0ZSIsInRrIiwidXIiLCJ5byJdLG5yOlsxLDJdLGZjOjJ9LHtsbmdzOlsiYXkiLCJibyIsImNnZyIsImZhIiwiaHQiLCJpZCIsImphIiwiamJvIiwia2EiLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sWT17MTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ+MSl9LDI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxIT10KX0sMzpmdW5jdGlvbih0KXtyZXR1cm4gMH0sNDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQlMTA+PTImJnQlMTA8PTQmJih0JTEwMDwxMHx8dCUxMDA+PTIwKT8xOjIpfSw1OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMD09dD8wOjE9PXQ/MToyPT10PzI6dCUxMDA+PTMmJnQlMTAwPD0xMD8zOnQlMTAwPj0xMT80OjUpfSw2OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOnQ+PTImJnQ8PTQ/MToyKX0sNzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDp0JTEwPj0yJiZ0JTEwPD00JiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sODpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6OCE9dCYmMTEhPXQ/MjozKX0sOTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ+PTIpfSwxMDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6dDw3PzI6dDwxMT8zOjQpfSwxMTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXR8fDExPT10PzA6Mj09dHx8MTI9PXQ/MTp0PjImJnQ8MjA/MjozKX0sMTI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwIT0xfHx0JTEwMD09MTEpfSwxMzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDAhPT10KX0sMTQ6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOjM9PXQ/MjozKX0sMTU6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDp0JTEwPj0yJiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sMTY6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDowIT09dD8xOjIpfSwxNzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXR8fHQlMTA9PTEmJnQlMTAwIT0xMT8wOjEpfSwxODpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDA9PXQ/MDoxPT10PzE6Mil9LDE5OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjA9PXR8fHQlMTAwPjEmJnQlMTAwPDExPzE6dCUxMDA+MTAmJnQlMTAwPDIwPzI6Myl9LDIwOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjA9PXR8fHQlMTAwPjAmJnQlMTAwPDIwPzE6Mil9LDIxOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMDA9PTE/MTp0JTEwMD09Mj8yOnQlMTAwPT0zfHx0JTEwMD09ND8zOjApfSwyMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6KHQ8MHx8dD4xMCkmJnQlMTA9PTA/MjozKX19LFg9WyJ2MSIsInYyIiwidjMiXSxXPXt6ZXJvOjAsb25lOjEsdHdvOjIsZmV3OjMsbWFueTo0LG90aGVyOjV9O3ZhciBIPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307ZSh0aGlzLHQpLHRoaXMubGFuZ3VhZ2VVdGlscz1uLHRoaXMub3B0aW9ucz1yLHRoaXMubG9nZ2VyPW0uY3JlYXRlKCJwbHVyYWxSZXNvbHZlciIpLCghdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OfHwidjQiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgSW50bHx8IUludGwuUGx1cmFsUnVsZXMpJiYodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPSJ2MyIsdGhpcy5sb2dnZXIuZXJyb3IoIllvdXIgZW52aXJvbm1lbnQgc2VlbXMgbm90IHRvIGJlIEludGwgQVBJIGNvbXBhdGlibGUsIHVzZSBhbiBJbnRsLlBsdXJhbFJ1bGVzIHBvbHlmaWxsLiBXaWxsIGZhbGxiYWNrIHRvIHRoZSBjb21wYXRpYmlsaXR5SlNPTiB2MyBmb3JtYXQgaGFuZGxpbmcuIikpLHRoaXMucnVsZXM9ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gRy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmxuZ3MuZm9yRWFjaCgoZnVuY3Rpb24obil7dFtuXT17bnVtYmVyczplLm5yLHBsdXJhbHM6WVtlLmZjXX19KSl9KSksdH0oKX1yZXR1cm4gaSh0LFt7a2V5OiJhZGRSdWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucnVsZXNbdF09ZX19LHtrZXk6ImdldFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZih0aGlzLnNob3VsZFVzZUludGxBcGkoKSl0cnl7cmV0dXJuIG5ldyBJbnRsLlBsdXJhbFJ1bGVzKHQse3R5cGU6ZS5vcmRpbmFsPyJvcmRpbmFsIjoiY2FyZGluYWwifSl9Y2F0Y2godCl7cmV0dXJufXJldHVybiB0aGlzLnJ1bGVzW3RdfHx0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KV19fSx7a2V5OiJuZWVkc1BsdXJhbCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49dGhpcy5nZXRSdWxlKHQsZSk7cmV0dXJuIHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpP24mJm4ucmVzb2x2ZWRPcHRpb25zKCkucGx1cmFsQ2F0ZWdvcmllcy5sZW5ndGg+MTpuJiZuLm51bWJlcnMubGVuZ3RoPjF9fSx7a2V5OiJnZXRQbHVyYWxGb3Jtc09mS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fTtyZXR1cm4gdGhpcy5nZXRTdWZmaXhlcyh0LG4pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiIuY29uY2F0KGUpLmNvbmNhdCh0KX0pKX19LHtrZXk6ImdldFN1ZmZpeGVzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LHI9dGhpcy5nZXRSdWxlKHQsbik7cmV0dXJuIHI/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/ci5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdbdF0tV1tlXX0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIiLmNvbmNhdChlLm9wdGlvbnMucHJlcGVuZCkuY29uY2F0KHQpfSkpOnIubnVtYmVycy5tYXAoKGZ1bmN0aW9uKHIpe3JldHVybiBlLmdldFN1ZmZpeCh0LHIsbil9KSk6W119fSx7a2V5OiJnZXRTdWZmaXgiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LHI9dGhpcy5nZXRSdWxlKHQsbik7cmV0dXJuIHI/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/IiIuY29uY2F0KHRoaXMub3B0aW9ucy5wcmVwZW5kKS5jb25jYXQoci5zZWxlY3QoZSkpOnRoaXMuZ2V0U3VmZml4UmV0cm9Db21wYXRpYmxlKHIsZSk6KHRoaXMubG9nZ2VyLndhcm4oIm5vIHBsdXJhbCBydWxlIGZvdW5kIGZvcjogIi5jb25jYXQodCkpLCIiKX19LHtrZXk6ImdldFN1ZmZpeFJldHJvQ29tcGF0aWJsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dC5ub0Ficz90LnBsdXJhbHMoZSk6dC5wbHVyYWxzKE1hdGguYWJzKGUpKSxpPXQubnVtYmVyc1tyXTt0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT10Lm51bWJlcnMubGVuZ3RoJiYxPT09dC5udW1iZXJzWzBdJiYoMj09PWk/aT0icGx1cmFsIjoxPT09aSYmKGk9IiIpKTt2YXIgbz1mdW5jdGlvbigpe3JldHVybiBuLm9wdGlvbnMucHJlcGVuZCYmaS50b1N0cmluZygpP24ub3B0aW9ucy5wcmVwZW5kK2kudG9TdHJpbmcoKTppLnRvU3RyaW5nKCl9O3JldHVybiJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/MT09PWk/IiI6Im51bWJlciI9PXR5cGVvZiBpPyJfcGx1cmFsXyIuY29uY2F0KGkudG9TdHJpbmcoKSk6bygpOiJ2MiI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT058fHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PXQubnVtYmVycy5sZW5ndGgmJjE9PT10Lm51bWJlcnNbMF0/bygpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZyLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrci50b1N0cmluZygpOnIudG9TdHJpbmcoKX19LHtrZXk6InNob3VsZFVzZUludGxBcGkiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIVguaW5jbHVkZXModGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKX19XSksdH0oKTtmdW5jdGlvbiBaKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBLKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP1ooT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtsKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpaKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fXZhciBKPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtlKHRoaXMsdCksdGhpcy5sb2dnZXI9bS5jcmVhdGUoImludGVycG9sYXRvciIpLHRoaXMub3B0aW9ucz1uLHRoaXMuZm9ybWF0PW4uaW50ZXJwb2xhdGlvbiYmbi5pbnRlcnBvbGF0aW9uLmZvcm1hdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHRoaXMuaW5pdChuKX1yZXR1cm4gaSh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTt0LmludGVycG9sYXRpb258fCh0LmludGVycG9sYXRpb249e2VzY2FwZVZhbHVlOiEwfSk7dmFyIGU9dC5pbnRlcnBvbGF0aW9uO3RoaXMuZXNjYXBlPXZvaWQgMCE9PWUuZXNjYXBlP2UuZXNjYXBlOk4sdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1lLmVzY2FwZVZhbHVlfHxlLmVzY2FwZVZhbHVlLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1lLnVzZVJhd1ZhbHVlVG9Fc2NhcGUmJmUudXNlUmF3VmFsdWVUb0VzY2FwZSx0aGlzLnByZWZpeD1lLnByZWZpeD9TKGUucHJlZml4KTplLnByZWZpeEVzY2FwZWR8fCJ7eyIsdGhpcy5zdWZmaXg9ZS5zdWZmaXg/UyhlLnN1ZmZpeCk6ZS5zdWZmaXhFc2NhcGVkfHwifX0iLHRoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCIsdGhpcy51bmVzY2FwZVByZWZpeD1lLnVuZXNjYXBlU3VmZml4PyIiOmUudW5lc2NhcGVQcmVmaXh8fCItIix0aGlzLnVuZXNjYXBlU3VmZml4PXRoaXMudW5lc2NhcGVQcmVmaXg/IiI6ZS51bmVzY2FwZVN1ZmZpeHx8IiIsdGhpcy5uZXN0aW5nUHJlZml4PWUubmVzdGluZ1ByZWZpeD9TKGUubmVzdGluZ1ByZWZpeCk6ZS5uZXN0aW5nUHJlZml4RXNjYXBlZHx8UygiJHQoIiksdGhpcy5uZXN0aW5nU3VmZml4PWUubmVzdGluZ1N1ZmZpeD9TKGUubmVzdGluZ1N1ZmZpeCk6ZS5uZXN0aW5nU3VmZml4RXNjYXBlZHx8UygiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9ZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9lLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOmUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPWUubWF4UmVwbGFjZXM/ZS5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9dm9pZCAwIT09ZS5hbHdheXNGb3JtYXQmJmUuYWx3YXlzRm9ybWF0LHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKHQsImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChlLCJnIik7dmFyIG49IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChuLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxzLGE9dGhpcyx1PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBsPWZ1bmN0aW9uKHQpe2lmKHQuaW5kZXhPZihhLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIGk9RShlLHUsdCk7cmV0dXJuIGEuYWx3YXlzRm9ybWF0P2EuZm9ybWF0KGksdm9pZCAwLG4sSyhLKEsoe30sciksZSkse30se2ludGVycG9sYXRpb25rZXk6dH0pKTppfXZhciBvPXQuc3BsaXQoYS5mb3JtYXRTZXBhcmF0b3IpLHM9by5zaGlmdCgpLnRyaW0oKSxjPW8uam9pbihhLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBhLmZvcm1hdChFKGUsdSxzKSxjLG4sSyhLKEsoe30sciksZSkse30se2ludGVycG9sYXRpb25rZXk6c30pKX07dGhpcy5yZXNldFJlZ0V4cCgpO3ZhciBoPXImJnIubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyfHx0aGlzLm9wdGlvbnMubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyLGY9ciYmci5pbnRlcnBvbGF0aW9uJiZ2b2lkIDAhPT1yLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzP3IuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXM6dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO3JldHVyblt7cmVnZXg6dGhpcy5yZWdleHBVbmVzY2FwZSxzYWZlVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIGModCl9fSx7cmVnZXg6dGhpcy5yZWdleHAsc2FmZVZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBhLmVzY2FwZVZhbHVlP2MoYS5lc2NhcGUodCkpOmModCl9fV0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7Zm9yKHM9MDtpPWUucmVnZXguZXhlYyh0KTspe3ZhciBuPWlbMV0udHJpbSgpO2lmKHZvaWQgMD09PShvPWwobikpKWlmKCJmdW5jdGlvbiI9PXR5cGVvZiBoKXt2YXIgdT1oKHQsaSxyKTtvPSJzdHJpbmciPT10eXBlb2YgdT91OiIifWVsc2UgaWYociYmci5oYXNPd25Qcm9wZXJ0eShuKSlvPSIiO2Vsc2V7aWYoZil7bz1pWzBdO2NvbnRpbnVlfWEubG9nZ2VyLndhcm4oIm1pc3NlZCB0byBwYXNzIGluIHZhcmlhYmxlICIuY29uY2F0KG4sIiBmb3IgaW50ZXJwb2xhdGluZyAiKS5jb25jYXQodCkpLG89IiJ9ZWxzZSJzdHJpbmciIT10eXBlb2YgbyYmIWEudXNlUmF3VmFsdWVUb0VzY2FwZSYmKG89eChvKSk7dmFyIGM9ZS5zYWZlVmFsdWUobyk7aWYodD10LnJlcGxhY2UoaVswXSxjKSxmPyhlLnJlZ2V4Lmxhc3RJbmRleCs9by5sZW5ndGgsZS5yZWdleC5sYXN0SW5kZXgtPWlbMF0ubGVuZ3RoKTplLnJlZ2V4Lmxhc3RJbmRleD0wLCsrcz49YS5tYXhSZXBsYWNlcylicmVha319KSksdH19LHtrZXk6Im5lc3QiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30scz1LKHt9LG8pO2Z1bmN0aW9uIGEodCxlKXt2YXIgbj10aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO2lmKHQuaW5kZXhPZihuKTwwKXJldHVybiB0O3ZhciByPXQuc3BsaXQobmV3IFJlZ0V4cCgiIi5jb25jYXQobiwiWyBdKnsiKSkpLGk9InsiLmNvbmNhdChyWzFdKTt0PXJbMF07dmFyIG89KGk9dGhpcy5pbnRlcnBvbGF0ZShpLHMpKS5tYXRjaCgvJy9nKSxhPWkubWF0Y2goLyIvZyk7KG8mJm8ubGVuZ3RoJTI9PTAmJiFhfHxhLmxlbmd0aCUyIT0wKSYmKGk9aS5yZXBsYWNlKC8nL2csJyInKSk7dHJ5e3M9SlNPTi5wYXJzZShpKSxlJiYocz1LKEsoe30sZSkscykpfWNhdGNoKGUpe3JldHVybiB0aGlzLmxvZ2dlci53YXJuKCJmYWlsZWQgcGFyc2luZyBvcHRpb25zIHN0cmluZyBpbiBuZXN0aW5nIGZvciBrZXkgIi5jb25jYXQodCksZSksIiIuY29uY2F0KHQpLmNvbmNhdChuKS5jb25jYXQoaSl9cmV0dXJuIGRlbGV0ZSBzLmRlZmF1bHRWYWx1ZSx0fWZvcihzLmFwcGx5UG9zdFByb2Nlc3Nvcj0hMSxkZWxldGUgcy5kZWZhdWx0VmFsdWU7bj10aGlzLm5lc3RpbmdSZWdleHAuZXhlYyh0KTspe3ZhciB1PVtdLGM9ITE7aWYoLTEhPT1uWzBdLmluZGV4T2YodGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe3ZhciBsPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpfSkpO25bMV09bC5zaGlmdCgpLHU9bCxjPSEwfWlmKChyPWUoYS5jYWxsKHRoaXMsblsxXS50cmltKCkscykscykpJiZuWzBdPT09dCYmInN0cmluZyIhPXR5cGVvZiByKXJldHVybiByOyJzdHJpbmciIT10eXBlb2YgciYmKHI9eChyKSkscnx8KHRoaXMubG9nZ2VyLndhcm4oIm1pc3NlZCB0byByZXNvbHZlICIuY29uY2F0KG5bMV0sIiBmb3IgbmVzdGluZyAiKS5jb25jYXQodCkpLHI9IiIpLGMmJihyPXUucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBpLmZvcm1hdCh0LGUsby5sbmcsSyhLKHt9LG8pLHt9LHtpbnRlcnBvbGF0aW9ua2V5Om5bMV0udHJpbSgpfSkpfSksci50cmltKCkpKSx0PXQucmVwbGFjZShuWzBdLHIpLHRoaXMucmVnZXhwLmxhc3RJbmRleD0wfXJldHVybiB0fX1dKSx0fSgpO2Z1bmN0aW9uIFEodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uICQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/UShPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOlEoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gdHQodCl7dmFyIGU9e307cmV0dXJuIGZ1bmN0aW9uKG4scixpKXt2YXIgbz1yK0pTT04uc3RyaW5naWZ5KGkpLHM9ZVtvXTtyZXR1cm4gc3x8KHM9dChyLGkpLGVbb109cykscyhuKX19dmFyIGV0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtlKHRoaXMsdCksdGhpcy5sb2dnZXI9bS5jcmVhdGUoImZvcm1hdHRlciIpLHRoaXMub3B0aW9ucz1uLHRoaXMuZm9ybWF0cz17bnVtYmVyOnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLk51bWJlckZvcm1hdCh0LGUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5mb3JtYXQodCl9fSkpLGN1cnJlbmN5OnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLk51bWJlckZvcm1hdCh0LCQoJCh7fSxlKSx7fSx7c3R5bGU6ImN1cnJlbmN5In0pKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQpfX0pKSxkYXRldGltZTp0dCgoZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0LCQoe30sZSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5mb3JtYXQodCl9fSkpLHJlbGF0aXZldGltZTp0dCgoZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodCwkKHt9LGUpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQsZS5yYW5nZXx8ImRheSIpfX0pKSxsaXN0OnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLkxpc3RGb3JtYXQodCwkKHt9LGUpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQpfX0pKX0sdGhpcy5pbml0KG4pfXJldHVybiBpKHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319KS5pbnRlcnBvbGF0aW9uO3RoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCJ9fSx7a2V5OiJhZGQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPWV9fSx7a2V5OiJhZGRDYWNoZWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPXR0KGUpfX0se2tleToiZm9ybWF0Iix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLG89ZS5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcikucmVkdWNlKChmdW5jdGlvbih0LGUpe3ZhciBvPWZ1bmN0aW9uKHQpe3ZhciBlPXQudG9Mb3dlckNhc2UoKS50cmltKCksbj17fTtpZih0LmluZGV4T2YoIigiKT4tMSl7dmFyIHI9dC5zcGxpdCgiKCIpO2U9clswXS50b0xvd2VyQ2FzZSgpLnRyaW0oKTt2YXIgaT1yWzFdLnN1YnN0cmluZygwLHJbMV0ubGVuZ3RoLTEpOyJjdXJyZW5jeSI9PT1lJiZpLmluZGV4T2YoIjoiKTwwP24uY3VycmVuY3l8fChuLmN1cnJlbmN5PWkudHJpbSgpKToicmVsYXRpdmV0aW1lIj09PWUmJmkuaW5kZXhPZigiOiIpPDA/bi5yYW5nZXx8KG4ucmFuZ2U9aS50cmltKCkpOmkuc3BsaXQoIjsiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0KXt2YXIgZT1mKHQuc3BsaXQoIjoiKSkscj1lWzBdLGk9ZS5zbGljZSgxKS5qb2luKCI6IikudHJpbSgpLnJlcGxhY2UoL14nK3wnKyQvZywiIik7bltyLnRyaW0oKV18fChuW3IudHJpbSgpXT1pKSwiZmFsc2UiPT09aSYmKG5bci50cmltKCldPSExKSwidHJ1ZSI9PT1pJiYobltyLnRyaW0oKV09ITApLGlzTmFOKGkpfHwobltyLnRyaW0oKV09cGFyc2VJbnQoaSwxMCkpfX0pKX1yZXR1cm57Zm9ybWF0TmFtZTplLGZvcm1hdE9wdGlvbnM6bn19KGUpLHM9by5mb3JtYXROYW1lLGE9by5mb3JtYXRPcHRpb25zO2lmKGkuZm9ybWF0c1tzXSl7dmFyIHU9dDt0cnl7dmFyIGM9ciYmci5mb3JtYXRQYXJhbXMmJnIuZm9ybWF0UGFyYW1zW3IuaW50ZXJwb2xhdGlvbmtleV18fHt9LGw9Yy5sb2NhbGV8fGMubG5nfHxyLmxvY2FsZXx8ci5sbmd8fG47dT1pLmZvcm1hdHNbc10odCxsLCQoJCgkKHt9LGEpLHIpLGMpKX1jYXRjaCh0KXtpLmxvZ2dlci53YXJuKHQpfXJldHVybiB1fXJldHVybiBpLmxvZ2dlci53YXJuKCJ0aGVyZSB3YXMgbm8gZm9ybWF0IGZ1bmN0aW9uIGZvciAiLmNvbmNhdChzKSksdH0pLHQpO3JldHVybiBvfX1dKSx0fSgpO2Z1bmN0aW9uIG50KHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBydCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9udChPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOm50KE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fWZ1bmN0aW9uIGl0KHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1jKHQpO2lmKGUpe3ZhciBpPWModGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHUodGhpcyxuKX19dmFyIG90PWZ1bmN0aW9uKHQpe2Eocix0KTt2YXIgbj1pdChyKTtmdW5jdGlvbiByKHQsaSxzKXt2YXIgYSx1PWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gZSh0aGlzLHIpLGE9bi5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKGEpKSxhLmJhY2tlbmQ9dCxhLnN0b3JlPWksYS5zZXJ2aWNlcz1zLGEubGFuZ3VhZ2VVdGlscz1zLmxhbmd1YWdlVXRpbHMsYS5vcHRpb25zPXUsYS5sb2dnZXI9bS5jcmVhdGUoImJhY2tlbmRDb25uZWN0b3IiKSxhLndhaXRpbmdSZWFkcz1bXSxhLm1heFBhcmFsbGVsUmVhZHM9dS5tYXhQYXJhbGxlbFJlYWRzfHwxMCxhLnJlYWRpbmdDYWxscz0wLGEubWF4UmV0cmllcz11Lm1heFJldHJpZXM+PTA/dS5tYXhSZXRyaWVzOjUsYS5yZXRyeVRpbWVvdXQ9dS5yZXRyeVRpbWVvdXQ+PTE/dS5yZXRyeVRpbWVvdXQ6MzUwLGEuc3RhdGU9e30sYS5xdWV1ZT1bXSxhLmJhY2tlbmQmJmEuYmFja2VuZC5pbml0JiZhLmJhY2tlbmQuaW5pdChzLHUuYmFja2VuZCx1KSxhfXJldHVybiBpKHIsW3trZXk6InF1ZXVlTG9hZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcyxvPXt9LHM9e30sYT17fSx1PXt9O3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPSEwO2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGE9IiIuY29uY2F0KHQsInwiKS5jb25jYXQoZSk7IW4ucmVsb2FkJiZpLnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKHQsZSk/aS5zdGF0ZVthXT0yOmkuc3RhdGVbYV08MHx8KDE9PT1pLnN0YXRlW2FdP3ZvaWQgMD09PXNbYV0mJihzW2FdPSEwKTooaS5zdGF0ZVthXT0xLHI9ITEsdm9pZCAwPT09c1thXSYmKHNbYV09ITApLHZvaWQgMD09PW9bYV0mJihvW2FdPSEwKSx2b2lkIDA9PT11W2VdJiYodVtlXT0hMCkpKX0pKSxyfHwoYVt0XT0hMCl9KSksKE9iamVjdC5rZXlzKG8pLmxlbmd0aHx8T2JqZWN0LmtleXMocykubGVuZ3RoKSYmdGhpcy5xdWV1ZS5wdXNoKHtwZW5kaW5nOnMscGVuZGluZ0NvdW50Ok9iamVjdC5rZXlzKHMpLmxlbmd0aCxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOk9iamVjdC5rZXlzKG8pLHBlbmRpbmc6T2JqZWN0LmtleXMocyksdG9Mb2FkTGFuZ3VhZ2VzOk9iamVjdC5rZXlzKGEpLHRvTG9hZE5hbWVzcGFjZXM6T2JqZWN0LmtleXModSl9fX0se2tleToibG9hZGVkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5zcGxpdCgifCIpLGk9clswXSxvPXJbMV07ZSYmdGhpcy5lbWl0KCJmYWlsZWRMb2FkaW5nIixpLG8sZSksbiYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZUJ1bmRsZShpLG8sbiksdGhpcy5zdGF0ZVt0XT1lPy0xOjI7dmFyIHM9e307dGhpcy5xdWV1ZS5mb3JFYWNoKChmdW5jdGlvbihuKXsoZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dyh0LGUsT2JqZWN0KSxvPWkub2JqLHM9aS5rO29bc109b1tzXXx8W10sciYmKG9bc109b1tzXS5jb25jYXQobikpLHJ8fG9bc10ucHVzaChuKX0pKG4ubG9hZGVkLFtpXSxvKSxmdW5jdGlvbih0LGUpe3ZvaWQgMCE9PXQucGVuZGluZ1tlXSYmKGRlbGV0ZSB0LnBlbmRpbmdbZV0sdC5wZW5kaW5nQ291bnQtLSl9KG4sdCksZSYmbi5lcnJvcnMucHVzaChlKSwwPT09bi5wZW5kaW5nQ291bnQmJiFuLmRvbmUmJihPYmplY3Qua2V5cyhuLmxvYWRlZCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7c1t0XXx8KHNbdF09e30pO3ZhciBlPW4ubG9hZGVkW3RdO2UubGVuZ3RoJiZlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZvaWQgMD09PXNbdF1bZV0mJihzW3RdW2VdPSEwKX0pKX0pKSxuLmRvbmU9ITAsbi5lcnJvcnMubGVuZ3RoP24uY2FsbGJhY2sobi5lcnJvcnMpOm4uY2FsbGJhY2soKSl9KSksdGhpcy5lbWl0KCJsb2FkZWQiLHMpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmRvbmV9KSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTowLG89YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOnRoaXMucmV0cnlUaW1lb3V0LHM9YXJndW1lbnRzLmxlbmd0aD41P2FyZ3VtZW50c1s1XTp2b2lkIDA7cmV0dXJuIHQubGVuZ3RoP3RoaXMucmVhZGluZ0NhbGxzPj10aGlzLm1heFBhcmFsbGVsUmVhZHM/dm9pZCB0aGlzLndhaXRpbmdSZWFkcy5wdXNoKHtsbmc6dCxuczplLGZjTmFtZTpuLHRyaWVkOmksd2FpdDpvLGNhbGxiYWNrOnN9KToodGhpcy5yZWFkaW5nQ2FsbHMrKyx0aGlzLmJhY2tlbmRbbl0odCxlLChmdW5jdGlvbihhLHUpe2lmKHIucmVhZGluZ0NhbGxzLS0sci53YWl0aW5nUmVhZHMubGVuZ3RoPjApe3ZhciBjPXIud2FpdGluZ1JlYWRzLnNoaWZ0KCk7ci5yZWFkKGMubG5nLGMubnMsYy5mY05hbWUsYy50cmllZCxjLndhaXQsYy5jYWxsYmFjayl9YSYmdSYmaTxyLm1heFJldHJpZXM/c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyLnJlYWQuY2FsbChyLHQsZSxuLGkrMSwyKm8scyl9KSxvKTpzKGEsdSl9KSkpOnMobnVsbCx7fSl9fSx7a2V5OiJwcmVwYXJlTG9hZGluZyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7aWYoIXRoaXMuYmFja2VuZClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiTm8gYmFja2VuZCB3YXMgYWRkZWQgdmlhIGkxOG5leHQudXNlLiBXaWxsIG5vdCBsb2FkIHJlc291cmNlcy4iKSxpJiZpKCk7InN0cmluZyI9PXR5cGVvZiB0JiYodD10aGlzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpKSwic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSk7dmFyIG89dGhpcy5xdWV1ZUxvYWQodCxlLHIsaSk7aWYoIW8udG9Mb2FkLmxlbmd0aClyZXR1cm4gby5wZW5kaW5nLmxlbmd0aHx8aSgpLG51bGw7by50b0xvYWQuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5sb2FkT25lKHQpfSkpfX0se2tleToibG9hZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3RoaXMucHJlcGFyZUxvYWRpbmcodCxlLHt9LG4pfX0se2tleToicmVsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse3JlbG9hZDohMH0sbil9fSx7a2V5OiJsb2FkT25lIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiIiLHI9dC5zcGxpdCgifCIpLGk9clswXSxvPXJbMV07dGhpcy5yZWFkKGksbywicmVhZCIsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24ocixzKXtyJiZlLmxvZ2dlci53YXJuKCIiLmNvbmNhdChuLCJsb2FkaW5nIG5hbWVzcGFjZSAiKS5jb25jYXQobywiIGZvciBsYW5ndWFnZSAiKS5jb25jYXQoaSwiIGZhaWxlZCIpLHIpLCFyJiZzJiZlLmxvZ2dlci5sb2coIiIuY29uY2F0KG4sImxvYWRlZCBuYW1lc3BhY2UgIikuY29uY2F0KG8sIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KGkpLHMpLGUubG9hZGVkKHQscixzKX0pKX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTp7fTt0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGUpP3RoaXMubG9nZ2VyLndhcm4oJ2RpZCBub3Qgc2F2ZSBrZXkgIicuY29uY2F0KG4sJyIgYXMgdGhlIG5hbWVzcGFjZSAiJykuY29uY2F0KGUsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpOm51bGw9PW58fCIiPT09bnx8KHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZSh0LGUsbixyLG51bGwscnQocnQoe30sbykse30se2lzVXBkYXRlOml9KSksdCYmdFswXSYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZSh0WzBdLGUsbixyKSl9fV0pLHJ9KHYpO2Z1bmN0aW9uIHN0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdC5ucyYmKHQubnM9W3QubnNdKSwic3RyaW5nIj09dHlwZW9mIHQuZmFsbGJhY2tMbmcmJih0LmZhbGxiYWNrTG5nPVt0LmZhbGxiYWNrTG5nXSksInN0cmluZyI9PXR5cGVvZiB0LmZhbGxiYWNrTlMmJih0LmZhbGxiYWNrTlM9W3QuZmFsbGJhY2tOU10pLHQuc3VwcG9ydGVkTG5ncyYmdC5zdXBwb3J0ZWRMbmdzLmluZGV4T2YoImNpbW9kZSIpPDAmJih0LnN1cHBvcnRlZExuZ3M9dC5zdXBwb3J0ZWRMbmdzLmNvbmNhdChbImNpbW9kZSJdKSksdH1mdW5jdGlvbiBhdCh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gdXQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/YXQoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtsKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTphdChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBjdCh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9Yyh0KTtpZihlKXt2YXIgaT1jKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB1KHRoaXMsbil9fWZ1bmN0aW9uIGx0KCl7fXZhciBodD1mdW5jdGlvbihuKXthKHMsbik7dmFyIHI9Y3Qocyk7ZnVuY3Rpb24gcygpe3ZhciB0LG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYoZSh0aGlzLHMpLHQ9ci5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKHQpKSx0Lm9wdGlvbnM9c3QobiksdC5zZXJ2aWNlcz17fSx0LmxvZ2dlcj1tLHQubW9kdWxlcz17ZXh0ZXJuYWw6W119LGZ1bmN0aW9uKHQpe09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIHRbZV0mJih0W2VdPXRbZV0uYmluZCh0KSl9KSl9KG8odCkpLGkmJiF0LmlzSW5pdGlhbGl6ZWQmJiFuLmlzQ2xvbmUpe2lmKCF0Lm9wdGlvbnMuaW5pdEltbWVkaWF0ZSlyZXR1cm4gdC5pbml0KG4saSksdSh0LG8odCkpO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5pbml0KG4saSl9KSwwKX1yZXR1cm4gdH1yZXR1cm4gaShzLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDsiZnVuY3Rpb24iPT10eXBlb2YgbiYmKHI9bixuPXt9KSwhbi5kZWZhdWx0TlMmJiExIT09bi5kZWZhdWx0TlMmJm4ubnMmJigic3RyaW5nIj09dHlwZW9mIG4ubnM/bi5kZWZhdWx0TlM9bi5uczpuLm5zLmluZGV4T2YoInRyYW5zbGF0aW9uIik8MCYmKG4uZGVmYXVsdE5TPW4ubnNbMF0pKTt2YXIgaT17ZGVidWc6ITEsaW5pdEltbWVkaWF0ZTohMCxuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOlsidHJhbnNsYXRpb24iXSxmYWxsYmFja0xuZzpbImRldiJdLGZhbGxiYWNrTlM6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIG49e307aWYoIm9iamVjdCI9PT10KGVbMV0pJiYobj1lWzFdKSwic3RyaW5nIj09dHlwZW9mIGVbMV0mJihuLmRlZmF1bHRWYWx1ZT1lWzFdKSwic3RyaW5nIj09dHlwZW9mIGVbMl0mJihuLnREZXNjcmlwdGlvbj1lWzJdKSwib2JqZWN0Ij09PXQoZVsyXSl8fCJvYmplY3QiPT09dChlWzNdKSl7dmFyIHI9ZVszXXx8ZVsyXTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKChmdW5jdGlvbih0KXtuW3RdPXJbdF19KSl9cmV0dXJuIG59LGludGVycG9sYXRpb246e2VzY2FwZVZhbHVlOiEwLGZvcm1hdDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdH0scHJlZml4OiJ7eyIsc3VmZml4OiJ9fSIsZm9ybWF0U2VwYXJhdG9yOiIsIix1bmVzY2FwZVByZWZpeDoiLSIsbmVzdGluZ1ByZWZpeDoiJHQoIixuZXN0aW5nU3VmZml4OiIpIixuZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjoiLCIsbWF4UmVwbGFjZXM6MWUzLHNraXBPblZhcmlhYmxlczohMH19O2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQ/ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bmV3IHQ6dDpudWxsfWlmKHRoaXMub3B0aW9ucz11dCh1dCh1dCh7fSxpKSx0aGlzLm9wdGlvbnMpLHN0KG4pKSwidjEiIT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkmJih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbj11dCh1dCh7fSxpLmludGVycG9sYXRpb24pLHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uKSksdm9pZCAwIT09bi5rZXlTZXBhcmF0b3ImJih0aGlzLm9wdGlvbnMudXNlckRlZmluZWRLZXlTZXBhcmF0b3I9bi5rZXlTZXBhcmF0b3IpLHZvaWQgMCE9PW4ubnNTZXBhcmF0b3ImJih0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvcj1uLm5zU2VwYXJhdG9yKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe3ZhciBzO3RoaXMubW9kdWxlcy5sb2dnZXI/bS5pbml0KG8odGhpcy5tb2R1bGVzLmxvZ2dlciksdGhpcy5vcHRpb25zKTptLmluaXQobnVsbCx0aGlzLm9wdGlvbnMpLHRoaXMubW9kdWxlcy5mb3JtYXR0ZXI/cz10aGlzLm1vZHVsZXMuZm9ybWF0dGVyOiJ1bmRlZmluZWQiIT10eXBlb2YgSW50bCYmKHM9ZXQpO3ZhciBhPW5ldyBWKHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgUCh0aGlzLm9wdGlvbnMucmVzb3VyY2VzLHRoaXMub3B0aW9ucyk7dmFyIHU9dGhpcy5zZXJ2aWNlczt1LmxvZ2dlcj1tLHUucmVzb3VyY2VTdG9yZT10aGlzLnN0b3JlLHUubGFuZ3VhZ2VVdGlscz1hLHUucGx1cmFsUmVzb2x2ZXI9bmV3IEgoYSx7cHJlcGVuZDp0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLGNvbXBhdGliaWxpdHlKU09OOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixzaW1wbGlmeVBsdXJhbFN1ZmZpeDp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXh9KSxzJiYoIXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdHx8dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0PT09aS5pbnRlcnBvbGF0aW9uLmZvcm1hdCkmJih1LmZvcm1hdHRlcj1vKHMpLHUuZm9ybWF0dGVyLmluaXQodSx0aGlzLm9wdGlvbnMpLHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdD11LmZvcm1hdHRlci5mb3JtYXQuYmluZCh1LmZvcm1hdHRlcikpLHUuaW50ZXJwb2xhdG9yPW5ldyBKKHRoaXMub3B0aW9ucyksdS51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnRoaXMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQodGhpcyl9LHUuYmFja2VuZENvbm5lY3Rvcj1uZXcgb3Qobyh0aGlzLm1vZHVsZXMuYmFja2VuZCksdS5yZXNvdXJjZVN0b3JlLHUsdGhpcy5vcHRpb25zKSx1LmJhY2tlbmRDb25uZWN0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLGk9MTtpPG47aSsrKXJbaS0xXT1hcmd1bWVudHNbaV07ZS5lbWl0LmFwcGx5KGUsW3RdLmNvbmNhdChyKSl9KSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJih1Lmxhbmd1YWdlRGV0ZWN0b3I9byh0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksdS5sYW5ndWFnZURldGVjdG9yLmluaXQodSx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYodS5pMThuRm9ybWF0PW8odGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLHUuaTE4bkZvcm1hdC5pbml0JiZ1LmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBVKHRoaXMuc2VydmljZXMsdGhpcy5vcHRpb25zKSx0aGlzLnRyYW5zbGF0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLGk9MTtpPG47aSsrKXJbaS0xXT1hcmd1bWVudHNbaV07ZS5lbWl0LmFwcGx5KGUsW3RdLmNvbmNhdChyKSl9KSksdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuaW5pdCYmdC5pbml0KGUpfSkpfWlmKHRoaXMuZm9ybWF0PXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCxyfHwocj1sdCksdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nJiYhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5vcHRpb25zLmxuZyl7dmFyIGM9dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKTtjLmxlbmd0aD4wJiYiZGV2IiE9PWNbMF0mJih0aGlzLm9wdGlvbnMubG5nPWNbMF0pfSF0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJiF0aGlzLm9wdGlvbnMubG5nJiZ0aGlzLmxvZ2dlci53YXJuKCJpbml0OiBubyBsYW5ndWFnZURldGVjdG9yIGlzIHVzZWQgYW5kIG5vIGxuZyBpcyBkZWZpbmVkIik7WyJnZXRSZXNvdXJjZSIsImhhc1Jlc291cmNlQnVuZGxlIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJnZXREYXRhQnlMYW5ndWFnZSJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe2VbdF09ZnVuY3Rpb24oKXt2YXIgbjtyZXR1cm4obj1lLnN0b3JlKVt0XS5hcHBseShuLGFyZ3VtZW50cyl9fSkpO1siYWRkUmVzb3VyY2UiLCJhZGRSZXNvdXJjZXMiLCJhZGRSZXNvdXJjZUJ1bmRsZSIsInJlbW92ZVJlc291cmNlQnVuZGxlIl0uZm9yRWFjaCgoZnVuY3Rpb24odCl7ZVt0XT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPWUuc3RvcmUpW3RdLmFwcGx5KG4sYXJndW1lbnRzKSxlfX0pKTt2YXIgbD1fKCksaD1mdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKHQsbil7ZS5pc0luaXRpYWxpemVkJiYhZS5pbml0aWFsaXplZFN0b3JlT25jZSYmZS5sb2dnZXIud2FybigiaW5pdDogaTE4bmV4dCBpcyBhbHJlYWR5IGluaXRpYWxpemVkLiBZb3Ugc2hvdWxkIGNhbGwgaW5pdCBqdXN0IG9uY2UhIiksZS5pc0luaXRpYWxpemVkPSEwLGUub3B0aW9ucy5pc0Nsb25lfHxlLmxvZ2dlci5sb2coImluaXRpYWxpemVkIixlLm9wdGlvbnMpLGUuZW1pdCgiaW5pdGlhbGl6ZWQiLGUub3B0aW9ucyksbC5yZXNvbHZlKG4pLHIodCxuKX07aWYoZS5sYW5ndWFnZXMmJiJ2MSIhPT1lLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSYmIWUuaXNJbml0aWFsaXplZClyZXR1cm4gdChudWxsLGUudC5iaW5kKGUpKTtlLmNoYW5nZUxhbmd1YWdlKGUub3B0aW9ucy5sbmcsdCl9O3JldHVybiB0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHwhdGhpcy5vcHRpb25zLmluaXRJbW1lZGlhdGU/aCgpOnNldFRpbWVvdXQoaCwwKSxsfX0se2tleToibG9hZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpsdCxyPSJzdHJpbmciPT10eXBlb2YgdD90OnRoaXMubGFuZ3VhZ2U7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPXQpLCF0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHx0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXMpe2lmKHImJiJjaW1vZGUiPT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiBuKCk7dmFyIGk9W10sbz1mdW5jdGlvbih0KXt0JiZlLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuaW5kZXhPZih0KTwwJiZpLnB1c2godCl9KSl9O2lmKHIpbyhyKTtlbHNlIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZykuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIG8odCl9KSk7dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBvKHQpfSkpLHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5sb2FkKGksdGhpcy5vcHRpb25zLm5zLChmdW5jdGlvbih0KXshdCYmIWUucmVzb2x2ZWRMYW5ndWFnZSYmZS5sYW5ndWFnZSYmZS5zZXRSZXNvbHZlZExhbmd1YWdlKGUubGFuZ3VhZ2UpLG4odCl9KSl9ZWxzZSBuKG51bGwpfX0se2tleToicmVsb2FkUmVzb3VyY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9XygpO3JldHVybiB0fHwodD10aGlzLmxhbmd1YWdlcyksZXx8KGU9dGhpcy5vcHRpb25zLm5zKSxufHwobj1sdCksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZCh0LGUsKGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLG4odCl9KSkscn19LHtrZXk6InVzZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYW4gdW5kZWZpbmVkIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtpZighdC50eXBlKXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGEgd3JvbmcgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO3JldHVybiJiYWNrZW5kIj09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5iYWNrZW5kPXQpLCgibG9nZ2VyIj09PXQudHlwZXx8dC5sb2cmJnQud2FybiYmdC5lcnJvcikmJih0aGlzLm1vZHVsZXMubG9nZ2VyPXQpLCJsYW5ndWFnZURldGVjdG9yIj09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yPXQpLCJpMThuRm9ybWF0Ij09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0PXQpLCJwb3N0UHJvY2Vzc29yIj09PXQudHlwZSYmUi5hZGRQb3N0UHJvY2Vzc29yKHQpLCJmb3JtYXR0ZXIiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmZvcm1hdHRlcj10KSwiM3JkUGFydHkiPT09dC50eXBlJiZ0aGlzLm1vZHVsZXMuZXh0ZXJuYWwucHVzaCh0KSx0aGlzfX0se2tleToic2V0UmVzb2x2ZWRMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodCYmdGhpcy5sYW5ndWFnZXMmJiEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKHQpPi0xKSlmb3IodmFyIGU9MDtlPHRoaXMubGFuZ3VhZ2VzLmxlbmd0aDtlKyspe3ZhciBuPXRoaXMubGFuZ3VhZ2VzW2VdO2lmKCEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKG4pPi0xKSYmdGhpcy5zdG9yZS5oYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMobikpe3RoaXMucmVzb2x2ZWRMYW5ndWFnZT1uO2JyZWFrfX19fSx7a2V5OiJjaGFuZ2VMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG89dDt2YXIgcj1fKCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIix0KTt2YXIgaT1mdW5jdGlvbih0KXtuLmxhbmd1YWdlPXQsbi5sYW5ndWFnZXM9bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeSh0KSxuLnJlc29sdmVkTGFuZ3VhZ2U9dm9pZCAwLG4uc2V0UmVzb2x2ZWRMYW5ndWFnZSh0KX0sbz1mdW5jdGlvbihvKXshdCYmIW8mJm4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmKG89W10pO3ZhciBzPSJzdHJpbmciPT10eXBlb2Ygbz9vOm4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRCZXN0TWF0Y2hGcm9tQ29kZXMobyk7cyYmKG4ubGFuZ3VhZ2V8fGkocyksbi50cmFuc2xhdG9yLmxhbmd1YWdlfHxuLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2Uocyksbi5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiZuLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuY2FjaGVVc2VyTGFuZ3VhZ2UocykpLG4ubG9hZFJlc291cmNlcyhzLChmdW5jdGlvbih0KXshZnVuY3Rpb24odCxvKXtvPyhpKG8pLG4udHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShvKSxuLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxuLmVtaXQoImxhbmd1YWdlQ2hhbmdlZCIsbyksbi5sb2dnZXIubG9nKCJsYW5ndWFnZUNoYW5nZWQiLG8pKTpuLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxyLnJlc29sdmUoKGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KSksZSYmZSh0LChmdW5jdGlvbigpe3JldHVybiBuLnQuYXBwbHkobixhcmd1bWVudHMpfSkpfSh0LHMpfSkpfTtyZXR1cm4gdHx8IXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jPyF0JiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYz90aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KG8pOm8odCk6byh0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KCkpLHJ9fSx7a2V5OiJnZXRGaXhlZFQiLHZhbHVlOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT10aGlzLG89ZnVuY3Rpb24gZShuLG8pe3ZhciBzO2lmKCJvYmplY3QiIT09dChvKSl7Zm9yKHZhciBhPWFyZ3VtZW50cy5sZW5ndGgsdT1uZXcgQXJyYXkoYT4yP2EtMjowKSxjPTI7YzxhO2MrKyl1W2MtMl09YXJndW1lbnRzW2NdO3M9aS5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKFtuLG9dLmNvbmNhdCh1KSl9ZWxzZSBzPXV0KHt9LG8pO3MubG5nPXMubG5nfHxlLmxuZyxzLmxuZ3M9cy5sbmdzfHxlLmxuZ3Mscy5ucz1zLm5zfHxlLm5zLHMua2V5UHJlZml4PXMua2V5UHJlZml4fHxyfHxlLmtleVByZWZpeDt2YXIgbD1pLm9wdGlvbnMua2V5U2VwYXJhdG9yfHwiLiIsaD1zLmtleVByZWZpeD8iIi5jb25jYXQocy5rZXlQcmVmaXgpLmNvbmNhdChsKS5jb25jYXQobik6bjtyZXR1cm4gaS50KGgscyl9O3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9vLmxuZz1lOm8ubG5ncz1lLG8ubnM9bixvLmtleVByZWZpeD1yLG99fSx7a2V5OiJ0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLnRyYW5zbGF0b3ImJih0PXRoaXMudHJhbnNsYXRvcikudHJhbnNsYXRlLmFwcGx5KHQsYXJndW1lbnRzKX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYodD10aGlzLnRyYW5zbGF0b3IpLmV4aXN0cy5hcHBseSh0LGFyZ3VtZW50cyl9fSx7a2V5OiJzZXREZWZhdWx0TmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMuZGVmYXVsdE5TPXR9fSx7a2V5OiJoYXNMb2FkZWROYW1lc3BhY2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXRoaXMuaXNJbml0aWFsaXplZClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuZXh0IHdhcyBub3QgaW5pdGlhbGl6ZWQiLHRoaXMubGFuZ3VhZ2VzKSwhMTtpZighdGhpcy5sYW5ndWFnZXN8fCF0aGlzLmxhbmd1YWdlcy5sZW5ndGgpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bi5sYW5ndWFnZXMgd2VyZSB1bmRlZmluZWQgb3IgZW1wdHkiLHRoaXMubGFuZ3VhZ2VzKSwhMTt2YXIgcj10aGlzLnJlc29sdmVkTGFuZ3VhZ2V8fHRoaXMubGFuZ3VhZ2VzWzBdLGk9ISF0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxvPXRoaXMubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VzLmxlbmd0aC0xXTtpZigiY2ltb2RlIj09PXIudG9Mb3dlckNhc2UoKSlyZXR1cm4hMDt2YXIgcz1mdW5jdGlvbih0LG4pe3ZhciByPWUuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5zdGF0ZVsiIi5jb25jYXQodCwifCIpLmNvbmNhdChuKV07cmV0dXJuLTE9PT1yfHwyPT09cn07aWYobi5wcmVjaGVjayl7dmFyIGE9bi5wcmVjaGVjayh0aGlzLHMpO2lmKHZvaWQgMCE9PWEpcmV0dXJuIGF9cmV0dXJuISEodGhpcy5oYXNSZXNvdXJjZUJ1bmRsZShyLHQpfHwhdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmJhY2tlbmR8fHRoaXMub3B0aW9ucy5yZXNvdXJjZXMmJiF0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXN8fHMocix0KSYmKCFpfHxzKG8sdCkpKX19LHtrZXk6ImxvYWROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1fKCk7cmV0dXJuIHRoaXMub3B0aW9ucy5ucz8oInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5vcHRpb25zLm5zLmluZGV4T2YodCk8MCYmbi5vcHRpb25zLm5zLnB1c2godCl9KSksdGhpcy5sb2FkUmVzb3VyY2VzKChmdW5jdGlvbih0KXtyLnJlc29sdmUoKSxlJiZlKHQpfSkpLHIpOihlJiZlKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToibG9hZExhbmd1YWdlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj1fKCk7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pO3ZhciByPXRoaXMub3B0aW9ucy5wcmVsb2FkfHxbXSxpPXQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gci5pbmRleE9mKHQpPDB9KSk7cmV0dXJuIGkubGVuZ3RoPyh0aGlzLm9wdGlvbnMucHJlbG9hZD1yLmNvbmNhdChpKSx0aGlzLmxvYWRSZXNvdXJjZXMoKGZ1bmN0aW9uKHQpe24ucmVzb2x2ZSgpLGUmJmUodCl9KSksbik6KGUmJmUoKSxQcm9taXNlLnJlc29sdmUoKSl9fSx7a2V5OiJkaXIiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHR8fCh0PXRoaXMucmVzb2x2ZWRMYW5ndWFnZXx8KHRoaXMubGFuZ3VhZ2VzJiZ0aGlzLmxhbmd1YWdlcy5sZW5ndGg+MD90aGlzLmxhbmd1YWdlc1swXTp0aGlzLmxhbmd1YWdlKSksIXQpcmV0dXJuInJ0bCI7cmV0dXJuWyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSIsImNrYiJdLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKT4tMXx8dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi1hcmFiIik+MT8icnRsIjoibHRyIn19LHtrZXk6ImNsb25lSW5zdGFuY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpsdCxyPXV0KHV0KHV0KHt9LHRoaXMub3B0aW9ucyksZSkse2lzQ2xvbmU6ITB9KSxpPW5ldyBzKHIpOyh2b2lkIDAhPT1lLmRlYnVnfHx2b2lkIDAhPT1lLnByZWZpeCkmJihpLmxvZ2dlcj1pLmxvZ2dlci5jbG9uZShlKSk7cmV0dXJuWyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXS5mb3JFYWNoKChmdW5jdGlvbihlKXtpW2VdPXRbZV19KSksaS5zZXJ2aWNlcz11dCh7fSx0aGlzLnNlcnZpY2VzKSxpLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saS50cmFuc2xhdG9yPW5ldyBVKGkuc2VydmljZXMsaS5vcHRpb25zKSxpLnRyYW5zbGF0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07aS5lbWl0LmFwcGx5KGksW3RdLmNvbmNhdChuKSl9KSksaS5pbml0KHIsbiksaS50cmFuc2xhdG9yLm9wdGlvbnM9aS5vcHRpb25zLGkudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57b3B0aW9uczp0aGlzLm9wdGlvbnMsc3RvcmU6dGhpcy5zdG9yZSxsYW5ndWFnZTp0aGlzLmxhbmd1YWdlLGxhbmd1YWdlczp0aGlzLmxhbmd1YWdlcyxyZXNvbHZlZExhbmd1YWdlOnRoaXMucmVzb2x2ZWRMYW5ndWFnZX19fV0pLHN9KHYpO2woaHQsImNyZWF0ZUluc3RhbmNlIiwoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGh0KGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSk7dmFyIGZ0PWh0LmNyZWF0ZUluc3RhbmNlKCk7ZnQuY3JlYXRlSW5zdGFuY2U9aHQuY3JlYXRlSW5zdGFuY2UsZnQuY3JlYXRlSW5zdGFuY2UsZnQuaW5pdCxmdC5sb2FkUmVzb3VyY2VzLGZ0LnJlbG9hZFJlc291cmNlcyxmdC51c2UsZnQuY2hhbmdlTGFuZ3VhZ2UsZnQuZ2V0Rml4ZWRULGZ0LnQsZnQuZXhpc3RzLGZ0LnNldERlZmF1bHROYW1lc3BhY2UsZnQuaGFzTG9hZGVkTmFtZXNwYWNlLGZ0LmxvYWROYW1lc3BhY2VzLGZ0LmxvYWRMYW5ndWFnZXM7dmFyIHB0PXtDb25maXJtVG86IkNvbmZpcm0gVG8gIixUZXh0SW5wdXQ6IlRleHQgSW5wdXQiLEF0dHJpYnV0ZToiQXR0cmlidXRlIixOb0F0dHJpYnV0ZToiTm8gQXR0cmlidXRlIixTYXZlOiJTYXZlIixVbmRvOiJVbmRvIixSZWRvOiJSZWRvIixSb3RhdGU6IlJvdGF0ZSIsU3R5bGU6IlN0eWxlIixBZGp1c3Q6IkFkanVzdCIsQm9yZGVyVGhpY2tuZXNzOiJCb3JkZXIgVGhpY2tuZXNzIixDb2xvcjoiQ29sb3IiLEJvcmRlck9wYWNpdHk6IkJvcmRlciBPcGFjaXR5IixGaWxsT3BhY2l0eToiRmlsbCBPcGFjaXR5IixTYXR1cmF0aW9uOiJTYXR1cmF0aW9uIixDb250cmFzdDoiQ29udHJhc3QiLEV4cG9zdXJlOiJFeHBvc3VyZSIsU2NyZWVuUmF0aW86IlNjcmVlbiBSYXRpbyIsT3JpZ2luYWxTY2FsZToiT3JpZ2luYWwgU2NhbGUiLENvcHlUaGVQcmV2aW91czoiQ29weSBQcmV2IixDbGVhckxhYmVsOiJDbGVhciIsU2V0QXNJbnZhbGlkOiJTZXQgQXMgSW52YWxpZCIsU2V0QXNWYWxpZDoiU2V0IEFzIFZhbGlkIixDb25maXJtOiJDb25maXJtIixGaW5pc2g6IkZpbmlzaCIsQ2FuY2VsOiJDYW5jZWwiLEl0ZW1zT2ZUaGlzUGFnZToiSXRlbXMgT2YgVGhpcyBQYWdlIixIb3RrZXlzOiJIb3RrZXlzIixBbm5vdGF0ZVJlY3Q6IkFubm90YXRlIFJlY3QiLEFubm90YXRlSW52YWxpZFJlY3Q6IkFubm90YXRlIEludmFsaWQgUmVjdCIsU2VsZWN0UmVjdDoiU2VsZWN0IFJlY3QiLFJpZ2h0Q2xpY2s6IlJpZ2h0LWNsaWNrIixUb2dnbGVSZWN0RWZmZWN0aXZlbmVzczoiVG9nZ2xlIFJlY3QgVmFsaWRpdHkiLFRvZ2dsZUVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBWYWxpZGl0eSIsRGVsZXRlUmVjdDoiRGVsZXRlIFJlY3QiLFNlbGVjdEFuZERvdWJsZUNsaWNrOiJTZWxlY3QgQW5kIERvdWJsZSBDbGljayIsU2NhbGU6IlNjYWxlIixGdWxsc2NyZWVuOiJGdWxsc2NyZWVuIixQcmV2aW91c0ltYWdlOiJQcmV2aW91cyIsUHJldmlvdXNGaWxlOiJQcmV2aW91cyIsTmV4dEltYWdlOiJOZXh0IixOZXh0RmlsZToiTmV4dCIsUHJldmlvdXNGb2xkZXI6IlByZXZpb3VzIEZvbGRlciIsTmV4dEZvbGRlcjoiTmV4dCBGb2xkZXIiLERyYWc6IkRyYWciLFRvZ2dsZVNlbGVjdGVkOiJUb2dnbGUgU2VsZWN0ZWQiLFRvZ2dsZVNlbGVjdGVkUmV2ZXJzZToiVG9nZ2xlIFNlbGVjdGVkIFJldmVyc2UiLEhpZGVHcmFwaGljczoiSGlkZSBHcmFwaGljcyIsVG9nZ2xlTGluZVBhcnRpY3VsYXJpdHk6IlRvZ2dsZSBMaW5lIFBhcnRpY3VsYXJpdHkiLFRvU2lkZToiVG8gTGluZSIsU3BlY2lmaWVkQXR0cmlidXRlc09ubHk6IlNwZWNpZmllZCBBdHRyaWJ1dGVzIE9ubHkiLE51bWJlcjoiTnVtYmVyIixQcmVzczoiUHJlc3MiLFRvT3JpZ2luYWxTdGVwOiJUbyBPcmlnaW5hbCIsSG9yaXpvbnRhbE9yVmVydGljYWw6Ikhvcml6b250YWwvVmVydGljYWwiLEFubm90YXRlSW52YWxpZExpbmU6IkFubm90YXRlIEludmFsaWQgTGluZSIsQW5ub3RhdGVMaW5lOiJBbm5vdGF0ZSBMaW5lIixTZWxlY3RMaW5lOiJTZWxlY3QgTGluZSIsVG9nZ2xlTGluZUVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBMaW5lIFZhbGlkaXR5IixEZWxldGVMaW5lOiJEZWxldGUgTGluZSIsQ29udGludWVUb0xhYmVsOiJDb250aW51ZSBUbyBMYWJlbCIsU2VsZWN0OiJTZWxlY3QiLEluc2VydFBvaW50OiJJbnNlcnQgUG9pbnQiLENsaWNrT25MaW5lOiJDbGljayBPbiBMaW5lIixEZWxldGVQb2ludDoiRGVsZXRlIFBvaW50IixEYmxDbGlja09uUG9pbnQ6IkRvdWJsZSBDbGljayBPbiBQb2ludCIsU3RvcEFkc29ycHRpb246IlN0b3AgQWRzb3JwdGlvbiIsUHJldmlvdXNMaW5lOiJQcmV2aW91cyBMaW5lIixOZXh0TGluZToiTmV4dCBMaW5lIixTZWxlY3RQb2ludDoiU2VsZWN0IFBvaW50IixBbm5vdGF0ZUludmFsaWRQb2ludDoiQW5ub3RhdGUgSW52YWxpZCBQb2ludCIsQW5ub3RhdGVQb2ludDoiQW5ub3RhdGUgUG9pbnQiLEFubm90YXRlUG9seWdvbjoiQW5ub3RhdGUgUG9seWdvbiIsU2VsZWN0UG9seWdvbjoiU2VsZWN0IFBvbHlnb24iLEFubm90YXRlSW52YWxpZFBvbHlnb246IkFubm90YXRlIEludmFsaWQgUG9seWdvbiIsVG9nZ2xlUG9seWdvbkVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBQb2x5Z29uIFZhbGlkaXR5IixEZWxldGVQb2x5Z29uOiJEZWxldGUgUG9seWdvbiIsRGVsZXRlOiJEZWxldGUiLFRvZ2dsZVBvaW50UGFydGljdWxhcml0eToiVG9nZ2xlIFBvaW50IFBhcnRpY3VsYXJpdHkiLENyb3BPdmVybGFwQXJlYToiQ3JvcCBPdmVybGFwIEFyZWEiLFNlZ21lbnRhdGlvblJlY29nbml0aW9uOiJTZWdtZW50YXRpb24gUmVjb2duaXRpb24iLFN3aXRjaFBhdHRlcm46IlN3aXRjaCBQYXR0ZXJuIixUYWdnaW5nOiJUYWdnaW5nIixIaWRlOiJIaWRlICIsVGFnZ2luZ09yQXR0cjoiVGFnL2F0dHJpYnV0ZSIsSGlkZURyYXduQW5ub3RhdGlvbjoiSGlkZGVuIERyYXduIEFubm90YXRpb24iLEJsdWU6IkJsdWUiLEN5YW46IkN5YW4iLEdyZWVuOiJHcmVlbiIsWWVsbG93OiJZZWxsb3ciLFBpbms6IlBpbmsiLFN0ZXBzOiJTdGVwcyIsRXhwb3J0OiJFeHBvcnQiLE5leHRTdGVwOiJOZXh0IFN0ZXAiLFN0ZXBOb3RGaW5pc2hlZE5vdGlmeToiVGhlcmUgYXJlIHVuYW5ub3RhdGVkIGZpbGVzIGluIHRoZSBjdXJyZW50IHN0ZXAgLCBwbGVhc2UgZmluaXNoIGJlZm9yZSB0aGUgbmV4dCBzdGVwIixjdXJJdGVtczoie3tjdXJyZW50fX0ve3t0b3RhbH19IEl0ZW1zIixUdXJuUGFnZToiVHVybiBQYWdlIixTd2l0Y2g6IlN3aXRjaCIsRW1wdHlUZXh0SW5wdXQ6IkVtcHR5IFRleHQgSW5wdXQiLFJlZ3VsYXJFeHBJbmNvcnJlY3RseToiUmVndWxhciBleHByZXNzaW9uIGlzIGluY29ycmVjdGx5IixOb0NvbmZpZ3VyYXRpb246Ik1pc3NpbmcgQ29uZmlndXJhdGlvbiIsQ2xlYXJUaGlzT3B0aW9uOiJDbGVhciBUaGlzIE9wdGlvbiIsUmVzdG9yZUltYWdlQXR0cmlidXRlczoiUmVzdG9yZSBJbWFnZSBBdHRyaWJ1dGVzIixyZWN0VG9vbDoiUmVjdFRvb2wiLHRhZ1Rvb2w6IlRhZ1Rvb2wiLHBvbHlnb25Ub29sOiJQb2x5Z29uVG9vbCIsbGluZVRvb2w6IkxpbmVUb29sIixwb2ludFRvb2w6IlBvaW50VG9vbCIsdGV4dFRvb2w6IlRleHRUb29sIixTcGVlZDoiU3BlZWQiLFBsYXlQYXVzZToiUGxheSAvIFBhdXNlIixGYXN0Rm9yd2FyZDoiRmFzdCBGb3J3YXJkIixSZXdpbmQ6IlJld2luZCIsdmlkZW9JbnZhbGlkQW5kU2tpcDoiVmlkZW8gaW52YWxpZCwgcGxlYXNlIHNraXAiLGltYWdlSW52YWxpZEFuZFNraXA6IkltYWdlIGludmFsaWQsIHBsZWFzZSBza2lwIix2aWRlb0Vycm9yQW5kUmVsb2FkOiJGYWlsZWQgdG8gbG9hZCB2aWRlbywgcGxlYXNlIHJlbG9hZCIsaW1hZ2VFcnJvckFuZFJlbG9hZDoiRmFpbGVkIHRvIGxvYWQgaW1hZ2UsIHBsZWFzZSByZWxvYWQiLG9yTWFza0FzSW52YWxpZDoiIG9yIG1hc2sgaXQgYXMgaW52YWxpZCIsQ2xpY2tBbm90aGVyUG9seWdvbjoiQ2xpY2sgYW5vdGhlciBwb2x5Z29uIixQb2x5Z29uc1RvQmVDb21iaW5lZE5lZWRUb0JlU2VsZWN0ZWQ6IlBvbHlnb25zIHRvIGJlIGNvbWJpbmVkIG5lZWQgdG8gYmUgc2VsZWN0ZWQiLEN1cnZlTW9kZURvZXNOb3RTdXBwb3J0Q3V0dGluZzoiQ3VydmUgbW9kZSBkb2VzIG5vdCBzdXBwb3J0IGN1dHRpbmciLENvbWJpbmVTdWNjZXNzOiJDb21iaW5lIHN1Y2Nlc3MiLENvbWJpbmluZ0ZhaWxlZE5vdGlmeToiQ29tYmluaW5nIGZhaWxlZC4gUGxlYXNlIGNoZWNrIHdoZXRoZXIgdHdvIHBvbHlnb25zIGludGVyc2VjdCBvciB3aGV0aGVyIHBvbHlnb24gY29tYmluaW5nIGZvcm1zIGEgbGVhayIsQ29tYmluZU92ZXJsYXBBcmVhOiJDb21iaW5lIE92ZXJsYXAgQXJlYSIsTm9EZXBlbmRlbmN5OiJUaGlzIGltYWdlIGRvZXMgbm90IG5lZWQgdG8gYmUgbGFiZWxlZCIsVGV4dENoZWNrTnVtYmVyT25seToiUGxlYXNlIGVudGVyIHRoZSBudW1iZXIiLFRleHRDaGVja0VuZ2xpc2hPbmx5OiJQbGVhc2UgZW50ZXIgRW5nbGlzaCIsVGV4dENoZWNrQ3VzdG9tRm9ybWF0OiJQbGVhc2UgZW50ZXIgZGF0YSBpbiBjdXN0b20gZm9ybWF0IixGcmFtaW5nT2ZPYmplY3RUb0JlRGl2aWRlZDoiUGxlYXNlIGZyYW1lIHRoZSBvYmplY3QgdG8gYmUgZGl2aWRlZCBmaXJzdCIsQ2xpY2tPblRhcmdldDoiUGxlYXNlIGNsaWNrIG9uIHRhcmdldCBvYmplY3QiLFNwbGl0dGluZ0FsZ29yaXRobVByZWRpY3Rpb246IlNwbGl0dGluZyBhbGdvcml0aG0gcHJlZGljdGlvbiBpbiBwcm9ncmVzcy4uLiIsIjJEVmlldyI6IjJEVmlldyIsIjNEVmlldyI6IjNEVmlldyIsVG9wVmlldzoiVG9wVmlldyIsU2lkZVZpZXc6IlNpZGVWaWV3IixCYWNrVmlldzoiQmFja1ZpZXciLFNob3dBcnJvd3M6IlNob3cgQXJyb3dzIixMZW5ndGg6Ikxlbmd0aCIsV2lkdGg6IldpZHRoIixIZWlnaHQ6IkhlaWdodCIsUm90YXRpb25feToiUm90YXRpb25feSIsUG9pbnRDb3VudDoiUG9pbnQgQ291bnQiLEludmFsaWQ6IkludmFsaWQiLFRhZzoiVGFnIixTZWFyY2hUYWc6IlNlYXJjaCB0YWdzIixTdWJBdHRyaWJ1dGU6IlN1YkF0dHJpYnV0ZSIsUGxlYXNlU2VsZWN0OiJQbGVhc2UgU2VsZWN0IixDb3B5RW1wdHlJblBvaW50Q2xvdWQ6IlRoZSBjb3B5IGNvbnRlbnQgaXMgZW1wdHksIHBsZWFzZSBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgY2xvdWQgZGF0YSIsUGFzdGVFbXB0eUluUG9pbnRDbG91ZDoiUGxlYXNlIGNvcHkgdGhlIHBvaW50Q2xvdWQgZGF0YSBiZWZvcmUgcGFzdGluZyIsSGFzRHVwbGljYXRlSUQ6IkR1cGxpY2F0ZSBJRCBleGlzdHMsIGNvcHkgZmFpbGVkIixIYXNEdXBsaWNhdGVJREhlYWRlcjoiVHJhY2tJRCBkdXBsaWNhdGlvbiBleGlzdHMiLEhhc0R1cGxpY2F0ZUlETXNnOiJUaGVyZSBpcyBhbiBpc3N1ZSB3aXRoIGR1cGxpY2F0ZSB0cmFja0lEcywgb3ZlcnJpZGUgaXQ/IixDb3B5U3VjY2VzczoiQ29weSBTdWNjZXNzISIsTG93ZXJMaW1pdFBvaW50c051bUluQm94OiJUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgYm94IG11c3Qgbm90IGJlIGxlc3MgdGhhbiB7e251bX19IixQb2ludFRoaWNrbmVzczoiUG9pbnQgVGhpY2tuZXNzIixSb3RhdGVBcm91bmRDZW50ZXJQb2ludDoiUm90YXRlIEFyb3VuZCBDZW50ZXIgUG9pbnQiLFBvaW50Q2xvdWRWaWV3VHJhbnNsYXRlOiJQb2ludENsb3VkVmlldyBUcmFuc2xhdGlvbiIsVG9wVmlld1RyYW5zbGF0ZToiVG9wVmlldyBUcmFuc2xhdGlvbiIsQ2hhbmdlUG9pbnRDbG91ZFZhbGlkOiJDaGFuZ2UgUG9pbnRDbG91ZCBWYWxpZCIsTGFzc29TZWxlY3RvcjoiTGFzc28iLFJlY3RTZWxlY3RvcjoiUmVjdCIsU2VsZWN0b3JNc2c6IlJpZ2h0LWNsaWNrIGRyYWcgdG8gc2VsZWN0IixBZGRQb2ludDoiQWRkIFBvaW50IixDaXJjbGVTZWxlY3RvcjoiUG9pbnQiLERldGVjdGlvbk1vZGU6IkRldGVjdGlvbk1vZGUiLFNlZ21lbnRhdGlvbk1vZGU6IlNlZ21lbnRhdGlvbk1vZGUiLEVudGVyRWRpdE1vZGU6IkVudGVyIGVkaXQgbW9kZSIsU2VsZWN0ZWRQb2ludHM6IlNlbGVjdGVkIFBvaW50cyIsQ29weUJveDoiQ29weSBCb3giLFBhc3RlQm94OiJQYXN0ZSBCb3giLFJvdGF0ZUxlZnQ6IlJvdGF0ZSBMZWZ0IixSb3RhdGVSaWdodDoiUm90YXRlIFJpZ2h0IixOZXh0Qm94OiJOZXh0IEJveCIsUHJldmlvdXNCb3g6IlByZXZpb3VzIEJveCIsUm90YXRlOTA6IlJvdGF0ZSA5MMKwIixDb3B5UHJldlBhZ2U6IkNvcHkgUHJldmlvdXMgUGFnZSIsQ2hhbmdlQm94VmFsaWQ6IkNoYW5nZSBCb3gncyBWYWxpZCIsTXVsdGlTZWxlY3Q6Ik11bHRpIFNlbGVjdCIsU2VsZWN0QWxsQm94OiJTZWxlY3QgQWxsIEJveGVzIixHZW5lcmFsT3BlcmF0aW9uOiJHZW5lcmFsIE9wZXJhdGlvbiIsUmVjdFBhdHRlcm46IlJlY3QgUGF0dGVybiIsUG9seWdvblBhdHRlcm46IlBvbHlnb24gUGF0dGVybiIsQ2hhbmdlUGF0dGVybk1zZzoiQ2hhbmdlIFBhdHRlcm4gdG8ge3twYXR0ZXJufX0gc3VjY2Vzc2Z1bGx5IixEcmFnT3BlcmF0aW9uOiJEcmFnIixTZWxlY3RlZFN0YXR1czoiU2VsZWN0ZWQiLHVwZGF0ZVZhbGlkRnJvbVZhbGlkVG9JblZhbGlkOiJDb25maXJtIHVwZGF0ZSBhcyBpbnZhbGlkIHBhZ2XvvJ8iLHVwZGF0ZVZhbGlkRnJvbUluVmFsaWRUb1ZhbGlkOiJDb25maXJtIHVwZGF0ZSBhcyB2YWxpZCBwYWdl77yfIixBbGxUcmFja0lEczoiQWxsIFRyYWNrSURzIixDdXJyZW50Qm94VHJhY2tJRHM6IkN1cnJlbnQgVHJhY2tJRCIsUG9zaXRpdmVJbnRlZ2VyQ2hlY2s6IlBsZWFzZSBlbnRlciBhIHBvc2l0aXZlIGludGVnZXIiLE5vdEFsbG93RGVjaW1hbFBvaW50c0luVHJhY2tJRDoiVHJhY2tJRCBpcyBub3QgYWxsb3dlZCB0byBiZSBkZWNpbWFsIixEdXBsaWNhdGVUcmFja0lEc0V4aXN0OiJEdXBsaWNhdGUgdHJhY2tJRHMgZXhpdHMiLEJhdGNoVXBkYXRlVGV4dDoiQmF0Y2ggVXBkYXRlIixCYXRjaFVwZGF0ZVRyYWNrSUQ6IkJhdGNoIHVwZGF0ZSB0cmFja0lEcyIsVHJhY2tJRFVuaWZ5QXM6IlRyYWNrSUQgaXMgVW5pZnkgYXMiLFVuaWZ5VHJhY2tJRFJhbmdlOiJVbmlmeSBUcmFja0lEIFJhbmdlIixQYWdlOiJQYWdlIixPa1RleHQ6Ik9LIixDYW5jZWxUZXh0OiJDYW5jZWwiLFVuaWZ5UGFyYW1zOiJVbmlmeSBQYXJhbXMiLFVuaWZ5QXR0cmlidXRlUmFuZ2U6IlVuaWZ5IFJhbmdlIixVbmlmeVRyYWNrSUQ6IlVuaWZ5IFRyYWNrSUQiLFVuaWZ5U2l6ZToiVW5pZnkgU2l6ZSIsVW5pZnlUYWc6IlVuaWZ5IFRhZyIsTm9EYXRhOiJObyBEYXRhIixBbm5vdGF0ZWRMaXN0OiJBbm5vdGF0ZWQgTGlzdCIsb25EZWxldGVHcmFwaEJ5QXR0cjoiQXJlIHlvdSBzdXJlIHRvIGRlbGV0ZSB0aGUgZGF0YSB3aXRoIGF0dHJpYnV0ZSB7e2F0dHJpYnV0ZX19PyIsQ2FuY2VsRml4ZWQ6IkNhbmNlbCBGaXhlZCIsRml4ZWRPbkxlZnQ6IkZpeGVkIE9uIExlZnQiLEZpeGVkT25SaWdodDoiRml4ZWQgT24gUmlnaHQiLEFubm90YXRlZFJlc3VsdDoiQW5ub3RhdGVkIFJlc3VsdCIsQ29tcGxlbWVudGFyeVRyYWNraW5nOiJDb21wbGVtZW50YXJ5IHRyYWNraW5nIixDb21wbGVtZW50YXJ5VHJhY2tpbmdQcmVkaWN0aW9uOiJDb21wbGVtZW50YXJ5IHRyYWNraW5nIHByZWRpY3Rpb24iLEFwcGx5OiJBcHBseSIsQmVmb3JlUHJlZGljdFN0YXJ0aW5nOiJCZWZvcmUgc3RhcnRpbmcsIHBsZWFzZSBtYXJrIHRoZSBmaXJzdCBhbmQgbGFzdCBib3gsIG5lZWQgdGhlIHNhbWUgdHJhY2tJRCIsVGhlUHJlZGljdGVkUG9pbnRDbG91ZDoiVGhlIHByZWRpY3RlZCBwb2ludCBjbG91ZCBub3cgbmVlZHMgdG8gYmUgbGVzcyB0aGFuIDEwIGZyYW1lcyIsQ2FtZXJhRm9sbG93VG9wVmlldzoiUG9zaXRpb25lZCBieSB0b3AgdmlldyIsTWFya09ubHlPbmU6Ik1hcmsgb25seSBvbmUgZnJhbWUgb2YgZGF0YSwgbmVlZCB0byBtYXJrIHRoZSBmaXJzdCBhbmQgbGFzdCBmcmFtZSBvZiBkYXRhIixIYXZlTm9OZWVkOiJIYXZlIG5vIG5lZWQgdG8gcHJlZGljdCB0aGUgZGF0YSBiZXR3ZWVuIHR3byBmcmFtZXMsIHBsZWFzZSBtYXJrIHRoZSBmaXJzdCBhbmQgbGFzdCBmcmFtZSBmaXJzdCwgYW5kIG5lZWQgdGhlIHNhbWUgc2VyaWFsIG51bWJlciIsUHJlZGljdGluZ0RhdGFGcm9tOiJQcmVkaWN0aW5nIGRhdGEgZnJvbSBwYWdlIHt7c3RhcnRQYWdlfX0gdG8gcGFnZSB7e2VuZFBhZ2V9fSB3aXRoIGJveCBJRCB7e3NlbGVjdGVkQm94VHJhY2tJRH19IixQb2ludENsb3VkQ292ZXJNb2RlOiJXaGVuIHRoZSBzYW1lIHBvaW50IGNsb3VkIGlzIHNlbGVjdGVkLCB0aGUgbGF0ZXIgbWFya2VyIG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIG9uZSIsUG9pbnRDbG91ZFVuY292ZXJNb2RlOiJXaGVuIHRoZSBzYW1lIHBvaW50IGNsb3VkIGlzIHNlbGVjdGVkLCB0aGUgbGF0dGVyIG1hcmtlciBjYW5ub3Qgb3ZlcndyaXRlIHRoZSBmb3JtZXIgbWFya2VyIixQb2ludENsb3VkRm9jdXNNb2RlOiJGb2N1cyBtb2RlIGhhcyBiZWVuIHR1cm5lZCBvbiIsUG9pbnRDbG91ZFVuZm9jdXNNb2RlOiJGb2N1cyBtb2RlIGlzIHR1cm5lZCBvZmYiLFBvaW50Q2xvdWRIaWRlU2VnbWVudDoiTWFya2VkIHBvaW50IGNsb3VkIGlzIGhpZGRlbiIsUG9pbnRDbG91ZFNob3dTZWdtZW50OiJBbGwgcG9pbnQgY2xvdWRzIGhhdmUgYmVlbiBkaXNwbGF5ZWQiLFBvaW50Q2xvdWRIaWRlU2VnbWVudEludmFsaWQ6IlVuYXZhaWxhYmxlIGluIGZvY3VzIG1vZGUiLFBvaW50Q2xvdWRIaWRlRm9jdXNJbnZhbGlkX2hpZGU6IkZvY3VzIG1vZGUgaXMgbm90IGF2YWlsYWJsZSwgcGxlYXNlIHNob3cgdGhlIG1hcmtlZCBwb2ludCBmaXJzdCIsUG9pbnRDbG91ZEhpZGVGb2N1c0ludmFsaWRfbm9uZToiRm9jdXMgbW9kZSBpcyBub3QgYXZhaWxhYmxlLCBwbGVhc2Ugc2VsZWN0IHRoZSBtYXJrZXIgdG8gYmUgZm9jdXNlZCBmaXJzdCIsUGFsZXR0ZToiUGFsZXR0ZSIsRWZmaWNpZW50TGlzdGVuaW5nOiJUaGUgdGFzayBpcyBtYXJrZWQgaW4gdGhlIGVmZmljaWVuY3kgbW9uaXRvcmluZy4uLiIsVGl0bGU6IlRpdGxlIixBbnN3ZXI6IkFuc3dlciIsRmluaXNoZWQ6IkZpbmlzaGVkIixVbmZpbmlzaGVkOiJVbmZpbmlzaGVkIixPdmVyYWxsU2NvcmU6Ik92ZXJhbGxTY29yZSIsTm9TY29yaW5nU2NhbGU6IkNvbmZpZ3VyYWJsZSBzdGVwIGRldGFpbHMgb24gdGhlIGxlZnQiLEJlc3Q6IkJlc3QiLFdvcnN0OiJXb3JzdCIsUmFua2luZ1F1YWxpdHlPZkFuc3dlcnM6IlJhbmtpbmdRdWFsaXR5T2ZBbnN3ZXJzIixUb0JlU29ydGVkOiJUb0JlU29ydGVkIixZZXM6IlllcyIsTm86Ik5vIixBZGRpdGlvbmFsQ29udGVudDoiQWRkaXRpb25hbENvbnRlbnQiLFN1Ym1pdDoiU3VibWl0IixEcmFnQW5kRHJvcDoiRHJhZyBhbmQgZHJhcCIsRGVmYXVsdFNpemU6IkNsaWNrIHRvIHVzZSB0aGUgZGVmYXVsdCBzaXplLiIsTm9ybWFsU2l6ZVJhbmdlOiJOb3JtYWwgc2l6ZSByYW5nZSIsTm9ybWFsQ2VudGVyUG9pbnRSYW5nZToiTm9ybWFsIGNlbnRlciBwb2ludCByYW5nZSIsTG9hZGluZ1RpcHM6IldhaXQgYSBtaW51dGUsIERhdGEgTG9hZGluZyB+IixVbmxvY2tlZDoiVW5sb2NrZWQiLExvY2tlZDoiTG9ja2VkIixMZWFzdENoYXJhY3RlckVycm9yOiJQbGVhc2UgZW50ZXIgYXQgbGVhc3Qge3tudW19fSBjaGFyYWN0ZXJzIixBbmQ6IkFuZCIsT3I6Ik9yIixJbWFnZUxhYmVsczoiSW1hZ2UgbGFiZWxzIiwiM0RSZWN0IjoiM0QgUmVjdCIsIjJEUmVjdCI6IjJEIFJlY3QiLEFkZFBvaW50czoiQUREIixSZW1vdmVQb2ludHM6IlJFTU9WRSIsUmVzZXQ6IlJlc2V0IixQbGVhc2VGcmFtZVRoZU9iamVjdFRvQmVEaXZpZGVkRmlyc3Q6IlBsZWFzZSBmcmFtZSB0aGUgb2JqZWN0IHRvIGJlIGRpdmlkZWQgZmlyc3QiLENsaWNrT25UaGVUYXJnZXRPYmplY3RUb1NwbGl0SXQ6IkNsaWNrIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRvIHNwbGl0IGl0IixDbGlja1RoZVRhcmdldE9iamVjdEFnYWluVG9JbmNyZWFzZVRoZVNlZ21lbnRhdGlvbjoiQ2xpY2sgdGhlIHRhcmdldCBvYmplY3QgYWdhaW4gdG8gaW5jcmVhc2UgdGhlIHNlZ21lbnRhdGlvbiIsQ2xpY2tPblRoZVRhcmdldE9iamVjdFRvRGVsZXRlVGhlU2VnbWVudGF0aW9uOiJDbGljayBvbiB0aGUgdGFyZ2V0IG9iamVjdCB0byBkZWxldGUgdGhlIHNlZ21lbnRhdGlvbiIsQ2xpY2tBZ2Fpbk9uVGhlVGFyZ2V0T2JqZWN0VG9EZWxldGVUaGVTZWdtZW50YXRpb246IkNsaWNrIGFnYWluIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRvIGRlbGV0ZSB0aGUgc2VnbWVudGF0aW9uIixBbnN3ZXJzQXJlQmVpbmdHZW5lcmF0ZWQ6IkFuc3dlcnMgYXJlIGJlaW5nIGdlbmVyYXRlZCIsQW5zd2VyR2VuZXJhdGlvbkZhaWxlZFBsZWFzZVRyeUFnYWluTGF0ZXI6IkFuc3dlciBnZW5lcmF0aW9uIGZhaWxlZCwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciIsUmVHZW5lcmF0ZToiUmUtZ2VuZXJhdGUiLEFuc3dlclRleHRFZGl0OiJBbnN3ZXIgdGV4dCBlZGl0IixTaG93RWRpdGluZ1Jlc3VsdERpZmZlcmVuY2VzSW5UZXh0TW9kZU9ubHk6IlNob3cgZWRpdGluZyByZXN1bHQgZGlmZmVyZW5jZXMgaW4gdGV4dCBtb2RlIG9ubHkiLEF0dHJpYnV0ZUxvY2tOb3RpZnk6IlZpZXcgUHJvcGVydGllc++8mnt7bGFiZWx9fe+8jG9ubHkgZGlzcGxheSB0aGUgYW5ub3RhdGlvbiBjb250ZW50IG9mIHRoZSBzZWxlY3RlZCBwcm9wZXJ0aWVzIixBdWRpb1NlZ21lbnRUaXA6IlBsZWFzZSBzZWxlY3QgdGhlIGRlc2lyZWQgdGltZSBwb2ludCBmb3IgY2FwdHVyZe+8iHt7dGltZX1977yJIixBdWRpb0NvbWJpbmVUaXA6IlBsZWFzZSBjbGljayBvbiB0aGUgaW50ZXJ2YWxzIHlvdSB3aXNoIHRvIG1lcmdlIixDbGlwcGVkQXVkaW86IkNhcHR1cmVkIGNvbnRlbnQiLE5vQ2xpcHBlZERhdGE6Ik5vIGNhcHR1cmVkIGNvbnRlbnQiLENvbXBhcmVUYWdzOiJUYWcgY29tcGFyaXNvbiBkaXNwbGF5IixDb21iaW5lQXVkaW86Ik1lcmdlIGludGVydmFscyIsQ2xpcEF1ZGlvOiJTcGxpdCBpbnRlcnZhbHMiLFN3aXRjaENsaXBNb2RlOiJTd2l0Y2ggdG8gY2FwdHVyZSBtb2RlIixTd2l0Y2hUYWdNb2RlOiJTd2l0Y2ggdG8gdGFnIG1vZGUiLENsaXA6IkNhcHR1cmUiLFByZXZpb3VzSW50ZXJ2YWw6IlByZXZpb3VzIGludGVydmFsIixOZXh0SW50ZXJ2YWw6Ik5leHQgaW50ZXJ2YWwiLERlbGV0ZUNvbW1lbnQ6IkRlbGV0ZSBDb21tZW50cyIsRGVsZXRlQ29tbWVudENvbmZpcm06IkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhbm5vdGF0aW9uPyIsUHJldmlvdXNDb21tZW50OiJQcmV2aW91cyBjb21tZW50IixOZXh0Q29tbWVudDoiTmV4dCBjb21tZW50IixDbGlwU2VsZWN0OiJTZWxlY3QiLCJGb3J3YXJkMC4xIjoiQWR2YW5jZSBieSAwLjEgc2Vjb25kcyIsIkJhY2swLjEiOiJSZXdpbmQgYnkgMC4xIHNlY29uZHMiLExlZnRDbGljazoiTGVmdC1jbGljayIsU2NyaWJibGU6IlNjcmliYmxlIixFcmFzZToiRXJhc2UiLFNjcmliYmxlTGluZToiU2NyaWJibGUgKENvbm5lY3QpIixTdHJva2VFbmxhcmdlOiJTdHJva2UgdG8gZW5sYXJnZSIsU3Ryb2tlUmVkdWN0aW9uOiJTdHJva2UgcmVkdWN0aW9uIix0b2dnbGVTaG93VGV4dDoiVGV4dCBDb21wYXJpc29uIERpc3BsYXkiLENsaXBTbGljZToiVHJpbSBTZWdtZW50IixUaW1lU3RhbXA6IkFkZCBUaW1lc3RhbXAiLENsaXBUaW1lOiJUcmltIFRpbWUiLFN0YW1wVGltZToiVGltZXN0YW1wIFRpbWUiLEdldFN0YXJ0VGltZToiUmV0cmlldmUgU3RhcnQgVGltZSIsR2V0RW5kVGltZToiUmV0cmlldmUgRW5kIFRpbWUiLE91dHB1dERpc3BsYXk6Ik91dHB1dCBkaXNwbGF5IixNYXhpbXVtQ2hhcmFjdGVyRXJyb3I6IlRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjYW5ub3QgZXhjZWVkIHt7bnVtfX0iLENvbW1vblN5bWJvbHM6IkNvbW1vbiBzeW1ib2xzIixCaW5hcnlPcGVyYXRpb25zOiJCaW5hcnkgb3BlcmF0aW9ucyIsQmluYXJ5UmVsYXRpb25zOiJCaW5hcnkgcmVsYXRpb25zIixBcnJvd3M6IkFycm93cyIsT3RoZXJzOiJPdGhlcnMiLEdyZWVrOiJHcmVlayBhbHBoYWJldCIsTG93ZXJjYXNlOiJMb3dlcmNhc2UiLFVwcGVyY2FzZToiVXBwZXJjYXNlIixBZHZhbmNlZE1hdGhlbWF0aWNzOiJBZHZhbmNlZCBtYXRoZW1hdGljcyIsRnJhY3Rpb25hbERpZmZlcmVudGlhdGlvbjoiRnJhY3Rpb25hbCBkaWZmZXJlbnRpYXRpb24iLEZyYWN0aW9uOiJGcmFjdGlvbiIsRGVyaXZhdGl2ZToiRGVyaXZhdGl2ZSIsTW9kdWxhckFyaXRobWV0aWM6Ik1vZHVsYXIgYXJpdGhtZXRpYyIsUmFkaWNhbDoiUmFkaWNhbCIsU3VwQW5kU3ViOiJTdXBlcnNjcmlwdCBhbmQgc3Vic2NyaXB0IixMaW1pdExvZ2FyaXRobToiTGltaXQgbG9nYXJpdGhtIixMaW1pdHM6IkxpbWl0cyIsTG9nYXJpdGhtc0FuZEV4cG9uZW50czoiTG9nYXJpdGhtcyBhbmQgZXhwb25lbnRzIixCb3VuZHM6IkJvdW5kcyIsSW50ZWdyYWxPcGVyYXRpb246IkludGVncmFsIG9wZXJhdGlvbiIsSW50ZWdyYWw6IkludGVncmFsIixEb3VibGVJbnRlZ3JhbDoiRG91YmxlIGludGVncmFsIixUcmlwbGVJbnRlZ3JhbDoiVHJpcGxlIGludGVncmFsIixMYXJnZU9wZXJhdGlvbnM6IkxhcmdlIG9wZXJhdGlvbnMiLFByb2R1Y3RzQW5kQ29wcm9kdWN0czoiUHJvZHVjdHMgYW5kIGNvcHJvZHVjdHMiLEludGVyc2VjdGlvbkFuZFVuaW9uOiJJbnRlcnNlY3Rpb24gYW5kIHVuaW9uIixMaW5lYXJBbGdlYnJhOiJMaW5lYXIgYWxnZWJyYSIsQnJhY2tldEZvcmVuc2ljczoiQnJhY2tldCBmb3JlbnNpY3MiLEJyYWNrZXQ6IkJyYWNrZXQiLENvbW1vbjoiQ29tbW9uIixBcnJheU1hdHJpeDoiQXJyYXkgbWF0cml4IixUcmlnb25vbWV0cmljRnVuY3Rpb25zOiJUcmlnb25vbWV0cmljIGZ1bmN0aW9ucyIsSW52ZXJzZVRyaWdvbm9tZXRyaWNGdW5jdGlvbnM6IkludmVyc2UgdHJpZ29ub21ldHJpYyBmdW5jdGlvbnMiLEh5cGVyYmxpY0Z1bmN0aW9uczoiSHlwZXJibGljIGZ1bmN0aW9ucyIsSW52ZXJzZUh5cGVyYmxpY0Z1bmN0aW9uczoiSW52ZXJzZSBoeXBlcmJsaWMgZnVuY3Rpb25zIixGb3JtdWxhVGVtcGxhdGU6IkZvcm11bGEgdGVtcGxhdGUiLEFsZ2VicmE6IkFsZ2VicmEiLEdlb21ldHJ5OiJHZW9tZXRyeSIsSW5lcXVhbGl0eToiSW5lcXVhbGl0eSIsTWF0cml4OiJNYXRyaXgiLFRyaWFuZ2xlOiJUcmlhbmdsZSIsU3RhdGlzdGljczoiU3RhdGlzdGljcyIsU2VxdWVuY2U6IlNlcXVlbmNlIixQaHlzaWNzOiJQaHlzaWNzIixJbmRpY2F0b3JKdWRnbWVudDoiSW5kaWNhdG9yIGp1ZGdtZW50IixPbmx5Q3VycmVudEZyYW1lOiJPbmx5IGN1cnJlbnQgZnJhbWUiLENsaWNrT25UaGVJZFRvSGlnaGxpZ2h0VGhlTWFya3VwQm94OiJDbGljayBvbiB0aGUgSUQgdG8gaGlnaGxpZ2h0IHRoZSBtYXJrdXAgYm94IixEb3VibGVDbGlja09uVGhlSWRUb0NvbnRpbnVvdXNseUhpZ2hsaWdodEJveGVzQWNyb3NzRnJhbWVzOiJEb3VibGUtY2xpY2sgb24gdGhlIElEIHRvIGNvbnRpbnVvdXNseSBoaWdobGlnaHQgYm94ZXMgYWNyb3NzIGZyYW1lcyIsRmluZFRoZUZyYW1lQ29ycmVzcG9uZGluZ1RvVGhlTGFiZWxlZEZyYW1lSWQ6IkZpbmQgdGhlIGZyYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhYmVsZWQgZnJhbWUgSUQiLEdsb2JhbEFubm90YXRpb246Ikdsb2JhbCBhbm5vdGF0aW9uIixRdWFsaWZpZWRBbm5vdGF0aW9uOiJRdWFsaWZpZWQgYW5ub3RhdGlvbiIsSW52YWxpZFF1ZXN0aW9uQW5kU2tpcDoiSW52YWxpZCBxdWVzdGlvbiwgcGxlYXNlIHNraXAgdGhpcyBxdWVzdGlvbiIsUHJvamVjdGlvbkZyYW1lQ2Fubm90QmVEZWxldGVkOiJQcm9qZWN0aW9uIGZyYW1lIGNhbm5vdCBiZSBkZWxldGVkIixGYWlsZWRUb0NvcHlSZXN1bHRzOiJGYWlsZWQgdG8gY29weSByZXN1bHRzIixQYXJ0aWFsUmVzdWx0c1JlcGxpY2F0aW9uRmFpbHVyZToiUGFydGlhbCByZXN1bHRzIHJlcGxpY2F0aW9uIGZhaWx1cmUiLFJvdGF0aW9uQW5nbGVTZW5zaXRpdml0eToiUm90YXRpb24gYW5nbGUgc2Vuc2l0aXZpdHkiLCIyREltYWdlQmF0Y2giOiIyRCBJbWFnZSBCYXRjaCIsIjJESW1hZ2VCYXRjaENvbm5lY3Rpb24iOiIyRCBJbWFnZSBCYXRjaCBDb25uZWN0aW9uIiwiMkRJbWFnZUJhdGNoRGlzY29ubmVjdGlvbiI6IjJEIEltYWdlIEJhdGNoIERpc2Nvbm5lY3Rpb24iLENvbmZpcm1Ub0JhdGNoQ29ubmVjdDoiQ29uZmlybSBiYXRjaCBjb25uZWN0aW9uPyIsQ29uZmlybVRvQmF0Y2hEaXNjb25uZWN0OiJDb25maXJtIGJhdGNoIGRpc2Nvbm5lY3Rpb24/IixDb25uZWN0OiJDb25uZWN0IixEaXNjb25uZWN0OiJkaXNjb25uZWN0IixJbWFnZTJEQm94U2NhbGU6IkltYWdlIDJEIEJveCBTY2FsZSIsU2VsZWN0ZWRSZWN0OiJTZWxlY3RlZCBSZWN0IixPbmx5TG9hZFRoZUZpcnN0RnJhbWVQcmVBbm5vdGF0aW9uOiJPbmx5IGxvYWQgdGhlIGZpcnN0IGZyYW1lIHByZSBhbm5vdGF0aW9uIixTZWxlY3RCb3hUb0Rpc3BsYXlJbmRlcGVuZGVudGx5OiJTZWxlY3QgYm94IHRvIGRpc3BsYXkgaW5kZXBlbmRlbnRseSIsU2VsZWN0Qm94U3dpdGNoVGlwczoiQWZ0ZXIgdHVybmluZyBvbiB0aGUgc3dpdGNoLCBzZWxlY3QgdGhlIGJveCBpbiB0aGUgdG9wIHZpZXcsIGFuZCB0aGUgaW1hZ2UgdmlldyB3aWxsIG9ubHkgZGlzcGxheSB0aGUgY29ycmVzcG9uZGluZyAyRC8zRCBib3gsIG1ha2luZyBpdCBlYXNpZXIgdG8gdmlldyB0aGUgY29ycmVzcG9uZGluZyByZWxhdGlvbnNoaXAgaW4gdGhlIHRvcCB2aWV3IixTb3J0Q29udmVyc2F0aW9uUXVhbGl0eToiUGxlYXNlIHJhbmsgdGhlIHF1YWxpdHkgb2YgZWFjaCBjb252ZXJzYXRpb24iLERpYWxvZzoiRGlhbG9nIixTZWxlY3Rpb25PZkFubm90YXRpb246IlNlbGVjdGlvbiBvZiBhbm5vdGF0aW9uIixBbm5vdGF0aW5nOiJBbm5vdGF0aW5nIixHcm91cDoiR3JvdXAifSxkdD17VGV4dElucHV0OiLmlofmnKzovpPlhaUiLEF0dHJpYnV0ZToi5Li75bGe5oCnIixOb0F0dHJpYnV0ZToi5peg5bGe5oCnIixTYXZlOiLkv53lrZgiLFVuZG86IuaSpOmUgCIsUmVkbzoi6YeN5YGaIixSb3RhdGU6IuaXi+i9rCIsU3R5bGU6Iuagt+W8jyIsQWRqdXN0OiLlm77niYfosIPmlbQiLEJvcmRlclRoaWNrbmVzczoi6L655qGG57KX57uGIixDb2xvcjoi6aKc6ImyIixCb3JkZXJPcGFjaXR5OiLovrnmoYbpgI/mmI7luqYiLEZpbGxPcGFjaXR5OiLloavlhYXpgI/mmI7luqYiLFNhdHVyYXRpb246IumlseWSjOW6piIsQ29udHJhc3Q6IuWvueavlOW6piIsRXhwb3N1cmU6IuabneWFieW6piIsU2NyZWVuUmF0aW86IueUu+mdouWNoOavlCIsT3JpZ2luYWxTY2FsZToi5oyJ5Y6f5Zu+5q+U5L6L5pi+56S6IixDb3B5VGhlUHJldmlvdXM6IuWkjeWItuS4iuW8oCIsQ2xlYXJMYWJlbDoi5riF56m65qCH5rOoIixTZXRBc0ludmFsaWQ6Iuagh+S4uuaXoOaViCIsU2V0QXNWYWxpZDoi5Y+W5raI5peg5pWIIixDb25maXJtOiLnoa7orqQiLEZpbmlzaDoi5a6M5oiQIixDYW5jZWw6IuWPlua2iCIsSXRlbXNPZlRoaXNQYWdlOiLmnKzpobXku7bmlbAiLEhvdGtleXM6IuW/q+aNt+mUriIsQW5ub3RhdGVSZWN0OiLmi4nmoYYiLEFubm90YXRlSW52YWxpZFJlY3Q6IuaLieaXoOaViOahhiIsU2VsZWN0UmVjdDoi6YCJ5Lit5qGGIixSaWdodENsaWNrOiLlj7Plh7siLFRvZ2dsZVJlY3RFZmZlY3RpdmVuZXNzOiLliIfmjaLmoYbmmK/lkKbmnInmlYgiLFRvZ2dsZUVmZmVjdGl2ZW5lc3M6IuaYr+WQpuagh+S4uuaXoOaViCIsRGVsZXRlUmVjdDoi5Yig6Zmk5qGGIixTZWxlY3RBbmREb3VibGVDbGljazoi6YCJ5Lit5Y+M5Ye7IixTY2FsZToi57yp5pS+IixGdWxsc2NyZWVuOiLlhajlsY8iLFByZXZpb3VzSW1hZ2U6IuS4iuS4gOW8oCIsUHJldmlvdXNGaWxlOiLkuIrkuIDkuKoiLE5leHRJbWFnZToi5LiL5LiA5bygIixOZXh0RmlsZToi5LiL5LiA5LiqIixQcmV2aW91c0ZvbGRlcjoi5LiK5LiA5paH5Lu25aS5IixOZXh0Rm9sZGVyOiLkuIvkuIDmlofku7blpLkiLERyYWc6IuaLluWKqOWbvueJhyIsVG9nZ2xlU2VsZWN0ZWQ6IuWIh+aNoumAieS4rSIsVG9nZ2xlU2VsZWN0ZWRSZXZlcnNlOiLpgIbluo/liIfmjaLpgInkuK0iLEhpZGVHcmFwaGljczoi6ZqQ6JeP5Zu+5b2iIixUb2dnbGVMaW5lUGFydGljdWxhcml0eToi5o2i54m55q6K6L65IixUb1NpZGU6IuWvuei+uSIsU3BlY2lmaWVkQXR0cmlidXRlc09ubHk6IuS7heeci+aMh+WumuWxnuaApyIsTnVtYmVyOiLmlbDlrZciLFByZXNzOiLplb/mjIkiLFRvT3JpZ2luYWxTdGVwOiLku4Xljp/lm74iLEhvcml6b250YWxPclZlcnRpY2FsOiLmoIfmsLTlubMv5Z6C55u057q/IixBbm5vdGF0ZUludmFsaWRMaW5lOiLmoIfml6DmlYjnur8iLEFubm90YXRlTGluZToi5qCH57q/IixTZWxlY3RMaW5lOiLpgInkuK3nur8iLFRvZ2dsZUxpbmVFZmZlY3RpdmVuZXNzOiLliIfmjaLnur/mmK/lkKbmnInmlYgiLERlbGV0ZUxpbmU6IuWIoOmZpOe6vyIsQ29udGludWVUb0xhYmVsOiLnu63moIciLFNlbGVjdDoi6YCJ5LitIixJbnNlcnRQb2ludDoi5o+S5YWl54K5IixDbGlja09uTGluZToi5a+557q/5Y2V5Ye7IixEZWxldGVQb2ludDoi5Yig6Zmk54K5IixEYmxDbGlja09uUG9pbnQ6IuWvueeCueWPjOWHuyIsU3RvcEFkc29ycHRpb246IuaaguWBnOWQuOmZhCIsUHJldmlvdXNMaW5lOiLkuIrmnaHnur8iLE5leHRMaW5lOiLkuIvmnaHnur8iLFNlbGVjdFBvaW50OiLpgInkuK3ngrkiLEFubm90YXRlSW52YWxpZFBvaW50OiLmoIfml6DmlYjngrkiLEFubm90YXRlUG9pbnQ6Iuagh+eCuSIsQW5ub3RhdGVQb2x5Z29uOiLmoIflpJrovrnlvaIiLFNlbGVjdFBvbHlnb246IumAieS4reWkmui+ueW9oiIsQW5ub3RhdGVJbnZhbGlkUG9seWdvbjoi5qCH5peg5pWI5aSa6L655b2iIixUb2dnbGVQb2x5Z29uRWZmZWN0aXZlbmVzczoi5YiH5o2i5aSa6L655b2i5piv5ZCm5pyJ5pWIIixEZWxldGVQb2x5Z29uOiLliKDpmaTlpJrovrnlvaIiLERlbGV0ZToi5Yig6ZmkIixUb2dnbGVQb2ludFBhcnRpY3VsYXJpdHk6IuaNoueJueauiueCuSIsQ3JvcE92ZXJsYXBBcmVhOiLoo4Hliarph43lj6DljLrln58iLFNlZ21lbnRhdGlvblJlY29nbml0aW9uOiLliIblibLovoXliqkiLFN3aXRjaFBhdHRlcm46IuWIh+aNoue7mOWItuW9ouW8jyIsVGFnZ2luZzoi5omT5qCH562+IixIaWRlOiLmiZPmoIfnrb4iLFRhZ2dpbmdPckF0dHI6IuaJk+agh+etvi/lsZ7mgKciLEhpZGVEcmF3bkFubm90YXRpb246Iuagh+azqOmakOiXj+S4rSIsQmx1ZToi6JOdIixDeWFuOiLpnZIiLEdyZWVuOiLnu78iLFllbGxvdzoi6buEIixQaW5rOiLnsokiLFN0ZXBzOiLmoIfms6jmraXpqqQiLEV4cG9ydDoi5a+85Ye6IixOZXh0U3RlcDoi5LiL5LiA5q2lIixTdGVwTm90RmluaXNoZWROb3RpZnk6IuW9k+WJjeatpemqpOWtmOWcqOS4uuacquagh+azqOi/h+eahOWbvueJh++8jOivt+agh+azqOWujOaIkOWGjeeCueWHu+S4i+S4gOatpSIsY3VySXRlbXM6IuesrHt7Y3VycmVudH19L3t7dG90YWx9feWIhumhtSIsVHVyblBhZ2U6Iue/u+mhtSIsU3dpdGNoOiLliIfmjaIiLEVtcHR5VGV4dElucHV0OiLmuIXnqbrmlofmnKzovpPlhaUiLFJlZ3VsYXJFeHBJbmNvcnJlY3RseToi5q2j5YiZ6KGo6L6+5byP5aGr5YaZ6ZSZ6K+vIixOb0NvbmZpZ3VyYXRpb246IuaaguaXoOS/oeaBr+mFjee9riIsQ2xlYXJUaGlzT3B0aW9uOiLmuIXnqbrmraTpgInpobkiLFJlc3RvcmVJbWFnZUF0dHJpYnV0ZXM6Iui/mOWOn+WbvueJh+WxnuaApyIsQ29uZmlybVRvOiLnoa7orqQiLHJlY3RUb29sOiLmoIfnrb4iLHRhZ1Rvb2w6Iuagh+eCuSIscG9seWdvblRvb2w6IuWkmui+ueW9oiIsbGluZVRvb2w6Iue6v+adoSIscG9pbnRUb29sOiLmoIfngrkiLHRleHRUb29sOiLmlofmnKwiLFNwZWVkOiLlgI3pgJ8iLFBsYXlQYXVzZToi5pKt5pS+L+aaguWBnCIsRmFzdEZvcndhcmQ6IuW/q+i/myIsUmV3aW5kOiLlv6vpgIAiLHZpZGVvSW52YWxpZEFuZFNraXA6IuaXoOaViOinhumike+8jOivt+i3s+i/hyIsaW1hZ2VJbnZhbGlkQW5kU2tpcDoi5peg5pWI5Zu+54mH77yM6K+36Lez6L+HIix2aWRlb0Vycm9yQW5kUmVsb2FkOiLop4bpopHliqDovb3lpLHotKUsIOivt+mHjeaWsOWKoOi9vSIsaW1hZ2VFcnJvckFuZFJlbG9hZDoi5Zu+54mH5Yqg6L295aSx6LSlLCDor7fph43mlrDliqDovb0iLG9yTWFza0FzSW52YWxpZDoiIOaIliDlsIblhbbmoIfkuLrml6DmlYgiLENsaWNrQW5vdGhlclBvbHlnb246Iuivt+eCueWHu+W4jOacm+WQiOW5tueahOWkmui+ueW9oiIsUG9seWdvbnNUb0JlQ29tYmluZWROZWVkVG9CZVNlbGVjdGVkOiLpnIDopoHpgInkuK3pnIDopoHlkIjlubbnmoTlpJrovrnlvaIiLEN1cnZlTW9kZURvZXNOb3RTdXBwb3J0Q3V0dGluZzoi5puy57q/5qih5byP5pqC5LiN5pSv5oyB6KOB5YmqIixDb21iaW5lU3VjY2Vzczoi5ZCI5bm25oiQ5YqfIixDb21iaW5pbmdGYWlsZWROb3RpZnk6IuWQiOW5tuWksei0pe+8jOivt+ajgOafpeaYr+WQpuS4pOS4quWkmui+ueW9ouaYr+WQpuacieebuOS6pO+8jOaIluWkmui+ueW9ouWQiOW5tuaYr+WQpuW9ouaIkOa8j+epuiIsQ29tYmluZU92ZXJsYXBBcmVhOiLlkIjlubbph43lj6DljLrln58iLE5vRGVwZW5kZW5jeToi6K+l5Zu+54mH5peg6ZyA5qCH5rOoIixUZXh0Q2hlY2tOdW1iZXJPbmx5OiLor7fmjInku4XmlbDlrZfnmoTmoLzlvI/ovpPlhaUiLFRleHRDaGVja0VuZ2xpc2hPbmx5OiLor7fmjInku4Xoi7HmlofnmoTmoLzlvI/ovpPlhaUiLFRleHRDaGVja0N1c3RvbUZvcm1hdDoi6K+35oyJ6KaB5rGC55qE5qC85byP6L6T5YWlIixGcmFtaW5nT2ZPYmplY3RUb0JlRGl2aWRlZDoi6K+35YWI5qGG5Ye66ZyA5YiG5Ymy55qE54mp5L2TIixDbGlja09uVGFyZ2V0OiLor7fljZXlh7vnm67moIfniankvZMiLFNwbGl0dGluZ0FsZ29yaXRobVByZWRpY3Rpb246IuWIhuWJsueul+azlemihOa1i+S4rS4uLiIsIjJEVmlldyI6IjJE6KeG5Zu+IiwiM0RWaWV3IjoiM0Top4blm74iLFRvcFZpZXc6IuS/r+inhuWbviIsU2lkZVZpZXc6IuS+p+inhuWbviIsQmFja1ZpZXc6IuiDjOinhuWbviIsU2hvd0Fycm93czoi5pi+56S6566t5aS0IixMZW5ndGg6IumVvyIsV2lkdGg6IuWuvSIsSGVpZ2h0OiLpq5giLFJvdGF0aW9uX3k6IuacneWQkeinkiIsUG9pbnRDb3VudDoi54K55pWwIixJbnZhbGlkOiLml6DmlYgiLFRhZzoi5qCH562+IixTZWFyY2hUYWc6IuaQnOe0ouagh+etviIsU3ViQXR0cmlidXRlOiLlia/lsZ7mgKciLFBsZWFzZVNlbGVjdDoi6K+36YCJ5oupIixDb3B5RW1wdHlJblBvaW50Q2xvdWQ6IuWkjeWItuWGheWuueS4uuepuu+8jOivt+mAieaLqeWvueW6lOeahOeCueS6keaVsOaNriIsUGFzdGVFbXB0eUluUG9pbnRDbG91ZDoi6K+35YWI5aSN5Yi26ZyA6KaB55qE54K55LqR5pWw5o2u5YaN6L+b6KGM57KY6LS0IixIYXNEdXBsaWNhdGVJRDoi5a2Y5Zyo6YeN5aSNSUQs5aSN5Yi25aSx6LSlIixIYXNEdXBsaWNhdGVJREhlYWRlcjoi5a2Y5Zyo5qCH5rOo5qGGIElEIOmHjeWkjSIsSGFzRHVwbGljYXRlSURNc2c6IuWtmOWcqOagh+azqOahhiBJRCDph43lpI3nmoTpl67popjvvIzmmK/lkKbopoHopobnm5Y/IixDb3B5U3VjY2Vzczoi5aSN5Yi25oiQ5Yqf77yBIixMb3dlckxpbWl0UG9pbnRzTnVtSW5Cb3g6IuahhuS9k+WGheeCueaVsOS4jeWFgeiuuOS9juS6jiB7e251bX19IOS4qiIsUG9pbnRUaGlja25lc3M6IueCueeahOaYvuekuueyl+e7hiIsUm90YXRlQXJvdW5kQ2VudGVyUG9pbnQ6Iue7leS4reW/g+eCueaXi+i9rOeUu+mdoiIsUG9pbnRDbG91ZFZpZXdUcmFuc2xhdGU6IueCueS6keW5s+enuyIsVG9wVmlld1RyYW5zbGF0ZToi5L+v6KeG5Zu+5bmz56e7IixDaGFuZ2VQb2ludENsb3VkVmFsaWQ6IuWIh+aNoueCueS6keacieaViOaApyIsTGFzc29TZWxlY3Rvcjoi5aWX57SiIixSZWN0U2VsZWN0b3I6IuaLieahhiIsU2VsZWN0b3JNc2c6IuWPs+mUruaLluWKqOi/m+ihjOiMg+WbtOiOt+WPliIsQWRkUG9pbnQ6Iua3u+WKoOeCuSIsQ2lyY2xlU2VsZWN0b3I6IumAieeCuSIsRGV0ZWN0aW9uTW9kZToi5qOA5rWL5qih5byPIixTZWdtZW50YXRpb25Nb2RlOiLliIblibLmqKHlvI8iLEVudGVyRWRpdE1vZGU6Iui/m+WFpee8lui+kSIsU2VsZWN0ZWRQb2ludHM6IumAieS4reeCueaVsCIsQ29weUJveDoi5aSN5Yi25qGGIixQYXN0ZUJveDoi57KY6LS05qGGIixSb3RhdGVMZWZ0OiLlkJHlt6bml4vovazlvq7osIMiLFJvdGF0ZVJpZ2h0OiLlkJHlj7Pml4vovazlvq7osIMiLFByZXZpb3VzQm94OiLkuIrkuIDmoYYiLE5leHRCb3g6IuS4i+S4gOahhiIsUm90YXRlOTA6IuaXi+i9rDkwwrAiLENvcHlQcmV2UGFnZToi5aSN5Yi25LiK5LiA6aG1IixDaGFuZ2VCb3hWYWxpZDoi5YiH5o2i5qCH5rOo5qGG5pyJ5pWI5oCnIixNdWx0aVNlbGVjdDoi5aSa6YCJIixTZWxlY3RBbGxCb3g6IuWFqOmAiSIsR2VuZXJhbE9wZXJhdGlvbjoi6YCa55SoIixSZWN0UGF0dGVybjoi5ouJ5qGG5qih5byPIixQb2x5Z29uUGF0dGVybjoi5aSa6L655b2i5qih5byPIixDaGFuZ2VQYXR0ZXJuTXNnOiLmiJDlip/mm7TmlLnkuLp7e3BhdHRlcm59feaooeW8jyIsRHJhZ09wZXJhdGlvbjoi5ouW5YqoIixTZWxlY3RlZFN0YXR1czoi6YCJ5Lit5pe2Iix1cGRhdGVWYWxpZEZyb21WYWxpZFRvSW5WYWxpZDoi5piv5ZCm56Gu6K6k5qCH5Li65peg5pWI5paH5Lu277yfIix1cGRhdGVWYWxpZEZyb21JblZhbGlkVG9WYWxpZDoi5piv5ZCm56Gu6K6k5Y+W5raI5peg5pWI5paH5Lu277yfIixBbGxUcmFja0lEczoi5omA5pyJ5bey5qCH5rOo55qE5qGGSUQiLEN1cnJlbnRCb3hUcmFja0lEczoi5b2T5YmN5qCH5rOo5qGGSUQiLFBvc2l0aXZlSW50ZWdlckNoZWNrOiLor7fovpPlhaXmraPmlbTmlbAiLE5vdEFsbG93RGVjaW1hbFBvaW50c0luVHJhY2tJRDoi6L6T5YWldHJhY2tJROS4jeWFgeiuuOWMheWQq+Wwj+aVsOeCuSIsRHVwbGljYXRlVHJhY2tJRHNFeGlzdDoi5a2Y5Zyo6YeN5aSN55qEdHJhY2tJRCIsQmF0Y2hVcGRhdGVUZXh0OiLmibnph4/kv67mlLkiLEJhdGNoVXBkYXRlVHJhY2tJRDoi5om56YeP5L+u5pS5SUQiLFRyYWNrSURVbmlmeUFzOiLnu5/kuIDmoIfms6jmoYZJROS4uiIsVW5pZnlUcmFja0lEUmFuZ2U6Iue7n+S4gElE6IyD5Zu0IixQYWdlOiLpobUiLE9rVGV4dDoi56Gu6K6kIixDYW5jZWxUZXh0OiLlj5bmtogiLFVuaWZ5UGFyYW1zOiLnu5/kuIDlj4LmlbAiLFVuaWZ5QXR0cmlidXRlUmFuZ2U6Iue7n+S4gOWxnuaAp+iMg+WbtCIsVW5pZnlUcmFja0lEOiLnu5/kuIDmoIfms6jmoYZJRCIsVW5pZnlTaXplOiLnu5/kuIDlsLrlr7giLFVuaWZ5VGFnOiLnu5/kuIDmoIfnrb4iLE5vRGF0YToi5pqC5peg5pWw5o2uIixBbm5vdGF0ZWRMaXN0OiLmoIfms6jliJfooagiLG9uRGVsZXRlR3JhcGhCeUF0dHI6IuehruWumuimgeWIoOmZpOWxnuaAp+S4uiB7e2F0dHJpYnV0ZX19IOeahOagh+azqOaVsOaNruWQlz8iLENhbmNlbEZpeGVkOiLlj5bmtojlm7rlrpoiLEZpeGVkT25MZWZ0OiLlm7rlrprlnKjlt6bkvqciLEZpeGVkT25SaWdodDoi5Zu65a6a5Zyo5Y+z5L6nIixBbm5vdGF0ZWRSZXN1bHQ6Iuagh+azqOe7k+aenCIsQ29tcGxlbWVudGFyeVRyYWNraW5nOiLooaXlhajot5/ouKoiLENvbXBsZW1lbnRhcnlUcmFja2luZ1ByZWRpY3Rpb246IuihpeWFqOi3n+i4qumihOa1iyIsQXBwbHk6IuW6lOeUqCIsQmVmb3JlUHJlZGljdFN0YXJ0aW5nOiLlkK/liqjliY3vvIzor7flhYjmoIflh7rpppblsL7nmoTmoYbvvIzpnIDlkIzluo/lj7ciLFRoZVByZWRpY3RlZFBvaW50Q2xvdWQ6IueOsOmihOa1i+eCueS6kemcgOimgeWwj+S6jiAxMCDluKciLENhbWVyYUZvbGxvd1RvcFZpZXc6IuaMieS/r+inhuWbvuWumuS9jSIsTWFya09ubHlPbmU6IuS7heagh+azqOS4gOW4p+aVsOaNru+8jOmcgOagh+WHuummluWwvueahOW4p+aVsOaNriIsSGF2ZU5vTmVlZDoi5Lik5bin5LmL6Ze05pqC5peg6ZyA6aKE5rWL55qE5pWw5o2u77yM6K+35YWI5qCH5Ye66aaW5bC+55qE5qGG77yM6ZyA5ZCM5bqP5Y+3IixQcmVkaWN0aW5nRGF0YUZyb206Iuato+WcqOmihOa1i+esrCB7e3N0YXJ0UGFnZX19IOmhteWIsOesrCB7e2VuZFBhZ2V9fSDpobXkuYvpl7TmoYZJROS4uiB7e3NlbGVjdGVkQm94VHJhY2tJRH19IOeahOaVsOaNriIsUG9pbnRDbG91ZENvdmVyTW9kZToi6YCJ5Lit55u45ZCM54K55LqR5pe277yM5ZCO5LiA5qCH6K6w6KaG55uW5YmN5LiA5qCH6K6wIixQb2ludENsb3VkVW5jb3Zlck1vZGU6IumAieS4reebuOWQjOeCueS6keaXtu+8jOWQjuS4gOagh+iusOS4jeWPr+imhuebluWJjeS4gOagh+iusCIsUG9pbnRDbG91ZEZvY3VzTW9kZToi5bey5byA5ZCv6IGa54Sm5qih5byPIixQb2ludENsb3VkVW5mb2N1c01vZGU6IuW3suWFs+mXreiBmueEpuaooeW8jyIsUG9pbnRDbG91ZEhpZGVTZWdtZW50OiLlt7LpmpDol4/moIfms6jngrnkupEiLFBvaW50Q2xvdWRTaG93U2VnbWVudDoi5bey5pi+56S65YWo6YOo54K55LqRIixQb2ludENsb3VkSGlkZVNlZ21lbnRJbnZhbGlkOiLpmpDol4/lt7LmoIfms6jkuI3lj6/nlKjvvIzor7flhYjlhbPpl63ogZrnhKYiLFBvaW50Q2xvdWRIaWRlRm9jdXNJbnZhbGlkX2hpZGU6IuiBmueEpuS4jeWPr+eUqO+8jOivt+WFiOWFs+mXreKAnOmakOiXj+W3suagh+azqOKAnSIsUG9pbnRDbG91ZEhpZGVGb2N1c0ludmFsaWRfbm9uZToi6IGa54Sm5LiN5Y+v55So77yM6K+35YWI6YCJ5oup6ZyA6KaB6IGa54Sm55qE5qCH6K6wIixQYWxldHRlOiLosIPoibLnm5giLEVmZmljaWVudExpc3RlbmluZzoi6K+l5Lu75Yqh5qCH5rOo5pWI546H55uR5o6n5LitLi4uIixUaXRsZToi6aKY55uuIixBbnN3ZXI6IuWbnuetlCIsRmluaXNoZWQ6IuW3suWujOaIkCIsVW5maW5pc2hlZDoi5pyq5a6M5oiQIixPdmVyYWxsU2NvcmU6IuaVtOS9k+ivhOWIhiIsTm9TY29yaW5nU2NhbGU6IuWPr+WcqOW3puS+p+mFjee9ruatpemqpOivpuaDhSIsQmVzdDoi5pyA5aW9IixXb3JzdDoi5pyA5beuIixSYW5raW5nUXVhbGl0eU9mQW5zd2Vyczoi6K+35a+55q+P5Liq5Zue562U55qE6LSo6YeP6L+b6KGM5o6S5bqPIixUb0JlU29ydGVkOiLlvoXmjpLluo8iLFllczoi5pivIixObzoi5ZCmIixBZGRpdGlvbmFsQ29udGVudDoi77yI6YCJ5aGr77yJ6K+35aGr5YaZ5Lu75L2V5L2g5a+5562U5qGI55qE6K+E5Lu35oiW5YW25LuW6KGl5YWF5YaF5a65IixTdWJtaXQ6IuaPkOS6pCIsRHJhZ0FuZERyb3A6IuaMieS9j+aLluWKqCIsRGVmYXVsdFNpemU6IueCueWHu+Wbvuagh+S7peS9v+eUqOm7mOiupOWwuuWvuCIsTm9ybWFsU2l6ZVJhbmdlOiLmraPluLjlsLrlr7jojIPlm7QiLE5vcm1hbENlbnRlclBvaW50UmFuZ2U6Iuato+W4uOS4reW/g+eCueiMg+WbtCIsTG9hZGluZ1RpcHM6IuaVsOaNruWKoOi9veS4rX7or7fnqI3lkI4iLFVubG9ja2VkOiLmnKrlvIDlkK8iLExvY2tlZDoi5bey5byA5ZCvIixMZWFzdENoYXJhY3RlckVycm9yOiLor7foh7PlsJHovpPlhaV7e251bX195Liq5a2X56ymIixBbmQ6IuS4lCIsT3I6IuaIliIsSW1hZ2VMYWJlbHM6IuWbvueJh+agh+azqOeJqSIsIjNEUmVjdCI6IjNEIOahhiIsIjJEUmVjdCI6IjJEIOahhiIsQWRkUG9pbnRzOiLlop7liqAiLFJlbW92ZVBvaW50czoi5Yig5YePIixSZXNldDoi6YeN572uIixQbGVhc2VGcmFtZVRoZU9iamVjdFRvQmVEaXZpZGVkRmlyc3Q6Iuivt+WFiOahhuWHuumcgOWIhuWJsueahOeJqeS9kyIsQ2xpY2tPblRoZVRhcmdldE9iamVjdFRvU3BsaXRJdDoi5Y2V5Ye755uu5qCH54mp5L2T6L+b6KGM5YiG5YmyIixDbGlja1RoZVRhcmdldE9iamVjdEFnYWluVG9JbmNyZWFzZVRoZVNlZ21lbnRhdGlvbjoi5YaN5qyh5Y2V5Ye755uu5qCH54mp5L2T5aKe5Yqg5YiG5YmyIixDbGlja09uVGhlVGFyZ2V0T2JqZWN0VG9EZWxldGVUaGVTZWdtZW50YXRpb246IuWNleWHu+ebruagh+eJqeS9k+WIoOWHj+WIhuWJsiIsQ2xpY2tBZ2Fpbk9uVGhlVGFyZ2V0T2JqZWN0VG9EZWxldGVUaGVTZWdtZW50YXRpb246IuWGjeasoeWNleWHu+ebruagh+eJqeS9k+WIoOWHj+WIhuWJsiIsQW5zd2Vyc0FyZUJlaW5nR2VuZXJhdGVkOiLlm57nrZTnlJ/miJDkuK0iLEFuc3dlckdlbmVyYXRpb25GYWlsZWRQbGVhc2VUcnlBZ2FpbkxhdGVyOiLlm57nrZTnlJ/miJDlpLHotKXvvIzor7fnqI3lkI7ph43or5UiLFJlR2VuZXJhdGU6IumHjeaWsOeUn+aIkCIsQW5zd2VyVGV4dEVkaXQ6IuWbnuetlOaWh+acrOe8lui+kSIsU2hvd0VkaXRpbmdSZXN1bHREaWZmZXJlbmNlc0luVGV4dE1vZGVPbmx5OiLku4XmlofmnKzmqKHlvI/kuIvmmL7npLrnvJbovpHnu5Pmnpzlt67lvIIiLEF0dHJpYnV0ZUxvY2tOb3RpZnk6Iuafpeeci+WxnuaAp++8mnt7bGFiZWx9fe+8jOWPquaYvuekuuaJgOmAieWxnuaAp+eahOagh+azqOWGheWuuSIsQXVkaW9TZWdtZW50VGlwOiLor7fpgInmi6nluIzmnJvmiKrlj5bnmoTml7bpl7TngrnvvIh7e3RpbWV9fe+8iSIsQXVkaW9Db21iaW5lVGlwOiLor7fngrnlh7vluIzmnJvlkIjlubbnmoTljLrpl7QiLENsaXBwZWRBdWRpbzoi5bey5oiq5Y+W6Z+z6aKRIixOb0NsaXBwZWREYXRhOiLmmoLml6DmiKrlj5blhoXlrrkiLENvbXBhcmVUYWdzOiLmoIfnrb7lr7nnhafmmL7npLoiLENvbWJpbmVBdWRpbzoi5ZCI5bm25Yy66Ze0IixDbGlwQXVkaW86IuWIhuWJsuWMuumXtCIsU3dpdGNoQ2xpcE1vZGU6IuWIh+aNouaIquWPluaooeW8jyIsU3dpdGNoVGFnTW9kZToi5YiH5o2i5qCH562+5qih5byPIixDbGlwOiLmiKrlj5YiLFByZXZpb3VzSW50ZXJ2YWw6IuS4iuS4gOWMuumXtCIsTmV4dEludGVydmFsOiLkuIvkuIDljLrpl7QiLERlbGV0ZUNvbW1lbnQ6IuWIoOmZpOaJueazqCIsRGVsZXRlQ29tbWVudENvbmZpcm06IuehruWumuWIoOmZpOivpeadoeagh+azqOWQlyIsUHJldmlvdXNDb21tZW50OiLkuIrkuIDmnaHmibnms6giLE5leHRDb21tZW50OiLkuIvkuIDmnaHmibnms6giLENsaXBTZWxlY3Q6IuaIquWPlumAieS4rSIsIkZvcndhcmQwLjEiOiLliY3ov5swLjFzIiwiQmFjazAuMSI6IuWQjumAgDAuMXMiLExlZnRDbGljazoi5bem5Ye7IixTY3JpYmJsZToi5raC5oq5IixFcmFzZToi5pOm6ZmkIixTY3JpYmJsZUxpbmU6Iua2guaKue+8iOi/nue6v++8iSIsU3Ryb2tlRW5sYXJnZToi56yU6Kem5pS+5aSnIixTdHJva2VSZWR1Y3Rpb246IueslOinpue8qeWwjyIsdG9nZ2xlU2hvd1RleHQ6IuaWh+acrOWvueeFp+aYvuekuiIsQ2xpcFNsaWNlOiLmiKrlj5bniYfmrrUiLFRpbWVTdGFtcDoi5qCH5pe26Ze054K5IixDbGlwVGltZToi5oiq5Y+W5pe26Ze0IixTdGFtcFRpbWU6IuaXtumXtOeCueaXtumXtCIsR2V0U3RhcnRUaW1lOiLojrflj5blvIDlp4vml7bpl7QiLEdldEVuZFRpbWU6IuiOt+WPlue7k+adn+aXtumXtCIsT3V0cHV0RGlzcGxheToi6L6T5Ye65bGV56S6IixNYXhpbXVtQ2hhcmFjdGVyRXJyb3I6IuWtl+espuaVsOS4jeiDvei2hei/h3t7bnVtfX0iLENvbW1vblN5bWJvbHM6IuW4uOeUqOespuWPtyIsQmluYXJ5T3BlcmF0aW9uczoi5LqM5YWD6L+Q566X56ymIixCaW5hcnlSZWxhdGlvbnM6IuS6jOWFg+WFs+ezu+espiIsQXJyb3dzOiLnrq3lpLTnrKblj7ciLE90aGVyczoi5YW25LuW56ym5Y+3IixHcmVlazoi5biM6IWK5a2X5q+NIixMb3dlcmNhc2U6IuWwj+WGmSIsVXBwZXJjYXNlOiLlpKflhpkiLEFkdmFuY2VkTWF0aGVtYXRpY3M6IumrmOetieaVsOWtpiIsRnJhY3Rpb25hbERpZmZlcmVudGlhdGlvbjoi5YiG5pWw5b6u5YiGIixGcmFjdGlvbjoi5YiG5pWwIixEZXJpdmF0aXZlOiLlr7zmlbAiLE1vZHVsYXJBcml0aG1ldGljOiLmqKHnrpfmnK8iLFJhZGljYWw6IuagueW8jyIsU3VwQW5kU3ViOiLkuIrkuIvmoIciLExpbWl0TG9nYXJpdGhtOiLmnoHpmZDlr7nmlbAiLExpbWl0czoi5p6B6ZmQIixMb2dhcml0aG1zQW5kRXhwb25lbnRzOiLlr7nmlbDmjIfmlbAiLEJvdW5kczoi55WM6ZmQIixJbnRlZ3JhbE9wZXJhdGlvbjoi56ev5YiG6L+Q566XIixJbnRlZ3JhbDoi56ev5YiGIixEb3VibGVJbnRlZ3JhbDoi5Y+M6YeN56ev5YiGIixUcmlwbGVJbnRlZ3JhbDoi5LiJ6YeN56ev5YiGIixMYXJnZU9wZXJhdGlvbnM6IuWkp+Wei+i/kOeulyIsUHJvZHVjdHNBbmRDb3Byb2R1Y3RzOiLkuZjnp6/kvZnnp68iLEludGVyc2VjdGlvbkFuZFVuaW9uOiLkuqTpm4blubbpm4YiLExpbmVhckFsZ2VicmE6Iue6v+aAp+S7o+aVsCIsQnJhY2tldEZvcmVuc2ljczoi5ous5Y+35Y+W6K+BIixCcmFja2V0OiLmi6zlj7ciLENvbW1vbjoi5bi455SoIixBcnJheU1hdHJpeDoi5pWw57uE55+p6Zi1IixUcmlnb25vbWV0cmljRnVuY3Rpb25zOiLkuInop5Llh73mlbAiLEludmVyc2VUcmlnb25vbWV0cmljRnVuY3Rpb25zOiLlj43kuInop5Llh73mlbAiLEh5cGVyYmxpY0Z1bmN0aW9uczoi5Y+M5puy5Ye95pWwIixJbnZlcnNlSHlwZXJibGljRnVuY3Rpb25zOiLlj43lj4zmm7Llh73mlbAiLEZvcm11bGFUZW1wbGF0ZToi5YWs5byP5qih5p2/IixBbGdlYnJhOiLku6PmlbAiLEdlb21ldHJ5OiLlh6DkvZUiLEluZXF1YWxpdHk6IuS4jeetieW8jyIsTWF0cml4OiLnn6npmLUiLFRyaWFuZ2xlOiLkuInop5IiLFN0YXRpc3RpY3M6Iue7n+iuoSIsU2VxdWVuY2U6IuaVsOWIlyIsUGh5c2ljczoi54mp55CGIixJbmRpY2F0b3JKdWRnbWVudDoi5oyH5qCH5Yik5patIixPbmx5Q3VycmVudEZyYW1lOiLlj6rnnIvlvZPliY3luKciLENsaWNrT25UaGVJZFRvSGlnaGxpZ2h0VGhlTWFya3VwQm94OiLngrnlh7tJROWPr+S7pemrmOS6ruagh+azqOahhiIsRG91YmxlQ2xpY2tPblRoZUlkVG9Db250aW51b3VzbHlIaWdobGlnaHRCb3hlc0Fjcm9zc0ZyYW1lczoi5Y+M5Ye7SUTlj6/ku6Xot6jluKfov57nu63pq5jkuq7moIfms6jmoYYiLEZpbmRUaGVGcmFtZUNvcnJlc3BvbmRpbmdUb1RoZUxhYmVsZWRGcmFtZUlkOiLmn6Xmib7moIfms6jmoYZJROWvueW6lOW4pyIsR2xvYmFsQW5ub3RhdGlvbjoi5YWo5bGA5qCH5rOoIixRdWFsaWZpZWRBbm5vdGF0aW9uOiLpmZDlrprmoIfms6giLEludmFsaWRRdWVzdGlvbkFuZFNraXA6IuaXoOaViOmimOebru+8jOivt+i3s+i/h+atpOmimCIsUHJvamVjdGlvbkZyYW1lQ2Fubm90QmVEZWxldGVkOiLmipXlsITmoYbml6Dms5XliKDpmaQiLEZhaWxlZFRvQ29weVJlc3VsdHM6IuWkjeWItue7k+aenOWksei0pSIsUGFydGlhbFJlc3VsdHNSZXBsaWNhdGlvbkZhaWx1cmU6IumDqOWIhue7k+aenOWkjeWItuWksei0pSIsUm90YXRpb25BbmdsZVNlbnNpdGl2aXR5OiLml4vovazlvq7osIPop5LluqYiLCIyREltYWdlQmF0Y2giOiIyROWbvueJh+aJuemHjyIsIjJESW1hZ2VCYXRjaENvbm5lY3Rpb24iOiIyROWbvueJh+aJuemHj+i/nuaOpSIsIjJESW1hZ2VCYXRjaERpc2Nvbm5lY3Rpb24iOiIyROWbvueJh+aJuemHj+aWreW8gCIsQ29uZmlybVRvQmF0Y2hDb25uZWN0OiLnoa7orqTmibnph4/ov57mjqXvvJ8iLENvbmZpcm1Ub0JhdGNoRGlzY29ubmVjdDoi56Gu6K6k5om56YeP5pat5byA77yfIixDb25uZWN0OiLov57mjqUiLERpc2Nvbm5lY3Q6IuaWreW8gCIsSW1hZ2UyREJveFNjYWxlOiLlm77niYcyROahhuS9k+e8qeWwj+WkhOeQhiIsU2VsZWN0ZWRSZWN0OiLpgInkuK3moYbkvZMiLE9ubHlMb2FkVGhlRmlyc3RGcmFtZVByZUFubm90YXRpb246IuS7hei9veWFpeesrOS4gOW4p+mihOagh+azqCIsU2VsZWN0Qm94VG9EaXNwbGF5SW5kZXBlbmRlbnRseToi6YCJ5Lit5qGG54us56uL5pi+56S6IixTZWxlY3RCb3hTd2l0Y2hUaXBzOiLlvIDlkK/lvIDlhbPlkI7vvIzpgInkuK3kv6/op4blm77nmoTmoYbkvZPvvIzlm77niYfop4blm77ku4XmmL7npLrlr7nlupTnmoQyRC8zROahhuS9k++8jOS+v+S6juafpeeci+S/r+inhuWbvueahOWvueW6lOWFs+ezuyIsU29ydENvbnZlcnNhdGlvblF1YWxpdHk6Iuivt+Wvueavj+e7hOWvueivneeahOi0qOmHj+i/m+ihjOaOkuW6jyIsRGlhbG9nOiLlr7nor50iLFNlbGVjdGlvbk9mQW5ub3RhdGlvbjoi6YCJ5Lit5qCH5rOoIixBbm5vdGF0aW5nOiLmraPlnKjmoIfms6giLEdyb3VwOiLnu4QifTtmdC5sYW5ndWFnZXx8ZnQuaW5pdCh7bG5nOiJlbiIsaW50ZXJwb2xhdGlvbjp7ZXNjYXBlVmFsdWU6ITF9fSksZnQuYWRkUmVzb3VyY2VCdW5kbGUoImVuIiwidHJhbnNsYXRpb24iLHB0LCEwKSxmdC5hZGRSZXNvdXJjZUJ1bmRsZSgiY24iLCJ0cmFuc2xhdGlvbiIsZHQsITApO2NvbnN0IGd0PXswOjAsMTouMiwzOi40LDU6LjYsNzouOCw5OjEsMTA6MX0seXQ9ezA6MCwxOjAsMzouMiw1Oi40LDc6LjYsOTouOCwxMDoxfSxtdD1jbGFzc3tzdGF0aWMgcmdiYVN0cmluZ1RvSGV4KHQpe2NvbnN0IGU9dC5zdWJzdHJpbmcoNSx0Lmxlbmd0aC0xKS5yZXBsYWNlKC8gL2csIiIpLnNwbGl0KCIsIiksbj1wYXJzZUludChlWzBdKSxyPXBhcnNlSW50KGVbMV0pLGk9cGFyc2VJbnQoZVsyXSksbz1wYXJzZUZsb2F0KGVbM10pO3JldHVybiIjIituLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikrci50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpK2kudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKStNYXRoLnJvdW5kKDI1NSpvKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfX07bGV0IHZ0PW10O3Z0LnJlcGxhY2VBRnJvbVJHQkE9KHQsZSk9PnQuc3BsaXQoIiAiKS5qb2luKCIiKS5yZXBsYWNlKC8sWzAtOV0rKFsuXXsxfVswLTldKyl7MCwxfVwpLyxgLCR7ZS50b0ZpeGVkKDIpfSlgKSx2dC50b1JHQkFBcnI9dD0+e2NvbnN0IGU9dC5tYXRjaCgvXGQrL2cpO2lmKGUpe2NvbnN0W3QsbixyLGldPWU7cmV0dXJuW3QsbixyLGldfX0sdnQuZ2V0VG9vbFN0cm9rZUFuZEZpbGw9KHQsZSk9Pntjb25zdHtob3ZlcjpuPSExLHNlbGVjdGVkOnI9ITEsYm9yZGVyT3BhY2l0eTppPTEsZmlsbE9wYWNpdHk6bz0xLGNvbW1vbk9wYWNpdHk6cz0uOH09ZTtyZXR1cm4gcnx8bj97c3Ryb2tlOm10LnJlcGxhY2VBRnJvbVJHQkEodCxpKSxmaWxsOm10LnJlcGxhY2VBRnJvbVJHQkEodCxvKSxyZ2JhOm10LnRvUkdCQUFycih0KX06e3N0cm9rZTptdC5yZXBsYWNlQUZyb21SR0JBKHQsaSpzKSxmaWxsOm10LnJlcGxhY2VBRnJvbVJHQkEodCxvKnMpLHJnYmE6bXQudG9SR0JBQXJyKHQpfX0sdnQuZ2V0U3Ryb2tlQW5kRmlsbD0odCxlPTEsbj0xKT0+KHtzdHJva2U6bXQucmVwbGFjZUFGcm9tUkdCQSh0LGUpLGZpbGw6bXQucmVwbGFjZUFGcm9tUkdCQSh0LG4pfSksdnQuZ2V0VG9vbENvbG9yTGlzdD0odCxlPTksbj05KT0+e2NvbnN0IHI9Z3RbZV0saT15dFtuXTtyZXR1cm57dmFsaWQ6bXQuZ2V0U3Ryb2tlQW5kRmlsbCh0LDEqciwuNCppKSxpbnZhbGlkOm10LmdldFN0cm9rZUFuZEZpbGwoSXQsMSpyLC44KmkpLHZhbGlkU2VsZWN0ZWQ6bXQuZ2V0U3Ryb2tlQW5kRmlsbCh0LDEqciwuOCppKSxpbnZhbGlkU2VsZWN0ZWQ6bXQuZ2V0U3Ryb2tlQW5kRmlsbChJdCwxKnIsLjI0KmkpLHZhbGlkSG92ZXI6bXQuZ2V0U3Ryb2tlQW5kRmlsbCh0LDEqciwuNjQqaSksaW52YWxpZEhvdmVyOm10LmdldFN0cm9rZUFuZEZpbGwoSXQsMSpyLC40KmkpfX0sdnQuZ2V0QXR0cmlidXRlSW5kZXg9KHQsZSk9Pnt0cnl7cmV0dXJuIGUuZmluZEluZGV4KChlPT5lLnZhbHVlPT09dCkpfWNhdGNoKHQpe3JldHVybi0xfX07dmFyIF90PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSx4dD1PYmplY3QuZGVmaW5lUHJvcGVydGllcyx3dD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxidD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLER0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksRXQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxDdD0odCxlLG4pPT5lIGluIHQ/X3QodCxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpufSk6dFtlXT1uO2NvbnN0IFN0PVsicmdiYSgxMDIsIDExMSwgMjU1LCAxKSIsInJnYmEoMTAyLCAyMzAsIDI1NSwgMSkiLCJyZ2JhKDE5MSwgMjU1LCAxMDIsIDEpIiwicmdiYSgyNTUsIDIzMCwgMTAyLCAxKSIsInJnYmEoMjMwLCAxMDIsIDI1NSwgMSkiXSxBdD1bInJnYmEoMTI4LCAxMiwgMjQ5LCAxKSIsInJnYmEoMCwgMjU1LCA0OCwgMSkiLCJyZ2JhKDI1NSwgMTM2LCAyNDcsIDEpIiwicmdiYSgyNTUsIDIyNiwgNTAsIDEpIiwicmdiYSgxNTMsIDY2LCAyMywgMSkiLCJyZ2JhKDIsIDEzMCwgMjUwLCAxKSIsInJnYmEoMjU1LCAzNSwgMzUsIDEpIiwicmdiYSgwLCAyNTUsIDIzNCwgMSkiXSxOdD1be3JnYmE6InJnYmEoMTI4LCAxMiwgMjQ5LCAxKSIsaGV4OjgzOTE5Mjl9LHtyZ2JhOiJyZ2JhKDAsIDI1NSwgNDgsIDEpIixoZXg6NjUzMjh9LHtyZ2JhOiJyZ2JhKDI1NSwgMTM2LCAyNDcsIDEpIixoZXg6MTY3NDY3NDN9LHtyZ2JhOiJyZ2JhKDI1NSwgMjI2LCA1MCwgMSkiLGhleDoxNjc2OTU4Nn0se3JnYmE6InJnYmEoMTUzLCA2NiwgMjMsIDEpIixoZXg6MTAwNDM5Mjd9LHtyZ2JhOiJyZ2JhKDIsIDEzMCwgMjUwLCAxKSIsaGV4OjE2NDYwMn0se3JnYmE6InJnYmEoMjU1LCAzNSwgMzUsIDEpIixoZXg6MTY3MjA2NzV9LHtyZ2JhOiJyZ2JhKDAsIDI1NSwgMjM0LCAxKSIsaGV4OjY1NTE0fV0sSXQ9InJnYmEoMjU1LCAxNTMsIDEwMiwgMSkiLE10PSJyZ2JhKDIwNCwgMjA0LCAyMDQsIDEpIjshZnVuY3Rpb24oKXtsZXQgdDtjb25zdCBlPW5ldyBBcnJheSgyNTYpLmZpbGwoIiIpLm1hcCgodD0+bmV3IEFycmF5KDMpLmZpbGwoIiIpKSk7Zm9yKGxldCBuPTA7bjwyMDtuKyspe2Zvcih0PTA7dDwzMjt0KyspZVt0XVswXT0xMjgrNCp0LGVbdF1bMV09MCxlW3RdWzJdPTA7Zm9yKGVbMzJdWzBdPTI1NSxlWzMyXVsxXT0wLGVbMzJdWzJdPTAsdD0wO3Q8NjM7dCsrKWVbMzMrdF1bMF09MjU1LGVbMzMrdF1bMV09NCs0KnQsZVszMyt0XVsyXT0wO2ZvcihlWzk2XVswXT0yNTQsZVs5Nl1bMV09MjU1LGVbOTZdWzJdPTIsdD0wO3Q8NjI7dCsrKWVbOTcrdF1bMF09MjUwLTQqdCxlWzk3K3RdWzFdPTI1NSxlWzk3K3RdWzJdPTYrNCp0O2ZvcihlWzE1OV1bMF09MSxlWzE1OV1bMV09MjU1LGVbMTU5XVsyXT0yNTQsdD0wO3Q8NjQ7dCsrKWVbMTYwK3RdWzBdPTAsZVsxNjArdF1bMV09MjUyLTQqdCxlWzE2MCt0XVsyXT0yNTU7Zm9yKHQ9MDt0PDMyO3QrKyllWzIyNCt0XVswXT0wLGVbMjI0K3RdWzFdPTAsZVsyMjQrdF1bMl09MjUyLTQqdH19KCk7dmFyIEZ0PW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2RlZmF1bHRDb2xvcnM9U3QsdGhpcy5fYXR0cmlidXRlQ29sb3JzPUF0fWdldCBkZWZhdWx0Q29sb3JzKCl7cmV0dXJuIHRoaXMuX2RlZmF1bHRDb2xvcnN9Z2V0IGF0dHJpYnV0ZUNvbG9ycygpe3JldHVybiB0aGlzLl9hdHRyaWJ1dGVDb2xvcnN9Z2V0Q29sb3JGcm9tQ29uZmlnKHQsZSxuLHIpe3ZhciBpLG8scyxhLHU7aWYoIltvYmplY3QgT2JqZWN0XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpdGhyb3ciQ29uZmlnIG11c3QgYmUgT2JqZWN0IjtpZigiW29iamVjdCBPYmplY3RdIiE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSl0aHJvdyJSZXN1bHQgbXVzdCBiZSBPYmplY3QiO2NvbnN0e2JvcmRlck9wYWNpdHk6Yz0xLGZpbGxPcGFjaXR5Omw9LjYsY29sb3JJbmRleDpoPTB9PW47cnx8KHI9e30pO2NvbnN0IGY9bnVsbD09KGk9bnVsbD09dD92b2lkIDA6dC52YWxpZCl8fGkse211bHRpQ29sb3JJbmRleDpwPS0xLHNlbGVjdGVkOmQsaG92ZXI6Z309cix5PXtzZWxlY3RlZDpkLGhvdmVyOmcsYm9yZGVyT3BhY2l0eTpjLGZpbGxPcGFjaXR5Omx9O2xldCBtPXRoaXMuZGVmYXVsdENvbG9ycztpZigoITA9PT0obnVsbD09ZT92b2lkIDA6ZS5hdHRyaWJ1dGVDb25maWd1cmFibGUpfHxwPi0xKSYmKG09dGhpcy5hdHRyaWJ1dGVDb2xvcnMpLCExPT09ZilyZXR1cm4gdnQuZ2V0VG9vbFN0cm9rZUFuZEZpbGwoSXQseSk7aWYoITA9PT0obnVsbD09ZT92b2lkIDA6ZS5hdHRyaWJ1dGVDb25maWd1cmFibGUpKXtjb25zdCBuPXZ0LmdldEF0dHJpYnV0ZUluZGV4KG51bGw9PXQ/dm9pZCAwOnQuYXR0cmlidXRlLG51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlTGlzdCk7bGV0IHI9bnVsbD09KHM9bnVsbD09KG89bnVsbD09ZT92b2lkIDA6ZS5hdHRyaWJ1dGVMaXN0KT92b2lkIDA6by5maW5kKChlPT5lLnZhbHVlPT09KG51bGw9PXQ/dm9pZCAwOnQuYXR0cmlidXRlKSkpKT92b2lkIDA6cy5jb2xvcixpPSIiOyFyJiYtMSE9PW4mJihyPW1bbiVtLmxlbmd0aF0pLC0xPT09biYmKHI9TXQpLGk9dnQucmdiYVN0cmluZ1RvSGV4KHIpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpO2NvbnN0IGM9cGFyc2VJbnQoaSwxNiksbD1udWxsIT0odT1udWxsPT0oYT1OdFtuJW0ubGVuZ3RoXSk/dm9pZCAwOmEuaGV4KT91OiIiO3JldHVybigodCxlKT0+eHQodCx3dChlKSkpKCgodCxlKT0+e2Zvcih2YXIgbiBpbiBlfHwoZT17fSkpRHQuY2FsbChlLG4pJiZDdCh0LG4sZVtuXSk7aWYoYnQpZm9yKHZhciBuIG9mIGJ0KGUpKUV0LmNhbGwoZSxuKSYmQ3QodCxuLGVbbl0pO3JldHVybiB0fSkoe30sdnQuZ2V0VG9vbFN0cm9rZUFuZEZpbGwocix5KSkse2hleDpjfHxsfSl9cmV0dXJuIHA+LTE/dnQuZ2V0VG9vbFN0cm9rZUFuZEZpbGwobVtwJW0ubGVuZ3RoXSx5KTp2dC5nZXRUb29sU3Ryb2tlQW5kRmlsbChtW2glbS5sZW5ndGhdLHkpfWdldENvbG9yQnlDb25maWcoe2F0dHJpYnV0ZTp0LGNvbmZpZzplLHN0eWxlOm59KXt2YXIgcixpLG87aWYoITA9PT0obnVsbD09ZT92b2lkIDA6ZS5hdHRyaWJ1dGVDb25maWd1cmFibGUpKXtjb25zdCBzPW51bGw9PShpPW51bGw9PShyPW51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlTGlzdCk/dm9pZCAwOnIuZmluZCgoZT0+ZS52YWx1ZT09PXQpKSk/dm9pZCAwOmkuY29sb3I7aWYocylyZXR1cm4gdnQuZ2V0VG9vbENvbG9yTGlzdChzLG51bGw9PW4/dm9pZCAwOm4uYm9yZGVyT3BhY2l0eSxudWxsPT1uP3ZvaWQgMDpuLmZpbGxPcGFjaXR5KTtpZihudWxsPT1uP3ZvaWQgMDpuLmF0dHJpYnV0ZUNvbG9yKXtjb25zdCByPXZ0LmdldEF0dHJpYnV0ZUluZGV4KHQsbnVsbCE9KG89bnVsbD09ZT92b2lkIDA6ZS5hdHRyaWJ1dGVMaXN0KT9vOltdKSU4KzE7cmV0dXJuIG4uYXR0cmlidXRlQ29sb3Jbcl19fWlmKG4pe2NvbnN0e2NvbG9yOnQsdG9vbENvbG9yOmV9PW47aWYoZSlyZXR1cm4gZVt0XX1yZXR1cm4gdnQuZ2V0VG9vbENvbG9yTGlzdChNdCl9fSxUdD1PYmplY3QuZGVmaW5lUHJvcGVydHksT3Q9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxMdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFB0PU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsUnQ9KHQsZSxuKT0+ZSBpbiB0P1R0KHQsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOnRbZV09bixCdD0odCxlKT0+e2Zvcih2YXIgbiBpbiBlfHwoZT17fSkpTHQuY2FsbChlLG4pJiZSdCh0LG4sZVtuXSk7aWYoT3QpZm9yKHZhciBuIG9mIE90KGUpKVB0LmNhbGwoZSxuKSYmUnQodCxuLGVbbl0pO3JldHVybiB0fSxrdD0odCxlKT0+e3ZhciBuPXt9O2Zvcih2YXIgciBpbiB0KUx0LmNhbGwodCxyKSYmZS5pbmRleE9mKHIpPDAmJihuW3JdPXRbcl0pO2lmKG51bGwhPXQmJk90KWZvcih2YXIgciBvZiBPdCh0KSllLmluZGV4T2Yocik8MCYmUHQuY2FsbCh0LHIpJiYobltyXT10W3JdKTtyZXR1cm4gbn07Y29uc3QgenQ9InN0ZXBfMSIsanQ9Y2xhc3N7c3RhdGljIGdlbkNvbG9yQnlDb29yZCh0LGUsbil7cmV0dXJuIG48PTA/WzEyOCwxMjgsMTI4XTpuPDU/WzI1NSwwLDBdOm48MTA/WzAsMjU1LDBdOlswLDAsMjU1XX1zdGF0aWMgZ2V0U3RhbmRhcmRDb2xvckJ5Q29vcmQodCxlLG4pe3JldHVybiB0aGlzLmdlbkNvbG9yQnlDb29yZCh0LGUsbikubWFwKCh0PT50LzI1NSkpfXN0YXRpYyBwYXJzZVBvaW50Q2xvdWRDdXJyZW50UmVzdWx0KHQpe3ZhciBlLG4scixpLG8scyxhLHU7Y29uc3QgYz10aGlzLmpzb25QYXJzZXIodCksbD1udWxsIT0oZT1udWxsPT1jP3ZvaWQgMDpjW3p0XSk/ZTp7fSxoPW51bGwhPShuPW51bGw9PWw/dm9pZCAwOmwucmVzdWx0KT9uOltdLGY9bnVsbCE9KGk9bnVsbCE9KHI9bnVsbD09bD92b2lkIDA6bC5yZXN1bHRQb2x5Z29uKT9yOm51bGw9PWw/dm9pZCAwOmwucmVuZGVyUG9seWdvbik/aTpbXSxwPW51bGwhPShvPW51bGw9PWw/dm9pZCAwOmwucmVzdWx0TGluZSk/bzpbXSxkPW51bGwhPShzPW51bGw9PWw/dm9pZCAwOmwucmVzdWx0UG9pbnQpP3M6W10sZz1udWxsIT0oYT1udWxsPT1sP3ZvaWQgMDpsLnNlZ21lbnRhdGlvbik/YTpbXSx5PW51bGwhPSh1PW51bGw9PWw/dm9pZCAwOmwucmVzdWx0UmVjdCk/dTpbXTtyZXR1cm57Ym94UGFyYW1zTGlzdDpoLmZpbHRlcigodD0+IXRoaXMuaGFzRXJyb3JWYWx1ZU9iaih0KSkpLHBvbHlnb25MaXN0OmYsbGluZUxpc3Q6cCxzcGhlcmVQYXJhbXNMaXN0OmQsc2VnbWVudGF0aW9uOmcscmVjdExpc3Q6eX19c3RhdGljIGhhc0Vycm9yVmFsdWVPYmoodCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbnVsbD09dHx8TnVtYmVyLmlzTmFOKHQpfXJldHVybiBmdW5jdGlvbiB0KG4pe2lmKCJvYmplY3QiIT10eXBlb2Ygbnx8bnVsbD09PW4pcmV0dXJuIGUobik7Zm9yKGNvbnN0IHIgaW4gbil7Y29uc3QgaT1uW3JdO2lmKGUoaSl8fCJvYmplY3QiPT10eXBlb2YgaSYmdChpKSlyZXR1cm4hMH1yZXR1cm4hMX0odCl9c3RhdGljIGdldEJveFBhcmFtc0Zyb21SZXN1bHRMaXN0KHQpe2NvbnN0e2JveFBhcmFtc0xpc3Q6ZX09dGhpcy5wYXJzZVBvaW50Q2xvdWRDdXJyZW50UmVzdWx0KHQpO3JldHVybiBlfXN0YXRpYyBnZXRSZWN0UGFyYW1zRnJvbVJlc3VsdExpc3QodCl7dmFyIGUsbjtjb25zdCByPXRoaXMuanNvblBhcnNlcih0KTtyZXR1cm4gbnVsbCE9KG49bnVsbD09KGU9bnVsbD09cj92b2lkIDA6clt6dF0pP3ZvaWQgMDplLnJlc3VsdFJlY3QpP246W119c3RhdGljIGdldFNwaGVyZVBhcmFtc0Zyb21SZXN1bHRMaXN0KHQpe3ZhciBlLG47Y29uc3Qgcj10aGlzLmpzb25QYXJzZXIodCk7cmV0dXJuIG51bGwhPShuPW51bGw9PShlPW51bGw9PXI/dm9pZCAwOnJbenRdKT92b2lkIDA6ZS5yZXN1bHRQb2ludCk/bjpbXX1zdGF0aWMgZ2V0U2VnbWVudEZyb21SZXN1bHRMaXN0KHQpe3ZhciBlLG47Y29uc3Qgcj10aGlzLmpzb25QYXJzZXIodCk7cmV0dXJuIG51bGwhPShuPW51bGw9PShlPW51bGw9PXI/dm9pZCAwOnJbenRdKT92b2lkIDA6ZS5zZWdtZW50YXRpb24pP246W119c3RhdGljIGdldExpbmVMaXN0RnJvbVJlc3VsdExpc3QodCl7dmFyIGUsbjtjb25zdCByPXRoaXMuanNvblBhcnNlcih0KTtyZXR1cm4gbnVsbCE9KG49bnVsbD09KGU9bnVsbD09cj92b2lkIDA6clt6dF0pP3ZvaWQgMDplLnJlc3VsdExpbmUpP246W119c3RhdGljIGdldFBvbHlnb25MaXN0RnJvbVJlc3VsdExpc3QodCl7dmFyIGUsbixyLGk7Y29uc3Qgbz10aGlzLmpzb25QYXJzZXIodCk7cmV0dXJuIG51bGwhPShpPW51bGwhPShyPW51bGw9PShlPW51bGw9PW8/dm9pZCAwOm9benRdKT92b2lkIDA6ZS5yZXN1bHRQb2x5Z29uKT9yOm51bGw9PShuPW51bGw9PW8/dm9pZCAwOm9benRdKT92b2lkIDA6bi5yZW5kZXJQb2x5Z29uKT9pOltdfXN0YXRpYyBnZXRGcm9udFZpZXdQb2x5Z29uKHQpe2NvbnN0e2NlbnRlcjp7eDplLHk6bix6OnJ9LHdpZHRoOmksaGVpZ2h0Om8sZGVwdGg6c309dDtyZXR1cm5be3g6ZStpLzIseTpuK28vMix6OnItcy8yfSx7eDplK2kvMix5Om4rby8yLHo6citzLzJ9LHt4OmUraS8yLHk6bi1vLzIsejpyK3MvMn0se3g6ZStpLzIseTpuLW8vMix6OnItcy8yfSx7eDplK2kvMix5Om4rby8yLHo6ci1zLzJ9XX1zdGF0aWMgZ2V0QmFja1ZpZXdQb2x5Z29uKHQpe2NvbnN0e2NlbnRlcjp7eDplLHk6bix6OnJ9LHdpZHRoOmksaGVpZ2h0Om8sZGVwdGg6c309dDtyZXR1cm5be3g6ZS1pLzIseTpuLW8vMix6OnItcy8yfSx7eDplLWkvMix5Om4rby8yLHo6ci1zLzJ9LHt4OmUtaS8yLHk6bitvLzIsejpyK3MvMn0se3g6ZS1pLzIseTpuLW8vMix6OnIrcy8yfSx7eDplLWkvMix5Om4tby8yLHo6ci1zLzJ9XX1zdGF0aWMgZ2V0QWxsRGlyZWN0aW9uTGluZSh0KXtjb25zdHtjZW50ZXI6e3g6ZSx5Om4sejpyfSx3aWR0aDppLGhlaWdodDpvLGRlcHRoOnN9PXQ7cmV0dXJuW1t7eDplK2kvMix5Om4tby8yLHo6ci1zLzJ9LHt4OmUtaS8yLHk6bi1vLzIsejpyLXMvMn1dLFt7eDplK2kvMix5Om4rby8yLHo6ci1zLzJ9LHt4OmUtaS8yLHk6bitvLzIsejpyLXMvMn1dLFt7eDplK2kvMix5Om4tby8yLHo6citzLzJ9LHt4OmUtaS8yLHk6bi1vLzIsejpyK3MvMn1dLFt7eDplK2kvMix5Om4rby8yLHo6citzLzJ9LHt4OmUtaS8yLHk6bitvLzIsejpyK3MvMn1dXX1zdGF0aWMgZ2V0QWxsVmlld0RhdGEodCl7cmV0dXJuW3t0eXBlOiJwb2x5Z29uIixwb2ludExpc3Q6dGhpcy5nZXRGcm9udFZpZXdQb2x5Z29uKHQpfSx7dHlwZToicG9seWdvbiIscG9pbnRMaXN0OnRoaXMuZ2V0QmFja1ZpZXdQb2x5Z29uKHQpfSwuLi50aGlzLmdldEFsbERpcmVjdGlvbkxpbmUodCkubWFwKCh0PT4oe3R5cGU6ImxpbmUiLHBvaW50TGlzdDp0fSkpKV19c3RhdGljIHRyYW5zZmVyQm94MktpdHRpKHQpe3ZhciBlLG4scjtyZXR1cm57aGVpZ2h0Om51bGwhPShlPXQuZGVwdGgpP2U6MCxsZW5ndGg6bnVsbCE9KG49dC53aWR0aCk/bjowLHdpZHRoOm51bGwhPShyPXQuaGVpZ2h0KT9yOjAscm90YXRpb25feTp0LnJvdGF0aW9uP3RoaXMudHJhbnNmZXJSb3RhdGlvbjJLaXR0aVJvdGF0aW9uX3kodC5yb3RhdGlvbik6MH19c3RhdGljIHJlc3RyaWN0QW5nbGVSYW5nZSh0KXtjb25zdCBlPTIqTWF0aC5QSTtsZXQgbj10JWU7cmV0dXJuIG48MD9lK246bn1zdGF0aWMgdHJhbnNmZXJSb3RhdGlvbjJLaXR0aVJvdGF0aW9uX3kodCl7aWYodDwwKXJldHVybi10O2NvbnN0IGU9MipNYXRoLlBJLXQ7cmV0dXJuIGU+TWF0aC5QSSYmZTwyKk1hdGguUEk/LTEqdDoyKk1hdGguUEktdH1zdGF0aWMgZ2V0QWxsUG9pbnRDbG91ZFJlc3VsdCh7aW1nTGlzdDp0LHN0ZXA6ZT0xLGV4dHJhQm94TGlzdDpuLGV4dHJhU3BoZXJlTGlzdDpyPVtdLGlnbm9yZUluZGV4TGlzdDppPVtdLGlzUHJlUmVzdWx0Om89ITF9KXtjb25zdCBzPXQuZmlsdGVyKCgodCxlKT0+IShudWxsPT1pP3ZvaWQgMDppLmluY2x1ZGVzKGUpKSkpLm1hcCgodD0+e3ZhciBlO3JldHVybiB0aGlzLmpzb25QYXJzZXIobnVsbCE9KGU9bnVsbD09dD92b2lkIDA6dFtvPyJwcmVSZXN1bHQiOiJyZXN1bHQiXSk/ZToiIil9KSksYT1gc3RlcF8ke2V9YDtsZXQgdT1bXTtyZXR1cm4gcy5mb3JFYWNoKCh0PT57dmFyIGUsbjsobnVsbD09KG49bnVsbD09KGU9bnVsbD09dD92b2lkIDA6dFthXSk/dm9pZCAwOmUucmVzdWx0KT92b2lkIDA6bi5sZW5ndGgpPjAmJih1PXUuY29uY2F0KHRbYV0ucmVzdWx0KSl9KSksbiYmKHU9dS5jb25jYXQobikpLHImJih1PXUuY29uY2F0KHIpKSx1fXN0YXRpYyBnZXRJbmRleEJ5VHJhY2tJRCh0LGUsbil7Y29uc3Qgcj1bXSxpPWUubWFwKCh0PT57dmFyIGU7cmV0dXJuIHRoaXMuanNvblBhcnNlcihudWxsIT0oZT1udWxsPT10P3ZvaWQgMDp0W24/InByZVJlc3VsdCI6InJlc3VsdCJdKT9lOiIiKX0pKTtyZXR1cm4gaS5mb3JFYWNoKCgoZSxuKT0+e3ZhciBpO2NvbnN0IG89bnVsbD09KGk9bnVsbD09ZT92b2lkIDA6ZS5zdGVwXzEpP3ZvaWQgMDppLnJlc3VsdDsobnVsbD09bz92b2lkIDA6by5sZW5ndGgpPjAmJihudWxsPT1vP3ZvaWQgMDpvLmZpbmQoKGU9PihudWxsPT1lP3ZvaWQgMDplLnRyYWNrSUQpPT09dCkpKSYmci5wdXNoKG4pfSkpLHJ9c3RhdGljIGdldE5leHRUcmFja0lEKHtpbWdMaXN0OnQsc3RlcDplPTEsZXh0cmFCb3hMaXN0Om4sZXh0cmFTcGhlcmVMaXN0OnJ9KXtsZXQgaT0xO3JldHVybiB0aGlzLmdldEFsbFBvaW50Q2xvdWRSZXN1bHQoe2ltZ0xpc3Q6dCxzdGVwOmUsZXh0cmFCb3hMaXN0Om4sZXh0cmFTcGhlcmVMaXN0OnJ9KS5mb3JFYWNoKCh0PT57Im51bWJlciI9PXR5cGVvZihudWxsPT10P3ZvaWQgMDp0LnRyYWNrSUQpJiZ0LnRyYWNrSUQ+PWkmJihpPXQudHJhY2tJRCsxKX0pKSxpfXN0YXRpYyBiYXRjaFVwZGF0ZVRyYWNrSUQoe2lkOnQsbmV3SUQ6ZSxyZXN1bHQ6bixzdGVwOnI9MX0pe3ZhciBpO2NvbnN0IG89YHN0ZXBfJHtyfWAscz10aGlzLmpzb25QYXJzZXIobiksYT1udWxsPT0oaT1udWxsPT1zP3ZvaWQgMDpzW29dKT92b2lkIDA6aS5yZXN1bHQ7cmV0dXJuIGE/KGEuZm9yRWFjaCgobj0+KChudWxsPT1uP3ZvaWQgMDpuLnRyYWNrSUQpPT09dCYmKG4udHJhY2tJRD1lKSxuKSkpLEpTT04uc3RyaW5naWZ5KHMpKTpufXN0YXRpYyBiYXRjaFVwZGF0ZVRyYWNrSURDaGVjayh7bmV3SUQ6dCxyZXN1bHQ6ZSxzdGVwOm49MX0pe3ZhciByO2NvbnN0IGk9YHN0ZXBfJHtufWAsbz10aGlzLmpzb25QYXJzZXIoZSkscz1udWxsPT0ocj1udWxsPT1vP3ZvaWQgMDpvW2ldKT92b2lkIDA6ci5yZXN1bHQ7cmV0dXJuISFzJiZzLnNvbWUoKGU9PmUudHJhY2tJRD09PXQpKX1zdGF0aWMgYmF0Y2hVcGRhdGVSZXN1bHRCeVRyYWNrSUQoe2lkOnQsbmV3RGF0YTplLHJlc3VsdDpuLHN0ZXA6cj0xfSl7dmFyIGk7Y29uc3Qgbz1gc3RlcF8ke3J9YCxzPXRoaXMuanNvblBhcnNlcihuKSxhPW51bGw9PShpPW51bGw9PXM/dm9pZCAwOnNbb10pP3ZvaWQgMDppLnJlc3VsdDtyZXR1cm4gYT8oc1tvXS5yZXN1bHQ9YS5tYXAoKG49PntpZigobnVsbD09bj92b2lkIDA6bi50cmFja0lEKT09PXQpe2NvbnN0IHQ9QnQoe30sZSkscj10LnN1YkF0dHJpYnV0ZTtyZXR1cm4gciYmbi5zdWJBdHRyaWJ1dGUmJk9iamVjdC5hc3NpZ24odCx7c3ViQXR0cmlidXRlOkJ0KEJ0KHt9LG4uc3ViQXR0cmlidXRlKSxyKX0pLEJ0KEJ0KHt9LG4pLHQpfXJldHVybiBufSkpLEpTT04uc3RyaW5naWZ5KHMpKTpufXN0YXRpYyBnZXRNYXhTaXplRnJvbUJveCh7dHJhY2tJRDp0LGltZ0xpc3Q6ZX0pe2xldCBuO3JldHVybiBlLmZvckVhY2goKGU9Pnt2YXIgcjtjb25zdCBpPXRoaXMuanNvblBhcnNlcihlLnJlc3VsdCksbz1udWxsPT0ocj1udWxsPT1pP3ZvaWQgMDppW3p0XSk/dm9pZCAwOnIucmVzdWx0OyFvfHxvLmZvckVhY2goKGU9PntpZigobnVsbD09ZT92b2lkIDA6ZS50cmFja0lEKT09PXQpe2lmKCFuKXJldHVybiB2b2lkKG49e3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LGRlcHRoOmUuZGVwdGh9KTtlLndpZHRoPm4ud2lkdGgmJihuLndpZHRoPWUud2lkdGgpLGUuaGVpZ2h0Pm4uaGVpZ2h0JiYobi5oZWlnaHQ9ZS5oZWlnaHQpLGUuZGVwdGg+bi5kZXB0aCYmKG4uZGVwdGg9ZS5kZXB0aCl9fSkpfSkpLG59c3RhdGljIGdldFN1YkF0dHJpYnV0ZU5hbWUodCxlKXtjb25zdCBuPWUuaW5wdXRMaXN0O3JldHVybiBPYmplY3QuZW50cmllcyh0KS5tYXAoKChbdCxlXSk9Pnt2YXIgcjtjb25zdCBpPW4uZmluZCgoZT0+ZS52YWx1ZT09PXQpKTtpZihpKXtjb25zdCB0PW51bGw9PShyPW51bGw9PWk/dm9pZCAwOmkuc3ViU2VsZWN0ZWQpP3ZvaWQgMDpyLmZpbmQoKHQ9PnQudmFsdWU9PT1lKSk7aWYodClyZXR1cm57bGFiZWw6aS5rZXksdmFsdWU6dC5rZXl9fXJldHVybntsYWJlbDp0LHZhbHVlOmV9fSkpfXN0YXRpYyBnZXRJbnRlcnNlY3Rpb25CeVNsb3BlKHQpe2NvbnN0e3AxOmUsbGluZTE6bixwMjpyLGxpbmUyOml9PXQ7aWYoZS54PT09ci54JiZlLnk9PT1yLnkpcmV0dXJuIGU7bGV0IG8scztuWzBdLng9PT1uWzFdLngmJihvPWUueCksblswXS55PT09blsxXS55JiYocz1lLnkpLGlbMF0ueD09PWlbMV0ueCYmKG89ci54KSxpWzBdLnk9PT1pWzFdLnkmJihzPXIueSk7Y29uc3QgYT0oblswXS55LW5bMV0ueSkvKG5bMF0ueC1uWzFdLngpLHU9KGlbMF0ueS1pWzFdLnkpLyhpWzBdLngtaVsxXS54KTtyZXR1cm4gbz1udWxsIT1vP286KGUueS1yLnktYSplLngrdSpyLngpLyh1LWEpLHM9bnVsbCE9cz9zOmUueS1hKihlLngtbykse3g6byx5OnN9fXN0YXRpYyBnZXRDbG91ZEtleXModCxlLG4pe3JldHVyblt0LGUsbl0uam9pbigiQCIpfXN0YXRpYyBzcGxpdFBvaW50c0Zyb21JbmRleGVzKHQsZSl7Y29uc3Qgbj1uZXcgU2V0O2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9MSluLmFkZChlW3RdKTtjb25zdCByPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9MSluLmhhcyh0W2VdKXx8ci5wdXNoKHRbZV0pO3JldHVybiByfXN0YXRpYyBzcGxpdFBvaW50c0Zyb21Qb2ludHModCxlKXtjb25zdCBuPW5ldyBNYXA7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz0zKW4uc2V0KGp0LmdldENsb3VkS2V5cyhlW3RdLGVbdCsxXSxlW3QrMl0pLDEpO2NvbnN0IHI9W107Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz0zKXtjb25zdCBpPWp0LmdldENsb3VkS2V5cyh0W2VdLHRbZSsxXSx0W2UrMl0pO24uaGFzKGkpfHxyLnB1c2godFtlXSx0W2UrMV0sdFtlKzJdKX1yZXR1cm4gbmV3IEZsb2F0MzJBcnJheShyKX1zdGF0aWMgZ2V0RGVmYXVsdE9ydGhvZ3JhcGhpY1BhcmFtcyh0KXtyZXR1cm57bGVmdDotdC53aWR0aC8yLHJpZ2h0OnQud2lkdGgvMix0b3A6dC5oZWlnaHQvMixib3R0b206LXQuaGVpZ2h0LzIsbmVhcjouMSxmYXI6MWU0fX19O2xldCBVdD1qdDtVdC5qc29uUGFyc2VyPXQ9Pnt0cnl7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2godCl7cmV0dXJue319fSxVdC50cmFuc2ZlckNhbnZhczJXb3JsZD0odCxlKT0+e2NvbnN0e3dpZHRoOm4saGVpZ2h0OnJ9PWUsaT10LHt4Om8seTpzfT1pLGE9a3QoaSxbIngiLCJ5Il0pO3JldHVybiBCdCh7eDpyLzItcyx5Oi0oby1uLzIpfSxhKX0sVXQucG9pbnRMaXN0VHJhbnNmZXJDYW52YXMyV29ybGQ9KHQsZSk9Pm51bGw9PXQ/dm9pZCAwOnQubWFwKCh0PT5CdChCdCh7fSx0KSxqdC50cmFuc2ZlckNhbnZhczJXb3JsZCh0LGUpKSkpLFV0LnRyYW5zZmVyV29ybGQyQ2FudmFzPSh0LGUpPT57Y29uc3R7d2lkdGg6bixoZWlnaHQ6cn09ZSxpPXQse3g6byx5OnN9PWksYT1rdChpLFsieCIsInkiXSk7cmV0dXJuIEJ0KHt4Om4vMi1zLHk6ci8yLW99LGEpfTtjb25zdCBxdD0odCxlKT0+Wy4uLnQsLi4uZV07Y2xhc3MgVnR7c3RhdGljIHRyYW5zZmVyTWF0cml4MzRGcm9tS2l0dGkyVGhyZWUodCl7cmV0dXJuWy4uLnQucmVkdWNlKHF0LFtdKSwwLDAsMCwxXX1zdGF0aWMgdHJhbnNmZXJNYXRyaXgzM0Zyb21LaXR0aTJUaHJlZSh0KXtyZXR1cm5bLi4udC5yZWR1Y2UoKCh0LGUpPT5bLi4udCwuLi5lXS5jb25jYXQoWzBdKSksW10pLDAsMCwwLDFdfX12YXIgR3QsWXQsWHQsV3QsSHQsWnQsS3QsSnQsUXQsJHQ7KFl0PUd0fHwoR3Q9e30pKS5Gcm9udD0iRlJPTlQiLFl0LkJhY2s9IkJBQ0siLFl0LkxlZnQ9IkxFRlQiLFl0LlJpZ2h0PSJSSUdIVCIsWXQuVG9wPSJUT1AiLFl0LkxGVD0iTEVGVF9GUk9OVF9UT1AiLFl0LlJCVD0iUklHSFRfQkFDS19UT1AiLGZ1bmN0aW9uKHQpe3QuRGV0ZWN0aW9uPSJEZXRlY3Rpb24iLHQuU2VnbWVudGF0aW9uPSJTZWdtZW50YXRpb24ifShYdHx8KFh0PXt9KSksZnVuY3Rpb24odCl7dC5BZGQ9IkFERCIsdC5SZW1vdmU9IlJFTU9WRSJ9KFd0fHwoV3Q9e30pKSxmdW5jdGlvbih0KXt0LkNvdmVyPSJDb3ZlciIsdC5VbmNvdmVyPSJVbmNvdmVyIn0oSHR8fChIdD17fSkpLGZ1bmN0aW9uKHQpe3QuRm9jdXM9IkZvY3VzIix0LlVuZm9jdXM9IlVuZm9jdXMifShadHx8KFp0PXt9KSksZnVuY3Rpb24odCl7dC5SZWFkeT0iUkVBRFkiLHQuQ2hlY2s9IkNIRUNLIix0LkVkaXQ9IkVESVQiLHQuSG92ZXI9IkhPVkVSIn0oS3R8fChLdD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5Ob3JtYWw9MF09Ik5vcm1hbCIsdFt0Lk9tbmlDYW1lcmE9MV09Ik9tbmlDYW1lcmEiLHRbdC5LYW5uYWxhQnJhbmR0PTJdPSJLYW5uYWxhQnJhbmR0Iix0W3QuT21uaUNhbWVyYTExVj0zXT0iT21uaUNhbWVyYTExViJ9KEp0fHwoSnQ9e30pKSxmdW5jdGlvbih0KXt0W3QuTGluZT0wXT0iTGluZSIsdFt0LkN1cnZlPTFdPSJDdXJ2ZSJ9KFF0fHwoUXQ9e30pKSxmdW5jdGlvbih0KXt0W3QuUGVyaW9kPTBdPSJQZXJpb2QiLHRbdC5UaW1lPTFdPSJUaW1lIn0oJHR8fCgkdD17fSkpO3ZhciB0ZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIGVlKHQpe3ZhciBlPXtleHBvcnRzOnt9fTtyZXR1cm4gdChlLGUuZXhwb3J0cyksZS5leHBvcnRzfWVlKChmdW5jdGlvbih0LGUpeyhmdW5jdGlvbigpe3ZhciBuLHI9IkV4cGVjdGVkIGEgZnVuY3Rpb24iLGk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLG89Il9fbG9kYXNoX3BsYWNlaG9sZGVyX18iLHM9MTYsYT0zMix1PTY0LGM9MTI4LGw9MjU2LGg9MS8wLGY9OTAwNzE5OTI1NDc0MDk5MSxwPU5hTixkPTQyOTQ5NjcyOTUsZz1kLTEseT1kPj4+MSxtPVtbImFyeSIsY10sWyJiaW5kIiwxXSxbImJpbmRLZXkiLDJdLFsiY3VycnkiLDhdLFsiY3VycnlSaWdodCIsc10sWyJmbGlwIiw1MTJdLFsicGFydGlhbCIsYV0sWyJwYXJ0aWFsUmlnaHQiLHVdLFsicmVhcmciLGxdXSx2PSJbb2JqZWN0IEFyZ3VtZW50c10iLF89IltvYmplY3QgQXJyYXldIix4PSJbb2JqZWN0IEJvb2xlYW5dIix3PSJbb2JqZWN0IERhdGVdIixiPSJbb2JqZWN0IEVycm9yXSIsRD0iW29iamVjdCBGdW5jdGlvbl0iLEU9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixDPSJbb2JqZWN0IE1hcF0iLFM9IltvYmplY3QgTnVtYmVyXSIsQT0iW29iamVjdCBPYmplY3RdIixOPSJbb2JqZWN0IFByb21pc2VdIixJPSJbb2JqZWN0IFJlZ0V4cF0iLE09IltvYmplY3QgU2V0XSIsRj0iW29iamVjdCBTdHJpbmddIixUPSJbb2JqZWN0IFN5bWJvbF0iLE89IltvYmplY3QgV2Vha01hcF0iLEw9IltvYmplY3QgQXJyYXlCdWZmZXJdIixQPSJbb2JqZWN0IERhdGFWaWV3XSIsUj0iW29iamVjdCBGbG9hdDMyQXJyYXldIixCPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLGs9IltvYmplY3QgSW50OEFycmF5XSIsej0iW29iamVjdCBJbnQxNkFycmF5XSIsaj0iW29iamVjdCBJbnQzMkFycmF5XSIsVT0iW29iamVjdCBVaW50OEFycmF5XSIscT0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLFY9IltvYmplY3QgVWludDE2QXJyYXldIixHPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsWT0vXGJfX3AgXCs9ICcnOy9nLFg9L1xiKF9fcCBcKz0pICcnIFwrL2csVz0vKF9fZVwoLio/XCl8XGJfX3RcKSkgXCtcbicnOy9nLEg9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFo9L1smPD4iJ10vZyxLPVJlZ0V4cChILnNvdXJjZSksSj1SZWdFeHAoWi5zb3VyY2UpLFE9LzwlLShbXHNcU10rPyklPi9nLCQ9LzwlKFtcc1xTXSs/KSU+L2csdHQ9LzwlPShbXHNcU10rPyklPi9nLGV0PS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLG50PS9eXHcqJC8scnQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csaXQ9L1tcXF4kLiorPygpW1xde318XS9nLG90PVJlZ0V4cChpdC5zb3VyY2UpLHN0PS9eXHMrLyxhdD0vXHMvLHV0PS9ceyg/OlxuXC9cKiBcW3dyYXBwZWQgd2l0aCAuK1xdIFwqXC8pP1xuPy8sY3Q9L1x7XG5cL1wqIFxbd3JhcHBlZCB3aXRoICguKylcXSBcKi8sbHQ9Lyw/ICYgLyxodD0vW15ceDAwLVx4MmZceDNhLVx4NDBceDViLVx4NjBceDdiLVx4N2ZdKy9nLGZ0PS9bKCk9LHt9XFtcXVwvXHNdLyxwdD0vXFwoXFwpPy9nLGR0PS9cJFx7KFteXFx9XSooPzpcXC5bXlxcfV0qKSopXH0vZyxndD0vXHcqJC8seXQ9L15bLStdMHhbMC05YS1mXSskL2ksbXQ9L14wYlswMV0rJC9pLHZ0PS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLF90PS9eMG9bMC03XSskL2kseHQ9L14oPzowfFsxLTldXGQqKSQvLHd0PS9bXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1ceGZmXHUwMTAwLVx1MDE3Zl0vZyxidD0vKCReKS8sRHQ9L1snXG5cclx1MjAyOFx1MjAyOVxcXS9nLEV0PSJcXHVkODAwLVxcdWRmZmYiLEN0PSJcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmYiLFN0PSJcXHUyNzAwLVxcdTI3YmYiLEF0PSJhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmIixOdD0iQS1aXFx4YzAtXFx4ZDZcXHhkOC1cXHhkZSIsSXQ9IlxcdWZlMGVcXHVmZTBmIixNdD0iXFx4YWNcXHhiMVxceGQ3XFx4ZjdcXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHhiZlxcdTIwMDAtXFx1MjA2ZiBcXHRcXHgwYlxcZlxceGEwXFx1ZmVmZlxcblxcclxcdTIwMjhcXHUyMDI5XFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMCIsRnQ9Ilsn4oCZXSIsVHQ9IlsiK0V0KyJdIixPdD0iWyIrTXQrIl0iLEx0PSJbIitDdCsiXSIsUHQ9IlxcZCsiLFJ0PSJbIitTdCsiXSIsQnQ9IlsiK0F0KyJdIixrdD0iW14iK0V0K010K1B0K1N0K0F0K050KyJdIix6dD0iXFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdIixqdD0iW14iK0V0KyJdIixVdD0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIscXQ9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLFZ0PSJbIitOdCsiXSIsR3Q9IlxcdTIwMGQiLFl0PSIoPzoiK0J0KyJ8IitrdCsiKSIsWHQ9Iig/OiIrVnQrInwiK2t0KyIpIixXdD0iKD86WyfigJldKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIsSHQ9Iig/Olsn4oCZXSg/OkR8TEx8TXxSRXxTfFR8VkUpKT8iLFp0PSIoPzoiK0x0KyJ8Iit6dCsiKSIrIj8iLEt0PSJbIitJdCsiXT8iLEp0PUt0K1p0KygiKD86IitHdCsiKD86IitbanQsVXQscXRdLmpvaW4oInwiKSsiKSIrS3QrWnQrIikqIiksUXQ9Iig/OiIrW1J0LFV0LHF0XS5qb2luKCJ8IikrIikiK0p0LCR0PSIoPzoiK1tqdCtMdCsiPyIsTHQsVXQscXQsVHRdLmpvaW4oInwiKSsiKSIsZWU9UmVnRXhwKEZ0LCJnIiksbmU9UmVnRXhwKEx0LCJnIikscmU9UmVnRXhwKHp0KyIoPz0iK3p0KyIpfCIrJHQrSnQsImciKSxpZT1SZWdFeHAoW1Z0KyI/IitCdCsiKyIrV3QrIig/PSIrW090LFZ0LCIkIl0uam9pbigifCIpKyIpIixYdCsiKyIrSHQrIig/PSIrW090LFZ0K1l0LCIkIl0uam9pbigifCIpKyIpIixWdCsiPyIrWXQrIisiK1d0LFZ0KyIrIitIdCwiXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcZFRIKSg/PVxcYnxbYS16X10pIiwiXFxkKig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcZHRoKSg/PVxcYnxbQS1aX10pIixQdCxRdF0uam9pbigifCIpLCJnIiksb2U9UmVnRXhwKCJbIitHdCtFdCtDdCtJdCsiXSIpLHNlPS9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vLGFlPVsiQXJyYXkiLCJCdWZmZXIiLCJEYXRhVmlldyIsIkRhdGUiLCJFcnJvciIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkZ1bmN0aW9uIiwiSW50OEFycmF5IiwiSW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJNYXAiLCJNYXRoIiwiT2JqZWN0IiwiUHJvbWlzZSIsIlJlZ0V4cCIsIlNldCIsIlN0cmluZyIsIlN5bWJvbCIsIlR5cGVFcnJvciIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIlVpbnQxNkFycmF5IiwiVWludDMyQXJyYXkiLCJXZWFrTWFwIiwiXyIsImNsZWFyVGltZW91dCIsImlzRmluaXRlIiwicGFyc2VJbnQiLCJzZXRUaW1lb3V0Il0sdWU9LTEsY2U9e307Y2VbUl09Y2VbQl09Y2Vba109Y2Vbel09Y2Vbal09Y2VbVV09Y2VbcV09Y2VbVl09Y2VbR109ITAsY2Vbdl09Y2VbX109Y2VbTF09Y2VbeF09Y2VbUF09Y2Vbd109Y2VbYl09Y2VbRF09Y2VbQ109Y2VbU109Y2VbQV09Y2VbSV09Y2VbTV09Y2VbRl09Y2VbT109ITE7dmFyIGxlPXt9O2xlW3ZdPWxlW19dPWxlW0xdPWxlW1BdPWxlW3hdPWxlW3ddPWxlW1JdPWxlW0JdPWxlW2tdPWxlW3pdPWxlW2pdPWxlW0NdPWxlW1NdPWxlW0FdPWxlW0ldPWxlW01dPWxlW0ZdPWxlW1RdPWxlW1VdPWxlW3FdPWxlW1ZdPWxlW0ddPSEwLGxlW2JdPWxlW0RdPWxlW09dPSExO3ZhciBoZT17IlxcIjoiXFwiLCInIjoiJyIsIlxuIjoibiIsIlxyIjoiciIsIlx1MjAyOCI6InUyMDI4IiwiXHUyMDI5IjoidTIwMjkifSxmZT1wYXJzZUZsb2F0LHBlPXBhcnNlSW50LGRlPSJvYmplY3QiPT10eXBlb2YgdGUmJnRlJiZ0ZS5PYmplY3Q9PT1PYmplY3QmJnRlLGdlPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYseWU9ZGV8fGdlfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLG1lPWUmJiFlLm5vZGVUeXBlJiZlLHZlPW1lJiZ0JiYhdC5ub2RlVHlwZSYmdCxfZT12ZSYmdmUuZXhwb3J0cz09PW1lLHhlPV9lJiZkZS5wcm9jZXNzLHdlPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB2ZSYmdmUucmVxdWlyZSYmdmUucmVxdWlyZSgidXRpbCIpLnR5cGVzfHx4ZSYmeGUuYmluZGluZyYmeGUuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCksYmU9d2UmJndlLmlzQXJyYXlCdWZmZXIsRGU9d2UmJndlLmlzRGF0ZSxFZT13ZSYmd2UuaXNNYXAsQ2U9d2UmJndlLmlzUmVnRXhwLFNlPXdlJiZ3ZS5pc1NldCxBZT13ZSYmd2UuaXNUeXBlZEFycmF5O2Z1bmN0aW9uIE5lKHQsZSxuKXtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdC5jYWxsKGUpO2Nhc2UgMTpyZXR1cm4gdC5jYWxsKGUsblswXSk7Y2FzZSAyOnJldHVybiB0LmNhbGwoZSxuWzBdLG5bMV0pO2Nhc2UgMzpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdLG5bMl0pfXJldHVybiB0LmFwcGx5KGUsbil9ZnVuY3Rpb24gSWUodCxlLG4scil7Zm9yKHZhciBpPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoOysraTxvOyl7dmFyIHM9dFtpXTtlKHIscyxuKHMpLHQpfXJldHVybiByfWZ1bmN0aW9uIE1lKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxyJiYhMSE9PWUodFtuXSxuLHQpOyk7cmV0dXJuIHR9ZnVuY3Rpb24gRmUodCxlKXtmb3IodmFyIG49bnVsbD09dD8wOnQubGVuZ3RoO24tLSYmITEhPT1lKHRbbl0sbix0KTspO3JldHVybiB0fWZ1bmN0aW9uIFRlKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxyOylpZighZSh0W25dLG4sdCkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gT2UodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGgsaT0wLG89W107KytuPHI7KXt2YXIgcz10W25dO2UocyxuLHQpJiYob1tpKytdPXMpfXJldHVybiBvfWZ1bmN0aW9uIExlKHQsZSl7cmV0dXJuISEobnVsbD09dD8wOnQubGVuZ3RoKSYmR2UodCxlLDApPi0xfWZ1bmN0aW9uIFBlKHQsZSxuKXtmb3IodmFyIHI9LTEsaT1udWxsPT10PzA6dC5sZW5ndGg7KytyPGk7KWlmKG4oZSx0W3JdKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBSZSh0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPUFycmF5KHIpOysrbjxyOylpW25dPWUodFtuXSxuLHQpO3JldHVybiBpfWZ1bmN0aW9uIEJlKHQsZSl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgsaT10Lmxlbmd0aDsrK248cjspdFtpK25dPWVbbl07cmV0dXJuIHR9ZnVuY3Rpb24ga2UodCxlLG4scil7dmFyIGk9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHImJm8mJihuPXRbKytpXSk7KytpPG87KW49ZShuLHRbaV0saSx0KTtyZXR1cm4gbn1mdW5jdGlvbiB6ZSh0LGUsbixyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHImJmkmJihuPXRbLS1pXSk7aS0tOyluPWUobix0W2ldLGksdCk7cmV0dXJuIG59ZnVuY3Rpb24gamUodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHI7KWlmKGUodFtuXSxuLHQpKXJldHVybiEwO3JldHVybiExfXZhciBVZT1IZSgibGVuZ3RoIik7ZnVuY3Rpb24gcWUodCxlLG4pe3ZhciByO3JldHVybiBuKHQsKGZ1bmN0aW9uKHQsbixpKXtpZihlKHQsbixpKSlyZXR1cm4gcj1uLCExfSkpLHJ9ZnVuY3Rpb24gVmUodCxlLG4scil7Zm9yKHZhciBpPXQubGVuZ3RoLG89bisocj8xOi0xKTtyP28tLTorK288aTspaWYoZSh0W29dLG8sdCkpcmV0dXJuIG87cmV0dXJuLTF9ZnVuY3Rpb24gR2UodCxlLG4pe3JldHVybiBlPT1lP2Z1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bi0xLGk9dC5sZW5ndGg7KytyPGk7KWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfSh0LGUsbik6VmUodCxYZSxuKX1mdW5jdGlvbiBZZSh0LGUsbixyKXtmb3IodmFyIGk9bi0xLG89dC5sZW5ndGg7KytpPG87KWlmKHIodFtpXSxlKSlyZXR1cm4gaTtyZXR1cm4tMX1mdW5jdGlvbiBYZSh0KXtyZXR1cm4gdCE9dH1mdW5jdGlvbiBXZSh0LGUpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gbj9KZSh0LGUpL246cH1mdW5jdGlvbiBIZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/bjplW3RdfX1mdW5jdGlvbiBaZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PXQ/bjp0W2VdfX1mdW5jdGlvbiBLZSh0LGUsbixyLGkpe3JldHVybiBpKHQsKGZ1bmN0aW9uKHQsaSxvKXtuPXI/KHI9ITEsdCk6ZShuLHQsaSxvKX0pKSxufWZ1bmN0aW9uIEplKHQsZSl7Zm9yKHZhciByLGk9LTEsbz10Lmxlbmd0aDsrK2k8bzspe3ZhciBzPWUodFtpXSk7cyE9PW4mJihyPXI9PT1uP3M6citzKX1yZXR1cm4gcn1mdW5jdGlvbiBRZSh0LGUpe2Zvcih2YXIgbj0tMSxyPUFycmF5KHQpOysrbjx0OylyW25dPWUobik7cmV0dXJuIHJ9ZnVuY3Rpb24gJGUodCl7cmV0dXJuIHQmJnQuc2xpY2UoMCx5bih0KSsxKS5yZXBsYWNlKHN0LCIiKX1mdW5jdGlvbiB0bih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fWZ1bmN0aW9uIGVuKHQsZSl7cmV0dXJuIFJlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpfWZ1bmN0aW9uIG5uKHQsZSl7cmV0dXJuIHQuaGFzKGUpfWZ1bmN0aW9uIHJuKHQsZSl7Zm9yKHZhciBuPS0xLHI9dC5sZW5ndGg7KytuPHImJkdlKGUsdFtuXSwwKT4tMTspO3JldHVybiBufWZ1bmN0aW9uIG9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoO24tLSYmR2UoZSx0W25dLDApPi0xOyk7cmV0dXJuIG59dmFyIHNuPVplKHsiw4AiOiJBIiwiw4EiOiJBIiwiw4IiOiJBIiwiw4MiOiJBIiwiw4QiOiJBIiwiw4UiOiJBIiwiw6AiOiJhIiwiw6EiOiJhIiwiw6IiOiJhIiwiw6MiOiJhIiwiw6QiOiJhIiwiw6UiOiJhIiwiw4ciOiJDIiwiw6ciOiJjIiwiw5AiOiJEIiwiw7AiOiJkIiwiw4giOiJFIiwiw4kiOiJFIiwiw4oiOiJFIiwiw4siOiJFIiwiw6giOiJlIiwiw6kiOiJlIiwiw6oiOiJlIiwiw6siOiJlIiwiw4wiOiJJIiwiw40iOiJJIiwiw44iOiJJIiwiw48iOiJJIiwiw6wiOiJpIiwiw60iOiJpIiwiw64iOiJpIiwiw68iOiJpIiwiw5EiOiJOIiwiw7EiOiJuIiwiw5IiOiJPIiwiw5MiOiJPIiwiw5QiOiJPIiwiw5UiOiJPIiwiw5YiOiJPIiwiw5giOiJPIiwiw7IiOiJvIiwiw7MiOiJvIiwiw7QiOiJvIiwiw7UiOiJvIiwiw7YiOiJvIiwiw7giOiJvIiwiw5kiOiJVIiwiw5oiOiJVIiwiw5siOiJVIiwiw5wiOiJVIiwiw7kiOiJ1Iiwiw7oiOiJ1Iiwiw7siOiJ1Iiwiw7wiOiJ1Iiwiw50iOiJZIiwiw70iOiJ5Iiwiw78iOiJ5Iiwiw4YiOiJBZSIsIsOmIjoiYWUiLCLDniI6IlRoIiwiw74iOiJ0aCIsIsOfIjoic3MiLCLEgCI6IkEiLCLEgiI6IkEiLCLEhCI6IkEiLCLEgSI6ImEiLCLEgyI6ImEiLCLEhSI6ImEiLCLEhiI6IkMiLCLEiCI6IkMiLCLEiiI6IkMiLCLEjCI6IkMiLCLEhyI6ImMiLCLEiSI6ImMiLCLEiyI6ImMiLCLEjSI6ImMiLCLEjiI6IkQiLCLEkCI6IkQiLCLEjyI6ImQiLCLEkSI6ImQiLCLEkiI6IkUiLCLElCI6IkUiLCLEliI6IkUiLCLEmCI6IkUiLCLEmiI6IkUiLCLEkyI6ImUiLCLElSI6ImUiLCLElyI6ImUiLCLEmSI6ImUiLCLEmyI6ImUiLCLEnCI6IkciLCLEniI6IkciLCLEoCI6IkciLCLEoiI6IkciLCLEnSI6ImciLCLEnyI6ImciLCLEoSI6ImciLCLEoyI6ImciLCLEpCI6IkgiLCLEpiI6IkgiLCLEpSI6ImgiLCLEpyI6ImgiLCLEqCI6IkkiLCLEqiI6IkkiLCLErCI6IkkiLCLEriI6IkkiLCLEsCI6IkkiLCLEqSI6ImkiLCLEqyI6ImkiLCLErSI6ImkiLCLEryI6ImkiLCLEsSI6ImkiLCLEtCI6IkoiLCLEtSI6ImoiLCLEtiI6IksiLCLEtyI6ImsiLCLEuCI6ImsiLCLEuSI6IkwiLCLEuyI6IkwiLCLEvSI6IkwiLCLEvyI6IkwiLCLFgSI6IkwiLCLEuiI6ImwiLCLEvCI6ImwiLCLEviI6ImwiLCLFgCI6ImwiLCLFgiI6ImwiLCLFgyI6Ik4iLCLFhSI6Ik4iLCLFhyI6Ik4iLCLFiiI6Ik4iLCLFhCI6Im4iLCLFhiI6Im4iLCLFiCI6Im4iLCLFiyI6Im4iLCLFjCI6Ik8iLCLFjiI6Ik8iLCLFkCI6Ik8iLCLFjSI6Im8iLCLFjyI6Im8iLCLFkSI6Im8iLCLFlCI6IlIiLCLFliI6IlIiLCLFmCI6IlIiLCLFlSI6InIiLCLFlyI6InIiLCLFmSI6InIiLCLFmiI6IlMiLCLFnCI6IlMiLCLFniI6IlMiLCLFoCI6IlMiLCLFmyI6InMiLCLFnSI6InMiLCLFnyI6InMiLCLFoSI6InMiLCLFoiI6IlQiLCLFpCI6IlQiLCLFpiI6IlQiLCLFoyI6InQiLCLFpSI6InQiLCLFpyI6InQiLCLFqCI6IlUiLCLFqiI6IlUiLCLFrCI6IlUiLCLFriI6IlUiLCLFsCI6IlUiLCLFsiI6IlUiLCLFqSI6InUiLCLFqyI6InUiLCLFrSI6InUiLCLFryI6InUiLCLFsSI6InUiLCLFsyI6InUiLCLFtCI6IlciLCLFtSI6InciLCLFtiI6IlkiLCLFtyI6InkiLCLFuCI6IlkiLCLFuSI6IloiLCLFuyI6IloiLCLFvSI6IloiLCLFuiI6InoiLCLFvCI6InoiLCLFviI6InoiLCLEsiI6IklKIiwixLMiOiJpaiIsIsWSIjoiT2UiLCLFkyI6Im9lIiwixYkiOiInbiIsIsW/IjoicyJ9KSxhbj1aZSh7IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7In0pO2Z1bmN0aW9uIHVuKHQpe3JldHVybiJcXCIraGVbdF19ZnVuY3Rpb24gY24odCl7cmV0dXJuIG9lLnRlc3QodCl9ZnVuY3Rpb24gbG4odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQscil7blsrK2VdPVtyLHRdfSkpLG59ZnVuY3Rpb24gaG4odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQoZShuKSl9fWZ1bmN0aW9uIGZuKHQsZSl7Zm9yKHZhciBuPS0xLHI9dC5sZW5ndGgsaT0wLHM9W107KytuPHI7KXt2YXIgYT10W25dOyhhPT09ZXx8YT09PW8pJiYodFtuXT1vLHNbaSsrXT1uKX1yZXR1cm4gc31mdW5jdGlvbiBwbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7blsrK2VdPXR9KSksbn1mdW5jdGlvbiBkbih0KXtyZXR1cm4gY24odCk/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXJlLmxhc3RJbmRleD0wO3JlLnRlc3QodCk7KSsrZTtyZXR1cm4gZX0odCk6VWUodCl9ZnVuY3Rpb24gZ24odCl7cmV0dXJuIGNuKHQpP2Z1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoKHJlKXx8W119KHQpOmZ1bmN0aW9uKHQpe3JldHVybiB0LnNwbGl0KCIiKX0odCl9ZnVuY3Rpb24geW4odCl7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLSYmYXQudGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX12YXIgbW49WmUoeyImYW1wOyI6IiYiLCImbHQ7IjoiPCIsIiZndDsiOiI+IiwiJnF1b3Q7IjonIicsIiYjMzk7IjoiJyJ9KTt2YXIgdm49ZnVuY3Rpb24gdChlKXt2YXIgYXQsRXQ9KGU9bnVsbD09ZT95ZTp2bi5kZWZhdWx0cyh5ZS5PYmplY3QoKSxlLHZuLnBpY2soeWUsYWUpKSkuQXJyYXksQ3Q9ZS5EYXRlLFN0PWUuRXJyb3IsQXQ9ZS5GdW5jdGlvbixOdD1lLk1hdGgsSXQ9ZS5PYmplY3QsTXQ9ZS5SZWdFeHAsRnQ9ZS5TdHJpbmcsVHQ9ZS5UeXBlRXJyb3IsT3Q9RXQucHJvdG90eXBlLEx0PUF0LnByb3RvdHlwZSxQdD1JdC5wcm90b3R5cGUsUnQ9ZVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sQnQ9THQudG9TdHJpbmcsa3Q9UHQuaGFzT3duUHJvcGVydHksenQ9MCxqdD0oYXQ9L1teLl0rJC8uZXhlYyhSdCYmUnQua2V5cyYmUnQua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK2F0OiIiLFV0PVB0LnRvU3RyaW5nLHF0PUJ0LmNhbGwoSXQpLFZ0PXllLl8sR3Q9TXQoIl4iK0J0LmNhbGwoa3QpLnJlcGxhY2UoaXQsIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIiksWXQ9X2U/ZS5CdWZmZXI6bixYdD1lLlN5bWJvbCxXdD1lLlVpbnQ4QXJyYXksSHQ9WXQ/WXQuYWxsb2NVbnNhZmU6bixadD1obihJdC5nZXRQcm90b3R5cGVPZixJdCksS3Q9SXQuY3JlYXRlLEp0PVB0LnByb3BlcnR5SXNFbnVtZXJhYmxlLFF0PU90LnNwbGljZSwkdD1YdD9YdC5pc0NvbmNhdFNwcmVhZGFibGU6bix0ZT1YdD9YdC5pdGVyYXRvcjpuLHJlPVh0P1h0LnRvU3RyaW5nVGFnOm4sb2U9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9cG8oSXQsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2godCl7fX0oKSxoZT1lLmNsZWFyVGltZW91dCE9PXllLmNsZWFyVGltZW91dCYmZS5jbGVhclRpbWVvdXQsZGU9Q3QmJkN0Lm5vdyE9PXllLkRhdGUubm93JiZDdC5ub3csZ2U9ZS5zZXRUaW1lb3V0IT09eWUuc2V0VGltZW91dCYmZS5zZXRUaW1lb3V0LG1lPU50LmNlaWwsdmU9TnQuZmxvb3IseGU9SXQuZ2V0T3duUHJvcGVydHlTeW1ib2xzLHdlPVl0P1l0LmlzQnVmZmVyOm4sVWU9ZS5pc0Zpbml0ZSxaZT1PdC5qb2luLF9uPWhuKEl0LmtleXMsSXQpLHhuPU50Lm1heCx3bj1OdC5taW4sYm49Q3Qubm93LERuPWUucGFyc2VJbnQsRW49TnQucmFuZG9tLENuPU90LnJldmVyc2UsU249cG8oZSwiRGF0YVZpZXciKSxBbj1wbyhlLCJNYXAiKSxObj1wbyhlLCJQcm9taXNlIiksSW49cG8oZSwiU2V0IiksTW49cG8oZSwiV2Vha01hcCIpLEZuPXBvKEl0LCJjcmVhdGUiKSxUbj1NbiYmbmV3IE1uLE9uPXt9LExuPWpvKFNuKSxQbj1qbyhBbiksUm49am8oTm4pLEJuPWpvKEluKSxrbj1qbyhNbiksem49WHQ/WHQucHJvdG90eXBlOm4sam49em4/em4udmFsdWVPZjpuLFVuPXpuP3puLnRvU3RyaW5nOm47ZnVuY3Rpb24gcW4odCl7aWYocmEodCkmJiFYcyh0KSYmISh0IGluc3RhbmNlb2YgWG4pKXtpZih0IGluc3RhbmNlb2YgWW4pcmV0dXJuIHQ7aWYoa3QuY2FsbCh0LCJfX3dyYXBwZWRfXyIpKXJldHVybiBVbyh0KX1yZXR1cm4gbmV3IFluKHQpfXZhciBWbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKCFuYShlKSlyZXR1cm57fTtpZihLdClyZXR1cm4gS3QoZSk7dC5wcm90b3R5cGU9ZTt2YXIgcj1uZXcgdDtyZXR1cm4gdC5wcm90b3R5cGU9bixyfX0oKTtmdW5jdGlvbiBHbigpe31mdW5jdGlvbiBZbih0LGUpe3RoaXMuX193cmFwcGVkX189dCx0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19jaGFpbl9fPSEhZSx0aGlzLl9faW5kZXhfXz0wLHRoaXMuX192YWx1ZXNfXz1ufWZ1bmN0aW9uIFhuKHQpe3RoaXMuX193cmFwcGVkX189dCx0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19kaXJfXz0xLHRoaXMuX19maWx0ZXJlZF9fPSExLHRoaXMuX19pdGVyYXRlZXNfXz1bXSx0aGlzLl9fdGFrZUNvdW50X189ZCx0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBXbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1mdW5jdGlvbiBIbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1mdW5jdGlvbiBabih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1mdW5jdGlvbiBLbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgWm47KytlPG47KXRoaXMuYWRkKHRbZV0pfWZ1bmN0aW9uIEpuKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IEhuKHQpO3RoaXMuc2l6ZT1lLnNpemV9ZnVuY3Rpb24gUW4odCxlKXt2YXIgbj1Ycyh0KSxyPSFuJiZZcyh0KSxpPSFuJiYhciYmS3ModCksbz0hbiYmIXImJiFpJiZoYSh0KSxzPW58fHJ8fGl8fG8sYT1zP1FlKHQubGVuZ3RoLEZ0KTpbXSx1PWEubGVuZ3RoO2Zvcih2YXIgYyBpbiB0KShlfHxrdC5jYWxsKHQsYykpJiYoIXN8fCEoImxlbmd0aCI9PWN8fGkmJigib2Zmc2V0Ij09Y3x8InBhcmVudCI9PWMpfHxvJiYoImJ1ZmZlciI9PWN8fCJieXRlTGVuZ3RoIj09Y3x8ImJ5dGVPZmZzZXQiPT1jKXx8d28oYyx1KSkpJiZhLnB1c2goYyk7cmV0dXJuIGF9ZnVuY3Rpb24gJG4odCl7dmFyIGU9dC5sZW5ndGg7cmV0dXJuIGU/dFtLcigwLGUtMSldOm59ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4gQm8oRmkodCksY3IoZSwwLHQubGVuZ3RoKSl9ZnVuY3Rpb24gZXIodCl7cmV0dXJuIEJvKEZpKHQpKX1mdW5jdGlvbiBucih0LGUscil7KHIhPT1uJiYhcXModFtlXSxyKXx8cj09PW4mJiEoZSBpbiB0KSkmJmFyKHQsZSxyKX1mdW5jdGlvbiBycih0LGUscil7dmFyIGk9dFtlXTsoIWt0LmNhbGwodCxlKXx8IXFzKGkscil8fHI9PT1uJiYhKGUgaW4gdCkpJiZhcih0LGUscil9ZnVuY3Rpb24gaXIodCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihxcyh0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIG9yKHQsZSxuLHIpe3JldHVybiBkcih0LChmdW5jdGlvbih0LGksbyl7ZShyLHQsbih0KSxvKX0pKSxyfWZ1bmN0aW9uIHNyKHQsZSl7cmV0dXJuIHQmJlRpKGUsT2EoZSksdCl9ZnVuY3Rpb24gYXIodCxlLG4peyJfX3Byb3RvX18iPT1lJiZvZT9vZSh0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm4sd3JpdGFibGU6ITB9KTp0W2VdPW59ZnVuY3Rpb24gdXIodCxlKXtmb3IodmFyIHI9LTEsaT1lLmxlbmd0aCxvPUV0KGkpLHM9bnVsbD09dDsrK3I8aTspb1tyXT1zP246TmEodCxlW3JdKTtyZXR1cm4gb31mdW5jdGlvbiBjcih0LGUscil7cmV0dXJuIHQ9PXQmJihyIT09biYmKHQ9dDw9cj90OnIpLGUhPT1uJiYodD10Pj1lP3Q6ZSkpLHR9ZnVuY3Rpb24gbHIodCxlLHIsaSxvLHMpe3ZhciBhLHU9MSZlLGM9MiZlLGw9NCZlO2lmKHImJihhPW8/cih0LGksbyxzKTpyKHQpKSxhIT09bilyZXR1cm4gYTtpZighbmEodCkpcmV0dXJuIHQ7dmFyIGg9WHModCk7aWYoaCl7aWYoYT1mdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aCxuPW5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiBlJiYic3RyaW5nIj09dHlwZW9mIHRbMF0mJmt0LmNhbGwodCwiaW5kZXgiKSYmKG4uaW5kZXg9dC5pbmRleCxuLmlucHV0PXQuaW5wdXQpLG59KHQpLCF1KXJldHVybiBGaSh0LGEpfWVsc2V7dmFyIGY9bW8odCkscD1mPT1EfHxmPT1FO2lmKEtzKHQpKXJldHVybiBDaSh0LHUpO2lmKGY9PUF8fGY9PXZ8fHAmJiFvKXtpZihhPWN8fHA/e306X28odCksIXUpcmV0dXJuIGM/ZnVuY3Rpb24odCxlKXtyZXR1cm4gVGkodCx5byh0KSxlKX0odCxmdW5jdGlvbih0LGUpe3JldHVybiB0JiZUaShlLExhKGUpLHQpfShhLHQpKTpmdW5jdGlvbih0LGUpe3JldHVybiBUaSh0LGdvKHQpLGUpfSh0LHNyKGEsdCkpfWVsc2V7aWYoIWxlW2ZdKXJldHVybiBvP3Q6e307YT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5jb25zdHJ1Y3Rvcjtzd2l0Y2goZSl7Y2FzZSBMOnJldHVybiBTaSh0KTtjYXNlIHg6Y2FzZSB3OnJldHVybiBuZXcgcigrdCk7Y2FzZSBQOnJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPWU/U2kodC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfSh0LG4pO2Nhc2UgUjpjYXNlIEI6Y2FzZSBrOmNhc2UgejpjYXNlIGo6Y2FzZSBVOmNhc2UgcTpjYXNlIFY6Y2FzZSBHOnJldHVybiBBaSh0LG4pO2Nhc2UgQzpyZXR1cm4gbmV3IHI7Y2FzZSBTOmNhc2UgRjpyZXR1cm4gbmV3IHIodCk7Y2FzZSBJOnJldHVybiBmdW5jdGlvbih0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSxndC5leGVjKHQpKTtyZXR1cm4gZS5sYXN0SW5kZXg9dC5sYXN0SW5kZXgsZX0odCk7Y2FzZSBNOnJldHVybiBuZXcgcjtjYXNlIFQ6cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBqbj9JdChqbi5jYWxsKHQpKTp7fX0odCl9fSh0LGYsdSl9fXN8fChzPW5ldyBKbik7dmFyIGQ9cy5nZXQodCk7aWYoZClyZXR1cm4gZDtzLnNldCh0LGEpLHVhKHQpP3QuZm9yRWFjaCgoZnVuY3Rpb24obil7YS5hZGQobHIobixlLHIsbix0LHMpKX0pKTppYSh0KSYmdC5mb3JFYWNoKChmdW5jdGlvbihuLGkpe2Euc2V0KGksbHIobixlLHIsaSx0LHMpKX0pKTt2YXIgZz1oP246KGw/Yz9zbzpvbzpjP0xhOk9hKSh0KTtyZXR1cm4gTWUoZ3x8dCwoZnVuY3Rpb24obixpKXtnJiYobj10W2k9bl0pLHJyKGEsaSxscihuLGUscixpLHQscykpfSkpLGF9ZnVuY3Rpb24gaHIodCxlLHIpe3ZhciBpPXIubGVuZ3RoO2lmKG51bGw9PXQpcmV0dXJuIWk7Zm9yKHQ9SXQodCk7aS0tOyl7dmFyIG89cltpXSxzPWVbb10sYT10W29dO2lmKGE9PT1uJiYhKG8gaW4gdCl8fCFzKGEpKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGZyKHQsZSxpKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7cmV0dXJuIE9vKChmdW5jdGlvbigpe3QuYXBwbHkobixpKX0pLGUpfWZ1bmN0aW9uIHByKHQsZSxuLHIpe3ZhciBpPS0xLG89TGUscz0hMCxhPXQubGVuZ3RoLHU9W10sYz1lLmxlbmd0aDtpZighYSlyZXR1cm4gdTtuJiYoZT1SZShlLHRuKG4pKSkscj8obz1QZSxzPSExKTplLmxlbmd0aD49MjAwJiYobz1ubixzPSExLGU9bmV3IEtuKGUpKTt0OmZvcig7KytpPGE7KXt2YXIgbD10W2ldLGg9bnVsbD09bj9sOm4obCk7aWYobD1yfHwwIT09bD9sOjAscyYmaD09aCl7Zm9yKHZhciBmPWM7Zi0tOylpZihlW2ZdPT09aCljb250aW51ZSB0O3UucHVzaChsKX1lbHNlIG8oZSxoLHIpfHx1LnB1c2gobCl9cmV0dXJuIHV9cW4udGVtcGxhdGVTZXR0aW5ncz17ZXNjYXBlOlEsZXZhbHVhdGU6JCxpbnRlcnBvbGF0ZTp0dCx2YXJpYWJsZToiIixpbXBvcnRzOntfOnFufX0scW4ucHJvdG90eXBlPUduLnByb3RvdHlwZSxxbi5wcm90b3R5cGUuY29uc3RydWN0b3I9cW4sWW4ucHJvdG90eXBlPVZuKEduLnByb3RvdHlwZSksWW4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPVluLFhuLnByb3RvdHlwZT1WbihHbi5wcm90b3R5cGUpLFhuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YbixXbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPUZuP0ZuKG51bGwpOnt9LHRoaXMuc2l6ZT0wfSxXbi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxXbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoRm4pe3ZhciByPWVbdF07cmV0dXJuIHI9PT1pP246cn1yZXR1cm4ga3QuY2FsbChlLHQpP2VbdF06bn0sV24ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBGbj9lW3RdIT09bjprdC5jYWxsKGUsdCl9LFduLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxyW3RdPUZuJiZlPT09bj9pOmUsdGhpc30sSG4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH0sSG4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49aXIoZSx0KTtyZXR1cm4hKG48MCkmJihuPT1lLmxlbmd0aC0xP2UucG9wKCk6UXQuY2FsbChlLG4sMSksLS10aGlzLnNpemUsITApfSxIbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1pcihlLHQpO3JldHVybiByPDA/bjplW3JdWzFdfSxIbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiBpcih0aGlzLl9fZGF0YV9fLHQpPi0xfSxIbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPWlyKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9LFpuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IFduLG1hcDpuZXcoQW58fEhuKSxzdHJpbmc6bmV3IFdufX0sWm4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT1obyh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxabi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBobyh0aGlzLHQpLmdldCh0KX0sWm4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gaG8odGhpcyx0KS5oYXModCl9LFpuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1obyh0aGlzLHQpLHI9bi5zaXplO3JldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZSs9bi5zaXplPT1yPzA6MSx0aGlzfSxLbi5wcm90b3R5cGUuYWRkPUtuLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LGkpLHRoaXN9LEtuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSxKbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPW5ldyBIbix0aGlzLnNpemU9MH0sSm4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn0sSm4ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9LEpuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSxKbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztpZihuIGluc3RhbmNlb2YgSG4pe3ZhciByPW4uX19kYXRhX187aWYoIUFufHxyLmxlbmd0aDwxOTkpcmV0dXJuIHIucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBabihyKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9O3ZhciBkcj1QaShiciksZ3I9UGkoRHIsITApO2Z1bmN0aW9uIHlyKHQsZSl7dmFyIG49ITA7cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQscixpKXtyZXR1cm4gbj0hIWUodCxyLGkpfSkpLG59ZnVuY3Rpb24gbXIodCxlLHIpe2Zvcih2YXIgaT0tMSxvPXQubGVuZ3RoOysraTxvOyl7dmFyIHM9dFtpXSxhPWUocyk7aWYobnVsbCE9YSYmKHU9PT1uP2E9PWEmJiFsYShhKTpyKGEsdSkpKXZhciB1PWEsYz1zfXJldHVybiBjfWZ1bmN0aW9uIHZyKHQsZSl7dmFyIG49W107cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQscixpKXtlKHQscixpKSYmbi5wdXNoKHQpfSkpLG59ZnVuY3Rpb24gX3IodCxlLG4scixpKXt2YXIgbz0tMSxzPXQubGVuZ3RoO2ZvcihufHwobj14byksaXx8KGk9W10pOysrbzxzOyl7dmFyIGE9dFtvXTtlPjAmJm4oYSk/ZT4xP19yKGEsZS0xLG4scixpKTpCZShpLGEpOnJ8fChpW2kubGVuZ3RoXT1hKX1yZXR1cm4gaX12YXIgeHI9UmkoKSx3cj1SaSghMCk7ZnVuY3Rpb24gYnIodCxlKXtyZXR1cm4gdCYmeHIodCxlLE9hKX1mdW5jdGlvbiBEcih0LGUpe3JldHVybiB0JiZ3cih0LGUsT2EpfWZ1bmN0aW9uIEVyKHQsZSl7cmV0dXJuIE9lKGUsKGZ1bmN0aW9uKGUpe3JldHVybiAkcyh0W2VdKX0pKX1mdW5jdGlvbiBDcih0LGUpe2Zvcih2YXIgcj0wLGk9KGU9d2koZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8aTspdD10W3pvKGVbcisrXSldO3JldHVybiByJiZyPT1pP3Q6bn1mdW5jdGlvbiBTcih0LGUsbil7dmFyIHI9ZSh0KTtyZXR1cm4gWHModCk/cjpCZShyLG4odCkpfWZ1bmN0aW9uIEFyKHQpe3JldHVybiBudWxsPT10P3Q9PT1uPyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjpyZSYmcmUgaW4gSXQodCk/ZnVuY3Rpb24odCl7dmFyIGU9a3QuY2FsbCh0LHJlKSxyPXRbcmVdO3RyeXt0W3JlXT1uO3ZhciBpPSEwfWNhdGNoKHQpe312YXIgbz1VdC5jYWxsKHQpO3JldHVybiBpJiYoZT90W3JlXT1yOmRlbGV0ZSB0W3JlXSksb30odCk6ZnVuY3Rpb24odCl7cmV0dXJuIFV0LmNhbGwodCl9KHQpfWZ1bmN0aW9uIE5yKHQsZSl7cmV0dXJuIHQ+ZX1mdW5jdGlvbiBJcih0LGUpe3JldHVybiBudWxsIT10JiZrdC5jYWxsKHQsZSl9ZnVuY3Rpb24gTXIodCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBJdCh0KX1mdW5jdGlvbiBGcih0LGUscil7Zm9yKHZhciBpPXI/UGU6TGUsbz10WzBdLmxlbmd0aCxzPXQubGVuZ3RoLGE9cyx1PUV0KHMpLGM9MS8wLGw9W107YS0tOyl7dmFyIGg9dFthXTthJiZlJiYoaD1SZShoLHRuKGUpKSksYz13bihoLmxlbmd0aCxjKSx1W2FdPSFyJiYoZXx8bz49MTIwJiZoLmxlbmd0aD49MTIwKT9uZXcgS24oYSYmaCk6bn1oPXRbMF07dmFyIGY9LTEscD11WzBdO3Q6Zm9yKDsrK2Y8byYmbC5sZW5ndGg8Yzspe3ZhciBkPWhbZl0sZz1lP2UoZCk6ZDtpZihkPXJ8fDAhPT1kP2Q6MCwhKHA/bm4ocCxnKTppKGwsZyxyKSkpe2ZvcihhPXM7LS1hOyl7dmFyIHk9dVthXTtpZighKHk/bm4oeSxnKTppKHRbYV0sZyxyKSkpY29udGludWUgdH1wJiZwLnB1c2goZyksbC5wdXNoKGQpfX1yZXR1cm4gbH1mdW5jdGlvbiBUcih0LGUscil7dmFyIGk9bnVsbD09KHQ9TW8odCxlPXdpKGUsdCkpKT90OnRbem8oUW8oZSkpXTtyZXR1cm4gbnVsbD09aT9uOk5lKGksdCxyKX1mdW5jdGlvbiBPcih0KXtyZXR1cm4gcmEodCkmJkFyKHQpPT12fWZ1bmN0aW9uIExyKHQsZSxyLGksbyl7cmV0dXJuIHQ9PT1lfHwobnVsbD09dHx8bnVsbD09ZXx8IXJhKHQpJiYhcmEoZSk/dCE9dCYmZSE9ZTpmdW5jdGlvbih0LGUscixpLG8scyl7dmFyIGE9WHModCksdT1YcyhlKSxjPWE/Xzptbyh0KSxsPXU/XzptbyhlKSxoPShjPWM9PXY/QTpjKT09QSxmPShsPWw9PXY/QTpsKT09QSxwPWM9PWw7aWYocCYmS3ModCkpe2lmKCFLcyhlKSlyZXR1cm4hMTthPSEwLGg9ITF9aWYocCYmIWgpcmV0dXJuIHN8fChzPW5ldyBKbiksYXx8aGEodCk/cm8odCxlLHIsaSxvLHMpOmZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMpe3N3aXRjaChuKXtjYXNlIFA6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIEw6cmV0dXJuISh0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8IW8obmV3IFd0KHQpLG5ldyBXdChlKSkpO2Nhc2UgeDpjYXNlIHc6Y2FzZSBTOnJldHVybiBxcygrdCwrZSk7Y2FzZSBiOnJldHVybiB0Lm5hbWU9PWUubmFtZSYmdC5tZXNzYWdlPT1lLm1lc3NhZ2U7Y2FzZSBJOmNhc2UgRjpyZXR1cm4gdD09ZSsiIjtjYXNlIEM6dmFyIGE9bG47Y2FzZSBNOnZhciB1PTEmcjtpZihhfHwoYT1wbiksdC5zaXplIT1lLnNpemUmJiF1KXJldHVybiExO3ZhciBjPXMuZ2V0KHQpO2lmKGMpcmV0dXJuIGM9PWU7cnw9MixzLnNldCh0LGUpO3ZhciBsPXJvKGEodCksYShlKSxyLGksbyxzKTtyZXR1cm4gcy5kZWxldGUodCksbDtjYXNlIFQ6aWYoam4pcmV0dXJuIGpuLmNhbGwodCk9PWpuLmNhbGwoZSl9cmV0dXJuITF9KHQsZSxjLHIsaSxvLHMpO2lmKCEoMSZyKSl7dmFyIGQ9aCYma3QuY2FsbCh0LCJfX3dyYXBwZWRfXyIpLGc9ZiYma3QuY2FsbChlLCJfX3dyYXBwZWRfXyIpO2lmKGR8fGcpe3ZhciB5PWQ/dC52YWx1ZSgpOnQsbT1nP2UudmFsdWUoKTplO3JldHVybiBzfHwocz1uZXcgSm4pLG8oeSxtLHIsaSxzKX19cmV0dXJuISFwJiYoc3x8KHM9bmV3IEpuKSxmdW5jdGlvbih0LGUscixpLG8scyl7dmFyIGE9MSZyLHU9b28odCksYz11Lmxlbmd0aCxsPW9vKGUpLGg9bC5sZW5ndGg7aWYoYyE9aCYmIWEpcmV0dXJuITE7Zm9yKHZhciBmPWM7Zi0tOyl7dmFyIHA9dVtmXTtpZighKGE/cCBpbiBlOmt0LmNhbGwoZSxwKSkpcmV0dXJuITF9dmFyIGQ9cy5nZXQodCksZz1zLmdldChlKTtpZihkJiZnKXJldHVybiBkPT1lJiZnPT10O3ZhciB5PSEwO3Muc2V0KHQsZSkscy5zZXQoZSx0KTtmb3IodmFyIG09YTsrK2Y8Yzspe3ZhciB2PXRbcD11W2ZdXSxfPWVbcF07aWYoaSl2YXIgeD1hP2koXyx2LHAsZSx0LHMpOmkodixfLHAsdCxlLHMpO2lmKCEoeD09PW4/dj09PV98fG8odixfLHIsaSxzKTp4KSl7eT0hMTticmVha31tfHwobT0iY29uc3RydWN0b3IiPT1wKX1pZih5JiYhbSl7dmFyIHc9dC5jb25zdHJ1Y3RvcixiPWUuY29uc3RydWN0b3I7dyE9YiYmImNvbnN0cnVjdG9yImluIHQmJiJjb25zdHJ1Y3RvciJpbiBlJiYhKCJmdW5jdGlvbiI9PXR5cGVvZiB3JiZ3IGluc3RhbmNlb2YgdyYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIgaW5zdGFuY2VvZiBiKSYmKHk9ITEpfXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSx5fSh0LGUscixpLG8scykpfSh0LGUscixpLExyLG8pKX1mdW5jdGlvbiBQcih0LGUscixpKXt2YXIgbz1yLmxlbmd0aCxzPW8sYT0haTtpZihudWxsPT10KXJldHVybiFzO2Zvcih0PUl0KHQpO28tLTspe3ZhciB1PXJbb107aWYoYSYmdVsyXT91WzFdIT09dFt1WzBdXTohKHVbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrbzxzOyl7dmFyIGM9KHU9cltvXSlbMF0sbD10W2NdLGg9dVsxXTtpZihhJiZ1WzJdKXtpZihsPT09biYmIShjIGluIHQpKXJldHVybiExfWVsc2V7dmFyIGY9bmV3IEpuO2lmKGkpdmFyIHA9aShsLGgsYyx0LGUsZik7aWYoIShwPT09bj9McihoLGwsMyxpLGYpOnApKXJldHVybiExfX1yZXR1cm4hMH1mdW5jdGlvbiBScih0KXtyZXR1cm4hKCFuYSh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuISFqdCYmanQgaW4gdH0odCkpJiYoJHModCk/R3Q6dnQpLnRlc3Qoam8odCkpfWZ1bmN0aW9uIEJyKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bnVsbD09dD9vdToib2JqZWN0Ij09dHlwZW9mIHQ/WHModCk/VnIodFswXSx0WzFdKTpxcih0KTpkdSh0KX1mdW5jdGlvbiBrcih0KXtpZighU28odCkpcmV0dXJuIF9uKHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiBJdCh0KSlrdC5jYWxsKHQsbikmJiJjb25zdHJ1Y3RvciIhPW4mJmUucHVzaChuKTtyZXR1cm4gZX1mdW5jdGlvbiB6cih0KXtpZighbmEodCkpcmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKG51bGwhPXQpZm9yKHZhciBuIGluIEl0KHQpKWUucHVzaChuKTtyZXR1cm4gZX0odCk7dmFyIGU9U28odCksbj1bXTtmb3IodmFyIHIgaW4gdCkiY29uc3RydWN0b3IiPT1yJiYoZXx8IWt0LmNhbGwodCxyKSl8fG4ucHVzaChyKTtyZXR1cm4gbn1mdW5jdGlvbiBqcih0LGUpe3JldHVybiB0PGV9ZnVuY3Rpb24gVXIodCxlKXt2YXIgbj0tMSxyPUhzKHQpP0V0KHQubGVuZ3RoKTpbXTtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxpLG8pe3JbKytuXT1lKHQsaSxvKX0pKSxyfWZ1bmN0aW9uIHFyKHQpe3ZhciBlPWZvKHQpO3JldHVybiAxPT1lLmxlbmd0aCYmZVswXVsyXT9ObyhlWzBdWzBdLGVbMF1bMV0pOmZ1bmN0aW9uKG4pe3JldHVybiBuPT09dHx8UHIobix0LGUpfX1mdW5jdGlvbiBWcih0LGUpe3JldHVybiBEbyh0KSYmQW8oZSk/Tm8oem8odCksZSk6ZnVuY3Rpb24ocil7dmFyIGk9TmEocix0KTtyZXR1cm4gaT09PW4mJmk9PT1lP0lhKHIsdCk6THIoZSxpLDMpfX1mdW5jdGlvbiBHcih0LGUscixpLG8pe3QhPT1lJiZ4cihlLChmdW5jdGlvbihzLGEpe2lmKG98fChvPW5ldyBKbiksbmEocykpIWZ1bmN0aW9uKHQsZSxyLGksbyxzLGEpe3ZhciB1PUZvKHQsciksYz1GbyhlLHIpLGw9YS5nZXQoYyk7aWYobClyZXR1cm4gdm9pZCBucih0LHIsbCk7dmFyIGg9cz9zKHUsYyxyKyIiLHQsZSxhKTpuLGY9aD09PW47aWYoZil7dmFyIHA9WHMoYyksZD0hcCYmS3MoYyksZz0hcCYmIWQmJmhhKGMpO2g9YyxwfHxkfHxnP1hzKHUpP2g9dTpacyh1KT9oPUZpKHUpOmQ/KGY9ITEsaD1DaShjLCEwKSk6Zz8oZj0hMSxoPUFpKGMsITApKTpoPVtdOnNhKGMpfHxZcyhjKT8oaD11LFlzKHUpP2g9X2EodSk6KCFuYSh1KXx8JHModSkpJiYoaD1fbyhjKSkpOmY9ITF9ZiYmKGEuc2V0KGMsaCksbyhoLGMsaSxzLGEpLGEuZGVsZXRlKGMpKSxucih0LHIsaCl9KHQsZSxhLHIsR3IsaSxvKTtlbHNle3ZhciB1PWk/aShGbyh0LGEpLHMsYSsiIix0LGUsbyk6bjt1PT09biYmKHU9cyksbnIodCxhLHUpfX0pLExhKX1mdW5jdGlvbiBZcih0LGUpe3ZhciByPXQubGVuZ3RoO2lmKHIpcmV0dXJuIHdvKGUrPWU8MD9yOjAscik/dFtlXTpufWZ1bmN0aW9uIFhyKHQsZSxuKXtlPWUubGVuZ3RoP1JlKGUsKGZ1bmN0aW9uKHQpe3JldHVybiBYcyh0KT9mdW5jdGlvbihlKXtyZXR1cm4gQ3IoZSwxPT09dC5sZW5ndGg/dFswXTp0KX06dH0pKTpbb3VdO3ZhciByPS0xO3JldHVybiBlPVJlKGUsdG4obG8oKSkpLGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5sZW5ndGg7Zm9yKHQuc29ydChlKTtuLS07KXRbbl09dFtuXS52YWx1ZTtyZXR1cm4gdH0oVXIodCwoZnVuY3Rpb24odCxuLGkpe3JldHVybntjcml0ZXJpYTpSZShlLChmdW5jdGlvbihlKXtyZXR1cm4gZSh0KX0pKSxpbmRleDorK3IsdmFsdWU6dH19KSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9LTEsaT10LmNyaXRlcmlhLG89ZS5jcml0ZXJpYSxzPWkubGVuZ3RoLGE9bi5sZW5ndGg7KytyPHM7KXt2YXIgdT1OaShpW3JdLG9bcl0pO2lmKHUpcmV0dXJuIHI+PWE/dTp1KigiZGVzYyI9PW5bcl0/LTE6MSl9cmV0dXJuIHQuaW5kZXgtZS5pbmRleH0odCxlLG4pfSkpfWZ1bmN0aW9uIFdyKHQsZSxuKXtmb3IodmFyIHI9LTEsaT1lLmxlbmd0aCxvPXt9OysrcjxpOyl7dmFyIHM9ZVtyXSxhPUNyKHQscyk7bihhLHMpJiZlaShvLHdpKHMsdCksYSl9cmV0dXJuIG99ZnVuY3Rpb24gSHIodCxlLG4scil7dmFyIGk9cj9ZZTpHZSxvPS0xLHM9ZS5sZW5ndGgsYT10O2Zvcih0PT09ZSYmKGU9RmkoZSkpLG4mJihhPVJlKHQsdG4obikpKTsrK288czspZm9yKHZhciB1PTAsYz1lW29dLGw9bj9uKGMpOmM7KHU9aShhLGwsdSxyKSk+LTE7KWEhPT10JiZRdC5jYWxsKGEsdSwxKSxRdC5jYWxsKHQsdSwxKTtyZXR1cm4gdH1mdW5jdGlvbiBacih0LGUpe2Zvcih2YXIgbj10P2UubGVuZ3RoOjAscj1uLTE7bi0tOyl7dmFyIGk9ZVtuXTtpZihuPT1yfHxpIT09byl7dmFyIG89aTt3byhpKT9RdC5jYWxsKHQsaSwxKTpwaSh0LGkpfX1yZXR1cm4gdH1mdW5jdGlvbiBLcih0LGUpe3JldHVybiB0K3ZlKEVuKCkqKGUtdCsxKSl9ZnVuY3Rpb24gSnIodCxlKXt2YXIgbj0iIjtpZighdHx8ZTwxfHxlPmYpcmV0dXJuIG47ZG97ZSUyJiYobis9dCksKGU9dmUoZS8yKSkmJih0Kz10KX13aGlsZShlKTtyZXR1cm4gbn1mdW5jdGlvbiBRcih0LGUpe3JldHVybiBMbyhJbyh0LGUsb3UpLHQrIiIpfWZ1bmN0aW9uICRyKHQpe3JldHVybiAkbihxYSh0KSl9ZnVuY3Rpb24gdGkodCxlKXt2YXIgbj1xYSh0KTtyZXR1cm4gQm8obixjcihlLDAsbi5sZW5ndGgpKX1mdW5jdGlvbiBlaSh0LGUscixpKXtpZighbmEodCkpcmV0dXJuIHQ7Zm9yKHZhciBvPS0xLHM9KGU9d2koZSx0KSkubGVuZ3RoLGE9cy0xLHU9dDtudWxsIT11JiYrK288czspe3ZhciBjPXpvKGVbb10pLGw9cjtpZigiX19wcm90b19fIj09PWN8fCJjb25zdHJ1Y3RvciI9PT1jfHwicHJvdG90eXBlIj09PWMpcmV0dXJuIHQ7aWYobyE9YSl7dmFyIGg9dVtjXTsobD1pP2koaCxjLHUpOm4pPT09biYmKGw9bmEoaCk/aDp3byhlW28rMV0pP1tdOnt9KX1ycih1LGMsbCksdT11W2NdfXJldHVybiB0fXZhciBuaT1Ubj9mdW5jdGlvbih0LGUpe3JldHVybiBUbi5zZXQodCxlKSx0fTpvdSxyaT1vZT9mdW5jdGlvbih0LGUpe3JldHVybiBvZSh0LCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOm51KGUpLHdyaXRhYmxlOiEwfSl9Om91O2Z1bmN0aW9uIGlpKHQpe3JldHVybiBCbyhxYSh0KSl9ZnVuY3Rpb24gb2kodCxlLG4pe3ZhciByPS0xLGk9dC5sZW5ndGg7ZTwwJiYoZT0tZT5pPzA6aStlKSwobj1uPmk/aTpuKTwwJiYobis9aSksaT1lPm4/MDpuLWU+Pj4wLGU+Pj49MDtmb3IodmFyIG89RXQoaSk7KytyPGk7KW9bcl09dFtyK2VdO3JldHVybiBvfWZ1bmN0aW9uIHNpKHQsZSl7dmFyIG47cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQscixpKXtyZXR1cm4hKG49ZSh0LHIsaSkpfSkpLCEhbn1mdW5jdGlvbiBhaSh0LGUsbil7dmFyIHI9MCxpPW51bGw9PXQ/cjp0Lmxlbmd0aDtpZigibnVtYmVyIj09dHlwZW9mIGUmJmU9PWUmJmk8PXkpe2Zvcig7cjxpOyl7dmFyIG89citpPj4+MSxzPXRbb107bnVsbCE9PXMmJiFsYShzKSYmKG4/czw9ZTpzPGUpP3I9bysxOmk9b31yZXR1cm4gaX1yZXR1cm4gdWkodCxlLG91LG4pfWZ1bmN0aW9uIHVpKHQsZSxyLGkpe3ZhciBvPTAscz1udWxsPT10PzA6dC5sZW5ndGg7aWYoMD09PXMpcmV0dXJuIDA7Zm9yKHZhciBhPShlPXIoZSkpIT1lLHU9bnVsbD09PWUsYz1sYShlKSxsPWU9PT1uO288czspe3ZhciBoPXZlKChvK3MpLzIpLGY9cih0W2hdKSxwPWYhPT1uLGQ9bnVsbD09PWYseT1mPT1mLG09bGEoZik7aWYoYSl2YXIgdj1pfHx5O2Vsc2Ugdj1sP3kmJihpfHxwKTp1P3kmJnAmJihpfHwhZCk6Yz95JiZwJiYhZCYmKGl8fCFtKTohZCYmIW0mJihpP2Y8PWU6ZjxlKTt2P289aCsxOnM9aH1yZXR1cm4gd24ocyxnKX1mdW5jdGlvbiBjaSh0LGUpe2Zvcih2YXIgbj0tMSxyPXQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIHM9dFtuXSxhPWU/ZShzKTpzO2lmKCFufHwhcXMoYSx1KSl7dmFyIHU9YTtvW2krK109MD09PXM/MDpzfX1yZXR1cm4gb31mdW5jdGlvbiBsaSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dDpsYSh0KT9wOit0fWZ1bmN0aW9uIGhpKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gdDtpZihYcyh0KSlyZXR1cm4gUmUodCxoaSkrIiI7aWYobGEodCkpcmV0dXJuIFVuP1VuLmNhbGwodCk6IiI7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LWg/Ii0wIjplfWZ1bmN0aW9uIGZpKHQsZSxuKXt2YXIgcj0tMSxpPUxlLG89dC5sZW5ndGgscz0hMCxhPVtdLHU9YTtpZihuKXM9ITEsaT1QZTtlbHNlIGlmKG8+PTIwMCl7dmFyIGM9ZT9udWxsOkppKHQpO2lmKGMpcmV0dXJuIHBuKGMpO3M9ITEsaT1ubix1PW5ldyBLbn1lbHNlIHU9ZT9bXTphO3Q6Zm9yKDsrK3I8bzspe3ZhciBsPXRbcl0saD1lP2UobCk6bDtpZihsPW58fDAhPT1sP2w6MCxzJiZoPT1oKXtmb3IodmFyIGY9dS5sZW5ndGg7Zi0tOylpZih1W2ZdPT09aCljb250aW51ZSB0O2UmJnUucHVzaChoKSxhLnB1c2gobCl9ZWxzZSBpKHUsaCxuKXx8KHUhPT1hJiZ1LnB1c2goaCksYS5wdXNoKGwpKX1yZXR1cm4gYX1mdW5jdGlvbiBwaSh0LGUpe3JldHVybiBudWxsPT0odD1Nbyh0LGU9d2koZSx0KSkpfHxkZWxldGUgdFt6byhRbyhlKSldfWZ1bmN0aW9uIGRpKHQsZSxuLHIpe3JldHVybiBlaSh0LGUsbihDcih0LGUpKSxyKX1mdW5jdGlvbiBnaSh0LGUsbixyKXtmb3IodmFyIGk9dC5sZW5ndGgsbz1yP2k6LTE7KHI/by0tOisrbzxpKSYmZSh0W29dLG8sdCk7KTtyZXR1cm4gbj9vaSh0LHI/MDpvLHI/bysxOmkpOm9pKHQscj9vKzE6MCxyP2k6byl9ZnVuY3Rpb24geWkodCxlKXt2YXIgbj10O3JldHVybiBuIGluc3RhbmNlb2YgWG4mJihuPW4udmFsdWUoKSksa2UoZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5mdW5jLmFwcGx5KGUudGhpc0FyZyxCZShbdF0sZS5hcmdzKSl9KSxuKX1mdW5jdGlvbiBtaSh0LGUsbil7dmFyIHI9dC5sZW5ndGg7aWYocjwyKXJldHVybiByP2ZpKHRbMF0pOltdO2Zvcih2YXIgaT0tMSxvPUV0KHIpOysraTxyOylmb3IodmFyIHM9dFtpXSxhPS0xOysrYTxyOylhIT1pJiYob1tpXT1wcihvW2ldfHxzLHRbYV0sZSxuKSk7cmV0dXJuIGZpKF9yKG8sMSksZSxuKX1mdW5jdGlvbiB2aSh0LGUscil7Zm9yKHZhciBpPS0xLG89dC5sZW5ndGgscz1lLmxlbmd0aCxhPXt9OysraTxvOyl7dmFyIHU9aTxzP2VbaV06bjtyKGEsdFtpXSx1KX1yZXR1cm4gYX1mdW5jdGlvbiBfaSh0KXtyZXR1cm4gWnModCk/dDpbXX1mdW5jdGlvbiB4aSh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om91fWZ1bmN0aW9uIHdpKHQsZSl7cmV0dXJuIFhzKHQpP3Q6RG8odCxlKT9bdF06a28oeGEodCkpfXZhciBiaT1RcjtmdW5jdGlvbiBEaSh0LGUscil7dmFyIGk9dC5sZW5ndGg7cmV0dXJuIHI9cj09PW4/aTpyLCFlJiZyPj1pP3Q6b2kodCxlLHIpfXZhciBFaT1oZXx8ZnVuY3Rpb24odCl7cmV0dXJuIHllLmNsZWFyVGltZW91dCh0KX07ZnVuY3Rpb24gQ2kodCxlKXtpZihlKXJldHVybiB0LnNsaWNlKCk7dmFyIG49dC5sZW5ndGgscj1IdD9IdChuKTpuZXcgdC5jb25zdHJ1Y3RvcihuKTtyZXR1cm4gdC5jb3B5KHIpLHJ9ZnVuY3Rpb24gU2kodCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IFd0KGUpLnNldChuZXcgV3QodCkpLGV9ZnVuY3Rpb24gQWkodCxlKXt2YXIgbj1lP1NpKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfWZ1bmN0aW9uIE5pKHQsZSl7aWYodCE9PWUpe3ZhciByPXQhPT1uLGk9bnVsbD09PXQsbz10PT10LHM9bGEodCksYT1lIT09bix1PW51bGw9PT1lLGM9ZT09ZSxsPWxhKGUpO2lmKCF1JiYhbCYmIXMmJnQ+ZXx8cyYmYSYmYyYmIXUmJiFsfHxpJiZhJiZjfHwhciYmY3x8IW8pcmV0dXJuIDE7aWYoIWkmJiFzJiYhbCYmdDxlfHxsJiZyJiZvJiYhaSYmIXN8fHUmJnImJm98fCFhJiZvfHwhYylyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBJaSh0LGUsbixyKXtmb3IodmFyIGk9LTEsbz10Lmxlbmd0aCxzPW4ubGVuZ3RoLGE9LTEsdT1lLmxlbmd0aCxjPXhuKG8tcywwKSxsPUV0KHUrYyksaD0hcjsrK2E8dTspbFthXT1lW2FdO2Zvcig7KytpPHM7KShofHxpPG8pJiYobFtuW2ldXT10W2ldKTtmb3IoO2MtLTspbFthKytdPXRbaSsrXTtyZXR1cm4gbH1mdW5jdGlvbiBNaSh0LGUsbixyKXtmb3IodmFyIGk9LTEsbz10Lmxlbmd0aCxzPS0xLGE9bi5sZW5ndGgsdT0tMSxjPWUubGVuZ3RoLGw9eG4oby1hLDApLGg9RXQobCtjKSxmPSFyOysraTxsOyloW2ldPXRbaV07Zm9yKHZhciBwPWk7Kyt1PGM7KWhbcCt1XT1lW3VdO2Zvcig7KytzPGE7KShmfHxpPG8pJiYoaFtwK25bc11dPXRbaSsrXSk7cmV0dXJuIGh9ZnVuY3Rpb24gRmkodCxlKXt2YXIgbj0tMSxyPXQubGVuZ3RoO2ZvcihlfHwoZT1FdChyKSk7KytuPHI7KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBUaSh0LGUscixpKXt2YXIgbz0hcjtyfHwocj17fSk7Zm9yKHZhciBzPS0xLGE9ZS5sZW5ndGg7KytzPGE7KXt2YXIgdT1lW3NdLGM9aT9pKHJbdV0sdFt1XSx1LHIsdCk6bjtjPT09biYmKGM9dFt1XSksbz9hcihyLHUsYyk6cnIocix1LGMpfXJldHVybiByfWZ1bmN0aW9uIE9pKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scil7dmFyIGk9WHMobik/SWU6b3Isbz1lP2UoKTp7fTtyZXR1cm4gaShuLHQsbG8ociwyKSxvKX19ZnVuY3Rpb24gTGkodCl7cmV0dXJuIFFyKChmdW5jdGlvbihlLHIpe3ZhciBpPS0xLG89ci5sZW5ndGgscz1vPjE/cltvLTFdOm4sYT1vPjI/clsyXTpuO2ZvcihzPXQubGVuZ3RoPjMmJiJmdW5jdGlvbiI9PXR5cGVvZiBzPyhvLS0scyk6bixhJiZibyhyWzBdLHJbMV0sYSkmJihzPW88Mz9uOnMsbz0xKSxlPUl0KGUpOysraTxvOyl7dmFyIHU9cltpXTt1JiZ0KGUsdSxpLHMpfXJldHVybiBlfSkpfWZ1bmN0aW9uIFBpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scil7aWYobnVsbD09bilyZXR1cm4gbjtpZighSHMobikpcmV0dXJuIHQobixyKTtmb3IodmFyIGk9bi5sZW5ndGgsbz1lP2k6LTEscz1JdChuKTsoZT9vLS06KytvPGkpJiYhMSE9PXIoc1tvXSxvLHMpOyk7cmV0dXJuIG59fWZ1bmN0aW9uIFJpKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7Zm9yKHZhciBpPS0xLG89SXQoZSkscz1yKGUpLGE9cy5sZW5ndGg7YS0tOyl7dmFyIHU9c1t0P2E6KytpXTtpZighMT09PW4ob1t1XSx1LG8pKWJyZWFrfXJldHVybiBlfX1mdW5jdGlvbiBCaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9Y24oZT14YShlKSk/Z24oZSk6bixpPXI/clswXTplLmNoYXJBdCgwKSxvPXI/RGkociwxKS5qb2luKCIiKTplLnNsaWNlKDEpO3JldHVybiBpW3RdKCkrb319ZnVuY3Rpb24ga2kodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBrZSgkYShZYShlKS5yZXBsYWNlKGVlLCIiKSksdCwiIil9fWZ1bmN0aW9uIHppKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdKTtjYXNlIDU6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSk7Y2FzZSA2OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSk7Y2FzZSA3OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdKX12YXIgbj1Wbih0LnByb3RvdHlwZSkscj10LmFwcGx5KG4sZSk7cmV0dXJuIG5hKHIpP3I6bn19ZnVuY3Rpb24gamkodCl7cmV0dXJuIGZ1bmN0aW9uKGUscixpKXt2YXIgbz1JdChlKTtpZighSHMoZSkpe3ZhciBzPWxvKHIsMyk7ZT1PYShlKSxyPWZ1bmN0aW9uKHQpe3JldHVybiBzKG9bdF0sdCxvKX19dmFyIGE9dChlLHIsaSk7cmV0dXJuIGE+LTE/b1tzP2VbYV06YV06bn19ZnVuY3Rpb24gVWkodCl7cmV0dXJuIGlvKChmdW5jdGlvbihlKXt2YXIgaT1lLmxlbmd0aCxvPWkscz1Zbi5wcm90b3R5cGUudGhydTtmb3IodCYmZS5yZXZlcnNlKCk7by0tOyl7dmFyIGE9ZVtvXTtpZigiZnVuY3Rpb24iIT10eXBlb2YgYSl0aHJvdyBuZXcgVHQocik7aWYocyYmIXUmJiJ3cmFwcGVyIj09dW8oYSkpdmFyIHU9bmV3IFluKFtdLCEwKX1mb3Iobz11P286aTsrK288aTspe3ZhciBjPXVvKGE9ZVtvXSksbD0id3JhcHBlciI9PWM/YW8oYSk6bjt1PWwmJkVvKGxbMF0pJiY0MjQ9PWxbMV0mJiFsWzRdLmxlbmd0aCYmMT09bFs5XT91W3VvKGxbMF0pXS5hcHBseSh1LGxbM10pOjE9PWEubGVuZ3RoJiZFbyhhKT91W2NdKCk6dS50aHJ1KGEpfXJldHVybiBmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cyxuPXRbMF07aWYodSYmMT09dC5sZW5ndGgmJlhzKG4pKXJldHVybiB1LnBsYW50KG4pLnZhbHVlKCk7Zm9yKHZhciByPTAsbz1pP2Vbcl0uYXBwbHkodGhpcyx0KTpuOysrcjxpOylvPWVbcl0uY2FsbCh0aGlzLG8pO3JldHVybiBvfX0pKX1mdW5jdGlvbiBxaSh0LGUscixpLG8scyxhLHUsbCxoKXt2YXIgZj1lJmMscD0xJmUsZD0yJmUsZz0yNCZlLHk9NTEyJmUsbT1kP246emkodCk7cmV0dXJuIGZ1bmN0aW9uIGMoKXtmb3IodmFyIHY9YXJndW1lbnRzLmxlbmd0aCxfPUV0KHYpLHg9djt4LS07KV9beF09YXJndW1lbnRzW3hdO2lmKGcpdmFyIHc9Y28oYyksYj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aCxyPTA7bi0tOyl0W25dPT09ZSYmKytyO3JldHVybiByfShfLHcpO2lmKGkmJihfPUlpKF8saSxvLGcpKSxzJiYoXz1NaShfLHMsYSxnKSksdi09YixnJiZ2PGgpe3ZhciBEPWZuKF8sdyk7cmV0dXJuIFppKHQsZSxxaSxjLnBsYWNlaG9sZGVyLHIsXyxELHUsbCxoLXYpfXZhciBFPXA/cjp0aGlzLEM9ZD9FW3RdOnQ7cmV0dXJuIHY9Xy5sZW5ndGgsdT9fPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoLGk9d24oZS5sZW5ndGgsciksbz1GaSh0KTtpLS07KXt2YXIgcz1lW2ldO3RbaV09d28ocyxyKT9vW3NdOm59cmV0dXJuIHR9KF8sdSk6eSYmdj4xJiZfLnJldmVyc2UoKSxmJiZsPHYmJihfLmxlbmd0aD1sKSx0aGlzJiZ0aGlzIT09eWUmJnRoaXMgaW5zdGFuY2VvZiBjJiYoQz1tfHx6aShDKSksQy5hcHBseShFLF8pfX1mdW5jdGlvbiBWaSh0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe3JldHVybiBmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gYnIodCwoZnVuY3Rpb24odCxpLG8pe2UocixuKHQpLGksbyl9KSkscn0obix0LGUocikse30pfX1mdW5jdGlvbiBHaSh0LGUpe3JldHVybiBmdW5jdGlvbihyLGkpe3ZhciBvO2lmKHI9PT1uJiZpPT09bilyZXR1cm4gZTtpZihyIT09biYmKG89ciksaSE9PW4pe2lmKG89PT1uKXJldHVybiBpOyJzdHJpbmciPT10eXBlb2Ygcnx8InN0cmluZyI9PXR5cGVvZiBpPyhyPWhpKHIpLGk9aGkoaSkpOihyPWxpKHIpLGk9bGkoaSkpLG89dChyLGkpfXJldHVybiBvfX1mdW5jdGlvbiBZaSh0KXtyZXR1cm4gaW8oKGZ1bmN0aW9uKGUpe3JldHVybiBlPVJlKGUsdG4obG8oKSkpLFFyKChmdW5jdGlvbihuKXt2YXIgcj10aGlzO3JldHVybiB0KGUsKGZ1bmN0aW9uKHQpe3JldHVybiBOZSh0LHIsbil9KSl9KSl9KSl9ZnVuY3Rpb24gWGkodCxlKXt2YXIgcj0oZT1lPT09bj8iICI6aGkoZSkpLmxlbmd0aDtpZihyPDIpcmV0dXJuIHI/SnIoZSx0KTplO3ZhciBpPUpyKGUsbWUodC9kbihlKSkpO3JldHVybiBjbihlKT9EaShnbihpKSwwLHQpLmpvaW4oIiIpOmkuc2xpY2UoMCx0KX1mdW5jdGlvbiBXaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLGkpe3JldHVybiBpJiYibnVtYmVyIiE9dHlwZW9mIGkmJmJvKGUscixpKSYmKHI9aT1uKSxlPWdhKGUpLHI9PT1uPyhyPWUsZT0wKTpyPWdhKHIpLGZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaT0tMSxvPXhuKG1lKChlLXQpLyhufHwxKSksMCkscz1FdChvKTtvLS07KXNbcj9vOisraV09dCx0Kz1uO3JldHVybiBzfShlLHIsaT1pPT09bj9lPHI/MTotMTpnYShpKSx0KX19ZnVuY3Rpb24gSGkodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYic3RyaW5nIj09dHlwZW9mIG58fChlPXZhKGUpLG49dmEobikpLHQoZSxuKX19ZnVuY3Rpb24gWmkodCxlLHIsaSxvLHMsYyxsLGgsZil7dmFyIHA9OCZlO2V8PXA/YTp1LDQmKGUmPX4ocD91OmEpKXx8KGUmPS00KTt2YXIgZD1bdCxlLG8scD9zOm4scD9jOm4scD9uOnMscD9uOmMsbCxoLGZdLGc9ci5hcHBseShuLGQpO3JldHVybiBFbyh0KSYmVG8oZyxkKSxnLnBsYWNlaG9sZGVyPWksUG8oZyx0LGUpfWZ1bmN0aW9uIEtpKHQpe3ZhciBlPU50W3RdO3JldHVybiBmdW5jdGlvbih0LG4pe2lmKHQ9dmEodCksKG49bnVsbD09bj8wOnduKHlhKG4pLDI5MikpJiZVZSh0KSl7dmFyIHI9KHhhKHQpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKChyPSh4YShlKHJbMF0rImUiKygrclsxXStuKSkpKyJlIikuc3BsaXQoImUiKSlbMF0rImUiKygrclsxXS1uKSl9cmV0dXJuIGUodCl9fXZhciBKaT1JbiYmMS9wbihuZXcgSW4oWywtMF0pKVsxXT09aD9mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEluKHQpfTpsdTtmdW5jdGlvbiBRaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49bW8oZSk7cmV0dXJuIG49PUM/bG4oZSk6bj09TT9mdW5jdGlvbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7blsrK2VdPVt0LHRdfSkpLG59KGUpOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFJlKGUsKGZ1bmN0aW9uKGUpe3JldHVybltlLHRbZV1dfSkpfShlLHQoZSkpfX1mdW5jdGlvbiAkaSh0LGUsaSxoLGYscCxkLGcpe3ZhciB5PTImZTtpZigheSYmImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3ZhciBtPWg/aC5sZW5ndGg6MDtpZihtfHwoZSY9LTk3LGg9Zj1uKSxkPWQ9PT1uP2Q6eG4oeWEoZCksMCksZz1nPT09bj9nOnlhKGcpLG0tPWY/Zi5sZW5ndGg6MCxlJnUpe3ZhciB2PWgsXz1mO2g9Zj1ufXZhciB4PXk/bjphbyh0KSx3PVt0LGUsaSxoLGYsdixfLHAsZCxnXTtpZih4JiZmdW5jdGlvbih0LGUpe3ZhciBuPXRbMV0scj1lWzFdLGk9bnxyLHM9aTwxMzEsYT1yPT1jJiY4PT1ufHxyPT1jJiZuPT1sJiZ0WzddLmxlbmd0aDw9ZVs4XXx8Mzg0PT1yJiZlWzddLmxlbmd0aDw9ZVs4XSYmOD09bjtpZighcyYmIWEpcmV0dXJuIHQ7MSZyJiYodFsyXT1lWzJdLGl8PTEmbj8wOjQpO3ZhciB1PWVbM107aWYodSl7dmFyIGg9dFszXTt0WzNdPWg/SWkoaCx1LGVbNF0pOnUsdFs0XT1oP2ZuKHRbM10sbyk6ZVs0XX11PWVbNV0sdSYmKGg9dFs1XSx0WzVdPWg/TWkoaCx1LGVbNl0pOnUsdFs2XT1oP2ZuKHRbNV0sbyk6ZVs2XSksdT1lWzddLHUmJih0WzddPXUpLHImYyYmKHRbOF09bnVsbD09dFs4XT9lWzhdOnduKHRbOF0sZVs4XSkpLG51bGw9PXRbOV0mJih0WzldPWVbOV0pLHRbMF09ZVswXSx0WzFdPWl9KHcseCksdD13WzBdLGU9d1sxXSxpPXdbMl0saD13WzNdLGY9d1s0XSwhKGc9d1s5XT13WzldPT09bj95PzA6dC5sZW5ndGg6eG4od1s5XS1tLDApKSYmMjQmZSYmKGUmPS0yNSksZSYmMSE9ZSliPTg9PWV8fGU9PXM/ZnVuY3Rpb24odCxlLHIpe3ZhciBpPXppKHQpO3JldHVybiBmdW5jdGlvbiBvKCl7Zm9yKHZhciBzPWFyZ3VtZW50cy5sZW5ndGgsYT1FdChzKSx1PXMsYz1jbyhvKTt1LS07KWFbdV09YXJndW1lbnRzW3VdO3ZhciBsPXM8MyYmYVswXSE9PWMmJmFbcy0xXSE9PWM/W106Zm4oYSxjKTtyZXR1cm4ocy09bC5sZW5ndGgpPHI/WmkodCxlLHFpLG8ucGxhY2Vob2xkZXIsbixhLGwsbixuLHItcyk6TmUodGhpcyYmdGhpcyE9PXllJiZ0aGlzIGluc3RhbmNlb2Ygbz9pOnQsdGhpcyxhKX19KHQsZSxnKTplIT1hJiYzMyE9ZXx8Zi5sZW5ndGg/cWkuYXBwbHkobix3KTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT0xJmUsbz16aSh0KTtyZXR1cm4gZnVuY3Rpb24gZSgpe2Zvcih2YXIgcz0tMSxhPWFyZ3VtZW50cy5sZW5ndGgsdT0tMSxjPXIubGVuZ3RoLGw9RXQoYythKSxoPXRoaXMmJnRoaXMhPT15ZSYmdGhpcyBpbnN0YW5jZW9mIGU/bzp0OysrdTxjOylsW3VdPXJbdV07Zm9yKDthLS07KWxbdSsrXT1hcmd1bWVudHNbKytzXTtyZXR1cm4gTmUoaCxpP246dGhpcyxsKX19KHQsZSxpLGgpO2Vsc2UgdmFyIGI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPTEmZSxpPXppKHQpO3JldHVybiBmdW5jdGlvbiBlKCl7cmV0dXJuKHRoaXMmJnRoaXMhPT15ZSYmdGhpcyBpbnN0YW5jZW9mIGU/aTp0KS5hcHBseShyP246dGhpcyxhcmd1bWVudHMpfX0odCxlLGkpO3JldHVybiBQbygoeD9uaTpUbykoYix3KSx0LGUpfWZ1bmN0aW9uIHRvKHQsZSxyLGkpe3JldHVybiB0PT09bnx8cXModCxQdFtyXSkmJiFrdC5jYWxsKGkscik/ZTp0fWZ1bmN0aW9uIGVvKHQsZSxyLGksbyxzKXtyZXR1cm4gbmEodCkmJm5hKGUpJiYocy5zZXQoZSx0KSxHcih0LGUsbixlbyxzKSxzLmRlbGV0ZShlKSksdH1mdW5jdGlvbiBubyh0KXtyZXR1cm4gc2EodCk/bjp0fWZ1bmN0aW9uIHJvKHQsZSxyLGksbyxzKXt2YXIgYT0xJnIsdT10Lmxlbmd0aCxjPWUubGVuZ3RoO2lmKHUhPWMmJiEoYSYmYz51KSlyZXR1cm4hMTt2YXIgbD1zLmdldCh0KSxoPXMuZ2V0KGUpO2lmKGwmJmgpcmV0dXJuIGw9PWUmJmg9PXQ7dmFyIGY9LTEscD0hMCxkPTImcj9uZXcgS246bjtmb3Iocy5zZXQodCxlKSxzLnNldChlLHQpOysrZjx1Oyl7dmFyIGc9dFtmXSx5PWVbZl07aWYoaSl2YXIgbT1hP2koeSxnLGYsZSx0LHMpOmkoZyx5LGYsdCxlLHMpO2lmKG0hPT1uKXtpZihtKWNvbnRpbnVlO3A9ITE7YnJlYWt9aWYoZCl7aWYoIWplKGUsKGZ1bmN0aW9uKHQsZSl7aWYoIW5uKGQsZSkmJihnPT09dHx8byhnLHQscixpLHMpKSlyZXR1cm4gZC5wdXNoKGUpfSkpKXtwPSExO2JyZWFrfX1lbHNlIGlmKGchPT15JiYhbyhnLHkscixpLHMpKXtwPSExO2JyZWFrfX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSkscH1mdW5jdGlvbiBpbyh0KXtyZXR1cm4gTG8oSW8odCxuLFdvKSx0KyIiKX1mdW5jdGlvbiBvbyh0KXtyZXR1cm4gU3IodCxPYSxnbyl9ZnVuY3Rpb24gc28odCl7cmV0dXJuIFNyKHQsTGEseW8pfXZhciBhbz1Ubj9mdW5jdGlvbih0KXtyZXR1cm4gVG4uZ2V0KHQpfTpsdTtmdW5jdGlvbiB1byh0KXtmb3IodmFyIGU9dC5uYW1lKyIiLG49T25bZV0scj1rdC5jYWxsKE9uLGUpP24ubGVuZ3RoOjA7ci0tOyl7dmFyIGk9bltyXSxvPWkuZnVuYztpZihudWxsPT1vfHxvPT10KXJldHVybiBpLm5hbWV9cmV0dXJuIGV9ZnVuY3Rpb24gY28odCl7cmV0dXJuKGt0LmNhbGwocW4sInBsYWNlaG9sZGVyIik/cW46dCkucGxhY2Vob2xkZXJ9ZnVuY3Rpb24gbG8oKXt2YXIgdD1xbi5pdGVyYXRlZXx8c3U7cmV0dXJuIHQ9dD09PXN1P0JyOnQsYXJndW1lbnRzLmxlbmd0aD90KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOnR9ZnVuY3Rpb24gaG8odCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fShlKT9uWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIGZvKHQpe2Zvcih2YXIgZT1PYSh0KSxuPWUubGVuZ3RoO24tLTspe3ZhciByPWVbbl0saT10W3JdO2Vbbl09W3IsaSxBbyhpKV19cmV0dXJuIGV9ZnVuY3Rpb24gcG8odCxlKXt2YXIgcj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P246dFtlXX0odCxlKTtyZXR1cm4gUnIocik/cjpufXZhciBnbz14ZT9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1JdCh0KSxPZSh4ZSh0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIEp0LmNhbGwodCxlKX0pKSl9Om11LHlvPXhlP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXTt0OylCZShlLGdvKHQpKSx0PVp0KHQpO3JldHVybiBlfTptdSxtbz1BcjtmdW5jdGlvbiB2byh0LGUsbil7Zm9yKHZhciByPS0xLGk9KGU9d2koZSx0KSkubGVuZ3RoLG89ITE7KytyPGk7KXt2YXIgcz16byhlW3JdKTtpZighKG89bnVsbCE9dCYmbih0LHMpKSlicmVhazt0PXRbc119cmV0dXJuIG98fCsrciE9aT9vOiEhKGk9bnVsbD09dD8wOnQubGVuZ3RoKSYmZWEoaSkmJndvKHMsaSkmJihYcyh0KXx8WXModCkpfWZ1bmN0aW9uIF9vKHQpe3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0LmNvbnN0cnVjdG9yfHxTbyh0KT97fTpWbihadCh0KSl9ZnVuY3Rpb24geG8odCl7cmV0dXJuIFhzKHQpfHxZcyh0KXx8ISEoJHQmJnQmJnRbJHRdKX1mdW5jdGlvbiB3byh0LGUpe3ZhciBuPXR5cGVvZiB0O3JldHVybiEhKGU9bnVsbD09ZT9mOmUpJiYoIm51bWJlciI9PW58fCJzeW1ib2wiIT1uJiZ4dC50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9ZnVuY3Rpb24gYm8odCxlLG4pe2lmKCFuYShuKSlyZXR1cm4hMTt2YXIgcj10eXBlb2YgZTtyZXR1cm4hISgibnVtYmVyIj09cj9IcyhuKSYmd28oZSxuLmxlbmd0aCk6InN0cmluZyI9PXImJmUgaW4gbikmJnFzKG5bZV0sdCl9ZnVuY3Rpb24gRG8odCxlKXtpZihYcyh0KSlyZXR1cm4hMTt2YXIgbj10eXBlb2YgdDtyZXR1cm4hKCJudW1iZXIiIT1uJiYic3ltYm9sIiE9biYmImJvb2xlYW4iIT1uJiZudWxsIT10JiYhbGEodCkpfHwobnQudGVzdCh0KXx8IWV0LnRlc3QodCl8fG51bGwhPWUmJnQgaW4gSXQoZSkpfWZ1bmN0aW9uIEVvKHQpe3ZhciBlPXVvKHQpLG49cW5bZV07aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG58fCEoZSBpbiBYbi5wcm90b3R5cGUpKXJldHVybiExO2lmKHQ9PT1uKXJldHVybiEwO3ZhciByPWFvKG4pO3JldHVybiEhciYmdD09PXJbMF19KFNuJiZtbyhuZXcgU24obmV3IEFycmF5QnVmZmVyKDEpKSkhPVB8fEFuJiZtbyhuZXcgQW4pIT1DfHxObiYmbW8oTm4ucmVzb2x2ZSgpKSE9Tnx8SW4mJm1vKG5ldyBJbikhPU18fE1uJiZtbyhuZXcgTW4pIT1PKSYmKG1vPWZ1bmN0aW9uKHQpe3ZhciBlPUFyKHQpLHI9ZT09QT90LmNvbnN0cnVjdG9yOm4saT1yP2pvKHIpOiIiO2lmKGkpc3dpdGNoKGkpe2Nhc2UgTG46cmV0dXJuIFA7Y2FzZSBQbjpyZXR1cm4gQztjYXNlIFJuOnJldHVybiBOO2Nhc2UgQm46cmV0dXJuIE07Y2FzZSBrbjpyZXR1cm4gT31yZXR1cm4gZX0pO3ZhciBDbz1SdD8kczp2dTtmdW5jdGlvbiBTbyh0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8UHQpfWZ1bmN0aW9uIEFvKHQpe3JldHVybiB0PT10JiYhbmEodCl9ZnVuY3Rpb24gTm8odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIG51bGwhPXImJihyW3RdPT09ZSYmKGUhPT1ufHx0IGluIEl0KHIpKSl9fWZ1bmN0aW9uIElvKHQsZSxyKXtyZXR1cm4gZT14bihlPT09bj90Lmxlbmd0aC0xOmUsMCksZnVuY3Rpb24oKXtmb3IodmFyIG49YXJndW1lbnRzLGk9LTEsbz14bihuLmxlbmd0aC1lLDApLHM9RXQobyk7KytpPG87KXNbaV09bltlK2ldO2k9LTE7Zm9yKHZhciBhPUV0KGUrMSk7KytpPGU7KWFbaV09bltpXTtyZXR1cm4gYVtlXT1yKHMpLE5lKHQsdGhpcyxhKX19ZnVuY3Rpb24gTW8odCxlKXtyZXR1cm4gZS5sZW5ndGg8Mj90OkNyKHQsb2koZSwwLC0xKSl9ZnVuY3Rpb24gRm8odCxlKXtpZigoImNvbnN0cnVjdG9yIiE9PWV8fCJmdW5jdGlvbiIhPXR5cGVvZiB0W2VdKSYmIl9fcHJvdG9fXyIhPWUpcmV0dXJuIHRbZV19dmFyIFRvPVJvKG5pKSxPbz1nZXx8ZnVuY3Rpb24odCxlKXtyZXR1cm4geWUuc2V0VGltZW91dCh0LGUpfSxMbz1SbyhyaSk7ZnVuY3Rpb24gUG8odCxlLG4pe3ZhciByPWUrIiI7cmV0dXJuIExvKHQsZnVuY3Rpb24odCxlKXt2YXIgbj1lLmxlbmd0aDtpZighbilyZXR1cm4gdDt2YXIgcj1uLTE7cmV0dXJuIGVbcl09KG4+MT8iJiAiOiIiKStlW3JdLGU9ZS5qb2luKG4+Mj8iLCAiOiIgIiksdC5yZXBsYWNlKHV0LCJ7XG4vKiBbd3JhcHBlZCB3aXRoICIrZSsiXSAqL1xuIil9KHIsZnVuY3Rpb24odCxlKXtyZXR1cm4gTWUobSwoZnVuY3Rpb24obil7dmFyIHI9Il8uIituWzBdO2UmblsxXSYmIUxlKHQscikmJnQucHVzaChyKX0pKSx0LnNvcnQoKX0oZnVuY3Rpb24odCl7dmFyIGU9dC5tYXRjaChjdCk7cmV0dXJuIGU/ZVsxXS5zcGxpdChsdCk6W119KHIpLG4pKSl9ZnVuY3Rpb24gUm8odCl7dmFyIGU9MCxyPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9Ym4oKSxvPTE2LShpLXIpO2lmKHI9aSxvPjApe2lmKCsrZT49ODAwKXJldHVybiBhcmd1bWVudHNbMF19ZWxzZSBlPTA7cmV0dXJuIHQuYXBwbHkobixhcmd1bWVudHMpfX1mdW5jdGlvbiBCbyh0LGUpe3ZhciByPS0xLGk9dC5sZW5ndGgsbz1pLTE7Zm9yKGU9ZT09PW4/aTplOysrcjxlOyl7dmFyIHM9S3IocixvKSxhPXRbc107dFtzXT10W3JdLHRbcl09YX1yZXR1cm4gdC5sZW5ndGg9ZSx0fXZhciBrbz1mdW5jdGlvbih0KXt2YXIgZT1Scyh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09bi5zaXplJiZuLmNsZWFyKCksdH0pKSxuPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKHJ0LChmdW5jdGlvbih0LG4scixpKXtlLnB1c2gocj9pLnJlcGxhY2UocHQsIiQxIik6bnx8dCl9KSksZX0pKTtmdW5jdGlvbiB6byh0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fGxhKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1oPyItMCI6ZX1mdW5jdGlvbiBqbyh0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIEJ0LmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifWZ1bmN0aW9uIFVvKHQpe2lmKHQgaW5zdGFuY2VvZiBYbilyZXR1cm4gdC5jbG9uZSgpO3ZhciBlPW5ldyBZbih0Ll9fd3JhcHBlZF9fLHQuX19jaGFpbl9fKTtyZXR1cm4gZS5fX2FjdGlvbnNfXz1GaSh0Ll9fYWN0aW9uc19fKSxlLl9faW5kZXhfXz10Ll9faW5kZXhfXyxlLl9fdmFsdWVzX189dC5fX3ZhbHVlc19fLGV9dmFyIHFvPVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBacyh0KT9wcih0LF9yKGUsMSxacywhMCkpOltdfSkpLFZvPVFyKChmdW5jdGlvbih0LGUpe3ZhciByPVFvKGUpO3JldHVybiBacyhyKSYmKHI9biksWnModCk/cHIodCxfcihlLDEsWnMsITApLGxvKHIsMikpOltdfSkpLEdvPVFyKChmdW5jdGlvbih0LGUpe3ZhciByPVFvKGUpO3JldHVybiBacyhyKSYmKHI9biksWnModCk/cHIodCxfcihlLDEsWnMsITApLG4scik6W119KSk7ZnVuY3Rpb24gWW8odCxlLG4pe3ZhciByPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgaT1udWxsPT1uPzA6eWEobik7cmV0dXJuIGk8MCYmKGk9eG4ocitpLDApKSxWZSh0LGxvKGUsMyksaSl9ZnVuY3Rpb24gWG8odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaSlyZXR1cm4tMTt2YXIgbz1pLTE7cmV0dXJuIHIhPT1uJiYobz15YShyKSxvPXI8MD94bihpK28sMCk6d24obyxpLTEpKSxWZSh0LGxvKGUsMyksbywhMCl9ZnVuY3Rpb24gV28odCl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/X3IodCwxKTpbXX1mdW5jdGlvbiBIbyh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/dFswXTpufXZhciBabz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UmUodCxfaSk7cmV0dXJuIGUubGVuZ3RoJiZlWzBdPT09dFswXT9GcihlKTpbXX0pKSxLbz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCkscj1SZSh0LF9pKTtyZXR1cm4gZT09PVFvKHIpP2U9bjpyLnBvcCgpLHIubGVuZ3RoJiZyWzBdPT09dFswXT9GcihyLGxvKGUsMikpOltdfSkpLEpvPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KSxyPVJlKHQsX2kpO3JldHVybihlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bikmJnIucG9wKCksci5sZW5ndGgmJnJbMF09PT10WzBdP0ZyKHIsbixlKTpbXX0pKTtmdW5jdGlvbiBRbyh0KXt2YXIgZT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGU/dFtlLTFdOm59dmFyICRvPVFyKHRzKTtmdW5jdGlvbiB0cyh0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aCYmZSYmZS5sZW5ndGg/SHIodCxlKTp0fXZhciBlcz1pbygoZnVuY3Rpb24odCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGgscj11cih0LGUpO3JldHVybiBacih0LFJlKGUsKGZ1bmN0aW9uKHQpe3JldHVybiB3byh0LG4pPyt0OnR9KSkuc29ydChOaSkpLHJ9KSk7ZnVuY3Rpb24gbnModCl7cmV0dXJuIG51bGw9PXQ/dDpDbi5jYWxsKHQpfXZhciBycz1RcigoZnVuY3Rpb24odCl7cmV0dXJuIGZpKF9yKHQsMSxacywhMCkpfSkpLGlzPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KTtyZXR1cm4gWnMoZSkmJihlPW4pLGZpKF9yKHQsMSxacywhMCksbG8oZSwyKSl9KSksb3M9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpO3JldHVybiBlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bixmaShfcih0LDEsWnMsITApLG4sZSl9KSk7ZnVuY3Rpb24gc3ModCl7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm5bXTt2YXIgZT0wO3JldHVybiB0PU9lKHQsKGZ1bmN0aW9uKHQpe2lmKFpzKHQpKXJldHVybiBlPXhuKHQubGVuZ3RoLGUpLCEwfSkpLFFlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBSZSh0LEhlKGUpKX0pKX1mdW5jdGlvbiBhcyh0LGUpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuW107dmFyIHI9c3ModCk7cmV0dXJuIG51bGw9PWU/cjpSZShyLChmdW5jdGlvbih0KXtyZXR1cm4gTmUoZSxuLHQpfSkpfXZhciB1cz1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gWnModCk/cHIodCxlKTpbXX0pKSxjcz1RcigoZnVuY3Rpb24odCl7cmV0dXJuIG1pKE9lKHQsWnMpKX0pKSxscz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCk7cmV0dXJuIFpzKGUpJiYoZT1uKSxtaShPZSh0LFpzKSxsbyhlLDIpKX0pKSxocz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCk7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuLG1pKE9lKHQsWnMpLG4sZSl9KSksZnM9UXIoc3MpO3ZhciBwcz1RcigoZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgscj1lPjE/dFtlLTFdOm47cmV0dXJuIHI9ImZ1bmN0aW9uIj09dHlwZW9mIHI/KHQucG9wKCkscik6bixhcyh0LHIpfSkpO2Z1bmN0aW9uIGRzKHQpe3ZhciBlPXFuKHQpO3JldHVybiBlLl9fY2hhaW5fXz0hMCxlfWZ1bmN0aW9uIGdzKHQsZSl7cmV0dXJuIGUodCl9dmFyIHlzPWlvKChmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aCxyPWU/dFswXTowLGk9dGhpcy5fX3dyYXBwZWRfXyxvPWZ1bmN0aW9uKGUpe3JldHVybiB1cihlLHQpfTtyZXR1cm4hKGU+MXx8dGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpJiZpIGluc3RhbmNlb2YgWG4mJndvKHIpPygoaT1pLnNsaWNlKHIsK3IrKGU/MTowKSkpLl9fYWN0aW9uc19fLnB1c2goe2Z1bmM6Z3MsYXJnczpbb10sdGhpc0FyZzpufSksbmV3IFluKGksdGhpcy5fX2NoYWluX18pLnRocnUoKGZ1bmN0aW9uKHQpe3JldHVybiBlJiYhdC5sZW5ndGgmJnQucHVzaChuKSx0fSkpKTp0aGlzLnRocnUobyl9KSk7dmFyIG1zPU9pKChmdW5jdGlvbih0LGUsbil7a3QuY2FsbCh0LG4pPysrdFtuXTphcih0LG4sMSl9KSk7dmFyIHZzPWppKFlvKSxfcz1qaShYbyk7ZnVuY3Rpb24geHModCxlKXtyZXR1cm4oWHModCk/TWU6ZHIpKHQsbG8oZSwzKSl9ZnVuY3Rpb24gd3ModCxlKXtyZXR1cm4oWHModCk/RmU6Z3IpKHQsbG8oZSwzKSl9dmFyIGJzPU9pKChmdW5jdGlvbih0LGUsbil7a3QuY2FsbCh0LG4pP3Rbbl0ucHVzaChlKTphcih0LG4sW2VdKX0pKTt2YXIgRHM9UXIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0tMSxpPSJmdW5jdGlvbiI9PXR5cGVvZiBlLG89SHModCk/RXQodC5sZW5ndGgpOltdO3JldHVybiBkcih0LChmdW5jdGlvbih0KXtvWysrcl09aT9OZShlLHQsbik6VHIodCxlLG4pfSkpLG99KSksRXM9T2koKGZ1bmN0aW9uKHQsZSxuKXthcih0LG4sZSl9KSk7ZnVuY3Rpb24gQ3ModCxlKXtyZXR1cm4oWHModCk/UmU6VXIpKHQsbG8oZSwzKSl9dmFyIFNzPU9pKChmdW5jdGlvbih0LGUsbil7dFtuPzA6MV0ucHVzaChlKX0pLChmdW5jdGlvbigpe3JldHVybltbXSxbXV19KSk7dmFyIEFzPVFyKChmdW5jdGlvbih0LGUpe2lmKG51bGw9PXQpcmV0dXJuW107dmFyIG49ZS5sZW5ndGg7cmV0dXJuIG4+MSYmYm8odCxlWzBdLGVbMV0pP2U9W106bj4yJiZibyhlWzBdLGVbMV0sZVsyXSkmJihlPVtlWzBdXSksWHIodCxfcihlLDEpLFtdKX0pKSxOcz1kZXx8ZnVuY3Rpb24oKXtyZXR1cm4geWUuRGF0ZS5ub3coKX07ZnVuY3Rpb24gSXModCxlLHIpe3JldHVybiBlPXI/bjplLGU9dCYmbnVsbD09ZT90Lmxlbmd0aDplLCRpKHQsYyxuLG4sbixuLGUpfWZ1bmN0aW9uIE1zKHQsZSl7dmFyIGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR0KHIpO3JldHVybiB0PXlhKHQpLGZ1bmN0aW9uKCl7cmV0dXJuLS10PjAmJihpPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpKSx0PD0xJiYoZT1uKSxpfX12YXIgRnM9UXIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0xO2lmKG4ubGVuZ3RoKXt2YXIgaT1mbihuLGNvKEZzKSk7cnw9YX1yZXR1cm4gJGkodCxyLGUsbixpKX0pKSxUcz1RcigoZnVuY3Rpb24odCxlLG4pe3ZhciByPTM7aWYobi5sZW5ndGgpe3ZhciBpPWZuKG4sY28oVHMpKTtyfD1hfXJldHVybiAkaShlLHIsdCxuLGkpfSkpO2Z1bmN0aW9uIE9zKHQsZSxpKXt2YXIgbyxzLGEsdSxjLGwsaD0wLGY9ITEscD0hMSxkPSEwO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtmdW5jdGlvbiBnKGUpe3ZhciByPW8saT1zO3JldHVybiBvPXM9bixoPWUsdT10LmFwcGx5KGkscil9ZnVuY3Rpb24geSh0KXt2YXIgcj10LWw7cmV0dXJuIGw9PT1ufHxyPj1lfHxyPDB8fHAmJnQtaD49YX1mdW5jdGlvbiBtKCl7dmFyIHQ9TnMoKTtpZih5KHQpKXJldHVybiB2KHQpO2M9T28obSxmdW5jdGlvbih0KXt2YXIgbj1lLSh0LWwpO3JldHVybiBwP3duKG4sYS0odC1oKSk6bn0odCkpfWZ1bmN0aW9uIHYodCl7cmV0dXJuIGM9bixkJiZvP2codCk6KG89cz1uLHUpfWZ1bmN0aW9uIF8oKXt2YXIgdD1OcygpLHI9eSh0KTtpZihvPWFyZ3VtZW50cyxzPXRoaXMsbD10LHIpe2lmKGM9PT1uKXJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaD10LGM9T28obSxlKSxmP2codCk6dX0obCk7aWYocClyZXR1cm4gRWkoYyksYz1PbyhtLGUpLGcobCl9cmV0dXJuIGM9PT1uJiYoYz1PbyhtLGUpKSx1fXJldHVybiBlPXZhKGUpfHwwLG5hKGkpJiYoZj0hIWkubGVhZGluZyxhPShwPSJtYXhXYWl0ImluIGkpP3huKHZhKGkubWF4V2FpdCl8fDAsZSk6YSxkPSJ0cmFpbGluZyJpbiBpPyEhaS50cmFpbGluZzpkKSxfLmNhbmNlbD1mdW5jdGlvbigpe2MhPT1uJiZFaShjKSxoPTAsbz1sPXM9Yz1ufSxfLmZsdXNoPWZ1bmN0aW9uKCl7cmV0dXJuIGM9PT1uP3U6dihOcygpKX0sX312YXIgTHM9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZyKHQsMSxlKX0pKSxQcz1RcigoZnVuY3Rpb24odCxlLG4pe3JldHVybiBmcih0LHZhKGUpfHwwLG4pfSkpO2Z1bmN0aW9uIFJzKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUdChyKTt2YXIgbj1mdW5jdGlvbigpe3ZhciByPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLHIpOnJbMF0sbz1uLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgcz10LmFwcGx5KHRoaXMscik7cmV0dXJuIG4uY2FjaGU9by5zZXQoaSxzKXx8byxzfTtyZXR1cm4gbi5jYWNoZT1uZXcoUnMuQ2FjaGV8fFpuKSxufWZ1bmN0aW9uIEJzKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIXQuY2FsbCh0aGlzKTtjYXNlIDE6cmV0dXJuIXQuY2FsbCh0aGlzLGVbMF0pO2Nhc2UgMjpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSxlWzFdKTtjYXNlIDM6cmV0dXJuIXQuY2FsbCh0aGlzLGVbMF0sZVsxXSxlWzJdKX1yZXR1cm4hdC5hcHBseSh0aGlzLGUpfX1Scy5DYWNoZT1abjt2YXIga3M9YmkoKGZ1bmN0aW9uKHQsZSl7dmFyIG49KGU9MT09ZS5sZW5ndGgmJlhzKGVbMF0pP1JlKGVbMF0sdG4obG8oKSkpOlJlKF9yKGUsMSksdG4obG8oKSkpKS5sZW5ndGg7cmV0dXJuIFFyKChmdW5jdGlvbihyKXtmb3IodmFyIGk9LTEsbz13bihyLmxlbmd0aCxuKTsrK2k8bzspcltpXT1lW2ldLmNhbGwodGhpcyxyW2ldKTtyZXR1cm4gTmUodCx0aGlzLHIpfSkpfSkpLHpzPVFyKChmdW5jdGlvbih0LGUpe3ZhciByPWZuKGUsY28oenMpKTtyZXR1cm4gJGkodCxhLG4sZSxyKX0pKSxqcz1RcigoZnVuY3Rpb24odCxlKXt2YXIgcj1mbihlLGNvKGpzKSk7cmV0dXJuICRpKHQsdSxuLGUscil9KSksVXM9aW8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuICRpKHQsbCxuLG4sbixlKX0pKTtmdW5jdGlvbiBxcyh0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX12YXIgVnM9SGkoTnIpLEdzPUhpKChmdW5jdGlvbih0LGUpe3JldHVybiB0Pj1lfSkpLFlzPU9yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/T3I6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZrdC5jYWxsKHQsImNhbGxlZSIpJiYhSnQuY2FsbCh0LCJjYWxsZWUiKX0sWHM9RXQuaXNBcnJheSxXcz1iZT90bihiZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZBcih0KT09TH07ZnVuY3Rpb24gSHModCl7cmV0dXJuIG51bGwhPXQmJmVhKHQubGVuZ3RoKSYmISRzKHQpfWZ1bmN0aW9uIFpzKHQpe3JldHVybiByYSh0KSYmSHModCl9dmFyIEtzPXdlfHx2dSxKcz1EZT90bihEZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZBcih0KT09d307ZnVuY3Rpb24gUXModCl7aWYoIXJhKHQpKXJldHVybiExO3ZhciBlPUFyKHQpO3JldHVybiBlPT1ifHwiW29iamVjdCBET01FeGNlcHRpb25dIj09ZXx8InN0cmluZyI9PXR5cGVvZiB0Lm1lc3NhZ2UmJiJzdHJpbmciPT10eXBlb2YgdC5uYW1lJiYhc2EodCl9ZnVuY3Rpb24gJHModCl7aWYoIW5hKHQpKXJldHVybiExO3ZhciBlPUFyKHQpO3JldHVybiBlPT1EfHxlPT1FfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9ZnVuY3Rpb24gdGEodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0PT15YSh0KX1mdW5jdGlvbiBlYSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnQ+LTEmJnQlMT09MCYmdDw9Zn1mdW5jdGlvbiBuYSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX1mdW5jdGlvbiByYSh0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fXZhciBpYT1FZT90bihFZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZtbyh0KT09Q307ZnVuY3Rpb24gb2EodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fHxyYSh0KSYmQXIodCk9PVN9ZnVuY3Rpb24gc2EodCl7aWYoIXJhKHQpfHxBcih0KSE9QSlyZXR1cm4hMTt2YXIgZT1adCh0KTtpZihudWxsPT09ZSlyZXR1cm4hMDt2YXIgbj1rdC5jYWxsKGUsImNvbnN0cnVjdG9yIikmJmUuY29uc3RydWN0b3I7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4mJm4gaW5zdGFuY2VvZiBuJiZCdC5jYWxsKG4pPT1xdH12YXIgYWE9Q2U/dG4oQ2UpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmQXIodCk9PUl9O3ZhciB1YT1TZT90bihTZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZtbyh0KT09TX07ZnVuY3Rpb24gY2EodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHwhWHModCkmJnJhKHQpJiZBcih0KT09Rn1mdW5jdGlvbiBsYSh0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fHJhKHQpJiZBcih0KT09VH12YXIgaGE9QWU/dG4oQWUpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmZWEodC5sZW5ndGgpJiYhIWNlW0FyKHQpXX07dmFyIGZhPUhpKGpyKSxwYT1IaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdDw9ZX0pKTtmdW5jdGlvbiBkYSh0KXtpZighdClyZXR1cm5bXTtpZihIcyh0KSlyZXR1cm4gY2EodCk/Z24odCk6RmkodCk7aWYodGUmJnRbdGVdKXJldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGUsbj1bXTshKGU9dC5uZXh0KCkpLmRvbmU7KW4ucHVzaChlLnZhbHVlKTtyZXR1cm4gbn0odFt0ZV0oKSk7dmFyIGU9bW8odCk7cmV0dXJuKGU9PUM/bG46ZT09TT9wbjpxYSkodCl9ZnVuY3Rpb24gZ2EodCl7cmV0dXJuIHQ/KHQ9dmEodCkpPT09aHx8dD09PS1oPzE3OTc2OTMxMzQ4NjIzMTU3ZTI5MioodDwwPy0xOjEpOnQ9PXQ/dDowOjA9PT10P3Q6MH1mdW5jdGlvbiB5YSh0KXt2YXIgZT1nYSh0KSxuPWUlMTtyZXR1cm4gZT09ZT9uP2UtbjplOjB9ZnVuY3Rpb24gbWEodCl7cmV0dXJuIHQ/Y3IoeWEodCksMCxkKTowfWZ1bmN0aW9uIHZhKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihsYSh0KSlyZXR1cm4gcDtpZihuYSh0KSl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQudmFsdWVPZj90LnZhbHVlT2YoKTp0O3Q9bmEoZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PSRlKHQpO3ZhciBuPW10LnRlc3QodCk7cmV0dXJuIG58fF90LnRlc3QodCk/cGUodC5zbGljZSgyKSxuPzI6OCk6eXQudGVzdCh0KT9wOit0fWZ1bmN0aW9uIF9hKHQpe3JldHVybiBUaSh0LExhKHQpKX1mdW5jdGlvbiB4YSh0KXtyZXR1cm4gbnVsbD09dD8iIjpoaSh0KX12YXIgd2E9TGkoKGZ1bmN0aW9uKHQsZSl7aWYoU28oZSl8fEhzKGUpKVRpKGUsT2EoZSksdCk7ZWxzZSBmb3IodmFyIG4gaW4gZSlrdC5jYWxsKGUsbikmJnJyKHQsbixlW25dKX0pKSxiYT1MaSgoZnVuY3Rpb24odCxlKXtUaShlLExhKGUpLHQpfSkpLERhPUxpKChmdW5jdGlvbih0LGUsbixyKXtUaShlLExhKGUpLHQscil9KSksRWE9TGkoKGZ1bmN0aW9uKHQsZSxuLHIpe1RpKGUsT2EoZSksdCxyKX0pKSxDYT1pbyh1cik7dmFyIFNhPVFyKChmdW5jdGlvbih0LGUpe3Q9SXQodCk7dmFyIHI9LTEsaT1lLmxlbmd0aCxvPWk+Mj9lWzJdOm47Zm9yKG8mJmJvKGVbMF0sZVsxXSxvKSYmKGk9MSk7KytyPGk7KWZvcih2YXIgcz1lW3JdLGE9TGEocyksdT0tMSxjPWEubGVuZ3RoOysrdTxjOyl7dmFyIGw9YVt1XSxoPXRbbF07KGg9PT1ufHxxcyhoLFB0W2xdKSYmIWt0LmNhbGwodCxsKSkmJih0W2xdPXNbbF0pfXJldHVybiB0fSkpLEFhPVFyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5wdXNoKG4sZW8pLE5lKFJhLG4sdCl9KSk7ZnVuY3Rpb24gTmEodCxlLHIpe3ZhciBpPW51bGw9PXQ/bjpDcih0LGUpO3JldHVybiBpPT09bj9yOml9ZnVuY3Rpb24gSWEodCxlKXtyZXR1cm4gbnVsbCE9dCYmdm8odCxlLE1yKX12YXIgTWE9VmkoKGZ1bmN0aW9uKHQsZSxuKXtudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZyYmKGU9VXQuY2FsbChlKSksdFtlXT1ufSksbnUob3UpKSxGYT1WaSgoZnVuY3Rpb24odCxlLG4pe251bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLnRvU3RyaW5nJiYoZT1VdC5jYWxsKGUpKSxrdC5jYWxsKHQsZSk/dFtlXS5wdXNoKG4pOnRbZV09W25dfSksbG8pLFRhPVFyKFRyKTtmdW5jdGlvbiBPYSh0KXtyZXR1cm4gSHModCk/UW4odCk6a3IodCl9ZnVuY3Rpb24gTGEodCl7cmV0dXJuIEhzKHQpP1FuKHQsITApOnpyKHQpfXZhciBQYT1MaSgoZnVuY3Rpb24odCxlLG4pe0dyKHQsZSxuKX0pKSxSYT1MaSgoZnVuY3Rpb24odCxlLG4scil7R3IodCxlLG4scil9KSksQmE9aW8oKGZ1bmN0aW9uKHQsZSl7dmFyIG49e307aWYobnVsbD09dClyZXR1cm4gbjt2YXIgcj0hMTtlPVJlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlPXdpKGUsdCkscnx8KHI9ZS5sZW5ndGg+MSksZX0pKSxUaSh0LHNvKHQpLG4pLHImJihuPWxyKG4sNyxubykpO2Zvcih2YXIgaT1lLmxlbmd0aDtpLS07KXBpKG4sZVtpXSk7cmV0dXJuIG59KSk7dmFyIGthPWlvKChmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3t9OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdyKHQsZSwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gSWEodCxuKX0pKX0odCxlKX0pKTtmdW5jdGlvbiB6YSh0LGUpe2lmKG51bGw9PXQpcmV0dXJue307dmFyIG49UmUoc28odCksKGZ1bmN0aW9uKHQpe3JldHVyblt0XX0pKTtyZXR1cm4gZT1sbyhlKSxXcih0LG4sKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUodCxuWzBdKX0pKX12YXIgamE9UWkoT2EpLFVhPVFpKExhKTtmdW5jdGlvbiBxYSh0KXtyZXR1cm4gbnVsbD09dD9bXTplbih0LE9hKHQpKX12YXIgVmE9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZT1lLnRvTG93ZXJDYXNlKCksdCsobj9HYShlKTplKX0pKTtmdW5jdGlvbiBHYSh0KXtyZXR1cm4gUWEoeGEodCkudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gWWEodCl7cmV0dXJuKHQ9eGEodCkpJiZ0LnJlcGxhY2Uod3Qsc24pLnJlcGxhY2UobmUsIiIpfXZhciBYYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyItIjoiIikrZS50b0xvd2VyQ2FzZSgpfSkpLFdhPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/IiAiOiIiKStlLnRvTG93ZXJDYXNlKCl9KSksSGE9QmkoInRvTG93ZXJDYXNlIik7dmFyIFphPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/Il8iOiIiKStlLnRvTG93ZXJDYXNlKCl9KSk7dmFyIEthPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/IiAiOiIiKStRYShlKX0pKTt2YXIgSmE9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iICI6IiIpK2UudG9VcHBlckNhc2UoKX0pKSxRYT1CaSgidG9VcHBlckNhc2UiKTtmdW5jdGlvbiAkYSh0LGUscil7cmV0dXJuIHQ9eGEodCksKGU9cj9uOmUpPT09bj9mdW5jdGlvbih0KXtyZXR1cm4gc2UudGVzdCh0KX0odCk/ZnVuY3Rpb24odCl7cmV0dXJuIHQubWF0Y2goaWUpfHxbXX0odCk6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWF0Y2goaHQpfHxbXX0odCk6dC5tYXRjaChlKXx8W119dmFyIHR1PVFyKChmdW5jdGlvbih0LGUpe3RyeXtyZXR1cm4gTmUodCxuLGUpfWNhdGNoKHQpe3JldHVybiBRcyh0KT90Om5ldyBTdCh0KX19KSksZXU9aW8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1lKGUsKGZ1bmN0aW9uKGUpe2U9em8oZSksYXIodCxlLEZzKHRbZV0sdCkpfSkpLHR9KSk7ZnVuY3Rpb24gbnUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBydT1VaSgpLGl1PVVpKCEwKTtmdW5jdGlvbiBvdSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBzdSh0KXtyZXR1cm4gQnIoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpscih0LDEpKX12YXIgYXU9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBUcihuLHQsZSl9fSkpLHV1PVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gVHIodCxuLGUpfX0pKTtmdW5jdGlvbiBjdSh0LGUsbil7dmFyIHI9T2EoZSksaT1FcihlLHIpO251bGw9PW4mJighbmEoZSl8fCFpLmxlbmd0aCYmci5sZW5ndGgpJiYobj1lLGU9dCx0PXRoaXMsaT1FcihlLE9hKGUpKSk7dmFyIG89IShuYShuKSYmImNoYWluImluIG4mJiFuLmNoYWluKSxzPSRzKHQpO3JldHVybiBNZShpLChmdW5jdGlvbihuKXt2YXIgcj1lW25dO3Rbbl09cixzJiYodC5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fY2hhaW5fXztpZihvfHxlKXt2YXIgbj10KHRoaXMuX193cmFwcGVkX18pO3JldHVybihuLl9fYWN0aW9uc19fPUZpKHRoaXMuX19hY3Rpb25zX18pKS5wdXNoKHtmdW5jOnIsYXJnczphcmd1bWVudHMsdGhpc0FyZzp0fSksbi5fX2NoYWluX189ZSxufXJldHVybiByLmFwcGx5KHQsQmUoW3RoaXMudmFsdWUoKV0sYXJndW1lbnRzKSl9KX0pKSx0fWZ1bmN0aW9uIGx1KCl7fXZhciBodT1ZaShSZSksZnU9WWkoVGUpLHB1PVlpKGplKTtmdW5jdGlvbiBkdSh0KXtyZXR1cm4gRG8odCk/SGUoem8odCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gQ3IoZSx0KX19KHQpfXZhciBndT1XaSgpLHl1PVdpKCEwKTtmdW5jdGlvbiBtdSgpe3JldHVybltdfWZ1bmN0aW9uIHZ1KCl7cmV0dXJuITF9dmFyIF91PUdpKChmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9KSwwKSx4dT1LaSgiY2VpbCIpLHd1PUdpKChmdW5jdGlvbih0LGUpe3JldHVybiB0L2V9KSwxKSxidT1LaSgiZmxvb3IiKTt2YXIgRHU9R2koKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQqZX0pLDEpLEV1PUtpKCJyb3VuZCIpLEN1PUdpKChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSwwKTtyZXR1cm4gcW4uYWZ0ZXI9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHQocik7cmV0dXJuIHQ9eWEodCksZnVuY3Rpb24oKXtpZigtLXQ8MSlyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSxxbi5hcnk9SXMscW4uYXNzaWduPXdhLHFuLmFzc2lnbkluPWJhLHFuLmFzc2lnbkluV2l0aD1EYSxxbi5hc3NpZ25XaXRoPUVhLHFuLmF0PUNhLHFuLmJlZm9yZT1Ncyxxbi5iaW5kPUZzLHFuLmJpbmRBbGw9ZXUscW4uYmluZEtleT1Ucyxxbi5jYXN0QXJyYXk9ZnVuY3Rpb24oKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bXTt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIFhzKHQpP3Q6W3RdfSxxbi5jaGFpbj1kcyxxbi5jaHVuaz1mdW5jdGlvbih0LGUscil7ZT0ocj9ibyh0LGUscik6ZT09PW4pPzE6eG4oeWEoZSksMCk7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFpfHxlPDEpcmV0dXJuW107Zm9yKHZhciBvPTAscz0wLGE9RXQobWUoaS9lKSk7bzxpOylhW3MrK109b2kodCxvLG8rPWUpO3JldHVybiBhfSxxbi5jb21wYWN0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPTAsaT1bXTsrK2U8bjspe3ZhciBvPXRbZV07byYmKGlbcisrXT1vKX1yZXR1cm4gaX0scW4uY29uY2F0PWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDtpZighdClyZXR1cm5bXTtmb3IodmFyIGU9RXQodC0xKSxuPWFyZ3VtZW50c1swXSxyPXQ7ci0tOyllW3ItMV09YXJndW1lbnRzW3JdO3JldHVybiBCZShYcyhuKT9GaShuKTpbbl0sX3IoZSwxKSl9LHFuLmNvbmQ9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbD09dD8wOnQubGVuZ3RoLG49bG8oKTtyZXR1cm4gdD1lP1JlKHQsKGZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0WzFdKXRocm93IG5ldyBUdChyKTtyZXR1cm5bbih0WzBdKSx0WzFdXX0pKTpbXSxRcigoZnVuY3Rpb24obil7Zm9yKHZhciByPS0xOysrcjxlOyl7dmFyIGk9dFtyXTtpZihOZShpWzBdLHRoaXMsbikpcmV0dXJuIE5lKGlbMV0sdGhpcyxuKX19KSl9LHFuLmNvbmZvcm1zPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1PYSh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGhyKG4sdCxlKX19KGxyKHQsMSkpfSxxbi5jb25zdGFudD1udSxxbi5jb3VudEJ5PW1zLHFuLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPVZuKHQpO3JldHVybiBudWxsPT1lP246c3IobixlKX0scW4uY3Vycnk9ZnVuY3Rpb24gdChlLHIsaSl7dmFyIG89JGkoZSw4LG4sbixuLG4sbixyPWk/bjpyKTtyZXR1cm4gby5wbGFjZWhvbGRlcj10LnBsYWNlaG9sZGVyLG99LHFuLmN1cnJ5UmlnaHQ9ZnVuY3Rpb24gdChlLHIsaSl7dmFyIG89JGkoZSxzLG4sbixuLG4sbixyPWk/bjpyKTtyZXR1cm4gby5wbGFjZWhvbGRlcj10LnBsYWNlaG9sZGVyLG99LHFuLmRlYm91bmNlPU9zLHFuLmRlZmF1bHRzPVNhLHFuLmRlZmF1bHRzRGVlcD1BYSxxbi5kZWZlcj1Mcyxxbi5kZWxheT1Qcyxxbi5kaWZmZXJlbmNlPXFvLHFuLmRpZmZlcmVuY2VCeT1Wbyxxbi5kaWZmZXJlbmNlV2l0aD1Hbyxxbi5kcm9wPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGk/b2kodCwoZT1yfHxlPT09bj8xOnlhKGUpKTwwPzA6ZSxpKTpbXX0scW4uZHJvcFJpZ2h0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGk/b2kodCwwLChlPWktKGU9cnx8ZT09PW4/MTp5YShlKSkpPDA/MDplKTpbXX0scW4uZHJvcFJpZ2h0V2hpbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/Z2kodCxsbyhlLDMpLCEwLCEwKTpbXX0scW4uZHJvcFdoaWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2dpKHQsbG8oZSwzKSwhMCk6W119LHFuLmZpbGw9ZnVuY3Rpb24odCxlLHIsaSl7dmFyIG89bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBvPyhyJiYibnVtYmVyIiE9dHlwZW9mIHImJmJvKHQsZSxyKSYmKHI9MCxpPW8pLGZ1bmN0aW9uKHQsZSxyLGkpe3ZhciBvPXQubGVuZ3RoO2Zvcigocj15YShyKSk8MCYmKHI9LXI+bz8wOm8rciksKGk9aT09PW58fGk+bz9vOnlhKGkpKTwwJiYoaSs9byksaT1yPmk/MDptYShpKTtyPGk7KXRbcisrXT1lO3JldHVybiB0fSh0LGUscixpKSk6W119LHFuLmZpbHRlcj1mdW5jdGlvbih0LGUpe3JldHVybihYcyh0KT9PZTp2cikodCxsbyhlLDMpKX0scW4uZmxhdE1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBfcihDcyh0LGUpLDEpfSxxbi5mbGF0TWFwRGVlcD1mdW5jdGlvbih0LGUpe3JldHVybiBfcihDcyh0LGUpLGgpfSxxbi5mbGF0TWFwRGVwdGg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByPXI9PT1uPzE6eWEociksX3IoQ3ModCxlKSxyKX0scW4uZmxhdHRlbj1Xbyxxbi5mbGF0dGVuRGVlcD1mdW5jdGlvbih0KXtyZXR1cm4obnVsbD09dD8wOnQubGVuZ3RoKT9fcih0LGgpOltdfSxxbi5mbGF0dGVuRGVwdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4obnVsbD09dD8wOnQubGVuZ3RoKT9fcih0LGU9ZT09PW4/MTp5YShlKSk6W119LHFuLmZsaXA9ZnVuY3Rpb24odCl7cmV0dXJuICRpKHQsNTEyKX0scW4uZmxvdz1ydSxxbi5mbG93UmlnaHQ9aXUscW4uZnJvbVBhaXJzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPXt9OysrZTxuOyl7dmFyIGk9dFtlXTtyW2lbMF1dPWlbMV19cmV0dXJuIHJ9LHFuLmZ1bmN0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXTpFcih0LE9hKHQpKX0scW4uZnVuY3Rpb25zSW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106RXIodCxMYSh0KSl9LHFuLmdyb3VwQnk9YnMscW4uaW5pdGlhbD1mdW5jdGlvbih0KXtyZXR1cm4obnVsbD09dD8wOnQubGVuZ3RoKT9vaSh0LDAsLTEpOltdfSxxbi5pbnRlcnNlY3Rpb249Wm8scW4uaW50ZXJzZWN0aW9uQnk9S28scW4uaW50ZXJzZWN0aW9uV2l0aD1Kbyxxbi5pbnZlcnQ9TWEscW4uaW52ZXJ0Qnk9RmEscW4uaW52b2tlTWFwPURzLHFuLml0ZXJhdGVlPXN1LHFuLmtleUJ5PUVzLHFuLmtleXM9T2EscW4ua2V5c0luPUxhLHFuLm1hcD1Dcyxxbi5tYXBLZXlzPWZ1bmN0aW9uKHQsZSl7dmFyIG49e307cmV0dXJuIGU9bG8oZSwzKSxicih0LChmdW5jdGlvbih0LHIsaSl7YXIobixlKHQscixpKSx0KX0pKSxufSxxbi5tYXBWYWx1ZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtyZXR1cm4gZT1sbyhlLDMpLGJyKHQsKGZ1bmN0aW9uKHQscixpKXthcihuLHIsZSh0LHIsaSkpfSkpLG59LHFuLm1hdGNoZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHFyKGxyKHQsMSkpfSxxbi5tYXRjaGVzUHJvcGVydHk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gVnIodCxscihlLDEpKX0scW4ubWVtb2l6ZT1Scyxxbi5tZXJnZT1QYSxxbi5tZXJnZVdpdGg9UmEscW4ubWV0aG9kPWF1LHFuLm1ldGhvZE9mPXV1LHFuLm1peGluPWN1LHFuLm5lZ2F0ZT1Ccyxxbi5udGhBcmc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9eWEodCksUXIoKGZ1bmN0aW9uKGUpe3JldHVybiBZcihlLHQpfSkpfSxxbi5vbWl0PUJhLHFuLm9taXRCeT1mdW5jdGlvbih0LGUpe3JldHVybiB6YSh0LEJzKGxvKGUpKSl9LHFuLm9uY2U9ZnVuY3Rpb24odCl7cmV0dXJuIE1zKDIsdCl9LHFuLm9yZGVyQnk9ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIG51bGw9PXQ/W106KFhzKGUpfHwoZT1udWxsPT1lP1tdOltlXSksWHMocj1pP246cil8fChyPW51bGw9PXI/W106W3JdKSxYcih0LGUscikpfSxxbi5vdmVyPWh1LHFuLm92ZXJBcmdzPWtzLHFuLm92ZXJFdmVyeT1mdSxxbi5vdmVyU29tZT1wdSxxbi5wYXJ0aWFsPXpzLHFuLnBhcnRpYWxSaWdodD1qcyxxbi5wYXJ0aXRpb249U3MscW4ucGljaz1rYSxxbi5waWNrQnk9emEscW4ucHJvcGVydHk9ZHUscW4ucHJvcGVydHlPZj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PXQ/bjpDcih0LGUpfX0scW4ucHVsbD0kbyxxbi5wdWxsQWxsPXRzLHFuLnB1bGxBbGxCeT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQmJnQubGVuZ3RoJiZlJiZlLmxlbmd0aD9Icih0LGUsbG8obiwyKSk6dH0scW4ucHVsbEFsbFdpdGg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0JiZ0Lmxlbmd0aCYmZSYmZS5sZW5ndGg/SHIodCxlLG4scik6dH0scW4ucHVsbEF0PWVzLHFuLnJhbmdlPWd1LHFuLnJhbmdlUmlnaHQ9eXUscW4ucmVhcmc9VXMscW4ucmVqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuKFhzKHQpP09lOnZyKSh0LEJzKGxvKGUsMykpKX0scW4ucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49W107aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4gbjt2YXIgcj0tMSxpPVtdLG89dC5sZW5ndGg7Zm9yKGU9bG8oZSwzKTsrK3I8bzspe3ZhciBzPXRbcl07ZShzLHIsdCkmJihuLnB1c2gocyksaS5wdXNoKHIpKX1yZXR1cm4gWnIodCxpKSxufSxxbi5yZXN0PWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBRcih0LGU9ZT09PW4/ZTp5YShlKSl9LHFuLnJldmVyc2U9bnMscW4uc2FtcGxlU2l6ZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU9KHI/Ym8odCxlLHIpOmU9PT1uKT8xOnlhKGUpLChYcyh0KT90cjp0aSkodCxlKX0scW4uc2V0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09dD90OmVpKHQsZSxuKX0scW4uc2V0V2l0aD1mdW5jdGlvbih0LGUscixpKXtyZXR1cm4gaT0iZnVuY3Rpb24iPT10eXBlb2YgaT9pOm4sbnVsbD09dD90OmVpKHQsZSxyLGkpfSxxbi5zaHVmZmxlPWZ1bmN0aW9uKHQpe3JldHVybihYcyh0KT9lcjppaSkodCl9LHFuLnNsaWNlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGk/KHImJiJudW1iZXIiIT10eXBlb2YgciYmYm8odCxlLHIpPyhlPTAscj1pKTooZT1udWxsPT1lPzA6eWEoZSkscj1yPT09bj9pOnlhKHIpKSxvaSh0LGUscikpOltdfSxxbi5zb3J0Qnk9QXMscW4uc29ydGVkVW5pcT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/Y2kodCk6W119LHFuLnNvcnRlZFVuaXFCeT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9jaSh0LGxvKGUsMikpOltdfSxxbi5zcGxpdD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHImJiJudW1iZXIiIT10eXBlb2YgciYmYm8odCxlLHIpJiYoZT1yPW4pLChyPXI9PT1uP2Q6cj4+PjApPyh0PXhhKHQpKSYmKCJzdHJpbmciPT10eXBlb2YgZXx8bnVsbCE9ZSYmIWFhKGUpKSYmKCEoZT1oaShlKSkmJmNuKHQpKT9EaShnbih0KSwwLHIpOnQuc3BsaXQoZSxyKTpbXX0scW4uc3ByZWFkPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBlPW51bGw9PWU/MDp4bih5YShlKSwwKSxRcigoZnVuY3Rpb24obil7dmFyIHI9bltlXSxpPURpKG4sMCxlKTtyZXR1cm4gciYmQmUoaSxyKSxOZSh0LHRoaXMsaSl9KSl9LHFuLnRhaWw9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBlP29pKHQsMSxlKTpbXX0scW4udGFrZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQmJnQubGVuZ3RoP29pKHQsMCwoZT1yfHxlPT09bj8xOnlhKGUpKTwwPzA6ZSk6W119LHFuLnRha2VSaWdodD1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBpP29pKHQsKGU9aS0oZT1yfHxlPT09bj8xOnlhKGUpKSk8MD8wOmUsaSk6W119LHFuLnRha2VSaWdodFdoaWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2dpKHQsbG8oZSwzKSwhMSwhMCk6W119LHFuLnRha2VXaGlsZT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9naSh0LGxvKGUsMykpOltdfSxxbi50YXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSh0KSx0fSxxbi50aHJvdHRsZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9ITAsbz0hMDtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7cmV0dXJuIG5hKG4pJiYoaT0ibGVhZGluZyJpbiBuPyEhbi5sZWFkaW5nOmksbz0idHJhaWxpbmciaW4gbj8hIW4udHJhaWxpbmc6byksT3ModCxlLHtsZWFkaW5nOmksbWF4V2FpdDplLHRyYWlsaW5nOm99KX0scW4udGhydT1ncyxxbi50b0FycmF5PWRhLHFuLnRvUGFpcnM9amEscW4udG9QYWlyc0luPVVhLHFuLnRvUGF0aD1mdW5jdGlvbih0KXtyZXR1cm4gWHModCk/UmUodCx6byk6bGEodCk/W3RdOkZpKGtvKHhhKHQpKSl9LHFuLnRvUGxhaW5PYmplY3Q9X2EscW4udHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1Ycyh0KSxpPXJ8fEtzKHQpfHxoYSh0KTtpZihlPWxvKGUsNCksbnVsbD09bil7dmFyIG89dCYmdC5jb25zdHJ1Y3RvcjtuPWk/cj9uZXcgbzpbXTpuYSh0KSYmJHMobyk/Vm4oWnQodCkpOnt9fXJldHVybihpP01lOmJyKSh0LChmdW5jdGlvbih0LHIsaSl7cmV0dXJuIGUobix0LHIsaSl9KSksbn0scW4udW5hcnk9ZnVuY3Rpb24odCl7cmV0dXJuIElzKHQsMSl9LHFuLnVuaW9uPXJzLHFuLnVuaW9uQnk9aXMscW4udW5pb25XaXRoPW9zLHFuLnVuaXE9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP2ZpKHQpOltdfSxxbi51bmlxQnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/ZmkodCxsbyhlLDIpKTpbXX0scW4udW5pcVdpdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4sdCYmdC5sZW5ndGg/ZmkodCxuLGUpOltdfSxxbi51bnNldD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10fHxwaSh0LGUpfSxxbi51bnppcD1zcyxxbi51bnppcFdpdGg9YXMscW4udXBkYXRlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09dD90OmRpKHQsZSx4aShuKSl9LHFuLnVwZGF0ZVdpdGg9ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGk/aTpuLG51bGw9PXQ/dDpkaSh0LGUseGkociksaSl9LHFuLnZhbHVlcz1xYSxxbi52YWx1ZXNJbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXTplbih0LExhKHQpKX0scW4ud2l0aG91dD11cyxxbi53b3Jkcz0kYSxxbi53cmFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHpzKHhpKGUpLHQpfSxxbi54b3I9Y3MscW4ueG9yQnk9bHMscW4ueG9yV2l0aD1ocyxxbi56aXA9ZnMscW4uemlwT2JqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZpKHR8fFtdLGV8fFtdLHJyKX0scW4uemlwT2JqZWN0RGVlcD1mdW5jdGlvbih0LGUpe3JldHVybiB2aSh0fHxbXSxlfHxbXSxlaSl9LHFuLnppcFdpdGg9cHMscW4uZW50cmllcz1qYSxxbi5lbnRyaWVzSW49VWEscW4uZXh0ZW5kPWJhLHFuLmV4dGVuZFdpdGg9RGEsY3UocW4scW4pLHFuLmFkZD1fdSxxbi5hdHRlbXB0PXR1LHFuLmNhbWVsQ2FzZT1WYSxxbi5jYXBpdGFsaXplPUdhLHFuLmNlaWw9eHUscW4uY2xhbXA9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByPT09biYmKHI9ZSxlPW4pLHIhPT1uJiYocj0ocj12YShyKSk9PXI/cjowKSxlIT09biYmKGU9KGU9dmEoZSkpPT1lP2U6MCksY3IodmEodCksZSxyKX0scW4uY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGxyKHQsNCl9LHFuLmNsb25lRGVlcD1mdW5jdGlvbih0KXtyZXR1cm4gbHIodCw1KX0scW4uY2xvbmVEZWVwV2l0aD1mdW5jdGlvbih0LGUpe3JldHVybiBscih0LDUsZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4pfSxxbi5jbG9uZVdpdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHIodCw0LGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuKX0scW4uY29uZm9ybXNUbz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lfHxocih0LGUsT2EoZSkpfSxxbi5kZWJ1cnI9WWEscW4uZGVmYXVsdFRvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXR8fHQhPXQ/ZTp0fSxxbi5kaXZpZGU9d3UscW4uZW5kc1dpdGg9ZnVuY3Rpb24odCxlLHIpe3Q9eGEodCksZT1oaShlKTt2YXIgaT10Lmxlbmd0aCxvPXI9cj09PW4/aTpjcih5YShyKSwwLGkpO3JldHVybihyLT1lLmxlbmd0aCk+PTAmJnQuc2xpY2UocixvKT09ZX0scW4uZXE9cXMscW4uZXNjYXBlPWZ1bmN0aW9uKHQpe3JldHVybih0PXhhKHQpKSYmSi50ZXN0KHQpP3QucmVwbGFjZShaLGFuKTp0fSxxbi5lc2NhcGVSZWdFeHA9ZnVuY3Rpb24odCl7cmV0dXJuKHQ9eGEodCkpJiZvdC50ZXN0KHQpP3QucmVwbGFjZShpdCwiXFwkJiIpOnR9LHFuLmV2ZXJ5PWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1Ycyh0KT9UZTp5cjtyZXR1cm4gciYmYm8odCxlLHIpJiYoZT1uKSxpKHQsbG8oZSwzKSl9LHFuLmZpbmQ9dnMscW4uZmluZEluZGV4PVlvLHFuLmZpbmRLZXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcWUodCxsbyhlLDMpLGJyKX0scW4uZmluZExhc3Q9X3MscW4uZmluZExhc3RJbmRleD1Ybyxxbi5maW5kTGFzdEtleT1mdW5jdGlvbih0LGUpe3JldHVybiBxZSh0LGxvKGUsMyksRHIpfSxxbi5mbG9vcj1idSxxbi5mb3JFYWNoPXhzLHFuLmZvckVhY2hSaWdodD13cyxxbi5mb3JJbj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3Q6eHIodCxsbyhlLDMpLExhKX0scW4uZm9ySW5SaWdodD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3Q6d3IodCxsbyhlLDMpLExhKX0scW4uZm9yT3duPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJmJyKHQsbG8oZSwzKSl9LHFuLmZvck93blJpZ2h0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJkRyKHQsbG8oZSwzKSl9LHFuLmdldD1OYSxxbi5ndD1Wcyxxbi5ndGU9R3MscW4uaGFzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJnZvKHQsZSxJcil9LHFuLmhhc0luPUlhLHFuLmhlYWQ9SG8scW4uaWRlbnRpdHk9b3UscW4uaW5jbHVkZXM9ZnVuY3Rpb24odCxlLG4scil7dD1Icyh0KT90OnFhKHQpLG49biYmIXI/eWEobik6MDt2YXIgaT10Lmxlbmd0aDtyZXR1cm4gbjwwJiYobj14bihpK24sMCkpLGNhKHQpP248PWkmJnQuaW5kZXhPZihlLG4pPi0xOiEhaSYmR2UodCxlLG4pPi0xfSxxbi5pbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1udWxsPT10PzA6dC5sZW5ndGg7aWYoIXIpcmV0dXJuLTE7dmFyIGk9bnVsbD09bj8wOnlhKG4pO3JldHVybiBpPDAmJihpPXhuKHIraSwwKSksR2UodCxlLGkpfSxxbi5pblJhbmdlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZT1nYShlKSxyPT09bj8ocj1lLGU9MCk6cj1nYShyKSxmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ+PXduKGUsbikmJnQ8eG4oZSxuKX0odD12YSh0KSxlLHIpfSxxbi5pbnZva2U9VGEscW4uaXNBcmd1bWVudHM9WXMscW4uaXNBcnJheT1Ycyxxbi5pc0FycmF5QnVmZmVyPVdzLHFuLmlzQXJyYXlMaWtlPUhzLHFuLmlzQXJyYXlMaWtlT2JqZWN0PVpzLHFuLmlzQm9vbGVhbj1mdW5jdGlvbih0KXtyZXR1cm4hMD09PXR8fCExPT09dHx8cmEodCkmJkFyKHQpPT14fSxxbi5pc0J1ZmZlcj1Lcyxxbi5pc0RhdGU9SnMscW4uaXNFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmMT09PXQubm9kZVR5cGUmJiFzYSh0KX0scW4uaXNFbXB0eT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiEwO2lmKEhzKHQpJiYoWHModCl8fCJzdHJpbmciPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQuc3BsaWNlfHxLcyh0KXx8aGEodCl8fFlzKHQpKSlyZXR1cm4hdC5sZW5ndGg7dmFyIGU9bW8odCk7aWYoZT09Q3x8ZT09TSlyZXR1cm4hdC5zaXplO2lmKFNvKHQpKXJldHVybiFrcih0KS5sZW5ndGg7Zm9yKHZhciBuIGluIHQpaWYoa3QuY2FsbCh0LG4pKXJldHVybiExO3JldHVybiEwfSxxbi5pc0VxdWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIExyKHQsZSl9LHFuLmlzRXF1YWxXaXRoPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT0ocj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOm4pP3IodCxlKTpuO3JldHVybiBpPT09bj9Mcih0LGUsbixyKTohIWl9LHFuLmlzRXJyb3I9UXMscW4uaXNGaW5pdGU9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZVZSh0KX0scW4uaXNGdW5jdGlvbj0kcyxxbi5pc0ludGVnZXI9dGEscW4uaXNMZW5ndGg9ZWEscW4uaXNNYXA9aWEscW4uaXNNYXRjaD1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8UHIodCxlLGZvKGUpKX0scW4uaXNNYXRjaFdpdGg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByPSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6bixQcih0LGUsZm8oZSkscil9LHFuLmlzTmFOPWZ1bmN0aW9uKHQpe3JldHVybiBvYSh0KSYmdCE9K3R9LHFuLmlzTmF0aXZlPWZ1bmN0aW9uKHQpe2lmKENvKHQpKXRocm93IG5ldyBTdCgiVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuIik7cmV0dXJuIFJyKHQpfSxxbi5pc05pbD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dH0scW4uaXNOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dH0scW4uaXNOdW1iZXI9b2EscW4uaXNPYmplY3Q9bmEscW4uaXNPYmplY3RMaWtlPXJhLHFuLmlzUGxhaW5PYmplY3Q9c2EscW4uaXNSZWdFeHA9YWEscW4uaXNTYWZlSW50ZWdlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGEodCkmJnQ+PS1mJiZ0PD1mfSxxbi5pc1NldD11YSxxbi5pc1N0cmluZz1jYSxxbi5pc1N5bWJvbD1sYSxxbi5pc1R5cGVkQXJyYXk9aGEscW4uaXNVbmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1ufSxxbi5pc1dlYWtNYXA9ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZtbyh0KT09T30scW4uaXNXZWFrU2V0PWZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmIltvYmplY3QgV2Vha1NldF0iPT1Bcih0KX0scW4uam9pbj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10PyIiOlplLmNhbGwodCxlKX0scW4ua2ViYWJDYXNlPVhhLHFuLmxhc3Q9UW8scW4ubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaSlyZXR1cm4tMTt2YXIgbz1pO3JldHVybiByIT09biYmKG89KG89eWEocikpPDA/eG4oaStvLDApOnduKG8saS0xKSksZT09ZT9mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW4rMTtyLS07KWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybiByfSh0LGUsbyk6VmUodCxYZSxvLCEwKX0scW4ubG93ZXJDYXNlPVdhLHFuLmxvd2VyRmlyc3Q9SGEscW4ubHQ9ZmEscW4ubHRlPXBhLHFuLm1heD1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/bXIodCxvdSxOcik6bn0scW4ubWF4Qnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/bXIodCxsbyhlLDIpLE5yKTpufSxxbi5tZWFuPWZ1bmN0aW9uKHQpe3JldHVybiBXZSh0LG91KX0scW4ubWVhbkJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdlKHQsbG8oZSwyKSl9LHFuLm1pbj1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/bXIodCxvdSxqcik6bn0scW4ubWluQnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/bXIodCxsbyhlLDIpLGpyKTpufSxxbi5zdHViQXJyYXk9bXUscW4uc3R1YkZhbHNlPXZ1LHFuLnN0dWJPYmplY3Q9ZnVuY3Rpb24oKXtyZXR1cm57fX0scW4uc3R1YlN0cmluZz1mdW5jdGlvbigpe3JldHVybiIifSxxbi5zdHViVHJ1ZT1mdW5jdGlvbigpe3JldHVybiEwfSxxbi5tdWx0aXBseT1EdSxxbi5udGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/WXIodCx5YShlKSk6bn0scW4ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB5ZS5fPT09dGhpcyYmKHllLl89VnQpLHRoaXN9LHFuLm5vb3A9bHUscW4ubm93PU5zLHFuLnBhZD1mdW5jdGlvbih0LGUsbil7dD14YSh0KTt2YXIgcj0oZT15YShlKSk/ZG4odCk6MDtpZighZXx8cj49ZSlyZXR1cm4gdDt2YXIgaT0oZS1yKS8yO3JldHVybiBYaSh2ZShpKSxuKSt0K1hpKG1lKGkpLG4pfSxxbi5wYWRFbmQ9ZnVuY3Rpb24odCxlLG4pe3Q9eGEodCk7dmFyIHI9KGU9eWEoZSkpP2RuKHQpOjA7cmV0dXJuIGUmJnI8ZT90K1hpKGUtcixuKTp0fSxxbi5wYWRTdGFydD1mdW5jdGlvbih0LGUsbil7dD14YSh0KTt2YXIgcj0oZT15YShlKSk/ZG4odCk6MDtyZXR1cm4gZSYmcjxlP1hpKGUtcixuKSt0OnR9LHFuLnBhcnNlSW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnx8bnVsbD09ZT9lPTA6ZSYmKGU9K2UpLERuKHhhKHQpLnJlcGxhY2Uoc3QsIiIpLGV8fDApfSxxbi5yYW5kb209ZnVuY3Rpb24odCxlLHIpe2lmKHImJiJib29sZWFuIiE9dHlwZW9mIHImJmJvKHQsZSxyKSYmKGU9cj1uKSxyPT09biYmKCJib29sZWFuIj09dHlwZW9mIGU/KHI9ZSxlPW4pOiJib29sZWFuIj09dHlwZW9mIHQmJihyPXQsdD1uKSksdD09PW4mJmU9PT1uPyh0PTAsZT0xKToodD1nYSh0KSxlPT09bj8oZT10LHQ9MCk6ZT1nYShlKSksdD5lKXt2YXIgaT10O3Q9ZSxlPWl9aWYocnx8dCUxfHxlJTEpe3ZhciBvPUVuKCk7cmV0dXJuIHduKHQrbyooZS10K2ZlKCIxZS0iKygobysiIikubGVuZ3RoLTEpKSksZSl9cmV0dXJuIEtyKHQsZSl9LHFuLnJlZHVjZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9WHModCk/a2U6S2UsaT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIHIodCxsbyhlLDQpLG4saSxkcil9LHFuLnJlZHVjZVJpZ2h0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1Ycyh0KT96ZTpLZSxpPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gcih0LGxvKGUsNCksbixpLGdyKX0scW4ucmVwZWF0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZT0ocj9ibyh0LGUscik6ZT09PW4pPzE6eWEoZSksSnIoeGEodCksZSl9LHFuLnJlcGxhY2U9ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMsZT14YSh0WzBdKTtyZXR1cm4gdC5sZW5ndGg8Mz9lOmUucmVwbGFjZSh0WzFdLHRbMl0pfSxxbi5yZXN1bHQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPS0xLG89KGU9d2koZSx0KSkubGVuZ3RoO2ZvcihvfHwobz0xLHQ9bik7KytpPG87KXt2YXIgcz1udWxsPT10P246dFt6byhlW2ldKV07cz09PW4mJihpPW8scz1yKSx0PSRzKHMpP3MuY2FsbCh0KTpzfXJldHVybiB0fSxxbi5yb3VuZD1FdSxxbi5ydW5JbkNvbnRleHQ9dCxxbi5zYW1wbGU9ZnVuY3Rpb24odCl7cmV0dXJuKFhzKHQpPyRuOiRyKSh0KX0scW4uc2l6ZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKEhzKHQpKXJldHVybiBjYSh0KT9kbih0KTp0Lmxlbmd0aDt2YXIgZT1tbyh0KTtyZXR1cm4gZT09Q3x8ZT09TT90LnNpemU6a3IodCkubGVuZ3RofSxxbi5zbmFrZUNhc2U9WmEscW4uc29tZT1mdW5jdGlvbih0LGUscil7dmFyIGk9WHModCk/amU6c2k7cmV0dXJuIHImJmJvKHQsZSxyKSYmKGU9biksaSh0LGxvKGUsMykpfSxxbi5zb3J0ZWRJbmRleD1mdW5jdGlvbih0LGUpe3JldHVybiBhaSh0LGUpfSxxbi5zb3J0ZWRJbmRleEJ5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdWkodCxlLGxvKG4sMikpfSxxbi5zb3J0ZWRJbmRleE9mPWZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbD09dD8wOnQubGVuZ3RoO2lmKG4pe3ZhciByPWFpKHQsZSk7aWYocjxuJiZxcyh0W3JdLGUpKXJldHVybiByfXJldHVybi0xfSxxbi5zb3J0ZWRMYXN0SW5kZXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWkodCxlLCEwKX0scW4uc29ydGVkTGFzdEluZGV4Qnk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1aSh0LGUsbG8obiwyKSwhMCl9LHFuLnNvcnRlZExhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dD8wOnQubGVuZ3RoKXt2YXIgbj1haSh0LGUsITApLTE7aWYocXModFtuXSxlKSlyZXR1cm4gbn1yZXR1cm4tMX0scW4uc3RhcnRDYXNlPUthLHFuLnN0YXJ0c1dpdGg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PXhhKHQpLG49bnVsbD09bj8wOmNyKHlhKG4pLDAsdC5sZW5ndGgpLGU9aGkoZSksdC5zbGljZShuLG4rZS5sZW5ndGgpPT1lfSxxbi5zdWJ0cmFjdD1DdSxxbi5zdW09ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP0plKHQsb3UpOjB9LHFuLnN1bUJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP0plKHQsbG8oZSwyKSk6MH0scW4udGVtcGxhdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPXFuLnRlbXBsYXRlU2V0dGluZ3M7ciYmYm8odCxlLHIpJiYoZT1uKSx0PXhhKHQpLGU9RGEoe30sZSxpLHRvKTt2YXIgbyxzLGE9RGEoe30sZS5pbXBvcnRzLGkuaW1wb3J0cyx0byksdT1PYShhKSxjPWVuKGEsdSksbD0wLGg9ZS5pbnRlcnBvbGF0ZXx8YnQsZj0iX19wICs9ICciLHA9TXQoKGUuZXNjYXBlfHxidCkuc291cmNlKyJ8IitoLnNvdXJjZSsifCIrKGg9PT10dD9kdDpidCkuc291cmNlKyJ8IisoZS5ldmFsdWF0ZXx8YnQpLnNvdXJjZSsifCQiLCJnIiksZD0iLy8jIHNvdXJjZVVSTD0iKyhrdC5jYWxsKGUsInNvdXJjZVVSTCIpPyhlLnNvdXJjZVVSTCsiIikucmVwbGFjZSgvXHMvZywiICIpOiJsb2Rhc2gudGVtcGxhdGVTb3VyY2VzWyIrICsrdWUrIl0iKSsiXG4iO3QucmVwbGFjZShwLChmdW5jdGlvbihlLG4scixpLGEsdSl7cmV0dXJuIHJ8fChyPWkpLGYrPXQuc2xpY2UobCx1KS5yZXBsYWNlKER0LHVuKSxuJiYobz0hMCxmKz0iJyArXG5fX2UoIituKyIpICtcbiciKSxhJiYocz0hMCxmKz0iJztcbiIrYSsiO1xuX19wICs9ICciKSxyJiYoZis9IicgK1xuKChfX3QgPSAoIityKyIpKSA9PSBudWxsID8gJycgOiBfX3QpICtcbiciKSxsPXUrZS5sZW5ndGgsZX0pKSxmKz0iJztcbiI7dmFyIGc9a3QuY2FsbChlLCJ2YXJpYWJsZSIpJiZlLnZhcmlhYmxlO2lmKGcpe2lmKGZ0LnRlc3QoZykpdGhyb3cgbmV3IFN0KCJJbnZhbGlkIGB2YXJpYWJsZWAgb3B0aW9uIHBhc3NlZCBpbnRvIGBfLnRlbXBsYXRlYCIpfWVsc2UgZj0id2l0aCAob2JqKSB7XG4iK2YrIlxufVxuIjtmPShzP2YucmVwbGFjZShZLCIiKTpmKS5yZXBsYWNlKFgsIiQxIikucmVwbGFjZShXLCIkMTsiKSxmPSJmdW5jdGlvbigiKyhnfHwib2JqIikrIikge1xuIisoZz8iIjoib2JqIHx8IChvYmogPSB7fSk7XG4iKSsidmFyIF9fdCwgX19wID0gJyciKyhvPyIsIF9fZSA9IF8uZXNjYXBlIjoiIikrKHM/IiwgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XG5mdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cbiI6IjtcbiIpK2YrInJldHVybiBfX3Bcbn0iO3ZhciB5PXR1KChmdW5jdGlvbigpe3JldHVybiBBdCh1LGQrInJldHVybiAiK2YpLmFwcGx5KG4sYyl9KSk7aWYoeS5zb3VyY2U9ZixRcyh5KSl0aHJvdyB5O3JldHVybiB5fSxxbi50aW1lcz1mdW5jdGlvbih0LGUpe2lmKCh0PXlhKHQpKTwxfHx0PmYpcmV0dXJuW107dmFyIG49ZCxyPXduKHQsZCk7ZT1sbyhlKSx0LT1kO2Zvcih2YXIgaT1RZShyLGUpOysrbjx0OyllKG4pO3JldHVybiBpfSxxbi50b0Zpbml0ZT1nYSxxbi50b0ludGVnZXI9eWEscW4udG9MZW5ndGg9bWEscW4udG9Mb3dlcj1mdW5jdGlvbih0KXtyZXR1cm4geGEodCkudG9Mb3dlckNhc2UoKX0scW4udG9OdW1iZXI9dmEscW4udG9TYWZlSW50ZWdlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD9jcih5YSh0KSwtZixmKTowPT09dD90OjB9LHFuLnRvU3RyaW5nPXhhLHFuLnRvVXBwZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHhhKHQpLnRvVXBwZXJDYXNlKCl9LHFuLnRyaW09ZnVuY3Rpb24odCxlLHIpe2lmKCh0PXhhKHQpKSYmKHJ8fGU9PT1uKSlyZXR1cm4gJGUodCk7aWYoIXR8fCEoZT1oaShlKSkpcmV0dXJuIHQ7dmFyIGk9Z24odCksbz1nbihlKTtyZXR1cm4gRGkoaSxybihpLG8pLG9uKGksbykrMSkuam9pbigiIil9LHFuLnRyaW1FbmQ9ZnVuY3Rpb24odCxlLHIpe2lmKCh0PXhhKHQpKSYmKHJ8fGU9PT1uKSlyZXR1cm4gdC5zbGljZSgwLHluKHQpKzEpO2lmKCF0fHwhKGU9aGkoZSkpKXJldHVybiB0O3ZhciBpPWduKHQpO3JldHVybiBEaShpLDAsb24oaSxnbihlKSkrMSkuam9pbigiIil9LHFuLnRyaW1TdGFydD1mdW5jdGlvbih0LGUscil7aWYoKHQ9eGEodCkpJiYocnx8ZT09PW4pKXJldHVybiB0LnJlcGxhY2Uoc3QsIiIpO2lmKCF0fHwhKGU9aGkoZSkpKXJldHVybiB0O3ZhciBpPWduKHQpO3JldHVybiBEaShpLHJuKGksZ24oZSkpKS5qb2luKCIiKX0scW4udHJ1bmNhdGU9ZnVuY3Rpb24odCxlKXt2YXIgcj0zMCxpPSIuLi4iO2lmKG5hKGUpKXt2YXIgbz0ic2VwYXJhdG9yImluIGU/ZS5zZXBhcmF0b3I6bztyPSJsZW5ndGgiaW4gZT95YShlLmxlbmd0aCk6cixpPSJvbWlzc2lvbiJpbiBlP2hpKGUub21pc3Npb24pOml9dmFyIHM9KHQ9eGEodCkpLmxlbmd0aDtpZihjbih0KSl7dmFyIGE9Z24odCk7cz1hLmxlbmd0aH1pZihyPj1zKXJldHVybiB0O3ZhciB1PXItZG4oaSk7aWYodTwxKXJldHVybiBpO3ZhciBjPWE/RGkoYSwwLHUpLmpvaW4oIiIpOnQuc2xpY2UoMCx1KTtpZihvPT09bilyZXR1cm4gYytpO2lmKGEmJih1Kz1jLmxlbmd0aC11KSxhYShvKSl7aWYodC5zbGljZSh1KS5zZWFyY2gobykpe3ZhciBsLGg9Yztmb3Ioby5nbG9iYWx8fChvPU10KG8uc291cmNlLHhhKGd0LmV4ZWMobykpKyJnIikpLG8ubGFzdEluZGV4PTA7bD1vLmV4ZWMoaCk7KXZhciBmPWwuaW5kZXg7Yz1jLnNsaWNlKDAsZj09PW4/dTpmKX19ZWxzZSBpZih0LmluZGV4T2YoaGkobyksdSkhPXUpe3ZhciBwPWMubGFzdEluZGV4T2Yobyk7cD4tMSYmKGM9Yy5zbGljZSgwLHApKX1yZXR1cm4gYytpfSxxbi51bmVzY2FwZT1mdW5jdGlvbih0KXtyZXR1cm4odD14YSh0KSkmJksudGVzdCh0KT90LnJlcGxhY2UoSCxtbik6dH0scW4udW5pcXVlSWQ9ZnVuY3Rpb24odCl7dmFyIGU9Kyt6dDtyZXR1cm4geGEodCkrZX0scW4udXBwZXJDYXNlPUphLHFuLnVwcGVyRmlyc3Q9UWEscW4uZWFjaD14cyxxbi5lYWNoUmlnaHQ9d3MscW4uZmlyc3Q9SG8sY3UocW4sZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gYnIocW4sKGZ1bmN0aW9uKGUsbil7a3QuY2FsbChxbi5wcm90b3R5cGUsbil8fCh0W25dPWUpfSkpLHR9KCkse2NoYWluOiExfSkscW4uVkVSU0lPTj0iNC4xNy4yMSIsTWUoWyJiaW5kIiwiYmluZEtleSIsImN1cnJ5IiwiY3VycnlSaWdodCIsInBhcnRpYWwiLCJwYXJ0aWFsUmlnaHQiXSwoZnVuY3Rpb24odCl7cW5bdF0ucGxhY2Vob2xkZXI9cW59KSksTWUoWyJkcm9wIiwidGFrZSJdLChmdW5jdGlvbih0LGUpe1huLnByb3RvdHlwZVt0XT1mdW5jdGlvbihyKXtyPXI9PT1uPzE6eG4oeWEociksMCk7dmFyIGk9dGhpcy5fX2ZpbHRlcmVkX18mJiFlP25ldyBYbih0aGlzKTp0aGlzLmNsb25lKCk7cmV0dXJuIGkuX19maWx0ZXJlZF9fP2kuX190YWtlQ291bnRfXz13bihyLGkuX190YWtlQ291bnRfXyk6aS5fX3ZpZXdzX18ucHVzaCh7c2l6ZTp3bihyLGQpLHR5cGU6dCsoaS5fX2Rpcl9fPDA/IlJpZ2h0IjoiIil9KSxpfSxYbi5wcm90b3R5cGVbdCsiUmlnaHQiXT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKClbdF0oZSkucmV2ZXJzZSgpfX0pKSxNZShbImZpbHRlciIsIm1hcCIsInRha2VXaGlsZSJdLChmdW5jdGlvbih0LGUpe3ZhciBuPWUrMSxyPTE9PW58fDM9PW47WG4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY2xvbmUoKTtyZXR1cm4gZS5fX2l0ZXJhdGVlc19fLnB1c2goe2l0ZXJhdGVlOmxvKHQsMyksdHlwZTpufSksZS5fX2ZpbHRlcmVkX189ZS5fX2ZpbHRlcmVkX198fHIsZX19KSksTWUoWyJoZWFkIiwibGFzdCJdLChmdW5jdGlvbih0LGUpe3ZhciBuPSJ0YWtlIisoZT8iUmlnaHQiOiIiKTtYbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tuXSgxKS52YWx1ZSgpWzBdfX0pKSxNZShbImluaXRpYWwiLCJ0YWlsIl0sKGZ1bmN0aW9uKHQsZSl7dmFyIG49ImRyb3AiKyhlPyIiOiJSaWdodCIpO1huLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZmlsdGVyZWRfXz9uZXcgWG4odGhpcyk6dGhpc1tuXSgxKX19KSksWG4ucHJvdG90eXBlLmNvbXBhY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXIob3UpfSxYbi5wcm90b3R5cGUuZmluZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maWx0ZXIodCkuaGVhZCgpfSxYbi5wcm90b3R5cGUuZmluZExhc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpLmZpbmQodCl9LFhuLnByb3RvdHlwZS5pbnZva2VNYXA9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/bmV3IFhuKHRoaXMpOnRoaXMubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gVHIobix0LGUpfSkpfSkpLFhuLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmlsdGVyKEJzKGxvKHQpKSl9LFhuLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe3Q9eWEodCk7dmFyIHI9dGhpcztyZXR1cm4gci5fX2ZpbHRlcmVkX18mJih0PjB8fGU8MCk/bmV3IFhuKHIpOih0PDA/cj1yLnRha2VSaWdodCgtdCk6dCYmKHI9ci5kcm9wKHQpKSxlIT09biYmKHI9KGU9eWEoZSkpPDA/ci5kcm9wUmlnaHQoLWUpOnIudGFrZShlLXQpKSxyKX0sWG4ucHJvdG90eXBlLnRha2VSaWdodFdoaWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJldmVyc2UoKS50YWtlV2hpbGUodCkucmV2ZXJzZSgpfSxYbi5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRha2UoZCl9LGJyKFhuLnByb3RvdHlwZSwoZnVuY3Rpb24odCxlKXt2YXIgcj0vXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChlKSxpPS9eKD86aGVhZHxsYXN0KSQvLnRlc3QoZSksbz1xbltpPyJ0YWtlIisoImxhc3QiPT1lPyJSaWdodCI6IiIpOmVdLHM9aXx8L15maW5kLy50ZXN0KGUpOyFvfHwocW4ucHJvdG90eXBlW2VdPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX3dyYXBwZWRfXyxhPWk/WzFdOmFyZ3VtZW50cyx1PWUgaW5zdGFuY2VvZiBYbixjPWFbMF0sbD11fHxYcyhlKSxoPWZ1bmN0aW9uKHQpe3ZhciBlPW8uYXBwbHkocW4sQmUoW3RdLGEpKTtyZXR1cm4gaSYmZj9lWzBdOmV9O2wmJnImJiJmdW5jdGlvbiI9PXR5cGVvZiBjJiYxIT1jLmxlbmd0aCYmKHU9bD0hMSk7dmFyIGY9dGhpcy5fX2NoYWluX18scD0hIXRoaXMuX19hY3Rpb25zX18ubGVuZ3RoLGQ9cyYmIWYsZz11JiYhcDtpZighcyYmbCl7ZT1nP2U6bmV3IFhuKHRoaXMpO3ZhciB5PXQuYXBwbHkoZSxhKTtyZXR1cm4geS5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOmdzLGFyZ3M6W2hdLHRoaXNBcmc6bn0pLG5ldyBZbih5LGYpfXJldHVybiBkJiZnP3QuYXBwbHkodGhpcyxhKTooeT10aGlzLnRocnUoaCksZD9pP3kudmFsdWUoKVswXTp5LnZhbHVlKCk6eSl9KX0pKSxNZShbInBvcCIsInB1c2giLCJzaGlmdCIsInNvcnQiLCJzcGxpY2UiLCJ1bnNoaWZ0Il0sKGZ1bmN0aW9uKHQpe3ZhciBlPU90W3RdLG49L14oPzpwdXNofHNvcnR8dW5zaGlmdCkkLy50ZXN0KHQpPyJ0YXAiOiJ0aHJ1IixyPS9eKD86cG9wfHNoaWZ0KSQvLnRlc3QodCk7cW4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO2lmKHImJiF0aGlzLl9fY2hhaW5fXyl7dmFyIGk9dGhpcy52YWx1ZSgpO3JldHVybiBlLmFwcGx5KFhzKGkpP2k6W10sdCl9cmV0dXJuIHRoaXNbbl0oKGZ1bmN0aW9uKG4pe3JldHVybiBlLmFwcGx5KFhzKG4pP246W10sdCl9KSl9fSkpLGJyKFhuLnByb3RvdHlwZSwoZnVuY3Rpb24odCxlKXt2YXIgbj1xbltlXTtpZihuKXt2YXIgcj1uLm5hbWUrIiI7a3QuY2FsbChPbixyKXx8KE9uW3JdPVtdKSxPbltyXS5wdXNoKHtuYW1lOmUsZnVuYzpufSl9fSkpLE9uW3FpKG4sMikubmFtZV09W3tuYW1lOiJ3cmFwcGVyIixmdW5jOm59XSxYbi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgWG4odGhpcy5fX3dyYXBwZWRfXyk7cmV0dXJuIHQuX19hY3Rpb25zX189RmkodGhpcy5fX2FjdGlvbnNfXyksdC5fX2Rpcl9fPXRoaXMuX19kaXJfXyx0Ll9fZmlsdGVyZWRfXz10aGlzLl9fZmlsdGVyZWRfXyx0Ll9faXRlcmF0ZWVzX189RmkodGhpcy5fX2l0ZXJhdGVlc19fKSx0Ll9fdGFrZUNvdW50X189dGhpcy5fX3Rha2VDb3VudF9fLHQuX192aWV3c19fPUZpKHRoaXMuX192aWV3c19fKSx0fSxYbi5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2lmKHRoaXMuX19maWx0ZXJlZF9fKXt2YXIgdD1uZXcgWG4odGhpcyk7dC5fX2Rpcl9fPS0xLHQuX19maWx0ZXJlZF9fPSEwfWVsc2UodD10aGlzLmNsb25lKCkpLl9fZGlyX18qPS0xO3JldHVybiB0fSxYbi5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9fd3JhcHBlZF9fLnZhbHVlKCksZT10aGlzLl9fZGlyX18sbj1Ycyh0KSxyPWU8MCxpPW4/dC5sZW5ndGg6MCxvPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspe3ZhciBvPW5bcl0scz1vLnNpemU7c3dpdGNoKG8udHlwZSl7Y2FzZSJkcm9wIjp0Kz1zO2JyZWFrO2Nhc2UiZHJvcFJpZ2h0IjplLT1zO2JyZWFrO2Nhc2UidGFrZSI6ZT13bihlLHQrcyk7YnJlYWs7Y2FzZSJ0YWtlUmlnaHQiOnQ9eG4odCxlLXMpfX1yZXR1cm57c3RhcnQ6dCxlbmQ6ZX19KDAsaSx0aGlzLl9fdmlld3NfXykscz1vLnN0YXJ0LGE9by5lbmQsdT1hLXMsYz1yP2E6cy0xLGw9dGhpcy5fX2l0ZXJhdGVlc19fLGg9bC5sZW5ndGgsZj0wLHA9d24odSx0aGlzLl9fdGFrZUNvdW50X18pO2lmKCFufHwhciYmaT09dSYmcD09dSlyZXR1cm4geWkodCx0aGlzLl9fYWN0aW9uc19fKTt2YXIgZD1bXTt0OmZvcig7dS0tJiZmPHA7KXtmb3IodmFyIGc9LTEseT10W2MrPWVdOysrZzxoOyl7dmFyIG09bFtnXSx2PW0uaXRlcmF0ZWUsXz1tLnR5cGUseD12KHkpO2lmKDI9PV8peT14O2Vsc2UgaWYoIXgpe2lmKDE9PV8pY29udGludWUgdDticmVhayB0fX1kW2YrK109eX1yZXR1cm4gZH0scW4ucHJvdG90eXBlLmF0PXlzLHFuLnByb3RvdHlwZS5jaGFpbj1mdW5jdGlvbigpe3JldHVybiBkcyh0aGlzKX0scW4ucHJvdG90eXBlLmNvbW1pdD1mdW5jdGlvbigpe3JldHVybiBuZXcgWW4odGhpcy52YWx1ZSgpLHRoaXMuX19jaGFpbl9fKX0scW4ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt0aGlzLl9fdmFsdWVzX189PT1uJiYodGhpcy5fX3ZhbHVlc19fPWRhKHRoaXMudmFsdWUoKSkpO3ZhciB0PXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoO3JldHVybntkb25lOnQsdmFsdWU6dD9uOnRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXX19LHFuLnByb3RvdHlwZS5wbGFudD1mdW5jdGlvbih0KXtmb3IodmFyIGUscj10aGlzO3IgaW5zdGFuY2VvZiBHbjspe3ZhciBpPVVvKHIpO2kuX19pbmRleF9fPTAsaS5fX3ZhbHVlc19fPW4sZT9vLl9fd3JhcHBlZF9fPWk6ZT1pO3ZhciBvPWk7cj1yLl9fd3JhcHBlZF9ffXJldHVybiBvLl9fd3JhcHBlZF9fPXQsZX0scW4ucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9fd3JhcHBlZF9fO2lmKHQgaW5zdGFuY2VvZiBYbil7dmFyIGU9dDtyZXR1cm4gdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgmJihlPW5ldyBYbih0aGlzKSksKGU9ZS5yZXZlcnNlKCkpLl9fYWN0aW9uc19fLnB1c2goe2Z1bmM6Z3MsYXJnczpbbnNdLHRoaXNBcmc6bn0pLG5ldyBZbihlLHRoaXMuX19jaGFpbl9fKX1yZXR1cm4gdGhpcy50aHJ1KG5zKX0scW4ucHJvdG90eXBlLnRvSlNPTj1xbi5wcm90b3R5cGUudmFsdWVPZj1xbi5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4geWkodGhpcy5fX3dyYXBwZWRfXyx0aGlzLl9fYWN0aW9uc19fKX0scW4ucHJvdG90eXBlLmZpcnN0PXFuLnByb3RvdHlwZS5oZWFkLHRlJiYocW4ucHJvdG90eXBlW3RlXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSkscW59KCk7dmU/KCh2ZS5leHBvcnRzPXZuKS5fPXZuLG1lLl89dm4pOnllLl89dm59KS5jYWxsKHRlKX0pKTt2YXIgbmU9NjM3MTAwOC44LHJlPXttZXRlcnM6bmUsbWV0cmVzOm5lLG1pbGxpbWV0ZXJzOjFlMypuZSxtaWxsaW1ldHJlczoxZTMqbmUsY2VudGltZXRlcnM6MTAwKm5lLGNlbnRpbWV0cmVzOjEwMCpuZSxraWxvbWV0ZXJzOm5lLzFlMyxraWxvbWV0cmVzOm5lLzFlMyxtaWxlczpuZS8xNjA5LjM0NCxuYXV0aWNhbG1pbGVzOm5lLzE4NTIsaW5jaGVzOjM5LjM3Km5lLHlhcmRzOm5lLzEuMDkzNixmZWV0OjMuMjgwODQqbmUscmFkaWFuczoxLGRlZ3JlZXM6bmUvMTExMzI1fSxpZT17bWV0ZXJzOjEsbWV0cmVzOjEsbWlsbGltZXRlcnM6MWUzLG1pbGxpbWV0cmVzOjFlMyxjZW50aW1ldGVyczoxMDAsY2VudGltZXRyZXM6MTAwLGtpbG9tZXRlcnM6LjAwMSxraWxvbWV0cmVzOi4wMDEsbWlsZXM6MS8xNjA5LjM0NCxuYXV0aWNhbG1pbGVzOjEvMTg1MixpbmNoZXM6MzkuMzcseWFyZHM6MS8xLjA5MzYsZmVldDozLjI4MDg0LHJhZGlhbnM6MS9uZSxkZWdyZWVzOjEvMTExMzI1fSxvZT17bWV0ZXJzOjEsbWV0cmVzOjEsbWlsbGltZXRlcnM6MWU2LG1pbGxpbWV0cmVzOjFlNixjZW50aW1ldGVyczoxZTQsY2VudGltZXRyZXM6MWU0LGtpbG9tZXRlcnM6MWUtNixraWxvbWV0cmVzOjFlLTYsYWNyZXM6MjQ3MTA1ZS05LG1pbGVzOjM4NmUtOSx5YXJkczoxLjE5NTk5MDA0NixmZWV0OjEwLjc2MzkxMDQxNyxpbmNoZXM6MTU1MC4wMDMxMDAwMDZ9O2Z1bmN0aW9uIHNlKHQsZSxuKXtpZighdmUobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLmJib3gsaT1uLmlkO2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKCJnZW9tZXRyeSBpcyByZXF1aXJlZCIpO2lmKGUmJmUuY29uc3RydWN0b3IhPT1PYmplY3QpdGhyb3cgbmV3IEVycm9yKCJwcm9wZXJ0aWVzIG11c3QgYmUgYW4gT2JqZWN0Iik7ciYmX2UociksaSYmeGUoaSk7dmFyIG89e3R5cGU6IkZlYXR1cmUifTtyZXR1cm4gaSYmKG8uaWQ9aSksciYmKG8uYmJveD1yKSxvLnByb3BlcnRpZXM9ZXx8e30sby5nZW9tZXRyeT10LG99ZnVuY3Rpb24gYWUodCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gQXJyYXkiKTtpZih0Lmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhdCBsZWFzdCAyIG51bWJlcnMgbG9uZyIpO2lmKCFtZSh0WzBdKXx8IW1lKHRbMV0pKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBjb250YWluIG51bWJlcnMiKTtyZXR1cm4gc2Uoe3R5cGU6IlBvaW50Iixjb29yZGluYXRlczp0fSxlLG4pfWZ1bmN0aW9uIHVlKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBpPXRbcl07aWYoaS5sZW5ndGg8NCl0aHJvdyBuZXcgRXJyb3IoIkVhY2ggTGluZWFyUmluZyBvZiBhIFBvbHlnb24gbXVzdCBoYXZlIDQgb3IgbW9yZSBQb3NpdGlvbnMuIik7Zm9yKHZhciBvPTA7bzxpW2kubGVuZ3RoLTFdLmxlbmd0aDtvKyspe2lmKDA9PT1yJiYwPT09byYmIW1lKGlbMF1bMF0pfHwhbWUoaVswXVsxXSkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGNvbnRhaW4gbnVtYmVycyIpO2lmKGlbaS5sZW5ndGgtMV1bb10hPT1pWzBdW29dKXRocm93IG5ldyBFcnJvcigiRmlyc3QgYW5kIGxhc3QgUG9zaXRpb24gYXJlIG5vdCBlcXVpdmFsZW50LiIpfX1yZXR1cm4gc2Uoe3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24gY2UodCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtpZih0Lmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBhcnJheSBvZiB0d28gb3IgbW9yZSBwb3NpdGlvbnMiKTtpZighbWUodFswXVsxXSl8fCFtZSh0WzBdWzFdKSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgY29udGFpbiBudW1iZXJzIik7cmV0dXJuIHNlKHt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fSxlLG4pfWZ1bmN0aW9uIGxlKHQsZSl7aWYoIXZlKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5iYm94LHI9ZS5pZDtpZighdCl0aHJvdyBuZXcgRXJyb3IoIk5vIGZlYXR1cmVzIHBhc3NlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiZmVhdHVyZXMgbXVzdCBiZSBhbiBBcnJheSIpO24mJl9lKG4pLHImJnhlKHIpO3ZhciBpPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiJ9O3JldHVybiByJiYoaS5pZD1yKSxuJiYoaS5iYm94PW4pLGkuZmVhdHVyZXM9dCxpfWZ1bmN0aW9uIGhlKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7cmV0dXJuIHNlKHt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24gZmUodCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtyZXR1cm4gc2Uoe3R5cGU6Ik11bHRpUG9pbnQiLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24gcGUodCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtyZXR1cm4gc2Uoe3R5cGU6Ik11bHRpUG9seWdvbiIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiBkZSh0LGUpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJyYWRpYW5zIGlzIHJlcXVpcmVkIik7aWYoZSYmInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigidW5pdHMgbXVzdCBiZSBhIHN0cmluZyIpO3ZhciBuPXJlW2V8fCJraWxvbWV0ZXJzIl07aWYoIW4pdGhyb3cgbmV3IEVycm9yKGUrIiB1bml0cyBpcyBpbnZhbGlkIik7cmV0dXJuIHQqbn1mdW5jdGlvbiBnZSh0LGUpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJkaXN0YW5jZSBpcyByZXF1aXJlZCIpO2lmKGUmJiJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoInVuaXRzIG11c3QgYmUgYSBzdHJpbmciKTt2YXIgbj1yZVtlfHwia2lsb21ldGVycyJdO2lmKCFuKXRocm93IG5ldyBFcnJvcihlKyIgdW5pdHMgaXMgaW52YWxpZCIpO3JldHVybiB0L259ZnVuY3Rpb24geWUodCl7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoInJhZGlhbnMgaXMgcmVxdWlyZWQiKTtyZXR1cm4gMTgwKih0JSgyKk1hdGguUEkpKS9NYXRoLlBJfWZ1bmN0aW9uIG1lKHQpe3JldHVybiFpc05hTih0KSYmbnVsbCE9PXQmJiFBcnJheS5pc0FycmF5KHQpfWZ1bmN0aW9uIHZlKHQpe3JldHVybiEhdCYmdC5jb25zdHJ1Y3Rvcj09PU9iamVjdH1mdW5jdGlvbiBfZSh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImJib3ggaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBiZSBhbiBBcnJheSIpO2lmKDQhPT10Lmxlbmd0aCYmNiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiYmJveCBtdXN0IGJlIGFuIEFycmF5IG9mIDQgb3IgNiBudW1iZXJzIik7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighbWUodCkpdGhyb3cgbmV3IEVycm9yKCJiYm94IG11c3Qgb25seSBjb250YWluIG51bWJlcnMiKX0pKX1mdW5jdGlvbiB4ZSh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImlkIGlzIHJlcXVpcmVkIik7aWYoLTE9PT1bInN0cmluZyIsIm51bWJlciJdLmluZGV4T2YodHlwZW9mIHQpKXRocm93IG5ldyBFcnJvcigiaWQgbXVzdCBiZSBhIG51bWJlciBvciBhIHN0cmluZyIpfWZ1bmN0aW9uIHdlKHQsZSxuKXtpZihudWxsIT09dClmb3IodmFyIHIsaSxvLHMsYSx1LGMsbCxoPTAsZj0wLHA9dC50eXBlLGQ9IkZlYXR1cmVDb2xsZWN0aW9uIj09PXAsZz0iRmVhdHVyZSI9PT1wLHk9ZD90LmZlYXR1cmVzLmxlbmd0aDoxLG09MDttPHk7bSsrKXthPShsPSEhKGM9ZD90LmZlYXR1cmVzW21dLmdlb21ldHJ5Omc/dC5nZW9tZXRyeTp0KSYmIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT1jLnR5cGUpP2MuZ2VvbWV0cmllcy5sZW5ndGg6MTtmb3IodmFyIHY9MDt2PGE7disrKXt2YXIgXz0wLHg9MDtpZihudWxsIT09KHM9bD9jLmdlb21ldHJpZXNbdl06Yykpe3U9cy5jb29yZGluYXRlczt2YXIgdz1zLnR5cGU7c3dpdGNoKGg9IW58fCJQb2x5Z29uIiE9PXcmJiJNdWx0aVBvbHlnb24iIT09dz8wOjEsdyl7Y2FzZSBudWxsOmJyZWFrO2Nhc2UiUG9pbnQiOmUodSxmLG0sXyx4KSxmKyssXysrO2JyZWFrO2Nhc2UiTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvaW50Ijpmb3Iocj0wO3I8dS5sZW5ndGg7cisrKWUodVtyXSxmLG0sXyx4KSxmKyssIk11bHRpUG9pbnQiPT09dyYmXysrOyJMaW5lU3RyaW5nIj09PXcmJl8rKzticmVhaztjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpmb3Iocj0wO3I8dS5sZW5ndGg7cisrKXtmb3IoaT0wO2k8dVtyXS5sZW5ndGgtaDtpKyspZSh1W3JdW2ldLGYsbSxfLHgpLGYrKzsiTXVsdGlMaW5lU3RyaW5nIj09PXcmJl8rKywiUG9seWdvbiI9PT13JiZ4Kyt9IlBvbHlnb24iPT09dyYmXysrO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjpmb3Iocj0wO3I8dS5sZW5ndGg7cisrKXtmb3IoIk11bHRpUG9seWdvbiI9PT13JiYoeD0wKSxpPTA7aTx1W3JdLmxlbmd0aDtpKyspe2ZvcihvPTA7bzx1W3JdW2ldLmxlbmd0aC1oO28rKyllKHVbcl1baV1bb10sZixtLF8seCksZisrO3grK31fKyt9YnJlYWs7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOmZvcihyPTA7cjxzLmdlb21ldHJpZXMubGVuZ3RoO3IrKyl3ZShzLmdlb21ldHJpZXNbcl0sZSxuKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBHZW9tZXRyeSBUeXBlIil9fX19fWZ1bmN0aW9uIGJlKHQsZSxuLHIpe3ZhciBpPW47cmV0dXJuIHdlKHQsKGZ1bmN0aW9uKHQscixvLHMsYSl7aT0wPT09ciYmdm9pZCAwPT09bj90OmUoaSx0LHIsbyxzLGEpfSksciksaX1mdW5jdGlvbiBEZSh0LGUpe3ZhciBuO3N3aXRjaCh0LnR5cGUpe2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOmZvcihuPTA7bjx0LmZlYXR1cmVzLmxlbmd0aDtuKyspZSh0LmZlYXR1cmVzW25dLnByb3BlcnRpZXMsbik7YnJlYWs7Y2FzZSJGZWF0dXJlIjplKHQucHJvcGVydGllcywwKX19ZnVuY3Rpb24gRWUodCxlKXtpZigiRmVhdHVyZSI9PT10LnR5cGUpZSh0LDApO2Vsc2UgaWYoIkZlYXR1cmVDb2xsZWN0aW9uIj09PXQudHlwZSlmb3IodmFyIG49MDtuPHQuZmVhdHVyZXMubGVuZ3RoO24rKyllKHQuZmVhdHVyZXNbbl0sbil9ZnVuY3Rpb24gQ2UodCxlKXt2YXIgbixyLGksbyxzLGEsdSxjLGwsaCxmPTAscD0iRmVhdHVyZUNvbGxlY3Rpb24iPT09dC50eXBlLGQ9IkZlYXR1cmUiPT09dC50eXBlLGc9cD90LmZlYXR1cmVzLmxlbmd0aDoxO2ZvcihuPTA7bjxnO24rKyl7Zm9yKGE9cD90LmZlYXR1cmVzW25dLmdlb21ldHJ5OmQ/dC5nZW9tZXRyeTp0LGM9cD90LmZlYXR1cmVzW25dLnByb3BlcnRpZXM6ZD90LnByb3BlcnRpZXM6e30sbD1wP3QuZmVhdHVyZXNbbl0uYmJveDpkP3QuYmJveDp2b2lkIDAsaD1wP3QuZmVhdHVyZXNbbl0uaWQ6ZD90LmlkOnZvaWQgMCxzPSh1PSEhYSYmIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT1hLnR5cGUpP2EuZ2VvbWV0cmllcy5sZW5ndGg6MSxpPTA7aTxzO2krKylpZihudWxsIT09KG89dT9hLmdlb21ldHJpZXNbaV06YSkpc3dpdGNoKG8udHlwZSl7Y2FzZSJQb2ludCI6Y2FzZSJMaW5lU3RyaW5nIjpjYXNlIk11bHRpUG9pbnQiOmNhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aUxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2x5Z29uIjplKG8sZixjLGwsaCk7YnJlYWs7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOmZvcihyPTA7cjxvLmdlb21ldHJpZXMubGVuZ3RoO3IrKyllKG8uZ2VvbWV0cmllc1tyXSxmLGMsbCxoKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBHZW9tZXRyeSBUeXBlIil9ZWxzZSBlKG51bGwsZixjLGwsaCk7ZisrfX1mdW5jdGlvbiBTZSh0LGUpe0NlKHQsKGZ1bmN0aW9uKHQsbixyLGksbyl7dmFyIHMsYT1udWxsPT09dD9udWxsOnQudHlwZTtzd2l0Y2goYSl7Y2FzZSBudWxsOmNhc2UiUG9pbnQiOmNhc2UiTGluZVN0cmluZyI6Y2FzZSJQb2x5Z29uIjpyZXR1cm4gdm9pZCBlKHNlKHQscix7YmJveDppLGlkOm99KSxuLDApfXN3aXRjaChhKXtjYXNlIk11bHRpUG9pbnQiOnM9IlBvaW50IjticmVhaztjYXNlIk11bHRpTGluZVN0cmluZyI6cz0iTGluZVN0cmluZyI7YnJlYWs7Y2FzZSJNdWx0aVBvbHlnb24iOnM9IlBvbHlnb24ifXQuY29vcmRpbmF0ZXMuZm9yRWFjaCgoZnVuY3Rpb24odCxpKXtlKHNlKHt0eXBlOnMsY29vcmRpbmF0ZXM6dH0sciksbixpKX0pKX0pKX1mdW5jdGlvbiBBZSh0LGUpe1NlKHQsKGZ1bmN0aW9uKHQsbixyKXt2YXIgaT0wO2lmKHQuZ2VvbWV0cnkpe3ZhciBvPXQuZ2VvbWV0cnkudHlwZTsiUG9pbnQiPT09b3x8Ik11bHRpUG9pbnQiPT09b3x8YmUodCwoZnVuY3Rpb24obyxzLGEsdSxjLGwpe3ZhciBoPWNlKFtvLHNdLHQucHJvcGVydGllcyk7cmV0dXJuIGUoaCxuLHIsbCxpKSxpKyssc30pKX19KSl9ZnVuY3Rpb24gTmUodCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtTZSh0LChmdW5jdGlvbih0LG4scil7aWYobnVsbCE9PXQuZ2VvbWV0cnkpe3ZhciBpPXQuZ2VvbWV0cnkudHlwZSxvPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7c3dpdGNoKGkpe2Nhc2UiTGluZVN0cmluZyI6ZSh0LG4sciwwLDApO2JyZWFrO2Nhc2UiUG9seWdvbiI6Zm9yKHZhciBzPTA7czxvLmxlbmd0aDtzKyspZShjZShvW3NdLHQucHJvcGVydGllcyksbixyLHMpfX19KSl9ZnVuY3Rpb24gSWUodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJvYmogaXMgcmVxdWlyZWQiKTt2YXIgZT1NZSh0KTtpZihlLmxlbmd0aD4xJiZtZShlWzBdKSYmbWUoZVsxXSkpcmV0dXJuIGU7dGhyb3cgbmV3IEVycm9yKCJDb29yZGluYXRlIGlzIG5vdCBhIHZhbGlkIFBvaW50Iil9ZnVuY3Rpb24gTWUodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJvYmogaXMgcmVxdWlyZWQiKTt2YXIgZTtpZih0Lmxlbmd0aD9lPXQ6dC5jb29yZGluYXRlcz9lPXQuY29vcmRpbmF0ZXM6dC5nZW9tZXRyeSYmdC5nZW9tZXRyeS5jb29yZGluYXRlcyYmKGU9dC5nZW9tZXRyeS5jb29yZGluYXRlcyksZSlyZXR1cm4gRmUoZSksZTt0aHJvdyBuZXcgRXJyb3IoIk5vIHZhbGlkIGNvb3JkaW5hdGVzIil9ZnVuY3Rpb24gRmUodCl7aWYodC5sZW5ndGg+MSYmbWUodFswXSkmJm1lKHRbMV0pKXJldHVybiEwO2lmKEFycmF5LmlzQXJyYXkodFswXSkmJnRbMF0ubGVuZ3RoKXJldHVybiBGZSh0WzBdKTt0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3Qgb25seSBjb250YWluIG51bWJlcnMiKX1PYmplY3QuZnJlZXplKHtlYXJ0aFJhZGl1czpuZSxmYWN0b3JzOnJlLHVuaXRzRmFjdG9yczppZSxhcmVhRmFjdG9yczpvZSxmZWF0dXJlOnNlLGdlb21ldHJ5OmZ1bmN0aW9uKHQsZSxuKXtpZighdmUobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcixpPW4uYmJveDtpZighdCl0aHJvdyBuZXcgRXJyb3IoInR5cGUgaXMgcmVxdWlyZWQiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Iik7c3dpdGNoKGkmJl9lKGkpLHQpe2Nhc2UiUG9pbnQiOnI9YWUoZSkuZ2VvbWV0cnk7YnJlYWs7Y2FzZSJMaW5lU3RyaW5nIjpyPWNlKGUpLmdlb21ldHJ5O2JyZWFrO2Nhc2UiUG9seWdvbiI6cj11ZShlKS5nZW9tZXRyeTticmVhaztjYXNlIk11bHRpUG9pbnQiOnI9ZmUoZSkuZ2VvbWV0cnk7YnJlYWs7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnI9aGUoZSkuZ2VvbWV0cnk7YnJlYWs7Y2FzZSJNdWx0aVBvbHlnb24iOnI9cGUoZSkuZ2VvbWV0cnk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IodCsiIGlzIGludmFsaWQiKX1yZXR1cm4gaSYmKHIuYmJveD1pKSxyfSxwb2ludDphZSxwb2ludHM6ZnVuY3Rpb24odCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gQXJyYXkiKTtyZXR1cm4gbGUodC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBhZSh0LGUpfSkpLG4pfSxwb2x5Z29uOnVlLHBvbHlnb25zOmZ1bmN0aW9uKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Iik7cmV0dXJuIGxlKHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdWUodCxlKX0pKSxuKX0sbGluZVN0cmluZzpjZSxsaW5lU3RyaW5nczpmdW5jdGlvbih0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheSIpO3JldHVybiBsZSh0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGNlKHQsZSl9KSksbil9LGZlYXR1cmVDb2xsZWN0aW9uOmxlLG11bHRpTGluZVN0cmluZzpoZSxtdWx0aVBvaW50OmZlLG11bHRpUG9seWdvbjpwZSxnZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvbWV0cmllcyBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiZ2VvbWV0cmllcyBtdXN0IGJlIGFuIEFycmF5Iik7cmV0dXJuIHNlKHt0eXBlOiJHZW9tZXRyeUNvbGxlY3Rpb24iLGdlb21ldHJpZXM6dH0sZSxuKX0scm91bmQ6ZnVuY3Rpb24odCxlKXtpZihudWxsPT10fHxpc05hTih0KSl0aHJvdyBuZXcgRXJyb3IoIm51bSBpcyByZXF1aXJlZCIpO2lmKGUmJiEoZT49MCkpdGhyb3cgbmV3IEVycm9yKCJwcmVjaXNpb24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIpO3ZhciBuPU1hdGgucG93KDEwLGV8fDApO3JldHVybiBNYXRoLnJvdW5kKHQqbikvbn0scmFkaWFuc1RvTGVuZ3RoOmRlLGxlbmd0aFRvUmFkaWFuczpnZSxsZW5ndGhUb0RlZ3JlZXM6ZnVuY3Rpb24odCxlKXtyZXR1cm4geWUoZ2UodCxlKSl9LGJlYXJpbmdUb0F6aW11dGg6ZnVuY3Rpb24odCl7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoImJlYXJpbmcgaXMgcmVxdWlyZWQiKTt2YXIgZT10JTM2MDtyZXR1cm4gZTwwJiYoZSs9MzYwKSxlfSxyYWRpYW5zVG9EZWdyZWVzOnllLGRlZ3JlZXNUb1JhZGlhbnM6ZnVuY3Rpb24odCl7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoImRlZ3JlZXMgaXMgcmVxdWlyZWQiKTtyZXR1cm4gdCUzNjAqTWF0aC5QSS8xODB9LGNvbnZlcnRMZW5ndGg6ZnVuY3Rpb24odCxlLG4pe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJsZW5ndGggaXMgcmVxdWlyZWQiKTtpZighKHQ+PTApKXRocm93IG5ldyBFcnJvcigibGVuZ3RoIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTtyZXR1cm4gZGUoZ2UodCxlKSxufHwia2lsb21ldGVycyIpfSxjb252ZXJ0QXJlYTpmdW5jdGlvbih0LGUsbil7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoImFyZWEgaXMgcmVxdWlyZWQiKTtpZighKHQ+PTApKXRocm93IG5ldyBFcnJvcigiYXJlYSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7dmFyIHI9b2VbZXx8Im1ldGVycyJdO2lmKCFyKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBvcmlnaW5hbCB1bml0cyIpO3ZhciBpPW9lW258fCJraWxvbWV0ZXJzIl07aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZpbmFsIHVuaXRzIik7cmV0dXJuIHQvcippfSxpc051bWJlcjptZSxpc09iamVjdDp2ZSx2YWxpZGF0ZUJCb3g6X2UsdmFsaWRhdGVJZDp4ZSxyYWRpYW5zMmRlZ3JlZXM6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZCBoYXMgYmVlbiByZW5hbWVkIHRvIGByYWRpYW5zVG9EZWdyZWVzYCIpfSxkZWdyZWVzMnJhZGlhbnM6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZCBoYXMgYmVlbiByZW5hbWVkIHRvIGBkZWdyZWVzVG9SYWRpYW5zYCIpfSxkaXN0YW5jZVRvRGVncmVlczpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigibWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gYGxlbmd0aFRvRGVncmVlc2AiKX0sZGlzdGFuY2VUb1JhZGlhbnM6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZCBoYXMgYmVlbiByZW5hbWVkIHRvIGBsZW5ndGhUb1JhZGlhbnNgIil9LHJhZGlhbnNUb0Rpc3RhbmNlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJtZXRob2QgaGFzIGJlZW4gcmVuYW1lZCB0byBgcmFkaWFuc1RvTGVuZ3RoYCIpfSxiZWFyaW5nVG9BbmdsZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigibWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gYGJlYXJpbmdUb0F6aW11dGhgIil9LGNvbnZlcnREaXN0YW5jZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigibWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gYGNvbnZlcnRMZW5ndGhgIil9fSksT2JqZWN0LmZyZWV6ZSh7Y29vcmRFYWNoOndlLGNvb3JkUmVkdWNlOmJlLHByb3BFYWNoOkRlLHByb3BSZWR1Y2U6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIERlKHQsKGZ1bmN0aW9uKHQsaSl7cj0wPT09aSYmdm9pZCAwPT09bj90OmUocix0LGkpfSkpLHJ9LGZlYXR1cmVFYWNoOkVlLGZlYXR1cmVSZWR1Y2U6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIEVlKHQsKGZ1bmN0aW9uKHQsaSl7cj0wPT09aSYmdm9pZCAwPT09bj90OmUocix0LGkpfSkpLHJ9LGNvb3JkQWxsOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB3ZSh0LChmdW5jdGlvbih0KXtlLnB1c2godCl9KSksZX0sZ2VvbUVhY2g6Q2UsZ2VvbVJlZHVjZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bjtyZXR1cm4gQ2UodCwoZnVuY3Rpb24odCxpLG8scyxhKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSxvLHMsYSl9KSkscn0sZmxhdHRlbkVhY2g6U2UsZmxhdHRlblJlZHVjZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bjtyZXR1cm4gU2UodCwoZnVuY3Rpb24odCxpLG8pe3I9MD09PWkmJjA9PT1vJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSxvKX0pKSxyfSxzZWdtZW50RWFjaDpBZSxzZWdtZW50UmVkdWNlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uLGk9ITE7cmV0dXJuIEFlKHQsKGZ1bmN0aW9uKHQsbyxzLGEsdSl7cj0hMT09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxvLHMsYSx1KSxpPSEwfSkpLHJ9LGxpbmVFYWNoOk5lLGxpbmVSZWR1Y2U6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIE5lKHQsKGZ1bmN0aW9uKHQsaSxvLHMpe3I9MD09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxpLG8scyl9KSkscn19KSxPYmplY3QuZnJlZXplKHtnZXRDb29yZDpJZSxnZXRDb29yZHM6TWUsY29udGFpbnNOdW1iZXI6RmUsZ2VvanNvblR5cGU6ZnVuY3Rpb24odCxlLG4pe2lmKCFlfHwhbil0aHJvdyBuZXcgRXJyb3IoInR5cGUgYW5kIG5hbWUgcmVxdWlyZWQiKTtpZighdHx8dC50eXBlIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyI6IG11c3QgYmUgYSAiK2UrIiwgZ2l2ZW4gIit0LnR5cGUpfSxmZWF0dXJlT2Y6ZnVuY3Rpb24odCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiTm8gZmVhdHVyZSBwYXNzZWQiKTtpZighbil0aHJvdyBuZXcgRXJyb3IoIi5mZWF0dXJlT2YoKSByZXF1aXJlcyBhIG5hbWUiKTtpZighdHx8IkZlYXR1cmUiIT09dC50eXBlfHwhdC5nZW9tZXRyeSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyIsIEZlYXR1cmUgd2l0aCBnZW9tZXRyeSByZXF1aXJlZCIpO2lmKCF0Lmdlb21ldHJ5fHx0Lmdlb21ldHJ5LnR5cGUhPT1lKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0byAiK24rIjogbXVzdCBiZSBhICIrZSsiLCBnaXZlbiAiK3QuZ2VvbWV0cnkudHlwZSl9LGNvbGxlY3Rpb25PZjpmdW5jdGlvbih0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJObyBmZWF0dXJlQ29sbGVjdGlvbiBwYXNzZWQiKTtpZighbil0aHJvdyBuZXcgRXJyb3IoIi5jb2xsZWN0aW9uT2YoKSByZXF1aXJlcyBhIG5hbWUiKTtpZighdHx8IkZlYXR1cmVDb2xsZWN0aW9uIiE9PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyIsIEZlYXR1cmVDb2xsZWN0aW9uIHJlcXVpcmVkIik7Zm9yKHZhciByPTA7cjx0LmZlYXR1cmVzLmxlbmd0aDtyKyspe3ZhciBpPXQuZmVhdHVyZXNbcl07aWYoIWl8fCJGZWF0dXJlIiE9PWkudHlwZXx8IWkuZ2VvbWV0cnkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiLCBGZWF0dXJlIHdpdGggZ2VvbWV0cnkgcmVxdWlyZWQiKTtpZighaS5nZW9tZXRyeXx8aS5nZW9tZXRyeS50eXBlIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyI6IG11c3QgYmUgYSAiK2UrIiwgZ2l2ZW4gIitpLmdlb21ldHJ5LnR5cGUpfX0sZ2V0R2VvbTpmdW5jdGlvbih0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtpZih2b2lkIDAhPT10Lmdlb21ldHJ5KXJldHVybiB0Lmdlb21ldHJ5O2lmKHQuY29vcmRpbmF0ZXN8fHQuZ2VvbWV0cmllcylyZXR1cm4gdDt0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gbXVzdCBiZSBhIHZhbGlkIEZlYXR1cmUgb3IgR2VvbWV0cnkgT2JqZWN0Iil9LGdldEdlb21UeXBlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJpbnZhcmlhbnQuZ2V0R2VvbVR5cGUgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiB2NS4wIGluIGZhdm9yIG9mIGludmFyaWFudC5nZXRUeXBlIil9LGdldFR5cGU6ZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoKGV8fCJnZW9qc29uIikrIiBpcyByZXF1aXJlZCIpO2lmKHQuZ2VvbWV0cnkmJnQuZ2VvbWV0cnkudHlwZSlyZXR1cm4gdC5nZW9tZXRyeS50eXBlO2lmKHQudHlwZSlyZXR1cm4gdC50eXBlO3Rocm93IG5ldyBFcnJvcigoZXx8Imdlb2pzb24iKSsiIGlzIGludmFsaWQiKX19KTt2YXIgVGU9ZnVuY3Rpb24gdChlLG4scixpLG8pe2ZvcihyPXJ8fDAsaT1pfHxlLmxlbmd0aC0xLG89b3x8TGU7aT5yOyl7aWYoaS1yPjYwMCl7dmFyIHM9aS1yKzEsYT1uLXIrMSx1PU1hdGgubG9nKHMpLGM9LjUqTWF0aC5leHAoMip1LzMpLGw9LjUqTWF0aC5zcXJ0KHUqYyoocy1jKS9zKSooYS1zLzI8MD8tMToxKSxoPU1hdGgubWF4KHIsTWF0aC5mbG9vcihuLWEqYy9zK2wpKSxmPU1hdGgubWluKGksTWF0aC5mbG9vcihuKyhzLWEpKmMvcytsKSk7dChlLG4saCxmLG8pfXZhciBwPWVbbl0sZD1yLGc9aTtmb3IoT2UoZSxyLG4pLG8oZVtpXSxwKT4wJiZPZShlLHIsaSk7ZDxnOyl7Zm9yKE9lKGUsZCxnKSxkKyssZy0tO28oZVtkXSxwKTwwOylkKys7Zm9yKDtvKGVbZ10scCk+MDspZy0tfTA9PT1vKGVbcl0scCk/T2UoZSxyLGcpOk9lKGUsKytnLGkpLGc8PW4mJihyPWcrMSksbjw9ZyYmKGk9Zy0xKX19O2Z1bmN0aW9uIE9lKHQsZSxuKXt2YXIgcj10W2VdO3RbZV09dFtuXSx0W25dPXJ9ZnVuY3Rpb24gTGUodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9dmFyIFBlPVJlO2Z1bmN0aW9uIFJlKHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgUmUpKXJldHVybiBuZXcgUmUodCxlKTt0aGlzLl9tYXhFbnRyaWVzPU1hdGgubWF4KDQsdHx8OSksdGhpcy5fbWluRW50cmllcz1NYXRoLm1heCgyLE1hdGguY2VpbCguNCp0aGlzLl9tYXhFbnRyaWVzKSksZSYmdGhpcy5faW5pdEZvcm1hdChlKSx0aGlzLmNsZWFyKCl9ZnVuY3Rpb24gQmUodCxlLG4pe2lmKCFuKXJldHVybiBlLmluZGV4T2YodCk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYobih0LGVbcl0pKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIGtlKHQsZSl7emUodCwwLHQuY2hpbGRyZW4ubGVuZ3RoLGUsdCl9ZnVuY3Rpb24gemUodCxlLG4scixpKXtpfHwoaT1aZShudWxsKSksaS5taW5YPTEvMCxpLm1pblk9MS8wLGkubWF4WD0tMS8wLGkubWF4WT0tMS8wO2Zvcih2YXIgbyxzPWU7czxuO3MrKylvPXQuY2hpbGRyZW5bc10samUoaSx0LmxlYWY/cihvKTpvKTtyZXR1cm4gaX1mdW5jdGlvbiBqZSh0LGUpe3JldHVybiB0Lm1pblg9TWF0aC5taW4odC5taW5YLGUubWluWCksdC5taW5ZPU1hdGgubWluKHQubWluWSxlLm1pblkpLHQubWF4WD1NYXRoLm1heCh0Lm1heFgsZS5tYXhYKSx0Lm1heFk9TWF0aC5tYXgodC5tYXhZLGUubWF4WSksdH1mdW5jdGlvbiBVZSh0LGUpe3JldHVybiB0Lm1pblgtZS5taW5YfWZ1bmN0aW9uIHFlKHQsZSl7cmV0dXJuIHQubWluWS1lLm1pbll9ZnVuY3Rpb24gVmUodCl7cmV0dXJuKHQubWF4WC10Lm1pblgpKih0Lm1heFktdC5taW5ZKX1mdW5jdGlvbiBHZSh0KXtyZXR1cm4gdC5tYXhYLXQubWluWCsodC5tYXhZLXQubWluWSl9ZnVuY3Rpb24gWWUodCxlKXtyZXR1cm4oTWF0aC5tYXgoZS5tYXhYLHQubWF4WCktTWF0aC5taW4oZS5taW5YLHQubWluWCkpKihNYXRoLm1heChlLm1heFksdC5tYXhZKS1NYXRoLm1pbihlLm1pblksdC5taW5ZKSl9ZnVuY3Rpb24gWGUodCxlKXt2YXIgbj1NYXRoLm1heCh0Lm1pblgsZS5taW5YKSxyPU1hdGgubWF4KHQubWluWSxlLm1pblkpLGk9TWF0aC5taW4odC5tYXhYLGUubWF4WCksbz1NYXRoLm1pbih0Lm1heFksZS5tYXhZKTtyZXR1cm4gTWF0aC5tYXgoMCxpLW4pKk1hdGgubWF4KDAsby1yKX1mdW5jdGlvbiBXZSh0LGUpe3JldHVybiB0Lm1pblg8PWUubWluWCYmdC5taW5ZPD1lLm1pblkmJmUubWF4WDw9dC5tYXhYJiZlLm1heFk8PXQubWF4WX1mdW5jdGlvbiBIZSh0LGUpe3JldHVybiBlLm1pblg8PXQubWF4WCYmZS5taW5ZPD10Lm1heFkmJmUubWF4WD49dC5taW5YJiZlLm1heFk+PXQubWluWX1mdW5jdGlvbiBaZSh0KXtyZXR1cm57Y2hpbGRyZW46dCxoZWlnaHQ6MSxsZWFmOiEwLG1pblg6MS8wLG1pblk6MS8wLG1heFg6LTEvMCxtYXhZOi0xLzB9fWZ1bmN0aW9uIEtlKHQsZSxuLHIsaSl7Zm9yKHZhciBvLHM9W2Usbl07cy5sZW5ndGg7KSEoKG49cy5wb3AoKSktKGU9cy5wb3AoKSk8PXIpJiYobz1lK01hdGguY2VpbCgobi1lKS9yLzIpKnIsVGUodCxvLGUsbixpKSxzLnB1c2goZSxvLG8sbikpfWZ1bmN0aW9uIEplKHQsZSl7cmV0dXJuIHQoZT17ZXhwb3J0czp7fX0sZS5leHBvcnRzKSxlLmV4cG9ydHN9UmUucHJvdG90eXBlPXthbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWxsKHRoaXMuZGF0YSxbXSl9LHNlYXJjaDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmRhdGEsbj1bXSxyPXRoaXMudG9CQm94O2lmKCFIZSh0LGUpKXJldHVybiBuO2Zvcih2YXIgaSxvLHMsYSx1PVtdO2U7KXtmb3IoaT0wLG89ZS5jaGlsZHJlbi5sZW5ndGg7aTxvO2krKylzPWUuY2hpbGRyZW5baV0sSGUodCxhPWUubGVhZj9yKHMpOnMpJiYoZS5sZWFmP24ucHVzaChzKTpXZSh0LGEpP3RoaXMuX2FsbChzLG4pOnUucHVzaChzKSk7ZT11LnBvcCgpfXJldHVybiBufSxjb2xsaWRlczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmRhdGEsbj10aGlzLnRvQkJveDtpZighSGUodCxlKSlyZXR1cm4hMTtmb3IodmFyIHIsaSxvLHMsYT1bXTtlOyl7Zm9yKHI9MCxpPWUuY2hpbGRyZW4ubGVuZ3RoO3I8aTtyKyspaWYobz1lLmNoaWxkcmVuW3JdLEhlKHQscz1lLmxlYWY/bihvKTpvKSl7aWYoZS5sZWFmfHxXZSh0LHMpKXJldHVybiEwO2EucHVzaChvKX1lPWEucG9wKCl9cmV0dXJuITF9LGxvYWQ6ZnVuY3Rpb24odCl7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4gdGhpcztpZih0Lmxlbmd0aDx0aGlzLl9taW5FbnRyaWVzKXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5pbnNlcnQodFtlXSk7cmV0dXJuIHRoaXN9dmFyIHI9dGhpcy5fYnVpbGQodC5zbGljZSgpLDAsdC5sZW5ndGgtMSwwKTtpZih0aGlzLmRhdGEuY2hpbGRyZW4ubGVuZ3RoKWlmKHRoaXMuZGF0YS5oZWlnaHQ9PT1yLmhlaWdodCl0aGlzLl9zcGxpdFJvb3QodGhpcy5kYXRhLHIpO2Vsc2V7aWYodGhpcy5kYXRhLmhlaWdodDxyLmhlaWdodCl7dmFyIGk9dGhpcy5kYXRhO3RoaXMuZGF0YT1yLHI9aX10aGlzLl9pbnNlcnQocix0aGlzLmRhdGEuaGVpZ2h0LXIuaGVpZ2h0LTEsITApfWVsc2UgdGhpcy5kYXRhPXI7cmV0dXJuIHRoaXN9LGluc2VydDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdGhpcy5faW5zZXJ0KHQsdGhpcy5kYXRhLmhlaWdodC0xKSx0aGlzfSxjbGVhcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGE9WmUoW10pLHRoaXN9LHJlbW92ZTpmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0aGlzO2Zvcih2YXIgbixyLGksbyxzPXRoaXMuZGF0YSxhPXRoaXMudG9CQm94KHQpLHU9W10sYz1bXTtzfHx1Lmxlbmd0aDspe2lmKHN8fChzPXUucG9wKCkscj11W3UubGVuZ3RoLTFdLG49Yy5wb3AoKSxvPSEwKSxzLmxlYWYmJi0xIT09KGk9QmUodCxzLmNoaWxkcmVuLGUpKSlyZXR1cm4gcy5jaGlsZHJlbi5zcGxpY2UoaSwxKSx1LnB1c2gocyksdGhpcy5fY29uZGVuc2UodSksdGhpcztvfHxzLmxlYWZ8fCFXZShzLGEpP3I/KG4rKyxzPXIuY2hpbGRyZW5bbl0sbz0hMSk6cz1udWxsOih1LnB1c2gocyksYy5wdXNoKG4pLG49MCxyPXMscz1zLmNoaWxkcmVuWzBdKX1yZXR1cm4gdGhpc30sdG9CQm94OmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjb21wYXJlTWluWDpVZSxjb21wYXJlTWluWTpxZSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfSxmcm9tSlNPTjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kYXRhPXQsdGhpc30sX2FsbDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXTt0Oyl0LmxlYWY/ZS5wdXNoLmFwcGx5KGUsdC5jaGlsZHJlbik6bi5wdXNoLmFwcGx5KG4sdC5jaGlsZHJlbiksdD1uLnBvcCgpO3JldHVybiBlfSxfYnVpbGQ6ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbz1uLWUrMSxzPXRoaXMuX21heEVudHJpZXM7aWYobzw9cylyZXR1cm4ga2UoaT1aZSh0LnNsaWNlKGUsbisxKSksdGhpcy50b0JCb3gpLGk7cnx8KHI9TWF0aC5jZWlsKE1hdGgubG9nKG8pL01hdGgubG9nKHMpKSxzPU1hdGguY2VpbChvL01hdGgucG93KHMsci0xKSkpLChpPVplKFtdKSkubGVhZj0hMSxpLmhlaWdodD1yO3ZhciBhLHUsYyxsLGg9TWF0aC5jZWlsKG8vcyksZj1oKk1hdGguY2VpbChNYXRoLnNxcnQocykpO2ZvcihLZSh0LGUsbixmLHRoaXMuY29tcGFyZU1pblgpLGE9ZTthPD1uO2ErPWYpZm9yKEtlKHQsYSxjPU1hdGgubWluKGErZi0xLG4pLGgsdGhpcy5jb21wYXJlTWluWSksdT1hO3U8PWM7dSs9aClsPU1hdGgubWluKHUraC0xLGMpLGkuY2hpbGRyZW4ucHVzaCh0aGlzLl9idWlsZCh0LHUsbCxyLTEpKTtyZXR1cm4ga2UoaSx0aGlzLnRvQkJveCksaX0sX2Nob29zZVN1YnRyZWU6ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpLG8scyxhLHUsYyxsLGg7ci5wdXNoKGUpLCFlLmxlYWYmJnIubGVuZ3RoLTEhPT1uOyl7Zm9yKGw9aD0xLzAsaT0wLG89ZS5jaGlsZHJlbi5sZW5ndGg7aTxvO2krKyl1PVZlKHM9ZS5jaGlsZHJlbltpXSksKGM9WWUodCxzKS11KTxoPyhoPWMsbD11PGw/dTpsLGE9cyk6Yz09PWgmJnU8bCYmKGw9dSxhPXMpO2U9YXx8ZS5jaGlsZHJlblswXX1yZXR1cm4gZX0sX2luc2VydDpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy50b0JCb3gsaT1uP3Q6cih0KSxvPVtdLHM9dGhpcy5fY2hvb3NlU3VidHJlZShpLHRoaXMuZGF0YSxlLG8pO2ZvcihzLmNoaWxkcmVuLnB1c2godCksamUocyxpKTtlPj0wJiZvW2VdLmNoaWxkcmVuLmxlbmd0aD50aGlzLl9tYXhFbnRyaWVzOyl0aGlzLl9zcGxpdChvLGUpLGUtLTt0aGlzLl9hZGp1c3RQYXJlbnRCQm94ZXMoaSxvLGUpfSxfc3BsaXQ6ZnVuY3Rpb24odCxlKXt2YXIgbj10W2VdLHI9bi5jaGlsZHJlbi5sZW5ndGgsaT10aGlzLl9taW5FbnRyaWVzO3RoaXMuX2Nob29zZVNwbGl0QXhpcyhuLGkscik7dmFyIG89dGhpcy5fY2hvb3NlU3BsaXRJbmRleChuLGkscikscz1aZShuLmNoaWxkcmVuLnNwbGljZShvLG4uY2hpbGRyZW4ubGVuZ3RoLW8pKTtzLmhlaWdodD1uLmhlaWdodCxzLmxlYWY9bi5sZWFmLGtlKG4sdGhpcy50b0JCb3gpLGtlKHMsdGhpcy50b0JCb3gpLGU/dFtlLTFdLmNoaWxkcmVuLnB1c2gocyk6dGhpcy5fc3BsaXRSb290KG4scyl9LF9zcGxpdFJvb3Q6ZnVuY3Rpb24odCxlKXt0aGlzLmRhdGE9WmUoW3QsZV0pLHRoaXMuZGF0YS5oZWlnaHQ9dC5oZWlnaHQrMSx0aGlzLmRhdGEubGVhZj0hMSxrZSh0aGlzLmRhdGEsdGhpcy50b0JCb3gpfSxfY2hvb3NlU3BsaXRJbmRleDpmdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvLHMsYSx1LGMsbDtmb3IodT1jPTEvMCxyPWU7cjw9bi1lO3IrKylzPVhlKGk9emUodCwwLHIsdGhpcy50b0JCb3gpLG89emUodCxyLG4sdGhpcy50b0JCb3gpKSxhPVZlKGkpK1ZlKG8pLHM8dT8odT1zLGw9cixjPWE8Yz9hOmMpOnM9PT11JiZhPGMmJihjPWEsbD1yKTtyZXR1cm4gbH0sX2Nob29zZVNwbGl0QXhpczpmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5sZWFmP3RoaXMuY29tcGFyZU1pblg6VWUsaT10LmxlYWY/dGhpcy5jb21wYXJlTWluWTpxZTt0aGlzLl9hbGxEaXN0TWFyZ2luKHQsZSxuLHIpPHRoaXMuX2FsbERpc3RNYXJnaW4odCxlLG4saSkmJnQuY2hpbGRyZW4uc29ydChyKX0sX2FsbERpc3RNYXJnaW46ZnVuY3Rpb24odCxlLG4scil7dC5jaGlsZHJlbi5zb3J0KHIpO3ZhciBpLG8scz10aGlzLnRvQkJveCxhPXplKHQsMCxlLHMpLHU9emUodCxuLWUsbixzKSxjPUdlKGEpK0dlKHUpO2ZvcihpPWU7aTxuLWU7aSsrKW89dC5jaGlsZHJlbltpXSxqZShhLHQubGVhZj9zKG8pOm8pLGMrPUdlKGEpO2ZvcihpPW4tZS0xO2k+PWU7aS0tKW89dC5jaGlsZHJlbltpXSxqZSh1LHQubGVhZj9zKG8pOm8pLGMrPUdlKHUpO3JldHVybiBjfSxfYWRqdXN0UGFyZW50QkJveGVzOmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bjtyPj0wO3ItLSlqZShlW3JdLHQpfSxfY29uZGVuc2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dC5sZW5ndGgtMTtuPj0wO24tLSkwPT09dFtuXS5jaGlsZHJlbi5sZW5ndGg/bj4wPyhlPXRbbi0xXS5jaGlsZHJlbikuc3BsaWNlKGUuaW5kZXhPZih0W25dKSwxKTp0aGlzLmNsZWFyKCk6a2UodFtuXSx0aGlzLnRvQkJveCl9LF9pbml0Rm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPVsicmV0dXJuIGEiLCIgLSBiIiwiOyJdO3RoaXMuY29tcGFyZU1pblg9bmV3IEZ1bmN0aW9uKCJhIiwiYiIsZS5qb2luKHRbMF0pKSx0aGlzLmNvbXBhcmVNaW5ZPW5ldyBGdW5jdGlvbigiYSIsImIiLGUuam9pbih0WzFdKSksdGhpcy50b0JCb3g9bmV3IEZ1bmN0aW9uKCJhIiwicmV0dXJuIHttaW5YOiBhIit0WzBdKyIsIG1pblk6IGEiK3RbMV0rIiwgbWF4WDogYSIrdFsyXSsiLCBtYXhZOiBhIit0WzNdKyJ9OyIpfX07dmFyIFFlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10KmUsaT0kZSp0LG89aS10LHM9aS1vLGE9dC1zLHU9JGUqZSxjPXUtKHUtZSksbD1lLWMsaD1hKmwtKHItcypjLWEqYy1zKmwpO3JldHVybiBuPyhuWzBdPWgsblsxXT1yLG4pOltoLHJdfSwkZT0rKE1hdGgucG93KDIsMjcpKzEpO3ZhciB0bj1mdW5jdGlvbih0LGUpe3ZhciBuPTB8dC5sZW5ndGgscj0wfGUubGVuZ3RoO2lmKDE9PT1uJiYxPT09cilyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj10K2Uscj1uLXQsaT1uLXIsbz1lLXIscz10LWksYT1zK287cmV0dXJuIGE/W2Esbl06W25dfSh0WzBdLGVbMF0pO3ZhciBpLG8scz1uZXcgQXJyYXkobityKSxhPTAsdT0wLGM9MCxsPU1hdGguYWJzLGg9dFt1XSxmPWwoaCkscD1lW2NdLGQ9bChwKTtmPGQ/KG89aCwodSs9MSk8biYmKGg9dFt1XSxmPWwoaCkpKToobz1wLChjKz0xKTxyJiYocD1lW2NdLGQ9bChwKSkpLHU8biYmZjxkfHxjPj1yPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0sZj1sKGgpKSk6KGk9cCwoYys9MSk8ciYmKHA9ZVtjXSxkPWwocCkpKTtmb3IodmFyIGcseSxtPWkrbyx2PW0taSxfPW8tdix4PV8sdz1tO3U8biYmYzxyOylmPGQ/KGk9aCwodSs9MSk8biYmKGg9dFt1XSxmPWwoaCkpKTooaT1wLChjKz0xKTxyJiYocD1lW2NdLGQ9bChwKSkpLChfPShvPXgpLSh2PShtPWkrbyktaSkpJiYoc1thKytdPV8pLHg9dy0oKGc9dyttKS0oeT1nLXcpKSsobS15KSx3PWc7Zm9yKDt1PG47KShfPShvPXgpLSh2PShtPShpPWgpK28pLWkpKSYmKHNbYSsrXT1fKSx4PXctKChnPXcrbSktKHk9Zy13KSkrKG0teSksdz1nLCh1Kz0xKTxuJiYoaD10W3VdKTtmb3IoO2M8cjspKF89KG89eCktKHY9KG09KGk9cCkrbyktaSkpJiYoc1thKytdPV8pLHg9dy0oKGc9dyttKS0oeT1nLXcpKSsobS15KSx3PWcsKGMrPTEpPHImJihwPWVbY10pO3JldHVybiB4JiYoc1thKytdPXgpLHcmJihzW2ErK109dyksYXx8KHNbYSsrXT0wKSxzLmxlbmd0aD1hLHN9O3ZhciBlbj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dCtlLGk9ci10LG89ZS1pLHM9dC0oci1pKTtyZXR1cm4gbj8oblswXT1zK28sblsxXT1yLG4pOltzK28scl19O3ZhciBubj1mdW5jdGlvbih0LGUpe3ZhciBuPXQubGVuZ3RoO2lmKDE9PT1uKXt2YXIgcj1RZSh0WzBdLGUpO3JldHVybiByWzBdP3I6W3JbMV1dfXZhciBpPW5ldyBBcnJheSgyKm4pLG89Wy4xLC4xXSxzPVsuMSwuMV0sYT0wO1FlKHRbMF0sZSxvKSxvWzBdJiYoaVthKytdPW9bMF0pO2Zvcih2YXIgdT0xO3U8bjsrK3Upe1FlKHRbdV0sZSxzKTt2YXIgYz1vWzFdO2VuKGMsc1swXSxvKSxvWzBdJiYoaVthKytdPW9bMF0pO3ZhciBsPXNbMV0saD1vWzFdLGY9bCtoLHA9aC0oZi1sKTtvWzFdPWYscCYmKGlbYSsrXT1wKX1yZXR1cm4gb1sxXSYmKGlbYSsrXT1vWzFdKSwwPT09YSYmKGlbYSsrXT0wKSxpLmxlbmd0aD1hLGl9O3ZhciBybj1mdW5jdGlvbih0LGUpe3ZhciBuPTB8dC5sZW5ndGgscj0wfGUubGVuZ3RoO2lmKDE9PT1uJiYxPT09cilyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj10K2Uscj1uLXQsaT1uLXIsbz1lLXIscz10LWksYT1zK287cmV0dXJuIGE/W2Esbl06W25dfSh0WzBdLC1lWzBdKTt2YXIgaSxvLHM9bmV3IEFycmF5KG4rciksYT0wLHU9MCxjPTAsbD1NYXRoLmFicyxoPXRbdV0sZj1sKGgpLHA9LWVbY10sZD1sKHApO2Y8ZD8obz1oLCh1Kz0xKTxuJiYoaD10W3VdLGY9bChoKSkpOihvPXAsKGMrPTEpPHImJihwPS1lW2NdLGQ9bChwKSkpLHU8biYmZjxkfHxjPj1yPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0sZj1sKGgpKSk6KGk9cCwoYys9MSk8ciYmKHA9LWVbY10sZD1sKHApKSk7Zm9yKHZhciBnLHksbT1pK28sdj1tLWksXz1vLXYseD1fLHc9bTt1PG4mJmM8cjspZjxkPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0sZj1sKGgpKSk6KGk9cCwoYys9MSk8ciYmKHA9LWVbY10sZD1sKHApKSksKF89KG89eCktKHY9KG09aStvKS1pKSkmJihzW2ErK109XykseD13LSgoZz13K20pLSh5PWctdykpKyhtLXkpLHc9Zztmb3IoO3U8bjspKF89KG89eCktKHY9KG09KGk9aCkrbyktaSkpJiYoc1thKytdPV8pLHg9dy0oKGc9dyttKS0oeT1nLXcpKSsobS15KSx3PWcsKHUrPTEpPG4mJihoPXRbdV0pO2Zvcig7YzxyOykoXz0obz14KS0odj0obT0oaT1wKStvKS1pKSkmJihzW2ErK109XykseD13LSgoZz13K20pLSh5PWctdykpKyhtLXkpLHc9ZywoYys9MSk8ciYmKHA9LWVbY10pO3JldHVybiB4JiYoc1thKytdPXgpLHcmJihzW2ErK109dyksYXx8KHNbYSsrXT0wKSxzLmxlbmd0aD1hLHN9O3ZhciBvbj1KZSgoZnVuY3Rpb24odCl7dmFyIGU9MTExMDIyMzAyNDYyNTE1NjVlLTMyLG49KDMrMTYqZSkqZSxyPSg3KzU2KmUpKmU7ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgbj1uZXcgQXJyYXkodC5sZW5ndGgtMSkscj0xO3I8dC5sZW5ndGg7KytyKWZvcih2YXIgaT1uW3ItMV09bmV3IEFycmF5KHQubGVuZ3RoLTEpLG89MCxzPTA7bzx0Lmxlbmd0aDsrK28pbyE9PWUmJihpW3MrK109dFtyXVtvXSk7cmV0dXJuIG59ZnVuY3Rpb24gbyh0KXtyZXR1cm4gMSZ0PyItIjoiIn1mdW5jdGlvbiBzKHQpe2lmKDE9PT10Lmxlbmd0aClyZXR1cm4gdFswXTtpZigyPT09dC5sZW5ndGgpcmV0dXJuWyJzdW0oIix0WzBdLCIsIix0WzFdLCIpIl0uam9pbigiIik7dmFyIGU9dC5sZW5ndGg+PjE7cmV0dXJuWyJzdW0oIixzKHQuc2xpY2UoMCxlKSksIiwiLHModC5zbGljZShlKSksIikiXS5qb2luKCIiKX1mdW5jdGlvbiBhKHQpe2lmKDI9PT10Lmxlbmd0aClyZXR1cm5bWyJzdW0ocHJvZCgiLHRbMF1bMF0sIiwiLHRbMV1bMV0sIikscHJvZCgtIix0WzBdWzFdLCIsIix0WzFdWzBdLCIpKSJdLmpvaW4oIiIpXTtmb3IodmFyIGU9W10sbj0wO248dC5sZW5ndGg7KytuKWUucHVzaChbInNjYWxlKCIscyhhKGkodCxuKSkpLCIsIixvKG4pLHRbMF1bbl0sIikiXS5qb2luKCIiKSk7cmV0dXJuIGV9ZnVuY3Rpb24gdSh0KXtmb3IodmFyIGU9W10sbj1bXSxyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCksbj0wO248dDsrK24pe2Vbbl09bmV3IEFycmF5KHQpO2Zvcih2YXIgcj0wO3I8dDsrK3IpZVtuXVtyXT1bIm0iLHIsIlsiLHQtbi0xLCJdIl0uam9pbigiIil9cmV0dXJuIGV9KHQpLG89W10sdT0wO3U8dDsrK3UpMSZ1P24ucHVzaC5hcHBseShuLGEoaShyLHUpKSk6ZS5wdXNoLmFwcGx5KGUsYShpKHIsdSkpKSxvLnB1c2goIm0iK3UpO3ZhciBjPXMoZSksbD1zKG4pLGg9Im9yaWVudGF0aW9uIit0KyJFeGFjdCIsZj1bImZ1bmN0aW9uICIsaCwiKCIsby5qb2luKCksIil7dmFyIHA9IixjLCIsbj0iLGwsIixkPXN1YihwLG4pO3JldHVybiBkW2QubGVuZ3RoLTFdO307cmV0dXJuICIsaF0uam9pbigiIik7cmV0dXJuIG5ldyBGdW5jdGlvbigic3VtIiwicHJvZCIsInNjYWxlIiwic3ViIixmKSh0bixRZSxubixybil9dmFyIGM9dSgzKSxsPXUoNCksaD1bZnVuY3Rpb24oKXtyZXR1cm4gMH0sZnVuY3Rpb24oKXtyZXR1cm4gMH0sZnVuY3Rpb24odCxlKXtyZXR1cm4gZVswXS10WzBdfSxmdW5jdGlvbih0LGUscil7dmFyIGksbz0odFsxXS1yWzFdKSooZVswXS1yWzBdKSxzPSh0WzBdLXJbMF0pKihlWzFdLXJbMV0pLGE9by1zO2lmKG8+MCl7aWYoczw9MClyZXR1cm4gYTtpPW8rc31lbHNle2lmKCEobzwwKSlyZXR1cm4gYTtpZihzPj0wKXJldHVybiBhO2k9LShvK3MpfXZhciB1PW4qaTtyZXR1cm4gYT49dXx8YTw9LXU/YTpjKHQsZSxyKX0sZnVuY3Rpb24odCxlLG4saSl7dmFyIG89dFswXS1pWzBdLHM9ZVswXS1pWzBdLGE9blswXS1pWzBdLHU9dFsxXS1pWzFdLGM9ZVsxXS1pWzFdLGg9blsxXS1pWzFdLGY9dFsyXS1pWzJdLHA9ZVsyXS1pWzJdLGQ9blsyXS1pWzJdLGc9cypoLHk9YSpjLG09YSp1LHY9bypoLF89bypjLHg9cyp1LHc9ZiooZy15KStwKihtLXYpK2QqKF8teCksYj0oTWF0aC5hYnMoZykrTWF0aC5hYnMoeSkpKk1hdGguYWJzKGYpKyhNYXRoLmFicyhtKStNYXRoLmFicyh2KSkqTWF0aC5hYnMocCkrKE1hdGguYWJzKF8pK01hdGguYWJzKHgpKSpNYXRoLmFicyhkKSxEPXIqYjtyZXR1cm4gdz5EfHwtdz5EP3c6bCh0LGUsbixpKX1dO2Z1bmN0aW9uIGYodCl7dmFyIGU9aFt0Lmxlbmd0aF07cmV0dXJuIGV8fChlPWhbdC5sZW5ndGhdPXUodC5sZW5ndGgpKSxlLmFwcGx5KHZvaWQgMCx0KX0hZnVuY3Rpb24oKXtmb3IoO2gubGVuZ3RoPD01OyloLnB1c2godShoLmxlbmd0aCkpO2Zvcih2YXIgZT1bXSxuPVsic2xvdyJdLHI9MDtyPD01OysrcillLnB1c2goImEiK3IpLG4ucHVzaCgibyIrcik7dmFyIGk9WyJmdW5jdGlvbiBnZXRPcmllbnRhdGlvbigiLGUuam9pbigpLCIpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6Y2FzZSAxOnJldHVybiAwOyJdO2ZvcihyPTI7cjw9NTsrK3IpaS5wdXNoKCJjYXNlICIsciwiOnJldHVybiBvIixyLCIoIixlLnNsaWNlKDAscikuam9pbigpLCIpOyIpO2kucHVzaCgifXZhciBzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7KytpKXtzW2ldPWFyZ3VtZW50c1tpXX07cmV0dXJuIHNsb3cocyk7fXJldHVybiBnZXRPcmllbnRhdGlvbiIpLG4ucHVzaChpLmpvaW4oIiIpKTt2YXIgbz1GdW5jdGlvbi5hcHBseSh2b2lkIDAsbik7Zm9yKHQuZXhwb3J0cz1vLmFwcGx5KHZvaWQgMCxbZl0uY29uY2F0KGgpKSxyPTA7cjw9NTsrK3IpdC5leHBvcnRzW3JdPWhbcl19KCl9KSksc249ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTwzKXtmb3IodmFyIG49bmV3IEFycmF5KGUpLHI9MDtyPGU7KytyKW5bcl09cjtyZXR1cm4gMj09PWUmJnRbMF1bMF09PT10WzFdWzBdJiZ0WzBdWzFdPT09dFsxXVsxXT9bMF06bn12YXIgaT1uZXcgQXJyYXkoZSk7Zm9yKHI9MDtyPGU7KytyKWlbcl09cjtpLnNvcnQoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHRbZV1bMF0tdFtuXVswXXx8dFtlXVsxXS10W25dWzFdfSkpO3ZhciBvPVtpWzBdLGlbMV1dLHM9W2lbMF0saVsxXV07Zm9yKHI9MjtyPGU7KytyKXtmb3IodmFyIGE9aVtyXSx1PXRbYV0sYz1vLmxlbmd0aDtjPjEmJmFuKHRbb1tjLTJdXSx0W29bYy0xXV0sdSk8PTA7KWMtPTEsby5wb3AoKTtmb3Ioby5wdXNoKGEpLGM9cy5sZW5ndGg7Yz4xJiZhbih0W3NbYy0yXV0sdFtzW2MtMV1dLHUpPj0wOyljLT0xLHMucG9wKCk7cy5wdXNoKGEpfW49bmV3IEFycmF5KHMubGVuZ3RoK28ubGVuZ3RoLTIpO2Zvcih2YXIgbD0wLGg9KHI9MCxvLmxlbmd0aCk7cjxoOysrciluW2wrK109b1tyXTtmb3IodmFyIGY9cy5sZW5ndGgtMjtmPjA7LS1mKW5bbCsrXT1zW2ZdO3JldHVybiBufSxhbj1vblszXTt2YXIgdW49bG4sY249bG47ZnVuY3Rpb24gbG4odCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBsbikpcmV0dXJuIG5ldyBsbih0LGUpO2lmKHRoaXMuZGF0YT10fHxbXSx0aGlzLmxlbmd0aD10aGlzLmRhdGEubGVuZ3RoLHRoaXMuY29tcGFyZT1lfHxobix0aGlzLmxlbmd0aD4wKWZvcih2YXIgbj0odGhpcy5sZW5ndGg+PjEpLTE7bj49MDtuLS0pdGhpcy5fZG93bihuKX1mdW5jdGlvbiBobih0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6MH1sbi5wcm90b3R5cGU9e3B1c2g6ZnVuY3Rpb24odCl7dGhpcy5kYXRhLnB1c2godCksdGhpcy5sZW5ndGgrKyx0aGlzLl91cCh0aGlzLmxlbmd0aC0xKX0scG9wOmZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmRhdGFbMF07cmV0dXJuIHRoaXMubGVuZ3RoLS0sdGhpcy5sZW5ndGg+MCYmKHRoaXMuZGF0YVswXT10aGlzLmRhdGFbdGhpcy5sZW5ndGhdLHRoaXMuX2Rvd24oMCkpLHRoaXMuZGF0YS5wb3AoKSx0fX0scGVlazpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGFbMF19LF91cDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5kYXRhLG49dGhpcy5jb21wYXJlLHI9ZVt0XTt0PjA7KXt2YXIgaT10LTE+PjEsbz1lW2ldO2lmKG4ocixvKT49MClicmVhaztlW3RdPW8sdD1pfWVbdF09cn0sX2Rvd246ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZGF0YSxuPXRoaXMuY29tcGFyZSxyPXRoaXMubGVuZ3RoPj4xLGk9ZVt0XTt0PHI7KXt2YXIgbz0xKyh0PDwxKSxzPW8rMSxhPWVbb107aWYoczx0aGlzLmxlbmd0aCYmbihlW3NdLGEpPDAmJihvPXMsYT1lW3NdKSxuKGEsaSk+PTApYnJlYWs7ZVt0XT1hLHQ9b31lW3RdPWl9fSx1bi5kZWZhdWx0PWNuO3ZhciBmbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10WzBdLHI9dFsxXSxpPSExLG89MCxzPWUubGVuZ3RoLTE7bzxlLmxlbmd0aDtzPW8rKyl7dmFyIGE9ZVtvXVswXSx1PWVbb11bMV0sYz1lW3NdWzBdLGw9ZVtzXVsxXTt1PnIhPWw+ciYmbjwoYy1hKSooci11KS8obC11KSthJiYoaT0haSl9cmV0dXJuIGl9LHBuPW9uWzNdLGRuPWduO2Z1bmN0aW9uIGduKHQsZSxuKXtlPU1hdGgubWF4KDAsdm9pZCAwPT09ZT8yOmUpLG49bnx8MDtmb3IodmFyIHIsaT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXSxuPXRbMF0scj10WzBdLGk9dFswXSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBzPXRbb107c1swXTxlWzBdJiYoZT1zKSxzWzBdPnJbMF0mJihyPXMpLHNbMV08blsxXSYmKG49cyksc1sxXT5pWzFdJiYoaT1zKX12YXIgYT1bZSxuLHIsaV0sdT1hLnNsaWNlKCk7Zm9yKG89MDtvPHQubGVuZ3RoO28rKylmbih0W29dLGEpfHx1LnB1c2godFtvXSk7dmFyIGM9c24odSksbD1bXTtmb3Iobz0wO288Yy5sZW5ndGg7bysrKWwucHVzaCh1W2Nbb11dKTtyZXR1cm4gbH0odCksbz1QZSgxNixbIlswXSIsIlsxXSIsIlswXSIsIlsxXSJdKS5sb2FkKHQpLHM9W10sYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgdT1pW2FdO28ucmVtb3ZlKHUpLHI9RG4odSxyKSxzLnB1c2gocil9dmFyIGM9UGUoMTYpO2ZvcihhPTA7YTxzLmxlbmd0aDthKyspYy5pbnNlcnQoYm4oc1thXSkpO2Zvcih2YXIgbD1lKmUsaD1uKm47cy5sZW5ndGg7KXt2YXIgZj1zLnNoaWZ0KCkscD1mLnAsZD1mLm5leHQucCxnPUVuKHAsZCk7aWYoIShnPGgpKXt2YXIgeT1nL2w7KHU9eW4obyxmLnByZXYucCxwLGQsZi5uZXh0Lm5leHQucCx5LGMpKSYmTWF0aC5taW4oRW4odSxwKSxFbih1LGQpKTw9eSYmKHMucHVzaChmKSxzLnB1c2goRG4odSxmKSksby5yZW1vdmUodSksYy5yZW1vdmUoZiksYy5pbnNlcnQoYm4oZikpLGMuaW5zZXJ0KGJuKGYubmV4dCkpKX19Zj1yO3ZhciBtPVtdO2Rve20ucHVzaChmLnApLGY9Zi5uZXh0fXdoaWxlKGYhPT1yKTtyZXR1cm4gbS5wdXNoKGYucCksbX1mdW5jdGlvbiB5bih0LGUsbixyLGksbyxzKXtmb3IodmFyIGE9bmV3IHVuKG51bGwsbW4pLHU9dC5kYXRhO3U7KXtmb3IodmFyIGM9MDtjPHUuY2hpbGRyZW4ubGVuZ3RoO2MrKyl7dmFyIGw9dS5jaGlsZHJlbltjXSxoPXUubGVhZj9DbihsLG4scik6dm4obixyLGwpO2g+b3x8YS5wdXNoKHtub2RlOmwsZGlzdDpofSl9Zm9yKDthLmxlbmd0aCYmIWEucGVlaygpLm5vZGUuY2hpbGRyZW47KXt2YXIgZj1hLnBvcCgpLHA9Zi5ub2RlLGQ9Q24ocCxlLG4pLGc9Q24ocCxyLGkpO2lmKGYuZGlzdDxkJiZmLmRpc3Q8ZyYmeG4obixwLHMpJiZ4bihyLHAscykpcmV0dXJuIHB9KHU9YS5wb3AoKSkmJih1PXUubm9kZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gbW4odCxlKXtyZXR1cm4gdC5kaXN0LWUuZGlzdH1mdW5jdGlvbiB2bih0LGUsbil7aWYoX24odCxuKXx8X24oZSxuKSlyZXR1cm4gMDt2YXIgcj1Tbih0WzBdLHRbMV0sZVswXSxlWzFdLG4ubWluWCxuLm1pblksbi5tYXhYLG4ubWluWSk7aWYoMD09PXIpcmV0dXJuIDA7dmFyIGk9U24odFswXSx0WzFdLGVbMF0sZVsxXSxuLm1pblgsbi5taW5ZLG4ubWluWCxuLm1heFkpO2lmKDA9PT1pKXJldHVybiAwO3ZhciBvPVNuKHRbMF0sdFsxXSxlWzBdLGVbMV0sbi5tYXhYLG4ubWluWSxuLm1heFgsbi5tYXhZKTtpZigwPT09bylyZXR1cm4gMDt2YXIgcz1Tbih0WzBdLHRbMV0sZVswXSxlWzFdLG4ubWluWCxuLm1heFksbi5tYXhYLG4ubWF4WSk7cmV0dXJuIDA9PT1zPzA6TWF0aC5taW4ocixpLG8scyl9ZnVuY3Rpb24gX24odCxlKXtyZXR1cm4gdFswXT49ZS5taW5YJiZ0WzBdPD1lLm1heFgmJnRbMV0+PWUubWluWSYmdFsxXTw9ZS5tYXhZfWZ1bmN0aW9uIHhuKHQsZSxuKXtmb3IodmFyIHI9TWF0aC5taW4odFswXSxlWzBdKSxpPU1hdGgubWluKHRbMV0sZVsxXSksbz1NYXRoLm1heCh0WzBdLGVbMF0pLHM9TWF0aC5tYXgodFsxXSxlWzFdKSxhPW4uc2VhcmNoKHttaW5YOnIsbWluWTppLG1heFg6byxtYXhZOnN9KSx1PTA7dTxhLmxlbmd0aDt1KyspaWYod24oYVt1XS5wLGFbdV0ubmV4dC5wLHQsZSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gd24odCxlLG4scil7cmV0dXJuIHQhPT1yJiZlIT09biYmcG4odCxlLG4pPjAhPXBuKHQsZSxyKT4wJiZwbihuLHIsdCk+MCE9cG4obixyLGUpPjB9ZnVuY3Rpb24gYm4odCl7dmFyIGU9dC5wLG49dC5uZXh0LnA7cmV0dXJuIHQubWluWD1NYXRoLm1pbihlWzBdLG5bMF0pLHQubWluWT1NYXRoLm1pbihlWzFdLG5bMV0pLHQubWF4WD1NYXRoLm1heChlWzBdLG5bMF0pLHQubWF4WT1NYXRoLm1heChlWzFdLG5bMV0pLHR9ZnVuY3Rpb24gRG4odCxlKXt2YXIgbj17cDp0LHByZXY6bnVsbCxuZXh0Om51bGwsbWluWDowLG1pblk6MCxtYXhYOjAsbWF4WTowfTtyZXR1cm4gZT8obi5uZXh0PWUubmV4dCxuLnByZXY9ZSxlLm5leHQucHJldj1uLGUubmV4dD1uKToobi5wcmV2PW4sbi5uZXh0PW4pLG59ZnVuY3Rpb24gRW4odCxlKXt2YXIgbj10WzBdLWVbMF0scj10WzFdLWVbMV07cmV0dXJuIG4qbityKnJ9ZnVuY3Rpb24gQ24odCxlLG4pe3ZhciByPWVbMF0saT1lWzFdLG89blswXS1yLHM9blsxXS1pO2lmKDAhPT1vfHwwIT09cyl7dmFyIGE9KCh0WzBdLXIpKm8rKHRbMV0taSkqcykvKG8qbytzKnMpO2E+MT8ocj1uWzBdLGk9blsxXSk6YT4wJiYocis9byphLGkrPXMqYSl9cmV0dXJuKG89dFswXS1yKSpvKyhzPXRbMV0taSkqc31mdW5jdGlvbiBTbih0LGUsbixyLGksbyxzLGEpe3ZhciB1LGMsbCxoLGY9bi10LHA9ci1lLGQ9cy1pLGc9YS1vLHk9dC1pLG09ZS1vLHY9ZipmK3AqcCxfPWYqZCtwKmcseD1kKmQrZypnLHc9Zip5K3AqbSxiPWQqeStnKm0sRD12KngtXypfLEU9RCxDPUQ7MD09PUQ/KGM9MCxFPTEsaD1iLEM9eCk6KGg9dipiLV8qdywoYz1fKmIteCp3KTwwPyhjPTAsaD1iLEM9eCk6Yz5FJiYoYz1FLGg9YitfLEM9eCkpLGg8MD8oaD0wLC13PDA/Yz0wOi13PnY/Yz1FOihjPS13LEU9dikpOmg+QyYmKGg9QywtdytfPDA/Yz0wOi13K18+dj9jPUU6KGM9LXcrXyxFPXYpKTt2YXIgUz0oMS0obD0wPT09aD8wOmgvQykpKmkrbCpzLSgoMS0odT0wPT09Yz8wOmMvRSkpKnQrdSpuKSxBPSgxLWwpKm8rbCphLSgoMS11KSplK3Uqcik7cmV0dXJuIFMqUytBKkF9ZnVuY3Rpb24gQW4odCxlLG4pe2lmKCJvYmplY3QiIT10eXBlb2Yobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLmlnbm9yZUJvdW5kYXJ5O2lmKCF0KXRocm93IG5ldyBFcnJvcigicG9pbnQgaXMgcmVxdWlyZWQiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoInBvbHlnb24gaXMgcmVxdWlyZWQiKTt2YXIgaT1JZSh0KSxvPU1lKGUpLHM9ZS5nZW9tZXRyeT9lLmdlb21ldHJ5LnR5cGU6ZS50eXBlLGE9ZS5iYm94O2lmKGEmJiExPT09ZnVuY3Rpb24odCxlKXtyZXR1cm4gZVswXTw9dFswXSYmZVsxXTw9dFsxXSYmZVsyXT49dFswXSYmZVszXT49dFsxXX0oaSxhKSlyZXR1cm4hMTsiUG9seWdvbiI9PT1zJiYobz1bb10pO2Zvcih2YXIgdT0wLGM9ITE7dTxvLmxlbmd0aCYmIWM7dSsrKWlmKE5uKGksb1t1XVswXSxyKSl7Zm9yKHZhciBsPSExLGg9MTtoPG9bdV0ubGVuZ3RoJiYhbDspTm4oaSxvW3VdW2hdLCFyKSYmKGw9ITApLGgrKztsfHwoYz0hMCl9cmV0dXJuIGN9ZnVuY3Rpb24gTm4odCxlLG4pe3ZhciByPSExO2VbMF1bMF09PT1lW2UubGVuZ3RoLTFdWzBdJiZlWzBdWzFdPT09ZVtlLmxlbmd0aC0xXVsxXSYmKGU9ZS5zbGljZSgwLGUubGVuZ3RoLTEpKTtmb3IodmFyIGk9MCxvPWUubGVuZ3RoLTE7aTxlLmxlbmd0aDtvPWkrKyl7dmFyIHM9ZVtpXVswXSxhPWVbaV1bMV0sdT1lW29dWzBdLGM9ZVtvXVsxXTtpZih0WzFdKihzLXUpK2EqKHUtdFswXSkrYyoodFswXS1zKT09MCYmKHMtdFswXSkqKHUtdFswXSk8PTAmJihhLXRbMV0pKihjLXRbMV0pPD0wKXJldHVybiFuO2E+dFsxXSE9Yz50WzFdJiZ0WzBdPCh1LXMpKih0WzFdLWEpLyhjLWEpK3MmJihyPSFyKX1yZXR1cm4gcn1mdW5jdGlvbiBJbih0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtzd2l0Y2godC50eXBlKXtjYXNlIkZlYXR1cmUiOnJldHVybiBNbih0KTtjYXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIn07cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3N3aXRjaChuKXtjYXNlInR5cGUiOmNhc2UiZmVhdHVyZXMiOnJldHVybjtkZWZhdWx0OmVbbl09dFtuXX19KSksZS5mZWF0dXJlcz10LmZlYXR1cmVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIE1uKHQpfSkpLGV9KHQpO2Nhc2UiUG9pbnQiOmNhc2UiTGluZVN0cmluZyI6Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpUG9pbnQiOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpjYXNlIk11bHRpUG9seWdvbiI6Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOnJldHVybiBUbih0KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidW5rbm93biBHZW9KU09OIHR5cGUiKX19ZnVuY3Rpb24gTW4odCl7dmFyIGU9e3R5cGU6IkZlYXR1cmUifTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24obil7c3dpdGNoKG4pe2Nhc2UidHlwZSI6Y2FzZSJwcm9wZXJ0aWVzIjpjYXNlImdlb21ldHJ5IjpyZXR1cm47ZGVmYXVsdDplW25dPXRbbl19fSkpLGUucHJvcGVydGllcz1Gbih0LnByb3BlcnRpZXMpLGUuZ2VvbWV0cnk9VG4odC5nZW9tZXRyeSksZX1mdW5jdGlvbiBGbih0KXt2YXIgZT17fTtyZXR1cm4gdCYmT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIHI9dFtuXTsib2JqZWN0Ij09dHlwZW9mIHI/bnVsbD09PXI/ZVtuXT1udWxsOnIubGVuZ3RoP2Vbbl09ci5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpOmVbbl09Rm4ocik6ZVtuXT1yfSkpLGV9ZnVuY3Rpb24gVG4odCl7dmFyIGU9e3R5cGU6dC50eXBlfTtyZXR1cm4gdC5iYm94JiYoZS5iYm94PXQuYmJveCksIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT10LnR5cGU/KGUuZ2VvbWV0cmllcz10Lmdlb21ldHJpZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gVG4odCl9KSksZSk6KGUuY29vcmRpbmF0ZXM9T24odC5jb29yZGluYXRlcyksZSl9ZnVuY3Rpb24gT24odCl7cmV0dXJuIm9iamVjdCIhPXR5cGVvZiB0WzBdP3Quc2xpY2UoKTp0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIE9uKHQpfSkpfWZ1bmN0aW9uIExuKHQpe3JldHVybiBmdW5jdGlvbih0KXtfZSh0KTt2YXIgZT1OdW1iZXIodFswXSksbj1OdW1iZXIodFsxXSkscj1OdW1iZXIodFsyXSksaT1OdW1iZXIodFszXSk7aWYoNj09PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQHR1cmYvYmJveC1wb2x5Z29uIGRvZXMgbm90IHN1cHBvcnQgQkJveCB3aXRoIDYgcG9zaXRpb25zIik7dmFyIG89W2Usbl07cmV0dXJuIHVlKFtbbyxbcixuXSxbcixpXSxbZSxpXSxvXV0pfShmdW5jdGlvbih0KXt2YXIgZT1bMS8wLDEvMCwtMS8wLC0xLzBdO3JldHVybiB3ZSh0LChmdW5jdGlvbih0KXtlWzBdPnRbMF0mJihlWzBdPXRbMF0pLGVbMV0+dFsxXSYmKGVbMV09dFsxXSksZVsyXTx0WzBdJiYoZVsyXT10WzBdKSxlWzNdPHRbMV0mJihlWzNdPXRbMV0pfSkpLGV9KHQpKX1nbi5kZWZhdWx0PWRuO3ZhciBQbj1CbixSbj1CbjtmdW5jdGlvbiBCbih0LGUsbil7bj1ufHwyO3ZhciByLGksbyxzLGEsdSxjLGw9ZSYmZS5sZW5ndGgsaD1sP2VbMF0qbjp0Lmxlbmd0aCxmPWtuKHQsMCxoLG4sITApLHA9W107aWYoIWYpcmV0dXJuIHA7aWYobCYmKGY9ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxzLGEsdSxjPVtdO2ZvcihpPTAsbz1lLmxlbmd0aDtpPG87aSsrKXM9ZVtpXSpyLGE9aTxvLTE/ZVtpKzFdKnI6dC5sZW5ndGgsKHU9a24odCxzLGEsciwhMSkpPT09dS5uZXh0JiYodS5zdGVpbmVyPSEwKSxjLnB1c2goSG4odSkpO2ZvcihjLnNvcnQoWW4pLGk9MDtpPGMubGVuZ3RoO2krKylYbihjW2ldLG4pLG49em4obixuLm5leHQpO3JldHVybiBufSh0LGUsZixuKSksdC5sZW5ndGg+ODAqbil7cj1vPXRbMF0saT1zPXRbMV07Zm9yKHZhciBkPW47ZDxoO2QrPW4pKGE9dFtkXSk8ciYmKHI9YSksKHU9dFtkKzFdKTxpJiYoaT11KSxhPm8mJihvPWEpLHU+cyYmKHM9dSk7Yz0wIT09KGM9TWF0aC5tYXgoby1yLHMtaSkpPzEvYzowfXJldHVybiBqbihmLHAsbixyLGksYykscH1mdW5jdGlvbiBrbih0LGUsbixyLGkpe3ZhciBvLHM7aWYoaT09PW9yKHQsZSxuLHIpPjApZm9yKG89ZTtvPG47bys9cilzPW5yKG8sdFtvXSx0W28rMV0scyk7ZWxzZSBmb3Iobz1uLXI7bz49ZTtvLT1yKXM9bnIobyx0W29dLHRbbysxXSxzKTtyZXR1cm4gcyYmUW4ocyxzLm5leHQpJiYocnIocykscz1zLm5leHQpLHN9ZnVuY3Rpb24gem4odCxlKXtpZighdClyZXR1cm4gdDtlfHwoZT10KTt2YXIgbixyPXQ7ZG97aWYobj0hMSxyLnN0ZWluZXJ8fCFRbihyLHIubmV4dCkmJjAhPT1KbihyLnByZXYscixyLm5leHQpKXI9ci5uZXh0O2Vsc2V7aWYocnIociksKHI9ZT1yLnByZXYpPT09ci5uZXh0KWJyZWFrO249ITB9fXdoaWxlKG58fHIhPT1lKTtyZXR1cm4gZX1mdW5jdGlvbiBqbih0LGUsbixyLGksbyxzKXtpZih0KXshcyYmbyYmZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dDtkb3tudWxsPT09aS56JiYoaS56PVduKGkueCxpLnksZSxuLHIpKSxpLnByZXZaPWkucHJldixpLm5leHRaPWkubmV4dCxpPWkubmV4dH13aGlsZShpIT09dCk7aS5wcmV2Wi5uZXh0Wj1udWxsLGkucHJldlo9bnVsbCxmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYSx1LGM9MTtkb3tmb3Iobj10LHQ9bnVsbCxvPW51bGwscz0wO247KXtmb3IocysrLHI9bixhPTAsZT0wO2U8YyYmKGErKyxyPXIubmV4dFopO2UrKyk7Zm9yKHU9YzthPjB8fHU+MCYmcjspMCE9PWEmJigwPT09dXx8IXJ8fG4uejw9ci56KT8oaT1uLG49bi5uZXh0WixhLS0pOihpPXIscj1yLm5leHRaLHUtLSksbz9vLm5leHRaPWk6dD1pLGkucHJldlo9byxvPWk7bj1yfW8ubmV4dFo9bnVsbCxjKj0yfXdoaWxlKHM+MSl9KGkpfSh0LHIsaSxvKTtmb3IodmFyIGEsdSxjPXQ7dC5wcmV2IT09dC5uZXh0OylpZihhPXQucHJldix1PXQubmV4dCxvP3FuKHQscixpLG8pOlVuKHQpKWUucHVzaChhLmkvbiksZS5wdXNoKHQuaS9uKSxlLnB1c2godS5pL24pLHJyKHQpLHQ9dS5uZXh0LGM9dS5uZXh0O2Vsc2UgaWYoKHQ9dSk9PT1jKXtzPzE9PT1zP2puKHQ9Vm4odCxlLG4pLGUsbixyLGksbywyKToyPT09cyYmR24odCxlLG4scixpLG8pOmpuKHpuKHQpLGUsbixyLGksbywxKTticmVha319fWZ1bmN0aW9uIFVuKHQpe3ZhciBlPXQucHJldixuPXQscj10Lm5leHQ7aWYoSm4oZSxuLHIpPj0wKXJldHVybiExO2Zvcih2YXIgaT10Lm5leHQubmV4dDtpIT09dC5wcmV2Oyl7aWYoWm4oZS54LGUueSxuLngsbi55LHIueCxyLnksaS54LGkueSkmJkpuKGkucHJldixpLGkubmV4dCk+PTApcmV0dXJuITE7aT1pLm5leHR9cmV0dXJuITB9ZnVuY3Rpb24gcW4odCxlLG4scil7dmFyIGk9dC5wcmV2LG89dCxzPXQubmV4dDtpZihKbihpLG8scyk+PTApcmV0dXJuITE7Zm9yKHZhciBhPWkueDxvLng/aS54PHMueD9pLng6cy54Om8ueDxzLng/by54OnMueCx1PWkueTxvLnk/aS55PHMueT9pLnk6cy55Om8ueTxzLnk/by55OnMueSxjPWkueD5vLng/aS54PnMueD9pLng6cy54Om8ueD5zLng/by54OnMueCxsPWkueT5vLnk/aS55PnMueT9pLnk6cy55Om8ueT5zLnk/by55OnMueSxoPVduKGEsdSxlLG4sciksZj1XbihjLGwsZSxuLHIpLHA9dC5uZXh0WjtwJiZwLno8PWY7KXtpZihwIT09dC5wcmV2JiZwIT09dC5uZXh0JiZabihpLngsaS55LG8ueCxvLnkscy54LHMueSxwLngscC55KSYmSm4ocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAubmV4dFp9Zm9yKHA9dC5wcmV2WjtwJiZwLno+PWg7KXtpZihwIT09dC5wcmV2JiZwIT09dC5uZXh0JiZabihpLngsaS55LG8ueCxvLnkscy54LHMueSxwLngscC55KSYmSm4ocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAucHJldlp9cmV0dXJuITB9ZnVuY3Rpb24gVm4odCxlLG4pe3ZhciByPXQ7ZG97dmFyIGk9ci5wcmV2LG89ci5uZXh0Lm5leHQ7IVFuKGksbykmJiRuKGkscixyLm5leHQsbykmJnRyKGksbykmJnRyKG8saSkmJihlLnB1c2goaS5pL24pLGUucHVzaChyLmkvbiksZS5wdXNoKG8uaS9uKSxycihyKSxycihyLm5leHQpLHI9dD1vKSxyPXIubmV4dH13aGlsZShyIT09dCk7cmV0dXJuIHJ9ZnVuY3Rpb24gR24odCxlLG4scixpLG8pe3ZhciBzPXQ7ZG97Zm9yKHZhciBhPXMubmV4dC5uZXh0O2EhPT1zLnByZXY7KXtpZihzLmkhPT1hLmkmJktuKHMsYSkpe3ZhciB1PWVyKHMsYSk7cmV0dXJuIHM9em4ocyxzLm5leHQpLHU9em4odSx1Lm5leHQpLGpuKHMsZSxuLHIsaSxvKSx2b2lkIGpuKHUsZSxuLHIsaSxvKX1hPWEubmV4dH1zPXMubmV4dH13aGlsZShzIT09dCl9ZnVuY3Rpb24gWW4odCxlKXtyZXR1cm4gdC54LWUueH1mdW5jdGlvbiBYbih0LGUpe2lmKGU9ZnVuY3Rpb24odCxlKXt2YXIgbixyPWUsaT10Lngsbz10Lnkscz0tMS8wO2Rve2lmKG88PXIueSYmbz49ci5uZXh0LnkmJnIubmV4dC55IT09ci55KXt2YXIgYT1yLngrKG8tci55KSooci5uZXh0Lngtci54KS8oci5uZXh0Lnktci55KTtpZihhPD1pJiZhPnMpe2lmKHM9YSxhPT09aSl7aWYobz09PXIueSlyZXR1cm4gcjtpZihvPT09ci5uZXh0LnkpcmV0dXJuIHIubmV4dH1uPXIueDxyLm5leHQueD9yOnIubmV4dH19cj1yLm5leHR9d2hpbGUociE9PWUpO2lmKCFuKXJldHVybiBudWxsO2lmKGk9PT1zKXJldHVybiBuLnByZXY7dmFyIHUsYz1uLGw9bi54LGg9bi55LGY9MS8wO2ZvcihyPW4ubmV4dDtyIT09YzspaT49ci54JiZyLng+PWwmJmkhPT1yLngmJlpuKG88aD9pOnMsbyxsLGgsbzxoP3M6aSxvLHIueCxyLnkpJiYoKHU9TWF0aC5hYnMoby1yLnkpLyhpLXIueCkpPGZ8fHU9PT1mJiZyLng+bi54KSYmdHIocix0KSYmKG49cixmPXUpLHI9ci5uZXh0O3JldHVybiBufSh0LGUpLGUpe3ZhciBuPWVyKGUsdCk7em4obixuLm5leHQpfX1mdW5jdGlvbiBXbih0LGUsbixyLGkpe3JldHVybih0PTE0MzE2NTU3NjUmKCh0PTg1ODk5MzQ1OSYoKHQ9MjUyNjQ1MTM1JigodD0xNjcxMTkzNSYoKHQ9MzI3NjcqKHQtbikqaSl8dDw8OCkpfHQ8PDQpKXx0PDwyKSl8dDw8MSkpfChlPTE0MzE2NTU3NjUmKChlPTg1ODk5MzQ1OSYoKGU9MjUyNjQ1MTM1JigoZT0xNjcxMTkzNSYoKGU9MzI3NjcqKGUtcikqaSl8ZTw8OCkpfGU8PDQpKXxlPDwyKSl8ZTw8MSkpPDwxfWZ1bmN0aW9uIEhuKHQpe3ZhciBlPXQsbj10O2Rve2UueDxuLngmJihuPWUpLGU9ZS5uZXh0fXdoaWxlKGUhPT10KTtyZXR1cm4gbn1mdW5jdGlvbiBabih0LGUsbixyLGksbyxzLGEpe3JldHVybihpLXMpKihlLWEpLSh0LXMpKihvLWEpPj0wJiYodC1zKSooci1hKS0obi1zKSooZS1hKT49MCYmKG4tcykqKG8tYSktKGktcykqKHItYSk+PTB9ZnVuY3Rpb24gS24odCxlKXtyZXR1cm4gdC5uZXh0LmkhPT1lLmkmJnQucHJldi5pIT09ZS5pJiYhZnVuY3Rpb24odCxlKXt2YXIgbj10O2Rve2lmKG4uaSE9PXQuaSYmbi5uZXh0LmkhPT10LmkmJm4uaSE9PWUuaSYmbi5uZXh0LmkhPT1lLmkmJiRuKG4sbi5uZXh0LHQsZSkpcmV0dXJuITA7bj1uLm5leHR9d2hpbGUobiE9PXQpO3JldHVybiExfSh0LGUpJiZ0cih0LGUpJiZ0cihlLHQpJiZmdW5jdGlvbih0LGUpe3ZhciBuPXQscj0hMSxpPSh0LngrZS54KS8yLG89KHQueStlLnkpLzI7ZG97bi55Pm8hPW4ubmV4dC55Pm8mJm4ubmV4dC55IT09bi55JiZpPChuLm5leHQueC1uLngpKihvLW4ueSkvKG4ubmV4dC55LW4ueSkrbi54JiYocj0hciksbj1uLm5leHR9d2hpbGUobiE9PXQpO3JldHVybiByfSh0LGUpfWZ1bmN0aW9uIEpuKHQsZSxuKXtyZXR1cm4oZS55LXQueSkqKG4ueC1lLngpLShlLngtdC54KSoobi55LWUueSl9ZnVuY3Rpb24gUW4odCxlKXtyZXR1cm4gdC54PT09ZS54JiZ0Lnk9PT1lLnl9ZnVuY3Rpb24gJG4odCxlLG4scil7cmV0dXJuISEoUW4odCxlKSYmUW4obixyKXx8UW4odCxyKSYmUW4obixlKSl8fEpuKHQsZSxuKT4wIT1Kbih0LGUscik+MCYmSm4obixyLHQpPjAhPUpuKG4scixlKT4wfWZ1bmN0aW9uIHRyKHQsZSl7cmV0dXJuIEpuKHQucHJldix0LHQubmV4dCk8MD9Kbih0LGUsdC5uZXh0KT49MCYmSm4odCx0LnByZXYsZSk+PTA6Sm4odCxlLHQucHJldik8MHx8Sm4odCx0Lm5leHQsZSk8MH1mdW5jdGlvbiBlcih0LGUpe3ZhciBuPW5ldyBpcih0LmksdC54LHQueSkscj1uZXcgaXIoZS5pLGUueCxlLnkpLGk9dC5uZXh0LG89ZS5wcmV2O3JldHVybiB0Lm5leHQ9ZSxlLnByZXY9dCxuLm5leHQ9aSxpLnByZXY9bixyLm5leHQ9bixuLnByZXY9cixvLm5leHQ9cixyLnByZXY9byxyfWZ1bmN0aW9uIG5yKHQsZSxuLHIpe3ZhciBpPW5ldyBpcih0LGUsbik7cmV0dXJuIHI/KGkubmV4dD1yLm5leHQsaS5wcmV2PXIsci5uZXh0LnByZXY9aSxyLm5leHQ9aSk6KGkucHJldj1pLGkubmV4dD1pKSxpfWZ1bmN0aW9uIHJyKHQpe3QubmV4dC5wcmV2PXQucHJldix0LnByZXYubmV4dD10Lm5leHQsdC5wcmV2WiYmKHQucHJldloubmV4dFo9dC5uZXh0WiksdC5uZXh0WiYmKHQubmV4dFoucHJldlo9dC5wcmV2Wil9ZnVuY3Rpb24gaXIodCxlLG4pe3RoaXMuaT10LHRoaXMueD1lLHRoaXMueT1uLHRoaXMucHJldj1udWxsLHRoaXMubmV4dD1udWxsLHRoaXMuej1udWxsLHRoaXMucHJldlo9bnVsbCx0aGlzLm5leHRaPW51bGwsdGhpcy5zdGVpbmVyPSExfWZ1bmN0aW9uIG9yKHQsZSxuLHIpe2Zvcih2YXIgaT0wLG89ZSxzPW4tcjtvPG47bys9cilpKz0odFtzXS10W29dKSoodFtvKzFdK3RbcysxXSkscz1vO3JldHVybiBpfWZ1bmN0aW9uIHNyKHQsZSxuKXtpZighdmUobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLm11dGF0ZTtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmbWUodFswXSk/dD0ibWVyY2F0b3IiPT09ZT9hcih0KTp1cih0KTooITAhPT1yJiYodD1Jbih0KSksd2UodCwoZnVuY3Rpb24odCl7dmFyIG49Im1lcmNhdG9yIj09PWU/YXIodCk6dXIodCk7dFswXT1uWzBdLHRbMV09blsxXX0pKSksdH1mdW5jdGlvbiBhcih0KXt2YXIgZT1NYXRoLlBJLzE4MCxuPTYzNzgxMzcscj0yMDAzNzUwOC4zNDI3ODkyNDQsaT1NYXRoLmFicyh0WzBdKTw9MTgwP3RbMF06dFswXS0zNjAqZnVuY3Rpb24odCl7cmV0dXJuIHQ8MD8tMTp0PjA/MTowfSh0WzBdKSxvPVtuKmkqZSxuKk1hdGgubG9nKE1hdGgudGFuKC4yNSpNYXRoLlBJKy41KnRbMV0qZSkpXTtyZXR1cm4gb1swXT5yJiYob1swXT1yKSxvWzBdPC1yJiYob1swXT0tciksb1sxXT5yJiYob1sxXT1yKSxvWzFdPC1yJiYob1sxXT0tciksb31mdW5jdGlvbiB1cih0KXt2YXIgZT0xODAvTWF0aC5QSSxuPTYzNzgxMzc7cmV0dXJuW3RbMF0qZS9uLCguNSpNYXRoLlBJLTIqTWF0aC5hdGFuKE1hdGguZXhwKC10WzFdL24pKSkqZV19ZnVuY3Rpb24gY3IodCxlLG4pe3ZhciByLGksbyxzLGEsdT10Lmxlbmd0aCxjPWhyKHRbMF0sZSksbD1bXTtmb3Iobnx8KG49W10pLHI9MTtyPHU7cisrKXtmb3IoaT10W3ItMV0scz1hPWhyKG89dFtyXSxlKTs7KXtpZighKGN8cykpe2wucHVzaChpKSxzIT09YT8obC5wdXNoKG8pLHI8dS0xJiYobi5wdXNoKGwpLGw9W10pKTpyPT09dS0xJiZsLnB1c2gobyk7YnJlYWt9aWYoYyZzKWJyZWFrO2M/Yz1ocihpPWxyKGksbyxjLGUpLGUpOnM9aHIobz1scihpLG8scyxlKSxlKX1jPWF9cmV0dXJuIGwubGVuZ3RoJiZuLnB1c2gobCksbn1mdW5jdGlvbiBscih0LGUsbixyKXtyZXR1cm4gOCZuP1t0WzBdKyhlWzBdLXRbMF0pKihyWzNdLXRbMV0pLyhlWzFdLXRbMV0pLHJbM11dOjQmbj9bdFswXSsoZVswXS10WzBdKSooclsxXS10WzFdKS8oZVsxXS10WzFdKSxyWzFdXToyJm4/W3JbMl0sdFsxXSsoZVsxXS10WzFdKSooclsyXS10WzBdKS8oZVswXS10WzBdKV06MSZuP1tyWzBdLHRbMV0rKGVbMV0tdFsxXSkqKHJbMF0tdFswXSkvKGVbMF0tdFswXSldOm51bGx9ZnVuY3Rpb24gaHIodCxlKXt2YXIgbj0wO3JldHVybiB0WzBdPGVbMF0/bnw9MTp0WzBdPmVbMl0mJihufD0yKSx0WzFdPGVbMV0/bnw9NDp0WzFdPmVbM10mJihufD04KSxufWZ1bmN0aW9uIGZyKHQsZSl7cmV0dXJuIGUuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0uZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBBbihhZShlKSx0KX0pKX1Cbi5kZXZpYXRpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ZSYmZS5sZW5ndGgsbz1pP2VbMF0qbjp0Lmxlbmd0aCxzPU1hdGguYWJzKG9yKHQsMCxvLG4pKTtpZihpKWZvcih2YXIgYT0wLHU9ZS5sZW5ndGg7YTx1O2ErKyl7dmFyIGM9ZVthXSpuLGw9YTx1LTE/ZVthKzFdKm46dC5sZW5ndGg7cy09TWF0aC5hYnMob3IodCxjLGwsbikpfXZhciBoPTA7Zm9yKGE9MDthPHIubGVuZ3RoO2ErPTMpe3ZhciBmPXJbYV0qbixwPXJbYSsxXSpuLGQ9clthKzJdKm47aCs9TWF0aC5hYnMoKHRbZl0tdFtkXSkqKHRbcCsxXS10W2YrMV0pLSh0W2ZdLXRbcF0pKih0W2QrMV0tdFtmKzFdKSl9cmV0dXJuIDA9PT1zJiYwPT09aD8wOk1hdGguYWJzKChoLXMpL3MpfSxCbi5mbGF0dGVuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10WzBdWzBdLmxlbmd0aCxuPXt2ZXJ0aWNlczpbXSxob2xlczpbXSxkaW1lbnNpb25zOmV9LHI9MCxpPTA7aTx0Lmxlbmd0aDtpKyspe2Zvcih2YXIgbz0wO288dFtpXS5sZW5ndGg7bysrKWZvcih2YXIgcz0wO3M8ZTtzKyspbi52ZXJ0aWNlcy5wdXNoKHRbaV1bb11bc10pO2k+MCYmKHIrPXRbaS0xXS5sZW5ndGgsbi5ob2xlcy5wdXNoKHIpKX1yZXR1cm4gbn0sUG4uZGVmYXVsdD1SbixPYmplY3QuZnJlZXplKHt0b01lcmNhdG9yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHNyKHQsIm1lcmNhdG9yIixlKX0sdG9XZ3M4NDpmdW5jdGlvbih0LGUpe3JldHVybiBzcih0LCJ3Z3M4NCIsZSl9fSksTnVtYmVyLnByb3RvdHlwZS5tb2R1bG89ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMldCt0KSV0fSxjci5wb2x5bGluZT1jcixjci5wb2x5Z29uPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixpLG8scyxhLHU7Zm9yKHI9MTtyPD04O3IqPTIpe2ZvcihuPVtdLG89IShocihpPXRbdC5sZW5ndGgtMV0sZSkmcikscz0wO3M8dC5sZW5ndGg7cysrKSh1PSEoaHIoYT10W3NdLGUpJnIpKSE9PW8mJm4ucHVzaChscihpLGEscixlKSksdSYmbi5wdXNoKGEpLGk9YSxvPXU7aWYoISh0PW4pLmxlbmd0aClicmVha31yZXR1cm4gbn07dmFyIHByPWZ1bmN0aW9uKCl7dGhpcy5lZGdlcz1bXSx0aGlzLnBvbHlnb249dm9pZCAwLHRoaXMuZW52ZWxvcGU9dm9pZCAwfSxkcj17bGVuZ3RoOntjb25maWd1cmFibGU6ITB9fTtwci5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXt0aGlzW3RoaXMuZWRnZXMubGVuZ3RoXT10LHRoaXMuZWRnZXMucHVzaCh0KSx0aGlzLnBvbHlnb249dGhpcy5lbnZlbG9wZT12b2lkIDB9LHByLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWRnZXNbdF19LGRyLmxlbmd0aC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlcy5sZW5ndGh9LHByLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe3RoaXMuZWRnZXMuZm9yRWFjaCh0KX0scHIucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lZGdlcy5tYXAodCl9LHByLnByb3RvdHlwZS5zb21lPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVkZ2VzLnNvbWUodCl9LHByLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuITB9LHByLnByb3RvdHlwZS5pc0hvbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5lZGdlcy5yZWR1Y2UoKGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gbi5mcm9tLmNvb3JkaW5hdGVzWzFdPnQuZWRnZXNbZV0uZnJvbS5jb29yZGluYXRlc1sxXSYmKGU9ciksZX0pLDApLG49KDA9PT1lP3RoaXMubGVuZ3RoOmUpLTEscj0oZSsxKSV0aGlzLmxlbmd0aCxpPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lWzBdLXRbMF0saT1lWzFdLXRbMV0sbz1uWzBdLWVbMF0scz1uWzFdLWVbMV07cmV0dXJuIE1hdGguc2lnbihyKnMtbyppKX0odGhpcy5lZGdlc1tuXS5mcm9tLmNvb3JkaW5hdGVzLHRoaXMuZWRnZXNbZV0uZnJvbS5jb29yZGluYXRlcyx0aGlzLmVkZ2VzW3JdLmZyb20uY29vcmRpbmF0ZXMpO3JldHVybiAwPT09aT90aGlzLmVkZ2VzW25dLmZyb20uY29vcmRpbmF0ZXNbMF0+dGhpcy5lZGdlc1tyXS5mcm9tLmNvb3JkaW5hdGVzWzBdOmk+MH0scHIucHJvdG90eXBlLnRvTXVsdGlQb2ludD1mdW5jdGlvbigpe3JldHVybiBmZSh0aGlzLmVkZ2VzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZnJvbS5jb29yZGluYXRlc30pKSl9LHByLnByb3RvdHlwZS50b1BvbHlnb249ZnVuY3Rpb24oKXtpZih0aGlzLnBvbHlnb24pcmV0dXJuIHRoaXMucG9seWdvbjt2YXIgdD10aGlzLmVkZ2VzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZnJvbS5jb29yZGluYXRlc30pKTtyZXR1cm4gdC5wdXNoKHRoaXMuZWRnZXNbMF0uZnJvbS5jb29yZGluYXRlcyksdGhpcy5wb2x5Z29uPXVlKFt0XSl9LHByLnByb3RvdHlwZS5nZXRFbnZlbG9wZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVudmVsb3BlP3RoaXMuZW52ZWxvcGU6dGhpcy5lbnZlbG9wZT1Mbih0aGlzLnRvUG9seWdvbigpKX0scHIuZmluZEVkZ2VSaW5nQ29udGFpbmluZz1mdW5jdGlvbih0LGUpe3ZhciBuLHIsaT10LmdldEVudmVsb3BlKCk7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG89ZS5nZXRFbnZlbG9wZSgpO2lmKHImJihuPXIuZ2V0RW52ZWxvcGUoKSksIWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZW9tZXRyeS5jb29yZGluYXRlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0WzBdfSkpLHI9dC5nZW9tZXRyeS5jb29yZGluYXRlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0WzFdfSkpLGk9ZS5nZW9tZXRyeS5jb29yZGluYXRlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0WzBdfSkpLG89ZS5nZW9tZXRyeS5jb29yZGluYXRlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0WzFdfSkpO3JldHVybiBNYXRoLm1heChudWxsLG4pPT09TWF0aC5tYXgobnVsbCxpKSYmTWF0aC5tYXgobnVsbCxyKT09PU1hdGgubWF4KG51bGwsbykmJk1hdGgubWluKG51bGwsbik9PT1NYXRoLm1pbihudWxsLGkpJiZNYXRoLm1pbihudWxsLHIpPT09TWF0aC5taW4obnVsbCxvKX0obyxpKSYmZnIobyxpKSl7dmFyIHM9dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmZyb20uY29vcmRpbmF0ZXN9KSkuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIWUuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX0odCxlLmZyb20uY29vcmRpbmF0ZXMpfSkpfSkpO3MmJmUuaW5zaWRlKGFlKHMpKSYmKCFyfHxmcihuLG8pKSYmKHI9ZSl9fSkpLHJ9LHByLnByb3RvdHlwZS5pbnNpZGU9ZnVuY3Rpb24odCl7cmV0dXJuIEFuKHQsdGhpcy50b1BvbHlnb24oKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHByLnByb3RvdHlwZSxkcik7dmFyIGdyPUplKChmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4odCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpZS5wdXNoKG4pO3JldHVybiBlfSh0LmV4cG9ydHM9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5rZXlzP09iamVjdC5rZXlzOm4pLnNoaW09bn0pKTtnci5zaGltO3ZhciB5cj1KZSgoZnVuY3Rpb24odCxlKXt2YXIgbj0iW29iamVjdCBBcmd1bWVudHNdIj09ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50cyl9KCk7ZnVuY3Rpb24gcih0KXtyZXR1cm4iW29iamVjdCBBcmd1bWVudHNdIj09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImNhbGxlZSIpJiYhT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsImNhbGxlZSIpfHwhMX0oZT10LmV4cG9ydHM9bj9yOmkpLnN1cHBvcnRlZD1yLGUudW5zdXBwb3J0ZWQ9aX0pKTt5ci5zdXBwb3J0ZWQseXIudW5zdXBwb3J0ZWQsSmUoKGZ1bmN0aW9uKHQpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZSxuPXQuZXhwb3J0cz1mdW5jdGlvbih0LG8scyl7cmV0dXJuIHN8fChzPXt9KSx0PT09b3x8KHQgaW5zdGFuY2VvZiBEYXRlJiZvIGluc3RhbmNlb2YgRGF0ZT90LmdldFRpbWUoKT09PW8uZ2V0VGltZSgpOiF0fHwhb3x8Im9iamVjdCIhPXR5cGVvZiB0JiYib2JqZWN0IiE9dHlwZW9mIG8/cy5zdHJpY3Q/dD09PW86dD09bzpmdW5jdGlvbih0LG8scyl7dmFyIGEsdTtpZihyKHQpfHxyKG8pfHx0LnByb3RvdHlwZSE9PW8ucHJvdG90eXBlKXJldHVybiExO2lmKHlyKHQpKXJldHVybiEheXIobykmJih0PWUuY2FsbCh0KSxvPWUuY2FsbChvKSxuKHQsbyxzKSk7aWYoaSh0KSl7aWYoIWkobyl8fHQubGVuZ3RoIT09by5sZW5ndGgpcmV0dXJuITE7Zm9yKGE9MDthPHQubGVuZ3RoO2ErKylpZih0W2FdIT09b1thXSlyZXR1cm4hMTtyZXR1cm4hMH10cnl7dmFyIGM9Z3IodCksbD1ncihvKX1jYXRjaCh0KXtyZXR1cm4hMX1pZihjLmxlbmd0aCE9bC5sZW5ndGgpcmV0dXJuITE7Zm9yKGMuc29ydCgpLGwuc29ydCgpLGE9Yy5sZW5ndGgtMTthPj0wO2EtLSlpZihjW2FdIT1sW2FdKXJldHVybiExO2ZvcihhPWMubGVuZ3RoLTE7YT49MDthLS0paWYodT1jW2FdLCFuKHRbdV0sb1t1XSxzKSlyZXR1cm4hMTtyZXR1cm4gdHlwZW9mIHQ9PXR5cGVvZiBvfSh0LG8scykpfTtmdW5jdGlvbiByKHQpe3JldHVybiBudWxsPT10fWZ1bmN0aW9uIGkodCl7cmV0dXJuISghdHx8Im9iamVjdCIhPXR5cGVvZiB0fHwibnVtYmVyIiE9dHlwZW9mIHQubGVuZ3RofHwiZnVuY3Rpb24iIT10eXBlb2YgdC5jb3B5fHwiZnVuY3Rpb24iIT10eXBlb2YgdC5zbGljZXx8dC5sZW5ndGg+MCYmIm51bWJlciIhPXR5cGVvZiB0WzBdKX19KSk7dmFyIG1yPUplKChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSxuLHIpe3RoaXMuZGF0YXNldD1bXSx0aGlzLmVwc2lsb249MSx0aGlzLm1pblB0cz0yLHRoaXMuZGlzdGFuY2U9dGhpcy5fZXVjbGlkZWFuRGlzdGFuY2UsdGhpcy5jbHVzdGVycz1bXSx0aGlzLm5vaXNlPVtdLHRoaXMuX3Zpc2l0ZWQ9W10sdGhpcy5fYXNzaWduZWQ9W10sdGhpcy5fZGF0YXNldExlbmd0aD0wLHRoaXMuX2luaXQodCxlLG4scil9ZS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKHQsZSxuLHIpe3RoaXMuX2luaXQodCxlLG4scik7Zm9yKHZhciBpPTA7aTx0aGlzLl9kYXRhc2V0TGVuZ3RoO2krKylpZigxIT09dGhpcy5fdmlzaXRlZFtpXSl7dGhpcy5fdmlzaXRlZFtpXT0xO3ZhciBvPXRoaXMuX3JlZ2lvblF1ZXJ5KGkpO2lmKG8ubGVuZ3RoPHRoaXMubWluUHRzKXRoaXMubm9pc2UucHVzaChpKTtlbHNle3ZhciBzPXRoaXMuY2x1c3RlcnMubGVuZ3RoO3RoaXMuY2x1c3RlcnMucHVzaChbXSksdGhpcy5fYWRkVG9DbHVzdGVyKGkscyksdGhpcy5fZXhwYW5kQ2x1c3RlcihzLG8pfX1yZXR1cm4gdGhpcy5jbHVzdGVyc30sZS5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCxlLG4scil7aWYodCl7aWYoISh0IGluc3RhbmNlb2YgQXJyYXkpKXRocm93IEVycm9yKCJEYXRhc2V0IG11c3QgYmUgb2YgdHlwZSBhcnJheSwgIit0eXBlb2YgdCsiIGdpdmVuIik7dGhpcy5kYXRhc2V0PXQsdGhpcy5jbHVzdGVycz1bXSx0aGlzLm5vaXNlPVtdLHRoaXMuX2RhdGFzZXRMZW5ndGg9dC5sZW5ndGgsdGhpcy5fdmlzaXRlZD1uZXcgQXJyYXkodGhpcy5fZGF0YXNldExlbmd0aCksdGhpcy5fYXNzaWduZWQ9bmV3IEFycmF5KHRoaXMuX2RhdGFzZXRMZW5ndGgpfWUmJih0aGlzLmVwc2lsb249ZSksbiYmKHRoaXMubWluUHRzPW4pLHImJih0aGlzLmRpc3RhbmNlPXIpfSxlLnByb3RvdHlwZS5fZXhwYW5kQ2x1c3Rlcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO2lmKDEhPT10aGlzLl92aXNpdGVkW3JdKXt0aGlzLl92aXNpdGVkW3JdPTE7dmFyIGk9dGhpcy5fcmVnaW9uUXVlcnkocik7aS5sZW5ndGg+PXRoaXMubWluUHRzJiYoZT10aGlzLl9tZXJnZUFycmF5cyhlLGkpKX0xIT09dGhpcy5fYXNzaWduZWRbcl0mJnRoaXMuX2FkZFRvQ2x1c3RlcihyLHQpfX0sZS5wcm90b3R5cGUuX2FkZFRvQ2x1c3Rlcj1mdW5jdGlvbih0LGUpe3RoaXMuY2x1c3RlcnNbZV0ucHVzaCh0KSx0aGlzLl9hc3NpZ25lZFt0XT0xfSxlLnByb3RvdHlwZS5fcmVnaW9uUXVlcnk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHRoaXMuX2RhdGFzZXRMZW5ndGg7bisrKXt0aGlzLmRpc3RhbmNlKHRoaXMuZGF0YXNldFt0XSx0aGlzLmRhdGFzZXRbbl0pPHRoaXMuZXBzaWxvbiYmZS5wdXNoKG4pfXJldHVybiBlfSxlLnByb3RvdHlwZS5fbWVyZ2VBcnJheXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5sZW5ndGgscj0wO3I8bjtyKyspe3ZhciBpPWVbcl07dC5pbmRleE9mKGkpPDAmJnQucHVzaChpKX1yZXR1cm4gdH0sZS5wcm90b3R5cGUuX2V1Y2xpZGVhbkRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCk7ci0tOyluKz0odFtyXS1lW3JdKSoodFtyXS1lW3JdKTtyZXR1cm4gTWF0aC5zcXJ0KG4pfSx0LmV4cG9ydHMmJih0LmV4cG9ydHM9ZSl9KSksdnI9SmUoKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlLG4pe3RoaXMuaz0zLHRoaXMuZGF0YXNldD1bXSx0aGlzLmFzc2lnbm1lbnRzPVtdLHRoaXMuY2VudHJvaWRzPVtdLHRoaXMuaW5pdCh0LGUsbil9ZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0LGUsbil7dGhpcy5hc3NpZ25tZW50cz1bXSx0aGlzLmNlbnRyb2lkcz1bXSx2b2lkIDAhPT10JiYodGhpcy5kYXRhc2V0PXQpLHZvaWQgMCE9PWUmJih0aGlzLms9ZSksdm9pZCAwIT09biYmKHRoaXMuZGlzdGFuY2U9bil9LGUucHJvdG90eXBlLnJ1bj1mdW5jdGlvbih0LGUpe3RoaXMuaW5pdCh0LGUpO2Zvcih2YXIgbj10aGlzLmRhdGFzZXQubGVuZ3RoLHI9MDtyPHRoaXMuaztyKyspdGhpcy5jZW50cm9pZHNbcl09dGhpcy5yYW5kb21DZW50cm9pZCgpO2Zvcih2YXIgaT0hMDtpOyl7aT10aGlzLmFzc2lnbigpO2Zvcih2YXIgbz0wO288dGhpcy5rO28rKyl7Zm9yKHZhciBzPW5ldyBBcnJheShsKSxhPTAsdT0wO3U8bDt1Kyspc1t1XT0wO2Zvcih2YXIgYz0wO2M8bjtjKyspe3ZhciBsPXRoaXMuZGF0YXNldFtjXS5sZW5ndGg7aWYobz09PXRoaXMuYXNzaWdubWVudHNbY10pe2Zvcih1PTA7dTxsO3UrKylzW3VdKz10aGlzLmRhdGFzZXRbY11bdV07YSsrfX1pZihhPjApe2Zvcih1PTA7dTxsO3UrKylzW3VdLz1hO3RoaXMuY2VudHJvaWRzW29dPXN9ZWxzZSB0aGlzLmNlbnRyb2lkc1tvXT10aGlzLnJhbmRvbUNlbnRyb2lkKCksaT0hMH19cmV0dXJuIHRoaXMuZ2V0Q2x1c3RlcnMoKX0sZS5wcm90b3R5cGUucmFuZG9tQ2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcy5kYXRhc2V0Lmxlbmd0aC0xO2Rve2U9TWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKm4pLHQ9dGhpcy5kYXRhc2V0W2VdfXdoaWxlKHRoaXMuY2VudHJvaWRzLmluZGV4T2YodCk+PTApO3JldHVybiB0fSxlLnByb3RvdHlwZS5hc3NpZ249ZnVuY3Rpb24oKXtmb3IodmFyIHQsZT0hMSxuPXRoaXMuZGF0YXNldC5sZW5ndGgscj0wO3I8bjtyKyspKHQ9dGhpcy5hcmdtaW4odGhpcy5kYXRhc2V0W3JdLHRoaXMuY2VudHJvaWRzLHRoaXMuZGlzdGFuY2UpKSE9dGhpcy5hc3NpZ25tZW50c1tyXSYmKHRoaXMuYXNzaWdubWVudHNbcl09dCxlPSEwKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0Q2x1c3RlcnM9ZnVuY3Rpb24oKXtmb3IodmFyIHQsZT1uZXcgQXJyYXkodGhpcy5rKSxuPTA7bjx0aGlzLmFzc2lnbm1lbnRzLmxlbmd0aDtuKyspdm9pZCAwPT09ZVt0PXRoaXMuYXNzaWdubWVudHNbbl1dJiYoZVt0XT1bXSksZVt0XS5wdXNoKG4pO3JldHVybiBlfSxlLnByb3RvdHlwZS5hcmdtaW49ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcixpPU51bWJlci5NQVhfVkFMVUUsbz0wLHM9ZS5sZW5ndGgsYT0wO2E8czthKyspKHI9bih0LGVbYV0pKTxpJiYoaT1yLG89YSk7cmV0dXJuIG99LGUucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCk7ci0tOyl7dmFyIGk9dFtyXS1lW3JdO24rPWkqaX1yZXR1cm4gTWF0aC5zcXJ0KG4pfSx0LmV4cG9ydHMmJih0LmV4cG9ydHM9ZSl9KSksX3I9SmUoKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlLG4pe3RoaXMuX3F1ZXVlPVtdLHRoaXMuX3ByaW9yaXRpZXM9W10sdGhpcy5fc29ydGluZz0iZGVzYyIsdGhpcy5faW5pdCh0LGUsbil9ZS5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMuX3F1ZXVlLmxlbmd0aCxyPW47ci0tOyl7dmFyIGk9dGhpcy5fcHJpb3JpdGllc1tyXTsiZGVzYyI9PT10aGlzLl9zb3J0aW5nP2U+aSYmKG49cik6ZTxpJiYobj1yKX10aGlzLl9pbnNlcnRBdCh0LGUsbil9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fcXVldWUubGVuZ3RoO2UtLTspe2lmKHQ9PT10aGlzLl9xdWV1ZVtlXSl7dGhpcy5fcXVldWUuc3BsaWNlKGUsMSksdGhpcy5fcHJpb3JpdGllcy5zcGxpY2UoZSwxKTticmVha319fSxlLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe3RoaXMuX3F1ZXVlLmZvckVhY2godCl9LGUucHJvdG90eXBlLmdldEVsZW1lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3F1ZXVlfSxlLnByb3RvdHlwZS5nZXRFbGVtZW50UHJpb3JpdHk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3ByaW9yaXRpZXNbdF19LGUucHJvdG90eXBlLmdldFByaW9yaXRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJpb3JpdGllc30sZS5wcm90b3R5cGUuZ2V0RWxlbWVudHNXaXRoUHJpb3JpdGllcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9xdWV1ZS5sZW5ndGg7ZTxuO2UrKyl0LnB1c2goW3RoaXMuX3F1ZXVlW2VdLHRoaXMuX3ByaW9yaXRpZXNbZV1dKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCxlLG4pe2lmKHQmJmUpe2lmKHRoaXMuX3F1ZXVlPVtdLHRoaXMuX3ByaW9yaXRpZXM9W10sdC5sZW5ndGghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkFycmF5cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIik7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspdGhpcy5pbnNlcnQodFtyXSxlW3JdKX1uJiYodGhpcy5fc29ydGluZz1uKX0sZS5wcm90b3R5cGUuX2luc2VydEF0PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9xdWV1ZS5sZW5ndGg9PT1uPyh0aGlzLl9xdWV1ZS5wdXNoKHQpLHRoaXMuX3ByaW9yaXRpZXMucHVzaChlKSk6KHRoaXMuX3F1ZXVlLnNwbGljZShuLDAsdCksdGhpcy5fcHJpb3JpdGllcy5zcGxpY2UobiwwLGUpKX0sdC5leHBvcnRzJiYodC5leHBvcnRzPWUpfSkpLHhyPUplKChmdW5jdGlvbih0KXtpZih0LmV4cG9ydHMpdmFyIGU9X3I7ZnVuY3Rpb24gbih0LGUsbixyKXt0aGlzLmVwc2lsb249MSx0aGlzLm1pblB0cz0xLHRoaXMuZGlzdGFuY2U9dGhpcy5fZXVjbGlkZWFuRGlzdGFuY2UsdGhpcy5fcmVhY2hhYmlsaXR5PVtdLHRoaXMuX3Byb2Nlc3NlZD1bXSx0aGlzLl9jb3JlRGlzdGFuY2U9MCx0aGlzLl9vcmRlcmVkTGlzdD1bXSx0aGlzLl9pbml0KHQsZSxuLHIpfW4ucHJvdG90eXBlLnJ1bj1mdW5jdGlvbih0LG4scixpKXt0aGlzLl9pbml0KHQsbixyLGkpO2Zvcih2YXIgbz0wLHM9dGhpcy5kYXRhc2V0Lmxlbmd0aDtvPHM7bysrKWlmKDEhPT10aGlzLl9wcm9jZXNzZWRbb10pe3RoaXMuX3Byb2Nlc3NlZFtvXT0xLHRoaXMuY2x1c3RlcnMucHVzaChbb10pO3ZhciBhPXRoaXMuY2x1c3RlcnMubGVuZ3RoLTE7dGhpcy5fb3JkZXJlZExpc3QucHVzaChvKTt2YXIgdT1uZXcgZShudWxsLG51bGwsImFzYyIpLGM9dGhpcy5fcmVnaW9uUXVlcnkobyk7dm9pZCAwIT09dGhpcy5fZGlzdGFuY2VUb0NvcmUobykmJih0aGlzLl91cGRhdGVRdWV1ZShvLGMsdSksdGhpcy5fZXhwYW5kQ2x1c3RlcihhLHUpKX1yZXR1cm4gdGhpcy5jbHVzdGVyc30sbi5wcm90b3R5cGUuZ2V0UmVhY2hhYmlsaXR5UGxvdD1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9vcmRlcmVkTGlzdC5sZW5ndGg7ZTxuO2UrKyl7dmFyIHI9dGhpcy5fb3JkZXJlZExpc3RbZV0saT10aGlzLl9yZWFjaGFiaWxpdHlbcl07dC5wdXNoKFtyLGldKX1yZXR1cm4gdH0sbi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCxlLG4scil7aWYodCl7aWYoISh0IGluc3RhbmNlb2YgQXJyYXkpKXRocm93IEVycm9yKCJEYXRhc2V0IG11c3QgYmUgb2YgdHlwZSBhcnJheSwgIit0eXBlb2YgdCsiIGdpdmVuIik7dGhpcy5kYXRhc2V0PXQsdGhpcy5jbHVzdGVycz1bXSx0aGlzLl9yZWFjaGFiaWxpdHk9bmV3IEFycmF5KHRoaXMuZGF0YXNldC5sZW5ndGgpLHRoaXMuX3Byb2Nlc3NlZD1uZXcgQXJyYXkodGhpcy5kYXRhc2V0Lmxlbmd0aCksdGhpcy5fY29yZURpc3RhbmNlPTAsdGhpcy5fb3JkZXJlZExpc3Q9W119ZSYmKHRoaXMuZXBzaWxvbj1lKSxuJiYodGhpcy5taW5QdHM9biksciYmKHRoaXMuZGlzdGFuY2U9cil9LG4ucHJvdG90eXBlLl91cGRhdGVRdWV1ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpczt0aGlzLl9jb3JlRGlzdGFuY2U9dGhpcy5fZGlzdGFuY2VUb0NvcmUodCksZS5mb3JFYWNoKChmdW5jdGlvbihlKXtpZih2b2lkIDA9PT1yLl9wcm9jZXNzZWRbZV0pe3ZhciBpPXIuZGlzdGFuY2Uoci5kYXRhc2V0W3RdLHIuZGF0YXNldFtlXSksbz1NYXRoLm1heChyLl9jb3JlRGlzdGFuY2UsaSk7dm9pZCAwPT09ci5fcmVhY2hhYmlsaXR5W2VdPyhyLl9yZWFjaGFiaWxpdHlbZV09byxuLmluc2VydChlLG8pKTpvPHIuX3JlYWNoYWJpbGl0eVtlXSYmKHIuX3JlYWNoYWJpbGl0eVtlXT1vLG4ucmVtb3ZlKGUpLG4uaW5zZXJ0KGUsbykpfX0pKX0sbi5wcm90b3R5cGUuX2V4cGFuZENsdXN0ZXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5nZXRFbGVtZW50cygpLHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07aWYodm9pZCAwPT09dGhpcy5fcHJvY2Vzc2VkW29dKXt2YXIgcz10aGlzLl9yZWdpb25RdWVyeShvKTt0aGlzLl9wcm9jZXNzZWRbb109MSx0aGlzLmNsdXN0ZXJzW3RdLnB1c2gobyksdGhpcy5fb3JkZXJlZExpc3QucHVzaChvKSx2b2lkIDAhPT10aGlzLl9kaXN0YW5jZVRvQ29yZShvKSYmKHRoaXMuX3VwZGF0ZVF1ZXVlKG8scyxlKSx0aGlzLl9leHBhbmRDbHVzdGVyKHQsZSkpfX19LG4ucHJvdG90eXBlLl9kaXN0YW5jZVRvQ29yZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5lcHNpbG9uLG49MDtuPGU7bisrKXtpZih0aGlzLl9yZWdpb25RdWVyeSh0LG4pLmxlbmd0aD49dGhpcy5taW5QdHMpcmV0dXJuIG59fSxuLnByb3RvdHlwZS5fcmVnaW9uUXVlcnk9ZnVuY3Rpb24odCxlKXtlPWV8fHRoaXMuZXBzaWxvbjtmb3IodmFyIG49W10scj0wLGk9dGhpcy5kYXRhc2V0Lmxlbmd0aDtyPGk7cisrKXRoaXMuZGlzdGFuY2UodGhpcy5kYXRhc2V0W3RdLHRoaXMuZGF0YXNldFtyXSk8ZSYmbi5wdXNoKHIpO3JldHVybiBufSxuLnByb3RvdHlwZS5fZXVjbGlkZWFuRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKTtyLS07KW4rPSh0W3JdLWVbcl0pKih0W3JdLWVbcl0pO3JldHVybiBNYXRoLnNxcnQobil9LHQuZXhwb3J0cyYmKHQuZXhwb3J0cz1uKX0pKSx3cj1KZSgoZnVuY3Rpb24odCl7dC5leHBvcnRzJiYodC5leHBvcnRzPXtEQlNDQU46bXIsS01FQU5TOnZyLE9QVElDUzp4cixQcmlvcml0eVF1ZXVlOl9yfSl9KSk7ZnVuY3Rpb24gYnIoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBEcih0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIEVyKHQsZSl7dmFyIG49ZSxyPWUuUixpPW4uVTtpP2kuTD09PW4/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksbi5VPXIsbi5SPXIuTCxuLlImJihuLlIuVT1uKSxyLkw9bn1mdW5jdGlvbiBDcih0LGUpe3ZhciBuPWUscj1lLkwsaT1uLlU7aT9pLkw9PT1uP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLG4uVT1yLG4uTD1yLlIsbi5MJiYobi5MLlU9biksci5SPW59ZnVuY3Rpb24gU3IodCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIEFyKHQsZSxuLHIpe3ZhciBpPVtudWxsLG51bGxdLG89SnIucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PWUsbiYmSXIoaSx0LGUsbiksciYmSXIoaSxlLHQsciksWnJbdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksWnJbZS5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBOcih0LGUsbil7dmFyIHI9W2Usbl07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gSXIodCxlLG4scil7dFswXXx8dFsxXT90LmxlZnQ9PT1uP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9ZSx0LnJpZ2h0PW4pfWZ1bmN0aW9uIE1yKHQsZSxuLHIsaSl7dmFyIG8scz10WzBdLGE9dFsxXSx1PXNbMF0sYz1zWzFdLGw9MCxoPTEsZj1hWzBdLXUscD1hWzFdLWM7aWYobz1lLXUsZnx8IShvPjApKXtpZihvLz1mLGY8MCl7aWYobzxsKXJldHVybjtvPGgmJihoPW8pfWVsc2UgaWYoZj4wKXtpZihvPmgpcmV0dXJuO28+bCYmKGw9byl9aWYobz1yLXUsZnx8IShvPDApKXtpZihvLz1mLGY8MCl7aWYobz5oKXJldHVybjtvPmwmJihsPW8pfWVsc2UgaWYoZj4wKXtpZihvPGwpcmV0dXJuO288aCYmKGg9byl9aWYobz1uLWMscHx8IShvPjApKXtpZihvLz1wLHA8MCl7aWYobzxsKXJldHVybjtvPGgmJihoPW8pfWVsc2UgaWYocD4wKXtpZihvPmgpcmV0dXJuO28+bCYmKGw9byl9aWYobz1pLWMscHx8IShvPDApKXtpZihvLz1wLHA8MCl7aWYobz5oKXJldHVybjtvPmwmJihsPW8pfWVsc2UgaWYocD4wKXtpZihvPGwpcmV0dXJuO288aCYmKGg9byl9cmV0dXJuIShsPjApJiYhKGg8MSl8fChsPjAmJih0WzBdPVt1K2wqZixjK2wqcF0pLGg8MSYmKHRbMV09W3UraCpmLGMraCpwXSkpLCEwfX19fX1mdW5jdGlvbiBGcih0LGUsbixyLGkpe3ZhciBvPXRbMV07aWYobylyZXR1cm4hMDt2YXIgcyxhLHU9dFswXSxjPXQubGVmdCxsPXQucmlnaHQsaD1jWzBdLGY9Y1sxXSxwPWxbMF0sZD1sWzFdLGc9KGgrcCkvMix5PShmK2QpLzI7aWYoZD09PWYpe2lmKGc8ZXx8Zz49cilyZXR1cm47aWYoaD5wKXtpZih1KXtpZih1WzFdPj1pKXJldHVybn1lbHNlIHU9W2csbl07bz1bZyxpXX1lbHNle2lmKHUpe2lmKHVbMV08bilyZXR1cm59ZWxzZSB1PVtnLGldO289W2csbl19fWVsc2UgaWYoYT15LShzPShoLXApLyhkLWYpKSpnLHM8LTF8fHM+MSlpZihoPnApe2lmKHUpe2lmKHVbMV0+PWkpcmV0dXJufWVsc2UgdT1bKG4tYSkvcyxuXTtvPVsoaS1hKS9zLGldfWVsc2V7aWYodSl7aWYodVsxXTxuKXJldHVybn1lbHNlIHU9WyhpLWEpL3MsaV07bz1bKG4tYSkvcyxuXX1lbHNlIGlmKGY8ZCl7aWYodSl7aWYodVswXT49cilyZXR1cm59ZWxzZSB1PVtlLHMqZSthXTtvPVtyLHMqcithXX1lbHNle2lmKHUpe2lmKHVbMF08ZSlyZXR1cm59ZWxzZSB1PVtyLHMqcithXTtvPVtlLHMqZSthXX1yZXR1cm4gdFswXT11LHRbMV09bywhMH1mdW5jdGlvbiBUcih0LGUpe3ZhciBuPXQuc2l0ZSxyPWUubGVmdCxpPWUucmlnaHQ7cmV0dXJuIG49PT1pJiYoaT1yLHI9biksaT9NYXRoLmF0YW4yKGlbMV0tclsxXSxpWzBdLXJbMF0pOihuPT09cj8ocj1lWzFdLGk9ZVswXSk6KHI9ZVswXSxpPWVbMV0pLE1hdGguYXRhbjIoclswXS1pWzBdLGlbMV0tclsxXSkpfWZ1bmN0aW9uIE9yKHQsZSl7cmV0dXJuIGVbKyhlLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiBMcih0LGUpe3JldHVybiBlWysoZS5sZWZ0PT09dC5zaXRlKV19d3IuREJTQ0FOLHdyLktNRUFOUyx3ci5PUFRJQ1Msd3IuUHJpb3JpdHlRdWV1ZSxici5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmJyLGluc2VydDpmdW5jdGlvbih0LGUpe3ZhciBuLHIsaTtpZih0KXtpZihlLlA9dCxlLk49dC5OLHQuTiYmKHQuTi5QPWUpLHQuTj1lLHQuUil7Zm9yKHQ9dC5SO3QuTDspdD10Lkw7dC5MPWV9ZWxzZSB0LlI9ZTtuPXR9ZWxzZSB0aGlzLl8/KHQ9U3IodGhpcy5fKSxlLlA9bnVsbCxlLk49dCx0LlA9dC5MPWUsbj10KTooZS5QPWUuTj1udWxsLHRoaXMuXz1lLG49bnVsbCk7Zm9yKGUuTD1lLlI9bnVsbCxlLlU9bixlLkM9ITAsdD1lO24mJm4uQzspbj09PShyPW4uVSkuTD8oaT1yLlIpJiZpLkM/KG4uQz1pLkM9ITEsci5DPSEwLHQ9cik6KHQ9PT1uLlImJihFcih0aGlzLG4pLG49KHQ9bikuVSksbi5DPSExLHIuQz0hMCxDcih0aGlzLHIpKTooaT1yLkwpJiZpLkM/KG4uQz1pLkM9ITEsci5DPSEwLHQ9cik6KHQ9PT1uLkwmJihDcih0aGlzLG4pLG49KHQ9bikuVSksbi5DPSExLHIuQz0hMCxFcih0aGlzLHIpKSxuPXQuVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3QuTiYmKHQuTi5QPXQuUCksdC5QJiYodC5QLk49dC5OKSx0Lk49dC5QPW51bGw7dmFyIGUsbixyLGk9dC5VLG89dC5MLHM9dC5SO2lmKG49bz9zP1NyKHMpOm86cyxpP2kuTD09PXQ/aS5MPW46aS5SPW46dGhpcy5fPW4sbyYmcz8ocj1uLkMsbi5DPXQuQyxuLkw9byxvLlU9bixuIT09cz8oaT1uLlUsbi5VPXQuVSx0PW4uUixpLkw9dCxuLlI9cyxzLlU9bik6KG4uVT1pLGk9bix0PW4uUikpOihyPXQuQyx0PW4pLHQmJih0LlU9aSksIXIpe2lmKHQmJnQuQylyZXR1cm4gdm9pZCh0LkM9ITEpO2Rve2lmKHQ9PT10aGlzLl8pYnJlYWs7aWYodD09PWkuTCl7aWYoKGU9aS5SKS5DJiYoZS5DPSExLGkuQz0hMCxFcih0aGlzLGkpLGU9aS5SKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXsoIWUuUnx8IWUuUi5DKSYmKGUuTC5DPSExLGUuQz0hMCxDcih0aGlzLGUpLGU9aS5SKSxlLkM9aS5DLGkuQz1lLlIuQz0hMSxFcih0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChlPWkuTCkuQyYmKGUuQz0hMSxpLkM9ITAsQ3IodGhpcyxpKSxlPWkuTCksZS5MJiZlLkwuQ3x8ZS5SJiZlLlIuQyl7KCFlLkx8fCFlLkwuQykmJihlLlIuQz0hMSxlLkM9ITAsRXIodGhpcyxlKSxlPWkuTCksZS5DPWkuQyxpLkM9ZS5MLkM9ITEsQ3IodGhpcyxpKSx0PXRoaXMuXzticmVha31lLkM9ITAsdD1pLGk9aS5VfXdoaWxlKCF0LkMpO3QmJih0LkM9ITEpfX19O3ZhciBQcixScj1bXTtmdW5jdGlvbiBCcigpe0RyKHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH1mdW5jdGlvbiBrcih0KXt2YXIgZT10LlAsbj10Lk47aWYoZSYmbil7dmFyIHI9ZS5zaXRlLGk9dC5zaXRlLG89bi5zaXRlO2lmKHIhPT1vKXt2YXIgcz1pWzBdLGE9aVsxXSx1PXJbMF0tcyxjPXJbMV0tYSxsPW9bMF0tcyxoPW9bMV0tYSxmPTIqKHUqaC1jKmwpO2lmKCEoZj49LSRyKSl7dmFyIHA9dSp1K2MqYyxkPWwqbCtoKmgsZz0oaCpwLWMqZCkvZix5PSh1KmQtbCpwKS9mLG09UnIucG9wKCl8fG5ldyBCcjttLmFyYz10LG0uc2l0ZT1pLG0ueD1nK3MsbS55PShtLmN5PXkrYSkrTWF0aC5zcXJ0KGcqZyt5KnkpLHQuY2lyY2xlPW07Zm9yKHZhciB2PW51bGwsXz1Lci5fO187KWlmKG0ueTxfLnl8fG0ueT09PV8ueSYmbS54PD1fLngpe2lmKCFfLkwpe3Y9Xy5QO2JyZWFrfV89Xy5MfWVsc2V7aWYoIV8uUil7dj1fO2JyZWFrfV89Xy5SfUtyLmluc2VydCh2LG0pLHZ8fChQcj1tKX19fX1mdW5jdGlvbiB6cih0KXt2YXIgZT10LmNpcmNsZTtlJiYoZS5QfHwoUHI9ZS5OKSxLci5yZW1vdmUoZSksUnIucHVzaChlKSxEcihlKSx0LmNpcmNsZT1udWxsKX12YXIganI9W107ZnVuY3Rpb24gVXIoKXtEcih0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gcXIodCl7dmFyIGU9anIucG9wKCl8fG5ldyBVcjtyZXR1cm4gZS5zaXRlPXQsZX1mdW5jdGlvbiBWcih0KXt6cih0KSxIci5yZW1vdmUodCksanIucHVzaCh0KSxEcih0KX1mdW5jdGlvbiBHcih0KXt2YXIgZT10LmNpcmNsZSxuPWUueCxyPWUuY3ksaT1bbixyXSxvPXQuUCxzPXQuTixhPVt0XTtWcih0KTtmb3IodmFyIHU9bzt1LmNpcmNsZSYmTWF0aC5hYnMobi11LmNpcmNsZS54KTxRciYmTWF0aC5hYnMoci11LmNpcmNsZS5jeSk8UXI7KW89dS5QLGEudW5zaGlmdCh1KSxWcih1KSx1PW87YS51bnNoaWZ0KHUpLHpyKHUpO2Zvcih2YXIgYz1zO2MuY2lyY2xlJiZNYXRoLmFicyhuLWMuY2lyY2xlLngpPFFyJiZNYXRoLmFicyhyLWMuY2lyY2xlLmN5KTxRcjspcz1jLk4sYS5wdXNoKGMpLFZyKGMpLGM9czthLnB1c2goYyksenIoYyk7dmFyIGwsaD1hLmxlbmd0aDtmb3IobD0xO2w8aDsrK2wpYz1hW2xdLHU9YVtsLTFdLElyKGMuZWRnZSx1LnNpdGUsYy5zaXRlLGkpO3U9YVswXSwoYz1hW2gtMV0pLmVkZ2U9QXIodS5zaXRlLGMuc2l0ZSxudWxsLGkpLGtyKHUpLGtyKGMpfWZ1bmN0aW9uIFlyKHQpe2Zvcih2YXIgZSxuLHIsaSxvPXRbMF0scz10WzFdLGE9SHIuXzthOylpZigocj1YcihhLHMpLW8pPlFyKWE9YS5MO2Vsc2V7aWYoISgoaT1vLVdyKGEscykpPlFyKSl7cj4tUXI/KGU9YS5QLG49YSk6aT4tUXI/KGU9YSxuPWEuTik6ZT1uPWE7YnJlYWt9aWYoIWEuUil7ZT1hO2JyZWFrfWE9YS5SfSFmdW5jdGlvbih0KXtaclt0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19KHQpO3ZhciB1PXFyKHQpO2lmKEhyLmluc2VydChlLHUpLGV8fG4pe2lmKGU9PT1uKXJldHVybiB6cihlKSxuPXFyKGUuc2l0ZSksSHIuaW5zZXJ0KHUsbiksdS5lZGdlPW4uZWRnZT1BcihlLnNpdGUsdS5zaXRlKSxrcihlKSx2b2lkIGtyKG4pO2lmKCFuKXJldHVybiB2b2lkKHUuZWRnZT1BcihlLnNpdGUsdS5zaXRlKSk7enIoZSksenIobik7dmFyIGM9ZS5zaXRlLGw9Y1swXSxoPWNbMV0sZj10WzBdLWwscD10WzFdLWgsZD1uLnNpdGUsZz1kWzBdLWwseT1kWzFdLWgsbT0yKihmKnktcCpnKSx2PWYqZitwKnAsXz1nKmcreSp5LHg9Wyh5KnYtcCpfKS9tK2wsKGYqXy1nKnYpL20raF07SXIobi5lZGdlLGMsZCx4KSx1LmVkZ2U9QXIoYyx0LG51bGwseCksbi5lZGdlPUFyKHQsZCxudWxsLHgpLGtyKGUpLGtyKG4pfX1mdW5jdGlvbiBYcih0LGUpe3ZhciBuPXQuc2l0ZSxyPW5bMF0saT1uWzFdLG89aS1lO2lmKCFvKXJldHVybiByO3ZhciBzPXQuUDtpZighcylyZXR1cm4tMS8wO3ZhciBhPShuPXMuc2l0ZSlbMF0sdT1uWzFdLGM9dS1lO2lmKCFjKXJldHVybiBhO3ZhciBsPWEtcixoPTEvby0xL2MsZj1sL2M7cmV0dXJuIGg/KC1mK01hdGguc3FydChmKmYtMipoKihsKmwvKC0yKmMpLXUrYy8yK2ktby8yKSkpL2grcjoocithKS8yfWZ1bmN0aW9uIFdyKHQsZSl7dmFyIG49dC5OO2lmKG4pcmV0dXJuIFhyKG4sZSk7dmFyIHI9dC5zaXRlO3JldHVybiByWzFdPT09ZT9yWzBdOjEvMH12YXIgSHIsWnIsS3IsSnIsUXI9MWUtNiwkcj0xZS0xMjtmdW5jdGlvbiB0aSh0LGUsbil7cmV0dXJuKHRbMF0tblswXSkqKGVbMV0tdFsxXSktKHRbMF0tZVswXSkqKG5bMV0tdFsxXSl9ZnVuY3Rpb24gZWkodCxlKXtyZXR1cm4gZVsxXS10WzFdfHxlWzBdLXRbMF19ZnVuY3Rpb24gbmkodCxlKXt2YXIgbixyLGksbz10LnNvcnQoZWkpLnBvcCgpO2ZvcihKcj1bXSxacj1uZXcgQXJyYXkodC5sZW5ndGgpLEhyPW5ldyBicixLcj1uZXcgYnI7OylpZihpPVByLG8mJighaXx8b1sxXTxpLnl8fG9bMV09PT1pLnkmJm9bMF08aS54KSkob1swXSE9PW58fG9bMV0hPT1yKSYmKFlyKG8pLG49b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO0dyKGkuYXJjKX1pZihmdW5jdGlvbigpe2Zvcih2YXIgdCxlLG4scixpPTAsbz1aci5sZW5ndGg7aTxvOysraSlpZigodD1acltpXSkmJihyPShlPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgcz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkocik7Zm9yKG49MDtuPHI7KytuKXNbbl09bixhW25dPVRyKHQsSnJbZVtuXV0pO2ZvcihzLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFbZV0tYVt0XX0pKSxuPTA7bjxyOysrbilhW25dPWVbc1tuXV07Zm9yKG49MDtuPHI7KytuKWVbbl09YVtuXX19KCksZSl7dmFyIHM9K2VbMF1bMF0sYT0rZVswXVsxXSx1PStlWzFdWzBdLGM9K2VbMV1bMV07KGZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaSxvPUpyLmxlbmd0aDtvLS07KUZyKGk9SnJbb10sdCxlLG4scikmJk1yKGksdCxlLG4scikmJihNYXRoLmFicyhpWzBdWzBdLWlbMV1bMF0pPlFyfHxNYXRoLmFicyhpWzBdWzFdLWlbMV1bMV0pPlFyKXx8ZGVsZXRlIEpyW29dfSkocyxhLHUsYyksZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxzLGEsdSxjLGwsaCxmLHAsZCxnLHk9WnIubGVuZ3RoLG09ITA7Zm9yKGk9MDtpPHk7KytpKWlmKG89WnJbaV0pe2ZvcihzPW8uc2l0ZSxhPSh1PW8uaGFsZmVkZ2VzKS5sZW5ndGg7YS0tOylKclt1W2FdXXx8dS5zcGxpY2UoYSwxKTtmb3IoYT0wLGM9dS5sZW5ndGg7YTxjOylkPShwPUxyKG8sSnJbdVthXV0pKVswXSxnPXBbMV0saD0obD1PcihvLEpyW3VbKythJWNdXSkpWzBdLGY9bFsxXSwoTWF0aC5hYnMoZC1oKT5Rcnx8TWF0aC5hYnMoZy1mKT5RcikmJih1LnNwbGljZShhLDAsSnIucHVzaChOcihzLHAsTWF0aC5hYnMoZC10KTxRciYmci1nPlFyP1t0LE1hdGguYWJzKGgtdCk8UXI/ZjpyXTpNYXRoLmFicyhnLXIpPFFyJiZuLWQ+UXI/W01hdGguYWJzKGYtcik8UXI/aDpuLHJdOk1hdGguYWJzKGQtbik8UXImJmctZT5Rcj9bbixNYXRoLmFicyhoLW4pPFFyP2Y6ZV06TWF0aC5hYnMoZy1lKTxRciYmZC10PlFyP1tNYXRoLmFicyhmLWUpPFFyP2g6dCxlXTpudWxsKSktMSksKytjKTtjJiYobT0hMSl9aWYobSl7dmFyIHYsXyx4LHc9MS8wO2ZvcihpPTAsbT1udWxsO2k8eTsrK2kpKG89WnJbaV0pJiYoeD0odj0ocz1vLnNpdGUpWzBdLXQpKnYrKF89c1sxXS1lKSpfKTx3JiYodz14LG09byk7aWYobSl7dmFyIGI9W3QsZV0sRD1bdCxyXSxFPVtuLHJdLEM9W24sZV07bS5oYWxmZWRnZXMucHVzaChKci5wdXNoKE5yKHM9bS5zaXRlLGIsRCkpLTEsSnIucHVzaChOcihzLEQsRSkpLTEsSnIucHVzaChOcihzLEUsQykpLTEsSnIucHVzaChOcihzLEMsYikpLTEpfX1mb3IoaT0wO2k8eTsrK2kpKG89WnJbaV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgWnJbaV0pfShzLGEsdSxjKX10aGlzLmVkZ2VzPUpyLHRoaXMuY2VsbHM9WnIsSHI9S3I9SnI9WnI9bnVsbH1mdW5jdGlvbiByaSh0KXtpZih2ZSh0KSYmKHQ9dC5iYm94KSx0JiYhQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImJib3ggaXMgaW52YWxpZCIpO3JldHVybiB0P2Z1bmN0aW9uKHQpe3JldHVybltNYXRoLnJhbmRvbSgpKih0WzJdLXRbMF0pK3RbMF0sTWF0aC5yYW5kb20oKSoodFszXS10WzFdKSt0WzFdXX0odCk6WzM2MCpvaSgpLDE4MCpvaSgpXX1mdW5jdGlvbiBpaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuW2VbMF0rdFswXSxlWzFdK3RbMV1dfX1mdW5jdGlvbiBvaSgpe3JldHVybiBNYXRoLnJhbmRvbSgpLS41fWZ1bmN0aW9uIHNpKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtpZigiRmVhdHVyZUNvbGxlY3Rpb24iIT09dC50eXBlKXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBtdXN0IGJlIGEgRmVhdHVyZUNvbGxlY3Rpb24iKTtpZihudWxsPT1lKXRocm93IG5ldyBFcnJvcigicHJvcGVydHkgaXMgcmVxdWlyZWQiKTtmb3IodmFyIHI9YWkodCxlKSxpPU9iamVjdC5rZXlzKHIpLG89MDtvPGkubGVuZ3RoO28rKyl7Zm9yKHZhciBzPWlbb10sYT1yW3NdLHU9W10sYz0wO2M8YS5sZW5ndGg7YysrKXUucHVzaCh0LmZlYXR1cmVzW2FbY11dKTtuKGxlKHUpLHMsbyl9fWZ1bmN0aW9uIGFpKHQsZSl7dmFyIG49e307cmV0dXJuIEVlKHQsKGZ1bmN0aW9uKHQscil7dmFyIGk9dC5wcm9wZXJ0aWVzfHx7fTtpZihpLmhhc093blByb3BlcnR5KGUpKXt2YXIgbz1pW2VdO24uaGFzT3duUHJvcGVydHkobyk/bltvXS5wdXNoKHIpOm5bb109W3JdfX0pKSxufWZ1bmN0aW9uIHVpKHQsZSl7aWYodm9pZCAwPT09dClyZXR1cm4hMTt2YXIgbj10eXBlb2YgZTtpZigibnVtYmVyIj09PW58fCJzdHJpbmciPT09bilyZXR1cm4gdC5oYXNPd25Qcm9wZXJ0eShlKTtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKylpZighdWkodCxlW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gY2kodCxlKX1mdW5jdGlvbiBjaSh0LGUpe2Zvcih2YXIgbj1PYmplY3Qua2V5cyhlKSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBpPW5bcl07aWYodFtpXSE9PWVbaV0pcmV0dXJuITF9cmV0dXJuITB9bmkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpuaSxwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKChmdW5jdGlvbihlKXt2YXIgbj1lLmhhbGZlZGdlcy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBPcihlLHRbbl0pfSkpO3JldHVybiBuLmRhdGE9ZS5zaXRlLmRhdGEsbn0pKX0sdHJpYW5nbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9W10sZT10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLmZvckVhY2goKGZ1bmN0aW9uKG4scil7aWYobz0oaT1uLmhhbGZlZGdlcykubGVuZ3RoKWZvcih2YXIgaSxvLHMsYT1uLnNpdGUsdT0tMSxjPWVbaVtvLTFdXSxsPWMubGVmdD09PWE/Yy5yaWdodDpjLmxlZnQ7Kyt1PG87KXM9bCxsPShjPWVbaVt1XV0pLmxlZnQ9PT1hP2MucmlnaHQ6Yy5sZWZ0LHMmJmwmJnI8cy5pbmRleCYmcjxsLmluZGV4JiZ0aShhLHMsbCk8MCYmdC5wdXNoKFthLmRhdGEscy5kYXRhLGwuZGF0YV0pfSkpLHR9LGxpbmtzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6dC5sZWZ0LmRhdGEsdGFyZ2V0OnQucmlnaHQuZGF0YX19KSl9LGZpbmQ6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcixpLG89dGhpcyxzPW8uX2ZvdW5kfHwwLGE9by5jZWxscy5sZW5ndGg7IShpPW8uY2VsbHNbc10pOylpZigrK3M+PWEpcmV0dXJuIG51bGw7dmFyIHU9dC1pLnNpdGVbMF0sYz1lLWkuc2l0ZVsxXSxsPXUqdStjKmM7ZG97aT1vLmNlbGxzW3I9c10scz1udWxsLGkuaGFsZmVkZ2VzLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciByPW8uZWRnZXNbbl0sYT1yLmxlZnQ7aWYoYSE9PWkuc2l0ZSYmYXx8KGE9ci5yaWdodCkpe3ZhciB1PXQtYVswXSxjPWUtYVsxXSxoPXUqdStjKmM7aDxsJiYobD1oLHM9YS5pbmRleCl9fSkpfXdoaWxlKG51bGwhPT1zKTtyZXR1cm4gby5fZm91bmQ9cixudWxsPT1ufHxsPD1uKm4/aS5zaXRlOm51bGx9fSxPYmplY3QuZnJlZXplKHtyYW5kb21Qb3NpdGlvbjpyaSxyYW5kb21Qb2ludDpmdW5jdGlvbih0LGUpe2lmKCF2ZShlPWV8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuPWUuYmJveDtudWxsPT10JiYodD0xKTtmb3IodmFyIHI9W10saT0wO2k8dDtpKyspci5wdXNoKGFlKHJpKG4pKSk7cmV0dXJuIGxlKHIpfSxyYW5kb21Qb2x5Z29uOmZ1bmN0aW9uKHQsZSl7aWYoIXZlKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5iYm94LHI9ZS5udW1fdmVydGljZXMsaT1lLm1heF9yYWRpYWxfbGVuZ3RoO251bGw9PXQmJih0PTEpLG1lKHIpfHwocj0xMCksbWUoaSl8fChpPTEwKTtmb3IodmFyIG89W10scz0wO3M8dDtzKyspe3ZhciBhPVtdLHU9QXJyYXkuYXBwbHkobnVsbCxuZXcgQXJyYXkocisxKSkubWFwKE1hdGgucmFuZG9tKTt1LmZvckVhY2goYyksdS5mb3JFYWNoKGwpLGFbYS5sZW5ndGgtMV09YVswXSxhPWEubWFwKGlpKHJpKG4pKSksby5wdXNoKHVlKFthXSkpfWZ1bmN0aW9uIGModCxlLG4pe25bZV09ZT4wP3QrbltlLTFdOnR9ZnVuY3Rpb24gbCh0KXt0PTIqdCpNYXRoLlBJL3VbdS5sZW5ndGgtMV07dmFyIGU9TWF0aC5yYW5kb20oKTthLnB1c2goW2UqaSpNYXRoLnNpbih0KSxlKmkqTWF0aC5jb3ModCldKX1yZXR1cm4gbGUobyl9LHJhbmRvbUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtpZighdmUoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj1lLmJib3gscj1lLm51bV92ZXJ0aWNlcyxpPWUubWF4X2xlbmd0aCxvPWUubWF4X3JvdGF0aW9uO251bGw9PXQmJih0PTEpLCghbWUocil8fHI8MikmJihyPTEwKSxtZShpKXx8KGk9MWUtNCksbWUobyl8fChvPU1hdGguUEkvOCk7Zm9yKHZhciBzPVtdLGE9MDthPHQ7YSsrKXtmb3IodmFyIHU9W3JpKG4pXSxjPTA7YzxyLTE7YysrKXt2YXIgbD0oMD09PWM/MipNYXRoLnJhbmRvbSgpKk1hdGguUEk6TWF0aC50YW4oKHVbY11bMV0tdVtjLTFdWzFdKS8odVtjXVswXS11W2MtMV1bMF0pKSkrKE1hdGgucmFuZG9tKCktLjUpKm8qMixoPU1hdGgucmFuZG9tKCkqaTt1LnB1c2goW3VbY11bMF0raCpNYXRoLmNvcyhsKSx1W2NdWzFdK2gqTWF0aC5zaW4obCldKX1zLnB1c2goY2UodSkpfXJldHVybiBsZShzKX19KSxPYmplY3QuZnJlZXplKHtnZXRDbHVzdGVyOmZ1bmN0aW9uKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7aWYoIkZlYXR1cmVDb2xsZWN0aW9uIiE9PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gbXVzdCBiZSBhIEZlYXR1cmVDb2xsZWN0aW9uIik7aWYobnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoImZpbHRlciBpcyByZXF1aXJlZCIpO3ZhciBuPVtdO3JldHVybiBFZSh0LChmdW5jdGlvbih0KXt1aSh0LnByb3BlcnRpZXMsZSkmJm4ucHVzaCh0KX0pKSxsZShuKX0sY2x1c3RlckVhY2g6c2ksY2x1c3RlclJlZHVjZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1yO3JldHVybiBzaSh0LGUsKGZ1bmN0aW9uKHQsZSxvKXtpPTA9PT1vJiZ2b2lkIDA9PT1yP3Q6bihpLHQsZSxvKX0pKSxpfSxjcmVhdGVCaW5zOmFpLGFwcGx5RmlsdGVyOnVpLHByb3BlcnRpZXNDb250YWluc0ZpbHRlcjpjaSxmaWx0ZXJQcm9wZXJ0aWVzOmZ1bmN0aW9uKHQsZSl7aWYoIWUpcmV0dXJue307aWYoIWUubGVuZ3RoKXJldHVybnt9O2Zvcih2YXIgbj17fSxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07dC5oYXNPd25Qcm9wZXJ0eShpKSYmKG5baV09dFtpXSl9cmV0dXJuIG59fSksImZpbGwiaW4gQXJyYXkucHJvdG90eXBlfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCJmaWxsIix7Y29uZmlndXJhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKG51bGw9PXRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcih0aGlzKyIgaXMgbm90IGFuIG9iamVjdCIpO3ZhciBlPU9iamVjdCh0aGlzKSxuPU1hdGgubWF4KE1hdGgubWluKGUubGVuZ3RoLDkwMDcxOTkyNTQ3NDA5OTEpLDApfHwwLHI9MSBpbiBhcmd1bWVudHMmJnBhcnNlSW50KE51bWJlcihhcmd1bWVudHNbMV0pLDEwKXx8MDtyPXI8MD9NYXRoLm1heChuK3IsMCk6TWF0aC5taW4ocixuKTt2YXIgaT0yIGluIGFyZ3VtZW50cyYmdm9pZCAwIT09YXJndW1lbnRzWzJdP3BhcnNlSW50KE51bWJlcihhcmd1bWVudHNbMl0pLDEwKXx8MDpuO2ZvcihpPWk8MD9NYXRoLm1heChuK2FyZ3VtZW50c1syXSwwKTpNYXRoLm1pbihpLG4pO3I8aTspZVtyXT10LCsrcjtyZXR1cm4gZX0sd3JpdGFibGU6ITB9KSxOdW1iZXIuaXNGaW5pdGU9TnVtYmVyLmlzRmluaXRlfHxmdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJmlzRmluaXRlKHQpfSxOdW1iZXIuaXNJbnRlZ2VyPU51bWJlci5pc0ludGVnZXJ8fGZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmaXNGaW5pdGUodCkmJk1hdGguZmxvb3IodCk9PT10fSxOdW1iZXIucGFyc2VGbG9hdD1OdW1iZXIucGFyc2VGbG9hdHx8cGFyc2VGbG9hdCxOdW1iZXIuaXNOYU49TnVtYmVyLmlzTmFOfHxmdW5jdGlvbih0KXtyZXR1cm4gdCE9dH0sTWF0aC50cnVuYz1NYXRoLnRydW5jfHxmdW5jdGlvbih0KXtyZXR1cm4gdDwwP01hdGguY2VpbCh0KTpNYXRoLmZsb29yKHQpfTt2YXIgbGk9ZnVuY3Rpb24oKXt9O2xpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxsaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbGl9LGxpLnByb3RvdHlwZS5lcXVhbHNXaXRoVG9sZXJhbmNlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5hYnModC1lKTw9bn07dmFyIGhpPWZ1bmN0aW9uKCl7fSxmaT1mdW5jdGlvbigpe30scGk9e01BWF9WQUxVRTp7Y29uZmlndXJhYmxlOiEwfX07ZmkuaXNOYU49ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlci5pc05hTih0KX0sZmkuZG91YmxlVG9Mb25nQml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZmkubG9uZ0JpdHNUb0RvdWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZmkuaXNJbmZpbml0ZT1mdW5jdGlvbih0KXtyZXR1cm4hTnVtYmVyLmlzRmluaXRlKHQpfSxwaS5NQVhfVkFMVUUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE51bWJlci5NQVhfVkFMVUV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGZpLHBpKTt2YXIgZGk9ZnVuY3Rpb24oKXt9LGdpPWZ1bmN0aW9uKCl7fSx5aT1mdW5jdGlvbigpe307ZnVuY3Rpb24gbWkoKXt9dmFyIHZpPWZ1bmN0aW9uIHQoKXtpZih0aGlzLng9bnVsbCx0aGlzLnk9bnVsbCx0aGlzLno9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLng9MCx0aGlzLnk9MCx0aGlzLno9dC5OVUxMX09SRElOQVRFO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLng9ZS54LHRoaXMueT1lLnksdGhpcy56PWUuen1lbHNlIDI9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLng9YXJndW1lbnRzWzBdLHRoaXMueT1hcmd1bWVudHNbMV0sdGhpcy56PXQuTlVMTF9PUkRJTkFURSk6Mz09PWFyZ3VtZW50cy5sZW5ndGgmJih0aGlzLng9YXJndW1lbnRzWzBdLHRoaXMueT1hcmd1bWVudHNbMV0sdGhpcy56PWFyZ3VtZW50c1syXSl9LF9pPXtEaW1lbnNpb25hbENvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0sc2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxOVUxMX09SRElOQVRFOntjb25maWd1cmFibGU6ITB9LFg6e2NvbmZpZ3VyYWJsZTohMH0sWTp7Y29uZmlndXJhYmxlOiEwfSxaOntjb25maWd1cmFibGU6ITB9fTt2aS5wcm90b3R5cGUuc2V0T3JkaW5hdGU9ZnVuY3Rpb24odCxlKXtzd2l0Y2godCl7Y2FzZSB2aS5YOnRoaXMueD1lO2JyZWFrO2Nhc2UgdmkuWTp0aGlzLnk9ZTticmVhaztjYXNlIHZpLlo6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgaGl9fSx2aS5wcm90b3R5cGUuZXF1YWxzMkQ9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiEodGhpcy54IT09dC54fHx0aGlzLnkhPT10LnkpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuISghbGkuZXF1YWxzV2l0aFRvbGVyYW5jZSh0aGlzLngsZS54LG4pfHwhbGkuZXF1YWxzV2l0aFRvbGVyYW5jZSh0aGlzLnksZS55LG4pKX19LHZpLnByb3RvdHlwZS5nZXRPcmRpbmF0ZT1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSB2aS5YOnJldHVybiB0aGlzLng7Y2FzZSB2aS5ZOnJldHVybiB0aGlzLnk7Y2FzZSB2aS5aOnJldHVybiB0aGlzLnp9dGhyb3cgbmV3IGhpfSx2aS5wcm90b3R5cGUuZXF1YWxzM0Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD09PXQueCYmdGhpcy55PT09dC55JiYodGhpcy56PT09dC56fHxmaS5pc05hTih0aGlzLnopKSYmZmkuaXNOYU4odC56KX0sdmkucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHZpJiZ0aGlzLmVxdWFsczJEKHQpfSx2aS5wcm90b3R5cGUuZXF1YWxJblo9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbGkuZXF1YWxzV2l0aFRvbGVyYW5jZSh0aGlzLnosdC56LGUpfSx2aS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMueDxlLng/LTE6dGhpcy54PmUueD8xOnRoaXMueTxlLnk/LTE6dGhpcy55PmUueT8xOjB9LHZpLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe30sdmkucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHZpKHRoaXMpfSx2aS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iKCIrdGhpcy54KyIsICIrdGhpcy55KyIsICIrdGhpcy56KyIpIn0sdmkucHJvdG90eXBlLmRpc3RhbmNlM0Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnkscj10aGlzLnotdC56O3JldHVybiBNYXRoLnNxcnQoZSplK24qbityKnIpfSx2aS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnk7cmV0dXJuIE1hdGguc3FydChlKmUrbipuKX0sdmkucHJvdG90eXBlLmhhc2hDb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9MTc7cmV0dXJuIHQ9MzcqKHQ9MzcqdCt2aS5oYXNoQ29kZSh0aGlzLngpKSt2aS5oYXNoQ29kZSh0aGlzLnkpfSx2aS5wcm90b3R5cGUuc2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXt0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQuen0sdmkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpLGdpLG1pXX0sdmkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHZpfSx2aS5oYXNoQ29kZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmaS5kb3VibGVUb0xvbmdCaXRzKGFyZ3VtZW50c1swXSk7cmV0dXJuIE1hdGgudHJ1bmMoMCl9fSxfaS5EaW1lbnNpb25hbENvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHhpfSxfaS5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDVjYmYyYzIzNWM3ZTU4MDB9LF9pLk5VTExfT1JESU5BVEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGZpLk5hTn0sX2kuWC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sX2kuWS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sX2kuWi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXModmksX2kpO3ZhciB4aT1mdW5jdGlvbih0KXtpZih0aGlzLl9kaW1lbnNpb25zVG9UZXN0PTIsMCE9PWFyZ3VtZW50cy5sZW5ndGgmJjE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07aWYoMiE9PWUmJjMhPT1lKXRocm93IG5ldyBoaTt0aGlzLl9kaW1lbnNpb25zVG9UZXN0PWV9fTt4aS5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQscj1lLGk9eGkuY29tcGFyZShuLngsci54KTtpZigwIT09aSlyZXR1cm4gaTt2YXIgbz14aS5jb21wYXJlKG4ueSxyLnkpO3JldHVybiAwIT09bz9vOnRoaXMuX2RpbWVuc2lvbnNUb1Rlc3Q8PTI/MDp4aS5jb21wYXJlKG4ueixyLnopfSx4aS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5beWldfSx4aS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geGl9LHhpLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOmZpLmlzTmFOKHQpP2ZpLmlzTmFOKGUpPzA6LTE6ZmkuaXNOYU4oZSk/MTowfTt2YXIgd2k9ZnVuY3Rpb24oKXt9O3dpLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24oKXt9LHdpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx3aS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gd2l9O3ZhciBiaT1mdW5jdGlvbigpe30sRGk9e0lOVEVSSU9SOntjb25maWd1cmFibGU6ITB9LEJPVU5EQVJZOntjb25maWd1cmFibGU6ITB9LEVYVEVSSU9SOntjb25maWd1cmFibGU6ITB9LE5PTkU6e2NvbmZpZ3VyYWJsZTohMH19O2JpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxiaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYml9LGJpLnRvTG9jYXRpb25TeW1ib2w9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgYmkuRVhURVJJT1I6cmV0dXJuImUiO2Nhc2UgYmkuQk9VTkRBUlk6cmV0dXJuImIiO2Nhc2UgYmkuSU5URVJJT1I6cmV0dXJuImkiO2Nhc2UgYmkuTk9ORTpyZXR1cm4iLSJ9dGhyb3cgbmV3IGhpfSxEaS5JTlRFUklPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sRGkuQk9VTkRBUlkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LERpLkVYVEVSSU9SLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxEaS5OT05FLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiaSxEaSk7dmFyIEVpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaW50ZXJmYWNlc18mJnQuaW50ZXJmYWNlc18oKS5pbmRleE9mKGUpPi0xfSxDaT1mdW5jdGlvbigpe30sU2k9e0xPR18xMDp7Y29uZmlndXJhYmxlOiEwfX07Q2kucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LENpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDaX0sQ2kubG9nMTA9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5sb2codCk7cmV0dXJuIGZpLmlzSW5maW5pdGUoZSl8fGZpLmlzTmFOKGUpP2U6ZS9DaS5MT0dfMTB9LENpLm1pbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10O3JldHVybiBlPGkmJihpPWUpLG48aSYmKGk9bikscjxpJiYoaT1yKSxpfSxDaS5jbGFtcD1mdW5jdGlvbigpe2lmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzJdJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTtyZXR1cm4gdDxlP2U6dD5uP246dH1pZihOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1syXSkmJk51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSYmTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMV0pKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl07cmV0dXJuIHI8aT9pOnI+bz9vOnJ9fSxDaS53cmFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8MD9lLSAtdCVlOnQlZX0sQ2kubWF4PWZ1bmN0aW9uKCl7aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1sxXSxlPWFyZ3VtZW50c1syXSxuPWFyZ3VtZW50c1swXTtyZXR1cm4gdD5uJiYobj10KSxlPm4mJihuPWUpLG59aWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXSxvPWFyZ3VtZW50c1szXSxzPWFyZ3VtZW50c1swXTtyZXR1cm4gcj5zJiYocz1yKSxpPnMmJihzPWkpLG8+cyYmKHM9byksc319LENpLmF2ZXJhZ2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4odCtlKS8yfSxTaS5MT0dfMTAuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubG9nKDEwKX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ2ksU2kpO3ZhciBBaT1mdW5jdGlvbih0KXt0aGlzLnN0cj10fTtBaS5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKHQpe3RoaXMuc3RyKz10fSxBaS5wcm90b3R5cGUuc2V0Q2hhckF0PWZ1bmN0aW9uKHQsZSl7dGhpcy5zdHI9dGhpcy5zdHIuc3Vic3RyKDAsdCkrZSt0aGlzLnN0ci5zdWJzdHIodCsxKX0sQWkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0cn07dmFyIE5pPWZ1bmN0aW9uKHQpe3RoaXMudmFsdWU9dH07TmkucHJvdG90eXBlLmludFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9LE5pLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudmFsdWU8dD8tMTp0aGlzLnZhbHVlPnQ/MTowfSxOaS5pc05hTj1mdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyLmlzTmFOKHQpfTt2YXIgSWk9ZnVuY3Rpb24oKXt9O0lpLmlzV2hpdGVzcGFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdDw9MzImJnQ+PTB8fDEyNz09PXR9LElpLnRvVXBwZXJDYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9O3ZhciBNaT1mdW5jdGlvbiB0KCl7aWYodGhpcy5faGk9MCx0aGlzLl9sbz0wLDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuaW5pdCgwKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuaW5pdChlKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCl7dmFyIG49YXJndW1lbnRzWzBdO3RoaXMuaW5pdChuKX1lbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgYXJndW1lbnRzWzBdKXt0LmNhbGwodGhpcyx0LnBhcnNlKGFyZ3VtZW50c1swXSkpfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV07dGhpcy5pbml0KHIsaSl9fSxGaT17UEk6e2NvbmZpZ3VyYWJsZTohMH0sVFdPX1BJOntjb25maWd1cmFibGU6ITB9LFBJXzI6e2NvbmZpZ3VyYWJsZTohMH0sRTp7Y29uZmlndXJhYmxlOiEwfSxOYU46e2NvbmZpZ3VyYWJsZTohMH0sRVBTOntjb25maWd1cmFibGU6ITB9LFNQTElUOntjb25maWd1cmFibGU6ITB9LE1BWF9QUklOVF9ESUdJVFM6e2NvbmZpZ3VyYWJsZTohMH0sVEVOOntjb25maWd1cmFibGU6ITB9LE9ORTp7Y29uZmlndXJhYmxlOiEwfSxTQ0lfTk9UX0VYUE9ORU5UX0NIQVI6e2NvbmZpZ3VyYWJsZTohMH0sU0NJX05PVF9aRVJPOntjb25maWd1cmFibGU6ITB9fTtNaS5wcm90b3R5cGUubGU9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMuX2hpPHQuX2hpfHx0aGlzLl9oaT09PXQuX2hpKSYmdGhpcy5fbG88PXQuX2xvfSxNaS5wcm90b3R5cGUuZXh0cmFjdFNpZ25pZmljYW50RGlnaXRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5hYnMoKSxyPU1pLm1hZ25pdHVkZShuLl9oaSksaT1NaS5URU4ucG93KHIpOyhuPW4uZGl2aWRlKGkpKS5ndChNaS5URU4pPyhuPW4uZGl2aWRlKE1pLlRFTikscis9MSk6bi5sdChNaS5PTkUpJiYobj1uLm11bHRpcGx5KE1pLlRFTiksci09MSk7Zm9yKHZhciBvPXIrMSxzPW5ldyBBaSxhPU1pLk1BWF9QUklOVF9ESUdJVFMtMSx1PTA7dTw9YTt1Kyspe3QmJnU9PT1vJiZzLmFwcGVuZCgiLiIpO3ZhciBjPU1hdGgudHJ1bmMobi5faGkpO2lmKGM8MClicmVhazt2YXIgbD0hMSxoPTA7Yz45PyhsPSEwLGg9IjkiKTpoPSIwIitjLHMuYXBwZW5kKGgpLG49bi5zdWJ0cmFjdChNaS52YWx1ZU9mKGMpKS5tdWx0aXBseShNaS5URU4pLGwmJm4uc2VsZkFkZChNaS5URU4pO3ZhciBmPSEwLHA9TWkubWFnbml0dWRlKG4uX2hpKTtpZihwPDAmJk1hdGguYWJzKHApPj1hLXUmJihmPSExKSwhZilicmVha31yZXR1cm4gZVswXT1yLHMudG9TdHJpbmcoKX0sTWkucHJvdG90eXBlLnNxcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLm11bHRpcGx5KHRoaXMpfSxNaS5wcm90b3R5cGUuZG91YmxlVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGkrdGhpcy5fbG99LE1pLnByb3RvdHlwZS5zdWJ0cmFjdD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5hZGQodC5uZWdhdGUoKSl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5hZGQoLWUpfX0sTWkucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2hpPT09dC5faGkmJnRoaXMuX2xvPT09dC5fbG99fSxNaS5wcm90b3R5cGUuaXNaZXJvPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9oaSYmMD09PXRoaXMuX2xvfSxNaS5wcm90b3R5cGUuc2VsZlN1YnRyYWN0PWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmlzTmFOKCk/dGhpczp0aGlzLnNlbGZBZGQoLXQuX2hpLC10Ll9sbyl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5pc05hTigpP3RoaXM6dGhpcy5zZWxmQWRkKC1lLDApfX0sTWkucHJvdG90eXBlLmdldFNwZWNpYWxOdW1iZXJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1plcm8oKT8iMC4wIjp0aGlzLmlzTmFOKCk/Ik5hTiAiOm51bGx9LE1pLnByb3RvdHlwZS5taW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGUodCk/dGhpczp0fSxNaS5wcm90b3R5cGUuc2VsZkRpdmlkZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc2VsZkRpdmlkZSh0Ll9oaSx0Ll9sbyl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmRGl2aWRlKGUsMCl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuLHIsaSxvLHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdLHU9bnVsbCxjPW51bGwsbD1udWxsLGg9bnVsbDtyZXR1cm4gaT10aGlzLl9oaS9zLGg9KHU9KGw9TWkuU1BMSVQqaSktKHU9bC1pKSkqKGM9KGg9TWkuU1BMSVQqcyktKGM9aC1zKSktKG89aSpzKSt1KihyPXMtYykrKG49aS11KSpjK24qcixoPWkrKGw9KHRoaXMuX2hpLW8taCt0aGlzLl9sby1pKmEpL3MpLHRoaXMuX2hpPWgsdGhpcy5fbG89aS1oK2wsdGhpc319LE1pLnByb3RvdHlwZS5kdW1wPWZ1bmN0aW9uKCl7cmV0dXJuIkREPCIrdGhpcy5faGkrIiwgIit0aGlzLl9sbysiPiJ9LE1pLnByb3RvdHlwZS5kaXZpZGU9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdCxlLG4scixpPWFyZ3VtZW50c1swXSxvPW51bGwscz1udWxsLGE9bnVsbCx1PW51bGw7cmV0dXJuIHQ9KG49dGhpcy5faGkvaS5faGkpLShvPShhPU1pLlNQTElUKm4pLShvPWEtbikpLHU9byoocz0odT1NaS5TUExJVCppLl9oaSktKHM9dS1pLl9oaSkpLShyPW4qaS5faGkpK28qKGU9aS5faGktcykrdCpzK3QqZSxhPSh0aGlzLl9oaS1yLXUrdGhpcy5fbG8tbippLl9sbykvaS5faGksbmV3IE1pKHU9bithLG4tdSthKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGM9YXJndW1lbnRzWzBdO3JldHVybiBmaS5pc05hTihjKT9NaS5jcmVhdGVOYU4oKTpNaS5jb3B5KHRoaXMpLnNlbGZEaXZpZGUoYywwKX19LE1pLnByb3RvdHlwZS5nZT1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5faGk+dC5faGl8fHRoaXMuX2hpPT09dC5faGkpJiZ0aGlzLl9sbz49dC5fbG99LE1pLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7aWYoMD09PXQpcmV0dXJuIE1pLnZhbHVlT2YoMSk7dmFyIGU9bmV3IE1pKHRoaXMpLG49TWkudmFsdWVPZigxKSxyPU1hdGguYWJzKHQpO2lmKHI+MSlmb3IoO3I+MDspciUyPT0xJiZuLnNlbGZNdWx0aXBseShlKSwoci89Mik+MCYmKGU9ZS5zcXIoKSk7ZWxzZSBuPWU7cmV0dXJuIHQ8MD9uLnJlY2lwcm9jYWwoKTpufSxNaS5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbigpe2lmKHRoaXMuaXNOYU4oKSlyZXR1cm4gTWkuTmFOO3ZhciB0PU1hdGguY2VpbCh0aGlzLl9oaSksZT0wO3JldHVybiB0PT09dGhpcy5faGkmJihlPU1hdGguY2VpbCh0aGlzLl9sbykpLG5ldyBNaSh0LGUpfSxNaS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX2hpPGUuX2hpPy0xOnRoaXMuX2hpPmUuX2hpPzE6dGhpcy5fbG88ZS5fbG8/LTE6dGhpcy5fbG8+ZS5fbG8/MTowfSxNaS5wcm90b3R5cGUucmludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/dGhpczp0aGlzLmFkZCguNSkuZmxvb3IoKX0sTWkucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmluaXQodCksdGhpc31pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmluaXQoZSksdGhpc319LE1pLnByb3RvdHlwZS5tYXg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2UodCk/dGhpczp0fSxNaS5wcm90b3R5cGUuc3FydD1mdW5jdGlvbigpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIE1pLnZhbHVlT2YoMCk7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIE1pLk5hTjt2YXIgdD0xL01hdGguc3FydCh0aGlzLl9oaSksZT10aGlzLl9oaSp0LG49TWkudmFsdWVPZihlKSxyPXRoaXMuc3VidHJhY3Qobi5zcXIoKSkuX2hpKiguNSp0KTtyZXR1cm4gbi5hZGQocil9LE1pLnByb3RvdHlwZS5zZWxmQWRkPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmQWRkKHQuX2hpLHQuX2xvKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGUsbixyLGksbyxzPWFyZ3VtZW50c1swXSxhPW51bGw7cmV0dXJuIGE9KHI9dGhpcy5faGkrcyktKGk9ci10aGlzLl9oaSksbj0obz0oYT1zLWkrKHRoaXMuX2hpLWEpKSt0aGlzLl9sbykrKHItKGU9citvKSksdGhpcy5faGk9ZStuLHRoaXMuX2xvPW4rKGUtdGhpcy5faGkpLHRoaXN9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB1LGMsbCxoLGY9YXJndW1lbnRzWzBdLHA9YXJndW1lbnRzWzFdLGQ9bnVsbCxnPW51bGwseT1udWxsO2w9dGhpcy5faGkrZixjPXRoaXMuX2xvK3AsZz1sLSh5PWwtdGhpcy5faGkpLGQ9Yy0oaD1jLXRoaXMuX2xvKTt2YXIgbT0odT1sKyh5PShnPWYteSsodGhpcy5faGktZykpK2MpKSsoeT0oZD1wLWgrKHRoaXMuX2xvLWQpKSsoeSsobC11KSkpLHY9eSsodS1tKTtyZXR1cm4gdGhpcy5faGk9bSx0aGlzLl9sbz12LHRoaXN9fSxNaS5wcm90b3R5cGUuc2VsZk11bHRpcGx5PWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmTXVsdGlwbHkodC5faGksdC5fbG8pfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc2VsZk11bHRpcGx5KGUsMCl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuLHIsaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1udWxsLGE9bnVsbCx1PW51bGwsYz1udWxsO3M9KHU9TWkuU1BMSVQqdGhpcy5faGkpLXRoaXMuX2hpLGM9TWkuU1BMSVQqaSxzPXUtcyxuPXRoaXMuX2hpLXMsYT1jLWk7dmFyIGw9KHU9dGhpcy5faGkqaSkrKGM9cyooYT1jLWEpLXUrcyoocj1pLWEpK24qYStuKnIrKHRoaXMuX2hpKm8rdGhpcy5fbG8qaSkpLGg9Yysocz11LWwpO3JldHVybiB0aGlzLl9oaT1sLHRoaXMuX2xvPWgsdGhpc319LE1pLnByb3RvdHlwZS5zZWxmU3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZk11bHRpcGx5KHRoaXMpfSxNaS5wcm90b3R5cGUuZmxvb3I9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTmFOKCkpcmV0dXJuIE1pLk5hTjt2YXIgdD1NYXRoLmZsb29yKHRoaXMuX2hpKSxlPTA7cmV0dXJuIHQ9PT10aGlzLl9oaSYmKGU9TWF0aC5mbG9vcih0aGlzLl9sbykpLG5ldyBNaSh0LGUpfSxNaS5wcm90b3R5cGUubmVnYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOYU4oKT90aGlzOm5ldyBNaSgtdGhpcy5faGksLXRoaXMuX2xvKX0sTWkucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7fSxNaS5wcm90b3R5cGUubXVsdGlwbHk9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHQuaXNOYU4oKT9NaS5jcmVhdGVOYU4oKTpNaS5jb3B5KHRoaXMpLnNlbGZNdWx0aXBseSh0KX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBmaS5pc05hTihlKT9NaS5jcmVhdGVOYU4oKTpNaS5jb3B5KHRoaXMpLnNlbGZNdWx0aXBseShlLDApfX0sTWkucHJvdG90eXBlLmlzTmFOPWZ1bmN0aW9uKCl7cmV0dXJuIGZpLmlzTmFOKHRoaXMuX2hpKX0sTWkucHJvdG90eXBlLmludFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgudHJ1bmModGhpcy5faGkpfSxNaS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD1NaS5tYWduaXR1ZGUodGhpcy5faGkpO3JldHVybiB0Pj0tMyYmdDw9MjA/dGhpcy50b1N0YW5kYXJkTm90YXRpb24oKTp0aGlzLnRvU2NpTm90YXRpb24oKX0sTWkucHJvdG90eXBlLnRvU3RhbmRhcmROb3RhdGlvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0U3BlY2lhbE51bWJlclN0cmluZygpO2lmKG51bGwhPT10KXJldHVybiB0O3ZhciBlPW5ldyBBcnJheSgxKS5maWxsKG51bGwpLG49dGhpcy5leHRyYWN0U2lnbmlmaWNhbnREaWdpdHMoITAsZSkscj1lWzBdKzEsaT1uO2lmKCIuIj09PW4uY2hhckF0KDApKWk9IjAiK247ZWxzZSBpZihyPDApaT0iMC4iK01pLnN0cmluZ09mQ2hhcigiMCIsLXIpK247ZWxzZSBpZigtMT09PW4uaW5kZXhPZigiLiIpKXt2YXIgbz1yLW4ubGVuZ3RoO2k9bitNaS5zdHJpbmdPZkNoYXIoIjAiLG8pKyIuMCJ9cmV0dXJuIHRoaXMuaXNOZWdhdGl2ZSgpPyItIitpOml9LE1pLnByb3RvdHlwZS5yZWNpcHJvY2FsPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaT1udWxsLG89bnVsbCxzPW51bGwsYT1udWxsO3Q9KG49MS90aGlzLl9oaSktKGk9KHM9TWkuU1BMSVQqbiktKGk9cy1uKSksbz0oYT1NaS5TUExJVCp0aGlzLl9oaSktdGhpcy5faGk7dmFyIHU9bisocz0oMS0ocj1uKnRoaXMuX2hpKS0oYT1pKihvPWEtbyktcitpKihlPXRoaXMuX2hpLW8pK3Qqbyt0KmUpLW4qdGhpcy5fbG8pL3RoaXMuX2hpKTtyZXR1cm4gbmV3IE1pKHUsbi11K3MpfSxNaS5wcm90b3R5cGUudG9TY2lOb3RhdGlvbj1mdW5jdGlvbigpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIE1pLlNDSV9OT1RfWkVSTzt2YXIgdD10aGlzLmdldFNwZWNpYWxOdW1iZXJTdHJpbmcoKTtpZihudWxsIT09dClyZXR1cm4gdDt2YXIgZT1uZXcgQXJyYXkoMSkuZmlsbChudWxsKSxuPXRoaXMuZXh0cmFjdFNpZ25pZmljYW50RGlnaXRzKCExLGUpLHI9TWkuU0NJX05PVF9FWFBPTkVOVF9DSEFSK2VbMF07aWYoIjAiPT09bi5jaGFyQXQoMCkpdGhyb3cgbmV3IEVycm9yKCJGb3VuZCBsZWFkaW5nIHplcm86ICIrbik7dmFyIGk9IiI7bi5sZW5ndGg+MSYmKGk9bi5zdWJzdHJpbmcoMSkpO3ZhciBvPW4uY2hhckF0KDApKyIuIitpO3JldHVybiB0aGlzLmlzTmVnYXRpdmUoKT8iLSIrbytyOm8rcn0sTWkucHJvdG90eXBlLmFicz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/TWkuTmFOOnRoaXMuaXNOZWdhdGl2ZSgpP3RoaXMubmVnYXRlKCk6bmV3IE1pKHRoaXMpfSxNaS5wcm90b3R5cGUuaXNQb3NpdGl2ZT1mdW5jdGlvbigpe3JldHVybih0aGlzLl9oaT4wfHwwPT09dGhpcy5faGkpJiZ0aGlzLl9sbz4wfSxNaS5wcm90b3R5cGUubHQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMuX2hpPHQuX2hpfHx0aGlzLl9oaT09PXQuX2hpKSYmdGhpcy5fbG88dC5fbG99LE1pLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIE1pLmNvcHkodGhpcykuc2VsZkFkZCh0KX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBNaS5jb3B5KHRoaXMpLnNlbGZBZGQoZSl9fSxNaS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2hpPXQsdGhpcy5fbG89MH1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9oaT1lLl9oaSx0aGlzLl9sbz1lLl9sb319ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMuX2hpPW4sdGhpcy5fbG89cn19LE1pLnByb3RvdHlwZS5ndD1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5faGk+dC5faGl8fHRoaXMuX2hpPT09dC5faGkpJiZ0aGlzLl9sbz50Ll9sb30sTWkucHJvdG90eXBlLmlzTmVnYXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5faGk8MHx8MD09PXRoaXMuX2hpKSYmdGhpcy5fbG88MH0sTWkucHJvdG90eXBlLnRydW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOYU4oKT9NaS5OYU46dGhpcy5pc1Bvc2l0aXZlKCk/dGhpcy5mbG9vcigpOnRoaXMuY2VpbCgpfSxNaS5wcm90b3R5cGUuc2lnbnVtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hpPjA/MTp0aGlzLl9oaTwwPy0xOnRoaXMuX2xvPjA/MTp0aGlzLl9sbzwwPy0xOjB9LE1pLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblttaSxkaSxnaV19LE1pLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBNaX0sTWkuc3FyPWZ1bmN0aW9uKHQpe3JldHVybiBNaS52YWx1ZU9mKHQpLnNlbGZNdWx0aXBseSh0KX0sTWkudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYXJndW1lbnRzWzBdP01pLnBhcnNlKGFyZ3VtZW50c1swXSk6Im51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0/bmV3IE1pKGFyZ3VtZW50c1swXSk6dm9pZCAwfSxNaS5zcXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBNaS52YWx1ZU9mKHQpLnNxcnQoKX0sTWkucGFyc2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDtJaS5pc1doaXRlc3BhY2UodC5jaGFyQXQoZSkpOyllKys7dmFyIHI9ITE7aWYoZTxuKXt2YXIgaT10LmNoYXJBdChlKTsoIi0iPT09aXx8IisiPT09aSkmJihlKyssIi0iPT09aSYmKHI9ITApKX1mb3IodmFyIG89bmV3IE1pLHM9MCxhPTAsdT0wOyEoZT49bik7KXt2YXIgYz10LmNoYXJBdChlKTtpZihlKyssSWkuaXNEaWdpdChjKSl7dmFyIGw9Yy0iMCI7by5zZWxmTXVsdGlwbHkoTWkuVEVOKSxvLnNlbGZBZGQobCkscysrfWVsc2V7aWYoIi4iIT09Yyl7aWYoImUiPT09Y3x8IkUiPT09Yyl7dmFyIGg9dC5zdWJzdHJpbmcoZSk7dHJ5e3U9TmkucGFyc2VJbnQoaCl9Y2F0Y2goZSl7dGhyb3cgZSBpbnN0YW5jZW9mIEVycm9yP25ldyBFcnJvcigiSW52YWxpZCBleHBvbmVudCAiK2grIiBpbiBzdHJpbmcgIit0KTplfWJyZWFrfXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBjaGFyYWN0ZXIgJyIrYysiJyBhdCBwb3NpdGlvbiAiK2UrIiBpbiBzdHJpbmcgIit0KX1hPXN9fXZhciBmPW8scD1zLWEtdTtpZigwPT09cClmPW87ZWxzZSBpZihwPjApe3ZhciBkPU1pLlRFTi5wb3cocCk7Zj1vLmRpdmlkZShkKX1lbHNlIGlmKHA8MCl7dmFyIGc9TWkuVEVOLnBvdygtcCk7Zj1vLm11bHRpcGx5KGcpfXJldHVybiByP2YubmVnYXRlKCk6Zn0sTWkuY3JlYXRlTmFOPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNaShmaS5OYU4sZmkuTmFOKX0sTWkuY29weT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IE1pKHQpfSxNaS5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5hYnModCksbj1NYXRoLmxvZyhlKS9NYXRoLmxvZygxMCkscj1NYXRoLnRydW5jKE1hdGguZmxvb3IobikpO3JldHVybiAxMCpNYXRoLnBvdygxMCxyKTw9ZSYmKHIrPTEpLHJ9LE1pLnN0cmluZ09mQ2hhcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgQWkscj0wO3I8ZTtyKyspbi5hcHBlbmQodCk7cmV0dXJuIG4udG9TdHJpbmcoKX0sRmkuUEkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNaSgzLjE0MTU5MjY1MzU4OTc5MywxMjI0NjQ2Nzk5MTQ3MzUzMmUtMzIpfSxGaS5UV09fUEkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNaSg2LjI4MzE4NTMwNzE3OTU4NiwyNDQ5MjkzNTk4Mjk0NzA2NGUtMzIpfSxGaS5QSV8yLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgTWkoMS41NzA3OTYzMjY3OTQ4OTY2LDYxMjMyMzM5OTU3MzY3NjZlLTMyKX0sRmkuRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE1pKDIuNzE4MjgxODI4NDU5MDQ1LDE0NDU2NDY4OTE3MjkyNTAyZS0zMil9LEZpLk5hTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE1pKGZpLk5hTixmaS5OYU4pfSxGaS5FUFMuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDEyMzI1OTUxNjQ0MDc4M2UtNDZ9LEZpLlNQTElULmdldD1mdW5jdGlvbigpe3JldHVybiAxMzQyMTc3Mjl9LEZpLk1BWF9QUklOVF9ESUdJVFMuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDMyfSxGaS5URU4uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1pLnZhbHVlT2YoMTApfSxGaS5PTkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1pLnZhbHVlT2YoMSl9LEZpLlNDSV9OT1RfRVhQT05FTlRfQ0hBUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iRSJ9LEZpLlNDSV9OT1RfWkVSTy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iMC4wRTAifSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhNaSxGaSk7dmFyIFRpPWZ1bmN0aW9uKCl7fSxPaT17RFBfU0FGRV9FUFNJTE9OOntjb25maWd1cmFibGU6ITB9fTtUaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sVGkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFRpfSxUaS5vcmllbnRhdGlvbkluZGV4PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1UaS5vcmllbnRhdGlvbkluZGV4RmlsdGVyKHQsZSxuKTtpZihyPD0xKXJldHVybiByO3ZhciBpPU1pLnZhbHVlT2YoZS54KS5zZWxmQWRkKC10LngpLG89TWkudmFsdWVPZihlLnkpLnNlbGZBZGQoLXQueSkscz1NaS52YWx1ZU9mKG4ueCkuc2VsZkFkZCgtZS54KSxhPU1pLnZhbHVlT2Yobi55KS5zZWxmQWRkKC1lLnkpO3JldHVybiBpLnNlbGZNdWx0aXBseShhKS5zZWxmU3VidHJhY3Qoby5zZWxmTXVsdGlwbHkocykpLnNpZ251bSgpfSxUaS5zaWduT2ZEZXQyeDI9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHQubXVsdGlwbHkocikuc2VsZlN1YnRyYWN0KGUubXVsdGlwbHkobikpLnNpZ251bSgpfSxUaS5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9TWkudmFsdWVPZihyLnkpLnNlbGZTdWJ0cmFjdChuLnkpLnNlbGZNdWx0aXBseShNaS52YWx1ZU9mKGUueCkuc2VsZlN1YnRyYWN0KHQueCkpLG89TWkudmFsdWVPZihyLngpLnNlbGZTdWJ0cmFjdChuLngpLnNlbGZNdWx0aXBseShNaS52YWx1ZU9mKGUueSkuc2VsZlN1YnRyYWN0KHQueSkpLHM9aS5zdWJ0cmFjdChvKSxhPU1pLnZhbHVlT2Yoci54KS5zZWxmU3VidHJhY3Qobi54KS5zZWxmTXVsdGlwbHkoTWkudmFsdWVPZih0LnkpLnNlbGZTdWJ0cmFjdChuLnkpKSx1PU1pLnZhbHVlT2Yoci55KS5zZWxmU3VidHJhY3Qobi55KS5zZWxmTXVsdGlwbHkoTWkudmFsdWVPZih0LngpLnNlbGZTdWJ0cmFjdChuLngpKSxjPWEuc3VidHJhY3QodSkuc2VsZkRpdmlkZShzKS5kb3VibGVWYWx1ZSgpLGw9TWkudmFsdWVPZih0LngpLnNlbGZBZGQoTWkudmFsdWVPZihlLngpLnNlbGZTdWJ0cmFjdCh0LngpLnNlbGZNdWx0aXBseShjKSkuZG91YmxlVmFsdWUoKSxoPU1pLnZhbHVlT2YoZS54KS5zZWxmU3VidHJhY3QodC54KS5zZWxmTXVsdGlwbHkoTWkudmFsdWVPZih0LnkpLnNlbGZTdWJ0cmFjdChuLnkpKSxmPU1pLnZhbHVlT2YoZS55KS5zZWxmU3VidHJhY3QodC55KS5zZWxmTXVsdGlwbHkoTWkudmFsdWVPZih0LngpLnNlbGZTdWJ0cmFjdChuLngpKSxwPWguc3VidHJhY3QoZikuc2VsZkRpdmlkZShzKS5kb3VibGVWYWx1ZSgpLGQ9TWkudmFsdWVPZihuLnkpLnNlbGZBZGQoTWkudmFsdWVPZihyLnkpLnNlbGZTdWJ0cmFjdChuLnkpLnNlbGZNdWx0aXBseShwKSkuZG91YmxlVmFsdWUoKTtyZXR1cm4gbmV3IHZpKGwsZCl9LFRpLm9yaWVudGF0aW9uSW5kZXhGaWx0ZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW51bGwsaT0odC54LW4ueCkqKGUueS1uLnkpLG89KHQueS1uLnkpKihlLngtbi54KSxzPWktbztpZihpPjApe2lmKG88PTApcmV0dXJuIFRpLnNpZ251bShzKTtyPWkrb31lbHNle2lmKCEoaTwwKSlyZXR1cm4gVGkuc2lnbnVtKHMpO2lmKG8+PTApcmV0dXJuIFRpLnNpZ251bShzKTtyPS1pLW99dmFyIGE9VGkuRFBfU0FGRV9FUFNJTE9OKnI7cmV0dXJuIHM+PWF8fC1zPj1hP1RpLnNpZ251bShzKToyfSxUaS5zaWdudW09ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD8xOnQ8MD8tMTowfSxPaS5EUF9TQUZFX0VQU0lMT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTE1fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhUaSxPaSk7dmFyIExpPWZ1bmN0aW9uKCl7fSxQaT17WDp7Y29uZmlndXJhYmxlOiEwfSxZOntjb25maWd1cmFibGU6ITB9LFo6e2NvbmZpZ3VyYWJsZTohMH0sTTp7Y29uZmlndXJhYmxlOiEwfX07UGkuWC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sUGkuWS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sUGkuWi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sUGkuTS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gM30sTGkucHJvdG90eXBlLnNldE9yZGluYXRlPWZ1bmN0aW9uKHQsZSxuKXt9LExpLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7fSxMaS5wcm90b3R5cGUuZ2V0T3JkaW5hdGU9ZnVuY3Rpb24odCxlKXt9LExpLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7fSxMaS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZUNvcHk9ZnVuY3Rpb24odCl7fSxMaS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7fSxMaS5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbih0KXt9LExpLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe30sTGkucHJvdG90eXBlLmV4cGFuZEVudmVsb3BlPWZ1bmN0aW9uKHQpe30sTGkucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt9LExpLnByb3RvdHlwZS5nZXRZPWZ1bmN0aW9uKHQpe30sTGkucHJvdG90eXBlLnRvQ29vcmRpbmF0ZUFycmF5PWZ1bmN0aW9uKCl7fSxMaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZ2ldfSxMaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTGl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKExpLFBpKTt2YXIgUmk9ZnVuY3Rpb24oKXt9LEJpPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcywiUHJvamVjdGl2ZSBwb2ludCBub3QgcmVwcmVzZW50YWJsZSBvbiB0aGUgQ2FydGVzaWFuIHBsYW5lLiIpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShSaSksa2k9ZnVuY3Rpb24oKXt9O2tpLmFycmF5Y29weT1mdW5jdGlvbih0LGUsbixyLGkpe2Zvcih2YXIgbz0wLHM9ZTtzPGUraTtzKyspbltyK29dPXRbc10sbysrfSxraS5nZXRQcm9wZXJ0eT1mdW5jdGlvbih0KXtyZXR1cm57ImxpbmUuc2VwYXJhdG9yIjoiXG4ifVt0XX07dmFyIHppPWZ1bmN0aW9uIHQoKXtpZih0aGlzLng9bnVsbCx0aGlzLnk9bnVsbCx0aGlzLnc9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLng9MCx0aGlzLnk9MCx0aGlzLnc9MTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy54PWUueCx0aGlzLnk9ZS55LHRoaXMudz0xfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMueD1uLHRoaXMueT1yLHRoaXMudz0xfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0JiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHQpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXTt0aGlzLng9aS55Km8udy1vLnkqaS53LHRoaXMueT1vLngqaS53LWkueCpvLncsdGhpcy53PWkueCpvLnktby54KmkueX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXTt0aGlzLng9cy55LWEueSx0aGlzLnk9YS54LXMueCx0aGlzLnc9cy54KmEueS1hLngqcy55fX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdT1hcmd1bWVudHNbMF0sYz1hcmd1bWVudHNbMV0sbD1hcmd1bWVudHNbMl07dGhpcy54PXUsdGhpcy55PWMsdGhpcy53PWx9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGg9YXJndW1lbnRzWzBdLGY9YXJndW1lbnRzWzFdLHA9YXJndW1lbnRzWzJdLGQ9YXJndW1lbnRzWzNdLGc9aC55LWYueSx5PWYueC1oLngsbT1oLngqZi55LWYueCpoLnksdj1wLnktZC55LF89ZC54LXAueCx4PXAueCpkLnktZC54KnAueTt0aGlzLng9eSp4LV8qbSx0aGlzLnk9diptLWcqeCx0aGlzLnc9ZypfLXYqeX19O3ppLnByb3RvdHlwZS5nZXRZPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55L3RoaXMudztpZihmaS5pc05hTih0KXx8ZmkuaXNJbmZpbml0ZSh0KSl0aHJvdyBuZXcgQmk7cmV0dXJuIHR9LHppLnByb3RvdHlwZS5nZXRYPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy54L3RoaXMudztpZihmaS5pc05hTih0KXx8ZmkuaXNJbmZpbml0ZSh0KSl0aHJvdyBuZXcgQmk7cmV0dXJuIHR9LHppLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHZpO3JldHVybiB0Lng9dGhpcy5nZXRYKCksdC55PXRoaXMuZ2V0WSgpLHR9LHppLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx6aS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geml9LHppLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10LnktZS55LG89ZS54LXQueCxzPXQueCplLnktZS54KnQueSxhPW4ueS1yLnksdT1yLngtbi54LGM9bi54KnIueS1yLngqbi55LGw9aSp1LWEqbyxoPShvKmMtdSpzKS9sLGY9KGEqcy1pKmMpL2w7aWYoZmkuaXNOYU4oaCl8fGZpLmlzSW5maW5pdGUoaCl8fGZpLmlzTmFOKGYpfHxmaS5pc0luZmluaXRlKGYpKXRocm93IG5ldyBCaTtyZXR1cm4gbmV3IHZpKGgsZil9O3ZhciBqaT1mdW5jdGlvbiB0KCl7aWYodGhpcy5fbWlueD1udWxsLHRoaXMuX21heHg9bnVsbCx0aGlzLl9taW55PW51bGwsdGhpcy5fbWF4eT1udWxsLDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuaW5pdCgpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmluaXQoZS54LGUueCxlLnksZS55KX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCl7dmFyIG49YXJndW1lbnRzWzBdO3RoaXMuaW5pdChuKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3RoaXMuaW5pdChyLngsaS54LHIueSxpLnkpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPWFyZ3VtZW50c1syXSx1PWFyZ3VtZW50c1szXTt0aGlzLmluaXQobyxzLGEsdSl9fSxVaT17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07amkucHJvdG90eXBlLmdldEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRXaWR0aCgpKnRoaXMuZ2V0SGVpZ2h0KCl9LGppLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2YgamkpKXJldHVybiExO3ZhciBlPXQ7cmV0dXJuIHRoaXMuaXNOdWxsKCk/ZS5pc051bGwoKTp0aGlzLl9tYXh4PT09ZS5nZXRNYXhYKCkmJnRoaXMuX21heHk9PT1lLmdldE1heFkoKSYmdGhpcy5fbWlueD09PWUuZ2V0TWluWCgpJiZ0aGlzLl9taW55PT09ZS5nZXRNaW5ZKCl9LGppLnByb3RvdHlwZS5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7aWYodGhpcy5pc051bGwoKXx8dC5pc051bGwoKXx8IXRoaXMuaW50ZXJzZWN0cyh0KSlyZXR1cm4gbmV3IGppO3ZhciBlPXRoaXMuX21pbng+dC5fbWlueD90aGlzLl9taW54OnQuX21pbngsbj10aGlzLl9taW55PnQuX21pbnk/dGhpcy5fbWlueTp0Ll9taW55LHI9dGhpcy5fbWF4eDx0Ll9tYXh4P3RoaXMuX21heHg6dC5fbWF4eCxpPXRoaXMuX21heHk8dC5fbWF4eT90aGlzLl9tYXh5OnQuX21heHk7cmV0dXJuIG5ldyBqaShlLHIsbixpKX0samkucHJvdG90eXBlLmlzTnVsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXh4PHRoaXMuX21pbnh9LGppLnByb3RvdHlwZS5nZXRNYXhYPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heHh9LGppLnByb3RvdHlwZS5jb3ZlcnM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNvdmVycyh0LngsdC55KX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGppKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIXRoaXMuaXNOdWxsKCkmJiFlLmlzTnVsbCgpJiYoZS5nZXRNaW5YKCk+PXRoaXMuX21pbngmJmUuZ2V0TWF4WCgpPD10aGlzLl9tYXh4JiZlLmdldE1pblkoKT49dGhpcy5fbWlueSYmZS5nZXRNYXhZKCk8PXRoaXMuX21heHkpfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07cmV0dXJuIXRoaXMuaXNOdWxsKCkmJihuPj10aGlzLl9taW54JiZuPD10aGlzLl9tYXh4JiZyPj10aGlzLl9taW55JiZyPD10aGlzLl9tYXh5KX19LGppLnByb3RvdHlwZS5pbnRlcnNlY3RzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygamkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4hdGhpcy5pc051bGwoKSYmIXQuaXNOdWxsKCkmJiEodC5fbWlueD50aGlzLl9tYXh4fHx0Ll9tYXh4PHRoaXMuX21pbnh8fHQuX21pbnk+dGhpcy5fbWF4eXx8dC5fbWF4eTx0aGlzLl9taW55KX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuaW50ZXJzZWN0cyhlLngsZS55KX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3JldHVybiF0aGlzLmlzTnVsbCgpJiYhKG4+dGhpcy5fbWF4eHx8bjx0aGlzLl9taW54fHxyPnRoaXMuX21heHl8fHI8dGhpcy5fbWlueSl9fSxqaS5wcm90b3R5cGUuZ2V0TWluWT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW55fSxqaS5wcm90b3R5cGUuZ2V0TWluWD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW54fSxqaS5wcm90b3R5cGUuZXhwYW5kVG9JbmNsdWRlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmV4cGFuZFRvSW5jbHVkZSh0LngsdC55KX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygamkpe3ZhciBlPWFyZ3VtZW50c1swXTtpZihlLmlzTnVsbCgpKXJldHVybiBudWxsO3RoaXMuaXNOdWxsKCk/KHRoaXMuX21pbng9ZS5nZXRNaW5YKCksdGhpcy5fbWF4eD1lLmdldE1heFgoKSx0aGlzLl9taW55PWUuZ2V0TWluWSgpLHRoaXMuX21heHk9ZS5nZXRNYXhZKCkpOihlLl9taW54PHRoaXMuX21pbngmJih0aGlzLl9taW54PWUuX21pbngpLGUuX21heHg+dGhpcy5fbWF4eCYmKHRoaXMuX21heHg9ZS5fbWF4eCksZS5fbWlueTx0aGlzLl9taW55JiYodGhpcy5fbWlueT1lLl9taW55KSxlLl9tYXh5PnRoaXMuX21heHkmJih0aGlzLl9tYXh5PWUuX21heHkpKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMuaXNOdWxsKCk/KHRoaXMuX21pbng9bix0aGlzLl9tYXh4PW4sdGhpcy5fbWlueT1yLHRoaXMuX21heHk9cik6KG48dGhpcy5fbWlueCYmKHRoaXMuX21pbng9biksbj50aGlzLl9tYXh4JiYodGhpcy5fbWF4eD1uKSxyPHRoaXMuX21pbnkmJih0aGlzLl9taW55PXIpLHI+dGhpcy5fbWF4eSYmKHRoaXMuX21heHk9cikpfX0samkucHJvdG90eXBlLm1pbkV4dGVudD1mdW5jdGlvbigpe2lmKHRoaXMuaXNOdWxsKCkpcmV0dXJuIDA7dmFyIHQ9dGhpcy5nZXRXaWR0aCgpLGU9dGhpcy5nZXRIZWlnaHQoKTtyZXR1cm4gdDxlP3Q6ZX0samkucHJvdG90eXBlLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOdWxsKCk/MDp0aGlzLl9tYXh4LXRoaXMuX21pbnh9LGppLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5pc051bGwoKT9lLmlzTnVsbCgpPzA6LTE6ZS5pc051bGwoKT8xOnRoaXMuX21pbng8ZS5fbWlueD8tMTp0aGlzLl9taW54PmUuX21pbng/MTp0aGlzLl9taW55PGUuX21pbnk/LTE6dGhpcy5fbWlueT5lLl9taW55PzE6dGhpcy5fbWF4eDxlLl9tYXh4Py0xOnRoaXMuX21heHg+ZS5fbWF4eD8xOnRoaXMuX21heHk8ZS5fbWF4eT8tMTp0aGlzLl9tYXh5PmUuX21heHk/MTowfSxqaS5wcm90b3R5cGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5pc051bGwoKSlyZXR1cm4gbnVsbDt0aGlzLmluaXQodGhpcy5nZXRNaW5YKCkrdCx0aGlzLmdldE1heFgoKSt0LHRoaXMuZ2V0TWluWSgpK2UsdGhpcy5nZXRNYXhZKCkrZSl9LGppLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJFbnZbIit0aGlzLl9taW54KyIgOiAiK3RoaXMuX21heHgrIiwgIit0aGlzLl9taW55KyIgOiAiK3RoaXMuX21heHkrIl0ifSxqaS5wcm90b3R5cGUuc2V0VG9OdWxsPWZ1bmN0aW9uKCl7dGhpcy5fbWlueD0wLHRoaXMuX21heHg9LTEsdGhpcy5fbWlueT0wLHRoaXMuX21heHk9LTF9LGppLnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc051bGwoKT8wOnRoaXMuX21heHktdGhpcy5fbWlueX0samkucHJvdG90eXBlLm1heEV4dGVudD1mdW5jdGlvbigpe2lmKHRoaXMuaXNOdWxsKCkpcmV0dXJuIDA7dmFyIHQ9dGhpcy5nZXRXaWR0aCgpLGU9dGhpcy5nZXRIZWlnaHQoKTtyZXR1cm4gdD5lP3Q6ZX0samkucHJvdG90eXBlLmV4cGFuZEJ5PWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmV4cGFuZEJ5KHQsdCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKHRoaXMuaXNOdWxsKCkpcmV0dXJuIG51bGw7dGhpcy5fbWlueC09ZSx0aGlzLl9tYXh4Kz1lLHRoaXMuX21pbnktPW4sdGhpcy5fbWF4eSs9biwodGhpcy5fbWlueD50aGlzLl9tYXh4fHx0aGlzLl9taW55PnRoaXMuX21heHkpJiZ0aGlzLnNldFRvTnVsbCgpfX0samkucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygamkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jb3ZlcnModCl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNvdmVycyhlKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmNvdmVycyhuLHIpfX0samkucHJvdG90eXBlLmNlbnRyZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTnVsbCgpP251bGw6bmV3IHZpKCh0aGlzLmdldE1pblgoKSt0aGlzLmdldE1heFgoKSkvMiwodGhpcy5nZXRNaW5ZKCkrdGhpcy5nZXRNYXhZKCkpLzIpfSxqaS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuc2V0VG9OdWxsKCk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuaW5pdCh0LngsdC54LHQueSx0LnkpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBqaSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX21pbng9ZS5fbWlueCx0aGlzLl9tYXh4PWUuX21heHgsdGhpcy5fbWlueT1lLl9taW55LHRoaXMuX21heHk9ZS5fbWF4eX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMuaW5pdChuLngsci54LG4ueSxyLnkpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1szXTtpPG8/KHRoaXMuX21pbng9aSx0aGlzLl9tYXh4PW8pOih0aGlzLl9taW54PW8sdGhpcy5fbWF4eD1pKSxzPGE/KHRoaXMuX21pbnk9cyx0aGlzLl9tYXh5PWEpOih0aGlzLl9taW55PWEsdGhpcy5fbWF4eT1zKX19LGppLnByb3RvdHlwZS5nZXRNYXhZPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heHl9LGppLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbih0KXtpZih0aGlzLmludGVyc2VjdHModCkpcmV0dXJuIDA7dmFyIGU9MDt0aGlzLl9tYXh4PHQuX21pbng/ZT10Ll9taW54LXRoaXMuX21heHg6dGhpcy5fbWlueD50Ll9tYXh4JiYoZT10aGlzLl9taW54LXQuX21heHgpO3ZhciBuPTA7cmV0dXJuIHRoaXMuX21heHk8dC5fbWlueT9uPXQuX21pbnktdGhpcy5fbWF4eTp0aGlzLl9taW55PnQuX21heHkmJihuPXRoaXMuX21pbnktdC5fbWF4eSksMD09PWU/bjowPT09bj9lOk1hdGguc3FydChlKmUrbipuKX0samkucHJvdG90eXBlLmhhc2hDb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9MTc7cmV0dXJuIHQ9MzcqKHQ9MzcqKHQ9MzcqKHQ9MzcqdCt2aS5oYXNoQ29kZSh0aGlzLl9taW54KSkrdmkuaGFzaENvZGUodGhpcy5fbWF4eCkpK3ZpLmhhc2hDb2RlKHRoaXMuX21pbnkpKSt2aS5oYXNoQ29kZSh0aGlzLl9tYXh5KX0samkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpLG1pXX0samkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGppfSxqaS5pbnRlcnNlY3RzPWZ1bmN0aW9uKCl7aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTtyZXR1cm4gbi54Pj0odC54PGUueD90Lng6ZS54KSYmbi54PD0odC54PmUueD90Lng6ZS54KSYmbi55Pj0odC55PGUueT90Lnk6ZS55KSYmbi55PD0odC55PmUueT90Lnk6ZS55KX1pZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdLHM9YXJndW1lbnRzWzNdLGE9TWF0aC5taW4oby54LHMueCksdT1NYXRoLm1heChvLngscy54KSxjPU1hdGgubWluKHIueCxpLngpLGw9TWF0aC5tYXgoci54LGkueCk7cmV0dXJuIShjPnV8fGw8YXx8KGE9TWF0aC5taW4oby55LHMueSksdT1NYXRoLm1heChvLnkscy55KSxjPU1hdGgubWluKHIueSxpLnkpLGw9TWF0aC5tYXgoci55LGkueSksYz51KXx8bDxhKX19LFVpLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NTE4NDVjZDU1MjE4OTgwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoamksVWkpO3ZhciBxaT17dHlwZVN0cjovXlxzKihcdyspXHMqXChccyooLiopXHMqXClccyokLyxlbXB0eVR5cGVTdHI6L15ccyooXHcrKVxzKkVNUFRZXHMqJC8sc3BhY2VzOi9ccysvLHBhcmVuQ29tbWE6L1wpXHMqLFxzKlwoLyxkb3VibGVQYXJlbkNvbW1hOi9cKVxzKlwpXHMqLFxzKlwoXHMqXCgvLHRyaW1QYXJlbnM6L15ccypcKD8oLio/KVwpP1xzKiQvfSxWaT1mdW5jdGlvbih0KXt0aGlzLmdlb21ldHJ5RmFjdG9yeT10fHxuZXcgSXN9O1ZpLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlLG4scjt0PXQucmVwbGFjZSgvW1xuXHJdL2csIiAiKTt2YXIgaT1xaS50eXBlU3RyLmV4ZWModCk7aWYoLTEhPT10LnNlYXJjaCgiRU1QVFkiKSYmKChpPXFpLmVtcHR5VHlwZVN0ci5leGVjKHQpKVsyXT12b2lkIDApLGkmJihuPWlbMV0udG9Mb3dlckNhc2UoKSxyPWlbMl0sWWlbbl0mJihlPVlpW25dLmFwcGx5KHRoaXMsW3JdKSkpLHZvaWQgMD09PWUpdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgcGFyc2UgV0tUICIrdCk7cmV0dXJuIGV9LFZpLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5leHRyYWN0R2VvbWV0cnkodCl9LFZpLnByb3RvdHlwZS5leHRyYWN0R2VvbWV0cnk9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRHZW9tZXRyeVR5cGUoKS50b0xvd2VyQ2FzZSgpO2lmKCFHaVtlXSlyZXR1cm4gbnVsbDt2YXIgbj1lLnRvVXBwZXJDYXNlKCk7cmV0dXJuIHQuaXNFbXB0eSgpP24rIiBFTVBUWSI6bisiKCIrR2lbZV0uYXBwbHkodGhpcyxbdF0pKyIpIn07dmFyIEdpPXtjb29yZGluYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0LngrIiAiK3QueX0scG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIEdpLmNvb3JkaW5hdGUuY2FsbCh0aGlzLHQuX2Nvb3JkaW5hdGVzLl9jb29yZGluYXRlc1swXSl9LG11bHRpcG9pbnQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX2dlb21ldHJpZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKCIoIitHaS5wb2ludC5hcHBseSh0aGlzLFt0Ll9nZW9tZXRyaWVzW25dXSkrIikiKTtyZXR1cm4gZS5qb2luKCIsIil9LGxpbmVzdHJpbmc6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX3BvaW50cy5fY29vcmRpbmF0ZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKEdpLmNvb3JkaW5hdGUuYXBwbHkodGhpcyxbdC5fcG9pbnRzLl9jb29yZGluYXRlc1tuXV0pKTtyZXR1cm4gZS5qb2luKCIsIil9LGxpbmVhcnJpbmc6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX3BvaW50cy5fY29vcmRpbmF0ZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKEdpLmNvb3JkaW5hdGUuYXBwbHkodGhpcyxbdC5fcG9pbnRzLl9jb29yZGluYXRlc1tuXV0pKTtyZXR1cm4gZS5qb2luKCIsIil9LG11bHRpbGluZXN0cmluZzpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5fZ2VvbWV0cmllcy5sZW5ndGg7bjxyOysrbillLnB1c2goIigiK0dpLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbdC5fZ2VvbWV0cmllc1tuXV0pKyIpIik7cmV0dXJuIGUuam9pbigiLCIpfSxwb2x5Z29uOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2UucHVzaCgiKCIrR2kubGluZXN0cmluZy5hcHBseSh0aGlzLFt0Ll9zaGVsbF0pKyIpIik7Zm9yKHZhciBuPTAscj10Ll9ob2xlcy5sZW5ndGg7bjxyOysrbillLnB1c2goIigiK0dpLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbdC5faG9sZXNbbl1dKSsiKSIpO3JldHVybiBlLmpvaW4oIiwiKX0sbXVsdGlwb2x5Z29uOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Ll9nZW9tZXRyaWVzLmxlbmd0aDtuPHI7KytuKWUucHVzaCgiKCIrR2kucG9seWdvbi5hcHBseSh0aGlzLFt0Ll9nZW9tZXRyaWVzW25dXSkrIikiKTtyZXR1cm4gZS5qb2luKCIsIil9LGdlb21ldHJ5Y29sbGVjdGlvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5fZ2VvbWV0cmllcy5sZW5ndGg7bjxyOysrbillLnB1c2godGhpcy5leHRyYWN0R2VvbWV0cnkodC5fZ2VvbWV0cmllc1tuXSkpO3JldHVybiBlLmpvaW4oIiwiKX19LFlpPXtwb2ludDpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2ludCgpO3ZhciBlPXQudHJpbSgpLnNwbGl0KHFpLnNwYWNlcyk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvaW50KG5ldyB2aShOdW1iZXIucGFyc2VGbG9hdChlWzBdKSxOdW1iZXIucGFyc2VGbG9hdChlWzFdKSkpfSxtdWx0aXBvaW50OmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpUG9pbnQoKTtmb3IodmFyIGUsbj10LnRyaW0oKS5zcGxpdCgiLCIpLHI9W10saT0wLG89bi5sZW5ndGg7aTxvOysraSllPW5baV0ucmVwbGFjZShxaS50cmltUGFyZW5zLCIkMSIpLHIucHVzaChZaS5wb2ludC5hcHBseSh0aGlzLFtlXSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aVBvaW50KHIpfSxsaW5lc3RyaW5nOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVTdHJpbmcoKTtmb3IodmFyIGUsbj10LnRyaW0oKS5zcGxpdCgiLCIpLHI9W10saT0wLG89bi5sZW5ndGg7aTxvOysraSllPW5baV0udHJpbSgpLnNwbGl0KHFpLnNwYWNlcyksci5wdXNoKG5ldyB2aShOdW1iZXIucGFyc2VGbG9hdChlWzBdKSxOdW1iZXIucGFyc2VGbG9hdChlWzFdKSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKHIpfSxsaW5lYXJyaW5nOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcoKTtmb3IodmFyIGUsbj10LnRyaW0oKS5zcGxpdCgiLCIpLHI9W10saT0wLG89bi5sZW5ndGg7aTxvOysraSllPW5baV0udHJpbSgpLnNwbGl0KHFpLnNwYWNlcyksci5wdXNoKG5ldyB2aShOdW1iZXIucGFyc2VGbG9hdChlWzBdKSxOdW1iZXIucGFyc2VGbG9hdChlWzFdKSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKHIpfSxtdWx0aWxpbmVzdHJpbmc6ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKCk7Zm9yKHZhciBlLG49dC50cmltKCkuc3BsaXQocWkucGFyZW5Db21tYSkscj1bXSxpPTAsbz1uLmxlbmd0aDtpPG87KytpKWU9bltpXS5yZXBsYWNlKHFpLnRyaW1QYXJlbnMsIiQxIiksci5wdXNoKFlpLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbZV0pKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKHIpfSxwb2x5Z29uOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvbHlnb24oKTtmb3IodmFyIGUsbixyLGksbz10LnRyaW0oKS5zcGxpdChxaS5wYXJlbkNvbW1hKSxzPVtdLGE9MCx1PW8ubGVuZ3RoO2E8dTsrK2EpZT1vW2FdLnJlcGxhY2UocWkudHJpbVBhcmVucywiJDEiKSxuPVlpLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbZV0pLHI9dGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhuLl9wb2ludHMpLDA9PT1hP2k9cjpzLnB1c2gocik7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvbHlnb24oaSxzKX0sbXVsdGlwb2x5Z29uOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpUG9seWdvbigpO2Zvcih2YXIgZSxuPXQudHJpbSgpLnNwbGl0KHFpLmRvdWJsZVBhcmVuQ29tbWEpLHI9W10saT0wLG89bi5sZW5ndGg7aTxvOysraSllPW5baV0ucmVwbGFjZShxaS50cmltUGFyZW5zLCIkMSIpLHIucHVzaChZaS5wb2x5Z29uLmFwcGx5KHRoaXMsW2VdKSk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpUG9seWdvbihyKX0sZ2VvbWV0cnljb2xsZWN0aW9uOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbigpO2Zvcih2YXIgZT0odD10LnJlcGxhY2UoLyxccyooW0EtWmEtel0pL2csInwkMSIpKS50cmltKCkuc3BsaXQoInwiKSxuPVtdLHI9MCxpPWUubGVuZ3RoO3I8aTsrK3Ipbi5wdXNoKHRoaXMucmVhZChlW3JdKSk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihuKX19LFhpPWZ1bmN0aW9uKHQpe3RoaXMucGFyc2VyPW5ldyBWaSh0KX07WGkucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBhcnNlci53cml0ZSh0KX0sWGkudG9MaW5lU3RyaW5nPWZ1bmN0aW9uKHQsZSl7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQiKTtyZXR1cm4iTElORVNUUklORyAoICIrdC54KyIgIit0LnkrIiwgIitlLngrIiAiK2UueSsiICkifTt2YXIgV2k9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyxlKSx0aGlzLm5hbWU9IlJ1bnRpbWVFeGNlcHRpb24iLHRoaXMubWVzc2FnZT1lLHRoaXMuc3RhY2s9KG5ldyB0KS5zdGFja31yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oRXJyb3IpLEhpPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtpZih0LmNhbGwodGhpcyksMD09PWFyZ3VtZW50cy5sZW5ndGgpdC5jYWxsKHRoaXMpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0LmNhbGwodGhpcyxlKX19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KFdpKSxaaT1mdW5jdGlvbigpe307WmkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFppLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBaaX0sWmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmU9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClaaS5zaG91bGROZXZlclJlYWNoSGVyZShudWxsKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhyb3cgbmV3IEhpKCJTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSIrKG51bGwhPT10PyI6ICIrdDoiIikpfX0sWmkuaXNUcnVlPWZ1bmN0aW9uKCl7dmFyIHQ7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpWmkuaXNUcnVlKGFyZ3VtZW50c1swXSxudWxsKTtlbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYodD1hcmd1bWVudHNbMV0sIWFyZ3VtZW50c1swXSkpdGhyb3cgbnVsbD09PXQ/bmV3IEhpOm5ldyBIaSh0KX0sWmkuZXF1YWxzPWZ1bmN0aW9uKCl7dmFyIHQsZSxuO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKVppLmVxdWFscyh0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxudWxsKTtlbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoJiYodD1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMl0sIShlPWFyZ3VtZW50c1sxXSkuZXF1YWxzKHQpKSl0aHJvdyBuZXcgSGkoIkV4cGVjdGVkICIrdCsiIGJ1dCBlbmNvdW50ZXJlZCAiK2UrKG51bGwhPT1uPyI6ICIrbjoiIikpfTt2YXIgS2k9ZnVuY3Rpb24oKXt0aGlzLl9yZXN1bHQ9bnVsbCx0aGlzLl9pbnB1dExpbmVzPUFycmF5KDIpLmZpbGwoKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5KDIpfSkpLHRoaXMuX2ludFB0PW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX2ludExpbmVJbmRleD1udWxsLHRoaXMuX2lzUHJvcGVyPW51bGwsdGhpcy5fcGE9bnVsbCx0aGlzLl9wYj1udWxsLHRoaXMuX3ByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5faW50UHRbMF09bmV3IHZpLHRoaXMuX2ludFB0WzFdPW5ldyB2aSx0aGlzLl9wYT10aGlzLl9pbnRQdFswXSx0aGlzLl9wYj10aGlzLl9pbnRQdFsxXSx0aGlzLl9yZXN1bHQ9MH0sSmk9e0RPTlRfSU5URVJTRUNUOntjb25maWd1cmFibGU6ITB9LERPX0lOVEVSU0VDVDp7Y29uZmlndXJhYmxlOiEwfSxDT0xMSU5FQVI6e2NvbmZpZ3VyYWJsZTohMH0sTk9fSU5URVJTRUNUSU9OOntjb25maWd1cmFibGU6ITB9LFBPSU5UX0lOVEVSU0VDVElPTjp7Y29uZmlndXJhYmxlOiEwfSxDT0xMSU5FQVJfSU5URVJTRUNUSU9OOntjb25maWd1cmFibGU6ITB9fTtLaS5wcm90b3R5cGUuZ2V0SW5kZXhBbG9uZ1NlZ21lbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb21wdXRlSW50TGluZUluZGV4KCksdGhpcy5faW50TGluZUluZGV4W3RdW2VdfSxLaS5wcm90b3R5cGUuZ2V0VG9wb2xvZ3lTdW1tYXJ5PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFpO3JldHVybiB0aGlzLmlzRW5kUG9pbnQoKSYmdC5hcHBlbmQoIiBlbmRwb2ludCIpLHRoaXMuX2lzUHJvcGVyJiZ0LmFwcGVuZCgiIHByb3BlciIpLHRoaXMuaXNDb2xsaW5lYXIoKSYmdC5hcHBlbmQoIiBjb2xsaW5lYXIiKSx0LnRvU3RyaW5nKCl9LEtpLnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3RoaXMuX2lucHV0TGluZXNbMF1bMF09dCx0aGlzLl9pbnB1dExpbmVzWzBdWzFdPWUsdGhpcy5faW5wdXRMaW5lc1sxXVswXT1uLHRoaXMuX2lucHV0TGluZXNbMV1bMV09cix0aGlzLl9yZXN1bHQ9dGhpcy5jb21wdXRlSW50ZXJzZWN0KHQsZSxuLHIpfSxLaS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0aW9uTnVtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc3VsdH0sS2kucHJvdG90eXBlLmNvbXB1dGVJbnRMaW5lSW5kZXg9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCludWxsPT09dGhpcy5faW50TGluZUluZGV4JiYodGhpcy5faW50TGluZUluZGV4PUFycmF5KDIpLmZpbGwoKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5KDIpfSkpLHRoaXMuY29tcHV0ZUludExpbmVJbmRleCgwKSx0aGlzLmNvbXB1dGVJbnRMaW5lSW5kZXgoMSkpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmdldEVkZ2VEaXN0YW5jZSh0LDApPnRoaXMuZ2V0RWRnZURpc3RhbmNlKHQsMSk/KHRoaXMuX2ludExpbmVJbmRleFt0XVswXT0wLHRoaXMuX2ludExpbmVJbmRleFt0XVsxXT0xKToodGhpcy5faW50TGluZUluZGV4W3RdWzBdPTEsdGhpcy5faW50TGluZUluZGV4W3RdWzFdPTApfX0sS2kucHJvdG90eXBlLmlzUHJvcGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFzSW50ZXJzZWN0aW9uKCkmJnRoaXMuX2lzUHJvcGVyfSxLaS5wcm90b3R5cGUuc2V0UHJlY2lzaW9uTW9kZWw9ZnVuY3Rpb24odCl7dGhpcy5fcHJlY2lzaW9uTW9kZWw9dH0sS2kucHJvdG90eXBlLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiEoIXRoaXMuaXNJbnRlcmlvckludGVyc2VjdGlvbigwKSYmIXRoaXMuaXNJbnRlcmlvckludGVyc2VjdGlvbigxKSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj0wO248dGhpcy5fcmVzdWx0O24rKylpZighdC5faW50UHRbbl0uZXF1YWxzMkQodC5faW5wdXRMaW5lc1tlXVswXSkmJiF0Ll9pbnRQdFtuXS5lcXVhbHMyRCh0Ll9pbnB1dExpbmVzW2VdWzFdKSlyZXR1cm4hMDtyZXR1cm4hMX19LEtpLnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ludFB0W3RdfSxLaS5wcm90b3R5cGUuaXNFbmRQb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhhc0ludGVyc2VjdGlvbigpJiYhdGhpcy5faXNQcm9wZXJ9LEtpLnByb3RvdHlwZS5oYXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzdWx0IT09S2kuTk9fSU5URVJTRUNUSU9OfSxLaS5wcm90b3R5cGUuZ2V0RWRnZURpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEtpLmNvbXB1dGVFZGdlRGlzdGFuY2UodGhpcy5faW50UHRbZV0sdGhpcy5faW5wdXRMaW5lc1t0XVswXSx0aGlzLl9pbnB1dExpbmVzW3RdWzFdKX0sS2kucHJvdG90eXBlLmlzQ29sbGluZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc3VsdD09PUtpLkNPTExJTkVBUl9JTlRFUlNFQ1RJT059LEtpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBYaS50b0xpbmVTdHJpbmcodGhpcy5faW5wdXRMaW5lc1swXVswXSx0aGlzLl9pbnB1dExpbmVzWzBdWzFdKSsiIC0gIitYaS50b0xpbmVTdHJpbmcodGhpcy5faW5wdXRMaW5lc1sxXVswXSx0aGlzLl9pbnB1dExpbmVzWzFdWzFdKSt0aGlzLmdldFRvcG9sb2d5U3VtbWFyeSgpfSxLaS5wcm90b3R5cGUuZ2V0RW5kcG9pbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5faW5wdXRMaW5lc1t0XVtlXX0sS2kucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fcmVzdWx0O2UrKylpZih0aGlzLl9pbnRQdFtlXS5lcXVhbHMyRCh0KSlyZXR1cm4hMDtyZXR1cm4hMX0sS2kucHJvdG90eXBlLmdldEludGVyc2VjdGlvbkFsb25nU2VnbWVudD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvbXB1dGVJbnRMaW5lSW5kZXgoKSx0aGlzLl9pbnRQdFt0aGlzLl9pbnRMaW5lSW5kZXhbdF1bZV1dfSxLaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sS2kucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEtpfSxLaS5jb21wdXRlRWRnZURpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1NYXRoLmFicyhuLngtZS54KSxpPU1hdGguYWJzKG4ueS1lLnkpLG89LTE7aWYodC5lcXVhbHMoZSkpbz0wO2Vsc2UgaWYodC5lcXVhbHMobikpbz1yPmk/cjppO2Vsc2V7dmFyIHM9TWF0aC5hYnModC54LWUueCksYT1NYXRoLmFicyh0LnktZS55KTswPT09KG89cj5pP3M6YSkmJiF0LmVxdWFscyhlKSYmKG89TWF0aC5tYXgocyxhKSl9cmV0dXJuIFppLmlzVHJ1ZSghKDA9PT1vJiYhdC5lcXVhbHMoZSkpLCJCYWQgZGlzdGFuY2UgY2FsY3VsYXRpb24iKSxvfSxLaS5ub25Sb2J1c3RDb21wdXRlRWRnZURpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LngtZS54LGk9dC55LWUueSxvPU1hdGguc3FydChyKnIraSppKTtyZXR1cm4gWmkuaXNUcnVlKCEoMD09PW8mJiF0LmVxdWFscyhlKSksIkludmFsaWQgZGlzdGFuY2UgY2FsY3VsYXRpb24iKSxvfSxKaS5ET05UX0lOVEVSU0VDVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sSmkuRE9fSU5URVJTRUNULmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxKaS5DT0xMSU5FQVIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LEppLk5PX0lOVEVSU0VDVElPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sSmkuUE9JTlRfSU5URVJTRUNUSU9OLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxKaS5DT0xMSU5FQVJfSU5URVJTRUNUSU9OLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhLaSxKaSk7dmFyIFFpPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaXNJblNlZ21lbnRFbnZlbG9wZXM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGppKHRoaXMuX2lucHV0TGluZXNbMF1bMF0sdGhpcy5faW5wdXRMaW5lc1swXVsxXSksbj1uZXcgamkodGhpcy5faW5wdXRMaW5lc1sxXVswXSx0aGlzLl9pbnB1dExpbmVzWzFdWzFdKTtyZXR1cm4gZS5jb250YWlucyh0KSYmbi5jb250YWlucyh0KX0sZS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbj1mdW5jdGlvbigpe2lmKDMhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07aWYodGhpcy5faXNQcm9wZXI9ITEsamkuaW50ZXJzZWN0cyhuLHIsZSkmJjA9PT1lby5vcmllbnRhdGlvbkluZGV4KG4scixlKSYmMD09PWVvLm9yaWVudGF0aW9uSW5kZXgocixuLGUpKXJldHVybiB0aGlzLl9pc1Byb3Blcj0hMCwoZS5lcXVhbHMobil8fGUuZXF1YWxzKHIpKSYmKHRoaXMuX2lzUHJvcGVyPSExKSx0aGlzLl9yZXN1bHQ9dC5QT0lOVF9JTlRFUlNFQ1RJT04sbnVsbDt0aGlzLl9yZXN1bHQ9dC5OT19JTlRFUlNFQ1RJT059LGUucHJvdG90eXBlLm5vcm1hbGl6ZVRvTWluaW11bT1mdW5jdGlvbih0LGUsbixyLGkpe2kueD10aGlzLnNtYWxsZXN0SW5BYnNWYWx1ZSh0LngsZS54LG4ueCxyLngpLGkueT10aGlzLnNtYWxsZXN0SW5BYnNWYWx1ZSh0LnksZS55LG4ueSxyLnkpLHQueC09aS54LHQueS09aS55LGUueC09aS54LGUueS09aS55LG4ueC09aS54LG4ueS09aS55LHIueC09aS54LHIueS09aS55fSxlLnByb3RvdHlwZS5zYWZlSENvb3JkaW5hdGVJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxuLHIsaSl7dmFyIG89bnVsbDt0cnl7bz16aS5pbnRlcnNlY3Rpb24odCxuLHIsaSl9Y2F0Y2gocyl7aWYoIShzIGluc3RhbmNlb2YgQmkpKXRocm93IHM7bz1lLm5lYXJlc3RFbmRwb2ludCh0LG4scixpKX1yZXR1cm4gb30sZS5wcm90b3R5cGUuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsbixyLGkpe3ZhciBvPXRoaXMuaW50ZXJzZWN0aW9uV2l0aE5vcm1hbGl6YXRpb24odCxuLHIsaSk7cmV0dXJuIHRoaXMuaXNJblNlZ21lbnRFbnZlbG9wZXMobyl8fChvPW5ldyB2aShlLm5lYXJlc3RFbmRwb2ludCh0LG4scixpKSkpLG51bGwhPT10aGlzLl9wcmVjaXNpb25Nb2RlbCYmdGhpcy5fcHJlY2lzaW9uTW9kZWwubWFrZVByZWNpc2Uobyksb30sZS5wcm90b3R5cGUuc21hbGxlc3RJbkFic1ZhbHVlPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXQsbz1NYXRoLmFicyhpKTtyZXR1cm4gTWF0aC5hYnMoZSk8byYmKGk9ZSxvPU1hdGguYWJzKGUpKSxNYXRoLmFicyhuKTxvJiYoaT1uLG89TWF0aC5hYnMobikpLE1hdGguYWJzKHIpPG8mJihpPXIpLGl9LGUucHJvdG90eXBlLmNoZWNrREQ9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1UaS5pbnRlcnNlY3Rpb24odCxlLG4scikscz10aGlzLmlzSW5TZWdtZW50RW52ZWxvcGVzKG8pO2tpLm91dC5wcmludGxuKCJERCBpbiBlbnYgPSAiK3MrIiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICIrbyksaS5kaXN0YW5jZShvKT4xZS00JiZraS5vdXQucHJpbnRsbigiRGlzdGFuY2UgPSAiK2kuZGlzdGFuY2UobykpfSxlLnByb3RvdHlwZS5pbnRlcnNlY3Rpb25XaXRoTm9ybWFsaXphdGlvbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uZXcgdmkodCksbz1uZXcgdmkoZSkscz1uZXcgdmkobiksYT1uZXcgdmkociksdT1uZXcgdmk7dGhpcy5ub3JtYWxpemVUb0VudkNlbnRyZShpLG8scyxhLHUpO3ZhciBjPXRoaXMuc2FmZUhDb29yZGluYXRlSW50ZXJzZWN0aW9uKGksbyxzLGEpO3JldHVybiBjLngrPXUueCxjLnkrPXUueSxjfSxlLnByb3RvdHlwZS5jb21wdXRlQ29sbGluZWFySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKGUsbixyLGkpe3ZhciBvPWppLmludGVyc2VjdHMoZSxuLHIpLHM9amkuaW50ZXJzZWN0cyhlLG4saSksYT1qaS5pbnRlcnNlY3RzKHIsaSxlKSx1PWppLmludGVyc2VjdHMocixpLG4pO3JldHVybiBvJiZzPyh0aGlzLl9pbnRQdFswXT1yLHRoaXMuX2ludFB0WzFdPWksdC5DT0xMSU5FQVJfSU5URVJTRUNUSU9OKTphJiZ1Pyh0aGlzLl9pbnRQdFswXT1lLHRoaXMuX2ludFB0WzFdPW4sdC5DT0xMSU5FQVJfSU5URVJTRUNUSU9OKTpvJiZhPyh0aGlzLl9pbnRQdFswXT1yLHRoaXMuX2ludFB0WzFdPWUsIXIuZXF1YWxzKGUpfHxzfHx1P3QuQ09MTElORUFSX0lOVEVSU0VDVElPTjp0LlBPSU5UX0lOVEVSU0VDVElPTik6byYmdT8odGhpcy5faW50UHRbMF09cix0aGlzLl9pbnRQdFsxXT1uLCFyLmVxdWFscyhuKXx8c3x8YT90LkNPTExJTkVBUl9JTlRFUlNFQ1RJT046dC5QT0lOVF9JTlRFUlNFQ1RJT04pOnMmJmE/KHRoaXMuX2ludFB0WzBdPWksdGhpcy5faW50UHRbMV09ZSwhaS5lcXVhbHMoZSl8fG98fHU/dC5DT0xMSU5FQVJfSU5URVJTRUNUSU9OOnQuUE9JTlRfSU5URVJTRUNUSU9OKTpzJiZ1Pyh0aGlzLl9pbnRQdFswXT1pLHRoaXMuX2ludFB0WzFdPW4sIWkuZXF1YWxzKG4pfHxvfHxhP3QuQ09MTElORUFSX0lOVEVSU0VDVElPTjp0LlBPSU5UX0lOVEVSU0VDVElPTik6dC5OT19JTlRFUlNFQ1RJT059LGUucHJvdG90eXBlLm5vcm1hbGl6ZVRvRW52Q2VudHJlPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89dC54PGUueD90Lng6ZS54LHM9dC55PGUueT90Lnk6ZS55LGE9dC54PmUueD90Lng6ZS54LHU9dC55PmUueT90Lnk6ZS55LGM9bi54PHIueD9uLng6ci54LGw9bi55PHIueT9uLnk6ci55LGg9bi54PnIueD9uLng6ci54LGY9bi55PnIueT9uLnk6ci55LHA9KChvPmM/bzpjKSsoYTxoP2E6aCkpLzIsZD0oKHM+bD9zOmwpKyh1PGY/dTpmKSkvMjtpLng9cCxpLnk9ZCx0LngtPWkueCx0LnktPWkueSxlLngtPWkueCxlLnktPWkueSxuLngtPWkueCxuLnktPWkueSxyLngtPWkueCxyLnktPWkueX0sZS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdD1mdW5jdGlvbihlLG4scixpKXtpZih0aGlzLl9pc1Byb3Blcj0hMSwhamkuaW50ZXJzZWN0cyhlLG4scixpKSlyZXR1cm4gdC5OT19JTlRFUlNFQ1RJT047dmFyIG89ZW8ub3JpZW50YXRpb25JbmRleChlLG4scikscz1lby5vcmllbnRhdGlvbkluZGV4KGUsbixpKTtpZihvPjAmJnM+MHx8bzwwJiZzPDApcmV0dXJuIHQuTk9fSU5URVJTRUNUSU9OO3ZhciBhPWVvLm9yaWVudGF0aW9uSW5kZXgocixpLGUpLHU9ZW8ub3JpZW50YXRpb25JbmRleChyLGksbik7cmV0dXJuIGE+MCYmdT4wfHxhPDAmJnU8MD90Lk5PX0lOVEVSU0VDVElPTjowPT09byYmMD09PXMmJjA9PT1hJiYwPT09dT90aGlzLmNvbXB1dGVDb2xsaW5lYXJJbnRlcnNlY3Rpb24oZSxuLHIsaSk6KDA9PT1vfHwwPT09c3x8MD09PWF8fDA9PT11Pyh0aGlzLl9pc1Byb3Blcj0hMSxlLmVxdWFsczJEKHIpfHxlLmVxdWFsczJEKGkpP3RoaXMuX2ludFB0WzBdPWU6bi5lcXVhbHMyRChyKXx8bi5lcXVhbHMyRChpKT90aGlzLl9pbnRQdFswXT1uOjA9PT1vP3RoaXMuX2ludFB0WzBdPW5ldyB2aShyKTowPT09cz90aGlzLl9pbnRQdFswXT1uZXcgdmkoaSk6MD09PWE/dGhpcy5faW50UHRbMF09bmV3IHZpKGUpOjA9PT11JiYodGhpcy5faW50UHRbMF09bmV3IHZpKG4pKSk6KHRoaXMuX2lzUHJvcGVyPSEwLHRoaXMuX2ludFB0WzBdPXRoaXMuaW50ZXJzZWN0aW9uKGUsbixyLGkpKSx0LlBPSU5UX0lOVEVSU0VDVElPTil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGUubmVhcmVzdEVuZHBvaW50PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXQsbz1lby5kaXN0YW5jZVBvaW50TGluZSh0LG4scikscz1lby5kaXN0YW5jZVBvaW50TGluZShlLG4scik7cmV0dXJuIHM8byYmKG89cyxpPWUpLChzPWVvLmRpc3RhbmNlUG9pbnRMaW5lKG4sdCxlKSk8byYmKG89cyxpPW4pLChzPWVvLmRpc3RhbmNlUG9pbnRMaW5lKHIsdCxlKSk8byYmKG89cyxpPXIpLGl9LGV9KEtpKSwkaT1mdW5jdGlvbigpe307JGkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LCRpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiAkaX0sJGkub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS54LXQueCxpPWUueS10Lnksbz1uLngtZS54LHM9bi55LWUueTtyZXR1cm4gJGkuc2lnbk9mRGV0MngyKHIsaSxvLHMpfSwkaS5zaWduT2ZEZXQyeDI9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bnVsbCxvPW51bGwscz1udWxsO2lmKGk9MSwwPT09dHx8MD09PXIpcmV0dXJuIDA9PT1lfHwwPT09bj8wOmU+MD9uPjA/LWk6aTpuPjA/aTotaTtpZigwPT09ZXx8MD09PW4pcmV0dXJuIHI+MD90PjA/aTotaTp0PjA/LWk6aTtpZihlPjA/cj4wP2U8PXJ8fChpPS1pLG89dCx0PW4sbj1vLG89ZSxlPXIscj1vKTplPD0tcj8oaT0taSxuPS1uLHI9LXIpOihvPXQsdD0tbixuPW8sbz1lLGU9LXIscj1vKTpyPjA/LWU8PXI/KGk9LWksdD0tdCxlPS1lKToobz0tdCx0PW4sbj1vLG89LWUsZT1yLHI9byk6ZT49cj8odD0tdCxlPS1lLG49LW4scj0tcik6KGk9LWksbz0tdCx0PS1uLG49byxvPS1lLGU9LXIscj1vKSx0PjApe2lmKCEobj4wKSlyZXR1cm4gaTtpZighKHQ8PW4pKXJldHVybiBpfWVsc2V7aWYobj4wKXJldHVybi1pO2lmKCEodD49bikpcmV0dXJuLWk7aT0taSx0PS10LG49LW59Zm9yKDs7KXtpZigoci09KHM9TWF0aC5mbG9vcihuL3QpKSplKTwwKXJldHVybi1pO2lmKHI+ZSlyZXR1cm4gaTtpZih0PihuLT1zKnQpK24pe2lmKGU8cityKXJldHVybiBpfWVsc2V7aWYoZT5yK3IpcmV0dXJuLWk7bj10LW4scj1lLXIsaT0taX1pZigwPT09cilyZXR1cm4gMD09PW4/MDotaTtpZigwPT09bnx8KHQtPShzPU1hdGguZmxvb3IodC9uKSkqbiwoZS09cypyKTwwKSlyZXR1cm4gaTtpZihlPnIpcmV0dXJuLWk7aWYobj50K3Qpe2lmKHI8ZStlKXJldHVybi1pfWVsc2V7aWYocj5lK2UpcmV0dXJuIGk7dD1uLXQsZT1yLWUsaT0taX1pZigwPT09ZSlyZXR1cm4gMD09PXQ/MDppO2lmKDA9PT10KXJldHVybi1pfX07dmFyIHRvPWZ1bmN0aW9uKCl7dGhpcy5fcD1udWxsLHRoaXMuX2Nyb3NzaW5nQ291bnQ9MCx0aGlzLl9pc1BvaW50T25TZWdtZW50PSExO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9wPXR9O3RvLnByb3RvdHlwZS5jb3VudFNlZ21lbnQ9ZnVuY3Rpb24odCxlKXtpZih0Lng8dGhpcy5fcC54JiZlLng8dGhpcy5fcC54KXJldHVybiBudWxsO2lmKHRoaXMuX3AueD09PWUueCYmdGhpcy5fcC55PT09ZS55KXJldHVybiB0aGlzLl9pc1BvaW50T25TZWdtZW50PSEwLG51bGw7aWYodC55PT09dGhpcy5fcC55JiZlLnk9PT10aGlzLl9wLnkpe3ZhciBuPXQueCxyPWUueDtyZXR1cm4gbj5yJiYobj1lLngscj10LngpLHRoaXMuX3AueD49biYmdGhpcy5fcC54PD1yJiYodGhpcy5faXNQb2ludE9uU2VnbWVudD0hMCksbnVsbH1pZih0Lnk+dGhpcy5fcC55JiZlLnk8PXRoaXMuX3AueXx8ZS55PnRoaXMuX3AueSYmdC55PD10aGlzLl9wLnkpe3ZhciBpPXQueC10aGlzLl9wLngsbz10LnktdGhpcy5fcC55LHM9ZS54LXRoaXMuX3AueCxhPWUueS10aGlzLl9wLnksdT0kaS5zaWduT2ZEZXQyeDIoaSxvLHMsYSk7aWYoMD09PXUpcmV0dXJuIHRoaXMuX2lzUG9pbnRPblNlZ21lbnQ9ITAsbnVsbDthPG8mJih1PS11KSx1PjAmJnRoaXMuX2Nyb3NzaW5nQ291bnQrK319LHRvLnByb3RvdHlwZS5pc1BvaW50SW5Qb2x5Z29uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TG9jYXRpb24oKSE9PWJpLkVYVEVSSU9SfSx0by5wcm90b3R5cGUuZ2V0TG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNQb2ludE9uU2VnbWVudD9iaS5CT1VOREFSWTp0aGlzLl9jcm9zc2luZ0NvdW50JTI9PTE/YmkuSU5URVJJT1I6YmkuRVhURVJJT1J9LHRvLnByb3RvdHlwZS5pc09uU2VnbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1BvaW50T25TZWdtZW50fSx0by5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdG8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHRvfSx0by5sb2NhdGVQb2ludEluUmluZz1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJkVpKGFyZ3VtZW50c1sxXSxMaSkpe2Zvcih2YXIgdD1hcmd1bWVudHNbMV0sZT1uZXcgdG8oYXJndW1lbnRzWzBdKSxuPW5ldyB2aSxyPW5ldyB2aSxpPTE7aTx0LnNpemUoKTtpKyspaWYodC5nZXRDb29yZGluYXRlKGksbiksdC5nZXRDb29yZGluYXRlKGktMSxyKSxlLmNvdW50U2VnbWVudChuLHIpLGUuaXNPblNlZ21lbnQoKSlyZXR1cm4gZS5nZXRMb2NhdGlvbigpO3JldHVybiBlLmdldExvY2F0aW9uKCl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciBvPWFyZ3VtZW50c1sxXSxzPW5ldyB0byhhcmd1bWVudHNbMF0pLGE9MTthPG8ubGVuZ3RoO2ErKyl7dmFyIHU9b1thXSxjPW9bYS0xXTtpZihzLmNvdW50U2VnbWVudCh1LGMpLHMuaXNPblNlZ21lbnQoKSlyZXR1cm4gcy5nZXRMb2NhdGlvbigpfXJldHVybiBzLmdldExvY2F0aW9uKCl9fTt2YXIgZW89ZnVuY3Rpb24oKXt9LG5vPXtDTE9DS1dJU0U6e2NvbmZpZ3VyYWJsZTohMH0sUklHSFQ6e2NvbmZpZ3VyYWJsZTohMH0sQ09VTlRFUkNMT0NLV0lTRTp7Y29uZmlndXJhYmxlOiEwfSxMRUZUOntjb25maWd1cmFibGU6ITB9LENPTExJTkVBUjp7Y29uZmlndXJhYmxlOiEwfSxTVFJBSUdIVDp7Y29uZmlndXJhYmxlOiEwfX07ZW8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGVvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlb30sZW8ub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIFRpLm9yaWVudGF0aW9uSW5kZXgodCxlLG4pfSxlby5zaWduZWRBcmVhPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7dmFyIHQ9YXJndW1lbnRzWzBdO2lmKHQubGVuZ3RoPDMpcmV0dXJuIDA7Zm9yKHZhciBlPTAsbj10WzBdLngscj0xO3I8dC5sZW5ndGgtMTtyKyspe3ZhciBpPXRbcl0ueC1uLG89dFtyKzFdLnk7ZSs9aSoodFtyLTFdLnktbyl9cmV0dXJuIGUvMn1pZihFaShhcmd1bWVudHNbMF0sTGkpKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1zLnNpemUoKTtpZihhPDMpcmV0dXJuIDA7dmFyIHU9bmV3IHZpLGM9bmV3IHZpLGw9bmV3IHZpO3MuZ2V0Q29vcmRpbmF0ZSgwLGMpLHMuZ2V0Q29vcmRpbmF0ZSgxLGwpO3ZhciBoPWMueDtsLngtPWg7Zm9yKHZhciBmPTAscD0xO3A8YS0xO3ArKyl1Lnk9Yy55LGMueD1sLngsYy55PWwueSxzLmdldENvb3JkaW5hdGUocCsxLGwpLGwueC09aCxmKz1jLngqKHUueS1sLnkpO3JldHVybiBmLzJ9fSxlby5kaXN0YW5jZUxpbmVMaW5lPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQuZXF1YWxzKGUpKXJldHVybiBlby5kaXN0YW5jZVBvaW50TGluZSh0LG4scik7aWYobi5lcXVhbHMocikpcmV0dXJuIGVvLmRpc3RhbmNlUG9pbnRMaW5lKHIsdCxlKTt2YXIgaT0hMTtpZihqaS5pbnRlcnNlY3RzKHQsZSxuLHIpKXt2YXIgbz0oZS54LXQueCkqKHIueS1uLnkpLShlLnktdC55KSooci54LW4ueCk7aWYoMD09PW8paT0hMDtlbHNle3ZhciBzPSh0Lnktbi55KSooci54LW4ueCktKHQueC1uLngpKihyLnktbi55KSxhPSgodC55LW4ueSkqKGUueC10LngpLSh0Lngtbi54KSooZS55LXQueSkpL28sdT1zL287KHU8MHx8dT4xfHxhPDB8fGE+MSkmJihpPSEwKX19ZWxzZSBpPSEwO3JldHVybiBpP0NpLm1pbihlby5kaXN0YW5jZVBvaW50TGluZSh0LG4sciksZW8uZGlzdGFuY2VQb2ludExpbmUoZSxuLHIpLGVvLmRpc3RhbmNlUG9pbnRMaW5lKG4sdCxlKSxlby5kaXN0YW5jZVBvaW50TGluZShyLHQsZSkpOjB9LGVvLmlzUG9pbnRJblJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZW8ubG9jYXRlUG9pbnRJblJpbmcodCxlKSE9PWJpLkVYVEVSSU9SfSxlby5jb21wdXRlTGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2l6ZSgpO2lmKGU8PTEpcmV0dXJuIDA7dmFyIG49MCxyPW5ldyB2aTt0LmdldENvb3JkaW5hdGUoMCxyKTtmb3IodmFyIGk9ci54LG89ci55LHM9MTtzPGU7cysrKXt0LmdldENvb3JkaW5hdGUocyxyKTt2YXIgYT1yLngsdT1yLnksYz1hLWksbD11LW87bis9TWF0aC5zcXJ0KGMqYytsKmwpLGk9YSxvPXV9cmV0dXJuIG59LGVvLmlzQ0NXPWZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoLTE7aWYoZTwzKXRocm93IG5ldyBoaTtmb3IodmFyIG49dFswXSxyPTAsaT0xO2k8PWU7aSsrKXt2YXIgbz10W2ldO28ueT5uLnkmJihuPW8scj1pKX12YXIgcz1yO2RveyhzLT0xKTwwJiYocz1lKX13aGlsZSh0W3NdLmVxdWFsczJEKG4pJiZzIT09cik7dmFyIGE9cjtkb3thPShhKzEpJWV9d2hpbGUodFthXS5lcXVhbHMyRChuKSYmYSE9PXIpO3ZhciB1PXRbc10sYz10W2FdO2lmKHUuZXF1YWxzMkQobil8fGMuZXF1YWxzMkQobil8fHUuZXF1YWxzMkQoYykpcmV0dXJuITE7dmFyIGw9ZW8uY29tcHV0ZU9yaWVudGF0aW9uKHUsbixjKTtyZXR1cm4gMD09PWw/dS54PmMueDpsPjB9LGVvLmxvY2F0ZVBvaW50SW5SaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRvLmxvY2F0ZVBvaW50SW5SaW5nKHQsZSl9LGVvLmRpc3RhbmNlUG9pbnRMaW5lUGVycGVuZGljdWxhcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9KG4ueC1lLngpKihuLngtZS54KSsobi55LWUueSkqKG4ueS1lLnkpLGk9KChlLnktdC55KSoobi54LWUueCktKGUueC10LngpKihuLnktZS55KSkvcjtyZXR1cm4gTWF0aC5hYnMoaSkqTWF0aC5zcXJ0KHIpfSxlby5jb21wdXRlT3JpZW50YXRpb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlby5vcmllbnRhdGlvbkluZGV4KHQsZSxuKX0sZW8uZGlzdGFuY2VQb2ludExpbmU9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO2lmKDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgaGk7Zm9yKHZhciBuPXQuZGlzdGFuY2UoZVswXSkscj0wO3I8ZS5sZW5ndGgtMTtyKyspe3ZhciBpPWVvLmRpc3RhbmNlUG9pbnRMaW5lKHQsZVtyXSxlW3IrMV0pO2k8biYmKG49aSl9cmV0dXJuIG59aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPWFyZ3VtZW50c1syXTtpZihzLng9PT1hLngmJnMueT09PWEueSlyZXR1cm4gby5kaXN0YW5jZShzKTt2YXIgdT0oYS54LXMueCkqKGEueC1zLngpKyhhLnktcy55KSooYS55LXMueSksYz0oKG8ueC1zLngpKihhLngtcy54KSsoby55LXMueSkqKGEueS1zLnkpKS91O2lmKGM8PTApcmV0dXJuIG8uZGlzdGFuY2Uocyk7aWYoYz49MSlyZXR1cm4gby5kaXN0YW5jZShhKTt2YXIgbD0oKHMueS1vLnkpKihhLngtcy54KS0ocy54LW8ueCkqKGEueS1zLnkpKS91O3JldHVybiBNYXRoLmFicyhsKSpNYXRoLnNxcnQodSl9fSxlby5pc09uTGluZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgUWkscj0xO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3ItMV0sbz1lW3JdO2lmKG4uY29tcHV0ZUludGVyc2VjdGlvbih0LGksbyksbi5oYXNJbnRlcnNlY3Rpb24oKSlyZXR1cm4hMH1yZXR1cm4hMX0sbm8uQ0xPQ0tXSVNFLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxuby5SSUdIVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZW8uQ0xPQ0tXSVNFfSxuby5DT1VOVEVSQ0xPQ0tXSVNFLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxuby5MRUZULmdldD1mdW5jdGlvbigpe3JldHVybiBlby5DT1VOVEVSQ0xPQ0tXSVNFfSxuby5DT0xMSU5FQVIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LG5vLlNUUkFJR0hULmdldD1mdW5jdGlvbigpe3JldHVybiBlby5DT0xMSU5FQVJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGVvLG5vKTt2YXIgcm89ZnVuY3Rpb24oKXt9O3JvLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7fSxyby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scm8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHJvfTt2YXIgaW89ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZW52ZWxvcGU9bnVsbCx0aGlzLl9mYWN0b3J5PW51bGwsdGhpcy5fU1JJRD1udWxsLHRoaXMuX3VzZXJEYXRhPW51bGwsdGhpcy5fZmFjdG9yeT10LHRoaXMuX1NSSUQ9dC5nZXRTUklEKCl9LG9vPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9QT0lOVDp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTVVMVElQT0lOVDp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTElORVNUUklORzp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTElORUFSUklORzp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTVVMVElMSU5FU1RSSU5HOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9QT0xZR09OOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9NVUxUSVBPTFlHT046e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTjp7Y29uZmlndXJhYmxlOiEwfSxnZW9tZXRyeUNoYW5nZWRGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH19O2lvLnByb3RvdHlwZS5pc0dlb21ldHJ5Q29sbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFNvcnRJbmRleCgpPT09aW8uU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTn0saW8ucHJvdG90eXBlLmdldEZhY3Rvcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmFjdG9yeX0saW8ucHJvdG90eXBlLmdldEdlb21ldHJ5Tj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpc30saW8ucHJvdG90eXBlLmdldEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gMH0saW8ucHJvdG90eXBlLmlzUmVjdGFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGlvLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIG51bGwhPT10JiZ0aGlzLmVxdWFsc1RvcG8odCl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPYmplY3Qpe3ZhciBlPWFyZ3VtZW50c1swXTtpZighKGUgaW5zdGFuY2VvZiBpbykpcmV0dXJuITE7dmFyIG49ZTtyZXR1cm4gdGhpcy5lcXVhbHNFeGFjdChuKX19LGlvLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcz09PXR8fHRoaXMuZXF1YWxzRXhhY3QodCwwKX0saW8ucHJvdG90eXBlLmdlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe3RoaXMuYXBwbHkoaW8uZ2VvbWV0cnlDaGFuZ2VkRmlsdGVyKX0saW8ucHJvdG90eXBlLmdlb21ldHJ5Q2hhbmdlZEFjdGlvbj1mdW5jdGlvbigpe3RoaXMuX2VudmVsb3BlPW51bGx9LGlvLnByb3RvdHlwZS5lcXVhbHNOb3JtPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dCYmdGhpcy5ub3JtKCkuZXF1YWxzRXhhY3QodC5ub3JtKCkpfSxpby5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGlvLnByb3RvdHlwZS5nZXROdW1HZW9tZXRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIDF9LGlvLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dDtyZXR1cm4gdGhpcy5nZXRTb3J0SW5kZXgoKSE9PWUuZ2V0U29ydEluZGV4KCk/dGhpcy5nZXRTb3J0SW5kZXgoKS1lLmdldFNvcnRJbmRleCgpOnRoaXMuaXNFbXB0eSgpJiZlLmlzRW1wdHkoKT8wOnRoaXMuaXNFbXB0eSgpPy0xOmUuaXNFbXB0eSgpPzE6dGhpcy5jb21wYXJlVG9TYW1lQ2xhc3ModCl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5nZXRTb3J0SW5kZXgoKSE9PW4uZ2V0U29ydEluZGV4KCk/dGhpcy5nZXRTb3J0SW5kZXgoKS1uLmdldFNvcnRJbmRleCgpOnRoaXMuaXNFbXB0eSgpJiZuLmlzRW1wdHkoKT8wOnRoaXMuaXNFbXB0eSgpPy0xOm4uaXNFbXB0eSgpPzE6dGhpcy5jb21wYXJlVG9TYW1lQ2xhc3MobixyKX19LGlvLnByb3RvdHlwZS5nZXRVc2VyRGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91c2VyRGF0YX0saW8ucHJvdG90eXBlLmdldFNSSUQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fU1JJRH0saW8ucHJvdG90eXBlLmdldEVudmVsb3BlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLnRvR2VvbWV0cnkodGhpcy5nZXRFbnZlbG9wZUludGVybmFsKCkpfSxpby5wcm90b3R5cGUuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24odCl7aWYodC5nZXRTb3J0SW5kZXgoKT09PWlvLlNPUlRJTkRFWF9HRU9NRVRSWUNPTExFQ1RJT04pdGhyb3cgbmV3IGhpfSxpby5wcm90b3R5cGUuZXF1YWw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiAwPT09bj90LmVxdWFscyhlKTp0LmRpc3RhbmNlKGUpPD1ufSxpby5wcm90b3R5cGUubm9ybT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY29weSgpO3JldHVybiB0Lm5vcm1hbGl6ZSgpLHR9LGlvLnByb3RvdHlwZS5nZXRQcmVjaXNpb25Nb2RlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mYWN0b3J5LmdldFByZWNpc2lvbk1vZGVsKCl9LGlvLnByb3RvdHlwZS5nZXRFbnZlbG9wZUludGVybmFsPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9lbnZlbG9wZSYmKHRoaXMuX2VudmVsb3BlPXRoaXMuY29tcHV0ZUVudmVsb3BlSW50ZXJuYWwoKSksbmV3IGppKHRoaXMuX2VudmVsb3BlKX0saW8ucHJvdG90eXBlLnNldFNSSUQ9ZnVuY3Rpb24odCl7dGhpcy5fU1JJRD10fSxpby5wcm90b3R5cGUuc2V0VXNlckRhdGE9ZnVuY3Rpb24odCl7dGhpcy5fdXNlckRhdGE9dH0saW8ucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5pdGVyYXRvcigpLHI9ZS5pdGVyYXRvcigpO24uaGFzTmV4dCgpJiZyLmhhc05leHQoKTspe3ZhciBpPW4ubmV4dCgpLG89ci5uZXh0KCkscz1pLmNvbXBhcmVUbyhvKTtpZigwIT09cylyZXR1cm4gc31yZXR1cm4gbi5oYXNOZXh0KCk/MTpyLmhhc05leHQoKT8tMTowfSxpby5wcm90b3R5cGUuaGFzaENvZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFbnZlbG9wZUludGVybmFsKCkuaGFzaENvZGUoKX0saW8ucHJvdG90eXBlLmlzR2VvbWV0cnlDb2xsZWN0aW9uT3JEZXJpdmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U29ydEluZGV4KCk9PT1pby5TT1JUSU5ERVhfR0VPTUVUUllDT0xMRUNUSU9OfHx0aGlzLmdldFNvcnRJbmRleCgpPT09aW8uU09SVElOREVYX01VTFRJUE9JTlR8fHRoaXMuZ2V0U29ydEluZGV4KCk9PT1pby5TT1JUSU5ERVhfTVVMVElMSU5FU1RSSU5HfHx0aGlzLmdldFNvcnRJbmRleCgpPT09aW8uU09SVElOREVYX01VTFRJUE9MWUdPTn0saW8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2dpLGRpLG1pXX0saW8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGlvfSxpby5oYXNOb25FbXB0eUVsZW1lbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCF0W2VdLmlzRW1wdHkoKSlyZXR1cm4hMDtyZXR1cm4hMX0saW8uaGFzTnVsbEVsZW1lbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKG51bGw9PT10W2VdKXJldHVybiEwO3JldHVybiExfSxvby5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDc5OWVhNDY1MjI4NTRjMDB9LG9vLlNPUlRJTkRFWF9QT0lOVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sb28uU09SVElOREVYX01VTFRJUE9JTlQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LG9vLlNPUlRJTkRFWF9MSU5FU1RSSU5HLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxvby5TT1JUSU5ERVhfTElORUFSUklORy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gM30sb28uU09SVElOREVYX01VTFRJTElORVNUUklORy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gNH0sb28uU09SVElOREVYX1BPTFlHT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDV9LG9vLlNPUlRJTkRFWF9NVUxUSVBPTFlHT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDZ9LG9vLlNPUlRJTkRFWF9HRU9NRVRSWUNPTExFQ1RJT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDd9LG9vLmdlb21ldHJ5Q2hhbmdlZEZpbHRlci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gc299LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGlvLG9vKTt2YXIgc289ZnVuY3Rpb24oKXt9O3NvLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3JvXX0sc28uZmlsdGVyPWZ1bmN0aW9uKHQpe3QuZ2VvbWV0cnlDaGFuZ2VkQWN0aW9uKCl9O3ZhciBhbz1mdW5jdGlvbigpe307YW8ucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt9LGFvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxhby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYW99O3ZhciB1bz1mdW5jdGlvbigpe30sY289e01vZDJCb3VuZGFyeU5vZGVSdWxlOntjb25maWd1cmFibGU6ITB9LEVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZTp7Y29uZmlndXJhYmxlOiEwfSxNdWx0aVZhbGVudEVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZTp7Y29uZmlndXJhYmxlOiEwfSxNb25vVmFsZW50RW5kUG9pbnRCb3VuZGFyeU5vZGVSdWxlOntjb25maWd1cmFibGU6ITB9LE1PRDJfQk9VTkRBUllfUlVMRTp7Y29uZmlndXJhYmxlOiEwfSxFTkRQT0lOVF9CT1VOREFSWV9SVUxFOntjb25maWd1cmFibGU6ITB9LE1VTFRJVkFMRU5UX0VORFBPSU5UX0JPVU5EQVJZX1JVTEU6e2NvbmZpZ3VyYWJsZTohMH0sTU9OT1ZBTEVOVF9FTkRQT0lOVF9CT1VOREFSWV9SVUxFOntjb25maWd1cmFibGU6ITB9LE9HQ19TRlNfQk9VTkRBUllfUlVMRTp7Y29uZmlndXJhYmxlOiEwfX07dW8ucHJvdG90eXBlLmlzSW5Cb3VuZGFyeT1mdW5jdGlvbih0KXt9LHVvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx1by5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdW99LGNvLk1vZDJCb3VuZGFyeU5vZGVSdWxlLmdldD1mdW5jdGlvbigpe3JldHVybiBsb30sY28uRW5kUG9pbnRCb3VuZGFyeU5vZGVSdWxlLmdldD1mdW5jdGlvbigpe3JldHVybiBob30sY28uTXVsdGlWYWxlbnRFbmRQb2ludEJvdW5kYXJ5Tm9kZVJ1bGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGZvfSxjby5Nb25vVmFsZW50RW5kUG9pbnRCb3VuZGFyeU5vZGVSdWxlLmdldD1mdW5jdGlvbigpe3JldHVybiBwb30sY28uTU9EMl9CT1VOREFSWV9SVUxFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgbG99LGNvLkVORFBPSU5UX0JPVU5EQVJZX1JVTEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBob30sY28uTVVMVElWQUxFTlRfRU5EUE9JTlRfQk9VTkRBUllfUlVMRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGZvfSxjby5NT05PVkFMRU5UX0VORFBPSU5UX0JPVU5EQVJZX1JVTEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwb30sY28uT0dDX1NGU19CT1VOREFSWV9SVUxFLmdldD1mdW5jdGlvbigpe3JldHVybiB1by5NT0QyX0JPVU5EQVJZX1JVTEV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHVvLGNvKTt2YXIgbG89ZnVuY3Rpb24oKXt9O2xvLnByb3RvdHlwZS5pc0luQm91bmRhcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQlMj09MX0sbG8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3VvXX0sbG8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGxvfTt2YXIgaG89ZnVuY3Rpb24oKXt9O2hvLnByb3RvdHlwZS5pc0luQm91bmRhcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MH0saG8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3VvXX0saG8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGhvfTt2YXIgZm89ZnVuY3Rpb24oKXt9O2ZvLnByb3RvdHlwZS5pc0luQm91bmRhcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MX0sZm8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3VvXX0sZm8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGZvfTt2YXIgcG89ZnVuY3Rpb24oKXt9O3BvLnByb3RvdHlwZS5pc0luQm91bmRhcnk9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10fSxwby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdW9dfSxwby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcG99O3ZhciBnbz1mdW5jdGlvbigpe307Z28ucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe30sZ28ucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbigpe30sZ28ucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXt9LGdvLnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe30sZ28ucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXt9LGdvLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7fSxnby5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7fTt2YXIgeW89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyksdGhpcy5tZXNzYWdlPWV8fCIifXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtuYW1lOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gbi5uYW1lLmdldD1mdW5jdGlvbigpe3JldHVybiJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShFcnJvciksbW89ZnVuY3Rpb24oKXt9O21vLnByb3RvdHlwZS5oYXNOZXh0PWZ1bmN0aW9uKCl7fSxtby5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe30sbW8ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe307dmFyIHZvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXt9LGV9KGdvKTtmdW5jdGlvbiBfbyh0KXt0aGlzLm1lc3NhZ2U9dHx8IiJ9X28ucHJvdG90eXBlPW5ldyBFcnJvcixfby5wcm90b3R5cGUubmFtZT0iTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiI7dmFyIHhvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5hcnJheV89W10sYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBnbyYmdGhpcy5hZGRBbGwoYXJndW1lbnRzWzBdKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZW5zdXJlQ2FwYWNpdHk9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3QsZ29dfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuYXJyYXlfLnB1c2godCk6dGhpcy5hcnJheV8uc3BsaWNlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pLCEwfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuYXJyYXlfPVtdfSxlLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspdGhpcy5hZGQoZS5uZXh0KCkpO3JldHVybiEwfSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmFycmF5X1t0XTtyZXR1cm4gdGhpcy5hcnJheV9bdF09ZSxufSxlLnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgd28odGhpcyl9LGUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZih0PDB8fHQ+PXRoaXMuc2l6ZSgpKXRocm93IG5ldyB5bztyZXR1cm4gdGhpcy5hcnJheV9bdF19LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuYXJyYXlfLmxlbmd0aH0sZS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFycmF5Xy5sZW5ndGh9LGUucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspdC5wdXNoKHRoaXMuYXJyYXlfW2VdKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0hMSxuPTAscj10aGlzLmFycmF5Xy5sZW5ndGg7bjxyO24rKylpZih0aGlzLmFycmF5X1tuXT09PXQpe3RoaXMuYXJyYXlfLnNwbGljZShuLDEpLGU9ITA7YnJlYWt9cmV0dXJuIGV9LGV9KHZvKSx3bz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLmFycmF5TGlzdF89ZSx0aGlzLnBvc2l0aW9uXz0wfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5wb3NpdGlvbl89PT10aGlzLmFycmF5TGlzdF8uc2l6ZSgpKXRocm93IG5ldyBfbztyZXR1cm4gdGhpcy5hcnJheUxpc3RfLmdldCh0aGlzLnBvc2l0aW9uXysrKX0sZS5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uXzx0aGlzLmFycmF5TGlzdF8uc2l6ZSgpfSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXJyYXlMaXN0Xy5zZXQodGhpcy5wb3NpdGlvbl8tMSx0KX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5hcnJheUxpc3RfLnJlbW92ZSh0aGlzLmFycmF5TGlzdF8uZ2V0KHRoaXMucG9zaXRpb25fKSl9LGV9KG1vKSxibz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7aWYodC5jYWxsKHRoaXMpLDAhPT1hcmd1bWVudHMubGVuZ3RoKWlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5lbnN1cmVDYXBhY2l0eShlLmxlbmd0aCksdGhpcy5hZGQoZSwhMCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMuZW5zdXJlQ2FwYWNpdHkobi5sZW5ndGgpLHRoaXMuYWRkKG4scil9fXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtjb29yZEFycmF5VHlwZTp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIG4uY29vcmRBcnJheVR5cGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBcnJheSgwKS5maWxsKG51bGwpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldCh0KX0sZS5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMV0sbj0hMSxyPWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl0aGlzLmFkZChyLm5leHQoKSxlKSxuPSEwO3JldHVybiBufXJldHVybiB0LnByb3RvdHlwZS5hZGRBbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe2Zvcih2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpLG49MDtuPHRoaXMuc2l6ZSgpO24rKyllLmFkZChuLHRoaXMuZ2V0KG4pLmNvcHkoKSk7cmV0dXJuIGV9LGUucHJvdG90eXBlLnRvQ29vcmRpbmF0ZUFycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9BcnJheShlLmNvb3JkQXJyYXlUeXBlKX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdO3QucHJvdG90eXBlLmFkZC5jYWxsKHRoaXMsbil9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuYWRkKHIsaSwhMCksITB9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgbz1hcmd1bWVudHNbMF07aWYoIWFyZ3VtZW50c1sxXSYmdGhpcy5zaXplKCk+PTEpaWYodGhpcy5nZXQodGhpcy5zaXplKCktMSkuZXF1YWxzMkQobykpcmV0dXJuIG51bGw7dC5wcm90b3R5cGUuYWRkLmNhbGwodGhpcyxvKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgT2JqZWN0JiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5hZGQocyxhKSwhMH19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciB1PWFyZ3VtZW50c1swXSxjPWFyZ3VtZW50c1sxXTtpZihhcmd1bWVudHNbMl0pZm9yKHZhciBsPTA7bDx1Lmxlbmd0aDtsKyspZS5hZGQodVtsXSxjKTtlbHNlIGZvcih2YXIgaD11Lmxlbmd0aC0xO2g+PTA7aC0tKWUuYWRkKHVbaF0sYyk7cmV0dXJuITB9aWYoImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzJdJiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciBmPWFyZ3VtZW50c1swXSxwPWFyZ3VtZW50c1sxXTtpZighYXJndW1lbnRzWzJdKXt2YXIgZD10aGlzLnNpemUoKTtpZihkPjApe2lmKGY+MClpZih0aGlzLmdldChmLTEpLmVxdWFsczJEKHApKXJldHVybiBudWxsO2lmKGY8ZClpZih0aGlzLmdldChmKS5lcXVhbHMyRChwKSlyZXR1cm4gbnVsbH19dC5wcm90b3R5cGUuYWRkLmNhbGwodGhpcyxmLHApfX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZz1hcmd1bWVudHNbMF0seT1hcmd1bWVudHNbMV0sbT1hcmd1bWVudHNbMl0sdj1hcmd1bWVudHNbM10sXz0xO20+diYmKF89LTEpO2Zvcih2YXIgeD1tO3ghPT12O3grPV8pZS5hZGQoZ1t4XSx5KTtyZXR1cm4hMH19LGUucHJvdG90eXBlLmNsb3NlUmluZz1mdW5jdGlvbigpe3RoaXMuc2l6ZSgpPjAmJnRoaXMuYWRkKG5ldyB2aSh0aGlzLmdldCgwKSksITEpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KHhvKSxEbz1mdW5jdGlvbigpe30sRW89e0ZvcndhcmRDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LEJpZGlyZWN0aW9uYWxDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LGNvb3JkQXJyYXlUeXBlOntjb25maWd1cmFibGU6ITB9fTtFby5Gb3J3YXJkQ29tcGFyYXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gQ299LEVvLkJpZGlyZWN0aW9uYWxDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiBTb30sRW8uY29vcmRBcnJheVR5cGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBcnJheSgwKS5maWxsKG51bGwpfSxEby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRG8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIERvfSxEby5pc1Jpbmc9ZnVuY3Rpb24odCl7cmV0dXJuISh0Lmxlbmd0aDw0fHwhdFswXS5lcXVhbHMyRCh0W3QubGVuZ3RoLTFdKSl9LERvLnB0Tm90SW5MaXN0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07aWYoRG8uaW5kZXhPZihyLGUpPDApcmV0dXJuIHJ9cmV0dXJuIG51bGx9LERvLnNjcm9sbD1mdW5jdGlvbih0LGUpe3ZhciBuPURvLmluZGV4T2YoZSx0KTtpZihuPDApcmV0dXJuIG51bGw7dmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKS5maWxsKG51bGwpO2tpLmFycmF5Y29weSh0LG4sciwwLHQubGVuZ3RoLW4pLGtpLmFycmF5Y29weSh0LDAscix0Lmxlbmd0aC1uLG4pLGtpLmFycmF5Y29weShyLDAsdCwwLHQubGVuZ3RoKX0sRG8uZXF1YWxzPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtpZih0PT09ZSlyZXR1cm4hMDtpZihudWxsPT09dHx8bnVsbD09PWV8fHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYoIXRbbl0uZXF1YWxzKGVbbl0pKXJldHVybiExO3JldHVybiEwfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl07aWYocj09PWkpcmV0dXJuITA7aWYobnVsbD09PXJ8fG51bGw9PT1pfHxyLmxlbmd0aCE9PWkubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgcz0wO3M8ci5sZW5ndGg7cysrKWlmKDAhPT1vLmNvbXBhcmUocltzXSxpW3NdKSlyZXR1cm4hMTtyZXR1cm4hMH19LERvLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgYm8scj0wO3I8dC5sZW5ndGg7cisrKWUuaW50ZXJzZWN0cyh0W3JdKSYmbi5hZGQodFtyXSwhMCk7cmV0dXJuIG4udG9Db29yZGluYXRlQXJyYXkoKX0sRG8uaGFzUmVwZWF0ZWRQb2ludHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTx0Lmxlbmd0aDtlKyspaWYodFtlLTFdLmVxdWFscyh0W2VdKSlyZXR1cm4hMDtyZXR1cm4hMX0sRG8ucmVtb3ZlUmVwZWF0ZWRQb2ludHM9ZnVuY3Rpb24odCl7cmV0dXJuIERvLmhhc1JlcGVhdGVkUG9pbnRzKHQpP25ldyBibyh0LCExKS50b0Nvb3JkaW5hdGVBcnJheSgpOnR9LERvLnJldmVyc2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoLTEsbj1NYXRoLnRydW5jKGUvMikscj0wO3I8PW47cisrKXt2YXIgaT10W3JdO3Rbcl09dFtlLXJdLHRbZS1yXT1pfX0sRG8ucmVtb3ZlTnVsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspbnVsbCE9PXRbbl0mJmUrKzt2YXIgcj1uZXcgQXJyYXkoZSkuZmlsbChudWxsKTtpZigwPT09ZSlyZXR1cm4gcjtmb3IodmFyIGk9MCxvPTA7bzx0Lmxlbmd0aDtvKyspbnVsbCE9PXRbb10mJihyW2krK109dFtvXSk7cmV0dXJuIHJ9LERvLmNvcHlEZWVwPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgQXJyYXkodC5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKWVbbl09bmV3IHZpKHRbbl0pO3JldHVybiBlfWlmKDU9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl0scz1hcmd1bWVudHNbM10sYT1hcmd1bWVudHNbNF0sdT0wO3U8YTt1Kyspb1tzK3VdPW5ldyB2aShyW2krdV0pfSxEby5pc0VxdWFsUmV2ZXJzZWQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXSxpPWVbdC5sZW5ndGgtbi0xXTtpZigwIT09ci5jb21wYXJlVG8oaSkpcmV0dXJuITF9cmV0dXJuITB9LERvLmVudmVsb3BlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgamksbj0wO248dC5sZW5ndGg7bisrKWUuZXhwYW5kVG9JbmNsdWRlKHRbbl0pO3JldHVybiBlfSxEby50b0Nvb3JkaW5hdGVBcnJheT1mdW5jdGlvbih0KXtyZXR1cm4gdC50b0FycmF5KERvLmNvb3JkQXJyYXlUeXBlKX0sRG8uYXRMZWFzdE5Db29yZGluYXRlc09yTm90aGluZz1mdW5jdGlvbih0LGUpe3JldHVybiBlLmxlbmd0aD49dD9lOltdfSxEby5pbmRleE9mPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYodC5lcXVhbHMoZVtuXSkpcmV0dXJuIG47cmV0dXJuLTF9LERvLmluY3JlYXNpbmdEaXJlY3Rpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTxNYXRoLnRydW5jKHQubGVuZ3RoLzIpO2UrKyl7dmFyIG49dC5sZW5ndGgtMS1lLHI9dFtlXS5jb21wYXJlVG8odFtuXSk7aWYoMCE9PXIpcmV0dXJuIHJ9cmV0dXJuIDF9LERvLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoJiZuPGUubGVuZ3RoOyl7dmFyIHI9dFtuXS5jb21wYXJlVG8oZVtuXSk7aWYoMCE9PXIpcmV0dXJuIHI7bisrfXJldHVybiBuPGUubGVuZ3RoPy0xOm48dC5sZW5ndGg/MTowfSxEby5taW5Db29yZGluYXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLG49MDtuPHQubGVuZ3RoO24rKykobnVsbD09PWV8fGUuY29tcGFyZVRvKHRbbl0pPjApJiYoZT10W25dKTtyZXR1cm4gZX0sRG8uZXh0cmFjdD1mdW5jdGlvbih0LGUsbil7ZT1DaS5jbGFtcChlLDAsdC5sZW5ndGgpO3ZhciByPShuPUNpLmNsYW1wKG4sLTEsdC5sZW5ndGgpKS1lKzE7bjwwJiYocj0wKSxlPj10Lmxlbmd0aCYmKHI9MCksbjxlJiYocj0wKTt2YXIgaT1uZXcgQXJyYXkocikuZmlsbChudWxsKTtpZigwPT09cilyZXR1cm4gaTtmb3IodmFyIG89MCxzPWU7czw9bjtzKyspaVtvKytdPXRbc107cmV0dXJuIGl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERvLEVvKTt2YXIgQ289ZnVuY3Rpb24oKXt9O0NvLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIERvLmNvbXBhcmUodCxlKX0sQ28ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3lpXX0sQ28ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIENvfTt2YXIgU289ZnVuY3Rpb24oKXt9O1NvLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dCxyPWU7aWYobi5sZW5ndGg8ci5sZW5ndGgpcmV0dXJuLTE7aWYobi5sZW5ndGg+ci5sZW5ndGgpcmV0dXJuIDE7aWYoMD09PW4ubGVuZ3RoKXJldHVybiAwO3ZhciBpPURvLmNvbXBhcmUobixyKTtyZXR1cm4gRG8uaXNFcXVhbFJldmVyc2VkKG4scik/MDppfSxTby5wcm90b3R5cGUuT0xEY29tcGFyZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQscj1lO2lmKG4ubGVuZ3RoPHIubGVuZ3RoKXJldHVybi0xO2lmKG4ubGVuZ3RoPnIubGVuZ3RoKXJldHVybiAxO2lmKDA9PT1uLmxlbmd0aClyZXR1cm4gMDtmb3IodmFyIGk9RG8uaW5jcmVhc2luZ0RpcmVjdGlvbihuKSxvPURvLmluY3JlYXNpbmdEaXJlY3Rpb24ocikscz1pPjA/MDpuLmxlbmd0aC0xLGE9bz4wPzA6bi5sZW5ndGgtMSx1PTA7dTxuLmxlbmd0aDt1Kyspe3ZhciBjPW5bc10uY29tcGFyZVRvKHJbYV0pO2lmKDAhPT1jKXJldHVybiBjO3MrPWksYSs9b31yZXR1cm4gMH0sU28ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3lpXX0sU28ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFNvfTt2YXIgQW89ZnVuY3Rpb24oKXt9O0FvLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt9LEFvLnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24oKXt9LEFvLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7fSxBby5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7fSxBby5wcm90b3R5cGUuZW50cnlTZXQ9ZnVuY3Rpb24oKXt9O3ZhciBObz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KEFvKTtmdW5jdGlvbiBJbyh0KXt0aGlzLm1lc3NhZ2U9dHx8IiJ9ZnVuY3Rpb24gTW8oKXt9SW8ucHJvdG90eXBlPW5ldyBFcnJvcixJby5wcm90b3R5cGUubmFtZT0iT3BlcmF0aW9uTm90U3VwcG9ydGVkIixNby5wcm90b3R5cGU9bmV3IGdvLE1vLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbigpe307dmFyIEZvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5hcnJheV89W10sYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBnbyYmdGhpcy5hZGRBbGwoYXJndW1lbnRzWzBdKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl7aWYodGhpcy5hcnJheV9bZV09PT10KXJldHVybiEwfXJldHVybiExfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIXRoaXMuY29udGFpbnModCkmJih0aGlzLmFycmF5Xy5wdXNoKHQpLCEwKX0sZS5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXRoaXMuYWRkKGUubmV4dCgpKTtyZXR1cm4hMH0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcn0sZS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFycmF5Xy5sZW5ndGh9LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuYXJyYXlfLmxlbmd0aH0sZS5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl0LnB1c2godGhpcy5hcnJheV9bZV0pO3JldHVybiB0fSxlLnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgVG8odGhpcyl9LGV9KE1vKSxUbz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLmhhc2hTZXRfPWUsdGhpcy5wb3NpdGlvbl89MH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKHRoaXMucG9zaXRpb25fPT09dGhpcy5oYXNoU2V0Xy5zaXplKCkpdGhyb3cgbmV3IF9vO3JldHVybiB0aGlzLmhhc2hTZXRfLmFycmF5X1t0aGlzLnBvc2l0aW9uXysrXX0sZS5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uXzx0aGlzLmhhc2hTZXRfLnNpemUoKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IElvfSxlfShtbyk7ZnVuY3Rpb24gT28odCl7cmV0dXJuIG51bGw9PT10PzA6dC5jb2xvcn1mdW5jdGlvbiBMbyh0KXtyZXR1cm4gbnVsbD09PXQ/bnVsbDp0LnBhcmVudH1mdW5jdGlvbiBQbyh0LGUpe251bGwhPT10JiYodC5jb2xvcj1lKX1mdW5jdGlvbiBSbyh0KXtyZXR1cm4gbnVsbD09PXQ/bnVsbDp0LmxlZnR9ZnVuY3Rpb24gQm8odCl7cmV0dXJuIG51bGw9PT10P251bGw6dC5yaWdodH1mdW5jdGlvbiBrbygpe3RoaXMucm9vdF89bnVsbCx0aGlzLnNpemVfPTB9a28ucHJvdG90eXBlPW5ldyBObyxrby5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnJvb3RfO251bGwhPT1lOyl7dmFyIG49dC5jb21wYXJlVG8oZS5rZXkpO2lmKG48MCllPWUubGVmdDtlbHNle2lmKCEobj4wKSlyZXR1cm4gZS52YWx1ZTtlPWUucmlnaHR9fXJldHVybiBudWxsfSxrby5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09PXRoaXMucm9vdF8pcmV0dXJuIHRoaXMucm9vdF89e2tleTp0LHZhbHVlOmUsbGVmdDpudWxsLHJpZ2h0Om51bGwscGFyZW50Om51bGwsY29sb3I6MCxnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfSxnZXRLZXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rZXl9fSx0aGlzLnNpemVfPTEsbnVsbDt2YXIgbixyLGk9dGhpcy5yb290Xztkb3tpZihuPWksKHI9dC5jb21wYXJlVG8oaS5rZXkpKTwwKWk9aS5sZWZ0O2Vsc2V7aWYoIShyPjApKXt2YXIgbz1pLnZhbHVlO3JldHVybiBpLnZhbHVlPWUsb31pPWkucmlnaHR9fXdoaWxlKG51bGwhPT1pKTt2YXIgcz17a2V5OnQsbGVmdDpudWxsLHJpZ2h0Om51bGwsdmFsdWU6ZSxwYXJlbnQ6bixjb2xvcjowLGdldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9LGdldEtleTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtleX19O3JldHVybiByPDA/bi5sZWZ0PXM6bi5yaWdodD1zLHRoaXMuZml4QWZ0ZXJJbnNlcnRpb24ocyksdGhpcy5zaXplXysrLG51bGx9LGtvLnByb3RvdHlwZS5maXhBZnRlckluc2VydGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2Zvcih0LmNvbG9yPTE7bnVsbCE9dCYmdCE9PXRoaXMucm9vdF8mJjE9PT10LnBhcmVudC5jb2xvcjspaWYoTG8odCk9PT1SbyhMbyhMbyh0KSkpKXt2YXIgbj1CbyhMbyhMbyh0KSkpOzE9PT1PbyhuKT8oUG8oTG8odCksMCksUG8obiwwKSxQbyhMbyhMbyh0KSksMSksdD1MbyhMbyh0KSkpOih0PT09Qm8oTG8odCkpJiYodD1Mbyh0KSxlLnJvdGF0ZUxlZnQodCkpLFBvKExvKHQpLDApLFBvKExvKExvKHQpKSwxKSxlLnJvdGF0ZVJpZ2h0KExvKExvKHQpKSkpfWVsc2V7dmFyIHI9Um8oTG8oTG8odCkpKTsxPT09T28ocik/KFBvKExvKHQpLDApLFBvKHIsMCksUG8oTG8oTG8odCkpLDEpLHQ9TG8oTG8odCkpKToodD09PVJvKExvKHQpKSYmKHQ9TG8odCksZS5yb3RhdGVSaWdodCh0KSksUG8oTG8odCksMCksUG8oTG8oTG8odCkpLDEpLGUucm90YXRlTGVmdChMbyhMbyh0KSkpKX10aGlzLnJvb3RfLmNvbG9yPTB9LGtvLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgeG8sZT10aGlzLmdldEZpcnN0RW50cnkoKTtpZihudWxsIT09ZSlmb3IodC5hZGQoZS52YWx1ZSk7bnVsbCE9PShlPWtvLnN1Y2Nlc3NvcihlKSk7KXQuYWRkKGUudmFsdWUpO3JldHVybiB0fSxrby5wcm90b3R5cGUuZW50cnlTZXQ9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRm8sZT10aGlzLmdldEZpcnN0RW50cnkoKTtpZihudWxsIT09ZSlmb3IodC5hZGQoZSk7bnVsbCE9PShlPWtvLnN1Y2Nlc3NvcihlKSk7KXQuYWRkKGUpO3JldHVybiB0fSxrby5wcm90b3R5cGUucm90YXRlTGVmdD1mdW5jdGlvbih0KXtpZihudWxsIT10KXt2YXIgZT10LnJpZ2h0O3QucmlnaHQ9ZS5sZWZ0LG51bGwhPWUubGVmdCYmKGUubGVmdC5wYXJlbnQ9dCksZS5wYXJlbnQ9dC5wYXJlbnQsbnVsbD09PXQucGFyZW50P3RoaXMucm9vdF89ZTp0LnBhcmVudC5sZWZ0PT09dD90LnBhcmVudC5sZWZ0PWU6dC5wYXJlbnQucmlnaHQ9ZSxlLmxlZnQ9dCx0LnBhcmVudD1lfX0sa28ucHJvdG90eXBlLnJvdGF0ZVJpZ2h0PWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3ZhciBlPXQubGVmdDt0LmxlZnQ9ZS5yaWdodCxudWxsIT1lLnJpZ2h0JiYoZS5yaWdodC5wYXJlbnQ9dCksZS5wYXJlbnQ9dC5wYXJlbnQsbnVsbD09PXQucGFyZW50P3RoaXMucm9vdF89ZTp0LnBhcmVudC5yaWdodD09PXQ/dC5wYXJlbnQucmlnaHQ9ZTp0LnBhcmVudC5sZWZ0PWUsZS5yaWdodD10LHQucGFyZW50PWV9fSxrby5wcm90b3R5cGUuZ2V0Rmlyc3RFbnRyeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMucm9vdF87aWYobnVsbCE9dClmb3IoO251bGwhPXQubGVmdDspdD10LmxlZnQ7cmV0dXJuIHR9LGtvLnN1Y2Nlc3Nvcj1mdW5jdGlvbih0KXtpZihudWxsPT09dClyZXR1cm4gbnVsbDtpZihudWxsIT09dC5yaWdodCl7Zm9yKHZhciBlPXQucmlnaHQ7bnVsbCE9PWUubGVmdDspZT1lLmxlZnQ7cmV0dXJuIGV9Zm9yKHZhciBuPXQucGFyZW50LHI9dDtudWxsIT09biYmcj09PW4ucmlnaHQ7KXI9bixuPW4ucGFyZW50O3JldHVybiBufSxrby5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNpemVffTt2YXIgem89ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIGpvKCl7fWZ1bmN0aW9uIFVvKCl7dGhpcy5hcnJheV89W10sYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBnbyYmdGhpcy5hZGRBbGwoYXJndW1lbnRzWzBdKX16by5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sem8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHpvfSxqby5wcm90b3R5cGU9bmV3IE1vLFVvLnByb3RvdHlwZT1uZXcgam8sVW8ucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspe2lmKDA9PT10aGlzLmFycmF5X1tlXS5jb21wYXJlVG8odCkpcmV0dXJuITB9cmV0dXJuITF9LFVvLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7aWYodGhpcy5jb250YWlucyh0KSlyZXR1cm4hMTtmb3IodmFyIGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXtpZigxPT09dGhpcy5hcnJheV9bZV0uY29tcGFyZVRvKHQpKXJldHVybiB0aGlzLmFycmF5Xy5zcGxpY2UoZSwwLHQpLCEwfXJldHVybiB0aGlzLmFycmF5Xy5wdXNoKHQpLCEwfSxVby5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXRoaXMuYWRkKGUubmV4dCgpKTtyZXR1cm4hMH0sVW8ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt0aHJvdyBuZXcgSW99LFVvLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLmxlbmd0aH0sVW8ucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuYXJyYXlfLmxlbmd0aH0sVW8ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspdC5wdXNoKHRoaXMuYXJyYXlfW2VdKTtyZXR1cm4gdH0sVW8ucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxbyh0aGlzKX07dmFyIHFvPWZ1bmN0aW9uKHQpe3RoaXMudHJlZVNldF89dCx0aGlzLnBvc2l0aW9uXz0wfTtxby5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKHRoaXMucG9zaXRpb25fPT09dGhpcy50cmVlU2V0Xy5zaXplKCkpdGhyb3cgbmV3IF9vO3JldHVybiB0aGlzLnRyZWVTZXRfLmFycmF5X1t0aGlzLnBvc2l0aW9uXysrXX0scW8ucHJvdG90eXBlLmhhc05leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb3NpdGlvbl88dGhpcy50cmVlU2V0Xy5zaXplKCl9LHFvLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgSW99O3ZhciBWbz1mdW5jdGlvbigpe307Vm8uc29ydD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGk9YXJndW1lbnRzWzBdO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb21wYXJlVG8oZSl9LGkuc29ydChyKTtlbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKW49YXJndW1lbnRzWzFdLHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5jb21wYXJlKHQsZSl9LGkuc29ydChyKTtlbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXsoZT1pLnNsaWNlKGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pKS5zb3J0KCk7dmFyIG89aS5zbGljZSgwLGFyZ3VtZW50c1sxXSkuY29uY2F0KGUsaS5zbGljZShhcmd1bWVudHNbMl0saS5sZW5ndGgpKTtmb3IoaS5zcGxpY2UoMCxpLmxlbmd0aCksdD0wO3Q8by5sZW5ndGg7dCsrKWkucHVzaChvW3RdKX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKWZvcihlPWkuc2xpY2UoYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSksbj1hcmd1bWVudHNbM10scj1mdW5jdGlvbih0LGUpe3JldHVybiBuLmNvbXBhcmUodCxlKX0sZS5zb3J0KHIpLG89aS5zbGljZSgwLGFyZ3VtZW50c1sxXSkuY29uY2F0KGUsaS5zbGljZShhcmd1bWVudHNbMl0saS5sZW5ndGgpKSxpLnNwbGljZSgwLGkubGVuZ3RoKSx0PTA7dDxvLmxlbmd0aDt0KyspaS5wdXNoKG9bdF0pfSxWby5hc0xpc3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPTAscj10Lmxlbmd0aDtuPHI7bisrKWUuYWRkKHRbbl0pO3JldHVybiBlfTt2YXIgR289ZnVuY3Rpb24oKXt9LFlvPXtQOntjb25maWd1cmFibGU6ITB9LEw6e2NvbmZpZ3VyYWJsZTohMH0sQTp7Y29uZmlndXJhYmxlOiEwfSxGQUxTRTp7Y29uZmlndXJhYmxlOiEwfSxUUlVFOntjb25maWd1cmFibGU6ITB9LERPTlRDQVJFOntjb25maWd1cmFibGU6ITB9LFNZTV9GQUxTRTp7Y29uZmlndXJhYmxlOiEwfSxTWU1fVFJVRTp7Y29uZmlndXJhYmxlOiEwfSxTWU1fRE9OVENBUkU6e2NvbmZpZ3VyYWJsZTohMH0sU1lNX1A6e2NvbmZpZ3VyYWJsZTohMH0sU1lNX0w6e2NvbmZpZ3VyYWJsZTohMH0sU1lNX0E6e2NvbmZpZ3VyYWJsZTohMH19O1lvLlAuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LFlvLkwuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LFlvLkEuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LFlvLkZBTFNFLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxZby5UUlVFLmdldD1mdW5jdGlvbigpe3JldHVybi0yfSxZby5ET05UQ0FSRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tM30sWW8uU1lNX0ZBTFNFLmdldD1mdW5jdGlvbigpe3JldHVybiJGIn0sWW8uU1lNX1RSVUUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIlQifSxZby5TWU1fRE9OVENBUkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIioifSxZby5TWU1fUC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iMCJ9LFlvLlNZTV9MLmdldD1mdW5jdGlvbigpe3JldHVybiIxIn0sWW8uU1lNX0EuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIjIifSxHby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sR28ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEdvfSxHby50b0RpbWVuc2lvblN5bWJvbD1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSBHby5GQUxTRTpyZXR1cm4gR28uU1lNX0ZBTFNFO2Nhc2UgR28uVFJVRTpyZXR1cm4gR28uU1lNX1RSVUU7Y2FzZSBHby5ET05UQ0FSRTpyZXR1cm4gR28uU1lNX0RPTlRDQVJFO2Nhc2UgR28uUDpyZXR1cm4gR28uU1lNX1A7Y2FzZSBHby5MOnJldHVybiBHby5TWU1fTDtjYXNlIEdvLkE6cmV0dXJuIEdvLlNZTV9BfXRocm93IG5ldyBoaX0sR28udG9EaW1lbnNpb25WYWx1ZT1mdW5jdGlvbih0KXtzd2l0Y2goSWkudG9VcHBlckNhc2UodCkpe2Nhc2UgR28uU1lNX0ZBTFNFOnJldHVybiBHby5GQUxTRTtjYXNlIEdvLlNZTV9UUlVFOnJldHVybiBHby5UUlVFO2Nhc2UgR28uU1lNX0RPTlRDQVJFOnJldHVybiBHby5ET05UQ0FSRTtjYXNlIEdvLlNZTV9QOnJldHVybiBHby5QO2Nhc2UgR28uU1lNX0w6cmV0dXJuIEdvLkw7Y2FzZSBHby5TWU1fQTpyZXR1cm4gR28uQX10aHJvdyBuZXcgaGl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEdvLFlvKTt2YXIgWG89ZnVuY3Rpb24oKXt9O1hvLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7fSxYby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWG8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFhvfTt2YXIgV289ZnVuY3Rpb24oKXt9O1dvLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCxlKXt9LFdvLnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXt9LFdvLnByb3RvdHlwZS5pc0dlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe30sV28ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFdvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBXb307dmFyIEhvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXtpZih0LmNhbGwodGhpcyxuKSx0aGlzLl9nZW9tZXRyaWVzPWV8fFtdLHQuaGFzTnVsbEVsZW1lbnRzKHRoaXMuX2dlb21ldHJpZXMpKXRocm93IG5ldyBoaX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmNvbXB1dGVFbnZlbG9wZUludGVybmFsPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBqaSxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdC5leHBhbmRUb0luY2x1ZGUodGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRFbnZlbG9wZUludGVybmFsKCkpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeU49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2dlb21ldHJpZXNbdF19LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9HRU9NRVRSWUNPTExFQ1RJT059LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLmdldE51bVBvaW50cygpKS5maWxsKG51bGwpLGU9LTEsbj0wO248dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7bisrKWZvcih2YXIgcj10aGlzLl9nZW9tZXRyaWVzW25dLmdldENvb3JkaW5hdGVzKCksaT0wO2k8ci5sZW5ndGg7aSsrKXRbKytlXT1yW2ldO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXRBcmVhPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKXQrPXRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0QXJlYSgpO3JldHVybiB0fSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYoIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MoZSkpcmV0dXJuITE7dmFyIHI9ZTtpZih0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCE9PXIuX2dlb21ldHJpZXMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgaT0wO2k8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7aSsrKWlmKCF0aGlzLl9nZW9tZXRyaWVzW2ldLmVxdWFsc0V4YWN0KHIuX2dlb21ldHJpZXNbaV0sbikpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDt0KyspdGhpcy5fZ2VvbWV0cmllc1t0XS5ub3JtYWxpemUoKTtWby5zb3J0KHRoaXMuX2dlb21ldHJpZXMpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP251bGw6dGhpcy5fZ2VvbWV0cmllc1swXS5nZXRDb29yZGluYXRlKCl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PUdvLkZBTFNFLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKyl0PU1hdGgubWF4KHQsdGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRCb3VuZGFyeURpbWVuc2lvbigpKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PUdvLkZBTFNFLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKyl0PU1hdGgubWF4KHQsdGhpcy5fZ2VvbWV0cmllc1tlXS5nZXREaW1lbnNpb24oKSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKyl0Kz10aGlzLl9nZW9tZXRyaWVzW2VdLmdldExlbmd0aCgpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXROdW1Qb2ludHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdCs9dGhpcy5fZ2VvbWV0cmllc1tlXS5nZXROdW1Qb2ludHMoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0TnVtR2VvbWV0cmllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aH0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCxlPW5ldyBBcnJheSh0KS5maWxsKG51bGwpLG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyllW25dPXRoaXMuX2dlb21ldHJpZXNbbl0ucmV2ZXJzZSgpO3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oZSl9LGUucHJvdG90eXBlLmNvbXBhcmVUb1NhbWVDbGFzcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgVW8oVm8uYXNMaXN0KHRoaXMuX2dlb21ldHJpZXMpKSxuPW5ldyBVbyhWby5hc0xpc3QodC5fZ2VvbWV0cmllcykpO3JldHVybiB0aGlzLmNvbXBhcmUoZSxuKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciByPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1swXSxvPXRoaXMuZ2V0TnVtR2VvbWV0cmllcygpLHM9aS5nZXROdW1HZW9tZXRyaWVzKCksYT0wO2E8byYmYTxzOyl7dmFyIHU9dGhpcy5nZXRHZW9tZXRyeU4oYSksYz1pLmdldEdlb21ldHJ5TihhKSxsPXUuY29tcGFyZVRvU2FtZUNsYXNzKGMscik7aWYoMCE9PWwpcmV0dXJuIGw7YSsrfXJldHVybiBhPG8/MTphPHM/LTE6MH19LGUucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihFaShhcmd1bWVudHNbMF0sYW8pKWZvcih2YXIgZT1hcmd1bWVudHNbMF0sbj0wO248dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7bisrKXQuX2dlb21ldHJpZXNbbl0uYXBwbHkoZSk7ZWxzZSBpZihFaShhcmd1bWVudHNbMF0sV28pKXt2YXIgcj1hcmd1bWVudHNbMF07aWYoMD09PXRoaXMuX2dlb21ldHJpZXMubGVuZ3RoKXJldHVybiBudWxsO2Zvcih2YXIgaT0wO2k8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgmJih0Ll9nZW9tZXRyaWVzW2ldLmFwcGx5KHIpLCFyLmlzRG9uZSgpKTtpKyspO3IuaXNHZW9tZXRyeUNoYW5nZWQoKSYmdGhpcy5nZW9tZXRyeUNoYW5nZWQoKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxYbykpe3ZhciBvPWFyZ3VtZW50c1swXTtvLmZpbHRlcih0aGlzKTtmb3IodmFyIHM9MDtzPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO3MrKyl0Ll9nZW9tZXRyaWVzW3NdLmFwcGx5KG8pfWVsc2UgaWYoRWkoYXJndW1lbnRzWzBdLHJvKSl7dmFyIGE9YXJndW1lbnRzWzBdO2EuZmlsdGVyKHRoaXMpO2Zvcih2YXIgdT0wO3U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7dSsrKXQuX2dlb21ldHJpZXNbdV0uYXBwbHkoYSl9fSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKHRoaXMpLFppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCksbnVsbH0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO2UuX2dlb21ldHJpZXM9bmV3IEFycmF5KHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoKS5maWxsKG51bGwpO2Zvcih2YXIgbj0wO248dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7bisrKWUuX2dlb21ldHJpZXNbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jbG9uZSgpO3JldHVybiBlfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iR2VvbWV0cnlDb2xsZWN0aW9uIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO3QrKylpZighdGhpcy5fZ2VvbWV0cmllc1t0XS5pc0VtcHR5KCkpcmV0dXJuITE7cmV0dXJuITB9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHg0ZjA3YmNiMWY4NTdkODAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KGlvKSxabz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gaW8uU09SVElOREVYX01VTFRJTElORVNUUklOR30sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSYmdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0Nsb3NlZCgpP0dvLkZBTFNFOjB9LGUucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7Zm9yKHZhciB0PTA7dDx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDt0KyspaWYoIXRoaXMuX2dlb21ldHJpZXNbdF0uaXNDbG9zZWQoKSlyZXR1cm4hMTtyZXR1cm4hMH0sZS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDF9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgsZT1uZXcgQXJyYXkodCkuZmlsbChudWxsKSxuPTA7bjx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtuKyspZVt0LTEtbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5yZXZlcnNlKCk7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZyhlKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEtvKHRoaXMpLmdldEJvdW5kYXJ5KCl9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJNdWx0aUxpbmVTdHJpbmcifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCkuZmlsbChudWxsKSxuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXT10aGlzLl9nZW9tZXRyaWVzW25dLmNvcHkoKTtyZXR1cm4gbmV3IGUodCx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bem9dfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NzE1NWQyYWI0YWZhODAwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShIbyksS289ZnVuY3Rpb24oKXtpZih0aGlzLl9nZW9tPW51bGwsdGhpcy5fZ2VvbUZhY3Q9bnVsbCx0aGlzLl9iblJ1bGU9bnVsbCx0aGlzLl9lbmRwb2ludE1hcD1udWxsLDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT11by5NT0QyX0JPVU5EQVJZX1JVTEU7dGhpcy5fZ2VvbT10LHRoaXMuX2dlb21GYWN0PXQuZ2V0RmFjdG9yeSgpLHRoaXMuX2JuUnVsZT1lfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLl9nZW9tPW4sdGhpcy5fZ2VvbUZhY3Q9bi5nZXRGYWN0b3J5KCksdGhpcy5fYm5SdWxlPXJ9fTtLby5wcm90b3R5cGUuYm91bmRhcnlNdWx0aUxpbmVTdHJpbmc9ZnVuY3Rpb24odCl7aWYodGhpcy5fZ2VvbS5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuZ2V0RW1wdHlNdWx0aVBvaW50KCk7dmFyIGU9dGhpcy5jb21wdXRlQm91bmRhcnlDb29yZGluYXRlcyh0KTtyZXR1cm4gMT09PWUubGVuZ3RoP3RoaXMuX2dlb21GYWN0LmNyZWF0ZVBvaW50KGVbMF0pOnRoaXMuX2dlb21GYWN0LmNyZWF0ZU11bHRpUG9pbnRGcm9tQ29vcmRzKGUpfSxLby5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2VvbSBpbnN0YW5jZW9mIGFzP3RoaXMuYm91bmRhcnlMaW5lU3RyaW5nKHRoaXMuX2dlb20pOnRoaXMuX2dlb20gaW5zdGFuY2VvZiBabz90aGlzLmJvdW5kYXJ5TXVsdGlMaW5lU3RyaW5nKHRoaXMuX2dlb20pOnRoaXMuX2dlb20uZ2V0Qm91bmRhcnkoKX0sS28ucHJvdG90eXBlLmJvdW5kYXJ5TGluZVN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZ2VvbS5pc0VtcHR5KCk/dGhpcy5nZXRFbXB0eU11bHRpUG9pbnQoKTp0LmlzQ2xvc2VkKCk/dGhpcy5fYm5SdWxlLmlzSW5Cb3VuZGFyeSgyKT90LmdldFN0YXJ0UG9pbnQoKTp0aGlzLl9nZW9tRmFjdC5jcmVhdGVNdWx0aVBvaW50KCk6dGhpcy5fZ2VvbUZhY3QuY3JlYXRlTXVsdGlQb2ludChbdC5nZXRTdGFydFBvaW50KCksdC5nZXRFbmRQb2ludCgpXSl9LEtvLnByb3RvdHlwZS5nZXRFbXB0eU11bHRpUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2VvbUZhY3QuY3JlYXRlTXVsdGlQb2ludCgpfSxLby5wcm90b3R5cGUuY29tcHV0ZUJvdW5kYXJ5Q29vcmRpbmF0ZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPW5ldyB4bzt0aGlzLl9lbmRwb2ludE1hcD1uZXcga287Zm9yKHZhciByPTA7cjx0LmdldE51bUdlb21ldHJpZXMoKTtyKyspe3ZhciBpPXQuZ2V0R2VvbWV0cnlOKHIpOzAhPT1pLmdldE51bVBvaW50cygpJiYoZS5hZGRFbmRwb2ludChpLmdldENvb3JkaW5hdGVOKDApKSxlLmFkZEVuZHBvaW50KGkuZ2V0Q29vcmRpbmF0ZU4oaS5nZXROdW1Qb2ludHMoKS0xKSkpfWZvcih2YXIgbz10aGlzLl9lbmRwb2ludE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKSxhPXMuZ2V0VmFsdWUoKS5jb3VudDtlLl9iblJ1bGUuaXNJbkJvdW5kYXJ5KGEpJiZuLmFkZChzLmdldEtleSgpKX1yZXR1cm4gRG8udG9Db29yZGluYXRlQXJyYXkobil9LEtvLnByb3RvdHlwZS5hZGRFbmRwb2ludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9lbmRwb2ludE1hcC5nZXQodCk7bnVsbD09PWUmJihlPW5ldyBKbyx0aGlzLl9lbmRwb2ludE1hcC5wdXQodCxlKSksZS5jb3VudCsrfSxLby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sS28ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEtvfSxLby5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgS28oYXJndW1lbnRzWzBdKS5nZXRCb3VuZGFyeSgpOjI9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBLbyhhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKS5nZXRCb3VuZGFyeSgpOnZvaWQgMH07dmFyIEpvPWZ1bmN0aW9uKCl7dGhpcy5jb3VudD1udWxsfTtmdW5jdGlvbiBRbygpe31mdW5jdGlvbiAkbygpe31Kby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSm8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEpvfTt2YXIgdHM9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIGVzKCl7fWZ1bmN0aW9uIG5zKCl7fWZ1bmN0aW9uIHJzKCl7fXZhciBpcz1mdW5jdGlvbigpe30sb3M9e05FV0xJTkU6e2NvbmZpZ3VyYWJsZTohMH0sU0lNUExFX09SRElOQVRFX0ZPUk1BVDp7Y29uZmlndXJhYmxlOiEwfX07aXMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGlzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBpc30saXMuY2hhcnM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IEFycmF5KGUpLmZpbGwobnVsbCkscj0wO3I8ZTtyKyspbltyXT10O3JldHVybiBTdHJpbmcobil9LGlzLmdldFN0YWNrVHJhY2U9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9bmV3IGVzLG49bmV3IFFvO3JldHVybiB0LnByaW50U3RhY2tUcmFjZShuKSxlLnRvU3RyaW5nKCl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1sxXSxpPSIiO25ldyAkbyhpcy5nZXRTdGFja1RyYWNlKGFyZ3VtZW50c1swXSkpO2Zvcih2YXIgbz1uZXcgcnMscz0wO3M8cjtzKyspdHJ5e2krPW8ucmVhZExpbmUoKStpcy5ORVdMSU5FfWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIG5zKSl0aHJvdyB0O1ppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCl9cmV0dXJuIGl9fSxpcy5zcGxpdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLmxlbmd0aCxyPW5ldyB4byxpPSIiK3Qsbz1pLmluZGV4T2YoZSk7bz49MDspe3ZhciBzPWkuc3Vic3RyaW5nKDAsbyk7ci5hZGQocyksbz0oaT1pLnN1YnN0cmluZyhvK24pKS5pbmRleE9mKGUpfWkubGVuZ3RoPjAmJnIuYWRkKGkpO2Zvcih2YXIgYT1uZXcgQXJyYXkoci5zaXplKCkpLmZpbGwobnVsbCksdT0wO3U8YS5sZW5ndGg7dSsrKWFbdV09ci5nZXQodSk7cmV0dXJuIGF9LGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gaXMuU0lNUExFX09SRElOQVRFX0ZPUk1BVC5mb3JtYXQodCl9fSxpcy5zcGFjZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGlzLmNoYXJzKCIgIix0KX0sb3MuTkVXTElORS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4ga2kuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIil9LG9zLlNJTVBMRV9PUkRJTkFURV9GT1JNQVQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0c30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaXMsb3MpO3ZhciBzcz1mdW5jdGlvbigpe307c3MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHNzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBzc30sc3MuY29weUNvb3JkPWZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaT1NYXRoLm1pbih0LmdldERpbWVuc2lvbigpLG4uZ2V0RGltZW5zaW9uKCkpLG89MDtvPGk7bysrKW4uc2V0T3JkaW5hdGUocixvLHQuZ2V0T3JkaW5hdGUoZSxvKSl9LHNzLmlzUmluZz1mdW5jdGlvbih0KXt2YXIgZT10LnNpemUoKTtyZXR1cm4gMD09PWV8fCEoZTw9MykmJih0LmdldE9yZGluYXRlKDAsTGkuWCk9PT10LmdldE9yZGluYXRlKGUtMSxMaS5YKSYmdC5nZXRPcmRpbmF0ZSgwLExpLlkpPT09dC5nZXRPcmRpbmF0ZShlLTEsTGkuWSkpfSxzcy5pc0VxdWFsPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5zaXplKCk7aWYobiE9PWUuc2l6ZSgpKXJldHVybiExO2Zvcih2YXIgcj1NYXRoLm1pbih0LmdldERpbWVuc2lvbigpLGUuZ2V0RGltZW5zaW9uKCkpLGk9MDtpPG47aSsrKWZvcih2YXIgbz0wO288cjtvKyspe3ZhciBzPXQuZ2V0T3JkaW5hdGUoaSxvKSxhPWUuZ2V0T3JkaW5hdGUoaSxvKTtpZighKHQuZ2V0T3JkaW5hdGUoaSxvKT09PWUuZ2V0T3JkaW5hdGUoaSxvKXx8ZmkuaXNOYU4ocykmJmZpLmlzTmFOKGEpKSlyZXR1cm4hMX1yZXR1cm4hMH0sc3MuZXh0ZW5kPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmNyZWF0ZShuLGUuZ2V0RGltZW5zaW9uKCkpLGk9ZS5zaXplKCk7aWYoc3MuY29weShlLDAsciwwLGkpLGk+MClmb3IodmFyIG89aTtvPG47bysrKXNzLmNvcHkoZSxpLTEscixvLDEpO3JldHVybiByfSxzcy5yZXZlcnNlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LnNpemUoKS0xLG49TWF0aC50cnVuYyhlLzIpLHI9MDtyPD1uO3IrKylzcy5zd2FwKHQscixlLXIpfSxzcy5zd2FwPWZ1bmN0aW9uKHQsZSxuKXtpZihlPT09bilyZXR1cm4gbnVsbDtmb3IodmFyIHI9MDtyPHQuZ2V0RGltZW5zaW9uKCk7cisrKXt2YXIgaT10LmdldE9yZGluYXRlKGUscik7dC5zZXRPcmRpbmF0ZShlLHIsdC5nZXRPcmRpbmF0ZShuLHIpKSx0LnNldE9yZGluYXRlKG4scixpKX19LHNzLmNvcHk9ZnVuY3Rpb24odCxlLG4scixpKXtmb3IodmFyIG89MDtvPGk7bysrKXNzLmNvcHlDb29yZCh0LGUrbyxuLHIrbyl9LHNzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXQuc2l6ZSgpO2lmKDA9PT1lKXJldHVybiIoKSI7dmFyIG49dC5nZXREaW1lbnNpb24oKSxyPW5ldyBBaTtyLmFwcGVuZCgiKCIpO2Zvcih2YXIgaT0wO2k8ZTtpKyspe2k+MCYmci5hcHBlbmQoIiAiKTtmb3IodmFyIG89MDtvPG47bysrKW8+MCYmci5hcHBlbmQoIiwiKSxyLmFwcGVuZChpcy50b1N0cmluZyh0LmdldE9yZGluYXRlKGksbykpKX1yZXR1cm4gci5hcHBlbmQoIikiKSxyLnRvU3RyaW5nKCl9fSxzcy5lbnN1cmVWYWxpZFJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnNpemUoKTtyZXR1cm4gMD09PW4/ZTpuPD0zP3NzLmNyZWF0ZUNsb3NlZFJpbmcodCxlLDQpOmUuZ2V0T3JkaW5hdGUoMCxMaS5YKT09PWUuZ2V0T3JkaW5hdGUobi0xLExpLlgpJiZlLmdldE9yZGluYXRlKDAsTGkuWSk9PT1lLmdldE9yZGluYXRlKG4tMSxMaS5ZKT9lOnNzLmNyZWF0ZUNsb3NlZFJpbmcodCxlLG4rMSl9LHNzLmNyZWF0ZUNsb3NlZFJpbmc9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuY3JlYXRlKG4sZS5nZXREaW1lbnNpb24oKSksaT1lLnNpemUoKTtzcy5jb3B5KGUsMCxyLDAsaSk7Zm9yKHZhciBvPWk7bzxuO28rKylzcy5jb3B5KGUsMCxyLG8sMSk7cmV0dXJuIHJ9O3ZhciBhcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dC5jYWxsKHRoaXMsbiksdGhpcy5fcG9pbnRzPW51bGwsdGhpcy5pbml0KGUpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuY29tcHV0ZUVudmVsb3BlSW50ZXJuYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/bmV3IGppOnRoaXMuX3BvaW50cy5leHBhbmRFbnZlbG9wZShuZXcgamkpfSxlLnByb3RvdHlwZS5pc1Jpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0Nsb3NlZCgpJiZ0aGlzLmlzU2ltcGxlKCl9LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9MSU5FU1RSSU5HfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb2ludHMudG9Db29yZGluYXRlQXJyYXkoKX0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKCF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpKXJldHVybiExO3ZhciByPWU7aWYodGhpcy5fcG9pbnRzLnNpemUoKSE9PXIuX3BvaW50cy5zaXplKCkpcmV0dXJuITE7Zm9yKHZhciBpPTA7aTx0aGlzLl9wb2ludHMuc2l6ZSgpO2krKylpZighdGhpcy5lcXVhbCh0aGlzLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZShpKSxyLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZShpKSxuKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPTA7ZTxNYXRoLnRydW5jKHRoaXMuX3BvaW50cy5zaXplKCkvMik7ZSsrKXt2YXIgbj10Ll9wb2ludHMuc2l6ZSgpLTEtZTtpZighdC5fcG9pbnRzLmdldENvb3JkaW5hdGUoZSkuZXF1YWxzKHQuX3BvaW50cy5nZXRDb29yZGluYXRlKG4pKSlyZXR1cm4gdC5fcG9pbnRzLmdldENvb3JkaW5hdGUoZSkuY29tcGFyZVRvKHQuX3BvaW50cy5nZXRDb29yZGluYXRlKG4pKT4wJiZzcy5yZXZlcnNlKHQuX3BvaW50cyksbnVsbH19LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/bnVsbDp0aGlzLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZSgwKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0Nsb3NlZCgpP0dvLkZBTFNFOjB9LGUucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNFbXB0eSgpJiZ0aGlzLmdldENvb3JkaW5hdGVOKDApLmVxdWFsczJEKHRoaXMuZ2V0Q29vcmRpbmF0ZU4odGhpcy5nZXROdW1Qb2ludHMoKS0xKSl9LGUucHJvdG90eXBlLmdldEVuZFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP251bGw6dGhpcy5nZXRQb2ludE4odGhpcy5nZXROdW1Qb2ludHMoKS0xKX0sZS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDF9LGUucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiBlby5jb21wdXRlTGVuZ3RoKHRoaXMuX3BvaW50cyl9LGUucHJvdG90eXBlLmdldE51bVBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb2ludHMuc2l6ZSgpfSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcG9pbnRzLmNvcHkoKTtyZXR1cm4gc3MucmV2ZXJzZSh0KSx0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lU3RyaW5nKHQpfSxlLnByb3RvdHlwZS5jb21wYXJlVG9TYW1lQ2xhc3M9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciB0PWFyZ3VtZW50c1swXSxlPTAsbj0wO2U8dGhpcy5fcG9pbnRzLnNpemUoKSYmbjx0Ll9wb2ludHMuc2l6ZSgpOyl7dmFyIHI9dGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUoZSkuY29tcGFyZVRvKHQuX3BvaW50cy5nZXRDb29yZGluYXRlKG4pKTtpZigwIT09cilyZXR1cm4gcjtlKyssbisrfXJldHVybiBlPHRoaXMuX3BvaW50cy5zaXplKCk/MTpuPHQuX3BvaW50cy5zaXplKCk/LTE6MH1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMV0uY29tcGFyZSh0aGlzLl9wb2ludHMsaS5fcG9pbnRzKX19LGUucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKCl7aWYoRWkoYXJndW1lbnRzWzBdLGFvKSlmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9MDtlPHRoaXMuX3BvaW50cy5zaXplKCk7ZSsrKXQuZmlsdGVyKHRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKGUpKTtlbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxXbykpe3ZhciBuPWFyZ3VtZW50c1swXTtpZigwPT09dGhpcy5fcG9pbnRzLnNpemUoKSlyZXR1cm4gbnVsbDtmb3IodmFyIHI9MDtyPHRoaXMuX3BvaW50cy5zaXplKCkmJihuLmZpbHRlcih0aGlzLl9wb2ludHMsciksIW4uaXNEb25lKCkpO3IrKyk7bi5pc0dlb21ldHJ5Q2hhbmdlZCgpJiZ0aGlzLmdlb21ldHJ5Q2hhbmdlZCgpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzBdLFhvKSl7YXJndW1lbnRzWzBdLmZpbHRlcih0aGlzKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxybykpe2FyZ3VtZW50c1swXS5maWx0ZXIodGhpcyl9fSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiBuZXcgS28odGhpcykuZ2V0Qm91bmRhcnkoKX0sZS5wcm90b3R5cGUuaXNFcXVpdmFsZW50Q2xhc3M9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBlfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7cmV0dXJuIGUuX3BvaW50cz10aGlzLl9wb2ludHMuY2xvbmUoKSxlfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlTj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUodCl9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJMaW5lU3RyaW5nIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLl9wb2ludHMuY29weSgpLHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlU2VxdWVuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9pbnRzfSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9wb2ludHMuc2l6ZSgpfSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10JiYodD10aGlzLmdldEZhY3RvcnkoKS5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFtdKSksMT09PXQuc2l6ZSgpKXRocm93IG5ldyBoaSgiSW52YWxpZCBudW1iZXIgb2YgcG9pbnRzIGluIExpbmVTdHJpbmcgKGZvdW5kICIrdC5zaXplKCkrIiAtIG11c3QgYmUgMCBvciA+PSAyKSIpO3RoaXMuX3BvaW50cz10fSxlLnByb3RvdHlwZS5pc0Nvb3JkaW5hdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9wb2ludHMuc2l6ZSgpO2UrKylpZih0aGlzLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZShlKS5lcXVhbHModCkpcmV0dXJuITA7cmV0dXJuITF9LGUucHJvdG90eXBlLmdldFN0YXJ0UG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/bnVsbDp0aGlzLmdldFBvaW50TigwKX0sZS5wcm90b3R5cGUuZ2V0UG9pbnROPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVQb2ludCh0aGlzLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZSh0KSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3pvXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDJiMmI1MWJhNDM1YzhlMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oaW8pLHVzPWZ1bmN0aW9uKCl7fTt1cy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdXMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHVzfTt2YXIgY3M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3QuY2FsbCh0aGlzLG4pLHRoaXMuX2Nvb3JkaW5hdGVzPWV8fG51bGwsdGhpcy5pbml0KHRoaXMuX2Nvb3JkaW5hdGVzKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmNvbXB1dGVFbnZlbG9wZUludGVybmFsPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIG5ldyBqaTt2YXIgdD1uZXcgamk7cmV0dXJuIHQuZXhwYW5kVG9JbmNsdWRlKHRoaXMuX2Nvb3JkaW5hdGVzLmdldFgoMCksdGhpcy5fY29vcmRpbmF0ZXMuZ2V0WSgwKSksdH0sZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHQuU09SVElOREVYX1BPSU5UfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9bXTpbdGhpcy5nZXRDb29yZGluYXRlKCldfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuISF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpJiYoISghdGhpcy5pc0VtcHR5KCl8fCFlLmlzRW1wdHkoKSl8fHRoaXMuaXNFbXB0eSgpPT09ZS5pc0VtcHR5KCkmJnRoaXMuZXF1YWwoZS5nZXRDb29yZGluYXRlKCksdGhpcy5nZXRDb29yZGluYXRlKCksbikpfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy5fY29vcmRpbmF0ZXMuc2l6ZSgpP3RoaXMuX2Nvb3JkaW5hdGVzLmdldENvb3JkaW5hdGUoMCk6bnVsbH0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gR28uRkFMU0V9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAwfSxlLnByb3RvdHlwZS5nZXROdW1Qb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/MDoxfSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29weSgpfSxlLnByb3RvdHlwZS5nZXRYPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuZ2V0Q29vcmRpbmF0ZSgpKXRocm93IG5ldyBFcnJvcigiZ2V0WCBjYWxsZWQgb24gZW1wdHkgUG9pbnQiKTtyZXR1cm4gdGhpcy5nZXRDb29yZGluYXRlKCkueH0sZS5wcm90b3R5cGUuY29tcGFyZVRvU2FtZUNsYXNzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5nZXRDb29yZGluYXRlKCkuY29tcGFyZVRvKHQuZ2V0Q29vcmRpbmF0ZSgpKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMV0uY29tcGFyZSh0aGlzLl9jb29yZGluYXRlcyxlLl9jb29yZGluYXRlcyl9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbigpe2lmKEVpKGFyZ3VtZW50c1swXSxhbykpe3ZhciB0PWFyZ3VtZW50c1swXTtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt0LmZpbHRlcih0aGlzLmdldENvb3JkaW5hdGUoKSl9ZWxzZSBpZihFaShhcmd1bWVudHNbMF0sV28pKXt2YXIgZT1hcmd1bWVudHNbMF07aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIG51bGw7ZS5maWx0ZXIodGhpcy5fY29vcmRpbmF0ZXMsMCksZS5pc0dlb21ldHJ5Q2hhbmdlZCgpJiZ0aGlzLmdlb21ldHJ5Q2hhbmdlZCgpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzBdLFhvKSl7YXJndW1lbnRzWzBdLmZpbHRlcih0aGlzKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxybykpe2FyZ3VtZW50c1swXS5maWx0ZXIodGhpcyl9fSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24obnVsbCl9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtyZXR1cm4gZS5fY29vcmRpbmF0ZXM9dGhpcy5fY29vcmRpbmF0ZXMuY2xvbmUoKSxlfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iUG9pbnQifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKHRoaXMuX2Nvb3JkaW5hdGVzLmNvcHkoKSx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzfSxlLnByb3RvdHlwZS5nZXRZPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuZ2V0Q29vcmRpbmF0ZSgpKXRocm93IG5ldyBFcnJvcigiZ2V0WSBjYWxsZWQgb24gZW1wdHkgUG9pbnQiKTtyZXR1cm4gdGhpcy5nZXRDb29yZGluYXRlKCkueX0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5fY29vcmRpbmF0ZXMuc2l6ZSgpfSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe251bGw9PT10JiYodD10aGlzLmdldEZhY3RvcnkoKS5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFtdKSksWmkuaXNUcnVlKHQuc2l6ZSgpPD0xKSx0aGlzLl9jb29yZGluYXRlcz10fSxlLnByb3RvdHlwZS5pc1NpbXBsZT1mdW5jdGlvbigpe3JldHVybiEwfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt1c119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg0NDA3N2JhZDE2MWNiYzAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KGlvKSxscz1mdW5jdGlvbigpe307bHMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGxzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBsc307dmFyIGhzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIpe2lmKHQuY2FsbCh0aGlzLHIpLHRoaXMuX3NoZWxsPW51bGwsdGhpcy5faG9sZXM9bnVsbCxudWxsPT09ZSYmKGU9dGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTGluZWFyUmluZygpKSxudWxsPT09biYmKG49W10pLHQuaGFzTnVsbEVsZW1lbnRzKG4pKXRocm93IG5ldyBoaTtpZihlLmlzRW1wdHkoKSYmdC5oYXNOb25FbXB0eUVsZW1lbnRzKG4pKXRocm93IG5ldyBoaTt0aGlzLl9zaGVsbD1lLHRoaXMuX2hvbGVzPW59dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5jb21wdXRlRW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbC5nZXRFbnZlbG9wZUludGVybmFsKCl9LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9QT0xZR09OfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybltdO2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5nZXROdW1Qb2ludHMoKSkuZmlsbChudWxsKSxlPS0xLG49dGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZXMoKSxyPTA7cjxuLmxlbmd0aDtyKyspdFsrK2VdPW5bcl07Zm9yKHZhciBpPTA7aTx0aGlzLl9ob2xlcy5sZW5ndGg7aSsrKWZvcih2YXIgbz10aGlzLl9ob2xlc1tpXS5nZXRDb29yZGluYXRlcygpLHM9MDtzPG8ubGVuZ3RoO3MrKyl0WysrZV09b1tzXTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0QXJlYT1mdW5jdGlvbigpe3ZhciB0PTA7dCs9TWF0aC5hYnMoZW8uc2lnbmVkQXJlYSh0aGlzLl9zaGVsbC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSkpO2Zvcih2YXIgZT0wO2U8dGhpcy5faG9sZXMubGVuZ3RoO2UrKyl0LT1NYXRoLmFicyhlby5zaWduZWRBcmVhKHRoaXMuX2hvbGVzW2VdLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpKSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmlzUmVjdGFuZ2xlPWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMuZ2V0TnVtSW50ZXJpb3JSaW5nKCl8fG51bGw9PT10aGlzLl9zaGVsbHx8NSE9PXRoaXMuX3NoZWxsLmdldE51bVBvaW50cygpKXJldHVybiExO2Zvcih2YXIgdD10aGlzLl9zaGVsbC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSxlPXRoaXMuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLG49MDtuPDU7bisrKXt2YXIgcj10LmdldFgobik7aWYociE9PWUuZ2V0TWluWCgpJiZyIT09ZS5nZXRNYXhYKCkpcmV0dXJuITE7dmFyIGk9dC5nZXRZKG4pO2lmKGkhPT1lLmdldE1pblkoKSYmaSE9PWUuZ2V0TWF4WSgpKXJldHVybiExfWZvcih2YXIgbz10LmdldFgoMCkscz10LmdldFkoMCksYT0xO2E8PTQ7YSsrKXt2YXIgdT10LmdldFgoYSksYz10LmdldFkoYSk7aWYodSE9PW89PT0oYyE9PXMpKXJldHVybiExO289dSxzPWN9cmV0dXJuITB9LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZighdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSlyZXR1cm4hMTt2YXIgcj1lLGk9dGhpcy5fc2hlbGwsbz1yLl9zaGVsbDtpZighaS5lcXVhbHNFeGFjdChvLG4pfHx0aGlzLl9ob2xlcy5sZW5ndGghPT1yLl9ob2xlcy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBzPTA7czx0aGlzLl9ob2xlcy5sZW5ndGg7cysrKWlmKCF0aGlzLl9ob2xlc1tzXS5lcXVhbHNFeGFjdChyLl9ob2xlc1tzXSxuKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7dGhpcy5ub3JtYWxpemUodGhpcy5fc2hlbGwsITApO2Zvcih2YXIgdD0wO3Q8dGhpcy5faG9sZXMubGVuZ3RoO3QrKyl0aGlzLm5vcm1hbGl6ZSh0aGlzLl9ob2xlc1t0XSwhMSk7Vm8uc29ydCh0aGlzLl9ob2xlcyl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKGUuaXNFbXB0eSgpKXJldHVybiBudWxsO3ZhciByPW5ldyBBcnJheShlLmdldENvb3JkaW5hdGVzKCkubGVuZ3RoLTEpLmZpbGwobnVsbCk7a2kuYXJyYXljb3B5KGUuZ2V0Q29vcmRpbmF0ZXMoKSwwLHIsMCxyLmxlbmd0aCk7dmFyIGk9RG8ubWluQ29vcmRpbmF0ZShlLmdldENvb3JkaW5hdGVzKCkpO0RvLnNjcm9sbChyLGkpLGtpLmFycmF5Y29weShyLDAsZS5nZXRDb29yZGluYXRlcygpLDAsci5sZW5ndGgpLGUuZ2V0Q29vcmRpbmF0ZXMoKVtyLmxlbmd0aF09clswXSxlby5pc0NDVyhlLmdldENvb3JkaW5hdGVzKCkpPT09biYmRG8ucmV2ZXJzZShlLmdldENvb3JkaW5hdGVzKCkpfX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbC5nZXRDb29yZGluYXRlKCl9LGUucHJvdG90eXBlLmdldE51bUludGVyaW9yUmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ob2xlcy5sZW5ndGh9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDF9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAyfSxlLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXt2YXIgdD0wO3QrPXRoaXMuX3NoZWxsLmdldExlbmd0aCgpO2Zvcih2YXIgZT0wO2U8dGhpcy5faG9sZXMubGVuZ3RoO2UrKyl0Kz10aGlzLl9ob2xlc1tlXS5nZXRMZW5ndGgoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3NoZWxsLmdldE51bVBvaW50cygpLGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdCs9dGhpcy5faG9sZXNbZV0uZ2V0TnVtUG9pbnRzKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvcHkoKTt0Ll9zaGVsbD10aGlzLl9zaGVsbC5jb3B5KCkucmV2ZXJzZSgpLHQuX2hvbGVzPW5ldyBBcnJheSh0aGlzLl9ob2xlcy5sZW5ndGgpLmZpbGwobnVsbCk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9ob2xlcy5sZW5ndGg7ZSsrKXQuX2hvbGVzW2VdPXRoaXMuX2hvbGVzW2VdLmNvcHkoKS5yZXZlcnNlKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmNvbnZleEh1bGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFeHRlcmlvclJpbmcoKS5jb252ZXhIdWxsKCl9LGUucHJvdG90eXBlLmNvbXBhcmVUb1NhbWVDbGFzcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT10aGlzLl9zaGVsbCxuPXQuX3NoZWxsO3JldHVybiBlLmNvbXBhcmVUb1NhbWVDbGFzcyhuKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzBdLG89dGhpcy5fc2hlbGwscz1pLl9zaGVsbCxhPW8uY29tcGFyZVRvU2FtZUNsYXNzKHMscik7aWYoMCE9PWEpcmV0dXJuIGE7Zm9yKHZhciB1PXRoaXMuZ2V0TnVtSW50ZXJpb3JSaW5nKCksYz1pLmdldE51bUludGVyaW9yUmluZygpLGw9MDtsPHUmJmw8Yzspe3ZhciBoPXRoaXMuZ2V0SW50ZXJpb3JSaW5nTihsKSxmPWkuZ2V0SW50ZXJpb3JSaW5nTihsKSxwPWguY29tcGFyZVRvU2FtZUNsYXNzKGYscik7aWYoMCE9PXApcmV0dXJuIHA7bCsrfXJldHVybiBsPHU/MTpsPGM/LTE6MH19LGUucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoRWkodCxhbykpe3RoaXMuX3NoZWxsLmFwcGx5KHQpO2Zvcih2YXIgbj0wO248dGhpcy5faG9sZXMubGVuZ3RoO24rKyllLl9ob2xlc1tuXS5hcHBseSh0KX1lbHNlIGlmKEVpKHQsV28pKXtpZih0aGlzLl9zaGVsbC5hcHBseSh0KSwhdC5pc0RvbmUoKSlmb3IodmFyIHI9MDtyPHRoaXMuX2hvbGVzLmxlbmd0aCYmKGUuX2hvbGVzW3JdLmFwcGx5KHQpLCF0LmlzRG9uZSgpKTtyKyspO3QuaXNHZW9tZXRyeUNoYW5nZWQoKSYmdGhpcy5nZW9tZXRyeUNoYW5nZWQoKX1lbHNlIGlmKEVpKHQsWG8pKXQuZmlsdGVyKHRoaXMpO2Vsc2UgaWYoRWkodCxybykpe3QuZmlsdGVyKHRoaXMpLHRoaXMuX3NoZWxsLmFwcGx5KHQpO2Zvcih2YXIgaT0wO2k8dGhpcy5faG9sZXMubGVuZ3RoO2krKyllLl9ob2xlc1tpXS5hcHBseSh0KX19LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZygpO3ZhciB0PW5ldyBBcnJheSh0aGlzLl9ob2xlcy5sZW5ndGgrMSkuZmlsbChudWxsKTt0WzBdPXRoaXMuX3NoZWxsO2Zvcih2YXIgZT0wO2U8dGhpcy5faG9sZXMubGVuZ3RoO2UrKyl0W2UrMV09dGhpcy5faG9sZXNbZV07cmV0dXJuIHQubGVuZ3RoPD0xP3RoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVhclJpbmcodFswXS5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSk6dGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKHQpfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7ZS5fc2hlbGw9dGhpcy5fc2hlbGwuY2xvbmUoKSxlLl9ob2xlcz1uZXcgQXJyYXkodGhpcy5faG9sZXMubGVuZ3RoKS5maWxsKG51bGwpO2Zvcih2YXIgbj0wO248dGhpcy5faG9sZXMubGVuZ3RoO24rKyllLl9ob2xlc1tuXT10aGlzLl9ob2xlc1tuXS5jbG9uZSgpO3JldHVybiBlfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iUG9seWdvbiJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fc2hlbGwuY29weSgpLG49bmV3IEFycmF5KHRoaXMuX2hvbGVzLmxlbmd0aCkuZmlsbChudWxsKSxyPTA7cjxuLmxlbmd0aDtyKyspbltyXT10aGlzLl9ob2xlc1tyXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsbix0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuZ2V0RXh0ZXJpb3JSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoZWxsfSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoZWxsLmlzRW1wdHkoKX0sZS5wcm90b3R5cGUuZ2V0SW50ZXJpb3JSaW5nTj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faG9sZXNbdF19LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2xzXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDMwN2ZmZWZkOGRjOTcyMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oaW8pLGZzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiBpby5TT1JUSU5ERVhfTVVMVElQT0lOVH0sZS5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiEwfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuISF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpJiZ0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5jYWxsKHRoaXMsZSxuKX1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRDb29yZGluYXRlKCl9cmV0dXJuIHQucHJvdG90eXBlLmdldENvb3JkaW5hdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiBHby5GQUxTRX0sZS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihudWxsKX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIk11bHRpUG9pbnQifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCkuZmlsbChudWxsKSxuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXT10aGlzLl9nZW9tZXRyaWVzW25dLmNvcHkoKTtyZXR1cm4gbmV3IGUodCx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdXNdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4NmZiMWVkNDE2MmUwZmMwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShIbykscHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe2UgaW5zdGFuY2VvZiB2aSYmbiBpbnN0YW5jZW9mIElzJiYoZT1uLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUoZSkpLHQuY2FsbCh0aGlzLGUsbiksdGhpcy52YWxpZGF0ZUNvbnN0cnVjdGlvbigpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtNSU5JTVVNX1ZBTElEX1NJWkU6e2NvbmZpZ3VyYWJsZTohMH0sc2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiBpby5TT1JUSU5ERVhfTElORUFSUklOR30sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gR28uRkFMU0V9LGUucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmlzRW1wdHkoKXx8dC5wcm90b3R5cGUuaXNDbG9zZWQuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BvaW50cy5jb3B5KCk7cmV0dXJuIHNzLnJldmVyc2UodCksdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTGluZWFyUmluZyh0KX0sZS5wcm90b3R5cGUudmFsaWRhdGVDb25zdHJ1Y3Rpb249ZnVuY3Rpb24oKXtpZighdGhpcy5pc0VtcHR5KCkmJiF0LnByb3RvdHlwZS5pc0Nsb3NlZC5jYWxsKHRoaXMpKXRocm93IG5ldyBoaTtpZih0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLnNpemUoKT49MSYmdGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2UoKS5zaXplKCk8ZS5NSU5JTVVNX1ZBTElEX1NJWkUpdGhyb3cgbmV3IGhpKCJJbnZhbGlkIG51bWJlciBvZiBwb2ludHMgaW4gTGluZWFyUmluZyAoZm91bmQgIit0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLnNpemUoKSsiIC0gbXVzdCBiZSAwIG9yID49IDQpIil9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJMaW5lYXJSaW5nIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLl9wb2ludHMuY29weSgpLHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLk1JTklNVU1fVkFMSURfU0laRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gNH0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDNiMjI5ZTI2MjM2N2E2MDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oYXMpLGRzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiBpby5TT1JUSU5ERVhfTVVMVElQT0xZR09OfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuISF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpJiZ0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5jYWxsKHRoaXMsZSxuKX1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMn0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCxlPW5ldyBBcnJheSh0KS5maWxsKG51bGwpLG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyllW25dPXRoaXMuX2dlb21ldHJpZXNbbl0ucmV2ZXJzZSgpO3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aVBvbHlnb24oZSl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZygpO2Zvcih2YXIgdD1uZXcgeG8sZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKWZvcih2YXIgbj10aGlzLl9nZW9tZXRyaWVzW2VdLmdldEJvdW5kYXJ5KCkscj0wO3I8bi5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXQuYWRkKG4uZ2V0R2VvbWV0cnlOKHIpKTt2YXIgaT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZyh0LnRvQXJyYXkoaSkpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTXVsdGlQb2x5Z29uIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2xzXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDdhNWFhMTM2OTE3MTk4MH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShIbyksZ3M9ZnVuY3Rpb24odCl7dGhpcy5fZmFjdG9yeT10fHxudWxsLHRoaXMuX2lzVXNlckRhdGFDb3BpZWQ9ITF9LHlzPXtOb09wR2VvbWV0cnlPcGVyYXRpb246e2NvbmZpZ3VyYWJsZTohMH0sQ29vcmRpbmF0ZU9wZXJhdGlvbjp7Y29uZmlndXJhYmxlOiEwfSxDb29yZGluYXRlU2VxdWVuY2VPcGVyYXRpb246e2NvbmZpZ3VyYWJsZTohMH19O2dzLnByb3RvdHlwZS5zZXRDb3B5VXNlckRhdGE9ZnVuY3Rpb24odCl7dGhpcy5faXNVc2VyRGF0YUNvcGllZD10fSxncy5wcm90b3R5cGUuZWRpdD1mdW5jdGlvbih0LGUpe2lmKG51bGw9PT10KXJldHVybiBudWxsO3ZhciBuPXRoaXMuZWRpdEludGVybmFsKHQsZSk7cmV0dXJuIHRoaXMuX2lzVXNlckRhdGFDb3BpZWQmJm4uc2V0VXNlckRhdGEodC5nZXRVc2VyRGF0YSgpKSxufSxncy5wcm90b3R5cGUuZWRpdEludGVybmFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PT10aGlzLl9mYWN0b3J5JiYodGhpcy5fZmFjdG9yeT10LmdldEZhY3RvcnkoKSksdCBpbnN0YW5jZW9mIEhvP3RoaXMuZWRpdEdlb21ldHJ5Q29sbGVjdGlvbih0LGUpOnQgaW5zdGFuY2VvZiBocz90aGlzLmVkaXRQb2x5Z29uKHQsZSk6dCBpbnN0YW5jZW9mIGNzfHx0IGluc3RhbmNlb2YgYXM/ZS5lZGl0KHQsdGhpcy5fZmFjdG9yeSk6KFppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJVbnN1cHBvcnRlZCBHZW9tZXRyeSBjbGFzczogIit0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSxudWxsKX0sZ3MucHJvdG90eXBlLmVkaXRHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5lZGl0KHQsdGhpcy5fZmFjdG9yeSkscj1uZXcgeG8saT0wO2k8bi5nZXROdW1HZW9tZXRyaWVzKCk7aSsrKXt2YXIgbz10aGlzLmVkaXQobi5nZXRHZW9tZXRyeU4oaSksZSk7bnVsbD09PW98fG8uaXNFbXB0eSgpfHxyLmFkZChvKX1yZXR1cm4gbi5nZXRDbGFzcygpPT09ZnM/dGhpcy5fZmFjdG9yeS5jcmVhdGVNdWx0aVBvaW50KHIudG9BcnJheShbXSkpOm4uZ2V0Q2xhc3MoKT09PVpvP3RoaXMuX2ZhY3RvcnkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKHIudG9BcnJheShbXSkpOm4uZ2V0Q2xhc3MoKT09PWRzP3RoaXMuX2ZhY3RvcnkuY3JlYXRlTXVsdGlQb2x5Z29uKHIudG9BcnJheShbXSkpOnRoaXMuX2ZhY3RvcnkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKHIudG9BcnJheShbXSkpfSxncy5wcm90b3R5cGUuZWRpdFBvbHlnb249ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmVkaXQodCx0aGlzLl9mYWN0b3J5KTtpZihudWxsPT09biYmKG49dGhpcy5fZmFjdG9yeS5jcmVhdGVQb2x5Z29uKG51bGwpKSxuLmlzRW1wdHkoKSlyZXR1cm4gbjt2YXIgcj10aGlzLmVkaXQobi5nZXRFeHRlcmlvclJpbmcoKSxlKTtpZihudWxsPT09cnx8ci5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9seWdvbigpO2Zvcih2YXIgaT1uZXcgeG8sbz0wO288bi5nZXROdW1JbnRlcmlvclJpbmcoKTtvKyspe3ZhciBzPXRoaXMuZWRpdChuLmdldEludGVyaW9yUmluZ04obyksZSk7bnVsbD09PXN8fHMuaXNFbXB0eSgpfHxpLmFkZChzKX1yZXR1cm4gdGhpcy5fZmFjdG9yeS5jcmVhdGVQb2x5Z29uKHIsaS50b0FycmF5KFtdKSl9LGdzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxncy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZ3N9LGdzLkdlb21ldHJ5RWRpdG9yT3BlcmF0aW9uPWZ1bmN0aW9uKCl7fSx5cy5Ob09wR2VvbWV0cnlPcGVyYXRpb24uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG1zfSx5cy5Db29yZGluYXRlT3BlcmF0aW9uLmdldD1mdW5jdGlvbigpe3JldHVybiB2c30seXMuQ29vcmRpbmF0ZVNlcXVlbmNlT3BlcmF0aW9uLmdldD1mdW5jdGlvbigpe3JldHVybiBfc30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZ3MseXMpO3ZhciBtcz1mdW5jdGlvbigpe307bXMucHJvdG90eXBlLmVkaXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdH0sbXMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2dzLkdlb21ldHJ5RWRpdG9yT3BlcmF0aW9uXX0sbXMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG1zfTt2YXIgdnM9ZnVuY3Rpb24oKXt9O3ZzLnByb3RvdHlwZS5lZGl0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5lZGl0Q29vcmRpbmF0ZXModC5nZXRDb29yZGluYXRlcygpLHQpO3JldHVybiBudWxsPT09bj90OnQgaW5zdGFuY2VvZiBwcz9lLmNyZWF0ZUxpbmVhclJpbmcobik6dCBpbnN0YW5jZW9mIGFzP2UuY3JlYXRlTGluZVN0cmluZyhuKTp0IGluc3RhbmNlb2YgY3M/bi5sZW5ndGg+MD9lLmNyZWF0ZVBvaW50KG5bMF0pOmUuY3JlYXRlUG9pbnQoKTp0fSx2cy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZ3MuR2VvbWV0cnlFZGl0b3JPcGVyYXRpb25dfSx2cy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdnN9O3ZhciBfcz1mdW5jdGlvbigpe307X3MucHJvdG90eXBlLmVkaXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCBpbnN0YW5jZW9mIHBzP2UuY3JlYXRlTGluZWFyUmluZyh0aGlzLmVkaXQodC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KSk6dCBpbnN0YW5jZW9mIGFzP2UuY3JlYXRlTGluZVN0cmluZyh0aGlzLmVkaXQodC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KSk6dCBpbnN0YW5jZW9mIGNzP2UuY3JlYXRlUG9pbnQodGhpcy5lZGl0KHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksdCkpOnR9LF9zLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltncy5HZW9tZXRyeUVkaXRvck9wZXJhdGlvbl19LF9zLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBfc307dmFyIHhzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZih0aGlzLl9kaW1lbnNpb249Myx0aGlzLl9jb29yZGluYXRlcz1udWxsLDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXRoaXMuX2Nvb3JkaW5hdGVzPWFyZ3VtZW50c1swXSx0aGlzLl9kaW1lbnNpb249MztlbHNlIGlmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX2Nvb3JkaW5hdGVzPW5ldyBBcnJheShlKS5maWxsKG51bGwpO2Zvcih2YXIgbj0wO248ZTtuKyspdC5fY29vcmRpbmF0ZXNbbl09bmV3IHZpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzBdLExpKSl7dmFyIHI9YXJndW1lbnRzWzBdO2lmKG51bGw9PT1yKXJldHVybiB0aGlzLl9jb29yZGluYXRlcz1uZXcgQXJyYXkoMCkuZmlsbChudWxsKSxudWxsO3RoaXMuX2RpbWVuc2lvbj1yLmdldERpbWVuc2lvbigpLHRoaXMuX2Nvb3JkaW5hdGVzPW5ldyBBcnJheShyLnNpemUoKSkuZmlsbChudWxsKTtmb3IodmFyIGk9MDtpPHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtpKyspdC5fY29vcmRpbmF0ZXNbaV09ci5nZXRDb29yZGluYXRlQ29weShpKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aClpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1sxXSkpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXTt0aGlzLl9jb29yZGluYXRlcz1vLHRoaXMuX2RpbWVuc2lvbj1zLG51bGw9PT1vJiYodGhpcy5fY29vcmRpbmF0ZXM9bmV3IEFycmF5KDApLmZpbGwobnVsbCkpfWVsc2UgaWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pJiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1sxXSkpe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXTt0aGlzLl9jb29yZGluYXRlcz1uZXcgQXJyYXkoYSkuZmlsbChudWxsKSx0aGlzLl9kaW1lbnNpb249dTtmb3IodmFyIGM9MDtjPGE7YysrKXQuX2Nvb3JkaW5hdGVzW2NdPW5ldyB2aX19LHdzPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTt4cy5wcm90b3R5cGUuc2V0T3JkaW5hdGU9ZnVuY3Rpb24odCxlLG4pe3N3aXRjaChlKXtjYXNlIExpLlg6dGhpcy5fY29vcmRpbmF0ZXNbdF0ueD1uO2JyZWFrO2Nhc2UgTGkuWTp0aGlzLl9jb29yZGluYXRlc1t0XS55PW47YnJlYWs7Y2FzZSBMaS5aOnRoaXMuX2Nvb3JkaW5hdGVzW3RdLno9bjticmVhaztkZWZhdWx0OnRocm93IG5ldyBoaX19LHhzLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aH0seHMucHJvdG90eXBlLmdldE9yZGluYXRlPWZ1bmN0aW9uKHQsZSl7c3dpdGNoKGUpe2Nhc2UgTGkuWDpyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF0ueDtjYXNlIExpLlk6cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdLnk7Y2FzZSBMaS5aOnJldHVybiB0aGlzLl9jb29yZGluYXRlc1t0XS56fXJldHVybiBmaS5OYU59LHhzLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF19aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtuLng9dGhpcy5fY29vcmRpbmF0ZXNbZV0ueCxuLnk9dGhpcy5fY29vcmRpbmF0ZXNbZV0ueSxuLno9dGhpcy5fY29vcmRpbmF0ZXNbZV0uen19LHhzLnByb3RvdHlwZS5nZXRDb29yZGluYXRlQ29weT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHZpKHRoaXMuX2Nvb3JkaW5hdGVzW3RdKX0seHMucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaW1lbnNpb259LHhzLnByb3RvdHlwZS5nZXRYPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jb29yZGluYXRlc1t0XS54fSx4cy5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKS5maWxsKG51bGwpLGU9MDtlPHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtlKyspdFtlXT10aGlzLl9jb29yZGluYXRlc1tlXS5jbG9uZSgpO3JldHVybiBuZXcgeHModCx0aGlzLl9kaW1lbnNpb24pfSx4cy5wcm90b3R5cGUuZXhwYW5kRW52ZWxvcGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXQuZXhwYW5kVG9JbmNsdWRlKHRoaXMuX2Nvb3JkaW5hdGVzW2VdKTtyZXR1cm4gdH0seHMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKS5maWxsKG51bGwpLGU9MDtlPHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtlKyspdFtlXT10aGlzLl9jb29yZGluYXRlc1tlXS5jb3B5KCk7cmV0dXJuIG5ldyB4cyh0LHRoaXMuX2RpbWVuc2lvbil9LHhzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2lmKHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aD4wKXt2YXIgdD1uZXcgQWkoMTcqdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoKTt0LmFwcGVuZCgiKCIpLHQuYXBwZW5kKHRoaXMuX2Nvb3JkaW5hdGVzWzBdKTtmb3IodmFyIGU9MTtlPHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtlKyspdC5hcHBlbmQoIiwgIiksdC5hcHBlbmQodGhpcy5fY29vcmRpbmF0ZXNbZV0pO3JldHVybiB0LmFwcGVuZCgiKSIpLHQudG9TdHJpbmcoKX1yZXR1cm4iKCkifSx4cy5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF0ueX0seHMucHJvdG90eXBlLnRvQ29vcmRpbmF0ZUFycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzfSx4cy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bTGksbWldfSx4cy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geHN9LHdzLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4Y2I0NGE3NzhkYjE4ZTAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh4cyx3cyk7dmFyIGJzPWZ1bmN0aW9uKCl7fSxEcz17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxpbnN0YW5jZU9iamVjdDp7Y29uZmlndXJhYmxlOiEwfX07YnMucHJvdG90eXBlLnJlYWRSZXNvbHZlPWZ1bmN0aW9uKCl7cmV0dXJuIGJzLmluc3RhbmNlKCl9LGJzLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gbmV3IHhzKGFyZ3VtZW50c1swXSk7aWYoRWkoYXJndW1lbnRzWzBdLExpKSlyZXR1cm4gbmV3IHhzKGFyZ3VtZW50c1swXSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3JldHVybiBlPjMmJihlPTMpLGU8Mj9uZXcgeHModCk6bmV3IHhzKHQsZSl9fSxicy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bd2ksbWldfSxicy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYnN9LGJzLmluc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIGJzLmluc3RhbmNlT2JqZWN0fSxEcy5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDM4ZTQ5ZmE2Y2Y2ZjJlMDB9LERzLmluc3RhbmNlT2JqZWN0LmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgYnN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGJzLERzKTt2YXIgRXM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLm1hcF89bmV3IE1hcH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1hcF8uZ2V0KHQpfHxudWxsfSxlLnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5tYXBfLnNldCh0LGUpLGV9LGUucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgeG8sZT10aGlzLm1hcF8udmFsdWVzKCksbj1lLm5leHQoKTshbi5kb25lOyl0LmFkZChuLnZhbHVlKSxuPWUubmV4dCgpO3JldHVybiB0fSxlLnByb3RvdHlwZS5lbnRyeVNldD1mdW5jdGlvbigpe3ZhciB0PW5ldyBGbztyZXR1cm4gdGhpcy5tYXBfLmVudHJpZXMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gdC5hZGQoZSl9KSksdH0sZS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcF8uc2l6ZSgpfSxlfShBbyksQ3M9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX21vZGVsVHlwZT1udWxsLHRoaXMuX3NjYWxlPW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5fbW9kZWxUeXBlPXQuRkxPQVRJTkc7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aClpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFzKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5fbW9kZWxUeXBlPWUsZT09PXQuRklYRUQmJnRoaXMuc2V0U2NhbGUoMSl9ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIG49YXJndW1lbnRzWzBdO3RoaXMuX21vZGVsVHlwZT10LkZJWEVELHRoaXMuc2V0U2NhbGUobil9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQpe3ZhciByPWFyZ3VtZW50c1swXTt0aGlzLl9tb2RlbFR5cGU9ci5fbW9kZWxUeXBlLHRoaXMuX3NjYWxlPXIuX3NjYWxlfX0sU3M9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0sbWF4aW11bVByZWNpc2VWYWx1ZTp7Y29uZmlndXJhYmxlOiEwfX07Q3MucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBDcykpcmV0dXJuITE7dmFyIGU9dDtyZXR1cm4gdGhpcy5fbW9kZWxUeXBlPT09ZS5fbW9kZWxUeXBlJiZ0aGlzLl9zY2FsZT09PWUuX3NjYWxlfSxDcy5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQsbj10aGlzLmdldE1heGltdW1TaWduaWZpY2FudERpZ2l0cygpLHI9ZS5nZXRNYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMoKTtyZXR1cm4gbmV3IE5pKG4pLmNvbXBhcmVUbyhuZXcgTmkocikpfSxDcy5wcm90b3R5cGUuZ2V0U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NhbGV9LENzLnByb3RvdHlwZS5pc0Zsb2F0aW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZGVsVHlwZT09PUNzLkZMT0FUSU5HfHx0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GTE9BVElOR19TSU5HTEV9LENzLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZGVsVHlwZX0sQ3MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9IlVOS05PV04iO3JldHVybiB0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GTE9BVElORz90PSJGbG9hdGluZyI6dGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkdfU0lOR0xFP3Q9IkZsb2F0aW5nLVNpbmdsZSI6dGhpcy5fbW9kZWxUeXBlPT09Q3MuRklYRUQmJih0PSJGaXhlZCAoU2NhbGU9Iit0aGlzLmdldFNjYWxlKCkrIikiKSx0fSxDcy5wcm90b3R5cGUubWFrZVByZWNpc2U9ZnVuY3Rpb24oKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBmaS5pc05hTih0KXx8dGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkdfU0lOR0xFP3Q6dGhpcy5fbW9kZWxUeXBlPT09Q3MuRklYRUQ/TWF0aC5yb3VuZCh0KnRoaXMuX3NjYWxlKS90aGlzLl9zY2FsZTp0fWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciBlPWFyZ3VtZW50c1swXTtpZih0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GTE9BVElORylyZXR1cm4gbnVsbDtlLng9dGhpcy5tYWtlUHJlY2lzZShlLngpLGUueT10aGlzLm1ha2VQcmVjaXNlKGUueSl9fSxDcy5wcm90b3R5cGUuZ2V0TWF4aW11bVNpZ25pZmljYW50RGlnaXRzPWZ1bmN0aW9uKCl7dmFyIHQ9MTY7cmV0dXJuIHRoaXMuX21vZGVsVHlwZT09PUNzLkZMT0FUSU5HP3Q9MTY6dGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkdfU0lOR0xFP3Q9Njp0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GSVhFRCYmKHQ9MStNYXRoLnRydW5jKE1hdGguY2VpbChNYXRoLmxvZyh0aGlzLmdldFNjYWxlKCkpL01hdGgubG9nKDEwKSkpKSx0fSxDcy5wcm90b3R5cGUuc2V0U2NhbGU9ZnVuY3Rpb24odCl7dGhpcy5fc2NhbGU9TWF0aC5hYnModCl9LENzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblttaSxkaV19LENzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDc30sQ3MubW9zdFByZWNpc2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb21wYXJlVG8oZSk+PTA/dDplfSxTcy5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDZiZWU2NDA0ZTlhMjVjMDB9LFNzLm1heGltdW1QcmVjaXNlVmFsdWUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDkwMDcxOTkyNTQ3NDA5OTJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENzLFNzKTt2YXIgQXM9ZnVuY3Rpb24gdChlKXt0aGlzLl9uYW1lPWV8fG51bGwsdC5uYW1lVG9UeXBlTWFwLnB1dChlLHRoaXMpfSxOcz17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxuYW1lVG9UeXBlTWFwOntjb25maWd1cmFibGU6ITB9fTtBcy5wcm90b3R5cGUucmVhZFJlc29sdmU9ZnVuY3Rpb24oKXtyZXR1cm4gQXMubmFtZVRvVHlwZU1hcC5nZXQodGhpcy5fbmFtZSl9LEFzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9uYW1lfSxBcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbWldfSxBcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQXN9LE5zLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTU1Mjg2MDI2MzE3MzE1OWU0fSxOcy5uYW1lVG9UeXBlTWFwLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgRXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEFzLE5zKSxDcy5UeXBlPUFzLENzLkZJWEVEPW5ldyBBcygiRklYRUQiKSxDcy5GTE9BVElORz1uZXcgQXMoIkZMT0FUSU5HIiksQ3MuRkxPQVRJTkdfU0lOR0xFPW5ldyBBcygiRkxPQVRJTkcgU0lOR0xFIik7dmFyIElzPWZ1bmN0aW9uIHQoKXt0aGlzLl9wcmVjaXNpb25Nb2RlbD1uZXcgQ3MsdGhpcy5fU1JJRD0wLHRoaXMuX2Nvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnk9dC5nZXREZWZhdWx0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLDA9PT1hcmd1bWVudHMubGVuZ3RofHwoMT09PWFyZ3VtZW50cy5sZW5ndGg/RWkoYXJndW1lbnRzWzBdLHdpKT90aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5PWFyZ3VtZW50c1swXTphcmd1bWVudHNbMF1pbnN0YW5jZW9mIENzJiYodGhpcy5fcHJlY2lzaW9uTW9kZWw9YXJndW1lbnRzWzBdKToyPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5fcHJlY2lzaW9uTW9kZWw9YXJndW1lbnRzWzBdLHRoaXMuX1NSSUQ9YXJndW1lbnRzWzFdKTozPT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX3ByZWNpc2lvbk1vZGVsPWFyZ3VtZW50c1swXSx0aGlzLl9TUklEPWFyZ3VtZW50c1sxXSx0aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5PWFyZ3VtZW50c1syXSkpfSxNcz17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07SXMucHJvdG90eXBlLnRvR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNOdWxsKCk/dGhpcy5jcmVhdGVQb2ludChudWxsKTp0LmdldE1pblgoKT09PXQuZ2V0TWF4WCgpJiZ0LmdldE1pblkoKT09PXQuZ2V0TWF4WSgpP3RoaXMuY3JlYXRlUG9pbnQobmV3IHZpKHQuZ2V0TWluWCgpLHQuZ2V0TWluWSgpKSk6dC5nZXRNaW5YKCk9PT10LmdldE1heFgoKXx8dC5nZXRNaW5ZKCk9PT10LmdldE1heFkoKT90aGlzLmNyZWF0ZUxpbmVTdHJpbmcoW25ldyB2aSh0LmdldE1pblgoKSx0LmdldE1pblkoKSksbmV3IHZpKHQuZ2V0TWF4WCgpLHQuZ2V0TWF4WSgpKV0pOnRoaXMuY3JlYXRlUG9seWdvbih0aGlzLmNyZWF0ZUxpbmVhclJpbmcoW25ldyB2aSh0LmdldE1pblgoKSx0LmdldE1pblkoKSksbmV3IHZpKHQuZ2V0TWluWCgpLHQuZ2V0TWF4WSgpKSxuZXcgdmkodC5nZXRNYXhYKCksdC5nZXRNYXhZKCkpLG5ldyB2aSh0LmdldE1heFgoKSx0LmdldE1pblkoKSksbmV3IHZpKHQuZ2V0TWluWCgpLHQuZ2V0TWluWSgpKV0pLG51bGwpfSxJcy5wcm90b3R5cGUuY3JlYXRlTGluZVN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdD90IGluc3RhbmNlb2YgQXJyYXk/bmV3IGFzKHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KSx0aGlzKTpFaSh0LExpKT9uZXcgYXModCx0aGlzKTp2b2lkIDA6bmV3IGFzKHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSksdGhpcyl9LElzLnByb3RvdHlwZS5jcmVhdGVNdWx0aUxpbmVTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IFpvKG51bGwsdGhpcyk6MT09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IFpvKGFyZ3VtZW50c1swXSx0aGlzKTp2b2lkIDB9LElzLnByb3RvdHlwZS5idWlsZEdlb21ldHJ5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLG49ITEscj0hMSxpPXQuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpLHM9by5nZXRDbGFzcygpO251bGw9PT1lJiYoZT1zKSxzIT09ZSYmKG49ITApLG8uaXNHZW9tZXRyeUNvbGxlY3Rpb25PckRlcml2ZWQoKSYmKHI9ITApfWlmKG51bGw9PT1lKXJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbigpO2lmKG58fHIpcmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKElzLnRvR2VvbWV0cnlBcnJheSh0KSk7dmFyIGE9dC5pdGVyYXRvcigpLm5leHQoKTtpZih0LnNpemUoKT4xKXtpZihhIGluc3RhbmNlb2YgaHMpcmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2x5Z29uKElzLnRvUG9seWdvbkFycmF5KHQpKTtpZihhIGluc3RhbmNlb2YgYXMpcmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKElzLnRvTGluZVN0cmluZ0FycmF5KHQpKTtpZihhIGluc3RhbmNlb2YgY3MpcmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChJcy50b1BvaW50QXJyYXkodCkpO1ppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJVbmhhbmRsZWQgY2xhc3M6ICIrYS5nZXRDbGFzcygpLmdldE5hbWUoKSl9cmV0dXJuIGF9LElzLnByb3RvdHlwZS5jcmVhdGVNdWx0aVBvaW50RnJvbUNvb3Jkcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jcmVhdGVNdWx0aVBvaW50KG51bGwhPT10P3RoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KTpudWxsKX0sSXMucHJvdG90eXBlLmNyZWF0ZVBvaW50PWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuY3JlYXRlUG9pbnQodGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFtdKSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVQb2ludChudWxsIT09dD90aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUoW3RdKTpudWxsKX1pZihFaShhcmd1bWVudHNbMF0sTGkpKXJldHVybiBuZXcgY3MoYXJndW1lbnRzWzBdLHRoaXMpfX0sSXMucHJvdG90eXBlLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeX0sSXMucHJvdG90eXBlLmNyZWF0ZVBvbHlnb249ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IGhzKG51bGwsbnVsbCx0aGlzKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoRWkoYXJndW1lbnRzWzBdLExpKSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNyZWF0ZVBvbHlnb24odGhpcy5jcmVhdGVMaW5lYXJSaW5nKHQpKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlUG9seWdvbih0aGlzLmNyZWF0ZUxpbmVhclJpbmcoZSkpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgcHMpe3ZhciBuPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVQb2x5Z29uKG4sbnVsbCl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3JldHVybiBuZXcgaHMoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSx0aGlzKX19LElzLnByb3RvdHlwZS5nZXRTUklEPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX1NSSUR9LElzLnByb3RvdHlwZS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IEhvKG51bGwsdGhpcyk6MT09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IEhvKGFyZ3VtZW50c1swXSx0aGlzKTp2b2lkIDB9LElzLnByb3RvdHlwZS5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGdzKHRoaXMpLmVkaXQodCx7ZWRpdDpmdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkuY3JlYXRlKHQpfX19KX0sSXMucHJvdG90eXBlLmdldFByZWNpc2lvbk1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZWNpc2lvbk1vZGVsfSxJcy5wcm90b3R5cGUuY3JlYXRlTGluZWFyUmluZz1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmNyZWF0ZUxpbmVhclJpbmcodGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFtdKSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVMaW5lYXJSaW5nKG51bGwhPT10P3RoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KTpudWxsKX1pZihFaShhcmd1bWVudHNbMF0sTGkpKXJldHVybiBuZXcgcHMoYXJndW1lbnRzWzBdLHRoaXMpfX0sSXMucHJvdG90eXBlLmNyZWF0ZU11bHRpUG9seWdvbj1mdW5jdGlvbigpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgZHMobnVsbCx0aGlzKToxPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgZHMoYXJndW1lbnRzWzBdLHRoaXMpOnZvaWQgMH0sSXMucHJvdG90eXBlLmNyZWF0ZU11bHRpUG9pbnQ9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IGZzKG51bGwsdGhpcyk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIG5ldyBmcyhhcmd1bWVudHNbMF0sdGhpcyk7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNyZWF0ZU11bHRpUG9pbnQobnVsbCE9PXQ/dGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKHQpOm51bGwpfWlmKEVpKGFyZ3VtZW50c1swXSxMaSkpe3ZhciBlPWFyZ3VtZW50c1swXTtpZihudWxsPT09ZSlyZXR1cm4gdGhpcy5jcmVhdGVNdWx0aVBvaW50KG5ldyBBcnJheSgwKS5maWxsKG51bGwpKTtmb3IodmFyIG49bmV3IEFycmF5KGUuc2l6ZSgpKS5maWxsKG51bGwpLHI9MDtyPGUuc2l6ZSgpO3IrKyl7dmFyIGk9dGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKDEsZS5nZXREaW1lbnNpb24oKSk7c3MuY29weShlLHIsaSwwLDEpLG5bcl09dGhpcy5jcmVhdGVQb2ludChpKX1yZXR1cm4gdGhpcy5jcmVhdGVNdWx0aVBvaW50KG4pfX19LElzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblttaV19LElzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBJc30sSXMudG9NdWx0aVBvbHlnb25BcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMudG9HZW9tZXRyeUFycmF5PWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10KXJldHVybiBudWxsO3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy5nZXREZWZhdWx0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeT1mdW5jdGlvbigpe3JldHVybiBicy5pbnN0YW5jZSgpfSxJcy50b011bHRpTGluZVN0cmluZ0FycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy50b0xpbmVTdHJpbmdBcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMudG9NdWx0aVBvaW50QXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LElzLnRvTGluZWFyUmluZ0FycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy50b1BvaW50QXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LElzLnRvUG9seWdvbkFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy5jcmVhdGVQb2ludEZyb21JbnRlcm5hbENvb3JkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0UHJlY2lzaW9uTW9kZWwoKS5tYWtlUHJlY2lzZSh0KSxlLmdldEZhY3RvcnkoKS5jcmVhdGVQb2ludCh0KX0sTXMuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHg1ZWE3NWYyMDUxZWViNDAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhJcyxNcyk7dmFyIEZzPWZ1bmN0aW9uKCl7fSxUcz17T046e2NvbmZpZ3VyYWJsZTohMH0sTEVGVDp7Y29uZmlndXJhYmxlOiEwfSxSSUdIVDp7Y29uZmlndXJhYmxlOiEwfX07ZnVuY3Rpb24gT3ModCl7dGhpcy5tZXNzYWdlPXR8fCIifWZ1bmN0aW9uIExzKCl7dGhpcy5hcnJheV89W119RnMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEZzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBGc30sRnMub3Bwb3NpdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1Gcy5MRUZUP0ZzLlJJR0hUOnQ9PT1Gcy5SSUdIVD9Gcy5MRUZUOnR9LFRzLk9OLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxUcy5MRUZULmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxUcy5SSUdIVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRnMsVHMpLE9zLnByb3RvdHlwZT1uZXcgRXJyb3IsT3MucHJvdG90eXBlLm5hbWU9IkVtcHR5U3RhY2tFeGNlcHRpb24iLExzLnByb3RvdHlwZT1uZXcgdm8sTHMucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hcnJheV8ucHVzaCh0KSwhMH0sTHMucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZih0PDB8fHQ+PXRoaXMuc2l6ZSgpKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy5hcnJheV9bdF19LExzLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFycmF5Xy5wdXNoKHQpLHR9LExzLnByb3RvdHlwZS5wb3A9ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMuYXJyYXlfLmxlbmd0aCl0aHJvdyBuZXcgT3M7cmV0dXJuIHRoaXMuYXJyYXlfLnBvcCgpfSxMcy5wcm90b3R5cGUucGVlaz1mdW5jdGlvbigpe2lmKDA9PT10aGlzLmFycmF5Xy5sZW5ndGgpdGhyb3cgbmV3IE9zO3JldHVybiB0aGlzLmFycmF5X1t0aGlzLmFycmF5Xy5sZW5ndGgtMV19LExzLnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5hcnJheV8ubGVuZ3RofSxMcy5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVtcHR5KCl9LExzLnByb3RvdHlwZS5zZWFyY2g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXJyYXlfLmluZGV4T2YodCl9LExzLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLmxlbmd0aH0sTHMucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspdC5wdXNoKHRoaXMuYXJyYXlfW2VdKTtyZXR1cm4gdH07dmFyIFBzPWZ1bmN0aW9uKCl7dGhpcy5fbWluSW5kZXg9LTEsdGhpcy5fbWluQ29vcmQ9bnVsbCx0aGlzLl9taW5EZT1udWxsLHRoaXMuX29yaWVudGVkRGU9bnVsbH07UHMucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWluQ29vcmR9LFBzLnByb3RvdHlwZS5nZXRSaWdodG1vc3RTaWRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRSaWdodG1vc3RTaWRlT2ZTZWdtZW50KHQsZSk7cmV0dXJuIG48MCYmKG49dGhpcy5nZXRSaWdodG1vc3RTaWRlT2ZTZWdtZW50KHQsZS0xKSksbjwwJiYodGhpcy5fbWluQ29vcmQ9bnVsbCx0aGlzLmNoZWNrRm9yUmlnaHRtb3N0Q29vcmRpbmF0ZSh0KSksbn0sUHMucHJvdG90eXBlLmZpbmRSaWdodG1vc3RFZGdlQXRWZXJ0ZXg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9taW5EZS5nZXRFZGdlKCkuZ2V0Q29vcmRpbmF0ZXMoKTtaaS5pc1RydWUodGhpcy5fbWluSW5kZXg+MCYmdGhpcy5fbWluSW5kZXg8dC5sZW5ndGgsInJpZ2h0bW9zdCBwb2ludCBleHBlY3RlZCB0byBiZSBpbnRlcmlvciB2ZXJ0ZXggb2YgZWRnZSIpO3ZhciBlPXRbdGhpcy5fbWluSW5kZXgtMV0sbj10W3RoaXMuX21pbkluZGV4KzFdLHI9ZW8uY29tcHV0ZU9yaWVudGF0aW9uKHRoaXMuX21pbkNvb3JkLG4sZSksaT0hMTsoZS55PHRoaXMuX21pbkNvb3JkLnkmJm4ueTx0aGlzLl9taW5Db29yZC55JiZyPT09ZW8uQ09VTlRFUkNMT0NLV0lTRXx8ZS55PnRoaXMuX21pbkNvb3JkLnkmJm4ueT50aGlzLl9taW5Db29yZC55JiZyPT09ZW8uQ0xPQ0tXSVNFKSYmKGk9ITApLGkmJih0aGlzLl9taW5JbmRleD10aGlzLl9taW5JbmRleC0xKX0sUHMucHJvdG90eXBlLmdldFJpZ2h0bW9zdFNpZGVPZlNlZ21lbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpO2lmKGU8MHx8ZSsxPj1uLmxlbmd0aHx8bltlXS55PT09bltlKzFdLnkpcmV0dXJuLTE7dmFyIHI9RnMuTEVGVDtyZXR1cm4gbltlXS55PG5bZSsxXS55JiYocj1Gcy5SSUdIVCkscn0sUHMucHJvdG90eXBlLmdldEVkZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50ZWREZX0sUHMucHJvdG90eXBlLmNoZWNrRm9yUmlnaHRtb3N0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPXQuZ2V0RWRnZSgpLmdldENvb3JkaW5hdGVzKCkscj0wO3I8bi5sZW5ndGgtMTtyKyspKG51bGw9PT1lLl9taW5Db29yZHx8bltyXS54PmUuX21pbkNvb3JkLngpJiYoZS5fbWluRGU9dCxlLl9taW5JbmRleD1yLGUuX21pbkNvb3JkPW5bcl0pfSxQcy5wcm90b3R5cGUuZmluZFJpZ2h0bW9zdEVkZ2VBdE5vZGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9taW5EZS5nZXROb2RlKCkuZ2V0RWRnZXMoKTt0aGlzLl9taW5EZT10LmdldFJpZ2h0bW9zdEVkZ2UoKSx0aGlzLl9taW5EZS5pc0ZvcndhcmQoKXx8KHRoaXMuX21pbkRlPXRoaXMuX21pbkRlLmdldFN5bSgpLHRoaXMuX21pbkluZGV4PXRoaXMuX21pbkRlLmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpLmxlbmd0aC0xKX0sUHMucHJvdG90eXBlLmZpbmRFZGdlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTshbi5pc0ZvcndhcmQoKXx8dGhpcy5jaGVja0ZvclJpZ2h0bW9zdENvb3JkaW5hdGUobil9WmkuaXNUcnVlKDAhPT10aGlzLl9taW5JbmRleHx8dGhpcy5fbWluQ29vcmQuZXF1YWxzKHRoaXMuX21pbkRlLmdldENvb3JkaW5hdGUoKSksImluY29uc2lzdGVuY3kgaW4gcmlnaHRtb3N0IHByb2Nlc3NpbmciKSwwPT09dGhpcy5fbWluSW5kZXg/dGhpcy5maW5kUmlnaHRtb3N0RWRnZUF0Tm9kZSgpOnRoaXMuZmluZFJpZ2h0bW9zdEVkZ2VBdFZlcnRleCgpLHRoaXMuX29yaWVudGVkRGU9dGhpcy5fbWluRGUsdGhpcy5nZXRSaWdodG1vc3RTaWRlKHRoaXMuX21pbkRlLHRoaXMuX21pbkluZGV4KT09PUZzLkxFRlQmJih0aGlzLl9vcmllbnRlZERlPXRoaXMuX21pbkRlLmdldFN5bSgpKX0sUHMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFBzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBQc307dmFyIFJzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobixyKXt0LmNhbGwodGhpcyxlLm1zZ1dpdGhDb29yZChuLHIpKSx0aGlzLnB0PXI/bmV3IHZpKHIpOm51bGwsdGhpcy5uYW1lPSJUb3BvbG9neUV4Y2VwdGlvbiJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdH0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS5tc2dXaXRoQ29vcmQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT90OnQrIiBbICIrZSsiIF0ifSxlfShXaSksQnM9ZnVuY3Rpb24oKXt0aGlzLmFycmF5Xz1bXX07QnMucHJvdG90eXBlLmFkZExhc3Q9ZnVuY3Rpb24odCl7dGhpcy5hcnJheV8ucHVzaCh0KX0sQnMucHJvdG90eXBlLnJlbW92ZUZpcnN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLnNoaWZ0KCl9LEJzLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmFycmF5Xy5sZW5ndGh9O3ZhciBrcz1mdW5jdGlvbigpe3RoaXMuX2ZpbmRlcj1udWxsLHRoaXMuX2RpckVkZ2VMaXN0PW5ldyB4byx0aGlzLl9ub2Rlcz1uZXcgeG8sdGhpcy5fcmlnaHRNb3N0Q29vcmQ9bnVsbCx0aGlzLl9lbnY9bnVsbCx0aGlzLl9maW5kZXI9bmV3IFBzfTtrcy5wcm90b3R5cGUuY2xlYXJWaXNpdGVkRWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZGlyRWRnZUxpc3QuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLnNldFZpc2l0ZWQoITEpfX0sa3MucHJvdG90eXBlLmdldFJpZ2h0bW9zdENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmlnaHRNb3N0Q29vcmR9LGtzLnByb3RvdHlwZS5jb21wdXRlTm9kZURlcHRoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLG49dC5nZXRFZGdlcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZihyLmlzVmlzaXRlZCgpfHxyLmdldFN5bSgpLmlzVmlzaXRlZCgpKXtlPXI7YnJlYWt9fWlmKG51bGw9PT1lKXRocm93IG5ldyBScygidW5hYmxlIHRvIGZpbmQgZWRnZSB0byBjb21wdXRlIGRlcHRocyBhdCAiK3QuZ2V0Q29vcmRpbmF0ZSgpKTt0LmdldEVkZ2VzKCkuY29tcHV0ZURlcHRocyhlKTtmb3IodmFyIGk9dC5nZXRFZGdlcygpLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKTtvLnNldFZpc2l0ZWQoITApLHRoaXMuY29weVN5bURlcHRocyhvKX19LGtzLnByb3RvdHlwZS5jb21wdXRlRGVwdGg9ZnVuY3Rpb24odCl7dGhpcy5jbGVhclZpc2l0ZWRFZGdlcygpO3ZhciBlPXRoaXMuX2ZpbmRlci5nZXRFZGdlKCk7ZS5zZXRFZGdlRGVwdGhzKEZzLlJJR0hULHQpLHRoaXMuY29weVN5bURlcHRocyhlKSx0aGlzLmNvbXB1dGVEZXB0aHMoZSl9LGtzLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24odCl7dGhpcy5hZGRSZWFjaGFibGUodCksdGhpcy5fZmluZGVyLmZpbmRFZGdlKHRoaXMuX2RpckVkZ2VMaXN0KSx0aGlzLl9yaWdodE1vc3RDb29yZD10aGlzLl9maW5kZXIuZ2V0Q29vcmRpbmF0ZSgpfSxrcy5wcm90b3R5cGUuZmluZFJlc3VsdEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2RpckVkZ2VMaXN0Lml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKTtlLmdldERlcHRoKEZzLlJJR0hUKT49MSYmZS5nZXREZXB0aChGcy5MRUZUKTw9MCYmIWUuaXNJbnRlcmlvckFyZWFFZGdlKCkmJmUuc2V0SW5SZXN1bHQoITApfX0sa3MucHJvdG90eXBlLmNvbXB1dGVEZXB0aHM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEZvLG49bmV3IEJzLHI9dC5nZXROb2RlKCk7Zm9yKG4uYWRkTGFzdChyKSxlLmFkZChyKSx0LnNldFZpc2l0ZWQoITApOyFuLmlzRW1wdHkoKTspe3ZhciBpPW4ucmVtb3ZlRmlyc3QoKTtlLmFkZChpKSx0aGlzLmNvbXB1dGVOb2RlRGVwdGgoaSk7Zm9yKHZhciBvPWkuZ2V0RWRnZXMoKS5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCkuZ2V0U3ltKCk7aWYoIXMuaXNWaXNpdGVkKCkpe3ZhciBhPXMuZ2V0Tm9kZSgpO2UuY29udGFpbnMoYSl8fChuLmFkZExhc3QoYSksZS5hZGQoYSkpfX19fSxrcy5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX3JpZ2h0TW9zdENvb3JkLng8ZS5fcmlnaHRNb3N0Q29vcmQueD8tMTp0aGlzLl9yaWdodE1vc3RDb29yZC54PmUuX3JpZ2h0TW9zdENvb3JkLng/MTowfSxrcy5wcm90b3R5cGUuZ2V0RW52ZWxvcGU9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fZW52KXtmb3IodmFyIHQ9bmV3IGppLGU9dGhpcy5fZGlyRWRnZUxpc3QuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspZm9yKHZhciBuPWUubmV4dCgpLmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpLHI9MDtyPG4ubGVuZ3RoLTE7cisrKXQuZXhwYW5kVG9JbmNsdWRlKG5bcl0pO3RoaXMuX2Vudj10fXJldHVybiB0aGlzLl9lbnZ9LGtzLnByb3RvdHlwZS5hZGRSZWFjaGFibGU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IExzO2ZvcihlLmFkZCh0KTshZS5lbXB0eSgpOyl7dmFyIG49ZS5wb3AoKTt0aGlzLmFkZChuLGUpfX0sa3MucHJvdG90eXBlLmNvcHlTeW1EZXB0aHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRTeW0oKTtlLnNldERlcHRoKEZzLkxFRlQsdC5nZXREZXB0aChGcy5SSUdIVCkpLGUuc2V0RGVwdGgoRnMuUklHSFQsdC5nZXREZXB0aChGcy5MRUZUKSl9LGtzLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXt0LnNldFZpc2l0ZWQoITApLHRoaXMuX25vZGVzLmFkZCh0KTtmb3IodmFyIG49dC5nZXRFZGdlcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTt0aGlzLl9kaXJFZGdlTGlzdC5hZGQocik7dmFyIGk9ci5nZXRTeW0oKS5nZXROb2RlKCk7aS5pc1Zpc2l0ZWQoKXx8ZS5wdXNoKGkpfX0sa3MucHJvdG90eXBlLmdldE5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzfSxrcy5wcm90b3R5cGUuZ2V0RGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXJFZGdlTGlzdH0sa3MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpXX0sa3MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGtzfTt2YXIgenM9ZnVuY3Rpb24gdCgpe2lmKHRoaXMubG9jYXRpb249bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuaW5pdChlLmxlbmd0aCl9ZWxzZSBpZihOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLmluaXQoMSksdGhpcy5sb2NhdGlvbltGcy5PTl09bn1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCl7dmFyIHI9YXJndW1lbnRzWzBdO2lmKHRoaXMuaW5pdChyLmxvY2F0aW9uLmxlbmd0aCksbnVsbCE9PXIpZm9yKHZhciBpPTA7aTx0aGlzLmxvY2F0aW9uLmxlbmd0aDtpKyspdGhpcy5sb2NhdGlvbltpXT1yLmxvY2F0aW9uW2ldfX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl07dGhpcy5pbml0KDMpLHRoaXMubG9jYXRpb25bRnMuT05dPW8sdGhpcy5sb2NhdGlvbltGcy5MRUZUXT1zLHRoaXMubG9jYXRpb25bRnMuUklHSFRdPWF9fTt6cy5wcm90b3R5cGUuc2V0QWxsTG9jYXRpb25zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5sb2NhdGlvbi5sZW5ndGg7ZSsrKXRoaXMubG9jYXRpb25bZV09dH0senMucHJvdG90eXBlLmlzTnVsbD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5sb2NhdGlvbi5sZW5ndGg7dCsrKWlmKHRoaXMubG9jYXRpb25bdF0hPT1iaS5OT05FKXJldHVybiExO3JldHVybiEwfSx6cy5wcm90b3R5cGUuc2V0QWxsTG9jYXRpb25zSWZOdWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5sb2NhdGlvbi5sZW5ndGg7ZSsrKXRoaXMubG9jYXRpb25bZV09PT1iaS5OT05FJiYodGhpcy5sb2NhdGlvbltlXT10KX0senMucHJvdG90eXBlLmlzTGluZT1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5sb2NhdGlvbi5sZW5ndGh9LHpzLnByb3RvdHlwZS5tZXJnZT1mdW5jdGlvbih0KXtpZih0LmxvY2F0aW9uLmxlbmd0aD50aGlzLmxvY2F0aW9uLmxlbmd0aCl7dmFyIGU9bmV3IEFycmF5KDMpLmZpbGwobnVsbCk7ZVtGcy5PTl09dGhpcy5sb2NhdGlvbltGcy5PTl0sZVtGcy5MRUZUXT1iaS5OT05FLGVbRnMuUklHSFRdPWJpLk5PTkUsdGhpcy5sb2NhdGlvbj1lfWZvcih2YXIgbj0wO248dGhpcy5sb2NhdGlvbi5sZW5ndGg7bisrKXRoaXMubG9jYXRpb25bbl09PT1iaS5OT05FJiZuPHQubG9jYXRpb24ubGVuZ3RoJiYodGhpcy5sb2NhdGlvbltuXT10LmxvY2F0aW9uW25dKX0senMucHJvdG90eXBlLmdldExvY2F0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2F0aW9ufSx6cy5wcm90b3R5cGUuZmxpcD1mdW5jdGlvbigpe2lmKHRoaXMubG9jYXRpb24ubGVuZ3RoPD0xKXJldHVybiBudWxsO3ZhciB0PXRoaXMubG9jYXRpb25bRnMuTEVGVF07dGhpcy5sb2NhdGlvbltGcy5MRUZUXT10aGlzLmxvY2F0aW9uW0ZzLlJJR0hUXSx0aGlzLmxvY2F0aW9uW0ZzLlJJR0hUXT10fSx6cy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQWk7cmV0dXJuIHRoaXMubG9jYXRpb24ubGVuZ3RoPjEmJnQuYXBwZW5kKGJpLnRvTG9jYXRpb25TeW1ib2wodGhpcy5sb2NhdGlvbltGcy5MRUZUXSkpLHQuYXBwZW5kKGJpLnRvTG9jYXRpb25TeW1ib2wodGhpcy5sb2NhdGlvbltGcy5PTl0pKSx0aGlzLmxvY2F0aW9uLmxlbmd0aD4xJiZ0LmFwcGVuZChiaS50b0xvY2F0aW9uU3ltYm9sKHRoaXMubG9jYXRpb25bRnMuUklHSFRdKSksdC50b1N0cmluZygpfSx6cy5wcm90b3R5cGUuc2V0TG9jYXRpb25zPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmxvY2F0aW9uW0ZzLk9OXT10LHRoaXMubG9jYXRpb25bRnMuTEVGVF09ZSx0aGlzLmxvY2F0aW9uW0ZzLlJJR0hUXT1ufSx6cy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0PHRoaXMubG9jYXRpb24ubGVuZ3RoP3RoaXMubG9jYXRpb25bdF06YmkuTk9ORX0senMucHJvdG90eXBlLmlzQXJlYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2F0aW9uLmxlbmd0aD4xfSx6cy5wcm90b3R5cGUuaXNBbnlOdWxsPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLmxvY2F0aW9uLmxlbmd0aDt0KyspaWYodGhpcy5sb2NhdGlvblt0XT09PWJpLk5PTkUpcmV0dXJuITA7cmV0dXJuITF9LHpzLnByb3RvdHlwZS5zZXRMb2NhdGlvbj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRMb2NhdGlvbihGcy5PTix0KX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5sb2NhdGlvbltlXT1ufX0senMucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCl7dGhpcy5sb2NhdGlvbj1uZXcgQXJyYXkodCkuZmlsbChudWxsKSx0aGlzLnNldEFsbExvY2F0aW9ucyhiaS5OT05FKX0senMucHJvdG90eXBlLmlzRXF1YWxPblNpZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5sb2NhdGlvbltlXT09PXQubG9jYXRpb25bZV19LHpzLnByb3RvdHlwZS5hbGxQb3NpdGlvbnNFcXVhbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMubG9jYXRpb24ubGVuZ3RoO2UrKylpZih0aGlzLmxvY2F0aW9uW2VdIT09dClyZXR1cm4hMTtyZXR1cm4hMH0senMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHpzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB6c307dmFyIGpzPWZ1bmN0aW9uIHQoKXtpZih0aGlzLmVsdD1uZXcgQXJyYXkoMikuZmlsbChudWxsKSwxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5lbHRbMF09bmV3IHpzKGUpLHRoaXMuZWx0WzFdPW5ldyB6cyhlKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCl7dmFyIG49YXJndW1lbnRzWzBdO3RoaXMuZWx0WzBdPW5ldyB6cyhuLmVsdFswXSksdGhpcy5lbHRbMV09bmV3IHpzKG4uZWx0WzFdKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3RoaXMuZWx0WzBdPW5ldyB6cyhiaS5OT05FKSx0aGlzLmVsdFsxXT1uZXcgenMoYmkuTk9ORSksdGhpcy5lbHRbcl0uc2V0TG9jYXRpb24oaSl9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdLGE9YXJndW1lbnRzWzJdO3RoaXMuZWx0WzBdPW5ldyB6cyhvLHMsYSksdGhpcy5lbHRbMV09bmV3IHpzKG8scyxhKX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdT1hcmd1bWVudHNbMF0sYz1hcmd1bWVudHNbMV0sbD1hcmd1bWVudHNbMl0saD1hcmd1bWVudHNbM107dGhpcy5lbHRbMF09bmV3IHpzKGJpLk5PTkUsYmkuTk9ORSxiaS5OT05FKSx0aGlzLmVsdFsxXT1uZXcgenMoYmkuTk9ORSxiaS5OT05FLGJpLk5PTkUpLHRoaXMuZWx0W3VdLnNldExvY2F0aW9ucyhjLGwsaCl9fTtqcy5wcm90b3R5cGUuZ2V0R2VvbWV0cnlDb3VudD1mdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWx0WzBdLmlzTnVsbCgpfHx0KyssdGhpcy5lbHRbMV0uaXNOdWxsKCl8fHQrKyx0fSxqcy5wcm90b3R5cGUuc2V0QWxsTG9jYXRpb25zPWZ1bmN0aW9uKHQsZSl7dGhpcy5lbHRbdF0uc2V0QWxsTG9jYXRpb25zKGUpfSxqcy5wcm90b3R5cGUuaXNOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVsdFt0XS5pc051bGwoKX0sanMucHJvdG90eXBlLnNldEFsbExvY2F0aW9uc0lmTnVsbD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRBbGxMb2NhdGlvbnNJZk51bGwoMCx0KSx0aGlzLnNldEFsbExvY2F0aW9uc0lmTnVsbCgxLHQpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLmVsdFtlXS5zZXRBbGxMb2NhdGlvbnNJZk51bGwobil9fSxqcy5wcm90b3R5cGUuaXNMaW5lPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVsdFt0XS5pc0xpbmUoKX0sanMucHJvdG90eXBlLm1lcmdlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49MDtuPDI7bisrKW51bGw9PT1lLmVsdFtuXSYmbnVsbCE9PXQuZWx0W25dP2UuZWx0W25dPW5ldyB6cyh0LmVsdFtuXSk6ZS5lbHRbbl0ubWVyZ2UodC5lbHRbbl0pfSxqcy5wcm90b3R5cGUuZmxpcD1mdW5jdGlvbigpe3RoaXMuZWx0WzBdLmZsaXAoKSx0aGlzLmVsdFsxXS5mbGlwKCl9LGpzLnByb3RvdHlwZS5nZXRMb2NhdGlvbj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuZWx0W3RdLmdldChGcy5PTil9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5lbHRbZV0uZ2V0KG4pfX0sanMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFpO3JldHVybiBudWxsIT09dGhpcy5lbHRbMF0mJih0LmFwcGVuZCgiQToiKSx0LmFwcGVuZCh0aGlzLmVsdFswXS50b1N0cmluZygpKSksbnVsbCE9PXRoaXMuZWx0WzFdJiYodC5hcHBlbmQoIiBCOiIpLHQuYXBwZW5kKHRoaXMuZWx0WzFdLnRvU3RyaW5nKCkpKSx0LnRvU3RyaW5nKCl9LGpzLnByb3RvdHlwZS5pc0FyZWE9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5lbHRbMF0uaXNBcmVhKCl8fHRoaXMuZWx0WzFdLmlzQXJlYSgpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuZWx0W3RdLmlzQXJlYSgpfX0sanMucHJvdG90eXBlLmlzQW55TnVsbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbHRbdF0uaXNBbnlOdWxsKCl9LGpzLnByb3RvdHlwZS5zZXRMb2NhdGlvbj1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5lbHRbdF0uc2V0TG9jYXRpb24oRnMuT04sZSl9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdO3RoaXMuZWx0W25dLnNldExvY2F0aW9uKHIsaSl9fSxqcy5wcm90b3R5cGUuaXNFcXVhbE9uU2lkZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVsdFswXS5pc0VxdWFsT25TaWRlKHQuZWx0WzBdLGUpJiZ0aGlzLmVsdFsxXS5pc0VxdWFsT25TaWRlKHQuZWx0WzFdLGUpfSxqcy5wcm90b3R5cGUuYWxsUG9zaXRpb25zRXF1YWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lbHRbdF0uYWxsUG9zaXRpb25zRXF1YWwoZSl9LGpzLnByb3RvdHlwZS50b0xpbmU9ZnVuY3Rpb24odCl7dGhpcy5lbHRbdF0uaXNBcmVhKCkmJih0aGlzLmVsdFt0XT1uZXcgenModGhpcy5lbHRbdF0ubG9jYXRpb25bMF0pKX0sanMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGpzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBqc30sanMudG9MaW5lTGFiZWw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBqcyhiaS5OT05FKSxuPTA7bjwyO24rKyllLnNldExvY2F0aW9uKG4sdC5nZXRMb2NhdGlvbihuKSk7cmV0dXJuIGV9O3ZhciBVcz1mdW5jdGlvbigpe3RoaXMuX3N0YXJ0RGU9bnVsbCx0aGlzLl9tYXhOb2RlRGVncmVlPS0xLHRoaXMuX2VkZ2VzPW5ldyB4byx0aGlzLl9wdHM9bmV3IHhvLHRoaXMuX2xhYmVsPW5ldyBqcyhiaS5OT05FKSx0aGlzLl9yaW5nPW51bGwsdGhpcy5faXNIb2xlPW51bGwsdGhpcy5fc2hlbGw9bnVsbCx0aGlzLl9ob2xlcz1uZXcgeG8sdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2dlb21ldHJ5RmFjdG9yeT1lLHRoaXMuY29tcHV0ZVBvaW50cyh0KSx0aGlzLmNvbXB1dGVSaW5nKCl9O1VzLnByb3RvdHlwZS5jb21wdXRlUmluZz1mdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLl9yaW5nKXJldHVybiBudWxsO2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fcHRzLnNpemUoKSkuZmlsbChudWxsKSxlPTA7ZTx0aGlzLl9wdHMuc2l6ZSgpO2UrKyl0W2VdPXRoaXMuX3B0cy5nZXQoZSk7dGhpcy5fcmluZz10aGlzLl9nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyh0KSx0aGlzLl9pc0hvbGU9ZW8uaXNDQ1codGhpcy5fcmluZy5nZXRDb29yZGluYXRlcygpKX0sVXMucHJvdG90eXBlLmlzSXNvbGF0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMuX2xhYmVsLmdldEdlb21ldHJ5Q291bnQoKX0sVXMucHJvdG90eXBlLmNvbXB1dGVQb2ludHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9zdGFydERlPXQ7dmFyIG49dCxyPSEwO2Rve2lmKG51bGw9PT1uKXRocm93IG5ldyBScygiRm91bmQgbnVsbCBEaXJlY3RlZEVkZ2UiKTtpZihuLmdldEVkZ2VSaW5nKCk9PT1lKXRocm93IG5ldyBScygiRGlyZWN0ZWQgRWRnZSB2aXNpdGVkIHR3aWNlIGR1cmluZyByaW5nLWJ1aWxkaW5nIGF0ICIrbi5nZXRDb29yZGluYXRlKCkpO2UuX2VkZ2VzLmFkZChuKTt2YXIgaT1uLmdldExhYmVsKCk7WmkuaXNUcnVlKGkuaXNBcmVhKCkpLGUubWVyZ2VMYWJlbChpKSxlLmFkZFBvaW50cyhuLmdldEVkZ2UoKSxuLmlzRm9yd2FyZCgpLHIpLHI9ITEsZS5zZXRFZGdlUmluZyhuLGUpLG49ZS5nZXROZXh0KG4pfXdoaWxlKG4hPT10aGlzLl9zdGFydERlKX0sVXMucHJvdG90eXBlLmdldExpbmVhclJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmluZ30sVXMucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B0cy5nZXQodCl9LFVzLnByb3RvdHlwZS5jb21wdXRlTWF4Tm9kZURlZ3JlZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fbWF4Tm9kZURlZ3JlZT0wO3ZhciBlPXRoaXMuX3N0YXJ0RGU7ZG97dmFyIG49ZS5nZXROb2RlKCkuZ2V0RWRnZXMoKS5nZXRPdXRnb2luZ0RlZ3JlZSh0KTtuPnQuX21heE5vZGVEZWdyZWUmJih0Ll9tYXhOb2RlRGVncmVlPW4pLGU9dC5nZXROZXh0KGUpfXdoaWxlKGUhPT10aGlzLl9zdGFydERlKTt0aGlzLl9tYXhOb2RlRGVncmVlKj0yfSxVcy5wcm90b3R5cGUuYWRkUG9pbnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmdldENvb3JkaW5hdGVzKCk7aWYoZSl7dmFyIGk9MTtuJiYoaT0wKTtmb3IodmFyIG89aTtvPHIubGVuZ3RoO28rKyl0aGlzLl9wdHMuYWRkKHJbb10pfWVsc2V7dmFyIHM9ci5sZW5ndGgtMjtuJiYocz1yLmxlbmd0aC0xKTtmb3IodmFyIGE9czthPj0wO2EtLSl0aGlzLl9wdHMuYWRkKHJbYV0pfX0sVXMucHJvdG90eXBlLmlzSG9sZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0hvbGV9LFVzLnByb3RvdHlwZS5zZXRJblJlc3VsdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3N0YXJ0RGU7ZG97dC5nZXRFZGdlKCkuc2V0SW5SZXN1bHQoITApLHQ9dC5nZXROZXh0KCl9d2hpbGUodCE9PXRoaXMuX3N0YXJ0RGUpfSxVcy5wcm90b3R5cGUuY29udGFpbnNQb2ludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldExpbmVhclJpbmcoKTtpZighZS5nZXRFbnZlbG9wZUludGVybmFsKCkuY29udGFpbnModCl8fCFlby5pc1BvaW50SW5SaW5nKHQsZS5nZXRDb29yZGluYXRlcygpKSlyZXR1cm4hMTtmb3IodmFyIG49dGhpcy5faG9sZXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe2lmKG4ubmV4dCgpLmNvbnRhaW5zUG9pbnQodCkpcmV0dXJuITF9cmV0dXJuITB9LFVzLnByb3RvdHlwZS5hZGRIb2xlPWZ1bmN0aW9uKHQpe3RoaXMuX2hvbGVzLmFkZCh0KX0sVXMucHJvdG90eXBlLmlzU2hlbGw9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuX3NoZWxsfSxVcy5wcm90b3R5cGUuZ2V0TGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFiZWx9LFVzLnByb3RvdHlwZS5nZXRFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlc30sVXMucHJvdG90eXBlLmdldE1heE5vZGVEZWdyZWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4Tm9kZURlZ3JlZTwwJiZ0aGlzLmNvbXB1dGVNYXhOb2RlRGVncmVlKCksdGhpcy5fbWF4Tm9kZURlZ3JlZX0sVXMucHJvdG90eXBlLmdldFNoZWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoZWxsfSxVcy5wcm90b3R5cGUubWVyZ2VMYWJlbD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5tZXJnZUxhYmVsKHQsMCksdGhpcy5tZXJnZUxhYmVsKHQsMSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzBdLmdldExvY2F0aW9uKGUsRnMuUklHSFQpO2lmKG49PT1iaS5OT05FKXJldHVybiBudWxsO2lmKHRoaXMuX2xhYmVsLmdldExvY2F0aW9uKGUpPT09YmkuTk9ORSlyZXR1cm4gdGhpcy5fbGFiZWwuc2V0TG9jYXRpb24oZSxuKSxudWxsfX0sVXMucHJvdG90eXBlLnNldFNoZWxsPWZ1bmN0aW9uKHQpe3RoaXMuX3NoZWxsPXQsbnVsbCE9PXQmJnQuYWRkSG9sZSh0aGlzKX0sVXMucHJvdG90eXBlLnRvUG9seWdvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHRoaXMuX2hvbGVzLnNpemUoKSkuZmlsbChudWxsKSxuPTA7bjx0aGlzLl9ob2xlcy5zaXplKCk7bisrKWVbbl09dGhpcy5faG9sZXMuZ2V0KG4pLmdldExpbmVhclJpbmcoKTtyZXR1cm4gdC5jcmVhdGVQb2x5Z29uKHRoaXMuZ2V0TGluZWFyUmluZygpLGUpfSxVcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sVXMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFVzfTt2YXIgcXM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0LmNhbGwodGhpcyxlLG4pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5zZXRFZGdlUmluZz1mdW5jdGlvbih0LGUpe3Quc2V0TWluRWRnZVJpbmcoZSl9LGUucHJvdG90eXBlLmdldE5leHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TmV4dE1pbigpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShVcyksVnM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0LmNhbGwodGhpcyxlLG4pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5idWlsZE1pbmltYWxSaW5ncz1mdW5jdGlvbigpe3ZhciB0PW5ldyB4byxlPXRoaXMuX3N0YXJ0RGU7ZG97aWYobnVsbD09PWUuZ2V0TWluRWRnZVJpbmcoKSl7dmFyIG49bmV3IHFzKGUsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5KTt0LmFkZChuKX1lPWUuZ2V0TmV4dCgpfXdoaWxlKGUhPT10aGlzLl9zdGFydERlKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuc2V0RWRnZVJpbmc9ZnVuY3Rpb24odCxlKXt0LnNldEVkZ2VSaW5nKGUpfSxlLnByb3RvdHlwZS5saW5rRGlyZWN0ZWRFZGdlc0Zvck1pbmltYWxFZGdlUmluZ3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdGFydERlO2Rve3QuZ2V0Tm9kZSgpLmdldEVkZ2VzKCkubGlua01pbmltYWxEaXJlY3RlZEVkZ2VzKHRoaXMpLHQ9dC5nZXROZXh0KCl9d2hpbGUodCE9PXRoaXMuX3N0YXJ0RGUpfSxlLnByb3RvdHlwZS5nZXROZXh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE5leHQoKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oVXMpLEdzPWZ1bmN0aW9uKCl7aWYodGhpcy5fbGFiZWw9bnVsbCx0aGlzLl9pc0luUmVzdWx0PSExLHRoaXMuX2lzQ292ZXJlZD0hMSx0aGlzLl9pc0NvdmVyZWRTZXQ9ITEsdGhpcy5faXNWaXNpdGVkPSExLDAhPT1hcmd1bWVudHMubGVuZ3RoJiYxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xhYmVsPXR9fTtHcy5wcm90b3R5cGUuc2V0VmlzaXRlZD1mdW5jdGlvbih0KXt0aGlzLl9pc1Zpc2l0ZWQ9dH0sR3MucHJvdG90eXBlLnNldEluUmVzdWx0PWZ1bmN0aW9uKHQpe3RoaXMuX2lzSW5SZXN1bHQ9dH0sR3MucHJvdG90eXBlLmlzQ292ZXJlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0NvdmVyZWR9LEdzLnByb3RvdHlwZS5pc0NvdmVyZWRTZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNDb3ZlcmVkU2V0fSxHcy5wcm90b3R5cGUuc2V0TGFiZWw9ZnVuY3Rpb24odCl7dGhpcy5fbGFiZWw9dH0sR3MucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfSxHcy5wcm90b3R5cGUuc2V0Q292ZXJlZD1mdW5jdGlvbih0KXt0aGlzLl9pc0NvdmVyZWQ9dCx0aGlzLl9pc0NvdmVyZWRTZXQ9ITB9LEdzLnByb3RvdHlwZS51cGRhdGVJTT1mdW5jdGlvbih0KXtaaS5pc1RydWUodGhpcy5fbGFiZWwuZ2V0R2VvbWV0cnlDb3VudCgpPj0yLCJmb3VuZCBwYXJ0aWFsIGxhYmVsIiksdGhpcy5jb21wdXRlSU0odCl9LEdzLnByb3RvdHlwZS5pc0luUmVzdWx0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSW5SZXN1bHR9LEdzLnByb3RvdHlwZS5pc1Zpc2l0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWaXNpdGVkfSxHcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sR3MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEdzfTt2YXIgWXM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9jb29yZD1udWxsLHRoaXMuX2VkZ2VzPW51bGw7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuX2Nvb3JkPWUsdGhpcy5fZWRnZXM9bix0aGlzLl9sYWJlbD1uZXcganMoMCxiaS5OT05FKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaXNJbmNpZGVudEVkZ2VJblJlc3VsdD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmdldEVkZ2VzKCkuZ2V0RWRnZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7aWYodC5uZXh0KCkuZ2V0RWRnZSgpLmlzSW5SZXN1bHQoKSlyZXR1cm4hMH1yZXR1cm4hMX0sZS5wcm90b3R5cGUuaXNJc29sYXRlZD1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5fbGFiZWwuZ2V0R2VvbWV0cnlDb3VudCgpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Nvb3JkfSxlLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50bG4oIm5vZGUgIit0aGlzLl9jb29yZCsiIGxibDogIit0aGlzLl9sYWJlbCl9LGUucHJvdG90eXBlLmNvbXB1dGVJTT1mdW5jdGlvbih0KXt9LGUucHJvdG90eXBlLmNvbXB1dGVNZXJnZWRMb2NhdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPWJpLk5PTkU7aWYobj10aGlzLl9sYWJlbC5nZXRMb2NhdGlvbihlKSwhdC5pc051bGwoZSkpe3ZhciByPXQuZ2V0TG9jYXRpb24oZSk7biE9PWJpLkJPVU5EQVJZJiYobj1yKX1yZXR1cm4gbn0sZS5wcm90b3R5cGUuc2V0TGFiZWw9ZnVuY3Rpb24oKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUuc2V0TGFiZWwuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtudWxsPT09dGhpcy5fbGFiZWw/dGhpcy5fbGFiZWw9bmV3IGpzKGUsbik6dGhpcy5fbGFiZWwuc2V0TG9jYXRpb24oZSxuKX0sZS5wcm90b3R5cGUuZ2V0RWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZXN9LGUucHJvdG90eXBlLm1lcmdlTGFiZWw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgZSl7dmFyIG49YXJndW1lbnRzWzBdO3RoaXMubWVyZ2VMYWJlbChuLl9sYWJlbCl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGpzKWZvcih2YXIgcj1hcmd1bWVudHNbMF0saT0wO2k8MjtpKyspe3ZhciBvPXQuY29tcHV0ZU1lcmdlZExvY2F0aW9uKHIsaSk7dC5fbGFiZWwuZ2V0TG9jYXRpb24oaSk9PT1iaS5OT05FJiZ0Ll9sYWJlbC5zZXRMb2NhdGlvbihpLG8pfX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuX2VkZ2VzLmluc2VydCh0KSx0LnNldE5vZGUodGhpcyl9LGUucHJvdG90eXBlLnNldExhYmVsQm91bmRhcnk9ZnVuY3Rpb24odCl7aWYobnVsbD09PXRoaXMuX2xhYmVsKXJldHVybiBudWxsO3ZhciBlPWJpLk5PTkU7bnVsbCE9PXRoaXMuX2xhYmVsJiYoZT10aGlzLl9sYWJlbC5nZXRMb2NhdGlvbih0KSk7dmFyIG49bnVsbDtpZihlPT09YmkuQk9VTkRBUlkpbj1iaS5JTlRFUklPUjtlbHNlIG49YmkuQk9VTkRBUlk7dGhpcy5fbGFiZWwuc2V0TG9jYXRpb24odCxuKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oR3MpLFhzPWZ1bmN0aW9uKCl7dGhpcy5ub2RlTWFwPW5ldyBrbyx0aGlzLm5vZGVGYWN0PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMubm9kZUZhY3Q9dH07WHMucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubm9kZU1hcC5nZXQodCl9LFhzLnByb3RvdHlwZS5hZGROb2RlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dGhpcy5ub2RlTWFwLmdldCh0KTtyZXR1cm4gbnVsbD09PWUmJihlPXRoaXMubm9kZUZhY3QuY3JlYXRlTm9kZSh0KSx0aGlzLm5vZGVNYXAucHV0KHQsZSkpLGV9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBZcyl7dmFyIG49YXJndW1lbnRzWzBdLHI9dGhpcy5ub2RlTWFwLmdldChuLmdldENvb3JkaW5hdGUoKSk7cmV0dXJuIG51bGw9PT1yPyh0aGlzLm5vZGVNYXAucHV0KG4uZ2V0Q29vcmRpbmF0ZSgpLG4pLG4pOihyLm1lcmdlTGFiZWwobikscil9fSxYcy5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLnByaW50KHQpfX0sWHMucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpfSxYcy5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZU1hcC52YWx1ZXMoKX0sWHMucHJvdG90eXBlLmdldEJvdW5kYXJ5Tm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPXRoaXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3IuZ2V0TGFiZWwoKS5nZXRMb2NhdGlvbih0KT09PWJpLkJPVU5EQVJZJiZlLmFkZChyKX1yZXR1cm4gZX0sWHMucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt2YXIgZT10LmdldENvb3JkaW5hdGUoKTt0aGlzLmFkZE5vZGUoZSkuYWRkKHQpfSxYcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWHMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFhzfTt2YXIgV3M9ZnVuY3Rpb24oKXt9LEhzPXtORTp7Y29uZmlndXJhYmxlOiEwfSxOVzp7Y29uZmlndXJhYmxlOiEwfSxTVzp7Y29uZmlndXJhYmxlOiEwfSxTRTp7Y29uZmlndXJhYmxlOiEwfX07V3MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFdzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBXc30sV3MuaXNOb3J0aGVybj1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVdzLk5FfHx0PT09V3MuTld9LFdzLmlzT3Bwb3NpdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCE9PWUmJjI9PT0odC1lKzQpJTR9LFdzLmNvbW1vbkhhbGZQbGFuZT1mdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXJldHVybiB0O2lmKDI9PT0odC1lKzQpJTQpcmV0dXJuLTE7dmFyIG49dDxlP3Q6ZTtyZXR1cm4gMD09PW4mJjM9PT0odD5lP3Q6ZSk/MzpufSxXcy5pc0luSGFsZlBsYW5lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9PT1Xcy5TRT90PT09V3MuU0V8fHQ9PT1Xcy5TVzp0PT09ZXx8dD09PWUrMX0sV3MucXVhZHJhbnQ9ZnVuY3Rpb24oKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtpZigwPT09dCYmMD09PWUpdGhyb3cgbmV3IGhpO3JldHVybiB0Pj0wP2U+PTA/V3MuTkU6V3MuU0U6ZT49MD9Xcy5OVzpXcy5TV31pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07aWYoci54PT09bi54JiZyLnk9PT1uLnkpdGhyb3cgbmV3IGhpO3JldHVybiByLng+PW4ueD9yLnk+PW4ueT9Xcy5ORTpXcy5TRTpyLnk+PW4ueT9Xcy5OVzpXcy5TV319LEhzLk5FLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxIcy5OVy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sSHMuU1cuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LEhzLlNFLmdldD1mdW5jdGlvbigpe3JldHVybiAzfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhXcyxIcyk7dmFyIFpzPWZ1bmN0aW9uKCl7aWYodGhpcy5fZWRnZT1udWxsLHRoaXMuX2xhYmVsPW51bGwsdGhpcy5fbm9kZT1udWxsLHRoaXMuX3AwPW51bGwsdGhpcy5fcDE9bnVsbCx0aGlzLl9keD1udWxsLHRoaXMuX2R5PW51bGwsdGhpcy5fcXVhZHJhbnQ9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2VkZ2U9dH1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5fZWRnZT1lLHRoaXMuaW5pdChuLHIpLHRoaXMuX2xhYmVsPW51bGx9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzNdO3RoaXMuX2VkZ2U9aSx0aGlzLmluaXQobyxzKSx0aGlzLl9sYWJlbD1hfX07WnMucHJvdG90eXBlLmNvbXBhcmVEaXJlY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2R4PT09dC5fZHgmJnRoaXMuX2R5PT09dC5fZHk/MDp0aGlzLl9xdWFkcmFudD50Ll9xdWFkcmFudD8xOnRoaXMuX3F1YWRyYW50PHQuX3F1YWRyYW50Py0xOmVvLmNvbXB1dGVPcmllbnRhdGlvbih0Ll9wMCx0Ll9wMSx0aGlzLl9wMSl9LFpzLnByb3RvdHlwZS5nZXREeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9keX0sWnMucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcDB9LFpzLnByb3RvdHlwZS5zZXROb2RlPWZ1bmN0aW9uKHQpe3RoaXMuX25vZGU9dH0sWnMucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguYXRhbjIodGhpcy5fZHksdGhpcy5fZHgpLG49dGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSxyPW4ubGFzdEluZGV4T2YoIi4iKSxpPW4uc3Vic3RyaW5nKHIrMSk7dC5wcmludCgiICAiK2krIjogIit0aGlzLl9wMCsiIC0gIit0aGlzLl9wMSsiICIrdGhpcy5fcXVhZHJhbnQrIjoiK2UrIiAgICIrdGhpcy5fbGFiZWwpfSxacy5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuY29tcGFyZURpcmVjdGlvbihlKX0sWnMucHJvdG90eXBlLmdldERpcmVjdGVkQ29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wMX0sWnMucHJvdG90eXBlLmdldER4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2R4fSxacy5wcm90b3R5cGUuZ2V0TGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFiZWx9LFpzLnByb3RvdHlwZS5nZXRFZGdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2V9LFpzLnByb3RvdHlwZS5nZXRRdWFkcmFudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9xdWFkcmFudH0sWnMucHJvdG90eXBlLmdldE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZX0sWnMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9TWF0aC5hdGFuMih0aGlzLl9keSx0aGlzLl9keCksZT10aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLG49ZS5sYXN0SW5kZXhPZigiLiIpO3JldHVybiIgICIrZS5zdWJzdHJpbmcobisxKSsiOiAiK3RoaXMuX3AwKyIgLSAiK3RoaXMuX3AxKyIgIit0aGlzLl9xdWFkcmFudCsiOiIrdCsiICAgIit0aGlzLl9sYWJlbH0sWnMucHJvdG90eXBlLmNvbXB1dGVMYWJlbD1mdW5jdGlvbih0KXt9LFpzLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSl7dGhpcy5fcDA9dCx0aGlzLl9wMT1lLHRoaXMuX2R4PWUueC10LngsdGhpcy5fZHk9ZS55LXQueSx0aGlzLl9xdWFkcmFudD1Xcy5xdWFkcmFudCh0aGlzLl9keCx0aGlzLl9keSksWmkuaXNUcnVlKCEoMD09PXRoaXMuX2R4JiYwPT09dGhpcy5fZHkpLCJFZGdlRW5kIHdpdGggaWRlbnRpY2FsIGVuZHBvaW50cyBmb3VuZCIpfSxacy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSxacy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWnN9O3ZhciBLcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKHQuY2FsbCh0aGlzLGUpLHRoaXMuX2lzRm9yd2FyZD1udWxsLHRoaXMuX2lzSW5SZXN1bHQ9ITEsdGhpcy5faXNWaXNpdGVkPSExLHRoaXMuX3N5bT1udWxsLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9uZXh0TWluPW51bGwsdGhpcy5fZWRnZVJpbmc9bnVsbCx0aGlzLl9taW5FZGdlUmluZz1udWxsLHRoaXMuX2RlcHRoPVswLC05OTksLTk5OV0sdGhpcy5faXNGb3J3YXJkPW4sbil0aGlzLmluaXQoZS5nZXRDb29yZGluYXRlKDApLGUuZ2V0Q29vcmRpbmF0ZSgxKSk7ZWxzZXt2YXIgcj1lLmdldE51bVBvaW50cygpLTE7dGhpcy5pbml0KGUuZ2V0Q29vcmRpbmF0ZShyKSxlLmdldENvb3JkaW5hdGUoci0xKSl9dGhpcy5jb21wdXRlRGlyZWN0ZWRMYWJlbCgpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXROZXh0TWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25leHRNaW59LGUucHJvdG90eXBlLmdldERlcHRoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kZXB0aFt0XX0sZS5wcm90b3R5cGUuc2V0VmlzaXRlZD1mdW5jdGlvbih0KXt0aGlzLl9pc1Zpc2l0ZWQ9dH0sZS5wcm90b3R5cGUuY29tcHV0ZURpcmVjdGVkTGFiZWw9ZnVuY3Rpb24oKXt0aGlzLl9sYWJlbD1uZXcganModGhpcy5fZWRnZS5nZXRMYWJlbCgpKSx0aGlzLl9pc0ZvcndhcmR8fHRoaXMuX2xhYmVsLmZsaXAoKX0sZS5wcm90b3R5cGUuZ2V0TmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9uZXh0fSxlLnByb3RvdHlwZS5zZXREZXB0aD1mdW5jdGlvbih0LGUpe2lmKC05OTkhPT10aGlzLl9kZXB0aFt0XSYmdGhpcy5fZGVwdGhbdF0hPT1lKXRocm93IG5ldyBScygiYXNzaWduZWQgZGVwdGhzIGRvIG5vdCBtYXRjaCIsdGhpcy5nZXRDb29yZGluYXRlKCkpO3RoaXMuX2RlcHRoW3RdPWV9LGUucHJvdG90eXBlLmlzSW50ZXJpb3JBcmVhRWRnZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9ITAsbj0wO248MjtuKyspdC5fbGFiZWwuaXNBcmVhKG4pJiZ0Ll9sYWJlbC5nZXRMb2NhdGlvbihuLEZzLkxFRlQpPT09YmkuSU5URVJJT1ImJnQuX2xhYmVsLmdldExvY2F0aW9uKG4sRnMuUklHSFQpPT09YmkuSU5URVJJT1J8fChlPSExKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuc2V0TmV4dE1pbj1mdW5jdGlvbih0KXt0aGlzLl9uZXh0TWluPXR9LGUucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLnByaW50LmNhbGwodGhpcyxlKSxlLnByaW50KCIgIit0aGlzLl9kZXB0aFtGcy5MRUZUXSsiLyIrdGhpcy5fZGVwdGhbRnMuUklHSFRdKSxlLnByaW50KCIgKCIrdGhpcy5nZXREZXB0aERlbHRhKCkrIikiKSx0aGlzLl9pc0luUmVzdWx0JiZlLnByaW50KCIgaW5SZXN1bHQiKX0sZS5wcm90b3R5cGUuc2V0TWluRWRnZVJpbmc9ZnVuY3Rpb24odCl7dGhpcy5fbWluRWRnZVJpbmc9dH0sZS5wcm90b3R5cGUuaXNMaW5lRWRnZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2xhYmVsLmlzTGluZSgwKXx8dGhpcy5fbGFiZWwuaXNMaW5lKDEpLGU9IXRoaXMuX2xhYmVsLmlzQXJlYSgwKXx8dGhpcy5fbGFiZWwuYWxsUG9zaXRpb25zRXF1YWwoMCxiaS5FWFRFUklPUiksbj0hdGhpcy5fbGFiZWwuaXNBcmVhKDEpfHx0aGlzLl9sYWJlbC5hbGxQb3NpdGlvbnNFcXVhbCgxLGJpLkVYVEVSSU9SKTtyZXR1cm4gdCYmZSYmbn0sZS5wcm90b3R5cGUuc2V0RWRnZVJpbmc9ZnVuY3Rpb24odCl7dGhpcy5fZWRnZVJpbmc9dH0sZS5wcm90b3R5cGUuZ2V0TWluRWRnZVJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWluRWRnZVJpbmd9LGUucHJvdG90eXBlLmdldERlcHRoRGVsdGE9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9lZGdlLmdldERlcHRoRGVsdGEoKTtyZXR1cm4gdGhpcy5faXNGb3J3YXJkfHwodD0tdCksdH0sZS5wcm90b3R5cGUuc2V0SW5SZXN1bHQ9ZnVuY3Rpb24odCl7dGhpcy5faXNJblJlc3VsdD10fSxlLnByb3RvdHlwZS5nZXRTeW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3ltfSxlLnByb3RvdHlwZS5pc0ZvcndhcmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNGb3J3YXJkfSxlLnByb3RvdHlwZS5nZXRFZGdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2V9LGUucHJvdG90eXBlLnByaW50RWRnZT1mdW5jdGlvbih0KXt0aGlzLnByaW50KHQpLHQucHJpbnQoIiAiKSx0aGlzLl9pc0ZvcndhcmQ/dGhpcy5fZWRnZS5wcmludCh0KTp0aGlzLl9lZGdlLnByaW50UmV2ZXJzZSh0KX0sZS5wcm90b3R5cGUuc2V0U3ltPWZ1bmN0aW9uKHQpe3RoaXMuX3N5bT10fSxlLnByb3RvdHlwZS5zZXRWaXNpdGVkRWRnZT1mdW5jdGlvbih0KXt0aGlzLnNldFZpc2l0ZWQodCksdGhpcy5fc3ltLnNldFZpc2l0ZWQodCl9LGUucHJvdG90eXBlLnNldEVkZ2VEZXB0aHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldEVkZ2UoKS5nZXREZXB0aERlbHRhKCk7dGhpcy5faXNGb3J3YXJkfHwobj0tbik7dmFyIHI9MTt0PT09RnMuTEVGVCYmKHI9LTEpO3ZhciBpPUZzLm9wcG9zaXRlKHQpLG89ZStuKnI7dGhpcy5zZXREZXB0aCh0LGUpLHRoaXMuc2V0RGVwdGgoaSxvKX0sZS5wcm90b3R5cGUuZ2V0RWRnZVJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZVJpbmd9LGUucHJvdG90eXBlLmlzSW5SZXN1bHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNJblJlc3VsdH0sZS5wcm90b3R5cGUuc2V0TmV4dD1mdW5jdGlvbih0KXt0aGlzLl9uZXh0PXR9LGUucHJvdG90eXBlLmlzVmlzaXRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1Zpc2l0ZWR9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGUuZGVwdGhGYWN0b3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWJpLkVYVEVSSU9SJiZlPT09YmkuSU5URVJJT1I/MTp0PT09YmkuSU5URVJJT1ImJmU9PT1iaS5FWFRFUklPUj8tMTowfSxlfShacyksSnM9ZnVuY3Rpb24oKXt9O0pzLnByb3RvdHlwZS5jcmVhdGVOb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWXModCxudWxsKX0sSnMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEpzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBKc307dmFyIFFzPWZ1bmN0aW9uKCl7aWYodGhpcy5fZWRnZXM9bmV3IHhvLHRoaXMuX25vZGVzPW51bGwsdGhpcy5fZWRnZUVuZExpc3Q9bmV3IHhvLDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuX25vZGVzPW5ldyBYcyhuZXcgSnMpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9ub2Rlcz1uZXcgWHModCl9fTtRcy5wcm90b3R5cGUucHJpbnRFZGdlcz1mdW5jdGlvbih0KXt0LnByaW50bG4oIkVkZ2VzOiIpO2Zvcih2YXIgZT0wO2U8dGhpcy5fZWRnZXMuc2l6ZSgpO2UrKyl7dC5wcmludGxuKCJlZGdlICIrZSsiOiIpO3ZhciBuPXRoaXMuX2VkZ2VzLmdldChlKTtuLnByaW50KHQpLG4uZWlMaXN0LnByaW50KHQpfX0sUXMucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25vZGVzLmZpbmQodCl9LFFzLnByb3RvdHlwZS5hZGROb2RlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBZcyl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl9ub2Rlcy5hZGROb2RlKHQpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fbm9kZXMuYWRkTm9kZShlKX19LFFzLnByb3RvdHlwZS5nZXROb2RlSXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZXMuaXRlcmF0b3IoKX0sUXMucHJvdG90eXBlLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25vZGVzLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt0Lm5leHQoKS5nZXRFZGdlcygpLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzKCl9fSxRcy5wcm90b3R5cGUuZGVidWdQcmludGxuPWZ1bmN0aW9uKHQpe2tpLm91dC5wcmludGxuKHQpfSxRcy5wcm90b3R5cGUuaXNCb3VuZGFyeU5vZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9ub2Rlcy5maW5kKGUpO2lmKG51bGw9PT1uKXJldHVybiExO3ZhciByPW4uZ2V0TGFiZWwoKTtyZXR1cm4gbnVsbCE9PXImJnIuZ2V0TG9jYXRpb24odCk9PT1iaS5CT1VOREFSWX0sUXMucHJvdG90eXBlLmxpbmtBbGxEaXJlY3RlZEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25vZGVzLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt0Lm5leHQoKS5nZXRFZGdlcygpLmxpbmtBbGxEaXJlY3RlZEVkZ2VzKCl9fSxRcy5wcm90b3R5cGUubWF0Y2hJblNhbWVEaXJlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuISF0LmVxdWFscyhuKSYmKGVvLmNvbXB1dGVPcmllbnRhdGlvbih0LGUscik9PT1lby5DT0xMSU5FQVImJldzLnF1YWRyYW50KHQsZSk9PT1Xcy5xdWFkcmFudChuLHIpKX0sUXMucHJvdG90eXBlLmdldEVkZ2VFbmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VFbmRMaXN0fSxRcy5wcm90b3R5cGUuZGVidWdQcmludD1mdW5jdGlvbih0KXtraS5vdXQucHJpbnQodCl9LFFzLnByb3RvdHlwZS5nZXRFZGdlSXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZXMuaXRlcmF0b3IoKX0sUXMucHJvdG90eXBlLmZpbmRFZGdlSW5TYW1lRGlyZWN0aW9uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMscj0wO3I8dGhpcy5fZWRnZXMuc2l6ZSgpO3IrKyl7dmFyIGk9bi5fZWRnZXMuZ2V0KHIpLG89aS5nZXRDb29yZGluYXRlcygpO2lmKG4ubWF0Y2hJblNhbWVEaXJlY3Rpb24odCxlLG9bMF0sb1sxXSl8fG4ubWF0Y2hJblNhbWVEaXJlY3Rpb24odCxlLG9bby5sZW5ndGgtMV0sb1tvLmxlbmd0aC0yXSkpcmV0dXJuIGl9cmV0dXJuIG51bGx9LFFzLnByb3RvdHlwZS5pbnNlcnRFZGdlPWZ1bmN0aW9uKHQpe3RoaXMuX2VkZ2VzLmFkZCh0KX0sUXMucHJvdG90eXBlLmZpbmRFZGdlRW5kPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO2lmKG4uZ2V0RWRnZSgpPT09dClyZXR1cm4gbn1yZXR1cm4gbnVsbH0sUXMucHJvdG90eXBlLmFkZEVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ZS5fZWRnZXMuYWRkKHIpO3ZhciBpPW5ldyBLcyhyLCEwKSxvPW5ldyBLcyhyLCExKTtpLnNldFN5bShvKSxvLnNldFN5bShpKSxlLmFkZChpKSxlLmFkZChvKX19LFFzLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5fbm9kZXMuYWRkKHQpLHRoaXMuX2VkZ2VFbmRMaXN0LmFkZCh0KX0sUXMucHJvdG90eXBlLmdldE5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzLnZhbHVlcygpfSxRcy5wcm90b3R5cGUuZmluZEVkZ2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHRoaXMuX2VkZ2VzLnNpemUoKTtuKyspe3ZhciByPXRoaXMuX2VkZ2VzLmdldChuKSxpPXIuZ2V0Q29vcmRpbmF0ZXMoKTtpZih0LmVxdWFscyhpWzBdKSYmZS5lcXVhbHMoaVsxXSkpcmV0dXJuIHJ9cmV0dXJuIG51bGx9LFFzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxRcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUXN9LFFzLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5nZXRFZGdlcygpLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzKCl9fTt2YXIgJHM9ZnVuY3Rpb24oKXt0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9bnVsbCx0aGlzLl9zaGVsbExpc3Q9bmV3IHhvO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9dH07JHMucHJvdG90eXBlLnNvcnRTaGVsbHNBbmRIb2xlcz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXQuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO2kuaXNIb2xlKCk/bi5hZGQoaSk6ZS5hZGQoaSl9fSwkcy5wcm90b3R5cGUuY29tcHV0ZVBvbHlnb25zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKS50b1BvbHlnb24odGhpcy5fZ2VvbWV0cnlGYWN0b3J5KTtlLmFkZChyKX1yZXR1cm4gZX0sJHMucHJvdG90eXBlLnBsYWNlRnJlZUhvbGVzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2lmKG51bGw9PT1yLmdldFNoZWxsKCkpe3ZhciBpPXRoaXMuZmluZEVkZ2VSaW5nQ29udGFpbmluZyhyLHQpO2lmKG51bGw9PT1pKXRocm93IG5ldyBScygidW5hYmxlIHRvIGFzc2lnbiBob2xlIHRvIGEgc2hlbGwiLHIuZ2V0Q29vcmRpbmF0ZSgwKSk7ci5zZXRTaGVsbChpKX19fSwkcy5wcm90b3R5cGUuYnVpbGRNaW5pbWFsRWRnZVJpbmdzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bmV3IHhvLGk9dC5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCk7aWYoby5nZXRNYXhOb2RlRGVncmVlKCk+Mil7by5saW5rRGlyZWN0ZWRFZGdlc0Zvck1pbmltYWxFZGdlUmluZ3MoKTt2YXIgcz1vLmJ1aWxkTWluaW1hbFJpbmdzKCksYT10aGlzLmZpbmRTaGVsbChzKTtudWxsIT09YT8odGhpcy5wbGFjZVBvbHlnb25Ib2xlcyhhLHMpLGUuYWRkKGEpKTpuLmFkZEFsbChzKX1lbHNlIHIuYWRkKG8pfXJldHVybiByfSwkcy5wcm90b3R5cGUuY29udGFpbnNQb2ludD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fc2hlbGxMaXN0Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtpZihlLm5leHQoKS5jb250YWluc1BvaW50KHQpKXJldHVybiEwfXJldHVybiExfSwkcy5wcm90b3R5cGUuYnVpbGRNYXhpbWFsRWRnZVJpbmdzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZihyLmlzSW5SZXN1bHQoKSYmci5nZXRMYWJlbCgpLmlzQXJlYSgpJiZudWxsPT09ci5nZXRFZGdlUmluZygpKXt2YXIgaT1uZXcgVnMocix0aGlzLl9nZW9tZXRyeUZhY3RvcnkpO2UuYWRkKGkpLGkuc2V0SW5SZXN1bHQoKX19cmV0dXJuIGV9LCRzLnByb3RvdHlwZS5wbGFjZVBvbHlnb25Ib2xlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtyLmlzSG9sZSgpJiZyLnNldFNoZWxsKHQpfX0sJHMucHJvdG90eXBlLmdldFBvbHlnb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZVBvbHlnb25zKHRoaXMuX3NoZWxsTGlzdCl9LCRzLnByb3RvdHlwZS5maW5kRWRnZVJpbmdDb250YWluaW5nPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2V0TGluZWFyUmluZygpLHI9bi5nZXRFbnZlbG9wZUludGVybmFsKCksaT1uLmdldENvb3JkaW5hdGVOKDApLG89bnVsbCxzPW51bGwsYT1lLml0ZXJhdG9yKCk7YS5oYXNOZXh0KCk7KXt2YXIgdT1hLm5leHQoKSxjPXUuZ2V0TGluZWFyUmluZygpLGw9Yy5nZXRFbnZlbG9wZUludGVybmFsKCk7bnVsbCE9PW8mJihzPW8uZ2V0TGluZWFyUmluZygpLmdldEVudmVsb3BlSW50ZXJuYWwoKSk7dmFyIGg9ITE7bC5jb250YWlucyhyKSYmZW8uaXNQb2ludEluUmluZyhpLGMuZ2V0Q29vcmRpbmF0ZXMoKSkmJihoPSEwKSxoJiYobnVsbD09PW98fHMuY29udGFpbnMobCkpJiYobz11KX1yZXR1cm4gb30sJHMucHJvdG90eXBlLmZpbmRTaGVsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPW51bGwscj10Lml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtpLmlzSG9sZSgpfHwobj1pLGUrKyl9cmV0dXJuIFppLmlzVHJ1ZShlPD0xLCJmb3VuZCB0d28gc2hlbGxzIGluIE1pbmltYWxFZGdlUmluZyBsaXN0Iiksbn0sJHMucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5hZGQodC5nZXRFZGdlRW5kcygpLHQuZ2V0Tm9kZXMoKSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO1FzLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzKGFyZ3VtZW50c1sxXSk7dmFyIG49dGhpcy5idWlsZE1heGltYWxFZGdlUmluZ3MoZSkscj1uZXcgeG8saT10aGlzLmJ1aWxkTWluaW1hbEVkZ2VSaW5ncyhuLHRoaXMuX3NoZWxsTGlzdCxyKTt0aGlzLnNvcnRTaGVsbHNBbmRIb2xlcyhpLHRoaXMuX3NoZWxsTGlzdCxyKSx0aGlzLnBsYWNlRnJlZUhvbGVzKHRoaXMuX3NoZWxsTGlzdCxyKX19LCRzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSwkcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gJHN9O3ZhciB0YT1mdW5jdGlvbigpe307dGEucHJvdG90eXBlLmdldEJvdW5kcz1mdW5jdGlvbigpe30sdGEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHRhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB0YX07dmFyIGVhPWZ1bmN0aW9uKCl7dGhpcy5fYm91bmRzPW51bGwsdGhpcy5faXRlbT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9ib3VuZHM9dCx0aGlzLl9pdGVtPWV9O2VhLnByb3RvdHlwZS5nZXRJdGVtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2l0ZW19LGVhLnByb3RvdHlwZS5nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm91bmRzfSxlYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdGEsbWldfSxlYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZWF9O3ZhciBuYT1mdW5jdGlvbigpe3RoaXMuX3NpemU9bnVsbCx0aGlzLl9pdGVtcz1udWxsLHRoaXMuX3NpemU9MCx0aGlzLl9pdGVtcz1uZXcgeG8sdGhpcy5faXRlbXMuYWRkKG51bGwpfTtuYS5wcm90b3R5cGUucG9sbD1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBudWxsO3ZhciB0PXRoaXMuX2l0ZW1zLmdldCgxKTtyZXR1cm4gdGhpcy5faXRlbXMuc2V0KDEsdGhpcy5faXRlbXMuZ2V0KHRoaXMuX3NpemUpKSx0aGlzLl9zaXplLT0xLHRoaXMucmVvcmRlcigxKSx0fSxuYS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaXplfSxuYS5wcm90b3R5cGUucmVvcmRlcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPW51bGwscj10aGlzLl9pdGVtcy5nZXQodCk7Mip0PD10aGlzLl9zaXplJiYoKG49Mip0KSE9PWUuX3NpemUmJmUuX2l0ZW1zLmdldChuKzEpLmNvbXBhcmVUbyhlLl9pdGVtcy5nZXQobikpPDAmJm4rKyxlLl9pdGVtcy5nZXQobikuY29tcGFyZVRvKHIpPDApO3Q9billLl9pdGVtcy5zZXQodCxlLl9pdGVtcy5nZXQobikpO3RoaXMuX2l0ZW1zLnNldCh0LHIpfSxuYS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9zaXplPTAsdGhpcy5faXRlbXMuY2xlYXIoKX0sbmEucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuX3NpemV9LG5hLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5faXRlbXMuYWRkKG51bGwpLHRoaXMuX3NpemUrPTE7dmFyIGU9dGhpcy5fc2l6ZTtmb3IodGhpcy5faXRlbXMuc2V0KDAsdCk7dC5jb21wYXJlVG8odGhpcy5faXRlbXMuZ2V0KE1hdGgudHJ1bmMoZS8yKSkpPDA7ZS89Mil0aGlzLl9pdGVtcy5zZXQoZSx0aGlzLl9pdGVtcy5nZXQoTWF0aC50cnVuYyhlLzIpKSk7dGhpcy5faXRlbXMuc2V0KGUsdCl9LG5hLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxuYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbmF9O3ZhciByYT1mdW5jdGlvbigpe307cmEucHJvdG90eXBlLnZpc2l0SXRlbT1mdW5jdGlvbih0KXt9LHJhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxyYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcmF9O3ZhciBpYT1mdW5jdGlvbigpe307aWEucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUpe30saWEucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0LGUpe30saWEucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKCl7fSxpYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0saWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGlhfTt2YXIgb2E9ZnVuY3Rpb24oKXtpZih0aGlzLl9jaGlsZEJvdW5kYWJsZXM9bmV3IHhvLHRoaXMuX2JvdW5kcz1udWxsLHRoaXMuX2xldmVsPW51bGwsMCE9PWFyZ3VtZW50cy5sZW5ndGgmJjE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbGV2ZWw9dH19LHNhPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtvYS5wcm90b3R5cGUuZ2V0TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGV2ZWx9LG9hLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQm91bmRhYmxlcy5zaXplKCl9LG9hLnByb3RvdHlwZS5nZXRDaGlsZEJvdW5kYWJsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hpbGRCb3VuZGFibGVzfSxvYS5wcm90b3R5cGUuYWRkQ2hpbGRCb3VuZGFibGU9ZnVuY3Rpb24odCl7WmkuaXNUcnVlKG51bGw9PT10aGlzLl9ib3VuZHMpLHRoaXMuX2NoaWxkQm91bmRhYmxlcy5hZGQodCl9LG9hLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQm91bmRhYmxlcy5pc0VtcHR5KCl9LG9hLnByb3RvdHlwZS5nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuX2JvdW5kcyYmKHRoaXMuX2JvdW5kcz10aGlzLmNvbXB1dGVCb3VuZHMoKSksdGhpcy5fYm91bmRzfSxvYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdGEsbWldfSxvYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gb2F9LHNhLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NWExZTU1ZWM0MTM2OTgwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2Esc2EpO3ZhciBhYT1mdW5jdGlvbigpe307YWEucmV2ZXJzZU9yZGVyPWZ1bmN0aW9uKCl7cmV0dXJue2NvbXBhcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5jb21wYXJlVG8odCl9fX0sYWEubWluPWZ1bmN0aW9uKHQpe3JldHVybiBhYS5zb3J0KHQpLHQuZ2V0KDApfSxhYS5zb3J0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC50b0FycmF5KCk7ZT9Wby5zb3J0KG4sZSk6Vm8uc29ydChuKTtmb3IodmFyIHI9dC5pdGVyYXRvcigpLGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspci5uZXh0KCksci5zZXQobltpXSl9LGFhLnNpbmdsZXRvbkxpc3Q9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHhvO3JldHVybiBlLmFkZCh0KSxlfTt2YXIgdWE9ZnVuY3Rpb24oKXt0aGlzLl9ib3VuZGFibGUxPW51bGwsdGhpcy5fYm91bmRhYmxlMj1udWxsLHRoaXMuX2Rpc3RhbmNlPW51bGwsdGhpcy5faXRlbURpc3RhbmNlPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX2JvdW5kYWJsZTE9dCx0aGlzLl9ib3VuZGFibGUyPWUsdGhpcy5faXRlbURpc3RhbmNlPW4sdGhpcy5fZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSgpfTt1YS5wcm90b3R5cGUuZXhwYW5kVG9RdWV1ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXVhLmlzQ29tcG9zaXRlKHRoaXMuX2JvdW5kYWJsZTEpLHI9dWEuaXNDb21wb3NpdGUodGhpcy5fYm91bmRhYmxlMik7aWYobiYmcilyZXR1cm4gdWEuYXJlYSh0aGlzLl9ib3VuZGFibGUxKT51YS5hcmVhKHRoaXMuX2JvdW5kYWJsZTIpPyh0aGlzLmV4cGFuZCh0aGlzLl9ib3VuZGFibGUxLHRoaXMuX2JvdW5kYWJsZTIsdCxlKSxudWxsKToodGhpcy5leHBhbmQodGhpcy5fYm91bmRhYmxlMix0aGlzLl9ib3VuZGFibGUxLHQsZSksbnVsbCk7aWYobilyZXR1cm4gdGhpcy5leHBhbmQodGhpcy5fYm91bmRhYmxlMSx0aGlzLl9ib3VuZGFibGUyLHQsZSksbnVsbDtpZihyKXJldHVybiB0aGlzLmV4cGFuZCh0aGlzLl9ib3VuZGFibGUyLHRoaXMuX2JvdW5kYWJsZTEsdCxlKSxudWxsO3Rocm93IG5ldyBoaX0sdWEucHJvdG90eXBlLmlzTGVhdmVzPWZ1bmN0aW9uKCl7cmV0dXJuISh1YS5pc0NvbXBvc2l0ZSh0aGlzLl9ib3VuZGFibGUxKXx8dWEuaXNDb21wb3NpdGUodGhpcy5fYm91bmRhYmxlMikpfSx1YS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlPGUuX2Rpc3RhbmNlPy0xOnRoaXMuX2Rpc3RhbmNlPmUuX2Rpc3RhbmNlPzE6MH0sdWEucHJvdG90eXBlLmV4cGFuZD1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9dC5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCkscz1uZXcgdWEobyxlLHRoaXMuX2l0ZW1EaXN0YW5jZSk7cy5nZXREaXN0YW5jZSgpPHImJm4uYWRkKHMpfX0sdWEucHJvdG90eXBlLmdldEJvdW5kYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXQ/dGhpcy5fYm91bmRhYmxlMTp0aGlzLl9ib3VuZGFibGUyfSx1YS5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2V9LHVhLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTGVhdmVzKCk/dGhpcy5faXRlbURpc3RhbmNlLmRpc3RhbmNlKHRoaXMuX2JvdW5kYWJsZTEsdGhpcy5fYm91bmRhYmxlMik6dGhpcy5fYm91bmRhYmxlMS5nZXRCb3VuZHMoKS5kaXN0YW5jZSh0aGlzLl9ib3VuZGFibGUyLmdldEJvdW5kcygpKX0sdWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpXX0sdWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHVhfSx1YS5hcmVhPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEJvdW5kcygpLmdldEFyZWEoKX0sdWEuaXNDb21wb3NpdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBvYX07dmFyIGNhPWZ1bmN0aW9uIHQoKXtpZih0aGlzLl9yb290PW51bGwsdGhpcy5fYnVpbHQ9ITEsdGhpcy5faXRlbUJvdW5kYWJsZXM9bmV3IHhvLHRoaXMuX25vZGVDYXBhY2l0eT1udWxsLDA9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT10LkRFRkFVTFRfTk9ERV9DQVBBQ0lUWTt0aGlzLl9ub2RlQ2FwYWNpdHk9ZX1lbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF07WmkuaXNUcnVlKG4+MSwiTm9kZSBjYXBhY2l0eSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxIiksdGhpcy5fbm9kZUNhcGFjaXR5PW59fSxsYT17SW50ZXJzZWN0c09wOntjb25maWd1cmFibGU6ITB9LHNlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0sREVGQVVMVF9OT0RFX0NBUEFDSVRZOntjb25maWd1cmFibGU6ITB9fTtjYS5wcm90b3R5cGUuZ2V0Tm9kZUNhcGFjaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVDYXBhY2l0eX0sY2EucHJvdG90eXBlLmxhc3ROb2RlPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldCh0LnNpemUoKS0xKX0sY2EucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5pc0VtcHR5KCk/MDoodGhpcy5idWlsZCgpLHRoaXMuc2l6ZSh0aGlzLl9yb290KSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD0wLGU9YXJndW1lbnRzWzBdLmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtuIGluc3RhbmNlb2Ygb2E/dCs9dGhpcy5zaXplKG4pOm4gaW5zdGFuY2VvZiBlYSYmKHQrPTEpfXJldHVybiB0fX0sY2EucHJvdG90eXBlLnJlbW92ZUl0ZW09ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bnVsbCxyPXQuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO2kgaW5zdGFuY2VvZiBlYSYmaS5nZXRJdGVtKCk9PT1lJiYobj1pKX1yZXR1cm4gbnVsbCE9PW4mJih0LmdldENoaWxkQm91bmRhYmxlcygpLnJlbW92ZShuKSwhMCl9LGNhLnByb3RvdHlwZS5pdGVtc1RyZWU9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7dGhpcy5idWlsZCgpO3ZhciB0PXRoaXMuaXRlbXNUcmVlKHRoaXMuX3Jvb3QpO3JldHVybiBudWxsPT09dD9uZXcgeG86dH1pZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPW5ldyB4byxyPWUuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO2lmKGkgaW5zdGFuY2VvZiBvYSl7dmFyIG89dGhpcy5pdGVtc1RyZWUoaSk7bnVsbCE9PW8mJm4uYWRkKG8pfWVsc2UgaSBpbnN0YW5jZW9mIGVhP24uYWRkKGkuZ2V0SXRlbSgpKTpaaS5zaG91bGROZXZlclJlYWNoSGVyZSgpfXJldHVybiBuLnNpemUoKTw9MD9udWxsOm59fSxjYS5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7WmkuaXNUcnVlKCF0aGlzLl9idWlsdCwiQ2Fubm90IGluc2VydCBpdGVtcyBpbnRvIGFuIFNUUiBwYWNrZWQgUi10cmVlIGFmdGVyIGl0IGhhcyBiZWVuIGJ1aWx0LiIpLHRoaXMuX2l0ZW1Cb3VuZGFibGVzLmFkZChuZXcgZWEodCxlKSl9LGNhLnByb3RvdHlwZS5ib3VuZGFibGVzQXRMZXZlbD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgeG87cmV0dXJuIHRoaXMuYm91bmRhYmxlc0F0TGV2ZWwodCx0aGlzLl9yb290LGUpLGV9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXTtpZihaaS5pc1RydWUobj4tMiksci5nZXRMZXZlbCgpPT09bilyZXR1cm4gaS5hZGQociksbnVsbDtmb3IodmFyIG89ci5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCk7cyBpbnN0YW5jZW9mIG9hP3RoaXMuYm91bmRhYmxlc0F0TGV2ZWwobixzLGkpOihaaS5pc1RydWUocyBpbnN0YW5jZW9mIGVhKSwtMT09PW4mJmkuYWRkKHMpKX1yZXR1cm4gbnVsbH19LGNhLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmJ1aWxkKCk7dmFyIG49bmV3IHhvO3JldHVybiB0aGlzLmlzRW1wdHkoKXx8dGhpcy5nZXRJbnRlcnNlY3RzT3AoKS5pbnRlcnNlY3RzKHRoaXMuX3Jvb3QuZ2V0Qm91bmRzKCksZSkmJnRoaXMucXVlcnkoZSx0aGlzLl9yb290LG4pLG59aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTtpZih0aGlzLmJ1aWxkKCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dGhpcy5nZXRJbnRlcnNlY3RzT3AoKS5pbnRlcnNlY3RzKHRoaXMuX3Jvb3QuZ2V0Qm91bmRzKCkscikmJnRoaXMucXVlcnkocix0aGlzLl9yb290LGkpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoRWkoYXJndW1lbnRzWzJdLHJhKSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPYmplY3QmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygb2EpZm9yKHZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1sxXS5nZXRDaGlsZEJvdW5kYWJsZXMoKSx1PTA7dTxhLnNpemUoKTt1Kyspe3ZhciBjPWEuZ2V0KHUpOyF0LmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHMoYy5nZXRCb3VuZHMoKSxvKXx8KGMgaW5zdGFuY2VvZiBvYT90LnF1ZXJ5KG8sYyxzKTpjIGluc3RhbmNlb2YgZWE/cy52aXNpdEl0ZW0oYy5nZXRJdGVtKCkpOlppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCkpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzJdLHZvKSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPYmplY3QmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygb2EpZm9yKHZhciBsPWFyZ3VtZW50c1swXSxoPWFyZ3VtZW50c1syXSxmPWFyZ3VtZW50c1sxXS5nZXRDaGlsZEJvdW5kYWJsZXMoKSxwPTA7cDxmLnNpemUoKTtwKyspe3ZhciBkPWYuZ2V0KHApOyF0LmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHMoZC5nZXRCb3VuZHMoKSxsKXx8KGQgaW5zdGFuY2VvZiBvYT90LnF1ZXJ5KGwsZCxoKTpkIGluc3RhbmNlb2YgZWE/aC5hZGQoZC5nZXRJdGVtKCkpOlppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCkpfX0sY2EucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKCl7aWYodGhpcy5fYnVpbHQpcmV0dXJuIG51bGw7dGhpcy5fcm9vdD10aGlzLl9pdGVtQm91bmRhYmxlcy5pc0VtcHR5KCk/dGhpcy5jcmVhdGVOb2RlKDApOnRoaXMuY3JlYXRlSGlnaGVyTGV2ZWxzKHRoaXMuX2l0ZW1Cb3VuZGFibGVzLC0xKSx0aGlzLl9pdGVtQm91bmRhYmxlcz1udWxsLHRoaXMuX2J1aWx0PSEwfSxjYS5wcm90b3R5cGUuZ2V0Um9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1aWxkKCksdGhpcy5fcm9vdH0sY2EucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuYnVpbGQoKSwhIXRoaXMuZ2V0SW50ZXJzZWN0c09wKCkuaW50ZXJzZWN0cyh0aGlzLl9yb290LmdldEJvdW5kcygpLHQpJiZ0aGlzLnJlbW92ZSh0LHRoaXMuX3Jvb3QsZSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXSxvPXRoaXMucmVtb3ZlSXRlbShyLGkpO2lmKG8pcmV0dXJuITA7Zm9yKHZhciBzPW51bGwsYT1yLmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7YS5oYXNOZXh0KCk7KXt2YXIgdT1hLm5leHQoKTtpZih0aGlzLmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHModS5nZXRCb3VuZHMoKSxuKSYmdSBpbnN0YW5jZW9mIG9hJiYobz10aGlzLnJlbW92ZShuLHUsaSkpKXtzPXU7YnJlYWt9fXJldHVybiBudWxsIT09cyYmcy5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pc0VtcHR5KCkmJnIuZ2V0Q2hpbGRCb3VuZGFibGVzKCkucmVtb3ZlKHMpLG99fSxjYS5wcm90b3R5cGUuY3JlYXRlSGlnaGVyTGV2ZWxzPWZ1bmN0aW9uKHQsZSl7WmkuaXNUcnVlKCF0LmlzRW1wdHkoKSk7dmFyIG49dGhpcy5jcmVhdGVQYXJlbnRCb3VuZGFibGVzKHQsZSsxKTtyZXR1cm4gMT09PW4uc2l6ZSgpP24uZ2V0KDApOnRoaXMuY3JlYXRlSGlnaGVyTGV2ZWxzKG4sZSsxKX0sY2EucHJvdG90eXBlLmRlcHRoPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuaXNFbXB0eSgpPzA6KHRoaXMuYnVpbGQoKSx0aGlzLmRlcHRoKHRoaXMuX3Jvb3QpKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciB0PTAsZT1hcmd1bWVudHNbMF0uZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO2lmKG4gaW5zdGFuY2VvZiBvYSl7dmFyIHI9dGhpcy5kZXB0aChuKTtyPnQmJih0PXIpfX1yZXR1cm4gdCsxfX0sY2EucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO1ppLmlzVHJ1ZSghdC5pc0VtcHR5KCkpO3ZhciByPW5ldyB4bztyLmFkZCh0aGlzLmNyZWF0ZU5vZGUoZSkpO3ZhciBpPW5ldyB4byh0KTthYS5zb3J0KGksdGhpcy5nZXRDb21wYXJhdG9yKCkpO2Zvcih2YXIgbz1pLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKTtuLmxhc3ROb2RlKHIpLmdldENoaWxkQm91bmRhYmxlcygpLnNpemUoKT09PW4uZ2V0Tm9kZUNhcGFjaXR5KCkmJnIuYWRkKG4uY3JlYXRlTm9kZShlKSksbi5sYXN0Tm9kZShyKS5hZGRDaGlsZEJvdW5kYWJsZShzKX1yZXR1cm4gcn0sY2EucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYnVpbHQ/dGhpcy5fcm9vdC5pc0VtcHR5KCk6dGhpcy5faXRlbUJvdW5kYWJsZXMuaXNFbXB0eSgpfSxjYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbWldfSxjYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gY2F9LGNhLmNvbXBhcmVEb3VibGVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+ZT8xOnQ8ZT8tMTowfSxsYS5JbnRlcnNlY3RzT3AuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGhhfSxsYS5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDM1ZWY2NGM4MmQ0YzU0MDB9LGxhLkRFRkFVTFRfTk9ERV9DQVBBQ0lUWS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNhLGxhKTt2YXIgaGE9ZnVuY3Rpb24oKXt9LGZhPWZ1bmN0aW9uKCl7fTtmYS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXt9LGZhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxmYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZmF9O3ZhciBwYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe249bnx8ZS5ERUZBVUxUX05PREVfQ0FQQUNJVFksdC5jYWxsKHRoaXMsbil9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e1NUUnRyZWVOb2RlOntjb25maWd1cmFibGU6ITB9LHNlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0seENvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0seUNvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0saW50ZXJzZWN0c09wOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfTk9ERV9DQVBBQ0lUWTp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXNGcm9tVmVydGljYWxTbGljZXM9ZnVuY3Rpb24odCxlKXtaaS5pc1RydWUodC5sZW5ndGg+MCk7Zm9yKHZhciBuPW5ldyB4byxyPTA7cjx0Lmxlbmd0aDtyKyspbi5hZGRBbGwodGhpcy5jcmVhdGVQYXJlbnRCb3VuZGFibGVzRnJvbVZlcnRpY2FsU2xpY2UodFtyXSxlKSk7cmV0dXJuIG59LGUucHJvdG90eXBlLmNyZWF0ZU5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBkYSh0KX0sZS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90LnByb3RvdHlwZS5zaXplLmNhbGwodGhpcyk6dC5wcm90b3R5cGUuc2l6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbigpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5pbnNlcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZihlLmlzTnVsbCgpKXJldHVybiBudWxsO3QucHJvdG90eXBlLmluc2VydC5jYWxsKHRoaXMsZSxuKX0sZS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0c09wPWZ1bmN0aW9uKCl7cmV0dXJuIGUuaW50ZXJzZWN0c09wfSxlLnByb3RvdHlwZS52ZXJ0aWNhbFNsaWNlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1NYXRoLnRydW5jKE1hdGguY2VpbCh0LnNpemUoKS9lKSkscj1uZXcgQXJyYXkoZSkuZmlsbChudWxsKSxpPXQuaXRlcmF0b3IoKSxvPTA7bzxlO28rKyl7cltvXT1uZXcgeG87Zm9yKHZhciBzPTA7aS5oYXNOZXh0KCkmJnM8bjspe3ZhciBhPWkubmV4dCgpO3Jbb10uYWRkKGEpLHMrK319cmV0dXJuIHJ9LGUucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdC5wcm90b3R5cGUucXVlcnkuY2FsbCh0aGlzLGUpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dC5wcm90b3R5cGUucXVlcnkuY2FsbCh0aGlzLG4scil9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihFaShhcmd1bWVudHNbMl0scmEpJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBvYSl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdO3QucHJvdG90eXBlLnF1ZXJ5LmNhbGwodGhpcyxpLG8scyl9ZWxzZSBpZihFaShhcmd1bWVudHNbMl0sdm8pJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBvYSl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGM9YXJndW1lbnRzWzJdO3QucHJvdG90eXBlLnF1ZXJ5LmNhbGwodGhpcyxhLHUsYyl9fSxlLnByb3RvdHlwZS5nZXRDb21wYXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIGUueUNvbXBhcmF0b3J9LGUucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXNGcm9tVmVydGljYWxTbGljZT1mdW5jdGlvbihlLG4pe3JldHVybiB0LnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzLmNhbGwodGhpcyxlLG4pfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiB0LnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQucHJvdG90eXBlLnJlbW92ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmRlcHRoPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3QucHJvdG90eXBlLmRlcHRoLmNhbGwodGhpcyk6dC5wcm90b3R5cGUuZGVwdGguYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzPWZ1bmN0aW9uKHQsbil7WmkuaXNUcnVlKCF0LmlzRW1wdHkoKSk7dmFyIHI9TWF0aC50cnVuYyhNYXRoLmNlaWwodC5zaXplKCkvdGhpcy5nZXROb2RlQ2FwYWNpdHkoKSkpLGk9bmV3IHhvKHQpO2FhLnNvcnQoaSxlLnhDb21wYXJhdG9yKTt2YXIgbz10aGlzLnZlcnRpY2FsU2xpY2VzKGksTWF0aC50cnVuYyhNYXRoLmNlaWwoTWF0aC5zcXJ0KHIpKSkpO3JldHVybiB0aGlzLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXNGcm9tVmVydGljYWxTbGljZXMobyxuKX0sZS5wcm90b3R5cGUubmVhcmVzdE5laWdoYm91cj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihFaShhcmd1bWVudHNbMF0sZmEpKXt2YXIgdD1hcmd1bWVudHNbMF0sbj1uZXcgdWEodGhpcy5nZXRSb290KCksdGhpcy5nZXRSb290KCksdCk7cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihuKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVhKXt2YXIgcj1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihyLGZpLlBPU0lUSVZFX0lORklOSVRZKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBlJiZFaShhcmd1bWVudHNbMV0sZmEpKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1uZXcgdWEodGhpcy5nZXRSb290KCksaS5nZXRSb290KCksbyk7cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihzKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVhJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGM9bnVsbCxsPW5ldyBuYTtmb3IobC5hZGQoYSk7IWwuaXNFbXB0eSgpJiZ1PjA7KXt2YXIgaD1sLnBvbGwoKSxmPWguZ2V0RGlzdGFuY2UoKTtpZihmPj11KWJyZWFrO2guaXNMZWF2ZXMoKT8odT1mLGM9aCk6aC5leHBhbmRUb1F1ZXVlKGwsdSl9cmV0dXJuW2MuZ2V0Qm91bmRhYmxlKDApLmdldEl0ZW0oKSxjLmdldEJvdW5kYWJsZSgxKS5nZXRJdGVtKCldfX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcD1hcmd1bWVudHNbMl0sZD1uZXcgZWEoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSksZz1uZXcgdWEodGhpcy5nZXRSb290KCksZCxwKTtyZXR1cm4gdGhpcy5uZWFyZXN0TmVpZ2hib3VyKGcpWzBdfX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5baWEsbWldfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLmNlbnRyZVg9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYXZnKHQuZ2V0TWluWCgpLHQuZ2V0TWF4WCgpKX0sZS5hdmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4odCtlKS8yfSxlLmNlbnRyZVk9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYXZnKHQuZ2V0TWluWSgpLHQuZ2V0TWF4WSgpKX0sbi5TVFJ0cmVlTm9kZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZGF9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHgzOTkyMGY3ZDVmMjYxZTB9LG4ueENvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJue2ludGVyZmFjZXNfOmZ1bmN0aW9uKCl7cmV0dXJuW3lpXX0sY29tcGFyZTpmdW5jdGlvbihuLHIpe3JldHVybiB0LmNvbXBhcmVEb3VibGVzKGUuY2VudHJlWChuLmdldEJvdW5kcygpKSxlLmNlbnRyZVgoci5nZXRCb3VuZHMoKSkpfX19LG4ueUNvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJue2ludGVyZmFjZXNfOmZ1bmN0aW9uKCl7cmV0dXJuW3lpXX0sY29tcGFyZTpmdW5jdGlvbihuLHIpe3JldHVybiB0LmNvbXBhcmVEb3VibGVzKGUuY2VudHJlWShuLmdldEJvdW5kcygpKSxlLmNlbnRyZVkoci5nZXRCb3VuZHMoKSkpfX19LG4uaW50ZXJzZWN0c09wLmdldD1mdW5jdGlvbigpe3JldHVybntpbnRlcmZhY2VzXzpmdW5jdGlvbigpe3JldHVyblt0LkludGVyc2VjdHNPcF19LGludGVyc2VjdHM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5pbnRlcnNlY3RzKGUpfX19LG4uREVGQVVMVF9OT0RFX0NBUEFDSVRZLmdldD1mdW5jdGlvbigpe3JldHVybiAxMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShjYSksZGE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50c1swXTt0LmNhbGwodGhpcyxlKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY29tcHV0ZUJvdW5kcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1udWxsLGU9dGhpcy5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7bnVsbD09PXQ/dD1uZXcgamkobi5nZXRCb3VuZHMoKSk6dC5leHBhbmRUb0luY2x1ZGUobi5nZXRCb3VuZHMoKSl9cmV0dXJuIHR9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KG9hKSxnYT1mdW5jdGlvbigpe307Z2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGdhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBnYX0sZ2EucmVsYXRpdmVTaWduPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTowfSxnYS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxuKXtpZihlLmVxdWFsczJEKG4pKXJldHVybiAwO3ZhciByPWdhLnJlbGF0aXZlU2lnbihlLngsbi54KSxpPWdhLnJlbGF0aXZlU2lnbihlLnksbi55KTtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiBnYS5jb21wYXJlVmFsdWUocixpKTtjYXNlIDE6cmV0dXJuIGdhLmNvbXBhcmVWYWx1ZShpLHIpO2Nhc2UgMjpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKGksLXIpO2Nhc2UgMzpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKC1yLGkpO2Nhc2UgNDpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKC1yLC1pKTtjYXNlIDU6cmV0dXJuIGdhLmNvbXBhcmVWYWx1ZSgtaSwtcik7Y2FzZSA2OnJldHVybiBnYS5jb21wYXJlVmFsdWUoLWkscik7Y2FzZSA3OnJldHVybiBnYS5jb21wYXJlVmFsdWUociwtaSl9cmV0dXJuIFppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJpbnZhbGlkIG9jdGFudCB2YWx1ZSIpLDB9LGdhLmNvbXBhcmVWYWx1ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0PDA/LTE6dD4wPzE6ZTwwPy0xOmU+MD8xOjB9O3ZhciB5YT1mdW5jdGlvbigpe3RoaXMuX3NlZ1N0cmluZz1udWxsLHRoaXMuY29vcmQ9bnVsbCx0aGlzLnNlZ21lbnRJbmRleD1udWxsLHRoaXMuX3NlZ21lbnRPY3RhbnQ9bnVsbCx0aGlzLl9pc0ludGVyaW9yPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9YXJndW1lbnRzWzNdO3RoaXMuX3NlZ1N0cmluZz10LHRoaXMuY29vcmQ9bmV3IHZpKGUpLHRoaXMuc2VnbWVudEluZGV4PW4sdGhpcy5fc2VnbWVudE9jdGFudD1yLHRoaXMuX2lzSW50ZXJpb3I9IWUuZXF1YWxzMkQodC5nZXRDb29yZGluYXRlKG4pKX07eWEucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb29yZH0seWEucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnQodGhpcy5jb29yZCksdC5wcmludCgiIHNlZyAjID0gIit0aGlzLnNlZ21lbnRJbmRleCl9LHlhLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5zZWdtZW50SW5kZXg8ZS5zZWdtZW50SW5kZXg/LTE6dGhpcy5zZWdtZW50SW5kZXg+ZS5zZWdtZW50SW5kZXg/MTp0aGlzLmNvb3JkLmVxdWFsczJEKGUuY29vcmQpPzA6Z2EuY29tcGFyZSh0aGlzLl9zZWdtZW50T2N0YW50LHRoaXMuY29vcmQsZS5jb29yZCl9LHlhLnByb3RvdHlwZS5pc0VuZFBvaW50PWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy5zZWdtZW50SW5kZXgmJiF0aGlzLl9pc0ludGVyaW9yfHx0aGlzLnNlZ21lbnRJbmRleD09PXR9LHlhLnByb3RvdHlwZS5pc0ludGVyaW9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSW50ZXJpb3J9LHlhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LHlhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB5YX07dmFyIG1hPWZ1bmN0aW9uKCl7dGhpcy5fbm9kZU1hcD1uZXcga28sdGhpcy5fZWRnZT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9lZGdlPXR9O21hLnByb3RvdHlwZS5nZXRTcGxpdENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGJvO3RoaXMuYWRkRW5kcG9pbnRzKCk7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKSxuPWUubmV4dCgpO2UuaGFzTmV4dCgpOyl7dmFyIHI9ZS5uZXh0KCk7dGhpcy5hZGRFZGdlQ29vcmRpbmF0ZXMobixyLHQpLG49cn1yZXR1cm4gdC50b0Nvb3JkaW5hdGVBcnJheSgpfSxtYS5wcm90b3R5cGUuYWRkQ29sbGFwc2VkTm9kZXM9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgeG87dGhpcy5maW5kQ29sbGFwc2VzRnJvbUluc2VydGVkTm9kZXModCksdGhpcy5maW5kQ29sbGFwc2VzRnJvbUV4aXN0aW5nVmVydGljZXModCk7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLmludFZhbHVlKCk7dGhpcy5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKG4pLG4pfX0sbWEucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnRsbigiSW50ZXJzZWN0aW9uczoiKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkucHJpbnQodCl9fSxtYS5wcm90b3R5cGUuZmluZENvbGxhcHNlc0Zyb21FeGlzdGluZ1ZlcnRpY2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fZWRnZS5zaXplKCktMjtlKyspe3ZhciBuPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlKSxyPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlKzIpO24uZXF1YWxzMkQocikmJnQuYWRkKG5ldyBOaShlKzEpKX19LG1hLnByb3RvdHlwZS5hZGRFZGdlQ29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlLnNlZ21lbnRJbmRleCksaT1lLmlzSW50ZXJpb3IoKXx8IWUuY29vcmQuZXF1YWxzMkQocik7bi5hZGQobmV3IHZpKHQuY29vcmQpLCExKTtmb3IodmFyIG89dC5zZWdtZW50SW5kZXgrMTtvPD1lLnNlZ21lbnRJbmRleDtvKyspbi5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKG8pKTtpJiZuLmFkZChuZXcgdmkoZS5jb29yZCkpfSxtYS5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpfSxtYS5wcm90b3R5cGUuYWRkU3BsaXRFZGdlcz1mdW5jdGlvbih0KXt0aGlzLmFkZEVuZHBvaW50cygpLHRoaXMuYWRkQ29sbGFwc2VkTm9kZXMoKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpLG49ZS5uZXh0KCk7ZS5oYXNOZXh0KCk7KXt2YXIgcj1lLm5leHQoKSxpPXRoaXMuY3JlYXRlU3BsaXRFZGdlKG4scik7dC5hZGQoaSksbj1yfX0sbWEucHJvdG90eXBlLmZpbmRDb2xsYXBzZUluZGV4PWZ1bmN0aW9uKHQsZSxuKXtpZighdC5jb29yZC5lcXVhbHMyRChlLmNvb3JkKSlyZXR1cm4hMTt2YXIgcj1lLnNlZ21lbnRJbmRleC10LnNlZ21lbnRJbmRleDtyZXR1cm4gZS5pc0ludGVyaW9yKCl8fHItLSwxPT09ciYmKG5bMF09dC5zZWdtZW50SW5kZXgrMSwhMCl9LG1hLnByb3RvdHlwZS5maW5kQ29sbGFwc2VzRnJvbUluc2VydGVkTm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSgxKS5maWxsKG51bGwpLG49dGhpcy5pdGVyYXRvcigpLHI9bi5uZXh0KCk7bi5oYXNOZXh0KCk7KXt2YXIgaT1uLm5leHQoKTt0aGlzLmZpbmRDb2xsYXBzZUluZGV4KHIsaSxlKSYmdC5hZGQobmV3IE5pKGVbMF0pKSxyPWl9fSxtYS5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlfSxtYS5wcm90b3R5cGUuYWRkRW5kcG9pbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWRnZS5zaXplKCktMTt0aGlzLmFkZCh0aGlzLl9lZGdlLmdldENvb3JkaW5hdGUoMCksMCksdGhpcy5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKHQpLHQpfSxtYS5wcm90b3R5cGUuY3JlYXRlU3BsaXRFZGdlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5zZWdtZW50SW5kZXgtdC5zZWdtZW50SW5kZXgrMixyPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlLnNlZ21lbnRJbmRleCksaT1lLmlzSW50ZXJpb3IoKXx8IWUuY29vcmQuZXF1YWxzMkQocik7aXx8bi0tO3ZhciBvPW5ldyBBcnJheShuKS5maWxsKG51bGwpLHM9MDtvW3MrK109bmV3IHZpKHQuY29vcmQpO2Zvcih2YXIgYT10LnNlZ21lbnRJbmRleCsxO2E8PWUuc2VnbWVudEluZGV4O2ErKylvW3MrK109dGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKGEpO3JldHVybiBpJiYob1tzXT1uZXcgdmkoZS5jb29yZCkpLG5ldyB3YShvLHRoaXMuX2VkZ2UuZ2V0RGF0YSgpKX0sbWEucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyB5YSh0aGlzLl9lZGdlLHQsZSx0aGlzLl9lZGdlLmdldFNlZ21lbnRPY3RhbnQoZSkpLHI9dGhpcy5fbm9kZU1hcC5nZXQobik7cmV0dXJuIG51bGwhPT1yPyhaaS5pc1RydWUoci5jb29yZC5lcXVhbHMyRCh0KSwiRm91bmQgZXF1YWwgbm9kZXMgd2l0aCBkaWZmZXJlbnQgY29vcmRpbmF0ZXMiKSxyKToodGhpcy5fbm9kZU1hcC5wdXQobixuKSxuKX0sbWEucHJvdG90eXBlLmNoZWNrU3BsaXRFZGdlc0NvcnJlY3RuZXNzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZXMoKSxuPXQuZ2V0KDApLmdldENvb3JkaW5hdGUoMCk7aWYoIW4uZXF1YWxzMkQoZVswXSkpdGhyb3cgbmV3IFdpKCJiYWQgc3BsaXQgZWRnZSBzdGFydCBwb2ludCBhdCAiK24pO3ZhciByPXQuZ2V0KHQuc2l6ZSgpLTEpLmdldENvb3JkaW5hdGVzKCksaT1yW3IubGVuZ3RoLTFdO2lmKCFpLmVxdWFsczJEKGVbZS5sZW5ndGgtMV0pKXRocm93IG5ldyBXaSgiYmFkIHNwbGl0IGVkZ2UgZW5kIHBvaW50IGF0ICIraSl9LG1hLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxtYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbWF9O3ZhciB2YT1mdW5jdGlvbigpe307dmEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHZhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB2YX0sdmEub2N0YW50PWZ1bmN0aW9uKCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07aWYoMD09PXQmJjA9PT1lKXRocm93IG5ldyBoaTt2YXIgbj1NYXRoLmFicyh0KSxyPU1hdGguYWJzKGUpO3JldHVybiB0Pj0wP2U+PTA/bj49cj8wOjE6bj49cj83OjY6ZT49MD9uPj1yPzM6MjpuPj1yPzQ6NX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1vLngtaS54LGE9by55LWkueTtpZigwPT09cyYmMD09PWEpdGhyb3cgbmV3IGhpO3JldHVybiB2YS5vY3RhbnQocyxhKX19O3ZhciBfYT1mdW5jdGlvbigpe307X2EucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7fSxfYS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe30sX2EucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7fSxfYS5wcm90b3R5cGUuaXNDbG9zZWQ9ZnVuY3Rpb24oKXt9LF9hLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe30sX2EucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXt9LF9hLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxfYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gX2F9O3ZhciB4YT1mdW5jdGlvbigpe307eGEucHJvdG90eXBlLmFkZEludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUpe30seGEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW19hXX0seGEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHhhfTt2YXIgd2E9ZnVuY3Rpb24oKXt0aGlzLl9ub2RlTGlzdD1uZXcgbWEodGhpcyksdGhpcy5fcHRzPW51bGwsdGhpcy5fZGF0YT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9wdHM9dCx0aGlzLl9kYXRhPWV9O3dhLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHN9LHdhLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0cy5sZW5ndGh9LHdhLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdHNbdF19LHdhLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHNbMF0uZXF1YWxzKHRoaXMuX3B0c1t0aGlzLl9wdHMubGVuZ3RoLTFdKX0sd2EucHJvdG90eXBlLmdldFNlZ21lbnRPY3RhbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT10aGlzLl9wdHMubGVuZ3RoLTE/LTE6dGhpcy5zYWZlT2N0YW50KHRoaXMuZ2V0Q29vcmRpbmF0ZSh0KSx0aGlzLmdldENvb3JkaW5hdGUodCsxKSl9LHdhLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX2RhdGE9dH0sd2EucHJvdG90eXBlLnNhZmVPY3RhbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5lcXVhbHMyRChlKT8wOnZhLm9jdGFudCh0LGUpfSx3YS5wcm90b3R5cGUuZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSx3YS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLmFkZEludGVyc2VjdGlvbk5vZGUodCxlKX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbM10saT1uZXcgdmkoYXJndW1lbnRzWzBdLmdldEludGVyc2VjdGlvbihyKSk7dGhpcy5hZGRJbnRlcnNlY3Rpb24oaSxuKX19LHdhLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBYaS50b0xpbmVTdHJpbmcobmV3IHhzKHRoaXMuX3B0cykpfSx3YS5wcm90b3R5cGUuZ2V0Tm9kZUxpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZUxpc3R9LHdhLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb25Ob2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZSxyPW4rMTtpZihyPHRoaXMuX3B0cy5sZW5ndGgpe3ZhciBpPXRoaXMuX3B0c1tyXTt0LmVxdWFsczJEKGkpJiYobj1yKX1yZXR1cm4gdGhpcy5fbm9kZUxpc3QuYWRkKHQsbil9LHdhLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MDtyPHQuZ2V0SW50ZXJzZWN0aW9uTnVtKCk7cisrKXRoaXMuYWRkSW50ZXJzZWN0aW9uKHQsZSxuLHIpfSx3YS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5beGFdfSx3YS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gd2F9LHdhLmdldE5vZGVkU3Vic3RyaW5ncz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgeG87cmV0dXJuIHdhLmdldE5vZGVkU3Vic3RyaW5ncyh0LGUpLGV9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7ci5uZXh0KCkuZ2V0Tm9kZUxpc3QoKS5hZGRTcGxpdEVkZ2VzKG4pfX07dmFyIGJhPWZ1bmN0aW9uKCl7aWYodGhpcy5wMD1udWxsLHRoaXMucDE9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLnAwPW5ldyB2aSx0aGlzLnAxPW5ldyB2aTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5wMD1uZXcgdmkodC5wMCksdGhpcy5wMT1uZXcgdmkodC5wMSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLnAwPWFyZ3VtZW50c1swXSx0aGlzLnAxPWFyZ3VtZW50c1sxXTtlbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl0saT1hcmd1bWVudHNbM107dGhpcy5wMD1uZXcgdmkoZSxuKSx0aGlzLnAxPW5ldyB2aShyLGkpfX0sRGE9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O2JhLnByb3RvdHlwZS5taW5YPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKHRoaXMucDAueCx0aGlzLnAxLngpfSxiYS5wcm90b3R5cGUub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgYmEpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWVvLm9yaWVudGF0aW9uSW5kZXgodGhpcy5wMCx0aGlzLnAxLHQucDApLG49ZW8ub3JpZW50YXRpb25JbmRleCh0aGlzLnAwLHRoaXMucDEsdC5wMSk7cmV0dXJuIGU+PTAmJm4+PTB8fGU8PTAmJm48PTA/TWF0aC5tYXgoZSxuKTowfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciByPWFyZ3VtZW50c1swXTtyZXR1cm4gZW8ub3JpZW50YXRpb25JbmRleCh0aGlzLnAwLHRoaXMucDEscil9fSxiYS5wcm90b3R5cGUudG9HZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdC5jcmVhdGVMaW5lU3RyaW5nKFt0aGlzLnAwLHRoaXMucDFdKX0sYmEucHJvdG90eXBlLmlzVmVydGljYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wMC54PT09dGhpcy5wMS54fSxiYS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIGJhKSlyZXR1cm4hMTt2YXIgZT10O3JldHVybiB0aGlzLnAwLmVxdWFscyhlLnAwKSYmdGhpcy5wMS5lcXVhbHMoZS5wMSl9LGJhLnByb3RvdHlwZS5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFFpO3JldHVybiBlLmNvbXB1dGVJbnRlcnNlY3Rpb24odGhpcy5wMCx0aGlzLnAxLHQucDAsdC5wMSksZS5oYXNJbnRlcnNlY3Rpb24oKT9lLmdldEludGVyc2VjdGlvbigwKTpudWxsfSxiYS5wcm90b3R5cGUucHJvamVjdD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciB0PWFyZ3VtZW50c1swXTtpZih0LmVxdWFscyh0aGlzLnAwKXx8dC5lcXVhbHModGhpcy5wMSkpcmV0dXJuIG5ldyB2aSh0KTt2YXIgZT10aGlzLnByb2plY3Rpb25GYWN0b3IodCksbj1uZXcgdmk7cmV0dXJuIG4ueD10aGlzLnAwLngrZSoodGhpcy5wMS54LXRoaXMucDAueCksbi55PXRoaXMucDAueStlKih0aGlzLnAxLnktdGhpcy5wMC55KSxufWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgYmEpe3ZhciByPWFyZ3VtZW50c1swXSxpPXRoaXMucHJvamVjdGlvbkZhY3RvcihyLnAwKSxvPXRoaXMucHJvamVjdGlvbkZhY3RvcihyLnAxKTtpZihpPj0xJiZvPj0xfHxpPD0wJiZvPD0wKXJldHVybiBudWxsO3ZhciBzPXRoaXMucHJvamVjdChyLnAwKTtpPDAmJihzPXRoaXMucDApLGk+MSYmKHM9dGhpcy5wMSk7dmFyIGE9dGhpcy5wcm9qZWN0KHIucDEpO3JldHVybiBvPDAmJihhPXRoaXMucDApLG8+MSYmKGE9dGhpcy5wMSksbmV3IGJhKHMsYSl9fSxiYS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7dGhpcy5wMS5jb21wYXJlVG8odGhpcy5wMCk8MCYmdGhpcy5yZXZlcnNlKCl9LGJhLnByb3RvdHlwZS5hbmdsZT1mdW5jdGlvbigpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMucDEueS10aGlzLnAwLnksdGhpcy5wMS54LXRoaXMucDAueCl9LGJhLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dD90aGlzLnAwOnRoaXMucDF9LGJhLnByb3RvdHlwZS5kaXN0YW5jZVBlcnBlbmRpY3VsYXI9ZnVuY3Rpb24odCl7cmV0dXJuIGVvLmRpc3RhbmNlUG9pbnRMaW5lUGVycGVuZGljdWxhcih0LHRoaXMucDAsdGhpcy5wMSl9LGJhLnByb3RvdHlwZS5taW5ZPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKHRoaXMucDAueSx0aGlzLnAxLnkpfSxiYS5wcm90b3R5cGUubWlkUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gYmEubWlkUG9pbnQodGhpcy5wMCx0aGlzLnAxKX0sYmEucHJvdG90eXBlLnByb2plY3Rpb25GYWN0b3I9ZnVuY3Rpb24odCl7aWYodC5lcXVhbHModGhpcy5wMCkpcmV0dXJuIDA7aWYodC5lcXVhbHModGhpcy5wMSkpcmV0dXJuIDE7dmFyIGU9dGhpcy5wMS54LXRoaXMucDAueCxuPXRoaXMucDEueS10aGlzLnAwLnkscj1lKmUrbipuO3JldHVybiByPD0wP2ZpLk5hTjooKHQueC10aGlzLnAwLngpKmUrKHQueS10aGlzLnAwLnkpKm4pL3J9LGJhLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW50ZXJzZWN0aW9uKHQpO2lmKG51bGwhPT1lKXJldHVybltlLGVdO3ZhciBuPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHI9ZmkuTUFYX1ZBTFVFLGk9bnVsbCxvPXRoaXMuY2xvc2VzdFBvaW50KHQucDApO3I9by5kaXN0YW5jZSh0LnAwKSxuWzBdPW8sblsxXT10LnAwO3ZhciBzPXRoaXMuY2xvc2VzdFBvaW50KHQucDEpOyhpPXMuZGlzdGFuY2UodC5wMSkpPHImJihyPWksblswXT1zLG5bMV09dC5wMSk7dmFyIGE9dC5jbG9zZXN0UG9pbnQodGhpcy5wMCk7KGk9YS5kaXN0YW5jZSh0aGlzLnAwKSk8ciYmKHI9aSxuWzBdPXRoaXMucDAsblsxXT1hKTt2YXIgdT10LmNsb3Nlc3RQb2ludCh0aGlzLnAxKTtyZXR1cm4oaT11LmRpc3RhbmNlKHRoaXMucDEpKTxyJiYocj1pLG5bMF09dGhpcy5wMSxuWzFdPXUpLG59LGJhLnByb3RvdHlwZS5jbG9zZXN0UG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wcm9qZWN0aW9uRmFjdG9yKHQpO3JldHVybiBlPjAmJmU8MT90aGlzLnByb2plY3QodCk6dGhpcy5wMC5kaXN0YW5jZSh0KTx0aGlzLnAxLmRpc3RhbmNlKHQpP3RoaXMucDA6dGhpcy5wMX0sYmEucHJvdG90eXBlLm1heFg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgodGhpcy5wMC54LHRoaXMucDEueCl9LGJhLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wMC5kaXN0YW5jZSh0aGlzLnAxKX0sYmEucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10LG49dGhpcy5wMC5jb21wYXJlVG8oZS5wMCk7cmV0dXJuIDAhPT1uP246dGhpcy5wMS5jb21wYXJlVG8oZS5wMSl9LGJhLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wMDt0aGlzLnAwPXRoaXMucDEsdGhpcy5wMT10fSxiYS5wcm90b3R5cGUuZXF1YWxzVG9wbz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wMC5lcXVhbHModC5wMCkmJih0aGlzLnAxLmVxdWFscyh0LnAxKXx8dGhpcy5wMC5lcXVhbHModC5wMSkpJiZ0aGlzLnAxLmVxdWFscyh0LnAwKX0sYmEucHJvdG90eXBlLmxpbmVJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB6aS5pbnRlcnNlY3Rpb24odGhpcy5wMCx0aGlzLnAxLHQucDAsdC5wMSl9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2YgQmkpKXRocm93IHR9cmV0dXJuIG51bGx9LGJhLnByb3RvdHlwZS5tYXhZPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWF4KHRoaXMucDAueSx0aGlzLnAxLnkpfSxiYS5wcm90b3R5cGUucG9pbnRBbG9uZ09mZnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMucDAueCt0Kih0aGlzLnAxLngtdGhpcy5wMC54KSxyPXRoaXMucDAueSt0Kih0aGlzLnAxLnktdGhpcy5wMC55KSxpPXRoaXMucDEueC10aGlzLnAwLngsbz10aGlzLnAxLnktdGhpcy5wMC55LHM9TWF0aC5zcXJ0KGkqaStvKm8pLGE9MCx1PTA7aWYoMCE9PWUpe2lmKHM8PTApdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29tcHV0ZSBvZmZzZXQgZnJvbSB6ZXJvLWxlbmd0aCBsaW5lIHNlZ21lbnQiKTthPWUqaS9zLHU9ZSpvL3N9cmV0dXJuIG5ldyB2aShuLXUscithKX0sYmEucHJvdG90eXBlLnNldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldENvb3JkaW5hdGVzKHQucDAsdC5wMSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMucDAueD1lLngsdGhpcy5wMC55PWUueSx0aGlzLnAxLng9bi54LHRoaXMucDEueT1uLnl9fSxiYS5wcm90b3R5cGUuc2VnbWVudEZyYWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHJvamVjdGlvbkZhY3Rvcih0KTtyZXR1cm4gZTwwP2U9MDooZT4xfHxmaS5pc05hTihlKSkmJihlPTEpLGV9LGJhLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJMSU5FU1RSSU5HKCAiK3RoaXMucDAueCsiICIrdGhpcy5wMC55KyIsICIrdGhpcy5wMS54KyIgIit0aGlzLnAxLnkrIikifSxiYS5wcm90b3R5cGUuaXNIb3Jpem9udGFsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucDAueT09PXRoaXMucDEueX0sYmEucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBiYSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBlby5kaXN0YW5jZUxpbmVMaW5lKHRoaXMucDAsdGhpcy5wMSx0LnAwLHQucDEpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gZW8uZGlzdGFuY2VQb2ludExpbmUoZSx0aGlzLnAwLHRoaXMucDEpfX0sYmEucHJvdG90eXBlLnBvaW50QWxvbmc9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHZpO3JldHVybiBlLng9dGhpcy5wMC54K3QqKHRoaXMucDEueC10aGlzLnAwLngpLGUueT10aGlzLnAwLnkrdCoodGhpcy5wMS55LXRoaXMucDAueSksZX0sYmEucHJvdG90eXBlLmhhc2hDb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9ZmkuZG91YmxlVG9Mb25nQml0cyh0aGlzLnAwLngpO3RePTMxKmZpLmRvdWJsZVRvTG9uZ0JpdHModGhpcy5wMC55KTt2YXIgZT1NYXRoLnRydW5jKHQpXk1hdGgudHJ1bmModD4+MzIpLG49ZmkuZG91YmxlVG9Mb25nQml0cyh0aGlzLnAxLngpO3JldHVybiBuXj0zMSpmaS5kb3VibGVUb0xvbmdCaXRzKHRoaXMucDEueSksZV4oTWF0aC50cnVuYyhuKV5NYXRoLnRydW5jKG4+PjMyKSl9LGJhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaSxtaV19LGJhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBiYX0sYmEubWlkUG9pbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHZpKCh0LngrZS54KS8yLCh0LnkrZS55KS8yKX0sRGEuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHgyZDIxNzIxMzVmNDExYzAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiYSxEYSk7dmFyIEVhPWZ1bmN0aW9uKCl7dGhpcy50ZW1wRW52MT1uZXcgamksdGhpcy50ZW1wRW52Mj1uZXcgamksdGhpcy5fb3ZlcmxhcFNlZzE9bmV3IGJhLHRoaXMuX292ZXJsYXBTZWcyPW5ldyBiYX07RWEucHJvdG90eXBlLm92ZXJsYXA9ZnVuY3Rpb24oKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aCYmND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1sxXSxlPWFyZ3VtZW50c1syXSxuPWFyZ3VtZW50c1szXTthcmd1bWVudHNbMF0uZ2V0TGluZVNlZ21lbnQodCx0aGlzLl9vdmVybGFwU2VnMSksZS5nZXRMaW5lU2VnbWVudChuLHRoaXMuX292ZXJsYXBTZWcyKSx0aGlzLm92ZXJsYXAodGhpcy5fb3ZlcmxhcFNlZzEsdGhpcy5fb3ZlcmxhcFNlZzIpfX0sRWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEVhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBFYX07dmFyIENhPWZ1bmN0aW9uKCl7dGhpcy5fcHRzPW51bGwsdGhpcy5fc3RhcnQ9bnVsbCx0aGlzLl9lbmQ9bnVsbCx0aGlzLl9lbnY9bnVsbCx0aGlzLl9jb250ZXh0PW51bGwsdGhpcy5faWQ9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1hcmd1bWVudHNbM107dGhpcy5fcHRzPXQsdGhpcy5fc3RhcnQ9ZSx0aGlzLl9lbmQ9bix0aGlzLl9jb250ZXh0PXJ9O0NhLnByb3RvdHlwZS5nZXRMaW5lU2VnbWVudD1mdW5jdGlvbih0LGUpe2UucDA9dGhpcy5fcHRzW3RdLGUucDE9dGhpcy5fcHRzW3QrMV19LENhLnByb3RvdHlwZS5jb21wdXRlU2VsZWN0PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXMuX3B0c1tlXSxvPXRoaXMuX3B0c1tuXTtpZihyLnRlbXBFbnYxLmluaXQoaSxvKSxuLWU9PTEpcmV0dXJuIHIuc2VsZWN0KHRoaXMsZSksbnVsbDtpZighdC5pbnRlcnNlY3RzKHIudGVtcEVudjEpKXJldHVybiBudWxsO3ZhciBzPU1hdGgudHJ1bmMoKGUrbikvMik7ZTxzJiZ0aGlzLmNvbXB1dGVTZWxlY3QodCxlLHMsciksczxuJiZ0aGlzLmNvbXB1dGVTZWxlY3QodCxzLG4scil9LENhLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZW5kLXRoaXMuX3N0YXJ0KzEpLmZpbGwobnVsbCksZT0wLG49dGhpcy5fc3RhcnQ7bjw9dGhpcy5fZW5kO24rKyl0W2UrK109dGhpcy5fcHRzW25dO3JldHVybiB0fSxDYS5wcm90b3R5cGUuY29tcHV0ZU92ZXJsYXBzPWZ1bmN0aW9uKHQsZSl7dGhpcy5jb21wdXRlT3ZlcmxhcHNJbnRlcm5hbCh0aGlzLl9zdGFydCx0aGlzLl9lbmQsdCx0Ll9zdGFydCx0Ll9lbmQsZSl9LENhLnByb3RvdHlwZS5zZXRJZD1mdW5jdGlvbih0KXt0aGlzLl9pZD10fSxDYS5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKHQsZSl7dGhpcy5jb21wdXRlU2VsZWN0KHQsdGhpcy5fc3RhcnQsdGhpcy5fZW5kLGUpfSxDYS5wcm90b3R5cGUuZ2V0RW52ZWxvcGU9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fZW52KXt2YXIgdD10aGlzLl9wdHNbdGhpcy5fc3RhcnRdLGU9dGhpcy5fcHRzW3RoaXMuX2VuZF07dGhpcy5fZW52PW5ldyBqaSh0LGUpfXJldHVybiB0aGlzLl9lbnZ9LENhLnByb3RvdHlwZS5nZXRFbmRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmR9LENhLnByb3RvdHlwZS5nZXRTdGFydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YXJ0fSxDYS5wcm90b3R5cGUuZ2V0Q29udGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250ZXh0fSxDYS5wcm90b3R5cGUuZ2V0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWR9LENhLnByb3RvdHlwZS5jb21wdXRlT3ZlcmxhcHNJbnRlcm5hbD1mdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIHM9dGhpcy5fcHRzW3RdLGE9dGhpcy5fcHRzW2VdLHU9bi5fcHRzW3JdLGM9bi5fcHRzW2ldO2lmKGUtdD09MSYmaS1yPT0xKXJldHVybiBvLm92ZXJsYXAodGhpcyx0LG4sciksbnVsbDtpZihvLnRlbXBFbnYxLmluaXQocyxhKSxvLnRlbXBFbnYyLmluaXQodSxjKSwhby50ZW1wRW52MS5pbnRlcnNlY3RzKG8udGVtcEVudjIpKXJldHVybiBudWxsO3ZhciBsPU1hdGgudHJ1bmMoKHQrZSkvMiksaD1NYXRoLnRydW5jKChyK2kpLzIpO3Q8bCYmKHI8aCYmdGhpcy5jb21wdXRlT3ZlcmxhcHNJbnRlcm5hbCh0LGwsbixyLGgsbyksaDxpJiZ0aGlzLmNvbXB1dGVPdmVybGFwc0ludGVybmFsKHQsbCxuLGgsaSxvKSksbDxlJiYocjxoJiZ0aGlzLmNvbXB1dGVPdmVybGFwc0ludGVybmFsKGwsZSxuLHIsaCxvKSxoPGkmJnRoaXMuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWwobCxlLG4saCxpLG8pKX0sQ2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LENhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDYX07dmFyIFNhPWZ1bmN0aW9uKCl7fTtTYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sU2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFNhfSxTYS5nZXRDaGFpblN0YXJ0SW5kaWNlcz1mdW5jdGlvbih0KXt2YXIgZT0wLG49bmV3IHhvO24uYWRkKG5ldyBOaShlKSk7ZG97dmFyIHI9U2EuZmluZENoYWluRW5kKHQsZSk7bi5hZGQobmV3IE5pKHIpKSxlPXJ9d2hpbGUoZTx0Lmxlbmd0aC0xKTtyZXR1cm4gU2EudG9JbnRBcnJheShuKX0sU2EuZmluZENoYWluRW5kPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWU7bjx0Lmxlbmd0aC0xJiZ0W25dLmVxdWFsczJEKHRbbisxXSk7KW4rKztpZihuPj10Lmxlbmd0aC0xKXJldHVybiB0Lmxlbmd0aC0xO2Zvcih2YXIgcj1Xcy5xdWFkcmFudCh0W25dLHRbbisxXSksaT1lKzE7aTx0Lmxlbmd0aDspe2lmKCF0W2ktMV0uZXF1YWxzMkQodFtpXSkpaWYoV3MucXVhZHJhbnQodFtpLTFdLHRbaV0pIT09cilicmVhaztpKyt9cmV0dXJuIGktMX0sU2EuZ2V0Q2hhaW5zPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIFNhLmdldENoYWlucyhhcmd1bWVudHNbMF0sbnVsbCk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1uZXcgeG8scj1TYS5nZXRDaGFpblN0YXJ0SW5kaWNlcyh0KSxpPTA7aTxyLmxlbmd0aC0xO2krKyl7dmFyIG89bmV3IENhKHQscltpXSxyW2krMV0sZSk7bi5hZGQobyl9cmV0dXJuIG59fSxTYS50b0ludEFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCksbj0wO248ZS5sZW5ndGg7bisrKWVbbl09dC5nZXQobikuaW50VmFsdWUoKTtyZXR1cm4gZX07dmFyIEFhPWZ1bmN0aW9uKCl7fTtBYS5wcm90b3R5cGUuY29tcHV0ZU5vZGVzPWZ1bmN0aW9uKHQpe30sQWEucHJvdG90eXBlLmdldE5vZGVkU3Vic3RyaW5ncz1mdW5jdGlvbigpe30sQWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEFhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBBYX07dmFyIE5hPWZ1bmN0aW9uKCl7aWYodGhpcy5fc2VnSW50PW51bGwsMCE9PWFyZ3VtZW50cy5sZW5ndGgmJjE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRTZWdtZW50SW50ZXJzZWN0b3IodCl9fTtOYS5wcm90b3R5cGUuc2V0U2VnbWVudEludGVyc2VjdG9yPWZ1bmN0aW9uKHQpe3RoaXMuX3NlZ0ludD10fSxOYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bQWFdfSxOYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTmF9O3ZhciBJYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2U/dC5jYWxsKHRoaXMsZSk6dC5jYWxsKHRoaXMpLHRoaXMuX21vbm9DaGFpbnM9bmV3IHhvLHRoaXMuX2luZGV4PW5ldyBwYSx0aGlzLl9pZENvdW50ZXI9MCx0aGlzLl9ub2RlZFNlZ1N0cmluZ3M9bnVsbCx0aGlzLl9uT3ZlcmxhcHM9MH10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17U2VnbWVudE92ZXJsYXBBY3Rpb246e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRNb25vdG9uZUNoYWlucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb25vQ2hhaW5zfSxlLnByb3RvdHlwZS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gd2EuZ2V0Tm9kZWRTdWJzdHJpbmdzKHRoaXMuX25vZGVkU2VnU3RyaW5ncyl9LGUucHJvdG90eXBlLmdldEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2luZGV4fSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj1TYS5nZXRDaGFpbnModC5nZXRDb29yZGluYXRlcygpLHQpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtyLnNldElkKGUuX2lkQ291bnRlcisrKSxlLl9pbmRleC5pbnNlcnQoci5nZXRFbnZlbG9wZSgpLHIpLGUuX21vbm9DaGFpbnMuYWRkKHIpfX0sZS5wcm90b3R5cGUuY29tcHV0ZU5vZGVzPWZ1bmN0aW9uKHQpe3RoaXMuX25vZGVkU2VnU3RyaW5ncz10O2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXRoaXMuYWRkKGUubmV4dCgpKTt0aGlzLmludGVyc2VjdENoYWlucygpfSxlLnByb3RvdHlwZS5pbnRlcnNlY3RDaGFpbnM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPW5ldyBNYSh0aGlzLl9zZWdJbnQpLG49dGhpcy5fbW9ub0NoYWlucy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOylmb3IodmFyIHI9bi5uZXh0KCksaT10Ll9pbmRleC5xdWVyeShyLmdldEVudmVsb3BlKCkpLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKTtpZihvLmdldElkKCk+ci5nZXRJZCgpJiYoci5jb21wdXRlT3ZlcmxhcHMobyxlKSx0Ll9uT3ZlcmxhcHMrKyksdC5fc2VnSW50LmlzRG9uZSgpKXJldHVybiBudWxsfX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5TZWdtZW50T3ZlcmxhcEFjdGlvbi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oTmEpLE1hPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5fc2k9bnVsbDt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5fc2k9ZX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUub3ZlcmxhcD1mdW5jdGlvbigpe2lmKDQhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5vdmVybGFwLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1hcmd1bWVudHNbM10saT1hcmd1bWVudHNbMF0uZ2V0Q29udGV4dCgpLG89bi5nZXRDb250ZXh0KCk7dGhpcy5fc2kucHJvY2Vzc0ludGVyc2VjdGlvbnMoaSxlLG8scil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KEVhKSxGYT1mdW5jdGlvbiB0KCl7aWYodGhpcy5fcXVhZHJhbnRTZWdtZW50cz10LkRFRkFVTFRfUVVBRFJBTlRfU0VHTUVOVFMsdGhpcy5fZW5kQ2FwU3R5bGU9dC5DQVBfUk9VTkQsdGhpcy5fam9pblN0eWxlPXQuSk9JTl9ST1VORCx0aGlzLl9taXRyZUxpbWl0PXQuREVGQVVMVF9NSVRSRV9MSU1JVCx0aGlzLl9pc1NpbmdsZVNpZGVkPSExLHRoaXMuX3NpbXBsaWZ5RmFjdG9yPXQuREVGQVVMVF9TSU1QTElGWV9GQUNUT1IsMCE9PWFyZ3VtZW50cy5sZW5ndGgpaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLnNldFF1YWRyYW50U2VnbWVudHMoZSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMuc2V0UXVhZHJhbnRTZWdtZW50cyhuKSx0aGlzLnNldEVuZENhcFN0eWxlKHIpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1szXTt0aGlzLnNldFF1YWRyYW50U2VnbWVudHMoaSksdGhpcy5zZXRFbmRDYXBTdHlsZShvKSx0aGlzLnNldEpvaW5TdHlsZShzKSx0aGlzLnNldE1pdHJlTGltaXQoYSl9fSxUYT17Q0FQX1JPVU5EOntjb25maWd1cmFibGU6ITB9LENBUF9GTEFUOntjb25maWd1cmFibGU6ITB9LENBUF9TUVVBUkU6e2NvbmZpZ3VyYWJsZTohMH0sSk9JTl9ST1VORDp7Y29uZmlndXJhYmxlOiEwfSxKT0lOX01JVFJFOntjb25maWd1cmFibGU6ITB9LEpPSU5fQkVWRUw6e2NvbmZpZ3VyYWJsZTohMH0sREVGQVVMVF9RVUFEUkFOVF9TRUdNRU5UUzp7Y29uZmlndXJhYmxlOiEwfSxERUZBVUxUX01JVFJFX0xJTUlUOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfU0lNUExJRllfRkFDVE9SOntjb25maWd1cmFibGU6ITB9fTtGYS5wcm90b3R5cGUuZ2V0RW5kQ2FwU3R5bGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW5kQ2FwU3R5bGV9LEZhLnByb3RvdHlwZS5pc1NpbmdsZVNpZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzU2luZ2xlU2lkZWR9LEZhLnByb3RvdHlwZS5zZXRRdWFkcmFudFNlZ21lbnRzPWZ1bmN0aW9uKHQpe3RoaXMuX3F1YWRyYW50U2VnbWVudHM9dCwwPT09dGhpcy5fcXVhZHJhbnRTZWdtZW50cyYmKHRoaXMuX2pvaW5TdHlsZT1GYS5KT0lOX0JFVkVMKSx0aGlzLl9xdWFkcmFudFNlZ21lbnRzPDAmJih0aGlzLl9qb2luU3R5bGU9RmEuSk9JTl9NSVRSRSx0aGlzLl9taXRyZUxpbWl0PU1hdGguYWJzKHRoaXMuX3F1YWRyYW50U2VnbWVudHMpKSx0PD0wJiYodGhpcy5fcXVhZHJhbnRTZWdtZW50cz0xKSx0aGlzLl9qb2luU3R5bGUhPT1GYS5KT0lOX1JPVU5EJiYodGhpcy5fcXVhZHJhbnRTZWdtZW50cz1GYS5ERUZBVUxUX1FVQURSQU5UX1NFR01FTlRTKX0sRmEucHJvdG90eXBlLmdldEpvaW5TdHlsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9qb2luU3R5bGV9LEZhLnByb3RvdHlwZS5zZXRKb2luU3R5bGU9ZnVuY3Rpb24odCl7dGhpcy5fam9pblN0eWxlPXR9LEZhLnByb3RvdHlwZS5zZXRTaW1wbGlmeUZhY3Rvcj1mdW5jdGlvbih0KXt0aGlzLl9zaW1wbGlmeUZhY3Rvcj10PDA/MDp0fSxGYS5wcm90b3R5cGUuZ2V0U2ltcGxpZnlGYWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2ltcGxpZnlGYWN0b3J9LEZhLnByb3RvdHlwZS5nZXRRdWFkcmFudFNlZ21lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3F1YWRyYW50U2VnbWVudHN9LEZhLnByb3RvdHlwZS5zZXRFbmRDYXBTdHlsZT1mdW5jdGlvbih0KXt0aGlzLl9lbmRDYXBTdHlsZT10fSxGYS5wcm90b3R5cGUuZ2V0TWl0cmVMaW1pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9taXRyZUxpbWl0fSxGYS5wcm90b3R5cGUuc2V0TWl0cmVMaW1pdD1mdW5jdGlvbih0KXt0aGlzLl9taXRyZUxpbWl0PXR9LEZhLnByb3RvdHlwZS5zZXRTaW5nbGVTaWRlZD1mdW5jdGlvbih0KXt0aGlzLl9pc1NpbmdsZVNpZGVkPXR9LEZhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxGYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRmF9LEZhLmJ1ZmZlckRpc3RhbmNlRXJyb3I9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5QSS8yL3Q7cmV0dXJuIDEtTWF0aC5jb3MoZS8yKX0sVGEuQ0FQX1JPVU5ELmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxUYS5DQVBfRkxBVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sVGEuQ0FQX1NRVUFSRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gM30sVGEuSk9JTl9ST1VORC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sVGEuSk9JTl9NSVRSRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sVGEuSk9JTl9CRVZFTC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gM30sVGEuREVGQVVMVF9RVUFEUkFOVF9TRUdNRU5UUy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gOH0sVGEuREVGQVVMVF9NSVRSRV9MSU1JVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gNX0sVGEuREVGQVVMVF9TSU1QTElGWV9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLjAxfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGYSxUYSk7dmFyIE9hPWZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3RhbmNlVG9sPW51bGwsdGhpcy5faXNEZWxldGVkPW51bGwsdGhpcy5fYW5nbGVPcmllbnRhdGlvbj1lby5DT1VOVEVSQ0xPQ0tXSVNFLHRoaXMuX2lucHV0TGluZT10fHxudWxsfSxMYT17SU5JVDp7Y29uZmlndXJhYmxlOiEwfSxERUxFVEU6e2NvbmZpZ3VyYWJsZTohMH0sS0VFUDp7Y29uZmlndXJhYmxlOiEwfSxOVU1fUFRTX1RPX0NIRUNLOntjb25maWd1cmFibGU6ITB9fTtPYS5wcm90b3R5cGUuaXNEZWxldGFibGU9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcy5faW5wdXRMaW5lW3RdLG89dGhpcy5faW5wdXRMaW5lW2VdLHM9dGhpcy5faW5wdXRMaW5lW25dO3JldHVybiEoIXRoaXMuaXNDb25jYXZlKGksbyxzKXx8IXRoaXMuaXNTaGFsbG93KGksbyxzLHIpKSYmdGhpcy5pc1NoYWxsb3dTYW1wbGVkKGksbyx0LG4scil9LE9hLnByb3RvdHlwZS5kZWxldGVTaGFsbG93Q29uY2F2aXRpZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPTEsbj10aGlzLmZpbmROZXh0Tm9uRGVsZXRlZEluZGV4KGUpLHI9dGhpcy5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleChuKSxpPSExO3I8dGhpcy5faW5wdXRMaW5lLmxlbmd0aDspe3ZhciBvPSExO3QuaXNEZWxldGFibGUoZSxuLHIsdC5fZGlzdGFuY2VUb2wpJiYodC5faXNEZWxldGVkW25dPU9hLkRFTEVURSxvPSEwLGk9ITApLGU9bz9yOm4sbj10LmZpbmROZXh0Tm9uRGVsZXRlZEluZGV4KGUpLHI9dC5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleChuKX1yZXR1cm4gaX0sT2EucHJvdG90eXBlLmlzU2hhbGxvd0NvbmNhdml0eT1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gZW8uY29tcHV0ZU9yaWVudGF0aW9uKHQsZSxuKT09PXRoaXMuX2FuZ2xlT3JpZW50YXRpb24mJmVvLmRpc3RhbmNlUG9pbnRMaW5lKGUsdCxuKTxyfSxPYS5wcm90b3R5cGUuaXNTaGFsbG93U2FtcGxlZD1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPU1hdGgudHJ1bmMoKHItbikvT2EuTlVNX1BUU19UT19DSEVDSyk7bzw9MCYmKG89MSk7Zm9yKHZhciBzPW47czxyO3MrPW8paWYoIXRoaXMuaXNTaGFsbG93KHQsZSx0aGlzLl9pbnB1dExpbmVbc10saSkpcmV0dXJuITE7cmV0dXJuITB9LE9hLnByb3RvdHlwZS5pc0NvbmNhdmU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlby5jb21wdXRlT3JpZW50YXRpb24odCxlLG4pPT09dGhpcy5fYW5nbGVPcmllbnRhdGlvbn0sT2EucHJvdG90eXBlLnNpbXBsaWZ5PWZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3RhbmNlVG9sPU1hdGguYWJzKHQpLHQ8MCYmKHRoaXMuX2FuZ2xlT3JpZW50YXRpb249ZW8uQ0xPQ0tXSVNFKSx0aGlzLl9pc0RlbGV0ZWQ9bmV3IEFycmF5KHRoaXMuX2lucHV0TGluZS5sZW5ndGgpLmZpbGwobnVsbCk7dmFyIGU9ITE7ZG97ZT10aGlzLmRlbGV0ZVNoYWxsb3dDb25jYXZpdGllcygpfXdoaWxlKGUpO3JldHVybiB0aGlzLmNvbGxhcHNlTGluZSgpfSxPYS5wcm90b3R5cGUuZmluZE5leHROb25EZWxldGVkSW5kZXg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQrMTtlPHRoaXMuX2lucHV0TGluZS5sZW5ndGgmJnRoaXMuX2lzRGVsZXRlZFtlXT09PU9hLkRFTEVURTspZSsrO3JldHVybiBlfSxPYS5wcm90b3R5cGUuaXNTaGFsbG93PWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBlby5kaXN0YW5jZVBvaW50TGluZShlLHQsbik8cn0sT2EucHJvdG90eXBlLmNvbGxhcHNlTGluZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgYm8sZT0wO2U8dGhpcy5faW5wdXRMaW5lLmxlbmd0aDtlKyspdGhpcy5faXNEZWxldGVkW2VdIT09T2EuREVMRVRFJiZ0LmFkZCh0aGlzLl9pbnB1dExpbmVbZV0pO3JldHVybiB0LnRvQ29vcmRpbmF0ZUFycmF5KCl9LE9hLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxPYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gT2F9LE9hLnNpbXBsaWZ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBPYSh0KS5zaW1wbGlmeShlKX0sTGEuSU5JVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sTGEuREVMRVRFLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxMYS5LRUVQLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxMYS5OVU1fUFRTX1RPX0NIRUNLLmdldD1mdW5jdGlvbigpe3JldHVybiAxMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoT2EsTGEpO3ZhciBQYT1mdW5jdGlvbigpe3RoaXMuX3B0TGlzdD1udWxsLHRoaXMuX3ByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5fbWluaW1pbVZlcnRleERpc3RhbmNlPTAsdGhpcy5fcHRMaXN0PW5ldyB4b30sUmE9e0NPT1JESU5BVEVfQVJSQVlfVFlQRTp7Y29uZmlndXJhYmxlOiEwfX07UGEucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0TGlzdC50b0FycmF5KFBhLkNPT1JESU5BVEVfQVJSQVlfVFlQRSl9LFBhLnByb3RvdHlwZS5zZXRQcmVjaXNpb25Nb2RlbD1mdW5jdGlvbih0KXt0aGlzLl9wcmVjaXNpb25Nb2RlbD10fSxQYS5wcm90b3R5cGUuYWRkUHQ9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHZpKHQpO2lmKHRoaXMuX3ByZWNpc2lvbk1vZGVsLm1ha2VQcmVjaXNlKGUpLHRoaXMuaXNSZWR1bmRhbnQoZSkpcmV0dXJuIG51bGw7dGhpcy5fcHRMaXN0LmFkZChlKX0sUGEucHJvdG90eXBlLnJldmVyZT1mdW5jdGlvbigpe30sUGEucHJvdG90eXBlLmFkZFB0cz1mdW5jdGlvbih0LGUpe2lmKGUpZm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdGhpcy5hZGRQdCh0W25dKTtlbHNlIGZvcih2YXIgcj10Lmxlbmd0aC0xO3I+PTA7ci0tKXRoaXMuYWRkUHQodFtyXSl9LFBhLnByb3RvdHlwZS5pc1JlZHVuZGFudD1mdW5jdGlvbih0KXtpZih0aGlzLl9wdExpc3Quc2l6ZSgpPDEpcmV0dXJuITE7dmFyIGU9dGhpcy5fcHRMaXN0LmdldCh0aGlzLl9wdExpc3Quc2l6ZSgpLTEpO3JldHVybiB0LmRpc3RhbmNlKGUpPHRoaXMuX21pbmltaW1WZXJ0ZXhEaXN0YW5jZX0sUGEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBJcykuY3JlYXRlTGluZVN0cmluZyh0aGlzLmdldENvb3JkaW5hdGVzKCkpLnRvU3RyaW5nKCl9LFBhLnByb3RvdHlwZS5jbG9zZVJpbmc9ZnVuY3Rpb24oKXtpZih0aGlzLl9wdExpc3Quc2l6ZSgpPDEpcmV0dXJuIG51bGw7dmFyIHQ9bmV3IHZpKHRoaXMuX3B0TGlzdC5nZXQoMCkpLGU9dGhpcy5fcHRMaXN0LmdldCh0aGlzLl9wdExpc3Quc2l6ZSgpLTEpO2lmKHQuZXF1YWxzKGUpKXJldHVybiBudWxsO3RoaXMuX3B0TGlzdC5hZGQodCl9LFBhLnByb3RvdHlwZS5zZXRNaW5pbXVtVmVydGV4RGlzdGFuY2U9ZnVuY3Rpb24odCl7dGhpcy5fbWluaW1pbVZlcnRleERpc3RhbmNlPXR9LFBhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxQYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUGF9LFJhLkNPT1JESU5BVEVfQVJSQVlfVFlQRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFycmF5KDApLmZpbGwobnVsbCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFBhLFJhKTt2YXIgQmE9ZnVuY3Rpb24oKXt9LGthPXtQSV9USU1FU18yOntjb25maWd1cmFibGU6ITB9LFBJX09WRVJfMjp7Y29uZmlndXJhYmxlOiEwfSxQSV9PVkVSXzQ6e2NvbmZpZ3VyYWJsZTohMH0sQ09VTlRFUkNMT0NLV0lTRTp7Y29uZmlndXJhYmxlOiEwfSxDTE9DS1dJU0U6e2NvbmZpZ3VyYWJsZTohMH0sTk9ORTp7Y29uZmlndXJhYmxlOiEwfX07QmEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEJhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBCYX0sQmEudG9EZWdyZWVzPWZ1bmN0aW9uKHQpe3JldHVybiAxODAqdC9NYXRoLlBJfSxCYS5ub3JtYWxpemU9ZnVuY3Rpb24odCl7Zm9yKDt0Pk1hdGguUEk7KXQtPUJhLlBJX1RJTUVTXzI7Zm9yKDt0PD0tTWF0aC5QSTspdCs9QmEuUElfVElNRVNfMjtyZXR1cm4gdH0sQmEuYW5nbGU9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBNYXRoLmF0YW4yKHQueSx0LngpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1uLngtZS54LGk9bi55LWUueTtyZXR1cm4gTWF0aC5hdGFuMihpLHIpfX0sQmEuaXNBY3V0ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC54LWUueCxpPXQueS1lLnk7cmV0dXJuIHIqKG4ueC1lLngpK2kqKG4ueS1lLnkpPjB9LEJhLmlzT2J0dXNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LngtZS54LGk9dC55LWUueTtyZXR1cm4gcioobi54LWUueCkraSoobi55LWUueSk8MH0sQmEuaW50ZXJpb3JBbmdsZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9QmEuYW5nbGUoZSx0KSxpPUJhLmFuZ2xlKGUsbik7cmV0dXJuIE1hdGguYWJzKGktcil9LEJhLm5vcm1hbGl6ZVBvc2l0aXZlPWZ1bmN0aW9uKHQpe2lmKHQ8MCl7Zm9yKDt0PDA7KXQrPUJhLlBJX1RJTUVTXzI7dD49QmEuUElfVElNRVNfMiYmKHQ9MCl9ZWxzZXtmb3IoO3Q+PUJhLlBJX1RJTUVTXzI7KXQtPUJhLlBJX1RJTUVTXzI7dDwwJiYodD0wKX1yZXR1cm4gdH0sQmEuYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1CYS5hbmdsZShlLHQpLGk9QmEuYW5nbGUoZSxuKTtyZXR1cm4gQmEuZGlmZihyLGkpfSxCYS5kaWZmPWZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbDtyZXR1cm4obj10PGU/ZS10OnQtZSk+TWF0aC5QSSYmKG49MipNYXRoLlBJLW4pLG59LEJhLnRvUmFkaWFucz1mdW5jdGlvbih0KXtyZXR1cm4gdCpNYXRoLlBJLzE4MH0sQmEuZ2V0VHVybj1mdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc2luKGUtdCk7cmV0dXJuIG4+MD9CYS5DT1VOVEVSQ0xPQ0tXSVNFOm48MD9CYS5DTE9DS1dJU0U6QmEuTk9ORX0sQmEuYW5nbGVCZXR3ZWVuT3JpZW50ZWQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPUJhLmFuZ2xlKGUsdCksaT1CYS5hbmdsZShlLG4pLXI7cmV0dXJuIGk8PS1NYXRoLlBJP2krQmEuUElfVElNRVNfMjppPk1hdGguUEk/aS1CYS5QSV9USU1FU18yOml9LGthLlBJX1RJTUVTXzIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDIqTWF0aC5QSX0sa2EuUElfT1ZFUl8yLmdldD1mdW5jdGlvbigpe3JldHVybiBNYXRoLlBJLzJ9LGthLlBJX09WRVJfNC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5QSS80fSxrYS5DT1VOVEVSQ0xPQ0tXSVNFLmdldD1mdW5jdGlvbigpe3JldHVybiBlby5DT1VOVEVSQ0xPQ0tXSVNFfSxrYS5DTE9DS1dJU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGVvLkNMT0NLV0lTRX0sa2EuTk9ORS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZW8uQ09MTElORUFSfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhCYSxrYSk7dmFyIHphPWZ1bmN0aW9uIHQoKXt0aGlzLl9tYXhDdXJ2ZVNlZ21lbnRFcnJvcj0wLHRoaXMuX2ZpbGxldEFuZ2xlUXVhbnR1bT1udWxsLHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3I9MSx0aGlzLl9zZWdMaXN0PW51bGwsdGhpcy5fZGlzdGFuY2U9MCx0aGlzLl9wcmVjaXNpb25Nb2RlbD1udWxsLHRoaXMuX2J1ZlBhcmFtcz1udWxsLHRoaXMuX2xpPW51bGwsdGhpcy5fczA9bnVsbCx0aGlzLl9zMT1udWxsLHRoaXMuX3MyPW51bGwsdGhpcy5fc2VnMD1uZXcgYmEsdGhpcy5fc2VnMT1uZXcgYmEsdGhpcy5fb2Zmc2V0MD1uZXcgYmEsdGhpcy5fb2Zmc2V0MT1uZXcgYmEsdGhpcy5fc2lkZT0wLHRoaXMuX2hhc05hcnJvd0NvbmNhdmVBbmdsZT0hMTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5fcHJlY2lzaW9uTW9kZWw9ZSx0aGlzLl9idWZQYXJhbXM9bix0aGlzLl9saT1uZXcgUWksdGhpcy5fZmlsbGV0QW5nbGVRdWFudHVtPU1hdGguUEkvMi9uLmdldFF1YWRyYW50U2VnbWVudHMoKSxuLmdldFF1YWRyYW50U2VnbWVudHMoKT49OCYmbi5nZXRKb2luU3R5bGUoKT09PUZhLkpPSU5fUk9VTkQmJih0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yPXQuTUFYX0NMT1NJTkdfU0VHX0xFTl9GQUNUT1IpLHRoaXMuaW5pdChyKX0samE9e09GRlNFVF9TRUdNRU5UX1NFUEFSQVRJT05fRkFDVE9SOntjb25maWd1cmFibGU6ITB9LElOU0lERV9UVVJOX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfSxDVVJWRV9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH0sTUFYX0NMT1NJTkdfU0VHX0xFTl9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH19O3phLnByb3RvdHlwZS5hZGROZXh0U2VnbWVudD1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX3MwPXRoaXMuX3MxLHRoaXMuX3MxPXRoaXMuX3MyLHRoaXMuX3MyPXQsdGhpcy5fc2VnMC5zZXRDb29yZGluYXRlcyh0aGlzLl9zMCx0aGlzLl9zMSksdGhpcy5jb21wdXRlT2Zmc2V0U2VnbWVudCh0aGlzLl9zZWcwLHRoaXMuX3NpZGUsdGhpcy5fZGlzdGFuY2UsdGhpcy5fb2Zmc2V0MCksdGhpcy5fc2VnMS5zZXRDb29yZGluYXRlcyh0aGlzLl9zMSx0aGlzLl9zMiksdGhpcy5jb21wdXRlT2Zmc2V0U2VnbWVudCh0aGlzLl9zZWcxLHRoaXMuX3NpZGUsdGhpcy5fZGlzdGFuY2UsdGhpcy5fb2Zmc2V0MSksdGhpcy5fczEuZXF1YWxzKHRoaXMuX3MyKSlyZXR1cm4gbnVsbDt2YXIgbj1lby5jb21wdXRlT3JpZW50YXRpb24odGhpcy5fczAsdGhpcy5fczEsdGhpcy5fczIpLHI9bj09PWVvLkNMT0NLV0lTRSYmdGhpcy5fc2lkZT09PUZzLkxFRlR8fG49PT1lby5DT1VOVEVSQ0xPQ0tXSVNFJiZ0aGlzLl9zaWRlPT09RnMuUklHSFQ7MD09PW4/dGhpcy5hZGRDb2xsaW5lYXIoZSk6cj90aGlzLmFkZE91dHNpZGVUdXJuKG4sZSk6dGhpcy5hZGRJbnNpZGVUdXJuKG4sZSl9LHphLnByb3RvdHlwZS5hZGRMaW5lRW5kQ2FwPWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IGJhKHQsZSkscj1uZXcgYmE7dGhpcy5jb21wdXRlT2Zmc2V0U2VnbWVudChuLEZzLkxFRlQsdGhpcy5fZGlzdGFuY2Uscik7dmFyIGk9bmV3IGJhO3RoaXMuY29tcHV0ZU9mZnNldFNlZ21lbnQobixGcy5SSUdIVCx0aGlzLl9kaXN0YW5jZSxpKTt2YXIgbz1lLngtdC54LHM9ZS55LXQueSxhPU1hdGguYXRhbjIocyxvKTtzd2l0Y2godGhpcy5fYnVmUGFyYW1zLmdldEVuZENhcFN0eWxlKCkpe2Nhc2UgRmEuQ0FQX1JPVU5EOnRoaXMuX3NlZ0xpc3QuYWRkUHQoci5wMSksdGhpcy5hZGRGaWxsZXRBcmMoZSxhK01hdGguUEkvMixhLU1hdGguUEkvMixlby5DTE9DS1dJU0UsdGhpcy5fZGlzdGFuY2UpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoaS5wMSk7YnJlYWs7Y2FzZSBGYS5DQVBfRkxBVDp0aGlzLl9zZWdMaXN0LmFkZFB0KHIucDEpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoaS5wMSk7YnJlYWs7Y2FzZSBGYS5DQVBfU1FVQVJFOnZhciB1PW5ldyB2aTt1Lng9TWF0aC5hYnModGhpcy5fZGlzdGFuY2UpKk1hdGguY29zKGEpLHUueT1NYXRoLmFicyh0aGlzLl9kaXN0YW5jZSkqTWF0aC5zaW4oYSk7dmFyIGM9bmV3IHZpKHIucDEueCt1Lngsci5wMS55K3UueSksbD1uZXcgdmkoaS5wMS54K3UueCxpLnAxLnkrdS55KTt0aGlzLl9zZWdMaXN0LmFkZFB0KGMpLHRoaXMuX3NlZ0xpc3QuYWRkUHQobCl9fSx6YS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VnTGlzdC5nZXRDb29yZGluYXRlcygpfSx6YS5wcm90b3R5cGUuYWRkTWl0cmVKb2luPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPSEwLG89bnVsbDt0cnl7bz16aS5pbnRlcnNlY3Rpb24oZS5wMCxlLnAxLG4ucDAsbi5wMSksKHI8PTA/MTpvLmRpc3RhbmNlKHQpL01hdGguYWJzKHIpKT50aGlzLl9idWZQYXJhbXMuZ2V0TWl0cmVMaW1pdCgpJiYoaT0hMSl9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2YgQmkpKXRocm93IHQ7bz1uZXcgdmkoMCwwKSxpPSExfWk/dGhpcy5fc2VnTGlzdC5hZGRQdChvKTp0aGlzLmFkZExpbWl0ZWRNaXRyZUpvaW4oZSxuLHIsdGhpcy5fYnVmUGFyYW1zLmdldE1pdHJlTGltaXQoKSl9LHphLnByb3RvdHlwZS5hZGRGaWxsZXRDb3JuZXI9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1lLngtdC54LHM9ZS55LXQueSxhPU1hdGguYXRhbjIocyxvKSx1PW4ueC10LngsYz1uLnktdC55LGw9TWF0aC5hdGFuMihjLHUpO3I9PT1lby5DTE9DS1dJU0U/YTw9bCYmKGErPTIqTWF0aC5QSSk6YT49bCYmKGEtPTIqTWF0aC5QSSksdGhpcy5fc2VnTGlzdC5hZGRQdChlKSx0aGlzLmFkZEZpbGxldEFyYyh0LGEsbCxyLGkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQobil9LHphLnByb3RvdHlwZS5hZGRPdXRzaWRlVHVybj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX29mZnNldDAucDEuZGlzdGFuY2UodGhpcy5fb2Zmc2V0MS5wMCk8dGhpcy5fZGlzdGFuY2UqemEuT0ZGU0VUX1NFR01FTlRfU0VQQVJBVElPTl9GQUNUT1IpcmV0dXJuIHRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MC5wMSksbnVsbDt0aGlzLl9idWZQYXJhbXMuZ2V0Sm9pblN0eWxlKCk9PT1GYS5KT0lOX01JVFJFP3RoaXMuYWRkTWl0cmVKb2luKHRoaXMuX3MxLHRoaXMuX29mZnNldDAsdGhpcy5fb2Zmc2V0MSx0aGlzLl9kaXN0YW5jZSk6dGhpcy5fYnVmUGFyYW1zLmdldEpvaW5TdHlsZSgpPT09RmEuSk9JTl9CRVZFTD90aGlzLmFkZEJldmVsSm9pbih0aGlzLl9vZmZzZXQwLHRoaXMuX29mZnNldDEpOihlJiZ0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDAucDEpLHRoaXMuYWRkRmlsbGV0Q29ybmVyKHRoaXMuX3MxLHRoaXMuX29mZnNldDAucDEsdGhpcy5fb2Zmc2V0MS5wMCx0LHRoaXMuX2Rpc3RhbmNlKSx0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDEucDApKX0semEucHJvdG90eXBlLmNyZWF0ZVNxdWFyZT1mdW5jdGlvbih0KXt0aGlzLl9zZWdMaXN0LmFkZFB0KG5ldyB2aSh0LngrdGhpcy5fZGlzdGFuY2UsdC55K3RoaXMuX2Rpc3RhbmNlKSksdGhpcy5fc2VnTGlzdC5hZGRQdChuZXcgdmkodC54K3RoaXMuX2Rpc3RhbmNlLHQueS10aGlzLl9kaXN0YW5jZSkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQobmV3IHZpKHQueC10aGlzLl9kaXN0YW5jZSx0LnktdGhpcy5fZGlzdGFuY2UpKSx0aGlzLl9zZWdMaXN0LmFkZFB0KG5ldyB2aSh0LngtdGhpcy5fZGlzdGFuY2UsdC55K3RoaXMuX2Rpc3RhbmNlKSksdGhpcy5fc2VnTGlzdC5jbG9zZVJpbmcoKX0semEucHJvdG90eXBlLmFkZFNlZ21lbnRzPWZ1bmN0aW9uKHQsZSl7dGhpcy5fc2VnTGlzdC5hZGRQdHModCxlKX0semEucHJvdG90eXBlLmFkZEZpcnN0U2VnbWVudD1mdW5jdGlvbigpe3RoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MS5wMCl9LHphLnByb3RvdHlwZS5hZGRMYXN0U2VnbWVudD1mdW5jdGlvbigpe3RoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MS5wMSl9LHphLnByb3RvdHlwZS5pbml0U2lkZVNlZ21lbnRzPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9zMT10LHRoaXMuX3MyPWUsdGhpcy5fc2lkZT1uLHRoaXMuX3NlZzEuc2V0Q29vcmRpbmF0ZXModCxlKSx0aGlzLmNvbXB1dGVPZmZzZXRTZWdtZW50KHRoaXMuX3NlZzEsbix0aGlzLl9kaXN0YW5jZSx0aGlzLl9vZmZzZXQxKX0semEucHJvdG90eXBlLmFkZExpbWl0ZWRNaXRyZUpvaW49ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcy5fc2VnMC5wMSxvPUJhLmFuZ2xlKGksdGhpcy5fc2VnMC5wMCkscz1CYS5hbmdsZUJldHdlZW5PcmllbnRlZCh0aGlzLl9zZWcwLnAwLGksdGhpcy5fc2VnMS5wMSkvMixhPUJhLm5vcm1hbGl6ZShvK3MpLHU9QmEubm9ybWFsaXplKGErTWF0aC5QSSksYz1yKm4sbD1uLWMqTWF0aC5hYnMoTWF0aC5zaW4ocykpLGg9aS54K2MqTWF0aC5jb3ModSksZj1pLnkrYypNYXRoLnNpbih1KSxwPW5ldyB2aShoLGYpLGQ9bmV3IGJhKGkscCksZz1kLnBvaW50QWxvbmdPZmZzZXQoMSxsKSx5PWQucG9pbnRBbG9uZ09mZnNldCgxLC1sKTt0aGlzLl9zaWRlPT09RnMuTEVGVD8odGhpcy5fc2VnTGlzdC5hZGRQdChnKSx0aGlzLl9zZWdMaXN0LmFkZFB0KHkpKToodGhpcy5fc2VnTGlzdC5hZGRQdCh5KSx0aGlzLl9zZWdMaXN0LmFkZFB0KGcpKX0semEucHJvdG90eXBlLmNvbXB1dGVPZmZzZXRTZWdtZW50PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWU9PT1Gcy5MRUZUPzE6LTEsbz10LnAxLngtdC5wMC54LHM9dC5wMS55LXQucDAueSxhPU1hdGguc3FydChvKm8rcypzKSx1PWkqbipvL2EsYz1pKm4qcy9hO3IucDAueD10LnAwLngtYyxyLnAwLnk9dC5wMC55K3Usci5wMS54PXQucDEueC1jLHIucDEueT10LnAxLnkrdX0semEucHJvdG90eXBlLmFkZEZpbGxldEFyYz1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXI9PT1lby5DTE9DS1dJU0U/LTE6MSxzPU1hdGguYWJzKGUtbiksYT1NYXRoLnRydW5jKHMvdGhpcy5fZmlsbGV0QW5nbGVRdWFudHVtKy41KTtpZihhPDEpcmV0dXJuIG51bGw7Zm9yKHZhciB1PXMvYSxjPTAsbD1uZXcgdmk7YzxzOyl7dmFyIGg9ZStvKmM7bC54PXQueCtpKk1hdGguY29zKGgpLGwueT10LnkraSpNYXRoLnNpbihoKSx0aGlzLl9zZWdMaXN0LmFkZFB0KGwpLGMrPXV9fSx6YS5wcm90b3R5cGUuYWRkSW5zaWRlVHVybj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odGhpcy5fb2Zmc2V0MC5wMCx0aGlzLl9vZmZzZXQwLnAxLHRoaXMuX29mZnNldDEucDAsdGhpcy5fb2Zmc2V0MS5wMSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkpdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9saS5nZXRJbnRlcnNlY3Rpb24oMCkpO2Vsc2UgaWYodGhpcy5faGFzTmFycm93Q29uY2F2ZUFuZ2xlPSEwLHRoaXMuX29mZnNldDAucDEuZGlzdGFuY2UodGhpcy5fb2Zmc2V0MS5wMCk8dGhpcy5fZGlzdGFuY2UqemEuSU5TSURFX1RVUk5fVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SKXRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MC5wMSk7ZWxzZXtpZih0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDAucDEpLHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3I+MCl7dmFyIG49bmV3IHZpKCh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKnRoaXMuX29mZnNldDAucDEueCt0aGlzLl9zMS54KS8odGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3RvcisxKSwodGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcip0aGlzLl9vZmZzZXQwLnAxLnkrdGhpcy5fczEueSkvKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IrMSkpO3RoaXMuX3NlZ0xpc3QuYWRkUHQobik7dmFyIHI9bmV3IHZpKCh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKnRoaXMuX29mZnNldDEucDAueCt0aGlzLl9zMS54KS8odGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3RvcisxKSwodGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcip0aGlzLl9vZmZzZXQxLnAwLnkrdGhpcy5fczEueSkvKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IrMSkpO3RoaXMuX3NlZ0xpc3QuYWRkUHQocil9ZWxzZSB0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX3MxKTt0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDEucDApfX0semEucHJvdG90eXBlLmNyZWF0ZUNpcmNsZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdmkodC54K3RoaXMuX2Rpc3RhbmNlLHQueSk7dGhpcy5fc2VnTGlzdC5hZGRQdChlKSx0aGlzLmFkZEZpbGxldEFyYyh0LDAsMipNYXRoLlBJLC0xLHRoaXMuX2Rpc3RhbmNlKSx0aGlzLl9zZWdMaXN0LmNsb3NlUmluZygpfSx6YS5wcm90b3R5cGUuYWRkQmV2ZWxKb2luPWZ1bmN0aW9uKHQsZSl7dGhpcy5fc2VnTGlzdC5hZGRQdCh0LnAxKSx0aGlzLl9zZWdMaXN0LmFkZFB0KGUucDApfSx6YS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0KXt0aGlzLl9kaXN0YW5jZT10LHRoaXMuX21heEN1cnZlU2VnbWVudEVycm9yPXQqKDEtTWF0aC5jb3ModGhpcy5fZmlsbGV0QW5nbGVRdWFudHVtLzIpKSx0aGlzLl9zZWdMaXN0PW5ldyBQYSx0aGlzLl9zZWdMaXN0LnNldFByZWNpc2lvbk1vZGVsKHRoaXMuX3ByZWNpc2lvbk1vZGVsKSx0aGlzLl9zZWdMaXN0LnNldE1pbmltdW1WZXJ0ZXhEaXN0YW5jZSh0KnphLkNVUlZFX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUil9LHphLnByb3RvdHlwZS5hZGRDb2xsaW5lYXI9ZnVuY3Rpb24odCl7dGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0aGlzLl9zMCx0aGlzLl9zMSx0aGlzLl9zMSx0aGlzLl9zMiksdGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uTnVtKCk+PTImJih0aGlzLl9idWZQYXJhbXMuZ2V0Sm9pblN0eWxlKCk9PT1GYS5KT0lOX0JFVkVMfHx0aGlzLl9idWZQYXJhbXMuZ2V0Sm9pblN0eWxlKCk9PT1GYS5KT0lOX01JVFJFPyh0JiZ0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDAucDEpLHRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MS5wMCkpOnRoaXMuYWRkRmlsbGV0Q29ybmVyKHRoaXMuX3MxLHRoaXMuX29mZnNldDAucDEsdGhpcy5fb2Zmc2V0MS5wMCxlby5DTE9DS1dJU0UsdGhpcy5fZGlzdGFuY2UpKX0semEucHJvdG90eXBlLmNsb3NlUmluZz1mdW5jdGlvbigpe3RoaXMuX3NlZ0xpc3QuY2xvc2VSaW5nKCl9LHphLnByb3RvdHlwZS5oYXNOYXJyb3dDb25jYXZlQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzTmFycm93Q29uY2F2ZUFuZ2xlfSx6YS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0semEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHphfSxqYS5PRkZTRVRfU0VHTUVOVF9TRVBBUkFUSU9OX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDAxfSxqYS5JTlNJREVfVFVSTl9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLjAwMX0samEuQ1VSVkVfVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybiAxZS02fSxqYS5NQVhfQ0xPU0lOR19TRUdfTEVOX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gODB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHphLGphKTt2YXIgVWE9ZnVuY3Rpb24oKXt0aGlzLl9kaXN0YW5jZT0wLHRoaXMuX3ByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5fYnVmUGFyYW1zPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX3ByZWNpc2lvbk1vZGVsPXQsdGhpcy5fYnVmUGFyYW1zPWV9O1VhLnByb3RvdHlwZS5nZXRPZmZzZXRDdXJ2ZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2Rpc3RhbmNlPWUsMD09PWUpcmV0dXJuIG51bGw7dmFyIG49ZTwwLHI9TWF0aC5hYnMoZSksaT10aGlzLmdldFNlZ0dlbihyKTt0Lmxlbmd0aDw9MT90aGlzLmNvbXB1dGVQb2ludEN1cnZlKHRbMF0saSk6dGhpcy5jb21wdXRlT2Zmc2V0Q3VydmUodCxuLGkpO3ZhciBvPWkuZ2V0Q29vcmRpbmF0ZXMoKTtyZXR1cm4gbiYmRG8ucmV2ZXJzZShvKSxvfSxVYS5wcm90b3R5cGUuY29tcHV0ZVNpbmdsZVNpZGVkQnVmZmVyQ3VydmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuc2ltcGxpZnlUb2xlcmFuY2UodGhpcy5fZGlzdGFuY2UpO2lmKGUpe24uYWRkU2VnbWVudHModCwhMCk7dmFyIGk9T2Euc2ltcGxpZnkodCwtciksbz1pLmxlbmd0aC0xO24uaW5pdFNpZGVTZWdtZW50cyhpW29dLGlbby0xXSxGcy5MRUZUKSxuLmFkZEZpcnN0U2VnbWVudCgpO2Zvcih2YXIgcz1vLTI7cz49MDtzLS0pbi5hZGROZXh0U2VnbWVudChpW3NdLCEwKX1lbHNle24uYWRkU2VnbWVudHModCwhMSk7dmFyIGE9T2Euc2ltcGxpZnkodCxyKSx1PWEubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGFbMF0sYVsxXSxGcy5MRUZUKSxuLmFkZEZpcnN0U2VnbWVudCgpO2Zvcih2YXIgYz0yO2M8PXU7YysrKW4uYWRkTmV4dFNlZ21lbnQoYVtjXSwhMCl9bi5hZGRMYXN0U2VnbWVudCgpLG4uY2xvc2VSaW5nKCl9LFVhLnByb3RvdHlwZS5jb21wdXRlUmluZ0J1ZmZlckN1cnZlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnNpbXBsaWZ5VG9sZXJhbmNlKHRoaXMuX2Rpc3RhbmNlKTtlPT09RnMuUklHSFQmJihyPS1yKTt2YXIgaT1PYS5zaW1wbGlmeSh0LHIpLG89aS5sZW5ndGgtMTtuLmluaXRTaWRlU2VnbWVudHMoaVtvLTFdLGlbMF0sZSk7Zm9yKHZhciBzPTE7czw9bztzKyspe3ZhciBhPTEhPT1zO24uYWRkTmV4dFNlZ21lbnQoaVtzXSxhKX1uLmNsb3NlUmluZygpfSxVYS5wcm90b3R5cGUuY29tcHV0ZUxpbmVCdWZmZXJDdXJ2ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuc2ltcGxpZnlUb2xlcmFuY2UodGhpcy5fZGlzdGFuY2UpLHI9T2Euc2ltcGxpZnkodCxuKSxpPXIubGVuZ3RoLTE7ZS5pbml0U2lkZVNlZ21lbnRzKHJbMF0sclsxXSxGcy5MRUZUKTtmb3IodmFyIG89MjtvPD1pO28rKyllLmFkZE5leHRTZWdtZW50KHJbb10sITApO2UuYWRkTGFzdFNlZ21lbnQoKSxlLmFkZExpbmVFbmRDYXAocltpLTFdLHJbaV0pO3ZhciBzPU9hLnNpbXBsaWZ5KHQsLW4pLGE9cy5sZW5ndGgtMTtlLmluaXRTaWRlU2VnbWVudHMoc1thXSxzW2EtMV0sRnMuTEVGVCk7Zm9yKHZhciB1PWEtMjt1Pj0wO3UtLSllLmFkZE5leHRTZWdtZW50KHNbdV0sITApO2UuYWRkTGFzdFNlZ21lbnQoKSxlLmFkZExpbmVFbmRDYXAoc1sxXSxzWzBdKSxlLmNsb3NlUmluZygpfSxVYS5wcm90b3R5cGUuY29tcHV0ZVBvaW50Q3VydmU9ZnVuY3Rpb24odCxlKXtzd2l0Y2godGhpcy5fYnVmUGFyYW1zLmdldEVuZENhcFN0eWxlKCkpe2Nhc2UgRmEuQ0FQX1JPVU5EOmUuY3JlYXRlQ2lyY2xlKHQpO2JyZWFrO2Nhc2UgRmEuQ0FQX1NRVUFSRTplLmNyZWF0ZVNxdWFyZSh0KX19LFVhLnByb3RvdHlwZS5nZXRMaW5lQ3VydmU9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9kaXN0YW5jZT1lLGU8MCYmIXRoaXMuX2J1ZlBhcmFtcy5pc1NpbmdsZVNpZGVkKCl8fDA9PT1lKXJldHVybiBudWxsO3ZhciBuPU1hdGguYWJzKGUpLHI9dGhpcy5nZXRTZWdHZW4obik7aWYodC5sZW5ndGg8PTEpdGhpcy5jb21wdXRlUG9pbnRDdXJ2ZSh0WzBdLHIpO2Vsc2UgaWYodGhpcy5fYnVmUGFyYW1zLmlzU2luZ2xlU2lkZWQoKSl7dmFyIGk9ZTwwO3RoaXMuY29tcHV0ZVNpbmdsZVNpZGVkQnVmZmVyQ3VydmUodCxpLHIpfWVsc2UgdGhpcy5jb21wdXRlTGluZUJ1ZmZlckN1cnZlKHQscik7cmV0dXJuIHIuZ2V0Q29vcmRpbmF0ZXMoKX0sVWEucHJvdG90eXBlLmdldEJ1ZmZlclBhcmFtZXRlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYnVmUGFyYW1zfSxVYS5wcm90b3R5cGUuc2ltcGxpZnlUb2xlcmFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5fYnVmUGFyYW1zLmdldFNpbXBsaWZ5RmFjdG9yKCl9LFVhLnByb3RvdHlwZS5nZXRSaW5nQ3VydmU9ZnVuY3Rpb24odCxlLG4pe2lmKHRoaXMuX2Rpc3RhbmNlPW4sdC5sZW5ndGg8PTIpcmV0dXJuIHRoaXMuZ2V0TGluZUN1cnZlKHQsbik7aWYoMD09PW4pcmV0dXJuIFVhLmNvcHlDb29yZGluYXRlcyh0KTt2YXIgcj10aGlzLmdldFNlZ0dlbihuKTtyZXR1cm4gdGhpcy5jb21wdXRlUmluZ0J1ZmZlckN1cnZlKHQsZSxyKSxyLmdldENvb3JkaW5hdGVzKCl9LFVhLnByb3RvdHlwZS5jb21wdXRlT2Zmc2V0Q3VydmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuc2ltcGxpZnlUb2xlcmFuY2UodGhpcy5fZGlzdGFuY2UpO2lmKGUpe3ZhciBpPU9hLnNpbXBsaWZ5KHQsLXIpLG89aS5sZW5ndGgtMTtuLmluaXRTaWRlU2VnbWVudHMoaVtvXSxpW28tMV0sRnMuTEVGVCksbi5hZGRGaXJzdFNlZ21lbnQoKTtmb3IodmFyIHM9by0yO3M+PTA7cy0tKW4uYWRkTmV4dFNlZ21lbnQoaVtzXSwhMCl9ZWxzZXt2YXIgYT1PYS5zaW1wbGlmeSh0LHIpLHU9YS5sZW5ndGgtMTtuLmluaXRTaWRlU2VnbWVudHMoYVswXSxhWzFdLEZzLkxFRlQpLG4uYWRkRmlyc3RTZWdtZW50KCk7Zm9yKHZhciBjPTI7Yzw9dTtjKyspbi5hZGROZXh0U2VnbWVudChhW2NdLCEwKX1uLmFkZExhc3RTZWdtZW50KCl9LFVhLnByb3RvdHlwZS5nZXRTZWdHZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB6YSh0aGlzLl9wcmVjaXNpb25Nb2RlbCx0aGlzLl9idWZQYXJhbXMsdCl9LFVhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxVYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVWF9LFVhLmNvcHlDb29yZGluYXRlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQubGVuZ3RoKS5maWxsKG51bGwpLG49MDtuPGUubGVuZ3RoO24rKyllW25dPW5ldyB2aSh0W25dKTtyZXR1cm4gZX07dmFyIHFhPWZ1bmN0aW9uKCl7dGhpcy5fc3ViZ3JhcGhzPW51bGwsdGhpcy5fc2VnPW5ldyBiYSx0aGlzLl9jZ2E9bmV3IGVvO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9zdWJncmFwaHM9dH0sVmE9e0RlcHRoU2VnbWVudDp7Y29uZmlndXJhYmxlOiEwfX07cWEucHJvdG90eXBlLmZpbmRTdGFiYmVkU2VnbWVudHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49bmV3IHhvLHI9dGhpcy5fc3ViZ3JhcGhzLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKSxvPWkuZ2V0RW52ZWxvcGUoKTtlLnk8by5nZXRNaW5ZKCl8fGUueT5vLmdldE1heFkoKXx8dC5maW5kU3RhYmJlZFNlZ21lbnRzKGUsaS5nZXREaXJlY3RlZEVkZ2VzKCksbil9cmV0dXJuIG59aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoRWkoYXJndW1lbnRzWzJdLHZvKSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBLcylmb3IodmFyIHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdLHU9YXJndW1lbnRzWzJdLGM9YS5nZXRFZGdlKCkuZ2V0Q29vcmRpbmF0ZXMoKSxsPTA7bDxjLmxlbmd0aC0xO2wrKyl7aWYodC5fc2VnLnAwPWNbbF0sdC5fc2VnLnAxPWNbbCsxXSx0Ll9zZWcucDAueT50Ll9zZWcucDEueSYmdC5fc2VnLnJldmVyc2UoKSwhKE1hdGgubWF4KHQuX3NlZy5wMC54LHQuX3NlZy5wMS54KTxzLnh8fHQuX3NlZy5pc0hvcml6b250YWwoKXx8cy55PHQuX3NlZy5wMC55fHxzLnk+dC5fc2VnLnAxLnl8fGVvLmNvbXB1dGVPcmllbnRhdGlvbih0Ll9zZWcucDAsdC5fc2VnLnAxLHMpPT09ZW8uUklHSFQpKXt2YXIgaD1hLmdldERlcHRoKEZzLkxFRlQpO3QuX3NlZy5wMC5lcXVhbHMoY1tsXSl8fChoPWEuZ2V0RGVwdGgoRnMuUklHSFQpKTt2YXIgZj1uZXcgR2EodC5fc2VnLGgpO3UuYWRkKGYpfX1lbHNlIGlmKEVpKGFyZ3VtZW50c1syXSx2bykmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJkVpKGFyZ3VtZW50c1sxXSx2bykpZm9yKHZhciBwPWFyZ3VtZW50c1swXSxkPWFyZ3VtZW50c1syXSxnPWFyZ3VtZW50c1sxXS5pdGVyYXRvcigpO2cuaGFzTmV4dCgpOyl7dmFyIHk9Zy5uZXh0KCk7IXkuaXNGb3J3YXJkKCl8fHQuZmluZFN0YWJiZWRTZWdtZW50cyhwLHksZCl9fSxxYS5wcm90b3R5cGUuZ2V0RGVwdGg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5maW5kU3RhYmJlZFNlZ21lbnRzKHQpO3JldHVybiAwPT09ZS5zaXplKCk/MDphYS5taW4oZSkuX2xlZnREZXB0aH0scWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHFhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBxYX0sVmEuRGVwdGhTZWdtZW50LmdldD1mdW5jdGlvbigpe3JldHVybiBHYX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocWEsVmEpO3ZhciBHYT1mdW5jdGlvbigpe3RoaXMuX3Vwd2FyZFNlZz1udWxsLHRoaXMuX2xlZnREZXB0aD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl91cHdhcmRTZWc9bmV3IGJhKHQpLHRoaXMuX2xlZnREZXB0aD1lfTtHYS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7aWYodGhpcy5fdXB3YXJkU2VnLm1pblgoKT49ZS5fdXB3YXJkU2VnLm1heFgoKSlyZXR1cm4gMTtpZih0aGlzLl91cHdhcmRTZWcubWF4WCgpPD1lLl91cHdhcmRTZWcubWluWCgpKXJldHVybi0xO3ZhciBuPXRoaXMuX3Vwd2FyZFNlZy5vcmllbnRhdGlvbkluZGV4KGUuX3Vwd2FyZFNlZyk7cmV0dXJuIDAhPT1ufHwwIT09KG49LTEqZS5fdXB3YXJkU2VnLm9yaWVudGF0aW9uSW5kZXgodGhpcy5fdXB3YXJkU2VnKSk/bjp0aGlzLl91cHdhcmRTZWcuY29tcGFyZVRvKGUuX3Vwd2FyZFNlZyl9LEdhLnByb3RvdHlwZS5jb21wYXJlWD1mdW5jdGlvbih0LGUpe3ZhciBuPXQucDAuY29tcGFyZVRvKGUucDApO3JldHVybiAwIT09bj9uOnQucDEuY29tcGFyZVRvKGUucDEpfSxHYS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXB3YXJkU2VnLnRvU3RyaW5nKCl9LEdhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LEdhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBHYX07dmFyIFlhPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLnAwPXR8fG51bGwsdGhpcy5wMT1lfHxudWxsLHRoaXMucDI9bnx8bnVsbH07WWEucHJvdG90eXBlLmFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gWWEuYXJlYSh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5zaWduZWRBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIFlhLnNpZ25lZEFyZWEodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuaW50ZXJwb2xhdGVaPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10KXRocm93IG5ldyBoaTtyZXR1cm4gWWEuaW50ZXJwb2xhdGVaKHQsdGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUubG9uZ2VzdFNpZGVMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gWWEubG9uZ2VzdFNpZGVMZW5ndGgodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuaXNBY3V0ZT1mdW5jdGlvbigpe3JldHVybiBZYS5pc0FjdXRlKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLmNpcmN1bWNlbnRyZT1mdW5jdGlvbigpe3JldHVybiBZYS5jaXJjdW1jZW50cmUodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuYXJlYTNEPWZ1bmN0aW9uKCl7cmV0dXJuIFlhLmFyZWEzRCh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5jZW50cm9pZD1mdW5jdGlvbigpe3JldHVybiBZYS5jZW50cm9pZCh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5pbkNlbnRyZT1mdW5jdGlvbigpe3JldHVybiBZYS5pbkNlbnRyZSh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxZYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWWF9LFlhLmFyZWE9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNYXRoLmFicygoKG4ueC10LngpKihlLnktdC55KS0oZS54LXQueCkqKG4ueS10LnkpKS8yKX0sWWEuc2lnbmVkQXJlYT1mdW5jdGlvbih0LGUsbil7cmV0dXJuKChuLngtdC54KSooZS55LXQueSktKGUueC10LngpKihuLnktdC55KSkvMn0sWWEuZGV0PWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0KnItZSpufSxZYS5pbnRlcnBvbGF0ZVo9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ZS54LG89ZS55LHM9bi54LWksYT1yLngtaSx1PW4ueS1vLGM9ci55LW8sbD1zKmMtYSp1LGg9dC54LWksZj10LnktbyxwPShjKmgtYSpmKS9sLGQ9KC11KmgrcypmKS9sO3JldHVybiBlLnorcCoobi56LWUueikrZCooci56LWUueil9LFlhLmxvbmdlc3RTaWRlTGVuZ3RoPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmRpc3RhbmNlKGUpLGk9ZS5kaXN0YW5jZShuKSxvPW4uZGlzdGFuY2UodCkscz1yO3JldHVybiBpPnMmJihzPWkpLG8+cyYmKHM9byksc30sWWEuaXNBY3V0ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuISghQmEuaXNBY3V0ZSh0LGUsbil8fCFCYS5pc0FjdXRlKGUsbix0KXx8IUJhLmlzQWN1dGUobix0LGUpKX0sWWEuY2lyY3VtY2VudHJlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uLngsaT1uLnksbz10LngtcixzPXQueS1pLGE9ZS54LXIsdT1lLnktaSxjPTIqWWEuZGV0KG8scyxhLHUpLGw9WWEuZGV0KHMsbypvK3Mqcyx1LGEqYSt1KnUpLGg9WWEuZGV0KG8sbypvK3MqcyxhLGEqYSt1KnUpO3JldHVybiBuZXcgdmkoci1sL2MsaStoL2MpfSxZYS5wZXJwZW5kaWN1bGFyQmlzZWN0b3I9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLngtdC54LHI9ZS55LXQueSxpPW5ldyB6aSh0Lngrbi8yLHQueStyLzIsMSksbz1uZXcgemkodC54LXIrbi8yLHQueStuK3IvMiwxKTtyZXR1cm4gbmV3IHppKGksbyl9LFlhLmFuZ2xlQmlzZWN0b3I9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUuZGlzdGFuY2UodCksaT1yLyhyK2UuZGlzdGFuY2UobikpLG89bi54LXQueCxzPW4ueS10Lnk7cmV0dXJuIG5ldyB2aSh0LngraSpvLHQueStpKnMpfSxZYS5hcmVhM0Q9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUueC10LngsaT1lLnktdC55LG89ZS56LXQueixzPW4ueC10LngsYT1uLnktdC55LHU9bi56LXQueixjPWkqdS1vKmEsbD1vKnMtcip1LGg9ciphLWkqcyxmPWMqYytsKmwraCpoO3JldHVybiBNYXRoLnNxcnQoZikvMn0sWWEuY2VudHJvaWQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPSh0LngrZS54K24ueCkvMyxpPSh0LnkrZS55K24ueSkvMztyZXR1cm4gbmV3IHZpKHIsaSl9LFlhLmluQ2VudHJlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLmRpc3RhbmNlKG4pLGk9dC5kaXN0YW5jZShuKSxvPXQuZGlzdGFuY2UoZSkscz1yK2krbyxhPShyKnQueCtpKmUueCtvKm4ueCkvcyx1PShyKnQueStpKmUueStvKm4ueSkvcztyZXR1cm4gbmV3IHZpKGEsdSl9O3ZhciBYYT1mdW5jdGlvbigpe3RoaXMuX2lucHV0R2VvbT1udWxsLHRoaXMuX2Rpc3RhbmNlPW51bGwsdGhpcy5fY3VydmVCdWlsZGVyPW51bGwsdGhpcy5fY3VydmVMaXN0PW5ldyB4bzt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07dGhpcy5faW5wdXRHZW9tPXQsdGhpcy5fZGlzdGFuY2U9ZSx0aGlzLl9jdXJ2ZUJ1aWxkZXI9bn07WGEucHJvdG90eXBlLmFkZFBvaW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2Rpc3RhbmNlPD0wKXJldHVybiBudWxsO3ZhciBlPXQuZ2V0Q29vcmRpbmF0ZXMoKSxuPXRoaXMuX2N1cnZlQnVpbGRlci5nZXRMaW5lQ3VydmUoZSx0aGlzLl9kaXN0YW5jZSk7dGhpcy5hZGRDdXJ2ZShuLGJpLkVYVEVSSU9SLGJpLklOVEVSSU9SKX0sWGEucHJvdG90eXBlLmFkZFBvbHlnb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuX2Rpc3RhbmNlLHI9RnMuTEVGVDt0aGlzLl9kaXN0YW5jZTwwJiYobj0tdGhpcy5fZGlzdGFuY2Uscj1Gcy5SSUdIVCk7dmFyIGk9dC5nZXRFeHRlcmlvclJpbmcoKSxvPURvLnJlbW92ZVJlcGVhdGVkUG9pbnRzKGkuZ2V0Q29vcmRpbmF0ZXMoKSk7aWYodGhpcy5fZGlzdGFuY2U8MCYmdGhpcy5pc0Vyb2RlZENvbXBsZXRlbHkoaSx0aGlzLl9kaXN0YW5jZSl8fHRoaXMuX2Rpc3RhbmNlPD0wJiZvLmxlbmd0aDwzKXJldHVybiBudWxsO3RoaXMuYWRkUG9seWdvblJpbmcobyxuLHIsYmkuRVhURVJJT1IsYmkuSU5URVJJT1IpO2Zvcih2YXIgcz0wO3M8dC5nZXROdW1JbnRlcmlvclJpbmcoKTtzKyspe3ZhciBhPXQuZ2V0SW50ZXJpb3JSaW5nTihzKSx1PURvLnJlbW92ZVJlcGVhdGVkUG9pbnRzKGEuZ2V0Q29vcmRpbmF0ZXMoKSk7ZS5fZGlzdGFuY2U+MCYmZS5pc0Vyb2RlZENvbXBsZXRlbHkoYSwtZS5fZGlzdGFuY2UpfHxlLmFkZFBvbHlnb25SaW5nKHUsbixGcy5vcHBvc2l0ZShyKSxiaS5JTlRFUklPUixiaS5FWFRFUklPUil9fSxYYS5wcm90b3R5cGUuaXNUcmlhbmdsZUVyb2RlZENvbXBsZXRlbHk9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgWWEodFswXSx0WzFdLHRbMl0pLHI9bi5pbkNlbnRyZSgpO3JldHVybiBlby5kaXN0YW5jZVBvaW50TGluZShyLG4ucDAsbi5wMSk8TWF0aC5hYnMoZSl9LFhhLnByb3RvdHlwZS5hZGRMaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2Rpc3RhbmNlPD0wJiYhdGhpcy5fY3VydmVCdWlsZGVyLmdldEJ1ZmZlclBhcmFtZXRlcnMoKS5pc1NpbmdsZVNpZGVkKCkpcmV0dXJuIG51bGw7dmFyIGU9RG8ucmVtb3ZlUmVwZWF0ZWRQb2ludHModC5nZXRDb29yZGluYXRlcygpKSxuPXRoaXMuX2N1cnZlQnVpbGRlci5nZXRMaW5lQ3VydmUoZSx0aGlzLl9kaXN0YW5jZSk7dGhpcy5hZGRDdXJ2ZShuLGJpLkVYVEVSSU9SLGJpLklOVEVSSU9SKX0sWGEucHJvdG90eXBlLmFkZEN1cnZlPWZ1bmN0aW9uKHQsZSxuKXtpZihudWxsPT09dHx8dC5sZW5ndGg8MilyZXR1cm4gbnVsbDt2YXIgcj1uZXcgd2EodCxuZXcganMoMCxiaS5CT1VOREFSWSxlLG4pKTt0aGlzLl9jdXJ2ZUxpc3QuYWRkKHIpfSxYYS5wcm90b3R5cGUuZ2V0Q3VydmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMuX2lucHV0R2VvbSksdGhpcy5fY3VydmVMaXN0fSxYYS5wcm90b3R5cGUuYWRkUG9seWdvblJpbmc9ZnVuY3Rpb24odCxlLG4scixpKXtpZigwPT09ZSYmdC5sZW5ndGg8cHMuTUlOSU1VTV9WQUxJRF9TSVpFKXJldHVybiBudWxsO3ZhciBvPXIscz1pO3QubGVuZ3RoPj1wcy5NSU5JTVVNX1ZBTElEX1NJWkUmJmVvLmlzQ0NXKHQpJiYobz1pLHM9cixuPUZzLm9wcG9zaXRlKG4pKTt2YXIgYT10aGlzLl9jdXJ2ZUJ1aWxkZXIuZ2V0UmluZ0N1cnZlKHQsbixlKTt0aGlzLmFkZEN1cnZlKGEsbyxzKX0sWGEucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtpZih0LmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt0IGluc3RhbmNlb2YgaHM/dGhpcy5hZGRQb2x5Z29uKHQpOnQgaW5zdGFuY2VvZiBhcz90aGlzLmFkZExpbmVTdHJpbmcodCk6dCBpbnN0YW5jZW9mIGNzP3RoaXMuYWRkUG9pbnQodCk6KHQgaW5zdGFuY2VvZiBmc3x8dCBpbnN0YW5jZW9mIFpvfHx0IGluc3RhbmNlb2YgZHN8fHQgaW5zdGFuY2VvZiBIbykmJnRoaXMuYWRkQ29sbGVjdGlvbih0KX0sWGEucHJvdG90eXBlLmlzRXJvZGVkQ29tcGxldGVseT1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0Q29vcmRpbmF0ZXMoKTtpZihuLmxlbmd0aDw0KXJldHVybiBlPDA7aWYoND09PW4ubGVuZ3RoKXJldHVybiB0aGlzLmlzVHJpYW5nbGVFcm9kZWRDb21wbGV0ZWx5KG4sZSk7dmFyIHI9dC5nZXRFbnZlbG9wZUludGVybmFsKCksaT1NYXRoLm1pbihyLmdldEhlaWdodCgpLHIuZ2V0V2lkdGgoKSk7cmV0dXJuIGU8MCYmMipNYXRoLmFicyhlKT5pfSxYYS5wcm90b3R5cGUuYWRkQ29sbGVjdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQuZ2V0TnVtR2VvbWV0cmllcygpO2UrKyl7dmFyIG49dC5nZXRHZW9tZXRyeU4oZSk7dGhpcy5hZGQobil9fSxYYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWGEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFhhfTt2YXIgV2E9ZnVuY3Rpb24oKXt9O1dhLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24odCl7fSxXYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sV2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFdhfTt2YXIgSGE9ZnVuY3Rpb24oKXt0aGlzLl9wYXJlbnQ9bnVsbCx0aGlzLl9hdFN0YXJ0PW51bGwsdGhpcy5fbWF4PW51bGwsdGhpcy5faW5kZXg9bnVsbCx0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3I9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fcGFyZW50PXQsdGhpcy5fYXRTdGFydD0hMCx0aGlzLl9pbmRleD0wLHRoaXMuX21heD10LmdldE51bUdlb21ldHJpZXMoKX07SGEucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9hdFN0YXJ0KXJldHVybiB0aGlzLl9hdFN0YXJ0PSExLEhhLmlzQXRvbWljKHRoaXMuX3BhcmVudCkmJnRoaXMuX2luZGV4KyssdGhpcy5fcGFyZW50O2lmKG51bGwhPT10aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3Ipe2lmKHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCkpcmV0dXJuIHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvci5uZXh0KCk7dGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yPW51bGx9aWYodGhpcy5faW5kZXg+PXRoaXMuX21heCl0aHJvdyBuZXcgX287dmFyIHQ9dGhpcy5fcGFyZW50LmdldEdlb21ldHJ5Tih0aGlzLl9pbmRleCsrKTtyZXR1cm4gdCBpbnN0YW5jZW9mIEhvPyh0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3I9bmV3IEhhKHQpLHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvci5uZXh0KCkpOnR9LEhhLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSl9LEhhLnByb3RvdHlwZS5oYXNOZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5fYXRTdGFydClyZXR1cm4hMDtpZihudWxsIT09dGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yKXtpZih0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKXJldHVybiEwO3RoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcj1udWxsfXJldHVybiEodGhpcy5faW5kZXg+PXRoaXMuX21heCl9LEhhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblttb119LEhhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBIYX0sSGEuaXNBdG9taWM9ZnVuY3Rpb24odCl7cmV0dXJuISh0IGluc3RhbmNlb2YgSG8pfTt2YXIgWmE9ZnVuY3Rpb24oKXt0aGlzLl9nZW9tPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2dlb209dH07WmEucHJvdG90eXBlLmxvY2F0ZT1mdW5jdGlvbih0KXtyZXR1cm4gWmEubG9jYXRlKHQsdGhpcy5fZ2VvbSl9LFphLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltXYV19LFphLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBaYX0sWmEuaXNQb2ludEluUmluZz1mdW5jdGlvbih0LGUpe3JldHVybiEhZS5nZXRFbnZlbG9wZUludGVybmFsKCkuaW50ZXJzZWN0cyh0KSYmZW8uaXNQb2ludEluUmluZyh0LGUuZ2V0Q29vcmRpbmF0ZXMoKSl9LFphLmNvbnRhaW5zUG9pbnRJblBvbHlnb249ZnVuY3Rpb24odCxlKXtpZihlLmlzRW1wdHkoKSlyZXR1cm4hMTt2YXIgbj1lLmdldEV4dGVyaW9yUmluZygpO2lmKCFaYS5pc1BvaW50SW5SaW5nKHQsbikpcmV0dXJuITE7Zm9yKHZhciByPTA7cjxlLmdldE51bUludGVyaW9yUmluZygpO3IrKyl7dmFyIGk9ZS5nZXRJbnRlcmlvclJpbmdOKHIpO2lmKFphLmlzUG9pbnRJblJpbmcodCxpKSlyZXR1cm4hMX1yZXR1cm4hMH0sWmEuY29udGFpbnNQb2ludD1mdW5jdGlvbih0LGUpe2lmKGUgaW5zdGFuY2VvZiBocylyZXR1cm4gWmEuY29udGFpbnNQb2ludEluUG9seWdvbih0LGUpO2lmKGUgaW5zdGFuY2VvZiBIbylmb3IodmFyIG49bmV3IEhhKGUpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7aWYociE9PWUmJlphLmNvbnRhaW5zUG9pbnQodCxyKSlyZXR1cm4hMH1yZXR1cm4hMX0sWmEubG9jYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaXNFbXB0eSgpP2JpLkVYVEVSSU9SOlphLmNvbnRhaW5zUG9pbnQodCxlKT9iaS5JTlRFUklPUjpiaS5FWFRFUklPUn07dmFyIEthPWZ1bmN0aW9uKCl7dGhpcy5fZWRnZU1hcD1uZXcga28sdGhpcy5fZWRnZUxpc3Q9bnVsbCx0aGlzLl9wdEluQXJlYUxvY2F0aW9uPVtiaS5OT05FLGJpLk5PTkVdfTtLYS5wcm90b3R5cGUuZ2V0TmV4dENXPWZ1bmN0aW9uKHQpe3RoaXMuZ2V0RWRnZXMoKTt2YXIgZT10aGlzLl9lZGdlTGlzdC5pbmRleE9mKHQpLG49ZS0xO3JldHVybiAwPT09ZSYmKG49dGhpcy5fZWRnZUxpc3Quc2l6ZSgpLTEpLHRoaXMuX2VkZ2VMaXN0LmdldChuKX0sS2EucHJvdG90eXBlLnByb3BhZ2F0ZVNpZGVMYWJlbHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWJpLk5PTkUsbj10aGlzLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKS5nZXRMYWJlbCgpO3IuaXNBcmVhKHQpJiZyLmdldExvY2F0aW9uKHQsRnMuTEVGVCkhPT1iaS5OT05FJiYoZT1yLmdldExvY2F0aW9uKHQsRnMuTEVGVCkpfWlmKGU9PT1iaS5OT05FKXJldHVybiBudWxsO2Zvcih2YXIgaT1lLG89dGhpcy5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCksYT1zLmdldExhYmVsKCk7aWYoYS5nZXRMb2NhdGlvbih0LEZzLk9OKT09PWJpLk5PTkUmJmEuc2V0TG9jYXRpb24odCxGcy5PTixpKSxhLmlzQXJlYSh0KSl7dmFyIHU9YS5nZXRMb2NhdGlvbih0LEZzLkxFRlQpLGM9YS5nZXRMb2NhdGlvbih0LEZzLlJJR0hUKTtpZihjIT09YmkuTk9ORSl7aWYoYyE9PWkpdGhyb3cgbmV3IFJzKCJzaWRlIGxvY2F0aW9uIGNvbmZsaWN0IixzLmdldENvb3JkaW5hdGUoKSk7dT09PWJpLk5PTkUmJlppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJmb3VuZCBzaW5nbGUgbnVsbCBzaWRlIChhdCAiK3MuZ2V0Q29vcmRpbmF0ZSgpKyIpIiksaT11fWVsc2UgWmkuaXNUcnVlKGEuZ2V0TG9jYXRpb24odCxGcy5MRUZUKT09PWJpLk5PTkUsImZvdW5kIHNpbmdsZSBudWxsIHNpZGUiKSxhLnNldExvY2F0aW9uKHQsRnMuUklHSFQsaSksYS5zZXRMb2NhdGlvbih0LEZzLkxFRlQsaSl9fX0sS2EucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLml0ZXJhdG9yKCk7cmV0dXJuIHQuaGFzTmV4dCgpP3QubmV4dCgpLmdldENvb3JkaW5hdGUoKTpudWxsfSxLYS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7a2kub3V0LnByaW50bG4oIkVkZ2VFbmRTdGFyOiAgICIrdGhpcy5nZXRDb29yZGluYXRlKCkpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5wcmludCh0KX19LEthLnByb3RvdHlwZS5pc0FyZWFMYWJlbHNDb25zaXN0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbXB1dGVFZGdlRW5kTGFiZWxzKHQuZ2V0Qm91bmRhcnlOb2RlUnVsZSgpKSx0aGlzLmNoZWNrQXJlYUxhYmVsc0NvbnNpc3RlbnQoMCl9LEthLnByb3RvdHlwZS5jaGVja0FyZWFMYWJlbHNDb25zaXN0ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RWRnZXMoKTtpZihlLnNpemUoKTw9MClyZXR1cm4hMDt2YXIgbj1lLnNpemUoKS0xLHI9ZS5nZXQobikuZ2V0TGFiZWwoKS5nZXRMb2NhdGlvbih0LEZzLkxFRlQpO1ppLmlzVHJ1ZShyIT09YmkuTk9ORSwiRm91bmQgdW5sYWJlbGxlZCBhcmVhIGVkZ2UiKTtmb3IodmFyIGk9cixvPXRoaXMuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspe3ZhciBzPW8ubmV4dCgpLmdldExhYmVsKCk7WmkuaXNUcnVlKHMuaXNBcmVhKHQpLCJGb3VuZCBub24tYXJlYSBlZGdlIik7dmFyIGE9cy5nZXRMb2NhdGlvbih0LEZzLkxFRlQpLHU9cy5nZXRMb2NhdGlvbih0LEZzLlJJR0hUKTtpZihhPT09dXx8dSE9PWkpcmV0dXJuITE7aT1hfXJldHVybiEwfSxLYS5wcm90b3R5cGUuZmluZEluZGV4PWZ1bmN0aW9uKHQpe3RoaXMuaXRlcmF0b3IoKTtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2VMaXN0LnNpemUoKTtlKyspe2lmKHRoaXMuX2VkZ2VMaXN0LmdldChlKT09PXQpcmV0dXJuIGV9cmV0dXJuLTF9LEthLnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEVkZ2VzKCkuaXRlcmF0b3IoKX0sS2EucHJvdG90eXBlLmdldEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9lZGdlTGlzdCYmKHRoaXMuX2VkZ2VMaXN0PW5ldyB4byh0aGlzLl9lZGdlTWFwLnZhbHVlcygpKSksdGhpcy5fZWRnZUxpc3R9LEthLnByb3RvdHlwZS5nZXRMb2NhdGlvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX3B0SW5BcmVhTG9jYXRpb25bdF09PT1iaS5OT05FJiYodGhpcy5fcHRJbkFyZWFMb2NhdGlvblt0XT1aYS5sb2NhdGUoZSxuW3RdLmdldEdlb21ldHJ5KCkpKSx0aGlzLl9wdEluQXJlYUxvY2F0aW9uW3RdfSxLYS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQWk7dC5hcHBlbmQoIkVkZ2VFbmRTdGFyOiAgICIrdGhpcy5nZXRDb29yZGluYXRlKCkpLHQuYXBwZW5kKCJcbiIpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0LmFwcGVuZChuKSx0LmFwcGVuZCgiXG4iKX1yZXR1cm4gdC50b1N0cmluZygpfSxLYS5wcm90b3R5cGUuY29tcHV0ZUVkZ2VFbmRMYWJlbHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLmNvbXB1dGVMYWJlbCh0KX19LEthLnByb3RvdHlwZS5jb21wdXRlTGFiZWxsaW5nPWZ1bmN0aW9uKHQpe3RoaXMuY29tcHV0ZUVkZ2VFbmRMYWJlbHModFswXS5nZXRCb3VuZGFyeU5vZGVSdWxlKCkpLHRoaXMucHJvcGFnYXRlU2lkZUxhYmVscygwKSx0aGlzLnByb3BhZ2F0ZVNpZGVMYWJlbHMoMSk7Zm9yKHZhciBlPVshMSwhMV0sbj10aGlzLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KWZvcih2YXIgcj1uLm5leHQoKS5nZXRMYWJlbCgpLGk9MDtpPDI7aSsrKXIuaXNMaW5lKGkpJiZyLmdldExvY2F0aW9uKGkpPT09YmkuQk9VTkRBUlkmJihlW2ldPSEwKTtmb3IodmFyIG89dGhpcy5pdGVyYXRvcigpO28uaGFzTmV4dCgpOylmb3IodmFyIHM9by5uZXh0KCksYT1zLmdldExhYmVsKCksdT0wO3U8Mjt1KyspaWYoYS5pc0FueU51bGwodSkpe3ZhciBjPWJpLk5PTkU7aWYoZVt1XSljPWJpLkVYVEVSSU9SO2Vsc2V7dmFyIGw9cy5nZXRDb29yZGluYXRlKCk7Yz10aGlzLmdldExvY2F0aW9uKHUsbCx0KX1hLnNldEFsbExvY2F0aW9uc0lmTnVsbCh1LGMpfX0sS2EucHJvdG90eXBlLmdldERlZ3JlZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlTWFwLnNpemUoKX0sS2EucHJvdG90eXBlLmluc2VydEVkZ2VFbmQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9lZGdlTWFwLnB1dCh0LGUpLHRoaXMuX2VkZ2VMaXN0PW51bGx9LEthLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxLYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gS2F9O3ZhciBKYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdD1udWxsLHRoaXMuX2xhYmVsPW51bGwsdGhpcy5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HPTEsdGhpcy5fTElOS0lOR19UT19PVVRHT0lORz0yfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5nZXRSZXN1bHRBcmVhRWRnZXMoKTtmb3IodmFyIGU9bnVsbCxuPW51bGwscj10aGlzLl9TQ0FOTklOR19GT1JfSU5DT01JTkcsaT0wO2k8dGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0LnNpemUoKTtpKyspe3ZhciBvPXQuX3Jlc3VsdEFyZWFFZGdlTGlzdC5nZXQoaSkscz1vLmdldFN5bSgpO2lmKG8uZ2V0TGFiZWwoKS5pc0FyZWEoKSlzd2l0Y2gobnVsbD09PWUmJm8uaXNJblJlc3VsdCgpJiYoZT1vKSxyKXtjYXNlIHQuX1NDQU5OSU5HX0ZPUl9JTkNPTUlORzppZighcy5pc0luUmVzdWx0KCkpY29udGludWU7bj1zLHI9dC5fTElOS0lOR19UT19PVVRHT0lORzticmVhaztjYXNlIHQuX0xJTktJTkdfVE9fT1VUR09JTkc6aWYoIW8uaXNJblJlc3VsdCgpKWNvbnRpbnVlO24uc2V0TmV4dChvKSxyPXQuX1NDQU5OSU5HX0ZPUl9JTkNPTUlOR319aWYocj09PXRoaXMuX0xJTktJTkdfVE9fT1VUR09JTkcpe2lmKG51bGw9PT1lKXRocm93IG5ldyBScygibm8gb3V0Z29pbmcgZGlyRWRnZSBmb3VuZCIsdGhpcy5nZXRDb29yZGluYXRlKCkpO1ppLmlzVHJ1ZShlLmlzSW5SZXN1bHQoKSwidW5hYmxlIHRvIGxpbmsgbGFzdCBpbmNvbWluZyBkaXJFZGdlIiksbi5zZXROZXh0KGUpfX0sZS5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQpe3ZhciBlPXQ7dGhpcy5pbnNlcnRFZGdlRW5kKGUsZSl9LGUucHJvdG90eXBlLmdldFJpZ2h0bW9zdEVkZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEVkZ2VzKCksZT10LnNpemUoKTtpZihlPDEpcmV0dXJuIG51bGw7dmFyIG49dC5nZXQoMCk7aWYoMT09PWUpcmV0dXJuIG47dmFyIHI9dC5nZXQoZS0xKSxpPW4uZ2V0UXVhZHJhbnQoKSxvPXIuZ2V0UXVhZHJhbnQoKTtyZXR1cm4gV3MuaXNOb3J0aGVybihpKSYmV3MuaXNOb3J0aGVybihvKT9uOldzLmlzTm9ydGhlcm4oaSl8fFdzLmlzTm9ydGhlcm4obyk/MCE9PW4uZ2V0RHkoKT9uOjAhPT1yLmdldER5KCk/cjooWmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoImZvdW5kIHR3byBob3Jpem9udGFsIGVkZ2VzIGluY2lkZW50IG9uIG5vZGUiKSxudWxsKTpyfSxlLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXtraS5vdXQucHJpbnRsbigiRGlyZWN0ZWRFZGdlU3RhcjogIit0aGlzLmdldENvb3JkaW5hdGUoKSk7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3QucHJpbnQoIm91dCAiKSxuLnByaW50KHQpLHQucHJpbnRsbigpLHQucHJpbnQoImluICIpLG4uZ2V0U3ltKCkucHJpbnQodCksdC5wcmludGxuKCl9fSxlLnByb3RvdHlwZS5nZXRSZXN1bHRBcmVhRWRnZXM9ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0KXJldHVybiB0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3Q7dGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0PW5ldyB4bztmb3IodmFyIHQ9dGhpcy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCk7KGUuaXNJblJlc3VsdCgpfHxlLmdldFN5bSgpLmlzSW5SZXN1bHQoKSkmJnRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdC5hZGQoZSl9cmV0dXJuIHRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdH0sZS5wcm90b3R5cGUudXBkYXRlTGFiZWxsaW5nPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKS5nZXRMYWJlbCgpO24uc2V0QWxsTG9jYXRpb25zSWZOdWxsKDAsdC5nZXRMb2NhdGlvbigwKSksbi5zZXRBbGxMb2NhdGlvbnNJZk51bGwoMSx0LmdldExvY2F0aW9uKDEpKX19LGUucHJvdG90eXBlLmxpbmtBbGxEaXJlY3RlZEVkZ2VzPWZ1bmN0aW9uKCl7dGhpcy5nZXRFZGdlcygpO2Zvcih2YXIgdD1udWxsLGU9bnVsbCxuPXRoaXMuX2VkZ2VMaXN0LnNpemUoKS0xO24+PTA7bi0tKXt2YXIgcj10aGlzLl9lZGdlTGlzdC5nZXQobiksaT1yLmdldFN5bSgpO251bGw9PT1lJiYoZT1pKSxudWxsIT09dCYmaS5zZXROZXh0KHQpLHQ9cn1lLnNldE5leHQodCl9LGUucHJvdG90eXBlLmNvbXB1dGVEZXB0aHM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dGhpcy5maW5kSW5kZXgodCksbj10LmdldERlcHRoKEZzLkxFRlQpLHI9dC5nZXREZXB0aChGcy5SSUdIVCksaT10aGlzLmNvbXB1dGVEZXB0aHMoZSsxLHRoaXMuX2VkZ2VMaXN0LnNpemUoKSxuKTtpZih0aGlzLmNvbXB1dGVEZXB0aHMoMCxlLGkpIT09cil0aHJvdyBuZXcgUnMoImRlcHRoIG1pc21hdGNoIGF0ICIrdC5nZXRDb29yZGluYXRlKCkpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbMF07YTxvO2ErKyl7dmFyIHU9dGhpcy5fZWRnZUxpc3QuZ2V0KGEpO3Uuc2V0RWRnZURlcHRocyhGcy5SSUdIVCxzKSxzPXUuZ2V0RGVwdGgoRnMuTEVGVCl9cmV0dXJuIHN9fSxlLnByb3RvdHlwZS5tZXJnZVN5bUxhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKTtlLmdldExhYmVsKCkubWVyZ2UoZS5nZXRTeW0oKS5nZXRMYWJlbCgpKX19LGUucHJvdG90eXBlLmxpbmtNaW5pbWFsRGlyZWN0ZWRFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPW51bGwscj1udWxsLGk9dGhpcy5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HLG89dGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0LnNpemUoKS0xO28+PTA7by0tKXt2YXIgcz1lLl9yZXN1bHRBcmVhRWRnZUxpc3QuZ2V0KG8pLGE9cy5nZXRTeW0oKTtzd2l0Y2gobnVsbD09PW4mJnMuZ2V0RWRnZVJpbmcoKT09PXQmJihuPXMpLGkpe2Nhc2UgZS5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HOmlmKGEuZ2V0RWRnZVJpbmcoKSE9PXQpY29udGludWU7cj1hLGk9ZS5fTElOS0lOR19UT19PVVRHT0lORzticmVhaztjYXNlIGUuX0xJTktJTkdfVE9fT1VUR09JTkc6aWYocy5nZXRFZGdlUmluZygpIT09dCljb250aW51ZTtyLnNldE5leHRNaW4ocyksaT1lLl9TQ0FOTklOR19GT1JfSU5DT01JTkd9fWk9PT10aGlzLl9MSU5LSU5HX1RPX09VVEdPSU5HJiYoWmkuaXNUcnVlKG51bGwhPT1uLCJmb3VuZCBudWxsIGZvciBmaXJzdCBvdXRnb2luZyBkaXJFZGdlIiksWmkuaXNUcnVlKG4uZ2V0RWRnZVJpbmcoKT09PXQsInVuYWJsZSB0byBsaW5rIGxhc3QgaW5jb21pbmcgZGlyRWRnZSIpLHIuc2V0TmV4dE1pbihuKSl9LGUucHJvdG90eXBlLmdldE91dGdvaW5nRGVncmVlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD0wLGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkuaXNJblJlc3VsdCgpJiZ0Kyt9cmV0dXJuIHR9aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgbj1hcmd1bWVudHNbMF0scj0wLGk9dGhpcy5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7aS5uZXh0KCkuZ2V0RWRnZVJpbmcoKT09PW4mJnIrK31yZXR1cm4gcn19LGUucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfSxlLnByb3RvdHlwZS5maW5kQ292ZXJlZExpbmVFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1iaS5OT05FLGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkscj1uLmdldFN5bSgpO2lmKCFuLmlzTGluZUVkZ2UoKSl7aWYobi5pc0luUmVzdWx0KCkpe3Q9YmkuSU5URVJJT1I7YnJlYWt9aWYoci5pc0luUmVzdWx0KCkpe3Q9YmkuRVhURVJJT1I7YnJlYWt9fX1pZih0PT09YmkuTk9ORSlyZXR1cm4gbnVsbDtmb3IodmFyIGk9dCxvPXRoaXMuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspe3ZhciBzPW8ubmV4dCgpLGE9cy5nZXRTeW0oKTtzLmlzTGluZUVkZ2UoKT9zLmdldEVkZ2UoKS5zZXRDb3ZlcmVkKGk9PT1iaS5JTlRFUklPUik6KHMuaXNJblJlc3VsdCgpJiYoaT1iaS5FWFRFUklPUiksYS5pc0luUmVzdWx0KCkmJihpPWJpLklOVEVSSU9SKSl9fSxlLnByb3RvdHlwZS5jb21wdXRlTGFiZWxsaW5nPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLmNvbXB1dGVMYWJlbGxpbmcuY2FsbCh0aGlzLGUpLHRoaXMuX2xhYmVsPW5ldyBqcyhiaS5OT05FKTtmb3IodmFyIG49dGhpcy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOylmb3IodmFyIHI9bi5uZXh0KCkuZ2V0RWRnZSgpLmdldExhYmVsKCksaT0wO2k8MjtpKyspe3ZhciBvPXIuZ2V0TG9jYXRpb24oaSk7KG89PT1iaS5JTlRFUklPUnx8bz09PWJpLkJPVU5EQVJZKSYmdGhpcy5fbGFiZWwuc2V0TG9jYXRpb24oaSxiaS5JTlRFUklPUil9fSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShLYSksUWE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5jcmVhdGVOb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWXModCxuZXcgSmEpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShKcyksJGE9ZnVuY3Rpb24gdCgpe3RoaXMuX3B0cz1udWxsLHRoaXMuX29yaWVudGF0aW9uPW51bGw7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX3B0cz1lLHRoaXMuX29yaWVudGF0aW9uPXQub3JpZW50YXRpb24oZSl9OyRhLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gJGEuY29tcGFyZU9yaWVudGVkKHRoaXMuX3B0cyx0aGlzLl9vcmllbnRhdGlvbixlLl9wdHMsZS5fb3JpZW50YXRpb24pfSwkYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSwkYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gJGF9LCRhLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiAxPT09RG8uaW5jcmVhc2luZ0RpcmVjdGlvbih0KX0sJGEuY29tcGFyZU9yaWVudGVkPWZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaT1lPzE6LTEsbz1yPzE6LTEscz1lP3QubGVuZ3RoOi0xLGE9cj9uLmxlbmd0aDotMSx1PWU/MDp0Lmxlbmd0aC0xLGM9cj8wOm4ubGVuZ3RoLTE7Oyl7dmFyIGw9dFt1XS5jb21wYXJlVG8obltjXSk7aWYoMCE9PWwpcmV0dXJuIGw7dmFyIGg9KHUrPWkpPT09cyxmPShjKz1vKT09PWE7aWYoaCYmIWYpcmV0dXJuLTE7aWYoIWgmJmYpcmV0dXJuIDE7aWYoaCYmZilyZXR1cm4gMH19O3ZhciB0dT1mdW5jdGlvbigpe3RoaXMuX2VkZ2VzPW5ldyB4byx0aGlzLl9vY2FNYXA9bmV3IGtvfTt0dS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludCgiTVVMVElMSU5FU1RSSU5HICggIik7Zm9yKHZhciBlPTA7ZTx0aGlzLl9lZGdlcy5zaXplKCk7ZSsrKXt2YXIgbj10aGlzLl9lZGdlcy5nZXQoZSk7ZT4wJiZ0LnByaW50KCIsIiksdC5wcmludCgiKCIpO2Zvcih2YXIgcj1uLmdldENvb3JkaW5hdGVzKCksaT0wO2k8ci5sZW5ndGg7aSsrKWk+MCYmdC5wcmludCgiLCIpLHQucHJpbnQocltpXS54KyIgIityW2ldLnkpO3QucHJpbnRsbigiKSIpfXQucHJpbnQoIikgICIpfSx0dS5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXRoaXMuYWRkKGUubmV4dCgpKX0sdHUucHJvdG90eXBlLmZpbmRFZGdlSW5kZXg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9lZGdlcy5zaXplKCk7ZSsrKWlmKHRoaXMuX2VkZ2VzLmdldChlKS5lcXVhbHModCkpcmV0dXJuIGU7cmV0dXJuLTF9LHR1LnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlcy5pdGVyYXRvcigpfSx0dS5wcm90b3R5cGUuZ2V0RWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZXN9LHR1LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2VkZ2VzLmdldCh0KX0sdHUucHJvdG90eXBlLmZpbmRFcXVhbEVkZ2U9ZnVuY3Rpb24odCl7dmFyIGU9bmV3ICRhKHQuZ2V0Q29vcmRpbmF0ZXMoKSk7cmV0dXJuIHRoaXMuX29jYU1hcC5nZXQoZSl9LHR1LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5fZWRnZXMuYWRkKHQpO3ZhciBlPW5ldyAkYSh0LmdldENvb3JkaW5hdGVzKCkpO3RoaXMuX29jYU1hcC5wdXQoZSx0KX0sdHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHR1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB0dX07dmFyIGV1PWZ1bmN0aW9uKCl7fTtldS5wcm90b3R5cGUucHJvY2Vzc0ludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4scil7fSxldS5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7fSxldS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV1fTt2YXIgbnU9ZnVuY3Rpb24oKXt0aGlzLl9oYXNJbnRlcnNlY3Rpb249ITEsdGhpcy5faGFzUHJvcGVyPSExLHRoaXMuX2hhc1Byb3BlckludGVyaW9yPSExLHRoaXMuX2hhc0ludGVyaW9yPSExLHRoaXMuX3Byb3BlckludGVyc2VjdGlvblBvaW50PW51bGwsdGhpcy5fbGk9bnVsbCx0aGlzLl9pc1NlbGZJbnRlcnNlY3Rpb249bnVsbCx0aGlzLm51bUludGVyc2VjdGlvbnM9MCx0aGlzLm51bUludGVyaW9ySW50ZXJzZWN0aW9ucz0wLHRoaXMubnVtUHJvcGVySW50ZXJzZWN0aW9ucz0wLHRoaXMubnVtVGVzdHM9MDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbGk9dH07bnUucHJvdG90eXBlLmlzVHJpdmlhbEludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixyKXtpZih0PT09biYmMT09PXRoaXMuX2xpLmdldEludGVyc2VjdGlvbk51bSgpKXtpZihudS5pc0FkamFjZW50U2VnbWVudHMoZSxyKSlyZXR1cm4hMDtpZih0LmlzQ2xvc2VkKCkpe3ZhciBpPXQuc2l6ZSgpLTE7aWYoMD09PWUmJnI9PT1pfHwwPT09ciYmZT09PWkpcmV0dXJuITB9fXJldHVybiExfSxudS5wcm90b3R5cGUuZ2V0UHJvcGVySW50ZXJzZWN0aW9uUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVySW50ZXJzZWN0aW9uUG9pbnR9LG51LnByb3RvdHlwZS5oYXNQcm9wZXJJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcn0sbnUucHJvdG90eXBlLmdldExpbmVJbnRlcnNlY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9saX0sbnUucHJvdG90eXBlLmhhc1Byb3BlckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJ9LG51LnByb3RvdHlwZS5wcm9jZXNzSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbixyKXtpZih0PT09biYmZT09PXIpcmV0dXJuIG51bGw7dGhpcy5udW1UZXN0cysrO3ZhciBpPXQuZ2V0Q29vcmRpbmF0ZXMoKVtlXSxvPXQuZ2V0Q29vcmRpbmF0ZXMoKVtlKzFdLHM9bi5nZXRDb29yZGluYXRlcygpW3JdLGE9bi5nZXRDb29yZGluYXRlcygpW3IrMV07dGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbihpLG8scyxhKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSYmKHRoaXMubnVtSW50ZXJzZWN0aW9ucysrLHRoaXMuX2xpLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oKSYmKHRoaXMubnVtSW50ZXJpb3JJbnRlcnNlY3Rpb25zKyssdGhpcy5faGFzSW50ZXJpb3I9ITApLHRoaXMuaXNUcml2aWFsSW50ZXJzZWN0aW9uKHQsZSxuLHIpfHwodGhpcy5faGFzSW50ZXJzZWN0aW9uPSEwLHQuYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxlLDApLG4uYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxyLDEpLHRoaXMuX2xpLmlzUHJvcGVyKCkmJih0aGlzLm51bVByb3BlckludGVyc2VjdGlvbnMrKyx0aGlzLl9oYXNQcm9wZXI9ITAsdGhpcy5faGFzUHJvcGVySW50ZXJpb3I9ITApKSl9LG51LnByb3RvdHlwZS5oYXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzSW50ZXJzZWN0aW9ufSxudS5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuITF9LG51LnByb3RvdHlwZS5oYXNJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNJbnRlcmlvcn0sbnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2V1XX0sbnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG51fSxudS5pc0FkamFjZW50U2VnbWVudHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMT09PU1hdGguYWJzKHQtZSl9O3ZhciBydT1mdW5jdGlvbigpe3RoaXMuY29vcmQ9bnVsbCx0aGlzLnNlZ21lbnRJbmRleD1udWxsLHRoaXMuZGlzdD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTt0aGlzLmNvb3JkPW5ldyB2aSh0KSx0aGlzLnNlZ21lbnRJbmRleD1lLHRoaXMuZGlzdD1ufTtydS5wcm90b3R5cGUuZ2V0U2VnbWVudEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VnbWVudEluZGV4fSxydS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvb3JkfSxydS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludCh0aGlzLmNvb3JkKSx0LnByaW50KCIgc2VnICMgPSAiK3RoaXMuc2VnbWVudEluZGV4KSx0LnByaW50bG4oIiBkaXN0ID0gIit0aGlzLmRpc3QpfSxydS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuY29tcGFyZShlLnNlZ21lbnRJbmRleCxlLmRpc3QpfSxydS5wcm90b3R5cGUuaXNFbmRQb2ludD1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXRoaXMuc2VnbWVudEluZGV4JiYwPT09dGhpcy5kaXN0fHx0aGlzLnNlZ21lbnRJbmRleD09PXR9LHJ1LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvb3JkKyIgc2VnICMgPSAiK3RoaXMuc2VnbWVudEluZGV4KyIgZGlzdCA9ICIrdGhpcy5kaXN0fSxydS5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXN0fSxydS5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnNlZ21lbnRJbmRleDx0Py0xOnRoaXMuc2VnbWVudEluZGV4PnQ/MTp0aGlzLmRpc3Q8ZT8tMTp0aGlzLmRpc3Q+ZT8xOjB9LHJ1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LHJ1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBydX07dmFyIGl1PWZ1bmN0aW9uKCl7dGhpcy5fbm9kZU1hcD1uZXcga28sdGhpcy5lZGdlPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuZWRnZT10fTtpdS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludGxuKCJJbnRlcnNlY3Rpb25zOiIpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5wcmludCh0KX19LGl1LnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlTWFwLnZhbHVlcygpLml0ZXJhdG9yKCl9LGl1LnByb3RvdHlwZS5hZGRTcGxpdEVkZ2VzPWZ1bmN0aW9uKHQpe3RoaXMuYWRkRW5kcG9pbnRzKCk7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKSxuPWUubmV4dCgpO2UuaGFzTmV4dCgpOyl7dmFyIHI9ZS5uZXh0KCksaT10aGlzLmNyZWF0ZVNwbGl0RWRnZShuLHIpO3QuYWRkKGkpLG49cn19LGl1LnByb3RvdHlwZS5hZGRFbmRwb2ludHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVkZ2UucHRzLmxlbmd0aC0xO3RoaXMuYWRkKHRoaXMuZWRnZS5wdHNbMF0sMCwwKSx0aGlzLmFkZCh0aGlzLmVkZ2UucHRzW3RdLHQsMCl9LGl1LnByb3RvdHlwZS5jcmVhdGVTcGxpdEVkZ2U9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnNlZ21lbnRJbmRleC10LnNlZ21lbnRJbmRleCsyLHI9dGhpcy5lZGdlLnB0c1tlLnNlZ21lbnRJbmRleF0saT1lLmRpc3Q+MHx8IWUuY29vcmQuZXF1YWxzMkQocik7aXx8bi0tO3ZhciBvPW5ldyBBcnJheShuKS5maWxsKG51bGwpLHM9MDtvW3MrK109bmV3IHZpKHQuY29vcmQpO2Zvcih2YXIgYT10LnNlZ21lbnRJbmRleCsxO2E8PWUuc2VnbWVudEluZGV4O2ErKylvW3MrK109dGhpcy5lZGdlLnB0c1thXTtyZXR1cm4gaSYmKG9bc109ZS5jb29yZCksbmV3IGN1KG8sbmV3IGpzKHRoaXMuZWRnZS5fbGFiZWwpKX0saXUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IHJ1KHQsZSxuKSxpPXRoaXMuX25vZGVNYXAuZ2V0KHIpO3JldHVybiBudWxsIT09aT9pOih0aGlzLl9ub2RlTWFwLnB1dChyLHIpLHIpfSxpdS5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2lmKGUubmV4dCgpLmNvb3JkLmVxdWFscyh0KSlyZXR1cm4hMH1yZXR1cm4hMX0saXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGl1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBpdX07dmFyIG91PWZ1bmN0aW9uKCl7fTtvdS5wcm90b3R5cGUuZ2V0Q2hhaW5TdGFydEluZGljZXM9ZnVuY3Rpb24odCl7dmFyIGU9MCxuPW5ldyB4bztuLmFkZChuZXcgTmkoZSkpO2Rve3ZhciByPXRoaXMuZmluZENoYWluRW5kKHQsZSk7bi5hZGQobmV3IE5pKHIpKSxlPXJ9d2hpbGUoZTx0Lmxlbmd0aC0xKTtyZXR1cm4gb3UudG9JbnRBcnJheShuKX0sb3UucHJvdG90eXBlLmZpbmRDaGFpbkVuZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1Xcy5xdWFkcmFudCh0W2VdLHRbZSsxXSkscj1lKzE7cjx0Lmxlbmd0aDspe2lmKFdzLnF1YWRyYW50KHRbci0xXSx0W3JdKSE9PW4pYnJlYWs7cisrfXJldHVybiByLTF9LG91LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxvdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gb3V9LG91LnRvSW50QXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT10LmdldChuKS5pbnRWYWx1ZSgpO3JldHVybiBlfTt2YXIgc3U9ZnVuY3Rpb24oKXt0aGlzLmU9bnVsbCx0aGlzLnB0cz1udWxsLHRoaXMuc3RhcnRJbmRleD1udWxsLHRoaXMuZW52MT1uZXcgamksdGhpcy5lbnYyPW5ldyBqaTt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5lPXQsdGhpcy5wdHM9dC5nZXRDb29yZGluYXRlcygpO3ZhciBlPW5ldyBvdTt0aGlzLnN0YXJ0SW5kZXg9ZS5nZXRDaGFpblN0YXJ0SW5kaWNlcyh0aGlzLnB0cyl9O3N1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnB0c30sc3UucHJvdG90eXBlLmdldE1heFg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wdHNbdGhpcy5zdGFydEluZGV4W3RdXS54LG49dGhpcy5wdHNbdGhpcy5zdGFydEluZGV4W3QrMV1dLng7cmV0dXJuIGU+bj9lOm59LHN1LnByb3RvdHlwZS5nZXRNaW5YPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHRzW3RoaXMuc3RhcnRJbmRleFt0XV0ueCxuPXRoaXMucHRzW3RoaXMuc3RhcnRJbmRleFt0KzFdXS54O3JldHVybiBlPG4/ZTpufSxzdS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbj1mdW5jdGlvbigpe2lmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1hcmd1bWVudHNbM107dGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKHRoaXMuc3RhcnRJbmRleFt0XSx0aGlzLnN0YXJ0SW5kZXhbdCsxXSxlLGUuc3RhcnRJbmRleFtuXSxlLnN0YXJ0SW5kZXhbbisxXSxyKX1lbHNlIGlmKDY9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbM10sdT1hcmd1bWVudHNbNF0sYz1hcmd1bWVudHNbNV0sbD10aGlzLnB0c1tpXSxoPXRoaXMucHRzW29dLGY9cy5wdHNbYV0scD1zLnB0c1t1XTtpZihvLWk9PTEmJnUtYT09MSlyZXR1cm4gYy5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuZSxpLHMuZSxhKSxudWxsO2lmKHRoaXMuZW52MS5pbml0KGwsaCksdGhpcy5lbnYyLmluaXQoZixwKSwhdGhpcy5lbnYxLmludGVyc2VjdHModGhpcy5lbnYyKSlyZXR1cm4gbnVsbDt2YXIgZD1NYXRoLnRydW5jKChpK28pLzIpLGc9TWF0aC50cnVuYygoYSt1KS8yKTtpPGQmJihhPGcmJnRoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbihpLGQscyxhLGcsYyksZzx1JiZ0aGlzLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4oaSxkLHMsZyx1LGMpKSxkPG8mJihhPGcmJnRoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbihkLG8scyxhLGcsYyksZzx1JiZ0aGlzLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4oZCxvLHMsZyx1LGMpKX19LHN1LnByb3RvdHlwZS5nZXRTdGFydEluZGV4ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydEluZGV4fSxzdS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHRoaXMuc3RhcnRJbmRleC5sZW5ndGgtMTtuKyspZm9yKHZhciByPTA7cjx0LnN0YXJ0SW5kZXgubGVuZ3RoLTE7cisrKXRoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbihuLHQscixlKX0sc3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHN1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBzdX07dmFyIGF1PWZ1bmN0aW9uIHQoKXt0aGlzLl9kZXB0aD1BcnJheSgyKS5maWxsKCkubWFwKChmdW5jdGlvbigpe3JldHVybiBBcnJheSgzKX0pKTtmb3IodmFyIGU9MDtlPDI7ZSsrKWZvcih2YXIgbj0wO248MztuKyspdGhpcy5fZGVwdGhbZV1bbl09dC5OVUxMX1ZBTFVFfSx1dT17TlVMTF9WQUxVRTp7Y29uZmlndXJhYmxlOiEwfX07YXUucHJvdG90eXBlLmdldERlcHRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2RlcHRoW3RdW2VdfSxhdS5wcm90b3R5cGUuc2V0RGVwdGg9ZnVuY3Rpb24odCxlLG4pe3RoaXMuX2RlcHRoW3RdW2VdPW59LGF1LnByb3RvdHlwZS5pc051bGw9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciB0PTA7dDwyO3QrKylmb3IodmFyIGU9MDtlPDM7ZSsrKWlmKHRoaXMuX2RlcHRoW3RdW2VdIT09YXUuTlVMTF9WQUxVRSlyZXR1cm4hMTtyZXR1cm4hMH1pZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl9kZXB0aFtuXVsxXT09PWF1Lk5VTExfVkFMVUV9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5fZGVwdGhbcl1baV09PT1hdS5OVUxMX1ZBTFVFfX0sYXUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9MDtlPDI7ZSsrKWlmKCF0LmlzTnVsbChlKSl7dmFyIG49dC5fZGVwdGhbZV1bMV07dC5fZGVwdGhbZV1bMl08biYmKG49dC5fZGVwdGhbZV1bMl0pLG48MCYmKG49MCk7Zm9yKHZhciByPTE7cjwzO3IrKyl7dmFyIGk9MDt0Ll9kZXB0aFtlXVtyXT5uJiYoaT0xKSx0Ll9kZXB0aFtlXVtyXT1pfX19LGF1LnByb3RvdHlwZS5nZXREZWx0YT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGVwdGhbdF1bRnMuUklHSFRdLXRoaXMuX2RlcHRoW3RdW0ZzLkxFRlRdfSxhdS5wcm90b3R5cGUuZ2V0TG9jYXRpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGVwdGhbdF1bZV08PTA/YmkuRVhURVJJT1I6YmkuSU5URVJJT1J9LGF1LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJBOiAiK3RoaXMuX2RlcHRoWzBdWzFdKyIsIit0aGlzLl9kZXB0aFswXVsyXSsiIEI6ICIrdGhpcy5fZGVwdGhbMV1bMV0rIiwiK3RoaXMuX2RlcHRoWzFdWzJdfSxhdS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49MDtuPDI7bisrKWZvcih2YXIgcj0xO3I8MztyKyspe3ZhciBpPWUuZ2V0TG9jYXRpb24obixyKTsoaT09PWJpLkVYVEVSSU9SfHxpPT09YmkuSU5URVJJT1IpJiYodC5pc051bGwobixyKT90Ll9kZXB0aFtuXVtyXT1hdS5kZXB0aEF0TG9jYXRpb24oaSk6dC5fZGVwdGhbbl1bcl0rPWF1LmRlcHRoQXRMb2NhdGlvbihpKSl9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdO2FyZ3VtZW50c1syXT09PWJpLklOVEVSSU9SJiZ0aGlzLl9kZXB0aFtvXVtzXSsrfX0sYXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGF1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBhdX0sYXUuZGVwdGhBdExvY2F0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09YmkuRVhURVJJT1I/MDp0PT09YmkuSU5URVJJT1I/MTphdS5OVUxMX1ZBTFVFfSx1dS5OVUxMX1ZBTFVFLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhhdSx1dSk7dmFyIGN1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtpZih0LmNhbGwodGhpcyksdGhpcy5wdHM9bnVsbCx0aGlzLl9lbnY9bnVsbCx0aGlzLmVpTGlzdD1uZXcgaXUodGhpcyksdGhpcy5fbmFtZT1udWxsLHRoaXMuX21jZT1udWxsLHRoaXMuX2lzSXNvbGF0ZWQ9ITAsdGhpcy5fZGVwdGg9bmV3IGF1LHRoaXMuX2RlcHRoRGVsdGE9MCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdO2UuY2FsbCh0aGlzLG4sbnVsbCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3RoaXMucHRzPXIsdGhpcy5fbGFiZWw9aX19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldERlcHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlcHRofSxlLnByb3RvdHlwZS5nZXRDb2xsYXBzZWRFZGdlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KDIpLmZpbGwobnVsbCk7cmV0dXJuIHRbMF09dGhpcy5wdHNbMF0sdFsxXT10aGlzLnB0c1sxXSxuZXcgZSh0LGpzLnRvTGluZUxhYmVsKHRoaXMuX2xhYmVsKSl9LGUucHJvdG90eXBlLmlzSXNvbGF0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNJc29sYXRlZH0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdHN9LGUucHJvdG90eXBlLnNldElzb2xhdGVkPWZ1bmN0aW9uKHQpe3RoaXMuX2lzSXNvbGF0ZWQ9dH0sZS5wcm90b3R5cGUuc2V0TmFtZT1mdW5jdGlvbih0KXt0aGlzLl9uYW1lPXR9LGUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBlKSlyZXR1cm4hMTt2YXIgbj10O2lmKHRoaXMucHRzLmxlbmd0aCE9PW4ucHRzLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHI9ITAsaT0hMCxvPXRoaXMucHRzLmxlbmd0aCxzPTA7czx0aGlzLnB0cy5sZW5ndGg7cysrKWlmKHRoaXMucHRzW3NdLmVxdWFsczJEKG4ucHRzW3NdKXx8KHI9ITEpLHRoaXMucHRzW3NdLmVxdWFsczJEKG4ucHRzWy0tb10pfHwoaT0hMSksIXImJiFpKXJldHVybiExO3JldHVybiEwfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMucHRzLmxlbmd0aD4wP3RoaXMucHRzWzBdOm51bGw7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5wdHNbdF19fSxlLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50KCJlZGdlICIrdGhpcy5fbmFtZSsiOiAiKSx0LnByaW50KCJMSU5FU1RSSU5HICgiKTtmb3IodmFyIGU9MDtlPHRoaXMucHRzLmxlbmd0aDtlKyspZT4wJiZ0LnByaW50KCIsIiksdC5wcmludCh0aGlzLnB0c1tlXS54KyIgIit0aGlzLnB0c1tlXS55KTt0LnByaW50KCIpICAiK3RoaXMuX2xhYmVsKyIgIit0aGlzLl9kZXB0aERlbHRhKX0sZS5wcm90b3R5cGUuY29tcHV0ZUlNPWZ1bmN0aW9uKHQpe2UudXBkYXRlSU0odGhpcy5fbGFiZWwsdCl9LGUucHJvdG90eXBlLmlzQ29sbGFwc2VkPWZ1bmN0aW9uKCl7cmV0dXJuISghdGhpcy5fbGFiZWwuaXNBcmVhKCl8fDMhPT10aGlzLnB0cy5sZW5ndGgpJiYhIXRoaXMucHRzWzBdLmVxdWFscyh0aGlzLnB0c1syXSl9LGUucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzWzBdLmVxdWFscyh0aGlzLnB0c1t0aGlzLnB0cy5sZW5ndGgtMV0pfSxlLnByb3RvdHlwZS5nZXRNYXhpbXVtU2VnbWVudEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzLmxlbmd0aC0xfSxlLnByb3RvdHlwZS5nZXREZXB0aERlbHRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlcHRoRGVsdGF9LGUucHJvdG90eXBlLmdldE51bVBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnB0cy5sZW5ndGh9LGUucHJvdG90eXBlLnByaW50UmV2ZXJzZT1mdW5jdGlvbih0KXt0LnByaW50KCJlZGdlICIrdGhpcy5fbmFtZSsiOiAiKTtmb3IodmFyIGU9dGhpcy5wdHMubGVuZ3RoLTE7ZT49MDtlLS0pdC5wcmludCh0aGlzLnB0c1tlXSsiICIpO3QucHJpbnRsbigiIil9LGUucHJvdG90eXBlLmdldE1vbm90b25lQ2hhaW5FZGdlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9tY2UmJih0aGlzLl9tY2U9bmV3IHN1KHRoaXMpKSx0aGlzLl9tY2V9LGUucHJvdG90eXBlLmdldEVudmVsb3BlPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX2Vudil7dGhpcy5fZW52PW5ldyBqaTtmb3IodmFyIHQ9MDt0PHRoaXMucHRzLmxlbmd0aDt0KyspdGhpcy5fZW52LmV4cGFuZFRvSW5jbHVkZSh0aGlzLnB0c1t0XSl9cmV0dXJuIHRoaXMuX2Vudn0sZS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW5ldyB2aSh0LmdldEludGVyc2VjdGlvbihyKSksbz1lLHM9dC5nZXRFZGdlRGlzdGFuY2UobixyKSxhPW8rMTtpZihhPHRoaXMucHRzLmxlbmd0aCl7dmFyIHU9dGhpcy5wdHNbYV07aS5lcXVhbHMyRCh1KSYmKG89YSxzPTApfXRoaXMuZWlMaXN0LmFkZChpLG8scyl9LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFpO3QuYXBwZW5kKCJlZGdlICIrdGhpcy5fbmFtZSsiOiAiKSx0LmFwcGVuZCgiTElORVNUUklORyAoIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnB0cy5sZW5ndGg7ZSsrKWU+MCYmdC5hcHBlbmQoIiwiKSx0LmFwcGVuZCh0aGlzLnB0c1tlXS54KyIgIit0aGlzLnB0c1tlXS55KTtyZXR1cm4gdC5hcHBlbmQoIikgICIrdGhpcy5fbGFiZWwrIiAiK3RoaXMuX2RlcHRoRGVsdGEpLHQudG9TdHJpbmcoKX0sZS5wcm90b3R5cGUuaXNQb2ludHdpc2VFcXVhbD1mdW5jdGlvbih0KXtpZih0aGlzLnB0cy5sZW5ndGghPT10LnB0cy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBlPTA7ZTx0aGlzLnB0cy5sZW5ndGg7ZSsrKWlmKCF0aGlzLnB0c1tlXS5lcXVhbHMyRCh0LnB0c1tlXSkpcmV0dXJuITE7cmV0dXJuITB9LGUucHJvdG90eXBlLnNldERlcHRoRGVsdGE9ZnVuY3Rpb24odCl7dGhpcy5fZGVwdGhEZWx0YT10fSxlLnByb3RvdHlwZS5nZXRFZGdlSW50ZXJzZWN0aW9uTGlzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVpTGlzdH0sZS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTA7cjx0LmdldEludGVyc2VjdGlvbk51bSgpO3IrKyl0aGlzLmFkZEludGVyc2VjdGlvbih0LGUsbixyKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS51cGRhdGVJTT1mdW5jdGlvbigpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS51cGRhdGVJTS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO24uc2V0QXRMZWFzdElmVmFsaWQoZS5nZXRMb2NhdGlvbigwLEZzLk9OKSxlLmdldExvY2F0aW9uKDEsRnMuT04pLDEpLGUuaXNBcmVhKCkmJihuLnNldEF0TGVhc3RJZlZhbGlkKGUuZ2V0TG9jYXRpb24oMCxGcy5MRUZUKSxlLmdldExvY2F0aW9uKDEsRnMuTEVGVCksMiksbi5zZXRBdExlYXN0SWZWYWxpZChlLmdldExvY2F0aW9uKDAsRnMuUklHSFQpLGUuZ2V0TG9jYXRpb24oMSxGcy5SSUdIVCksMikpfSxlfShHcyksbHU9ZnVuY3Rpb24odCl7dGhpcy5fd29ya2luZ1ByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5fd29ya2luZ05vZGVyPW51bGwsdGhpcy5fZ2VvbUZhY3Q9bnVsbCx0aGlzLl9ncmFwaD1udWxsLHRoaXMuX2VkZ2VMaXN0PW5ldyB0dSx0aGlzLl9idWZQYXJhbXM9dHx8bnVsbH07bHUucHJvdG90eXBlLnNldFdvcmtpbmdQcmVjaXNpb25Nb2RlbD1mdW5jdGlvbih0KXt0aGlzLl93b3JraW5nUHJlY2lzaW9uTW9kZWw9dH0sbHUucHJvdG90eXBlLmluc2VydFVuaXF1ZUVkZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZWRnZUxpc3QuZmluZEVxdWFsRWRnZSh0KTtpZihudWxsIT09ZSl7dmFyIG49ZS5nZXRMYWJlbCgpLHI9dC5nZXRMYWJlbCgpO2UuaXNQb2ludHdpc2VFcXVhbCh0KXx8KHI9bmV3IGpzKHQuZ2V0TGFiZWwoKSkpLmZsaXAoKSxuLm1lcmdlKHIpO3ZhciBpPWx1LmRlcHRoRGVsdGEociksbz1lLmdldERlcHRoRGVsdGEoKStpO2Uuc2V0RGVwdGhEZWx0YShvKX1lbHNlIHRoaXMuX2VkZ2VMaXN0LmFkZCh0KSx0LnNldERlcHRoRGVsdGEobHUuZGVwdGhEZWx0YSh0LmdldExhYmVsKCkpKX0sbHUucHJvdG90eXBlLmJ1aWxkU3ViZ3JhcGhzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyB4byxyPXQuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpLG89aS5nZXRSaWdodG1vc3RDb29yZGluYXRlKCkscz1uZXcgcWEobikuZ2V0RGVwdGgobyk7aS5jb21wdXRlRGVwdGgocyksaS5maW5kUmVzdWx0RWRnZXMoKSxuLmFkZChpKSxlLmFkZChpLmdldERpcmVjdGVkRWRnZXMoKSxpLmdldE5vZGVzKCkpfX0sbHUucHJvdG90eXBlLmNyZWF0ZVN1YmdyYXBocz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49dC5nZXROb2RlcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZighci5pc1Zpc2l0ZWQoKSl7dmFyIGk9bmV3IGtzO2kuY3JlYXRlKHIpLGUuYWRkKGkpfX1yZXR1cm4gYWEuc29ydChlLGFhLnJldmVyc2VPcmRlcigpKSxlfSxsdS5wcm90b3R5cGUuY3JlYXRlRW1wdHlSZXN1bHRHZW9tZXRyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZW9tRmFjdC5jcmVhdGVQb2x5Z29uKCl9LGx1LnByb3RvdHlwZS5nZXROb2Rlcj1mdW5jdGlvbih0KXtpZihudWxsIT09dGhpcy5fd29ya2luZ05vZGVyKXJldHVybiB0aGlzLl93b3JraW5nTm9kZXI7dmFyIGU9bmV3IElhLG49bmV3IFFpO3JldHVybiBuLnNldFByZWNpc2lvbk1vZGVsKHQpLGUuc2V0U2VnbWVudEludGVyc2VjdG9yKG5ldyBudShuKSksZX0sbHUucHJvdG90eXBlLmJ1ZmZlcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3dvcmtpbmdQcmVjaXNpb25Nb2RlbDtudWxsPT09biYmKG49dC5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9nZW9tRmFjdD10LmdldEZhY3RvcnkoKTt2YXIgcj1uZXcgVWEobix0aGlzLl9idWZQYXJhbXMpLGk9bmV3IFhhKHQsZSxyKS5nZXRDdXJ2ZXMoKTtpZihpLnNpemUoKTw9MClyZXR1cm4gdGhpcy5jcmVhdGVFbXB0eVJlc3VsdEdlb21ldHJ5KCk7dGhpcy5jb21wdXRlTm9kZWRFZGdlcyhpLG4pLHRoaXMuX2dyYXBoPW5ldyBRcyhuZXcgUWEpLHRoaXMuX2dyYXBoLmFkZEVkZ2VzKHRoaXMuX2VkZ2VMaXN0LmdldEVkZ2VzKCkpO3ZhciBvPXRoaXMuY3JlYXRlU3ViZ3JhcGhzKHRoaXMuX2dyYXBoKSxzPW5ldyAkcyh0aGlzLl9nZW9tRmFjdCk7dGhpcy5idWlsZFN1YmdyYXBocyhvLHMpO3ZhciBhPXMuZ2V0UG9seWdvbnMoKTtyZXR1cm4gYS5zaXplKCk8PTA/dGhpcy5jcmVhdGVFbXB0eVJlc3VsdEdlb21ldHJ5KCk6dGhpcy5fZ2VvbUZhY3QuYnVpbGRHZW9tZXRyeShhKX0sbHUucHJvdG90eXBlLmNvbXB1dGVOb2RlZEVkZ2VzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXROb2RlcihlKTtuLmNvbXB1dGVOb2Rlcyh0KTtmb3IodmFyIHI9bi5nZXROb2RlZFN1YnN0cmluZ3MoKS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCksbz1pLmdldENvb3JkaW5hdGVzKCk7aWYoMiE9PW8ubGVuZ3RofHwhb1swXS5lcXVhbHMyRChvWzFdKSl7dmFyIHM9aS5nZXREYXRhKCksYT1uZXcgY3UoaS5nZXRDb29yZGluYXRlcygpLG5ldyBqcyhzKSk7dGhpcy5pbnNlcnRVbmlxdWVFZGdlKGEpfX19LGx1LnByb3RvdHlwZS5zZXROb2Rlcj1mdW5jdGlvbih0KXt0aGlzLl93b3JraW5nTm9kZXI9dH0sbHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGx1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBsdX0sbHUuZGVwdGhEZWx0YT1mdW5jdGlvbih0KXt2YXIgZT10LmdldExvY2F0aW9uKDAsRnMuTEVGVCksbj10LmdldExvY2F0aW9uKDAsRnMuUklHSFQpO3JldHVybiBlPT09YmkuSU5URVJJT1ImJm49PT1iaS5FWFRFUklPUj8xOmU9PT1iaS5FWFRFUklPUiYmbj09PWJpLklOVEVSSU9SPy0xOjB9LGx1LmNvbnZlcnRTZWdTdHJpbmdzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgSXMsbj1uZXcgeG87dC5oYXNOZXh0KCk7KXt2YXIgcj10Lm5leHQoKSxpPWUuY3JlYXRlTGluZVN0cmluZyhyLmdldENvb3JkaW5hdGVzKCkpO24uYWRkKGkpfXJldHVybiBlLmJ1aWxkR2VvbWV0cnkobil9O3ZhciBodT1mdW5jdGlvbigpe2lmKHRoaXMuX25vZGVyPW51bGwsdGhpcy5fc2NhbGVGYWN0b3I9bnVsbCx0aGlzLl9vZmZzZXRYPW51bGwsdGhpcy5fb2Zmc2V0WT1udWxsLHRoaXMuX2lzU2NhbGVkPSExLDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fbm9kZXI9dCx0aGlzLl9zY2FsZUZhY3Rvcj1lLHRoaXMuX29mZnNldFg9MCx0aGlzLl9vZmZzZXRZPTAsdGhpcy5faXNTY2FsZWQ9IXRoaXMuaXNJbnRlZ2VyUHJlY2lzaW9uKCl9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdLG89YXJndW1lbnRzWzNdO3RoaXMuX25vZGVyPW4sdGhpcy5fc2NhbGVGYWN0b3I9cix0aGlzLl9vZmZzZXRYPWksdGhpcy5fb2Zmc2V0WT1vLHRoaXMuX2lzU2NhbGVkPSF0aGlzLmlzSW50ZWdlclByZWNpc2lvbigpfX07aHUucHJvdG90eXBlLnJlc2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKEVpKGFyZ3VtZW50c1swXSxnbykpZm9yKHZhciBlPWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dC5yZXNjYWxlKG4uZ2V0Q29vcmRpbmF0ZXMoKSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIHI9YXJndW1lbnRzWzBdLGk9MDtpPHIubGVuZ3RoO2krKylyW2ldLng9cltpXS54L3QuX3NjYWxlRmFjdG9yK3QuX29mZnNldFgscltpXS55PXJbaV0ueS90Ll9zY2FsZUZhY3Rvcit0Ll9vZmZzZXRZOzI9PT1yLmxlbmd0aCYmclswXS5lcXVhbHMyRChyWzFdKSYma2kub3V0LnByaW50bG4ocil9fSxodS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKEVpKGFyZ3VtZW50c1swXSxnbykpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj1uZXcgeG8scj1lLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtuLmFkZChuZXcgd2EodC5zY2FsZShpLmdldENvb3JkaW5hdGVzKCkpLGkuZ2V0RGF0YSgpKSl9cmV0dXJuIG59aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciBvPWFyZ3VtZW50c1swXSxzPW5ldyBBcnJheShvLmxlbmd0aCkuZmlsbChudWxsKSxhPTA7YTxvLmxlbmd0aDthKyspc1thXT1uZXcgdmkoTWF0aC5yb3VuZCgob1thXS54LXQuX29mZnNldFgpKnQuX3NjYWxlRmFjdG9yKSxNYXRoLnJvdW5kKChvW2FdLnktdC5fb2Zmc2V0WSkqdC5fc2NhbGVGYWN0b3IpLG9bYV0ueik7cmV0dXJuIERvLnJlbW92ZVJlcGVhdGVkUG9pbnRzKHMpfX0saHUucHJvdG90eXBlLmlzSW50ZWdlclByZWNpc2lvbj1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5fc2NhbGVGYWN0b3J9LGh1LnByb3RvdHlwZS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9ub2Rlci5nZXROb2RlZFN1YnN0cmluZ3MoKTtyZXR1cm4gdGhpcy5faXNTY2FsZWQmJnRoaXMucmVzY2FsZSh0KSx0fSxodS5wcm90b3R5cGUuY29tcHV0ZU5vZGVzPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7dGhpcy5faXNTY2FsZWQmJihlPXRoaXMuc2NhbGUodCkpLHRoaXMuX25vZGVyLmNvbXB1dGVOb2RlcyhlKX0saHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0FhXX0saHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGh1fTt2YXIgZnU9ZnVuY3Rpb24oKXt0aGlzLl9saT1uZXcgUWksdGhpcy5fc2VnU3RyaW5ncz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9zZWdTdHJpbmdzPXR9LHB1PXtmYWN0Ontjb25maWd1cmFibGU6ITB9fTtmdS5wcm90b3R5cGUuY2hlY2tFbmRQdFZlcnRleEludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgZT10aGlzLl9zZWdTdHJpbmdzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKS5nZXRDb29yZGluYXRlcygpO3QuY2hlY2tFbmRQdFZlcnRleEludGVyc2VjdGlvbnMoblswXSx0Ll9zZWdTdHJpbmdzKSx0LmNoZWNrRW5kUHRWZXJ0ZXhJbnRlcnNlY3Rpb25zKG5bbi5sZW5ndGgtMV0sdC5fc2VnU3RyaW5ncyl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KWZvcih2YXIgbz1pLm5leHQoKS5nZXRDb29yZGluYXRlcygpLHM9MTtzPG8ubGVuZ3RoLTE7cysrKWlmKG9bc10uZXF1YWxzKHIpKXRocm93IG5ldyBXaSgiZm91bmQgZW5kcHQvaW50ZXJpb3IgcHQgaW50ZXJzZWN0aW9uIGF0IGluZGV4ICIrcysiIDpwdCAiK3IpfSxmdS5wcm90b3R5cGUuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIHQ9dGhpcy5fc2VnU3RyaW5ncy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOylmb3IodmFyIGU9dC5uZXh0KCksbj10aGlzLl9zZWdTdHJpbmdzLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTt0aGlzLmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zKGUscil9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9aS5nZXRDb29yZGluYXRlcygpLGE9by5nZXRDb29yZGluYXRlcygpLHU9MDt1PHMubGVuZ3RoLTE7dSsrKWZvcih2YXIgYz0wO2M8YS5sZW5ndGgtMTtjKyspdGhpcy5jaGVja0ludGVyaW9ySW50ZXJzZWN0aW9ucyhpLHUsbyxjKTtlbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbD1hcmd1bWVudHNbMF0saD1hcmd1bWVudHNbMV0sZj1hcmd1bWVudHNbMl0scD1hcmd1bWVudHNbM107aWYobD09PWYmJmg9PT1wKXJldHVybiBudWxsO3ZhciBkPWwuZ2V0Q29vcmRpbmF0ZXMoKVtoXSxnPWwuZ2V0Q29vcmRpbmF0ZXMoKVtoKzFdLHk9Zi5nZXRDb29yZGluYXRlcygpW3BdLG09Zi5nZXRDb29yZGluYXRlcygpW3ArMV07aWYodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbihkLGcseSxtKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSYmKHRoaXMuX2xpLmlzUHJvcGVyKCl8fHRoaXMuaGFzSW50ZXJpb3JJbnRlcnNlY3Rpb24odGhpcy5fbGksZCxnKXx8dGhpcy5oYXNJbnRlcmlvckludGVyc2VjdGlvbih0aGlzLl9saSx5LG0pKSl0aHJvdyBuZXcgV2koImZvdW5kIG5vbi1ub2RlZCBpbnRlcnNlY3Rpb24gYXQgIitkKyItIitnKyIgYW5kICIreSsiLSIrbSl9fSxmdS5wcm90b3R5cGUuY2hlY2tWYWxpZD1mdW5jdGlvbigpe3RoaXMuY2hlY2tFbmRQdFZlcnRleEludGVyc2VjdGlvbnMoKSx0aGlzLmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zKCksdGhpcy5jaGVja0NvbGxhcHNlcygpfSxmdS5wcm90b3R5cGUuY2hlY2tDb2xsYXBzZXM9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIHQ9dGhpcy5fc2VnU3RyaW5ncy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCk7dGhpcy5jaGVja0NvbGxhcHNlcyhlKX1lbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgbj1hcmd1bWVudHNbMF0uZ2V0Q29vcmRpbmF0ZXMoKSxyPTA7cjxuLmxlbmd0aC0yO3IrKyl0aGlzLmNoZWNrQ29sbGFwc2UobltyXSxuW3IrMV0sbltyKzJdKX0sZnUucHJvdG90eXBlLmhhc0ludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MDtyPHQuZ2V0SW50ZXJzZWN0aW9uTnVtKCk7cisrKXt2YXIgaT10LmdldEludGVyc2VjdGlvbihyKTtpZighaS5lcXVhbHMoZSkmJiFpLmVxdWFscyhuKSlyZXR1cm4hMH1yZXR1cm4hMX0sZnUucHJvdG90eXBlLmNoZWNrQ29sbGFwc2U9ZnVuY3Rpb24odCxlLG4pe2lmKHQuZXF1YWxzKG4pKXRocm93IG5ldyBXaSgiZm91bmQgbm9uLW5vZGVkIGNvbGxhcHNlIGF0ICIrZnUuZmFjdC5jcmVhdGVMaW5lU3RyaW5nKFt0LGUsbl0pKX0sZnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGZ1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBmdX0scHUuZmFjdC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IElzfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmdSxwdSk7dmFyIGR1PWZ1bmN0aW9uKCl7dGhpcy5fbGk9bnVsbCx0aGlzLl9wdD1udWxsLHRoaXMuX29yaWdpbmFsUHQ9bnVsbCx0aGlzLl9wdFNjYWxlZD1udWxsLHRoaXMuX3AwU2NhbGVkPW51bGwsdGhpcy5fcDFTY2FsZWQ9bnVsbCx0aGlzLl9zY2FsZUZhY3Rvcj1udWxsLHRoaXMuX21pbng9bnVsbCx0aGlzLl9tYXh4PW51bGwsdGhpcy5fbWlueT1udWxsLHRoaXMuX21heHk9bnVsbCx0aGlzLl9jb3JuZXI9bmV3IEFycmF5KDQpLmZpbGwobnVsbCksdGhpcy5fc2FmZUVudj1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTtpZih0aGlzLl9vcmlnaW5hbFB0PXQsdGhpcy5fcHQ9dCx0aGlzLl9zY2FsZUZhY3Rvcj1lLHRoaXMuX2xpPW4sZTw9MCl0aHJvdyBuZXcgaGk7MSE9PWUmJih0aGlzLl9wdD1uZXcgdmkodGhpcy5zY2FsZSh0LngpLHRoaXMuc2NhbGUodC55KSksdGhpcy5fcDBTY2FsZWQ9bmV3IHZpLHRoaXMuX3AxU2NhbGVkPW5ldyB2aSksdGhpcy5pbml0Q29ybmVycyh0aGlzLl9wdCl9LGd1PXtTQUZFX0VOVl9FWFBBTlNJT05fRkFDVE9SOntjb25maWd1cmFibGU6ITB9fTtkdS5wcm90b3R5cGUuaW50ZXJzZWN0c1NjYWxlZD1mdW5jdGlvbih0LGUpe3ZhciBuPU1hdGgubWluKHQueCxlLngpLHI9TWF0aC5tYXgodC54LGUueCksaT1NYXRoLm1pbih0LnksZS55KSxvPU1hdGgubWF4KHQueSxlLnkpLHM9dGhpcy5fbWF4eDxufHx0aGlzLl9taW54PnJ8fHRoaXMuX21heHk8aXx8dGhpcy5fbWlueT5vO2lmKHMpcmV0dXJuITE7dmFyIGE9dGhpcy5pbnRlcnNlY3RzVG9sZXJhbmNlU3F1YXJlKHQsZSk7cmV0dXJuIFppLmlzVHJ1ZSghKHMmJmEpLCJGb3VuZCBiYWQgZW52ZWxvcGUgdGVzdCIpLGF9LGR1LnByb3RvdHlwZS5pbml0Q29ybmVycz1mdW5jdGlvbih0KXt2YXIgZT0uNTt0aGlzLl9taW54PXQueC1lLHRoaXMuX21heHg9dC54K2UsdGhpcy5fbWlueT10LnktZSx0aGlzLl9tYXh5PXQueStlLHRoaXMuX2Nvcm5lclswXT1uZXcgdmkodGhpcy5fbWF4eCx0aGlzLl9tYXh5KSx0aGlzLl9jb3JuZXJbMV09bmV3IHZpKHRoaXMuX21pbngsdGhpcy5fbWF4eSksdGhpcy5fY29ybmVyWzJdPW5ldyB2aSh0aGlzLl9taW54LHRoaXMuX21pbnkpLHRoaXMuX2Nvcm5lclszXT1uZXcgdmkodGhpcy5fbWF4eCx0aGlzLl9taW55KX0sZHUucHJvdG90eXBlLmludGVyc2VjdHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMT09PXRoaXMuX3NjYWxlRmFjdG9yP3RoaXMuaW50ZXJzZWN0c1NjYWxlZCh0LGUpOih0aGlzLmNvcHlTY2FsZWQodCx0aGlzLl9wMFNjYWxlZCksdGhpcy5jb3B5U2NhbGVkKGUsdGhpcy5fcDFTY2FsZWQpLHRoaXMuaW50ZXJzZWN0c1NjYWxlZCh0aGlzLl9wMFNjYWxlZCx0aGlzLl9wMVNjYWxlZCkpfSxkdS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCp0aGlzLl9zY2FsZUZhY3Rvcil9LGR1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWdpbmFsUHR9LGR1LnByb3RvdHlwZS5jb3B5U2NhbGVkPWZ1bmN0aW9uKHQsZSl7ZS54PXRoaXMuc2NhbGUodC54KSxlLnk9dGhpcy5zY2FsZSh0LnkpfSxkdS5wcm90b3R5cGUuZ2V0U2FmZUVudmVsb3BlPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX3NhZmVFbnYpe3ZhciB0PWR1LlNBRkVfRU5WX0VYUEFOU0lPTl9GQUNUT1IvdGhpcy5fc2NhbGVGYWN0b3I7dGhpcy5fc2FmZUVudj1uZXcgamkodGhpcy5fb3JpZ2luYWxQdC54LXQsdGhpcy5fb3JpZ2luYWxQdC54K3QsdGhpcy5fb3JpZ2luYWxQdC55LXQsdGhpcy5fb3JpZ2luYWxQdC55K3QpfXJldHVybiB0aGlzLl9zYWZlRW52fSxkdS5wcm90b3R5cGUuaW50ZXJzZWN0c1BpeGVsQ2xvc3VyZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMF0sdGhpcy5fY29ybmVyWzFdKSwhISh0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKXx8KHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclsxXSx0aGlzLl9jb3JuZXJbMl0pLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpKXx8KHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclsyXSx0aGlzLl9jb3JuZXJbM10pLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpKXx8KHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclszXSx0aGlzLl9jb3JuZXJbMF0pLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpKSl9LGR1LnByb3RvdHlwZS5pbnRlcnNlY3RzVG9sZXJhbmNlU3F1YXJlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ITEscj0hMTtyZXR1cm4gdGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzBdLHRoaXMuX2Nvcm5lclsxXSksISEodGhpcy5fbGkuaXNQcm9wZXIoKXx8KHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclsxXSx0aGlzLl9jb3JuZXJbMl0pLHRoaXMuX2xpLmlzUHJvcGVyKCkpfHwodGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJihuPSEwKSx0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMl0sdGhpcy5fY29ybmVyWzNdKSx0aGlzLl9saS5pc1Byb3BlcigpKXx8KHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiYocj0hMCksdGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzNdLHRoaXMuX2Nvcm5lclswXSksdGhpcy5fbGkuaXNQcm9wZXIoKSl8fG4mJnJ8fHQuZXF1YWxzKHRoaXMuX3B0KXx8ZS5lcXVhbHModGhpcy5fcHQpKX0sZHUucHJvdG90eXBlLmFkZFNuYXBwZWROb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRDb29yZGluYXRlKGUpLHI9dC5nZXRDb29yZGluYXRlKGUrMSk7cmV0dXJuISF0aGlzLmludGVyc2VjdHMobixyKSYmKHQuYWRkSW50ZXJzZWN0aW9uKHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLGUpLCEwKX0sZHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGR1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBkdX0sZ3UuU0FGRV9FTlZfRVhQQU5TSU9OX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uNzV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGR1LGd1KTt2YXIgeXU9ZnVuY3Rpb24oKXt0aGlzLnRlbXBFbnYxPW5ldyBqaSx0aGlzLnNlbGVjdGVkU2VnbWVudD1uZXcgYmF9O3l1LnByb3RvdHlwZS5zZWxlY3Q9ZnVuY3Rpb24oKXtpZigxIT09YXJndW1lbnRzLmxlbmd0aCYmMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1sxXTthcmd1bWVudHNbMF0uZ2V0TGluZVNlZ21lbnQodCx0aGlzLnNlbGVjdGVkU2VnbWVudCksdGhpcy5zZWxlY3QodGhpcy5zZWxlY3RlZFNlZ21lbnQpfX0seXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHl1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB5dX07dmFyIG11PWZ1bmN0aW9uKCl7dGhpcy5faW5kZXg9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5faW5kZXg9dH0sdnU9e0hvdFBpeGVsU25hcEFjdGlvbjp7Y29uZmlndXJhYmxlOiEwfX07bXUucHJvdG90eXBlLnNuYXA9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnNuYXAodCxudWxsLC0xKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdLGk9ZS5nZXRTYWZlRW52ZWxvcGUoKSxvPW5ldyBfdShlLG4scik7cmV0dXJuIHRoaXMuX2luZGV4LnF1ZXJ5KGkse2ludGVyZmFjZXNfOmZ1bmN0aW9uKCl7cmV0dXJuW3JhXX0sdmlzaXRJdGVtOmZ1bmN0aW9uKHQpe3Quc2VsZWN0KGksbyl9fSksby5pc05vZGVBZGRlZCgpfX0sbXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LG11LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBtdX0sdnUuSG90UGl4ZWxTbmFwQWN0aW9uLmdldD1mdW5jdGlvbigpe3JldHVybiBfdX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobXUsdnUpO3ZhciBfdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX2hvdFBpeGVsPW51bGwsdGhpcy5fcGFyZW50RWRnZT1udWxsLHRoaXMuX2hvdFBpeGVsVmVydGV4SW5kZXg9bnVsbCx0aGlzLl9pc05vZGVBZGRlZD0hMTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5faG90UGl4ZWw9ZSx0aGlzLl9wYXJlbnRFZGdlPW4sdGhpcy5faG90UGl4ZWxWZXJ0ZXhJbmRleD1yfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pc05vZGVBZGRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc05vZGVBZGRlZH0sZS5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKCl7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQucHJvdG90eXBlLnNlbGVjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzBdLmdldENvbnRleHQoKTtpZihudWxsIT09dGhpcy5fcGFyZW50RWRnZSYmbj09PXRoaXMuX3BhcmVudEVkZ2UmJmU9PT10aGlzLl9ob3RQaXhlbFZlcnRleEluZGV4KXJldHVybiBudWxsO3RoaXMuX2lzTm9kZUFkZGVkPXRoaXMuX2hvdFBpeGVsLmFkZFNuYXBwZWROb2RlKG4sZSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KHl1KSx4dT1mdW5jdGlvbigpe3RoaXMuX2xpPW51bGwsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb25zPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xpPXQsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb25zPW5ldyB4b307eHUucHJvdG90eXBlLnByb2Nlc3NJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiZlPT09cilyZXR1cm4gbnVsbDt2YXIgaT10LmdldENvb3JkaW5hdGVzKClbZV0sbz10LmdldENvb3JkaW5hdGVzKClbZSsxXSxzPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyXSxhPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyKzFdO2lmKHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oaSxvLHMsYSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJnRoaXMuX2xpLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oKSl7Zm9yKHZhciB1PTA7dTx0aGlzLl9saS5nZXRJbnRlcnNlY3Rpb25OdW0oKTt1KyspdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb25zLmFkZCh0aGlzLl9saS5nZXRJbnRlcnNlY3Rpb24odSkpO3QuYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxlLDApLG4uYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxyLDEpfX0seHUucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSx4dS5wcm90b3R5cGUuZ2V0SW50ZXJpb3JJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uc30seHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2V1XX0seHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHh1fTt2YXIgd3U9ZnVuY3Rpb24oKXt0aGlzLl9wbT1udWxsLHRoaXMuX2xpPW51bGwsdGhpcy5fc2NhbGVGYWN0b3I9bnVsbCx0aGlzLl9ub2Rlcj1udWxsLHRoaXMuX3BvaW50U25hcHBlcj1udWxsLHRoaXMuX25vZGVkU2VnU3RyaW5ncz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9wbT10LHRoaXMuX2xpPW5ldyBRaSx0aGlzLl9saS5zZXRQcmVjaXNpb25Nb2RlbCh0KSx0aGlzLl9zY2FsZUZhY3Rvcj10LmdldFNjYWxlKCl9O3d1LnByb3RvdHlwZS5jaGVja0NvcnJlY3RuZXNzPWZ1bmN0aW9uKHQpe3ZhciBlPXdhLmdldE5vZGVkU3Vic3RyaW5ncyh0KSxuPW5ldyBmdShlKTt0cnl7bi5jaGVja1ZhbGlkKCl9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2YgUmkpKXRocm93IHQ7dC5wcmludFN0YWNrVHJhY2UoKX19LHd1LnByb3RvdHlwZS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gd2EuZ2V0Tm9kZWRTdWJzdHJpbmdzKHRoaXMuX25vZGVkU2VnU3RyaW5ncyl9LHd1LnByb3RvdHlwZS5zbmFwUm91bmQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmZpbmRJbnRlcmlvckludGVyc2VjdGlvbnModCxlKTt0aGlzLmNvbXB1dGVJbnRlcnNlY3Rpb25TbmFwcyhuKSx0aGlzLmNvbXB1dGVWZXJ0ZXhTbmFwcyh0KX0sd3UucHJvdG90eXBlLmZpbmRJbnRlcmlvckludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgeHUoZSk7cmV0dXJuIHRoaXMuX25vZGVyLnNldFNlZ21lbnRJbnRlcnNlY3RvcihuKSx0aGlzLl9ub2Rlci5jb21wdXRlTm9kZXModCksbi5nZXRJbnRlcmlvckludGVyc2VjdGlvbnMoKX0sd3UucHJvdG90eXBlLmNvbXB1dGVWZXJ0ZXhTbmFwcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoRWkoYXJndW1lbnRzWzBdLGdvKSlmb3IodmFyIGU9YXJndW1lbnRzWzBdLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0LmNvbXB1dGVWZXJ0ZXhTbmFwcyhuKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygd2EpZm9yKHZhciByPWFyZ3VtZW50c1swXSxpPXIuZ2V0Q29vcmRpbmF0ZXMoKSxvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBzPW5ldyBkdShpW29dLHQuX3NjYWxlRmFjdG9yLHQuX2xpKTt0Ll9wb2ludFNuYXBwZXIuc25hcChzLHIsbykmJnIuYWRkSW50ZXJzZWN0aW9uKGlbb10sbyl9fSx3dS5wcm90b3R5cGUuY29tcHV0ZU5vZGVzPWZ1bmN0aW9uKHQpe3RoaXMuX25vZGVkU2VnU3RyaW5ncz10LHRoaXMuX25vZGVyPW5ldyBJYSx0aGlzLl9wb2ludFNuYXBwZXI9bmV3IG11KHRoaXMuX25vZGVyLmdldEluZGV4KCkpLHRoaXMuc25hcFJvdW5kKHQsdGhpcy5fbGkpfSx3dS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvblNuYXBzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCksaT1uZXcgZHUocixlLl9zY2FsZUZhY3RvcixlLl9saSk7ZS5fcG9pbnRTbmFwcGVyLnNuYXAoaSl9fSx3dS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bQWFdfSx3dS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gd3V9O3ZhciBidT1mdW5jdGlvbigpe2lmKHRoaXMuX2FyZ0dlb209bnVsbCx0aGlzLl9kaXN0YW5jZT1udWxsLHRoaXMuX2J1ZlBhcmFtcz1uZXcgRmEsdGhpcy5fcmVzdWx0R2VvbWV0cnk9bnVsbCx0aGlzLl9zYXZlRXhjZXB0aW9uPW51bGwsMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9hcmdHZW9tPXR9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuX2FyZ0dlb209ZSx0aGlzLl9idWZQYXJhbXM9bn19LER1PXtDQVBfUk9VTkQ6e2NvbmZpZ3VyYWJsZTohMH0sQ0FQX0JVVFQ6e2NvbmZpZ3VyYWJsZTohMH0sQ0FQX0ZMQVQ6e2NvbmZpZ3VyYWJsZTohMH0sQ0FQX1NRVUFSRTp7Y29uZmlndXJhYmxlOiEwfSxNQVhfUFJFQ0lTSU9OX0RJR0lUUzp7Y29uZmlndXJhYmxlOiEwfX07YnUucHJvdG90eXBlLmJ1ZmZlckZpeGVkUHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBodShuZXcgd3UobmV3IENzKDEpKSx0LmdldFNjYWxlKCkpLG49bmV3IGx1KHRoaXMuX2J1ZlBhcmFtcyk7bi5zZXRXb3JraW5nUHJlY2lzaW9uTW9kZWwodCksbi5zZXROb2RlcihlKSx0aGlzLl9yZXN1bHRHZW9tZXRyeT1uLmJ1ZmZlcih0aGlzLl9hcmdHZW9tLHRoaXMuX2Rpc3RhbmNlKX0sYnUucHJvdG90eXBlLmJ1ZmZlclJlZHVjZWRQcmVjaXNpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGU9YnUuTUFYX1BSRUNJU0lPTl9ESUdJVFM7ZT49MDtlLS0pe3RyeXt0LmJ1ZmZlclJlZHVjZWRQcmVjaXNpb24oZSl9Y2F0Y2goZSl7aWYoIShlIGluc3RhbmNlb2YgUnMpKXRocm93IGU7dC5fc2F2ZUV4Y2VwdGlvbj1lfWlmKG51bGwhPT10Ll9yZXN1bHRHZW9tZXRyeSlyZXR1cm4gbnVsbH10aHJvdyB0aGlzLl9zYXZlRXhjZXB0aW9ufWlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1idS5wcmVjaXNpb25TY2FsZUZhY3Rvcih0aGlzLl9hcmdHZW9tLHRoaXMuX2Rpc3RhbmNlLG4pLGk9bmV3IENzKHIpO3RoaXMuYnVmZmVyRml4ZWRQcmVjaXNpb24oaSl9fSxidS5wcm90b3R5cGUuY29tcHV0ZUdlb21ldHJ5PWZ1bmN0aW9uKCl7aWYodGhpcy5idWZmZXJPcmlnaW5hbFByZWNpc2lvbigpLG51bGwhPT10aGlzLl9yZXN1bHRHZW9tZXRyeSlyZXR1cm4gbnVsbDt2YXIgdD10aGlzLl9hcmdHZW9tLmdldEZhY3RvcnkoKS5nZXRQcmVjaXNpb25Nb2RlbCgpO3QuZ2V0VHlwZSgpPT09Q3MuRklYRUQ/dGhpcy5idWZmZXJGaXhlZFByZWNpc2lvbih0KTp0aGlzLmJ1ZmZlclJlZHVjZWRQcmVjaXNpb24oKX0sYnUucHJvdG90eXBlLnNldFF1YWRyYW50U2VnbWVudHM9ZnVuY3Rpb24odCl7dGhpcy5fYnVmUGFyYW1zLnNldFF1YWRyYW50U2VnbWVudHModCl9LGJ1LnByb3RvdHlwZS5idWZmZXJPcmlnaW5hbFByZWNpc2lvbj1mdW5jdGlvbigpe3RyeXt2YXIgdD1uZXcgbHUodGhpcy5fYnVmUGFyYW1zKTt0aGlzLl9yZXN1bHRHZW9tZXRyeT10LmJ1ZmZlcih0aGlzLl9hcmdHZW9tLHRoaXMuX2Rpc3RhbmNlKX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBXaSkpdGhyb3cgdDt0aGlzLl9zYXZlRXhjZXB0aW9uPXR9fSxidS5wcm90b3R5cGUuZ2V0UmVzdWx0R2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlPXQsdGhpcy5jb21wdXRlR2VvbWV0cnkoKSx0aGlzLl9yZXN1bHRHZW9tZXRyeX0sYnUucHJvdG90eXBlLnNldEVuZENhcFN0eWxlPWZ1bmN0aW9uKHQpe3RoaXMuX2J1ZlBhcmFtcy5zZXRFbmRDYXBTdHlsZSh0KX0sYnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGJ1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBidX0sYnUuYnVmZmVyT3A9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzFdO3JldHVybiBuZXcgYnUoYXJndW1lbnRzWzBdKS5nZXRSZXN1bHRHZW9tZXRyeSh0KX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMl0pJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9bmV3IGJ1KGFyZ3VtZW50c1swXSk7cmV0dXJuIHIuc2V0UXVhZHJhbnRTZWdtZW50cyhuKSxyLmdldFJlc3VsdEdlb21ldHJ5KGUpfWlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgRmEmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgaT1hcmd1bWVudHNbMV07cmV0dXJuIG5ldyBidShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzJdKS5nZXRSZXN1bHRHZW9tZXRyeShpKX19ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzNdLHU9bmV3IGJ1KGFyZ3VtZW50c1swXSk7cmV0dXJuIHUuc2V0UXVhZHJhbnRTZWdtZW50cyhzKSx1LnNldEVuZENhcFN0eWxlKGEpLHUuZ2V0UmVzdWx0R2VvbWV0cnkobyl9fSxidS5wcmVjaXNpb25TY2FsZUZhY3Rvcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXRFbnZlbG9wZUludGVybmFsKCksaT1DaS5tYXgoTWF0aC5hYnMoci5nZXRNYXhYKCkpLE1hdGguYWJzKHIuZ2V0TWF4WSgpKSxNYXRoLmFicyhyLmdldE1pblgoKSksTWF0aC5hYnMoci5nZXRNaW5ZKCkpKSsyKihlPjA/ZTowKSxvPW4tTWF0aC50cnVuYyhNYXRoLmxvZyhpKS9NYXRoLmxvZygxMCkrMSk7cmV0dXJuIE1hdGgucG93KDEwLG8pfSxEdS5DQVBfUk9VTkQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEZhLkNBUF9ST1VORH0sRHUuQ0FQX0JVVFQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEZhLkNBUF9GTEFUfSxEdS5DQVBfRkxBVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gRmEuQ0FQX0ZMQVR9LER1LkNBUF9TUVVBUkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEZhLkNBUF9TUVVBUkV9LER1Lk1BWF9QUkVDSVNJT05fRElHSVRTLmdldD1mdW5jdGlvbigpe3JldHVybiAxMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYnUsRHUpO3ZhciBFdT1mdW5jdGlvbigpe3RoaXMuX3B0PVtuZXcgdmksbmV3IHZpXSx0aGlzLl9kaXN0YW5jZT1maS5OYU4sdGhpcy5faXNOdWxsPSEwfTtFdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHR9LEV1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdFt0XX0sRXUucHJvdG90eXBlLnNldE1pbmltdW09ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0TWluaW11bSh0Ll9wdFswXSx0Ll9wdFsxXSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKHRoaXMuX2lzTnVsbClyZXR1cm4gdGhpcy5pbml0aWFsaXplKGUsbiksbnVsbDt2YXIgcj1lLmRpc3RhbmNlKG4pO3I8dGhpcy5fZGlzdGFuY2UmJnRoaXMuaW5pdGlhbGl6ZShlLG4scil9fSxFdS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuX2lzTnVsbD0hMDtlbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fcHRbMF0uc2V0Q29vcmRpbmF0ZSh0KSx0aGlzLl9wdFsxXS5zZXRDb29yZGluYXRlKGUpLHRoaXMuX2Rpc3RhbmNlPXQuZGlzdGFuY2UoZSksdGhpcy5faXNOdWxsPSExfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXTt0aGlzLl9wdFswXS5zZXRDb29yZGluYXRlKG4pLHRoaXMuX3B0WzFdLnNldENvb3JkaW5hdGUociksdGhpcy5fZGlzdGFuY2U9aSx0aGlzLl9pc051bGw9ITF9fSxFdS5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2V9LEV1LnByb3RvdHlwZS5zZXRNYXhpbXVtPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldE1heGltdW0odC5fcHRbMF0sdC5fcHRbMV0pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLl9pc051bGwpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShlLG4pLG51bGw7dmFyIHI9ZS5kaXN0YW5jZShuKTtyPnRoaXMuX2Rpc3RhbmNlJiZ0aGlzLmluaXRpYWxpemUoZSxuLHIpfX0sRXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEV1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBFdX07dmFyIEN1PWZ1bmN0aW9uKCl7fTtDdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sQ3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEN1fSxDdS5jb21wdXRlRGlzdGFuY2U9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEV1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGFzJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKWZvcih2YXIgdD1hcmd1bWVudHNbMV0sZT1hcmd1bWVudHNbMl0sbj1hcmd1bWVudHNbMF0uZ2V0Q29vcmRpbmF0ZXMoKSxyPW5ldyBiYSxpPTA7aTxuLmxlbmd0aC0xO2krKyl7ci5zZXRDb29yZGluYXRlcyhuW2ldLG5baSsxXSk7dmFyIG89ci5jbG9zZXN0UG9pbnQodCk7ZS5zZXRNaW5pbXVtKG8sdCl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEV1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGhzJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV0sdT1hcmd1bWVudHNbMl07Q3UuY29tcHV0ZURpc3RhbmNlKHMuZ2V0RXh0ZXJpb3JSaW5nKCksYSx1KTtmb3IodmFyIGM9MDtjPHMuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7YysrKUN1LmNvbXB1dGVEaXN0YW5jZShzLmdldEludGVyaW9yUmluZ04oYyksYSx1KX1lbHNlIGlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgRXUmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8mJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciBsPWFyZ3VtZW50c1swXSxoPWFyZ3VtZW50c1sxXSxmPWFyZ3VtZW50c1syXTtpZihsIGluc3RhbmNlb2YgYXMpQ3UuY29tcHV0ZURpc3RhbmNlKGwsaCxmKTtlbHNlIGlmKGwgaW5zdGFuY2VvZiBocylDdS5jb21wdXRlRGlzdGFuY2UobCxoLGYpO2Vsc2UgaWYobCBpbnN0YW5jZW9mIEhvKWZvcih2YXIgcD1sLGQ9MDtkPHAuZ2V0TnVtR2VvbWV0cmllcygpO2QrKyl7dmFyIGc9cC5nZXRHZW9tZXRyeU4oZCk7Q3UuY29tcHV0ZURpc3RhbmNlKGcsaCxmKX1lbHNlIGYuc2V0TWluaW11bShsLmdldENvb3JkaW5hdGUoKSxoKX1lbHNlIGlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgRXUmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgYmEmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciB5PWFyZ3VtZW50c1sxXSxtPWFyZ3VtZW50c1syXSx2PWFyZ3VtZW50c1swXS5jbG9zZXN0UG9pbnQoeSk7bS5zZXRNaW5pbXVtKHYseSl9fTt2YXIgU3U9ZnVuY3Rpb24odCl7dGhpcy5fbWF4UHREaXN0PW5ldyBFdSx0aGlzLl9pbnB1dEdlb209dHx8bnVsbH0sQXU9e01heFBvaW50RGlzdGFuY2VGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH0sTWF4TWlkcG9pbnREaXN0YW5jZUZpbHRlcjp7Y29uZmlndXJhYmxlOiEwfX07U3UucHJvdG90eXBlLmNvbXB1dGVNYXhNaWRwb2ludERpc3RhbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBJdSh0aGlzLl9pbnB1dEdlb20pO3QuYXBwbHkoZSksdGhpcy5fbWF4UHREaXN0LnNldE1heGltdW0oZS5nZXRNYXhQb2ludERpc3RhbmNlKCkpfSxTdS5wcm90b3R5cGUuY29tcHV0ZU1heFZlcnRleERpc3RhbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBOdSh0aGlzLl9pbnB1dEdlb20pO3QuYXBwbHkoZSksdGhpcy5fbWF4UHREaXN0LnNldE1heGltdW0oZS5nZXRNYXhQb2ludERpc3RhbmNlKCkpfSxTdS5wcm90b3R5cGUuZmluZERpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbXB1dGVNYXhWZXJ0ZXhEaXN0YW5jZSh0KSx0aGlzLmNvbXB1dGVNYXhNaWRwb2ludERpc3RhbmNlKHQpLHRoaXMuX21heFB0RGlzdC5nZXREaXN0YW5jZSgpfSxTdS5wcm90b3R5cGUuZ2V0RGlzdGFuY2VQb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4UHREaXN0fSxTdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sU3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFN1fSxBdS5NYXhQb2ludERpc3RhbmNlRmlsdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBOdX0sQXUuTWF4TWlkcG9pbnREaXN0YW5jZUZpbHRlci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gSXV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFN1LEF1KTt2YXIgTnU9ZnVuY3Rpb24odCl7dGhpcy5fbWF4UHREaXN0PW5ldyBFdSx0aGlzLl9taW5QdERpc3Q9bmV3IEV1LHRoaXMuX2dlb209dHx8bnVsbH07TnUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt0aGlzLl9taW5QdERpc3QuaW5pdGlhbGl6ZSgpLEN1LmNvbXB1dGVEaXN0YW5jZSh0aGlzLl9nZW9tLHQsdGhpcy5fbWluUHREaXN0KSx0aGlzLl9tYXhQdERpc3Quc2V0TWF4aW11bSh0aGlzLl9taW5QdERpc3QpfSxOdS5wcm90b3R5cGUuZ2V0TWF4UG9pbnREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LE51LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblthb119LE51LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBOdX07dmFyIEl1PWZ1bmN0aW9uKHQpe3RoaXMuX21heFB0RGlzdD1uZXcgRXUsdGhpcy5fbWluUHREaXN0PW5ldyBFdSx0aGlzLl9nZW9tPXR8fG51bGx9O0l1LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCxlKXtpZigwPT09ZSlyZXR1cm4gbnVsbDt2YXIgbj10LmdldENvb3JkaW5hdGUoZS0xKSxyPXQuZ2V0Q29vcmRpbmF0ZShlKSxpPW5ldyB2aSgobi54K3IueCkvMiwobi55K3IueSkvMik7dGhpcy5fbWluUHREaXN0LmluaXRpYWxpemUoKSxDdS5jb21wdXRlRGlzdGFuY2UodGhpcy5fZ2VvbSxpLHRoaXMuX21pblB0RGlzdCksdGhpcy5fbWF4UHREaXN0LnNldE1heGltdW0odGhpcy5fbWluUHREaXN0KX0sSXUucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSxJdS5wcm90b3R5cGUuaXNHZW9tZXRyeUNoYW5nZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSXUucHJvdG90eXBlLmdldE1heFBvaW50RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4UHREaXN0fSxJdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bV29dfSxJdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSXV9O3ZhciBNdT1mdW5jdGlvbih0KXt0aGlzLl9jb21wcz10fHxudWxsfTtNdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBocyYmdGhpcy5fY29tcHMuYWRkKHQpfSxNdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bWG9dfSxNdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTXV9LE11LmdldFBvbHlnb25zPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIE11LmdldFBvbHlnb25zKGFyZ3VtZW50c1swXSxuZXcgeG8pO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07cmV0dXJuIHQgaW5zdGFuY2VvZiBocz9lLmFkZCh0KTp0IGluc3RhbmNlb2YgSG8mJnQuYXBwbHkobmV3IE11KGUpKSxlfX07dmFyIEZ1PWZ1bmN0aW9uKCl7aWYodGhpcy5fbGluZXM9bnVsbCx0aGlzLl9pc0ZvcmNlZFRvTGluZVN0cmluZz0hMSwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xpbmVzPXR9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuX2xpbmVzPWUsdGhpcy5faXNGb3JjZWRUb0xpbmVTdHJpbmc9bn19O0Z1LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7aWYodGhpcy5faXNGb3JjZWRUb0xpbmVTdHJpbmcmJnQgaW5zdGFuY2VvZiBwcyl7dmFyIGU9dC5nZXRGYWN0b3J5KCkuY3JlYXRlTGluZVN0cmluZyh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpKTtyZXR1cm4gdGhpcy5fbGluZXMuYWRkKGUpLG51bGx9dCBpbnN0YW5jZW9mIGFzJiZ0aGlzLl9saW5lcy5hZGQodCl9LEZ1LnByb3RvdHlwZS5zZXRGb3JjZVRvTGluZVN0cmluZz1mdW5jdGlvbih0KXt0aGlzLl9pc0ZvcmNlZFRvTGluZVN0cmluZz10fSxGdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bcm9dfSxGdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRnV9LEZ1LmdldEdlb21ldHJ5PWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdC5nZXRGYWN0b3J5KCkuYnVpbGRHZW9tZXRyeShGdS5nZXRMaW5lcyh0KSl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4gZS5nZXRGYWN0b3J5KCkuYnVpbGRHZW9tZXRyeShGdS5nZXRMaW5lcyhlLG4pKX19LEZ1LmdldExpbmVzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIEZ1LmdldExpbmVzKGFyZ3VtZW50c1swXSwhMSk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKEVpKGFyZ3VtZW50c1swXSxnbykmJkVpKGFyZ3VtZW50c1sxXSxnbykpe2Zvcih2YXIgdD1hcmd1bWVudHNbMV0sZT1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO0Z1LmdldExpbmVzKG4sdCl9cmV0dXJuIHR9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1uZXcgeG87cmV0dXJuIHIuYXBwbHkobmV3IEZ1KG8saSkpLG99aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmRWkoYXJndW1lbnRzWzFdLGdvKSl7dmFyIHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdO3JldHVybiBzIGluc3RhbmNlb2YgYXM/YS5hZGQocyk6cy5hcHBseShuZXcgRnUoYSkpLGF9fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmRWkoYXJndW1lbnRzWzBdLGdvKSYmRWkoYXJndW1lbnRzWzFdLGdvKSl7Zm9yKHZhciB1PWFyZ3VtZW50c1sxXSxjPWFyZ3VtZW50c1syXSxsPWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO2wuaGFzTmV4dCgpOyl7dmFyIGg9bC5uZXh0KCk7RnUuZ2V0TGluZXMoaCx1LGMpfXJldHVybiB1fWlmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmRWkoYXJndW1lbnRzWzFdLGdvKSl7dmFyIGY9YXJndW1lbnRzWzFdLHA9YXJndW1lbnRzWzJdO3JldHVybiBhcmd1bWVudHNbMF0uYXBwbHkobmV3IEZ1KGYscCkpLGZ9fX07dmFyIFR1PWZ1bmN0aW9uKCl7aWYodGhpcy5fYm91bmRhcnlSdWxlPXVvLk9HQ19TRlNfQk9VTkRBUllfUlVMRSx0aGlzLl9pc0luPW51bGwsdGhpcy5fbnVtQm91bmRhcmllcz1udWxsLDAhPT1hcmd1bWVudHMubGVuZ3RoJiYxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO2lmKG51bGw9PT10KXRocm93IG5ldyBoaTt0aGlzLl9ib3VuZGFyeVJ1bGU9dH19O1R1LnByb3RvdHlwZS5sb2NhdGVJbnRlcm5hbD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgaHMpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gYmkuRVhURVJJT1I7dmFyIG49ZS5nZXRFeHRlcmlvclJpbmcoKSxyPXRoaXMubG9jYXRlSW5Qb2x5Z29uUmluZyh0LG4pO2lmKHI9PT1iaS5FWFRFUklPUilyZXR1cm4gYmkuRVhURVJJT1I7aWYocj09PWJpLkJPVU5EQVJZKXJldHVybiBiaS5CT1VOREFSWTtmb3IodmFyIGk9MDtpPGUuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7aSsrKXt2YXIgbz1lLmdldEludGVyaW9yUmluZ04oaSkscz10aGlzLmxvY2F0ZUluUG9seWdvblJpbmcodCxvKTtpZihzPT09YmkuSU5URVJJT1IpcmV0dXJuIGJpLkVYVEVSSU9SO2lmKHM9PT1iaS5CT1VOREFSWSlyZXR1cm4gYmkuQk9VTkRBUll9cmV0dXJuIGJpLklOVEVSSU9SfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgYXMpe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXTtpZighdS5nZXRFbnZlbG9wZUludGVybmFsKCkuaW50ZXJzZWN0cyhhKSlyZXR1cm4gYmkuRVhURVJJT1I7dmFyIGM9dS5nZXRDb29yZGluYXRlcygpO3JldHVybiB1LmlzQ2xvc2VkKCl8fCFhLmVxdWFscyhjWzBdKSYmIWEuZXF1YWxzKGNbYy5sZW5ndGgtMV0pP2VvLmlzT25MaW5lKGEsYyk/YmkuSU5URVJJT1I6YmkuRVhURVJJT1I6YmkuQk9VTkRBUll9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBjcyl7dmFyIGw9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMV0uZ2V0Q29vcmRpbmF0ZSgpLmVxdWFsczJEKGwpP2JpLklOVEVSSU9SOmJpLkVYVEVSSU9SfX0sVHUucHJvdG90eXBlLmxvY2F0ZUluUG9seWdvblJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRFbnZlbG9wZUludGVybmFsKCkuaW50ZXJzZWN0cyh0KT9lby5sb2NhdGVQb2ludEluUmluZyh0LGUuZ2V0Q29vcmRpbmF0ZXMoKSk6YmkuRVhURVJJT1J9LFR1LnByb3RvdHlwZS5pbnRlcnNlY3RzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubG9jYXRlKHQsZSkhPT1iaS5FWFRFUklPUn0sVHUucHJvdG90eXBlLnVwZGF0ZUxvY2F0aW9uSW5mbz1mdW5jdGlvbih0KXt0PT09YmkuSU5URVJJT1ImJih0aGlzLl9pc0luPSEwKSx0PT09YmkuQk9VTkRBUlkmJnRoaXMuX251bUJvdW5kYXJpZXMrK30sVHUucHJvdG90eXBlLmNvbXB1dGVMb2NhdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoZSBpbnN0YW5jZW9mIGNzJiZ0aGlzLnVwZGF0ZUxvY2F0aW9uSW5mbyh0aGlzLmxvY2F0ZUludGVybmFsKHQsZSkpLGUgaW5zdGFuY2VvZiBhcyl0aGlzLnVwZGF0ZUxvY2F0aW9uSW5mbyh0aGlzLmxvY2F0ZUludGVybmFsKHQsZSkpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGhzKXRoaXMudXBkYXRlTG9jYXRpb25JbmZvKHRoaXMubG9jYXRlSW50ZXJuYWwodCxlKSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgWm8pZm9yKHZhciByPWUsaT0wO2k8ci5nZXROdW1HZW9tZXRyaWVzKCk7aSsrKXt2YXIgbz1yLmdldEdlb21ldHJ5TihpKTtuLnVwZGF0ZUxvY2F0aW9uSW5mbyhuLmxvY2F0ZUludGVybmFsKHQsbykpfWVsc2UgaWYoZSBpbnN0YW5jZW9mIGRzKWZvcih2YXIgcz1lLGE9MDthPHMuZ2V0TnVtR2VvbWV0cmllcygpO2ErKyl7dmFyIHU9cy5nZXRHZW9tZXRyeU4oYSk7bi51cGRhdGVMb2NhdGlvbkluZm8obi5sb2NhdGVJbnRlcm5hbCh0LHUpKX1lbHNlIGlmKGUgaW5zdGFuY2VvZiBIbylmb3IodmFyIGM9bmV3IEhhKGUpO2MuaGFzTmV4dCgpOyl7dmFyIGw9Yy5uZXh0KCk7bCE9PWUmJm4uY29tcHV0ZUxvY2F0aW9uKHQsbCl9fSxUdS5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaXNFbXB0eSgpP2JpLkVYVEVSSU9SOmUgaW5zdGFuY2VvZiBhc3x8ZSBpbnN0YW5jZW9mIGhzP3RoaXMubG9jYXRlSW50ZXJuYWwodCxlKToodGhpcy5faXNJbj0hMSx0aGlzLl9udW1Cb3VuZGFyaWVzPTAsdGhpcy5jb21wdXRlTG9jYXRpb24odCxlKSx0aGlzLl9ib3VuZGFyeVJ1bGUuaXNJbkJvdW5kYXJ5KHRoaXMuX251bUJvdW5kYXJpZXMpP2JpLkJPVU5EQVJZOnRoaXMuX251bUJvdW5kYXJpZXM+MHx8dGhpcy5faXNJbj9iaS5JTlRFUklPUjpiaS5FWFRFUklPUil9LFR1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxUdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVHV9O3ZhciBPdT1mdW5jdGlvbiB0KCl7aWYodGhpcy5fY29tcG9uZW50PW51bGwsdGhpcy5fc2VnSW5kZXg9bnVsbCx0aGlzLl9wdD1udWxsLDI9PT1hcmd1bWVudHMubGVuZ3RoKXQuY2FsbCh0aGlzLGFyZ3VtZW50c1swXSx0LklOU0lERV9BUkVBLGFyZ3VtZW50c1sxXSk7ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO3RoaXMuX2NvbXBvbmVudD1lLHRoaXMuX3NlZ0luZGV4PW4sdGhpcy5fcHQ9cn19LEx1PXtJTlNJREVfQVJFQTp7Y29uZmlndXJhYmxlOiEwfX07T3UucHJvdG90eXBlLmlzSW5zaWRlQXJlYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWdJbmRleD09PU91LklOU0lERV9BUkVBfSxPdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdH0sT3UucHJvdG90eXBlLmdldEdlb21ldHJ5Q29tcG9uZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudH0sT3UucHJvdG90eXBlLmdldFNlZ21lbnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWdJbmRleH0sT3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LE91LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBPdX0sTHUuSU5TSURFX0FSRUEuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE91LEx1KTt2YXIgUHU9ZnVuY3Rpb24odCl7dGhpcy5fcHRzPXR8fG51bGx9O1B1LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIGNzJiZ0aGlzLl9wdHMuYWRkKHQpfSxQdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bWG9dfSxQdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUHV9LFB1LmdldFBvaW50cz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHQgaW5zdGFuY2VvZiBjcz9hYS5zaW5nbGV0b25MaXN0KHQpOlB1LmdldFBvaW50cyh0LG5ldyB4byl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4gZSBpbnN0YW5jZW9mIGNzP24uYWRkKGUpOmUgaW5zdGFuY2VvZiBIbyYmZS5hcHBseShuZXcgUHUobikpLG59fTt2YXIgUnU9ZnVuY3Rpb24oKXt0aGlzLl9sb2NhdGlvbnM9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbG9jYXRpb25zPXR9O1J1LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7KHQgaW5zdGFuY2VvZiBjc3x8dCBpbnN0YW5jZW9mIGFzfHx0IGluc3RhbmNlb2YgaHMpJiZ0aGlzLl9sb2NhdGlvbnMuYWRkKG5ldyBPdSh0LDAsdC5nZXRDb29yZGluYXRlKCkpKX0sUnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1hvXX0sUnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFJ1fSxSdS5nZXRMb2NhdGlvbnM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHhvO3JldHVybiB0LmFwcGx5KG5ldyBSdShlKSksZX07dmFyIEJ1PWZ1bmN0aW9uKCl7aWYodGhpcy5fZ2VvbT1udWxsLHRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlPTAsdGhpcy5fcHRMb2NhdG9yPW5ldyBUdSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uPW51bGwsdGhpcy5fbWluRGlzdGFuY2U9ZmkuTUFYX1ZBTFVFLDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZ2VvbT1bdCxlXSx0aGlzLl90ZXJtaW5hdGVEaXN0YW5jZT0wfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXTt0aGlzLl9nZW9tPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX2dlb21bMF09bix0aGlzLl9nZW9tWzFdPXIsdGhpcy5fdGVybWluYXRlRGlzdGFuY2U9aX19O0J1LnByb3RvdHlwZS5jb21wdXRlQ29udGFpbm1lbnREaXN0YW5jZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPW5ldyBBcnJheSgyKS5maWxsKG51bGwpO2lmKHRoaXMuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2UoMCxlKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGw7dGhpcy5jb21wdXRlQ29udGFpbm1lbnREaXN0YW5jZSgxLGUpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPTEtbixvPU11LmdldFBvbHlnb25zKHRoaXMuX2dlb21bbl0pO2lmKG8uc2l6ZSgpPjApe3ZhciBzPVJ1LmdldExvY2F0aW9ucyh0aGlzLl9nZW9tW2ldKTtpZih0aGlzLmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlKHMsbyxyKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25baV09clswXSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uW25dPXJbMV0sbnVsbH19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFycmF5JiZFaShhcmd1bWVudHNbMF0sdm8pJiZFaShhcmd1bWVudHNbMV0sdm8pKXtmb3IodmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGM9YXJndW1lbnRzWzJdLGw9MDtsPGEuc2l6ZSgpO2wrKylmb3IodmFyIGg9YS5nZXQobCksZj0wO2Y8dS5zaXplKCk7ZisrKWlmKHQuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2UoaCx1LmdldChmKSxjKSx0Ll9taW5EaXN0YW5jZTw9dC5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFycmF5JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE91JiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIGhzKXt2YXIgcD1hcmd1bWVudHNbMF0sZD1hcmd1bWVudHNbMV0sZz1hcmd1bWVudHNbMl0seT1wLmdldENvb3JkaW5hdGUoKTtpZihiaS5FWFRFUklPUiE9PXRoaXMuX3B0TG9jYXRvci5sb2NhdGUoeSxkKSlyZXR1cm4gdGhpcy5fbWluRGlzdGFuY2U9MCxnWzBdPXAsZ1sxXT1uZXcgT3UoZCx5KSxudWxsfX0sQnUucHJvdG90eXBlLmNvbXB1dGVNaW5EaXN0YW5jZUxpbmVzUG9pbnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9dGhpcyxpPTA7aTx0LnNpemUoKTtpKyspZm9yKHZhciBvPXQuZ2V0KGkpLHM9MDtzPGUuc2l6ZSgpO3MrKyl7dmFyIGE9ZS5nZXQocyk7aWYoci5jb21wdXRlTWluRGlzdGFuY2UobyxhLG4pLHIuX21pbkRpc3RhbmNlPD1yLl90ZXJtaW5hdGVEaXN0YW5jZSlyZXR1cm4gbnVsbH19LEJ1LnByb3RvdHlwZS5jb21wdXRlRmFjZXREaXN0YW5jZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBBcnJheSgyKS5maWxsKG51bGwpLGU9RnUuZ2V0TGluZXModGhpcy5fZ2VvbVswXSksbj1GdS5nZXRMaW5lcyh0aGlzLl9nZW9tWzFdKSxyPVB1LmdldFBvaW50cyh0aGlzLl9nZW9tWzBdKSxpPVB1LmdldFBvaW50cyh0aGlzLl9nZW9tWzFdKTtpZih0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZUxpbmVzKGUsbix0KSx0aGlzLnVwZGF0ZU1pbkRpc3RhbmNlKHQsITEpLHRoaXMuX21pbkRpc3RhbmNlPD10aGlzLl90ZXJtaW5hdGVEaXN0YW5jZXx8KHRbMF09bnVsbCx0WzFdPW51bGwsdGhpcy5jb21wdXRlTWluRGlzdGFuY2VMaW5lc1BvaW50cyhlLGksdCksdGhpcy51cGRhdGVNaW5EaXN0YW5jZSh0LCExKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2UpfHwodFswXT1udWxsLHRbMV09bnVsbCx0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZUxpbmVzUG9pbnRzKG4scix0KSx0aGlzLnVwZGF0ZU1pbkRpc3RhbmNlKHQsITApLHRoaXMuX21pbkRpc3RhbmNlPD10aGlzLl90ZXJtaW5hdGVEaXN0YW5jZSkpcmV0dXJuIG51bGw7dFswXT1udWxsLHRbMV09bnVsbCx0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZVBvaW50cyhyLGksdCksdGhpcy51cGRhdGVNaW5EaXN0YW5jZSh0LCExKX0sQnUucHJvdG90eXBlLm5lYXJlc3RMb2NhdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wdXRlTWluRGlzdGFuY2UoKSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9ufSxCdS5wcm90b3R5cGUudXBkYXRlTWluRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtpZihudWxsPT09dFswXSlyZXR1cm4gbnVsbDtlPyh0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzBdPXRbMV0sdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvblsxXT10WzBdKToodGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvblswXT10WzBdLHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMV09dFsxXSl9LEJ1LnByb3RvdHlwZS5uZWFyZXN0UG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlKCksW3RoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMF0uZ2V0Q29vcmRpbmF0ZSgpLHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMV0uZ2V0Q29vcmRpbmF0ZSgpXX0sQnUucHJvdG90eXBlLmNvbXB1dGVNaW5EaXN0YW5jZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGwhPT10aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9ufHwodGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbj1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlKCksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlKSlyZXR1cm4gbnVsbDt0aGlzLmNvbXB1dGVGYWNldERpc3RhbmNlKCl9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFycmF5JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGFzJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIGNzKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07aWYoZS5nZXRFbnZlbG9wZUludGVybmFsKCkuZGlzdGFuY2Uobi5nZXRFbnZlbG9wZUludGVybmFsKCkpPnRoaXMuX21pbkRpc3RhbmNlKXJldHVybiBudWxsO2Zvcih2YXIgaT1lLmdldENvb3JkaW5hdGVzKCksbz1uLmdldENvb3JkaW5hdGUoKSxzPTA7czxpLmxlbmd0aC0xO3MrKyl7dmFyIGE9ZW8uZGlzdGFuY2VQb2ludExpbmUobyxpW3NdLGlbcysxXSk7aWYoYTx0Ll9taW5EaXN0YW5jZSl7dC5fbWluRGlzdGFuY2U9YTt2YXIgdT1uZXcgYmEoaVtzXSxpW3MrMV0pLmNsb3Nlc3RQb2ludChvKTtyWzBdPW5ldyBPdShlLHMsdSksclsxXT1uZXcgT3UobiwwLG8pfWlmKHQuX21pbkRpc3RhbmNlPD10Ll90ZXJtaW5hdGVEaXN0YW5jZSlyZXR1cm4gbnVsbH19ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFycmF5JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGFzJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIGFzKXt2YXIgYz1hcmd1bWVudHNbMF0sbD1hcmd1bWVudHNbMV0saD1hcmd1bWVudHNbMl07aWYoYy5nZXRFbnZlbG9wZUludGVybmFsKCkuZGlzdGFuY2UobC5nZXRFbnZlbG9wZUludGVybmFsKCkpPnRoaXMuX21pbkRpc3RhbmNlKXJldHVybiBudWxsO2Zvcih2YXIgZj1jLmdldENvb3JkaW5hdGVzKCkscD1sLmdldENvb3JkaW5hdGVzKCksZD0wO2Q8Zi5sZW5ndGgtMTtkKyspZm9yKHZhciBnPTA7ZzxwLmxlbmd0aC0xO2crKyl7dmFyIHk9ZW8uZGlzdGFuY2VMaW5lTGluZShmW2RdLGZbZCsxXSxwW2ddLHBbZysxXSk7aWYoeTx0Ll9taW5EaXN0YW5jZSl7dC5fbWluRGlzdGFuY2U9eTt2YXIgbT1uZXcgYmEoZltkXSxmW2QrMV0pLHY9bmV3IGJhKHBbZ10scFtnKzFdKSxfPW0uY2xvc2VzdFBvaW50cyh2KTtoWzBdPW5ldyBPdShjLGQsX1swXSksaFsxXT1uZXcgT3UobCxnLF9bMV0pfWlmKHQuX21pbkRpc3RhbmNlPD10Ll90ZXJtaW5hdGVEaXN0YW5jZSlyZXR1cm4gbnVsbH19fSxCdS5wcm90b3R5cGUuY29tcHV0ZU1pbkRpc3RhbmNlUG9pbnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9dGhpcyxpPTA7aTx0LnNpemUoKTtpKyspZm9yKHZhciBvPXQuZ2V0KGkpLHM9MDtzPGUuc2l6ZSgpO3MrKyl7dmFyIGE9ZS5nZXQocyksdT1vLmdldENvb3JkaW5hdGUoKS5kaXN0YW5jZShhLmdldENvb3JkaW5hdGUoKSk7aWYodTxyLl9taW5EaXN0YW5jZSYmKHIuX21pbkRpc3RhbmNlPXUsblswXT1uZXcgT3UobywwLG8uZ2V0Q29vcmRpbmF0ZSgpKSxuWzFdPW5ldyBPdShhLDAsYS5nZXRDb29yZGluYXRlKCkpKSxyLl9taW5EaXN0YW5jZTw9ci5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fSxCdS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fZ2VvbVswXXx8bnVsbD09PXRoaXMuX2dlb21bMV0pdGhyb3cgbmV3IGhpO3JldHVybiB0aGlzLl9nZW9tWzBdLmlzRW1wdHkoKXx8dGhpcy5fZ2VvbVsxXS5pc0VtcHR5KCk/MDoodGhpcy5jb21wdXRlTWluRGlzdGFuY2UoKSx0aGlzLl9taW5EaXN0YW5jZSl9LEJ1LnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2VMaW5lcz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXRoaXMsaT0wO2k8dC5zaXplKCk7aSsrKWZvcih2YXIgbz10LmdldChpKSxzPTA7czxlLnNpemUoKTtzKyspe3ZhciBhPWUuZ2V0KHMpO2lmKHIuY29tcHV0ZU1pbkRpc3RhbmNlKG8sYSxuKSxyLl9taW5EaXN0YW5jZTw9ci5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fSxCdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sQnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEJ1fSxCdS5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgQnUodCxlKS5kaXN0YW5jZSgpfSxCdS5pc1dpdGhpbkRpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IEJ1KHQsZSxuKS5kaXN0YW5jZSgpPD1ufSxCdS5uZWFyZXN0UG9pbnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBCdSh0LGUpLm5lYXJlc3RQb2ludHMoKX07dmFyIGt1PWZ1bmN0aW9uKCl7dGhpcy5fcHQ9W25ldyB2aSxuZXcgdmldLHRoaXMuX2Rpc3RhbmNlPWZpLk5hTix0aGlzLl9pc051bGw9ITB9O2t1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdH0sa3UucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B0W3RdfSxrdS5wcm90b3R5cGUuc2V0TWluaW11bT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRNaW5pbXVtKHQuX3B0WzBdLHQuX3B0WzFdKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYodGhpcy5faXNOdWxsKXJldHVybiB0aGlzLmluaXRpYWxpemUoZSxuKSxudWxsO3ZhciByPWUuZGlzdGFuY2Uobik7cjx0aGlzLl9kaXN0YW5jZSYmdGhpcy5pbml0aWFsaXplKGUsbixyKX19LGt1LnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5faXNOdWxsPSEwO2Vsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9wdFswXS5zZXRDb29yZGluYXRlKHQpLHRoaXMuX3B0WzFdLnNldENvb3JkaW5hdGUoZSksdGhpcy5fZGlzdGFuY2U9dC5kaXN0YW5jZShlKSx0aGlzLl9pc051bGw9ITF9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdO3RoaXMuX3B0WzBdLnNldENvb3JkaW5hdGUobiksdGhpcy5fcHRbMV0uc2V0Q29vcmRpbmF0ZShyKSx0aGlzLl9kaXN0YW5jZT1pLHRoaXMuX2lzTnVsbD0hMX19LGt1LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBYaS50b0xpbmVTdHJpbmcodGhpcy5fcHRbMF0sdGhpcy5fcHRbMV0pfSxrdS5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2V9LGt1LnByb3RvdHlwZS5zZXRNYXhpbXVtPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldE1heGltdW0odC5fcHRbMF0sdC5fcHRbMV0pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLl9pc051bGwpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShlLG4pLG51bGw7dmFyIHI9ZS5kaXN0YW5jZShuKTtyPnRoaXMuX2Rpc3RhbmNlJiZ0aGlzLmluaXRpYWxpemUoZSxuLHIpfX0sa3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGt1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBrdX07dmFyIHp1PWZ1bmN0aW9uKCl7fTt6dS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0senUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHp1fSx6dS5jb21wdXRlRGlzdGFuY2U9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIGt1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGFzJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKWZvcih2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1uZXcgYmEsaT10LmdldENvb3JkaW5hdGVzKCksbz0wO288aS5sZW5ndGgtMTtvKyspe3Iuc2V0Q29vcmRpbmF0ZXMoaVtvXSxpW28rMV0pO3ZhciBzPXIuY2xvc2VzdFBvaW50KGUpO24uc2V0TWluaW11bShzLGUpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBrdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBocyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGM9YXJndW1lbnRzWzJdO3p1LmNvbXB1dGVEaXN0YW5jZShhLmdldEV4dGVyaW9yUmluZygpLHUsYyk7Zm9yKHZhciBsPTA7bDxhLmdldE51bUludGVyaW9yUmluZygpO2wrKyl6dS5jb21wdXRlRGlzdGFuY2UoYS5nZXRJbnRlcmlvclJpbmdOKGwpLHUsYyl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIGt1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgaD1hcmd1bWVudHNbMF0sZj1hcmd1bWVudHNbMV0scD1hcmd1bWVudHNbMl07aWYoaCBpbnN0YW5jZW9mIGFzKXp1LmNvbXB1dGVEaXN0YW5jZShoLGYscCk7ZWxzZSBpZihoIGluc3RhbmNlb2YgaHMpenUuY29tcHV0ZURpc3RhbmNlKGgsZixwKTtlbHNlIGlmKGggaW5zdGFuY2VvZiBIbylmb3IodmFyIGQ9aCxnPTA7ZzxkLmdldE51bUdlb21ldHJpZXMoKTtnKyspe3ZhciB5PWQuZ2V0R2VvbWV0cnlOKGcpO3p1LmNvbXB1dGVEaXN0YW5jZSh5LGYscCl9ZWxzZSBwLnNldE1pbmltdW0oaC5nZXRDb29yZGluYXRlKCksZil9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIGt1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGJhJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgbT1hcmd1bWVudHNbMV0sdj1hcmd1bWVudHNbMl0sXz1hcmd1bWVudHNbMF0uY2xvc2VzdFBvaW50KG0pO3Yuc2V0TWluaW11bShfLG0pfX07dmFyIGp1PWZ1bmN0aW9uKCl7dGhpcy5fZzA9bnVsbCx0aGlzLl9nMT1udWxsLHRoaXMuX3B0RGlzdD1uZXcga3UsdGhpcy5fZGVuc2lmeUZyYWM9MDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZzA9dCx0aGlzLl9nMT1lfSxVdT17TWF4UG9pbnREaXN0YW5jZUZpbHRlcjp7Y29uZmlndXJhYmxlOiEwfSxNYXhEZW5zaWZpZWRCeUZyYWN0aW9uRGlzdGFuY2VGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH19O2p1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdERpc3QuZ2V0Q29vcmRpbmF0ZXMoKX0sanUucHJvdG90eXBlLnNldERlbnNpZnlGcmFjdGlvbj1mdW5jdGlvbih0KXtpZih0PjF8fHQ8PTApdGhyb3cgbmV3IGhpO3RoaXMuX2RlbnNpZnlGcmFjPXR9LGp1LnByb3RvdHlwZS5jb21wdXRlPWZ1bmN0aW9uKHQsZSl7dGhpcy5jb21wdXRlT3JpZW50ZWREaXN0YW5jZSh0LGUsdGhpcy5fcHREaXN0KSx0aGlzLmNvbXB1dGVPcmllbnRlZERpc3RhbmNlKGUsdCx0aGlzLl9wdERpc3QpfSxqdS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wdXRlKHRoaXMuX2cwLHRoaXMuX2cxKSx0aGlzLl9wdERpc3QuZ2V0RGlzdGFuY2UoKX0sanUucHJvdG90eXBlLmNvbXB1dGVPcmllbnRlZERpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgcXUoZSk7aWYodC5hcHBseShyKSxuLnNldE1heGltdW0oci5nZXRNYXhQb2ludERpc3RhbmNlKCkpLHRoaXMuX2RlbnNpZnlGcmFjPjApe3ZhciBpPW5ldyBWdShlLHRoaXMuX2RlbnNpZnlGcmFjKTt0LmFwcGx5KGkpLG4uc2V0TWF4aW11bShpLmdldE1heFBvaW50RGlzdGFuY2UoKSl9fSxqdS5wcm90b3R5cGUub3JpZW50ZWREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXB1dGVPcmllbnRlZERpc3RhbmNlKHRoaXMuX2cwLHRoaXMuX2cxLHRoaXMuX3B0RGlzdCksdGhpcy5fcHREaXN0LmdldERpc3RhbmNlKCl9LGp1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxqdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4ganV9LGp1LmRpc3RhbmNlPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG5ldyBqdShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKS5kaXN0YW5jZSgpO2lmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMl0sZT1uZXcganUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk7cmV0dXJuIGUuc2V0RGVuc2lmeUZyYWN0aW9uKHQpLGUuZGlzdGFuY2UoKX19LFV1Lk1heFBvaW50RGlzdGFuY2VGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHF1fSxVdS5NYXhEZW5zaWZpZWRCeUZyYWN0aW9uRGlzdGFuY2VGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFZ1fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhqdSxVdSk7dmFyIHF1PWZ1bmN0aW9uKCl7dGhpcy5fbWF4UHREaXN0PW5ldyBrdSx0aGlzLl9taW5QdERpc3Q9bmV3IGt1LHRoaXMuX2V1Y2xpZGVhbkRpc3Q9bmV3IHp1LHRoaXMuX2dlb209bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZ2VvbT10fTtxdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3RoaXMuX21pblB0RGlzdC5pbml0aWFsaXplKCksenUuY29tcHV0ZURpc3RhbmNlKHRoaXMuX2dlb20sdCx0aGlzLl9taW5QdERpc3QpLHRoaXMuX21heFB0RGlzdC5zZXRNYXhpbXVtKHRoaXMuX21pblB0RGlzdCl9LHF1LnByb3RvdHlwZS5nZXRNYXhQb2ludERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heFB0RGlzdH0scXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2FvXX0scXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHF1fTt2YXIgVnU9ZnVuY3Rpb24oKXt0aGlzLl9tYXhQdERpc3Q9bmV3IGt1LHRoaXMuX21pblB0RGlzdD1uZXcga3UsdGhpcy5fZ2VvbT1udWxsLHRoaXMuX251bVN1YlNlZ3M9MDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZ2VvbT10LHRoaXMuX251bVN1YlNlZ3M9TWF0aC50cnVuYyhNYXRoLnJvdW5kKDEvZSkpfTtWdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZigwPT09ZSlyZXR1cm4gbnVsbDtmb3IodmFyIHI9dC5nZXRDb29yZGluYXRlKGUtMSksaT10LmdldENvb3JkaW5hdGUoZSksbz0oaS54LXIueCkvdGhpcy5fbnVtU3ViU2VncyxzPShpLnktci55KS90aGlzLl9udW1TdWJTZWdzLGE9MDthPHRoaXMuX251bVN1YlNlZ3M7YSsrKXt2YXIgdT1yLngrYSpvLGM9ci55K2EqcyxsPW5ldyB2aSh1LGMpO24uX21pblB0RGlzdC5pbml0aWFsaXplKCksenUuY29tcHV0ZURpc3RhbmNlKG4uX2dlb20sbCxuLl9taW5QdERpc3QpLG4uX21heFB0RGlzdC5zZXRNYXhpbXVtKG4uX21pblB0RGlzdCl9fSxWdS5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuITF9LFZ1LnByb3RvdHlwZS5pc0dlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe3JldHVybiExfSxWdS5wcm90b3R5cGUuZ2V0TWF4UG9pbnREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LFZ1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltXb119LFZ1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBWdX07dmFyIEd1PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9taW5WYWxpZERpc3RhbmNlPW51bGwsdGhpcy5fbWF4VmFsaWREaXN0YW5jZT1udWxsLHRoaXMuX21pbkRpc3RhbmNlRm91bmQ9bnVsbCx0aGlzLl9tYXhEaXN0YW5jZUZvdW5kPW51bGwsdGhpcy5faXNWYWxpZD0hMCx0aGlzLl9lcnJNc2c9bnVsbCx0aGlzLl9lcnJvckxvY2F0aW9uPW51bGwsdGhpcy5fZXJyb3JJbmRpY2F0b3I9bnVsbCx0aGlzLl9pbnB1dD10fHxudWxsLHRoaXMuX2J1ZkRpc3RhbmNlPWV8fG51bGwsdGhpcy5fcmVzdWx0PW58fG51bGx9LFl1PXtWRVJCT1NFOntjb25maWd1cmFibGU6ITB9LE1BWF9ESVNUQU5DRV9ESUZGX0ZSQUM6e2NvbmZpZ3VyYWJsZTohMH19O0d1LnByb3RvdHlwZS5jaGVja01heGltdW1EaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IGp1KGUsdCk7aWYoci5zZXREZW5zaWZ5RnJhY3Rpb24oLjI1KSx0aGlzLl9tYXhEaXN0YW5jZUZvdW5kPXIub3JpZW50ZWREaXN0YW5jZSgpLHRoaXMuX21heERpc3RhbmNlRm91bmQ+bil7dGhpcy5faXNWYWxpZD0hMTt2YXIgaT1yLmdldENvb3JkaW5hdGVzKCk7dGhpcy5fZXJyb3JMb2NhdGlvbj1pWzFdLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVTdHJpbmcoaSksdGhpcy5fZXJyTXNnPSJEaXN0YW5jZSBiZXR3ZWVuIGJ1ZmZlciBjdXJ2ZSBhbmQgaW5wdXQgaXMgdG9vIGxhcmdlICgiK3RoaXMuX21heERpc3RhbmNlRm91bmQrIiBhdCAiK1hpLnRvTGluZVN0cmluZyhpWzBdLGlbMV0pKyIpIn19LEd1LnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7dmFyIHQ9TWF0aC5hYnModGhpcy5fYnVmRGlzdGFuY2UpLGU9R3UuTUFYX0RJU1RBTkNFX0RJRkZfRlJBQyp0O3JldHVybiB0aGlzLl9taW5WYWxpZERpc3RhbmNlPXQtZSx0aGlzLl9tYXhWYWxpZERpc3RhbmNlPXQrZSwhKCF0aGlzLl9pbnB1dC5pc0VtcHR5KCkmJiF0aGlzLl9yZXN1bHQuaXNFbXB0eSgpKXx8KHRoaXMuX2J1ZkRpc3RhbmNlPjA/dGhpcy5jaGVja1Bvc2l0aXZlVmFsaWQoKTp0aGlzLmNoZWNrTmVnYXRpdmVWYWxpZCgpLEd1LlZFUkJPU0UmJmtpLm91dC5wcmludGxuKCJNaW4gRGlzdD0gIit0aGlzLl9taW5EaXN0YW5jZUZvdW5kKyIgIGVycj0gIisoMS10aGlzLl9taW5EaXN0YW5jZUZvdW5kL3RoaXMuX2J1ZkRpc3RhbmNlKSsiICBNYXggRGlzdD0gIit0aGlzLl9tYXhEaXN0YW5jZUZvdW5kKyIgIGVycj0gIisodGhpcy5fbWF4RGlzdGFuY2VGb3VuZC90aGlzLl9idWZEaXN0YW5jZS0xKSksdGhpcy5faXNWYWxpZCl9LEd1LnByb3RvdHlwZS5jaGVja05lZ2F0aXZlVmFsaWQ9ZnVuY3Rpb24oKXtpZighKHRoaXMuX2lucHV0IGluc3RhbmNlb2YgaHN8fHRoaXMuX2lucHV0IGluc3RhbmNlb2YgZHN8fHRoaXMuX2lucHV0IGluc3RhbmNlb2YgSG8pKXJldHVybiBudWxsO3ZhciB0PXRoaXMuZ2V0UG9seWdvbkxpbmVzKHRoaXMuX2lucHV0KTtpZih0aGlzLmNoZWNrTWluaW11bURpc3RhbmNlKHQsdGhpcy5fcmVzdWx0LHRoaXMuX21pblZhbGlkRGlzdGFuY2UpLCF0aGlzLl9pc1ZhbGlkKXJldHVybiBudWxsO3RoaXMuY2hlY2tNYXhpbXVtRGlzdGFuY2UodCx0aGlzLl9yZXN1bHQsdGhpcy5fbWF4VmFsaWREaXN0YW5jZSl9LEd1LnByb3RvdHlwZS5nZXRFcnJvckluZGljYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJvckluZGljYXRvcn0sR3UucHJvdG90eXBlLmNoZWNrTWluaW11bURpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgQnUodCxlLG4pO2lmKHRoaXMuX21pbkRpc3RhbmNlRm91bmQ9ci5kaXN0YW5jZSgpLHRoaXMuX21pbkRpc3RhbmNlRm91bmQ8bil7dGhpcy5faXNWYWxpZD0hMTt2YXIgaT1yLm5lYXJlc3RQb2ludHMoKTt0aGlzLl9lcnJvckxvY2F0aW9uPXIubmVhcmVzdFBvaW50cygpWzFdLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVTdHJpbmcoaSksdGhpcy5fZXJyTXNnPSJEaXN0YW5jZSBiZXR3ZWVuIGJ1ZmZlciBjdXJ2ZSBhbmQgaW5wdXQgaXMgdG9vIHNtYWxsICgiK3RoaXMuX21pbkRpc3RhbmNlRm91bmQrIiBhdCAiK1hpLnRvTGluZVN0cmluZyhpWzBdLGlbMV0pKyIgKSJ9fSxHdS5wcm90b3R5cGUuY2hlY2tQb3NpdGl2ZVZhbGlkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVzdWx0LmdldEJvdW5kYXJ5KCk7aWYodGhpcy5jaGVja01pbmltdW1EaXN0YW5jZSh0aGlzLl9pbnB1dCx0LHRoaXMuX21pblZhbGlkRGlzdGFuY2UpLCF0aGlzLl9pc1ZhbGlkKXJldHVybiBudWxsO3RoaXMuY2hlY2tNYXhpbXVtRGlzdGFuY2UodGhpcy5faW5wdXQsdCx0aGlzLl9tYXhWYWxpZERpc3RhbmNlKX0sR3UucHJvdG90eXBlLmdldEVycm9yTG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyb3JMb2NhdGlvbn0sR3UucHJvdG90eXBlLmdldFBvbHlnb25MaW5lcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49bmV3IEZ1KGUpLHI9TXUuZ2V0UG9seWdvbnModCkuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3IubmV4dCgpLmFwcGx5KG4pfXJldHVybiB0LmdldEZhY3RvcnkoKS5idWlsZEdlb21ldHJ5KGUpfSxHdS5wcm90b3R5cGUuZ2V0RXJyb3JNZXNzYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vyck1zZ30sR3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEd1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBHdX0sWXUuVkVSQk9TRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sWXUuTUFYX0RJU1RBTkNFX0RJRkZfRlJBQy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDEyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhHdSxZdSk7dmFyIFh1PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9pc1ZhbGlkPSEwLHRoaXMuX2Vycm9yTXNnPW51bGwsdGhpcy5fZXJyb3JMb2NhdGlvbj1udWxsLHRoaXMuX2Vycm9ySW5kaWNhdG9yPW51bGwsdGhpcy5faW5wdXQ9dHx8bnVsbCx0aGlzLl9kaXN0YW5jZT1lfHxudWxsLHRoaXMuX3Jlc3VsdD1ufHxudWxsfSxXdT17VkVSQk9TRTp7Y29uZmlndXJhYmxlOiEwfSxNQVhfRU5WX0RJRkZfRlJBQzp7Y29uZmlndXJhYmxlOiEwfX07WHUucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGVja1BvbHlnb25hbCgpLHRoaXMuX2lzVmFsaWQ/KHRoaXMuY2hlY2tFeHBlY3RlZEVtcHR5KCksdGhpcy5faXNWYWxpZD8odGhpcy5jaGVja0VudmVsb3BlKCksdGhpcy5faXNWYWxpZD8odGhpcy5jaGVja0FyZWEoKSx0aGlzLl9pc1ZhbGlkPyh0aGlzLmNoZWNrRGlzdGFuY2UoKSx0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkfSxYdS5wcm90b3R5cGUuY2hlY2tFbnZlbG9wZT1mdW5jdGlvbigpe2lmKHRoaXMuX2Rpc3RhbmNlPDApcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5fZGlzdGFuY2UqWHUuTUFYX0VOVl9ESUZGX0ZSQUM7MD09PXQmJih0PS4wMDEpO3ZhciBlPW5ldyBqaSh0aGlzLl9pbnB1dC5nZXRFbnZlbG9wZUludGVybmFsKCkpO2UuZXhwYW5kQnkodGhpcy5fZGlzdGFuY2UpO3ZhciBuPW5ldyBqaSh0aGlzLl9yZXN1bHQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKTtuLmV4cGFuZEJ5KHQpLG4uY29udGFpbnMoZSl8fCh0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPSJCdWZmZXIgZW52ZWxvcGUgaXMgaW5jb3JyZWN0Iix0aGlzLl9lcnJvckluZGljYXRvcj10aGlzLl9pbnB1dC5nZXRGYWN0b3J5KCkudG9HZW9tZXRyeShuKSksdGhpcy5yZXBvcnQoIkVudmVsb3BlIil9LFh1LnByb3RvdHlwZS5jaGVja0Rpc3RhbmNlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEd1KHRoaXMuX2lucHV0LHRoaXMuX2Rpc3RhbmNlLHRoaXMuX3Jlc3VsdCk7dC5pc1ZhbGlkKCl8fCh0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPXQuZ2V0RXJyb3JNZXNzYWdlKCksdGhpcy5fZXJyb3JMb2NhdGlvbj10LmdldEVycm9yTG9jYXRpb24oKSx0aGlzLl9lcnJvckluZGljYXRvcj10LmdldEVycm9ySW5kaWNhdG9yKCkpLHRoaXMucmVwb3J0KCJEaXN0YW5jZSIpfSxYdS5wcm90b3R5cGUuY2hlY2tBcmVhPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faW5wdXQuZ2V0QXJlYSgpLGU9dGhpcy5fcmVzdWx0LmdldEFyZWEoKTt0aGlzLl9kaXN0YW5jZT4wJiZ0PmUmJih0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPSJBcmVhIG9mIHBvc2l0aXZlIGJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gaW5wdXQiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX3Jlc3VsdCksdGhpcy5fZGlzdGFuY2U8MCYmdDxlJiYodGhpcy5faXNWYWxpZD0hMSx0aGlzLl9lcnJvck1zZz0iQXJlYSBvZiBuZWdhdGl2ZSBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gaW5wdXQiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX3Jlc3VsdCksdGhpcy5yZXBvcnQoIkFyZWEiKX0sWHUucHJvdG90eXBlLmNoZWNrUG9seWdvbmFsPWZ1bmN0aW9uKCl7dGhpcy5fcmVzdWx0IGluc3RhbmNlb2YgaHN8fHRoaXMuX3Jlc3VsdCBpbnN0YW5jZW9mIGRzfHwodGhpcy5faXNWYWxpZD0hMSksdGhpcy5fZXJyb3JNc2c9IlJlc3VsdCBpcyBub3QgcG9seWdvbmFsIix0aGlzLl9lcnJvckluZGljYXRvcj10aGlzLl9yZXN1bHQsdGhpcy5yZXBvcnQoIlBvbHlnb25hbCIpfSxYdS5wcm90b3R5cGUuZ2V0RXJyb3JJbmRpY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyb3JJbmRpY2F0b3J9LFh1LnByb3RvdHlwZS5nZXRFcnJvckxvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vycm9yTG9jYXRpb259LFh1LnByb3RvdHlwZS5jaGVja0V4cGVjdGVkRW1wdHk9ZnVuY3Rpb24oKXtpZih0aGlzLl9pbnB1dC5nZXREaW1lbnNpb24oKT49Mnx8dGhpcy5fZGlzdGFuY2U+MClyZXR1cm4gbnVsbDt0aGlzLl9yZXN1bHQuaXNFbXB0eSgpfHwodGhpcy5faXNWYWxpZD0hMSx0aGlzLl9lcnJvck1zZz0iUmVzdWx0IGlzIG5vbi1lbXB0eSIsdGhpcy5fZXJyb3JJbmRpY2F0b3I9dGhpcy5fcmVzdWx0KSx0aGlzLnJlcG9ydCgiRXhwZWN0ZWRFbXB0eSIpfSxYdS5wcm90b3R5cGUucmVwb3J0PWZ1bmN0aW9uKHQpe2lmKCFYdS5WRVJCT1NFKXJldHVybiBudWxsO2tpLm91dC5wcmludGxuKCJDaGVjayAiK3QrIjogIisodGhpcy5faXNWYWxpZD8icGFzc2VkIjoiRkFJTEVEIikpfSxYdS5wcm90b3R5cGUuZ2V0RXJyb3JNZXNzYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vycm9yTXNnfSxYdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFh1fSxYdS5pc1ZhbGlkTXNnPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgWHUodCxlLG4pO3JldHVybiByLmlzVmFsaWQoKT9udWxsOnIuZ2V0RXJyb3JNZXNzYWdlKCl9LFh1LmlzVmFsaWQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiEhbmV3IFh1KHQsZSxuKS5pc1ZhbGlkKCl9LFd1LlZFUkJPU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuITF9LFd1Lk1BWF9FTlZfRElGRl9GUkFDLmdldD1mdW5jdGlvbigpe3JldHVybi4wMTJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFh1LFd1KTt2YXIgSHU9ZnVuY3Rpb24oKXt0aGlzLl9wdHM9bnVsbCx0aGlzLl9kYXRhPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX3B0cz10LHRoaXMuX2RhdGE9ZX07SHUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0c30sSHUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRzLmxlbmd0aH0sSHUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B0c1t0XX0sSHUucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0c1swXS5lcXVhbHModGhpcy5fcHRzW3RoaXMuX3B0cy5sZW5ndGgtMV0pfSxIdS5wcm90b3R5cGUuZ2V0U2VnbWVudE9jdGFudD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PXRoaXMuX3B0cy5sZW5ndGgtMT8tMTp2YS5vY3RhbnQodGhpcy5nZXRDb29yZGluYXRlKHQpLHRoaXMuZ2V0Q29vcmRpbmF0ZSh0KzEpKX0sSHUucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dGhpcy5fZGF0YT10fSxIdS5wcm90b3R5cGUuZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSxIdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWGkudG9MaW5lU3RyaW5nKG5ldyB4cyh0aGlzLl9wdHMpKX0sSHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW19hXX0sSHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEh1fTt2YXIgWnU9ZnVuY3Rpb24oKXt0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz0hMSx0aGlzLl9pc0NoZWNrRW5kU2VnbWVudHNPbmx5PSExLHRoaXMuX2xpPW51bGwsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb249bnVsbCx0aGlzLl9pbnRTZWdtZW50cz1udWxsLHRoaXMuX2ludGVyc2VjdGlvbnM9bmV3IHhvLHRoaXMuX2ludGVyc2VjdGlvbkNvdW50PTAsdGhpcy5fa2VlcEludGVyc2VjdGlvbnM9ITA7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xpPXQsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb249bnVsbH07WnUucHJvdG90eXBlLmdldEludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ufSxadS5wcm90b3R5cGUuc2V0Q2hlY2tFbmRTZWdtZW50c09ubHk9ZnVuY3Rpb24odCl7dGhpcy5faXNDaGVja0VuZFNlZ21lbnRzT25seT10fSxadS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0aW9uU2VnbWVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW50U2VnbWVudHN9LFp1LnByb3RvdHlwZS5jb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnRlcnNlY3Rpb25Db3VudH0sWnUucHJvdG90eXBlLmdldEludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW50ZXJzZWN0aW9uc30sWnUucHJvdG90eXBlLnNldEZpbmRBbGxJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQpe3RoaXMuX2ZpbmRBbGxJbnRlcnNlY3Rpb25zPXR9LFp1LnByb3RvdHlwZS5zZXRLZWVwSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0KXt0aGlzLl9rZWVwSW50ZXJzZWN0aW9ucz10fSxadS5wcm90b3R5cGUucHJvY2Vzc0ludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4scil7aWYoIXRoaXMuX2ZpbmRBbGxJbnRlcnNlY3Rpb25zJiZ0aGlzLmhhc0ludGVyc2VjdGlvbigpfHx0PT09biYmZT09PXIpcmV0dXJuIG51bGw7aWYodGhpcy5faXNDaGVja0VuZFNlZ21lbnRzT25seSYmISh0aGlzLmlzRW5kU2VnbWVudCh0LGUpfHx0aGlzLmlzRW5kU2VnbWVudChuLHIpKSlyZXR1cm4gbnVsbDt2YXIgaT10LmdldENvb3JkaW5hdGVzKClbZV0sbz10LmdldENvb3JkaW5hdGVzKClbZSsxXSxzPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyXSxhPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyKzFdO3RoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oaSxvLHMsYSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJnRoaXMuX2xpLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oKSYmKHRoaXMuX2ludFNlZ21lbnRzPW5ldyBBcnJheSg0KS5maWxsKG51bGwpLHRoaXMuX2ludFNlZ21lbnRzWzBdPWksdGhpcy5faW50U2VnbWVudHNbMV09byx0aGlzLl9pbnRTZWdtZW50c1syXT1zLHRoaXMuX2ludFNlZ21lbnRzWzNdPWEsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb249dGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uKDApLHRoaXMuX2tlZXBJbnRlcnNlY3Rpb25zJiZ0aGlzLl9pbnRlcnNlY3Rpb25zLmFkZCh0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbiksdGhpcy5faW50ZXJzZWN0aW9uQ291bnQrKyl9LFp1LnByb3RvdHlwZS5pc0VuZFNlZ21lbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMD09PWV8fGU+PXQuc2l6ZSgpLTJ9LFp1LnByb3RvdHlwZS5oYXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ufSxadS5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2ZpbmRBbGxJbnRlcnNlY3Rpb25zJiZudWxsIT09dGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb259LFp1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltldV19LFp1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBadX0sWnUuY3JlYXRlQWxsSW50ZXJzZWN0aW9uc0ZpbmRlcj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgWnUodCk7cmV0dXJuIGUuc2V0RmluZEFsbEludGVyc2VjdGlvbnMoITApLGV9LFp1LmNyZWF0ZUFueUludGVyc2VjdGlvbkZpbmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFp1KHQpfSxadS5jcmVhdGVJbnRlcnNlY3Rpb25Db3VudGVyPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBadSh0KTtyZXR1cm4gZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucyghMCksZS5zZXRLZWVwSW50ZXJzZWN0aW9ucyghMSksZX07dmFyIEt1PWZ1bmN0aW9uKCl7dGhpcy5fbGk9bmV3IFFpLHRoaXMuX3NlZ1N0cmluZ3M9bnVsbCx0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz0hMSx0aGlzLl9zZWdJbnQ9bnVsbCx0aGlzLl9pc1ZhbGlkPSEwO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9zZWdTdHJpbmdzPXR9O0t1LnByb3RvdHlwZS5leGVjdXRlPWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3NlZ0ludClyZXR1cm4gbnVsbDt0aGlzLmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zKCl9LEt1LnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NlZ0ludC5nZXRJbnRlcnNlY3Rpb25zKCl9LEt1LnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXhlY3V0ZSgpLHRoaXMuX2lzVmFsaWR9LEt1LnByb3RvdHlwZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0KXt0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz10fSxLdS5wcm90b3R5cGUuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLl9pc1ZhbGlkPSEwLHRoaXMuX3NlZ0ludD1uZXcgWnUodGhpcy5fbGkpLHRoaXMuX3NlZ0ludC5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucyh0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucyk7dmFyIHQ9bmV3IElhO2lmKHQuc2V0U2VnbWVudEludGVyc2VjdG9yKHRoaXMuX3NlZ0ludCksdC5jb21wdXRlTm9kZXModGhpcy5fc2VnU3RyaW5ncyksdGhpcy5fc2VnSW50Lmhhc0ludGVyc2VjdGlvbigpKXJldHVybiB0aGlzLl9pc1ZhbGlkPSExLG51bGx9LEt1LnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKCl7aWYodGhpcy5leGVjdXRlKCksIXRoaXMuX2lzVmFsaWQpdGhyb3cgbmV3IFJzKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKCksdGhpcy5fc2VnSW50LmdldEludGVyaW9ySW50ZXJzZWN0aW9uKCkpfSxLdS5wcm90b3R5cGUuZ2V0RXJyb3JNZXNzYWdlPWZ1bmN0aW9uKCl7aWYodGhpcy5faXNWYWxpZClyZXR1cm4ibm8gaW50ZXJzZWN0aW9ucyBmb3VuZCI7dmFyIHQ9dGhpcy5fc2VnSW50LmdldEludGVyc2VjdGlvblNlZ21lbnRzKCk7cmV0dXJuImZvdW5kIG5vbi1ub2RlZCBpbnRlcnNlY3Rpb24gYmV0d2VlbiAiK1hpLnRvTGluZVN0cmluZyh0WzBdLHRbMV0pKyIgYW5kICIrWGkudG9MaW5lU3RyaW5nKHRbMl0sdFszXSl9LEt1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxLdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gS3V9LEt1LmNvbXB1dGVJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBLdSh0KTtyZXR1cm4gZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucyghMCksZS5pc1ZhbGlkKCksZS5nZXRJbnRlcnNlY3Rpb25zKCl9O3ZhciBKdT1mdW5jdGlvbiB0KCl7dGhpcy5fbnY9bnVsbDt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5fbnY9bmV3IEt1KHQudG9TZWdtZW50U3RyaW5ncyhlKSl9O0p1LnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKCl7dGhpcy5fbnYuY2hlY2tWYWxpZCgpfSxKdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEp1fSxKdS50b1NlZ21lbnRTdHJpbmdzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtlLmFkZChuZXcgSHUoci5nZXRDb29yZGluYXRlcygpLHIpKX1yZXR1cm4gZX0sSnUuY2hlY2tWYWxpZD1mdW5jdGlvbih0KXtuZXcgSnUodCkuY2hlY2tWYWxpZCgpfTt2YXIgUXU9ZnVuY3Rpb24odCl7dGhpcy5fbWFwT3A9dH07UXUucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49MDtuPHQuZ2V0TnVtR2VvbWV0cmllcygpO24rKyl7dmFyIHI9dGhpcy5fbWFwT3AubWFwKHQuZ2V0R2VvbWV0cnlOKG4pKTtyLmlzRW1wdHkoKXx8ZS5hZGQocil9cmV0dXJuIHQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihJcy50b0dlb21ldHJ5QXJyYXkoZSkpfSxRdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFF1fSxRdS5tYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IFF1KGUpLm1hcCh0KX07dmFyICR1PWZ1bmN0aW9uKCl7dGhpcy5fb3A9bnVsbCx0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9bnVsbCx0aGlzLl9wdExvY2F0b3I9bnVsbCx0aGlzLl9saW5lRWRnZXNMaXN0PW5ldyB4byx0aGlzLl9yZXN1bHRMaW5lTGlzdD1uZXcgeG87dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX29wPXQsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PWUsdGhpcy5fcHRMb2NhdG9yPW59OyR1LnByb3RvdHlwZS5jb2xsZWN0TGluZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj10aGlzLl9vcC5nZXRHcmFwaCgpLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2UuY29sbGVjdExpbmVFZGdlKHIsdCxlLl9saW5lRWRnZXNMaXN0KSxlLmNvbGxlY3RCb3VuZGFyeVRvdWNoRWRnZShyLHQsZS5fbGluZUVkZ2VzTGlzdCl9fSwkdS5wcm90b3R5cGUubGFiZWxJc29sYXRlZExpbmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9wdExvY2F0b3IubG9jYXRlKHQuZ2V0Q29vcmRpbmF0ZSgpLHRoaXMuX29wLmdldEFyZ0dlb21ldHJ5KGUpKTt0LmdldExhYmVsKCkuc2V0TG9jYXRpb24oZSxuKX0sJHUucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbmRDb3ZlcmVkTGluZUVkZ2VzKCksdGhpcy5jb2xsZWN0TGluZXModCksdGhpcy5idWlsZExpbmVzKHQpLHRoaXMuX3Jlc3VsdExpbmVMaXN0fSwkdS5wcm90b3R5cGUuY29sbGVjdExpbmVFZGdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmdldExhYmVsKCksaT10LmdldEVkZ2UoKTt0LmlzTGluZUVkZ2UoKSYmIXQuaXNWaXNpdGVkKCkmJk9jLmlzUmVzdWx0T2ZPcChyLGUpJiYhaS5pc0NvdmVyZWQoKSYmKG4uYWRkKGkpLHQuc2V0VmlzaXRlZEVkZ2UoITApKX0sJHUucHJvdG90eXBlLmZpbmRDb3ZlcmVkTGluZUVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX29wLmdldEdyYXBoKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5maW5kQ292ZXJlZExpbmVFZGdlcygpfWZvcih2YXIgZT10aGlzLl9vcC5nZXRHcmFwaCgpLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLHI9bi5nZXRFZGdlKCk7aWYobi5pc0xpbmVFZGdlKCkmJiFyLmlzQ292ZXJlZFNldCgpKXt2YXIgaT10aGlzLl9vcC5pc0NvdmVyZWRCeUEobi5nZXRDb29yZGluYXRlKCkpO3Iuc2V0Q292ZXJlZChpKX19fSwkdS5wcm90b3R5cGUubGFiZWxJc29sYXRlZExpbmVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKSxyPW4uZ2V0TGFiZWwoKTtuLmlzSXNvbGF0ZWQoKSYmKHIuaXNOdWxsKDApP3RoaXMubGFiZWxJc29sYXRlZExpbmUobiwwKTp0aGlzLmxhYmVsSXNvbGF0ZWRMaW5lKG4sMSkpfX0sJHUucHJvdG90eXBlLmJ1aWxkTGluZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2xpbmVFZGdlc0xpc3QuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLHI9dGhpcy5fZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVTdHJpbmcobi5nZXRDb29yZGluYXRlcygpKTt0aGlzLl9yZXN1bHRMaW5lTGlzdC5hZGQociksbi5zZXRJblJlc3VsdCghMCl9fSwkdS5wcm90b3R5cGUuY29sbGVjdEJvdW5kYXJ5VG91Y2hFZGdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmdldExhYmVsKCk7aWYodC5pc0xpbmVFZGdlKCl8fHQuaXNWaXNpdGVkKCl8fHQuaXNJbnRlcmlvckFyZWFFZGdlKCl8fHQuZ2V0RWRnZSgpLmlzSW5SZXN1bHQoKSlyZXR1cm4gbnVsbDtaaS5pc1RydWUoISh0LmlzSW5SZXN1bHQoKXx8dC5nZXRTeW0oKS5pc0luUmVzdWx0KCkpfHwhdC5nZXRFZGdlKCkuaXNJblJlc3VsdCgpKSxPYy5pc1Jlc3VsdE9mT3AocixlKSYmZT09PU9jLklOVEVSU0VDVElPTiYmKG4uYWRkKHQuZ2V0RWRnZSgpKSx0LnNldFZpc2l0ZWRFZGdlKCEwKSl9LCR1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSwkdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gJHV9O3ZhciB0Yz1mdW5jdGlvbigpe3RoaXMuX29wPW51bGwsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PW51bGwsdGhpcy5fcmVzdWx0UG9pbnRMaXN0PW5ldyB4bzt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fb3A9dCx0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9ZX07dGMucHJvdG90eXBlLmZpbHRlckNvdmVyZWROb2RlVG9Qb2ludD1mdW5jdGlvbih0KXt2YXIgZT10LmdldENvb3JkaW5hdGUoKTtpZighdGhpcy5fb3AuaXNDb3ZlcmVkQnlMQShlKSl7dmFyIG49dGhpcy5fZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvaW50KGUpO3RoaXMuX3Jlc3VsdFBvaW50TGlzdC5hZGQobil9fSx0Yy5wcm90b3R5cGUuZXh0cmFjdE5vbkNvdmVyZWRSZXN1bHROb2Rlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fb3AuZ2V0R3JhcGgoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtpZighKG4uaXNJblJlc3VsdCgpfHxuLmlzSW5jaWRlbnRFZGdlSW5SZXN1bHQoKXx8MCE9PW4uZ2V0RWRnZXMoKS5nZXREZWdyZWUoKSYmdCE9PU9jLklOVEVSU0VDVElPTikpe3ZhciByPW4uZ2V0TGFiZWwoKTtPYy5pc1Jlc3VsdE9mT3Aocix0KSYmdGhpcy5maWx0ZXJDb3ZlcmVkTm9kZVRvUG9pbnQobil9fX0sdGMucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmV4dHJhY3ROb25Db3ZlcmVkUmVzdWx0Tm9kZXModCksdGhpcy5fcmVzdWx0UG9pbnRMaXN0fSx0Yy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHRjfTt2YXIgZWM9ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEdlb209bnVsbCx0aGlzLl9mYWN0b3J5PW51bGwsdGhpcy5fcHJ1bmVFbXB0eUdlb21ldHJ5PSEwLHRoaXMuX3ByZXNlcnZlR2VvbWV0cnlDb2xsZWN0aW9uVHlwZT0hMCx0aGlzLl9wcmVzZXJ2ZUNvbGxlY3Rpb25zPSExLHRoaXMuX3ByZXNlcnZlVHlwZT0hMX07ZWMucHJvdG90eXBlLnRyYW5zZm9ybVBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9pbnQodGhpcy50cmFuc2Zvcm1Db29yZGluYXRlcyh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpKX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybVBvbHlnb249ZnVuY3Rpb24odCxlKXt2YXIgbj0hMCxyPXRoaXMudHJhbnNmb3JtTGluZWFyUmluZyh0LmdldEV4dGVyaW9yUmluZygpLHQpOyhudWxsPT09cnx8IShyIGluc3RhbmNlb2YgcHMpfHxyLmlzRW1wdHkoKSkmJihuPSExKTtmb3IodmFyIGk9bmV3IHhvLG89MDtvPHQuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7bysrKXt2YXIgcz10aGlzLnRyYW5zZm9ybUxpbmVhclJpbmcodC5nZXRJbnRlcmlvclJpbmdOKG8pLHQpO251bGw9PT1zfHxzLmlzRW1wdHkoKXx8KHMgaW5zdGFuY2VvZiBwc3x8KG49ITEpLGkuYWRkKHMpKX1pZihuKXJldHVybiB0aGlzLl9mYWN0b3J5LmNyZWF0ZVBvbHlnb24ocixpLnRvQXJyYXkoW10pKTt2YXIgYT1uZXcgeG87cmV0dXJuIG51bGwhPT1yJiZhLmFkZChyKSxhLmFkZEFsbChpKSx0aGlzLl9mYWN0b3J5LmJ1aWxkR2VvbWV0cnkoYSl9LGVjLnByb3RvdHlwZS5jcmVhdGVDb29yZGluYXRlU2VxdWVuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ZhY3RvcnkuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KX0sZWMucHJvdG90eXBlLmdldElucHV0R2VvbWV0cnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5wdXRHZW9tfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtTXVsdGlMaW5lU3RyaW5nPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyB4byxyPTA7cjx0LmdldE51bUdlb21ldHJpZXMoKTtyKyspe3ZhciBpPXRoaXMudHJhbnNmb3JtTGluZVN0cmluZyh0LmdldEdlb21ldHJ5TihyKSx0KTtudWxsIT09aSYmKGkuaXNFbXB0eSgpfHxuLmFkZChpKSl9cmV0dXJuIHRoaXMuX2ZhY3RvcnkuYnVpbGRHZW9tZXRyeShuKX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29weSh0KX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybUxpbmVTdHJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKHRoaXMudHJhbnNmb3JtQ29vcmRpbmF0ZXModC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KSl9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1NdWx0aVBvaW50PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyB4byxyPTA7cjx0LmdldE51bUdlb21ldHJpZXMoKTtyKyspe3ZhciBpPXRoaXMudHJhbnNmb3JtUG9pbnQodC5nZXRHZW9tZXRyeU4ociksdCk7bnVsbCE9PWkmJihpLmlzRW1wdHkoKXx8bi5hZGQoaSkpfXJldHVybiB0aGlzLl9mYWN0b3J5LmJ1aWxkR2VvbWV0cnkobil9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1NdWx0aVBvbHlnb249ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IHhvLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9dGhpcy50cmFuc2Zvcm1Qb2x5Z29uKHQuZ2V0R2VvbWV0cnlOKHIpLHQpO251bGwhPT1pJiYoaS5pc0VtcHR5KCl8fG4uYWRkKGkpKX1yZXR1cm4gdGhpcy5fZmFjdG9yeS5idWlsZEdlb21ldHJ5KG4pfSxlYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCl9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1HZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IHhvLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9dGhpcy50cmFuc2Zvcm0odC5nZXRHZW9tZXRyeU4ocikpO251bGwhPT1pJiYodGhpcy5fcHJ1bmVFbXB0eUdlb21ldHJ5JiZpLmlzRW1wdHkoKXx8bi5hZGQoaSkpfXJldHVybiB0aGlzLl9wcmVzZXJ2ZUdlb21ldHJ5Q29sbGVjdGlvblR5cGU/dGhpcy5fZmFjdG9yeS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oSXMudG9HZW9tZXRyeUFycmF5KG4pKTp0aGlzLl9mYWN0b3J5LmJ1aWxkR2VvbWV0cnkobil9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24odCl7aWYodGhpcy5faW5wdXRHZW9tPXQsdGhpcy5fZmFjdG9yeT10LmdldEZhY3RvcnkoKSx0IGluc3RhbmNlb2YgY3MpcmV0dXJuIHRoaXMudHJhbnNmb3JtUG9pbnQodCxudWxsKTtpZih0IGluc3RhbmNlb2YgZnMpcmV0dXJuIHRoaXMudHJhbnNmb3JtTXVsdGlQb2ludCh0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBwcylyZXR1cm4gdGhpcy50cmFuc2Zvcm1MaW5lYXJSaW5nKHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIGFzKXJldHVybiB0aGlzLnRyYW5zZm9ybUxpbmVTdHJpbmcodCxudWxsKTtpZih0IGluc3RhbmNlb2YgWm8pcmV0dXJuIHRoaXMudHJhbnNmb3JtTXVsdGlMaW5lU3RyaW5nKHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIGhzKXJldHVybiB0aGlzLnRyYW5zZm9ybVBvbHlnb24odCxudWxsKTtpZih0IGluc3RhbmNlb2YgZHMpcmV0dXJuIHRoaXMudHJhbnNmb3JtTXVsdGlQb2x5Z29uKHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIEhvKXJldHVybiB0aGlzLnRyYW5zZm9ybUdlb21ldHJ5Q29sbGVjdGlvbih0LG51bGwpO3Rocm93IG5ldyBoaSgiVW5rbm93biBHZW9tZXRyeSBzdWJ0eXBlOiAiK3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtTGluZWFyUmluZz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMudHJhbnNmb3JtQ29vcmRpbmF0ZXModC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KTtpZihudWxsPT09bilyZXR1cm4gdGhpcy5fZmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKG51bGwpO3ZhciByPW4uc2l6ZSgpO3JldHVybiByPjAmJnI8NCYmIXRoaXMuX3ByZXNlcnZlVHlwZT90aGlzLl9mYWN0b3J5LmNyZWF0ZUxpbmVTdHJpbmcobik6dGhpcy5fZmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKG4pfSxlYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZWMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGVjfTt2YXIgbmM9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX3NuYXBUb2xlcmFuY2U9MCx0aGlzLl9zcmNQdHM9bnVsbCx0aGlzLl9zZWc9bmV3IGJhLHRoaXMuX2FsbG93U25hcHBpbmdUb1NvdXJjZVZlcnRpY2VzPSExLHRoaXMuX2lzQ2xvc2VkPSExLGFyZ3VtZW50c1swXWluc3RhbmNlb2YgYXMmJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgZT1hcmd1bWVudHNbMV07dC5jYWxsKHRoaXMsYXJndW1lbnRzWzBdLmdldENvb3JkaW5hdGVzKCksZSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMuX3NyY1B0cz1uLHRoaXMuX2lzQ2xvc2VkPXQuaXNDbG9zZWQobiksdGhpcy5fc25hcFRvbGVyYW5jZT1yfX07bmMucHJvdG90eXBlLnNuYXBWZXJ0aWNlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLl9pc0Nsb3NlZD90LnNpemUoKS0xOnQuc2l6ZSgpLHI9MDtyPG47cisrKXt2YXIgaT10LmdldChyKSxvPXRoaXMuZmluZFNuYXBGb3JWZXJ0ZXgoaSxlKTtudWxsIT09byYmKHQuc2V0KHIsbmV3IHZpKG8pKSwwPT09ciYmdGhpcy5faXNDbG9zZWQmJnQuc2V0KHQuc2l6ZSgpLTEsbmV3IHZpKG8pKSl9fSxuYy5wcm90b3R5cGUuZmluZFNuYXBGb3JWZXJ0ZXg9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7aWYodC5lcXVhbHMyRChlW25dKSlyZXR1cm4gbnVsbDtpZih0LmRpc3RhbmNlKGVbbl0pPHRoaXMuX3NuYXBUb2xlcmFuY2UpcmV0dXJuIGVbbl19cmV0dXJuIG51bGx9LG5jLnByb3RvdHlwZS5zbmFwVG89ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGJvKHRoaXMuX3NyY1B0cyk7cmV0dXJuIHRoaXMuc25hcFZlcnRpY2VzKGUsdCksdGhpcy5zbmFwU2VnbWVudHMoZSx0KSxlLnRvQ29vcmRpbmF0ZUFycmF5KCl9LG5jLnByb3RvdHlwZS5zbmFwU2VnbWVudHM9ZnVuY3Rpb24odCxlKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIG49ZS5sZW5ndGg7ZVswXS5lcXVhbHMyRChlW2UubGVuZ3RoLTFdKSYmKG49ZS5sZW5ndGgtMSk7Zm9yKHZhciByPTA7cjxuO3IrKyl7dmFyIGk9ZVtyXSxvPXRoaXMuZmluZFNlZ21lbnRJbmRleFRvU25hcChpLHQpO28+PTAmJnQuYWRkKG8rMSxuZXcgdmkoaSksITEpfX0sbmMucHJvdG90eXBlLmZpbmRTZWdtZW50SW5kZXhUb1NuYXA9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcyxyPWZpLk1BWF9WQUxVRSxpPS0xLG89MDtvPGUuc2l6ZSgpLTE7bysrKXtpZihuLl9zZWcucDA9ZS5nZXQobyksbi5fc2VnLnAxPWUuZ2V0KG8rMSksbi5fc2VnLnAwLmVxdWFsczJEKHQpfHxuLl9zZWcucDEuZXF1YWxzMkQodCkpe2lmKG4uX2FsbG93U25hcHBpbmdUb1NvdXJjZVZlcnRpY2VzKWNvbnRpbnVlO3JldHVybi0xfXZhciBzPW4uX3NlZy5kaXN0YW5jZSh0KTtzPG4uX3NuYXBUb2xlcmFuY2UmJnM8ciYmKHI9cyxpPW8pfXJldHVybiBpfSxuYy5wcm90b3R5cGUuc2V0QWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXM9ZnVuY3Rpb24odCl7dGhpcy5fYWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXM9dH0sbmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LG5jLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBuY30sbmMuaXNDbG9zZWQ9ZnVuY3Rpb24odCl7cmV0dXJuISh0Lmxlbmd0aDw9MSkmJnRbMF0uZXF1YWxzMkQodFt0Lmxlbmd0aC0xXSl9O3ZhciByYz1mdW5jdGlvbih0KXt0aGlzLl9zcmNHZW9tPXR8fG51bGx9LGljPXtTTkFQX1BSRUNJU0lPTl9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH19O3JjLnByb3RvdHlwZS5zbmFwVG89ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmV4dHJhY3RUYXJnZXRDb29yZGluYXRlcyh0KTtyZXR1cm4gbmV3IG9jKGUsbikudHJhbnNmb3JtKHRoaXMuX3NyY0dlb20pfSxyYy5wcm90b3R5cGUuc25hcFRvU2VsZj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZXh0cmFjdFRhcmdldENvb3JkaW5hdGVzKHRoaXMuX3NyY0dlb20pLHI9bmV3IG9jKHQsbiwhMCkudHJhbnNmb3JtKHRoaXMuX3NyY0dlb20pLGk9cjtyZXR1cm4gZSYmRWkoaSxscykmJihpPXIuYnVmZmVyKDApKSxpfSxyYy5wcm90b3R5cGUuY29tcHV0ZVNuYXBUb2xlcmFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcHV0ZU1pbmltdW1TZWdtZW50TGVuZ3RoKHQpLzEwfSxyYy5wcm90b3R5cGUuZXh0cmFjdFRhcmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgVW8sbj10LmdldENvb3JkaW5hdGVzKCkscj0wO3I8bi5sZW5ndGg7cisrKWUuYWRkKG5bcl0pO3JldHVybiBlLnRvQXJyYXkobmV3IEFycmF5KDApLmZpbGwobnVsbCkpfSxyYy5wcm90b3R5cGUuY29tcHV0ZU1pbmltdW1TZWdtZW50TGVuZ3RoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1maS5NQVhfVkFMVUUsbj0wO248dC5sZW5ndGgtMTtuKyspe3ZhciByPXRbbl0uZGlzdGFuY2UodFtuKzFdKTtyPGUmJihlPXIpfXJldHVybiBlfSxyYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHJjfSxyYy5zbmFwPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgQXJyYXkoMikuZmlsbChudWxsKSxpPW5ldyByYyh0KTtyWzBdPWkuc25hcFRvKGUsbik7dmFyIG89bmV3IHJjKGUpO3JldHVybiByWzFdPW8uc25hcFRvKHJbMF0sbikscn0scmMuY29tcHV0ZU92ZXJsYXlTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXJjLmNvbXB1dGVTaXplQmFzZWRTbmFwVG9sZXJhbmNlKHQpLG49dC5nZXRQcmVjaXNpb25Nb2RlbCgpO2lmKG4uZ2V0VHlwZSgpPT09Q3MuRklYRUQpe3ZhciByPTEvbi5nZXRTY2FsZSgpKjIvMS40MTU7cj5lJiYoZT1yKX1yZXR1cm4gZX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdO3JldHVybiBNYXRoLm1pbihyYy5jb21wdXRlT3ZlcmxheVNuYXBUb2xlcmFuY2UoaSkscmMuY29tcHV0ZU92ZXJsYXlTbmFwVG9sZXJhbmNlKG8pKX19LHJjLmNvbXB1dGVTaXplQmFzZWRTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpO3JldHVybiBNYXRoLm1pbihlLmdldEhlaWdodCgpLGUuZ2V0V2lkdGgoKSkqcmMuU05BUF9QUkVDSVNJT05fRkFDVE9SfSxyYy5zbmFwVG9TZWxmPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IHJjKHQpLnNuYXBUb1NlbGYoZSxuKX0saWMuU05BUF9QUkVDSVNJT05fRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybiAxZS05fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhyYyxpYyk7dmFyIG9jPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIpe3QuY2FsbCh0aGlzKSx0aGlzLl9zbmFwVG9sZXJhbmNlPWV8fG51bGwsdGhpcy5fc25hcFB0cz1ufHxudWxsLHRoaXMuX2lzU2VsZlNuYXA9dm9pZCAwIT09ciYmcn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuc25hcExpbmU9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgbmModCx0aGlzLl9zbmFwVG9sZXJhbmNlKTtyZXR1cm4gbi5zZXRBbGxvd1NuYXBwaW5nVG9Tb3VyY2VWZXJ0aWNlcyh0aGlzLl9pc1NlbGZTbmFwKSxuLnNuYXBUbyhlKX0sZS5wcm90b3R5cGUudHJhbnNmb3JtQ29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnRvQ29vcmRpbmF0ZUFycmF5KCkscj10aGlzLnNuYXBMaW5lKG4sdGhpcy5fc25hcFB0cyk7cmV0dXJuIHRoaXMuX2ZhY3RvcnkuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShyKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oZWMpLHNjPWZ1bmN0aW9uKCl7dGhpcy5faXNGaXJzdD0hMCx0aGlzLl9jb21tb25NYW50aXNzYUJpdHNDb3VudD01Myx0aGlzLl9jb21tb25CaXRzPTAsdGhpcy5fY29tbW9uU2lnbkV4cD1udWxsfTtzYy5wcm90b3R5cGUuZ2V0Q29tbW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGZpLmxvbmdCaXRzVG9Eb3VibGUodGhpcy5fY29tbW9uQml0cyl9LHNjLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dmFyIGU9ZmkuZG91YmxlVG9Mb25nQml0cyh0KTtyZXR1cm4gdGhpcy5faXNGaXJzdD8odGhpcy5fY29tbW9uQml0cz1lLHRoaXMuX2NvbW1vblNpZ25FeHA9c2Muc2lnbkV4cEJpdHModGhpcy5fY29tbW9uQml0cyksdGhpcy5faXNGaXJzdD0hMSxudWxsKTpzYy5zaWduRXhwQml0cyhlKSE9PXRoaXMuX2NvbW1vblNpZ25FeHA/KHRoaXMuX2NvbW1vbkJpdHM9MCxudWxsKToodGhpcy5fY29tbW9uTWFudGlzc2FCaXRzQ291bnQ9c2MubnVtQ29tbW9uTW9zdFNpZ01hbnRpc3NhQml0cyh0aGlzLl9jb21tb25CaXRzLGUpLHZvaWQodGhpcy5fY29tbW9uQml0cz1zYy56ZXJvTG93ZXJCaXRzKHRoaXMuX2NvbW1vbkJpdHMsNjQtKDEyK3RoaXMuX2NvbW1vbk1hbnRpc3NhQml0c0NvdW50KSkpKX0sc2MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWZpLmxvbmdCaXRzVG9Eb3VibGUodCksbj0iMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIrZmkudG9CaW5hcnlTdHJpbmcodCkscj1uLnN1YnN0cmluZyhuLmxlbmd0aC02NCk7cmV0dXJuIHIuc3Vic3RyaW5nKDAsMSkrIiAgIityLnN1YnN0cmluZygxLDEyKSsiKGV4cCkgIityLnN1YnN0cmluZygxMikrIiBbICIrZSsiIF0ifX0sc2MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHNjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBzY30sc2MuZ2V0Qml0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmMTw8ZT8xOjB9LHNjLnNpZ25FeHBCaXRzPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj41Mn0sc2MuemVyb0xvd2VyQml0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0Jn4oKDE8PGUpLTEpfSxzYy5udW1Db21tb25Nb3N0U2lnTWFudGlzc2FCaXRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj01MjtyPj0wO3ItLSl7aWYoc2MuZ2V0Qml0KHQscikhPT1zYy5nZXRCaXQoZSxyKSlyZXR1cm4gbjtuKyt9cmV0dXJuIDUyfTt2YXIgYWM9ZnVuY3Rpb24oKXt0aGlzLl9jb21tb25Db29yZD1udWxsLHRoaXMuX2NjRmlsdGVyPW5ldyBjY30sdWM9e0NvbW1vbkNvb3JkaW5hdGVGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH0sVHJhbnNsYXRlcjp7Y29uZmlndXJhYmxlOiEwfX07YWMucHJvdG90eXBlLmFkZENvbW1vbkJpdHM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGxjKHRoaXMuX2NvbW1vbkNvb3JkKTt0LmFwcGx5KGUpLHQuZ2VvbWV0cnlDaGFuZ2VkKCl9LGFjLnByb3RvdHlwZS5yZW1vdmVDb21tb25CaXRzPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLl9jb21tb25Db29yZC54JiYwPT09dGhpcy5fY29tbW9uQ29vcmQueSlyZXR1cm4gdDt2YXIgZT1uZXcgdmkodGhpcy5fY29tbW9uQ29vcmQpO2UueD0tZS54LGUueT0tZS55O3ZhciBuPW5ldyBsYyhlKTtyZXR1cm4gdC5hcHBseShuKSx0Lmdlb21ldHJ5Q2hhbmdlZCgpLHR9LGFjLnByb3RvdHlwZS5nZXRDb21tb25Db29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbW1vbkNvb3JkfSxhYy5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3QuYXBwbHkodGhpcy5fY2NGaWx0ZXIpLHRoaXMuX2NvbW1vbkNvb3JkPXRoaXMuX2NjRmlsdGVyLmdldENvbW1vbkNvb3JkaW5hdGUoKX0sYWMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGFjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBhY30sdWMuQ29tbW9uQ29vcmRpbmF0ZUZpbHRlci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gY2N9LHVjLlRyYW5zbGF0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGxjfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhhYyx1Yyk7dmFyIGNjPWZ1bmN0aW9uKCl7dGhpcy5fY29tbW9uQml0c1g9bmV3IHNjLHRoaXMuX2NvbW1vbkJpdHNZPW5ldyBzY307Y2MucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt0aGlzLl9jb21tb25CaXRzWC5hZGQodC54KSx0aGlzLl9jb21tb25CaXRzWS5hZGQodC55KX0sY2MucHJvdG90eXBlLmdldENvbW1vbkNvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHZpKHRoaXMuX2NvbW1vbkJpdHNYLmdldENvbW1vbigpLHRoaXMuX2NvbW1vbkJpdHNZLmdldENvbW1vbigpKX0sY2MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2FvXX0sY2MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGNjfTt2YXIgbGM9ZnVuY3Rpb24oKXt0aGlzLnRyYW5zPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMudHJhbnM9dH07bGMucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0T3JkaW5hdGUoZSwwKSt0aGlzLnRyYW5zLngscj10LmdldE9yZGluYXRlKGUsMSkrdGhpcy50cmFucy55O3Quc2V0T3JkaW5hdGUoZSwwLG4pLHQuc2V0T3JkaW5hdGUoZSwxLHIpfSxsYy5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGxjLnByb3RvdHlwZS5pc0dlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe3JldHVybiEwfSxsYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bV29dfSxsYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbGN9O3ZhciBoYz1mdW5jdGlvbih0LGUpe3RoaXMuX2dlb209bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5fc25hcFRvbGVyYW5jZT1udWxsLHRoaXMuX2Nicj1udWxsLHRoaXMuX2dlb21bMF09dCx0aGlzLl9nZW9tWzFdPWUsdGhpcy5jb21wdXRlU25hcFRvbGVyYW5jZSgpfTtoYy5wcm90b3R5cGUuc2VsZlNuYXA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyByYyh0KS5zbmFwVG8odCx0aGlzLl9zbmFwVG9sZXJhbmNlKX0saGMucHJvdG90eXBlLnJlbW92ZUNvbW1vbkJpdHM9ZnVuY3Rpb24odCl7dGhpcy5fY2JyPW5ldyBhYyx0aGlzLl9jYnIuYWRkKHRbMF0pLHRoaXMuX2Nici5hZGQodFsxXSk7dmFyIGU9bmV3IEFycmF5KDIpLmZpbGwobnVsbCk7cmV0dXJuIGVbMF09dGhpcy5fY2JyLnJlbW92ZUNvbW1vbkJpdHModFswXS5jb3B5KCkpLGVbMV09dGhpcy5fY2JyLnJlbW92ZUNvbW1vbkJpdHModFsxXS5jb3B5KCkpLGV9LGhjLnByb3RvdHlwZS5wcmVwYXJlUmVzdWx0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jYnIuYWRkQ29tbW9uQml0cyh0KSx0fSxoYy5wcm90b3R5cGUuZ2V0UmVzdWx0R2VvbWV0cnk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zbmFwKHRoaXMuX2dlb20pLG49T2Mub3ZlcmxheU9wKGVbMF0sZVsxXSx0KTtyZXR1cm4gdGhpcy5wcmVwYXJlUmVzdWx0KG4pfSxoYy5wcm90b3R5cGUuY2hlY2tWYWxpZD1mdW5jdGlvbih0KXt0LmlzVmFsaWQoKXx8a2kub3V0LnByaW50bG4oIlNuYXBwZWQgZ2VvbWV0cnkgaXMgaW52YWxpZCIpfSxoYy5wcm90b3R5cGUuY29tcHV0ZVNuYXBUb2xlcmFuY2U9ZnVuY3Rpb24oKXt0aGlzLl9zbmFwVG9sZXJhbmNlPXJjLmNvbXB1dGVPdmVybGF5U25hcFRvbGVyYW5jZSh0aGlzLl9nZW9tWzBdLHRoaXMuX2dlb21bMV0pfSxoYy5wcm90b3R5cGUuc25hcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnJlbW92ZUNvbW1vbkJpdHModCk7cmV0dXJuIHJjLnNuYXAoZVswXSxlWzFdLHRoaXMuX3NuYXBUb2xlcmFuY2UpfSxoYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0saGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGhjfSxoYy5vdmVybGF5T3A9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuZXcgaGModCxlKS5nZXRSZXN1bHRHZW9tZXRyeShuKX0saGMudW5pb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gaGMub3ZlcmxheU9wKHQsZSxPYy5VTklPTil9LGhjLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiBoYy5vdmVybGF5T3AodCxlLE9jLklOVEVSU0VDVElPTil9LGhjLnN5bURpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaGMub3ZlcmxheU9wKHQsZSxPYy5TWU1ESUZGRVJFTkNFKX0saGMuZGlmZmVyZW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBoYy5vdmVybGF5T3AodCxlLE9jLkRJRkZFUkVOQ0UpfTt2YXIgZmM9ZnVuY3Rpb24odCxlKXt0aGlzLl9nZW9tPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX2dlb21bMF09dCx0aGlzLl9nZW9tWzFdPWV9O2ZjLnByb3RvdHlwZS5nZXRSZXN1bHRHZW9tZXRyeT1mdW5jdGlvbih0KXt2YXIgZT1udWxsLG49ITEscj1udWxsO3RyeXtlPU9jLm92ZXJsYXlPcCh0aGlzLl9nZW9tWzBdLHRoaXMuX2dlb21bMV0sdCk7bj0hMH1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBXaSkpdGhyb3cgdDtyPXR9aWYoIW4pdHJ5e2U9aGMub3ZlcmxheU9wKHRoaXMuX2dlb21bMF0sdGhpcy5fZ2VvbVsxXSx0KX1jYXRjaCh0KXt0aHJvdyB0IGluc3RhbmNlb2YgV2k/cjp0fXJldHVybiBlfSxmYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGZjfSxmYy5vdmVybGF5T3A9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuZXcgZmModCxlKS5nZXRSZXN1bHRHZW9tZXRyeShuKX0sZmMudW5pb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gZmMub3ZlcmxheU9wKHQsZSxPYy5VTklPTil9LGZjLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiBmYy5vdmVybGF5T3AodCxlLE9jLklOVEVSU0VDVElPTil9LGZjLnN5bURpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZmMub3ZlcmxheU9wKHQsZSxPYy5TWU1ESUZGRVJFTkNFKX0sZmMuZGlmZmVyZW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBmYy5vdmVybGF5T3AodCxlLE9jLkRJRkZFUkVOQ0UpfTt2YXIgcGM9ZnVuY3Rpb24oKXt0aGlzLm1jZT1udWxsLHRoaXMuY2hhaW5JbmRleD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLm1jZT10LHRoaXMuY2hhaW5JbmRleD1lfTtwYy5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlKXt0aGlzLm1jZS5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKHRoaXMuY2hhaW5JbmRleCx0Lm1jZSx0LmNoYWluSW5kZXgsZSl9LHBjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxwYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcGN9O3ZhciBkYz1mdW5jdGlvbiB0KCl7aWYodGhpcy5fbGFiZWw9bnVsbCx0aGlzLl94VmFsdWU9bnVsbCx0aGlzLl9ldmVudFR5cGU9bnVsbCx0aGlzLl9pbnNlcnRFdmVudD1udWxsLHRoaXMuX2RlbGV0ZUV2ZW50SW5kZXg9bnVsbCx0aGlzLl9vYmo9bnVsbCwyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuX2V2ZW50VHlwZT10LkRFTEVURSx0aGlzLl94VmFsdWU9ZSx0aGlzLl9pbnNlcnRFdmVudD1ufWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXTt0aGlzLl9ldmVudFR5cGU9dC5JTlNFUlQsdGhpcy5fbGFiZWw9cix0aGlzLl94VmFsdWU9aSx0aGlzLl9vYmo9b319LGdjPXtJTlNFUlQ6e2NvbmZpZ3VyYWJsZTohMH0sREVMRVRFOntjb25maWd1cmFibGU6ITB9fTtkYy5wcm90b3R5cGUuaXNEZWxldGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRUeXBlPT09ZGMuREVMRVRFfSxkYy5wcm90b3R5cGUuc2V0RGVsZXRlRXZlbnRJbmRleD1mdW5jdGlvbih0KXt0aGlzLl9kZWxldGVFdmVudEluZGV4PXR9LGRjLnByb3RvdHlwZS5nZXRPYmplY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb2JqfSxkYy5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX3hWYWx1ZTxlLl94VmFsdWU/LTE6dGhpcy5feFZhbHVlPmUuX3hWYWx1ZT8xOnRoaXMuX2V2ZW50VHlwZTxlLl9ldmVudFR5cGU/LTE6dGhpcy5fZXZlbnRUeXBlPmUuX2V2ZW50VHlwZT8xOjB9LGRjLnByb3RvdHlwZS5nZXRJbnNlcnRFdmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnNlcnRFdmVudH0sZGMucHJvdG90eXBlLmlzSW5zZXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50VHlwZT09PWRjLklOU0VSVH0sZGMucHJvdG90eXBlLmlzU2FtZUxhYmVsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dGhpcy5fbGFiZWwmJnRoaXMuX2xhYmVsPT09dC5fbGFiZWx9LGRjLnByb3RvdHlwZS5nZXREZWxldGVFdmVudEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlbGV0ZUV2ZW50SW5kZXh9LGRjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LGRjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBkY30sZ2MuSU5TRVJULmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxnYy5ERUxFVEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGRjLGdjKTt2YXIgeWM9ZnVuY3Rpb24oKXt9O3ljLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx5Yy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geWN9O3ZhciBtYz1mdW5jdGlvbigpe3RoaXMuX2hhc0ludGVyc2VjdGlvbj0hMSx0aGlzLl9oYXNQcm9wZXI9ITEsdGhpcy5faGFzUHJvcGVySW50ZXJpb3I9ITEsdGhpcy5fcHJvcGVySW50ZXJzZWN0aW9uUG9pbnQ9bnVsbCx0aGlzLl9saT1udWxsLHRoaXMuX2luY2x1ZGVQcm9wZXI9bnVsbCx0aGlzLl9yZWNvcmRJc29sYXRlZD1udWxsLHRoaXMuX2lzU2VsZkludGVyc2VjdGlvbj1udWxsLHRoaXMuX251bUludGVyc2VjdGlvbnM9MCx0aGlzLm51bVRlc3RzPTAsdGhpcy5fYmR5Tm9kZXM9bnVsbCx0aGlzLl9pc0RvbmU9ITEsdGhpcy5faXNEb25lV2hlblByb3BlckludD0hMTt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07dGhpcy5fbGk9dCx0aGlzLl9pbmNsdWRlUHJvcGVyPWUsdGhpcy5fcmVjb3JkSXNvbGF0ZWQ9bn07bWMucHJvdG90eXBlLmlzVHJpdmlhbEludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixyKXtpZih0PT09biYmMT09PXRoaXMuX2xpLmdldEludGVyc2VjdGlvbk51bSgpKXtpZihtYy5pc0FkamFjZW50U2VnbWVudHMoZSxyKSlyZXR1cm4hMDtpZih0LmlzQ2xvc2VkKCkpe3ZhciBpPXQuZ2V0TnVtUG9pbnRzKCktMTtpZigwPT09ZSYmcj09PWl8fDA9PT1yJiZlPT09aSlyZXR1cm4hMH19cmV0dXJuITF9LG1jLnByb3RvdHlwZS5nZXRQcm9wZXJJbnRlcnNlY3Rpb25Qb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJJbnRlcnNlY3Rpb25Qb2ludH0sbWMucHJvdG90eXBlLnNldElzRG9uZUlmUHJvcGVySW50PWZ1bmN0aW9uKHQpe3RoaXMuX2lzRG9uZVdoZW5Qcm9wZXJJbnQ9dH0sbWMucHJvdG90eXBlLmhhc1Byb3BlckludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Byb3BlckludGVyaW9yfSxtYy5wcm90b3R5cGUuaXNCb3VuZGFyeVBvaW50SW50ZXJuYWw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCkuZ2V0Q29vcmRpbmF0ZSgpO2lmKHQuaXNJbnRlcnNlY3Rpb24ocikpcmV0dXJuITB9cmV0dXJuITF9LG1jLnByb3RvdHlwZS5oYXNQcm9wZXJJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzUHJvcGVyfSxtYy5wcm90b3R5cGUuaGFzSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc0ludGVyc2VjdGlvbn0sbWMucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0RvbmV9LG1jLnByb3RvdHlwZS5pc0JvdW5kYXJ5UG9pbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9PWUmJiEoIXRoaXMuaXNCb3VuZGFyeVBvaW50SW50ZXJuYWwodCxlWzBdKSYmIXRoaXMuaXNCb3VuZGFyeVBvaW50SW50ZXJuYWwodCxlWzFdKSl9LG1jLnByb3RvdHlwZS5zZXRCb3VuZGFyeU5vZGVzPWZ1bmN0aW9uKHQsZSl7dGhpcy5fYmR5Tm9kZXM9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5fYmR5Tm9kZXNbMF09dCx0aGlzLl9iZHlOb2Rlc1sxXT1lfSxtYy5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbixyKXtpZih0PT09biYmZT09PXIpcmV0dXJuIG51bGw7dGhpcy5udW1UZXN0cysrO3ZhciBpPXQuZ2V0Q29vcmRpbmF0ZXMoKVtlXSxvPXQuZ2V0Q29vcmRpbmF0ZXMoKVtlKzFdLHM9bi5nZXRDb29yZGluYXRlcygpW3JdLGE9bi5nZXRDb29yZGluYXRlcygpW3IrMV07dGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbihpLG8scyxhKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSYmKHRoaXMuX3JlY29yZElzb2xhdGVkJiYodC5zZXRJc29sYXRlZCghMSksbi5zZXRJc29sYXRlZCghMSkpLHRoaXMuX251bUludGVyc2VjdGlvbnMrKyx0aGlzLmlzVHJpdmlhbEludGVyc2VjdGlvbih0LGUsbixyKXx8KHRoaXMuX2hhc0ludGVyc2VjdGlvbj0hMCwodGhpcy5faW5jbHVkZVByb3Blcnx8IXRoaXMuX2xpLmlzUHJvcGVyKCkpJiYodC5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLGUsMCksbi5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLHIsMSkpLHRoaXMuX2xpLmlzUHJvcGVyKCkmJih0aGlzLl9wcm9wZXJJbnRlcnNlY3Rpb25Qb2ludD10aGlzLl9saS5nZXRJbnRlcnNlY3Rpb24oMCkuY29weSgpLHRoaXMuX2hhc1Byb3Blcj0hMCx0aGlzLl9pc0RvbmVXaGVuUHJvcGVySW50JiYodGhpcy5faXNEb25lPSEwKSx0aGlzLmlzQm91bmRhcnlQb2ludCh0aGlzLl9saSx0aGlzLl9iZHlOb2Rlcyl8fCh0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcj0hMCkpKSl9LG1jLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxtYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbWN9LG1jLmlzQWRqYWNlbnRTZWdtZW50cz1mdW5jdGlvbih0LGUpe3JldHVybiAxPT09TWF0aC5hYnModC1lKX07dmFyIHZjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5ldmVudHM9bmV3IHhvLHRoaXMubk92ZXJsYXBzPW51bGx9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnByZXBhcmVFdmVudHM9ZnVuY3Rpb24oKXthYS5zb3J0KHRoaXMuZXZlbnRzKTtmb3IodmFyIHQ9MDt0PHRoaXMuZXZlbnRzLnNpemUoKTt0Kyspe3ZhciBlPXRoaXMuZXZlbnRzLmdldCh0KTtlLmlzRGVsZXRlKCkmJmUuZ2V0SW5zZXJ0RXZlbnQoKS5zZXREZWxldGVFdmVudEluZGV4KHQpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMubk92ZXJsYXBzPTAsdGhpcy5wcmVwYXJlRXZlbnRzKCk7Zm9yKHZhciBlPTA7ZTx0aGlzLmV2ZW50cy5zaXplKCk7ZSsrKXt2YXIgbj10aGlzLmV2ZW50cy5nZXQoZSk7aWYobi5pc0luc2VydCgpJiZ0aGlzLnByb2Nlc3NPdmVybGFwcyhlLG4uZ2V0RGVsZXRlRXZlbnRJbmRleCgpLG4sdCksdC5pc0RvbmUoKSlicmVha319ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIG1jJiZFaShhcmd1bWVudHNbMF0sdm8pJiZFaShhcmd1bWVudHNbMV0sdm8pKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl07dGhpcy5hZGRFZGdlcyhyLHIpLHRoaXMuYWRkRWRnZXMoaSxpKSx0aGlzLmNvbXB1dGVJbnRlcnNlY3Rpb25zKG8pfWVsc2UgaWYoImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzJdJiZFaShhcmd1bWVudHNbMF0sdm8pJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIG1jKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV07YXJndW1lbnRzWzJdP3RoaXMuYWRkRWRnZXMocyxudWxsKTp0aGlzLmFkZEVkZ2VzKHMpLHRoaXMuY29tcHV0ZUludGVyc2VjdGlvbnMoYSl9fSxlLnByb3RvdHlwZS5hZGRFZGdlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2V0TW9ub3RvbmVDaGFpbkVkZ2UoKSxyPW4uZ2V0U3RhcnRJbmRleGVzKCksaT0wO2k8ci5sZW5ndGgtMTtpKyspe3ZhciBvPW5ldyBwYyhuLGkpLHM9bmV3IGRjKGUsbi5nZXRNaW5YKGkpLG8pO3RoaXMuZXZlbnRzLmFkZChzKSx0aGlzLmV2ZW50cy5hZGQobmV3IGRjKG4uZ2V0TWF4WChpKSxzKSl9fSxlLnByb3RvdHlwZS5wcm9jZXNzT3ZlcmxhcHM9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPW4uZ2V0T2JqZWN0KCksbz10O288ZTtvKyspe3ZhciBzPXRoaXMuZXZlbnRzLmdldChvKTtpZihzLmlzSW5zZXJ0KCkpe3ZhciBhPXMuZ2V0T2JqZWN0KCk7bi5pc1NhbWVMYWJlbChzKXx8KGkuY29tcHV0ZUludGVyc2VjdGlvbnMoYSxyKSx0aGlzLm5PdmVybGFwcysrKX19fSxlLnByb3RvdHlwZS5hZGRFZGdlcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgdD1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpO3RoaXMuYWRkRWRnZShlLGUpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7dGhpcy5hZGRFZGdlKGksbil9fSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfSh5YyksX2M9ZnVuY3Rpb24oKXt0aGlzLl9taW49ZmkuUE9TSVRJVkVfSU5GSU5JVFksdGhpcy5fbWF4PWZpLk5FR0FUSVZFX0lORklOSVRZfSx4Yz17Tm9kZUNvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH19O19jLnByb3RvdHlwZS5nZXRNaW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWlufSxfYy5wcm90b3R5cGUuaW50ZXJzZWN0cz1mdW5jdGlvbih0LGUpe3JldHVybiEodGhpcy5fbWluPmV8fHRoaXMuX21heDx0KX0sX2MucHJvdG90eXBlLmdldE1heD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXh9LF9jLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBYaS50b0xpbmVTdHJpbmcobmV3IHZpKHRoaXMuX21pbiwwKSxuZXcgdmkodGhpcy5fbWF4LDApKX0sX2MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LF9jLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBfY30seGMuTm9kZUNvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHdjfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhfYyx4Yyk7dmFyIHdjPWZ1bmN0aW9uKCl7fTt3Yy5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQscj1lLGk9KG4uX21pbituLl9tYXgpLzIsbz0oci5fbWluK3IuX21heCkvMjtyZXR1cm4gaTxvPy0xOmk+bz8xOjB9LHdjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt5aV19LHdjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB3Y307dmFyIGJjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5faXRlbT1udWxsO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTt0aGlzLl9taW49ZSx0aGlzLl9tYXg9bix0aGlzLl9pdGVtPXJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5pbnRlcnNlY3RzKHQsZSkpcmV0dXJuIG51bGw7bi52aXNpdEl0ZW0odGhpcy5faXRlbSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KF9jKSxEYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX25vZGUxPW51bGwsdGhpcy5fbm9kZTI9bnVsbDt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5fbm9kZTE9ZSx0aGlzLl9ub2RlMj1uLHRoaXMuYnVpbGRFeHRlbnQodGhpcy5fbm9kZTEsdGhpcy5fbm9kZTIpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5idWlsZEV4dGVudD1mdW5jdGlvbih0LGUpe3RoaXMuX21pbj1NYXRoLm1pbih0Ll9taW4sZS5fbWluKSx0aGlzLl9tYXg9TWF0aC5tYXgodC5fbWF4LGUuX21heCl9LGUucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5pbnRlcnNlY3RzKHQsZSkpcmV0dXJuIG51bGw7bnVsbCE9PXRoaXMuX25vZGUxJiZ0aGlzLl9ub2RlMS5xdWVyeSh0LGUsbiksbnVsbCE9PXRoaXMuX25vZGUyJiZ0aGlzLl9ub2RlMi5xdWVyeSh0LGUsbil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KF9jKSxFYz1mdW5jdGlvbigpe3RoaXMuX2xlYXZlcz1uZXcgeG8sdGhpcy5fcm9vdD1udWxsLHRoaXMuX2xldmVsPTB9O0VjLnByb3RvdHlwZS5idWlsZFRyZWU9ZnVuY3Rpb24oKXthYS5zb3J0KHRoaXMuX2xlYXZlcyxuZXcgX2MuTm9kZUNvbXBhcmF0b3IpO2Zvcih2YXIgdD10aGlzLl9sZWF2ZXMsZT1udWxsLG49bmV3IHhvOzspe2lmKHRoaXMuYnVpbGRMZXZlbCh0LG4pLDE9PT1uLnNpemUoKSlyZXR1cm4gbi5nZXQoMCk7ZT10LHQ9bixuPWV9fSxFYy5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQsZSxuKXtpZihudWxsIT09dGhpcy5fcm9vdCl0aHJvdyBuZXcgRXJyb3IoIkluZGV4IGNhbm5vdCBiZSBhZGRlZCB0byBvbmNlIGl0IGhhcyBiZWVuIHF1ZXJpZWQiKTt0aGlzLl9sZWF2ZXMuYWRkKG5ldyBiYyh0LGUsbikpfSxFYy5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24odCxlLG4pe3RoaXMuaW5pdCgpLHRoaXMuX3Jvb3QucXVlcnkodCxlLG4pfSxFYy5wcm90b3R5cGUuYnVpbGRSb290PWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3Jvb3QpcmV0dXJuIG51bGw7dGhpcy5fcm9vdD10aGlzLmJ1aWxkVHJlZSgpfSxFYy5wcm90b3R5cGUucHJpbnROb2RlPWZ1bmN0aW9uKHQpe2tpLm91dC5wcmludGxuKFhpLnRvTGluZVN0cmluZyhuZXcgdmkodC5fbWluLHRoaXMuX2xldmVsKSxuZXcgdmkodC5fbWF4LHRoaXMuX2xldmVsKSkpfSxFYy5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLl9yb290KXJldHVybiBudWxsO3RoaXMuYnVpbGRSb290KCl9LEVjLnByb3RvdHlwZS5idWlsZExldmVsPWZ1bmN0aW9uKHQsZSl7dGhpcy5fbGV2ZWwrKyxlLmNsZWFyKCk7Zm9yKHZhciBuPTA7bjx0LnNpemUoKTtuKz0yKXt2YXIgcj10LmdldChuKTtpZihudWxsPT09KG4rMTx0LnNpemUoKT90LmdldChuKTpudWxsKSllLmFkZChyKTtlbHNle3ZhciBpPW5ldyBEYyh0LmdldChuKSx0LmdldChuKzEpKTtlLmFkZChpKX19fSxFYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRWMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEVjfTt2YXIgQ2M9ZnVuY3Rpb24oKXt0aGlzLl9pdGVtcz1uZXcgeG99O0NjLnByb3RvdHlwZS52aXNpdEl0ZW09ZnVuY3Rpb24odCl7dGhpcy5faXRlbXMuYWRkKHQpfSxDYy5wcm90b3R5cGUuZ2V0SXRlbXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXRlbXN9LENjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltyYV19LENjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDY307dmFyIFNjPWZ1bmN0aW9uKCl7dGhpcy5faW5kZXg9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07aWYoIUVpKHQsbHMpKXRocm93IG5ldyBoaTt0aGlzLl9pbmRleD1uZXcgSWModCl9LEFjPXtTZWdtZW50VmlzaXRvcjp7Y29uZmlndXJhYmxlOiEwfSxJbnRlcnZhbEluZGV4ZWRHZW9tZXRyeTp7Y29uZmlndXJhYmxlOiEwfX07U2MucHJvdG90eXBlLmxvY2F0ZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdG8odCksbj1uZXcgTmMoZSk7cmV0dXJuIHRoaXMuX2luZGV4LnF1ZXJ5KHQueSx0LnksbiksZS5nZXRMb2NhdGlvbigpfSxTYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bV2FdfSxTYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gU2N9LEFjLlNlZ21lbnRWaXNpdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiBOY30sQWMuSW50ZXJ2YWxJbmRleGVkR2VvbWV0cnkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEljfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhTYyxBYyk7dmFyIE5jPWZ1bmN0aW9uKCl7dGhpcy5fY291bnRlcj1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9jb3VudGVyPXR9O05jLnByb3RvdHlwZS52aXNpdEl0ZW09ZnVuY3Rpb24odCl7dmFyIGU9dDt0aGlzLl9jb3VudGVyLmNvdW50U2VnbWVudChlLmdldENvb3JkaW5hdGUoMCksZS5nZXRDb29yZGluYXRlKDEpKX0sTmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3JhXX0sTmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE5jfTt2YXIgSWM9ZnVuY3Rpb24oKXt0aGlzLl9pbmRleD1uZXcgRWM7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuaW5pdCh0KX07SWMucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPUZ1LmdldExpbmVzKHQpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKS5nZXRDb29yZGluYXRlcygpO3RoaXMuYWRkTGluZShuKX19LEljLnByb3RvdHlwZS5hZGRMaW5lPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8dC5sZW5ndGg7ZSsrKXt2YXIgbj1uZXcgYmEodFtlLTFdLHRbZV0pLHI9TWF0aC5taW4obi5wMC55LG4ucDEueSksaT1NYXRoLm1heChuLnAwLnksbi5wMS55KTt0aGlzLl9pbmRleC5pbnNlcnQocixpLG4pfX0sSWMucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPW5ldyBDYztyZXR1cm4gdGhpcy5faW5kZXgucXVlcnkodCxlLG4pLG4uZ2V0SXRlbXMoKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdO3RoaXMuX2luZGV4LnF1ZXJ5KHIsaSxvKX19LEljLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxJYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSWN9O3ZhciBNYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7aWYodC5jYWxsKHRoaXMpLHRoaXMuX3BhcmVudEdlb209bnVsbCx0aGlzLl9saW5lRWRnZU1hcD1uZXcgRXMsdGhpcy5fYm91bmRhcnlOb2RlUnVsZT1udWxsLHRoaXMuX3VzZUJvdW5kYXJ5RGV0ZXJtaW5hdGlvblJ1bGU9ITAsdGhpcy5fYXJnSW5kZXg9bnVsbCx0aGlzLl9ib3VuZGFyeU5vZGVzPW51bGwsdGhpcy5faGFzVG9vRmV3UG9pbnRzPSExLHRoaXMuX2ludmFsaWRQb2ludD1udWxsLHRoaXMuX2FyZWFQdExvY2F0b3I9bnVsbCx0aGlzLl9wdExvY2F0b3I9bmV3IFR1LDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj11by5PR0NfU0ZTX0JPVU5EQVJZX1JVTEU7dGhpcy5fYXJnSW5kZXg9ZSx0aGlzLl9wYXJlbnRHZW9tPW4sdGhpcy5fYm91bmRhcnlOb2RlUnVsZT1yLG51bGwhPT1uJiZ0aGlzLmFkZChuKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl07dGhpcy5fYXJnSW5kZXg9aSx0aGlzLl9wYXJlbnRHZW9tPW8sdGhpcy5fYm91bmRhcnlOb2RlUnVsZT1zLG51bGwhPT1vJiZ0aGlzLmFkZChvKX19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmluc2VydEJvdW5kYXJ5UG9pbnQ9ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzLl9ub2Rlcy5hZGROb2RlKG4pLmdldExhYmVsKCksaT0xO3IuZ2V0TG9jYXRpb24odCxGcy5PTik9PT1iaS5CT1VOREFSWSYmaSsrO3ZhciBvPWUuZGV0ZXJtaW5lQm91bmRhcnkodGhpcy5fYm91bmRhcnlOb2RlUnVsZSxpKTtyLnNldExvY2F0aW9uKHQsbyl9LGUucHJvdG90eXBlLmNvbXB1dGVTZWxmTm9kZXM9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmNvbXB1dGVTZWxmTm9kZXModCxlLCExKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdLGk9bmV3IG1jKGFyZ3VtZW50c1swXSwhMCwhMSk7aS5zZXRJc0RvbmVJZlByb3BlckludChyKTt2YXIgbz10aGlzLmNyZWF0ZUVkZ2VTZXRJbnRlcnNlY3RvcigpLHM9dGhpcy5fcGFyZW50R2VvbSBpbnN0YW5jZW9mIHBzfHx0aGlzLl9wYXJlbnRHZW9tIGluc3RhbmNlb2YgaHN8fHRoaXMuX3BhcmVudEdlb20gaW5zdGFuY2VvZiBkcyxhPW58fCFzO3JldHVybiBvLmNvbXB1dGVJbnRlcnNlY3Rpb25zKHRoaXMuX2VkZ2VzLGksYSksdGhpcy5hZGRTZWxmSW50ZXJzZWN0aW9uTm9kZXModGhpcy5fYXJnSW5kZXgpLGl9fSxlLnByb3RvdHlwZS5jb21wdXRlU3BsaXRFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fZWRnZXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLmVpTGlzdC5hZGRTcGxpdEVkZ2VzKHQpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUVkZ2VJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgbWMoZSxuLCEwKTtyZXR1cm4gci5zZXRCb3VuZGFyeU5vZGVzKHRoaXMuZ2V0Qm91bmRhcnlOb2RlcygpLHQuZ2V0Qm91bmRhcnlOb2RlcygpKSx0aGlzLmNyZWF0ZUVkZ2VTZXRJbnRlcnNlY3RvcigpLmNvbXB1dGVJbnRlcnNlY3Rpb25zKHRoaXMuX2VkZ2VzLHQuX2VkZ2VzLHIpLHJ9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcmVudEdlb219LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5Tm9kZVJ1bGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm91bmRhcnlOb2RlUnVsZX0sZS5wcm90b3R5cGUuaGFzVG9vRmV3UG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Rvb0Zld1BvaW50c30sZS5wcm90b3R5cGUuYWRkUG9pbnQ9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGNzKXt2YXIgdD1hcmd1bWVudHNbMF0uZ2V0Q29vcmRpbmF0ZSgpO3RoaXMuaW5zZXJ0UG9pbnQodGhpcy5fYXJnSW5kZXgsdCxiaS5JTlRFUklPUil9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5pbnNlcnRQb2ludCh0aGlzLl9hcmdJbmRleCxlLGJpLklOVEVSSU9SKX19LGUucHJvdG90eXBlLmFkZFBvbHlnb249ZnVuY3Rpb24odCl7dGhpcy5hZGRQb2x5Z29uUmluZyh0LmdldEV4dGVyaW9yUmluZygpLGJpLkVYVEVSSU9SLGJpLklOVEVSSU9SKTtmb3IodmFyIGU9MDtlPHQuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7ZSsrKXt2YXIgbj10LmdldEludGVyaW9yUmluZ04oZSk7dGhpcy5hZGRQb2x5Z29uUmluZyhuLGJpLklOVEVSSU9SLGJpLkVYVEVSSU9SKX19LGUucHJvdG90eXBlLmFkZEVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5pbnNlcnRFZGdlKHQpO3ZhciBlPXQuZ2V0Q29vcmRpbmF0ZXMoKTt0aGlzLmluc2VydFBvaW50KHRoaXMuX2FyZ0luZGV4LGVbMF0sYmkuQk9VTkRBUlkpLHRoaXMuaW5zZXJ0UG9pbnQodGhpcy5fYXJnSW5kZXgsZVtlLmxlbmd0aC0xXSxiaS5CT1VOREFSWSl9LGUucHJvdG90eXBlLmFkZExpbmVTdHJpbmc9ZnVuY3Rpb24odCl7dmFyIGU9RG8ucmVtb3ZlUmVwZWF0ZWRQb2ludHModC5nZXRDb29yZGluYXRlcygpKTtpZihlLmxlbmd0aDwyKXJldHVybiB0aGlzLl9oYXNUb29GZXdQb2ludHM9ITAsdGhpcy5faW52YWxpZFBvaW50PWVbMF0sbnVsbDt2YXIgbj1uZXcgY3UoZSxuZXcganModGhpcy5fYXJnSW5kZXgsYmkuSU5URVJJT1IpKTt0aGlzLl9saW5lRWRnZU1hcC5wdXQodCxuKSx0aGlzLmluc2VydEVkZ2UobiksWmkuaXNUcnVlKGUubGVuZ3RoPj0yLCJmb3VuZCBMaW5lU3RyaW5nIHdpdGggc2luZ2xlIHBvaW50IiksdGhpcy5pbnNlcnRCb3VuZGFyeVBvaW50KHRoaXMuX2FyZ0luZGV4LGVbMF0pLHRoaXMuaW5zZXJ0Qm91bmRhcnlQb2ludCh0aGlzLl9hcmdJbmRleCxlW2UubGVuZ3RoLTFdKX0sZS5wcm90b3R5cGUuZ2V0SW52YWxpZFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludmFsaWRQb2ludH0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlQb2ludHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5nZXRCb3VuZGFyeU5vZGVzKCksZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCksbj0wLHI9dC5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7ZVtuKytdPWkuZ2V0Q29vcmRpbmF0ZSgpLmNvcHkoKX1yZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlOb2Rlcz1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fYm91bmRhcnlOb2RlcyYmKHRoaXMuX2JvdW5kYXJ5Tm9kZXM9dGhpcy5fbm9kZXMuZ2V0Qm91bmRhcnlOb2Rlcyh0aGlzLl9hcmdJbmRleCkpLHRoaXMuX2JvdW5kYXJ5Tm9kZXN9LGUucHJvdG90eXBlLmFkZFNlbGZJbnRlcnNlY3Rpb25Ob2RlPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLmlzQm91bmRhcnlOb2RlKHQsZSkpcmV0dXJuIG51bGw7bj09PWJpLkJPVU5EQVJZJiZ0aGlzLl91c2VCb3VuZGFyeURldGVybWluYXRpb25SdWxlP3RoaXMuaW5zZXJ0Qm91bmRhcnlQb2ludCh0LGUpOnRoaXMuaW5zZXJ0UG9pbnQodCxlLG4pfSxlLnByb3RvdHlwZS5hZGRQb2x5Z29uUmluZz1mdW5jdGlvbih0LGUsbil7aWYodC5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dmFyIHI9RG8ucmVtb3ZlUmVwZWF0ZWRQb2ludHModC5nZXRDb29yZGluYXRlcygpKTtpZihyLmxlbmd0aDw0KXJldHVybiB0aGlzLl9oYXNUb29GZXdQb2ludHM9ITAsdGhpcy5faW52YWxpZFBvaW50PXJbMF0sbnVsbDt2YXIgaT1lLG89bjtlby5pc0NDVyhyKSYmKGk9bixvPWUpO3ZhciBzPW5ldyBjdShyLG5ldyBqcyh0aGlzLl9hcmdJbmRleCxiaS5CT1VOREFSWSxpLG8pKTt0aGlzLl9saW5lRWRnZU1hcC5wdXQodCxzKSx0aGlzLmluc2VydEVkZ2UocyksdGhpcy5pbnNlcnRQb2ludCh0aGlzLl9hcmdJbmRleCxyWzBdLGJpLkJPVU5EQVJZKX0sZS5wcm90b3R5cGUuaW5zZXJ0UG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuX25vZGVzLmFkZE5vZGUoZSksaT1yLmdldExhYmVsKCk7bnVsbD09PWk/ci5fbGFiZWw9bmV3IGpzKHQsbik6aS5zZXRMb2NhdGlvbih0LG4pfSxlLnByb3RvdHlwZS5jcmVhdGVFZGdlU2V0SW50ZXJzZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHZjfSxlLnByb3RvdHlwZS5hZGRTZWxmSW50ZXJzZWN0aW9uTm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2VkZ2VzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KWZvcih2YXIgbj1lLm5leHQoKSxyPW4uZ2V0TGFiZWwoKS5nZXRMb2NhdGlvbih0KSxpPW4uZWlMaXN0Lml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKTt0aGlzLmFkZFNlbGZJbnRlcnNlY3Rpb25Ob2RlKHQsby5jb29yZCxyKX19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe2lmKDEhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5hZGQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1swXTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDtpZihlIGluc3RhbmNlb2YgZHMmJih0aGlzLl91c2VCb3VuZGFyeURldGVybWluYXRpb25SdWxlPSExKSxlIGluc3RhbmNlb2YgaHMpdGhpcy5hZGRQb2x5Z29uKGUpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGFzKXRoaXMuYWRkTGluZVN0cmluZyhlKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBjcyl0aGlzLmFkZFBvaW50KGUpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGZzKXRoaXMuYWRkQ29sbGVjdGlvbihlKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBabyl0aGlzLmFkZENvbGxlY3Rpb24oZSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgZHMpdGhpcy5hZGRDb2xsZWN0aW9uKGUpO2Vsc2V7aWYoIShlIGluc3RhbmNlb2YgSG8pKXRocm93IG5ldyBFcnJvcihlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTt0aGlzLmFkZENvbGxlY3Rpb24oZSl9fSxlLnByb3RvdHlwZS5hZGRDb2xsZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5nZXROdW1HZW9tZXRyaWVzKCk7ZSsrKXt2YXIgbj10LmdldEdlb21ldHJ5TihlKTt0aGlzLmFkZChuKX19LGUucHJvdG90eXBlLmxvY2F0ZT1mdW5jdGlvbih0KXtyZXR1cm4gRWkodGhpcy5fcGFyZW50R2VvbSxscykmJnRoaXMuX3BhcmVudEdlb20uZ2V0TnVtR2VvbWV0cmllcygpPjUwPyhudWxsPT09dGhpcy5fYXJlYVB0TG9jYXRvciYmKHRoaXMuX2FyZWFQdExvY2F0b3I9bmV3IFNjKHRoaXMuX3BhcmVudEdlb20pKSx0aGlzLl9hcmVhUHRMb2NhdG9yLmxvY2F0ZSh0KSk6dGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh0LHRoaXMuX3BhcmVudEdlb20pfSxlLnByb3RvdHlwZS5maW5kRWRnZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2xpbmVFZGdlTWFwLmdldChlKX1yZXR1cm4gdC5wcm90b3R5cGUuZmluZEVkZ2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLmRldGVybWluZUJvdW5kYXJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaXNJbkJvdW5kYXJ5KGUpP2JpLkJPVU5EQVJZOmJpLklOVEVSSU9SfSxlfShRcyksRmM9ZnVuY3Rpb24oKXtpZih0aGlzLl9saT1uZXcgUWksdGhpcy5fcmVzdWx0UHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl9hcmc9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0Q29tcHV0YXRpb25QcmVjaXNpb24odC5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9hcmc9bmV3IEFycmF5KDEpLmZpbGwobnVsbCksdGhpcy5fYXJnWzBdPW5ldyBNYygwLHQpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPXVvLk9HQ19TRlNfQk9VTkRBUllfUlVMRTtlLmdldFByZWNpc2lvbk1vZGVsKCkuY29tcGFyZVRvKG4uZ2V0UHJlY2lzaW9uTW9kZWwoKSk+PTA/dGhpcy5zZXRDb21wdXRhdGlvblByZWNpc2lvbihlLmdldFByZWNpc2lvbk1vZGVsKCkpOnRoaXMuc2V0Q29tcHV0YXRpb25QcmVjaXNpb24obi5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9hcmc9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5fYXJnWzBdPW5ldyBNYygwLGUsciksdGhpcy5fYXJnWzFdPW5ldyBNYygxLG4scil9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdO2kuZ2V0UHJlY2lzaW9uTW9kZWwoKS5jb21wYXJlVG8oby5nZXRQcmVjaXNpb25Nb2RlbCgpKT49MD90aGlzLnNldENvbXB1dGF0aW9uUHJlY2lzaW9uKGkuZ2V0UHJlY2lzaW9uTW9kZWwoKSk6dGhpcy5zZXRDb21wdXRhdGlvblByZWNpc2lvbihvLmdldFByZWNpc2lvbk1vZGVsKCkpLHRoaXMuX2FyZz1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9hcmdbMF09bmV3IE1jKDAsaSxzKSx0aGlzLl9hcmdbMV09bmV3IE1jKDEsbyxzKX19O0ZjLnByb3RvdHlwZS5nZXRBcmdHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYXJnW3RdLmdldEdlb21ldHJ5KCl9LEZjLnByb3RvdHlwZS5zZXRDb21wdXRhdGlvblByZWNpc2lvbj1mdW5jdGlvbih0KXt0aGlzLl9yZXN1bHRQcmVjaXNpb25Nb2RlbD10LHRoaXMuX2xpLnNldFByZWNpc2lvbk1vZGVsKHRoaXMuX3Jlc3VsdFByZWNpc2lvbk1vZGVsKX0sRmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEZjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBGY307dmFyIFRjPWZ1bmN0aW9uKCl7fTtUYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sVGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFRjfSxUYy5tYXA9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvJiZFaShhcmd1bWVudHNbMV0sVGMuTWFwT3ApKXtmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IHhvLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9ZS5tYXAodC5nZXRHZW9tZXRyeU4ocikpO251bGwhPT1pJiZuLmFkZChpKX1yZXR1cm4gdC5nZXRGYWN0b3J5KCkuYnVpbGRHZW9tZXRyeShuKX1pZihFaShhcmd1bWVudHNbMF0sZ28pJiZFaShhcmd1bWVudHNbMV0sVGMuTWFwT3ApKXtmb3IodmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdLGE9bmV3IHhvLHU9by5pdGVyYXRvcigpO3UuaGFzTmV4dCgpOyl7dmFyIGM9dS5uZXh0KCksbD1zLm1hcChjKTtudWxsIT09bCYmYS5hZGQobCl9cmV0dXJuIGF9fSxUYy5NYXBPcD1mdW5jdGlvbigpe307dmFyIE9jPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dC5jYWxsKHRoaXMsZSxuKSx0aGlzLl9wdExvY2F0b3I9bmV3IFR1LHRoaXMuX2dlb21GYWN0PW51bGwsdGhpcy5fcmVzdWx0R2VvbT1udWxsLHRoaXMuX2dyYXBoPW51bGwsdGhpcy5fZWRnZUxpc3Q9bmV3IHR1LHRoaXMuX3Jlc3VsdFBvbHlMaXN0PW5ldyB4byx0aGlzLl9yZXN1bHRMaW5lTGlzdD1uZXcgeG8sdGhpcy5fcmVzdWx0UG9pbnRMaXN0PW5ldyB4byx0aGlzLl9ncmFwaD1uZXcgUXMobmV3IFFhKSx0aGlzLl9nZW9tRmFjdD1lLmdldEZhY3RvcnkoKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaW5zZXJ0VW5pcXVlRWRnZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9lZGdlTGlzdC5maW5kRXF1YWxFZGdlKHQpO2lmKG51bGwhPT1lKXt2YXIgbj1lLmdldExhYmVsKCkscj10LmdldExhYmVsKCk7ZS5pc1BvaW50d2lzZUVxdWFsKHQpfHwocj1uZXcganModC5nZXRMYWJlbCgpKSkuZmxpcCgpO3ZhciBpPWUuZ2V0RGVwdGgoKTtpLmlzTnVsbCgpJiZpLmFkZChuKSxpLmFkZChyKSxuLm1lcmdlKHIpfWVsc2UgdGhpcy5fZWRnZUxpc3QuYWRkKHQpfSxlLnByb3RvdHlwZS5nZXRHcmFwaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ncmFwaH0sZS5wcm90b3R5cGUuY2FuY2VsRHVwbGljYXRlUmVzdWx0RWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0RWRnZUVuZHMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCksbj1lLmdldFN5bSgpO2UuaXNJblJlc3VsdCgpJiZuLmlzSW5SZXN1bHQoKSYmKGUuc2V0SW5SZXN1bHQoITEpLG4uc2V0SW5SZXN1bHQoITEpKX19LGUucHJvdG90eXBlLmlzQ292ZXJlZEJ5TEE9ZnVuY3Rpb24odCl7cmV0dXJuISghdGhpcy5pc0NvdmVyZWQodCx0aGlzLl9yZXN1bHRMaW5lTGlzdCkmJiF0aGlzLmlzQ292ZXJlZCh0LHRoaXMuX3Jlc3VsdFBvbHlMaXN0KSl9LGUucHJvdG90eXBlLmNvbXB1dGVHZW9tZXRyeT1mdW5jdGlvbih0LG4scixpKXt2YXIgbz1uZXcgeG87cmV0dXJuIG8uYWRkQWxsKHQpLG8uYWRkQWxsKG4pLG8uYWRkQWxsKHIpLG8uaXNFbXB0eSgpP2UuY3JlYXRlRW1wdHlSZXN1bHQoaSx0aGlzLl9hcmdbMF0uZ2V0R2VvbWV0cnkoKSx0aGlzLl9hcmdbMV0uZ2V0R2VvbWV0cnkoKSx0aGlzLl9nZW9tRmFjdCk6dGhpcy5fZ2VvbUZhY3QuYnVpbGRHZW9tZXRyeShvKX0sZS5wcm90b3R5cGUubWVyZ2VTeW1MYWJlbHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5tZXJnZVN5bUxhYmVscygpfX0sZS5wcm90b3R5cGUuaXNDb3ZlcmVkPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2lmKHRoaXMuX3B0TG9jYXRvci5sb2NhdGUodCxyKSE9PWJpLkVYVEVSSU9SKXJldHVybiEwfXJldHVybiExfSxlLnByb3RvdHlwZS5yZXBsYWNlQ29sbGFwc2VkRWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IHhvLGU9dGhpcy5fZWRnZUxpc3QuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO24uaXNDb2xsYXBzZWQoKSYmKGUucmVtb3ZlKCksdC5hZGQobi5nZXRDb2xsYXBzZWRFZGdlKCkpKX10aGlzLl9lZGdlTGlzdC5hZGRBbGwodCl9LGUucHJvdG90eXBlLnVwZGF0ZU5vZGVMYWJlbGxpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCksbj1lLmdldEVkZ2VzKCkuZ2V0TGFiZWwoKTtlLmdldExhYmVsKCkubWVyZ2Uobil9fSxlLnByb3RvdHlwZS5nZXRSZXN1bHRHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb21wdXRlT3ZlcmxheSh0KSx0aGlzLl9yZXN1bHRHZW9tfSxlLnByb3RvdHlwZS5pbnNlcnRVbmlxdWVFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dGhpcy5pbnNlcnRVbmlxdWVFZGdlKG4pfX0sZS5wcm90b3R5cGUuY29tcHV0ZU92ZXJsYXk9ZnVuY3Rpb24odCl7dGhpcy5jb3B5UG9pbnRzKDApLHRoaXMuY29weVBvaW50cygxKSx0aGlzLl9hcmdbMF0uY29tcHV0ZVNlbGZOb2Rlcyh0aGlzLl9saSwhMSksdGhpcy5fYXJnWzFdLmNvbXB1dGVTZWxmTm9kZXModGhpcy5fbGksITEpLHRoaXMuX2FyZ1swXS5jb21wdXRlRWRnZUludGVyc2VjdGlvbnModGhpcy5fYXJnWzFdLHRoaXMuX2xpLCEwKTt2YXIgZT1uZXcgeG87dGhpcy5fYXJnWzBdLmNvbXB1dGVTcGxpdEVkZ2VzKGUpLHRoaXMuX2FyZ1sxXS5jb21wdXRlU3BsaXRFZGdlcyhlKSx0aGlzLmluc2VydFVuaXF1ZUVkZ2VzKGUpLHRoaXMuY29tcHV0ZUxhYmVsc0Zyb21EZXB0aHMoKSx0aGlzLnJlcGxhY2VDb2xsYXBzZWRFZGdlcygpLEp1LmNoZWNrVmFsaWQodGhpcy5fZWRnZUxpc3QuZ2V0RWRnZXMoKSksdGhpcy5fZ3JhcGguYWRkRWRnZXModGhpcy5fZWRnZUxpc3QuZ2V0RWRnZXMoKSksdGhpcy5jb21wdXRlTGFiZWxsaW5nKCksdGhpcy5sYWJlbEluY29tcGxldGVOb2RlcygpLHRoaXMuZmluZFJlc3VsdEFyZWFFZGdlcyh0KSx0aGlzLmNhbmNlbER1cGxpY2F0ZVJlc3VsdEVkZ2VzKCk7dmFyIG49bmV3ICRzKHRoaXMuX2dlb21GYWN0KTtuLmFkZCh0aGlzLl9ncmFwaCksdGhpcy5fcmVzdWx0UG9seUxpc3Q9bi5nZXRQb2x5Z29ucygpO3ZhciByPW5ldyAkdSh0aGlzLHRoaXMuX2dlb21GYWN0LHRoaXMuX3B0TG9jYXRvcik7dGhpcy5fcmVzdWx0TGluZUxpc3Q9ci5idWlsZCh0KTt2YXIgaT1uZXcgdGModGhpcyx0aGlzLl9nZW9tRmFjdCx0aGlzLl9wdExvY2F0b3IpO3RoaXMuX3Jlc3VsdFBvaW50TGlzdD1pLmJ1aWxkKHQpLHRoaXMuX3Jlc3VsdEdlb209dGhpcy5jb21wdXRlR2VvbWV0cnkodGhpcy5fcmVzdWx0UG9pbnRMaXN0LHRoaXMuX3Jlc3VsdExpbmVMaXN0LHRoaXMuX3Jlc3VsdFBvbHlMaXN0LHQpfSxlLnByb3RvdHlwZS5sYWJlbEluY29tcGxldGVOb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh0LmdldENvb3JkaW5hdGUoKSx0aGlzLl9hcmdbZV0uZ2V0R2VvbWV0cnkoKSk7dC5nZXRMYWJlbCgpLnNldExvY2F0aW9uKGUsbil9LGUucHJvdG90eXBlLmNvcHlQb2ludHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2FyZ1t0XS5nZXROb2RlSXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3RoaXMuX2dyYXBoLmFkZE5vZGUobi5nZXRDb29yZGluYXRlKCkpLnNldExhYmVsKHQsbi5nZXRMYWJlbCgpLmdldExvY2F0aW9uKHQpKX19LGUucHJvdG90eXBlLmZpbmRSZXN1bHRBcmVhRWRnZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuX2dyYXBoLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpLGk9ci5nZXRMYWJlbCgpO2kuaXNBcmVhKCkmJiFyLmlzSW50ZXJpb3JBcmVhRWRnZSgpJiZlLmlzUmVzdWx0T2ZPcChpLmdldExvY2F0aW9uKDAsRnMuUklHSFQpLGkuZ2V0TG9jYXRpb24oMSxGcy5SSUdIVCksdCkmJnIuc2V0SW5SZXN1bHQoITApfX0sZS5wcm90b3R5cGUuY29tcHV0ZUxhYmVsc0Zyb21EZXB0aHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZWRnZUxpc3QuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpLG49ZS5nZXRMYWJlbCgpLHI9ZS5nZXREZXB0aCgpO2lmKCFyLmlzTnVsbCgpKXtyLm5vcm1hbGl6ZSgpO2Zvcih2YXIgaT0wO2k8MjtpKyspIW4uaXNOdWxsKGkpJiZuLmlzQXJlYSgpJiYhci5pc051bGwoaSkmJigwPT09ci5nZXREZWx0YShpKT9uLnRvTGluZShpKTooWmkuaXNUcnVlKCFyLmlzTnVsbChpLEZzLkxFRlQpLCJkZXB0aCBvZiBMRUZUIHNpZGUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIiksbi5zZXRMb2NhdGlvbihpLEZzLkxFRlQsci5nZXRMb2NhdGlvbihpLEZzLkxFRlQpKSxaaS5pc1RydWUoIXIuaXNOdWxsKGksRnMuUklHSFQpLCJkZXB0aCBvZiBSSUdIVCBzaWRlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCIpLG4uc2V0TG9jYXRpb24oaSxGcy5SSUdIVCxyLmdldExvY2F0aW9uKGksRnMuUklHSFQpKSkpfX19LGUucHJvdG90eXBlLmNvbXB1dGVMYWJlbGxpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5jb21wdXRlTGFiZWxsaW5nKHRoaXMuX2FyZyl9dGhpcy5tZXJnZVN5bUxhYmVscygpLHRoaXMudXBkYXRlTm9kZUxhYmVsbGluZygpfSxlLnByb3RvdHlwZS5sYWJlbEluY29tcGxldGVOb2Rlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncmFwaC5nZXROb2RlcygpLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKSxuPWUuZ2V0TGFiZWwoKTtlLmlzSXNvbGF0ZWQoKSYmKG4uaXNOdWxsKDApP3RoaXMubGFiZWxJbmNvbXBsZXRlTm9kZShlLDApOnRoaXMubGFiZWxJbmNvbXBsZXRlTm9kZShlLDEpKSxlLmdldEVkZ2VzKCkudXBkYXRlTGFiZWxsaW5nKG4pfX0sZS5wcm90b3R5cGUuaXNDb3ZlcmVkQnlBPWZ1bmN0aW9uKHQpe3JldHVybiEhdGhpcy5pc0NvdmVyZWQodCx0aGlzLl9yZXN1bHRQb2x5TGlzdCl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KEZjKTtPYy5vdmVybGF5T3A9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuZXcgT2ModCxlKS5nZXRSZXN1bHRHZW9tZXRyeShuKX0sT2MuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSl7aWYodC5pc0VtcHR5KCl8fGUuaXNFbXB0eSgpKXJldHVybiBPYy5jcmVhdGVFbXB0eVJlc3VsdChPYy5JTlRFUlNFQ1RJT04sdCxlLHQuZ2V0RmFjdG9yeSgpKTtpZih0LmlzR2VvbWV0cnlDb2xsZWN0aW9uKCkpe3ZhciBuPWU7cmV0dXJuIFF1Lm1hcCh0LHtpbnRlcmZhY2VzXzpmdW5jdGlvbigpe3JldHVybltUYy5NYXBPcF19LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pbnRlcnNlY3Rpb24obil9fSl9cmV0dXJuIHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24odCksdC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbihlKSxmYy5vdmVybGF5T3AodCxlLE9jLklOVEVSU0VDVElPTil9LE9jLnN5bURpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtpZih0LmlzRW1wdHkoKXx8ZS5pc0VtcHR5KCkpe2lmKHQuaXNFbXB0eSgpJiZlLmlzRW1wdHkoKSlyZXR1cm4gT2MuY3JlYXRlRW1wdHlSZXN1bHQoT2MuU1lNRElGRkVSRU5DRSx0LGUsdC5nZXRGYWN0b3J5KCkpO2lmKHQuaXNFbXB0eSgpKXJldHVybiBlLmNvcHkoKTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gdC5jb3B5KCl9cmV0dXJuIHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24odCksdC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbihlKSxmYy5vdmVybGF5T3AodCxlLE9jLlNZTURJRkZFUkVOQ0UpfSxPYy5yZXN1bHREaW1lbnNpb249ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUuZ2V0RGltZW5zaW9uKCksaT1uLmdldERpbWVuc2lvbigpLG89LTE7c3dpdGNoKHQpe2Nhc2UgT2MuSU5URVJTRUNUSU9OOm89TWF0aC5taW4ocixpKTticmVhaztjYXNlIE9jLlVOSU9OOm89TWF0aC5tYXgocixpKTticmVhaztjYXNlIE9jLkRJRkZFUkVOQ0U6bz1yO2JyZWFrO2Nhc2UgT2MuU1lNRElGRkVSRU5DRTpvPU1hdGgubWF4KHIsaSl9cmV0dXJuIG99LE9jLmNyZWF0ZUVtcHR5UmVzdWx0PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW51bGw7c3dpdGNoKE9jLnJlc3VsdERpbWVuc2lvbih0LGUsbikpe2Nhc2UtMTppPXIuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKG5ldyBBcnJheSgwKS5maWxsKG51bGwpKTticmVhaztjYXNlIDA6aT1yLmNyZWF0ZVBvaW50KCk7YnJlYWs7Y2FzZSAxOmk9ci5jcmVhdGVMaW5lU3RyaW5nKCk7YnJlYWs7Y2FzZSAyOmk9ci5jcmVhdGVQb2x5Z29uKCl9cmV0dXJuIGl9LE9jLmRpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5pc0VtcHR5KCk/T2MuY3JlYXRlRW1wdHlSZXN1bHQoT2MuRElGRkVSRU5DRSx0LGUsdC5nZXRGYWN0b3J5KCkpOmUuaXNFbXB0eSgpP3QuY29weSgpOih0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKHQpLHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24oZSksZmMub3ZlcmxheU9wKHQsZSxPYy5ESUZGRVJFTkNFKSl9LE9jLmlzUmVzdWx0T2ZPcD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj10LmdldExvY2F0aW9uKDApLHI9dC5nZXRMb2NhdGlvbigxKTtyZXR1cm4gT2MuaXNSZXN1bHRPZk9wKG4scixlKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdO3N3aXRjaChpPT09YmkuQk9VTkRBUlkmJihpPWJpLklOVEVSSU9SKSxvPT09YmkuQk9VTkRBUlkmJihvPWJpLklOVEVSSU9SKSxhcmd1bWVudHNbMl0pe2Nhc2UgT2MuSU5URVJTRUNUSU9OOnJldHVybiBpPT09YmkuSU5URVJJT1ImJm89PT1iaS5JTlRFUklPUjtjYXNlIE9jLlVOSU9OOnJldHVybiBpPT09YmkuSU5URVJJT1J8fG89PT1iaS5JTlRFUklPUjtjYXNlIE9jLkRJRkZFUkVOQ0U6cmV0dXJuIGk9PT1iaS5JTlRFUklPUiYmbyE9PWJpLklOVEVSSU9SO2Nhc2UgT2MuU1lNRElGRkVSRU5DRTpyZXR1cm4gaT09PWJpLklOVEVSSU9SJiZvIT09YmkuSU5URVJJT1J8fGkhPT1iaS5JTlRFUklPUiYmbz09PWJpLklOVEVSSU9SfXJldHVybiExfX0sT2MuSU5URVJTRUNUSU9OPTEsT2MuVU5JT049MixPYy5ESUZGRVJFTkNFPTMsT2MuU1lNRElGRkVSRU5DRT00O3ZhciBMYz1mdW5jdGlvbigpe3RoaXMuX2c9bnVsbCx0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlPW51bGwsdGhpcy5fbGluZXdvcms9bnVsbCx0aGlzLl9wdExvY2F0b3I9bmV3IFR1LHRoaXMuX3NlZz1uZXcgYmE7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2c9dCx0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlPWUsdGhpcy5fbGluZXdvcms9dGhpcy5leHRyYWN0TGluZXdvcmsodCl9O0xjLnByb3RvdHlwZS5pc1dpdGhpblRvbGVyYW5jZU9mQm91bmRhcnk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj0wO248dGhpcy5fbGluZXdvcmsuZ2V0TnVtR2VvbWV0cmllcygpO24rKylmb3IodmFyIHI9ZS5fbGluZXdvcmsuZ2V0R2VvbWV0cnlOKG4pLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLGk9MDtpPHIuc2l6ZSgpLTE7aSsrKXtpZihyLmdldENvb3JkaW5hdGUoaSxlLl9zZWcucDApLHIuZ2V0Q29vcmRpbmF0ZShpKzEsZS5fc2VnLnAxKSxlLl9zZWcuZGlzdGFuY2UodCk8PWUuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2UpcmV0dXJuITB9cmV0dXJuITF9LExjLnByb3RvdHlwZS5nZXRMb2NhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pc1dpdGhpblRvbGVyYW5jZU9mQm91bmRhcnkodCk/YmkuQk9VTkRBUlk6dGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh0LHRoaXMuX2cpfSxMYy5wcm90b3R5cGUuZXh0cmFjdExpbmV3b3JrPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBQYzt0LmFwcGx5KGUpO3ZhciBuPWUuZ2V0TGluZXdvcmsoKSxyPUlzLnRvTGluZVN0cmluZ0FycmF5KG4pO3JldHVybiB0LmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcocil9LExjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxMYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTGN9O3ZhciBQYz1mdW5jdGlvbigpe3RoaXMuX2xpbmV3b3JrPW51bGwsdGhpcy5fbGluZXdvcms9bmV3IHhvfTtQYy5wcm90b3R5cGUuZ2V0TGluZXdvcms9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGluZXdvcmt9LFBjLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIGhzKXt2YXIgZT10O3RoaXMuX2xpbmV3b3JrLmFkZChlLmdldEV4dGVyaW9yUmluZygpKTtmb3IodmFyIG49MDtuPGUuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7bisrKXRoaXMuX2xpbmV3b3JrLmFkZChlLmdldEludGVyaW9yUmluZ04obikpfX0sUGMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1hvXX0sUGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFBjfTt2YXIgUmM9ZnVuY3Rpb24oKXt0aGlzLl9nPW51bGwsdGhpcy5fZG9MZWZ0PSEwLHRoaXMuX2RvUmlnaHQ9ITA7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2c9dH07UmMucHJvdG90eXBlLmV4dHJhY3RQb2ludHM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10LmdldENvb3JkaW5hdGVzKCksaT0wO2k8ci5sZW5ndGgtMTtpKyspdGhpcy5jb21wdXRlT2Zmc2V0UG9pbnRzKHJbaV0scltpKzFdLGUsbil9LFJjLnByb3RvdHlwZS5zZXRTaWRlc1RvR2VuZXJhdGU9ZnVuY3Rpb24odCxlKXt0aGlzLl9kb0xlZnQ9dCx0aGlzLl9kb1JpZ2h0PWV9LFJjLnByb3RvdHlwZS5nZXRQb2ludHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPUZ1LmdldExpbmVzKHRoaXMuX2cpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTt0aGlzLmV4dHJhY3RQb2ludHMocix0LGUpfXJldHVybiBlfSxSYy5wcm90b3R5cGUuY29tcHV0ZU9mZnNldFBvaW50cz1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1lLngtdC54LG89ZS55LXQueSxzPU1hdGguc3FydChpKmkrbypvKSxhPW4qaS9zLHU9bipvL3MsYz0oZS54K3QueCkvMixsPShlLnkrdC55KS8yO2lmKHRoaXMuX2RvTGVmdCl7dmFyIGg9bmV3IHZpKGMtdSxsK2EpO3IuYWRkKGgpfWlmKHRoaXMuX2RvUmlnaHQpe3ZhciBmPW5ldyB2aShjK3UsbC1hKTtyLmFkZChmKX19LFJjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxSYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUmN9O3ZhciBCYz1mdW5jdGlvbiB0KCl7dGhpcy5fZ2VvbT1udWxsLHRoaXMuX2xvY0ZpbmRlcj1udWxsLHRoaXMuX2xvY2F0aW9uPW5ldyBBcnJheSgzKS5maWxsKG51bGwpLHRoaXMuX2ludmFsaWRMb2NhdGlvbj1udWxsLHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9dC5UT0xFUkFOQ0UsdGhpcy5fdGVzdENvb3Jkcz1uZXcgeG87dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO3RoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9dC5jb21wdXRlQm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZShlLG4pLHRoaXMuX2dlb209W2UsbixyXSx0aGlzLl9sb2NGaW5kZXI9W25ldyBMYyh0aGlzLl9nZW9tWzBdLHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2UpLG5ldyBMYyh0aGlzLl9nZW9tWzFdLHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2UpLG5ldyBMYyh0aGlzLl9nZW9tWzJdLHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2UpXX0sa2M9e1RPTEVSQU5DRTp7Y29uZmlndXJhYmxlOiEwfX07QmMucHJvdG90eXBlLnJlcG9ydFJlc3VsdD1mdW5jdGlvbih0LGUsbil7a2kub3V0LnByaW50bG4oIk92ZXJsYXkgcmVzdWx0IGludmFsaWQgLSBBOiIrYmkudG9Mb2NhdGlvblN5bWJvbChlWzBdKSsiIEI6IitiaS50b0xvY2F0aW9uU3ltYm9sKGVbMV0pKyIgZXhwZWN0ZWQ6Iisobj8iaSI6ImUiKSsiIGFjdHVhbDoiK2JpLnRvTG9jYXRpb25TeW1ib2woZVsyXSkpfSxCYy5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hZGRUZXN0UHRzKHRoaXMuX2dlb21bMF0pLHRoaXMuYWRkVGVzdFB0cyh0aGlzLl9nZW9tWzFdKSx0aGlzLmNoZWNrVmFsaWQodCl9LEJjLnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPTA7bjx0aGlzLl90ZXN0Q29vcmRzLnNpemUoKTtuKyspe3ZhciByPXQuX3Rlc3RDb29yZHMuZ2V0KG4pO2lmKCF0LmNoZWNrVmFsaWQoZSxyKSlyZXR1cm4gdC5faW52YWxpZExvY2F0aW9uPXIsITF9cmV0dXJuITB9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5fbG9jYXRpb25bMF09dGhpcy5fbG9jRmluZGVyWzBdLmdldExvY2F0aW9uKG8pLHRoaXMuX2xvY2F0aW9uWzFdPXRoaXMuX2xvY0ZpbmRlclsxXS5nZXRMb2NhdGlvbihvKSx0aGlzLl9sb2NhdGlvblsyXT10aGlzLl9sb2NGaW5kZXJbMl0uZ2V0TG9jYXRpb24obyksISFCYy5oYXNMb2NhdGlvbih0aGlzLl9sb2NhdGlvbixiaS5CT1VOREFSWSl8fHRoaXMuaXNWYWxpZFJlc3VsdChpLHRoaXMuX2xvY2F0aW9uKX19LEJjLnByb3RvdHlwZS5hZGRUZXN0UHRzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBSYyh0KTt0aGlzLl90ZXN0Q29vcmRzLmFkZEFsbChlLmdldFBvaW50cyg1KnRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2UpKX0sQmMucHJvdG90eXBlLmlzVmFsaWRSZXN1bHQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1PYy5pc1Jlc3VsdE9mT3AoZVswXSxlWzFdLHQpLHI9IShuXmVbMl09PT1iaS5JTlRFUklPUik7cmV0dXJuIHJ8fHRoaXMucmVwb3J0UmVzdWx0KHQsZSxuKSxyfSxCYy5wcm90b3R5cGUuZ2V0SW52YWxpZExvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludmFsaWRMb2NhdGlvbn0sQmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEJjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBCY30sQmMuaGFzTG9jYXRpb249ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPDM7bisrKWlmKHRbbl09PT1lKXJldHVybiEwO3JldHVybiExfSxCYy5jb21wdXRlQm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1pbihyYy5jb21wdXRlU2l6ZUJhc2VkU25hcFRvbGVyYW5jZSh0KSxyYy5jb21wdXRlU2l6ZUJhc2VkU25hcFRvbGVyYW5jZShlKSl9LEJjLmlzVmFsaWQ9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIG5ldyBCYyh0LGUscikuaXNWYWxpZChuKX0sa2MuVE9MRVJBTkNFLmdldD1mdW5jdGlvbigpe3JldHVybiAxZS02fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhCYyxrYyk7dmFyIHpjPWZ1bmN0aW9uIHQoZSl7dGhpcy5fZ2VvbUZhY3Rvcnk9bnVsbCx0aGlzLl9za2lwRW1wdHk9ITEsdGhpcy5faW5wdXRHZW9tcz1udWxsLHRoaXMuX2dlb21GYWN0b3J5PXQuZXh0cmFjdEZhY3RvcnkoZSksdGhpcy5faW5wdXRHZW9tcz1lfTt6Yy5wcm90b3R5cGUuZXh0cmFjdEVsZW1lbnRzPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09PXQpcmV0dXJuIG51bGw7Zm9yKHZhciBuPTA7bjx0LmdldE51bUdlb21ldHJpZXMoKTtuKyspe3ZhciByPXQuZ2V0R2VvbWV0cnlOKG4pO3RoaXMuX3NraXBFbXB0eSYmci5pc0VtcHR5KCl8fGUuYWRkKHIpfX0semMucHJvdG90eXBlLmNvbWJpbmU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IHhvLGU9dGhpcy5faW5wdXRHZW9tcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dGhpcy5leHRyYWN0RWxlbWVudHMobix0KX1yZXR1cm4gMD09PXQuc2l6ZSgpP251bGwhPT10aGlzLl9nZW9tRmFjdG9yeT90aGlzLl9nZW9tRmFjdG9yeS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24obnVsbCk6bnVsbDp0aGlzLl9nZW9tRmFjdG9yeS5idWlsZEdlb21ldHJ5KHQpfSx6Yy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0semMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHpjfSx6Yy5jb21iaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP25ldyB6Yyhhcmd1bWVudHNbMF0pLmNvbWJpbmUoKToyPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgemMoemMuY3JlYXRlTGlzdChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKSkuY29tYmluZSgpOjM9PT1hcmd1bWVudHMubGVuZ3RoP25ldyB6Yyh6Yy5jcmVhdGVMaXN0KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKSkuY29tYmluZSgpOnZvaWQgMH0semMuZXh0cmFjdEZhY3Rvcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNFbXB0eSgpP251bGw6dC5pdGVyYXRvcigpLm5leHQoKS5nZXRGYWN0b3J5KCl9LHpjLmNyZWF0ZUxpc3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IHhvO3JldHVybiBuLmFkZCh0KSxuLmFkZChlKSxufWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl0scz1uZXcgeG87cmV0dXJuIHMuYWRkKHIpLHMuYWRkKGkpLHMuYWRkKG8pLHN9fTt2YXIgamM9ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dFBvbHlzPW51bGwsdGhpcy5fZ2VvbUZhY3Rvcnk9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5faW5wdXRQb2x5cz10LG51bGw9PT10aGlzLl9pbnB1dFBvbHlzJiYodGhpcy5faW5wdXRQb2x5cz1uZXcgeG8pfSxVYz17U1RSVFJFRV9OT0RFX0NBUEFDSVRZOntjb25maWd1cmFibGU6ITB9fTtqYy5wcm90b3R5cGUucmVkdWNlVG9HZW9tZXRyaWVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKSxpPW51bGw7RWkocix2byk/aT10aGlzLnVuaW9uVHJlZShyKTpyIGluc3RhbmNlb2YgaW8mJihpPXIpLGUuYWRkKGkpfXJldHVybiBlfSxqYy5wcm90b3R5cGUuZXh0cmFjdEJ5RW52ZWxvcGU9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uZXcgeG8saT0wO2k8ZS5nZXROdW1HZW9tZXRyaWVzKCk7aSsrKXt2YXIgbz1lLmdldEdlb21ldHJ5TihpKTtvLmdldEVudmVsb3BlSW50ZXJuYWwoKS5pbnRlcnNlY3RzKHQpP3IuYWRkKG8pOm4uYWRkKG8pfXJldHVybiB0aGlzLl9nZW9tRmFjdG9yeS5idWlsZEdlb21ldHJ5KHIpfSxqYy5wcm90b3R5cGUudW5pb25PcHRpbWl6ZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldEVudmVsb3BlSW50ZXJuYWwoKSxyPWUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpO2lmKCFuLmludGVyc2VjdHMocikpcmV0dXJuIHpjLmNvbWJpbmUodCxlKTtpZih0LmdldE51bUdlb21ldHJpZXMoKTw9MSYmZS5nZXROdW1HZW9tZXRyaWVzKCk8PTEpcmV0dXJuIHRoaXMudW5pb25BY3R1YWwodCxlKTt2YXIgaT1uLmludGVyc2VjdGlvbihyKTtyZXR1cm4gdGhpcy51bmlvblVzaW5nRW52ZWxvcGVJbnRlcnNlY3Rpb24odCxlLGkpfSxqYy5wcm90b3R5cGUudW5pb249ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5faW5wdXRQb2x5cyl0aHJvdyBuZXcgRXJyb3IoInVuaW9uKCkgbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQgdHdpY2UiKTtpZih0aGlzLl9pbnB1dFBvbHlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt0aGlzLl9nZW9tRmFjdG9yeT10aGlzLl9pbnB1dFBvbHlzLml0ZXJhdG9yKCkubmV4dCgpLmdldEZhY3RvcnkoKTtmb3IodmFyIHQ9bmV3IHBhKGpjLlNUUlRSRUVfTk9ERV9DQVBBQ0lUWSksZT10aGlzLl9pbnB1dFBvbHlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0Lmluc2VydChuLmdldEVudmVsb3BlSW50ZXJuYWwoKSxuKX10aGlzLl9pbnB1dFBvbHlzPW51bGw7dmFyIHI9dC5pdGVtc1RyZWUoKTtyZXR1cm4gdGhpcy51bmlvblRyZWUocil9LGpjLnByb3RvdHlwZS5iaW5hcnlVbmlvbj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuYmluYXJ5VW5pb24odCwwLHQuc2l6ZSgpKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO2lmKHItbjw9MSl7dmFyIGk9amMuZ2V0R2VvbWV0cnkoZSxuKTtyZXR1cm4gdGhpcy51bmlvblNhZmUoaSxudWxsKX1pZihyLW49PTIpcmV0dXJuIHRoaXMudW5pb25TYWZlKGpjLmdldEdlb21ldHJ5KGUsbiksamMuZ2V0R2VvbWV0cnkoZSxuKzEpKTt2YXIgbz1NYXRoLnRydW5jKChyK24pLzIpLHM9dGhpcy5iaW5hcnlVbmlvbihlLG4sbyksYT10aGlzLmJpbmFyeVVuaW9uKGUsbyxyKTtyZXR1cm4gdGhpcy51bmlvblNhZmUocyxhKX19LGpjLnByb3RvdHlwZS5yZXBlYXRlZFVuaW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ZT1udWxsPT09ZT9yLmNvcHkoKTplLnVuaW9uKHIpfXJldHVybiBlfSxqYy5wcm90b3R5cGUudW5pb25TYWZlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PT10JiZudWxsPT09ZT9udWxsOm51bGw9PT10P2UuY29weSgpOm51bGw9PT1lP3QuY29weSgpOnRoaXMudW5pb25PcHRpbWl6ZWQodCxlKX0samMucHJvdG90eXBlLnVuaW9uQWN0dWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGpjLnJlc3RyaWN0VG9Qb2x5Z29ucyh0LnVuaW9uKGUpKX0samMucHJvdG90eXBlLnVuaW9uVHJlZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnJlZHVjZVRvR2VvbWV0cmllcyh0KTtyZXR1cm4gdGhpcy5iaW5hcnlVbmlvbihlKX0samMucHJvdG90eXBlLnVuaW9uVXNpbmdFbnZlbG9wZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IHhvLGk9dGhpcy5leHRyYWN0QnlFbnZlbG9wZShuLHQsciksbz10aGlzLmV4dHJhY3RCeUVudmVsb3BlKG4sZSxyKSxzPXRoaXMudW5pb25BY3R1YWwoaSxvKTtyZXR1cm4gci5hZGQocyksemMuY29tYmluZShyKX0samMucHJvdG90eXBlLmJ1ZmZlclVuaW9uPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdC5nZXQoMCkuZ2V0RmFjdG9yeSgpLmJ1aWxkR2VvbWV0cnkodCkuYnVmZmVyKDApfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuIGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihbZSxuXSkuYnVmZmVyKDApfX0samMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGpjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBqY30samMucmVzdHJpY3RUb1BvbHlnb25zPWZ1bmN0aW9uKHQpe2lmKEVpKHQsbHMpKXJldHVybiB0O3ZhciBlPU11LmdldFBvbHlnb25zKHQpO3JldHVybiAxPT09ZS5zaXplKCk/ZS5nZXQoMCk6dC5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlQb2x5Z29uKElzLnRvUG9seWdvbkFycmF5KGUpKX0samMuZ2V0R2VvbWV0cnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT49dC5zaXplKCk/bnVsbDp0LmdldChlKX0samMudW5pb249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBqYyh0KS51bmlvbigpfSxVYy5TVFJUUkVFX05PREVfQ0FQQUNJVFkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDR9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGpjLFVjKTt2YXIgcWM9ZnVuY3Rpb24oKXt9O3FjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxxYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcWN9LHFjLnVuaW9uPWZ1bmN0aW9uKHQsZSl7aWYodC5pc0VtcHR5KCl8fGUuaXNFbXB0eSgpKXtpZih0LmlzRW1wdHkoKSYmZS5pc0VtcHR5KCkpcmV0dXJuIE9jLmNyZWF0ZUVtcHR5UmVzdWx0KE9jLlVOSU9OLHQsZSx0LmdldEZhY3RvcnkoKSk7aWYodC5pc0VtcHR5KCkpcmV0dXJuIGUuY29weSgpO2lmKGUuaXNFbXB0eSgpKXJldHVybiB0LmNvcHkoKX1yZXR1cm4gdC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbih0KSx0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKGUpLGZjLm92ZXJsYXlPcCh0LGUsT2MuVU5JT04pfTt2YXIgVmM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEdjfTtmdW5jdGlvbiBHYygpe3RoaXMucmVzZXQoKX1HYy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkdjLHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSxhZGQ6ZnVuY3Rpb24odCl7WGMoWWMsdCx0aGlzLnQpLFhjKHRoaXMsWWMucyx0aGlzLnMpLHRoaXMucz90aGlzLnQrPVljLnQ6dGhpcy5zPVljLnR9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIFljPW5ldyBHYztmdW5jdGlvbiBYYyh0LGUsbil7dmFyIHI9dC5zPWUrbixpPXItZSxvPXItaTt0LnQ9ZS1vKyhuLWkpfXZhciBXYz1NYXRoLlBJLEhjPTIqV2M7ZnVuY3Rpb24gWmModCxlKXtyZXR1cm5bdD5XYz90LUhjOnQ8LVdjP3QrSGM6dCxlXX1WYygpLFZjKCksVmMoKSxaYy5pbnZlcnQ9WmM7dmFyIEtjLEpjLFFjLCRjLHRsLGVsLG5sLHJsLGlsLG9sLHNsLGFsLHVsLGNsLGxsLGhsLGZsLHBsLGRsLGdsLHlsLG1sLHZsLF9sLHhsLHdsLGJsLERsLEVsLENsLFNsLEFsLE5sLElsLE1sLEZsLFRsLE9sLExsLFBsLFJsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfTtmdW5jdGlvbiBCbCgpe31mdW5jdGlvbiBrbCh0LGUsbil7dmFyIHI9dm9pZCAwPT09ZT9udWxsOmUsaT1mdW5jdGlvbih0LGUpe3ZhciBuPWF0b2IodCk7aWYoZSl7Zm9yKHZhciByPW5ldyBVaW50OEFycmF5KG4ubGVuZ3RoKSxpPTAsbz1uLmxlbmd0aDtpPG87KytpKXJbaV09bi5jaGFyQ29kZUF0KGkpO3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQxNkFycmF5KHIuYnVmZmVyKSl9cmV0dXJuIG59KHQsdm9pZCAwIT09biYmbiksbz1pLmluZGV4T2YoIlxuIiwxMCkrMSxzPWkuc3Vic3RyaW5nKG8pKyhyPyIvLyMgc291cmNlTWFwcGluZ1VSTD0iK3I6IiIpLGE9bmV3IEJsb2IoW3NdLHt0eXBlOiJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0In0pO3JldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGEpfWZ1bmN0aW9uIHpsKHQ9OCxlPTYyKXtjb25zdCBuPSIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIuc3BsaXQoIiIpLHI9W107bGV0IGk7aWYoZT1lfHxuLmxlbmd0aCx0KWZvcihpPTA7aTx0O2krKylyW2ldPW5bMHxNYXRoLnJhbmRvbSgpKmVdO2Vsc2V7bGV0IHQ7Zm9yKHJbOF09clsxM109clsxOF09clsyM109Ii0iLHJbMTRdPSI0IixpPTA7aTwzNjtpKyspcltpXXx8KHQ9MHwxNipNYXRoLnJhbmRvbSgpLHJbaV09blsxOT09PWk/MyZ0fDg6dF0pfXJldHVybiByLmpvaW4oIiIpfShmdW5jdGlvbih0KXsxPT09dC5sZW5ndGgmJih0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiBSbCh0KGUpLG4pfX0odCkpfSkoUmwpLFZjKCksVmMoKSxWYygpLFZjKCksVmMoKSxCbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkJsLHBvaW50OmZ1bmN0aW9uKHQsZSl7dGhpcy5zdHJlYW0ucG9pbnQodCxlKX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19LGZ1bmN0aW9uKHQpe3QuUG9pbnRDbG91ZD0icG9pbnRDbG91ZFRvb2wifShLY3x8KEtjPXt9KSksZnVuY3Rpb24odCl7dC5WaWRlb1RleHRUb29sPSJ2aWRlb1RleHRUb29sIix0LlZpZGVvVGFnVG9vbD0idmlkZW9UYWdUb29sIix0LlZpZGVvQ2xpcFRvb2w9InZpZGVvQ2xpcFRvb2wifShKY3x8KEpjPXt9KSksZnVuY3Rpb24odCl7dC5BdWRpb1RleHRUb29sPSJhdWRpb1RleHRUb29sIn0oUWN8fChRYz17fSkpLGZ1bmN0aW9uKHQpe3RbdC5SZWN0PTBdPSJSZWN0Iix0W3QuVGFnPTFdPSJUYWcifSgkY3x8KCRjPXt9KSksZnVuY3Rpb24odCl7dC5SZWN0PSJyZWN0VG9vbCIsdC5UYWc9InRhZ1Rvb2wiLHQuUG9pbnQ9InBvaW50VG9vbCIsdC5Qb2ludE1hcmtlcj0icG9pbnRNYXJrZXJUb29sIix0LlNlZ21lbnRhdGlvbj0ic2VnbWVudGF0aW9uVG9vbCIsdC5GaWx0ZXI9ImZpbHRlclRvb2wiLHQuVGV4dD0idGV4dFRvb2wiLHQuUG9seWdvbj0icG9seWdvblRvb2wiLHQuTGluZT0ibGluZVRvb2wiLHQuTGluZU1hcmtlcj0ibGluZU1hcmtlclRvb2wiLHQuRW1wdHk9ImVtcHR5VG9vbCIsdC5Gb2xkZXJUYWc9ImZvbGRlclRhZ1Rvb2wiLHQuUmVjdFRyYWNrPSJyZWN0VHJhY2tUb29sIix0LlNjcmliYmxlVG9vbD0ic2NyaWJibGVUb29sIix0LkZhY2U9ImZhY2VUb29sIix0LkNsaWVudEF0dHJpYnV0ZT0iY2xpZW50QXR0cmlidXRlVG9vbCIsdC5PQ1JSZWxhdGlvbj0iT0NSUmVsYXRpb25Ub29sIix0LlNlZ21lbnRCeVJlY3Q9InNlZ21lbnRCeVJlY3RUb29sIix0LkN1Ym9pZD0iY3Vib2lkVG9vbCIsdC5Qb2ludENsb3VkUG9seWdvbj0icG9pbnRDbG91ZFBvbHlnb24iLHQuTExNPSJMTE1Ub29sIix0Lk5MUD0iTkxQVG9vbCIsdC5MTE1NdWx0aVdoZWVsPSJMTE1NdWx0aVdoZWVsVG9vbCJ9KHRsfHwodGw9e30pKSxmdW5jdGlvbih0KXt0LkNoZWNrPSJjaGVjayJ9KGVsfHwoZWw9e30pKSxmdW5jdGlvbih0KXt0W3Qubm90aGluZz0wXT0ibm90aGluZyIsdFt0LlJlY3RCRz0xXT0iUmVjdEJHIix0W3Quc2hvd09yZGVyPTJdPSJzaG93T3JkZXIifShubHx8KG5sPXt9KSksdGwuUmVjdCx0bC5UYWcsdGwuUG9pbnQsdGwuUG9pbnRNYXJrZXIsdGwuU2VnbWVudGF0aW9uLHRsLkZpbHRlcix0bC5UZXh0LHRsLlBvbHlnb24sdGwuTGluZSx0bC5MaW5lTWFya2VyLHRsLkZvbGRlclRhZyx0bC5SZWN0VHJhY2ssdGwuRmFjZSx0bC5DbGllbnRBdHRyaWJ1dGUsdGwuT0NSUmVsYXRpb24sdGwuU2VnbWVudEJ5UmVjdCxKYy5WaWRlb1RleHRUb29sLEpjLlZpZGVvVGFnVG9vbCxKYy5WaWRlb0NsaXBUb29sLEtjLlBvaW50Q2xvdWQsdGwuQ3Vib2lkLHRsLkxMTSx0bC5OTFAsdGwuTExNTXVsdGlXaGVlbCx0bC5SZWN0LHRsLlRhZyx0bC5Qb2ludCx0bC5Qb2ludE1hcmtlcix0bC5TZWdtZW50YXRpb24sdGwuRmlsdGVyLHRsLlRleHQsdGwuUG9seWdvbix0bC5MaW5lLHRsLkxpbmVNYXJrZXIsdGwuRm9sZGVyVGFnLHRsLlJlY3RUcmFjayx0bC5GYWNlLHRsLkNsaWVudEF0dHJpYnV0ZSx0bC5PQ1JSZWxhdGlvbix0bC5TZWdtZW50QnlSZWN0LEpjLlZpZGVvVGV4dFRvb2wsSmMuVmlkZW9UYWdUb29sLEpjLlZpZGVvQ2xpcFRvb2wsS2MuUG9pbnRDbG91ZCx0bC5DdWJvaWQsdGwuTExNLHRsLk5MUCx0bC5MTE1NdWx0aVdoZWVsLGZ1bmN0aW9uKHQpe3RbdC5ub0RlcGVuZD0xXT0ibm9EZXBlbmQiLHRbdC5kZXBlbmRPcmlnaW49Ml09ImRlcGVuZE9yaWdpbiIsdFt0LmRlcGVuZFNoYXBlPTNdPSJkZXBlbmRTaGFwZSIsdFt0LmRlcGVuZExpbmU9NF09ImRlcGVuZExpbmUiLHRbdC5kZXBlbmRQb2x5Z29uPTVdPSJkZXBlbmRQb2x5Z29uIix0W3QuZGVwZW5kUHJlU2hhcGU9MTAxXT0iZGVwZW5kUHJlU2hhcGUiLHRbdC5kZXBlbmRQcmVMaW5lPTEwMl09ImRlcGVuZFByZUxpbmUiLHRbdC5kZXBlbmRQcmVQb2x5Z29uPTEwM109ImRlcGVuZFByZVBvbHlnb24ifShybHx8KHJsPXt9KSksZnVuY3Rpb24odCl7dC5sYz0ibGVmdENsaWNrIix0LnJjPSJyaWdodENsaWNrIix0LmNsYz0iY3RybExlZnRDbGljayIsdC5jcmM9ImN0cmxSaWdodENsaWNrIn0oaWx8fChpbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5Ob3JtYWw9MV09Ik5vcm1hbCIsdFt0Lk1vZGlmeT0yXT0iTW9kaWZ5In0ob2x8fChvbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5MaW5lPTBdPSJMaW5lIix0W3QuQ3VydmU9MV09IkN1cnZlIn0oc2x8fChzbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5TaW5nbGVDb2xvcj0wXT0iU2luZ2xlQ29sb3IiLHRbdC5NdWx0aUNvbG9yPTFdPSJNdWx0aUNvbG9yIn0oYWx8fChhbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5Gb3JtPTFdPSJGb3JtIix0W3QuSnNvbj0yXT0iSnNvbiJ9KHVsfHwodWw9e30pKSxmdW5jdGlvbih0KXt0W3QuUG9pbnQ9MF09IlBvaW50Iix0W3QuTGluZT0xXT0iTGluZSIsdFt0LlBsYW5lPTJdPSJQbGFuZSJ9KGNsfHwoY2w9e30pKSxmdW5jdGlvbih0KXt0W3QuTm9uZT0wXT0iTm9uZSIsdFt0LkRyYXdpbmc9MV09IkRyYXdpbmciLHRbdC5FZGl0PTJdPSJFZGl0In0obGx8fChsbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5CYWNrd2FyZD0wXT0iQmFja3dhcmQiLHRbdC5Gb3J3YXJkPTFdPSJGb3J3YXJkIix0W3QuSnVtcFNraXA9Ml09Ikp1bXBTa2lwIix0W3QuTm9uZT0zXT0iTm9uZSJ9KGhsfHwoaGw9e30pKSxmdW5jdGlvbih0KXt0W3QuV2FpdD0wXT0iV2FpdCIsdFt0LlBhc3M9MV09IlBhc3MiLHRbdC5GYWlsPTJdPSJGYWlsIix0W3QuTG9hZGluZz0zXT0iTG9hZGluZyJ9KGZsfHwoZmw9e30pKSxmdW5jdGlvbih0KXt0W3QuQW55U3RyaW5nPTBdPSJBbnlTdHJpbmciLHRbdC5PcmRlcj0xXT0iT3JkZXIiLHRbdC5FbmdsaXNoT25seT0yXT0iRW5nbGlzaE9ubHkiLHRbdC5OdW1iZXJPbmx5PTNdPSJOdW1iZXJPbmx5Iix0W3QuQ3VzdG9tRm9ybWF0PTRdPSJDdXN0b21Gb3JtYXQifShwbHx8KHBsPXt9KSksZnVuY3Rpb24odCl7dFt0LkltZ0xpc3Q9MWUzXT0iSW1nTGlzdCIsdFt0LlRyYWNrUHJlZGljdGlvbj0xMDAxXT0iVHJhY2tQcmVkaWN0aW9uIix0W3QuSW1nU2VhcmNoPTEwMDJdPSJJbWdTZWFyY2gifShkbHx8KGRsPXt9KSksS2MuUG9pbnRDbG91ZCx0bC5DbGllbnRBdHRyaWJ1dGUsdGwuRmFjZSx0bC5PQ1JSZWxhdGlvbixLYy5Qb2ludENsb3VkLHRsLkNsaWVudEF0dHJpYnV0ZSx0bC5GYWNlLHRsLk9DUlJlbGF0aW9uLGZ1bmN0aW9uKHQpe3RbdC5Ob3JtYWw9MF09Ik5vcm1hbCIsdFt0LlJlY3Q9MV09IlJlY3QifShnbHx8KGdsPXt9KSksZnVuY3Rpb24odCl7dFt0LlNjcmliYmxlPTFdPSJTY3JpYmJsZSIsdFt0LkVyYXNlPTJdPSJFcmFzZSJ9KHlsfHwoeWw9e30pKSxmdW5jdGlvbih0KXt0W3QuR2VuZXJhbD0xXT0iR2VuZXJhbCIsdFt0Lk11bHRpTW92ZT0yXT0iTXVsdGlNb3ZlIn0obWx8fChtbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5BTk5PVEFUSU9OPTFdPSJBTk5PVEFUSU9OIix0W3QuUVVBTElUWV9JTlNQRUNUSU9OPTJdPSJRVUFMSVRZX0lOU1BFQ1RJT04iLHRbdC5QUkVfQU5OT1RBVElPTj0zXT0iUFJFX0FOTk9UQVRJT04iLHRbdC5NQU5VQUxfQ09SUkVDVElPTj00XT0iTUFOVUFMX0NPUlJFQ1RJT04ifSh2bHx8KHZsPXt9KSksZnVuY3Rpb24odCl7dFt0LkJhY2t3YXJkPTBdPSJCYWNrd2FyZCIsdFt0LkZvcndhcmQ9MV09IkZvcndhcmQiLHRbdC5KdW1wU2tpcD0yXT0iSnVtcFNraXAiLHRbdC5Ob25lPTNdPSJOb25lIn0oX2x8fChfbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5TdGFydD0wXT0iU3RhcnQiLHRbdC5TdG9wPTFdPSJTdG9wIix0W3QuV2FpdD0yXT0iV2FpdCIsdFt0Lk1vdmU9M109Ik1vdmUifSh4bHx8KHhsPXt9KSksZnVuY3Rpb24odCl7dFt0LlBvaW50PTBdPSJQb2ludCIsdFt0LkxpbmU9MV09IkxpbmUiLHRbdC5QbGFuZT0yXT0iUGxhbmUiLHRbdC5DdWJvaWQ9M109IkN1Ym9pZCJ9KHdsfHwod2w9e30pKSxmdW5jdGlvbih0KXt0W3QuYXNjZW5kPTBdPSJhc2NlbmQiLHRbdC5kZXNjZW5kPTFdPSJkZXNjZW5kIn0oYmx8fChibD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5JbnRlbGxpZ2VuY2U9MF09IkludGVsbGlnZW5jZSIsdFt0LkxpbmVhcj0xXT0iTGluZWFyIn0oRGx8fChEbD17fSkpLGZ1bmN0aW9uKHQpe3QuWmg9InpoX0NOIix0LlVTPSJlbl9VUyJ9KEVsfHwoRWw9e30pKSxmdW5jdGlvbih0KXt0W3QuQ2xvY2t3aXNlPTBdPSJDbG9ja3dpc2UiLHRbdC5BbnRpY2xvY2t3aXNlPTFdPSJBbnRpY2xvY2t3aXNlIn0oQ2x8fChDbD17fSkpLGZ1bmN0aW9uKHQpe3QuRnJvbnQ9ImZyb250Iix0LkJhY2s9ImJhY2siLHQuU2lkZT0ic2lkZSJ9KFNsfHwoU2w9e30pKSxmdW5jdGlvbih0KXt0LlRMPSJ0bCIsdC5UUj0idHIiLHQuQkw9ImJsIix0LkJSPSJiciJ9KEFsfHwoQWw9e30pKSxmdW5jdGlvbih0KXt0LkZyb250PSJmcm9udCIsdC5CYWNrPSJiYWNrIix0LkxlZnQ9ImxlZnQiLHQuUmlnaHQ9InJpZ2h0Iix0LlRvcD0idG9wIn0oTmx8fChObD17fSkpLGZ1bmN0aW9uKHQpe3QuUm93PSJyb3ciLHQuQ29sdW1uPSJjb2x1bW4ifShJbHx8KElsPXt9KSksQWwuVEwsQWwuVFIsQWwuVFIsQWwuVEwsQWwuQkwsQWwuQlIsQWwuQlIsQWwuQkwsQWwuVEwsQWwuQkwsQWwuVFIsQWwuQlIsQWwuQkwsQWwuVEwsQWwuQlIsQWwuVFIsZnVuY3Rpb24odCl7dFt0LkE9NjVdPSJBIix0W3QuQj02Nl09IkIiLHRbdC5DPTY3XT0iQyIsdFt0LkQ9NjhdPSJEIix0W3QuRT02OV09IkUiLHRbdC5GPTcwXT0iRiIsdFt0Lkc9NzFdPSJHIix0W3QuSD03Ml09IkgiLHRbdC5JPTczXT0iSSIsdFt0Lk89NzldPSJPIix0W3QuTD03Nl09IkwiLHRbdC5SPTgyXT0iUiIsdFt0Llo9OTBdPSJaIix0W3QuVz04N109IlciLHRbdC5YPTg4XT0iWCIsdFt0Llk9ODldPSJZIix0W3QuUz04M109IlMiLHRbdC5RPTgxXT0iUSIsdFt0LlA9ODBdPSJQIix0W3QuT25lPTQ5XT0iT25lIix0W3QuVHdvPTUwXT0iVHdvIix0W3QuVGhyZWU9NTFdPSJUaHJlZSIsdFt0LkRlbGV0ZT00Nl09IkRlbGV0ZSIsdFt0LkYxMT0xMjJdPSJGMTEiLHRbdC5TcGFjZT0zMl09IlNwYWNlIix0W3QuRXNjPTI3XT0iRXNjIix0W3QuTGVmdD0zN109IkxlZnQiLHRbdC5VcD0zOF09IlVwIix0W3QuUmlnaHQ9MzldPSJSaWdodCIsdFt0LkRvd249NDBdPSJEb3duIix0W3QuRW50ZXI9MTNdPSJFbnRlciIsdFt0LkN0cmw9MTddPSJDdHJsIix0W3QuQWx0PTE4XT0iQWx0Iix0W3QuU2hpZnQ9MTZdPSJTaGlmdCIsdFt0LlRhYj05XT0iVGFiIix0W3QuQmFja1NwYWNlPThdPSJCYWNrU3BhY2UiLHRbdC5NaW51cz0xODldPSJNaW51cyIsdFt0LkVxdWFsPTE4N109IkVxdWFsIn0oTWx8fChNbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5DcmVhdGU9MF09IkNyZWF0ZSIsdFt0LkFjdGl2ZT0xXT0iQWN0aXZlIix0W3QuRWRpdD0xXT0iRWRpdCIsdFt0Lk5vbmU9Ml09Ik5vbmUifShGbHx8KEZsPXt9KSksZnVuY3Rpb24odCl7dC5BY3RpdmVBcmVhPSIjQjNCOEZGIn0oVGx8fChUbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5PdXRzaWRlPTBdPSJPdXRzaWRlIix0W3QuUGFydGlhbGx5SW5zaWRlPTFdPSJQYXJ0aWFsbHlJbnNpZGUiLHRbdC5GdWxseUluc2lkZT0yXT0iRnVsbHlJbnNpZGUifShPbHx8KE9sPXt9KSksZnVuY3Rpb24odCl7dC5Ob1JvdGF0ZU5vdGljZT0ibm9Sb3RhdGVOb3RpY2UiLHQuUmVjdEVycm9yU2l6ZU5vdGljZT0icmVjdEVycm9yU2l6ZU5vdGljZSIsdC5UZXh0Q2hlY2tOdW1iZXJFcnJvck5vdGljZT0idGV4dENoZWNrTnVtYmVyRXJyb3JOb3RpY2UiLHQuVGV4dENoZWNrRW5nbGlzaEVycm9yTm90aWNlPSJ0ZXh0Q2hlY2tFbmdsaXNoRXJyb3JOb3RpY2UiLHQuVGV4dENoZWNrQ3VzdG9tRXJyb3JOb3RpY2U9InRleHRDaGVja0N1c3RvbUVycm9yTm90aWNlIix0LlVwcGVyTGltaXRFcnJvck5vdGljZT0iVXBwZXJMaW1pdEVycm9yTm90aWNlIix0Lkxvd2VyTGltaXRFcnJvck5vdGljZT0iTG93ZXJMaW1pdEVycm9yTm90aWNlIix0Lk1pbkFyZWFMaW1pdEVycm9yTm90aWNlPSJNaW5BcmVhTGltaXRFcnJvck5vdGljZSIsdC5NaW5MZW5ndGhMaW1pdEVycm9yTm90aWNlPSJNaW5MZW5ndGhMaW1pdEVycm9yTm90aWNlIix0LkludmFsaWRJbWFnZT0iSW52YWxpZEltYWdlIix0LkRpc2FibGVEZWxldGU9IkRpc2FibGVEZWxldGUiLHQuQ2xlYXJQYXJ0aWFsRGF0YT0iQ2xlYXJQYXJ0aWFsRGF0YSIsdC5NYXJrZXJGaW5pc2g9Ik1hcmtlckZpbmlzaCIsdC5Mb3dlckxpbWl0UG9pbnQ9Ikxvd2VyTGltaXRQb2ludCIsdC5Ob1JvdGF0ZUluRGVwZW5kZW5jZT0ibm9Sb3RhdGVJbkRlcGVuZGVuY2UiLHQuVW5hYmxlVG9SZWFubm90YXRpb249InVuYWJsZVRvUmVhbm5vdGF0aW9uIix0LkZvcmJpZGRlbkNyZWF0aW9uT3V0c2lkZUJvdW5kYXJ5PSJGb3JiaWRkZW5DcmVhdGlvbk91dHNpZGVCb3VuZGFyeSIsdC5TdWNjZXNzZnVsRWRnZUFkc29ycHRpb249IlN1Y2Nlc3NmdWxFZGdlQWRzb3JwdGlvbiIsdC5Gb3JiaWRBZGROZXdQb2ludD0iRm9yYmlkQWRkTmV3UG9pbnQifShMbHx8KExsPXt9KSksTGwuTm9Sb3RhdGVOb3RpY2UsTGwuUmVjdEVycm9yU2l6ZU5vdGljZSxMbC5UZXh0Q2hlY2tOdW1iZXJFcnJvck5vdGljZSxMbC5UZXh0Q2hlY2tFbmdsaXNoRXJyb3JOb3RpY2UsTGwuVGV4dENoZWNrQ3VzdG9tRXJyb3JOb3RpY2UsTGwuVXBwZXJMaW1pdEVycm9yTm90aWNlLExsLkxvd2VyTGltaXRFcnJvck5vdGljZSxMbC5NaW5BcmVhTGltaXRFcnJvck5vdGljZSxMbC5NaW5MZW5ndGhMaW1pdEVycm9yTm90aWNlLExsLkludmFsaWRJbWFnZSxMbC5EaXNhYmxlRGVsZXRlLExsLkNsZWFyUGFydGlhbERhdGEsTGwuTWFya2VyRmluaXNoLExsLkxvd2VyTGltaXRQb2ludCxMbC5Ob1JvdGF0ZUluRGVwZW5kZW5jZSxMbC5VbmFibGVUb1JlYW5ub3RhdGlvbixMbC5Gb3JiaWRkZW5DcmVhdGlvbk91dHNpZGVCb3VuZGFyeSxMbC5TdWNjZXNzZnVsRWRnZUFkc29ycHRpb24sTGwuRm9yYmlkQWRkTmV3UG9pbnQsTGwuTm9Sb3RhdGVOb3RpY2UsTGwuUmVjdEVycm9yU2l6ZU5vdGljZSxMbC5UZXh0Q2hlY2tOdW1iZXJFcnJvck5vdGljZSxMbC5UZXh0Q2hlY2tFbmdsaXNoRXJyb3JOb3RpY2UsTGwuVGV4dENoZWNrQ3VzdG9tRXJyb3JOb3RpY2UsTGwuVXBwZXJMaW1pdEVycm9yTm90aWNlLExsLkxvd2VyTGltaXRFcnJvck5vdGljZSxMbC5NaW5BcmVhTGltaXRFcnJvck5vdGljZSxMbC5NaW5MZW5ndGhMaW1pdEVycm9yTm90aWNlLExsLkludmFsaWRJbWFnZSxMbC5EaXNhYmxlRGVsZXRlLExsLkNsZWFyUGFydGlhbERhdGEsTGwuTWFya2VyRmluaXNoLExsLkxvd2VyTGltaXRQb2ludCxMbC5Ob1JvdGF0ZUluRGVwZW5kZW5jZSxMbC5VbmFibGVUb1JlYW5ub3RhdGlvbixMbC5Gb3JiaWRkZW5DcmVhdGlvbk91dHNpZGVCb3VuZGFyeSxMbC5TdWNjZXNzZnVsRWRnZUFkc29ycHRpb24sTGwuRm9yYmlkQWRkTmV3UG9pbnQsaWwubGMsaWwucmMsaWwuY2xjLGlsLmNyYyxbMSw1LDEwLDIwLDMwLDUwLDgwLDEwMF0uY29uY2F0KEFycmF5LmZyb20oe2xlbmd0aDo5fSkubWFwKCgodCxlKT0+MTAwKihlKzIpKSkpLEVsLlpoLEVsLlVTLGZ1bmN0aW9uKHQpe3RbdC5DcmVhdGU9MF09IkNyZWF0ZSIsdFt0LkFjdGl2ZT0xXT0iQWN0aXZlIix0W3QuTm9uZT0yXT0iTm9uZSJ9KFBsfHwoUGw9e30pKTtjb25zdCBqbD0xMDAxLFVsPSJzcmdiIixxbD0ic3JnYi1saW5lYXIiLFZsPSJkaXNwbGF5LXAzIixHbD0iZGlzcGxheS1wMy1saW5lYXIiLFlsPSJsaW5lYXIiLFhsPSJzcmdiIixXbD0icmVjNzA5IixIbD0yZTM7Y2xhc3MgWmx7YWRkRXZlbnRMaXN0ZW5lcih0LGUpe3ZvaWQgMD09PXRoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycz17fSk7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7dm9pZCAwPT09blt0XSYmKG5bdF09W10pLC0xPT09blt0XS5pbmRleE9mKGUpJiZuW3RdLnB1c2goZSl9aGFzRXZlbnRMaXN0ZW5lcih0LGUpe2lmKHZvaWQgMD09PXRoaXMuX2xpc3RlbmVycylyZXR1cm4hMTtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztyZXR1cm4gdm9pZCAwIT09blt0XSYmLTEhPT1uW3RdLmluZGV4T2YoZSl9cmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUpe2lmKHZvaWQgMD09PXRoaXMuX2xpc3RlbmVycylyZXR1cm47Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnNbdF07aWYodm9pZCAwIT09bil7Y29uc3QgdD1uLmluZGV4T2YoZSk7LTEhPT10JiZuLnNwbGljZSh0LDEpfX1kaXNwYXRjaEV2ZW50KHQpe2lmKHZvaWQgMD09PXRoaXMuX2xpc3RlbmVycylyZXR1cm47Y29uc3QgZT10aGlzLl9saXN0ZW5lcnNbdC50eXBlXTtpZih2b2lkIDAhPT1lKXt0LnRhcmdldD10aGlzO2NvbnN0IG49ZS5zbGljZSgwKTtmb3IobGV0IGU9MCxyPW4ubGVuZ3RoO2U8cjtlKyspbltlXS5jYWxsKHRoaXMsdCk7dC50YXJnZXQ9bnVsbH19fWNvbnN0IEtsPVsiMDAiLCIwMSIsIjAyIiwiMDMiLCIwNCIsIjA1IiwiMDYiLCIwNyIsIjA4IiwiMDkiLCIwYSIsIjBiIiwiMGMiLCIwZCIsIjBlIiwiMGYiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiLCIxOSIsIjFhIiwiMWIiLCIxYyIsIjFkIiwiMWUiLCIxZiIsIjIwIiwiMjEiLCIyMiIsIjIzIiwiMjQiLCIyNSIsIjI2IiwiMjciLCIyOCIsIjI5IiwiMmEiLCIyYiIsIjJjIiwiMmQiLCIyZSIsIjJmIiwiMzAiLCIzMSIsIjMyIiwiMzMiLCIzNCIsIjM1IiwiMzYiLCIzNyIsIjM4IiwiMzkiLCIzYSIsIjNiIiwiM2MiLCIzZCIsIjNlIiwiM2YiLCI0MCIsIjQxIiwiNDIiLCI0MyIsIjQ0IiwiNDUiLCI0NiIsIjQ3IiwiNDgiLCI0OSIsIjRhIiwiNGIiLCI0YyIsIjRkIiwiNGUiLCI0ZiIsIjUwIiwiNTEiLCI1MiIsIjUzIiwiNTQiLCI1NSIsIjU2IiwiNTciLCI1OCIsIjU5IiwiNWEiLCI1YiIsIjVjIiwiNWQiLCI1ZSIsIjVmIiwiNjAiLCI2MSIsIjYyIiwiNjMiLCI2NCIsIjY1IiwiNjYiLCI2NyIsIjY4IiwiNjkiLCI2YSIsIjZiIiwiNmMiLCI2ZCIsIjZlIiwiNmYiLCI3MCIsIjcxIiwiNzIiLCI3MyIsIjc0IiwiNzUiLCI3NiIsIjc3IiwiNzgiLCI3OSIsIjdhIiwiN2IiLCI3YyIsIjdkIiwiN2UiLCI3ZiIsIjgwIiwiODEiLCI4MiIsIjgzIiwiODQiLCI4NSIsIjg2IiwiODciLCI4OCIsIjg5IiwiOGEiLCI4YiIsIjhjIiwiOGQiLCI4ZSIsIjhmIiwiOTAiLCI5MSIsIjkyIiwiOTMiLCI5NCIsIjk1IiwiOTYiLCI5NyIsIjk4IiwiOTkiLCI5YSIsIjliIiwiOWMiLCI5ZCIsIjllIiwiOWYiLCJhMCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJhNiIsImE3IiwiYTgiLCJhOSIsImFhIiwiYWIiLCJhYyIsImFkIiwiYWUiLCJhZiIsImIwIiwiYjEiLCJiMiIsImIzIiwiYjQiLCJiNSIsImI2IiwiYjciLCJiOCIsImI5IiwiYmEiLCJiYiIsImJjIiwiYmQiLCJiZSIsImJmIiwiYzAiLCJjMSIsImMyIiwiYzMiLCJjNCIsImM1IiwiYzYiLCJjNyIsImM4IiwiYzkiLCJjYSIsImNiIiwiY2MiLCJjZCIsImNlIiwiY2YiLCJkMCIsImQxIiwiZDIiLCJkMyIsImQ0IiwiZDUiLCJkNiIsImQ3IiwiZDgiLCJkOSIsImRhIiwiZGIiLCJkYyIsImRkIiwiZGUiLCJkZiIsImUwIiwiZTEiLCJlMiIsImUzIiwiZTQiLCJlNSIsImU2IiwiZTciLCJlOCIsImU5IiwiZWEiLCJlYiIsImVjIiwiZWQiLCJlZSIsImVmIiwiZjAiLCJmMSIsImYyIiwiZjMiLCJmNCIsImY1IiwiZjYiLCJmNyIsImY4IiwiZjkiLCJmYSIsImZiIiwiZmMiLCJmZCIsImZlIiwiZmYiXTtmdW5jdGlvbiBKbCgpe2NvbnN0IHQ9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsZT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxuPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLHI9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDA7cmV0dXJuKEtsWzI1NSZ0XStLbFt0Pj44JjI1NV0rS2xbdD4+MTYmMjU1XStLbFt0Pj4yNCYyNTVdKyItIitLbFsyNTUmZV0rS2xbZT4+OCYyNTVdKyItIitLbFtlPj4xNiYxNXw2NF0rS2xbZT4+MjQmMjU1XSsiLSIrS2xbNjMmbnwxMjhdK0tsW24+PjgmMjU1XSsiLSIrS2xbbj4+MTYmMjU1XStLbFtuPj4yNCYyNTVdK0tsWzI1NSZyXStLbFtyPj44JjI1NV0rS2xbcj4+MTYmMjU1XStLbFtyPj4yNCYyNTVdKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIFFsKHQsZSxuKXtyZXR1cm4gTWF0aC5tYXgoZSxNYXRoLm1pbihuLHQpKX1mdW5jdGlvbiAkbCh0LGUsbil7cmV0dXJuKDEtbikqdCtuKmV9Y2xhc3MgdGh7Y29uc3RydWN0b3IodD0wLGU9MCl7dGgucHJvdG90eXBlLmlzVmVjdG9yMj0hMCx0aGlzLng9dCx0aGlzLnk9ZX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy54fXNldCB3aWR0aCh0KXt0aGlzLng9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMueX1zZXQgaGVpZ2h0KHQpe3RoaXMueT10fXNldCh0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHI9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PXJbMF0qZStyWzNdKm4rcls2XSx0aGlzLnk9clsxXSplK3JbNF0qbityWzddLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQueCxNYXRoLm1pbihlLngsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQueSxNYXRoLm1pbihlLnksdGhpcy55KSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy55KSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgodCxNYXRoLm1pbihlLG4pKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0Lnl9Y3Jvc3ModCl7cmV0dXJuIHRoaXMueCp0LnktdGhpcy55KnQueH1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfWFuZ2xlKCl7cmV0dXJuIE1hdGguYXRhbjIoLXRoaXMueSwtdGhpcy54KStNYXRoLlBJfWFuZ2xlVG8odCl7Y29uc3QgZT1NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKnQubGVuZ3RoU3EoKSk7aWYoMD09PWUpcmV0dXJuIE1hdGguUEkvMjtjb25zdCBuPXRoaXMuZG90KHQpL2U7cmV0dXJuIE1hdGguYWNvcyhRbChuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueTtyZXR1cm4gZSplK24qbn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnl9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpc31yb3RhdGVBcm91bmQodCxlKXtjb25zdCBuPU1hdGguY29zKGUpLHI9TWF0aC5zaW4oZSksaT10aGlzLngtdC54LG89dGhpcy55LXQueTtyZXR1cm4gdGhpcy54PWkqbi1vKnIrdC54LHRoaXMueT1pKnIrbypuK3QueSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnl9fWNsYXNzIGVoe2NvbnN0cnVjdG9yKHQsZSxuLHIsaSxvLHMsYSx1KXtlaC5wcm90b3R5cGUuaXNNYXRyaXgzPSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXSx2b2lkIDAhPT10JiZ0aGlzLnNldCh0LGUsbixyLGksbyxzLGEsdSl9c2V0KHQsZSxuLHIsaSxvLHMsYSx1KXtjb25zdCBjPXRoaXMuZWxlbWVudHM7cmV0dXJuIGNbMF09dCxjWzFdPXIsY1syXT1zLGNbM109ZSxjWzRdPWksY1s1XT1hLGNbNl09bixjWzddPW8sY1s4XT11LHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDIpLHRoaXN9c2V0RnJvbU1hdHJpeDQodCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbNF0sZVs4XSxlWzFdLGVbNV0sZVs5XSxlWzJdLGVbNl0sZVsxMF0pLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgbj10LmVsZW1lbnRzLHI9ZS5lbGVtZW50cyxpPXRoaXMuZWxlbWVudHMsbz1uWzBdLHM9blszXSxhPW5bNl0sdT1uWzFdLGM9bls0XSxsPW5bN10saD1uWzJdLGY9bls1XSxwPW5bOF0sZD1yWzBdLGc9clszXSx5PXJbNl0sbT1yWzFdLHY9cls0XSxfPXJbN10seD1yWzJdLHc9cls1XSxiPXJbOF07cmV0dXJuIGlbMF09bypkK3MqbSthKngsaVszXT1vKmcrcyp2K2EqdyxpWzZdPW8qeStzKl8rYSpiLGlbMV09dSpkK2MqbStsKngsaVs0XT11KmcrYyp2K2wqdyxpWzddPXUqeStjKl8rbCpiLGlbMl09aCpkK2YqbStwKngsaVs1XT1oKmcrZip2K3AqdyxpWzhdPWgqeStmKl8rcCpiLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbM10qPXQsZVs2XSo9dCxlWzFdKj10LGVbNF0qPXQsZVs3XSo9dCxlWzJdKj10LGVbNV0qPXQsZVs4XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0scj10WzJdLGk9dFszXSxvPXRbNF0scz10WzVdLGE9dFs2XSx1PXRbN10sYz10WzhdO3JldHVybiBlKm8qYy1lKnMqdS1uKmkqYytuKnMqYStyKmkqdS1yKm8qYX1pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxyPXRbMl0saT10WzNdLG89dFs0XSxzPXRbNV0sYT10WzZdLHU9dFs3XSxjPXRbOF0sbD1jKm8tcyp1LGg9cyphLWMqaSxmPXUqaS1vKmEscD1lKmwrbipoK3IqZjtpZigwPT09cClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IGQ9MS9wO3JldHVybiB0WzBdPWwqZCx0WzFdPShyKnUtYypuKSpkLHRbMl09KHMqbi1yKm8pKmQsdFszXT1oKmQsdFs0XT0oYyplLXIqYSkqZCx0WzVdPShyKmktcyplKSpkLHRbNl09ZipkLHRbN109KG4qYS11KmUpKmQsdFs4XT0obyplLW4qaSkqZCx0aGlzfXRyYW5zcG9zZSgpe2xldCB0O2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdD1lWzFdLGVbMV09ZVszXSxlWzNdPXQsdD1lWzJdLGVbMl09ZVs2XSxlWzZdPXQsdD1lWzVdLGVbNV09ZVs3XSxlWzddPXQsdGhpc31nZXROb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQodCkuaW52ZXJ0KCkudHJhbnNwb3NlKCl9dHJhbnNwb3NlSW50b0FycmF5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVszXSx0WzJdPWVbNl0sdFszXT1lWzFdLHRbNF09ZVs0XSx0WzVdPWVbN10sdFs2XT1lWzJdLHRbN109ZVs1XSx0WzhdPWVbOF0sdGhpc31zZXRVdlRyYW5zZm9ybSh0LGUsbixyLGksbyxzKXtjb25zdCBhPU1hdGguY29zKGkpLHU9TWF0aC5zaW4oaSk7cmV0dXJuIHRoaXMuc2V0KG4qYSxuKnUsLW4qKGEqbyt1KnMpK28rdCwtcip1LHIqYSwtciooLXUqbythKnMpK3MrZSwwLDAsMSksdGhpc31zY2FsZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KG5oLm1ha2VTY2FsZSh0LGUpKSx0aGlzfXJvdGF0ZSh0KXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShuaC5tYWtlUm90YXRpb24oLXQpKSx0aGlzfXRyYW5zbGF0ZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KG5oLm1ha2VUcmFuc2xhdGlvbih0LGUpKSx0aGlzfW1ha2VUcmFuc2xhdGlvbih0LGUpe3JldHVybiB0LmlzVmVjdG9yMj90aGlzLnNldCgxLDAsdC54LDAsMSx0LnksMCwwLDEpOnRoaXMuc2V0KDEsMCx0LDAsMSxlLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbih0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLW4sMCxuLGUsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCxlLDAsMCwwLDEpLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCB0PTA7dDw5O3QrKylpZihlW3RdIT09blt0XSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdH1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfX1jb25zdCBuaD1uZXcgZWg7ZnVuY3Rpb24gcmgodCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsdCl9Y29uc3QgaWg9KG5ldyBlaCkuc2V0KC44MjI0NjIxLC4xNzc1MzgsMCwuMDMzMTk0MSwuOTY2ODA1OCwwLC4wMTcwODI3LC4wNzIzOTc0LC45MTA1MTk5KSxvaD0obmV3IGVoKS5zZXQoMS4yMjQ5NDAxLC0uMjI0OTQwNCwwLC0uMDQyMDU2OSwxLjA0MjA1NzEsMCwtLjAxOTYzNzYsLS4wNzg2MzYxLDEuMDk4MjczNSksc2g9e1txbF06e3RyYW5zZmVyOllsLHByaW1hcmllczpXbCxsdW1pbmFuY2VDb2VmZmljaWVudHM6Wy4yMTI2LC43MTUyLC4wNzIyXSx0b1JlZmVyZW5jZTp0PT50LGZyb21SZWZlcmVuY2U6dD0+dH0sW1VsXTp7dHJhbnNmZXI6WGwscHJpbWFyaWVzOldsLGx1bWluYW5jZUNvZWZmaWNpZW50czpbLjIxMjYsLjcxNTIsLjA3MjJdLHRvUmVmZXJlbmNlOnQ9PnQuY29udmVydFNSR0JUb0xpbmVhcigpLGZyb21SZWZlcmVuY2U6dD0+dC5jb252ZXJ0TGluZWFyVG9TUkdCKCl9LFtHbF06e3RyYW5zZmVyOllsLHByaW1hcmllczoicDMiLGx1bWluYW5jZUNvZWZmaWNpZW50czpbLjIyODksLjY5MTcsLjA3OTNdLHRvUmVmZXJlbmNlOnQ9PnQuYXBwbHlNYXRyaXgzKG9oKSxmcm9tUmVmZXJlbmNlOnQ9PnQuYXBwbHlNYXRyaXgzKGloKX0sW1ZsXTp7dHJhbnNmZXI6WGwscHJpbWFyaWVzOiJwMyIsbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjI4OSwuNjkxNywuMDc5M10sdG9SZWZlcmVuY2U6dD0+dC5jb252ZXJ0U1JHQlRvTGluZWFyKCkuYXBwbHlNYXRyaXgzKG9oKSxmcm9tUmVmZXJlbmNlOnQ9PnQuYXBwbHlNYXRyaXgzKGloKS5jb252ZXJ0TGluZWFyVG9TUkdCKCl9fSxhaD1uZXcgU2V0KFtxbCxHbF0pLHVoPXtlbmFibGVkOiEwLF93b3JraW5nQ29sb3JTcGFjZTpxbCxnZXQgd29ya2luZ0NvbG9yU3BhY2UoKXtyZXR1cm4gdGhpcy5fd29ya2luZ0NvbG9yU3BhY2V9LHNldCB3b3JraW5nQ29sb3JTcGFjZSh0KXtpZighYWguaGFzKHQpKXRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgd29ya2luZyBjb2xvciBzcGFjZSwgIiR7dH0iLmApO3RoaXMuX3dvcmtpbmdDb2xvclNwYWNlPXR9LGNvbnZlcnQ6ZnVuY3Rpb24odCxlLG4pe2lmKCExPT09dGhpcy5lbmFibGVkfHxlPT09bnx8IWV8fCFuKXJldHVybiB0O2NvbnN0IHI9c2hbZV0udG9SZWZlcmVuY2U7cmV0dXJuIHNoW25dLmZyb21SZWZlcmVuY2Uocih0KSl9LGZyb21Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvbnZlcnQodCx0aGlzLl93b3JraW5nQ29sb3JTcGFjZSxlKX0sdG9Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvbnZlcnQodCxlLHRoaXMuX3dvcmtpbmdDb2xvclNwYWNlKX0sZ2V0UHJpbWFyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBzaFt0XS5wcmltYXJpZXN9LGdldFRyYW5zZmVyOmZ1bmN0aW9uKHQpe3JldHVybiIiPT09dD9ZbDpzaFt0XS50cmFuc2Zlcn0sZ2V0THVtaW5hbmNlQ29lZmZpY2llbnRzOmZ1bmN0aW9uKHQsZT10aGlzLl93b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHQuZnJvbUFycmF5KHNoW2VdLmx1bWluYW5jZUNvZWZmaWNpZW50cyl9fTtmdW5jdGlvbiBjaCh0KXtyZXR1cm4gdDwuMDQwNDU/LjA3NzM5OTM4MDgqdDpNYXRoLnBvdyguOTQ3ODY3Mjk4Nip0Ky4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gbGgodCl7cmV0dXJuIHQ8LjAwMzEzMDg/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LC40MTY2NiktLjA1NX1sZXQgaGg7Y2xhc3MgZmh7c3RhdGljIGdldERhdGFVUkwodCl7aWYoL15kYXRhOi9pLnRlc3QodC5zcmMpfHwidW5kZWZpbmVkIj09dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50KXJldHVybiB0LnNyYztsZXQgZTtpZih0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpZT10O2Vsc2V7dm9pZCAwPT09aGgmJihoaD1yaCgiY2FudmFzIikpLGhoLndpZHRoPXQud2lkdGgsaGguaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49aGguZ2V0Q29udGV4dCgiMmQiKTt0IGluc3RhbmNlb2YgSW1hZ2VEYXRhP24ucHV0SW1hZ2VEYXRhKHQsMCwwKTpuLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxlPWhofXJldHVybiBlLndpZHRoPjIwNDh8fGUuaGVpZ2h0PjIwNDg/ZS50b0RhdGFVUkwoImltYWdlL2pwZWciLC42KTplLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9c3RhdGljIHNSR0JUb0xpbmVhcih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSW1hZ2VCaXRtYXAmJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgZT1yaCgiY2FudmFzIik7ZS53aWR0aD10LndpZHRoLGUuaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ZS5nZXRDb250ZXh0KCIyZCIpO24uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpO2NvbnN0IHI9bi5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLGk9ci5kYXRhO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKWlbdF09MjU1KmNoKGlbdF0vMjU1KTtyZXR1cm4gbi5wdXRJbWFnZURhdGEociwwLDApLGV9aWYodC5kYXRhKXtjb25zdCBlPXQuZGF0YS5zbGljZSgwKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyllIGluc3RhbmNlb2YgVWludDhBcnJheXx8ZSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5P2VbdF09TWF0aC5mbG9vcigyNTUqY2goZVt0XS8yNTUpKTplW3RdPWNoKGVbdF0pO3JldHVybntkYXRhOmUsd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHR9fXJldHVybiB0fX1sZXQgcGg9MDtjbGFzcyBkaHtjb25zdHJ1Y3Rvcih0PW51bGwpe3RoaXMuaXNTb3VyY2U9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6cGgrK30pLHRoaXMudXVpZD1KbCgpLHRoaXMuZGF0YT10LHRoaXMuZGF0YVJlYWR5PSEwLHRoaXMudmVyc2lvbj0wfXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdDtpZighZSYmdm9pZCAwIT09dC5pbWFnZXNbdGhpcy51dWlkXSlyZXR1cm4gdC5pbWFnZXNbdGhpcy51dWlkXTtjb25zdCBuPXt1dWlkOnRoaXMudXVpZCx1cmw6IiJ9LHI9dGhpcy5kYXRhO2lmKG51bGwhPT1yKXtsZXQgdDtpZihBcnJheS5pc0FycmF5KHIpKXt0PVtdO2ZvcihsZXQgZT0wLG49ci5sZW5ndGg7ZTxuO2UrKylyW2VdLmlzRGF0YVRleHR1cmU/dC5wdXNoKGdoKHJbZV0uaW1hZ2UpKTp0LnB1c2goZ2gocltlXSkpfWVsc2UgdD1naChyKTtuLnVybD10fXJldHVybiBlfHwodC5pbWFnZXNbdGhpcy51dWlkXT1uKSxufX1mdW5jdGlvbiBnaCh0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSW1hZ2VCaXRtYXAmJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcD9maC5nZXREYXRhVVJMKHQpOnQuZGF0YT97ZGF0YTpBcnJheS5mcm9tKHQuZGF0YSksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHQsdHlwZTp0LmRhdGEuY29uc3RydWN0b3IubmFtZX06e319bGV0IHloPTA7Y2xhc3MgbWggZXh0ZW5kcyBabHtjb25zdHJ1Y3Rvcih0PW1oLkRFRkFVTFRfSU1BR0UsZT1taC5ERUZBVUxUX01BUFBJTkcsbj1qbCxyPWpsLGk9MTAwNixvPTEwMDgscz0xMDIzLGE9MTAwOSx1PW1oLkRFRkFVTFRfQU5JU09UUk9QWSxjPSIiKXtzdXBlcigpLHRoaXMuaXNUZXh0dXJlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOnloKyt9KSx0aGlzLnV1aWQ9SmwoKSx0aGlzLm5hbWU9IiIsdGhpcy5zb3VyY2U9bmV3IGRoKHQpLHRoaXMubWlwbWFwcz1bXSx0aGlzLm1hcHBpbmc9ZSx0aGlzLmNoYW5uZWw9MCx0aGlzLndyYXBTPW4sdGhpcy53cmFwVD1yLHRoaXMubWFnRmlsdGVyPWksdGhpcy5taW5GaWx0ZXI9byx0aGlzLmFuaXNvdHJvcHk9dSx0aGlzLmZvcm1hdD1zLHRoaXMuaW50ZXJuYWxGb3JtYXQ9bnVsbCx0aGlzLnR5cGU9YSx0aGlzLm9mZnNldD1uZXcgdGgoMCwwKSx0aGlzLnJlcGVhdD1uZXcgdGgoMSwxKSx0aGlzLmNlbnRlcj1uZXcgdGgoMCwwKSx0aGlzLnJvdGF0aW9uPTAsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSEwLHRoaXMubWF0cml4PW5ldyBlaCx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMCx0aGlzLnByZW11bHRpcGx5QWxwaGE9ITEsdGhpcy5mbGlwWT0hMCx0aGlzLnVucGFja0FsaWdubWVudD00LHRoaXMuY29sb3JTcGFjZT1jLHRoaXMudXNlckRhdGE9e30sdGhpcy52ZXJzaW9uPTAsdGhpcy5vblVwZGF0ZT1udWxsLHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSExLHRoaXMucG1yZW1WZXJzaW9uPTB9Z2V0IGltYWdlKCl7cmV0dXJuIHRoaXMuc291cmNlLmRhdGF9c2V0IGltYWdlKHQ9bnVsbCl7dGhpcy5zb3VyY2UuZGF0YT10fXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueSx0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnksdGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnkpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5zb3VyY2U9dC5zb3VyY2UsdGhpcy5taXBtYXBzPXQubWlwbWFwcy5zbGljZSgwKSx0aGlzLm1hcHBpbmc9dC5tYXBwaW5nLHRoaXMuY2hhbm5lbD10LmNoYW5uZWwsdGhpcy53cmFwUz10LndyYXBTLHRoaXMud3JhcFQ9dC53cmFwVCx0aGlzLm1hZ0ZpbHRlcj10Lm1hZ0ZpbHRlcix0aGlzLm1pbkZpbHRlcj10Lm1pbkZpbHRlcix0aGlzLmFuaXNvdHJvcHk9dC5hbmlzb3Ryb3B5LHRoaXMuZm9ybWF0PXQuZm9ybWF0LHRoaXMuaW50ZXJuYWxGb3JtYXQ9dC5pbnRlcm5hbEZvcm1hdCx0aGlzLnR5cGU9dC50eXBlLHRoaXMub2Zmc2V0LmNvcHkodC5vZmZzZXQpLHRoaXMucmVwZWF0LmNvcHkodC5yZXBlYXQpLHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucm90YXRpb249dC5yb3RhdGlvbix0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPXQuZ2VuZXJhdGVNaXBtYXBzLHRoaXMucHJlbXVsdGlwbHlBbHBoYT10LnByZW11bHRpcGx5QWxwaGEsdGhpcy5mbGlwWT10LmZsaXBZLHRoaXMudW5wYWNrQWxpZ25tZW50PXQudW5wYWNrQWxpZ25tZW50LHRoaXMuY29sb3JTcGFjZT10LmNvbG9yU3BhY2UsdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSx0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0O2lmKCFlJiZ2b2lkIDAhPT10LnRleHR1cmVzW3RoaXMudXVpZF0pcmV0dXJuIHQudGV4dHVyZXNbdGhpcy51dWlkXTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiVGV4dHVyZSIsZ2VuZXJhdG9yOiJUZXh0dXJlLnRvSlNPTiJ9LHV1aWQ6dGhpcy51dWlkLG5hbWU6dGhpcy5uYW1lLGltYWdlOnRoaXMuc291cmNlLnRvSlNPTih0KS51dWlkLG1hcHBpbmc6dGhpcy5tYXBwaW5nLGNoYW5uZWw6dGhpcy5jaGFubmVsLHJlcGVhdDpbdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55XSxvZmZzZXQ6W3RoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueV0sY2VudGVyOlt0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnldLHJvdGF0aW9uOnRoaXMucm90YXRpb24sd3JhcDpbdGhpcy53cmFwUyx0aGlzLndyYXBUXSxmb3JtYXQ6dGhpcy5mb3JtYXQsaW50ZXJuYWxGb3JtYXQ6dGhpcy5pbnRlcm5hbEZvcm1hdCx0eXBlOnRoaXMudHlwZSxjb2xvclNwYWNlOnRoaXMuY29sb3JTcGFjZSxtaW5GaWx0ZXI6dGhpcy5taW5GaWx0ZXIsbWFnRmlsdGVyOnRoaXMubWFnRmlsdGVyLGFuaXNvdHJvcHk6dGhpcy5hbmlzb3Ryb3B5LGZsaXBZOnRoaXMuZmxpcFksZ2VuZXJhdGVNaXBtYXBzOnRoaXMuZ2VuZXJhdGVNaXBtYXBzLHByZW11bHRpcGx5QWxwaGE6dGhpcy5wcmVtdWx0aXBseUFscGhhLHVucGFja0FsaWdubWVudDp0aGlzLnVucGFja0FsaWdubWVudH07cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYobi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxlfHwodC50ZXh0dXJlc1t0aGlzLnV1aWRdPW4pLG59ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX10cmFuc2Zvcm1Vdih0KXtpZigzMDAhPT10aGlzLm1hcHBpbmcpcmV0dXJuIHQ7aWYodC5hcHBseU1hdHJpeDModGhpcy5tYXRyaXgpLHQueDwwfHx0Lng+MSlzd2l0Y2godGhpcy53cmFwUyl7Y2FzZSAxZTM6dC54PXQueC1NYXRoLmZsb29yKHQueCk7YnJlYWs7Y2FzZSBqbDp0Lng9dC54PDA/MDoxO2JyZWFrO2Nhc2UgMTAwMjoxPT09TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpP3QueD1NYXRoLmNlaWwodC54KS10Lng6dC54PXQueC1NYXRoLmZsb29yKHQueCl9aWYodC55PDB8fHQueT4xKXN3aXRjaCh0aGlzLndyYXBUKXtjYXNlIDFlMzp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVhaztjYXNlIGpsOnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSAxMDAyOjE9PT1NYXRoLmFicyhNYXRoLmZsb29yKHQueSklMik/dC55PU1hdGguY2VpbCh0LnkpLXQueTp0Lnk9dC55LU1hdGguZmxvb3IodC55KX1yZXR1cm4gdGhpcy5mbGlwWSYmKHQueT0xLXQueSksdH1zZXQgbmVlZHNVcGRhdGUodCl7ITA9PT10JiYodGhpcy52ZXJzaW9uKyssdGhpcy5zb3VyY2UubmVlZHNVcGRhdGU9ITApfXNldCBuZWVkc1BNUkVNVXBkYXRlKHQpeyEwPT09dCYmdGhpcy5wbXJlbVZlcnNpb24rK319bWguREVGQVVMVF9JTUFHRT1udWxsLG1oLkRFRkFVTFRfTUFQUElORz0zMDAsbWguREVGQVVMVF9BTklTT1RST1BZPTE7Y2xhc3Mgdmh7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscj0xKXt2aC5wcm90b3R5cGUuaXNWZWN0b3I0PSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1yfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxuLHIpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9cix0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXZvaWQgMCE9PXQudz90Lnc6MSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcy53Kz10LncsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXMudy09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpcy53PXQudy1lLncsdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcy53Kj10LncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpcy53Kj10LHRoaXN9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHI9dGhpcy56LGk9dGhpcy53LG89dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW9bMF0qZStvWzRdKm4rb1s4XSpyK29bMTJdKmksdGhpcy55PW9bMV0qZStvWzVdKm4rb1s5XSpyK29bMTNdKmksdGhpcy56PW9bMl0qZStvWzZdKm4rb1sxMF0qcitvWzE0XSppLHRoaXMudz1vWzNdKmUrb1s3XSpuK29bMTFdKnIrb1sxNV0qaSx0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfXNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKHQpe3RoaXMudz0yKk1hdGguYWNvcyh0LncpO2NvbnN0IGU9TWF0aC5zcXJ0KDEtdC53KnQudyk7cmV0dXJuIGU8MWUtND8odGhpcy54PTEsdGhpcy55PTAsdGhpcy56PTApOih0aGlzLng9dC54L2UsdGhpcy55PXQueS9lLHRoaXMuej10LnovZSksdGhpc31zZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXgodCl7bGV0IGUsbixyLGk7Y29uc3Qgbz0uMDEscz0uMSxhPXQuZWxlbWVudHMsdT1hWzBdLGM9YVs0XSxsPWFbOF0saD1hWzFdLGY9YVs1XSxwPWFbOV0sZD1hWzJdLGc9YVs2XSx5PWFbMTBdO2lmKE1hdGguYWJzKGMtaCk8byYmTWF0aC5hYnMobC1kKTxvJiZNYXRoLmFicyhwLWcpPG8pe2lmKE1hdGguYWJzKGMraCk8cyYmTWF0aC5hYnMobCtkKTxzJiZNYXRoLmFicyhwK2cpPHMmJk1hdGguYWJzKHUrZit5LTMpPHMpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7ZT1NYXRoLlBJO2NvbnN0IHQ9KHUrMSkvMixhPShmKzEpLzIsbT0oeSsxKS8yLHY9KGMraCkvNCxfPShsK2QpLzQseD0ocCtnKS80O3JldHVybiB0PmEmJnQ+bT90PG8/KG49MCxyPS43MDcxMDY3ODEsaT0uNzA3MTA2NzgxKToobj1NYXRoLnNxcnQodCkscj12L24saT1fL24pOmE+bT9hPG8/KG49LjcwNzEwNjc4MSxyPTAsaT0uNzA3MTA2NzgxKToocj1NYXRoLnNxcnQoYSksbj12L3IsaT14L3IpOm08bz8obj0uNzA3MTA2NzgxLHI9LjcwNzEwNjc4MSxpPTApOihpPU1hdGguc3FydChtKSxuPV8vaSxyPXgvaSksdGhpcy5zZXQobixyLGksZSksdGhpc31sZXQgbT1NYXRoLnNxcnQoKGctcCkqKGctcCkrKGwtZCkqKGwtZCkrKGgtYykqKGgtYykpO3JldHVybiBNYXRoLmFicyhtKTwuMDAxJiYobT0xKSx0aGlzLng9KGctcCkvbSx0aGlzLnk9KGwtZCkvbSx0aGlzLno9KGgtYykvbSx0aGlzLnc9TWF0aC5hY29zKCh1K2YreS0xKS8yKSx0aGlzfXNldEZyb21NYXRyaXhQb3NpdGlvbih0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1lWzEyXSx0aGlzLnk9ZVsxM10sdGhpcy56PWVbMTRdLHRoaXMudz1lWzE1XSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpcy53PU1hdGgubWluKHRoaXMudyx0LncpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5tYXgodGhpcy53LHQudyksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodC56LE1hdGgubWluKGUueix0aGlzLnopKSx0aGlzLnc9TWF0aC5tYXgodC53LE1hdGgubWluKGUudyx0aGlzLncpKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueikpLHRoaXMudz1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy53KSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgodCxNYXRoLm1pbihlLG4pKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpcy53PU1hdGguZmxvb3IodGhpcy53KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpcy53PU1hdGguY2VpbCh0aGlzLncpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpcy53PU1hdGgucm91bmQodGhpcy53KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXMudz1NYXRoLnRydW5jKHRoaXMudyksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpcy53PS10aGlzLncsdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56K3RoaXMudyp0Lnd9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLncpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzLncrPSh0LnctdGhpcy53KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzLnc9dC53KyhlLnctdC53KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56JiZ0Lnc9PT10aGlzLnd9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXMudz10W2UrM10sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHRbZSszXT10aGlzLncsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXMudz10LmdldFcoZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpcy53PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMueix5aWVsZCB0aGlzLnd9fWNsYXNzIF9oe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHI9MSl7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1yfXN0YXRpYyBzbGVycEZsYXQodCxlLG4scixpLG8scyl7bGV0IGE9bltyKzBdLHU9bltyKzFdLGM9bltyKzJdLGw9bltyKzNdO2NvbnN0IGg9aVtvKzBdLGY9aVtvKzFdLHA9aVtvKzJdLGQ9aVtvKzNdO2lmKDA9PT1zKXJldHVybiB0W2UrMF09YSx0W2UrMV09dSx0W2UrMl09Yyx2b2lkKHRbZSszXT1sKTtpZigxPT09cylyZXR1cm4gdFtlKzBdPWgsdFtlKzFdPWYsdFtlKzJdPXAsdm9pZCh0W2UrM109ZCk7aWYobCE9PWR8fGEhPT1ofHx1IT09Znx8YyE9PXApe2xldCB0PTEtcztjb25zdCBlPWEqaCt1KmYrYypwK2wqZCxuPWU+PTA/MTotMSxyPTEtZSplO2lmKHI+TnVtYmVyLkVQU0lMT04pe2NvbnN0IGk9TWF0aC5zcXJ0KHIpLG89TWF0aC5hdGFuMihpLGUqbik7dD1NYXRoLnNpbih0Km8pL2kscz1NYXRoLnNpbihzKm8pL2l9Y29uc3QgaT1zKm47aWYoYT1hKnQraCppLHU9dSp0K2YqaSxjPWMqdCtwKmksbD1sKnQrZCppLHQ9PT0xLXMpe2NvbnN0IHQ9MS9NYXRoLnNxcnQoYSphK3UqdStjKmMrbCpsKTthKj10LHUqPXQsYyo9dCxsKj10fX10W2VdPWEsdFtlKzFdPXUsdFtlKzJdPWMsdFtlKzNdPWx9c3RhdGljIG11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsZSxuLHIsaSxvKXtjb25zdCBzPW5bcl0sYT1uW3IrMV0sdT1uW3IrMl0sYz1uW3IrM10sbD1pW29dLGg9aVtvKzFdLGY9aVtvKzJdLHA9aVtvKzNdO3JldHVybiB0W2VdPXMqcCtjKmwrYSpmLXUqaCx0W2UrMV09YSpwK2MqaCt1KmwtcypmLHRbZSsyXT11KnArYypmK3MqaC1hKmwsdFtlKzNdPWMqcC1zKmwtYSpoLXUqZix0fWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB3KCl7cmV0dXJuIHRoaXMuX3d9c2V0IHcodCl7dGhpcy5fdz10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4scil7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX3c9cix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl93KX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQueCx0aGlzLl95PXQueSx0aGlzLl96PXQueix0aGlzLl93PXQudyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tRXVsZXIodCxlPSEwKXtjb25zdCBuPXQuX3gscj10Ll95LGk9dC5feixvPXQuX29yZGVyLHM9TWF0aC5jb3MsYT1NYXRoLnNpbix1PXMobi8yKSxjPXMoci8yKSxsPXMoaS8yKSxoPWEobi8yKSxmPWEoci8yKSxwPWEoaS8yKTtzd2l0Y2gobyl7Y2FzZSJYWVoiOnRoaXMuX3g9aCpjKmwrdSpmKnAsdGhpcy5feT11KmYqbC1oKmMqcCx0aGlzLl96PXUqYypwK2gqZipsLHRoaXMuX3c9dSpjKmwtaCpmKnA7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9aCpjKmwrdSpmKnAsdGhpcy5feT11KmYqbC1oKmMqcCx0aGlzLl96PXUqYypwLWgqZipsLHRoaXMuX3c9dSpjKmwraCpmKnA7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9aCpjKmwtdSpmKnAsdGhpcy5feT11KmYqbCtoKmMqcCx0aGlzLl96PXUqYypwK2gqZipsLHRoaXMuX3c9dSpjKmwtaCpmKnA7YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3g9aCpjKmwtdSpmKnAsdGhpcy5feT11KmYqbCtoKmMqcCx0aGlzLl96PXUqYypwLWgqZipsLHRoaXMuX3c9dSpjKmwraCpmKnA7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3g9aCpjKmwrdSpmKnAsdGhpcy5feT11KmYqbCtoKmMqcCx0aGlzLl96PXUqYypwLWgqZipsLHRoaXMuX3c9dSpjKmwtaCpmKnA7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3g9aCpjKmwtdSpmKnAsdGhpcy5feT11KmYqbC1oKmMqcCx0aGlzLl96PXUqYypwK2gqZipsLHRoaXMuX3c9dSpjKmwraCpmKnB9cmV0dXJuITA9PT1lJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tQXhpc0FuZ2xlKHQsZSl7Y29uc3Qgbj1lLzIscj1NYXRoLnNpbihuKTtyZXR1cm4gdGhpcy5feD10Lngqcix0aGlzLl95PXQueSpyLHRoaXMuX3o9dC56KnIsdGhpcy5fdz1NYXRoLmNvcyhuKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCl7Y29uc3QgZT10LmVsZW1lbnRzLG49ZVswXSxyPWVbNF0saT1lWzhdLG89ZVsxXSxzPWVbNV0sYT1lWzldLHU9ZVsyXSxjPWVbNl0sbD1lWzEwXSxoPW4rcytsO2lmKGg+MCl7Y29uc3QgdD0uNS9NYXRoLnNxcnQoaCsxKTt0aGlzLl93PS4yNS90LHRoaXMuX3g9KGMtYSkqdCx0aGlzLl95PShpLXUpKnQsdGhpcy5fej0oby1yKSp0fWVsc2UgaWYobj5zJiZuPmwpe2NvbnN0IHQ9MipNYXRoLnNxcnQoMStuLXMtbCk7dGhpcy5fdz0oYy1hKS90LHRoaXMuX3g9LjI1KnQsdGhpcy5feT0ocitvKS90LHRoaXMuX3o9KGkrdSkvdH1lbHNlIGlmKHM+bCl7Y29uc3QgdD0yKk1hdGguc3FydCgxK3Mtbi1sKTt0aGlzLl93PShpLXUpL3QsdGhpcy5feD0ocitvKS90LHRoaXMuX3k9LjI1KnQsdGhpcy5fej0oYStjKS90fWVsc2V7Y29uc3QgdD0yKk1hdGguc3FydCgxK2wtbi1zKTt0aGlzLl93PShvLXIpL3QsdGhpcy5feD0oaSt1KS90LHRoaXMuX3k9KGErYykvdCx0aGlzLl96PS4yNSp0fXJldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tVW5pdFZlY3RvcnModCxlKXtsZXQgbj10LmRvdChlKSsxO3JldHVybiBuPE51bWJlci5FUFNJTE9OPyhuPTAsTWF0aC5hYnModC54KT5NYXRoLmFicyh0LnopPyh0aGlzLl94PS10LnksdGhpcy5feT10LngsdGhpcy5fej0wLHRoaXMuX3c9bik6KHRoaXMuX3g9MCx0aGlzLl95PS10LnosdGhpcy5fej10LnksdGhpcy5fdz1uKSk6KHRoaXMuX3g9dC55KmUuei10LnoqZS55LHRoaXMuX3k9dC56KmUueC10LngqZS56LHRoaXMuX3o9dC54KmUueS10LnkqZS54LHRoaXMuX3c9biksdGhpcy5ub3JtYWxpemUoKX1hbmdsZVRvKHQpe3JldHVybiAyKk1hdGguYWNvcyhNYXRoLmFicyhRbCh0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZigwPT09bilyZXR1cm4gdGhpcztjb25zdCByPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LHIpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gMD09PXQ/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gscj10Ll95LGk9dC5feixvPXQuX3cscz1lLl94LGE9ZS5feSx1PWUuX3osYz1lLl93O3JldHVybiB0aGlzLl94PW4qYytvKnMrcip1LWkqYSx0aGlzLl95PXIqYytvKmEraSpzLW4qdSx0aGlzLl96PWkqYytvKnUrbiphLXIqcyx0aGlzLl93PW8qYy1uKnMtciphLWkqdSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKDA9PT1lKXJldHVybiB0aGlzO2lmKDE9PT1lKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3Qgbj10aGlzLl94LHI9dGhpcy5feSxpPXRoaXMuX3osbz10aGlzLl93O2xldCBzPW8qdC5fdytuKnQuX3grcip0Ll95K2kqdC5fejtpZihzPDA/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3oscz0tcyk6dGhpcy5jb3B5KHQpLHM+PTEpcmV0dXJuIHRoaXMuX3c9byx0aGlzLl94PW4sdGhpcy5feT1yLHRoaXMuX3o9aSx0aGlzO2NvbnN0IGE9MS1zKnM7aWYoYTw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IHQ9MS1lO3JldHVybiB0aGlzLl93PXQqbytlKnRoaXMuX3csdGhpcy5feD10Km4rZSp0aGlzLl94LHRoaXMuX3k9dCpyK2UqdGhpcy5feSx0aGlzLl96PXQqaStlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzfWNvbnN0IHU9TWF0aC5zcXJ0KGEpLGM9TWF0aC5hdGFuMih1LHMpLGw9TWF0aC5zaW4oKDEtZSkqYykvdSxoPU1hdGguc2luKGUqYykvdTtyZXR1cm4gdGhpcy5fdz1vKmwrdGhpcy5fdypoLHRoaXMuX3g9bipsK3RoaXMuX3gqaCx0aGlzLl95PXIqbCt0aGlzLl95KmgsdGhpcy5fej1pKmwrdGhpcy5feipoLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1yYW5kb20oKXtjb25zdCB0PTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLGU9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksbj1NYXRoLnJhbmRvbSgpLHI9TWF0aC5zcXJ0KDEtbiksaT1NYXRoLnNxcnQobik7cmV0dXJuIHRoaXMuc2V0KHIqTWF0aC5zaW4odCkscipNYXRoLmNvcyh0KSxpKk1hdGguc2luKGUpLGkqTWF0aC5jb3MoZSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX3d9fWNsYXNzIHhoe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wKXt4aC5wcm90b3R5cGUuaXNWZWN0b3IzPSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1ufXNldCh0LGUsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPXRoaXMueiksdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXMuej10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldFoodCl7cmV0dXJuIHRoaXMuej10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7Y2FzZSAyOnRoaXMuej1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueil9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpc31hZGQodCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXMueis9dC56LHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLngrPXQsdGhpcy55Kz10LHRoaXMueis9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXMuei09dC56LHRoaXN9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXMuei09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpc31tdWx0aXBseVZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCplLngsdGhpcy55PXQueSplLnksdGhpcy56PXQueiplLnosdGhpc31hcHBseUV1bGVyKHQpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihiaC5zZXRGcm9tRXVsZXIodCkpfWFwcGx5QXhpc0FuZ2xlKHQsZSl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKGJoLnNldEZyb21BeGlzQW5nbGUodCxlKSl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHI9dGhpcy56LGk9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWlbMF0qZStpWzNdKm4raVs2XSpyLHRoaXMueT1pWzFdKmUraVs0XSpuK2lbN10qcix0aGlzLno9aVsyXSplK2lbNV0qbitpWzhdKnIsdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDModCkubm9ybWFsaXplKCl9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHI9dGhpcy56LGk9dC5lbGVtZW50cyxvPTEvKGlbM10qZStpWzddKm4raVsxMV0qcitpWzE1XSk7cmV0dXJuIHRoaXMueD0oaVswXSplK2lbNF0qbitpWzhdKnIraVsxMl0pKm8sdGhpcy55PShpWzFdKmUraVs1XSpuK2lbOV0qcitpWzEzXSkqbyx0aGlzLno9KGlbMl0qZStpWzZdKm4raVsxMF0qcitpWzE0XSkqbyx0aGlzfWFwcGx5UXVhdGVybmlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxyPXRoaXMueixpPXQueCxvPXQueSxzPXQueixhPXQudyx1PTIqKG8qci1zKm4pLGM9MioocyplLWkqciksbD0yKihpKm4tbyplKTtyZXR1cm4gdGhpcy54PWUrYSp1K28qbC1zKmMsdGhpcy55PW4rYSpjK3MqdS1pKmwsdGhpcy56PXIrYSpsK2kqYy1vKnUsdGhpc31wcm9qZWN0KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkSW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeCl9dW5wcm9qZWN0KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCl9dHJhbnNmb3JtRGlyZWN0aW9uKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHI9dGhpcy56LGk9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWlbMF0qZStpWzRdKm4raVs4XSpyLHRoaXMueT1pWzFdKmUraVs1XSpuK2lbOV0qcix0aGlzLno9aVsyXSplK2lbNl0qbitpWzEwXSpyLHRoaXMubm9ybWFsaXplKCl9ZGl2aWRlKHQpe3JldHVybiB0aGlzLngvPXQueCx0aGlzLnkvPXQueSx0aGlzLnovPXQueix0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQueCxNYXRoLm1pbihlLngsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQueSxNYXRoLm1pbihlLnksdGhpcy55KSksdGhpcy56PU1hdGgubWF4KHQueixNYXRoLm1pbihlLnosdGhpcy56KSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy55KSksdGhpcy56PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnopKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0LnkrdGhpcy56KnQuen1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMuen1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueil9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzfWNyb3NzKHQpe3JldHVybiB0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLHQpfWNyb3NzVmVjdG9ycyh0LGUpe2NvbnN0IG49dC54LHI9dC55LGk9dC56LG89ZS54LHM9ZS55LGE9ZS56O3JldHVybiB0aGlzLng9ciphLWkqcyx0aGlzLnk9aSpvLW4qYSx0aGlzLno9bipzLXIqbyx0aGlzfXByb2plY3RPblZlY3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoU3EoKTtpZigwPT09ZSlyZXR1cm4gdGhpcy5zZXQoMCwwLDApO2NvbnN0IG49dC5kb3QodGhpcykvZTtyZXR1cm4gdGhpcy5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKG4pfXByb2plY3RPblBsYW5lKHQpe3JldHVybiB3aC5jb3B5KHRoaXMpLnByb2plY3RPblZlY3Rvcih0KSx0aGlzLnN1Yih3aCl9cmVmbGVjdCh0KXtyZXR1cm4gdGhpcy5zdWIod2guY29weSh0KS5tdWx0aXBseVNjYWxhcigyKnRoaXMuZG90KHQpKSl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZigwPT09ZSlyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKFFsKG4sLTEsMSkpfWRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVRvU3F1YXJlZCh0KXtjb25zdCBlPXRoaXMueC10Lngsbj10aGlzLnktdC55LHI9dGhpcy56LXQuejtyZXR1cm4gZSplK24qbityKnJ9bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSkrTWF0aC5hYnModGhpcy56LXQueil9c2V0RnJvbVNwaGVyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQucmFkaXVzLHQucGhpLHQudGhldGEpfXNldEZyb21TcGhlcmljYWxDb29yZHModCxlLG4pe2NvbnN0IHI9TWF0aC5zaW4oZSkqdDtyZXR1cm4gdGhpcy54PXIqTWF0aC5zaW4obiksdGhpcy55PU1hdGguY29zKGUpKnQsdGhpcy56PXIqTWF0aC5jb3MobiksdGhpc31zZXRGcm9tQ3lsaW5kcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQucmFkaXVzLHQudGhldGEsdC55KX1zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModCxlLG4pe3JldHVybiB0aGlzLng9dCpNYXRoLnNpbihlKSx0aGlzLnk9bix0aGlzLno9dCpNYXRoLmNvcyhlKSx0aGlzfXNldEZyb21NYXRyaXhQb3NpdGlvbih0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1lWzEyXSx0aGlzLnk9ZVsxM10sdGhpcy56PWVbMTRdLHRoaXN9c2V0RnJvbU1hdHJpeFNjYWxlKHQpe2NvbnN0IGU9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMCkubGVuZ3RoKCksbj10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwxKS5sZW5ndGgoKSxyPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDIpLmxlbmd0aCgpO3JldHVybiB0aGlzLng9ZSx0aGlzLnk9bix0aGlzLno9cix0aGlzfXNldEZyb21NYXRyaXhDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cyw0KmUpfXNldEZyb21NYXRyaXgzQ29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsMyplKX1zZXRGcm9tRXVsZXIodCl7cmV0dXJuIHRoaXMueD10Ll94LHRoaXMueT10Ll95LHRoaXMuej10Ll96LHRoaXN9c2V0RnJvbUNvbG9yKHQpe3JldHVybiB0aGlzLng9dC5yLHRoaXMueT10LmcsdGhpcy56PXQuYix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnkmJnQuej09PXRoaXMuen1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpcy56PXQuZ2V0WihlKSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzLno9TWF0aC5yYW5kb20oKSx0aGlzfXJhbmRvbURpcmVjdGlvbigpe2NvbnN0IHQ9TWF0aC5yYW5kb20oKSpNYXRoLlBJKjIsZT0yKk1hdGgucmFuZG9tKCktMSxuPU1hdGguc3FydCgxLWUqZSk7cmV0dXJuIHRoaXMueD1uKk1hdGguY29zKHQpLHRoaXMueT1lLHRoaXMuej1uKk1hdGguc2luKHQpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnp9fWNvbnN0IHdoPW5ldyB4aCxiaD1uZXcgX2g7Y2xhc3MgRGh7Y29uc3RydWN0b3IodD1uZXcgeGgoMS8wLDEvMCwxLzApLGU9bmV3IHhoKC0xLzAsLTEvMCwtMS8wKSl7dGhpcy5pc0JveDM9ITAsdGhpcy5taW49dCx0aGlzLm1heD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpc31zZXRGcm9tQXJyYXkodCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKz0zKXRoaXMuZXhwYW5kQnlQb2ludChDaC5mcm9tQXJyYXkodCxlKSk7cmV0dXJuIHRoaXN9c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5jb3VudDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludChDaC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSkpO3JldHVybiB0aGlzfXNldEZyb21Qb2ludHModCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5leHBhbmRCeVBvaW50KHRbZV0pO3JldHVybiB0aGlzfXNldEZyb21DZW50ZXJBbmRTaXplKHQsZSl7Y29uc3Qgbj1DaC5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTtyZXR1cm4gdGhpcy5taW4uY29weSh0KS5zdWIobiksdGhpcy5tYXguY29weSh0KS5hZGQobiksdGhpc31zZXRGcm9tT2JqZWN0KHQsZT0hMSl7cmV0dXJuIHRoaXMubWFrZUVtcHR5KCksdGhpcy5leHBhbmRCeU9iamVjdCh0LGUpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXN9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9dGhpcy5tYXguej0tMS8wLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fWdldENlbnRlcih0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfWV4cGFuZEJ5UG9pbnQodCl7cmV0dXJuIHRoaXMubWluLm1pbih0KSx0aGlzLm1heC5tYXgodCksdGhpc31leHBhbmRCeVZlY3Rvcih0KXtyZXR1cm4gdGhpcy5taW4uc3ViKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWV4cGFuZEJ5U2NhbGFyKHQpe3JldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLXQpLHRoaXMubWF4LmFkZFNjYWxhcih0KSx0aGlzfWV4cGFuZEJ5T2JqZWN0KHQsZT0hMSl7dC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7Y29uc3Qgbj10Lmdlb21ldHJ5O2lmKHZvaWQgMCE9PW4pe2NvbnN0IHI9bi5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoITA9PT1lJiZ2b2lkIDAhPT1yJiYhMCE9PXQuaXNJbnN0YW5jZWRNZXNoKWZvcihsZXQgZT0wLG49ci5jb3VudDtlPG47ZSsrKSEwPT09dC5pc01lc2g/dC5nZXRWZXJ0ZXhQb3NpdGlvbihlLENoKTpDaC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsZSksQ2guYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChDaCk7ZWxzZSB2b2lkIDAhPT10LmJvdW5kaW5nQm94PyhudWxsPT09dC5ib3VuZGluZ0JveCYmdC5jb21wdXRlQm91bmRpbmdCb3goKSxTaC5jb3B5KHQuYm91bmRpbmdCb3gpKToobnVsbD09PW4uYm91bmRpbmdCb3gmJm4uY29tcHV0ZUJvdW5kaW5nQm94KCksU2guY29weShuLmJvdW5kaW5nQm94KSksU2guYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMudW5pb24oU2gpfWNvbnN0IHI9dC5jaGlsZHJlbjtmb3IobGV0IHQ9MCxuPXIubGVuZ3RoO3Q8bjt0KyspdGhpcy5leHBhbmRCeU9iamVjdChyW3RdLGUpO3JldHVybiB0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQueD49dGhpcy5taW4ueCYmdC54PD10aGlzLm1heC54JiZ0Lnk+PXRoaXMubWluLnkmJnQueTw9dGhpcy5tYXgueSYmdC56Pj10aGlzLm1pbi56JiZ0Lno8PXRoaXMubWF4Lnp9Y29udGFpbnNCb3godCl7cmV0dXJuIHRoaXMubWluLng8PXQubWluLngmJnQubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PXQubWluLnkmJnQubWF4Lnk8PXRoaXMubWF4LnkmJnRoaXMubWluLno8PXQubWluLnomJnQubWF4Lno8PXRoaXMubWF4Lnp9Z2V0UGFyYW1ldGVyKHQsZSl7cmV0dXJuIGUuc2V0KCh0LngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKHQueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSwodC56LXRoaXMubWluLnopLyh0aGlzLm1heC56LXRoaXMubWluLnopKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0Lm1heC54Pj10aGlzLm1pbi54JiZ0Lm1pbi54PD10aGlzLm1heC54JiZ0Lm1heC55Pj10aGlzLm1pbi55JiZ0Lm1pbi55PD10aGlzLm1heC55JiZ0Lm1heC56Pj10aGlzLm1pbi56JiZ0Lm1pbi56PD10aGlzLm1heC56fWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LmNlbnRlcixDaCksQ2guZGlzdGFuY2VUb1NxdWFyZWQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31pbnRlcnNlY3RzUGxhbmUodCl7bGV0IGUsbjtyZXR1cm4gdC5ub3JtYWwueD4wPyhlPXQubm9ybWFsLngqdGhpcy5taW4ueCxuPXQubm9ybWFsLngqdGhpcy5tYXgueCk6KGU9dC5ub3JtYWwueCp0aGlzLm1heC54LG49dC5ub3JtYWwueCp0aGlzLm1pbi54KSx0Lm5vcm1hbC55PjA/KGUrPXQubm9ybWFsLnkqdGhpcy5taW4ueSxuKz10Lm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz10Lm5vcm1hbC55KnRoaXMubWF4Lnksbis9dC5ub3JtYWwueSp0aGlzLm1pbi55KSx0Lm5vcm1hbC56PjA/KGUrPXQubm9ybWFsLnoqdGhpcy5taW4ueixuKz10Lm5vcm1hbC56KnRoaXMubWF4LnopOihlKz10Lm5vcm1hbC56KnRoaXMubWF4Lnosbis9dC5ub3JtYWwueip0aGlzLm1pbi56KSxlPD0tdC5jb25zdGFudCYmbj49LXQuY29uc3RhbnR9aW50ZXJzZWN0c1RyaWFuZ2xlKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKE9oKSxMaC5zdWJWZWN0b3JzKHRoaXMubWF4LE9oKSxBaC5zdWJWZWN0b3JzKHQuYSxPaCksTmguc3ViVmVjdG9ycyh0LmIsT2gpLEloLnN1YlZlY3RvcnModC5jLE9oKSxNaC5zdWJWZWN0b3JzKE5oLEFoKSxGaC5zdWJWZWN0b3JzKEloLE5oKSxUaC5zdWJWZWN0b3JzKEFoLEloKTtsZXQgZT1bMCwtTWgueixNaC55LDAsLUZoLnosRmgueSwwLC1UaC56LFRoLnksTWgueiwwLC1NaC54LEZoLnosMCwtRmgueCxUaC56LDAsLVRoLngsLU1oLnksTWgueCwwLC1GaC55LEZoLngsMCwtVGgueSxUaC54LDBdO3JldHVybiEoIUJoKGUsQWgsTmgsSWgsTGgpfHwoZT1bMSwwLDAsMCwxLDAsMCwwLDFdLCFCaChlLEFoLE5oLEloLExoKSkpJiYoUGguY3Jvc3NWZWN0b3JzKE1oLEZoKSxlPVtQaC54LFBoLnksUGguel0sQmgoZSxBaCxOaCxJaCxMaCkpfWNsYW1wUG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHQpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LENoKS5kaXN0YW5jZVRvKHQpfWdldEJvdW5kaW5nU3BoZXJlKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90Lm1ha2VFbXB0eSgpOih0aGlzLmdldENlbnRlcih0LmNlbnRlciksdC5yYWRpdXM9LjUqdGhpcy5nZXRTaXplKENoKS5sZW5ndGgoKSksdH1pbnRlcnNlY3QodCl7cmV0dXJuIHRoaXMubWluLm1heCh0Lm1pbiksdGhpcy5tYXgubWluKHQubWF4KSx0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKSx0aGlzfXVuaW9uKHQpe3JldHVybiB0aGlzLm1pbi5taW4odC5taW4pLHRoaXMubWF4Lm1heCh0Lm1heCksdGhpc31hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpfHwoRWhbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRWhbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksRWhbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRWhbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksRWhbNF0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRWhbNV0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksRWhbNl0uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRWhbN10uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRGcm9tUG9pbnRzKEVoKSksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9fWNvbnN0IEVoPVtuZXcgeGgsbmV3IHhoLG5ldyB4aCxuZXcgeGgsbmV3IHhoLG5ldyB4aCxuZXcgeGgsbmV3IHhoXSxDaD1uZXcgeGgsU2g9bmV3IERoLEFoPW5ldyB4aCxOaD1uZXcgeGgsSWg9bmV3IHhoLE1oPW5ldyB4aCxGaD1uZXcgeGgsVGg9bmV3IHhoLE9oPW5ldyB4aCxMaD1uZXcgeGgsUGg9bmV3IHhoLFJoPW5ldyB4aDtmdW5jdGlvbiBCaCh0LGUsbixyLGkpe2ZvcihsZXQgbz0wLHM9dC5sZW5ndGgtMztvPD1zO28rPTMpe1JoLmZyb21BcnJheSh0LG8pO2NvbnN0IHM9aS54Kk1hdGguYWJzKFJoLngpK2kueSpNYXRoLmFicyhSaC55KStpLnoqTWF0aC5hYnMoUmgueiksYT1lLmRvdChSaCksdT1uLmRvdChSaCksYz1yLmRvdChSaCk7aWYoTWF0aC5tYXgoLU1hdGgubWF4KGEsdSxjKSxNYXRoLm1pbihhLHUsYykpPnMpcmV0dXJuITF9cmV0dXJuITB9Y29uc3Qga2g9bmV3IERoLHpoPW5ldyB4aCxqaD1uZXcgeGg7Y2xhc3MgVWh7Y29uc3RydWN0b3IodD1uZXcgeGgsZT0tMSl7dGhpcy5pc1NwaGVyZT0hMCx0aGlzLmNlbnRlcj10LHRoaXMucmFkaXVzPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9ZSx0aGlzfXNldEZyb21Qb2ludHModCxlKXtjb25zdCBuPXRoaXMuY2VudGVyO3ZvaWQgMCE9PWU/bi5jb3B5KGUpOmtoLnNldEZyb21Qb2ludHModCkuZ2V0Q2VudGVyKG4pO2xldCByPTA7Zm9yKGxldCBlPTAsaT10Lmxlbmd0aDtlPGk7ZSsrKXI9TWF0aC5tYXgocixuLmRpc3RhbmNlVG9TcXVhcmVkKHRbZV0pKTtyZXR1cm4gdGhpcy5yYWRpdXM9TWF0aC5zcXJ0KHIpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMucmFkaXVzPDB9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMuY2VudGVyLnNldCgwLDAsMCksdGhpcy5yYWRpdXM9LTEsdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXN9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLXRoaXMucmFkaXVzfWludGVyc2VjdHNTcGhlcmUodCl7Y29uc3QgZT10aGlzLnJhZGl1cyt0LnJhZGl1cztyZXR1cm4gdC5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1lKmV9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzU3BoZXJlKHRoaXMpfWludGVyc2VjdHNQbGFuZSh0KXtyZXR1cm4gTWF0aC5hYnModC5kaXN0YW5jZVRvUG9pbnQodGhpcy5jZW50ZXIpKTw9dGhpcy5yYWRpdXN9Y2xhbXBQb2ludCh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodCk7cmV0dXJuIGUuY29weSh0KSxuPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzJiYoZS5zdWIodGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpLGUubXVsdGlwbHlTY2FsYXIodGhpcy5yYWRpdXMpLmFkZCh0aGlzLmNlbnRlcikpLGV9Z2V0Qm91bmRpbmdCb3godCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPyh0Lm1ha2VFbXB0eSgpLHQpOih0LnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlciksdC5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyksdCl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQodCksdGhpcy5yYWRpdXM9dGhpcy5yYWRpdXMqdC5nZXRNYXhTY2FsZU9uQXhpcygpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLmNlbnRlci5hZGQodCksdGhpc31leHBhbmRCeVBvaW50KHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzLmNlbnRlci5jb3B5KHQpLHRoaXMucmFkaXVzPTAsdGhpczt6aC5zdWJWZWN0b3JzKHQsdGhpcy5jZW50ZXIpO2NvbnN0IGU9emgubGVuZ3RoU3EoKTtpZihlPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzKXtjb25zdCB0PU1hdGguc3FydChlKSxuPS41Kih0LXRoaXMucmFkaXVzKTt0aGlzLmNlbnRlci5hZGRTY2FsZWRWZWN0b3Ioemgsbi90KSx0aGlzLnJhZGl1cys9bn1yZXR1cm4gdGhpc311bmlvbih0KXtyZXR1cm4gdC5pc0VtcHR5KCk/dGhpczp0aGlzLmlzRW1wdHkoKT8odGhpcy5jb3B5KHQpLHRoaXMpOighMD09PXRoaXMuY2VudGVyLmVxdWFscyh0LmNlbnRlcik/dGhpcy5yYWRpdXM9TWF0aC5tYXgodGhpcy5yYWRpdXMsdC5yYWRpdXMpOihqaC5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMuY2VudGVyKS5zZXRMZW5ndGgodC5yYWRpdXMpLHRoaXMuZXhwYW5kQnlQb2ludCh6aC5jb3B5KHQuY2VudGVyKS5hZGQoamgpKSx0aGlzLmV4cGFuZEJ5UG9pbnQoemguY29weSh0LmNlbnRlcikuc3ViKGpoKSkpLHRoaXMpfWVxdWFscyh0KXtyZXR1cm4gdC5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSYmdC5yYWRpdXM9PT10aGlzLnJhZGl1c31jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19Y29uc3QgcWg9bmV3IHhoLFZoPW5ldyB4aCxHaD1uZXcgeGgsWWg9bmV3IHhoLFhoPW5ldyB4aCxXaD1uZXcgeGgsSGg9bmV3IHhoO2NsYXNzIFpoe2NvbnN0cnVjdG9yKHQsZSxuLHIsaSxvLHMsYSx1LGMsbCxoLGYscCxkLGcpe1poLnByb3RvdHlwZS5pc01hdHJpeDQ9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0sdm9pZCAwIT09dCYmdGhpcy5zZXQodCxlLG4scixpLG8scyxhLHUsYyxsLGgsZixwLGQsZyl9c2V0KHQsZSxuLHIsaSxvLHMsYSx1LGMsbCxoLGYscCxkLGcpe2NvbnN0IHk9dGhpcy5lbGVtZW50cztyZXR1cm4geVswXT10LHlbNF09ZSx5WzhdPW4seVsxMl09cix5WzFdPWkseVs1XT1vLHlbOV09cyx5WzEzXT1hLHlbMl09dSx5WzZdPWMseVsxMF09bCx5WzE0XT1oLHlbM109Zix5WzddPXAseVsxMV09ZCx5WzE1XT1nLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31jbG9uZSgpe3JldHVybihuZXcgWmgpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX1jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZVsyXT1uWzJdLGVbM109blszXSxlWzRdPW5bNF0sZVs1XT1uWzVdLGVbNl09bls2XSxlWzddPW5bN10sZVs4XT1uWzhdLGVbOV09bls5XSxlWzEwXT1uWzEwXSxlWzExXT1uWzExXSxlWzEyXT1uWzEyXSxlWzEzXT1uWzEzXSxlWzE0XT1uWzE0XSxlWzE1XT1uWzE1XSx0aGlzfWNvcHlQb3NpdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzEyXT1uWzEyXSxlWzEzXT1uWzEzXSxlWzE0XT1uWzE0XSx0aGlzfXNldEZyb21NYXRyaXgzKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzNdLGVbNl0sMCxlWzFdLGVbNF0sZVs3XSwwLGVbMl0sZVs1XSxlWzhdLDAsMCwwLDAsMSksdGhpc31leHRyYWN0QmFzaXModCxlLG4pe3JldHVybiB0LnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywyKSx0aGlzfW1ha2VCYXNpcyh0LGUsbil7cmV0dXJuIHRoaXMuc2V0KHQueCxlLngsbi54LDAsdC55LGUueSxuLnksMCx0LnosZS56LG4ueiwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdFJvdGF0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHMscj0xL0toLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxpPTEvS2guc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG89MS9LaC5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIGVbMF09blswXSpyLGVbMV09blsxXSpyLGVbMl09blsyXSpyLGVbM109MCxlWzRdPW5bNF0qaSxlWzVdPW5bNV0qaSxlWzZdPW5bNl0qaSxlWzddPTAsZVs4XT1uWzhdKm8sZVs5XT1uWzldKm8sZVsxMF09blsxMF0qbyxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tRXVsZXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LHI9dC55LGk9dC56LG89TWF0aC5jb3Mobikscz1NYXRoLnNpbihuKSxhPU1hdGguY29zKHIpLHU9TWF0aC5zaW4ociksYz1NYXRoLmNvcyhpKSxsPU1hdGguc2luKGkpO2lmKCJYWVoiPT09dC5vcmRlcil7Y29uc3QgdD1vKmMsbj1vKmwscj1zKmMsaT1zKmw7ZVswXT1hKmMsZVs0XT0tYSpsLGVbOF09dSxlWzFdPW4rcip1LGVbNV09dC1pKnUsZVs5XT0tcyphLGVbMl09aS10KnUsZVs2XT1yK24qdSxlWzEwXT1vKmF9ZWxzZSBpZigiWVhaIj09PXQub3JkZXIpe2NvbnN0IHQ9YSpjLG49YSpsLHI9dSpjLGk9dSpsO2VbMF09dCtpKnMsZVs0XT1yKnMtbixlWzhdPW8qdSxlWzFdPW8qbCxlWzVdPW8qYyxlWzldPS1zLGVbMl09bipzLXIsZVs2XT1pK3QqcyxlWzEwXT1vKmF9ZWxzZSBpZigiWlhZIj09PXQub3JkZXIpe2NvbnN0IHQ9YSpjLG49YSpsLHI9dSpjLGk9dSpsO2VbMF09dC1pKnMsZVs0XT0tbypsLGVbOF09cituKnMsZVsxXT1uK3IqcyxlWzVdPW8qYyxlWzldPWktdCpzLGVbMl09LW8qdSxlWzZdPXMsZVsxMF09byphfWVsc2UgaWYoIlpZWCI9PT10Lm9yZGVyKXtjb25zdCB0PW8qYyxuPW8qbCxyPXMqYyxpPXMqbDtlWzBdPWEqYyxlWzRdPXIqdS1uLGVbOF09dCp1K2ksZVsxXT1hKmwsZVs1XT1pKnUrdCxlWzldPW4qdS1yLGVbMl09LXUsZVs2XT1zKmEsZVsxMF09byphfWVsc2UgaWYoIllaWCI9PT10Lm9yZGVyKXtjb25zdCB0PW8qYSxuPW8qdSxyPXMqYSxpPXMqdTtlWzBdPWEqYyxlWzRdPWktdCpsLGVbOF09cipsK24sZVsxXT1sLGVbNV09bypjLGVbOV09LXMqYyxlWzJdPS11KmMsZVs2XT1uKmwrcixlWzEwXT10LWkqbH1lbHNlIGlmKCJYWlkiPT09dC5vcmRlcil7Y29uc3QgdD1vKmEsbj1vKnUscj1zKmEsaT1zKnU7ZVswXT1hKmMsZVs0XT0tbCxlWzhdPXUqYyxlWzFdPXQqbCtpLGVbNV09bypjLGVbOV09bipsLXIsZVsyXT1yKmwtbixlWzZdPXMqYyxlWzEwXT1pKmwrdH1yZXR1cm4gZVszXT0wLGVbN109MCxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5jb21wb3NlKFFoLHQsJGgpfWxvb2tBdCh0LGUsbil7Y29uc3Qgcj10aGlzLmVsZW1lbnRzO3JldHVybiBuZi5zdWJWZWN0b3JzKHQsZSksMD09PW5mLmxlbmd0aFNxKCkmJihuZi56PTEpLG5mLm5vcm1hbGl6ZSgpLHRmLmNyb3NzVmVjdG9ycyhuLG5mKSwwPT09dGYubGVuZ3RoU3EoKSYmKDE9PT1NYXRoLmFicyhuLnopP25mLngrPTFlLTQ6bmYueis9MWUtNCxuZi5ub3JtYWxpemUoKSx0Zi5jcm9zc1ZlY3RvcnMobixuZikpLHRmLm5vcm1hbGl6ZSgpLGVmLmNyb3NzVmVjdG9ycyhuZix0ZiksclswXT10Zi54LHJbNF09ZWYueCxyWzhdPW5mLngsclsxXT10Zi55LHJbNV09ZWYueSxyWzldPW5mLnksclsyXT10Zi56LHJbNl09ZWYueixyWzEwXT1uZi56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgbj10LmVsZW1lbnRzLHI9ZS5lbGVtZW50cyxpPXRoaXMuZWxlbWVudHMsbz1uWzBdLHM9bls0XSxhPW5bOF0sdT1uWzEyXSxjPW5bMV0sbD1uWzVdLGg9bls5XSxmPW5bMTNdLHA9blsyXSxkPW5bNl0sZz1uWzEwXSx5PW5bMTRdLG09blszXSx2PW5bN10sXz1uWzExXSx4PW5bMTVdLHc9clswXSxiPXJbNF0sRD1yWzhdLEU9clsxMl0sQz1yWzFdLFM9cls1XSxBPXJbOV0sTj1yWzEzXSxJPXJbMl0sTT1yWzZdLEY9clsxMF0sVD1yWzE0XSxPPXJbM10sTD1yWzddLFA9clsxMV0sUj1yWzE1XTtyZXR1cm4gaVswXT1vKncrcypDK2EqSSt1Kk8saVs0XT1vKmIrcypTK2EqTSt1KkwsaVs4XT1vKkQrcypBK2EqRit1KlAsaVsxMl09bypFK3MqTithKlQrdSpSLGlbMV09Yyp3K2wqQytoKkkrZipPLGlbNV09YypiK2wqUytoKk0rZipMLGlbOV09YypEK2wqQStoKkYrZipQLGlbMTNdPWMqRStsKk4raCpUK2YqUixpWzJdPXAqdytkKkMrZypJK3kqTyxpWzZdPXAqYitkKlMrZypNK3kqTCxpWzEwXT1wKkQrZCpBK2cqRit5KlAsaVsxNF09cCpFK2QqTitnKlQreSpSLGlbM109bSp3K3YqQytfKkkreCpPLGlbN109bSpiK3YqUytfKk0reCpMLGlbMTFdPW0qRCt2KkErXypGK3gqUCxpWzE1XT1tKkUrdipOK18qVCt4KlIsdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVs0XSo9dCxlWzhdKj10LGVbMTJdKj10LGVbMV0qPXQsZVs1XSo9dCxlWzldKj10LGVbMTNdKj10LGVbMl0qPXQsZVs2XSo9dCxlWzEwXSo9dCxlWzE0XSo9dCxlWzNdKj10LGVbN10qPXQsZVsxMV0qPXQsZVsxNV0qPXQsdGhpc31kZXRlcm1pbmFudCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzRdLHI9dFs4XSxpPXRbMTJdLG89dFsxXSxzPXRbNV0sYT10WzldLHU9dFsxM10sYz10WzJdLGw9dFs2XSxoPXRbMTBdLGY9dFsxNF07cmV0dXJuIHRbM10qKCtpKmEqbC1yKnUqbC1pKnMqaCtuKnUqaCtyKnMqZi1uKmEqZikrdFs3XSooK2UqYSpmLWUqdSpoK2kqbypoLXIqbypmK3IqdSpjLWkqYSpjKSt0WzExXSooK2UqdSpsLWUqcypmLWkqbypsK24qbypmK2kqcypjLW4qdSpjKSt0WzE1XSooLXIqcypjLWUqYSpsK2UqcypoK3IqbypsLW4qbypoK24qYSpjKX10cmFuc3Bvc2UoKXtjb25zdCB0PXRoaXMuZWxlbWVudHM7bGV0IGU7cmV0dXJuIGU9dFsxXSx0WzFdPXRbNF0sdFs0XT1lLGU9dFsyXSx0WzJdPXRbOF0sdFs4XT1lLGU9dFs2XSx0WzZdPXRbOV0sdFs5XT1lLGU9dFszXSx0WzNdPXRbMTJdLHRbMTJdPWUsZT10WzddLHRbN109dFsxM10sdFsxM109ZSxlPXRbMTFdLHRbMTFdPXRbMTRdLHRbMTRdPWUsdGhpc31zZXRQb3NpdGlvbih0LGUsbil7Y29uc3Qgcj10aGlzLmVsZW1lbnRzO3JldHVybiB0LmlzVmVjdG9yMz8oclsxMl09dC54LHJbMTNdPXQueSxyWzE0XT10LnopOihyWzEyXT10LHJbMTNdPWUsclsxNF09biksdGhpc31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxyPXRbMl0saT10WzNdLG89dFs0XSxzPXRbNV0sYT10WzZdLHU9dFs3XSxjPXRbOF0sbD10WzldLGg9dFsxMF0sZj10WzExXSxwPXRbMTJdLGQ9dFsxM10sZz10WzE0XSx5PXRbMTVdLG09bCpnKnUtZCpoKnUrZCphKmYtcypnKmYtbCphKnkrcypoKnksdj1wKmgqdS1jKmcqdS1wKmEqZitvKmcqZitjKmEqeS1vKmgqeSxfPWMqZCp1LXAqbCp1K3AqcypmLW8qZCpmLWMqcyp5K28qbCp5LHg9cCpsKmEtYypkKmEtcCpzKmgrbypkKmgrYypzKmctbypsKmcsdz1lKm0rbip2K3IqXytpKng7aWYoMD09PXcpcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IGI9MS93O3JldHVybiB0WzBdPW0qYix0WzFdPShkKmgqaS1sKmcqaS1kKnIqZituKmcqZitsKnIqeS1uKmgqeSkqYix0WzJdPShzKmcqaS1kKmEqaStkKnIqdS1uKmcqdS1zKnIqeStuKmEqeSkqYix0WzNdPShsKmEqaS1zKmgqaS1sKnIqdStuKmgqdStzKnIqZi1uKmEqZikqYix0WzRdPXYqYix0WzVdPShjKmcqaS1wKmgqaStwKnIqZi1lKmcqZi1jKnIqeStlKmgqeSkqYix0WzZdPShwKmEqaS1vKmcqaS1wKnIqdStlKmcqdStvKnIqeS1lKmEqeSkqYix0WzddPShvKmgqaS1jKmEqaStjKnIqdS1lKmgqdS1vKnIqZitlKmEqZikqYix0WzhdPV8qYix0WzldPShwKmwqaS1jKmQqaS1wKm4qZitlKmQqZitjKm4qeS1lKmwqeSkqYix0WzEwXT0obypkKmktcCpzKmkrcCpuKnUtZSpkKnUtbypuKnkrZSpzKnkpKmIsdFsxMV09KGMqcyppLW8qbCppLWMqbip1K2UqbCp1K28qbipmLWUqcypmKSpiLHRbMTJdPXgqYix0WzEzXT0oYypkKnItcCpsKnIrcCpuKmgtZSpkKmgtYypuKmcrZSpsKmcpKmIsdFsxNF09KHAqcypyLW8qZCpyLXAqbiphK2UqZCphK28qbipnLWUqcypnKSpiLHRbMTVdPShvKmwqci1jKnMqcitjKm4qYS1lKmwqYS1vKm4qaCtlKnMqaCkqYix0aGlzfXNjYWxlKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQueCxyPXQueSxpPXQuejtyZXR1cm4gZVswXSo9bixlWzRdKj1yLGVbOF0qPWksZVsxXSo9bixlWzVdKj1yLGVbOV0qPWksZVsyXSo9bixlWzZdKj1yLGVbMTBdKj1pLGVbM10qPW4sZVs3XSo9cixlWzExXSo9aSx0aGlzfWdldE1heFNjYWxlT25BeGlzKCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSp0WzBdK3RbMV0qdFsxXSt0WzJdKnRbMl0sbj10WzRdKnRbNF0rdFs1XSp0WzVdK3RbNl0qdFs2XSxyPXRbOF0qdFs4XSt0WzldKnRbOV0rdFsxMF0qdFsxMF07cmV0dXJuIE1hdGguc3FydChNYXRoLm1heChlLG4scikpfW1ha2VUcmFuc2xhdGlvbih0LGUsbil7cmV0dXJuIHQuaXNWZWN0b3IzP3RoaXMuc2V0KDEsMCwwLHQueCwwLDEsMCx0LnksMCwwLDEsdC56LDAsMCwwLDEpOnRoaXMuc2V0KDEsMCwwLHQsMCwxLDAsZSwwLDAsMSxuLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWCh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCxlLC1uLDAsMCxuLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblkodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLDAsbiwwLDAsMSwwLDAsLW4sMCxlLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25aKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtbiwwLDAsbixlLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uQXhpcyh0LGUpe2NvbnN0IG49TWF0aC5jb3MoZSkscj1NYXRoLnNpbihlKSxpPTEtbixvPXQueCxzPXQueSxhPXQueix1PWkqbyxjPWkqcztyZXR1cm4gdGhpcy5zZXQodSpvK24sdSpzLXIqYSx1KmErcipzLDAsdSpzK3IqYSxjKnMrbixjKmEtcipvLDAsdSphLXIqcyxjKmErcipvLGkqYSphK24sMCwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUsbil7cmV0dXJuIHRoaXMuc2V0KHQsMCwwLDAsMCxlLDAsMCwwLDAsbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNoZWFyKHQsZSxuLHIsaSxvKXtyZXR1cm4gdGhpcy5zZXQoMSxuLGksMCx0LDEsbywwLGUsciwxLDAsMCwwLDAsMSksdGhpc31jb21wb3NlKHQsZSxuKXtjb25zdCByPXRoaXMuZWxlbWVudHMsaT1lLl94LG89ZS5feSxzPWUuX3osYT1lLl93LHU9aStpLGM9bytvLGw9cytzLGg9aSp1LGY9aSpjLHA9aSpsLGQ9bypjLGc9bypsLHk9cypsLG09YSp1LHY9YSpjLF89YSpsLHg9bi54LHc9bi55LGI9bi56O3JldHVybiByWzBdPSgxLShkK3kpKSp4LHJbMV09KGYrXykqeCxyWzJdPShwLXYpKngsclszXT0wLHJbNF09KGYtXykqdyxyWzVdPSgxLShoK3kpKSp3LHJbNl09KGcrbSkqdyxyWzddPTAscls4XT0ocCt2KSpiLHJbOV09KGctbSkqYixyWzEwXT0oMS0oaCtkKSkqYixyWzExXT0wLHJbMTJdPXQueCxyWzEzXT10LnksclsxNF09dC56LHJbMTVdPTEsdGhpc31kZWNvbXBvc2UodCxlLG4pe2NvbnN0IHI9dGhpcy5lbGVtZW50cztsZXQgaT1LaC5zZXQoclswXSxyWzFdLHJbMl0pLmxlbmd0aCgpO2NvbnN0IG89S2guc2V0KHJbNF0scls1XSxyWzZdKS5sZW5ndGgoKSxzPUtoLnNldChyWzhdLHJbOV0sclsxMF0pLmxlbmd0aCgpO3RoaXMuZGV0ZXJtaW5hbnQoKTwwJiYoaT0taSksdC54PXJbMTJdLHQueT1yWzEzXSx0Lno9clsxNF0sSmguY29weSh0aGlzKTtjb25zdCBhPTEvaSx1PTEvbyxjPTEvcztyZXR1cm4gSmguZWxlbWVudHNbMF0qPWEsSmguZWxlbWVudHNbMV0qPWEsSmguZWxlbWVudHNbMl0qPWEsSmguZWxlbWVudHNbNF0qPXUsSmguZWxlbWVudHNbNV0qPXUsSmguZWxlbWVudHNbNl0qPXUsSmguZWxlbWVudHNbOF0qPWMsSmguZWxlbWVudHNbOV0qPWMsSmguZWxlbWVudHNbMTBdKj1jLGUuc2V0RnJvbVJvdGF0aW9uTWF0cml4KEpoKSxuLng9aSxuLnk9byxuLno9cyx0aGlzfW1ha2VQZXJzcGVjdGl2ZSh0LGUsbixyLGksbyxzPUhsKXtjb25zdCBhPXRoaXMuZWxlbWVudHMsdT0yKmkvKGUtdCksYz0yKmkvKG4tciksbD0oZSt0KS8oZS10KSxoPShuK3IpLyhuLXIpO2xldCBmLHA7aWYocz09PUhsKWY9LShvK2kpLyhvLWkpLHA9LTIqbyppLyhvLWkpO2Vsc2V7aWYoMjAwMSE9PXMpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK3MpO2Y9LW8vKG8taSkscD0tbyppLyhvLWkpfXJldHVybiBhWzBdPXUsYVs0XT0wLGFbOF09bCxhWzEyXT0wLGFbMV09MCxhWzVdPWMsYVs5XT1oLGFbMTNdPTAsYVsyXT0wLGFbNl09MCxhWzEwXT1mLGFbMTRdPXAsYVszXT0wLGFbN109MCxhWzExXT0tMSxhWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUsbixyLGksbyxzPUhsKXtjb25zdCBhPXRoaXMuZWxlbWVudHMsdT0xLyhlLXQpLGM9MS8obi1yKSxsPTEvKG8taSksaD0oZSt0KSp1LGY9KG4rcikqYztsZXQgcCxkO2lmKHM9PT1IbClwPShvK2kpKmwsZD0tMipsO2Vsc2V7aWYoMjAwMSE9PXMpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VPcnRob2dyYXBoaWMoKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogIitzKTtwPWkqbCxkPS0xKmx9cmV0dXJuIGFbMF09Mip1LGFbNF09MCxhWzhdPTAsYVsxMl09LWgsYVsxXT0wLGFbNV09MipjLGFbOV09MCxhWzEzXT0tZixhWzJdPTAsYVs2XT0wLGFbMTBdPWQsYVsxNF09LXAsYVszXT0wLGFbN109MCxhWzExXT0wLGFbMTVdPTEsdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHQ9MDt0PDE2O3QrKylpZihlW3RdIT09blt0XSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248MTY7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHRbZSs5XT1uWzldLHRbZSsxMF09blsxMF0sdFtlKzExXT1uWzExXSx0W2UrMTJdPW5bMTJdLHRbZSsxM109blsxM10sdFtlKzE0XT1uWzE0XSx0W2UrMTVdPW5bMTVdLHR9fWNvbnN0IEtoPW5ldyB4aCxKaD1uZXcgWmgsUWg9bmV3IHhoKDAsMCwwKSwkaD1uZXcgeGgoMSwxLDEpLHRmPW5ldyB4aCxlZj1uZXcgeGgsbmY9bmV3IHhoLHJmPW5ldyBaaCxvZj1uZXcgX2g7Y2xhc3Mgc2Z7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscj1zZi5ERUZBVUxUX09SREVSKXt0aGlzLmlzRXVsZXI9ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9cn1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgb3JkZXIoKXtyZXR1cm4gdGhpcy5fb3JkZXJ9c2V0IG9yZGVyKHQpe3RoaXMuX29yZGVyPXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixyPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9cix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10Ll94LHRoaXMuX3k9dC5feSx0aGlzLl96PXQuX3osdGhpcy5fb3JkZXI9dC5fb3JkZXIsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQsZT10aGlzLl9vcmRlcixuPSEwKXtjb25zdCByPXQuZWxlbWVudHMsaT1yWzBdLG89cls0XSxzPXJbOF0sYT1yWzFdLHU9cls1XSxjPXJbOV0sbD1yWzJdLGg9cls2XSxmPXJbMTBdO3N3aXRjaChlKXtjYXNlIlhZWiI6dGhpcy5feT1NYXRoLmFzaW4oUWwocywtMSwxKSksTWF0aC5hYnMocyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtYyxmKSx0aGlzLl96PU1hdGguYXRhbjIoLW8saSkpOih0aGlzLl94PU1hdGguYXRhbjIoaCx1KSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PU1hdGguYXNpbigtUWwoYywtMSwxKSksTWF0aC5hYnMoYyk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihzLGYpLHRoaXMuX3o9TWF0aC5hdGFuMihhLHUpKToodGhpcy5feT1NYXRoLmF0YW4yKC1sLGkpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKFFsKGgsLTEsMSkpLE1hdGguYWJzKGgpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIoLWwsZiksdGhpcy5fej1NYXRoLmF0YW4yKC1vLHUpKToodGhpcy5feT0wLHRoaXMuX3o9TWF0aC5hdGFuMihhLGkpKTticmVhaztjYXNlIlpZWCI6dGhpcy5feT1NYXRoLmFzaW4oLVFsKGwsLTEsMSkpLE1hdGguYWJzKGwpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoaCxmKSx0aGlzLl96PU1hdGguYXRhbjIoYSxpKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLW8sdSkpO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl96PU1hdGguYXNpbihRbChhLC0xLDEpKSxNYXRoLmFicyhhKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1jLHUpLHRoaXMuX3k9TWF0aC5hdGFuMigtbCxpKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIocyxmKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC1RbChvLC0xLDEpKSxNYXRoLmFicyhvKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGgsdSksdGhpcy5feT1NYXRoLmF0YW4yKHMsaSkpOih0aGlzLl94PU1hdGguYXRhbjIoLWMsZiksdGhpcy5feT0wKX1yZXR1cm4gdGhpcy5fb3JkZXI9ZSwhMD09PW4mJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21RdWF0ZXJuaW9uKHQsZSxuKXtyZXR1cm4gcmYubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCksdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgocmYsZSxuKX1zZXRGcm9tVmVjdG9yMyh0LGU9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLnNldCh0LngsdC55LHQueixlKX1yZW9yZGVyKHQpe3JldHVybiBvZi5zZXRGcm9tRXVsZXIodGhpcyksdGhpcy5zZXRGcm9tUXVhdGVybmlvbihvZix0KX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX29yZGVyPT09dGhpcy5fb3JkZXJ9ZnJvbUFycmF5KHQpe3JldHVybiB0aGlzLl94PXRbMF0sdGhpcy5feT10WzFdLHRoaXMuX3o9dFsyXSx2b2lkIDAhPT10WzNdJiYodGhpcy5fb3JkZXI9dFszXSksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5feCx0W2UrMV09dGhpcy5feSx0W2UrMl09dGhpcy5feix0W2UrM109dGhpcy5fb3JkZXIsdH1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX29yZGVyfX1zZi5ERUZBVUxUX09SREVSPSJYWVoiO2NsYXNzIGFme2NvbnN0cnVjdG9yKCl7dGhpcy5tYXNrPTF9c2V0KHQpe3RoaXMubWFzaz0xPDx0Pj4+MH1lbmFibGUodCl7dGhpcy5tYXNrfD0xPDx0fWVuYWJsZUFsbCgpe3RoaXMubWFzaz0tMX10b2dnbGUodCl7dGhpcy5tYXNrXj0xPDx0fWRpc2FibGUodCl7dGhpcy5tYXNrJj1+KDE8PHQpfWRpc2FibGVBbGwoKXt0aGlzLm1hc2s9MH10ZXN0KHQpe3JldHVybiEhKHRoaXMubWFzayZ0Lm1hc2spfWlzRW5hYmxlZCh0KXtyZXR1cm4hISh0aGlzLm1hc2smMTw8dCl9fWxldCB1Zj0wO2NvbnN0IGNmPW5ldyB4aCxsZj1uZXcgX2gsaGY9bmV3IFpoLGZmPW5ldyB4aCxwZj1uZXcgeGgsZGY9bmV3IHhoLGdmPW5ldyBfaCx5Zj1uZXcgeGgoMSwwLDApLG1mPW5ldyB4aCgwLDEsMCksdmY9bmV3IHhoKDAsMCwxKSxfZj17dHlwZToiYWRkZWQifSx4Zj17dHlwZToicmVtb3ZlZCJ9LHdmPXt0eXBlOiJjaGlsZGFkZGVkIixjaGlsZDpudWxsfSxiZj17dHlwZToiY2hpbGRyZW1vdmVkIixjaGlsZDpudWxsfTtjbGFzcyBEZiBleHRlbmRzIFpse2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzT2JqZWN0M0Q9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6dWYrK30pLHRoaXMudXVpZD1KbCgpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik9iamVjdDNEIix0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49W10sdGhpcy51cD1EZi5ERUZBVUxUX1VQLmNsb25lKCk7Y29uc3QgdD1uZXcgeGgsZT1uZXcgc2Ysbj1uZXcgX2gscj1uZXcgeGgoMSwxLDEpO2UuX29uQ2hhbmdlKChmdW5jdGlvbigpe24uc2V0RnJvbUV1bGVyKGUsITEpfSkpLG4uX29uQ2hhbmdlKChmdW5jdGlvbigpe2Uuc2V0RnJvbVF1YXRlcm5pb24obix2b2lkIDAsITEpfSkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp0fSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bn0sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnJ9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IFpofSxub3JtYWxNYXRyaXg6e3ZhbHVlOm5ldyBlaH19KSx0aGlzLm1hdHJpeD1uZXcgWmgsdGhpcy5tYXRyaXhXb3JsZD1uZXcgWmgsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPURmLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPURmLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0aGlzLmxheWVycz1uZXcgYWYsdGhpcy52aXNpYmxlPSEwLHRoaXMuY2FzdFNoYWRvdz0hMSx0aGlzLnJlY2VpdmVTaGFkb3c9ITEsdGhpcy5mcnVzdHVtQ3VsbGVkPSEwLHRoaXMucmVuZGVyT3JkZXI9MCx0aGlzLmFuaW1hdGlvbnM9W10sdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVNoYWRvdygpe31vbkFmdGVyU2hhZG93KCl7fW9uQmVmb3JlUmVuZGVyKCl7fW9uQWZ0ZXJSZW5kZXIoKXt9YXBwbHlNYXRyaXg0KHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSh0KSx0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodCksdGhpc31zZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUodCxlKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0LGUpfXNldFJvdGF0aW9uRnJvbUV1bGVyKHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIodCwhMCl9c2V0Um90YXRpb25Gcm9tTWF0cml4KHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodCl9c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbih0KXt0aGlzLnF1YXRlcm5pb24uY29weSh0KX1yb3RhdGVPbkF4aXModCxlKXtyZXR1cm4gbGYuc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShsZiksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiBsZi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KGxmKSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKHlmLHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKG1mLHQpfXJvdGF0ZVoodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKHZmLHQpfXRyYW5zbGF0ZU9uQXhpcyh0LGUpe3JldHVybiBjZi5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKGNmLm11bHRpcGx5U2NhbGFyKGUpKSx0aGlzfXRyYW5zbGF0ZVgodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKHlmLHQpfXRyYW5zbGF0ZVkodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKG1mLHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKHZmLHQpfWxvY2FsVG9Xb3JsZCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9d29ybGRUb0xvY2FsKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NChoZi5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQodCxlLG4pe3QuaXNWZWN0b3IzP2ZmLmNvcHkodCk6ZmYuc2V0KHQsZSxuKTtjb25zdCByPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHBmLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/aGYubG9va0F0KHBmLGZmLHRoaXMudXApOmhmLmxvb2tBdChmZixwZix0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KGhmKSxyJiYoaGYuZXh0cmFjdFJvdGF0aW9uKHIubWF0cml4V29ybGQpLGxmLnNldEZyb21Sb3RhdGlvbk1hdHJpeChoZiksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KGxmLmludmVydCgpKSl9YWRkKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCB0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl0aGlzLmFkZChhcmd1bWVudHNbdF0pO3JldHVybiB0aGlzfXJldHVybiB0PT09dGhpc3x8dCYmdC5pc09iamVjdDNEJiYodC5yZW1vdmVGcm9tUGFyZW50KCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC5kaXNwYXRjaEV2ZW50KF9mKSx3Zi5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudCh3Ziksd2YuY2hpbGQ9bnVsbCksdGhpc31yZW1vdmUodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1t0XSk7cmV0dXJuIHRoaXN9Y29uc3QgZT10aGlzLmNoaWxkcmVuLmluZGV4T2YodCk7cmV0dXJuLTEhPT1lJiYodC5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuLnNwbGljZShlLDEpLHQuZGlzcGF0Y2hFdmVudCh4ZiksYmYuY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoYmYpLGJmLmNoaWxkPW51bGwpLHRoaXN9cmVtb3ZlRnJvbVBhcmVudCgpe2NvbnN0IHQ9dGhpcy5wYXJlbnQ7cmV0dXJuIG51bGwhPT10JiZ0LnJlbW92ZSh0aGlzKSx0aGlzfWNsZWFyKCl7cmV0dXJuIHRoaXMucmVtb3ZlKC4uLnRoaXMuY2hpbGRyZW4pfWF0dGFjaCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksaGYuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSxudWxsIT09dC5wYXJlbnQmJih0LnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksaGYubXVsdGlwbHkodC5wYXJlbnQubWF0cml4V29ybGQpKSx0LmFwcGx5TWF0cml4NChoZiksdC5yZW1vdmVGcm9tUGFyZW50KCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCksdC5kaXNwYXRjaEV2ZW50KF9mKSx3Zi5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudCh3Ziksd2YuY2hpbGQ9bnVsbCx0aGlzfWdldE9iamVjdEJ5SWQodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgiaWQiLHQpfWdldE9iamVjdEJ5TmFtZSh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIix0KX1nZXRPYmplY3RCeVByb3BlcnR5KHQsZSl7aWYodGhpc1t0XT09PWUpcmV0dXJuIHRoaXM7Zm9yKGxldCBuPTAscj10aGlzLmNoaWxkcmVuLmxlbmd0aDtuPHI7bisrKXtjb25zdCByPXRoaXMuY2hpbGRyZW5bbl0uZ2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpO2lmKHZvaWQgMCE9PXIpcmV0dXJuIHJ9fWdldE9iamVjdHNCeVByb3BlcnR5KHQsZSxuPVtdKXt0aGlzW3RdPT09ZSYmbi5wdXNoKHRoaXMpO2NvbnN0IHI9dGhpcy5jaGlsZHJlbjtmb3IobGV0IGk9MCxvPXIubGVuZ3RoO2k8bztpKyspcltpXS5nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUsbik7cmV0dXJuIG59Z2V0V29ybGRQb3NpdGlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9Z2V0V29ybGRRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShwZix0LGRmKSx0fWdldFdvcmxkU2NhbGUodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKHBmLGdmLHQpLHR9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldChlWzhdLGVbOV0sZVsxMF0pLm5vcm1hbGl6ZSgpfXJheWNhc3QoKXt9dHJhdmVyc2UodCl7dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0udHJhdmVyc2UodCl9dHJhdmVyc2VWaXNpYmxlKHQpe2lmKCExPT09dGhpcy52aXNpYmxlKXJldHVybjt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspZVtuXS50cmF2ZXJzZVZpc2libGUodCl9dHJhdmVyc2VBbmNlc3RvcnModCl7Y29uc3QgZT10aGlzLnBhcmVudDtudWxsIT09ZSYmKHQoZSksZS50cmF2ZXJzZUFuY2VzdG9ycyh0KSl9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9dXBkYXRlTWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLCh0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGV8fHQpJiYoITA9PT10aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSYmKG51bGw9PT10aGlzLnBhcmVudD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0PSEwKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0udXBkYXRlTWF0cml4V29ybGQodCl9dXBkYXRlV29ybGRNYXRyaXgodCxlKXtjb25zdCBuPXRoaXMucGFyZW50O2lmKCEwPT09dCYmbnVsbCE9PW4mJm4udXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSwhMD09PXRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlJiYobnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSksITA9PT1lKXtjb25zdCB0PXRoaXMuY2hpbGRyZW47Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRbZV0udXBkYXRlV29ybGRNYXRyaXgoITEsITApfX10b0pTT04odCl7Y29uc3QgZT12b2lkIDA9PT10fHwic3RyaW5nIj09dHlwZW9mIHQsbj17fTtlJiYodD17Z2VvbWV0cmllczp7fSxtYXRlcmlhbHM6e30sdGV4dHVyZXM6e30saW1hZ2VzOnt9LHNoYXBlczp7fSxza2VsZXRvbnM6e30sYW5pbWF0aW9uczp7fSxub2Rlczp7fX0sbi5tZXRhZGF0YT17dmVyc2lvbjo0LjYsdHlwZToiT2JqZWN0IixnZW5lcmF0b3I6Ik9iamVjdDNELnRvSlNPTiJ9KTtjb25zdCByPXt9O2Z1bmN0aW9uIGkoZSxuKXtyZXR1cm4gdm9pZCAwPT09ZVtuLnV1aWRdJiYoZVtuLnV1aWRdPW4udG9KU09OKHQpKSxuLnV1aWR9aWYoci51dWlkPXRoaXMudXVpZCxyLnR5cGU9dGhpcy50eXBlLCIiIT09dGhpcy5uYW1lJiYoci5uYW1lPXRoaXMubmFtZSksITA9PT10aGlzLmNhc3RTaGFkb3cmJihyLmNhc3RTaGFkb3c9ITApLCEwPT09dGhpcy5yZWNlaXZlU2hhZG93JiYoci5yZWNlaXZlU2hhZG93PSEwKSwhMT09PXRoaXMudmlzaWJsZSYmKHIudmlzaWJsZT0hMSksITE9PT10aGlzLmZydXN0dW1DdWxsZWQmJihyLmZydXN0dW1DdWxsZWQ9ITEpLDAhPT10aGlzLnJlbmRlck9yZGVyJiYoci5yZW5kZXJPcmRlcj10aGlzLnJlbmRlck9yZGVyKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHIudXNlckRhdGE9dGhpcy51c2VyRGF0YSksci5sYXllcnM9dGhpcy5sYXllcnMubWFzayxyLm1hdHJpeD10aGlzLm1hdHJpeC50b0FycmF5KCksci51cD10aGlzLnVwLnRvQXJyYXkoKSwhMT09PXRoaXMubWF0cml4QXV0b1VwZGF0ZSYmKHIubWF0cml4QXV0b1VwZGF0ZT0hMSksdGhpcy5pc0luc3RhbmNlZE1lc2gmJihyLnR5cGU9Ikluc3RhbmNlZE1lc2giLHIuY291bnQ9dGhpcy5jb3VudCxyLmluc3RhbmNlTWF0cml4PXRoaXMuaW5zdGFuY2VNYXRyaXgudG9KU09OKCksbnVsbCE9PXRoaXMuaW5zdGFuY2VDb2xvciYmKHIuaW5zdGFuY2VDb2xvcj10aGlzLmluc3RhbmNlQ29sb3IudG9KU09OKCkpKSx0aGlzLmlzQmF0Y2hlZE1lc2gmJihyLnR5cGU9IkJhdGNoZWRNZXNoIixyLnBlck9iamVjdEZydXN0dW1DdWxsZWQ9dGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkLHIuc29ydE9iamVjdHM9dGhpcy5zb3J0T2JqZWN0cyxyLmRyYXdSYW5nZXM9dGhpcy5fZHJhd1JhbmdlcyxyLnJlc2VydmVkUmFuZ2VzPXRoaXMuX3Jlc2VydmVkUmFuZ2VzLHIudmlzaWJpbGl0eT10aGlzLl92aXNpYmlsaXR5LHIuYWN0aXZlPXRoaXMuX2FjdGl2ZSxyLmJvdW5kcz10aGlzLl9ib3VuZHMubWFwKCh0PT4oe2JveEluaXRpYWxpemVkOnQuYm94SW5pdGlhbGl6ZWQsYm94TWluOnQuYm94Lm1pbi50b0FycmF5KCksYm94TWF4OnQuYm94Lm1heC50b0FycmF5KCksc3BoZXJlSW5pdGlhbGl6ZWQ6dC5zcGhlcmVJbml0aWFsaXplZCxzcGhlcmVSYWRpdXM6dC5zcGhlcmUucmFkaXVzLHNwaGVyZUNlbnRlcjp0LnNwaGVyZS5jZW50ZXIudG9BcnJheSgpfSkpKSxyLm1heEluc3RhbmNlQ291bnQ9dGhpcy5fbWF4SW5zdGFuY2VDb3VudCxyLm1heFZlcnRleENvdW50PXRoaXMuX21heFZlcnRleENvdW50LHIubWF4SW5kZXhDb3VudD10aGlzLl9tYXhJbmRleENvdW50LHIuZ2VvbWV0cnlJbml0aWFsaXplZD10aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkLHIuZ2VvbWV0cnlDb3VudD10aGlzLl9nZW9tZXRyeUNvdW50LHIubWF0cmljZXNUZXh0dXJlPXRoaXMuX21hdHJpY2VzVGV4dHVyZS50b0pTT04odCksbnVsbCE9PXRoaXMuX2NvbG9yc1RleHR1cmUmJihyLmNvbG9yc1RleHR1cmU9dGhpcy5fY29sb3JzVGV4dHVyZS50b0pTT04odCkpLG51bGwhPT10aGlzLmJvdW5kaW5nU3BoZXJlJiYoci5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOnIuYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6ci5ib3VuZGluZ1NwaGVyZS5yYWRpdXN9KSxudWxsIT09dGhpcy5ib3VuZGluZ0JveCYmKHIuYm91bmRpbmdCb3g9e21pbjpyLmJvdW5kaW5nQm94Lm1pbi50b0FycmF5KCksbWF4OnIuYm91bmRpbmdCb3gubWF4LnRvQXJyYXkoKX0pKSx0aGlzLmlzU2NlbmUpdGhpcy5iYWNrZ3JvdW5kJiYodGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3I/ci5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oKTp0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlJiYoci5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04odCkudXVpZCkpLHRoaXMuZW52aXJvbm1lbnQmJnRoaXMuZW52aXJvbm1lbnQuaXNUZXh0dXJlJiYhMCE9PXRoaXMuZW52aXJvbm1lbnQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlJiYoci5lbnZpcm9ubWVudD10aGlzLmVudmlyb25tZW50LnRvSlNPTih0KS51dWlkKTtlbHNlIGlmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7ci5nZW9tZXRyeT1pKHQuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTtjb25zdCBlPXRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztpZih2b2lkIDAhPT1lJiZ2b2lkIDAhPT1lLnNoYXBlcyl7Y29uc3Qgbj1lLnNoYXBlcztpZihBcnJheS5pc0FycmF5KG4pKWZvcihsZXQgZT0wLHI9bi5sZW5ndGg7ZTxyO2UrKyl7Y29uc3Qgcj1uW2VdO2kodC5zaGFwZXMscil9ZWxzZSBpKHQuc2hhcGVzLG4pfX1pZih0aGlzLmlzU2tpbm5lZE1lc2gmJihyLmJpbmRNb2RlPXRoaXMuYmluZE1vZGUsci5iaW5kTWF0cml4PXRoaXMuYmluZE1hdHJpeC50b0FycmF5KCksdm9pZCAwIT09dGhpcy5za2VsZXRvbiYmKGkodC5za2VsZXRvbnMsdGhpcy5za2VsZXRvbiksci5za2VsZXRvbj10aGlzLnNrZWxldG9uLnV1aWQpKSx2b2lkIDAhPT10aGlzLm1hdGVyaWFsKWlmKEFycmF5LmlzQXJyYXkodGhpcy5tYXRlcmlhbCkpe2NvbnN0IGU9W107Zm9yKGxldCBuPTAscj10aGlzLm1hdGVyaWFsLmxlbmd0aDtuPHI7bisrKWUucHVzaChpKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbbl0pKTtyLm1hdGVyaWFsPWV9ZWxzZSByLm1hdGVyaWFsPWkodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYodGhpcy5jaGlsZHJlbi5sZW5ndGg+MCl7ci5jaGlsZHJlbj1bXTtmb3IobGV0IGU9MDtlPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2UrKylyLmNoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltlXS50b0pTT04odCkub2JqZWN0KX1pZih0aGlzLmFuaW1hdGlvbnMubGVuZ3RoPjApe3IuYW5pbWF0aW9ucz1bXTtmb3IobGV0IGU9MDtlPHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7ZSsrKXtjb25zdCBuPXRoaXMuYW5pbWF0aW9uc1tlXTtyLmFuaW1hdGlvbnMucHVzaChpKHQuYW5pbWF0aW9ucyxuKSl9fWlmKGUpe2NvbnN0IGU9byh0Lmdlb21ldHJpZXMpLHI9byh0Lm1hdGVyaWFscyksaT1vKHQudGV4dHVyZXMpLHM9byh0LmltYWdlcyksYT1vKHQuc2hhcGVzKSx1PW8odC5za2VsZXRvbnMpLGM9byh0LmFuaW1hdGlvbnMpLGw9byh0Lm5vZGVzKTtlLmxlbmd0aD4wJiYobi5nZW9tZXRyaWVzPWUpLHIubGVuZ3RoPjAmJihuLm1hdGVyaWFscz1yKSxpLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1pKSxzLmxlbmd0aD4wJiYobi5pbWFnZXM9cyksYS5sZW5ndGg+MCYmKG4uc2hhcGVzPWEpLHUubGVuZ3RoPjAmJihuLnNrZWxldG9ucz11KSxjLmxlbmd0aD4wJiYobi5hbmltYXRpb25zPWMpLGwubGVuZ3RoPjAmJihuLm5vZGVzPWwpfXJldHVybiBuLm9iamVjdD1yLG47ZnVuY3Rpb24gbyh0KXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIGluIHQpe2NvbnN0IHI9dFtuXTtkZWxldGUgci5tZXRhZGF0YSxlLnB1c2gocil9cmV0dXJuIGV9fWNsb25lKHQpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzLHQpfWNvcHkodCxlPSEwKXtpZih0aGlzLm5hbWU9dC5uYW1lLHRoaXMudXAuY29weSh0LnVwKSx0aGlzLnBvc2l0aW9uLmNvcHkodC5wb3NpdGlvbiksdGhpcy5yb3RhdGlvbi5vcmRlcj10LnJvdGF0aW9uLm9yZGVyLHRoaXMucXVhdGVybmlvbi5jb3B5KHQucXVhdGVybmlvbiksdGhpcy5zY2FsZS5jb3B5KHQuc2NhbGUpLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeFdvcmxkKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPXQubWF0cml4V29ybGRBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT10Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsdGhpcy5sYXllcnMubWFzaz10LmxheWVycy5tYXNrLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy5jYXN0U2hhZG93PXQuY2FzdFNoYWRvdyx0aGlzLnJlY2VpdmVTaGFkb3c9dC5yZWNlaXZlU2hhZG93LHRoaXMuZnJ1c3R1bUN1bGxlZD10LmZydXN0dW1DdWxsZWQsdGhpcy5yZW5kZXJPcmRlcj10LnJlbmRlck9yZGVyLHRoaXMuYW5pbWF0aW9ucz10LmFuaW1hdGlvbnMuc2xpY2UoKSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLCEwPT09ZSlmb3IobGV0IGU9MDtlPHQuY2hpbGRyZW4ubGVuZ3RoO2UrKyl7Y29uc3Qgbj10LmNoaWxkcmVuW2VdO3RoaXMuYWRkKG4uY2xvbmUoKSl9cmV0dXJuIHRoaXN9fURmLkRFRkFVTFRfVVA9bmV3IHhoKDAsMSwwKSxEZi5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURT0hMCxEZi5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURT0hMDtjb25zdCBFZj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSxDZj17aDowLHM6MCxsOjB9LFNmPXtoOjAsczowLGw6MH07ZnVuY3Rpb24gQWYodCxlLG4pe3JldHVybiBuPDAmJihuKz0xKSxuPjEmJihuLT0xKSxuPDEvNj90KzYqKGUtdCkqbjpuPC41P2U6bjwyLzM/dCs2KihlLXQpKigyLzMtbik6dH1jbGFzcyBOZntjb25zdHJ1Y3Rvcih0LGUsbil7cmV0dXJuIHRoaXMuaXNDb2xvcj0hMCx0aGlzLnI9MSx0aGlzLmc9MSx0aGlzLmI9MSx0aGlzLnNldCh0LGUsbil9c2V0KHQsZSxuKXtpZih2b2lkIDA9PT1lJiZ2b2lkIDA9PT1uKXtjb25zdCBlPXQ7ZSYmZS5pc0NvbG9yP3RoaXMuY29weShlKToibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5zZXRIZXgoZSk6InN0cmluZyI9PXR5cGVvZiBlJiZ0aGlzLnNldFN0eWxlKGUpfWVsc2UgdGhpcy5zZXRSR0IodCxlLG4pO3JldHVybiB0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPXQsdGhpcy5iPXQsdGhpc31zZXRIZXgodCxlPVVsKXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLHRoaXMucj0odD4+MTYmMjU1KS8yNTUsdGhpcy5nPSh0Pj44JjI1NSkvMjU1LHRoaXMuYj0oMjU1JnQpLzI1NSx1aC50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsZSksdGhpc31zZXRSR0IodCxlLG4scj11aC53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz1lLHRoaXMuYj1uLHVoLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxyKSx0aGlzfXNldEhTTCh0LGUsbixyPXVoLndvcmtpbmdDb2xvclNwYWNlKXtpZih0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQlZStlKSVlfSh0LDEpLGU9UWwoZSwwLDEpLG49UWwobiwwLDEpLDA9PT1lKXRoaXMucj10aGlzLmc9dGhpcy5iPW47ZWxzZXtjb25zdCByPW48PS41P24qKDErZSk6bitlLW4qZSxpPTIqbi1yO3RoaXMucj1BZihpLHIsdCsxLzMpLHRoaXMuZz1BZihpLHIsdCksdGhpcy5iPUFmKGkscix0LTEvMyl9cmV0dXJuIHVoLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxyKSx0aGlzfXNldFN0eWxlKHQsZT1VbCl7ZnVuY3Rpb24gbih0KXt2b2lkIDAhPT10JiZwYXJzZUZsb2F0KHQpfWxldCByO2lmKHI9L14oXHcrKVwoKFteXCldKilcKS8uZXhlYyh0KSl7bGV0IHQ7Y29uc3QgaT1yWzFdLG89clsyXTtzd2l0Y2goaSl7Y2FzZSJyZ2IiOmNhc2UicmdiYSI6aWYodD0vXlxzKihcZCspXHMqLFxzKihcZCspXHMqLFxzKihcZCspXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKG8pKXJldHVybiBuKHRbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDI1NSxwYXJzZUludCh0WzFdLDEwKSkvMjU1LE1hdGgubWluKDI1NSxwYXJzZUludCh0WzJdLDEwKSkvMjU1LE1hdGgubWluKDI1NSxwYXJzZUludCh0WzNdLDEwKSkvMjU1LGUpO2lmKHQ9L15ccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhvKSlyZXR1cm4gbih0WzRdKSx0aGlzLnNldFJHQihNYXRoLm1pbigxMDAscGFyc2VJbnQodFsxXSwxMCkpLzEwMCxNYXRoLm1pbigxMDAscGFyc2VJbnQodFsyXSwxMCkpLzEwMCxNYXRoLm1pbigxMDAscGFyc2VJbnQodFszXSwxMCkpLzEwMCxlKTticmVhaztjYXNlImhzbCI6Y2FzZSJoc2xhIjppZih0PS9eXHMqKFxkKlwuP1xkKylccyosXHMqKFxkKlwuP1xkKylcJVxzKixccyooXGQqXC4/XGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKG8pKXJldHVybiBuKHRbNF0pLHRoaXMuc2V0SFNMKHBhcnNlRmxvYXQodFsxXSkvMzYwLHBhcnNlRmxvYXQodFsyXSkvMTAwLHBhcnNlRmxvYXQodFszXSkvMTAwLGUpfX1lbHNlIGlmKHI9L15cIyhbQS1GYS1mXGRdKykkLy5leGVjKHQpKXtjb25zdCB0PXJbMV0sbj10Lmxlbmd0aDtpZigzPT09bilyZXR1cm4gdGhpcy5zZXRSR0IocGFyc2VJbnQodC5jaGFyQXQoMCksMTYpLzE1LHBhcnNlSW50KHQuY2hhckF0KDEpLDE2KS8xNSxwYXJzZUludCh0LmNoYXJBdCgyKSwxNikvMTUsZSk7aWYoNj09PW4pcmV0dXJuIHRoaXMuc2V0SGV4KHBhcnNlSW50KHQsMTYpLGUpfWVsc2UgaWYodCYmdC5sZW5ndGg+MClyZXR1cm4gdGhpcy5zZXRDb2xvck5hbWUodCxlKTtyZXR1cm4gdGhpc31zZXRDb2xvck5hbWUodCxlPVVsKXtjb25zdCBuPUVmW3QudG9Mb3dlckNhc2UoKV07cmV0dXJuIHZvaWQgMCE9PW4mJnRoaXMuc2V0SGV4KG4sZSksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsdGhpcy5nLHRoaXMuYil9Y29weSh0KXtyZXR1cm4gdGhpcy5yPXQucix0aGlzLmc9dC5nLHRoaXMuYj10LmIsdGhpc31jb3B5U1JHQlRvTGluZWFyKHQpe3JldHVybiB0aGlzLnI9Y2godC5yKSx0aGlzLmc9Y2godC5nKSx0aGlzLmI9Y2godC5iKSx0aGlzfWNvcHlMaW5lYXJUb1NSR0IodCl7cmV0dXJuIHRoaXMucj1saCh0LnIpLHRoaXMuZz1saCh0LmcpLHRoaXMuYj1saCh0LmIpLHRoaXN9Y29udmVydFNSR0JUb0xpbmVhcigpe3JldHVybiB0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyksdGhpc31jb252ZXJ0TGluZWFyVG9TUkdCKCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvU1JHQih0aGlzKSx0aGlzfWdldEhleCh0PVVsKXtyZXR1cm4gdWguZnJvbVdvcmtpbmdDb2xvclNwYWNlKElmLmNvcHkodGhpcyksdCksNjU1MzYqTWF0aC5yb3VuZChRbCgyNTUqSWYuciwwLDI1NSkpKzI1NipNYXRoLnJvdW5kKFFsKDI1NSpJZi5nLDAsMjU1KSkrTWF0aC5yb3VuZChRbCgyNTUqSWYuYiwwLDI1NSkpfWdldEhleFN0cmluZyh0PVVsKXtyZXR1cm4oIjAwMDAwMCIrdGhpcy5nZXRIZXgodCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNil9Z2V0SFNMKHQsZT11aC53b3JraW5nQ29sb3JTcGFjZSl7dWguZnJvbVdvcmtpbmdDb2xvclNwYWNlKElmLmNvcHkodGhpcyksZSk7Y29uc3Qgbj1JZi5yLHI9SWYuZyxpPUlmLmIsbz1NYXRoLm1heChuLHIsaSkscz1NYXRoLm1pbihuLHIsaSk7bGV0IGEsdTtjb25zdCBjPShzK28pLzI7aWYocz09PW8pYT0wLHU9MDtlbHNle2NvbnN0IHQ9by1zO3N3aXRjaCh1PWM8PS41P3QvKG8rcyk6dC8oMi1vLXMpLG8pe2Nhc2UgbjphPShyLWkpL3QrKHI8aT82OjApO2JyZWFrO2Nhc2UgcjphPShpLW4pL3QrMjticmVhaztjYXNlIGk6YT0obi1yKS90KzR9YS89Nn1yZXR1cm4gdC5oPWEsdC5zPXUsdC5sPWMsdH1nZXRSR0IodCxlPXVoLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gdWguZnJvbVdvcmtpbmdDb2xvclNwYWNlKElmLmNvcHkodGhpcyksZSksdC5yPUlmLnIsdC5nPUlmLmcsdC5iPUlmLmIsdH1nZXRTdHlsZSh0PVVsKXt1aC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoSWYuY29weSh0aGlzKSx0KTtjb25zdCBlPUlmLnIsbj1JZi5nLHI9SWYuYjtyZXR1cm4gdCE9PVVsP2Bjb2xvcigke3R9ICR7ZS50b0ZpeGVkKDMpfSAke24udG9GaXhlZCgzKX0gJHtyLnRvRml4ZWQoMyl9KWA6YHJnYigke01hdGgucm91bmQoMjU1KmUpfSwke01hdGgucm91bmQoMjU1Km4pfSwke01hdGgucm91bmQoMjU1KnIpfSlgfW9mZnNldEhTTCh0LGUsbil7cmV0dXJuIHRoaXMuZ2V0SFNMKENmKSx0aGlzLnNldEhTTChDZi5oK3QsQ2YucytlLENmLmwrbil9YWRkKHQpe3JldHVybiB0aGlzLnIrPXQucix0aGlzLmcrPXQuZyx0aGlzLmIrPXQuYix0aGlzfWFkZENvbG9ycyh0LGUpe3JldHVybiB0aGlzLnI9dC5yK2Uucix0aGlzLmc9dC5nK2UuZyx0aGlzLmI9dC5iK2UuYix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKz10LHRoaXMuZys9dCx0aGlzLmIrPXQsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMucj1NYXRoLm1heCgwLHRoaXMuci10LnIpLHRoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy10LmcpLHRoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi10LmIpLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMucio9dC5yLHRoaXMuZyo9dC5nLHRoaXMuYio9dC5iLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMucio9dCx0aGlzLmcqPXQsdGhpcy5iKj10LHRoaXN9bGVycCh0LGUpe3JldHVybiB0aGlzLnIrPSh0LnItdGhpcy5yKSplLHRoaXMuZys9KHQuZy10aGlzLmcpKmUsdGhpcy5iKz0odC5iLXRoaXMuYikqZSx0aGlzfWxlcnBDb2xvcnModCxlLG4pe3JldHVybiB0aGlzLnI9dC5yKyhlLnItdC5yKSpuLHRoaXMuZz10LmcrKGUuZy10LmcpKm4sdGhpcy5iPXQuYisoZS5iLXQuYikqbix0aGlzfWxlcnBIU0wodCxlKXt0aGlzLmdldEhTTChDZiksdC5nZXRIU0woU2YpO2NvbnN0IG49JGwoQ2YuaCxTZi5oLGUpLHI9JGwoQ2YucyxTZi5zLGUpLGk9JGwoQ2YubCxTZi5sLGUpO3JldHVybiB0aGlzLnNldEhTTChuLHIsaSksdGhpc31zZXRGcm9tVmVjdG9yMyh0KXtyZXR1cm4gdGhpcy5yPXQueCx0aGlzLmc9dC55LHRoaXMuYj10LnosdGhpc31hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLnIsbj10aGlzLmcscj10aGlzLmIsaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnI9aVswXSplK2lbM10qbitpWzZdKnIsdGhpcy5nPWlbMV0qZStpWzRdKm4raVs3XSpyLHRoaXMuYj1pWzJdKmUraVs1XSpuK2lbOF0qcix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5yPT09dGhpcy5yJiZ0Lmc9PT10aGlzLmcmJnQuYj09PXRoaXMuYn1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLnI9dFtlXSx0aGlzLmc9dFtlKzFdLHRoaXMuYj10W2UrMl0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLnIsdFtlKzFdPXRoaXMuZyx0W2UrMl09dGhpcy5iLHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLnI9dC5nZXRYKGUpLHRoaXMuZz10LmdldFkoZSksdGhpcy5iPXQuZ2V0WihlKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLmdldEhleCgpfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMucix5aWVsZCB0aGlzLmcseWllbGQgdGhpcy5ifX1jb25zdCBJZj1uZXcgTmY7TmYuTkFNRVM9RWY7bmV3IHhoLG5ldyB0aDtuZXcgWmgsbmV3IERmLG5ldyB4aCxuZXcgRGgsbmV3IERoLG5ldyB4aDtuZXcgWmgsbmV3IGNsYXNze2NvbnN0cnVjdG9yKHQ9bmV3IHhoLGU9bmV3IHhoKDAsMCwtMSkpe3RoaXMub3JpZ2luPXQsdGhpcy5kaXJlY3Rpb249ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0KSx0aGlzLmRpcmVjdGlvbi5jb3B5KGUpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0Lm9yaWdpbiksdGhpcy5kaXJlY3Rpb24uY29weSh0LmRpcmVjdGlvbiksdGhpc31hdCh0LGUpe3JldHVybiBlLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbix0KX1sb29rQXQodCl7cmV0dXJuIHRoaXMuZGlyZWN0aW9uLmNvcHkodCkuc3ViKHRoaXMub3JpZ2luKS5ub3JtYWxpemUoKSx0aGlzfXJlY2FzdCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KHQscWgpKSx0aGlzfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlKXtlLnN1YlZlY3RvcnModCx0aGlzLm9yaWdpbik7Y29uc3Qgbj1lLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIG48MD9lLmNvcHkodGhpcy5vcmlnaW4pOmUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLG4pfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodCkpfWRpc3RhbmNlU3FUb1BvaW50KHQpe2NvbnN0IGU9cWguc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiBlPDA/dGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQodCk6KHFoLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixlKSxxaC5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VTcVRvU2VnbWVudCh0LGUsbixyKXtWaC5jb3B5KHQpLmFkZChlKS5tdWx0aXBseVNjYWxhciguNSksR2guY29weShlKS5zdWIodCkubm9ybWFsaXplKCksWWguY29weSh0aGlzLm9yaWdpbikuc3ViKFZoKTtjb25zdCBpPS41KnQuZGlzdGFuY2VUbyhlKSxvPS10aGlzLmRpcmVjdGlvbi5kb3QoR2gpLHM9WWguZG90KHRoaXMuZGlyZWN0aW9uKSxhPS1ZaC5kb3QoR2gpLHU9WWgubGVuZ3RoU3EoKSxjPU1hdGguYWJzKDEtbypvKTtsZXQgbCxoLGYscDtpZihjPjApaWYobD1vKmEtcyxoPW8qcy1hLHA9aSpjLGw+PTApaWYoaD49LXApaWYoaDw9cCl7Y29uc3QgdD0xL2M7bCo9dCxoKj10LGY9bCoobCtvKmgrMipzKStoKihvKmwraCsyKmEpK3V9ZWxzZSBoPWksbD1NYXRoLm1heCgwLC0obypoK3MpKSxmPS1sKmwraCooaCsyKmEpK3U7ZWxzZSBoPS1pLGw9TWF0aC5tYXgoMCwtKG8qaCtzKSksZj0tbCpsK2gqKGgrMiphKSt1O2Vsc2UgaDw9LXA/KGw9TWF0aC5tYXgoMCwtKC1vKmkrcykpLGg9bD4wPy1pOk1hdGgubWluKE1hdGgubWF4KC1pLC1hKSxpKSxmPS1sKmwraCooaCsyKmEpK3UpOmg8PXA/KGw9MCxoPU1hdGgubWluKE1hdGgubWF4KC1pLC1hKSxpKSxmPWgqKGgrMiphKSt1KToobD1NYXRoLm1heCgwLC0obyppK3MpKSxoPWw+MD9pOk1hdGgubWluKE1hdGgubWF4KC1pLC1hKSxpKSxmPS1sKmwraCooaCsyKmEpK3UpO2Vsc2UgaD1vPjA/LWk6aSxsPU1hdGgubWF4KDAsLShvKmgrcykpLGY9LWwqbCtoKihoKzIqYSkrdTtyZXR1cm4gbiYmbi5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sbCksciYmci5jb3B5KFZoKS5hZGRTY2FsZWRWZWN0b3IoR2gsaCksZn1pbnRlcnNlY3RTcGhlcmUodCxlKXtxaC5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMub3JpZ2luKTtjb25zdCBuPXFoLmRvdCh0aGlzLmRpcmVjdGlvbikscj1xaC5kb3QocWgpLW4qbixpPXQucmFkaXVzKnQucmFkaXVzO2lmKHI+aSlyZXR1cm4gbnVsbDtjb25zdCBvPU1hdGguc3FydChpLXIpLHM9bi1vLGE9bitvO3JldHVybiBhPDA/bnVsbDpzPDA/dGhpcy5hdChhLGUpOnRoaXMuYXQocyxlKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KHQuY2VudGVyKTw9dC5yYWRpdXMqdC5yYWRpdXN9ZGlzdGFuY2VUb1BsYW5lKHQpe2NvbnN0IGU9dC5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKTtpZigwPT09ZSlyZXR1cm4gMD09PXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKT8wOm51bGw7Y29uc3Qgbj0tKHRoaXMub3JpZ2luLmRvdCh0Lm5vcm1hbCkrdC5jb25zdGFudCkvZTtyZXR1cm4gbj49MD9uOm51bGx9aW50ZXJzZWN0UGxhbmUodCxlKXtjb25zdCBuPXRoaXMuZGlzdGFuY2VUb1BsYW5lKHQpO3JldHVybiBudWxsPT09bj9udWxsOnRoaXMuYXQobixlKX1pbnRlcnNlY3RzUGxhbmUodCl7Y29uc3QgZT10LmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik7cmV0dXJuIDA9PT1lfHx0Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pKmU8MH1pbnRlcnNlY3RCb3godCxlKXtsZXQgbixyLGksbyxzLGE7Y29uc3QgdT0xL3RoaXMuZGlyZWN0aW9uLngsYz0xL3RoaXMuZGlyZWN0aW9uLnksbD0xL3RoaXMuZGlyZWN0aW9uLnosaD10aGlzLm9yaWdpbjtyZXR1cm4gdT49MD8obj0odC5taW4ueC1oLngpKnUscj0odC5tYXgueC1oLngpKnUpOihuPSh0Lm1heC54LWgueCkqdSxyPSh0Lm1pbi54LWgueCkqdSksYz49MD8oaT0odC5taW4ueS1oLnkpKmMsbz0odC5tYXgueS1oLnkpKmMpOihpPSh0Lm1heC55LWgueSkqYyxvPSh0Lm1pbi55LWgueSkqYyksbj5vfHxpPnJ8fCgoaT5ufHxpc05hTihuKSkmJihuPWkpLChvPHJ8fGlzTmFOKHIpKSYmKHI9byksbD49MD8ocz0odC5taW4uei1oLnopKmwsYT0odC5tYXguei1oLnopKmwpOihzPSh0Lm1heC56LWgueikqbCxhPSh0Lm1pbi56LWgueikqbCksbj5hfHxzPnIpfHwoKHM+bnx8biE9bikmJihuPXMpLChhPHJ8fHIhPXIpJiYocj1hKSxyPDApP251bGw6dGhpcy5hdChuPj0wP246cixlKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiBudWxsIT09dGhpcy5pbnRlcnNlY3RCb3godCxxaCl9aW50ZXJzZWN0VHJpYW5nbGUodCxlLG4scixpKXtYaC5zdWJWZWN0b3JzKGUsdCksV2guc3ViVmVjdG9ycyhuLHQpLEhoLmNyb3NzVmVjdG9ycyhYaCxXaCk7bGV0IG8scz10aGlzLmRpcmVjdGlvbi5kb3QoSGgpO2lmKHM+MCl7aWYocilyZXR1cm4gbnVsbDtvPTF9ZWxzZXtpZighKHM8MCkpcmV0dXJuIG51bGw7bz0tMSxzPS1zfVloLnN1YlZlY3RvcnModGhpcy5vcmlnaW4sdCk7Y29uc3QgYT1vKnRoaXMuZGlyZWN0aW9uLmRvdChXaC5jcm9zc1ZlY3RvcnMoWWgsV2gpKTtpZihhPDApcmV0dXJuIG51bGw7Y29uc3QgdT1vKnRoaXMuZGlyZWN0aW9uLmRvdChYaC5jcm9zcyhZaCkpO2lmKHU8MHx8YSt1PnMpcmV0dXJuIG51bGw7Y29uc3QgYz0tbypZaC5kb3QoSGgpO3JldHVybiBjPDA/bnVsbDp0aGlzLmF0KGMvcyxpKX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCh0KSx0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24odCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQub3JpZ2luLmVxdWFscyh0aGlzLm9yaWdpbikmJnQuZGlyZWN0aW9uLmVxdWFscyh0aGlzLmRpcmVjdGlvbil9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSxuZXcgVWgsbmV3IHhoO2NvbnN0IE1mPW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbil7Y29uc3Qgcj10aGlzO2xldCBpLG89ITEscz0wLGE9MDtjb25zdCB1PVtdO3RoaXMub25TdGFydD12b2lkIDAsdGhpcy5vbkxvYWQ9dCx0aGlzLm9uUHJvZ3Jlc3M9ZSx0aGlzLm9uRXJyb3I9bix0aGlzLml0ZW1TdGFydD1mdW5jdGlvbih0KXthKyssITE9PT1vJiZ2b2lkIDAhPT1yLm9uU3RhcnQmJnIub25TdGFydCh0LHMsYSksbz0hMH0sdGhpcy5pdGVtRW5kPWZ1bmN0aW9uKHQpe3MrKyx2b2lkIDAhPT1yLm9uUHJvZ3Jlc3MmJnIub25Qcm9ncmVzcyh0LHMsYSkscz09PWEmJihvPSExLHZvaWQgMCE9PXIub25Mb2FkJiZyLm9uTG9hZCgpKX0sdGhpcy5pdGVtRXJyb3I9ZnVuY3Rpb24odCl7dm9pZCAwIT09ci5vbkVycm9yJiZyLm9uRXJyb3IodCl9LHRoaXMucmVzb2x2ZVVSTD1mdW5jdGlvbih0KXtyZXR1cm4gaT9pKHQpOnR9LHRoaXMuc2V0VVJMTW9kaWZpZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGk9dCx0aGlzfSx0aGlzLmFkZEhhbmRsZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdS5wdXNoKHQsZSksdGhpc30sdGhpcy5yZW1vdmVIYW5kbGVyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dS5pbmRleE9mKHQpO3JldHVybi0xIT09ZSYmdS5zcGxpY2UoZSwyKSx0aGlzfSx0aGlzLmdldEhhbmRsZXI9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTAsbj11Lmxlbmd0aDtlPG47ZSs9Mil7Y29uc3Qgbj11W2VdLHI9dVtlKzFdO2lmKG4uZ2xvYmFsJiYobi5sYXN0SW5kZXg9MCksbi50ZXN0KHQpKXJldHVybiByfXJldHVybiBudWxsfX19O2NsYXNzIEZme2NvbnN0cnVjdG9yKHQpe3RoaXMubWFuYWdlcj12b2lkIDAhPT10P3Q6TWYsdGhpcy5jcm9zc09yaWdpbj0iYW5vbnltb3VzIix0aGlzLndpdGhDcmVkZW50aWFscz0hMSx0aGlzLnBhdGg9IiIsdGhpcy5yZXNvdXJjZVBhdGg9IiIsdGhpcy5yZXF1ZXN0SGVhZGVyPXt9fWxvYWQoKXt9bG9hZEFzeW5jKHQsZSl7Y29uc3Qgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixpKXtuLmxvYWQodCxyLGUsaSl9KSl9cGFyc2UoKXt9c2V0Q3Jvc3NPcmlnaW4odCl7cmV0dXJuIHRoaXMuY3Jvc3NPcmlnaW49dCx0aGlzfXNldFdpdGhDcmVkZW50aWFscyh0KXtyZXR1cm4gdGhpcy53aXRoQ3JlZGVudGlhbHM9dCx0aGlzfXNldFBhdGgodCl7cmV0dXJuIHRoaXMucGF0aD10LHRoaXN9c2V0UmVzb3VyY2VQYXRoKHQpe3JldHVybiB0aGlzLnJlc291cmNlUGF0aD10LHRoaXN9c2V0UmVxdWVzdEhlYWRlcih0KXtyZXR1cm4gdGhpcy5yZXF1ZXN0SGVhZGVyPXQsdGhpc319RmYuREVGQVVMVF9NQVRFUklBTF9OQU1FPSJfX0RFRkFVTFQiO0Vycm9yO2Z1bmN0aW9uIE9mKCl7cmV0dXJuIE9mPU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49YXJndW1lbnRzW2VdO2Zvcih2YXIgciBpbiBuKSh7fSkuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYodFtyXT1uW3JdKX1yZXR1cm4gdH0sT2YuYXBwbHkobnVsbCxhcmd1bWVudHMpfSJ1bmRlZmluZWQiIT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJlZ2lzdGVyIix7ZGV0YWlsOntyZXZpc2lvbjoiMTY5In19KSksInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuX19USFJFRV9ffHwod2luZG93Ll9fVEhSRUVfXz0iMTY5IikpO3ZhciBMZj17ZXBzaWxvbjoxZS0xMixtYXRyaXg6Ik1hdHJpeCIsbnVtYmVyOiJudW1iZXIiLHByZWNpc2lvbjo2NCxwcmVkaWN0YWJsZTohMSxyYW5kb21TZWVkOm51bGx9O2Z1bmN0aW9uIFBmKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdH1mdW5jdGlvbiBSZih0KXtyZXR1cm4hKCF0fHwib2JqZWN0IiE9dHlwZW9mIHR8fCJmdW5jdGlvbiIhPXR5cGVvZiB0LmNvbnN0cnVjdG9yKSYmKCEwPT09dC5pc0JpZ051bWJlciYmIm9iamVjdCI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc0JpZ051bWJlcnx8ImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3IuaXNEZWNpbWFsJiYhMD09PXQuY29uc3RydWN0b3IuaXNEZWNpbWFsKHQpKX1mdW5jdGlvbiBCZih0KXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0JiYhMD09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0KS5pc0NvbXBsZXh8fCExfWZ1bmN0aW9uIGtmKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJiEwPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpLmlzRnJhY3Rpb258fCExfWZ1bmN0aW9uIHpmKHQpe3JldHVybiB0JiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzVW5pdHx8ITF9ZnVuY3Rpb24gamYodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fXZhciBVZj1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIHFmKHQpe3JldHVybiB0JiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTWF0cml4fHwhMX1mdW5jdGlvbiBWZih0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KXx8cWYodCl9ZnVuY3Rpb24gR2YodCl7cmV0dXJuIHQmJnQuaXNEZW5zZU1hdHJpeCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc01hdHJpeHx8ITF9ZnVuY3Rpb24gWWYodCl7cmV0dXJuIHQmJnQuaXNTcGFyc2VNYXRyaXgmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNNYXRyaXh8fCExfWZ1bmN0aW9uIFhmKHQpe3JldHVybiB0JiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzUmFuZ2V8fCExfWZ1bmN0aW9uIFdmKHQpe3JldHVybiB0JiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzSW5kZXh8fCExfWZ1bmN0aW9uIEhmKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR9ZnVuY3Rpb24gWmYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNSZXN1bHRTZXR8fCExfWZ1bmN0aW9uIEtmKHQpe3JldHVybiB0JiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzSGVscHx8ITF9ZnVuY3Rpb24gSmYodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9ZnVuY3Rpb24gUWYodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlfWZ1bmN0aW9uICRmKHQpe3JldHVybiB0IGluc3RhbmNlb2YgUmVnRXhwfWZ1bmN0aW9uIHRwKHQpe3JldHVybiEoIXR8fCJvYmplY3QiIT10eXBlb2YgdHx8dC5jb25zdHJ1Y3RvciE9PU9iamVjdHx8QmYodCl8fGtmKHQpKX1mdW5jdGlvbiBlcCh0KXtyZXR1cm4gbnVsbD09PXR9ZnVuY3Rpb24gbnAodCl7cmV0dXJuIHZvaWQgMD09PXR9ZnVuY3Rpb24gcnAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0FjY2Vzc29yTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGlwKHQpe3JldHVybiB0JiYhMD09PXQuaXNBcnJheU5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBvcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzQXNzaWdubWVudE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBzcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzQmxvY2tOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gYXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0NvbmRpdGlvbmFsTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIHVwKHQpe3JldHVybiB0JiYhMD09PXQuaXNDb25zdGFudE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBjcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzRnVuY3Rpb25Bc3NpZ25tZW50Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGxwKHQpe3JldHVybiB0JiYhMD09PXQuaXNGdW5jdGlvbk5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBocCh0KXtyZXR1cm4gdCYmITA9PT10LmlzSW5kZXhOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gZnAodCl7cmV0dXJuIHQmJiEwPT09dC5pc05vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBwcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzT2JqZWN0Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGRwKHQpe3JldHVybiB0JiYhMD09PXQuaXNPcGVyYXRvck5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBncCh0KXtyZXR1cm4gdCYmITA9PT10LmlzUGFyZW50aGVzaXNOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24geXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc1JhbmdlTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIG1wKHQpe3JldHVybiB0JiYhMD09PXQuaXNSZWxhdGlvbmFsTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIHZwKHQpe3JldHVybiB0JiYhMD09PXQuaXNTeW1ib2xOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gX3AodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNDaGFpbnx8ITF9ZnVuY3Rpb24geHAodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIm9iamVjdCI9PT1lP251bGw9PT10PyJudWxsIjpSZih0KT8iQmlnTnVtYmVyIjp0LmNvbnN0cnVjdG9yJiZ0LmNvbnN0cnVjdG9yLm5hbWU/dC5jb25zdHJ1Y3Rvci5uYW1lOiJPYmplY3QiOmV9ZnVuY3Rpb24gd3AodCl7dmFyIGU9dHlwZW9mIHQ7aWYoIm51bWJlciI9PT1lfHwic3RyaW5nIj09PWV8fCJib29sZWFuIj09PWV8fG51bGw9PXQpcmV0dXJuIHQ7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQuY2xvbmUpcmV0dXJuIHQuY2xvbmUoKTtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHdwKHQpfSkpO2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBuZXcgRGF0ZSh0LnZhbHVlT2YoKSk7aWYoUmYodCkpcmV0dXJuIHQ7aWYodCBpbnN0YW5jZW9mIFJlZ0V4cCl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2xvbmUgIit0KTtyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj17fTtmb3IodmFyIHIgaW4gdClEcCh0LHIpJiYobltyXT1lKHRbcl0pKTtyZXR1cm4gbn0odCx3cCl9ZnVuY3Rpb24gYnAodCxlKXt2YXIgbixyLGk7aWYoQXJyYXkuaXNBcnJheSh0KSl7aWYoIUFycmF5LmlzQXJyYXkoZSl8fHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspaWYoIWJwKHRbcl0sZVtyXSkpcmV0dXJuITE7cmV0dXJuITB9aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpcmV0dXJuIHQ9PT1lO2lmKHQgaW5zdGFuY2VvZiBPYmplY3Qpe2lmKEFycmF5LmlzQXJyYXkoZSl8fCEoZSBpbnN0YW5jZW9mIE9iamVjdCkpcmV0dXJuITE7Zm9yKG4gaW4gdClpZighKG4gaW4gZSl8fCFicCh0W25dLGVbbl0pKXJldHVybiExO2ZvcihuIGluIGUpaWYoIShuIGluIHQpKXJldHVybiExO3JldHVybiEwfXJldHVybiB0PT09ZX1mdW5jdGlvbiBEcCh0LGUpe3JldHVybiB0JiZPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfXZhciBFcD1mdW5jdGlvbih0KXtpZih0KXRocm93IG5ldyBFcnJvcigiVGhlIGdsb2JhbCBjb25maWcgaXMgcmVhZG9ubHkuIFxuUGxlYXNlIGNyZWF0ZSBhIG1hdGhqcyBpbnN0YW5jZSBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbi4gXG5FeGFtcGxlOlxuXG4gIGltcG9ydCB7IGNyZWF0ZSwgYWxsIH0gZnJvbSAnbWF0aGpzJztcbiAgY29uc3QgbWF0aGpzID0gY3JlYXRlKGFsbCk7XG4gIG1hdGhqcy5jb25maWcoeyBudW1iZXI6ICdCaWdOdW1iZXInIH0pO1xuIik7cmV0dXJuIE9iamVjdC5mcmVlemUoTGYpfTtmdW5jdGlvbiBDcCgpe3JldHVybiEwfWZ1bmN0aW9uIFNwKCl7cmV0dXJuITF9ZnVuY3Rpb24gQXAoKXt9T2YoRXAsTGYse01BVFJJWF9PUFRJT05TOlsiTWF0cml4IiwiQXJyYXkiXSxOVU1CRVJfT1BUSU9OUzpbIm51bWJlciIsIkJpZ051bWJlciIsIkZyYWN0aW9uIl19KTtjb25zdCBOcD0iQXJndW1lbnQgaXMgbm90IGEgdHlwZWQtZnVuY3Rpb24uIjt2YXIgSXA9ZnVuY3Rpb24gdCgpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dCYmdC5jb25zdHJ1Y3Rvcj09PU9iamVjdH1jb25zdCBuPVt7bmFtZToibnVtYmVyIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdH19LHtuYW1lOiJzdHJpbmciLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fX0se25hbWU6ImJvb2xlYW4iLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH19LHtuYW1lOiJGdW5jdGlvbiIsdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH19LHtuYW1lOiJBcnJheSIsdGVzdDpBcnJheS5pc0FycmF5fSx7bmFtZToiRGF0ZSIsdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGV9fSx7bmFtZToiUmVnRXhwIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgUmVnRXhwfX0se25hbWU6Ik9iamVjdCIsdGVzdDplfSx7bmFtZToibnVsbCIsdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXR9fSx7bmFtZToidW5kZWZpbmVkIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10fX1dLHI9e25hbWU6ImFueSIsdGVzdDpDcCxpc0FueTohMH07bGV0IGksbyxzPTAsYT17Y3JlYXRlQ291bnQ6MH07ZnVuY3Rpb24gdSh0KXtjb25zdCBlPWkuZ2V0KHQpO2lmKGUpcmV0dXJuIGU7bGV0IG49J1Vua25vd24gdHlwZSAiJyt0KyciJztjb25zdCByPXQudG9Mb3dlckNhc2UoKTtsZXQgcztmb3IocyBvZiBvKWlmKHMudG9Mb3dlckNhc2UoKT09PXIpe24rPScuIERpZCB5b3UgbWVhbiAiJytzKyciID8nO2JyZWFrfXRocm93IG5ldyBUeXBlRXJyb3Iobil9ZnVuY3Rpb24gYyh0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06ImFueSI7Y29uc3Qgbj1lP3UoZSkuaW5kZXg6by5sZW5ndGgscj1bXTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoOysrZSl7aWYoIXRbZV18fCJzdHJpbmciIT10eXBlb2YgdFtlXS5uYW1lfHwiZnVuY3Rpb24iIT10eXBlb2YgdFtlXS50ZXN0KXRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCB3aXRoIHByb3BlcnRpZXMge25hbWU6IHN0cmluZywgdGVzdDogZnVuY3Rpb259IGV4cGVjdGVkIik7Y29uc3Qgbz10W2VdLm5hbWU7aWYoaS5oYXMobykpdGhyb3cgbmV3IFR5cGVFcnJvcignRHVwbGljYXRlIHR5cGUgbmFtZSAiJytvKyciJyk7ci5wdXNoKG8pLGkuc2V0KG8se25hbWU6byx0ZXN0OnRbZV0udGVzdCxpc0FueTp0W2VdLmlzQW55LGluZGV4Om4rZSxjb252ZXJzaW9uc1RvOltdfSl9Y29uc3Qgcz1vLnNsaWNlKG4pO289by5zbGljZSgwLG4pLmNvbmNhdChyKS5jb25jYXQocyk7Zm9yKGxldCB0PW4rci5sZW5ndGg7dDxvLmxlbmd0aDsrK3QpaS5nZXQob1t0XSkuaW5kZXg9dH1mdW5jdGlvbiBsKCl7aT1uZXcgTWFwLG89W10scz0wLGMoW3JdLCExKX1mdW5jdGlvbiBoKHQpe2NvbnN0IGU9by5maWx0ZXIoKGU9Pntjb25zdCBuPWkuZ2V0KGUpO3JldHVybiFuLmlzQW55JiZuLnRlc3QodCl9KSk7cmV0dXJuIGUubGVuZ3RoP2U6WyJhbnkiXX1mdW5jdGlvbiBmKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdCYmIl90eXBlZEZ1bmN0aW9uRGF0YSJpbiB0fWZ1bmN0aW9uIHAodCxlLG4pe2lmKCFmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoTnApO2NvbnN0IHI9biYmbi5leGFjdCxpPXYoQXJyYXkuaXNBcnJheShlKT9lLmpvaW4oIiwiKTplKSxvPWQoaSk7aWYoIXJ8fG8gaW4gdC5zaWduYXR1cmVzKXtjb25zdCBlPXQuX3R5cGVkRnVuY3Rpb25EYXRhLnNpZ25hdHVyZU1hcC5nZXQobyk7aWYoZSlyZXR1cm4gZX1jb25zdCBzPWkubGVuZ3RoO2xldCBhLHU7aWYocil7bGV0IGU7Zm9yKGUgaW4gYT1bXSx0LnNpZ25hdHVyZXMpYS5wdXNoKHQuX3R5cGVkRnVuY3Rpb25EYXRhLnNpZ25hdHVyZU1hcC5nZXQoZSkpfWVsc2UgYT10Ll90eXBlZEZ1bmN0aW9uRGF0YS5zaWduYXR1cmVzO2ZvcihsZXQgdD0wO3Q8czsrK3Qpe2NvbnN0IGU9aVt0XSxuPVtdO2xldCByO2ZvcihyIG9mIGEpe2NvbnN0IGk9YihyLnBhcmFtcyx0KTtpZihpJiYoIWUucmVzdFBhcmFtfHxpLnJlc3RQYXJhbSkpe2lmKCFpLmhhc0FueSl7Y29uc3QgdD1tKGkpO2lmKGUudHlwZXMuc29tZSgoZT0+IXQuaGFzKGUubmFtZSkpKSljb250aW51ZX1uLnB1c2gocil9fWlmKGE9biwwPT09YS5sZW5ndGgpYnJlYWt9Zm9yKHUgb2YgYSlpZih1LnBhcmFtcy5sZW5ndGg8PXMpcmV0dXJuIHU7dGhyb3cgbmV3IFR5cGVFcnJvcigiU2lnbmF0dXJlIG5vdCBmb3VuZCAoc2lnbmF0dXJlOiAiKyh0Lm5hbWV8fCJ1bm5hbWVkIikrIigiK2QoaSwiLCAiKSsiKSkiKX1mdW5jdGlvbiBkKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToiLCI7cmV0dXJuIHQubWFwKCh0PT50Lm5hbWUpKS5qb2luKGUpfWZ1bmN0aW9uIGcodCl7Y29uc3QgZT0wPT09dC5pbmRleE9mKCIuLi4iKSxuPShlP3QubGVuZ3RoPjM/dC5zbGljZSgzKToiYW55Ijp0KS5zcGxpdCgifCIpLm1hcCgodD0+dSh0LnRyaW0oKSkpKTtsZXQgcj0hMSxpPWU/Ii4uLiI6IiI7cmV0dXJue3R5cGVzOm4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gcj10LmlzQW55fHxyLGkrPXQubmFtZSsifCIse25hbWU6dC5uYW1lLHR5cGVJbmRleDp0LmluZGV4LHRlc3Q6dC50ZXN0LGlzQW55OnQuaXNBbnksY29udmVyc2lvbjpudWxsLGNvbnZlcnNpb25JbmRleDotMX19KSksbmFtZTppLnNsaWNlKDAsLTEpLGhhc0FueTpyLGhhc0NvbnZlcnNpb246ITEscmVzdFBhcmFtOmV9fWZ1bmN0aW9uIHkodCl7Y29uc3QgZT1mdW5jdGlvbih0KXtpZigwPT09dC5sZW5ndGgpcmV0dXJuW107Y29uc3QgZT10Lm1hcCh1KTt0Lmxlbmd0aD4xJiZlLnNvcnQoKCh0LGUpPT50LmluZGV4LWUuaW5kZXgpKTtsZXQgbj1lWzBdLmNvbnZlcnNpb25zVG87aWYoMT09PXQubGVuZ3RoKXJldHVybiBuO249bi5jb25jYXQoW10pO2NvbnN0IHI9bmV3IFNldCh0KTtmb3IobGV0IHQ9MTt0PGUubGVuZ3RoOysrdCl7bGV0IGk7Zm9yKGkgb2YgZVt0XS5jb252ZXJzaW9uc1RvKXIuaGFzKGkuZnJvbSl8fChuLnB1c2goaSksci5hZGQoaS5mcm9tKSl9cmV0dXJuIG59KHQudHlwZXMubWFwKCh0PT50Lm5hbWUpKSk7bGV0IG49dC5oYXNBbnkscj10Lm5hbWU7Y29uc3QgaT1lLm1hcCgoZnVuY3Rpb24odCl7Y29uc3QgZT11KHQuZnJvbSk7cmV0dXJuIG49ZS5pc0FueXx8bixyKz0ifCIrdC5mcm9tLHtuYW1lOnQuZnJvbSx0eXBlSW5kZXg6ZS5pbmRleCx0ZXN0OmUudGVzdCxpc0FueTplLmlzQW55LGNvbnZlcnNpb246dCxjb252ZXJzaW9uSW5kZXg6dC5pbmRleH19KSk7cmV0dXJue3R5cGVzOnQudHlwZXMuY29uY2F0KGkpLG5hbWU6cixoYXNBbnk6bixoYXNDb252ZXJzaW9uOmkubGVuZ3RoPjAscmVzdFBhcmFtOnQucmVzdFBhcmFtfX1mdW5jdGlvbiBtKHQpe3JldHVybiB0LnR5cGVTZXR8fCh0LnR5cGVTZXQ9bmV3IFNldCx0LnR5cGVzLmZvckVhY2goKGU9PnQudHlwZVNldC5hZGQoZS5uYW1lKSkpKSx0LnR5cGVTZXR9ZnVuY3Rpb24gdih0KXtjb25zdCBlPVtdO2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTaWduYXR1cmVzIG11c3QgYmUgc3RyaW5ncyIpO2NvbnN0IG49dC50cmltKCk7aWYoIiI9PT1uKXJldHVybiBlO2NvbnN0IHI9bi5zcGxpdCgiLCIpO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7Kyt0KXtjb25zdCBuPWcoclt0XS50cmltKCkpO2lmKG4ucmVzdFBhcmFtJiZ0IT09ci5sZW5ndGgtMSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1VuZXhwZWN0ZWQgcmVzdCBwYXJhbWV0ZXIgIicrclt0XSsnIjogb25seSBhbGxvd2VkIGZvciB0aGUgbGFzdCBwYXJhbWV0ZXInKTtpZigwPT09bi50eXBlcy5sZW5ndGgpcmV0dXJuIG51bGw7ZS5wdXNoKG4pfXJldHVybiBlfWZ1bmN0aW9uIF8odCl7Y29uc3QgZT1qKHQpO3JldHVybiEhZSYmZS5yZXN0UGFyYW19ZnVuY3Rpb24geCh0KXtpZighdHx8MD09PXQudHlwZXMubGVuZ3RoKXJldHVybiBDcDtpZigxPT09dC50eXBlcy5sZW5ndGgpcmV0dXJuIHUodC50eXBlc1swXS5uYW1lKS50ZXN0O2lmKDI9PT10LnR5cGVzLmxlbmd0aCl7Y29uc3QgZT11KHQudHlwZXNbMF0ubmFtZSkudGVzdCxuPXUodC50eXBlc1sxXS5uYW1lKS50ZXN0O3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZSh0KXx8bih0KX19e2NvbnN0IGU9dC50eXBlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB1KHQubmFtZSkudGVzdH0pKTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYoZVtuXSh0KSlyZXR1cm4hMDtyZXR1cm4hMX19fWZ1bmN0aW9uIHcodCl7bGV0IGUsbixyO2lmKF8odCkpe2U9eih0KS5tYXAoeCk7Y29uc3Qgbj1lLmxlbmd0aCxyPXgoaih0KSksaT1mdW5jdGlvbih0KXtmb3IobGV0IGU9bjtlPHQubGVuZ3RoO2UrKylpZighcih0W2VdKSlyZXR1cm4hMTtyZXR1cm4hMH07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWlmKCFlW25dKHRbbl0pKXJldHVybiExO3JldHVybiBpKHQpJiZ0Lmxlbmd0aD49bisxfX1yZXR1cm4gMD09PXQubGVuZ3RoP2Z1bmN0aW9uKHQpe3JldHVybiAwPT09dC5sZW5ndGh9OjE9PT10Lmxlbmd0aD8obj14KHRbMF0pLGZ1bmN0aW9uKHQpe3JldHVybiBuKHRbMF0pJiYxPT09dC5sZW5ndGh9KToyPT09dC5sZW5ndGg/KG49eCh0WzBdKSxyPXgodFsxXSksZnVuY3Rpb24odCl7cmV0dXJuIG4odFswXSkmJnIodFsxXSkmJjI9PT10Lmxlbmd0aH0pOihlPXQubWFwKHgpLGZ1bmN0aW9uKHQpe2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWlmKCFlW25dKHRbbl0pKXJldHVybiExO3JldHVybiB0Lmxlbmd0aD09PWUubGVuZ3RofSl9ZnVuY3Rpb24gYih0LGUpe3JldHVybiBlPHQubGVuZ3RoP3RbZV06Xyh0KT9qKHQpOm51bGx9ZnVuY3Rpb24gRCh0LGUpe2NvbnN0IG49Yih0LGUpO3JldHVybiBuP20obik6bmV3IFNldH1mdW5jdGlvbiBFKHQpe3JldHVybiBudWxsPT09dC5jb252ZXJzaW9ufHx2b2lkIDA9PT10LmNvbnZlcnNpb259ZnVuY3Rpb24gQyh0LGUpe2NvbnN0IG49bmV3IFNldDtyZXR1cm4gdC5mb3JFYWNoKCh0PT57Y29uc3Qgcj1EKHQucGFyYW1zLGUpO2xldCBpO2ZvcihpIG9mIHIpbi5hZGQoaSl9KSksbi5oYXMoImFueSIpP1siYW55Il06QXJyYXkuZnJvbShuKX1mdW5jdGlvbiBTKHQsZSxuKXtsZXQgcixpO2NvbnN0IG89dHx8InVubmFtZWQiO2xldCBzLGE9bjtmb3Iocz0wO3M8ZS5sZW5ndGg7cysrKXtjb25zdCB0PVtdO2lmKGEuZm9yRWFjaCgobj0+e2NvbnN0IHI9eChiKG4ucGFyYW1zLHMpKTsoczxuLnBhcmFtcy5sZW5ndGh8fF8obi5wYXJhbXMpKSYmcihlW3NdKSYmdC5wdXNoKG4pfSkpLDA9PT10Lmxlbmd0aCl7aWYoaT1DKGEscyksaS5sZW5ndGg+MCl7Y29uc3QgdD1oKGVbc10pO3JldHVybiByPW5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgdHlwZSBvZiBhcmd1bWVudCBpbiBmdW5jdGlvbiAiK28rIiAoZXhwZWN0ZWQ6ICIraS5qb2luKCIgb3IgIikrIiwgYWN0dWFsOiAiK3Quam9pbigiIHwgIikrIiwgaW5kZXg6ICIrcysiKSIpLHIuZGF0YT17Y2F0ZWdvcnk6Indyb25nVHlwZSIsZm46byxpbmRleDpzLGFjdHVhbDp0LGV4cGVjdGVkOml9LHJ9fWVsc2UgYT10fWNvbnN0IHU9YS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBfKHQucGFyYW1zKT8xLzA6dC5wYXJhbXMubGVuZ3RofSkpO2lmKGUubGVuZ3RoPE1hdGgubWluLmFwcGx5KG51bGwsdSkpcmV0dXJuIGk9QyhhLHMpLHI9bmV3IFR5cGVFcnJvcigiVG9vIGZldyBhcmd1bWVudHMgaW4gZnVuY3Rpb24gIitvKyIgKGV4cGVjdGVkOiAiK2kuam9pbigiIG9yICIpKyIsIGluZGV4OiAiK2UubGVuZ3RoKyIpIiksci5kYXRhPXtjYXRlZ29yeToidG9vRmV3QXJncyIsZm46byxpbmRleDplLmxlbmd0aCxleHBlY3RlZDppfSxyO2NvbnN0IGM9TWF0aC5tYXguYXBwbHkobnVsbCx1KTtpZihlLmxlbmd0aD5jKXJldHVybiByPW5ldyBUeXBlRXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyBpbiBmdW5jdGlvbiAiK28rIiAoZXhwZWN0ZWQ6ICIrYysiLCBhY3R1YWw6ICIrZS5sZW5ndGgrIikiKSxyLmRhdGE9e2NhdGVnb3J5OiJ0b29NYW55QXJncyIsZm46byxpbmRleDplLmxlbmd0aCxleHBlY3RlZExlbmd0aDpjfSxyO2NvbnN0IGw9W107Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDsrK3QpbC5wdXNoKGgoZVt0XSkuam9pbigifCIpKTtyZXR1cm4gcj1uZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgb2YgdHlwZSAiJytsLmpvaW4oIiwgIikrJyIgZG8gbm90IG1hdGNoIGFueSBvZiB0aGUgZGVmaW5lZCBzaWduYXR1cmVzIG9mIGZ1bmN0aW9uICcrbysiLiIpLHIuZGF0YT17Y2F0ZWdvcnk6Im1pc21hdGNoIixhY3R1YWw6bH0scn1mdW5jdGlvbiBBKHQpe2xldCBlPW8ubGVuZ3RoKzE7Zm9yKGxldCBuPTA7bjx0LnR5cGVzLmxlbmd0aDtuKyspRSh0LnR5cGVzW25dKSYmKGU9TWF0aC5taW4oZSx0LnR5cGVzW25dLnR5cGVJbmRleCkpO3JldHVybiBlfWZ1bmN0aW9uIE4odCl7bGV0IGU9cysxO2ZvcihsZXQgbj0wO248dC50eXBlcy5sZW5ndGg7bisrKUUodC50eXBlc1tuXSl8fChlPU1hdGgubWluKGUsdC50eXBlc1tuXS5jb252ZXJzaW9uSW5kZXgpKTtyZXR1cm4gZX1mdW5jdGlvbiBJKHQsZSl7aWYodC5oYXNBbnkpe2lmKCFlLmhhc0FueSlyZXR1cm4gMX1lbHNlIGlmKGUuaGFzQW55KXJldHVybi0xO2lmKHQucmVzdFBhcmFtKXtpZighZS5yZXN0UGFyYW0pcmV0dXJuIDF9ZWxzZSBpZihlLnJlc3RQYXJhbSlyZXR1cm4tMTtpZih0Lmhhc0NvbnZlcnNpb24pe2lmKCFlLmhhc0NvbnZlcnNpb24pcmV0dXJuIDF9ZWxzZSBpZihlLmhhc0NvbnZlcnNpb24pcmV0dXJuLTE7Y29uc3Qgbj1BKHQpLUEoZSk7aWYobjwwKXJldHVybi0xO2lmKG4+MClyZXR1cm4gMTtjb25zdCByPU4odCktTihlKTtyZXR1cm4gcjwwPy0xOnI+MD8xOjB9ZnVuY3Rpb24gTSh0LGUpe2NvbnN0IG49dC5wYXJhbXMscj1lLnBhcmFtcyxpPWoobiksbz1qKHIpLHM9XyhuKSxhPV8ocik7aWYocyYmaS5oYXNBbnkpe2lmKCFhfHwhby5oYXNBbnkpcmV0dXJuIDF9ZWxzZSBpZihhJiZvLmhhc0FueSlyZXR1cm4tMTtsZXQgdSxjPTAsbD0wO2Zvcih1IG9mIG4pdS5oYXNBbnkmJisrYyx1Lmhhc0NvbnZlcnNpb24mJisrbDtsZXQgaD0wLGY9MDtmb3IodSBvZiByKXUuaGFzQW55JiYrK2gsdS5oYXNDb252ZXJzaW9uJiYrK2Y7aWYoYyE9PWgpcmV0dXJuIGMtaDtpZihzJiZpLmhhc0NvbnZlcnNpb24pe2lmKCFhfHwhby5oYXNDb252ZXJzaW9uKXJldHVybiAxfWVsc2UgaWYoYSYmby5oYXNDb252ZXJzaW9uKXJldHVybi0xO2lmKGwhPT1mKXJldHVybiBsLWY7aWYocyl7aWYoIWEpcmV0dXJuIDF9ZWxzZSBpZihhKXJldHVybi0xO2NvbnN0IHA9KG4ubGVuZ3RoLXIubGVuZ3RoKSoocz8tMToxKTtpZigwIT09cClyZXR1cm4gcDtjb25zdCBkPVtdO2xldCBnLHk9MDtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoOysrdCl7Y29uc3QgZT1JKG5bdF0sclt0XSk7ZC5wdXNoKGUpLHkrPWV9aWYoMCE9PXkpcmV0dXJuIHk7Zm9yKGcgb2YgZClpZigwIT09ZylyZXR1cm4gZztyZXR1cm4gMH1mdW5jdGlvbiBGKHQsZSl7bGV0IG49ZTtpZih0LnNvbWUoKHQ9PnQuaGFzQ29udmVyc2lvbikpKXtjb25zdCByPV8odCksaT10Lm1hcChUKTtuPWZ1bmN0aW9uKCl7Y29uc3QgdD1bXSxuPXI/YXJndW1lbnRzLmxlbmd0aC0xOmFyZ3VtZW50cy5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxuO2UrKyl0W2VdPWlbZV0oYXJndW1lbnRzW2VdKTtyZXR1cm4gciYmKHRbbl09YXJndW1lbnRzW25dLm1hcChpW25dKSksZS5hcHBseSh0aGlzLHQpfX1sZXQgcj1uO2lmKF8odCkpe2NvbnN0IGU9dC5sZW5ndGgtMTtyPWZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBwbHkodGhpcyxVKGFyZ3VtZW50cywwLGUpLmNvbmNhdChbVShhcmd1bWVudHMsZSldKSl9fXJldHVybiByfWZ1bmN0aW9uIFQodCl7bGV0IGUsbixyLGk7Y29uc3Qgbz1bXSxzPVtdO3N3aXRjaCh0LnR5cGVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY29udmVyc2lvbiYmKG8ucHVzaCh1KHQuY29udmVyc2lvbi5mcm9tKS50ZXN0KSxzLnB1c2godC5jb252ZXJzaW9uLmNvbnZlcnQpKX0pKSxzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdH07Y2FzZSAxOnJldHVybiBlPW9bMF0scj1zWzBdLGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpP3IodCk6dH07Y2FzZSAyOnJldHVybiBlPW9bMF0sbj1vWzFdLHI9c1swXSxpPXNbMV0sZnVuY3Rpb24odCl7cmV0dXJuIGUodCk/cih0KTpuKHQpP2kodCk6dH07ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGxldCBlPTA7ZTxzLmxlbmd0aDtlKyspaWYob1tlXSh0KSlyZXR1cm4gc1tlXSh0KTtyZXR1cm4gdH19fWZ1bmN0aW9uIE8odCl7cmV0dXJuIGZ1bmN0aW9uIHQoZSxuLHIpe2lmKG48ZS5sZW5ndGgpe2NvbnN0IGk9ZVtuXTtsZXQgbz1bXTtpZihpLnJlc3RQYXJhbSl7Y29uc3QgdD1pLnR5cGVzLmZpbHRlcihFKTt0Lmxlbmd0aDxpLnR5cGVzLmxlbmd0aCYmby5wdXNoKHt0eXBlczp0LG5hbWU6Ii4uLiIrdC5tYXAoKHQ9PnQubmFtZSkpLmpvaW4oInwiKSxoYXNBbnk6dC5zb21lKCh0PT50LmlzQW55KSksaGFzQ29udmVyc2lvbjohMSxyZXN0UGFyYW06ITB9KSxvLnB1c2goaSl9ZWxzZSBvPWkudHlwZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm57dHlwZXM6W3RdLG5hbWU6dC5uYW1lLGhhc0FueTp0LmlzQW55LGhhc0NvbnZlcnNpb246dC5jb252ZXJzaW9uLHJlc3RQYXJhbTohMX19KSk7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sdC5tYXAoZSkpfShvLChmdW5jdGlvbihpKXtyZXR1cm4gdChlLG4rMSxyLmNvbmNhdChbaV0pKX0pKX1yZXR1cm5bcl19KHQsMCxbXSl9ZnVuY3Rpb24gTCh0LGUpe2NvbnN0IG49TWF0aC5tYXgodC5sZW5ndGgsZS5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8bjtyKyspe2NvbnN0IG49RCh0LHIpLGk9RChlLHIpO2xldCBvLHM9ITE7Zm9yKG8gb2YgaSlpZihuLmhhcyhvKSl7cz0hMDticmVha31pZighcylyZXR1cm4hMX1jb25zdCByPXQubGVuZ3RoLGk9ZS5sZW5ndGgsbz1fKHQpLHM9XyhlKTtyZXR1cm4gbz9zP3I9PT1pOmk+PXI6cz9yPj1pOnI9PT1pfWZ1bmN0aW9uIFAodCxlLG4pe2NvbnN0IHI9W107bGV0IGk7Zm9yKGkgb2YgdCl7bGV0IHQ9bltpXTtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gZGVmaW5pdGlvbiBmb3IgcmVmZXJlbmNlZCBzaWduYXR1cmUgIicraSsnIicpO2lmKHQ9ZVt0XSwiZnVuY3Rpb24iIT10eXBlb2YgdClyZXR1cm4hMTtyLnB1c2godCl9cmV0dXJuIHJ9ZnVuY3Rpb24gUih0LGUsbil7Y29uc3Qgcj1mdW5jdGlvbih0KXtyZXR1cm4gdC5tYXAoKHQ9PlkodCk/Vih0LnJlZmVyVG9TZWxmLmNhbGxiYWNrKTpHKHQpP3EodC5yZWZlclRvLnJlZmVyZW5jZXMsdC5yZWZlclRvLmNhbGxiYWNrKTp0KSl9KHQpLGk9bmV3IEFycmF5KHIubGVuZ3RoKS5maWxsKCExKTtsZXQgbz0hMDtmb3IoO287KXtvPSExO2xldCB0PSEwO2ZvcihsZXQgcz0wO3M8ci5sZW5ndGg7KytzKXtpZihpW3NdKWNvbnRpbnVlO2NvbnN0IGE9cltzXTtpZihZKGEpKXJbc109YS5yZWZlclRvU2VsZi5jYWxsYmFjayhuKSxyW3NdLnJlZmVyVG9TZWxmPWEucmVmZXJUb1NlbGYsaVtzXT0hMCx0PSExO2Vsc2UgaWYoRyhhKSl7Y29uc3Qgbj1QKGEucmVmZXJUby5yZWZlcmVuY2VzLHIsZSk7bj8ocltzXT1hLnJlZmVyVG8uY2FsbGJhY2suYXBwbHkodGhpcyxuKSxyW3NdLnJlZmVyVG89YS5yZWZlclRvLGlbc109ITAsdD0hMSk6bz0hMH19aWYodCYmbyl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiByZXNvbHZpbmcgdHlwZWQucmVmZXJUbyIpfXJldHVybiByfWZ1bmN0aW9uIEIodCxlKXtpZihhLmNyZWF0ZUNvdW50KyssMD09PU9iamVjdC5rZXlzKGUpLmxlbmd0aCl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIk5vIHNpZ25hdHVyZXMgcHJvdmlkZWQiKTthLndhcm5BZ2FpbnN0RGVwcmVjYXRlZFRoaXMmJmZ1bmN0aW9uKHQpe2NvbnN0IGU9L1xidGhpcyhcKHxcLnNpZ25hdHVyZXNcYikvO09iamVjdC5rZXlzKHQpLmZvckVhY2goKG49Pntjb25zdCByPXRbbl07aWYoZS50ZXN0KHIudG9TdHJpbmcoKSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJVc2luZyBgdGhpc2AgdG8gc2VsZi1yZWZlcmVuY2UgYSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIHNpbmNlIHR5cGVkLWZ1bmN0aW9uQDMuIFVzZSB0eXBlZC5yZWZlclRvIGFuZCB0eXBlZC5yZWZlclRvU2VsZiBpbnN0ZWFkLiIpfSkpfShlKTtjb25zdCBuPVtdLHI9W10saT17fSxvPVtdO2xldCBzO2ZvcihzIGluIGUpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxzKSljb250aW51ZTtjb25zdCB0PXYocyk7aWYoIXQpY29udGludWU7bi5mb3JFYWNoKChmdW5jdGlvbihlKXtpZihMKGUsdCkpdGhyb3cgbmV3IFR5cGVFcnJvcignQ29uZmxpY3Rpbmcgc2lnbmF0dXJlcyAiJytkKGUpKyciIGFuZCAiJytkKHQpKyciLicpfSkpLG4ucHVzaCh0KTtjb25zdCBhPXIubGVuZ3RoO3IucHVzaChlW3NdKTtjb25zdCB1PXQubWFwKHkpO2xldCBjO2ZvcihjIG9mIE8odSkpe2NvbnN0IHQ9ZChjKTtvLnB1c2goe3BhcmFtczpjLG5hbWU6dCxmbjphfSksYy5ldmVyeSgodD0+IXQuaGFzQ29udmVyc2lvbikpJiYoaVt0XT1hKX19by5zb3J0KE0pO2NvbnN0IHU9UihyLGksb3QpO2xldCBjO2ZvcihjIGluIGkpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksYykmJihpW2NdPXVbaVtjXV0pO2NvbnN0IGw9W10saD1uZXcgTWFwO2ZvcihjIG9mIG8paC5oYXMoYy5uYW1lKXx8KGMuZm49dVtjLmZuXSxsLnB1c2goYyksaC5zZXQoYy5uYW1lLGMpKTtjb25zdCBmPWxbMF0mJmxbMF0ucGFyYW1zLmxlbmd0aDw9MiYmIV8obFswXS5wYXJhbXMpLHA9bFsxXSYmbFsxXS5wYXJhbXMubGVuZ3RoPD0yJiYhXyhsWzFdLnBhcmFtcyksZz1sWzJdJiZsWzJdLnBhcmFtcy5sZW5ndGg8PTImJiFfKGxbMl0ucGFyYW1zKSxtPWxbM10mJmxbM10ucGFyYW1zLmxlbmd0aDw9MiYmIV8obFszXS5wYXJhbXMpLGI9bFs0XSYmbFs0XS5wYXJhbXMubGVuZ3RoPD0yJiYhXyhsWzRdLnBhcmFtcyksRD1sWzVdJiZsWzVdLnBhcmFtcy5sZW5ndGg8PTImJiFfKGxbNV0ucGFyYW1zKSxFPWYmJnAmJmcmJm0mJmImJkQ7Zm9yKGxldCB0PTA7dDxsLmxlbmd0aDsrK3QpbFt0XS50ZXN0PXcobFt0XS5wYXJhbXMpO2NvbnN0IEM9Zj94KGxbMF0ucGFyYW1zWzBdKTpTcCxTPXA/eChsWzFdLnBhcmFtc1swXSk6U3AsQT1nP3gobFsyXS5wYXJhbXNbMF0pOlNwLE49bT94KGxbM10ucGFyYW1zWzBdKTpTcCxJPWI/eChsWzRdLnBhcmFtc1swXSk6U3AsVD1EP3gobFs1XS5wYXJhbXNbMF0pOlNwLFA9Zj94KGxbMF0ucGFyYW1zWzFdKTpTcCxCPXA/eChsWzFdLnBhcmFtc1sxXSk6U3Asaz1nP3gobFsyXS5wYXJhbXNbMV0pOlNwLHo9bT94KGxbM10ucGFyYW1zWzFdKTpTcCxqPWI/eChsWzRdLnBhcmFtc1sxXSk6U3AsVT1EP3gobFs1XS5wYXJhbXNbMV0pOlNwO2ZvcihsZXQgdD0wO3Q8bC5sZW5ndGg7Kyt0KWxbdF0uaW1wbGVtZW50YXRpb249RihsW3RdLnBhcmFtcyxsW3RdLmZuKTtjb25zdCBxPWY/bFswXS5pbXBsZW1lbnRhdGlvbjpBcCxWPXA/bFsxXS5pbXBsZW1lbnRhdGlvbjpBcCxHPWc/bFsyXS5pbXBsZW1lbnRhdGlvbjpBcCxZPW0/bFszXS5pbXBsZW1lbnRhdGlvbjpBcCxYPWI/bFs0XS5pbXBsZW1lbnRhdGlvbjpBcCxXPUQ/bFs1XS5pbXBsZW1lbnRhdGlvbjpBcCxIPWY/bFswXS5wYXJhbXMubGVuZ3RoOi0xLFo9cD9sWzFdLnBhcmFtcy5sZW5ndGg6LTEsSz1nP2xbMl0ucGFyYW1zLmxlbmd0aDotMSxKPW0/bFszXS5wYXJhbXMubGVuZ3RoOi0xLFE9Yj9sWzRdLnBhcmFtcy5sZW5ndGg6LTEsJD1EP2xbNV0ucGFyYW1zLmxlbmd0aDotMSx0dD1FPzY6MCxldD1sLmxlbmd0aCxudD1sLm1hcCgodD0+dC50ZXN0KSkscnQ9bC5tYXAoKHQ9PnQuaW1wbGVtZW50YXRpb24pKSxpdD1mdW5jdGlvbigpe2ZvcihsZXQgdD10dDt0PGV0O3QrKylpZihudFt0XShhcmd1bWVudHMpKXJldHVybiBydFt0XS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGEub25NaXNtYXRjaCh0LGFyZ3VtZW50cyxsKX07ZnVuY3Rpb24gb3QodCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PUgmJkModCkmJlAoZSk/cS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YXJndW1lbnRzLmxlbmd0aD09PVomJlModCkmJkIoZSk/Vi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YXJndW1lbnRzLmxlbmd0aD09PUsmJkEodCkmJmsoZSk/Ry5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YXJndW1lbnRzLmxlbmd0aD09PUomJk4odCkmJnooZSk/WS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YXJndW1lbnRzLmxlbmd0aD09PVEmJkkodCkmJmooZSk/WC5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YXJndW1lbnRzLmxlbmd0aD09PSQmJlQodCkmJlUoZSk/Vy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6aXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXRyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkob3QsIm5hbWUiLHt2YWx1ZTp0fSl9Y2F0Y2godCl7fXJldHVybiBvdC5zaWduYXR1cmVzPWksb3QuX3R5cGVkRnVuY3Rpb25EYXRhPXtzaWduYXR1cmVzOmwsc2lnbmF0dXJlTWFwOmh9LG90fWZ1bmN0aW9uIGsodCxlLG4pe3Rocm93IFModCxlLG4pfWZ1bmN0aW9uIHoodCl7cmV0dXJuIFUodCwwLHQubGVuZ3RoLTEpfWZ1bmN0aW9uIGoodCl7cmV0dXJuIHRbdC5sZW5ndGgtMV19ZnVuY3Rpb24gVSh0LGUsbil7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQsZSxuKX1mdW5jdGlvbiBxKHQsZSl7cmV0dXJue3JlZmVyVG86e3JlZmVyZW5jZXM6dCxjYWxsYmFjazplfX19ZnVuY3Rpb24gVih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYWxsYmFjayBmdW5jdGlvbiBleHBlY3RlZCBhcyBmaXJzdCBhcmd1bWVudCIpO3JldHVybntyZWZlclRvU2VsZjp7Y2FsbGJhY2s6dH19fWZ1bmN0aW9uIEcodCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdC5yZWZlclRvJiZBcnJheS5pc0FycmF5KHQucmVmZXJUby5yZWZlcmVuY2VzKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVmZXJUby5jYWxsYmFja31mdW5jdGlvbiBZKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQucmVmZXJUb1NlbGYmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlZmVyVG9TZWxmLmNhbGxiYWNrfWZ1bmN0aW9uIFgodCxlKXtpZighdClyZXR1cm4gZTtpZihlJiZlIT09dCl7Y29uc3Qgbj1uZXcgRXJyb3IoIkZ1bmN0aW9uIG5hbWVzIGRvIG5vdCBtYXRjaCAoZXhwZWN0ZWQ6ICIrdCsiLCBhY3R1YWw6ICIrZSsiKSIpO3Rocm93IG4uZGF0YT17YWN0dWFsOmUsZXhwZWN0ZWQ6dH0sbn1yZXR1cm4gdH1mdW5jdGlvbiBXKHQpe2xldCBlO2Zvcihjb25zdCBuIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihmKHRbbl0pfHwic3RyaW5nIj09dHlwZW9mIHRbbl0uc2lnbmF0dXJlKSYmKGU9WChlLHRbbl0ubmFtZSkpO3JldHVybiBlfWZ1bmN0aW9uIEgodCxlKXtsZXQgbjtmb3IobiBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pKXtpZihuIGluIHQmJmVbbl0hPT10W25dKXtjb25zdCByPW5ldyBFcnJvcignU2lnbmF0dXJlICInK24rJyIgaXMgZGVmaW5lZCB0d2ljZScpO3Rocm93IHIuZGF0YT17c2lnbmF0dXJlOm4sc291cmNlRnVuY3Rpb246ZVtuXSxkZXN0RnVuY3Rpb246dFtuXX0scn10W25dPWVbbl19fWwoKSxjKG4pO2NvbnN0IFo9YTtmdW5jdGlvbiBLKHQpe2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQuZnJvbXx8InN0cmluZyIhPXR5cGVvZiB0LnRvfHwiZnVuY3Rpb24iIT10eXBlb2YgdC5jb252ZXJ0KXRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCB3aXRoIHByb3BlcnRpZXMge2Zyb206IHN0cmluZywgdG86IHN0cmluZywgY29udmVydDogZnVuY3Rpb259IGV4cGVjdGVkIik7aWYodC50bz09PXQuZnJvbSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0lsbGVnYWwgdG8gZGVmaW5lIGNvbnZlcnNpb24gZnJvbSAiJyt0LmZyb20rJyIgdG8gaXRzZWxmLicpfXJldHVybiBhPWZ1bmN0aW9uKHQpe2NvbnN0IG49InN0cmluZyI9PXR5cGVvZiB0O2xldCByPW4/dDoiIjtjb25zdCBpPXt9O2ZvcihsZXQgdD1uPzE6MDt0PGFyZ3VtZW50cy5sZW5ndGg7Kyt0KXtjb25zdCBvPWFyZ3VtZW50c1t0XTtsZXQgcyxhPXt9O2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBvPyhzPW8ubmFtZSwic3RyaW5nIj09dHlwZW9mIG8uc2lnbmF0dXJlP2Fbby5zaWduYXR1cmVdPW86ZihvKSYmKGE9by5zaWduYXR1cmVzKSk6ZShvKSYmKGE9byxufHwocz1XKG8pKSksMD09PU9iamVjdC5rZXlzKGEpLmxlbmd0aCl7Y29uc3QgZT1uZXcgVHlwZUVycm9yKCJBcmd1bWVudCB0byAndHlwZWQnIGF0IGluZGV4ICIrdCsiIGlzIG5vdCBhICh0eXBlZCkgZnVuY3Rpb24sIG5vciBhbiBvYmplY3Qgd2l0aCBzaWduYXR1cmVzIGFzIGtleXMgYW5kIGZ1bmN0aW9ucyBhcyB2YWx1ZXMuIik7dGhyb3cgZS5kYXRhPXtpbmRleDp0LGFyZ3VtZW50Om99LGV9bnx8KHI9WChyLHMpKSxIKGksYSl9cmV0dXJuIEIocnx8IiIsaSl9LGEuY3JlYXRlPXQsYS5jcmVhdGVDb3VudD1aLmNyZWF0ZUNvdW50LGEub25NaXNtYXRjaD1rLGEudGhyb3dNaXNtYXRjaEVycm9yPWssYS5jcmVhdGVFcnJvcj1TLGEuY2xlYXI9bCxhLmNsZWFyQ29udmVyc2lvbnM9ZnVuY3Rpb24oKXtsZXQgdDtmb3IodCBvZiBvKWkuZ2V0KHQpLmNvbnZlcnNpb25zVG89W107cz0wfSxhLmFkZFR5cGVzPWMsYS5fZmluZFR5cGU9dSxhLnJlZmVyVG89ZnVuY3Rpb24oKXtjb25zdCB0PXooYXJndW1lbnRzKS5tYXAoKHQ9PmQodih0KSkpKSxlPWooYXJndW1lbnRzKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYWxsYmFjayBmdW5jdGlvbiBleHBlY3RlZCBhcyBsYXN0IGFyZ3VtZW50Iik7cmV0dXJuIHEodCxlKX0sYS5yZWZlclRvU2VsZj1WLGEuY29udmVydD1mdW5jdGlvbih0LGUpe2NvbnN0IG49dShlKTtpZihuLnRlc3QodCkpcmV0dXJuIHQ7Y29uc3Qgcj1uLmNvbnZlcnNpb25zVG87aWYoMD09PXIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVGhlcmUgYXJlIG5vIGNvbnZlcnNpb25zIHRvICIrZSsiIGRlZmluZWQuIik7Zm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspaWYodShyW2VdLmZyb20pLnRlc3QodCkpcmV0dXJuIHJbZV0uY29udmVydCh0KTt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICIrdCsiIHRvICIrZSl9LGEuZmluZFNpZ25hdHVyZT1wLGEuZmluZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHAodCxlLG4pLmltcGxlbWVudGF0aW9ufSxhLmlzVHlwZWRGdW5jdGlvbj1mLGEud2FybkFnYWluc3REZXByZWNhdGVkVGhpcz0hMCxhLmFkZFR5cGU9ZnVuY3Rpb24odCxlKXtsZXQgbj0iYW55IjshMSE9PWUmJmkuaGFzKCJPYmplY3QiKSYmKG49Ik9iamVjdCIpLGEuYWRkVHlwZXMoW3RdLG4pfSxhLmFkZENvbnZlcnNpb249ZnVuY3Rpb24odCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntvdmVycmlkZTohMX07Syh0KTtjb25zdCBuPXUodC50bykscj1uLmNvbnZlcnNpb25zVG8uZmluZCgoZT0+ZS5mcm9tPT09dC5mcm9tKSk7aWYocil7aWYoIWV8fCFlLm92ZXJyaWRlKXRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgYWxyZWFkeSBhIGNvbnZlcnNpb24gZnJvbSAiJyt0LmZyb20rJyIgdG8gIicrbi5uYW1lKyciJyk7YS5yZW1vdmVDb252ZXJzaW9uKHtmcm9tOnIuZnJvbSx0bzp0LnRvLGNvbnZlcnQ6ci5jb252ZXJ0fSl9bi5jb252ZXJzaW9uc1RvLnB1c2goe2Zyb206dC5mcm9tLGNvbnZlcnQ6dC5jb252ZXJ0LGluZGV4OnMrK30pfSxhLmFkZENvbnZlcnNpb25zPWZ1bmN0aW9uKHQsZSl7dC5mb3JFYWNoKCh0PT5hLmFkZENvbnZlcnNpb24odCxlKSkpfSxhLnJlbW92ZUNvbnZlcnNpb249ZnVuY3Rpb24odCl7Syh0KTtjb25zdCBlPXUodC50byksbj1mdW5jdGlvbih0LGUpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWlmKGUodFtuXSkpcmV0dXJuIHRbbl19KGUuY29udmVyc2lvbnNUbywoZT0+ZS5mcm9tPT09dC5mcm9tKSk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0IHRvIHJlbW92ZSBub25leGlzdGVudCBjb252ZXJzaW9uIGZyb20gIit0LmZyb20rIiB0byAiK3QudG8pO2lmKG4uY29udmVydCE9PXQuY29udmVydCl0aHJvdyBuZXcgRXJyb3IoIkNvbnZlcnNpb24gdG8gcmVtb3ZlIGRvZXMgbm90IG1hdGNoIGV4aXN0aW5nIGNvbnZlcnNpb24iKTtjb25zdCByPWUuY29udmVyc2lvbnNUby5pbmRleE9mKG4pO2UuY29udmVyc2lvbnNUby5zcGxpY2UociwxKX0sYS5yZXNvbHZlPWZ1bmN0aW9uKHQsZSl7aWYoIWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcihOcCk7Y29uc3Qgbj10Ll90eXBlZEZ1bmN0aW9uRGF0YS5zaWduYXR1cmVzO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7Kyt0KWlmKG5bdF0udGVzdChlKSlyZXR1cm4gblt0XTtyZXR1cm4gbnVsbH0sYX0oKTtmdW5jdGlvbiBNcCh0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0fHwhIWlzRmluaXRlKHQpJiZ0PT09TWF0aC5yb3VuZCh0KX1mdW5jdGlvbiBGcCh0LGUsbil7dmFyIHI9ezI6IjBiIiw4OiIwbyIsMTY6IjB4In1bZV0saT0iIjtpZihuKXtpZihuPDEpdGhyb3cgbmV3IEVycm9yKCJzaXplIG11c3QgYmUgaW4gZ3JlYXRlciB0aGFuIDAiKTtpZighTXAobikpdGhyb3cgbmV3IEVycm9yKCJzaXplIG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKHQ+VGYoMixuLTEpLTF8fHQ8LVRmKDIsbi0xKSl0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIG11c3QgYmUgaW4gcmFuZ2UgWy0yXiIuY29uY2F0KG4tMSwiLCAyXiIpLmNvbmNhdChuLTEsIi0xXSIpKTtpZighTXAodCkpdGhyb3cgbmV3IEVycm9yKCJWYWx1ZSBtdXN0IGJlIGFuIGludGVnZXIiKTt0PDAmJih0Kz1UZigyLG4pKSxpPSJpIi5jb25jYXQobil9dmFyIG89IiI7cmV0dXJuIHQ8MCYmKHQ9LXQsbz0iLSIpLCIiLmNvbmNhdChvKS5jb25jYXQocikuY29uY2F0KHQudG9TdHJpbmcoZSkpLmNvbmNhdChpKX1mdW5jdGlvbiBUcCh0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlKXJldHVybiBlKHQpO2lmKHQ9PT0xLzApcmV0dXJuIkluZmluaXR5IjtpZih0PT09LTEvMClyZXR1cm4iLUluZmluaXR5IjtpZihpc05hTih0KSlyZXR1cm4iTmFOIjt2YXIgbixyLGk9ImF1dG8iO2lmKGUmJihlLm5vdGF0aW9uJiYoaT1lLm5vdGF0aW9uKSxQZihlKT9uPWU6UGYoZS5wcmVjaXNpb24pJiYobj1lLnByZWNpc2lvbiksZS53b3JkU2l6ZSYmIm51bWJlciIhPXR5cGVvZihyPWUud29yZFNpemUpKSl0aHJvdyBuZXcgRXJyb3IoJ09wdGlvbiAid29yZFNpemUiIG11c3QgYmUgYSBudW1iZXInKTtzd2l0Y2goaSl7Y2FzZSJmaXhlZCI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odCl8fCFpc0Zpbml0ZSh0KSlyZXR1cm4gU3RyaW5nKHQpO3ZhciBuPU9wKHQpLHI9Im51bWJlciI9PXR5cGVvZiBlP1BwKG4sbi5leHBvbmVudCsxK2UpOm4saT1yLmNvZWZmaWNpZW50cyxvPXIuZXhwb25lbnQrMSxzPW8rKGV8fDApO3JldHVybiBpLmxlbmd0aDxzJiYoaT1pLmNvbmNhdChScChzLWkubGVuZ3RoKSkpLG88MCYmKGk9UnAoMS1vKS5jb25jYXQoaSksbz0xKSxvPGkubGVuZ3RoJiZpLnNwbGljZShvLDAsMD09PW8/IjAuIjoiLiIpLHIuc2lnbitpLmpvaW4oIiIpfSh0LG4pO2Nhc2UiZXhwb25lbnRpYWwiOnJldHVybiBMcCh0LG4pO2Nhc2UiZW5naW5lZXJpbmciOnJldHVybiBmdW5jdGlvbih0LGUpe2lmKGlzTmFOKHQpfHwhaXNGaW5pdGUodCkpcmV0dXJuIFN0cmluZyh0KTt2YXIgbj1PcCh0KSxyPVBwKG4sZSksaT1yLmV4cG9uZW50LG89ci5jb2VmZmljaWVudHMscz1pJTM9PTA/aTppPDA/aS0zLWklMzppLWklMztpZihQZihlKSlmb3IoO2U+by5sZW5ndGh8fGktcysxPm8ubGVuZ3RoOylvLnB1c2goMCk7ZWxzZSBmb3IodmFyIGE9TWF0aC5hYnMoaS1zKS0oby5sZW5ndGgtMSksdT0wO3U8YTt1Kyspby5wdXNoKDApO2Zvcih2YXIgYz1NYXRoLmFicyhpLXMpLGw9MTtjPjA7KWwrKyxjLS07dmFyIGg9by5zbGljZShsKS5qb2luKCIiKSxmPVBmKGUpJiZoLmxlbmd0aHx8aC5tYXRjaCgvWzEtOV0vKT8iLiIraDoiIixwPW8uc2xpY2UoMCxsKS5qb2luKCIiKStmKyJlIisoaT49MD8iKyI6IiIpK3MudG9TdHJpbmcoKTtyZXR1cm4gci5zaWduK3B9KHQsbik7Y2FzZSJiaW4iOnJldHVybiBGcCh0LDIscik7Y2FzZSJvY3QiOnJldHVybiBGcCh0LDgscik7Y2FzZSJoZXgiOnJldHVybiBGcCh0LDE2LHIpO2Nhc2UiYXV0byI6cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtpZihpc05hTih0KXx8IWlzRmluaXRlKHQpKXJldHVybiBTdHJpbmcodCk7dmFyIHI9biYmdm9pZCAwIT09bi5sb3dlckV4cD9uLmxvd2VyRXhwOi0zLGk9biYmdm9pZCAwIT09bi51cHBlckV4cD9uLnVwcGVyRXhwOjUsbz1PcCh0KSxzPWU/UHAobyxlKTpvO2lmKHMuZXhwb25lbnQ8cnx8cy5leHBvbmVudD49aSlyZXR1cm4gTHAodCxlKTt2YXIgYT1zLmNvZWZmaWNpZW50cyx1PXMuZXhwb25lbnQ7YS5sZW5ndGg8ZSYmKGE9YS5jb25jYXQoUnAoZS1hLmxlbmd0aCkpKSxhPWEuY29uY2F0KFJwKHUtYS5sZW5ndGgrMSsoYS5sZW5ndGg8ZT9lLWEubGVuZ3RoOjApKSksYT1ScCgtdSkuY29uY2F0KGEpO3ZhciBjPXU+MD91OjA7cmV0dXJuIGM8YS5sZW5ndGgtMSYmYS5zcGxpY2UoYysxLDAsIi4iKSxzLnNpZ24rYS5qb2luKCIiKX0odCxuLGUmJmUpLnJlcGxhY2UoLygoXC5cZCo/KSgwKykpKCR8ZSkvLChmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50c1syXSxlPWFyZ3VtZW50c1s0XTtyZXR1cm4iLiIhPT10P3QrZTplfSkpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG5vdGF0aW9uICInK2krJyIuIENob29zZSAiYXV0byIsICJleHBvbmVudGlhbCIsICJmaXhlZCIsICJiaW4iLCAib2N0Iiwgb3IgImhleC4nKX19ZnVuY3Rpb24gT3AodCl7dmFyIGU9U3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkubWF0Y2goL14oLT8pKFxkK1wuP1xkKikoZShbKy1dP1xkKykpPyQvKTtpZighZSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkludmFsaWQgbnVtYmVyICIrdCk7dmFyIG49ZVsxXSxyPWVbMl0saT1wYXJzZUZsb2F0KGVbNF18fCIwIiksbz1yLmluZGV4T2YoIi4iKTtpKz0tMSE9PW8/by0xOnIubGVuZ3RoLTE7dmFyIHM9ci5yZXBsYWNlKCIuIiwiIikucmVwbGFjZSgvXjAqLywoZnVuY3Rpb24odCl7cmV0dXJuIGktPXQubGVuZ3RoLCIifSkpLnJlcGxhY2UoLzAqJC8sIiIpLnNwbGl0KCIiKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUludCh0KX0pKTtyZXR1cm4gMD09PXMubGVuZ3RoJiYocy5wdXNoKDApLGkrKykse3NpZ246bixjb2VmZmljaWVudHM6cyxleHBvbmVudDppfX1mdW5jdGlvbiBMcCh0LGUpe2lmKGlzTmFOKHQpfHwhaXNGaW5pdGUodCkpcmV0dXJuIFN0cmluZyh0KTt2YXIgbj1PcCh0KSxyPWU/UHAobixlKTpuLGk9ci5jb2VmZmljaWVudHMsbz1yLmV4cG9uZW50O2kubGVuZ3RoPGUmJihpPWkuY29uY2F0KFJwKGUtaS5sZW5ndGgpKSk7dmFyIHM9aS5zaGlmdCgpO3JldHVybiByLnNpZ24rcysoaS5sZW5ndGg+MD8iLiIraS5qb2luKCIiKToiIikrImUiKyhvPj0wPyIrIjoiIikrb31mdW5jdGlvbiBQcCh0LGUpe2Zvcih2YXIgbj17c2lnbjp0LnNpZ24sY29lZmZpY2llbnRzOnQuY29lZmZpY2llbnRzLGV4cG9uZW50OnQuZXhwb25lbnR9LHI9bi5jb2VmZmljaWVudHM7ZTw9MDspci51bnNoaWZ0KDApLG4uZXhwb25lbnQrKyxlKys7aWYoci5sZW5ndGg+ZSYmci5zcGxpY2UoZSxyLmxlbmd0aC1lKVswXT49NSl7dmFyIGk9ZS0xO2ZvcihyW2ldKys7MTA9PT1yW2ldOylyLnBvcCgpLDA9PT1pJiYoci51bnNoaWZ0KDApLG4uZXhwb25lbnQrKyxpKyspLHJbLS1pXSsrfXJldHVybiBufWZ1bmN0aW9uIFJwKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0O24rKyllLnB1c2goMCk7cmV0dXJuIGV9dmFyIEJwPU51bWJlci5FUFNJTE9OfHwyMjIwNDQ2MDQ5MjUwMzEzZS0zMTtmdW5jdGlvbiBrcCh0LGUsbil7aWYobnVsbD09bilyZXR1cm4gdD09PWU7aWYodD09PWUpcmV0dXJuITA7aWYoaXNOYU4odCl8fGlzTmFOKGUpKXJldHVybiExO2lmKGlzRmluaXRlKHQpJiZpc0Zpbml0ZShlKSl7dmFyIHI9TWF0aC5hYnModC1lKTtyZXR1cm4gcjxCcHx8cjw9TWF0aC5tYXgoTWF0aC5hYnModCksTWF0aC5hYnMoZSkpKm59cmV0dXJuITF9ZnVuY3Rpb24genAodCxlLG4pe3ZhciByPW5ldygwLHQuY29uc3RydWN0b3IpKDIpLGk9IiI7aWYobil7aWYobjwxKXRocm93IG5ldyBFcnJvcigic2l6ZSBtdXN0IGJlIGluIGdyZWF0ZXIgdGhhbiAwIik7aWYoIU1wKG4pKXRocm93IG5ldyBFcnJvcigic2l6ZSBtdXN0IGJlIGFuIGludGVnZXIiKTtpZih0LmdyZWF0ZXJUaGFuKHIucG93KG4tMSkuc3ViKDEpKXx8dC5sZXNzVGhhbihyLnBvdyhuLTEpLm11bCgtMSkpKXRocm93IG5ldyBFcnJvcigiVmFsdWUgbXVzdCBiZSBpbiByYW5nZSBbLTJeIi5jb25jYXQobi0xLCIsIDJeIikuY29uY2F0KG4tMSwiLTFdIikpO2lmKCF0LmlzSW50ZWdlcigpKXRocm93IG5ldyBFcnJvcigiVmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyIik7dC5sZXNzVGhhbigwKSYmKHQ9dC5hZGQoci5wb3cobikpKSxpPSJpIi5jb25jYXQobil9c3dpdGNoKGUpe2Nhc2UgMjpyZXR1cm4iIi5jb25jYXQodC50b0JpbmFyeSgpKS5jb25jYXQoaSk7Y2FzZSA4OnJldHVybiIiLmNvbmNhdCh0LnRvT2N0YWwoKSkuY29uY2F0KGkpO2Nhc2UgMTY6cmV0dXJuIiIuY29uY2F0KHQudG9IZXhhZGVjaW1hbCgpKS5jb25jYXQoaSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkJhc2UgIi5jb25jYXQoZSwiIG5vdCBzdXBwb3J0ZWQgIikpfX1mdW5jdGlvbiBqcCh0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlKXJldHVybiBlKHQpO2lmKCF0LmlzRmluaXRlKCkpcmV0dXJuIHQuaXNOYU4oKT8iTmFOIjp0Lmd0KDApPyJJbmZpbml0eSI6Ii1JbmZpbml0eSI7dmFyIG4scixpPSJhdXRvIjtpZih2b2lkIDAhPT1lJiYoZS5ub3RhdGlvbiYmKGk9ZS5ub3RhdGlvbiksIm51bWJlciI9PXR5cGVvZiBlP249ZTp2b2lkIDAhPT1lLnByZWNpc2lvbiYmKG49ZS5wcmVjaXNpb24pLGUud29yZFNpemUmJiJudW1iZXIiIT10eXBlb2Yocj1lLndvcmRTaXplKSkpdGhyb3cgbmV3IEVycm9yKCdPcHRpb24gIndvcmRTaXplIiBtdXN0IGJlIGEgbnVtYmVyJyk7c3dpdGNoKGkpe2Nhc2UiZml4ZWQiOnJldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvRml4ZWQoZSl9KHQsbik7Y2FzZSJleHBvbmVudGlhbCI6cmV0dXJuIFVwKHQsbik7Y2FzZSJlbmdpbmVlcmluZyI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5lLHI9biUzPT0wP246bjwwP24tMy1uJTM6bi1uJTMsaT10Lm11bChNYXRoLnBvdygxMCwtcikpLG89aS50b1ByZWNpc2lvbihlKTtpZigtMSE9PW8uaW5kZXhPZigiZSIpKXtvPW5ldygwLHQuY29uc3RydWN0b3IpKG8pLnRvRml4ZWQoKX1yZXR1cm4gbysiZSIrKG4+PTA/IisiOiIiKStyLnRvU3RyaW5nKCl9KHQsbik7Y2FzZSJiaW4iOnJldHVybiB6cCh0LDIscik7Y2FzZSJvY3QiOnJldHVybiB6cCh0LDgscik7Y2FzZSJoZXgiOnJldHVybiB6cCh0LDE2LHIpO2Nhc2UiYXV0byI6dmFyIG89ZSYmdm9pZCAwIT09ZS5sb3dlckV4cD9lLmxvd2VyRXhwOi0zLHM9ZSYmdm9pZCAwIT09ZS51cHBlckV4cD9lLnVwcGVyRXhwOjU7aWYodC5pc1plcm8oKSlyZXR1cm4iMCI7dmFyIGE9dC50b1NpZ25pZmljYW50RGlnaXRzKG4pLHU9YS5lO3JldHVybih1Pj1vJiZ1PHM/YS50b0ZpeGVkKCk6VXAodCxuKSkucmVwbGFjZSgvKChcLlxkKj8pKDArKSkoJHxlKS8sKGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzJdLGU9YXJndW1lbnRzWzRdO3JldHVybiIuIiE9PXQ/dCtlOmV9KSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm90YXRpb24gIicraSsnIi4gQ2hvb3NlICJhdXRvIiwgImV4cG9uZW50aWFsIiwgImZpeGVkIiwgImJpbiIsICJvY3QiLCBvciAiaGV4LicpfX1mdW5jdGlvbiBVcCh0LGUpe3JldHVybiB2b2lkIDAhPT1lP3QudG9FeHBvbmVudGlhbChlLTEpOnQudG9FeHBvbmVudGlhbCgpfWZ1bmN0aW9uIHFwKHQsZSl7dmFyIG49ZnVuY3Rpb24odCxlKXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIFRwKHQsZSk7aWYoUmYodCkpcmV0dXJuIGpwKHQsZSk7aWYoZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdCYmIm51bWJlciI9PXR5cGVvZiB0LnMmJiJudW1iZXIiPT10eXBlb2YgdC5uJiYibnVtYmVyIj09dHlwZW9mIHQuZHx8ITF9KHQpKXJldHVybiBlJiYiZGVjaW1hbCI9PT1lLmZyYWN0aW9uP3QudG9TdHJpbmcoKTp0LnMqdC5uKyIvIit0LmQ7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gVnAodCxlKTtpZihqZih0KSlyZXR1cm4nIicrdCsnIic7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpcmV0dXJuIHQuc3ludGF4P1N0cmluZyh0LnN5bnRheCk6ImZ1bmN0aW9uIjtpZih0JiYib2JqZWN0Ij09dHlwZW9mIHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LmZvcm1hdD90LmZvcm1hdChlKTp0JiZ0LnRvU3RyaW5nKGUpIT09e30udG9TdHJpbmcoKT90LnRvU3RyaW5nKGUpOiJ7IitPYmplY3Qua2V5cyh0KS5tYXAoKG49PiciJytuKyciOiAnK3FwKHRbbl0sZSkpKS5qb2luKCIsICIpKyJ9In1yZXR1cm4gU3RyaW5nKHQpfSh0LGUpO3JldHVybiBlJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJ0cnVuY2F0ZSJpbiBlJiZuLmxlbmd0aD5lLnRydW5jYXRlP24uc3Vic3RyaW5nKDAsZS50cnVuY2F0ZS0zKSsiLi4uIjpufWZ1bmN0aW9uIFZwKHQsZSl7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciBuPSJbIixyPXQubGVuZ3RoLGk9MDtpPHI7aSsrKTAhPT1pJiYobis9IiwgIiksbis9VnAodFtpXSxlKTtyZXR1cm4gbis9Il0ifXJldHVybiBxcCh0LGUpfWZ1bmN0aW9uIEdwKHQsZSxuKXtpZighKHRoaXMgaW5zdGFuY2VvZiBHcCkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3IiKTt0aGlzLmFjdHVhbD10LHRoaXMuZXhwZWN0ZWQ9ZSx0aGlzLnJlbGF0aW9uPW4sdGhpcy5tZXNzYWdlPSJEaW1lbnNpb24gbWlzbWF0Y2ggKCIrKEFycmF5LmlzQXJyYXkodCk/IlsiK3Quam9pbigiLCAiKSsiXSI6dCkrIiAiKyh0aGlzLnJlbGF0aW9ufHwiIT0iKSsiICIrKEFycmF5LmlzQXJyYXkoZSk/IlsiK2Uuam9pbigiLCAiKSsiXSI6ZSkrIikiLHRoaXMuc3RhY2s9KG5ldyBFcnJvcikuc3RhY2t9ZnVuY3Rpb24gWXAodCxlLG4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIFlwKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO3RoaXMuaW5kZXg9dCxhcmd1bWVudHMubGVuZ3RoPDM/KHRoaXMubWluPTAsdGhpcy5tYXg9ZSk6KHRoaXMubWluPWUsdGhpcy5tYXg9biksdm9pZCAwIT09dGhpcy5taW4mJnRoaXMuaW5kZXg8dGhpcy5taW4/dGhpcy5tZXNzYWdlPSJJbmRleCBvdXQgb2YgcmFuZ2UgKCIrdGhpcy5pbmRleCsiIDwgIit0aGlzLm1pbisiKSI6dm9pZCAwIT09dGhpcy5tYXgmJnRoaXMuaW5kZXg+PXRoaXMubWF4P3RoaXMubWVzc2FnZT0iSW5kZXggb3V0IG9mIHJhbmdlICgiK3RoaXMuaW5kZXgrIiA+ICIrKHRoaXMubWF4LTEpKyIpIjp0aGlzLm1lc3NhZ2U9IkluZGV4IG91dCBvZiByYW5nZSAoIit0aGlzLmluZGV4KyIpIix0aGlzLnN0YWNrPShuZXcgRXJyb3IpLnN0YWNrfWZ1bmN0aW9uIFhwKHQpe2Zvcih2YXIgZT1bXTtBcnJheS5pc0FycmF5KHQpOyllLnB1c2godC5sZW5ndGgpLHQ9dFswXTtyZXR1cm4gZX1mdW5jdGlvbiBXcCh0LGUsbil7dmFyIHIsaT10Lmxlbmd0aDtpZihpIT09ZVtuXSl0aHJvdyBuZXcgR3AoaSxlW25dKTtpZihuPGUubGVuZ3RoLTEpe3ZhciBvPW4rMTtmb3Iocj0wO3I8aTtyKyspe3ZhciBzPXRbcl07aWYoIUFycmF5LmlzQXJyYXkocykpdGhyb3cgbmV3IEdwKGUubGVuZ3RoLTEsZS5sZW5ndGgsIjwiKTtXcCh0W3JdLGUsbyl9fWVsc2UgZm9yKHI9MDtyPGk7cisrKWlmKEFycmF5LmlzQXJyYXkodFtyXSkpdGhyb3cgbmV3IEdwKGUubGVuZ3RoKzEsZS5sZW5ndGgsIj4iKX1mdW5jdGlvbiBIcCh0LGUpe2lmKDA9PT1lLmxlbmd0aCl7aWYoQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgR3AodC5sZW5ndGgsMCl9ZWxzZSBXcCh0LGUsMCl9ZnVuY3Rpb24gWnAodCxlKXtpZighUGYodCl8fCFNcCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbmRleCBtdXN0IGJlIGFuIGludGVnZXIgKHZhbHVlOiAiK3QrIikiKTtpZih0PDB8fCJudW1iZXIiPT10eXBlb2YgZSYmdD49ZSl0aHJvdyBuZXcgWXAodCxlKX1mdW5jdGlvbiBLcCh0LGUsbil7aWYoIUFycmF5LmlzQXJyYXkodCl8fCFBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkIik7aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUmVzaXppbmcgdG8gc2NhbGFyIGlzIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighUGYodCl8fCFNcCh0KXx8dDwwKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgc2l6ZSwgbXVzdCBjb250YWluIHBvc2l0aXZlIGludGVnZXJzIChzaXplOiAiK3FwKGUpKyIpIil9KSksSnAodCxlLDAsdm9pZCAwIT09bj9uOjApLHR9ZnVuY3Rpb24gSnAodCxlLG4scil7dmFyIGksbyxzPXQubGVuZ3RoLGE9ZVtuXSx1PU1hdGgubWluKHMsYSk7aWYodC5sZW5ndGg9YSxuPGUubGVuZ3RoLTEpe3ZhciBjPW4rMTtmb3IoaT0wO2k8dTtpKyspbz10W2ldLEFycmF5LmlzQXJyYXkobyl8fChvPVtvXSx0W2ldPW8pLEpwKG8sZSxjLHIpO2ZvcihpPXU7aTxhO2krKylvPVtdLHRbaV09byxKcChvLGUsYyxyKX1lbHNle2ZvcihpPTA7aTx1O2krKylmb3IoO0FycmF5LmlzQXJyYXkodFtpXSk7KXRbaV09dFtpXVswXTtmb3IoaT11O2k8YTtpKyspdFtpXT1yfX1mdW5jdGlvbiBRcCh0LGUpe3ZhciBuPWZ1bmN0aW9uKHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiB0O3ZhciBlPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uIHQobil7QXJyYXkuaXNBcnJheShuKT9uLmZvckVhY2godCk6ZS5wdXNoKG4pfSkpLGV9KHQpLHI9bi5sZW5ndGg7aWYoIUFycmF5LmlzQXJyYXkodCl8fCFBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkIik7aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBHcCgwLHIsIiE9Iik7dmFyIGk9dGQoZT0kcChlLHIpKTtpZihyIT09aSl0aHJvdyBuZXcgR3AoaSxyLCIhPSIpO3RyeXtyZXR1cm4gZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scj10LGk9ZS5sZW5ndGgtMTtpPjA7aS0tKXt2YXIgbz1lW2ldO249W107Zm9yKHZhciBzPXIubGVuZ3RoL28sYT0wO2E8czthKyspbi5wdXNoKHIuc2xpY2UoYSpvLChhKzEpKm8pKTtyPW59cmV0dXJuIHJ9KG4sZSl9Y2F0Y2godCl7dGhyb3cgdCBpbnN0YW5jZW9mIEdwP25ldyBHcChpLHIsIiE9Iik6dH19ZnVuY3Rpb24gJHAodCxlKXt2YXIgbj10ZCh0KSxyPXQuc2xpY2UoKSxpPXQuaW5kZXhPZigtMSk7aWYodC5pbmRleE9mKC0xLGkrMSk+PTApdGhyb3cgbmV3IEVycm9yKCJNb3JlIHRoYW4gb25lIHdpbGRjYXJkIGluIHNpemVzIik7aWYoaT49MCl7aWYoIShlJW49PTApKXRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IHJlcGxhY2Ugd2lsZGNhcmQsIHNpbmNlICIrZSsiIGlzIG5vIG11bHRpcGxlIG9mICIrLW4pO3JbaV09LWUvbn1yZXR1cm4gcn1mdW5jdGlvbiB0ZCh0KXtyZXR1cm4gdC5yZWR1Y2UoKCh0LGUpPT50KmUpLDEpfWZ1bmN0aW9uIGVkKHQsZSxuLHIpe3ZhciBpPXJ8fFhwKHQpO2lmKG4pZm9yKHZhciBvPTA7bzxuO28rKyl0PVt0XSxpLnVuc2hpZnQoMSk7Zm9yKHQ9bmQodCxlLDApO2kubGVuZ3RoPGU7KWkucHVzaCgxKTtyZXR1cm4gdH1mdW5jdGlvbiBuZCh0LGUsbil7dmFyIHIsaTtpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgbz1uKzE7Zm9yKHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspdFtyXT1uZCh0W3JdLGUsbyl9ZWxzZSBmb3IodmFyIHM9bjtzPGU7cysrKXQ9W3RdO3JldHVybiB0fWZ1bmN0aW9uIHJkKHQsZSl7Zm9yKHZhciBuLHI9MCxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBvPXRbaV0scz1BcnJheS5pc0FycmF5KG8pO2lmKDA9PT1pJiZzJiYocj1vLmxlbmd0aCkscyYmby5sZW5ndGghPT1yKXJldHVybjt2YXIgYT1zP3JkKG8sZSk6ZShvKTtpZih2b2lkIDA9PT1uKW49YTtlbHNlIGlmKG4hPT1hKXJldHVybiJtaXhlZCJ9cmV0dXJuIG59ZnVuY3Rpb24gaWQodCxlLG4scil7ZnVuY3Rpb24gaShyKXt2YXIgaT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj17fSxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl0sbz10W2ldO3ZvaWQgMCE9PW8mJihuW2ldPW8pfXJldHVybiBufShyLGUubWFwKG9kKSk7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLmZpbHRlcigodD0+IWZ1bmN0aW9uKHQpe3JldHVybiB0JiYiPyI9PT10WzBdfSh0KSkpLmV2ZXJ5KCh0PT52b2lkIDAhPT1uW3RdKSk7aWYoIXIpe3ZhciBpPWUuZmlsdGVyKCh0PT52b2lkIDA9PT1uW3RdKSk7dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGZ1bmN0aW9uICInLmNvbmNhdCh0LCciLCAnKSsic29tZSBkZXBlbmRlbmNpZXMgYXJlIG1pc3Npbmc6ICIuY29uY2F0KGkubWFwKCh0PT4nIicuY29uY2F0KHQsJyInKSkpLmpvaW4oIiwgIiksIi4iKSl9fSh0LGUsciksbihpKX1yZXR1cm4gaS5pc0ZhY3Rvcnk9ITAsaS5mbj10LGkuZGVwZW5kZW5jaWVzPWUuc2xpY2UoKS5zb3J0KCksciYmKGkubWV0YT1yKSxpfWZ1bmN0aW9uIG9kKHQpe3JldHVybiB0JiYiPyI9PT10WzBdP3Quc2xpY2UoMSk6dH1mdW5jdGlvbiBzZCh0LGUpe2lmKGNkKHQpJiZ1ZCh0LGUpKXJldHVybiB0W2VdO3Rocm93ImZ1bmN0aW9uIj09dHlwZW9mIHRbZV0mJmZ1bmN0aW9uKHQsZSl7cmV0dXJuIShudWxsPT10fHwiZnVuY3Rpb24iIT10eXBlb2YgdFtlXXx8RHAodCxlKSYmT2JqZWN0LmdldFByb3RvdHlwZU9mJiZlIGluIE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkmJighIURwKGhkLGUpfHwhKGUgaW4gT2JqZWN0LnByb3RvdHlwZXx8ZSBpbiBGdW5jdGlvbi5wcm90b3R5cGUpKX0odCxlKT9uZXcgRXJyb3IoJ0Nhbm5vdCBhY2Nlc3MgbWV0aG9kICInK2UrJyIgYXMgYSBwcm9wZXJ0eScpOm5ldyBFcnJvcignTm8gYWNjZXNzIHRvIHByb3BlcnR5ICInK2UrJyInKX1mdW5jdGlvbiBhZCh0LGUsbil7aWYoY2QodCkmJnVkKHQsZSkpcmV0dXJuIHRbZV09bixuO3Rocm93IG5ldyBFcnJvcignTm8gYWNjZXNzIHRvIHByb3BlcnR5ICInK2UrJyInKX1mdW5jdGlvbiB1ZCh0LGUpe3JldHVybiEoIXR8fCJvYmplY3QiIT10eXBlb2YgdCkmJighIURwKGxkLGUpfHwhKGUgaW4gT2JqZWN0LnByb3RvdHlwZXx8ZSBpbiBGdW5jdGlvbi5wcm90b3R5cGUpKX1mdW5jdGlvbiBjZCh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuY29uc3RydWN0b3I9PT1PYmplY3R9R3AucHJvdG90eXBlPW5ldyBSYW5nZUVycm9yLEdwLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1SYW5nZUVycm9yLEdwLnByb3RvdHlwZS5uYW1lPSJEaW1lbnNpb25FcnJvciIsR3AucHJvdG90eXBlLmlzRGltZW5zaW9uRXJyb3I9ITAsWXAucHJvdG90eXBlPW5ldyBSYW5nZUVycm9yLFlwLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1SYW5nZUVycm9yLFlwLnByb3RvdHlwZS5uYW1lPSJJbmRleEVycm9yIixZcC5wcm90b3R5cGUuaXNJbmRleEVycm9yPSEwO3ZhciBsZD17bGVuZ3RoOiEwLG5hbWU6ITB9LGhkPXt0b1N0cmluZzohMCx2YWx1ZU9mOiEwLHRvTG9jYWxlU3RyaW5nOiEwfTtjbGFzcyBmZHtjb25zdHJ1Y3Rvcih0KXt0aGlzLndyYXBwZWRPYmplY3Q9dH1rZXlzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMud3JhcHBlZE9iamVjdCl9Z2V0KHQpe3JldHVybiBzZCh0aGlzLndyYXBwZWRPYmplY3QsdCl9c2V0KHQsZSl7cmV0dXJuIGFkKHRoaXMud3JhcHBlZE9iamVjdCx0LGUpLHRoaXN9aGFzKHQpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiBlIGluIHR9KHRoaXMud3JhcHBlZE9iamVjdCx0KX19ZnVuY3Rpb24gcGQodCl7cmV0dXJuISF0JiYodCBpbnN0YW5jZW9mIE1hcHx8dCBpbnN0YW5jZW9mIGZkfHwiZnVuY3Rpb24iPT10eXBlb2YgdC5zZXQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmdldCYmImZ1bmN0aW9uIj09dHlwZW9mIHQua2V5cyYmImZ1bmN0aW9uIj09dHlwZW9mIHQuaGFzKX12YXIgZGQ9ZnVuY3Rpb24oKXtyZXR1cm4gZGQ9SXAuY3JlYXRlLElwfSxnZD1pZCgidHlwZWQiLFsiP0JpZ051bWJlciIsIj9Db21wbGV4IiwiP0RlbnNlTWF0cml4IiwiP0ZyYWN0aW9uIl0sKGZ1bmN0aW9uKHQpe3ZhcntCaWdOdW1iZXI6ZSxDb21wbGV4Om4sRGVuc2VNYXRyaXg6cixGcmFjdGlvbjppfT10LG89ZGQoKTtyZXR1cm4gby5jbGVhcigpLG8uYWRkVHlwZXMoW3tuYW1lOiJudW1iZXIiLHRlc3Q6UGZ9LHtuYW1lOiJDb21wbGV4Iix0ZXN0OkJmfSx7bmFtZToiQmlnTnVtYmVyIix0ZXN0OlJmfSx7bmFtZToiRnJhY3Rpb24iLHRlc3Q6a2Z9LHtuYW1lOiJVbml0Iix0ZXN0OnpmfSx7bmFtZToiaWRlbnRpZmllciIsdGVzdDp0PT5qZiYmL14oPzpbQS1aYS16XHhBQVx4QjVceEJBXHhDMC1ceEQ2XHhEOC1ceEY2XHhGOC1cdTAyQzFcdTAyQzYtXHUwMkQxXHUwMkUwLVx1MDJFNFx1MDJFQ1x1MDJFRVx1MDM3MC1cdTAzNzRcdTAzNzZcdTAzNzdcdTAzN0EtXHUwMzdEXHUwMzdGXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0Y1XHUwM0Y3LVx1MDQ4MVx1MDQ4QS1cdTA1MkZcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYwLVx1MDU4OFx1MDVEMC1cdTA1RUFcdTA1RUYtXHUwNUYyXHUwNjIwLVx1MDY0QVx1MDY2RVx1MDY2Rlx1MDY3MS1cdTA2RDNcdTA2RDVcdTA2RTVcdTA2RTZcdTA2RUVcdTA2RUZcdTA2RkEtXHUwNkZDXHUwNkZGXHUwNzEwXHUwNzEyLVx1MDcyRlx1MDc0RC1cdTA3QTVcdTA3QjFcdTA3Q0EtXHUwN0VBXHUwN0Y0XHUwN0Y1XHUwN0ZBXHUwODAwLVx1MDgxNVx1MDgxQVx1MDgyNFx1MDgyOFx1MDg0MC1cdTA4NThcdTA4NjAtXHUwODZBXHUwODcwLVx1MDg4N1x1MDg4OS1cdTA4OEVcdTA4QTAtXHUwOEM5XHUwOTA0LVx1MDkzOVx1MDkzRFx1MDk1MFx1MDk1OC1cdTA5NjFcdTA5NzEtXHUwOTgwXHUwOTg1LVx1MDk4Q1x1MDk4Rlx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlCRFx1MDlDRVx1MDlEQ1x1MDlERFx1MDlERi1cdTA5RTFcdTA5RjBcdTA5RjFcdTA5RkNcdTBBMDUtXHUwQTBBXHUwQTBGXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzJcdTBBMzNcdTBBMzVcdTBBMzZcdTBBMzhcdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjJcdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUQwXHUwQUUwXHUwQUUxXHUwQUY5XHUwQjA1LVx1MEIwQ1x1MEIwRlx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyXHUwQjMzXHUwQjM1LVx1MEIzOVx1MEIzRFx1MEI1Q1x1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCNzFcdTBCODNcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTlcdTBCOUFcdTBCOUNcdTBCOUVcdTBCOUZcdTBCQTNcdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCOVx1MEJEMFx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzlcdTBDM0RcdTBDNTgtXHUwQzVBXHUwQzVEXHUwQzYwXHUwQzYxXHUwQzgwXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDQkRcdTBDRERcdTBDREVcdTBDRTBcdTBDRTFcdTBDRjFcdTBDRjJcdTBEMDQtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEM0FcdTBEM0RcdTBENEVcdTBENTQtXHUwRDU2XHUwRDVGLVx1MEQ2MVx1MEQ3QS1cdTBEN0ZcdTBEODUtXHUwRDk2XHUwRDlBLVx1MERCMVx1MERCMy1cdTBEQkJcdTBEQkRcdTBEQzAtXHUwREM2XHUwRTAxLVx1MEUzMFx1MEUzMlx1MEUzM1x1MEU0MC1cdTBFNDZcdTBFODFcdTBFODJcdTBFODRcdTBFODYtXHUwRThBXHUwRThDLVx1MEVBM1x1MEVBNVx1MEVBNy1cdTBFQjBcdTBFQjJcdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRUM2XHUwRURDLVx1MEVERlx1MEYwMFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjZDXHUwRjg4LVx1MEY4Q1x1MTAwMC1cdTEwMkFcdTEwM0ZcdTEwNTAtXHUxMDU1XHUxMDVBLVx1MTA1RFx1MTA2MVx1MTA2NVx1MTA2Nlx1MTA2RS1cdTEwNzBcdTEwNzUtXHUxMDgxXHUxMDhFXHUxMEEwLVx1MTBDNVx1MTBDN1x1MTBDRFx1MTBEMC1cdTEwRkFcdTEwRkMtXHUxMjQ4XHUxMjRBLVx1MTI0RFx1MTI1MC1cdTEyNTZcdTEyNThcdTEyNUEtXHUxMjVEXHUxMjYwLVx1MTI4OFx1MTI4QS1cdTEyOERcdTEyOTAtXHUxMkIwXHUxMkIyLVx1MTJCNVx1MTJCOC1cdTEyQkVcdTEyQzBcdTEyQzItXHUxMkM1XHUxMkM4LVx1MTJENlx1MTJEOC1cdTEzMTBcdTEzMTItXHUxMzE1XHUxMzE4LVx1MTM1QVx1MTM4MC1cdTEzOEZcdTEzQTAtXHUxM0Y1XHUxM0Y4LVx1MTNGRFx1MTQwMS1cdTE2NkNcdTE2NkYtXHUxNjdGXHUxNjgxLVx1MTY5QVx1MTZBMC1cdTE2RUFcdTE2RjEtXHUxNkY4XHUxNzAwLVx1MTcxMVx1MTcxRi1cdTE3MzFcdTE3NDAtXHUxNzUxXHUxNzYwLVx1MTc2Q1x1MTc2RS1cdTE3NzBcdTE3ODAtXHUxN0IzXHUxN0Q3XHUxN0RDXHUxODIwLVx1MTg3OFx1MTg4MC1cdTE4ODRcdTE4ODctXHUxOEE4XHUxOEFBXHUxOEIwLVx1MThGNVx1MTkwMC1cdTE5MUVcdTE5NTAtXHUxOTZEXHUxOTcwLVx1MTk3NFx1MTk4MC1cdTE5QUJcdTE5QjAtXHUxOUM5XHUxQTAwLVx1MUExNlx1MUEyMC1cdTFBNTRcdTFBQTdcdTFCMDUtXHUxQjMzXHUxQjQ1LVx1MUI0Q1x1MUI4My1cdTFCQTBcdTFCQUVcdTFCQUZcdTFCQkEtXHUxQkU1XHUxQzAwLVx1MUMyM1x1MUM0RC1cdTFDNEZcdTFDNUEtXHUxQzdEXHUxQzgwLVx1MUM4OFx1MUM5MC1cdTFDQkFcdTFDQkQtXHUxQ0JGXHUxQ0U5LVx1MUNFQ1x1MUNFRS1cdTFDRjNcdTFDRjVcdTFDRjZcdTFDRkFcdTFEMDAtXHUxREJGXHUxRTAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMDcxXHUyMDdGXHUyMDkwLVx1MjA5Q1x1MjEwMlx1MjEwN1x1MjEwQS1cdTIxMTNcdTIxMTVcdTIxMTktXHUyMTFEXHUyMTI0XHUyMTI2XHUyMTI4XHUyMTJBLVx1MjEyRFx1MjEyRi1cdTIxMzlcdTIxM0MtXHUyMTNGXHUyMTQ1LVx1MjE0OVx1MjE0RVx1MjE4M1x1MjE4NFx1MkMwMC1cdTJDRTRcdTJDRUItXHUyQ0VFXHUyQ0YyXHUyQ0YzXHUyRDAwLVx1MkQyNVx1MkQyN1x1MkQyRFx1MkQzMC1cdTJENjdcdTJENkZcdTJEODAtXHUyRDk2XHUyREEwLVx1MkRBNlx1MkRBOC1cdTJEQUVcdTJEQjAtXHUyREI2XHUyREI4LVx1MkRCRVx1MkRDMC1cdTJEQzZcdTJEQzgtXHUyRENFXHUyREQwLVx1MkRENlx1MkREOC1cdTJEREVcdTJFMkZcdTMwMDVcdTMwMDZcdTMwMzEtXHUzMDM1XHUzMDNCXHUzMDNDXHUzMDQxLVx1MzA5Nlx1MzA5RC1cdTMwOUZcdTMwQTEtXHUzMEZBXHUzMEZDLVx1MzBGRlx1MzEwNS1cdTMxMkZcdTMxMzEtXHUzMThFXHUzMUEwLVx1MzFCRlx1MzFGMC1cdTMxRkZcdTM0MDAtXHU0REJGXHU0RTAwLVx1QTQ4Q1x1QTREMC1cdUE0RkRcdUE1MDAtXHVBNjBDXHVBNjEwLVx1QTYxRlx1QTYyQVx1QTYyQlx1QTY0MC1cdUE2NkVcdUE2N0YtXHVBNjlEXHVBNkEwLVx1QTZFNVx1QTcxNy1cdUE3MUZcdUE3MjItXHVBNzg4XHVBNzhCLVx1QTdDQVx1QTdEMFx1QTdEMVx1QTdEM1x1QTdENS1cdUE3RDlcdUE3RjItXHVBODAxXHVBODAzLVx1QTgwNVx1QTgwNy1cdUE4MEFcdUE4MEMtXHVBODIyXHVBODQwLVx1QTg3M1x1QTg4Mi1cdUE4QjNcdUE4RjItXHVBOEY3XHVBOEZCXHVBOEZEXHVBOEZFXHVBOTBBLVx1QTkyNVx1QTkzMC1cdUE5NDZcdUE5NjAtXHVBOTdDXHVBOTg0LVx1QTlCMlx1QTlDRlx1QTlFMC1cdUE5RTRcdUE5RTYtXHVBOUVGXHVBOUZBLVx1QTlGRVx1QUEwMC1cdUFBMjhcdUFBNDAtXHVBQTQyXHVBQTQ0LVx1QUE0Qlx1QUE2MC1cdUFBNzZcdUFBN0FcdUFBN0UtXHVBQUFGXHVBQUIxXHVBQUI1XHVBQUI2XHVBQUI5LVx1QUFCRFx1QUFDMFx1QUFDMlx1QUFEQi1cdUFBRERcdUFBRTAtXHVBQUVBXHVBQUYyLVx1QUFGNFx1QUIwMS1cdUFCMDZcdUFCMDktXHVBQjBFXHVBQjExLVx1QUIxNlx1QUIyMC1cdUFCMjZcdUFCMjgtXHVBQjJFXHVBQjMwLVx1QUI1QVx1QUI1Qy1cdUFCNjlcdUFCNzAtXHVBQkUyXHVBQzAwLVx1RDdBM1x1RDdCMC1cdUQ3QzZcdUQ3Q0ItXHVEN0ZCXHVGOTAwLVx1RkE2RFx1RkE3MC1cdUZBRDlcdUZCMDAtXHVGQjA2XHVGQjEzLVx1RkIxN1x1RkIxRFx1RkIxRi1cdUZCMjhcdUZCMkEtXHVGQjM2XHVGQjM4LVx1RkIzQ1x1RkIzRVx1RkI0MFx1RkI0MVx1RkI0M1x1RkI0NFx1RkI0Ni1cdUZCQjFcdUZCRDMtXHVGRDNEXHVGRDUwLVx1RkQ4Rlx1RkQ5Mi1cdUZEQzdcdUZERjAtXHVGREZCXHVGRTcwLVx1RkU3NFx1RkU3Ni1cdUZFRkNcdUZGMjEtXHVGRjNBXHVGRjQxLVx1RkY1QVx1RkY2Ni1cdUZGQkVcdUZGQzItXHVGRkM3XHVGRkNBLVx1RkZDRlx1RkZEMi1cdUZGRDdcdUZGREEtXHVGRkRDXXxcdUQ4MDBbXHVEQzAwLVx1REMwQlx1REMwRC1cdURDMjZcdURDMjgtXHVEQzNBXHVEQzNDXHVEQzNEXHVEQzNGLVx1REM0RFx1REM1MC1cdURDNURcdURDODAtXHVEQ0ZBXHVERTgwLVx1REU5Q1x1REVBMC1cdURFRDBcdURGMDAtXHVERjFGXHVERjJELVx1REY0MFx1REY0Mi1cdURGNDlcdURGNTAtXHVERjc1XHVERjgwLVx1REY5RFx1REZBMC1cdURGQzNcdURGQzgtXHVERkNGXXxcdUQ4MDFbXHVEQzAwLVx1REM5RFx1RENCMC1cdURDRDNcdURDRDgtXHVEQ0ZCXHVERDAwLVx1REQyN1x1REQzMC1cdURENjNcdURENzAtXHVERDdBXHVERDdDLVx1REQ4QVx1REQ4Qy1cdUREOTJcdUREOTRcdUREOTVcdUREOTctXHVEREExXHVEREEzLVx1RERCMVx1RERCMy1cdUREQjlcdUREQkJcdUREQkNcdURFMDAtXHVERjM2XHVERjQwLVx1REY1NVx1REY2MC1cdURGNjdcdURGODAtXHVERjg1XHVERjg3LVx1REZCMFx1REZCMi1cdURGQkFdfFx1RDgwMltcdURDMDAtXHVEQzA1XHVEQzA4XHVEQzBBLVx1REMzNVx1REMzN1x1REMzOFx1REMzQ1x1REMzRi1cdURDNTVcdURDNjAtXHVEQzc2XHVEQzgwLVx1REM5RVx1RENFMC1cdURDRjJcdURDRjRcdURDRjVcdUREMDAtXHVERDE1XHVERDIwLVx1REQzOVx1REQ4MC1cdUREQjdcdUREQkVcdUREQkZcdURFMDBcdURFMTAtXHVERTEzXHVERTE1LVx1REUxN1x1REUxOS1cdURFMzVcdURFNjAtXHVERTdDXHVERTgwLVx1REU5Q1x1REVDMC1cdURFQzdcdURFQzktXHVERUU0XHVERjAwLVx1REYzNVx1REY0MC1cdURGNTVcdURGNjAtXHVERjcyXHVERjgwLVx1REY5MV18XHVEODAzW1x1REMwMC1cdURDNDhcdURDODAtXHVEQ0IyXHVEQ0MwLVx1RENGMlx1REQwMC1cdUREMjNcdURFODAtXHVERUE5XHVERUIwXHVERUIxXHVERjAwLVx1REYxQ1x1REYyN1x1REYzMC1cdURGNDVcdURGNzAtXHVERjgxXHVERkIwLVx1REZDNFx1REZFMC1cdURGRjZdfFx1RDgwNFtcdURDMDMtXHVEQzM3XHVEQzcxXHVEQzcyXHVEQzc1XHVEQzgzLVx1RENBRlx1RENEMC1cdURDRThcdUREMDMtXHVERDI2XHVERDQ0XHVERDQ3XHVERDUwLVx1REQ3Mlx1REQ3Nlx1REQ4My1cdUREQjJcdUREQzEtXHVEREM0XHVERERBXHVERERDXHVERTAwLVx1REUxMVx1REUxMy1cdURFMkJcdURFM0ZcdURFNDBcdURFODAtXHVERTg2XHVERTg4XHVERThBLVx1REU4RFx1REU4Ri1cdURFOURcdURFOUYtXHVERUE4XHVERUIwLVx1REVERVx1REYwNS1cdURGMENcdURGMEZcdURGMTBcdURGMTMtXHVERjI4XHVERjJBLVx1REYzMFx1REYzMlx1REYzM1x1REYzNS1cdURGMzlcdURGM0RcdURGNTBcdURGNUQtXHVERjYxXXxcdUQ4MDVbXHVEQzAwLVx1REMzNFx1REM0Ny1cdURDNEFcdURDNUYtXHVEQzYxXHVEQzgwLVx1RENBRlx1RENDNFx1RENDNVx1RENDN1x1REQ4MC1cdUREQUVcdURERDgtXHVERERCXHVERTAwLVx1REUyRlx1REU0NFx1REU4MC1cdURFQUFcdURFQjhcdURGMDAtXHVERjFBXHVERjQwLVx1REY0Nl18XHVEODA2W1x1REMwMC1cdURDMkJcdURDQTAtXHVEQ0RGXHVEQ0ZGLVx1REQwNlx1REQwOVx1REQwQy1cdUREMTNcdUREMTVcdUREMTZcdUREMTgtXHVERDJGXHVERDNGXHVERDQxXHVEREEwLVx1RERBN1x1RERBQS1cdURERDBcdURERTFcdURERTNcdURFMDBcdURFMEItXHVERTMyXHVERTNBXHVERTUwXHVERTVDLVx1REU4OVx1REU5RFx1REVCMC1cdURFRjhdfFx1RDgwN1tcdURDMDAtXHVEQzA4XHVEQzBBLVx1REMyRVx1REM0MFx1REM3Mi1cdURDOEZcdUREMDAtXHVERDA2XHVERDA4XHVERDA5XHVERDBCLVx1REQzMFx1REQ0Nlx1REQ2MC1cdURENjVcdURENjdcdURENjhcdURENkEtXHVERDg5XHVERDk4XHVERUUwLVx1REVGMlx1REYwMlx1REYwNC1cdURGMTBcdURGMTItXHVERjMzXHVERkIwXXxcdUQ4MDhbXHVEQzAwLVx1REY5OV18XHVEODA5W1x1REM4MC1cdURENDNdfFx1RDgwQltcdURGOTAtXHVERkYwXXxbXHVEODBDXHVEODFDLVx1RDgyMFx1RDgyMlx1RDg0MC1cdUQ4NjhcdUQ4NkEtXHVEODZDXHVEODZGLVx1RDg3Mlx1RDg3NC1cdUQ4NzlcdUQ4ODAtXHVEODgzXHVEODg1LVx1RDg4N11bXHVEQzAwLVx1REZGRl18XHVEODBEW1x1REMwMC1cdURDMkZcdURDNDEtXHVEQzQ2XXxcdUQ4MTFbXHVEQzAwLVx1REU0Nl18XHVEODFBW1x1REMwMC1cdURFMzhcdURFNDAtXHVERTVFXHVERTcwLVx1REVCRVx1REVEMC1cdURFRURcdURGMDAtXHVERjJGXHVERjQwLVx1REY0M1x1REY2My1cdURGNzdcdURGN0QtXHVERjhGXXxcdUQ4MUJbXHVERTQwLVx1REU3Rlx1REYwMC1cdURGNEFcdURGNTBcdURGOTMtXHVERjlGXHVERkUwXHVERkUxXHVERkUzXXxcdUQ4MjFbXHVEQzAwLVx1REZGN118XHVEODIzW1x1REMwMC1cdURDRDVcdUREMDAtXHVERDA4XXxcdUQ4MkJbXHVERkYwLVx1REZGM1x1REZGNS1cdURGRkJcdURGRkRcdURGRkVdfFx1RDgyQ1tcdURDMDAtXHVERDIyXHVERDMyXHVERDUwLVx1REQ1Mlx1REQ1NVx1REQ2NC1cdURENjdcdURENzAtXHVERUZCXXxcdUQ4MkZbXHVEQzAwLVx1REM2QVx1REM3MC1cdURDN0NcdURDODAtXHVEQzg4XHVEQzkwLVx1REM5OV18XHVEODM1W1x1REMwMC1cdURDNTRcdURDNTYtXHVEQzlDXHVEQzlFXHVEQzlGXHVEQ0EyXHVEQ0E1XHVEQ0E2XHVEQ0E5LVx1RENBQ1x1RENBRS1cdURDQjlcdURDQkJcdURDQkQtXHVEQ0MzXHVEQ0M1LVx1REQwNVx1REQwNy1cdUREMEFcdUREMEQtXHVERDE0XHVERDE2LVx1REQxQ1x1REQxRS1cdUREMzlcdUREM0ItXHVERDNFXHVERDQwLVx1REQ0NFx1REQ0Nlx1REQ0QS1cdURENTBcdURENTItXHVERUE1XHVERUE4LVx1REVDMFx1REVDMi1cdURFREFcdURFREMtXHVERUZBXHVERUZDLVx1REYxNFx1REYxNi1cdURGMzRcdURGMzYtXHVERjRFXHVERjUwLVx1REY2RVx1REY3MC1cdURGODhcdURGOEEtXHVERkE4XHVERkFBLVx1REZDMlx1REZDNC1cdURGQ0JdfFx1RDgzN1tcdURGMDAtXHVERjFFXHVERjI1LVx1REYyQV18XHVEODM4W1x1REMzMC1cdURDNkRcdUREMDAtXHVERDJDXHVERDM3LVx1REQzRFx1REQ0RVx1REU5MC1cdURFQURcdURFQzAtXHVERUVCXXxcdUQ4MzlbXHVEQ0QwLVx1RENFQlx1REZFMC1cdURGRTZcdURGRTgtXHVERkVCXHVERkVEXHVERkVFXHVERkYwLVx1REZGRV18XHVEODNBW1x1REMwMC1cdURDQzRcdUREMDAtXHVERDQzXHVERDRCXXxcdUQ4M0JbXHVERTAwLVx1REUwM1x1REUwNS1cdURFMUZcdURFMjFcdURFMjJcdURFMjRcdURFMjdcdURFMjktXHVERTMyXHVERTM0LVx1REUzN1x1REUzOVx1REUzQlx1REU0Mlx1REU0N1x1REU0OVx1REU0Qlx1REU0RC1cdURFNEZcdURFNTFcdURFNTJcdURFNTRcdURFNTdcdURFNTlcdURFNUJcdURFNURcdURFNUZcdURFNjFcdURFNjJcdURFNjRcdURFNjctXHVERTZBXHVERTZDLVx1REU3Mlx1REU3NC1cdURFNzdcdURFNzktXHVERTdDXHVERTdFXHVERTgwLVx1REU4OVx1REU4Qi1cdURFOUJcdURFQTEtXHVERUEzXHVERUE1LVx1REVBOVx1REVBQi1cdURFQkJdfFx1RDg2OVtcdURDMDAtXHVERURGXHVERjAwLVx1REZGRl18XHVEODZEW1x1REMwMC1cdURGMzlcdURGNDAtXHVERkZGXXxcdUQ4NkVbXHVEQzAwLVx1REMxRFx1REMyMC1cdURGRkZdfFx1RDg3M1tcdURDMDAtXHVERUExXHVERUIwLVx1REZGRl18XHVEODdBW1x1REMwMC1cdURGRTBdfFx1RDg3RVtcdURDMDAtXHVERTFEXXxcdUQ4ODRbXHVEQzAwLVx1REY0QVx1REY1MC1cdURGRkZdfFx1RDg4OFtcdURDMDAtXHVERkFGXSkoPzpbMC05QS1aYS16XHhBQVx4QjVceEJBXHhDMC1ceEQ2XHhEOC1ceEY2XHhGOC1cdTAyQzFcdTAyQzYtXHUwMkQxXHUwMkUwLVx1MDJFNFx1MDJFQ1x1MDJFRVx1MDM3MC1cdTAzNzRcdTAzNzZcdTAzNzdcdTAzN0EtXHUwMzdEXHUwMzdGXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0Y1XHUwM0Y3LVx1MDQ4MVx1MDQ4QS1cdTA1MkZcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYwLVx1MDU4OFx1MDVEMC1cdTA1RUFcdTA1RUYtXHUwNUYyXHUwNjIwLVx1MDY0QVx1MDY2RVx1MDY2Rlx1MDY3MS1cdTA2RDNcdTA2RDVcdTA2RTVcdTA2RTZcdTA2RUVcdTA2RUZcdTA2RkEtXHUwNkZDXHUwNkZGXHUwNzEwXHUwNzEyLVx1MDcyRlx1MDc0RC1cdTA3QTVcdTA3QjFcdTA3Q0EtXHUwN0VBXHUwN0Y0XHUwN0Y1XHUwN0ZBXHUwODAwLVx1MDgxNVx1MDgxQVx1MDgyNFx1MDgyOFx1MDg0MC1cdTA4NThcdTA4NjAtXHUwODZBXHUwODcwLVx1MDg4N1x1MDg4OS1cdTA4OEVcdTA4QTAtXHUwOEM5XHUwOTA0LVx1MDkzOVx1MDkzRFx1MDk1MFx1MDk1OC1cdTA5NjFcdTA5NzEtXHUwOTgwXHUwOTg1LVx1MDk4Q1x1MDk4Rlx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlCRFx1MDlDRVx1MDlEQ1x1MDlERFx1MDlERi1cdTA5RTFcdTA5RjBcdTA5RjFcdTA5RkNcdTBBMDUtXHUwQTBBXHUwQTBGXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzJcdTBBMzNcdTBBMzVcdTBBMzZcdTBBMzhcdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjJcdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUQwXHUwQUUwXHUwQUUxXHUwQUY5XHUwQjA1LVx1MEIwQ1x1MEIwRlx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyXHUwQjMzXHUwQjM1LVx1MEIzOVx1MEIzRFx1MEI1Q1x1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCNzFcdTBCODNcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTlcdTBCOUFcdTBCOUNcdTBCOUVcdTBCOUZcdTBCQTNcdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCOVx1MEJEMFx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzlcdTBDM0RcdTBDNTgtXHUwQzVBXHUwQzVEXHUwQzYwXHUwQzYxXHUwQzgwXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDQkRcdTBDRERcdTBDREVcdTBDRTBcdTBDRTFcdTBDRjFcdTBDRjJcdTBEMDQtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEM0FcdTBEM0RcdTBENEVcdTBENTQtXHUwRDU2XHUwRDVGLVx1MEQ2MVx1MEQ3QS1cdTBEN0ZcdTBEODUtXHUwRDk2XHUwRDlBLVx1MERCMVx1MERCMy1cdTBEQkJcdTBEQkRcdTBEQzAtXHUwREM2XHUwRTAxLVx1MEUzMFx1MEUzMlx1MEUzM1x1MEU0MC1cdTBFNDZcdTBFODFcdTBFODJcdTBFODRcdTBFODYtXHUwRThBXHUwRThDLVx1MEVBM1x1MEVBNVx1MEVBNy1cdTBFQjBcdTBFQjJcdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRUM2XHUwRURDLVx1MEVERlx1MEYwMFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjZDXHUwRjg4LVx1MEY4Q1x1MTAwMC1cdTEwMkFcdTEwM0ZcdTEwNTAtXHUxMDU1XHUxMDVBLVx1MTA1RFx1MTA2MVx1MTA2NVx1MTA2Nlx1MTA2RS1cdTEwNzBcdTEwNzUtXHUxMDgxXHUxMDhFXHUxMEEwLVx1MTBDNVx1MTBDN1x1MTBDRFx1MTBEMC1cdTEwRkFcdTEwRkMtXHUxMjQ4XHUxMjRBLVx1MTI0RFx1MTI1MC1cdTEyNTZcdTEyNThcdTEyNUEtXHUxMjVEXHUxMjYwLVx1MTI4OFx1MTI4QS1cdTEyOERcdTEyOTAtXHUxMkIwXHUxMkIyLVx1MTJCNVx1MTJCOC1cdTEyQkVcdTEyQzBcdTEyQzItXHUxMkM1XHUxMkM4LVx1MTJENlx1MTJEOC1cdTEzMTBcdTEzMTItXHUxMzE1XHUxMzE4LVx1MTM1QVx1MTM4MC1cdTEzOEZcdTEzQTAtXHUxM0Y1XHUxM0Y4LVx1MTNGRFx1MTQwMS1cdTE2NkNcdTE2NkYtXHUxNjdGXHUxNjgxLVx1MTY5QVx1MTZBMC1cdTE2RUFcdTE2RjEtXHUxNkY4XHUxNzAwLVx1MTcxMVx1MTcxRi1cdTE3MzFcdTE3NDAtXHUxNzUxXHUxNzYwLVx1MTc2Q1x1MTc2RS1cdTE3NzBcdTE3ODAtXHUxN0IzXHUxN0Q3XHUxN0RDXHUxODIwLVx1MTg3OFx1MTg4MC1cdTE4ODRcdTE4ODctXHUxOEE4XHUxOEFBXHUxOEIwLVx1MThGNVx1MTkwMC1cdTE5MUVcdTE5NTAtXHUxOTZEXHUxOTcwLVx1MTk3NFx1MTk4MC1cdTE5QUJcdTE5QjAtXHUxOUM5XHUxQTAwLVx1MUExNlx1MUEyMC1cdTFBNTRcdTFBQTdcdTFCMDUtXHUxQjMzXHUxQjQ1LVx1MUI0Q1x1MUI4My1cdTFCQTBcdTFCQUVcdTFCQUZcdTFCQkEtXHUxQkU1XHUxQzAwLVx1MUMyM1x1MUM0RC1cdTFDNEZcdTFDNUEtXHUxQzdEXHUxQzgwLVx1MUM4OFx1MUM5MC1cdTFDQkFcdTFDQkQtXHUxQ0JGXHUxQ0U5LVx1MUNFQ1x1MUNFRS1cdTFDRjNcdTFDRjVcdTFDRjZcdTFDRkFcdTFEMDAtXHUxREJGXHUxRTAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMDcxXHUyMDdGXHUyMDkwLVx1MjA5Q1x1MjEwMlx1MjEwN1x1MjEwQS1cdTIxMTNcdTIxMTVcdTIxMTktXHUyMTFEXHUyMTI0XHUyMTI2XHUyMTI4XHUyMTJBLVx1MjEyRFx1MjEyRi1cdTIxMzlcdTIxM0MtXHUyMTNGXHUyMTQ1LVx1MjE0OVx1MjE0RVx1MjE4M1x1MjE4NFx1MkMwMC1cdTJDRTRcdTJDRUItXHUyQ0VFXHUyQ0YyXHUyQ0YzXHUyRDAwLVx1MkQyNVx1MkQyN1x1MkQyRFx1MkQzMC1cdTJENjdcdTJENkZcdTJEODAtXHUyRDk2XHUyREEwLVx1MkRBNlx1MkRBOC1cdTJEQUVcdTJEQjAtXHUyREI2XHUyREI4LVx1MkRCRVx1MkRDMC1cdTJEQzZcdTJEQzgtXHUyRENFXHUyREQwLVx1MkRENlx1MkREOC1cdTJEREVcdTJFMkZcdTMwMDVcdTMwMDZcdTMwMzEtXHUzMDM1XHUzMDNCXHUzMDNDXHUzMDQxLVx1MzA5Nlx1MzA5RC1cdTMwOUZcdTMwQTEtXHUzMEZBXHUzMEZDLVx1MzBGRlx1MzEwNS1cdTMxMkZcdTMxMzEtXHUzMThFXHUzMUEwLVx1MzFCRlx1MzFGMC1cdTMxRkZcdTM0MDAtXHU0REJGXHU0RTAwLVx1QTQ4Q1x1QTREMC1cdUE0RkRcdUE1MDAtXHVBNjBDXHVBNjEwLVx1QTYxRlx1QTYyQVx1QTYyQlx1QTY0MC1cdUE2NkVcdUE2N0YtXHVBNjlEXHVBNkEwLVx1QTZFNVx1QTcxNy1cdUE3MUZcdUE3MjItXHVBNzg4XHVBNzhCLVx1QTdDQVx1QTdEMFx1QTdEMVx1QTdEM1x1QTdENS1cdUE3RDlcdUE3RjItXHVBODAxXHVBODAzLVx1QTgwNVx1QTgwNy1cdUE4MEFcdUE4MEMtXHVBODIyXHVBODQwLVx1QTg3M1x1QTg4Mi1cdUE4QjNcdUE4RjItXHVBOEY3XHVBOEZCXHVBOEZEXHVBOEZFXHVBOTBBLVx1QTkyNVx1QTkzMC1cdUE5NDZcdUE5NjAtXHVBOTdDXHVBOTg0LVx1QTlCMlx1QTlDRlx1QTlFMC1cdUE5RTRcdUE5RTYtXHVBOUVGXHVBOUZBLVx1QTlGRVx1QUEwMC1cdUFBMjhcdUFBNDAtXHVBQTQyXHVBQTQ0LVx1QUE0Qlx1QUE2MC1cdUFBNzZcdUFBN0FcdUFBN0UtXHVBQUFGXHVBQUIxXHVBQUI1XHVBQUI2XHVBQUI5LVx1QUFCRFx1QUFDMFx1QUFDMlx1QUFEQi1cdUFBRERcdUFBRTAtXHVBQUVBXHVBQUYyLVx1QUFGNFx1QUIwMS1cdUFCMDZcdUFCMDktXHVBQjBFXHVBQjExLVx1QUIxNlx1QUIyMC1cdUFCMjZcdUFCMjgtXHVBQjJFXHVBQjMwLVx1QUI1QVx1QUI1Qy1cdUFCNjlcdUFCNzAtXHVBQkUyXHVBQzAwLVx1RDdBM1x1RDdCMC1cdUQ3QzZcdUQ3Q0ItXHVEN0ZCXHVGOTAwLVx1RkE2RFx1RkE3MC1cdUZBRDlcdUZCMDAtXHVGQjA2XHVGQjEzLVx1RkIxN1x1RkIxRFx1RkIxRi1cdUZCMjhcdUZCMkEtXHVGQjM2XHVGQjM4LVx1RkIzQ1x1RkIzRVx1RkI0MFx1RkI0MVx1RkI0M1x1RkI0NFx1RkI0Ni1cdUZCQjFcdUZCRDMtXHVGRDNEXHVGRDUwLVx1RkQ4Rlx1RkQ5Mi1cdUZEQzdcdUZERjAtXHVGREZCXHVGRTcwLVx1RkU3NFx1RkU3Ni1cdUZFRkNcdUZGMjEtXHVGRjNBXHVGRjQxLVx1RkY1QVx1RkY2Ni1cdUZGQkVcdUZGQzItXHVGRkM3XHVGRkNBLVx1RkZDRlx1RkZEMi1cdUZGRDdcdUZGREEtXHVGRkRDXXxcdUQ4MDBbXHVEQzAwLVx1REMwQlx1REMwRC1cdURDMjZcdURDMjgtXHVEQzNBXHVEQzNDXHVEQzNEXHVEQzNGLVx1REM0RFx1REM1MC1cdURDNURcdURDODAtXHVEQ0ZBXHVERTgwLVx1REU5Q1x1REVBMC1cdURFRDBcdURGMDAtXHVERjFGXHVERjJELVx1REY0MFx1REY0Mi1cdURGNDlcdURGNTAtXHVERjc1XHVERjgwLVx1REY5RFx1REZBMC1cdURGQzNcdURGQzgtXHVERkNGXXxcdUQ4MDFbXHVEQzAwLVx1REM5RFx1RENCMC1cdURDRDNcdURDRDgtXHVEQ0ZCXHVERDAwLVx1REQyN1x1REQzMC1cdURENjNcdURENzAtXHVERDdBXHVERDdDLVx1REQ4QVx1REQ4Qy1cdUREOTJcdUREOTRcdUREOTVcdUREOTctXHVEREExXHVEREEzLVx1RERCMVx1RERCMy1cdUREQjlcdUREQkJcdUREQkNcdURFMDAtXHVERjM2XHVERjQwLVx1REY1NVx1REY2MC1cdURGNjdcdURGODAtXHVERjg1XHVERjg3LVx1REZCMFx1REZCMi1cdURGQkFdfFx1RDgwMltcdURDMDAtXHVEQzA1XHVEQzA4XHVEQzBBLVx1REMzNVx1REMzN1x1REMzOFx1REMzQ1x1REMzRi1cdURDNTVcdURDNjAtXHVEQzc2XHVEQzgwLVx1REM5RVx1RENFMC1cdURDRjJcdURDRjRcdURDRjVcdUREMDAtXHVERDE1XHVERDIwLVx1REQzOVx1REQ4MC1cdUREQjdcdUREQkVcdUREQkZcdURFMDBcdURFMTAtXHVERTEzXHVERTE1LVx1REUxN1x1REUxOS1cdURFMzVcdURFNjAtXHVERTdDXHVERTgwLVx1REU5Q1x1REVDMC1cdURFQzdcdURFQzktXHVERUU0XHVERjAwLVx1REYzNVx1REY0MC1cdURGNTVcdURGNjAtXHVERjcyXHVERjgwLVx1REY5MV18XHVEODAzW1x1REMwMC1cdURDNDhcdURDODAtXHVEQ0IyXHVEQ0MwLVx1RENGMlx1REQwMC1cdUREMjNcdURFODAtXHVERUE5XHVERUIwXHVERUIxXHVERjAwLVx1REYxQ1x1REYyN1x1REYzMC1cdURGNDVcdURGNzAtXHVERjgxXHVERkIwLVx1REZDNFx1REZFMC1cdURGRjZdfFx1RDgwNFtcdURDMDMtXHVEQzM3XHVEQzcxXHVEQzcyXHVEQzc1XHVEQzgzLVx1RENBRlx1RENEMC1cdURDRThcdUREMDMtXHVERDI2XHVERDQ0XHVERDQ3XHVERDUwLVx1REQ3Mlx1REQ3Nlx1REQ4My1cdUREQjJcdUREQzEtXHVEREM0XHVERERBXHVERERDXHVERTAwLVx1REUxMVx1REUxMy1cdURFMkJcdURFM0ZcdURFNDBcdURFODAtXHVERTg2XHVERTg4XHVERThBLVx1REU4RFx1REU4Ri1cdURFOURcdURFOUYtXHVERUE4XHVERUIwLVx1REVERVx1REYwNS1cdURGMENcdURGMEZcdURGMTBcdURGMTMtXHVERjI4XHVERjJBLVx1REYzMFx1REYzMlx1REYzM1x1REYzNS1cdURGMzlcdURGM0RcdURGNTBcdURGNUQtXHVERjYxXXxcdUQ4MDVbXHVEQzAwLVx1REMzNFx1REM0Ny1cdURDNEFcdURDNUYtXHVEQzYxXHVEQzgwLVx1RENBRlx1RENDNFx1RENDNVx1RENDN1x1REQ4MC1cdUREQUVcdURERDgtXHVERERCXHVERTAwLVx1REUyRlx1REU0NFx1REU4MC1cdURFQUFcdURFQjhcdURGMDAtXHVERjFBXHVERjQwLVx1REY0Nl18XHVEODA2W1x1REMwMC1cdURDMkJcdURDQTAtXHVEQ0RGXHVEQ0ZGLVx1REQwNlx1REQwOVx1REQwQy1cdUREMTNcdUREMTVcdUREMTZcdUREMTgtXHVERDJGXHVERDNGXHVERDQxXHVEREEwLVx1RERBN1x1RERBQS1cdURERDBcdURERTFcdURERTNcdURFMDBcdURFMEItXHVERTMyXHVERTNBXHVERTUwXHVERTVDLVx1REU4OVx1REU5RFx1REVCMC1cdURFRjhdfFx1RDgwN1tcdURDMDAtXHVEQzA4XHVEQzBBLVx1REMyRVx1REM0MFx1REM3Mi1cdURDOEZcdUREMDAtXHVERDA2XHVERDA4XHVERDA5XHVERDBCLVx1REQzMFx1REQ0Nlx1REQ2MC1cdURENjVcdURENjdcdURENjhcdURENkEtXHVERDg5XHVERDk4XHVERUUwLVx1REVGMlx1REYwMlx1REYwNC1cdURGMTBcdURGMTItXHVERjMzXHVERkIwXXxcdUQ4MDhbXHVEQzAwLVx1REY5OV18XHVEODA5W1x1REM4MC1cdURENDNdfFx1RDgwQltcdURGOTAtXHVERkYwXXxbXHVEODBDXHVEODFDLVx1RDgyMFx1RDgyMlx1RDg0MC1cdUQ4NjhcdUQ4NkEtXHVEODZDXHVEODZGLVx1RDg3Mlx1RDg3NC1cdUQ4NzlcdUQ4ODAtXHVEODgzXHVEODg1LVx1RDg4N11bXHVEQzAwLVx1REZGRl18XHVEODBEW1x1REMwMC1cdURDMkZcdURDNDEtXHVEQzQ2XXxcdUQ4MTFbXHVEQzAwLVx1REU0Nl18XHVEODFBW1x1REMwMC1cdURFMzhcdURFNDAtXHVERTVFXHVERTcwLVx1REVCRVx1REVEMC1cdURFRURcdURGMDAtXHVERjJGXHVERjQwLVx1REY0M1x1REY2My1cdURGNzdcdURGN0QtXHVERjhGXXxcdUQ4MUJbXHVERTQwLVx1REU3Rlx1REYwMC1cdURGNEFcdURGNTBcdURGOTMtXHVERjlGXHVERkUwXHVERkUxXHVERkUzXXxcdUQ4MjFbXHVEQzAwLVx1REZGN118XHVEODIzW1x1REMwMC1cdURDRDVcdUREMDAtXHVERDA4XXxcdUQ4MkJbXHVERkYwLVx1REZGM1x1REZGNS1cdURGRkJcdURGRkRcdURGRkVdfFx1RDgyQ1tcdURDMDAtXHVERDIyXHVERDMyXHVERDUwLVx1REQ1Mlx1REQ1NVx1REQ2NC1cdURENjdcdURENzAtXHVERUZCXXxcdUQ4MkZbXHVEQzAwLVx1REM2QVx1REM3MC1cdURDN0NcdURDODAtXHVEQzg4XHVEQzkwLVx1REM5OV18XHVEODM1W1x1REMwMC1cdURDNTRcdURDNTYtXHVEQzlDXHVEQzlFXHVEQzlGXHVEQ0EyXHVEQ0E1XHVEQ0E2XHVEQ0E5LVx1RENBQ1x1RENBRS1cdURDQjlcdURDQkJcdURDQkQtXHVEQ0MzXHVEQ0M1LVx1REQwNVx1REQwNy1cdUREMEFcdUREMEQtXHVERDE0XHVERDE2LVx1REQxQ1x1REQxRS1cdUREMzlcdUREM0ItXHVERDNFXHVERDQwLVx1REQ0NFx1REQ0Nlx1REQ0QS1cdURENTBcdURENTItXHVERUE1XHVERUE4LVx1REVDMFx1REVDMi1cdURFREFcdURFREMtXHVERUZBXHVERUZDLVx1REYxNFx1REYxNi1cdURGMzRcdURGMzYtXHVERjRFXHVERjUwLVx1REY2RVx1REY3MC1cdURGODhcdURGOEEtXHVERkE4XHVERkFBLVx1REZDMlx1REZDNC1cdURGQ0JdfFx1RDgzN1tcdURGMDAtXHVERjFFXHVERjI1LVx1REYyQV18XHVEODM4W1x1REMzMC1cdURDNkRcdUREMDAtXHVERDJDXHVERDM3LVx1REQzRFx1REQ0RVx1REU5MC1cdURFQURcdURFQzAtXHVERUVCXXxcdUQ4MzlbXHVEQ0QwLVx1RENFQlx1REZFMC1cdURGRTZcdURGRTgtXHVERkVCXHVERkVEXHVERkVFXHVERkYwLVx1REZGRV18XHVEODNBW1x1REMwMC1cdURDQzRcdUREMDAtXHVERDQzXHVERDRCXXxcdUQ4M0JbXHVERTAwLVx1REUwM1x1REUwNS1cdURFMUZcdURFMjFcdURFMjJcdURFMjRcdURFMjdcdURFMjktXHVERTMyXHVERTM0LVx1REUzN1x1REUzOVx1REUzQlx1REU0Mlx1REU0N1x1REU0OVx1REU0Qlx1REU0RC1cdURFNEZcdURFNTFcdURFNTJcdURFNTRcdURFNTdcdURFNTlcdURFNUJcdURFNURcdURFNUZcdURFNjFcdURFNjJcdURFNjRcdURFNjctXHVERTZBXHVERTZDLVx1REU3Mlx1REU3NC1cdURFNzdcdURFNzktXHVERTdDXHVERTdFXHVERTgwLVx1REU4OVx1REU4Qi1cdURFOUJcdURFQTEtXHVERUEzXHVERUE1LVx1REVBOVx1REVBQi1cdURFQkJdfFx1RDg2OVtcdURDMDAtXHVERURGXHVERjAwLVx1REZGRl18XHVEODZEW1x1REMwMC1cdURGMzlcdURGNDAtXHVERkZGXXxcdUQ4NkVbXHVEQzAwLVx1REMxRFx1REMyMC1cdURGRkZdfFx1RDg3M1tcdURDMDAtXHVERUExXHVERUIwLVx1REZGRl18XHVEODdBW1x1REMwMC1cdURGRTBdfFx1RDg3RVtcdURDMDAtXHVERTFEXXxcdUQ4ODRbXHVEQzAwLVx1REY0QVx1REY1MC1cdURGRkZdfFx1RDg4OFtcdURDMDAtXHVERkFGXSkqJC8udGVzdCh0KX0se25hbWU6InN0cmluZyIsdGVzdDpqZn0se25hbWU6IkNoYWluIix0ZXN0Ol9wfSx7bmFtZToiQXJyYXkiLHRlc3Q6VWZ9LHtuYW1lOiJNYXRyaXgiLHRlc3Q6cWZ9LHtuYW1lOiJEZW5zZU1hdHJpeCIsdGVzdDpHZn0se25hbWU6IlNwYXJzZU1hdHJpeCIsdGVzdDpZZn0se25hbWU6IlJhbmdlIix0ZXN0OlhmfSx7bmFtZToiSW5kZXgiLHRlc3Q6V2Z9LHtuYW1lOiJib29sZWFuIix0ZXN0OkhmfSx7bmFtZToiUmVzdWx0U2V0Iix0ZXN0OlpmfSx7bmFtZToiSGVscCIsdGVzdDpLZn0se25hbWU6ImZ1bmN0aW9uIix0ZXN0OkpmfSx7bmFtZToiRGF0ZSIsdGVzdDpRZn0se25hbWU6IlJlZ0V4cCIsdGVzdDokZn0se25hbWU6Im51bGwiLHRlc3Q6ZXB9LHtuYW1lOiJ1bmRlZmluZWQiLHRlc3Q6bnB9LHtuYW1lOiJBY2Nlc3Nvck5vZGUiLHRlc3Q6cnB9LHtuYW1lOiJBcnJheU5vZGUiLHRlc3Q6aXB9LHtuYW1lOiJBc3NpZ25tZW50Tm9kZSIsdGVzdDpvcH0se25hbWU6IkJsb2NrTm9kZSIsdGVzdDpzcH0se25hbWU6IkNvbmRpdGlvbmFsTm9kZSIsdGVzdDphcH0se25hbWU6IkNvbnN0YW50Tm9kZSIsdGVzdDp1cH0se25hbWU6IkZ1bmN0aW9uTm9kZSIsdGVzdDpscH0se25hbWU6IkZ1bmN0aW9uQXNzaWdubWVudE5vZGUiLHRlc3Q6Y3B9LHtuYW1lOiJJbmRleE5vZGUiLHRlc3Q6aHB9LHtuYW1lOiJOb2RlIix0ZXN0OmZwfSx7bmFtZToiT2JqZWN0Tm9kZSIsdGVzdDpwcH0se25hbWU6Ik9wZXJhdG9yTm9kZSIsdGVzdDpkcH0se25hbWU6IlBhcmVudGhlc2lzTm9kZSIsdGVzdDpncH0se25hbWU6IlJhbmdlTm9kZSIsdGVzdDp5cH0se25hbWU6IlJlbGF0aW9uYWxOb2RlIix0ZXN0Om1wfSx7bmFtZToiU3ltYm9sTm9kZSIsdGVzdDp2cH0se25hbWU6Ik1hcCIsdGVzdDpwZH0se25hbWU6Ik9iamVjdCIsdGVzdDp0cH1dKSxvLmFkZENvbnZlcnNpb25zKFt7ZnJvbToibnVtYmVyIix0bzoiQmlnTnVtYmVyIixjb252ZXJ0OmZ1bmN0aW9uKHQpe2lmKGV8fHlkKHQpLGZ1bmN0aW9uKHQpe3JldHVybiB0LnRvRXhwb25lbnRpYWwoKS5yZXBsYWNlKC9lLiokLywiIikucmVwbGFjZSgvXjBcLj8wKnxcLi8sIiIpLmxlbmd0aH0odCk+MTUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGltcGxpY2l0bHkgY29udmVydCBhIG51bWJlciB3aXRoID4xNSBzaWduaWZpY2FudCBkaWdpdHMgdG8gQmlnTnVtYmVyICh2YWx1ZTogIit0KyIpLiBVc2UgZnVuY3Rpb24gYmlnbnVtYmVyKHgpIHRvIGNvbnZlcnQgdG8gQmlnTnVtYmVyLiIpO3JldHVybiBuZXcgZSh0KX19LHtmcm9tOiJudW1iZXIiLHRvOiJDb21wbGV4Iixjb252ZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiBufHxtZCh0KSxuZXcgbih0LDApfX0se2Zyb206IkJpZ051bWJlciIsdG86IkNvbXBsZXgiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIG58fG1kKHQpLG5ldyBuKHQudG9OdW1iZXIoKSwwKX19LHtmcm9tOiJGcmFjdGlvbiIsdG86IkJpZ051bWJlciIsY29udmVydDpmdW5jdGlvbih0KXt0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgaW1wbGljaXRseSBjb252ZXJ0IGEgRnJhY3Rpb24gdG8gQmlnTnVtYmVyIG9yIHZpY2UgdmVyc2EuIFVzZSBmdW5jdGlvbiBiaWdudW1iZXIoeCkgdG8gY29udmVydCB0byBCaWdOdW1iZXIgb3IgZnJhY3Rpb24oeCkgdG8gY29udmVydCB0byBGcmFjdGlvbi4iKX19LHtmcm9tOiJGcmFjdGlvbiIsdG86IkNvbXBsZXgiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIG58fG1kKHQpLG5ldyBuKHQudmFsdWVPZigpLDApfX0se2Zyb206Im51bWJlciIsdG86IkZyYWN0aW9uIixjb252ZXJ0OmZ1bmN0aW9uKHQpe2l8fHZkKHQpO3ZhciBlPW5ldyBpKHQpO2lmKGUudmFsdWVPZigpIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgaW1wbGljaXRseSBjb252ZXJ0IGEgbnVtYmVyIHRvIGEgRnJhY3Rpb24gd2hlbiB0aGVyZSB3aWxsIGJlIGEgbG9zcyBvZiBwcmVjaXNpb24gKHZhbHVlOiAiK3QrIikuIFVzZSBmdW5jdGlvbiBmcmFjdGlvbih4KSB0byBjb252ZXJ0IHRvIEZyYWN0aW9uLiIpO3JldHVybiBlfX0se2Zyb206InN0cmluZyIsdG86Im51bWJlciIsY29udmVydDpmdW5jdGlvbih0KXt2YXIgZT1OdW1iZXIodCk7aWYoaXNOYU4oZSkpdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCAiJyt0KyciIHRvIGEgbnVtYmVyJyk7cmV0dXJuIGV9fSx7ZnJvbToic3RyaW5nIix0bzoiQmlnTnVtYmVyIixjb252ZXJ0OmZ1bmN0aW9uKHQpe2V8fHlkKHQpO3RyeXtyZXR1cm4gbmV3IGUodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCAiJyt0KyciIHRvIEJpZ051bWJlcicpfX19LHtmcm9tOiJzdHJpbmciLHRvOiJGcmFjdGlvbiIsY29udmVydDpmdW5jdGlvbih0KXtpfHx2ZCh0KTt0cnl7cmV0dXJuIG5ldyBpKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbnZlcnQgIicrdCsnIiB0byBGcmFjdGlvbicpfX19LHtmcm9tOiJzdHJpbmciLHRvOiJDb21wbGV4Iixjb252ZXJ0OmZ1bmN0aW9uKHQpe258fG1kKHQpO3RyeXtyZXR1cm4gbmV3IG4odCl9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCAiJyt0KyciIHRvIENvbXBsZXgnKX19fSx7ZnJvbToiYm9vbGVhbiIsdG86Im51bWJlciIsY29udmVydDpmdW5jdGlvbih0KXtyZXR1cm4rdH19LHtmcm9tOiJib29sZWFuIix0bzoiQmlnTnVtYmVyIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiBlfHx5ZCh0KSxuZXcgZSgrdCl9fSx7ZnJvbToiYm9vbGVhbiIsdG86IkZyYWN0aW9uIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiBpfHx2ZCh0KSxuZXcgaSgrdCl9fSx7ZnJvbToiYm9vbGVhbiIsdG86InN0cmluZyIsY29udmVydDpmdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nKHQpfX0se2Zyb206IkFycmF5Iix0bzoiTWF0cml4Iixjb252ZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiByfHxmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgYXJyYXkgaW50byBhIE1hdHJpeDogbm8gY2xhc3MgJ0RlbnNlTWF0cml4JyBwcm92aWRlZCIpfSgpLG5ldyByKHQpfX0se2Zyb206Ik1hdHJpeCIsdG86IkFycmF5Iixjb252ZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlT2YoKX19XSksby5vbk1pc21hdGNoPSh0LGUsbik9Pnt2YXIgcj1vLmNyZWF0ZUVycm9yKHQsZSxuKTtpZihbIndyb25nVHlwZSIsIm1pc21hdGNoIl0uaW5jbHVkZXMoci5kYXRhLmNhdGVnb3J5KSYmMT09PWUubGVuZ3RoJiZWZihlWzBdKSYmbi5zb21lKCh0PT4hdC5wYXJhbXMuaW5jbHVkZXMoIiwiKSkpKXt2YXIgaT1uZXcgVHlwZUVycm9yKCJGdW5jdGlvbiAnIi5jb25jYXQodCwiJyBkb2Vzbid0IGFwcGx5IHRvIG1hdHJpY2VzLiBUbyBjYWxsIGl0ICIpKyJlbGVtZW50d2lzZSBvbiBhIG1hdHJpeCAnTScsIHRyeSAnbWFwKE0sICIuY29uY2F0KHQsIiknLiIpKTt0aHJvdyBpLmRhdGE9ci5kYXRhLGl9dGhyb3cgcn0sby5vbk1pc21hdGNoPSh0LGUsbik9Pnt2YXIgcj1vLmNyZWF0ZUVycm9yKHQsZSxuKTtpZihbIndyb25nVHlwZSIsIm1pc21hdGNoIl0uaW5jbHVkZXMoci5kYXRhLmNhdGVnb3J5KSYmMT09PWUubGVuZ3RoJiZWZihlWzBdKSYmbi5zb21lKCh0PT4hdC5wYXJhbXMuaW5jbHVkZXMoIiwiKSkpKXt2YXIgaT1uZXcgVHlwZUVycm9yKCJGdW5jdGlvbiAnIi5jb25jYXQodCwiJyBkb2Vzbid0IGFwcGx5IHRvIG1hdHJpY2VzLiBUbyBjYWxsIGl0ICIpKyJlbGVtZW50d2lzZSBvbiBhIG1hdHJpeCAnTScsIHRyeSAnbWFwKE0sICIuY29uY2F0KHQsIiknLiIpKTt0aHJvdyBpLmRhdGE9ci5kYXRhLGl9dGhyb3cgcn0sb30pKTtmdW5jdGlvbiB5ZCh0KXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHZhbHVlICIuY29uY2F0KHQsIiBpbnRvIGEgQmlnTnVtYmVyOiBubyBjbGFzcyAnQmlnTnVtYmVyJyBwcm92aWRlZCIpKX1mdW5jdGlvbiBtZCh0KXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHZhbHVlICIuY29uY2F0KHQsIiBpbnRvIGEgQ29tcGxleCBudW1iZXI6IG5vIGNsYXNzICdDb21wbGV4JyBwcm92aWRlZCIpKX1mdW5jdGlvbiB2ZCh0KXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHZhbHVlICIuY29uY2F0KHQsIiBpbnRvIGEgRnJhY3Rpb24sIG5vIGNsYXNzICdGcmFjdGlvbicgcHJvdmlkZWQuIikpfXZhciBfZCx4ZCx3ZD05ZTE1LGJkPTFlOSxEZD0iMDEyMzQ1Njc4OWFiY2RlZiIsRWQ9IjIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MjA3NjAxMTAxNDg4NjI4NzcyOTc2MDMzMzI3OTAwOTY3NTcyNjA5Njc3MzUyNDgwMjM1OTk3MjA1MDg5NTk4Mjk4MzQxOTY3Nzg0MDQyMjg2MjQ4NjMzNDA5NTI1NDY1MDgyODA2NzU2NjY2Mjg3MzY5MDk4NzgxNjg5NDgyOTA3MjA4MzI1NTU0NjgwODQzNzk5ODk0ODI2MjMzMTk4NTI4MzkzNTA1MzA4OTY1Mzc3NzMyNjI4ODQ2MTYzMzY2MjIyMjg3Njk4MjE5ODg2NzQ2NTQzNjY3NDc0NDA0MjQzMjc0MzY1MTU1MDQ4OTM0MzE0OTM5MzkxNDc5NjE5NDA0NDAwMjIyMTA1MTAxNzE0MTc0ODAwMzY4ODA4NDAxMjY0NzA4MDY4NTU2Nzc0MzIxNjIyODM1NTIyMDExNDgwNDY2MzcxNTY1OTEyMTM3MzQ1MDc0Nzg1Njk0NzY4MzQ2MzYxNjc5MjEwMTgwNjQ0NTA3MDY0ODAwMDI3NzUwMjY4NDkxNjc0NjU1MDU4Njg1NjkzNTY3MzQyMDY3MDU4MTEzNjQyOTIyNDU1NDQwNTc1ODkyNTcyNDIwODI0MTMxNDY5NTY4OTAxNjc1ODk0MDI1Njc3NjMxMTM1NjkxOTI5MjAzMzM3NjU4NzE0MTY2MDIzMDEwNTcwMzA4OTYzNDU3MjA3NTQ0MDM3MDg0NzQ2OTk0MDE2ODI2OTI4MjgwODQ4MTE4NDI4OTMxNDg0ODUyNDk0ODY0NDg3MTkyNzgwOTY3NjI3MTI3NTc3NTM5NzAyNzY2ODYwNTk1MjQ5NjcxNjY3NDE4MzQ4NTcwNDQyMjUwNzE5Nzk2NTAwNDcxNDk1MTA1MDQ5MjIxNDc3NjU2NzYzNjkzODY2Mjk3Njk3OTUyMjExMDcxODI2NDU0OTczNDc3MjY2MjQyNTcwOTQyOTMyMjU4Mjc5ODUwMjU4NTUwOTc4NTI2NTM4MzIwNzYwNjcyNjMxNzE2NDMwOTUwNTk5NTA4NzgwNzUyMzcxMDMzMzEwMTE5Nzg1NzU0NzMzMTU0MTQyMTgwODQyNzU0Mzg2MzU5MTc3ODExNzA1NDMwOTgyNzQ4MjM4NTA0NTY0ODAxOTA5NTYxMDI5OTI5MTgyNDMxODIzNzUyNTM1NzcwOTc1MDUzOTU2NTE4NzY5NzUxMDM3NDk3MDg4ODY5MjE4MDIwNTE4OTMzOTUwNzIzODUzOTIwNTE0NDYzNDE5NzI2NTI4NzI4Njk2NTExMDg2MjU3MTQ5MjE5ODg0OTk3ODc0ODg3Mzc3MTM0NTY4NjIwOTE2NzA1OCIsQ2Q9IjMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyODg0MTk3MTY5Mzk5Mzc1MTA1ODIwOTc0OTQ0NTkyMzA3ODE2NDA2Mjg2MjA4OTk4NjI4MDM0ODI1MzQyMTE3MDY3OTgyMTQ4MDg2NTEzMjgyMzA2NjQ3MDkzODQ0NjA5NTUwNTgyMjMxNzI1MzU5NDA4MTI4NDgxMTE3NDUwMjg0MTAyNzAxOTM4NTIxMTA1NTU5NjQ0NjIyOTQ4OTU0OTMwMzgxOTY0NDI4ODEwOTc1NjY1OTMzNDQ2MTI4NDc1NjQ4MjMzNzg2NzgzMTY1MjcxMjAxOTA5MTQ1NjQ4NTY2OTIzNDYwMzQ4NjEwNDU0MzI2NjQ4MjEzMzkzNjA3MjYwMjQ5MTQxMjczNzI0NTg3MDA2NjA2MzE1NTg4MTc0ODgxNTIwOTIwOTYyODI5MjU0MDkxNzE1MzY0MzY3ODkyNTkwMzYwMDExMzMwNTMwNTQ4ODIwNDY2NTIxMzg0MTQ2OTUxOTQxNTExNjA5NDMzMDU3MjcwMzY1NzU5NTkxOTUzMDkyMTg2MTE3MzgxOTMyNjExNzkzMTA1MTE4NTQ4MDc0NDYyMzc5OTYyNzQ5NTY3MzUxODg1NzUyNzI0ODkxMjI3OTM4MTgzMDExOTQ5MTI5ODMzNjczMzYyNDQwNjU2NjQzMDg2MDIxMzk0OTQ2Mzk1MjI0NzM3MTkwNzAyMTc5ODYwOTQzNzAyNzcwNTM5MjE3MTc2MjkzMTc2NzUyMzg0Njc0ODE4NDY3NjY5NDA1MTMyMDAwNTY4MTI3MTQ1MjYzNTYwODI3Nzg1NzcxMzQyNzU3Nzg5NjA5MTczNjM3MTc4NzIxNDY4NDQwOTAxMjI0OTUzNDMwMTQ2NTQ5NTg1MzcxMDUwNzkyMjc5Njg5MjU4OTIzNTQyMDE5OTU2MTEyMTI5MDIxOTYwODY0MDM0NDE4MTU5ODEzNjI5Nzc0NzcxMzA5OTYwNTE4NzA3MjExMzQ5OTk5OTk4MzcyOTc4MDQ5OTUxMDU5NzMxNzMyODE2MDk2MzE4NTk1MDI0NDU5NDU1MzQ2OTA4MzAyNjQyNTIyMzA4MjUzMzQ0Njg1MDM1MjYxOTMxMTg4MTcxMDEwMDAzMTM3ODM4NzUyODg2NTg3NTMzMjA4MzgxNDIwNjE3MTc3NjY5MTQ3MzAzNTk4MjUzNDkwNDI4NzU1NDY4NzMxMTU5NTYyODYzODgyMzUzNzg3NTkzNzUxOTU3NzgxODU3NzgwNTMyMTcxMjI2ODA2NjEzMDAxOTI3ODc2NjExMTk1OTA5MjE2NDIwMTk4OTM4MDk1MjU3MjAxMDY1NDg1ODYzMjc4OSIsU2Q9e3ByZWNpc2lvbjoyMCxyb3VuZGluZzo0LG1vZHVsbzoxLHRvRXhwTmVnOi03LHRvRXhwUG9zOjIxLG1pbkU6LXdkLG1heEU6d2QsY3J5cHRvOiExfSxBZD0hMCxOZD0iW0RlY2ltYWxFcnJvcl0gIixJZD1OZCsiSW52YWxpZCBhcmd1bWVudDogIixNZD1OZCsiUHJlY2lzaW9uIGxpbWl0IGV4Y2VlZGVkIixGZD1OZCsiY3J5cHRvIHVuYXZhaWxhYmxlIixUZD0iW29iamVjdCBEZWNpbWFsXSIsT2Q9TWF0aC5mbG9vcixMZD1NYXRoLnBvdyxQZD0vXjBiKFswMV0rKFwuWzAxXSopP3xcLlswMV0rKShwWystXT9cZCspPyQvaSxSZD0vXjB4KFswLTlhLWZdKyhcLlswLTlhLWZdKik/fFwuWzAtOWEtZl0rKShwWystXT9cZCspPyQvaSxCZD0vXjBvKFswLTddKyhcLlswLTddKik/fFwuWzAtN10rKShwWystXT9cZCspPyQvaSxrZD0vXihcZCsoXC5cZCopP3xcLlxkKykoZVsrLV0/XGQrKT8kL2ksemQ9MWU3LGpkPUVkLmxlbmd0aC0xLFVkPUNkLmxlbmd0aC0xLHFkPXt0b1N0cmluZ1RhZzpUZH07ZnVuY3Rpb24gVmQodCl7dmFyIGUsbixyLGk9dC5sZW5ndGgtMSxvPSIiLHM9dFswXTtpZihpPjApe2ZvcihvKz1zLGU9MTtlPGk7ZSsrKShuPTctKHI9dFtlXSsiIikubGVuZ3RoKSYmKG8rPXRnKG4pKSxvKz1yOyhuPTctKHI9KHM9dFtlXSkrIiIpLmxlbmd0aCkmJihvKz10ZyhuKSl9ZWxzZSBpZigwPT09cylyZXR1cm4iMCI7Zm9yKDtzJTEwPT0wOylzLz0xMDtyZXR1cm4gbytzfWZ1bmN0aW9uIEdkKHQsZSxuKXtpZih0IT09fn50fHx0PGV8fHQ+bil0aHJvdyBFcnJvcihJZCt0KX1mdW5jdGlvbiBZZCh0LGUsbixyKXt2YXIgaSxvLHMsYTtmb3Iobz10WzBdO28+PTEwO28vPTEwKS0tZTtyZXR1cm4tLWU8MD8oZSs9NyxpPTApOihpPU1hdGguY2VpbCgoZSsxKS83KSxlJT03KSxvPUxkKDEwLDctZSksYT10W2ldJW98MCxudWxsPT1yP2U8Mz8oMD09ZT9hPWEvMTAwfDA6MT09ZSYmKGE9YS8xMHwwKSxzPW48NCYmOTk5OTk9PWF8fG4+MyYmNDk5OTk9PWF8fDVlND09YXx8MD09YSk6cz0objw0JiZhKzE9PW98fG4+MyYmYSsxPT1vLzIpJiYodFtpKzFdL28vMTAwfDApPT1MZCgxMCxlLTIpLTF8fChhPT1vLzJ8fDA9PWEpJiYhKHRbaSsxXS9vLzEwMHwwKTplPDQ/KDA9PWU/YT1hLzFlM3wwOjE9PWU/YT1hLzEwMHwwOjI9PWUmJihhPWEvMTB8MCkscz0ocnx8bjw0KSYmOTk5OT09YXx8IXImJm4+MyYmNDk5OT09YSk6cz0oKHJ8fG48NCkmJmErMT09b3x8IXImJm4+MyYmYSsxPT1vLzIpJiYodFtpKzFdL28vMWUzfDApPT1MZCgxMCxlLTMpLTEsc31mdW5jdGlvbiBYZCh0LGUsbil7Zm9yKHZhciByLGksbz1bMF0scz0wLGE9dC5sZW5ndGg7czxhOyl7Zm9yKGk9by5sZW5ndGg7aS0tOylvW2ldKj1lO2ZvcihvWzBdKz1EZC5pbmRleE9mKHQuY2hhckF0KHMrKykpLHI9MDtyPG8ubGVuZ3RoO3IrKylvW3JdPm4tMSYmKHZvaWQgMD09PW9bcisxXSYmKG9bcisxXT0wKSxvW3IrMV0rPW9bcl0vbnwwLG9bcl0lPW4pfXJldHVybiBvLnJldmVyc2UoKX1xZC5hYnNvbHV0ZVZhbHVlPXFkLmFicz1mdW5jdGlvbigpe3ZhciB0PW5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpO3JldHVybiB0LnM8MCYmKHQucz0xKSxIZCh0KX0scWQuY2VpbD1mdW5jdGlvbigpe3JldHVybiBIZChuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKSx0aGlzLmUrMSwyKX0scWQuY2xhbXBlZFRvPXFkLmNsYW1wPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPW4uY29uc3RydWN0b3I7aWYodD1uZXcgcih0KSxlPW5ldyByKGUpLCF0LnN8fCFlLnMpcmV0dXJuIG5ldyByKE5hTik7aWYodC5ndChlKSl0aHJvdyBFcnJvcihJZCtlKTtyZXR1cm4gbi5jbXAodCk8MD90Om4uY21wKGUpPjA/ZTpuZXcgcihuKX0scWQuY29tcGFyZWRUbz1xZC5jbXA9ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbz10aGlzLHM9by5kLGE9KHQ9bmV3IG8uY29uc3RydWN0b3IodCkpLmQsdT1vLnMsYz10LnM7aWYoIXN8fCFhKXJldHVybiB1JiZjP3UhPT1jP3U6cz09PWE/MDohc151PDA/MTotMTpOYU47aWYoIXNbMF18fCFhWzBdKXJldHVybiBzWzBdP3U6YVswXT8tYzowO2lmKHUhPT1jKXJldHVybiB1O2lmKG8uZSE9PXQuZSlyZXR1cm4gby5lPnQuZV51PDA/MTotMTtmb3IoZT0wLG49KHI9cy5sZW5ndGgpPChpPWEubGVuZ3RoKT9yOmk7ZTxuOysrZSlpZihzW2VdIT09YVtlXSlyZXR1cm4gc1tlXT5hW2VdXnU8MD8xOi0xO3JldHVybiByPT09aT8wOnI+aV51PDA/MTotMX0scWQuY29zaW5lPXFkLmNvcz1mdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtyZXR1cm4gbi5kP24uZFswXT8odD1yLnByZWNpc2lvbixlPXIucm91bmRpbmcsci5wcmVjaXNpb249dCtNYXRoLm1heChuLmUsbi5zZCgpKSs3LHIucm91bmRpbmc9MSxuPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixpO2lmKGUuaXNaZXJvKCkpcmV0dXJuIGU7cj1lLmQubGVuZ3RoLHI8MzI/KG49TWF0aC5jZWlsKHIvMyksaT0oMS9jZyg0LG4pKS50b1N0cmluZygpKToobj0xNixpPSIyLjMyODMwNjQzNjUzODY5NjI4OTA2MjVlLTEwIiksdC5wcmVjaXNpb24rPW4sZT11Zyh0LDEsZS50aW1lcyhpKSxuZXcgdCgxKSk7Zm9yKHZhciBvPW47by0tOyl7dmFyIHM9ZS50aW1lcyhlKTtlPXMudGltZXMocykubWludXMocykudGltZXMoOCkucGx1cygxKX1yZXR1cm4gdC5wcmVjaXNpb24tPW4sZX0ocixsZyhyLG4pKSxyLnByZWNpc2lvbj10LHIucm91bmRpbmc9ZSxIZCgyPT14ZHx8Mz09eGQ/bi5uZWcoKTpuLHQsZSwhMCkpOm5ldyByKDEpOm5ldyByKE5hTil9LHFkLmN1YmVSb290PXFkLmNicnQ9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpLG8scyxhLHUsYyxsPXRoaXMsaD1sLmNvbnN0cnVjdG9yO2lmKCFsLmlzRmluaXRlKCl8fGwuaXNaZXJvKCkpcmV0dXJuIG5ldyBoKGwpO2ZvcihBZD0hMSwobz1sLnMqTGQobC5zKmwsMS8zKSkmJk1hdGguYWJzKG8pIT0xLzA/cj1uZXcgaChvLnRvU3RyaW5nKCkpOihuPVZkKGwuZCksKG89KCh0PWwuZSktbi5sZW5ndGgrMSklMykmJihuKz0xPT1vfHwtMj09bz8iMCI6IjAwIiksbz1MZChuLDEvMyksdD1PZCgodCsxKS8zKS0odCUzPT0odDwwPy0xOjIpKSxvPT0xLzA/bj0iNWUiK3Q6bj0obj1vLnRvRXhwb25lbnRpYWwoKSkuc2xpY2UoMCxuLmluZGV4T2YoImUiKSsxKSt0LChyPW5ldyBoKG4pKS5zPWwucykscz0odD1oLnByZWNpc2lvbikrMzs7KWlmKGM9KHU9KGE9cikudGltZXMoYSkudGltZXMoYSkpLnBsdXMobCkscj1XZChjLnBsdXMobCkudGltZXMoYSksYy5wbHVzKHUpLHMrMiwxKSxWZChhLmQpLnNsaWNlKDAscyk9PT0obj1WZChyLmQpKS5zbGljZSgwLHMpKXtpZigiOTk5OSIhPShuPW4uc2xpY2Uocy0zLHMrMSkpJiYoaXx8IjQ5OTkiIT1uKSl7KCErbnx8IStuLnNsaWNlKDEpJiYiNSI9PW4uY2hhckF0KDApKSYmKEhkKHIsdCsxLDEpLGU9IXIudGltZXMocikudGltZXMocikuZXEobCkpO2JyZWFrfWlmKCFpJiYoSGQoYSx0KzEsMCksYS50aW1lcyhhKS50aW1lcyhhKS5lcShsKSkpe3I9YTticmVha31zKz00LGk9MX1yZXR1cm4gQWQ9ITAsSGQocix0LGgucm91bmRpbmcsZSl9LHFkLmRlY2ltYWxQbGFjZXM9cWQuZHA9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZCxuPU5hTjtpZihlKXtpZihuPTcqKCh0PWUubGVuZ3RoLTEpLU9kKHRoaXMuZS83KSksdD1lW3RdKWZvcig7dCUxMD09MDt0Lz0xMCluLS07bjwwJiYobj0wKX1yZXR1cm4gbn0scWQuZGl2aWRlZEJ5PXFkLmRpdj1mdW5jdGlvbih0KXtyZXR1cm4gV2QodGhpcyxuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0KSl9LHFkLmRpdmlkZWRUb0ludGVnZXJCeT1xZC5kaXZUb0ludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnN0cnVjdG9yO3JldHVybiBIZChXZCh0aGlzLG5ldyBlKHQpLDAsMSwxKSxlLnByZWNpc2lvbixlLnJvdW5kaW5nKX0scWQuZXF1YWxzPXFkLmVxPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy5jbXAodCl9LHFkLmZsb29yPWZ1bmN0aW9uKCl7cmV0dXJuIEhkKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpLHRoaXMuZSsxLDMpfSxxZC5ncmVhdGVyVGhhbj1xZC5ndD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXAodCk+MH0scWQuZ3JlYXRlclRoYW5PckVxdWFsVG89cWQuZ3RlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY21wKHQpO3JldHVybiAxPT1lfHwwPT09ZX0scWQuaHlwZXJib2xpY0Nvc2luZT1xZC5jb3NoPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaSxvPXRoaXMscz1vLmNvbnN0cnVjdG9yLGE9bmV3IHMoMSk7aWYoIW8uaXNGaW5pdGUoKSlyZXR1cm4gbmV3IHMoby5zPzEvMDpOYU4pO2lmKG8uaXNaZXJvKCkpcmV0dXJuIGE7bj1zLnByZWNpc2lvbixyPXMucm91bmRpbmcscy5wcmVjaXNpb249bitNYXRoLm1heChvLmUsby5zZCgpKSs0LHMucm91bmRpbmc9MSwoaT1vLmQubGVuZ3RoKTwzMj9lPSgxL2NnKDQsdD1NYXRoLmNlaWwoaS8zKSkpLnRvU3RyaW5nKCk6KHQ9MTYsZT0iMi4zMjgzMDY0MzY1Mzg2OTYyODkwNjI1ZS0xMCIpLG89dWcocywxLG8udGltZXMoZSksbmV3IHMoMSksITApO2Zvcih2YXIgdSxjPXQsbD1uZXcgcyg4KTtjLS07KXU9by50aW1lcyhvKSxvPWEubWludXModS50aW1lcyhsLm1pbnVzKHUudGltZXMobCkpKSk7cmV0dXJuIEhkKG8scy5wcmVjaXNpb249bixzLnJvdW5kaW5nPXIsITApfSxxZC5oeXBlcmJvbGljU2luZT1xZC5zaW5oPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaT10aGlzLG89aS5jb25zdHJ1Y3RvcjtpZighaS5pc0Zpbml0ZSgpfHxpLmlzWmVybygpKXJldHVybiBuZXcgbyhpKTtpZihlPW8ucHJlY2lzaW9uLG49by5yb3VuZGluZyxvLnByZWNpc2lvbj1lK01hdGgubWF4KGkuZSxpLnNkKCkpKzQsby5yb3VuZGluZz0xLChyPWkuZC5sZW5ndGgpPDMpaT11ZyhvLDIsaSxpLCEwKTtlbHNle3Q9KHQ9MS40Kk1hdGguc3FydChyKSk+MTY/MTY6MHx0LGk9dWcobywyLGk9aS50aW1lcygxL2NnKDUsdCkpLGksITApO2Zvcih2YXIgcyxhPW5ldyBvKDUpLHU9bmV3IG8oMTYpLGM9bmV3IG8oMjApO3QtLTspcz1pLnRpbWVzKGkpLGk9aS50aW1lcyhhLnBsdXMocy50aW1lcyh1LnRpbWVzKHMpLnBsdXMoYykpKSl9cmV0dXJuIG8ucHJlY2lzaW9uPWUsby5yb3VuZGluZz1uLEhkKGksZSxuLCEwKX0scWQuaHlwZXJib2xpY1RhbmdlbnQ9cWQudGFuaD1mdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtyZXR1cm4gbi5pc0Zpbml0ZSgpP24uaXNaZXJvKCk/bmV3IHIobik6KHQ9ci5wcmVjaXNpb24sZT1yLnJvdW5kaW5nLHIucHJlY2lzaW9uPXQrNyxyLnJvdW5kaW5nPTEsV2Qobi5zaW5oKCksbi5jb3NoKCksci5wcmVjaXNpb249dCxyLnJvdW5kaW5nPWUpKTpuZXcgcihuLnMpfSxxZC5pbnZlcnNlQ29zaW5lPXFkLmFjb3M9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMsbj1lLmNvbnN0cnVjdG9yLHI9ZS5hYnMoKS5jbXAoMSksaT1uLnByZWNpc2lvbixvPW4ucm91bmRpbmc7cmV0dXJuLTEhPT1yPzA9PT1yP2UuaXNOZWcoKT9RZChuLGksbyk6bmV3IG4oMCk6bmV3IG4oTmFOKTplLmlzWmVybygpP1FkKG4saSs0LG8pLnRpbWVzKC41KToobi5wcmVjaXNpb249aSs2LG4ucm91bmRpbmc9MSxlPWUuYXNpbigpLHQ9UWQobixpKzQsbykudGltZXMoLjUpLG4ucHJlY2lzaW9uPWksbi5yb3VuZGluZz1vLHQubWludXMoZSkpfSxxZC5pbnZlcnNlSHlwZXJib2xpY0Nvc2luZT1xZC5hY29zaD1mdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtyZXR1cm4gbi5sdGUoMSk/bmV3IHIobi5lcSgxKT8wOk5hTik6bi5pc0Zpbml0ZSgpPyh0PXIucHJlY2lzaW9uLGU9ci5yb3VuZGluZyxyLnByZWNpc2lvbj10K01hdGgubWF4KE1hdGguYWJzKG4uZSksbi5zZCgpKSs0LHIucm91bmRpbmc9MSxBZD0hMSxuPW4udGltZXMobikubWludXMoMSkuc3FydCgpLnBsdXMobiksQWQ9ITAsci5wcmVjaXNpb249dCxyLnJvdW5kaW5nPWUsbi5sbigpKTpuZXcgcihuKX0scWQuaW52ZXJzZUh5cGVyYm9saWNTaW5lPXFkLmFzaW5oPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiFuLmlzRmluaXRlKCl8fG4uaXNaZXJvKCk/bmV3IHIobik6KHQ9ci5wcmVjaXNpb24sZT1yLnJvdW5kaW5nLHIucHJlY2lzaW9uPXQrMipNYXRoLm1heChNYXRoLmFicyhuLmUpLG4uc2QoKSkrNixyLnJvdW5kaW5nPTEsQWQ9ITEsbj1uLnRpbWVzKG4pLnBsdXMoMSkuc3FydCgpLnBsdXMobiksQWQ9ITAsci5wcmVjaXNpb249dCxyLnJvdW5kaW5nPWUsbi5sbigpKX0scWQuaW52ZXJzZUh5cGVyYm9saWNUYW5nZW50PXFkLmF0YW5oPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaT10aGlzLG89aS5jb25zdHJ1Y3RvcjtyZXR1cm4gaS5pc0Zpbml0ZSgpP2kuZT49MD9uZXcgbyhpLmFicygpLmVxKDEpP2kucy8wOmkuaXNaZXJvKCk/aTpOYU4pOih0PW8ucHJlY2lzaW9uLGU9by5yb3VuZGluZyxyPWkuc2QoKSxNYXRoLm1heChyLHQpPDIqLWkuZS0xP0hkKG5ldyBvKGkpLHQsZSwhMCk6KG8ucHJlY2lzaW9uPW49ci1pLmUsaT1XZChpLnBsdXMoMSksbmV3IG8oMSkubWludXMoaSksbit0LDEpLG8ucHJlY2lzaW9uPXQrNCxvLnJvdW5kaW5nPTEsaT1pLmxuKCksby5wcmVjaXNpb249dCxvLnJvdW5kaW5nPWUsaS50aW1lcyguNSkpKTpuZXcgbyhOYU4pfSxxZC5pbnZlcnNlU2luZT1xZC5hc2luPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaT10aGlzLG89aS5jb25zdHJ1Y3RvcjtyZXR1cm4gaS5pc1plcm8oKT9uZXcgbyhpKTooZT1pLmFicygpLmNtcCgxKSxuPW8ucHJlY2lzaW9uLHI9by5yb3VuZGluZywtMSE9PWU/MD09PWU/KCh0PVFkKG8sbis0LHIpLnRpbWVzKC41KSkucz1pLnMsdCk6bmV3IG8oTmFOKTooby5wcmVjaXNpb249bis2LG8ucm91bmRpbmc9MSxpPWkuZGl2KG5ldyBvKDEpLm1pbnVzKGkudGltZXMoaSkpLnNxcnQoKS5wbHVzKDEpKS5hdGFuKCksby5wcmVjaXNpb249bixvLnJvdW5kaW5nPXIsaS50aW1lcygyKSkpfSxxZC5pbnZlcnNlVGFuZ2VudD1xZC5hdGFuPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaSxvLHMsYSx1LGM9dGhpcyxsPWMuY29uc3RydWN0b3IsaD1sLnByZWNpc2lvbixmPWwucm91bmRpbmc7aWYoYy5pc0Zpbml0ZSgpKXtpZihjLmlzWmVybygpKXJldHVybiBuZXcgbChjKTtpZihjLmFicygpLmVxKDEpJiZoKzQ8PVVkKXJldHVybihzPVFkKGwsaCs0LGYpLnRpbWVzKC4yNSkpLnM9Yy5zLHN9ZWxzZXtpZighYy5zKXJldHVybiBuZXcgbChOYU4pO2lmKGgrNDw9VWQpcmV0dXJuKHM9UWQobCxoKzQsZikudGltZXMoLjUpKS5zPWMucyxzfWZvcihsLnByZWNpc2lvbj1hPWgrMTAsbC5yb3VuZGluZz0xLHQ9bj1NYXRoLm1pbigyOCxhLzcrMnwwKTt0Oy0tdCljPWMuZGl2KGMudGltZXMoYykucGx1cygxKS5zcXJ0KCkucGx1cygxKSk7Zm9yKEFkPSExLGU9TWF0aC5jZWlsKGEvNykscj0xLHU9Yy50aW1lcyhjKSxzPW5ldyBsKGMpLGk9YzstMSE9PXQ7KWlmKGk9aS50aW1lcyh1KSxvPXMubWludXMoaS5kaXYocis9MikpLGk9aS50aW1lcyh1KSx2b2lkIDAhPT0ocz1vLnBsdXMoaS5kaXYocis9MikpKS5kW2VdKWZvcih0PWU7cy5kW3RdPT09by5kW3RdJiZ0LS07KTtyZXR1cm4gbiYmKHM9cy50aW1lcygyPDxuLTEpKSxBZD0hMCxIZChzLGwucHJlY2lzaW9uPWgsbC5yb3VuZGluZz1mLCEwKX0scWQuaXNGaW5pdGU9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuZH0scWQuaXNJbnRlZ2VyPXFkLmlzSW50PWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmQmJk9kKHRoaXMuZS83KT50aGlzLmQubGVuZ3RoLTJ9LHFkLmlzTmFOPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuc30scWQuaXNOZWdhdGl2ZT1xZC5pc05lZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnM8MH0scWQuaXNQb3NpdGl2ZT1xZC5pc1Bvcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnM+MH0scWQuaXNaZXJvPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmQmJjA9PT10aGlzLmRbMF19LHFkLmxlc3NUaGFuPXFkLmx0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNtcCh0KTwwfSxxZC5sZXNzVGhhbk9yRXF1YWxUbz1xZC5sdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wKHQpPDF9LHFkLmxvZ2FyaXRobT1xZC5sb2c9ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxzLGEsdSxjPXRoaXMsbD1jLmNvbnN0cnVjdG9yLGg9bC5wcmVjaXNpb24sZj1sLnJvdW5kaW5nO2lmKG51bGw9PXQpdD1uZXcgbCgxMCksZT0hMDtlbHNle2lmKG49KHQ9bmV3IGwodCkpLmQsdC5zPDB8fCFufHwhblswXXx8dC5lcSgxKSlyZXR1cm4gbmV3IGwoTmFOKTtlPXQuZXEoMTApfWlmKG49Yy5kLGMuczwwfHwhbnx8IW5bMF18fGMuZXEoMSkpcmV0dXJuIG5ldyBsKG4mJiFuWzBdPy0xLzA6MSE9Yy5zP05hTjpuPzA6MS8wKTtpZihlKWlmKG4ubGVuZ3RoPjEpbz0hMDtlbHNle2ZvcihpPW5bMF07aSUxMD09MDspaS89MTA7bz0xIT09aX1pZihBZD0hMSxzPW9nKGMsYT1oKzUpLHI9ZT9KZChsLGErMTApOm9nKHQsYSksWWQoKHU9V2QocyxyLGEsMSkpLmQsaT1oLGYpKWRve2lmKHM9b2coYyxhKz0xMCkscj1lP0pkKGwsYSsxMCk6b2codCxhKSx1PVdkKHMscixhLDEpLCFvKXsrVmQodS5kKS5zbGljZShpKzEsaSsxNSkrMT09MWUxNCYmKHU9SGQodSxoKzEsMCkpO2JyZWFrfX13aGlsZShZZCh1LmQsaSs9MTAsZikpO3JldHVybiBBZD0hMCxIZCh1LGgsZil9LHFkLm1pbnVzPXFkLnN1Yj1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYSx1LGMsbCxoLGYscD10aGlzLGQ9cC5jb25zdHJ1Y3RvcjtpZih0PW5ldyBkKHQpLCFwLmR8fCF0LmQpcmV0dXJuIHAucyYmdC5zP3AuZD90LnM9LXQuczp0PW5ldyBkKHQuZHx8cC5zIT09dC5zP3A6TmFOKTp0PW5ldyBkKE5hTiksdDtpZihwLnMhPXQucylyZXR1cm4gdC5zPS10LnMscC5wbHVzKHQpO2lmKGM9cC5kLGY9dC5kLGE9ZC5wcmVjaXNpb24sdT1kLnJvdW5kaW5nLCFjWzBdfHwhZlswXSl7aWYoZlswXSl0LnM9LXQucztlbHNle2lmKCFjWzBdKXJldHVybiBuZXcgZCgzPT09dT8tMDowKTt0PW5ldyBkKHApfXJldHVybiBBZD9IZCh0LGEsdSk6dH1pZihuPU9kKHQuZS83KSxsPU9kKHAuZS83KSxjPWMuc2xpY2UoKSxvPWwtbil7Zm9yKChoPW88MCk/KGU9YyxvPS1vLHM9Zi5sZW5ndGgpOihlPWYsbj1sLHM9Yy5sZW5ndGgpLG8+KHI9TWF0aC5tYXgoTWF0aC5jZWlsKGEvNykscykrMikmJihvPXIsZS5sZW5ndGg9MSksZS5yZXZlcnNlKCkscj1vO3ItLTspZS5wdXNoKDApO2UucmV2ZXJzZSgpfWVsc2V7Zm9yKChoPShyPWMubGVuZ3RoKTwocz1mLmxlbmd0aCkpJiYocz1yKSxyPTA7cjxzO3IrKylpZihjW3JdIT1mW3JdKXtoPWNbcl08ZltyXTticmVha31vPTB9Zm9yKGgmJihlPWMsYz1mLGY9ZSx0LnM9LXQucykscz1jLmxlbmd0aCxyPWYubGVuZ3RoLXM7cj4wOy0tciljW3MrK109MDtmb3Iocj1mLmxlbmd0aDtyPm87KXtpZihjWy0tcl08ZltyXSl7Zm9yKGk9cjtpJiYwPT09Y1stLWldOyljW2ldPXpkLTE7LS1jW2ldLGNbcl0rPXpkfWNbcl0tPWZbcl19Zm9yKDswPT09Y1stLXNdOyljLnBvcCgpO2Zvcig7MD09PWNbMF07Yy5zaGlmdCgpKS0tbjtyZXR1cm4gY1swXT8odC5kPWMsdC5lPUtkKGMsbiksQWQ/SGQodCxhLHUpOnQpOm5ldyBkKDM9PT11Py0wOjApfSxxZC5tb2R1bG89cWQubW9kPWZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcyxyPW4uY29uc3RydWN0b3I7cmV0dXJuIHQ9bmV3IHIodCksIW4uZHx8IXQuc3x8dC5kJiYhdC5kWzBdP25ldyByKE5hTik6IXQuZHx8bi5kJiYhbi5kWzBdP0hkKG5ldyByKG4pLHIucHJlY2lzaW9uLHIucm91bmRpbmcpOihBZD0hMSw5PT1yLm1vZHVsbz8oZT1XZChuLHQuYWJzKCksMCwzLDEpKS5zKj10LnM6ZT1XZChuLHQsMCxyLm1vZHVsbywxKSxlPWUudGltZXModCksQWQ9ITAsbi5taW51cyhlKSl9LHFkLm5hdHVyYWxFeHBvbmVudGlhbD1xZC5leHA9ZnVuY3Rpb24oKXtyZXR1cm4gaWcodGhpcyl9LHFkLm5hdHVyYWxMb2dhcml0aG09cWQubG49ZnVuY3Rpb24oKXtyZXR1cm4gb2codGhpcyl9LHFkLm5lZ2F0ZWQ9cWQubmVnPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyk7cmV0dXJuIHQucz0tdC5zLEhkKHQpfSxxZC5wbHVzPXFkLmFkZD1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYSx1LGMsbCxoPXRoaXMsZj1oLmNvbnN0cnVjdG9yO2lmKHQ9bmV3IGYodCksIWguZHx8IXQuZClyZXR1cm4gaC5zJiZ0LnM/aC5kfHwodD1uZXcgZih0LmR8fGgucz09PXQucz9oOk5hTikpOnQ9bmV3IGYoTmFOKSx0O2lmKGgucyE9dC5zKXJldHVybiB0LnM9LXQucyxoLm1pbnVzKHQpO2lmKGM9aC5kLGw9dC5kLGE9Zi5wcmVjaXNpb24sdT1mLnJvdW5kaW5nLCFjWzBdfHwhbFswXSlyZXR1cm4gbFswXXx8KHQ9bmV3IGYoaCkpLEFkP0hkKHQsYSx1KTp0O2lmKG89T2QoaC5lLzcpLHI9T2QodC5lLzcpLGM9Yy5zbGljZSgpLGk9by1yKXtmb3IoaTwwPyhuPWMsaT0taSxzPWwubGVuZ3RoKToobj1sLHI9byxzPWMubGVuZ3RoKSxpPihzPShvPU1hdGguY2VpbChhLzcpKT5zP28rMTpzKzEpJiYoaT1zLG4ubGVuZ3RoPTEpLG4ucmV2ZXJzZSgpO2ktLTspbi5wdXNoKDApO24ucmV2ZXJzZSgpfWZvcigocz1jLmxlbmd0aCktKGk9bC5sZW5ndGgpPDAmJihpPXMsbj1sLGw9YyxjPW4pLGU9MDtpOyllPShjWy0taV09Y1tpXStsW2ldK2UpL3pkfDAsY1tpXSU9emQ7Zm9yKGUmJihjLnVuc2hpZnQoZSksKytyKSxzPWMubGVuZ3RoOzA9PWNbLS1zXTspYy5wb3AoKTtyZXR1cm4gdC5kPWMsdC5lPUtkKGMsciksQWQ/SGQodCxhLHUpOnR9LHFkLnByZWNpc2lvbj1xZC5zZD1mdW5jdGlvbih0KXt2YXIgZSxuPXRoaXM7aWYodm9pZCAwIT09dCYmdCE9PSEhdCYmMSE9PXQmJjAhPT10KXRocm93IEVycm9yKElkK3QpO3JldHVybiBuLmQ/KGU9JGQobi5kKSx0JiZuLmUrMT5lJiYoZT1uLmUrMSkpOmU9TmFOLGV9LHFkLnJvdW5kPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQuY29uc3RydWN0b3I7cmV0dXJuIEhkKG5ldyBlKHQpLHQuZSsxLGUucm91bmRpbmcpfSxxZC5zaW5lPXFkLnNpbj1mdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtyZXR1cm4gbi5pc0Zpbml0ZSgpP24uaXNaZXJvKCk/bmV3IHIobik6KHQ9ci5wcmVjaXNpb24sZT1yLnJvdW5kaW5nLHIucHJlY2lzaW9uPXQrTWF0aC5tYXgobi5lLG4uc2QoKSkrNyxyLnJvdW5kaW5nPTEsbj1mdW5jdGlvbih0LGUpe3ZhciBuLHI9ZS5kLmxlbmd0aDtpZihyPDMpcmV0dXJuIGUuaXNaZXJvKCk/ZTp1Zyh0LDIsZSxlKTtuPTEuNCpNYXRoLnNxcnQociksbj1uPjE2PzE2OjB8bixlPWUudGltZXMoMS9jZyg1LG4pKSxlPXVnKHQsMixlLGUpO2Zvcih2YXIgaSxvPW5ldyB0KDUpLHM9bmV3IHQoMTYpLGE9bmV3IHQoMjApO24tLTspaT1lLnRpbWVzKGUpLGU9ZS50aW1lcyhvLnBsdXMoaS50aW1lcyhzLnRpbWVzKGkpLm1pbnVzKGEpKSkpO3JldHVybiBlfShyLGxnKHIsbikpLHIucHJlY2lzaW9uPXQsci5yb3VuZGluZz1lLEhkKHhkPjI/bi5uZWcoKTpuLHQsZSwhMCkpOm5ldyByKE5hTil9LHFkLnNxdWFyZVJvb3Q9cWQuc3FydD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGksbyxzPXRoaXMsYT1zLmQsdT1zLmUsYz1zLnMsbD1zLmNvbnN0cnVjdG9yO2lmKDEhPT1jfHwhYXx8IWFbMF0pcmV0dXJuIG5ldyBsKCFjfHxjPDAmJighYXx8YVswXSk/TmFOOmE/czoxLzApO2ZvcihBZD0hMSwwPT0oYz1NYXRoLnNxcnQoK3MpKXx8Yz09MS8wPygoKGU9VmQoYSkpLmxlbmd0aCt1KSUyPT0wJiYoZSs9IjAiKSxjPU1hdGguc3FydChlKSx1PU9kKCh1KzEpLzIpLSh1PDB8fHUlMiksYz09MS8wP2U9IjVlIit1OmU9KGU9Yy50b0V4cG9uZW50aWFsKCkpLnNsaWNlKDAsZS5pbmRleE9mKCJlIikrMSkrdSxyPW5ldyBsKGUpKTpyPW5ldyBsKGMudG9TdHJpbmcoKSksbj0odT1sLnByZWNpc2lvbikrMzs7KWlmKHI9KG89cikucGx1cyhXZChzLG8sbisyLDEpKS50aW1lcyguNSksVmQoby5kKS5zbGljZSgwLG4pPT09KGU9VmQoci5kKSkuc2xpY2UoMCxuKSl7aWYoIjk5OTkiIT0oZT1lLnNsaWNlKG4tMyxuKzEpKSYmKGl8fCI0OTk5IiE9ZSkpeyghK2V8fCErZS5zbGljZSgxKSYmIjUiPT1lLmNoYXJBdCgwKSkmJihIZChyLHUrMSwxKSx0PSFyLnRpbWVzKHIpLmVxKHMpKTticmVha31pZighaSYmKEhkKG8sdSsxLDApLG8udGltZXMobykuZXEocykpKXtyPW87YnJlYWt9bis9NCxpPTF9cmV0dXJuIEFkPSEwLEhkKHIsdSxsLnJvdW5kaW5nLHQpfSxxZC50YW5nZW50PXFkLnRhbj1mdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtyZXR1cm4gbi5pc0Zpbml0ZSgpP24uaXNaZXJvKCk/bmV3IHIobik6KHQ9ci5wcmVjaXNpb24sZT1yLnJvdW5kaW5nLHIucHJlY2lzaW9uPXQrMTAsci5yb3VuZGluZz0xLChuPW4uc2luKCkpLnM9MSxuPVdkKG4sbmV3IHIoMSkubWludXMobi50aW1lcyhuKSkuc3FydCgpLHQrMTAsMCksci5wcmVjaXNpb249dCxyLnJvdW5kaW5nPWUsSGQoMj09eGR8fDQ9PXhkP24ubmVnKCk6bix0LGUsITApKTpuZXcgcihOYU4pfSxxZC50aW1lcz1xZC5tdWw9ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxzLGEsdSxjLGw9dGhpcyxoPWwuY29uc3RydWN0b3IsZj1sLmQscD0odD1uZXcgaCh0KSkuZDtpZih0LnMqPWwucywhKGYmJmZbMF0mJnAmJnBbMF0pKXJldHVybiBuZXcgaCghdC5zfHxmJiYhZlswXSYmIXB8fHAmJiFwWzBdJiYhZj9OYU46ZiYmcD8wKnQuczp0LnMvMCk7Zm9yKG49T2QobC5lLzcpK09kKHQuZS83KSwodT1mLmxlbmd0aCk8KGM9cC5sZW5ndGgpJiYobz1mLGY9cCxwPW8scz11LHU9YyxjPXMpLG89W10scj1zPXUrYztyLS07KW8ucHVzaCgwKTtmb3Iocj1jOy0tcj49MDspe2ZvcihlPTAsaT11K3I7aT5yOylhPW9baV0rcFtyXSpmW2ktci0xXStlLG9baS0tXT1hJXpkfDAsZT1hL3pkfDA7b1tpXT0ob1tpXStlKSV6ZHwwfWZvcig7IW9bLS1zXTspby5wb3AoKTtyZXR1cm4gZT8rK246by5zaGlmdCgpLHQuZD1vLHQuZT1LZChvLG4pLEFkP0hkKHQsaC5wcmVjaXNpb24saC5yb3VuZGluZyk6dH0scWQudG9CaW5hcnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaGcodGhpcywyLHQsZSl9LHFkLnRvRGVjaW1hbFBsYWNlcz1xZC50b0RQPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPW4uY29uc3RydWN0b3I7cmV0dXJuIG49bmV3IHIobiksdm9pZCAwPT09dD9uOihHZCh0LDAsYmQpLHZvaWQgMD09PWU/ZT1yLnJvdW5kaW5nOkdkKGUsMCw4KSxIZChuLHQrbi5lKzEsZSkpfSxxZC50b0V4cG9uZW50aWFsPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj10aGlzLGk9ci5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09dD9uPVpkKHIsITApOihHZCh0LDAsYmQpLHZvaWQgMD09PWU/ZT1pLnJvdW5kaW5nOkdkKGUsMCw4KSxuPVpkKHI9SGQobmV3IGkociksdCsxLGUpLCEwLHQrMSkpLHIuaXNOZWcoKSYmIXIuaXNaZXJvKCk/Ii0iK246bn0scWQudG9GaXhlZD1mdW5jdGlvbih0LGUpe3ZhciBuLHIsaT10aGlzLG89aS5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09dD9uPVpkKGkpOihHZCh0LDAsYmQpLHZvaWQgMD09PWU/ZT1vLnJvdW5kaW5nOkdkKGUsMCw4KSxuPVpkKHI9SGQobmV3IG8oaSksdCtpLmUrMSxlKSwhMSx0K3IuZSsxKSksaS5pc05lZygpJiYhaS5pc1plcm8oKT8iLSIrbjpufSxxZC50b0ZyYWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8scyxhLHUsYyxsLGgsZixwPXRoaXMsZD1wLmQsZz1wLmNvbnN0cnVjdG9yO2lmKCFkKXJldHVybiBuZXcgZyhwKTtpZihjPW49bmV3IGcoMSkscj11PW5ldyBnKDApLHM9KG89KGU9bmV3IGcocikpLmU9JGQoZCktcC5lLTEpJTcsZS5kWzBdPUxkKDEwLHM8MD83K3M6cyksbnVsbD09dCl0PW8+MD9lOmM7ZWxzZXtpZighKGE9bmV3IGcodCkpLmlzSW50KCl8fGEubHQoYykpdGhyb3cgRXJyb3IoSWQrYSk7dD1hLmd0KGUpP28+MD9lOmM6YX1mb3IoQWQ9ITEsYT1uZXcgZyhWZChkKSksbD1nLnByZWNpc2lvbixnLnByZWNpc2lvbj1vPTcqZC5sZW5ndGgqMjtoPVdkKGEsZSwwLDEsMSksMSE9KGk9bi5wbHVzKGgudGltZXMocikpKS5jbXAodCk7KW49cixyPWksaT1jLGM9dS5wbHVzKGgudGltZXMoaSkpLHU9aSxpPWUsZT1hLm1pbnVzKGgudGltZXMoaSkpLGE9aTtyZXR1cm4gaT1XZCh0Lm1pbnVzKG4pLHIsMCwxLDEpLHU9dS5wbHVzKGkudGltZXMoYykpLG49bi5wbHVzKGkudGltZXMocikpLHUucz1jLnM9cC5zLGY9V2QoYyxyLG8sMSkubWludXMocCkuYWJzKCkuY21wKFdkKHUsbixvLDEpLm1pbnVzKHApLmFicygpKTwxP1tjLHJdOlt1LG5dLGcucHJlY2lzaW9uPWwsQWQ9ITAsZn0scWQudG9IZXhhZGVjaW1hbD1xZC50b0hleD1mdW5jdGlvbih0LGUpe3JldHVybiBoZyh0aGlzLDE2LHQsZSl9LHFkLnRvTmVhcmVzdD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1uLmNvbnN0cnVjdG9yO2lmKG49bmV3IHIobiksbnVsbD09dCl7aWYoIW4uZClyZXR1cm4gbjt0PW5ldyByKDEpLGU9ci5yb3VuZGluZ31lbHNle2lmKHQ9bmV3IHIodCksdm9pZCAwPT09ZT9lPXIucm91bmRpbmc6R2QoZSwwLDgpLCFuLmQpcmV0dXJuIHQucz9uOnQ7aWYoIXQuZClyZXR1cm4gdC5zJiYodC5zPW4ucyksdH1yZXR1cm4gdC5kWzBdPyhBZD0hMSxuPVdkKG4sdCwwLGUsMSkudGltZXModCksQWQ9ITAsSGQobikpOih0LnM9bi5zLG49dCksbn0scWQudG9OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4rdGhpc30scWQudG9PY3RhbD1mdW5jdGlvbih0LGUpe3JldHVybiBoZyh0aGlzLDgsdCxlKX0scWQudG9Qb3dlcj1xZC5wb3c9ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxzLGE9dGhpcyx1PWEuY29uc3RydWN0b3IsYz0rKHQ9bmV3IHUodCkpO2lmKCEoYS5kJiZ0LmQmJmEuZFswXSYmdC5kWzBdKSlyZXR1cm4gbmV3IHUoTGQoK2EsYykpO2lmKChhPW5ldyB1KGEpKS5lcSgxKSlyZXR1cm4gYTtpZihyPXUucHJlY2lzaW9uLG89dS5yb3VuZGluZyx0LmVxKDEpKXJldHVybiBIZChhLHIsbyk7aWYoKGU9T2QodC5lLzcpKT49dC5kLmxlbmd0aC0xJiYobj1jPDA/LWM6Yyk8PTkwMDcxOTkyNTQ3NDA5OTEpcmV0dXJuIGk9ZWcodSxhLG4sciksdC5zPDA/bmV3IHUoMSkuZGl2KGkpOkhkKGkscixvKTtpZigocz1hLnMpPDApe2lmKGU8dC5kLmxlbmd0aC0xKXJldHVybiBuZXcgdShOYU4pO2lmKCEoMSZ0LmRbZV0pJiYocz0xKSwwPT1hLmUmJjE9PWEuZFswXSYmMT09YS5kLmxlbmd0aClyZXR1cm4gYS5zPXMsYX1yZXR1cm4oZT0wIT0obj1MZCgrYSxjKSkmJmlzRmluaXRlKG4pP25ldyB1KG4rIiIpLmU6T2QoYyooTWF0aC5sb2coIjAuIitWZChhLmQpKS9NYXRoLkxOMTArYS5lKzEpKSk+dS5tYXhFKzF8fGU8dS5taW5FLTE/bmV3IHUoZT4wP3MvMDowKTooQWQ9ITEsdS5yb3VuZGluZz1hLnM9MSxuPU1hdGgubWluKDEyLChlKyIiKS5sZW5ndGgpLChpPWlnKHQudGltZXMob2coYSxyK24pKSxyKSkuZCYmKFlkKChpPUhkKGkscis1LDEpKS5kLHIsbykmJihlPXIrMTAsK1ZkKChpPUhkKGlnKHQudGltZXMob2coYSxlK24pKSxlKSxlKzUsMSkpLmQpLnNsaWNlKHIrMSxyKzE1KSsxPT0xZTE0JiYoaT1IZChpLHIrMSwwKSkpKSxpLnM9cyxBZD0hMCx1LnJvdW5kaW5nPW8sSGQoaSxyLG8pKX0scWQudG9QcmVjaXNpb249ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXMsaT1yLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT10P249WmQocixyLmU8PWkudG9FeHBOZWd8fHIuZT49aS50b0V4cFBvcyk6KEdkKHQsMSxiZCksdm9pZCAwPT09ZT9lPWkucm91bmRpbmc6R2QoZSwwLDgpLG49WmQocj1IZChuZXcgaShyKSx0LGUpLHQ8PXIuZXx8ci5lPD1pLnRvRXhwTmVnLHQpKSxyLmlzTmVnKCkmJiFyLmlzWmVybygpPyItIituOm59LHFkLnRvU2lnbmlmaWNhbnREaWdpdHM9cWQudG9TRD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHZvaWQgMD09PXQ/KHQ9bi5wcmVjaXNpb24sZT1uLnJvdW5kaW5nKTooR2QodCwxLGJkKSx2b2lkIDA9PT1lP2U9bi5yb3VuZGluZzpHZChlLDAsOCkpLEhkKG5ldyBuKHRoaXMpLHQsZSl9LHFkLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQuY29uc3RydWN0b3Isbj1aZCh0LHQuZTw9ZS50b0V4cE5lZ3x8dC5lPj1lLnRvRXhwUG9zKTtyZXR1cm4gdC5pc05lZygpJiYhdC5pc1plcm8oKT8iLSIrbjpufSxxZC50cnVuY2F0ZWQ9cWQudHJ1bmM9ZnVuY3Rpb24oKXtyZXR1cm4gSGQobmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyksdGhpcy5lKzEsMSl9LHFkLnZhbHVlT2Y9cWQudG9KU09OPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQuY29uc3RydWN0b3Isbj1aZCh0LHQuZTw9ZS50b0V4cE5lZ3x8dC5lPj1lLnRvRXhwUG9zKTtyZXR1cm4gdC5pc05lZygpPyItIituOm59O3ZhciBXZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3ZhciByLGk9MCxvPXQubGVuZ3RoO2Zvcih0PXQuc2xpY2UoKTtvLS07KXI9dFtvXSplK2ksdFtvXT1yJW58MCxpPXIvbnwwO3JldHVybiBpJiZ0LnVuc2hpZnQoaSksdH1mdW5jdGlvbiBlKHQsZSxuLHIpe3ZhciBpLG87aWYobiE9cilvPW4+cj8xOi0xO2Vsc2UgZm9yKGk9bz0wO2k8bjtpKyspaWYodFtpXSE9ZVtpXSl7bz10W2ldPmVbaV0/MTotMTticmVha31yZXR1cm4gb31mdW5jdGlvbiBuKHQsZSxuLHIpe2Zvcih2YXIgaT0wO24tLTspdFtuXS09aSxpPXRbbl08ZVtuXT8xOjAsdFtuXT1pKnIrdFtuXS1lW25dO2Zvcig7IXRbMF0mJnQubGVuZ3RoPjE7KXQuc2hpZnQoKX1yZXR1cm4gZnVuY3Rpb24ocixpLG8scyxhLHUpe3ZhciBjLGwsaCxmLHAsZCxnLHksbSx2LF8seCx3LGIsRCxFLEMsUyxBLE4sST1yLmNvbnN0cnVjdG9yLE09ci5zPT1pLnM/MTotMSxGPXIuZCxUPWkuZDtpZighKEYmJkZbMF0mJlQmJlRbMF0pKXJldHVybiBuZXcgSShyLnMmJmkucyYmKEY/IVR8fEZbMF0hPVRbMF06VCk/RiYmMD09RlswXXx8IVQ/MCpNOk0vMDpOYU4pO2Zvcih1PyhwPTEsbD1yLmUtaS5lKToodT16ZCxwPTcsbD1PZChyLmUvcCktT2QoaS5lL3ApKSxBPVQubGVuZ3RoLEM9Ri5sZW5ndGgsdj0obT1uZXcgSShNKSkuZD1bXSxoPTA7VFtoXT09KEZbaF18fDApO2grKyk7aWYoVFtoXT4oRltoXXx8MCkmJmwtLSxudWxsPT1vPyhiPW89SS5wcmVjaXNpb24scz1JLnJvdW5kaW5nKTpiPWE/bysoci5lLWkuZSkrMTpvLGI8MCl2LnB1c2goMSksZD0hMDtlbHNle2lmKGI9Yi9wKzJ8MCxoPTAsMT09QSl7Zm9yKGY9MCxUPVRbMF0sYisrOyhoPEN8fGYpJiZiLS07aCsrKUQ9Zip1KyhGW2hdfHwwKSx2W2hdPUQvVHwwLGY9RCVUfDA7ZD1mfHxoPEN9ZWxzZXtmb3IoKGY9dS8oVFswXSsxKXwwKT4xJiYoVD10KFQsZix1KSxGPXQoRixmLHUpLEE9VC5sZW5ndGgsQz1GLmxlbmd0aCksRT1BLHg9KF89Ri5zbGljZSgwLEEpKS5sZW5ndGg7eDxBOylfW3grK109MDsoTj1ULnNsaWNlKCkpLnVuc2hpZnQoMCksUz1UWzBdLFRbMV0+PXUvMiYmKytTO2Rve2Y9MCwoYz1lKFQsXyxBLHgpKTwwPyh3PV9bMF0sQSE9eCYmKHc9dyp1KyhfWzFdfHwwKSksKGY9dy9TfDApPjE/KGY+PXUmJihmPXUtMSksMT09KGM9ZShnPXQoVCxmLHUpLF8seT1nLmxlbmd0aCx4PV8ubGVuZ3RoKSkmJihmLS0sbihnLEE8eT9OOlQseSx1KSkpOigwPT1mJiYoYz1mPTEpLGc9VC5zbGljZSgpKSwoeT1nLmxlbmd0aCk8eCYmZy51bnNoaWZ0KDApLG4oXyxnLHgsdSksLTE9PWMmJigoYz1lKFQsXyxBLHg9Xy5sZW5ndGgpKTwxJiYoZisrLG4oXyxBPHg/TjpULHgsdSkpKSx4PV8ubGVuZ3RoKTowPT09YyYmKGYrKyxfPVswXSksdltoKytdPWYsYyYmX1swXT9fW3grK109RltFXXx8MDooXz1bRltFXV0seD0xKX13aGlsZSgoRSsrPEN8fHZvaWQgMCE9PV9bMF0pJiZiLS0pO2Q9dm9pZCAwIT09X1swXX12WzBdfHx2LnNoaWZ0KCl9aWYoMT09cCltLmU9bCxfZD1kO2Vsc2V7Zm9yKGg9MSxmPXZbMF07Zj49MTA7Zi89MTApaCsrO20uZT1oK2wqcC0xLEhkKG0sYT9vK20uZSsxOm8scyxkKX1yZXR1cm4gbX19KCk7ZnVuY3Rpb24gSGQodCxlLG4scil7dmFyIGksbyxzLGEsdSxjLGwsaCxmLHA9dC5jb25zdHJ1Y3Rvcjt0OmlmKG51bGwhPWUpe2lmKCEoaD10LmQpKXJldHVybiB0O2ZvcihpPTEsYT1oWzBdO2E+PTEwO2EvPTEwKWkrKztpZigobz1lLWkpPDApbys9NyxzPWUsdT0obD1oW2Y9MF0pL0xkKDEwLGktcy0xKSUxMHwwO2Vsc2UgaWYoKGY9TWF0aC5jZWlsKChvKzEpLzcpKT49KGE9aC5sZW5ndGgpKXtpZighcilicmVhayB0O2Zvcig7YSsrPD1mOyloLnB1c2goMCk7bD11PTAsaT0xLHM9KG8lPTcpLTcrMX1lbHNle2ZvcihsPWE9aFtmXSxpPTE7YT49MTA7YS89MTApaSsrO3U9KHM9KG8lPTcpLTcraSk8MD8wOmwvTGQoMTAsaS1zLTEpJTEwfDB9aWYocj1yfHxlPDB8fHZvaWQgMCE9PWhbZisxXXx8KHM8MD9sOmwlTGQoMTAsaS1zLTEpKSxjPW48ND8odXx8cikmJigwPT1ufHxuPT0odC5zPDA/MzoyKSk6dT41fHw1PT11JiYoND09bnx8cnx8Nj09biYmKG8+MD9zPjA/bC9MZCgxMCxpLXMpOjA6aFtmLTFdKSUxMCYxfHxuPT0odC5zPDA/ODo3KSksZTwxfHwhaFswXSlyZXR1cm4gaC5sZW5ndGg9MCxjPyhlLT10LmUrMSxoWzBdPUxkKDEwLCg3LWUlNyklNyksdC5lPS1lfHwwKTpoWzBdPXQuZT0wLHQ7aWYoMD09bz8oaC5sZW5ndGg9ZixhPTEsZi0tKTooaC5sZW5ndGg9ZisxLGE9TGQoMTAsNy1vKSxoW2ZdPXM+MD8obC9MZCgxMCxpLXMpJUxkKDEwLHMpfDApKmE6MCksYylmb3IoOzspe2lmKDA9PWYpe2ZvcihvPTEscz1oWzBdO3M+PTEwO3MvPTEwKW8rKztmb3Iocz1oWzBdKz1hLGE9MTtzPj0xMDtzLz0xMClhKys7byE9YSYmKHQuZSsrLGhbMF09PXpkJiYoaFswXT0xKSk7YnJlYWt9aWYoaFtmXSs9YSxoW2ZdIT16ZClicmVhaztoW2YtLV09MCxhPTF9Zm9yKG89aC5sZW5ndGg7MD09PWhbLS1vXTspaC5wb3AoKX1yZXR1cm4gQWQmJih0LmU+cC5tYXhFPyh0LmQ9bnVsbCx0LmU9TmFOKTp0LmU8cC5taW5FJiYodC5lPTAsdC5kPVswXSkpLHR9ZnVuY3Rpb24gWmQodCxlLG4pe2lmKCF0LmlzRmluaXRlKCkpcmV0dXJuIHNnKHQpO3ZhciByLGk9dC5lLG89VmQodC5kKSxzPW8ubGVuZ3RoO3JldHVybiBlPyhuJiYocj1uLXMpPjA/bz1vLmNoYXJBdCgwKSsiLiIrby5zbGljZSgxKSt0ZyhyKTpzPjEmJihvPW8uY2hhckF0KDApKyIuIitvLnNsaWNlKDEpKSxvPW8rKHQuZTwwPyJlIjoiZSsiKSt0LmUpOmk8MD8obz0iMC4iK3RnKC1pLTEpK28sbiYmKHI9bi1zKT4wJiYobys9dGcocikpKTppPj1zPyhvKz10ZyhpKzEtcyksbiYmKHI9bi1pLTEpPjAmJihvPW8rIi4iK3RnKHIpKSk6KChyPWkrMSk8cyYmKG89by5zbGljZSgwLHIpKyIuIitvLnNsaWNlKHIpKSxuJiYocj1uLXMpPjAmJihpKzE9PT1zJiYobys9Ii4iKSxvKz10ZyhyKSkpLG99ZnVuY3Rpb24gS2QodCxlKXt2YXIgbj10WzBdO2ZvcihlKj03O24+PTEwO24vPTEwKWUrKztyZXR1cm4gZX1mdW5jdGlvbiBKZCh0LGUsbil7aWYoZT5qZCl0aHJvdyBBZD0hMCxuJiYodC5wcmVjaXNpb249biksRXJyb3IoTWQpO3JldHVybiBIZChuZXcgdChFZCksZSwxLCEwKX1mdW5jdGlvbiBRZCh0LGUsbil7aWYoZT5VZCl0aHJvdyBFcnJvcihNZCk7cmV0dXJuIEhkKG5ldyB0KENkKSxlLG4sITApfWZ1bmN0aW9uICRkKHQpe3ZhciBlPXQubGVuZ3RoLTEsbj03KmUrMTtpZihlPXRbZV0pe2Zvcig7ZSUxMD09MDtlLz0xMCluLS07Zm9yKGU9dFswXTtlPj0xMDtlLz0xMCluKyt9cmV0dXJuIG59ZnVuY3Rpb24gdGcodCl7Zm9yKHZhciBlPSIiO3QtLTspZSs9IjAiO3JldHVybiBlfWZ1bmN0aW9uIGVnKHQsZSxuLHIpe3ZhciBpLG89bmV3IHQoMSkscz1NYXRoLmNlaWwoci83KzQpO2ZvcihBZD0hMTs7KXtpZihuJTImJihmZygobz1vLnRpbWVzKGUpKS5kLHMpJiYoaT0hMCkpLDA9PT0obj1PZChuLzIpKSl7bj1vLmQubGVuZ3RoLTEsaSYmMD09PW8uZFtuXSYmKytvLmRbbl07YnJlYWt9ZmcoKGU9ZS50aW1lcyhlKSkuZCxzKX1yZXR1cm4gQWQ9ITAsb31mdW5jdGlvbiBuZyh0KXtyZXR1cm4gMSZ0LmRbdC5kLmxlbmd0aC0xXX1mdW5jdGlvbiByZyh0LGUsbil7Zm9yKHZhciByLGk9bmV3IHQoZVswXSksbz0wOysrbzxlLmxlbmd0aDspe2lmKCEocj1uZXcgdChlW29dKSkucyl7aT1yO2JyZWFrfWlbbl0ocikmJihpPXIpfXJldHVybiBpfWZ1bmN0aW9uIGlnKHQsZSl7dmFyIG4scixpLG8scyxhLHUsYz0wLGw9MCxoPTAsZj10LmNvbnN0cnVjdG9yLHA9Zi5yb3VuZGluZyxkPWYucHJlY2lzaW9uO2lmKCF0LmR8fCF0LmRbMF18fHQuZT4xNylyZXR1cm4gbmV3IGYodC5kP3QuZFswXT90LnM8MD8wOjEvMDoxOnQucz90LnM8MD8wOnQ6TmFOKTtmb3IobnVsbD09ZT8oQWQ9ITEsdT1kKTp1PWUsYT1uZXcgZiguMDMxMjUpO3QuZT4tMjspdD10LnRpbWVzKGEpLGgrPTU7Zm9yKHUrPXI9TWF0aC5sb2coTGQoMixoKSkvTWF0aC5MTjEwKjIrNXwwLG49bz1zPW5ldyBmKDEpLGYucHJlY2lzaW9uPXU7Oyl7aWYobz1IZChvLnRpbWVzKHQpLHUsMSksbj1uLnRpbWVzKCsrbCksVmQoKGE9cy5wbHVzKFdkKG8sbix1LDEpKSkuZCkuc2xpY2UoMCx1KT09PVZkKHMuZCkuc2xpY2UoMCx1KSl7Zm9yKGk9aDtpLS07KXM9SGQocy50aW1lcyhzKSx1LDEpO2lmKG51bGwhPWUpcmV0dXJuIGYucHJlY2lzaW9uPWQscztpZighKGM8MyYmWWQocy5kLHUtcixwLGMpKSlyZXR1cm4gSGQocyxmLnByZWNpc2lvbj1kLHAsQWQ9ITApO2YucHJlY2lzaW9uPXUrPTEwLG49bz1hPW5ldyBmKDEpLGw9MCxjKyt9cz1hfX1mdW5jdGlvbiBvZyh0LGUpe3ZhciBuLHIsaSxvLHMsYSx1LGMsbCxoLGYscD0xLGQ9dCxnPWQuZCx5PWQuY29uc3RydWN0b3IsbT15LnJvdW5kaW5nLHY9eS5wcmVjaXNpb247aWYoZC5zPDB8fCFnfHwhZ1swXXx8IWQuZSYmMT09Z1swXSYmMT09Zy5sZW5ndGgpcmV0dXJuIG5ldyB5KGcmJiFnWzBdPy0xLzA6MSE9ZC5zP05hTjpnPzA6ZCk7aWYobnVsbD09ZT8oQWQ9ITEsbD12KTpsPWUseS5wcmVjaXNpb249bCs9MTAscj0obj1WZChnKSkuY2hhckF0KDApLCEoTWF0aC5hYnMobz1kLmUpPDE1ZTE0KSlyZXR1cm4gYz1KZCh5LGwrMix2KS50aW1lcyhvKyIiKSxkPW9nKG5ldyB5KHIrIi4iK24uc2xpY2UoMSkpLGwtMTApLnBsdXMoYykseS5wcmVjaXNpb249dixudWxsPT1lP0hkKGQsdixtLEFkPSEwKTpkO2Zvcig7cjw3JiYxIT1yfHwxPT1yJiZuLmNoYXJBdCgxKT4zOylyPShuPVZkKChkPWQudGltZXModCkpLmQpKS5jaGFyQXQoMCkscCsrO2ZvcihvPWQuZSxyPjE/KGQ9bmV3IHkoIjAuIituKSxvKyspOmQ9bmV3IHkocisiLiIrbi5zbGljZSgxKSksaD1kLHU9cz1kPVdkKGQubWludXMoMSksZC5wbHVzKDEpLGwsMSksZj1IZChkLnRpbWVzKGQpLGwsMSksaT0zOzspe2lmKHM9SGQocy50aW1lcyhmKSxsLDEpLFZkKChjPXUucGx1cyhXZChzLG5ldyB5KGkpLGwsMSkpKS5kKS5zbGljZSgwLGwpPT09VmQodS5kKS5zbGljZSgwLGwpKXtpZih1PXUudGltZXMoMiksMCE9PW8mJih1PXUucGx1cyhKZCh5LGwrMix2KS50aW1lcyhvKyIiKSkpLHU9V2QodSxuZXcgeShwKSxsLDEpLG51bGwhPWUpcmV0dXJuIHkucHJlY2lzaW9uPXYsdTtpZighWWQodS5kLGwtMTAsbSxhKSlyZXR1cm4gSGQodSx5LnByZWNpc2lvbj12LG0sQWQ9ITApO3kucHJlY2lzaW9uPWwrPTEwLGM9cz1kPVdkKGgubWludXMoMSksaC5wbHVzKDEpLGwsMSksZj1IZChkLnRpbWVzKGQpLGwsMSksaT1hPTF9dT1jLGkrPTJ9fWZ1bmN0aW9uIHNnKHQpe3JldHVybiBTdHJpbmcodC5zKnQucy8wKX1mdW5jdGlvbiBhZyh0LGUpe3ZhciBuLHIsaTtmb3IoKG49ZS5pbmRleE9mKCIuIikpPi0xJiYoZT1lLnJlcGxhY2UoIi4iLCIiKSksKHI9ZS5zZWFyY2goL2UvaSkpPjA/KG48MCYmKG49ciksbis9K2Uuc2xpY2UocisxKSxlPWUuc3Vic3RyaW5nKDAscikpOm48MCYmKG49ZS5sZW5ndGgpLHI9MDs0OD09PWUuY2hhckNvZGVBdChyKTtyKyspO2ZvcihpPWUubGVuZ3RoOzQ4PT09ZS5jaGFyQ29kZUF0KGktMSk7LS1pKTtpZihlPWUuc2xpY2UocixpKSl7aWYoaS09cix0LmU9bj1uLXItMSx0LmQ9W10scj0obisxKSU3LG48MCYmKHIrPTcpLHI8aSl7Zm9yKHImJnQuZC5wdXNoKCtlLnNsaWNlKDAscikpLGktPTc7cjxpOyl0LmQucHVzaCgrZS5zbGljZShyLHIrPTcpKTtyPTctKGU9ZS5zbGljZShyKSkubGVuZ3RofWVsc2Ugci09aTtmb3IoO3ItLTspZSs9IjAiO3QuZC5wdXNoKCtlKSxBZCYmKHQuZT50LmNvbnN0cnVjdG9yLm1heEU/KHQuZD1udWxsLHQuZT1OYU4pOnQuZTx0LmNvbnN0cnVjdG9yLm1pbkUmJih0LmU9MCx0LmQ9WzBdKSl9ZWxzZSB0LmU9MCx0LmQ9WzBdO3JldHVybiB0fWZ1bmN0aW9uIHVnKHQsZSxuLHIsaSl7dmFyIG8scyxhLHUsYz10LnByZWNpc2lvbixsPU1hdGguY2VpbChjLzcpO2ZvcihBZD0hMSx1PW4udGltZXMobiksYT1uZXcgdChyKTs7KXtpZihzPVdkKGEudGltZXModSksbmV3IHQoZSsrKmUrKyksYywxKSxhPWk/ci5wbHVzKHMpOnIubWludXMocykscj1XZChzLnRpbWVzKHUpLG5ldyB0KGUrKyplKyspLGMsMSksdm9pZCAwIT09KHM9YS5wbHVzKHIpKS5kW2xdKXtmb3Iobz1sO3MuZFtvXT09PWEuZFtvXSYmby0tOyk7aWYoLTE9PW8pYnJlYWt9bz1hLGE9cixyPXMscz1vfXJldHVybiBBZD0hMCxzLmQubGVuZ3RoPWwrMSxzfWZ1bmN0aW9uIGNnKHQsZSl7Zm9yKHZhciBuPXQ7LS1lOyluKj10O3JldHVybiBufWZ1bmN0aW9uIGxnKHQsZSl7dmFyIG4scj1lLnM8MCxpPVFkKHQsdC5wcmVjaXNpb24sMSksbz1pLnRpbWVzKC41KTtpZigoZT1lLmFicygpKS5sdGUobykpcmV0dXJuIHhkPXI/NDoxLGU7aWYoKG49ZS5kaXZUb0ludChpKSkuaXNaZXJvKCkpeGQ9cj8zOjI7ZWxzZXtpZigoZT1lLm1pbnVzKG4udGltZXMoaSkpKS5sdGUobykpcmV0dXJuIHhkPW5nKG4pP3I/MjozOnI/NDoxLGU7eGQ9bmcobik/cj8xOjQ6cj8zOjJ9cmV0dXJuIGUubWludXMoaSkuYWJzKCl9ZnVuY3Rpb24gaGcodCxlLG4scil7dmFyIGksbyxzLGEsdSxjLGwsaCxmLHA9dC5jb25zdHJ1Y3RvcixkPXZvaWQgMCE9PW47aWYoZD8oR2QobiwxLGJkKSx2b2lkIDA9PT1yP3I9cC5yb3VuZGluZzpHZChyLDAsOCkpOihuPXAucHJlY2lzaW9uLHI9cC5yb3VuZGluZyksdC5pc0Zpbml0ZSgpKXtmb3IoZD8oaT0yLDE2PT1lP249NCpuLTM6OD09ZSYmKG49MypuLTIpKTppPWUsKHM9KGw9WmQodCkpLmluZGV4T2YoIi4iKSk+PTAmJihsPWwucmVwbGFjZSgiLiIsIiIpLChmPW5ldyBwKDEpKS5lPWwubGVuZ3RoLXMsZi5kPVhkKFpkKGYpLDEwLGkpLGYuZT1mLmQubGVuZ3RoKSxvPXU9KGg9WGQobCwxMCxpKSkubGVuZ3RoOzA9PWhbLS11XTspaC5wb3AoKTtpZihoWzBdKXtpZihzPDA/by0tOigodD1uZXcgcCh0KSkuZD1oLHQuZT1vLGg9KHQ9V2QodCxmLG4sciwwLGkpKS5kLG89dC5lLGM9X2QpLHM9aFtuXSxhPWkvMixjPWN8fHZvaWQgMCE9PWhbbisxXSxjPXI8ND8odm9pZCAwIT09c3x8YykmJigwPT09cnx8cj09PSh0LnM8MD8zOjIpKTpzPmF8fHM9PT1hJiYoND09PXJ8fGN8fDY9PT1yJiYxJmhbbi0xXXx8cj09PSh0LnM8MD84OjcpKSxoLmxlbmd0aD1uLGMpZm9yKDsrK2hbLS1uXT5pLTE7KWhbbl09MCxufHwoKytvLGgudW5zaGlmdCgxKSk7Zm9yKHU9aC5sZW5ndGg7IWhbdS0xXTstLXUpO2ZvcihzPTAsbD0iIjtzPHU7cysrKWwrPURkLmNoYXJBdChoW3NdKTtpZihkKXtpZih1PjEpaWYoMTY9PWV8fDg9PWUpe2ZvcihzPTE2PT1lPzQ6MywtLXU7dSVzO3UrKylsKz0iMCI7Zm9yKHU9KGg9WGQobCxpLGUpKS5sZW5ndGg7IWhbdS0xXTstLXUpO2ZvcihzPTEsbD0iMS4iO3M8dTtzKyspbCs9RGQuY2hhckF0KGhbc10pfWVsc2UgbD1sLmNoYXJBdCgwKSsiLiIrbC5zbGljZSgxKTtsPWwrKG88MD8icCI6InArIikrb31lbHNlIGlmKG88MCl7Zm9yKDsrK287KWw9IjAiK2w7bD0iMC4iK2x9ZWxzZSBpZigrK28+dSlmb3Ioby09dTtvLS07KWwrPSIwIjtlbHNlIG88dSYmKGw9bC5zbGljZSgwLG8pKyIuIitsLnNsaWNlKG8pKX1lbHNlIGw9ZD8iMHArMCI6IjAiO2w9KDE2PT1lPyIweCI6Mj09ZT8iMGIiOjg9PWU/IjBvIjoiIikrbH1lbHNlIGw9c2codCk7cmV0dXJuIHQuczwwPyItIitsOmx9ZnVuY3Rpb24gZmcodCxlKXtpZih0Lmxlbmd0aD5lKXJldHVybiB0Lmxlbmd0aD1lLCEwfWZ1bmN0aW9uIHBnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5hYnMoKX1mdW5jdGlvbiBkZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuYWNvcygpfWZ1bmN0aW9uIGdnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5hY29zaCgpfWZ1bmN0aW9uIHlnKHQsZSl7cmV0dXJuIG5ldyB0aGlzKHQpLnBsdXMoZSl9ZnVuY3Rpb24gbWcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmFzaW4oKX1mdW5jdGlvbiB2Zyh0KXtyZXR1cm4gbmV3IHRoaXModCkuYXNpbmgoKX1mdW5jdGlvbiBfZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuYXRhbigpfWZ1bmN0aW9uIHhnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5hdGFuaCgpfWZ1bmN0aW9uIHdnKHQsZSl7dD1uZXcgdGhpcyh0KSxlPW5ldyB0aGlzKGUpO3ZhciBuLHI9dGhpcy5wcmVjaXNpb24saT10aGlzLnJvdW5kaW5nLG89cis0O3JldHVybiB0LnMmJmUucz90LmR8fGUuZD8hZS5kfHx0LmlzWmVybygpPyhuPWUuczwwP1FkKHRoaXMscixpKTpuZXcgdGhpcygwKSkucz10LnM6IXQuZHx8ZS5pc1plcm8oKT8obj1RZCh0aGlzLG8sMSkudGltZXMoLjUpKS5zPXQuczplLnM8MD8odGhpcy5wcmVjaXNpb249byx0aGlzLnJvdW5kaW5nPTEsbj10aGlzLmF0YW4oV2QodCxlLG8sMSkpLGU9UWQodGhpcyxvLDEpLHRoaXMucHJlY2lzaW9uPXIsdGhpcy5yb3VuZGluZz1pLG49dC5zPDA/bi5taW51cyhlKTpuLnBsdXMoZSkpOm49dGhpcy5hdGFuKFdkKHQsZSxvLDEpKToobj1RZCh0aGlzLG8sMSkudGltZXMoZS5zPjA/LjI1Oi43NSkpLnM9dC5zOm49bmV3IHRoaXMoTmFOKSxufWZ1bmN0aW9uIGJnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5jYnJ0KCl9ZnVuY3Rpb24gRGcodCl7cmV0dXJuIEhkKHQ9bmV3IHRoaXModCksdC5lKzEsMil9ZnVuY3Rpb24gRWcodCxlLG4pe3JldHVybiBuZXcgdGhpcyh0KS5jbGFtcChlLG4pfWZ1bmN0aW9uIENnKHQpe2lmKCF0fHwib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgRXJyb3IoTmQrIk9iamVjdCBleHBlY3RlZCIpO3ZhciBlLG4scixpPSEwPT09dC5kZWZhdWx0cyxvPVsicHJlY2lzaW9uIiwxLGJkLCJyb3VuZGluZyIsMCw4LCJ0b0V4cE5lZyIsLXdkLDAsInRvRXhwUG9zIiwwLHdkLCJtYXhFIiwwLHdkLCJtaW5FIiwtd2QsMCwibW9kdWxvIiwwLDldO2ZvcihlPTA7ZTxvLmxlbmd0aDtlKz0zKWlmKG49b1tlXSxpJiYodGhpc1tuXT1TZFtuXSksdm9pZCAwIT09KHI9dFtuXSkpe2lmKCEoT2Qocik9PT1yJiZyPj1vW2UrMV0mJnI8PW9bZSsyXSkpdGhyb3cgRXJyb3IoSWQrbisiOiAiK3IpO3RoaXNbbl09cn1pZihuPSJjcnlwdG8iLGkmJih0aGlzW25dPVNkW25dKSx2b2lkIDAhPT0ocj10W25dKSl7aWYoITAhPT1yJiYhMSE9PXImJjAhPT1yJiYxIT09cil0aHJvdyBFcnJvcihJZCtuKyI6ICIrcik7aWYocil7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBjcnlwdG98fCFjcnlwdG98fCFjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiYhY3J5cHRvLnJhbmRvbUJ5dGVzKXRocm93IEVycm9yKEZkKTt0aGlzW25dPSEwfWVsc2UgdGhpc1tuXT0hMX1yZXR1cm4gdGhpc31mdW5jdGlvbiBTZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuY29zKCl9ZnVuY3Rpb24gQWcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmNvc2goKX1mdW5jdGlvbiBOZyh0LGUpe3JldHVybiBuZXcgdGhpcyh0KS5kaXYoZSl9ZnVuY3Rpb24gSWcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmV4cCgpfWZ1bmN0aW9uIE1nKHQpe3JldHVybiBIZCh0PW5ldyB0aGlzKHQpLHQuZSsxLDMpfWZ1bmN0aW9uIEZnKCl7dmFyIHQsZSxuPW5ldyB0aGlzKDApO2ZvcihBZD0hMSx0PTA7dDxhcmd1bWVudHMubGVuZ3RoOylpZigoZT1uZXcgdGhpcyhhcmd1bWVudHNbdCsrXSkpLmQpbi5kJiYobj1uLnBsdXMoZS50aW1lcyhlKSkpO2Vsc2V7aWYoZS5zKXJldHVybiBBZD0hMCxuZXcgdGhpcygxLzApO249ZX1yZXR1cm4gQWQ9ITAsbi5zcXJ0KCl9ZnVuY3Rpb24gVGcodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiAkZ3x8dCYmdC50b1N0cmluZ1RhZz09PVRkfHwhMX1mdW5jdGlvbiBPZyh0KXtyZXR1cm4gbmV3IHRoaXModCkubG4oKX1mdW5jdGlvbiBMZyh0LGUpe3JldHVybiBuZXcgdGhpcyh0KS5sb2coZSl9ZnVuY3Rpb24gUGcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmxvZygyKX1mdW5jdGlvbiBSZyh0KXtyZXR1cm4gbmV3IHRoaXModCkubG9nKDEwKX1mdW5jdGlvbiBCZygpe3JldHVybiByZyh0aGlzLGFyZ3VtZW50cywibHQiKX1mdW5jdGlvbiBrZygpe3JldHVybiByZyh0aGlzLGFyZ3VtZW50cywiZ3QiKX1mdW5jdGlvbiB6Zyh0LGUpe3JldHVybiBuZXcgdGhpcyh0KS5tb2QoZSl9ZnVuY3Rpb24gamcodCxlKXtyZXR1cm4gbmV3IHRoaXModCkubXVsKGUpfWZ1bmN0aW9uIFVnKHQsZSl7cmV0dXJuIG5ldyB0aGlzKHQpLnBvdyhlKX1mdW5jdGlvbiBxZyh0KXt2YXIgZSxuLHIsaSxvPTAscz1uZXcgdGhpcygxKSxhPVtdO2lmKHZvaWQgMD09PXQ/dD10aGlzLnByZWNpc2lvbjpHZCh0LDEsYmQpLHI9TWF0aC5jZWlsKHQvNyksdGhpcy5jcnlwdG8paWYoY3J5cHRvLmdldFJhbmRvbVZhbHVlcylmb3IoZT1jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50MzJBcnJheShyKSk7bzxyOykoaT1lW29dKT49NDI5ZTc/ZVtvXT1jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50MzJBcnJheSgxKSlbMF06YVtvKytdPWklMWU3O2Vsc2V7aWYoIWNyeXB0by5yYW5kb21CeXRlcyl0aHJvdyBFcnJvcihGZCk7Zm9yKGU9Y3J5cHRvLnJhbmRvbUJ5dGVzKHIqPTQpO288cjspKGk9ZVtvXSsoZVtvKzFdPDw4KSsoZVtvKzJdPDwxNikrKCgxMjcmZVtvKzNdKTw8MjQpKT49MjE0ZTc/Y3J5cHRvLnJhbmRvbUJ5dGVzKDQpLmNvcHkoZSxvKTooYS5wdXNoKGklMWU3KSxvKz00KTtvPXIvNH1lbHNlIGZvcig7bzxyOylhW28rK109MWU3Kk1hdGgucmFuZG9tKCl8MDtmb3IodCU9Nywocj1hWy0tb10pJiZ0JiYoaT1MZCgxMCw3LXQpLGFbb109KHIvaXwwKSppKTswPT09YVtvXTtvLS0pYS5wb3AoKTtpZihvPDApbj0wLGE9WzBdO2Vsc2V7Zm9yKG49LTE7MD09PWFbMF07bi09NylhLnNoaWZ0KCk7Zm9yKHI9MSxpPWFbMF07aT49MTA7aS89MTApcisrO3I8NyYmKG4tPTctcil9cmV0dXJuIHMuZT1uLHMuZD1hLHN9ZnVuY3Rpb24gVmcodCl7cmV0dXJuIEhkKHQ9bmV3IHRoaXModCksdC5lKzEsdGhpcy5yb3VuZGluZyl9ZnVuY3Rpb24gR2codCl7cmV0dXJuKHQ9bmV3IHRoaXModCkpLmQ/dC5kWzBdP3QuczowKnQuczp0LnN8fE5hTn1mdW5jdGlvbiBZZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuc2luKCl9ZnVuY3Rpb24gWGcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLnNpbmgoKX1mdW5jdGlvbiBXZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuc3FydCgpfWZ1bmN0aW9uIEhnKHQsZSl7cmV0dXJuIG5ldyB0aGlzKHQpLnN1YihlKX1mdW5jdGlvbiBaZygpe3ZhciB0PTAsZT1hcmd1bWVudHMsbj1uZXcgdGhpcyhlW3RdKTtmb3IoQWQ9ITE7bi5zJiYrK3Q8ZS5sZW5ndGg7KW49bi5wbHVzKGVbdF0pO3JldHVybiBBZD0hMCxIZChuLHRoaXMucHJlY2lzaW9uLHRoaXMucm91bmRpbmcpfWZ1bmN0aW9uIEtnKHQpe3JldHVybiBuZXcgdGhpcyh0KS50YW4oKX1mdW5jdGlvbiBKZyh0KXtyZXR1cm4gbmV3IHRoaXModCkudGFuaCgpfWZ1bmN0aW9uIFFnKHQpe3JldHVybiBIZCh0PW5ldyB0aGlzKHQpLHQuZSsxLDEpfXFkW1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildPXFkLnRvU3RyaW5nLHFkW1N5bWJvbC50b1N0cmluZ1RhZ109IkRlY2ltYWwiO3ZhciAkZz1xZC5jb25zdHJ1Y3Rvcj1mdW5jdGlvbiB0KGUpe3ZhciBuLHIsaTtmdW5jdGlvbiBvKHQpe3ZhciBlLG4scixpPXRoaXM7aWYoIShpIGluc3RhbmNlb2YgbykpcmV0dXJuIG5ldyBvKHQpO2lmKGkuY29uc3RydWN0b3I9byxUZyh0KSlyZXR1cm4gaS5zPXQucyx2b2lkKEFkPyF0LmR8fHQuZT5vLm1heEU/KGkuZT1OYU4saS5kPW51bGwpOnQuZTxvLm1pbkU/KGkuZT0wLGkuZD1bMF0pOihpLmU9dC5lLGkuZD10LmQuc2xpY2UoKSk6KGkuZT10LmUsaS5kPXQuZD90LmQuc2xpY2UoKTp0LmQpKTtpZigibnVtYmVyIj09PShyPXR5cGVvZiB0KSl7aWYoMD09PXQpcmV0dXJuIGkucz0xL3Q8MD8tMToxLGkuZT0wLHZvaWQoaS5kPVswXSk7aWYodDwwPyh0PS10LGkucz0tMSk6aS5zPTEsdD09PX5+dCYmdDwxZTcpe2ZvcihlPTAsbj10O24+PTEwO24vPTEwKWUrKztyZXR1cm4gdm9pZChBZD9lPm8ubWF4RT8oaS5lPU5hTixpLmQ9bnVsbCk6ZTxvLm1pbkU/KGkuZT0wLGkuZD1bMF0pOihpLmU9ZSxpLmQ9W3RdKTooaS5lPWUsaS5kPVt0XSkpfXJldHVybiAwKnQhPTA/KHR8fChpLnM9TmFOKSxpLmU9TmFOLHZvaWQoaS5kPW51bGwpKTphZyhpLHQudG9TdHJpbmcoKSl9aWYoInN0cmluZyIhPT1yKXRocm93IEVycm9yKElkK3QpO3JldHVybiA0NT09PShuPXQuY2hhckNvZGVBdCgwKSk/KHQ9dC5zbGljZSgxKSxpLnM9LTEpOig0Mz09PW4mJih0PXQuc2xpY2UoMSkpLGkucz0xKSxrZC50ZXN0KHQpP2FnKGksdCk6ZnVuY3Rpb24odCxlKXt2YXIgbixyLGksbyxzLGEsdSxjLGw7aWYoZS5pbmRleE9mKCJfIik+LTEpe2lmKGU9ZS5yZXBsYWNlKC8oXGQpXyg/PVxkKS9nLCIkMSIpLGtkLnRlc3QoZSkpcmV0dXJuIGFnKHQsZSl9ZWxzZSBpZigiSW5maW5pdHkiPT09ZXx8Ik5hTiI9PT1lKXJldHVybitlfHwodC5zPU5hTiksdC5lPU5hTix0LmQ9bnVsbCx0O2lmKFJkLnRlc3QoZSkpbj0xNixlPWUudG9Mb3dlckNhc2UoKTtlbHNlIGlmKFBkLnRlc3QoZSkpbj0yO2Vsc2V7aWYoIUJkLnRlc3QoZSkpdGhyb3cgRXJyb3IoSWQrZSk7bj04fWZvcigobz1lLnNlYXJjaCgvcC9pKSk+MD8odT0rZS5zbGljZShvKzEpLGU9ZS5zdWJzdHJpbmcoMixvKSk6ZT1lLnNsaWNlKDIpLHM9KG89ZS5pbmRleE9mKCIuIikpPj0wLHI9dC5jb25zdHJ1Y3RvcixzJiYobz0oYT0oZT1lLnJlcGxhY2UoIi4iLCIiKSkubGVuZ3RoKS1vLGk9ZWcocixuZXcgcihuKSxvLDIqbykpLG89bD0oYz1YZChlLG4semQpKS5sZW5ndGgtMTswPT09Y1tvXTstLW8pYy5wb3AoKTtyZXR1cm4gbzwwP25ldyByKDAqdC5zKToodC5lPUtkKGMsbCksdC5kPWMsQWQ9ITEscyYmKHQ9V2QodCxpLDQqYSkpLHUmJih0PXQudGltZXMoTWF0aC5hYnModSk8NTQ/TGQoMix1KTokZy5wb3coMix1KSkpLEFkPSEwLHQpfShpLHQpfWlmKG8ucHJvdG90eXBlPXFkLG8uUk9VTkRfVVA9MCxvLlJPVU5EX0RPV049MSxvLlJPVU5EX0NFSUw9MixvLlJPVU5EX0ZMT09SPTMsby5ST1VORF9IQUxGX1VQPTQsby5ST1VORF9IQUxGX0RPV049NSxvLlJPVU5EX0hBTEZfRVZFTj02LG8uUk9VTkRfSEFMRl9DRUlMPTcsby5ST1VORF9IQUxGX0ZMT09SPTgsby5FVUNMSUQ9OSxvLmNvbmZpZz1vLnNldD1DZyxvLmNsb25lPXQsby5pc0RlY2ltYWw9VGcsby5hYnM9cGcsby5hY29zPWRnLG8uYWNvc2g9Z2csby5hZGQ9eWcsby5hc2luPW1nLG8uYXNpbmg9dmcsby5hdGFuPV9nLG8uYXRhbmg9eGcsby5hdGFuMj13ZyxvLmNicnQ9Ymcsby5jZWlsPURnLG8uY2xhbXA9RWcsby5jb3M9U2csby5jb3NoPUFnLG8uZGl2PU5nLG8uZXhwPUlnLG8uZmxvb3I9TWcsby5oeXBvdD1GZyxvLmxuPU9nLG8ubG9nPUxnLG8ubG9nMTA9Umcsby5sb2cyPVBnLG8ubWF4PUJnLG8ubWluPWtnLG8ubW9kPXpnLG8ubXVsPWpnLG8ucG93PVVnLG8ucmFuZG9tPXFnLG8ucm91bmQ9Vmcsby5zaWduPUdnLG8uc2luPVlnLG8uc2luaD1YZyxvLnNxcnQ9V2csby5zdWI9SGcsby5zdW09Wmcsby50YW49S2csby50YW5oPUpnLG8udHJ1bmM9UWcsdm9pZCAwPT09ZSYmKGU9e30pLGUmJiEwIT09ZS5kZWZhdWx0cylmb3IoaT1bInByZWNpc2lvbiIsInJvdW5kaW5nIiwidG9FeHBOZWciLCJ0b0V4cFBvcyIsIm1heEUiLCJtaW5FIiwibW9kdWxvIiwiY3J5cHRvIl0sbj0wO248aS5sZW5ndGg7KWUuaGFzT3duUHJvcGVydHkocj1pW24rK10pfHwoZVtyXT10aGlzW3JdKTtyZXR1cm4gby5jb25maWcoZSksb30oU2QpO0VkPW5ldyAkZyhFZCksQ2Q9bmV3ICRnKENkKTt2YXIgdHk9aWQoIkJpZ051bWJlciIsWyI/b24iLCJjb25maWciXSwodD0+e3ZhcntvbjplLGNvbmZpZzpufT10LHI9JGcuY2xvbmUoe3ByZWNpc2lvbjpuLnByZWNpc2lvbixtb2R1bG86JGcuRVVDTElEfSk7cmV0dXJuIHIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpLHIucHJvdG90eXBlLnR5cGU9IkJpZ051bWJlciIsci5wcm90b3R5cGUuaXNCaWdOdW1iZXI9ITAsci5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21hdGhqczoiQmlnTnVtYmVyIix2YWx1ZTp0aGlzLnRvU3RyaW5nKCl9fSxyLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcih0LnZhbHVlKX0sZSYmZSgiY29uZmlnIiwoZnVuY3Rpb24odCxlKXt0LnByZWNpc2lvbiE9PWUucHJlY2lzaW9uJiZyLmNvbmZpZyh7cHJlY2lzaW9uOnQucHJlY2lzaW9ufSl9KSkscn0pLHtpc0NsYXNzOiEwfSksZXk9TWF0aC5jb3NofHxmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5hYnModCk8MWUtOT8xLXQ6LjUqKE1hdGguZXhwKHQpK01hdGguZXhwKC10KSl9LG55PU1hdGguc2luaHx8ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHQpPDFlLTk/dDouNSooTWF0aC5leHAodCktTWF0aC5leHAoLXQpKX0scnk9ZnVuY3Rpb24oKXt0aHJvdyBTeW50YXhFcnJvcigiSW52YWxpZCBQYXJhbSIpfTtmdW5jdGlvbiBpeSh0LGUpe3ZhciBuPU1hdGguYWJzKHQpLHI9TWF0aC5hYnMoZSk7cmV0dXJuIDA9PT10P01hdGgubG9nKHIpOjA9PT1lP01hdGgubG9nKG4pOm48M2UzJiZyPDNlMz8uNSpNYXRoLmxvZyh0KnQrZSplKToodC89MixlLz0yLC41Kk1hdGgubG9nKHQqdCtlKmUpK01hdGguTE4yKX1mdW5jdGlvbiBveSh0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG95KSlyZXR1cm4gbmV3IG95KHQsZSk7dmFyIG49ZnVuY3Rpb24odCxlKXt2YXIgbj17cmU6MCxpbTowfTtpZihudWxsPT10KW4ucmU9bi5pbT0wO2Vsc2UgaWYodm9pZCAwIT09ZSluLnJlPXQsbi5pbT1lO2Vsc2Ugc3dpdGNoKHR5cGVvZiB0KXtjYXNlIm9iamVjdCI6aWYoImltImluIHQmJiJyZSJpbiB0KW4ucmU9dC5yZSxuLmltPXQuaW07ZWxzZSBpZigiYWJzImluIHQmJiJhcmciaW4gdCl7aWYoIU51bWJlci5pc0Zpbml0ZSh0LmFicykmJk51bWJlci5pc0Zpbml0ZSh0LmFyZykpcmV0dXJuIG95LklORklOSVRZO24ucmU9dC5hYnMqTWF0aC5jb3ModC5hcmcpLG4uaW09dC5hYnMqTWF0aC5zaW4odC5hcmcpfWVsc2UgaWYoInIiaW4gdCYmInBoaSJpbiB0KXtpZighTnVtYmVyLmlzRmluaXRlKHQucikmJk51bWJlci5pc0Zpbml0ZSh0LnBoaSkpcmV0dXJuIG95LklORklOSVRZO24ucmU9dC5yKk1hdGguY29zKHQucGhpKSxuLmltPXQucipNYXRoLnNpbih0LnBoaSl9ZWxzZSAyPT09dC5sZW5ndGg/KG4ucmU9dFswXSxuLmltPXRbMV0pOnJ5KCk7YnJlYWs7Y2FzZSJzdHJpbmciOm4uaW09bi5yZT0wO3ZhciByPXQucmVwbGFjZSgvXy9nLCIiKS5tYXRjaCgvXGQrXC4/XGQqZVsrLV0/XGQrfFxkK1wuP1xkKnxcLlxkK3wuL2cpLGk9MSxvPTA7bnVsbD09PXImJnJ5KCk7Zm9yKHZhciBzPTA7czxyLmxlbmd0aDtzKyspe3ZhciBhPXJbc107IiAiPT09YXx8Ilx0Ij09PWF8fCJcbiI9PT1hfHwoIisiPT09YT9pKys6Ii0iPT09YT9vKys6ImkiPT09YXx8IkkiPT09YT8oaStvPT09MCYmcnkoKSwiICI9PT1yW3MrMV18fGlzTmFOKHJbcysxXSk/bi5pbSs9cGFyc2VGbG9hdCgobyUyPyItIjoiIikrIjEiKToobi5pbSs9cGFyc2VGbG9hdCgobyUyPyItIjoiIikrcltzKzFdKSxzKyspLGk9bz0wKTooKGkrbz09PTB8fGlzTmFOKGEpKSYmcnkoKSwiaSI9PT1yW3MrMV18fCJJIj09PXJbcysxXT8obi5pbSs9cGFyc2VGbG9hdCgobyUyPyItIjoiIikrYSkscysrKTpuLnJlKz1wYXJzZUZsb2F0KChvJTI/Ii0iOiIiKSthKSxpPW89MCkpfWkrbz4wJiZyeSgpO2JyZWFrO2Nhc2UibnVtYmVyIjpuLmltPTAsbi5yZT10O2JyZWFrO2RlZmF1bHQ6cnkoKX1yZXR1cm4gaXNOYU4obi5yZSl8fGlzTmFOKG4uaW0pLG59KHQsZSk7dGhpcy5yZT1uLnJlLHRoaXMuaW09bi5pbX1veS5wcm90b3R5cGU9e3JlOjAsaW06MCxzaWduOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hYnMoKTtyZXR1cm4gbmV3IG95KHRoaXMucmUvdCx0aGlzLmltL3QpfSxhZGQ6ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgb3kodCxlKTtyZXR1cm4gdGhpcy5pc0luZmluaXRlKCkmJm4uaXNJbmZpbml0ZSgpP295Lk5BTjp0aGlzLmlzSW5maW5pdGUoKXx8bi5pc0luZmluaXRlKCk/b3kuSU5GSU5JVFk6bmV3IG95KHRoaXMucmUrbi5yZSx0aGlzLmltK24uaW0pfSxzdWI6ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgb3kodCxlKTtyZXR1cm4gdGhpcy5pc0luZmluaXRlKCkmJm4uaXNJbmZpbml0ZSgpP295Lk5BTjp0aGlzLmlzSW5maW5pdGUoKXx8bi5pc0luZmluaXRlKCk/b3kuSU5GSU5JVFk6bmV3IG95KHRoaXMucmUtbi5yZSx0aGlzLmltLW4uaW0pfSxtdWw6ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgb3kodCxlKTtyZXR1cm4gdGhpcy5pc0luZmluaXRlKCkmJm4uaXNaZXJvKCl8fHRoaXMuaXNaZXJvKCkmJm4uaXNJbmZpbml0ZSgpP295Lk5BTjp0aGlzLmlzSW5maW5pdGUoKXx8bi5pc0luZmluaXRlKCk/b3kuSU5GSU5JVFk6MD09PW4uaW0mJjA9PT10aGlzLmltP25ldyBveSh0aGlzLnJlKm4ucmUsMCk6bmV3IG95KHRoaXMucmUqbi5yZS10aGlzLmltKm4uaW0sdGhpcy5yZSpuLmltK3RoaXMuaW0qbi5yZSl9LGRpdjpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBveSh0LGUpO2lmKHRoaXMuaXNaZXJvKCkmJm4uaXNaZXJvKCl8fHRoaXMuaXNJbmZpbml0ZSgpJiZuLmlzSW5maW5pdGUoKSlyZXR1cm4gb3kuTkFOO2lmKHRoaXMuaXNJbmZpbml0ZSgpfHxuLmlzWmVybygpKXJldHVybiBveS5JTkZJTklUWTtpZih0aGlzLmlzWmVybygpfHxuLmlzSW5maW5pdGUoKSlyZXR1cm4gb3kuWkVSTzt0PXRoaXMucmUsZT10aGlzLmltO3ZhciByLGksbz1uLnJlLHM9bi5pbTtyZXR1cm4gMD09PXM/bmV3IG95KHQvbyxlL28pOk1hdGguYWJzKG8pPE1hdGguYWJzKHMpP25ldyBveSgodCooaT1vL3MpK2UpLyhyPW8qaStzKSwoZSppLXQpL3IpOm5ldyBveSgodCtlKihpPXMvbykpLyhyPXMqaStvKSwoZS10KmkpL3IpfSxwb3c6ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgb3kodCxlKTtpZih0PXRoaXMucmUsZT10aGlzLmltLG4uaXNaZXJvKCkpcmV0dXJuIG95Lk9ORTtpZigwPT09bi5pbSl7aWYoMD09PWUmJnQ+MClyZXR1cm4gbmV3IG95KE1hdGgucG93KHQsbi5yZSksMCk7aWYoMD09PXQpc3dpdGNoKChuLnJlJTQrNCklNCl7Y2FzZSAwOnJldHVybiBuZXcgb3koTWF0aC5wb3coZSxuLnJlKSwwKTtjYXNlIDE6cmV0dXJuIG5ldyBveSgwLE1hdGgucG93KGUsbi5yZSkpO2Nhc2UgMjpyZXR1cm4gbmV3IG95KC1NYXRoLnBvdyhlLG4ucmUpLDApO2Nhc2UgMzpyZXR1cm4gbmV3IG95KDAsLU1hdGgucG93KGUsbi5yZSkpfX1pZigwPT09dCYmMD09PWUmJm4ucmU+MCYmbi5pbT49MClyZXR1cm4gb3kuWkVSTzt2YXIgcj1NYXRoLmF0YW4yKGUsdCksaT1peSh0LGUpO3JldHVybiB0PU1hdGguZXhwKG4ucmUqaS1uLmltKnIpLGU9bi5pbSppK24ucmUqcixuZXcgb3kodCpNYXRoLmNvcyhlKSx0Kk1hdGguc2luKGUpKX0sc3FydDpmdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLnJlLHI9dGhpcy5pbSxpPXRoaXMuYWJzKCk7aWYobj49MCl7aWYoMD09PXIpcmV0dXJuIG5ldyBveShNYXRoLnNxcnQobiksMCk7dD0uNSpNYXRoLnNxcnQoMiooaStuKSl9ZWxzZSB0PU1hdGguYWJzKHIpL01hdGguc3FydCgyKihpLW4pKTtyZXR1cm4gZT1uPD0wPy41Kk1hdGguc3FydCgyKihpLW4pKTpNYXRoLmFicyhyKS9NYXRoLnNxcnQoMiooaStuKSksbmV3IG95KHQscjwwPy1lOmUpfSxleHA6ZnVuY3Rpb24oKXt2YXIgdD1NYXRoLmV4cCh0aGlzLnJlKTtyZXR1cm4gdGhpcy5pbSxuZXcgb3kodCpNYXRoLmNvcyh0aGlzLmltKSx0Kk1hdGguc2luKHRoaXMuaW0pKX0sZXhwbTE6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtyZXR1cm4gbmV3IG95KE1hdGguZXhwbTEodCkqTWF0aC5jb3MoZSkrZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5QSS80O2lmKC1lPnR8fHQ+ZSlyZXR1cm4gTWF0aC5jb3ModCktMTt2YXIgbj10KnQ7cmV0dXJuIG4qKG4qKG4qKG4qKG4qKG4qKG4qKG4vMjA5MjI3ODk4ODhlMy0xLzg3MTc4MjkxMjAwKSsxLzQ3OTAwMTYwMCktMS8zNjI4ODAwKSsxLzQwMzIwKS0xLzcyMCkrMS8yNCktLjUpfShlKSxNYXRoLmV4cCh0KSpNYXRoLnNpbihlKSl9LGxvZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltO3JldHVybiBuZXcgb3koaXkodCxlKSxNYXRoLmF0YW4yKGUsdCkpfSxhYnM6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLmFicyh0KSxyPU1hdGguYWJzKGUpO3JldHVybiBuPDNlMyYmcjwzZTM/TWF0aC5zcXJ0KG4qbityKnIpOihuPHI/KG49cixyPXQvZSk6cj1lL3QsbipNYXRoLnNxcnQoMStyKnIpKX0odGhpcy5yZSx0aGlzLmltKX0sYXJnOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy5pbSx0aGlzLnJlKX0sc2luOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07cmV0dXJuIG5ldyBveShNYXRoLnNpbih0KSpleShlKSxNYXRoLmNvcyh0KSpueShlKSl9LGNvczpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltO3JldHVybiBuZXcgb3koTWF0aC5jb3ModCkqZXkoZSksLU1hdGguc2luKHQpKm55KGUpKX0sdGFuOmZ1bmN0aW9uKCl7dmFyIHQ9Mip0aGlzLnJlLGU9Mip0aGlzLmltLG49TWF0aC5jb3ModCkrZXkoZSk7cmV0dXJuIG5ldyBveShNYXRoLnNpbih0KS9uLG55KGUpL24pfSxjb3Q6ZnVuY3Rpb24oKXt2YXIgdD0yKnRoaXMucmUsZT0yKnRoaXMuaW0sbj1NYXRoLmNvcyh0KS1leShlKTtyZXR1cm4gbmV3IG95KC1NYXRoLnNpbih0KS9uLG55KGUpL24pfSxzZWM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbSxuPS41KmV5KDIqZSkrLjUqTWF0aC5jb3MoMip0KTtyZXR1cm4gbmV3IG95KE1hdGguY29zKHQpKmV5KGUpL24sTWF0aC5zaW4odCkqbnkoZSkvbil9LGNzYzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltLG49LjUqZXkoMiplKS0uNSpNYXRoLmNvcygyKnQpO3JldHVybiBuZXcgb3koTWF0aC5zaW4odCkqZXkoZSkvbiwtTWF0aC5jb3ModCkqbnkoZSkvbil9LGFzaW46ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbSxuPW5ldyBveShlKmUtdCp0KzEsLTIqdCplKS5zcXJ0KCkscj1uZXcgb3kobi5yZS1lLG4uaW0rdCkubG9nKCk7cmV0dXJuIG5ldyBveShyLmltLC1yLnJlKX0sYWNvczpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltLG49bmV3IG95KGUqZS10KnQrMSwtMip0KmUpLnNxcnQoKSxyPW5ldyBveShuLnJlLWUsbi5pbSt0KS5sb2coKTtyZXR1cm4gbmV3IG95KE1hdGguUEkvMi1yLmltLHIucmUpfSxhdGFuOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PXQpe2lmKDE9PT1lKXJldHVybiBuZXcgb3koMCwxLzApO2lmKC0xPT09ZSlyZXR1cm4gbmV3IG95KDAsLTEvMCl9dmFyIG49dCp0KygxLWUpKigxLWUpLHI9bmV3IG95KCgxLWUqZS10KnQpL24sLTIqdC9uKS5sb2coKTtyZXR1cm4gbmV3IG95KC0uNSpyLmltLC41KnIucmUpfSxhY290OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PWUpcmV0dXJuIG5ldyBveShNYXRoLmF0YW4yKDEsdCksMCk7dmFyIG49dCp0K2UqZTtyZXR1cm4gMCE9PW4/bmV3IG95KHQvbiwtZS9uKS5hdGFuKCk6bmV3IG95KDAhPT10P3QvMDowLDAhPT1lPy1lLzA6MCkuYXRhbigpfSxhc2VjOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PXQmJjA9PT1lKXJldHVybiBuZXcgb3koMCwxLzApO3ZhciBuPXQqdCtlKmU7cmV0dXJuIDAhPT1uP25ldyBveSh0L24sLWUvbikuYWNvcygpOm5ldyBveSgwIT09dD90LzA6MCwwIT09ZT8tZS8wOjApLmFjb3MoKX0sYWNzYzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltO2lmKDA9PT10JiYwPT09ZSlyZXR1cm4gbmV3IG95KE1hdGguUEkvMiwxLzApO3ZhciBuPXQqdCtlKmU7cmV0dXJuIDAhPT1uP25ldyBveSh0L24sLWUvbikuYXNpbigpOm5ldyBveSgwIT09dD90LzA6MCwwIT09ZT8tZS8wOjApLmFzaW4oKX0sc2luaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltO3JldHVybiBuZXcgb3kobnkodCkqTWF0aC5jb3MoZSksZXkodCkqTWF0aC5zaW4oZSkpfSxjb3NoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07cmV0dXJuIG5ldyBveShleSh0KSpNYXRoLmNvcyhlKSxueSh0KSpNYXRoLnNpbihlKSl9LHRhbmg6ZnVuY3Rpb24oKXt2YXIgdD0yKnRoaXMucmUsZT0yKnRoaXMuaW0sbj1leSh0KStNYXRoLmNvcyhlKTtyZXR1cm4gbmV3IG95KG55KHQpL24sTWF0aC5zaW4oZSkvbil9LGNvdGg6ZnVuY3Rpb24oKXt2YXIgdD0yKnRoaXMucmUsZT0yKnRoaXMuaW0sbj1leSh0KS1NYXRoLmNvcyhlKTtyZXR1cm4gbmV3IG95KG55KHQpL24sLU1hdGguc2luKGUpL24pfSxjc2NoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj1NYXRoLmNvcygyKmUpLWV5KDIqdCk7cmV0dXJuIG5ldyBveSgtMipueSh0KSpNYXRoLmNvcyhlKS9uLDIqZXkodCkqTWF0aC5zaW4oZSkvbil9LHNlY2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbSxuPU1hdGguY29zKDIqZSkrZXkoMip0KTtyZXR1cm4gbmV3IG95KDIqZXkodCkqTWF0aC5jb3MoZSkvbiwtMipueSh0KSpNYXRoLnNpbihlKS9uKX0sYXNpbmg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmltO3RoaXMuaW09LXRoaXMucmUsdGhpcy5yZT10O3ZhciBlPXRoaXMuYXNpbigpO3JldHVybiB0aGlzLnJlPS10aGlzLmltLHRoaXMuaW09dCx0PWUucmUsZS5yZT0tZS5pbSxlLmltPXQsZX0sYWNvc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmFjb3MoKTtpZih0LmltPD0wKXt2YXIgZT10LnJlO3QucmU9LXQuaW0sdC5pbT1lfWVsc2V7ZT10LmltO3QuaW09LXQucmUsdC5yZT1lfXJldHVybiB0fSxhdGFuaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltLG49dD4xJiYwPT09ZSxyPTEtdCxpPTErdCxvPXIqcitlKmUscz0wIT09bz9uZXcgb3koKGkqci1lKmUpL28sKGUqcitpKmUpL28pOm5ldyBveSgtMSE9PXQ/dC8wOjAsMCE9PWU/ZS8wOjApLGE9cy5yZTtyZXR1cm4gcy5yZT1peShzLnJlLHMuaW0pLzIscy5pbT1NYXRoLmF0YW4yKHMuaW0sYSkvMixuJiYocy5pbT0tcy5pbSksc30sYWNvdGg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtpZigwPT09dCYmMD09PWUpcmV0dXJuIG5ldyBveSgwLE1hdGguUEkvMik7dmFyIG49dCp0K2UqZTtyZXR1cm4gMCE9PW4/bmV3IG95KHQvbiwtZS9uKS5hdGFuaCgpOm5ldyBveSgwIT09dD90LzA6MCwwIT09ZT8tZS8wOjApLmF0YW5oKCl9LGFjc2NoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PWUpcmV0dXJuIG5ldyBveSgwIT09dD9NYXRoLmxvZyh0K01hdGguc3FydCh0KnQrMSkpOjEvMCwwKTt2YXIgbj10KnQrZSplO3JldHVybiAwIT09bj9uZXcgb3kodC9uLC1lL24pLmFzaW5oKCk6bmV3IG95KDAhPT10P3QvMDowLDAhPT1lPy1lLzA6MCkuYXNpbmgoKX0sYXNlY2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtpZih0aGlzLmlzWmVybygpKXJldHVybiBveS5JTkZJTklUWTt2YXIgbj10KnQrZSplO3JldHVybiAwIT09bj9uZXcgb3kodC9uLC1lL24pLmFjb3NoKCk6bmV3IG95KDAhPT10P3QvMDowLDAhPT1lPy1lLzA6MCkuYWNvc2goKX0saW52ZXJzZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIG95LklORklOSVRZO2lmKHRoaXMuaXNJbmZpbml0ZSgpKXJldHVybiBveS5aRVJPO3ZhciB0PXRoaXMucmUsZT10aGlzLmltLG49dCp0K2UqZTtyZXR1cm4gbmV3IG95KHQvbiwtZS9uKX0sY29uanVnYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBveSh0aGlzLnJlLC10aGlzLmltKX0sbmVnOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBveSgtdGhpcy5yZSwtdGhpcy5pbSl9LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coMTAsdHx8MCksbmV3IG95KE1hdGguY2VpbCh0aGlzLnJlKnQpL3QsTWF0aC5jZWlsKHRoaXMuaW0qdCkvdCl9LGZsb29yOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KDEwLHR8fDApLG5ldyBveShNYXRoLmZsb29yKHRoaXMucmUqdCkvdCxNYXRoLmZsb29yKHRoaXMuaW0qdCkvdCl9LHJvdW5kOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KDEwLHR8fDApLG5ldyBveShNYXRoLnJvdW5kKHRoaXMucmUqdCkvdCxNYXRoLnJvdW5kKHRoaXMuaW0qdCkvdCl9LGVxdWFsczpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBveSh0LGUpO3JldHVybiBNYXRoLmFicyhuLnJlLXRoaXMucmUpPD1veS5FUFNJTE9OJiZNYXRoLmFicyhuLmltLXRoaXMuaW0pPD1veS5FUFNJTE9OfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgb3kodGhpcy5yZSx0aGlzLmltKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbSxuPSIiO3JldHVybiB0aGlzLmlzTmFOKCk/Ik5hTiI6dGhpcy5pc0luZmluaXRlKCk/IkluZmluaXR5IjooTWF0aC5hYnModCk8b3kuRVBTSUxPTiYmKHQ9MCksTWF0aC5hYnMoZSk8b3kuRVBTSUxPTiYmKGU9MCksMD09PWU/bit0OigwIT09dD8obis9dCxuKz0iICIsZTwwPyhlPS1lLG4rPSItIik6bis9IisiLG4rPSIgIik6ZTwwJiYoZT0tZSxuKz0iLSIpLDEhPT1lJiYobis9ZSksbisiaSIpKX0sdG9WZWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5yZSx0aGlzLmltXX0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5pbT90aGlzLnJlOm51bGx9LGlzTmFOOmZ1bmN0aW9uKCl7cmV0dXJuIGlzTmFOKHRoaXMucmUpfHxpc05hTih0aGlzLmltKX0saXNaZXJvOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmltJiYwPT09dGhpcy5yZX0saXNGaW5pdGU6ZnVuY3Rpb24oKXtyZXR1cm4gaXNGaW5pdGUodGhpcy5yZSkmJmlzRmluaXRlKHRoaXMuaW0pfSxpc0luZmluaXRlOmZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLmlzTmFOKCl8fHRoaXMuaXNGaW5pdGUoKSl9fSxveS5aRVJPPW5ldyBveSgwLDApLG95Lk9ORT1uZXcgb3koMSwwKSxveS5JPW5ldyBveSgwLDEpLG95LlBJPW5ldyBveShNYXRoLlBJLDApLG95LkU9bmV3IG95KE1hdGguRSwwKSxveS5JTkZJTklUWT1uZXcgb3koMS8wLDEvMCksb3kuTkFOPW5ldyBveShOYU4sTmFOKSxveS5FUFNJTE9OPTFlLTE1O3ZhciBzeT1pZCgiQ29tcGxleCIsW10sKCgpPT4oT2JqZWN0LmRlZmluZVByb3BlcnR5KG95LCJuYW1lIix7dmFsdWU6IkNvbXBsZXgifSksb3kucHJvdG90eXBlLmNvbnN0cnVjdG9yPW95LG95LnByb3RvdHlwZS50eXBlPSJDb21wbGV4IixveS5wcm90b3R5cGUuaXNDb21wbGV4PSEwLG95LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJDb21wbGV4IixyZTp0aGlzLnJlLGltOnRoaXMuaW19fSxveS5wcm90b3R5cGUudG9Qb2xhcj1mdW5jdGlvbigpe3JldHVybntyOnRoaXMuYWJzKCkscGhpOnRoaXMuYXJnKCl9fSxveS5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW0sbj10aGlzLnJlLHI9VHAodGhpcy5yZSx0KSxpPVRwKHRoaXMuaW0sdCksbz1QZih0KT90OnQ/dC5wcmVjaXNpb246bnVsbDtpZihudWxsIT09byl7dmFyIHM9TWF0aC5wb3coMTAsLW8pO01hdGguYWJzKG4vZSk8cyYmKG49MCksTWF0aC5hYnMoZS9uKTxzJiYoZT0wKX1yZXR1cm4gMD09PWU/cjowPT09bj8xPT09ZT8iaSI6LTE9PT1lPyItaSI6aSsiaSI6ZTwwPy0xPT09ZT9yKyIgLSBpIjpyKyIgLSAiK2kuc3Vic3RyaW5nKDEpKyJpIjoxPT09ZT9yKyIgKyBpIjpyKyIgKyAiK2krImkifSxveS5mcm9tUG9sYXI9ZnVuY3Rpb24odCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTp2YXIgZT1hcmd1bWVudHNbMF07aWYoIm9iamVjdCI9PXR5cGVvZiBlKXJldHVybiBveShlKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnB1dCBoYXMgdG8gYmUgYW4gb2JqZWN0IHdpdGggciBhbmQgcGhpIGtleXMuIik7Y2FzZSAyOnZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtpZihQZihuKSl7aWYoemYocikmJnIuaGFzQmFzZSgiQU5HTEUiKSYmKHI9ci50b051bWJlcigicmFkIikpLFBmKHIpKXJldHVybiBuZXcgb3koe3I6bixwaGk6cn0pO3Rocm93IG5ldyBUeXBlRXJyb3IoIlBoaSBpcyBub3QgYSBudW1iZXIgbm9yIGFuIGFuZ2xlIHVuaXQuIil9dGhyb3cgbmV3IFR5cGVFcnJvcigiUmFkaXVzIHIgaXMgbm90IGEgbnVtYmVyLiIpO2RlZmF1bHQ6dGhyb3cgbmV3IFN5bnRheEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGluIGZ1bmN0aW9uIGZyb21Qb2xhciIpfX0sb3kucHJvdG90eXBlLnZhbHVlT2Y9b3kucHJvdG90eXBlLnRvU3RyaW5nLG95LmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgb3kodCl9LG95LmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5yZT5lLnJlPzE6dC5yZTxlLnJlPy0xOnQuaW0+ZS5pbT8xOnQuaW08ZS5pbT8tMTowfSxveSkpLHtpc0NsYXNzOiEwfSksYXk9e3M6MSxuOjAsZDoxfTtmdW5jdGlvbiB1eSh0LGUpe2lmKGlzTmFOKHQ9cGFyc2VJbnQodCwxMCkpKXRocm93IGd5KCk7cmV0dXJuIHQqZX1mdW5jdGlvbiBjeSh0LGUpe2lmKDA9PT1lKXRocm93IGR5KCk7dmFyIG49T2JqZWN0LmNyZWF0ZShweS5wcm90b3R5cGUpO24ucz10PDA/LTE6MTt2YXIgcj1meSh0PXQ8MD8tdDp0LGUpO3JldHVybiBuLm49dC9yLG4uZD1lL3Isbn1mdW5jdGlvbiBseSh0KXtmb3IodmFyIGU9e30sbj10LHI9MixpPTQ7aTw9bjspe2Zvcig7biVyPT0wOyluLz1yLGVbcl09KGVbcl18fDApKzE7aSs9MSsyKnIrK31yZXR1cm4gbiE9PXQ/bj4xJiYoZVtuXT0oZVtuXXx8MCkrMSk6ZVt0XT0oZVt0XXx8MCkrMSxlfXZhciBoeT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9MCxpPTEsbz0xLHM9MCxhPTAsdT0wLGM9MSxsPTEsaD0wLGY9MSxwPTEsZD0xLGc9MWU3O2lmKG51bGwhPXQpaWYodm9pZCAwIT09ZSl7aWYobz0ocj10KSooaT1lKSxyJTEhPTB8fGklMSE9MCl0aHJvdyB5eSgpfWVsc2Ugc3dpdGNoKHR5cGVvZiB0KXtjYXNlIm9iamVjdCI6aWYoImQiaW4gdCYmIm4iaW4gdClyPXQubixpPXQuZCwicyJpbiB0JiYocio9dC5zKTtlbHNle2lmKCEoMCBpbiB0KSl0aHJvdyBneSgpO3I9dFswXSwxIGluIHQmJihpPXRbMV0pfW89cippO2JyZWFrO2Nhc2UibnVtYmVyIjppZih0PDAmJihvPXQsdD0tdCksdCUxPT0wKXI9dDtlbHNlIGlmKHQ+MCl7Zm9yKHQ+PTEmJih0Lz1sPU1hdGgucG93KDEwLE1hdGguZmxvb3IoMStNYXRoLmxvZyh0KS9NYXRoLkxOMTApKSk7Zjw9ZyYmZDw9Zzspe2lmKHQ9PT0obj0oaCtwKS8oZitkKSkpe2YrZDw9Zz8ocj1oK3AsaT1mK2QpOmQ+Zj8ocj1wLGk9ZCk6KHI9aCxpPWYpO2JyZWFrfXQ+bj8oaCs9cCxmKz1kKToocCs9aCxkKz1mKSxmPmc/KHI9cCxpPWQpOihyPWgsaT1mKX1yKj1sfWVsc2UoaXNOYU4odCl8fGlzTmFOKGUpKSYmKGk9cj1OYU4pO2JyZWFrO2Nhc2Uic3RyaW5nIjppZihudWxsPT09KGY9dC5tYXRjaCgvXGQrfC4vZykpKXRocm93IGd5KCk7aWYoIi0iPT09ZltoXT8obz0tMSxoKyspOiIrIj09PWZbaF0mJmgrKyxmLmxlbmd0aD09PWgrMT9hPXV5KGZbaCsrXSxvKToiLiI9PT1mW2grMV18fCIuIj09PWZbaF0/KCIuIiE9PWZbaF0mJihzPXV5KGZbaCsrXSxvKSksKCsraCsxPT09Zi5sZW5ndGh8fCIoIj09PWZbaCsxXSYmIikiPT09ZltoKzNdfHwiJyI9PT1mW2grMV0mJiInIj09PWZbaCszXSkmJihhPXV5KGZbaF0sbyksYz1NYXRoLnBvdygxMCxmW2hdLmxlbmd0aCksaCsrKSwoIigiPT09ZltoXSYmIikiPT09ZltoKzJdfHwiJyI9PT1mW2hdJiYiJyI9PT1mW2grMl0pJiYodT11eShmW2grMV0sbyksbD1NYXRoLnBvdygxMCxmW2grMV0ubGVuZ3RoKS0xLGgrPTMpKToiLyI9PT1mW2grMV18fCI6Ij09PWZbaCsxXT8oYT11eShmW2hdLG8pLGM9dXkoZltoKzJdLDEpLGgrPTMpOiIvIj09PWZbaCszXSYmIiAiPT09ZltoKzFdJiYocz11eShmW2hdLG8pLGE9dXkoZltoKzJdLG8pLGM9dXkoZltoKzRdLDEpLGgrPTUpLGYubGVuZ3RoPD1oKXtvPXI9dSsoaT1jKmwpKnMrbCphO2JyZWFrfWRlZmF1bHQ6dGhyb3cgZ3koKX1pZigwPT09aSl0aHJvdyBkeSgpO2F5LnM9bzwwPy0xOjEsYXkubj1NYXRoLmFicyhyKSxheS5kPU1hdGguYWJzKGkpfTtmdW5jdGlvbiBmeSh0LGUpe2lmKCF0KXJldHVybiBlO2lmKCFlKXJldHVybiB0O2Zvcig7Oyl7aWYoISh0JT1lKSlyZXR1cm4gZTtpZighKGUlPXQpKXJldHVybiB0fX1mdW5jdGlvbiBweSh0LGUpe2lmKGh5KHQsZSksISh0aGlzIGluc3RhbmNlb2YgcHkpKXJldHVybiBjeShheS5zKmF5Lm4sYXkuZCk7dD1meShheS5kLGF5Lm4pLHRoaXMucz1heS5zLHRoaXMubj1heS5uL3QsdGhpcy5kPWF5LmQvdH12YXIgZHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEVycm9yKCJEaXZpc2lvbiBieSBaZXJvIil9LGd5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCIpfSx5eT1mdW5jdGlvbigpe3JldHVybiBuZXcgRXJyb3IoIlBhcmFtZXRlcnMgbXVzdCBiZSBpbnRlZ2VyIil9O3B5LnByb3RvdHlwZT17czoxLG46MCxkOjEsYWJzOmZ1bmN0aW9uKCl7cmV0dXJuIGN5KHRoaXMubix0aGlzLmQpfSxuZWc6ZnVuY3Rpb24oKXtyZXR1cm4gY3koLXRoaXMucyp0aGlzLm4sdGhpcy5kKX0sYWRkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGh5KHQsZSksY3kodGhpcy5zKnRoaXMubipheS5kK2F5LnMqdGhpcy5kKmF5Lm4sdGhpcy5kKmF5LmQpfSxzdWI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaHkodCxlKSxjeSh0aGlzLnMqdGhpcy5uKmF5LmQtYXkucyp0aGlzLmQqYXkubix0aGlzLmQqYXkuZCl9LG11bDpmdW5jdGlvbih0LGUpe3JldHVybiBoeSh0LGUpLGN5KHRoaXMucypheS5zKnRoaXMubipheS5uLHRoaXMuZCpheS5kKX0sZGl2OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGh5KHQsZSksY3kodGhpcy5zKmF5LnMqdGhpcy5uKmF5LmQsdGhpcy5kKmF5Lm4pfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBjeSh0aGlzLnMqdGhpcy5uLHRoaXMuZCl9LG1vZDpmdW5jdGlvbih0LGUpe2lmKGlzTmFOKHRoaXMubil8fGlzTmFOKHRoaXMuZCkpcmV0dXJuIG5ldyBweShOYU4pO2lmKHZvaWQgMD09PXQpcmV0dXJuIGN5KHRoaXMucyp0aGlzLm4ldGhpcy5kLDEpO2lmKGh5KHQsZSksMD09PWF5Lm4mJjA9PT10aGlzLmQpdGhyb3cgZHkoKTtyZXR1cm4gY3kodGhpcy5zKihheS5kKnRoaXMubiklKGF5Lm4qdGhpcy5kKSxheS5kKnRoaXMuZCl9LGdjZDpmdW5jdGlvbih0LGUpe3JldHVybiBoeSh0LGUpLGN5KGZ5KGF5Lm4sdGhpcy5uKSpmeShheS5kLHRoaXMuZCksYXkuZCp0aGlzLmQpfSxsY206ZnVuY3Rpb24odCxlKXtyZXR1cm4gaHkodCxlKSwwPT09YXkubiYmMD09PXRoaXMubj9jeSgwLDEpOmN5KGF5Lm4qdGhpcy5uLGZ5KGF5Lm4sdGhpcy5uKSpmeShheS5kLHRoaXMuZCkpfSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KDEwLHR8fDApLGlzTmFOKHRoaXMubil8fGlzTmFOKHRoaXMuZCk/bmV3IHB5KE5hTik6Y3koTWF0aC5jZWlsKHQqdGhpcy5zKnRoaXMubi90aGlzLmQpLHQpfSxmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLnBvdygxMCx0fHwwKSxpc05hTih0aGlzLm4pfHxpc05hTih0aGlzLmQpP25ldyBweShOYU4pOmN5KE1hdGguZmxvb3IodCp0aGlzLnMqdGhpcy5uL3RoaXMuZCksdCl9LHJvdW5kOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KDEwLHR8fDApLGlzTmFOKHRoaXMubil8fGlzTmFOKHRoaXMuZCk/bmV3IHB5KE5hTik6Y3koTWF0aC5yb3VuZCh0KnRoaXMucyp0aGlzLm4vdGhpcy5kKSx0KX0scm91bmRUbzpmdW5jdGlvbih0LGUpe3JldHVybiBoeSh0LGUpLGN5KHRoaXMucypNYXRoLnJvdW5kKHRoaXMubipheS5kLyh0aGlzLmQqYXkubikpKmF5Lm4sYXkuZCl9LGludmVyc2U6ZnVuY3Rpb24oKXtyZXR1cm4gY3kodGhpcy5zKnRoaXMuZCx0aGlzLm4pfSxwb3c6ZnVuY3Rpb24odCxlKXtpZihoeSh0LGUpLDE9PT1heS5kKXJldHVybiBheS5zPDA/Y3koTWF0aC5wb3codGhpcy5zKnRoaXMuZCxheS5uKSxNYXRoLnBvdyh0aGlzLm4sYXkubikpOmN5KE1hdGgucG93KHRoaXMucyp0aGlzLm4sYXkubiksTWF0aC5wb3codGhpcy5kLGF5Lm4pKTtpZih0aGlzLnM8MClyZXR1cm4gbnVsbDt2YXIgbj1seSh0aGlzLm4pLHI9bHkodGhpcy5kKSxpPTEsbz0xO2Zvcih2YXIgcyBpbiBuKWlmKCIxIiE9PXMpe2lmKCIwIj09PXMpe2k9MDticmVha31pZihuW3NdKj1heS5uLG5bc10lYXkuZCE9MClyZXR1cm4gbnVsbDtuW3NdLz1heS5kLGkqPU1hdGgucG93KHMsbltzXSl9Zm9yKHZhciBzIGluIHIpaWYoIjEiIT09cyl7aWYocltzXSo9YXkubixyW3NdJWF5LmQhPTApcmV0dXJuIG51bGw7cltzXS89YXkuZCxvKj1NYXRoLnBvdyhzLHJbc10pfXJldHVybiBheS5zPDA/Y3kobyxpKTpjeShpLG8pfSxlcXVhbHM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaHkodCxlKSx0aGlzLnMqdGhpcy5uKmF5LmQ9PWF5LnMqYXkubip0aGlzLmR9LGNvbXBhcmU6ZnVuY3Rpb24odCxlKXtoeSh0LGUpO3ZhciBuPXRoaXMucyp0aGlzLm4qYXkuZC1heS5zKmF5Lm4qdGhpcy5kO3JldHVybigwPG4pLShuPDApfSxzaW1wbGlmeTpmdW5jdGlvbih0KXtpZihpc05hTih0aGlzLm4pfHxpc05hTih0aGlzLmQpKXJldHVybiB0aGlzO3Q9dHx8LjAwMTtmb3IodmFyIGU9dGhpcy5hYnMoKSxuPWUudG9Db250aW51ZWQoKSxyPTE7cjxuLmxlbmd0aDtyKyspe2Zvcih2YXIgaT1jeShuW3ItMV0sMSksbz1yLTI7bz49MDtvLS0paT1pLmludmVyc2UoKS5hZGQobltvXSk7aWYoTWF0aC5hYnMoaS5zdWIoZSkudmFsdWVPZigpKTx0KXJldHVybiBpLm11bCh0aGlzLnMpfXJldHVybiB0aGlzfSxkaXZpc2libGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaHkodCxlKSwhKCEoYXkubip0aGlzLmQpfHx0aGlzLm4qYXkuZCUoYXkubip0aGlzLmQpKX0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnMqdGhpcy5uL3RoaXMuZH0sdG9GcmFjdGlvbjpmdW5jdGlvbih0KXt2YXIgZSxuPSIiLHI9dGhpcy5uLGk9dGhpcy5kO3JldHVybiB0aGlzLnM8MCYmKG4rPSItIiksMT09PWk/bis9cjoodCYmKGU9TWF0aC5mbG9vcihyL2kpKT4wJiYobis9ZSxuKz0iICIsciU9aSksbis9cixuKz0iLyIsbis9aSksbn0sdG9MYXRleDpmdW5jdGlvbih0KXt2YXIgZSxuPSIiLHI9dGhpcy5uLGk9dGhpcy5kO3JldHVybiB0aGlzLnM8MCYmKG4rPSItIiksMT09PWk/bis9cjoodCYmKGU9TWF0aC5mbG9vcihyL2kpKT4wJiYobis9ZSxyJT1pKSxuKz0iXFxmcmFjeyIsbis9cixuKz0ifXsiLG4rPWksbis9In0iKSxufSx0b0NvbnRpbnVlZDpmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5uLG49dGhpcy5kLHI9W107aWYoaXNOYU4oZSl8fGlzTmFOKG4pKXJldHVybiByO2Rve3IucHVzaChNYXRoLmZsb29yKGUvbikpLHQ9ZSVuLGU9bixuPXR9d2hpbGUoMSE9PWUpO3JldHVybiByfSx0b1N0cmluZzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm4sbj10aGlzLmQ7aWYoaXNOYU4oZSl8fGlzTmFOKG4pKXJldHVybiJOYU4iO3Q9dHx8MTU7dmFyIHI9ZnVuY3Rpb24odCxlKXtmb3IoO2UlMj09MDtlLz0yKTtmb3IoO2UlNT09MDtlLz01KTtpZigxPT09ZSlyZXR1cm4gMDtmb3IodmFyIG49MTAlZSxyPTE7MSE9PW47cisrKWlmKG49MTAqbiVlLHI+MmUzKXJldHVybiAwO3JldHVybiByfSgwLG4pLGk9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0xLGk9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0xO2U+MDt0PXQqdCVuLGU+Pj0xKTEmZSYmKHI9cip0JW4pO3JldHVybiByfSgxMCxuLGUpLG89MDtvPDMwMDtvKyspe2lmKHI9PT1pKXJldHVybiBvO3I9MTAqciVlLGk9MTAqaSVlfXJldHVybiAwfSgwLG4sciksbz10aGlzLnM8MD8iLSI6IiI7aWYobys9ZS9ufDAsZSU9biwoZSo9MTApJiYobys9Ii4iKSxyKXtmb3IodmFyIHM9aTtzLS07KW8rPWUvbnwwLGUlPW4sZSo9MTA7bys9IigiO2ZvcihzPXI7cy0tOylvKz1lL258MCxlJT1uLGUqPTEwO28rPSIpIn1lbHNlIGZvcihzPXQ7ZSYmcy0tOylvKz1lL258MCxlJT1uLGUqPTEwO3JldHVybiBvfX07dmFyIG15PWlkKCJGcmFjdGlvbiIsW10sKCgpPT4oT2JqZWN0LmRlZmluZVByb3BlcnR5KHB5LCJuYW1lIix7dmFsdWU6IkZyYWN0aW9uIn0pLHB5LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1weSxweS5wcm90b3R5cGUudHlwZT0iRnJhY3Rpb24iLHB5LnByb3RvdHlwZS5pc0ZyYWN0aW9uPSEwLHB5LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJGcmFjdGlvbiIsbjp0aGlzLnMqdGhpcy5uLGQ6dGhpcy5kfX0scHkuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBweSh0KX0scHkpKSx7aXNDbGFzczohMH0pLHZ5PWlkKCJNYXRyaXgiLFtdLCgoKT0+e2Z1bmN0aW9uIHQoKXtpZighKHRoaXMgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpfXJldHVybiB0LnByb3RvdHlwZS50eXBlPSJNYXRyaXgiLHQucHJvdG90eXBlLmlzTWF0cml4PSEwLHQucHJvdG90eXBlLnN0b3JhZ2U9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc3RvcmFnZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuZGF0YXR5cGU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgZGF0YXR5cGUgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBjcmVhdGUgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnN1YnNldD1mdW5jdGlvbih0LGUsbil7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHN1YnNldCBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBnZXQgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUsbil7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHNldCBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHJlc2l6ZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUucmVzaGFwZT1mdW5jdGlvbih0LGUpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSByZXNoYXBlIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBjbG9uZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzaXplIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgbWFwIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBmb3JFYWNoIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaXRlcmF0ZSBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSB0b0FycmF5IG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS52YWx1ZU9mPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHZhbHVlT2Ygb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgZm9ybWF0IG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSB0b1N0cmluZyBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdH0pLHtpc0NsYXNzOiEwfSk7ZnVuY3Rpb24gX3kodCl7cmV0dXJuIE9iamVjdC5rZXlzKHQuc2lnbmF0dXJlc3x8e30pLnJlZHVjZSgoZnVuY3Rpb24odCxlKXt2YXIgbj0oZS5tYXRjaCgvLC9nKXx8W10pLmxlbmd0aCsxO3JldHVybiBNYXRoLm1heCh0LG4pfSksLTEpfXZhciB4eT1pZCgiRGVuc2VNYXRyaXgiLFsiTWF0cml4Il0sKHQ9Pnt2YXJ7TWF0cml4OmV9PXQ7ZnVuY3Rpb24gbih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG4pKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIik7aWYoZSYmIWpmKGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBkYXRhdHlwZTogIitlKTtpZihxZih0KSkiRGVuc2VNYXRyaXgiPT09dC50eXBlPyh0aGlzLl9kYXRhPXdwKHQuX2RhdGEpLHRoaXMuX3NpemU9d3AodC5fc2l6ZSksdGhpcy5fZGF0YXR5cGU9ZXx8dC5fZGF0YXR5cGUpOih0aGlzLl9kYXRhPXQudG9BcnJheSgpLHRoaXMuX3NpemU9dC5zaXplKCksdGhpcy5fZGF0YXR5cGU9ZXx8dC5fZGF0YXR5cGUpO2Vsc2UgaWYodCYmVWYodC5kYXRhKSYmVWYodC5zaXplKSl0aGlzLl9kYXRhPXQuZGF0YSx0aGlzLl9zaXplPXQuc2l6ZSxIcCh0aGlzLl9kYXRhLHRoaXMuX3NpemUpLHRoaXMuX2RhdGF0eXBlPWV8fHQuZGF0YXR5cGU7ZWxzZSBpZihVZih0KSl0aGlzLl9kYXRhPWEodCksdGhpcy5fc2l6ZT1YcCh0aGlzLl9kYXRhKSxIcCh0aGlzLl9kYXRhLHRoaXMuX3NpemUpLHRoaXMuX2RhdGF0eXBlPWU7ZWxzZXtpZih0KXRocm93IG5ldyBUeXBlRXJyb3IoIlVuc3VwcG9ydGVkIHR5cGUgb2YgZGF0YSAoIit4cCh0KSsiKSIpO3RoaXMuX2RhdGE9W10sdGhpcy5fc2l6ZT1bMF0sdGhpcy5fZGF0YXR5cGU9ZX19ZnVuY3Rpb24gcih0LGUsbixpKXt2YXIgbz1pPT09bi0xLHM9ZS5kaW1lbnNpb24oaSk7cmV0dXJuIG8/cy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBacChlLHQubGVuZ3RoKSx0W2VdfSkpLnZhbHVlT2YoKTpzLm1hcCgoZnVuY3Rpb24obyl7cmV0dXJuIFpwKG8sdC5sZW5ndGgpLHIodFtvXSxlLG4saSsxKX0pKS52YWx1ZU9mKCl9ZnVuY3Rpb24gaSh0LGUsbixyLG8pe3ZhciBzPW89PT1yLTEsYT1lLmRpbWVuc2lvbihvKTtzP2EuZm9yRWFjaCgoZnVuY3Rpb24oZSxyKXtacChlKSx0W2VdPW5bclswXV19KSk6YS5mb3JFYWNoKChmdW5jdGlvbihzLGEpe1pwKHMpLGkodFtzXSxlLG5bYVswXV0scixvKzEpfSkpfWZ1bmN0aW9uIG8odCxlLG4pe2lmKDA9PT1lLmxlbmd0aCl7Zm9yKHZhciByPXQuX2RhdGE7VWYocik7KXI9clswXTtyZXR1cm4gcn1yZXR1cm4gdC5fc2l6ZT1lLnNsaWNlKDApLHQuX2RhdGE9S3AodC5fZGF0YSx0Ll9zaXplLG4pLHR9ZnVuY3Rpb24gcyh0LGUsbil7Zm9yKHZhciByPXQuX3NpemUuc2xpY2UoMCksaT0hMTtyLmxlbmd0aDxlLmxlbmd0aDspci5wdXNoKDApLGk9ITA7Zm9yKHZhciBzPTAsYT1lLmxlbmd0aDtzPGE7cysrKWVbc10+cltzXSYmKHJbc109ZVtzXSxpPSEwKTtpJiZvKHQscixuKX1mdW5jdGlvbiBhKHQpe2Zvcih2YXIgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl7dmFyIHI9dFtlXTtVZihyKT90W2VdPWEocik6ciYmITA9PT1yLmlzTWF0cml4JiYodFtlXT1hKHIudmFsdWVPZigpKSl9cmV0dXJuIHR9cmV0dXJuIG4ucHJvdG90eXBlPW5ldyBlLG4ucHJvdG90eXBlLmNyZWF0ZURlbnNlTWF0cml4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBuKHQsZSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJuYW1lIix7dmFsdWU6IkRlbnNlTWF0cml4In0pLG4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPW4sbi5wcm90b3R5cGUudHlwZT0iRGVuc2VNYXRyaXgiLG4ucHJvdG90eXBlLmlzRGVuc2VNYXRyaXg9ITAsbi5wcm90b3R5cGUuZ2V0RGF0YVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gcmQodGhpcy5fZGF0YSx4cCl9LG4ucHJvdG90eXBlLnN0b3JhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4iZGVuc2UifSxuLnByb3RvdHlwZS5kYXRhdHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhdHlwZX0sbi5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBuKHQsZSl9LG4ucHJvdG90eXBlLnN1YnNldD1mdW5jdGlvbih0LGUsbyl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighV2YoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBpbmRleCIpO3ZhciBpPWUuaXNTY2FsYXIoKTtpZihpKXJldHVybiB0LmdldChlLm1pbigpKTt2YXIgbz1lLnNpemUoKTtpZihvLmxlbmd0aCE9PXQuX3NpemUubGVuZ3RoKXRocm93IG5ldyBHcChvLmxlbmd0aCx0Ll9zaXplLmxlbmd0aCk7Zm9yKHZhciBzPWUubWluKCksYT1lLm1heCgpLHU9MCxjPXQuX3NpemUubGVuZ3RoO3U8Yzt1KyspWnAoc1t1XSx0Ll9zaXplW3VdKSxacChhW3VdLHQuX3NpemVbdV0pO3JldHVybiBuZXcgbihyKHQuX2RhdGEsZSxvLmxlbmd0aCwwKSx0Ll9kYXRhdHlwZSl9KHRoaXMsdCk7Y2FzZSAyOmNhc2UgMzpyZXR1cm4gZnVuY3Rpb24odCxlLG4scil7aWYoIWV8fCEwIT09ZS5pc0luZGV4KXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaW5kZXgiKTt2YXIgbyxhPWUuc2l6ZSgpLHU9ZS5pc1NjYWxhcigpO2lmKHFmKG4pPyhvPW4uc2l6ZSgpLG49bi52YWx1ZU9mKCkpOm89WHAobiksdSl7aWYoMCE9PW8ubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlNjYWxhciBleHBlY3RlZCIpO3Quc2V0KGUubWluKCksbixyKX1lbHNle2lmKGEubGVuZ3RoPHQuX3NpemUubGVuZ3RoKXRocm93IG5ldyBHcChhLmxlbmd0aCx0Ll9zaXplLmxlbmd0aCwiPCIpO2lmKG8ubGVuZ3RoPGEubGVuZ3RoKXtmb3IodmFyIGM9MCxsPTA7MT09PWFbY10mJjE9PT1vW2NdOyljKys7Zm9yKDsxPT09YVtjXTspbCsrLGMrKztuPWVkKG4sYS5sZW5ndGgsbCxvKX1pZighYnAoYSxvKSl0aHJvdyBuZXcgR3AoYSxvLCI+Iik7cyh0LGUubWF4KCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdCsxfSkpLHIpO3ZhciBoPWEubGVuZ3RoLGY9MDtpKHQuX2RhdGEsZSxuLGgsZil9cmV0dXJuIHR9KHRoaXMsdCxlLG8pO2RlZmF1bHQ6dGhyb3cgbmV3IFN5bnRheEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIil9fSxuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYoIVVmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkIik7aWYodC5sZW5ndGghPT10aGlzLl9zaXplLmxlbmd0aCl0aHJvdyBuZXcgR3AodC5sZW5ndGgsdGhpcy5fc2l6ZS5sZW5ndGgpO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKVpwKHRbZV0sdGhpcy5fc2l6ZVtlXSk7Zm9yKHZhciBuPXRoaXMuX2RhdGEscj0wLGk9dC5sZW5ndGg7cjxpO3IrKyl7dmFyIG89dFtyXTtacChvLG4ubGVuZ3RoKSxuPW5bb119cmV0dXJuIG59LG4ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUsbil7aWYoIVVmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkIik7aWYodC5sZW5ndGg8dGhpcy5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKHQubGVuZ3RoLHRoaXMuX3NpemUubGVuZ3RoLCI8Iik7dmFyIHIsaSxvO3ModGhpcyx0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQrMX0pKSxuKTt2YXIgYT10aGlzLl9kYXRhO2ZvcihyPTAsaT10Lmxlbmd0aC0xO3I8aTtyKyspWnAobz10W3JdLGEubGVuZ3RoKSxhPWFbb107cmV0dXJuIFpwKG89dFt0Lmxlbmd0aC0xXSxhLmxlbmd0aCksYVtvXT1lLHRoaXN9LG4ucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUsbil7aWYoIVZmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IG9yIE1hdHJpeCBleHBlY3RlZCIpO3ZhciByPXQudmFsdWVPZigpLm1hcCgodD0+QXJyYXkuaXNBcnJheSh0KSYmMT09PXQubGVuZ3RoP3RbMF06dCkpO3JldHVybiBvKG4/dGhpcy5jbG9uZSgpOnRoaXMscixlKX0sbi5wcm90b3R5cGUucmVzaGFwZT1mdW5jdGlvbih0LGUpe3ZhciBuPWU/dGhpcy5jbG9uZSgpOnRoaXM7bi5fZGF0YT1RcChuLl9kYXRhLHQpO3ZhciByPW4uX3NpemUucmVkdWNlKCgodCxlKT0+dCplKSk7cmV0dXJuIG4uX3NpemU9JHAodCxyKSxufSxuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgbih7ZGF0YTp3cCh0aGlzLl9kYXRhKSxzaXplOndwKHRoaXMuX3NpemUpLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfSl9LG4ucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZS5zbGljZSgwKX0sbi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMscj1feSh0KSxpPWZ1bmN0aW9uIG4oaSxvKXtyZXR1cm4gVWYoaSk/aS5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odCxvLmNvbmNhdChlKSl9KSk6MT09PXI/dChpKToyPT09cj90KGksbyk6dChpLG8sZSl9KHRoaXMuX2RhdGEsW10pO3JldHVybiBuZXcgbihpLHZvaWQgMCE9PXRoaXMuX2RhdGF0eXBlP3JkKGkseHApOnZvaWQgMCl9LG4ucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczshZnVuY3Rpb24gbihyLGkpe1VmKHIpP3IuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtuKHQsaS5jb25jYXQoZSkpfSkpOnQocixpLGUpfSh0aGlzLl9kYXRhLFtdKX0sbi5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbiooKXt5aWVsZCpmdW5jdGlvbip0KGUsbil7aWYoVWYoZSkpZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspeWllbGQqdChlW3JdLG4uY29uY2F0KHIpKTtlbHNlIHlpZWxke3ZhbHVlOmUsaW5kZXg6bn19KHRoaXMuX2RhdGEsW10pfSxuLnByb3RvdHlwZS5yb3dzPWZ1bmN0aW9uKCl7dmFyIHQ9W107aWYoMiE9PXRoaXMuc2l6ZSgpLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJSb3dzIGNhbiBvbmx5IGJlIHJldHVybmVkIGZvciBhIDJEIG1hdHJpeC4iKTt2YXIgZT10aGlzLl9kYXRhO2Zvcih2YXIgciBvZiBlKXQucHVzaChuZXcgbihbcl0sdGhpcy5fZGF0YXR5cGUpKTtyZXR1cm4gdH0sbi5wcm90b3R5cGUuY29sdW1ucz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1bXSxyPXRoaXMuc2l6ZSgpO2lmKDIhPT1yLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJSb3dzIGNhbiBvbmx5IGJlIHJldHVybmVkIGZvciBhIDJEIG1hdHJpeC4iKTtmb3IodmFyIGk9dGhpcy5fZGF0YSxvPWZ1bmN0aW9uKHIpe3ZhciBvPWkubWFwKCh0PT5bdFtyXV0pKTtlLnB1c2gobmV3IG4obyx0Ll9kYXRhdHlwZSkpfSxzPTA7czxyWzFdO3MrKylvKHMpO3JldHVybiBlfSxuLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHdwKHRoaXMuX2RhdGEpfSxuLnByb3RvdHlwZS52YWx1ZU9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9LG4ucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gcXAodGhpcy5fZGF0YSx0KX0sbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gcXAodGhpcy5fZGF0YSl9LG4ucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkRlbnNlTWF0cml4IixkYXRhOnRoaXMuX2RhdGEsc2l6ZTp0aGlzLl9zaXplLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfX0sbi5wcm90b3R5cGUuZGlhZ29uYWw9ZnVuY3Rpb24odCl7aWYodCl7aWYoUmYodCkmJih0PXQudG9OdW1iZXIoKSksIVBmKHQpfHwhTXAodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHBhcmFtZXRlciBrIG11c3QgYmUgYW4gaW50ZWdlciBudW1iZXIiKX1lbHNlIHQ9MDtmb3IodmFyIGU9dD4wP3Q6MCxyPXQ8MD8tdDowLGk9dGhpcy5fc2l6ZVswXSxvPXRoaXMuX3NpemVbMV0scz1NYXRoLm1pbihpLXIsby1lKSxhPVtdLHU9MDt1PHM7dSsrKWFbdV09dGhpcy5fZGF0YVt1K3JdW3UrZV07cmV0dXJuIG5ldyBuKHtkYXRhOmEsc2l6ZTpbc10sZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9KX0sbi5kaWFnb25hbD1mdW5jdGlvbih0LGUscixpKXtpZighVWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQsIHNpemUgcGFyYW1ldGVyIik7aWYoMiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSB0d28gZGltZW5zaW9ucyBtYXRyaXggYXJlIHN1cHBvcnRlZCIpO2lmKHQ9dC5tYXAoKGZ1bmN0aW9uKHQpe2lmKFJmKHQpJiYodD10LnRvTnVtYmVyKCkpLCFQZih0KXx8IU1wKHQpfHx0PDEpdGhyb3cgbmV3IEVycm9yKCJTaXplIHZhbHVlcyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzIik7cmV0dXJuIHR9KSkscil7aWYoUmYocikmJihyPXIudG9OdW1iZXIoKSksIVBmKHIpfHwhTXAocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHBhcmFtZXRlciBrIG11c3QgYmUgYW4gaW50ZWdlciBudW1iZXIiKX1lbHNlIHI9MDt2YXIgbyxzPXI+MD9yOjAsYT1yPDA/LXI6MCx1PXRbMF0sYz10WzFdLGw9TWF0aC5taW4odS1hLGMtcyk7aWYoVWYoZSkpe2lmKGUubGVuZ3RoIT09bCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdmFsdWUgYXJyYXkgbGVuZ3RoIik7bz1mdW5jdGlvbih0KXtyZXR1cm4gZVt0XX19ZWxzZSBpZihxZihlKSl7dmFyIGg9ZS5zaXplKCk7aWYoMSE9PWgubGVuZ3RofHxoWzBdIT09bCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbWF0cml4IGxlbmd0aCIpO289ZnVuY3Rpb24odCl7cmV0dXJuIGUuZ2V0KFt0XSl9fWVsc2Ugbz1mdW5jdGlvbigpe3JldHVybiBlfTtpfHwoaT1SZihvKDApKT9vKDApLm11bCgwKTowKTt2YXIgZj1bXTtpZih0Lmxlbmd0aD4wKXtmPUtwKGYsdCxpKTtmb3IodmFyIHA9MDtwPGw7cCsrKWZbcCthXVtwK3NdPW8ocCl9cmV0dXJuIG5ldyBuKHtkYXRhOmYsc2l6ZTpbdSxjXX0pfSxuLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbih0KX0sbi5wcm90b3R5cGUuc3dhcFJvd3M9ZnVuY3Rpb24odCxlKXtpZighKFBmKHQpJiZNcCh0KSYmUGYoZSkmJk1wKGUpKSl0aHJvdyBuZXcgRXJyb3IoIlJvdyBpbmRleCBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzIik7aWYoMiE9PXRoaXMuX3NpemUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSB0d28gZGltZW5zaW9uYWwgbWF0cml4IGlzIHN1cHBvcnRlZCIpO3JldHVybiBacCh0LHRoaXMuX3NpemVbMF0pLFpwKGUsdGhpcy5fc2l6ZVswXSksbi5fc3dhcFJvd3ModCxlLHRoaXMuX2RhdGEpLHRoaXN9LG4uX3N3YXBSb3dzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uW3RdO25bdF09bltlXSxuW2VdPXJ9LG59KSx7aXNDbGFzczohMH0pO2Z1bmN0aW9uIHd5KHQsZSxuKXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQubWFwP3QubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gd3kodCxlKX0pKTplKHQpfXZhciBieT0iaXNJbnRlZ2VyIixEeT1pZChieSxbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZShieSx7bnVtYmVyOk1wLEJpZ051bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4gdC5pc0ludCgpfSxGcmFjdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQuZCYmaXNGaW5pdGUodC5uKX0sIkFycmF5IHwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT5lPT53eShlLHQpKSl9KX0pKSxFeT0ibnVtYmVyLCBudW1iZXIiO2Z1bmN0aW9uIEN5KHQsZSl7cmV0dXJuIHQrZX1mdW5jdGlvbiBTeSh0LGUpe3JldHVybiB0KmV9ZnVuY3Rpb24gQXkodCxlLG4pe2lmKG51bGw9PW4pcmV0dXJuIHQuZXEoZSk7aWYodC5lcShlKSlyZXR1cm4hMDtpZih0LmlzTmFOKCl8fGUuaXNOYU4oKSlyZXR1cm4hMTtpZih0LmlzRmluaXRlKCkmJmUuaXNGaW5pdGUoKSl7dmFyIHI9dC5taW51cyhlKS5hYnMoKTtpZihyLmlzWmVybygpKXJldHVybiEwO3ZhciBpPXQuY29uc3RydWN0b3IubWF4KHQuYWJzKCksZS5hYnMoKSk7cmV0dXJuIHIubHRlKGkudGltZXMobikpfXJldHVybiExfUN5LnNpZ25hdHVyZT1FeSxTeS5zaWduYXR1cmU9RXk7dmFyIE55PWlkKCJjb21wYXJlVW5pdHMiLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybnsiVW5pdCwgVW5pdCI6ZS5yZWZlclRvU2VsZigodD0+KG4scik9PntpZighbi5lcXVhbEJhc2UocikpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29tcGFyZSB1bml0cyB3aXRoIGRpZmZlcmVudCBiYXNlIik7cmV0dXJuIGUuZmluZCh0LFtuLnZhbHVlVHlwZSgpLHIudmFsdWVUeXBlKCldKShuLnZhbHVlLHIudmFsdWUpfSkpfX0pKSxJeT0iZXF1YWxTY2FsYXIiLE15PWlkKEl5LFsidHlwZWQiLCJjb25maWciXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpufT10LHI9Tnkoe3R5cGVkOmV9KTtyZXR1cm4gZShJeSx7ImJvb2xlYW4sIGJvb2xlYW4iOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfSwibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGtwKHQsZSxuLmVwc2lsb24pfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZXEoZSl8fEF5KHQsZSxuLmVwc2lsb24pfSwiRnJhY3Rpb24sIEZyYWN0aW9uIjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmVxdWFscyhlKX0sIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4ga3AodC5yZSxlLnJlLG4pJiZrcCh0LmltLGUuaW0sbil9KHQsZSxuLmVwc2lsb24pfX0scil9KSk7aWQoSXksWyJ0eXBlZCIsImNvbmZpZyJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm59PXQ7cmV0dXJuIGUoSXkseyJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4ga3AodCxlLG4uZXBzaWxvbil9fSl9KSk7dmFyIEZ5PWlkKCJTcGFyc2VNYXRyaXgiLFsidHlwZWQiLCJlcXVhbFNjYWxhciIsIk1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsZXF1YWxTY2FsYXI6bixNYXRyaXg6cn09dDtmdW5jdGlvbiBpKHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgaSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3IiKTtpZihlJiYhamYoZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRhdGF0eXBlOiAiK2UpO2lmKHFmKHQpKSFmdW5jdGlvbih0LGUsbil7IlNwYXJzZU1hdHJpeCI9PT1lLnR5cGU/KHQuX3ZhbHVlcz1lLl92YWx1ZXM/d3AoZS5fdmFsdWVzKTp2b2lkIDAsdC5faW5kZXg9d3AoZS5faW5kZXgpLHQuX3B0cj13cChlLl9wdHIpLHQuX3NpemU9d3AoZS5fc2l6ZSksdC5fZGF0YXR5cGU9bnx8ZS5fZGF0YXR5cGUpOm8odCxlLnZhbHVlT2YoKSxufHxlLl9kYXRhdHlwZSl9KHRoaXMsdCxlKTtlbHNlIGlmKHQmJlVmKHQuaW5kZXgpJiZVZih0LnB0cikmJlVmKHQuc2l6ZSkpdGhpcy5fdmFsdWVzPXQudmFsdWVzLHRoaXMuX2luZGV4PXQuaW5kZXgsdGhpcy5fcHRyPXQucHRyLHRoaXMuX3NpemU9dC5zaXplLHRoaXMuX2RhdGF0eXBlPWV8fHQuZGF0YXR5cGU7ZWxzZSBpZihVZih0KSlvKHRoaXMsdCxlKTtlbHNle2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSBvZiBkYXRhICgiK3hwKHQpKyIpIik7dGhpcy5fdmFsdWVzPVtdLHRoaXMuX2luZGV4PVtdLHRoaXMuX3B0cj1bMF0sdGhpcy5fc2l6ZT1bMCwwXSx0aGlzLl9kYXRhdHlwZT1lfX1mdW5jdGlvbiBvKHQscixpKXt0Ll92YWx1ZXM9W10sdC5faW5kZXg9W10sdC5fcHRyPVtdLHQuX2RhdGF0eXBlPWk7dmFyIG89ci5sZW5ndGgscz0wLGE9bix1PTA7aWYoamYoaSkmJihhPWUuZmluZChuLFtpLGldKXx8bix1PWUuY29udmVydCgwLGkpKSxvPjApe3ZhciBjPTA7ZG97dC5fcHRyLnB1c2godC5faW5kZXgubGVuZ3RoKTtmb3IodmFyIGw9MDtsPG87bCsrKXt2YXIgaD1yW2xdO2lmKFVmKGgpKXtpZigwPT09YyYmczxoLmxlbmd0aCYmKHM9aC5sZW5ndGgpLGM8aC5sZW5ndGgpe3ZhciBmPWhbY107YShmLHUpfHwodC5fdmFsdWVzLnB1c2goZiksdC5faW5kZXgucHVzaChsKSl9fWVsc2UgMD09PWMmJnM8MSYmKHM9MSksYShoLHUpfHwodC5fdmFsdWVzLnB1c2goaCksdC5faW5kZXgucHVzaChsKSl9YysrfXdoaWxlKGM8cyl9dC5fcHRyLnB1c2godC5faW5kZXgubGVuZ3RoKSx0Ll9zaXplPVtvLHNdfWZ1bmN0aW9uIHModCxlLG4scil7aWYobi1lPT0wKXJldHVybiBuO2Zvcih2YXIgaT1lO2k8bjtpKyspaWYocltpXT09PXQpcmV0dXJuIGk7cmV0dXJuIGV9ZnVuY3Rpb24gYSh0LGUsbixyLGksbyxzKXtpLnNwbGljZSh0LDAsciksby5zcGxpY2UodCwwLGUpO2Zvcih2YXIgYT1uKzE7YTxzLmxlbmd0aDthKyspc1thXSsrfWZ1bmN0aW9uIHUodCxyLGksbyl7dmFyIHM9b3x8MCxhPW4sdT0wO2pmKHQuX2RhdGF0eXBlKSYmKGE9ZS5maW5kKG4sW3QuX2RhdGF0eXBlLHQuX2RhdGF0eXBlXSl8fG4sdT1lLmNvbnZlcnQoMCx0Ll9kYXRhdHlwZSkscz1lLmNvbnZlcnQocyx0Ll9kYXRhdHlwZSkpO3ZhciBjLGwsaCxmPSFhKHMsdSkscD10Ll9zaXplWzBdLGQ9dC5fc2l6ZVsxXTtpZihpPmQpe2ZvcihsPWQ7bDxpO2wrKylpZih0Ll9wdHJbbF09dC5fdmFsdWVzLmxlbmd0aCxmKWZvcihjPTA7YzxwO2MrKyl0Ll92YWx1ZXMucHVzaChzKSx0Ll9pbmRleC5wdXNoKGMpO3QuX3B0cltpXT10Ll92YWx1ZXMubGVuZ3RofWVsc2UgaTxkJiYodC5fcHRyLnNwbGljZShpKzEsZC1pKSx0Ll92YWx1ZXMuc3BsaWNlKHQuX3B0cltpXSx0Ll92YWx1ZXMubGVuZ3RoKSx0Ll9pbmRleC5zcGxpY2UodC5fcHRyW2ldLHQuX2luZGV4Lmxlbmd0aCkpO2lmKGQ9aSxyPnApe2lmKGYpe3ZhciBnPTA7Zm9yKGw9MDtsPGQ7bCsrKXt0Ll9wdHJbbF09dC5fcHRyW2xdK2csaD10Ll9wdHJbbCsxXStnO3ZhciB5PTA7Zm9yKGM9cDtjPHI7YysrLHkrKyl0Ll92YWx1ZXMuc3BsaWNlKGgreSwwLHMpLHQuX2luZGV4LnNwbGljZShoK3ksMCxjKSxnKyt9dC5fcHRyW2RdPXQuX3ZhbHVlcy5sZW5ndGh9fWVsc2UgaWYocjxwKXt2YXIgbT0wO2ZvcihsPTA7bDxkO2wrKyl7dC5fcHRyW2xdPXQuX3B0cltsXS1tO3ZhciB2PXQuX3B0cltsXSxfPXQuX3B0cltsKzFdLW07Zm9yKGg9djtoPF87aCsrKShjPXQuX2luZGV4W2hdKT5yLTEmJih0Ll92YWx1ZXMuc3BsaWNlKGgsMSksdC5faW5kZXguc3BsaWNlKGgsMSksbSsrKX10Ll9wdHJbbF09dC5fdmFsdWVzLmxlbmd0aH1yZXR1cm4gdC5fc2l6ZVswXT1yLHQuX3NpemVbMV09aSx0fWZ1bmN0aW9uIGModCxlLG4scixpKXt2YXIgbyxzLGE9clswXSx1PXJbMV0sYz1bXTtmb3Iobz0wO288YTtvKyspZm9yKGNbb109W10scz0wO3M8dTtzKyspY1tvXVtzXT0wO2ZvcihzPTA7czx1O3MrKylmb3IodmFyIGw9bltzXSxoPW5bcysxXSxmPWw7ZjxoO2YrKyljW289ZVtmXV1bc109dD9pP3dwKHRbZl0pOnRbZl06MTtyZXR1cm4gY31yZXR1cm4gaS5wcm90b3R5cGU9bmV3IHIsaS5wcm90b3R5cGUuY3JlYXRlU3BhcnNlTWF0cml4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBpKHQsZSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCJuYW1lIix7dmFsdWU6IlNwYXJzZU1hdHJpeCJ9KSxpLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLnR5cGU9IlNwYXJzZU1hdHJpeCIsaS5wcm90b3R5cGUuaXNTcGFyc2VNYXRyaXg9ITAsaS5wcm90b3R5cGUuZ2V0RGF0YVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gcmQodGhpcy5fdmFsdWVzLHhwKX0saS5wcm90b3R5cGUuc3RvcmFnZT1mdW5jdGlvbigpe3JldHVybiJzcGFyc2UifSxpLnByb3RvdHlwZS5kYXRhdHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhdHlwZX0saS5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBpKHQsZSl9LGkucHJvdG90eXBlLmRlbnNpdHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zaXplWzBdLGU9dGhpcy5fc2l6ZVsxXTtyZXR1cm4gMCE9PXQmJjAhPT1lP3RoaXMuX2luZGV4Lmxlbmd0aC8odCplKTowfSxpLnByb3RvdHlwZS5zdWJzZXQ9ZnVuY3Rpb24odCxlLG4pe2lmKCF0aGlzLl92YWx1ZXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHN1YnNldCBvbiBhIFBhdHRlcm4gb25seSBtYXRyaXgiKTtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbih0LGUpe2lmKCFXZihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGluZGV4Iik7dmFyIG49ZS5pc1NjYWxhcigpO2lmKG4pcmV0dXJuIHQuZ2V0KGUubWluKCkpO3ZhciByPWUuc2l6ZSgpO2lmKHIubGVuZ3RoIT09dC5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKHIubGVuZ3RoLHQuX3NpemUubGVuZ3RoKTt2YXIgbyxzLGEsdSxjPWUubWluKCksbD1lLm1heCgpO2ZvcihvPTAscz10Ll9zaXplLmxlbmd0aDtvPHM7bysrKVpwKGNbb10sdC5fc2l6ZVtvXSksWnAobFtvXSx0Ll9zaXplW29dKTt2YXIgaD10Ll92YWx1ZXMsZj10Ll9pbmRleCxwPXQuX3B0cixkPWUuZGltZW5zaW9uKDApLGc9ZS5kaW1lbnNpb24oMSkseT1bXSxtPVtdO2QuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXttW3RdPWVbMF0seVt0XT0hMH0pKTt2YXIgdj1oP1tdOnZvaWQgMCxfPVtdLHg9W107cmV0dXJuIGcuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zm9yKHgucHVzaChfLmxlbmd0aCksYT1wW3RdLHU9cFt0KzFdO2E8dTthKyspbz1mW2FdLCEwPT09eVtvXSYmKF8ucHVzaChtW29dKSx2JiZ2LnB1c2goaFthXSkpfSkpLHgucHVzaChfLmxlbmd0aCksbmV3IGkoe3ZhbHVlczp2LGluZGV4Ol8scHRyOngsc2l6ZTpyLGRhdGF0eXBlOnQuX2RhdGF0eXBlfSl9KHRoaXMsdCk7Y2FzZSAyOmNhc2UgMzpyZXR1cm4gZnVuY3Rpb24odCxlLG4scil7aWYoIWV8fCEwIT09ZS5pc0luZGV4KXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaW5kZXgiKTt2YXIgaSxvPWUuc2l6ZSgpLHM9ZS5pc1NjYWxhcigpO2lmKHFmKG4pPyhpPW4uc2l6ZSgpLG49bi50b0FycmF5KCkpOmk9WHAobikscyl7aWYoMCE9PWkubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlNjYWxhciBleHBlY3RlZCIpO3Quc2V0KGUubWluKCksbixyKX1lbHNle2lmKDEhPT1vLmxlbmd0aCYmMiE9PW8ubGVuZ3RoKXRocm93IG5ldyBHcChvLmxlbmd0aCx0Ll9zaXplLmxlbmd0aCwiPCIpO2lmKGkubGVuZ3RoPG8ubGVuZ3RoKXtmb3IodmFyIGE9MCx1PTA7MT09PW9bYV0mJjE9PT1pW2FdOylhKys7Zm9yKDsxPT09b1thXTspdSsrLGErKztuPWVkKG4sby5sZW5ndGgsdSxpKX1pZighYnAobyxpKSl0aHJvdyBuZXcgR3AobyxpLCI+Iik7aWYoMT09PW8ubGVuZ3RoKXtlLmRpbWVuc2lvbigwKS5mb3JFYWNoKChmdW5jdGlvbihlLGkpe1pwKGUpLHQuc2V0KFtlLDBdLG5baVswXV0scil9KSl9ZWxzZXt2YXIgYz1lLmRpbWVuc2lvbigwKSxsPWUuZGltZW5zaW9uKDEpO2MuZm9yRWFjaCgoZnVuY3Rpb24oZSxpKXtacChlKSxsLmZvckVhY2goKGZ1bmN0aW9uKG8scyl7WnAobyksdC5zZXQoW2Usb10sbltpWzBdXVtzWzBdXSxyKX0pKX0pKX19cmV0dXJuIHR9KHRoaXMsdCxlLG4pO2RlZmF1bHQ6dGhyb3cgbmV3IFN5bnRheEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIil9fSxpLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYoIVVmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkIik7aWYodC5sZW5ndGghPT10aGlzLl9zaXplLmxlbmd0aCl0aHJvdyBuZXcgR3AodC5sZW5ndGgsdGhpcy5fc2l6ZS5sZW5ndGgpO2lmKCF0aGlzLl92YWx1ZXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGdldCBvbiBhIFBhdHRlcm4gb25seSBtYXRyaXgiKTt2YXIgZT10WzBdLG49dFsxXTtacChlLHRoaXMuX3NpemVbMF0pLFpwKG4sdGhpcy5fc2l6ZVsxXSk7dmFyIHI9cyhlLHRoaXMuX3B0cltuXSx0aGlzLl9wdHJbbisxXSx0aGlzLl9pbmRleCk7cmV0dXJuIHI8dGhpcy5fcHRyW24rMV0mJnRoaXMuX2luZGV4W3JdPT09ZT90aGlzLl92YWx1ZXNbcl06MH0saS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQscixpKXtpZighVWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aCE9PXRoaXMuX3NpemUubGVuZ3RoKXRocm93IG5ldyBHcCh0Lmxlbmd0aCx0aGlzLl9zaXplLmxlbmd0aCk7aWYoIXRoaXMuX3ZhbHVlcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc2V0IG9uIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO3ZhciBvPXRbMF0sYz10WzFdLGw9dGhpcy5fc2l6ZVswXSxoPXRoaXMuX3NpemVbMV0sZj1uLHA9MDtqZih0aGlzLl9kYXRhdHlwZSkmJihmPWUuZmluZChuLFt0aGlzLl9kYXRhdHlwZSx0aGlzLl9kYXRhdHlwZV0pfHxuLHA9ZS5jb252ZXJ0KDAsdGhpcy5fZGF0YXR5cGUpKSwobz5sLTF8fGM+aC0xKSYmKHUodGhpcyxNYXRoLm1heChvKzEsbCksTWF0aC5tYXgoYysxLGgpLGkpLGw9dGhpcy5fc2l6ZVswXSxoPXRoaXMuX3NpemVbMV0pLFpwKG8sbCksWnAoYyxoKTt2YXIgZD1zKG8sdGhpcy5fcHRyW2NdLHRoaXMuX3B0cltjKzFdLHRoaXMuX2luZGV4KTtyZXR1cm4gZDx0aGlzLl9wdHJbYysxXSYmdGhpcy5faW5kZXhbZF09PT1vP2YocixwKT9mdW5jdGlvbih0LGUsbixyLGkpe24uc3BsaWNlKHQsMSksci5zcGxpY2UodCwxKTtmb3IodmFyIG89ZSsxO288aS5sZW5ndGg7bysrKWlbb10tLX0oZCxjLHRoaXMuX3ZhbHVlcyx0aGlzLl9pbmRleCx0aGlzLl9wdHIpOnRoaXMuX3ZhbHVlc1tkXT1yOmYocixwKXx8YShkLG8sYyxyLHRoaXMuX3ZhbHVlcyx0aGlzLl9pbmRleCx0aGlzLl9wdHIpLHRoaXN9LGkucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUsbil7aWYoIVZmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IG9yIE1hdHJpeCBleHBlY3RlZCIpO3ZhciByPXQudmFsdWVPZigpLm1hcCgodD0+QXJyYXkuaXNBcnJheSh0KSYmMT09PXQubGVuZ3RoP3RbMF06dCkpO2lmKDIhPT1yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk9ubHkgdHdvIGRpbWVuc2lvbnMgbWF0cml4IGFyZSBzdXBwb3J0ZWQiKTtyZXR1cm4gci5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighUGYodCl8fCFNcCh0KXx8dDwwKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgc2l6ZSwgbXVzdCBjb250YWluIHBvc2l0aXZlIGludGVnZXJzIChzaXplOiAiK3FwKHIpKyIpIil9KSksdShuP3RoaXMuY2xvbmUoKTp0aGlzLHJbMF0sclsxXSxlKX0saS5wcm90b3R5cGUucmVzaGFwZT1mdW5jdGlvbih0LGUpe2lmKCFVZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCIpO2lmKDIhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlNwYXJzZSBtYXRyaWNlcyBjYW4gb25seSBiZSByZXNoYXBlZCBpbiB0d28gZGltZW5zaW9ucyIpO3QuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoIVBmKGUpfHwhTXAoZSl8fGU8PS0yfHwwPT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIHNpemUsIG11c3QgY29udGFpbiBwb3NpdGl2ZSBpbnRlZ2VycyBvciAtMSAoc2l6ZTogIitxcCh0KSsiKSIpfSkpO3ZhciBuPXRoaXMuX3NpemVbMF0qdGhpcy5fc2l6ZVsxXTtpZihuIT09KHQ9JHAodCxuKSlbMF0qdFsxXSl0aHJvdyBuZXcgRXJyb3IoIlJlc2hhcGluZyBzcGFyc2UgbWF0cml4IHdpbGwgcmVzdWx0IGluIHRoZSB3cm9uZyBudW1iZXIgb2YgZWxlbWVudHMiKTt2YXIgcj1lP3RoaXMuY2xvbmUoKTp0aGlzO2lmKHRoaXMuX3NpemVbMF09PT10WzBdJiZ0aGlzLl9zaXplWzFdPT09dFsxXSlyZXR1cm4gcjtmb3IodmFyIGk9W10sbz0wO288ci5fcHRyLmxlbmd0aDtvKyspZm9yKHZhciB1PTA7dTxyLl9wdHJbbysxXS1yLl9wdHJbb107dSsrKWkucHVzaChvKTtmb3IodmFyIGM9ci5fdmFsdWVzLnNsaWNlKCksbD1yLl9pbmRleC5zbGljZSgpLGg9MDtoPHIuX2luZGV4Lmxlbmd0aDtoKyspe3ZhciBmPWxbaF0scD1pW2hdLGQ9ZipyLl9zaXplWzFdK3A7aVtoXT1kJXRbMV0sbFtoXT1NYXRoLmZsb29yKGQvdFsxXSl9ci5fdmFsdWVzLmxlbmd0aD0wLHIuX2luZGV4Lmxlbmd0aD0wLHIuX3B0ci5sZW5ndGg9dFsxXSsxLHIuX3NpemU9dC5zbGljZSgpO2Zvcih2YXIgZz0wO2c8ci5fcHRyLmxlbmd0aDtnKyspci5fcHRyW2ddPTA7Zm9yKHZhciB5PTA7eTxjLmxlbmd0aDt5Kyspe3ZhciBtPWxbeV0sdj1pW3ldLF89Y1t5XTthKHMobSxyLl9wdHJbdl0sci5fcHRyW3YrMV0sci5faW5kZXgpLG0sdixfLHIuX3ZhbHVlcyxyLl9pbmRleCxyLl9wdHIpfXJldHVybiByfSxpLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgaSh7dmFsdWVzOnRoaXMuX3ZhbHVlcz93cCh0aGlzLl92YWx1ZXMpOnZvaWQgMCxpbmRleDp3cCh0aGlzLl9pbmRleCkscHRyOndwKHRoaXMuX3B0ciksc2l6ZTp3cCh0aGlzLl9zaXplKSxkYXRhdHlwZTp0aGlzLl9kYXRhdHlwZX0pfSxpLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NpemUuc2xpY2UoMCl9LGkucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0LHIpe2lmKCF0aGlzLl92YWx1ZXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIG1hcCBvbiBhIFBhdHRlcm4gb25seSBtYXRyaXgiKTt2YXIgbz10aGlzLHM9dGhpcy5fc2l6ZVswXSxhPXRoaXMuX3NpemVbMV0sdT1feSh0KTtyZXR1cm4gZnVuY3Rpb24odCxyLG8scyxhLHUsYyl7dmFyIGw9W10saD1bXSxmPVtdLHA9bixkPTA7amYodC5fZGF0YXR5cGUpJiYocD1lLmZpbmQobixbdC5fZGF0YXR5cGUsdC5fZGF0YXR5cGVdKXx8bixkPWUuY29udmVydCgwLHQuX2RhdGF0eXBlKSk7Zm9yKHZhciBnPWZ1bmN0aW9uKHQsZSxuKXt0PXUodCxlLG4pLHAodCxkKXx8KGwucHVzaCh0KSxoLnB1c2goZSkpfSx5PXM7eTw9YTt5Kyspe2YucHVzaChsLmxlbmd0aCk7dmFyIG09dC5fcHRyW3ldLHY9dC5fcHRyW3krMV07aWYoYylmb3IodmFyIF89bTtfPHY7XysrKXt2YXIgeD10Ll9pbmRleFtfXTt4Pj1yJiZ4PD1vJiZnKHQuX3ZhbHVlc1tfXSx4LXIseS1zKX1lbHNle2Zvcih2YXIgdz17fSxiPW07Yjx2O2IrKyl7d1t0Ll9pbmRleFtiXV09dC5fdmFsdWVzW2JdfWZvcih2YXIgRD1yO0Q8PW87RCsrKXtnKEQgaW4gdz93W0RdOjAsRC1yLHktcyl9fX1yZXR1cm4gZi5wdXNoKGwubGVuZ3RoKSxuZXcgaSh7dmFsdWVzOmwsaW5kZXg6aCxwdHI6ZixzaXplOltvLXIrMSxhLXMrMV19KX0odGhpcywwLHMtMSwwLGEtMSwoZnVuY3Rpb24oZSxuLHIpe3JldHVybiAxPT09dT90KGUpOjI9PT11P3QoZSxbbixyXSk6dChlLFtuLHJdLG8pfSkscil9LGkucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCxlKXtpZighdGhpcy5fdmFsdWVzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBmb3JFYWNoIG9uIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO2Zvcih2YXIgbj10aGlzLl9zaXplWzBdLHI9dGhpcy5fc2l6ZVsxXSxpPTA7aTxyO2krKyl7dmFyIG89dGhpcy5fcHRyW2ldLHM9dGhpcy5fcHRyW2krMV07aWYoZSlmb3IodmFyIGE9bzthPHM7YSsrKXt2YXIgdT10aGlzLl9pbmRleFthXTt0KHRoaXMuX3ZhbHVlc1thXSxbdSxpXSx0aGlzKX1lbHNle2Zvcih2YXIgYz17fSxsPW87bDxzO2wrKyl7Y1t0aGlzLl9pbmRleFtsXV09dGhpcy5fdmFsdWVzW2xdfWZvcih2YXIgaD0wO2g8bjtoKyspe3QoaCBpbiBjP2NbaF06MCxbaCxpXSx0aGlzKX19fX0saS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbiooKXtpZighdGhpcy5fdmFsdWVzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGl0ZXJhdGUgYSBQYXR0ZXJuIG9ubHkgbWF0cml4Iik7Zm9yKHZhciB0PXRoaXMuX3NpemVbMV0sZT0wO2U8dDtlKyspZm9yKHZhciBuPXRoaXMuX3B0cltlXSxyPXRoaXMuX3B0cltlKzFdLGk9bjtpPHI7aSsrKXt2YXIgbz10aGlzLl9pbmRleFtpXTt5aWVsZHt2YWx1ZTp0aGlzLl92YWx1ZXNbaV0saW5kZXg6W28sZV19fX0saS5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiBjKHRoaXMuX3ZhbHVlcyx0aGlzLl9pbmRleCx0aGlzLl9wdHIsdGhpcy5fc2l6ZSwhMCl9LGkucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXtyZXR1cm4gYyh0aGlzLl92YWx1ZXMsdGhpcy5faW5kZXgsdGhpcy5fcHRyLHRoaXMuX3NpemUsITEpfSxpLnByb3RvdHlwZS5mb3JtYXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX3NpemVbMF0sbj10aGlzLl9zaXplWzFdLHI9dGhpcy5kZW5zaXR5KCksaT0iU3BhcnNlIE1hdHJpeCBbIitxcChlLHQpKyIgeCAiK3FwKG4sdCkrIl0gZGVuc2l0eTogIitxcChyLHQpKyJcbiIsbz0wO288bjtvKyspZm9yKHZhciBzPXRoaXMuX3B0cltvXSxhPXRoaXMuX3B0cltvKzFdLHU9czt1PGE7dSsrKXtpKz0iXG4gICAgKCIrcXAodGhpcy5faW5kZXhbdV0sdCkrIiwgIitxcChvLHQpKyIpID09PiAiKyh0aGlzLl92YWx1ZXM/cXAodGhpcy5fdmFsdWVzW3VdLHQpOiJYIil9cmV0dXJuIGl9LGkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHFwKHRoaXMudG9BcnJheSgpKX0saS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21hdGhqczoiU3BhcnNlTWF0cml4Iix2YWx1ZXM6dGhpcy5fdmFsdWVzLGluZGV4OnRoaXMuX2luZGV4LHB0cjp0aGlzLl9wdHIsc2l6ZTp0aGlzLl9zaXplLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfX0saS5wcm90b3R5cGUuZGlhZ29uYWw9ZnVuY3Rpb24odCl7aWYodCl7aWYoUmYodCkmJih0PXQudG9OdW1iZXIoKSksIVBmKHQpfHwhTXAodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHBhcmFtZXRlciBrIG11c3QgYmUgYW4gaW50ZWdlciBudW1iZXIiKX1lbHNlIHQ9MDt2YXIgZT10PjA/dDowLG49dDwwPy10OjAscj10aGlzLl9zaXplWzBdLG89dGhpcy5fc2l6ZVsxXSxzPU1hdGgubWluKHItbixvLWUpLGE9W10sdT1bXSxjPVtdO2NbMF09MDtmb3IodmFyIGw9ZTtsPG8mJmEubGVuZ3RoPHM7bCsrKWZvcih2YXIgaD10aGlzLl9wdHJbbF0sZj10aGlzLl9wdHJbbCsxXSxwPWg7cDxmO3ArKyl7dmFyIGQ9dGhpcy5faW5kZXhbcF07aWYoZD09PWwtZStuKXthLnB1c2godGhpcy5fdmFsdWVzW3BdKSx1W2EubGVuZ3RoLTFdPWQtbjticmVha319cmV0dXJuIGMucHVzaChhLmxlbmd0aCksbmV3IGkoe3ZhbHVlczphLGluZGV4OnUscHRyOmMsc2l6ZTpbcywxXX0pfSxpLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaSh0KX0saS5kaWFnb25hbD1mdW5jdGlvbih0LHIsbyxzLGEpe2lmKCFVZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCwgc2l6ZSBwYXJhbWV0ZXIiKTtpZigyIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJPbmx5IHR3byBkaW1lbnNpb25zIG1hdHJpeCBhcmUgc3VwcG9ydGVkIik7aWYodD10Lm1hcCgoZnVuY3Rpb24odCl7aWYoUmYodCkmJih0PXQudG9OdW1iZXIoKSksIVBmKHQpfHwhTXAodCl8fHQ8MSl0aHJvdyBuZXcgRXJyb3IoIlNpemUgdmFsdWVzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKTtyZXR1cm4gdH0pKSxvKXtpZihSZihvKSYmKG89by50b051bWJlcigpKSwhUGYobyl8fCFNcChvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFyYW1ldGVyIGsgbXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlciIpfWVsc2Ugbz0wO3ZhciB1PW4sYz0wO2pmKGEpJiYodT1lLmZpbmQobixbYSxhXSl8fG4sYz1lLmNvbnZlcnQoMCxhKSk7dmFyIGwsaD1vPjA/bzowLGY9bzwwPy1vOjAscD10WzBdLGQ9dFsxXSxnPU1hdGgubWluKHAtZixkLWgpO2lmKFVmKHIpKXtpZihyLmxlbmd0aCE9PWcpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHZhbHVlIGFycmF5IGxlbmd0aCIpO2w9ZnVuY3Rpb24odCl7cmV0dXJuIHJbdF19fWVsc2UgaWYocWYocikpe3ZhciB5PXIuc2l6ZSgpO2lmKDEhPT15Lmxlbmd0aHx8eVswXSE9PWcpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG1hdHJpeCBsZW5ndGgiKTtsPWZ1bmN0aW9uKHQpe3JldHVybiByLmdldChbdF0pfX1lbHNlIGw9ZnVuY3Rpb24oKXtyZXR1cm4gcn07Zm9yKHZhciBtPVtdLHY9W10sXz1bXSx4PTA7eDxkO3grKyl7Xy5wdXNoKG0ubGVuZ3RoKTt2YXIgdz14LWg7aWYodz49MCYmdzxnKXt2YXIgYj1sKHcpO3UoYixjKXx8KHYucHVzaCh3K2YpLG0ucHVzaChiKSl9fXJldHVybiBfLnB1c2gobS5sZW5ndGgpLG5ldyBpKHt2YWx1ZXM6bSxpbmRleDp2LHB0cjpfLHNpemU6W3AsZF19KX0saS5wcm90b3R5cGUuc3dhcFJvd3M9ZnVuY3Rpb24odCxlKXtpZighKFBmKHQpJiZNcCh0KSYmUGYoZSkmJk1wKGUpKSl0aHJvdyBuZXcgRXJyb3IoIlJvdyBpbmRleCBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzIik7aWYoMiE9PXRoaXMuX3NpemUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSB0d28gZGltZW5zaW9uYWwgbWF0cml4IGlzIHN1cHBvcnRlZCIpO3JldHVybiBacCh0LHRoaXMuX3NpemVbMF0pLFpwKGUsdGhpcy5fc2l6ZVswXSksaS5fc3dhcFJvd3ModCxlLHRoaXMuX3NpemVbMV0sdGhpcy5fdmFsdWVzLHRoaXMuX2luZGV4LHRoaXMuX3B0ciksdGhpc30saS5fZm9yRWFjaFJvdz1mdW5jdGlvbih0LGUsbixyLGkpe2Zvcih2YXIgbz1yW3RdLHM9clt0KzFdLGE9bzthPHM7YSsrKWkoblthXSxlW2FdKX0saS5fc3dhcFJvd3M9ZnVuY3Rpb24odCxlLG4scixpLG8pe2Zvcih2YXIgYT0wO2E8bjthKyspe3ZhciB1PW9bYV0sYz1vW2ErMV0sbD1zKHQsdSxjLGkpLGg9cyhlLHUsYyxpKTtpZihsPGMmJmg8YyYmaVtsXT09PXQmJmlbaF09PT1lKXtpZihyKXt2YXIgZj1yW2xdO3JbbF09cltoXSxyW2hdPWZ9fWVsc2UgaWYobDxjJiZpW2xdPT09dCYmKGg+PWN8fGlbaF0hPT1lKSl7dmFyIHA9cj9yW2xdOnZvaWQgMDtpLnNwbGljZShoLDAsZSksciYmci5zcGxpY2UoaCwwLHApLGkuc3BsaWNlKGg8PWw/bCsxOmwsMSksciYmci5zcGxpY2UoaDw9bD9sKzE6bCwxKX1lbHNlIGlmKGg8YyYmaVtoXT09PWUmJihsPj1jfHxpW2xdIT09dCkpe3ZhciBkPXI/cltoXTp2b2lkIDA7aS5zcGxpY2UobCwwLHQpLHImJnIuc3BsaWNlKGwsMCxkKSxpLnNwbGljZShsPD1oP2grMTpoLDEpLHImJnIuc3BsaWNlKGw8PWg/aCsxOmgsMSl9fX0saX0pLHtpc0NsYXNzOiEwfSk7dmFyIFR5PWlkKCJudW1iZXIiLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10LG49ZSgibnVtYmVyIix7IiI6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxzdHJpbmc6ZnVuY3Rpb24odCl7aWYoIk5hTiI9PT10KXJldHVybiBOYU47dmFyIGU9ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXRjaCgvKDBbYm94XSkoWzAtOWEtZkEtRl0qKVwuKFswLTlhLWZBLUZdKikvKTtyZXR1cm4gZT97aW5wdXQ6dCxyYWRpeDp7IjBiIjoyLCIwbyI6OCwiMHgiOjE2fVtlWzFdXSxpbnRlZ2VyUGFydDplWzJdLGZyYWN0aW9uYWxQYXJ0OmVbM119Om51bGx9KHQpO2lmKGUpcmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1wYXJzZUludCh0LmludGVnZXJQYXJ0LHQucmFkaXgpLG49MCxyPTA7cjx0LmZyYWN0aW9uYWxQYXJ0Lmxlbmd0aDtyKyspbis9cGFyc2VJbnQodC5mcmFjdGlvbmFsUGFydFtyXSx0LnJhZGl4KS9NYXRoLnBvdyh0LnJhZGl4LHIrMSk7dmFyIGk9ZStuO2lmKGlzTmFOKGkpKXRocm93IG5ldyBTeW50YXhFcnJvcignU3RyaW5nICInK3QuaW5wdXQrJyIgaXMgbm8gdmFsaWQgbnVtYmVyJyk7cmV0dXJuIGl9KGUpO3ZhciBuPTAscj10Lm1hdGNoKC8oMFtib3hdWzAtOWEtZkEtRl0qKWkoWzAtOV0qKS8pO3ImJihuPU51bWJlcihyWzJdKSx0PXJbMV0pO3ZhciBpPU51bWJlcih0KTtpZihpc05hTihpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N0cmluZyAiJyt0KyciIGlzIG5vIHZhbGlkIG51bWJlcicpO2lmKHIpe2lmKGk+VGYoMixuKS0xKXRocm93IG5ldyBTeW50YXhFcnJvcignU3RyaW5nICInLmNvbmNhdCh0LCciIGlzIG91dCBvZiByYW5nZScpKTtpPj1UZigyLG4tMSkmJihpLT1UZigyLG4pKX1yZXR1cm4gaX0sQmlnTnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvTnVtYmVyKCl9LEZyYWN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlT2YoKX0sVW5pdDplLnJlZmVyVG9TZWxmKCh0PT5lPT57dmFyIG49ZS5jbG9uZSgpO3JldHVybiBuLnZhbHVlPXQoZS52YWx1ZSksbn0pKSxudWxsOmZ1bmN0aW9uKHQpe3JldHVybiAwfSwiVW5pdCwgc3RyaW5nIHwgVW5pdCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b051bWJlcihlKX0sIkFycmF5IHwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT5lPT53eShlLHQpKSl9KTtyZXR1cm4gbi5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VGbG9hdCh0LnZhbHVlKX0sbn0pKSxPeT1pZCgiYmlnbnVtYmVyIixbInR5cGVkIiwiQmlnTnVtYmVyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxCaWdOdW1iZXI6bn09dDtyZXR1cm4gZSgiYmlnbnVtYmVyIix7IiI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4oMCl9LG51bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odCsiIil9LHN0cmluZzpmdW5jdGlvbih0KXt2YXIgZT10Lm1hdGNoKC8oMFtib3hdWzAtOWEtZkEtRl0qKWkoWzAtOV0qKS8pO2lmKGUpe3ZhciByPWVbMl0saT1uKGVbMV0pLG89bmV3IG4oMikucG93KE51bWJlcihyKSk7aWYoaS5ndChvLnN1YigxKSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCdTdHJpbmcgIicuY29uY2F0KHQsJyIgaXMgb3V0IG9mIHJhbmdlJykpO3ZhciBzPW5ldyBuKDIpLnBvdyhOdW1iZXIociktMSk7cmV0dXJuIGkuZ3RlKHMpP2kuc3ViKG8pOml9cmV0dXJuIG5ldyBuKHQpfSxCaWdOdW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LFVuaXQ6ZS5yZWZlclRvU2VsZigodD0+ZT0+e3ZhciBuPWUuY2xvbmUoKTtyZXR1cm4gbi52YWx1ZT10KGUudmFsdWUpLG59KSksRnJhY3Rpb246ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQubikuZGl2KHQuZCkudGltZXModC5zKX0sbnVsbDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4oMCl9LCJBcnJheSB8IE1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+ZT0+d3koZSx0KSkpfSl9KSksTHk9aWQoImZyYWN0aW9uIixbInR5cGVkIiwiRnJhY3Rpb24iXSwodD0+e3Zhcnt0eXBlZDplLEZyYWN0aW9uOm59PXQ7cmV0dXJuIGUoImZyYWN0aW9uIix7bnVtYmVyOmZ1bmN0aW9uKHQpe2lmKCFpc0Zpbml0ZSh0KXx8aXNOYU4odCkpdGhyb3cgbmV3IEVycm9yKHQrIiBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgYSBmcmFjdGlvbiIpO3JldHVybiBuZXcgbih0KX0sc3RyaW5nOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbih0KX0sIm51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiBuZXcgbih0LGUpfSxudWxsOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbigwKX0sQmlnTnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbih0LnRvU3RyaW5nKCkpfSxGcmFjdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sVW5pdDplLnJlZmVyVG9TZWxmKCh0PT5lPT57dmFyIG49ZS5jbG9uZSgpO3JldHVybiBuLnZhbHVlPXQoZS52YWx1ZSksbn0pKSxPYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQpfSwiQXJyYXkgfCBNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnd5KGUsdCkpKX0pfSkpLFB5PSJtYXRyaXgiLFJ5PWlkKFB5LFsidHlwZWQiLCJNYXRyaXgiLCJEZW5zZU1hdHJpeCIsIlNwYXJzZU1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsTWF0cml4Om4sRGVuc2VNYXRyaXg6cixTcGFyc2VNYXRyaXg6aX09dDtyZXR1cm4gZShQeSx7IiI6ZnVuY3Rpb24oKXtyZXR1cm4gbyhbXSl9LHN0cmluZzpmdW5jdGlvbih0KXtyZXR1cm4gbyhbXSx0KX0sInN0cmluZywgc3RyaW5nIjpmdW5jdGlvbih0LGUpe3JldHVybiBvKFtdLHQsZSl9LEFycmF5OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQpfSxNYXRyaXg6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCx0LnN0b3JhZ2UoKSl9LCJBcnJheSB8IE1hdHJpeCwgc3RyaW5nIjpvLCJBcnJheSB8IE1hdHJpeCwgc3RyaW5nLCBzdHJpbmciOm99KTtmdW5jdGlvbiBvKHQsZSxuKXtpZigiZGVuc2UiPT09ZXx8ImRlZmF1bHQiPT09ZXx8dm9pZCAwPT09ZSlyZXR1cm4gbmV3IHIodCxuKTtpZigic3BhcnNlIj09PWUpcmV0dXJuIG5ldyBpKHQsbik7dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBtYXRyaXggdHlwZSAiK0pTT04uc3RyaW5naWZ5KGUpKyIuIil9fSkpLEJ5PSJhZGRTY2FsYXIiLGt5PWlkKEJ5LFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBlKEJ5LHsibnVtYmVyLCBudW1iZXIiOkN5LCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmFkZChlKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnBsdXMoZSl9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYWRkKGUpfSwiVW5pdCwgVW5pdCI6ZS5yZWZlclRvU2VsZigodD0+KG4scik9PntpZihudWxsPT09bi52YWx1ZXx8dm9pZCAwPT09bi52YWx1ZSl0aHJvdyBuZXcgRXJyb3IoIlBhcmFtZXRlciB4IGNvbnRhaW5zIGEgdW5pdCB3aXRoIHVuZGVmaW5lZCB2YWx1ZSIpO2lmKG51bGw9PT1yLnZhbHVlfHx2b2lkIDA9PT1yLnZhbHVlKXRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVyIHkgY29udGFpbnMgYSB1bml0IHdpdGggdW5kZWZpbmVkIHZhbHVlIik7aWYoIW4uZXF1YWxCYXNlKHIpKXRocm93IG5ldyBFcnJvcigiVW5pdHMgZG8gbm90IG1hdGNoIik7dmFyIGk9bi5jbG9uZSgpO3JldHVybiBpLnZhbHVlPWUuZmluZCh0LFtpLnZhbHVlVHlwZSgpLHIudmFsdWVUeXBlKCldKShpLnZhbHVlLHIudmFsdWUpLGkuZml4UHJlZml4PSExLGl9KSl9KX0pKSx6eT1pZCgibWF0QWxnbzExeFMwcyIsWyJ0eXBlZCIsImVxdWFsU2NhbGFyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpufT10O3JldHVybiBmdW5jdGlvbih0LHIsaSxvKXt2YXIgcz10Ll92YWx1ZXMsYT10Ll9pbmRleCx1PXQuX3B0cixjPXQuX3NpemUsbD10Ll9kYXRhdHlwZTtpZighcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBvbiBQYXR0ZXJuIFNwYXJzZSBNYXRyaXggYW5kIFNjYWxhciB2YWx1ZSIpO3ZhciBoLGY9Y1swXSxwPWNbMV0sZD1uLGc9MCx5PWk7InN0cmluZyI9PXR5cGVvZiBsJiYoaD1sLGQ9ZS5maW5kKG4sW2gsaF0pLGc9ZS5jb252ZXJ0KDAsaCkscj1lLmNvbnZlcnQocixoKSx5PWUuZmluZChpLFtoLGhdKSk7Zm9yKHZhciBtPVtdLHY9W10sXz1bXSx4PTA7eDxwO3grKyl7X1t4XT12Lmxlbmd0aDtmb3IodmFyIHc9dVt4XSxiPXVbeCsxXSxEPXc7RDxiO0QrKyl7dmFyIEU9YVtEXSxDPW8/eShyLHNbRF0pOnkoc1tEXSxyKTtkKEMsZyl8fCh2LnB1c2goRSksbS5wdXNoKEMpKX19cmV0dXJuIF9bcF09di5sZW5ndGgsdC5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczptLGluZGV4OnYscHRyOl8sc2l6ZTpbZixwXSxkYXRhdHlwZTpofSl9fSkpLGp5PWlkKCJtYXRBbGdvMTJ4U2ZzIixbInR5cGVkIiwiRGVuc2VNYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLERlbnNlTWF0cml4Om59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpLG8pe3ZhciBzPXQuX3ZhbHVlcyxhPXQuX2luZGV4LHU9dC5fcHRyLGM9dC5fc2l6ZSxsPXQuX2RhdGF0eXBlO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIG9uIFBhdHRlcm4gU3BhcnNlIE1hdHJpeCBhbmQgU2NhbGFyIHZhbHVlIik7dmFyIGgsZj1jWzBdLHA9Y1sxXSxkPWk7InN0cmluZyI9PXR5cGVvZiBsJiYoaD1sLHI9ZS5jb252ZXJ0KHIsaCksZD1lLmZpbmQoaSxbaCxoXSkpO2Zvcih2YXIgZz1bXSx5PVtdLG09W10sdj0wO3Y8cDt2Kyspe2Zvcih2YXIgXz12KzEseD11W3ZdLHc9dVt2KzFdLGI9eDtiPHc7YisrKXt2YXIgRD1hW2JdO3lbRF09c1tiXSxtW0RdPV99Zm9yKHZhciBFPTA7RTxmO0UrKykwPT09diYmKGdbRV09W10pLG1bRV09PT1fP2dbRV1bdl09bz9kKHIseVtFXSk6ZCh5W0VdLHIpOmdbRV1bdl09bz9kKHIsMCk6ZCgwLHIpfXJldHVybiBuZXcgbih7ZGF0YTpnLHNpemU6W2YscF0sZGF0YXR5cGU6aH0pfX0pKSxVeT1pZCgibWF0QWxnbzE0eERzIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGksbyl7dmFyIHMsYT10Ll9kYXRhLHU9dC5fc2l6ZSxjPXQuX2RhdGF0eXBlLGw9aTsic3RyaW5nIj09dHlwZW9mIGMmJihzPWMscj1lLmNvbnZlcnQocixzKSxsPWUuZmluZChpLFtzLHNdKSk7dmFyIGg9dS5sZW5ndGg+MD9uKGwsMCx1LHVbMF0sYSxyLG8pOltdO3JldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOmgsc2l6ZTp3cCh1KSxkYXRhdHlwZTpzfSl9O2Z1bmN0aW9uIG4odCxlLHIsaSxvLHMsYSl7dmFyIHU9W107aWYoZT09PXIubGVuZ3RoLTEpZm9yKHZhciBjPTA7YzxpO2MrKyl1W2NdPWE/dChzLG9bY10pOnQob1tjXSxzKTtlbHNlIGZvcih2YXIgbD0wO2w8aTtsKyspdVtsXT1uKHQsZSsxLHIscltlKzFdLG9bbF0scyxhKTtyZXR1cm4gdX19KSkscXk9aWQoIm1hdEFsZ28wMXhEU2lkIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZnVuY3Rpb24odCxuLHIsaSl7dmFyIG89dC5fZGF0YSxzPXQuX3NpemUsYT10Ll9kYXRhdHlwZSx1PW4uX3ZhbHVlcyxjPW4uX2luZGV4LGw9bi5fcHRyLGg9bi5fc2l6ZSxmPW4uX2RhdGF0eXBlO2lmKHMubGVuZ3RoIT09aC5sZW5ndGgpdGhyb3cgbmV3IEdwKHMubGVuZ3RoLGgubGVuZ3RoKTtpZihzWzBdIT09aFswXXx8c1sxXSE9PWhbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrcysiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK2grIikiKTtpZighdSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBvbiBEZW5zZSBNYXRyaXggYW5kIFBhdHRlcm4gU3BhcnNlIE1hdHJpeCIpO3ZhciBwLGQsZz1zWzBdLHk9c1sxXSxtPSJzdHJpbmciPT10eXBlb2YgYSYmYT09PWY/YTp2b2lkIDAsdj1tP2UuZmluZChyLFttLG1dKTpyLF89W107Zm9yKHA9MDtwPGc7cCsrKV9bcF09W107dmFyIHg9W10sdz1bXTtmb3IoZD0wO2Q8eTtkKyspe2Zvcih2YXIgYj1kKzEsRD1sW2RdLEU9bFtkKzFdLEM9RDtDPEU7QysrKXhbcD1jW0NdXT1pP3YodVtDXSxvW3BdW2RdKTp2KG9bcF1bZF0sdVtDXSksd1twXT1iO2ZvcihwPTA7cDxnO3ArKyl3W3BdPT09Yj9fW3BdW2RdPXhbcF06X1twXVtkXT1vW3BdW2RdfXJldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOl8sc2l6ZTpbZyx5XSxkYXRhdHlwZTptfSl9fSkpLFZ5PWlkKCJtYXRBbGdvMDR4U2lkU2lkIixbInR5cGVkIiwiZXF1YWxTY2FsYXIiXSwodD0+e3Zhcnt0eXBlZDplLGVxdWFsU2NhbGFyOm59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpKXt2YXIgbz10Ll92YWx1ZXMscz10Ll9pbmRleCxhPXQuX3B0cix1PXQuX3NpemUsYz10Ll9kYXRhdHlwZSxsPXIuX3ZhbHVlcyxoPXIuX2luZGV4LGY9ci5fcHRyLHA9ci5fc2l6ZSxkPXIuX2RhdGF0eXBlO2lmKHUubGVuZ3RoIT09cC5sZW5ndGgpdGhyb3cgbmV3IEdwKHUubGVuZ3RoLHAubGVuZ3RoKTtpZih1WzBdIT09cFswXXx8dVsxXSE9PXBbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrdSsiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK3ArIikiKTt2YXIgZyx5PXVbMF0sbT11WzFdLHY9bixfPTAseD1pOyJzdHJpbmciPT10eXBlb2YgYyYmYz09PWQmJihnPWMsdj1lLmZpbmQobixbZyxnXSksXz1lLmNvbnZlcnQoMCxnKSx4PWUuZmluZChpLFtnLGddKSk7dmFyIHcsYixELEUsQyxTPW8mJmw/W106dm9pZCAwLEE9W10sTj1bXSxJPW8mJmw/W106dm9pZCAwLE09byYmbD9bXTp2b2lkIDAsRj1bXSxUPVtdO2ZvcihiPTA7YjxtO2IrKyl7TltiXT1BLmxlbmd0aDt2YXIgTz1iKzE7Zm9yKEU9YVtiXSxDPWFbYisxXSxEPUU7RDxDO0QrKyl3PXNbRF0sQS5wdXNoKHcpLEZbd109TyxJJiYoSVt3XT1vW0RdKTtmb3IoRT1mW2JdLEM9ZltiKzFdLEQ9RTtEPEM7RCsrKWlmKEZbdz1oW0RdXT09PU8pe2lmKEkpe3ZhciBMPXgoSVt3XSxsW0RdKTt2KEwsXyk/Rlt3XT1udWxsOklbd109TH19ZWxzZSBBLnB1c2godyksVFt3XT1PLE0mJihNW3ddPWxbRF0pO2lmKEkmJk0pZm9yKEQ9TltiXTtEPEEubGVuZ3RoOylGW3c9QVtEXV09PT1PPyhTW0RdPUlbd10sRCsrKTpUW3ddPT09Tz8oU1tEXT1NW3ddLEQrKyk6QS5zcGxpY2UoRCwxKX1yZXR1cm4gTlttXT1BLmxlbmd0aCx0LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOlMsaW5kZXg6QSxwdHI6TixzaXplOlt5LG1dLGRhdGF0eXBlOmd9KX19KSksR3k9aWQoIm1hdEFsZ28xMHhTaWRzIixbInR5cGVkIiwiRGVuc2VNYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLERlbnNlTWF0cml4Om59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpLG8pe3ZhciBzPXQuX3ZhbHVlcyxhPXQuX2luZGV4LHU9dC5fcHRyLGM9dC5fc2l6ZSxsPXQuX2RhdGF0eXBlO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIG9uIFBhdHRlcm4gU3BhcnNlIE1hdHJpeCBhbmQgU2NhbGFyIHZhbHVlIik7dmFyIGgsZj1jWzBdLHA9Y1sxXSxkPWk7InN0cmluZyI9PXR5cGVvZiBsJiYoaD1sLHI9ZS5jb252ZXJ0KHIsaCksZD1lLmZpbmQoaSxbaCxoXSkpO2Zvcih2YXIgZz1bXSx5PVtdLG09W10sdj0wO3Y8cDt2Kyspe2Zvcih2YXIgXz12KzEseD11W3ZdLHc9dVt2KzFdLGI9eDtiPHc7YisrKXt2YXIgRD1hW2JdO3lbRF09c1tiXSxtW0RdPV99Zm9yKHZhciBFPTA7RTxmO0UrKykwPT09diYmKGdbRV09W10pLG1bRV09PT1fP2dbRV1bdl09bz9kKHIseVtFXSk6ZCh5W0VdLHIpOmdbRV1bdl09cn1yZXR1cm4gbmV3IG4oe2RhdGE6ZyxzaXplOltmLHBdLGRhdGF0eXBlOmh9KX19KSksWXk9aWQoIm1hdEFsZ28xM3hERCIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpKXt2YXIgbz10Ll9kYXRhLHM9dC5fc2l6ZSxhPXQuX2RhdGF0eXBlLHU9ci5fZGF0YSxjPXIuX3NpemUsbD1yLl9kYXRhdHlwZSxoPVtdO2lmKHMubGVuZ3RoIT09Yy5sZW5ndGgpdGhyb3cgbmV3IEdwKHMubGVuZ3RoLGMubGVuZ3RoKTtmb3IodmFyIGY9MDtmPHMubGVuZ3RoO2YrKyl7aWYoc1tmXSE9PWNbZl0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrcysiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK2MrIikiKTtoW2ZdPXNbZl19dmFyIHAsZD1pOyJzdHJpbmciPT10eXBlb2YgYSYmYT09PWwmJihwPWEsZD1lLmZpbmQoaSxbcCxwXSkpO3ZhciBnPWgubGVuZ3RoPjA/bihkLDAsaCxoWzBdLG8sdSk6W107cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6ZyxzaXplOmgsZGF0YXR5cGU6cH0pfTtmdW5jdGlvbiBuKHQsZSxyLGksbyxzKXt2YXIgYT1bXTtpZihlPT09ci5sZW5ndGgtMSlmb3IodmFyIHU9MDt1PGk7dSsrKWFbdV09dChvW3VdLHNbdV0pO2Vsc2UgZm9yKHZhciBjPTA7YzxpO2MrKylhW2NdPW4odCxlKzEscixyW2UrMV0sb1tjXSxzW2NdKTtyZXR1cm4gYX19KSksWHk9aWQoImJyb2FkY2FzdCIsWyJjb25jYXQiXSwodD0+e3Zhcntjb25jYXQ6ZX09dDtyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbz1NYXRoLm1heCh0Ll9zaXplLmxlbmd0aCxlLl9zaXplLmxlbmd0aCk7aWYodC5fc2l6ZS5sZW5ndGg9PT1lLl9zaXplLmxlbmd0aCYmdC5fc2l6ZS5ldmVyeSgoKHQsbik9PnQ9PT1lLl9zaXplW25dKSkpcmV0dXJuW3QsZV07Zm9yKHZhciBzPW4odC5fc2l6ZSxvLDApLGE9bihlLl9zaXplLG8sMCksdT1bXSxjPTA7YzxvO2MrKyl1W2NdPU1hdGgubWF4KHNbY10sYVtjXSk7Zm9yKHZhciBsPTA7bDxvO2wrKylpKHMsdSxsKSxpKGEsdSxsKTt2YXIgaD10LmNsb25lKCksZj1lLmNsb25lKCk7aC5fc2l6ZS5sZW5ndGg8bz9oLnJlc2hhcGUobihoLl9zaXplLG8sMSkpOmYuX3NpemUubGVuZ3RoPG8mJmYucmVzaGFwZShuKGYuX3NpemUsbywxKSk7Zm9yKHZhciBwPTA7cDxvO3ArKyloLl9zaXplW3BdPHVbcF0mJihoPXIoaCx1W3BdLHApKSxmLl9zaXplW3BdPHVbcF0mJihmPXIoZix1W3BdLHApKTtyZXR1cm5baCxmXX07ZnVuY3Rpb24gbih0LGUsbil7cmV0dXJuWy4uLkFycmF5KGUtdC5sZW5ndGgpLmZpbGwobiksLi4udF19ZnVuY3Rpb24gcih0LG4scil7cmV0dXJuIGUoLi4uQXJyYXkobikuZmlsbCh0KSxyKX1mdW5jdGlvbiBpKHQsZSxuKXtpZih0W25dPGVbbl0mdFtuXT4xKXRocm93IG5ldyBFcnJvcigic2hhcGUgbWlzc21hdGNoOiBtaXNzbWF0Y2ggaXMgZm91bmQgaW4gYXJnIHdpdGggc2hhcGUgKCIuY29uY2F0KHQsIikgbm90IHBvc3NpYmxlIHRvIGJyb2FkY2FzdCBkaW1lbnNpb24gIikuY29uY2F0KG4sIiB3aXRoIHNpemUgIikuY29uY2F0KHRbbl0sIiB0byBzaXplICIpLmNvbmNhdChlW25dKSl9fSkpLFd5PWlkKCJtYXRyaXhBbGdvcml0aG1TdWl0ZSIsWyJ0eXBlZCIsIm1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4sY29uY2F0OnJ9PXQsaT1ZeSh7dHlwZWQ6ZX0pLG89VXkoe3R5cGVkOmV9KSxzPVh5KHtjb25jYXQ6cn0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgcixhPXQuZWxvcCx1PXQuU0R8fHQuRFM7YT8ocj17IkRlbnNlTWF0cml4LCBEZW5zZU1hdHJpeCI6KHQsZSk9PmkoLi4ucyh0LGUpLGEpLCJBcnJheSwgQXJyYXkiOih0LGUpPT5pKC4uLnMobih0KSxuKGUpKSxhKS52YWx1ZU9mKCksIkFycmF5LCBEZW5zZU1hdHJpeCI6KHQsZSk9PmkoLi4ucyhuKHQpLGUpLGEpLCJEZW5zZU1hdHJpeCwgQXJyYXkiOih0LGUpPT5pKC4uLnModCxuKGUpKSxhKX0sdC5TUyYmKHJbIlNwYXJzZU1hdHJpeCwgU3BhcnNlTWF0cml4Il09KGUsbik9PnQuU1MoLi4ucyhlLG4pLGEsITEpKSx0LkRTJiYoclsiRGVuc2VNYXRyaXgsIFNwYXJzZU1hdHJpeCJdPShlLG4pPT50LkRTKC4uLnMoZSxuKSxhLCExKSxyWyJBcnJheSwgU3BhcnNlTWF0cml4Il09KGUscik9PnQuRFMoLi4ucyhuKGUpLHIpLGEsITEpKSx1JiYoclsiU3BhcnNlTWF0cml4LCBEZW5zZU1hdHJpeCJdPSh0LGUpPT51KC4uLnMoZSx0KSxhLCEwKSxyWyJTcGFyc2VNYXRyaXgsIEFycmF5Il09KHQsZSk9PnUoLi4ucyhuKGUpLHQpLGEsITApKSk6KHI9eyJEZW5zZU1hdHJpeCwgRGVuc2VNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PihlLG4pPT5pKC4uLnMoZSxuKSx0KSkpLCJBcnJheSwgQXJyYXkiOmUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT5pKC4uLnMobihlKSxuKHIpKSx0KS52YWx1ZU9mKCkpKSwiQXJyYXksIERlbnNlTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+aSguLi5zKG4oZSksciksdCkpKSwiRGVuc2VNYXRyaXgsIEFycmF5IjplLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+aSguLi5zKGUsbihyKSksdCkpKX0sdC5TUyYmKHJbIlNwYXJzZU1hdHJpeCwgU3BhcnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigoZT0+KG4scik9PnQuU1MoLi4ucyhuLHIpLGUsITEpKSkpLHQuRFMmJihyWyJEZW5zZU1hdHJpeCwgU3BhcnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigoZT0+KG4scik9PnQuRFMoLi4ucyhuLHIpLGUsITEpKSksclsiQXJyYXksIFNwYXJzZU1hdHJpeCJdPWUucmVmZXJUb1NlbGYoKGU9PihyLGkpPT50LkRTKC4uLnMobihyKSxpKSxlLCExKSkpKSx1JiYoclsiU3BhcnNlTWF0cml4LCBEZW5zZU1hdHJpeCJdPWUucmVmZXJUb1NlbGYoKHQ9PihlLG4pPT51KC4uLnMobixlKSx0LCEwKSkpLHJbIlNwYXJzZU1hdHJpeCwgQXJyYXkiXT1lLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+dSguLi5zKG4ociksZSksdCwhMCkpKSkpO3ZhciBjPXQuc2NhbGFyfHwiYW55IjsodC5Ec3x8dC5TcykmJihhPyhyWyJEZW5zZU1hdHJpeCwiK2NdPSh0LGUpPT5vKHQsZSxhLCExKSxyW2MrIiwgRGVuc2VNYXRyaXgiXT0odCxlKT0+byhlLHQsYSwhMCksclsiQXJyYXksIitjXT0odCxlKT0+byhuKHQpLGUsYSwhMSkudmFsdWVPZigpLHJbYysiLCBBcnJheSJdPSh0LGUpPT5vKG4oZSksdCxhLCEwKS52YWx1ZU9mKCkpOihyWyJEZW5zZU1hdHJpeCwiK2NdPWUucmVmZXJUb1NlbGYoKHQ9PihlLG4pPT5vKGUsbix0LCExKSkpLHJbYysiLCBEZW5zZU1hdHJpeCJdPWUucmVmZXJUb1NlbGYoKHQ9PihlLG4pPT5vKG4sZSx0LCEwKSkpLHJbIkFycmF5LCIrY109ZS5yZWZlclRvU2VsZigodD0+KGUscik9Pm8obihlKSxyLHQsITEpLnZhbHVlT2YoKSkpLHJbYysiLCBBcnJheSJdPWUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT5vKG4ociksZSx0LCEwKS52YWx1ZU9mKCkpKSkpO3ZhciBsPXZvaWQgMCE9PXQuc1M/dC5zUzp0LlNzO3JldHVybiBhPyh0LlNzJiYoclsiU3BhcnNlTWF0cml4LCIrY109KGUsbik9PnQuU3MoZSxuLGEsITEpKSxsJiYocltjKyIsIFNwYXJzZU1hdHJpeCJdPSh0LGUpPT5sKGUsdCxhLCEwKSkpOih0LlNzJiYoclsiU3BhcnNlTWF0cml4LCIrY109ZS5yZWZlclRvU2VsZigoZT0+KG4scik9PnQuU3MobixyLGUsITEpKSkpLGwmJihyW2MrIiwgU3BhcnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigodD0+KGUsbik9PmwobixlLHQsITApKSkpKSxhJiZhLnNpZ25hdHVyZXMmJmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpRHAoZSxuKSYmKHRbbl09ZVtuXSl9KHIsYS5zaWduYXR1cmVzKSxyfX0pKSxIeT1pZCgibWF0QWxnbzAyeERTMCIsWyJ0eXBlZCIsImVxdWFsU2NhbGFyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpufT10O3JldHVybiBmdW5jdGlvbih0LHIsaSxvKXt2YXIgcz10Ll9kYXRhLGE9dC5fc2l6ZSx1PXQuX2RhdGF0eXBlLGM9ci5fdmFsdWVzLGw9ci5faW5kZXgsaD1yLl9wdHIsZj1yLl9zaXplLHA9ci5fZGF0YXR5cGU7aWYoYS5sZW5ndGghPT1mLmxlbmd0aCl0aHJvdyBuZXcgR3AoYS5sZW5ndGgsZi5sZW5ndGgpO2lmKGFbMF0hPT1mWzBdfHxhWzFdIT09ZlsxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIithKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIrZisiKSIpO2lmKCFjKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIG9uIERlbnNlIE1hdHJpeCBhbmQgUGF0dGVybiBTcGFyc2UgTWF0cml4Iik7dmFyIGQsZz1hWzBdLHk9YVsxXSxtPW4sdj0wLF89aTsic3RyaW5nIj09dHlwZW9mIHUmJnU9PT1wJiYoZD11LG09ZS5maW5kKG4sW2QsZF0pLHY9ZS5jb252ZXJ0KDAsZCksXz1lLmZpbmQoaSxbZCxkXSkpO2Zvcih2YXIgeD1bXSx3PVtdLGI9W10sRD0wO0Q8eTtEKyspe2JbRF09dy5sZW5ndGg7Zm9yKHZhciBFPWhbRF0sQz1oW0QrMV0sUz1FO1M8QztTKyspe3ZhciBBPWxbU10sTj1vP18oY1tTXSxzW0FdW0RdKTpfKHNbQV1bRF0sY1tTXSk7bShOLHYpfHwody5wdXNoKEEpLHgucHVzaChOKSl9fXJldHVybiBiW3ldPXcubGVuZ3RoLHIuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6eCxpbmRleDp3LHB0cjpiLHNpemU6W2cseV0sZGF0YXR5cGU6ZH0pfX0pKSxaeT1pZCgibWF0QWxnbzAzeERTZiIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGZ1bmN0aW9uKHQsbixyLGkpe3ZhciBvPXQuX2RhdGEscz10Ll9zaXplLGE9dC5fZGF0YXR5cGUsdT1uLl92YWx1ZXMsYz1uLl9pbmRleCxsPW4uX3B0cixoPW4uX3NpemUsZj1uLl9kYXRhdHlwZTtpZihzLmxlbmd0aCE9PWgubGVuZ3RoKXRocm93IG5ldyBHcChzLmxlbmd0aCxoLmxlbmd0aCk7aWYoc1swXSE9PWhbMF18fHNbMV0hPT1oWzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2guIE1hdHJpeCBBICgiK3MrIikgbXVzdCBtYXRjaCBNYXRyaXggQiAoIitoKyIpIik7aWYoIXUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gb24gRGVuc2UgTWF0cml4IGFuZCBQYXR0ZXJuIFNwYXJzZSBNYXRyaXgiKTt2YXIgcCxkPXNbMF0sZz1zWzFdLHk9MCxtPXI7InN0cmluZyI9PXR5cGVvZiBhJiZhPT09ZiYmKHA9YSx5PWUuY29udmVydCgwLHApLG09ZS5maW5kKHIsW3AscF0pKTtmb3IodmFyIHY9W10sXz0wO188ZDtfKyspdltfXT1bXTtmb3IodmFyIHg9W10sdz1bXSxiPTA7YjxnO2IrKyl7Zm9yKHZhciBEPWIrMSxFPWxbYl0sQz1sW2IrMV0sUz1FO1M8QztTKyspe3ZhciBBPWNbU107eFtBXT1pP20odVtTXSxvW0FdW2JdKTptKG9bQV1bYl0sdVtTXSksd1tBXT1EfWZvcih2YXIgTj0wO048ZDtOKyspd1tOXT09PUQ/dltOXVtiXT14W05dOnZbTl1bYl09aT9tKHksb1tOXVtiXSk6bShvW05dW2JdLHkpfXJldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOnYsc2l6ZTpbZCxnXSxkYXRhdHlwZTpwfSl9fSkpLEt5PWlkKCJtdWx0aXBseVNjYWxhciIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGUoIm11bHRpcGx5U2NhbGFyIix7Im51bWJlciwgbnVtYmVyIjpTeSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5tdWwoZSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50aW1lcyhlKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5tdWwoZSl9LCJudW1iZXIgfCBGcmFjdGlvbiB8IEJpZ051bWJlciB8IENvbXBsZXgsIFVuaXQiOih0LGUpPT5lLm11bHRpcGx5KHQpLCJVbml0LCBudW1iZXIgfCBGcmFjdGlvbiB8IEJpZ051bWJlciB8IENvbXBsZXggfCBVbml0IjoodCxlKT0+dC5tdWx0aXBseShlKX0pfSkpLEp5PSJtdWx0aXBseSIsUXk9aWQoSnksWyJ0eXBlZCIsIm1hdHJpeCIsImFkZFNjYWxhciIsIm11bHRpcGx5U2NhbGFyIiwiZXF1YWxTY2FsYXIiLCJkb3QiXSwodD0+e3Zhcnt0eXBlZDplLG1hdHJpeDpuLGFkZFNjYWxhcjpyLG11bHRpcGx5U2NhbGFyOmksZXF1YWxTY2FsYXI6byxkb3Q6c309dCxhPXp5KHt0eXBlZDplLGVxdWFsU2NhbGFyOm99KSx1PVV5KHt0eXBlZDplfSk7ZnVuY3Rpb24gYyh0LGUpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnN3aXRjaChlLmxlbmd0aCl7Y2FzZSAxOmlmKHRbMF0hPT1lWzBdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2ggaW4gbXVsdGlwbGljYXRpb24uIFZlY3RvcnMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCIpO2JyZWFrO2Nhc2UgMjppZih0WzBdIT09ZVswXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoIGluIG11bHRpcGxpY2F0aW9uLiBWZWN0b3IgbGVuZ3RoICgiK3RbMF0rIikgbXVzdCBtYXRjaCBNYXRyaXggcm93cyAoIitlWzBdKyIpIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkNhbiBvbmx5IG11bHRpcGx5IGEgMSBvciAyIGRpbWVuc2lvbmFsIG1hdHJpeCAoTWF0cml4IEIgaGFzICIrZS5sZW5ndGgrIiBkaW1lbnNpb25zKSIpfWJyZWFrO2Nhc2UgMjpzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMTppZih0WzFdIT09ZVswXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoIGluIG11bHRpcGxpY2F0aW9uLiBNYXRyaXggY29sdW1ucyAoIit0WzFdKyIpIG11c3QgbWF0Y2ggVmVjdG9yIGxlbmd0aCAoIitlWzBdKyIpIik7YnJlYWs7Y2FzZSAyOmlmKHRbMV0hPT1lWzBdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2ggaW4gbXVsdGlwbGljYXRpb24uIE1hdHJpeCBBIGNvbHVtbnMgKCIrdFsxXSsiKSBtdXN0IG1hdGNoIE1hdHJpeCBCIHJvd3MgKCIrZVswXSsiKSIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJDYW4gb25seSBtdWx0aXBseSBhIDEgb3IgMiBkaW1lbnNpb25hbCBtYXRyaXggKE1hdHJpeCBCIGhhcyAiK2UubGVuZ3RoKyIgZGltZW5zaW9ucykiKX1icmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiQ2FuIG9ubHkgbXVsdGlwbHkgYSAxIG9yIDIgZGltZW5zaW9uYWwgbWF0cml4IChNYXRyaXggQSBoYXMgIit0Lmxlbmd0aCsiIGRpbWVuc2lvbnMpIil9fWZ1bmN0aW9uIGwodCxuKXtpZigiZGVuc2UiIT09bi5zdG9yYWdlKCkpdGhyb3cgbmV3IEVycm9yKCJTdXBwb3J0IGZvciBTcGFyc2VNYXRyaXggbm90IGltcGxlbWVudGVkIik7cmV0dXJuIGZ1bmN0aW9uKHQsbil7dmFyIG8scz10Ll9kYXRhLGE9dC5fc2l6ZSx1PXQuX2RhdGF0eXBlLGM9bi5fZGF0YSxsPW4uX3NpemUsaD1uLl9kYXRhdHlwZSxmPWFbMF0scD1sWzFdLGQ9cixnPWk7dSYmaCYmdT09PWgmJiJzdHJpbmciPT10eXBlb2YgdSYmKG89dSxkPWUuZmluZChyLFtvLG9dKSxnPWUuZmluZChpLFtvLG9dKSk7Zm9yKHZhciB5PVtdLG09MDttPHA7bSsrKXtmb3IodmFyIHY9ZyhzWzBdLGNbMF1bbV0pLF89MTtfPGY7XysrKXY9ZCh2LGcoc1tfXSxjW19dW21dKSk7eVttXT12fXJldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOnksc2l6ZTpbcF0sZGF0YXR5cGU6b30pfSh0LG4pfXZhciBoPWUoIl9tdWx0aXBseU1hdHJpeFZlY3RvciIseyJEZW5zZU1hdHJpeCwgYW55IjpmdW5jdGlvbih0LG4pe3ZhciBvLHM9dC5fZGF0YSxhPXQuX3NpemUsdT10Ll9kYXRhdHlwZSxjPW4uX2RhdGEsbD1uLl9kYXRhdHlwZSxoPWFbMF0sZj1hWzFdLHA9cixkPWk7dSYmbCYmdT09PWwmJiJzdHJpbmciPT10eXBlb2YgdSYmKG89dSxwPWUuZmluZChyLFtvLG9dKSxkPWUuZmluZChpLFtvLG9dKSk7Zm9yKHZhciBnPVtdLHk9MDt5PGg7eSsrKXtmb3IodmFyIG09c1t5XSx2PWQobVswXSxjWzBdKSxfPTE7XzxmO18rKyl2PXAodixkKG1bX10sY1tfXSkpO2dbeV09dn1yZXR1cm4gdC5jcmVhdGVEZW5zZU1hdHJpeCh7ZGF0YTpnLHNpemU6W2hdLGRhdGF0eXBlOm99KX0sIlNwYXJzZU1hdHJpeCwgYW55IjpmdW5jdGlvbih0LG4pe3ZhciBzPXQuX3ZhbHVlcyxhPXQuX2luZGV4LHU9dC5fcHRyLGM9dC5fZGF0YXR5cGU7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgbXVsdGlwbHkgUGF0dGVybiBvbmx5IE1hdHJpeCB0aW1lcyBEZW5zZSBNYXRyaXgiKTt2YXIgbCxoPW4uX2RhdGEsZj1uLl9kYXRhdHlwZSxwPXQuX3NpemVbMF0sZD1uLl9zaXplWzBdLGc9W10seT1bXSxtPVtdLHY9cixfPWkseD1vLHc9MDtjJiZmJiZjPT09ZiYmInN0cmluZyI9PXR5cGVvZiBjJiYobD1jLHY9ZS5maW5kKHIsW2wsbF0pLF89ZS5maW5kKGksW2wsbF0pLHg9ZS5maW5kKG8sW2wsbF0pLHc9ZS5jb252ZXJ0KDAsbCkpO3ZhciBiPVtdLEQ9W107bVswXT0wO2Zvcih2YXIgRT0wO0U8ZDtFKyspe3ZhciBDPWhbRV07aWYoIXgoQyx3KSlmb3IodmFyIFM9dVtFXSxBPXVbRSsxXSxOPVM7TjxBO04rKyl7dmFyIEk9YVtOXTtEW0ldP2JbSV09dihiW0ldLF8oQyxzW05dKSk6KERbSV09ITAseS5wdXNoKEkpLGJbSV09XyhDLHNbTl0pKX19Zm9yKHZhciBNPXkubGVuZ3RoLEY9MDtGPE07RisrKXt2YXIgVD15W0ZdO2dbRl09YltUXX1yZXR1cm4gbVsxXT15Lmxlbmd0aCx0LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOmcsaW5kZXg6eSxwdHI6bSxzaXplOltwLDFdLGRhdGF0eXBlOmx9KX19KSxmPWUoIl9tdWx0aXBseU1hdHJpeE1hdHJpeCIseyJEZW5zZU1hdHJpeCwgRGVuc2VNYXRyaXgiOmZ1bmN0aW9uKHQsbil7dmFyIG8scz10Ll9kYXRhLGE9dC5fc2l6ZSx1PXQuX2RhdGF0eXBlLGM9bi5fZGF0YSxsPW4uX3NpemUsaD1uLl9kYXRhdHlwZSxmPWFbMF0scD1hWzFdLGQ9bFsxXSxnPXIseT1pO3UmJmgmJnU9PT1oJiYic3RyaW5nIj09dHlwZW9mIHUmJihvPXUsZz1lLmZpbmQocixbbyxvXSkseT1lLmZpbmQoaSxbbyxvXSkpO2Zvcih2YXIgbT1bXSx2PTA7djxmO3YrKyl7dmFyIF89c1t2XTttW3ZdPVtdO2Zvcih2YXIgeD0wO3g8ZDt4Kyspe2Zvcih2YXIgdz15KF9bMF0sY1swXVt4XSksYj0xO2I8cDtiKyspdz1nKHcseShfW2JdLGNbYl1beF0pKTttW3ZdW3hdPXd9fXJldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOm0sc2l6ZTpbZixkXSxkYXRhdHlwZTpvfSl9LCJEZW5zZU1hdHJpeCwgU3BhcnNlTWF0cml4IjpmdW5jdGlvbih0LG4pe3ZhciBzPXQuX2RhdGEsYT10Ll9zaXplLHU9dC5fZGF0YXR5cGUsYz1uLl92YWx1ZXMsbD1uLl9pbmRleCxoPW4uX3B0cixmPW4uX3NpemUscD1uLl9kYXRhdHlwZTtpZighYyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBtdWx0aXBseSBEZW5zZSBNYXRyaXggdGltZXMgUGF0dGVybiBvbmx5IE1hdHJpeCIpO3ZhciBkLGc9YVswXSx5PWZbMV0sbT1yLHY9aSxfPW8seD0wO3UmJnAmJnU9PT1wJiYic3RyaW5nIj09dHlwZW9mIHUmJihkPXUsbT1lLmZpbmQocixbZCxkXSksdj1lLmZpbmQoaSxbZCxkXSksXz1lLmZpbmQobyxbZCxkXSkseD1lLmNvbnZlcnQoMCxkKSk7Zm9yKHZhciB3PVtdLGI9W10sRD1bXSxFPW4uY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6dyxpbmRleDpiLHB0cjpELHNpemU6W2cseV0sZGF0YXR5cGU6ZH0pLEM9MDtDPHk7QysrKXtEW0NdPWIubGVuZ3RoO3ZhciBTPWhbQ10sQT1oW0MrMV07aWYoQT5TKWZvcih2YXIgTj0wLEk9MDtJPGc7SSsrKXtmb3IodmFyIE09SSsxLEY9dm9pZCAwLFQ9UztUPEE7VCsrKXt2YXIgTz1sW1RdO04hPT1NPyhGPXYoc1tJXVtPXSxjW1RdKSxOPU0pOkY9bShGLHYoc1tJXVtPXSxjW1RdKSl9Tj09PU0mJiFfKEYseCkmJihiLnB1c2goSSksdy5wdXNoKEYpKX19cmV0dXJuIERbeV09Yi5sZW5ndGgsRX0sIlNwYXJzZU1hdHJpeCwgRGVuc2VNYXRyaXgiOmZ1bmN0aW9uKHQsbil7dmFyIHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9kYXRhdHlwZTtpZighcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBtdWx0aXBseSBQYXR0ZXJuIG9ubHkgTWF0cml4IHRpbWVzIERlbnNlIE1hdHJpeCIpO3ZhciBsLGg9bi5fZGF0YSxmPW4uX2RhdGF0eXBlLHA9dC5fc2l6ZVswXSxkPW4uX3NpemVbMF0sZz1uLl9zaXplWzFdLHk9cixtPWksdj1vLF89MDtjJiZmJiZjPT09ZiYmInN0cmluZyI9PXR5cGVvZiBjJiYobD1jLHk9ZS5maW5kKHIsW2wsbF0pLG09ZS5maW5kKGksW2wsbF0pLHY9ZS5maW5kKG8sW2wsbF0pLF89ZS5jb252ZXJ0KDAsbCkpO2Zvcih2YXIgeD1bXSx3PVtdLGI9W10sRD10LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOngsaW5kZXg6dyxwdHI6YixzaXplOltwLGddLGRhdGF0eXBlOmx9KSxFPVtdLEM9W10sUz0wO1M8ZztTKyspe2JbU109dy5sZW5ndGg7Zm9yKHZhciBBPVMrMSxOPTA7TjxkO04rKyl7dmFyIEk9aFtOXVtTXTtpZighdihJLF8pKWZvcih2YXIgTT11W05dLEY9dVtOKzFdLFQ9TTtUPEY7VCsrKXt2YXIgTz1hW1RdO0NbT10hPT1BPyhDW09dPUEsdy5wdXNoKE8pLEVbT109bShJLHNbVF0pKTpFW09dPXkoRVtPXSxtKEksc1tUXSkpfX1mb3IodmFyIEw9YltTXSxQPXcubGVuZ3RoLFI9TDtSPFA7UisrKXt2YXIgQj13W1JdO3hbUl09RVtCXX19cmV0dXJuIGJbZ109dy5sZW5ndGgsRH0sIlNwYXJzZU1hdHJpeCwgU3BhcnNlTWF0cml4IjpmdW5jdGlvbih0LG4pe3ZhciBvLHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9kYXRhdHlwZSxsPW4uX3ZhbHVlcyxoPW4uX2luZGV4LGY9bi5fcHRyLHA9bi5fZGF0YXR5cGUsZD10Ll9zaXplWzBdLGc9bi5fc2l6ZVsxXSx5PXMmJmwsbT1yLHY9aTtjJiZwJiZjPT09cCYmInN0cmluZyI9PXR5cGVvZiBjJiYobz1jLG09ZS5maW5kKHIsW28sb10pLHY9ZS5maW5kKGksW28sb10pKTtmb3IodmFyIF8seCx3LGIsRCxFLEMsUyxBPXk/W106dm9pZCAwLE49W10sST1bXSxNPXQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6QSxpbmRleDpOLHB0cjpJLHNpemU6W2QsZ10sZGF0YXR5cGU6b30pLEY9eT9bXTp2b2lkIDAsVD1bXSxPPTA7TzxnO08rKyl7SVtPXT1OLmxlbmd0aDt2YXIgTD1PKzE7Zm9yKEQ9ZltPXSxFPWZbTysxXSxiPUQ7YjxFO2IrKylpZihTPWhbYl0seSlmb3IoeD11W1NdLHc9dVtTKzFdLF89eDtfPHc7XysrKVRbQz1hW19dXSE9PUw/KFRbQ109TCxOLnB1c2goQyksRltDXT12KGxbYl0sc1tfXSkpOkZbQ109bShGW0NdLHYobFtiXSxzW19dKSk7ZWxzZSBmb3IoeD11W1NdLHc9dVtTKzFdLF89eDtfPHc7XysrKVRbQz1hW19dXSE9PUwmJihUW0NdPUwsTi5wdXNoKEMpKTtpZih5KWZvcih2YXIgUD1JW09dLFI9Ti5sZW5ndGgsQj1QO0I8UjtCKyspe3ZhciBrPU5bQl07QVtCXT1GW2tdfX1yZXR1cm4gSVtnXT1OLmxlbmd0aCxNfX0pO3JldHVybiBlKEp5LGkseyJBcnJheSwgQXJyYXkiOmUucmVmZXJUbygiTWF0cml4LCBNYXRyaXgiLCh0PT4oZSxyKT0+e2MoWHAoZSksWHAocikpO3ZhciBpPXQobihlKSxuKHIpKTtyZXR1cm4gcWYoaSk/aS52YWx1ZU9mKCk6aX0pKSwiTWF0cml4LCBNYXRyaXgiOmZ1bmN0aW9uKHQsZSl7dmFyIG49dC5zaXplKCkscj1lLnNpemUoKTtyZXR1cm4gYyhuLHIpLDE9PT1uLmxlbmd0aD8xPT09ci5sZW5ndGg/ZnVuY3Rpb24odCxlLG4pe2lmKDA9PT1uKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG11bHRpcGx5IHR3byBlbXB0eSB2ZWN0b3JzIik7cmV0dXJuIHModCxlKX0odCxlLG5bMF0pOmwodCxlKToxPT09ci5sZW5ndGg/aCh0LGUpOmYodCxlKX0sIk1hdHJpeCwgQXJyYXkiOmUucmVmZXJUbygiTWF0cml4LE1hdHJpeCIsKHQ9PihlLHIpPT50KGUsbihyKSkpKSwiQXJyYXksIE1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+KGUscik9PnQobihlLHIuc3RvcmFnZSgpKSxyKSkpLCJTcGFyc2VNYXRyaXgsIGFueSI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYSh0LGUsaSwhMSl9LCJEZW5zZU1hdHJpeCwgYW55IjpmdW5jdGlvbih0LGUpe3JldHVybiB1KHQsZSxpLCExKX0sImFueSwgU3BhcnNlTWF0cml4IjpmdW5jdGlvbih0LGUpe3JldHVybiBhKGUsdCxpLCEwKX0sImFueSwgRGVuc2VNYXRyaXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUoZSx0LGksITApfSwiQXJyYXksIGFueSI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdShuKHQpLGUsaSwhMSkudmFsdWVPZigpfSwiYW55LCBBcnJheSI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdShuKGUpLHQsaSwhMCkudmFsdWVPZigpfSwiYW55LCBhbnkiOmksImFueSwgYW55LCAuLi5hbnkiOmUucmVmZXJUb1NlbGYoKHQ9PihlLG4scik9Pntmb3IodmFyIGk9dChlLG4pLG89MDtvPHIubGVuZ3RoO28rKylpPXQoaSxyW29dKTtyZXR1cm4gaX0pKX0pfSkpLCR5PWlkKCJtYXRBbGdvMDl4UzBTZiIsWyJ0eXBlZCIsImVxdWFsU2NhbGFyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpufT10O3JldHVybiBmdW5jdGlvbih0LHIsaSl7dmFyIG89dC5fdmFsdWVzLHM9dC5faW5kZXgsYT10Ll9wdHIsdT10Ll9zaXplLGM9dC5fZGF0YXR5cGUsbD1yLl92YWx1ZXMsaD1yLl9pbmRleCxmPXIuX3B0cixwPXIuX3NpemUsZD1yLl9kYXRhdHlwZTtpZih1Lmxlbmd0aCE9PXAubGVuZ3RoKXRocm93IG5ldyBHcCh1Lmxlbmd0aCxwLmxlbmd0aCk7aWYodVswXSE9PXBbMF18fHVbMV0hPT1wWzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2guIE1hdHJpeCBBICgiK3UrIikgbXVzdCBtYXRjaCBNYXRyaXggQiAoIitwKyIpIik7dmFyIGcseT11WzBdLG09dVsxXSx2PW4sXz0wLHg9aTsic3RyaW5nIj09dHlwZW9mIGMmJmM9PT1kJiYoZz1jLHY9ZS5maW5kKG4sW2csZ10pLF89ZS5jb252ZXJ0KDAsZykseD1lLmZpbmQoaSxbZyxnXSkpO3ZhciB3LGIsRCxFLEMsUz1vJiZsP1tdOnZvaWQgMCxBPVtdLE49W10sST1TP1tdOnZvaWQgMCxNPVtdO2ZvcihiPTA7YjxtO2IrKyl7TltiXT1BLmxlbmd0aDt2YXIgRj1iKzE7aWYoSSlmb3IoRT1mW2JdLEM9ZltiKzFdLEQ9RTtEPEM7RCsrKU1bdz1oW0RdXT1GLElbd109bFtEXTtmb3IoRT1hW2JdLEM9YVtiKzFdLEQ9RTtEPEM7RCsrKWlmKHc9c1tEXSxJKXt2YXIgVD1NW3ddPT09Rj9JW3ddOl8sTz14KG9bRF0sVCk7dihPLF8pfHwoQS5wdXNoKHcpLFMucHVzaChPKSl9ZWxzZSBBLnB1c2godyl9cmV0dXJuIE5bbV09QS5sZW5ndGgsdC5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczpTLGluZGV4OkEscHRyOk4sc2l6ZTpbeSxtXSxkYXRhdHlwZTpnfSl9fSkpLHRtPWlkKCJtYXRBbGdvMDd4U1NmIixbInR5cGVkIiwiRGVuc2VNYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLERlbnNlTWF0cml4Om59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQsaSxvKXt2YXIgcz10Ll9zaXplLGE9dC5fZGF0YXR5cGUsdT1pLl9zaXplLGM9aS5fZGF0YXR5cGU7aWYocy5sZW5ndGghPT11Lmxlbmd0aCl0aHJvdyBuZXcgR3Aocy5sZW5ndGgsdS5sZW5ndGgpO2lmKHNbMF0hPT11WzBdfHxzWzFdIT09dVsxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIitzKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIrdSsiKSIpO3ZhciBsLGg9c1swXSxmPXNbMV0scD0wLGQ9bzsic3RyaW5nIj09dHlwZW9mIGEmJmE9PT1jJiYobD1hLHA9ZS5jb252ZXJ0KDAsbCksZD1lLmZpbmQobyxbbCxsXSkpO3ZhciBnLHksbT1bXTtmb3IoZz0wO2c8aDtnKyspbVtnXT1bXTt2YXIgdj1bXSxfPVtdLHg9W10sdz1bXTtmb3IoeT0wO3k8Zjt5Kyspe3ZhciBiPXkrMTtmb3Iocih0LHkseCx2LGIpLHIoaSx5LHcsXyxiKSxnPTA7ZzxoO2crKyl7dmFyIEQ9eFtnXT09PWI/dltnXTpwLEU9d1tnXT09PWI/X1tnXTpwO21bZ11beV09ZChELEUpfX1yZXR1cm4gbmV3IG4oe2RhdGE6bSxzaXplOltoLGZdLGRhdGF0eXBlOmx9KX07ZnVuY3Rpb24gcih0LGUsbixyLGkpe2Zvcih2YXIgbz10Ll92YWx1ZXMscz10Ll9pbmRleCxhPXQuX3B0cix1PWFbZV0sYz1hW2UrMV07dTxjO3UrKyl7dmFyIGw9c1t1XTtuW2xdPWkscltsXT1vW3VdfX19KSksZW09ImNvbmoiLG5tPWlkKGVtLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBlKGVtLHsibnVtYmVyIHwgQmlnTnVtYmVyIHwgRnJhY3Rpb24iOnQ9PnQsQ29tcGxleDp0PT50LmNvbmp1Z2F0ZSgpLCJBcnJheSB8IE1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+ZT0+d3koZSx0KSkpfSl9KSkscm09ImNvbmNhdCIsaW09aWQocm0sWyJ0eXBlZCIsIm1hdHJpeCIsImlzSW50ZWdlciJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4saXNJbnRlZ2VyOnJ9PXQ7cmV0dXJuIGUocm0seyIuLi5BcnJheSB8IE1hdHJpeCB8IG51bWJlciB8IEJpZ051bWJlciI6ZnVuY3Rpb24odCl7dmFyIGUsaSxvPXQubGVuZ3RoLHM9LTEsYT0hMSx1PVtdO2ZvcihlPTA7ZTxvO2UrKyl7dmFyIGM9dFtlXTtpZihxZihjKSYmKGE9ITApLFBmKGMpfHxSZihjKSl7aWYoZSE9PW8tMSl0aHJvdyBuZXcgRXJyb3IoIkRpbWVuc2lvbiBtdXN0IGJlIHNwZWNpZmllZCBhcyBsYXN0IGFyZ3VtZW50Iik7aWYoaT1zLHM9Yy52YWx1ZU9mKCksIXIocykpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW50ZWdlciBudW1iZXIgZXhwZWN0ZWQgZm9yIGRpbWVuc2lvbiIpO2lmKHM8MHx8ZT4wJiZzPmkpdGhyb3cgbmV3IFlwKHMsaSsxKX1lbHNle3ZhciBsPXdwKGMpLnZhbHVlT2YoKSxoPVhwKGwpO2lmKHVbZV09bCxpPXMscz1oLmxlbmd0aC0xLGU+MCYmcyE9PWkpdGhyb3cgbmV3IEdwKGkrMSxzKzEpfX1pZigwPT09dS5sZW5ndGgpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJBdCBsZWFzdCBvbmUgbWF0cml4IGV4cGVjdGVkIik7Zm9yKHZhciBmPXUuc2hpZnQoKTt1Lmxlbmd0aDspZj1vbShmLHUuc2hpZnQoKSxzLDApO3JldHVybiBhP24oZik6Zn0sIi4uLnN0cmluZyI6ZnVuY3Rpb24odCl7cmV0dXJuIHQuam9pbigiIil9fSl9KSk7ZnVuY3Rpb24gb20odCxlLG4scil7aWYocjxuKXtpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBHcCh0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKHZhciBpPVtdLG89MDtvPHQubGVuZ3RoO28rKylpW29dPW9tKHRbb10sZVtvXSxuLHIrMSk7cmV0dXJuIGl9cmV0dXJuIHQuY29uY2F0KGUpfXZhciBzbT1pZCgib25lcyIsWyJ0eXBlZCIsImNvbmZpZyIsIm1hdHJpeCIsIkJpZ051bWJlciJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm4sbWF0cml4OnIsQmlnTnVtYmVyOml9PXQ7cmV0dXJuIGUoIm9uZXMiLHsiIjpmdW5jdGlvbigpe3JldHVybiJBcnJheSI9PT1uLm1hdHJpeD9vKFtdKTpvKFtdLCJkZWZhdWx0Iil9LCIuLi5udW1iZXIgfCBCaWdOdW1iZXIgfCBzdHJpbmciOmZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdFt0Lmxlbmd0aC0xXSl7dmFyIGU9dC5wb3AoKTtyZXR1cm4gbyh0LGUpfXJldHVybiJBcnJheSI9PT1uLm1hdHJpeD9vKHQpOm8odCwiZGVmYXVsdCIpfSxBcnJheTpvLE1hdHJpeDpmdW5jdGlvbih0KXt2YXIgZT10LnN0b3JhZ2UoKTtyZXR1cm4gbyh0LnZhbHVlT2YoKSxlKX0sIkFycmF5IHwgTWF0cml4LCBzdHJpbmciOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8odC52YWx1ZU9mKCksZSl9fSk7ZnVuY3Rpb24gbyh0LGUpe3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciBlPSExO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQsbixyKXtSZih0KSYmKGU9ITAscltuXT10LnRvTnVtYmVyKCkpfSkpLGV9KHQpLG89bj9uZXcgaSgxKToxO2lmKGZ1bmN0aW9uKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0fHwhTXAodCl8fHQ8MCl0aHJvdyBuZXcgRXJyb3IoIlBhcmFtZXRlcnMgaW4gZnVuY3Rpb24gb25lcyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzIil9KSl9KHQpLGUpe3ZhciBzPXIoZSk7cmV0dXJuIHQubGVuZ3RoPjA/cy5yZXNpemUodCxvKTpzfXZhciBhPVtdO3JldHVybiB0Lmxlbmd0aD4wP0twKGEsdCxvKTphfX0pKTtmdW5jdGlvbiBhbSgpe3Rocm93IG5ldyBFcnJvcignTm8gImJpZ251bWJlciIgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlJyl9ZnVuY3Rpb24gdW0oKXt0aHJvdyBuZXcgRXJyb3IoJ05vICJmcmFjdGlvbiIgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlJyl9ZnVuY3Rpb24gY20oKXt0aHJvdyBuZXcgRXJyb3IoJ05vICJtYXRyaXgiIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZScpfXZhciBsbT0icmFuZ2UiLGhtPWlkKGxtLFsidHlwZWQiLCJjb25maWciLCI/bWF0cml4IiwiP2JpZ251bWJlciIsInNtYWxsZXIiLCJzbWFsbGVyRXEiLCJsYXJnZXIiLCJsYXJnZXJFcSJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm4sbWF0cml4OnIsYmlnbnVtYmVyOmksc21hbGxlcjpvLHNtYWxsZXJFcTpzLGxhcmdlcjphLGxhcmdlckVxOnV9PXQ7cmV0dXJuIGUobG0se3N0cmluZzpsLCJzdHJpbmcsIGJvb2xlYW4iOmwsIm51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiBjKGgodCxlLDEpKX0sIm51bWJlciwgbnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYyhoKHQsZSxuKSl9LCJudW1iZXIsIG51bWJlciwgYm9vbGVhbiI6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjKG4/Zih0LGUsMSk6aCh0LGUsMSkpfSwibnVtYmVyLCBudW1iZXIsIG51bWJlciwgYm9vbGVhbiI6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGMocj9mKHQsZSxuKTpoKHQsZSxuKSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYyhwKHQsZSxuZXcoMCx0LmNvbnN0cnVjdG9yKSgxKSkpfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjKHAodCxlLG4pKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyLCBib29sZWFuIjpmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5jb25zdHJ1Y3RvcjtyZXR1cm4gYyhuP2QodCxlLG5ldyByKDEpKTpwKHQsZSxuZXcgcigxKSkpfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIsIEJpZ051bWJlciwgYm9vbGVhbiI6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGMocj9kKHQsZSxuKTpwKHQsZSxuKSl9fSk7ZnVuY3Rpb24gYyh0KXtyZXR1cm4iTWF0cml4Ij09PW4ubWF0cml4P3I/cih0KTpjbSgpOnR9ZnVuY3Rpb24gbCh0LGUpe3ZhciByPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc3BsaXQoIjoiKSxuPWUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQpfSkpLHI9bi5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gaXNOYU4odCl9KSk7aWYocilyZXR1cm4gbnVsbDtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMjpyZXR1cm57c3RhcnQ6blswXSxlbmQ6blsxXSxzdGVwOjF9O2Nhc2UgMzpyZXR1cm57c3RhcnQ6blswXSxlbmQ6blsyXSxzdGVwOm5bMV19O2RlZmF1bHQ6cmV0dXJuIG51bGx9fSh0KTtpZighcil0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N0cmluZyAiJyt0KyciIGlzIG5vIHZhbGlkIHJhbmdlJyk7cmV0dXJuIkJpZ051bWJlciI9PT1uLm51bWJlcj8odm9pZCAwPT09aSYmYW0oKSxjKChlP2Q6cCkoaShyLnN0YXJ0KSxpKHIuZW5kKSxpKHIuc3RlcCkpKSk6YygoZT9mOmgpKHIuc3RhcnQsci5lbmQsci5zdGVwKSl9ZnVuY3Rpb24gaCh0LGUsbil7dmFyIHI9W10saT10O2lmKG4+MClmb3IoO28oaSxlKTspci5wdXNoKGkpLGkrPW47ZWxzZSBpZihuPDApZm9yKDthKGksZSk7KXIucHVzaChpKSxpKz1uO3JldHVybiByfWZ1bmN0aW9uIGYodCxlLG4pe3ZhciByPVtdLGk9dDtpZihuPjApZm9yKDtzKGksZSk7KXIucHVzaChpKSxpKz1uO2Vsc2UgaWYobjwwKWZvcig7dShpLGUpOylyLnB1c2goaSksaSs9bjtyZXR1cm4gcn1mdW5jdGlvbiBwKHQsZSxuKXt2YXIgcj1pKDApLHM9W10sdT10O2lmKG4uZ3QocikpZm9yKDtvKHUsZSk7KXMucHVzaCh1KSx1PXUucGx1cyhuKTtlbHNlIGlmKG4ubHQocikpZm9yKDthKHUsZSk7KXMucHVzaCh1KSx1PXUucGx1cyhuKTtyZXR1cm4gc31mdW5jdGlvbiBkKHQsZSxuKXt2YXIgcj1pKDApLG89W10sYT10O2lmKG4uZ3QocikpZm9yKDtzKGEsZSk7KW8ucHVzaChhKSxhPWEucGx1cyhuKTtlbHNlIGlmKG4ubHQocikpZm9yKDt1KGEsZSk7KW8ucHVzaChhKSxhPWEucGx1cyhuKTtyZXR1cm4gb319KSksZm09InNpemUiLHBtPWlkKGZtLFsidHlwZWQiLCJjb25maWciLCI/bWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cn09dDtyZXR1cm4gZShmbSx7TWF0cml4OmZ1bmN0aW9uKHQpe3JldHVybiB0LmNyZWF0ZSh0LnNpemUoKSl9LEFycmF5OlhwLHN0cmluZzpmdW5jdGlvbih0KXtyZXR1cm4iQXJyYXkiPT09bi5tYXRyaXg/W3QubGVuZ3RoXTpyKFt0Lmxlbmd0aF0pfSwibnVtYmVyIHwgQ29tcGxleCB8IEJpZ051bWJlciB8IFVuaXQgfCBib29sZWFuIHwgbnVsbCI6ZnVuY3Rpb24odCl7cmV0dXJuIkFycmF5Ij09PW4ubWF0cml4P1tdOnI/cihbXSk6Y20oKX19KX0pKSxkbT0ic3Vic2V0IixnbT1pZChkbSxbInR5cGVkIiwibWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bn09dDtyZXR1cm4gZShkbSx7IkFycmF5LCBJbmRleCI6ZnVuY3Rpb24odCxlKXt2YXIgcj1uKHQpLnN1YnNldChlKTtyZXR1cm4gZS5pc1NjYWxhcigpP3I6ci52YWx1ZU9mKCl9LCJNYXRyaXgsIEluZGV4IjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnN1YnNldChlKX0sIk9iamVjdCwgSW5kZXgiOnZtLCJzdHJpbmcsIEluZGV4Ijp5bSwiQXJyYXksIEluZGV4LCBhbnkiOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbih3cCh0KSkuc3Vic2V0KGUscix2b2lkIDApLnZhbHVlT2YoKX0sIkFycmF5LCBJbmRleCwgYW55LCBhbnkiOmZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybiBuKHdwKHQpKS5zdWJzZXQoZSxyLGkpLnZhbHVlT2YoKX0sIk1hdHJpeCwgSW5kZXgsIGFueSI6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0LmNsb25lKCkuc3Vic2V0KGUsbil9LCJNYXRyaXgsIEluZGV4LCBhbnksIGFueSI6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHQuY2xvbmUoKS5zdWJzZXQoZSxuLHIpfSwic3RyaW5nLCBJbmRleCwgc3RyaW5nIjptbSwic3RyaW5nLCBJbmRleCwgc3RyaW5nLCBzdHJpbmciOm1tLCJPYmplY3QsIEluZGV4LCBhbnkiOl9tfSl9KSk7ZnVuY3Rpb24geW0odCxlKXtpZighV2YoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW5kZXggZXhwZWN0ZWQiKTtpZigxIT09ZS5zaXplKCkubGVuZ3RoKXRocm93IG5ldyBHcChlLnNpemUoKS5sZW5ndGgsMSk7dmFyIG49dC5sZW5ndGg7WnAoZS5taW4oKVswXSxuKSxacChlLm1heCgpWzBdLG4pO3ZhciByPWUuZGltZW5zaW9uKDApLGk9IiI7cmV0dXJuIHIuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aSs9dC5jaGFyQXQoZSl9KSksaX1mdW5jdGlvbiBtbSh0LGUsbixyKXtpZighZXx8ITAhPT1lLmlzSW5kZXgpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW5kZXggZXhwZWN0ZWQiKTtpZigxIT09ZS5zaXplKCkubGVuZ3RoKXRocm93IG5ldyBHcChlLnNpemUoKS5sZW5ndGgsMSk7aWYodm9pZCAwIT09cil7aWYoInN0cmluZyIhPXR5cGVvZiByfHwxIT09ci5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiU2luZ2xlIGNoYXJhY3RlciBleHBlY3RlZCBhcyBkZWZhdWx0VmFsdWUiKX1lbHNlIHI9IiAiO3ZhciBpPWUuZGltZW5zaW9uKDApO2lmKGkuc2l6ZSgpWzBdIT09bi5sZW5ndGgpdGhyb3cgbmV3IEdwKGkuc2l6ZSgpWzBdLG4ubGVuZ3RoKTt2YXIgbz10Lmxlbmd0aDtacChlLm1pbigpWzBdKSxacChlLm1heCgpWzBdKTtmb3IodmFyIHM9W10sYT0wO2E8bzthKyspc1thXT10LmNoYXJBdChhKTtpZihpLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7c1t0XT1uLmNoYXJBdChlWzBdKX0pKSxzLmxlbmd0aD5vKWZvcih2YXIgdT1vLTEsYz1zLmxlbmd0aDt1PGM7dSsrKXNbdV18fChzW3VdPXIpO3JldHVybiBzLmpvaW4oIiIpfWZ1bmN0aW9uIHZtKHQsZSl7aWYoMSE9PWUuc2l6ZSgpLmxlbmd0aCl0aHJvdyBuZXcgR3AoZS5zaXplKCksMSk7dmFyIG49ZS5kaW1lbnNpb24oMCk7aWYoInN0cmluZyIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoIlN0cmluZyBleHBlY3RlZCBhcyBpbmRleCB0byByZXRyaWV2ZSBhbiBvYmplY3QgcHJvcGVydHkiKTtyZXR1cm4gc2QodCxuKX1mdW5jdGlvbiBfbSh0LGUsbil7aWYoMSE9PWUuc2l6ZSgpLmxlbmd0aCl0aHJvdyBuZXcgR3AoZS5zaXplKCksMSk7dmFyIHI9ZS5kaW1lbnNpb24oMCk7aWYoInN0cmluZyIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIlN0cmluZyBleHBlY3RlZCBhcyBpbmRleCB0byByZXRyaWV2ZSBhbiBvYmplY3QgcHJvcGVydHkiKTt2YXIgaT13cCh0KTtyZXR1cm4gYWQoaSxyLG4pLGl9dmFyIHhtPSJ0cmFuc3Bvc2UiLHdtPWlkKHhtLFsidHlwZWQiLCJtYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLG1hdHJpeDpufT10O3JldHVybiBlKHhtLHtBcnJheTp0PT5yKG4odCkpLnZhbHVlT2YoKSxNYXRyaXg6cixhbnk6d3B9KTtmdW5jdGlvbiByKHQpe3ZhciBlLG49dC5zaXplKCk7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDE6ZT10LmNsb25lKCk7YnJlYWs7Y2FzZSAyOnZhciByPW5bMF0saT1uWzFdO2lmKDA9PT1pKXRocm93IG5ldyBSYW5nZUVycm9yKCJDYW5ub3QgdHJhbnNwb3NlIGEgMkQgbWF0cml4IHdpdGggbm8gY29sdW1ucyAoc2l6ZTogIitxcChuKSsiKSIpO3N3aXRjaCh0LnN0b3JhZ2UoKSl7Y2FzZSJkZW5zZSI6ZT1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGk9dC5fZGF0YSxvPVtdLHM9MDtzPG47cysrKXtyPW9bc109W107Zm9yKHZhciBhPTA7YTxlO2ErKylyW2FdPXdwKGlbYV1bc10pfXJldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOm8sc2l6ZTpbbixlXSxkYXRhdHlwZTp0Ll9kYXRhdHlwZX0pfSh0LHIsaSk7YnJlYWs7Y2FzZSJzcGFyc2UiOmU9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10Ll92YWx1ZXMsaT10Ll9pbmRleCxvPXQuX3B0cixzPXI/W106dm9pZCAwLGE9W10sdT1bXSxjPVtdLGw9MDtsPGU7bCsrKWNbbF09MDt2YXIgaCxmLHA7Zm9yKGg9MCxmPWkubGVuZ3RoO2g8ZjtoKyspY1tpW2hdXSsrO2Zvcih2YXIgZD0wLGc9MDtnPGU7ZysrKXUucHVzaChkKSxkKz1jW2ddLGNbZ109dVtnXTtmb3IodS5wdXNoKGQpLHA9MDtwPG47cCsrKWZvcih2YXIgeT1vW3BdLG09b1twKzFdLHY9eTt2PG07disrKXt2YXIgXz1jW2lbdl1dKys7YVtfXT1wLHImJihzW19dPXdwKHJbdl0pKX1yZXR1cm4gdC5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczpzLGluZGV4OmEscHRyOnUsc2l6ZTpbbixlXSxkYXRhdHlwZTp0Ll9kYXRhdHlwZX0pfSh0LHIsaSl9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cml4IG11c3QgYmUgYSB2ZWN0b3Igb3IgdHdvIGRpbWVuc2lvbmFsIChzaXplOiAiK3FwKG4pKyIpIil9cmV0dXJuIGV9fSkpLGJtPWlkKCJudW1lcmljIixbIm51bWJlciIsIj9iaWdudW1iZXIiLCI/ZnJhY3Rpb24iXSwodD0+e3ZhcntudW1iZXI6ZSxiaWdudW1iZXI6bixmcmFjdGlvbjpyfT10LGk9e3N0cmluZzohMCxudW1iZXI6ITAsQmlnTnVtYmVyOiEwLEZyYWN0aW9uOiEwfSxvPXtudW1iZXI6dD0+ZSh0KSxCaWdOdW1iZXI6bj90PT5uKHQpOmFtLEZyYWN0aW9uOnI/dD0+cih0KTp1bX07cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToibnVtYmVyIjtpZih2b2lkIDAhPT0oYXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDApKXRocm93IG5ldyBTeW50YXhFcnJvcigibnVtZXJpYygpIHRha2VzIG9uZSBvciB0d28gYXJndW1lbnRzIik7dmFyIG49eHAodCk7aWYoIShuIGluIGkpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICIrdCsnIG9mIHR5cGUgIicrbisnIjsgdmFsaWQgaW5wdXQgdHlwZXMgYXJlICcrT2JqZWN0LmtleXMoaSkuam9pbigiLCAiKSk7aWYoIShlIGluIG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICIrdCsnIHRvIHR5cGUgIicrZSsnIjsgdmFsaWQgb3V0cHV0IHR5cGVzIGFyZSAnK09iamVjdC5rZXlzKG8pLmpvaW4oIiwgIikpO3JldHVybiBlPT09bj90Om9bZV0odCl9fSkpLERtPSJkaXZpZGVTY2FsYXIiLEVtPWlkKERtLFsidHlwZWQiLCJudW1lcmljIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxudW1lcmljOm59PXQ7cmV0dXJuIGUoRG0seyJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC9lfSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5kaXYoZSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5kaXYoZSl9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZGl2KGUpfSwiVW5pdCwgbnVtYmVyIHwgQ29tcGxleCB8IEZyYWN0aW9uIHwgQmlnTnVtYmVyIHwgVW5pdCI6KHQsZSk9PnQuZGl2aWRlKGUpLCJudW1iZXIgfCBGcmFjdGlvbiB8IENvbXBsZXggfCBCaWdOdW1iZXIsIFVuaXQiOih0LGUpPT5lLmRpdmlkZUludG8odCl9KX0pKSxDbT0iZG90RGl2aWRlIixTbT1pZChDbSxbInR5cGVkIiwibWF0cml4IiwiZXF1YWxTY2FsYXIiLCJkaXZpZGVTY2FsYXIiLCJEZW5zZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4sZXF1YWxTY2FsYXI6cixkaXZpZGVTY2FsYXI6aSxEZW5zZU1hdHJpeDpvLGNvbmNhdDpzfT10LGE9SHkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6cn0pLHU9Wnkoe3R5cGVkOmV9KSxjPXRtKHt0eXBlZDplLERlbnNlTWF0cml4Om99KSxsPXp5KHt0eXBlZDplLGVxdWFsU2NhbGFyOnJ9KSxoPWp5KHt0eXBlZDplLERlbnNlTWF0cml4Om99KSxmPVd5KHt0eXBlZDplLG1hdHJpeDpuLGNvbmNhdDpzfSk7cmV0dXJuIGUoQ20sZih7ZWxvcDppLFNTOmMsRFM6dSxTRDphLFNzOmwsc1M6aH0pKX0pKSxBbT0ic21hbGxlciIsTm09aWQoQW0sWyJ0eXBlZCIsImNvbmZpZyIsIm1hdHJpeCIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixEZW5zZU1hdHJpeDppLGNvbmNhdDpvfT10LHM9Wnkoe3R5cGVkOmV9KSxhPXRtKHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSx1PWp5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSxjPVd5KHt0eXBlZDplLG1hdHJpeDpyLGNvbmNhdDpvfSksbD1OeSh7dHlwZWQ6ZX0pO3JldHVybiBlKEFtLEltKHt0eXBlZDplLGNvbmZpZzpufSkseyJib29sZWFuLCBib29sZWFuIjoodCxlKT0+dDxlLCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5sdChlKSYmIUF5KHQsZSxuLmVwc2lsb24pfSwiRnJhY3Rpb24sIEZyYWN0aW9uIjoodCxlKT0+LTE9PT10LmNvbXBhcmUoZSksIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiTm8gb3JkZXJpbmcgcmVsYXRpb24gaXMgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzIil9fSxsLGMoe1NTOmEsRFM6cyxTczp1fSkpfSkpLEltPWlkKEFtLFsidHlwZWQiLCJjb25maWciXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpufT10O3JldHVybiBlKEFtLHsibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZSYmIWtwKHQsZSxuLmVwc2lsb24pfX0pfSkpLE1tPSJzbWFsbGVyRXEiLEZtPWlkKE1tLFsidHlwZWQiLCJjb25maWciLCJtYXRyaXgiLCJEZW5zZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm4sbWF0cml4OnIsRGVuc2VNYXRyaXg6aSxjb25jYXQ6b309dCxzPVp5KHt0eXBlZDplfSksYT10bSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksdT1qeSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksYz1XeSh7dHlwZWQ6ZSxtYXRyaXg6cixjb25jYXQ6b30pLGw9Tnkoe3R5cGVkOmV9KTtyZXR1cm4gZShNbSxUbSh7dHlwZWQ6ZSxjb25maWc6bn0pLHsiYm9vbGVhbiwgYm9vbGVhbiI6KHQsZSk9PnQ8PWUsIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lmx0ZShlKXx8QXkodCxlLG4uZXBzaWxvbil9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOih0LGUpPT4xIT09dC5jb21wYXJlKGUpLCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIk5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVycyIpfX0sbCxjKHtTUzphLERTOnMsU3M6dX0pKX0pKSxUbT1pZChNbSxbInR5cGVkIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bn09dDtyZXR1cm4gZShNbSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0PD1lfHxrcCh0LGUsbi5lcHNpbG9uKX19KX0pKSxPbT0ibGFyZ2VyIixMbT1pZChPbSxbInR5cGVkIiwiY29uZmlnIiwibWF0cml4IiwiRGVuc2VNYXRyaXgiLCJjb25jYXQiXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpuLG1hdHJpeDpyLERlbnNlTWF0cml4OmksY29uY2F0Om99PXQscz1aeSh7dHlwZWQ6ZX0pLGE9dG0oe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLHU9ankoe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLGM9V3koe3R5cGVkOmUsbWF0cml4OnIsY29uY2F0Om99KSxsPU55KHt0eXBlZDplfSk7cmV0dXJuIGUoT20sUG0oe3R5cGVkOmUsY29uZmlnOm59KSx7ImJvb2xlYW4sIGJvb2xlYW4iOih0LGUpPT50PmUsIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lmd0KGUpJiYhQXkodCxlLG4uZXBzaWxvbil9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOih0LGUpPT4xPT09dC5jb21wYXJlKGUpLCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIk5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVycyIpfX0sbCxjKHtTUzphLERTOnMsU3M6dX0pKX0pKSxQbT1pZChPbSxbInR5cGVkIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bn09dDtyZXR1cm4gZShPbSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0PmUmJiFrcCh0LGUsbi5lcHNpbG9uKX19KX0pKSxSbT0ibGFyZ2VyRXEiLEJtPWlkKFJtLFsidHlwZWQiLCJjb25maWciLCJtYXRyaXgiLCJEZW5zZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm4sbWF0cml4OnIsRGVuc2VNYXRyaXg6aSxjb25jYXQ6b309dCxzPVp5KHt0eXBlZDplfSksYT10bSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksdT1qeSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksYz1XeSh7dHlwZWQ6ZSxtYXRyaXg6cixjb25jYXQ6b30pLGw9Tnkoe3R5cGVkOmV9KTtyZXR1cm4gZShSbSxrbSh7dHlwZWQ6ZSxjb25maWc6bn0pLHsiYm9vbGVhbiwgYm9vbGVhbiI6KHQsZSk9PnQ+PWUsIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lmd0ZShlKXx8QXkodCxlLG4uZXBzaWxvbil9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOih0LGUpPT4tMSE9PXQuY29tcGFyZShlKSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJObyBvcmRlcmluZyByZWxhdGlvbiBpcyBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMiKX19LGwsYyh7U1M6YSxEUzpzLFNzOnV9KSl9KSksa209aWQoUm0sWyJ0eXBlZCIsImNvbmZpZyJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm59PXQ7cmV0dXJuIGUoUm0seyJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD49ZXx8a3AodCxlLG4uZXBzaWxvbil9fSl9KSksem09aWQoIkltbXV0YWJsZURlbnNlTWF0cml4IixbInNtYWxsZXIiLCJEZW5zZU1hdHJpeCJdLCh0PT57dmFye3NtYWxsZXI6ZSxEZW5zZU1hdHJpeDpufT10O2Z1bmN0aW9uIHIodCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO2lmKGUmJiFqZihlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZGF0YXR5cGU6ICIrZSk7aWYocWYodCl8fFVmKHQpKXt2YXIgaT1uZXcgbih0LGUpO3RoaXMuX2RhdGE9aS5fZGF0YSx0aGlzLl9zaXplPWkuX3NpemUsdGhpcy5fZGF0YXR5cGU9aS5fZGF0YXR5cGUsdGhpcy5fbWluPW51bGwsdGhpcy5fbWF4PW51bGx9ZWxzZSBpZih0JiZVZih0LmRhdGEpJiZVZih0LnNpemUpKXRoaXMuX2RhdGE9dC5kYXRhLHRoaXMuX3NpemU9dC5zaXplLHRoaXMuX2RhdGF0eXBlPXQuZGF0YXR5cGUsdGhpcy5fbWluPXZvaWQgMCE9PXQubWluP3QubWluOm51bGwsdGhpcy5fbWF4PXZvaWQgMCE9PXQubWF4P3QubWF4Om51bGw7ZWxzZXtpZih0KXRocm93IG5ldyBUeXBlRXJyb3IoIlVuc3VwcG9ydGVkIHR5cGUgb2YgZGF0YSAoIit4cCh0KSsiKSIpO3RoaXMuX2RhdGE9W10sdGhpcy5fc2l6ZT1bMF0sdGhpcy5fZGF0YXR5cGU9ZSx0aGlzLl9taW49bnVsbCx0aGlzLl9tYXg9bnVsbH19cmV0dXJuIHIucHJvdG90eXBlPW5ldyBuLHIucHJvdG90eXBlLnR5cGU9IkltbXV0YWJsZURlbnNlTWF0cml4IixyLnByb3RvdHlwZS5pc0ltbXV0YWJsZURlbnNlTWF0cml4PSEwLHIucHJvdG90eXBlLnN1YnNldD1mdW5jdGlvbih0KXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOnZhciBlPW4ucHJvdG90eXBlLnN1YnNldC5jYWxsKHRoaXMsdCk7cmV0dXJuIHFmKGUpP25ldyByKHtkYXRhOmUuX2RhdGEsc2l6ZTplLl9zaXplLGRhdGF0eXBlOmUuX2RhdGF0eXBlfSk6ZTtjYXNlIDI6Y2FzZSAzOnRocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzZXQgc3Vic2V0IG9uIGFuIEltbXV0YWJsZSBNYXRyaXggaW5zdGFuY2UiKTtkZWZhdWx0OnRocm93IG5ldyBTeW50YXhFcnJvcigiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyIpfX0sci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHNldCBvbiBhbiBJbW11dGFibGUgTWF0cml4IGluc3RhbmNlIil9LHIucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSByZXNpemUgb24gYW4gSW1tdXRhYmxlIE1hdHJpeCBpbnN0YW5jZSIpfSxyLnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHJlc2hhcGUgb24gYW4gSW1tdXRhYmxlIE1hdHJpeCBpbnN0YW5jZSIpfSxyLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgcih7ZGF0YTp3cCh0aGlzLl9kYXRhKSxzaXplOndwKHRoaXMuX3NpemUpLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfSl9LHIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkltbXV0YWJsZURlbnNlTWF0cml4IixkYXRhOnRoaXMuX2RhdGEsc2l6ZTp0aGlzLl9zaXplLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfX0sci5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHIodCl9LHIucHJvdG90eXBlLnN3YXBSb3dzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHN3YXBSb3dzIG9uIGFuIEltbXV0YWJsZSBNYXRyaXggaW5zdGFuY2UiKX0sci5wcm90b3R5cGUubWluPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX21pbil7dmFyIHQ9bnVsbDt0aGlzLmZvckVhY2goKGZ1bmN0aW9uKG4peyhudWxsPT09dHx8ZShuLHQpKSYmKHQ9bil9KSksdGhpcy5fbWluPW51bGwhPT10P3Q6dm9pZCAwfXJldHVybiB0aGlzLl9taW59LHIucHJvdG90eXBlLm1heD1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9tYXgpe3ZhciB0PW51bGw7dGhpcy5mb3JFYWNoKChmdW5jdGlvbihuKXsobnVsbD09PXR8fGUodCxuKSkmJih0PW4pfSkpLHRoaXMuX21heD1udWxsIT09dD90OnZvaWQgMH1yZXR1cm4gdGhpcy5fbWF4fSxyfSkse2lzQ2xhc3M6ITB9KSxqbT1pZCgiSW5kZXgiLFsiSW1tdXRhYmxlRGVuc2VNYXRyaXgiXSwodD0+e3ZhcntJbW11dGFibGVEZW5zZU1hdHJpeDplfT10O2Z1bmN0aW9uIG4odCl7aWYoISh0aGlzIGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3IiKTt0aGlzLl9kaW1lbnNpb25zPVtdLHRoaXMuX2lzU2NhbGFyPSEwO2Zvcih2YXIgZT0wLGk9YXJndW1lbnRzLmxlbmd0aDtlPGk7ZSsrKXt2YXIgbz1hcmd1bWVudHNbZV07aWYoWGYobykpdGhpcy5fZGltZW5zaW9ucy5wdXNoKG8pLHRoaXMuX2lzU2NhbGFyPSExO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShvKXx8cWYobykpe3ZhciBzPXIoby52YWx1ZU9mKCkpO3RoaXMuX2RpbWVuc2lvbnMucHVzaChzKTt2YXIgYT1zLnNpemUoKTsoMSE9PWEubGVuZ3RofHwxIT09YVswXSkmJih0aGlzLl9pc1NjYWxhcj0hMSl9ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIG8pdGhpcy5fZGltZW5zaW9ucy5wdXNoKHIoW29dKSk7ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiRGltZW5zaW9uIG11c3QgYmUgYW4gQXJyYXksIE1hdHJpeCwgbnVtYmVyLCBzdHJpbmcsIG9yIFJhbmdlIik7dGhpcy5fZGltZW5zaW9ucy5wdXNoKG8pfX19ZnVuY3Rpb24gcih0KXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoIm51bWJlciIhPXR5cGVvZiB0W25dfHwhTXAodFtuXSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW5kZXggcGFyYW1ldGVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIgbnVtYmVycyIpO3JldHVybiBuZXcgZSh0KX1yZXR1cm4gbi5wcm90b3R5cGUudHlwZT0iSW5kZXgiLG4ucHJvdG90eXBlLmlzSW5kZXg9ITAsbi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbjtyZXR1cm4gdC5fZGltZW5zaW9ucz13cCh0aGlzLl9kaW1lbnNpb25zKSx0Ll9pc1NjYWxhcj10aGlzLl9pc1NjYWxhcix0fSxuLmNyZWF0ZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbjtyZXR1cm4gbi5hcHBseShlLHQpLGV9LG4ucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5fZGltZW5zaW9ucy5sZW5ndGg7ZTxuO2UrKyl7dmFyIHI9dGhpcy5fZGltZW5zaW9uc1tlXTt0W2VdPSJzdHJpbmciPT10eXBlb2Ygcj8xOnIuc2l6ZSgpWzBdfXJldHVybiB0fSxuLnByb3RvdHlwZS5tYXg9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5fZGltZW5zaW9ucy5sZW5ndGg7ZTxuO2UrKyl7dmFyIHI9dGhpcy5fZGltZW5zaW9uc1tlXTt0W2VdPSJzdHJpbmciPT10eXBlb2Ygcj9yOnIubWF4KCl9cmV0dXJuIHR9LG4ucHJvdG90eXBlLm1pbj1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9kaW1lbnNpb25zLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9kaW1lbnNpb25zW2VdO3RbZV09InN0cmluZyI9PXR5cGVvZiByP3I6ci5taW4oKX1yZXR1cm4gdH0sbi5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoO2U8bjtlKyspdCh0aGlzLl9kaW1lbnNpb25zW2VdLGUsdGhpcyl9LG4ucHJvdG90eXBlLmRpbWVuc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGltZW5zaW9uc1t0XXx8bnVsbH0sbi5wcm90b3R5cGUuaXNPYmplY3RQcm9wZXJ0eT1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5fZGltZW5zaW9ucy5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YgdGhpcy5fZGltZW5zaW9uc1swXX0sbi5wcm90b3R5cGUuZ2V0T2JqZWN0UHJvcGVydHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc09iamVjdFByb3BlcnR5KCk/dGhpcy5fZGltZW5zaW9uc1swXTpudWxsfSxuLnByb3RvdHlwZS5pc1NjYWxhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1NjYWxhcn0sbi5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9kaW1lbnNpb25zLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9kaW1lbnNpb25zW2VdO3QucHVzaCgic3RyaW5nIj09dHlwZW9mIHI/cjpyLnRvQXJyYXkoKSl9cmV0dXJuIHR9LG4ucHJvdG90eXBlLnZhbHVlT2Y9bi5wcm90b3R5cGUudG9BcnJheSxuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9kaW1lbnNpb25zLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9kaW1lbnNpb25zW2VdOyJzdHJpbmciPT10eXBlb2Ygcj90LnB1c2goSlNPTi5zdHJpbmdpZnkocikpOnQucHVzaChyLnRvU3RyaW5nKCkpfXJldHVybiJbIit0LmpvaW4oIiwgIikrIl0ifSxuLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJJbmRleCIsZGltZW5zaW9uczp0aGlzLl9kaW1lbnNpb25zfX0sbi5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gbi5jcmVhdGUodC5kaW1lbnNpb25zKX0sbn0pLHtpc0NsYXNzOiEwfSksVW09ImF0YW4yIixxbT1pZChVbSxbInR5cGVkIiwibWF0cml4IiwiZXF1YWxTY2FsYXIiLCJCaWdOdW1iZXIiLCJEZW5zZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4sZXF1YWxTY2FsYXI6cixCaWdOdW1iZXI6aSxEZW5zZU1hdHJpeDpvLGNvbmNhdDpzfT10LGE9SHkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6cn0pLHU9Wnkoe3R5cGVkOmV9KSxjPSR5KHt0eXBlZDplLGVxdWFsU2NhbGFyOnJ9KSxsPXp5KHt0eXBlZDplLGVxdWFsU2NhbGFyOnJ9KSxoPWp5KHt0eXBlZDplLERlbnNlTWF0cml4Om99KSxmPVd5KHt0eXBlZDplLG1hdHJpeDpuLGNvbmNhdDpzfSk7cmV0dXJuIGUoVW0seyJudW1iZXIsIG51bWJlciI6TWF0aC5hdGFuMiwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOih0LGUpPT5pLmF0YW4yKHQsZSl9LGYoe3NjYWxhcjoibnVtYmVyIHwgQmlnTnVtYmVyIixTUzpjLERTOnUsU0Q6YSxTczpsLHNTOmh9KSl9KSksVm09aWQoImFkZCIsWyJ0eXBlZCIsIm1hdHJpeCIsImFkZFNjYWxhciIsImVxdWFsU2NhbGFyIiwiRGVuc2VNYXRyaXgiLCJTcGFyc2VNYXRyaXgiLCJjb25jYXQiXSwodD0+e3Zhcnt0eXBlZDplLG1hdHJpeDpuLGFkZFNjYWxhcjpyLGVxdWFsU2NhbGFyOmksRGVuc2VNYXRyaXg6byxTcGFyc2VNYXRyaXg6cyxjb25jYXQ6YX09dCx1PXF5KHt0eXBlZDplfSksYz1WeSh7dHlwZWQ6ZSxlcXVhbFNjYWxhcjppfSksbD1HeSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDpvfSksaD1XeSh7dHlwZWQ6ZSxtYXRyaXg6bixjb25jYXQ6YX0pO3JldHVybiBlKCJhZGQiLHsiYW55LCBhbnkiOnIsImFueSwgYW55LCAuLi5hbnkiOmUucmVmZXJUb1NlbGYoKHQ9PihlLG4scik9Pntmb3IodmFyIGk9dChlLG4pLG89MDtvPHIubGVuZ3RoO28rKylpPXQoaSxyW29dKTtyZXR1cm4gaX0pKX0saCh7ZWxvcDpyLERTOnUsU1M6YyxTczpsfSkpfSkpLEdtPWlkKCJkb3QiLFsidHlwZWQiLCJhZGRTY2FsYXIiLCJtdWx0aXBseVNjYWxhciIsImNvbmoiLCJzaXplIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxhZGRTY2FsYXI6bixtdWx0aXBseVNjYWxhcjpyLGNvbmo6aSxzaXplOm99PXQ7cmV0dXJuIGUoImRvdCIseyJBcnJheSB8IERlbnNlTWF0cml4LCBBcnJheSB8IERlbnNlTWF0cml4IjpmdW5jdGlvbih0LG8pe3ZhciB1PXModCxvKSxjPXFmKHQpP3QuX2RhdGE6dCxsPXFmKHQpP3QuX2RhdGF0eXBlOnZvaWQgMCxoPXFmKG8pP28uX2RhdGE6byxmPXFmKG8pP28uX2RhdGF0eXBlOnZvaWQgMCxwPTI9PT1hKHQpLmxlbmd0aCxkPTI9PT1hKG8pLmxlbmd0aCxnPW4seT1yO2lmKGwmJmYmJmw9PT1mJiYic3RyaW5nIj09dHlwZW9mIGwpe3ZhciBtPWw7Zz1lLmZpbmQobixbbSxtXSkseT1lLmZpbmQocixbbSxtXSl9aWYoIXAmJiFkKXtmb3IodmFyIHY9eShpKGNbMF0pLGhbMF0pLF89MTtfPHU7XysrKXY9Zyh2LHkoaShjW19dKSxoW19dKSk7cmV0dXJuIHZ9aWYoIXAmJmQpe2Zvcih2YXIgeD15KGkoY1swXSksaFswXVswXSksdz0xO3c8dTt3KyspeD1nKHgseShpKGNbd10pLGhbd11bMF0pKTtyZXR1cm4geH1pZihwJiYhZCl7Zm9yKHZhciBiPXkoaShjWzBdWzBdKSxoWzBdKSxEPTE7RDx1O0QrKyliPWcoYix5KGkoY1tEXVswXSksaFtEXSkpO3JldHVybiBifWlmKHAmJmQpe2Zvcih2YXIgRT15KGkoY1swXVswXSksaFswXVswXSksQz0xO0M8dTtDKyspRT1nKEUseShpKGNbQ11bMF0pLGhbQ11bMF0pKTtyZXR1cm4gRX19LCJTcGFyc2VNYXRyaXgsIFNwYXJzZU1hdHJpeCI6ZnVuY3Rpb24odCxlKXtzKHQsZSk7Zm9yKHZhciBpPXQuX2luZGV4LG89dC5fdmFsdWVzLGE9ZS5faW5kZXgsdT1lLl92YWx1ZXMsYz0wLGw9bixoPXIsZj0wLHA9MDtmPGkubGVuZ3RoJiZwPGEubGVuZ3RoOyl7dmFyIGQ9aVtmXSxnPWFbcF07ZDxnP2YrKzpkPmc/cCsrOmQ9PT1nJiYoYz1sKGMsaChvW2ZdLHVbcF0pKSxmKysscCsrKX1yZXR1cm4gY319KTtmdW5jdGlvbiBzKHQsZSl7dmFyIG4scixpPWEodCksbz1hKGUpO2lmKDE9PT1pLmxlbmd0aCluPWlbMF07ZWxzZXtpZigyIT09aS5sZW5ndGh8fDEhPT1pWzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJFeHBlY3RlZCBhIGNvbHVtbiB2ZWN0b3IsIGluc3RlYWQgZ290IGEgbWF0cml4IG9mIHNpemUgKCIraS5qb2luKCIsICIpKyIpIik7bj1pWzBdfWlmKDE9PT1vLmxlbmd0aClyPW9bMF07ZWxzZXtpZigyIT09by5sZW5ndGh8fDEhPT1vWzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJFeHBlY3RlZCBhIGNvbHVtbiB2ZWN0b3IsIGluc3RlYWQgZ290IGEgbWF0cml4IG9mIHNpemUgKCIrby5qb2luKCIsICIpKyIpIik7cj1vWzBdfWlmKG4hPT1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJWZWN0b3JzIG11c3QgaGF2ZSBlcXVhbCBsZW5ndGggKCIrbisiICE9ICIrcisiKSIpO2lmKDA9PT1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJDYW5ub3QgY2FsY3VsYXRlIHRoZSBkb3QgcHJvZHVjdCBvZiBlbXB0eSB2ZWN0b3JzIik7cmV0dXJuIG59ZnVuY3Rpb24gYSh0KXtyZXR1cm4gcWYodCk/dC5zaXplKCk6byh0KX19KSksWW09ImluZGV4IixYbT1pZChZbSxbInR5cGVkIiwiSW5kZXgiXSwodD0+e3Zhcnt0eXBlZDplLEluZGV4Om59PXQ7cmV0dXJuIGUoWW0seyIuLi5udW1iZXIgfCBzdHJpbmcgfCBCaWdOdW1iZXIgfCBSYW5nZSB8IEFycmF5IHwgTWF0cml4IjpmdW5jdGlvbih0KXt2YXIgZT10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFJmKHQpP3QudG9OdW1iZXIoKTpBcnJheS5pc0FycmF5KHQpfHxxZih0KT90Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFJmKHQpP3QudG9OdW1iZXIoKTp0fSkpOnR9KSkscj1uZXcgbjtyZXR1cm4gbi5hcHBseShyLGUpLHJ9fSl9KSksV209dHkoe2NvbmZpZzpFcH0pLEhtPXN5KHt9KSxabT1teSh7fSksS209dnkoe30pLEptPXh5KHtNYXRyaXg6S219KSxRbT1nZCh7QmlnTnVtYmVyOldtLENvbXBsZXg6SG0sRGVuc2VNYXRyaXg6Sm0sRnJhY3Rpb246Wm19KSwkbT1reSh7dHlwZWQ6UW19KSx0dj1PeSh7QmlnTnVtYmVyOldtLHR5cGVkOlFtfSksZXY9bm0oe3R5cGVkOlFtfSksbnY9TXkoe2NvbmZpZzpFcCx0eXBlZDpRbX0pLHJ2PUR5KHt0eXBlZDpRbX0pLGl2PUt5KHt0eXBlZDpRbX0pLG92PVR5KHt0eXBlZDpRbX0pLHN2PUZ5KHtNYXRyaXg6S20sZXF1YWxTY2FsYXI6bnYsdHlwZWQ6UW19KSxhdj1MeSh7RnJhY3Rpb246Wm0sdHlwZWQ6UW19KSx1dj1SeSh7RGVuc2VNYXRyaXg6Sm0sTWF0cml4OkttLFNwYXJzZU1hdHJpeDpzdix0eXBlZDpRbX0pLGN2PWJtKHtiaWdudW1iZXI6dHYsZnJhY3Rpb246YXYsbnVtYmVyOm92fSksbHY9cG0oe21hdHJpeDp1dixjb25maWc6RXAsdHlwZWQ6UW19KSxodj1nbSh7bWF0cml4OnV2LHR5cGVkOlFtfSksZnY9d20oe21hdHJpeDp1dix0eXBlZDpRbX0pLHB2PWltKHtpc0ludGVnZXI6cnYsbWF0cml4OnV2LHR5cGVkOlFtfSksZHY9U20oe0RlbnNlTWF0cml4OkptLGNvbmNhdDpwdixkaXZpZGVTY2FsYXI6RW0oe251bWVyaWM6Y3YsdHlwZWQ6UW19KSxlcXVhbFNjYWxhcjpudixtYXRyaXg6dXYsdHlwZWQ6UW19KSxndj1CbSh7RGVuc2VNYXRyaXg6Sm0sY29uY2F0OnB2LGNvbmZpZzpFcCxtYXRyaXg6dXYsdHlwZWQ6UW19KSx5dj1zbSh7QmlnTnVtYmVyOldtLGNvbmZpZzpFcCxtYXRyaXg6dXYsdHlwZWQ6UW19KSxtdj1ObSh7RGVuc2VNYXRyaXg6Sm0sY29uY2F0OnB2LGNvbmZpZzpFcCxtYXRyaXg6dXYsdHlwZWQ6UW19KSx2dj1WbSh7RGVuc2VNYXRyaXg6Sm0sU3BhcnNlTWF0cml4OnN2LGFkZFNjYWxhcjokbSxjb25jYXQ6cHYsZXF1YWxTY2FsYXI6bnYsbWF0cml4OnV2LHR5cGVkOlFtfSksX3Y9R20oe2FkZFNjYWxhcjokbSxjb25qOmV2LG11bHRpcGx5U2NhbGFyOml2LHNpemU6bHYsdHlwZWQ6UW19KSx4dj1qbSh7SW1tdXRhYmxlRGVuc2VNYXRyaXg6em0oe0RlbnNlTWF0cml4OkptLHNtYWxsZXI6bXZ9KX0pLHd2PUxtKHtEZW5zZU1hdHJpeDpKbSxjb25jYXQ6cHYsY29uZmlnOkVwLG1hdHJpeDp1dix0eXBlZDpRbX0pLGJ2PVF5KHthZGRTY2FsYXI6JG0sZG90Ol92LGVxdWFsU2NhbGFyOm52LG1hdHJpeDp1dixtdWx0aXBseVNjYWxhcjppdix0eXBlZDpRbX0pLER2PUZtKHtEZW5zZU1hdHJpeDpKbSxjb25jYXQ6cHYsY29uZmlnOkVwLG1hdHJpeDp1dix0eXBlZDpRbX0pLEV2PVhtKHtJbmRleDp4dix0eXBlZDpRbX0pLEN2PWhtKHtiaWdudW1iZXI6dHYsbWF0cml4OnV2LGNvbmZpZzpFcCxsYXJnZXI6d3YsbGFyZ2VyRXE6Z3Ysc21hbGxlcjptdixzbWFsbGVyRXE6RHYsdHlwZWQ6UW19KSxTdj1xbSh7QmlnTnVtYmVyOldtLERlbnNlTWF0cml4OkptLGNvbmNhdDpwdixlcXVhbFNjYWxhcjpudixtYXRyaXg6dXYsdHlwZWQ6UW19KTtmdW5jdGlvbiBBdih0LGUsbil7Y29uc3Qgcj11dihbW2VbMF1bMF0sZVswXVsxXV0sW2VbMV1bMF0sZVsxXVsxXV1dKSxpPWVbMF1bMl0sbz1lWzFdWzJdLHM9bixhPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXSxpPXJbMF0qclswXStyWzFdKnJbMV0sbz1NYXRoLnNxcnQoaSk7ZS5wdXNoKG8pfXJldHVybiBlfSh0LnRvQXJyYXkoKS5tYXAoKHQ9PnQuc2xpY2UoMCwyKSkpKSx1PWR2KHl2KHV2KGEpLnNpemUoKSksYSksYz1mdW5jdGlvbih0LGUpe2NvbnN0IG49dC5sZW5ndGgscj1bXTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl7bGV0IG89MDtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKylvPXRbbi1yLTFdK28qZVtpXTtyLnB1c2gobyl9cmV0dXJuIHJ9KHMsU3YoYnYoLTEsdC5zdWJzZXQoRXYoQ3YoMCx1dih0KS5zaXplKClbMF0pLDIpKSksYSkpO2xldCBsPXl2KDIsdC5zaXplKClbMF0pO2NvbnN0IGg9YnYodC5zdWJzZXQoRXYoQ3YoMCx0LnNpemUoKVswXSksMCkpLHUqYyksZj1idih0LnN1YnNldChFdihDdigwLHQuc2l6ZSgpWzBdKSwxKSksdSpjKSxwPXV2KFtbaCwwXSxbZiwwXV0pO2w9aHYocCxFdihDdigwLHAuc2l6ZSgpWzBdKSwwKSk7Y29uc3QgZD11dihbaSxvXSksZz1idihyLGwpLHk9ZC5yZXNoYXBlKFsyLDFdKTtyZXR1cm4gZnYodnYoZyx5KSkudG9BcnJheSgpfWZ1bmN0aW9uIE52KHQ9W10sZSxuLHIpe2NvbnN0IGk9dXYoZnVuY3Rpb24odCl7aWYoMSE9PXQubGVuZ3RofHwzIT09dFswXS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBtYXRyaXggbXVzdCBiZSBhIDF4MyBvciAzeDEgbWF0cml4Iik7cmV0dXJuW1t0WzBdWzBdXSxbdFswXVsxXV0sW3RbMF1bMl1dLFsxXV19KHQpKSxvPXV2KGUpLHM9YnYobyxpKTtyZXR1cm4gQXYoZnYocyksbixyKX12YXIgSXY9T2JqZWN0LmRlZmluZVByb3BlcnR5LE12PU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLEZ2PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFR2PU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsT3Y9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxMdj1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLFB2PU1hdGgucG93LFJ2PSh0LGUsbik9PmUgaW4gdD9Jdih0LGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm59KTp0W2VdPW47ZnVuY3Rpb24gQnYodCl7cmV0dXJuKG5ldyBaaCkuc2V0KC4uLnQpfWZ1bmN0aW9uIGt2KHQsZSxuKXt0cnl7Y29uc3Qgcj1WdC50cmFuc2Zlck1hdHJpeDM0RnJvbUtpdHRpMlRocmVlKHQpLGk9VnQudHJhbnNmZXJNYXRyaXgzM0Zyb21LaXR0aTJUaHJlZShlKSxvPVZ0LnRyYW5zZmVyTWF0cml4MzRGcm9tS2l0dGkyVGhyZWUobikscz1CdihyKSxhPUJ2KGkpLHU9QnYobyk7cmV0dXJue2NvbXBvc2VNYXRyaXg0OnUuY2xvbmUoKS5wcmVtdWx0aXBseShhKS5wcmVtdWx0aXBseShzKSxQTTpzLFJNOmEsVE06dX19Y2F0Y2godCl7fX1jb25zdCB6dj0odCxlKT0+ZS5zb21lKChlPT5mdW5jdGlvbih0LGUsbil7cmV0dXJuISh0Lmxlbmd0aCE9PWV8fHQuc29tZSgodD0+dC5sZW5ndGghPT1uKSkpfSh0LGVbMF0sZVsxXSkpKSxqdj10PT57dmFyIGU7cmV0dXJuISEoKG51bGw9PShlPXQuZmlzaGV5ZURpc3RvcnRpb24pP3ZvaWQgMDplLmxlbmd0aCk+MCYmenYodC5QLFtbMyw0XSxbNCw0XV0pJiZ6dih0LlQsW1szLDRdLFs0LDRdXSkpfSxVdj0odCxlKT0+e2lmKCExIT09anYoZSkpcmV0dXJuKG51bGw9PWU/dm9pZCAwOmUuY2FtZXJhVHlwZSk9PT1KdC5PbW5pQ2FtZXJhPygodCxlKT0+e2lmKCExPT09anYoZSkpcmV0dXJuO2NvbnN0e1A6bixmaXNoZXllRGlzdG9ydGlvbjpyLFQ6aX09ZSxvPW5ldyB2aCh0LngsdC55LHQueikscz1CdihWdC50cmFuc2Zlck1hdHJpeDM0RnJvbUtpdHRpMlRocmVlKGkpKSxhPUJ2KFZ0LnRyYW5zZmVyTWF0cml4MzRGcm9tS2l0dGkyVGhyZWUobikpLHU9by5hcHBseU1hdHJpeDQocyksYz1QdihQdih1LngsMikrUHYodS55LDIpLC41KSxsPU1hdGguYXRhbih1LnovYyksaD1yLnJlZHVjZSgoKHQsZSxuKT0+dCtlKlB2KGwsbikpLDApO3JldHVybiB1Lng9dS54L2MqaCx1Lnk9dS55L2MqaCx1Lno9MSx1LmFwcGx5TWF0cml4NChhKX0pKHQsZSk6KG51bGw9PWU/dm9pZCAwOmUuY2FtZXJhVHlwZSk9PT1KdC5LYW5uYWxhQnJhbmR0PygodCxlKT0+e2NvbnN0e1A6bixUOnIsZmlzaGV5ZURpc3RvcnRpb246aX09ZSxvPVt0LngsdC55LHQueiwxXSxzPXIubWFwKCh0PT50LnJlZHVjZSgoKHQsZSxuKT0+dCtlKm9bbl0pLDApKSksYT1zWzBdLHU9c1sxXSxjPXNbMl07aWYoIShjPj0uMDEmJmlzRmluaXRlKGMpKSlyZXR1cm47Y29uc3QgbD1bW25bMF1bMF0sblswXVsxXV0sW25bMV1bMF0sblsxXVsxXV1dLGg9blswXVsyXSxmPW5bMV1bMl0scD1NYXRoLnNxcnQoYSphK3UqdSksZD1NYXRoLmF0YW4yKHAsYyksZz1kK2kucmVkdWNlKCgodCxlLG4pPT50K2UqTWF0aC5wb3coZCwyKm4rMykpLDApO2xldCB5LG07cmV0dXJuIDAhPT1wPyh5PWEqZy9wLG09dSpnL3ApOih5PTAsbT0wKSx7eDpsWzBdWzBdKnkrbFswXVsxXSptK2gseTpsWzFdWzBdKnkrbFsxXVsxXSptK2Z9fSkodCxlKToobnVsbD09ZT92b2lkIDA6ZS5jYW1lcmFUeXBlKT09PUp0Lk9tbmlDYW1lcmExMVY/KCh0LGUpPT57aWYoITE9PT1qdihlKSlyZXR1cm47Y29uc3R7UDpuLGZpc2hleWVEaXN0b3J0aW9uOnIsVDppfT1lLG89TnYoW1t0LngsdC55LHQuel1dLGksbixyKTtyZXR1cm4gbmV3IHZoKG9bMF1bMF0sb1swXVsxXSwxKX0pKHQsZSk6dm9pZCAwfTtmdW5jdGlvbiBxdih0LGUpe2NvbnN0IG49bmV3IHZoKHQueCx0LnksdC56KS5hcHBseU1hdHJpeDQoZSk7aWYobi56PDApcmV0dXJuO2NvbnN0IHI9MS9uLnosaT0obmV3IFpoKS5zZXQociwwLDAsMCwwLHIsMCwwLDAsMCxyLDAsMCwwLDAsMSk7cmV0dXJuIG4uYXBwbHlNYXRyaXg0KGkpfWZ1bmN0aW9uIFZ2KHQsZSxuKXtjb25zdCByPWUueC10LngsaT1lLnktdC55LG89bi54LXQueDtyZXR1cm4gcioobi55LXQueSktbyppfWZ1bmN0aW9uIEd2KHQsZSxuPXtjcmVhdGVSYW5nZTohMX0pe3ZhciByO2lmKCFlKXJldHVybnt0cmFuc2ZlclZpZXdEYXRhOltdLHZpZXdSYW5nZVBvaW50TGlzdDpbXX07Y29uc3R7Y3JlYXRlUmFuZ2U6aX09bixvPVV0LmdldEFsbFZpZXdEYXRhKHQpLHM9anYoZSkse1A6YSxSOnUsVDpjfT1lO2xldCBsO2lmKCExPT09cyl7Y29uc3R7Y29tcG9zZU1hdHJpeDQ6dH09bnVsbCE9KHI9a3YoYSx1LGMpKT9yOnt9O2lmKCF0KXJldHVybjtsPXR9Y29uc3QgaD1vLm1hcCgobj0+KHt0eXBlOm4udHlwZSxwb2ludExpc3Q6bi5wb2ludExpc3QubWFwKChlPT5mdW5jdGlvbih0LGUsbil7dmFyIHI7Y29uc3QgaT1uZXcgeGgodC54LHQueSxudWxsIT0ocj1udWxsPT10P3ZvaWQgMDp0LnopP3I6MSksbz0obmV3IFpoKS5tYWtlUm90YXRpb25aKG4pLHM9KG5ldyBaaCkubWFrZVRyYW5zbGF0aW9uKGUueCxlLnksZS56KSxhPShuZXcgWmgpLm1ha2VUcmFuc2xhdGlvbigtZS54LC1lLnksLWUueik7cmV0dXJuIGkuY2xvbmUoKS5hcHBseU1hdHJpeDQoYSkuYXBwbHlNYXRyaXg0KG8pLmFwcGx5TWF0cml4NChzKX0oZSx0LmNlbnRlcix0LnJvdGF0aW9uKSkpLm1hcCgodD0+cz9Vdih0LGUpOmwmJnF2KHQsbCkpKS5tYXAoKHQ9PntpZih0KXJldHVybntpZDp6bCgpLHg6bnVsbD09dD92b2lkIDA6dC54LHk6bnVsbD09dD92b2lkIDA6dC55fX0pKS5maWx0ZXIoKHQ9PnZvaWQgMCE9PXQpKX0pKSkuZmlsdGVyKCh0PT4wIT09dC5wb2ludExpc3QubGVuZ3RoKSk7aFswXSYmaFswXS5wb2ludExpc3QmJihoWzBdLnBvaW50TGlzdD1oWzBdLnBvaW50TGlzdC5tYXAoKHQ9PigodCxlKT0+TXYodCxGdihlKSkpKCgodCxlKT0+e2Zvcih2YXIgbiBpbiBlfHwoZT17fSkpT3YuY2FsbChlLG4pJiZSdih0LG4sZVtuXSk7aWYoVHYpZm9yKHZhciBuIG9mIFR2KGUpKUx2LmNhbGwoZSxuKSYmUnYodCxuLGVbbl0pO3JldHVybiB0fSkoe30sdCkse3NwZWNpYWxFZGdlOiEwfSkpKSk7bGV0IGY9W107aWYoNj09PWgubGVuZ3RoJiYhMD09PWkpe2Y9ZnVuY3Rpb24odCl7Y29uc3QgZT1mdW5jdGlvbih0KXtjb25zdCBlPXQuc2xpY2UoKTtyZXR1cm4gZS5zb3J0KCgodCxlKT0+dC54PT09ZS54P2UueS10Lnk6dC54LWUueCkpLGV9KHQpLG49W107Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2Zvcig7bi5sZW5ndGg+PTImJlZ2KG5bbi5sZW5ndGgtMl0sbltuLmxlbmd0aC0xXSxlW3RdKTw9MDspbi5wb3AoKTtuLnB1c2goZVt0XSl9Y29uc3Qgcj1bXTtmb3IobGV0IHQ9ZS5sZW5ndGgtMTt0Pj0wO3QtLSl7Zm9yKDtyLmxlbmd0aD49MiYmVnYocltyLmxlbmd0aC0yXSxyW3IubGVuZ3RoLTFdLGVbdF0pPD0wOylyLnBvcCgpO3IucHVzaChlW3RdKX1yZXR1cm4gbi5wb3AoKSxyLnBvcCgpLG4uY29uY2F0KHIpfShbLi4uaFswXS5wb2ludExpc3QsLi4uaFsxXS5wb2ludExpc3RdKX1yZXR1cm57dHJhbnNmZXJWaWV3RGF0YTpoLHZpZXdSYW5nZVBvaW50TGlzdDpmfX12YXIgWXYsWHY7IWZ1bmN0aW9uKHQpe3RbdC5VcGxvYWQ9MF09IlVwbG9hZCIsdFt0LlVwbG9hZFJldHJ5PTFdPSJVcGxvYWRSZXRyeSIsdFt0LlVwbG9hZEZhaWw9Ml09IlVwbG9hZEZhaWwiLHRbdC5Bbm5vdGF0aW9uPTNdPSJBbm5vdGF0aW9uIix0W3QuVGVybWluYXRlZD00XT0iVGVybWluYXRlZCIsdFt0LkZpbmlzaD01XT0iRmluaXNoIix0W3QuUHVibGlzaD02XT0iUHVibGlzaCJ9KFl2fHwoWXY9e30pKSxmdW5jdGlvbih0KXt0W3QuUmVhZHk9MV09IlJlYWR5Iix0W3QuRmlyc3RQb2ludD0yXT0iRmlyc3RQb2ludCIsdFt0LkN1Ym9pZD0zXT0iQ3Vib2lkIn0oWHZ8fChYdj17fSkpO3ZhciBXdj1mdW5jdGlvbih0LGUsbil7dmFyIHI7cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybiByPXJ8fGtsKHQsZSxuKSxuZXcgV29ya2VyKHIsaSl9fSgiTHlvZ2NtOXNiSFZ3TFhCc2RXZHBiaTEzWldJdGQyOXlhMlZ5TFd4dllXUmxjaUFxTHdwMllYSWdkMjl5YTJWeVgyTnZaR1U5Wm5WdVkzUnBiMjRvY0NsN0luVnpaU0J6ZEhKcFkzUWlPMk52Ym5OMElIWTlXeTB4TEMweExDMHhYVHRzWlhRZ1NUMGhNVHRtZFc1amRHbHZiaUJDS0dVcGUyTnZibk4wSUhROUxUY3NiejB6TEc0OWJ5MTBPM0psZEhWeWJpQmxQSFFtSmlobFBYUXBMR1UrYnlZbUtHVTlieWtzVFdGMGFDNW1iRzl2Y2lnb1pTMTBLUzl1S2pJMU5TbDlablZ1WTNScGIyNGdSU2dwZTJ4bGRDQmxPMk52Ym5OMElIUTlibVYzSUVGeWNtRjVLREkxTmlrdVptbHNiQ2dpSWlrdWJXRndLQ2dwUFQ1dVpYY2dRWEp5WVhrb015a3VabWxzYkNnaUlpa3BPMlp2Y2loc1pYUWdiejB3TzI4OE1qQTdieXNyS1h0bWIzSW9aVDB3TzJVOE16STdaU3NyS1hSYlpWMWJNRjA5TVRJNEt6UXFaU3gwVzJWZFd6RmRQVEFzZEZ0bFhWc3lYVDB3TzJadmNpaDBXek15WFZzd1hUMHlOVFVzZEZzek1sMWJNVjA5TUN4MFd6TXlYVnN5WFQwd0xHVTlNRHRsUERZek8yVXJLeWwwV3pNeksyVmRXekJkUFRJMU5TeDBXek16SzJWZFd6RmRQVFFyTkNwbExIUmJNek1yWlYxYk1sMDlNRHRtYjNJb2RGczVObDFiTUYwOU1qVTBMSFJiT1RaZFd6RmRQVEkxTlN4MFd6azJYVnN5WFQweUxHVTlNRHRsUERZeU8yVXJLeWwwV3prM0syVmRXekJkUFRJMU1DMDBLbVVzZEZzNU55dGxYVnN4WFQweU5UVXNkRnM1Tnl0bFhWc3lYVDAyS3pRcVpUdG1iM0lvZEZzeE5UbGRXekJkUFRFc2RGc3hOVGxkV3pGZFBUSTFOU3gwV3pFMU9WMWJNbDA5TWpVMExHVTlNRHRsUERZME8yVXJLeWwwV3pFMk1DdGxYVnN3WFQwd0xIUmJNVFl3SzJWZFd6RmRQVEkxTWkxbEtqUXNkRnN4TmpBclpWMWJNbDA5TWpVMU8yWnZjaWhsUFRBN1pUd3pNanRsS3lzcGRGc3lNalFyWlYxYk1GMDlNQ3gwV3pJeU5DdGxYVnN4WFQwd0xIUmJNakkwSzJWZFd6SmRQVEkxTWkwMEttVjljbVYwZFhKdUlIUjlZMjl1YzNRZ1VqMUZLQ2s3Wm5WdVkzUnBiMjRnYUNobExIUXNiejB3S1h0c1pYUWdiajB3TEdFc2VDeHBMR3c3ZEQxYkxpNHVkRjBzYnowOVBURW1KaWgwUFdOeVpXRjBaVk50YjI5MGFFTjFjblpsVUc5cGJuUnpLSFF1Y21Wa2RXTmxLQ2g1TEdNcFBUNWJMaTR1ZVN4akxuZ3NZeTU1WFN4YlhTa3NMalVzSVRBc1UwVkhUVVZPVkY5T1ZVMUNSVklwS1N4YmFWMDlkRHRqYjI1emRDQjFQWFF1YkdWdVozUm9PMlp2Y2loaFBURTdZVHc5ZFR0aEt5c3BiRDEwVzJFbGRWMHNaUzU0UGsxaGRHZ3ViV2x1S0drdWVDeHNMbmdwSmlabExuZzhQVTFoZEdndWJXRjRLR2t1ZUN4c0xuZ3BKaVpsTG5rOFBVMWhkR2d1YldGNEtHa3VlU3hzTG5rcEppWnBMbmdoUFQxc0xuZ21KaWg0UFNobExuZ3RhUzU0S1Nvb2JDNTVMV2t1ZVNrdktHd3VlQzFwTG5ncEsya3VlU3dvYVM1NVBUMDliQzU1Zkh4bExuazhQWGdwSmladUt5c3BMR2s5YkR0eVpYUjFjbTRnYmlVeUlUMHdmV1oxYm1OMGFXOXVJRThvZTNwTmFXNDZaU3g2VFdGNE9uUXNjRzlzZVdkdmJsQnZhVzUwVEdsemREcHZMR0YwZEhKcFluVjBaVHB1TEhnNllTeDVPbmdzZWpwcExHTnZiRzl5VEdsemREcHNMSFpoYkdsa09uVjlLWHRwWmlob0tIdDRPbUVzZVRwNGZTeHZLU1ltYVQ0OVpTWW1hVHc5ZENseVpYUjFjbTRnZFQwOVBTRXhQMXN4TERFd015OHlOVFVzTVRBeUx6STFOVjA2YkZ0dVhUOXNXMjVkTG5KblltRXVjMnhwWTJVb01Dd3pLUzV0WVhBb1l6MCtZeTh5TlRVcE9sc3hMREFzTUYxOVpuVnVZM1JwYjI0Z2JTaGxLWHRqYjI1emRDQjBQVUlvWlNrc2J6MVNXM1JkTEZ0dUxHRXNlRjA5Ynp0eVpYUjFjbTViYmk4eU5UVXNZUzh5TlRVc2VDOHlOVFZkZlhKbGRIVnliaUJ2Ym0xbGMzTmhaMlU5Wm5WdVkzUnBiMjRvZENsN1kyOXVjM1I3Y0c5emFYUnBiMjQ2Ynl4amIyeHZjanB1TEdOMVltOXBaRXhwYzNRNllTeGpiMnh2Y2t4cGMzUTZlQ3hvYVdkb2JHbG5hSFJKYm1SbGVEcHBmVDEwTG1SaGRHRTdiR1YwZTIxdlpHbG1hV1ZrUW05NFNXUnpPbXc5VzEwc2NtVnpaWFJCY21WaGN6cDFQVnRkZlQxMExtUmhkR0VzZVQwd08yWjFibU4wYVc5dUlHTW9LWHQ1S3oweGZXbG1LQ0Z2S1hKbGRIVnlianRqYjI1emRDQmZQU0VoS0drOVBXNTFiR3cvZG05cFpDQXdPbWt1YkdWdVozUm9LVHNvWDN4OFNTa21KaWhzUFZ0ZExIVTlXMTBwTzJOdmJuTjBJSGM5YkM1c1pXNW5kR2cvWVM1bWFXeDBaWElvY2owK2JDNXBibU5zZFdSbGN5aHlMbWxrS1NrNllUdG1iM0lvYkdWMElISTlNRHR5UEc4dWJHVnVaM1JvTzNJclBUTXBlMk52Ym5OMElFTTliMXR5WFN4TVBXOWJjaXN4WFN4a1BXOWJjaXN5WFR0c1pYUWdaenRwWmloMUxteGxibWQwYUQwOVBURW1KaUZzTG14bGJtZDBhQ2xvS0h0NE9rTXNlVHBNZlN4MVd6QmRLVDluUFcwb1pDazZaejEyTzJWc2MyVWdhV1lvZFM1c1pXNW5kR2g4Zkd3dWJHVnVaM1JvS1h0c1pYUWdjejBoTVR0M0xuTnZiV1VvWmowK2UyTnZibk4wSUUwOVR5aDdjRzlzZVdkdmJsQnZhVzUwVEdsemREcG1MbkJ2YkhsbmIyNVFiMmx1ZEV4cGMzUXNlazFwYmpwbUxucE5hVzRzZWsxaGVEcG1MbnBOWVhnc2VEcERMSGs2VEN4Nk9tUXNZWFIwY21saWRYUmxPbVl1WVhSMGNtbGlkWFJsTEdOdmJHOXlUR2x6ZERwNExIWmhiR2xrT21ZdWRtRnNhV1I5S1R0eVpYUjFjbTRnVFQ4b1l5Z3BMR2M5VFN4elBTRXdMQ0V3S1RvaE1YMHBMQ0Z6SmlaMUxteGxibWQwYUNZbUtITTlkUzV6YjIxbEtHWTlQbWdvZTNnNlF5eDVPa3g5TEdZcFB5aG5QVzBvWkNrc0lUQXBPaUV4S1Nrc0lYTW1KaUZmSmlZb1NUOW5QVzBvWkNrNlp6MTJLWDFsYkhObElIY3VjMjl0WlNoelBUNTdZMjl1YzNRZ1pqMVBLSHR3YjJ4NVoyOXVVRzlwYm5STWFYTjBPbk11Y0c5c2VXZHZibEJ2YVc1MFRHbHpkQ3g2VFdsdU9uTXVlazFwYml4NlRXRjRPbk11ZWsxaGVDeDRPa01zZVRwTUxIbzZaQ3hoZEhSeWFXSjFkR1U2Y3k1aGRIUnlhV0oxZEdVc1kyOXNiM0pNYVhOME9uZ3NkbUZzYVdRNmN5NTJZV3hwWkgwcE8zSmxkSFZ5YmlCbVB5aGpLQ2tzWnoxbUxDRXdLVG9oTVgwcE8yTnZibk4wSUVFOWN6MCtlMk52Ym5OMElHWTlUV0YwYUM1bWJHOXZjaWh6THpNcE8zSmxkSFZ5YmlCcEppWnBXMlpkUFQwOU1YMDdhV1lvWnlscFppaG5XekJkUFQwOWRsc3dYU1ltUVNoeUtTbHVXM0pkUFRBc2JsdHlLekZkUFRBc2JsdHlLekpkUFRBN1pXeHpaWHRqYjI1emRGdHpMR1lzVFYwOVp6dHVXM0pkUFhNc2JsdHlLekZkUFdZc2JsdHlLekpkUFUxOVpXeHpaU0JwWmloQktISXBLVzViY2wwOU1DeHVXM0lyTVYwOU1DeHVXM0lyTWwwOU1EdGxiSE5sZTJOdmJuTjBXM01zWml4TlhUMXRLR1FwTzI1YmNsMDljeXh1VzNJck1WMDlaaXh1VzNJck1sMDlUWDE5U1QxZkxIQnZjM1JOWlhOellXZGxLSHR3YjJsdWRITTZieXhqYjJ4dmNqcHVMRzUxYlRwNWZTbDlMSEF1YVhOSmJsQnZiSGxuYjI0OWFDeFBZbXBsWTNRdVpHVm1hVzVsVUhKdmNHVnlkSGtvY0N3aVgxOWxjMDF2WkhWc1pTSXNlM1poYkhWbE9pRXdmU2tzY0gwb2UzMHBPd29LIixudWxsLCExKTtPYmplY3QuZGVmaW5lUHJvcGVydHk7bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zZWdtZW50U3RhdHVzPUt0LlJlYWR5fXN0YXR1c1RvZ2dsZSgpe3N3aXRjaCh0aGlzLnNlZ21lbnRTdGF0dXMpe2Nhc2UgS3QuUmVhZHk6dGhpcy5zZWdtZW50U3RhdHVzPUt0LkNoZWNrO2JyZWFrO2Nhc2UgS3QuQ2hlY2s6dGhpcy5zZWdtZW50U3RhdHVzPUt0LkVkaXQ7YnJlYWs7Y2FzZSBLdC5FZGl0OnRoaXMuc2VnbWVudFN0YXR1cz1LdC5SZWFkeX19dXBkYXRlU3RhdHVzMkVkaXQoKXt0aGlzLnNlZ21lbnRTdGF0dXM9S3QuRWRpdH11cGRhdGVTdGF0dXMyQ2hlY2soKXt0aGlzLnNlZ21lbnRTdGF0dXM9S3QuQ2hlY2t9dXBkYXRlU3RhdHVzMlJlYWR5KCl7dGhpcy5zZWdtZW50U3RhdHVzPUt0LlJlYWR5fWdldCBpc1JlYWR5U3RhdHVzKCl7cmV0dXJuIHRoaXMuc2VnbWVudFN0YXR1cz09PUt0LlJlYWR5fWdldCBpc0NoZWNrU3RhdHVzKCl7cmV0dXJuIHRoaXMuc2VnbWVudFN0YXR1cz09PUt0LkNoZWNrfWdldCBpc0VkaXRTdGF0dXMoKXtyZXR1cm4gdGhpcy5zZWdtZW50U3RhdHVzPT09S3QuRWRpdH19LG5ldyBXdih7dHlwZToibW9kdWxlIn0pO3ZhciBIdj1lZSgoZnVuY3Rpb24odCxlKXsoZnVuY3Rpb24oKXt2YXIgbixyPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIixpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixvPSJfX2xvZGFzaF9wbGFjZWhvbGRlcl9fIixzPTE2LGE9MzIsdT02NCxjPTEyOCxsPTI1NixoPTEvMCxmPTkwMDcxOTkyNTQ3NDA5OTEscD1OYU4sZD00Mjk0OTY3Mjk1LGc9ZC0xLHk9ZD4+PjEsbT1bWyJhcnkiLGNdLFsiYmluZCIsMV0sWyJiaW5kS2V5IiwyXSxbImN1cnJ5Iiw4XSxbImN1cnJ5UmlnaHQiLHNdLFsiZmxpcCIsNTEyXSxbInBhcnRpYWwiLGFdLFsicGFydGlhbFJpZ2h0Iix1XSxbInJlYXJnIixsXV0sdj0iW29iamVjdCBBcmd1bWVudHNdIixfPSJbb2JqZWN0IEFycmF5XSIseD0iW29iamVjdCBCb29sZWFuXSIsdz0iW29iamVjdCBEYXRlXSIsYj0iW29iamVjdCBFcnJvcl0iLEQ9IltvYmplY3QgRnVuY3Rpb25dIixFPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsQz0iW29iamVjdCBNYXBdIixTPSJbb2JqZWN0IE51bWJlcl0iLEE9IltvYmplY3QgT2JqZWN0XSIsTj0iW29iamVjdCBQcm9taXNlXSIsST0iW29iamVjdCBSZWdFeHBdIixNPSJbb2JqZWN0IFNldF0iLEY9IltvYmplY3QgU3RyaW5nXSIsVD0iW29iamVjdCBTeW1ib2xdIixPPSJbb2JqZWN0IFdlYWtNYXBdIixMPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsUD0iW29iamVjdCBEYXRhVmlld10iLFI9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsQj0iW29iamVjdCBGbG9hdDY0QXJyYXldIixrPSJbb2JqZWN0IEludDhBcnJheV0iLHo9IltvYmplY3QgSW50MTZBcnJheV0iLGo9IltvYmplY3QgSW50MzJBcnJheV0iLFU9IltvYmplY3QgVWludDhBcnJheV0iLHE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixWPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsRz0iW29iamVjdCBVaW50MzJBcnJheV0iLFk9L1xiX19wIFwrPSAnJzsvZyxYPS9cYihfX3AgXCs9KSAnJyBcKy9nLFc9LyhfX2VcKC4qP1wpfFxiX190XCkpIFwrXG4nJzsvZyxIPS8mKD86YW1wfGx0fGd0fHF1b3R8IzM5KTsvZyxaPS9bJjw+IiddL2csSz1SZWdFeHAoSC5zb3VyY2UpLEo9UmVnRXhwKFouc291cmNlKSxRPS88JS0oW1xzXFNdKz8pJT4vZywkPS88JShbXHNcU10rPyklPi9nLHR0PS88JT0oW1xzXFNdKz8pJT4vZyxldD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxudD0vXlx3KiQvLHJ0PS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLGl0PS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxvdD1SZWdFeHAoaXQuc291cmNlKSxzdD0vXlxzKy8sYXQ9L1xzLyx1dD0vXHsoPzpcblwvXCogXFt3cmFwcGVkIHdpdGggLitcXSBcKlwvKT9cbj8vLGN0PS9ce1xuXC9cKiBcW3dyYXBwZWQgd2l0aCAoLispXF0gXCovLGx0PS8sPyAmIC8saHQ9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZyxmdD0vWygpPSx7fVxbXF1cL1xzXS8scHQ9L1xcKFxcKT8vZyxkdD0vXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2csZ3Q9L1x3KiQvLHl0PS9eWy0rXTB4WzAtOWEtZl0rJC9pLG10PS9eMGJbMDFdKyQvaSx2dD0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxfdD0vXjBvWzAtN10rJC9pLHh0PS9eKD86MHxbMS05XVxkKikkLyx3dD0vW1x4YzAtXHhkNlx4ZDgtXHhmNlx4ZjgtXHhmZlx1MDEwMC1cdTAxN2ZdL2csYnQ9LygkXikvLER0PS9bJ1xuXHJcdTIwMjhcdTIwMjlcXF0vZyxFdD0iXFx1ZDgwMC1cXHVkZmZmIixDdD0iXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmIixTdD0iXFx1MjcwMC1cXHUyN2JmIixBdD0iYS16XFx4ZGYtXFx4ZjZcXHhmOC1cXHhmZiIsTnQ9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLEl0PSJcXHVmZTBlXFx1ZmUwZiIsTXQ9IlxceGFjXFx4YjFcXHhkN1xceGY3XFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4YmZcXHUyMDAwLVxcdTIwNmYgXFx0XFx4MGJcXGZcXHhhMFxcdWZlZmZcXG5cXHJcXHUyMDI4XFx1MjAyOVxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDAiLEZ0PSJbJ+KAmV0iLFR0PSJbIitFdCsiXSIsT3Q9IlsiK010KyJdIixMdD0iWyIrQ3QrIl0iLFB0PSJcXGQrIixSdD0iWyIrU3QrIl0iLEJ0PSJbIitBdCsiXSIsa3Q9IlteIitFdCtNdCtQdCtTdCtBdCtOdCsiXSIsenQ9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsanQ9IlteIitFdCsiXSIsVXQ9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHF0PSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixWdD0iWyIrTnQrIl0iLEd0PSJcXHUyMDBkIixZdD0iKD86IitCdCsifCIra3QrIikiLFh0PSIoPzoiK1Z0KyJ8IitrdCsiKSIsV3Q9Iig/Olsn4oCZXSg/OmR8bGx8bXxyZXxzfHR8dmUpKT8iLEh0PSIoPzpbJ+KAmV0oPzpEfExMfE18UkV8U3xUfFZFKSk/IixadD0iKD86IitMdCsifCIrenQrIikiKyI/IixLdD0iWyIrSXQrIl0/IixKdD1LdCtadCsoIig/OiIrR3QrIig/OiIrW2p0LFV0LHF0XS5qb2luKCJ8IikrIikiK0t0K1p0KyIpKiIpLFF0PSIoPzoiK1tSdCxVdCxxdF0uam9pbigifCIpKyIpIitKdCwkdD0iKD86IitbanQrTHQrIj8iLEx0LFV0LHF0LFR0XS5qb2luKCJ8IikrIikiLGVlPVJlZ0V4cChGdCwiZyIpLG5lPVJlZ0V4cChMdCwiZyIpLHJlPVJlZ0V4cCh6dCsiKD89Iit6dCsiKXwiKyR0K0p0LCJnIiksaWU9UmVnRXhwKFtWdCsiPyIrQnQrIisiK1d0KyIoPz0iK1tPdCxWdCwiJCJdLmpvaW4oInwiKSsiKSIsWHQrIisiK0h0KyIoPz0iK1tPdCxWdCtZdCwiJCJdLmpvaW4oInwiKSsiKSIsVnQrIj8iK1l0KyIrIitXdCxWdCsiKyIrSHQsIlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoPz1cXGJ8W2Etel9dKSIsIlxcZCooPzoxc3R8Mm5kfDNyZHwoPyFbMTIzXSlcXGR0aCkoPz1cXGJ8W0EtWl9dKSIsUHQsUXRdLmpvaW4oInwiKSwiZyIpLG9lPVJlZ0V4cCgiWyIrR3QrRXQrQ3QrSXQrIl0iKSxzZT0vW2Etel1bQS1aXXxbQS1aXXsyfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLyxhZT1bIkFycmF5IiwiQnVmZmVyIiwiRGF0YVZpZXciLCJEYXRlIiwiRXJyb3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJGdW5jdGlvbiIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiTWFwIiwiTWF0aCIsIk9iamVjdCIsIlByb21pc2UiLCJSZWdFeHAiLCJTZXQiLCJTdHJpbmciLCJTeW1ib2wiLCJUeXBlRXJyb3IiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiV2Vha01hcCIsIl8iLCJjbGVhclRpbWVvdXQiLCJpc0Zpbml0ZSIsInBhcnNlSW50Iiwic2V0VGltZW91dCJdLHVlPS0xLGNlPXt9O2NlW1JdPWNlW0JdPWNlW2tdPWNlW3pdPWNlW2pdPWNlW1VdPWNlW3FdPWNlW1ZdPWNlW0ddPSEwLGNlW3ZdPWNlW19dPWNlW0xdPWNlW3hdPWNlW1BdPWNlW3ddPWNlW2JdPWNlW0RdPWNlW0NdPWNlW1NdPWNlW0FdPWNlW0ldPWNlW01dPWNlW0ZdPWNlW09dPSExO3ZhciBsZT17fTtsZVt2XT1sZVtfXT1sZVtMXT1sZVtQXT1sZVt4XT1sZVt3XT1sZVtSXT1sZVtCXT1sZVtrXT1sZVt6XT1sZVtqXT1sZVtDXT1sZVtTXT1sZVtBXT1sZVtJXT1sZVtNXT1sZVtGXT1sZVtUXT1sZVtVXT1sZVtxXT1sZVtWXT1sZVtHXT0hMCxsZVtiXT1sZVtEXT1sZVtPXT0hMTt2YXIgaGU9eyJcXCI6IlxcIiwiJyI6IiciLCJcbiI6Im4iLCJcciI6InIiLCJcdTIwMjgiOiJ1MjAyOCIsIlx1MjAyOSI6InUyMDI5In0sZmU9cGFyc2VGbG9hdCxwZT1wYXJzZUludCxkZT0ib2JqZWN0Ij09dHlwZW9mIHRlJiZ0ZSYmdGUuT2JqZWN0PT09T2JqZWN0JiZ0ZSxnZT0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLHllPWRlfHxnZXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxtZT1lJiYhZS5ub2RlVHlwZSYmZSx2ZT1tZSYmdCYmIXQubm9kZVR5cGUmJnQsX2U9dmUmJnZlLmV4cG9ydHM9PT1tZSx4ZT1fZSYmZGUucHJvY2Vzcyx3ZT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gdmUmJnZlLnJlcXVpcmUmJnZlLnJlcXVpcmUoInV0aWwiKS50eXBlc3x8eGUmJnhlLmJpbmRpbmcmJnhlLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpLGJlPXdlJiZ3ZS5pc0FycmF5QnVmZmVyLERlPXdlJiZ3ZS5pc0RhdGUsRWU9d2UmJndlLmlzTWFwLENlPXdlJiZ3ZS5pc1JlZ0V4cCxTZT13ZSYmd2UuaXNTZXQsQWU9d2UmJndlLmlzVHlwZWRBcnJheTtmdW5jdGlvbiBOZSh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfWZ1bmN0aW9uIEllKHQsZSxuLHIpe2Zvcih2YXIgaT0tMSxvPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK2k8bzspe3ZhciBzPXRbaV07ZShyLHMsbihzKSx0KX1yZXR1cm4gcn1mdW5jdGlvbiBNZSh0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248ciYmITEhPT1lKHRbbl0sbix0KTspO3JldHVybiB0fWZ1bmN0aW9uIEZlKHQsZSl7Zm9yKHZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtuLS0mJiExIT09ZSh0W25dLG4sdCk7KTtyZXR1cm4gdH1mdW5jdGlvbiBUZSh0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248cjspaWYoIWUodFtuXSxuLHQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIE9lKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIHM9dFtuXTtlKHMsbix0KSYmKG9baSsrXT1zKX1yZXR1cm4gb31mdW5jdGlvbiBMZSh0LGUpe3JldHVybiEhKG51bGw9PXQ/MDp0Lmxlbmd0aCkmJkdlKHQsZSwwKT4tMX1mdW5jdGlvbiBQZSh0LGUsbil7Zm9yKHZhciByPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoOysrcjxpOylpZihuKGUsdFtyXSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gUmUodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGgsaT1BcnJheShyKTsrK248cjspaVtuXT1lKHRbbl0sbix0KTtyZXR1cm4gaX1mdW5jdGlvbiBCZSh0LGUpe2Zvcih2YXIgbj0tMSxyPWUubGVuZ3RoLGk9dC5sZW5ndGg7KytuPHI7KXRbaStuXT1lW25dO3JldHVybiB0fWZ1bmN0aW9uIGtlKHQsZSxuLHIpe3ZhciBpPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoO2ZvcihyJiZvJiYobj10WysraV0pOysraTxvOyluPWUobix0W2ldLGksdCk7cmV0dXJuIG59ZnVuY3Rpb24gemUodCxlLG4scil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO2ZvcihyJiZpJiYobj10Wy0taV0pO2ktLTspbj1lKG4sdFtpXSxpLHQpO3JldHVybiBufWZ1bmN0aW9uIGplKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxyOylpZihlKHRbbl0sbix0KSlyZXR1cm4hMDtyZXR1cm4hMX12YXIgVWU9SGUoImxlbmd0aCIpO2Z1bmN0aW9uIHFlKHQsZSxuKXt2YXIgcjtyZXR1cm4gbih0LChmdW5jdGlvbih0LG4saSl7aWYoZSh0LG4saSkpcmV0dXJuIHI9biwhMX0pKSxyfWZ1bmN0aW9uIFZlKHQsZSxuLHIpe2Zvcih2YXIgaT10Lmxlbmd0aCxvPW4rKHI/MTotMSk7cj9vLS06KytvPGk7KWlmKGUodFtvXSxvLHQpKXJldHVybiBvO3JldHVybi0xfWZ1bmN0aW9uIEdlKHQsZSxuKXtyZXR1cm4gZT09ZT9mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW4tMSxpPXQubGVuZ3RoOysrcjxpOylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX0odCxlLG4pOlZlKHQsWGUsbil9ZnVuY3Rpb24gWWUodCxlLG4scil7Zm9yKHZhciBpPW4tMSxvPXQubGVuZ3RoOysraTxvOylpZihyKHRbaV0sZSkpcmV0dXJuIGk7cmV0dXJuLTF9ZnVuY3Rpb24gWGUodCl7cmV0dXJuIHQhPXR9ZnVuY3Rpb24gV2UodCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIG4/SmUodCxlKS9uOnB9ZnVuY3Rpb24gSGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP246ZVt0XX19ZnVuY3Rpb24gWmUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT10P246dFtlXX19ZnVuY3Rpb24gS2UodCxlLG4scixpKXtyZXR1cm4gaSh0LChmdW5jdGlvbih0LGksbyl7bj1yPyhyPSExLHQpOmUobix0LGksbyl9KSksbn1mdW5jdGlvbiBKZSh0LGUpe2Zvcih2YXIgcixpPS0xLG89dC5sZW5ndGg7KytpPG87KXt2YXIgcz1lKHRbaV0pO3MhPT1uJiYocj1yPT09bj9zOnIrcyl9cmV0dXJuIHJ9ZnVuY3Rpb24gUWUodCxlKXtmb3IodmFyIG49LTEscj1BcnJheSh0KTsrK248dDspcltuXT1lKG4pO3JldHVybiByfWZ1bmN0aW9uICRlKHQpe3JldHVybiB0JiZ0LnNsaWNlKDAseW4odCkrMSkucmVwbGFjZShzdCwiIil9ZnVuY3Rpb24gdG4odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX1mdW5jdGlvbiBlbih0LGUpe3JldHVybiBSZShlLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX1mdW5jdGlvbiBubih0LGUpe3JldHVybiB0LmhhcyhlKX1mdW5jdGlvbiBybih0LGUpe2Zvcih2YXIgbj0tMSxyPXQubGVuZ3RoOysrbjxyJiZHZShlLHRbbl0sMCk+LTE7KTtyZXR1cm4gbn1mdW5jdGlvbiBvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS0mJkdlKGUsdFtuXSwwKT4tMTspO3JldHVybiBufXZhciBzbj1aZSh7IsOAIjoiQSIsIsOBIjoiQSIsIsOCIjoiQSIsIsODIjoiQSIsIsOEIjoiQSIsIsOFIjoiQSIsIsOgIjoiYSIsIsOhIjoiYSIsIsOiIjoiYSIsIsOjIjoiYSIsIsOkIjoiYSIsIsOlIjoiYSIsIsOHIjoiQyIsIsOnIjoiYyIsIsOQIjoiRCIsIsOwIjoiZCIsIsOIIjoiRSIsIsOJIjoiRSIsIsOKIjoiRSIsIsOLIjoiRSIsIsOoIjoiZSIsIsOpIjoiZSIsIsOqIjoiZSIsIsOrIjoiZSIsIsOMIjoiSSIsIsONIjoiSSIsIsOOIjoiSSIsIsOPIjoiSSIsIsOsIjoiaSIsIsOtIjoiaSIsIsOuIjoiaSIsIsOvIjoiaSIsIsORIjoiTiIsIsOxIjoibiIsIsOSIjoiTyIsIsOTIjoiTyIsIsOUIjoiTyIsIsOVIjoiTyIsIsOWIjoiTyIsIsOYIjoiTyIsIsOyIjoibyIsIsOzIjoibyIsIsO0IjoibyIsIsO1IjoibyIsIsO2IjoibyIsIsO4IjoibyIsIsOZIjoiVSIsIsOaIjoiVSIsIsObIjoiVSIsIsOcIjoiVSIsIsO5IjoidSIsIsO6IjoidSIsIsO7IjoidSIsIsO8IjoidSIsIsOdIjoiWSIsIsO9IjoieSIsIsO/IjoieSIsIsOGIjoiQWUiLCLDpiI6ImFlIiwiw54iOiJUaCIsIsO+IjoidGgiLCLDnyI6InNzIiwixIAiOiJBIiwixIIiOiJBIiwixIQiOiJBIiwixIEiOiJhIiwixIMiOiJhIiwixIUiOiJhIiwixIYiOiJDIiwixIgiOiJDIiwixIoiOiJDIiwixIwiOiJDIiwixIciOiJjIiwixIkiOiJjIiwixIsiOiJjIiwixI0iOiJjIiwixI4iOiJEIiwixJAiOiJEIiwixI8iOiJkIiwixJEiOiJkIiwixJIiOiJFIiwixJQiOiJFIiwixJYiOiJFIiwixJgiOiJFIiwixJoiOiJFIiwixJMiOiJlIiwixJUiOiJlIiwixJciOiJlIiwixJkiOiJlIiwixJsiOiJlIiwixJwiOiJHIiwixJ4iOiJHIiwixKAiOiJHIiwixKIiOiJHIiwixJ0iOiJnIiwixJ8iOiJnIiwixKEiOiJnIiwixKMiOiJnIiwixKQiOiJIIiwixKYiOiJIIiwixKUiOiJoIiwixKciOiJoIiwixKgiOiJJIiwixKoiOiJJIiwixKwiOiJJIiwixK4iOiJJIiwixLAiOiJJIiwixKkiOiJpIiwixKsiOiJpIiwixK0iOiJpIiwixK8iOiJpIiwixLEiOiJpIiwixLQiOiJKIiwixLUiOiJqIiwixLYiOiJLIiwixLciOiJrIiwixLgiOiJrIiwixLkiOiJMIiwixLsiOiJMIiwixL0iOiJMIiwixL8iOiJMIiwixYEiOiJMIiwixLoiOiJsIiwixLwiOiJsIiwixL4iOiJsIiwixYAiOiJsIiwixYIiOiJsIiwixYMiOiJOIiwixYUiOiJOIiwixYciOiJOIiwixYoiOiJOIiwixYQiOiJuIiwixYYiOiJuIiwixYgiOiJuIiwixYsiOiJuIiwixYwiOiJPIiwixY4iOiJPIiwixZAiOiJPIiwixY0iOiJvIiwixY8iOiJvIiwixZEiOiJvIiwixZQiOiJSIiwixZYiOiJSIiwixZgiOiJSIiwixZUiOiJyIiwixZciOiJyIiwixZkiOiJyIiwixZoiOiJTIiwixZwiOiJTIiwixZ4iOiJTIiwixaAiOiJTIiwixZsiOiJzIiwixZ0iOiJzIiwixZ8iOiJzIiwixaEiOiJzIiwixaIiOiJUIiwixaQiOiJUIiwixaYiOiJUIiwixaMiOiJ0IiwixaUiOiJ0IiwixaciOiJ0IiwixagiOiJVIiwixaoiOiJVIiwixawiOiJVIiwixa4iOiJVIiwixbAiOiJVIiwixbIiOiJVIiwixakiOiJ1IiwixasiOiJ1Iiwixa0iOiJ1Iiwixa8iOiJ1IiwixbEiOiJ1IiwixbMiOiJ1IiwixbQiOiJXIiwixbUiOiJ3IiwixbYiOiJZIiwixbciOiJ5IiwixbgiOiJZIiwixbkiOiJaIiwixbsiOiJaIiwixb0iOiJaIiwixboiOiJ6IiwixbwiOiJ6Iiwixb4iOiJ6IiwixLIiOiJJSiIsIsSzIjoiaWoiLCLFkiI6Ik9lIiwixZMiOiJvZSIsIsWJIjoiJ24iLCLFvyI6InMifSksYW49WmUoeyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9KTtmdW5jdGlvbiB1bih0KXtyZXR1cm4iXFwiK2hlW3RdfWZ1bmN0aW9uIGNuKHQpe3JldHVybiBvZS50ZXN0KHQpfWZ1bmN0aW9uIGxuKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LHIpe25bKytlXT1bcix0XX0pKSxufWZ1bmN0aW9uIGhuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KGUobikpfX1mdW5jdGlvbiBmbih0LGUpe2Zvcih2YXIgbj0tMSxyPXQubGVuZ3RoLGk9MCxzPVtdOysrbjxyOyl7dmFyIGE9dFtuXTsoYT09PWV8fGE9PT1vKSYmKHRbbl09byxzW2krK109bil9cmV0dXJuIHN9ZnVuY3Rpb24gcG4odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT10fSkpLG59ZnVuY3Rpb24gZG4odCl7cmV0dXJuIGNuKHQpP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT1yZS5sYXN0SW5kZXg9MDtyZS50ZXN0KHQpOykrK2U7cmV0dXJuIGV9KHQpOlVlKHQpfWZ1bmN0aW9uIGduKHQpe3JldHVybiBjbih0KT9mdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaChyZSl8fFtdfSh0KTpmdW5jdGlvbih0KXtyZXR1cm4gdC5zcGxpdCgiIil9KHQpfWZ1bmN0aW9uIHluKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJmF0LnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9dmFyIG1uPVplKHsiJmFtcDsiOiImIiwiJmx0OyI6IjwiLCImZ3Q7IjoiPiIsIiZxdW90OyI6JyInLCImIzM5OyI6IicifSk7dmFyIHZuPWZ1bmN0aW9uIHQoZSl7dmFyIGF0LEV0PShlPW51bGw9PWU/eWU6dm4uZGVmYXVsdHMoeWUuT2JqZWN0KCksZSx2bi5waWNrKHllLGFlKSkpLkFycmF5LEN0PWUuRGF0ZSxTdD1lLkVycm9yLEF0PWUuRnVuY3Rpb24sTnQ9ZS5NYXRoLEl0PWUuT2JqZWN0LE10PWUuUmVnRXhwLEZ0PWUuU3RyaW5nLFR0PWUuVHlwZUVycm9yLE90PUV0LnByb3RvdHlwZSxMdD1BdC5wcm90b3R5cGUsUHQ9SXQucHJvdG90eXBlLFJ0PWVbIl9fY29yZS1qc19zaGFyZWRfXyJdLEJ0PUx0LnRvU3RyaW5nLGt0PVB0Lmhhc093blByb3BlcnR5LHp0PTAsanQ9KGF0PS9bXi5dKyQvLmV4ZWMoUnQmJlJ0LmtleXMmJlJ0LmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIithdDoiIixVdD1QdC50b1N0cmluZyxxdD1CdC5jYWxsKEl0KSxWdD15ZS5fLEd0PU10KCJeIitCdC5jYWxsKGt0KS5yZXBsYWNlKGl0LCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpLFl0PV9lP2UuQnVmZmVyOm4sWHQ9ZS5TeW1ib2wsV3Q9ZS5VaW50OEFycmF5LEh0PVl0P1l0LmFsbG9jVW5zYWZlOm4sWnQ9aG4oSXQuZ2V0UHJvdG90eXBlT2YsSXQpLEt0PUl0LmNyZWF0ZSxKdD1QdC5wcm9wZXJ0eUlzRW51bWVyYWJsZSxRdD1PdC5zcGxpY2UsJHQ9WHQ/WHQuaXNDb25jYXRTcHJlYWRhYmxlOm4sdGU9WHQ/WHQuaXRlcmF0b3I6bixyZT1YdD9YdC50b1N0cmluZ1RhZzpuLG9lPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PXBvKEl0LCJkZWZpbmVQcm9wZXJ0eSIpO3JldHVybiB0KHt9LCIiLHt9KSx0fWNhdGNoKHQpe319KCksaGU9ZS5jbGVhclRpbWVvdXQhPT15ZS5jbGVhclRpbWVvdXQmJmUuY2xlYXJUaW1lb3V0LGRlPUN0JiZDdC5ub3chPT15ZS5EYXRlLm5vdyYmQ3Qubm93LGdlPWUuc2V0VGltZW91dCE9PXllLnNldFRpbWVvdXQmJmUuc2V0VGltZW91dCxtZT1OdC5jZWlsLHZlPU50LmZsb29yLHhlPUl0LmdldE93blByb3BlcnR5U3ltYm9scyx3ZT1ZdD9ZdC5pc0J1ZmZlcjpuLFVlPWUuaXNGaW5pdGUsWmU9T3Quam9pbixfbj1obihJdC5rZXlzLEl0KSx4bj1OdC5tYXgsd249TnQubWluLGJuPUN0Lm5vdyxEbj1lLnBhcnNlSW50LEVuPU50LnJhbmRvbSxDbj1PdC5yZXZlcnNlLFNuPXBvKGUsIkRhdGFWaWV3IiksQW49cG8oZSwiTWFwIiksTm49cG8oZSwiUHJvbWlzZSIpLEluPXBvKGUsIlNldCIpLE1uPXBvKGUsIldlYWtNYXAiKSxGbj1wbyhJdCwiY3JlYXRlIiksVG49TW4mJm5ldyBNbixPbj17fSxMbj1qbyhTbiksUG49am8oQW4pLFJuPWpvKE5uKSxCbj1qbyhJbiksa249am8oTW4pLHpuPVh0P1h0LnByb3RvdHlwZTpuLGpuPXpuP3puLnZhbHVlT2Y6bixVbj16bj96bi50b1N0cmluZzpuO2Z1bmN0aW9uIHFuKHQpe2lmKHJhKHQpJiYhWHModCkmJiEodCBpbnN0YW5jZW9mIFhuKSl7aWYodCBpbnN0YW5jZW9mIFluKXJldHVybiB0O2lmKGt0LmNhbGwodCwiX193cmFwcGVkX18iKSlyZXR1cm4gVW8odCl9cmV0dXJuIG5ldyBZbih0KX12YXIgVm49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXtpZighbmEoZSkpcmV0dXJue307aWYoS3QpcmV0dXJuIEt0KGUpO3QucHJvdG90eXBlPWU7dmFyIHI9bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPW4scn19KCk7ZnVuY3Rpb24gR24oKXt9ZnVuY3Rpb24gWW4odCxlKXt0aGlzLl9fd3JhcHBlZF9fPXQsdGhpcy5fX2FjdGlvbnNfXz1bXSx0aGlzLl9fY2hhaW5fXz0hIWUsdGhpcy5fX2luZGV4X189MCx0aGlzLl9fdmFsdWVzX189bn1mdW5jdGlvbiBYbih0KXt0aGlzLl9fd3JhcHBlZF9fPXQsdGhpcy5fX2FjdGlvbnNfXz1bXSx0aGlzLl9fZGlyX189MSx0aGlzLl9fZmlsdGVyZWRfXz0hMSx0aGlzLl9faXRlcmF0ZWVzX189W10sdGhpcy5fX3Rha2VDb3VudF9fPWQsdGhpcy5fX3ZpZXdzX189W119ZnVuY3Rpb24gV24odCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19ZnVuY3Rpb24gSG4odCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19ZnVuY3Rpb24gWm4odCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19ZnVuY3Rpb24gS24odCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IFpuOysrZTxuOyl0aGlzLmFkZCh0W2VdKX1mdW5jdGlvbiBKbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyBIbih0KTt0aGlzLnNpemU9ZS5zaXplfWZ1bmN0aW9uIFFuKHQsZSl7dmFyIG49WHModCkscj0hbiYmWXModCksaT0hbiYmIXImJktzKHQpLG89IW4mJiFyJiYhaSYmaGEodCkscz1ufHxyfHxpfHxvLGE9cz9RZSh0Lmxlbmd0aCxGdCk6W10sdT1hLmxlbmd0aDtmb3IodmFyIGMgaW4gdCkoZXx8a3QuY2FsbCh0LGMpKSYmKCFzfHwhKCJsZW5ndGgiPT1jfHxpJiYoIm9mZnNldCI9PWN8fCJwYXJlbnQiPT1jKXx8byYmKCJidWZmZXIiPT1jfHwiYnl0ZUxlbmd0aCI9PWN8fCJieXRlT2Zmc2V0Ij09Yyl8fHdvKGMsdSkpKSYmYS5wdXNoKGMpO3JldHVybiBhfWZ1bmN0aW9uICRuKHQpe3ZhciBlPXQubGVuZ3RoO3JldHVybiBlP3RbS3IoMCxlLTEpXTpufWZ1bmN0aW9uIHRyKHQsZSl7cmV0dXJuIEJvKEZpKHQpLGNyKGUsMCx0Lmxlbmd0aCkpfWZ1bmN0aW9uIGVyKHQpe3JldHVybiBCbyhGaSh0KSl9ZnVuY3Rpb24gbnIodCxlLHIpeyhyIT09biYmIXFzKHRbZV0scil8fHI9PT1uJiYhKGUgaW4gdCkpJiZhcih0LGUscil9ZnVuY3Rpb24gcnIodCxlLHIpe3ZhciBpPXRbZV07KCFrdC5jYWxsKHQsZSl8fCFxcyhpLHIpfHxyPT09biYmIShlIGluIHQpKSYmYXIodCxlLHIpfWZ1bmN0aW9uIGlyKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoO24tLTspaWYocXModFtuXVswXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBvcih0LGUsbixyKXtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxpLG8pe2Uocix0LG4odCksbyl9KSkscn1mdW5jdGlvbiBzcih0LGUpe3JldHVybiB0JiZUaShlLE9hKGUpLHQpfWZ1bmN0aW9uIGFyKHQsZSxuKXsiX19wcm90b19fIj09ZSYmb2U/b2UodCxlLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpuLHdyaXRhYmxlOiEwfSk6dFtlXT1ufWZ1bmN0aW9uIHVyKHQsZSl7Zm9yKHZhciByPS0xLGk9ZS5sZW5ndGgsbz1FdChpKSxzPW51bGw9PXQ7KytyPGk7KW9bcl09cz9uOk5hKHQsZVtyXSk7cmV0dXJuIG99ZnVuY3Rpb24gY3IodCxlLHIpe3JldHVybiB0PT10JiYociE9PW4mJih0PXQ8PXI/dDpyKSxlIT09biYmKHQ9dD49ZT90OmUpKSx0fWZ1bmN0aW9uIGxyKHQsZSxyLGksbyxzKXt2YXIgYSx1PTEmZSxjPTImZSxsPTQmZTtpZihyJiYoYT1vP3IodCxpLG8scyk6cih0KSksYSE9PW4pcmV0dXJuIGE7aWYoIW5hKHQpKXJldHVybiB0O3ZhciBoPVhzKHQpO2lmKGgpe2lmKGE9ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgsbj1uZXcgdC5jb25zdHJ1Y3RvcihlKTtyZXR1cm4gZSYmInN0cmluZyI9PXR5cGVvZiB0WzBdJiZrdC5jYWxsKHQsImluZGV4IikmJihuLmluZGV4PXQuaW5kZXgsbi5pbnB1dD10LmlucHV0KSxufSh0KSwhdSlyZXR1cm4gRmkodCxhKX1lbHNle3ZhciBmPW1vKHQpLHA9Zj09RHx8Zj09RTtpZihLcyh0KSlyZXR1cm4gQ2kodCx1KTtpZihmPT1BfHxmPT12fHxwJiYhbyl7aWYoYT1jfHxwP3t9Ol9vKHQpLCF1KXJldHVybiBjP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIFRpKHQseW8odCksZSl9KHQsZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmVGkoZSxMYShlKSx0KX0oYSx0KSk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gVGkodCxnbyh0KSxlKX0odCxzcihhLHQpKX1lbHNle2lmKCFsZVtmXSlyZXR1cm4gbz90Ont9O2E9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuY29uc3RydWN0b3I7c3dpdGNoKGUpe2Nhc2UgTDpyZXR1cm4gU2kodCk7Y2FzZSB4OmNhc2UgdzpyZXR1cm4gbmV3IHIoK3QpO2Nhc2UgUDpyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj1lP1NpKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKX0odCxuKTtjYXNlIFI6Y2FzZSBCOmNhc2UgazpjYXNlIHo6Y2FzZSBqOmNhc2UgVTpjYXNlIHE6Y2FzZSBWOmNhc2UgRzpyZXR1cm4gQWkodCxuKTtjYXNlIEM6cmV0dXJuIG5ldyByO2Nhc2UgUzpjYXNlIEY6cmV0dXJuIG5ldyByKHQpO2Nhc2UgSTpyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5zb3VyY2UsZ3QuZXhlYyh0KSk7cmV0dXJuIGUubGFzdEluZGV4PXQubGFzdEluZGV4LGV9KHQpO2Nhc2UgTTpyZXR1cm4gbmV3IHI7Y2FzZSBUOnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gam4/SXQoam4uY2FsbCh0KSk6e319KHQpfX0odCxmLHUpfX1zfHwocz1uZXcgSm4pO3ZhciBkPXMuZ2V0KHQpO2lmKGQpcmV0dXJuIGQ7cy5zZXQodCxhKSx1YSh0KT90LmZvckVhY2goKGZ1bmN0aW9uKG4pe2EuYWRkKGxyKG4sZSxyLG4sdCxzKSl9KSk6aWEodCkmJnQuZm9yRWFjaCgoZnVuY3Rpb24obixpKXthLnNldChpLGxyKG4sZSxyLGksdCxzKSl9KSk7dmFyIGc9aD9uOihsP2M/c286b286Yz9MYTpPYSkodCk7cmV0dXJuIE1lKGd8fHQsKGZ1bmN0aW9uKG4saSl7ZyYmKG49dFtpPW5dKSxycihhLGksbHIobixlLHIsaSx0LHMpKX0pKSxhfWZ1bmN0aW9uIGhyKHQsZSxyKXt2YXIgaT1yLmxlbmd0aDtpZihudWxsPT10KXJldHVybiFpO2Zvcih0PUl0KHQpO2ktLTspe3ZhciBvPXJbaV0scz1lW29dLGE9dFtvXTtpZihhPT09biYmIShvIGluIHQpfHwhcyhhKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBmcih0LGUsaSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBPbygoZnVuY3Rpb24oKXt0LmFwcGx5KG4saSl9KSxlKX1mdW5jdGlvbiBwcih0LGUsbixyKXt2YXIgaT0tMSxvPUxlLHM9ITAsYT10Lmxlbmd0aCx1PVtdLGM9ZS5sZW5ndGg7aWYoIWEpcmV0dXJuIHU7biYmKGU9UmUoZSx0bihuKSkpLHI/KG89UGUscz0hMSk6ZS5sZW5ndGg+PTIwMCYmKG89bm4scz0hMSxlPW5ldyBLbihlKSk7dDpmb3IoOysraTxhOyl7dmFyIGw9dFtpXSxoPW51bGw9PW4/bDpuKGwpO2lmKGw9cnx8MCE9PWw/bDowLHMmJmg9PWgpe2Zvcih2YXIgZj1jO2YtLTspaWYoZVtmXT09PWgpY29udGludWUgdDt1LnB1c2gobCl9ZWxzZSBvKGUsaCxyKXx8dS5wdXNoKGwpfXJldHVybiB1fXFuLnRlbXBsYXRlU2V0dGluZ3M9e2VzY2FwZTpRLGV2YWx1YXRlOiQsaW50ZXJwb2xhdGU6dHQsdmFyaWFibGU6IiIsaW1wb3J0czp7Xzpxbn19LHFuLnByb3RvdHlwZT1Hbi5wcm90b3R5cGUscW4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPXFuLFluLnByb3RvdHlwZT1WbihHbi5wcm90b3R5cGUpLFluLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZbixYbi5wcm90b3R5cGU9Vm4oR24ucHJvdG90eXBlKSxYbi5wcm90b3R5cGUuY29uc3RydWN0b3I9WG4sV24ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1Gbj9GbihudWxsKTp7fSx0aGlzLnNpemU9MH0sV24ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sV24ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKEZuKXt2YXIgcj1lW3RdO3JldHVybiByPT09aT9uOnJ9cmV0dXJuIGt0LmNhbGwoZSx0KT9lW3RdOm59LFduLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gRm4/ZVt0XSE9PW46a3QuY2FsbChlLHQpfSxXbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1GbiYmZT09PW4/aTplLHRoaXN9LEhuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9LEhuLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWlyKGUsdCk7cmV0dXJuIShuPDApJiYobj09ZS5sZW5ndGgtMT9lLnBvcCgpOlF0LmNhbGwoZSxuLDEpLC0tdGhpcy5zaXplLCEwKX0sSG4ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9aXIoZSx0KTtyZXR1cm4gcjwwP246ZVtyXVsxXX0sSG4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gaXIodGhpcy5fX2RhdGFfXyx0KT4tMX0sSG4ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj1pcihuLHQpO3JldHVybiByPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5bcl1bMV09ZSx0aGlzfSxabi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBXbixtYXA6bmV3KEFufHxIbiksc3RyaW5nOm5ldyBXbn19LFpuLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9aG8odGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sWm4ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gaG8odGhpcyx0KS5nZXQodCl9LFpuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIGhvKHRoaXMsdCkuaGFzKHQpfSxabi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49aG8odGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc30sS24ucHJvdG90eXBlLmFkZD1Lbi5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQodCxpKSx0aGlzfSxLbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX0sSm4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgSG4sdGhpcy5zaXplPTB9LEpuLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLG59LEpuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KHQpfSxKbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX0sSm4ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187aWYobiBpbnN0YW5jZW9mIEhuKXt2YXIgcj1uLl9fZGF0YV9fO2lmKCFBbnx8ci5sZW5ndGg8MTk5KXJldHVybiByLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK24uc2l6ZSx0aGlzO249dGhpcy5fX2RhdGFfXz1uZXcgWm4ocil9cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplPW4uc2l6ZSx0aGlzfTt2YXIgZHI9UGkoYnIpLGdyPVBpKERyLCEwKTtmdW5jdGlvbiB5cih0LGUpe3ZhciBuPSEwO3JldHVybiBkcih0LChmdW5jdGlvbih0LHIsaSl7cmV0dXJuIG49ISFlKHQscixpKX0pKSxufWZ1bmN0aW9uIG1yKHQsZSxyKXtmb3IodmFyIGk9LTEsbz10Lmxlbmd0aDsrK2k8bzspe3ZhciBzPXRbaV0sYT1lKHMpO2lmKG51bGwhPWEmJih1PT09bj9hPT1hJiYhbGEoYSk6cihhLHUpKSl2YXIgdT1hLGM9c31yZXR1cm4gY31mdW5jdGlvbiB2cih0LGUpe3ZhciBuPVtdO3JldHVybiBkcih0LChmdW5jdGlvbih0LHIsaSl7ZSh0LHIsaSkmJm4ucHVzaCh0KX0pKSxufWZ1bmN0aW9uIF9yKHQsZSxuLHIsaSl7dmFyIG89LTEscz10Lmxlbmd0aDtmb3Iobnx8KG49eG8pLGl8fChpPVtdKTsrK288czspe3ZhciBhPXRbb107ZT4wJiZuKGEpP2U+MT9fcihhLGUtMSxuLHIsaSk6QmUoaSxhKTpyfHwoaVtpLmxlbmd0aF09YSl9cmV0dXJuIGl9dmFyIHhyPVJpKCksd3I9UmkoITApO2Z1bmN0aW9uIGJyKHQsZSl7cmV0dXJuIHQmJnhyKHQsZSxPYSl9ZnVuY3Rpb24gRHIodCxlKXtyZXR1cm4gdCYmd3IodCxlLE9hKX1mdW5jdGlvbiBFcih0LGUpe3JldHVybiBPZShlLChmdW5jdGlvbihlKXtyZXR1cm4gJHModFtlXSl9KSl9ZnVuY3Rpb24gQ3IodCxlKXtmb3IodmFyIHI9MCxpPShlPXdpKGUsdCkpLmxlbmd0aDtudWxsIT10JiZyPGk7KXQ9dFt6byhlW3IrK10pXTtyZXR1cm4gciYmcj09aT90Om59ZnVuY3Rpb24gU3IodCxlLG4pe3ZhciByPWUodCk7cmV0dXJuIFhzKHQpP3I6QmUocixuKHQpKX1mdW5jdGlvbiBBcih0KXtyZXR1cm4gbnVsbD09dD90PT09bj8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6cmUmJnJlIGluIEl0KHQpP2Z1bmN0aW9uKHQpe3ZhciBlPWt0LmNhbGwodCxyZSkscj10W3JlXTt0cnl7dFtyZV09bjt2YXIgaT0hMH1jYXRjaCh0KXt9dmFyIG89VXQuY2FsbCh0KTtyZXR1cm4gaSYmKGU/dFtyZV09cjpkZWxldGUgdFtyZV0pLG99KHQpOmZ1bmN0aW9uKHQpe3JldHVybiBVdC5jYWxsKHQpfSh0KX1mdW5jdGlvbiBOcih0LGUpe3JldHVybiB0PmV9ZnVuY3Rpb24gSXIodCxlKXtyZXR1cm4gbnVsbCE9dCYma3QuY2FsbCh0LGUpfWZ1bmN0aW9uIE1yKHQsZSl7cmV0dXJuIG51bGwhPXQmJmUgaW4gSXQodCl9ZnVuY3Rpb24gRnIodCxlLHIpe2Zvcih2YXIgaT1yP1BlOkxlLG89dFswXS5sZW5ndGgscz10Lmxlbmd0aCxhPXMsdT1FdChzKSxjPTEvMCxsPVtdO2EtLTspe3ZhciBoPXRbYV07YSYmZSYmKGg9UmUoaCx0bihlKSkpLGM9d24oaC5sZW5ndGgsYyksdVthXT0hciYmKGV8fG8+PTEyMCYmaC5sZW5ndGg+PTEyMCk/bmV3IEtuKGEmJmgpOm59aD10WzBdO3ZhciBmPS0xLHA9dVswXTt0OmZvcig7KytmPG8mJmwubGVuZ3RoPGM7KXt2YXIgZD1oW2ZdLGc9ZT9lKGQpOmQ7aWYoZD1yfHwwIT09ZD9kOjAsIShwP25uKHAsZyk6aShsLGcscikpKXtmb3IoYT1zOy0tYTspe3ZhciB5PXVbYV07aWYoISh5P25uKHksZyk6aSh0W2FdLGcscikpKWNvbnRpbnVlIHR9cCYmcC5wdXNoKGcpLGwucHVzaChkKX19cmV0dXJuIGx9ZnVuY3Rpb24gVHIodCxlLHIpe3ZhciBpPW51bGw9PSh0PU1vKHQsZT13aShlLHQpKSk/dDp0W3pvKFFvKGUpKV07cmV0dXJuIG51bGw9PWk/bjpOZShpLHQscil9ZnVuY3Rpb24gT3IodCl7cmV0dXJuIHJhKHQpJiZBcih0KT09dn1mdW5jdGlvbiBMcih0LGUscixpLG8pe3JldHVybiB0PT09ZXx8KG51bGw9PXR8fG51bGw9PWV8fCFyYSh0KSYmIXJhKGUpP3QhPXQmJmUhPWU6ZnVuY3Rpb24odCxlLHIsaSxvLHMpe3ZhciBhPVhzKHQpLHU9WHMoZSksYz1hP186bW8odCksbD11P186bW8oZSksaD0oYz1jPT12P0E6Yyk9PUEsZj0obD1sPT12P0E6bCk9PUEscD1jPT1sO2lmKHAmJktzKHQpKXtpZighS3MoZSkpcmV0dXJuITE7YT0hMCxoPSExfWlmKHAmJiFoKXJldHVybiBzfHwocz1uZXcgSm4pLGF8fGhhKHQpP3JvKHQsZSxyLGksbyxzKTpmdW5jdGlvbih0LGUsbixyLGksbyxzKXtzd2l0Y2gobil7Y2FzZSBQOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSBMOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFvKG5ldyBXdCh0KSxuZXcgV3QoZSkpKTtjYXNlIHg6Y2FzZSB3OmNhc2UgUzpyZXR1cm4gcXMoK3QsK2UpO2Nhc2UgYjpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UgSTpjYXNlIEY6cmV0dXJuIHQ9PWUrIiI7Y2FzZSBDOnZhciBhPWxuO2Nhc2UgTTp2YXIgdT0xJnI7aWYoYXx8KGE9cG4pLHQuc2l6ZSE9ZS5zaXplJiYhdSlyZXR1cm4hMTt2YXIgYz1zLmdldCh0KTtpZihjKXJldHVybiBjPT1lO3J8PTIscy5zZXQodCxlKTt2YXIgbD1ybyhhKHQpLGEoZSkscixpLG8scyk7cmV0dXJuIHMuZGVsZXRlKHQpLGw7Y2FzZSBUOmlmKGpuKXJldHVybiBqbi5jYWxsKHQpPT1qbi5jYWxsKGUpfXJldHVybiExfSh0LGUsYyxyLGksbyxzKTtpZighKDEmcikpe3ZhciBkPWgmJmt0LmNhbGwodCwiX193cmFwcGVkX18iKSxnPWYmJmt0LmNhbGwoZSwiX193cmFwcGVkX18iKTtpZihkfHxnKXt2YXIgeT1kP3QudmFsdWUoKTp0LG09Zz9lLnZhbHVlKCk6ZTtyZXR1cm4gc3x8KHM9bmV3IEpuKSxvKHksbSxyLGkscyl9fXJldHVybiEhcCYmKHN8fChzPW5ldyBKbiksZnVuY3Rpb24odCxlLHIsaSxvLHMpe3ZhciBhPTEmcix1PW9vKHQpLGM9dS5sZW5ndGgsbD1vbyhlKSxoPWwubGVuZ3RoO2lmKGMhPWgmJiFhKXJldHVybiExO2Zvcih2YXIgZj1jO2YtLTspe3ZhciBwPXVbZl07aWYoIShhP3AgaW4gZTprdC5jYWxsKGUscCkpKXJldHVybiExfXZhciBkPXMuZ2V0KHQpLGc9cy5nZXQoZSk7aWYoZCYmZylyZXR1cm4gZD09ZSYmZz09dDt2YXIgeT0hMDtzLnNldCh0LGUpLHMuc2V0KGUsdCk7Zm9yKHZhciBtPWE7KytmPGM7KXt2YXIgdj10W3A9dVtmXV0sXz1lW3BdO2lmKGkpdmFyIHg9YT9pKF8sdixwLGUsdCxzKTppKHYsXyxwLHQsZSxzKTtpZighKHg9PT1uP3Y9PT1ffHxvKHYsXyxyLGkscyk6eCkpe3k9ITE7YnJlYWt9bXx8KG09ImNvbnN0cnVjdG9yIj09cCl9aWYoeSYmIW0pe3ZhciB3PXQuY29uc3RydWN0b3IsYj1lLmNvbnN0cnVjdG9yO3chPWImJiJjb25zdHJ1Y3RvciJpbiB0JiYiY29uc3RydWN0b3IiaW4gZSYmISgiZnVuY3Rpb24iPT10eXBlb2YgdyYmdyBpbnN0YW5jZW9mIHcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiIGluc3RhbmNlb2YgYikmJih5PSExKX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSkseX0odCxlLHIsaSxvLHMpKX0odCxlLHIsaSxMcixvKSl9ZnVuY3Rpb24gUHIodCxlLHIsaSl7dmFyIG89ci5sZW5ndGgscz1vLGE9IWk7aWYobnVsbD09dClyZXR1cm4hcztmb3IodD1JdCh0KTtvLS07KXt2YXIgdT1yW29dO2lmKGEmJnVbMl0/dVsxXSE9PXRbdVswXV06ISh1WzBdaW4gdCkpcmV0dXJuITF9Zm9yKDsrK288czspe3ZhciBjPSh1PXJbb10pWzBdLGw9dFtjXSxoPXVbMV07aWYoYSYmdVsyXSl7aWYobD09PW4mJiEoYyBpbiB0KSlyZXR1cm4hMX1lbHNle3ZhciBmPW5ldyBKbjtpZihpKXZhciBwPWkobCxoLGMsdCxlLGYpO2lmKCEocD09PW4/THIoaCxsLDMsaSxmKTpwKSlyZXR1cm4hMX19cmV0dXJuITB9ZnVuY3Rpb24gUnIodCl7cmV0dXJuISghbmEodCl8fGZ1bmN0aW9uKHQpe3JldHVybiEhanQmJmp0IGluIHR9KHQpKSYmKCRzKHQpP0d0OnZ0KS50ZXN0KGpvKHQpKX1mdW5jdGlvbiBCcih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGw9PXQ/b3U6Im9iamVjdCI9PXR5cGVvZiB0P1hzKHQpP1ZyKHRbMF0sdFsxXSk6cXIodCk6ZHUodCl9ZnVuY3Rpb24ga3IodCl7aWYoIVNvKHQpKXJldHVybiBfbih0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gSXQodCkpa3QuY2FsbCh0LG4pJiYiY29uc3RydWN0b3IiIT1uJiZlLnB1c2gobik7cmV0dXJuIGV9ZnVuY3Rpb24genIodCl7aWYoIW5hKHQpKXJldHVybiBmdW5jdGlvbih0KXt2YXIgZT1bXTtpZihudWxsIT10KWZvcih2YXIgbiBpbiBJdCh0KSllLnB1c2gobik7cmV0dXJuIGV9KHQpO3ZhciBlPVNvKHQpLG49W107Zm9yKHZhciByIGluIHQpImNvbnN0cnVjdG9yIj09ciYmKGV8fCFrdC5jYWxsKHQscikpfHxuLnB1c2gocik7cmV0dXJuIG59ZnVuY3Rpb24ganIodCxlKXtyZXR1cm4gdDxlfWZ1bmN0aW9uIFVyKHQsZSl7dmFyIG49LTEscj1Icyh0KT9FdCh0Lmxlbmd0aCk6W107cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQsaSxvKXtyWysrbl09ZSh0LGksbyl9KSkscn1mdW5jdGlvbiBxcih0KXt2YXIgZT1mbyh0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/Tm8oZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihuKXtyZXR1cm4gbj09PXR8fFByKG4sdCxlKX19ZnVuY3Rpb24gVnIodCxlKXtyZXR1cm4gRG8odCkmJkFvKGUpP05vKHpvKHQpLGUpOmZ1bmN0aW9uKHIpe3ZhciBpPU5hKHIsdCk7cmV0dXJuIGk9PT1uJiZpPT09ZT9JYShyLHQpOkxyKGUsaSwzKX19ZnVuY3Rpb24gR3IodCxlLHIsaSxvKXt0IT09ZSYmeHIoZSwoZnVuY3Rpb24ocyxhKXtpZihvfHwobz1uZXcgSm4pLG5hKHMpKSFmdW5jdGlvbih0LGUscixpLG8scyxhKXt2YXIgdT1Gbyh0LHIpLGM9Rm8oZSxyKSxsPWEuZ2V0KGMpO2lmKGwpcmV0dXJuIHZvaWQgbnIodCxyLGwpO3ZhciBoPXM/cyh1LGMscisiIix0LGUsYSk6bixmPWg9PT1uO2lmKGYpe3ZhciBwPVhzKGMpLGQ9IXAmJktzKGMpLGc9IXAmJiFkJiZoYShjKTtoPWMscHx8ZHx8Zz9Ycyh1KT9oPXU6WnModSk/aD1GaSh1KTpkPyhmPSExLGg9Q2koYywhMCkpOmc/KGY9ITEsaD1BaShjLCEwKSk6aD1bXTpzYShjKXx8WXMoYyk/KGg9dSxZcyh1KT9oPV9hKHUpOighbmEodSl8fCRzKHUpKSYmKGg9X28oYykpKTpmPSExfWYmJihhLnNldChjLGgpLG8oaCxjLGkscyxhKSxhLmRlbGV0ZShjKSksbnIodCxyLGgpfSh0LGUsYSxyLEdyLGksbyk7ZWxzZXt2YXIgdT1pP2koRm8odCxhKSxzLGErIiIsdCxlLG8pOm47dT09PW4mJih1PXMpLG5yKHQsYSx1KX19KSxMYSl9ZnVuY3Rpb24gWXIodCxlKXt2YXIgcj10Lmxlbmd0aDtpZihyKXJldHVybiB3byhlKz1lPDA/cjowLHIpP3RbZV06bn1mdW5jdGlvbiBYcih0LGUsbil7ZT1lLmxlbmd0aD9SZShlLChmdW5jdGlvbih0KXtyZXR1cm4gWHModCk/ZnVuY3Rpb24oZSl7cmV0dXJuIENyKGUsMT09PXQubGVuZ3RoP3RbMF06dCl9OnR9KSk6W291XTt2YXIgcj0tMTtyZXR1cm4gZT1SZShlLHRuKGxvKCkpKSxmdW5jdGlvbih0LGUpe3ZhciBuPXQubGVuZ3RoO2Zvcih0LnNvcnQoZSk7bi0tOyl0W25dPXRbbl0udmFsdWU7cmV0dXJuIHR9KFVyKHQsKGZ1bmN0aW9uKHQsbixpKXtyZXR1cm57Y3JpdGVyaWE6UmUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KSksaW5kZXg6KytyLHZhbHVlOnR9fSkpLChmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPS0xLGk9dC5jcml0ZXJpYSxvPWUuY3JpdGVyaWEscz1pLmxlbmd0aCxhPW4ubGVuZ3RoOysrcjxzOyl7dmFyIHU9TmkoaVtyXSxvW3JdKTtpZih1KXJldHVybiByPj1hP3U6dSooImRlc2MiPT1uW3JdPy0xOjEpfXJldHVybiB0LmluZGV4LWUuaW5kZXh9KHQsZSxuKX0pKX1mdW5jdGlvbiBXcih0LGUsbil7Zm9yKHZhciByPS0xLGk9ZS5sZW5ndGgsbz17fTsrK3I8aTspe3ZhciBzPWVbcl0sYT1Dcih0LHMpO24oYSxzKSYmZWkobyx3aShzLHQpLGEpfXJldHVybiBvfWZ1bmN0aW9uIEhyKHQsZSxuLHIpe3ZhciBpPXI/WWU6R2Usbz0tMSxzPWUubGVuZ3RoLGE9dDtmb3IodD09PWUmJihlPUZpKGUpKSxuJiYoYT1SZSh0LHRuKG4pKSk7KytvPHM7KWZvcih2YXIgdT0wLGM9ZVtvXSxsPW4/bihjKTpjOyh1PWkoYSxsLHUscikpPi0xOylhIT09dCYmUXQuY2FsbChhLHUsMSksUXQuY2FsbCh0LHUsMSk7cmV0dXJuIHR9ZnVuY3Rpb24gWnIodCxlKXtmb3IodmFyIG49dD9lLmxlbmd0aDowLHI9bi0xO24tLTspe3ZhciBpPWVbbl07aWYobj09cnx8aSE9PW8pe3ZhciBvPWk7d28oaSk/UXQuY2FsbCh0LGksMSk6cGkodCxpKX19cmV0dXJuIHR9ZnVuY3Rpb24gS3IodCxlKXtyZXR1cm4gdCt2ZShFbigpKihlLXQrMSkpfWZ1bmN0aW9uIEpyKHQsZSl7dmFyIG49IiI7aWYoIXR8fGU8MXx8ZT5mKXJldHVybiBuO2Rve2UlMiYmKG4rPXQpLChlPXZlKGUvMikpJiYodCs9dCl9d2hpbGUoZSk7cmV0dXJuIG59ZnVuY3Rpb24gUXIodCxlKXtyZXR1cm4gTG8oSW8odCxlLG91KSx0KyIiKX1mdW5jdGlvbiAkcih0KXtyZXR1cm4gJG4ocWEodCkpfWZ1bmN0aW9uIHRpKHQsZSl7dmFyIG49cWEodCk7cmV0dXJuIEJvKG4sY3IoZSwwLG4ubGVuZ3RoKSl9ZnVuY3Rpb24gZWkodCxlLHIsaSl7aWYoIW5hKHQpKXJldHVybiB0O2Zvcih2YXIgbz0tMSxzPShlPXdpKGUsdCkpLmxlbmd0aCxhPXMtMSx1PXQ7bnVsbCE9dSYmKytvPHM7KXt2YXIgYz16byhlW29dKSxsPXI7aWYoIl9fcHJvdG9fXyI9PT1jfHwiY29uc3RydWN0b3IiPT09Y3x8InByb3RvdHlwZSI9PT1jKXJldHVybiB0O2lmKG8hPWEpe3ZhciBoPXVbY107KGw9aT9pKGgsYyx1KTpuKT09PW4mJihsPW5hKGgpP2g6d28oZVtvKzFdKT9bXTp7fSl9cnIodSxjLGwpLHU9dVtjXX1yZXR1cm4gdH12YXIgbmk9VG4/ZnVuY3Rpb24odCxlKXtyZXR1cm4gVG4uc2V0KHQsZSksdH06b3Uscmk9b2U/ZnVuY3Rpb24odCxlKXtyZXR1cm4gb2UodCwidG9TdHJpbmciLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpudShlKSx3cml0YWJsZTohMH0pfTpvdTtmdW5jdGlvbiBpaSh0KXtyZXR1cm4gQm8ocWEodCkpfWZ1bmN0aW9uIG9pKHQsZSxuKXt2YXIgcj0tMSxpPXQubGVuZ3RoO2U8MCYmKGU9LWU+aT8wOmkrZSksKG49bj5pP2k6bik8MCYmKG4rPWkpLGk9ZT5uPzA6bi1lPj4+MCxlPj4+PTA7Zm9yKHZhciBvPUV0KGkpOysrcjxpOylvW3JdPXRbcitlXTtyZXR1cm4gb31mdW5jdGlvbiBzaSh0LGUpe3ZhciBuO3JldHVybiBkcih0LChmdW5jdGlvbih0LHIsaSl7cmV0dXJuIShuPWUodCxyLGkpKX0pKSwhIW59ZnVuY3Rpb24gYWkodCxlLG4pe3ZhciByPTAsaT1udWxsPT10P3I6dC5sZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiBlJiZlPT1lJiZpPD15KXtmb3IoO3I8aTspe3ZhciBvPXIraT4+PjEscz10W29dO251bGwhPT1zJiYhbGEocykmJihuP3M8PWU6czxlKT9yPW8rMTppPW99cmV0dXJuIGl9cmV0dXJuIHVpKHQsZSxvdSxuKX1mdW5jdGlvbiB1aSh0LGUscixpKXt2YXIgbz0wLHM9bnVsbD09dD8wOnQubGVuZ3RoO2lmKDA9PT1zKXJldHVybiAwO2Zvcih2YXIgYT0oZT1yKGUpKSE9ZSx1PW51bGw9PT1lLGM9bGEoZSksbD1lPT09bjtvPHM7KXt2YXIgaD12ZSgobytzKS8yKSxmPXIodFtoXSkscD1mIT09bixkPW51bGw9PT1mLHk9Zj09ZixtPWxhKGYpO2lmKGEpdmFyIHY9aXx8eTtlbHNlIHY9bD95JiYoaXx8cCk6dT95JiZwJiYoaXx8IWQpOmM/eSYmcCYmIWQmJihpfHwhbSk6IWQmJiFtJiYoaT9mPD1lOmY8ZSk7dj9vPWgrMTpzPWh9cmV0dXJuIHduKHMsZyl9ZnVuY3Rpb24gY2kodCxlKXtmb3IodmFyIG49LTEscj10Lmxlbmd0aCxpPTAsbz1bXTsrK248cjspe3ZhciBzPXRbbl0sYT1lP2Uocyk6cztpZighbnx8IXFzKGEsdSkpe3ZhciB1PWE7b1tpKytdPTA9PT1zPzA6c319cmV0dXJuIG99ZnVuY3Rpb24gbGkodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3Q6bGEodCk/cDordH1mdW5jdGlvbiBoaSh0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoWHModCkpcmV0dXJuIFJlKHQsaGkpKyIiO2lmKGxhKHQpKXJldHVybiBVbj9Vbi5jYWxsKHQpOiIiO3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1oPyItMCI6ZX1mdW5jdGlvbiBmaSh0LGUsbil7dmFyIHI9LTEsaT1MZSxvPXQubGVuZ3RoLHM9ITAsYT1bXSx1PWE7aWYobilzPSExLGk9UGU7ZWxzZSBpZihvPj0yMDApe3ZhciBjPWU/bnVsbDpKaSh0KTtpZihjKXJldHVybiBwbihjKTtzPSExLGk9bm4sdT1uZXcgS259ZWxzZSB1PWU/W106YTt0OmZvcig7KytyPG87KXt2YXIgbD10W3JdLGg9ZT9lKGwpOmw7aWYobD1ufHwwIT09bD9sOjAscyYmaD09aCl7Zm9yKHZhciBmPXUubGVuZ3RoO2YtLTspaWYodVtmXT09PWgpY29udGludWUgdDtlJiZ1LnB1c2goaCksYS5wdXNoKGwpfWVsc2UgaSh1LGgsbil8fCh1IT09YSYmdS5wdXNoKGgpLGEucHVzaChsKSl9cmV0dXJuIGF9ZnVuY3Rpb24gcGkodCxlKXtyZXR1cm4gbnVsbD09KHQ9TW8odCxlPXdpKGUsdCkpKXx8ZGVsZXRlIHRbem8oUW8oZSkpXX1mdW5jdGlvbiBkaSh0LGUsbixyKXtyZXR1cm4gZWkodCxlLG4oQ3IodCxlKSkscil9ZnVuY3Rpb24gZ2kodCxlLG4scil7Zm9yKHZhciBpPXQubGVuZ3RoLG89cj9pOi0xOyhyP28tLTorK288aSkmJmUodFtvXSxvLHQpOyk7cmV0dXJuIG4/b2kodCxyPzA6byxyP28rMTppKTpvaSh0LHI/bysxOjAscj9pOm8pfWZ1bmN0aW9uIHlpKHQsZSl7dmFyIG49dDtyZXR1cm4gbiBpbnN0YW5jZW9mIFhuJiYobj1uLnZhbHVlKCkpLGtlKGUsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZnVuYy5hcHBseShlLnRoaXNBcmcsQmUoW3RdLGUuYXJncykpfSksbil9ZnVuY3Rpb24gbWkodCxlLG4pe3ZhciByPXQubGVuZ3RoO2lmKHI8MilyZXR1cm4gcj9maSh0WzBdKTpbXTtmb3IodmFyIGk9LTEsbz1FdChyKTsrK2k8cjspZm9yKHZhciBzPXRbaV0sYT0tMTsrK2E8cjspYSE9aSYmKG9baV09cHIob1tpXXx8cyx0W2FdLGUsbikpO3JldHVybiBmaShfcihvLDEpLGUsbil9ZnVuY3Rpb24gdmkodCxlLHIpe2Zvcih2YXIgaT0tMSxvPXQubGVuZ3RoLHM9ZS5sZW5ndGgsYT17fTsrK2k8bzspe3ZhciB1PWk8cz9lW2ldOm47cihhLHRbaV0sdSl9cmV0dXJuIGF9ZnVuY3Rpb24gX2kodCl7cmV0dXJuIFpzKHQpP3Q6W119ZnVuY3Rpb24geGkodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpvdX1mdW5jdGlvbiB3aSh0LGUpe3JldHVybiBYcyh0KT90OkRvKHQsZSk/W3RdOmtvKHhhKHQpKX12YXIgYmk9UXI7ZnVuY3Rpb24gRGkodCxlLHIpe3ZhciBpPXQubGVuZ3RoO3JldHVybiByPXI9PT1uP2k6ciwhZSYmcj49aT90Om9pKHQsZSxyKX12YXIgRWk9aGV8fGZ1bmN0aW9uKHQpe3JldHVybiB5ZS5jbGVhclRpbWVvdXQodCl9O2Z1bmN0aW9uIENpKHQsZSl7aWYoZSlyZXR1cm4gdC5zbGljZSgpO3ZhciBuPXQubGVuZ3RoLHI9SHQ/SHQobik6bmV3IHQuY29uc3RydWN0b3Iobik7cmV0dXJuIHQuY29weShyKSxyfWZ1bmN0aW9uIFNpKHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyBXdChlKS5zZXQobmV3IFd0KHQpKSxlfWZ1bmN0aW9uIEFpKHQsZSl7dmFyIG49ZT9TaSh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKG4sdC5ieXRlT2Zmc2V0LHQubGVuZ3RoKX1mdW5jdGlvbiBOaSh0LGUpe2lmKHQhPT1lKXt2YXIgcj10IT09bixpPW51bGw9PT10LG89dD09dCxzPWxhKHQpLGE9ZSE9PW4sdT1udWxsPT09ZSxjPWU9PWUsbD1sYShlKTtpZighdSYmIWwmJiFzJiZ0PmV8fHMmJmEmJmMmJiF1JiYhbHx8aSYmYSYmY3x8IXImJmN8fCFvKXJldHVybiAxO2lmKCFpJiYhcyYmIWwmJnQ8ZXx8bCYmciYmbyYmIWkmJiFzfHx1JiZyJiZvfHwhYSYmb3x8IWMpcmV0dXJuLTF9cmV0dXJuIDB9ZnVuY3Rpb24gSWkodCxlLG4scil7Zm9yKHZhciBpPS0xLG89dC5sZW5ndGgscz1uLmxlbmd0aCxhPS0xLHU9ZS5sZW5ndGgsYz14bihvLXMsMCksbD1FdCh1K2MpLGg9IXI7KythPHU7KWxbYV09ZVthXTtmb3IoOysraTxzOykoaHx8aTxvKSYmKGxbbltpXV09dFtpXSk7Zm9yKDtjLS07KWxbYSsrXT10W2krK107cmV0dXJuIGx9ZnVuY3Rpb24gTWkodCxlLG4scil7Zm9yKHZhciBpPS0xLG89dC5sZW5ndGgscz0tMSxhPW4ubGVuZ3RoLHU9LTEsYz1lLmxlbmd0aCxsPXhuKG8tYSwwKSxoPUV0KGwrYyksZj0hcjsrK2k8bDspaFtpXT10W2ldO2Zvcih2YXIgcD1pOysrdTxjOyloW3ArdV09ZVt1XTtmb3IoOysrczxhOykoZnx8aTxvKSYmKGhbcCtuW3NdXT10W2krK10pO3JldHVybiBofWZ1bmN0aW9uIEZpKHQsZSl7dmFyIG49LTEscj10Lmxlbmd0aDtmb3IoZXx8KGU9RXQocikpOysrbjxyOyllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gVGkodCxlLHIsaSl7dmFyIG89IXI7cnx8KHI9e30pO2Zvcih2YXIgcz0tMSxhPWUubGVuZ3RoOysrczxhOyl7dmFyIHU9ZVtzXSxjPWk/aShyW3VdLHRbdV0sdSxyLHQpOm47Yz09PW4mJihjPXRbdV0pLG8/YXIocix1LGMpOnJyKHIsdSxjKX1yZXR1cm4gcn1mdW5jdGlvbiBPaSh0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe3ZhciBpPVhzKG4pP0llOm9yLG89ZT9lKCk6e307cmV0dXJuIGkobix0LGxvKHIsMiksbyl9fWZ1bmN0aW9uIExpKHQpe3JldHVybiBRcigoZnVuY3Rpb24oZSxyKXt2YXIgaT0tMSxvPXIubGVuZ3RoLHM9bz4xP3Jbby0xXTpuLGE9bz4yP3JbMl06bjtmb3Iocz10Lmxlbmd0aD4zJiYiZnVuY3Rpb24iPT10eXBlb2Ygcz8oby0tLHMpOm4sYSYmYm8oclswXSxyWzFdLGEpJiYocz1vPDM/bjpzLG89MSksZT1JdChlKTsrK2k8bzspe3ZhciB1PXJbaV07dSYmdChlLHUsaSxzKX1yZXR1cm4gZX0pKX1mdW5jdGlvbiBQaSh0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe2lmKG51bGw9PW4pcmV0dXJuIG47aWYoIUhzKG4pKXJldHVybiB0KG4scik7Zm9yKHZhciBpPW4ubGVuZ3RoLG89ZT9pOi0xLHM9SXQobik7KGU/by0tOisrbzxpKSYmITEhPT1yKHNbb10sbyxzKTspO3JldHVybiBufX1mdW5jdGlvbiBSaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHIpe2Zvcih2YXIgaT0tMSxvPUl0KGUpLHM9cihlKSxhPXMubGVuZ3RoO2EtLTspe3ZhciB1PXNbdD9hOisraV07aWYoITE9PT1uKG9bdV0sdSxvKSlicmVha31yZXR1cm4gZX19ZnVuY3Rpb24gQmkodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWNuKGU9eGEoZSkpP2duKGUpOm4saT1yP3JbMF06ZS5jaGFyQXQoMCksbz1yP0RpKHIsMSkuam9pbigiIik6ZS5zbGljZSgxKTtyZXR1cm4gaVt0XSgpK299fWZ1bmN0aW9uIGtpKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4ga2UoJGEoWWEoZSkucmVwbGFjZShlZSwiIikpLHQsIiIpfX1mdW5jdGlvbiB6aSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyB0O2Nhc2UgMTpyZXR1cm4gbmV3IHQoZVswXSk7Y2FzZSAyOnJldHVybiBuZXcgdChlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSk7Y2FzZSA1OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0pO2Nhc2UgNjpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0pO2Nhc2UgNzpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0sZVs2XSl9dmFyIG49Vm4odC5wcm90b3R5cGUpLHI9dC5hcHBseShuLGUpO3JldHVybiBuYShyKT9yOm59fWZ1bmN0aW9uIGppKHQpe3JldHVybiBmdW5jdGlvbihlLHIsaSl7dmFyIG89SXQoZSk7aWYoIUhzKGUpKXt2YXIgcz1sbyhyLDMpO2U9T2EoZSkscj1mdW5jdGlvbih0KXtyZXR1cm4gcyhvW3RdLHQsbyl9fXZhciBhPXQoZSxyLGkpO3JldHVybiBhPi0xP29bcz9lW2FdOmFdOm59fWZ1bmN0aW9uIFVpKHQpe3JldHVybiBpbygoZnVuY3Rpb24oZSl7dmFyIGk9ZS5sZW5ndGgsbz1pLHM9WW4ucHJvdG90eXBlLnRocnU7Zm9yKHQmJmUucmV2ZXJzZSgpO28tLTspe3ZhciBhPWVbb107aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGEpdGhyb3cgbmV3IFR0KHIpO2lmKHMmJiF1JiYid3JhcHBlciI9PXVvKGEpKXZhciB1PW5ldyBZbihbXSwhMCl9Zm9yKG89dT9vOmk7KytvPGk7KXt2YXIgYz11byhhPWVbb10pLGw9IndyYXBwZXIiPT1jP2FvKGEpOm47dT1sJiZFbyhsWzBdKSYmNDI0PT1sWzFdJiYhbFs0XS5sZW5ndGgmJjE9PWxbOV0/dVt1byhsWzBdKV0uYXBwbHkodSxsWzNdKToxPT1hLmxlbmd0aCYmRW8oYSk/dVtjXSgpOnUudGhydShhKX1yZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMsbj10WzBdO2lmKHUmJjE9PXQubGVuZ3RoJiZYcyhuKSlyZXR1cm4gdS5wbGFudChuKS52YWx1ZSgpO2Zvcih2YXIgcj0wLG89aT9lW3JdLmFwcGx5KHRoaXMsdCk6bjsrK3I8aTspbz1lW3JdLmNhbGwodGhpcyxvKTtyZXR1cm4gb319KSl9ZnVuY3Rpb24gcWkodCxlLHIsaSxvLHMsYSx1LGwsaCl7dmFyIGY9ZSZjLHA9MSZlLGQ9MiZlLGc9MjQmZSx5PTUxMiZlLG09ZD9uOnppKHQpO3JldHVybiBmdW5jdGlvbiBjKCl7Zm9yKHZhciB2PWFyZ3VtZW50cy5sZW5ndGgsXz1FdCh2KSx4PXY7eC0tOylfW3hdPWFyZ3VtZW50c1t4XTtpZihnKXZhciB3PWNvKGMpLGI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5sZW5ndGgscj0wO24tLTspdFtuXT09PWUmJisrcjtyZXR1cm4gcn0oXyx3KTtpZihpJiYoXz1JaShfLGksbyxnKSkscyYmKF89TWkoXyxzLGEsZykpLHYtPWIsZyYmdjxoKXt2YXIgRD1mbihfLHcpO3JldHVybiBaaSh0LGUscWksYy5wbGFjZWhvbGRlcixyLF8sRCx1LGwsaC12KX12YXIgRT1wP3I6dGhpcyxDPWQ/RVt0XTp0O3JldHVybiB2PV8ubGVuZ3RoLHU/Xz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aCxpPXduKGUubGVuZ3RoLHIpLG89RmkodCk7aS0tOyl7dmFyIHM9ZVtpXTt0W2ldPXdvKHMscik/b1tzXTpufXJldHVybiB0fShfLHUpOnkmJnY+MSYmXy5yZXZlcnNlKCksZiYmbDx2JiYoXy5sZW5ndGg9bCksdGhpcyYmdGhpcyE9PXllJiZ0aGlzIGluc3RhbmNlb2YgYyYmKEM9bXx8emkoQykpLEMuYXBwbHkoRSxfKX19ZnVuY3Rpb24gVmkodCxlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGJyKHQsKGZ1bmN0aW9uKHQsaSxvKXtlKHIsbih0KSxpLG8pfSkpLHJ9KG4sdCxlKHIpLHt9KX19ZnVuY3Rpb24gR2kodCxlKXtyZXR1cm4gZnVuY3Rpb24ocixpKXt2YXIgbztpZihyPT09biYmaT09PW4pcmV0dXJuIGU7aWYociE9PW4mJihvPXIpLGkhPT1uKXtpZihvPT09bilyZXR1cm4gaTsic3RyaW5nIj09dHlwZW9mIHJ8fCJzdHJpbmciPT10eXBlb2YgaT8ocj1oaShyKSxpPWhpKGkpKToocj1saShyKSxpPWxpKGkpKSxvPXQocixpKX1yZXR1cm4gb319ZnVuY3Rpb24gWWkodCl7cmV0dXJuIGlvKChmdW5jdGlvbihlKXtyZXR1cm4gZT1SZShlLHRuKGxvKCkpKSxRcigoZnVuY3Rpb24obil7dmFyIHI9dGhpcztyZXR1cm4gdChlLChmdW5jdGlvbih0KXtyZXR1cm4gTmUodCxyLG4pfSkpfSkpfSkpfWZ1bmN0aW9uIFhpKHQsZSl7dmFyIHI9KGU9ZT09PW4/IiAiOmhpKGUpKS5sZW5ndGg7aWYocjwyKXJldHVybiByP0pyKGUsdCk6ZTt2YXIgaT1KcihlLG1lKHQvZG4oZSkpKTtyZXR1cm4gY24oZSk/RGkoZ24oaSksMCx0KS5qb2luKCIiKTppLnNsaWNlKDAsdCl9ZnVuY3Rpb24gV2kodCl7cmV0dXJuIGZ1bmN0aW9uKGUscixpKXtyZXR1cm4gaSYmIm51bWJlciIhPXR5cGVvZiBpJiZibyhlLHIsaSkmJihyPWk9biksZT1nYShlKSxyPT09bj8ocj1lLGU9MCk6cj1nYShyKSxmdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9LTEsbz14bihtZSgoZS10KS8obnx8MSkpLDApLHM9RXQobyk7by0tOylzW3I/bzorK2ldPXQsdCs9bjtyZXR1cm4gc30oZSxyLGk9aT09PW4/ZTxyPzE6LTE6Z2EoaSksdCl9fWZ1bmN0aW9uIEhpKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmInN0cmluZyI9PXR5cGVvZiBufHwoZT12YShlKSxuPXZhKG4pKSx0KGUsbil9fWZ1bmN0aW9uIFppKHQsZSxyLGksbyxzLGMsbCxoLGYpe3ZhciBwPTgmZTtlfD1wP2E6dSw0JihlJj1+KHA/dTphKSl8fChlJj0tNCk7dmFyIGQ9W3QsZSxvLHA/czpuLHA/YzpuLHA/bjpzLHA/bjpjLGwsaCxmXSxnPXIuYXBwbHkobixkKTtyZXR1cm4gRW8odCkmJlRvKGcsZCksZy5wbGFjZWhvbGRlcj1pLFBvKGcsdCxlKX1mdW5jdGlvbiBLaSh0KXt2YXIgZT1OdFt0XTtyZXR1cm4gZnVuY3Rpb24odCxuKXtpZih0PXZhKHQpLChuPW51bGw9PW4/MDp3bih5YShuKSwyOTIpKSYmVWUodCkpe3ZhciByPSh4YSh0KSsiZSIpLnNwbGl0KCJlIik7cmV0dXJuKygocj0oeGEoZShyWzBdKyJlIisoK3JbMV0rbikpKSsiZSIpLnNwbGl0KCJlIikpWzBdKyJlIisoK3JbMV0tbikpfXJldHVybiBlKHQpfX12YXIgSmk9SW4mJjEvcG4obmV3IEluKFssLTBdKSlbMV09PWg/ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBJbih0KX06bHU7ZnVuY3Rpb24gUWkodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPW1vKGUpO3JldHVybiBuPT1DP2xuKGUpOm49PU0/ZnVuY3Rpb24odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT1bdCx0XX0pKSxufShlKTpmdW5jdGlvbih0LGUpe3JldHVybiBSZShlLChmdW5jdGlvbihlKXtyZXR1cm5bZSx0W2VdXX0pKX0oZSx0KGUpKX19ZnVuY3Rpb24gJGkodCxlLGksaCxmLHAsZCxnKXt2YXIgeT0yJmU7aWYoIXkmJiJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTt2YXIgbT1oP2gubGVuZ3RoOjA7aWYobXx8KGUmPS05NyxoPWY9biksZD1kPT09bj9kOnhuKHlhKGQpLDApLGc9Zz09PW4/Zzp5YShnKSxtLT1mP2YubGVuZ3RoOjAsZSZ1KXt2YXIgdj1oLF89ZjtoPWY9bn12YXIgeD15P246YW8odCksdz1bdCxlLGksaCxmLHYsXyxwLGQsZ107aWYoeCYmZnVuY3Rpb24odCxlKXt2YXIgbj10WzFdLHI9ZVsxXSxpPW58cixzPWk8MTMxLGE9cj09YyYmOD09bnx8cj09YyYmbj09bCYmdFs3XS5sZW5ndGg8PWVbOF18fDM4ND09ciYmZVs3XS5sZW5ndGg8PWVbOF0mJjg9PW47aWYoIXMmJiFhKXJldHVybiB0OzEmciYmKHRbMl09ZVsyXSxpfD0xJm4/MDo0KTt2YXIgdT1lWzNdO2lmKHUpe3ZhciBoPXRbM107dFszXT1oP0lpKGgsdSxlWzRdKTp1LHRbNF09aD9mbih0WzNdLG8pOmVbNF19dT1lWzVdLHUmJihoPXRbNV0sdFs1XT1oP01pKGgsdSxlWzZdKTp1LHRbNl09aD9mbih0WzVdLG8pOmVbNl0pLHU9ZVs3XSx1JiYodFs3XT11KSxyJmMmJih0WzhdPW51bGw9PXRbOF0/ZVs4XTp3bih0WzhdLGVbOF0pKSxudWxsPT10WzldJiYodFs5XT1lWzldKSx0WzBdPWVbMF0sdFsxXT1pfSh3LHgpLHQ9d1swXSxlPXdbMV0saT13WzJdLGg9d1szXSxmPXdbNF0sIShnPXdbOV09d1s5XT09PW4/eT8wOnQubGVuZ3RoOnhuKHdbOV0tbSwwKSkmJjI0JmUmJihlJj0tMjUpLGUmJjEhPWUpYj04PT1lfHxlPT1zP2Z1bmN0aW9uKHQsZSxyKXt2YXIgaT16aSh0KTtyZXR1cm4gZnVuY3Rpb24gbygpe2Zvcih2YXIgcz1hcmd1bWVudHMubGVuZ3RoLGE9RXQocyksdT1zLGM9Y28obyk7dS0tOylhW3VdPWFyZ3VtZW50c1t1XTt2YXIgbD1zPDMmJmFbMF0hPT1jJiZhW3MtMV0hPT1jP1tdOmZuKGEsYyk7cmV0dXJuKHMtPWwubGVuZ3RoKTxyP1ppKHQsZSxxaSxvLnBsYWNlaG9sZGVyLG4sYSxsLG4sbixyLXMpOk5lKHRoaXMmJnRoaXMhPT15ZSYmdGhpcyBpbnN0YW5jZW9mIG8/aTp0LHRoaXMsYSl9fSh0LGUsZyk6ZSE9YSYmMzMhPWV8fGYubGVuZ3RoP3FpLmFwcGx5KG4sdyk6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9MSZlLG89emkodCk7cmV0dXJuIGZ1bmN0aW9uIGUoKXtmb3IodmFyIHM9LTEsYT1hcmd1bWVudHMubGVuZ3RoLHU9LTEsYz1yLmxlbmd0aCxsPUV0KGMrYSksaD10aGlzJiZ0aGlzIT09eWUmJnRoaXMgaW5zdGFuY2VvZiBlP286dDsrK3U8YzspbFt1XT1yW3VdO2Zvcig7YS0tOylsW3UrK109YXJndW1lbnRzWysrc107cmV0dXJuIE5lKGgsaT9uOnRoaXMsbCl9fSh0LGUsaSxoKTtlbHNlIHZhciBiPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0xJmUsaT16aSh0KTtyZXR1cm4gZnVuY3Rpb24gZSgpe3JldHVybih0aGlzJiZ0aGlzIT09eWUmJnRoaXMgaW5zdGFuY2VvZiBlP2k6dCkuYXBwbHkocj9uOnRoaXMsYXJndW1lbnRzKX19KHQsZSxpKTtyZXR1cm4gUG8oKHg/bmk6VG8pKGIsdyksdCxlKX1mdW5jdGlvbiB0byh0LGUscixpKXtyZXR1cm4gdD09PW58fHFzKHQsUHRbcl0pJiYha3QuY2FsbChpLHIpP2U6dH1mdW5jdGlvbiBlbyh0LGUscixpLG8scyl7cmV0dXJuIG5hKHQpJiZuYShlKSYmKHMuc2V0KGUsdCksR3IodCxlLG4sZW8scykscy5kZWxldGUoZSkpLHR9ZnVuY3Rpb24gbm8odCl7cmV0dXJuIHNhKHQpP246dH1mdW5jdGlvbiBybyh0LGUscixpLG8scyl7dmFyIGE9MSZyLHU9dC5sZW5ndGgsYz1lLmxlbmd0aDtpZih1IT1jJiYhKGEmJmM+dSkpcmV0dXJuITE7dmFyIGw9cy5nZXQodCksaD1zLmdldChlKTtpZihsJiZoKXJldHVybiBsPT1lJiZoPT10O3ZhciBmPS0xLHA9ITAsZD0yJnI/bmV3IEtuOm47Zm9yKHMuc2V0KHQsZSkscy5zZXQoZSx0KTsrK2Y8dTspe3ZhciBnPXRbZl0seT1lW2ZdO2lmKGkpdmFyIG09YT9pKHksZyxmLGUsdCxzKTppKGcseSxmLHQsZSxzKTtpZihtIT09bil7aWYobSljb250aW51ZTtwPSExO2JyZWFrfWlmKGQpe2lmKCFqZShlLChmdW5jdGlvbih0LGUpe2lmKCFubihkLGUpJiYoZz09PXR8fG8oZyx0LHIsaSxzKSkpcmV0dXJuIGQucHVzaChlKX0pKSl7cD0hMTticmVha319ZWxzZSBpZihnIT09eSYmIW8oZyx5LHIsaSxzKSl7cD0hMTticmVha319cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLHB9ZnVuY3Rpb24gaW8odCl7cmV0dXJuIExvKElvKHQsbixXbyksdCsiIil9ZnVuY3Rpb24gb28odCl7cmV0dXJuIFNyKHQsT2EsZ28pfWZ1bmN0aW9uIHNvKHQpe3JldHVybiBTcih0LExhLHlvKX12YXIgYW89VG4/ZnVuY3Rpb24odCl7cmV0dXJuIFRuLmdldCh0KX06bHU7ZnVuY3Rpb24gdW8odCl7Zm9yKHZhciBlPXQubmFtZSsiIixuPU9uW2VdLHI9a3QuY2FsbChPbixlKT9uLmxlbmd0aDowO3ItLTspe3ZhciBpPW5bcl0sbz1pLmZ1bmM7aWYobnVsbD09b3x8bz09dClyZXR1cm4gaS5uYW1lfXJldHVybiBlfWZ1bmN0aW9uIGNvKHQpe3JldHVybihrdC5jYWxsKHFuLCJwbGFjZWhvbGRlciIpP3FuOnQpLnBsYWNlaG9sZGVyfWZ1bmN0aW9uIGxvKCl7dmFyIHQ9cW4uaXRlcmF0ZWV8fHN1O3JldHVybiB0PXQ9PT1zdT9Ccjp0LGFyZ3VtZW50cy5sZW5ndGg/dChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTp0fWZ1bmN0aW9uIGhvKHQsZSl7dmFyIG49dC5fX2RhdGFfXztyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH0oZSk/blsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpuLm1hcH1mdW5jdGlvbiBmbyh0KXtmb3IodmFyIGU9T2EodCksbj1lLmxlbmd0aDtuLS07KXt2YXIgcj1lW25dLGk9dFtyXTtlW25dPVtyLGksQW8oaSldfXJldHVybiBlfWZ1bmN0aW9uIHBvKHQsZSl7dmFyIHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD9uOnRbZV19KHQsZSk7cmV0dXJuIFJyKHIpP3I6bn12YXIgZ289eGU/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9SXQodCksT2UoeGUodCksKGZ1bmN0aW9uKGUpe3JldHVybiBKdC5jYWxsKHQsZSl9KSkpfTptdSx5bz14ZT9mdW5jdGlvbih0KXtmb3IodmFyIGU9W107dDspQmUoZSxnbyh0KSksdD1adCh0KTtyZXR1cm4gZX06bXUsbW89QXI7ZnVuY3Rpb24gdm8odCxlLG4pe2Zvcih2YXIgcj0tMSxpPShlPXdpKGUsdCkpLmxlbmd0aCxvPSExOysrcjxpOyl7dmFyIHM9em8oZVtyXSk7aWYoIShvPW51bGwhPXQmJm4odCxzKSkpYnJlYWs7dD10W3NdfXJldHVybiBvfHwrK3IhPWk/bzohIShpPW51bGw9PXQ/MDp0Lmxlbmd0aCkmJmVhKGkpJiZ3byhzLGkpJiYoWHModCl8fFlzKHQpKX1mdW5jdGlvbiBfbyh0KXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdC5jb25zdHJ1Y3Rvcnx8U28odCk/e306Vm4oWnQodCkpfWZ1bmN0aW9uIHhvKHQpe3JldHVybiBYcyh0KXx8WXModCl8fCEhKCR0JiZ0JiZ0WyR0XSl9ZnVuY3Rpb24gd28odCxlKXt2YXIgbj10eXBlb2YgdDtyZXR1cm4hIShlPW51bGw9PWU/ZjplKSYmKCJudW1iZXIiPT1ufHwic3ltYm9sIiE9biYmeHQudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfWZ1bmN0aW9uIGJvKHQsZSxuKXtpZighbmEobikpcmV0dXJuITE7dmFyIHI9dHlwZW9mIGU7cmV0dXJuISEoIm51bWJlciI9PXI/SHMobikmJndvKGUsbi5sZW5ndGgpOiJzdHJpbmciPT1yJiZlIGluIG4pJiZxcyhuW2VdLHQpfWZ1bmN0aW9uIERvKHQsZSl7aWYoWHModCkpcmV0dXJuITE7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9biYmInN5bWJvbCIhPW4mJiJib29sZWFuIiE9biYmbnVsbCE9dCYmIWxhKHQpKXx8KG50LnRlc3QodCl8fCFldC50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIEl0KGUpKX1mdW5jdGlvbiBFbyh0KXt2YXIgZT11byh0KSxuPXFuW2VdO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBufHwhKGUgaW4gWG4ucHJvdG90eXBlKSlyZXR1cm4hMTtpZih0PT09bilyZXR1cm4hMDt2YXIgcj1hbyhuKTtyZXR1cm4hIXImJnQ9PT1yWzBdfShTbiYmbW8obmV3IFNuKG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1QfHxBbiYmbW8obmV3IEFuKSE9Q3x8Tm4mJm1vKE5uLnJlc29sdmUoKSkhPU58fEluJiZtbyhuZXcgSW4pIT1NfHxNbiYmbW8obmV3IE1uKSE9TykmJihtbz1mdW5jdGlvbih0KXt2YXIgZT1Bcih0KSxyPWU9PUE/dC5jb25zdHJ1Y3RvcjpuLGk9cj9qbyhyKToiIjtpZihpKXN3aXRjaChpKXtjYXNlIExuOnJldHVybiBQO2Nhc2UgUG46cmV0dXJuIEM7Y2FzZSBSbjpyZXR1cm4gTjtjYXNlIEJuOnJldHVybiBNO2Nhc2Uga246cmV0dXJuIE99cmV0dXJuIGV9KTt2YXIgQ289UnQ/JHM6dnU7ZnVuY3Rpb24gU28odCl7dmFyIGU9dCYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4gdD09PSgiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5wcm90b3R5cGV8fFB0KX1mdW5jdGlvbiBBbyh0KXtyZXR1cm4gdD09dCYmIW5hKHQpfWZ1bmN0aW9uIE5vKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBudWxsIT1yJiYoclt0XT09PWUmJihlIT09bnx8dCBpbiBJdChyKSkpfX1mdW5jdGlvbiBJbyh0LGUscil7cmV0dXJuIGU9eG4oZT09PW4/dC5sZW5ndGgtMTplLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciBuPWFyZ3VtZW50cyxpPS0xLG89eG4obi5sZW5ndGgtZSwwKSxzPUV0KG8pOysraTxvOylzW2ldPW5bZStpXTtpPS0xO2Zvcih2YXIgYT1FdChlKzEpOysraTxlOylhW2ldPW5baV07cmV0dXJuIGFbZV09cihzKSxOZSh0LHRoaXMsYSl9fWZ1bmN0aW9uIE1vKHQsZSl7cmV0dXJuIGUubGVuZ3RoPDI/dDpDcih0LG9pKGUsMCwtMSkpfWZ1bmN0aW9uIEZvKHQsZSl7aWYoKCJjb25zdHJ1Y3RvciIhPT1lfHwiZnVuY3Rpb24iIT10eXBlb2YgdFtlXSkmJiJfX3Byb3RvX18iIT1lKXJldHVybiB0W2VdfXZhciBUbz1SbyhuaSksT289Z2V8fGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHllLnNldFRpbWVvdXQodCxlKX0sTG89Um8ocmkpO2Z1bmN0aW9uIFBvKHQsZSxuKXt2YXIgcj1lKyIiO3JldHVybiBMbyh0LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5sZW5ndGg7aWYoIW4pcmV0dXJuIHQ7dmFyIHI9bi0xO3JldHVybiBlW3JdPShuPjE/IiYgIjoiIikrZVtyXSxlPWUuam9pbihuPjI/IiwgIjoiICIpLHQucmVwbGFjZSh1dCwie1xuLyogW3dyYXBwZWQgd2l0aCAiK2UrIl0gKi9cbiIpfShyLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1lKG0sKGZ1bmN0aW9uKG4pe3ZhciByPSJfLiIrblswXTtlJm5bMV0mJiFMZSh0LHIpJiZ0LnB1c2gocil9KSksdC5zb3J0KCl9KGZ1bmN0aW9uKHQpe3ZhciBlPXQubWF0Y2goY3QpO3JldHVybiBlP2VbMV0uc3BsaXQobHQpOltdfShyKSxuKSkpfWZ1bmN0aW9uIFJvKHQpe3ZhciBlPTAscj0wO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPWJuKCksbz0xNi0oaS1yKTtpZihyPWksbz4wKXtpZigrK2U+PTgwMClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KG4sYXJndW1lbnRzKX19ZnVuY3Rpb24gQm8odCxlKXt2YXIgcj0tMSxpPXQubGVuZ3RoLG89aS0xO2ZvcihlPWU9PT1uP2k6ZTsrK3I8ZTspe3ZhciBzPUtyKHIsbyksYT10W3NdO3Rbc109dFtyXSx0W3JdPWF9cmV0dXJuIHQubGVuZ3RoPWUsdH12YXIga289ZnVuY3Rpb24odCl7dmFyIGU9UnModCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PW4uc2l6ZSYmbi5jbGVhcigpLHR9KSksbj1lLmNhY2hlO3JldHVybiBlfSgoZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIDQ2PT09dC5jaGFyQ29kZUF0KDApJiZlLnB1c2goIiIpLHQucmVwbGFjZShydCwoZnVuY3Rpb24odCxuLHIsaSl7ZS5wdXNoKHI/aS5yZXBsYWNlKHB0LCIkMSIpOm58fHQpfSkpLGV9KSk7ZnVuY3Rpb24gem8odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxsYSh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0taD8iLTAiOmV9ZnVuY3Rpb24gam8odCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBCdC5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn1mdW5jdGlvbiBVbyh0KXtpZih0IGluc3RhbmNlb2YgWG4pcmV0dXJuIHQuY2xvbmUoKTt2YXIgZT1uZXcgWW4odC5fX3dyYXBwZWRfXyx0Ll9fY2hhaW5fXyk7cmV0dXJuIGUuX19hY3Rpb25zX189RmkodC5fX2FjdGlvbnNfXyksZS5fX2luZGV4X189dC5fX2luZGV4X18sZS5fX3ZhbHVlc19fPXQuX192YWx1ZXNfXyxlfXZhciBxbz1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gWnModCk/cHIodCxfcihlLDEsWnMsITApKTpbXX0pKSxWbz1RcigoZnVuY3Rpb24odCxlKXt2YXIgcj1RbyhlKTtyZXR1cm4gWnMocikmJihyPW4pLFpzKHQpP3ByKHQsX3IoZSwxLFpzLCEwKSxsbyhyLDIpKTpbXX0pKSxHbz1RcigoZnVuY3Rpb24odCxlKXt2YXIgcj1RbyhlKTtyZXR1cm4gWnMocikmJihyPW4pLFpzKHQpP3ByKHQsX3IoZSwxLFpzLCEwKSxuLHIpOltdfSkpO2Z1bmN0aW9uIFlvKHQsZSxuKXt2YXIgcj1udWxsPT10PzA6dC5sZW5ndGg7aWYoIXIpcmV0dXJuLTE7dmFyIGk9bnVsbD09bj8wOnlhKG4pO3JldHVybiBpPDAmJihpPXhuKHIraSwwKSksVmUodCxsbyhlLDMpLGkpfWZ1bmN0aW9uIFhvKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7aWYoIWkpcmV0dXJuLTE7dmFyIG89aS0xO3JldHVybiByIT09biYmKG89eWEociksbz1yPDA/eG4oaStvLDApOnduKG8saS0xKSksVmUodCxsbyhlLDMpLG8sITApfWZ1bmN0aW9uIFdvKHQpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP19yKHQsMSk6W119ZnVuY3Rpb24gSG8odCl7cmV0dXJuIHQmJnQubGVuZ3RoP3RbMF06bn12YXIgWm89UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVJlKHQsX2kpO3JldHVybiBlLmxlbmd0aCYmZVswXT09PXRbMF0/RnIoZSk6W119KSksS289UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpLHI9UmUodCxfaSk7cmV0dXJuIGU9PT1RbyhyKT9lPW46ci5wb3AoKSxyLmxlbmd0aCYmclswXT09PXRbMF0/RnIocixsbyhlLDIpKTpbXX0pKSxKbz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCkscj1SZSh0LF9pKTtyZXR1cm4oZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4pJiZyLnBvcCgpLHIubGVuZ3RoJiZyWzBdPT09dFswXT9GcihyLG4sZSk6W119KSk7ZnVuY3Rpb24gUW8odCl7dmFyIGU9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBlP3RbZS0xXTpufXZhciAkbz1Rcih0cyk7ZnVuY3Rpb24gdHModCxlKXtyZXR1cm4gdCYmdC5sZW5ndGgmJmUmJmUubGVuZ3RoP0hyKHQsZSk6dH12YXIgZXM9aW8oKGZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbD09dD8wOnQubGVuZ3RoLHI9dXIodCxlKTtyZXR1cm4gWnIodCxSZShlLChmdW5jdGlvbih0KXtyZXR1cm4gd28odCxuKT8rdDp0fSkpLnNvcnQoTmkpKSxyfSkpO2Z1bmN0aW9uIG5zKHQpe3JldHVybiBudWxsPT10P3Q6Q24uY2FsbCh0KX12YXIgcnM9UXIoKGZ1bmN0aW9uKHQpe3JldHVybiBmaShfcih0LDEsWnMsITApKX0pKSxpcz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCk7cmV0dXJuIFpzKGUpJiYoZT1uKSxmaShfcih0LDEsWnMsITApLGxvKGUsMikpfSkpLG9zPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KTtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4sZmkoX3IodCwxLFpzLCEwKSxuLGUpfSkpO2Z1bmN0aW9uIHNzKHQpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuW107dmFyIGU9MDtyZXR1cm4gdD1PZSh0LChmdW5jdGlvbih0KXtpZihacyh0KSlyZXR1cm4gZT14bih0Lmxlbmd0aCxlKSwhMH0pKSxRZShlLChmdW5jdGlvbihlKXtyZXR1cm4gUmUodCxIZShlKSl9KSl9ZnVuY3Rpb24gYXModCxlKXtpZighdHx8IXQubGVuZ3RoKXJldHVybltdO3ZhciByPXNzKHQpO3JldHVybiBudWxsPT1lP3I6UmUociwoZnVuY3Rpb24odCl7cmV0dXJuIE5lKGUsbix0KX0pKX12YXIgdXM9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFpzKHQpP3ByKHQsZSk6W119KSksY3M9UXIoKGZ1bmN0aW9uKHQpe3JldHVybiBtaShPZSh0LFpzKSl9KSksbHM9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpO3JldHVybiBacyhlKSYmKGU9biksbWkoT2UodCxacyksbG8oZSwyKSl9KSksaHM9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpO3JldHVybiBlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bixtaShPZSh0LFpzKSxuLGUpfSkpLGZzPVFyKHNzKTt2YXIgcHM9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoLHI9ZT4xP3RbZS0xXTpuO3JldHVybiByPSJmdW5jdGlvbiI9PXR5cGVvZiByPyh0LnBvcCgpLHIpOm4sYXModCxyKX0pKTtmdW5jdGlvbiBkcyh0KXt2YXIgZT1xbih0KTtyZXR1cm4gZS5fX2NoYWluX189ITAsZX1mdW5jdGlvbiBncyh0LGUpe3JldHVybiBlKHQpfXZhciB5cz1pbygoZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgscj1lP3RbMF06MCxpPXRoaXMuX193cmFwcGVkX18sbz1mdW5jdGlvbihlKXtyZXR1cm4gdXIoZSx0KX07cmV0dXJuIShlPjF8fHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKSYmaSBpbnN0YW5jZW9mIFhuJiZ3byhyKT8oKGk9aS5zbGljZShyLCtyKyhlPzE6MCkpKS5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOmdzLGFyZ3M6W29dLHRoaXNBcmc6bn0pLG5ldyBZbihpLHRoaXMuX19jaGFpbl9fKS50aHJ1KChmdW5jdGlvbih0KXtyZXR1cm4gZSYmIXQubGVuZ3RoJiZ0LnB1c2gobiksdH0pKSk6dGhpcy50aHJ1KG8pfSkpO3ZhciBtcz1PaSgoZnVuY3Rpb24odCxlLG4pe2t0LmNhbGwodCxuKT8rK3Rbbl06YXIodCxuLDEpfSkpO3ZhciB2cz1qaShZbyksX3M9amkoWG8pO2Z1bmN0aW9uIHhzKHQsZSl7cmV0dXJuKFhzKHQpP01lOmRyKSh0LGxvKGUsMykpfWZ1bmN0aW9uIHdzKHQsZSl7cmV0dXJuKFhzKHQpP0ZlOmdyKSh0LGxvKGUsMykpfXZhciBicz1PaSgoZnVuY3Rpb24odCxlLG4pe2t0LmNhbGwodCxuKT90W25dLnB1c2goZSk6YXIodCxuLFtlXSl9KSk7dmFyIERzPVFyKChmdW5jdGlvbih0LGUsbil7dmFyIHI9LTEsaT0iZnVuY3Rpb24iPT10eXBlb2YgZSxvPUhzKHQpP0V0KHQubGVuZ3RoKTpbXTtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCl7b1srK3JdPWk/TmUoZSx0LG4pOlRyKHQsZSxuKX0pKSxvfSkpLEVzPU9pKChmdW5jdGlvbih0LGUsbil7YXIodCxuLGUpfSkpO2Z1bmN0aW9uIENzKHQsZSl7cmV0dXJuKFhzKHQpP1JlOlVyKSh0LGxvKGUsMykpfXZhciBTcz1PaSgoZnVuY3Rpb24odCxlLG4pe3Rbbj8wOjFdLnB1c2goZSl9KSwoZnVuY3Rpb24oKXtyZXR1cm5bW10sW11dfSkpO3ZhciBBcz1RcigoZnVuY3Rpb24odCxlKXtpZihudWxsPT10KXJldHVybltdO3ZhciBuPWUubGVuZ3RoO3JldHVybiBuPjEmJmJvKHQsZVswXSxlWzFdKT9lPVtdOm4+MiYmYm8oZVswXSxlWzFdLGVbMl0pJiYoZT1bZVswXV0pLFhyKHQsX3IoZSwxKSxbXSl9KSksTnM9ZGV8fGZ1bmN0aW9uKCl7cmV0dXJuIHllLkRhdGUubm93KCl9O2Z1bmN0aW9uIElzKHQsZSxyKXtyZXR1cm4gZT1yP246ZSxlPXQmJm51bGw9PWU/dC5sZW5ndGg6ZSwkaSh0LGMsbixuLG4sbixlKX1mdW5jdGlvbiBNcyh0LGUpe3ZhciBpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUdChyKTtyZXR1cm4gdD15YSh0KSxmdW5jdGlvbigpe3JldHVybi0tdD4wJiYoaT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdDw9MSYmKGU9biksaX19dmFyIEZzPVFyKChmdW5jdGlvbih0LGUsbil7dmFyIHI9MTtpZihuLmxlbmd0aCl7dmFyIGk9Zm4obixjbyhGcykpO3J8PWF9cmV0dXJuICRpKHQscixlLG4saSl9KSksVHM9UXIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0zO2lmKG4ubGVuZ3RoKXt2YXIgaT1mbihuLGNvKFRzKSk7cnw9YX1yZXR1cm4gJGkoZSxyLHQsbixpKX0pKTtmdW5jdGlvbiBPcyh0LGUsaSl7dmFyIG8scyxhLHUsYyxsLGg9MCxmPSExLHA9ITEsZD0hMDtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7ZnVuY3Rpb24gZyhlKXt2YXIgcj1vLGk9cztyZXR1cm4gbz1zPW4saD1lLHU9dC5hcHBseShpLHIpfWZ1bmN0aW9uIHkodCl7dmFyIHI9dC1sO3JldHVybiBsPT09bnx8cj49ZXx8cjwwfHxwJiZ0LWg+PWF9ZnVuY3Rpb24gbSgpe3ZhciB0PU5zKCk7aWYoeSh0KSlyZXR1cm4gdih0KTtjPU9vKG0sZnVuY3Rpb24odCl7dmFyIG49ZS0odC1sKTtyZXR1cm4gcD93bihuLGEtKHQtaCkpOm59KHQpKX1mdW5jdGlvbiB2KHQpe3JldHVybiBjPW4sZCYmbz9nKHQpOihvPXM9bix1KX1mdW5jdGlvbiBfKCl7dmFyIHQ9TnMoKSxyPXkodCk7aWYobz1hcmd1bWVudHMscz10aGlzLGw9dCxyKXtpZihjPT09bilyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGg9dCxjPU9vKG0sZSksZj9nKHQpOnV9KGwpO2lmKHApcmV0dXJuIEVpKGMpLGM9T28obSxlKSxnKGwpfXJldHVybiBjPT09biYmKGM9T28obSxlKSksdX1yZXR1cm4gZT12YShlKXx8MCxuYShpKSYmKGY9ISFpLmxlYWRpbmcsYT0ocD0ibWF4V2FpdCJpbiBpKT94bih2YShpLm1heFdhaXQpfHwwLGUpOmEsZD0idHJhaWxpbmciaW4gaT8hIWkudHJhaWxpbmc6ZCksXy5jYW5jZWw9ZnVuY3Rpb24oKXtjIT09biYmRWkoYyksaD0wLG89bD1zPWM9bn0sXy5mbHVzaD1mdW5jdGlvbigpe3JldHVybiBjPT09bj91OnYoTnMoKSl9LF99dmFyIExzPVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBmcih0LDEsZSl9KSksUHM9UXIoKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZnIodCx2YShlKXx8MCxuKX0pKTtmdW5jdGlvbiBScyh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHxudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHQocik7dmFyIG49ZnVuY3Rpb24oKXt2YXIgcj1hcmd1bWVudHMsaT1lP2UuYXBwbHkodGhpcyxyKTpyWzBdLG89bi5jYWNoZTtpZihvLmhhcyhpKSlyZXR1cm4gby5nZXQoaSk7dmFyIHM9dC5hcHBseSh0aGlzLHIpO3JldHVybiBuLmNhY2hlPW8uc2V0KGkscyl8fG8sc307cmV0dXJuIG4uY2FjaGU9bmV3KFJzLkNhY2hlfHxabiksbn1mdW5jdGlvbiBCcyh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnJldHVybiF0LmNhbGwodGhpcyk7Y2FzZSAxOnJldHVybiF0LmNhbGwodGhpcyxlWzBdKTtjYXNlIDI6cmV0dXJuIXQuY2FsbCh0aGlzLGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiF0LmNhbGwodGhpcyxlWzBdLGVbMV0sZVsyXSl9cmV0dXJuIXQuYXBwbHkodGhpcyxlKX19UnMuQ2FjaGU9Wm47dmFyIGtzPWJpKChmdW5jdGlvbih0LGUpe3ZhciBuPShlPTE9PWUubGVuZ3RoJiZYcyhlWzBdKT9SZShlWzBdLHRuKGxvKCkpKTpSZShfcihlLDEpLHRuKGxvKCkpKSkubGVuZ3RoO3JldHVybiBRcigoZnVuY3Rpb24ocil7Zm9yKHZhciBpPS0xLG89d24oci5sZW5ndGgsbik7KytpPG87KXJbaV09ZVtpXS5jYWxsKHRoaXMscltpXSk7cmV0dXJuIE5lKHQsdGhpcyxyKX0pKX0pKSx6cz1RcigoZnVuY3Rpb24odCxlKXt2YXIgcj1mbihlLGNvKHpzKSk7cmV0dXJuICRpKHQsYSxuLGUscil9KSksanM9UXIoKGZ1bmN0aW9uKHQsZSl7dmFyIHI9Zm4oZSxjbyhqcykpO3JldHVybiAkaSh0LHUsbixlLHIpfSkpLFVzPWlvKChmdW5jdGlvbih0LGUpe3JldHVybiAkaSh0LGwsbixuLG4sZSl9KSk7ZnVuY3Rpb24gcXModCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9dmFyIFZzPUhpKE5yKSxHcz1IaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdD49ZX0pKSxZcz1PcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP09yOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYma3QuY2FsbCh0LCJjYWxsZWUiKSYmIUp0LmNhbGwodCwiY2FsbGVlIil9LFhzPUV0LmlzQXJyYXksV3M9YmU/dG4oYmUpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmQXIodCk9PUx9O2Z1bmN0aW9uIEhzKHQpe3JldHVybiBudWxsIT10JiZlYSh0Lmxlbmd0aCkmJiEkcyh0KX1mdW5jdGlvbiBacyh0KXtyZXR1cm4gcmEodCkmJkhzKHQpfXZhciBLcz13ZXx8dnUsSnM9RGU/dG4oRGUpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmQXIodCk9PXd9O2Z1bmN0aW9uIFFzKHQpe2lmKCFyYSh0KSlyZXR1cm4hMTt2YXIgZT1Bcih0KTtyZXR1cm4gZT09Ynx8IltvYmplY3QgRE9NRXhjZXB0aW9uXSI9PWV8fCJzdHJpbmciPT10eXBlb2YgdC5tZXNzYWdlJiYic3RyaW5nIj09dHlwZW9mIHQubmFtZSYmIXNhKHQpfWZ1bmN0aW9uICRzKHQpe2lmKCFuYSh0KSlyZXR1cm4hMTt2YXIgZT1Bcih0KTtyZXR1cm4gZT09RHx8ZT09RXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfWZ1bmN0aW9uIHRhKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD09eWEodCl9ZnVuY3Rpb24gZWEodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PWZ9ZnVuY3Rpb24gbmEodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9ZnVuY3Rpb24gcmEodCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH12YXIgaWE9RWU/dG4oRWUpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmbW8odCk9PUN9O2Z1bmN0aW9uIG9hKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8cmEodCkmJkFyKHQpPT1TfWZ1bmN0aW9uIHNhKHQpe2lmKCFyYSh0KXx8QXIodCkhPUEpcmV0dXJuITE7dmFyIGU9WnQodCk7aWYobnVsbD09PWUpcmV0dXJuITA7dmFyIG49a3QuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuIGluc3RhbmNlb2YgbiYmQnQuY2FsbChuKT09cXR9dmFyIGFhPUNlP3RuKENlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJkFyKHQpPT1JfTt2YXIgdWE9U2U/dG4oU2UpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmbW8odCk9PU19O2Z1bmN0aW9uIGNhKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdHx8IVhzKHQpJiZyYSh0KSYmQXIodCk9PUZ9ZnVuY3Rpb24gbGEodCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxyYSh0KSYmQXIodCk9PVR9dmFyIGhhPUFlP3RuKEFlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJmVhKHQubGVuZ3RoKSYmISFjZVtBcih0KV19O3ZhciBmYT1IaShqcikscGE9SGkoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8PWV9KSk7ZnVuY3Rpb24gZGEodCl7aWYoIXQpcmV0dXJuW107aWYoSHModCkpcmV0dXJuIGNhKHQpP2duKHQpOkZpKHQpO2lmKHRlJiZ0W3RlXSlyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49W107IShlPXQubmV4dCgpKS5kb25lOyluLnB1c2goZS52YWx1ZSk7cmV0dXJuIG59KHRbdGVdKCkpO3ZhciBlPW1vKHQpO3JldHVybihlPT1DP2xuOmU9PU0/cG46cWEpKHQpfWZ1bmN0aW9uIGdhKHQpe3JldHVybiB0Pyh0PXZhKHQpKT09PWh8fHQ9PT0taD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9ZnVuY3Rpb24geWEodCl7dmFyIGU9Z2EodCksbj1lJTE7cmV0dXJuIGU9PWU/bj9lLW46ZTowfWZ1bmN0aW9uIG1hKHQpe3JldHVybiB0P2NyKHlhKHQpLDAsZCk6MH1mdW5jdGlvbiB2YSh0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYobGEodCkpcmV0dXJuIHA7aWYobmEodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PW5hKGUpP2UrIiI6ZX1pZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIDA9PT10P3Q6K3Q7dD0kZSh0KTt2YXIgbj1tdC50ZXN0KHQpO3JldHVybiBufHxfdC50ZXN0KHQpP3BlKHQuc2xpY2UoMiksbj8yOjgpOnl0LnRlc3QodCk/cDordH1mdW5jdGlvbiBfYSh0KXtyZXR1cm4gVGkodCxMYSh0KSl9ZnVuY3Rpb24geGEodCl7cmV0dXJuIG51bGw9PXQ/IiI6aGkodCl9dmFyIHdhPUxpKChmdW5jdGlvbih0LGUpe2lmKFNvKGUpfHxIcyhlKSlUaShlLE9hKGUpLHQpO2Vsc2UgZm9yKHZhciBuIGluIGUpa3QuY2FsbChlLG4pJiZycih0LG4sZVtuXSl9KSksYmE9TGkoKGZ1bmN0aW9uKHQsZSl7VGkoZSxMYShlKSx0KX0pKSxEYT1MaSgoZnVuY3Rpb24odCxlLG4scil7VGkoZSxMYShlKSx0LHIpfSkpLEVhPUxpKChmdW5jdGlvbih0LGUsbixyKXtUaShlLE9hKGUpLHQscil9KSksQ2E9aW8odXIpO3ZhciBTYT1RcigoZnVuY3Rpb24odCxlKXt0PUl0KHQpO3ZhciByPS0xLGk9ZS5sZW5ndGgsbz1pPjI/ZVsyXTpuO2ZvcihvJiZibyhlWzBdLGVbMV0sbykmJihpPTEpOysrcjxpOylmb3IodmFyIHM9ZVtyXSxhPUxhKHMpLHU9LTEsYz1hLmxlbmd0aDsrK3U8Yzspe3ZhciBsPWFbdV0saD10W2xdOyhoPT09bnx8cXMoaCxQdFtsXSkmJiFrdC5jYWxsKHQsbCkpJiYodFtsXT1zW2xdKX1yZXR1cm4gdH0pKSxBYT1RcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucHVzaChuLGVvKSxOZShSYSxuLHQpfSkpO2Z1bmN0aW9uIE5hKHQsZSxyKXt2YXIgaT1udWxsPT10P246Q3IodCxlKTtyZXR1cm4gaT09PW4/cjppfWZ1bmN0aW9uIElhKHQsZSl7cmV0dXJuIG51bGwhPXQmJnZvKHQsZSxNcil9dmFyIE1hPVZpKChmdW5jdGlvbih0LGUsbil7bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUudG9TdHJpbmcmJihlPVV0LmNhbGwoZSkpLHRbZV09bn0pLG51KG91KSksRmE9VmkoKGZ1bmN0aW9uKHQsZSxuKXtudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZyYmKGU9VXQuY2FsbChlKSksa3QuY2FsbCh0LGUpP3RbZV0ucHVzaChuKTp0W2VdPVtuXX0pLGxvKSxUYT1RcihUcik7ZnVuY3Rpb24gT2EodCl7cmV0dXJuIEhzKHQpP1FuKHQpOmtyKHQpfWZ1bmN0aW9uIExhKHQpe3JldHVybiBIcyh0KT9Rbih0LCEwKTp6cih0KX12YXIgUGE9TGkoKGZ1bmN0aW9uKHQsZSxuKXtHcih0LGUsbil9KSksUmE9TGkoKGZ1bmN0aW9uKHQsZSxuLHIpe0dyKHQsZSxuLHIpfSkpLEJhPWlvKChmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2lmKG51bGw9PXQpcmV0dXJuIG47dmFyIHI9ITE7ZT1SZShlLChmdW5jdGlvbihlKXtyZXR1cm4gZT13aShlLHQpLHJ8fChyPWUubGVuZ3RoPjEpLGV9KSksVGkodCxzbyh0KSxuKSxyJiYobj1scihuLDcsbm8pKTtmb3IodmFyIGk9ZS5sZW5ndGg7aS0tOylwaShuLGVbaV0pO3JldHVybiBufSkpO3ZhciBrYT1pbygoZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD97fTpmdW5jdGlvbih0LGUpe3JldHVybiBXcih0LGUsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIElhKHQsbil9KSl9KHQsZSl9KSk7ZnVuY3Rpb24gemEodCxlKXtpZihudWxsPT10KXJldHVybnt9O3ZhciBuPVJlKHNvKHQpLChmdW5jdGlvbih0KXtyZXR1cm5bdF19KSk7cmV0dXJuIGU9bG8oZSksV3IodCxuLChmdW5jdGlvbih0LG4pe3JldHVybiBlKHQsblswXSl9KSl9dmFyIGphPVFpKE9hKSxVYT1RaShMYSk7ZnVuY3Rpb24gcWEodCl7cmV0dXJuIG51bGw9PXQ/W106ZW4odCxPYSh0KSl9dmFyIFZhPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIGU9ZS50b0xvd2VyQ2FzZSgpLHQrKG4/R2EoZSk6ZSl9KSk7ZnVuY3Rpb24gR2EodCl7cmV0dXJuIFFhKHhhKHQpLnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIFlhKHQpe3JldHVybih0PXhhKHQpKSYmdC5yZXBsYWNlKHd0LHNuKS5yZXBsYWNlKG5lLCIiKX12YXIgWGE9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iLSI6IiIpK2UudG9Mb3dlckNhc2UoKX0pKSxXYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyIgIjoiIikrZS50b0xvd2VyQ2FzZSgpfSkpLEhhPUJpKCJ0b0xvd2VyQ2FzZSIpO3ZhciBaYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyJfIjoiIikrZS50b0xvd2VyQ2FzZSgpfSkpO3ZhciBLYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyIgIjoiIikrUWEoZSl9KSk7dmFyIEphPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/IiAiOiIiKStlLnRvVXBwZXJDYXNlKCl9KSksUWE9QmkoInRvVXBwZXJDYXNlIik7ZnVuY3Rpb24gJGEodCxlLHIpe3JldHVybiB0PXhhKHQpLChlPXI/bjplKT09PW4/ZnVuY3Rpb24odCl7cmV0dXJuIHNlLnRlc3QodCl9KHQpP2Z1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoKGllKXx8W119KHQpOmZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoKGh0KXx8W119KHQpOnQubWF0Y2goZSl8fFtdfXZhciB0dT1RcigoZnVuY3Rpb24odCxlKXt0cnl7cmV0dXJuIE5lKHQsbixlKX1jYXRjaCh0KXtyZXR1cm4gUXModCk/dDpuZXcgU3QodCl9fSkpLGV1PWlvKChmdW5jdGlvbih0LGUpe3JldHVybiBNZShlLChmdW5jdGlvbihlKXtlPXpvKGUpLGFyKHQsZSxGcyh0W2VdLHQpKX0pKSx0fSkpO2Z1bmN0aW9uIG51KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX12YXIgcnU9VWkoKSxpdT1VaSghMCk7ZnVuY3Rpb24gb3UodCl7cmV0dXJuIHR9ZnVuY3Rpb24gc3UodCl7cmV0dXJuIEJyKCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bHIodCwxKSl9dmFyIGF1PVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gVHIobix0LGUpfX0pKSx1dT1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIFRyKHQsbixlKX19KSk7ZnVuY3Rpb24gY3UodCxlLG4pe3ZhciByPU9hKGUpLGk9RXIoZSxyKTtudWxsPT1uJiYoIW5hKGUpfHwhaS5sZW5ndGgmJnIubGVuZ3RoKSYmKG49ZSxlPXQsdD10aGlzLGk9RXIoZSxPYShlKSkpO3ZhciBvPSEobmEobikmJiJjaGFpbiJpbiBuJiYhbi5jaGFpbikscz0kcyh0KTtyZXR1cm4gTWUoaSwoZnVuY3Rpb24obil7dmFyIHI9ZVtuXTt0W25dPXIscyYmKHQucHJvdG90eXBlW25dPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX2NoYWluX187aWYob3x8ZSl7dmFyIG49dCh0aGlzLl9fd3JhcHBlZF9fKTtyZXR1cm4obi5fX2FjdGlvbnNfXz1GaSh0aGlzLl9fYWN0aW9uc19fKSkucHVzaCh7ZnVuYzpyLGFyZ3M6YXJndW1lbnRzLHRoaXNBcmc6dH0pLG4uX19jaGFpbl9fPWUsbn1yZXR1cm4gci5hcHBseSh0LEJlKFt0aGlzLnZhbHVlKCldLGFyZ3VtZW50cykpfSl9KSksdH1mdW5jdGlvbiBsdSgpe312YXIgaHU9WWkoUmUpLGZ1PVlpKFRlKSxwdT1ZaShqZSk7ZnVuY3Rpb24gZHUodCl7cmV0dXJuIERvKHQpP0hlKHpvKHQpKTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIENyKGUsdCl9fSh0KX12YXIgZ3U9V2koKSx5dT1XaSghMCk7ZnVuY3Rpb24gbXUoKXtyZXR1cm5bXX1mdW5jdGlvbiB2dSgpe3JldHVybiExfXZhciBfdT1HaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlfSksMCkseHU9S2koImNlaWwiKSx3dT1HaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC9lfSksMSksYnU9S2koImZsb29yIik7dmFyIER1PUdpKChmdW5jdGlvbih0LGUpe3JldHVybiB0KmV9KSwxKSxFdT1LaSgicm91bmQiKSxDdT1HaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSksMCk7cmV0dXJuIHFuLmFmdGVyPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR0KHIpO3JldHVybiB0PXlhKHQpLGZ1bmN0aW9uKCl7aWYoLS10PDEpcmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0scW4uYXJ5PUlzLHFuLmFzc2lnbj13YSxxbi5hc3NpZ25Jbj1iYSxxbi5hc3NpZ25JbldpdGg9RGEscW4uYXNzaWduV2l0aD1FYSxxbi5hdD1DYSxxbi5iZWZvcmU9TXMscW4uYmluZD1Gcyxxbi5iaW5kQWxsPWV1LHFuLmJpbmRLZXk9VHMscW4uY2FzdEFycmF5PWZ1bmN0aW9uKCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW107dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBYcyh0KT90Olt0XX0scW4uY2hhaW49ZHMscW4uY2h1bms9ZnVuY3Rpb24odCxlLHIpe2U9KHI/Ym8odCxlLHIpOmU9PT1uKT8xOnhuKHlhKGUpLDApO3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaXx8ZTwxKXJldHVybltdO2Zvcih2YXIgbz0wLHM9MCxhPUV0KG1lKGkvZSkpO288aTspYVtzKytdPW9pKHQsbyxvKz1lKTtyZXR1cm4gYX0scW4uY29tcGFjdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgscj0wLGk9W107KytlPG47KXt2YXIgbz10W2VdO28mJihpW3IrK109byl9cmV0dXJuIGl9LHFuLmNvbmNhdD1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg7aWYoIXQpcmV0dXJuW107Zm9yKHZhciBlPUV0KHQtMSksbj1hcmd1bWVudHNbMF0scj10O3ItLTspZVtyLTFdPWFyZ3VtZW50c1tyXTtyZXR1cm4gQmUoWHMobik/Rmkobik6W25dLF9yKGUsMSkpfSxxbi5jb25kPWZ1bmN0aW9uKHQpe3ZhciBlPW51bGw9PXQ/MDp0Lmxlbmd0aCxuPWxvKCk7cmV0dXJuIHQ9ZT9SZSh0LChmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdFsxXSl0aHJvdyBuZXcgVHQocik7cmV0dXJuW24odFswXSksdFsxXV19KSk6W10sUXIoKGZ1bmN0aW9uKG4pe2Zvcih2YXIgcj0tMTsrK3I8ZTspe3ZhciBpPXRbcl07aWYoTmUoaVswXSx0aGlzLG4pKXJldHVybiBOZShpWzFdLHRoaXMsbil9fSkpfSxxbi5jb25mb3Jtcz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9T2EodCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBocihuLHQsZSl9fShscih0LDEpKX0scW4uY29uc3RhbnQ9bnUscW4uY291bnRCeT1tcyxxbi5jcmVhdGU9ZnVuY3Rpb24odCxlKXt2YXIgbj1Wbih0KTtyZXR1cm4gbnVsbD09ZT9uOnNyKG4sZSl9LHFuLmN1cnJ5PWZ1bmN0aW9uIHQoZSxyLGkpe3ZhciBvPSRpKGUsOCxuLG4sbixuLG4scj1pP246cik7cmV0dXJuIG8ucGxhY2Vob2xkZXI9dC5wbGFjZWhvbGRlcixvfSxxbi5jdXJyeVJpZ2h0PWZ1bmN0aW9uIHQoZSxyLGkpe3ZhciBvPSRpKGUscyxuLG4sbixuLG4scj1pP246cik7cmV0dXJuIG8ucGxhY2Vob2xkZXI9dC5wbGFjZWhvbGRlcixvfSxxbi5kZWJvdW5jZT1Pcyxxbi5kZWZhdWx0cz1TYSxxbi5kZWZhdWx0c0RlZXA9QWEscW4uZGVmZXI9THMscW4uZGVsYXk9UHMscW4uZGlmZmVyZW5jZT1xbyxxbi5kaWZmZXJlbmNlQnk9Vm8scW4uZGlmZmVyZW5jZVdpdGg9R28scW4uZHJvcD1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBpP29pKHQsKGU9cnx8ZT09PW4/MTp5YShlKSk8MD8wOmUsaSk6W119LHFuLmRyb3BSaWdodD1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBpP29pKHQsMCwoZT1pLShlPXJ8fGU9PT1uPzE6eWEoZSkpKTwwPzA6ZSk6W119LHFuLmRyb3BSaWdodFdoaWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2dpKHQsbG8oZSwzKSwhMCwhMCk6W119LHFuLmRyb3BXaGlsZT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9naSh0LGxvKGUsMyksITApOltdfSxxbi5maWxsPWZ1bmN0aW9uKHQsZSxyLGkpe3ZhciBvPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gbz8ociYmIm51bWJlciIhPXR5cGVvZiByJiZibyh0LGUscikmJihyPTAsaT1vKSxmdW5jdGlvbih0LGUscixpKXt2YXIgbz10Lmxlbmd0aDtmb3IoKHI9eWEocikpPDAmJihyPS1yPm8/MDpvK3IpLChpPWk9PT1ufHxpPm8/bzp5YShpKSk8MCYmKGkrPW8pLGk9cj5pPzA6bWEoaSk7cjxpOyl0W3IrK109ZTtyZXR1cm4gdH0odCxlLHIsaSkpOltdfSxxbi5maWx0ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4oWHModCk/T2U6dnIpKHQsbG8oZSwzKSl9LHFuLmZsYXRNYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gX3IoQ3ModCxlKSwxKX0scW4uZmxhdE1hcERlZXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gX3IoQ3ModCxlKSxoKX0scW4uZmxhdE1hcERlcHRoPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcj1yPT09bj8xOnlhKHIpLF9yKENzKHQsZSkscil9LHFuLmZsYXR0ZW49V28scW4uZmxhdHRlbkRlZXA9ZnVuY3Rpb24odCl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/X3IodCxoKTpbXX0scW4uZmxhdHRlbkRlcHRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/X3IodCxlPWU9PT1uPzE6eWEoZSkpOltdfSxxbi5mbGlwPWZ1bmN0aW9uKHQpe3JldHVybiAkaSh0LDUxMil9LHFuLmZsb3c9cnUscW4uZmxvd1JpZ2h0PWl1LHFuLmZyb21QYWlycz1mdW5jdGlvbih0KXtmb3IodmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgscj17fTsrK2U8bjspe3ZhciBpPXRbZV07cltpWzBdXT1pWzFdfXJldHVybiByfSxxbi5mdW5jdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106RXIodCxPYSh0KSl9LHFuLmZ1bmN0aW9uc0luPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOkVyKHQsTGEodCkpfSxxbi5ncm91cEJ5PWJzLHFuLmluaXRpYWw9ZnVuY3Rpb24odCl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/b2kodCwwLC0xKTpbXX0scW4uaW50ZXJzZWN0aW9uPVpvLHFuLmludGVyc2VjdGlvbkJ5PUtvLHFuLmludGVyc2VjdGlvbldpdGg9Sm8scW4uaW52ZXJ0PU1hLHFuLmludmVydEJ5PUZhLHFuLmludm9rZU1hcD1Ecyxxbi5pdGVyYXRlZT1zdSxxbi5rZXlCeT1Fcyxxbi5rZXlzPU9hLHFuLmtleXNJbj1MYSxxbi5tYXA9Q3MscW4ubWFwS2V5cz1mdW5jdGlvbih0LGUpe3ZhciBuPXt9O3JldHVybiBlPWxvKGUsMyksYnIodCwoZnVuY3Rpb24odCxyLGkpe2FyKG4sZSh0LHIsaSksdCl9KSksbn0scW4ubWFwVmFsdWVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49e307cmV0dXJuIGU9bG8oZSwzKSxicih0LChmdW5jdGlvbih0LHIsaSl7YXIobixyLGUodCxyLGkpKX0pKSxufSxxbi5tYXRjaGVzPWZ1bmN0aW9uKHQpe3JldHVybiBxcihscih0LDEpKX0scW4ubWF0Y2hlc1Byb3BlcnR5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFZyKHQsbHIoZSwxKSl9LHFuLm1lbW9pemU9UnMscW4ubWVyZ2U9UGEscW4ubWVyZ2VXaXRoPVJhLHFuLm1ldGhvZD1hdSxxbi5tZXRob2RPZj11dSxxbi5taXhpbj1jdSxxbi5uZWdhdGU9QnMscW4ubnRoQXJnPWZ1bmN0aW9uKHQpe3JldHVybiB0PXlhKHQpLFFyKChmdW5jdGlvbihlKXtyZXR1cm4gWXIoZSx0KX0pKX0scW4ub21pdD1CYSxxbi5vbWl0Qnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gemEodCxCcyhsbyhlKSkpfSxxbi5vbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBNcygyLHQpfSxxbi5vcmRlckJ5PWZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybiBudWxsPT10P1tdOihYcyhlKXx8KGU9bnVsbD09ZT9bXTpbZV0pLFhzKHI9aT9uOnIpfHwocj1udWxsPT1yP1tdOltyXSksWHIodCxlLHIpKX0scW4ub3Zlcj1odSxxbi5vdmVyQXJncz1rcyxxbi5vdmVyRXZlcnk9ZnUscW4ub3ZlclNvbWU9cHUscW4ucGFydGlhbD16cyxxbi5wYXJ0aWFsUmlnaHQ9anMscW4ucGFydGl0aW9uPVNzLHFuLnBpY2s9a2EscW4ucGlja0J5PXphLHFuLnByb3BlcnR5PWR1LHFuLnByb3BlcnR5T2Y9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT10P246Q3IodCxlKX19LHFuLnB1bGw9JG8scW4ucHVsbEFsbD10cyxxbi5wdWxsQWxsQnk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0JiZ0Lmxlbmd0aCYmZSYmZS5sZW5ndGg/SHIodCxlLGxvKG4sMikpOnR9LHFuLnB1bGxBbGxXaXRoPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdCYmdC5sZW5ndGgmJmUmJmUubGVuZ3RoP0hyKHQsZSxuLHIpOnR9LHFuLnB1bGxBdD1lcyxxbi5yYW5nZT1ndSxxbi5yYW5nZVJpZ2h0PXl1LHFuLnJlYXJnPVVzLHFuLnJlamVjdD1mdW5jdGlvbih0LGUpe3JldHVybihYcyh0KT9PZTp2cikodCxCcyhsbyhlLDMpKSl9LHFuLnJlbW92ZT1mdW5jdGlvbih0LGUpe3ZhciBuPVtdO2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuIG47dmFyIHI9LTEsaT1bXSxvPXQubGVuZ3RoO2ZvcihlPWxvKGUsMyk7KytyPG87KXt2YXIgcz10W3JdO2UocyxyLHQpJiYobi5wdXNoKHMpLGkucHVzaChyKSl9cmV0dXJuIFpyKHQsaSksbn0scW4ucmVzdD1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtyZXR1cm4gUXIodCxlPWU9PT1uP2U6eWEoZSkpfSxxbi5yZXZlcnNlPW5zLHFuLnNhbXBsZVNpemU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBlPShyP2JvKHQsZSxyKTplPT09bik/MTp5YShlKSwoWHModCk/dHI6dGkpKHQsZSl9LHFuLnNldD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PXQ/dDplaSh0LGUsbil9LHFuLnNldFdpdGg9ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGk/aTpuLG51bGw9PXQ/dDplaSh0LGUscixpKX0scW4uc2h1ZmZsZT1mdW5jdGlvbih0KXtyZXR1cm4oWHModCk/ZXI6aWkpKHQpfSxxbi5zbGljZT1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBpPyhyJiYibnVtYmVyIiE9dHlwZW9mIHImJmJvKHQsZSxyKT8oZT0wLHI9aSk6KGU9bnVsbD09ZT8wOnlhKGUpLHI9cj09PW4/aTp5YShyKSksb2kodCxlLHIpKTpbXX0scW4uc29ydEJ5PUFzLHFuLnNvcnRlZFVuaXE9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP2NpKHQpOltdfSxxbi5zb3J0ZWRVbmlxQnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/Y2kodCxsbyhlLDIpKTpbXX0scW4uc3BsaXQ9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByJiYibnVtYmVyIiE9dHlwZW9mIHImJmJvKHQsZSxyKSYmKGU9cj1uKSwocj1yPT09bj9kOnI+Pj4wKT8odD14YSh0KSkmJigic3RyaW5nIj09dHlwZW9mIGV8fG51bGwhPWUmJiFhYShlKSkmJighKGU9aGkoZSkpJiZjbih0KSk/RGkoZ24odCksMCxyKTp0LnNwbGl0KGUscik6W119LHFuLnNwcmVhZD1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtyZXR1cm4gZT1udWxsPT1lPzA6eG4oeWEoZSksMCksUXIoKGZ1bmN0aW9uKG4pe3ZhciByPW5bZV0saT1EaShuLDAsZSk7cmV0dXJuIHImJkJlKGksciksTmUodCx0aGlzLGkpfSkpfSxxbi50YWlsPWZ1bmN0aW9uKHQpe3ZhciBlPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gZT9vaSh0LDEsZSk6W119LHFuLnRha2U9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0JiZ0Lmxlbmd0aD9vaSh0LDAsKGU9cnx8ZT09PW4/MTp5YShlKSk8MD8wOmUpOltdfSxxbi50YWtlUmlnaHQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gaT9vaSh0LChlPWktKGU9cnx8ZT09PW4/MTp5YShlKSkpPDA/MDplLGkpOltdfSxxbi50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9naSh0LGxvKGUsMyksITEsITApOltdfSxxbi50YWtlV2hpbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/Z2kodCxsbyhlLDMpKTpbXX0scW4udGFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUodCksdH0scW4udGhyb3R0bGU9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPSEwLG89ITA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBuYShuKSYmKGk9ImxlYWRpbmciaW4gbj8hIW4ubGVhZGluZzppLG89InRyYWlsaW5nImluIG4/ISFuLnRyYWlsaW5nOm8pLE9zKHQsZSx7bGVhZGluZzppLG1heFdhaXQ6ZSx0cmFpbGluZzpvfSl9LHFuLnRocnU9Z3MscW4udG9BcnJheT1kYSxxbi50b1BhaXJzPWphLHFuLnRvUGFpcnNJbj1VYSxxbi50b1BhdGg9ZnVuY3Rpb24odCl7cmV0dXJuIFhzKHQpP1JlKHQsem8pOmxhKHQpP1t0XTpGaShrbyh4YSh0KSkpfSxxbi50b1BsYWluT2JqZWN0PV9hLHFuLnRyYW5zZm9ybT1mdW5jdGlvbih0LGUsbil7dmFyIHI9WHModCksaT1yfHxLcyh0KXx8aGEodCk7aWYoZT1sbyhlLDQpLG51bGw9PW4pe3ZhciBvPXQmJnQuY29uc3RydWN0b3I7bj1pP3I/bmV3IG86W106bmEodCkmJiRzKG8pP1ZuKFp0KHQpKTp7fX1yZXR1cm4oaT9NZTpicikodCwoZnVuY3Rpb24odCxyLGkpe3JldHVybiBlKG4sdCxyLGkpfSkpLG59LHFuLnVuYXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBJcyh0LDEpfSxxbi51bmlvbj1ycyxxbi51bmlvbkJ5PWlzLHFuLnVuaW9uV2l0aD1vcyxxbi51bmlxPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9maSh0KTpbXX0scW4udW5pcUJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2ZpKHQsbG8oZSwyKSk6W119LHFuLnVuaXFXaXRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuLHQmJnQubGVuZ3RoP2ZpKHQsbixlKTpbXX0scW4udW5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dHx8cGkodCxlKX0scW4udW56aXA9c3MscW4udW56aXBXaXRoPWFzLHFuLnVwZGF0ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PXQ/dDpkaSh0LGUseGkobikpfSxxbi51cGRhdGVXaXRoPWZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiBpP2k6bixudWxsPT10P3Q6ZGkodCxlLHhpKHIpLGkpfSxxbi52YWx1ZXM9cWEscW4udmFsdWVzSW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106ZW4odCxMYSh0KSl9LHFuLndpdGhvdXQ9dXMscW4ud29yZHM9JGEscW4ud3JhcD1mdW5jdGlvbih0LGUpe3JldHVybiB6cyh4aShlKSx0KX0scW4ueG9yPWNzLHFuLnhvckJ5PWxzLHFuLnhvcldpdGg9aHMscW4uemlwPWZzLHFuLnppcE9iamVjdD1mdW5jdGlvbih0LGUpe3JldHVybiB2aSh0fHxbXSxlfHxbXSxycil9LHFuLnppcE9iamVjdERlZXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdmkodHx8W10sZXx8W10sZWkpfSxxbi56aXBXaXRoPXBzLHFuLmVudHJpZXM9amEscW4uZW50cmllc0luPVVhLHFuLmV4dGVuZD1iYSxxbi5leHRlbmRXaXRoPURhLGN1KHFuLHFuKSxxbi5hZGQ9X3UscW4uYXR0ZW1wdD10dSxxbi5jYW1lbENhc2U9VmEscW4uY2FwaXRhbGl6ZT1HYSxxbi5jZWlsPXh1LHFuLmNsYW1wPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcj09PW4mJihyPWUsZT1uKSxyIT09biYmKHI9KHI9dmEocikpPT1yP3I6MCksZSE9PW4mJihlPShlPXZhKGUpKT09ZT9lOjApLGNyKHZhKHQpLGUscil9LHFuLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBscih0LDQpfSxxbi5jbG9uZURlZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGxyKHQsNSl9LHFuLmNsb25lRGVlcFdpdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHIodCw1LGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuKX0scW4uY2xvbmVXaXRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGxyKHQsNCxlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bil9LHFuLmNvbmZvcm1zVG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09ZXx8aHIodCxlLE9hKGUpKX0scW4uZGVidXJyPVlhLHFuLmRlZmF1bHRUbz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10fHx0IT10P2U6dH0scW4uZGl2aWRlPXd1LHFuLmVuZHNXaXRoPWZ1bmN0aW9uKHQsZSxyKXt0PXhhKHQpLGU9aGkoZSk7dmFyIGk9dC5sZW5ndGgsbz1yPXI9PT1uP2k6Y3IoeWEociksMCxpKTtyZXR1cm4oci09ZS5sZW5ndGgpPj0wJiZ0LnNsaWNlKHIsbyk9PWV9LHFuLmVxPXFzLHFuLmVzY2FwZT1mdW5jdGlvbih0KXtyZXR1cm4odD14YSh0KSkmJkoudGVzdCh0KT90LnJlcGxhY2UoWixhbik6dH0scW4uZXNjYXBlUmVnRXhwPWZ1bmN0aW9uKHQpe3JldHVybih0PXhhKHQpKSYmb3QudGVzdCh0KT90LnJlcGxhY2UoaXQsIlxcJCYiKTp0fSxxbi5ldmVyeT1mdW5jdGlvbih0LGUscil7dmFyIGk9WHModCk/VGU6eXI7cmV0dXJuIHImJmJvKHQsZSxyKSYmKGU9biksaSh0LGxvKGUsMykpfSxxbi5maW5kPXZzLHFuLmZpbmRJbmRleD1Zbyxxbi5maW5kS2V5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHFlKHQsbG8oZSwzKSxicil9LHFuLmZpbmRMYXN0PV9zLHFuLmZpbmRMYXN0SW5kZXg9WG8scW4uZmluZExhc3RLZXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcWUodCxsbyhlLDMpLERyKX0scW4uZmxvb3I9YnUscW4uZm9yRWFjaD14cyxxbi5mb3JFYWNoUmlnaHQ9d3MscW4uZm9ySW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD90OnhyKHQsbG8oZSwzKSxMYSl9LHFuLmZvckluUmlnaHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD90OndyKHQsbG8oZSwzKSxMYSl9LHFuLmZvck93bj1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZicih0LGxvKGUsMykpfSxxbi5mb3JPd25SaWdodD1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZEcih0LGxvKGUsMykpfSxxbi5nZXQ9TmEscW4uZ3Q9VnMscW4uZ3RlPUdzLHFuLmhhcz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZ2byh0LGUsSXIpfSxxbi5oYXNJbj1JYSxxbi5oZWFkPUhvLHFuLmlkZW50aXR5PW91LHFuLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxuLHIpe3Q9SHModCk/dDpxYSh0KSxuPW4mJiFyP3lhKG4pOjA7dmFyIGk9dC5sZW5ndGg7cmV0dXJuIG48MCYmKG49eG4oaStuLDApKSxjYSh0KT9uPD1pJiZ0LmluZGV4T2YoZSxuKT4tMTohIWkmJkdlKHQsZSxuKT4tMX0scW4uaW5kZXhPZj1mdW5jdGlvbih0LGUsbil7dmFyIHI9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFyKXJldHVybi0xO3ZhciBpPW51bGw9PW4/MDp5YShuKTtyZXR1cm4gaTwwJiYoaT14bihyK2ksMCkpLEdlKHQsZSxpKX0scW4uaW5SYW5nZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU9Z2EoZSkscj09PW4/KHI9ZSxlPTApOnI9Z2EociksZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Pj13bihlLG4pJiZ0PHhuKGUsbil9KHQ9dmEodCksZSxyKX0scW4uaW52b2tlPVRhLHFuLmlzQXJndW1lbnRzPVlzLHFuLmlzQXJyYXk9WHMscW4uaXNBcnJheUJ1ZmZlcj1Xcyxxbi5pc0FycmF5TGlrZT1Icyxxbi5pc0FycmF5TGlrZU9iamVjdD1acyxxbi5pc0Jvb2xlYW49ZnVuY3Rpb24odCl7cmV0dXJuITA9PT10fHwhMT09PXR8fHJhKHQpJiZBcih0KT09eH0scW4uaXNCdWZmZXI9S3MscW4uaXNEYXRlPUpzLHFuLmlzRWxlbWVudD1mdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJjE9PT10Lm5vZGVUeXBlJiYhc2EodCl9LHFuLmlzRW1wdHk9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4hMDtpZihIcyh0KSYmKFhzKHQpfHwic3RyaW5nIj09dHlwZW9mIHR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0LnNwbGljZXx8S3ModCl8fGhhKHQpfHxZcyh0KSkpcmV0dXJuIXQubGVuZ3RoO3ZhciBlPW1vKHQpO2lmKGU9PUN8fGU9PU0pcmV0dXJuIXQuc2l6ZTtpZihTbyh0KSlyZXR1cm4ha3IodCkubGVuZ3RoO2Zvcih2YXIgbiBpbiB0KWlmKGt0LmNhbGwodCxuKSlyZXR1cm4hMTtyZXR1cm4hMH0scW4uaXNFcXVhbD1mdW5jdGlvbih0LGUpe3JldHVybiBMcih0LGUpfSxxbi5pc0VxdWFsV2l0aD1mdW5jdGlvbih0LGUscil7dmFyIGk9KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpuKT9yKHQsZSk6bjtyZXR1cm4gaT09PW4/THIodCxlLG4scik6ISFpfSxxbi5pc0Vycm9yPVFzLHFuLmlzRmluaXRlPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmVWUodCl9LHFuLmlzRnVuY3Rpb249JHMscW4uaXNJbnRlZ2VyPXRhLHFuLmlzTGVuZ3RoPWVhLHFuLmlzTWFwPWlhLHFuLmlzTWF0Y2g9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fFByKHQsZSxmbyhlKSl9LHFuLmlzTWF0Y2hXaXRoPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gcj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOm4sUHIodCxlLGZvKGUpLHIpfSxxbi5pc05hTj1mdW5jdGlvbih0KXtyZXR1cm4gb2EodCkmJnQhPSt0fSxxbi5pc05hdGl2ZT1mdW5jdGlvbih0KXtpZihDbyh0KSl0aHJvdyBuZXcgU3QoIlVuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLiIpO3JldHVybiBScih0KX0scW4uaXNOaWw9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR9LHFuLmlzTnVsbD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXR9LHFuLmlzTnVtYmVyPW9hLHFuLmlzT2JqZWN0PW5hLHFuLmlzT2JqZWN0TGlrZT1yYSxxbi5pc1BsYWluT2JqZWN0PXNhLHFuLmlzUmVnRXhwPWFhLHFuLmlzU2FmZUludGVnZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRhKHQpJiZ0Pj0tZiYmdDw9Zn0scW4uaXNTZXQ9dWEscW4uaXNTdHJpbmc9Y2EscW4uaXNTeW1ib2w9bGEscW4uaXNUeXBlZEFycmF5PWhhLHFuLmlzVW5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09bn0scW4uaXNXZWFrTWFwPWZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmbW8odCk9PU99LHFuLmlzV2Vha1NldD1mdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJiJbb2JqZWN0IFdlYWtTZXRdIj09QXIodCl9LHFuLmpvaW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD8iIjpaZS5jYWxsKHQsZSl9LHFuLmtlYmFiQ2FzZT1YYSxxbi5sYXN0PVFvLHFuLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7aWYoIWkpcmV0dXJuLTE7dmFyIG89aTtyZXR1cm4gciE9PW4mJihvPShvPXlhKHIpKTwwP3huKGkrbywwKTp3bihvLGktMSkpLGU9PWU/ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uKzE7ci0tOylpZih0W3JdPT09ZSlyZXR1cm4gcjtyZXR1cm4gcn0odCxlLG8pOlZlKHQsWGUsbywhMCl9LHFuLmxvd2VyQ2FzZT1XYSxxbi5sb3dlckZpcnN0PUhhLHFuLmx0PWZhLHFuLmx0ZT1wYSxxbi5tYXg9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP21yKHQsb3UsTnIpOm59LHFuLm1heEJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP21yKHQsbG8oZSwyKSxOcik6bn0scW4ubWVhbj1mdW5jdGlvbih0KXtyZXR1cm4gV2UodCxvdSl9LHFuLm1lYW5CeT1mdW5jdGlvbih0LGUpe3JldHVybiBXZSh0LGxvKGUsMikpfSxxbi5taW49ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP21yKHQsb3UsanIpOm59LHFuLm1pbkJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP21yKHQsbG8oZSwyKSxqcik6bn0scW4uc3R1YkFycmF5PW11LHFuLnN0dWJGYWxzZT12dSxxbi5zdHViT2JqZWN0PWZ1bmN0aW9uKCl7cmV0dXJue319LHFuLnN0dWJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iIn0scW4uc3R1YlRydWU9ZnVuY3Rpb24oKXtyZXR1cm4hMH0scW4ubXVsdGlwbHk9RHUscW4ubnRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP1lyKHQseWEoZSkpOm59LHFuLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4geWUuXz09PXRoaXMmJih5ZS5fPVZ0KSx0aGlzfSxxbi5ub29wPWx1LHFuLm5vdz1Ocyxxbi5wYWQ9ZnVuY3Rpb24odCxlLG4pe3Q9eGEodCk7dmFyIHI9KGU9eWEoZSkpP2RuKHQpOjA7aWYoIWV8fHI+PWUpcmV0dXJuIHQ7dmFyIGk9KGUtcikvMjtyZXR1cm4gWGkodmUoaSksbikrdCtYaShtZShpKSxuKX0scW4ucGFkRW5kPWZ1bmN0aW9uKHQsZSxuKXt0PXhhKHQpO3ZhciByPShlPXlhKGUpKT9kbih0KTowO3JldHVybiBlJiZyPGU/dCtYaShlLXIsbik6dH0scW4ucGFkU3RhcnQ9ZnVuY3Rpb24odCxlLG4pe3Q9eGEodCk7dmFyIHI9KGU9eWEoZSkpP2RuKHQpOjA7cmV0dXJuIGUmJnI8ZT9YaShlLXIsbikrdDp0fSxxbi5wYXJzZUludD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG58fG51bGw9PWU/ZT0wOmUmJihlPStlKSxEbih4YSh0KS5yZXBsYWNlKHN0LCIiKSxlfHwwKX0scW4ucmFuZG9tPWZ1bmN0aW9uKHQsZSxyKXtpZihyJiYiYm9vbGVhbiIhPXR5cGVvZiByJiZibyh0LGUscikmJihlPXI9bikscj09PW4mJigiYm9vbGVhbiI9PXR5cGVvZiBlPyhyPWUsZT1uKToiYm9vbGVhbiI9PXR5cGVvZiB0JiYocj10LHQ9bikpLHQ9PT1uJiZlPT09bj8odD0wLGU9MSk6KHQ9Z2EodCksZT09PW4/KGU9dCx0PTApOmU9Z2EoZSkpLHQ+ZSl7dmFyIGk9dDt0PWUsZT1pfWlmKHJ8fHQlMXx8ZSUxKXt2YXIgbz1FbigpO3JldHVybiB3bih0K28qKGUtdCtmZSgiMWUtIisoKG8rIiIpLmxlbmd0aC0xKSkpLGUpfXJldHVybiBLcih0LGUpfSxxbi5yZWR1Y2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVhzKHQpP2tlOktlLGk9YXJndW1lbnRzLmxlbmd0aDwzO3JldHVybiByKHQsbG8oZSw0KSxuLGksZHIpfSxxbi5yZWR1Y2VSaWdodD1mdW5jdGlvbih0LGUsbil7dmFyIHI9WHModCk/emU6S2UsaT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIHIodCxsbyhlLDQpLG4saSxncil9LHFuLnJlcGVhdD1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU9KHI/Ym8odCxlLHIpOmU9PT1uKT8xOnlhKGUpLEpyKHhhKHQpLGUpfSxxbi5yZXBsYWNlPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLGU9eGEodFswXSk7cmV0dXJuIHQubGVuZ3RoPDM/ZTplLnJlcGxhY2UodFsxXSx0WzJdKX0scW4ucmVzdWx0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT0tMSxvPShlPXdpKGUsdCkpLmxlbmd0aDtmb3Iob3x8KG89MSx0PW4pOysraTxvOyl7dmFyIHM9bnVsbD09dD9uOnRbem8oZVtpXSldO3M9PT1uJiYoaT1vLHM9ciksdD0kcyhzKT9zLmNhbGwodCk6c31yZXR1cm4gdH0scW4ucm91bmQ9RXUscW4ucnVuSW5Db250ZXh0PXQscW4uc2FtcGxlPWZ1bmN0aW9uKHQpe3JldHVybihYcyh0KT8kbjokcikodCl9LHFuLnNpemU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gMDtpZihIcyh0KSlyZXR1cm4gY2EodCk/ZG4odCk6dC5sZW5ndGg7dmFyIGU9bW8odCk7cmV0dXJuIGU9PUN8fGU9PU0/dC5zaXplOmtyKHQpLmxlbmd0aH0scW4uc25ha2VDYXNlPVphLHFuLnNvbWU9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPVhzKHQpP2plOnNpO3JldHVybiByJiZibyh0LGUscikmJihlPW4pLGkodCxsbyhlLDMpKX0scW4uc29ydGVkSW5kZXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWkodCxlKX0scW4uc29ydGVkSW5kZXhCeT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHVpKHQsZSxsbyhuLDIpKX0scW4uc29ydGVkSW5kZXhPZj1mdW5jdGlvbih0LGUpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZihuKXt2YXIgcj1haSh0LGUpO2lmKHI8biYmcXModFtyXSxlKSlyZXR1cm4gcn1yZXR1cm4tMX0scW4uc29ydGVkTGFzdEluZGV4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFpKHQsZSwhMCl9LHFuLnNvcnRlZExhc3RJbmRleEJ5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdWkodCxlLGxvKG4sMiksITApfSxxbi5zb3J0ZWRMYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUpe2lmKG51bGw9PXQ/MDp0Lmxlbmd0aCl7dmFyIG49YWkodCxlLCEwKS0xO2lmKHFzKHRbbl0sZSkpcmV0dXJuIG59cmV0dXJuLTF9LHFuLnN0YXJ0Q2FzZT1LYSxxbi5zdGFydHNXaXRoPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD14YSh0KSxuPW51bGw9PW4/MDpjcih5YShuKSwwLHQubGVuZ3RoKSxlPWhpKGUpLHQuc2xpY2UobixuK2UubGVuZ3RoKT09ZX0scW4uc3VidHJhY3Q9Q3UscW4uc3VtPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9KZSh0LG91KTowfSxxbi5zdW1CeT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9KZSh0LGxvKGUsMikpOjB9LHFuLnRlbXBsYXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1xbi50ZW1wbGF0ZVNldHRpbmdzO3ImJmJvKHQsZSxyKSYmKGU9biksdD14YSh0KSxlPURhKHt9LGUsaSx0byk7dmFyIG8scyxhPURhKHt9LGUuaW1wb3J0cyxpLmltcG9ydHMsdG8pLHU9T2EoYSksYz1lbihhLHUpLGw9MCxoPWUuaW50ZXJwb2xhdGV8fGJ0LGY9Il9fcCArPSAnIixwPU10KChlLmVzY2FwZXx8YnQpLnNvdXJjZSsifCIraC5zb3VyY2UrInwiKyhoPT09dHQ/ZHQ6YnQpLnNvdXJjZSsifCIrKGUuZXZhbHVhdGV8fGJ0KS5zb3VyY2UrInwkIiwiZyIpLGQ9Ii8vIyBzb3VyY2VVUkw9Iisoa3QuY2FsbChlLCJzb3VyY2VVUkwiKT8oZS5zb3VyY2VVUkwrIiIpLnJlcGxhY2UoL1xzL2csIiAiKToibG9kYXNoLnRlbXBsYXRlU291cmNlc1siKyArK3VlKyJdIikrIlxuIjt0LnJlcGxhY2UocCwoZnVuY3Rpb24oZSxuLHIsaSxhLHUpe3JldHVybiByfHwocj1pKSxmKz10LnNsaWNlKGwsdSkucmVwbGFjZShEdCx1biksbiYmKG89ITAsZis9IicgK1xuX19lKCIrbisiKSArXG4nIiksYSYmKHM9ITAsZis9Iic7XG4iK2ErIjtcbl9fcCArPSAnIiksciYmKGYrPSInICtcbigoX190ID0gKCIrcisiKSkgPT0gbnVsbCA/ICcnIDogX190KSArXG4nIiksbD11K2UubGVuZ3RoLGV9KSksZis9Iic7XG4iO3ZhciBnPWt0LmNhbGwoZSwidmFyaWFibGUiKSYmZS52YXJpYWJsZTtpZihnKXtpZihmdC50ZXN0KGcpKXRocm93IG5ldyBTdCgiSW52YWxpZCBgdmFyaWFibGVgIG9wdGlvbiBwYXNzZWQgaW50byBgXy50ZW1wbGF0ZWAiKX1lbHNlIGY9IndpdGggKG9iaikge1xuIitmKyJcbn1cbiI7Zj0ocz9mLnJlcGxhY2UoWSwiIik6ZikucmVwbGFjZShYLCIkMSIpLnJlcGxhY2UoVywiJDE7IiksZj0iZnVuY3Rpb24oIisoZ3x8Im9iaiIpKyIpIHtcbiIrKGc/IiI6Im9iaiB8fCAob2JqID0ge30pO1xuIikrInZhciBfX3QsIF9fcCA9ICcnIisobz8iLCBfX2UgPSBfLmVzY2FwZSI6IiIpKyhzPyIsIF9faiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xuZnVuY3Rpb24gcHJpbnQoKSB7IF9fcCArPSBfX2ouY2FsbChhcmd1bWVudHMsICcnKSB9XG4iOiI7XG4iKStmKyJyZXR1cm4gX19wXG59Ijt2YXIgeT10dSgoZnVuY3Rpb24oKXtyZXR1cm4gQXQodSxkKyJyZXR1cm4gIitmKS5hcHBseShuLGMpfSkpO2lmKHkuc291cmNlPWYsUXMoeSkpdGhyb3cgeTtyZXR1cm4geX0scW4udGltZXM9ZnVuY3Rpb24odCxlKXtpZigodD15YSh0KSk8MXx8dD5mKXJldHVybltdO3ZhciBuPWQscj13bih0LGQpO2U9bG8oZSksdC09ZDtmb3IodmFyIGk9UWUocixlKTsrK248dDspZShuKTtyZXR1cm4gaX0scW4udG9GaW5pdGU9Z2EscW4udG9JbnRlZ2VyPXlhLHFuLnRvTGVuZ3RoPW1hLHFuLnRvTG93ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHhhKHQpLnRvTG93ZXJDYXNlKCl9LHFuLnRvTnVtYmVyPXZhLHFuLnRvU2FmZUludGVnZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/Y3IoeWEodCksLWYsZik6MD09PXQ/dDowfSxxbi50b1N0cmluZz14YSxxbi50b1VwcGVyPWZ1bmN0aW9uKHQpe3JldHVybiB4YSh0KS50b1VwcGVyQ2FzZSgpfSxxbi50cmltPWZ1bmN0aW9uKHQsZSxyKXtpZigodD14YSh0KSkmJihyfHxlPT09bikpcmV0dXJuICRlKHQpO2lmKCF0fHwhKGU9aGkoZSkpKXJldHVybiB0O3ZhciBpPWduKHQpLG89Z24oZSk7cmV0dXJuIERpKGkscm4oaSxvKSxvbihpLG8pKzEpLmpvaW4oIiIpfSxxbi50cmltRW5kPWZ1bmN0aW9uKHQsZSxyKXtpZigodD14YSh0KSkmJihyfHxlPT09bikpcmV0dXJuIHQuc2xpY2UoMCx5bih0KSsxKTtpZighdHx8IShlPWhpKGUpKSlyZXR1cm4gdDt2YXIgaT1nbih0KTtyZXR1cm4gRGkoaSwwLG9uKGksZ24oZSkpKzEpLmpvaW4oIiIpfSxxbi50cmltU3RhcnQ9ZnVuY3Rpb24odCxlLHIpe2lmKCh0PXhhKHQpKSYmKHJ8fGU9PT1uKSlyZXR1cm4gdC5yZXBsYWNlKHN0LCIiKTtpZighdHx8IShlPWhpKGUpKSlyZXR1cm4gdDt2YXIgaT1nbih0KTtyZXR1cm4gRGkoaSxybihpLGduKGUpKSkuam9pbigiIil9LHFuLnRydW5jYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9MzAsaT0iLi4uIjtpZihuYShlKSl7dmFyIG89InNlcGFyYXRvciJpbiBlP2Uuc2VwYXJhdG9yOm87cj0ibGVuZ3RoImluIGU/eWEoZS5sZW5ndGgpOnIsaT0ib21pc3Npb24iaW4gZT9oaShlLm9taXNzaW9uKTppfXZhciBzPSh0PXhhKHQpKS5sZW5ndGg7aWYoY24odCkpe3ZhciBhPWduKHQpO3M9YS5sZW5ndGh9aWYocj49cylyZXR1cm4gdDt2YXIgdT1yLWRuKGkpO2lmKHU8MSlyZXR1cm4gaTt2YXIgYz1hP0RpKGEsMCx1KS5qb2luKCIiKTp0LnNsaWNlKDAsdSk7aWYobz09PW4pcmV0dXJuIGMraTtpZihhJiYodSs9Yy5sZW5ndGgtdSksYWEobykpe2lmKHQuc2xpY2UodSkuc2VhcmNoKG8pKXt2YXIgbCxoPWM7Zm9yKG8uZ2xvYmFsfHwobz1NdChvLnNvdXJjZSx4YShndC5leGVjKG8pKSsiZyIpKSxvLmxhc3RJbmRleD0wO2w9by5leGVjKGgpOyl2YXIgZj1sLmluZGV4O2M9Yy5zbGljZSgwLGY9PT1uP3U6Zil9fWVsc2UgaWYodC5pbmRleE9mKGhpKG8pLHUpIT11KXt2YXIgcD1jLmxhc3RJbmRleE9mKG8pO3A+LTEmJihjPWMuc2xpY2UoMCxwKSl9cmV0dXJuIGMraX0scW4udW5lc2NhcGU9ZnVuY3Rpb24odCl7cmV0dXJuKHQ9eGEodCkpJiZLLnRlc3QodCk/dC5yZXBsYWNlKEgsbW4pOnR9LHFuLnVuaXF1ZUlkPWZ1bmN0aW9uKHQpe3ZhciBlPSsrenQ7cmV0dXJuIHhhKHQpK2V9LHFuLnVwcGVyQ2FzZT1KYSxxbi51cHBlckZpcnN0PVFhLHFuLmVhY2g9eHMscW4uZWFjaFJpZ2h0PXdzLHFuLmZpcnN0PUhvLGN1KHFuLGZ1bmN0aW9uKCl7dmFyIHQ9e307cmV0dXJuIGJyKHFuLChmdW5jdGlvbihlLG4pe2t0LmNhbGwocW4ucHJvdG90eXBlLG4pfHwodFtuXT1lKX0pKSx0fSgpLHtjaGFpbjohMX0pLHFuLlZFUlNJT049IjQuMTcuMjEiLE1lKFsiYmluZCIsImJpbmRLZXkiLCJjdXJyeSIsImN1cnJ5UmlnaHQiLCJwYXJ0aWFsIiwicGFydGlhbFJpZ2h0Il0sKGZ1bmN0aW9uKHQpe3FuW3RdLnBsYWNlaG9sZGVyPXFufSkpLE1lKFsiZHJvcCIsInRha2UiXSwoZnVuY3Rpb24odCxlKXtYbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24ocil7cj1yPT09bj8xOnhuKHlhKHIpLDApO3ZhciBpPXRoaXMuX19maWx0ZXJlZF9fJiYhZT9uZXcgWG4odGhpcyk6dGhpcy5jbG9uZSgpO3JldHVybiBpLl9fZmlsdGVyZWRfXz9pLl9fdGFrZUNvdW50X189d24ocixpLl9fdGFrZUNvdW50X18pOmkuX192aWV3c19fLnB1c2goe3NpemU6d24ocixkKSx0eXBlOnQrKGkuX19kaXJfXzwwPyJSaWdodCI6IiIpfSksaX0sWG4ucHJvdG90eXBlW3QrIlJpZ2h0Il09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpW3RdKGUpLnJldmVyc2UoKX19KSksTWUoWyJmaWx0ZXIiLCJtYXAiLCJ0YWtlV2hpbGUiXSwoZnVuY3Rpb24odCxlKXt2YXIgbj1lKzEscj0xPT1ufHwzPT1uO1huLnByb3RvdHlwZVt0XT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNsb25lKCk7cmV0dXJuIGUuX19pdGVyYXRlZXNfXy5wdXNoKHtpdGVyYXRlZTpsbyh0LDMpLHR5cGU6bn0pLGUuX19maWx0ZXJlZF9fPWUuX19maWx0ZXJlZF9ffHxyLGV9fSkpLE1lKFsiaGVhZCIsImxhc3QiXSwoZnVuY3Rpb24odCxlKXt2YXIgbj0idGFrZSIrKGU/IlJpZ2h0IjoiIik7WG4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbbl0oMSkudmFsdWUoKVswXX19KSksTWUoWyJpbml0aWFsIiwidGFpbCJdLChmdW5jdGlvbih0LGUpe3ZhciBuPSJkcm9wIisoZT8iIjoiUmlnaHQiKTtYbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18/bmV3IFhuKHRoaXMpOnRoaXNbbl0oMSl9fSkpLFhuLnByb3RvdHlwZS5jb21wYWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyKG91KX0sWG4ucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmlsdGVyKHQpLmhlYWQoKX0sWG4ucHJvdG90eXBlLmZpbmRMYXN0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHQpfSxYbi5wcm90b3R5cGUuaW52b2tlTWFwPVFyKChmdW5jdGlvbih0LGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P25ldyBYbih0aGlzKTp0aGlzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIFRyKG4sdCxlKX0pKX0pKSxYbi5wcm90b3R5cGUucmVqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbHRlcihCcyhsbyh0KSkpfSxYbi5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt0PXlhKHQpO3ZhciByPXRoaXM7cmV0dXJuIHIuX19maWx0ZXJlZF9fJiYodD4wfHxlPDApP25ldyBYbihyKToodDwwP3I9ci50YWtlUmlnaHQoLXQpOnQmJihyPXIuZHJvcCh0KSksZSE9PW4mJihyPShlPXlhKGUpKTwwP3IuZHJvcFJpZ2h0KC1lKTpyLnRha2UoZS10KSkscil9LFhuLnByb3RvdHlwZS50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHQpLnJldmVyc2UoKX0sWG4ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWtlKGQpfSxicihYbi5wcm90b3R5cGUsKGZ1bmN0aW9uKHQsZSl7dmFyIHI9L14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QoZSksaT0vXig/OmhlYWR8bGFzdCkkLy50ZXN0KGUpLG89cW5baT8idGFrZSIrKCJsYXN0Ij09ZT8iUmlnaHQiOiIiKTplXSxzPWl8fC9eZmluZC8udGVzdChlKTshb3x8KHFuLnByb3RvdHlwZVtlXT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX193cmFwcGVkX18sYT1pP1sxXTphcmd1bWVudHMsdT1lIGluc3RhbmNlb2YgWG4sYz1hWzBdLGw9dXx8WHMoZSksaD1mdW5jdGlvbih0KXt2YXIgZT1vLmFwcGx5KHFuLEJlKFt0XSxhKSk7cmV0dXJuIGkmJmY/ZVswXTplfTtsJiZyJiYiZnVuY3Rpb24iPT10eXBlb2YgYyYmMSE9Yy5sZW5ndGgmJih1PWw9ITEpO3ZhciBmPXRoaXMuX19jaGFpbl9fLHA9ISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxkPXMmJiFmLGc9dSYmIXA7aWYoIXMmJmwpe2U9Zz9lOm5ldyBYbih0aGlzKTt2YXIgeT10LmFwcGx5KGUsYSk7cmV0dXJuIHkuX19hY3Rpb25zX18ucHVzaCh7ZnVuYzpncyxhcmdzOltoXSx0aGlzQXJnOm59KSxuZXcgWW4oeSxmKX1yZXR1cm4gZCYmZz90LmFwcGx5KHRoaXMsYSk6KHk9dGhpcy50aHJ1KGgpLGQ/aT95LnZhbHVlKClbMF06eS52YWx1ZSgpOnkpfSl9KSksTWUoWyJwb3AiLCJwdXNoIiwic2hpZnQiLCJzb3J0Iiwic3BsaWNlIiwidW5zaGlmdCJdLChmdW5jdGlvbih0KXt2YXIgZT1PdFt0XSxuPS9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdCh0KT8idGFwIjoidGhydSIscj0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KHQpO3FuLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztpZihyJiYhdGhpcy5fX2NoYWluX18pe3ZhciBpPXRoaXMudmFsdWUoKTtyZXR1cm4gZS5hcHBseShYcyhpKT9pOltdLHQpfXJldHVybiB0aGlzW25dKChmdW5jdGlvbihuKXtyZXR1cm4gZS5hcHBseShYcyhuKT9uOltdLHQpfSkpfX0pKSxicihYbi5wcm90b3R5cGUsKGZ1bmN0aW9uKHQsZSl7dmFyIG49cW5bZV07aWYobil7dmFyIHI9bi5uYW1lKyIiO2t0LmNhbGwoT24scil8fChPbltyXT1bXSksT25bcl0ucHVzaCh7bmFtZTplLGZ1bmM6bn0pfX0pKSxPbltxaShuLDIpLm5hbWVdPVt7bmFtZToid3JhcHBlciIsZnVuYzpufV0sWG4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IFhuKHRoaXMuX193cmFwcGVkX18pO3JldHVybiB0Ll9fYWN0aW9uc19fPUZpKHRoaXMuX19hY3Rpb25zX18pLHQuX19kaXJfXz10aGlzLl9fZGlyX18sdC5fX2ZpbHRlcmVkX189dGhpcy5fX2ZpbHRlcmVkX18sdC5fX2l0ZXJhdGVlc19fPUZpKHRoaXMuX19pdGVyYXRlZXNfXyksdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXyx0Ll9fdmlld3NfXz1GaSh0aGlzLl9fdmlld3NfXyksdH0sWG4ucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHQ9bmV3IFhuKHRoaXMpO3QuX19kaXJfXz0tMSx0Ll9fZmlsdGVyZWRfXz0hMH1lbHNlKHQ9dGhpcy5jbG9uZSgpKS5fX2Rpcl9fKj0tMTtyZXR1cm4gdH0sWG4ucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGU9dGhpcy5fX2Rpcl9fLG49WHModCkscj1lPDAsaT1uP3QubGVuZ3RoOjAsbz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPS0xLGk9bi5sZW5ndGg7KytyPGk7KXt2YXIgbz1uW3JdLHM9by5zaXplO3N3aXRjaChvLnR5cGUpe2Nhc2UiZHJvcCI6dCs9czticmVhaztjYXNlImRyb3BSaWdodCI6ZS09czticmVhaztjYXNlInRha2UiOmU9d24oZSx0K3MpO2JyZWFrO2Nhc2UidGFrZVJpZ2h0Ijp0PXhuKHQsZS1zKX19cmV0dXJue3N0YXJ0OnQsZW5kOmV9fSgwLGksdGhpcy5fX3ZpZXdzX18pLHM9by5zdGFydCxhPW8uZW5kLHU9YS1zLGM9cj9hOnMtMSxsPXRoaXMuX19pdGVyYXRlZXNfXyxoPWwubGVuZ3RoLGY9MCxwPXduKHUsdGhpcy5fX3Rha2VDb3VudF9fKTtpZighbnx8IXImJmk9PXUmJnA9PXUpcmV0dXJuIHlpKHQsdGhpcy5fX2FjdGlvbnNfXyk7dmFyIGQ9W107dDpmb3IoO3UtLSYmZjxwOyl7Zm9yKHZhciBnPS0xLHk9dFtjKz1lXTsrK2c8aDspe3ZhciBtPWxbZ10sdj1tLml0ZXJhdGVlLF89bS50eXBlLHg9dih5KTtpZigyPT1fKXk9eDtlbHNlIGlmKCF4KXtpZigxPT1fKWNvbnRpbnVlIHQ7YnJlYWsgdH19ZFtmKytdPXl9cmV0dXJuIGR9LHFuLnByb3RvdHlwZS5hdD15cyxxbi5wcm90b3R5cGUuY2hhaW49ZnVuY3Rpb24oKXtyZXR1cm4gZHModGhpcyl9LHFuLnByb3RvdHlwZS5jb21taXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFluKHRoaXMudmFsdWUoKSx0aGlzLl9fY2hhaW5fXyl9LHFuLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dGhpcy5fX3ZhbHVlc19fPT09biYmKHRoaXMuX192YWx1ZXNfXz1kYSh0aGlzLnZhbHVlKCkpKTt2YXIgdD10aGlzLl9faW5kZXhfXz49dGhpcy5fX3ZhbHVlc19fLmxlbmd0aDtyZXR1cm57ZG9uZTp0LHZhbHVlOnQ/bjp0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK119fSxxbi5wcm90b3R5cGUucGxhbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLHI9dGhpcztyIGluc3RhbmNlb2YgR247KXt2YXIgaT1VbyhyKTtpLl9faW5kZXhfXz0wLGkuX192YWx1ZXNfXz1uLGU/by5fX3dyYXBwZWRfXz1pOmU9aTt2YXIgbz1pO3I9ci5fX3dyYXBwZWRfX31yZXR1cm4gby5fX3dyYXBwZWRfXz10LGV9LHFuLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fX3dyYXBwZWRfXztpZih0IGluc3RhbmNlb2YgWG4pe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoJiYoZT1uZXcgWG4odGhpcykpLChlPWUucmV2ZXJzZSgpKS5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOmdzLGFyZ3M6W25zXSx0aGlzQXJnOm59KSxuZXcgWW4oZSx0aGlzLl9fY2hhaW5fXyl9cmV0dXJuIHRoaXMudGhydShucyl9LHFuLnByb3RvdHlwZS50b0pTT049cW4ucHJvdG90eXBlLnZhbHVlT2Y9cW4ucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHlpKHRoaXMuX193cmFwcGVkX18sdGhpcy5fX2FjdGlvbnNfXyl9LHFuLnByb3RvdHlwZS5maXJzdD1xbi5wcm90b3R5cGUuaGVhZCx0ZSYmKHFuLnByb3RvdHlwZVt0ZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHFufSgpO3ZlPygodmUuZXhwb3J0cz12bikuXz12bixtZS5fPXZuKTp5ZS5fPXZufSkuY2FsbCh0ZSl9KSk7Y29uc3QgWnY9KHQsZSxuKT0+e2lmKG5bZV0pcmV0dXJuIG51bGwhPT0oKHQsZSk9Pntjb25zdCBuPU1hdGgubWF4KHQueCxlLngpLHI9TWF0aC5tYXgodC55LGUueSksaT1NYXRoLm1pbih0LngrdC53aWR0aCxlLngrZS53aWR0aCktbixvPU1hdGgubWluKHQueSt0LmhlaWdodCxlLnkrZS5oZWlnaHQpLXI7cmV0dXJuIGk+PTAmJm8+PTA/e3g6bix5OnIsd2lkdGg6aSxoZWlnaHQ6b306bnVsbH0pKHQse3g6MCx5OjAsd2lkdGg6bltlXS53aWR0aCxoZWlnaHQ6bltlXS5oZWlnaHR9KTtyZXR1cm4hMX07dmFyIEt2PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxKdj1PYmplY3QuZGVmaW5lUHJvcGVydGllcyxRdj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywkdj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLHRfPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksZV89T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxuXz0odCxlLG4pPT5lIGluIHQ/S3YodCxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpufSk6dFtlXT1uLHJfPSh0LGUpPT57Zm9yKHZhciBuIGluIGV8fChlPXt9KSl0Xy5jYWxsKGUsbikmJm5fKHQsbixlW25dKTtpZigkdilmb3IodmFyIG4gb2YgJHYoZSkpZV8uY2FsbChlLG4pJiZuXyh0LG4sZVtuXSk7cmV0dXJuIHR9LGlfPSh0LGUpPT5Kdih0LFF2KGUpKTtmdW5jdGlvbiBvXyh0KXt2YXIgZTtjb25zdHtjdXJyZW50RGF0YTpuLGRpc3BsYXlQb2ludENsb3VkTGlzdDpyLHNlbGVjdGVkSUQ6aSxoaWdobGlnaHRBdHRyaWJ1dGU6byxpbWFnZVNpemVzOnMsY29uZmlnOmEscG9seWdvbkxpc3Q6dSxzZWxlY3RlZElEczpjfT10LGw9e2ZpbGw6InRyYW5zcGFyZW50Iixjb2xvcjoiZ3JlZW4ifTtsZXQgaD1bXTtyZXR1cm4gbnVsbD09KGU9bnVsbD09bj92b2lkIDA6bi5tYXBwaW5nSW1nTGlzdCl8fGUuZm9yRWFjaCgodD0+e3ZhciBlLG4sZixwO2NvbnN0IGQ9ci5yZWR1Y2UoKChlLG4pPT57dmFyIHIsdTtjb25zdCBjPW4uaWQ9PT1pfHxvPT09bi5hdHRyaWJ1dGUse3RyYW5zZmVyVmlld0RhdGE6aCx2aWV3UmFuZ2VQb2ludExpc3Q6Zn09bnVsbCE9KHI9R3Yobix0LmNhbGliLHtjcmVhdGVSYW5nZTpjfSkpP3I6e307aWYoIWh8fCFmKXJldHVybltdO2NvbnN0IHA9aC5yZWR1Y2UoKCh0LGUpPT4ibGluZSI9PT1lLnR5cGU/Wy4uLnQsLi4uZS5wb2ludExpc3RdOnQpLFtdKSxkPWlfKHJfKHt9LCh0PT57bGV0IGU9MS8wLG49MS8wLHI9LTEvMCxpPS0xLzA7Zm9yKGNvbnN0IG8gb2YgdCllPU1hdGgubWluKGUsby54KSxuPU1hdGgubWluKG4sby55KSxyPU1hdGgubWF4KHIsby54KSxpPU1hdGgubWF4KGksby55KTtyZXR1cm57eDplLHk6bix3aWR0aDpyLWUsaGVpZ2h0Omktbn19KShwKSkse2ltYWdlTmFtZTp0LnBhdGh9KTtpZighWnYoZCx0LnBhdGgscykpcmV0dXJuIGU7Y29uc3QgZz1udWxsPT0odT1GdC5nZXRDb2xvckZyb21Db25maWcoe2F0dHJpYnV0ZTpuLmF0dHJpYnV0ZX0saV8ocl8oe30sYSkse2F0dHJpYnV0ZUNvbmZpZ3VyYWJsZTohMH0pLHt9KSk/dm9pZCAwOnUuc3Ryb2tlLHk9KCh7dmlld0RhdGFQb2ludExpc3Q6dCxwb2ludENsb3VkQm94OmUsZGVmYXVsdFZpZXdTdHlsZTpuLHN0cm9rZTpyfSk9PnQ/dC5tYXAoKHQ9Pih7dHlwZTp0LnR5cGUsYW5ub3RhdGlvbjppXyhyXyh7aWQ6ZS5pZCxwb2ludExpc3Q6dC5wb2ludExpc3R9LG4pLHtzdHJva2U6cn0pfSkpKTpbXSkoe3ZpZXdEYXRhUG9pbnRMaXN0OmgscG9pbnRDbG91ZEJveDpuLGRlZmF1bHRWaWV3U3R5bGU6bCxzdHJva2U6Z30pLG09Wy4uLmUsLi4ueV07cmV0dXJuKG51bGw9PWY/dm9pZCAwOmYubGVuZ3RoKT4wJiZtLnVuc2hpZnQoe3R5cGU6InBvbHlnb24iLGFubm90YXRpb246aV8ocl8oe2lkOmkscG9pbnRMaXN0OmZ9LGwpLHtzdHJva2U6ZyxmaWxsOiJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNikifSl9KSxtfSksW10pLGc9c1tudWxsIT0oZT1udWxsPT10P3ZvaWQgMDp0LnBhdGgpP2U6IiJdO2cmJkh2LmlzTnVtYmVyKG51bGw9PShuPW51bGw9PXQ/dm9pZCAwOnQuY2FsaWIpP3ZvaWQgMDpuLmdyb3VuZEhlaWdodCkmJnUuZm9yRWFjaCgoZT0+e2NvbnN0IG49ZnVuY3Rpb24odCxlLG4pe3ZhciByO2lmKCFlfHwhbilyZXR1cm47Y29uc3QgaT1qdihlKSx7UDpvLFI6cyxUOmF9PWU7bGV0IHU7aWYoITE9PT1pKXtjb25zdHtjb21wb3NlTWF0cml4NDp0fT1udWxsIT0ocj1rdihvLHMsYSkpP3I6e307aWYoIXQpcmV0dXJuO3U9dH1jb25zdCBjPVtdO3JldHVybiB0LmZvckVhY2goKHQ9PntsZXQgbjtpZihuPWk/VXYodCxlKTp1JiZxdih0LHUpLG4pe2NvbnN0e3g6dCx5OmV9PW47Yy5wdXNoKHt4OnQseTplfSl9fSkpLGMuc29tZSgodD0+dC54PjAmJnQueDxuLndpZHRoJiZ0Lnk+MCYmdC55PG4uaGVpZ2h0KSk/Yzp2b2lkIDB9KGUucG9pbnRMaXN0Lm1hcCgoZT0+e3ZhciBuO3JldHVybiBpXyhyXyh7fSxlKSx7ejpudWxsPT0obj1udWxsPT10P3ZvaWQgMDp0LmNhbGliKT92b2lkIDA6bi5ncm91bmRIZWlnaHR9KX0pKSxudWxsPT10P3ZvaWQgMDp0LmNhbGliLGcpO2lmKG4pe2NvbnN0IHQ9RnQuZ2V0Q29sb3JGcm9tQ29uZmlnKHthdHRyaWJ1dGU6ZS5hdHRyaWJ1dGV9LGlfKHJfKHt9LGEpLHthdHRyaWJ1dGVDb25maWd1cmFibGU6ITB9KSx7fSk7ZC5wdXNoKHt0eXBlOiJwb2x5Z29uIixhbm5vdGF0aW9uOmlfKHJfKHtpZDplLmlkLHBvaW50TGlzdDpufSxsKSx7c3Ryb2tlOm51bGw9PXQ/dm9pZCAwOnQuc3Ryb2tlLGZpbGw6Yy5pbmNsdWRlcyhlLmlkKT9udWxsPT10P3ZvaWQgMDp0LmZpbGw6InJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSJ9KX0pfX0pKSxoLnB1c2goe2Fubm90YXRpb25zOmQsdXJsOm51bGw9PXQ/dm9pZCAwOnQudXJsLGZhbGxiYWNrVXJsOm51bGwhPShmPW51bGw9PXQ/dm9pZCAwOnQuZmFsbGJhY2tVcmwpP2Y6IiIsY2FsTmFtZTpudWxsPT0ocD1udWxsPT10P3ZvaWQgMDp0LmNhbGliKT92b2lkIDA6cC5jYWxOYW1lLGNhbGliOm51bGw9PXQ/dm9pZCAwOnQuY2FsaWIscGF0aDpudWxsPT10P3ZvaWQgMDp0LnBhdGh9KX0pKSxofW9ubWVzc2FnZT10PT57Y29uc3R7Y3VycmVudERhdGE6ZSxkaXNwbGF5UG9pbnRDbG91ZExpc3Q6bixzZWxlY3RlZElEOnIsaGlnaGxpZ2h0QXR0cmlidXRlOmksaW1hZ2VTaXplczpvLGNvbmZpZzpzLHBvbHlnb25MaXN0OmEsc2VsZWN0ZWRJRHM6dX09dC5kYXRhLGM9b18oe2N1cnJlbnREYXRhOmUsZGlzcGxheVBvaW50Q2xvdWRMaXN0Om4sc2VsZWN0ZWRJRDpyLGhpZ2hsaWdodEF0dHJpYnV0ZTppLGltYWdlU2l6ZXM6byxjb25maWc6cyxwb2x5Z29uTGlzdDphLHNlbGVjdGVkSURzOnV9KTtwb3N0TWVzc2FnZShjKX19KCk7Cgo=",null,!1);export{l as default};
|
|
1
|
+
import{createBase64WorkerFactory as b}from"./_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js";var l=b("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24oTCxQLFYpeyJ1c2Ugc3RyaWN0Ijtjb25zdCB6PWk9PntsZXQgdD1JbmZpbml0eSxuPUluZmluaXR5LG89LUluZmluaXR5LHI9LUluZmluaXR5O2Zvcihjb25zdCBsIG9mIGkpdD1NYXRoLm1pbih0LGwueCksbj1NYXRoLm1pbihuLGwueSksbz1NYXRoLm1heChvLGwueCkscj1NYXRoLm1heChyLGwueSk7cmV0dXJue3g6dCx5Om4sd2lkdGg6by10LGhlaWdodDpyLW59fSxGPSgoKT0+e2NvbnN0IGk9KHQsbik9Pntjb25zdCBvPU1hdGgubWF4KHQueCxuLngpLHI9TWF0aC5tYXgodC55LG4ueSksbD1NYXRoLm1pbih0LngrdC53aWR0aCxuLngrbi53aWR0aCksZD1NYXRoLm1pbih0LnkrdC5oZWlnaHQsbi55K24uaGVpZ2h0KSx1PWwtbyxnPWQtcjtyZXR1cm4gdT49MCYmZz49MD97eDpvLHk6cix3aWR0aDp1LGhlaWdodDpnfTpudWxsfTtyZXR1cm4odCxuLG8pPT57aWYob1tuXSl7Y29uc3Qgcj1vW25dLndpZHRoLGw9b1tuXS5oZWlnaHQ7cmV0dXJuIGkodCx7eDowLHk6MCx3aWR0aDpyLGhlaWdodDpsfSkhPT1udWxsfXJldHVybiExfX0pKCk7dmFyIFU9T2JqZWN0LmRlZmluZVByb3BlcnR5LFg9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsWT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxPPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsVz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHE9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSx4PShpLHQsbik9PnQgaW4gaT9VKGksdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOmlbdF09bixjPShpLHQpPT57Zm9yKHZhciBuIGluIHR8fCh0PXt9KSlXLmNhbGwodCxuKSYmeChpLG4sdFtuXSk7aWYoTylmb3IodmFyIG4gb2YgTyh0KSlxLmNhbGwodCxuKSYmeChpLG4sdFtuXSk7cmV0dXJuIGl9LGE9KGksdCk9PlgoaSxZKHQpKTtjb25zdCBHPSh7dmlld0RhdGFQb2ludExpc3Q6aSxwb2ludENsb3VkQm94OnQsZGVmYXVsdFZpZXdTdHlsZTpuLHN0cm9rZTpvfSk9Pmk/aS5tYXAocj0+KHt0eXBlOnIudHlwZSxhbm5vdGF0aW9uOmEoYyh7aWQ6dC5pZCxwb2ludExpc3Q6ci5wb2ludExpc3R9LG4pLHtzdHJva2U6b30pfSkpOltdO2Z1bmN0aW9uIEooaSl7dmFyIHQ7Y29uc3R7Y3VycmVudERhdGE6bixkaXNwbGF5UG9pbnRDbG91ZExpc3Q6byxzZWxlY3RlZElEOnIsaGlnaGxpZ2h0QXR0cmlidXRlOmwsaW1hZ2VTaXplczpkLGNvbmZpZzp1LHBvbHlnb25MaXN0Omcsc2VsZWN0ZWRJRHM6bX09aSx3PXtmaWxsOiJ0cmFuc3BhcmVudCIsY29sb3I6ImdyZWVuIn07bGV0IHA9W107cmV0dXJuKHQ9bj09bnVsbD92b2lkIDA6bi5tYXBwaW5nSW1nTGlzdCk9PW51bGx8fHQuZm9yRWFjaChlPT57dmFyIE0sUixDLEE7Y29uc3QgUz1vLnJlZHVjZSgoZixoKT0+e3ZhciB2LHM7Y29uc3QgeT1oLmlkPT09cnx8bD09PWguYXR0cmlidXRlLHt0cmFuc2ZlclZpZXdEYXRhOkksdmlld1JhbmdlUG9pbnRMaXN0OmJ9PSh2PVAucG9pbnRDbG91ZExpZGFyMmltYWdlKGgsZS5jYWxpYix7Y3JlYXRlUmFuZ2U6eX0pKSE9bnVsbD92Ont9O2lmKCFJfHwhYilyZXR1cm5bXTtjb25zdCBLPUkucmVkdWNlKChFLEgpPT5ILnR5cGU9PT0ibGluZSI/Wy4uLkUsLi4uSC5wb2ludExpc3RdOkUsW10pLFE9YShjKHt9LHooSykpLHtpbWFnZU5hbWU6ZS5wYXRofSk7aWYoIUYoUSxlLnBhdGgsZCkpcmV0dXJuIGY7Y29uc3Qgaj0ocz1MLnRvb2xTdHlsZUNvbnZlcnRlci5nZXRDb2xvckZyb21Db25maWcoe2F0dHJpYnV0ZTpoLmF0dHJpYnV0ZX0sYShjKHt9LHUpLHthdHRyaWJ1dGVDb25maWd1cmFibGU6ITB9KSx7fSkpPT1udWxsP3ZvaWQgMDpzLnN0cm9rZSxUPUcoe3ZpZXdEYXRhUG9pbnRMaXN0OkkscG9pbnRDbG91ZEJveDpoLGRlZmF1bHRWaWV3U3R5bGU6dyxzdHJva2U6an0pLGs9Wy4uLmYsLi4uVF07cmV0dXJuKGI9PW51bGw/dm9pZCAwOmIubGVuZ3RoKT4wJiZrLnVuc2hpZnQoe3R5cGU6InBvbHlnb24iLGFubm90YXRpb246YShjKHtpZDpyLHBvaW50TGlzdDpifSx3KSx7c3Ryb2tlOmosZmlsbDoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpIn0pfSksa30sW10pLE49ZFsoTT1lPT1udWxsP3ZvaWQgMDplLnBhdGgpIT1udWxsP006IiJdO04mJlYuaXNOdW1iZXIoKFI9ZT09bnVsbD92b2lkIDA6ZS5jYWxpYik9PW51bGw/dm9pZCAwOlIuZ3JvdW5kSGVpZ2h0KSYmZy5mb3JFYWNoKGY9Pntjb25zdCBoPWYucG9pbnRMaXN0Lm1hcChzPT57dmFyIHk7cmV0dXJuIGEoYyh7fSxzKSx7ejooeT1lPT1udWxsP3ZvaWQgMDplLmNhbGliKT09bnVsbD92b2lkIDA6eS5ncm91bmRIZWlnaHR9KX0pLHY9UC5wb2ludExpc3RMaWRhcjJJbWcoaCxlPT1udWxsP3ZvaWQgMDplLmNhbGliLE4pO2lmKHYpe2NvbnN0IHM9TC50b29sU3R5bGVDb252ZXJ0ZXIuZ2V0Q29sb3JGcm9tQ29uZmlnKHthdHRyaWJ1dGU6Zi5hdHRyaWJ1dGV9LGEoYyh7fSx1KSx7YXR0cmlidXRlQ29uZmlndXJhYmxlOiEwfSkse30pO1MucHVzaCh7dHlwZToicG9seWdvbiIsYW5ub3RhdGlvbjphKGMoe2lkOmYuaWQscG9pbnRMaXN0OnZ9LHcpLHtzdHJva2U6cz09bnVsbD92b2lkIDA6cy5zdHJva2UsZmlsbDptLmluY2x1ZGVzKGYuaWQpP3M9PW51bGw/dm9pZCAwOnMuZmlsbDoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpIn0pfSl9fSkscC5wdXNoKHthbm5vdGF0aW9uczpTLHVybDplPT1udWxsP3ZvaWQgMDplLnVybCxmYWxsYmFja1VybDooQz1lPT1udWxsP3ZvaWQgMDplLmZhbGxiYWNrVXJsKSE9bnVsbD9DOiIiLGNhbE5hbWU6KEE9ZT09bnVsbD92b2lkIDA6ZS5jYWxpYik9PW51bGw/dm9pZCAwOkEuY2FsTmFtZSxjYWxpYjplPT1udWxsP3ZvaWQgMDplLmNhbGliLHBhdGg6ZT09bnVsbD92b2lkIDA6ZS5wYXRofSl9KSxwfW9ubWVzc2FnZT1pPT57Y29uc3R7Y3VycmVudERhdGE6dCxkaXNwbGF5UG9pbnRDbG91ZExpc3Q6bixzZWxlY3RlZElEOm8saGlnaGxpZ2h0QXR0cmlidXRlOnIsaW1hZ2VTaXplczpsLGNvbmZpZzpkLHBvbHlnb25MaXN0OnUsc2VsZWN0ZWRJRHM6Z309aS5kYXRhLG09Sih7Y3VycmVudERhdGE6dCxkaXNwbGF5UG9pbnRDbG91ZExpc3Q6bixzZWxlY3RlZElEOm8saGlnaGxpZ2h0QXR0cmlidXRlOnIsaW1hZ2VTaXplczpsLGNvbmZpZzpkLHBvbHlnb25MaXN0OnUsc2VsZWN0ZWRJRHM6Z30pO3Bvc3RNZXNzYWdlKG0pfX0pKGxiVXRpbHMsbGJBbm5vdGF0aW9uLF8pOwoK",null,!1);export{l as default};
|