@labelbee/lb-components 1.23.0-alpha.12 → 1.23.0-alpha.120
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/App.js +1 -1
- package/dist/_virtual/2DViewWorker.js +1 -0
- package/dist/_virtual/highlightSegmentWorker.js +1 -1
- package/dist/assets/annotation/icon_link.svg.js +1 -0
- package/dist/assets/annotation/icon_unlink.svg.js +1 -0
- package/dist/assets/annotation/pointCloudTool/Image2DBoxScale.svg.js +1 -0
- package/dist/assets/annotation/pointCloudTool/leftArrow.svg.js +1 -1
- package/dist/assets/annotation/pointCloudTool/rightArrow.svg.js +1 -1
- package/dist/assets/annotation/pointCloudTool/rotate90_black.svg.js +1 -0
- package/dist/assets/icons/ad33251.svg +26 -0
- package/dist/components/AnnotationView/index.js +1 -1
- package/dist/components/DynamicResizer/DynamicResizer.js +1 -0
- package/dist/components/DynamicResizer/assets/bottomToZero.svg.js +1 -0
- package/dist/components/DynamicResizer/assets/divider.svg.js +1 -0
- package/dist/components/DynamicResizer/assets/topToZero.svg.js +1 -0
- package/dist/components/DynamicResizer/hooks/useDrag.js +1 -0
- package/dist/components/DynamicResizer/hooks/useUpdateHeight.js +1 -0
- package/dist/components/DynamicResizer/index.js +1 -0
- package/dist/components/LLMToolView/index.js +1 -1
- package/dist/components/LLMToolView/questionView/components/header/index.js +1 -1
- package/dist/components/LLMToolView/questionView/components/imgView/index.js +1 -1
- package/dist/components/LLMToolView/sidebar/components/textEditor/index.js +2 -2
- package/dist/components/LLMToolView/sidebar/components/textEditor/index.module.scss.js +1 -1
- package/dist/components/LLMToolView/sidebar/components/textInputBox/index.js +2 -2
- package/dist/components/LLMToolView/sidebar/index.js +1 -1
- package/dist/components/LLMToolView/utils/data.js +1 -1
- package/dist/components/audioAnnotate/audioContext/index.js +1 -1
- package/dist/components/audioAnnotate/audioSide/clipSidebar/index.js +2 -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/audioAnnotate/utils/dataTransform.js +1 -0
- package/dist/components/audioPlayer/clipRegion/index.js +1 -1
- package/dist/components/audioPlayer/index.js +1 -1
- package/dist/components/audioPlayer/useAudioCombine/index.js +3 -2
- package/dist/components/audioPlayer/useAudioScroll/index.js +1 -1
- package/dist/components/audioPlayer/useAudioSegment/index.js +1 -1
- package/dist/components/audioPlayer/zoomSlider/index.js +1 -1
- package/dist/components/longText/index.js +1 -1
- package/dist/components/pointCloud2DRectOperationView/index.js +1 -1
- package/dist/components/pointCloud2DRectOperationView/useUpdateRectList.js +1 -0
- package/dist/components/pointCloud2DRectOperationView/util.js +1 -0
- package/dist/components/pointCloudView/PointCloud2DSingleView.js +1 -1
- package/dist/components/pointCloudView/PointCloud2DView.js +1 -1
- package/dist/components/pointCloudView/PointCloud3DView.js +1 -1
- package/dist/components/pointCloudView/PointCloudBackView.js +1 -1
- package/dist/components/pointCloudView/PointCloudContext.js +1 -1
- package/dist/components/pointCloudView/PointCloudInfos.js +1 -1
- package/dist/components/pointCloudView/PointCloudLayout.js +1 -1
- package/dist/components/pointCloudView/PointCloudListener.js +1 -1
- package/dist/components/pointCloudView/PointCloudSegment2DView.js +1 -1
- package/dist/components/pointCloudView/PointCloudSegmentListener.js +1 -1
- package/dist/components/pointCloudView/PointCloudSideView.js +1 -1
- package/dist/components/pointCloudView/PointCloudTopView.js +1 -1
- package/dist/components/pointCloudView/components/HighlightVisible/index.js +1 -1
- package/dist/components/pointCloudView/hooks/useBoxes.js +1 -1
- package/dist/components/pointCloudView/hooks/useDataLinkSwitch.js +1 -0
- package/dist/components/pointCloudView/hooks/useHighlight.js +1 -1
- package/dist/components/pointCloudView/hooks/useHistory.js +1 -1
- package/dist/components/pointCloudView/hooks/usePointCloudViews.js +1 -1
- package/dist/components/pointCloudView/hooks/usePolygon.js +1 -1
- package/dist/components/pointCloudView/hooks/useRotate.js +1 -1
- package/dist/components/pointCloudView/hooks/useRotateEdge.js +1 -0
- package/dist/components/pointCloudView/hooks/useSingleBox.js +1 -1
- package/dist/components/pointCloudView/hooks/useStatus.js +1 -1
- package/dist/components/pointCloudView/hooks/useTimeoutFunc.js +1 -0
- package/dist/components/pointCloudView/hooks/useWindowKeydownListener.js +1 -0
- package/dist/components/pointCloudView/index.js +1 -1
- package/dist/components/pointCloudView/utils/event-polyfill.js +1 -0
- package/dist/components/pointCloudView/utils/map.js +1 -0
- package/dist/components/predictTracking/predictTrackingIcon/index.js +1 -1
- package/dist/components/predictTracking/previewResult/index.js +1 -1
- package/dist/components/subAttributeList/index.js +1 -0
- package/dist/components/videoAnnotate/videoClipTool/index.js +1 -1
- package/dist/components/videoAnnotate/videoTagTool/TagToolInstanceAdaptor.js +1 -1
- package/dist/hooks/useToolStyle.js +1 -0
- package/dist/index.css +161 -12
- package/dist/index.js +1 -1
- package/dist/store/Actions.js +1 -1
- package/dist/store/annotatedBox/index.js +1 -1
- package/dist/store/annotation/actionCreators.js +1 -1
- package/dist/store/annotation/reducer.js +1 -1
- package/dist/store/toolConfig/baseToolConfig.js +1 -0
- package/dist/store/toolConfig/index.js +1 -0
- package/dist/store/toolConfig/pointCloudToolConfig.js +1 -0
- package/dist/types/App.d.ts +6 -1
- package/dist/types/components/AnnotationView/index.d.ts +8 -0
- package/dist/types/components/DynamicResizer/DynamicResizer.d.ts +5 -0
- package/dist/types/components/DynamicResizer/hooks/useDrag.d.ts +12 -0
- package/dist/types/components/DynamicResizer/hooks/useUpdateHeight.d.ts +23 -0
- package/dist/types/components/DynamicResizer/index.d.ts +2 -0
- package/dist/types/components/DynamicResizer/types/interface.d.ts +17 -0
- package/dist/types/components/LLMToolView/utils/data.d.ts +1 -1
- package/dist/types/components/audioAnnotate/audioContext/index.d.ts +10 -2
- package/dist/types/components/audioAnnotate/textInput/index.d.ts +1 -0
- package/dist/types/components/audioAnnotate/utils/dataTransform.d.ts +9 -0
- package/dist/types/components/audioPlayer/clipRegion/index.d.ts +1 -0
- package/dist/types/components/audioPlayer/index.d.ts +28 -21
- package/dist/types/components/audioPlayer/zoomSlider/index.d.ts +1 -0
- package/dist/types/components/longText/index.d.ts +1 -0
- package/dist/types/components/pointCloud2DRectOperationView/index.d.ts +1 -0
- package/dist/types/components/pointCloud2DRectOperationView/useUpdateRectList.d.ts +2 -0
- package/dist/types/components/pointCloud2DRectOperationView/util.d.ts +8 -0
- package/dist/types/components/pointCloudView/2DViewWorker.d.ts +1 -0
- package/dist/types/components/pointCloudView/PointCloud2DView.d.ts +2 -1
- package/dist/types/components/pointCloudView/PointCloudContext.d.ts +28 -4
- package/dist/types/components/pointCloudView/PointCloudLayout.d.ts +1 -0
- package/dist/types/components/pointCloudView/PointCloudListener.d.ts +1 -0
- package/dist/types/components/pointCloudView/components/HighlightVisible/index.d.ts +2 -1
- package/dist/types/components/pointCloudView/hooks/useBoxes.d.ts +5 -3
- package/dist/types/components/pointCloudView/hooks/useDataLinkSwitch.d.ts +19 -0
- package/dist/types/components/pointCloudView/hooks/useHighlight.d.ts +1 -1
- package/dist/types/components/pointCloudView/hooks/usePointCloudViews.d.ts +13 -1
- package/dist/types/components/pointCloudView/hooks/useRotateEdge.d.ts +9 -0
- package/dist/types/components/pointCloudView/hooks/useSingleBox.d.ts +3 -2
- package/dist/types/components/pointCloudView/hooks/useTimeoutFunc.d.ts +6 -0
- package/dist/types/components/pointCloudView/hooks/useWindowKeydownListener.d.ts +16 -0
- package/dist/types/components/pointCloudView/index.d.ts +1 -0
- package/dist/types/components/pointCloudView/utils/event-polyfill.d.ts +8 -0
- package/dist/types/components/pointCloudView/utils/map.d.ts +11 -0
- package/dist/types/components/subAttributeList/index.d.ts +10 -0
- package/dist/types/components/videoAnnotate/index.d.ts +2 -1
- package/dist/types/components/videoAnnotate/videoClipTool/index.d.ts +2 -1
- package/dist/types/components/videoAnnotate/videoTagTool/TagToolInstanceAdaptor.d.ts +1 -1
- package/dist/types/hooks/useToolStyle.d.ts +30 -0
- package/dist/types/index.d.ts +8 -2
- package/dist/types/store/Actions.d.ts +1 -0
- package/dist/types/store/annotatedBox/index.d.ts +2 -0
- package/dist/types/store/annotation/actionCreators.d.ts +4 -3
- package/dist/types/store/annotation/reducer.d.ts +1 -0
- package/dist/types/store/annotation/types.d.ts +9 -2
- package/dist/types/store/toolConfig/baseToolConfig.d.ts +4 -0
- package/dist/types/store/toolConfig/index.d.ts +3 -0
- package/dist/types/store/toolConfig/pointCloudToolConfig.d.ts +4 -0
- package/dist/types/store/toolConfig/types.d.ts +10 -0
- package/dist/types/utils/AnnotationDataUtils.d.ts +58 -1
- package/dist/types/utils/ToolPointCloudBoxRenderHelper.d.ts +23 -0
- package/dist/types/utils/index.d.ts +31 -1
- package/dist/types/views/MainView/sidebar/GeneralOperation/ActionsConfirm.d.ts +1 -0
- package/dist/types/views/MainView/sidebar/PointCloudToolSidebar/components/firstFrameDataSwitch/index.d.ts +3 -0
- package/dist/types/views/MainView/sidebar/PointCloudToolSidebar/components/rectRotateSensitivitySlider/index.d.ts +3 -0
- package/dist/types/views/MainView/sidebar/PointCloudToolSidebar/components/selectBoxVisibleSwitch/index.d.ts +3 -0
- package/dist/types/views/MainView/sidebar/TextToolSidebar/index.d.ts +1 -1
- package/dist/types/views/MainView/toolFooter/BatchSwitchConnectIn2DView/BatchSwitchConnectIn2DView.d.ts +9 -0
- package/dist/types/views/MainView/toolFooter/BatchSwitchConnectIn2DView/Icons.d.ts +3 -0
- package/dist/types/views/MainView/toolFooter/BatchSwitchConnectIn2DView/index.d.ts +1 -0
- package/dist/types/views/MainView/toolFooter/SwitchCuboidBoxIn2DView/index.d.ts +10 -2
- package/dist/types/views/MainView/toolFooter/index.d.ts +1 -1
- package/dist/types/views/MainView/toolHeader/StepSwitch/index.d.ts +1 -1
- package/dist/types/views/MainView/toolHeader/index.d.ts +1 -1
- package/dist/utils/AnnotationDataUtils.js +1 -1
- package/dist/utils/ToolPointCloudBoxRenderHelper.js +1 -0
- package/dist/utils/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/PointCloudToolSidebar/components/firstFrameDataSwitch/index.js +1 -0
- package/dist/views/MainView/sidebar/PointCloudToolSidebar/components/firstFrameDataSwitch/index.module.scss.js +1 -0
- package/dist/views/MainView/sidebar/PointCloudToolSidebar/components/rectRotateSensitivitySlider/index.js +1 -0
- package/dist/views/MainView/sidebar/PointCloudToolSidebar/components/rectRotateSensitivitySlider/index.module.scss.js +1 -0
- package/dist/views/MainView/sidebar/PointCloudToolSidebar/components/selectBoxVisibleSwitch/index.js +1 -0
- package/dist/views/MainView/sidebar/PointCloudToolSidebar/components/selectBoxVisibleSwitch/index.module.scss.js +1 -0
- package/dist/views/MainView/sidebar/PointCloudToolSidebar/index.js +1 -1
- package/dist/views/MainView/sidebar/TagSidebar/index.js +1 -1
- package/dist/views/MainView/sidebar/TextToolSidebar/index.js +1 -1
- package/dist/views/MainView/toolFooter/BatchSwitchConnectIn2DView/BatchSwitchConnectIn2DView.js +1 -0
- package/dist/views/MainView/toolFooter/BatchSwitchConnectIn2DView/Icons.js +1 -0
- package/dist/views/MainView/toolFooter/FooterTips/ToolHotKey/pointCloud/index.js +1 -1
- package/dist/views/MainView/toolFooter/SwitchCuboidBoxIn2DView/index.js +1 -1
- package/dist/views/MainView/toolFooter/index.js +1 -1
- package/dist/views/MainView/toolHeader/index.js +1 -1
- package/es/App.js +1 -1
- package/es/_virtual/2DViewWorker.js +1 -0
- package/es/_virtual/highlightSegmentWorker.js +1 -1
- package/es/assets/annotation/icon_link.svg.js +1 -0
- package/es/assets/annotation/icon_unlink.svg.js +1 -0
- package/es/assets/annotation/pointCloudTool/Image2DBoxScale.svg.js +1 -0
- package/es/assets/annotation/pointCloudTool/leftArrow.svg.js +1 -1
- package/es/assets/annotation/pointCloudTool/rightArrow.svg.js +1 -1
- package/es/assets/annotation/pointCloudTool/rotate90_black.svg.js +1 -0
- package/es/components/AnnotationView/index.js +1 -1
- package/es/components/DynamicResizer/DynamicResizer.js +1 -0
- package/es/components/DynamicResizer/assets/bottomToZero.svg.js +1 -0
- package/es/components/DynamicResizer/assets/divider.svg.js +1 -0
- package/es/components/DynamicResizer/assets/topToZero.svg.js +1 -0
- package/es/components/DynamicResizer/hooks/useDrag.js +1 -0
- package/es/components/DynamicResizer/hooks/useUpdateHeight.js +1 -0
- package/es/components/DynamicResizer/index.js +1 -0
- package/es/components/LLMToolView/index.js +1 -1
- package/es/components/LLMToolView/questionView/components/header/index.js +1 -1
- package/es/components/LLMToolView/questionView/components/imgView/index.js +1 -1
- package/es/components/LLMToolView/sidebar/components/textEditor/index.js +2 -2
- package/es/components/LLMToolView/sidebar/components/textEditor/index.module.scss.js +1 -1
- package/es/components/LLMToolView/sidebar/components/textInputBox/index.js +2 -2
- package/es/components/LLMToolView/sidebar/index.js +1 -1
- package/es/components/LLMToolView/utils/data.js +1 -1
- package/es/components/audioAnnotate/audioContext/index.js +1 -1
- package/es/components/audioAnnotate/audioSide/clipSidebar/index.js +2 -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/audioAnnotate/utils/dataTransform.js +1 -0
- package/es/components/audioPlayer/clipRegion/index.js +1 -1
- package/es/components/audioPlayer/index.js +1 -1
- package/es/components/audioPlayer/useAudioCombine/index.js +3 -2
- package/es/components/audioPlayer/useAudioScroll/index.js +1 -1
- package/es/components/audioPlayer/useAudioSegment/index.js +1 -1
- package/es/components/audioPlayer/zoomSlider/index.js +1 -1
- package/es/components/longText/index.js +1 -1
- package/es/components/pointCloud2DRectOperationView/index.js +1 -1
- package/es/components/pointCloud2DRectOperationView/useUpdateRectList.js +1 -0
- package/es/components/pointCloud2DRectOperationView/util.js +1 -0
- package/es/components/pointCloudView/PointCloud2DSingleView.js +1 -1
- package/es/components/pointCloudView/PointCloud2DView.js +1 -1
- package/es/components/pointCloudView/PointCloud3DView.js +1 -1
- package/es/components/pointCloudView/PointCloudBackView.js +1 -1
- package/es/components/pointCloudView/PointCloudContext.js +1 -1
- package/es/components/pointCloudView/PointCloudInfos.js +1 -1
- package/es/components/pointCloudView/PointCloudLayout.js +1 -1
- package/es/components/pointCloudView/PointCloudListener.js +1 -1
- package/es/components/pointCloudView/PointCloudSegment2DView.js +1 -1
- package/es/components/pointCloudView/PointCloudSegmentListener.js +1 -1
- package/es/components/pointCloudView/PointCloudSideView.js +1 -1
- package/es/components/pointCloudView/PointCloudTopView.js +1 -1
- package/es/components/pointCloudView/components/HighlightVisible/index.js +1 -1
- package/es/components/pointCloudView/hooks/useBoxes.js +1 -1
- package/es/components/pointCloudView/hooks/useDataLinkSwitch.js +1 -0
- package/es/components/pointCloudView/hooks/useHighlight.js +1 -1
- package/es/components/pointCloudView/hooks/useHistory.js +1 -1
- package/es/components/pointCloudView/hooks/usePointCloudViews.js +1 -1
- package/es/components/pointCloudView/hooks/usePolygon.js +1 -1
- package/es/components/pointCloudView/hooks/useRotate.js +1 -1
- package/es/components/pointCloudView/hooks/useRotateEdge.js +1 -0
- package/es/components/pointCloudView/hooks/useSingleBox.js +1 -1
- package/es/components/pointCloudView/hooks/useStatus.js +1 -1
- package/es/components/pointCloudView/hooks/useTimeoutFunc.js +1 -0
- package/es/components/pointCloudView/hooks/useWindowKeydownListener.js +1 -0
- package/es/components/pointCloudView/index.js +1 -1
- package/es/components/pointCloudView/utils/event-polyfill.js +1 -0
- package/es/components/pointCloudView/utils/map.js +1 -0
- package/es/components/predictTracking/predictTrackingIcon/index.js +1 -1
- package/es/components/predictTracking/previewResult/index.js +1 -1
- package/es/components/subAttributeList/index.js +1 -0
- package/es/components/videoAnnotate/videoClipTool/index.js +1 -1
- package/es/components/videoAnnotate/videoTagTool/TagToolInstanceAdaptor.js +1 -1
- package/es/hooks/useToolStyle.js +1 -0
- package/es/index.css +161 -12
- package/es/index.js +1 -1
- package/es/store/Actions.js +1 -1
- package/es/store/annotatedBox/index.js +1 -1
- package/es/store/annotation/actionCreators.js +1 -1
- package/es/store/annotation/reducer.js +1 -1
- package/es/store/toolConfig/baseToolConfig.js +1 -0
- package/es/store/toolConfig/index.js +1 -0
- package/es/store/toolConfig/pointCloudToolConfig.js +1 -0
- package/es/utils/AnnotationDataUtils.js +1 -1
- package/es/utils/ToolPointCloudBoxRenderHelper.js +1 -0
- package/es/utils/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/PointCloudToolSidebar/components/firstFrameDataSwitch/index.js +1 -0
- package/es/views/MainView/sidebar/PointCloudToolSidebar/components/firstFrameDataSwitch/index.module.scss.js +1 -0
- package/es/views/MainView/sidebar/PointCloudToolSidebar/components/rectRotateSensitivitySlider/index.js +1 -0
- package/es/views/MainView/sidebar/PointCloudToolSidebar/components/rectRotateSensitivitySlider/index.module.scss.js +1 -0
- package/es/views/MainView/sidebar/PointCloudToolSidebar/components/selectBoxVisibleSwitch/index.js +1 -0
- package/es/views/MainView/sidebar/PointCloudToolSidebar/components/selectBoxVisibleSwitch/index.module.scss.js +1 -0
- package/es/views/MainView/sidebar/PointCloudToolSidebar/index.js +1 -1
- package/es/views/MainView/sidebar/TagSidebar/index.js +1 -1
- package/es/views/MainView/sidebar/TextToolSidebar/index.js +1 -1
- package/es/views/MainView/toolFooter/BatchSwitchConnectIn2DView/BatchSwitchConnectIn2DView.js +1 -0
- package/es/views/MainView/toolFooter/BatchSwitchConnectIn2DView/Icons.js +1 -0
- package/es/views/MainView/toolFooter/FooterTips/ToolHotKey/pointCloud/index.js +1 -1
- package/es/views/MainView/toolFooter/SwitchCuboidBoxIn2DView/index.js +1 -1
- package/es/views/MainView/toolHeader/index.js +1 -1
- package/package.json +6 -4
- package/dist/assets/annotation/pointCloudTool/rotate180_black.svg.js +0 -1
- package/dist/assets/icons/9d70807.svg +0 -5
- package/es/assets/annotation/pointCloudTool/rotate180_black.svg.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createBase64WorkerFactory as d}from"./_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js";var l=d("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgSWY9TWF0aC5wb3c7IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuKHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/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/IixDb25uZWN0OiJDb25uZWN0IixEaXNjb25uZWN0OiJkaXNjb25uZWN0IixJbWFnZTJEQm94U2NhbGU6IkltYWdlIDJEIEJveCBTY2FsZSIsU2VsZWN0ZWRSZWN0OiJTZWxlY3RlZCBSZWN0IixPbmx5TG9hZFRoZUZpcnN0RnJhbWVQcmVBbm5vdGF0aW9uOiJPbmx5IGxvYWQgdGhlIGZpcnN0IGZyYW1lIHByZSBhbm5vdGF0aW9uIixTZWxlY3RCb3hUb0Rpc3BsYXlJbmRlcGVuZGVudGx5OiJTZWxlY3QgYm94IHRvIGRpc3BsYXkgaW5kZXBlbmRlbnRseSIsU2VsZWN0Qm94U3dpdGNoVGlwczoiQWZ0ZXIgdHVybmluZyBvbiB0aGUgc3dpdGNoLCBzZWxlY3QgdGhlIGJveCBpbiB0aGUgdG9wIHZpZXcsIGFuZCB0aGUgaW1hZ2UgdmlldyB3aWxsIG9ubHkgZGlzcGxheSB0aGUgY29ycmVzcG9uZGluZyAyRCBib3gsIG1ha2luZyBpdCBlYXNpZXIgdG8gdmlldyB0aGUgY29ycmVzcG9uZGluZyByZWxhdGlvbnNoaXAgaW4gdGhlIHRvcCB2aWV3In0sZHQ9e1RleHRJbnB1dDoi5paH5pys6L6T5YWlIixBdHRyaWJ1dGU6IuS4u+WxnuaApyIsTm9BdHRyaWJ1dGU6IuaXoOWxnuaApyIsU2F2ZToi5L+d5a2YIixVbmRvOiLmkqTplIAiLFJlZG86IumHjeWBmiIsUm90YXRlOiLml4vovawiLFN0eWxlOiLmoLflvI8iLEFkanVzdDoi5Zu+54mH6LCD5pW0IixCb3JkZXJUaGlja25lc3M6Iui+ueahhueyl+e7hiIsQ29sb3I6IuminOiJsiIsQm9yZGVyT3BhY2l0eToi6L655qGG6YCP5piO5bqmIixGaWxsT3BhY2l0eToi5aGr5YWF6YCP5piO5bqmIixTYXR1cmF0aW9uOiLppbHlkozluqYiLENvbnRyYXN0OiLlr7nmr5TluqYiLEV4cG9zdXJlOiLmm53lhYnluqYiLFNjcmVlblJhdGlvOiLnlLvpnaLljaDmr5QiLE9yaWdpbmFsU2NhbGU6IuaMieWOn+WbvuavlOS+i+aYvuekuiIsQ29weVRoZVByZXZpb3VzOiLlpI3liLbkuIrlvKAiLENsZWFyTGFiZWw6Iua4heepuuagh+azqCIsU2V0QXNJbnZhbGlkOiLmoIfkuLrml6DmlYgiLFNldEFzVmFsaWQ6IuWPlua2iOaXoOaViCIsQ29uZmlybToi56Gu6K6kIixGaW5pc2g6IuWujOaIkCIsQ2FuY2VsOiLlj5bmtogiLEl0ZW1zT2ZUaGlzUGFnZToi5pys6aG15Lu25pWwIixIb3RrZXlzOiLlv6vmjbfplK4iLEFubm90YXRlUmVjdDoi5ouJ5qGGIixBbm5vdGF0ZUludmFsaWRSZWN0OiLmi4nml6DmlYjmoYYiLFNlbGVjdFJlY3Q6IumAieS4reahhiIsUmlnaHRDbGljazoi5Y+z5Ye7IixUb2dnbGVSZWN0RWZmZWN0aXZlbmVzczoi5YiH5o2i5qGG5piv5ZCm5pyJ5pWIIixUb2dnbGVFZmZlY3RpdmVuZXNzOiLmmK/lkKbmoIfkuLrml6DmlYgiLERlbGV0ZVJlY3Q6IuWIoOmZpOahhiIsU2VsZWN0QW5kRG91YmxlQ2xpY2s6IumAieS4reWPjOWHuyIsU2NhbGU6Iue8qeaUviIsRnVsbHNjcmVlbjoi5YWo5bGPIixQcmV2aW91c0ltYWdlOiLkuIrkuIDlvKAiLFByZXZpb3VzRmlsZToi5LiK5LiA5LiqIixOZXh0SW1hZ2U6IuS4i+S4gOW8oCIsTmV4dEZpbGU6IuS4i+S4gOS4qiIsUHJldmlvdXNGb2xkZXI6IuS4iuS4gOaWh+S7tuWkuSIsTmV4dEZvbGRlcjoi5LiL5LiA5paH5Lu25aS5IixEcmFnOiLmi5bliqjlm77niYciLFRvZ2dsZVNlbGVjdGVkOiLliIfmjaLpgInkuK0iLFRvZ2dsZVNlbGVjdGVkUmV2ZXJzZToi6YCG5bqP5YiH5o2i6YCJ5LitIixIaWRlR3JhcGhpY3M6IumakOiXj+WbvuW9oiIsVG9nZ2xlTGluZVBhcnRpY3VsYXJpdHk6IuaNoueJueauiui+uSIsVG9TaWRlOiLlr7novrkiLFNwZWNpZmllZEF0dHJpYnV0ZXNPbmx5OiLku4XnnIvmjIflrprlsZ7mgKciLE51bWJlcjoi5pWw5a2XIixQcmVzczoi6ZW/5oyJIixUb09yaWdpbmFsU3RlcDoi5LuF5Y6f5Zu+IixIb3Jpem9udGFsT3JWZXJ0aWNhbDoi5qCH5rC05bmzL+WeguebtOe6vyIsQW5ub3RhdGVJbnZhbGlkTGluZToi5qCH5peg5pWI57q/IixBbm5vdGF0ZUxpbmU6Iuagh+e6vyIsU2VsZWN0TGluZToi6YCJ5Lit57q/IixUb2dnbGVMaW5lRWZmZWN0aXZlbmVzczoi5YiH5o2i57q/5piv5ZCm5pyJ5pWIIixEZWxldGVMaW5lOiLliKDpmaTnur8iLENvbnRpbnVlVG9MYWJlbDoi57ut5qCHIixTZWxlY3Q6IumAieS4rSIsSW5zZXJ0UG9pbnQ6IuaPkuWFpeeCuSIsQ2xpY2tPbkxpbmU6IuWvuee6v+WNleWHuyIsRGVsZXRlUG9pbnQ6IuWIoOmZpOeCuSIsRGJsQ2xpY2tPblBvaW50OiLlr7nngrnlj4zlh7siLFN0b3BBZHNvcnB0aW9uOiLmmoLlgZzlkLjpmYQiLFByZXZpb3VzTGluZToi5LiK5p2h57q/IixOZXh0TGluZToi5LiL5p2h57q/IixTZWxlY3RQb2ludDoi6YCJ5Lit54K5IixBbm5vdGF0ZUludmFsaWRQb2ludDoi5qCH5peg5pWI54K5IixBbm5vdGF0ZVBvaW50OiLmoIfngrkiLEFubm90YXRlUG9seWdvbjoi5qCH5aSa6L655b2iIixTZWxlY3RQb2x5Z29uOiLpgInkuK3lpJrovrnlvaIiLEFubm90YXRlSW52YWxpZFBvbHlnb246Iuagh+aXoOaViOWkmui+ueW9oiIsVG9nZ2xlUG9seWdvbkVmZmVjdGl2ZW5lc3M6IuWIh+aNouWkmui+ueW9ouaYr+WQpuacieaViCIsRGVsZXRlUG9seWdvbjoi5Yig6Zmk5aSa6L655b2iIixEZWxldGU6IuWIoOmZpCIsVG9nZ2xlUG9pbnRQYXJ0aWN1bGFyaXR5OiLmjaLnibnmrorngrkiLENyb3BPdmVybGFwQXJlYToi6KOB5Ymq6YeN5Y+g5Yy65Z+fIixTZWdtZW50YXRpb25SZWNvZ25pdGlvbjoi5YiG5Ymy6L6F5YqpIixTd2l0Y2hQYXR0ZXJuOiLliIfmjaLnu5jliLblvaLlvI8iLFRhZ2dpbmc6IuaJk+agh+etviIsSGlkZToi5omT5qCH562+IixUYWdnaW5nT3JBdHRyOiLmiZPmoIfnrb4v5bGe5oCnIixIaWRlRHJhd25Bbm5vdGF0aW9uOiLmoIfms6jpmpDol4/kuK0iLEJsdWU6IuiTnSIsQ3lhbjoi6Z2SIixHcmVlbjoi57u/IixZZWxsb3c6Ium7hCIsUGluazoi57KJIixTdGVwczoi5qCH5rOo5q2l6aqkIixFeHBvcnQ6IuWvvOWHuiIsTmV4dFN0ZXA6IuS4i+S4gOatpSIsU3RlcE5vdEZpbmlzaGVkTm90aWZ5OiLlvZPliY3mraXpqqTlrZjlnKjkuLrmnKrmoIfms6jov4fnmoTlm77niYfvvIzor7fmoIfms6jlrozmiJDlho3ngrnlh7vkuIvkuIDmraUiLGN1ckl0ZW1zOiLnrKx7e2N1cnJlbnR9fS97e3RvdGFsfX3liIbpobUiLFR1cm5QYWdlOiLnv7vpobUiLFN3aXRjaDoi5YiH5o2iIixFbXB0eVRleHRJbnB1dDoi5riF56m65paH5pys6L6T5YWlIixSZWd1bGFyRXhwSW5jb3JyZWN0bHk6Iuato+WImeihqOi+vuW8j+Whq+WGmemUmeivryIsTm9Db25maWd1cmF0aW9uOiLmmoLml6Dkv6Hmga/phY3nva4iLENsZWFyVGhpc09wdGlvbjoi5riF56m65q2k6YCJ6aG5IixSZXN0b3JlSW1hZ2VBdHRyaWJ1dGVzOiLov5jljp/lm77niYflsZ7mgKciLENvbmZpcm1Ubzoi56Gu6K6kIixyZWN0VG9vbDoi5qCH562+Iix0YWdUb29sOiLmoIfngrkiLHBvbHlnb25Ub29sOiLlpJrovrnlvaIiLGxpbmVUb29sOiLnur/mnaEiLHBvaW50VG9vbDoi5qCH54K5Iix0ZXh0VG9vbDoi5paH5pysIixTcGVlZDoi5YCN6YCfIixQbGF5UGF1c2U6IuaSreaUvi/mmoLlgZwiLEZhc3RGb3J3YXJkOiLlv6vov5siLFJld2luZDoi5b+r6YCAIix2aWRlb0ludmFsaWRBbmRTa2lwOiLml6DmlYjop4bpopHvvIzor7fot7Pov4ciLGltYWdlSW52YWxpZEFuZFNraXA6IuaXoOaViOWbvueJh++8jOivt+i3s+i/hyIsdmlkZW9FcnJvckFuZFJlbG9hZDoi6KeG6aKR5Yqg6L295aSx6LSlLCDor7fph43mlrDliqDovb0iLGltYWdlRXJyb3JBbmRSZWxvYWQ6IuWbvueJh+WKoOi9veWksei0pSwg6K+36YeN5paw5Yqg6L29Iixvck1hc2tBc0ludmFsaWQ6IiDmiJYg5bCG5YW25qCH5Li65peg5pWIIixDbGlja0Fub3RoZXJQb2x5Z29uOiLor7fngrnlh7vluIzmnJvlkIjlubbnmoTlpJrovrnlvaIiLFBvbHlnb25zVG9CZUNvbWJpbmVkTmVlZFRvQmVTZWxlY3RlZDoi6ZyA6KaB6YCJ5Lit6ZyA6KaB5ZCI5bm255qE5aSa6L655b2iIixDdXJ2ZU1vZGVEb2VzTm90U3VwcG9ydEN1dHRpbmc6Iuabsue6v+aooeW8j+aaguS4jeaUr+aMgeijgeWJqiIsQ29tYmluZVN1Y2Nlc3M6IuWQiOW5tuaIkOWKnyIsQ29tYmluaW5nRmFpbGVkTm90aWZ5OiLlkIjlubblpLHotKXvvIzor7fmo4Dmn6XmmK/lkKbkuKTkuKrlpJrovrnlvaLmmK/lkKbmnInnm7jkuqTvvIzmiJblpJrovrnlvaLlkIjlubbmmK/lkKblvaLmiJDmvI/nqboiLENvbWJpbmVPdmVybGFwQXJlYToi5ZCI5bm26YeN5Y+g5Yy65Z+fIixOb0RlcGVuZGVuY3k6IuivpeWbvueJh+aXoOmcgOagh+azqCIsVGV4dENoZWNrTnVtYmVyT25seToi6K+35oyJ5LuF5pWw5a2X55qE5qC85byP6L6T5YWlIixUZXh0Q2hlY2tFbmdsaXNoT25seToi6K+35oyJ5LuF6Iux5paH55qE5qC85byP6L6T5YWlIixUZXh0Q2hlY2tDdXN0b21Gb3JtYXQ6Iuivt+aMieimgeaxgueahOagvOW8j+i+k+WFpSIsRnJhbWluZ09mT2JqZWN0VG9CZURpdmlkZWQ6Iuivt+WFiOahhuWHuumcgOWIhuWJsueahOeJqeS9kyIsQ2xpY2tPblRhcmdldDoi6K+35Y2V5Ye755uu5qCH54mp5L2TIixTcGxpdHRpbmdBbGdvcml0aG1QcmVkaWN0aW9uOiLliIblibLnrpfms5XpooTmtYvkuK0uLi4iLCIyRFZpZXciOiIyROinhuWbviIsIjNEVmlldyI6IjNE6KeG5Zu+IixUb3BWaWV3OiLkv6/op4blm74iLFNpZGVWaWV3OiLkvqfop4blm74iLEJhY2tWaWV3OiLog4zop4blm74iLFNob3dBcnJvd3M6IuaYvuekuueureWktCIsTGVuZ3RoOiLplb8iLFdpZHRoOiLlrr0iLEhlaWdodDoi6auYIixSb3RhdGlvbl95OiLmnJ3lkJHop5IiLFBvaW50Q291bnQ6IueCueaVsCIsSW52YWxpZDoi5peg5pWIIixUYWc6Iuagh+etviIsU2VhcmNoVGFnOiLmkJzntKLmoIfnrb4iLFN1YkF0dHJpYnV0ZToi5Ymv5bGe5oCnIixQbGVhc2VTZWxlY3Q6Iuivt+mAieaLqSIsQ29weUVtcHR5SW5Qb2ludENsb3VkOiLlpI3liLblhoXlrrnkuLrnqbrvvIzor7fpgInmi6nlr7nlupTnmoTngrnkupHmlbDmja4iLFBhc3RlRW1wdHlJblBvaW50Q2xvdWQ6Iuivt+WFiOWkjeWItumcgOimgeeahOeCueS6keaVsOaNruWGjei/m+ihjOeymOi0tCIsSGFzRHVwbGljYXRlSUQ6IuWtmOWcqOmHjeWkjUlELOWkjeWItuWksei0pSIsSGFzRHVwbGljYXRlSURIZWFkZXI6IuWtmOWcqOagh+azqOahhiBJRCDph43lpI0iLEhhc0R1cGxpY2F0ZUlETXNnOiLlrZjlnKjmoIfms6jmoYYgSUQg6YeN5aSN55qE6Zeu6aKY77yM5piv5ZCm6KaB6KaG55uWPyIsQ29weVN1Y2Nlc3M6IuWkjeWItuaIkOWKn++8gSIsTG93ZXJMaW1pdFBvaW50c051bUluQm94OiLmoYbkvZPlhoXngrnmlbDkuI3lhYHorrjkvY7kuo4ge3tudW19fSDkuKoiLFBvaW50VGhpY2tuZXNzOiLngrnnmoTmmL7npLrnspfnu4YiLFJvdGF0ZUFyb3VuZENlbnRlclBvaW50OiLnu5XkuK3lv4Pngrnml4vovaznlLvpnaIiLFBvaW50Q2xvdWRWaWV3VHJhbnNsYXRlOiLngrnkupHlubPnp7siLFRvcFZpZXdUcmFuc2xhdGU6IuS/r+inhuWbvuW5s+enuyIsQ2hhbmdlUG9pbnRDbG91ZFZhbGlkOiLliIfmjaLngrnkupHmnInmlYjmgKciLExhc3NvU2VsZWN0b3I6IuWll+e0oiIsUmVjdFNlbGVjdG9yOiLmi4nmoYYiLFNlbGVjdG9yTXNnOiLlj7PplK7mi5bliqjov5vooYzojIPlm7Tojrflj5YiLEFkZFBvaW50OiLmt7vliqDngrkiLENpcmNsZVNlbGVjdG9yOiLpgInngrkiLERldGVjdGlvbk1vZGU6IuajgOa1i+aooeW8jyIsU2VnbWVudGF0aW9uTW9kZToi5YiG5Ymy5qih5byPIixFbnRlckVkaXRNb2RlOiLov5vlhaXnvJbovpEiLFNlbGVjdGVkUG9pbnRzOiLpgInkuK3ngrnmlbAiLENvcHlCb3g6IuWkjeWItuahhiIsUGFzdGVCb3g6IueymOi0tOahhiIsUm90YXRlTGVmdDoi5ZCR5bem5peL6L2s5b6u6LCDIixSb3RhdGVSaWdodDoi5ZCR5Y+z5peL6L2s5b6u6LCDIixQcmV2aW91c0JveDoi5LiK5LiA5qGGIixOZXh0Qm94OiLkuIvkuIDmoYYiLFJvdGF0ZTkwOiLml4vovaw5MMKwIixDb3B5UHJldlBhZ2U6IuWkjeWItuS4iuS4gOmhtSIsQ2hhbmdlQm94VmFsaWQ6IuWIh+aNouagh+azqOahhuacieaViOaApyIsTXVsdGlTZWxlY3Q6IuWkmumAiSIsU2VsZWN0QWxsQm94OiLlhajpgIkiLEdlbmVyYWxPcGVyYXRpb246IumAmueUqCIsUmVjdFBhdHRlcm46IuaLieahhuaooeW8jyIsUG9seWdvblBhdHRlcm46IuWkmui+ueW9ouaooeW8jyIsQ2hhbmdlUGF0dGVybk1zZzoi5oiQ5Yqf5pu05pS55Li6e3twYXR0ZXJufX3mqKHlvI8iLERyYWdPcGVyYXRpb246IuaLluWKqCIsU2VsZWN0ZWRTdGF0dXM6IumAieS4reaXtiIsdXBkYXRlVmFsaWRGcm9tVmFsaWRUb0luVmFsaWQ6IuaYr+WQpuehruiupOagh+S4uuaXoOaViOaWh+S7tu+8nyIsdXBkYXRlVmFsaWRGcm9tSW5WYWxpZFRvVmFsaWQ6IuaYr+WQpuehruiupOWPlua2iOaXoOaViOaWh+S7tu+8nyIsQWxsVHJhY2tJRHM6IuaJgOacieW3suagh+azqOeahOahhklEIixDdXJyZW50Qm94VHJhY2tJRHM6IuW9k+WJjeagh+azqOahhklEIixQb3NpdGl2ZUludGVnZXJDaGVjazoi6K+36L6T5YWl5q2j5pW05pWwIixOb3RBbGxvd0RlY2ltYWxQb2ludHNJblRyYWNrSUQ6Iui+k+WFpXRyYWNrSUTkuI3lhYHorrjljIXlkKvlsI/mlbDngrkiLER1cGxpY2F0ZVRyYWNrSURzRXhpc3Q6IuWtmOWcqOmHjeWkjeeahHRyYWNrSUQiLEJhdGNoVXBkYXRlVGV4dDoi5om56YeP5L+u5pS5IixCYXRjaFVwZGF0ZVRyYWNrSUQ6IuaJuemHj+S/ruaUuUlEIixUcmFja0lEVW5pZnlBczoi57uf5LiA5qCH5rOo5qGGSUTkuLoiLFVuaWZ5VHJhY2tJRFJhbmdlOiLnu5/kuIBJROiMg+WbtCIsUGFnZToi6aG1IixPa1RleHQ6IuehruiupCIsQ2FuY2VsVGV4dDoi5Y+W5raIIixVbmlmeVBhcmFtczoi57uf5LiA5Y+C5pWwIixVbmlmeUF0dHJpYnV0ZVJhbmdlOiLnu5/kuIDlsZ7mgKfojIPlm7QiLFVuaWZ5VHJhY2tJRDoi57uf5LiA5qCH5rOo5qGGSUQiLFVuaWZ5U2l6ZToi57uf5LiA5bC65a+4IixVbmlmeVRhZzoi57uf5LiA5qCH562+IixOb0RhdGE6IuaaguaXoOaVsOaNriIsQW5ub3RhdGVkTGlzdDoi5qCH5rOo5YiX6KGoIixvbkRlbGV0ZUdyYXBoQnlBdHRyOiLnoa7lrpropoHliKDpmaTlsZ7mgKfkuLoge3thdHRyaWJ1dGV9fSDnmoTmoIfms6jmlbDmja7lkJc/IixDYW5jZWxGaXhlZDoi5Y+W5raI5Zu65a6aIixGaXhlZE9uTGVmdDoi5Zu65a6a5Zyo5bem5L6nIixGaXhlZE9uUmlnaHQ6IuWbuuWumuWcqOWPs+S+pyIsQW5ub3RhdGVkUmVzdWx0OiLmoIfms6jnu5PmnpwiLENvbXBsZW1lbnRhcnlUcmFja2luZzoi6KGl5YWo6Lef6LiqIixDb21wbGVtZW50YXJ5VHJhY2tpbmdQcmVkaWN0aW9uOiLooaXlhajot5/ouKrpooTmtYsiLEFwcGx5OiLlupTnlKgiLEJlZm9yZVByZWRpY3RTdGFydGluZzoi5ZCv5Yqo5YmN77yM6K+35YWI5qCH5Ye66aaW5bC+55qE5qGG77yM6ZyA5ZCM5bqP5Y+3IixUaGVQcmVkaWN0ZWRQb2ludENsb3VkOiLnjrDpooTmtYvngrnkupHpnIDopoHlsI/kuo4gMTAg5binIixDYW1lcmFGb2xsb3dUb3BWaWV3OiLmjInkv6/op4blm77lrprkvY0iLE1hcmtPbmx5T25lOiLku4XmoIfms6jkuIDluKfmlbDmja7vvIzpnIDmoIflh7rpppblsL7nmoTluKfmlbDmja4iLEhhdmVOb05lZWQ6IuS4pOW4p+S5i+mXtOaaguaXoOmcgOmihOa1i+eahOaVsOaNru+8jOivt+WFiOagh+WHuummluWwvueahOahhu+8jOmcgOWQjOW6j+WPtyIsUHJlZGljdGluZ0RhdGFGcm9tOiLmraPlnKjpooTmtYvnrKwge3tzdGFydFBhZ2V9fSDpobXliLDnrKwge3tlbmRQYWdlfX0g6aG15LmL6Ze05qGGSUTkuLoge3tzZWxlY3RlZEJveFRyYWNrSUR9fSDnmoTmlbDmja4iLFBvaW50Q2xvdWRDb3Zlck1vZGU6IumAieS4reebuOWQjOeCueS6keaXtu+8jOWQjuS4gOagh+iusOimhuebluWJjeS4gOagh+iusCIsUG9pbnRDbG91ZFVuY292ZXJNb2RlOiLpgInkuK3nm7jlkIzngrnkupHml7bvvIzlkI7kuIDmoIforrDkuI3lj6/opobnm5bliY3kuIDmoIforrAiLFBvaW50Q2xvdWRGb2N1c01vZGU6IuW3suW8gOWQr+iBmueEpuaooeW8jyIsUG9pbnRDbG91ZFVuZm9jdXNNb2RlOiLlt7LlhbPpl63ogZrnhKbmqKHlvI8iLFBvaW50Q2xvdWRIaWRlU2VnbWVudDoi5bey6ZqQ6JeP5qCH5rOo54K55LqRIixQb2ludENsb3VkU2hvd1NlZ21lbnQ6IuW3suaYvuekuuWFqOmDqOeCueS6kSIsUG9pbnRDbG91ZEhpZGVTZWdtZW50SW52YWxpZDoi6ZqQ6JeP5bey5qCH5rOo5LiN5Y+v55So77yM6K+35YWI5YWz6Zet6IGa54SmIixQb2ludENsb3VkSGlkZUZvY3VzSW52YWxpZF9oaWRlOiLogZrnhKbkuI3lj6/nlKjvvIzor7flhYjlhbPpl63igJzpmpDol4/lt7LmoIfms6jigJ0iLFBvaW50Q2xvdWRIaWRlRm9jdXNJbnZhbGlkX25vbmU6IuiBmueEpuS4jeWPr+eUqO+8jOivt+WFiOmAieaLqemcgOimgeiBmueEpueahOagh+iusCIsUGFsZXR0ZToi6LCD6Imy55uYIixFZmZpY2llbnRMaXN0ZW5pbmc6IuivpeS7u+WKoeagh+azqOaViOeOh+ebkeaOp+S4rS4uLiIsVGl0bGU6IumimOebriIsQW5zd2VyOiLlm57nrZQiLEZpbmlzaGVkOiLlt7LlrozmiJAiLFVuZmluaXNoZWQ6IuacquWujOaIkCIsT3ZlcmFsbFNjb3JlOiLmlbTkvZPor4TliIYiLE5vU2NvcmluZ1NjYWxlOiLlj6/lnKjlt6bkvqfphY3nva7mraXpqqTor6bmg4UiLEJlc3Q6IuacgOWlvSIsV29yc3Q6IuacgOW3riIsUmFua2luZ1F1YWxpdHlPZkFuc3dlcnM6Iuivt+Wvueavj+S4quWbnuetlOeahOi0qOmHj+i/m+ihjOaOkuW6jyIsVG9CZVNvcnRlZDoi5b6F5o6S5bqPIixZZXM6IuaYryIsTm86IuWQpiIsQWRkaXRpb25hbENvbnRlbnQ6Iu+8iOmAieWhq++8ieivt+Whq+WGmeS7u+S9leS9oOWvueetlOahiOeahOivhOS7t+aIluWFtuS7luihpeWFheWGheWuuSIsU3VibWl0OiLmj5DkuqQiLERyYWdBbmREcm9wOiLmjInkvY/mi5bliqgiLERlZmF1bHRTaXplOiLngrnlh7vlm77moIfku6Xkvb/nlKjpu5jorqTlsLrlr7giLE5vcm1hbFNpemVSYW5nZToi5q2j5bi45bC65a+46IyD5Zu0IixOb3JtYWxDZW50ZXJQb2ludFJhbmdlOiLmraPluLjkuK3lv4PngrnojIPlm7QiLExvYWRpbmdUaXBzOiLmlbDmja7liqDovb3kuK1+6K+356iN5ZCOIixVbmxvY2tlZDoi5pyq5byA5ZCvIixMb2NrZWQ6IuW3suW8gOWQryIsTGVhc3RDaGFyYWN0ZXJFcnJvcjoi6K+36Iez5bCR6L6T5YWle3tudW19feS4quWtl+espiIsQW5kOiLkuJQiLE9yOiLmiJYiLEltYWdlTGFiZWxzOiLlm77niYfmoIfms6jniakiLCIzRFJlY3QiOiIzRCDmoYYiLCIyRFJlY3QiOiIyRCDmoYYiLEFkZFBvaW50czoi5aKe5YqgIixSZW1vdmVQb2ludHM6IuWIoOWHjyIsUmVzZXQ6IumHjee9riIsUGxlYXNlRnJhbWVUaGVPYmplY3RUb0JlRGl2aWRlZEZpcnN0OiLor7flhYjmoYblh7rpnIDliIblibLnmoTniankvZMiLENsaWNrT25UaGVUYXJnZXRPYmplY3RUb1NwbGl0SXQ6IuWNleWHu+ebruagh+eJqeS9k+i/m+ihjOWIhuWJsiIsQ2xpY2tUaGVUYXJnZXRPYmplY3RBZ2FpblRvSW5jcmVhc2VUaGVTZWdtZW50YXRpb246IuWGjeasoeWNleWHu+ebruagh+eJqeS9k+WinuWKoOWIhuWJsiIsQ2xpY2tPblRoZVRhcmdldE9iamVjdFRvRGVsZXRlVGhlU2VnbWVudGF0aW9uOiLljZXlh7vnm67moIfniankvZPliKDlh4/liIblibIiLENsaWNrQWdhaW5PblRoZVRhcmdldE9iamVjdFRvRGVsZXRlVGhlU2VnbWVudGF0aW9uOiLlho3mrKHljZXlh7vnm67moIfniankvZPliKDlh4/liIblibIiLEFuc3dlcnNBcmVCZWluZ0dlbmVyYXRlZDoi5Zue562U55Sf5oiQ5LitIixBbnN3ZXJHZW5lcmF0aW9uRmFpbGVkUGxlYXNlVHJ5QWdhaW5MYXRlcjoi5Zue562U55Sf5oiQ5aSx6LSl77yM6K+356iN5ZCO6YeN6K+VIixSZUdlbmVyYXRlOiLph43mlrDnlJ/miJAiLEFuc3dlclRleHRFZGl0OiLlm57nrZTmlofmnKznvJbovpEiLFNob3dFZGl0aW5nUmVzdWx0RGlmZmVyZW5jZXNJblRleHRNb2RlT25seToi5LuF5paH5pys5qih5byP5LiL5pi+56S657yW6L6R57uT5p6c5beu5byCIixBdHRyaWJ1dGVMb2NrTm90aWZ5OiLmn6XnnIvlsZ7mgKfvvJp7e2xhYmVsfX3vvIzlj6rmmL7npLrmiYDpgInlsZ7mgKfnmoTmoIfms6jlhoXlrrkiLEF1ZGlvU2VnbWVudFRpcDoi6K+36YCJ5oup5biM5pyb5oiq5Y+W55qE5pe26Ze054K577yIe3t0aW1lfX3vvIkiLEF1ZGlvQ29tYmluZVRpcDoi6K+354K55Ye75biM5pyb5ZCI5bm255qE5Yy66Ze0IixDbGlwcGVkQXVkaW86IuW3suaIquWPlumfs+mikSIsTm9DbGlwcGVkRGF0YToi5pqC5peg5oiq5Y+W5YaF5a65IixDb21wYXJlVGFnczoi5qCH562+5a+554Wn5pi+56S6IixDb21iaW5lQXVkaW86IuWQiOW5tuWMuumXtCIsQ2xpcEF1ZGlvOiLliIblibLljLrpl7QiLFN3aXRjaENsaXBNb2RlOiLliIfmjaLmiKrlj5bmqKHlvI8iLFN3aXRjaFRhZ01vZGU6IuWIh+aNouagh+etvuaooeW8jyIsQ2xpcDoi5oiq5Y+WIixQcmV2aW91c0ludGVydmFsOiLkuIrkuIDljLrpl7QiLE5leHRJbnRlcnZhbDoi5LiL5LiA5Yy66Ze0IixEZWxldGVDb21tZW50OiLliKDpmaTmibnms6giLERlbGV0ZUNvbW1lbnRDb25maXJtOiLnoa7lrprliKDpmaTor6XmnaHmoIfms6jlkJciLFByZXZpb3VzQ29tbWVudDoi5LiK5LiA5p2h5om55rOoIixOZXh0Q29tbWVudDoi5LiL5LiA5p2h5om55rOoIixDbGlwU2VsZWN0OiLmiKrlj5bpgInkuK0iLCJGb3J3YXJkMC4xIjoi5YmN6L+bMC4xcyIsIkJhY2swLjEiOiLlkI7pgIAwLjFzIixMZWZ0Q2xpY2s6IuW3puWHuyIsU2NyaWJibGU6Iua2guaKuSIsRXJhc2U6IuaTpumZpCIsU2NyaWJibGVMaW5lOiLmtoLmirnvvIjov57nur/vvIkiLFN0cm9rZUVubGFyZ2U6IueslOinpuaUvuWkpyIsU3Ryb2tlUmVkdWN0aW9uOiLnrJTop6bnvKnlsI8iLHRvZ2dsZVNob3dUZXh0OiLmlofmnKzlr7nnhafmmL7npLoiLENsaXBTbGljZToi5oiq5Y+W54mH5q61IixUaW1lU3RhbXA6Iuagh+aXtumXtOeCuSIsQ2xpcFRpbWU6IuaIquWPluaXtumXtCIsU3RhbXBUaW1lOiLml7bpl7Tngrnml7bpl7QiLEdldFN0YXJ0VGltZToi6I635Y+W5byA5aeL5pe26Ze0IixHZXRFbmRUaW1lOiLojrflj5bnu5PmnZ/ml7bpl7QiLE91dHB1dERpc3BsYXk6Iui+k+WHuuWxleekuiIsTWF4aW11bUNoYXJhY3RlckVycm9yOiLlrZfnrKbmlbDkuI3og73otoXov4d7e251bX19IixDb21tb25TeW1ib2xzOiLluLjnlKjnrKblj7ciLEJpbmFyeU9wZXJhdGlvbnM6IuS6jOWFg+i/kOeul+espiIsQmluYXJ5UmVsYXRpb25zOiLkuozlhYPlhbPns7vnrKYiLEFycm93czoi566t5aS056ym5Y+3IixPdGhlcnM6IuWFtuS7luespuWPtyIsR3JlZWs6IuW4jOiFiuWtl+avjSIsTG93ZXJjYXNlOiLlsI/lhpkiLFVwcGVyY2FzZToi5aSn5YaZIixBZHZhbmNlZE1hdGhlbWF0aWNzOiLpq5jnrYnmlbDlraYiLEZyYWN0aW9uYWxEaWZmZXJlbnRpYXRpb246IuWIhuaVsOW+ruWIhiIsRnJhY3Rpb246IuWIhuaVsCIsRGVyaXZhdGl2ZToi5a+85pWwIixNb2R1bGFyQXJpdGhtZXRpYzoi5qih566X5pyvIixSYWRpY2FsOiLmoLnlvI8iLFN1cEFuZFN1Yjoi5LiK5LiL5qCHIixMaW1pdExvZ2FyaXRobToi5p6B6ZmQ5a+55pWwIixMaW1pdHM6IuaegemZkCIsTG9nYXJpdGhtc0FuZEV4cG9uZW50czoi5a+55pWw5oyH5pWwIixCb3VuZHM6IueVjOmZkCIsSW50ZWdyYWxPcGVyYXRpb246Iuenr+WIhui/kOeulyIsSW50ZWdyYWw6Iuenr+WIhiIsRG91YmxlSW50ZWdyYWw6IuWPjOmHjeenr+WIhiIsVHJpcGxlSW50ZWdyYWw6IuS4iemHjeenr+WIhiIsTGFyZ2VPcGVyYXRpb25zOiLlpKflnovov5DnrpciLFByb2R1Y3RzQW5kQ29wcm9kdWN0czoi5LmY56ev5L2Z56evIixJbnRlcnNlY3Rpb25BbmRVbmlvbjoi5Lqk6ZuG5bm26ZuGIixMaW5lYXJBbGdlYnJhOiLnur/mgKfku6PmlbAiLEJyYWNrZXRGb3JlbnNpY3M6IuaLrOWPt+WPluivgSIsQnJhY2tldDoi5ous5Y+3IixDb21tb246IuW4uOeUqCIsQXJyYXlNYXRyaXg6IuaVsOe7hOefqemYtSIsVHJpZ29ub21ldHJpY0Z1bmN0aW9uczoi5LiJ6KeS5Ye95pWwIixJbnZlcnNlVHJpZ29ub21ldHJpY0Z1bmN0aW9uczoi5Y+N5LiJ6KeS5Ye95pWwIixIeXBlcmJsaWNGdW5jdGlvbnM6IuWPjOabsuWHveaVsCIsSW52ZXJzZUh5cGVyYmxpY0Z1bmN0aW9uczoi5Y+N5Y+M5puy5Ye95pWwIixGb3JtdWxhVGVtcGxhdGU6IuWFrOW8j+aooeadvyIsQWxnZWJyYToi5Luj5pWwIixHZW9tZXRyeToi5Yeg5L2VIixJbmVxdWFsaXR5OiLkuI3nrYnlvI8iLE1hdHJpeDoi55+p6Zi1IixUcmlhbmdsZToi5LiJ6KeSIixTdGF0aXN0aWNzOiLnu5/orqEiLFNlcXVlbmNlOiLmlbDliJciLFBoeXNpY3M6IueJqeeQhiIsSW5kaWNhdG9ySnVkZ21lbnQ6IuaMh+agh+WIpOaWrSIsT25seUN1cnJlbnRGcmFtZToi5Y+q55yL5b2T5YmN5binIixDbGlja09uVGhlSWRUb0hpZ2hsaWdodFRoZU1hcmt1cEJveDoi54K55Ye7SUTlj6/ku6Xpq5jkuq7moIfms6jmoYYiLERvdWJsZUNsaWNrT25UaGVJZFRvQ29udGludW91c2x5SGlnaGxpZ2h0Qm94ZXNBY3Jvc3NGcmFtZXM6IuWPjOWHu0lE5Y+v5Lul6Leo5bin6L+e57ut6auY5Lqu5qCH5rOo5qGGIixGaW5kVGhlRnJhbWVDb3JyZXNwb25kaW5nVG9UaGVMYWJlbGVkRnJhbWVJZDoi5p+l5om+5qCH5rOo5qGGSUTlr7nlupTluKciLEdsb2JhbEFubm90YXRpb246IuWFqOWxgOagh+azqCIsUXVhbGlmaWVkQW5ub3RhdGlvbjoi6ZmQ5a6a5qCH5rOoIixJbnZhbGlkUXVlc3Rpb25BbmRTa2lwOiLml6DmlYjpopjnm67vvIzor7fot7Pov4fmraTpopgiLFByb2plY3Rpb25GcmFtZUNhbm5vdEJlRGVsZXRlZDoi5oqV5bCE5qGG5peg5rOV5Yig6ZmkIixGYWlsZWRUb0NvcHlSZXN1bHRzOiLlpI3liLbnu5PmnpzlpLHotKUiLFBhcnRpYWxSZXN1bHRzUmVwbGljYXRpb25GYWlsdXJlOiLpg6jliIbnu5PmnpzlpI3liLblpLHotKUiLFJvdGF0aW9uQW5nbGVTZW5zaXRpdml0eToi5peL6L2s5b6u6LCD6KeS5bqmIiwiMkRJbWFnZUJhdGNoIjoiMkTlm77niYfmibnph48iLCIyREltYWdlQmF0Y2hDb25uZWN0aW9uIjoiMkTlm77niYfmibnph4/ov57mjqUiLCIyREltYWdlQmF0Y2hEaXNjb25uZWN0aW9uIjoiMkTlm77niYfmibnph4/mlq3lvIAiLENvbmZpcm1Ub0JhdGNoQ29ubmVjdDoi56Gu6K6k5om56YeP6L+e5o6l77yfIixDb25maXJtVG9CYXRjaERpc2Nvbm5lY3Q6IuehruiupOaJuemHj+aWreW8gO+8nyIsQ29ubmVjdDoi6L+e5o6lIixEaXNjb25uZWN0OiLmlq3lvIAiLEltYWdlMkRCb3hTY2FsZToi5Zu+54mHMkTmoYbkvZPnvKnlsI/lpITnkIYiLFNlbGVjdGVkUmVjdDoi6YCJ5Lit5qGG5L2TIixPbmx5TG9hZFRoZUZpcnN0RnJhbWVQcmVBbm5vdGF0aW9uOiLku4Xovb3lhaXnrKzkuIDluKfpooTmoIfms6giLFNlbGVjdEJveFRvRGlzcGxheUluZGVwZW5kZW50bHk6IumAieS4reahhueLrOeri+aYvuekuiIsU2VsZWN0Qm94U3dpdGNoVGlwczoi5byA5ZCv5byA5YWz5ZCO77yM6YCJ5Lit5L+v6KeG5Zu+55qE5qGG5L2T77yM5Zu+54mH6KeG5Zu+5LuF5pi+56S65a+55bqU55qEMkTmoYbkvZPvvIzkvr/kuo7mn6XnnIvkv6/op4blm77nmoTlr7nlupTlhbPns7sifTtmdC5sYW5ndWFnZXx8ZnQuaW5pdCh7bG5nOiJlbiIsaW50ZXJwb2xhdGlvbjp7ZXNjYXBlVmFsdWU6ITF9fSksZnQuYWRkUmVzb3VyY2VCdW5kbGUoImVuIiwidHJhbnNsYXRpb24iLHB0LCEwKSxmdC5hZGRSZXNvdXJjZUJ1bmRsZSgiY24iLCJ0cmFuc2xhdGlvbiIsZHQsITApO2NvbnN0IGd0PXswOjAsMTouMiwzOi40LDU6LjYsNzouOCw5OjEsMTA6MX0seXQ9ezA6MCwxOjAsMzouMiw1Oi40LDc6LjYsOTouOCwxMDoxfSxtdD1jbGFzc3tzdGF0aWMgcmdiYVN0cmluZ1RvSGV4KHQpe2NvbnN0IGU9dC5zdWJzdHJpbmcoNSx0Lmxlbmd0aC0xKS5yZXBsYWNlKC8gL2csIiIpLnNwbGl0KCIsIiksbj1wYXJzZUludChlWzBdKSxyPXBhcnNlSW50KGVbMV0pLGk9cGFyc2VJbnQoZVsyXSksbz1wYXJzZUZsb2F0KGVbM10pO3JldHVybiIjIituLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikrci50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpK2kudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKStNYXRoLnJvdW5kKDI1NSpvKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfX07bGV0IHZ0PW10O3Z0LnJlcGxhY2VBRnJvbVJHQkE9KHQsZSk9PnQuc3BsaXQoIiAiKS5qb2luKCIiKS5yZXBsYWNlKC8sWzAtOV0rKFsuXXsxfVswLTldKyl7MCwxfVwpLyxgLCR7ZS50b0ZpeGVkKDIpfSlgKSx2dC50b1JHQkFBcnI9dD0+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/MyZ0fDg6dF0pfXJldHVybiByLmpvaW4oIiIpfShmdW5jdGlvbih0KXsxPT09dC5sZW5ndGgmJih0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiBSbCh0KGUpLG4pfX0odCkpfSkoUmwpLFZjKCksVmMoKSxWYygpLFZjKCksVmMoKSxCbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkJsLHBvaW50OmZ1bmN0aW9uKHQsZSl7dGhpcy5zdHJlYW0ucG9pbnQodCxlKX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19LGZ1bmN0aW9uKHQpe3QuUG9pbnRDbG91ZD0icG9pbnRDbG91ZFRvb2wifShLY3x8KEtjPXt9KSksZnVuY3Rpb24odCl7dC5WaWRlb1RleHRUb29sPSJ2aWRlb1RleHRUb29sIix0LlZpZGVvVGFnVG9vbD0idmlkZW9UYWdUb29sIix0LlZpZGVvQ2xpcFRvb2w9InZpZGVvQ2xpcFRvb2wifShKY3x8KEpjPXt9KSksZnVuY3Rpb24odCl7dC5BdWRpb1RleHRUb29sPSJhdWRpb1RleHRUb29sIn0oUWN8fChRYz17fSkpLGZ1bmN0aW9uKHQpe3RbdC5SZWN0PTBdPSJSZWN0Iix0W3QuVGFnPTFdPSJUYWcifSgkY3x8KCRjPXt9KSksZnVuY3Rpb24odCl7dC5SZWN0PSJyZWN0VG9vbCIsdC5UYWc9InRhZ1Rvb2wiLHQuUG9pbnQ9InBvaW50VG9vbCIsdC5Qb2ludE1hcmtlcj0icG9pbnRNYXJrZXJUb29sIix0LlNlZ21lbnRhdGlvbj0ic2VnbWVudGF0aW9uVG9vbCIsdC5GaWx0ZXI9ImZpbHRlclRvb2wiLHQuVGV4dD0idGV4dFRvb2wiLHQuUG9seWdvbj0icG9seWdvblRvb2wiLHQuTGluZT0ibGluZVRvb2wiLHQuTGluZU1hcmtlcj0ibGluZU1hcmtlclRvb2wiLHQuRW1wdHk9ImVtcHR5VG9vbCIsdC5Gb2xkZXJUYWc9ImZvbGRlclRhZ1Rvb2wiLHQuUmVjdFRyYWNrPSJyZWN0VHJhY2tUb29sIix0LlNjcmliYmxlVG9vbD0ic2NyaWJibGVUb29sIix0LkZhY2U9ImZhY2VUb29sIix0LkNsaWVudEF0dHJpYnV0ZT0iY2xpZW50QXR0cmlidXRlVG9vbCIsdC5PQ1JSZWxhdGlvbj0iT0NSUmVsYXRpb25Ub29sIix0LlNlZ21lbnRCeVJlY3Q9InNlZ21lbnRCeVJlY3RUb29sIix0LkN1Ym9pZD0iY3Vib2lkVG9vbCIsdC5Qb2ludENsb3VkUG9seWdvbj0icG9pbnRDbG91ZFBvbHlnb24iLHQuTExNPSJMTE1Ub29sIix0Lk5MUD0iTkxQVG9vbCJ9KHRsfHwodGw9e30pKSxmdW5jdGlvbih0KXt0LkNoZWNrPSJjaGVjayJ9KGVsfHwoZWw9e30pKSxmdW5jdGlvbih0KXt0W3Qubm90aGluZz0wXT0ibm90aGluZyIsdFt0LlJlY3RCRz0xXT0iUmVjdEJHIix0W3Quc2hvd09yZGVyPTJdPSJzaG93T3JkZXIifShubHx8KG5sPXt9KSksdGwuUmVjdCx0bC5UYWcsdGwuUG9pbnQsdGwuUG9pbnRNYXJrZXIsdGwuU2VnbWVudGF0aW9uLHRsLkZpbHRlcix0bC5UZXh0LHRsLlBvbHlnb24sdGwuTGluZSx0bC5MaW5lTWFya2VyLHRsLkZvbGRlclRhZyx0bC5SZWN0VHJhY2ssdGwuRmFjZSx0bC5DbGllbnRBdHRyaWJ1dGUsdGwuT0NSUmVsYXRpb24sdGwuU2VnbWVudEJ5UmVjdCxKYy5WaWRlb1RleHRUb29sLEpjLlZpZGVvVGFnVG9vbCxKYy5WaWRlb0NsaXBUb29sLEtjLlBvaW50Q2xvdWQsdGwuQ3Vib2lkLHRsLkxMTSx0bC5OTFAsdGwuUmVjdCx0bC5UYWcsdGwuUG9pbnQsdGwuUG9pbnRNYXJrZXIsdGwuU2VnbWVudGF0aW9uLHRsLkZpbHRlcix0bC5UZXh0LHRsLlBvbHlnb24sdGwuTGluZSx0bC5MaW5lTWFya2VyLHRsLkZvbGRlclRhZyx0bC5SZWN0VHJhY2ssdGwuRmFjZSx0bC5DbGllbnRBdHRyaWJ1dGUsdGwuT0NSUmVsYXRpb24sdGwuU2VnbWVudEJ5UmVjdCxKYy5WaWRlb1RleHRUb29sLEpjLlZpZGVvVGFnVG9vbCxKYy5WaWRlb0NsaXBUb29sLEtjLlBvaW50Q2xvdWQsdGwuQ3Vib2lkLHRsLkxMTSx0bC5OTFAsZnVuY3Rpb24odCl7dFt0Lm5vRGVwZW5kPTFdPSJub0RlcGVuZCIsdFt0LmRlcGVuZE9yaWdpbj0yXT0iZGVwZW5kT3JpZ2luIix0W3QuZGVwZW5kU2hhcGU9M109ImRlcGVuZFNoYXBlIix0W3QuZGVwZW5kTGluZT00XT0iZGVwZW5kTGluZSIsdFt0LmRlcGVuZFBvbHlnb249NV09ImRlcGVuZFBvbHlnb24iLHRbdC5kZXBlbmRQcmVTaGFwZT0xMDFdPSJkZXBlbmRQcmVTaGFwZSIsdFt0LmRlcGVuZFByZUxpbmU9MTAyXT0iZGVwZW5kUHJlTGluZSIsdFt0LmRlcGVuZFByZVBvbHlnb249MTAzXT0iZGVwZW5kUHJlUG9seWdvbiJ9KHJsfHwocmw9e30pKSxmdW5jdGlvbih0KXt0LmxjPSJsZWZ0Q2xpY2siLHQucmM9InJpZ2h0Q2xpY2siLHQuY2xjPSJjdHJsTGVmdENsaWNrIix0LmNyYz0iY3RybFJpZ2h0Q2xpY2sifShpbHx8KGlsPXt9KSksZnVuY3Rpb24odCl7dFt0Lk5vcm1hbD0xXT0iTm9ybWFsIix0W3QuTW9kaWZ5PTJdPSJNb2RpZnkifShvbHx8KG9sPXt9KSksZnVuY3Rpb24odCl7dFt0LkxpbmU9MF09IkxpbmUiLHRbdC5DdXJ2ZT0xXT0iQ3VydmUifShzbHx8KHNsPXt9KSksZnVuY3Rpb24odCl7dFt0LlNpbmdsZUNvbG9yPTBdPSJTaW5nbGVDb2xvciIsdFt0Lk11bHRpQ29sb3I9MV09Ik11bHRpQ29sb3IifShhbHx8KGFsPXt9KSksZnVuY3Rpb24odCl7dFt0LkZvcm09MV09IkZvcm0iLHRbdC5Kc29uPTJdPSJKc29uIn0odWx8fCh1bD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5Qb2ludD0wXT0iUG9pbnQiLHRbdC5MaW5lPTFdPSJMaW5lIix0W3QuUGxhbmU9Ml09IlBsYW5lIn0oY2x8fChjbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5Ob25lPTBdPSJOb25lIix0W3QuRHJhd2luZz0xXT0iRHJhd2luZyIsdFt0LkVkaXQ9Ml09IkVkaXQifShsbHx8KGxsPXt9KSksZnVuY3Rpb24odCl7dFt0LkJhY2t3YXJkPTBdPSJCYWNrd2FyZCIsdFt0LkZvcndhcmQ9MV09IkZvcndhcmQiLHRbdC5KdW1wU2tpcD0yXT0iSnVtcFNraXAiLHRbdC5Ob25lPTNdPSJOb25lIn0oaGx8fChobD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5XYWl0PTBdPSJXYWl0Iix0W3QuUGFzcz0xXT0iUGFzcyIsdFt0LkZhaWw9Ml09IkZhaWwiLHRbdC5Mb2FkaW5nPTNdPSJMb2FkaW5nIn0oZmx8fChmbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5BbnlTdHJpbmc9MF09IkFueVN0cmluZyIsdFt0Lk9yZGVyPTFdPSJPcmRlciIsdFt0LkVuZ2xpc2hPbmx5PTJdPSJFbmdsaXNoT25seSIsdFt0Lk51bWJlck9ubHk9M109Ik51bWJlck9ubHkiLHRbdC5DdXN0b21Gb3JtYXQ9NF09IkN1c3RvbUZvcm1hdCJ9KHBsfHwocGw9e30pKSxmdW5jdGlvbih0KXt0W3QuSW1nTGlzdD0xZTNdPSJJbWdMaXN0Iix0W3QuVHJhY2tQcmVkaWN0aW9uPTEwMDFdPSJUcmFja1ByZWRpY3Rpb24iLHRbdC5JbWdTZWFyY2g9MTAwMl09IkltZ1NlYXJjaCJ9KGRsfHwoZGw9e30pKSxLYy5Qb2ludENsb3VkLHRsLkNsaWVudEF0dHJpYnV0ZSx0bC5GYWNlLHRsLk9DUlJlbGF0aW9uLEtjLlBvaW50Q2xvdWQsdGwuQ2xpZW50QXR0cmlidXRlLHRsLkZhY2UsdGwuT0NSUmVsYXRpb24sZnVuY3Rpb24odCl7dFt0Lk5vcm1hbD0wXT0iTm9ybWFsIix0W3QuUmVjdD0xXT0iUmVjdCJ9KGdsfHwoZ2w9e30pKSxmdW5jdGlvbih0KXt0W3QuU2NyaWJibGU9MV09IlNjcmliYmxlIix0W3QuRXJhc2U9Ml09IkVyYXNlIn0oeWx8fCh5bD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5HZW5lcmFsPTFdPSJHZW5lcmFsIix0W3QuTXVsdGlNb3ZlPTJdPSJNdWx0aU1vdmUifShtbHx8KG1sPXt9KSksZnVuY3Rpb24odCl7dFt0LkFOTk9UQVRJT049MV09IkFOTk9UQVRJT04iLHRbdC5RVUFMSVRZX0lOU1BFQ1RJT049Ml09IlFVQUxJVFlfSU5TUEVDVElPTiIsdFt0LlBSRV9BTk5PVEFUSU9OPTNdPSJQUkVfQU5OT1RBVElPTiIsdFt0Lk1BTlVBTF9DT1JSRUNUSU9OPTRdPSJNQU5VQUxfQ09SUkVDVElPTiJ9KHZsfHwodmw9e30pKSxmdW5jdGlvbih0KXt0W3QuQmFja3dhcmQ9MF09IkJhY2t3YXJkIix0W3QuRm9yd2FyZD0xXT0iRm9yd2FyZCIsdFt0Lkp1bXBTa2lwPTJdPSJKdW1wU2tpcCIsdFt0Lk5vbmU9M109Ik5vbmUifShfbHx8KF9sPXt9KSksZnVuY3Rpb24odCl7dFt0LlN0YXJ0PTBdPSJTdGFydCIsdFt0LlN0b3A9MV09IlN0b3AiLHRbdC5XYWl0PTJdPSJXYWl0Iix0W3QuTW92ZT0zXT0iTW92ZSJ9KHhsfHwoeGw9e30pKSxmdW5jdGlvbih0KXt0W3QuUG9pbnQ9MF09IlBvaW50Iix0W3QuTGluZT0xXT0iTGluZSIsdFt0LlBsYW5lPTJdPSJQbGFuZSIsdFt0LkN1Ym9pZD0zXT0iQ3Vib2lkIn0od2x8fCh3bD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5hc2NlbmQ9MF09ImFzY2VuZCIsdFt0LmRlc2NlbmQ9MV09ImRlc2NlbmQifShibHx8KGJsPXt9KSksZnVuY3Rpb24odCl7dFt0LkludGVsbGlnZW5jZT0wXT0iSW50ZWxsaWdlbmNlIix0W3QuTGluZWFyPTFdPSJMaW5lYXIifShEbHx8KERsPXt9KSksZnVuY3Rpb24odCl7dC5aaD0iemhfQ04iLHQuVVM9ImVuX1VTIn0oRWx8fChFbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5DbG9ja3dpc2U9MF09IkNsb2Nrd2lzZSIsdFt0LkFudGljbG9ja3dpc2U9MV09IkFudGljbG9ja3dpc2UifShDbHx8KENsPXt9KSksZnVuY3Rpb24odCl7dC5Gcm9udD0iZnJvbnQiLHQuQmFjaz0iYmFjayIsdC5TaWRlPSJzaWRlIn0oU2x8fChTbD17fSkpLGZ1bmN0aW9uKHQpe3QuVEw9InRsIix0LlRSPSJ0ciIsdC5CTD0iYmwiLHQuQlI9ImJyIn0oQWx8fChBbD17fSkpLGZ1bmN0aW9uKHQpe3QuRnJvbnQ9ImZyb250Iix0LkJhY2s9ImJhY2siLHQuTGVmdD0ibGVmdCIsdC5SaWdodD0icmlnaHQiLHQuVG9wPSJ0b3AifShObHx8KE5sPXt9KSksZnVuY3Rpb24odCl7dC5Sb3c9InJvdyIsdC5Db2x1bW49ImNvbHVtbiJ9KElsfHwoSWw9e30pKSxBbC5UTCxBbC5UUixBbC5UUixBbC5UTCxBbC5CTCxBbC5CUixBbC5CUixBbC5CTCxBbC5UTCxBbC5CTCxBbC5UUixBbC5CUixBbC5CTCxBbC5UTCxBbC5CUixBbC5UUixmdW5jdGlvbih0KXt0W3QuQT02NV09IkEiLHRbdC5CPTY2XT0iQiIsdFt0LkM9NjddPSJDIix0W3QuRD02OF09IkQiLHRbdC5FPTY5XT0iRSIsdFt0LkY9NzBdPSJGIix0W3QuRz03MV09IkciLHRbdC5IPTcyXT0iSCIsdFt0Lkk9NzNdPSJJIix0W3QuTz03OV09Ik8iLHRbdC5MPTc2XT0iTCIsdFt0LlI9ODJdPSJSIix0W3QuWj05MF09IloiLHRbdC5XPTg3XT0iVyIsdFt0Llg9ODhdPSJYIix0W3QuWT04OV09IlkiLHRbdC5TPTgzXT0iUyIsdFt0LlE9ODFdPSJRIix0W3QuUD04MF09IlAiLHRbdC5PbmU9NDldPSJPbmUiLHRbdC5Ud289NTBdPSJUd28iLHRbdC5UaHJlZT01MV09IlRocmVlIix0W3QuRGVsZXRlPTQ2XT0iRGVsZXRlIix0W3QuRjExPTEyMl09IkYxMSIsdFt0LlNwYWNlPTMyXT0iU3BhY2UiLHRbdC5Fc2M9MjddPSJFc2MiLHRbdC5MZWZ0PTM3XT0iTGVmdCIsdFt0LlVwPTM4XT0iVXAiLHRbdC5SaWdodD0zOV09IlJpZ2h0Iix0W3QuRG93bj00MF09IkRvd24iLHRbdC5FbnRlcj0xM109IkVudGVyIix0W3QuQ3RybD0xN109IkN0cmwiLHRbdC5BbHQ9MThdPSJBbHQiLHRbdC5TaGlmdD0xNl09IlNoaWZ0Iix0W3QuVGFiPTldPSJUYWIiLHRbdC5CYWNrU3BhY2U9OF09IkJhY2tTcGFjZSIsdFt0Lk1pbnVzPTE4OV09Ik1pbnVzIix0W3QuRXF1YWw9MTg3XT0iRXF1YWwifShNbHx8KE1sPXt9KSksZnVuY3Rpb24odCl7dFt0LkNyZWF0ZT0wXT0iQ3JlYXRlIix0W3QuQWN0aXZlPTFdPSJBY3RpdmUiLHRbdC5FZGl0PTFdPSJFZGl0Iix0W3QuTm9uZT0yXT0iTm9uZSJ9KEZsfHwoRmw9e30pKSxmdW5jdGlvbih0KXt0LkFjdGl2ZUFyZWE9IiNCM0I4RkYifShUbHx8KFRsPXt9KSksZnVuY3Rpb24odCl7dFt0Lk91dHNpZGU9MF09Ik91dHNpZGUiLHRbdC5QYXJ0aWFsbHlJbnNpZGU9MV09IlBhcnRpYWxseUluc2lkZSIsdFt0LkZ1bGx5SW5zaWRlPTJdPSJGdWxseUluc2lkZSJ9KE9sfHwoT2w9e30pKSxmdW5jdGlvbih0KXt0Lk5vUm90YXRlTm90aWNlPSJub1JvdGF0ZU5vdGljZSIsdC5SZWN0RXJyb3JTaXplTm90aWNlPSJyZWN0RXJyb3JTaXplTm90aWNlIix0LlRleHRDaGVja051bWJlckVycm9yTm90aWNlPSJ0ZXh0Q2hlY2tOdW1iZXJFcnJvck5vdGljZSIsdC5UZXh0Q2hlY2tFbmdsaXNoRXJyb3JOb3RpY2U9InRleHRDaGVja0VuZ2xpc2hFcnJvck5vdGljZSIsdC5UZXh0Q2hlY2tDdXN0b21FcnJvck5vdGljZT0idGV4dENoZWNrQ3VzdG9tRXJyb3JOb3RpY2UiLHQuVXBwZXJMaW1pdEVycm9yTm90aWNlPSJVcHBlckxpbWl0RXJyb3JOb3RpY2UiLHQuTG93ZXJMaW1pdEVycm9yTm90aWNlPSJMb3dlckxpbWl0RXJyb3JOb3RpY2UiLHQuTWluQXJlYUxpbWl0RXJyb3JOb3RpY2U9Ik1pbkFyZWFMaW1pdEVycm9yTm90aWNlIix0Lk1pbkxlbmd0aExpbWl0RXJyb3JOb3RpY2U9Ik1pbkxlbmd0aExpbWl0RXJyb3JOb3RpY2UiLHQuSW52YWxpZEltYWdlPSJJbnZhbGlkSW1hZ2UiLHQuRGlzYWJsZURlbGV0ZT0iRGlzYWJsZURlbGV0ZSIsdC5DbGVhclBhcnRpYWxEYXRhPSJDbGVhclBhcnRpYWxEYXRhIix0Lk1hcmtlckZpbmlzaD0iTWFya2VyRmluaXNoIix0Lkxvd2VyTGltaXRQb2ludD0iTG93ZXJMaW1pdFBvaW50Iix0Lk5vUm90YXRlSW5EZXBlbmRlbmNlPSJub1JvdGF0ZUluRGVwZW5kZW5jZSIsdC5VbmFibGVUb1JlYW5ub3RhdGlvbj0idW5hYmxlVG9SZWFubm90YXRpb24iLHQuRm9yYmlkZGVuQ3JlYXRpb25PdXRzaWRlQm91bmRhcnk9IkZvcmJpZGRlbkNyZWF0aW9uT3V0c2lkZUJvdW5kYXJ5Iix0LlN1Y2Nlc3NmdWxFZGdlQWRzb3JwdGlvbj0iU3VjY2Vzc2Z1bEVkZ2VBZHNvcnB0aW9uIix0LkZvcmJpZEFkZE5ld1BvaW50PSJGb3JiaWRBZGROZXdQb2ludCJ9KExsfHwoTGw9e30pKSxMbC5Ob1JvdGF0ZU5vdGljZSxMbC5SZWN0RXJyb3JTaXplTm90aWNlLExsLlRleHRDaGVja051bWJlckVycm9yTm90aWNlLExsLlRleHRDaGVja0VuZ2xpc2hFcnJvck5vdGljZSxMbC5UZXh0Q2hlY2tDdXN0b21FcnJvck5vdGljZSxMbC5VcHBlckxpbWl0RXJyb3JOb3RpY2UsTGwuTG93ZXJMaW1pdEVycm9yTm90aWNlLExsLk1pbkFyZWFMaW1pdEVycm9yTm90aWNlLExsLk1pbkxlbmd0aExpbWl0RXJyb3JOb3RpY2UsTGwuSW52YWxpZEltYWdlLExsLkRpc2FibGVEZWxldGUsTGwuQ2xlYXJQYXJ0aWFsRGF0YSxMbC5NYXJrZXJGaW5pc2gsTGwuTG93ZXJMaW1pdFBvaW50LExsLk5vUm90YXRlSW5EZXBlbmRlbmNlLExsLlVuYWJsZVRvUmVhbm5vdGF0aW9uLExsLkZvcmJpZGRlbkNyZWF0aW9uT3V0c2lkZUJvdW5kYXJ5LExsLlN1Y2Nlc3NmdWxFZGdlQWRzb3JwdGlvbixMbC5Gb3JiaWRBZGROZXdQb2ludCxMbC5Ob1JvdGF0ZU5vdGljZSxMbC5SZWN0RXJyb3JTaXplTm90aWNlLExsLlRleHRDaGVja051bWJlckVycm9yTm90aWNlLExsLlRleHRDaGVja0VuZ2xpc2hFcnJvck5vdGljZSxMbC5UZXh0Q2hlY2tDdXN0b21FcnJvck5vdGljZSxMbC5VcHBlckxpbWl0RXJyb3JOb3RpY2UsTGwuTG93ZXJMaW1pdEVycm9yTm90aWNlLExsLk1pbkFyZWFMaW1pdEVycm9yTm90aWNlLExsLk1pbkxlbmd0aExpbWl0RXJyb3JOb3RpY2UsTGwuSW52YWxpZEltYWdlLExsLkRpc2FibGVEZWxldGUsTGwuQ2xlYXJQYXJ0aWFsRGF0YSxMbC5NYXJrZXJGaW5pc2gsTGwuTG93ZXJMaW1pdFBvaW50LExsLk5vUm90YXRlSW5EZXBlbmRlbmNlLExsLlVuYWJsZVRvUmVhbm5vdGF0aW9uLExsLkZvcmJpZGRlbkNyZWF0aW9uT3V0c2lkZUJvdW5kYXJ5LExsLlN1Y2Nlc3NmdWxFZGdlQWRzb3JwdGlvbixMbC5Gb3JiaWRBZGROZXdQb2ludCxpbC5sYyxpbC5yYyxpbC5jbGMsaWwuY3JjLFsxLDUsMTAsMjAsMzAsNTAsODAsMTAwXS5jb25jYXQoQXJyYXkuZnJvbSh7bGVuZ3RoOjl9KS5tYXAoKCh0LGUpPT4xMDAqKGUrMikpKSksRWwuWmgsRWwuVVMsZnVuY3Rpb24odCl7dFt0LkNyZWF0ZT0wXT0iQ3JlYXRlIix0W3QuQWN0aXZlPTFdPSJBY3RpdmUiLHRbdC5Ob25lPTJdPSJOb25lIn0oUGx8fChQbD17fSkpO2NvbnN0IGpsPTEwMDEsVWw9InNyZ2IiLHFsPSJzcmdiLWxpbmVhciIsVmw9ImRpc3BsYXktcDMiLEdsPSJkaXNwbGF5LXAzLWxpbmVhciIsWWw9ImxpbmVhciIsWGw9InNyZ2IiLFdsPSJyZWM3MDkiLEhsPTJlMztjbGFzcyBabHthZGRFdmVudExpc3RlbmVyKHQsZSl7dm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBuPXRoaXMuX2xpc3RlbmVyczt2b2lkIDA9PT1uW3RdJiYoblt0XT1bXSksLTE9PT1uW3RdLmluZGV4T2YoZSkmJm5bdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybiExO2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiB2b2lkIDAhPT1uW3RdJiYtMSE9PW5bdF0uaW5kZXhPZihlKX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBuPXRoaXMuX2xpc3RlbmVyc1t0XTtpZih2b2lkIDAhPT1uKXtjb25zdCB0PW4uaW5kZXhPZihlKTstMSE9PXQmJm4uc3BsaWNlKHQsMSl9fWRpc3BhdGNoRXZlbnQodCl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBlPXRoaXMuX2xpc3RlbmVyc1t0LnR5cGVdO2lmKHZvaWQgMCE9PWUpe3QudGFyZ2V0PXRoaXM7Y29uc3Qgbj1lLnNsaWNlKDApO2ZvcihsZXQgZT0wLHI9bi5sZW5ndGg7ZTxyO2UrKyluW2VdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgS2w9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2Z1bmN0aW9uIEpsKCl7Y29uc3QgdD00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxlPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLG49NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAscj00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MDtyZXR1cm4oS2xbMjU1JnRdK0tsW3Q+PjgmMjU1XStLbFt0Pj4xNiYyNTVdK0tsW3Q+PjI0JjI1NV0rIi0iK0tsWzI1NSZlXStLbFtlPj44JjI1NV0rIi0iK0tsW2U+PjE2JjE1fDY0XStLbFtlPj4yNCYyNTVdKyItIitLbFs2MyZufDEyOF0rS2xbbj4+OCYyNTVdKyItIitLbFtuPj4xNiYyNTVdK0tsW24+PjI0JjI1NV0rS2xbMjU1JnJdK0tsW3I+PjgmMjU1XStLbFtyPj4xNiYyNTVdK0tsW3I+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gUWwodCxlLG4pe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKG4sdCkpfWZ1bmN0aW9uICRsKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX1jbGFzcyB0aHtjb25zdHJ1Y3Rvcih0PTAsZT0wKXt0aC5wcm90b3R5cGUuaXNWZWN0b3IyPSEwLHRoaXMueD10LHRoaXMueT1lfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnh9c2V0IHdpZHRoKHQpe3RoaXMueD10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy55fXNldCBoZWlnaHQodCl7dGhpcy55PXR9c2V0KHQsZSl7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbM10qbityWzZdLHRoaXMueT1yWzFdKmUrcls0XSpuK3JbN10sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX1jcm9zcyh0KXtyZXR1cm4gdGhpcy54KnQueS10aGlzLnkqdC54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZigwPT09ZSlyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKFFsKG4sLTEsMSkpfWRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVRvU3F1YXJlZCh0KXtjb25zdCBlPXRoaXMueC10Lngsbj10aGlzLnktdC55O3JldHVybiBlKmUrbipufW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueX1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzfXJvdGF0ZUFyb3VuZCh0LGUpe2NvbnN0IG49TWF0aC5jb3MoZSkscj1NYXRoLnNpbihlKSxpPXRoaXMueC10Lngsbz10aGlzLnktdC55O3JldHVybiB0aGlzLng9aSpuLW8qcit0LngsdGhpcy55PWkqcitvKm4rdC55LHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueX19Y2xhc3MgZWh7Y29uc3RydWN0b3IodCxlLG4scixpLG8scyxhLHUpe2VoLnByb3RvdHlwZS5pc01hdHJpeDM9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdLHZvaWQgMCE9PXQmJnRoaXMuc2V0KHQsZSxuLHIsaSxvLHMsYSx1KX1zZXQodCxlLG4scixpLG8scyxhLHUpe2NvbnN0IGM9dGhpcy5lbGVtZW50cztyZXR1cm4gY1swXT10LGNbMV09cixjWzJdPXMsY1szXT1lLGNbNF09aSxjWzVdPWEsY1s2XT1uLGNbN109byxjWzhdPXUsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSksdGhpc31jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZVsyXT1uWzJdLGVbM109blszXSxlWzRdPW5bNF0sZVs1XT1uWzVdLGVbNl09bls2XSxlWzddPW5bN10sZVs4XT1uWzhdLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMiksdGhpc31zZXRGcm9tTWF0cml4NCh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVs0XSxlWzhdLGVbMV0sZVs1XSxlWzldLGVbMl0sZVs2XSxlWzEwXSksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscj1lLmVsZW1lbnRzLGk9dGhpcy5lbGVtZW50cyxvPW5bMF0scz1uWzNdLGE9bls2XSx1PW5bMV0sYz1uWzRdLGw9bls3XSxoPW5bMl0sZj1uWzVdLHA9bls4XSxkPXJbMF0sZz1yWzNdLHk9cls2XSxtPXJbMV0sdj1yWzRdLF89cls3XSx4PXJbMl0sdz1yWzVdLGI9cls4XTtyZXR1cm4gaVswXT1vKmQrcyptK2EqeCxpWzNdPW8qZytzKnYrYSp3LGlbNl09byp5K3MqXythKmIsaVsxXT11KmQrYyptK2wqeCxpWzRdPXUqZytjKnYrbCp3LGlbN109dSp5K2MqXytsKmIsaVsyXT1oKmQrZiptK3AqeCxpWzVdPWgqZytmKnYrcCp3LGlbOF09aCp5K2YqXytwKmIsdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVszXSo9dCxlWzZdKj10LGVbMV0qPXQsZVs0XSo9dCxlWzddKj10LGVbMl0qPXQsZVs1XSo9dCxlWzhdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxyPXRbMl0saT10WzNdLG89dFs0XSxzPXRbNV0sYT10WzZdLHU9dFs3XSxjPXRbOF07cmV0dXJuIGUqbypjLWUqcyp1LW4qaSpjK24qcyphK3IqaSp1LXIqbyphfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHI9dFsyXSxpPXRbM10sbz10WzRdLHM9dFs1XSxhPXRbNl0sdT10WzddLGM9dFs4XSxsPWMqby1zKnUsaD1zKmEtYyppLGY9dSppLW8qYSxwPWUqbCtuKmgrcipmO2lmKDA9PT1wKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgZD0xL3A7cmV0dXJuIHRbMF09bCpkLHRbMV09KHIqdS1jKm4pKmQsdFsyXT0ocypuLXIqbykqZCx0WzNdPWgqZCx0WzRdPShjKmUtciphKSpkLHRbNV09KHIqaS1zKmUpKmQsdFs2XT1mKmQsdFs3XT0obiphLXUqZSkqZCx0WzhdPShvKmUtbippKSpkLHRoaXN9dHJhbnNwb3NlKCl7bGV0IHQ7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0PWVbMV0sZVsxXT1lWzNdLGVbM109dCx0PWVbMl0sZVsyXT1lWzZdLGVbNl09dCx0PWVbNV0sZVs1XT1lWzddLGVbN109dCx0aGlzfWdldE5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCh0KS5pbnZlcnQoKS50cmFuc3Bvc2UoKX10cmFuc3Bvc2VJbnRvQXJyYXkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0aGlzfXNldFV2VHJhbnNmb3JtKHQsZSxuLHIsaSxvLHMpe2NvbnN0IGE9TWF0aC5jb3MoaSksdT1NYXRoLnNpbihpKTtyZXR1cm4gdGhpcy5zZXQobiphLG4qdSwtbiooYSpvK3Uqcykrbyt0LC1yKnUsciphLC1yKigtdSpvK2EqcykrcytlLDAsMCwxKSx0aGlzfXNjYWxlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkobmgubWFrZVNjYWxlKHQsZSkpLHRoaXN9cm90YXRlKHQpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KG5oLm1ha2VSb3RhdGlvbigtdCkpLHRoaXN9dHJhbnNsYXRlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkobmgubWFrZVRyYW5zbGF0aW9uKHQsZSkpLHRoaXN9bWFrZVRyYW5zbGF0aW9uKHQsZSl7cmV0dXJuIHQuaXNWZWN0b3IyP3RoaXMuc2V0KDEsMCx0LngsMCwxLHQueSwwLDAsMSk6dGhpcy5zZXQoMSwwLHQsMCwxLGUsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtbiwwLG4sZSwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUpe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLGUsMCwwLDAsMSksdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHQ9MDt0PDk7dCsrKWlmKGVbdF0hPT1uW3RdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0fWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9fWNvbnN0IG5oPW5ldyBlaDtmdW5jdGlvbiByaCh0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIix0KX1jb25zdCBpaD0obmV3IGVoKS5zZXQoLjgyMjQ2MjEsLjE3NzUzOCwwLC4wMzMxOTQxLC45NjY4MDU4LDAsLjAxNzA4MjcsLjA3MjM5NzQsLjkxMDUxOTkpLG9oPShuZXcgZWgpLnNldCgxLjIyNDk0MDEsLS4yMjQ5NDA0LDAsLS4wNDIwNTY5LDEuMDQyMDU3MSwwLC0uMDE5NjM3NiwtLjA3ODYzNjEsMS4wOTgyNzM1KSxzaD17W3FsXTp7dHJhbnNmZXI6WWwscHJpbWFyaWVzOldsLGx1bWluYW5jZUNvZWZmaWNpZW50czpbLjIxMjYsLjcxNTIsLjA3MjJdLHRvUmVmZXJlbmNlOnQ9PnQsZnJvbVJlZmVyZW5jZTp0PT50fSxbVWxdOnt0cmFuc2ZlcjpYbCxwcmltYXJpZXM6V2wsbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjEyNiwuNzE1MiwuMDcyMl0sdG9SZWZlcmVuY2U6dD0+dC5jb252ZXJ0U1JHQlRvTGluZWFyKCksZnJvbVJlZmVyZW5jZTp0PT50LmNvbnZlcnRMaW5lYXJUb1NSR0IoKX0sW0dsXTp7dHJhbnNmZXI6WWwscHJpbWFyaWVzOiJwMyIsbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjI4OSwuNjkxNywuMDc5M10sdG9SZWZlcmVuY2U6dD0+dC5hcHBseU1hdHJpeDMob2gpLGZyb21SZWZlcmVuY2U6dD0+dC5hcHBseU1hdHJpeDMoaWgpfSxbVmxdOnt0cmFuc2ZlcjpYbCxwcmltYXJpZXM6InAzIixsdW1pbmFuY2VDb2VmZmljaWVudHM6Wy4yMjg5LC42OTE3LC4wNzkzXSx0b1JlZmVyZW5jZTp0PT50LmNvbnZlcnRTUkdCVG9MaW5lYXIoKS5hcHBseU1hdHJpeDMob2gpLGZyb21SZWZlcmVuY2U6dD0+dC5hcHBseU1hdHJpeDMoaWgpLmNvbnZlcnRMaW5lYXJUb1NSR0IoKX19LGFoPW5ldyBTZXQoW3FsLEdsXSksdWg9e2VuYWJsZWQ6ITAsX3dvcmtpbmdDb2xvclNwYWNlOnFsLGdldCB3b3JraW5nQ29sb3JTcGFjZSgpe3JldHVybiB0aGlzLl93b3JraW5nQ29sb3JTcGFjZX0sc2V0IHdvcmtpbmdDb2xvclNwYWNlKHQpe2lmKCFhaC5oYXModCkpdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB3b3JraW5nIGNvbG9yIHNwYWNlLCAiJHt0fSIuYCk7dGhpcy5fd29ya2luZ0NvbG9yU3BhY2U9dH0sY29udmVydDpmdW5jdGlvbih0LGUsbil7aWYoITE9PT10aGlzLmVuYWJsZWR8fGU9PT1ufHwhZXx8IW4pcmV0dXJuIHQ7Y29uc3Qgcj1zaFtlXS50b1JlZmVyZW5jZTtyZXR1cm4gc2hbbl0uZnJvbVJlZmVyZW5jZShyKHQpKX0sZnJvbVdvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29udmVydCh0LHRoaXMuX3dvcmtpbmdDb2xvclNwYWNlLGUpfSx0b1dvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29udmVydCh0LGUsdGhpcy5fd29ya2luZ0NvbG9yU3BhY2UpfSxnZXRQcmltYXJpZXM6ZnVuY3Rpb24odCl7cmV0dXJuIHNoW3RdLnByaW1hcmllc30sZ2V0VHJhbnNmZXI6ZnVuY3Rpb24odCl7cmV0dXJuIiI9PT10P1lsOnNoW3RdLnRyYW5zZmVyfSxnZXRMdW1pbmFuY2VDb2VmZmljaWVudHM6ZnVuY3Rpb24odCxlPXRoaXMuX3dvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gdC5mcm9tQXJyYXkoc2hbZV0ubHVtaW5hbmNlQ29lZmZpY2llbnRzKX19O2Z1bmN0aW9uIGNoKHQpe3JldHVybiB0PC4wNDA0NT8uMDc3Mzk5MzgwOCp0Ok1hdGgucG93KC45NDc4NjcyOTg2KnQrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBsaCh0KXtyZXR1cm4gdDwuMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsLjQxNjY2KS0uMDU1fWxldCBoaDtjbGFzcyBmaHtzdGF0aWMgZ2V0RGF0YVVSTCh0KXtpZigvXmRhdGE6L2kudGVzdCh0LnNyYyl8fCJ1bmRlZmluZWQiPT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQpcmV0dXJuIHQuc3JjO2xldCBlO2lmKHQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCllPXQ7ZWxzZXt2b2lkIDA9PT1oaCYmKGhoPXJoKCJjYW52YXMiKSksaGgud2lkdGg9dC53aWR0aCxoaC5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgbj1oaC5nZXRDb250ZXh0KCIyZCIpO3QgaW5zdGFuY2VvZiBJbWFnZURhdGE/bi5wdXRJbWFnZURhdGEodCwwLDApOm4uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGU9aGh9cmV0dXJuIGUud2lkdGg+MjA0OHx8ZS5oZWlnaHQ+MjA0OD9lLnRvRGF0YVVSTCgiaW1hZ2UvanBlZyIsLjYpOmUudG9EYXRhVVJMKCJpbWFnZS9wbmciKX1zdGF0aWMgc1JHQlRvTGluZWFyKHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTEltYWdlRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZUJpdG1hcCYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwKXtjb25zdCBlPXJoKCJjYW52YXMiKTtlLndpZHRoPXQud2lkdGgsZS5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgbj1lLmdldENvbnRleHQoIjJkIik7bi5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCk7Y29uc3Qgcj1uLmdldEltYWdlRGF0YSgwLDAsdC53aWR0aCx0LmhlaWdodCksaT1yLmRhdGE7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0KyspaVt0XT0yNTUqY2goaVt0XS8yNTUpO3JldHVybiBuLnB1dEltYWdlRGF0YShyLDAsMCksZX1pZih0LmRhdGEpe2NvbnN0IGU9dC5kYXRhLnNsaWNlKDApO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/ZVt0XT1NYXRoLmZsb29yKDI1NSpjaChlW3RdLzI1NSkpOmVbdF09Y2goZVt0XSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19cmV0dXJuIHR9fWxldCBwaD0wO2NsYXNzIGRoe2NvbnN0cnVjdG9yKHQ9bnVsbCl7dGhpcy5pc1NvdXJjZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpwaCsrfSksdGhpcy51dWlkPUpsKCksdGhpcy5kYXRhPXQsdGhpcy5kYXRhUmVhZHk9ITAsdGhpcy52ZXJzaW9uPTB9c2V0IG5lZWRzVXBkYXRlKHQpeyEwPT09dCYmdGhpcy52ZXJzaW9uKyt9dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0O2lmKCFlJiZ2b2lkIDAhPT10LmltYWdlc1t0aGlzLnV1aWRdKXJldHVybiB0LmltYWdlc1t0aGlzLnV1aWRdO2NvbnN0IG49e3V1aWQ6dGhpcy51dWlkLHVybDoiIn0scj10aGlzLmRhdGE7aWYobnVsbCE9PXIpe2xldCB0O2lmKEFycmF5LmlzQXJyYXkocikpe3Q9W107Zm9yKGxldCBlPTAsbj1yLmxlbmd0aDtlPG47ZSsrKXJbZV0uaXNEYXRhVGV4dHVyZT90LnB1c2goZ2gocltlXS5pbWFnZSkpOnQucHVzaChnaChyW2VdKSl9ZWxzZSB0PWdoKHIpO24udXJsPXR9cmV0dXJuIGV8fCh0LmltYWdlc1t0aGlzLnV1aWRdPW4pLG59fWZ1bmN0aW9uIGdoKHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTEltYWdlRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZUJpdG1hcCYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwP2ZoLmdldERhdGFVUkwodCk6dC5kYXRhP3tkYXRhOkFycmF5LmZyb20odC5kYXRhKSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodCx0eXBlOnQuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTp7fX1sZXQgeWg9MDtjbGFzcyBtaCBleHRlbmRzIFpse2NvbnN0cnVjdG9yKHQ9bWguREVGQVVMVF9JTUFHRSxlPW1oLkRFRkFVTFRfTUFQUElORyxuPWpsLHI9amwsaT0xMDA2LG89MTAwOCxzPTEwMjMsYT0xMDA5LHU9bWguREVGQVVMVF9BTklTT1RST1BZLGM9IiIpe3N1cGVyKCksdGhpcy5pc1RleHR1cmU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6eWgrK30pLHRoaXMudXVpZD1KbCgpLHRoaXMubmFtZT0iIix0aGlzLnNvdXJjZT1uZXcgZGgodCksdGhpcy5taXBtYXBzPVtdLHRoaXMubWFwcGluZz1lLHRoaXMuY2hhbm5lbD0wLHRoaXMud3JhcFM9bix0aGlzLndyYXBUPXIsdGhpcy5tYWdGaWx0ZXI9aSx0aGlzLm1pbkZpbHRlcj1vLHRoaXMuYW5pc290cm9weT11LHRoaXMuZm9ybWF0PXMsdGhpcy5pbnRlcm5hbEZvcm1hdD1udWxsLHRoaXMudHlwZT1hLHRoaXMub2Zmc2V0PW5ldyB0aCgwLDApLHRoaXMucmVwZWF0PW5ldyB0aCgxLDEpLHRoaXMuY2VudGVyPW5ldyB0aCgwLDApLHRoaXMucm90YXRpb249MCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITAsdGhpcy5tYXRyaXg9bmV3IGVoLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5jb2xvclNwYWNlPWMsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLm9uVXBkYXRlPW51bGwsdGhpcy5pc1JlbmRlclRhcmdldFRleHR1cmU9ITEsdGhpcy5wbXJlbVZlcnNpb249MH1nZXQgaW1hZ2UoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZGF0YX1zZXQgaW1hZ2UodD1udWxsKXt0aGlzLnNvdXJjZS5kYXRhPXR9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0odGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5uYW1lPXQubmFtZSx0aGlzLnNvdXJjZT10LnNvdXJjZSx0aGlzLm1pcG1hcHM9dC5taXBtYXBzLnNsaWNlKDApLHRoaXMubWFwcGluZz10Lm1hcHBpbmcsdGhpcy5jaGFubmVsPXQuY2hhbm5lbCx0aGlzLndyYXBTPXQud3JhcFMsdGhpcy53cmFwVD10LndyYXBULHRoaXMubWFnRmlsdGVyPXQubWFnRmlsdGVyLHRoaXMubWluRmlsdGVyPXQubWluRmlsdGVyLHRoaXMuYW5pc290cm9weT10LmFuaXNvdHJvcHksdGhpcy5mb3JtYXQ9dC5mb3JtYXQsdGhpcy5pbnRlcm5hbEZvcm1hdD10LmludGVybmFsRm9ybWF0LHRoaXMudHlwZT10LnR5cGUsdGhpcy5vZmZzZXQuY29weSh0Lm9mZnNldCksdGhpcy5yZXBlYXQuY29weSh0LnJlcGVhdCksdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yb3RhdGlvbj10LnJvdGF0aW9uLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5nZW5lcmF0ZU1pcG1hcHM9dC5nZW5lcmF0ZU1pcG1hcHMsdGhpcy5wcmVtdWx0aXBseUFscGhhPXQucHJlbXVsdGlwbHlBbHBoYSx0aGlzLmZsaXBZPXQuZmxpcFksdGhpcy51bnBhY2tBbGlnbm1lbnQ9dC51bnBhY2tBbGlnbm1lbnQsdGhpcy5jb2xvclNwYWNlPXQuY29sb3JTcGFjZSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc310b0pTT04odCl7Y29uc3QgZT12b2lkIDA9PT10fHwic3RyaW5nIj09dHlwZW9mIHQ7aWYoIWUmJnZvaWQgMCE9PXQudGV4dHVyZXNbdGhpcy51dWlkXSlyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcsY2hhbm5lbDp0aGlzLmNoYW5uZWwscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCxpbnRlcm5hbEZvcm1hdDp0aGlzLmludGVybmFsRm9ybWF0LHR5cGU6dGhpcy50eXBlLGNvbG9yU3BhY2U6dGhpcy5jb2xvclNwYWNlLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09biksbn1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKDMwMCE9PXRoaXMubWFwcGluZylyZXR1cm4gdDtpZih0LmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksdC54PDB8fHQueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFlMzp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVhaztjYXNlIGpsOnQueD10Lng8MD8wOjE7YnJlYWs7Y2FzZSAxMDAyOjE9PT1NYXRoLmFicyhNYXRoLmZsb29yKHQueCklMik/dC54PU1hdGguY2VpbCh0LngpLXQueDp0Lng9dC54LU1hdGguZmxvb3IodC54KX1pZih0Lnk8MHx8dC55PjEpc3dpdGNoKHRoaXMud3JhcFQpe2Nhc2UgMWUzOnQueT10LnktTWF0aC5mbG9vcih0LnkpO2JyZWFrO2Nhc2Ugamw6dC55PXQueTwwPzA6MTticmVhaztjYXNlIDEwMDI6MT09PU1hdGguYWJzKE1hdGguZmxvb3IodC55KSUyKT90Lnk9TWF0aC5jZWlsKHQueSktdC55OnQueT10LnktTWF0aC5mbG9vcih0LnkpfXJldHVybiB0aGlzLmZsaXBZJiYodC55PTEtdC55KSx0fXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJih0aGlzLnZlcnNpb24rKyx0aGlzLnNvdXJjZS5uZWVkc1VwZGF0ZT0hMCl9c2V0IG5lZWRzUE1SRU1VcGRhdGUodCl7ITA9PT10JiZ0aGlzLnBtcmVtVmVyc2lvbisrfX1taC5ERUZBVUxUX0lNQUdFPW51bGwsbWguREVGQVVMVF9NQVBQSU5HPTMwMCxtaC5ERUZBVUxUX0FOSVNPVFJPUFk9MTtjbGFzcyB2aHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxyPTEpe3ZoLnByb3RvdHlwZS5pc1ZlY3RvcjQ9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpcy53PXJ9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMuen1zZXQgd2lkdGgodCl7dGhpcy56PXR9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnd9c2V0IGhlaWdodCh0KXt0aGlzLnc9dH1zZXQodCxlLG4scil7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1yLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzLnc9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldFcodCl7cmV0dXJuIHRoaXMudz10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7Y2FzZSAyOnRoaXMuej1lO2JyZWFrO2Nhc2UgMzp0aGlzLnc9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7Y2FzZSAzOnJldHVybiB0aGlzLnc7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnosdGhpcy53KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzLnc9dm9pZCAwIT09dC53P3QudzoxLHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzLncrPXQudyx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpcy53Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzLnc9dC53K2Uudyx0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzLncrPXQudyplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzLnctPXQudyx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpcy53LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzLnc9dC53LWUudyx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzLncqPXQudyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzLncqPXQsdGhpc31hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnosaT10aGlzLncsbz10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9b1swXSplK29bNF0qbitvWzhdKnIrb1sxMl0qaSx0aGlzLnk9b1sxXSplK29bNV0qbitvWzldKnIrb1sxM10qaSx0aGlzLno9b1syXSplK29bNl0qbitvWzEwXSpyK29bMTRdKmksdGhpcy53PW9bM10qZStvWzddKm4rb1sxMV0qcitvWzE1XSppLHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24odCl7dGhpcy53PTIqTWF0aC5hY29zKHQudyk7Y29uc3QgZT1NYXRoLnNxcnQoMS10LncqdC53KTtyZXR1cm4gZTwxZS00Pyh0aGlzLng9MSx0aGlzLnk9MCx0aGlzLno9MCk6KHRoaXMueD10LngvZSx0aGlzLnk9dC55L2UsdGhpcy56PXQuei9lKSx0aGlzfXNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeCh0KXtsZXQgZSxuLHIsaTtjb25zdCBvPS4wMSxzPS4xLGE9dC5lbGVtZW50cyx1PWFbMF0sYz1hWzRdLGw9YVs4XSxoPWFbMV0sZj1hWzVdLHA9YVs5XSxkPWFbMl0sZz1hWzZdLHk9YVsxMF07aWYoTWF0aC5hYnMoYy1oKTxvJiZNYXRoLmFicyhsLWQpPG8mJk1hdGguYWJzKHAtZyk8byl7aWYoTWF0aC5hYnMoYytoKTxzJiZNYXRoLmFicyhsK2QpPHMmJk1hdGguYWJzKHArZyk8cyYmTWF0aC5hYnModStmK3ktMyk8cylyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztlPU1hdGguUEk7Y29uc3QgdD0odSsxKS8yLGE9KGYrMSkvMixtPSh5KzEpLzIsdj0oYytoKS80LF89KGwrZCkvNCx4PShwK2cpLzQ7cmV0dXJuIHQ+YSYmdD5tP3Q8bz8obj0wLHI9LjcwNzEwNjc4MSxpPS43MDcxMDY3ODEpOihuPU1hdGguc3FydCh0KSxyPXYvbixpPV8vbik6YT5tP2E8bz8obj0uNzA3MTA2NzgxLHI9MCxpPS43MDcxMDY3ODEpOihyPU1hdGguc3FydChhKSxuPXYvcixpPXgvcik6bTxvPyhuPS43MDcxMDY3ODEscj0uNzA3MTA2NzgxLGk9MCk6KGk9TWF0aC5zcXJ0KG0pLG49Xy9pLHI9eC9pKSx0aGlzLnNldChuLHIsaSxlKSx0aGlzfWxldCBtPU1hdGguc3FydCgoZy1wKSooZy1wKSsobC1kKSoobC1kKSsoaC1jKSooaC1jKSk7cmV0dXJuIE1hdGguYWJzKG0pPC4wMDEmJihtPTEpLHRoaXMueD0oZy1wKS9tLHRoaXMueT0obC1kKS9tLHRoaXMuej0oaC1jKS9tLHRoaXMudz1NYXRoLmFjb3MoKHUrZit5LTEpLzIpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpcy53PWVbMTVdLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5taW4odGhpcy53LHQudyksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1heCh0aGlzLncsdC53KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LnosTWF0aC5taW4oZS56LHRoaXMueikpLHRoaXMudz1NYXRoLm1heCh0LncsTWF0aC5taW4oZS53LHRoaXMudykpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy56KSksdGhpcy53PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLncpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzLnc9TWF0aC5yb3VuZCh0aGlzLncpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpcy53PU1hdGgudHJ1bmModGhpcy53KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzLnc9LXRoaXMudyx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0LnordGhpcy53KnQud31sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXMudys9KHQudy10aGlzLncpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXMudz10LncrKGUudy10LncpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnomJnQudz09PXRoaXMud31mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpcy53PXRbZSszXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdFtlKzNdPXRoaXMudyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpcy53PXQuZ2V0VyhlKSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzLno9TWF0aC5yYW5kb20oKSx0aGlzLnc9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56LHlpZWxkIHRoaXMud319Y2xhc3MgX2h7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscj0xKXt0aGlzLmlzUXVhdGVybmlvbj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PXJ9c3RhdGljIHNsZXJwRmxhdCh0LGUsbixyLGksbyxzKXtsZXQgYT1uW3IrMF0sdT1uW3IrMV0sYz1uW3IrMl0sbD1uW3IrM107Y29uc3QgaD1pW28rMF0sZj1pW28rMV0scD1pW28rMl0sZD1pW28rM107aWYoMD09PXMpcmV0dXJuIHRbZSswXT1hLHRbZSsxXT11LHRbZSsyXT1jLHZvaWQodFtlKzNdPWwpO2lmKDE9PT1zKXJldHVybiB0W2UrMF09aCx0W2UrMV09Zix0W2UrMl09cCx2b2lkKHRbZSszXT1kKTtpZihsIT09ZHx8YSE9PWh8fHUhPT1mfHxjIT09cCl7bGV0IHQ9MS1zO2NvbnN0IGU9YSpoK3UqZitjKnArbCpkLG49ZT49MD8xOi0xLHI9MS1lKmU7aWYocj5OdW1iZXIuRVBTSUxPTil7Y29uc3QgaT1NYXRoLnNxcnQociksbz1NYXRoLmF0YW4yKGksZSpuKTt0PU1hdGguc2luKHQqbykvaSxzPU1hdGguc2luKHMqbykvaX1jb25zdCBpPXMqbjtpZihhPWEqdCtoKmksdT11KnQrZippLGM9Yyp0K3AqaSxsPWwqdCtkKmksdD09PTEtcyl7Y29uc3QgdD0xL01hdGguc3FydChhKmErdSp1K2MqYytsKmwpO2EqPXQsdSo9dCxjKj10LGwqPXR9fXRbZV09YSx0W2UrMV09dSx0W2UrMl09Yyx0W2UrM109bH1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodCxlLG4scixpLG8pe2NvbnN0IHM9bltyXSxhPW5bcisxXSx1PW5bcisyXSxjPW5bciszXSxsPWlbb10saD1pW28rMV0sZj1pW28rMl0scD1pW28rM107cmV0dXJuIHRbZV09cypwK2MqbCthKmYtdSpoLHRbZSsxXT1hKnArYypoK3UqbC1zKmYsdFtlKzJdPXUqcCtjKmYrcypoLWEqbCx0W2UrM109YypwLXMqbC1hKmgtdSpmLHR9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyh0KXt0aGlzLl93PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixyKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1yLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC54LHRoaXMuX3k9dC55LHRoaXMuX3o9dC56LHRoaXMuX3c9dC53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcih0LGU9ITApe2NvbnN0IG49dC5feCxyPXQuX3ksaT10Ll96LG89dC5fb3JkZXIscz1NYXRoLmNvcyxhPU1hdGguc2luLHU9cyhuLzIpLGM9cyhyLzIpLGw9cyhpLzIpLGg9YShuLzIpLGY9YShyLzIpLHA9YShpLzIpO3N3aXRjaChvKXtjYXNlIlhZWiI6dGhpcy5feD1oKmMqbCt1KmYqcCx0aGlzLl95PXUqZipsLWgqYypwLHRoaXMuX3o9dSpjKnAraCpmKmwsdGhpcy5fdz11KmMqbC1oKmYqcDticmVhaztjYXNlIllYWiI6dGhpcy5feD1oKmMqbCt1KmYqcCx0aGlzLl95PXUqZipsLWgqYypwLHRoaXMuX3o9dSpjKnAtaCpmKmwsdGhpcy5fdz11KmMqbCtoKmYqcDticmVhaztjYXNlIlpYWSI6dGhpcy5feD1oKmMqbC11KmYqcCx0aGlzLl95PXUqZipsK2gqYypwLHRoaXMuX3o9dSpjKnAraCpmKmwsdGhpcy5fdz11KmMqbC1oKmYqcDticmVhaztjYXNlIlpZWCI6dGhpcy5feD1oKmMqbC11KmYqcCx0aGlzLl95PXUqZipsK2gqYypwLHRoaXMuX3o9dSpjKnAtaCpmKmwsdGhpcy5fdz11KmMqbCtoKmYqcDticmVhaztjYXNlIllaWCI6dGhpcy5feD1oKmMqbCt1KmYqcCx0aGlzLl95PXUqZipsK2gqYypwLHRoaXMuX3o9dSpjKnAtaCpmKmwsdGhpcy5fdz11KmMqbC1oKmYqcDticmVhaztjYXNlIlhaWSI6dGhpcy5feD1oKmMqbC11KmYqcCx0aGlzLl95PXUqZipsLWgqYypwLHRoaXMuX3o9dSpjKnAraCpmKmwsdGhpcy5fdz11KmMqbCtoKmYqcH1yZXR1cm4hMD09PWUmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21BeGlzQW5nbGUodCxlKXtjb25zdCBuPWUvMixyPU1hdGguc2luKG4pO3JldHVybiB0aGlzLl94PXQueCpyLHRoaXMuX3k9dC55KnIsdGhpcy5fej10Lnoqcix0aGlzLl93PU1hdGguY29zKG4pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KXtjb25zdCBlPXQuZWxlbWVudHMsbj1lWzBdLHI9ZVs0XSxpPWVbOF0sbz1lWzFdLHM9ZVs1XSxhPWVbOV0sdT1lWzJdLGM9ZVs2XSxsPWVbMTBdLGg9bitzK2w7aWYoaD4wKXtjb25zdCB0PS41L01hdGguc3FydChoKzEpO3RoaXMuX3c9LjI1L3QsdGhpcy5feD0oYy1hKSp0LHRoaXMuX3k9KGktdSkqdCx0aGlzLl96PShvLXIpKnR9ZWxzZSBpZihuPnMmJm4+bCl7Y29uc3QgdD0yKk1hdGguc3FydCgxK24tcy1sKTt0aGlzLl93PShjLWEpL3QsdGhpcy5feD0uMjUqdCx0aGlzLl95PShyK28pL3QsdGhpcy5fej0oaSt1KS90fWVsc2UgaWYocz5sKXtjb25zdCB0PTIqTWF0aC5zcXJ0KDErcy1uLWwpO3RoaXMuX3c9KGktdSkvdCx0aGlzLl94PShyK28pL3QsdGhpcy5feT0uMjUqdCx0aGlzLl96PShhK2MpL3R9ZWxzZXtjb25zdCB0PTIqTWF0aC5zcXJ0KDErbC1uLXMpO3RoaXMuX3c9KG8tcikvdCx0aGlzLl94PShpK3UpL3QsdGhpcy5feT0oYStjKS90LHRoaXMuX3o9LjI1KnR9cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Vbml0VmVjdG9ycyh0LGUpe2xldCBuPXQuZG90KGUpKzE7cmV0dXJuIG48TnVtYmVyLkVQU0lMT04/KG49MCxNYXRoLmFicyh0LngpPk1hdGguYWJzKHQueik/KHRoaXMuX3g9LXQueSx0aGlzLl95PXQueCx0aGlzLl96PTAsdGhpcy5fdz1uKToodGhpcy5feD0wLHRoaXMuX3k9LXQueix0aGlzLl96PXQueSx0aGlzLl93PW4pKToodGhpcy5feD10LnkqZS56LXQueiplLnksdGhpcy5feT10LnoqZS54LXQueCplLnosdGhpcy5fej10LngqZS55LXQueSplLngsdGhpcy5fdz1uKSx0aGlzLm5vcm1hbGl6ZSgpfWFuZ2xlVG8odCl7cmV0dXJuIDIqTWF0aC5hY29zKE1hdGguYWJzKFFsKHRoaXMuZG90KHQpLC0xLDEpKSl9cm90YXRlVG93YXJkcyh0LGUpe2NvbnN0IG49dGhpcy5hbmdsZVRvKHQpO2lmKDA9PT1uKXJldHVybiB0aGlzO2NvbnN0IHI9TWF0aC5taW4oMSxlL24pO3JldHVybiB0aGlzLnNsZXJwKHQsciksdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgwLDAsMCwxKX1pbnZlcnQoKXtyZXR1cm4gdGhpcy5jb25qdWdhdGUoKX1jb25qdWdhdGUoKXtyZXR1cm4gdGhpcy5feCo9LTEsdGhpcy5feSo9LTEsdGhpcy5feio9LTEsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLl94KnQuX3grdGhpcy5feSp0Ll95K3RoaXMuX3oqdC5feit0aGlzLl93KnQuX3d9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93KX1ub3JtYWxpemUoKXtsZXQgdD10aGlzLmxlbmd0aCgpO3JldHVybiAwPT09dD8odGhpcy5feD0wLHRoaXMuX3k9MCx0aGlzLl96PTAsdGhpcy5fdz0xKToodD0xL3QsdGhpcy5feD10aGlzLl94KnQsdGhpcy5feT10aGlzLl95KnQsdGhpcy5fej10aGlzLl96KnQsdGhpcy5fdz10aGlzLl93KnQpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHQsdGhpcyl9bXVsdGlwbHlRdWF0ZXJuaW9ucyh0LGUpe2NvbnN0IG49dC5feCxyPXQuX3ksaT10Ll96LG89dC5fdyxzPWUuX3gsYT1lLl95LHU9ZS5feixjPWUuX3c7cmV0dXJuIHRoaXMuX3g9bipjK28qcytyKnUtaSphLHRoaXMuX3k9cipjK28qYStpKnMtbip1LHRoaXMuX3o9aSpjK28qdStuKmEtcipzLHRoaXMuX3c9bypjLW4qcy1yKmEtaSp1LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwKHQsZSl7aWYoMD09PWUpcmV0dXJuIHRoaXM7aWYoMT09PWUpcmV0dXJuIHRoaXMuY29weSh0KTtjb25zdCBuPXRoaXMuX3gscj10aGlzLl95LGk9dGhpcy5feixvPXRoaXMuX3c7bGV0IHM9byp0Ll93K24qdC5feCtyKnQuX3kraSp0Ll96O2lmKHM8MD8odGhpcy5fdz0tdC5fdyx0aGlzLl94PS10Ll94LHRoaXMuX3k9LXQuX3ksdGhpcy5fej0tdC5feixzPS1zKTp0aGlzLmNvcHkodCkscz49MSlyZXR1cm4gdGhpcy5fdz1vLHRoaXMuX3g9bix0aGlzLl95PXIsdGhpcy5fej1pLHRoaXM7Y29uc3QgYT0xLXMqcztpZihhPD1OdW1iZXIuRVBTSUxPTil7Y29uc3QgdD0xLWU7cmV0dXJuIHRoaXMuX3c9dCpvK2UqdGhpcy5fdyx0aGlzLl94PXQqbitlKnRoaXMuX3gsdGhpcy5feT10KnIrZSp0aGlzLl95LHRoaXMuX3o9dCppK2UqdGhpcy5feix0aGlzLm5vcm1hbGl6ZSgpLHRoaXN9Y29uc3QgdT1NYXRoLnNxcnQoYSksYz1NYXRoLmF0YW4yKHUscyksbD1NYXRoLnNpbigoMS1lKSpjKS91LGg9TWF0aC5zaW4oZSpjKS91O3JldHVybiB0aGlzLl93PW8qbCt0aGlzLl93KmgsdGhpcy5feD1uKmwrdGhpcy5feCpoLHRoaXMuX3k9cipsK3RoaXMuX3kqaCx0aGlzLl96PWkqbCt0aGlzLl96KmgsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2xlcnBRdWF0ZXJuaW9ucyh0LGUsbil7cmV0dXJuIHRoaXMuY29weSh0KS5zbGVycChlLG4pfXJhbmRvbSgpe2NvbnN0IHQ9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksZT0yKk1hdGguUEkqTWF0aC5yYW5kb20oKSxuPU1hdGgucmFuZG9tKCkscj1NYXRoLnNxcnQoMS1uKSxpPU1hdGguc3FydChuKTtyZXR1cm4gdGhpcy5zZXQocipNYXRoLnNpbih0KSxyKk1hdGguY29zKHQpLGkqTWF0aC5zaW4oZSksaSpNYXRoLmNvcyhlKSl9ZXF1YWxzKHQpe3JldHVybiB0Ll94PT09dGhpcy5feCYmdC5feT09PXRoaXMuX3kmJnQuX3o9PT10aGlzLl96JiZ0Ll93PT09dGhpcy5fd31mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLl94PXRbZV0sdGhpcy5feT10W2UrMV0sdGhpcy5fej10W2UrMl0sdGhpcy5fdz10W2UrM10sdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5feCx0W2UrMV09dGhpcy5feSx0W2UrMl09dGhpcy5feix0W2UrM109dGhpcy5fdyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5feD10LmdldFgoZSksdGhpcy5feT10LmdldFkoZSksdGhpcy5fej10LmdldFooZSksdGhpcy5fdz10LmdldFcoZSksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMudG9BcnJheSgpfV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fd319Y2xhc3MgeGh7Y29uc3RydWN0b3IodD0wLGU9MCxuPTApe3hoLnByb3RvdHlwZS5pc1ZlY3RvcjM9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW59c2V0KHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49dGhpcy56KSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzfW11bHRpcGx5VmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54KmUueCx0aGlzLnk9dC55KmUueSx0aGlzLno9dC56KmUueix0aGlzfWFwcGx5RXVsZXIodCl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKGJoLnNldEZyb21FdWxlcih0KSl9YXBwbHlBeGlzQW5nbGUodCxlKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oYmguc2V0RnJvbUF4aXNBbmdsZSh0LGUpKX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnosaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbM10qbitpWzZdKnIsdGhpcy55PWlbMV0qZStpWzRdKm4raVs3XSpyLHRoaXMuej1pWzJdKmUraVs1XSpuK2lbOF0qcix0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4Myh0KS5ub3JtYWxpemUoKX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnosaT10LmVsZW1lbnRzLG89MS8oaVszXSplK2lbN10qbitpWzExXSpyK2lbMTVdKTtyZXR1cm4gdGhpcy54PShpWzBdKmUraVs0XSpuK2lbOF0qcitpWzEyXSkqbyx0aGlzLnk9KGlbMV0qZStpWzVdKm4raVs5XSpyK2lbMTNdKSpvLHRoaXMuej0oaVsyXSplK2lbNl0qbitpWzEwXSpyK2lbMTRdKSpvLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHI9dGhpcy56LGk9dC54LG89dC55LHM9dC56LGE9dC53LHU9MioobypyLXMqbiksYz0yKihzKmUtaSpyKSxsPTIqKGkqbi1vKmUpO3JldHVybiB0aGlzLng9ZSthKnUrbypsLXMqYyx0aGlzLnk9bithKmMrcyp1LWkqbCx0aGlzLno9cithKmwraSpjLW8qdSx0aGlzfXByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4KX11bnByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKX10cmFuc2Zvcm1EaXJlY3Rpb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnosaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbNF0qbitpWzhdKnIsdGhpcy55PWlbMV0qZStpWzVdKm4raVs5XSpyLHRoaXMuej1pWzJdKmUraVs2XSpuK2lbMTBdKnIsdGhpcy5ub3JtYWxpemUoKX1kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodC56LE1hdGgubWluKGUueix0aGlzLnopKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueikpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KHQsTWF0aC5taW4oZSxuKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgbj10Lngscj10LnksaT10Lnosbz1lLngscz1lLnksYT1lLno7cmV0dXJuIHRoaXMueD1yKmEtaSpzLHRoaXMueT1pKm8tbiphLHRoaXMuej1uKnMtcipvLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKDA9PT1lKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgbj10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIobil9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIHdoLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKHdoKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1Yih3aC5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKDA9PT1lKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoUWwobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnkscj10aGlzLnotdC56O3JldHVybiBlKmUrbipuK3Iqcn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KStNYXRoLmFicyh0aGlzLnotdC56KX1zZXRGcm9tU3BoZXJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHModC5yYWRpdXMsdC5waGksdC50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LGUsbil7Y29uc3Qgcj1NYXRoLnNpbihlKSp0O3JldHVybiB0aGlzLng9cipNYXRoLnNpbihuKSx0aGlzLnk9TWF0aC5jb3MoZSkqdCx0aGlzLno9cipNYXRoLmNvcyhuKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModC5yYWRpdXMsdC50aGV0YSx0LnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LGUsbil7cmV0dXJuIHRoaXMueD10Kk1hdGguc2luKGUpLHRoaXMueT1uLHRoaXMuej10Kk1hdGguY29zKGUpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUodCl7Y29uc3QgZT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxuPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLHI9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXMuej1yLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLDQqZSl9c2V0RnJvbU1hdHJpeDNDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cywzKmUpfXNldEZyb21FdWxlcih0KXtyZXR1cm4gdGhpcy54PXQuX3gsdGhpcy55PXQuX3ksdGhpcy56PXQuX3osdGhpc31zZXRGcm9tQ29sb3IodCl7cmV0dXJuIHRoaXMueD10LnIsdGhpcy55PXQuZyx0aGlzLno9dC5iLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9cmFuZG9tRGlyZWN0aW9uKCl7Y29uc3QgdD1NYXRoLnJhbmRvbSgpKk1hdGguUEkqMixlPTIqTWF0aC5yYW5kb20oKS0xLG49TWF0aC5zcXJ0KDEtZSplKTtyZXR1cm4gdGhpcy54PW4qTWF0aC5jb3ModCksdGhpcy55PWUsdGhpcy56PW4qTWF0aC5zaW4odCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMuen19Y29uc3Qgd2g9bmV3IHhoLGJoPW5ldyBfaDtjbGFzcyBEaHtjb25zdHJ1Y3Rvcih0PW5ldyB4aCgxLzAsMS8wLDEvMCksZT1uZXcgeGgoLTEvMCwtMS8wLC0xLzApKXt0aGlzLmlzQm94Mz0hMCx0aGlzLm1pbj10LHRoaXMubWF4PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzfXNldEZyb21BcnJheSh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrPTMpdGhpcy5leHBhbmRCeVBvaW50KENoLmZyb21BcnJheSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10LmNvdW50O2U8bjtlKyspdGhpcy5leHBhbmRCeVBvaW50KENoLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSk7cmV0dXJuIHRoaXN9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQodFtlXSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUodCxlKXtjb25zdCBuPUNoLmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLnN1YihuKSx0aGlzLm1heC5jb3B5KHQpLmFkZChuKSx0aGlzfXNldEZyb21PYmplY3QodCxlPSExKXtyZXR1cm4gdGhpcy5tYWtlRW1wdHkoKSx0aGlzLmV4cGFuZEJ5T2JqZWN0KHQsZSl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PXRoaXMubWluLno9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS0xLzAsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fHx0aGlzLm1heC56PHRoaXMubWluLnp9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9ZXhwYW5kQnlQb2ludCh0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQpLHRoaXMubWF4Lm1heCh0KSx0aGlzfWV4cGFuZEJ5VmVjdG9yKHQpe3JldHVybiB0aGlzLm1pbi5zdWIodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXhwYW5kQnlTY2FsYXIodCl7cmV0dXJuIHRoaXMubWluLmFkZFNjYWxhcigtdCksdGhpcy5tYXguYWRkU2NhbGFyKHQpLHRoaXN9ZXhwYW5kQnlPYmplY3QodCxlPSExKXt0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTtjb25zdCBuPXQuZ2VvbWV0cnk7aWYodm9pZCAwIT09bil7Y29uc3Qgcj1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZighMD09PWUmJnZvaWQgMCE9PXImJiEwIT09dC5pc0luc3RhbmNlZE1lc2gpZm9yKGxldCBlPTAsbj1yLmNvdW50O2U8bjtlKyspITA9PT10LmlzTWVzaD90LmdldFZlcnRleFBvc2l0aW9uKGUsQ2gpOkNoLmZyb21CdWZmZXJBdHRyaWJ1dGUocixlKSxDaC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KENoKTtlbHNlIHZvaWQgMCE9PXQuYm91bmRpbmdCb3g/KG51bGw9PT10LmJvdW5kaW5nQm94JiZ0LmNvbXB1dGVCb3VuZGluZ0JveCgpLFNoLmNvcHkodC5ib3VuZGluZ0JveCkpOihudWxsPT09bi5ib3VuZGluZ0JveCYmbi5jb21wdXRlQm91bmRpbmdCb3goKSxTaC5jb3B5KG4uYm91bmRpbmdCb3gpKSxTaC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy51bmlvbihTaCl9Y29uc3Qgcj10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLG49ci5sZW5ndGg7dDxuO3QrKyl0aGlzLmV4cGFuZEJ5T2JqZWN0KHJbdF0sZSk7cmV0dXJuIHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC54Pj10aGlzLm1pbi54JiZ0Lng8PXRoaXMubWF4LngmJnQueT49dGhpcy5taW4ueSYmdC55PD10aGlzLm1heC55JiZ0Lno+PXRoaXMubWluLnomJnQuejw9dGhpcy5tYXguen1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9dC5taW4ueiYmdC5tYXguejw9dGhpcy5tYXguen1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLCh0LnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQubWF4Lng+PXRoaXMubWluLngmJnQubWluLng8PXRoaXMubWF4LngmJnQubWF4Lnk+PXRoaXMubWluLnkmJnQubWluLnk8PXRoaXMubWF4LnkmJnQubWF4Lno+PXRoaXMubWluLnomJnQubWluLno8PXRoaXMubWF4Lnp9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQuY2VudGVyLENoKSxDaC5kaXN0YW5jZVRvU3F1YXJlZCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWludGVyc2VjdHNQbGFuZSh0KXtsZXQgZSxuO3JldHVybiB0Lm5vcm1hbC54PjA/KGU9dC5ub3JtYWwueCp0aGlzLm1pbi54LG49dC5ub3JtYWwueCp0aGlzLm1heC54KTooZT10Lm5vcm1hbC54KnRoaXMubWF4Lngsbj10Lm5vcm1hbC54KnRoaXMubWluLngpLHQubm9ybWFsLnk+MD8oZSs9dC5ub3JtYWwueSp0aGlzLm1pbi55LG4rPXQubm9ybWFsLnkqdGhpcy5tYXgueSk6KGUrPXQubm9ybWFsLnkqdGhpcy5tYXgueSxuKz10Lm5vcm1hbC55KnRoaXMubWluLnkpLHQubm9ybWFsLno+MD8oZSs9dC5ub3JtYWwueip0aGlzLm1pbi56LG4rPXQubm9ybWFsLnoqdGhpcy5tYXgueik6KGUrPXQubm9ybWFsLnoqdGhpcy5tYXgueixuKz10Lm5vcm1hbC56KnRoaXMubWluLnopLGU8PS10LmNvbnN0YW50JiZuPj0tdC5jb25zdGFudH1pbnRlcnNlY3RzVHJpYW5nbGUodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIoT2gpLExoLnN1YlZlY3RvcnModGhpcy5tYXgsT2gpLEFoLnN1YlZlY3RvcnModC5hLE9oKSxOaC5zdWJWZWN0b3JzKHQuYixPaCksSWguc3ViVmVjdG9ycyh0LmMsT2gpLE1oLnN1YlZlY3RvcnMoTmgsQWgpLEZoLnN1YlZlY3RvcnMoSWgsTmgpLFRoLnN1YlZlY3RvcnMoQWgsSWgpO2xldCBlPVswLC1NaC56LE1oLnksMCwtRmgueixGaC55LDAsLVRoLnosVGgueSxNaC56LDAsLU1oLngsRmgueiwwLC1GaC54LFRoLnosMCwtVGgueCwtTWgueSxNaC54LDAsLUZoLnksRmgueCwwLC1UaC55LFRoLngsMF07cmV0dXJuISghQmgoZSxBaCxOaCxJaCxMaCl8fChlPVsxLDAsMCwwLDEsMCwwLDAsMV0sIUJoKGUsQWgsTmgsSWgsTGgpKSkmJihQaC5jcm9zc1ZlY3RvcnMoTWgsRmgpLGU9W1BoLngsUGgueSxQaC56XSxCaChlLEFoLE5oLEloLExoKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQsQ2gpLmRpc3RhbmNlVG8odCl9Z2V0Qm91bmRpbmdTcGhlcmUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3QubWFrZUVtcHR5KCk6KHRoaXMuZ2V0Q2VudGVyKHQuY2VudGVyKSx0LnJhZGl1cz0uNSp0aGlzLmdldFNpemUoQ2gpLmxlbmd0aCgpKSx0fWludGVyc2VjdCh0KXtyZXR1cm4gdGhpcy5taW4ubWF4KHQubWluKSx0aGlzLm1heC5taW4odC5tYXgpLHRoaXMuaXNFbXB0eSgpJiZ0aGlzLm1ha2VFbXB0eSgpLHRoaXN9dW5pb24odCl7cmV0dXJuIHRoaXMubWluLm1pbih0Lm1pbiksdGhpcy5tYXgubWF4KHQubWF4KSx0aGlzfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCl8fChFaFswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxFaFsxXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxFaFsyXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxFaFszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxFaFs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxFaFs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxFaFs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxFaFs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldEZyb21Qb2ludHMoRWgpKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5taW4uYWRkKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5taW4uZXF1YWxzKHRoaXMubWluKSYmdC5tYXguZXF1YWxzKHRoaXMubWF4KX19Y29uc3QgRWg9W25ldyB4aCxuZXcgeGgsbmV3IHhoLG5ldyB4aCxuZXcgeGgsbmV3IHhoLG5ldyB4aCxuZXcgeGhdLENoPW5ldyB4aCxTaD1uZXcgRGgsQWg9bmV3IHhoLE5oPW5ldyB4aCxJaD1uZXcgeGgsTWg9bmV3IHhoLEZoPW5ldyB4aCxUaD1uZXcgeGgsT2g9bmV3IHhoLExoPW5ldyB4aCxQaD1uZXcgeGgsUmg9bmV3IHhoO2Z1bmN0aW9uIEJoKHQsZSxuLHIsaSl7Zm9yKGxldCBvPTAscz10Lmxlbmd0aC0zO288PXM7bys9Myl7UmguZnJvbUFycmF5KHQsbyk7Y29uc3Qgcz1pLngqTWF0aC5hYnMoUmgueCkraS55Kk1hdGguYWJzKFJoLnkpK2kueipNYXRoLmFicyhSaC56KSxhPWUuZG90KFJoKSx1PW4uZG90KFJoKSxjPXIuZG90KFJoKTtpZihNYXRoLm1heCgtTWF0aC5tYXgoYSx1LGMpLE1hdGgubWluKGEsdSxjKSk+cylyZXR1cm4hMX1yZXR1cm4hMH1jb25zdCBraD1uZXcgRGgsemg9bmV3IHhoLGpoPW5ldyB4aDtjbGFzcyBVaHtjb25zdHJ1Y3Rvcih0PW5ldyB4aCxlPS0xKXt0aGlzLmlzU3BoZXJlPSEwLHRoaXMuY2VudGVyPXQsdGhpcy5yYWRpdXM9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz1lLHRoaXN9c2V0RnJvbVBvaW50cyh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXI7dm9pZCAwIT09ZT9uLmNvcHkoZSk6a2guc2V0RnJvbVBvaW50cyh0KS5nZXRDZW50ZXIobik7bGV0IHI9MDtmb3IobGV0IGU9MCxpPXQubGVuZ3RoO2U8aTtlKyspcj1NYXRoLm1heChyLG4uZGlzdGFuY2VUb1NxdWFyZWQodFtlXSkpO3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQociksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5yYWRpdXM8MH1tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5jZW50ZXIuc2V0KDAsMCwwKSx0aGlzLnJhZGl1cz0tMSx0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUbyh0aGlzLmNlbnRlciktdGhpcy5yYWRpdXN9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucmFkaXVzK3QucmFkaXVzO3JldHVybiB0LmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PWUqZX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNTcGhlcmUodGhpcyl9aW50ZXJzZWN0c1BsYW5lKHQpe3JldHVybiBNYXRoLmFicyh0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c31jbGFtcFBvaW50KHQsZSl7Y29uc3Qgbj10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0KTtyZXR1cm4gZS5jb3B5KHQpLG4+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihlLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSksZX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/KHQubWFrZUVtcHR5KCksdCk6KHQuc2V0KHRoaXMuY2VudGVyLHRoaXMuY2VudGVyKSx0LmV4cGFuZEJ5U2NhbGFyKHRoaXMucmFkaXVzKSx0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCh0KSx0aGlzLnJhZGl1cz10aGlzLnJhZGl1cyp0LmdldE1heFNjYWxlT25BeGlzKCksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFkZCh0KSx0aGlzfWV4cGFuZEJ5UG9pbnQodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9MCx0aGlzO3poLnN1YlZlY3RvcnModCx0aGlzLmNlbnRlcik7Y29uc3QgZT16aC5sZW5ndGhTcSgpO2lmKGU+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IHQ9TWF0aC5zcXJ0KGUpLG49LjUqKHQtdGhpcy5yYWRpdXMpO3RoaXMuY2VudGVyLmFkZFNjYWxlZFZlY3Rvcih6aCxuL3QpLHRoaXMucmFkaXVzKz1ufXJldHVybiB0aGlzfXVuaW9uKHQpe3JldHVybiB0LmlzRW1wdHkoKT90aGlzOnRoaXMuaXNFbXB0eSgpPyh0aGlzLmNvcHkodCksdGhpcyk6KCEwPT09dGhpcy5jZW50ZXIuZXF1YWxzKHQuY2VudGVyKT90aGlzLnJhZGl1cz1NYXRoLm1heCh0aGlzLnJhZGl1cyx0LnJhZGl1cyk6KGpoLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5jZW50ZXIpLnNldExlbmd0aCh0LnJhZGl1cyksdGhpcy5leHBhbmRCeVBvaW50KHpoLmNvcHkodC5jZW50ZXIpLmFkZChqaCkpLHRoaXMuZXhwYW5kQnlQb2ludCh6aC5jb3B5KHQuY2VudGVyKS5zdWIoamgpKSksdGhpcyl9ZXF1YWxzKHQpe3JldHVybiB0LmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZ0LnJhZGl1cz09PXRoaXMucmFkaXVzfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX1jb25zdCBxaD1uZXcgeGgsVmg9bmV3IHhoLEdoPW5ldyB4aCxZaD1uZXcgeGgsWGg9bmV3IHhoLFdoPW5ldyB4aCxIaD1uZXcgeGg7Y2xhc3MgWmh7Y29uc3RydWN0b3IodCxlLG4scixpLG8scyxhLHUsYyxsLGgsZixwLGQsZyl7WmgucHJvdG90eXBlLmlzTWF0cml4ND0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSx2b2lkIDAhPT10JiZ0aGlzLnNldCh0LGUsbixyLGksbyxzLGEsdSxjLGwsaCxmLHAsZCxnKX1zZXQodCxlLG4scixpLG8scyxhLHUsYyxsLGgsZixwLGQsZyl7Y29uc3QgeT10aGlzLmVsZW1lbnRzO3JldHVybiB5WzBdPXQseVs0XT1lLHlbOF09bix5WzEyXT1yLHlbMV09aSx5WzVdPW8seVs5XT1zLHlbMTNdPWEseVsyXT11LHlbNl09Yyx5WzEwXT1sLHlbMTRdPWgseVszXT1mLHlbN109cCx5WzExXT1kLHlbMTVdPWcsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfWNsb25lKCl7cmV0dXJuKG5ldyBaaCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sZVs5XT1uWzldLGVbMTBdPW5bMTBdLGVbMTFdPW5bMTFdLGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLGVbMTVdPW5bMTVdLHRoaXN9Y29weVBvc2l0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLHRoaXN9c2V0RnJvbU1hdHJpeDModCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbM10sZVs2XSwwLGVbMV0sZVs0XSxlWzddLDAsZVsyXSxlWzVdLGVbOF0sMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpLHRoaXN9bWFrZUJhc2lzKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodC54LGUueCxuLngsMCx0LnksZS55LG4ueSwwLHQueixlLnosbi56LDAsMCwwLDAsMSksdGhpc31leHRyYWN0Um90YXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cyxyPTEvS2guc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLGk9MS9LaC5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCksbz0xL0toLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gZVswXT1uWzBdKnIsZVsxXT1uWzFdKnIsZVsyXT1uWzJdKnIsZVszXT0wLGVbNF09bls0XSppLGVbNV09bls1XSppLGVbNl09bls2XSppLGVbN109MCxlWzhdPW5bOF0qbyxlWzldPW5bOV0qbyxlWzEwXT1uWzEwXSpvLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21FdWxlcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10Lngscj10LnksaT10Lnosbz1NYXRoLmNvcyhuKSxzPU1hdGguc2luKG4pLGE9TWF0aC5jb3MociksdT1NYXRoLnNpbihyKSxjPU1hdGguY29zKGkpLGw9TWF0aC5zaW4oaSk7aWYoIlhZWiI9PT10Lm9yZGVyKXtjb25zdCB0PW8qYyxuPW8qbCxyPXMqYyxpPXMqbDtlWzBdPWEqYyxlWzRdPS1hKmwsZVs4XT11LGVbMV09bityKnUsZVs1XT10LWkqdSxlWzldPS1zKmEsZVsyXT1pLXQqdSxlWzZdPXIrbip1LGVbMTBdPW8qYX1lbHNlIGlmKCJZWFoiPT09dC5vcmRlcil7Y29uc3QgdD1hKmMsbj1hKmwscj11KmMsaT11Kmw7ZVswXT10K2kqcyxlWzRdPXIqcy1uLGVbOF09byp1LGVbMV09bypsLGVbNV09bypjLGVbOV09LXMsZVsyXT1uKnMtcixlWzZdPWkrdCpzLGVbMTBdPW8qYX1lbHNlIGlmKCJaWFkiPT09dC5vcmRlcil7Y29uc3QgdD1hKmMsbj1hKmwscj11KmMsaT11Kmw7ZVswXT10LWkqcyxlWzRdPS1vKmwsZVs4XT1yK24qcyxlWzFdPW4rcipzLGVbNV09bypjLGVbOV09aS10KnMsZVsyXT0tbyp1LGVbNl09cyxlWzEwXT1vKmF9ZWxzZSBpZigiWllYIj09PXQub3JkZXIpe2NvbnN0IHQ9bypjLG49bypsLHI9cypjLGk9cypsO2VbMF09YSpjLGVbNF09cip1LW4sZVs4XT10KnUraSxlWzFdPWEqbCxlWzVdPWkqdSt0LGVbOV09bip1LXIsZVsyXT0tdSxlWzZdPXMqYSxlWzEwXT1vKmF9ZWxzZSBpZigiWVpYIj09PXQub3JkZXIpe2NvbnN0IHQ9byphLG49byp1LHI9cyphLGk9cyp1O2VbMF09YSpjLGVbNF09aS10KmwsZVs4XT1yKmwrbixlWzFdPWwsZVs1XT1vKmMsZVs5XT0tcypjLGVbMl09LXUqYyxlWzZdPW4qbCtyLGVbMTBdPXQtaSpsfWVsc2UgaWYoIlhaWSI9PT10Lm9yZGVyKXtjb25zdCB0PW8qYSxuPW8qdSxyPXMqYSxpPXMqdTtlWzBdPWEqYyxlWzRdPS1sLGVbOF09dSpjLGVbMV09dCpsK2ksZVs1XT1vKmMsZVs5XT1uKmwtcixlWzJdPXIqbC1uLGVbNl09cypjLGVbMTBdPWkqbCt0fXJldHVybiBlWzNdPTAsZVs3XT0wLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLmNvbXBvc2UoUWgsdCwkaCl9bG9va0F0KHQsZSxuKXtjb25zdCByPXRoaXMuZWxlbWVudHM7cmV0dXJuIG5mLnN1YlZlY3RvcnModCxlKSwwPT09bmYubGVuZ3RoU3EoKSYmKG5mLno9MSksbmYubm9ybWFsaXplKCksdGYuY3Jvc3NWZWN0b3JzKG4sbmYpLDA9PT10Zi5sZW5ndGhTcSgpJiYoMT09PU1hdGguYWJzKG4ueik/bmYueCs9MWUtNDpuZi56Kz0xZS00LG5mLm5vcm1hbGl6ZSgpLHRmLmNyb3NzVmVjdG9ycyhuLG5mKSksdGYubm9ybWFsaXplKCksZWYuY3Jvc3NWZWN0b3JzKG5mLHRmKSxyWzBdPXRmLngscls0XT1lZi54LHJbOF09bmYueCxyWzFdPXRmLnkscls1XT1lZi55LHJbOV09bmYueSxyWzJdPXRmLnoscls2XT1lZi56LHJbMTBdPW5mLnosdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscj1lLmVsZW1lbnRzLGk9dGhpcy5lbGVtZW50cyxvPW5bMF0scz1uWzRdLGE9bls4XSx1PW5bMTJdLGM9blsxXSxsPW5bNV0saD1uWzldLGY9blsxM10scD1uWzJdLGQ9bls2XSxnPW5bMTBdLHk9blsxNF0sbT1uWzNdLHY9bls3XSxfPW5bMTFdLHg9blsxNV0sdz1yWzBdLGI9cls0XSxEPXJbOF0sRT1yWzEyXSxDPXJbMV0sUz1yWzVdLEE9cls5XSxOPXJbMTNdLEk9clsyXSxNPXJbNl0sRj1yWzEwXSxUPXJbMTRdLE89clszXSxMPXJbN10sUD1yWzExXSxSPXJbMTVdO3JldHVybiBpWzBdPW8qdytzKkMrYSpJK3UqTyxpWzRdPW8qYitzKlMrYSpNK3UqTCxpWzhdPW8qRCtzKkErYSpGK3UqUCxpWzEyXT1vKkUrcypOK2EqVCt1KlIsaVsxXT1jKncrbCpDK2gqSStmKk8saVs1XT1jKmIrbCpTK2gqTStmKkwsaVs5XT1jKkQrbCpBK2gqRitmKlAsaVsxM109YypFK2wqTitoKlQrZipSLGlbMl09cCp3K2QqQytnKkkreSpPLGlbNl09cCpiK2QqUytnKk0reSpMLGlbMTBdPXAqRCtkKkErZypGK3kqUCxpWzE0XT1wKkUrZCpOK2cqVCt5KlIsaVszXT1tKncrdipDK18qSSt4Kk8saVs3XT1tKmIrdipTK18qTSt4KkwsaVsxMV09bSpEK3YqQStfKkYreCpQLGlbMTVdPW0qRSt2Kk4rXypUK3gqUix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzRdKj10LGVbOF0qPXQsZVsxMl0qPXQsZVsxXSo9dCxlWzVdKj10LGVbOV0qPXQsZVsxM10qPXQsZVsyXSo9dCxlWzZdKj10LGVbMTBdKj10LGVbMTRdKj10LGVbM10qPXQsZVs3XSo9dCxlWzExXSo9dCxlWzE1XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbNF0scj10WzhdLGk9dFsxMl0sbz10WzFdLHM9dFs1XSxhPXRbOV0sdT10WzEzXSxjPXRbMl0sbD10WzZdLGg9dFsxMF0sZj10WzE0XTtyZXR1cm4gdFszXSooK2kqYSpsLXIqdSpsLWkqcypoK24qdSpoK3IqcypmLW4qYSpmKSt0WzddKigrZSphKmYtZSp1KmgraSpvKmgtcipvKmYrcip1KmMtaSphKmMpK3RbMTFdKigrZSp1KmwtZSpzKmYtaSpvKmwrbipvKmYraSpzKmMtbip1KmMpK3RbMTVdKigtcipzKmMtZSphKmwrZSpzKmgrcipvKmwtbipvKmgrbiphKmMpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxuKXtjb25zdCByPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhyWzEyXT10LngsclsxM109dC55LHJbMTRdPXQueik6KHJbMTJdPXQsclsxM109ZSxyWzE0XT1uKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHI9dFsyXSxpPXRbM10sbz10WzRdLHM9dFs1XSxhPXRbNl0sdT10WzddLGM9dFs4XSxsPXRbOV0saD10WzEwXSxmPXRbMTFdLHA9dFsxMl0sZD10WzEzXSxnPXRbMTRdLHk9dFsxNV0sbT1sKmcqdS1kKmgqdStkKmEqZi1zKmcqZi1sKmEqeStzKmgqeSx2PXAqaCp1LWMqZyp1LXAqYSpmK28qZypmK2MqYSp5LW8qaCp5LF89YypkKnUtcCpsKnUrcCpzKmYtbypkKmYtYypzKnkrbypsKnkseD1wKmwqYS1jKmQqYS1wKnMqaCtvKmQqaCtjKnMqZy1vKmwqZyx3PWUqbStuKnYrcipfK2kqeDtpZigwPT09dylyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgYj0xL3c7cmV0dXJuIHRbMF09bSpiLHRbMV09KGQqaCppLWwqZyppLWQqcipmK24qZypmK2wqcip5LW4qaCp5KSpiLHRbMl09KHMqZyppLWQqYSppK2Qqcip1LW4qZyp1LXMqcip5K24qYSp5KSpiLHRbM109KGwqYSppLXMqaCppLWwqcip1K24qaCp1K3MqcipmLW4qYSpmKSpiLHRbNF09dipiLHRbNV09KGMqZyppLXAqaCppK3AqcipmLWUqZypmLWMqcip5K2UqaCp5KSpiLHRbNl09KHAqYSppLW8qZyppLXAqcip1K2UqZyp1K28qcip5LWUqYSp5KSpiLHRbN109KG8qaCppLWMqYSppK2Mqcip1LWUqaCp1LW8qcipmK2UqYSpmKSpiLHRbOF09XypiLHRbOV09KHAqbCppLWMqZCppLXAqbipmK2UqZCpmK2Mqbip5LWUqbCp5KSpiLHRbMTBdPShvKmQqaS1wKnMqaStwKm4qdS1lKmQqdS1vKm4qeStlKnMqeSkqYix0WzExXT0oYypzKmktbypsKmktYypuKnUrZSpsKnUrbypuKmYtZSpzKmYpKmIsdFsxMl09eCpiLHRbMTNdPShjKmQqci1wKmwqcitwKm4qaC1lKmQqaC1jKm4qZytlKmwqZykqYix0WzE0XT0ocCpzKnItbypkKnItcCpuKmErZSpkKmErbypuKmctZSpzKmcpKmIsdFsxNV09KG8qbCpyLWMqcypyK2MqbiphLWUqbCphLW8qbipoK2UqcypoKSpiLHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LHI9dC55LGk9dC56O3JldHVybiBlWzBdKj1uLGVbNF0qPXIsZVs4XSo9aSxlWzFdKj1uLGVbNV0qPXIsZVs5XSo9aSxlWzJdKj1uLGVbNl0qPXIsZVsxMF0qPWksZVszXSo9bixlWzddKj1yLGVbMTFdKj1pLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSxuPXRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLHI9dFs4XSp0WzhdK3RbOV0qdFs5XSt0WzEwXSp0WzEwXTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGUsbixyKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxuKXtyZXR1cm4gdC5pc1ZlY3RvcjM/dGhpcy5zZXQoMSwwLDAsdC54LDAsMSwwLHQueSwwLDAsMSx0LnosMCwwLDAsMSk6dGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLG4sMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxuLDAsMCwxLDAsMCwtbiwwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsMCxuLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxyPU1hdGguc2luKGUpLGk9MS1uLG89dC54LHM9dC55LGE9dC56LHU9aSpvLGM9aSpzO3JldHVybiB0aGlzLnNldCh1Km8rbix1KnMtciphLHUqYStyKnMsMCx1KnMrciphLGMqcytuLGMqYS1yKm8sMCx1KmEtcipzLGMqYStyKm8saSphKmErbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxuLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLG4scixpLG8pe3JldHVybiB0aGlzLnNldCgxLG4saSwwLHQsMSxvLDAsZSxyLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLG4pe2NvbnN0IHI9dGhpcy5lbGVtZW50cyxpPWUuX3gsbz1lLl95LHM9ZS5feixhPWUuX3csdT1pK2ksYz1vK28sbD1zK3MsaD1pKnUsZj1pKmMscD1pKmwsZD1vKmMsZz1vKmwseT1zKmwsbT1hKnUsdj1hKmMsXz1hKmwseD1uLngsdz1uLnksYj1uLno7cmV0dXJuIHJbMF09KDEtKGQreSkpKngsclsxXT0oZitfKSp4LHJbMl09KHAtdikqeCxyWzNdPTAscls0XT0oZi1fKSp3LHJbNV09KDEtKGgreSkpKncscls2XT0oZyttKSp3LHJbN109MCxyWzhdPShwK3YpKmIscls5XT0oZy1tKSpiLHJbMTBdPSgxLShoK2QpKSpiLHJbMTFdPTAsclsxMl09dC54LHJbMTNdPXQueSxyWzE0XT10LnosclsxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUsbil7Y29uc3Qgcj10aGlzLmVsZW1lbnRzO2xldCBpPUtoLnNldChyWzBdLHJbMV0sclsyXSkubGVuZ3RoKCk7Y29uc3Qgbz1LaC5zZXQocls0XSxyWzVdLHJbNl0pLmxlbmd0aCgpLHM9S2guc2V0KHJbOF0scls5XSxyWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihpPS1pKSx0Lng9clsxMl0sdC55PXJbMTNdLHQuej1yWzE0XSxKaC5jb3B5KHRoaXMpO2NvbnN0IGE9MS9pLHU9MS9vLGM9MS9zO3JldHVybiBKaC5lbGVtZW50c1swXSo9YSxKaC5lbGVtZW50c1sxXSo9YSxKaC5lbGVtZW50c1syXSo9YSxKaC5lbGVtZW50c1s0XSo9dSxKaC5lbGVtZW50c1s1XSo9dSxKaC5lbGVtZW50c1s2XSo9dSxKaC5lbGVtZW50c1s4XSo9YyxKaC5lbGVtZW50c1s5XSo9YyxKaC5lbGVtZW50c1sxMF0qPWMsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgoSmgpLG4ueD1pLG4ueT1vLG4uej1zLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxuLHIsaSxvLHM9SGwpe2NvbnN0IGE9dGhpcy5lbGVtZW50cyx1PTIqaS8oZS10KSxjPTIqaS8obi1yKSxsPShlK3QpLyhlLXQpLGg9KG4rcikvKG4tcik7bGV0IGYscDtpZihzPT09SGwpZj0tKG8raSkvKG8taSkscD0tMipvKmkvKG8taSk7ZWxzZXtpZigyMDAxIT09cyl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZVBlcnNwZWN0aXZlKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrcyk7Zj0tby8oby1pKSxwPS1vKmkvKG8taSl9cmV0dXJuIGFbMF09dSxhWzRdPTAsYVs4XT1sLGFbMTJdPTAsYVsxXT0wLGFbNV09YyxhWzldPWgsYVsxM109MCxhWzJdPTAsYVs2XT0wLGFbMTBdPWYsYVsxNF09cCxhWzNdPTAsYVs3XT0wLGFbMTFdPS0xLGFbMTVdPTAsdGhpc31tYWtlT3J0aG9ncmFwaGljKHQsZSxuLHIsaSxvLHM9SGwpe2NvbnN0IGE9dGhpcy5lbGVtZW50cyx1PTEvKGUtdCksYz0xLyhuLXIpLGw9MS8oby1pKSxoPShlK3QpKnUsZj0obityKSpjO2xldCBwLGQ7aWYocz09PUhsKXA9KG8raSkqbCxkPS0yKmw7ZWxzZXtpZigyMDAxIT09cyl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZU9ydGhvZ3JhcGhpYygpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK3MpO3A9aSpsLGQ9LTEqbH1yZXR1cm4gYVswXT0yKnUsYVs0XT0wLGFbOF09MCxhWzEyXT0taCxhWzFdPTAsYVs1XT0yKmMsYVs5XT0wLGFbMTNdPS1mLGFbMl09MCxhWzZdPTAsYVsxMF09ZCxhWzE0XT0tcCxhWzNdPTAsYVs3XT0wLGFbMTFdPTAsYVsxNV09MSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgdD0wO3Q8MTY7dCsrKWlmKGVbdF0hPT1uW3RdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjwxNjtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdFtlKzldPW5bOV0sdFtlKzEwXT1uWzEwXSx0W2UrMTFdPW5bMTFdLHRbZSsxMl09blsxMl0sdFtlKzEzXT1uWzEzXSx0W2UrMTRdPW5bMTRdLHRbZSsxNV09blsxNV0sdH19Y29uc3QgS2g9bmV3IHhoLEpoPW5ldyBaaCxRaD1uZXcgeGgoMCwwLDApLCRoPW5ldyB4aCgxLDEsMSksdGY9bmV3IHhoLGVmPW5ldyB4aCxuZj1uZXcgeGgscmY9bmV3IFpoLG9mPW5ldyBfaDtjbGFzcyBzZntjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxyPXNmLkRFRkFVTFRfT1JERVIpe3RoaXMuaXNFdWxlcj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1yfWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCBvcmRlcigpe3JldHVybiB0aGlzLl9vcmRlcn1zZXQgb3JkZXIodCl7dGhpcy5fb3JkZXI9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxuLHI9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1yLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX29yZGVyKX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQuX3gsdGhpcy5feT10Ll95LHRoaXMuX3o9dC5feix0aGlzLl9vcmRlcj10Ll9vcmRlcix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCxlPXRoaXMuX29yZGVyLG49ITApe2NvbnN0IHI9dC5lbGVtZW50cyxpPXJbMF0sbz1yWzRdLHM9cls4XSxhPXJbMV0sdT1yWzVdLGM9cls5XSxsPXJbMl0saD1yWzZdLGY9clsxMF07c3dpdGNoKGUpe2Nhc2UiWFlaIjp0aGlzLl95PU1hdGguYXNpbihRbChzLC0xLDEpKSxNYXRoLmFicyhzKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1jLGYpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihoLHUpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9TWF0aC5hc2luKC1RbChjLC0xLDEpKSxNYXRoLmFicyhjKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKHMsZiksdGhpcy5fej1NYXRoLmF0YW4yKGEsdSkpOih0aGlzLl95PU1hdGguYXRhbjIoLWwsaSksdGhpcy5fej0wKTticmVhaztjYXNlIlpYWSI6dGhpcy5feD1NYXRoLmFzaW4oUWwoaCwtMSwxKSksTWF0aC5hYnMoaCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMigtbCxmKSx0aGlzLl96PU1hdGguYXRhbjIoLW8sdSkpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKGEsaSkpO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl95PU1hdGguYXNpbigtUWwobCwtMSwxKSksTWF0aC5hYnMobCk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihoLGYpLHRoaXMuX3o9TWF0aC5hdGFuMihhLGkpKToodGhpcy5feD0wLHRoaXMuX3o9TWF0aC5hdGFuMigtbyx1KSk7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3o9TWF0aC5hc2luKFFsKGEsLTEsMSkpLE1hdGguYWJzKGEpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWMsdSksdGhpcy5feT1NYXRoLmF0YW4yKC1sLGkpKToodGhpcy5feD0wLHRoaXMuX3k9TWF0aC5hdGFuMihzLGYpKTticmVhaztjYXNlIlhaWSI6dGhpcy5fej1NYXRoLmFzaW4oLVFsKG8sLTEsMSkpLE1hdGguYWJzKG8pPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoaCx1KSx0aGlzLl95PU1hdGguYXRhbjIocyxpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtYyxmKSx0aGlzLl95PTApfXJldHVybiB0aGlzLl9vcmRlcj1lLCEwPT09biYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVF1YXRlcm5pb24odCxlLG4pe3JldHVybiByZi5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeChyZixlLG4pfXNldEZyb21WZWN0b3IzKHQsZT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuc2V0KHQueCx0LnksdC56LGUpfXJlb3JkZXIodCl7cmV0dXJuIG9mLnNldEZyb21FdWxlcih0aGlzKSx0aGlzLnNldEZyb21RdWF0ZXJuaW9uKG9mLHQpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fb3JkZXI9PT10aGlzLl9vcmRlcn1mcm9tQXJyYXkodCl7cmV0dXJuIHRoaXMuX3g9dFswXSx0aGlzLl95PXRbMV0sdGhpcy5fej10WzJdLHZvaWQgMCE9PXRbM10mJih0aGlzLl9vcmRlcj10WzNdKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl9vcmRlcix0fV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fb3JkZXJ9fXNmLkRFRkFVTFRfT1JERVI9IlhZWiI7Y2xhc3MgYWZ7Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQodCl7dGhpcy5tYXNrPTE8PHQ+Pj4wfWVuYWJsZSh0KXt0aGlzLm1hc2t8PTE8PHR9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZSh0KXt0aGlzLm1hc2tePTE8PHR9ZGlzYWJsZSh0KXt0aGlzLm1hc2smPX4oMTw8dCl9ZGlzYWJsZUFsbCgpe3RoaXMubWFzaz0wfXRlc3QodCl7cmV0dXJuISEodGhpcy5tYXNrJnQubWFzayl9aXNFbmFibGVkKHQpe3JldHVybiEhKHRoaXMubWFzayYxPDx0KX19bGV0IHVmPTA7Y29uc3QgY2Y9bmV3IHhoLGxmPW5ldyBfaCxoZj1uZXcgWmgsZmY9bmV3IHhoLHBmPW5ldyB4aCxkZj1uZXcgeGgsZ2Y9bmV3IF9oLHlmPW5ldyB4aCgxLDAsMCksbWY9bmV3IHhoKDAsMSwwKSx2Zj1uZXcgeGgoMCwwLDEpLF9mPXt0eXBlOiJhZGRlZCJ9LHhmPXt0eXBlOiJyZW1vdmVkIn0sd2Y9e3R5cGU6ImNoaWxkYWRkZWQiLGNoaWxkOm51bGx9LGJmPXt0eXBlOiJjaGlsZHJlbW92ZWQiLGNoaWxkOm51bGx9O2NsYXNzIERmIGV4dGVuZHMgWmx7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNPYmplY3QzRD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTp1ZisrfSksdGhpcy51dWlkPUpsKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iT2JqZWN0M0QiLHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnVwPURmLkRFRkFVTFRfVVAuY2xvbmUoKTtjb25zdCB0PW5ldyB4aCxlPW5ldyBzZixuPW5ldyBfaCxyPW5ldyB4aCgxLDEsMSk7ZS5fb25DaGFuZ2UoKGZ1bmN0aW9uKCl7bi5zZXRGcm9tRXVsZXIoZSwhMSl9KSksbi5fb25DaGFuZ2UoKGZ1bmN0aW9uKCl7ZS5zZXRGcm9tUXVhdGVybmlvbihuLHZvaWQgMCwhMSl9KSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9zaXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnR9LHJvdGF0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplfSxxdWF0ZXJuaW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpufSxzY2FsZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6cn0sbW9kZWxWaWV3TWF0cml4Ont2YWx1ZTpuZXcgWmh9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3IGVofX0pLHRoaXMubWF0cml4PW5ldyBaaCx0aGlzLm1hdHJpeFdvcmxkPW5ldyBaaCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9RGYuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9RGYuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHRoaXMubGF5ZXJzPW5ldyBhZix0aGlzLnZpc2libGU9ITAsdGhpcy5jYXN0U2hhZG93PSExLHRoaXMucmVjZWl2ZVNoYWRvdz0hMSx0aGlzLmZydXN0dW1DdWxsZWQ9ITAsdGhpcy5yZW5kZXJPcmRlcj0wLHRoaXMuYW5pbWF0aW9ucz1bXSx0aGlzLnVzZXJEYXRhPXt9fW9uQmVmb3JlU2hhZG93KCl7fW9uQWZ0ZXJTaGFkb3coKXt9b25CZWZvcmVSZW5kZXIoKXt9b25BZnRlclJlbmRlcigpe31hcHBseU1hdHJpeDQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWF0cml4LnByZW11bHRpcGx5KHQpLHRoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX1hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSh0KSx0aGlzfXNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZSh0LGUpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSl9c2V0Um90YXRpb25Gcm9tRXVsZXIodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcih0LCEwKX1zZXRSb3RhdGlvbkZyb21NYXRyaXgodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KX1zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3RoaXMucXVhdGVybmlvbi5jb3B5KHQpfXJvdGF0ZU9uQXhpcyh0LGUpe3JldHVybiBsZi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KGxmKSx0aGlzfXJvdGF0ZU9uV29ybGRBeGlzKHQsZSl7cmV0dXJuIGxmLnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkobGYpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoeWYsdCl9cm90YXRlWSh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMobWYsdCl9cm90YXRlWih0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXModmYsdCl9dHJhbnNsYXRlT25BeGlzKHQsZSl7cmV0dXJuIGNmLmNvcHkodCkuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucXVhdGVybmlvbiksdGhpcy5wb3NpdGlvbi5hZGQoY2YubXVsdGlwbHlTY2FsYXIoZSkpLHRoaXN9dHJhbnNsYXRlWCh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoeWYsdCl9dHJhbnNsYXRlWSh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMobWYsdCl9dHJhbnNsYXRlWih0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXModmYsdCl9bG9jYWxUb1dvcmxkKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKX13b3JsZFRvTG9jYWwodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuYXBwbHlNYXRyaXg0KGhmLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkpfWxvb2tBdCh0LGUsbil7dC5pc1ZlY3RvcjM/ZmYuY29weSh0KTpmZi5zZXQodCxlLG4pO2NvbnN0IHI9dGhpcy5wYXJlbnQ7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSkscGYuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpLHRoaXMuaXNDYW1lcmF8fHRoaXMuaXNMaWdodD9oZi5sb29rQXQocGYsZmYsdGhpcy51cCk6aGYubG9va0F0KGZmLHBmLHRoaXMudXApLHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoaGYpLHImJihoZi5leHRyYWN0Um90YXRpb24oci5tYXRyaXhXb3JsZCksbGYuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGhmKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkobGYuaW52ZXJ0KCkpKX1hZGQodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXRoaXMuYWRkKGFyZ3VtZW50c1t0XSk7cmV0dXJuIHRoaXN9cmV0dXJuIHQ9PT10aGlzfHx0JiZ0LmlzT2JqZWN0M0QmJih0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LmRpc3BhdGNoRXZlbnQoX2YpLHdmLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KHdmKSx3Zi5jaGlsZD1udWxsKSx0aGlzfXJlbW92ZSh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW3RdKTtyZXR1cm4gdGhpc31jb25zdCBlPXRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KTtyZXR1cm4tMSE9PWUmJih0LnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGUsMSksdC5kaXNwYXRjaEV2ZW50KHhmKSxiZi5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudChiZiksYmYuY2hpbGQ9bnVsbCksdGhpc31yZW1vdmVGcm9tUGFyZW50KCl7Y29uc3QgdD10aGlzLnBhcmVudDtyZXR1cm4gbnVsbCE9PXQmJnQucmVtb3ZlKHRoaXMpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy5yZW1vdmUoLi4udGhpcy5jaGlsZHJlbil9YXR0YWNoKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxoZi5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpLG51bGwhPT10LnBhcmVudCYmKHQucGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxoZi5tdWx0aXBseSh0LnBhcmVudC5tYXRyaXhXb3JsZCkpLHQuYXBwbHlNYXRyaXg0KGhmKSx0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKSx0LmRpc3BhdGNoRXZlbnQoX2YpLHdmLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KHdmKSx3Zi5jaGlsZD1udWxsLHRoaXN9Z2V0T2JqZWN0QnlJZCh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsdCl9Z2V0T2JqZWN0QnlOYW1lKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoIm5hbWUiLHQpfWdldE9iamVjdEJ5UHJvcGVydHkodCxlKXtpZih0aGlzW3RdPT09ZSlyZXR1cm4gdGhpcztmb3IobGV0IG49MCxyPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO248cjtuKyspe2NvbnN0IHI9dGhpcy5jaGlsZHJlbltuXS5nZXRPYmplY3RCeVByb3BlcnR5KHQsZSk7aWYodm9pZCAwIT09cilyZXR1cm4gcn19Z2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLG49W10pe3RoaXNbdF09PT1lJiZuLnB1c2godGhpcyk7Y29uc3Qgcj10aGlzLmNoaWxkcmVuO2ZvcihsZXQgaT0wLG89ci5sZW5ndGg7aTxvO2krKylyW2ldLmdldE9iamVjdHNCeVByb3BlcnR5KHQsZSxuKTtyZXR1cm4gbn1nZXRXb3JsZFBvc2l0aW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKX1nZXRXb3JsZFF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKHBmLHQsZGYpLHR9Z2V0V29ybGRTY2FsZSh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UocGYsZ2YsdCksdH1nZXRXb3JsZERpcmVjdGlvbih0KXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtjb25zdCBlPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIHQuc2V0KGVbOF0sZVs5XSxlWzEwXSkubm9ybWFsaXplKCl9cmF5Y2FzdCgpe310cmF2ZXJzZSh0KXt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspZVtuXS50cmF2ZXJzZSh0KX10cmF2ZXJzZVZpc2libGUodCl7aWYoITE9PT10aGlzLnZpc2libGUpcmV0dXJuO3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyllW25dLnRyYXZlcnNlVmlzaWJsZSh0KX10cmF2ZXJzZUFuY2VzdG9ycyh0KXtjb25zdCBlPXRoaXMucGFyZW50O251bGwhPT1lJiYodChlKSxlLnRyYXZlcnNlQW5jZXN0b3JzKHQpKX11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH11cGRhdGVNYXRyaXhXb3JsZCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8dCkmJighMD09PXRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlJiYobnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHQ9ITApO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspZVtuXS51cGRhdGVNYXRyaXhXb3JsZCh0KX11cGRhdGVXb3JsZE1hdHJpeCh0LGUpe2NvbnN0IG49dGhpcy5wYXJlbnQ7aWYoITA9PT10JiZudWxsIT09biYmbi51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLCEwPT09dGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGUmJihudWxsPT09dGhpcy5wYXJlbnQ/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSwhMD09PWUpe2NvbnN0IHQ9dGhpcy5jaGlsZHJlbjtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdFtlXS51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCl9fXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdCxuPXt9O2UmJih0PXtnZW9tZXRyaWVzOnt9LG1hdGVyaWFsczp7fSx0ZXh0dXJlczp7fSxpbWFnZXM6e30sc2hhcGVzOnt9LHNrZWxldG9uczp7fSxhbmltYXRpb25zOnt9LG5vZGVzOnt9fSxuLm1ldGFkYXRhPXt2ZXJzaW9uOjQuNix0eXBlOiJPYmplY3QiLGdlbmVyYXRvcjoiT2JqZWN0M0QudG9KU09OIn0pO2NvbnN0IHI9e307ZnVuY3Rpb24gaShlLG4pe3JldHVybiB2b2lkIDA9PT1lW24udXVpZF0mJihlW24udXVpZF09bi50b0pTT04odCkpLG4udXVpZH1pZihyLnV1aWQ9dGhpcy51dWlkLHIudHlwZT10aGlzLnR5cGUsIiIhPT10aGlzLm5hbWUmJihyLm5hbWU9dGhpcy5uYW1lKSwhMD09PXRoaXMuY2FzdFNoYWRvdyYmKHIuY2FzdFNoYWRvdz0hMCksITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJihyLnJlY2VpdmVTaGFkb3c9ITApLCExPT09dGhpcy52aXNpYmxlJiYoci52aXNpYmxlPSExKSwhMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKHIuZnJ1c3R1bUN1bGxlZD0hMSksMCE9PXRoaXMucmVuZGVyT3JkZXImJihyLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYoci51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxyLmxheWVycz10aGlzLmxheWVycy5tYXNrLHIubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSxyLnVwPXRoaXMudXAudG9BcnJheSgpLCExPT09dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiYoci5tYXRyaXhBdXRvVXBkYXRlPSExKSx0aGlzLmlzSW5zdGFuY2VkTWVzaCYmKHIudHlwZT0iSW5zdGFuY2VkTWVzaCIsci5jb3VudD10aGlzLmNvdW50LHIuaW5zdGFuY2VNYXRyaXg9dGhpcy5pbnN0YW5jZU1hdHJpeC50b0pTT04oKSxudWxsIT09dGhpcy5pbnN0YW5jZUNvbG9yJiYoci5pbnN0YW5jZUNvbG9yPXRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKSkpLHRoaXMuaXNCYXRjaGVkTWVzaCYmKHIudHlwZT0iQmF0Y2hlZE1lc2giLHIucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQsci5zb3J0T2JqZWN0cz10aGlzLnNvcnRPYmplY3RzLHIuZHJhd1Jhbmdlcz10aGlzLl9kcmF3UmFuZ2VzLHIucmVzZXJ2ZWRSYW5nZXM9dGhpcy5fcmVzZXJ2ZWRSYW5nZXMsci52aXNpYmlsaXR5PXRoaXMuX3Zpc2liaWxpdHksci5hY3RpdmU9dGhpcy5fYWN0aXZlLHIuYm91bmRzPXRoaXMuX2JvdW5kcy5tYXAoKHQ9Pih7Ym94SW5pdGlhbGl6ZWQ6dC5ib3hJbml0aWFsaXplZCxib3hNaW46dC5ib3gubWluLnRvQXJyYXkoKSxib3hNYXg6dC5ib3gubWF4LnRvQXJyYXkoKSxzcGhlcmVJbml0aWFsaXplZDp0LnNwaGVyZUluaXRpYWxpemVkLHNwaGVyZVJhZGl1czp0LnNwaGVyZS5yYWRpdXMsc3BoZXJlQ2VudGVyOnQuc3BoZXJlLmNlbnRlci50b0FycmF5KCl9KSkpLHIubWF4SW5zdGFuY2VDb3VudD10aGlzLl9tYXhJbnN0YW5jZUNvdW50LHIubWF4VmVydGV4Q291bnQ9dGhpcy5fbWF4VmVydGV4Q291bnQsci5tYXhJbmRleENvdW50PXRoaXMuX21heEluZGV4Q291bnQsci5nZW9tZXRyeUluaXRpYWxpemVkPXRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQsci5nZW9tZXRyeUNvdW50PXRoaXMuX2dlb21ldHJ5Q291bnQsci5tYXRyaWNlc1RleHR1cmU9dGhpcy5fbWF0cmljZXNUZXh0dXJlLnRvSlNPTih0KSxudWxsIT09dGhpcy5fY29sb3JzVGV4dHVyZSYmKHIuY29sb3JzVGV4dHVyZT10aGlzLl9jb2xvcnNUZXh0dXJlLnRvSlNPTih0KSksbnVsbCE9PXRoaXMuYm91bmRpbmdTcGhlcmUmJihyLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6ci5ib3VuZGluZ1NwaGVyZS5jZW50ZXIudG9BcnJheSgpLHJhZGl1czpyLmJvdW5kaW5nU3BoZXJlLnJhZGl1c30pLG51bGwhPT10aGlzLmJvdW5kaW5nQm94JiYoci5ib3VuZGluZ0JveD17bWluOnIuYm91bmRpbmdCb3gubWluLnRvQXJyYXkoKSxtYXg6ci5ib3VuZGluZ0JveC5tYXgudG9BcnJheSgpfSkpLHRoaXMuaXNTY2VuZSl0aGlzLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQuaXNDb2xvcj9yLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTigpOnRoaXMuYmFja2dyb3VuZC5pc1RleHR1cmUmJihyLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTih0KS51dWlkKSksdGhpcy5lbnZpcm9ubWVudCYmdGhpcy5lbnZpcm9ubWVudC5pc1RleHR1cmUmJiEwIT09dGhpcy5lbnZpcm9ubWVudC5pc1JlbmRlclRhcmdldFRleHR1cmUmJihyLmVudmlyb25tZW50PXRoaXMuZW52aXJvbm1lbnQudG9KU09OKHQpLnV1aWQpO2Vsc2UgaWYodGhpcy5pc01lc2h8fHRoaXMuaXNMaW5lfHx0aGlzLmlzUG9pbnRzKXtyLmdlb21ldHJ5PWkodC5nZW9tZXRyaWVzLHRoaXMuZ2VvbWV0cnkpO2NvbnN0IGU9dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKHZvaWQgMCE9PWUmJnZvaWQgMCE9PWUuc2hhcGVzKXtjb25zdCBuPWUuc2hhcGVzO2lmKEFycmF5LmlzQXJyYXkobikpZm9yKGxldCBlPTAscj1uLmxlbmd0aDtlPHI7ZSsrKXtjb25zdCByPW5bZV07aSh0LnNoYXBlcyxyKX1lbHNlIGkodC5zaGFwZXMsbil9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKHIuYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxyLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx2b2lkIDAhPT10aGlzLnNrZWxldG9uJiYoaSh0LnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxyLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHZvaWQgMCE9PXRoaXMubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxyPXRoaXMubWF0ZXJpYWwubGVuZ3RoO248cjtuKyspZS5wdXNoKGkodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtuXSkpO3IubWF0ZXJpYWw9ZX1lbHNlIHIubWF0ZXJpYWw9aSh0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtyLmNoaWxkcmVuPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZSsrKXIuY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2VdLnRvSlNPTih0KS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7ci5hbmltYXRpb25zPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5hbmltYXRpb25zLmxlbmd0aDtlKyspe2NvbnN0IG49dGhpcy5hbmltYXRpb25zW2VdO3IuYW5pbWF0aW9ucy5wdXNoKGkodC5hbmltYXRpb25zLG4pKX19aWYoZSl7Y29uc3QgZT1vKHQuZ2VvbWV0cmllcykscj1vKHQubWF0ZXJpYWxzKSxpPW8odC50ZXh0dXJlcykscz1vKHQuaW1hZ2VzKSxhPW8odC5zaGFwZXMpLHU9byh0LnNrZWxldG9ucyksYz1vKHQuYW5pbWF0aW9ucyksbD1vKHQubm9kZXMpO2UubGVuZ3RoPjAmJihuLmdlb21ldHJpZXM9ZSksci5sZW5ndGg+MCYmKG4ubWF0ZXJpYWxzPXIpLGkubGVuZ3RoPjAmJihuLnRleHR1cmVzPWkpLHMubGVuZ3RoPjAmJihuLmltYWdlcz1zKSxhLmxlbmd0aD4wJiYobi5zaGFwZXM9YSksdS5sZW5ndGg+MCYmKG4uc2tlbGV0b25zPXUpLGMubGVuZ3RoPjAmJihuLmFuaW1hdGlvbnM9YyksbC5sZW5ndGg+MCYmKG4ubm9kZXM9bCl9cmV0dXJuIG4ub2JqZWN0PXIsbjtmdW5jdGlvbiBvKHQpe2NvbnN0IGU9W107Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3Qgcj10W25dO2RlbGV0ZSByLm1ldGFkYXRhLGUucHVzaChyKX1yZXR1cm4gZX19Y2xvbmUodCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMsdCl9Y29weSh0LGU9ITApe2lmKHRoaXMubmFtZT10Lm5hbWUsdGhpcy51cC5jb3B5KHQudXApLHRoaXMucG9zaXRpb24uY29weSh0LnBvc2l0aW9uKSx0aGlzLnJvdGF0aW9uLm9yZGVyPXQucm90YXRpb24ub3JkZXIsdGhpcy5xdWF0ZXJuaW9uLmNvcHkodC5xdWF0ZXJuaW9uKSx0aGlzLnNjYWxlLmNvcHkodC5zY2FsZSksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5tYXRyaXhXb3JsZC5jb3B5KHQubWF0cml4V29ybGQpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9dC5tYXRyaXhXb3JsZEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPXQubWF0cml4V29ybGROZWVkc1VwZGF0ZSx0aGlzLmxheWVycy5tYXNrPXQubGF5ZXJzLm1hc2ssdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLmNhc3RTaGFkb3c9dC5jYXN0U2hhZG93LHRoaXMucmVjZWl2ZVNoYWRvdz10LnJlY2VpdmVTaGFkb3csdGhpcy5mcnVzdHVtQ3VsbGVkPXQuZnJ1c3R1bUN1bGxlZCx0aGlzLnJlbmRlck9yZGVyPXQucmVuZGVyT3JkZXIsdGhpcy5hbmltYXRpb25zPXQuYW5pbWF0aW9ucy5zbGljZSgpLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksITA9PT1lKWZvcihsZXQgZT0wO2U8dC5jaGlsZHJlbi5sZW5ndGg7ZSsrKXtjb25zdCBuPXQuY2hpbGRyZW5bZV07dGhpcy5hZGQobi5jbG9uZSgpKX1yZXR1cm4gdGhpc319RGYuREVGQVVMVF9VUD1uZXcgeGgoMCwxLDApLERmLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFPSEwLERmLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFPSEwO2NvbnN0IEVmPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LENmPXtoOjAsczowLGw6MH0sU2Y9e2g6MCxzOjAsbDowfTtmdW5jdGlvbiBBZih0LGUsbil7cmV0dXJuIG48MCYmKG4rPTEpLG4+MSYmKG4tPTEpLG48MS82P3QrNiooZS10KSpuOm48LjU/ZTpuPDIvMz90KzYqKGUtdCkqKDIvMy1uKTp0fWNsYXNzIE5me2NvbnN0cnVjdG9yKHQsZSxuKXtyZXR1cm4gdGhpcy5pc0NvbG9yPSEwLHRoaXMucj0xLHRoaXMuZz0xLHRoaXMuYj0xLHRoaXMuc2V0KHQsZSxuKX1zZXQodCxlLG4pe2lmKHZvaWQgMD09PWUmJnZvaWQgMD09PW4pe2NvbnN0IGU9dDtlJiZlLmlzQ29sb3I/dGhpcy5jb3B5KGUpOiJudW1iZXIiPT10eXBlb2YgZT90aGlzLnNldEhleChlKToic3RyaW5nIj09dHlwZW9mIGUmJnRoaXMuc2V0U3R5bGUoZSl9ZWxzZSB0aGlzLnNldFJHQih0LGUsbik7cmV0dXJuIHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9dCx0aGlzLmI9dCx0aGlzfXNldEhleCh0LGU9VWwpe3JldHVybiB0PU1hdGguZmxvb3IodCksdGhpcy5yPSh0Pj4xNiYyNTUpLzI1NSx0aGlzLmc9KHQ+PjgmMjU1KS8yNTUsdGhpcy5iPSgyNTUmdCkvMjU1LHVoLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxlKSx0aGlzfXNldFJHQih0LGUsbixyPXVoLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPWUsdGhpcy5iPW4sdWgudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLHIpLHRoaXN9c2V0SFNMKHQsZSxuLHI9dWgud29ya2luZ0NvbG9yU3BhY2Upe2lmKHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4odCVlK2UpJWV9KHQsMSksZT1RbChlLDAsMSksbj1RbChuLDAsMSksMD09PWUpdGhpcy5yPXRoaXMuZz10aGlzLmI9bjtlbHNle2NvbnN0IHI9bjw9LjU/biooMStlKTpuK2UtbiplLGk9MipuLXI7dGhpcy5yPUFmKGkscix0KzEvMyksdGhpcy5nPUFmKGkscix0KSx0aGlzLmI9QWYoaSxyLHQtMS8zKX1yZXR1cm4gdWgudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLHIpLHRoaXN9c2V0U3R5bGUodCxlPVVsKXtmdW5jdGlvbiBuKHQpe3ZvaWQgMCE9PXQmJnBhcnNlRmxvYXQodCl9bGV0IHI7aWYocj0vXihcdyspXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgdDtjb25zdCBpPXJbMV0sbz1yWzJdO3N3aXRjaChpKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZih0PS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMobykpcmV0dXJuIG4odFs0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LHBhcnNlSW50KHRbMV0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHRbMl0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHRbM10sMTApKS8yNTUsZSk7aWYodD0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKG8pKXJldHVybiBuKHRbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDEwMCxwYXJzZUludCh0WzFdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludCh0WzJdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludCh0WzNdLDEwKSkvMTAwLGUpO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKHQ9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQqXC4/XGQrKVwlXHMqLFxzKihcZCpcLj9cZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMobykpcmV0dXJuIG4odFs0XSksdGhpcy5zZXRIU0wocGFyc2VGbG9hdCh0WzFdKS8zNjAscGFyc2VGbG9hdCh0WzJdKS8xMDAscGFyc2VGbG9hdCh0WzNdKS8xMDAsZSl9fWVsc2UgaWYocj0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IHQ9clsxXSxuPXQubGVuZ3RoO2lmKDM9PT1uKXJldHVybiB0aGlzLnNldFJHQihwYXJzZUludCh0LmNoYXJBdCgwKSwxNikvMTUscGFyc2VJbnQodC5jaGFyQXQoMSksMTYpLzE1LHBhcnNlSW50KHQuY2hhckF0KDIpLDE2KS8xNSxlKTtpZig2PT09bilyZXR1cm4gdGhpcy5zZXRIZXgocGFyc2VJbnQodCwxNiksZSl9ZWxzZSBpZih0JiZ0Lmxlbmd0aD4wKXJldHVybiB0aGlzLnNldENvbG9yTmFtZSh0LGUpO3JldHVybiB0aGlzfXNldENvbG9yTmFtZSh0LGU9VWwpe2NvbnN0IG49RWZbdC50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gdm9pZCAwIT09biYmdGhpcy5zZXRIZXgobixlKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMucix0aGlzLmcsdGhpcy5iKX1jb3B5KHQpe3JldHVybiB0aGlzLnI9dC5yLHRoaXMuZz10LmcsdGhpcy5iPXQuYix0aGlzfWNvcHlTUkdCVG9MaW5lYXIodCl7cmV0dXJuIHRoaXMucj1jaCh0LnIpLHRoaXMuZz1jaCh0LmcpLHRoaXMuYj1jaCh0LmIpLHRoaXN9Y29weUxpbmVhclRvU1JHQih0KXtyZXR1cm4gdGhpcy5yPWxoKHQuciksdGhpcy5nPWxoKHQuZyksdGhpcy5iPWxoKHQuYiksdGhpc31jb252ZXJ0U1JHQlRvTGluZWFyKCl7cmV0dXJuIHRoaXMuY29weVNSR0JUb0xpbmVhcih0aGlzKSx0aGlzfWNvbnZlcnRMaW5lYXJUb1NSR0IoKXtyZXR1cm4gdGhpcy5jb3B5TGluZWFyVG9TUkdCKHRoaXMpLHRoaXN9Z2V0SGV4KHQ9VWwpe3JldHVybiB1aC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoTWYuY29weSh0aGlzKSx0KSw2NTUzNipNYXRoLnJvdW5kKFFsKDI1NSpNZi5yLDAsMjU1KSkrMjU2Kk1hdGgucm91bmQoUWwoMjU1Kk1mLmcsMCwyNTUpKStNYXRoLnJvdW5kKFFsKDI1NSpNZi5iLDAsMjU1KSl9Z2V0SGV4U3RyaW5nKHQ9VWwpe3JldHVybigiMDAwMDAwIit0aGlzLmdldEhleCh0KS50b1N0cmluZygxNikpLnNsaWNlKC02KX1nZXRIU0wodCxlPXVoLndvcmtpbmdDb2xvclNwYWNlKXt1aC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoTWYuY29weSh0aGlzKSxlKTtjb25zdCBuPU1mLnIscj1NZi5nLGk9TWYuYixvPU1hdGgubWF4KG4scixpKSxzPU1hdGgubWluKG4scixpKTtsZXQgYSx1O2NvbnN0IGM9KHMrbykvMjtpZihzPT09bylhPTAsdT0wO2Vsc2V7Y29uc3QgdD1vLXM7c3dpdGNoKHU9Yzw9LjU/dC8obytzKTp0LygyLW8tcyksbyl7Y2FzZSBuOmE9KHItaSkvdCsocjxpPzY6MCk7YnJlYWs7Y2FzZSByOmE9KGktbikvdCsyO2JyZWFrO2Nhc2UgaTphPShuLXIpL3QrNH1hLz02fXJldHVybiB0Lmg9YSx0LnM9dSx0Lmw9Yyx0fWdldFJHQih0LGU9dWgud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB1aC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoTWYuY29weSh0aGlzKSxlKSx0LnI9TWYucix0Lmc9TWYuZyx0LmI9TWYuYix0fWdldFN0eWxlKHQ9VWwpe3VoLmZyb21Xb3JraW5nQ29sb3JTcGFjZShNZi5jb3B5KHRoaXMpLHQpO2NvbnN0IGU9TWYucixuPU1mLmcscj1NZi5iO3JldHVybiB0IT09VWw/YGNvbG9yKCR7dH0gJHtlLnRvRml4ZWQoMyl9ICR7bi50b0ZpeGVkKDMpfSAke3IudG9GaXhlZCgzKX0pYDpgcmdiKCR7TWF0aC5yb3VuZCgyNTUqZSl9LCR7TWF0aC5yb3VuZCgyNTUqbil9LCR7TWF0aC5yb3VuZCgyNTUqcil9KWB9b2Zmc2V0SFNMKHQsZSxuKXtyZXR1cm4gdGhpcy5nZXRIU0woQ2YpLHRoaXMuc2V0SFNMKENmLmgrdCxDZi5zK2UsQ2YubCtuKX1hZGQodCl7cmV0dXJuIHRoaXMucis9dC5yLHRoaXMuZys9dC5nLHRoaXMuYis9dC5iLHRoaXN9YWRkQ29sb3JzKHQsZSl7cmV0dXJuIHRoaXMucj10LnIrZS5yLHRoaXMuZz10LmcrZS5nLHRoaXMuYj10LmIrZS5iLHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLnIrPXQsdGhpcy5nKz10LHRoaXMuYis9dCx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy5yPU1hdGgubWF4KDAsdGhpcy5yLXQuciksdGhpcy5nPU1hdGgubWF4KDAsdGhpcy5nLXQuZyksdGhpcy5iPU1hdGgubWF4KDAsdGhpcy5iLXQuYiksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5yKj10LnIsdGhpcy5nKj10LmcsdGhpcy5iKj10LmIsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKj10LHRoaXMuZyo9dCx0aGlzLmIqPXQsdGhpc31sZXJwKHQsZSl7cmV0dXJuIHRoaXMucis9KHQuci10aGlzLnIpKmUsdGhpcy5nKz0odC5nLXRoaXMuZykqZSx0aGlzLmIrPSh0LmItdGhpcy5iKSplLHRoaXN9bGVycENvbG9ycyh0LGUsbil7cmV0dXJuIHRoaXMucj10LnIrKGUuci10LnIpKm4sdGhpcy5nPXQuZysoZS5nLXQuZykqbix0aGlzLmI9dC5iKyhlLmItdC5iKSpuLHRoaXN9bGVycEhTTCh0LGUpe3RoaXMuZ2V0SFNMKENmKSx0LmdldEhTTChTZik7Y29uc3Qgbj0kbChDZi5oLFNmLmgsZSkscj0kbChDZi5zLFNmLnMsZSksaT0kbChDZi5sLFNmLmwsZSk7cmV0dXJuIHRoaXMuc2V0SFNMKG4scixpKSx0aGlzfXNldEZyb21WZWN0b3IzKHQpe3JldHVybiB0aGlzLnI9dC54LHRoaXMuZz10LnksdGhpcy5iPXQueix0aGlzfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMucixuPXRoaXMuZyxyPXRoaXMuYixpPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMucj1pWzBdKmUraVszXSpuK2lbNl0qcix0aGlzLmc9aVsxXSplK2lbNF0qbitpWzddKnIsdGhpcy5iPWlbMl0qZStpWzVdKm4raVs4XSpyLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnI9PT10aGlzLnImJnQuZz09PXRoaXMuZyYmdC5iPT09dGhpcy5ifWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMucj10W2VdLHRoaXMuZz10W2UrMV0sdGhpcy5iPXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMucix0W2UrMV09dGhpcy5nLHRbZSsyXT10aGlzLmIsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMucj10LmdldFgoZSksdGhpcy5nPXQuZ2V0WShlKSx0aGlzLmI9dC5nZXRaKGUpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMuZ2V0SGV4KCl9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5yLHlpZWxkIHRoaXMuZyx5aWVsZCB0aGlzLmJ9fWNvbnN0IE1mPW5ldyBOZjtOZi5OQU1FUz1FZjtuZXcgeGgsbmV3IHRoO25ldyBaaCxuZXcgRGYsbmV3IHhoLG5ldyBEaCxuZXcgRGgsbmV3IHhoO25ldyBaaCxuZXcgY2xhc3N7Y29uc3RydWN0b3IodD1uZXcgeGgsZT1uZXcgeGgoMCwwLC0xKSl7dGhpcy5vcmlnaW49dCx0aGlzLmRpcmVjdGlvbj1lfXNldCh0LGUpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLHRoaXMuZGlyZWN0aW9uLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQub3JpZ2luKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSx0aGlzfWF0KHQsZSl7cmV0dXJuIGUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLHQpfWxvb2tBdCh0KXtyZXR1cm4gdGhpcy5kaXJlY3Rpb24uY29weSh0KS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpLHRoaXN9cmVjYXN0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHRoaXMuYXQodCxxaCkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sbil9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSl9ZGlzdGFuY2VTcVRvUG9pbnQodCl7Y29uc3QgZT1xaC5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIGU8MD90aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCh0KToocWguY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGUpLHFoLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVNxVG9TZWdtZW50KHQsZSxuLHIpe1ZoLmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSxHaC5jb3B5KGUpLnN1Yih0KS5ub3JtYWxpemUoKSxZaC5jb3B5KHRoaXMub3JpZ2luKS5zdWIoVmgpO2NvbnN0IGk9LjUqdC5kaXN0YW5jZVRvKGUpLG89LXRoaXMuZGlyZWN0aW9uLmRvdChHaCkscz1ZaC5kb3QodGhpcy5kaXJlY3Rpb24pLGE9LVloLmRvdChHaCksdT1ZaC5sZW5ndGhTcSgpLGM9TWF0aC5hYnMoMS1vKm8pO2xldCBsLGgsZixwO2lmKGM+MClpZihsPW8qYS1zLGg9bypzLWEscD1pKmMsbD49MClpZihoPj0tcClpZihoPD1wKXtjb25zdCB0PTEvYztsKj10LGgqPXQsZj1sKihsK28qaCsyKnMpK2gqKG8qbCtoKzIqYSkrdX1lbHNlIGg9aSxsPU1hdGgubWF4KDAsLShvKmgrcykpLGY9LWwqbCtoKihoKzIqYSkrdTtlbHNlIGg9LWksbD1NYXRoLm1heCgwLC0obypoK3MpKSxmPS1sKmwraCooaCsyKmEpK3U7ZWxzZSBoPD0tcD8obD1NYXRoLm1heCgwLC0oLW8qaStzKSksaD1sPjA/LWk6TWF0aC5taW4oTWF0aC5tYXgoLWksLWEpLGkpLGY9LWwqbCtoKihoKzIqYSkrdSk6aDw9cD8obD0wLGg9TWF0aC5taW4oTWF0aC5tYXgoLWksLWEpLGkpLGY9aCooaCsyKmEpK3UpOihsPU1hdGgubWF4KDAsLShvKmkrcykpLGg9bD4wP2k6TWF0aC5taW4oTWF0aC5tYXgoLWksLWEpLGkpLGY9LWwqbCtoKihoKzIqYSkrdSk7ZWxzZSBoPW8+MD8taTppLGw9TWF0aC5tYXgoMCwtKG8qaCtzKSksZj0tbCpsK2gqKGgrMiphKSt1O3JldHVybiBuJiZuLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixsKSxyJiZyLmNvcHkoVmgpLmFkZFNjYWxlZFZlY3RvcihHaCxoKSxmfWludGVyc2VjdFNwaGVyZSh0LGUpe3FoLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5vcmlnaW4pO2NvbnN0IG49cWguZG90KHRoaXMuZGlyZWN0aW9uKSxyPXFoLmRvdChxaCktbipuLGk9dC5yYWRpdXMqdC5yYWRpdXM7aWYocj5pKXJldHVybiBudWxsO2NvbnN0IG89TWF0aC5zcXJ0KGktcikscz1uLW8sYT1uK287cmV0dXJuIGE8MD9udWxsOnM8MD90aGlzLmF0KGEsZSk6dGhpcy5hdChzLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31kaXN0YW5jZVRvUGxhbmUodCl7Y29uc3QgZT10Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1lKXJldHVybiAwPT09dC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDtjb25zdCBuPS0odGhpcy5vcmlnaW4uZG90KHQubm9ybWFsKSt0LmNvbnN0YW50KS9lO3JldHVybiBuPj0wP246bnVsbH1pbnRlcnNlY3RQbGFuZSh0LGUpe2NvbnN0IG49dGhpcy5kaXN0YW5jZVRvUGxhbmUodCk7cmV0dXJuIG51bGw9PT1uP251bGw6dGhpcy5hdChuLGUpfWludGVyc2VjdHNQbGFuZSh0KXtjb25zdCBlPXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTtyZXR1cm4gMD09PWV8fHQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZTwwfWludGVyc2VjdEJveCh0LGUpe2xldCBuLHIsaSxvLHMsYTtjb25zdCB1PTEvdGhpcy5kaXJlY3Rpb24ueCxjPTEvdGhpcy5kaXJlY3Rpb24ueSxsPTEvdGhpcy5kaXJlY3Rpb24ueixoPXRoaXMub3JpZ2luO3JldHVybiB1Pj0wPyhuPSh0Lm1pbi54LWgueCkqdSxyPSh0Lm1heC54LWgueCkqdSk6KG49KHQubWF4LngtaC54KSp1LHI9KHQubWluLngtaC54KSp1KSxjPj0wPyhpPSh0Lm1pbi55LWgueSkqYyxvPSh0Lm1heC55LWgueSkqYyk6KGk9KHQubWF4LnktaC55KSpjLG89KHQubWluLnktaC55KSpjKSxuPm98fGk+cnx8KChpPm58fGlzTmFOKG4pKSYmKG49aSksKG88cnx8aXNOYU4ocikpJiYocj1vKSxsPj0wPyhzPSh0Lm1pbi56LWgueikqbCxhPSh0Lm1heC56LWgueikqbCk6KHM9KHQubWF4LnotaC56KSpsLGE9KHQubWluLnotaC56KSpsKSxuPmF8fHM+cil8fCgocz5ufHxuIT1uKSYmKG49cyksKGE8cnx8ciE9cikmJihyPWEpLHI8MCk/bnVsbDp0aGlzLmF0KG4+PTA/bjpyLGUpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveCh0LHFoKX1pbnRlcnNlY3RUcmlhbmdsZSh0LGUsbixyLGkpe1hoLnN1YlZlY3RvcnMoZSx0KSxXaC5zdWJWZWN0b3JzKG4sdCksSGguY3Jvc3NWZWN0b3JzKFhoLFdoKTtsZXQgbyxzPXRoaXMuZGlyZWN0aW9uLmRvdChIaCk7aWYocz4wKXtpZihyKXJldHVybiBudWxsO289MX1lbHNle2lmKCEoczwwKSlyZXR1cm4gbnVsbDtvPS0xLHM9LXN9WWguc3ViVmVjdG9ycyh0aGlzLm9yaWdpbix0KTtjb25zdCBhPW8qdGhpcy5kaXJlY3Rpb24uZG90KFdoLmNyb3NzVmVjdG9ycyhZaCxXaCkpO2lmKGE8MClyZXR1cm4gbnVsbDtjb25zdCB1PW8qdGhpcy5kaXJlY3Rpb24uZG90KFhoLmNyb3NzKFloKSk7aWYodTwwfHxhK3U+cylyZXR1cm4gbnVsbDtjb25zdCBjPS1vKlloLmRvdChIaCk7cmV0dXJuIGM8MD9udWxsOnRoaXMuYXQoYy9zLGkpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KHQpLHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmdC5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19LG5ldyBVaCxuZXcgeGg7Y29uc3QgRmY9bmV3IGNsYXNze2NvbnN0cnVjdG9yKHQsZSxuKXtjb25zdCByPXRoaXM7bGV0IGksbz0hMSxzPTAsYT0wO2NvbnN0IHU9W107dGhpcy5vblN0YXJ0PXZvaWQgMCx0aGlzLm9uTG9hZD10LHRoaXMub25Qcm9ncmVzcz1lLHRoaXMub25FcnJvcj1uLHRoaXMuaXRlbVN0YXJ0PWZ1bmN0aW9uKHQpe2ErKywhMT09PW8mJnZvaWQgMCE9PXIub25TdGFydCYmci5vblN0YXJ0KHQscyxhKSxvPSEwfSx0aGlzLml0ZW1FbmQ9ZnVuY3Rpb24odCl7cysrLHZvaWQgMCE9PXIub25Qcm9ncmVzcyYmci5vblByb2dyZXNzKHQscyxhKSxzPT09YSYmKG89ITEsdm9pZCAwIT09ci5vbkxvYWQmJnIub25Mb2FkKCkpfSx0aGlzLml0ZW1FcnJvcj1mdW5jdGlvbih0KXt2b2lkIDAhPT1yLm9uRXJyb3ImJnIub25FcnJvcih0KX0sdGhpcy5yZXNvbHZlVVJMPWZ1bmN0aW9uKHQpe3JldHVybiBpP2kodCk6dH0sdGhpcy5zZXRVUkxNb2RpZmllcj1mdW5jdGlvbih0KXtyZXR1cm4gaT10LHRoaXN9LHRoaXMuYWRkSGFuZGxlcj1mdW5jdGlvbih0LGUpe3JldHVybiB1LnB1c2godCxlKSx0aGlzfSx0aGlzLnJlbW92ZUhhbmRsZXI9ZnVuY3Rpb24odCl7Y29uc3QgZT11LmluZGV4T2YodCk7cmV0dXJuLTEhPT1lJiZ1LnNwbGljZShlLDIpLHRoaXN9LHRoaXMuZ2V0SGFuZGxlcj1mdW5jdGlvbih0KXtmb3IobGV0IGU9MCxuPXUubGVuZ3RoO2U8bjtlKz0yKXtjb25zdCBuPXVbZV0scj11W2UrMV07aWYobi5nbG9iYWwmJihuLmxhc3RJbmRleD0wKSxuLnRlc3QodCkpcmV0dXJuIHJ9cmV0dXJuIG51bGx9fX07Y2xhc3MgVGZ7Y29uc3RydWN0b3IodCl7dGhpcy5tYW5hZ2VyPXZvaWQgMCE9PXQ/dDpGZix0aGlzLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLHRoaXMud2l0aENyZWRlbnRpYWxzPSExLHRoaXMucGF0aD0iIix0aGlzLnJlc291cmNlUGF0aD0iIix0aGlzLnJlcXVlc3RIZWFkZXI9e319bG9hZCgpe31sb2FkQXN5bmModCxlKXtjb25zdCBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLGkpe24ubG9hZCh0LHIsZSxpKX0pKX1wYXJzZSgpe31zZXRDcm9zc09yaWdpbih0KXtyZXR1cm4gdGhpcy5jcm9zc09yaWdpbj10LHRoaXN9c2V0V2l0aENyZWRlbnRpYWxzKHQpe3JldHVybiB0aGlzLndpdGhDcmVkZW50aWFscz10LHRoaXN9c2V0UGF0aCh0KXtyZXR1cm4gdGhpcy5wYXRoPXQsdGhpc31zZXRSZXNvdXJjZVBhdGgodCl7cmV0dXJuIHRoaXMucmVzb3VyY2VQYXRoPXQsdGhpc31zZXRSZXF1ZXN0SGVhZGVyKHQpe3JldHVybiB0aGlzLnJlcXVlc3RIZWFkZXI9dCx0aGlzfX1UZi5ERUZBVUxUX01BVEVSSUFMX05BTUU9Il9fREVGQVVMVCI7RXJyb3I7ZnVuY3Rpb24gT2YoKXtyZXR1cm4gT2Y9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciByIGluIG4pKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJih0W3JdPW5bcl0pfXJldHVybiB0fSxPZi5hcHBseShudWxsLGFyZ3VtZW50cyl9InVuZGVmaW5lZCIhPXR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18mJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicmVnaXN0ZXIiLHtkZXRhaWw6e3JldmlzaW9uOiIxNjgifX0pKSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5fX1RIUkVFX198fCh3aW5kb3cuX19USFJFRV9fPSIxNjgiKSk7dmFyIExmPXtlcHNpbG9uOjFlLTEyLG1hdHJpeDoiTWF0cml4IixudW1iZXI6Im51bWJlciIscHJlY2lzaW9uOjY0LHByZWRpY3RhYmxlOiExLHJhbmRvbVNlZWQ6bnVsbH07ZnVuY3Rpb24gUGYodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fWZ1bmN0aW9uIFJmKHQpe3JldHVybiEoIXR8fCJvYmplY3QiIT10eXBlb2YgdHx8ImZ1bmN0aW9uIiE9dHlwZW9mIHQuY29uc3RydWN0b3IpJiYoITA9PT10LmlzQmlnTnVtYmVyJiYib2JqZWN0Ij09dHlwZW9mIHQuY29uc3RydWN0b3IucHJvdG90eXBlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzQmlnTnVtYmVyfHwiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3Rvci5pc0RlY2ltYWwmJiEwPT09dC5jb25zdHJ1Y3Rvci5pc0RlY2ltYWwodCkpfWZ1bmN0aW9uIEJmKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJiEwPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpLmlzQ29tcGxleHx8ITF9ZnVuY3Rpb24ga2YodCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdCYmITA9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCkuaXNGcmFjdGlvbnx8ITF9ZnVuY3Rpb24gemYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNVbml0fHwhMX1mdW5jdGlvbiBqZih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9dmFyIFVmPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gcWYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNNYXRyaXh8fCExfWZ1bmN0aW9uIFZmKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpfHxxZih0KX1mdW5jdGlvbiBHZih0KXtyZXR1cm4gdCYmdC5pc0RlbnNlTWF0cml4JiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTWF0cml4fHwhMX1mdW5jdGlvbiBZZih0KXtyZXR1cm4gdCYmdC5pc1NwYXJzZU1hdHJpeCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc01hdHJpeHx8ITF9ZnVuY3Rpb24gWGYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNSYW5nZXx8ITF9ZnVuY3Rpb24gV2YodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNJbmRleHx8ITF9ZnVuY3Rpb24gSGYodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH1mdW5jdGlvbiBaZih0KXtyZXR1cm4gdCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc1Jlc3VsdFNldHx8ITF9ZnVuY3Rpb24gS2YodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNIZWxwfHwhMX1mdW5jdGlvbiBKZih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBRZih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGV9ZnVuY3Rpb24gJGYodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBSZWdFeHB9ZnVuY3Rpb24gdHAodCl7cmV0dXJuISghdHx8Im9iamVjdCIhPXR5cGVvZiB0fHx0LmNvbnN0cnVjdG9yIT09T2JqZWN0fHxCZih0KXx8a2YodCkpfWZ1bmN0aW9uIGVwKHQpe3JldHVybiBudWxsPT09dH1mdW5jdGlvbiBucCh0KXtyZXR1cm4gdm9pZCAwPT09dH1mdW5jdGlvbiBycCh0KXtyZXR1cm4gdCYmITA9PT10LmlzQWNjZXNzb3JOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gaXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0FycmF5Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIG9wKHQpe3JldHVybiB0JiYhMD09PXQuaXNBc3NpZ25tZW50Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIHNwKHQpe3JldHVybiB0JiYhMD09PXQuaXNCbG9ja05vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBhcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzQ29uZGl0aW9uYWxOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gdXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0NvbnN0YW50Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGNwKHQpe3JldHVybiB0JiYhMD09PXQuaXNGdW5jdGlvbkFzc2lnbm1lbnROb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gbHAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0Z1bmN0aW9uTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGhwKHQpe3JldHVybiB0JiYhMD09PXQuaXNJbmRleE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBmcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIHBwKHQpe3JldHVybiB0JiYhMD09PXQuaXNPYmplY3ROb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gZHAodCl7cmV0dXJuIHQmJiEwPT09dC5pc09wZXJhdG9yTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGdwKHQpe3JldHVybiB0JiYhMD09PXQuaXNQYXJlbnRoZXNpc05vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiB5cCh0KXtyZXR1cm4gdCYmITA9PT10LmlzUmFuZ2VOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gbXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc1JlbGF0aW9uYWxOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gdnAodCl7cmV0dXJuIHQmJiEwPT09dC5pc1N5bWJvbE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBfcCh0KXtyZXR1cm4gdCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc0NoYWlufHwhMX1mdW5jdGlvbiB4cCh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ib2JqZWN0Ij09PWU/bnVsbD09PXQ/Im51bGwiOlJmKHQpPyJCaWdOdW1iZXIiOnQuY29uc3RydWN0b3ImJnQuY29uc3RydWN0b3IubmFtZT90LmNvbnN0cnVjdG9yLm5hbWU6Ik9iamVjdCI6ZX1mdW5jdGlvbiB3cCh0KXt2YXIgZT10eXBlb2YgdDtpZigibnVtYmVyIj09PWV8fCJzdHJpbmciPT09ZXx8ImJvb2xlYW4iPT09ZXx8bnVsbD09dClyZXR1cm4gdDtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5jbG9uZSlyZXR1cm4gdC5jbG9uZSgpO2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gd3AodCl9KSk7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIG5ldyBEYXRlKHQudmFsdWVPZigpKTtpZihSZih0KSlyZXR1cm4gdDtpZih0IGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjbG9uZSAiK3QpO3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiB0KURwKHQscikmJihuW3JdPWUodFtyXSkpO3JldHVybiBufSh0LHdwKX1mdW5jdGlvbiBicCh0LGUpe3ZhciBuLHIsaTtpZihBcnJheS5pc0FycmF5KHQpKXtpZighQXJyYXkuaXNBcnJheShlKXx8dC5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm4hMTtmb3Iocj0wLGk9dC5sZW5ndGg7cjxpO3IrKylpZighYnAodFtyXSxlW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1pZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gdD09PWU7aWYodCBpbnN0YW5jZW9mIE9iamVjdCl7aWYoQXJyYXkuaXNBcnJheShlKXx8IShlIGluc3RhbmNlb2YgT2JqZWN0KSlyZXR1cm4hMTtmb3IobiBpbiB0KWlmKCEobiBpbiBlKXx8IWJwKHRbbl0sZVtuXSkpcmV0dXJuITE7Zm9yKG4gaW4gZSlpZighKG4gaW4gdCkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHQ9PT1lfWZ1bmN0aW9uIERwKHQsZSl7cmV0dXJuIHQmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9dmFyIEVwPWZ1bmN0aW9uKHQpe2lmKHQpdGhyb3cgbmV3IEVycm9yKCJUaGUgZ2xvYmFsIGNvbmZpZyBpcyByZWFkb25seS4gXG5QbGVhc2UgY3JlYXRlIGEgbWF0aGpzIGluc3RhbmNlIGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLiBcbkV4YW1wbGU6XG5cbiAgaW1wb3J0IHsgY3JlYXRlLCBhbGwgfSBmcm9tICdtYXRoanMnO1xuICBjb25zdCBtYXRoanMgPSBjcmVhdGUoYWxsKTtcbiAgbWF0aGpzLmNvbmZpZyh7IG51bWJlcjogJ0JpZ051bWJlcicgfSk7XG4iKTtyZXR1cm4gT2JqZWN0LmZyZWV6ZShMZil9O2Z1bmN0aW9uIENwKCl7cmV0dXJuITB9ZnVuY3Rpb24gU3AoKXtyZXR1cm4hMX1mdW5jdGlvbiBBcCgpe31PZihFcCxMZix7TUFUUklYX09QVElPTlM6WyJNYXRyaXgiLCJBcnJheSJdLE5VTUJFUl9PUFRJT05TOlsibnVtYmVyIiwiQmlnTnVtYmVyIiwiRnJhY3Rpb24iXX0pO2NvbnN0IE5wPSJBcmd1bWVudCBpcyBub3QgYSB0eXBlZC1mdW5jdGlvbi4iO3ZhciBJcD1mdW5jdGlvbiB0KCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10JiZ0LmNvbnN0cnVjdG9yPT09T2JqZWN0fWNvbnN0IG49W3tuYW1lOiJudW1iZXIiLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fX0se25hbWU6InN0cmluZyIsdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9fSx7bmFtZToiYm9vbGVhbiIsdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0fX0se25hbWU6IkZ1bmN0aW9uIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fX0se25hbWU6IkFycmF5Iix0ZXN0OkFycmF5LmlzQXJyYXl9LHtuYW1lOiJEYXRlIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZX19LHtuYW1lOiJSZWdFeHAiLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBSZWdFeHB9fSx7bmFtZToiT2JqZWN0Iix0ZXN0OmV9LHtuYW1lOiJudWxsIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dH19LHtuYW1lOiJ1bmRlZmluZWQiLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR9fV0scj17bmFtZToiYW55Iix0ZXN0OkNwLGlzQW55OiEwfTtsZXQgaSxvLHM9MCxhPXtjcmVhdGVDb3VudDowfTtmdW5jdGlvbiB1KHQpe2NvbnN0IGU9aS5nZXQodCk7aWYoZSlyZXR1cm4gZTtsZXQgbj0nVW5rbm93biB0eXBlICInK3QrJyInO2NvbnN0IHI9dC50b0xvd2VyQ2FzZSgpO2xldCBzO2ZvcihzIG9mIG8paWYocy50b0xvd2VyQ2FzZSgpPT09cil7bis9Jy4gRGlkIHlvdSBtZWFuICInK3MrJyIgPyc7YnJlYWt9dGhyb3cgbmV3IFR5cGVFcnJvcihuKX1mdW5jdGlvbiBjKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToiYW55Ijtjb25zdCBuPWU/dShlKS5pbmRleDpvLmxlbmd0aCxyPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXtpZighdFtlXXx8InN0cmluZyIhPXR5cGVvZiB0W2VdLm5hbWV8fCJmdW5jdGlvbiIhPXR5cGVvZiB0W2VdLnRlc3QpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IHdpdGggcHJvcGVydGllcyB7bmFtZTogc3RyaW5nLCB0ZXN0OiBmdW5jdGlvbn0gZXhwZWN0ZWQiKTtjb25zdCBvPXRbZV0ubmFtZTtpZihpLmhhcyhvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdEdXBsaWNhdGUgdHlwZSBuYW1lICInK28rJyInKTtyLnB1c2gobyksaS5zZXQobyx7bmFtZTpvLHRlc3Q6dFtlXS50ZXN0LGlzQW55OnRbZV0uaXNBbnksaW5kZXg6bitlLGNvbnZlcnNpb25zVG86W119KX1jb25zdCBzPW8uc2xpY2Uobik7bz1vLnNsaWNlKDAsbikuY29uY2F0KHIpLmNvbmNhdChzKTtmb3IobGV0IHQ9bityLmxlbmd0aDt0PG8ubGVuZ3RoOysrdClpLmdldChvW3RdKS5pbmRleD10fWZ1bmN0aW9uIGwoKXtpPW5ldyBNYXAsbz1bXSxzPTAsYyhbcl0sITEpfWZ1bmN0aW9uIGgodCl7Y29uc3QgZT1vLmZpbHRlcigoZT0+e2NvbnN0IG49aS5nZXQoZSk7cmV0dXJuIW4uaXNBbnkmJm4udGVzdCh0KX0pKTtyZXR1cm4gZS5sZW5ndGg/ZTpbImFueSJdfWZ1bmN0aW9uIGYodCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYiX3R5cGVkRnVuY3Rpb25EYXRhImluIHR9ZnVuY3Rpb24gcCh0LGUsbil7aWYoIWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcihOcCk7Y29uc3Qgcj1uJiZuLmV4YWN0LGk9dihBcnJheS5pc0FycmF5KGUpP2Uuam9pbigiLCIpOmUpLG89ZChpKTtpZighcnx8byBpbiB0LnNpZ25hdHVyZXMpe2NvbnN0IGU9dC5fdHlwZWRGdW5jdGlvbkRhdGEuc2lnbmF0dXJlTWFwLmdldChvKTtpZihlKXJldHVybiBlfWNvbnN0IHM9aS5sZW5ndGg7bGV0IGEsdTtpZihyKXtsZXQgZTtmb3IoZSBpbiBhPVtdLHQuc2lnbmF0dXJlcylhLnB1c2godC5fdHlwZWRGdW5jdGlvbkRhdGEuc2lnbmF0dXJlTWFwLmdldChlKSl9ZWxzZSBhPXQuX3R5cGVkRnVuY3Rpb25EYXRhLnNpZ25hdHVyZXM7Zm9yKGxldCB0PTA7dDxzOysrdCl7Y29uc3QgZT1pW3RdLG49W107bGV0IHI7Zm9yKHIgb2YgYSl7Y29uc3QgaT1iKHIucGFyYW1zLHQpO2lmKGkmJighZS5yZXN0UGFyYW18fGkucmVzdFBhcmFtKSl7aWYoIWkuaGFzQW55KXtjb25zdCB0PW0oaSk7aWYoZS50eXBlcy5zb21lKChlPT4hdC5oYXMoZS5uYW1lKSkpKWNvbnRpbnVlfW4ucHVzaChyKX19aWYoYT1uLDA9PT1hLmxlbmd0aClicmVha31mb3IodSBvZiBhKWlmKHUucGFyYW1zLmxlbmd0aDw9cylyZXR1cm4gdTt0aHJvdyBuZXcgVHlwZUVycm9yKCJTaWduYXR1cmUgbm90IGZvdW5kIChzaWduYXR1cmU6ICIrKHQubmFtZXx8InVubmFtZWQiKSsiKCIrZChpLCIsICIpKyIpKSIpfWZ1bmN0aW9uIGQodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiIsIjtyZXR1cm4gdC5tYXAoKHQ9PnQubmFtZSkpLmpvaW4oZSl9ZnVuY3Rpb24gZyh0KXtjb25zdCBlPTA9PT10LmluZGV4T2YoIi4uLiIpLG49KGU/dC5sZW5ndGg+Mz90LnNsaWNlKDMpOiJhbnkiOnQpLnNwbGl0KCJ8IikubWFwKCh0PT51KHQudHJpbSgpKSkpO2xldCByPSExLGk9ZT8iLi4uIjoiIjtyZXR1cm57dHlwZXM6bi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiByPXQuaXNBbnl8fHIsaSs9dC5uYW1lKyJ8Iix7bmFtZTp0Lm5hbWUsdHlwZUluZGV4OnQuaW5kZXgsdGVzdDp0LnRlc3QsaXNBbnk6dC5pc0FueSxjb252ZXJzaW9uOm51bGwsY29udmVyc2lvbkluZGV4Oi0xfX0pKSxuYW1lOmkuc2xpY2UoMCwtMSksaGFzQW55OnIsaGFzQ29udmVyc2lvbjohMSxyZXN0UGFyYW06ZX19ZnVuY3Rpb24geSh0KXtjb25zdCBlPWZ1bmN0aW9uKHQpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm5bXTtjb25zdCBlPXQubWFwKHUpO3QubGVuZ3RoPjEmJmUuc29ydCgoKHQsZSk9PnQuaW5kZXgtZS5pbmRleCkpO2xldCBuPWVbMF0uY29udmVyc2lvbnNUbztpZigxPT09dC5sZW5ndGgpcmV0dXJuIG47bj1uLmNvbmNhdChbXSk7Y29uc3Qgcj1uZXcgU2V0KHQpO2ZvcihsZXQgdD0xO3Q8ZS5sZW5ndGg7Kyt0KXtsZXQgaTtmb3IoaSBvZiBlW3RdLmNvbnZlcnNpb25zVG8pci5oYXMoaS5mcm9tKXx8KG4ucHVzaChpKSxyLmFkZChpLmZyb20pKX1yZXR1cm4gbn0odC50eXBlcy5tYXAoKHQ9PnQubmFtZSkpKTtsZXQgbj10Lmhhc0FueSxyPXQubmFtZTtjb25zdCBpPWUubWFwKChmdW5jdGlvbih0KXtjb25zdCBlPXUodC5mcm9tKTtyZXR1cm4gbj1lLmlzQW55fHxuLHIrPSJ8Iit0LmZyb20se25hbWU6dC5mcm9tLHR5cGVJbmRleDplLmluZGV4LHRlc3Q6ZS50ZXN0LGlzQW55OmUuaXNBbnksY29udmVyc2lvbjp0LGNvbnZlcnNpb25JbmRleDp0LmluZGV4fX0pKTtyZXR1cm57dHlwZXM6dC50eXBlcy5jb25jYXQoaSksbmFtZTpyLGhhc0FueTpuLGhhc0NvbnZlcnNpb246aS5sZW5ndGg+MCxyZXN0UGFyYW06dC5yZXN0UGFyYW19fWZ1bmN0aW9uIG0odCl7cmV0dXJuIHQudHlwZVNldHx8KHQudHlwZVNldD1uZXcgU2V0LHQudHlwZXMuZm9yRWFjaCgoZT0+dC50eXBlU2V0LmFkZChlLm5hbWUpKSkpLHQudHlwZVNldH1mdW5jdGlvbiB2KHQpe2NvbnN0IGU9W107aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIlNpZ25hdHVyZXMgbXVzdCBiZSBzdHJpbmdzIik7Y29uc3Qgbj10LnRyaW0oKTtpZigiIj09PW4pcmV0dXJuIGU7Y29uc3Qgcj1uLnNwbGl0KCIsIik7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDsrK3Qpe2NvbnN0IG49ZyhyW3RdLnRyaW0oKSk7aWYobi5yZXN0UGFyYW0mJnQhPT1yLmxlbmd0aC0xKXRocm93IG5ldyBTeW50YXhFcnJvcignVW5leHBlY3RlZCByZXN0IHBhcmFtZXRlciAiJytyW3RdKyciOiBvbmx5IGFsbG93ZWQgZm9yIHRoZSBsYXN0IHBhcmFtZXRlcicpO2lmKDA9PT1uLnR5cGVzLmxlbmd0aClyZXR1cm4gbnVsbDtlLnB1c2gobil9cmV0dXJuIGV9ZnVuY3Rpb24gXyh0KXtjb25zdCBlPWoodCk7cmV0dXJuISFlJiZlLnJlc3RQYXJhbX1mdW5jdGlvbiB4KHQpe2lmKCF0fHwwPT09dC50eXBlcy5sZW5ndGgpcmV0dXJuIENwO2lmKDE9PT10LnR5cGVzLmxlbmd0aClyZXR1cm4gdSh0LnR5cGVzWzBdLm5hbWUpLnRlc3Q7aWYoMj09PXQudHlwZXMubGVuZ3RoKXtjb25zdCBlPXUodC50eXBlc1swXS5uYW1lKS50ZXN0LG49dSh0LnR5cGVzWzFdLm5hbWUpLnRlc3Q7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfHxuKHQpfX17Y29uc3QgZT10LnR5cGVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHUodC5uYW1lKS50ZXN0fSkpO3JldHVybiBmdW5jdGlvbih0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylpZihlW25dKHQpKXJldHVybiEwO3JldHVybiExfX19ZnVuY3Rpb24gdyh0KXtsZXQgZSxuLHI7aWYoXyh0KSl7ZT16KHQpLm1hcCh4KTtjb25zdCBuPWUubGVuZ3RoLHI9eChqKHQpKSxpPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT1uO2U8dC5sZW5ndGg7ZSsrKWlmKCFyKHRbZV0pKXJldHVybiExO3JldHVybiEwfTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYoIWVbbl0odFtuXSkpcmV0dXJuITE7cmV0dXJuIGkodCkmJnQubGVuZ3RoPj1uKzF9fXJldHVybiAwPT09dC5sZW5ndGg/ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10Lmxlbmd0aH06MT09PXQubGVuZ3RoPyhuPXgodFswXSksZnVuY3Rpb24odCl7cmV0dXJuIG4odFswXSkmJjE9PT10Lmxlbmd0aH0pOjI9PT10Lmxlbmd0aD8obj14KHRbMF0pLHI9eCh0WzFdKSxmdW5jdGlvbih0KXtyZXR1cm4gbih0WzBdKSYmcih0WzFdKSYmMj09PXQubGVuZ3RofSk6KGU9dC5tYXAoeCksZnVuY3Rpb24odCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYoIWVbbl0odFtuXSkpcmV0dXJuITE7cmV0dXJuIHQubGVuZ3RoPT09ZS5sZW5ndGh9KX1mdW5jdGlvbiBiKHQsZSl7cmV0dXJuIGU8dC5sZW5ndGg/dFtlXTpfKHQpP2oodCk6bnVsbH1mdW5jdGlvbiBEKHQsZSl7Y29uc3Qgbj1iKHQsZSk7cmV0dXJuIG4/bShuKTpuZXcgU2V0fWZ1bmN0aW9uIEUodCl7cmV0dXJuIG51bGw9PT10LmNvbnZlcnNpb258fHZvaWQgMD09PXQuY29udmVyc2lvbn1mdW5jdGlvbiBDKHQsZSl7Y29uc3Qgbj1uZXcgU2V0O3JldHVybiB0LmZvckVhY2goKHQ9Pntjb25zdCByPUQodC5wYXJhbXMsZSk7bGV0IGk7Zm9yKGkgb2YgciluLmFkZChpKX0pKSxuLmhhcygiYW55Iik/WyJhbnkiXTpBcnJheS5mcm9tKG4pfWZ1bmN0aW9uIFModCxlLG4pe2xldCByLGk7Y29uc3Qgbz10fHwidW5uYW1lZCI7bGV0IHMsYT1uO2ZvcihzPTA7czxlLmxlbmd0aDtzKyspe2NvbnN0IHQ9W107aWYoYS5mb3JFYWNoKChuPT57Y29uc3Qgcj14KGIobi5wYXJhbXMscykpOyhzPG4ucGFyYW1zLmxlbmd0aHx8XyhuLnBhcmFtcykpJiZyKGVbc10pJiZ0LnB1c2gobil9KSksMD09PXQubGVuZ3RoKXtpZihpPUMoYSxzKSxpLmxlbmd0aD4wKXtjb25zdCB0PWgoZVtzXSk7cmV0dXJuIHI9bmV3IFR5cGVFcnJvcigiVW5leHBlY3RlZCB0eXBlIG9mIGFyZ3VtZW50IGluIGZ1bmN0aW9uICIrbysiIChleHBlY3RlZDogIitpLmpvaW4oIiBvciAiKSsiLCBhY3R1YWw6ICIrdC5qb2luKCIgfCAiKSsiLCBpbmRleDogIitzKyIpIiksci5kYXRhPXtjYXRlZ29yeToid3JvbmdUeXBlIixmbjpvLGluZGV4OnMsYWN0dWFsOnQsZXhwZWN0ZWQ6aX0scn19ZWxzZSBhPXR9Y29uc3QgdT1hLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIF8odC5wYXJhbXMpPzEvMDp0LnBhcmFtcy5sZW5ndGh9KSk7aWYoZS5sZW5ndGg8TWF0aC5taW4uYXBwbHkobnVsbCx1KSlyZXR1cm4gaT1DKGEscykscj1uZXcgVHlwZUVycm9yKCJUb28gZmV3IGFyZ3VtZW50cyBpbiBmdW5jdGlvbiAiK28rIiAoZXhwZWN0ZWQ6ICIraS5qb2luKCIgb3IgIikrIiwgaW5kZXg6ICIrZS5sZW5ndGgrIikiKSxyLmRhdGE9e2NhdGVnb3J5OiJ0b29GZXdBcmdzIixmbjpvLGluZGV4OmUubGVuZ3RoLGV4cGVjdGVkOml9LHI7Y29uc3QgYz1NYXRoLm1heC5hcHBseShudWxsLHUpO2lmKGUubGVuZ3RoPmMpcmV0dXJuIHI9bmV3IFR5cGVFcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIGluIGZ1bmN0aW9uICIrbysiIChleHBlY3RlZDogIitjKyIsIGFjdHVhbDogIitlLmxlbmd0aCsiKSIpLHIuZGF0YT17Y2F0ZWdvcnk6InRvb01hbnlBcmdzIixmbjpvLGluZGV4OmUubGVuZ3RoLGV4cGVjdGVkTGVuZ3RoOmN9LHI7Y29uc3QgbD1bXTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdClsLnB1c2goaChlW3RdKS5qb2luKCJ8IikpO3JldHVybiByPW5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBvZiB0eXBlICInK2wuam9pbigiLCAiKSsnIiBkbyBub3QgbWF0Y2ggYW55IG9mIHRoZSBkZWZpbmVkIHNpZ25hdHVyZXMgb2YgZnVuY3Rpb24gJytvKyIuIiksci5kYXRhPXtjYXRlZ29yeToibWlzbWF0Y2giLGFjdHVhbDpsfSxyfWZ1bmN0aW9uIEEodCl7bGV0IGU9by5sZW5ndGgrMTtmb3IobGV0IG49MDtuPHQudHlwZXMubGVuZ3RoO24rKylFKHQudHlwZXNbbl0pJiYoZT1NYXRoLm1pbihlLHQudHlwZXNbbl0udHlwZUluZGV4KSk7cmV0dXJuIGV9ZnVuY3Rpb24gTih0KXtsZXQgZT1zKzE7Zm9yKGxldCBuPTA7bjx0LnR5cGVzLmxlbmd0aDtuKyspRSh0LnR5cGVzW25dKXx8KGU9TWF0aC5taW4oZSx0LnR5cGVzW25dLmNvbnZlcnNpb25JbmRleCkpO3JldHVybiBlfWZ1bmN0aW9uIEkodCxlKXtpZih0Lmhhc0FueSl7aWYoIWUuaGFzQW55KXJldHVybiAxfWVsc2UgaWYoZS5oYXNBbnkpcmV0dXJuLTE7aWYodC5yZXN0UGFyYW0pe2lmKCFlLnJlc3RQYXJhbSlyZXR1cm4gMX1lbHNlIGlmKGUucmVzdFBhcmFtKXJldHVybi0xO2lmKHQuaGFzQ29udmVyc2lvbil7aWYoIWUuaGFzQ29udmVyc2lvbilyZXR1cm4gMX1lbHNlIGlmKGUuaGFzQ29udmVyc2lvbilyZXR1cm4tMTtjb25zdCBuPUEodCktQShlKTtpZihuPDApcmV0dXJuLTE7aWYobj4wKXJldHVybiAxO2NvbnN0IHI9Tih0KS1OKGUpO3JldHVybiByPDA/LTE6cj4wPzE6MH1mdW5jdGlvbiBNKHQsZSl7Y29uc3Qgbj10LnBhcmFtcyxyPWUucGFyYW1zLGk9aihuKSxvPWoocikscz1fKG4pLGE9XyhyKTtpZihzJiZpLmhhc0FueSl7aWYoIWF8fCFvLmhhc0FueSlyZXR1cm4gMX1lbHNlIGlmKGEmJm8uaGFzQW55KXJldHVybi0xO2xldCB1LGM9MCxsPTA7Zm9yKHUgb2Ygbil1Lmhhc0FueSYmKytjLHUuaGFzQ29udmVyc2lvbiYmKytsO2xldCBoPTAsZj0wO2Zvcih1IG9mIHIpdS5oYXNBbnkmJisraCx1Lmhhc0NvbnZlcnNpb24mJisrZjtpZihjIT09aClyZXR1cm4gYy1oO2lmKHMmJmkuaGFzQ29udmVyc2lvbil7aWYoIWF8fCFvLmhhc0NvbnZlcnNpb24pcmV0dXJuIDF9ZWxzZSBpZihhJiZvLmhhc0NvbnZlcnNpb24pcmV0dXJuLTE7aWYobCE9PWYpcmV0dXJuIGwtZjtpZihzKXtpZighYSlyZXR1cm4gMX1lbHNlIGlmKGEpcmV0dXJuLTE7Y29uc3QgcD0obi5sZW5ndGgtci5sZW5ndGgpKihzPy0xOjEpO2lmKDAhPT1wKXJldHVybiBwO2NvbnN0IGQ9W107bGV0IGcseT0wO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7Kyt0KXtjb25zdCBlPUkoblt0XSxyW3RdKTtkLnB1c2goZSkseSs9ZX1pZigwIT09eSlyZXR1cm4geTtmb3IoZyBvZiBkKWlmKDAhPT1nKXJldHVybiBnO3JldHVybiAwfWZ1bmN0aW9uIEYodCxlKXtsZXQgbj1lO2lmKHQuc29tZSgodD0+dC5oYXNDb252ZXJzaW9uKSkpe2NvbnN0IHI9Xyh0KSxpPXQubWFwKFQpO249ZnVuY3Rpb24oKXtjb25zdCB0PVtdLG49cj9hcmd1bWVudHMubGVuZ3RoLTE6YXJndW1lbnRzLmxlbmd0aDtmb3IobGV0IGU9MDtlPG47ZSsrKXRbZV09aVtlXShhcmd1bWVudHNbZV0pO3JldHVybiByJiYodFtuXT1hcmd1bWVudHNbbl0ubWFwKGlbbl0pKSxlLmFwcGx5KHRoaXMsdCl9fWxldCByPW47aWYoXyh0KSl7Y29uc3QgZT10Lmxlbmd0aC0xO3I9ZnVuY3Rpb24oKXtyZXR1cm4gbi5hcHBseSh0aGlzLFUoYXJndW1lbnRzLDAsZSkuY29uY2F0KFtVKGFyZ3VtZW50cyxlKV0pKX19cmV0dXJuIHJ9ZnVuY3Rpb24gVCh0KXtsZXQgZSxuLHIsaTtjb25zdCBvPVtdLHM9W107c3dpdGNoKHQudHlwZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jb252ZXJzaW9uJiYoby5wdXNoKHUodC5jb252ZXJzaW9uLmZyb20pLnRlc3QpLHMucHVzaCh0LmNvbnZlcnNpb24uY29udmVydCkpfSkpLHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0fTtjYXNlIDE6cmV0dXJuIGU9b1swXSxyPXNbMF0sZnVuY3Rpb24odCl7cmV0dXJuIGUodCk/cih0KTp0fTtjYXNlIDI6cmV0dXJuIGU9b1swXSxuPW9bMV0scj1zWzBdLGk9c1sxXSxmdW5jdGlvbih0KXtyZXR1cm4gZSh0KT9yKHQpOm4odCk/aSh0KTp0fTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKylpZihvW2VdKHQpKXJldHVybiBzW2VdKHQpO3JldHVybiB0fX19ZnVuY3Rpb24gTyh0KXtyZXR1cm4gZnVuY3Rpb24gdChlLG4scil7aWYobjxlLmxlbmd0aCl7Y29uc3QgaT1lW25dO2xldCBvPVtdO2lmKGkucmVzdFBhcmFtKXtjb25zdCB0PWkudHlwZXMuZmlsdGVyKEUpO3QubGVuZ3RoPGkudHlwZXMubGVuZ3RoJiZvLnB1c2goe3R5cGVzOnQsbmFtZToiLi4uIit0Lm1hcCgodD0+dC5uYW1lKSkuam9pbigifCIpLGhhc0FueTp0LnNvbWUoKHQ9PnQuaXNBbnkpKSxoYXNDb252ZXJzaW9uOiExLHJlc3RQYXJhbTohMH0pLG8ucHVzaChpKX1lbHNlIG89aS50eXBlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlczpbdF0sbmFtZTp0Lm5hbWUsaGFzQW55OnQuaXNBbnksaGFzQ29udmVyc2lvbjp0LmNvbnZlcnNpb24scmVzdFBhcmFtOiExfX0pKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSx0Lm1hcChlKSl9KG8sKGZ1bmN0aW9uKGkpe3JldHVybiB0KGUsbisxLHIuY29uY2F0KFtpXSkpfSkpfXJldHVybltyXX0odCwwLFtdKX1mdW5jdGlvbiBMKHQsZSl7Y29uc3Qgbj1NYXRoLm1heCh0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKGxldCByPTA7cjxuO3IrKyl7Y29uc3Qgbj1EKHQsciksaT1EKGUscik7bGV0IG8scz0hMTtmb3IobyBvZiBpKWlmKG4uaGFzKG8pKXtzPSEwO2JyZWFrfWlmKCFzKXJldHVybiExfWNvbnN0IHI9dC5sZW5ndGgsaT1lLmxlbmd0aCxvPV8odCkscz1fKGUpO3JldHVybiBvP3M/cj09PWk6aT49cjpzP3I+PWk6cj09PWl9ZnVuY3Rpb24gUCh0LGUsbil7Y29uc3Qgcj1bXTtsZXQgaTtmb3IoaSBvZiB0KXtsZXQgdD1uW2ldO2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBkZWZpbml0aW9uIGZvciByZWZlcmVuY2VkIHNpZ25hdHVyZSAiJytpKyciJyk7aWYodD1lW3RdLCJmdW5jdGlvbiIhPXR5cGVvZiB0KXJldHVybiExO3IucHVzaCh0KX1yZXR1cm4gcn1mdW5jdGlvbiBSKHQsZSxuKXtjb25zdCByPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcCgodD0+WSh0KT9WKHQucmVmZXJUb1NlbGYuY2FsbGJhY2spOkcodCk/cSh0LnJlZmVyVG8ucmVmZXJlbmNlcyx0LnJlZmVyVG8uY2FsbGJhY2spOnQpKX0odCksaT1uZXcgQXJyYXkoci5sZW5ndGgpLmZpbGwoITEpO2xldCBvPSEwO2Zvcig7bzspe289ITE7bGV0IHQ9ITA7Zm9yKGxldCBzPTA7czxyLmxlbmd0aDsrK3Mpe2lmKGlbc10pY29udGludWU7Y29uc3QgYT1yW3NdO2lmKFkoYSkpcltzXT1hLnJlZmVyVG9TZWxmLmNhbGxiYWNrKG4pLHJbc10ucmVmZXJUb1NlbGY9YS5yZWZlclRvU2VsZixpW3NdPSEwLHQ9ITE7ZWxzZSBpZihHKGEpKXtjb25zdCBuPVAoYS5yZWZlclRvLnJlZmVyZW5jZXMscixlKTtuPyhyW3NdPWEucmVmZXJUby5jYWxsYmFjay5hcHBseSh0aGlzLG4pLHJbc10ucmVmZXJUbz1hLnJlZmVyVG8saVtzXT0hMCx0PSExKTpvPSEwfX1pZih0JiZvKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluIHJlc29sdmluZyB0eXBlZC5yZWZlclRvIil9cmV0dXJuIHJ9ZnVuY3Rpb24gQih0LGUpe2lmKGEuY3JlYXRlQ291bnQrKywwPT09T2JqZWN0LmtleXMoZSkubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiTm8gc2lnbmF0dXJlcyBwcm92aWRlZCIpO2Eud2FybkFnYWluc3REZXByZWNhdGVkVGhpcyYmZnVuY3Rpb24odCl7Y29uc3QgZT0vXGJ0aGlzKFwofFwuc2lnbmF0dXJlc1xiKS87T2JqZWN0LmtleXModCkuZm9yRWFjaCgobj0+e2NvbnN0IHI9dFtuXTtpZihlLnRlc3Qoci50b1N0cmluZygpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVzaW5nIGB0aGlzYCB0byBzZWxmLXJlZmVyZW5jZSBhIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgc2luY2UgdHlwZWQtZnVuY3Rpb25AMy4gVXNlIHR5cGVkLnJlZmVyVG8gYW5kIHR5cGVkLnJlZmVyVG9TZWxmIGluc3RlYWQuIil9KSl9KGUpO2NvbnN0IG49W10scj1bXSxpPXt9LG89W107bGV0IHM7Zm9yKHMgaW4gZSl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHMpKWNvbnRpbnVlO2NvbnN0IHQ9dihzKTtpZighdCljb250aW51ZTtuLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKEwoZSx0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCdDb25mbGljdGluZyBzaWduYXR1cmVzICInK2QoZSkrJyIgYW5kICInK2QodCkrJyIuJyl9KSksbi5wdXNoKHQpO2NvbnN0IGE9ci5sZW5ndGg7ci5wdXNoKGVbc10pO2NvbnN0IHU9dC5tYXAoeSk7bGV0IGM7Zm9yKGMgb2YgTyh1KSl7Y29uc3QgdD1kKGMpO28ucHVzaCh7cGFyYW1zOmMsbmFtZTp0LGZuOmF9KSxjLmV2ZXJ5KCh0PT4hdC5oYXNDb252ZXJzaW9uKSkmJihpW3RdPWEpfX1vLnNvcnQoTSk7Y29uc3QgdT1SKHIsaSxvdCk7bGV0IGM7Zm9yKGMgaW4gaSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaSxjKSYmKGlbY109dVtpW2NdXSk7Y29uc3QgbD1bXSxoPW5ldyBNYXA7Zm9yKGMgb2YgbyloLmhhcyhjLm5hbWUpfHwoYy5mbj11W2MuZm5dLGwucHVzaChjKSxoLnNldChjLm5hbWUsYykpO2NvbnN0IGY9bFswXSYmbFswXS5wYXJhbXMubGVuZ3RoPD0yJiYhXyhsWzBdLnBhcmFtcykscD1sWzFdJiZsWzFdLnBhcmFtcy5sZW5ndGg8PTImJiFfKGxbMV0ucGFyYW1zKSxnPWxbMl0mJmxbMl0ucGFyYW1zLmxlbmd0aDw9MiYmIV8obFsyXS5wYXJhbXMpLG09bFszXSYmbFszXS5wYXJhbXMubGVuZ3RoPD0yJiYhXyhsWzNdLnBhcmFtcyksYj1sWzRdJiZsWzRdLnBhcmFtcy5sZW5ndGg8PTImJiFfKGxbNF0ucGFyYW1zKSxEPWxbNV0mJmxbNV0ucGFyYW1zLmxlbmd0aDw9MiYmIV8obFs1XS5wYXJhbXMpLEU9ZiYmcCYmZyYmbSYmYiYmRDtmb3IobGV0IHQ9MDt0PGwubGVuZ3RoOysrdClsW3RdLnRlc3Q9dyhsW3RdLnBhcmFtcyk7Y29uc3QgQz1mP3gobFswXS5wYXJhbXNbMF0pOlNwLFM9cD94KGxbMV0ucGFyYW1zWzBdKTpTcCxBPWc/eChsWzJdLnBhcmFtc1swXSk6U3AsTj1tP3gobFszXS5wYXJhbXNbMF0pOlNwLEk9Yj94KGxbNF0ucGFyYW1zWzBdKTpTcCxUPUQ/eChsWzVdLnBhcmFtc1swXSk6U3AsUD1mP3gobFswXS5wYXJhbXNbMV0pOlNwLEI9cD94KGxbMV0ucGFyYW1zWzFdKTpTcCxrPWc/eChsWzJdLnBhcmFtc1sxXSk6U3Asej1tP3gobFszXS5wYXJhbXNbMV0pOlNwLGo9Yj94KGxbNF0ucGFyYW1zWzFdKTpTcCxVPUQ/eChsWzVdLnBhcmFtc1sxXSk6U3A7Zm9yKGxldCB0PTA7dDxsLmxlbmd0aDsrK3QpbFt0XS5pbXBsZW1lbnRhdGlvbj1GKGxbdF0ucGFyYW1zLGxbdF0uZm4pO2NvbnN0IHE9Zj9sWzBdLmltcGxlbWVudGF0aW9uOkFwLFY9cD9sWzFdLmltcGxlbWVudGF0aW9uOkFwLEc9Zz9sWzJdLmltcGxlbWVudGF0aW9uOkFwLFk9bT9sWzNdLmltcGxlbWVudGF0aW9uOkFwLFg9Yj9sWzRdLmltcGxlbWVudGF0aW9uOkFwLFc9RD9sWzVdLmltcGxlbWVudGF0aW9uOkFwLEg9Zj9sWzBdLnBhcmFtcy5sZW5ndGg6LTEsWj1wP2xbMV0ucGFyYW1zLmxlbmd0aDotMSxLPWc/bFsyXS5wYXJhbXMubGVuZ3RoOi0xLEo9bT9sWzNdLnBhcmFtcy5sZW5ndGg6LTEsUT1iP2xbNF0ucGFyYW1zLmxlbmd0aDotMSwkPUQ/bFs1XS5wYXJhbXMubGVuZ3RoOi0xLHR0PUU/NjowLGV0PWwubGVuZ3RoLG50PWwubWFwKCh0PT50LnRlc3QpKSxydD1sLm1hcCgodD0+dC5pbXBsZW1lbnRhdGlvbikpLGl0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PXR0O3Q8ZXQ7dCsrKWlmKG50W3RdKGFyZ3VtZW50cykpcmV0dXJuIHJ0W3RdLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gYS5vbk1pc21hdGNoKHQsYXJndW1lbnRzLGwpfTtmdW5jdGlvbiBvdCh0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09SCYmQyh0KSYmUChlKT9xLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09WiYmUyh0KSYmQihlKT9WLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09SyYmQSh0KSYmayhlKT9HLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09SiYmTih0KSYmeihlKT9ZLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09USYmSSh0KSYmaihlKT9YLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09JCYmVCh0KSYmVShlKT9XLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShvdCwibmFtZSIse3ZhbHVlOnR9KX1jYXRjaCh0KXt9cmV0dXJuIG90LnNpZ25hdHVyZXM9aSxvdC5fdHlwZWRGdW5jdGlvbkRhdGE9e3NpZ25hdHVyZXM6bCxzaWduYXR1cmVNYXA6aH0sb3R9ZnVuY3Rpb24gayh0LGUsbil7dGhyb3cgUyh0LGUsbil9ZnVuY3Rpb24geih0KXtyZXR1cm4gVSh0LDAsdC5sZW5ndGgtMSl9ZnVuY3Rpb24gaih0KXtyZXR1cm4gdFt0Lmxlbmd0aC0xXX1mdW5jdGlvbiBVKHQsZSxuKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCxlLG4pfWZ1bmN0aW9uIHEodCxlKXtyZXR1cm57cmVmZXJUbzp7cmVmZXJlbmNlczp0LGNhbGxiYWNrOmV9fX1mdW5jdGlvbiBWKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbGxiYWNrIGZ1bmN0aW9uIGV4cGVjdGVkIGFzIGZpcnN0IGFyZ3VtZW50Iik7cmV0dXJue3JlZmVyVG9TZWxmOntjYWxsYmFjazp0fX19ZnVuY3Rpb24gRyh0KXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0LnJlZmVyVG8mJkFycmF5LmlzQXJyYXkodC5yZWZlclRvLnJlZmVyZW5jZXMpJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWZlclRvLmNhbGxiYWNrfWZ1bmN0aW9uIFkodCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdC5yZWZlclRvU2VsZiYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVmZXJUb1NlbGYuY2FsbGJhY2t9ZnVuY3Rpb24gWCh0LGUpe2lmKCF0KXJldHVybiBlO2lmKGUmJmUhPT10KXtjb25zdCBuPW5ldyBFcnJvcigiRnVuY3Rpb24gbmFtZXMgZG8gbm90IG1hdGNoIChleHBlY3RlZDogIit0KyIsIGFjdHVhbDogIitlKyIpIik7dGhyb3cgbi5kYXRhPXthY3R1YWw6ZSxleHBlY3RlZDp0fSxufXJldHVybiB0fWZ1bmN0aW9uIFcodCl7bGV0IGU7Zm9yKGNvbnN0IG4gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGYodFtuXSl8fCJzdHJpbmciPT10eXBlb2YgdFtuXS5zaWduYXR1cmUpJiYoZT1YKGUsdFtuXS5uYW1lKSk7cmV0dXJuIGV9ZnVuY3Rpb24gSCh0LGUpe2xldCBuO2ZvcihuIGluIGUpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikpe2lmKG4gaW4gdCYmZVtuXSE9PXRbbl0pe2NvbnN0IHI9bmV3IEVycm9yKCdTaWduYXR1cmUgIicrbisnIiBpcyBkZWZpbmVkIHR3aWNlJyk7dGhyb3cgci5kYXRhPXtzaWduYXR1cmU6bixzb3VyY2VGdW5jdGlvbjplW25dLGRlc3RGdW5jdGlvbjp0W25dfSxyfXRbbl09ZVtuXX19bCgpLGMobik7Y29uc3QgWj1hO2Z1bmN0aW9uIEsodCl7aWYoIXR8fCJzdHJpbmciIT10eXBlb2YgdC5mcm9tfHwic3RyaW5nIiE9dHlwZW9mIHQudG98fCJmdW5jdGlvbiIhPXR5cGVvZiB0LmNvbnZlcnQpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IHdpdGggcHJvcGVydGllcyB7ZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBjb252ZXJ0OiBmdW5jdGlvbn0gZXhwZWN0ZWQiKTtpZih0LnRvPT09dC5mcm9tKXRocm93IG5ldyBTeW50YXhFcnJvcignSWxsZWdhbCB0byBkZWZpbmUgY29udmVyc2lvbiBmcm9tICInK3QuZnJvbSsnIiB0byBpdHNlbGYuJyl9cmV0dXJuIGE9ZnVuY3Rpb24odCl7Y29uc3Qgbj0ic3RyaW5nIj09dHlwZW9mIHQ7bGV0IHI9bj90OiIiO2NvbnN0IGk9e307Zm9yKGxldCB0PW4/MTowO3Q8YXJndW1lbnRzLmxlbmd0aDsrK3Qpe2NvbnN0IG89YXJndW1lbnRzW3RdO2xldCBzLGE9e307aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8/KHM9by5uYW1lLCJzdHJpbmciPT10eXBlb2Ygby5zaWduYXR1cmU/YVtvLnNpZ25hdHVyZV09bzpmKG8pJiYoYT1vLnNpZ25hdHVyZXMpKTplKG8pJiYoYT1vLG58fChzPVcobykpKSwwPT09T2JqZWN0LmtleXMoYSkubGVuZ3RoKXtjb25zdCBlPW5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IHRvICd0eXBlZCcgYXQgaW5kZXggIit0KyIgaXMgbm90IGEgKHR5cGVkKSBmdW5jdGlvbiwgbm9yIGFuIG9iamVjdCB3aXRoIHNpZ25hdHVyZXMgYXMga2V5cyBhbmQgZnVuY3Rpb25zIGFzIHZhbHVlcy4iKTt0aHJvdyBlLmRhdGE9e2luZGV4OnQsYXJndW1lbnQ6b30sZX1ufHwocj1YKHIscykpLEgoaSxhKX1yZXR1cm4gQihyfHwiIixpKX0sYS5jcmVhdGU9dCxhLmNyZWF0ZUNvdW50PVouY3JlYXRlQ291bnQsYS5vbk1pc21hdGNoPWssYS50aHJvd01pc21hdGNoRXJyb3I9ayxhLmNyZWF0ZUVycm9yPVMsYS5jbGVhcj1sLGEuY2xlYXJDb252ZXJzaW9ucz1mdW5jdGlvbigpe2xldCB0O2Zvcih0IG9mIG8paS5nZXQodCkuY29udmVyc2lvbnNUbz1bXTtzPTB9LGEuYWRkVHlwZXM9YyxhLl9maW5kVHlwZT11LGEucmVmZXJUbz1mdW5jdGlvbigpe2NvbnN0IHQ9eihhcmd1bWVudHMpLm1hcCgodD0+ZCh2KHQpKSkpLGU9aihhcmd1bWVudHMpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbGxiYWNrIGZ1bmN0aW9uIGV4cGVjdGVkIGFzIGxhc3QgYXJndW1lbnQiKTtyZXR1cm4gcSh0LGUpfSxhLnJlZmVyVG9TZWxmPVYsYS5jb252ZXJ0PWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj11KGUpO2lmKG4udGVzdCh0KSlyZXR1cm4gdDtjb25zdCByPW4uY29udmVyc2lvbnNUbztpZigwPT09ci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBhcmUgbm8gY29udmVyc2lvbnMgdG8gIitlKyIgZGVmaW5lZC4iKTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKylpZih1KHJbZV0uZnJvbSkudGVzdCh0KSlyZXR1cm4gcltlXS5jb252ZXJ0KHQpO3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgIit0KyIgdG8gIitlKX0sYS5maW5kU2lnbmF0dXJlPXAsYS5maW5kPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcCh0LGUsbikuaW1wbGVtZW50YXRpb259LGEuaXNUeXBlZEZ1bmN0aW9uPWYsYS53YXJuQWdhaW5zdERlcHJlY2F0ZWRUaGlzPSEwLGEuYWRkVHlwZT1mdW5jdGlvbih0LGUpe2xldCBuPSJhbnkiOyExIT09ZSYmaS5oYXMoIk9iamVjdCIpJiYobj0iT2JqZWN0IiksYS5hZGRUeXBlcyhbdF0sbil9LGEuYWRkQ29udmVyc2lvbj1mdW5jdGlvbih0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e292ZXJyaWRlOiExfTtLKHQpO2NvbnN0IG49dSh0LnRvKSxyPW4uY29udmVyc2lvbnNUby5maW5kKChlPT5lLmZyb209PT10LmZyb20pKTtpZihyKXtpZighZXx8IWUub3ZlcnJpZGUpdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBhbHJlYWR5IGEgY29udmVyc2lvbiBmcm9tICInK3QuZnJvbSsnIiB0byAiJytuLm5hbWUrJyInKTthLnJlbW92ZUNvbnZlcnNpb24oe2Zyb206ci5mcm9tLHRvOnQudG8sY29udmVydDpyLmNvbnZlcnR9KX1uLmNvbnZlcnNpb25zVG8ucHVzaCh7ZnJvbTp0LmZyb20sY29udmVydDp0LmNvbnZlcnQsaW5kZXg6cysrfSl9LGEuYWRkQ29udmVyc2lvbnM9ZnVuY3Rpb24odCxlKXt0LmZvckVhY2goKHQ9PmEuYWRkQ29udmVyc2lvbih0LGUpKSl9LGEucmVtb3ZlQ29udmVyc2lvbj1mdW5jdGlvbih0KXtLKHQpO2NvbnN0IGU9dSh0LnRvKSxuPWZ1bmN0aW9uKHQsZSl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYoZSh0W25dKSlyZXR1cm4gdFtuXX0oZS5jb252ZXJzaW9uc1RvLChlPT5lLmZyb209PT10LmZyb20pKTtpZighbil0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHQgdG8gcmVtb3ZlIG5vbmV4aXN0ZW50IGNvbnZlcnNpb24gZnJvbSAiK3QuZnJvbSsiIHRvICIrdC50byk7aWYobi5jb252ZXJ0IT09dC5jb252ZXJ0KXRocm93IG5ldyBFcnJvcigiQ29udmVyc2lvbiB0byByZW1vdmUgZG9lcyBub3QgbWF0Y2ggZXhpc3RpbmcgY29udmVyc2lvbiIpO2NvbnN0IHI9ZS5jb252ZXJzaW9uc1RvLmluZGV4T2Yobik7ZS5jb252ZXJzaW9uc1RvLnNwbGljZShyLDEpfSxhLnJlc29sdmU9ZnVuY3Rpb24odCxlKXtpZighZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKE5wKTtjb25zdCBuPXQuX3R5cGVkRnVuY3Rpb25EYXRhLnNpZ25hdHVyZXM7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDsrK3QpaWYoblt0XS50ZXN0KGUpKXJldHVybiBuW3RdO3JldHVybiBudWxsfSxhfSgpO2Z1bmN0aW9uIE1wKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR8fCEhaXNGaW5pdGUodCkmJnQ9PT1NYXRoLnJvdW5kKHQpfWZ1bmN0aW9uIEZwKHQsZSxuKXt2YXIgcj17MjoiMGIiLDg6IjBvIiwxNjoiMHgifVtlXSxpPSIiO2lmKG4pe2lmKG48MSl0aHJvdyBuZXcgRXJyb3IoInNpemUgbXVzdCBiZSBpbiBncmVhdGVyIHRoYW4gMCIpO2lmKCFNcChuKSl0aHJvdyBuZXcgRXJyb3IoInNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYodD5JZigyLG4tMSktMXx8dDwtSWYoMixuLTEpKXRocm93IG5ldyBFcnJvcigiVmFsdWUgbXVzdCBiZSBpbiByYW5nZSBbLTJeIi5jb25jYXQobi0xLCIsIDJeIikuY29uY2F0KG4tMSwiLTFdIikpO2lmKCFNcCh0KSl0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciIpO3Q8MCYmKHQrPUlmKDIsbikpLGk9ImkiLmNvbmNhdChuKX12YXIgbz0iIjtyZXR1cm4gdDwwJiYodD0tdCxvPSItIiksIiIuY29uY2F0KG8pLmNvbmNhdChyKS5jb25jYXQodC50b1N0cmluZyhlKSkuY29uY2F0KGkpfWZ1bmN0aW9uIFRwKHQsZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuIGUodCk7aWYodD09PTEvMClyZXR1cm4iSW5maW5pdHkiO2lmKHQ9PT0tMS8wKXJldHVybiItSW5maW5pdHkiO2lmKGlzTmFOKHQpKXJldHVybiJOYU4iO3ZhciBuLHIsaT0iYXV0byI7aWYoZSYmKGUubm90YXRpb24mJihpPWUubm90YXRpb24pLFBmKGUpP249ZTpQZihlLnByZWNpc2lvbikmJihuPWUucHJlY2lzaW9uKSxlLndvcmRTaXplJiYibnVtYmVyIiE9dHlwZW9mKHI9ZS53b3JkU2l6ZSkpKXRocm93IG5ldyBFcnJvcignT3B0aW9uICJ3b3JkU2l6ZSIgbXVzdCBiZSBhIG51bWJlcicpO3N3aXRjaChpKXtjYXNlImZpeGVkIjpyZXR1cm4gZnVuY3Rpb24odCxlKXtpZihpc05hTih0KXx8IWlzRmluaXRlKHQpKXJldHVybiBTdHJpbmcodCk7dmFyIG49T3AodCkscj0ibnVtYmVyIj09dHlwZW9mIGU/UHAobixuLmV4cG9uZW50KzErZSk6bixpPXIuY29lZmZpY2llbnRzLG89ci5leHBvbmVudCsxLHM9bysoZXx8MCk7cmV0dXJuIGkubGVuZ3RoPHMmJihpPWkuY29uY2F0KFJwKHMtaS5sZW5ndGgpKSksbzwwJiYoaT1ScCgxLW8pLmNvbmNhdChpKSxvPTEpLG88aS5sZW5ndGgmJmkuc3BsaWNlKG8sMCwwPT09bz8iMC4iOiIuIiksci5zaWduK2kuam9pbigiIil9KHQsbik7Y2FzZSJleHBvbmVudGlhbCI6cmV0dXJuIExwKHQsbik7Y2FzZSJlbmdpbmVlcmluZyI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odCl8fCFpc0Zpbml0ZSh0KSlyZXR1cm4gU3RyaW5nKHQpO3ZhciBuPU9wKHQpLHI9UHAobixlKSxpPXIuZXhwb25lbnQsbz1yLmNvZWZmaWNpZW50cyxzPWklMz09MD9pOmk8MD9pLTMtaSUzOmktaSUzO2lmKFBmKGUpKWZvcig7ZT5vLmxlbmd0aHx8aS1zKzE+by5sZW5ndGg7KW8ucHVzaCgwKTtlbHNlIGZvcih2YXIgYT1NYXRoLmFicyhpLXMpLShvLmxlbmd0aC0xKSx1PTA7dTxhO3UrKylvLnB1c2goMCk7Zm9yKHZhciBjPU1hdGguYWJzKGktcyksbD0xO2M+MDspbCsrLGMtLTt2YXIgaD1vLnNsaWNlKGwpLmpvaW4oIiIpLGY9UGYoZSkmJmgubGVuZ3RofHxoLm1hdGNoKC9bMS05XS8pPyIuIitoOiIiLHA9by5zbGljZSgwLGwpLmpvaW4oIiIpK2YrImUiKyhpPj0wPyIrIjoiIikrcy50b1N0cmluZygpO3JldHVybiByLnNpZ24rcH0odCxuKTtjYXNlImJpbiI6cmV0dXJuIEZwKHQsMixyKTtjYXNlIm9jdCI6cmV0dXJuIEZwKHQsOCxyKTtjYXNlImhleCI6cmV0dXJuIEZwKHQsMTYscik7Y2FzZSJhdXRvIjpyZXR1cm4gZnVuY3Rpb24odCxlLG4pe2lmKGlzTmFOKHQpfHwhaXNGaW5pdGUodCkpcmV0dXJuIFN0cmluZyh0KTt2YXIgcj1uJiZ2b2lkIDAhPT1uLmxvd2VyRXhwP24ubG93ZXJFeHA6LTMsaT1uJiZ2b2lkIDAhPT1uLnVwcGVyRXhwP24udXBwZXJFeHA6NSxvPU9wKHQpLHM9ZT9QcChvLGUpOm87aWYocy5leHBvbmVudDxyfHxzLmV4cG9uZW50Pj1pKXJldHVybiBMcCh0LGUpO3ZhciBhPXMuY29lZmZpY2llbnRzLHU9cy5leHBvbmVudDthLmxlbmd0aDxlJiYoYT1hLmNvbmNhdChScChlLWEubGVuZ3RoKSkpLGE9YS5jb25jYXQoUnAodS1hLmxlbmd0aCsxKyhhLmxlbmd0aDxlP2UtYS5sZW5ndGg6MCkpKSxhPVJwKC11KS5jb25jYXQoYSk7dmFyIGM9dT4wP3U6MDtyZXR1cm4gYzxhLmxlbmd0aC0xJiZhLnNwbGljZShjKzEsMCwiLiIpLHMuc2lnbithLmpvaW4oIiIpfSh0LG4sZSYmZSkucmVwbGFjZSgvKChcLlxkKj8pKDArKSkoJHxlKS8sKGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzJdLGU9YXJndW1lbnRzWzRdO3JldHVybiIuIiE9PXQ/dCtlOmV9KSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm90YXRpb24gIicraSsnIi4gQ2hvb3NlICJhdXRvIiwgImV4cG9uZW50aWFsIiwgImZpeGVkIiwgImJpbiIsICJvY3QiLCBvciAiaGV4LicpfX1mdW5jdGlvbiBPcCh0KXt2YXIgZT1TdHJpbmcodCkudG9Mb3dlckNhc2UoKS5tYXRjaCgvXigtPykoXGQrXC4/XGQqKShlKFsrLV0/XGQrKSk/JC8pO2lmKCFlKXRocm93IG5ldyBTeW50YXhFcnJvcigiSW52YWxpZCBudW1iZXIgIit0KTt2YXIgbj1lWzFdLHI9ZVsyXSxpPXBhcnNlRmxvYXQoZVs0XXx8IjAiKSxvPXIuaW5kZXhPZigiLiIpO2krPS0xIT09bz9vLTE6ci5sZW5ndGgtMTt2YXIgcz1yLnJlcGxhY2UoIi4iLCIiKS5yZXBsYWNlKC9eMCovLChmdW5jdGlvbih0KXtyZXR1cm4gaS09dC5sZW5ndGgsIiJ9KSkucmVwbGFjZSgvMCokLywiIikuc3BsaXQoIiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQpfSkpO3JldHVybiAwPT09cy5sZW5ndGgmJihzLnB1c2goMCksaSsrKSx7c2lnbjpuLGNvZWZmaWNpZW50czpzLGV4cG9uZW50Oml9fWZ1bmN0aW9uIExwKHQsZSl7aWYoaXNOYU4odCl8fCFpc0Zpbml0ZSh0KSlyZXR1cm4gU3RyaW5nKHQpO3ZhciBuPU9wKHQpLHI9ZT9QcChuLGUpOm4saT1yLmNvZWZmaWNpZW50cyxvPXIuZXhwb25lbnQ7aS5sZW5ndGg8ZSYmKGk9aS5jb25jYXQoUnAoZS1pLmxlbmd0aCkpKTt2YXIgcz1pLnNoaWZ0KCk7cmV0dXJuIHIuc2lnbitzKyhpLmxlbmd0aD4wPyIuIitpLmpvaW4oIiIpOiIiKSsiZSIrKG8+PTA/IisiOiIiKStvfWZ1bmN0aW9uIFBwKHQsZSl7Zm9yKHZhciBuPXtzaWduOnQuc2lnbixjb2VmZmljaWVudHM6dC5jb2VmZmljaWVudHMsZXhwb25lbnQ6dC5leHBvbmVudH0scj1uLmNvZWZmaWNpZW50cztlPD0wOylyLnVuc2hpZnQoMCksbi5leHBvbmVudCsrLGUrKztpZihyLmxlbmd0aD5lJiZyLnNwbGljZShlLHIubGVuZ3RoLWUpWzBdPj01KXt2YXIgaT1lLTE7Zm9yKHJbaV0rKzsxMD09PXJbaV07KXIucG9wKCksMD09PWkmJihyLnVuc2hpZnQoMCksbi5leHBvbmVudCsrLGkrKyksclstLWldKyt9cmV0dXJuIG59ZnVuY3Rpb24gUnAodCl7Zm9yKHZhciBlPVtdLG49MDtuPHQ7bisrKWUucHVzaCgwKTtyZXR1cm4gZX12YXIgQnA9TnVtYmVyLkVQU0lMT058fDIyMjA0NDYwNDkyNTAzMTNlLTMxO2Z1bmN0aW9uIGtwKHQsZSxuKXtpZihudWxsPT1uKXJldHVybiB0PT09ZTtpZih0PT09ZSlyZXR1cm4hMDtpZihpc05hTih0KXx8aXNOYU4oZSkpcmV0dXJuITE7aWYoaXNGaW5pdGUodCkmJmlzRmluaXRlKGUpKXt2YXIgcj1NYXRoLmFicyh0LWUpO3JldHVybiByPEJwfHxyPD1NYXRoLm1heChNYXRoLmFicyh0KSxNYXRoLmFicyhlKSkqbn1yZXR1cm4hMX1mdW5jdGlvbiB6cCh0LGUsbil7dmFyIHI9bmV3KDAsdC5jb25zdHJ1Y3RvcikoMiksaT0iIjtpZihuKXtpZihuPDEpdGhyb3cgbmV3IEVycm9yKCJzaXplIG11c3QgYmUgaW4gZ3JlYXRlciB0aGFuIDAiKTtpZighTXAobikpdGhyb3cgbmV3IEVycm9yKCJzaXplIG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKHQuZ3JlYXRlclRoYW4oci5wb3cobi0xKS5zdWIoMSkpfHx0Lmxlc3NUaGFuKHIucG93KG4tMSkubXVsKC0xKSkpdGhyb3cgbmV3IEVycm9yKCJWYWx1ZSBtdXN0IGJlIGluIHJhbmdlIFstMl4iLmNvbmNhdChuLTEsIiwgMl4iKS5jb25jYXQobi0xLCItMV0iKSk7aWYoIXQuaXNJbnRlZ2VyKCkpdGhyb3cgbmV3IEVycm9yKCJWYWx1ZSBtdXN0IGJlIGFuIGludGVnZXIiKTt0Lmxlc3NUaGFuKDApJiYodD10LmFkZChyLnBvdyhuKSkpLGk9ImkiLmNvbmNhdChuKX1zd2l0Y2goZSl7Y2FzZSAyOnJldHVybiIiLmNvbmNhdCh0LnRvQmluYXJ5KCkpLmNvbmNhdChpKTtjYXNlIDg6cmV0dXJuIiIuY29uY2F0KHQudG9PY3RhbCgpKS5jb25jYXQoaSk7Y2FzZSAxNjpyZXR1cm4iIi5jb25jYXQodC50b0hleGFkZWNpbWFsKCkpLmNvbmNhdChpKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiQmFzZSAiLmNvbmNhdChlLCIgbm90IHN1cHBvcnRlZCAiKSl9fWZ1bmN0aW9uIGpwKHQsZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuIGUodCk7aWYoIXQuaXNGaW5pdGUoKSlyZXR1cm4gdC5pc05hTigpPyJOYU4iOnQuZ3QoMCk/IkluZmluaXR5IjoiLUluZmluaXR5Ijt2YXIgbixyLGk9ImF1dG8iO2lmKHZvaWQgMCE9PWUmJihlLm5vdGF0aW9uJiYoaT1lLm5vdGF0aW9uKSwibnVtYmVyIj09dHlwZW9mIGU/bj1lOnZvaWQgMCE9PWUucHJlY2lzaW9uJiYobj1lLnByZWNpc2lvbiksZS53b3JkU2l6ZSYmIm51bWJlciIhPXR5cGVvZihyPWUud29yZFNpemUpKSl0aHJvdyBuZXcgRXJyb3IoJ09wdGlvbiAid29yZFNpemUiIG11c3QgYmUgYSBudW1iZXInKTtzd2l0Y2goaSl7Y2FzZSJmaXhlZCI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9GaXhlZChlKX0odCxuKTtjYXNlImV4cG9uZW50aWFsIjpyZXR1cm4gVXAodCxuKTtjYXNlImVuZ2luZWVyaW5nIjpyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj10LmUscj1uJTM9PTA/bjpuPDA/bi0zLW4lMzpuLW4lMyxpPXQubXVsKE1hdGgucG93KDEwLC1yKSksbz1pLnRvUHJlY2lzaW9uKGUpO2lmKC0xIT09by5pbmRleE9mKCJlIikpe289bmV3KDAsdC5jb25zdHJ1Y3RvcikobykudG9GaXhlZCgpfXJldHVybiBvKyJlIisobj49MD8iKyI6IiIpK3IudG9TdHJpbmcoKX0odCxuKTtjYXNlImJpbiI6cmV0dXJuIHpwKHQsMixyKTtjYXNlIm9jdCI6cmV0dXJuIHpwKHQsOCxyKTtjYXNlImhleCI6cmV0dXJuIHpwKHQsMTYscik7Y2FzZSJhdXRvIjp2YXIgbz1lJiZ2b2lkIDAhPT1lLmxvd2VyRXhwP2UubG93ZXJFeHA6LTMscz1lJiZ2b2lkIDAhPT1lLnVwcGVyRXhwP2UudXBwZXJFeHA6NTtpZih0LmlzWmVybygpKXJldHVybiIwIjt2YXIgYT10LnRvU2lnbmlmaWNhbnREaWdpdHMobiksdT1hLmU7cmV0dXJuKHU+PW8mJnU8cz9hLnRvRml4ZWQoKTpVcCh0LG4pKS5yZXBsYWNlKC8oKFwuXGQqPykoMCspKSgkfGUpLywoZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMl0sZT1hcmd1bWVudHNbNF07cmV0dXJuIi4iIT09dD90K2U6ZX0pKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcignVW5rbm93biBub3RhdGlvbiAiJytpKyciLiBDaG9vc2UgImF1dG8iLCAiZXhwb25lbnRpYWwiLCAiZml4ZWQiLCAiYmluIiwgIm9jdCIsIG9yICJoZXguJyl9fWZ1bmN0aW9uIFVwKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/dC50b0V4cG9uZW50aWFsKGUtMSk6dC50b0V4cG9uZW50aWFsKCl9ZnVuY3Rpb24gcXAodCxlKXt2YXIgbj1mdW5jdGlvbih0LGUpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gVHAodCxlKTtpZihSZih0KSlyZXR1cm4ganAodCxlKTtpZihmdW5jdGlvbih0KXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0JiYibnVtYmVyIj09dHlwZW9mIHQucyYmIm51bWJlciI9PXR5cGVvZiB0Lm4mJiJudW1iZXIiPT10eXBlb2YgdC5kfHwhMX0odCkpcmV0dXJuIGUmJiJkZWNpbWFsIj09PWUuZnJhY3Rpb24/dC50b1N0cmluZygpOnQucyp0Lm4rIi8iK3QuZDtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBWcCh0LGUpO2lmKGpmKHQpKXJldHVybiciJyt0KyciJztpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gdC5zeW50YXg/U3RyaW5nKHQuc3ludGF4KToiZnVuY3Rpb24iO2lmKHQmJiJvYmplY3QiPT10eXBlb2YgdCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQuZm9ybWF0P3QuZm9ybWF0KGUpOnQmJnQudG9TdHJpbmcoZSkhPT17fS50b1N0cmluZygpP3QudG9TdHJpbmcoZSk6InsiK09iamVjdC5rZXlzKHQpLm1hcCgobj0+JyInK24rJyI6ICcrcXAodFtuXSxlKSkpLmpvaW4oIiwgIikrIn0ifXJldHVybiBTdHJpbmcodCl9KHQsZSk7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmInRydW5jYXRlImluIGUmJm4ubGVuZ3RoPmUudHJ1bmNhdGU/bi5zdWJzdHJpbmcoMCxlLnRydW5jYXRlLTMpKyIuLi4iOm59ZnVuY3Rpb24gVnAodCxlKXtpZihBcnJheS5pc0FycmF5KHQpKXtmb3IodmFyIG49IlsiLHI9dC5sZW5ndGgsaT0wO2k8cjtpKyspMCE9PWkmJihuKz0iLCAiKSxuKz1WcCh0W2ldLGUpO3JldHVybiBuKz0iXSJ9cmV0dXJuIHFwKHQsZSl9ZnVuY3Rpb24gR3AodCxlLG4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIEdwKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO3RoaXMuYWN0dWFsPXQsdGhpcy5leHBlY3RlZD1lLHRoaXMucmVsYXRpb249bix0aGlzLm1lc3NhZ2U9IkRpbWVuc2lvbiBtaXNtYXRjaCAoIisoQXJyYXkuaXNBcnJheSh0KT8iWyIrdC5qb2luKCIsICIpKyJdIjp0KSsiICIrKHRoaXMucmVsYXRpb258fCIhPSIpKyIgIisoQXJyYXkuaXNBcnJheShlKT8iWyIrZS5qb2luKCIsICIpKyJdIjplKSsiKSIsdGhpcy5zdGFjaz0obmV3IEVycm9yKS5zdGFja31mdW5jdGlvbiBZcCh0LGUsbil7aWYoISh0aGlzIGluc3RhbmNlb2YgWXApKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIik7dGhpcy5pbmRleD10LGFyZ3VtZW50cy5sZW5ndGg8Mz8odGhpcy5taW49MCx0aGlzLm1heD1lKToodGhpcy5taW49ZSx0aGlzLm1heD1uKSx2b2lkIDAhPT10aGlzLm1pbiYmdGhpcy5pbmRleDx0aGlzLm1pbj90aGlzLm1lc3NhZ2U9IkluZGV4IG91dCBvZiByYW5nZSAoIit0aGlzLmluZGV4KyIgPCAiK3RoaXMubWluKyIpIjp2b2lkIDAhPT10aGlzLm1heCYmdGhpcy5pbmRleD49dGhpcy5tYXg/dGhpcy5tZXNzYWdlPSJJbmRleCBvdXQgb2YgcmFuZ2UgKCIrdGhpcy5pbmRleCsiID4gIisodGhpcy5tYXgtMSkrIikiOnRoaXMubWVzc2FnZT0iSW5kZXggb3V0IG9mIHJhbmdlICgiK3RoaXMuaW5kZXgrIikiLHRoaXMuc3RhY2s9KG5ldyBFcnJvcikuc3RhY2t9ZnVuY3Rpb24gWHAodCl7Zm9yKHZhciBlPVtdO0FycmF5LmlzQXJyYXkodCk7KWUucHVzaCh0Lmxlbmd0aCksdD10WzBdO3JldHVybiBlfWZ1bmN0aW9uIFdwKHQsZSxuKXt2YXIgcixpPXQubGVuZ3RoO2lmKGkhPT1lW25dKXRocm93IG5ldyBHcChpLGVbbl0pO2lmKG48ZS5sZW5ndGgtMSl7dmFyIG89bisxO2ZvcihyPTA7cjxpO3IrKyl7dmFyIHM9dFtyXTtpZighQXJyYXkuaXNBcnJheShzKSl0aHJvdyBuZXcgR3AoZS5sZW5ndGgtMSxlLmxlbmd0aCwiPCIpO1dwKHRbcl0sZSxvKX19ZWxzZSBmb3Iocj0wO3I8aTtyKyspaWYoQXJyYXkuaXNBcnJheSh0W3JdKSl0aHJvdyBuZXcgR3AoZS5sZW5ndGgrMSxlLmxlbmd0aCwiPiIpfWZ1bmN0aW9uIEhwKHQsZSl7aWYoMD09PWUubGVuZ3RoKXtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBHcCh0Lmxlbmd0aCwwKX1lbHNlIFdwKHQsZSwwKX1mdW5jdGlvbiBacCh0LGUpe2lmKCFQZih0KXx8IU1wKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkluZGV4IG11c3QgYmUgYW4gaW50ZWdlciAodmFsdWU6ICIrdCsiKSIpO2lmKHQ8MHx8Im51bWJlciI9PXR5cGVvZiBlJiZ0Pj1lKXRocm93IG5ldyBZcCh0LGUpfWZ1bmN0aW9uIEtwKHQsZSxuKXtpZighQXJyYXkuaXNBcnJheSh0KXx8IUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJSZXNpemluZyB0byBzY2FsYXIgaXMgbm90IHN1cHBvcnRlZCIpO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFQZih0KXx8IU1wKHQpfHx0PDApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBzaXplLCBtdXN0IGNvbnRhaW4gcG9zaXRpdmUgaW50ZWdlcnMgKHNpemU6ICIrcXAoZSkrIikiKX0pKSxKcCh0LGUsMCx2b2lkIDAhPT1uP246MCksdH1mdW5jdGlvbiBKcCh0LGUsbixyKXt2YXIgaSxvLHM9dC5sZW5ndGgsYT1lW25dLHU9TWF0aC5taW4ocyxhKTtpZih0Lmxlbmd0aD1hLG48ZS5sZW5ndGgtMSl7dmFyIGM9bisxO2ZvcihpPTA7aTx1O2krKylvPXRbaV0sQXJyYXkuaXNBcnJheShvKXx8KG89W29dLHRbaV09byksSnAobyxlLGMscik7Zm9yKGk9dTtpPGE7aSsrKW89W10sdFtpXT1vLEpwKG8sZSxjLHIpfWVsc2V7Zm9yKGk9MDtpPHU7aSsrKWZvcig7QXJyYXkuaXNBcnJheSh0W2ldKTspdFtpXT10W2ldWzBdO2ZvcihpPXU7aTxhO2krKyl0W2ldPXJ9fWZ1bmN0aW9uIFFwKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQ7dmFyIGU9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24gdChuKXtBcnJheS5pc0FycmF5KG4pP24uZm9yRWFjaCh0KTplLnB1c2gobil9KSksZX0odCkscj1uLmxlbmd0aDtpZighQXJyYXkuaXNBcnJheSh0KXx8IUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKDAsciwiIT0iKTt2YXIgaT10ZChlPSRwKGUscikpO2lmKHIhPT1pKXRocm93IG5ldyBHcChpLHIsIiE9Iik7dHJ5e3JldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyPXQsaT1lLmxlbmd0aC0xO2k+MDtpLS0pe3ZhciBvPWVbaV07bj1bXTtmb3IodmFyIHM9ci5sZW5ndGgvbyxhPTA7YTxzO2ErKyluLnB1c2goci5zbGljZShhKm8sKGErMSkqbykpO3I9bn1yZXR1cm4gcn0obixlKX1jYXRjaCh0KXt0aHJvdyB0IGluc3RhbmNlb2YgR3A/bmV3IEdwKGksciwiIT0iKTp0fX1mdW5jdGlvbiAkcCh0LGUpe3ZhciBuPXRkKHQpLHI9dC5zbGljZSgpLGk9dC5pbmRleE9mKC0xKTtpZih0LmluZGV4T2YoLTEsaSsxKT49MCl0aHJvdyBuZXcgRXJyb3IoIk1vcmUgdGhhbiBvbmUgd2lsZGNhcmQgaW4gc2l6ZXMiKTtpZihpPj0wKXtpZighKGUlbj09MCkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgcmVwbGFjZSB3aWxkY2FyZCwgc2luY2UgIitlKyIgaXMgbm8gbXVsdGlwbGUgb2YgIistbik7cltpXT0tZS9ufXJldHVybiByfWZ1bmN0aW9uIHRkKHQpe3JldHVybiB0LnJlZHVjZSgoKHQsZSk9PnQqZSksMSl9ZnVuY3Rpb24gZWQodCxlLG4scil7dmFyIGk9cnx8WHAodCk7aWYobilmb3IodmFyIG89MDtvPG47bysrKXQ9W3RdLGkudW5zaGlmdCgxKTtmb3IodD1uZCh0LGUsMCk7aS5sZW5ndGg8ZTspaS5wdXNoKDEpO3JldHVybiB0fWZ1bmN0aW9uIG5kKHQsZSxuKXt2YXIgcixpO2lmKEFycmF5LmlzQXJyYXkodCkpe3ZhciBvPW4rMTtmb3Iocj0wLGk9dC5sZW5ndGg7cjxpO3IrKyl0W3JdPW5kKHRbcl0sZSxvKX1lbHNlIGZvcih2YXIgcz1uO3M8ZTtzKyspdD1bdF07cmV0dXJuIHR9ZnVuY3Rpb24gcmQodCxlKXtmb3IodmFyIG4scj0wLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIG89dFtpXSxzPUFycmF5LmlzQXJyYXkobyk7aWYoMD09PWkmJnMmJihyPW8ubGVuZ3RoKSxzJiZvLmxlbmd0aCE9PXIpcmV0dXJuO3ZhciBhPXM/cmQobyxlKTplKG8pO2lmKHZvaWQgMD09PW4pbj1hO2Vsc2UgaWYobiE9PWEpcmV0dXJuIm1peGVkIn1yZXR1cm4gbn1mdW5jdGlvbiBpZCh0LGUsbixyKXtmdW5jdGlvbiBpKHIpe3ZhciBpPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXt9LHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyXSxvPXRbaV07dm9pZCAwIT09byYmKG5baV09byl9cmV0dXJuIG59KHIsZS5tYXAob2QpKTtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3ZhciByPWUuZmlsdGVyKCh0PT4hZnVuY3Rpb24odCl7cmV0dXJuIHQmJiI/Ij09PXRbMF19KHQpKSkuZXZlcnkoKHQ9PnZvaWQgMCE9PW5bdF0pKTtpZighcil7dmFyIGk9ZS5maWx0ZXIoKHQ9PnZvaWQgMD09PW5bdF0pKTt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgZnVuY3Rpb24gIicuY29uY2F0KHQsJyIsICcpKyJzb21lIGRlcGVuZGVuY2llcyBhcmUgbWlzc2luZzogIi5jb25jYXQoaS5tYXAoKHQ9PiciJy5jb25jYXQodCwnIicpKSkuam9pbigiLCAiKSwiLiIpKX19KHQsZSxyKSxuKGkpfXJldHVybiBpLmlzRmFjdG9yeT0hMCxpLmZuPXQsaS5kZXBlbmRlbmNpZXM9ZS5zbGljZSgpLnNvcnQoKSxyJiYoaS5tZXRhPXIpLGl9ZnVuY3Rpb24gb2QodCl7cmV0dXJuIHQmJiI/Ij09PXRbMF0/dC5zbGljZSgxKTp0fWZ1bmN0aW9uIHNkKHQsZSl7aWYoY2QodCkmJnVkKHQsZSkpcmV0dXJuIHRbZV07dGhyb3ciZnVuY3Rpb24iPT10eXBlb2YgdFtlXSYmZnVuY3Rpb24odCxlKXtyZXR1cm4hKG51bGw9PXR8fCJmdW5jdGlvbiIhPXR5cGVvZiB0W2VdfHxEcCh0LGUpJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YmJmUgaW4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKSYmKCEhRHAoaGQsZSl8fCEoZSBpbiBPYmplY3QucHJvdG90eXBlfHxlIGluIEZ1bmN0aW9uLnByb3RvdHlwZSkpfSh0LGUpP25ldyBFcnJvcignQ2Fubm90IGFjY2VzcyBtZXRob2QgIicrZSsnIiBhcyBhIHByb3BlcnR5Jyk6bmV3IEVycm9yKCdObyBhY2Nlc3MgdG8gcHJvcGVydHkgIicrZSsnIicpfWZ1bmN0aW9uIGFkKHQsZSxuKXtpZihjZCh0KSYmdWQodCxlKSlyZXR1cm4gdFtlXT1uLG47dGhyb3cgbmV3IEVycm9yKCdObyBhY2Nlc3MgdG8gcHJvcGVydHkgIicrZSsnIicpfWZ1bmN0aW9uIHVkKHQsZSl7cmV0dXJuISghdHx8Im9iamVjdCIhPXR5cGVvZiB0KSYmKCEhRHAobGQsZSl8fCEoZSBpbiBPYmplY3QucHJvdG90eXBlfHxlIGluIEZ1bmN0aW9uLnByb3RvdHlwZSkpfWZ1bmN0aW9uIGNkKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmdCYmdC5jb25zdHJ1Y3Rvcj09PU9iamVjdH1HcC5wcm90b3R5cGU9bmV3IFJhbmdlRXJyb3IsR3AucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJhbmdlRXJyb3IsR3AucHJvdG90eXBlLm5hbWU9IkRpbWVuc2lvbkVycm9yIixHcC5wcm90b3R5cGUuaXNEaW1lbnNpb25FcnJvcj0hMCxZcC5wcm90b3R5cGU9bmV3IFJhbmdlRXJyb3IsWXAucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJhbmdlRXJyb3IsWXAucHJvdG90eXBlLm5hbWU9IkluZGV4RXJyb3IiLFlwLnByb3RvdHlwZS5pc0luZGV4RXJyb3I9ITA7dmFyIGxkPXtsZW5ndGg6ITAsbmFtZTohMH0saGQ9e3RvU3RyaW5nOiEwLHZhbHVlT2Y6ITAsdG9Mb2NhbGVTdHJpbmc6ITB9O2NsYXNzIGZke2NvbnN0cnVjdG9yKHQpe3RoaXMud3JhcHBlZE9iamVjdD10fWtleXMoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy53cmFwcGVkT2JqZWN0KX1nZXQodCl7cmV0dXJuIHNkKHRoaXMud3JhcHBlZE9iamVjdCx0KX1zZXQodCxlKXtyZXR1cm4gYWQodGhpcy53cmFwcGVkT2JqZWN0LHQsZSksdGhpc31oYXModCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUgaW4gdH0odGhpcy53cmFwcGVkT2JqZWN0LHQpfX1mdW5jdGlvbiBwZCh0KXtyZXR1cm4hIXQmJih0IGluc3RhbmNlb2YgTWFwfHx0IGluc3RhbmNlb2YgZmR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0LnNldCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5rZXlzJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5oYXMpfXZhciBkZD1mdW5jdGlvbigpe3JldHVybiBkZD1JcC5jcmVhdGUsSXB9LGdkPWlkKCJ0eXBlZCIsWyI/QmlnTnVtYmVyIiwiP0NvbXBsZXgiLCI/RGVuc2VNYXRyaXgiLCI/RnJhY3Rpb24iXSwoZnVuY3Rpb24odCl7dmFye0JpZ051bWJlcjplLENvbXBsZXg6bixEZW5zZU1hdHJpeDpyLEZyYWN0aW9uOml9PXQsbz1kZCgpO3JldHVybiBvLmNsZWFyKCksby5hZGRUeXBlcyhbe25hbWU6Im51bWJlciIsdGVzdDpQZn0se25hbWU6IkNvbXBsZXgiLHRlc3Q6QmZ9LHtuYW1lOiJCaWdOdW1iZXIiLHRlc3Q6UmZ9LHtuYW1lOiJGcmFjdGlvbiIsdGVzdDprZn0se25hbWU6IlVuaXQiLHRlc3Q6emZ9LHtuYW1lOiJpZGVudGlmaWVyIix0ZXN0OnQ9PmpmJiYvXig/OltBLVphLXpceEFBXHhCNVx4QkFceEMwLVx4RDZceEQ4LVx4RjZceEY4LVx1MDJDMVx1MDJDNi1cdTAyRDFcdTAyRTAtXHUwMkU0XHUwMkVDXHUwMkVFXHUwMzcwLVx1MDM3NFx1MDM3Nlx1MDM3N1x1MDM3QS1cdTAzN0RcdTAzN0ZcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzRjVcdTAzRjctXHUwNDgxXHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjAtXHUwNTg4XHUwNUQwLVx1MDVFQVx1MDVFRi1cdTA1RjJcdTA2MjAtXHUwNjRBXHUwNjZFXHUwNjZGXHUwNjcxLVx1MDZEM1x1MDZENVx1MDZFNVx1MDZFNlx1MDZFRVx1MDZFRlx1MDZGQS1cdTA2RkNcdTA2RkZcdTA3MTBcdTA3MTItXHUwNzJGXHUwNzRELVx1MDdBNVx1MDdCMVx1MDdDQS1cdTA3RUFcdTA3RjRcdTA3RjVcdTA3RkFcdTA4MDAtXHUwODE1XHUwODFBXHUwODI0XHUwODI4XHUwODQwLVx1MDg1OFx1MDg2MC1cdTA4NkFcdTA4NzAtXHUwODg3XHUwODg5LVx1MDg4RVx1MDhBMC1cdTA4QzlcdTA5MDQtXHUwOTM5XHUwOTNEXHUwOTUwXHUwOTU4LVx1MDk2MVx1MDk3MS1cdTA5ODBcdTA5ODUtXHUwOThDXHUwOThGXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOUJEXHUwOUNFXHUwOURDXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMFx1MDlGMVx1MDlGQ1x1MEEwNS1cdTBBMEFcdTBBMEZcdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMlx1MEEzM1x1MEEzNVx1MEEzNlx1MEEzOFx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMlx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRDBcdTBBRTBcdTBBRTFcdTBBRjlcdTBCMDUtXHUwQjBDXHUwQjBGXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzJcdTBCMzNcdTBCMzUtXHUwQjM5XHUwQjNEXHUwQjVDXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI3MVx1MEI4M1x1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OVx1MEI5QVx1MEI5Q1x1MEI5RVx1MEI5Rlx1MEJBM1x1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI5XHUwQkQwXHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzOVx1MEMzRFx1MEM1OC1cdTBDNUFcdTBDNURcdTBDNjBcdTBDNjFcdTBDODBcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENCRFx1MENERFx1MENERVx1MENFMFx1MENFMVx1MENGMVx1MENGMlx1MEQwNC1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQzQVx1MEQzRFx1MEQ0RVx1MEQ1NC1cdTBENTZcdTBENUYtXHUwRDYxXHUwRDdBLVx1MEQ3Rlx1MEQ4NS1cdTBEOTZcdTBEOUEtXHUwREIxXHUwREIzLVx1MERCQlx1MERCRFx1MERDMC1cdTBEQzZcdTBFMDEtXHUwRTMwXHUwRTMyXHUwRTMzXHUwRTQwLVx1MEU0Nlx1MEU4MVx1MEU4Mlx1MEU4NFx1MEU4Ni1cdTBFOEFcdTBFOEMtXHUwRUEzXHUwRUE1XHUwRUE3LVx1MEVCMFx1MEVCMlx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBFQzZcdTBFREMtXHUwRURGXHUwRjAwXHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNkNcdTBGODgtXHUwRjhDXHUxMDAwLVx1MTAyQVx1MTAzRlx1MTA1MC1cdTEwNTVcdTEwNUEtXHUxMDVEXHUxMDYxXHUxMDY1XHUxMDY2XHUxMDZFLVx1MTA3MFx1MTA3NS1cdTEwODFcdTEwOEVcdTEwQTAtXHUxMEM1XHUxMEM3XHUxMENEXHUxMEQwLVx1MTBGQVx1MTBGQy1cdTEyNDhcdTEyNEEtXHUxMjREXHUxMjUwLVx1MTI1Nlx1MTI1OFx1MTI1QS1cdTEyNURcdTEyNjAtXHUxMjg4XHUxMjhBLVx1MTI4RFx1MTI5MC1cdTEyQjBcdTEyQjItXHUxMkI1XHUxMkI4LVx1MTJCRVx1MTJDMFx1MTJDMi1cdTEyQzVcdTEyQzgtXHUxMkQ2XHUxMkQ4LVx1MTMxMFx1MTMxMi1cdTEzMTVcdTEzMTgtXHUxMzVBXHUxMzgwLVx1MTM4Rlx1MTNBMC1cdTEzRjVcdTEzRjgtXHUxM0ZEXHUxNDAxLVx1MTY2Q1x1MTY2Ri1cdTE2N0ZcdTE2ODEtXHUxNjlBXHUxNkEwLVx1MTZFQVx1MTZGMS1cdTE2RjhcdTE3MDAtXHUxNzExXHUxNzFGLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc4MC1cdTE3QjNcdTE3RDdcdTE3RENcdTE4MjAtXHUxODc4XHUxODgwLVx1MTg4NFx1MTg4Ny1cdTE4QThcdTE4QUFcdTE4QjAtXHUxOEY1XHUxOTAwLVx1MTkxRVx1MTk1MC1cdTE5NkRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlBQlx1MTlCMC1cdTE5QzlcdTFBMDAtXHUxQTE2XHUxQTIwLVx1MUE1NFx1MUFBN1x1MUIwNS1cdTFCMzNcdTFCNDUtXHUxQjRDXHUxQjgzLVx1MUJBMFx1MUJBRVx1MUJBRlx1MUJCQS1cdTFCRTVcdTFDMDAtXHUxQzIzXHUxQzRELVx1MUM0Rlx1MUM1QS1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQzkwLVx1MUNCQVx1MUNCRC1cdTFDQkZcdTFDRTktXHUxQ0VDXHUxQ0VFLVx1MUNGM1x1MUNGNVx1MUNGNlx1MUNGQVx1MUQwMC1cdTFEQkZcdTFFMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIwNzFcdTIwN0ZcdTIwOTAtXHUyMDlDXHUyMTAyXHUyMTA3XHUyMTBBLVx1MjExM1x1MjExNVx1MjExOS1cdTIxMURcdTIxMjRcdTIxMjZcdTIxMjhcdTIxMkEtXHUyMTJEXHUyMTJGLVx1MjEzOVx1MjEzQy1cdTIxM0ZcdTIxNDUtXHUyMTQ5XHUyMTRFXHUyMTgzXHUyMTg0XHUyQzAwLVx1MkNFNFx1MkNFQi1cdTJDRUVcdTJDRjJcdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ4MC1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkUyRlx1MzAwNVx1MzAwNlx1MzAzMS1cdTMwMzVcdTMwM0JcdTMwM0NcdTMwNDEtXHUzMDk2XHUzMDlELVx1MzA5Rlx1MzBBMS1cdTMwRkFcdTMwRkMtXHUzMEZGXHUzMTA1LVx1MzEyRlx1MzEzMS1cdTMxOEVcdTMxQTAtXHUzMUJGXHUzMUYwLVx1MzFGRlx1MzQwMC1cdTREQkZcdTRFMDAtXHVBNDhDXHVBNEQwLVx1QTRGRFx1QTUwMC1cdUE2MENcdUE2MTAtXHVBNjFGXHVBNjJBXHVBNjJCXHVBNjQwLVx1QTY2RVx1QTY3Ri1cdUE2OURcdUE2QTAtXHVBNkU1XHVBNzE3LVx1QTcxRlx1QTcyMi1cdUE3ODhcdUE3OEItXHVBN0NBXHVBN0QwXHVBN0QxXHVBN0QzXHVBN0Q1LVx1QTdEOVx1QTdGMi1cdUE4MDFcdUE4MDMtXHVBODA1XHVBODA3LVx1QTgwQVx1QTgwQy1cdUE4MjJcdUE4NDAtXHVBODczXHVBODgyLVx1QThCM1x1QThGMi1cdUE4RjdcdUE4RkJcdUE4RkRcdUE4RkVcdUE5MEEtXHVBOTI1XHVBOTMwLVx1QTk0Nlx1QTk2MC1cdUE5N0NcdUE5ODQtXHVBOUIyXHVBOUNGXHVBOUUwLVx1QTlFNFx1QTlFNi1cdUE5RUZcdUE5RkEtXHVBOUZFXHVBQTAwLVx1QUEyOFx1QUE0MC1cdUFBNDJcdUFBNDQtXHVBQTRCXHVBQTYwLVx1QUE3Nlx1QUE3QVx1QUE3RS1cdUFBQUZcdUFBQjFcdUFBQjVcdUFBQjZcdUFBQjktXHVBQUJEXHVBQUMwXHVBQUMyXHVBQURCLVx1QUFERFx1QUFFMC1cdUFBRUFcdUFBRjItXHVBQUY0XHVBQjAxLVx1QUIwNlx1QUIwOS1cdUFCMEVcdUFCMTEtXHVBQjE2XHVBQjIwLVx1QUIyNlx1QUIyOC1cdUFCMkVcdUFCMzAtXHVBQjVBXHVBQjVDLVx1QUI2OVx1QUI3MC1cdUFCRTJcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQTZEXHVGQTcwLVx1RkFEOVx1RkIwMC1cdUZCMDZcdUZCMTMtXHVGQjE3XHVGQjFEXHVGQjFGLVx1RkIyOFx1RkIyQS1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJCMVx1RkJEMy1cdUZEM0RcdUZENTAtXHVGRDhGXHVGRDkyLVx1RkRDN1x1RkRGMC1cdUZERkJcdUZFNzAtXHVGRTc0XHVGRTc2LVx1RkVGQ1x1RkYyMS1cdUZGM0FcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURFODAtXHVERTlDXHVERUEwLVx1REVEMFx1REYwMC1cdURGMUZcdURGMkQtXHVERjQwXHVERjQyLVx1REY0OVx1REY1MC1cdURGNzVcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZdfFx1RDgwMVtcdURDMDAtXHVEQzlEXHVEQ0IwLVx1RENEM1x1RENEOC1cdURDRkJcdUREMDAtXHVERDI3XHVERDMwLVx1REQ2M1x1REQ3MC1cdUREN0FcdUREN0MtXHVERDhBXHVERDhDLVx1REQ5Mlx1REQ5NFx1REQ5NVx1REQ5Ny1cdUREQTFcdUREQTMtXHVEREIxXHVEREIzLVx1RERCOVx1RERCQlx1RERCQ1x1REUwMC1cdURGMzZcdURGNDAtXHVERjU1XHVERjYwLVx1REY2N1x1REY4MC1cdURGODVcdURGODctXHVERkIwXHVERkIyLVx1REZCQV18XHVEODAyW1x1REMwMC1cdURDMDVcdURDMDhcdURDMEEtXHVEQzM1XHVEQzM3XHVEQzM4XHVEQzNDXHVEQzNGLVx1REM1NVx1REM2MC1cdURDNzZcdURDODAtXHVEQzlFXHVEQ0UwLVx1RENGMlx1RENGNFx1RENGNVx1REQwMC1cdUREMTVcdUREMjAtXHVERDM5XHVERDgwLVx1RERCN1x1RERCRVx1RERCRlx1REUwMFx1REUxMC1cdURFMTNcdURFMTUtXHVERTE3XHVERTE5LVx1REUzNVx1REU2MC1cdURFN0NcdURFODAtXHVERTlDXHVERUMwLVx1REVDN1x1REVDOS1cdURFRTRcdURGMDAtXHVERjM1XHVERjQwLVx1REY1NVx1REY2MC1cdURGNzJcdURGODAtXHVERjkxXXxcdUQ4MDNbXHVEQzAwLVx1REM0OFx1REM4MC1cdURDQjJcdURDQzAtXHVEQ0YyXHVERDAwLVx1REQyM1x1REU4MC1cdURFQTlcdURFQjBcdURFQjFcdURGMDAtXHVERjFDXHVERjI3XHVERjMwLVx1REY0NVx1REY3MC1cdURGODFcdURGQjAtXHVERkM0XHVERkUwLVx1REZGNl18XHVEODA0W1x1REMwMy1cdURDMzdcdURDNzFcdURDNzJcdURDNzVcdURDODMtXHVEQ0FGXHVEQ0QwLVx1RENFOFx1REQwMy1cdUREMjZcdURENDRcdURENDdcdURENTAtXHVERDcyXHVERDc2XHVERDgzLVx1RERCMlx1RERDMS1cdUREQzRcdUREREFcdURERENcdURFMDAtXHVERTExXHVERTEzLVx1REUyQlx1REUzRlx1REU0MFx1REU4MC1cdURFODZcdURFODhcdURFOEEtXHVERThEXHVERThGLVx1REU5RFx1REU5Ri1cdURFQThcdURFQjAtXHVERURFXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzRFx1REY1MFx1REY1RC1cdURGNjFdfFx1RDgwNVtcdURDMDAtXHVEQzM0XHVEQzQ3LVx1REM0QVx1REM1Ri1cdURDNjFcdURDODAtXHVEQ0FGXHVEQ0M0XHVEQ0M1XHVEQ0M3XHVERDgwLVx1RERBRVx1REREOC1cdUREREJcdURFMDAtXHVERTJGXHVERTQ0XHVERTgwLVx1REVBQVx1REVCOFx1REYwMC1cdURGMUFcdURGNDAtXHVERjQ2XXxcdUQ4MDZbXHVEQzAwLVx1REMyQlx1RENBMC1cdURDREZcdURDRkYtXHVERDA2XHVERDA5XHVERDBDLVx1REQxM1x1REQxNVx1REQxNlx1REQxOC1cdUREMkZcdUREM0ZcdURENDFcdUREQTAtXHVEREE3XHVEREFBLVx1REREMFx1RERFMVx1RERFM1x1REUwMFx1REUwQi1cdURFMzJcdURFM0FcdURFNTBcdURFNUMtXHVERTg5XHVERTlEXHVERUIwLVx1REVGOF18XHVEODA3W1x1REMwMC1cdURDMDhcdURDMEEtXHVEQzJFXHVEQzQwXHVEQzcyLVx1REM4Rlx1REQwMC1cdUREMDZcdUREMDhcdUREMDlcdUREMEItXHVERDMwXHVERDQ2XHVERDYwLVx1REQ2NVx1REQ2N1x1REQ2OFx1REQ2QS1cdUREODlcdUREOThcdURFRTAtXHVERUYyXHVERjAyXHVERjA0LVx1REYxMFx1REYxMi1cdURGMzNcdURGQjBdfFx1RDgwOFtcdURDMDAtXHVERjk5XXxcdUQ4MDlbXHVEQzgwLVx1REQ0M118XHVEODBCW1x1REY5MC1cdURGRjBdfFtcdUQ4MENcdUQ4MUMtXHVEODIwXHVEODIyXHVEODQwLVx1RDg2OFx1RDg2QS1cdUQ4NkNcdUQ4NkYtXHVEODcyXHVEODc0LVx1RDg3OVx1RDg4MC1cdUQ4ODNcdUQ4ODUtXHVEODg3XVtcdURDMDAtXHVERkZGXXxcdUQ4MERbXHVEQzAwLVx1REMyRlx1REM0MS1cdURDNDZdfFx1RDgxMVtcdURDMDAtXHVERTQ2XXxcdUQ4MUFbXHVEQzAwLVx1REUzOFx1REU0MC1cdURFNUVcdURFNzAtXHVERUJFXHVERUQwLVx1REVFRFx1REYwMC1cdURGMkZcdURGNDAtXHVERjQzXHVERjYzLVx1REY3N1x1REY3RC1cdURGOEZdfFx1RDgxQltcdURFNDAtXHVERTdGXHVERjAwLVx1REY0QVx1REY1MFx1REY5My1cdURGOUZcdURGRTBcdURGRTFcdURGRTNdfFx1RDgyMVtcdURDMDAtXHVERkY3XXxcdUQ4MjNbXHVEQzAwLVx1RENENVx1REQwMC1cdUREMDhdfFx1RDgyQltcdURGRjAtXHVERkYzXHVERkY1LVx1REZGQlx1REZGRFx1REZGRV18XHVEODJDW1x1REMwMC1cdUREMjJcdUREMzJcdURENTAtXHVERDUyXHVERDU1XHVERDY0LVx1REQ2N1x1REQ3MC1cdURFRkJdfFx1RDgyRltcdURDMDAtXHVEQzZBXHVEQzcwLVx1REM3Q1x1REM4MC1cdURDODhcdURDOTAtXHVEQzk5XXxcdUQ4MzVbXHVEQzAwLVx1REM1NFx1REM1Ni1cdURDOUNcdURDOUVcdURDOUZcdURDQTJcdURDQTVcdURDQTZcdURDQTktXHVEQ0FDXHVEQ0FFLVx1RENCOVx1RENCQlx1RENCRC1cdURDQzNcdURDQzUtXHVERDA1XHVERDA3LVx1REQwQVx1REQwRC1cdUREMTRcdUREMTYtXHVERDFDXHVERDFFLVx1REQzOVx1REQzQi1cdUREM0VcdURENDAtXHVERDQ0XHVERDQ2XHVERDRBLVx1REQ1MFx1REQ1Mi1cdURFQTVcdURFQTgtXHVERUMwXHVERUMyLVx1REVEQVx1REVEQy1cdURFRkFcdURFRkMtXHVERjE0XHVERjE2LVx1REYzNFx1REYzNi1cdURGNEVcdURGNTAtXHVERjZFXHVERjcwLVx1REY4OFx1REY4QS1cdURGQThcdURGQUEtXHVERkMyXHVERkM0LVx1REZDQl18XHVEODM3W1x1REYwMC1cdURGMUVcdURGMjUtXHVERjJBXXxcdUQ4MzhbXHVEQzMwLVx1REM2RFx1REQwMC1cdUREMkNcdUREMzctXHVERDNEXHVERDRFXHVERTkwLVx1REVBRFx1REVDMC1cdURFRUJdfFx1RDgzOVtcdURDRDAtXHVEQ0VCXHVERkUwLVx1REZFNlx1REZFOC1cdURGRUJcdURGRURcdURGRUVcdURGRjAtXHVERkZFXXxcdUQ4M0FbXHVEQzAwLVx1RENDNFx1REQwMC1cdURENDNcdURENEJdfFx1RDgzQltcdURFMDAtXHVERTAzXHVERTA1LVx1REUxRlx1REUyMVx1REUyMlx1REUyNFx1REUyN1x1REUyOS1cdURFMzJcdURFMzQtXHVERTM3XHVERTM5XHVERTNCXHVERTQyXHVERTQ3XHVERTQ5XHVERTRCXHVERTRELVx1REU0Rlx1REU1MVx1REU1Mlx1REU1NFx1REU1N1x1REU1OVx1REU1Qlx1REU1RFx1REU1Rlx1REU2MVx1REU2Mlx1REU2NFx1REU2Ny1cdURFNkFcdURFNkMtXHVERTcyXHVERTc0LVx1REU3N1x1REU3OS1cdURFN0NcdURFN0VcdURFODAtXHVERTg5XHVERThCLVx1REU5Qlx1REVBMS1cdURFQTNcdURFQTUtXHVERUE5XHVERUFCLVx1REVCQl18XHVEODY5W1x1REMwMC1cdURFREZcdURGMDAtXHVERkZGXXxcdUQ4NkRbXHVEQzAwLVx1REYzOVx1REY0MC1cdURGRkZdfFx1RDg2RVtcdURDMDAtXHVEQzFEXHVEQzIwLVx1REZGRl18XHVEODczW1x1REMwMC1cdURFQTFcdURFQjAtXHVERkZGXXxcdUQ4N0FbXHVEQzAwLVx1REZFMF18XHVEODdFW1x1REMwMC1cdURFMURdfFx1RDg4NFtcdURDMDAtXHVERjRBXHVERjUwLVx1REZGRl18XHVEODg4W1x1REMwMC1cdURGQUZdKSg/OlswLTlBLVphLXpceEFBXHhCNVx4QkFceEMwLVx4RDZceEQ4LVx4RjZceEY4LVx1MDJDMVx1MDJDNi1cdTAyRDFcdTAyRTAtXHUwMkU0XHUwMkVDXHUwMkVFXHUwMzcwLVx1MDM3NFx1MDM3Nlx1MDM3N1x1MDM3QS1cdTAzN0RcdTAzN0ZcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzRjVcdTAzRjctXHUwNDgxXHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjAtXHUwNTg4XHUwNUQwLVx1MDVFQVx1MDVFRi1cdTA1RjJcdTA2MjAtXHUwNjRBXHUwNjZFXHUwNjZGXHUwNjcxLVx1MDZEM1x1MDZENVx1MDZFNVx1MDZFNlx1MDZFRVx1MDZFRlx1MDZGQS1cdTA2RkNcdTA2RkZcdTA3MTBcdTA3MTItXHUwNzJGXHUwNzRELVx1MDdBNVx1MDdCMVx1MDdDQS1cdTA3RUFcdTA3RjRcdTA3RjVcdTA3RkFcdTA4MDAtXHUwODE1XHUwODFBXHUwODI0XHUwODI4XHUwODQwLVx1MDg1OFx1MDg2MC1cdTA4NkFcdTA4NzAtXHUwODg3XHUwODg5LVx1MDg4RVx1MDhBMC1cdTA4QzlcdTA5MDQtXHUwOTM5XHUwOTNEXHUwOTUwXHUwOTU4LVx1MDk2MVx1MDk3MS1cdTA5ODBcdTA5ODUtXHUwOThDXHUwOThGXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOUJEXHUwOUNFXHUwOURDXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMFx1MDlGMVx1MDlGQ1x1MEEwNS1cdTBBMEFcdTBBMEZcdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMlx1MEEzM1x1MEEzNVx1MEEzNlx1MEEzOFx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMlx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRDBcdTBBRTBcdTBBRTFcdTBBRjlcdTBCMDUtXHUwQjBDXHUwQjBGXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzJcdTBCMzNcdTBCMzUtXHUwQjM5XHUwQjNEXHUwQjVDXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI3MVx1MEI4M1x1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OVx1MEI5QVx1MEI5Q1x1MEI5RVx1MEI5Rlx1MEJBM1x1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI5XHUwQkQwXHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzOVx1MEMzRFx1MEM1OC1cdTBDNUFcdTBDNURcdTBDNjBcdTBDNjFcdTBDODBcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENCRFx1MENERFx1MENERVx1MENFMFx1MENFMVx1MENGMVx1MENGMlx1MEQwNC1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQzQVx1MEQzRFx1MEQ0RVx1MEQ1NC1cdTBENTZcdTBENUYtXHUwRDYxXHUwRDdBLVx1MEQ3Rlx1MEQ4NS1cdTBEOTZcdTBEOUEtXHUwREIxXHUwREIzLVx1MERCQlx1MERCRFx1MERDMC1cdTBEQzZcdTBFMDEtXHUwRTMwXHUwRTMyXHUwRTMzXHUwRTQwLVx1MEU0Nlx1MEU4MVx1MEU4Mlx1MEU4NFx1MEU4Ni1cdTBFOEFcdTBFOEMtXHUwRUEzXHUwRUE1XHUwRUE3LVx1MEVCMFx1MEVCMlx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBFQzZcdTBFREMtXHUwRURGXHUwRjAwXHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNkNcdTBGODgtXHUwRjhDXHUxMDAwLVx1MTAyQVx1MTAzRlx1MTA1MC1cdTEwNTVcdTEwNUEtXHUxMDVEXHUxMDYxXHUxMDY1XHUxMDY2XHUxMDZFLVx1MTA3MFx1MTA3NS1cdTEwODFcdTEwOEVcdTEwQTAtXHUxMEM1XHUxMEM3XHUxMENEXHUxMEQwLVx1MTBGQVx1MTBGQy1cdTEyNDhcdTEyNEEtXHUxMjREXHUxMjUwLVx1MTI1Nlx1MTI1OFx1MTI1QS1cdTEyNURcdTEyNjAtXHUxMjg4XHUxMjhBLVx1MTI4RFx1MTI5MC1cdTEyQjBcdTEyQjItXHUxMkI1XHUxMkI4LVx1MTJCRVx1MTJDMFx1MTJDMi1cdTEyQzVcdTEyQzgtXHUxMkQ2XHUxMkQ4LVx1MTMxMFx1MTMxMi1cdTEzMTVcdTEzMTgtXHUxMzVBXHUxMzgwLVx1MTM4Rlx1MTNBMC1cdTEzRjVcdTEzRjgtXHUxM0ZEXHUxNDAxLVx1MTY2Q1x1MTY2Ri1cdTE2N0ZcdTE2ODEtXHUxNjlBXHUxNkEwLVx1MTZFQVx1MTZGMS1cdTE2RjhcdTE3MDAtXHUxNzExXHUxNzFGLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc4MC1cdTE3QjNcdTE3RDdcdTE3RENcdTE4MjAtXHUxODc4XHUxODgwLVx1MTg4NFx1MTg4Ny1cdTE4QThcdTE4QUFcdTE4QjAtXHUxOEY1XHUxOTAwLVx1MTkxRVx1MTk1MC1cdTE5NkRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlBQlx1MTlCMC1cdTE5QzlcdTFBMDAtXHUxQTE2XHUxQTIwLVx1MUE1NFx1MUFBN1x1MUIwNS1cdTFCMzNcdTFCNDUtXHUxQjRDXHUxQjgzLVx1MUJBMFx1MUJBRVx1MUJBRlx1MUJCQS1cdTFCRTVcdTFDMDAtXHUxQzIzXHUxQzRELVx1MUM0Rlx1MUM1QS1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQzkwLVx1MUNCQVx1MUNCRC1cdTFDQkZcdTFDRTktXHUxQ0VDXHUxQ0VFLVx1MUNGM1x1MUNGNVx1MUNGNlx1MUNGQVx1MUQwMC1cdTFEQkZcdTFFMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIwNzFcdTIwN0ZcdTIwOTAtXHUyMDlDXHUyMTAyXHUyMTA3XHUyMTBBLVx1MjExM1x1MjExNVx1MjExOS1cdTIxMURcdTIxMjRcdTIxMjZcdTIxMjhcdTIxMkEtXHUyMTJEXHUyMTJGLVx1MjEzOVx1MjEzQy1cdTIxM0ZcdTIxNDUtXHUyMTQ5XHUyMTRFXHUyMTgzXHUyMTg0XHUyQzAwLVx1MkNFNFx1MkNFQi1cdTJDRUVcdTJDRjJcdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ4MC1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkUyRlx1MzAwNVx1MzAwNlx1MzAzMS1cdTMwMzVcdTMwM0JcdTMwM0NcdTMwNDEtXHUzMDk2XHUzMDlELVx1MzA5Rlx1MzBBMS1cdTMwRkFcdTMwRkMtXHUzMEZGXHUzMTA1LVx1MzEyRlx1MzEzMS1cdTMxOEVcdTMxQTAtXHUzMUJGXHUzMUYwLVx1MzFGRlx1MzQwMC1cdTREQkZcdTRFMDAtXHVBNDhDXHVBNEQwLVx1QTRGRFx1QTUwMC1cdUE2MENcdUE2MTAtXHVBNjFGXHVBNjJBXHVBNjJCXHVBNjQwLVx1QTY2RVx1QTY3Ri1cdUE2OURcdUE2QTAtXHVBNkU1XHVBNzE3LVx1QTcxRlx1QTcyMi1cdUE3ODhcdUE3OEItXHVBN0NBXHVBN0QwXHVBN0QxXHVBN0QzXHVBN0Q1LVx1QTdEOVx1QTdGMi1cdUE4MDFcdUE4MDMtXHVBODA1XHVBODA3LVx1QTgwQVx1QTgwQy1cdUE4MjJcdUE4NDAtXHVBODczXHVBODgyLVx1QThCM1x1QThGMi1cdUE4RjdcdUE4RkJcdUE4RkRcdUE4RkVcdUE5MEEtXHVBOTI1XHVBOTMwLVx1QTk0Nlx1QTk2MC1cdUE5N0NcdUE5ODQtXHVBOUIyXHVBOUNGXHVBOUUwLVx1QTlFNFx1QTlFNi1cdUE5RUZcdUE5RkEtXHVBOUZFXHVBQTAwLVx1QUEyOFx1QUE0MC1cdUFBNDJcdUFBNDQtXHVBQTRCXHVBQTYwLVx1QUE3Nlx1QUE3QVx1QUE3RS1cdUFBQUZcdUFBQjFcdUFBQjVcdUFBQjZcdUFBQjktXHVBQUJEXHVBQUMwXHVBQUMyXHVBQURCLVx1QUFERFx1QUFFMC1cdUFBRUFcdUFBRjItXHVBQUY0XHVBQjAxLVx1QUIwNlx1QUIwOS1cdUFCMEVcdUFCMTEtXHVBQjE2XHVBQjIwLVx1QUIyNlx1QUIyOC1cdUFCMkVcdUFCMzAtXHVBQjVBXHVBQjVDLVx1QUI2OVx1QUI3MC1cdUFCRTJcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQTZEXHVGQTcwLVx1RkFEOVx1RkIwMC1cdUZCMDZcdUZCMTMtXHVGQjE3XHVGQjFEXHVGQjFGLVx1RkIyOFx1RkIyQS1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJCMVx1RkJEMy1cdUZEM0RcdUZENTAtXHVGRDhGXHVGRDkyLVx1RkRDN1x1RkRGMC1cdUZERkJcdUZFNzAtXHVGRTc0XHVGRTc2LVx1RkVGQ1x1RkYyMS1cdUZGM0FcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURFODAtXHVERTlDXHVERUEwLVx1REVEMFx1REYwMC1cdURGMUZcdURGMkQtXHVERjQwXHVERjQyLVx1REY0OVx1REY1MC1cdURGNzVcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZdfFx1RDgwMVtcdURDMDAtXHVEQzlEXHVEQ0IwLVx1RENEM1x1RENEOC1cdURDRkJcdUREMDAtXHVERDI3XHVERDMwLVx1REQ2M1x1REQ3MC1cdUREN0FcdUREN0MtXHVERDhBXHVERDhDLVx1REQ5Mlx1REQ5NFx1REQ5NVx1REQ5Ny1cdUREQTFcdUREQTMtXHVEREIxXHVEREIzLVx1RERCOVx1RERCQlx1RERCQ1x1REUwMC1cdURGMzZcdURGNDAtXHVERjU1XHVERjYwLVx1REY2N1x1REY4MC1cdURGODVcdURGODctXHVERkIwXHVERkIyLVx1REZCQV18XHVEODAyW1x1REMwMC1cdURDMDVcdURDMDhcdURDMEEtXHVEQzM1XHVEQzM3XHVEQzM4XHVEQzNDXHVEQzNGLVx1REM1NVx1REM2MC1cdURDNzZcdURDODAtXHVEQzlFXHVEQ0UwLVx1RENGMlx1RENGNFx1RENGNVx1REQwMC1cdUREMTVcdUREMjAtXHVERDM5XHVERDgwLVx1RERCN1x1RERCRVx1RERCRlx1REUwMFx1REUxMC1cdURFMTNcdURFMTUtXHVERTE3XHVERTE5LVx1REUzNVx1REU2MC1cdURFN0NcdURFODAtXHVERTlDXHVERUMwLVx1REVDN1x1REVDOS1cdURFRTRcdURGMDAtXHVERjM1XHVERjQwLVx1REY1NVx1REY2MC1cdURGNzJcdURGODAtXHVERjkxXXxcdUQ4MDNbXHVEQzAwLVx1REM0OFx1REM4MC1cdURDQjJcdURDQzAtXHVEQ0YyXHVERDAwLVx1REQyM1x1REU4MC1cdURFQTlcdURFQjBcdURFQjFcdURGMDAtXHVERjFDXHVERjI3XHVERjMwLVx1REY0NVx1REY3MC1cdURGODFcdURGQjAtXHVERkM0XHVERkUwLVx1REZGNl18XHVEODA0W1x1REMwMy1cdURDMzdcdURDNzFcdURDNzJcdURDNzVcdURDODMtXHVEQ0FGXHVEQ0QwLVx1RENFOFx1REQwMy1cdUREMjZcdURENDRcdURENDdcdURENTAtXHVERDcyXHVERDc2XHVERDgzLVx1RERCMlx1RERDMS1cdUREQzRcdUREREFcdURERENcdURFMDAtXHVERTExXHVERTEzLVx1REUyQlx1REUzRlx1REU0MFx1REU4MC1cdURFODZcdURFODhcdURFOEEtXHVERThEXHVERThGLVx1REU5RFx1REU5Ri1cdURFQThcdURFQjAtXHVERURFXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzRFx1REY1MFx1REY1RC1cdURGNjFdfFx1RDgwNVtcdURDMDAtXHVEQzM0XHVEQzQ3LVx1REM0QVx1REM1Ri1cdURDNjFcdURDODAtXHVEQ0FGXHVEQ0M0XHVEQ0M1XHVEQ0M3XHVERDgwLVx1RERBRVx1REREOC1cdUREREJcdURFMDAtXHVERTJGXHVERTQ0XHVERTgwLVx1REVBQVx1REVCOFx1REYwMC1cdURGMUFcdURGNDAtXHVERjQ2XXxcdUQ4MDZbXHVEQzAwLVx1REMyQlx1RENBMC1cdURDREZcdURDRkYtXHVERDA2XHVERDA5XHVERDBDLVx1REQxM1x1REQxNVx1REQxNlx1REQxOC1cdUREMkZcdUREM0ZcdURENDFcdUREQTAtXHVEREE3XHVEREFBLVx1REREMFx1RERFMVx1RERFM1x1REUwMFx1REUwQi1cdURFMzJcdURFM0FcdURFNTBcdURFNUMtXHVERTg5XHVERTlEXHVERUIwLVx1REVGOF18XHVEODA3W1x1REMwMC1cdURDMDhcdURDMEEtXHVEQzJFXHVEQzQwXHVEQzcyLVx1REM4Rlx1REQwMC1cdUREMDZcdUREMDhcdUREMDlcdUREMEItXHVERDMwXHVERDQ2XHVERDYwLVx1REQ2NVx1REQ2N1x1REQ2OFx1REQ2QS1cdUREODlcdUREOThcdURFRTAtXHVERUYyXHVERjAyXHVERjA0LVx1REYxMFx1REYxMi1cdURGMzNcdURGQjBdfFx1RDgwOFtcdURDMDAtXHVERjk5XXxcdUQ4MDlbXHVEQzgwLVx1REQ0M118XHVEODBCW1x1REY5MC1cdURGRjBdfFtcdUQ4MENcdUQ4MUMtXHVEODIwXHVEODIyXHVEODQwLVx1RDg2OFx1RDg2QS1cdUQ4NkNcdUQ4NkYtXHVEODcyXHVEODc0LVx1RDg3OVx1RDg4MC1cdUQ4ODNcdUQ4ODUtXHVEODg3XVtcdURDMDAtXHVERkZGXXxcdUQ4MERbXHVEQzAwLVx1REMyRlx1REM0MS1cdURDNDZdfFx1RDgxMVtcdURDMDAtXHVERTQ2XXxcdUQ4MUFbXHVEQzAwLVx1REUzOFx1REU0MC1cdURFNUVcdURFNzAtXHVERUJFXHVERUQwLVx1REVFRFx1REYwMC1cdURGMkZcdURGNDAtXHVERjQzXHVERjYzLVx1REY3N1x1REY3RC1cdURGOEZdfFx1RDgxQltcdURFNDAtXHVERTdGXHVERjAwLVx1REY0QVx1REY1MFx1REY5My1cdURGOUZcdURGRTBcdURGRTFcdURGRTNdfFx1RDgyMVtcdURDMDAtXHVERkY3XXxcdUQ4MjNbXHVEQzAwLVx1RENENVx1REQwMC1cdUREMDhdfFx1RDgyQltcdURGRjAtXHVERkYzXHVERkY1LVx1REZGQlx1REZGRFx1REZGRV18XHVEODJDW1x1REMwMC1cdUREMjJcdUREMzJcdURENTAtXHVERDUyXHVERDU1XHVERDY0LVx1REQ2N1x1REQ3MC1cdURFRkJdfFx1RDgyRltcdURDMDAtXHVEQzZBXHVEQzcwLVx1REM3Q1x1REM4MC1cdURDODhcdURDOTAtXHVEQzk5XXxcdUQ4MzVbXHVEQzAwLVx1REM1NFx1REM1Ni1cdURDOUNcdURDOUVcdURDOUZcdURDQTJcdURDQTVcdURDQTZcdURDQTktXHVEQ0FDXHVEQ0FFLVx1RENCOVx1RENCQlx1RENCRC1cdURDQzNcdURDQzUtXHVERDA1XHVERDA3LVx1REQwQVx1REQwRC1cdUREMTRcdUREMTYtXHVERDFDXHVERDFFLVx1REQzOVx1REQzQi1cdUREM0VcdURENDAtXHVERDQ0XHVERDQ2XHVERDRBLVx1REQ1MFx1REQ1Mi1cdURFQTVcdURFQTgtXHVERUMwXHVERUMyLVx1REVEQVx1REVEQy1cdURFRkFcdURFRkMtXHVERjE0XHVERjE2LVx1REYzNFx1REYzNi1cdURGNEVcdURGNTAtXHVERjZFXHVERjcwLVx1REY4OFx1REY4QS1cdURGQThcdURGQUEtXHVERkMyXHVERkM0LVx1REZDQl18XHVEODM3W1x1REYwMC1cdURGMUVcdURGMjUtXHVERjJBXXxcdUQ4MzhbXHVEQzMwLVx1REM2RFx1REQwMC1cdUREMkNcdUREMzctXHVERDNEXHVERDRFXHVERTkwLVx1REVBRFx1REVDMC1cdURFRUJdfFx1RDgzOVtcdURDRDAtXHVEQ0VCXHVERkUwLVx1REZFNlx1REZFOC1cdURGRUJcdURGRURcdURGRUVcdURGRjAtXHVERkZFXXxcdUQ4M0FbXHVEQzAwLVx1RENDNFx1REQwMC1cdURENDNcdURENEJdfFx1RDgzQltcdURFMDAtXHVERTAzXHVERTA1LVx1REUxRlx1REUyMVx1REUyMlx1REUyNFx1REUyN1x1REUyOS1cdURFMzJcdURFMzQtXHVERTM3XHVERTM5XHVERTNCXHVERTQyXHVERTQ3XHVERTQ5XHVERTRCXHVERTRELVx1REU0Rlx1REU1MVx1REU1Mlx1REU1NFx1REU1N1x1REU1OVx1REU1Qlx1REU1RFx1REU1Rlx1REU2MVx1REU2Mlx1REU2NFx1REU2Ny1cdURFNkFcdURFNkMtXHVERTcyXHVERTc0LVx1REU3N1x1REU3OS1cdURFN0NcdURFN0VcdURFODAtXHVERTg5XHVERThCLVx1REU5Qlx1REVBMS1cdURFQTNcdURFQTUtXHVERUE5XHVERUFCLVx1REVCQl18XHVEODY5W1x1REMwMC1cdURFREZcdURGMDAtXHVERkZGXXxcdUQ4NkRbXHVEQzAwLVx1REYzOVx1REY0MC1cdURGRkZdfFx1RDg2RVtcdURDMDAtXHVEQzFEXHVEQzIwLVx1REZGRl18XHVEODczW1x1REMwMC1cdURFQTFcdURFQjAtXHVERkZGXXxcdUQ4N0FbXHVEQzAwLVx1REZFMF18XHVEODdFW1x1REMwMC1cdURFMURdfFx1RDg4NFtcdURDMDAtXHVERjRBXHVERjUwLVx1REZGRl18XHVEODg4W1x1REMwMC1cdURGQUZdKSokLy50ZXN0KHQpfSx7bmFtZToic3RyaW5nIix0ZXN0OmpmfSx7bmFtZToiQ2hhaW4iLHRlc3Q6X3B9LHtuYW1lOiJBcnJheSIsdGVzdDpVZn0se25hbWU6Ik1hdHJpeCIsdGVzdDpxZn0se25hbWU6IkRlbnNlTWF0cml4Iix0ZXN0OkdmfSx7bmFtZToiU3BhcnNlTWF0cml4Iix0ZXN0OllmfSx7bmFtZToiUmFuZ2UiLHRlc3Q6WGZ9LHtuYW1lOiJJbmRleCIsdGVzdDpXZn0se25hbWU6ImJvb2xlYW4iLHRlc3Q6SGZ9LHtuYW1lOiJSZXN1bHRTZXQiLHRlc3Q6WmZ9LHtuYW1lOiJIZWxwIix0ZXN0OktmfSx7bmFtZToiZnVuY3Rpb24iLHRlc3Q6SmZ9LHtuYW1lOiJEYXRlIix0ZXN0OlFmfSx7bmFtZToiUmVnRXhwIix0ZXN0OiRmfSx7bmFtZToibnVsbCIsdGVzdDplcH0se25hbWU6InVuZGVmaW5lZCIsdGVzdDpucH0se25hbWU6IkFjY2Vzc29yTm9kZSIsdGVzdDpycH0se25hbWU6IkFycmF5Tm9kZSIsdGVzdDppcH0se25hbWU6IkFzc2lnbm1lbnROb2RlIix0ZXN0Om9wfSx7bmFtZToiQmxvY2tOb2RlIix0ZXN0OnNwfSx7bmFtZToiQ29uZGl0aW9uYWxOb2RlIix0ZXN0OmFwfSx7bmFtZToiQ29uc3RhbnROb2RlIix0ZXN0OnVwfSx7bmFtZToiRnVuY3Rpb25Ob2RlIix0ZXN0OmxwfSx7bmFtZToiRnVuY3Rpb25Bc3NpZ25tZW50Tm9kZSIsdGVzdDpjcH0se25hbWU6IkluZGV4Tm9kZSIsdGVzdDpocH0se25hbWU6Ik5vZGUiLHRlc3Q6ZnB9LHtuYW1lOiJPYmplY3ROb2RlIix0ZXN0OnBwfSx7bmFtZToiT3BlcmF0b3JOb2RlIix0ZXN0OmRwfSx7bmFtZToiUGFyZW50aGVzaXNOb2RlIix0ZXN0OmdwfSx7bmFtZToiUmFuZ2VOb2RlIix0ZXN0OnlwfSx7bmFtZToiUmVsYXRpb25hbE5vZGUiLHRlc3Q6bXB9LHtuYW1lOiJTeW1ib2xOb2RlIix0ZXN0OnZwfSx7bmFtZToiTWFwIix0ZXN0OnBkfSx7bmFtZToiT2JqZWN0Iix0ZXN0OnRwfV0pLG8uYWRkQ29udmVyc2lvbnMoW3tmcm9tOiJudW1iZXIiLHRvOiJCaWdOdW1iZXIiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7aWYoZXx8eWQodCksZnVuY3Rpb24odCl7cmV0dXJuIHQudG9FeHBvbmVudGlhbCgpLnJlcGxhY2UoL2UuKiQvLCIiKS5yZXBsYWNlKC9eMFwuPzAqfFwuLywiIikubGVuZ3RofSh0KT4xNSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgaW1wbGljaXRseSBjb252ZXJ0IGEgbnVtYmVyIHdpdGggPjE1IHNpZ25pZmljYW50IGRpZ2l0cyB0byBCaWdOdW1iZXIgKHZhbHVlOiAiK3QrIikuIFVzZSBmdW5jdGlvbiBiaWdudW1iZXIoeCkgdG8gY29udmVydCB0byBCaWdOdW1iZXIuIik7cmV0dXJuIG5ldyBlKHQpfX0se2Zyb206Im51bWJlciIsdG86IkNvbXBsZXgiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIG58fG1kKHQpLG5ldyBuKHQsMCl9fSx7ZnJvbToiQmlnTnVtYmVyIix0bzoiQ29tcGxleCIsY29udmVydDpmdW5jdGlvbih0KXtyZXR1cm4gbnx8bWQodCksbmV3IG4odC50b051bWJlcigpLDApfX0se2Zyb206IkZyYWN0aW9uIix0bzoiQmlnTnVtYmVyIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBpbXBsaWNpdGx5IGNvbnZlcnQgYSBGcmFjdGlvbiB0byBCaWdOdW1iZXIgb3IgdmljZSB2ZXJzYS4gVXNlIGZ1bmN0aW9uIGJpZ251bWJlcih4KSB0byBjb252ZXJ0IHRvIEJpZ051bWJlciBvciBmcmFjdGlvbih4KSB0byBjb252ZXJ0IHRvIEZyYWN0aW9uLiIpfX0se2Zyb206IkZyYWN0aW9uIix0bzoiQ29tcGxleCIsY29udmVydDpmdW5jdGlvbih0KXtyZXR1cm4gbnx8bWQodCksbmV3IG4odC52YWx1ZU9mKCksMCl9fSx7ZnJvbToibnVtYmVyIix0bzoiRnJhY3Rpb24iLGNvbnZlcnQ6ZnVuY3Rpb24odCl7aXx8dmQodCk7dmFyIGU9bmV3IGkodCk7aWYoZS52YWx1ZU9mKCkhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBpbXBsaWNpdGx5IGNvbnZlcnQgYSBudW1iZXIgdG8gYSBGcmFjdGlvbiB3aGVuIHRoZXJlIHdpbGwgYmUgYSBsb3NzIG9mIHByZWNpc2lvbiAodmFsdWU6ICIrdCsiKS4gVXNlIGZ1bmN0aW9uIGZyYWN0aW9uKHgpIHRvIGNvbnZlcnQgdG8gRnJhY3Rpb24uIik7cmV0dXJuIGV9fSx7ZnJvbToic3RyaW5nIix0bzoibnVtYmVyIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3ZhciBlPU51bWJlcih0KTtpZihpc05hTihlKSl0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK3QrJyIgdG8gYSBudW1iZXInKTtyZXR1cm4gZX19LHtmcm9tOiJzdHJpbmciLHRvOiJCaWdOdW1iZXIiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7ZXx8eWQodCk7dHJ5e3JldHVybiBuZXcgZSh0KX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK3QrJyIgdG8gQmlnTnVtYmVyJyl9fX0se2Zyb206InN0cmluZyIsdG86IkZyYWN0aW9uIixjb252ZXJ0OmZ1bmN0aW9uKHQpe2l8fHZkKHQpO3RyeXtyZXR1cm4gbmV3IGkodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCAiJyt0KyciIHRvIEZyYWN0aW9uJyl9fX0se2Zyb206InN0cmluZyIsdG86IkNvbXBsZXgiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7bnx8bWQodCk7dHJ5e3JldHVybiBuZXcgbih0KX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK3QrJyIgdG8gQ29tcGxleCcpfX19LHtmcm9tOiJib29sZWFuIix0bzoibnVtYmVyIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3JldHVybit0fX0se2Zyb206ImJvb2xlYW4iLHRvOiJCaWdOdW1iZXIiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIGV8fHlkKHQpLG5ldyBlKCt0KX19LHtmcm9tOiJib29sZWFuIix0bzoiRnJhY3Rpb24iLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIGl8fHZkKHQpLG5ldyBpKCt0KX19LHtmcm9tOiJib29sZWFuIix0bzoic3RyaW5nIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcodCl9fSx7ZnJvbToiQXJyYXkiLHRvOiJNYXRyaXgiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHJ8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29udmVydCBhcnJheSBpbnRvIGEgTWF0cml4OiBubyBjbGFzcyAnRGVuc2VNYXRyaXgnIHByb3ZpZGVkIil9KCksbmV3IHIodCl9fSx7ZnJvbToiTWF0cml4Iix0bzoiQXJyYXkiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWVPZigpfX1dKSxvLm9uTWlzbWF0Y2g9KHQsZSxuKT0+e3ZhciByPW8uY3JlYXRlRXJyb3IodCxlLG4pO2lmKFsid3JvbmdUeXBlIiwibWlzbWF0Y2giXS5pbmNsdWRlcyhyLmRhdGEuY2F0ZWdvcnkpJiYxPT09ZS5sZW5ndGgmJlZmKGVbMF0pJiZuLnNvbWUoKHQ9PiF0LnBhcmFtcy5pbmNsdWRlcygiLCIpKSkpe3ZhciBpPW5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uICciLmNvbmNhdCh0LCInIGRvZXNuJ3QgYXBwbHkgdG8gbWF0cmljZXMuIFRvIGNhbGwgaXQgIikrImVsZW1lbnR3aXNlIG9uIGEgbWF0cml4ICdNJywgdHJ5ICdtYXAoTSwgIi5jb25jYXQodCwiKScuIikpO3Rocm93IGkuZGF0YT1yLmRhdGEsaX10aHJvdyByfSxvLm9uTWlzbWF0Y2g9KHQsZSxuKT0+e3ZhciByPW8uY3JlYXRlRXJyb3IodCxlLG4pO2lmKFsid3JvbmdUeXBlIiwibWlzbWF0Y2giXS5pbmNsdWRlcyhyLmRhdGEuY2F0ZWdvcnkpJiYxPT09ZS5sZW5ndGgmJlZmKGVbMF0pJiZuLnNvbWUoKHQ9PiF0LnBhcmFtcy5pbmNsdWRlcygiLCIpKSkpe3ZhciBpPW5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uICciLmNvbmNhdCh0LCInIGRvZXNuJ3QgYXBwbHkgdG8gbWF0cmljZXMuIFRvIGNhbGwgaXQgIikrImVsZW1lbnR3aXNlIG9uIGEgbWF0cml4ICdNJywgdHJ5ICdtYXAoTSwgIi5jb25jYXQodCwiKScuIikpO3Rocm93IGkuZGF0YT1yLmRhdGEsaX10aHJvdyByfSxvfSkpO2Z1bmN0aW9uIHlkKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgdmFsdWUgIi5jb25jYXQodCwiIGludG8gYSBCaWdOdW1iZXI6IG5vIGNsYXNzICdCaWdOdW1iZXInIHByb3ZpZGVkIikpfWZ1bmN0aW9uIG1kKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgdmFsdWUgIi5jb25jYXQodCwiIGludG8gYSBDb21wbGV4IG51bWJlcjogbm8gY2xhc3MgJ0NvbXBsZXgnIHByb3ZpZGVkIikpfWZ1bmN0aW9uIHZkKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgdmFsdWUgIi5jb25jYXQodCwiIGludG8gYSBGcmFjdGlvbiwgbm8gY2xhc3MgJ0ZyYWN0aW9uJyBwcm92aWRlZC4iKSl9dmFyIF9kLHhkLHdkPTllMTUsYmQ9MWU5LERkPSIwMTIzNDU2Nzg5YWJjZGVmIixFZD0iMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNjQyMDc2MDExMDE0ODg2Mjg3NzI5NzYwMzMzMjc5MDA5Njc1NzI2MDk2NzczNTI0ODAyMzU5OTcyMDUwODk1OTgyOTgzNDE5Njc3ODQwNDIyODYyNDg2MzM0MDk1MjU0NjUwODI4MDY3NTY2NjYyODczNjkwOTg3ODE2ODk0ODI5MDcyMDgzMjU1NTQ2ODA4NDM3OTk4OTQ4MjYyMzMxOTg1MjgzOTM1MDUzMDg5NjUzNzc3MzI2Mjg4NDYxNjMzNjYyMjIyODc2OTgyMTk4ODY3NDY1NDM2Njc0NzQ0MDQyNDMyNzQzNjUxNTUwNDg5MzQzMTQ5MzkzOTE0Nzk2MTk0MDQ0MDAyMjIxMDUxMDE3MTQxNzQ4MDAzNjg4MDg0MDEyNjQ3MDgwNjg1NTY3NzQzMjE2MjI4MzU1MjIwMTE0ODA0NjYzNzE1NjU5MTIxMzczNDUwNzQ3ODU2OTQ3NjgzNDYzNjE2NzkyMTAxODA2NDQ1MDcwNjQ4MDAwMjc3NTAyNjg0OTE2NzQ2NTUwNTg2ODU2OTM1NjczNDIwNjcwNTgxMTM2NDI5MjI0NTU0NDA1NzU4OTI1NzI0MjA4MjQxMzE0Njk1Njg5MDE2NzU4OTQwMjU2Nzc2MzExMzU2OTE5MjkyMDMzMzc2NTg3MTQxNjYwMjMwMTA1NzAzMDg5NjM0NTcyMDc1NDQwMzcwODQ3NDY5OTQwMTY4MjY5MjgyODA4NDgxMTg0Mjg5MzE0ODQ4NTI0OTQ4NjQ0ODcxOTI3ODA5Njc2MjcxMjc1Nzc1Mzk3MDI3NjY4NjA1OTUyNDk2NzE2Njc0MTgzNDg1NzA0NDIyNTA3MTk3OTY1MDA0NzE0OTUxMDUwNDkyMjE0Nzc2NTY3NjM2OTM4NjYyOTc2OTc5NTIyMTEwNzE4MjY0NTQ5NzM0NzcyNjYyNDI1NzA5NDI5MzIyNTgyNzk4NTAyNTg1NTA5Nzg1MjY1MzgzMjA3NjA2NzI2MzE3MTY0MzA5NTA1OTk1MDg3ODA3NTIzNzEwMzMzMTAxMTk3ODU3NTQ3MzMxNTQxNDIxODA4NDI3NTQzODYzNTkxNzc4MTE3MDU0MzA5ODI3NDgyMzg1MDQ1NjQ4MDE5MDk1NjEwMjk5MjkxODI0MzE4MjM3NTI1MzU3NzA5NzUwNTM5NTY1MTg3Njk3NTEwMzc0OTcwODg4NjkyMTgwMjA1MTg5MzM5NTA3MjM4NTM5MjA1MTQ0NjM0MTk3MjY1Mjg3Mjg2OTY1MTEwODYyNTcxNDkyMTk4ODQ5OTc4NzQ4ODczNzcxMzQ1Njg2MjA5MTY3MDU4IixDZD0iMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI4ODQxOTcxNjkzOTkzNzUxMDU4MjA5NzQ5NDQ1OTIzMDc4MTY0MDYyODYyMDg5OTg2MjgwMzQ4MjUzNDIxMTcwNjc5ODIxNDgwODY1MTMyODIzMDY2NDcwOTM4NDQ2MDk1NTA1ODIyMzE3MjUzNTk0MDgxMjg0ODExMTc0NTAyODQxMDI3MDE5Mzg1MjExMDU1NTk2NDQ2MjI5NDg5NTQ5MzAzODE5NjQ0Mjg4MTA5NzU2NjU5MzM0NDYxMjg0NzU2NDgyMzM3ODY3ODMxNjUyNzEyMDE5MDkxNDU2NDg1NjY5MjM0NjAzNDg2MTA0NTQzMjY2NDgyMTMzOTM2MDcyNjAyNDkxNDEyNzM3MjQ1ODcwMDY2MDYzMTU1ODgxNzQ4ODE1MjA5MjA5NjI4MjkyNTQwOTE3MTUzNjQzNjc4OTI1OTAzNjAwMTEzMzA1MzA1NDg4MjA0NjY1MjEzODQxNDY5NTE5NDE1MTE2MDk0MzMwNTcyNzAzNjU3NTk1OTE5NTMwOTIxODYxMTczODE5MzI2MTE3OTMxMDUxMTg1NDgwNzQ0NjIzNzk5NjI3NDk1NjczNTE4ODU3NTI3MjQ4OTEyMjc5MzgxODMwMTE5NDkxMjk4MzM2NzMzNjI0NDA2NTY2NDMwODYwMjEzOTQ5NDYzOTUyMjQ3MzcxOTA3MDIxNzk4NjA5NDM3MDI3NzA1MzkyMTcxNzYyOTMxNzY3NTIzODQ2NzQ4MTg0Njc2Njk0MDUxMzIwMDA1NjgxMjcxNDUyNjM1NjA4Mjc3ODU3NzEzNDI3NTc3ODk2MDkxNzM2MzcxNzg3MjE0Njg0NDA5MDEyMjQ5NTM0MzAxNDY1NDk1ODUzNzEwNTA3OTIyNzk2ODkyNTg5MjM1NDIwMTk5NTYxMTIxMjkwMjE5NjA4NjQwMzQ0MTgxNTk4MTM2Mjk3NzQ3NzEzMDk5NjA1MTg3MDcyMTEzNDk5OTk5OTgzNzI5NzgwNDk5NTEwNTk3MzE3MzI4MTYwOTYzMTg1OTUwMjQ0NTk0NTUzNDY5MDgzMDI2NDI1MjIzMDgyNTMzNDQ2ODUwMzUyNjE5MzExODgxNzEwMTAwMDMxMzc4Mzg3NTI4ODY1ODc1MzMyMDgzODE0MjA2MTcxNzc2NjkxNDczMDM1OTgyNTM0OTA0Mjg3NTU0Njg3MzExNTk1NjI4NjM4ODIzNTM3ODc1OTM3NTE5NTc3ODE4NTc3ODA1MzIxNzEyMjY4MDY2MTMwMDE5Mjc4NzY2MTExOTU5MDkyMTY0MjAxOTg5MzgwOTUyNTcyMDEwNjU0ODU4NjMyNzg5IixTZD17cHJlY2lzaW9uOjIwLHJvdW5kaW5nOjQsbW9kdWxvOjEsdG9FeHBOZWc6LTcsdG9FeHBQb3M6MjEsbWluRTotd2QsbWF4RTp3ZCxjcnlwdG86ITF9LEFkPSEwLE5kPSJbRGVjaW1hbEVycm9yXSAiLElkPU5kKyJJbnZhbGlkIGFyZ3VtZW50OiAiLE1kPU5kKyJQcmVjaXNpb24gbGltaXQgZXhjZWVkZWQiLEZkPU5kKyJjcnlwdG8gdW5hdmFpbGFibGUiLFRkPSJbb2JqZWN0IERlY2ltYWxdIixPZD1NYXRoLmZsb29yLExkPU1hdGgucG93LFBkPS9eMGIoWzAxXSsoXC5bMDFdKik/fFwuWzAxXSspKHBbKy1dP1xkKyk/JC9pLFJkPS9eMHgoWzAtOWEtZl0rKFwuWzAtOWEtZl0qKT98XC5bMC05YS1mXSspKHBbKy1dP1xkKyk/JC9pLEJkPS9eMG8oWzAtN10rKFwuWzAtN10qKT98XC5bMC03XSspKHBbKy1dP1xkKyk/JC9pLGtkPS9eKFxkKyhcLlxkKik/fFwuXGQrKShlWystXT9cZCspPyQvaSx6ZD0xZTcsamQ9RWQubGVuZ3RoLTEsVWQ9Q2QubGVuZ3RoLTEscWQ9e3RvU3RyaW5nVGFnOlRkfTtmdW5jdGlvbiBWZCh0KXt2YXIgZSxuLHIsaT10Lmxlbmd0aC0xLG89IiIscz10WzBdO2lmKGk+MCl7Zm9yKG8rPXMsZT0xO2U8aTtlKyspKG49Ny0ocj10W2VdKyIiKS5sZW5ndGgpJiYobys9dGcobikpLG8rPXI7KG49Ny0ocj0ocz10W2VdKSsiIikubGVuZ3RoKSYmKG8rPXRnKG4pKX1lbHNlIGlmKDA9PT1zKXJldHVybiIwIjtmb3IoO3MlMTA9PTA7KXMvPTEwO3JldHVybiBvK3N9ZnVuY3Rpb24gR2QodCxlLG4pe2lmKHQhPT1+fnR8fHQ8ZXx8dD5uKXRocm93IEVycm9yKElkK3QpfWZ1bmN0aW9uIFlkKHQsZSxuLHIpe3ZhciBpLG8scyxhO2ZvcihvPXRbMF07bz49MTA7by89MTApLS1lO3JldHVybi0tZTwwPyhlKz03LGk9MCk6KGk9TWF0aC5jZWlsKChlKzEpLzcpLGUlPTcpLG89TGQoMTAsNy1lKSxhPXRbaV0lb3wwLG51bGw9PXI/ZTwzPygwPT1lP2E9YS8xMDB8MDoxPT1lJiYoYT1hLzEwfDApLHM9bjw0JiY5OTk5OT09YXx8bj4zJiY0OTk5OT09YXx8NWU0PT1hfHwwPT1hKTpzPShuPDQmJmErMT09b3x8bj4zJiZhKzE9PW8vMikmJih0W2krMV0vby8xMDB8MCk9PUxkKDEwLGUtMiktMXx8KGE9PW8vMnx8MD09YSkmJiEodFtpKzFdL28vMTAwfDApOmU8ND8oMD09ZT9hPWEvMWUzfDA6MT09ZT9hPWEvMTAwfDA6Mj09ZSYmKGE9YS8xMHwwKSxzPShyfHxuPDQpJiY5OTk5PT1hfHwhciYmbj4zJiY0OTk5PT1hKTpzPSgocnx8bjw0KSYmYSsxPT1vfHwhciYmbj4zJiZhKzE9PW8vMikmJih0W2krMV0vby8xZTN8MCk9PUxkKDEwLGUtMyktMSxzfWZ1bmN0aW9uIFhkKHQsZSxuKXtmb3IodmFyIHIsaSxvPVswXSxzPTAsYT10Lmxlbmd0aDtzPGE7KXtmb3IoaT1vLmxlbmd0aDtpLS07KW9baV0qPWU7Zm9yKG9bMF0rPURkLmluZGV4T2YodC5jaGFyQXQocysrKSkscj0wO3I8by5sZW5ndGg7cisrKW9bcl0+bi0xJiYodm9pZCAwPT09b1tyKzFdJiYob1tyKzFdPTApLG9bcisxXSs9b1tyXS9ufDAsb1tyXSU9bil9cmV0dXJuIG8ucmV2ZXJzZSgpfXFkLmFic29sdXRlVmFsdWU9cWQuYWJzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyk7cmV0dXJuIHQuczwwJiYodC5zPTEpLEhkKHQpfSxxZC5jZWlsPWZ1bmN0aW9uKCl7cmV0dXJuIEhkKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpLHRoaXMuZSsxLDIpfSxxZC5jbGFtcGVkVG89cWQuY2xhbXA9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtpZih0PW5ldyByKHQpLGU9bmV3IHIoZSksIXQuc3x8IWUucylyZXR1cm4gbmV3IHIoTmFOKTtpZih0Lmd0KGUpKXRocm93IEVycm9yKElkK2UpO3JldHVybiBuLmNtcCh0KTwwP3Q6bi5jbXAoZSk+MD9lOm5ldyByKG4pfSxxZC5jb21wYXJlZFRvPXFkLmNtcD1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvPXRoaXMscz1vLmQsYT0odD1uZXcgby5jb25zdHJ1Y3Rvcih0KSkuZCx1PW8ucyxjPXQucztpZighc3x8IWEpcmV0dXJuIHUmJmM/dSE9PWM/dTpzPT09YT8wOiFzXnU8MD8xOi0xOk5hTjtpZighc1swXXx8IWFbMF0pcmV0dXJuIHNbMF0/dTphWzBdPy1jOjA7aWYodSE9PWMpcmV0dXJuIHU7aWYoby5lIT09dC5lKXJldHVybiBvLmU+dC5lXnU8MD8xOi0xO2ZvcihlPTAsbj0ocj1zLmxlbmd0aCk8KGk9YS5sZW5ndGgpP3I6aTtlPG47KytlKWlmKHNbZV0hPT1hW2VdKXJldHVybiBzW2VdPmFbZV1edTwwPzE6LTE7cmV0dXJuIHI9PT1pPzA6cj5pXnU8MD8xOi0xfSxxZC5jb3NpbmU9cWQuY29zPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiBuLmQ/bi5kWzBdPyh0PXIucHJlY2lzaW9uLGU9ci5yb3VuZGluZyxyLnByZWNpc2lvbj10K01hdGgubWF4KG4uZSxuLnNkKCkpKzcsci5yb3VuZGluZz0xLG49ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7aWYoZS5pc1plcm8oKSlyZXR1cm4gZTtyPWUuZC5sZW5ndGgscjwzMj8obj1NYXRoLmNlaWwoci8zKSxpPSgxL2NnKDQsbikpLnRvU3RyaW5nKCkpOihuPTE2LGk9IjIuMzI4MzA2NDM2NTM4Njk2Mjg5MDYyNWUtMTAiKSx0LnByZWNpc2lvbis9bixlPXVnKHQsMSxlLnRpbWVzKGkpLG5ldyB0KDEpKTtmb3IodmFyIG89bjtvLS07KXt2YXIgcz1lLnRpbWVzKGUpO2U9cy50aW1lcyhzKS5taW51cyhzKS50aW1lcyg4KS5wbHVzKDEpfXJldHVybiB0LnByZWNpc2lvbi09bixlfShyLGxnKHIsbikpLHIucHJlY2lzaW9uPXQsci5yb3VuZGluZz1lLEhkKDI9PXhkfHwzPT14ZD9uLm5lZygpOm4sdCxlLCEwKSk6bmV3IHIoMSk6bmV3IHIoTmFOKX0scWQuY3ViZVJvb3Q9cWQuY2JydD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGksbyxzLGEsdSxjLGw9dGhpcyxoPWwuY29uc3RydWN0b3I7aWYoIWwuaXNGaW5pdGUoKXx8bC5pc1plcm8oKSlyZXR1cm4gbmV3IGgobCk7Zm9yKEFkPSExLChvPWwucypMZChsLnMqbCwxLzMpKSYmTWF0aC5hYnMobykhPTEvMD9yPW5ldyBoKG8udG9TdHJpbmcoKSk6KG49VmQobC5kKSwobz0oKHQ9bC5lKS1uLmxlbmd0aCsxKSUzKSYmKG4rPTE9PW98fC0yPT1vPyIwIjoiMDAiKSxvPUxkKG4sMS8zKSx0PU9kKCh0KzEpLzMpLSh0JTM9PSh0PDA/LTE6MikpLG89PTEvMD9uPSI1ZSIrdDpuPShuPW8udG9FeHBvbmVudGlhbCgpKS5zbGljZSgwLG4uaW5kZXhPZigiZSIpKzEpK3QsKHI9bmV3IGgobikpLnM9bC5zKSxzPSh0PWgucHJlY2lzaW9uKSszOzspaWYoYz0odT0oYT1yKS50aW1lcyhhKS50aW1lcyhhKSkucGx1cyhsKSxyPVdkKGMucGx1cyhsKS50aW1lcyhhKSxjLnBsdXModSkscysyLDEpLFZkKGEuZCkuc2xpY2UoMCxzKT09PShuPVZkKHIuZCkpLnNsaWNlKDAscykpe2lmKCI5OTk5IiE9KG49bi5zbGljZShzLTMscysxKSkmJihpfHwiNDk5OSIhPW4pKXsoIStufHwhK24uc2xpY2UoMSkmJiI1Ij09bi5jaGFyQXQoMCkpJiYoSGQocix0KzEsMSksZT0hci50aW1lcyhyKS50aW1lcyhyKS5lcShsKSk7YnJlYWt9aWYoIWkmJihIZChhLHQrMSwwKSxhLnRpbWVzKGEpLnRpbWVzKGEpLmVxKGwpKSl7cj1hO2JyZWFrfXMrPTQsaT0xfXJldHVybiBBZD0hMCxIZChyLHQsaC5yb3VuZGluZyxlKX0scWQuZGVjaW1hbFBsYWNlcz1xZC5kcD1mdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5kLG49TmFOO2lmKGUpe2lmKG49NyooKHQ9ZS5sZW5ndGgtMSktT2QodGhpcy5lLzcpKSx0PWVbdF0pZm9yKDt0JTEwPT0wO3QvPTEwKW4tLTtuPDAmJihuPTApfXJldHVybiBufSxxZC5kaXZpZGVkQnk9cWQuZGl2PWZ1bmN0aW9uKHQpe3JldHVybiBXZCh0aGlzLG5ldyB0aGlzLmNvbnN0cnVjdG9yKHQpKX0scWQuZGl2aWRlZFRvSW50ZWdlckJ5PXFkLmRpdlRvSW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIEhkKFdkKHRoaXMsbmV3IGUodCksMCwxLDEpLGUucHJlY2lzaW9uLGUucm91bmRpbmcpfSxxZC5lcXVhbHM9cWQuZXE9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10aGlzLmNtcCh0KX0scWQuZmxvb3I9ZnVuY3Rpb24oKXtyZXR1cm4gSGQobmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyksdGhpcy5lKzEsMyl9LHFkLmdyZWF0ZXJUaGFuPXFkLmd0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNtcCh0KT4wfSxxZC5ncmVhdGVyVGhhbk9yRXF1YWxUbz1xZC5ndGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jbXAodCk7cmV0dXJuIDE9PWV8fDA9PT1lfSxxZC5oeXBlcmJvbGljQ29zaW5lPXFkLmNvc2g9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpLG89dGhpcyxzPW8uY29uc3RydWN0b3IsYT1uZXcgcygxKTtpZighby5pc0Zpbml0ZSgpKXJldHVybiBuZXcgcyhvLnM/MS8wOk5hTik7aWYoby5pc1plcm8oKSlyZXR1cm4gYTtuPXMucHJlY2lzaW9uLHI9cy5yb3VuZGluZyxzLnByZWNpc2lvbj1uK01hdGgubWF4KG8uZSxvLnNkKCkpKzQscy5yb3VuZGluZz0xLChpPW8uZC5sZW5ndGgpPDMyP2U9KDEvY2coNCx0PU1hdGguY2VpbChpLzMpKSkudG9TdHJpbmcoKToodD0xNixlPSIyLjMyODMwNjQzNjUzODY5NjI4OTA2MjVlLTEwIiksbz11ZyhzLDEsby50aW1lcyhlKSxuZXcgcygxKSwhMCk7Zm9yKHZhciB1LGM9dCxsPW5ldyBzKDgpO2MtLTspdT1vLnRpbWVzKG8pLG89YS5taW51cyh1LnRpbWVzKGwubWludXModS50aW1lcyhsKSkpKTtyZXR1cm4gSGQobyxzLnByZWNpc2lvbj1uLHMucm91bmRpbmc9ciwhMCl9LHFkLmh5cGVyYm9saWNTaW5lPXFkLnNpbmg9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpPXRoaXMsbz1pLmNvbnN0cnVjdG9yO2lmKCFpLmlzRmluaXRlKCl8fGkuaXNaZXJvKCkpcmV0dXJuIG5ldyBvKGkpO2lmKGU9by5wcmVjaXNpb24sbj1vLnJvdW5kaW5nLG8ucHJlY2lzaW9uPWUrTWF0aC5tYXgoaS5lLGkuc2QoKSkrNCxvLnJvdW5kaW5nPTEsKHI9aS5kLmxlbmd0aCk8MylpPXVnKG8sMixpLGksITApO2Vsc2V7dD0odD0xLjQqTWF0aC5zcXJ0KHIpKT4xNj8xNjowfHQsaT11ZyhvLDIsaT1pLnRpbWVzKDEvY2coNSx0KSksaSwhMCk7Zm9yKHZhciBzLGE9bmV3IG8oNSksdT1uZXcgbygxNiksYz1uZXcgbygyMCk7dC0tOylzPWkudGltZXMoaSksaT1pLnRpbWVzKGEucGx1cyhzLnRpbWVzKHUudGltZXMocykucGx1cyhjKSkpKX1yZXR1cm4gby5wcmVjaXNpb249ZSxvLnJvdW5kaW5nPW4sSGQoaSxlLG4sITApfSxxZC5oeXBlcmJvbGljVGFuZ2VudD1xZC50YW5oPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiBuLmlzRmluaXRlKCk/bi5pc1plcm8oKT9uZXcgcihuKToodD1yLnByZWNpc2lvbixlPXIucm91bmRpbmcsci5wcmVjaXNpb249dCs3LHIucm91bmRpbmc9MSxXZChuLnNpbmgoKSxuLmNvc2goKSxyLnByZWNpc2lvbj10LHIucm91bmRpbmc9ZSkpOm5ldyByKG4ucyl9LHFkLmludmVyc2VDb3NpbmU9cWQuYWNvcz1mdW5jdGlvbigpe3ZhciB0LGU9dGhpcyxuPWUuY29uc3RydWN0b3Iscj1lLmFicygpLmNtcCgxKSxpPW4ucHJlY2lzaW9uLG89bi5yb3VuZGluZztyZXR1cm4tMSE9PXI/MD09PXI/ZS5pc05lZygpP1FkKG4saSxvKTpuZXcgbigwKTpuZXcgbihOYU4pOmUuaXNaZXJvKCk/UWQobixpKzQsbykudGltZXMoLjUpOihuLnByZWNpc2lvbj1pKzYsbi5yb3VuZGluZz0xLGU9ZS5hc2luKCksdD1RZChuLGkrNCxvKS50aW1lcyguNSksbi5wcmVjaXNpb249aSxuLnJvdW5kaW5nPW8sdC5taW51cyhlKSl9LHFkLmludmVyc2VIeXBlcmJvbGljQ29zaW5lPXFkLmFjb3NoPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiBuLmx0ZSgxKT9uZXcgcihuLmVxKDEpPzA6TmFOKTpuLmlzRmluaXRlKCk/KHQ9ci5wcmVjaXNpb24sZT1yLnJvdW5kaW5nLHIucHJlY2lzaW9uPXQrTWF0aC5tYXgoTWF0aC5hYnMobi5lKSxuLnNkKCkpKzQsci5yb3VuZGluZz0xLEFkPSExLG49bi50aW1lcyhuKS5taW51cygxKS5zcXJ0KCkucGx1cyhuKSxBZD0hMCxyLnByZWNpc2lvbj10LHIucm91bmRpbmc9ZSxuLmxuKCkpOm5ldyByKG4pfSxxZC5pbnZlcnNlSHlwZXJib2xpY1NpbmU9cWQuYXNpbmg9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxyPW4uY29uc3RydWN0b3I7cmV0dXJuIW4uaXNGaW5pdGUoKXx8bi5pc1plcm8oKT9uZXcgcihuKToodD1yLnByZWNpc2lvbixlPXIucm91bmRpbmcsci5wcmVjaXNpb249dCsyKk1hdGgubWF4KE1hdGguYWJzKG4uZSksbi5zZCgpKSs2LHIucm91bmRpbmc9MSxBZD0hMSxuPW4udGltZXMobikucGx1cygxKS5zcXJ0KCkucGx1cyhuKSxBZD0hMCxyLnByZWNpc2lvbj10LHIucm91bmRpbmc9ZSxuLmxuKCkpfSxxZC5pbnZlcnNlSHlwZXJib2xpY1RhbmdlbnQ9cWQuYXRhbmg9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpPXRoaXMsbz1pLmNvbnN0cnVjdG9yO3JldHVybiBpLmlzRmluaXRlKCk/aS5lPj0wP25ldyBvKGkuYWJzKCkuZXEoMSk/aS5zLzA6aS5pc1plcm8oKT9pOk5hTik6KHQ9by5wcmVjaXNpb24sZT1vLnJvdW5kaW5nLHI9aS5zZCgpLE1hdGgubWF4KHIsdCk8MiotaS5lLTE/SGQobmV3IG8oaSksdCxlLCEwKTooby5wcmVjaXNpb249bj1yLWkuZSxpPVdkKGkucGx1cygxKSxuZXcgbygxKS5taW51cyhpKSxuK3QsMSksby5wcmVjaXNpb249dCs0LG8ucm91bmRpbmc9MSxpPWkubG4oKSxvLnByZWNpc2lvbj10LG8ucm91bmRpbmc9ZSxpLnRpbWVzKC41KSkpOm5ldyBvKE5hTil9LHFkLmludmVyc2VTaW5lPXFkLmFzaW49ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpPXRoaXMsbz1pLmNvbnN0cnVjdG9yO3JldHVybiBpLmlzWmVybygpP25ldyBvKGkpOihlPWkuYWJzKCkuY21wKDEpLG49by5wcmVjaXNpb24scj1vLnJvdW5kaW5nLC0xIT09ZT8wPT09ZT8oKHQ9UWQobyxuKzQscikudGltZXMoLjUpKS5zPWkucyx0KTpuZXcgbyhOYU4pOihvLnByZWNpc2lvbj1uKzYsby5yb3VuZGluZz0xLGk9aS5kaXYobmV3IG8oMSkubWludXMoaS50aW1lcyhpKSkuc3FydCgpLnBsdXMoMSkpLmF0YW4oKSxvLnByZWNpc2lvbj1uLG8ucm91bmRpbmc9cixpLnRpbWVzKDIpKSl9LHFkLmludmVyc2VUYW5nZW50PXFkLmF0YW49ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpLG8scyxhLHUsYz10aGlzLGw9Yy5jb25zdHJ1Y3RvcixoPWwucHJlY2lzaW9uLGY9bC5yb3VuZGluZztpZihjLmlzRmluaXRlKCkpe2lmKGMuaXNaZXJvKCkpcmV0dXJuIG5ldyBsKGMpO2lmKGMuYWJzKCkuZXEoMSkmJmgrNDw9VWQpcmV0dXJuKHM9UWQobCxoKzQsZikudGltZXMoLjI1KSkucz1jLnMsc31lbHNle2lmKCFjLnMpcmV0dXJuIG5ldyBsKE5hTik7aWYoaCs0PD1VZClyZXR1cm4ocz1RZChsLGgrNCxmKS50aW1lcyguNSkpLnM9Yy5zLHN9Zm9yKGwucHJlY2lzaW9uPWE9aCsxMCxsLnJvdW5kaW5nPTEsdD1uPU1hdGgubWluKDI4LGEvNysyfDApO3Q7LS10KWM9Yy5kaXYoYy50aW1lcyhjKS5wbHVzKDEpLnNxcnQoKS5wbHVzKDEpKTtmb3IoQWQ9ITEsZT1NYXRoLmNlaWwoYS83KSxyPTEsdT1jLnRpbWVzKGMpLHM9bmV3IGwoYyksaT1jOy0xIT09dDspaWYoaT1pLnRpbWVzKHUpLG89cy5taW51cyhpLmRpdihyKz0yKSksaT1pLnRpbWVzKHUpLHZvaWQgMCE9PShzPW8ucGx1cyhpLmRpdihyKz0yKSkpLmRbZV0pZm9yKHQ9ZTtzLmRbdF09PT1vLmRbdF0mJnQtLTspO3JldHVybiBuJiYocz1zLnRpbWVzKDI8PG4tMSkpLEFkPSEwLEhkKHMsbC5wcmVjaXNpb249aCxsLnJvdW5kaW5nPWYsITApfSxxZC5pc0Zpbml0ZT1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5kfSxxZC5pc0ludGVnZXI9cWQuaXNJbnQ9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuZCYmT2QodGhpcy5lLzcpPnRoaXMuZC5sZW5ndGgtMn0scWQuaXNOYU49ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5zfSxxZC5pc05lZ2F0aXZlPXFkLmlzTmVnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuczwwfSxxZC5pc1Bvc2l0aXZlPXFkLmlzUG9zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucz4wfSxxZC5pc1plcm89ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuZCYmMD09PXRoaXMuZFswXX0scWQubGVzc1RoYW49cWQubHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wKHQpPDB9LHFkLmxlc3NUaGFuT3JFcXVhbFRvPXFkLmx0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXAodCk8MX0scWQubG9nYXJpdGhtPXFkLmxvZz1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYSx1LGM9dGhpcyxsPWMuY29uc3RydWN0b3IsaD1sLnByZWNpc2lvbixmPWwucm91bmRpbmc7aWYobnVsbD09dCl0PW5ldyBsKDEwKSxlPSEwO2Vsc2V7aWYobj0odD1uZXcgbCh0KSkuZCx0LnM8MHx8IW58fCFuWzBdfHx0LmVxKDEpKXJldHVybiBuZXcgbChOYU4pO2U9dC5lcSgxMCl9aWYobj1jLmQsYy5zPDB8fCFufHwhblswXXx8Yy5lcSgxKSlyZXR1cm4gbmV3IGwobiYmIW5bMF0/LTEvMDoxIT1jLnM/TmFOOm4/MDoxLzApO2lmKGUpaWYobi5sZW5ndGg+MSlvPSEwO2Vsc2V7Zm9yKGk9blswXTtpJTEwPT0wOylpLz0xMDtvPTEhPT1pfWlmKEFkPSExLHM9b2coYyxhPWgrNSkscj1lP0pkKGwsYSsxMCk6b2codCxhKSxZZCgodT1XZChzLHIsYSwxKSkuZCxpPWgsZikpZG97aWYocz1vZyhjLGErPTEwKSxyPWU/SmQobCxhKzEwKTpvZyh0LGEpLHU9V2QocyxyLGEsMSksIW8peytWZCh1LmQpLnNsaWNlKGkrMSxpKzE1KSsxPT0xZTE0JiYodT1IZCh1LGgrMSwwKSk7YnJlYWt9fXdoaWxlKFlkKHUuZCxpKz0xMCxmKSk7cmV0dXJuIEFkPSEwLEhkKHUsaCxmKX0scWQubWludXM9cWQuc3ViPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8scyxhLHUsYyxsLGgsZixwPXRoaXMsZD1wLmNvbnN0cnVjdG9yO2lmKHQ9bmV3IGQodCksIXAuZHx8IXQuZClyZXR1cm4gcC5zJiZ0LnM/cC5kP3Qucz0tdC5zOnQ9bmV3IGQodC5kfHxwLnMhPT10LnM/cDpOYU4pOnQ9bmV3IGQoTmFOKSx0O2lmKHAucyE9dC5zKXJldHVybiB0LnM9LXQucyxwLnBsdXModCk7aWYoYz1wLmQsZj10LmQsYT1kLnByZWNpc2lvbix1PWQucm91bmRpbmcsIWNbMF18fCFmWzBdKXtpZihmWzBdKXQucz0tdC5zO2Vsc2V7aWYoIWNbMF0pcmV0dXJuIG5ldyBkKDM9PT11Py0wOjApO3Q9bmV3IGQocCl9cmV0dXJuIEFkP0hkKHQsYSx1KTp0fWlmKG49T2QodC5lLzcpLGw9T2QocC5lLzcpLGM9Yy5zbGljZSgpLG89bC1uKXtmb3IoKGg9bzwwKT8oZT1jLG89LW8scz1mLmxlbmd0aCk6KGU9ZixuPWwscz1jLmxlbmd0aCksbz4ocj1NYXRoLm1heChNYXRoLmNlaWwoYS83KSxzKSsyKSYmKG89cixlLmxlbmd0aD0xKSxlLnJldmVyc2UoKSxyPW87ci0tOyllLnB1c2goMCk7ZS5yZXZlcnNlKCl9ZWxzZXtmb3IoKGg9KHI9Yy5sZW5ndGgpPChzPWYubGVuZ3RoKSkmJihzPXIpLHI9MDtyPHM7cisrKWlmKGNbcl0hPWZbcl0pe2g9Y1tyXTxmW3JdO2JyZWFrfW89MH1mb3IoaCYmKGU9YyxjPWYsZj1lLHQucz0tdC5zKSxzPWMubGVuZ3RoLHI9Zi5sZW5ndGgtcztyPjA7LS1yKWNbcysrXT0wO2ZvcihyPWYubGVuZ3RoO3I+bzspe2lmKGNbLS1yXTxmW3JdKXtmb3IoaT1yO2kmJjA9PT1jWy0taV07KWNbaV09emQtMTstLWNbaV0sY1tyXSs9emR9Y1tyXS09ZltyXX1mb3IoOzA9PT1jWy0tc107KWMucG9wKCk7Zm9yKDswPT09Y1swXTtjLnNoaWZ0KCkpLS1uO3JldHVybiBjWzBdPyh0LmQ9Yyx0LmU9S2QoYyxuKSxBZD9IZCh0LGEsdSk6dCk6bmV3IGQoMz09PXU/LTA6MCl9LHFkLm1vZHVsbz1xZC5tb2Q9ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtyZXR1cm4gdD1uZXcgcih0KSwhbi5kfHwhdC5zfHx0LmQmJiF0LmRbMF0/bmV3IHIoTmFOKTohdC5kfHxuLmQmJiFuLmRbMF0/SGQobmV3IHIobiksci5wcmVjaXNpb24sci5yb3VuZGluZyk6KEFkPSExLDk9PXIubW9kdWxvPyhlPVdkKG4sdC5hYnMoKSwwLDMsMSkpLnMqPXQuczplPVdkKG4sdCwwLHIubW9kdWxvLDEpLGU9ZS50aW1lcyh0KSxBZD0hMCxuLm1pbnVzKGUpKX0scWQubmF0dXJhbEV4cG9uZW50aWFsPXFkLmV4cD1mdW5jdGlvbigpe3JldHVybiBpZyh0aGlzKX0scWQubmF0dXJhbExvZ2FyaXRobT1xZC5sbj1mdW5jdGlvbigpe3JldHVybiBvZyh0aGlzKX0scWQubmVnYXRlZD1xZC5uZWc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKTtyZXR1cm4gdC5zPS10LnMsSGQodCl9LHFkLnBsdXM9cWQuYWRkPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8scyxhLHUsYyxsLGg9dGhpcyxmPWguY29uc3RydWN0b3I7aWYodD1uZXcgZih0KSwhaC5kfHwhdC5kKXJldHVybiBoLnMmJnQucz9oLmR8fCh0PW5ldyBmKHQuZHx8aC5zPT09dC5zP2g6TmFOKSk6dD1uZXcgZihOYU4pLHQ7aWYoaC5zIT10LnMpcmV0dXJuIHQucz0tdC5zLGgubWludXModCk7aWYoYz1oLmQsbD10LmQsYT1mLnByZWNpc2lvbix1PWYucm91bmRpbmcsIWNbMF18fCFsWzBdKXJldHVybiBsWzBdfHwodD1uZXcgZihoKSksQWQ/SGQodCxhLHUpOnQ7aWYobz1PZChoLmUvNykscj1PZCh0LmUvNyksYz1jLnNsaWNlKCksaT1vLXIpe2ZvcihpPDA/KG49YyxpPS1pLHM9bC5sZW5ndGgpOihuPWwscj1vLHM9Yy5sZW5ndGgpLGk+KHM9KG89TWF0aC5jZWlsKGEvNykpPnM/bysxOnMrMSkmJihpPXMsbi5sZW5ndGg9MSksbi5yZXZlcnNlKCk7aS0tOyluLnB1c2goMCk7bi5yZXZlcnNlKCl9Zm9yKChzPWMubGVuZ3RoKS0oaT1sLmxlbmd0aCk8MCYmKGk9cyxuPWwsbD1jLGM9biksZT0wO2k7KWU9KGNbLS1pXT1jW2ldK2xbaV0rZSkvemR8MCxjW2ldJT16ZDtmb3IoZSYmKGMudW5zaGlmdChlKSwrK3IpLHM9Yy5sZW5ndGg7MD09Y1stLXNdOyljLnBvcCgpO3JldHVybiB0LmQ9Yyx0LmU9S2QoYyxyKSxBZD9IZCh0LGEsdSk6dH0scWQucHJlY2lzaW9uPXFkLnNkPWZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcztpZih2b2lkIDAhPT10JiZ0IT09ISF0JiYxIT09dCYmMCE9PXQpdGhyb3cgRXJyb3IoSWQrdCk7cmV0dXJuIG4uZD8oZT0kZChuLmQpLHQmJm4uZSsxPmUmJihlPW4uZSsxKSk6ZT1OYU4sZX0scWQucm91bmQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5jb25zdHJ1Y3RvcjtyZXR1cm4gSGQobmV3IGUodCksdC5lKzEsZS5yb3VuZGluZyl9LHFkLnNpbmU9cWQuc2luPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiBuLmlzRmluaXRlKCk/bi5pc1plcm8oKT9uZXcgcihuKToodD1yLnByZWNpc2lvbixlPXIucm91bmRpbmcsci5wcmVjaXNpb249dCtNYXRoLm1heChuLmUsbi5zZCgpKSs3LHIucm91bmRpbmc9MSxuPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1lLmQubGVuZ3RoO2lmKHI8MylyZXR1cm4gZS5pc1plcm8oKT9lOnVnKHQsMixlLGUpO249MS40Kk1hdGguc3FydChyKSxuPW4+MTY/MTY6MHxuLGU9ZS50aW1lcygxL2NnKDUsbikpLGU9dWcodCwyLGUsZSk7Zm9yKHZhciBpLG89bmV3IHQoNSkscz1uZXcgdCgxNiksYT1uZXcgdCgyMCk7bi0tOylpPWUudGltZXMoZSksZT1lLnRpbWVzKG8ucGx1cyhpLnRpbWVzKHMudGltZXMoaSkubWludXMoYSkpKSk7cmV0dXJuIGV9KHIsbGcocixuKSksci5wcmVjaXNpb249dCxyLnJvdW5kaW5nPWUsSGQoeGQ+Mj9uLm5lZygpOm4sdCxlLCEwKSk6bmV3IHIoTmFOKX0scWQuc3F1YXJlUm9vdD1xZC5zcXJ0PWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaSxvLHM9dGhpcyxhPXMuZCx1PXMuZSxjPXMucyxsPXMuY29uc3RydWN0b3I7aWYoMSE9PWN8fCFhfHwhYVswXSlyZXR1cm4gbmV3IGwoIWN8fGM8MCYmKCFhfHxhWzBdKT9OYU46YT9zOjEvMCk7Zm9yKEFkPSExLDA9PShjPU1hdGguc3FydCgrcykpfHxjPT0xLzA/KCgoZT1WZChhKSkubGVuZ3RoK3UpJTI9PTAmJihlKz0iMCIpLGM9TWF0aC5zcXJ0KGUpLHU9T2QoKHUrMSkvMiktKHU8MHx8dSUyKSxjPT0xLzA/ZT0iNWUiK3U6ZT0oZT1jLnRvRXhwb25lbnRpYWwoKSkuc2xpY2UoMCxlLmluZGV4T2YoImUiKSsxKSt1LHI9bmV3IGwoZSkpOnI9bmV3IGwoYy50b1N0cmluZygpKSxuPSh1PWwucHJlY2lzaW9uKSszOzspaWYocj0obz1yKS5wbHVzKFdkKHMsbyxuKzIsMSkpLnRpbWVzKC41KSxWZChvLmQpLnNsaWNlKDAsbik9PT0oZT1WZChyLmQpKS5zbGljZSgwLG4pKXtpZigiOTk5OSIhPShlPWUuc2xpY2Uobi0zLG4rMSkpJiYoaXx8IjQ5OTkiIT1lKSl7KCErZXx8IStlLnNsaWNlKDEpJiYiNSI9PWUuY2hhckF0KDApKSYmKEhkKHIsdSsxLDEpLHQ9IXIudGltZXMocikuZXEocykpO2JyZWFrfWlmKCFpJiYoSGQobyx1KzEsMCksby50aW1lcyhvKS5lcShzKSkpe3I9bzticmVha31uKz00LGk9MX1yZXR1cm4gQWQ9ITAsSGQocix1LGwucm91bmRpbmcsdCl9LHFkLnRhbmdlbnQ9cWQudGFuPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiBuLmlzRmluaXRlKCk/bi5pc1plcm8oKT9uZXcgcihuKToodD1yLnByZWNpc2lvbixlPXIucm91bmRpbmcsci5wcmVjaXNpb249dCsxMCxyLnJvdW5kaW5nPTEsKG49bi5zaW4oKSkucz0xLG49V2QobixuZXcgcigxKS5taW51cyhuLnRpbWVzKG4pKS5zcXJ0KCksdCsxMCwwKSxyLnByZWNpc2lvbj10LHIucm91bmRpbmc9ZSxIZCgyPT14ZHx8ND09eGQ/bi5uZWcoKTpuLHQsZSwhMCkpOm5ldyByKE5hTil9LHFkLnRpbWVzPXFkLm11bD1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYSx1LGMsbD10aGlzLGg9bC5jb25zdHJ1Y3RvcixmPWwuZCxwPSh0PW5ldyBoKHQpKS5kO2lmKHQucyo9bC5zLCEoZiYmZlswXSYmcCYmcFswXSkpcmV0dXJuIG5ldyBoKCF0LnN8fGYmJiFmWzBdJiYhcHx8cCYmIXBbMF0mJiFmP05hTjpmJiZwPzAqdC5zOnQucy8wKTtmb3Iobj1PZChsLmUvNykrT2QodC5lLzcpLCh1PWYubGVuZ3RoKTwoYz1wLmxlbmd0aCkmJihvPWYsZj1wLHA9byxzPXUsdT1jLGM9cyksbz1bXSxyPXM9dStjO3ItLTspby5wdXNoKDApO2ZvcihyPWM7LS1yPj0wOyl7Zm9yKGU9MCxpPXUrcjtpPnI7KWE9b1tpXStwW3JdKmZbaS1yLTFdK2Usb1tpLS1dPWElemR8MCxlPWEvemR8MDtvW2ldPShvW2ldK2UpJXpkfDB9Zm9yKDshb1stLXNdOylvLnBvcCgpO3JldHVybiBlPysrbjpvLnNoaWZ0KCksdC5kPW8sdC5lPUtkKG8sbiksQWQ/SGQodCxoLnByZWNpc2lvbixoLnJvdW5kaW5nKTp0fSxxZC50b0JpbmFyeT1mdW5jdGlvbih0LGUpe3JldHVybiBoZyh0aGlzLDIsdCxlKX0scWQudG9EZWNpbWFsUGxhY2VzPXFkLnRvRFA9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtyZXR1cm4gbj1uZXcgcihuKSx2b2lkIDA9PT10P246KEdkKHQsMCxiZCksdm9pZCAwPT09ZT9lPXIucm91bmRpbmc6R2QoZSwwLDgpLEhkKG4sdCtuLmUrMSxlKSl9LHFkLnRvRXhwb25lbnRpYWw9ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXMsaT1yLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT10P249WmQociwhMCk6KEdkKHQsMCxiZCksdm9pZCAwPT09ZT9lPWkucm91bmRpbmc6R2QoZSwwLDgpLG49WmQocj1IZChuZXcgaShyKSx0KzEsZSksITAsdCsxKSksci5pc05lZygpJiYhci5pc1plcm8oKT8iLSIrbjpufSxxZC50b0ZpeGVkPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXRoaXMsbz1pLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT10P249WmQoaSk6KEdkKHQsMCxiZCksdm9pZCAwPT09ZT9lPW8ucm91bmRpbmc6R2QoZSwwLDgpLG49WmQocj1IZChuZXcgbyhpKSx0K2kuZSsxLGUpLCExLHQrci5lKzEpKSxpLmlzTmVnKCkmJiFpLmlzWmVybygpPyItIituOm59LHFkLnRvRnJhY3Rpb249ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxzLGEsdSxjLGwsaCxmLHA9dGhpcyxkPXAuZCxnPXAuY29uc3RydWN0b3I7aWYoIWQpcmV0dXJuIG5ldyBnKHApO2lmKGM9bj1uZXcgZygxKSxyPXU9bmV3IGcoMCkscz0obz0oZT1uZXcgZyhyKSkuZT0kZChkKS1wLmUtMSklNyxlLmRbMF09TGQoMTAsczwwPzcrczpzKSxudWxsPT10KXQ9bz4wP2U6YztlbHNle2lmKCEoYT1uZXcgZyh0KSkuaXNJbnQoKXx8YS5sdChjKSl0aHJvdyBFcnJvcihJZCthKTt0PWEuZ3QoZSk/bz4wP2U6YzphfWZvcihBZD0hMSxhPW5ldyBnKFZkKGQpKSxsPWcucHJlY2lzaW9uLGcucHJlY2lzaW9uPW89NypkLmxlbmd0aCoyO2g9V2QoYSxlLDAsMSwxKSwxIT0oaT1uLnBsdXMoaC50aW1lcyhyKSkpLmNtcCh0KTspbj1yLHI9aSxpPWMsYz11LnBsdXMoaC50aW1lcyhpKSksdT1pLGk9ZSxlPWEubWludXMoaC50aW1lcyhpKSksYT1pO3JldHVybiBpPVdkKHQubWludXMobiksciwwLDEsMSksdT11LnBsdXMoaS50aW1lcyhjKSksbj1uLnBsdXMoaS50aW1lcyhyKSksdS5zPWMucz1wLnMsZj1XZChjLHIsbywxKS5taW51cyhwKS5hYnMoKS5jbXAoV2QodSxuLG8sMSkubWludXMocCkuYWJzKCkpPDE/W2Mscl06W3Usbl0sZy5wcmVjaXNpb249bCxBZD0hMCxmfSxxZC50b0hleGFkZWNpbWFsPXFkLnRvSGV4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGhnKHRoaXMsMTYsdCxlKX0scWQudG9OZWFyZXN0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPW4uY29uc3RydWN0b3I7aWYobj1uZXcgcihuKSxudWxsPT10KXtpZighbi5kKXJldHVybiBuO3Q9bmV3IHIoMSksZT1yLnJvdW5kaW5nfWVsc2V7aWYodD1uZXcgcih0KSx2b2lkIDA9PT1lP2U9ci5yb3VuZGluZzpHZChlLDAsOCksIW4uZClyZXR1cm4gdC5zP246dDtpZighdC5kKXJldHVybiB0LnMmJih0LnM9bi5zKSx0fXJldHVybiB0LmRbMF0/KEFkPSExLG49V2Qobix0LDAsZSwxKS50aW1lcyh0KSxBZD0hMCxIZChuKSk6KHQucz1uLnMsbj10KSxufSxxZC50b051bWJlcj1mdW5jdGlvbigpe3JldHVybit0aGlzfSxxZC50b09jdGFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGhnKHRoaXMsOCx0LGUpfSxxZC50b1Bvd2VyPXFkLnBvdz1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYT10aGlzLHU9YS5jb25zdHJ1Y3RvcixjPSsodD1uZXcgdSh0KSk7aWYoIShhLmQmJnQuZCYmYS5kWzBdJiZ0LmRbMF0pKXJldHVybiBuZXcgdShMZCgrYSxjKSk7aWYoKGE9bmV3IHUoYSkpLmVxKDEpKXJldHVybiBhO2lmKHI9dS5wcmVjaXNpb24sbz11LnJvdW5kaW5nLHQuZXEoMSkpcmV0dXJuIEhkKGEscixvKTtpZigoZT1PZCh0LmUvNykpPj10LmQubGVuZ3RoLTEmJihuPWM8MD8tYzpjKTw9OTAwNzE5OTI1NDc0MDk5MSlyZXR1cm4gaT1lZyh1LGEsbixyKSx0LnM8MD9uZXcgdSgxKS5kaXYoaSk6SGQoaSxyLG8pO2lmKChzPWEucyk8MCl7aWYoZTx0LmQubGVuZ3RoLTEpcmV0dXJuIG5ldyB1KE5hTik7aWYoISgxJnQuZFtlXSkmJihzPTEpLDA9PWEuZSYmMT09YS5kWzBdJiYxPT1hLmQubGVuZ3RoKXJldHVybiBhLnM9cyxhfXJldHVybihlPTAhPShuPUxkKCthLGMpKSYmaXNGaW5pdGUobik/bmV3IHUobisiIikuZTpPZChjKihNYXRoLmxvZygiMC4iK1ZkKGEuZCkpL01hdGguTE4xMCthLmUrMSkpKT51Lm1heEUrMXx8ZTx1Lm1pbkUtMT9uZXcgdShlPjA/cy8wOjApOihBZD0hMSx1LnJvdW5kaW5nPWEucz0xLG49TWF0aC5taW4oMTIsKGUrIiIpLmxlbmd0aCksKGk9aWcodC50aW1lcyhvZyhhLHIrbikpLHIpKS5kJiYoWWQoKGk9SGQoaSxyKzUsMSkpLmQscixvKSYmKGU9cisxMCwrVmQoKGk9SGQoaWcodC50aW1lcyhvZyhhLGUrbikpLGUpLGUrNSwxKSkuZCkuc2xpY2UocisxLHIrMTUpKzE9PTFlMTQmJihpPUhkKGkscisxLDApKSkpLGkucz1zLEFkPSEwLHUucm91bmRpbmc9byxIZChpLHIsbykpfSxxZC50b1ByZWNpc2lvbj1mdW5jdGlvbih0LGUpe3ZhciBuLHI9dGhpcyxpPXIuY29uc3RydWN0b3I7cmV0dXJuIHZvaWQgMD09PXQ/bj1aZChyLHIuZTw9aS50b0V4cE5lZ3x8ci5lPj1pLnRvRXhwUG9zKTooR2QodCwxLGJkKSx2b2lkIDA9PT1lP2U9aS5yb3VuZGluZzpHZChlLDAsOCksbj1aZChyPUhkKG5ldyBpKHIpLHQsZSksdDw9ci5lfHxyLmU8PWkudG9FeHBOZWcsdCkpLHIuaXNOZWcoKSYmIXIuaXNaZXJvKCk/Ii0iK246bn0scWQudG9TaWduaWZpY2FudERpZ2l0cz1xZC50b1NEPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09dD8odD1uLnByZWNpc2lvbixlPW4ucm91bmRpbmcpOihHZCh0LDEsYmQpLHZvaWQgMD09PWU/ZT1uLnJvdW5kaW5nOkdkKGUsMCw4KSksSGQobmV3IG4odGhpcyksdCxlKX0scWQudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5jb25zdHJ1Y3RvcixuPVpkKHQsdC5lPD1lLnRvRXhwTmVnfHx0LmU+PWUudG9FeHBQb3MpO3JldHVybiB0LmlzTmVnKCkmJiF0LmlzWmVybygpPyItIituOm59LHFkLnRydW5jYXRlZD1xZC50cnVuYz1mdW5jdGlvbigpe3JldHVybiBIZChuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKSx0aGlzLmUrMSwxKX0scWQudmFsdWVPZj1xZC50b0pTT049ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5jb25zdHJ1Y3RvcixuPVpkKHQsdC5lPD1lLnRvRXhwTmVnfHx0LmU+PWUudG9FeHBQb3MpO3JldHVybiB0LmlzTmVnKCk/Ii0iK246bn07dmFyIFdkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dmFyIHIsaT0wLG89dC5sZW5ndGg7Zm9yKHQ9dC5zbGljZSgpO28tLTspcj10W29dKmUraSx0W29dPXIlbnwwLGk9ci9ufDA7cmV0dXJuIGkmJnQudW5zaGlmdChpKSx0fWZ1bmN0aW9uIGUodCxlLG4scil7dmFyIGksbztpZihuIT1yKW89bj5yPzE6LTE7ZWxzZSBmb3IoaT1vPTA7aTxuO2krKylpZih0W2ldIT1lW2ldKXtvPXRbaV0+ZVtpXT8xOi0xO2JyZWFrfXJldHVybiBvfWZ1bmN0aW9uIG4odCxlLG4scil7Zm9yKHZhciBpPTA7bi0tOyl0W25dLT1pLGk9dFtuXTxlW25dPzE6MCx0W25dPWkqcit0W25dLWVbbl07Zm9yKDshdFswXSYmdC5sZW5ndGg+MTspdC5zaGlmdCgpfXJldHVybiBmdW5jdGlvbihyLGksbyxzLGEsdSl7dmFyIGMsbCxoLGYscCxkLGcseSxtLHYsXyx4LHcsYixELEUsQyxTLEEsTixJPXIuY29uc3RydWN0b3IsTT1yLnM9PWkucz8xOi0xLEY9ci5kLFQ9aS5kO2lmKCEoRiYmRlswXSYmVCYmVFswXSkpcmV0dXJuIG5ldyBJKHIucyYmaS5zJiYoRj8hVHx8RlswXSE9VFswXTpUKT9GJiYwPT1GWzBdfHwhVD8wKk06TS8wOk5hTik7Zm9yKHU/KHA9MSxsPXIuZS1pLmUpOih1PXpkLHA9NyxsPU9kKHIuZS9wKS1PZChpLmUvcCkpLEE9VC5sZW5ndGgsQz1GLmxlbmd0aCx2PShtPW5ldyBJKE0pKS5kPVtdLGg9MDtUW2hdPT0oRltoXXx8MCk7aCsrKTtpZihUW2hdPihGW2hdfHwwKSYmbC0tLG51bGw9PW8/KGI9bz1JLnByZWNpc2lvbixzPUkucm91bmRpbmcpOmI9YT9vKyhyLmUtaS5lKSsxOm8sYjwwKXYucHVzaCgxKSxkPSEwO2Vsc2V7aWYoYj1iL3ArMnwwLGg9MCwxPT1BKXtmb3IoZj0wLFQ9VFswXSxiKys7KGg8Q3x8ZikmJmItLTtoKyspRD1mKnUrKEZbaF18fDApLHZbaF09RC9UfDAsZj1EJVR8MDtkPWZ8fGg8Q31lbHNle2ZvcigoZj11LyhUWzBdKzEpfDApPjEmJihUPXQoVCxmLHUpLEY9dChGLGYsdSksQT1ULmxlbmd0aCxDPUYubGVuZ3RoKSxFPUEseD0oXz1GLnNsaWNlKDAsQSkpLmxlbmd0aDt4PEE7KV9beCsrXT0wOyhOPVQuc2xpY2UoKSkudW5zaGlmdCgwKSxTPVRbMF0sVFsxXT49dS8yJiYrK1M7ZG97Zj0wLChjPWUoVCxfLEEseCkpPDA/KHc9X1swXSxBIT14JiYodz13KnUrKF9bMV18fDApKSwoZj13L1N8MCk+MT8oZj49dSYmKGY9dS0xKSwxPT0oYz1lKGc9dChULGYsdSksXyx5PWcubGVuZ3RoLHg9Xy5sZW5ndGgpKSYmKGYtLSxuKGcsQTx5P046VCx5LHUpKSk6KDA9PWYmJihjPWY9MSksZz1ULnNsaWNlKCkpLCh5PWcubGVuZ3RoKTx4JiZnLnVuc2hpZnQoMCksbihfLGcseCx1KSwtMT09YyYmKChjPWUoVCxfLEEseD1fLmxlbmd0aCkpPDEmJihmKyssbihfLEE8eD9OOlQseCx1KSkpLHg9Xy5sZW5ndGgpOjA9PT1jJiYoZisrLF89WzBdKSx2W2grK109ZixjJiZfWzBdP19beCsrXT1GW0VdfHwwOihfPVtGW0VdXSx4PTEpfXdoaWxlKChFKys8Q3x8dm9pZCAwIT09X1swXSkmJmItLSk7ZD12b2lkIDAhPT1fWzBdfXZbMF18fHYuc2hpZnQoKX1pZigxPT1wKW0uZT1sLF9kPWQ7ZWxzZXtmb3IoaD0xLGY9dlswXTtmPj0xMDtmLz0xMCloKys7bS5lPWgrbCpwLTEsSGQobSxhP28rbS5lKzE6byxzLGQpfXJldHVybiBtfX0oKTtmdW5jdGlvbiBIZCh0LGUsbixyKXt2YXIgaSxvLHMsYSx1LGMsbCxoLGYscD10LmNvbnN0cnVjdG9yO3Q6aWYobnVsbCE9ZSl7aWYoIShoPXQuZCkpcmV0dXJuIHQ7Zm9yKGk9MSxhPWhbMF07YT49MTA7YS89MTApaSsrO2lmKChvPWUtaSk8MClvKz03LHM9ZSx1PShsPWhbZj0wXSkvTGQoMTAsaS1zLTEpJTEwfDA7ZWxzZSBpZigoZj1NYXRoLmNlaWwoKG8rMSkvNykpPj0oYT1oLmxlbmd0aCkpe2lmKCFyKWJyZWFrIHQ7Zm9yKDthKys8PWY7KWgucHVzaCgwKTtsPXU9MCxpPTEscz0obyU9NyktNysxfWVsc2V7Zm9yKGw9YT1oW2ZdLGk9MTthPj0xMDthLz0xMClpKys7dT0ocz0obyU9NyktNytpKTwwPzA6bC9MZCgxMCxpLXMtMSklMTB8MH1pZihyPXJ8fGU8MHx8dm9pZCAwIT09aFtmKzFdfHwoczwwP2w6bCVMZCgxMCxpLXMtMSkpLGM9bjw0Pyh1fHxyKSYmKDA9PW58fG49PSh0LnM8MD8zOjIpKTp1PjV8fDU9PXUmJig0PT1ufHxyfHw2PT1uJiYobz4wP3M+MD9sL0xkKDEwLGktcyk6MDpoW2YtMV0pJTEwJjF8fG49PSh0LnM8MD84OjcpKSxlPDF8fCFoWzBdKXJldHVybiBoLmxlbmd0aD0wLGM/KGUtPXQuZSsxLGhbMF09TGQoMTAsKDctZSU3KSU3KSx0LmU9LWV8fDApOmhbMF09dC5lPTAsdDtpZigwPT1vPyhoLmxlbmd0aD1mLGE9MSxmLS0pOihoLmxlbmd0aD1mKzEsYT1MZCgxMCw3LW8pLGhbZl09cz4wPyhsL0xkKDEwLGktcyklTGQoMTAscyl8MCkqYTowKSxjKWZvcig7Oyl7aWYoMD09Zil7Zm9yKG89MSxzPWhbMF07cz49MTA7cy89MTApbysrO2ZvcihzPWhbMF0rPWEsYT0xO3M+PTEwO3MvPTEwKWErKztvIT1hJiYodC5lKyssaFswXT09emQmJihoWzBdPTEpKTticmVha31pZihoW2ZdKz1hLGhbZl0hPXpkKWJyZWFrO2hbZi0tXT0wLGE9MX1mb3Iobz1oLmxlbmd0aDswPT09aFstLW9dOyloLnBvcCgpfXJldHVybiBBZCYmKHQuZT5wLm1heEU/KHQuZD1udWxsLHQuZT1OYU4pOnQuZTxwLm1pbkUmJih0LmU9MCx0LmQ9WzBdKSksdH1mdW5jdGlvbiBaZCh0LGUsbil7aWYoIXQuaXNGaW5pdGUoKSlyZXR1cm4gc2codCk7dmFyIHIsaT10LmUsbz1WZCh0LmQpLHM9by5sZW5ndGg7cmV0dXJuIGU/KG4mJihyPW4tcyk+MD9vPW8uY2hhckF0KDApKyIuIitvLnNsaWNlKDEpK3RnKHIpOnM+MSYmKG89by5jaGFyQXQoMCkrIi4iK28uc2xpY2UoMSkpLG89bysodC5lPDA/ImUiOiJlKyIpK3QuZSk6aTwwPyhvPSIwLiIrdGcoLWktMSkrbyxuJiYocj1uLXMpPjAmJihvKz10ZyhyKSkpOmk+PXM/KG8rPXRnKGkrMS1zKSxuJiYocj1uLWktMSk+MCYmKG89bysiLiIrdGcocikpKTooKHI9aSsxKTxzJiYobz1vLnNsaWNlKDAscikrIi4iK28uc2xpY2UocikpLG4mJihyPW4tcyk+MCYmKGkrMT09PXMmJihvKz0iLiIpLG8rPXRnKHIpKSksb31mdW5jdGlvbiBLZCh0LGUpe3ZhciBuPXRbMF07Zm9yKGUqPTc7bj49MTA7bi89MTApZSsrO3JldHVybiBlfWZ1bmN0aW9uIEpkKHQsZSxuKXtpZihlPmpkKXRocm93IEFkPSEwLG4mJih0LnByZWNpc2lvbj1uKSxFcnJvcihNZCk7cmV0dXJuIEhkKG5ldyB0KEVkKSxlLDEsITApfWZ1bmN0aW9uIFFkKHQsZSxuKXtpZihlPlVkKXRocm93IEVycm9yKE1kKTtyZXR1cm4gSGQobmV3IHQoQ2QpLGUsbiwhMCl9ZnVuY3Rpb24gJGQodCl7dmFyIGU9dC5sZW5ndGgtMSxuPTcqZSsxO2lmKGU9dFtlXSl7Zm9yKDtlJTEwPT0wO2UvPTEwKW4tLTtmb3IoZT10WzBdO2U+PTEwO2UvPTEwKW4rK31yZXR1cm4gbn1mdW5jdGlvbiB0Zyh0KXtmb3IodmFyIGU9IiI7dC0tOyllKz0iMCI7cmV0dXJuIGV9ZnVuY3Rpb24gZWcodCxlLG4scil7dmFyIGksbz1uZXcgdCgxKSxzPU1hdGguY2VpbChyLzcrNCk7Zm9yKEFkPSExOzspe2lmKG4lMiYmKGZnKChvPW8udGltZXMoZSkpLmQscykmJihpPSEwKSksMD09PShuPU9kKG4vMikpKXtuPW8uZC5sZW5ndGgtMSxpJiYwPT09by5kW25dJiYrK28uZFtuXTticmVha31mZygoZT1lLnRpbWVzKGUpKS5kLHMpfXJldHVybiBBZD0hMCxvfWZ1bmN0aW9uIG5nKHQpe3JldHVybiAxJnQuZFt0LmQubGVuZ3RoLTFdfWZ1bmN0aW9uIHJnKHQsZSxuKXtmb3IodmFyIHIsaT1uZXcgdChlWzBdKSxvPTA7KytvPGUubGVuZ3RoOyl7aWYoIShyPW5ldyB0KGVbb10pKS5zKXtpPXI7YnJlYWt9aVtuXShyKSYmKGk9cil9cmV0dXJuIGl9ZnVuY3Rpb24gaWcodCxlKXt2YXIgbixyLGksbyxzLGEsdSxjPTAsbD0wLGg9MCxmPXQuY29uc3RydWN0b3IscD1mLnJvdW5kaW5nLGQ9Zi5wcmVjaXNpb247aWYoIXQuZHx8IXQuZFswXXx8dC5lPjE3KXJldHVybiBuZXcgZih0LmQ/dC5kWzBdP3QuczwwPzA6MS8wOjE6dC5zP3QuczwwPzA6dDpOYU4pO2ZvcihudWxsPT1lPyhBZD0hMSx1PWQpOnU9ZSxhPW5ldyBmKC4wMzEyNSk7dC5lPi0yOyl0PXQudGltZXMoYSksaCs9NTtmb3IodSs9cj1NYXRoLmxvZyhMZCgyLGgpKS9NYXRoLkxOMTAqMis1fDAsbj1vPXM9bmV3IGYoMSksZi5wcmVjaXNpb249dTs7KXtpZihvPUhkKG8udGltZXModCksdSwxKSxuPW4udGltZXMoKytsKSxWZCgoYT1zLnBsdXMoV2QobyxuLHUsMSkpKS5kKS5zbGljZSgwLHUpPT09VmQocy5kKS5zbGljZSgwLHUpKXtmb3IoaT1oO2ktLTspcz1IZChzLnRpbWVzKHMpLHUsMSk7aWYobnVsbCE9ZSlyZXR1cm4gZi5wcmVjaXNpb249ZCxzO2lmKCEoYzwzJiZZZChzLmQsdS1yLHAsYykpKXJldHVybiBIZChzLGYucHJlY2lzaW9uPWQscCxBZD0hMCk7Zi5wcmVjaXNpb249dSs9MTAsbj1vPWE9bmV3IGYoMSksbD0wLGMrK31zPWF9fWZ1bmN0aW9uIG9nKHQsZSl7dmFyIG4scixpLG8scyxhLHUsYyxsLGgsZixwPTEsZD10LGc9ZC5kLHk9ZC5jb25zdHJ1Y3RvcixtPXkucm91bmRpbmcsdj15LnByZWNpc2lvbjtpZihkLnM8MHx8IWd8fCFnWzBdfHwhZC5lJiYxPT1nWzBdJiYxPT1nLmxlbmd0aClyZXR1cm4gbmV3IHkoZyYmIWdbMF0/LTEvMDoxIT1kLnM/TmFOOmc/MDpkKTtpZihudWxsPT1lPyhBZD0hMSxsPXYpOmw9ZSx5LnByZWNpc2lvbj1sKz0xMCxyPShuPVZkKGcpKS5jaGFyQXQoMCksIShNYXRoLmFicyhvPWQuZSk8MTVlMTQpKXJldHVybiBjPUpkKHksbCsyLHYpLnRpbWVzKG8rIiIpLGQ9b2cobmV3IHkocisiLiIrbi5zbGljZSgxKSksbC0xMCkucGx1cyhjKSx5LnByZWNpc2lvbj12LG51bGw9PWU/SGQoZCx2LG0sQWQ9ITApOmQ7Zm9yKDtyPDcmJjEhPXJ8fDE9PXImJm4uY2hhckF0KDEpPjM7KXI9KG49VmQoKGQ9ZC50aW1lcyh0KSkuZCkpLmNoYXJBdCgwKSxwKys7Zm9yKG89ZC5lLHI+MT8oZD1uZXcgeSgiMC4iK24pLG8rKyk6ZD1uZXcgeShyKyIuIituLnNsaWNlKDEpKSxoPWQsdT1zPWQ9V2QoZC5taW51cygxKSxkLnBsdXMoMSksbCwxKSxmPUhkKGQudGltZXMoZCksbCwxKSxpPTM7Oyl7aWYocz1IZChzLnRpbWVzKGYpLGwsMSksVmQoKGM9dS5wbHVzKFdkKHMsbmV3IHkoaSksbCwxKSkpLmQpLnNsaWNlKDAsbCk9PT1WZCh1LmQpLnNsaWNlKDAsbCkpe2lmKHU9dS50aW1lcygyKSwwIT09byYmKHU9dS5wbHVzKEpkKHksbCsyLHYpLnRpbWVzKG8rIiIpKSksdT1XZCh1LG5ldyB5KHApLGwsMSksbnVsbCE9ZSlyZXR1cm4geS5wcmVjaXNpb249dix1O2lmKCFZZCh1LmQsbC0xMCxtLGEpKXJldHVybiBIZCh1LHkucHJlY2lzaW9uPXYsbSxBZD0hMCk7eS5wcmVjaXNpb249bCs9MTAsYz1zPWQ9V2QoaC5taW51cygxKSxoLnBsdXMoMSksbCwxKSxmPUhkKGQudGltZXMoZCksbCwxKSxpPWE9MX11PWMsaSs9Mn19ZnVuY3Rpb24gc2codCl7cmV0dXJuIFN0cmluZyh0LnMqdC5zLzApfWZ1bmN0aW9uIGFnKHQsZSl7dmFyIG4scixpO2Zvcigobj1lLmluZGV4T2YoIi4iKSk+LTEmJihlPWUucmVwbGFjZSgiLiIsIiIpKSwocj1lLnNlYXJjaCgvZS9pKSk+MD8objwwJiYobj1yKSxuKz0rZS5zbGljZShyKzEpLGU9ZS5zdWJzdHJpbmcoMCxyKSk6bjwwJiYobj1lLmxlbmd0aCkscj0wOzQ4PT09ZS5jaGFyQ29kZUF0KHIpO3IrKyk7Zm9yKGk9ZS5sZW5ndGg7NDg9PT1lLmNoYXJDb2RlQXQoaS0xKTstLWkpO2lmKGU9ZS5zbGljZShyLGkpKXtpZihpLT1yLHQuZT1uPW4tci0xLHQuZD1bXSxyPShuKzEpJTcsbjwwJiYocis9NykscjxpKXtmb3IociYmdC5kLnB1c2goK2Uuc2xpY2UoMCxyKSksaS09NztyPGk7KXQuZC5wdXNoKCtlLnNsaWNlKHIscis9NykpO3I9Ny0oZT1lLnNsaWNlKHIpKS5sZW5ndGh9ZWxzZSByLT1pO2Zvcig7ci0tOyllKz0iMCI7dC5kLnB1c2goK2UpLEFkJiYodC5lPnQuY29uc3RydWN0b3IubWF4RT8odC5kPW51bGwsdC5lPU5hTik6dC5lPHQuY29uc3RydWN0b3IubWluRSYmKHQuZT0wLHQuZD1bMF0pKX1lbHNlIHQuZT0wLHQuZD1bMF07cmV0dXJuIHR9ZnVuY3Rpb24gdWcodCxlLG4scixpKXt2YXIgbyxzLGEsdSxjPXQucHJlY2lzaW9uLGw9TWF0aC5jZWlsKGMvNyk7Zm9yKEFkPSExLHU9bi50aW1lcyhuKSxhPW5ldyB0KHIpOzspe2lmKHM9V2QoYS50aW1lcyh1KSxuZXcgdChlKysqZSsrKSxjLDEpLGE9aT9yLnBsdXMocyk6ci5taW51cyhzKSxyPVdkKHMudGltZXModSksbmV3IHQoZSsrKmUrKyksYywxKSx2b2lkIDAhPT0ocz1hLnBsdXMocikpLmRbbF0pe2ZvcihvPWw7cy5kW29dPT09YS5kW29dJiZvLS07KTtpZigtMT09bylicmVha31vPWEsYT1yLHI9cyxzPW99cmV0dXJuIEFkPSEwLHMuZC5sZW5ndGg9bCsxLHN9ZnVuY3Rpb24gY2codCxlKXtmb3IodmFyIG49dDstLWU7KW4qPXQ7cmV0dXJuIG59ZnVuY3Rpb24gbGcodCxlKXt2YXIgbixyPWUuczwwLGk9UWQodCx0LnByZWNpc2lvbiwxKSxvPWkudGltZXMoLjUpO2lmKChlPWUuYWJzKCkpLmx0ZShvKSlyZXR1cm4geGQ9cj80OjEsZTtpZigobj1lLmRpdlRvSW50KGkpKS5pc1plcm8oKSl4ZD1yPzM6MjtlbHNle2lmKChlPWUubWludXMobi50aW1lcyhpKSkpLmx0ZShvKSlyZXR1cm4geGQ9bmcobik/cj8yOjM6cj80OjEsZTt4ZD1uZyhuKT9yPzE6NDpyPzM6Mn1yZXR1cm4gZS5taW51cyhpKS5hYnMoKX1mdW5jdGlvbiBoZyh0LGUsbixyKXt2YXIgaSxvLHMsYSx1LGMsbCxoLGYscD10LmNvbnN0cnVjdG9yLGQ9dm9pZCAwIT09bjtpZihkPyhHZChuLDEsYmQpLHZvaWQgMD09PXI/cj1wLnJvdW5kaW5nOkdkKHIsMCw4KSk6KG49cC5wcmVjaXNpb24scj1wLnJvdW5kaW5nKSx0LmlzRmluaXRlKCkpe2ZvcihkPyhpPTIsMTY9PWU/bj00Km4tMzo4PT1lJiYobj0zKm4tMikpOmk9ZSwocz0obD1aZCh0KSkuaW5kZXhPZigiLiIpKT49MCYmKGw9bC5yZXBsYWNlKCIuIiwiIiksKGY9bmV3IHAoMSkpLmU9bC5sZW5ndGgtcyxmLmQ9WGQoWmQoZiksMTAsaSksZi5lPWYuZC5sZW5ndGgpLG89dT0oaD1YZChsLDEwLGkpKS5sZW5ndGg7MD09aFstLXVdOyloLnBvcCgpO2lmKGhbMF0pe2lmKHM8MD9vLS06KCh0PW5ldyBwKHQpKS5kPWgsdC5lPW8saD0odD1XZCh0LGYsbixyLDAsaSkpLmQsbz10LmUsYz1fZCkscz1oW25dLGE9aS8yLGM9Y3x8dm9pZCAwIT09aFtuKzFdLGM9cjw0Pyh2b2lkIDAhPT1zfHxjKSYmKDA9PT1yfHxyPT09KHQuczwwPzM6MikpOnM+YXx8cz09PWEmJig0PT09cnx8Y3x8Nj09PXImJjEmaFtuLTFdfHxyPT09KHQuczwwPzg6NykpLGgubGVuZ3RoPW4sYylmb3IoOysraFstLW5dPmktMTspaFtuXT0wLG58fCgrK28saC51bnNoaWZ0KDEpKTtmb3IodT1oLmxlbmd0aDshaFt1LTFdOy0tdSk7Zm9yKHM9MCxsPSIiO3M8dTtzKyspbCs9RGQuY2hhckF0KGhbc10pO2lmKGQpe2lmKHU+MSlpZigxNj09ZXx8OD09ZSl7Zm9yKHM9MTY9PWU/NDozLC0tdTt1JXM7dSsrKWwrPSIwIjtmb3IodT0oaD1YZChsLGksZSkpLmxlbmd0aDshaFt1LTFdOy0tdSk7Zm9yKHM9MSxsPSIxLiI7czx1O3MrKylsKz1EZC5jaGFyQXQoaFtzXSl9ZWxzZSBsPWwuY2hhckF0KDApKyIuIitsLnNsaWNlKDEpO2w9bCsobzwwPyJwIjoicCsiKStvfWVsc2UgaWYobzwwKXtmb3IoOysrbzspbD0iMCIrbDtsPSIwLiIrbH1lbHNlIGlmKCsrbz51KWZvcihvLT11O28tLTspbCs9IjAiO2Vsc2Ugbzx1JiYobD1sLnNsaWNlKDAsbykrIi4iK2wuc2xpY2UobykpfWVsc2UgbD1kPyIwcCswIjoiMCI7bD0oMTY9PWU/IjB4IjoyPT1lPyIwYiI6OD09ZT8iMG8iOiIiKStsfWVsc2UgbD1zZyh0KTtyZXR1cm4gdC5zPDA/Ii0iK2w6bH1mdW5jdGlvbiBmZyh0LGUpe2lmKHQubGVuZ3RoPmUpcmV0dXJuIHQubGVuZ3RoPWUsITB9ZnVuY3Rpb24gcGcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmFicygpfWZ1bmN0aW9uIGRnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5hY29zKCl9ZnVuY3Rpb24gZ2codCl7cmV0dXJuIG5ldyB0aGlzKHQpLmFjb3NoKCl9ZnVuY3Rpb24geWcodCxlKXtyZXR1cm4gbmV3IHRoaXModCkucGx1cyhlKX1mdW5jdGlvbiBtZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuYXNpbigpfWZ1bmN0aW9uIHZnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5hc2luaCgpfWZ1bmN0aW9uIF9nKHQpe3JldHVybiBuZXcgdGhpcyh0KS5hdGFuKCl9ZnVuY3Rpb24geGcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmF0YW5oKCl9ZnVuY3Rpb24gd2codCxlKXt0PW5ldyB0aGlzKHQpLGU9bmV3IHRoaXMoZSk7dmFyIG4scj10aGlzLnByZWNpc2lvbixpPXRoaXMucm91bmRpbmcsbz1yKzQ7cmV0dXJuIHQucyYmZS5zP3QuZHx8ZS5kPyFlLmR8fHQuaXNaZXJvKCk/KG49ZS5zPDA/UWQodGhpcyxyLGkpOm5ldyB0aGlzKDApKS5zPXQuczohdC5kfHxlLmlzWmVybygpPyhuPVFkKHRoaXMsbywxKS50aW1lcyguNSkpLnM9dC5zOmUuczwwPyh0aGlzLnByZWNpc2lvbj1vLHRoaXMucm91bmRpbmc9MSxuPXRoaXMuYXRhbihXZCh0LGUsbywxKSksZT1RZCh0aGlzLG8sMSksdGhpcy5wcmVjaXNpb249cix0aGlzLnJvdW5kaW5nPWksbj10LnM8MD9uLm1pbnVzKGUpOm4ucGx1cyhlKSk6bj10aGlzLmF0YW4oV2QodCxlLG8sMSkpOihuPVFkKHRoaXMsbywxKS50aW1lcyhlLnM+MD8uMjU6Ljc1KSkucz10LnM6bj1uZXcgdGhpcyhOYU4pLG59ZnVuY3Rpb24gYmcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmNicnQoKX1mdW5jdGlvbiBEZyh0KXtyZXR1cm4gSGQodD1uZXcgdGhpcyh0KSx0LmUrMSwyKX1mdW5jdGlvbiBFZyh0LGUsbil7cmV0dXJuIG5ldyB0aGlzKHQpLmNsYW1wKGUsbil9ZnVuY3Rpb24gQ2codCl7aWYoIXR8fCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBFcnJvcihOZCsiT2JqZWN0IGV4cGVjdGVkIik7dmFyIGUsbixyLGk9ITA9PT10LmRlZmF1bHRzLG89WyJwcmVjaXNpb24iLDEsYmQsInJvdW5kaW5nIiwwLDgsInRvRXhwTmVnIiwtd2QsMCwidG9FeHBQb3MiLDAsd2QsIm1heEUiLDAsd2QsIm1pbkUiLC13ZCwwLCJtb2R1bG8iLDAsOV07Zm9yKGU9MDtlPG8ubGVuZ3RoO2UrPTMpaWYobj1vW2VdLGkmJih0aGlzW25dPVNkW25dKSx2b2lkIDAhPT0ocj10W25dKSl7aWYoIShPZChyKT09PXImJnI+PW9bZSsxXSYmcjw9b1tlKzJdKSl0aHJvdyBFcnJvcihJZCtuKyI6ICIrcik7dGhpc1tuXT1yfWlmKG49ImNyeXB0byIsaSYmKHRoaXNbbl09U2Rbbl0pLHZvaWQgMCE9PShyPXRbbl0pKXtpZighMCE9PXImJiExIT09ciYmMCE9PXImJjEhPT1yKXRocm93IEVycm9yKElkK24rIjogIityKTtpZihyKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGNyeXB0b3x8IWNyeXB0b3x8IWNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJiFjcnlwdG8ucmFuZG9tQnl0ZXMpdGhyb3cgRXJyb3IoRmQpO3RoaXNbbl09ITB9ZWxzZSB0aGlzW25dPSExfXJldHVybiB0aGlzfWZ1bmN0aW9uIFNnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5jb3MoKX1mdW5jdGlvbiBBZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuY29zaCgpfWZ1bmN0aW9uIE5nKHQsZSl7cmV0dXJuIG5ldyB0aGlzKHQpLmRpdihlKX1mdW5jdGlvbiBJZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuZXhwKCl9ZnVuY3Rpb24gTWcodCl7cmV0dXJuIEhkKHQ9bmV3IHRoaXModCksdC5lKzEsMyl9ZnVuY3Rpb24gRmcoKXt2YXIgdCxlLG49bmV3IHRoaXMoMCk7Zm9yKEFkPSExLHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7KWlmKChlPW5ldyB0aGlzKGFyZ3VtZW50c1t0KytdKSkuZCluLmQmJihuPW4ucGx1cyhlLnRpbWVzKGUpKSk7ZWxzZXtpZihlLnMpcmV0dXJuIEFkPSEwLG5ldyB0aGlzKDEvMCk7bj1lfXJldHVybiBBZD0hMCxuLnNxcnQoKX1mdW5jdGlvbiBUZyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mICRnfHx0JiZ0LnRvU3RyaW5nVGFnPT09VGR8fCExfWZ1bmN0aW9uIE9nKHQpe3JldHVybiBuZXcgdGhpcyh0KS5sbigpfWZ1bmN0aW9uIExnKHQsZSl7cmV0dXJuIG5ldyB0aGlzKHQpLmxvZyhlKX1mdW5jdGlvbiBQZyh0KXtyZXR1cm4gbmV3IHRoaXModCkubG9nKDIpfWZ1bmN0aW9uIFJnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5sb2coMTApfWZ1bmN0aW9uIEJnKCl7cmV0dXJuIHJnKHRoaXMsYXJndW1lbnRzLCJsdCIpfWZ1bmN0aW9uIGtnKCl7cmV0dXJuIHJnKHRoaXMsYXJndW1lbnRzLCJndCIpfWZ1bmN0aW9uIHpnKHQsZSl7cmV0dXJuIG5ldyB0aGlzKHQpLm1vZChlKX1mdW5jdGlvbiBqZyh0LGUpe3JldHVybiBuZXcgdGhpcyh0KS5tdWwoZSl9ZnVuY3Rpb24gVWcodCxlKXtyZXR1cm4gbmV3IHRoaXModCkucG93KGUpfWZ1bmN0aW9uIHFnKHQpe3ZhciBlLG4scixpLG89MCxzPW5ldyB0aGlzKDEpLGE9W107aWYodm9pZCAwPT09dD90PXRoaXMucHJlY2lzaW9uOkdkKHQsMSxiZCkscj1NYXRoLmNlaWwodC83KSx0aGlzLmNyeXB0bylpZihjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKWZvcihlPWNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KHIpKTtvPHI7KShpPWVbb10pPj00MjllNz9lW29dPWNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KDEpKVswXTphW28rK109aSUxZTc7ZWxzZXtpZighY3J5cHRvLnJhbmRvbUJ5dGVzKXRocm93IEVycm9yKEZkKTtmb3IoZT1jcnlwdG8ucmFuZG9tQnl0ZXMocio9NCk7bzxyOykoaT1lW29dKyhlW28rMV08PDgpKyhlW28rMl08PDE2KSsoKDEyNyZlW28rM10pPDwyNCkpPj0yMTRlNz9jcnlwdG8ucmFuZG9tQnl0ZXMoNCkuY29weShlLG8pOihhLnB1c2goaSUxZTcpLG8rPTQpO289ci80fWVsc2UgZm9yKDtvPHI7KWFbbysrXT0xZTcqTWF0aC5yYW5kb20oKXwwO2Zvcih0JT03LChyPWFbLS1vXSkmJnQmJihpPUxkKDEwLDctdCksYVtvXT0oci9pfDApKmkpOzA9PT1hW29dO28tLSlhLnBvcCgpO2lmKG88MCluPTAsYT1bMF07ZWxzZXtmb3Iobj0tMTswPT09YVswXTtuLT03KWEuc2hpZnQoKTtmb3Iocj0xLGk9YVswXTtpPj0xMDtpLz0xMClyKys7cjw3JiYobi09Ny1yKX1yZXR1cm4gcy5lPW4scy5kPWEsc31mdW5jdGlvbiBWZyh0KXtyZXR1cm4gSGQodD1uZXcgdGhpcyh0KSx0LmUrMSx0aGlzLnJvdW5kaW5nKX1mdW5jdGlvbiBHZyh0KXtyZXR1cm4odD1uZXcgdGhpcyh0KSkuZD90LmRbMF0/dC5zOjAqdC5zOnQuc3x8TmFOfWZ1bmN0aW9uIFlnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5zaW4oKX1mdW5jdGlvbiBYZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuc2luaCgpfWZ1bmN0aW9uIFdnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5zcXJ0KCl9ZnVuY3Rpb24gSGcodCxlKXtyZXR1cm4gbmV3IHRoaXModCkuc3ViKGUpfWZ1bmN0aW9uIFpnKCl7dmFyIHQ9MCxlPWFyZ3VtZW50cyxuPW5ldyB0aGlzKGVbdF0pO2ZvcihBZD0hMTtuLnMmJisrdDxlLmxlbmd0aDspbj1uLnBsdXMoZVt0XSk7cmV0dXJuIEFkPSEwLEhkKG4sdGhpcy5wcmVjaXNpb24sdGhpcy5yb3VuZGluZyl9ZnVuY3Rpb24gS2codCl7cmV0dXJuIG5ldyB0aGlzKHQpLnRhbigpfWZ1bmN0aW9uIEpnKHQpe3JldHVybiBuZXcgdGhpcyh0KS50YW5oKCl9ZnVuY3Rpb24gUWcodCl7cmV0dXJuIEhkKHQ9bmV3IHRoaXModCksdC5lKzEsMSl9cWRbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV09cWQudG9TdHJpbmcscWRbU3ltYm9sLnRvU3RyaW5nVGFnXT0iRGVjaW1hbCI7dmFyICRnPXFkLmNvbnN0cnVjdG9yPWZ1bmN0aW9uIHQoZSl7dmFyIG4scixpO2Z1bmN0aW9uIG8odCl7dmFyIGUsbixyLGk9dGhpcztpZighKGkgaW5zdGFuY2VvZiBvKSlyZXR1cm4gbmV3IG8odCk7aWYoaS5jb25zdHJ1Y3Rvcj1vLFRnKHQpKXJldHVybiBpLnM9dC5zLHZvaWQoQWQ/IXQuZHx8dC5lPm8ubWF4RT8oaS5lPU5hTixpLmQ9bnVsbCk6dC5lPG8ubWluRT8oaS5lPTAsaS5kPVswXSk6KGkuZT10LmUsaS5kPXQuZC5zbGljZSgpKTooaS5lPXQuZSxpLmQ9dC5kP3QuZC5zbGljZSgpOnQuZCkpO2lmKCJudW1iZXIiPT09KHI9dHlwZW9mIHQpKXtpZigwPT09dClyZXR1cm4gaS5zPTEvdDwwPy0xOjEsaS5lPTAsdm9pZChpLmQ9WzBdKTtpZih0PDA/KHQ9LXQsaS5zPS0xKTppLnM9MSx0PT09fn50JiZ0PDFlNyl7Zm9yKGU9MCxuPXQ7bj49MTA7bi89MTApZSsrO3JldHVybiB2b2lkKEFkP2U+by5tYXhFPyhpLmU9TmFOLGkuZD1udWxsKTplPG8ubWluRT8oaS5lPTAsaS5kPVswXSk6KGkuZT1lLGkuZD1bdF0pOihpLmU9ZSxpLmQ9W3RdKSl9cmV0dXJuIDAqdCE9MD8odHx8KGkucz1OYU4pLGkuZT1OYU4sdm9pZChpLmQ9bnVsbCkpOmFnKGksdC50b1N0cmluZygpKX1pZigic3RyaW5nIiE9PXIpdGhyb3cgRXJyb3IoSWQrdCk7cmV0dXJuIDQ1PT09KG49dC5jaGFyQ29kZUF0KDApKT8odD10LnNsaWNlKDEpLGkucz0tMSk6KDQzPT09biYmKHQ9dC5zbGljZSgxKSksaS5zPTEpLGtkLnRlc3QodCk/YWcoaSx0KTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsaSxvLHMsYSx1LGMsbDtpZihlLmluZGV4T2YoIl8iKT4tMSl7aWYoZT1lLnJlcGxhY2UoLyhcZClfKD89XGQpL2csIiQxIiksa2QudGVzdChlKSlyZXR1cm4gYWcodCxlKX1lbHNlIGlmKCJJbmZpbml0eSI9PT1lfHwiTmFOIj09PWUpcmV0dXJuK2V8fCh0LnM9TmFOKSx0LmU9TmFOLHQuZD1udWxsLHQ7aWYoUmQudGVzdChlKSluPTE2LGU9ZS50b0xvd2VyQ2FzZSgpO2Vsc2UgaWYoUGQudGVzdChlKSluPTI7ZWxzZXtpZighQmQudGVzdChlKSl0aHJvdyBFcnJvcihJZCtlKTtuPTh9Zm9yKChvPWUuc2VhcmNoKC9wL2kpKT4wPyh1PStlLnNsaWNlKG8rMSksZT1lLnN1YnN0cmluZygyLG8pKTplPWUuc2xpY2UoMikscz0obz1lLmluZGV4T2YoIi4iKSk+PTAscj10LmNvbnN0cnVjdG9yLHMmJihvPShhPShlPWUucmVwbGFjZSgiLiIsIiIpKS5sZW5ndGgpLW8saT1lZyhyLG5ldyByKG4pLG8sMipvKSksbz1sPShjPVhkKGUsbix6ZCkpLmxlbmd0aC0xOzA9PT1jW29dOy0tbyljLnBvcCgpO3JldHVybiBvPDA/bmV3IHIoMCp0LnMpOih0LmU9S2QoYyxsKSx0LmQ9YyxBZD0hMSxzJiYodD1XZCh0LGksNCphKSksdSYmKHQ9dC50aW1lcyhNYXRoLmFicyh1KTw1ND9MZCgyLHUpOiRnLnBvdygyLHUpKSksQWQ9ITAsdCl9KGksdCl9aWYoby5wcm90b3R5cGU9cWQsby5ST1VORF9VUD0wLG8uUk9VTkRfRE9XTj0xLG8uUk9VTkRfQ0VJTD0yLG8uUk9VTkRfRkxPT1I9MyxvLlJPVU5EX0hBTEZfVVA9NCxvLlJPVU5EX0hBTEZfRE9XTj01LG8uUk9VTkRfSEFMRl9FVkVOPTYsby5ST1VORF9IQUxGX0NFSUw9NyxvLlJPVU5EX0hBTEZfRkxPT1I9OCxvLkVVQ0xJRD05LG8uY29uZmlnPW8uc2V0PUNnLG8uY2xvbmU9dCxvLmlzRGVjaW1hbD1UZyxvLmFicz1wZyxvLmFjb3M9ZGcsby5hY29zaD1nZyxvLmFkZD15ZyxvLmFzaW49bWcsby5hc2luaD12ZyxvLmF0YW49X2csby5hdGFuaD14ZyxvLmF0YW4yPXdnLG8uY2JydD1iZyxvLmNlaWw9RGcsby5jbGFtcD1FZyxvLmNvcz1TZyxvLmNvc2g9QWcsby5kaXY9Tmcsby5leHA9SWcsby5mbG9vcj1NZyxvLmh5cG90PUZnLG8ubG49T2csby5sb2c9TGcsby5sb2cxMD1SZyxvLmxvZzI9UGcsby5tYXg9Qmcsby5taW49a2csby5tb2Q9emcsby5tdWw9amcsby5wb3c9VWcsby5yYW5kb209cWcsby5yb3VuZD1WZyxvLnNpZ249R2csby5zaW49WWcsby5zaW5oPVhnLG8uc3FydD1XZyxvLnN1Yj1IZyxvLnN1bT1aZyxvLnRhbj1LZyxvLnRhbmg9Smcsby50cnVuYz1RZyx2b2lkIDA9PT1lJiYoZT17fSksZSYmITAhPT1lLmRlZmF1bHRzKWZvcihpPVsicHJlY2lzaW9uIiwicm91bmRpbmciLCJ0b0V4cE5lZyIsInRvRXhwUG9zIiwibWF4RSIsIm1pbkUiLCJtb2R1bG8iLCJjcnlwdG8iXSxuPTA7bjxpLmxlbmd0aDspZS5oYXNPd25Qcm9wZXJ0eShyPWlbbisrXSl8fChlW3JdPXRoaXNbcl0pO3JldHVybiBvLmNvbmZpZyhlKSxvfShTZCk7RWQ9bmV3ICRnKEVkKSxDZD1uZXcgJGcoQ2QpO3ZhciB0eT1pZCgiQmlnTnVtYmVyIixbIj9vbiIsImNvbmZpZyJdLCh0PT57dmFye29uOmUsY29uZmlnOm59PXQscj0kZy5jbG9uZSh7cHJlY2lzaW9uOm4ucHJlY2lzaW9uLG1vZHVsbzokZy5FVUNMSUR9KTtyZXR1cm4gci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSksci5wcm90b3R5cGUudHlwZT0iQmlnTnVtYmVyIixyLnByb3RvdHlwZS5pc0JpZ051bWJlcj0hMCxyLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJCaWdOdW1iZXIiLHZhbHVlOnRoaXMudG9TdHJpbmcoKX19LHIuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyByKHQudmFsdWUpfSxlJiZlKCJjb25maWciLChmdW5jdGlvbih0LGUpe3QucHJlY2lzaW9uIT09ZS5wcmVjaXNpb24mJnIuY29uZmlnKHtwcmVjaXNpb246dC5wcmVjaXNpb259KX0pKSxyfSkse2lzQ2xhc3M6ITB9KSxleT1lZSgoZnVuY3Rpb24odCxlKXshZnVuY3Rpb24oKXt2YXIgZT1NYXRoLmNvc2h8fGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmFicyh0KTwxZS05PzEtdDouNSooTWF0aC5leHAodCkrTWF0aC5leHAoLXQpKX0sbj1NYXRoLnNpbmh8fGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmFicyh0KTwxZS05P3Q6LjUqKE1hdGguZXhwKHQpLU1hdGguZXhwKC10KSl9LHI9ZnVuY3Rpb24oKXt0aHJvdyBTeW50YXhFcnJvcigiSW52YWxpZCBQYXJhbSIpfTtmdW5jdGlvbiBpKHQsZSl7dmFyIG49TWF0aC5hYnModCkscj1NYXRoLmFicyhlKTtyZXR1cm4gMD09PXQ/TWF0aC5sb2cocik6MD09PWU/TWF0aC5sb2cobik6bjwzZTMmJnI8M2UzPy41Kk1hdGgubG9nKHQqdCtlKmUpOih0Lz0yLGUvPTIsLjUqTWF0aC5sb2codCp0K2UqZSkrTWF0aC5MTjIpfWZ1bmN0aW9uIG8odCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBvKSlyZXR1cm4gbmV3IG8odCxlKTt2YXIgbj1mdW5jdGlvbih0LGUpe3ZhciBuPXtyZTowLGltOjB9O2lmKG51bGw9PXQpbi5yZT1uLmltPTA7ZWxzZSBpZih2b2lkIDAhPT1lKW4ucmU9dCxuLmltPWU7ZWxzZSBzd2l0Y2godHlwZW9mIHQpe2Nhc2Uib2JqZWN0IjppZigiaW0iaW4gdCYmInJlImluIHQpbi5yZT10LnJlLG4uaW09dC5pbTtlbHNlIGlmKCJhYnMiaW4gdCYmImFyZyJpbiB0KXtpZighTnVtYmVyLmlzRmluaXRlKHQuYWJzKSYmTnVtYmVyLmlzRmluaXRlKHQuYXJnKSlyZXR1cm4gby5JTkZJTklUWTtuLnJlPXQuYWJzKk1hdGguY29zKHQuYXJnKSxuLmltPXQuYWJzKk1hdGguc2luKHQuYXJnKX1lbHNlIGlmKCJyImluIHQmJiJwaGkiaW4gdCl7aWYoIU51bWJlci5pc0Zpbml0ZSh0LnIpJiZOdW1iZXIuaXNGaW5pdGUodC5waGkpKXJldHVybiBvLklORklOSVRZO24ucmU9dC5yKk1hdGguY29zKHQucGhpKSxuLmltPXQucipNYXRoLnNpbih0LnBoaSl9ZWxzZSAyPT09dC5sZW5ndGg/KG4ucmU9dFswXSxuLmltPXRbMV0pOnIoKTticmVhaztjYXNlInN0cmluZyI6bi5pbT1uLnJlPTA7dmFyIGk9dC5tYXRjaCgvXGQrXC4/XGQqZVsrLV0/XGQrfFxkK1wuP1xkKnxcLlxkK3wuL2cpLHM9MSxhPTA7bnVsbD09PWkmJnIoKTtmb3IodmFyIHU9MDt1PGkubGVuZ3RoO3UrKyl7dmFyIGM9aVt1XTsiICI9PT1jfHwiXHQiPT09Y3x8IlxuIj09PWN8fCgiKyI9PT1jP3MrKzoiLSI9PT1jP2ErKzoiaSI9PT1jfHwiSSI9PT1jPyhzK2E9PT0wJiZyKCksIiAiPT09aVt1KzFdfHxpc05hTihpW3UrMV0pP24uaW0rPXBhcnNlRmxvYXQoKGElMj8iLSI6IiIpKyIxIik6KG4uaW0rPXBhcnNlRmxvYXQoKGElMj8iLSI6IiIpK2lbdSsxXSksdSsrKSxzPWE9MCk6KChzK2E9PT0wfHxpc05hTihjKSkmJnIoKSwiaSI9PT1pW3UrMV18fCJJIj09PWlbdSsxXT8obi5pbSs9cGFyc2VGbG9hdCgoYSUyPyItIjoiIikrYyksdSsrKTpuLnJlKz1wYXJzZUZsb2F0KChhJTI/Ii0iOiIiKStjKSxzPWE9MCkpfXMrYT4wJiZyKCk7YnJlYWs7Y2FzZSJudW1iZXIiOm4uaW09MCxuLnJlPXQ7YnJlYWs7ZGVmYXVsdDpyKCl9cmV0dXJuIGlzTmFOKG4ucmUpfHxpc05hTihuLmltKSxufSh0LGUpO3RoaXMucmU9bi5yZSx0aGlzLmltPW4uaW19by5wcm90b3R5cGU9e3JlOjAsaW06MCxzaWduOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hYnMoKTtyZXR1cm4gbmV3IG8odGhpcy5yZS90LHRoaXMuaW0vdCl9LGFkZDpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBvKHQsZSk7cmV0dXJuIHRoaXMuaXNJbmZpbml0ZSgpJiZuLmlzSW5maW5pdGUoKT9vLk5BTjp0aGlzLmlzSW5maW5pdGUoKXx8bi5pc0luZmluaXRlKCk/by5JTkZJTklUWTpuZXcgbyh0aGlzLnJlK24ucmUsdGhpcy5pbStuLmltKX0sc3ViOmZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IG8odCxlKTtyZXR1cm4gdGhpcy5pc0luZmluaXRlKCkmJm4uaXNJbmZpbml0ZSgpP28uTkFOOnRoaXMuaXNJbmZpbml0ZSgpfHxuLmlzSW5maW5pdGUoKT9vLklORklOSVRZOm5ldyBvKHRoaXMucmUtbi5yZSx0aGlzLmltLW4uaW0pfSxtdWw6ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgbyh0LGUpO3JldHVybiB0aGlzLmlzSW5maW5pdGUoKSYmbi5pc1plcm8oKXx8dGhpcy5pc1plcm8oKSYmbi5pc0luZmluaXRlKCk/by5OQU46dGhpcy5pc0luZmluaXRlKCl8fG4uaXNJbmZpbml0ZSgpP28uSU5GSU5JVFk6MD09PW4uaW0mJjA9PT10aGlzLmltP25ldyBvKHRoaXMucmUqbi5yZSwwKTpuZXcgbyh0aGlzLnJlKm4ucmUtdGhpcy5pbSpuLmltLHRoaXMucmUqbi5pbSt0aGlzLmltKm4ucmUpfSxkaXY6ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgbyh0LGUpO2lmKHRoaXMuaXNaZXJvKCkmJm4uaXNaZXJvKCl8fHRoaXMuaXNJbmZpbml0ZSgpJiZuLmlzSW5maW5pdGUoKSlyZXR1cm4gby5OQU47aWYodGhpcy5pc0luZmluaXRlKCl8fG4uaXNaZXJvKCkpcmV0dXJuIG8uSU5GSU5JVFk7aWYodGhpcy5pc1plcm8oKXx8bi5pc0luZmluaXRlKCkpcmV0dXJuIG8uWkVSTzt0PXRoaXMucmUsZT10aGlzLmltO3ZhciByLGkscz1uLnJlLGE9bi5pbTtyZXR1cm4gMD09PWE/bmV3IG8odC9zLGUvcyk6TWF0aC5hYnMocyk8TWF0aC5hYnMoYSk/bmV3IG8oKHQqKGk9cy9hKStlKS8ocj1zKmkrYSksKGUqaS10KS9yKTpuZXcgbygodCtlKihpPWEvcykpLyhyPWEqaStzKSwoZS10KmkpL3IpfSxwb3c6ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgbyh0LGUpO2lmKHQ9dGhpcy5yZSxlPXRoaXMuaW0sbi5pc1plcm8oKSlyZXR1cm4gby5PTkU7aWYoMD09PW4uaW0pe2lmKDA9PT1lJiZ0PjApcmV0dXJuIG5ldyBvKE1hdGgucG93KHQsbi5yZSksMCk7aWYoMD09PXQpc3dpdGNoKChuLnJlJTQrNCklNCl7Y2FzZSAwOnJldHVybiBuZXcgbyhNYXRoLnBvdyhlLG4ucmUpLDApO2Nhc2UgMTpyZXR1cm4gbmV3IG8oMCxNYXRoLnBvdyhlLG4ucmUpKTtjYXNlIDI6cmV0dXJuIG5ldyBvKC1NYXRoLnBvdyhlLG4ucmUpLDApO2Nhc2UgMzpyZXR1cm4gbmV3IG8oMCwtTWF0aC5wb3coZSxuLnJlKSl9fWlmKDA9PT10JiYwPT09ZSYmbi5yZT4wJiZuLmltPj0wKXJldHVybiBvLlpFUk87dmFyIHI9TWF0aC5hdGFuMihlLHQpLHM9aSh0LGUpO3JldHVybiB0PU1hdGguZXhwKG4ucmUqcy1uLmltKnIpLGU9bi5pbSpzK24ucmUqcixuZXcgbyh0Kk1hdGguY29zKGUpLHQqTWF0aC5zaW4oZSkpfSxzcXJ0OmZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMucmUscj10aGlzLmltLGk9dGhpcy5hYnMoKTtpZihuPj0wKXtpZigwPT09cilyZXR1cm4gbmV3IG8oTWF0aC5zcXJ0KG4pLDApO3Q9LjUqTWF0aC5zcXJ0KDIqKGkrbikpfWVsc2UgdD1NYXRoLmFicyhyKS9NYXRoLnNxcnQoMiooaS1uKSk7cmV0dXJuIGU9bjw9MD8uNSpNYXRoLnNxcnQoMiooaS1uKSk6TWF0aC5hYnMocikvTWF0aC5zcXJ0KDIqKGkrbikpLG5ldyBvKHQscjwwPy1lOmUpfSxleHA6ZnVuY3Rpb24oKXt2YXIgdD1NYXRoLmV4cCh0aGlzLnJlKTtyZXR1cm4gdGhpcy5pbSxuZXcgbyh0Kk1hdGguY29zKHRoaXMuaW0pLHQqTWF0aC5zaW4odGhpcy5pbSkpfSxleHBtMTpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltO3JldHVybiBuZXcgbyhNYXRoLmV4cG0xKHQpKk1hdGguY29zKGUpK2Z1bmN0aW9uKHQpe3ZhciBlPU1hdGguUEkvNDtpZigtZT50fHx0PmUpcmV0dXJuIE1hdGguY29zKHQpLTE7dmFyIG49dCp0O3JldHVybiBuKihuKihuKihuKihuKihuKihuKihuLzIwOTIyNzg5ODg4ZTMtMS84NzE3ODI5MTIwMCkrMS80NzkwMDE2MDApLTEvMzYyODgwMCkrMS80MDMyMCktMS83MjApKzEvMjQpLS41KX0oZSksTWF0aC5leHAodCkqTWF0aC5zaW4oZSkpfSxsb2c6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtyZXR1cm4gbmV3IG8oaSh0LGUpLE1hdGguYXRhbjIoZSx0KSl9LGFiczpmdW5jdGlvbigpe3JldHVybiB0PXRoaXMucmUsZT10aGlzLmltLG49TWF0aC5hYnModCkscj1NYXRoLmFicyhlKSxuPDNlMyYmcjwzZTM/TWF0aC5zcXJ0KG4qbityKnIpOihuPHI/KG49cixyPXQvZSk6cj1lL3QsbipNYXRoLnNxcnQoMStyKnIpKTt2YXIgdCxlLG4scn0sYXJnOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy5pbSx0aGlzLnJlKX0sc2luOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxyPXRoaXMuaW07cmV0dXJuIG5ldyBvKE1hdGguc2luKHQpKmUociksTWF0aC5jb3ModCkqbihyKSl9LGNvczpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUscj10aGlzLmltO3JldHVybiBuZXcgbyhNYXRoLmNvcyh0KSplKHIpLC1NYXRoLnNpbih0KSpuKHIpKX0sdGFuOmZ1bmN0aW9uKCl7dmFyIHQ9Mip0aGlzLnJlLHI9Mip0aGlzLmltLGk9TWF0aC5jb3ModCkrZShyKTtyZXR1cm4gbmV3IG8oTWF0aC5zaW4odCkvaSxuKHIpL2kpfSxjb3Q6ZnVuY3Rpb24oKXt2YXIgdD0yKnRoaXMucmUscj0yKnRoaXMuaW0saT1NYXRoLmNvcyh0KS1lKHIpO3JldHVybiBuZXcgbygtTWF0aC5zaW4odCkvaSxuKHIpL2kpfSxzZWM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLHI9dGhpcy5pbSxpPS41KmUoMipyKSsuNSpNYXRoLmNvcygyKnQpO3JldHVybiBuZXcgbyhNYXRoLmNvcyh0KSplKHIpL2ksTWF0aC5zaW4odCkqbihyKS9pKX0sY3NjOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxyPXRoaXMuaW0saT0uNSplKDIqciktLjUqTWF0aC5jb3MoMip0KTtyZXR1cm4gbmV3IG8oTWF0aC5zaW4odCkqZShyKS9pLC1NYXRoLmNvcyh0KSpuKHIpL2kpfSxhc2luOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj1uZXcgbyhlKmUtdCp0KzEsLTIqdCplKS5zcXJ0KCkscj1uZXcgbyhuLnJlLWUsbi5pbSt0KS5sb2coKTtyZXR1cm4gbmV3IG8oci5pbSwtci5yZSl9LGFjb3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbSxuPW5ldyBvKGUqZS10KnQrMSwtMip0KmUpLnNxcnQoKSxyPW5ldyBvKG4ucmUtZSxuLmltK3QpLmxvZygpO3JldHVybiBuZXcgbyhNYXRoLlBJLzItci5pbSxyLnJlKX0sYXRhbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltO2lmKDA9PT10KXtpZigxPT09ZSlyZXR1cm4gbmV3IG8oMCwxLzApO2lmKC0xPT09ZSlyZXR1cm4gbmV3IG8oMCwtMS8wKX12YXIgbj10KnQrKDEtZSkqKDEtZSkscj1uZXcgbygoMS1lKmUtdCp0KS9uLC0yKnQvbikubG9nKCk7cmV0dXJuIG5ldyBvKC0uNSpyLmltLC41KnIucmUpfSxhY290OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PWUpcmV0dXJuIG5ldyBvKE1hdGguYXRhbjIoMSx0KSwwKTt2YXIgbj10KnQrZSplO3JldHVybiAwIT09bj9uZXcgbyh0L24sLWUvbikuYXRhbigpOm5ldyBvKDAhPT10P3QvMDowLDAhPT1lPy1lLzA6MCkuYXRhbigpfSxhc2VjOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PXQmJjA9PT1lKXJldHVybiBuZXcgbygwLDEvMCk7dmFyIG49dCp0K2UqZTtyZXR1cm4gMCE9PW4/bmV3IG8odC9uLC1lL24pLmFjb3MoKTpuZXcgbygwIT09dD90LzA6MCwwIT09ZT8tZS8wOjApLmFjb3MoKX0sYWNzYzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltO2lmKDA9PT10JiYwPT09ZSlyZXR1cm4gbmV3IG8oTWF0aC5QSS8yLDEvMCk7dmFyIG49dCp0K2UqZTtyZXR1cm4gMCE9PW4/bmV3IG8odC9uLC1lL24pLmFzaW4oKTpuZXcgbygwIT09dD90LzA6MCwwIT09ZT8tZS8wOjApLmFzaW4oKX0sc2luaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUscj10aGlzLmltO3JldHVybiBuZXcgbyhuKHQpKk1hdGguY29zKHIpLGUodCkqTWF0aC5zaW4ocikpfSxjb3NoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxyPXRoaXMuaW07cmV0dXJuIG5ldyBvKGUodCkqTWF0aC5jb3Mociksbih0KSpNYXRoLnNpbihyKSl9LHRhbmg6ZnVuY3Rpb24oKXt2YXIgdD0yKnRoaXMucmUscj0yKnRoaXMuaW0saT1lKHQpK01hdGguY29zKHIpO3JldHVybiBuZXcgbyhuKHQpL2ksTWF0aC5zaW4ocikvaSl9LGNvdGg6ZnVuY3Rpb24oKXt2YXIgdD0yKnRoaXMucmUscj0yKnRoaXMuaW0saT1lKHQpLU1hdGguY29zKHIpO3JldHVybiBuZXcgbyhuKHQpL2ksLU1hdGguc2luKHIpL2kpfSxjc2NoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxyPXRoaXMuaW0saT1NYXRoLmNvcygyKnIpLWUoMip0KTtyZXR1cm4gbmV3IG8oLTIqbih0KSpNYXRoLmNvcyhyKS9pLDIqZSh0KSpNYXRoLnNpbihyKS9pKX0sc2VjaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUscj10aGlzLmltLGk9TWF0aC5jb3MoMipyKStlKDIqdCk7cmV0dXJuIG5ldyBvKDIqZSh0KSpNYXRoLmNvcyhyKS9pLC0yKm4odCkqTWF0aC5zaW4ocikvaSl9LGFzaW5oOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pbTt0aGlzLmltPS10aGlzLnJlLHRoaXMucmU9dDt2YXIgZT10aGlzLmFzaW4oKTtyZXR1cm4gdGhpcy5yZT0tdGhpcy5pbSx0aGlzLmltPXQsdD1lLnJlLGUucmU9LWUuaW0sZS5pbT10LGV9LGFjb3NoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hY29zKCk7aWYodC5pbTw9MCl7dmFyIGU9dC5yZTt0LnJlPS10LmltLHQuaW09ZX1lbHNle2U9dC5pbTt0LmltPS10LnJlLHQucmU9ZX1yZXR1cm4gdH0sYXRhbmg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbSxuPXQ+MSYmMD09PWUscj0xLXQscz0xK3QsYT1yKnIrZSplLHU9MCE9PWE/bmV3IG8oKHMqci1lKmUpL2EsKGUqcitzKmUpL2EpOm5ldyBvKC0xIT09dD90LzA6MCwwIT09ZT9lLzA6MCksYz11LnJlO3JldHVybiB1LnJlPWkodS5yZSx1LmltKS8yLHUuaW09TWF0aC5hdGFuMih1LmltLGMpLzIsbiYmKHUuaW09LXUuaW0pLHV9LGFjb3RoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PXQmJjA9PT1lKXJldHVybiBuZXcgbygwLE1hdGguUEkvMik7dmFyIG49dCp0K2UqZTtyZXR1cm4gMCE9PW4/bmV3IG8odC9uLC1lL24pLmF0YW5oKCk6bmV3IG8oMCE9PXQ/dC8wOjAsMCE9PWU/LWUvMDowKS5hdGFuaCgpfSxhY3NjaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltO2lmKDA9PT1lKXJldHVybiBuZXcgbygwIT09dD9NYXRoLmxvZyh0K01hdGguc3FydCh0KnQrMSkpOjEvMCwwKTt2YXIgbj10KnQrZSplO3JldHVybiAwIT09bj9uZXcgbyh0L24sLWUvbikuYXNpbmgoKTpuZXcgbygwIT09dD90LzA6MCwwIT09ZT8tZS8wOjApLmFzaW5oKCl9LGFzZWNoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gby5JTkZJTklUWTt2YXIgbj10KnQrZSplO3JldHVybiAwIT09bj9uZXcgbyh0L24sLWUvbikuYWNvc2goKTpuZXcgbygwIT09dD90LzA6MCwwIT09ZT8tZS8wOjApLmFjb3NoKCl9LGludmVyc2U6ZnVuY3Rpb24oKXtpZih0aGlzLmlzWmVybygpKXJldHVybiBvLklORklOSVRZO2lmKHRoaXMuaXNJbmZpbml0ZSgpKXJldHVybiBvLlpFUk87dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj10KnQrZSplO3JldHVybiBuZXcgbyh0L24sLWUvbil9LGNvbmp1Z2F0ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgbyh0aGlzLnJlLC10aGlzLmltKX0sbmVnOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKC10aGlzLnJlLC10aGlzLmltKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLnBvdygxMCx0fHwwKSxuZXcgbyhNYXRoLmNlaWwodGhpcy5yZSp0KS90LE1hdGguY2VpbCh0aGlzLmltKnQpL3QpfSxmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLnBvdygxMCx0fHwwKSxuZXcgbyhNYXRoLmZsb29yKHRoaXMucmUqdCkvdCxNYXRoLmZsb29yKHRoaXMuaW0qdCkvdCl9LHJvdW5kOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KDEwLHR8fDApLG5ldyBvKE1hdGgucm91bmQodGhpcy5yZSp0KS90LE1hdGgucm91bmQodGhpcy5pbSp0KS90KX0sZXF1YWxzOmZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IG8odCxlKTtyZXR1cm4gTWF0aC5hYnMobi5yZS10aGlzLnJlKTw9by5FUFNJTE9OJiZNYXRoLmFicyhuLmltLXRoaXMuaW0pPD1vLkVQU0lMT059LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKHRoaXMucmUsdGhpcy5pbSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj0iIjtyZXR1cm4gdGhpcy5pc05hTigpPyJOYU4iOnRoaXMuaXNJbmZpbml0ZSgpPyJJbmZpbml0eSI6KE1hdGguYWJzKHQpPG8uRVBTSUxPTiYmKHQ9MCksTWF0aC5hYnMoZSk8by5FUFNJTE9OJiYoZT0wKSwwPT09ZT9uK3Q6KDAhPT10PyhuKz10LG4rPSIgIixlPDA/KGU9LWUsbis9Ii0iKTpuKz0iKyIsbis9IiAiKTplPDAmJihlPS1lLG4rPSItIiksMSE9PWUmJihuKz1lKSxuKyJpIikpfSx0b1ZlY3RvcjpmdW5jdGlvbigpe3JldHVyblt0aGlzLnJlLHRoaXMuaW1dfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmltP3RoaXMucmU6bnVsbH0saXNOYU46ZnVuY3Rpb24oKXtyZXR1cm4gaXNOYU4odGhpcy5yZSl8fGlzTmFOKHRoaXMuaW0pfSxpc1plcm86ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuaW0mJjA9PT10aGlzLnJlfSxpc0Zpbml0ZTpmdW5jdGlvbigpe3JldHVybiBpc0Zpbml0ZSh0aGlzLnJlKSYmaXNGaW5pdGUodGhpcy5pbSl9LGlzSW5maW5pdGU6ZnVuY3Rpb24oKXtyZXR1cm4hKHRoaXMuaXNOYU4oKXx8dGhpcy5pc0Zpbml0ZSgpKX19LG8uWkVSTz1uZXcgbygwLDApLG8uT05FPW5ldyBvKDEsMCksby5JPW5ldyBvKDAsMSksby5QST1uZXcgbyhNYXRoLlBJLDApLG8uRT1uZXcgbyhNYXRoLkUsMCksby5JTkZJTklUWT1uZXcgbygxLzAsMS8wKSxvLk5BTj1uZXcgbyhOYU4sTmFOKSxvLkVQU0lMT049MWUtMTUsT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG8uZGVmYXVsdD1vLG8uQ29tcGxleD1vLHQuZXhwb3J0cz1vfSgpfSkpLG55PWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJkZWZhdWx0Iik/dC5kZWZhdWx0OnR9KGV5KSxyeT1pZCgiQ29tcGxleCIsW10sKCgpPT4oT2JqZWN0LmRlZmluZVByb3BlcnR5KG55LCJuYW1lIix7dmFsdWU6IkNvbXBsZXgifSksbnkucHJvdG90eXBlLmNvbnN0cnVjdG9yPW55LG55LnByb3RvdHlwZS50eXBlPSJDb21wbGV4IixueS5wcm90b3R5cGUuaXNDb21wbGV4PSEwLG55LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJDb21wbGV4IixyZTp0aGlzLnJlLGltOnRoaXMuaW19fSxueS5wcm90b3R5cGUudG9Qb2xhcj1mdW5jdGlvbigpe3JldHVybntyOnRoaXMuYWJzKCkscGhpOnRoaXMuYXJnKCl9fSxueS5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW0sbj10aGlzLnJlLHI9VHAodGhpcy5yZSx0KSxpPVRwKHRoaXMuaW0sdCksbz1QZih0KT90OnQ/dC5wcmVjaXNpb246bnVsbDtpZihudWxsIT09byl7dmFyIHM9TWF0aC5wb3coMTAsLW8pO01hdGguYWJzKG4vZSk8cyYmKG49MCksTWF0aC5hYnMoZS9uKTxzJiYoZT0wKX1yZXR1cm4gMD09PWU/cjowPT09bj8xPT09ZT8iaSI6LTE9PT1lPyItaSI6aSsiaSI6ZTwwPy0xPT09ZT9yKyIgLSBpIjpyKyIgLSAiK2kuc3Vic3RyaW5nKDEpKyJpIjoxPT09ZT9yKyIgKyBpIjpyKyIgKyAiK2krImkifSxueS5mcm9tUG9sYXI9ZnVuY3Rpb24odCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTp2YXIgZT1hcmd1bWVudHNbMF07aWYoIm9iamVjdCI9PXR5cGVvZiBlKXJldHVybiBueShlKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnB1dCBoYXMgdG8gYmUgYW4gb2JqZWN0IHdpdGggciBhbmQgcGhpIGtleXMuIik7Y2FzZSAyOnZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtpZihQZihuKSl7aWYoemYocikmJnIuaGFzQmFzZSgiQU5HTEUiKSYmKHI9ci50b051bWJlcigicmFkIikpLFBmKHIpKXJldHVybiBuZXcgbnkoe3I6bixwaGk6cn0pO3Rocm93IG5ldyBUeXBlRXJyb3IoIlBoaSBpcyBub3QgYSBudW1iZXIgbm9yIGFuIGFuZ2xlIHVuaXQuIil9dGhyb3cgbmV3IFR5cGVFcnJvcigiUmFkaXVzIHIgaXMgbm90IGEgbnVtYmVyLiIpO2RlZmF1bHQ6dGhyb3cgbmV3IFN5bnRheEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGluIGZ1bmN0aW9uIGZyb21Qb2xhciIpfX0sbnkucHJvdG90eXBlLnZhbHVlT2Y9bnkucHJvdG90eXBlLnRvU3RyaW5nLG55LmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbnkodCl9LG55LmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5yZT5lLnJlPzE6dC5yZTxlLnJlPy0xOnQuaW0+ZS5pbT8xOnQuaW08ZS5pbT8tMTowfSxueSkpLHtpc0NsYXNzOiEwfSksaXk9e3M6MSxuOjAsZDoxfTtmdW5jdGlvbiBveSh0LGUpe2lmKGlzTmFOKHQ9cGFyc2VJbnQodCwxMCkpKXRocm93IGZ5KCk7cmV0dXJuIHQqZX1mdW5jdGlvbiBzeSh0LGUpe2lmKDA9PT1lKXRocm93IGh5KCk7dmFyIG49T2JqZWN0LmNyZWF0ZShseS5wcm90b3R5cGUpO24ucz10PDA/LTE6MTt2YXIgcj1jeSh0PXQ8MD8tdDp0LGUpO3JldHVybiBuLm49dC9yLG4uZD1lL3Isbn1mdW5jdGlvbiBheSh0KXtmb3IodmFyIGU9e30sbj10LHI9MixpPTQ7aTw9bjspe2Zvcig7biVyPT0wOyluLz1yLGVbcl09KGVbcl18fDApKzE7aSs9MSsyKnIrK31yZXR1cm4gbiE9PXQ/bj4xJiYoZVtuXT0oZVtuXXx8MCkrMSk6ZVt0XT0oZVt0XXx8MCkrMSxlfXZhciB1eT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9MCxpPTEsbz0xLHM9MCxhPTAsdT0wLGM9MSxsPTEsaD0wLGY9MSxwPTEsZD0xLGc9MWU3O2lmKG51bGwhPXQpaWYodm9pZCAwIT09ZSl7aWYobz0ocj10KSooaT1lKSxyJTEhPTB8fGklMSE9MCl0aHJvdyBweSgpfWVsc2Ugc3dpdGNoKHR5cGVvZiB0KXtjYXNlIm9iamVjdCI6aWYoImQiaW4gdCYmIm4iaW4gdClyPXQubixpPXQuZCwicyJpbiB0JiYocio9dC5zKTtlbHNle2lmKCEoMCBpbiB0KSl0aHJvdyBmeSgpO3I9dFswXSwxIGluIHQmJihpPXRbMV0pfW89cippO2JyZWFrO2Nhc2UibnVtYmVyIjppZih0PDAmJihvPXQsdD0tdCksdCUxPT0wKXI9dDtlbHNlIGlmKHQ+MCl7Zm9yKHQ+PTEmJih0Lz1sPU1hdGgucG93KDEwLE1hdGguZmxvb3IoMStNYXRoLmxvZyh0KS9NYXRoLkxOMTApKSk7Zjw9ZyYmZDw9Zzspe2lmKHQ9PT0obj0oaCtwKS8oZitkKSkpe2YrZDw9Zz8ocj1oK3AsaT1mK2QpOmQ+Zj8ocj1wLGk9ZCk6KHI9aCxpPWYpO2JyZWFrfXQ+bj8oaCs9cCxmKz1kKToocCs9aCxkKz1mKSxmPmc/KHI9cCxpPWQpOihyPWgsaT1mKX1yKj1sfWVsc2UoaXNOYU4odCl8fGlzTmFOKGUpKSYmKGk9cj1OYU4pO2JyZWFrO2Nhc2Uic3RyaW5nIjppZihudWxsPT09KGY9dC5tYXRjaCgvXGQrfC4vZykpKXRocm93IGZ5KCk7aWYoIi0iPT09ZltoXT8obz0tMSxoKyspOiIrIj09PWZbaF0mJmgrKyxmLmxlbmd0aD09PWgrMT9hPW95KGZbaCsrXSxvKToiLiI9PT1mW2grMV18fCIuIj09PWZbaF0/KCIuIiE9PWZbaF0mJihzPW95KGZbaCsrXSxvKSksKCsraCsxPT09Zi5sZW5ndGh8fCIoIj09PWZbaCsxXSYmIikiPT09ZltoKzNdfHwiJyI9PT1mW2grMV0mJiInIj09PWZbaCszXSkmJihhPW95KGZbaF0sbyksYz1NYXRoLnBvdygxMCxmW2hdLmxlbmd0aCksaCsrKSwoIigiPT09ZltoXSYmIikiPT09ZltoKzJdfHwiJyI9PT1mW2hdJiYiJyI9PT1mW2grMl0pJiYodT1veShmW2grMV0sbyksbD1NYXRoLnBvdygxMCxmW2grMV0ubGVuZ3RoKS0xLGgrPTMpKToiLyI9PT1mW2grMV18fCI6Ij09PWZbaCsxXT8oYT1veShmW2hdLG8pLGM9b3koZltoKzJdLDEpLGgrPTMpOiIvIj09PWZbaCszXSYmIiAiPT09ZltoKzFdJiYocz1veShmW2hdLG8pLGE9b3koZltoKzJdLG8pLGM9b3koZltoKzRdLDEpLGgrPTUpLGYubGVuZ3RoPD1oKXtvPXI9dSsoaT1jKmwpKnMrbCphO2JyZWFrfWRlZmF1bHQ6dGhyb3cgZnkoKX1pZigwPT09aSl0aHJvdyBoeSgpO2l5LnM9bzwwPy0xOjEsaXkubj1NYXRoLmFicyhyKSxpeS5kPU1hdGguYWJzKGkpfTtmdW5jdGlvbiBjeSh0LGUpe2lmKCF0KXJldHVybiBlO2lmKCFlKXJldHVybiB0O2Zvcig7Oyl7aWYoISh0JT1lKSlyZXR1cm4gZTtpZighKGUlPXQpKXJldHVybiB0fX1mdW5jdGlvbiBseSh0LGUpe2lmKHV5KHQsZSksISh0aGlzIGluc3RhbmNlb2YgbHkpKXJldHVybiBzeShpeS5zKml5Lm4saXkuZCk7dD1jeShpeS5kLGl5Lm4pLHRoaXMucz1peS5zLHRoaXMubj1peS5uL3QsdGhpcy5kPWl5LmQvdH12YXIgaHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEVycm9yKCJEaXZpc2lvbiBieSBaZXJvIil9LGZ5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCIpfSxweT1mdW5jdGlvbigpe3JldHVybiBuZXcgRXJyb3IoIlBhcmFtZXRlcnMgbXVzdCBiZSBpbnRlZ2VyIil9O2x5LnByb3RvdHlwZT17czoxLG46MCxkOjEsYWJzOmZ1bmN0aW9uKCl7cmV0dXJuIHN5KHRoaXMubix0aGlzLmQpfSxuZWc6ZnVuY3Rpb24oKXtyZXR1cm4gc3koLXRoaXMucyp0aGlzLm4sdGhpcy5kKX0sYWRkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHV5KHQsZSksc3kodGhpcy5zKnRoaXMubippeS5kK2l5LnMqdGhpcy5kKml5Lm4sdGhpcy5kKml5LmQpfSxzdWI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdXkodCxlKSxzeSh0aGlzLnMqdGhpcy5uKml5LmQtaXkucyp0aGlzLmQqaXkubix0aGlzLmQqaXkuZCl9LG11bDpmdW5jdGlvbih0LGUpe3JldHVybiB1eSh0LGUpLHN5KHRoaXMucyppeS5zKnRoaXMubippeS5uLHRoaXMuZCppeS5kKX0sZGl2OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHV5KHQsZSksc3kodGhpcy5zKml5LnMqdGhpcy5uKml5LmQsdGhpcy5kKml5Lm4pfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBzeSh0aGlzLnMqdGhpcy5uLHRoaXMuZCl9LG1vZDpmdW5jdGlvbih0LGUpe2lmKGlzTmFOKHRoaXMubil8fGlzTmFOKHRoaXMuZCkpcmV0dXJuIG5ldyBseShOYU4pO2lmKHZvaWQgMD09PXQpcmV0dXJuIHN5KHRoaXMucyp0aGlzLm4ldGhpcy5kLDEpO2lmKHV5KHQsZSksMD09PWl5Lm4mJjA9PT10aGlzLmQpdGhyb3cgaHkoKTtyZXR1cm4gc3kodGhpcy5zKihpeS5kKnRoaXMubiklKGl5Lm4qdGhpcy5kKSxpeS5kKnRoaXMuZCl9LGdjZDpmdW5jdGlvbih0LGUpe3JldHVybiB1eSh0LGUpLHN5KGN5KGl5Lm4sdGhpcy5uKSpjeShpeS5kLHRoaXMuZCksaXkuZCp0aGlzLmQpfSxsY206ZnVuY3Rpb24odCxlKXtyZXR1cm4gdXkodCxlKSwwPT09aXkubiYmMD09PXRoaXMubj9zeSgwLDEpOnN5KGl5Lm4qdGhpcy5uLGN5KGl5Lm4sdGhpcy5uKSpjeShpeS5kLHRoaXMuZCkpfSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KDEwLHR8fDApLGlzTmFOKHRoaXMubil8fGlzTmFOKHRoaXMuZCk/bmV3IGx5KE5hTik6c3koTWF0aC5jZWlsKHQqdGhpcy5zKnRoaXMubi90aGlzLmQpLHQpfSxmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLnBvdygxMCx0fHwwKSxpc05hTih0aGlzLm4pfHxpc05hTih0aGlzLmQpP25ldyBseShOYU4pOnN5KE1hdGguZmxvb3IodCp0aGlzLnMqdGhpcy5uL3RoaXMuZCksdCl9LHJvdW5kOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KDEwLHR8fDApLGlzTmFOKHRoaXMubil8fGlzTmFOKHRoaXMuZCk/bmV3IGx5KE5hTik6c3koTWF0aC5yb3VuZCh0KnRoaXMucyp0aGlzLm4vdGhpcy5kKSx0KX0scm91bmRUbzpmdW5jdGlvbih0LGUpe3JldHVybiB1eSh0LGUpLHN5KHRoaXMucypNYXRoLnJvdW5kKHRoaXMubippeS5kLyh0aGlzLmQqaXkubikpKml5Lm4saXkuZCl9LGludmVyc2U6ZnVuY3Rpb24oKXtyZXR1cm4gc3kodGhpcy5zKnRoaXMuZCx0aGlzLm4pfSxwb3c6ZnVuY3Rpb24odCxlKXtpZih1eSh0LGUpLDE9PT1peS5kKXJldHVybiBpeS5zPDA/c3koTWF0aC5wb3codGhpcy5zKnRoaXMuZCxpeS5uKSxNYXRoLnBvdyh0aGlzLm4saXkubikpOnN5KE1hdGgucG93KHRoaXMucyp0aGlzLm4saXkubiksTWF0aC5wb3codGhpcy5kLGl5Lm4pKTtpZih0aGlzLnM8MClyZXR1cm4gbnVsbDt2YXIgbj1heSh0aGlzLm4pLHI9YXkodGhpcy5kKSxpPTEsbz0xO2Zvcih2YXIgcyBpbiBuKWlmKCIxIiE9PXMpe2lmKCIwIj09PXMpe2k9MDticmVha31pZihuW3NdKj1peS5uLG5bc10laXkuZCE9MClyZXR1cm4gbnVsbDtuW3NdLz1peS5kLGkqPU1hdGgucG93KHMsbltzXSl9Zm9yKHZhciBzIGluIHIpaWYoIjEiIT09cyl7aWYocltzXSo9aXkubixyW3NdJWl5LmQhPTApcmV0dXJuIG51bGw7cltzXS89aXkuZCxvKj1NYXRoLnBvdyhzLHJbc10pfXJldHVybiBpeS5zPDA/c3kobyxpKTpzeShpLG8pfSxlcXVhbHM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdXkodCxlKSx0aGlzLnMqdGhpcy5uKml5LmQ9PWl5LnMqaXkubip0aGlzLmR9LGNvbXBhcmU6ZnVuY3Rpb24odCxlKXt1eSh0LGUpO3ZhciBuPXRoaXMucyp0aGlzLm4qaXkuZC1peS5zKml5Lm4qdGhpcy5kO3JldHVybigwPG4pLShuPDApfSxzaW1wbGlmeTpmdW5jdGlvbih0KXtpZihpc05hTih0aGlzLm4pfHxpc05hTih0aGlzLmQpKXJldHVybiB0aGlzO3Q9dHx8LjAwMTtmb3IodmFyIGU9dGhpcy5hYnMoKSxuPWUudG9Db250aW51ZWQoKSxyPTE7cjxuLmxlbmd0aDtyKyspe2Zvcih2YXIgaT1zeShuW3ItMV0sMSksbz1yLTI7bz49MDtvLS0paT1pLmludmVyc2UoKS5hZGQobltvXSk7aWYoTWF0aC5hYnMoaS5zdWIoZSkudmFsdWVPZigpKTx0KXJldHVybiBpLm11bCh0aGlzLnMpfXJldHVybiB0aGlzfSxkaXZpc2libGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdXkodCxlKSwhKCEoaXkubip0aGlzLmQpfHx0aGlzLm4qaXkuZCUoaXkubip0aGlzLmQpKX0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnMqdGhpcy5uL3RoaXMuZH0sdG9GcmFjdGlvbjpmdW5jdGlvbih0KXt2YXIgZSxuPSIiLHI9dGhpcy5uLGk9dGhpcy5kO3JldHVybiB0aGlzLnM8MCYmKG4rPSItIiksMT09PWk/bis9cjoodCYmKGU9TWF0aC5mbG9vcihyL2kpKT4wJiYobis9ZSxuKz0iICIsciU9aSksbis9cixuKz0iLyIsbis9aSksbn0sdG9MYXRleDpmdW5jdGlvbih0KXt2YXIgZSxuPSIiLHI9dGhpcy5uLGk9dGhpcy5kO3JldHVybiB0aGlzLnM8MCYmKG4rPSItIiksMT09PWk/bis9cjoodCYmKGU9TWF0aC5mbG9vcihyL2kpKT4wJiYobis9ZSxyJT1pKSxuKz0iXFxmcmFjeyIsbis9cixuKz0ifXsiLG4rPWksbis9In0iKSxufSx0b0NvbnRpbnVlZDpmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5uLG49dGhpcy5kLHI9W107aWYoaXNOYU4oZSl8fGlzTmFOKG4pKXJldHVybiByO2Rve3IucHVzaChNYXRoLmZsb29yKGUvbikpLHQ9ZSVuLGU9bixuPXR9d2hpbGUoMSE9PWUpO3JldHVybiByfSx0b1N0cmluZzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm4sbj10aGlzLmQ7aWYoaXNOYU4oZSl8fGlzTmFOKG4pKXJldHVybiJOYU4iO3Q9dHx8MTU7dmFyIHI9ZnVuY3Rpb24odCxlKXtmb3IoO2UlMj09MDtlLz0yKTtmb3IoO2UlNT09MDtlLz01KTtpZigxPT09ZSlyZXR1cm4gMDtmb3IodmFyIG49MTAlZSxyPTE7MSE9PW47cisrKWlmKG49MTAqbiVlLHI+MmUzKXJldHVybiAwO3JldHVybiByfSgwLG4pLGk9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0xLGk9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0xO2U+MDt0PXQqdCVuLGU+Pj0xKTEmZSYmKHI9cip0JW4pO3JldHVybiByfSgxMCxuLGUpLG89MDtvPDMwMDtvKyspe2lmKHI9PT1pKXJldHVybiBvO3I9MTAqciVlLGk9MTAqaSVlfXJldHVybiAwfSgwLG4sciksbz10aGlzLnM8MD8iLSI6IiI7aWYobys9ZS9ufDAsZSU9biwoZSo9MTApJiYobys9Ii4iKSxyKXtmb3IodmFyIHM9aTtzLS07KW8rPWUvbnwwLGUlPW4sZSo9MTA7bys9IigiO2ZvcihzPXI7cy0tOylvKz1lL258MCxlJT1uLGUqPTEwO28rPSIpIn1lbHNlIGZvcihzPXQ7ZSYmcy0tOylvKz1lL258MCxlJT1uLGUqPTEwO3JldHVybiBvfX07dmFyIGR5PWlkKCJGcmFjdGlvbiIsW10sKCgpPT4oT2JqZWN0LmRlZmluZVByb3BlcnR5KGx5LCJuYW1lIix7dmFsdWU6IkZyYWN0aW9uIn0pLGx5LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1seSxseS5wcm90b3R5cGUudHlwZT0iRnJhY3Rpb24iLGx5LnByb3RvdHlwZS5pc0ZyYWN0aW9uPSEwLGx5LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJGcmFjdGlvbiIsbjp0aGlzLnMqdGhpcy5uLGQ6dGhpcy5kfX0sbHkuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBseSh0KX0sbHkpKSx7aXNDbGFzczohMH0pLGd5PWlkKCJNYXRyaXgiLFtdLCgoKT0+e2Z1bmN0aW9uIHQoKXtpZighKHRoaXMgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpfXJldHVybiB0LnByb3RvdHlwZS50eXBlPSJNYXRyaXgiLHQucHJvdG90eXBlLmlzTWF0cml4PSEwLHQucHJvdG90eXBlLnN0b3JhZ2U9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc3RvcmFnZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuZGF0YXR5cGU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgZGF0YXR5cGUgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBjcmVhdGUgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnN1YnNldD1mdW5jdGlvbih0LGUsbil7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHN1YnNldCBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBnZXQgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUsbil7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHNldCBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHJlc2l6ZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUucmVzaGFwZT1mdW5jdGlvbih0LGUpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSByZXNoYXBlIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBjbG9uZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzaXplIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgbWFwIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBmb3JFYWNoIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaXRlcmF0ZSBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSB0b0FycmF5IG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS52YWx1ZU9mPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHZhbHVlT2Ygb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgZm9ybWF0IG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSB0b1N0cmluZyBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdH0pLHtpc0NsYXNzOiEwfSk7ZnVuY3Rpb24geXkodCl7cmV0dXJuIE9iamVjdC5rZXlzKHQuc2lnbmF0dXJlc3x8e30pLnJlZHVjZSgoZnVuY3Rpb24odCxlKXt2YXIgbj0oZS5tYXRjaCgvLC9nKXx8W10pLmxlbmd0aCsxO3JldHVybiBNYXRoLm1heCh0LG4pfSksLTEpfXZhciBteT1pZCgiRGVuc2VNYXRyaXgiLFsiTWF0cml4Il0sKHQ9Pnt2YXJ7TWF0cml4OmV9PXQ7ZnVuY3Rpb24gbih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG4pKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIik7aWYoZSYmIWpmKGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBkYXRhdHlwZTogIitlKTtpZihxZih0KSkiRGVuc2VNYXRyaXgiPT09dC50eXBlPyh0aGlzLl9kYXRhPXdwKHQuX2RhdGEpLHRoaXMuX3NpemU9d3AodC5fc2l6ZSksdGhpcy5fZGF0YXR5cGU9ZXx8dC5fZGF0YXR5cGUpOih0aGlzLl9kYXRhPXQudG9BcnJheSgpLHRoaXMuX3NpemU9dC5zaXplKCksdGhpcy5fZGF0YXR5cGU9ZXx8dC5fZGF0YXR5cGUpO2Vsc2UgaWYodCYmVWYodC5kYXRhKSYmVWYodC5zaXplKSl0aGlzLl9kYXRhPXQuZGF0YSx0aGlzLl9zaXplPXQuc2l6ZSxIcCh0aGlzLl9kYXRhLHRoaXMuX3NpemUpLHRoaXMuX2RhdGF0eXBlPWV8fHQuZGF0YXR5cGU7ZWxzZSBpZihVZih0KSl0aGlzLl9kYXRhPWEodCksdGhpcy5fc2l6ZT1YcCh0aGlzLl9kYXRhKSxIcCh0aGlzLl9kYXRhLHRoaXMuX3NpemUpLHRoaXMuX2RhdGF0eXBlPWU7ZWxzZXtpZih0KXRocm93IG5ldyBUeXBlRXJyb3IoIlVuc3VwcG9ydGVkIHR5cGUgb2YgZGF0YSAoIit4cCh0KSsiKSIpO3RoaXMuX2RhdGE9W10sdGhpcy5fc2l6ZT1bMF0sdGhpcy5fZGF0YXR5cGU9ZX19ZnVuY3Rpb24gcih0LGUsbixpKXt2YXIgbz1pPT09bi0xLHM9ZS5kaW1lbnNpb24oaSk7cmV0dXJuIG8/cy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBacChlLHQubGVuZ3RoKSx0W2VdfSkpLnZhbHVlT2YoKTpzLm1hcCgoZnVuY3Rpb24obyl7cmV0dXJuIFpwKG8sdC5sZW5ndGgpLHIodFtvXSxlLG4saSsxKX0pKS52YWx1ZU9mKCl9ZnVuY3Rpb24gaSh0LGUsbixyLG8pe3ZhciBzPW89PT1yLTEsYT1lLmRpbWVuc2lvbihvKTtzP2EuZm9yRWFjaCgoZnVuY3Rpb24oZSxyKXtacChlKSx0W2VdPW5bclswXV19KSk6YS5mb3JFYWNoKChmdW5jdGlvbihzLGEpe1pwKHMpLGkodFtzXSxlLG5bYVswXV0scixvKzEpfSkpfWZ1bmN0aW9uIG8odCxlLG4pe2lmKDA9PT1lLmxlbmd0aCl7Zm9yKHZhciByPXQuX2RhdGE7VWYocik7KXI9clswXTtyZXR1cm4gcn1yZXR1cm4gdC5fc2l6ZT1lLnNsaWNlKDApLHQuX2RhdGE9S3AodC5fZGF0YSx0Ll9zaXplLG4pLHR9ZnVuY3Rpb24gcyh0LGUsbil7Zm9yKHZhciByPXQuX3NpemUuc2xpY2UoMCksaT0hMTtyLmxlbmd0aDxlLmxlbmd0aDspci5wdXNoKDApLGk9ITA7Zm9yKHZhciBzPTAsYT1lLmxlbmd0aDtzPGE7cysrKWVbc10+cltzXSYmKHJbc109ZVtzXSxpPSEwKTtpJiZvKHQscixuKX1mdW5jdGlvbiBhKHQpe2Zvcih2YXIgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl7dmFyIHI9dFtlXTtVZihyKT90W2VdPWEocik6ciYmITA9PT1yLmlzTWF0cml4JiYodFtlXT1hKHIudmFsdWVPZigpKSl9cmV0dXJuIHR9cmV0dXJuIG4ucHJvdG90eXBlPW5ldyBlLG4ucHJvdG90eXBlLmNyZWF0ZURlbnNlTWF0cml4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBuKHQsZSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJuYW1lIix7dmFsdWU6IkRlbnNlTWF0cml4In0pLG4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPW4sbi5wcm90b3R5cGUudHlwZT0iRGVuc2VNYXRyaXgiLG4ucHJvdG90eXBlLmlzRGVuc2VNYXRyaXg9ITAsbi5wcm90b3R5cGUuZ2V0RGF0YVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gcmQodGhpcy5fZGF0YSx4cCl9LG4ucHJvdG90eXBlLnN0b3JhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4iZGVuc2UifSxuLnByb3RvdHlwZS5kYXRhdHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhdHlwZX0sbi5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBuKHQsZSl9LG4ucHJvdG90eXBlLnN1YnNldD1mdW5jdGlvbih0LGUsbyl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighV2YoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBpbmRleCIpO3ZhciBpPWUuaXNTY2FsYXIoKTtpZihpKXJldHVybiB0LmdldChlLm1pbigpKTt2YXIgbz1lLnNpemUoKTtpZihvLmxlbmd0aCE9PXQuX3NpemUubGVuZ3RoKXRocm93IG5ldyBHcChvLmxlbmd0aCx0Ll9zaXplLmxlbmd0aCk7Zm9yKHZhciBzPWUubWluKCksYT1lLm1heCgpLHU9MCxjPXQuX3NpemUubGVuZ3RoO3U8Yzt1KyspWnAoc1t1XSx0Ll9zaXplW3VdKSxacChhW3VdLHQuX3NpemVbdV0pO3JldHVybiBuZXcgbihyKHQuX2RhdGEsZSxvLmxlbmd0aCwwKSx0Ll9kYXRhdHlwZSl9KHRoaXMsdCk7Y2FzZSAyOmNhc2UgMzpyZXR1cm4gZnVuY3Rpb24odCxlLG4scil7aWYoIWV8fCEwIT09ZS5pc0luZGV4KXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaW5kZXgiKTt2YXIgbyxhPWUuc2l6ZSgpLHU9ZS5pc1NjYWxhcigpO2lmKHFmKG4pPyhvPW4uc2l6ZSgpLG49bi52YWx1ZU9mKCkpOm89WHAobiksdSl7aWYoMCE9PW8ubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlNjYWxhciBleHBlY3RlZCIpO3Quc2V0KGUubWluKCksbixyKX1lbHNle2lmKGEubGVuZ3RoPHQuX3NpemUubGVuZ3RoKXRocm93IG5ldyBHcChhLmxlbmd0aCx0Ll9zaXplLmxlbmd0aCwiPCIpO2lmKG8ubGVuZ3RoPGEubGVuZ3RoKXtmb3IodmFyIGM9MCxsPTA7MT09PWFbY10mJjE9PT1vW2NdOyljKys7Zm9yKDsxPT09YVtjXTspbCsrLGMrKztuPWVkKG4sYS5sZW5ndGgsbCxvKX1pZighYnAoYSxvKSl0aHJvdyBuZXcgR3AoYSxvLCI+Iik7cyh0LGUubWF4KCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdCsxfSkpLHIpO3ZhciBoPWEubGVuZ3RoLGY9MDtpKHQuX2RhdGEsZSxuLGgsZil9cmV0dXJuIHR9KHRoaXMsdCxlLG8pO2RlZmF1bHQ6dGhyb3cgbmV3IFN5bnRheEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIil9fSxuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYoIVVmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkIik7aWYodC5sZW5ndGghPT10aGlzLl9zaXplLmxlbmd0aCl0aHJvdyBuZXcgR3AodC5sZW5ndGgsdGhpcy5fc2l6ZS5sZW5ndGgpO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKVpwKHRbZV0sdGhpcy5fc2l6ZVtlXSk7Zm9yKHZhciBuPXRoaXMuX2RhdGEscj0wLGk9dC5sZW5ndGg7cjxpO3IrKyl7dmFyIG89dFtyXTtacChvLG4ubGVuZ3RoKSxuPW5bb119cmV0dXJuIG59LG4ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUsbil7aWYoIVVmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkIik7aWYodC5sZW5ndGg8dGhpcy5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKHQubGVuZ3RoLHRoaXMuX3NpemUubGVuZ3RoLCI8Iik7dmFyIHIsaSxvO3ModGhpcyx0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQrMX0pKSxuKTt2YXIgYT10aGlzLl9kYXRhO2ZvcihyPTAsaT10Lmxlbmd0aC0xO3I8aTtyKyspWnAobz10W3JdLGEubGVuZ3RoKSxhPWFbb107cmV0dXJuIFpwKG89dFt0Lmxlbmd0aC0xXSxhLmxlbmd0aCksYVtvXT1lLHRoaXN9LG4ucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUsbil7aWYoIVZmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IG9yIE1hdHJpeCBleHBlY3RlZCIpO3ZhciByPXQudmFsdWVPZigpLm1hcCgodD0+QXJyYXkuaXNBcnJheSh0KSYmMT09PXQubGVuZ3RoP3RbMF06dCkpO3JldHVybiBvKG4/dGhpcy5jbG9uZSgpOnRoaXMscixlKX0sbi5wcm90b3R5cGUucmVzaGFwZT1mdW5jdGlvbih0LGUpe3ZhciBuPWU/dGhpcy5jbG9uZSgpOnRoaXM7bi5fZGF0YT1RcChuLl9kYXRhLHQpO3ZhciByPW4uX3NpemUucmVkdWNlKCgodCxlKT0+dCplKSk7cmV0dXJuIG4uX3NpemU9JHAodCxyKSxufSxuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgbih7ZGF0YTp3cCh0aGlzLl9kYXRhKSxzaXplOndwKHRoaXMuX3NpemUpLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfSl9LG4ucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZS5zbGljZSgwKX0sbi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMscj15eSh0KSxpPWZ1bmN0aW9uIG4oaSxvKXtyZXR1cm4gVWYoaSk/aS5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odCxvLmNvbmNhdChlKSl9KSk6MT09PXI/dChpKToyPT09cj90KGksbyk6dChpLG8sZSl9KHRoaXMuX2RhdGEsW10pO3JldHVybiBuZXcgbihpLHZvaWQgMCE9PXRoaXMuX2RhdGF0eXBlP3JkKGkseHApOnZvaWQgMCl9LG4ucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczshZnVuY3Rpb24gbihyLGkpe1VmKHIpP3IuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtuKHQsaS5jb25jYXQoZSkpfSkpOnQocixpLGUpfSh0aGlzLl9kYXRhLFtdKX0sbi5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbiooKXt5aWVsZCpmdW5jdGlvbip0KGUsbil7aWYoVWYoZSkpZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspeWllbGQqdChlW3JdLG4uY29uY2F0KHIpKTtlbHNlIHlpZWxke3ZhbHVlOmUsaW5kZXg6bn19KHRoaXMuX2RhdGEsW10pfSxuLnByb3RvdHlwZS5yb3dzPWZ1bmN0aW9uKCl7dmFyIHQ9W107aWYoMiE9PXRoaXMuc2l6ZSgpLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJSb3dzIGNhbiBvbmx5IGJlIHJldHVybmVkIGZvciBhIDJEIG1hdHJpeC4iKTt2YXIgZT10aGlzLl9kYXRhO2Zvcih2YXIgciBvZiBlKXQucHVzaChuZXcgbihbcl0sdGhpcy5fZGF0YXR5cGUpKTtyZXR1cm4gdH0sbi5wcm90b3R5cGUuY29sdW1ucz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1bXSxyPXRoaXMuc2l6ZSgpO2lmKDIhPT1yLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJSb3dzIGNhbiBvbmx5IGJlIHJldHVybmVkIGZvciBhIDJEIG1hdHJpeC4iKTtmb3IodmFyIGk9dGhpcy5fZGF0YSxvPWZ1bmN0aW9uKHIpe3ZhciBvPWkubWFwKCh0PT5bdFtyXV0pKTtlLnB1c2gobmV3IG4obyx0Ll9kYXRhdHlwZSkpfSxzPTA7czxyWzFdO3MrKylvKHMpO3JldHVybiBlfSxuLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHdwKHRoaXMuX2RhdGEpfSxuLnByb3RvdHlwZS52YWx1ZU9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9LG4ucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gcXAodGhpcy5fZGF0YSx0KX0sbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gcXAodGhpcy5fZGF0YSl9LG4ucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkRlbnNlTWF0cml4IixkYXRhOnRoaXMuX2RhdGEsc2l6ZTp0aGlzLl9zaXplLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfX0sbi5wcm90b3R5cGUuZGlhZ29uYWw9ZnVuY3Rpb24odCl7aWYodCl7aWYoUmYodCkmJih0PXQudG9OdW1iZXIoKSksIVBmKHQpfHwhTXAodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHBhcmFtZXRlciBrIG11c3QgYmUgYW4gaW50ZWdlciBudW1iZXIiKX1lbHNlIHQ9MDtmb3IodmFyIGU9dD4wP3Q6MCxyPXQ8MD8tdDowLGk9dGhpcy5fc2l6ZVswXSxvPXRoaXMuX3NpemVbMV0scz1NYXRoLm1pbihpLXIsby1lKSxhPVtdLHU9MDt1PHM7dSsrKWFbdV09dGhpcy5fZGF0YVt1K3JdW3UrZV07cmV0dXJuIG5ldyBuKHtkYXRhOmEsc2l6ZTpbc10sZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9KX0sbi5kaWFnb25hbD1mdW5jdGlvbih0LGUscixpKXtpZighVWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQsIHNpemUgcGFyYW1ldGVyIik7aWYoMiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSB0d28gZGltZW5zaW9ucyBtYXRyaXggYXJlIHN1cHBvcnRlZCIpO2lmKHQ9dC5tYXAoKGZ1bmN0aW9uKHQpe2lmKFJmKHQpJiYodD10LnRvTnVtYmVyKCkpLCFQZih0KXx8IU1wKHQpfHx0PDEpdGhyb3cgbmV3IEVycm9yKCJTaXplIHZhbHVlcyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzIik7cmV0dXJuIHR9KSkscil7aWYoUmYocikmJihyPXIudG9OdW1iZXIoKSksIVBmKHIpfHwhTXAocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHBhcmFtZXRlciBrIG11c3QgYmUgYW4gaW50ZWdlciBudW1iZXIiKX1lbHNlIHI9MDt2YXIgbyxzPXI+MD9yOjAsYT1yPDA/LXI6MCx1PXRbMF0sYz10WzFdLGw9TWF0aC5taW4odS1hLGMtcyk7aWYoVWYoZSkpe2lmKGUubGVuZ3RoIT09bCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdmFsdWUgYXJyYXkgbGVuZ3RoIik7bz1mdW5jdGlvbih0KXtyZXR1cm4gZVt0XX19ZWxzZSBpZihxZihlKSl7dmFyIGg9ZS5zaXplKCk7aWYoMSE9PWgubGVuZ3RofHxoWzBdIT09bCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbWF0cml4IGxlbmd0aCIpO289ZnVuY3Rpb24odCl7cmV0dXJuIGUuZ2V0KFt0XSl9fWVsc2Ugbz1mdW5jdGlvbigpe3JldHVybiBlfTtpfHwoaT1SZihvKDApKT9vKDApLm11bCgwKTowKTt2YXIgZj1bXTtpZih0Lmxlbmd0aD4wKXtmPUtwKGYsdCxpKTtmb3IodmFyIHA9MDtwPGw7cCsrKWZbcCthXVtwK3NdPW8ocCl9cmV0dXJuIG5ldyBuKHtkYXRhOmYsc2l6ZTpbdSxjXX0pfSxuLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbih0KX0sbi5wcm90b3R5cGUuc3dhcFJvd3M9ZnVuY3Rpb24odCxlKXtpZighKFBmKHQpJiZNcCh0KSYmUGYoZSkmJk1wKGUpKSl0aHJvdyBuZXcgRXJyb3IoIlJvdyBpbmRleCBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzIik7aWYoMiE9PXRoaXMuX3NpemUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSB0d28gZGltZW5zaW9uYWwgbWF0cml4IGlzIHN1cHBvcnRlZCIpO3JldHVybiBacCh0LHRoaXMuX3NpemVbMF0pLFpwKGUsdGhpcy5fc2l6ZVswXSksbi5fc3dhcFJvd3ModCxlLHRoaXMuX2RhdGEpLHRoaXN9LG4uX3N3YXBSb3dzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uW3RdO25bdF09bltlXSxuW2VdPXJ9LG59KSx7aXNDbGFzczohMH0pO2Z1bmN0aW9uIHZ5KHQsZSxuKXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQubWFwP3QubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdnkodCxlKX0pKTplKHQpfXZhciBfeT0iaXNJbnRlZ2VyIix4eT1pZChfeSxbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZShfeSx7bnVtYmVyOk1wLEJpZ051bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4gdC5pc0ludCgpfSxGcmFjdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQuZCYmaXNGaW5pdGUodC5uKX0sIkFycmF5IHwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT5lPT52eShlLHQpKSl9KX0pKSx3eT0ibnVtYmVyLCBudW1iZXIiO2Z1bmN0aW9uIGJ5KHQsZSl7cmV0dXJuIHQrZX1mdW5jdGlvbiBEeSh0LGUpe3JldHVybiB0KmV9ZnVuY3Rpb24gRXkodCxlLG4pe2lmKG51bGw9PW4pcmV0dXJuIHQuZXEoZSk7aWYodC5lcShlKSlyZXR1cm4hMDtpZih0LmlzTmFOKCl8fGUuaXNOYU4oKSlyZXR1cm4hMTtpZih0LmlzRmluaXRlKCkmJmUuaXNGaW5pdGUoKSl7dmFyIHI9dC5taW51cyhlKS5hYnMoKTtpZihyLmlzWmVybygpKXJldHVybiEwO3ZhciBpPXQuY29uc3RydWN0b3IubWF4KHQuYWJzKCksZS5hYnMoKSk7cmV0dXJuIHIubHRlKGkudGltZXMobikpfXJldHVybiExfWJ5LnNpZ25hdHVyZT13eSxEeS5zaWduYXR1cmU9d3k7dmFyIEN5PWlkKCJjb21wYXJlVW5pdHMiLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybnsiVW5pdCwgVW5pdCI6ZS5yZWZlclRvU2VsZigodD0+KG4scik9PntpZighbi5lcXVhbEJhc2UocikpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29tcGFyZSB1bml0cyB3aXRoIGRpZmZlcmVudCBiYXNlIik7cmV0dXJuIGUuZmluZCh0LFtuLnZhbHVlVHlwZSgpLHIudmFsdWVUeXBlKCldKShuLnZhbHVlLHIudmFsdWUpfSkpfX0pKSxTeT0iZXF1YWxTY2FsYXIiLEF5PWlkKFN5LFsidHlwZWQiLCJjb25maWciXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpufT10LHI9Q3koe3R5cGVkOmV9KTtyZXR1cm4gZShTeSx7ImJvb2xlYW4sIGJvb2xlYW4iOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfSwibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGtwKHQsZSxuLmVwc2lsb24pfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZXEoZSl8fEV5KHQsZSxuLmVwc2lsb24pfSwiRnJhY3Rpb24sIEZyYWN0aW9uIjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmVxdWFscyhlKX0sIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4ga3AodC5yZSxlLnJlLG4pJiZrcCh0LmltLGUuaW0sbil9KHQsZSxuLmVwc2lsb24pfX0scil9KSk7aWQoU3ksWyJ0eXBlZCIsImNvbmZpZyJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm59PXQ7cmV0dXJuIGUoU3kseyJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4ga3AodCxlLG4uZXBzaWxvbil9fSl9KSk7dmFyIE55PWlkKCJTcGFyc2VNYXRyaXgiLFsidHlwZWQiLCJlcXVhbFNjYWxhciIsIk1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsZXF1YWxTY2FsYXI6bixNYXRyaXg6cn09dDtmdW5jdGlvbiBpKHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgaSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3IiKTtpZihlJiYhamYoZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRhdGF0eXBlOiAiK2UpO2lmKHFmKHQpKSFmdW5jdGlvbih0LGUsbil7IlNwYXJzZU1hdHJpeCI9PT1lLnR5cGU/KHQuX3ZhbHVlcz1lLl92YWx1ZXM/d3AoZS5fdmFsdWVzKTp2b2lkIDAsdC5faW5kZXg9d3AoZS5faW5kZXgpLHQuX3B0cj13cChlLl9wdHIpLHQuX3NpemU9d3AoZS5fc2l6ZSksdC5fZGF0YXR5cGU9bnx8ZS5fZGF0YXR5cGUpOm8odCxlLnZhbHVlT2YoKSxufHxlLl9kYXRhdHlwZSl9KHRoaXMsdCxlKTtlbHNlIGlmKHQmJlVmKHQuaW5kZXgpJiZVZih0LnB0cikmJlVmKHQuc2l6ZSkpdGhpcy5fdmFsdWVzPXQudmFsdWVzLHRoaXMuX2luZGV4PXQuaW5kZXgsdGhpcy5fcHRyPXQucHRyLHRoaXMuX3NpemU9dC5zaXplLHRoaXMuX2RhdGF0eXBlPWV8fHQuZGF0YXR5cGU7ZWxzZSBpZihVZih0KSlvKHRoaXMsdCxlKTtlbHNle2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSBvZiBkYXRhICgiK3hwKHQpKyIpIik7dGhpcy5fdmFsdWVzPVtdLHRoaXMuX2luZGV4PVtdLHRoaXMuX3B0cj1bMF0sdGhpcy5fc2l6ZT1bMCwwXSx0aGlzLl9kYXRhdHlwZT1lfX1mdW5jdGlvbiBvKHQscixpKXt0Ll92YWx1ZXM9W10sdC5faW5kZXg9W10sdC5fcHRyPVtdLHQuX2RhdGF0eXBlPWk7dmFyIG89ci5sZW5ndGgscz0wLGE9bix1PTA7aWYoamYoaSkmJihhPWUuZmluZChuLFtpLGldKXx8bix1PWUuY29udmVydCgwLGkpKSxvPjApe3ZhciBjPTA7ZG97dC5fcHRyLnB1c2godC5faW5kZXgubGVuZ3RoKTtmb3IodmFyIGw9MDtsPG87bCsrKXt2YXIgaD1yW2xdO2lmKFVmKGgpKXtpZigwPT09YyYmczxoLmxlbmd0aCYmKHM9aC5sZW5ndGgpLGM8aC5sZW5ndGgpe3ZhciBmPWhbY107YShmLHUpfHwodC5fdmFsdWVzLnB1c2goZiksdC5faW5kZXgucHVzaChsKSl9fWVsc2UgMD09PWMmJnM8MSYmKHM9MSksYShoLHUpfHwodC5fdmFsdWVzLnB1c2goaCksdC5faW5kZXgucHVzaChsKSl9YysrfXdoaWxlKGM8cyl9dC5fcHRyLnB1c2godC5faW5kZXgubGVuZ3RoKSx0Ll9zaXplPVtvLHNdfWZ1bmN0aW9uIHModCxlLG4scil7aWYobi1lPT0wKXJldHVybiBuO2Zvcih2YXIgaT1lO2k8bjtpKyspaWYocltpXT09PXQpcmV0dXJuIGk7cmV0dXJuIGV9ZnVuY3Rpb24gYSh0LGUsbixyLGksbyxzKXtpLnNwbGljZSh0LDAsciksby5zcGxpY2UodCwwLGUpO2Zvcih2YXIgYT1uKzE7YTxzLmxlbmd0aDthKyspc1thXSsrfWZ1bmN0aW9uIHUodCxyLGksbyl7dmFyIHM9b3x8MCxhPW4sdT0wO2pmKHQuX2RhdGF0eXBlKSYmKGE9ZS5maW5kKG4sW3QuX2RhdGF0eXBlLHQuX2RhdGF0eXBlXSl8fG4sdT1lLmNvbnZlcnQoMCx0Ll9kYXRhdHlwZSkscz1lLmNvbnZlcnQocyx0Ll9kYXRhdHlwZSkpO3ZhciBjLGwsaCxmPSFhKHMsdSkscD10Ll9zaXplWzBdLGQ9dC5fc2l6ZVsxXTtpZihpPmQpe2ZvcihsPWQ7bDxpO2wrKylpZih0Ll9wdHJbbF09dC5fdmFsdWVzLmxlbmd0aCxmKWZvcihjPTA7YzxwO2MrKyl0Ll92YWx1ZXMucHVzaChzKSx0Ll9pbmRleC5wdXNoKGMpO3QuX3B0cltpXT10Ll92YWx1ZXMubGVuZ3RofWVsc2UgaTxkJiYodC5fcHRyLnNwbGljZShpKzEsZC1pKSx0Ll92YWx1ZXMuc3BsaWNlKHQuX3B0cltpXSx0Ll92YWx1ZXMubGVuZ3RoKSx0Ll9pbmRleC5zcGxpY2UodC5fcHRyW2ldLHQuX2luZGV4Lmxlbmd0aCkpO2lmKGQ9aSxyPnApe2lmKGYpe3ZhciBnPTA7Zm9yKGw9MDtsPGQ7bCsrKXt0Ll9wdHJbbF09dC5fcHRyW2xdK2csaD10Ll9wdHJbbCsxXStnO3ZhciB5PTA7Zm9yKGM9cDtjPHI7YysrLHkrKyl0Ll92YWx1ZXMuc3BsaWNlKGgreSwwLHMpLHQuX2luZGV4LnNwbGljZShoK3ksMCxjKSxnKyt9dC5fcHRyW2RdPXQuX3ZhbHVlcy5sZW5ndGh9fWVsc2UgaWYocjxwKXt2YXIgbT0wO2ZvcihsPTA7bDxkO2wrKyl7dC5fcHRyW2xdPXQuX3B0cltsXS1tO3ZhciB2PXQuX3B0cltsXSxfPXQuX3B0cltsKzFdLW07Zm9yKGg9djtoPF87aCsrKShjPXQuX2luZGV4W2hdKT5yLTEmJih0Ll92YWx1ZXMuc3BsaWNlKGgsMSksdC5faW5kZXguc3BsaWNlKGgsMSksbSsrKX10Ll9wdHJbbF09dC5fdmFsdWVzLmxlbmd0aH1yZXR1cm4gdC5fc2l6ZVswXT1yLHQuX3NpemVbMV09aSx0fWZ1bmN0aW9uIGModCxlLG4scixpKXt2YXIgbyxzLGE9clswXSx1PXJbMV0sYz1bXTtmb3Iobz0wO288YTtvKyspZm9yKGNbb109W10scz0wO3M8dTtzKyspY1tvXVtzXT0wO2ZvcihzPTA7czx1O3MrKylmb3IodmFyIGw9bltzXSxoPW5bcysxXSxmPWw7ZjxoO2YrKyljW289ZVtmXV1bc109dD9pP3dwKHRbZl0pOnRbZl06MTtyZXR1cm4gY31yZXR1cm4gaS5wcm90b3R5cGU9bmV3IHIsaS5wcm90b3R5cGUuY3JlYXRlU3BhcnNlTWF0cml4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBpKHQsZSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCJuYW1lIix7dmFsdWU6IlNwYXJzZU1hdHJpeCJ9KSxpLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLnR5cGU9IlNwYXJzZU1hdHJpeCIsaS5wcm90b3R5cGUuaXNTcGFyc2VNYXRyaXg9ITAsaS5wcm90b3R5cGUuZ2V0RGF0YVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gcmQodGhpcy5fdmFsdWVzLHhwKX0saS5wcm90b3R5cGUuc3RvcmFnZT1mdW5jdGlvbigpe3JldHVybiJzcGFyc2UifSxpLnByb3RvdHlwZS5kYXRhdHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhdHlwZX0saS5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBpKHQsZSl9LGkucHJvdG90eXBlLmRlbnNpdHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zaXplWzBdLGU9dGhpcy5fc2l6ZVsxXTtyZXR1cm4gMCE9PXQmJjAhPT1lP3RoaXMuX2luZGV4Lmxlbmd0aC8odCplKTowfSxpLnByb3RvdHlwZS5zdWJzZXQ9ZnVuY3Rpb24odCxlLG4pe2lmKCF0aGlzLl92YWx1ZXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHN1YnNldCBvbiBhIFBhdHRlcm4gb25seSBtYXRyaXgiKTtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbih0LGUpe2lmKCFXZihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGluZGV4Iik7dmFyIG49ZS5pc1NjYWxhcigpO2lmKG4pcmV0dXJuIHQuZ2V0KGUubWluKCkpO3ZhciByPWUuc2l6ZSgpO2lmKHIubGVuZ3RoIT09dC5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKHIubGVuZ3RoLHQuX3NpemUubGVuZ3RoKTt2YXIgbyxzLGEsdSxjPWUubWluKCksbD1lLm1heCgpO2ZvcihvPTAscz10Ll9zaXplLmxlbmd0aDtvPHM7bysrKVpwKGNbb10sdC5fc2l6ZVtvXSksWnAobFtvXSx0Ll9zaXplW29dKTt2YXIgaD10Ll92YWx1ZXMsZj10Ll9pbmRleCxwPXQuX3B0cixkPWUuZGltZW5zaW9uKDApLGc9ZS5kaW1lbnNpb24oMSkseT1bXSxtPVtdO2QuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXttW3RdPWVbMF0seVt0XT0hMH0pKTt2YXIgdj1oP1tdOnZvaWQgMCxfPVtdLHg9W107cmV0dXJuIGcuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zm9yKHgucHVzaChfLmxlbmd0aCksYT1wW3RdLHU9cFt0KzFdO2E8dTthKyspbz1mW2FdLCEwPT09eVtvXSYmKF8ucHVzaChtW29dKSx2JiZ2LnB1c2goaFthXSkpfSkpLHgucHVzaChfLmxlbmd0aCksbmV3IGkoe3ZhbHVlczp2LGluZGV4Ol8scHRyOngsc2l6ZTpyLGRhdGF0eXBlOnQuX2RhdGF0eXBlfSl9KHRoaXMsdCk7Y2FzZSAyOmNhc2UgMzpyZXR1cm4gZnVuY3Rpb24odCxlLG4scil7aWYoIWV8fCEwIT09ZS5pc0luZGV4KXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaW5kZXgiKTt2YXIgaSxvPWUuc2l6ZSgpLHM9ZS5pc1NjYWxhcigpO2lmKHFmKG4pPyhpPW4uc2l6ZSgpLG49bi50b0FycmF5KCkpOmk9WHAobikscyl7aWYoMCE9PWkubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlNjYWxhciBleHBlY3RlZCIpO3Quc2V0KGUubWluKCksbixyKX1lbHNle2lmKDEhPT1vLmxlbmd0aCYmMiE9PW8ubGVuZ3RoKXRocm93IG5ldyBHcChvLmxlbmd0aCx0Ll9zaXplLmxlbmd0aCwiPCIpO2lmKGkubGVuZ3RoPG8ubGVuZ3RoKXtmb3IodmFyIGE9MCx1PTA7MT09PW9bYV0mJjE9PT1pW2FdOylhKys7Zm9yKDsxPT09b1thXTspdSsrLGErKztuPWVkKG4sby5sZW5ndGgsdSxpKX1pZighYnAobyxpKSl0aHJvdyBuZXcgR3AobyxpLCI+Iik7aWYoMT09PW8ubGVuZ3RoKXtlLmRpbWVuc2lvbigwKS5mb3JFYWNoKChmdW5jdGlvbihlLGkpe1pwKGUpLHQuc2V0KFtlLDBdLG5baVswXV0scil9KSl9ZWxzZXt2YXIgYz1lLmRpbWVuc2lvbigwKSxsPWUuZGltZW5zaW9uKDEpO2MuZm9yRWFjaCgoZnVuY3Rpb24oZSxpKXtacChlKSxsLmZvckVhY2goKGZ1bmN0aW9uKG8scyl7WnAobyksdC5zZXQoW2Usb10sbltpWzBdXVtzWzBdXSxyKX0pKX0pKX19cmV0dXJuIHR9KHRoaXMsdCxlLG4pO2RlZmF1bHQ6dGhyb3cgbmV3IFN5bnRheEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIil9fSxpLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYoIVVmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkIik7aWYodC5sZW5ndGghPT10aGlzLl9zaXplLmxlbmd0aCl0aHJvdyBuZXcgR3AodC5sZW5ndGgsdGhpcy5fc2l6ZS5sZW5ndGgpO2lmKCF0aGlzLl92YWx1ZXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGdldCBvbiBhIFBhdHRlcm4gb25seSBtYXRyaXgiKTt2YXIgZT10WzBdLG49dFsxXTtacChlLHRoaXMuX3NpemVbMF0pLFpwKG4sdGhpcy5fc2l6ZVsxXSk7dmFyIHI9cyhlLHRoaXMuX3B0cltuXSx0aGlzLl9wdHJbbisxXSx0aGlzLl9pbmRleCk7cmV0dXJuIHI8dGhpcy5fcHRyW24rMV0mJnRoaXMuX2luZGV4W3JdPT09ZT90aGlzLl92YWx1ZXNbcl06MH0saS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQscixpKXtpZighVWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aCE9PXRoaXMuX3NpemUubGVuZ3RoKXRocm93IG5ldyBHcCh0Lmxlbmd0aCx0aGlzLl9zaXplLmxlbmd0aCk7aWYoIXRoaXMuX3ZhbHVlcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc2V0IG9uIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO3ZhciBvPXRbMF0sYz10WzFdLGw9dGhpcy5fc2l6ZVswXSxoPXRoaXMuX3NpemVbMV0sZj1uLHA9MDtqZih0aGlzLl9kYXRhdHlwZSkmJihmPWUuZmluZChuLFt0aGlzLl9kYXRhdHlwZSx0aGlzLl9kYXRhdHlwZV0pfHxuLHA9ZS5jb252ZXJ0KDAsdGhpcy5fZGF0YXR5cGUpKSwobz5sLTF8fGM+aC0xKSYmKHUodGhpcyxNYXRoLm1heChvKzEsbCksTWF0aC5tYXgoYysxLGgpLGkpLGw9dGhpcy5fc2l6ZVswXSxoPXRoaXMuX3NpemVbMV0pLFpwKG8sbCksWnAoYyxoKTt2YXIgZD1zKG8sdGhpcy5fcHRyW2NdLHRoaXMuX3B0cltjKzFdLHRoaXMuX2luZGV4KTtyZXR1cm4gZDx0aGlzLl9wdHJbYysxXSYmdGhpcy5faW5kZXhbZF09PT1vP2YocixwKT9mdW5jdGlvbih0LGUsbixyLGkpe24uc3BsaWNlKHQsMSksci5zcGxpY2UodCwxKTtmb3IodmFyIG89ZSsxO288aS5sZW5ndGg7bysrKWlbb10tLX0oZCxjLHRoaXMuX3ZhbHVlcyx0aGlzLl9pbmRleCx0aGlzLl9wdHIpOnRoaXMuX3ZhbHVlc1tkXT1yOmYocixwKXx8YShkLG8sYyxyLHRoaXMuX3ZhbHVlcyx0aGlzLl9pbmRleCx0aGlzLl9wdHIpLHRoaXN9LGkucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0LGUsbil7aWYoIVZmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IG9yIE1hdHJpeCBleHBlY3RlZCIpO3ZhciByPXQudmFsdWVPZigpLm1hcCgodD0+QXJyYXkuaXNBcnJheSh0KSYmMT09PXQubGVuZ3RoP3RbMF06dCkpO2lmKDIhPT1yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk9ubHkgdHdvIGRpbWVuc2lvbnMgbWF0cml4IGFyZSBzdXBwb3J0ZWQiKTtyZXR1cm4gci5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighUGYodCl8fCFNcCh0KXx8dDwwKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgc2l6ZSwgbXVzdCBjb250YWluIHBvc2l0aXZlIGludGVnZXJzIChzaXplOiAiK3FwKHIpKyIpIil9KSksdShuP3RoaXMuY2xvbmUoKTp0aGlzLHJbMF0sclsxXSxlKX0saS5wcm90b3R5cGUucmVzaGFwZT1mdW5jdGlvbih0LGUpe2lmKCFVZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCIpO2lmKDIhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlNwYXJzZSBtYXRyaWNlcyBjYW4gb25seSBiZSByZXNoYXBlZCBpbiB0d28gZGltZW5zaW9ucyIpO3QuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoIVBmKGUpfHwhTXAoZSl8fGU8PS0yfHwwPT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIHNpemUsIG11c3QgY29udGFpbiBwb3NpdGl2ZSBpbnRlZ2VycyBvciAtMSAoc2l6ZTogIitxcCh0KSsiKSIpfSkpO3ZhciBuPXRoaXMuX3NpemVbMF0qdGhpcy5fc2l6ZVsxXTtpZihuIT09KHQ9JHAodCxuKSlbMF0qdFsxXSl0aHJvdyBuZXcgRXJyb3IoIlJlc2hhcGluZyBzcGFyc2UgbWF0cml4IHdpbGwgcmVzdWx0IGluIHRoZSB3cm9uZyBudW1iZXIgb2YgZWxlbWVudHMiKTt2YXIgcj1lP3RoaXMuY2xvbmUoKTp0aGlzO2lmKHRoaXMuX3NpemVbMF09PT10WzBdJiZ0aGlzLl9zaXplWzFdPT09dFsxXSlyZXR1cm4gcjtmb3IodmFyIGk9W10sbz0wO288ci5fcHRyLmxlbmd0aDtvKyspZm9yKHZhciB1PTA7dTxyLl9wdHJbbysxXS1yLl9wdHJbb107dSsrKWkucHVzaChvKTtmb3IodmFyIGM9ci5fdmFsdWVzLnNsaWNlKCksbD1yLl9pbmRleC5zbGljZSgpLGg9MDtoPHIuX2luZGV4Lmxlbmd0aDtoKyspe3ZhciBmPWxbaF0scD1pW2hdLGQ9ZipyLl9zaXplWzFdK3A7aVtoXT1kJXRbMV0sbFtoXT1NYXRoLmZsb29yKGQvdFsxXSl9ci5fdmFsdWVzLmxlbmd0aD0wLHIuX2luZGV4Lmxlbmd0aD0wLHIuX3B0ci5sZW5ndGg9dFsxXSsxLHIuX3NpemU9dC5zbGljZSgpO2Zvcih2YXIgZz0wO2c8ci5fcHRyLmxlbmd0aDtnKyspci5fcHRyW2ddPTA7Zm9yKHZhciB5PTA7eTxjLmxlbmd0aDt5Kyspe3ZhciBtPWxbeV0sdj1pW3ldLF89Y1t5XTthKHMobSxyLl9wdHJbdl0sci5fcHRyW3YrMV0sci5faW5kZXgpLG0sdixfLHIuX3ZhbHVlcyxyLl9pbmRleCxyLl9wdHIpfXJldHVybiByfSxpLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgaSh7dmFsdWVzOnRoaXMuX3ZhbHVlcz93cCh0aGlzLl92YWx1ZXMpOnZvaWQgMCxpbmRleDp3cCh0aGlzLl9pbmRleCkscHRyOndwKHRoaXMuX3B0ciksc2l6ZTp3cCh0aGlzLl9zaXplKSxkYXRhdHlwZTp0aGlzLl9kYXRhdHlwZX0pfSxpLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NpemUuc2xpY2UoMCl9LGkucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0LHIpe2lmKCF0aGlzLl92YWx1ZXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIG1hcCBvbiBhIFBhdHRlcm4gb25seSBtYXRyaXgiKTt2YXIgbz10aGlzLHM9dGhpcy5fc2l6ZVswXSxhPXRoaXMuX3NpemVbMV0sdT15eSh0KTtyZXR1cm4gZnVuY3Rpb24odCxyLG8scyxhLHUsYyl7dmFyIGw9W10saD1bXSxmPVtdLHA9bixkPTA7amYodC5fZGF0YXR5cGUpJiYocD1lLmZpbmQobixbdC5fZGF0YXR5cGUsdC5fZGF0YXR5cGVdKXx8bixkPWUuY29udmVydCgwLHQuX2RhdGF0eXBlKSk7Zm9yKHZhciBnPWZ1bmN0aW9uKHQsZSxuKXt0PXUodCxlLG4pLHAodCxkKXx8KGwucHVzaCh0KSxoLnB1c2goZSkpfSx5PXM7eTw9YTt5Kyspe2YucHVzaChsLmxlbmd0aCk7dmFyIG09dC5fcHRyW3ldLHY9dC5fcHRyW3krMV07aWYoYylmb3IodmFyIF89bTtfPHY7XysrKXt2YXIgeD10Ll9pbmRleFtfXTt4Pj1yJiZ4PD1vJiZnKHQuX3ZhbHVlc1tfXSx4LXIseS1zKX1lbHNle2Zvcih2YXIgdz17fSxiPW07Yjx2O2IrKyl7d1t0Ll9pbmRleFtiXV09dC5fdmFsdWVzW2JdfWZvcih2YXIgRD1yO0Q8PW87RCsrKXtnKEQgaW4gdz93W0RdOjAsRC1yLHktcyl9fX1yZXR1cm4gZi5wdXNoKGwubGVuZ3RoKSxuZXcgaSh7dmFsdWVzOmwsaW5kZXg6aCxwdHI6ZixzaXplOltvLXIrMSxhLXMrMV19KX0odGhpcywwLHMtMSwwLGEtMSwoZnVuY3Rpb24oZSxuLHIpe3JldHVybiAxPT09dT90KGUpOjI9PT11P3QoZSxbbixyXSk6dChlLFtuLHJdLG8pfSkscil9LGkucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCxlKXtpZighdGhpcy5fdmFsdWVzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBmb3JFYWNoIG9uIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO2Zvcih2YXIgbj10aGlzLl9zaXplWzBdLHI9dGhpcy5fc2l6ZVsxXSxpPTA7aTxyO2krKyl7dmFyIG89dGhpcy5fcHRyW2ldLHM9dGhpcy5fcHRyW2krMV07aWYoZSlmb3IodmFyIGE9bzthPHM7YSsrKXt2YXIgdT10aGlzLl9pbmRleFthXTt0KHRoaXMuX3ZhbHVlc1thXSxbdSxpXSx0aGlzKX1lbHNle2Zvcih2YXIgYz17fSxsPW87bDxzO2wrKyl7Y1t0aGlzLl9pbmRleFtsXV09dGhpcy5fdmFsdWVzW2xdfWZvcih2YXIgaD0wO2g8bjtoKyspe3QoaCBpbiBjP2NbaF06MCxbaCxpXSx0aGlzKX19fX0saS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbiooKXtpZighdGhpcy5fdmFsdWVzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGl0ZXJhdGUgYSBQYXR0ZXJuIG9ubHkgbWF0cml4Iik7Zm9yKHZhciB0PXRoaXMuX3NpemVbMV0sZT0wO2U8dDtlKyspZm9yKHZhciBuPXRoaXMuX3B0cltlXSxyPXRoaXMuX3B0cltlKzFdLGk9bjtpPHI7aSsrKXt2YXIgbz10aGlzLl9pbmRleFtpXTt5aWVsZHt2YWx1ZTp0aGlzLl92YWx1ZXNbaV0saW5kZXg6W28sZV19fX0saS5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiBjKHRoaXMuX3ZhbHVlcyx0aGlzLl9pbmRleCx0aGlzLl9wdHIsdGhpcy5fc2l6ZSwhMCl9LGkucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXtyZXR1cm4gYyh0aGlzLl92YWx1ZXMsdGhpcy5faW5kZXgsdGhpcy5fcHRyLHRoaXMuX3NpemUsITEpfSxpLnByb3RvdHlwZS5mb3JtYXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX3NpemVbMF0sbj10aGlzLl9zaXplWzFdLHI9dGhpcy5kZW5zaXR5KCksaT0iU3BhcnNlIE1hdHJpeCBbIitxcChlLHQpKyIgeCAiK3FwKG4sdCkrIl0gZGVuc2l0eTogIitxcChyLHQpKyJcbiIsbz0wO288bjtvKyspZm9yKHZhciBzPXRoaXMuX3B0cltvXSxhPXRoaXMuX3B0cltvKzFdLHU9czt1PGE7dSsrKXtpKz0iXG4gICAgKCIrcXAodGhpcy5faW5kZXhbdV0sdCkrIiwgIitxcChvLHQpKyIpID09PiAiKyh0aGlzLl92YWx1ZXM/cXAodGhpcy5fdmFsdWVzW3VdLHQpOiJYIil9cmV0dXJuIGl9LGkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHFwKHRoaXMudG9BcnJheSgpKX0saS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21hdGhqczoiU3BhcnNlTWF0cml4Iix2YWx1ZXM6dGhpcy5fdmFsdWVzLGluZGV4OnRoaXMuX2luZGV4LHB0cjp0aGlzLl9wdHIsc2l6ZTp0aGlzLl9zaXplLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfX0saS5wcm90b3R5cGUuZGlhZ29uYWw9ZnVuY3Rpb24odCl7aWYodCl7aWYoUmYodCkmJih0PXQudG9OdW1iZXIoKSksIVBmKHQpfHwhTXAodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIHBhcmFtZXRlciBrIG11c3QgYmUgYW4gaW50ZWdlciBudW1iZXIiKX1lbHNlIHQ9MDt2YXIgZT10PjA/dDowLG49dDwwPy10OjAscj10aGlzLl9zaXplWzBdLG89dGhpcy5fc2l6ZVsxXSxzPU1hdGgubWluKHItbixvLWUpLGE9W10sdT1bXSxjPVtdO2NbMF09MDtmb3IodmFyIGw9ZTtsPG8mJmEubGVuZ3RoPHM7bCsrKWZvcih2YXIgaD10aGlzLl9wdHJbbF0sZj10aGlzLl9wdHJbbCsxXSxwPWg7cDxmO3ArKyl7dmFyIGQ9dGhpcy5faW5kZXhbcF07aWYoZD09PWwtZStuKXthLnB1c2godGhpcy5fdmFsdWVzW3BdKSx1W2EubGVuZ3RoLTFdPWQtbjticmVha319cmV0dXJuIGMucHVzaChhLmxlbmd0aCksbmV3IGkoe3ZhbHVlczphLGluZGV4OnUscHRyOmMsc2l6ZTpbcywxXX0pfSxpLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaSh0KX0saS5kaWFnb25hbD1mdW5jdGlvbih0LHIsbyxzLGEpe2lmKCFVZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCwgc2l6ZSBwYXJhbWV0ZXIiKTtpZigyIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJPbmx5IHR3byBkaW1lbnNpb25zIG1hdHJpeCBhcmUgc3VwcG9ydGVkIik7aWYodD10Lm1hcCgoZnVuY3Rpb24odCl7aWYoUmYodCkmJih0PXQudG9OdW1iZXIoKSksIVBmKHQpfHwhTXAodCl8fHQ8MSl0aHJvdyBuZXcgRXJyb3IoIlNpemUgdmFsdWVzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKTtyZXR1cm4gdH0pKSxvKXtpZihSZihvKSYmKG89by50b051bWJlcigpKSwhUGYobyl8fCFNcChvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFyYW1ldGVyIGsgbXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlciIpfWVsc2Ugbz0wO3ZhciB1PW4sYz0wO2pmKGEpJiYodT1lLmZpbmQobixbYSxhXSl8fG4sYz1lLmNvbnZlcnQoMCxhKSk7dmFyIGwsaD1vPjA/bzowLGY9bzwwPy1vOjAscD10WzBdLGQ9dFsxXSxnPU1hdGgubWluKHAtZixkLWgpO2lmKFVmKHIpKXtpZihyLmxlbmd0aCE9PWcpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHZhbHVlIGFycmF5IGxlbmd0aCIpO2w9ZnVuY3Rpb24odCl7cmV0dXJuIHJbdF19fWVsc2UgaWYocWYocikpe3ZhciB5PXIuc2l6ZSgpO2lmKDEhPT15Lmxlbmd0aHx8eVswXSE9PWcpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG1hdHJpeCBsZW5ndGgiKTtsPWZ1bmN0aW9uKHQpe3JldHVybiByLmdldChbdF0pfX1lbHNlIGw9ZnVuY3Rpb24oKXtyZXR1cm4gcn07Zm9yKHZhciBtPVtdLHY9W10sXz1bXSx4PTA7eDxkO3grKyl7Xy5wdXNoKG0ubGVuZ3RoKTt2YXIgdz14LWg7aWYodz49MCYmdzxnKXt2YXIgYj1sKHcpO3UoYixjKXx8KHYucHVzaCh3K2YpLG0ucHVzaChiKSl9fXJldHVybiBfLnB1c2gobS5sZW5ndGgpLG5ldyBpKHt2YWx1ZXM6bSxpbmRleDp2LHB0cjpfLHNpemU6W3AsZF19KX0saS5wcm90b3R5cGUuc3dhcFJvd3M9ZnVuY3Rpb24odCxlKXtpZighKFBmKHQpJiZNcCh0KSYmUGYoZSkmJk1wKGUpKSl0aHJvdyBuZXcgRXJyb3IoIlJvdyBpbmRleCBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzIik7aWYoMiE9PXRoaXMuX3NpemUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSB0d28gZGltZW5zaW9uYWwgbWF0cml4IGlzIHN1cHBvcnRlZCIpO3JldHVybiBacCh0LHRoaXMuX3NpemVbMF0pLFpwKGUsdGhpcy5fc2l6ZVswXSksaS5fc3dhcFJvd3ModCxlLHRoaXMuX3NpemVbMV0sdGhpcy5fdmFsdWVzLHRoaXMuX2luZGV4LHRoaXMuX3B0ciksdGhpc30saS5fZm9yRWFjaFJvdz1mdW5jdGlvbih0LGUsbixyLGkpe2Zvcih2YXIgbz1yW3RdLHM9clt0KzFdLGE9bzthPHM7YSsrKWkoblthXSxlW2FdKX0saS5fc3dhcFJvd3M9ZnVuY3Rpb24odCxlLG4scixpLG8pe2Zvcih2YXIgYT0wO2E8bjthKyspe3ZhciB1PW9bYV0sYz1vW2ErMV0sbD1zKHQsdSxjLGkpLGg9cyhlLHUsYyxpKTtpZihsPGMmJmg8YyYmaVtsXT09PXQmJmlbaF09PT1lKXtpZihyKXt2YXIgZj1yW2xdO3JbbF09cltoXSxyW2hdPWZ9fWVsc2UgaWYobDxjJiZpW2xdPT09dCYmKGg+PWN8fGlbaF0hPT1lKSl7dmFyIHA9cj9yW2xdOnZvaWQgMDtpLnNwbGljZShoLDAsZSksciYmci5zcGxpY2UoaCwwLHApLGkuc3BsaWNlKGg8PWw/bCsxOmwsMSksciYmci5zcGxpY2UoaDw9bD9sKzE6bCwxKX1lbHNlIGlmKGg8YyYmaVtoXT09PWUmJihsPj1jfHxpW2xdIT09dCkpe3ZhciBkPXI/cltoXTp2b2lkIDA7aS5zcGxpY2UobCwwLHQpLHImJnIuc3BsaWNlKGwsMCxkKSxpLnNwbGljZShsPD1oP2grMTpoLDEpLHImJnIuc3BsaWNlKGw8PWg/aCsxOmgsMSl9fX0saX0pLHtpc0NsYXNzOiEwfSk7dmFyIEl5PWlkKCJudW1iZXIiLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10LG49ZSgibnVtYmVyIix7IiI6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxzdHJpbmc6ZnVuY3Rpb24odCl7aWYoIk5hTiI9PT10KXJldHVybiBOYU47dmFyIGU9ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXRjaCgvKDBbYm94XSkoWzAtOWEtZkEtRl0qKVwuKFswLTlhLWZBLUZdKikvKTtyZXR1cm4gZT97aW5wdXQ6dCxyYWRpeDp7IjBiIjoyLCIwbyI6OCwiMHgiOjE2fVtlWzFdXSxpbnRlZ2VyUGFydDplWzJdLGZyYWN0aW9uYWxQYXJ0OmVbM119Om51bGx9KHQpO2lmKGUpcmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1wYXJzZUludCh0LmludGVnZXJQYXJ0LHQucmFkaXgpLG49MCxyPTA7cjx0LmZyYWN0aW9uYWxQYXJ0Lmxlbmd0aDtyKyspbis9cGFyc2VJbnQodC5mcmFjdGlvbmFsUGFydFtyXSx0LnJhZGl4KS9NYXRoLnBvdyh0LnJhZGl4LHIrMSk7dmFyIGk9ZStuO2lmKGlzTmFOKGkpKXRocm93IG5ldyBTeW50YXhFcnJvcignU3RyaW5nICInK3QuaW5wdXQrJyIgaXMgbm8gdmFsaWQgbnVtYmVyJyk7cmV0dXJuIGl9KGUpO3ZhciBuPTAscj10Lm1hdGNoKC8oMFtib3hdWzAtOWEtZkEtRl0qKWkoWzAtOV0qKS8pO3ImJihuPU51bWJlcihyWzJdKSx0PXJbMV0pO3ZhciBpPU51bWJlcih0KTtpZihpc05hTihpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N0cmluZyAiJyt0KyciIGlzIG5vIHZhbGlkIG51bWJlcicpO2lmKHIpe2lmKGk+SWYoMixuKS0xKXRocm93IG5ldyBTeW50YXhFcnJvcignU3RyaW5nICInLmNvbmNhdCh0LCciIGlzIG91dCBvZiByYW5nZScpKTtpPj1JZigyLG4tMSkmJihpLT1JZigyLG4pKX1yZXR1cm4gaX0sQmlnTnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvTnVtYmVyKCl9LEZyYWN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlT2YoKX0sVW5pdDplLnJlZmVyVG9TZWxmKCh0PT5lPT57dmFyIG49ZS5jbG9uZSgpO3JldHVybiBuLnZhbHVlPXQoZS52YWx1ZSksbn0pKSxudWxsOmZ1bmN0aW9uKHQpe3JldHVybiAwfSwiVW5pdCwgc3RyaW5nIHwgVW5pdCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b051bWJlcihlKX0sIkFycmF5IHwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT5lPT52eShlLHQpKSl9KTtyZXR1cm4gbi5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VGbG9hdCh0LnZhbHVlKX0sbn0pKSxNeT1pZCgiYmlnbnVtYmVyIixbInR5cGVkIiwiQmlnTnVtYmVyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxCaWdOdW1iZXI6bn09dDtyZXR1cm4gZSgiYmlnbnVtYmVyIix7IiI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4oMCl9LG51bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odCsiIil9LHN0cmluZzpmdW5jdGlvbih0KXt2YXIgZT10Lm1hdGNoKC8oMFtib3hdWzAtOWEtZkEtRl0qKWkoWzAtOV0qKS8pO2lmKGUpe3ZhciByPWVbMl0saT1uKGVbMV0pLG89bmV3IG4oMikucG93KE51bWJlcihyKSk7aWYoaS5ndChvLnN1YigxKSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCdTdHJpbmcgIicuY29uY2F0KHQsJyIgaXMgb3V0IG9mIHJhbmdlJykpO3ZhciBzPW5ldyBuKDIpLnBvdyhOdW1iZXIociktMSk7cmV0dXJuIGkuZ3RlKHMpP2kuc3ViKG8pOml9cmV0dXJuIG5ldyBuKHQpfSxCaWdOdW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LFVuaXQ6ZS5yZWZlclRvU2VsZigodD0+ZT0+e3ZhciBuPWUuY2xvbmUoKTtyZXR1cm4gbi52YWx1ZT10KGUudmFsdWUpLG59KSksRnJhY3Rpb246ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQubikuZGl2KHQuZCkudGltZXModC5zKX0sbnVsbDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4oMCl9LCJBcnJheSB8IE1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+ZT0+dnkoZSx0KSkpfSl9KSksRnk9aWQoImZyYWN0aW9uIixbInR5cGVkIiwiRnJhY3Rpb24iXSwodD0+e3Zhcnt0eXBlZDplLEZyYWN0aW9uOm59PXQ7cmV0dXJuIGUoImZyYWN0aW9uIix7bnVtYmVyOmZ1bmN0aW9uKHQpe2lmKCFpc0Zpbml0ZSh0KXx8aXNOYU4odCkpdGhyb3cgbmV3IEVycm9yKHQrIiBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgYSBmcmFjdGlvbiIpO3JldHVybiBuZXcgbih0KX0sc3RyaW5nOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbih0KX0sIm51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiBuZXcgbih0LGUpfSxudWxsOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbigwKX0sQmlnTnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbih0LnRvU3RyaW5nKCkpfSxGcmFjdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sVW5pdDplLnJlZmVyVG9TZWxmKCh0PT5lPT57dmFyIG49ZS5jbG9uZSgpO3JldHVybiBuLnZhbHVlPXQoZS52YWx1ZSksbn0pKSxPYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQpfSwiQXJyYXkgfCBNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PmU9PnZ5KGUsdCkpKX0pfSkpLFR5PSJtYXRyaXgiLE95PWlkKFR5LFsidHlwZWQiLCJNYXRyaXgiLCJEZW5zZU1hdHJpeCIsIlNwYXJzZU1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsTWF0cml4Om4sRGVuc2VNYXRyaXg6cixTcGFyc2VNYXRyaXg6aX09dDtyZXR1cm4gZShUeSx7IiI6ZnVuY3Rpb24oKXtyZXR1cm4gbyhbXSl9LHN0cmluZzpmdW5jdGlvbih0KXtyZXR1cm4gbyhbXSx0KX0sInN0cmluZywgc3RyaW5nIjpmdW5jdGlvbih0LGUpe3JldHVybiBvKFtdLHQsZSl9LEFycmF5OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQpfSxNYXRyaXg6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCx0LnN0b3JhZ2UoKSl9LCJBcnJheSB8IE1hdHJpeCwgc3RyaW5nIjpvLCJBcnJheSB8IE1hdHJpeCwgc3RyaW5nLCBzdHJpbmciOm99KTtmdW5jdGlvbiBvKHQsZSxuKXtpZigiZGVuc2UiPT09ZXx8ImRlZmF1bHQiPT09ZXx8dm9pZCAwPT09ZSlyZXR1cm4gbmV3IHIodCxuKTtpZigic3BhcnNlIj09PWUpcmV0dXJuIG5ldyBpKHQsbik7dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBtYXRyaXggdHlwZSAiK0pTT04uc3RyaW5naWZ5KGUpKyIuIil9fSkpLEx5PSJhZGRTY2FsYXIiLFB5PWlkKEx5LFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBlKEx5LHsibnVtYmVyLCBudW1iZXIiOmJ5LCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmFkZChlKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnBsdXMoZSl9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYWRkKGUpfSwiVW5pdCwgVW5pdCI6ZS5yZWZlclRvU2VsZigodD0+KG4scik9PntpZihudWxsPT09bi52YWx1ZXx8dm9pZCAwPT09bi52YWx1ZSl0aHJvdyBuZXcgRXJyb3IoIlBhcmFtZXRlciB4IGNvbnRhaW5zIGEgdW5pdCB3aXRoIHVuZGVmaW5lZCB2YWx1ZSIpO2lmKG51bGw9PT1yLnZhbHVlfHx2b2lkIDA9PT1yLnZhbHVlKXRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVyIHkgY29udGFpbnMgYSB1bml0IHdpdGggdW5kZWZpbmVkIHZhbHVlIik7aWYoIW4uZXF1YWxCYXNlKHIpKXRocm93IG5ldyBFcnJvcigiVW5pdHMgZG8gbm90IG1hdGNoIik7dmFyIGk9bi5jbG9uZSgpO3JldHVybiBpLnZhbHVlPWUuZmluZCh0LFtpLnZhbHVlVHlwZSgpLHIudmFsdWVUeXBlKCldKShpLnZhbHVlLHIudmFsdWUpLGkuZml4UHJlZml4PSExLGl9KSl9KX0pKSxSeT1pZCgibWF0QWxnbzExeFMwcyIsWyJ0eXBlZCIsImVxdWFsU2NhbGFyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpufT10O3JldHVybiBmdW5jdGlvbih0LHIsaSxvKXt2YXIgcz10Ll92YWx1ZXMsYT10Ll9pbmRleCx1PXQuX3B0cixjPXQuX3NpemUsbD10Ll9kYXRhdHlwZTtpZighcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBvbiBQYXR0ZXJuIFNwYXJzZSBNYXRyaXggYW5kIFNjYWxhciB2YWx1ZSIpO3ZhciBoLGY9Y1swXSxwPWNbMV0sZD1uLGc9MCx5PWk7InN0cmluZyI9PXR5cGVvZiBsJiYoaD1sLGQ9ZS5maW5kKG4sW2gsaF0pLGc9ZS5jb252ZXJ0KDAsaCkscj1lLmNvbnZlcnQocixoKSx5PWUuZmluZChpLFtoLGhdKSk7Zm9yKHZhciBtPVtdLHY9W10sXz1bXSx4PTA7eDxwO3grKyl7X1t4XT12Lmxlbmd0aDtmb3IodmFyIHc9dVt4XSxiPXVbeCsxXSxEPXc7RDxiO0QrKyl7dmFyIEU9YVtEXSxDPW8/eShyLHNbRF0pOnkoc1tEXSxyKTtkKEMsZyl8fCh2LnB1c2goRSksbS5wdXNoKEMpKX19cmV0dXJuIF9bcF09di5sZW5ndGgsdC5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczptLGluZGV4OnYscHRyOl8sc2l6ZTpbZixwXSxkYXRhdHlwZTpofSl9fSkpLEJ5PWlkKCJtYXRBbGdvMTJ4U2ZzIixbInR5cGVkIiwiRGVuc2VNYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLERlbnNlTWF0cml4Om59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpLG8pe3ZhciBzPXQuX3ZhbHVlcyxhPXQuX2luZGV4LHU9dC5fcHRyLGM9dC5fc2l6ZSxsPXQuX2RhdGF0eXBlO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIG9uIFBhdHRlcm4gU3BhcnNlIE1hdHJpeCBhbmQgU2NhbGFyIHZhbHVlIik7dmFyIGgsZj1jWzBdLHA9Y1sxXSxkPWk7InN0cmluZyI9PXR5cGVvZiBsJiYoaD1sLHI9ZS5jb252ZXJ0KHIsaCksZD1lLmZpbmQoaSxbaCxoXSkpO2Zvcih2YXIgZz1bXSx5PVtdLG09W10sdj0wO3Y8cDt2Kyspe2Zvcih2YXIgXz12KzEseD11W3ZdLHc9dVt2KzFdLGI9eDtiPHc7YisrKXt2YXIgRD1hW2JdO3lbRF09c1tiXSxtW0RdPV99Zm9yKHZhciBFPTA7RTxmO0UrKykwPT09diYmKGdbRV09W10pLG1bRV09PT1fP2dbRV1bdl09bz9kKHIseVtFXSk6ZCh5W0VdLHIpOmdbRV1bdl09bz9kKHIsMCk6ZCgwLHIpfXJldHVybiBuZXcgbih7ZGF0YTpnLHNpemU6W2YscF0sZGF0YXR5cGU6aH0pfX0pKSxreT1pZCgibWF0QWxnbzE0eERzIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGksbyl7dmFyIHMsYT10Ll9kYXRhLHU9dC5fc2l6ZSxjPXQuX2RhdGF0eXBlLGw9aTsic3RyaW5nIj09dHlwZW9mIGMmJihzPWMscj1lLmNvbnZlcnQocixzKSxsPWUuZmluZChpLFtzLHNdKSk7dmFyIGg9dS5sZW5ndGg+MD9uKGwsMCx1LHVbMF0sYSxyLG8pOltdO3JldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOmgsc2l6ZTp3cCh1KSxkYXRhdHlwZTpzfSl9O2Z1bmN0aW9uIG4odCxlLHIsaSxvLHMsYSl7dmFyIHU9W107aWYoZT09PXIubGVuZ3RoLTEpZm9yKHZhciBjPTA7YzxpO2MrKyl1W2NdPWE/dChzLG9bY10pOnQob1tjXSxzKTtlbHNlIGZvcih2YXIgbD0wO2w8aTtsKyspdVtsXT1uKHQsZSsxLHIscltlKzFdLG9bbF0scyxhKTtyZXR1cm4gdX19KSksenk9aWQoIm1hdEFsZ28wMXhEU2lkIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZnVuY3Rpb24odCxuLHIsaSl7dmFyIG89dC5fZGF0YSxzPXQuX3NpemUsYT10Ll9kYXRhdHlwZSx1PW4uX3ZhbHVlcyxjPW4uX2luZGV4LGw9bi5fcHRyLGg9bi5fc2l6ZSxmPW4uX2RhdGF0eXBlO2lmKHMubGVuZ3RoIT09aC5sZW5ndGgpdGhyb3cgbmV3IEdwKHMubGVuZ3RoLGgubGVuZ3RoKTtpZihzWzBdIT09aFswXXx8c1sxXSE9PWhbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrcysiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK2grIikiKTtpZighdSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBvbiBEZW5zZSBNYXRyaXggYW5kIFBhdHRlcm4gU3BhcnNlIE1hdHJpeCIpO3ZhciBwLGQsZz1zWzBdLHk9c1sxXSxtPSJzdHJpbmciPT10eXBlb2YgYSYmYT09PWY/YTp2b2lkIDAsdj1tP2UuZmluZChyLFttLG1dKTpyLF89W107Zm9yKHA9MDtwPGc7cCsrKV9bcF09W107dmFyIHg9W10sdz1bXTtmb3IoZD0wO2Q8eTtkKyspe2Zvcih2YXIgYj1kKzEsRD1sW2RdLEU9bFtkKzFdLEM9RDtDPEU7QysrKXhbcD1jW0NdXT1pP3YodVtDXSxvW3BdW2RdKTp2KG9bcF1bZF0sdVtDXSksd1twXT1iO2ZvcihwPTA7cDxnO3ArKyl3W3BdPT09Yj9fW3BdW2RdPXhbcF06X1twXVtkXT1vW3BdW2RdfXJldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOl8sc2l6ZTpbZyx5XSxkYXRhdHlwZTptfSl9fSkpLGp5PWlkKCJtYXRBbGdvMDR4U2lkU2lkIixbInR5cGVkIiwiZXF1YWxTY2FsYXIiXSwodD0+e3Zhcnt0eXBlZDplLGVxdWFsU2NhbGFyOm59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpKXt2YXIgbz10Ll92YWx1ZXMscz10Ll9pbmRleCxhPXQuX3B0cix1PXQuX3NpemUsYz10Ll9kYXRhdHlwZSxsPXIuX3ZhbHVlcyxoPXIuX2luZGV4LGY9ci5fcHRyLHA9ci5fc2l6ZSxkPXIuX2RhdGF0eXBlO2lmKHUubGVuZ3RoIT09cC5sZW5ndGgpdGhyb3cgbmV3IEdwKHUubGVuZ3RoLHAubGVuZ3RoKTtpZih1WzBdIT09cFswXXx8dVsxXSE9PXBbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrdSsiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK3ArIikiKTt2YXIgZyx5PXVbMF0sbT11WzFdLHY9bixfPTAseD1pOyJzdHJpbmciPT10eXBlb2YgYyYmYz09PWQmJihnPWMsdj1lLmZpbmQobixbZyxnXSksXz1lLmNvbnZlcnQoMCxnKSx4PWUuZmluZChpLFtnLGddKSk7dmFyIHcsYixELEUsQyxTPW8mJmw/W106dm9pZCAwLEE9W10sTj1bXSxJPW8mJmw/W106dm9pZCAwLE09byYmbD9bXTp2b2lkIDAsRj1bXSxUPVtdO2ZvcihiPTA7YjxtO2IrKyl7TltiXT1BLmxlbmd0aDt2YXIgTz1iKzE7Zm9yKEU9YVtiXSxDPWFbYisxXSxEPUU7RDxDO0QrKyl3PXNbRF0sQS5wdXNoKHcpLEZbd109TyxJJiYoSVt3XT1vW0RdKTtmb3IoRT1mW2JdLEM9ZltiKzFdLEQ9RTtEPEM7RCsrKWlmKEZbdz1oW0RdXT09PU8pe2lmKEkpe3ZhciBMPXgoSVt3XSxsW0RdKTt2KEwsXyk/Rlt3XT1udWxsOklbd109TH19ZWxzZSBBLnB1c2godyksVFt3XT1PLE0mJihNW3ddPWxbRF0pO2lmKEkmJk0pZm9yKEQ9TltiXTtEPEEubGVuZ3RoOylGW3c9QVtEXV09PT1PPyhTW0RdPUlbd10sRCsrKTpUW3ddPT09Tz8oU1tEXT1NW3ddLEQrKyk6QS5zcGxpY2UoRCwxKX1yZXR1cm4gTlttXT1BLmxlbmd0aCx0LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOlMsaW5kZXg6QSxwdHI6TixzaXplOlt5LG1dLGRhdGF0eXBlOmd9KX19KSksVXk9aWQoIm1hdEFsZ28xMHhTaWRzIixbInR5cGVkIiwiRGVuc2VNYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLERlbnNlTWF0cml4Om59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpLG8pe3ZhciBzPXQuX3ZhbHVlcyxhPXQuX2luZGV4LHU9dC5fcHRyLGM9dC5fc2l6ZSxsPXQuX2RhdGF0eXBlO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIG9uIFBhdHRlcm4gU3BhcnNlIE1hdHJpeCBhbmQgU2NhbGFyIHZhbHVlIik7dmFyIGgsZj1jWzBdLHA9Y1sxXSxkPWk7InN0cmluZyI9PXR5cGVvZiBsJiYoaD1sLHI9ZS5jb252ZXJ0KHIsaCksZD1lLmZpbmQoaSxbaCxoXSkpO2Zvcih2YXIgZz1bXSx5PVtdLG09W10sdj0wO3Y8cDt2Kyspe2Zvcih2YXIgXz12KzEseD11W3ZdLHc9dVt2KzFdLGI9eDtiPHc7YisrKXt2YXIgRD1hW2JdO3lbRF09c1tiXSxtW0RdPV99Zm9yKHZhciBFPTA7RTxmO0UrKykwPT09diYmKGdbRV09W10pLG1bRV09PT1fP2dbRV1bdl09bz9kKHIseVtFXSk6ZCh5W0VdLHIpOmdbRV1bdl09cn1yZXR1cm4gbmV3IG4oe2RhdGE6ZyxzaXplOltmLHBdLGRhdGF0eXBlOmh9KX19KSkscXk9aWQoIm1hdEFsZ28xM3hERCIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpKXt2YXIgbz10Ll9kYXRhLHM9dC5fc2l6ZSxhPXQuX2RhdGF0eXBlLHU9ci5fZGF0YSxjPXIuX3NpemUsbD1yLl9kYXRhdHlwZSxoPVtdO2lmKHMubGVuZ3RoIT09Yy5sZW5ndGgpdGhyb3cgbmV3IEdwKHMubGVuZ3RoLGMubGVuZ3RoKTtmb3IodmFyIGY9MDtmPHMubGVuZ3RoO2YrKyl7aWYoc1tmXSE9PWNbZl0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrcysiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK2MrIikiKTtoW2ZdPXNbZl19dmFyIHAsZD1pOyJzdHJpbmciPT10eXBlb2YgYSYmYT09PWwmJihwPWEsZD1lLmZpbmQoaSxbcCxwXSkpO3ZhciBnPWgubGVuZ3RoPjA/bihkLDAsaCxoWzBdLG8sdSk6W107cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6ZyxzaXplOmgsZGF0YXR5cGU6cH0pfTtmdW5jdGlvbiBuKHQsZSxyLGksbyxzKXt2YXIgYT1bXTtpZihlPT09ci5sZW5ndGgtMSlmb3IodmFyIHU9MDt1PGk7dSsrKWFbdV09dChvW3VdLHNbdV0pO2Vsc2UgZm9yKHZhciBjPTA7YzxpO2MrKylhW2NdPW4odCxlKzEscixyW2UrMV0sb1tjXSxzW2NdKTtyZXR1cm4gYX19KSksVnk9aWQoImJyb2FkY2FzdCIsWyJjb25jYXQiXSwodD0+e3Zhcntjb25jYXQ6ZX09dDtyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbz1NYXRoLm1heCh0Ll9zaXplLmxlbmd0aCxlLl9zaXplLmxlbmd0aCk7aWYodC5fc2l6ZS5sZW5ndGg9PT1lLl9zaXplLmxlbmd0aCYmdC5fc2l6ZS5ldmVyeSgoKHQsbik9PnQ9PT1lLl9zaXplW25dKSkpcmV0dXJuW3QsZV07Zm9yKHZhciBzPW4odC5fc2l6ZSxvLDApLGE9bihlLl9zaXplLG8sMCksdT1bXSxjPTA7YzxvO2MrKyl1W2NdPU1hdGgubWF4KHNbY10sYVtjXSk7Zm9yKHZhciBsPTA7bDxvO2wrKylpKHMsdSxsKSxpKGEsdSxsKTt2YXIgaD10LmNsb25lKCksZj1lLmNsb25lKCk7aC5fc2l6ZS5sZW5ndGg8bz9oLnJlc2hhcGUobihoLl9zaXplLG8sMSkpOmYuX3NpemUubGVuZ3RoPG8mJmYucmVzaGFwZShuKGYuX3NpemUsbywxKSk7Zm9yKHZhciBwPTA7cDxvO3ArKyloLl9zaXplW3BdPHVbcF0mJihoPXIoaCx1W3BdLHApKSxmLl9zaXplW3BdPHVbcF0mJihmPXIoZix1W3BdLHApKTtyZXR1cm5baCxmXX07ZnVuY3Rpb24gbih0LGUsbil7cmV0dXJuWy4uLkFycmF5KGUtdC5sZW5ndGgpLmZpbGwobiksLi4udF19ZnVuY3Rpb24gcih0LG4scil7cmV0dXJuIGUoLi4uQXJyYXkobikuZmlsbCh0KSxyKX1mdW5jdGlvbiBpKHQsZSxuKXtpZih0W25dPGVbbl0mdFtuXT4xKXRocm93IG5ldyBFcnJvcigic2hhcGUgbWlzc21hdGNoOiBtaXNzbWF0Y2ggaXMgZm91bmQgaW4gYXJnIHdpdGggc2hhcGUgKCIuY29uY2F0KHQsIikgbm90IHBvc3NpYmxlIHRvIGJyb2FkY2FzdCBkaW1lbnNpb24gIikuY29uY2F0KG4sIiB3aXRoIHNpemUgIikuY29uY2F0KHRbbl0sIiB0byBzaXplICIpLmNvbmNhdChlW25dKSl9fSkpLEd5PWlkKCJtYXRyaXhBbGdvcml0aG1TdWl0ZSIsWyJ0eXBlZCIsIm1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4sY29uY2F0OnJ9PXQsaT1xeSh7dHlwZWQ6ZX0pLG89a3koe3R5cGVkOmV9KSxzPVZ5KHtjb25jYXQ6cn0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgcixhPXQuZWxvcCx1PXQuU0R8fHQuRFM7YT8ocj17IkRlbnNlTWF0cml4LCBEZW5zZU1hdHJpeCI6KHQsZSk9PmkoLi4ucyh0LGUpLGEpLCJBcnJheSwgQXJyYXkiOih0LGUpPT5pKC4uLnMobih0KSxuKGUpKSxhKS52YWx1ZU9mKCksIkFycmF5LCBEZW5zZU1hdHJpeCI6KHQsZSk9PmkoLi4ucyhuKHQpLGUpLGEpLCJEZW5zZU1hdHJpeCwgQXJyYXkiOih0LGUpPT5pKC4uLnModCxuKGUpKSxhKX0sdC5TUyYmKHJbIlNwYXJzZU1hdHJpeCwgU3BhcnNlTWF0cml4Il09KGUsbik9PnQuU1MoLi4ucyhlLG4pLGEsITEpKSx0LkRTJiYoclsiRGVuc2VNYXRyaXgsIFNwYXJzZU1hdHJpeCJdPShlLG4pPT50LkRTKC4uLnMoZSxuKSxhLCExKSxyWyJBcnJheSwgU3BhcnNlTWF0cml4Il09KGUscik9PnQuRFMoLi4ucyhuKGUpLHIpLGEsITEpKSx1JiYoclsiU3BhcnNlTWF0cml4LCBEZW5zZU1hdHJpeCJdPSh0LGUpPT51KC4uLnMoZSx0KSxhLCEwKSxyWyJTcGFyc2VNYXRyaXgsIEFycmF5Il09KHQsZSk9PnUoLi4ucyhuKGUpLHQpLGEsITApKSk6KHI9eyJEZW5zZU1hdHJpeCwgRGVuc2VNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PihlLG4pPT5pKC4uLnMoZSxuKSx0KSkpLCJBcnJheSwgQXJyYXkiOmUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT5pKC4uLnMobihlKSxuKHIpKSx0KS52YWx1ZU9mKCkpKSwiQXJyYXksIERlbnNlTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+aSguLi5zKG4oZSksciksdCkpKSwiRGVuc2VNYXRyaXgsIEFycmF5IjplLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+aSguLi5zKGUsbihyKSksdCkpKX0sdC5TUyYmKHJbIlNwYXJzZU1hdHJpeCwgU3BhcnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigoZT0+KG4scik9PnQuU1MoLi4ucyhuLHIpLGUsITEpKSkpLHQuRFMmJihyWyJEZW5zZU1hdHJpeCwgU3BhcnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigoZT0+KG4scik9PnQuRFMoLi4ucyhuLHIpLGUsITEpKSksclsiQXJyYXksIFNwYXJzZU1hdHJpeCJdPWUucmVmZXJUb1NlbGYoKGU9PihyLGkpPT50LkRTKC4uLnMobihyKSxpKSxlLCExKSkpKSx1JiYoclsiU3BhcnNlTWF0cml4LCBEZW5zZU1hdHJpeCJdPWUucmVmZXJUb1NlbGYoKHQ9PihlLG4pPT51KC4uLnMobixlKSx0LCEwKSkpLHJbIlNwYXJzZU1hdHJpeCwgQXJyYXkiXT1lLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+dSguLi5zKG4ociksZSksdCwhMCkpKSkpO3ZhciBjPXQuc2NhbGFyfHwiYW55IjsodC5Ec3x8dC5TcykmJihhPyhyWyJEZW5zZU1hdHJpeCwiK2NdPSh0LGUpPT5vKHQsZSxhLCExKSxyW2MrIiwgRGVuc2VNYXRyaXgiXT0odCxlKT0+byhlLHQsYSwhMCksclsiQXJyYXksIitjXT0odCxlKT0+byhuKHQpLGUsYSwhMSkudmFsdWVPZigpLHJbYysiLCBBcnJheSJdPSh0LGUpPT5vKG4oZSksdCxhLCEwKS52YWx1ZU9mKCkpOihyWyJEZW5zZU1hdHJpeCwiK2NdPWUucmVmZXJUb1NlbGYoKHQ9PihlLG4pPT5vKGUsbix0LCExKSkpLHJbYysiLCBEZW5zZU1hdHJpeCJdPWUucmVmZXJUb1NlbGYoKHQ9PihlLG4pPT5vKG4sZSx0LCEwKSkpLHJbIkFycmF5LCIrY109ZS5yZWZlclRvU2VsZigodD0+KGUscik9Pm8obihlKSxyLHQsITEpLnZhbHVlT2YoKSkpLHJbYysiLCBBcnJheSJdPWUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT5vKG4ociksZSx0LCEwKS52YWx1ZU9mKCkpKSkpO3ZhciBsPXZvaWQgMCE9PXQuc1M/dC5zUzp0LlNzO3JldHVybiBhPyh0LlNzJiYoclsiU3BhcnNlTWF0cml4LCIrY109KGUsbik9PnQuU3MoZSxuLGEsITEpKSxsJiYocltjKyIsIFNwYXJzZU1hdHJpeCJdPSh0LGUpPT5sKGUsdCxhLCEwKSkpOih0LlNzJiYoclsiU3BhcnNlTWF0cml4LCIrY109ZS5yZWZlclRvU2VsZigoZT0+KG4scik9PnQuU3MobixyLGUsITEpKSkpLGwmJihyW2MrIiwgU3BhcnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigodD0+KGUsbik9PmwobixlLHQsITApKSkpKSxhJiZhLnNpZ25hdHVyZXMmJmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpRHAoZSxuKSYmKHRbbl09ZVtuXSl9KHIsYS5zaWduYXR1cmVzKSxyfX0pKSxZeT1pZCgibWF0QWxnbzAyeERTMCIsWyJ0eXBlZCIsImVxdWFsU2NhbGFyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpufT10O3JldHVybiBmdW5jdGlvbih0LHIsaSxvKXt2YXIgcz10Ll9kYXRhLGE9dC5fc2l6ZSx1PXQuX2RhdGF0eXBlLGM9ci5fdmFsdWVzLGw9ci5faW5kZXgsaD1yLl9wdHIsZj1yLl9zaXplLHA9ci5fZGF0YXR5cGU7aWYoYS5sZW5ndGghPT1mLmxlbmd0aCl0aHJvdyBuZXcgR3AoYS5sZW5ndGgsZi5sZW5ndGgpO2lmKGFbMF0hPT1mWzBdfHxhWzFdIT09ZlsxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIithKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIrZisiKSIpO2lmKCFjKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIG9uIERlbnNlIE1hdHJpeCBhbmQgUGF0dGVybiBTcGFyc2UgTWF0cml4Iik7dmFyIGQsZz1hWzBdLHk9YVsxXSxtPW4sdj0wLF89aTsic3RyaW5nIj09dHlwZW9mIHUmJnU9PT1wJiYoZD11LG09ZS5maW5kKG4sW2QsZF0pLHY9ZS5jb252ZXJ0KDAsZCksXz1lLmZpbmQoaSxbZCxkXSkpO2Zvcih2YXIgeD1bXSx3PVtdLGI9W10sRD0wO0Q8eTtEKyspe2JbRF09dy5sZW5ndGg7Zm9yKHZhciBFPWhbRF0sQz1oW0QrMV0sUz1FO1M8QztTKyspe3ZhciBBPWxbU10sTj1vP18oY1tTXSxzW0FdW0RdKTpfKHNbQV1bRF0sY1tTXSk7bShOLHYpfHwody5wdXNoKEEpLHgucHVzaChOKSl9fXJldHVybiBiW3ldPXcubGVuZ3RoLHIuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6eCxpbmRleDp3LHB0cjpiLHNpemU6W2cseV0sZGF0YXR5cGU6ZH0pfX0pKSxYeT1pZCgibWF0QWxnbzAzeERTZiIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGZ1bmN0aW9uKHQsbixyLGkpe3ZhciBvPXQuX2RhdGEscz10Ll9zaXplLGE9dC5fZGF0YXR5cGUsdT1uLl92YWx1ZXMsYz1uLl9pbmRleCxsPW4uX3B0cixoPW4uX3NpemUsZj1uLl9kYXRhdHlwZTtpZihzLmxlbmd0aCE9PWgubGVuZ3RoKXRocm93IG5ldyBHcChzLmxlbmd0aCxoLmxlbmd0aCk7aWYoc1swXSE9PWhbMF18fHNbMV0hPT1oWzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2guIE1hdHJpeCBBICgiK3MrIikgbXVzdCBtYXRjaCBNYXRyaXggQiAoIitoKyIpIik7aWYoIXUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gb24gRGVuc2UgTWF0cml4IGFuZCBQYXR0ZXJuIFNwYXJzZSBNYXRyaXgiKTt2YXIgcCxkPXNbMF0sZz1zWzFdLHk9MCxtPXI7InN0cmluZyI9PXR5cGVvZiBhJiZhPT09ZiYmKHA9YSx5PWUuY29udmVydCgwLHApLG09ZS5maW5kKHIsW3AscF0pKTtmb3IodmFyIHY9W10sXz0wO188ZDtfKyspdltfXT1bXTtmb3IodmFyIHg9W10sdz1bXSxiPTA7YjxnO2IrKyl7Zm9yKHZhciBEPWIrMSxFPWxbYl0sQz1sW2IrMV0sUz1FO1M8QztTKyspe3ZhciBBPWNbU107eFtBXT1pP20odVtTXSxvW0FdW2JdKTptKG9bQV1bYl0sdVtTXSksd1tBXT1EfWZvcih2YXIgTj0wO048ZDtOKyspd1tOXT09PUQ/dltOXVtiXT14W05dOnZbTl1bYl09aT9tKHksb1tOXVtiXSk6bShvW05dW2JdLHkpfXJldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOnYsc2l6ZTpbZCxnXSxkYXRhdHlwZTpwfSl9fSkpLFd5PWlkKCJtdWx0aXBseVNjYWxhciIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGUoIm11bHRpcGx5U2NhbGFyIix7Im51bWJlciwgbnVtYmVyIjpEeSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5tdWwoZSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50aW1lcyhlKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5tdWwoZSl9LCJudW1iZXIgfCBGcmFjdGlvbiB8IEJpZ051bWJlciB8IENvbXBsZXgsIFVuaXQiOih0LGUpPT5lLm11bHRpcGx5KHQpLCJVbml0LCBudW1iZXIgfCBGcmFjdGlvbiB8IEJpZ051bWJlciB8IENvbXBsZXggfCBVbml0IjoodCxlKT0+dC5tdWx0aXBseShlKX0pfSkpLEh5PSJtdWx0aXBseSIsWnk9aWQoSHksWyJ0eXBlZCIsIm1hdHJpeCIsImFkZFNjYWxhciIsIm11bHRpcGx5U2NhbGFyIiwiZXF1YWxTY2FsYXIiLCJkb3QiXSwodD0+e3Zhcnt0eXBlZDplLG1hdHJpeDpuLGFkZFNjYWxhcjpyLG11bHRpcGx5U2NhbGFyOmksZXF1YWxTY2FsYXI6byxkb3Q6c309dCxhPVJ5KHt0eXBlZDplLGVxdWFsU2NhbGFyOm99KSx1PWt5KHt0eXBlZDplfSk7ZnVuY3Rpb24gYyh0LGUpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnN3aXRjaChlLmxlbmd0aCl7Y2FzZSAxOmlmKHRbMF0hPT1lWzBdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2ggaW4gbXVsdGlwbGljYXRpb24uIFZlY3RvcnMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCIpO2JyZWFrO2Nhc2UgMjppZih0WzBdIT09ZVswXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoIGluIG11bHRpcGxpY2F0aW9uLiBWZWN0b3IgbGVuZ3RoICgiK3RbMF0rIikgbXVzdCBtYXRjaCBNYXRyaXggcm93cyAoIitlWzBdKyIpIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkNhbiBvbmx5IG11bHRpcGx5IGEgMSBvciAyIGRpbWVuc2lvbmFsIG1hdHJpeCAoTWF0cml4IEIgaGFzICIrZS5sZW5ndGgrIiBkaW1lbnNpb25zKSIpfWJyZWFrO2Nhc2UgMjpzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMTppZih0WzFdIT09ZVswXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoIGluIG11bHRpcGxpY2F0aW9uLiBNYXRyaXggY29sdW1ucyAoIit0WzFdKyIpIG11c3QgbWF0Y2ggVmVjdG9yIGxlbmd0aCAoIitlWzBdKyIpIik7YnJlYWs7Y2FzZSAyOmlmKHRbMV0hPT1lWzBdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2ggaW4gbXVsdGlwbGljYXRpb24uIE1hdHJpeCBBIGNvbHVtbnMgKCIrdFsxXSsiKSBtdXN0IG1hdGNoIE1hdHJpeCBCIHJvd3MgKCIrZVswXSsiKSIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJDYW4gb25seSBtdWx0aXBseSBhIDEgb3IgMiBkaW1lbnNpb25hbCBtYXRyaXggKE1hdHJpeCBCIGhhcyAiK2UubGVuZ3RoKyIgZGltZW5zaW9ucykiKX1icmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiQ2FuIG9ubHkgbXVsdGlwbHkgYSAxIG9yIDIgZGltZW5zaW9uYWwgbWF0cml4IChNYXRyaXggQSBoYXMgIit0Lmxlbmd0aCsiIGRpbWVuc2lvbnMpIil9fWZ1bmN0aW9uIGwodCxuKXtpZigiZGVuc2UiIT09bi5zdG9yYWdlKCkpdGhyb3cgbmV3IEVycm9yKCJTdXBwb3J0IGZvciBTcGFyc2VNYXRyaXggbm90IGltcGxlbWVudGVkIik7cmV0dXJuIGZ1bmN0aW9uKHQsbil7dmFyIG8scz10Ll9kYXRhLGE9dC5fc2l6ZSx1PXQuX2RhdGF0eXBlLGM9bi5fZGF0YSxsPW4uX3NpemUsaD1uLl9kYXRhdHlwZSxmPWFbMF0scD1sWzFdLGQ9cixnPWk7dSYmaCYmdT09PWgmJiJzdHJpbmciPT10eXBlb2YgdSYmKG89dSxkPWUuZmluZChyLFtvLG9dKSxnPWUuZmluZChpLFtvLG9dKSk7Zm9yKHZhciB5PVtdLG09MDttPHA7bSsrKXtmb3IodmFyIHY9ZyhzWzBdLGNbMF1bbV0pLF89MTtfPGY7XysrKXY9ZCh2LGcoc1tfXSxjW19dW21dKSk7eVttXT12fXJldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOnksc2l6ZTpbcF0sZGF0YXR5cGU6b30pfSh0LG4pfXZhciBoPWUoIl9tdWx0aXBseU1hdHJpeFZlY3RvciIseyJEZW5zZU1hdHJpeCwgYW55IjpmdW5jdGlvbih0LG4pe3ZhciBvLHM9dC5fZGF0YSxhPXQuX3NpemUsdT10Ll9kYXRhdHlwZSxjPW4uX2RhdGEsbD1uLl9kYXRhdHlwZSxoPWFbMF0sZj1hWzFdLHA9cixkPWk7dSYmbCYmdT09PWwmJiJzdHJpbmciPT10eXBlb2YgdSYmKG89dSxwPWUuZmluZChyLFtvLG9dKSxkPWUuZmluZChpLFtvLG9dKSk7Zm9yKHZhciBnPVtdLHk9MDt5PGg7eSsrKXtmb3IodmFyIG09c1t5XSx2PWQobVswXSxjWzBdKSxfPTE7XzxmO18rKyl2PXAodixkKG1bX10sY1tfXSkpO2dbeV09dn1yZXR1cm4gdC5jcmVhdGVEZW5zZU1hdHJpeCh7ZGF0YTpnLHNpemU6W2hdLGRhdGF0eXBlOm99KX0sIlNwYXJzZU1hdHJpeCwgYW55IjpmdW5jdGlvbih0LG4pe3ZhciBzPXQuX3ZhbHVlcyxhPXQuX2luZGV4LHU9dC5fcHRyLGM9dC5fZGF0YXR5cGU7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgbXVsdGlwbHkgUGF0dGVybiBvbmx5IE1hdHJpeCB0aW1lcyBEZW5zZSBNYXRyaXgiKTt2YXIgbCxoPW4uX2RhdGEsZj1uLl9kYXRhdHlwZSxwPXQuX3NpemVbMF0sZD1uLl9zaXplWzBdLGc9W10seT1bXSxtPVtdLHY9cixfPWkseD1vLHc9MDtjJiZmJiZjPT09ZiYmInN0cmluZyI9PXR5cGVvZiBjJiYobD1jLHY9ZS5maW5kKHIsW2wsbF0pLF89ZS5maW5kKGksW2wsbF0pLHg9ZS5maW5kKG8sW2wsbF0pLHc9ZS5jb252ZXJ0KDAsbCkpO3ZhciBiPVtdLEQ9W107bVswXT0wO2Zvcih2YXIgRT0wO0U8ZDtFKyspe3ZhciBDPWhbRV07aWYoIXgoQyx3KSlmb3IodmFyIFM9dVtFXSxBPXVbRSsxXSxOPVM7TjxBO04rKyl7dmFyIEk9YVtOXTtEW0ldP2JbSV09dihiW0ldLF8oQyxzW05dKSk6KERbSV09ITAseS5wdXNoKEkpLGJbSV09XyhDLHNbTl0pKX19Zm9yKHZhciBNPXkubGVuZ3RoLEY9MDtGPE07RisrKXt2YXIgVD15W0ZdO2dbRl09YltUXX1yZXR1cm4gbVsxXT15Lmxlbmd0aCx0LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOmcsaW5kZXg6eSxwdHI6bSxzaXplOltwLDFdLGRhdGF0eXBlOmx9KX19KSxmPWUoIl9tdWx0aXBseU1hdHJpeE1hdHJpeCIseyJEZW5zZU1hdHJpeCwgRGVuc2VNYXRyaXgiOmZ1bmN0aW9uKHQsbil7dmFyIG8scz10Ll9kYXRhLGE9dC5fc2l6ZSx1PXQuX2RhdGF0eXBlLGM9bi5fZGF0YSxsPW4uX3NpemUsaD1uLl9kYXRhdHlwZSxmPWFbMF0scD1hWzFdLGQ9bFsxXSxnPXIseT1pO3UmJmgmJnU9PT1oJiYic3RyaW5nIj09dHlwZW9mIHUmJihvPXUsZz1lLmZpbmQocixbbyxvXSkseT1lLmZpbmQoaSxbbyxvXSkpO2Zvcih2YXIgbT1bXSx2PTA7djxmO3YrKyl7dmFyIF89c1t2XTttW3ZdPVtdO2Zvcih2YXIgeD0wO3g8ZDt4Kyspe2Zvcih2YXIgdz15KF9bMF0sY1swXVt4XSksYj0xO2I8cDtiKyspdz1nKHcseShfW2JdLGNbYl1beF0pKTttW3ZdW3hdPXd9fXJldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOm0sc2l6ZTpbZixkXSxkYXRhdHlwZTpvfSl9LCJEZW5zZU1hdHJpeCwgU3BhcnNlTWF0cml4IjpmdW5jdGlvbih0LG4pe3ZhciBzPXQuX2RhdGEsYT10Ll9zaXplLHU9dC5fZGF0YXR5cGUsYz1uLl92YWx1ZXMsbD1uLl9pbmRleCxoPW4uX3B0cixmPW4uX3NpemUscD1uLl9kYXRhdHlwZTtpZighYyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBtdWx0aXBseSBEZW5zZSBNYXRyaXggdGltZXMgUGF0dGVybiBvbmx5IE1hdHJpeCIpO3ZhciBkLGc9YVswXSx5PWZbMV0sbT1yLHY9aSxfPW8seD0wO3UmJnAmJnU9PT1wJiYic3RyaW5nIj09dHlwZW9mIHUmJihkPXUsbT1lLmZpbmQocixbZCxkXSksdj1lLmZpbmQoaSxbZCxkXSksXz1lLmZpbmQobyxbZCxkXSkseD1lLmNvbnZlcnQoMCxkKSk7Zm9yKHZhciB3PVtdLGI9W10sRD1bXSxFPW4uY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6dyxpbmRleDpiLHB0cjpELHNpemU6W2cseV0sZGF0YXR5cGU6ZH0pLEM9MDtDPHk7QysrKXtEW0NdPWIubGVuZ3RoO3ZhciBTPWhbQ10sQT1oW0MrMV07aWYoQT5TKWZvcih2YXIgTj0wLEk9MDtJPGc7SSsrKXtmb3IodmFyIE09SSsxLEY9dm9pZCAwLFQ9UztUPEE7VCsrKXt2YXIgTz1sW1RdO04hPT1NPyhGPXYoc1tJXVtPXSxjW1RdKSxOPU0pOkY9bShGLHYoc1tJXVtPXSxjW1RdKSl9Tj09PU0mJiFfKEYseCkmJihiLnB1c2goSSksdy5wdXNoKEYpKX19cmV0dXJuIERbeV09Yi5sZW5ndGgsRX0sIlNwYXJzZU1hdHJpeCwgRGVuc2VNYXRyaXgiOmZ1bmN0aW9uKHQsbil7dmFyIHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9kYXRhdHlwZTtpZighcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBtdWx0aXBseSBQYXR0ZXJuIG9ubHkgTWF0cml4IHRpbWVzIERlbnNlIE1hdHJpeCIpO3ZhciBsLGg9bi5fZGF0YSxmPW4uX2RhdGF0eXBlLHA9dC5fc2l6ZVswXSxkPW4uX3NpemVbMF0sZz1uLl9zaXplWzFdLHk9cixtPWksdj1vLF89MDtjJiZmJiZjPT09ZiYmInN0cmluZyI9PXR5cGVvZiBjJiYobD1jLHk9ZS5maW5kKHIsW2wsbF0pLG09ZS5maW5kKGksW2wsbF0pLHY9ZS5maW5kKG8sW2wsbF0pLF89ZS5jb252ZXJ0KDAsbCkpO2Zvcih2YXIgeD1bXSx3PVtdLGI9W10sRD10LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOngsaW5kZXg6dyxwdHI6YixzaXplOltwLGddLGRhdGF0eXBlOmx9KSxFPVtdLEM9W10sUz0wO1M8ZztTKyspe2JbU109dy5sZW5ndGg7Zm9yKHZhciBBPVMrMSxOPTA7TjxkO04rKyl7dmFyIEk9aFtOXVtTXTtpZighdihJLF8pKWZvcih2YXIgTT11W05dLEY9dVtOKzFdLFQ9TTtUPEY7VCsrKXt2YXIgTz1hW1RdO0NbT10hPT1BPyhDW09dPUEsdy5wdXNoKE8pLEVbT109bShJLHNbVF0pKTpFW09dPXkoRVtPXSxtKEksc1tUXSkpfX1mb3IodmFyIEw9YltTXSxQPXcubGVuZ3RoLFI9TDtSPFA7UisrKXt2YXIgQj13W1JdO3hbUl09RVtCXX19cmV0dXJuIGJbZ109dy5sZW5ndGgsRH0sIlNwYXJzZU1hdHJpeCwgU3BhcnNlTWF0cml4IjpmdW5jdGlvbih0LG4pe3ZhciBvLHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9kYXRhdHlwZSxsPW4uX3ZhbHVlcyxoPW4uX2luZGV4LGY9bi5fcHRyLHA9bi5fZGF0YXR5cGUsZD10Ll9zaXplWzBdLGc9bi5fc2l6ZVsxXSx5PXMmJmwsbT1yLHY9aTtjJiZwJiZjPT09cCYmInN0cmluZyI9PXR5cGVvZiBjJiYobz1jLG09ZS5maW5kKHIsW28sb10pLHY9ZS5maW5kKGksW28sb10pKTtmb3IodmFyIF8seCx3LGIsRCxFLEMsUyxBPXk/W106dm9pZCAwLE49W10sST1bXSxNPXQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6QSxpbmRleDpOLHB0cjpJLHNpemU6W2QsZ10sZGF0YXR5cGU6b30pLEY9eT9bXTp2b2lkIDAsVD1bXSxPPTA7TzxnO08rKyl7SVtPXT1OLmxlbmd0aDt2YXIgTD1PKzE7Zm9yKEQ9ZltPXSxFPWZbTysxXSxiPUQ7YjxFO2IrKylpZihTPWhbYl0seSlmb3IoeD11W1NdLHc9dVtTKzFdLF89eDtfPHc7XysrKVRbQz1hW19dXSE9PUw/KFRbQ109TCxOLnB1c2goQyksRltDXT12KGxbYl0sc1tfXSkpOkZbQ109bShGW0NdLHYobFtiXSxzW19dKSk7ZWxzZSBmb3IoeD11W1NdLHc9dVtTKzFdLF89eDtfPHc7XysrKVRbQz1hW19dXSE9PUwmJihUW0NdPUwsTi5wdXNoKEMpKTtpZih5KWZvcih2YXIgUD1JW09dLFI9Ti5sZW5ndGgsQj1QO0I8UjtCKyspe3ZhciBrPU5bQl07QVtCXT1GW2tdfX1yZXR1cm4gSVtnXT1OLmxlbmd0aCxNfX0pO3JldHVybiBlKEh5LGkseyJBcnJheSwgQXJyYXkiOmUucmVmZXJUbygiTWF0cml4LCBNYXRyaXgiLCh0PT4oZSxyKT0+e2MoWHAoZSksWHAocikpO3ZhciBpPXQobihlKSxuKHIpKTtyZXR1cm4gcWYoaSk/aS52YWx1ZU9mKCk6aX0pKSwiTWF0cml4LCBNYXRyaXgiOmZ1bmN0aW9uKHQsZSl7dmFyIG49dC5zaXplKCkscj1lLnNpemUoKTtyZXR1cm4gYyhuLHIpLDE9PT1uLmxlbmd0aD8xPT09ci5sZW5ndGg/ZnVuY3Rpb24odCxlLG4pe2lmKDA9PT1uKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG11bHRpcGx5IHR3byBlbXB0eSB2ZWN0b3JzIik7cmV0dXJuIHModCxlKX0odCxlLG5bMF0pOmwodCxlKToxPT09ci5sZW5ndGg/aCh0LGUpOmYodCxlKX0sIk1hdHJpeCwgQXJyYXkiOmUucmVmZXJUbygiTWF0cml4LE1hdHJpeCIsKHQ9PihlLHIpPT50KGUsbihyKSkpKSwiQXJyYXksIE1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+KGUscik9PnQobihlLHIuc3RvcmFnZSgpKSxyKSkpLCJTcGFyc2VNYXRyaXgsIGFueSI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYSh0LGUsaSwhMSl9LCJEZW5zZU1hdHJpeCwgYW55IjpmdW5jdGlvbih0LGUpe3JldHVybiB1KHQsZSxpLCExKX0sImFueSwgU3BhcnNlTWF0cml4IjpmdW5jdGlvbih0LGUpe3JldHVybiBhKGUsdCxpLCEwKX0sImFueSwgRGVuc2VNYXRyaXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUoZSx0LGksITApfSwiQXJyYXksIGFueSI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdShuKHQpLGUsaSwhMSkudmFsdWVPZigpfSwiYW55LCBBcnJheSI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdShuKGUpLHQsaSwhMCkudmFsdWVPZigpfSwiYW55LCBhbnkiOmksImFueSwgYW55LCAuLi5hbnkiOmUucmVmZXJUb1NlbGYoKHQ9PihlLG4scik9Pntmb3IodmFyIGk9dChlLG4pLG89MDtvPHIubGVuZ3RoO28rKylpPXQoaSxyW29dKTtyZXR1cm4gaX0pKX0pfSkpLEt5PWlkKCJtYXRBbGdvMDl4UzBTZiIsWyJ0eXBlZCIsImVxdWFsU2NhbGFyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpufT10O3JldHVybiBmdW5jdGlvbih0LHIsaSl7dmFyIG89dC5fdmFsdWVzLHM9dC5faW5kZXgsYT10Ll9wdHIsdT10Ll9zaXplLGM9dC5fZGF0YXR5cGUsbD1yLl92YWx1ZXMsaD1yLl9pbmRleCxmPXIuX3B0cixwPXIuX3NpemUsZD1yLl9kYXRhdHlwZTtpZih1Lmxlbmd0aCE9PXAubGVuZ3RoKXRocm93IG5ldyBHcCh1Lmxlbmd0aCxwLmxlbmd0aCk7aWYodVswXSE9PXBbMF18fHVbMV0hPT1wWzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2guIE1hdHJpeCBBICgiK3UrIikgbXVzdCBtYXRjaCBNYXRyaXggQiAoIitwKyIpIik7dmFyIGcseT11WzBdLG09dVsxXSx2PW4sXz0wLHg9aTsic3RyaW5nIj09dHlwZW9mIGMmJmM9PT1kJiYoZz1jLHY9ZS5maW5kKG4sW2csZ10pLF89ZS5jb252ZXJ0KDAsZykseD1lLmZpbmQoaSxbZyxnXSkpO3ZhciB3LGIsRCxFLEMsUz1vJiZsP1tdOnZvaWQgMCxBPVtdLE49W10sST1TP1tdOnZvaWQgMCxNPVtdO2ZvcihiPTA7YjxtO2IrKyl7TltiXT1BLmxlbmd0aDt2YXIgRj1iKzE7aWYoSSlmb3IoRT1mW2JdLEM9ZltiKzFdLEQ9RTtEPEM7RCsrKU1bdz1oW0RdXT1GLElbd109bFtEXTtmb3IoRT1hW2JdLEM9YVtiKzFdLEQ9RTtEPEM7RCsrKWlmKHc9c1tEXSxJKXt2YXIgVD1NW3ddPT09Rj9JW3ddOl8sTz14KG9bRF0sVCk7dihPLF8pfHwoQS5wdXNoKHcpLFMucHVzaChPKSl9ZWxzZSBBLnB1c2godyl9cmV0dXJuIE5bbV09QS5sZW5ndGgsdC5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczpTLGluZGV4OkEscHRyOk4sc2l6ZTpbeSxtXSxkYXRhdHlwZTpnfSl9fSkpLEp5PWlkKCJtYXRBbGdvMDd4U1NmIixbInR5cGVkIiwiRGVuc2VNYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLERlbnNlTWF0cml4Om59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQsaSxvKXt2YXIgcz10Ll9zaXplLGE9dC5fZGF0YXR5cGUsdT1pLl9zaXplLGM9aS5fZGF0YXR5cGU7aWYocy5sZW5ndGghPT11Lmxlbmd0aCl0aHJvdyBuZXcgR3Aocy5sZW5ndGgsdS5sZW5ndGgpO2lmKHNbMF0hPT11WzBdfHxzWzFdIT09dVsxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIitzKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIrdSsiKSIpO3ZhciBsLGg9c1swXSxmPXNbMV0scD0wLGQ9bzsic3RyaW5nIj09dHlwZW9mIGEmJmE9PT1jJiYobD1hLHA9ZS5jb252ZXJ0KDAsbCksZD1lLmZpbmQobyxbbCxsXSkpO3ZhciBnLHksbT1bXTtmb3IoZz0wO2c8aDtnKyspbVtnXT1bXTt2YXIgdj1bXSxfPVtdLHg9W10sdz1bXTtmb3IoeT0wO3k8Zjt5Kyspe3ZhciBiPXkrMTtmb3Iocih0LHkseCx2LGIpLHIoaSx5LHcsXyxiKSxnPTA7ZzxoO2crKyl7dmFyIEQ9eFtnXT09PWI/dltnXTpwLEU9d1tnXT09PWI/X1tnXTpwO21bZ11beV09ZChELEUpfX1yZXR1cm4gbmV3IG4oe2RhdGE6bSxzaXplOltoLGZdLGRhdGF0eXBlOmx9KX07ZnVuY3Rpb24gcih0LGUsbixyLGkpe2Zvcih2YXIgbz10Ll92YWx1ZXMscz10Ll9pbmRleCxhPXQuX3B0cix1PWFbZV0sYz1hW2UrMV07dTxjO3UrKyl7dmFyIGw9c1t1XTtuW2xdPWkscltsXT1vW3VdfX19KSksUXk9ImNvbmoiLCR5PWlkKFF5LFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBlKFF5LHsibnVtYmVyIHwgQmlnTnVtYmVyIHwgRnJhY3Rpb24iOnQ9PnQsQ29tcGxleDp0PT50LmNvbmp1Z2F0ZSgpLCJBcnJheSB8IE1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+ZT0+dnkoZSx0KSkpfSl9KSksdG09ImNvbmNhdCIsZW09aWQodG0sWyJ0eXBlZCIsIm1hdHJpeCIsImlzSW50ZWdlciJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4saXNJbnRlZ2VyOnJ9PXQ7cmV0dXJuIGUodG0seyIuLi5BcnJheSB8IE1hdHJpeCB8IG51bWJlciB8IEJpZ051bWJlciI6ZnVuY3Rpb24odCl7dmFyIGUsaSxvPXQubGVuZ3RoLHM9LTEsYT0hMSx1PVtdO2ZvcihlPTA7ZTxvO2UrKyl7dmFyIGM9dFtlXTtpZihxZihjKSYmKGE9ITApLFBmKGMpfHxSZihjKSl7aWYoZSE9PW8tMSl0aHJvdyBuZXcgRXJyb3IoIkRpbWVuc2lvbiBtdXN0IGJlIHNwZWNpZmllZCBhcyBsYXN0IGFyZ3VtZW50Iik7aWYoaT1zLHM9Yy52YWx1ZU9mKCksIXIocykpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW50ZWdlciBudW1iZXIgZXhwZWN0ZWQgZm9yIGRpbWVuc2lvbiIpO2lmKHM8MHx8ZT4wJiZzPmkpdGhyb3cgbmV3IFlwKHMsaSsxKX1lbHNle3ZhciBsPXdwKGMpLnZhbHVlT2YoKSxoPVhwKGwpO2lmKHVbZV09bCxpPXMscz1oLmxlbmd0aC0xLGU+MCYmcyE9PWkpdGhyb3cgbmV3IEdwKGkrMSxzKzEpfX1pZigwPT09dS5sZW5ndGgpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJBdCBsZWFzdCBvbmUgbWF0cml4IGV4cGVjdGVkIik7Zm9yKHZhciBmPXUuc2hpZnQoKTt1Lmxlbmd0aDspZj1ubShmLHUuc2hpZnQoKSxzLDApO3JldHVybiBhP24oZik6Zn0sIi4uLnN0cmluZyI6ZnVuY3Rpb24odCl7cmV0dXJuIHQuam9pbigiIil9fSl9KSk7ZnVuY3Rpb24gbm0odCxlLG4scil7aWYocjxuKXtpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBHcCh0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKHZhciBpPVtdLG89MDtvPHQubGVuZ3RoO28rKylpW29dPW5tKHRbb10sZVtvXSxuLHIrMSk7cmV0dXJuIGl9cmV0dXJuIHQuY29uY2F0KGUpfXZhciBybT1pZCgib25lcyIsWyJ0eXBlZCIsImNvbmZpZyIsIm1hdHJpeCIsIkJpZ051bWJlciJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm4sbWF0cml4OnIsQmlnTnVtYmVyOml9PXQ7cmV0dXJuIGUoIm9uZXMiLHsiIjpmdW5jdGlvbigpe3JldHVybiJBcnJheSI9PT1uLm1hdHJpeD9vKFtdKTpvKFtdLCJkZWZhdWx0Iil9LCIuLi5udW1iZXIgfCBCaWdOdW1iZXIgfCBzdHJpbmciOmZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdFt0Lmxlbmd0aC0xXSl7dmFyIGU9dC5wb3AoKTtyZXR1cm4gbyh0LGUpfXJldHVybiJBcnJheSI9PT1uLm1hdHJpeD9vKHQpOm8odCwiZGVmYXVsdCIpfSxBcnJheTpvLE1hdHJpeDpmdW5jdGlvbih0KXt2YXIgZT10LnN0b3JhZ2UoKTtyZXR1cm4gbyh0LnZhbHVlT2YoKSxlKX0sIkFycmF5IHwgTWF0cml4LCBzdHJpbmciOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8odC52YWx1ZU9mKCksZSl9fSk7ZnVuY3Rpb24gbyh0LGUpe3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciBlPSExO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQsbixyKXtSZih0KSYmKGU9ITAscltuXT10LnRvTnVtYmVyKCkpfSkpLGV9KHQpLG89bj9uZXcgaSgxKToxO2lmKGZ1bmN0aW9uKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0fHwhTXAodCl8fHQ8MCl0aHJvdyBuZXcgRXJyb3IoIlBhcmFtZXRlcnMgaW4gZnVuY3Rpb24gb25lcyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzIil9KSl9KHQpLGUpe3ZhciBzPXIoZSk7cmV0dXJuIHQubGVuZ3RoPjA/cy5yZXNpemUodCxvKTpzfXZhciBhPVtdO3JldHVybiB0Lmxlbmd0aD4wP0twKGEsdCxvKTphfX0pKTtmdW5jdGlvbiBpbSgpe3Rocm93IG5ldyBFcnJvcignTm8gImJpZ251bWJlciIgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlJyl9ZnVuY3Rpb24gb20oKXt0aHJvdyBuZXcgRXJyb3IoJ05vICJmcmFjdGlvbiIgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlJyl9ZnVuY3Rpb24gc20oKXt0aHJvdyBuZXcgRXJyb3IoJ05vICJtYXRyaXgiIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZScpfXZhciBhbT0icmFuZ2UiLHVtPWlkKGFtLFsidHlwZWQiLCJjb25maWciLCI/bWF0cml4IiwiP2JpZ251bWJlciIsInNtYWxsZXIiLCJzbWFsbGVyRXEiLCJsYXJnZXIiLCJsYXJnZXJFcSJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm4sbWF0cml4OnIsYmlnbnVtYmVyOmksc21hbGxlcjpvLHNtYWxsZXJFcTpzLGxhcmdlcjphLGxhcmdlckVxOnV9PXQ7cmV0dXJuIGUoYW0se3N0cmluZzpsLCJzdHJpbmcsIGJvb2xlYW4iOmwsIm51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiBjKGgodCxlLDEpKX0sIm51bWJlciwgbnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYyhoKHQsZSxuKSl9LCJudW1iZXIsIG51bWJlciwgYm9vbGVhbiI6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjKG4/Zih0LGUsMSk6aCh0LGUsMSkpfSwibnVtYmVyLCBudW1iZXIsIG51bWJlciwgYm9vbGVhbiI6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGMocj9mKHQsZSxuKTpoKHQsZSxuKSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYyhwKHQsZSxuZXcoMCx0LmNvbnN0cnVjdG9yKSgxKSkpfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjKHAodCxlLG4pKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyLCBib29sZWFuIjpmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5jb25zdHJ1Y3RvcjtyZXR1cm4gYyhuP2QodCxlLG5ldyByKDEpKTpwKHQsZSxuZXcgcigxKSkpfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIsIEJpZ051bWJlciwgYm9vbGVhbiI6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGMocj9kKHQsZSxuKTpwKHQsZSxuKSl9fSk7ZnVuY3Rpb24gYyh0KXtyZXR1cm4iTWF0cml4Ij09PW4ubWF0cml4P3I/cih0KTpzbSgpOnR9ZnVuY3Rpb24gbCh0LGUpe3ZhciByPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc3BsaXQoIjoiKSxuPWUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQpfSkpLHI9bi5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gaXNOYU4odCl9KSk7aWYocilyZXR1cm4gbnVsbDtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMjpyZXR1cm57c3RhcnQ6blswXSxlbmQ6blsxXSxzdGVwOjF9O2Nhc2UgMzpyZXR1cm57c3RhcnQ6blswXSxlbmQ6blsyXSxzdGVwOm5bMV19O2RlZmF1bHQ6cmV0dXJuIG51bGx9fSh0KTtpZighcil0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N0cmluZyAiJyt0KyciIGlzIG5vIHZhbGlkIHJhbmdlJyk7cmV0dXJuIkJpZ051bWJlciI9PT1uLm51bWJlcj8odm9pZCAwPT09aSYmaW0oKSxjKChlP2Q6cCkoaShyLnN0YXJ0KSxpKHIuZW5kKSxpKHIuc3RlcCkpKSk6YygoZT9mOmgpKHIuc3RhcnQsci5lbmQsci5zdGVwKSl9ZnVuY3Rpb24gaCh0LGUsbil7dmFyIHI9W10saT10O2lmKG4+MClmb3IoO28oaSxlKTspci5wdXNoKGkpLGkrPW47ZWxzZSBpZihuPDApZm9yKDthKGksZSk7KXIucHVzaChpKSxpKz1uO3JldHVybiByfWZ1bmN0aW9uIGYodCxlLG4pe3ZhciByPVtdLGk9dDtpZihuPjApZm9yKDtzKGksZSk7KXIucHVzaChpKSxpKz1uO2Vsc2UgaWYobjwwKWZvcig7dShpLGUpOylyLnB1c2goaSksaSs9bjtyZXR1cm4gcn1mdW5jdGlvbiBwKHQsZSxuKXt2YXIgcj1pKDApLHM9W10sdT10O2lmKG4uZ3QocikpZm9yKDtvKHUsZSk7KXMucHVzaCh1KSx1PXUucGx1cyhuKTtlbHNlIGlmKG4ubHQocikpZm9yKDthKHUsZSk7KXMucHVzaCh1KSx1PXUucGx1cyhuKTtyZXR1cm4gc31mdW5jdGlvbiBkKHQsZSxuKXt2YXIgcj1pKDApLG89W10sYT10O2lmKG4uZ3QocikpZm9yKDtzKGEsZSk7KW8ucHVzaChhKSxhPWEucGx1cyhuKTtlbHNlIGlmKG4ubHQocikpZm9yKDt1KGEsZSk7KW8ucHVzaChhKSxhPWEucGx1cyhuKTtyZXR1cm4gb319KSksY209InNpemUiLGxtPWlkKGNtLFsidHlwZWQiLCJjb25maWciLCI/bWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cn09dDtyZXR1cm4gZShjbSx7TWF0cml4OmZ1bmN0aW9uKHQpe3JldHVybiB0LmNyZWF0ZSh0LnNpemUoKSl9LEFycmF5OlhwLHN0cmluZzpmdW5jdGlvbih0KXtyZXR1cm4iQXJyYXkiPT09bi5tYXRyaXg/W3QubGVuZ3RoXTpyKFt0Lmxlbmd0aF0pfSwibnVtYmVyIHwgQ29tcGxleCB8IEJpZ051bWJlciB8IFVuaXQgfCBib29sZWFuIHwgbnVsbCI6ZnVuY3Rpb24odCl7cmV0dXJuIkFycmF5Ij09PW4ubWF0cml4P1tdOnI/cihbXSk6c20oKX19KX0pKSxobT0ic3Vic2V0IixmbT1pZChobSxbInR5cGVkIiwibWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bn09dDtyZXR1cm4gZShobSx7IkFycmF5LCBJbmRleCI6ZnVuY3Rpb24odCxlKXt2YXIgcj1uKHQpLnN1YnNldChlKTtyZXR1cm4gZS5pc1NjYWxhcigpP3I6ci52YWx1ZU9mKCl9LCJNYXRyaXgsIEluZGV4IjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnN1YnNldChlKX0sIk9iamVjdCwgSW5kZXgiOmdtLCJzdHJpbmcsIEluZGV4IjpwbSwiQXJyYXksIEluZGV4LCBhbnkiOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gbih3cCh0KSkuc3Vic2V0KGUscix2b2lkIDApLnZhbHVlT2YoKX0sIkFycmF5LCBJbmRleCwgYW55LCBhbnkiOmZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybiBuKHdwKHQpKS5zdWJzZXQoZSxyLGkpLnZhbHVlT2YoKX0sIk1hdHJpeCwgSW5kZXgsIGFueSI6ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0LmNsb25lKCkuc3Vic2V0KGUsbil9LCJNYXRyaXgsIEluZGV4LCBhbnksIGFueSI6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHQuY2xvbmUoKS5zdWJzZXQoZSxuLHIpfSwic3RyaW5nLCBJbmRleCwgc3RyaW5nIjpkbSwic3RyaW5nLCBJbmRleCwgc3RyaW5nLCBzdHJpbmciOmRtLCJPYmplY3QsIEluZGV4LCBhbnkiOnltfSl9KSk7ZnVuY3Rpb24gcG0odCxlKXtpZighV2YoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW5kZXggZXhwZWN0ZWQiKTtpZigxIT09ZS5zaXplKCkubGVuZ3RoKXRocm93IG5ldyBHcChlLnNpemUoKS5sZW5ndGgsMSk7dmFyIG49dC5sZW5ndGg7WnAoZS5taW4oKVswXSxuKSxacChlLm1heCgpWzBdLG4pO3ZhciByPWUuZGltZW5zaW9uKDApLGk9IiI7cmV0dXJuIHIuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aSs9dC5jaGFyQXQoZSl9KSksaX1mdW5jdGlvbiBkbSh0LGUsbixyKXtpZighZXx8ITAhPT1lLmlzSW5kZXgpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW5kZXggZXhwZWN0ZWQiKTtpZigxIT09ZS5zaXplKCkubGVuZ3RoKXRocm93IG5ldyBHcChlLnNpemUoKS5sZW5ndGgsMSk7aWYodm9pZCAwIT09cil7aWYoInN0cmluZyIhPXR5cGVvZiByfHwxIT09ci5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiU2luZ2xlIGNoYXJhY3RlciBleHBlY3RlZCBhcyBkZWZhdWx0VmFsdWUiKX1lbHNlIHI9IiAiO3ZhciBpPWUuZGltZW5zaW9uKDApO2lmKGkuc2l6ZSgpWzBdIT09bi5sZW5ndGgpdGhyb3cgbmV3IEdwKGkuc2l6ZSgpWzBdLG4ubGVuZ3RoKTt2YXIgbz10Lmxlbmd0aDtacChlLm1pbigpWzBdKSxacChlLm1heCgpWzBdKTtmb3IodmFyIHM9W10sYT0wO2E8bzthKyspc1thXT10LmNoYXJBdChhKTtpZihpLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7c1t0XT1uLmNoYXJBdChlWzBdKX0pKSxzLmxlbmd0aD5vKWZvcih2YXIgdT1vLTEsYz1zLmxlbmd0aDt1PGM7dSsrKXNbdV18fChzW3VdPXIpO3JldHVybiBzLmpvaW4oIiIpfWZ1bmN0aW9uIGdtKHQsZSl7aWYoMSE9PWUuc2l6ZSgpLmxlbmd0aCl0aHJvdyBuZXcgR3AoZS5zaXplKCksMSk7dmFyIG49ZS5kaW1lbnNpb24oMCk7aWYoInN0cmluZyIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoIlN0cmluZyBleHBlY3RlZCBhcyBpbmRleCB0byByZXRyaWV2ZSBhbiBvYmplY3QgcHJvcGVydHkiKTtyZXR1cm4gc2QodCxuKX1mdW5jdGlvbiB5bSh0LGUsbil7aWYoMSE9PWUuc2l6ZSgpLmxlbmd0aCl0aHJvdyBuZXcgR3AoZS5zaXplKCksMSk7dmFyIHI9ZS5kaW1lbnNpb24oMCk7aWYoInN0cmluZyIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIlN0cmluZyBleHBlY3RlZCBhcyBpbmRleCB0byByZXRyaWV2ZSBhbiBvYmplY3QgcHJvcGVydHkiKTt2YXIgaT13cCh0KTtyZXR1cm4gYWQoaSxyLG4pLGl9dmFyIG1tPSJ0cmFuc3Bvc2UiLHZtPWlkKG1tLFsidHlwZWQiLCJtYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLG1hdHJpeDpufT10O3JldHVybiBlKG1tLHtBcnJheTp0PT5yKG4odCkpLnZhbHVlT2YoKSxNYXRyaXg6cixhbnk6d3B9KTtmdW5jdGlvbiByKHQpe3ZhciBlLG49dC5zaXplKCk7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDE6ZT10LmNsb25lKCk7YnJlYWs7Y2FzZSAyOnZhciByPW5bMF0saT1uWzFdO2lmKDA9PT1pKXRocm93IG5ldyBSYW5nZUVycm9yKCJDYW5ub3QgdHJhbnNwb3NlIGEgMkQgbWF0cml4IHdpdGggbm8gY29sdW1ucyAoc2l6ZTogIitxcChuKSsiKSIpO3N3aXRjaCh0LnN0b3JhZ2UoKSl7Y2FzZSJkZW5zZSI6ZT1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGk9dC5fZGF0YSxvPVtdLHM9MDtzPG47cysrKXtyPW9bc109W107Zm9yKHZhciBhPTA7YTxlO2ErKylyW2FdPXdwKGlbYV1bc10pfXJldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOm8sc2l6ZTpbbixlXSxkYXRhdHlwZTp0Ll9kYXRhdHlwZX0pfSh0LHIsaSk7YnJlYWs7Y2FzZSJzcGFyc2UiOmU9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10Ll92YWx1ZXMsaT10Ll9pbmRleCxvPXQuX3B0cixzPXI/W106dm9pZCAwLGE9W10sdT1bXSxjPVtdLGw9MDtsPGU7bCsrKWNbbF09MDt2YXIgaCxmLHA7Zm9yKGg9MCxmPWkubGVuZ3RoO2g8ZjtoKyspY1tpW2hdXSsrO2Zvcih2YXIgZD0wLGc9MDtnPGU7ZysrKXUucHVzaChkKSxkKz1jW2ddLGNbZ109dVtnXTtmb3IodS5wdXNoKGQpLHA9MDtwPG47cCsrKWZvcih2YXIgeT1vW3BdLG09b1twKzFdLHY9eTt2PG07disrKXt2YXIgXz1jW2lbdl1dKys7YVtfXT1wLHImJihzW19dPXdwKHJbdl0pKX1yZXR1cm4gdC5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczpzLGluZGV4OmEscHRyOnUsc2l6ZTpbbixlXSxkYXRhdHlwZTp0Ll9kYXRhdHlwZX0pfSh0LHIsaSl9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cml4IG11c3QgYmUgYSB2ZWN0b3Igb3IgdHdvIGRpbWVuc2lvbmFsIChzaXplOiAiK3FwKG4pKyIpIil9cmV0dXJuIGV9fSkpLF9tPWlkKCJudW1lcmljIixbIm51bWJlciIsIj9iaWdudW1iZXIiLCI/ZnJhY3Rpb24iXSwodD0+e3ZhcntudW1iZXI6ZSxiaWdudW1iZXI6bixmcmFjdGlvbjpyfT10LGk9e3N0cmluZzohMCxudW1iZXI6ITAsQmlnTnVtYmVyOiEwLEZyYWN0aW9uOiEwfSxvPXtudW1iZXI6dD0+ZSh0KSxCaWdOdW1iZXI6bj90PT5uKHQpOmltLEZyYWN0aW9uOnI/dD0+cih0KTpvbX07cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToibnVtYmVyIjtpZih2b2lkIDAhPT0oYXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDApKXRocm93IG5ldyBTeW50YXhFcnJvcigibnVtZXJpYygpIHRha2VzIG9uZSBvciB0d28gYXJndW1lbnRzIik7dmFyIG49eHAodCk7aWYoIShuIGluIGkpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICIrdCsnIG9mIHR5cGUgIicrbisnIjsgdmFsaWQgaW5wdXQgdHlwZXMgYXJlICcrT2JqZWN0LmtleXMoaSkuam9pbigiLCAiKSk7aWYoIShlIGluIG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICIrdCsnIHRvIHR5cGUgIicrZSsnIjsgdmFsaWQgb3V0cHV0IHR5cGVzIGFyZSAnK09iamVjdC5rZXlzKG8pLmpvaW4oIiwgIikpO3JldHVybiBlPT09bj90Om9bZV0odCl9fSkpLHhtPSJkaXZpZGVTY2FsYXIiLHdtPWlkKHhtLFsidHlwZWQiLCJudW1lcmljIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxudW1lcmljOm59PXQ7cmV0dXJuIGUoeG0seyJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC9lfSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5kaXYoZSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5kaXYoZSl9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZGl2KGUpfSwiVW5pdCwgbnVtYmVyIHwgQ29tcGxleCB8IEZyYWN0aW9uIHwgQmlnTnVtYmVyIHwgVW5pdCI6KHQsZSk9PnQuZGl2aWRlKGUpLCJudW1iZXIgfCBGcmFjdGlvbiB8IENvbXBsZXggfCBCaWdOdW1iZXIsIFVuaXQiOih0LGUpPT5lLmRpdmlkZUludG8odCl9KX0pKSxibT0iZG90RGl2aWRlIixEbT1pZChibSxbInR5cGVkIiwibWF0cml4IiwiZXF1YWxTY2FsYXIiLCJkaXZpZGVTY2FsYXIiLCJEZW5zZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4sZXF1YWxTY2FsYXI6cixkaXZpZGVTY2FsYXI6aSxEZW5zZU1hdHJpeDpvLGNvbmNhdDpzfT10LGE9WXkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6cn0pLHU9WHkoe3R5cGVkOmV9KSxjPUp5KHt0eXBlZDplLERlbnNlTWF0cml4Om99KSxsPVJ5KHt0eXBlZDplLGVxdWFsU2NhbGFyOnJ9KSxoPUJ5KHt0eXBlZDplLERlbnNlTWF0cml4Om99KSxmPUd5KHt0eXBlZDplLG1hdHJpeDpuLGNvbmNhdDpzfSk7cmV0dXJuIGUoYm0sZih7ZWxvcDppLFNTOmMsRFM6dSxTRDphLFNzOmwsc1M6aH0pKX0pKSxFbT0ic21hbGxlciIsQ209aWQoRW0sWyJ0eXBlZCIsImNvbmZpZyIsIm1hdHJpeCIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixEZW5zZU1hdHJpeDppLGNvbmNhdDpvfT10LHM9WHkoe3R5cGVkOmV9KSxhPUp5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSx1PUJ5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSxjPUd5KHt0eXBlZDplLG1hdHJpeDpyLGNvbmNhdDpvfSksbD1DeSh7dHlwZWQ6ZX0pO3JldHVybiBlKEVtLFNtKHt0eXBlZDplLGNvbmZpZzpufSkseyJib29sZWFuLCBib29sZWFuIjoodCxlKT0+dDxlLCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5sdChlKSYmIUV5KHQsZSxuLmVwc2lsb24pfSwiRnJhY3Rpb24sIEZyYWN0aW9uIjoodCxlKT0+LTE9PT10LmNvbXBhcmUoZSksIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiTm8gb3JkZXJpbmcgcmVsYXRpb24gaXMgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzIil9fSxsLGMoe1NTOmEsRFM6cyxTczp1fSkpfSkpLFNtPWlkKEVtLFsidHlwZWQiLCJjb25maWciXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpufT10O3JldHVybiBlKEVtLHsibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZSYmIWtwKHQsZSxuLmVwc2lsb24pfX0pfSkpLEFtPSJzbWFsbGVyRXEiLE5tPWlkKEFtLFsidHlwZWQiLCJjb25maWciLCJtYXRyaXgiLCJEZW5zZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm4sbWF0cml4OnIsRGVuc2VNYXRyaXg6aSxjb25jYXQ6b309dCxzPVh5KHt0eXBlZDplfSksYT1KeSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksdT1CeSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksYz1HeSh7dHlwZWQ6ZSxtYXRyaXg6cixjb25jYXQ6b30pLGw9Q3koe3R5cGVkOmV9KTtyZXR1cm4gZShBbSxJbSh7dHlwZWQ6ZSxjb25maWc6bn0pLHsiYm9vbGVhbiwgYm9vbGVhbiI6KHQsZSk9PnQ8PWUsIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lmx0ZShlKXx8RXkodCxlLG4uZXBzaWxvbil9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOih0LGUpPT4xIT09dC5jb21wYXJlKGUpLCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIk5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVycyIpfX0sbCxjKHtTUzphLERTOnMsU3M6dX0pKX0pKSxJbT1pZChBbSxbInR5cGVkIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bn09dDtyZXR1cm4gZShBbSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0PD1lfHxrcCh0LGUsbi5lcHNpbG9uKX19KX0pKSxNbT0ibGFyZ2VyIixGbT1pZChNbSxbInR5cGVkIiwiY29uZmlnIiwibWF0cml4IiwiRGVuc2VNYXRyaXgiLCJjb25jYXQiXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpuLG1hdHJpeDpyLERlbnNlTWF0cml4OmksY29uY2F0Om99PXQscz1YeSh7dHlwZWQ6ZX0pLGE9Snkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLHU9Qnkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLGM9R3koe3R5cGVkOmUsbWF0cml4OnIsY29uY2F0Om99KSxsPUN5KHt0eXBlZDplfSk7cmV0dXJuIGUoTW0sVG0oe3R5cGVkOmUsY29uZmlnOm59KSx7ImJvb2xlYW4sIGJvb2xlYW4iOih0LGUpPT50PmUsIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lmd0KGUpJiYhRXkodCxlLG4uZXBzaWxvbil9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOih0LGUpPT4xPT09dC5jb21wYXJlKGUpLCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIk5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVycyIpfX0sbCxjKHtTUzphLERTOnMsU3M6dX0pKX0pKSxUbT1pZChNbSxbInR5cGVkIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bn09dDtyZXR1cm4gZShNbSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0PmUmJiFrcCh0LGUsbi5lcHNpbG9uKX19KX0pKSxPbT0ibGFyZ2VyRXEiLExtPWlkKE9tLFsidHlwZWQiLCJjb25maWciLCJtYXRyaXgiLCJEZW5zZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm4sbWF0cml4OnIsRGVuc2VNYXRyaXg6aSxjb25jYXQ6b309dCxzPVh5KHt0eXBlZDplfSksYT1KeSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksdT1CeSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksYz1HeSh7dHlwZWQ6ZSxtYXRyaXg6cixjb25jYXQ6b30pLGw9Q3koe3R5cGVkOmV9KTtyZXR1cm4gZShPbSxQbSh7dHlwZWQ6ZSxjb25maWc6bn0pLHsiYm9vbGVhbiwgYm9vbGVhbiI6KHQsZSk9PnQ+PWUsIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lmd0ZShlKXx8RXkodCxlLG4uZXBzaWxvbil9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOih0LGUpPT4tMSE9PXQuY29tcGFyZShlKSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJObyBvcmRlcmluZyByZWxhdGlvbiBpcyBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMiKX19LGwsYyh7U1M6YSxEUzpzLFNzOnV9KSl9KSksUG09aWQoT20sWyJ0eXBlZCIsImNvbmZpZyJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm59PXQ7cmV0dXJuIGUoT20seyJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD49ZXx8a3AodCxlLG4uZXBzaWxvbil9fSl9KSksUm09aWQoIkltbXV0YWJsZURlbnNlTWF0cml4IixbInNtYWxsZXIiLCJEZW5zZU1hdHJpeCJdLCh0PT57dmFye3NtYWxsZXI6ZSxEZW5zZU1hdHJpeDpufT10O2Z1bmN0aW9uIHIodCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO2lmKGUmJiFqZihlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZGF0YXR5cGU6ICIrZSk7aWYocWYodCl8fFVmKHQpKXt2YXIgaT1uZXcgbih0LGUpO3RoaXMuX2RhdGE9aS5fZGF0YSx0aGlzLl9zaXplPWkuX3NpemUsdGhpcy5fZGF0YXR5cGU9aS5fZGF0YXR5cGUsdGhpcy5fbWluPW51bGwsdGhpcy5fbWF4PW51bGx9ZWxzZSBpZih0JiZVZih0LmRhdGEpJiZVZih0LnNpemUpKXRoaXMuX2RhdGE9dC5kYXRhLHRoaXMuX3NpemU9dC5zaXplLHRoaXMuX2RhdGF0eXBlPXQuZGF0YXR5cGUsdGhpcy5fbWluPXZvaWQgMCE9PXQubWluP3QubWluOm51bGwsdGhpcy5fbWF4PXZvaWQgMCE9PXQubWF4P3QubWF4Om51bGw7ZWxzZXtpZih0KXRocm93IG5ldyBUeXBlRXJyb3IoIlVuc3VwcG9ydGVkIHR5cGUgb2YgZGF0YSAoIit4cCh0KSsiKSIpO3RoaXMuX2RhdGE9W10sdGhpcy5fc2l6ZT1bMF0sdGhpcy5fZGF0YXR5cGU9ZSx0aGlzLl9taW49bnVsbCx0aGlzLl9tYXg9bnVsbH19cmV0dXJuIHIucHJvdG90eXBlPW5ldyBuLHIucHJvdG90eXBlLnR5cGU9IkltbXV0YWJsZURlbnNlTWF0cml4IixyLnByb3RvdHlwZS5pc0ltbXV0YWJsZURlbnNlTWF0cml4PSEwLHIucHJvdG90eXBlLnN1YnNldD1mdW5jdGlvbih0KXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOnZhciBlPW4ucHJvdG90eXBlLnN1YnNldC5jYWxsKHRoaXMsdCk7cmV0dXJuIHFmKGUpP25ldyByKHtkYXRhOmUuX2RhdGEsc2l6ZTplLl9zaXplLGRhdGF0eXBlOmUuX2RhdGF0eXBlfSk6ZTtjYXNlIDI6Y2FzZSAzOnRocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzZXQgc3Vic2V0IG9uIGFuIEltbXV0YWJsZSBNYXRyaXggaW5zdGFuY2UiKTtkZWZhdWx0OnRocm93IG5ldyBTeW50YXhFcnJvcigiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyIpfX0sci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHNldCBvbiBhbiBJbW11dGFibGUgTWF0cml4IGluc3RhbmNlIil9LHIucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSByZXNpemUgb24gYW4gSW1tdXRhYmxlIE1hdHJpeCBpbnN0YW5jZSIpfSxyLnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHJlc2hhcGUgb24gYW4gSW1tdXRhYmxlIE1hdHJpeCBpbnN0YW5jZSIpfSxyLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgcih7ZGF0YTp3cCh0aGlzLl9kYXRhKSxzaXplOndwKHRoaXMuX3NpemUpLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfSl9LHIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkltbXV0YWJsZURlbnNlTWF0cml4IixkYXRhOnRoaXMuX2RhdGEsc2l6ZTp0aGlzLl9zaXplLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfX0sci5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHIodCl9LHIucHJvdG90eXBlLnN3YXBSb3dzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHN3YXBSb3dzIG9uIGFuIEltbXV0YWJsZSBNYXRyaXggaW5zdGFuY2UiKX0sci5wcm90b3R5cGUubWluPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX21pbil7dmFyIHQ9bnVsbDt0aGlzLmZvckVhY2goKGZ1bmN0aW9uKG4peyhudWxsPT09dHx8ZShuLHQpKSYmKHQ9bil9KSksdGhpcy5fbWluPW51bGwhPT10P3Q6dm9pZCAwfXJldHVybiB0aGlzLl9taW59LHIucHJvdG90eXBlLm1heD1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9tYXgpe3ZhciB0PW51bGw7dGhpcy5mb3JFYWNoKChmdW5jdGlvbihuKXsobnVsbD09PXR8fGUodCxuKSkmJih0PW4pfSkpLHRoaXMuX21heD1udWxsIT09dD90OnZvaWQgMH1yZXR1cm4gdGhpcy5fbWF4fSxyfSkse2lzQ2xhc3M6ITB9KSxCbT1pZCgiSW5kZXgiLFsiSW1tdXRhYmxlRGVuc2VNYXRyaXgiXSwodD0+e3ZhcntJbW11dGFibGVEZW5zZU1hdHJpeDplfT10O2Z1bmN0aW9uIG4odCl7aWYoISh0aGlzIGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3IiKTt0aGlzLl9kaW1lbnNpb25zPVtdLHRoaXMuX2lzU2NhbGFyPSEwO2Zvcih2YXIgZT0wLGk9YXJndW1lbnRzLmxlbmd0aDtlPGk7ZSsrKXt2YXIgbz1hcmd1bWVudHNbZV07aWYoWGYobykpdGhpcy5fZGltZW5zaW9ucy5wdXNoKG8pLHRoaXMuX2lzU2NhbGFyPSExO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShvKXx8cWYobykpe3ZhciBzPXIoby52YWx1ZU9mKCkpO3RoaXMuX2RpbWVuc2lvbnMucHVzaChzKTt2YXIgYT1zLnNpemUoKTsoMSE9PWEubGVuZ3RofHwxIT09YVswXSkmJih0aGlzLl9pc1NjYWxhcj0hMSl9ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIG8pdGhpcy5fZGltZW5zaW9ucy5wdXNoKHIoW29dKSk7ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiRGltZW5zaW9uIG11c3QgYmUgYW4gQXJyYXksIE1hdHJpeCwgbnVtYmVyLCBzdHJpbmcsIG9yIFJhbmdlIik7dGhpcy5fZGltZW5zaW9ucy5wdXNoKG8pfX19ZnVuY3Rpb24gcih0KXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoIm51bWJlciIhPXR5cGVvZiB0W25dfHwhTXAodFtuXSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW5kZXggcGFyYW1ldGVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIgbnVtYmVycyIpO3JldHVybiBuZXcgZSh0KX1yZXR1cm4gbi5wcm90b3R5cGUudHlwZT0iSW5kZXgiLG4ucHJvdG90eXBlLmlzSW5kZXg9ITAsbi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbjtyZXR1cm4gdC5fZGltZW5zaW9ucz13cCh0aGlzLl9kaW1lbnNpb25zKSx0Ll9pc1NjYWxhcj10aGlzLl9pc1NjYWxhcix0fSxuLmNyZWF0ZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbjtyZXR1cm4gbi5hcHBseShlLHQpLGV9LG4ucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5fZGltZW5zaW9ucy5sZW5ndGg7ZTxuO2UrKyl7dmFyIHI9dGhpcy5fZGltZW5zaW9uc1tlXTt0W2VdPSJzdHJpbmciPT10eXBlb2Ygcj8xOnIuc2l6ZSgpWzBdfXJldHVybiB0fSxuLnByb3RvdHlwZS5tYXg9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5fZGltZW5zaW9ucy5sZW5ndGg7ZTxuO2UrKyl7dmFyIHI9dGhpcy5fZGltZW5zaW9uc1tlXTt0W2VdPSJzdHJpbmciPT10eXBlb2Ygcj9yOnIubWF4KCl9cmV0dXJuIHR9LG4ucHJvdG90eXBlLm1pbj1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9kaW1lbnNpb25zLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9kaW1lbnNpb25zW2VdO3RbZV09InN0cmluZyI9PXR5cGVvZiByP3I6ci5taW4oKX1yZXR1cm4gdH0sbi5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoO2U8bjtlKyspdCh0aGlzLl9kaW1lbnNpb25zW2VdLGUsdGhpcyl9LG4ucHJvdG90eXBlLmRpbWVuc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGltZW5zaW9uc1t0XXx8bnVsbH0sbi5wcm90b3R5cGUuaXNPYmplY3RQcm9wZXJ0eT1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5fZGltZW5zaW9ucy5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YgdGhpcy5fZGltZW5zaW9uc1swXX0sbi5wcm90b3R5cGUuZ2V0T2JqZWN0UHJvcGVydHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc09iamVjdFByb3BlcnR5KCk/dGhpcy5fZGltZW5zaW9uc1swXTpudWxsfSxuLnByb3RvdHlwZS5pc1NjYWxhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1NjYWxhcn0sbi5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9kaW1lbnNpb25zLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9kaW1lbnNpb25zW2VdO3QucHVzaCgic3RyaW5nIj09dHlwZW9mIHI/cjpyLnRvQXJyYXkoKSl9cmV0dXJuIHR9LG4ucHJvdG90eXBlLnZhbHVlT2Y9bi5wcm90b3R5cGUudG9BcnJheSxuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9kaW1lbnNpb25zLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9kaW1lbnNpb25zW2VdOyJzdHJpbmciPT10eXBlb2Ygcj90LnB1c2goSlNPTi5zdHJpbmdpZnkocikpOnQucHVzaChyLnRvU3RyaW5nKCkpfXJldHVybiJbIit0LmpvaW4oIiwgIikrIl0ifSxuLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJJbmRleCIsZGltZW5zaW9uczp0aGlzLl9kaW1lbnNpb25zfX0sbi5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gbi5jcmVhdGUodC5kaW1lbnNpb25zKX0sbn0pLHtpc0NsYXNzOiEwfSksa209ImF0YW4yIix6bT1pZChrbSxbInR5cGVkIiwibWF0cml4IiwiZXF1YWxTY2FsYXIiLCJCaWdOdW1iZXIiLCJEZW5zZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4sZXF1YWxTY2FsYXI6cixCaWdOdW1iZXI6aSxEZW5zZU1hdHJpeDpvLGNvbmNhdDpzfT10LGE9WXkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6cn0pLHU9WHkoe3R5cGVkOmV9KSxjPUt5KHt0eXBlZDplLGVxdWFsU2NhbGFyOnJ9KSxsPVJ5KHt0eXBlZDplLGVxdWFsU2NhbGFyOnJ9KSxoPUJ5KHt0eXBlZDplLERlbnNlTWF0cml4Om99KSxmPUd5KHt0eXBlZDplLG1hdHJpeDpuLGNvbmNhdDpzfSk7cmV0dXJuIGUoa20seyJudW1iZXIsIG51bWJlciI6TWF0aC5hdGFuMiwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOih0LGUpPT5pLmF0YW4yKHQsZSl9LGYoe3NjYWxhcjoibnVtYmVyIHwgQmlnTnVtYmVyIixTUzpjLERTOnUsU0Q6YSxTczpsLHNTOmh9KSl9KSksam09aWQoImFkZCIsWyJ0eXBlZCIsIm1hdHJpeCIsImFkZFNjYWxhciIsImVxdWFsU2NhbGFyIiwiRGVuc2VNYXRyaXgiLCJTcGFyc2VNYXRyaXgiLCJjb25jYXQiXSwodD0+e3Zhcnt0eXBlZDplLG1hdHJpeDpuLGFkZFNjYWxhcjpyLGVxdWFsU2NhbGFyOmksRGVuc2VNYXRyaXg6byxTcGFyc2VNYXRyaXg6cyxjb25jYXQ6YX09dCx1PXp5KHt0eXBlZDplfSksYz1qeSh7dHlwZWQ6ZSxlcXVhbFNjYWxhcjppfSksbD1VeSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDpvfSksaD1HeSh7dHlwZWQ6ZSxtYXRyaXg6bixjb25jYXQ6YX0pO3JldHVybiBlKCJhZGQiLHsiYW55LCBhbnkiOnIsImFueSwgYW55LCAuLi5hbnkiOmUucmVmZXJUb1NlbGYoKHQ9PihlLG4scik9Pntmb3IodmFyIGk9dChlLG4pLG89MDtvPHIubGVuZ3RoO28rKylpPXQoaSxyW29dKTtyZXR1cm4gaX0pKX0saCh7ZWxvcDpyLERTOnUsU1M6YyxTczpsfSkpfSkpLFVtPWlkKCJkb3QiLFsidHlwZWQiLCJhZGRTY2FsYXIiLCJtdWx0aXBseVNjYWxhciIsImNvbmoiLCJzaXplIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxhZGRTY2FsYXI6bixtdWx0aXBseVNjYWxhcjpyLGNvbmo6aSxzaXplOm99PXQ7cmV0dXJuIGUoImRvdCIseyJBcnJheSB8IERlbnNlTWF0cml4LCBBcnJheSB8IERlbnNlTWF0cml4IjpmdW5jdGlvbih0LG8pe3ZhciB1PXModCxvKSxjPXFmKHQpP3QuX2RhdGE6dCxsPXFmKHQpP3QuX2RhdGF0eXBlOnZvaWQgMCxoPXFmKG8pP28uX2RhdGE6byxmPXFmKG8pP28uX2RhdGF0eXBlOnZvaWQgMCxwPTI9PT1hKHQpLmxlbmd0aCxkPTI9PT1hKG8pLmxlbmd0aCxnPW4seT1yO2lmKGwmJmYmJmw9PT1mJiYic3RyaW5nIj09dHlwZW9mIGwpe3ZhciBtPWw7Zz1lLmZpbmQobixbbSxtXSkseT1lLmZpbmQocixbbSxtXSl9aWYoIXAmJiFkKXtmb3IodmFyIHY9eShpKGNbMF0pLGhbMF0pLF89MTtfPHU7XysrKXY9Zyh2LHkoaShjW19dKSxoW19dKSk7cmV0dXJuIHZ9aWYoIXAmJmQpe2Zvcih2YXIgeD15KGkoY1swXSksaFswXVswXSksdz0xO3c8dTt3KyspeD1nKHgseShpKGNbd10pLGhbd11bMF0pKTtyZXR1cm4geH1pZihwJiYhZCl7Zm9yKHZhciBiPXkoaShjWzBdWzBdKSxoWzBdKSxEPTE7RDx1O0QrKyliPWcoYix5KGkoY1tEXVswXSksaFtEXSkpO3JldHVybiBifWlmKHAmJmQpe2Zvcih2YXIgRT15KGkoY1swXVswXSksaFswXVswXSksQz0xO0M8dTtDKyspRT1nKEUseShpKGNbQ11bMF0pLGhbQ11bMF0pKTtyZXR1cm4gRX19LCJTcGFyc2VNYXRyaXgsIFNwYXJzZU1hdHJpeCI6ZnVuY3Rpb24odCxlKXtzKHQsZSk7Zm9yKHZhciBpPXQuX2luZGV4LG89dC5fdmFsdWVzLGE9ZS5faW5kZXgsdT1lLl92YWx1ZXMsYz0wLGw9bixoPXIsZj0wLHA9MDtmPGkubGVuZ3RoJiZwPGEubGVuZ3RoOyl7dmFyIGQ9aVtmXSxnPWFbcF07ZDxnP2YrKzpkPmc/cCsrOmQ9PT1nJiYoYz1sKGMsaChvW2ZdLHVbcF0pKSxmKysscCsrKX1yZXR1cm4gY319KTtmdW5jdGlvbiBzKHQsZSl7dmFyIG4scixpPWEodCksbz1hKGUpO2lmKDE9PT1pLmxlbmd0aCluPWlbMF07ZWxzZXtpZigyIT09aS5sZW5ndGh8fDEhPT1pWzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJFeHBlY3RlZCBhIGNvbHVtbiB2ZWN0b3IsIGluc3RlYWQgZ290IGEgbWF0cml4IG9mIHNpemUgKCIraS5qb2luKCIsICIpKyIpIik7bj1pWzBdfWlmKDE9PT1vLmxlbmd0aClyPW9bMF07ZWxzZXtpZigyIT09by5sZW5ndGh8fDEhPT1vWzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJFeHBlY3RlZCBhIGNvbHVtbiB2ZWN0b3IsIGluc3RlYWQgZ290IGEgbWF0cml4IG9mIHNpemUgKCIrby5qb2luKCIsICIpKyIpIik7cj1vWzBdfWlmKG4hPT1yKXRocm93IG5ldyBSYW5nZUVycm9yKCJWZWN0b3JzIG11c3QgaGF2ZSBlcXVhbCBsZW5ndGggKCIrbisiICE9ICIrcisiKSIpO2lmKDA9PT1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJDYW5ub3QgY2FsY3VsYXRlIHRoZSBkb3QgcHJvZHVjdCBvZiBlbXB0eSB2ZWN0b3JzIik7cmV0dXJuIG59ZnVuY3Rpb24gYSh0KXtyZXR1cm4gcWYodCk/dC5zaXplKCk6byh0KX19KSkscW09ImluZGV4IixWbT1pZChxbSxbInR5cGVkIiwiSW5kZXgiXSwodD0+e3Zhcnt0eXBlZDplLEluZGV4Om59PXQ7cmV0dXJuIGUocW0seyIuLi5udW1iZXIgfCBzdHJpbmcgfCBCaWdOdW1iZXIgfCBSYW5nZSB8IEFycmF5IHwgTWF0cml4IjpmdW5jdGlvbih0KXt2YXIgZT10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFJmKHQpP3QudG9OdW1iZXIoKTpBcnJheS5pc0FycmF5KHQpfHxxZih0KT90Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFJmKHQpP3QudG9OdW1iZXIoKTp0fSkpOnR9KSkscj1uZXcgbjtyZXR1cm4gbi5hcHBseShyLGUpLHJ9fSl9KSksR209dHkoe2NvbmZpZzpFcH0pLFltPXJ5KHt9KSxYbT1keSh7fSksV209Z3koe30pLEhtPW15KHtNYXRyaXg6V219KSxabT1nZCh7QmlnTnVtYmVyOkdtLENvbXBsZXg6WW0sRGVuc2VNYXRyaXg6SG0sRnJhY3Rpb246WG19KSxLbT1QeSh7dHlwZWQ6Wm19KSxKbT1NeSh7QmlnTnVtYmVyOkdtLHR5cGVkOlptfSksUW09JHkoe3R5cGVkOlptfSksJG09QXkoe2NvbmZpZzpFcCx0eXBlZDpabX0pLHR2PXh5KHt0eXBlZDpabX0pLGV2PVd5KHt0eXBlZDpabX0pLG52PUl5KHt0eXBlZDpabX0pLHJ2PU55KHtNYXRyaXg6V20sZXF1YWxTY2FsYXI6JG0sdHlwZWQ6Wm19KSxpdj1GeSh7RnJhY3Rpb246WG0sdHlwZWQ6Wm19KSxvdj1PeSh7RGVuc2VNYXRyaXg6SG0sTWF0cml4OldtLFNwYXJzZU1hdHJpeDpydix0eXBlZDpabX0pLHN2PV9tKHtiaWdudW1iZXI6Sm0sZnJhY3Rpb246aXYsbnVtYmVyOm52fSksYXY9bG0oe21hdHJpeDpvdixjb25maWc6RXAsdHlwZWQ6Wm19KSx1dj1mbSh7bWF0cml4Om92LHR5cGVkOlptfSksY3Y9dm0oe21hdHJpeDpvdix0eXBlZDpabX0pLGx2PWVtKHtpc0ludGVnZXI6dHYsbWF0cml4Om92LHR5cGVkOlptfSksaHY9RG0oe0RlbnNlTWF0cml4OkhtLGNvbmNhdDpsdixkaXZpZGVTY2FsYXI6d20oe251bWVyaWM6c3YsdHlwZWQ6Wm19KSxlcXVhbFNjYWxhcjokbSxtYXRyaXg6b3YsdHlwZWQ6Wm19KSxmdj1MbSh7RGVuc2VNYXRyaXg6SG0sY29uY2F0Omx2LGNvbmZpZzpFcCxtYXRyaXg6b3YsdHlwZWQ6Wm19KSxwdj1ybSh7QmlnTnVtYmVyOkdtLGNvbmZpZzpFcCxtYXRyaXg6b3YsdHlwZWQ6Wm19KSxkdj1DbSh7RGVuc2VNYXRyaXg6SG0sY29uY2F0Omx2LGNvbmZpZzpFcCxtYXRyaXg6b3YsdHlwZWQ6Wm19KSxndj1qbSh7RGVuc2VNYXRyaXg6SG0sU3BhcnNlTWF0cml4OnJ2LGFkZFNjYWxhcjpLbSxjb25jYXQ6bHYsZXF1YWxTY2FsYXI6JG0sbWF0cml4Om92LHR5cGVkOlptfSkseXY9VW0oe2FkZFNjYWxhcjpLbSxjb25qOlFtLG11bHRpcGx5U2NhbGFyOmV2LHNpemU6YXYsdHlwZWQ6Wm19KSxtdj1CbSh7SW1tdXRhYmxlRGVuc2VNYXRyaXg6Um0oe0RlbnNlTWF0cml4OkhtLHNtYWxsZXI6ZHZ9KX0pLHZ2PUZtKHtEZW5zZU1hdHJpeDpIbSxjb25jYXQ6bHYsY29uZmlnOkVwLG1hdHJpeDpvdix0eXBlZDpabX0pLF92PVp5KHthZGRTY2FsYXI6S20sZG90Onl2LGVxdWFsU2NhbGFyOiRtLG1hdHJpeDpvdixtdWx0aXBseVNjYWxhcjpldix0eXBlZDpabX0pLHh2PU5tKHtEZW5zZU1hdHJpeDpIbSxjb25jYXQ6bHYsY29uZmlnOkVwLG1hdHJpeDpvdix0eXBlZDpabX0pLHd2PVZtKHtJbmRleDptdix0eXBlZDpabX0pLGJ2PXVtKHtiaWdudW1iZXI6Sm0sbWF0cml4Om92LGNvbmZpZzpFcCxsYXJnZXI6dnYsbGFyZ2VyRXE6ZnYsc21hbGxlcjpkdixzbWFsbGVyRXE6eHYsdHlwZWQ6Wm19KSxEdj16bSh7QmlnTnVtYmVyOkdtLERlbnNlTWF0cml4OkhtLGNvbmNhdDpsdixlcXVhbFNjYWxhcjokbSxtYXRyaXg6b3YsdHlwZWQ6Wm19KTtmdW5jdGlvbiBFdih0LGUsbil7Y29uc3Qgcj1vdihbW2VbMF1bMF0sZVswXVsxXV0sW2VbMV1bMF0sZVsxXVsxXV1dKSxpPWVbMF1bMl0sbz1lWzFdWzJdLHM9bixhPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXSxpPXJbMF0qclswXStyWzFdKnJbMV0sbz1NYXRoLnNxcnQoaSk7ZS5wdXNoKG8pfXJldHVybiBlfSh0LnRvQXJyYXkoKS5tYXAoKHQ9PnQuc2xpY2UoMCwyKSkpKSx1PWh2KHB2KG92KGEpLnNpemUoKSksYSksYz1mdW5jdGlvbih0LGUpe2NvbnN0IG49dC5sZW5ndGgscj1bXTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl7bGV0IG89MDtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKylvPXRbbi1yLTFdK28qZVtpXTtyLnB1c2gobyl9cmV0dXJuIHJ9KHMsRHYoX3YoLTEsdC5zdWJzZXQod3YoYnYoMCxvdih0KS5zaXplKClbMF0pLDIpKSksYSkpO2xldCBsPXB2KDIsdC5zaXplKClbMF0pO2NvbnN0IGg9X3YodC5zdWJzZXQod3YoYnYoMCx0LnNpemUoKVswXSksMCkpLHUqYyksZj1fdih0LnN1YnNldCh3dihidigwLHQuc2l6ZSgpWzBdKSwxKSksdSpjKSxwPW92KFtbaCwwXSxbZiwwXV0pO2w9dXYocCx3dihidigwLHAuc2l6ZSgpWzBdKSwwKSk7Y29uc3QgZD1vdihbaSxvXSksZz1fdihyLGwpLHk9ZC5yZXNoYXBlKFsyLDFdKTtyZXR1cm4gY3YoZ3YoZyx5KSkudG9BcnJheSgpfWZ1bmN0aW9uIEN2KHQ9W10sZSxuLHIpe2NvbnN0IGk9b3YoZnVuY3Rpb24odCl7aWYoMSE9PXQubGVuZ3RofHwzIT09dFswXS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBtYXRyaXggbXVzdCBiZSBhIDF4MyBvciAzeDEgbWF0cml4Iik7cmV0dXJuW1t0WzBdWzBdXSxbdFswXVsxXV0sW3RbMF1bMl1dLFsxXV19KHQpKSxvPW92KGUpLHM9X3YobyxpKTtyZXR1cm4gRXYoY3YocyksbixyKX12YXIgU3Y9T2JqZWN0LmRlZmluZVByb3BlcnR5LEF2PU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLE52PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLEl2PU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsTXY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxGdj1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLFR2PU1hdGgucG93LE92PSh0LGUsbik9PmUgaW4gdD9Tdih0LGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm59KTp0W2VdPW47ZnVuY3Rpb24gTHYodCl7cmV0dXJuKG5ldyBaaCkuc2V0KC4uLnQpfWZ1bmN0aW9uIFB2KHQsZSxuKXt0cnl7Y29uc3Qgcj1WdC50cmFuc2Zlck1hdHJpeDM0RnJvbUtpdHRpMlRocmVlKHQpLGk9VnQudHJhbnNmZXJNYXRyaXgzM0Zyb21LaXR0aTJUaHJlZShlKSxvPVZ0LnRyYW5zZmVyTWF0cml4MzRGcm9tS2l0dGkyVGhyZWUobikscz1MdihyKSxhPUx2KGkpLHU9THYobyk7cmV0dXJue2NvbXBvc2VNYXRyaXg0OnUuY2xvbmUoKS5wcmVtdWx0aXBseShhKS5wcmVtdWx0aXBseShzKSxQTTpzLFJNOmEsVE06dX19Y2F0Y2godCl7fX1jb25zdCBSdj0odCxlKT0+ZS5zb21lKChlPT5mdW5jdGlvbih0LGUsbil7cmV0dXJuISh0Lmxlbmd0aCE9PWV8fHQuc29tZSgodD0+dC5sZW5ndGghPT1uKSkpfSh0LGVbMF0sZVsxXSkpKSxCdj10PT57dmFyIGU7cmV0dXJuISEoKG51bGw9PShlPXQuZmlzaGV5ZURpc3RvcnRpb24pP3ZvaWQgMDplLmxlbmd0aCk+MCYmUnYodC5QLFtbMyw0XSxbNCw0XV0pJiZSdih0LlQsW1szLDRdLFs0LDRdXSkpfSxrdj0odCxlKT0+e2lmKCExIT09QnYoZSkpcmV0dXJuKG51bGw9PWU/dm9pZCAwOmUuY2FtZXJhVHlwZSk9PT1KdC5PbW5pQ2FtZXJhPygodCxlKT0+e2lmKCExPT09QnYoZSkpcmV0dXJuO2NvbnN0e1A6bixmaXNoZXllRGlzdG9ydGlvbjpyLFQ6aX09ZSxvPW5ldyB2aCh0LngsdC55LHQueikscz1MdihWdC50cmFuc2Zlck1hdHJpeDM0RnJvbUtpdHRpMlRocmVlKGkpKSxhPUx2KFZ0LnRyYW5zZmVyTWF0cml4MzRGcm9tS2l0dGkyVGhyZWUobikpLHU9by5hcHBseU1hdHJpeDQocyksYz1UdihUdih1LngsMikrVHYodS55LDIpLC41KSxsPU1hdGguYXRhbih1LnovYyksaD1yLnJlZHVjZSgoKHQsZSxuKT0+dCtlKlR2KGwsbikpLDApO3JldHVybiB1Lng9dS54L2MqaCx1Lnk9dS55L2MqaCx1Lno9MSx1LmFwcGx5TWF0cml4NChhKX0pKHQsZSk6KG51bGw9PWU/dm9pZCAwOmUuY2FtZXJhVHlwZSk9PT1KdC5LYW5uYWxhQnJhbmR0PygodCxlKT0+e2NvbnN0e1A6bixUOnIsZmlzaGV5ZURpc3RvcnRpb246aX09ZSxvPVt0LngsdC55LHQueiwxXSxzPXIubWFwKCh0PT50LnJlZHVjZSgoKHQsZSxuKT0+dCtlKm9bbl0pLDApKSksYT1zWzBdLHU9c1sxXSxjPXNbMl07aWYoIShjPj0uMDEmJmlzRmluaXRlKGMpKSlyZXR1cm47Y29uc3QgbD1bW25bMF1bMF0sblswXVsxXV0sW25bMV1bMF0sblsxXVsxXV1dLGg9blswXVsyXSxmPW5bMV1bMl0scD1NYXRoLnNxcnQoYSphK3UqdSksZD1NYXRoLmF0YW4yKHAsYyksZz1kK2kucmVkdWNlKCgodCxlLG4pPT50K2UqTWF0aC5wb3coZCwyKm4rMykpLDApO2xldCB5LG07cmV0dXJuIDAhPT1wPyh5PWEqZy9wLG09dSpnL3ApOih5PTAsbT0wKSx7eDpsWzBdWzBdKnkrbFswXVsxXSptK2gseTpsWzFdWzBdKnkrbFsxXVsxXSptK2Z9fSkodCxlKToobnVsbD09ZT92b2lkIDA6ZS5jYW1lcmFUeXBlKT09PUp0Lk9tbmlDYW1lcmExMVY/KCh0LGUpPT57aWYoITE9PT1CdihlKSlyZXR1cm47Y29uc3R7UDpuLGZpc2hleWVEaXN0b3J0aW9uOnIsVDppfT1lLG89Q3YoW1t0LngsdC55LHQuel1dLGksbixyKTtyZXR1cm4gbmV3IHZoKG9bMF1bMF0sb1swXVsxXSwxKX0pKHQsZSk6dm9pZCAwfTtmdW5jdGlvbiB6dih0LGUpe2NvbnN0IG49bmV3IHZoKHQueCx0LnksdC56KS5hcHBseU1hdHJpeDQoZSk7aWYobi56PDApcmV0dXJuO2NvbnN0IHI9MS9uLnosaT0obmV3IFpoKS5zZXQociwwLDAsMCwwLHIsMCwwLDAsMCxyLDAsMCwwLDAsMSk7cmV0dXJuIG4uYXBwbHlNYXRyaXg0KGkpfWZ1bmN0aW9uIGp2KHQsZSxuKXtjb25zdCByPWUueC10LngsaT1lLnktdC55LG89bi54LXQueDtyZXR1cm4gcioobi55LXQueSktbyppfWZ1bmN0aW9uIFV2KHQsZSxuPXtjcmVhdGVSYW5nZTohMX0pe3ZhciByO2lmKCFlKXJldHVybnt0cmFuc2ZlclZpZXdEYXRhOltdLHZpZXdSYW5nZVBvaW50TGlzdDpbXX07Y29uc3R7Y3JlYXRlUmFuZ2U6aX09bixvPVV0LmdldEFsbFZpZXdEYXRhKHQpLHM9QnYoZSkse1A6YSxSOnUsVDpjfT1lO2xldCBsO2lmKCExPT09cyl7Y29uc3R7Y29tcG9zZU1hdHJpeDQ6dH09bnVsbCE9KHI9UHYoYSx1LGMpKT9yOnt9O2lmKCF0KXJldHVybjtsPXR9Y29uc3QgaD1vLm1hcCgobj0+KHt0eXBlOm4udHlwZSxwb2ludExpc3Q6bi5wb2ludExpc3QubWFwKChlPT5mdW5jdGlvbih0LGUsbil7dmFyIHI7Y29uc3QgaT1uZXcgeGgodC54LHQueSxudWxsIT0ocj1udWxsPT10P3ZvaWQgMDp0LnopP3I6MSksbz0obmV3IFpoKS5tYWtlUm90YXRpb25aKG4pLHM9KG5ldyBaaCkubWFrZVRyYW5zbGF0aW9uKGUueCxlLnksZS56KSxhPShuZXcgWmgpLm1ha2VUcmFuc2xhdGlvbigtZS54LC1lLnksLWUueik7cmV0dXJuIGkuY2xvbmUoKS5hcHBseU1hdHJpeDQoYSkuYXBwbHlNYXRyaXg0KG8pLmFwcGx5TWF0cml4NChzKX0oZSx0LmNlbnRlcix0LnJvdGF0aW9uKSkpLm1hcCgodD0+cz9rdih0LGUpOmwmJnp2KHQsbCkpKS5tYXAoKHQ9PntpZih0KXJldHVybntpZDp6bCgpLHg6bnVsbD09dD92b2lkIDA6dC54LHk6bnVsbD09dD92b2lkIDA6dC55fX0pKS5maWx0ZXIoKHQ9PnZvaWQgMCE9PXQpKX0pKSkuZmlsdGVyKCh0PT4wIT09dC5wb2ludExpc3QubGVuZ3RoKSk7aFswXSYmaFswXS5wb2ludExpc3QmJihoWzBdLnBvaW50TGlzdD1oWzBdLnBvaW50TGlzdC5tYXAoKHQ9PigodCxlKT0+QXYodCxOdihlKSkpKCgodCxlKT0+e2Zvcih2YXIgbiBpbiBlfHwoZT17fSkpTXYuY2FsbChlLG4pJiZPdih0LG4sZVtuXSk7aWYoSXYpZm9yKHZhciBuIG9mIEl2KGUpKUZ2LmNhbGwoZSxuKSYmT3YodCxuLGVbbl0pO3JldHVybiB0fSkoe30sdCkse3NwZWNpYWxFZGdlOiEwfSkpKSk7bGV0IGY9W107aWYoNj09PWgubGVuZ3RoJiYhMD09PWkpe2Y9ZnVuY3Rpb24odCl7Y29uc3QgZT1mdW5jdGlvbih0KXtjb25zdCBlPXQuc2xpY2UoKTtyZXR1cm4gZS5zb3J0KCgodCxlKT0+dC54PT09ZS54P2UueS10Lnk6dC54LWUueCkpLGV9KHQpLG49W107Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2Zvcig7bi5sZW5ndGg+PTImJmp2KG5bbi5sZW5ndGgtMl0sbltuLmxlbmd0aC0xXSxlW3RdKTw9MDspbi5wb3AoKTtuLnB1c2goZVt0XSl9Y29uc3Qgcj1bXTtmb3IobGV0IHQ9ZS5sZW5ndGgtMTt0Pj0wO3QtLSl7Zm9yKDtyLmxlbmd0aD49MiYmanYocltyLmxlbmd0aC0yXSxyW3IubGVuZ3RoLTFdLGVbdF0pPD0wOylyLnBvcCgpO3IucHVzaChlW3RdKX1yZXR1cm4gbi5wb3AoKSxyLnBvcCgpLG4uY29uY2F0KHIpfShbLi4uaFswXS5wb2ludExpc3QsLi4uaFsxXS5wb2ludExpc3RdKX1yZXR1cm57dHJhbnNmZXJWaWV3RGF0YTpoLHZpZXdSYW5nZVBvaW50TGlzdDpmfX12YXIgcXYsVnY7IWZ1bmN0aW9uKHQpe3RbdC5VcGxvYWQ9MF09IlVwbG9hZCIsdFt0LlVwbG9hZFJldHJ5PTFdPSJVcGxvYWRSZXRyeSIsdFt0LlVwbG9hZEZhaWw9Ml09IlVwbG9hZEZhaWwiLHRbdC5Bbm5vdGF0aW9uPTNdPSJBbm5vdGF0aW9uIix0W3QuVGVybWluYXRlZD00XT0iVGVybWluYXRlZCIsdFt0LkZpbmlzaD01XT0iRmluaXNoIix0W3QuUHVibGlzaD02XT0iUHVibGlzaCJ9KHF2fHwocXY9e30pKSxmdW5jdGlvbih0KXt0W3QuUmVhZHk9MV09IlJlYWR5Iix0W3QuRmlyc3RQb2ludD0yXT0iRmlyc3RQb2ludCIsdFt0LkN1Ym9pZD0zXT0iQ3Vib2lkIn0oVnZ8fChWdj17fSkpO3ZhciBHdj1mdW5jdGlvbih0LGUsbil7dmFyIHI7cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybiByPXJ8fGtsKHQsZSxuKSxuZXcgV29ya2VyKHIsaSl9fSgiTHlvZ2NtOXNiSFZ3TFhCc2RXZHBiaTEzWldJdGQyOXlhMlZ5TFd4dllXUmxjaUFxTHdwMllYSWdkMjl5YTJWeVgyTnZaR1U5Wm5WdVkzUnBiMjRvY0NsN0luVnpaU0J6ZEhKcFkzUWlPMk52Ym5OMElIWTlXeTB4TEMweExDMHhYVHRzWlhRZ1NUMGhNVHRtZFc1amRHbHZiaUJDS0dVcGUyTnZibk4wSUhROUxUY3NiejB6TEc0OWJ5MTBPM0psZEhWeWJpQmxQSFFtSmlobFBYUXBMR1UrYnlZbUtHVTlieWtzVFdGMGFDNW1iRzl2Y2lnb1pTMTBLUzl1S2pJMU5TbDlablZ1WTNScGIyNGdSU2dwZTJ4bGRDQmxPMk52Ym5OMElIUTlibVYzSUVGeWNtRjVLREkxTmlrdVptbHNiQ2dpSWlrdWJXRndLQ2dwUFQ1dVpYY2dRWEp5WVhrb015a3VabWxzYkNnaUlpa3BPMlp2Y2loc1pYUWdiejB3TzI4OE1qQTdieXNyS1h0bWIzSW9aVDB3TzJVOE16STdaU3NyS1hSYlpWMWJNRjA5TVRJNEt6UXFaU3gwVzJWZFd6RmRQVEFzZEZ0bFhWc3lYVDB3TzJadmNpaDBXek15WFZzd1hUMHlOVFVzZEZzek1sMWJNVjA5TUN4MFd6TXlYVnN5WFQwd0xHVTlNRHRsUERZek8yVXJLeWwwV3pNeksyVmRXekJkUFRJMU5TeDBXek16SzJWZFd6RmRQVFFyTkNwbExIUmJNek1yWlYxYk1sMDlNRHRtYjNJb2RGczVObDFiTUYwOU1qVTBMSFJiT1RaZFd6RmRQVEkxTlN4MFd6azJYVnN5WFQweUxHVTlNRHRsUERZeU8yVXJLeWwwV3prM0syVmRXekJkUFRJMU1DMDBLbVVzZEZzNU55dGxYVnN4WFQweU5UVXNkRnM1Tnl0bFhWc3lYVDAyS3pRcVpUdG1iM0lvZEZzeE5UbGRXekJkUFRFc2RGc3hOVGxkV3pGZFBUSTFOU3gwV3pFMU9WMWJNbDA5TWpVMExHVTlNRHRsUERZME8yVXJLeWwwV3pFMk1DdGxYVnN3WFQwd0xIUmJNVFl3SzJWZFd6RmRQVEkxTWkxbEtqUXNkRnN4TmpBclpWMWJNbDA5TWpVMU8yWnZjaWhsUFRBN1pUd3pNanRsS3lzcGRGc3lNalFyWlYxYk1GMDlNQ3gwV3pJeU5DdGxYVnN4WFQwd0xIUmJNakkwSzJWZFd6SmRQVEkxTWkwMEttVjljbVYwZFhKdUlIUjlZMjl1YzNRZ1VqMUZLQ2s3Wm5WdVkzUnBiMjRnYUNobExIUXNiejB3S1h0c1pYUWdiajB3TEdFc2VDeHBMR3c3ZEQxYkxpNHVkRjBzYnowOVBURW1KaWgwUFdOeVpXRjBaVk50YjI5MGFFTjFjblpsVUc5cGJuUnpLSFF1Y21Wa2RXTmxLQ2g1TEdNcFBUNWJMaTR1ZVN4akxuZ3NZeTU1WFN4YlhTa3NMalVzSVRBc1UwVkhUVVZPVkY5T1ZVMUNSVklwS1N4YmFWMDlkRHRqYjI1emRDQjFQWFF1YkdWdVozUm9PMlp2Y2loaFBURTdZVHc5ZFR0aEt5c3BiRDEwVzJFbGRWMHNaUzU0UGsxaGRHZ3ViV2x1S0drdWVDeHNMbmdwSmlabExuZzhQVTFoZEdndWJXRjRLR2t1ZUN4c0xuZ3BKaVpsTG5rOFBVMWhkR2d1YldGNEtHa3VlU3hzTG5rcEppWnBMbmdoUFQxc0xuZ21KaWg0UFNobExuZ3RhUzU0S1Nvb2JDNTVMV2t1ZVNrdktHd3VlQzFwTG5ncEsya3VlU3dvYVM1NVBUMDliQzU1Zkh4bExuazhQWGdwSmladUt5c3BMR2s5YkR0eVpYUjFjbTRnYmlVeUlUMHdmV1oxYm1OMGFXOXVJRThvZTNwTmFXNDZaU3g2VFdGNE9uUXNjRzlzZVdkdmJsQnZhVzUwVEdsemREcHZMR0YwZEhKcFluVjBaVHB1TEhnNllTeDVPbmdzZWpwcExHTnZiRzl5VEdsemREcHNMSFpoYkdsa09uVjlLWHRwWmlob0tIdDRPbUVzZVRwNGZTeHZLU1ltYVQ0OVpTWW1hVHc5ZENseVpYUjFjbTRnZFQwOVBTRXhQMXN4TERFd015OHlOVFVzTVRBeUx6STFOVjA2YkZ0dVhUOXNXMjVkTG5KblltRXVjMnhwWTJVb01Dd3pLUzV0WVhBb1l6MCtZeTh5TlRVcE9sc3hMREFzTUYxOVpuVnVZM1JwYjI0Z2JTaGxLWHRqYjI1emRDQjBQVUlvWlNrc2J6MVNXM1JkTEZ0dUxHRXNlRjA5Ynp0eVpYUjFjbTViYmk4eU5UVXNZUzh5TlRVc2VDOHlOVFZkZlhKbGRIVnliaUJ2Ym0xbGMzTmhaMlU5Wm5WdVkzUnBiMjRvZENsN1kyOXVjM1I3Y0c5emFYUnBiMjQ2Ynl4amIyeHZjanB1TEdOMVltOXBaRXhwYzNRNllTeGpiMnh2Y2t4cGMzUTZlQ3hvYVdkb2JHbG5hSFJKYm1SbGVEcHBmVDEwTG1SaGRHRTdiR1YwZTIxdlpHbG1hV1ZrUW05NFNXUnpPbXc5VzEwc2NtVnpaWFJCY21WaGN6cDFQVnRkZlQxMExtUmhkR0VzZVQwd08yWjFibU4wYVc5dUlHTW9LWHQ1S3oweGZXbG1LQ0Z2S1hKbGRIVnlianRqYjI1emRDQmZQU0VoS0drOVBXNTFiR3cvZG05cFpDQXdPbWt1YkdWdVozUm9LVHNvWDN4OFNTa21KaWhzUFZ0ZExIVTlXMTBwTzJOdmJuTjBJSGM5YkM1c1pXNW5kR2cvWVM1bWFXeDBaWElvY2owK2JDNXBibU5zZFdSbGN5aHlMbWxrS1NrNllUdG1iM0lvYkdWMElISTlNRHR5UEc4dWJHVnVaM1JvTzNJclBUTXBlMk52Ym5OMElFTTliMXR5WFN4TVBXOWJjaXN4WFN4a1BXOWJjaXN5WFR0c1pYUWdaenRwWmloMUxteGxibWQwYUQwOVBURW1KaUZzTG14bGJtZDBhQ2xvS0h0NE9rTXNlVHBNZlN4MVd6QmRLVDluUFcwb1pDazZaejEyTzJWc2MyVWdhV1lvZFM1c1pXNW5kR2g4Zkd3dWJHVnVaM1JvS1h0c1pYUWdjejBoTVR0M0xuTnZiV1VvWmowK2UyTnZibk4wSUUwOVR5aDdjRzlzZVdkdmJsQnZhVzUwVEdsemREcG1MbkJ2YkhsbmIyNVFiMmx1ZEV4cGMzUXNlazFwYmpwbUxucE5hVzRzZWsxaGVEcG1MbnBOWVhnc2VEcERMSGs2VEN4Nk9tUXNZWFIwY21saWRYUmxPbVl1WVhSMGNtbGlkWFJsTEdOdmJHOXlUR2x6ZERwNExIWmhiR2xrT21ZdWRtRnNhV1I5S1R0eVpYUjFjbTRnVFQ4b1l5Z3BMR2M5VFN4elBTRXdMQ0V3S1RvaE1YMHBMQ0Z6SmlaMUxteGxibWQwYUNZbUtITTlkUzV6YjIxbEtHWTlQbWdvZTNnNlF5eDVPa3g5TEdZcFB5aG5QVzBvWkNrc0lUQXBPaUV4S1Nrc0lYTW1KaUZmSmlZb1NUOW5QVzBvWkNrNlp6MTJLWDFsYkhObElIY3VjMjl0WlNoelBUNTdZMjl1YzNRZ1pqMVBLSHR3YjJ4NVoyOXVVRzlwYm5STWFYTjBPbk11Y0c5c2VXZHZibEJ2YVc1MFRHbHpkQ3g2VFdsdU9uTXVlazFwYml4NlRXRjRPbk11ZWsxaGVDeDRPa01zZVRwTUxIbzZaQ3hoZEhSeWFXSjFkR1U2Y3k1aGRIUnlhV0oxZEdVc1kyOXNiM0pNYVhOME9uZ3NkbUZzYVdRNmN5NTJZV3hwWkgwcE8zSmxkSFZ5YmlCbVB5aGpLQ2tzWnoxbUxDRXdLVG9oTVgwcE8yTnZibk4wSUVFOWN6MCtlMk52Ym5OMElHWTlUV0YwYUM1bWJHOXZjaWh6THpNcE8zSmxkSFZ5YmlCcEppWnBXMlpkUFQwOU1YMDdhV1lvWnlscFppaG5XekJkUFQwOWRsc3dYU1ltUVNoeUtTbHVXM0pkUFRBc2JsdHlLekZkUFRBc2JsdHlLekpkUFRBN1pXeHpaWHRqYjI1emRGdHpMR1lzVFYwOVp6dHVXM0pkUFhNc2JsdHlLekZkUFdZc2JsdHlLekpkUFUxOVpXeHpaU0JwWmloQktISXBLVzViY2wwOU1DeHVXM0lyTVYwOU1DeHVXM0lyTWwwOU1EdGxiSE5sZTJOdmJuTjBXM01zWml4TlhUMXRLR1FwTzI1YmNsMDljeXh1VzNJck1WMDlaaXh1VzNJck1sMDlUWDE5U1QxZkxIQnZjM1JOWlhOellXZGxLSHR3YjJsdWRITTZieXhqYjJ4dmNqcHVMRzUxYlRwNWZTbDlMSEF1YVhOSmJsQnZiSGxuYjI0OWFDeFBZbXBsWTNRdVpHVm1hVzVsVUhKdmNHVnlkSGtvY0N3aVgxOWxjMDF2WkhWc1pTSXNlM1poYkhWbE9pRXdmU2tzY0gwb2UzMHBPd29LIixudWxsLCExKTtPYmplY3QuZGVmaW5lUHJvcGVydHk7bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zZWdtZW50U3RhdHVzPUt0LlJlYWR5fXN0YXR1c1RvZ2dsZSgpe3N3aXRjaCh0aGlzLnNlZ21lbnRTdGF0dXMpe2Nhc2UgS3QuUmVhZHk6dGhpcy5zZWdtZW50U3RhdHVzPUt0LkNoZWNrO2JyZWFrO2Nhc2UgS3QuQ2hlY2s6dGhpcy5zZWdtZW50U3RhdHVzPUt0LkVkaXQ7YnJlYWs7Y2FzZSBLdC5FZGl0OnRoaXMuc2VnbWVudFN0YXR1cz1LdC5SZWFkeX19dXBkYXRlU3RhdHVzMkVkaXQoKXt0aGlzLnNlZ21lbnRTdGF0dXM9S3QuRWRpdH11cGRhdGVTdGF0dXMyQ2hlY2soKXt0aGlzLnNlZ21lbnRTdGF0dXM9S3QuQ2hlY2t9dXBkYXRlU3RhdHVzMlJlYWR5KCl7dGhpcy5zZWdtZW50U3RhdHVzPUt0LlJlYWR5fWdldCBpc1JlYWR5U3RhdHVzKCl7cmV0dXJuIHRoaXMuc2VnbWVudFN0YXR1cz09PUt0LlJlYWR5fWdldCBpc0NoZWNrU3RhdHVzKCl7cmV0dXJuIHRoaXMuc2VnbWVudFN0YXR1cz09PUt0LkNoZWNrfWdldCBpc0VkaXRTdGF0dXMoKXtyZXR1cm4gdGhpcy5zZWdtZW50U3RhdHVzPT09S3QuRWRpdH19LG5ldyBHdih7dHlwZToibW9kdWxlIn0pO3ZhciBZdj1lZSgoZnVuY3Rpb24odCxlKXsoZnVuY3Rpb24oKXt2YXIgbixyPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIixpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixvPSJfX2xvZGFzaF9wbGFjZWhvbGRlcl9fIixzPTE2LGE9MzIsdT02NCxjPTEyOCxsPTI1NixoPTEvMCxmPTkwMDcxOTkyNTQ3NDA5OTEscD1OYU4sZD00Mjk0OTY3Mjk1LGc9ZC0xLHk9ZD4+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/by5fX3dyYXBwZWRfXz1pOmU9aTt2YXIgbz1pO3I9ci5fX3dyYXBwZWRfX31yZXR1cm4gby5fX3dyYXBwZWRfXz10LGV9LHFuLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fX3dyYXBwZWRfXztpZih0IGluc3RhbmNlb2YgWG4pe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoJiYoZT1uZXcgWG4odGhpcykpLChlPWUucmV2ZXJzZSgpKS5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOmdzLGFyZ3M6W25zXSx0aGlzQXJnOm59KSxuZXcgWW4oZSx0aGlzLl9fY2hhaW5fXyl9cmV0dXJuIHRoaXMudGhydShucyl9LHFuLnByb3RvdHlwZS50b0pTT049cW4ucHJvdG90eXBlLnZhbHVlT2Y9cW4ucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHlpKHRoaXMuX193cmFwcGVkX18sdGhpcy5fX2FjdGlvbnNfXyl9LHFuLnByb3RvdHlwZS5maXJzdD1xbi5wcm90b3R5cGUuaGVhZCx0ZSYmKHFuLnByb3RvdHlwZVt0ZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHFufSgpO3ZlPygodmUuZXhwb3J0cz12bikuXz12bixtZS5fPXZuKTp5ZS5fPXZufSkuY2FsbCh0ZSl9KSk7Y29uc3QgWHY9KHQsZSxuKT0+e2lmKG5bZV0pcmV0dXJuIG51bGwhPT0oKHQsZSk9Pntjb25zdCBuPU1hdGgubWF4KHQueCxlLngpLHI9TWF0aC5tYXgodC55LGUueSksaT1NYXRoLm1pbih0LngrdC53aWR0aCxlLngrZS53aWR0aCktbixvPU1hdGgubWluKHQueSt0LmhlaWdodCxlLnkrZS5oZWlnaHQpLXI7cmV0dXJuIGk+PTAmJm8+PTA/e3g6bix5OnIsd2lkdGg6aSxoZWlnaHQ6b306bnVsbH0pKHQse3g6MCx5OjAsd2lkdGg6bltlXS53aWR0aCxoZWlnaHQ6bltlXS5oZWlnaHR9KTtyZXR1cm4hMX07dmFyIFd2PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxIdj1PYmplY3QuZGVmaW5lUHJvcGVydGllcyxadj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxLdj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLEp2PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksUXY9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSwkdj0odCxlLG4pPT5lIGluIHQ/V3YodCxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpufSk6dFtlXT1uLHRfPSh0LGUpPT57Zm9yKHZhciBuIGluIGV8fChlPXt9KSlKdi5jYWxsKGUsbikmJiR2KHQsbixlW25dKTtpZihLdilmb3IodmFyIG4gb2YgS3YoZSkpUXYuY2FsbChlLG4pJiYkdih0LG4sZVtuXSk7cmV0dXJuIHR9LGVfPSh0LGUpPT5Idih0LFp2KGUpKTtmdW5jdGlvbiBuXyh0KXt2YXIgZTtjb25zdHtjdXJyZW50RGF0YTpuLGRpc3BsYXlQb2ludENsb3VkTGlzdDpyLHNlbGVjdGVkSUQ6aSxoaWdobGlnaHRBdHRyaWJ1dGU6byxpbWFnZVNpemVzOnMsY29uZmlnOmEscG9seWdvbkxpc3Q6dSxzZWxlY3RlZElEczpjfT10LGw9e2ZpbGw6InRyYW5zcGFyZW50Iixjb2xvcjoiZ3JlZW4ifTtsZXQgaD1bXTtyZXR1cm4gbnVsbD09KGU9bnVsbD09bj92b2lkIDA6bi5tYXBwaW5nSW1nTGlzdCl8fGUuZm9yRWFjaCgodD0+e3ZhciBlLG4sZixwO2NvbnN0IGQ9ci5yZWR1Y2UoKChlLG4pPT57dmFyIHIsdTtjb25zdCBjPW4uaWQ9PT1pfHxvPT09bi5hdHRyaWJ1dGUse3RyYW5zZmVyVmlld0RhdGE6aCx2aWV3UmFuZ2VQb2ludExpc3Q6Zn09bnVsbCE9KHI9VXYobix0LmNhbGliLHtjcmVhdGVSYW5nZTpjfSkpP3I6e307aWYoIWh8fCFmKXJldHVybltdO2NvbnN0IHA9aC5yZWR1Y2UoKCh0LGUpPT4ibGluZSI9PT1lLnR5cGU/Wy4uLnQsLi4uZS5wb2ludExpc3RdOnQpLFtdKSxkPWVfKHRfKHt9LCh0PT57bGV0IGU9MS8wLG49MS8wLHI9LTEvMCxpPS0xLzA7Zm9yKGNvbnN0IG8gb2YgdCllPU1hdGgubWluKGUsby54KSxuPU1hdGgubWluKG4sby55KSxyPU1hdGgubWF4KHIsby54KSxpPU1hdGgubWF4KGksby55KTtyZXR1cm57eDplLHk6bix3aWR0aDpyLWUsaGVpZ2h0Omktbn19KShwKSkse2ltYWdlTmFtZTp0LnBhdGh9KTtpZighWHYoZCx0LnBhdGgscykpcmV0dXJuIGU7Y29uc3QgZz1udWxsPT0odT1GdC5nZXRDb2xvckZyb21Db25maWcoe2F0dHJpYnV0ZTpuLmF0dHJpYnV0ZX0sZV8odF8oe30sYSkse2F0dHJpYnV0ZUNvbmZpZ3VyYWJsZTohMH0pLHt9KSk/dm9pZCAwOnUuc3Ryb2tlLHk9KCh7dmlld0RhdGFQb2ludExpc3Q6dCxwb2ludENsb3VkQm94OmUsZGVmYXVsdFZpZXdTdHlsZTpuLHN0cm9rZTpyfSk9PnQ/dC5tYXAoKHQ9Pih7dHlwZTp0LnR5cGUsYW5ub3RhdGlvbjplXyh0Xyh7aWQ6ZS5pZCxwb2ludExpc3Q6dC5wb2ludExpc3R9LG4pLHtzdHJva2U6cn0pfSkpKTpbXSkoe3ZpZXdEYXRhUG9pbnRMaXN0OmgscG9pbnRDbG91ZEJveDpuLGRlZmF1bHRWaWV3U3R5bGU6bCxzdHJva2U6Z30pLG09Wy4uLmUsLi4ueV07cmV0dXJuKG51bGw9PWY/dm9pZCAwOmYubGVuZ3RoKT4wJiZtLnVuc2hpZnQoe3R5cGU6InBvbHlnb24iLGFubm90YXRpb246ZV8odF8oe2lkOmkscG9pbnRMaXN0OmZ9LGwpLHtzdHJva2U6ZyxmaWxsOiJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNikifSl9KSxtfSksW10pLGc9c1tudWxsIT0oZT1udWxsPT10P3ZvaWQgMDp0LnBhdGgpP2U6IiJdO2cmJll2LmlzTnVtYmVyKG51bGw9PShuPW51bGw9PXQ/dm9pZCAwOnQuY2FsaWIpP3ZvaWQgMDpuLmdyb3VuZEhlaWdodCkmJnUuZm9yRWFjaCgoZT0+e2NvbnN0IG49ZnVuY3Rpb24odCxlLG4pe3ZhciByO2lmKCFlfHwhbilyZXR1cm47Y29uc3QgaT1CdihlKSx7UDpvLFI6cyxUOmF9PWU7bGV0IHU7aWYoITE9PT1pKXtjb25zdHtjb21wb3NlTWF0cml4NDp0fT1udWxsIT0ocj1QdihvLHMsYSkpP3I6e307aWYoIXQpcmV0dXJuO3U9dH1jb25zdCBjPVtdO3JldHVybiB0LmZvckVhY2goKHQ9PntsZXQgbjtpZihuPWk/a3YodCxlKTp1JiZ6dih0LHUpLG4pe2NvbnN0e3g6dCx5OmV9PW47Yy5wdXNoKHt4OnQseTplfSl9fSkpLGMuc29tZSgodD0+dC54PjAmJnQueDxuLndpZHRoJiZ0Lnk+MCYmdC55PG4uaGVpZ2h0KSk/Yzp2b2lkIDB9KGUucG9pbnRMaXN0Lm1hcCgoZT0+e3ZhciBuO3JldHVybiBlXyh0Xyh7fSxlKSx7ejpudWxsPT0obj1udWxsPT10P3ZvaWQgMDp0LmNhbGliKT92b2lkIDA6bi5ncm91bmRIZWlnaHR9KX0pKSxudWxsPT10P3ZvaWQgMDp0LmNhbGliLGcpO2lmKG4pe2NvbnN0IHQ9RnQuZ2V0Q29sb3JGcm9tQ29uZmlnKHthdHRyaWJ1dGU6ZS5hdHRyaWJ1dGV9LGVfKHRfKHt9LGEpLHthdHRyaWJ1dGVDb25maWd1cmFibGU6ITB9KSx7fSk7ZC5wdXNoKHt0eXBlOiJwb2x5Z29uIixhbm5vdGF0aW9uOmVfKHRfKHtpZDplLmlkLHBvaW50TGlzdDpufSxsKSx7c3Ryb2tlOm51bGw9PXQ/dm9pZCAwOnQuc3Ryb2tlLGZpbGw6Yy5pbmNsdWRlcyhlLmlkKT9udWxsPT10P3ZvaWQgMDp0LmZpbGw6InJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSJ9KX0pfX0pKSxoLnB1c2goe2Fubm90YXRpb25zOmQsdXJsOm51bGw9PXQ/dm9pZCAwOnQudXJsLGZhbGxiYWNrVXJsOm51bGwhPShmPW51bGw9PXQ/dm9pZCAwOnQuZmFsbGJhY2tVcmwpP2Y6IiIsY2FsTmFtZTpudWxsPT0ocD1udWxsPT10P3ZvaWQgMDp0LmNhbGliKT92b2lkIDA6cC5jYWxOYW1lLGNhbGliOm51bGw9PXQ/dm9pZCAwOnQuY2FsaWIscGF0aDpudWxsPT10P3ZvaWQgMDp0LnBhdGh9KX0pKSxofW9ubWVzc2FnZT10PT57Y29uc3R7Y3VycmVudERhdGE6ZSxkaXNwbGF5UG9pbnRDbG91ZExpc3Q6bixzZWxlY3RlZElEOnIsaGlnaGxpZ2h0QXR0cmlidXRlOmksaW1hZ2VTaXplczpvLGNvbmZpZzpzLHBvbHlnb25MaXN0OmEsc2VsZWN0ZWRJRHM6dX09dC5kYXRhLGM9bl8oe2N1cnJlbnREYXRhOmUsZGlzcGxheVBvaW50Q2xvdWRMaXN0Om4sc2VsZWN0ZWRJRDpyLGhpZ2hsaWdodEF0dHJpYnV0ZTppLGltYWdlU2l6ZXM6byxjb25maWc6cyxwb2x5Z29uTGlzdDphLHNlbGVjdGVkSURzOnV9KTtwb3N0TWVzc2FnZShjKX19KCk7Cgo=",null,!1);export{l as default};
|