@labelbee/lb-components 1.23.0-alpha.13 → 1.23.0-alpha.131
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/LLMMultiWheelView/dialogView/index.js +1 -0
- package/dist/components/LLMMultiWheelView/index.js +1 -0
- package/dist/components/LLMMultiWheelView/sidebar/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/questionView/index.js +1 -1
- package/dist/components/LLMToolView/sidebar/components/answerSort/index.js +1 -1
- package/dist/components/LLMToolView/sidebar/components/modelAnswerSort/index.js +1 -0
- package/dist/components/LLMToolView/sidebar/components/textEditor/index.js +2 -2
- package/dist/components/LLMToolView/sidebar/components/textInputBox/index.js +2 -2
- package/dist/components/LLMToolView/sidebar/index.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/markdownView/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/useUpdatePointCloudColor.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/data/enums/ToolType.js +1 -1
- package/dist/hooks/useToolStyle.js +1 -0
- package/dist/index.css +205 -16
- package/dist/index.js +1 -1
- package/dist/store/Actions.js +1 -1
- package/dist/store/LLMMultiWheel/index.js +1 -0
- 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/ctx.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/LLMMultiWheelView/dialogView/index.d.ts +15 -0
- package/dist/types/components/LLMMultiWheelView/index.d.ts +20 -0
- package/dist/types/components/LLMMultiWheelView/sidebar/index.d.ts +8 -0
- package/dist/types/components/LLMMultiWheelView/types.d.ts +62 -0
- package/dist/types/components/LLMToolView/questionView/components/header/index.d.ts +15 -0
- package/dist/types/components/LLMToolView/questionView/index.d.ts +7 -0
- package/dist/types/components/LLMToolView/sidebar/components/answerSort/index.d.ts +3 -0
- package/dist/types/components/LLMToolView/sidebar/components/modelAnswerSort/index.d.ts +30 -0
- package/dist/types/components/LLMToolView/sidebar/components/textInputBox/index.d.ts +2 -2
- package/dist/types/components/LLMToolView/sidebar/index.d.ts +10 -0
- package/dist/types/components/LLMToolView/types.d.ts +6 -2
- package/dist/types/components/LLMToolView/utils/data.d.ts +1 -0
- 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 +31 -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/useUpdatePointCloudColor.d.ts +4 -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/data/enums/ToolType.d.ts +2 -1
- package/dist/types/hooks/useToolStyle.d.ts +30 -0
- package/dist/types/index.d.ts +9 -2
- package/dist/types/store/Actions.d.ts +1 -0
- package/dist/types/store/LLMMultiWheel/index.d.ts +15 -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/ctx.d.ts +7 -0
- 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 +24 -0
- package/dist/types/utils/data.d.ts +0 -2
- package/dist/types/utils/index.d.ts +31 -1
- package/dist/types/views/MainView/LLMMultiWheelLayout/index.d.ts +9 -0
- 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/data.js +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/views/MainView/LLMMultiWheelLayout/index.js +1 -0
- 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/sidebar/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/index.js +1 -1
- 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/LLMMultiWheelView/dialogView/index.js +1 -0
- package/es/components/LLMMultiWheelView/index.js +1 -0
- package/es/components/LLMMultiWheelView/sidebar/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/questionView/index.js +1 -1
- package/es/components/LLMToolView/sidebar/components/answerSort/index.js +1 -1
- package/es/components/LLMToolView/sidebar/components/modelAnswerSort/index.js +1 -0
- package/es/components/LLMToolView/sidebar/components/textEditor/index.js +2 -2
- package/es/components/LLMToolView/sidebar/components/textInputBox/index.js +2 -2
- package/es/components/LLMToolView/sidebar/index.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/markdownView/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/useUpdatePointCloudColor.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/data/enums/ToolType.js +1 -1
- package/es/hooks/useToolStyle.js +1 -0
- package/es/index.css +205 -16
- package/es/index.js +1 -1
- package/es/store/Actions.js +1 -1
- package/es/store/LLMMultiWheel/index.js +1 -0
- 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/ctx.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/data.js +1 -1
- package/es/utils/index.js +1 -1
- package/es/views/MainView/LLMMultiWheelLayout/index.js +1 -0
- 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/sidebar/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/index.js +1 -1
- 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 +7 -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
|
+
"use strict";var _rollupPluginWebWorkerLoader__helper__browser__createBase64WorkerFactory=require("./_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js"),WorkerFactory=_rollupPluginWebWorkerLoader__helper__browser__createBase64WorkerFactory.createBase64WorkerFactory("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgVGY9TWF0aC5wb3c7IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuKHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KShlKX1mdW5jdGlvbiBlKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbihlKXt2YXIgbj1mdW5jdGlvbihlLG4pe2lmKCJvYmplY3QiIT10KGUpfHwhZSlyZXR1cm4gZTt2YXIgcj1lW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09cil7dmFyIGk9ci5jYWxsKGUsbnx8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9dChpKSlyZXR1cm4gaTt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PW4/U3RyaW5nOk51bWJlcikoZSl9KGUsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT10KG4pP246bisiIn1mdW5jdGlvbiByKHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuKGkua2V5KSxpKX19ZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIGUmJnIodC5wcm90b3R5cGUsZSksbiYmcih0LG4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLHR9ZnVuY3Rpb24gbyh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9ZnVuY3Rpb24gcyh0LGUpe3JldHVybihzPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0pKHQsZSl9ZnVuY3Rpb24gYSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlJiZzKHQsZSl9ZnVuY3Rpb24gdShlLG4pe2lmKG4mJigib2JqZWN0Ij09dChuKXx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pKXJldHVybiBuO2lmKHZvaWQgMCE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTtyZXR1cm4gbyhlKX1mdW5jdGlvbiBjKHQpe3JldHVybihjPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gbCh0LGUscil7cmV0dXJuKGU9bihlKSlpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPXIsdH1mdW5jdGlvbiBoKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1BcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn1mdW5jdGlvbiBmKHQpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fSh0KXx8ZnVuY3Rpb24odCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJm51bGwhPXRbU3ltYm9sLml0ZXJhdG9yXXx8bnVsbCE9dFsiQEBpdGVyYXRvciJdKXJldHVybiBBcnJheS5mcm9tKHQpfSh0KXx8ZnVuY3Rpb24odCxlKXtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGgodCxlKTt2YXIgbj17fS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpO3JldHVybiJPYmplY3QiPT09biYmdC5jb25zdHJ1Y3RvciYmKG49dC5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PW58fCJTZXQiPT09bj9BcnJheS5mcm9tKHQpOiJBcmd1bWVudHMiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/aCh0LGUpOnZvaWQgMH19KHQpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gcCh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gZCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9wKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bCh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6cChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH12YXIgZz17dHlwZToibG9nZ2VyIixsb2c6ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoImxvZyIsdCl9LHdhcm46ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoIndhcm4iLHQpfSxlcnJvcjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgiZXJyb3IiLHQpfSxvdXRwdXQ6ZnVuY3Rpb24odCxlKXtjb25zb2xlJiZjb25zb2xlW3RdfX0seT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2UodGhpcyx0KSx0aGlzLmluaXQobixyKX1yZXR1cm4gaSh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307dGhpcy5wcmVmaXg9ZS5wcmVmaXh8fCJpMThuZXh0OiIsdGhpcy5sb2dnZXI9dHx8Zyx0aGlzLm9wdGlvbnM9ZSx0aGlzLmRlYnVnPWUuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZChlLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiB0WzBdJiYodFswXT0iIi5jb25jYXQobikuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltlXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCh0aGlzLmxvZ2dlcixkKGQoe30se3ByZWZpeDoiIi5jb25jYXQodGhpcy5wcmVmaXgsIjoiKS5jb25jYXQoZSwiOiIpfSksdGhpcy5vcHRpb25zKSl9fSx7a2V5OiJjbG9uZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuKGU9ZXx8dGhpcy5vcHRpb25zKS5wcmVmaXg9ZS5wcmVmaXh8fHRoaXMucHJlZml4LG5ldyB0KHRoaXMubG9nZ2VyLGUpfX1dKSx0fSgpLG09bmV3IHksdj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtlKHRoaXMsdCksdGhpcy5vYnNlcnZlcnM9e319cmV0dXJuIGkodCxbe2tleToib24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gdC5zcGxpdCgiICIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe24ub2JzZXJ2ZXJzW3RdPW4ub2JzZXJ2ZXJzW3RdfHxbXSxuLm9ic2VydmVyc1t0XS5wdXNoKGUpfSkpLHRoaXN9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5vYnNlcnZlcnNbdF0pe2lmKCFlKXJldHVybiB2b2lkIGRlbGV0ZSB0aGlzLm9ic2VydmVyc1t0XTt0aGlzLm9ic2VydmVyc1t0XT10aGlzLm9ic2VydmVyc1t0XS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09ZX0pKX19fSx7a2V5OiJlbWl0Iix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07dGhpcy5vYnNlcnZlcnNbdF0mJltdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1t0XSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hcHBseSh2b2lkIDAsbil9KSk7dGhpcy5vYnNlcnZlcnNbIioiXSYmW10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzWyIqIl0pLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuYXBwbHkoZSxbdF0uY29uY2F0KG4pKX0pKX19XSksdH0oKTtmdW5jdGlvbiBfKCl7dmFyIHQsZSxuPW5ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe3Q9bixlPXJ9KSk7cmV0dXJuIG4ucmVzb2x2ZT10LG4ucmVqZWN0PWUsbn1mdW5jdGlvbiB4KHQpe3JldHVybiBudWxsPT10PyIiOiIiK3R9ZnVuY3Rpb24gdyh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mdW5jdGlvbiBpKCl7cmV0dXJuIXR8fCJzdHJpbmciPT10eXBlb2YgdH1mb3IodmFyIG89InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7by5sZW5ndGg+MTspe2lmKGkoKSlyZXR1cm57fTt2YXIgcz1yKG8uc2hpZnQoKSk7IXRbc10mJm4mJih0W3NdPW5ldyBuKSx0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHMpP3Rbc106e319cmV0dXJuIGkoKT97fTp7b2JqOnQsazpyKG8uc2hpZnQoKSl9fWZ1bmN0aW9uIGIodCxlLG4pe3ZhciByPXcodCxlLE9iamVjdCk7ci5vYmpbci5rXT1ufWZ1bmN0aW9uIEQodCxlKXt2YXIgbj13KHQsZSkscj1uLm9iaixpPW4uaztpZihyKXJldHVybiByW2ldfWZ1bmN0aW9uIEUodCxlLG4pe3ZhciByPUQodCxuKTtyZXR1cm4gdm9pZCAwIT09cj9yOkQoZSxuKX1mdW5jdGlvbiBDKHQsZSxuKXtmb3IodmFyIHIgaW4gZSkiX19wcm90b19fIiE9PXImJiJjb25zdHJ1Y3RvciIhPT1yJiYociBpbiB0PyJzdHJpbmciPT10eXBlb2YgdFtyXXx8dFtyXWluc3RhbmNlb2YgU3RyaW5nfHwic3RyaW5nIj09dHlwZW9mIGVbcl18fGVbcl1pbnN0YW5jZW9mIFN0cmluZz9uJiYodFtyXT1lW3JdKTpDKHRbcl0sZVtyXSxuKTp0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIFModCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCJcXCQmIil9dmFyIEE9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiBOKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnJlcGxhY2UoL1smPD4iJ1wvXS9nLChmdW5jdGlvbih0KXtyZXR1cm4gQVt0XX0pKTp0fXZhciBJPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ2b2lkIDA9PT13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudERhdGEmJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIik+LTEsTT1bIiAiLCIsIiwiPyIsIiEiLCI7Il07ZnVuY3Rpb24gRih0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gVCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9GKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bCh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6RihPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBPKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1jKHQpO2lmKGUpe3ZhciBpPWModGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHUodGhpcyxuKX19ZnVuY3Rpb24gTCh0LGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXToiLiI7aWYodCl7aWYodFtlXSlyZXR1cm4gdFtlXTtmb3IodmFyIHI9ZS5zcGxpdChuKSxpPXQsbz0wO288ci5sZW5ndGg7KytvKXtpZighaXx8InN0cmluZyI9PXR5cGVvZiBpW3Jbb11dJiZvKzE8ci5sZW5ndGgpcmV0dXJuO2lmKHZvaWQgMD09PWlbcltvXV0pe2Zvcih2YXIgcz0yLGE9ci5zbGljZShvLG8rcykuam9pbihuKSx1PWlbYV07dm9pZCAwPT09dSYmci5sZW5ndGg+bytzOylzKyssdT1pW2E9ci5zbGljZShvLG8rcykuam9pbihuKV07aWYodm9pZCAwPT09dSlyZXR1cm47aWYobnVsbD09PXUpcmV0dXJuIG51bGw7aWYoZS5lbmRzV2l0aChhKSl7aWYoInN0cmluZyI9PXR5cGVvZiB1KXJldHVybiB1O2lmKGEmJiJzdHJpbmciPT10eXBlb2YgdVthXSlyZXR1cm4gdVthXX12YXIgYz1yLnNsaWNlKG8rcykuam9pbihuKTtyZXR1cm4gYz9MKHUsYyxuKTp2b2lkIDB9aT1pW3Jbb11dfXJldHVybiBpfX12YXIgUD1mdW5jdGlvbih0KXthKHIsdCk7dmFyIG49TyhyKTtmdW5jdGlvbiByKHQpe3ZhciBpLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOiJ0cmFuc2xhdGlvbiJ9O3JldHVybiBlKHRoaXMsciksaT1uLmNhbGwodGhpcyksSSYmdi5jYWxsKG8oaSkpLGkuZGF0YT10fHx7fSxpLm9wdGlvbnM9cyx2b2lkIDA9PT1pLm9wdGlvbnMua2V5U2VwYXJhdG9yJiYoaS5vcHRpb25zLmtleVNlcGFyYXRvcj0iLiIpLHZvaWQgMD09PWkub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlJiYoaS5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmU9ITApLGl9cmV0dXJuIGkocixbe2tleToiYWRkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm5zLmluZGV4T2YodCk8MCYmdGhpcy5vcHRpb25zLm5zLnB1c2godCl9fSx7a2V5OiJyZW1vdmVOYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTtlPi0xJiZ0aGlzLm9wdGlvbnMubnMuc3BsaWNlKGUsMSl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxpPXZvaWQgMCE9PXIua2V5U2VwYXJhdG9yP3Iua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3Isbz12b2lkIDAhPT1yLmlnbm9yZUpTT05TdHJ1Y3R1cmU/ci5pZ25vcmVKU09OU3RydWN0dXJlOnRoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlLHM9W3QsZV07biYmInN0cmluZyIhPXR5cGVvZiBuJiYocz1zLmNvbmNhdChuKSksbiYmInN0cmluZyI9PXR5cGVvZiBuJiYocz1zLmNvbmNhdChpP24uc3BsaXQoaSk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYocz10LnNwbGl0KCIuIikpO3ZhciBhPUQodGhpcy5kYXRhLHMpO3JldHVybiBhfHwhb3x8InN0cmluZyIhPXR5cGVvZiBuP2E6TCh0aGlzLmRhdGEmJnRoaXMuZGF0YVt0XSYmdGhpcy5kYXRhW3RdW2VdLG4saSl9fSx7a2V5OiJhZGRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOntzaWxlbnQ6ITF9LG89dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcjt2b2lkIDA9PT1vJiYobz0iLiIpO3ZhciBzPVt0LGVdO24mJihzPXMuY29uY2F0KG8/bi5zcGxpdChvKTpuKSksdC5pbmRleE9mKCIuIik+LTEmJihyPWUsZT0ocz10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSksYih0aGlzLmRhdGEscyxyKSxpLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4scil9fSx7a2V5OiJhZGRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e3NpbGVudDohMX07Zm9yKHZhciBpIGluIG4pKCJzdHJpbmciPT10eXBlb2YgbltpXXx8IltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkobltpXSkpJiZ0aGlzLmFkZFJlc291cmNlKHQsZSxpLG5baV0se3NpbGVudDohMH0pO3Iuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e3NpbGVudDohMX0scz1bdCxlXTt0LmluZGV4T2YoIi4iKT4tMSYmKHI9bixuPWUsZT0ocz10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSk7dmFyIGE9RCh0aGlzLmRhdGEscyl8fHt9O3I/QyhhLG4saSk6YT1UKFQoe30sYSksbiksYih0aGlzLmRhdGEscyxhKSxvLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4pfX0se2tleToicmVtb3ZlUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5oYXNSZXNvdXJjZUJ1bmRsZSh0LGUpJiZkZWxldGUgdGhpcy5kYXRhW3RdW2VdLHRoaXMucmVtb3ZlTmFtZXNwYWNlcyhlKSx0aGlzLmVtaXQoInJlbW92ZWQiLHQsZSl9fSx7a2V5OiJoYXNSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5nZXRSZXNvdXJjZSh0LGUpfX0se2tleToiZ2V0UmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fChlPXRoaXMub3B0aW9ucy5kZWZhdWx0TlMpLCJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQST9UKFQoe30se30pLHRoaXMuZ2V0UmVzb3VyY2UodCxlKSk6dGhpcy5nZXRSZXNvdXJjZSh0LGUpfX0se2tleToiZ2V0RGF0YUJ5TGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGFbdF19fSx7a2V5OiJoYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RGF0YUJ5TGFuZ3VhZ2UodCk7cmV0dXJuISEoZSYmT2JqZWN0LmtleXMoZSl8fFtdKS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XSYmT2JqZWN0LmtleXMoZVt0XSkubGVuZ3RoPjB9KSl9fSx7a2V5OiJ0b0pTT04iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX19XSkscn0odiksUj17cHJvY2Vzc29yczp7fSxhZGRQb3N0UHJvY2Vzc29yOmZ1bmN0aW9uKHQpe3RoaXMucHJvY2Vzc29yc1t0Lm5hbWVdPXR9LGhhbmRsZTpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXRoaXM7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7by5wcm9jZXNzb3JzW3RdJiYoZT1vLnByb2Nlc3NvcnNbdF0ucHJvY2VzcyhlLG4scixpKSl9KSksZX19O2Z1bmN0aW9uIEIodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIGsodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/QihPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOkIoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24geih0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9Yyh0KTtpZihlKXt2YXIgaT1jKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB1KHRoaXMsbil9fXZhciBqPXt9LFU9ZnVuY3Rpb24obil7YShzLG4pO3ZhciByPXoocyk7ZnVuY3Rpb24gcyh0KXt2YXIgbixpPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4gZSh0aGlzLHMpLG49ci5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKG4pKSxmdW5jdGlvbih0LGUsbil7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3RdJiYoblt0XT1lW3RdKX0pKX0oWyJyZXNvdXJjZVN0b3JlIiwibGFuZ3VhZ2VVdGlscyIsInBsdXJhbFJlc29sdmVyIiwiaW50ZXJwb2xhdG9yIiwiYmFja2VuZENvbm5lY3RvciIsImkxOG5Gb3JtYXQiLCJ1dGlscyJdLHQsbyhuKSksbi5vcHRpb25zPWksdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxuLmxvZ2dlcj1tLmNyZWF0ZSgidHJhbnNsYXRvciIpLG59cmV0dXJuIGkocyxbe2tleToiY2hhbmdlTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3QmJih0aGlzLmxhbmd1YWdlPXQpfX0se2tleToiZXhpc3RzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319O2lmKG51bGw9PXQpcmV0dXJuITE7dmFyIG49dGhpcy5yZXNvbHZlKHQsZSk7cmV0dXJuIG4mJnZvaWQgMCE9PW4ucmVzfX0se2tleToiZXh0cmFjdEZyb21LZXkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dm9pZCAwIT09ZS5uc1NlcGFyYXRvcj9lLm5zU2VwYXJhdG9yOnRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjt2b2lkIDA9PT1uJiYobj0iOiIpO3ZhciByPXZvaWQgMCE9PWUua2V5U2VwYXJhdG9yP2Uua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsaT1lLm5zfHx0aGlzLm9wdGlvbnMuZGVmYXVsdE5TfHxbXSxvPW4mJnQuaW5kZXhPZihuKT4tMSxzPSEodGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkS2V5U2VwYXJhdG9yfHxlLmtleVNlcGFyYXRvcnx8dGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkTnNTZXBhcmF0b3J8fGUubnNTZXBhcmF0b3J8fGZ1bmN0aW9uKHQsZSxuKXtlPWV8fCIiLG49bnx8IiI7dmFyIHI9TS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmluZGV4T2YodCk8MCYmbi5pbmRleE9mKHQpPDB9KSk7aWYoMD09PXIubGVuZ3RoKXJldHVybiEwO3ZhciBpPW5ldyBSZWdFeHAoIigiLmNvbmNhdChyLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIj8iPT09dD8iXFw/Ijp0fSkpLmpvaW4oInwiKSwiKSIpKSxvPSFpLnRlc3QodCk7aWYoIW8pe3ZhciBzPXQuaW5kZXhPZihuKTtzPjAmJiFpLnRlc3QodC5zdWJzdHJpbmcoMCxzKSkmJihvPSEwKX1yZXR1cm4gb30odCxuLHIpKTtpZihvJiYhcyl7dmFyIGE9dC5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtpZihhJiZhLmxlbmd0aD4wKXJldHVybntrZXk6dCxuYW1lc3BhY2VzOml9O3ZhciB1PXQuc3BsaXQobik7KG4hPT1yfHxuPT09ciYmdGhpcy5vcHRpb25zLm5zLmluZGV4T2YodVswXSk+LTEpJiYoaT11LnNoaWZ0KCkpLHQ9dS5qb2luKHIpfXJldHVybiJzdHJpbmciPT10eXBlb2YgaSYmKGk9W2ldKSx7a2V5OnQsbmFtZXNwYWNlczppfX19LHtrZXk6InRyYW5zbGF0ZSIsdmFsdWU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPXRoaXM7aWYoIm9iamVjdCIhPT10KG4pJiZ0aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXImJihuPXRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihhcmd1bWVudHMpKSxufHwobj17fSksbnVsbD09ZSlyZXR1cm4iIjtBcnJheS5pc0FycmF5KGUpfHwoZT1bU3RyaW5nKGUpXSk7dmFyIG89dm9pZCAwIT09bi5yZXR1cm5EZXRhaWxzP24ucmV0dXJuRGV0YWlsczp0aGlzLm9wdGlvbnMucmV0dXJuRGV0YWlscyxhPXZvaWQgMCE9PW4ua2V5U2VwYXJhdG9yP24ua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsdT10aGlzLmV4dHJhY3RGcm9tS2V5KGVbZS5sZW5ndGgtMV0sbiksYz11LmtleSxsPXUubmFtZXNwYWNlcyxoPWxbbC5sZW5ndGgtMV0sZj1uLmxuZ3x8dGhpcy5sYW5ndWFnZSxwPW4uYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGV8fHRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZTtpZihmJiYiY2ltb2RlIj09PWYudG9Mb3dlckNhc2UoKSl7aWYocCl7dmFyIGQ9bi5uc1NlcGFyYXRvcnx8dGhpcy5vcHRpb25zLm5zU2VwYXJhdG9yO3JldHVybiBvPyhnLnJlcz0iIi5jb25jYXQoaCkuY29uY2F0KGQpLmNvbmNhdChjKSxnKToiIi5jb25jYXQoaCkuY29uY2F0KGQpLmNvbmNhdChjKX1yZXR1cm4gbz8oZy5yZXM9YyxnKTpjfXZhciBnPXRoaXMucmVzb2x2ZShlLG4pLHk9ZyYmZy5yZXMsbT1nJiZnLnVzZWRLZXl8fGMsdj1nJiZnLmV4YWN0VXNlZEtleXx8YyxfPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoeSkseD12b2lkIDAhPT1uLmpvaW5BcnJheXM/bi5qb2luQXJyYXlzOnRoaXMub3B0aW9ucy5qb2luQXJyYXlzLHc9IXRoaXMuaTE4bkZvcm1hdHx8dGhpcy5pMThuRm9ybWF0LmhhbmRsZUFzT2JqZWN0O2lmKHcmJnkmJigic3RyaW5nIiE9dHlwZW9mIHkmJiJib29sZWFuIiE9dHlwZW9mIHkmJiJudW1iZXIiIT10eXBlb2YgeSkmJlsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXS5pbmRleE9mKF8pPDAmJigic3RyaW5nIiE9dHlwZW9mIHh8fCJbb2JqZWN0IEFycmF5XSIhPT1fKSl7aWYoIW4ucmV0dXJuT2JqZWN0cyYmIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKXt0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyfHx0aGlzLmxvZ2dlci53YXJuKCJhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEiKTt2YXIgYj10aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyP3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIobSx5LGsoayh7fSxuKSx7fSx7bnM6bH0pKToia2V5ICciLmNvbmNhdChjLCIgKCIpLmNvbmNhdCh0aGlzLmxhbmd1YWdlLCIpJyByZXR1cm5lZCBhbiBvYmplY3QgaW5zdGVhZCBvZiBzdHJpbmcuIik7cmV0dXJuIG8/KGcucmVzPWIsZyk6Yn1pZihhKXt2YXIgRD0iW29iamVjdCBBcnJheV0iPT09XyxFPUQ/W106e30sQz1EP3Y6bTtmb3IodmFyIFMgaW4geSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeSxTKSl7dmFyIEE9IiIuY29uY2F0KEMpLmNvbmNhdChhKS5jb25jYXQoUyk7RVtTXT10aGlzLnRyYW5zbGF0ZShBLGsoayh7fSxuKSx7am9pbkFycmF5czohMSxuczpsfSkpLEVbU109PT1BJiYoRVtTXT15W1NdKX15PUV9fWVsc2UgaWYodyYmInN0cmluZyI9PXR5cGVvZiB4JiYiW29iamVjdCBBcnJheV0iPT09XykoeT15LmpvaW4oeCkpJiYoeT10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKHksZSxuLHIpKTtlbHNle3ZhciBOPSExLEk9ITEsTT12b2lkIDAhPT1uLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIG4uY291bnQsRj1zLmhhc0RlZmF1bHRWYWx1ZShuKSxUPU0/dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoZixuLmNvdW50LG4pOiIiLE89blsiZGVmYXVsdFZhbHVlIi5jb25jYXQoVCldfHxuLmRlZmF1bHRWYWx1ZTshdGhpcy5pc1ZhbGlkTG9va3VwKHkpJiZGJiYoTj0hMCx5PU8pLHRoaXMuaXNWYWxpZExvb2t1cCh5KXx8KEk9ITAseT1jKTt2YXIgTD0obi5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXl8fHRoaXMub3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXkpJiZJP3ZvaWQgMDp5LFA9RiYmTyE9PXkmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKEl8fE58fFApe2lmKHRoaXMubG9nZ2VyLmxvZyhQPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixmLGgsYyxQP086eSksYSl7dmFyIFI9dGhpcy5yZXNvbHZlKGMsayhrKHt9LG4pLHt9LHtrZXlTZXBhcmF0b3I6ITF9KSk7UiYmUi5yZXMmJnRoaXMubG9nZ2VyLndhcm4oIlNlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4iKX12YXIgQj1bXSx6PXRoaXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxuLmxuZ3x8dGhpcy5sYW5ndWFnZSk7aWYoImZhbGxiYWNrIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvJiZ6JiZ6WzBdKWZvcih2YXIgaj0wO2o8ei5sZW5ndGg7aisrKUIucHVzaCh6W2pdKTtlbHNlImFsbCI9PT10aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz9CPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobi5sbmd8fHRoaXMubGFuZ3VhZ2UpOkIucHVzaChuLmxuZ3x8dGhpcy5sYW5ndWFnZSk7dmFyIFU9ZnVuY3Rpb24odCxlLHIpe3ZhciBvPUYmJnIhPT15P3I6TDtpLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXI/aS5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyKHQsaCxlLG8sUCxuKTppLmJhY2tlbmRDb25uZWN0b3ImJmkuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyYmaS5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nKHQsaCxlLG8sUCxuKSxpLmVtaXQoIm1pc3NpbmdLZXkiLHQsaCxlLHkpfTt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmcmJih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZNP0IuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXhlcyh0LG4pLmZvckVhY2goKGZ1bmN0aW9uKGUpe1UoW3RdLGMrZSxuWyJkZWZhdWx0VmFsdWUiLmNvbmNhdChlKV18fE8pfSkpfSkpOlUoQixjLE8pKX15PXRoaXMuZXh0ZW5kVHJhbnNsYXRpb24oeSxlLG4sZyxyKSxJJiZ5PT09YyYmdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSYmKHk9IiIuY29uY2F0KGgsIjoiKS5jb25jYXQoYykpLChJfHxOKSYmdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXImJih5PSJ2MSIhPT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQST90aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcih0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5PyIiLmNvbmNhdChoLCI6IikuY29uY2F0KGMpOmMsTj95OnZvaWQgMCk6dGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIoeSkpfXJldHVybiBvPyhnLnJlcz15LGcpOnl9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKXQ9dGhpcy5pMThuRm9ybWF0LnBhcnNlKHQsayhrKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLG4pLHIudXNlZExuZyxyLnVzZWROUyxyLnVzZWRLZXkse3Jlc29sdmVkOnJ9KTtlbHNlIGlmKCFuLnNraXBJbnRlcnBvbGF0aW9uKXtuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLmluaXQoayhrKHt9LG4pLHtpbnRlcnBvbGF0aW9uOmsoayh7fSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiksbi5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgcyxhPSJzdHJpbmciPT10eXBlb2YgdCYmKG4mJm4uaW50ZXJwb2xhdGlvbiYmdm9pZCAwIT09bi5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcz9uLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzOnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyk7aWYoYSl7dmFyIHU9dC5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtzPXUmJnUubGVuZ3RofXZhciBjPW4ucmVwbGFjZSYmInN0cmluZyIhPXR5cGVvZiBuLnJlcGxhY2U/bi5yZXBsYWNlOm47aWYodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyYmKGM9ayhrKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLGMpKSx0PXRoaXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKHQsYyxuLmxuZ3x8dGhpcy5sYW5ndWFnZSxuKSxhKXt2YXIgbD10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO3M8KGwmJmwubGVuZ3RoKSYmKG4ubmVzdD0hMSl9ITEhPT1uLm5lc3QmJih0PXRoaXMuaW50ZXJwb2xhdG9yLm5lc3QodCwoZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheSh0KSxzPTA7czx0O3MrKylyW3NdPWFyZ3VtZW50c1tzXTtyZXR1cm4gaSYmaVswXT09PXJbMF0mJiFuLmNvbnRleHQ/KG8ubG9nZ2VyLndhcm4oIkl0IHNlZW1zIHlvdSBhcmUgbmVzdGluZyByZWN1cnNpdmVseSBrZXk6ICIuY29uY2F0KHJbMF0sIiBpbiBrZXk6ICIpLmNvbmNhdChlWzBdKSksbnVsbCk6by50cmFuc2xhdGUuYXBwbHkobyxyLmNvbmNhdChbZV0pKX0pLG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIGg9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLGY9InN0cmluZyI9PXR5cGVvZiBoP1toXTpoO3JldHVybiBudWxsIT10JiZmJiZmLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKHQ9Ui5oYW5kbGUoZix0LGUsdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMucG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQ/ayh7aTE4blJlc29sdmVkOnJ9LG4pOm4sdGhpcykpLHR9fSx7a2V5OiJyZXNvbHZlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHM9dGhpcyxhPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighcy5pc1ZhbGlkTG9va3VwKGUpKXt2YXIgdT1zLmV4dHJhY3RGcm9tS2V5KHQsYSksYz11LmtleTtuPWM7dmFyIGw9dS5uYW1lc3BhY2VzO3Mub3B0aW9ucy5mYWxsYmFja05TJiYobD1sLmNvbmNhdChzLm9wdGlvbnMuZmFsbGJhY2tOUykpO3ZhciBoPXZvaWQgMCE9PWEuY291bnQmJiJzdHJpbmciIT10eXBlb2YgYS5jb3VudCxmPWgmJiFhLm9yZGluYWwmJjA9PT1hLmNvdW50JiZzLnBsdXJhbFJlc29sdmVyLnNob3VsZFVzZUludGxBcGkoKSxwPXZvaWQgMCE9PWEuY29udGV4dCYmKCJzdHJpbmciPT10eXBlb2YgYS5jb250ZXh0fHwibnVtYmVyIj09dHlwZW9mIGEuY29udGV4dCkmJiIiIT09YS5jb250ZXh0LGQ9YS5sbmdzP2EubG5nczpzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KGEubG5nfHxzLmxhbmd1YWdlLGEuZmFsbGJhY2tMbmcpO2wuZm9yRWFjaCgoZnVuY3Rpb24odCl7cy5pc1ZhbGlkTG9va3VwKGUpfHwobz10LCFqWyIiLmNvbmNhdChkWzBdLCItIikuY29uY2F0KHQpXSYmcy51dGlscyYmcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiFzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShvKSYmKGpbIiIuY29uY2F0KGRbMF0sIi0iKS5jb25jYXQodCldPSEwLHMubG9nZ2VyLndhcm4oJ2tleSAiJy5jb25jYXQobiwnIiBmb3IgbGFuZ3VhZ2VzICInKS5jb25jYXQoZC5qb2luKCIsICIpLCciIHdvblwndCBnZXQgcmVzb2x2ZWQgYXMgbmFtZXNwYWNlICInKS5jb25jYXQobywnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIikpLGQuZm9yRWFjaCgoZnVuY3Rpb24obil7aWYoIXMuaXNWYWxpZExvb2t1cChlKSl7aT1uO3ZhciBvLHU9W2NdO2lmKHMuaTE4bkZvcm1hdCYmcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMpcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXModSxjLG4sdCxhKTtlbHNle3ZhciBsO2gmJihsPXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KG4sYS5jb3VudCxhKSk7dmFyIGQ9IiIuY29uY2F0KHMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IsInplcm8iKTtpZihoJiYodS5wdXNoKGMrbCksZiYmdS5wdXNoKGMrZCkpLHApe3ZhciBnPSIiLmNvbmNhdChjKS5jb25jYXQocy5vcHRpb25zLmNvbnRleHRTZXBhcmF0b3IpLmNvbmNhdChhLmNvbnRleHQpO3UucHVzaChnKSxoJiYodS5wdXNoKGcrbCksZiYmdS5wdXNoKGcrZCkpfX1mb3IoO289dS5wb3AoKTspcy5pc1ZhbGlkTG9va3VwKGUpfHwocj1vLGU9cy5nZXRSZXNvdXJjZShuLHQsbyxhKSl9fSkpKX0pKX19KSkse3JlczplLHVzZWRLZXk6bixleGFjdFVzZWRLZXk6cix1c2VkTG5nOmksdXNlZE5TOm99fX0se2tleToiaXNWYWxpZExvb2t1cCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuISh2b2lkIDA9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybk51bGwmJm51bGw9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybkVtcHR5U3RyaW5nJiYiIj09PXQpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e307cmV0dXJuIHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlP3RoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZSh0LGUsbixyKTp0aGlzLnJlc291cmNlU3RvcmUuZ2V0UmVzb3VyY2UodCxlLG4scil9fV0sW3trZXk6Imhhc0RlZmF1bHRWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9ImRlZmF1bHRWYWx1ZSI7Zm9yKHZhciBuIGluIHQpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJmU9PT1uLnN1YnN0cmluZygwLDEyKSYmdm9pZCAwIT09dFtuXSlyZXR1cm4hMDtyZXR1cm4hMX19XSksc30odik7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfXZhciBWPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuKXtlKHRoaXMsdCksdGhpcy5vcHRpb25zPW4sdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1tLmNyZWF0ZSgibGFuZ3VhZ2VVdGlscyIpfXJldHVybiBpKHQsW3trZXk6ImdldFNjcmlwdFBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIG51bGw7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiAyPT09ZS5sZW5ndGh8fChlLnBvcCgpLCJ4Ij09PWVbZS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKSk/bnVsbDp0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlLmpvaW4oIi0iKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIHQ7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMSl7dmFyIGU9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/bj1uLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKX0pKToyPT09bi5sZW5ndGg/KG5bMF09blswXS50b0xvd2VyQ2FzZSgpLG5bMV09blsxXS50b1VwcGVyQ2FzZSgpLGUuaW5kZXhPZihuWzFdLnRvTG93ZXJDYXNlKCkpPi0xJiYoblsxXT1xKG5bMV0udG9Mb3dlckNhc2UoKSkpKTozPT09bi5sZW5ndGgmJihuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSwyPT09blsxXS5sZW5ndGgmJihuWzFdPW5bMV0udG9VcHBlckNhc2UoKSksInNnbiIhPT1uWzBdJiYyPT09blsyXS5sZW5ndGgmJihuWzJdPW5bMl0udG9VcHBlckNhc2UoKSksZS5pbmRleE9mKG5bMV0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzFdPXEoblsxXS50b0xvd2VyQ2FzZSgpKSksZS5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPXEoblsyXS50b0xvd2VyQ2FzZSgpKSkpLG4uam9pbigiLSIpfXJldHVybiB0aGlzLm9wdGlvbnMuY2xlYW5Db2RlfHx0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nP3QudG9Mb3dlckNhc2UoKTp0fX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO3JldHVybiB0Pyh0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmZvcm1hdExhbmd1YWdlQ29kZSh0KTsoIW4ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHxuLmlzU3VwcG9ydGVkQ29kZShyKSkmJihlPXIpfX0pKSwhZSYmdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MmJnQuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIWUpe3ZhciByPW4uZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCk7aWYobi5pc1N1cHBvcnRlZENvZGUocikpcmV0dXJuIGU9cjtlPW4ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzLmZpbmQoKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YocikpcmV0dXJuIHR9KSl9fSkpLGV8fChlPXRoaXMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpWzBdKSxlKTpudWxsfX0se2tleToiZ2V0RmFsbGJhY2tDb2RlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm5bXTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dChlKSksInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLCJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KHQpKXJldHVybiB0O2lmKCFlKXJldHVybiB0LmRlZmF1bHR8fFtdO3ZhciBuPXRbZV07cmV0dXJuIG58fChuPXRbdGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUoZSldKSxufHwobj10W3RoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGUpXSksbnx8KG49dFt0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGUpXSksbnx8KG49dC5kZWZhdWx0KSxufHxbXX19LHtrZXk6InRvUmVzb2x2ZUhpZXJhcmNoeSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dGhpcy5nZXRGYWxsYmFja0NvZGVzKGV8fHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZ3x8W10sdCksaT1bXSxvPWZ1bmN0aW9uKHQpeyF0fHwobi5pc1N1cHBvcnRlZENvZGUodCk/aS5wdXNoKHQpOm4ubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdCh0KSkpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigiLSIpPi0xPygibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZvKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSwibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiYiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJm8odGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUodCkpLCJjdXJyZW50T25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmbyh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSk6InN0cmluZyI9PXR5cGVvZiB0JiZvKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSxyLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuaW5kZXhPZih0KTwwJiZvKG4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKX0pKSxpfX1dKSx0fSgpLEc9W3tsbmdzOlsiYWNoIiwiYWsiLCJhbSIsImFybiIsImJyIiwiZmlsIiwiZ3VuIiwibG4iLCJtZmUiLCJtZyIsIm1pIiwib2MiLCJwdCIsInB0LUJSIiwidGciLCJ0bCIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtrIiwia24iLCJrdSIsImxiIiwibWFpIiwibWwiLCJtbiIsIm1yIiwibmFoIiwibmFwIiwibmIiLCJuZSIsIm5sIiwibm4iLCJubyIsIm5zbyIsInBhIiwicGFwIiwicG1zIiwicHMiLCJwdC1QVCIsInJtIiwic2NvIiwic2UiLCJzaSIsInNvIiwic29uIiwic3EiLCJzdiIsInN3IiwidGEiLCJ0ZSIsInRrIiwidXIiLCJ5byJdLG5yOlsxLDJdLGZjOjJ9LHtsbmdzOlsiYXkiLCJibyIsImNnZyIsImZhIiwiaHQiLCJpZCIsImphIiwiamJvIiwia2EiLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sWT17MTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ+MSl9LDI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxIT10KX0sMzpmdW5jdGlvbih0KXtyZXR1cm4gMH0sNDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQlMTA+PTImJnQlMTA8PTQmJih0JTEwMDwxMHx8dCUxMDA+PTIwKT8xOjIpfSw1OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMD09dD8wOjE9PXQ/MToyPT10PzI6dCUxMDA+PTMmJnQlMTAwPD0xMD8zOnQlMTAwPj0xMT80OjUpfSw2OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOnQ+PTImJnQ8PTQ/MToyKX0sNzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDp0JTEwPj0yJiZ0JTEwPD00JiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sODpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6OCE9dCYmMTEhPXQ/MjozKX0sOTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ+PTIpfSwxMDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6dDw3PzI6dDwxMT8zOjQpfSwxMTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXR8fDExPT10PzA6Mj09dHx8MTI9PXQ/MTp0PjImJnQ8MjA/MjozKX0sMTI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwIT0xfHx0JTEwMD09MTEpfSwxMzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDAhPT10KX0sMTQ6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOjM9PXQ/MjozKX0sMTU6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDp0JTEwPj0yJiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sMTY6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDowIT09dD8xOjIpfSwxNzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXR8fHQlMTA9PTEmJnQlMTAwIT0xMT8wOjEpfSwxODpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDA9PXQ/MDoxPT10PzE6Mil9LDE5OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjA9PXR8fHQlMTAwPjEmJnQlMTAwPDExPzE6dCUxMDA+MTAmJnQlMTAwPDIwPzI6Myl9LDIwOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjA9PXR8fHQlMTAwPjAmJnQlMTAwPDIwPzE6Mil9LDIxOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMDA9PTE/MTp0JTEwMD09Mj8yOnQlMTAwPT0zfHx0JTEwMD09ND8zOjApfSwyMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6KHQ8MHx8dD4xMCkmJnQlMTA9PTA/MjozKX19LFg9WyJ2MSIsInYyIiwidjMiXSxXPXt6ZXJvOjAsb25lOjEsdHdvOjIsZmV3OjMsbWFueTo0LG90aGVyOjV9O3ZhciBIPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307ZSh0aGlzLHQpLHRoaXMubGFuZ3VhZ2VVdGlscz1uLHRoaXMub3B0aW9ucz1yLHRoaXMubG9nZ2VyPW0uY3JlYXRlKCJwbHVyYWxSZXNvbHZlciIpLCghdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OfHwidjQiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgSW50bHx8IUludGwuUGx1cmFsUnVsZXMpJiYodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPSJ2MyIsdGhpcy5sb2dnZXIuZXJyb3IoIllvdXIgZW52aXJvbm1lbnQgc2VlbXMgbm90IHRvIGJlIEludGwgQVBJIGNvbXBhdGlibGUsIHVzZSBhbiBJbnRsLlBsdXJhbFJ1bGVzIHBvbHlmaWxsLiBXaWxsIGZhbGxiYWNrIHRvIHRoZSBjb21wYXRpYmlsaXR5SlNPTiB2MyBmb3JtYXQgaGFuZGxpbmcuIikpLHRoaXMucnVsZXM9ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gRy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmxuZ3MuZm9yRWFjaCgoZnVuY3Rpb24obil7dFtuXT17bnVtYmVyczplLm5yLHBsdXJhbHM6WVtlLmZjXX19KSl9KSksdH0oKX1yZXR1cm4gaSh0LFt7a2V5OiJhZGRSdWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucnVsZXNbdF09ZX19LHtrZXk6ImdldFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZih0aGlzLnNob3VsZFVzZUludGxBcGkoKSl0cnl7cmV0dXJuIG5ldyBJbnRsLlBsdXJhbFJ1bGVzKHQse3R5cGU6ZS5vcmRpbmFsPyJvcmRpbmFsIjoiY2FyZGluYWwifSl9Y2F0Y2godCl7cmV0dXJufXJldHVybiB0aGlzLnJ1bGVzW3RdfHx0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KV19fSx7a2V5OiJuZWVkc1BsdXJhbCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49dGhpcy5nZXRSdWxlKHQsZSk7cmV0dXJuIHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpP24mJm4ucmVzb2x2ZWRPcHRpb25zKCkucGx1cmFsQ2F0ZWdvcmllcy5sZW5ndGg+MTpuJiZuLm51bWJlcnMubGVuZ3RoPjF9fSx7a2V5OiJnZXRQbHVyYWxGb3Jtc09mS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fTtyZXR1cm4gdGhpcy5nZXRTdWZmaXhlcyh0LG4pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiIuY29uY2F0KGUpLmNvbmNhdCh0KX0pKX19LHtrZXk6ImdldFN1ZmZpeGVzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LHI9dGhpcy5nZXRSdWxlKHQsbik7cmV0dXJuIHI/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/ci5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdbdF0tV1tlXX0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIiLmNvbmNhdChlLm9wdGlvbnMucHJlcGVuZCkuY29uY2F0KHQpfSkpOnIubnVtYmVycy5tYXAoKGZ1bmN0aW9uKHIpe3JldHVybiBlLmdldFN1ZmZpeCh0LHIsbil9KSk6W119fSx7a2V5OiJnZXRTdWZmaXgiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LHI9dGhpcy5nZXRSdWxlKHQsbik7cmV0dXJuIHI/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/IiIuY29uY2F0KHRoaXMub3B0aW9ucy5wcmVwZW5kKS5jb25jYXQoci5zZWxlY3QoZSkpOnRoaXMuZ2V0U3VmZml4UmV0cm9Db21wYXRpYmxlKHIsZSk6KHRoaXMubG9nZ2VyLndhcm4oIm5vIHBsdXJhbCBydWxlIGZvdW5kIGZvcjogIi5jb25jYXQodCkpLCIiKX19LHtrZXk6ImdldFN1ZmZpeFJldHJvQ29tcGF0aWJsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dC5ub0Ficz90LnBsdXJhbHMoZSk6dC5wbHVyYWxzKE1hdGguYWJzKGUpKSxpPXQubnVtYmVyc1tyXTt0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT10Lm51bWJlcnMubGVuZ3RoJiYxPT09dC5udW1iZXJzWzBdJiYoMj09PWk/aT0icGx1cmFsIjoxPT09aSYmKGk9IiIpKTt2YXIgbz1mdW5jdGlvbigpe3JldHVybiBuLm9wdGlvbnMucHJlcGVuZCYmaS50b1N0cmluZygpP24ub3B0aW9ucy5wcmVwZW5kK2kudG9TdHJpbmcoKTppLnRvU3RyaW5nKCl9O3JldHVybiJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/MT09PWk/IiI6Im51bWJlciI9PXR5cGVvZiBpPyJfcGx1cmFsXyIuY29uY2F0KGkudG9TdHJpbmcoKSk6bygpOiJ2MiI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT058fHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PXQubnVtYmVycy5sZW5ndGgmJjE9PT10Lm51bWJlcnNbMF0/bygpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZyLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrci50b1N0cmluZygpOnIudG9TdHJpbmcoKX19LHtrZXk6InNob3VsZFVzZUludGxBcGkiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIVguaW5jbHVkZXModGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKX19XSksdH0oKTtmdW5jdGlvbiBaKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBLKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP1ooT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtsKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpaKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fXZhciBKPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtlKHRoaXMsdCksdGhpcy5sb2dnZXI9bS5jcmVhdGUoImludGVycG9sYXRvciIpLHRoaXMub3B0aW9ucz1uLHRoaXMuZm9ybWF0PW4uaW50ZXJwb2xhdGlvbiYmbi5pbnRlcnBvbGF0aW9uLmZvcm1hdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHRoaXMuaW5pdChuKX1yZXR1cm4gaSh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTt0LmludGVycG9sYXRpb258fCh0LmludGVycG9sYXRpb249e2VzY2FwZVZhbHVlOiEwfSk7dmFyIGU9dC5pbnRlcnBvbGF0aW9uO3RoaXMuZXNjYXBlPXZvaWQgMCE9PWUuZXNjYXBlP2UuZXNjYXBlOk4sdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1lLmVzY2FwZVZhbHVlfHxlLmVzY2FwZVZhbHVlLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1lLnVzZVJhd1ZhbHVlVG9Fc2NhcGUmJmUudXNlUmF3VmFsdWVUb0VzY2FwZSx0aGlzLnByZWZpeD1lLnByZWZpeD9TKGUucHJlZml4KTplLnByZWZpeEVzY2FwZWR8fCJ7eyIsdGhpcy5zdWZmaXg9ZS5zdWZmaXg/UyhlLnN1ZmZpeCk6ZS5zdWZmaXhFc2NhcGVkfHwifX0iLHRoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCIsdGhpcy51bmVzY2FwZVByZWZpeD1lLnVuZXNjYXBlU3VmZml4PyIiOmUudW5lc2NhcGVQcmVmaXh8fCItIix0aGlzLnVuZXNjYXBlU3VmZml4PXRoaXMudW5lc2NhcGVQcmVmaXg/IiI6ZS51bmVzY2FwZVN1ZmZpeHx8IiIsdGhpcy5uZXN0aW5nUHJlZml4PWUubmVzdGluZ1ByZWZpeD9TKGUubmVzdGluZ1ByZWZpeCk6ZS5uZXN0aW5nUHJlZml4RXNjYXBlZHx8UygiJHQoIiksdGhpcy5uZXN0aW5nU3VmZml4PWUubmVzdGluZ1N1ZmZpeD9TKGUubmVzdGluZ1N1ZmZpeCk6ZS5uZXN0aW5nU3VmZml4RXNjYXBlZHx8UygiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9ZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9lLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOmUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPWUubWF4UmVwbGFjZXM/ZS5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9dm9pZCAwIT09ZS5hbHdheXNGb3JtYXQmJmUuYWx3YXlzRm9ybWF0LHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKHQsImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChlLCJnIik7dmFyIG49IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChuLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxzLGE9dGhpcyx1PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBsPWZ1bmN0aW9uKHQpe2lmKHQuaW5kZXhPZihhLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIGk9RShlLHUsdCk7cmV0dXJuIGEuYWx3YXlzRm9ybWF0P2EuZm9ybWF0KGksdm9pZCAwLG4sSyhLKEsoe30sciksZSkse30se2ludGVycG9sYXRpb25rZXk6dH0pKTppfXZhciBvPXQuc3BsaXQoYS5mb3JtYXRTZXBhcmF0b3IpLHM9by5zaGlmdCgpLnRyaW0oKSxjPW8uam9pbihhLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBhLmZvcm1hdChFKGUsdSxzKSxjLG4sSyhLKEsoe30sciksZSkse30se2ludGVycG9sYXRpb25rZXk6c30pKX07dGhpcy5yZXNldFJlZ0V4cCgpO3ZhciBoPXImJnIubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyfHx0aGlzLm9wdGlvbnMubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyLGY9ciYmci5pbnRlcnBvbGF0aW9uJiZ2b2lkIDAhPT1yLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzP3IuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXM6dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO3JldHVyblt7cmVnZXg6dGhpcy5yZWdleHBVbmVzY2FwZSxzYWZlVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIGModCl9fSx7cmVnZXg6dGhpcy5yZWdleHAsc2FmZVZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBhLmVzY2FwZVZhbHVlP2MoYS5lc2NhcGUodCkpOmModCl9fV0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7Zm9yKHM9MDtpPWUucmVnZXguZXhlYyh0KTspe3ZhciBuPWlbMV0udHJpbSgpO2lmKHZvaWQgMD09PShvPWwobikpKWlmKCJmdW5jdGlvbiI9PXR5cGVvZiBoKXt2YXIgdT1oKHQsaSxyKTtvPSJzdHJpbmciPT10eXBlb2YgdT91OiIifWVsc2UgaWYociYmci5oYXNPd25Qcm9wZXJ0eShuKSlvPSIiO2Vsc2V7aWYoZil7bz1pWzBdO2NvbnRpbnVlfWEubG9nZ2VyLndhcm4oIm1pc3NlZCB0byBwYXNzIGluIHZhcmlhYmxlICIuY29uY2F0KG4sIiBmb3IgaW50ZXJwb2xhdGluZyAiKS5jb25jYXQodCkpLG89IiJ9ZWxzZSJzdHJpbmciIT10eXBlb2YgbyYmIWEudXNlUmF3VmFsdWVUb0VzY2FwZSYmKG89eChvKSk7dmFyIGM9ZS5zYWZlVmFsdWUobyk7aWYodD10LnJlcGxhY2UoaVswXSxjKSxmPyhlLnJlZ2V4Lmxhc3RJbmRleCs9by5sZW5ndGgsZS5yZWdleC5sYXN0SW5kZXgtPWlbMF0ubGVuZ3RoKTplLnJlZ2V4Lmxhc3RJbmRleD0wLCsrcz49YS5tYXhSZXBsYWNlcylicmVha319KSksdH19LHtrZXk6Im5lc3QiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30scz1LKHt9LG8pO2Z1bmN0aW9uIGEodCxlKXt2YXIgbj10aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO2lmKHQuaW5kZXhPZihuKTwwKXJldHVybiB0O3ZhciByPXQuc3BsaXQobmV3IFJlZ0V4cCgiIi5jb25jYXQobiwiWyBdKnsiKSkpLGk9InsiLmNvbmNhdChyWzFdKTt0PXJbMF07dmFyIG89KGk9dGhpcy5pbnRlcnBvbGF0ZShpLHMpKS5tYXRjaCgvJy9nKSxhPWkubWF0Y2goLyIvZyk7KG8mJm8ubGVuZ3RoJTI9PTAmJiFhfHxhLmxlbmd0aCUyIT0wKSYmKGk9aS5yZXBsYWNlKC8nL2csJyInKSk7dHJ5e3M9SlNPTi5wYXJzZShpKSxlJiYocz1LKEsoe30sZSkscykpfWNhdGNoKGUpe3JldHVybiB0aGlzLmxvZ2dlci53YXJuKCJmYWlsZWQgcGFyc2luZyBvcHRpb25zIHN0cmluZyBpbiBuZXN0aW5nIGZvciBrZXkgIi5jb25jYXQodCksZSksIiIuY29uY2F0KHQpLmNvbmNhdChuKS5jb25jYXQoaSl9cmV0dXJuIGRlbGV0ZSBzLmRlZmF1bHRWYWx1ZSx0fWZvcihzLmFwcGx5UG9zdFByb2Nlc3Nvcj0hMSxkZWxldGUgcy5kZWZhdWx0VmFsdWU7bj10aGlzLm5lc3RpbmdSZWdleHAuZXhlYyh0KTspe3ZhciB1PVtdLGM9ITE7aWYoLTEhPT1uWzBdLmluZGV4T2YodGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe3ZhciBsPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpfSkpO25bMV09bC5zaGlmdCgpLHU9bCxjPSEwfWlmKChyPWUoYS5jYWxsKHRoaXMsblsxXS50cmltKCkscykscykpJiZuWzBdPT09dCYmInN0cmluZyIhPXR5cGVvZiByKXJldHVybiByOyJzdHJpbmciIT10eXBlb2YgciYmKHI9eChyKSkscnx8KHRoaXMubG9nZ2VyLndhcm4oIm1pc3NlZCB0byByZXNvbHZlICIuY29uY2F0KG5bMV0sIiBmb3IgbmVzdGluZyAiKS5jb25jYXQodCkpLHI9IiIpLGMmJihyPXUucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBpLmZvcm1hdCh0LGUsby5sbmcsSyhLKHt9LG8pLHt9LHtpbnRlcnBvbGF0aW9ua2V5Om5bMV0udHJpbSgpfSkpfSksci50cmltKCkpKSx0PXQucmVwbGFjZShuWzBdLHIpLHRoaXMucmVnZXhwLmxhc3RJbmRleD0wfXJldHVybiB0fX1dKSx0fSgpO2Z1bmN0aW9uIFEodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uICQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/UShPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOlEoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gdHQodCl7dmFyIGU9e307cmV0dXJuIGZ1bmN0aW9uKG4scixpKXt2YXIgbz1yK0pTT04uc3RyaW5naWZ5KGkpLHM9ZVtvXTtyZXR1cm4gc3x8KHM9dChyLGkpLGVbb109cykscyhuKX19dmFyIGV0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtlKHRoaXMsdCksdGhpcy5sb2dnZXI9bS5jcmVhdGUoImZvcm1hdHRlciIpLHRoaXMub3B0aW9ucz1uLHRoaXMuZm9ybWF0cz17bnVtYmVyOnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLk51bWJlckZvcm1hdCh0LGUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5mb3JtYXQodCl9fSkpLGN1cnJlbmN5OnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLk51bWJlckZvcm1hdCh0LCQoJCh7fSxlKSx7fSx7c3R5bGU6ImN1cnJlbmN5In0pKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQpfX0pKSxkYXRldGltZTp0dCgoZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0LCQoe30sZSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5mb3JtYXQodCl9fSkpLHJlbGF0aXZldGltZTp0dCgoZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodCwkKHt9LGUpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQsZS5yYW5nZXx8ImRheSIpfX0pKSxsaXN0OnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLkxpc3RGb3JtYXQodCwkKHt9LGUpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQpfX0pKX0sdGhpcy5pbml0KG4pfXJldHVybiBpKHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319KS5pbnRlcnBvbGF0aW9uO3RoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCJ9fSx7a2V5OiJhZGQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPWV9fSx7a2V5OiJhZGRDYWNoZWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPXR0KGUpfX0se2tleToiZm9ybWF0Iix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLG89ZS5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcikucmVkdWNlKChmdW5jdGlvbih0LGUpe3ZhciBvPWZ1bmN0aW9uKHQpe3ZhciBlPXQudG9Mb3dlckNhc2UoKS50cmltKCksbj17fTtpZih0LmluZGV4T2YoIigiKT4tMSl7dmFyIHI9dC5zcGxpdCgiKCIpO2U9clswXS50b0xvd2VyQ2FzZSgpLnRyaW0oKTt2YXIgaT1yWzFdLnN1YnN0cmluZygwLHJbMV0ubGVuZ3RoLTEpOyJjdXJyZW5jeSI9PT1lJiZpLmluZGV4T2YoIjoiKTwwP24uY3VycmVuY3l8fChuLmN1cnJlbmN5PWkudHJpbSgpKToicmVsYXRpdmV0aW1lIj09PWUmJmkuaW5kZXhPZigiOiIpPDA/bi5yYW5nZXx8KG4ucmFuZ2U9aS50cmltKCkpOmkuc3BsaXQoIjsiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0KXt2YXIgZT1mKHQuc3BsaXQoIjoiKSkscj1lWzBdLGk9ZS5zbGljZSgxKS5qb2luKCI6IikudHJpbSgpLnJlcGxhY2UoL14nK3wnKyQvZywiIik7bltyLnRyaW0oKV18fChuW3IudHJpbSgpXT1pKSwiZmFsc2UiPT09aSYmKG5bci50cmltKCldPSExKSwidHJ1ZSI9PT1pJiYobltyLnRyaW0oKV09ITApLGlzTmFOKGkpfHwobltyLnRyaW0oKV09cGFyc2VJbnQoaSwxMCkpfX0pKX1yZXR1cm57Zm9ybWF0TmFtZTplLGZvcm1hdE9wdGlvbnM6bn19KGUpLHM9by5mb3JtYXROYW1lLGE9by5mb3JtYXRPcHRpb25zO2lmKGkuZm9ybWF0c1tzXSl7dmFyIHU9dDt0cnl7dmFyIGM9ciYmci5mb3JtYXRQYXJhbXMmJnIuZm9ybWF0UGFyYW1zW3IuaW50ZXJwb2xhdGlvbmtleV18fHt9LGw9Yy5sb2NhbGV8fGMubG5nfHxyLmxvY2FsZXx8ci5sbmd8fG47dT1pLmZvcm1hdHNbc10odCxsLCQoJCgkKHt9LGEpLHIpLGMpKX1jYXRjaCh0KXtpLmxvZ2dlci53YXJuKHQpfXJldHVybiB1fXJldHVybiBpLmxvZ2dlci53YXJuKCJ0aGVyZSB3YXMgbm8gZm9ybWF0IGZ1bmN0aW9uIGZvciAiLmNvbmNhdChzKSksdH0pLHQpO3JldHVybiBvfX1dKSx0fSgpO2Z1bmN0aW9uIG50KHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBydCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9udChPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOm50KE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fWZ1bmN0aW9uIGl0KHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1jKHQpO2lmKGUpe3ZhciBpPWModGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHUodGhpcyxuKX19dmFyIG90PWZ1bmN0aW9uKHQpe2Eocix0KTt2YXIgbj1pdChyKTtmdW5jdGlvbiByKHQsaSxzKXt2YXIgYSx1PWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gZSh0aGlzLHIpLGE9bi5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKGEpKSxhLmJhY2tlbmQ9dCxhLnN0b3JlPWksYS5zZXJ2aWNlcz1zLGEubGFuZ3VhZ2VVdGlscz1zLmxhbmd1YWdlVXRpbHMsYS5vcHRpb25zPXUsYS5sb2dnZXI9bS5jcmVhdGUoImJhY2tlbmRDb25uZWN0b3IiKSxhLndhaXRpbmdSZWFkcz1bXSxhLm1heFBhcmFsbGVsUmVhZHM9dS5tYXhQYXJhbGxlbFJlYWRzfHwxMCxhLnJlYWRpbmdDYWxscz0wLGEubWF4UmV0cmllcz11Lm1heFJldHJpZXM+PTA/dS5tYXhSZXRyaWVzOjUsYS5yZXRyeVRpbWVvdXQ9dS5yZXRyeVRpbWVvdXQ+PTE/dS5yZXRyeVRpbWVvdXQ6MzUwLGEuc3RhdGU9e30sYS5xdWV1ZT1bXSxhLmJhY2tlbmQmJmEuYmFja2VuZC5pbml0JiZhLmJhY2tlbmQuaW5pdChzLHUuYmFja2VuZCx1KSxhfXJldHVybiBpKHIsW3trZXk6InF1ZXVlTG9hZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcyxvPXt9LHM9e30sYT17fSx1PXt9O3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPSEwO2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGE9IiIuY29uY2F0KHQsInwiKS5jb25jYXQoZSk7IW4ucmVsb2FkJiZpLnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKHQsZSk/aS5zdGF0ZVthXT0yOmkuc3RhdGVbYV08MHx8KDE9PT1pLnN0YXRlW2FdP3ZvaWQgMD09PXNbYV0mJihzW2FdPSEwKTooaS5zdGF0ZVthXT0xLHI9ITEsdm9pZCAwPT09c1thXSYmKHNbYV09ITApLHZvaWQgMD09PW9bYV0mJihvW2FdPSEwKSx2b2lkIDA9PT11W2VdJiYodVtlXT0hMCkpKX0pKSxyfHwoYVt0XT0hMCl9KSksKE9iamVjdC5rZXlzKG8pLmxlbmd0aHx8T2JqZWN0LmtleXMocykubGVuZ3RoKSYmdGhpcy5xdWV1ZS5wdXNoKHtwZW5kaW5nOnMscGVuZGluZ0NvdW50Ok9iamVjdC5rZXlzKHMpLmxlbmd0aCxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOk9iamVjdC5rZXlzKG8pLHBlbmRpbmc6T2JqZWN0LmtleXMocyksdG9Mb2FkTGFuZ3VhZ2VzOk9iamVjdC5rZXlzKGEpLHRvTG9hZE5hbWVzcGFjZXM6T2JqZWN0LmtleXModSl9fX0se2tleToibG9hZGVkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5zcGxpdCgifCIpLGk9clswXSxvPXJbMV07ZSYmdGhpcy5lbWl0KCJmYWlsZWRMb2FkaW5nIixpLG8sZSksbiYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZUJ1bmRsZShpLG8sbiksdGhpcy5zdGF0ZVt0XT1lPy0xOjI7dmFyIHM9e307dGhpcy5xdWV1ZS5mb3JFYWNoKChmdW5jdGlvbihuKXsoZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dyh0LGUsT2JqZWN0KSxvPWkub2JqLHM9aS5rO29bc109b1tzXXx8W10sciYmKG9bc109b1tzXS5jb25jYXQobikpLHJ8fG9bc10ucHVzaChuKX0pKG4ubG9hZGVkLFtpXSxvKSxmdW5jdGlvbih0LGUpe3ZvaWQgMCE9PXQucGVuZGluZ1tlXSYmKGRlbGV0ZSB0LnBlbmRpbmdbZV0sdC5wZW5kaW5nQ291bnQtLSl9KG4sdCksZSYmbi5lcnJvcnMucHVzaChlKSwwPT09bi5wZW5kaW5nQ291bnQmJiFuLmRvbmUmJihPYmplY3Qua2V5cyhuLmxvYWRlZCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7c1t0XXx8KHNbdF09e30pO3ZhciBlPW4ubG9hZGVkW3RdO2UubGVuZ3RoJiZlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZvaWQgMD09PXNbdF1bZV0mJihzW3RdW2VdPSEwKX0pKX0pKSxuLmRvbmU9ITAsbi5lcnJvcnMubGVuZ3RoP24uY2FsbGJhY2sobi5lcnJvcnMpOm4uY2FsbGJhY2soKSl9KSksdGhpcy5lbWl0KCJsb2FkZWQiLHMpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmRvbmV9KSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTowLG89YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOnRoaXMucmV0cnlUaW1lb3V0LHM9YXJndW1lbnRzLmxlbmd0aD41P2FyZ3VtZW50c1s1XTp2b2lkIDA7cmV0dXJuIHQubGVuZ3RoP3RoaXMucmVhZGluZ0NhbGxzPj10aGlzLm1heFBhcmFsbGVsUmVhZHM/dm9pZCB0aGlzLndhaXRpbmdSZWFkcy5wdXNoKHtsbmc6dCxuczplLGZjTmFtZTpuLHRyaWVkOmksd2FpdDpvLGNhbGxiYWNrOnN9KToodGhpcy5yZWFkaW5nQ2FsbHMrKyx0aGlzLmJhY2tlbmRbbl0odCxlLChmdW5jdGlvbihhLHUpe2lmKHIucmVhZGluZ0NhbGxzLS0sci53YWl0aW5nUmVhZHMubGVuZ3RoPjApe3ZhciBjPXIud2FpdGluZ1JlYWRzLnNoaWZ0KCk7ci5yZWFkKGMubG5nLGMubnMsYy5mY05hbWUsYy50cmllZCxjLndhaXQsYy5jYWxsYmFjayl9YSYmdSYmaTxyLm1heFJldHJpZXM/c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyLnJlYWQuY2FsbChyLHQsZSxuLGkrMSwyKm8scyl9KSxvKTpzKGEsdSl9KSkpOnMobnVsbCx7fSl9fSx7a2V5OiJwcmVwYXJlTG9hZGluZyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7aWYoIXRoaXMuYmFja2VuZClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiTm8gYmFja2VuZCB3YXMgYWRkZWQgdmlhIGkxOG5leHQudXNlLiBXaWxsIG5vdCBsb2FkIHJlc291cmNlcy4iKSxpJiZpKCk7InN0cmluZyI9PXR5cGVvZiB0JiYodD10aGlzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpKSwic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSk7dmFyIG89dGhpcy5xdWV1ZUxvYWQodCxlLHIsaSk7aWYoIW8udG9Mb2FkLmxlbmd0aClyZXR1cm4gby5wZW5kaW5nLmxlbmd0aHx8aSgpLG51bGw7by50b0xvYWQuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5sb2FkT25lKHQpfSkpfX0se2tleToibG9hZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3RoaXMucHJlcGFyZUxvYWRpbmcodCxlLHt9LG4pfX0se2tleToicmVsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse3JlbG9hZDohMH0sbil9fSx7a2V5OiJsb2FkT25lIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiIiLHI9dC5zcGxpdCgifCIpLGk9clswXSxvPXJbMV07dGhpcy5yZWFkKGksbywicmVhZCIsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24ocixzKXtyJiZlLmxvZ2dlci53YXJuKCIiLmNvbmNhdChuLCJsb2FkaW5nIG5hbWVzcGFjZSAiKS5jb25jYXQobywiIGZvciBsYW5ndWFnZSAiKS5jb25jYXQoaSwiIGZhaWxlZCIpLHIpLCFyJiZzJiZlLmxvZ2dlci5sb2coIiIuY29uY2F0KG4sImxvYWRlZCBuYW1lc3BhY2UgIikuY29uY2F0KG8sIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KGkpLHMpLGUubG9hZGVkKHQscixzKX0pKX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTp7fTt0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGUpP3RoaXMubG9nZ2VyLndhcm4oJ2RpZCBub3Qgc2F2ZSBrZXkgIicuY29uY2F0KG4sJyIgYXMgdGhlIG5hbWVzcGFjZSAiJykuY29uY2F0KGUsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpOm51bGw9PW58fCIiPT09bnx8KHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZSh0LGUsbixyLG51bGwscnQocnQoe30sbykse30se2lzVXBkYXRlOml9KSksdCYmdFswXSYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZSh0WzBdLGUsbixyKSl9fV0pLHJ9KHYpO2Z1bmN0aW9uIHN0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdC5ucyYmKHQubnM9W3QubnNdKSwic3RyaW5nIj09dHlwZW9mIHQuZmFsbGJhY2tMbmcmJih0LmZhbGxiYWNrTG5nPVt0LmZhbGxiYWNrTG5nXSksInN0cmluZyI9PXR5cGVvZiB0LmZhbGxiYWNrTlMmJih0LmZhbGxiYWNrTlM9W3QuZmFsbGJhY2tOU10pLHQuc3VwcG9ydGVkTG5ncyYmdC5zdXBwb3J0ZWRMbmdzLmluZGV4T2YoImNpbW9kZSIpPDAmJih0LnN1cHBvcnRlZExuZ3M9dC5zdXBwb3J0ZWRMbmdzLmNvbmNhdChbImNpbW9kZSJdKSksdH1mdW5jdGlvbiBhdCh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gdXQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/YXQoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtsKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTphdChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBjdCh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9Yyh0KTtpZihlKXt2YXIgaT1jKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB1KHRoaXMsbil9fWZ1bmN0aW9uIGx0KCl7fXZhciBodD1mdW5jdGlvbihuKXthKHMsbik7dmFyIHI9Y3Qocyk7ZnVuY3Rpb24gcygpe3ZhciB0LG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYoZSh0aGlzLHMpLHQ9ci5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKHQpKSx0Lm9wdGlvbnM9c3QobiksdC5zZXJ2aWNlcz17fSx0LmxvZ2dlcj1tLHQubW9kdWxlcz17ZXh0ZXJuYWw6W119LGZ1bmN0aW9uKHQpe09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIHRbZV0mJih0W2VdPXRbZV0uYmluZCh0KSl9KSl9KG8odCkpLGkmJiF0LmlzSW5pdGlhbGl6ZWQmJiFuLmlzQ2xvbmUpe2lmKCF0Lm9wdGlvbnMuaW5pdEltbWVkaWF0ZSlyZXR1cm4gdC5pbml0KG4saSksdSh0LG8odCkpO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5pbml0KG4saSl9KSwwKX1yZXR1cm4gdH1yZXR1cm4gaShzLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDsiZnVuY3Rpb24iPT10eXBlb2YgbiYmKHI9bixuPXt9KSwhbi5kZWZhdWx0TlMmJiExIT09bi5kZWZhdWx0TlMmJm4ubnMmJigic3RyaW5nIj09dHlwZW9mIG4ubnM/bi5kZWZhdWx0TlM9bi5uczpuLm5zLmluZGV4T2YoInRyYW5zbGF0aW9uIik8MCYmKG4uZGVmYXVsdE5TPW4ubnNbMF0pKTt2YXIgaT17ZGVidWc6ITEsaW5pdEltbWVkaWF0ZTohMCxuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOlsidHJhbnNsYXRpb24iXSxmYWxsYmFja0xuZzpbImRldiJdLGZhbGxiYWNrTlM6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIG49e307aWYoIm9iamVjdCI9PT10KGVbMV0pJiYobj1lWzFdKSwic3RyaW5nIj09dHlwZW9mIGVbMV0mJihuLmRlZmF1bHRWYWx1ZT1lWzFdKSwic3RyaW5nIj09dHlwZW9mIGVbMl0mJihuLnREZXNjcmlwdGlvbj1lWzJdKSwib2JqZWN0Ij09PXQoZVsyXSl8fCJvYmplY3QiPT09dChlWzNdKSl7dmFyIHI9ZVszXXx8ZVsyXTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKChmdW5jdGlvbih0KXtuW3RdPXJbdF19KSl9cmV0dXJuIG59LGludGVycG9sYXRpb246e2VzY2FwZVZhbHVlOiEwLGZvcm1hdDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdH0scHJlZml4OiJ7eyIsc3VmZml4OiJ9fSIsZm9ybWF0U2VwYXJhdG9yOiIsIix1bmVzY2FwZVByZWZpeDoiLSIsbmVzdGluZ1ByZWZpeDoiJHQoIixuZXN0aW5nU3VmZml4OiIpIixuZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjoiLCIsbWF4UmVwbGFjZXM6MWUzLHNraXBPblZhcmlhYmxlczohMH19O2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQ/ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bmV3IHQ6dDpudWxsfWlmKHRoaXMub3B0aW9ucz11dCh1dCh1dCh7fSxpKSx0aGlzLm9wdGlvbnMpLHN0KG4pKSwidjEiIT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkmJih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbj11dCh1dCh7fSxpLmludGVycG9sYXRpb24pLHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uKSksdm9pZCAwIT09bi5rZXlTZXBhcmF0b3ImJih0aGlzLm9wdGlvbnMudXNlckRlZmluZWRLZXlTZXBhcmF0b3I9bi5rZXlTZXBhcmF0b3IpLHZvaWQgMCE9PW4ubnNTZXBhcmF0b3ImJih0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvcj1uLm5zU2VwYXJhdG9yKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe3ZhciBzO3RoaXMubW9kdWxlcy5sb2dnZXI/bS5pbml0KG8odGhpcy5tb2R1bGVzLmxvZ2dlciksdGhpcy5vcHRpb25zKTptLmluaXQobnVsbCx0aGlzLm9wdGlvbnMpLHRoaXMubW9kdWxlcy5mb3JtYXR0ZXI/cz10aGlzLm1vZHVsZXMuZm9ybWF0dGVyOiJ1bmRlZmluZWQiIT10eXBlb2YgSW50bCYmKHM9ZXQpO3ZhciBhPW5ldyBWKHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgUCh0aGlzLm9wdGlvbnMucmVzb3VyY2VzLHRoaXMub3B0aW9ucyk7dmFyIHU9dGhpcy5zZXJ2aWNlczt1LmxvZ2dlcj1tLHUucmVzb3VyY2VTdG9yZT10aGlzLnN0b3JlLHUubGFuZ3VhZ2VVdGlscz1hLHUucGx1cmFsUmVzb2x2ZXI9bmV3IEgoYSx7cHJlcGVuZDp0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLGNvbXBhdGliaWxpdHlKU09OOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixzaW1wbGlmeVBsdXJhbFN1ZmZpeDp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXh9KSxzJiYoIXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdHx8dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0PT09aS5pbnRlcnBvbGF0aW9uLmZvcm1hdCkmJih1LmZvcm1hdHRlcj1vKHMpLHUuZm9ybWF0dGVyLmluaXQodSx0aGlzLm9wdGlvbnMpLHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdD11LmZvcm1hdHRlci5mb3JtYXQuYmluZCh1LmZvcm1hdHRlcikpLHUuaW50ZXJwb2xhdG9yPW5ldyBKKHRoaXMub3B0aW9ucyksdS51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnRoaXMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQodGhpcyl9LHUuYmFja2VuZENvbm5lY3Rvcj1uZXcgb3Qobyh0aGlzLm1vZHVsZXMuYmFja2VuZCksdS5yZXNvdXJjZVN0b3JlLHUsdGhpcy5vcHRpb25zKSx1LmJhY2tlbmRDb25uZWN0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLGk9MTtpPG47aSsrKXJbaS0xXT1hcmd1bWVudHNbaV07ZS5lbWl0LmFwcGx5KGUsW3RdLmNvbmNhdChyKSl9KSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJih1Lmxhbmd1YWdlRGV0ZWN0b3I9byh0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksdS5sYW5ndWFnZURldGVjdG9yLmluaXQodSx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYodS5pMThuRm9ybWF0PW8odGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLHUuaTE4bkZvcm1hdC5pbml0JiZ1LmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBVKHRoaXMuc2VydmljZXMsdGhpcy5vcHRpb25zKSx0aGlzLnRyYW5zbGF0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLGk9MTtpPG47aSsrKXJbaS0xXT1hcmd1bWVudHNbaV07ZS5lbWl0LmFwcGx5KGUsW3RdLmNvbmNhdChyKSl9KSksdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuaW5pdCYmdC5pbml0KGUpfSkpfWlmKHRoaXMuZm9ybWF0PXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCxyfHwocj1sdCksdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nJiYhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5vcHRpb25zLmxuZyl7dmFyIGM9dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKTtjLmxlbmd0aD4wJiYiZGV2IiE9PWNbMF0mJih0aGlzLm9wdGlvbnMubG5nPWNbMF0pfSF0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJiF0aGlzLm9wdGlvbnMubG5nJiZ0aGlzLmxvZ2dlci53YXJuKCJpbml0OiBubyBsYW5ndWFnZURldGVjdG9yIGlzIHVzZWQgYW5kIG5vIGxuZyBpcyBkZWZpbmVkIik7WyJnZXRSZXNvdXJjZSIsImhhc1Jlc291cmNlQnVuZGxlIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJnZXREYXRhQnlMYW5ndWFnZSJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe2VbdF09ZnVuY3Rpb24oKXt2YXIgbjtyZXR1cm4obj1lLnN0b3JlKVt0XS5hcHBseShuLGFyZ3VtZW50cyl9fSkpO1siYWRkUmVzb3VyY2UiLCJhZGRSZXNvdXJjZXMiLCJhZGRSZXNvdXJjZUJ1bmRsZSIsInJlbW92ZVJlc291cmNlQnVuZGxlIl0uZm9yRWFjaCgoZnVuY3Rpb24odCl7ZVt0XT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPWUuc3RvcmUpW3RdLmFwcGx5KG4sYXJndW1lbnRzKSxlfX0pKTt2YXIgbD1fKCksaD1mdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKHQsbil7ZS5pc0luaXRpYWxpemVkJiYhZS5pbml0aWFsaXplZFN0b3JlT25jZSYmZS5sb2dnZXIud2FybigiaW5pdDogaTE4bmV4dCBpcyBhbHJlYWR5IGluaXRpYWxpemVkLiBZb3Ugc2hvdWxkIGNhbGwgaW5pdCBqdXN0IG9uY2UhIiksZS5pc0luaXRpYWxpemVkPSEwLGUub3B0aW9ucy5pc0Nsb25lfHxlLmxvZ2dlci5sb2coImluaXRpYWxpemVkIixlLm9wdGlvbnMpLGUuZW1pdCgiaW5pdGlhbGl6ZWQiLGUub3B0aW9ucyksbC5yZXNvbHZlKG4pLHIodCxuKX07aWYoZS5sYW5ndWFnZXMmJiJ2MSIhPT1lLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSYmIWUuaXNJbml0aWFsaXplZClyZXR1cm4gdChudWxsLGUudC5iaW5kKGUpKTtlLmNoYW5nZUxhbmd1YWdlKGUub3B0aW9ucy5sbmcsdCl9O3JldHVybiB0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHwhdGhpcy5vcHRpb25zLmluaXRJbW1lZGlhdGU/aCgpOnNldFRpbWVvdXQoaCwwKSxsfX0se2tleToibG9hZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpsdCxyPSJzdHJpbmciPT10eXBlb2YgdD90OnRoaXMubGFuZ3VhZ2U7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPXQpLCF0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHx0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXMpe2lmKHImJiJjaW1vZGUiPT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiBuKCk7dmFyIGk9W10sbz1mdW5jdGlvbih0KXt0JiZlLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuaW5kZXhPZih0KTwwJiZpLnB1c2godCl9KSl9O2lmKHIpbyhyKTtlbHNlIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZykuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIG8odCl9KSk7dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBvKHQpfSkpLHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5sb2FkKGksdGhpcy5vcHRpb25zLm5zLChmdW5jdGlvbih0KXshdCYmIWUucmVzb2x2ZWRMYW5ndWFnZSYmZS5sYW5ndWFnZSYmZS5zZXRSZXNvbHZlZExhbmd1YWdlKGUubGFuZ3VhZ2UpLG4odCl9KSl9ZWxzZSBuKG51bGwpfX0se2tleToicmVsb2FkUmVzb3VyY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9XygpO3JldHVybiB0fHwodD10aGlzLmxhbmd1YWdlcyksZXx8KGU9dGhpcy5vcHRpb25zLm5zKSxufHwobj1sdCksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZCh0LGUsKGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLG4odCl9KSkscn19LHtrZXk6InVzZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYW4gdW5kZWZpbmVkIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtpZighdC50eXBlKXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGEgd3JvbmcgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO3JldHVybiJiYWNrZW5kIj09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5iYWNrZW5kPXQpLCgibG9nZ2VyIj09PXQudHlwZXx8dC5sb2cmJnQud2FybiYmdC5lcnJvcikmJih0aGlzLm1vZHVsZXMubG9nZ2VyPXQpLCJsYW5ndWFnZURldGVjdG9yIj09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yPXQpLCJpMThuRm9ybWF0Ij09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0PXQpLCJwb3N0UHJvY2Vzc29yIj09PXQudHlwZSYmUi5hZGRQb3N0UHJvY2Vzc29yKHQpLCJmb3JtYXR0ZXIiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmZvcm1hdHRlcj10KSwiM3JkUGFydHkiPT09dC50eXBlJiZ0aGlzLm1vZHVsZXMuZXh0ZXJuYWwucHVzaCh0KSx0aGlzfX0se2tleToic2V0UmVzb2x2ZWRMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodCYmdGhpcy5sYW5ndWFnZXMmJiEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKHQpPi0xKSlmb3IodmFyIGU9MDtlPHRoaXMubGFuZ3VhZ2VzLmxlbmd0aDtlKyspe3ZhciBuPXRoaXMubGFuZ3VhZ2VzW2VdO2lmKCEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKG4pPi0xKSYmdGhpcy5zdG9yZS5oYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMobikpe3RoaXMucmVzb2x2ZWRMYW5ndWFnZT1uO2JyZWFrfX19fSx7a2V5OiJjaGFuZ2VMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG89dDt2YXIgcj1fKCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIix0KTt2YXIgaT1mdW5jdGlvbih0KXtuLmxhbmd1YWdlPXQsbi5sYW5ndWFnZXM9bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeSh0KSxuLnJlc29sdmVkTGFuZ3VhZ2U9dm9pZCAwLG4uc2V0UmVzb2x2ZWRMYW5ndWFnZSh0KX0sbz1mdW5jdGlvbihvKXshdCYmIW8mJm4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmKG89W10pO3ZhciBzPSJzdHJpbmciPT10eXBlb2Ygbz9vOm4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRCZXN0TWF0Y2hGcm9tQ29kZXMobyk7cyYmKG4ubGFuZ3VhZ2V8fGkocyksbi50cmFuc2xhdG9yLmxhbmd1YWdlfHxuLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2Uocyksbi5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiZuLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuY2FjaGVVc2VyTGFuZ3VhZ2UocykpLG4ubG9hZFJlc291cmNlcyhzLChmdW5jdGlvbih0KXshZnVuY3Rpb24odCxvKXtvPyhpKG8pLG4udHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShvKSxuLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxuLmVtaXQoImxhbmd1YWdlQ2hhbmdlZCIsbyksbi5sb2dnZXIubG9nKCJsYW5ndWFnZUNoYW5nZWQiLG8pKTpuLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxyLnJlc29sdmUoKGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KSksZSYmZSh0LChmdW5jdGlvbigpe3JldHVybiBuLnQuYXBwbHkobixhcmd1bWVudHMpfSkpfSh0LHMpfSkpfTtyZXR1cm4gdHx8IXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jPyF0JiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYz90aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KG8pOm8odCk6byh0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KCkpLHJ9fSx7a2V5OiJnZXRGaXhlZFQiLHZhbHVlOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT10aGlzLG89ZnVuY3Rpb24gZShuLG8pe3ZhciBzO2lmKCJvYmplY3QiIT09dChvKSl7Zm9yKHZhciBhPWFyZ3VtZW50cy5sZW5ndGgsdT1uZXcgQXJyYXkoYT4yP2EtMjowKSxjPTI7YzxhO2MrKyl1W2MtMl09YXJndW1lbnRzW2NdO3M9aS5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKFtuLG9dLmNvbmNhdCh1KSl9ZWxzZSBzPXV0KHt9LG8pO3MubG5nPXMubG5nfHxlLmxuZyxzLmxuZ3M9cy5sbmdzfHxlLmxuZ3Mscy5ucz1zLm5zfHxlLm5zLHMua2V5UHJlZml4PXMua2V5UHJlZml4fHxyfHxlLmtleVByZWZpeDt2YXIgbD1pLm9wdGlvbnMua2V5U2VwYXJhdG9yfHwiLiIsaD1zLmtleVByZWZpeD8iIi5jb25jYXQocy5rZXlQcmVmaXgpLmNvbmNhdChsKS5jb25jYXQobik6bjtyZXR1cm4gaS50KGgscyl9O3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9vLmxuZz1lOm8ubG5ncz1lLG8ubnM9bixvLmtleVByZWZpeD1yLG99fSx7a2V5OiJ0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLnRyYW5zbGF0b3ImJih0PXRoaXMudHJhbnNsYXRvcikudHJhbnNsYXRlLmFwcGx5KHQsYXJndW1lbnRzKX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYodD10aGlzLnRyYW5zbGF0b3IpLmV4aXN0cy5hcHBseSh0LGFyZ3VtZW50cyl9fSx7a2V5OiJzZXREZWZhdWx0TmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMuZGVmYXVsdE5TPXR9fSx7a2V5OiJoYXNMb2FkZWROYW1lc3BhY2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXRoaXMuaXNJbml0aWFsaXplZClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuZXh0IHdhcyBub3QgaW5pdGlhbGl6ZWQiLHRoaXMubGFuZ3VhZ2VzKSwhMTtpZighdGhpcy5sYW5ndWFnZXN8fCF0aGlzLmxhbmd1YWdlcy5sZW5ndGgpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bi5sYW5ndWFnZXMgd2VyZSB1bmRlZmluZWQgb3IgZW1wdHkiLHRoaXMubGFuZ3VhZ2VzKSwhMTt2YXIgcj10aGlzLnJlc29sdmVkTGFuZ3VhZ2V8fHRoaXMubGFuZ3VhZ2VzWzBdLGk9ISF0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxvPXRoaXMubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VzLmxlbmd0aC0xXTtpZigiY2ltb2RlIj09PXIudG9Mb3dlckNhc2UoKSlyZXR1cm4hMDt2YXIgcz1mdW5jdGlvbih0LG4pe3ZhciByPWUuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5zdGF0ZVsiIi5jb25jYXQodCwifCIpLmNvbmNhdChuKV07cmV0dXJuLTE9PT1yfHwyPT09cn07aWYobi5wcmVjaGVjayl7dmFyIGE9bi5wcmVjaGVjayh0aGlzLHMpO2lmKHZvaWQgMCE9PWEpcmV0dXJuIGF9cmV0dXJuISEodGhpcy5oYXNSZXNvdXJjZUJ1bmRsZShyLHQpfHwhdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmJhY2tlbmR8fHRoaXMub3B0aW9ucy5yZXNvdXJjZXMmJiF0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXN8fHMocix0KSYmKCFpfHxzKG8sdCkpKX19LHtrZXk6ImxvYWROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1fKCk7cmV0dXJuIHRoaXMub3B0aW9ucy5ucz8oInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5vcHRpb25zLm5zLmluZGV4T2YodCk8MCYmbi5vcHRpb25zLm5zLnB1c2godCl9KSksdGhpcy5sb2FkUmVzb3VyY2VzKChmdW5jdGlvbih0KXtyLnJlc29sdmUoKSxlJiZlKHQpfSkpLHIpOihlJiZlKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToibG9hZExhbmd1YWdlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj1fKCk7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pO3ZhciByPXRoaXMub3B0aW9ucy5wcmVsb2FkfHxbXSxpPXQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gci5pbmRleE9mKHQpPDB9KSk7cmV0dXJuIGkubGVuZ3RoPyh0aGlzLm9wdGlvbnMucHJlbG9hZD1yLmNvbmNhdChpKSx0aGlzLmxvYWRSZXNvdXJjZXMoKGZ1bmN0aW9uKHQpe24ucmVzb2x2ZSgpLGUmJmUodCl9KSksbik6KGUmJmUoKSxQcm9taXNlLnJlc29sdmUoKSl9fSx7a2V5OiJkaXIiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHR8fCh0PXRoaXMucmVzb2x2ZWRMYW5ndWFnZXx8KHRoaXMubGFuZ3VhZ2VzJiZ0aGlzLmxhbmd1YWdlcy5sZW5ndGg+MD90aGlzLmxhbmd1YWdlc1swXTp0aGlzLmxhbmd1YWdlKSksIXQpcmV0dXJuInJ0bCI7cmV0dXJuWyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSIsImNrYiJdLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKT4tMXx8dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi1hcmFiIik+MT8icnRsIjoibHRyIn19LHtrZXk6ImNsb25lSW5zdGFuY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpsdCxyPXV0KHV0KHV0KHt9LHRoaXMub3B0aW9ucyksZSkse2lzQ2xvbmU6ITB9KSxpPW5ldyBzKHIpOyh2b2lkIDAhPT1lLmRlYnVnfHx2b2lkIDAhPT1lLnByZWZpeCkmJihpLmxvZ2dlcj1pLmxvZ2dlci5jbG9uZShlKSk7cmV0dXJuWyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXS5mb3JFYWNoKChmdW5jdGlvbihlKXtpW2VdPXRbZV19KSksaS5zZXJ2aWNlcz11dCh7fSx0aGlzLnNlcnZpY2VzKSxpLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saS50cmFuc2xhdG9yPW5ldyBVKGkuc2VydmljZXMsaS5vcHRpb25zKSxpLnRyYW5zbGF0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07aS5lbWl0LmFwcGx5KGksW3RdLmNvbmNhdChuKSl9KSksaS5pbml0KHIsbiksaS50cmFuc2xhdG9yLm9wdGlvbnM9aS5vcHRpb25zLGkudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57b3B0aW9uczp0aGlzLm9wdGlvbnMsc3RvcmU6dGhpcy5zdG9yZSxsYW5ndWFnZTp0aGlzLmxhbmd1YWdlLGxhbmd1YWdlczp0aGlzLmxhbmd1YWdlcyxyZXNvbHZlZExhbmd1YWdlOnRoaXMucmVzb2x2ZWRMYW5ndWFnZX19fV0pLHN9KHYpO2woaHQsImNyZWF0ZUluc3RhbmNlIiwoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGh0KGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSk7dmFyIGZ0PWh0LmNyZWF0ZUluc3RhbmNlKCk7ZnQuY3JlYXRlSW5zdGFuY2U9aHQuY3JlYXRlSW5zdGFuY2UsZnQuY3JlYXRlSW5zdGFuY2UsZnQuaW5pdCxmdC5sb2FkUmVzb3VyY2VzLGZ0LnJlbG9hZFJlc291cmNlcyxmdC51c2UsZnQuY2hhbmdlTGFuZ3VhZ2UsZnQuZ2V0Rml4ZWRULGZ0LnQsZnQuZXhpc3RzLGZ0LnNldERlZmF1bHROYW1lc3BhY2UsZnQuaGFzTG9hZGVkTmFtZXNwYWNlLGZ0LmxvYWROYW1lc3BhY2VzLGZ0LmxvYWRMYW5ndWFnZXM7dmFyIHB0PXtDb25maXJtVG86IkNvbmZpcm0gVG8gIixUZXh0SW5wdXQ6IlRleHQgSW5wdXQiLEF0dHJpYnV0ZToiQXR0cmlidXRlIixOb0F0dHJpYnV0ZToiTm8gQXR0cmlidXRlIixTYXZlOiJTYXZlIixVbmRvOiJVbmRvIixSZWRvOiJSZWRvIixSb3RhdGU6IlJvdGF0ZSIsU3R5bGU6IlN0eWxlIixBZGp1c3Q6IkFkanVzdCIsQm9yZGVyVGhpY2tuZXNzOiJCb3JkZXIgVGhpY2tuZXNzIixDb2xvcjoiQ29sb3IiLEJvcmRlck9wYWNpdHk6IkJvcmRlciBPcGFjaXR5IixGaWxsT3BhY2l0eToiRmlsbCBPcGFjaXR5IixTYXR1cmF0aW9uOiJTYXR1cmF0aW9uIixDb250cmFzdDoiQ29udHJhc3QiLEV4cG9zdXJlOiJFeHBvc3VyZSIsU2NyZWVuUmF0aW86IlNjcmVlbiBSYXRpbyIsT3JpZ2luYWxTY2FsZToiT3JpZ2luYWwgU2NhbGUiLENvcHlUaGVQcmV2aW91czoiQ29weSBQcmV2IixDbGVhckxhYmVsOiJDbGVhciIsU2V0QXNJbnZhbGlkOiJTZXQgQXMgSW52YWxpZCIsU2V0QXNWYWxpZDoiU2V0IEFzIFZhbGlkIixDb25maXJtOiJDb25maXJtIixGaW5pc2g6IkZpbmlzaCIsQ2FuY2VsOiJDYW5jZWwiLEl0ZW1zT2ZUaGlzUGFnZToiSXRlbXMgT2YgVGhpcyBQYWdlIixIb3RrZXlzOiJIb3RrZXlzIixBbm5vdGF0ZVJlY3Q6IkFubm90YXRlIFJlY3QiLEFubm90YXRlSW52YWxpZFJlY3Q6IkFubm90YXRlIEludmFsaWQgUmVjdCIsU2VsZWN0UmVjdDoiU2VsZWN0IFJlY3QiLFJpZ2h0Q2xpY2s6IlJpZ2h0LWNsaWNrIixUb2dnbGVSZWN0RWZmZWN0aXZlbmVzczoiVG9nZ2xlIFJlY3QgVmFsaWRpdHkiLFRvZ2dsZUVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBWYWxpZGl0eSIsRGVsZXRlUmVjdDoiRGVsZXRlIFJlY3QiLFNlbGVjdEFuZERvdWJsZUNsaWNrOiJTZWxlY3QgQW5kIERvdWJsZSBDbGljayIsU2NhbGU6IlNjYWxlIixGdWxsc2NyZWVuOiJGdWxsc2NyZWVuIixQcmV2aW91c0ltYWdlOiJQcmV2aW91cyIsUHJldmlvdXNGaWxlOiJQcmV2aW91cyIsTmV4dEltYWdlOiJOZXh0IixOZXh0RmlsZToiTmV4dCIsUHJldmlvdXNGb2xkZXI6IlByZXZpb3VzIEZvbGRlciIsTmV4dEZvbGRlcjoiTmV4dCBGb2xkZXIiLERyYWc6IkRyYWciLFRvZ2dsZVNlbGVjdGVkOiJUb2dnbGUgU2VsZWN0ZWQiLFRvZ2dsZVNlbGVjdGVkUmV2ZXJzZToiVG9nZ2xlIFNlbGVjdGVkIFJldmVyc2UiLEhpZGVHcmFwaGljczoiSGlkZSBHcmFwaGljcyIsVG9nZ2xlTGluZVBhcnRpY3VsYXJpdHk6IlRvZ2dsZSBMaW5lIFBhcnRpY3VsYXJpdHkiLFRvU2lkZToiVG8gTGluZSIsU3BlY2lmaWVkQXR0cmlidXRlc09ubHk6IlNwZWNpZmllZCBBdHRyaWJ1dGVzIE9ubHkiLE51bWJlcjoiTnVtYmVyIixQcmVzczoiUHJlc3MiLFRvT3JpZ2luYWxTdGVwOiJUbyBPcmlnaW5hbCIsSG9yaXpvbnRhbE9yVmVydGljYWw6Ikhvcml6b250YWwvVmVydGljYWwiLEFubm90YXRlSW52YWxpZExpbmU6IkFubm90YXRlIEludmFsaWQgTGluZSIsQW5ub3RhdGVMaW5lOiJBbm5vdGF0ZSBMaW5lIixTZWxlY3RMaW5lOiJTZWxlY3QgTGluZSIsVG9nZ2xlTGluZUVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBMaW5lIFZhbGlkaXR5IixEZWxldGVMaW5lOiJEZWxldGUgTGluZSIsQ29udGludWVUb0xhYmVsOiJDb250aW51ZSBUbyBMYWJlbCIsU2VsZWN0OiJTZWxlY3QiLEluc2VydFBvaW50OiJJbnNlcnQgUG9pbnQiLENsaWNrT25MaW5lOiJDbGljayBPbiBMaW5lIixEZWxldGVQb2ludDoiRGVsZXRlIFBvaW50IixEYmxDbGlja09uUG9pbnQ6IkRvdWJsZSBDbGljayBPbiBQb2ludCIsU3RvcEFkc29ycHRpb246IlN0b3AgQWRzb3JwdGlvbiIsUHJldmlvdXNMaW5lOiJQcmV2aW91cyBMaW5lIixOZXh0TGluZToiTmV4dCBMaW5lIixTZWxlY3RQb2ludDoiU2VsZWN0IFBvaW50IixBbm5vdGF0ZUludmFsaWRQb2ludDoiQW5ub3RhdGUgSW52YWxpZCBQb2ludCIsQW5ub3RhdGVQb2ludDoiQW5ub3RhdGUgUG9pbnQiLEFubm90YXRlUG9seWdvbjoiQW5ub3RhdGUgUG9seWdvbiIsU2VsZWN0UG9seWdvbjoiU2VsZWN0IFBvbHlnb24iLEFubm90YXRlSW52YWxpZFBvbHlnb246IkFubm90YXRlIEludmFsaWQgUG9seWdvbiIsVG9nZ2xlUG9seWdvbkVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBQb2x5Z29uIFZhbGlkaXR5IixEZWxldGVQb2x5Z29uOiJEZWxldGUgUG9seWdvbiIsRGVsZXRlOiJEZWxldGUiLFRvZ2dsZVBvaW50UGFydGljdWxhcml0eToiVG9nZ2xlIFBvaW50IFBhcnRpY3VsYXJpdHkiLENyb3BPdmVybGFwQXJlYToiQ3JvcCBPdmVybGFwIEFyZWEiLFNlZ21lbnRhdGlvblJlY29nbml0aW9uOiJTZWdtZW50YXRpb24gUmVjb2duaXRpb24iLFN3aXRjaFBhdHRlcm46IlN3aXRjaCBQYXR0ZXJuIixUYWdnaW5nOiJUYWdnaW5nIixIaWRlOiJIaWRlICIsVGFnZ2luZ09yQXR0cjoiVGFnL2F0dHJpYnV0ZSIsSGlkZURyYXduQW5ub3RhdGlvbjoiSGlkZGVuIERyYXduIEFubm90YXRpb24iLEJsdWU6IkJsdWUiLEN5YW46IkN5YW4iLEdyZWVuOiJHcmVlbiIsWWVsbG93OiJZZWxsb3ciLFBpbms6IlBpbmsiLFN0ZXBzOiJTdGVwcyIsRXhwb3J0OiJFeHBvcnQiLE5leHRTdGVwOiJOZXh0IFN0ZXAiLFN0ZXBOb3RGaW5pc2hlZE5vdGlmeToiVGhlcmUgYXJlIHVuYW5ub3RhdGVkIGZpbGVzIGluIHRoZSBjdXJyZW50IHN0ZXAgLCBwbGVhc2UgZmluaXNoIGJlZm9yZSB0aGUgbmV4dCBzdGVwIixjdXJJdGVtczoie3tjdXJyZW50fX0ve3t0b3RhbH19IEl0ZW1zIixUdXJuUGFnZToiVHVybiBQYWdlIixTd2l0Y2g6IlN3aXRjaCIsRW1wdHlUZXh0SW5wdXQ6IkVtcHR5IFRleHQgSW5wdXQiLFJlZ3VsYXJFeHBJbmNvcnJlY3RseToiUmVndWxhciBleHByZXNzaW9uIGlzIGluY29ycmVjdGx5IixOb0NvbmZpZ3VyYXRpb246Ik1pc3NpbmcgQ29uZmlndXJhdGlvbiIsQ2xlYXJUaGlzT3B0aW9uOiJDbGVhciBUaGlzIE9wdGlvbiIsUmVzdG9yZUltYWdlQXR0cmlidXRlczoiUmVzdG9yZSBJbWFnZSBBdHRyaWJ1dGVzIixyZWN0VG9vbDoiUmVjdFRvb2wiLHRhZ1Rvb2w6IlRhZ1Rvb2wiLHBvbHlnb25Ub29sOiJQb2x5Z29uVG9vbCIsbGluZVRvb2w6IkxpbmVUb29sIixwb2ludFRvb2w6IlBvaW50VG9vbCIsdGV4dFRvb2w6IlRleHRUb29sIixTcGVlZDoiU3BlZWQiLFBsYXlQYXVzZToiUGxheSAvIFBhdXNlIixGYXN0Rm9yd2FyZDoiRmFzdCBGb3J3YXJkIixSZXdpbmQ6IlJld2luZCIsdmlkZW9JbnZhbGlkQW5kU2tpcDoiVmlkZW8gaW52YWxpZCwgcGxlYXNlIHNraXAiLGltYWdlSW52YWxpZEFuZFNraXA6IkltYWdlIGludmFsaWQsIHBsZWFzZSBza2lwIix2aWRlb0Vycm9yQW5kUmVsb2FkOiJGYWlsZWQgdG8gbG9hZCB2aWRlbywgcGxlYXNlIHJlbG9hZCIsaW1hZ2VFcnJvckFuZFJlbG9hZDoiRmFpbGVkIHRvIGxvYWQgaW1hZ2UsIHBsZWFzZSByZWxvYWQiLG9yTWFza0FzSW52YWxpZDoiIG9yIG1hc2sgaXQgYXMgaW52YWxpZCIsQ2xpY2tBbm90aGVyUG9seWdvbjoiQ2xpY2sgYW5vdGhlciBwb2x5Z29uIixQb2x5Z29uc1RvQmVDb21iaW5lZE5lZWRUb0JlU2VsZWN0ZWQ6IlBvbHlnb25zIHRvIGJlIGNvbWJpbmVkIG5lZWQgdG8gYmUgc2VsZWN0ZWQiLEN1cnZlTW9kZURvZXNOb3RTdXBwb3J0Q3V0dGluZzoiQ3VydmUgbW9kZSBkb2VzIG5vdCBzdXBwb3J0IGN1dHRpbmciLENvbWJpbmVTdWNjZXNzOiJDb21iaW5lIHN1Y2Nlc3MiLENvbWJpbmluZ0ZhaWxlZE5vdGlmeToiQ29tYmluaW5nIGZhaWxlZC4gUGxlYXNlIGNoZWNrIHdoZXRoZXIgdHdvIHBvbHlnb25zIGludGVyc2VjdCBvciB3aGV0aGVyIHBvbHlnb24gY29tYmluaW5nIGZvcm1zIGEgbGVhayIsQ29tYmluZU92ZXJsYXBBcmVhOiJDb21iaW5lIE92ZXJsYXAgQXJlYSIsTm9EZXBlbmRlbmN5OiJUaGlzIGltYWdlIGRvZXMgbm90IG5lZWQgdG8gYmUgbGFiZWxlZCIsVGV4dENoZWNrTnVtYmVyT25seToiUGxlYXNlIGVudGVyIHRoZSBudW1iZXIiLFRleHRDaGVja0VuZ2xpc2hPbmx5OiJQbGVhc2UgZW50ZXIgRW5nbGlzaCIsVGV4dENoZWNrQ3VzdG9tRm9ybWF0OiJQbGVhc2UgZW50ZXIgZGF0YSBpbiBjdXN0b20gZm9ybWF0IixGcmFtaW5nT2ZPYmplY3RUb0JlRGl2aWRlZDoiUGxlYXNlIGZyYW1lIHRoZSBvYmplY3QgdG8gYmUgZGl2aWRlZCBmaXJzdCIsQ2xpY2tPblRhcmdldDoiUGxlYXNlIGNsaWNrIG9uIHRhcmdldCBvYmplY3QiLFNwbGl0dGluZ0FsZ29yaXRobVByZWRpY3Rpb246IlNwbGl0dGluZyBhbGdvcml0aG0gcHJlZGljdGlvbiBpbiBwcm9ncmVzcy4uLiIsIjJEVmlldyI6IjJEVmlldyIsIjNEVmlldyI6IjNEVmlldyIsVG9wVmlldzoiVG9wVmlldyIsU2lkZVZpZXc6IlNpZGVWaWV3IixCYWNrVmlldzoiQmFja1ZpZXciLFNob3dBcnJvd3M6IlNob3cgQXJyb3dzIixMZW5ndGg6Ikxlbmd0aCIsV2lkdGg6IldpZHRoIixIZWlnaHQ6IkhlaWdodCIsUm90YXRpb25feToiUm90YXRpb25feSIsUG9pbnRDb3VudDoiUG9pbnQgQ291bnQiLEludmFsaWQ6IkludmFsaWQiLFRhZzoiVGFnIixTZWFyY2hUYWc6IlNlYXJjaCB0YWdzIixTdWJBdHRyaWJ1dGU6IlN1YkF0dHJpYnV0ZSIsUGxlYXNlU2VsZWN0OiJQbGVhc2UgU2VsZWN0IixDb3B5RW1wdHlJblBvaW50Q2xvdWQ6IlRoZSBjb3B5IGNvbnRlbnQgaXMgZW1wdHksIHBsZWFzZSBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgY2xvdWQgZGF0YSIsUGFzdGVFbXB0eUluUG9pbnRDbG91ZDoiUGxlYXNlIGNvcHkgdGhlIHBvaW50Q2xvdWQgZGF0YSBiZWZvcmUgcGFzdGluZyIsSGFzRHVwbGljYXRlSUQ6IkR1cGxpY2F0ZSBJRCBleGlzdHMsIGNvcHkgZmFpbGVkIixIYXNEdXBsaWNhdGVJREhlYWRlcjoiVHJhY2tJRCBkdXBsaWNhdGlvbiBleGlzdHMiLEhhc0R1cGxpY2F0ZUlETXNnOiJUaGVyZSBpcyBhbiBpc3N1ZSB3aXRoIGR1cGxpY2F0ZSB0cmFja0lEcywgb3ZlcnJpZGUgaXQ/IixDb3B5U3VjY2VzczoiQ29weSBTdWNjZXNzISIsTG93ZXJMaW1pdFBvaW50c051bUluQm94OiJUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgYm94IG11c3Qgbm90IGJlIGxlc3MgdGhhbiB7e251bX19IixQb2ludFRoaWNrbmVzczoiUG9pbnQgVGhpY2tuZXNzIixSb3RhdGVBcm91bmRDZW50ZXJQb2ludDoiUm90YXRlIEFyb3VuZCBDZW50ZXIgUG9pbnQiLFBvaW50Q2xvdWRWaWV3VHJhbnNsYXRlOiJQb2ludENsb3VkVmlldyBUcmFuc2xhdGlvbiIsVG9wVmlld1RyYW5zbGF0ZToiVG9wVmlldyBUcmFuc2xhdGlvbiIsQ2hhbmdlUG9pbnRDbG91ZFZhbGlkOiJDaGFuZ2UgUG9pbnRDbG91ZCBWYWxpZCIsTGFzc29TZWxlY3RvcjoiTGFzc28iLFJlY3RTZWxlY3RvcjoiUmVjdCIsU2VsZWN0b3JNc2c6IlJpZ2h0LWNsaWNrIGRyYWcgdG8gc2VsZWN0IixBZGRQb2ludDoiQWRkIFBvaW50IixDaXJjbGVTZWxlY3RvcjoiUG9pbnQiLERldGVjdGlvbk1vZGU6IkRldGVjdGlvbk1vZGUiLFNlZ21lbnRhdGlvbk1vZGU6IlNlZ21lbnRhdGlvbk1vZGUiLEVudGVyRWRpdE1vZGU6IkVudGVyIGVkaXQgbW9kZSIsU2VsZWN0ZWRQb2ludHM6IlNlbGVjdGVkIFBvaW50cyIsQ29weUJveDoiQ29weSBCb3giLFBhc3RlQm94OiJQYXN0ZSBCb3giLFJvdGF0ZUxlZnQ6IlJvdGF0ZSBMZWZ0IixSb3RhdGVSaWdodDoiUm90YXRlIFJpZ2h0IixOZXh0Qm94OiJOZXh0IEJveCIsUHJldmlvdXNCb3g6IlByZXZpb3VzIEJveCIsUm90YXRlOTA6IlJvdGF0ZSA5MMKwIixDb3B5UHJldlBhZ2U6IkNvcHkgUHJldmlvdXMgUGFnZSIsQ2hhbmdlQm94VmFsaWQ6IkNoYW5nZSBCb3gncyBWYWxpZCIsTXVsdGlTZWxlY3Q6Ik11bHRpIFNlbGVjdCIsU2VsZWN0QWxsQm94OiJTZWxlY3QgQWxsIEJveGVzIixHZW5lcmFsT3BlcmF0aW9uOiJHZW5lcmFsIE9wZXJhdGlvbiIsUmVjdFBhdHRlcm46IlJlY3QgUGF0dGVybiIsUG9seWdvblBhdHRlcm46IlBvbHlnb24gUGF0dGVybiIsQ2hhbmdlUGF0dGVybk1zZzoiQ2hhbmdlIFBhdHRlcm4gdG8ge3twYXR0ZXJufX0gc3VjY2Vzc2Z1bGx5IixEcmFnT3BlcmF0aW9uOiJEcmFnIixTZWxlY3RlZFN0YXR1czoiU2VsZWN0ZWQiLHVwZGF0ZVZhbGlkRnJvbVZhbGlkVG9JblZhbGlkOiJDb25maXJtIHVwZGF0ZSBhcyBpbnZhbGlkIHBhZ2XvvJ8iLHVwZGF0ZVZhbGlkRnJvbUluVmFsaWRUb1ZhbGlkOiJDb25maXJtIHVwZGF0ZSBhcyB2YWxpZCBwYWdl77yfIixBbGxUcmFja0lEczoiQWxsIFRyYWNrSURzIixDdXJyZW50Qm94VHJhY2tJRHM6IkN1cnJlbnQgVHJhY2tJRCIsUG9zaXRpdmVJbnRlZ2VyQ2hlY2s6IlBsZWFzZSBlbnRlciBhIHBvc2l0aXZlIGludGVnZXIiLE5vdEFsbG93RGVjaW1hbFBvaW50c0luVHJhY2tJRDoiVHJhY2tJRCBpcyBub3QgYWxsb3dlZCB0byBiZSBkZWNpbWFsIixEdXBsaWNhdGVUcmFja0lEc0V4aXN0OiJEdXBsaWNhdGUgdHJhY2tJRHMgZXhpdHMiLEJhdGNoVXBkYXRlVGV4dDoiQmF0Y2ggVXBkYXRlIixCYXRjaFVwZGF0ZVRyYWNrSUQ6IkJhdGNoIHVwZGF0ZSB0cmFja0lEcyIsVHJhY2tJRFVuaWZ5QXM6IlRyYWNrSUQgaXMgVW5pZnkgYXMiLFVuaWZ5VHJhY2tJRFJhbmdlOiJVbmlmeSBUcmFja0lEIFJhbmdlIixQYWdlOiJQYWdlIixPa1RleHQ6Ik9LIixDYW5jZWxUZXh0OiJDYW5jZWwiLFVuaWZ5UGFyYW1zOiJVbmlmeSBQYXJhbXMiLFVuaWZ5QXR0cmlidXRlUmFuZ2U6IlVuaWZ5IFJhbmdlIixVbmlmeVRyYWNrSUQ6IlVuaWZ5IFRyYWNrSUQiLFVuaWZ5U2l6ZToiVW5pZnkgU2l6ZSIsVW5pZnlUYWc6IlVuaWZ5IFRhZyIsTm9EYXRhOiJObyBEYXRhIixBbm5vdGF0ZWRMaXN0OiJBbm5vdGF0ZWQgTGlzdCIsb25EZWxldGVHcmFwaEJ5QXR0cjoiQXJlIHlvdSBzdXJlIHRvIGRlbGV0ZSB0aGUgZGF0YSB3aXRoIGF0dHJpYnV0ZSB7e2F0dHJpYnV0ZX19PyIsQ2FuY2VsRml4ZWQ6IkNhbmNlbCBGaXhlZCIsRml4ZWRPbkxlZnQ6IkZpeGVkIE9uIExlZnQiLEZpeGVkT25SaWdodDoiRml4ZWQgT24gUmlnaHQiLEFubm90YXRlZFJlc3VsdDoiQW5ub3RhdGVkIFJlc3VsdCIsQ29tcGxlbWVudGFyeVRyYWNraW5nOiJDb21wbGVtZW50YXJ5IHRyYWNraW5nIixDb21wbGVtZW50YXJ5VHJhY2tpbmdQcmVkaWN0aW9uOiJDb21wbGVtZW50YXJ5IHRyYWNraW5nIHByZWRpY3Rpb24iLEFwcGx5OiJBcHBseSIsQmVmb3JlUHJlZGljdFN0YXJ0aW5nOiJCZWZvcmUgc3RhcnRpbmcsIHBsZWFzZSBtYXJrIHRoZSBmaXJzdCBhbmQgbGFzdCBib3gsIG5lZWQgdGhlIHNhbWUgdHJhY2tJRCIsVGhlUHJlZGljdGVkUG9pbnRDbG91ZDoiVGhlIHByZWRpY3RlZCBwb2ludCBjbG91ZCBub3cgbmVlZHMgdG8gYmUgbGVzcyB0aGFuIDEwIGZyYW1lcyIsQ2FtZXJhRm9sbG93VG9wVmlldzoiUG9zaXRpb25lZCBieSB0b3AgdmlldyIsTWFya09ubHlPbmU6Ik1hcmsgb25seSBvbmUgZnJhbWUgb2YgZGF0YSwgbmVlZCB0byBtYXJrIHRoZSBmaXJzdCBhbmQgbGFzdCBmcmFtZSBvZiBkYXRhIixIYXZlTm9OZWVkOiJIYXZlIG5vIG5lZWQgdG8gcHJlZGljdCB0aGUgZGF0YSBiZXR3ZWVuIHR3byBmcmFtZXMsIHBsZWFzZSBtYXJrIHRoZSBmaXJzdCBhbmQgbGFzdCBmcmFtZSBmaXJzdCwgYW5kIG5lZWQgdGhlIHNhbWUgc2VyaWFsIG51bWJlciIsUHJlZGljdGluZ0RhdGFGcm9tOiJQcmVkaWN0aW5nIGRhdGEgZnJvbSBwYWdlIHt7c3RhcnRQYWdlfX0gdG8gcGFnZSB7e2VuZFBhZ2V9fSB3aXRoIGJveCBJRCB7e3NlbGVjdGVkQm94VHJhY2tJRH19IixQb2ludENsb3VkQ292ZXJNb2RlOiJXaGVuIHRoZSBzYW1lIHBvaW50IGNsb3VkIGlzIHNlbGVjdGVkLCB0aGUgbGF0ZXIgbWFya2VyIG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIG9uZSIsUG9pbnRDbG91ZFVuY292ZXJNb2RlOiJXaGVuIHRoZSBzYW1lIHBvaW50IGNsb3VkIGlzIHNlbGVjdGVkLCB0aGUgbGF0dGVyIG1hcmtlciBjYW5ub3Qgb3ZlcndyaXRlIHRoZSBmb3JtZXIgbWFya2VyIixQb2ludENsb3VkRm9jdXNNb2RlOiJGb2N1cyBtb2RlIGhhcyBiZWVuIHR1cm5lZCBvbiIsUG9pbnRDbG91ZFVuZm9jdXNNb2RlOiJGb2N1cyBtb2RlIGlzIHR1cm5lZCBvZmYiLFBvaW50Q2xvdWRIaWRlU2VnbWVudDoiTWFya2VkIHBvaW50IGNsb3VkIGlzIGhpZGRlbiIsUG9pbnRDbG91ZFNob3dTZWdtZW50OiJBbGwgcG9pbnQgY2xvdWRzIGhhdmUgYmVlbiBkaXNwbGF5ZWQiLFBvaW50Q2xvdWRIaWRlU2VnbWVudEludmFsaWQ6IlVuYXZhaWxhYmxlIGluIGZvY3VzIG1vZGUiLFBvaW50Q2xvdWRIaWRlRm9jdXNJbnZhbGlkX2hpZGU6IkZvY3VzIG1vZGUgaXMgbm90IGF2YWlsYWJsZSwgcGxlYXNlIHNob3cgdGhlIG1hcmtlZCBwb2ludCBmaXJzdCIsUG9pbnRDbG91ZEhpZGVGb2N1c0ludmFsaWRfbm9uZToiRm9jdXMgbW9kZSBpcyBub3QgYXZhaWxhYmxlLCBwbGVhc2Ugc2VsZWN0IHRoZSBtYXJrZXIgdG8gYmUgZm9jdXNlZCBmaXJzdCIsUGFsZXR0ZToiUGFsZXR0ZSIsRWZmaWNpZW50TGlzdGVuaW5nOiJUaGUgdGFzayBpcyBtYXJrZWQgaW4gdGhlIGVmZmljaWVuY3kgbW9uaXRvcmluZy4uLiIsVGl0bGU6IlRpdGxlIixBbnN3ZXI6IkFuc3dlciIsRmluaXNoZWQ6IkZpbmlzaGVkIixVbmZpbmlzaGVkOiJVbmZpbmlzaGVkIixPdmVyYWxsU2NvcmU6Ik92ZXJhbGxTY29yZSIsTm9TY29yaW5nU2NhbGU6IkNvbmZpZ3VyYWJsZSBzdGVwIGRldGFpbHMgb24gdGhlIGxlZnQiLEJlc3Q6IkJlc3QiLFdvcnN0OiJXb3JzdCIsUmFua2luZ1F1YWxpdHlPZkFuc3dlcnM6IlJhbmtpbmdRdWFsaXR5T2ZBbnN3ZXJzIixUb0JlU29ydGVkOiJUb0JlU29ydGVkIixZZXM6IlllcyIsTm86Ik5vIixBZGRpdGlvbmFsQ29udGVudDoiQWRkaXRpb25hbENvbnRlbnQiLFN1Ym1pdDoiU3VibWl0IixEcmFnQW5kRHJvcDoiRHJhZyBhbmQgZHJhcCIsRGVmYXVsdFNpemU6IkNsaWNrIHRvIHVzZSB0aGUgZGVmYXVsdCBzaXplLiIsTm9ybWFsU2l6ZVJhbmdlOiJOb3JtYWwgc2l6ZSByYW5nZSIsTm9ybWFsQ2VudGVyUG9pbnRSYW5nZToiTm9ybWFsIGNlbnRlciBwb2ludCByYW5nZSIsTG9hZGluZ1RpcHM6IldhaXQgYSBtaW51dGUsIERhdGEgTG9hZGluZyB+IixVbmxvY2tlZDoiVW5sb2NrZWQiLExvY2tlZDoiTG9ja2VkIixMZWFzdENoYXJhY3RlckVycm9yOiJQbGVhc2UgZW50ZXIgYXQgbGVhc3Qge3tudW19fSBjaGFyYWN0ZXJzIixBbmQ6IkFuZCIsT3I6Ik9yIixJbWFnZUxhYmVsczoiSW1hZ2UgbGFiZWxzIiwiM0RSZWN0IjoiM0QgUmVjdCIsIjJEUmVjdCI6IjJEIFJlY3QiLEFkZFBvaW50czoiQUREIixSZW1vdmVQb2ludHM6IlJFTU9WRSIsUmVzZXQ6IlJlc2V0IixQbGVhc2VGcmFtZVRoZU9iamVjdFRvQmVEaXZpZGVkRmlyc3Q6IlBsZWFzZSBmcmFtZSB0aGUgb2JqZWN0IHRvIGJlIGRpdmlkZWQgZmlyc3QiLENsaWNrT25UaGVUYXJnZXRPYmplY3RUb1NwbGl0SXQ6IkNsaWNrIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRvIHNwbGl0IGl0IixDbGlja1RoZVRhcmdldE9iamVjdEFnYWluVG9JbmNyZWFzZVRoZVNlZ21lbnRhdGlvbjoiQ2xpY2sgdGhlIHRhcmdldCBvYmplY3QgYWdhaW4gdG8gaW5jcmVhc2UgdGhlIHNlZ21lbnRhdGlvbiIsQ2xpY2tPblRoZVRhcmdldE9iamVjdFRvRGVsZXRlVGhlU2VnbWVudGF0aW9uOiJDbGljayBvbiB0aGUgdGFyZ2V0IG9iamVjdCB0byBkZWxldGUgdGhlIHNlZ21lbnRhdGlvbiIsQ2xpY2tBZ2Fpbk9uVGhlVGFyZ2V0T2JqZWN0VG9EZWxldGVUaGVTZWdtZW50YXRpb246IkNsaWNrIGFnYWluIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRvIGRlbGV0ZSB0aGUgc2VnbWVudGF0aW9uIixBbnN3ZXJzQXJlQmVpbmdHZW5lcmF0ZWQ6IkFuc3dlcnMgYXJlIGJlaW5nIGdlbmVyYXRlZCIsQW5zd2VyR2VuZXJhdGlvbkZhaWxlZFBsZWFzZVRyeUFnYWluTGF0ZXI6IkFuc3dlciBnZW5lcmF0aW9uIGZhaWxlZCwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlciIsUmVHZW5lcmF0ZToiUmUtZ2VuZXJhdGUiLEFuc3dlclRleHRFZGl0OiJBbnN3ZXIgdGV4dCBlZGl0IixTaG93RWRpdGluZ1Jlc3VsdERpZmZlcmVuY2VzSW5UZXh0TW9kZU9ubHk6IlNob3cgZWRpdGluZyByZXN1bHQgZGlmZmVyZW5jZXMgaW4gdGV4dCBtb2RlIG9ubHkiLEF0dHJpYnV0ZUxvY2tOb3RpZnk6IlZpZXcgUHJvcGVydGllc++8mnt7bGFiZWx9fe+8jG9ubHkgZGlzcGxheSB0aGUgYW5ub3RhdGlvbiBjb250ZW50IG9mIHRoZSBzZWxlY3RlZCBwcm9wZXJ0aWVzIixBdWRpb1NlZ21lbnRUaXA6IlBsZWFzZSBzZWxlY3QgdGhlIGRlc2lyZWQgdGltZSBwb2ludCBmb3IgY2FwdHVyZe+8iHt7dGltZX1977yJIixBdWRpb0NvbWJpbmVUaXA6IlBsZWFzZSBjbGljayBvbiB0aGUgaW50ZXJ2YWxzIHlvdSB3aXNoIHRvIG1lcmdlIixDbGlwcGVkQXVkaW86IkNhcHR1cmVkIGNvbnRlbnQiLE5vQ2xpcHBlZERhdGE6Ik5vIGNhcHR1cmVkIGNvbnRlbnQiLENvbXBhcmVUYWdzOiJUYWcgY29tcGFyaXNvbiBkaXNwbGF5IixDb21iaW5lQXVkaW86Ik1lcmdlIGludGVydmFscyIsQ2xpcEF1ZGlvOiJTcGxpdCBpbnRlcnZhbHMiLFN3aXRjaENsaXBNb2RlOiJTd2l0Y2ggdG8gY2FwdHVyZSBtb2RlIixTd2l0Y2hUYWdNb2RlOiJTd2l0Y2ggdG8gdGFnIG1vZGUiLENsaXA6IkNhcHR1cmUiLFByZXZpb3VzSW50ZXJ2YWw6IlByZXZpb3VzIGludGVydmFsIixOZXh0SW50ZXJ2YWw6Ik5leHQgaW50ZXJ2YWwiLERlbGV0ZUNvbW1lbnQ6IkRlbGV0ZSBDb21tZW50cyIsRGVsZXRlQ29tbWVudENvbmZpcm06IkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhbm5vdGF0aW9uPyIsUHJldmlvdXNDb21tZW50OiJQcmV2aW91cyBjb21tZW50IixOZXh0Q29tbWVudDoiTmV4dCBjb21tZW50IixDbGlwU2VsZWN0OiJTZWxlY3QiLCJGb3J3YXJkMC4xIjoiQWR2YW5jZSBieSAwLjEgc2Vjb25kcyIsIkJhY2swLjEiOiJSZXdpbmQgYnkgMC4xIHNlY29uZHMiLExlZnRDbGljazoiTGVmdC1jbGljayIsU2NyaWJibGU6IlNjcmliYmxlIixFcmFzZToiRXJhc2UiLFNjcmliYmxlTGluZToiU2NyaWJibGUgKENvbm5lY3QpIixTdHJva2VFbmxhcmdlOiJTdHJva2UgdG8gZW5sYXJnZSIsU3Ryb2tlUmVkdWN0aW9uOiJTdHJva2UgcmVkdWN0aW9uIix0b2dnbGVTaG93VGV4dDoiVGV4dCBDb21wYXJpc29uIERpc3BsYXkiLENsaXBTbGljZToiVHJpbSBTZWdtZW50IixUaW1lU3RhbXA6IkFkZCBUaW1lc3RhbXAiLENsaXBUaW1lOiJUcmltIFRpbWUiLFN0YW1wVGltZToiVGltZXN0YW1wIFRpbWUiLEdldFN0YXJ0VGltZToiUmV0cmlldmUgU3RhcnQgVGltZSIsR2V0RW5kVGltZToiUmV0cmlldmUgRW5kIFRpbWUiLE91dHB1dERpc3BsYXk6Ik91dHB1dCBkaXNwbGF5IixNYXhpbXVtQ2hhcmFjdGVyRXJyb3I6IlRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBjYW5ub3QgZXhjZWVkIHt7bnVtfX0iLENvbW1vblN5bWJvbHM6IkNvbW1vbiBzeW1ib2xzIixCaW5hcnlPcGVyYXRpb25zOiJCaW5hcnkgb3BlcmF0aW9ucyIsQmluYXJ5UmVsYXRpb25zOiJCaW5hcnkgcmVsYXRpb25zIixBcnJvd3M6IkFycm93cyIsT3RoZXJzOiJPdGhlcnMiLEdyZWVrOiJHcmVlayBhbHBoYWJldCIsTG93ZXJjYXNlOiJMb3dlcmNhc2UiLFVwcGVyY2FzZToiVXBwZXJjYXNlIixBZHZhbmNlZE1hdGhlbWF0aWNzOiJBZHZhbmNlZCBtYXRoZW1hdGljcyIsRnJhY3Rpb25hbERpZmZlcmVudGlhdGlvbjoiRnJhY3Rpb25hbCBkaWZmZXJlbnRpYXRpb24iLEZyYWN0aW9uOiJGcmFjdGlvbiIsRGVyaXZhdGl2ZToiRGVyaXZhdGl2ZSIsTW9kdWxhckFyaXRobWV0aWM6Ik1vZHVsYXIgYXJpdGhtZXRpYyIsUmFkaWNhbDoiUmFkaWNhbCIsU3VwQW5kU3ViOiJTdXBlcnNjcmlwdCBhbmQgc3Vic2NyaXB0IixMaW1pdExvZ2FyaXRobToiTGltaXQgbG9nYXJpdGhtIixMaW1pdHM6IkxpbWl0cyIsTG9nYXJpdGhtc0FuZEV4cG9uZW50czoiTG9nYXJpdGhtcyBhbmQgZXhwb25lbnRzIixCb3VuZHM6IkJvdW5kcyIsSW50ZWdyYWxPcGVyYXRpb246IkludGVncmFsIG9wZXJhdGlvbiIsSW50ZWdyYWw6IkludGVncmFsIixEb3VibGVJbnRlZ3JhbDoiRG91YmxlIGludGVncmFsIixUcmlwbGVJbnRlZ3JhbDoiVHJpcGxlIGludGVncmFsIixMYXJnZU9wZXJhdGlvbnM6IkxhcmdlIG9wZXJhdGlvbnMiLFByb2R1Y3RzQW5kQ29wcm9kdWN0czoiUHJvZHVjdHMgYW5kIGNvcHJvZHVjdHMiLEludGVyc2VjdGlvbkFuZFVuaW9uOiJJbnRlcnNlY3Rpb24gYW5kIHVuaW9uIixMaW5lYXJBbGdlYnJhOiJMaW5lYXIgYWxnZWJyYSIsQnJhY2tldEZvcmVuc2ljczoiQnJhY2tldCBmb3JlbnNpY3MiLEJyYWNrZXQ6IkJyYWNrZXQiLENvbW1vbjoiQ29tbW9uIixBcnJheU1hdHJpeDoiQXJyYXkgbWF0cml4IixUcmlnb25vbWV0cmljRnVuY3Rpb25zOiJUcmlnb25vbWV0cmljIGZ1bmN0aW9ucyIsSW52ZXJzZVRyaWdvbm9tZXRyaWNGdW5jdGlvbnM6IkludmVyc2UgdHJpZ29ub21ldHJpYyBmdW5jdGlvbnMiLEh5cGVyYmxpY0Z1bmN0aW9uczoiSHlwZXJibGljIGZ1bmN0aW9ucyIsSW52ZXJzZUh5cGVyYmxpY0Z1bmN0aW9uczoiSW52ZXJzZSBoeXBlcmJsaWMgZnVuY3Rpb25zIixGb3JtdWxhVGVtcGxhdGU6IkZvcm11bGEgdGVtcGxhdGUiLEFsZ2VicmE6IkFsZ2VicmEiLEdlb21ldHJ5OiJHZW9tZXRyeSIsSW5lcXVhbGl0eToiSW5lcXVhbGl0eSIsTWF0cml4OiJNYXRyaXgiLFRyaWFuZ2xlOiJUcmlhbmdsZSIsU3RhdGlzdGljczoiU3RhdGlzdGljcyIsU2VxdWVuY2U6IlNlcXVlbmNlIixQaHlzaWNzOiJQaHlzaWNzIixJbmRpY2F0b3JKdWRnbWVudDoiSW5kaWNhdG9yIGp1ZGdtZW50IixPbmx5Q3VycmVudEZyYW1lOiJPbmx5IGN1cnJlbnQgZnJhbWUiLENsaWNrT25UaGVJZFRvSGlnaGxpZ2h0VGhlTWFya3VwQm94OiJDbGljayBvbiB0aGUgSUQgdG8gaGlnaGxpZ2h0IHRoZSBtYXJrdXAgYm94IixEb3VibGVDbGlja09uVGhlSWRUb0NvbnRpbnVvdXNseUhpZ2hsaWdodEJveGVzQWNyb3NzRnJhbWVzOiJEb3VibGUtY2xpY2sgb24gdGhlIElEIHRvIGNvbnRpbnVvdXNseSBoaWdobGlnaHQgYm94ZXMgYWNyb3NzIGZyYW1lcyIsRmluZFRoZUZyYW1lQ29ycmVzcG9uZGluZ1RvVGhlTGFiZWxlZEZyYW1lSWQ6IkZpbmQgdGhlIGZyYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhYmVsZWQgZnJhbWUgSUQiLEdsb2JhbEFubm90YXRpb246Ikdsb2JhbCBhbm5vdGF0aW9uIixRdWFsaWZpZWRBbm5vdGF0aW9uOiJRdWFsaWZpZWQgYW5ub3RhdGlvbiIsSW52YWxpZFF1ZXN0aW9uQW5kU2tpcDoiSW52YWxpZCBxdWVzdGlvbiwgcGxlYXNlIHNraXAgdGhpcyBxdWVzdGlvbiIsUHJvamVjdGlvbkZyYW1lQ2Fubm90QmVEZWxldGVkOiJQcm9qZWN0aW9uIGZyYW1lIGNhbm5vdCBiZSBkZWxldGVkIixGYWlsZWRUb0NvcHlSZXN1bHRzOiJGYWlsZWQgdG8gY29weSByZXN1bHRzIixQYXJ0aWFsUmVzdWx0c1JlcGxpY2F0aW9uRmFpbHVyZToiUGFydGlhbCByZXN1bHRzIHJlcGxpY2F0aW9uIGZhaWx1cmUiLFJvdGF0aW9uQW5nbGVTZW5zaXRpdml0eToiUm90YXRpb24gYW5nbGUgc2Vuc2l0aXZpdHkiLCIyREltYWdlQmF0Y2giOiIyRCBJbWFnZSBCYXRjaCIsIjJESW1hZ2VCYXRjaENvbm5lY3Rpb24iOiIyRCBJbWFnZSBCYXRjaCBDb25uZWN0aW9uIiwiMkRJbWFnZUJhdGNoRGlzY29ubmVjdGlvbiI6IjJEIEltYWdlIEJhdGNoIERpc2Nvbm5lY3Rpb24iLENvbmZpcm1Ub0JhdGNoQ29ubmVjdDoiQ29uZmlybSBiYXRjaCBjb25uZWN0aW9uPyIsQ29uZmlybVRvQmF0Y2hEaXNjb25uZWN0OiJDb25maXJtIGJhdGNoIGRpc2Nvbm5lY3Rpb24/IixDb25uZWN0OiJDb25uZWN0IixEaXNjb25uZWN0OiJkaXNjb25uZWN0IixJbWFnZTJEQm94U2NhbGU6IkltYWdlIDJEIEJveCBTY2FsZSIsU2VsZWN0ZWRSZWN0OiJTZWxlY3RlZCBSZWN0IixPbmx5TG9hZFRoZUZpcnN0RnJhbWVQcmVBbm5vdGF0aW9uOiJPbmx5IGxvYWQgdGhlIGZpcnN0IGZyYW1lIHByZSBhbm5vdGF0aW9uIixTZWxlY3RCb3hUb0Rpc3BsYXlJbmRlcGVuZGVudGx5OiJTZWxlY3QgYm94IHRvIGRpc3BsYXkgaW5kZXBlbmRlbnRseSIsU2VsZWN0Qm94U3dpdGNoVGlwczoiQWZ0ZXIgdHVybmluZyBvbiB0aGUgc3dpdGNoLCBzZWxlY3QgdGhlIGJveCBpbiB0aGUgdG9wIHZpZXcsIGFuZCB0aGUgaW1hZ2UgdmlldyB3aWxsIG9ubHkgZGlzcGxheSB0aGUgY29ycmVzcG9uZGluZyAyRCBib3gsIG1ha2luZyBpdCBlYXNpZXIgdG8gdmlldyB0aGUgY29ycmVzcG9uZGluZyByZWxhdGlvbnNoaXAgaW4gdGhlIHRvcCB2aWV3IixTb3J0Q29udmVyc2F0aW9uUXVhbGl0eToiUGxlYXNlIHJhbmsgdGhlIHF1YWxpdHkgb2YgZWFjaCBjb252ZXJzYXRpb24ifSxkdD17VGV4dElucHV0OiLmlofmnKzovpPlhaUiLEF0dHJpYnV0ZToi5Li75bGe5oCnIixOb0F0dHJpYnV0ZToi5peg5bGe5oCnIixTYXZlOiLkv53lrZgiLFVuZG86IuaSpOmUgCIsUmVkbzoi6YeN5YGaIixSb3RhdGU6IuaXi+i9rCIsU3R5bGU6Iuagt+W8jyIsQWRqdXN0OiLlm77niYfosIPmlbQiLEJvcmRlclRoaWNrbmVzczoi6L655qGG57KX57uGIixDb2xvcjoi6aKc6ImyIixCb3JkZXJPcGFjaXR5OiLovrnmoYbpgI/mmI7luqYiLEZpbGxPcGFjaXR5OiLloavlhYXpgI/mmI7luqYiLFNhdHVyYXRpb246IumlseWSjOW6piIsQ29udHJhc3Q6IuWvueavlOW6piIsRXhwb3N1cmU6IuabneWFieW6piIsU2NyZWVuUmF0aW86IueUu+mdouWNoOavlCIsT3JpZ2luYWxTY2FsZToi5oyJ5Y6f5Zu+5q+U5L6L5pi+56S6IixDb3B5VGhlUHJldmlvdXM6IuWkjeWItuS4iuW8oCIsQ2xlYXJMYWJlbDoi5riF56m65qCH5rOoIixTZXRBc0ludmFsaWQ6Iuagh+S4uuaXoOaViCIsU2V0QXNWYWxpZDoi5Y+W5raI5peg5pWIIixDb25maXJtOiLnoa7orqQiLEZpbmlzaDoi5a6M5oiQIixDYW5jZWw6IuWPlua2iCIsSXRlbXNPZlRoaXNQYWdlOiLmnKzpobXku7bmlbAiLEhvdGtleXM6IuW/q+aNt+mUriIsQW5ub3RhdGVSZWN0OiLmi4nmoYYiLEFubm90YXRlSW52YWxpZFJlY3Q6IuaLieaXoOaViOahhiIsU2VsZWN0UmVjdDoi6YCJ5Lit5qGGIixSaWdodENsaWNrOiLlj7Plh7siLFRvZ2dsZVJlY3RFZmZlY3RpdmVuZXNzOiLliIfmjaLmoYbmmK/lkKbmnInmlYgiLFRvZ2dsZUVmZmVjdGl2ZW5lc3M6IuaYr+WQpuagh+S4uuaXoOaViCIsRGVsZXRlUmVjdDoi5Yig6Zmk5qGGIixTZWxlY3RBbmREb3VibGVDbGljazoi6YCJ5Lit5Y+M5Ye7IixTY2FsZToi57yp5pS+IixGdWxsc2NyZWVuOiLlhajlsY8iLFByZXZpb3VzSW1hZ2U6IuS4iuS4gOW8oCIsUHJldmlvdXNGaWxlOiLkuIrkuIDkuKoiLE5leHRJbWFnZToi5LiL5LiA5bygIixOZXh0RmlsZToi5LiL5LiA5LiqIixQcmV2aW91c0ZvbGRlcjoi5LiK5LiA5paH5Lu25aS5IixOZXh0Rm9sZGVyOiLkuIvkuIDmlofku7blpLkiLERyYWc6IuaLluWKqOWbvueJhyIsVG9nZ2xlU2VsZWN0ZWQ6IuWIh+aNoumAieS4rSIsVG9nZ2xlU2VsZWN0ZWRSZXZlcnNlOiLpgIbluo/liIfmjaLpgInkuK0iLEhpZGVHcmFwaGljczoi6ZqQ6JeP5Zu+5b2iIixUb2dnbGVMaW5lUGFydGljdWxhcml0eToi5o2i54m55q6K6L65IixUb1NpZGU6IuWvuei+uSIsU3BlY2lmaWVkQXR0cmlidXRlc09ubHk6IuS7heeci+aMh+WumuWxnuaApyIsTnVtYmVyOiLmlbDlrZciLFByZXNzOiLplb/mjIkiLFRvT3JpZ2luYWxTdGVwOiLku4Xljp/lm74iLEhvcml6b250YWxPclZlcnRpY2FsOiLmoIfmsLTlubMv5Z6C55u057q/IixBbm5vdGF0ZUludmFsaWRMaW5lOiLmoIfml6DmlYjnur8iLEFubm90YXRlTGluZToi5qCH57q/IixTZWxlY3RMaW5lOiLpgInkuK3nur8iLFRvZ2dsZUxpbmVFZmZlY3RpdmVuZXNzOiLliIfmjaLnur/mmK/lkKbmnInmlYgiLERlbGV0ZUxpbmU6IuWIoOmZpOe6vyIsQ29udGludWVUb0xhYmVsOiLnu63moIciLFNlbGVjdDoi6YCJ5LitIixJbnNlcnRQb2ludDoi5o+S5YWl54K5IixDbGlja09uTGluZToi5a+557q/5Y2V5Ye7IixEZWxldGVQb2ludDoi5Yig6Zmk54K5IixEYmxDbGlja09uUG9pbnQ6IuWvueeCueWPjOWHuyIsU3RvcEFkc29ycHRpb246IuaaguWBnOWQuOmZhCIsUHJldmlvdXNMaW5lOiLkuIrmnaHnur8iLE5leHRMaW5lOiLkuIvmnaHnur8iLFNlbGVjdFBvaW50OiLpgInkuK3ngrkiLEFubm90YXRlSW52YWxpZFBvaW50OiLmoIfml6DmlYjngrkiLEFubm90YXRlUG9pbnQ6Iuagh+eCuSIsQW5ub3RhdGVQb2x5Z29uOiLmoIflpJrovrnlvaIiLFNlbGVjdFBvbHlnb246IumAieS4reWkmui+ueW9oiIsQW5ub3RhdGVJbnZhbGlkUG9seWdvbjoi5qCH5peg5pWI5aSa6L655b2iIixUb2dnbGVQb2x5Z29uRWZmZWN0aXZlbmVzczoi5YiH5o2i5aSa6L655b2i5piv5ZCm5pyJ5pWIIixEZWxldGVQb2x5Z29uOiLliKDpmaTlpJrovrnlvaIiLERlbGV0ZToi5Yig6ZmkIixUb2dnbGVQb2ludFBhcnRpY3VsYXJpdHk6IuaNoueJueauiueCuSIsQ3JvcE92ZXJsYXBBcmVhOiLoo4Hliarph43lj6DljLrln58iLFNlZ21lbnRhdGlvblJlY29nbml0aW9uOiLliIblibLovoXliqkiLFN3aXRjaFBhdHRlcm46IuWIh+aNoue7mOWItuW9ouW8jyIsVGFnZ2luZzoi5omT5qCH562+IixIaWRlOiLmiZPmoIfnrb4iLFRhZ2dpbmdPckF0dHI6IuaJk+agh+etvi/lsZ7mgKciLEhpZGVEcmF3bkFubm90YXRpb246Iuagh+azqOmakOiXj+S4rSIsQmx1ZToi6JOdIixDeWFuOiLpnZIiLEdyZWVuOiLnu78iLFllbGxvdzoi6buEIixQaW5rOiLnsokiLFN0ZXBzOiLmoIfms6jmraXpqqQiLEV4cG9ydDoi5a+85Ye6IixOZXh0U3RlcDoi5LiL5LiA5q2lIixTdGVwTm90RmluaXNoZWROb3RpZnk6IuW9k+WJjeatpemqpOWtmOWcqOS4uuacquagh+azqOi/h+eahOWbvueJh++8jOivt+agh+azqOWujOaIkOWGjeeCueWHu+S4i+S4gOatpSIsY3VySXRlbXM6IuesrHt7Y3VycmVudH19L3t7dG90YWx9feWIhumhtSIsVHVyblBhZ2U6Iue/u+mhtSIsU3dpdGNoOiLliIfmjaIiLEVtcHR5VGV4dElucHV0OiLmuIXnqbrmlofmnKzovpPlhaUiLFJlZ3VsYXJFeHBJbmNvcnJlY3RseToi5q2j5YiZ6KGo6L6+5byP5aGr5YaZ6ZSZ6K+vIixOb0NvbmZpZ3VyYXRpb246IuaaguaXoOS/oeaBr+mFjee9riIsQ2xlYXJUaGlzT3B0aW9uOiLmuIXnqbrmraTpgInpobkiLFJlc3RvcmVJbWFnZUF0dHJpYnV0ZXM6Iui/mOWOn+WbvueJh+WxnuaApyIsQ29uZmlybVRvOiLnoa7orqQiLHJlY3RUb29sOiLmoIfnrb4iLHRhZ1Rvb2w6Iuagh+eCuSIscG9seWdvblRvb2w6IuWkmui+ueW9oiIsbGluZVRvb2w6Iue6v+adoSIscG9pbnRUb29sOiLmoIfngrkiLHRleHRUb29sOiLmlofmnKwiLFNwZWVkOiLlgI3pgJ8iLFBsYXlQYXVzZToi5pKt5pS+L+aaguWBnCIsRmFzdEZvcndhcmQ6IuW/q+i/myIsUmV3aW5kOiLlv6vpgIAiLHZpZGVvSW52YWxpZEFuZFNraXA6IuaXoOaViOinhumike+8jOivt+i3s+i/hyIsaW1hZ2VJbnZhbGlkQW5kU2tpcDoi5peg5pWI5Zu+54mH77yM6K+36Lez6L+HIix2aWRlb0Vycm9yQW5kUmVsb2FkOiLop4bpopHliqDovb3lpLHotKUsIOivt+mHjeaWsOWKoOi9vSIsaW1hZ2VFcnJvckFuZFJlbG9hZDoi5Zu+54mH5Yqg6L295aSx6LSlLCDor7fph43mlrDliqDovb0iLG9yTWFza0FzSW52YWxpZDoiIOaIliDlsIblhbbmoIfkuLrml6DmlYgiLENsaWNrQW5vdGhlclBvbHlnb246Iuivt+eCueWHu+W4jOacm+WQiOW5tueahOWkmui+ueW9oiIsUG9seWdvbnNUb0JlQ29tYmluZWROZWVkVG9CZVNlbGVjdGVkOiLpnIDopoHpgInkuK3pnIDopoHlkIjlubbnmoTlpJrovrnlvaIiLEN1cnZlTW9kZURvZXNOb3RTdXBwb3J0Q3V0dGluZzoi5puy57q/5qih5byP5pqC5LiN5pSv5oyB6KOB5YmqIixDb21iaW5lU3VjY2Vzczoi5ZCI5bm25oiQ5YqfIixDb21iaW5pbmdGYWlsZWROb3RpZnk6IuWQiOW5tuWksei0pe+8jOivt+ajgOafpeaYr+WQpuS4pOS4quWkmui+ueW9ouaYr+WQpuacieebuOS6pO+8jOaIluWkmui+ueW9ouWQiOW5tuaYr+WQpuW9ouaIkOa8j+epuiIsQ29tYmluZU92ZXJsYXBBcmVhOiLlkIjlubbph43lj6DljLrln58iLE5vRGVwZW5kZW5jeToi6K+l5Zu+54mH5peg6ZyA5qCH5rOoIixUZXh0Q2hlY2tOdW1iZXJPbmx5OiLor7fmjInku4XmlbDlrZfnmoTmoLzlvI/ovpPlhaUiLFRleHRDaGVja0VuZ2xpc2hPbmx5OiLor7fmjInku4Xoi7HmlofnmoTmoLzlvI/ovpPlhaUiLFRleHRDaGVja0N1c3RvbUZvcm1hdDoi6K+35oyJ6KaB5rGC55qE5qC85byP6L6T5YWlIixGcmFtaW5nT2ZPYmplY3RUb0JlRGl2aWRlZDoi6K+35YWI5qGG5Ye66ZyA5YiG5Ymy55qE54mp5L2TIixDbGlja09uVGFyZ2V0OiLor7fljZXlh7vnm67moIfniankvZMiLFNwbGl0dGluZ0FsZ29yaXRobVByZWRpY3Rpb246IuWIhuWJsueul+azlemihOa1i+S4rS4uLiIsIjJEVmlldyI6IjJE6KeG5Zu+IiwiM0RWaWV3IjoiM0Top4blm74iLFRvcFZpZXc6IuS/r+inhuWbviIsU2lkZVZpZXc6IuS+p+inhuWbviIsQmFja1ZpZXc6IuiDjOinhuWbviIsU2hvd0Fycm93czoi5pi+56S6566t5aS0IixMZW5ndGg6IumVvyIsV2lkdGg6IuWuvSIsSGVpZ2h0OiLpq5giLFJvdGF0aW9uX3k6IuacneWQkeinkiIsUG9pbnRDb3VudDoi54K55pWwIixJbnZhbGlkOiLml6DmlYgiLFRhZzoi5qCH562+IixTZWFyY2hUYWc6IuaQnOe0ouagh+etviIsU3ViQXR0cmlidXRlOiLlia/lsZ7mgKciLFBsZWFzZVNlbGVjdDoi6K+36YCJ5oupIixDb3B5RW1wdHlJblBvaW50Q2xvdWQ6IuWkjeWItuWGheWuueS4uuepuu+8jOivt+mAieaLqeWvueW6lOeahOeCueS6keaVsOaNriIsUGFzdGVFbXB0eUluUG9pbnRDbG91ZDoi6K+35YWI5aSN5Yi26ZyA6KaB55qE54K55LqR5pWw5o2u5YaN6L+b6KGM57KY6LS0IixIYXNEdXBsaWNhdGVJRDoi5a2Y5Zyo6YeN5aSNSUQs5aSN5Yi25aSx6LSlIixIYXNEdXBsaWNhdGVJREhlYWRlcjoi5a2Y5Zyo5qCH5rOo5qGGIElEIOmHjeWkjSIsSGFzRHVwbGljYXRlSURNc2c6IuWtmOWcqOagh+azqOahhiBJRCDph43lpI3nmoTpl67popjvvIzmmK/lkKbopoHopobnm5Y/IixDb3B5U3VjY2Vzczoi5aSN5Yi25oiQ5Yqf77yBIixMb3dlckxpbWl0UG9pbnRzTnVtSW5Cb3g6IuahhuS9k+WGheeCueaVsOS4jeWFgeiuuOS9juS6jiB7e251bX19IOS4qiIsUG9pbnRUaGlja25lc3M6IueCueeahOaYvuekuueyl+e7hiIsUm90YXRlQXJvdW5kQ2VudGVyUG9pbnQ6Iue7leS4reW/g+eCueaXi+i9rOeUu+mdoiIsUG9pbnRDbG91ZFZpZXdUcmFuc2xhdGU6IueCueS6keW5s+enuyIsVG9wVmlld1RyYW5zbGF0ZToi5L+v6KeG5Zu+5bmz56e7IixDaGFuZ2VQb2ludENsb3VkVmFsaWQ6IuWIh+aNoueCueS6keacieaViOaApyIsTGFzc29TZWxlY3Rvcjoi5aWX57SiIixSZWN0U2VsZWN0b3I6IuaLieahhiIsU2VsZWN0b3JNc2c6IuWPs+mUruaLluWKqOi/m+ihjOiMg+WbtOiOt+WPliIsQWRkUG9pbnQ6Iua3u+WKoOeCuSIsQ2lyY2xlU2VsZWN0b3I6IumAieeCuSIsRGV0ZWN0aW9uTW9kZToi5qOA5rWL5qih5byPIixTZWdtZW50YXRpb25Nb2RlOiLliIblibLmqKHlvI8iLEVudGVyRWRpdE1vZGU6Iui/m+WFpee8lui+kSIsU2VsZWN0ZWRQb2ludHM6IumAieS4reeCueaVsCIsQ29weUJveDoi5aSN5Yi25qGGIixQYXN0ZUJveDoi57KY6LS05qGGIixSb3RhdGVMZWZ0OiLlkJHlt6bml4vovazlvq7osIMiLFJvdGF0ZVJpZ2h0OiLlkJHlj7Pml4vovazlvq7osIMiLFByZXZpb3VzQm94OiLkuIrkuIDmoYYiLE5leHRCb3g6IuS4i+S4gOahhiIsUm90YXRlOTA6IuaXi+i9rDkwwrAiLENvcHlQcmV2UGFnZToi5aSN5Yi25LiK5LiA6aG1IixDaGFuZ2VCb3hWYWxpZDoi5YiH5o2i5qCH5rOo5qGG5pyJ5pWI5oCnIixNdWx0aVNlbGVjdDoi5aSa6YCJIixTZWxlY3RBbGxCb3g6IuWFqOmAiSIsR2VuZXJhbE9wZXJhdGlvbjoi6YCa55SoIixSZWN0UGF0dGVybjoi5ouJ5qGG5qih5byPIixQb2x5Z29uUGF0dGVybjoi5aSa6L655b2i5qih5byPIixDaGFuZ2VQYXR0ZXJuTXNnOiLmiJDlip/mm7TmlLnkuLp7e3BhdHRlcm59feaooeW8jyIsRHJhZ09wZXJhdGlvbjoi5ouW5YqoIixTZWxlY3RlZFN0YXR1czoi6YCJ5Lit5pe2Iix1cGRhdGVWYWxpZEZyb21WYWxpZFRvSW5WYWxpZDoi5piv5ZCm56Gu6K6k5qCH5Li65peg5pWI5paH5Lu277yfIix1cGRhdGVWYWxpZEZyb21JblZhbGlkVG9WYWxpZDoi5piv5ZCm56Gu6K6k5Y+W5raI5peg5pWI5paH5Lu277yfIixBbGxUcmFja0lEczoi5omA5pyJ5bey5qCH5rOo55qE5qGGSUQiLEN1cnJlbnRCb3hUcmFja0lEczoi5b2T5YmN5qCH5rOo5qGGSUQiLFBvc2l0aXZlSW50ZWdlckNoZWNrOiLor7fovpPlhaXmraPmlbTmlbAiLE5vdEFsbG93RGVjaW1hbFBvaW50c0luVHJhY2tJRDoi6L6T5YWldHJhY2tJROS4jeWFgeiuuOWMheWQq+Wwj+aVsOeCuSIsRHVwbGljYXRlVHJhY2tJRHNFeGlzdDoi5a2Y5Zyo6YeN5aSN55qEdHJhY2tJRCIsQmF0Y2hVcGRhdGVUZXh0OiLmibnph4/kv67mlLkiLEJhdGNoVXBkYXRlVHJhY2tJRDoi5om56YeP5L+u5pS5SUQiLFRyYWNrSURVbmlmeUFzOiLnu5/kuIDmoIfms6jmoYZJROS4uiIsVW5pZnlUcmFja0lEUmFuZ2U6Iue7n+S4gElE6IyD5Zu0IixQYWdlOiLpobUiLE9rVGV4dDoi56Gu6K6kIixDYW5jZWxUZXh0OiLlj5bmtogiLFVuaWZ5UGFyYW1zOiLnu5/kuIDlj4LmlbAiLFVuaWZ5QXR0cmlidXRlUmFuZ2U6Iue7n+S4gOWxnuaAp+iMg+WbtCIsVW5pZnlUcmFja0lEOiLnu5/kuIDmoIfms6jmoYZJRCIsVW5pZnlTaXplOiLnu5/kuIDlsLrlr7giLFVuaWZ5VGFnOiLnu5/kuIDmoIfnrb4iLE5vRGF0YToi5pqC5peg5pWw5o2uIixBbm5vdGF0ZWRMaXN0OiLmoIfms6jliJfooagiLG9uRGVsZXRlR3JhcGhCeUF0dHI6IuehruWumuimgeWIoOmZpOWxnuaAp+S4uiB7e2F0dHJpYnV0ZX19IOeahOagh+azqOaVsOaNruWQlz8iLENhbmNlbEZpeGVkOiLlj5bmtojlm7rlrpoiLEZpeGVkT25MZWZ0OiLlm7rlrprlnKjlt6bkvqciLEZpeGVkT25SaWdodDoi5Zu65a6a5Zyo5Y+z5L6nIixBbm5vdGF0ZWRSZXN1bHQ6Iuagh+azqOe7k+aenCIsQ29tcGxlbWVudGFyeVRyYWNraW5nOiLooaXlhajot5/ouKoiLENvbXBsZW1lbnRhcnlUcmFja2luZ1ByZWRpY3Rpb246IuihpeWFqOi3n+i4qumihOa1iyIsQXBwbHk6IuW6lOeUqCIsQmVmb3JlUHJlZGljdFN0YXJ0aW5nOiLlkK/liqjliY3vvIzor7flhYjmoIflh7rpppblsL7nmoTmoYbvvIzpnIDlkIzluo/lj7ciLFRoZVByZWRpY3RlZFBvaW50Q2xvdWQ6IueOsOmihOa1i+eCueS6kemcgOimgeWwj+S6jiAxMCDluKciLENhbWVyYUZvbGxvd1RvcFZpZXc6IuaMieS/r+inhuWbvuWumuS9jSIsTWFya09ubHlPbmU6IuS7heagh+azqOS4gOW4p+aVsOaNru+8jOmcgOagh+WHuummluWwvueahOW4p+aVsOaNriIsSGF2ZU5vTmVlZDoi5Lik5bin5LmL6Ze05pqC5peg6ZyA6aKE5rWL55qE5pWw5o2u77yM6K+35YWI5qCH5Ye66aaW5bC+55qE5qGG77yM6ZyA5ZCM5bqP5Y+3IixQcmVkaWN0aW5nRGF0YUZyb206Iuato+WcqOmihOa1i+esrCB7e3N0YXJ0UGFnZX19IOmhteWIsOesrCB7e2VuZFBhZ2V9fSDpobXkuYvpl7TmoYZJROS4uiB7e3NlbGVjdGVkQm94VHJhY2tJRH19IOeahOaVsOaNriIsUG9pbnRDbG91ZENvdmVyTW9kZToi6YCJ5Lit55u45ZCM54K55LqR5pe277yM5ZCO5LiA5qCH6K6w6KaG55uW5YmN5LiA5qCH6K6wIixQb2ludENsb3VkVW5jb3Zlck1vZGU6IumAieS4reebuOWQjOeCueS6keaXtu+8jOWQjuS4gOagh+iusOS4jeWPr+imhuebluWJjeS4gOagh+iusCIsUG9pbnRDbG91ZEZvY3VzTW9kZToi5bey5byA5ZCv6IGa54Sm5qih5byPIixQb2ludENsb3VkVW5mb2N1c01vZGU6IuW3suWFs+mXreiBmueEpuaooeW8jyIsUG9pbnRDbG91ZEhpZGVTZWdtZW50OiLlt7LpmpDol4/moIfms6jngrnkupEiLFBvaW50Q2xvdWRTaG93U2VnbWVudDoi5bey5pi+56S65YWo6YOo54K55LqRIixQb2ludENsb3VkSGlkZVNlZ21lbnRJbnZhbGlkOiLpmpDol4/lt7LmoIfms6jkuI3lj6/nlKjvvIzor7flhYjlhbPpl63ogZrnhKYiLFBvaW50Q2xvdWRIaWRlRm9jdXNJbnZhbGlkX2hpZGU6IuiBmueEpuS4jeWPr+eUqO+8jOivt+WFiOWFs+mXreKAnOmakOiXj+W3suagh+azqOKAnSIsUG9pbnRDbG91ZEhpZGVGb2N1c0ludmFsaWRfbm9uZToi6IGa54Sm5LiN5Y+v55So77yM6K+35YWI6YCJ5oup6ZyA6KaB6IGa54Sm55qE5qCH6K6wIixQYWxldHRlOiLosIPoibLnm5giLEVmZmljaWVudExpc3RlbmluZzoi6K+l5Lu75Yqh5qCH5rOo5pWI546H55uR5o6n5LitLi4uIixUaXRsZToi6aKY55uuIixBbnN3ZXI6IuWbnuetlCIsRmluaXNoZWQ6IuW3suWujOaIkCIsVW5maW5pc2hlZDoi5pyq5a6M5oiQIixPdmVyYWxsU2NvcmU6IuaVtOS9k+ivhOWIhiIsTm9TY29yaW5nU2NhbGU6IuWPr+WcqOW3puS+p+mFjee9ruatpemqpOivpuaDhSIsQmVzdDoi5pyA5aW9IixXb3JzdDoi5pyA5beuIixSYW5raW5nUXVhbGl0eU9mQW5zd2Vyczoi6K+35a+55q+P5Liq5Zue562U55qE6LSo6YeP6L+b6KGM5o6S5bqPIixUb0JlU29ydGVkOiLlvoXmjpLluo8iLFllczoi5pivIixObzoi5ZCmIixBZGRpdGlvbmFsQ29udGVudDoi77yI6YCJ5aGr77yJ6K+35aGr5YaZ5Lu75L2V5L2g5a+5562U5qGI55qE6K+E5Lu35oiW5YW25LuW6KGl5YWF5YaF5a65IixTdWJtaXQ6IuaPkOS6pCIsRHJhZ0FuZERyb3A6IuaMieS9j+aLluWKqCIsRGVmYXVsdFNpemU6IueCueWHu+Wbvuagh+S7peS9v+eUqOm7mOiupOWwuuWvuCIsTm9ybWFsU2l6ZVJhbmdlOiLmraPluLjlsLrlr7jojIPlm7QiLE5vcm1hbENlbnRlclBvaW50UmFuZ2U6Iuato+W4uOS4reW/g+eCueiMg+WbtCIsTG9hZGluZ1RpcHM6IuaVsOaNruWKoOi9veS4rX7or7fnqI3lkI4iLFVubG9ja2VkOiLmnKrlvIDlkK8iLExvY2tlZDoi5bey5byA5ZCvIixMZWFzdENoYXJhY3RlckVycm9yOiLor7foh7PlsJHovpPlhaV7e251bX195Liq5a2X56ymIixBbmQ6IuS4lCIsT3I6IuaIliIsSW1hZ2VMYWJlbHM6IuWbvueJh+agh+azqOeJqSIsIjNEUmVjdCI6IjNEIOahhiIsIjJEUmVjdCI6IjJEIOahhiIsQWRkUG9pbnRzOiLlop7liqAiLFJlbW92ZVBvaW50czoi5Yig5YePIixSZXNldDoi6YeN572uIixQbGVhc2VGcmFtZVRoZU9iamVjdFRvQmVEaXZpZGVkRmlyc3Q6Iuivt+WFiOahhuWHuumcgOWIhuWJsueahOeJqeS9kyIsQ2xpY2tPblRoZVRhcmdldE9iamVjdFRvU3BsaXRJdDoi5Y2V5Ye755uu5qCH54mp5L2T6L+b6KGM5YiG5YmyIixDbGlja1RoZVRhcmdldE9iamVjdEFnYWluVG9JbmNyZWFzZVRoZVNlZ21lbnRhdGlvbjoi5YaN5qyh5Y2V5Ye755uu5qCH54mp5L2T5aKe5Yqg5YiG5YmyIixDbGlja09uVGhlVGFyZ2V0T2JqZWN0VG9EZWxldGVUaGVTZWdtZW50YXRpb246IuWNleWHu+ebruagh+eJqeS9k+WIoOWHj+WIhuWJsiIsQ2xpY2tBZ2Fpbk9uVGhlVGFyZ2V0T2JqZWN0VG9EZWxldGVUaGVTZWdtZW50YXRpb246IuWGjeasoeWNleWHu+ebruagh+eJqeS9k+WIoOWHj+WIhuWJsiIsQW5zd2Vyc0FyZUJlaW5nR2VuZXJhdGVkOiLlm57nrZTnlJ/miJDkuK0iLEFuc3dlckdlbmVyYXRpb25GYWlsZWRQbGVhc2VUcnlBZ2FpbkxhdGVyOiLlm57nrZTnlJ/miJDlpLHotKXvvIzor7fnqI3lkI7ph43or5UiLFJlR2VuZXJhdGU6IumHjeaWsOeUn+aIkCIsQW5zd2VyVGV4dEVkaXQ6IuWbnuetlOaWh+acrOe8lui+kSIsU2hvd0VkaXRpbmdSZXN1bHREaWZmZXJlbmNlc0luVGV4dE1vZGVPbmx5OiLku4XmlofmnKzmqKHlvI/kuIvmmL7npLrnvJbovpHnu5Pmnpzlt67lvIIiLEF0dHJpYnV0ZUxvY2tOb3RpZnk6Iuafpeeci+WxnuaAp++8mnt7bGFiZWx9fe+8jOWPquaYvuekuuaJgOmAieWxnuaAp+eahOagh+azqOWGheWuuSIsQXVkaW9TZWdtZW50VGlwOiLor7fpgInmi6nluIzmnJvmiKrlj5bnmoTml7bpl7TngrnvvIh7e3RpbWV9fe+8iSIsQXVkaW9Db21iaW5lVGlwOiLor7fngrnlh7vluIzmnJvlkIjlubbnmoTljLrpl7QiLENsaXBwZWRBdWRpbzoi5bey5oiq5Y+W6Z+z6aKRIixOb0NsaXBwZWREYXRhOiLmmoLml6DmiKrlj5blhoXlrrkiLENvbXBhcmVUYWdzOiLmoIfnrb7lr7nnhafmmL7npLoiLENvbWJpbmVBdWRpbzoi5ZCI5bm25Yy66Ze0IixDbGlwQXVkaW86IuWIhuWJsuWMuumXtCIsU3dpdGNoQ2xpcE1vZGU6IuWIh+aNouaIquWPluaooeW8jyIsU3dpdGNoVGFnTW9kZToi5YiH5o2i5qCH562+5qih5byPIixDbGlwOiLmiKrlj5YiLFByZXZpb3VzSW50ZXJ2YWw6IuS4iuS4gOWMuumXtCIsTmV4dEludGVydmFsOiLkuIvkuIDljLrpl7QiLERlbGV0ZUNvbW1lbnQ6IuWIoOmZpOaJueazqCIsRGVsZXRlQ29tbWVudENvbmZpcm06IuehruWumuWIoOmZpOivpeadoeagh+azqOWQlyIsUHJldmlvdXNDb21tZW50OiLkuIrkuIDmnaHmibnms6giLE5leHRDb21tZW50OiLkuIvkuIDmnaHmibnms6giLENsaXBTZWxlY3Q6IuaIquWPlumAieS4rSIsIkZvcndhcmQwLjEiOiLliY3ov5swLjFzIiwiQmFjazAuMSI6IuWQjumAgDAuMXMiLExlZnRDbGljazoi5bem5Ye7IixTY3JpYmJsZToi5raC5oq5IixFcmFzZToi5pOm6ZmkIixTY3JpYmJsZUxpbmU6Iua2guaKue+8iOi/nue6v++8iSIsU3Ryb2tlRW5sYXJnZToi56yU6Kem5pS+5aSnIixTdHJva2VSZWR1Y3Rpb246IueslOinpue8qeWwjyIsdG9nZ2xlU2hvd1RleHQ6IuaWh+acrOWvueeFp+aYvuekuiIsQ2xpcFNsaWNlOiLmiKrlj5bniYfmrrUiLFRpbWVTdGFtcDoi5qCH5pe26Ze054K5IixDbGlwVGltZToi5oiq5Y+W5pe26Ze0IixTdGFtcFRpbWU6IuaXtumXtOeCueaXtumXtCIsR2V0U3RhcnRUaW1lOiLojrflj5blvIDlp4vml7bpl7QiLEdldEVuZFRpbWU6IuiOt+WPlue7k+adn+aXtumXtCIsT3V0cHV0RGlzcGxheToi6L6T5Ye65bGV56S6IixNYXhpbXVtQ2hhcmFjdGVyRXJyb3I6IuWtl+espuaVsOS4jeiDvei2hei/h3t7bnVtfX0iLENvbW1vblN5bWJvbHM6IuW4uOeUqOespuWPtyIsQmluYXJ5T3BlcmF0aW9uczoi5LqM5YWD6L+Q566X56ymIixCaW5hcnlSZWxhdGlvbnM6IuS6jOWFg+WFs+ezu+espiIsQXJyb3dzOiLnrq3lpLTnrKblj7ciLE90aGVyczoi5YW25LuW56ym5Y+3IixHcmVlazoi5biM6IWK5a2X5q+NIixMb3dlcmNhc2U6IuWwj+WGmSIsVXBwZXJjYXNlOiLlpKflhpkiLEFkdmFuY2VkTWF0aGVtYXRpY3M6IumrmOetieaVsOWtpiIsRnJhY3Rpb25hbERpZmZlcmVudGlhdGlvbjoi5YiG5pWw5b6u5YiGIixGcmFjdGlvbjoi5YiG5pWwIixEZXJpdmF0aXZlOiLlr7zmlbAiLE1vZHVsYXJBcml0aG1ldGljOiLmqKHnrpfmnK8iLFJhZGljYWw6IuagueW8jyIsU3VwQW5kU3ViOiLkuIrkuIvmoIciLExpbWl0TG9nYXJpdGhtOiLmnoHpmZDlr7nmlbAiLExpbWl0czoi5p6B6ZmQIixMb2dhcml0aG1zQW5kRXhwb25lbnRzOiLlr7nmlbDmjIfmlbAiLEJvdW5kczoi55WM6ZmQIixJbnRlZ3JhbE9wZXJhdGlvbjoi56ev5YiG6L+Q566XIixJbnRlZ3JhbDoi56ev5YiGIixEb3VibGVJbnRlZ3JhbDoi5Y+M6YeN56ev5YiGIixUcmlwbGVJbnRlZ3JhbDoi5LiJ6YeN56ev5YiGIixMYXJnZU9wZXJhdGlvbnM6IuWkp+Wei+i/kOeulyIsUHJvZHVjdHNBbmRDb3Byb2R1Y3RzOiLkuZjnp6/kvZnnp68iLEludGVyc2VjdGlvbkFuZFVuaW9uOiLkuqTpm4blubbpm4YiLExpbmVhckFsZ2VicmE6Iue6v+aAp+S7o+aVsCIsQnJhY2tldEZvcmVuc2ljczoi5ous5Y+35Y+W6K+BIixCcmFja2V0OiLmi6zlj7ciLENvbW1vbjoi5bi455SoIixBcnJheU1hdHJpeDoi5pWw57uE55+p6Zi1IixUcmlnb25vbWV0cmljRnVuY3Rpb25zOiLkuInop5Llh73mlbAiLEludmVyc2VUcmlnb25vbWV0cmljRnVuY3Rpb25zOiLlj43kuInop5Llh73mlbAiLEh5cGVyYmxpY0Z1bmN0aW9uczoi5Y+M5puy5Ye95pWwIixJbnZlcnNlSHlwZXJibGljRnVuY3Rpb25zOiLlj43lj4zmm7Llh73mlbAiLEZvcm11bGFUZW1wbGF0ZToi5YWs5byP5qih5p2/IixBbGdlYnJhOiLku6PmlbAiLEdlb21ldHJ5OiLlh6DkvZUiLEluZXF1YWxpdHk6IuS4jeetieW8jyIsTWF0cml4OiLnn6npmLUiLFRyaWFuZ2xlOiLkuInop5IiLFN0YXRpc3RpY3M6Iue7n+iuoSIsU2VxdWVuY2U6IuaVsOWIlyIsUGh5c2ljczoi54mp55CGIixJbmRpY2F0b3JKdWRnbWVudDoi5oyH5qCH5Yik5patIixPbmx5Q3VycmVudEZyYW1lOiLlj6rnnIvlvZPliY3luKciLENsaWNrT25UaGVJZFRvSGlnaGxpZ2h0VGhlTWFya3VwQm94OiLngrnlh7tJROWPr+S7pemrmOS6ruagh+azqOahhiIsRG91YmxlQ2xpY2tPblRoZUlkVG9Db250aW51b3VzbHlIaWdobGlnaHRCb3hlc0Fjcm9zc0ZyYW1lczoi5Y+M5Ye7SUTlj6/ku6Xot6jluKfov57nu63pq5jkuq7moIfms6jmoYYiLEZpbmRUaGVGcmFtZUNvcnJlc3BvbmRpbmdUb1RoZUxhYmVsZWRGcmFtZUlkOiLmn6Xmib7moIfms6jmoYZJROWvueW6lOW4pyIsR2xvYmFsQW5ub3RhdGlvbjoi5YWo5bGA5qCH5rOoIixRdWFsaWZpZWRBbm5vdGF0aW9uOiLpmZDlrprmoIfms6giLEludmFsaWRRdWVzdGlvbkFuZFNraXA6IuaXoOaViOmimOebru+8jOivt+i3s+i/h+atpOmimCIsUHJvamVjdGlvbkZyYW1lQ2Fubm90QmVEZWxldGVkOiLmipXlsITmoYbml6Dms5XliKDpmaQiLEZhaWxlZFRvQ29weVJlc3VsdHM6IuWkjeWItue7k+aenOWksei0pSIsUGFydGlhbFJlc3VsdHNSZXBsaWNhdGlvbkZhaWx1cmU6IumDqOWIhue7k+aenOWkjeWItuWksei0pSIsUm90YXRpb25BbmdsZVNlbnNpdGl2aXR5OiLml4vovazlvq7osIPop5LluqYiLCIyREltYWdlQmF0Y2giOiIyROWbvueJh+aJuemHjyIsIjJESW1hZ2VCYXRjaENvbm5lY3Rpb24iOiIyROWbvueJh+aJuemHj+i/nuaOpSIsIjJESW1hZ2VCYXRjaERpc2Nvbm5lY3Rpb24iOiIyROWbvueJh+aJuemHj+aWreW8gCIsQ29uZmlybVRvQmF0Y2hDb25uZWN0OiLnoa7orqTmibnph4/ov57mjqXvvJ8iLENvbmZpcm1Ub0JhdGNoRGlzY29ubmVjdDoi56Gu6K6k5om56YeP5pat5byA77yfIixDb25uZWN0OiLov57mjqUiLERpc2Nvbm5lY3Q6IuaWreW8gCIsSW1hZ2UyREJveFNjYWxlOiLlm77niYcyROahhuS9k+e8qeWwj+WkhOeQhiIsU2VsZWN0ZWRSZWN0OiLpgInkuK3moYbkvZMiLE9ubHlMb2FkVGhlRmlyc3RGcmFtZVByZUFubm90YXRpb246IuS7hei9veWFpeesrOS4gOW4p+mihOagh+azqCIsU2VsZWN0Qm94VG9EaXNwbGF5SW5kZXBlbmRlbnRseToi6YCJ5Lit5qGG54us56uL5pi+56S6IixTZWxlY3RCb3hTd2l0Y2hUaXBzOiLlvIDlkK/lvIDlhbPlkI7vvIzpgInkuK3kv6/op4blm77nmoTmoYbkvZPvvIzlm77niYfop4blm77ku4XmmL7npLrlr7nlupTnmoQyROahhuS9k++8jOS+v+S6juafpeeci+S/r+inhuWbvueahOWvueW6lOWFs+ezuyIsU29ydENvbnZlcnNhdGlvblF1YWxpdHk6Iuivt+Wvueavj+e7hOWvueivneeahOi0qOmHj+i/m+ihjOaOkuW6jyJ9O2Z0Lmxhbmd1YWdlfHxmdC5pbml0KHtsbmc6ImVuIixpbnRlcnBvbGF0aW9uOntlc2NhcGVWYWx1ZTohMX19KSxmdC5hZGRSZXNvdXJjZUJ1bmRsZSgiZW4iLCJ0cmFuc2xhdGlvbiIscHQsITApLGZ0LmFkZFJlc291cmNlQnVuZGxlKCJjbiIsInRyYW5zbGF0aW9uIixkdCwhMCk7Y29uc3QgZ3Q9ezA6MCwxOi4yLDM6LjQsNTouNiw3Oi44LDk6MSwxMDoxfSx5dD17MDowLDE6MCwzOi4yLDU6LjQsNzouNiw5Oi44LDEwOjF9LG10PWNsYXNze3N0YXRpYyByZ2JhU3RyaW5nVG9IZXgodCl7Y29uc3QgZT10LnN1YnN0cmluZyg1LHQubGVuZ3RoLTEpLnJlcGxhY2UoLyAvZywiIikuc3BsaXQoIiwiKSxuPXBhcnNlSW50KGVbMF0pLHI9cGFyc2VJbnQoZVsxXSksaT1wYXJzZUludChlWzJdKSxvPXBhcnNlRmxvYXQoZVszXSk7cmV0dXJuIiMiK24udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKStyLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikraS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpK01hdGgucm91bmQoMjU1Km8pLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIil9fTtsZXQgdnQ9bXQ7dnQucmVwbGFjZUFGcm9tUkdCQT0odCxlKT0+dC5zcGxpdCgiICIpLmpvaW4oIiIpLnJlcGxhY2UoLyxbMC05XSsoWy5dezF9WzAtOV0rKXswLDF9XCkvLGAsJHtlLnRvRml4ZWQoMil9KWApLHZ0LnRvUkdCQUFycj10PT57Y29uc3QgZT10Lm1hdGNoKC9cZCsvZyk7aWYoZSl7Y29uc3RbdCxuLHIsaV09ZTtyZXR1cm5bdCxuLHIsaV19fSx2dC5nZXRUb29sU3Ryb2tlQW5kRmlsbD0odCxlKT0+e2NvbnN0e2hvdmVyOm49ITEsc2VsZWN0ZWQ6cj0hMSxib3JkZXJPcGFjaXR5Omk9MSxmaWxsT3BhY2l0eTpvPTEsY29tbW9uT3BhY2l0eTpzPS44fT1lO3JldHVybiByfHxuP3tzdHJva2U6bXQucmVwbGFjZUFGcm9tUkdCQSh0LGkpLGZpbGw6bXQucmVwbGFjZUFGcm9tUkdCQSh0LG8pLHJnYmE6bXQudG9SR0JBQXJyKHQpfTp7c3Ryb2tlOm10LnJlcGxhY2VBRnJvbVJHQkEodCxpKnMpLGZpbGw6bXQucmVwbGFjZUFGcm9tUkdCQSh0LG8qcykscmdiYTptdC50b1JHQkFBcnIodCl9fSx2dC5nZXRTdHJva2VBbmRGaWxsPSh0LGU9MSxuPTEpPT4oe3N0cm9rZTptdC5yZXBsYWNlQUZyb21SR0JBKHQsZSksZmlsbDptdC5yZXBsYWNlQUZyb21SR0JBKHQsbil9KSx2dC5nZXRUb29sQ29sb3JMaXN0PSh0LGU9OSxuPTkpPT57Y29uc3Qgcj1ndFtlXSxpPXl0W25dO3JldHVybnt2YWxpZDptdC5nZXRTdHJva2VBbmRGaWxsKHQsMSpyLC40KmkpLGludmFsaWQ6bXQuZ2V0U3Ryb2tlQW5kRmlsbChJdCwxKnIsLjgqaSksdmFsaWRTZWxlY3RlZDptdC5nZXRTdHJva2VBbmRGaWxsKHQsMSpyLC44KmkpLGludmFsaWRTZWxlY3RlZDptdC5nZXRTdHJva2VBbmRGaWxsKEl0LDEqciwuMjQqaSksdmFsaWRIb3ZlcjptdC5nZXRTdHJva2VBbmRGaWxsKHQsMSpyLC42NCppKSxpbnZhbGlkSG92ZXI6bXQuZ2V0U3Ryb2tlQW5kRmlsbChJdCwxKnIsLjQqaSl9fSx2dC5nZXRBdHRyaWJ1dGVJbmRleD0odCxlKT0+e3RyeXtyZXR1cm4gZS5maW5kSW5kZXgoKGU9PmUudmFsdWU9PT10KSl9Y2F0Y2godCl7cmV0dXJuLTF9fTt2YXIgX3Q9T2JqZWN0LmRlZmluZVByb3BlcnR5LHh0PU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLHd0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLGJ0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsRHQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxFdD1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLEN0PSh0LGUsbik9PmUgaW4gdD9fdCh0LGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm59KTp0W2VdPW47Y29uc3QgU3Q9WyJyZ2JhKDEwMiwgMTExLCAyNTUsIDEpIiwicmdiYSgxMDIsIDIzMCwgMjU1LCAxKSIsInJnYmEoMTkxLCAyNTUsIDEwMiwgMSkiLCJyZ2JhKDI1NSwgMjMwLCAxMDIsIDEpIiwicmdiYSgyMzAsIDEwMiwgMjU1LCAxKSJdLEF0PVsicmdiYSgxMjgsIDEyLCAyNDksIDEpIiwicmdiYSgwLCAyNTUsIDQ4LCAxKSIsInJnYmEoMjU1LCAxMzYsIDI0NywgMSkiLCJyZ2JhKDI1NSwgMjI2LCA1MCwgMSkiLCJyZ2JhKDE1MywgNjYsIDIzLCAxKSIsInJnYmEoMiwgMTMwLCAyNTAsIDEpIiwicmdiYSgyNTUsIDM1LCAzNSwgMSkiLCJyZ2JhKDAsIDI1NSwgMjM0LCAxKSJdLE50PVt7cmdiYToicmdiYSgxMjgsIDEyLCAyNDksIDEpIixoZXg6ODM5MTkyOX0se3JnYmE6InJnYmEoMCwgMjU1LCA0OCwgMSkiLGhleDo2NTMyOH0se3JnYmE6InJnYmEoMjU1LCAxMzYsIDI0NywgMSkiLGhleDoxNjc0Njc0M30se3JnYmE6InJnYmEoMjU1LCAyMjYsIDUwLCAxKSIsaGV4OjE2NzY5NTg2fSx7cmdiYToicmdiYSgxNTMsIDY2LCAyMywgMSkiLGhleDoxMDA0MzkyN30se3JnYmE6InJnYmEoMiwgMTMwLCAyNTAsIDEpIixoZXg6MTY0NjAyfSx7cmdiYToicmdiYSgyNTUsIDM1LCAzNSwgMSkiLGhleDoxNjcyMDY3NX0se3JnYmE6InJnYmEoMCwgMjU1LCAyMzQsIDEpIixoZXg6NjU1MTR9XSxJdD0icmdiYSgyNTUsIDE1MywgMTAyLCAxKSIsTXQ9InJnYmEoMjA0LCAyMDQsIDIwNCwgMSkiOyFmdW5jdGlvbigpe2xldCB0O2NvbnN0IGU9bmV3IEFycmF5KDI1NikuZmlsbCgiIikubWFwKCh0PT5uZXcgQXJyYXkoMykuZmlsbCgiIikpKTtmb3IobGV0IG49MDtuPDIwO24rKyl7Zm9yKHQ9MDt0PDMyO3QrKyllW3RdWzBdPTEyOCs0KnQsZVt0XVsxXT0wLGVbdF1bMl09MDtmb3IoZVszMl1bMF09MjU1LGVbMzJdWzFdPTAsZVszMl1bMl09MCx0PTA7dDw2Mzt0KyspZVszMyt0XVswXT0yNTUsZVszMyt0XVsxXT00KzQqdCxlWzMzK3RdWzJdPTA7Zm9yKGVbOTZdWzBdPTI1NCxlWzk2XVsxXT0yNTUsZVs5Nl1bMl09Mix0PTA7dDw2Mjt0KyspZVs5Nyt0XVswXT0yNTAtNCp0LGVbOTcrdF1bMV09MjU1LGVbOTcrdF1bMl09Nis0KnQ7Zm9yKGVbMTU5XVswXT0xLGVbMTU5XVsxXT0yNTUsZVsxNTldWzJdPTI1NCx0PTA7dDw2NDt0KyspZVsxNjArdF1bMF09MCxlWzE2MCt0XVsxXT0yNTItNCp0LGVbMTYwK3RdWzJdPTI1NTtmb3IodD0wO3Q8MzI7dCsrKWVbMjI0K3RdWzBdPTAsZVsyMjQrdF1bMV09MCxlWzIyNCt0XVsyXT0yNTItNCp0fX0oKTt2YXIgRnQ9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fZGVmYXVsdENvbG9ycz1TdCx0aGlzLl9hdHRyaWJ1dGVDb2xvcnM9QXR9Z2V0IGRlZmF1bHRDb2xvcnMoKXtyZXR1cm4gdGhpcy5fZGVmYXVsdENvbG9yc31nZXQgYXR0cmlidXRlQ29sb3JzKCl7cmV0dXJuIHRoaXMuX2F0dHJpYnV0ZUNvbG9yc31nZXRDb2xvckZyb21Db25maWcodCxlLG4scil7dmFyIGksbyxzLGEsdTtpZigiW29iamVjdCBPYmplY3RdIiE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSl0aHJvdyJDb25maWcgbXVzdCBiZSBPYmplY3QiO2lmKCJbb2JqZWN0IE9iamVjdF0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKXRocm93IlJlc3VsdCBtdXN0IGJlIE9iamVjdCI7Y29uc3R7Ym9yZGVyT3BhY2l0eTpjPTEsZmlsbE9wYWNpdHk6bD0uNixjb2xvckluZGV4Omg9MH09bjtyfHwocj17fSk7Y29uc3QgZj1udWxsPT0oaT1udWxsPT10P3ZvaWQgMDp0LnZhbGlkKXx8aSx7bXVsdGlDb2xvckluZGV4OnA9LTEsc2VsZWN0ZWQ6ZCxob3ZlcjpnfT1yLHk9e3NlbGVjdGVkOmQsaG92ZXI6Zyxib3JkZXJPcGFjaXR5OmMsZmlsbE9wYWNpdHk6bH07bGV0IG09dGhpcy5kZWZhdWx0Q29sb3JzO2lmKCghMD09PShudWxsPT1lP3ZvaWQgMDplLmF0dHJpYnV0ZUNvbmZpZ3VyYWJsZSl8fHA+LTEpJiYobT10aGlzLmF0dHJpYnV0ZUNvbG9ycyksITE9PT1mKXJldHVybiB2dC5nZXRUb29sU3Ryb2tlQW5kRmlsbChJdCx5KTtpZighMD09PShudWxsPT1lP3ZvaWQgMDplLmF0dHJpYnV0ZUNvbmZpZ3VyYWJsZSkpe2NvbnN0IG49dnQuZ2V0QXR0cmlidXRlSW5kZXgobnVsbD09dD92b2lkIDA6dC5hdHRyaWJ1dGUsbnVsbD09ZT92b2lkIDA6ZS5hdHRyaWJ1dGVMaXN0KTtsZXQgcj1udWxsPT0ocz1udWxsPT0obz1udWxsPT1lP3ZvaWQgMDplLmF0dHJpYnV0ZUxpc3QpP3ZvaWQgMDpvLmZpbmQoKGU9PmUudmFsdWU9PT0obnVsbD09dD92b2lkIDA6dC5hdHRyaWJ1dGUpKSkpP3ZvaWQgMDpzLmNvbG9yLGk9IiI7IXImJi0xIT09biYmKHI9bVtuJW0ubGVuZ3RoXSksLTE9PT1uJiYocj1NdCksaT12dC5yZ2JhU3RyaW5nVG9IZXgocikudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSk7Y29uc3QgYz1wYXJzZUludChpLDE2KSxsPW51bGwhPSh1PW51bGw9PShhPU50W24lbS5sZW5ndGhdKT92b2lkIDA6YS5oZXgpP3U6IiI7cmV0dXJuKCh0LGUpPT54dCh0LHd0KGUpKSkoKCh0LGUpPT57Zm9yKHZhciBuIGluIGV8fChlPXt9KSlEdC5jYWxsKGUsbikmJkN0KHQsbixlW25dKTtpZihidClmb3IodmFyIG4gb2YgYnQoZSkpRXQuY2FsbChlLG4pJiZDdCh0LG4sZVtuXSk7cmV0dXJuIHR9KSh7fSx2dC5nZXRUb29sU3Ryb2tlQW5kRmlsbChyLHkpKSx7aGV4OmN8fGx9KX1yZXR1cm4gcD4tMT92dC5nZXRUb29sU3Ryb2tlQW5kRmlsbChtW3AlbS5sZW5ndGhdLHkpOnZ0LmdldFRvb2xTdHJva2VBbmRGaWxsKG1baCVtLmxlbmd0aF0seSl9Z2V0Q29sb3JCeUNvbmZpZyh7YXR0cmlidXRlOnQsY29uZmlnOmUsc3R5bGU6bn0pe3ZhciByLGksbztpZighMD09PShudWxsPT1lP3ZvaWQgMDplLmF0dHJpYnV0ZUNvbmZpZ3VyYWJsZSkpe2NvbnN0IHM9bnVsbD09KGk9bnVsbD09KHI9bnVsbD09ZT92b2lkIDA6ZS5hdHRyaWJ1dGVMaXN0KT92b2lkIDA6ci5maW5kKChlPT5lLnZhbHVlPT09dCkpKT92b2lkIDA6aS5jb2xvcjtpZihzKXJldHVybiB2dC5nZXRUb29sQ29sb3JMaXN0KHMsbnVsbD09bj92b2lkIDA6bi5ib3JkZXJPcGFjaXR5LG51bGw9PW4/dm9pZCAwOm4uZmlsbE9wYWNpdHkpO2lmKG51bGw9PW4/dm9pZCAwOm4uYXR0cmlidXRlQ29sb3Ipe2NvbnN0IHI9dnQuZ2V0QXR0cmlidXRlSW5kZXgodCxudWxsIT0obz1udWxsPT1lP3ZvaWQgMDplLmF0dHJpYnV0ZUxpc3QpP286W10pJTgrMTtyZXR1cm4gbi5hdHRyaWJ1dGVDb2xvcltyXX19aWYobil7Y29uc3R7Y29sb3I6dCx0b29sQ29sb3I6ZX09bjtpZihlKXJldHVybiBlW3RdfXJldHVybiB2dC5nZXRUb29sQ29sb3JMaXN0KE10KX19LFR0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxPdD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLEx0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksUHQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxSdD0odCxlLG4pPT5lIGluIHQ/VHQodCxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpufSk6dFtlXT1uLEJ0PSh0LGUpPT57Zm9yKHZhciBuIGluIGV8fChlPXt9KSlMdC5jYWxsKGUsbikmJlJ0KHQsbixlW25dKTtpZihPdClmb3IodmFyIG4gb2YgT3QoZSkpUHQuY2FsbChlLG4pJiZSdCh0LG4sZVtuXSk7cmV0dXJuIHR9LGt0PSh0LGUpPT57dmFyIG49e307Zm9yKHZhciByIGluIHQpTHQuY2FsbCh0LHIpJiZlLmluZGV4T2Yocik8MCYmKG5bcl09dFtyXSk7aWYobnVsbCE9dCYmT3QpZm9yKHZhciByIG9mIE90KHQpKWUuaW5kZXhPZihyKTwwJiZQdC5jYWxsKHQscikmJihuW3JdPXRbcl0pO3JldHVybiBufTtjb25zdCB6dD0ic3RlcF8xIixqdD1jbGFzc3tzdGF0aWMgZ2VuQ29sb3JCeUNvb3JkKHQsZSxuKXtyZXR1cm4gbjw9MD9bMTI4LDEyOCwxMjhdOm48NT9bMjU1LDAsMF06bjwxMD9bMCwyNTUsMF06WzAsMCwyNTVdfXN0YXRpYyBnZXRTdGFuZGFyZENvbG9yQnlDb29yZCh0LGUsbil7cmV0dXJuIHRoaXMuZ2VuQ29sb3JCeUNvb3JkKHQsZSxuKS5tYXAoKHQ9PnQvMjU1KSl9c3RhdGljIHBhcnNlUG9pbnRDbG91ZEN1cnJlbnRSZXN1bHQodCl7dmFyIGUsbixyLGksbyxzLGEsdTtjb25zdCBjPXRoaXMuanNvblBhcnNlcih0KSxsPW51bGwhPShlPW51bGw9PWM/dm9pZCAwOmNbenRdKT9lOnt9LGg9bnVsbCE9KG49bnVsbD09bD92b2lkIDA6bC5yZXN1bHQpP246W10sZj1udWxsIT0oaT1udWxsIT0ocj1udWxsPT1sP3ZvaWQgMDpsLnJlc3VsdFBvbHlnb24pP3I6bnVsbD09bD92b2lkIDA6bC5yZW5kZXJQb2x5Z29uKT9pOltdLHA9bnVsbCE9KG89bnVsbD09bD92b2lkIDA6bC5yZXN1bHRMaW5lKT9vOltdLGQ9bnVsbCE9KHM9bnVsbD09bD92b2lkIDA6bC5yZXN1bHRQb2ludCk/czpbXSxnPW51bGwhPShhPW51bGw9PWw/dm9pZCAwOmwuc2VnbWVudGF0aW9uKT9hOltdLHk9bnVsbCE9KHU9bnVsbD09bD92b2lkIDA6bC5yZXN1bHRSZWN0KT91OltdO3JldHVybntib3hQYXJhbXNMaXN0OmguZmlsdGVyKCh0PT4hdGhpcy5oYXNFcnJvclZhbHVlT2JqKHQpKSkscG9seWdvbkxpc3Q6ZixsaW5lTGlzdDpwLHNwaGVyZVBhcmFtc0xpc3Q6ZCxzZWdtZW50YXRpb246ZyxyZWN0TGlzdDp5fX1zdGF0aWMgaGFzRXJyb3JWYWx1ZU9iaih0KXtmdW5jdGlvbiBlKHQpe3JldHVybiBudWxsPT10fHxOdW1iZXIuaXNOYU4odCl9cmV0dXJuIGZ1bmN0aW9uIHQobil7aWYoIm9iamVjdCIhPXR5cGVvZiBufHxudWxsPT09bilyZXR1cm4gZShuKTtmb3IoY29uc3QgciBpbiBuKXtjb25zdCBpPW5bcl07aWYoZShpKXx8Im9iamVjdCI9PXR5cGVvZiBpJiZ0KGkpKXJldHVybiEwfXJldHVybiExfSh0KX1zdGF0aWMgZ2V0Qm94UGFyYW1zRnJvbVJlc3VsdExpc3QodCl7Y29uc3R7Ym94UGFyYW1zTGlzdDplfT10aGlzLnBhcnNlUG9pbnRDbG91ZEN1cnJlbnRSZXN1bHQodCk7cmV0dXJuIGV9c3RhdGljIGdldFJlY3RQYXJhbXNGcm9tUmVzdWx0TGlzdCh0KXt2YXIgZSxuO2NvbnN0IHI9dGhpcy5qc29uUGFyc2VyKHQpO3JldHVybiBudWxsIT0obj1udWxsPT0oZT1udWxsPT1yP3ZvaWQgMDpyW3p0XSk/dm9pZCAwOmUucmVzdWx0UmVjdCk/bjpbXX1zdGF0aWMgZ2V0U3BoZXJlUGFyYW1zRnJvbVJlc3VsdExpc3QodCl7dmFyIGUsbjtjb25zdCByPXRoaXMuanNvblBhcnNlcih0KTtyZXR1cm4gbnVsbCE9KG49bnVsbD09KGU9bnVsbD09cj92b2lkIDA6clt6dF0pP3ZvaWQgMDplLnJlc3VsdFBvaW50KT9uOltdfXN0YXRpYyBnZXRTZWdtZW50RnJvbVJlc3VsdExpc3QodCl7dmFyIGUsbjtjb25zdCByPXRoaXMuanNvblBhcnNlcih0KTtyZXR1cm4gbnVsbCE9KG49bnVsbD09KGU9bnVsbD09cj92b2lkIDA6clt6dF0pP3ZvaWQgMDplLnNlZ21lbnRhdGlvbik/bjpbXX1zdGF0aWMgZ2V0TGluZUxpc3RGcm9tUmVzdWx0TGlzdCh0KXt2YXIgZSxuO2NvbnN0IHI9dGhpcy5qc29uUGFyc2VyKHQpO3JldHVybiBudWxsIT0obj1udWxsPT0oZT1udWxsPT1yP3ZvaWQgMDpyW3p0XSk/dm9pZCAwOmUucmVzdWx0TGluZSk/bjpbXX1zdGF0aWMgZ2V0UG9seWdvbkxpc3RGcm9tUmVzdWx0TGlzdCh0KXt2YXIgZSxuLHIsaTtjb25zdCBvPXRoaXMuanNvblBhcnNlcih0KTtyZXR1cm4gbnVsbCE9KGk9bnVsbCE9KHI9bnVsbD09KGU9bnVsbD09bz92b2lkIDA6b1t6dF0pP3ZvaWQgMDplLnJlc3VsdFBvbHlnb24pP3I6bnVsbD09KG49bnVsbD09bz92b2lkIDA6b1t6dF0pP3ZvaWQgMDpuLnJlbmRlclBvbHlnb24pP2k6W119c3RhdGljIGdldEZyb250Vmlld1BvbHlnb24odCl7Y29uc3R7Y2VudGVyOnt4OmUseTpuLHo6cn0sd2lkdGg6aSxoZWlnaHQ6byxkZXB0aDpzfT10O3JldHVyblt7eDplK2kvMix5Om4rby8yLHo6ci1zLzJ9LHt4OmUraS8yLHk6bitvLzIsejpyK3MvMn0se3g6ZStpLzIseTpuLW8vMix6OnIrcy8yfSx7eDplK2kvMix5Om4tby8yLHo6ci1zLzJ9LHt4OmUraS8yLHk6bitvLzIsejpyLXMvMn1dfXN0YXRpYyBnZXRCYWNrVmlld1BvbHlnb24odCl7Y29uc3R7Y2VudGVyOnt4OmUseTpuLHo6cn0sd2lkdGg6aSxoZWlnaHQ6byxkZXB0aDpzfT10O3JldHVyblt7eDplLWkvMix5Om4tby8yLHo6ci1zLzJ9LHt4OmUtaS8yLHk6bitvLzIsejpyLXMvMn0se3g6ZS1pLzIseTpuK28vMix6OnIrcy8yfSx7eDplLWkvMix5Om4tby8yLHo6citzLzJ9LHt4OmUtaS8yLHk6bi1vLzIsejpyLXMvMn1dfXN0YXRpYyBnZXRBbGxEaXJlY3Rpb25MaW5lKHQpe2NvbnN0e2NlbnRlcjp7eDplLHk6bix6OnJ9LHdpZHRoOmksaGVpZ2h0Om8sZGVwdGg6c309dDtyZXR1cm5bW3t4OmUraS8yLHk6bi1vLzIsejpyLXMvMn0se3g6ZS1pLzIseTpuLW8vMix6OnItcy8yfV0sW3t4OmUraS8yLHk6bitvLzIsejpyLXMvMn0se3g6ZS1pLzIseTpuK28vMix6OnItcy8yfV0sW3t4OmUraS8yLHk6bi1vLzIsejpyK3MvMn0se3g6ZS1pLzIseTpuLW8vMix6OnIrcy8yfV0sW3t4OmUraS8yLHk6bitvLzIsejpyK3MvMn0se3g6ZS1pLzIseTpuK28vMix6OnIrcy8yfV1dfXN0YXRpYyBnZXRBbGxWaWV3RGF0YSh0KXtyZXR1cm5be3R5cGU6InBvbHlnb24iLHBvaW50TGlzdDp0aGlzLmdldEZyb250Vmlld1BvbHlnb24odCl9LHt0eXBlOiJwb2x5Z29uIixwb2ludExpc3Q6dGhpcy5nZXRCYWNrVmlld1BvbHlnb24odCl9LC4uLnRoaXMuZ2V0QWxsRGlyZWN0aW9uTGluZSh0KS5tYXAoKHQ9Pih7dHlwZToibGluZSIscG9pbnRMaXN0OnR9KSkpXX1zdGF0aWMgdHJhbnNmZXJCb3gyS2l0dGkodCl7dmFyIGUsbixyO3JldHVybntoZWlnaHQ6bnVsbCE9KGU9dC5kZXB0aCk/ZTowLGxlbmd0aDpudWxsIT0obj10LndpZHRoKT9uOjAsd2lkdGg6bnVsbCE9KHI9dC5oZWlnaHQpP3I6MCxyb3RhdGlvbl95OnQucm90YXRpb24/dGhpcy50cmFuc2ZlclJvdGF0aW9uMktpdHRpUm90YXRpb25feSh0LnJvdGF0aW9uKTowfX1zdGF0aWMgcmVzdHJpY3RBbmdsZVJhbmdlKHQpe2NvbnN0IGU9MipNYXRoLlBJO2xldCBuPXQlZTtyZXR1cm4gbjwwP2UrbjpufXN0YXRpYyB0cmFuc2ZlclJvdGF0aW9uMktpdHRpUm90YXRpb25feSh0KXtpZih0PDApcmV0dXJuLXQ7Y29uc3QgZT0yKk1hdGguUEktdDtyZXR1cm4gZT5NYXRoLlBJJiZlPDIqTWF0aC5QST8tMSp0OjIqTWF0aC5QSS10fXN0YXRpYyBnZXRBbGxQb2ludENsb3VkUmVzdWx0KHtpbWdMaXN0OnQsc3RlcDplPTEsZXh0cmFCb3hMaXN0Om4sZXh0cmFTcGhlcmVMaXN0OnI9W10saWdub3JlSW5kZXhMaXN0Omk9W10saXNQcmVSZXN1bHQ6bz0hMX0pe2NvbnN0IHM9dC5maWx0ZXIoKCh0LGUpPT4hKG51bGw9PWk/dm9pZCAwOmkuaW5jbHVkZXMoZSkpKSkubWFwKCh0PT57dmFyIGU7cmV0dXJuIHRoaXMuanNvblBhcnNlcihudWxsIT0oZT1udWxsPT10P3ZvaWQgMDp0W28/InByZVJlc3VsdCI6InJlc3VsdCJdKT9lOiIiKX0pKSxhPWBzdGVwXyR7ZX1gO2xldCB1PVtdO3JldHVybiBzLmZvckVhY2goKHQ9Pnt2YXIgZSxuOyhudWxsPT0obj1udWxsPT0oZT1udWxsPT10P3ZvaWQgMDp0W2FdKT92b2lkIDA6ZS5yZXN1bHQpP3ZvaWQgMDpuLmxlbmd0aCk+MCYmKHU9dS5jb25jYXQodFthXS5yZXN1bHQpKX0pKSxuJiYodT11LmNvbmNhdChuKSksciYmKHU9dS5jb25jYXQocikpLHV9c3RhdGljIGdldEluZGV4QnlUcmFja0lEKHQsZSxuKXtjb25zdCByPVtdLGk9ZS5tYXAoKHQ9Pnt2YXIgZTtyZXR1cm4gdGhpcy5qc29uUGFyc2VyKG51bGwhPShlPW51bGw9PXQ/dm9pZCAwOnRbbj8icHJlUmVzdWx0IjoicmVzdWx0Il0pP2U6IiIpfSkpO3JldHVybiBpLmZvckVhY2goKChlLG4pPT57dmFyIGk7Y29uc3Qgbz1udWxsPT0oaT1udWxsPT1lP3ZvaWQgMDplLnN0ZXBfMSk/dm9pZCAwOmkucmVzdWx0OyhudWxsPT1vP3ZvaWQgMDpvLmxlbmd0aCk+MCYmKG51bGw9PW8/dm9pZCAwOm8uZmluZCgoZT0+KG51bGw9PWU/dm9pZCAwOmUudHJhY2tJRCk9PT10KSkpJiZyLnB1c2gobil9KSkscn1zdGF0aWMgZ2V0TmV4dFRyYWNrSUQoe2ltZ0xpc3Q6dCxzdGVwOmU9MSxleHRyYUJveExpc3Q6bixleHRyYVNwaGVyZUxpc3Q6cn0pe2xldCBpPTE7cmV0dXJuIHRoaXMuZ2V0QWxsUG9pbnRDbG91ZFJlc3VsdCh7aW1nTGlzdDp0LHN0ZXA6ZSxleHRyYUJveExpc3Q6bixleHRyYVNwaGVyZUxpc3Q6cn0pLmZvckVhY2goKHQ9PnsibnVtYmVyIj09dHlwZW9mKG51bGw9PXQ/dm9pZCAwOnQudHJhY2tJRCkmJnQudHJhY2tJRD49aSYmKGk9dC50cmFja0lEKzEpfSkpLGl9c3RhdGljIGJhdGNoVXBkYXRlVHJhY2tJRCh7aWQ6dCxuZXdJRDplLHJlc3VsdDpuLHN0ZXA6cj0xfSl7dmFyIGk7Y29uc3Qgbz1gc3RlcF8ke3J9YCxzPXRoaXMuanNvblBhcnNlcihuKSxhPW51bGw9PShpPW51bGw9PXM/dm9pZCAwOnNbb10pP3ZvaWQgMDppLnJlc3VsdDtyZXR1cm4gYT8oYS5mb3JFYWNoKChuPT4oKG51bGw9PW4/dm9pZCAwOm4udHJhY2tJRCk9PT10JiYobi50cmFja0lEPWUpLG4pKSksSlNPTi5zdHJpbmdpZnkocykpOm59c3RhdGljIGJhdGNoVXBkYXRlVHJhY2tJRENoZWNrKHtuZXdJRDp0LHJlc3VsdDplLHN0ZXA6bj0xfSl7dmFyIHI7Y29uc3QgaT1gc3RlcF8ke259YCxvPXRoaXMuanNvblBhcnNlcihlKSxzPW51bGw9PShyPW51bGw9PW8/dm9pZCAwOm9baV0pP3ZvaWQgMDpyLnJlc3VsdDtyZXR1cm4hIXMmJnMuc29tZSgoZT0+ZS50cmFja0lEPT09dCkpfXN0YXRpYyBiYXRjaFVwZGF0ZVJlc3VsdEJ5VHJhY2tJRCh7aWQ6dCxuZXdEYXRhOmUscmVzdWx0Om4sc3RlcDpyPTF9KXt2YXIgaTtjb25zdCBvPWBzdGVwXyR7cn1gLHM9dGhpcy5qc29uUGFyc2VyKG4pLGE9bnVsbD09KGk9bnVsbD09cz92b2lkIDA6c1tvXSk/dm9pZCAwOmkucmVzdWx0O3JldHVybiBhPyhzW29dLnJlc3VsdD1hLm1hcCgobj0+e2lmKChudWxsPT1uP3ZvaWQgMDpuLnRyYWNrSUQpPT09dCl7Y29uc3QgdD1CdCh7fSxlKSxyPXQuc3ViQXR0cmlidXRlO3JldHVybiByJiZuLnN1YkF0dHJpYnV0ZSYmT2JqZWN0LmFzc2lnbih0LHtzdWJBdHRyaWJ1dGU6QnQoQnQoe30sbi5zdWJBdHRyaWJ1dGUpLHIpfSksQnQoQnQoe30sbiksdCl9cmV0dXJuIG59KSksSlNPTi5zdHJpbmdpZnkocykpOm59c3RhdGljIGdldE1heFNpemVGcm9tQm94KHt0cmFja0lEOnQsaW1nTGlzdDplfSl7bGV0IG47cmV0dXJuIGUuZm9yRWFjaCgoZT0+e3ZhciByO2NvbnN0IGk9dGhpcy5qc29uUGFyc2VyKGUucmVzdWx0KSxvPW51bGw9PShyPW51bGw9PWk/dm9pZCAwOmlbenRdKT92b2lkIDA6ci5yZXN1bHQ7IW98fG8uZm9yRWFjaCgoZT0+e2lmKChudWxsPT1lP3ZvaWQgMDplLnRyYWNrSUQpPT09dCl7aWYoIW4pcmV0dXJuIHZvaWQobj17d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHQsZGVwdGg6ZS5kZXB0aH0pO2Uud2lkdGg+bi53aWR0aCYmKG4ud2lkdGg9ZS53aWR0aCksZS5oZWlnaHQ+bi5oZWlnaHQmJihuLmhlaWdodD1lLmhlaWdodCksZS5kZXB0aD5uLmRlcHRoJiYobi5kZXB0aD1lLmRlcHRoKX19KSl9KSksbn1zdGF0aWMgZ2V0U3ViQXR0cmlidXRlTmFtZSh0LGUpe2NvbnN0IG49ZS5pbnB1dExpc3Q7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHQpLm1hcCgoKFt0LGVdKT0+e3ZhciByO2NvbnN0IGk9bi5maW5kKChlPT5lLnZhbHVlPT09dCkpO2lmKGkpe2NvbnN0IHQ9bnVsbD09KHI9bnVsbD09aT92b2lkIDA6aS5zdWJTZWxlY3RlZCk/dm9pZCAwOnIuZmluZCgodD0+dC52YWx1ZT09PWUpKTtpZih0KXJldHVybntsYWJlbDppLmtleSx2YWx1ZTp0LmtleX19cmV0dXJue2xhYmVsOnQsdmFsdWU6ZX19KSl9c3RhdGljIGdldEludGVyc2VjdGlvbkJ5U2xvcGUodCl7Y29uc3R7cDE6ZSxsaW5lMTpuLHAyOnIsbGluZTI6aX09dDtpZihlLng9PT1yLngmJmUueT09PXIueSlyZXR1cm4gZTtsZXQgbyxzO25bMF0ueD09PW5bMV0ueCYmKG89ZS54KSxuWzBdLnk9PT1uWzFdLnkmJihzPWUueSksaVswXS54PT09aVsxXS54JiYobz1yLngpLGlbMF0ueT09PWlbMV0ueSYmKHM9ci55KTtjb25zdCBhPShuWzBdLnktblsxXS55KS8oblswXS54LW5bMV0ueCksdT0oaVswXS55LWlbMV0ueSkvKGlbMF0ueC1pWzFdLngpO3JldHVybiBvPW51bGwhPW8/bzooZS55LXIueS1hKmUueCt1KnIueCkvKHUtYSkscz1udWxsIT1zP3M6ZS55LWEqKGUueC1vKSx7eDpvLHk6c319c3RhdGljIGdldENsb3VkS2V5cyh0LGUsbil7cmV0dXJuW3QsZSxuXS5qb2luKCJAIil9c3RhdGljIHNwbGl0UG9pbnRzRnJvbUluZGV4ZXModCxlKXtjb25zdCBuPW5ldyBTZXQ7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz0xKW4uYWRkKGVbdF0pO2NvbnN0IHI9W107Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz0xKW4uaGFzKHRbZV0pfHxyLnB1c2godFtlXSk7cmV0dXJuIHJ9c3RhdGljIHNwbGl0UG9pbnRzRnJvbVBvaW50cyh0LGUpe2NvbnN0IG49bmV3IE1hcDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrPTMpbi5zZXQoanQuZ2V0Q2xvdWRLZXlzKGVbdF0sZVt0KzFdLGVbdCsyXSksMSk7Y29uc3Qgcj1bXTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrPTMpe2NvbnN0IGk9anQuZ2V0Q2xvdWRLZXlzKHRbZV0sdFtlKzFdLHRbZSsyXSk7bi5oYXMoaSl8fHIucHVzaCh0W2VdLHRbZSsxXSx0W2UrMl0pfXJldHVybiBuZXcgRmxvYXQzMkFycmF5KHIpfXN0YXRpYyBnZXREZWZhdWx0T3J0aG9ncmFwaGljUGFyYW1zKHQpe3JldHVybntsZWZ0Oi10LndpZHRoLzIscmlnaHQ6dC53aWR0aC8yLHRvcDp0LmhlaWdodC8yLGJvdHRvbTotdC5oZWlnaHQvMixuZWFyOi4xLGZhcjoxZTR9fX07bGV0IFV0PWp0O1V0Lmpzb25QYXJzZXI9dD0+e3RyeXtyZXR1cm4gSlNPTi5wYXJzZSh0KX1jYXRjaCh0KXtyZXR1cm57fX19LFV0LnRyYW5zZmVyQ2FudmFzMldvcmxkPSh0LGUpPT57Y29uc3R7d2lkdGg6bixoZWlnaHQ6cn09ZSxpPXQse3g6byx5OnN9PWksYT1rdChpLFsieCIsInkiXSk7cmV0dXJuIEJ0KHt4OnIvMi1zLHk6LShvLW4vMil9LGEpfSxVdC5wb2ludExpc3RUcmFuc2ZlckNhbnZhczJXb3JsZD0odCxlKT0+bnVsbD09dD92b2lkIDA6dC5tYXAoKHQ9PkJ0KEJ0KHt9LHQpLGp0LnRyYW5zZmVyQ2FudmFzMldvcmxkKHQsZSkpKSksVXQudHJhbnNmZXJXb3JsZDJDYW52YXM9KHQsZSk9Pntjb25zdHt3aWR0aDpuLGhlaWdodDpyfT1lLGk9dCx7eDpvLHk6c309aSxhPWt0KGksWyJ4IiwieSJdKTtyZXR1cm4gQnQoe3g6bi8yLXMseTpyLzItb30sYSl9O2NvbnN0IHF0PSh0LGUpPT5bLi4udCwuLi5lXTtjbGFzcyBWdHtzdGF0aWMgdHJhbnNmZXJNYXRyaXgzNEZyb21LaXR0aTJUaHJlZSh0KXtyZXR1cm5bLi4udC5yZWR1Y2UocXQsW10pLDAsMCwwLDFdfXN0YXRpYyB0cmFuc2Zlck1hdHJpeDMzRnJvbUtpdHRpMlRocmVlKHQpe3JldHVyblsuLi50LnJlZHVjZSgoKHQsZSk9PlsuLi50LC4uLmVdLmNvbmNhdChbMF0pKSxbXSksMCwwLDAsMV19fXZhciBHdCxZdCxYdCxXdCxIdCxadCxLdCxKdCxRdCwkdDsoWXQ9R3R8fChHdD17fSkpLkZyb250PSJGUk9OVCIsWXQuQmFjaz0iQkFDSyIsWXQuTGVmdD0iTEVGVCIsWXQuUmlnaHQ9IlJJR0hUIixZdC5Ub3A9IlRPUCIsWXQuTEZUPSJMRUZUX0ZST05UX1RPUCIsWXQuUkJUPSJSSUdIVF9CQUNLX1RPUCIsZnVuY3Rpb24odCl7dC5EZXRlY3Rpb249IkRldGVjdGlvbiIsdC5TZWdtZW50YXRpb249IlNlZ21lbnRhdGlvbiJ9KFh0fHwoWHQ9e30pKSxmdW5jdGlvbih0KXt0LkFkZD0iQUREIix0LlJlbW92ZT0iUkVNT1ZFIn0oV3R8fChXdD17fSkpLGZ1bmN0aW9uKHQpe3QuQ292ZXI9IkNvdmVyIix0LlVuY292ZXI9IlVuY292ZXIifShIdHx8KEh0PXt9KSksZnVuY3Rpb24odCl7dC5Gb2N1cz0iRm9jdXMiLHQuVW5mb2N1cz0iVW5mb2N1cyJ9KFp0fHwoWnQ9e30pKSxmdW5jdGlvbih0KXt0LlJlYWR5PSJSRUFEWSIsdC5DaGVjaz0iQ0hFQ0siLHQuRWRpdD0iRURJVCIsdC5Ib3Zlcj0iSE9WRVIifShLdHx8KEt0PXt9KSksZnVuY3Rpb24odCl7dFt0Lk5vcm1hbD0wXT0iTm9ybWFsIix0W3QuT21uaUNhbWVyYT0xXT0iT21uaUNhbWVyYSIsdFt0Lkthbm5hbGFCcmFuZHQ9Ml09Ikthbm5hbGFCcmFuZHQiLHRbdC5PbW5pQ2FtZXJhMTFWPTNdPSJPbW5pQ2FtZXJhMTFWIn0oSnR8fChKdD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5MaW5lPTBdPSJMaW5lIix0W3QuQ3VydmU9MV09IkN1cnZlIn0oUXR8fChRdD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5QZXJpb2Q9MF09IlBlcmlvZCIsdFt0LlRpbWU9MV09IlRpbWUifSgkdHx8KCR0PXt9KSk7dmFyIHRlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gZWUodCl7dmFyIGU9e2V4cG9ydHM6e319O3JldHVybiB0KGUsZS5leHBvcnRzKSxlLmV4cG9ydHN9ZWUoKGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKCl7dmFyIG4scj0iRXhwZWN0ZWQgYSBmdW5jdGlvbiIsaT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIsbz0iX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyIscz0xNixhPTMyLHU9NjQsYz0xMjgsbD0yNTYsaD0xLzAsZj05MDA3MTk5MjU0NzQwOTkxLHA9TmFOLGQ9NDI5NDk2NzI5NSxnPWQtMSx5PWQ+Pj4xLG09W1siYXJ5IixjXSxbImJpbmQiLDFdLFsiYmluZEtleSIsMl0sWyJjdXJyeSIsOF0sWyJjdXJyeVJpZ2h0IixzXSxbImZsaXAiLDUxMl0sWyJwYXJ0aWFsIixhXSxbInBhcnRpYWxSaWdodCIsdV0sWyJyZWFyZyIsbF1dLHY9IltvYmplY3QgQXJndW1lbnRzXSIsXz0iW29iamVjdCBBcnJheV0iLHg9IltvYmplY3QgQm9vbGVhbl0iLHc9IltvYmplY3QgRGF0ZV0iLGI9IltvYmplY3QgRXJyb3JdIixEPSJbb2JqZWN0IEZ1bmN0aW9uXSIsRT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLEM9IltvYmplY3QgTWFwXSIsUz0iW29iamVjdCBOdW1iZXJdIixBPSJbb2JqZWN0IE9iamVjdF0iLE49IltvYmplY3QgUHJvbWlzZV0iLEk9IltvYmplY3QgUmVnRXhwXSIsTT0iW29iamVjdCBTZXRdIixGPSJbb2JqZWN0IFN0cmluZ10iLFQ9IltvYmplY3QgU3ltYm9sXSIsTz0iW29iamVjdCBXZWFrTWFwXSIsTD0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLFA9IltvYmplY3QgRGF0YVZpZXddIixSPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLEI9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsaz0iW29iamVjdCBJbnQ4QXJyYXldIix6PSJbb2JqZWN0IEludDE2QXJyYXldIixqPSJbb2JqZWN0IEludDMyQXJyYXldIixVPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixxPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsVj0iW29iamVjdCBVaW50MTZBcnJheV0iLEc9IltvYmplY3QgVWludDMyQXJyYXldIixZPS9cYl9fcCBcKz0gJyc7L2csWD0vXGIoX19wIFwrPSkgJycgXCsvZyxXPS8oX19lXCguKj9cKXxcYl9fdFwpKSBcK1xuJyc7L2csSD0vJig/OmFtcHxsdHxndHxxdW90fCMzOSk7L2csWj0vWyY8PiInXS9nLEs9UmVnRXhwKEguc291cmNlKSxKPVJlZ0V4cChaLnNvdXJjZSksUT0vPCUtKFtcc1xTXSs/KSU+L2csJD0vPCUoW1xzXFNdKz8pJT4vZyx0dD0vPCU9KFtcc1xTXSs/KSU+L2csZXQ9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sbnQ9L15cdyokLyxydD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxpdD0vW1xcXiQuKis/KClbXF17fXxdL2csb3Q9UmVnRXhwKGl0LnNvdXJjZSksc3Q9L15ccysvLGF0PS9ccy8sdXQ9L1x7KD86XG5cL1wqIFxbd3JhcHBlZCB3aXRoIC4rXF0gXCpcLyk/XG4/LyxjdD0vXHtcblwvXCogXFt3cmFwcGVkIHdpdGggKC4rKVxdIFwqLyxsdD0vLD8gJiAvLGh0PS9bXlx4MDAtXHgyZlx4M2EtXHg0MFx4NWItXHg2MFx4N2ItXHg3Zl0rL2csZnQ9L1soKT0se31cW1xdXC9cc10vLHB0PS9cXChcXCk/L2csZHQ9L1wkXHsoW15cXH1dKig/OlxcLlteXFx9XSopKilcfS9nLGd0PS9cdyokLyx5dD0vXlstK10weFswLTlhLWZdKyQvaSxtdD0vXjBiWzAxXSskL2ksdnQ9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sX3Q9L14wb1swLTddKyQvaSx4dD0vXig/OjB8WzEtOV1cZCopJC8sd3Q9L1tceGMwLVx4ZDZceGQ4LVx4ZjZceGY4LVx4ZmZcdTAxMDAtXHUwMTdmXS9nLGJ0PS8oJF4pLyxEdD0vWydcblxyXHUyMDI4XHUyMDI5XFxdL2csRXQ9IlxcdWQ4MDAtXFx1ZGZmZiIsQ3Q9IlxcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZiIsU3Q9IlxcdTI3MDAtXFx1MjdiZiIsQXQ9ImEtelxceGRmLVxceGY2XFx4ZjgtXFx4ZmYiLE50PSJBLVpcXHhjMC1cXHhkNlxceGQ4LVxceGRlIixJdD0iXFx1ZmUwZVxcdWZlMGYiLE10PSJcXHhhY1xceGIxXFx4ZDdcXHhmN1xceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmXFx1MjAwMC1cXHUyMDZmIFxcdFxceDBiXFxmXFx4YTBcXHVmZWZmXFxuXFxyXFx1MjAyOFxcdTIwMjlcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwIixGdD0iWyfigJldIixUdD0iWyIrRXQrIl0iLE90PSJbIitNdCsiXSIsTHQ9IlsiK0N0KyJdIixQdD0iXFxkKyIsUnQ9IlsiK1N0KyJdIixCdD0iWyIrQXQrIl0iLGt0PSJbXiIrRXQrTXQrUHQrU3QrQXQrTnQrIl0iLHp0PSJcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0iLGp0PSJbXiIrRXQrIl0iLFV0PSIoPzpcXHVkODNjW1xcdWRkZTYtXFx1ZGRmZl0pezJ9IixxdD0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsVnQ9IlsiK050KyJdIixHdD0iXFx1MjAwZCIsWXQ9Iig/OiIrQnQrInwiK2t0KyIpIixYdD0iKD86IitWdCsifCIra3QrIikiLFd0PSIoPzpbJ+KAmV0oPzpkfGxsfG18cmV8c3x0fHZlKSk/IixIdD0iKD86WyfigJldKD86RHxMTHxNfFJFfFN8VHxWRSkpPyIsWnQ9Iig/OiIrTHQrInwiK3p0KyIpIisiPyIsS3Q9IlsiK0l0KyJdPyIsSnQ9S3QrWnQrKCIoPzoiK0d0KyIoPzoiK1tqdCxVdCxxdF0uam9pbigifCIpKyIpIitLdCtadCsiKSoiKSxRdD0iKD86IitbUnQsVXQscXRdLmpvaW4oInwiKSsiKSIrSnQsJHQ9Iig/OiIrW2p0K0x0KyI/IixMdCxVdCxxdCxUdF0uam9pbigifCIpKyIpIixlZT1SZWdFeHAoRnQsImciKSxuZT1SZWdFeHAoTHQsImciKSxyZT1SZWdFeHAoenQrIig/PSIrenQrIil8IiskdCtKdCwiZyIpLGllPVJlZ0V4cChbVnQrIj8iK0J0KyIrIitXdCsiKD89IitbT3QsVnQsIiQiXS5qb2luKCJ8IikrIikiLFh0KyIrIitIdCsiKD89IitbT3QsVnQrWXQsIiQiXS5qb2luKCJ8IikrIikiLFZ0KyI/IitZdCsiKyIrV3QsVnQrIisiK0h0LCJcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxkVEgpKD89XFxifFthLXpfXSkiLCJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD89XFxifFtBLVpfXSkiLFB0LFF0XS5qb2luKCJ8IiksImciKSxvZT1SZWdFeHAoIlsiK0d0K0V0K0N0K0l0KyJdIiksc2U9L1thLXpdW0EtWl18W0EtWl17Mn1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS8sYWU9WyJBcnJheSIsIkJ1ZmZlciIsIkRhdGFWaWV3IiwiRGF0ZSIsIkVycm9yIiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiRnVuY3Rpb24iLCJJbnQ4QXJyYXkiLCJJbnQxNkFycmF5IiwiSW50MzJBcnJheSIsIk1hcCIsIk1hdGgiLCJPYmplY3QiLCJQcm9taXNlIiwiUmVnRXhwIiwiU2V0IiwiU3RyaW5nIiwiU3ltYm9sIiwiVHlwZUVycm9yIiwiVWludDhBcnJheSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDE2QXJyYXkiLCJVaW50MzJBcnJheSIsIldlYWtNYXAiLCJfIiwiY2xlYXJUaW1lb3V0IiwiaXNGaW5pdGUiLCJwYXJzZUludCIsInNldFRpbWVvdXQiXSx1ZT0tMSxjZT17fTtjZVtSXT1jZVtCXT1jZVtrXT1jZVt6XT1jZVtqXT1jZVtVXT1jZVtxXT1jZVtWXT1jZVtHXT0hMCxjZVt2XT1jZVtfXT1jZVtMXT1jZVt4XT1jZVtQXT1jZVt3XT1jZVtiXT1jZVtEXT1jZVtDXT1jZVtTXT1jZVtBXT1jZVtJXT1jZVtNXT1jZVtGXT1jZVtPXT0hMTt2YXIgbGU9e307bGVbdl09bGVbX109bGVbTF09bGVbUF09bGVbeF09bGVbd109bGVbUl09bGVbQl09bGVba109bGVbel09bGVbal09bGVbQ109bGVbU109bGVbQV09bGVbSV09bGVbTV09bGVbRl09bGVbVF09bGVbVV09bGVbcV09bGVbVl09bGVbR109ITAsbGVbYl09bGVbRF09bGVbT109ITE7dmFyIGhlPXsiXFwiOiJcXCIsIiciOiInIiwiXG4iOiJuIiwiXHIiOiJyIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9LGZlPXBhcnNlRmxvYXQscGU9cGFyc2VJbnQsZGU9Im9iamVjdCI9PXR5cGVvZiB0ZSYmdGUmJnRlLk9iamVjdD09PU9iamVjdCYmdGUsZ2U9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZix5ZT1kZXx8Z2V8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksbWU9ZSYmIWUubm9kZVR5cGUmJmUsdmU9bWUmJnQmJiF0Lm5vZGVUeXBlJiZ0LF9lPXZlJiZ2ZS5leHBvcnRzPT09bWUseGU9X2UmJmRlLnByb2Nlc3Msd2U9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHZlJiZ2ZS5yZXF1aXJlJiZ2ZS5yZXF1aXJlKCJ1dGlsIikudHlwZXN8fHhlJiZ4ZS5iaW5kaW5nJiZ4ZS5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2godCl7fX0oKSxiZT13ZSYmd2UuaXNBcnJheUJ1ZmZlcixEZT13ZSYmd2UuaXNEYXRlLEVlPXdlJiZ3ZS5pc01hcCxDZT13ZSYmd2UuaXNSZWdFeHAsU2U9d2UmJndlLmlzU2V0LEFlPXdlJiZ3ZS5pc1R5cGVkQXJyYXk7ZnVuY3Rpb24gTmUodCxlLG4pe3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAwOnJldHVybiB0LmNhbGwoZSk7Y2FzZSAxOnJldHVybiB0LmNhbGwoZSxuWzBdKTtjYXNlIDI6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSk7Y2FzZSAzOnJldHVybiB0LmNhbGwoZSxuWzBdLG5bMV0sblsyXSl9cmV0dXJuIHQuYXBwbHkoZSxuKX1mdW5jdGlvbiBJZSh0LGUsbixyKXtmb3IodmFyIGk9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7KytpPG87KXt2YXIgcz10W2ldO2UocixzLG4ocyksdCl9cmV0dXJuIHJ9ZnVuY3Rpb24gTWUodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHImJiExIT09ZSh0W25dLG4sdCk7KTtyZXR1cm4gdH1mdW5jdGlvbiBGZSh0LGUpe2Zvcih2YXIgbj1udWxsPT10PzA6dC5sZW5ndGg7bi0tJiYhMSE9PWUodFtuXSxuLHQpOyk7cmV0dXJuIHR9ZnVuY3Rpb24gVGUodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHI7KWlmKCFlKHRbbl0sbix0KSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBPZSh0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPTAsbz1bXTsrK248cjspe3ZhciBzPXRbbl07ZShzLG4sdCkmJihvW2krK109cyl9cmV0dXJuIG99ZnVuY3Rpb24gTGUodCxlKXtyZXR1cm4hIShudWxsPT10PzA6dC5sZW5ndGgpJiZHZSh0LGUsMCk+LTF9ZnVuY3Rpb24gUGUodCxlLG4pe2Zvcih2YXIgcj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK3I8aTspaWYobihlLHRbcl0pKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIFJlKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoLGk9QXJyYXkocik7KytuPHI7KWlbbl09ZSh0W25dLG4sdCk7cmV0dXJuIGl9ZnVuY3Rpb24gQmUodCxlKXtmb3IodmFyIG49LTEscj1lLmxlbmd0aCxpPXQubGVuZ3RoOysrbjxyOyl0W2krbl09ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBrZSh0LGUsbixyKXt2YXIgaT0tMSxvPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IociYmbyYmKG49dFsrK2ldKTsrK2k8bzspbj1lKG4sdFtpXSxpLHQpO3JldHVybiBufWZ1bmN0aW9uIHplKHQsZSxuLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IociYmaSYmKG49dFstLWldKTtpLS07KW49ZShuLHRbaV0saSx0KTtyZXR1cm4gbn1mdW5jdGlvbiBqZSh0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248cjspaWYoZSh0W25dLG4sdCkpcmV0dXJuITA7cmV0dXJuITF9dmFyIFVlPUhlKCJsZW5ndGgiKTtmdW5jdGlvbiBxZSh0LGUsbil7dmFyIHI7cmV0dXJuIG4odCwoZnVuY3Rpb24odCxuLGkpe2lmKGUodCxuLGkpKXJldHVybiByPW4sITF9KSkscn1mdW5jdGlvbiBWZSh0LGUsbixyKXtmb3IodmFyIGk9dC5sZW5ndGgsbz1uKyhyPzE6LTEpO3I/by0tOisrbzxpOylpZihlKHRbb10sbyx0KSlyZXR1cm4gbztyZXR1cm4tMX1mdW5jdGlvbiBHZSh0LGUsbil7cmV0dXJuIGU9PWU/ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uLTEsaT10Lmxlbmd0aDsrK3I8aTspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9KHQsZSxuKTpWZSh0LFhlLG4pfWZ1bmN0aW9uIFllKHQsZSxuLHIpe2Zvcih2YXIgaT1uLTEsbz10Lmxlbmd0aDsrK2k8bzspaWYocih0W2ldLGUpKXJldHVybiBpO3JldHVybi0xfWZ1bmN0aW9uIFhlKHQpe3JldHVybiB0IT10fWZ1bmN0aW9uIFdlKHQsZSl7dmFyIG49bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBuP0plKHQsZSkvbjpwfWZ1bmN0aW9uIEhlKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9uOmVbdF19fWZ1bmN0aW9uIFplKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09dD9uOnRbZV19fWZ1bmN0aW9uIEtlKHQsZSxuLHIsaSl7cmV0dXJuIGkodCwoZnVuY3Rpb24odCxpLG8pe249cj8ocj0hMSx0KTplKG4sdCxpLG8pfSkpLG59ZnVuY3Rpb24gSmUodCxlKXtmb3IodmFyIHIsaT0tMSxvPXQubGVuZ3RoOysraTxvOyl7dmFyIHM9ZSh0W2ldKTtzIT09biYmKHI9cj09PW4/czpyK3MpfXJldHVybiByfWZ1bmN0aW9uIFFlKHQsZSl7Zm9yKHZhciBuPS0xLHI9QXJyYXkodCk7KytuPHQ7KXJbbl09ZShuKTtyZXR1cm4gcn1mdW5jdGlvbiAkZSh0KXtyZXR1cm4gdCYmdC5zbGljZSgwLHluKHQpKzEpLnJlcGxhY2Uoc3QsIiIpfWZ1bmN0aW9uIHRuKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKX19ZnVuY3Rpb24gZW4odCxlKXtyZXR1cm4gUmUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSl9ZnVuY3Rpb24gbm4odCxlKXtyZXR1cm4gdC5oYXMoZSl9ZnVuY3Rpb24gcm4odCxlKXtmb3IodmFyIG49LTEscj10Lmxlbmd0aDsrK248ciYmR2UoZSx0W25dLDApPi0xOyk7cmV0dXJuIG59ZnVuY3Rpb24gb24odCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tJiZHZShlLHRbbl0sMCk+LTE7KTtyZXR1cm4gbn12YXIgc249WmUoeyLDgCI6IkEiLCLDgSI6IkEiLCLDgiI6IkEiLCLDgyI6IkEiLCLDhCI6IkEiLCLDhSI6IkEiLCLDoCI6ImEiLCLDoSI6ImEiLCLDoiI6ImEiLCLDoyI6ImEiLCLDpCI6ImEiLCLDpSI6ImEiLCLDhyI6IkMiLCLDpyI6ImMiLCLDkCI6IkQiLCLDsCI6ImQiLCLDiCI6IkUiLCLDiSI6IkUiLCLDiiI6IkUiLCLDiyI6IkUiLCLDqCI6ImUiLCLDqSI6ImUiLCLDqiI6ImUiLCLDqyI6ImUiLCLDjCI6IkkiLCLDjSI6IkkiLCLDjiI6IkkiLCLDjyI6IkkiLCLDrCI6ImkiLCLDrSI6ImkiLCLDriI6ImkiLCLDryI6ImkiLCLDkSI6Ik4iLCLDsSI6Im4iLCLDkiI6Ik8iLCLDkyI6Ik8iLCLDlCI6Ik8iLCLDlSI6Ik8iLCLDliI6Ik8iLCLDmCI6Ik8iLCLDsiI6Im8iLCLDsyI6Im8iLCLDtCI6Im8iLCLDtSI6Im8iLCLDtiI6Im8iLCLDuCI6Im8iLCLDmSI6IlUiLCLDmiI6IlUiLCLDmyI6IlUiLCLDnCI6IlUiLCLDuSI6InUiLCLDuiI6InUiLCLDuyI6InUiLCLDvCI6InUiLCLDnSI6IlkiLCLDvSI6InkiLCLDvyI6InkiLCLDhiI6IkFlIiwiw6YiOiJhZSIsIsOeIjoiVGgiLCLDviI6InRoIiwiw58iOiJzcyIsIsSAIjoiQSIsIsSCIjoiQSIsIsSEIjoiQSIsIsSBIjoiYSIsIsSDIjoiYSIsIsSFIjoiYSIsIsSGIjoiQyIsIsSIIjoiQyIsIsSKIjoiQyIsIsSMIjoiQyIsIsSHIjoiYyIsIsSJIjoiYyIsIsSLIjoiYyIsIsSNIjoiYyIsIsSOIjoiRCIsIsSQIjoiRCIsIsSPIjoiZCIsIsSRIjoiZCIsIsSSIjoiRSIsIsSUIjoiRSIsIsSWIjoiRSIsIsSYIjoiRSIsIsSaIjoiRSIsIsSTIjoiZSIsIsSVIjoiZSIsIsSXIjoiZSIsIsSZIjoiZSIsIsSbIjoiZSIsIsScIjoiRyIsIsSeIjoiRyIsIsSgIjoiRyIsIsSiIjoiRyIsIsSdIjoiZyIsIsSfIjoiZyIsIsShIjoiZyIsIsSjIjoiZyIsIsSkIjoiSCIsIsSmIjoiSCIsIsSlIjoiaCIsIsSnIjoiaCIsIsSoIjoiSSIsIsSqIjoiSSIsIsSsIjoiSSIsIsSuIjoiSSIsIsSwIjoiSSIsIsSpIjoiaSIsIsSrIjoiaSIsIsStIjoiaSIsIsSvIjoiaSIsIsSxIjoiaSIsIsS0IjoiSiIsIsS1IjoiaiIsIsS2IjoiSyIsIsS3IjoiayIsIsS4IjoiayIsIsS5IjoiTCIsIsS7IjoiTCIsIsS9IjoiTCIsIsS/IjoiTCIsIsWBIjoiTCIsIsS6IjoibCIsIsS8IjoibCIsIsS+IjoibCIsIsWAIjoibCIsIsWCIjoibCIsIsWDIjoiTiIsIsWFIjoiTiIsIsWHIjoiTiIsIsWKIjoiTiIsIsWEIjoibiIsIsWGIjoibiIsIsWIIjoibiIsIsWLIjoibiIsIsWMIjoiTyIsIsWOIjoiTyIsIsWQIjoiTyIsIsWNIjoibyIsIsWPIjoibyIsIsWRIjoibyIsIsWUIjoiUiIsIsWWIjoiUiIsIsWYIjoiUiIsIsWVIjoiciIsIsWXIjoiciIsIsWZIjoiciIsIsWaIjoiUyIsIsWcIjoiUyIsIsWeIjoiUyIsIsWgIjoiUyIsIsWbIjoicyIsIsWdIjoicyIsIsWfIjoicyIsIsWhIjoicyIsIsWiIjoiVCIsIsWkIjoiVCIsIsWmIjoiVCIsIsWjIjoidCIsIsWlIjoidCIsIsWnIjoidCIsIsWoIjoiVSIsIsWqIjoiVSIsIsWsIjoiVSIsIsWuIjoiVSIsIsWwIjoiVSIsIsWyIjoiVSIsIsWpIjoidSIsIsWrIjoidSIsIsWtIjoidSIsIsWvIjoidSIsIsWxIjoidSIsIsWzIjoidSIsIsW0IjoiVyIsIsW1IjoidyIsIsW2IjoiWSIsIsW3IjoieSIsIsW4IjoiWSIsIsW5IjoiWiIsIsW7IjoiWiIsIsW9IjoiWiIsIsW6IjoieiIsIsW8IjoieiIsIsW+IjoieiIsIsSyIjoiSUoiLCLEsyI6ImlqIiwixZIiOiJPZSIsIsWTIjoib2UiLCLFiSI6IiduIiwixb8iOiJzIn0pLGFuPVplKHsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsiLCInIjoiJiMzOTsifSk7ZnVuY3Rpb24gdW4odCl7cmV0dXJuIlxcIitoZVt0XX1mdW5jdGlvbiBjbih0KXtyZXR1cm4gb2UudGVzdCh0KX1mdW5jdGlvbiBsbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXtuWysrZV09W3IsdF19KSksbn1mdW5jdGlvbiBobih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19ZnVuY3Rpb24gZm4odCxlKXtmb3IodmFyIG49LTEscj10Lmxlbmd0aCxpPTAscz1bXTsrK248cjspe3ZhciBhPXRbbl07KGE9PT1lfHxhPT09bykmJih0W25dPW8sc1tpKytdPW4pfXJldHVybiBzfWZ1bmN0aW9uIHBuKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtuWysrZV09dH0pKSxufWZ1bmN0aW9uIGRuKHQpe3JldHVybiBjbih0KT9mdW5jdGlvbih0KXtmb3IodmFyIGU9cmUubGFzdEluZGV4PTA7cmUudGVzdCh0KTspKytlO3JldHVybiBlfSh0KTpVZSh0KX1mdW5jdGlvbiBnbih0KXtyZXR1cm4gY24odCk/ZnVuY3Rpb24odCl7cmV0dXJuIHQubWF0Y2gocmUpfHxbXX0odCk6ZnVuY3Rpb24odCl7cmV0dXJuIHQuc3BsaXQoIiIpfSh0KX1mdW5jdGlvbiB5bih0KXtmb3IodmFyIGU9dC5sZW5ndGg7ZS0tJiZhdC50ZXN0KHQuY2hhckF0KGUpKTspO3JldHVybiBlfXZhciBtbj1aZSh7IiZhbXA7IjoiJiIsIiZsdDsiOiI8IiwiJmd0OyI6Ij4iLCImcXVvdDsiOiciJywiJiMzOTsiOiInIn0pO3ZhciB2bj1mdW5jdGlvbiB0KGUpe3ZhciBhdCxFdD0oZT1udWxsPT1lP3llOnZuLmRlZmF1bHRzKHllLk9iamVjdCgpLGUsdm4ucGljayh5ZSxhZSkpKS5BcnJheSxDdD1lLkRhdGUsU3Q9ZS5FcnJvcixBdD1lLkZ1bmN0aW9uLE50PWUuTWF0aCxJdD1lLk9iamVjdCxNdD1lLlJlZ0V4cCxGdD1lLlN0cmluZyxUdD1lLlR5cGVFcnJvcixPdD1FdC5wcm90b3R5cGUsTHQ9QXQucHJvdG90eXBlLFB0PUl0LnByb3RvdHlwZSxSdD1lWyJfX2NvcmUtanNfc2hhcmVkX18iXSxCdD1MdC50b1N0cmluZyxrdD1QdC5oYXNPd25Qcm9wZXJ0eSx6dD0wLGp0PShhdD0vW14uXSskLy5leGVjKFJ0JiZSdC5rZXlzJiZSdC5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrYXQ6IiIsVXQ9UHQudG9TdHJpbmcscXQ9QnQuY2FsbChJdCksVnQ9eWUuXyxHdD1NdCgiXiIrQnQuY2FsbChrdCkucmVwbGFjZShpdCwiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKSxZdD1fZT9lLkJ1ZmZlcjpuLFh0PWUuU3ltYm9sLFd0PWUuVWludDhBcnJheSxIdD1ZdD9ZdC5hbGxvY1Vuc2FmZTpuLFp0PWhuKEl0LmdldFByb3RvdHlwZU9mLEl0KSxLdD1JdC5jcmVhdGUsSnQ9UHQucHJvcGVydHlJc0VudW1lcmFibGUsUXQ9T3Quc3BsaWNlLCR0PVh0P1h0LmlzQ29uY2F0U3ByZWFkYWJsZTpuLHRlPVh0P1h0Lml0ZXJhdG9yOm4scmU9WHQ/WHQudG9TdHJpbmdUYWc6bixvZT1mdW5jdGlvbigpe3RyeXt2YXIgdD1wbyhJdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaCh0KXt9fSgpLGhlPWUuY2xlYXJUaW1lb3V0IT09eWUuY2xlYXJUaW1lb3V0JiZlLmNsZWFyVGltZW91dCxkZT1DdCYmQ3Qubm93IT09eWUuRGF0ZS5ub3cmJkN0Lm5vdyxnZT1lLnNldFRpbWVvdXQhPT15ZS5zZXRUaW1lb3V0JiZlLnNldFRpbWVvdXQsbWU9TnQuY2VpbCx2ZT1OdC5mbG9vcix4ZT1JdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsd2U9WXQ/WXQuaXNCdWZmZXI6bixVZT1lLmlzRmluaXRlLFplPU90LmpvaW4sX249aG4oSXQua2V5cyxJdCkseG49TnQubWF4LHduPU50Lm1pbixibj1DdC5ub3csRG49ZS5wYXJzZUludCxFbj1OdC5yYW5kb20sQ249T3QucmV2ZXJzZSxTbj1wbyhlLCJEYXRhVmlldyIpLEFuPXBvKGUsIk1hcCIpLE5uPXBvKGUsIlByb21pc2UiKSxJbj1wbyhlLCJTZXQiKSxNbj1wbyhlLCJXZWFrTWFwIiksRm49cG8oSXQsImNyZWF0ZSIpLFRuPU1uJiZuZXcgTW4sT249e30sTG49am8oU24pLFBuPWpvKEFuKSxSbj1qbyhObiksQm49am8oSW4pLGtuPWpvKE1uKSx6bj1YdD9YdC5wcm90b3R5cGU6bixqbj16bj96bi52YWx1ZU9mOm4sVW49em4/em4udG9TdHJpbmc6bjtmdW5jdGlvbiBxbih0KXtpZihyYSh0KSYmIVhzKHQpJiYhKHQgaW5zdGFuY2VvZiBYbikpe2lmKHQgaW5zdGFuY2VvZiBZbilyZXR1cm4gdDtpZihrdC5jYWxsKHQsIl9fd3JhcHBlZF9fIikpcmV0dXJuIFVvKHQpfXJldHVybiBuZXcgWW4odCl9dmFyIFZuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gZnVuY3Rpb24oZSl7aWYoIW5hKGUpKXJldHVybnt9O2lmKEt0KXJldHVybiBLdChlKTt0LnByb3RvdHlwZT1lO3ZhciByPW5ldyB0O3JldHVybiB0LnByb3RvdHlwZT1uLHJ9fSgpO2Z1bmN0aW9uIEduKCl7fWZ1bmN0aW9uIFluKHQsZSl7dGhpcy5fX3dyYXBwZWRfXz10LHRoaXMuX19hY3Rpb25zX189W10sdGhpcy5fX2NoYWluX189ISFlLHRoaXMuX19pbmRleF9fPTAsdGhpcy5fX3ZhbHVlc19fPW59ZnVuY3Rpb24gWG4odCl7dGhpcy5fX3dyYXBwZWRfXz10LHRoaXMuX19hY3Rpb25zX189W10sdGhpcy5fX2Rpcl9fPTEsdGhpcy5fX2ZpbHRlcmVkX189ITEsdGhpcy5fX2l0ZXJhdGVlc19fPVtdLHRoaXMuX190YWtlQ291bnRfXz1kLHRoaXMuX192aWV3c19fPVtdfWZ1bmN0aW9uIFduKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWZ1bmN0aW9uIEhuKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWZ1bmN0aW9uIFpuKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWZ1bmN0aW9uIEtuKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBabjsrK2U8bjspdGhpcy5hZGQodFtlXSl9ZnVuY3Rpb24gSm4odCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgSG4odCk7dGhpcy5zaXplPWUuc2l6ZX1mdW5jdGlvbiBRbih0LGUpe3ZhciBuPVhzKHQpLHI9IW4mJllzKHQpLGk9IW4mJiFyJiZLcyh0KSxvPSFuJiYhciYmIWkmJmhhKHQpLHM9bnx8cnx8aXx8byxhPXM/UWUodC5sZW5ndGgsRnQpOltdLHU9YS5sZW5ndGg7Zm9yKHZhciBjIGluIHQpKGV8fGt0LmNhbGwodCxjKSkmJighc3x8ISgibGVuZ3RoIj09Y3x8aSYmKCJvZmZzZXQiPT1jfHwicGFyZW50Ij09Yyl8fG8mJigiYnVmZmVyIj09Y3x8ImJ5dGVMZW5ndGgiPT1jfHwiYnl0ZU9mZnNldCI9PWMpfHx3byhjLHUpKSkmJmEucHVzaChjKTtyZXR1cm4gYX1mdW5jdGlvbiAkbih0KXt2YXIgZT10Lmxlbmd0aDtyZXR1cm4gZT90W0tyKDAsZS0xKV06bn1mdW5jdGlvbiB0cih0LGUpe3JldHVybiBCbyhGaSh0KSxjcihlLDAsdC5sZW5ndGgpKX1mdW5jdGlvbiBlcih0KXtyZXR1cm4gQm8oRmkodCkpfWZ1bmN0aW9uIG5yKHQsZSxyKXsociE9PW4mJiFxcyh0W2VdLHIpfHxyPT09biYmIShlIGluIHQpKSYmYXIodCxlLHIpfWZ1bmN0aW9uIHJyKHQsZSxyKXt2YXIgaT10W2VdOygha3QuY2FsbCh0LGUpfHwhcXMoaSxyKXx8cj09PW4mJiEoZSBpbiB0KSkmJmFyKHQsZSxyKX1mdW5jdGlvbiBpcih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKHFzKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gb3IodCxlLG4scil7cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQsaSxvKXtlKHIsdCxuKHQpLG8pfSkpLHJ9ZnVuY3Rpb24gc3IodCxlKXtyZXR1cm4gdCYmVGkoZSxPYShlKSx0KX1mdW5jdGlvbiBhcih0LGUsbil7Il9fcHJvdG9fXyI9PWUmJm9lP29lKHQsZSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH0pOnRbZV09bn1mdW5jdGlvbiB1cih0LGUpe2Zvcih2YXIgcj0tMSxpPWUubGVuZ3RoLG89RXQoaSkscz1udWxsPT10OysrcjxpOylvW3JdPXM/bjpOYSh0LGVbcl0pO3JldHVybiBvfWZ1bmN0aW9uIGNyKHQsZSxyKXtyZXR1cm4gdD09dCYmKHIhPT1uJiYodD10PD1yP3Q6ciksZSE9PW4mJih0PXQ+PWU/dDplKSksdH1mdW5jdGlvbiBscih0LGUscixpLG8scyl7dmFyIGEsdT0xJmUsYz0yJmUsbD00JmU7aWYociYmKGE9bz9yKHQsaSxvLHMpOnIodCkpLGEhPT1uKXJldHVybiBhO2lmKCFuYSh0KSlyZXR1cm4gdDt2YXIgaD1Ycyh0KTtpZihoKXtpZihhPWZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoLG49bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIGUmJiJzdHJpbmciPT10eXBlb2YgdFswXSYma3QuY2FsbCh0LCJpbmRleCIpJiYobi5pbmRleD10LmluZGV4LG4uaW5wdXQ9dC5pbnB1dCksbn0odCksIXUpcmV0dXJuIEZpKHQsYSl9ZWxzZXt2YXIgZj1tbyh0KSxwPWY9PUR8fGY9PUU7aWYoS3ModCkpcmV0dXJuIENpKHQsdSk7aWYoZj09QXx8Zj09dnx8cCYmIW8pe2lmKGE9Y3x8cD97fTpfbyh0KSwhdSlyZXR1cm4gYz9mdW5jdGlvbih0LGUpe3JldHVybiBUaSh0LHlvKHQpLGUpfSh0LGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJlRpKGUsTGEoZSksdCl9KGEsdCkpOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFRpKHQsZ28odCksZSl9KHQsc3IoYSx0KSl9ZWxzZXtpZighbGVbZl0pcmV0dXJuIG8/dDp7fTthPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmNvbnN0cnVjdG9yO3N3aXRjaChlKXtjYXNlIEw6cmV0dXJuIFNpKHQpO2Nhc2UgeDpjYXNlIHc6cmV0dXJuIG5ldyByKCt0KTtjYXNlIFA6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49ZT9TaSh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKG4sdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCl9KHQsbik7Y2FzZSBSOmNhc2UgQjpjYXNlIGs6Y2FzZSB6OmNhc2UgajpjYXNlIFU6Y2FzZSBxOmNhc2UgVjpjYXNlIEc6cmV0dXJuIEFpKHQsbik7Y2FzZSBDOnJldHVybiBuZXcgcjtjYXNlIFM6Y2FzZSBGOnJldHVybiBuZXcgcih0KTtjYXNlIEk6cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuc291cmNlLGd0LmV4ZWModCkpO3JldHVybiBlLmxhc3RJbmRleD10Lmxhc3RJbmRleCxlfSh0KTtjYXNlIE06cmV0dXJuIG5ldyByO2Nhc2UgVDpyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGpuP0l0KGpuLmNhbGwodCkpOnt9fSh0KX19KHQsZix1KX19c3x8KHM9bmV3IEpuKTt2YXIgZD1zLmdldCh0KTtpZihkKXJldHVybiBkO3Muc2V0KHQsYSksdWEodCk/dC5mb3JFYWNoKChmdW5jdGlvbihuKXthLmFkZChscihuLGUscixuLHQscykpfSkpOmlhKHQpJiZ0LmZvckVhY2goKGZ1bmN0aW9uKG4saSl7YS5zZXQoaSxscihuLGUscixpLHQscykpfSkpO3ZhciBnPWg/bjoobD9jP3NvOm9vOmM/TGE6T2EpKHQpO3JldHVybiBNZShnfHx0LChmdW5jdGlvbihuLGkpe2cmJihuPXRbaT1uXSkscnIoYSxpLGxyKG4sZSxyLGksdCxzKSl9KSksYX1mdW5jdGlvbiBocih0LGUscil7dmFyIGk9ci5sZW5ndGg7aWYobnVsbD09dClyZXR1cm4haTtmb3IodD1JdCh0KTtpLS07KXt2YXIgbz1yW2ldLHM9ZVtvXSxhPXRbb107aWYoYT09PW4mJiEobyBpbiB0KXx8IXMoYSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gZnIodCxlLGkpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtyZXR1cm4gT28oKGZ1bmN0aW9uKCl7dC5hcHBseShuLGkpfSksZSl9ZnVuY3Rpb24gcHIodCxlLG4scil7dmFyIGk9LTEsbz1MZSxzPSEwLGE9dC5sZW5ndGgsdT1bXSxjPWUubGVuZ3RoO2lmKCFhKXJldHVybiB1O24mJihlPVJlKGUsdG4obikpKSxyPyhvPVBlLHM9ITEpOmUubGVuZ3RoPj0yMDAmJihvPW5uLHM9ITEsZT1uZXcgS24oZSkpO3Q6Zm9yKDsrK2k8YTspe3ZhciBsPXRbaV0saD1udWxsPT1uP2w6bihsKTtpZihsPXJ8fDAhPT1sP2w6MCxzJiZoPT1oKXtmb3IodmFyIGY9YztmLS07KWlmKGVbZl09PT1oKWNvbnRpbnVlIHQ7dS5wdXNoKGwpfWVsc2UgbyhlLGgscil8fHUucHVzaChsKX1yZXR1cm4gdX1xbi50ZW1wbGF0ZVNldHRpbmdzPXtlc2NhcGU6USxldmFsdWF0ZTokLGludGVycG9sYXRlOnR0LHZhcmlhYmxlOiIiLGltcG9ydHM6e186cW59fSxxbi5wcm90b3R5cGU9R24ucHJvdG90eXBlLHFuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1xbixZbi5wcm90b3R5cGU9Vm4oR24ucHJvdG90eXBlKSxZbi5wcm90b3R5cGUuY29uc3RydWN0b3I9WW4sWG4ucHJvdG90eXBlPVZuKEduLnByb3RvdHlwZSksWG4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPVhuLFduLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189Rm4/Rm4obnVsbCk6e30sdGhpcy5zaXplPTB9LFduLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LFduLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihGbil7dmFyIHI9ZVt0XTtyZXR1cm4gcj09PWk/bjpyfXJldHVybiBrdC5jYWxsKGUsdCk/ZVt0XTpufSxXbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIEZuP2VbdF0hPT1uOmt0LmNhbGwoZSx0KX0sV24ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLHJbdF09Rm4mJmU9PT1uP2k6ZSx0aGlzfSxIbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfSxIbi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1pcihlLHQpO3JldHVybiEobjwwKSYmKG49PWUubGVuZ3RoLTE/ZS5wb3AoKTpRdC5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMCl9LEhuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPWlyKGUsdCk7cmV0dXJuIHI8MD9uOmVbcl1bMV19LEhuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIGlyKHRoaXMuX19kYXRhX18sdCk+LTF9LEhuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fLHI9aXIobix0KTtyZXR1cm4gcjwwPygrK3RoaXMuc2l6ZSxuLnB1c2goW3QsZV0pKTpuW3JdWzFdPWUsdGhpc30sWm4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgV24sbWFwOm5ldyhBbnx8SG4pLHN0cmluZzpuZXcgV259fSxabi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPWhvKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LFpuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGhvKHRoaXMsdCkuZ2V0KHQpfSxabi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiBobyh0aGlzLHQpLmhhcyh0KX0sWm4ucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPWhvKHRoaXMsdCkscj1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PXI/MDoxLHRoaXN9LEtuLnByb3RvdHlwZS5hZGQ9S24ucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsaSksdGhpc30sS24ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9LEpuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189bmV3IEhuLHRoaXMuc2l6ZT0wfSxKbi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxufSxKbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX0sSm4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9LEpuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBIbil7dmFyIHI9bi5fX2RhdGFfXztpZighQW58fHIubGVuZ3RoPDE5OSlyZXR1cm4gci5wdXNoKFt0LGVdKSx0aGlzLnNpemU9KytuLnNpemUsdGhpcztuPXRoaXMuX19kYXRhX189bmV3IFpuKHIpfXJldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZT1uLnNpemUsdGhpc307dmFyIGRyPVBpKGJyKSxncj1QaShEciwhMCk7ZnVuY3Rpb24geXIodCxlKXt2YXIgbj0hMDtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxyLGkpe3JldHVybiBuPSEhZSh0LHIsaSl9KSksbn1mdW5jdGlvbiBtcih0LGUscil7Zm9yKHZhciBpPS0xLG89dC5sZW5ndGg7KytpPG87KXt2YXIgcz10W2ldLGE9ZShzKTtpZihudWxsIT1hJiYodT09PW4/YT09YSYmIWxhKGEpOnIoYSx1KSkpdmFyIHU9YSxjPXN9cmV0dXJuIGN9ZnVuY3Rpb24gdnIodCxlKXt2YXIgbj1bXTtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxyLGkpe2UodCxyLGkpJiZuLnB1c2godCl9KSksbn1mdW5jdGlvbiBfcih0LGUsbixyLGkpe3ZhciBvPS0xLHM9dC5sZW5ndGg7Zm9yKG58fChuPXhvKSxpfHwoaT1bXSk7KytvPHM7KXt2YXIgYT10W29dO2U+MCYmbihhKT9lPjE/X3IoYSxlLTEsbixyLGkpOkJlKGksYSk6cnx8KGlbaS5sZW5ndGhdPWEpfXJldHVybiBpfXZhciB4cj1SaSgpLHdyPVJpKCEwKTtmdW5jdGlvbiBicih0LGUpe3JldHVybiB0JiZ4cih0LGUsT2EpfWZ1bmN0aW9uIERyKHQsZSl7cmV0dXJuIHQmJndyKHQsZSxPYSl9ZnVuY3Rpb24gRXIodCxlKXtyZXR1cm4gT2UoZSwoZnVuY3Rpb24oZSl7cmV0dXJuICRzKHRbZV0pfSkpfWZ1bmN0aW9uIENyKHQsZSl7Zm9yKHZhciByPTAsaT0oZT13aShlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxpOyl0PXRbem8oZVtyKytdKV07cmV0dXJuIHImJnI9PWk/dDpufWZ1bmN0aW9uIFNyKHQsZSxuKXt2YXIgcj1lKHQpO3JldHVybiBYcyh0KT9yOkJlKHIsbih0KSl9ZnVuY3Rpb24gQXIodCl7cmV0dXJuIG51bGw9PXQ/dD09PW4/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOnJlJiZyZSBpbiBJdCh0KT9mdW5jdGlvbih0KXt2YXIgZT1rdC5jYWxsKHQscmUpLHI9dFtyZV07dHJ5e3RbcmVdPW47dmFyIGk9ITB9Y2F0Y2godCl7fXZhciBvPVV0LmNhbGwodCk7cmV0dXJuIGkmJihlP3RbcmVdPXI6ZGVsZXRlIHRbcmVdKSxvfSh0KTpmdW5jdGlvbih0KXtyZXR1cm4gVXQuY2FsbCh0KX0odCl9ZnVuY3Rpb24gTnIodCxlKXtyZXR1cm4gdD5lfWZ1bmN0aW9uIElyKHQsZSl7cmV0dXJuIG51bGwhPXQmJmt0LmNhbGwodCxlKX1mdW5jdGlvbiBNcih0LGUpe3JldHVybiBudWxsIT10JiZlIGluIEl0KHQpfWZ1bmN0aW9uIEZyKHQsZSxyKXtmb3IodmFyIGk9cj9QZTpMZSxvPXRbMF0ubGVuZ3RoLHM9dC5sZW5ndGgsYT1zLHU9RXQocyksYz0xLzAsbD1bXTthLS07KXt2YXIgaD10W2FdO2EmJmUmJihoPVJlKGgsdG4oZSkpKSxjPXduKGgubGVuZ3RoLGMpLHVbYV09IXImJihlfHxvPj0xMjAmJmgubGVuZ3RoPj0xMjApP25ldyBLbihhJiZoKTpufWg9dFswXTt2YXIgZj0tMSxwPXVbMF07dDpmb3IoOysrZjxvJiZsLmxlbmd0aDxjOyl7dmFyIGQ9aFtmXSxnPWU/ZShkKTpkO2lmKGQ9cnx8MCE9PWQ/ZDowLCEocD9ubihwLGcpOmkobCxnLHIpKSl7Zm9yKGE9czstLWE7KXt2YXIgeT11W2FdO2lmKCEoeT9ubih5LGcpOmkodFthXSxnLHIpKSljb250aW51ZSB0fXAmJnAucHVzaChnKSxsLnB1c2goZCl9fXJldHVybiBsfWZ1bmN0aW9uIFRyKHQsZSxyKXt2YXIgaT1udWxsPT0odD1Nbyh0LGU9d2koZSx0KSkpP3Q6dFt6byhRbyhlKSldO3JldHVybiBudWxsPT1pP246TmUoaSx0LHIpfWZ1bmN0aW9uIE9yKHQpe3JldHVybiByYSh0KSYmQXIodCk9PXZ9ZnVuY3Rpb24gTHIodCxlLHIsaSxvKXtyZXR1cm4gdD09PWV8fChudWxsPT10fHxudWxsPT1lfHwhcmEodCkmJiFyYShlKT90IT10JiZlIT1lOmZ1bmN0aW9uKHQsZSxyLGksbyxzKXt2YXIgYT1Ycyh0KSx1PVhzKGUpLGM9YT9fOm1vKHQpLGw9dT9fOm1vKGUpLGg9KGM9Yz09dj9BOmMpPT1BLGY9KGw9bD09dj9BOmwpPT1BLHA9Yz09bDtpZihwJiZLcyh0KSl7aWYoIUtzKGUpKXJldHVybiExO2E9ITAsaD0hMX1pZihwJiYhaClyZXR1cm4gc3x8KHM9bmV3IEpuKSxhfHxoYSh0KT9ybyh0LGUscixpLG8scyk6ZnVuY3Rpb24odCxlLG4scixpLG8scyl7c3dpdGNoKG4pe2Nhc2UgUDppZih0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8dC5ieXRlT2Zmc2V0IT1lLmJ5dGVPZmZzZXQpcmV0dXJuITE7dD10LmJ1ZmZlcixlPWUuYnVmZmVyO2Nhc2UgTDpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhbyhuZXcgV3QodCksbmV3IFd0KGUpKSk7Y2FzZSB4OmNhc2UgdzpjYXNlIFM6cmV0dXJuIHFzKCt0LCtlKTtjYXNlIGI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIEk6Y2FzZSBGOnJldHVybiB0PT1lKyIiO2Nhc2UgQzp2YXIgYT1sbjtjYXNlIE06dmFyIHU9MSZyO2lmKGF8fChhPXBuKSx0LnNpemUhPWUuc2l6ZSYmIXUpcmV0dXJuITE7dmFyIGM9cy5nZXQodCk7aWYoYylyZXR1cm4gYz09ZTtyfD0yLHMuc2V0KHQsZSk7dmFyIGw9cm8oYSh0KSxhKGUpLHIsaSxvLHMpO3JldHVybiBzLmRlbGV0ZSh0KSxsO2Nhc2UgVDppZihqbilyZXR1cm4gam4uY2FsbCh0KT09am4uY2FsbChlKX1yZXR1cm4hMX0odCxlLGMscixpLG8scyk7aWYoISgxJnIpKXt2YXIgZD1oJiZrdC5jYWxsKHQsIl9fd3JhcHBlZF9fIiksZz1mJiZrdC5jYWxsKGUsIl9fd3JhcHBlZF9fIik7aWYoZHx8Zyl7dmFyIHk9ZD90LnZhbHVlKCk6dCxtPWc/ZS52YWx1ZSgpOmU7cmV0dXJuIHN8fChzPW5ldyBKbiksbyh5LG0scixpLHMpfX1yZXR1cm4hIXAmJihzfHwocz1uZXcgSm4pLGZ1bmN0aW9uKHQsZSxyLGksbyxzKXt2YXIgYT0xJnIsdT1vbyh0KSxjPXUubGVuZ3RoLGw9b28oZSksaD1sLmxlbmd0aDtpZihjIT1oJiYhYSlyZXR1cm4hMTtmb3IodmFyIGY9YztmLS07KXt2YXIgcD11W2ZdO2lmKCEoYT9wIGluIGU6a3QuY2FsbChlLHApKSlyZXR1cm4hMX12YXIgZD1zLmdldCh0KSxnPXMuZ2V0KGUpO2lmKGQmJmcpcmV0dXJuIGQ9PWUmJmc9PXQ7dmFyIHk9ITA7cy5zZXQodCxlKSxzLnNldChlLHQpO2Zvcih2YXIgbT1hOysrZjxjOyl7dmFyIHY9dFtwPXVbZl1dLF89ZVtwXTtpZihpKXZhciB4PWE/aShfLHYscCxlLHQscyk6aSh2LF8scCx0LGUscyk7aWYoISh4PT09bj92PT09X3x8byh2LF8scixpLHMpOngpKXt5PSExO2JyZWFrfW18fChtPSJjb25zdHJ1Y3RvciI9PXApfWlmKHkmJiFtKXt2YXIgdz10LmNvbnN0cnVjdG9yLGI9ZS5jb25zdHJ1Y3Rvcjt3IT1iJiYiY29uc3RydWN0b3IiaW4gdCYmImNvbnN0cnVjdG9yImluIGUmJiEoImZ1bmN0aW9uIj09dHlwZW9mIHcmJncgaW5zdGFuY2VvZiB3JiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYiBpbnN0YW5jZW9mIGIpJiYoeT0hMSl9cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLHl9KHQsZSxyLGksbyxzKSl9KHQsZSxyLGksTHIsbykpfWZ1bmN0aW9uIFByKHQsZSxyLGkpe3ZhciBvPXIubGVuZ3RoLHM9byxhPSFpO2lmKG51bGw9PXQpcmV0dXJuIXM7Zm9yKHQ9SXQodCk7by0tOyl7dmFyIHU9cltvXTtpZihhJiZ1WzJdP3VbMV0hPT10W3VbMF1dOiEodVswXWluIHQpKXJldHVybiExfWZvcig7KytvPHM7KXt2YXIgYz0odT1yW29dKVswXSxsPXRbY10saD11WzFdO2lmKGEmJnVbMl0pe2lmKGw9PT1uJiYhKGMgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgZj1uZXcgSm47aWYoaSl2YXIgcD1pKGwsaCxjLHQsZSxmKTtpZighKHA9PT1uP0xyKGgsbCwzLGksZik6cCkpcmV0dXJuITF9fXJldHVybiEwfWZ1bmN0aW9uIFJyKHQpe3JldHVybiEoIW5hKHQpfHxmdW5jdGlvbih0KXtyZXR1cm4hIWp0JiZqdCBpbiB0fSh0KSkmJigkcyh0KT9HdDp2dCkudGVzdChqbyh0KSl9ZnVuY3Rpb24gQnIodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpudWxsPT10P291OiJvYmplY3QiPT10eXBlb2YgdD9Ycyh0KT9Wcih0WzBdLHRbMV0pOnFyKHQpOmR1KHQpfWZ1bmN0aW9uIGtyKHQpe2lmKCFTbyh0KSlyZXR1cm4gX24odCk7dmFyIGU9W107Zm9yKHZhciBuIGluIEl0KHQpKWt0LmNhbGwodCxuKSYmImNvbnN0cnVjdG9yIiE9biYmZS5wdXNoKG4pO3JldHVybiBlfWZ1bmN0aW9uIHpyKHQpe2lmKCFuYSh0KSlyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9W107aWYobnVsbCE9dClmb3IodmFyIG4gaW4gSXQodCkpZS5wdXNoKG4pO3JldHVybiBlfSh0KTt2YXIgZT1Tbyh0KSxuPVtdO2Zvcih2YXIgciBpbiB0KSJjb25zdHJ1Y3RvciI9PXImJihlfHwha3QuY2FsbCh0LHIpKXx8bi5wdXNoKHIpO3JldHVybiBufWZ1bmN0aW9uIGpyKHQsZSl7cmV0dXJuIHQ8ZX1mdW5jdGlvbiBVcih0LGUpe3ZhciBuPS0xLHI9SHModCk/RXQodC5sZW5ndGgpOltdO3JldHVybiBkcih0LChmdW5jdGlvbih0LGksbyl7clsrK25dPWUodCxpLG8pfSkpLHJ9ZnVuY3Rpb24gcXIodCl7dmFyIGU9Zm8odCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP05vKGVbMF1bMF0sZVswXVsxXSk6ZnVuY3Rpb24obil7cmV0dXJuIG49PT10fHxQcihuLHQsZSl9fWZ1bmN0aW9uIFZyKHQsZSl7cmV0dXJuIERvKHQpJiZBbyhlKT9Obyh6byh0KSxlKTpmdW5jdGlvbihyKXt2YXIgaT1OYShyLHQpO3JldHVybiBpPT09biYmaT09PWU/SWEocix0KTpMcihlLGksMyl9fWZ1bmN0aW9uIEdyKHQsZSxyLGksbyl7dCE9PWUmJnhyKGUsKGZ1bmN0aW9uKHMsYSl7aWYob3x8KG89bmV3IEpuKSxuYShzKSkhZnVuY3Rpb24odCxlLHIsaSxvLHMsYSl7dmFyIHU9Rm8odCxyKSxjPUZvKGUsciksbD1hLmdldChjKTtpZihsKXJldHVybiB2b2lkIG5yKHQscixsKTt2YXIgaD1zP3ModSxjLHIrIiIsdCxlLGEpOm4sZj1oPT09bjtpZihmKXt2YXIgcD1YcyhjKSxkPSFwJiZLcyhjKSxnPSFwJiYhZCYmaGEoYyk7aD1jLHB8fGR8fGc/WHModSk/aD11OlpzKHUpP2g9RmkodSk6ZD8oZj0hMSxoPUNpKGMsITApKTpnPyhmPSExLGg9QWkoYywhMCkpOmg9W106c2EoYyl8fFlzKGMpPyhoPXUsWXModSk/aD1fYSh1KTooIW5hKHUpfHwkcyh1KSkmJihoPV9vKGMpKSk6Zj0hMX1mJiYoYS5zZXQoYyxoKSxvKGgsYyxpLHMsYSksYS5kZWxldGUoYykpLG5yKHQscixoKX0odCxlLGEscixHcixpLG8pO2Vsc2V7dmFyIHU9aT9pKEZvKHQsYSkscyxhKyIiLHQsZSxvKTpuO3U9PT1uJiYodT1zKSxucih0LGEsdSl9fSksTGEpfWZ1bmN0aW9uIFlyKHQsZSl7dmFyIHI9dC5sZW5ndGg7aWYocilyZXR1cm4gd28oZSs9ZTwwP3I6MCxyKT90W2VdOm59ZnVuY3Rpb24gWHIodCxlLG4pe2U9ZS5sZW5ndGg/UmUoZSwoZnVuY3Rpb24odCl7cmV0dXJuIFhzKHQpP2Z1bmN0aW9uKGUpe3JldHVybiBDcihlLDE9PT10Lmxlbmd0aD90WzBdOnQpfTp0fSkpOltvdV07dmFyIHI9LTE7cmV0dXJuIGU9UmUoZSx0bihsbygpKSksZnVuY3Rpb24odCxlKXt2YXIgbj10Lmxlbmd0aDtmb3IodC5zb3J0KGUpO24tLTspdFtuXT10W25dLnZhbHVlO3JldHVybiB0fShVcih0LChmdW5jdGlvbih0LG4saSl7cmV0dXJue2NyaXRlcmlhOlJlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlKHQpfSkpLGluZGV4Oisrcix2YWx1ZTp0fX0pKSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0tMSxpPXQuY3JpdGVyaWEsbz1lLmNyaXRlcmlhLHM9aS5sZW5ndGgsYT1uLmxlbmd0aDsrK3I8czspe3ZhciB1PU5pKGlbcl0sb1tyXSk7aWYodSlyZXR1cm4gcj49YT91OnUqKCJkZXNjIj09bltyXT8tMToxKX1yZXR1cm4gdC5pbmRleC1lLmluZGV4fSh0LGUsbil9KSl9ZnVuY3Rpb24gV3IodCxlLG4pe2Zvcih2YXIgcj0tMSxpPWUubGVuZ3RoLG89e307KytyPGk7KXt2YXIgcz1lW3JdLGE9Q3IodCxzKTtuKGEscykmJmVpKG8sd2kocyx0KSxhKX1yZXR1cm4gb31mdW5jdGlvbiBIcih0LGUsbixyKXt2YXIgaT1yP1llOkdlLG89LTEscz1lLmxlbmd0aCxhPXQ7Zm9yKHQ9PT1lJiYoZT1GaShlKSksbiYmKGE9UmUodCx0bihuKSkpOysrbzxzOylmb3IodmFyIHU9MCxjPWVbb10sbD1uP24oYyk6YzsodT1pKGEsbCx1LHIpKT4tMTspYSE9PXQmJlF0LmNhbGwoYSx1LDEpLFF0LmNhbGwodCx1LDEpO3JldHVybiB0fWZ1bmN0aW9uIFpyKHQsZSl7Zm9yKHZhciBuPXQ/ZS5sZW5ndGg6MCxyPW4tMTtuLS07KXt2YXIgaT1lW25dO2lmKG49PXJ8fGkhPT1vKXt2YXIgbz1pO3dvKGkpP1F0LmNhbGwodCxpLDEpOnBpKHQsaSl9fXJldHVybiB0fWZ1bmN0aW9uIEtyKHQsZSl7cmV0dXJuIHQrdmUoRW4oKSooZS10KzEpKX1mdW5jdGlvbiBKcih0LGUpe3ZhciBuPSIiO2lmKCF0fHxlPDF8fGU+ZilyZXR1cm4gbjtkb3tlJTImJihuKz10KSwoZT12ZShlLzIpKSYmKHQrPXQpfXdoaWxlKGUpO3JldHVybiBufWZ1bmN0aW9uIFFyKHQsZSl7cmV0dXJuIExvKElvKHQsZSxvdSksdCsiIil9ZnVuY3Rpb24gJHIodCl7cmV0dXJuICRuKHFhKHQpKX1mdW5jdGlvbiB0aSh0LGUpe3ZhciBuPXFhKHQpO3JldHVybiBCbyhuLGNyKGUsMCxuLmxlbmd0aCkpfWZ1bmN0aW9uIGVpKHQsZSxyLGkpe2lmKCFuYSh0KSlyZXR1cm4gdDtmb3IodmFyIG89LTEscz0oZT13aShlLHQpKS5sZW5ndGgsYT1zLTEsdT10O251bGwhPXUmJisrbzxzOyl7dmFyIGM9em8oZVtvXSksbD1yO2lmKCJfX3Byb3RvX18iPT09Y3x8ImNvbnN0cnVjdG9yIj09PWN8fCJwcm90b3R5cGUiPT09YylyZXR1cm4gdDtpZihvIT1hKXt2YXIgaD11W2NdOyhsPWk/aShoLGMsdSk6bik9PT1uJiYobD1uYShoKT9oOndvKGVbbysxXSk/W106e30pfXJyKHUsYyxsKSx1PXVbY119cmV0dXJuIHR9dmFyIG5pPVRuP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIFRuLnNldCh0LGUpLHR9Om91LHJpPW9lP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIG9lKHQsInRvU3RyaW5nIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6bnUoZSksd3JpdGFibGU6ITB9KX06b3U7ZnVuY3Rpb24gaWkodCl7cmV0dXJuIEJvKHFhKHQpKX1mdW5jdGlvbiBvaSh0LGUsbil7dmFyIHI9LTEsaT10Lmxlbmd0aDtlPDAmJihlPS1lPmk/MDppK2UpLChuPW4+aT9pOm4pPDAmJihuKz1pKSxpPWU+bj8wOm4tZT4+PjAsZT4+Pj0wO2Zvcih2YXIgbz1FdChpKTsrK3I8aTspb1tyXT10W3IrZV07cmV0dXJuIG99ZnVuY3Rpb24gc2kodCxlKXt2YXIgbjtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxyLGkpe3JldHVybiEobj1lKHQscixpKSl9KSksISFufWZ1bmN0aW9uIGFpKHQsZSxuKXt2YXIgcj0wLGk9bnVsbD09dD9yOnQubGVuZ3RoO2lmKCJudW1iZXIiPT10eXBlb2YgZSYmZT09ZSYmaTw9eSl7Zm9yKDtyPGk7KXt2YXIgbz1yK2k+Pj4xLHM9dFtvXTtudWxsIT09cyYmIWxhKHMpJiYobj9zPD1lOnM8ZSk/cj1vKzE6aT1vfXJldHVybiBpfXJldHVybiB1aSh0LGUsb3Usbil9ZnVuY3Rpb24gdWkodCxlLHIsaSl7dmFyIG89MCxzPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZigwPT09cylyZXR1cm4gMDtmb3IodmFyIGE9KGU9cihlKSkhPWUsdT1udWxsPT09ZSxjPWxhKGUpLGw9ZT09PW47bzxzOyl7dmFyIGg9dmUoKG8rcykvMiksZj1yKHRbaF0pLHA9ZiE9PW4sZD1udWxsPT09Zix5PWY9PWYsbT1sYShmKTtpZihhKXZhciB2PWl8fHk7ZWxzZSB2PWw/eSYmKGl8fHApOnU/eSYmcCYmKGl8fCFkKTpjP3kmJnAmJiFkJiYoaXx8IW0pOiFkJiYhbSYmKGk/Zjw9ZTpmPGUpO3Y/bz1oKzE6cz1ofXJldHVybiB3bihzLGcpfWZ1bmN0aW9uIGNpKHQsZSl7Zm9yKHZhciBuPS0xLHI9dC5sZW5ndGgsaT0wLG89W107KytuPHI7KXt2YXIgcz10W25dLGE9ZT9lKHMpOnM7aWYoIW58fCFxcyhhLHUpKXt2YXIgdT1hO29baSsrXT0wPT09cz8wOnN9fXJldHVybiBvfWZ1bmN0aW9uIGxpKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90OmxhKHQpP3A6K3R9ZnVuY3Rpb24gaGkodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiB0O2lmKFhzKHQpKXJldHVybiBSZSh0LGhpKSsiIjtpZihsYSh0KSlyZXR1cm4gVW4/VW4uY2FsbCh0KToiIjt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0taD8iLTAiOmV9ZnVuY3Rpb24gZmkodCxlLG4pe3ZhciByPS0xLGk9TGUsbz10Lmxlbmd0aCxzPSEwLGE9W10sdT1hO2lmKG4pcz0hMSxpPVBlO2Vsc2UgaWYobz49MjAwKXt2YXIgYz1lP251bGw6SmkodCk7aWYoYylyZXR1cm4gcG4oYyk7cz0hMSxpPW5uLHU9bmV3IEtufWVsc2UgdT1lP1tdOmE7dDpmb3IoOysrcjxvOyl7dmFyIGw9dFtyXSxoPWU/ZShsKTpsO2lmKGw9bnx8MCE9PWw/bDowLHMmJmg9PWgpe2Zvcih2YXIgZj11Lmxlbmd0aDtmLS07KWlmKHVbZl09PT1oKWNvbnRpbnVlIHQ7ZSYmdS5wdXNoKGgpLGEucHVzaChsKX1lbHNlIGkodSxoLG4pfHwodSE9PWEmJnUucHVzaChoKSxhLnB1c2gobCkpfXJldHVybiBhfWZ1bmN0aW9uIHBpKHQsZSl7cmV0dXJuIG51bGw9PSh0PU1vKHQsZT13aShlLHQpKSl8fGRlbGV0ZSB0W3pvKFFvKGUpKV19ZnVuY3Rpb24gZGkodCxlLG4scil7cmV0dXJuIGVpKHQsZSxuKENyKHQsZSkpLHIpfWZ1bmN0aW9uIGdpKHQsZSxuLHIpe2Zvcih2YXIgaT10Lmxlbmd0aCxvPXI/aTotMTsocj9vLS06KytvPGkpJiZlKHRbb10sbyx0KTspO3JldHVybiBuP29pKHQscj8wOm8scj9vKzE6aSk6b2kodCxyP28rMTowLHI/aTpvKX1mdW5jdGlvbiB5aSh0LGUpe3ZhciBuPXQ7cmV0dXJuIG4gaW5zdGFuY2VvZiBYbiYmKG49bi52YWx1ZSgpKSxrZShlLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmZ1bmMuYXBwbHkoZS50aGlzQXJnLEJlKFt0XSxlLmFyZ3MpKX0pLG4pfWZ1bmN0aW9uIG1pKHQsZSxuKXt2YXIgcj10Lmxlbmd0aDtpZihyPDIpcmV0dXJuIHI/ZmkodFswXSk6W107Zm9yKHZhciBpPS0xLG89RXQocik7KytpPHI7KWZvcih2YXIgcz10W2ldLGE9LTE7KythPHI7KWEhPWkmJihvW2ldPXByKG9baV18fHMsdFthXSxlLG4pKTtyZXR1cm4gZmkoX3IobywxKSxlLG4pfWZ1bmN0aW9uIHZpKHQsZSxyKXtmb3IodmFyIGk9LTEsbz10Lmxlbmd0aCxzPWUubGVuZ3RoLGE9e307KytpPG87KXt2YXIgdT1pPHM/ZVtpXTpuO3IoYSx0W2ldLHUpfXJldHVybiBhfWZ1bmN0aW9uIF9pKHQpe3JldHVybiBacyh0KT90OltdfWZ1bmN0aW9uIHhpKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6b3V9ZnVuY3Rpb24gd2kodCxlKXtyZXR1cm4gWHModCk/dDpEbyh0LGUpP1t0XTprbyh4YSh0KSl9dmFyIGJpPVFyO2Z1bmN0aW9uIERpKHQsZSxyKXt2YXIgaT10Lmxlbmd0aDtyZXR1cm4gcj1yPT09bj9pOnIsIWUmJnI+PWk/dDpvaSh0LGUscil9dmFyIEVpPWhlfHxmdW5jdGlvbih0KXtyZXR1cm4geWUuY2xlYXJUaW1lb3V0KHQpfTtmdW5jdGlvbiBDaSh0LGUpe2lmKGUpcmV0dXJuIHQuc2xpY2UoKTt2YXIgbj10Lmxlbmd0aCxyPUh0P0h0KG4pOm5ldyB0LmNvbnN0cnVjdG9yKG4pO3JldHVybiB0LmNvcHkocikscn1mdW5jdGlvbiBTaSh0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LmJ5dGVMZW5ndGgpO3JldHVybiBuZXcgV3QoZSkuc2V0KG5ldyBXdCh0KSksZX1mdW5jdGlvbiBBaSh0LGUpe3ZhciBuPWU/U2kodC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0Lmxlbmd0aCl9ZnVuY3Rpb24gTmkodCxlKXtpZih0IT09ZSl7dmFyIHI9dCE9PW4saT1udWxsPT09dCxvPXQ9PXQscz1sYSh0KSxhPWUhPT1uLHU9bnVsbD09PWUsYz1lPT1lLGw9bGEoZSk7aWYoIXUmJiFsJiYhcyYmdD5lfHxzJiZhJiZjJiYhdSYmIWx8fGkmJmEmJmN8fCFyJiZjfHwhbylyZXR1cm4gMTtpZighaSYmIXMmJiFsJiZ0PGV8fGwmJnImJm8mJiFpJiYhc3x8dSYmciYmb3x8IWEmJm98fCFjKXJldHVybi0xfXJldHVybiAwfWZ1bmN0aW9uIElpKHQsZSxuLHIpe2Zvcih2YXIgaT0tMSxvPXQubGVuZ3RoLHM9bi5sZW5ndGgsYT0tMSx1PWUubGVuZ3RoLGM9eG4oby1zLDApLGw9RXQodStjKSxoPSFyOysrYTx1OylsW2FdPWVbYV07Zm9yKDsrK2k8czspKGh8fGk8bykmJihsW25baV1dPXRbaV0pO2Zvcig7Yy0tOylsW2ErK109dFtpKytdO3JldHVybiBsfWZ1bmN0aW9uIE1pKHQsZSxuLHIpe2Zvcih2YXIgaT0tMSxvPXQubGVuZ3RoLHM9LTEsYT1uLmxlbmd0aCx1PS0xLGM9ZS5sZW5ndGgsbD14bihvLWEsMCksaD1FdChsK2MpLGY9IXI7KytpPGw7KWhbaV09dFtpXTtmb3IodmFyIHA9aTsrK3U8YzspaFtwK3VdPWVbdV07Zm9yKDsrK3M8YTspKGZ8fGk8bykmJihoW3ArbltzXV09dFtpKytdKTtyZXR1cm4gaH1mdW5jdGlvbiBGaSh0LGUpe3ZhciBuPS0xLHI9dC5sZW5ndGg7Zm9yKGV8fChlPUV0KHIpKTsrK248cjspZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIFRpKHQsZSxyLGkpe3ZhciBvPSFyO3J8fChyPXt9KTtmb3IodmFyIHM9LTEsYT1lLmxlbmd0aDsrK3M8YTspe3ZhciB1PWVbc10sYz1pP2koclt1XSx0W3VdLHUscix0KTpuO2M9PT1uJiYoYz10W3VdKSxvP2FyKHIsdSxjKTpycihyLHUsYyl9cmV0dXJuIHJ9ZnVuY3Rpb24gT2kodCxlKXtyZXR1cm4gZnVuY3Rpb24obixyKXt2YXIgaT1YcyhuKT9JZTpvcixvPWU/ZSgpOnt9O3JldHVybiBpKG4sdCxsbyhyLDIpLG8pfX1mdW5jdGlvbiBMaSh0KXtyZXR1cm4gUXIoKGZ1bmN0aW9uKGUscil7dmFyIGk9LTEsbz1yLmxlbmd0aCxzPW8+MT9yW28tMV06bixhPW8+Mj9yWzJdOm47Zm9yKHM9dC5sZW5ndGg+MyYmImZ1bmN0aW9uIj09dHlwZW9mIHM/KG8tLSxzKTpuLGEmJmJvKHJbMF0sclsxXSxhKSYmKHM9bzwzP246cyxvPTEpLGU9SXQoZSk7KytpPG87KXt2YXIgdT1yW2ldO3UmJnQoZSx1LGkscyl9cmV0dXJuIGV9KSl9ZnVuY3Rpb24gUGkodCxlKXtyZXR1cm4gZnVuY3Rpb24obixyKXtpZihudWxsPT1uKXJldHVybiBuO2lmKCFIcyhuKSlyZXR1cm4gdChuLHIpO2Zvcih2YXIgaT1uLmxlbmd0aCxvPWU/aTotMSxzPUl0KG4pOyhlP28tLTorK288aSkmJiExIT09cihzW29dLG8scyk7KTtyZXR1cm4gbn19ZnVuY3Rpb24gUmkodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixyKXtmb3IodmFyIGk9LTEsbz1JdChlKSxzPXIoZSksYT1zLmxlbmd0aDthLS07KXt2YXIgdT1zW3Q/YTorK2ldO2lmKCExPT09bihvW3VdLHUsbykpYnJlYWt9cmV0dXJuIGV9fWZ1bmN0aW9uIEJpKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1jbihlPXhhKGUpKT9nbihlKTpuLGk9cj9yWzBdOmUuY2hhckF0KDApLG89cj9EaShyLDEpLmpvaW4oIiIpOmUuc2xpY2UoMSk7cmV0dXJuIGlbdF0oKStvfX1mdW5jdGlvbiBraSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGtlKCRhKFlhKGUpLnJlcGxhY2UoZWUsIiIpKSx0LCIiKX19ZnVuY3Rpb24gemkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgdDtjYXNlIDE6cmV0dXJuIG5ldyB0KGVbMF0pO2Nhc2UgMjpyZXR1cm4gbmV3IHQoZVswXSxlWzFdKTtjYXNlIDM6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdKTtjYXNlIDQ6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10pO2Nhc2UgNTpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdKTtjYXNlIDY6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdKTtjYXNlIDc6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdLGVbNl0pfXZhciBuPVZuKHQucHJvdG90eXBlKSxyPXQuYXBwbHkobixlKTtyZXR1cm4gbmEocik/cjpufX1mdW5jdGlvbiBqaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLGkpe3ZhciBvPUl0KGUpO2lmKCFIcyhlKSl7dmFyIHM9bG8ociwzKTtlPU9hKGUpLHI9ZnVuY3Rpb24odCl7cmV0dXJuIHMob1t0XSx0LG8pfX12YXIgYT10KGUscixpKTtyZXR1cm4gYT4tMT9vW3M/ZVthXTphXTpufX1mdW5jdGlvbiBVaSh0KXtyZXR1cm4gaW8oKGZ1bmN0aW9uKGUpe3ZhciBpPWUubGVuZ3RoLG89aSxzPVluLnByb3RvdHlwZS50aHJ1O2Zvcih0JiZlLnJldmVyc2UoKTtvLS07KXt2YXIgYT1lW29dO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBhKXRocm93IG5ldyBUdChyKTtpZihzJiYhdSYmIndyYXBwZXIiPT11byhhKSl2YXIgdT1uZXcgWW4oW10sITApfWZvcihvPXU/bzppOysrbzxpOyl7dmFyIGM9dW8oYT1lW29dKSxsPSJ3cmFwcGVyIj09Yz9hbyhhKTpuO3U9bCYmRW8obFswXSkmJjQyND09bFsxXSYmIWxbNF0ubGVuZ3RoJiYxPT1sWzldP3VbdW8obFswXSldLmFwcGx5KHUsbFszXSk6MT09YS5sZW5ndGgmJkVvKGEpP3VbY10oKTp1LnRocnUoYSl9cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLG49dFswXTtpZih1JiYxPT10Lmxlbmd0aCYmWHMobikpcmV0dXJuIHUucGxhbnQobikudmFsdWUoKTtmb3IodmFyIHI9MCxvPWk/ZVtyXS5hcHBseSh0aGlzLHQpOm47KytyPGk7KW89ZVtyXS5jYWxsKHRoaXMsbyk7cmV0dXJuIG99fSkpfWZ1bmN0aW9uIHFpKHQsZSxyLGksbyxzLGEsdSxsLGgpe3ZhciBmPWUmYyxwPTEmZSxkPTImZSxnPTI0JmUseT01MTImZSxtPWQ/bjp6aSh0KTtyZXR1cm4gZnVuY3Rpb24gYygpe2Zvcih2YXIgdj1hcmd1bWVudHMubGVuZ3RoLF89RXQodikseD12O3gtLTspX1t4XT1hcmd1bWVudHNbeF07aWYoZyl2YXIgdz1jbyhjKSxiPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoLHI9MDtuLS07KXRbbl09PT1lJiYrK3I7cmV0dXJuIHJ9KF8sdyk7aWYoaSYmKF89SWkoXyxpLG8sZykpLHMmJihfPU1pKF8scyxhLGcpKSx2LT1iLGcmJnY8aCl7dmFyIEQ9Zm4oXyx3KTtyZXR1cm4gWmkodCxlLHFpLGMucGxhY2Vob2xkZXIscixfLEQsdSxsLGgtdil9dmFyIEU9cD9yOnRoaXMsQz1kP0VbdF06dDtyZXR1cm4gdj1fLmxlbmd0aCx1P189ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5sZW5ndGgsaT13bihlLmxlbmd0aCxyKSxvPUZpKHQpO2ktLTspe3ZhciBzPWVbaV07dFtpXT13byhzLHIpP29bc106bn1yZXR1cm4gdH0oXyx1KTp5JiZ2PjEmJl8ucmV2ZXJzZSgpLGYmJmw8diYmKF8ubGVuZ3RoPWwpLHRoaXMmJnRoaXMhPT15ZSYmdGhpcyBpbnN0YW5jZW9mIGMmJihDPW18fHppKEMpKSxDLmFwcGx5KEUsXyl9fWZ1bmN0aW9uIFZpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBicih0LChmdW5jdGlvbih0LGksbyl7ZShyLG4odCksaSxvKX0pKSxyfShuLHQsZShyKSx7fSl9fWZ1bmN0aW9uIEdpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7dmFyIG87aWYocj09PW4mJmk9PT1uKXJldHVybiBlO2lmKHIhPT1uJiYobz1yKSxpIT09bil7aWYobz09PW4pcmV0dXJuIGk7InN0cmluZyI9PXR5cGVvZiByfHwic3RyaW5nIj09dHlwZW9mIGk/KHI9aGkociksaT1oaShpKSk6KHI9bGkociksaT1saShpKSksbz10KHIsaSl9cmV0dXJuIG99fWZ1bmN0aW9uIFlpKHQpe3JldHVybiBpbygoZnVuY3Rpb24oZSl7cmV0dXJuIGU9UmUoZSx0bihsbygpKSksUXIoKGZ1bmN0aW9uKG4pe3ZhciByPXRoaXM7cmV0dXJuIHQoZSwoZnVuY3Rpb24odCl7cmV0dXJuIE5lKHQscixuKX0pKX0pKX0pKX1mdW5jdGlvbiBYaSh0LGUpe3ZhciByPShlPWU9PT1uPyIgIjpoaShlKSkubGVuZ3RoO2lmKHI8MilyZXR1cm4gcj9KcihlLHQpOmU7dmFyIGk9SnIoZSxtZSh0L2RuKGUpKSk7cmV0dXJuIGNuKGUpP0RpKGduKGkpLDAsdCkuam9pbigiIik6aS5zbGljZSgwLHQpfWZ1bmN0aW9uIFdpKHQpe3JldHVybiBmdW5jdGlvbihlLHIsaSl7cmV0dXJuIGkmJiJudW1iZXIiIT10eXBlb2YgaSYmYm8oZSxyLGkpJiYocj1pPW4pLGU9Z2EoZSkscj09PW4/KHI9ZSxlPTApOnI9Z2EociksZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPS0xLG89eG4obWUoKGUtdCkvKG58fDEpKSwwKSxzPUV0KG8pO28tLTspc1tyP286KytpXT10LHQrPW47cmV0dXJuIHN9KGUscixpPWk9PT1uP2U8cj8xOi0xOmdhKGkpLHQpfX1mdW5jdGlvbiBIaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJiJzdHJpbmciPT10eXBlb2Ygbnx8KGU9dmEoZSksbj12YShuKSksdChlLG4pfX1mdW5jdGlvbiBaaSh0LGUscixpLG8scyxjLGwsaCxmKXt2YXIgcD04JmU7ZXw9cD9hOnUsNCYoZSY9fihwP3U6YSkpfHwoZSY9LTQpO3ZhciBkPVt0LGUsbyxwP3M6bixwP2M6bixwP246cyxwP246YyxsLGgsZl0sZz1yLmFwcGx5KG4sZCk7cmV0dXJuIEVvKHQpJiZUbyhnLGQpLGcucGxhY2Vob2xkZXI9aSxQbyhnLHQsZSl9ZnVuY3Rpb24gS2kodCl7dmFyIGU9TnRbdF07cmV0dXJuIGZ1bmN0aW9uKHQsbil7aWYodD12YSh0KSwobj1udWxsPT1uPzA6d24oeWEobiksMjkyKSkmJlVlKHQpKXt2YXIgcj0oeGEodCkrImUiKS5zcGxpdCgiZSIpO3JldHVybisoKHI9KHhhKGUoclswXSsiZSIrKCtyWzFdK24pKSkrImUiKS5zcGxpdCgiZSIpKVswXSsiZSIrKCtyWzFdLW4pKX1yZXR1cm4gZSh0KX19dmFyIEppPUluJiYxL3BuKG5ldyBJbihbLC0wXSkpWzFdPT1oP2Z1bmN0aW9uKHQpe3JldHVybiBuZXcgSW4odCl9Omx1O2Z1bmN0aW9uIFFpKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1tbyhlKTtyZXR1cm4gbj09Qz9sbihlKTpuPT1NP2Z1bmN0aW9uKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtuWysrZV09W3QsdF19KSksbn0oZSk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gUmUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuW2UsdFtlXV19KSl9KGUsdChlKSl9fWZ1bmN0aW9uICRpKHQsZSxpLGgsZixwLGQsZyl7dmFyIHk9MiZlO2lmKCF5JiYiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7dmFyIG09aD9oLmxlbmd0aDowO2lmKG18fChlJj0tOTcsaD1mPW4pLGQ9ZD09PW4/ZDp4bih5YShkKSwwKSxnPWc9PT1uP2c6eWEoZyksbS09Zj9mLmxlbmd0aDowLGUmdSl7dmFyIHY9aCxfPWY7aD1mPW59dmFyIHg9eT9uOmFvKHQpLHc9W3QsZSxpLGgsZix2LF8scCxkLGddO2lmKHgmJmZ1bmN0aW9uKHQsZSl7dmFyIG49dFsxXSxyPWVbMV0saT1ufHIscz1pPDEzMSxhPXI9PWMmJjg9PW58fHI9PWMmJm49PWwmJnRbN10ubGVuZ3RoPD1lWzhdfHwzODQ9PXImJmVbN10ubGVuZ3RoPD1lWzhdJiY4PT1uO2lmKCFzJiYhYSlyZXR1cm4gdDsxJnImJih0WzJdPWVbMl0saXw9MSZuPzA6NCk7dmFyIHU9ZVszXTtpZih1KXt2YXIgaD10WzNdO3RbM109aD9JaShoLHUsZVs0XSk6dSx0WzRdPWg/Zm4odFszXSxvKTplWzRdfXU9ZVs1XSx1JiYoaD10WzVdLHRbNV09aD9NaShoLHUsZVs2XSk6dSx0WzZdPWg/Zm4odFs1XSxvKTplWzZdKSx1PWVbN10sdSYmKHRbN109dSksciZjJiYodFs4XT1udWxsPT10WzhdP2VbOF06d24odFs4XSxlWzhdKSksbnVsbD09dFs5XSYmKHRbOV09ZVs5XSksdFswXT1lWzBdLHRbMV09aX0odyx4KSx0PXdbMF0sZT13WzFdLGk9d1syXSxoPXdbM10sZj13WzRdLCEoZz13WzldPXdbOV09PT1uP3k/MDp0Lmxlbmd0aDp4bih3WzldLW0sMCkpJiYyNCZlJiYoZSY9LTI1KSxlJiYxIT1lKWI9OD09ZXx8ZT09cz9mdW5jdGlvbih0LGUscil7dmFyIGk9emkodCk7cmV0dXJuIGZ1bmN0aW9uIG8oKXtmb3IodmFyIHM9YXJndW1lbnRzLmxlbmd0aCxhPUV0KHMpLHU9cyxjPWNvKG8pO3UtLTspYVt1XT1hcmd1bWVudHNbdV07dmFyIGw9czwzJiZhWzBdIT09YyYmYVtzLTFdIT09Yz9bXTpmbihhLGMpO3JldHVybihzLT1sLmxlbmd0aCk8cj9aaSh0LGUscWksby5wbGFjZWhvbGRlcixuLGEsbCxuLG4sci1zKTpOZSh0aGlzJiZ0aGlzIT09eWUmJnRoaXMgaW5zdGFuY2VvZiBvP2k6dCx0aGlzLGEpfX0odCxlLGcpOmUhPWEmJjMzIT1lfHxmLmxlbmd0aD9xaS5hcHBseShuLHcpOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPTEmZSxvPXppKHQpO3JldHVybiBmdW5jdGlvbiBlKCl7Zm9yKHZhciBzPS0xLGE9YXJndW1lbnRzLmxlbmd0aCx1PS0xLGM9ci5sZW5ndGgsbD1FdChjK2EpLGg9dGhpcyYmdGhpcyE9PXllJiZ0aGlzIGluc3RhbmNlb2YgZT9vOnQ7Kyt1PGM7KWxbdV09clt1XTtmb3IoO2EtLTspbFt1KytdPWFyZ3VtZW50c1srK3NdO3JldHVybiBOZShoLGk/bjp0aGlzLGwpfX0odCxlLGksaCk7ZWxzZSB2YXIgYj1mdW5jdGlvbih0LGUsbil7dmFyIHI9MSZlLGk9emkodCk7cmV0dXJuIGZ1bmN0aW9uIGUoKXtyZXR1cm4odGhpcyYmdGhpcyE9PXllJiZ0aGlzIGluc3RhbmNlb2YgZT9pOnQpLmFwcGx5KHI/bjp0aGlzLGFyZ3VtZW50cyl9fSh0LGUsaSk7cmV0dXJuIFBvKCh4P25pOlRvKShiLHcpLHQsZSl9ZnVuY3Rpb24gdG8odCxlLHIsaSl7cmV0dXJuIHQ9PT1ufHxxcyh0LFB0W3JdKSYmIWt0LmNhbGwoaSxyKT9lOnR9ZnVuY3Rpb24gZW8odCxlLHIsaSxvLHMpe3JldHVybiBuYSh0KSYmbmEoZSkmJihzLnNldChlLHQpLEdyKHQsZSxuLGVvLHMpLHMuZGVsZXRlKGUpKSx0fWZ1bmN0aW9uIG5vKHQpe3JldHVybiBzYSh0KT9uOnR9ZnVuY3Rpb24gcm8odCxlLHIsaSxvLHMpe3ZhciBhPTEmcix1PXQubGVuZ3RoLGM9ZS5sZW5ndGg7aWYodSE9YyYmIShhJiZjPnUpKXJldHVybiExO3ZhciBsPXMuZ2V0KHQpLGg9cy5nZXQoZSk7aWYobCYmaClyZXR1cm4gbD09ZSYmaD09dDt2YXIgZj0tMSxwPSEwLGQ9MiZyP25ldyBLbjpuO2ZvcihzLnNldCh0LGUpLHMuc2V0KGUsdCk7KytmPHU7KXt2YXIgZz10W2ZdLHk9ZVtmXTtpZihpKXZhciBtPWE/aSh5LGcsZixlLHQscyk6aShnLHksZix0LGUscyk7aWYobSE9PW4pe2lmKG0pY29udGludWU7cD0hMTticmVha31pZihkKXtpZighamUoZSwoZnVuY3Rpb24odCxlKXtpZighbm4oZCxlKSYmKGc9PT10fHxvKGcsdCxyLGkscykpKXJldHVybiBkLnB1c2goZSl9KSkpe3A9ITE7YnJlYWt9fWVsc2UgaWYoZyE9PXkmJiFvKGcseSxyLGkscykpe3A9ITE7YnJlYWt9fXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSxwfWZ1bmN0aW9uIGlvKHQpe3JldHVybiBMbyhJbyh0LG4sV28pLHQrIiIpfWZ1bmN0aW9uIG9vKHQpe3JldHVybiBTcih0LE9hLGdvKX1mdW5jdGlvbiBzbyh0KXtyZXR1cm4gU3IodCxMYSx5byl9dmFyIGFvPVRuP2Z1bmN0aW9uKHQpe3JldHVybiBUbi5nZXQodCl9Omx1O2Z1bmN0aW9uIHVvKHQpe2Zvcih2YXIgZT10Lm5hbWUrIiIsbj1PbltlXSxyPWt0LmNhbGwoT24sZSk/bi5sZW5ndGg6MDtyLS07KXt2YXIgaT1uW3JdLG89aS5mdW5jO2lmKG51bGw9PW98fG89PXQpcmV0dXJuIGkubmFtZX1yZXR1cm4gZX1mdW5jdGlvbiBjbyh0KXtyZXR1cm4oa3QuY2FsbChxbiwicGxhY2Vob2xkZXIiKT9xbjp0KS5wbGFjZWhvbGRlcn1mdW5jdGlvbiBsbygpe3ZhciB0PXFuLml0ZXJhdGVlfHxzdTtyZXR1cm4gdD10PT09c3U/QnI6dCxhcmd1bWVudHMubGVuZ3RoP3QoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6dH1mdW5jdGlvbiBobyh0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9KGUpP25bInN0cmluZyI9PXR5cGVvZiBlPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gZm8odCl7Zm9yKHZhciBlPU9hKHQpLG49ZS5sZW5ndGg7bi0tOyl7dmFyIHI9ZVtuXSxpPXRbcl07ZVtuXT1bcixpLEFvKGkpXX1yZXR1cm4gZX1mdW5jdGlvbiBwbyh0LGUpe3ZhciByPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/bjp0W2VdfSh0LGUpO3JldHVybiBScihyKT9yOm59dmFyIGdvPXhlP2Z1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOih0PUl0KHQpLE9lKHhlKHQpLChmdW5jdGlvbihlKXtyZXR1cm4gSnQuY2FsbCh0LGUpfSkpKX06bXUseW89eGU/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdO3Q7KUJlKGUsZ28odCkpLHQ9WnQodCk7cmV0dXJuIGV9Om11LG1vPUFyO2Z1bmN0aW9uIHZvKHQsZSxuKXtmb3IodmFyIHI9LTEsaT0oZT13aShlLHQpKS5sZW5ndGgsbz0hMTsrK3I8aTspe3ZhciBzPXpvKGVbcl0pO2lmKCEobz1udWxsIT10JiZuKHQscykpKWJyZWFrO3Q9dFtzXX1yZXR1cm4gb3x8KytyIT1pP286ISEoaT1udWxsPT10PzA6dC5sZW5ndGgpJiZlYShpKSYmd28ocyxpKSYmKFhzKHQpfHxZcyh0KSl9ZnVuY3Rpb24gX28odCl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQuY29uc3RydWN0b3J8fFNvKHQpP3t9OlZuKFp0KHQpKX1mdW5jdGlvbiB4byh0KXtyZXR1cm4gWHModCl8fFlzKHQpfHwhISgkdCYmdCYmdFskdF0pfWZ1bmN0aW9uIHdvKHQsZSl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lP2Y6ZSkmJigibnVtYmVyIj09bnx8InN5bWJvbCIhPW4mJnh0LnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX1mdW5jdGlvbiBibyh0LGUsbil7aWYoIW5hKG4pKXJldHVybiExO3ZhciByPXR5cGVvZiBlO3JldHVybiEhKCJudW1iZXIiPT1yP0hzKG4pJiZ3byhlLG4ubGVuZ3RoKToic3RyaW5nIj09ciYmZSBpbiBuKSYmcXMobltlXSx0KX1mdW5jdGlvbiBEbyh0LGUpe2lmKFhzKHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiEoIm51bWJlciIhPW4mJiJzeW1ib2wiIT1uJiYiYm9vbGVhbiIhPW4mJm51bGwhPXQmJiFsYSh0KSl8fChudC50ZXN0KHQpfHwhZXQudGVzdCh0KXx8bnVsbCE9ZSYmdCBpbiBJdChlKSl9ZnVuY3Rpb24gRW8odCl7dmFyIGU9dW8odCksbj1xbltlXTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbnx8IShlIGluIFhuLnByb3RvdHlwZSkpcmV0dXJuITE7aWYodD09PW4pcmV0dXJuITA7dmFyIHI9YW8obik7cmV0dXJuISFyJiZ0PT09clswXX0oU24mJm1vKG5ldyBTbihuZXcgQXJyYXlCdWZmZXIoMSkpKSE9UHx8QW4mJm1vKG5ldyBBbikhPUN8fE5uJiZtbyhObi5yZXNvbHZlKCkpIT1OfHxJbiYmbW8obmV3IEluKSE9TXx8TW4mJm1vKG5ldyBNbikhPU8pJiYobW89ZnVuY3Rpb24odCl7dmFyIGU9QXIodCkscj1lPT1BP3QuY29uc3RydWN0b3I6bixpPXI/am8ocik6IiI7aWYoaSlzd2l0Y2goaSl7Y2FzZSBMbjpyZXR1cm4gUDtjYXNlIFBuOnJldHVybiBDO2Nhc2UgUm46cmV0dXJuIE47Y2FzZSBCbjpyZXR1cm4gTTtjYXNlIGtuOnJldHVybiBPfXJldHVybiBlfSk7dmFyIENvPVJ0PyRzOnZ1O2Z1bmN0aW9uIFNvKHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxQdCl9ZnVuY3Rpb24gQW8odCl7cmV0dXJuIHQ9PXQmJiFuYSh0KX1mdW5jdGlvbiBObyh0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gbnVsbCE9ciYmKHJbdF09PT1lJiYoZSE9PW58fHQgaW4gSXQocikpKX19ZnVuY3Rpb24gSW8odCxlLHIpe3JldHVybiBlPXhuKGU9PT1uP3QubGVuZ3RoLTE6ZSwwKSxmdW5jdGlvbigpe2Zvcih2YXIgbj1hcmd1bWVudHMsaT0tMSxvPXhuKG4ubGVuZ3RoLWUsMCkscz1FdChvKTsrK2k8bzspc1tpXT1uW2UraV07aT0tMTtmb3IodmFyIGE9RXQoZSsxKTsrK2k8ZTspYVtpXT1uW2ldO3JldHVybiBhW2VdPXIocyksTmUodCx0aGlzLGEpfX1mdW5jdGlvbiBNbyh0LGUpe3JldHVybiBlLmxlbmd0aDwyP3Q6Q3IodCxvaShlLDAsLTEpKX1mdW5jdGlvbiBGbyh0LGUpe2lmKCgiY29uc3RydWN0b3IiIT09ZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRbZV0pJiYiX19wcm90b19fIiE9ZSlyZXR1cm4gdFtlXX12YXIgVG89Um8obmkpLE9vPWdlfHxmdW5jdGlvbih0LGUpe3JldHVybiB5ZS5zZXRUaW1lb3V0KHQsZSl9LExvPVJvKHJpKTtmdW5jdGlvbiBQbyh0LGUsbil7dmFyIHI9ZSsiIjtyZXR1cm4gTG8odCxmdW5jdGlvbih0LGUpe3ZhciBuPWUubGVuZ3RoO2lmKCFuKXJldHVybiB0O3ZhciByPW4tMTtyZXR1cm4gZVtyXT0obj4xPyImICI6IiIpK2Vbcl0sZT1lLmpvaW4obj4yPyIsICI6IiAiKSx0LnJlcGxhY2UodXQsIntcbi8qIFt3cmFwcGVkIHdpdGggIitlKyJdICovXG4iKX0ocixmdW5jdGlvbih0LGUpe3JldHVybiBNZShtLChmdW5jdGlvbihuKXt2YXIgcj0iXy4iK25bMF07ZSZuWzFdJiYhTGUodCxyKSYmdC5wdXNoKHIpfSkpLHQuc29ydCgpfShmdW5jdGlvbih0KXt2YXIgZT10Lm1hdGNoKGN0KTtyZXR1cm4gZT9lWzFdLnNwbGl0KGx0KTpbXX0ociksbikpKX1mdW5jdGlvbiBSbyh0KXt2YXIgZT0wLHI9MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1ibigpLG89MTYtKGktcik7aWYocj1pLG8+MCl7aWYoKytlPj04MDApcmV0dXJuIGFyZ3VtZW50c1swXX1lbHNlIGU9MDtyZXR1cm4gdC5hcHBseShuLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIEJvKHQsZSl7dmFyIHI9LTEsaT10Lmxlbmd0aCxvPWktMTtmb3IoZT1lPT09bj9pOmU7KytyPGU7KXt2YXIgcz1LcihyLG8pLGE9dFtzXTt0W3NdPXRbcl0sdFtyXT1hfXJldHVybiB0Lmxlbmd0aD1lLHR9dmFyIGtvPWZ1bmN0aW9uKHQpe3ZhciBlPVJzKHQsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT1uLnNpemUmJm4uY2xlYXIoKSx0fSkpLG49ZS5jYWNoZTtyZXR1cm4gZX0oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UocnQsKGZ1bmN0aW9uKHQsbixyLGkpe2UucHVzaChyP2kucmVwbGFjZShwdCwiJDEiKTpufHx0KX0pKSxlfSkpO2Z1bmN0aW9uIHpvKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8bGEodCkpcmV0dXJuIHQ7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LWg/Ii0wIjplfWZ1bmN0aW9uIGpvKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gQnQuY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9ZnVuY3Rpb24gVW8odCl7aWYodCBpbnN0YW5jZW9mIFhuKXJldHVybiB0LmNsb25lKCk7dmFyIGU9bmV3IFluKHQuX193cmFwcGVkX18sdC5fX2NoYWluX18pO3JldHVybiBlLl9fYWN0aW9uc19fPUZpKHQuX19hY3Rpb25zX18pLGUuX19pbmRleF9fPXQuX19pbmRleF9fLGUuX192YWx1ZXNfXz10Ll9fdmFsdWVzX18sZX12YXIgcW89UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFpzKHQpP3ByKHQsX3IoZSwxLFpzLCEwKSk6W119KSksVm89UXIoKGZ1bmN0aW9uKHQsZSl7dmFyIHI9UW8oZSk7cmV0dXJuIFpzKHIpJiYocj1uKSxacyh0KT9wcih0LF9yKGUsMSxacywhMCksbG8ociwyKSk6W119KSksR289UXIoKGZ1bmN0aW9uKHQsZSl7dmFyIHI9UW8oZSk7cmV0dXJuIFpzKHIpJiYocj1uKSxacyh0KT9wcih0LF9yKGUsMSxacywhMCksbixyKTpbXX0pKTtmdW5jdGlvbiBZbyh0LGUsbil7dmFyIHI9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFyKXJldHVybi0xO3ZhciBpPW51bGw9PW4/MDp5YShuKTtyZXR1cm4gaTwwJiYoaT14bihyK2ksMCkpLFZlKHQsbG8oZSwzKSxpKX1mdW5jdGlvbiBYbyh0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFpKXJldHVybi0xO3ZhciBvPWktMTtyZXR1cm4gciE9PW4mJihvPXlhKHIpLG89cjwwP3huKGkrbywwKTp3bihvLGktMSkpLFZlKHQsbG8oZSwzKSxvLCEwKX1mdW5jdGlvbiBXbyh0KXtyZXR1cm4obnVsbD09dD8wOnQubGVuZ3RoKT9fcih0LDEpOltdfWZ1bmN0aW9uIEhvKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD90WzBdOm59dmFyIFpvPVFyKChmdW5jdGlvbih0KXt2YXIgZT1SZSh0LF9pKTtyZXR1cm4gZS5sZW5ndGgmJmVbMF09PT10WzBdP0ZyKGUpOltdfSkpLEtvPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KSxyPVJlKHQsX2kpO3JldHVybiBlPT09UW8ocik/ZT1uOnIucG9wKCksci5sZW5ndGgmJnJbMF09PT10WzBdP0ZyKHIsbG8oZSwyKSk6W119KSksSm89UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpLHI9UmUodCxfaSk7cmV0dXJuKGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuKSYmci5wb3AoKSxyLmxlbmd0aCYmclswXT09PXRbMF0/RnIocixuLGUpOltdfSkpO2Z1bmN0aW9uIFFvKHQpe3ZhciBlPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gZT90W2UtMV06bn12YXIgJG89UXIodHMpO2Z1bmN0aW9uIHRzKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoJiZlJiZlLmxlbmd0aD9Icih0LGUpOnR9dmFyIGVzPWlvKChmdW5jdGlvbih0LGUpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPXVyKHQsZSk7cmV0dXJuIFpyKHQsUmUoZSwoZnVuY3Rpb24odCl7cmV0dXJuIHdvKHQsbik/K3Q6dH0pKS5zb3J0KE5pKSkscn0pKTtmdW5jdGlvbiBucyh0KXtyZXR1cm4gbnVsbD09dD90OkNuLmNhbGwodCl9dmFyIHJzPVFyKChmdW5jdGlvbih0KXtyZXR1cm4gZmkoX3IodCwxLFpzLCEwKSl9KSksaXM9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpO3JldHVybiBacyhlKSYmKGU9biksZmkoX3IodCwxLFpzLCEwKSxsbyhlLDIpKX0pKSxvcz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCk7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuLGZpKF9yKHQsMSxacywhMCksbixlKX0pKTtmdW5jdGlvbiBzcyh0KXtpZighdHx8IXQubGVuZ3RoKXJldHVybltdO3ZhciBlPTA7cmV0dXJuIHQ9T2UodCwoZnVuY3Rpb24odCl7aWYoWnModCkpcmV0dXJuIGU9eG4odC5sZW5ndGgsZSksITB9KSksUWUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIFJlKHQsSGUoZSkpfSkpfWZ1bmN0aW9uIGFzKHQsZSl7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm5bXTt2YXIgcj1zcyh0KTtyZXR1cm4gbnVsbD09ZT9yOlJlKHIsKGZ1bmN0aW9uKHQpe3JldHVybiBOZShlLG4sdCl9KSl9dmFyIHVzPVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBacyh0KT9wcih0LGUpOltdfSkpLGNzPVFyKChmdW5jdGlvbih0KXtyZXR1cm4gbWkoT2UodCxacykpfSkpLGxzPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KTtyZXR1cm4gWnMoZSkmJihlPW4pLG1pKE9lKHQsWnMpLGxvKGUsMikpfSkpLGhzPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KTtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4sbWkoT2UodCxacyksbixlKX0pKSxmcz1Rcihzcyk7dmFyIHBzPVFyKChmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aCxyPWU+MT90W2UtMV06bjtyZXR1cm4gcj0iZnVuY3Rpb24iPT10eXBlb2Ygcj8odC5wb3AoKSxyKTpuLGFzKHQscil9KSk7ZnVuY3Rpb24gZHModCl7dmFyIGU9cW4odCk7cmV0dXJuIGUuX19jaGFpbl9fPSEwLGV9ZnVuY3Rpb24gZ3ModCxlKXtyZXR1cm4gZSh0KX12YXIgeXM9aW8oKGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoLHI9ZT90WzBdOjAsaT10aGlzLl9fd3JhcHBlZF9fLG89ZnVuY3Rpb24oZSl7cmV0dXJuIHVyKGUsdCl9O3JldHVybiEoZT4xfHx0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCkmJmkgaW5zdGFuY2VvZiBYbiYmd28ocik/KChpPWkuc2xpY2UociwrcisoZT8xOjApKSkuX19hY3Rpb25zX18ucHVzaCh7ZnVuYzpncyxhcmdzOltvXSx0aGlzQXJnOm59KSxuZXcgWW4oaSx0aGlzLl9fY2hhaW5fXykudGhydSgoZnVuY3Rpb24odCl7cmV0dXJuIGUmJiF0Lmxlbmd0aCYmdC5wdXNoKG4pLHR9KSkpOnRoaXMudGhydShvKX0pKTt2YXIgbXM9T2koKGZ1bmN0aW9uKHQsZSxuKXtrdC5jYWxsKHQsbik/Kyt0W25dOmFyKHQsbiwxKX0pKTt2YXIgdnM9amkoWW8pLF9zPWppKFhvKTtmdW5jdGlvbiB4cyh0LGUpe3JldHVybihYcyh0KT9NZTpkcikodCxsbyhlLDMpKX1mdW5jdGlvbiB3cyh0LGUpe3JldHVybihYcyh0KT9GZTpncikodCxsbyhlLDMpKX12YXIgYnM9T2koKGZ1bmN0aW9uKHQsZSxuKXtrdC5jYWxsKHQsbik/dFtuXS5wdXNoKGUpOmFyKHQsbixbZV0pfSkpO3ZhciBEcz1RcigoZnVuY3Rpb24odCxlLG4pe3ZhciByPS0xLGk9ImZ1bmN0aW9uIj09dHlwZW9mIGUsbz1Icyh0KT9FdCh0Lmxlbmd0aCk6W107cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQpe29bKytyXT1pP05lKGUsdCxuKTpUcih0LGUsbil9KSksb30pKSxFcz1PaSgoZnVuY3Rpb24odCxlLG4pe2FyKHQsbixlKX0pKTtmdW5jdGlvbiBDcyh0LGUpe3JldHVybihYcyh0KT9SZTpVcikodCxsbyhlLDMpKX12YXIgU3M9T2koKGZ1bmN0aW9uKHQsZSxuKXt0W24/MDoxXS5wdXNoKGUpfSksKGZ1bmN0aW9uKCl7cmV0dXJuW1tdLFtdXX0pKTt2YXIgQXM9UXIoKGZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dClyZXR1cm5bXTt2YXIgbj1lLmxlbmd0aDtyZXR1cm4gbj4xJiZibyh0LGVbMF0sZVsxXSk/ZT1bXTpuPjImJmJvKGVbMF0sZVsxXSxlWzJdKSYmKGU9W2VbMF1dKSxYcih0LF9yKGUsMSksW10pfSkpLE5zPWRlfHxmdW5jdGlvbigpe3JldHVybiB5ZS5EYXRlLm5vdygpfTtmdW5jdGlvbiBJcyh0LGUscil7cmV0dXJuIGU9cj9uOmUsZT10JiZudWxsPT1lP3QubGVuZ3RoOmUsJGkodCxjLG4sbixuLG4sZSl9ZnVuY3Rpb24gTXModCxlKXt2YXIgaTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHQocik7cmV0dXJuIHQ9eWEodCksZnVuY3Rpb24oKXtyZXR1cm4tLXQ+MCYmKGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLHQ8PTEmJihlPW4pLGl9fXZhciBGcz1RcigoZnVuY3Rpb24odCxlLG4pe3ZhciByPTE7aWYobi5sZW5ndGgpe3ZhciBpPWZuKG4sY28oRnMpKTtyfD1hfXJldHVybiAkaSh0LHIsZSxuLGkpfSkpLFRzPVFyKChmdW5jdGlvbih0LGUsbil7dmFyIHI9MztpZihuLmxlbmd0aCl7dmFyIGk9Zm4obixjbyhUcykpO3J8PWF9cmV0dXJuICRpKGUscix0LG4saSl9KSk7ZnVuY3Rpb24gT3ModCxlLGkpe3ZhciBvLHMsYSx1LGMsbCxoPTAsZj0hMSxwPSExLGQ9ITA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO2Z1bmN0aW9uIGcoZSl7dmFyIHI9byxpPXM7cmV0dXJuIG89cz1uLGg9ZSx1PXQuYXBwbHkoaSxyKX1mdW5jdGlvbiB5KHQpe3ZhciByPXQtbDtyZXR1cm4gbD09PW58fHI+PWV8fHI8MHx8cCYmdC1oPj1hfWZ1bmN0aW9uIG0oKXt2YXIgdD1OcygpO2lmKHkodCkpcmV0dXJuIHYodCk7Yz1PbyhtLGZ1bmN0aW9uKHQpe3ZhciBuPWUtKHQtbCk7cmV0dXJuIHA/d24obixhLSh0LWgpKTpufSh0KSl9ZnVuY3Rpb24gdih0KXtyZXR1cm4gYz1uLGQmJm8/Zyh0KToobz1zPW4sdSl9ZnVuY3Rpb24gXygpe3ZhciB0PU5zKCkscj15KHQpO2lmKG89YXJndW1lbnRzLHM9dGhpcyxsPXQscil7aWYoYz09PW4pcmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBoPXQsYz1PbyhtLGUpLGY/Zyh0KTp1fShsKTtpZihwKXJldHVybiBFaShjKSxjPU9vKG0sZSksZyhsKX1yZXR1cm4gYz09PW4mJihjPU9vKG0sZSkpLHV9cmV0dXJuIGU9dmEoZSl8fDAsbmEoaSkmJihmPSEhaS5sZWFkaW5nLGE9KHA9Im1heFdhaXQiaW4gaSk/eG4odmEoaS5tYXhXYWl0KXx8MCxlKTphLGQ9InRyYWlsaW5nImluIGk/ISFpLnRyYWlsaW5nOmQpLF8uY2FuY2VsPWZ1bmN0aW9uKCl7YyE9PW4mJkVpKGMpLGg9MCxvPWw9cz1jPW59LF8uZmx1c2g9ZnVuY3Rpb24oKXtyZXR1cm4gYz09PW4/dTp2KE5zKCkpfSxffXZhciBMcz1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gZnIodCwxLGUpfSkpLFBzPVFyKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIGZyKHQsdmEoZSl8fDAsbil9KSk7ZnVuY3Rpb24gUnModCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR0KHIpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLGk9ZT9lLmFwcGx5KHRoaXMscik6clswXSxvPW4uY2FjaGU7aWYoby5oYXMoaSkpcmV0dXJuIG8uZ2V0KGkpO3ZhciBzPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1vLnNldChpLHMpfHxvLHN9O3JldHVybiBuLmNhY2hlPW5ldyhScy5DYWNoZXx8Wm4pLG59ZnVuY3Rpb24gQnModCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4hdC5jYWxsKHRoaXMpO2Nhc2UgMTpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSk7Y2FzZSAyOnJldHVybiF0LmNhbGwodGhpcyxlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSxlWzFdLGVbMl0pfXJldHVybiF0LmFwcGx5KHRoaXMsZSl9fVJzLkNhY2hlPVpuO3ZhciBrcz1iaSgoZnVuY3Rpb24odCxlKXt2YXIgbj0oZT0xPT1lLmxlbmd0aCYmWHMoZVswXSk/UmUoZVswXSx0bihsbygpKSk6UmUoX3IoZSwxKSx0bihsbygpKSkpLmxlbmd0aDtyZXR1cm4gUXIoKGZ1bmN0aW9uKHIpe2Zvcih2YXIgaT0tMSxvPXduKHIubGVuZ3RoLG4pOysraTxvOylyW2ldPWVbaV0uY2FsbCh0aGlzLHJbaV0pO3JldHVybiBOZSh0LHRoaXMscil9KSl9KSksenM9UXIoKGZ1bmN0aW9uKHQsZSl7dmFyIHI9Zm4oZSxjbyh6cykpO3JldHVybiAkaSh0LGEsbixlLHIpfSkpLGpzPVFyKChmdW5jdGlvbih0LGUpe3ZhciByPWZuKGUsY28oanMpKTtyZXR1cm4gJGkodCx1LG4sZSxyKX0pKSxVcz1pbygoZnVuY3Rpb24odCxlKXtyZXR1cm4gJGkodCxsLG4sbixuLGUpfSkpO2Z1bmN0aW9uIHFzKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfXZhciBWcz1IaShOciksR3M9SGkoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+PWV9KSksWXM9T3IoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9PcjpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJmt0LmNhbGwodCwiY2FsbGVlIikmJiFKdC5jYWxsKHQsImNhbGxlZSIpfSxYcz1FdC5pc0FycmF5LFdzPWJlP3RuKGJlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJkFyKHQpPT1MfTtmdW5jdGlvbiBIcyh0KXtyZXR1cm4gbnVsbCE9dCYmZWEodC5sZW5ndGgpJiYhJHModCl9ZnVuY3Rpb24gWnModCl7cmV0dXJuIHJhKHQpJiZIcyh0KX12YXIgS3M9d2V8fHZ1LEpzPURlP3RuKERlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJkFyKHQpPT13fTtmdW5jdGlvbiBRcyh0KXtpZighcmEodCkpcmV0dXJuITE7dmFyIGU9QXIodCk7cmV0dXJuIGU9PWJ8fCJbb2JqZWN0IERPTUV4Y2VwdGlvbl0iPT1lfHwic3RyaW5nIj09dHlwZW9mIHQubWVzc2FnZSYmInN0cmluZyI9PXR5cGVvZiB0Lm5hbWUmJiFzYSh0KX1mdW5jdGlvbiAkcyh0KXtpZighbmEodCkpcmV0dXJuITE7dmFyIGU9QXIodCk7cmV0dXJuIGU9PUR8fGU9PUV8fCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgUHJveHldIj09ZX1mdW5jdGlvbiB0YSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnQ9PXlhKHQpfWZ1bmN0aW9uIGVhKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD1mfWZ1bmN0aW9uIG5hKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfWZ1bmN0aW9uIHJhKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9dmFyIGlhPUVlP3RuKEVlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJm1vKHQpPT1DfTtmdW5jdGlvbiBvYSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR8fHJhKHQpJiZBcih0KT09U31mdW5jdGlvbiBzYSh0KXtpZighcmEodCl8fEFyKHQpIT1BKXJldHVybiExO3ZhciBlPVp0KHQpO2lmKG51bGw9PT1lKXJldHVybiEwO3ZhciBuPWt0LmNhbGwoZSwiY29uc3RydWN0b3IiKSYmZS5jb25zdHJ1Y3RvcjtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgbiYmbiBpbnN0YW5jZW9mIG4mJkJ0LmNhbGwobik9PXF0fXZhciBhYT1DZT90bihDZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZBcih0KT09SX07dmFyIHVhPVNlP3RuKFNlKTpmdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJm1vKHQpPT1NfTtmdW5jdGlvbiBjYSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR8fCFYcyh0KSYmcmEodCkmJkFyKHQpPT1GfWZ1bmN0aW9uIGxhKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8cmEodCkmJkFyKHQpPT1UfXZhciBoYT1BZT90bihBZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZlYSh0Lmxlbmd0aCkmJiEhY2VbQXIodCldfTt2YXIgZmE9SGkoanIpLHBhPUhpKChmdW5jdGlvbih0LGUpe3JldHVybiB0PD1lfSkpO2Z1bmN0aW9uIGRhKHQpe2lmKCF0KXJldHVybltdO2lmKEhzKHQpKXJldHVybiBjYSh0KT9nbih0KTpGaSh0KTtpZih0ZSYmdFt0ZV0pcmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPVtdOyEoZT10Lm5leHQoKSkuZG9uZTspbi5wdXNoKGUudmFsdWUpO3JldHVybiBufSh0W3RlXSgpKTt2YXIgZT1tbyh0KTtyZXR1cm4oZT09Qz9sbjplPT1NP3BuOnFhKSh0KX1mdW5jdGlvbiBnYSh0KXtyZXR1cm4gdD8odD12YSh0KSk9PT1ofHx0PT09LWg/MTc5NzY5MzEzNDg2MjMxNTdlMjkyKih0PDA/LTE6MSk6dD09dD90OjA6MD09PXQ/dDowfWZ1bmN0aW9uIHlhKHQpe3ZhciBlPWdhKHQpLG49ZSUxO3JldHVybiBlPT1lP24/ZS1uOmU6MH1mdW5jdGlvbiBtYSh0KXtyZXR1cm4gdD9jcih5YSh0KSwwLGQpOjB9ZnVuY3Rpb24gdmEodCl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0O2lmKGxhKHQpKXJldHVybiBwO2lmKG5hKHQpKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdC52YWx1ZU9mP3QudmFsdWVPZigpOnQ7dD1uYShlKT9lKyIiOmV9aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiAwPT09dD90Oit0O3Q9JGUodCk7dmFyIG49bXQudGVzdCh0KTtyZXR1cm4gbnx8X3QudGVzdCh0KT9wZSh0LnNsaWNlKDIpLG4/Mjo4KTp5dC50ZXN0KHQpP3A6K3R9ZnVuY3Rpb24gX2EodCl7cmV0dXJuIFRpKHQsTGEodCkpfWZ1bmN0aW9uIHhhKHQpe3JldHVybiBudWxsPT10PyIiOmhpKHQpfXZhciB3YT1MaSgoZnVuY3Rpb24odCxlKXtpZihTbyhlKXx8SHMoZSkpVGkoZSxPYShlKSx0KTtlbHNlIGZvcih2YXIgbiBpbiBlKWt0LmNhbGwoZSxuKSYmcnIodCxuLGVbbl0pfSkpLGJhPUxpKChmdW5jdGlvbih0LGUpe1RpKGUsTGEoZSksdCl9KSksRGE9TGkoKGZ1bmN0aW9uKHQsZSxuLHIpe1RpKGUsTGEoZSksdCxyKX0pKSxFYT1MaSgoZnVuY3Rpb24odCxlLG4scil7VGkoZSxPYShlKSx0LHIpfSkpLENhPWlvKHVyKTt2YXIgU2E9UXIoKGZ1bmN0aW9uKHQsZSl7dD1JdCh0KTt2YXIgcj0tMSxpPWUubGVuZ3RoLG89aT4yP2VbMl06bjtmb3IobyYmYm8oZVswXSxlWzFdLG8pJiYoaT0xKTsrK3I8aTspZm9yKHZhciBzPWVbcl0sYT1MYShzKSx1PS0xLGM9YS5sZW5ndGg7Kyt1PGM7KXt2YXIgbD1hW3VdLGg9dFtsXTsoaD09PW58fHFzKGgsUHRbbF0pJiYha3QuY2FsbCh0LGwpKSYmKHRbbF09c1tsXSl9cmV0dXJuIHR9KSksQWE9UXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnB1c2gobixlbyksTmUoUmEsbix0KX0pKTtmdW5jdGlvbiBOYSh0LGUscil7dmFyIGk9bnVsbD09dD9uOkNyKHQsZSk7cmV0dXJuIGk9PT1uP3I6aX1mdW5jdGlvbiBJYSh0LGUpe3JldHVybiBudWxsIT10JiZ2byh0LGUsTXIpfXZhciBNYT1WaSgoZnVuY3Rpb24odCxlLG4pe251bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLnRvU3RyaW5nJiYoZT1VdC5jYWxsKGUpKSx0W2VdPW59KSxudShvdSkpLEZhPVZpKChmdW5jdGlvbih0LGUsbil7bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUudG9TdHJpbmcmJihlPVV0LmNhbGwoZSkpLGt0LmNhbGwodCxlKT90W2VdLnB1c2gobik6dFtlXT1bbl19KSxsbyksVGE9UXIoVHIpO2Z1bmN0aW9uIE9hKHQpe3JldHVybiBIcyh0KT9Rbih0KTprcih0KX1mdW5jdGlvbiBMYSh0KXtyZXR1cm4gSHModCk/UW4odCwhMCk6enIodCl9dmFyIFBhPUxpKChmdW5jdGlvbih0LGUsbil7R3IodCxlLG4pfSkpLFJhPUxpKChmdW5jdGlvbih0LGUsbixyKXtHcih0LGUsbixyKX0pKSxCYT1pbygoZnVuY3Rpb24odCxlKXt2YXIgbj17fTtpZihudWxsPT10KXJldHVybiBuO3ZhciByPSExO2U9UmUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGU9d2koZSx0KSxyfHwocj1lLmxlbmd0aD4xKSxlfSkpLFRpKHQsc28odCksbiksciYmKG49bHIobiw3LG5vKSk7Zm9yKHZhciBpPWUubGVuZ3RoO2ktLTspcGkobixlW2ldKTtyZXR1cm4gbn0pKTt2YXIga2E9aW8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/e306ZnVuY3Rpb24odCxlKXtyZXR1cm4gV3IodCxlLChmdW5jdGlvbihlLG4pe3JldHVybiBJYSh0LG4pfSkpfSh0LGUpfSkpO2Z1bmN0aW9uIHphKHQsZSl7aWYobnVsbD09dClyZXR1cm57fTt2YXIgbj1SZShzbyh0KSwoZnVuY3Rpb24odCl7cmV0dXJuW3RdfSkpO3JldHVybiBlPWxvKGUpLFdyKHQsbiwoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh0LG5bMF0pfSkpfXZhciBqYT1RaShPYSksVWE9UWkoTGEpO2Z1bmN0aW9uIHFhKHQpe3JldHVybiBudWxsPT10P1tdOmVuKHQsT2EodCkpfXZhciBWYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiBlPWUudG9Mb3dlckNhc2UoKSx0KyhuP0dhKGUpOmUpfSkpO2Z1bmN0aW9uIEdhKHQpe3JldHVybiBRYSh4YSh0KS50b0xvd2VyQ2FzZSgpKX1mdW5jdGlvbiBZYSh0KXtyZXR1cm4odD14YSh0KSkmJnQucmVwbGFjZSh3dCxzbikucmVwbGFjZShuZSwiIil9dmFyIFhhPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/Ii0iOiIiKStlLnRvTG93ZXJDYXNlKCl9KSksV2E9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iICI6IiIpK2UudG9Mb3dlckNhc2UoKX0pKSxIYT1CaSgidG9Mb3dlckNhc2UiKTt2YXIgWmE9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iXyI6IiIpK2UudG9Mb3dlckNhc2UoKX0pKTt2YXIgS2E9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iICI6IiIpK1FhKGUpfSkpO3ZhciBKYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyIgIjoiIikrZS50b1VwcGVyQ2FzZSgpfSkpLFFhPUJpKCJ0b1VwcGVyQ2FzZSIpO2Z1bmN0aW9uICRhKHQsZSxyKXtyZXR1cm4gdD14YSh0KSwoZT1yP246ZSk9PT1uP2Z1bmN0aW9uKHQpe3JldHVybiBzZS50ZXN0KHQpfSh0KT9mdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaChpZSl8fFtdfSh0KTpmdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaChodCl8fFtdfSh0KTp0Lm1hdGNoKGUpfHxbXX12YXIgdHU9UXIoKGZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiBOZSh0LG4sZSl9Y2F0Y2godCl7cmV0dXJuIFFzKHQpP3Q6bmV3IFN0KHQpfX0pKSxldT1pbygoZnVuY3Rpb24odCxlKXtyZXR1cm4gTWUoZSwoZnVuY3Rpb24oZSl7ZT16byhlKSxhcih0LGUsRnModFtlXSx0KSl9KSksdH0pKTtmdW5jdGlvbiBudSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIHJ1PVVpKCksaXU9VWkoITApO2Z1bmN0aW9uIG91KHQpe3JldHVybiB0fWZ1bmN0aW9uIHN1KHQpe3JldHVybiBCcigiZnVuY3Rpb24iPT10eXBlb2YgdD90OmxyKHQsMSkpfXZhciBhdT1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIFRyKG4sdCxlKX19KSksdXU9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBUcih0LG4sZSl9fSkpO2Z1bmN0aW9uIGN1KHQsZSxuKXt2YXIgcj1PYShlKSxpPUVyKGUscik7bnVsbD09biYmKCFuYShlKXx8IWkubGVuZ3RoJiZyLmxlbmd0aCkmJihuPWUsZT10LHQ9dGhpcyxpPUVyKGUsT2EoZSkpKTt2YXIgbz0hKG5hKG4pJiYiY2hhaW4iaW4gbiYmIW4uY2hhaW4pLHM9JHModCk7cmV0dXJuIE1lKGksKGZ1bmN0aW9uKG4pe3ZhciByPWVbbl07dFtuXT1yLHMmJih0LnByb3RvdHlwZVtuXT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX19jaGFpbl9fO2lmKG98fGUpe3ZhciBuPXQodGhpcy5fX3dyYXBwZWRfXyk7cmV0dXJuKG4uX19hY3Rpb25zX189RmkodGhpcy5fX2FjdGlvbnNfXykpLnB1c2goe2Z1bmM6cixhcmdzOmFyZ3VtZW50cyx0aGlzQXJnOnR9KSxuLl9fY2hhaW5fXz1lLG59cmV0dXJuIHIuYXBwbHkodCxCZShbdGhpcy52YWx1ZSgpXSxhcmd1bWVudHMpKX0pfSkpLHR9ZnVuY3Rpb24gbHUoKXt9dmFyIGh1PVlpKFJlKSxmdT1ZaShUZSkscHU9WWkoamUpO2Z1bmN0aW9uIGR1KHQpe3JldHVybiBEbyh0KT9IZSh6byh0KSk6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBDcihlLHQpfX0odCl9dmFyIGd1PVdpKCkseXU9V2koITApO2Z1bmN0aW9uIG11KCl7cmV0dXJuW119ZnVuY3Rpb24gdnUoKXtyZXR1cm4hMX12YXIgX3U9R2koKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0pLDApLHh1PUtpKCJjZWlsIiksd3U9R2koKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQvZX0pLDEpLGJ1PUtpKCJmbG9vciIpO3ZhciBEdT1HaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCplfSksMSksRXU9S2koInJvdW5kIiksQ3U9R2koKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pLDApO3JldHVybiBxbi5hZnRlcj1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUdChyKTtyZXR1cm4gdD15YSh0KSxmdW5jdGlvbigpe2lmKC0tdDwxKXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LHFuLmFyeT1Jcyxxbi5hc3NpZ249d2EscW4uYXNzaWduSW49YmEscW4uYXNzaWduSW5XaXRoPURhLHFuLmFzc2lnbldpdGg9RWEscW4uYXQ9Q2EscW4uYmVmb3JlPU1zLHFuLmJpbmQ9RnMscW4uYmluZEFsbD1ldSxxbi5iaW5kS2V5PVRzLHFuLmNhc3RBcnJheT1mdW5jdGlvbigpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltdO3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gWHModCk/dDpbdF19LHFuLmNoYWluPWRzLHFuLmNodW5rPWZ1bmN0aW9uKHQsZSxyKXtlPShyP2JvKHQsZSxyKTplPT09bik/MTp4bih5YShlKSwwKTt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7aWYoIWl8fGU8MSlyZXR1cm5bXTtmb3IodmFyIG89MCxzPTAsYT1FdChtZShpL2UpKTtvPGk7KWFbcysrXT1vaSh0LG8sbys9ZSk7cmV0dXJuIGF9LHFuLmNvbXBhY3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLHI9MCxpPVtdOysrZTxuOyl7dmFyIG89dFtlXTtvJiYoaVtyKytdPW8pfXJldHVybiBpfSxxbi5jb25jYXQ9ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoO2lmKCF0KXJldHVybltdO2Zvcih2YXIgZT1FdCh0LTEpLG49YXJndW1lbnRzWzBdLHI9dDtyLS07KWVbci0xXT1hcmd1bWVudHNbcl07cmV0dXJuIEJlKFhzKG4pP0ZpKG4pOltuXSxfcihlLDEpKX0scW4uY29uZD1mdW5jdGlvbih0KXt2YXIgZT1udWxsPT10PzA6dC5sZW5ndGgsbj1sbygpO3JldHVybiB0PWU/UmUodCwoZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHRbMV0pdGhyb3cgbmV3IFR0KHIpO3JldHVybltuKHRbMF0pLHRbMV1dfSkpOltdLFFyKChmdW5jdGlvbihuKXtmb3IodmFyIHI9LTE7KytyPGU7KXt2YXIgaT10W3JdO2lmKE5lKGlbMF0sdGhpcyxuKSlyZXR1cm4gTmUoaVsxXSx0aGlzLG4pfX0pKX0scW4uY29uZm9ybXM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPU9hKHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gaHIobix0LGUpfX0obHIodCwxKSl9LHFuLmNvbnN0YW50PW51LHFuLmNvdW50Qnk9bXMscW4uY3JlYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49Vm4odCk7cmV0dXJuIG51bGw9PWU/bjpzcihuLGUpfSxxbi5jdXJyeT1mdW5jdGlvbiB0KGUscixpKXt2YXIgbz0kaShlLDgsbixuLG4sbixuLHI9aT9uOnIpO3JldHVybiBvLnBsYWNlaG9sZGVyPXQucGxhY2Vob2xkZXIsb30scW4uY3VycnlSaWdodD1mdW5jdGlvbiB0KGUscixpKXt2YXIgbz0kaShlLHMsbixuLG4sbixuLHI9aT9uOnIpO3JldHVybiBvLnBsYWNlaG9sZGVyPXQucGxhY2Vob2xkZXIsb30scW4uZGVib3VuY2U9T3MscW4uZGVmYXVsdHM9U2EscW4uZGVmYXVsdHNEZWVwPUFhLHFuLmRlZmVyPUxzLHFuLmRlbGF5PVBzLHFuLmRpZmZlcmVuY2U9cW8scW4uZGlmZmVyZW5jZUJ5PVZvLHFuLmRpZmZlcmVuY2VXaXRoPUdvLHFuLmRyb3A9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gaT9vaSh0LChlPXJ8fGU9PT1uPzE6eWEoZSkpPDA/MDplLGkpOltdfSxxbi5kcm9wUmlnaHQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gaT9vaSh0LDAsKGU9aS0oZT1yfHxlPT09bj8xOnlhKGUpKSk8MD8wOmUpOltdfSxxbi5kcm9wUmlnaHRXaGlsZT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9naSh0LGxvKGUsMyksITAsITApOltdfSxxbi5kcm9wV2hpbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/Z2kodCxsbyhlLDMpLCEwKTpbXX0scW4uZmlsbD1mdW5jdGlvbih0LGUscixpKXt2YXIgbz1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIG8/KHImJiJudW1iZXIiIT10eXBlb2YgciYmYm8odCxlLHIpJiYocj0wLGk9byksZnVuY3Rpb24odCxlLHIsaSl7dmFyIG89dC5sZW5ndGg7Zm9yKChyPXlhKHIpKTwwJiYocj0tcj5vPzA6bytyKSwoaT1pPT09bnx8aT5vP286eWEoaSkpPDAmJihpKz1vKSxpPXI+aT8wOm1hKGkpO3I8aTspdFtyKytdPWU7cmV0dXJuIHR9KHQsZSxyLGkpKTpbXX0scW4uZmlsdGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuKFhzKHQpP09lOnZyKSh0LGxvKGUsMykpfSxxbi5mbGF0TWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIF9yKENzKHQsZSksMSl9LHFuLmZsYXRNYXBEZWVwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIF9yKENzKHQsZSksaCl9LHFuLmZsYXRNYXBEZXB0aD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHI9cj09PW4/MTp5YShyKSxfcihDcyh0LGUpLHIpfSxxbi5mbGF0dGVuPVdvLHFuLmZsYXR0ZW5EZWVwPWZ1bmN0aW9uKHQpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP19yKHQsaCk6W119LHFuLmZsYXR0ZW5EZXB0aD1mdW5jdGlvbih0LGUpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP19yKHQsZT1lPT09bj8xOnlhKGUpKTpbXX0scW4uZmxpcD1mdW5jdGlvbih0KXtyZXR1cm4gJGkodCw1MTIpfSxxbi5mbG93PXJ1LHFuLmZsb3dSaWdodD1pdSxxbi5mcm9tUGFpcnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLHI9e307KytlPG47KXt2YXIgaT10W2VdO3JbaVswXV09aVsxXX1yZXR1cm4gcn0scW4uZnVuY3Rpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOkVyKHQsT2EodCkpfSxxbi5mdW5jdGlvbnNJbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXTpFcih0LExhKHQpKX0scW4uZ3JvdXBCeT1icyxxbi5pbml0aWFsPWZ1bmN0aW9uKHQpe3JldHVybihudWxsPT10PzA6dC5sZW5ndGgpP29pKHQsMCwtMSk6W119LHFuLmludGVyc2VjdGlvbj1abyxxbi5pbnRlcnNlY3Rpb25CeT1Lbyxxbi5pbnRlcnNlY3Rpb25XaXRoPUpvLHFuLmludmVydD1NYSxxbi5pbnZlcnRCeT1GYSxxbi5pbnZva2VNYXA9RHMscW4uaXRlcmF0ZWU9c3UscW4ua2V5Qnk9RXMscW4ua2V5cz1PYSxxbi5rZXlzSW49TGEscW4ubWFwPUNzLHFuLm1hcEtleXM9ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtyZXR1cm4gZT1sbyhlLDMpLGJyKHQsKGZ1bmN0aW9uKHQscixpKXthcihuLGUodCxyLGkpLHQpfSkpLG59LHFuLm1hcFZhbHVlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXt9O3JldHVybiBlPWxvKGUsMyksYnIodCwoZnVuY3Rpb24odCxyLGkpe2FyKG4scixlKHQscixpKSl9KSksbn0scW4ubWF0Y2hlcz1mdW5jdGlvbih0KXtyZXR1cm4gcXIobHIodCwxKSl9LHFuLm1hdGNoZXNQcm9wZXJ0eT1mdW5jdGlvbih0LGUpe3JldHVybiBWcih0LGxyKGUsMSkpfSxxbi5tZW1vaXplPVJzLHFuLm1lcmdlPVBhLHFuLm1lcmdlV2l0aD1SYSxxbi5tZXRob2Q9YXUscW4ubWV0aG9kT2Y9dXUscW4ubWl4aW49Y3UscW4ubmVnYXRlPUJzLHFuLm50aEFyZz1mdW5jdGlvbih0KXtyZXR1cm4gdD15YSh0KSxRcigoZnVuY3Rpb24oZSl7cmV0dXJuIFlyKGUsdCl9KSl9LHFuLm9taXQ9QmEscW4ub21pdEJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHphKHQsQnMobG8oZSkpKX0scW4ub25jZT1mdW5jdGlvbih0KXtyZXR1cm4gTXMoMix0KX0scW4ub3JkZXJCeT1mdW5jdGlvbih0LGUscixpKXtyZXR1cm4gbnVsbD09dD9bXTooWHMoZSl8fChlPW51bGw9PWU/W106W2VdKSxYcyhyPWk/bjpyKXx8KHI9bnVsbD09cj9bXTpbcl0pLFhyKHQsZSxyKSl9LHFuLm92ZXI9aHUscW4ub3ZlckFyZ3M9a3MscW4ub3ZlckV2ZXJ5PWZ1LHFuLm92ZXJTb21lPXB1LHFuLnBhcnRpYWw9enMscW4ucGFydGlhbFJpZ2h0PWpzLHFuLnBhcnRpdGlvbj1Tcyxxbi5waWNrPWthLHFuLnBpY2tCeT16YSxxbi5wcm9wZXJ0eT1kdSxxbi5wcm9wZXJ0eU9mPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09dD9uOkNyKHQsZSl9fSxxbi5wdWxsPSRvLHFuLnB1bGxBbGw9dHMscW4ucHVsbEFsbEJ5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCYmdC5sZW5ndGgmJmUmJmUubGVuZ3RoP0hyKHQsZSxsbyhuLDIpKTp0fSxxbi5wdWxsQWxsV2l0aD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQmJnQubGVuZ3RoJiZlJiZlLmxlbmd0aD9Icih0LGUsbixyKTp0fSxxbi5wdWxsQXQ9ZXMscW4ucmFuZ2U9Z3UscW4ucmFuZ2VSaWdodD15dSxxbi5yZWFyZz1Vcyxxbi5yZWplY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4oWHModCk/T2U6dnIpKHQsQnMobG8oZSwzKSkpfSxxbi5yZW1vdmU9ZnVuY3Rpb24odCxlKXt2YXIgbj1bXTtpZighdHx8IXQubGVuZ3RoKXJldHVybiBuO3ZhciByPS0xLGk9W10sbz10Lmxlbmd0aDtmb3IoZT1sbyhlLDMpOysrcjxvOyl7dmFyIHM9dFtyXTtlKHMscix0KSYmKG4ucHVzaChzKSxpLnB1c2gocikpfXJldHVybiBacih0LGkpLG59LHFuLnJlc3Q9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7cmV0dXJuIFFyKHQsZT1lPT09bj9lOnlhKGUpKX0scW4ucmV2ZXJzZT1ucyxxbi5zYW1wbGVTaXplPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZT0ocj9ibyh0LGUscik6ZT09PW4pPzE6eWEoZSksKFhzKHQpP3RyOnRpKSh0LGUpfSxxbi5zZXQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT10P3Q6ZWkodCxlLG4pfSxxbi5zZXRXaXRoPWZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiBpP2k6bixudWxsPT10P3Q6ZWkodCxlLHIsaSl9LHFuLnNodWZmbGU9ZnVuY3Rpb24odCl7cmV0dXJuKFhzKHQpP2VyOmlpKSh0KX0scW4uc2xpY2U9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gaT8ociYmIm51bWJlciIhPXR5cGVvZiByJiZibyh0LGUscik/KGU9MCxyPWkpOihlPW51bGw9PWU/MDp5YShlKSxyPXI9PT1uP2k6eWEocikpLG9pKHQsZSxyKSk6W119LHFuLnNvcnRCeT1Bcyxxbi5zb3J0ZWRVbmlxPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9jaSh0KTpbXX0scW4uc29ydGVkVW5pcUJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2NpKHQsbG8oZSwyKSk6W119LHFuLnNwbGl0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gciYmIm51bWJlciIhPXR5cGVvZiByJiZibyh0LGUscikmJihlPXI9biksKHI9cj09PW4/ZDpyPj4+MCk/KHQ9eGEodCkpJiYoInN0cmluZyI9PXR5cGVvZiBlfHxudWxsIT1lJiYhYWEoZSkpJiYoIShlPWhpKGUpKSYmY24odCkpP0RpKGduKHQpLDAscik6dC5zcGxpdChlLHIpOltdfSxxbi5zcHJlYWQ9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7cmV0dXJuIGU9bnVsbD09ZT8wOnhuKHlhKGUpLDApLFFyKChmdW5jdGlvbihuKXt2YXIgcj1uW2VdLGk9RGkobiwwLGUpO3JldHVybiByJiZCZShpLHIpLE5lKHQsdGhpcyxpKX0pKX0scW4udGFpbD1mdW5jdGlvbih0KXt2YXIgZT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGU/b2kodCwxLGUpOltdfSxxbi50YWtlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdCYmdC5sZW5ndGg/b2kodCwwLChlPXJ8fGU9PT1uPzE6eWEoZSkpPDA/MDplKTpbXX0scW4udGFrZVJpZ2h0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGk/b2kodCwoZT1pLShlPXJ8fGU9PT1uPzE6eWEoZSkpKTwwPzA6ZSxpKTpbXX0scW4udGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/Z2kodCxsbyhlLDMpLCExLCEwKTpbXX0scW4udGFrZVdoaWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2dpKHQsbG8oZSwzKSk6W119LHFuLnRhcD1mdW5jdGlvbih0LGUpe3JldHVybiBlKHQpLHR9LHFuLnRocm90dGxlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0hMCxvPSEwO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtyZXR1cm4gbmEobikmJihpPSJsZWFkaW5nImluIG4/ISFuLmxlYWRpbmc6aSxvPSJ0cmFpbGluZyJpbiBuPyEhbi50cmFpbGluZzpvKSxPcyh0LGUse2xlYWRpbmc6aSxtYXhXYWl0OmUsdHJhaWxpbmc6b30pfSxxbi50aHJ1PWdzLHFuLnRvQXJyYXk9ZGEscW4udG9QYWlycz1qYSxxbi50b1BhaXJzSW49VWEscW4udG9QYXRoPWZ1bmN0aW9uKHQpe3JldHVybiBYcyh0KT9SZSh0LHpvKTpsYSh0KT9bdF06Rmkoa28oeGEodCkpKX0scW4udG9QbGFpbk9iamVjdD1fYSxxbi50cmFuc2Zvcm09ZnVuY3Rpb24odCxlLG4pe3ZhciByPVhzKHQpLGk9cnx8S3ModCl8fGhhKHQpO2lmKGU9bG8oZSw0KSxudWxsPT1uKXt2YXIgbz10JiZ0LmNvbnN0cnVjdG9yO249aT9yP25ldyBvOltdOm5hKHQpJiYkcyhvKT9WbihadCh0KSk6e319cmV0dXJuKGk/TWU6YnIpKHQsKGZ1bmN0aW9uKHQscixpKXtyZXR1cm4gZShuLHQscixpKX0pKSxufSxxbi51bmFyeT1mdW5jdGlvbih0KXtyZXR1cm4gSXModCwxKX0scW4udW5pb249cnMscW4udW5pb25CeT1pcyxxbi51bmlvbldpdGg9b3MscW4udW5pcT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/ZmkodCk6W119LHFuLnVuaXFCeT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9maSh0LGxvKGUsMikpOltdfSxxbi51bmlxV2l0aD1mdW5jdGlvbih0LGUpe3JldHVybiBlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bix0JiZ0Lmxlbmd0aD9maSh0LG4sZSk6W119LHFuLnVuc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXR8fHBpKHQsZSl9LHFuLnVuemlwPXNzLHFuLnVuemlwV2l0aD1hcyxxbi51cGRhdGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT10P3Q6ZGkodCxlLHhpKG4pKX0scW4udXBkYXRlV2l0aD1mdW5jdGlvbih0LGUscixpKXtyZXR1cm4gaT0iZnVuY3Rpb24iPT10eXBlb2YgaT9pOm4sbnVsbD09dD90OmRpKHQsZSx4aShyKSxpKX0scW4udmFsdWVzPXFhLHFuLnZhbHVlc0luPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1tdOmVuKHQsTGEodCkpfSxxbi53aXRob3V0PXVzLHFuLndvcmRzPSRhLHFuLndyYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4genMoeGkoZSksdCl9LHFuLnhvcj1jcyxxbi54b3JCeT1scyxxbi54b3JXaXRoPWhzLHFuLnppcD1mcyxxbi56aXBPYmplY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdmkodHx8W10sZXx8W10scnIpfSxxbi56aXBPYmplY3REZWVwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZpKHR8fFtdLGV8fFtdLGVpKX0scW4uemlwV2l0aD1wcyxxbi5lbnRyaWVzPWphLHFuLmVudHJpZXNJbj1VYSxxbi5leHRlbmQ9YmEscW4uZXh0ZW5kV2l0aD1EYSxjdShxbixxbikscW4uYWRkPV91LHFuLmF0dGVtcHQ9dHUscW4uY2FtZWxDYXNlPVZhLHFuLmNhcGl0YWxpemU9R2EscW4uY2VpbD14dSxxbi5jbGFtcD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHI9PT1uJiYocj1lLGU9biksciE9PW4mJihyPShyPXZhKHIpKT09cj9yOjApLGUhPT1uJiYoZT0oZT12YShlKSk9PWU/ZTowKSxjcih2YSh0KSxlLHIpfSxxbi5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gbHIodCw0KX0scW4uY2xvbmVEZWVwPWZ1bmN0aW9uKHQpe3JldHVybiBscih0LDUpfSxxbi5jbG9uZURlZXBXaXRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGxyKHQsNSxlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bil9LHFuLmNsb25lV2l0aD1mdW5jdGlvbih0LGUpe3JldHVybiBscih0LDQsZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4pfSxxbi5jb25mb3Jtc1RvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PWV8fGhyKHQsZSxPYShlKSl9LHFuLmRlYnVycj1ZYSxxbi5kZWZhdWx0VG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dHx8dCE9dD9lOnR9LHFuLmRpdmlkZT13dSxxbi5lbmRzV2l0aD1mdW5jdGlvbih0LGUscil7dD14YSh0KSxlPWhpKGUpO3ZhciBpPXQubGVuZ3RoLG89cj1yPT09bj9pOmNyKHlhKHIpLDAsaSk7cmV0dXJuKHItPWUubGVuZ3RoKT49MCYmdC5zbGljZShyLG8pPT1lfSxxbi5lcT1xcyxxbi5lc2NhcGU9ZnVuY3Rpb24odCl7cmV0dXJuKHQ9eGEodCkpJiZKLnRlc3QodCk/dC5yZXBsYWNlKFosYW4pOnR9LHFuLmVzY2FwZVJlZ0V4cD1mdW5jdGlvbih0KXtyZXR1cm4odD14YSh0KSkmJm90LnRlc3QodCk/dC5yZXBsYWNlKGl0LCJcXCQmIik6dH0scW4uZXZlcnk9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPVhzKHQpP1RlOnlyO3JldHVybiByJiZibyh0LGUscikmJihlPW4pLGkodCxsbyhlLDMpKX0scW4uZmluZD12cyxxbi5maW5kSW5kZXg9WW8scW4uZmluZEtleT1mdW5jdGlvbih0LGUpe3JldHVybiBxZSh0LGxvKGUsMyksYnIpfSxxbi5maW5kTGFzdD1fcyxxbi5maW5kTGFzdEluZGV4PVhvLHFuLmZpbmRMYXN0S2V5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHFlKHQsbG8oZSwzKSxEcil9LHFuLmZsb29yPWJ1LHFuLmZvckVhY2g9eHMscW4uZm9yRWFjaFJpZ2h0PXdzLHFuLmZvckluPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dDp4cih0LGxvKGUsMyksTGEpfSxxbi5mb3JJblJpZ2h0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dDp3cih0LGxvKGUsMyksTGEpfSxxbi5mb3JPd249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmYnIodCxsbyhlLDMpKX0scW4uZm9yT3duUmlnaHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmRHIodCxsbyhlLDMpKX0scW4uZ2V0PU5hLHFuLmd0PVZzLHFuLmd0ZT1Hcyxxbi5oYXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmdm8odCxlLElyKX0scW4uaGFzSW49SWEscW4uaGVhZD1Ibyxxbi5pZGVudGl0eT1vdSxxbi5pbmNsdWRlcz1mdW5jdGlvbih0LGUsbixyKXt0PUhzKHQpP3Q6cWEodCksbj1uJiYhcj95YShuKTowO3ZhciBpPXQubGVuZ3RoO3JldHVybiBuPDAmJihuPXhuKGkrbiwwKSksY2EodCk/bjw9aSYmdC5pbmRleE9mKGUsbik+LTE6ISFpJiZHZSh0LGUsbik+LTF9LHFuLmluZGV4T2Y9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgaT1udWxsPT1uPzA6eWEobik7cmV0dXJuIGk8MCYmKGk9eG4ocitpLDApKSxHZSh0LGUsaSl9LHFuLmluUmFuZ2U9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBlPWdhKGUpLHI9PT1uPyhyPWUsZT0wKTpyPWdhKHIpLGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD49d24oZSxuKSYmdDx4bihlLG4pfSh0PXZhKHQpLGUscil9LHFuLmludm9rZT1UYSxxbi5pc0FyZ3VtZW50cz1Zcyxxbi5pc0FycmF5PVhzLHFuLmlzQXJyYXlCdWZmZXI9V3MscW4uaXNBcnJheUxpa2U9SHMscW4uaXNBcnJheUxpa2VPYmplY3Q9WnMscW4uaXNCb29sZWFuPWZ1bmN0aW9uKHQpe3JldHVybiEwPT09dHx8ITE9PT10fHxyYSh0KSYmQXIodCk9PXh9LHFuLmlzQnVmZmVyPUtzLHFuLmlzRGF0ZT1Kcyxxbi5pc0VsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiYxPT09dC5ub2RlVHlwZSYmIXNhKHQpfSxxbi5pc0VtcHR5PWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuITA7aWYoSHModCkmJihYcyh0KXx8InN0cmluZyI9PXR5cGVvZiB0fHwiZnVuY3Rpb24iPT10eXBlb2YgdC5zcGxpY2V8fEtzKHQpfHxoYSh0KXx8WXModCkpKXJldHVybiF0Lmxlbmd0aDt2YXIgZT1tbyh0KTtpZihlPT1DfHxlPT1NKXJldHVybiF0LnNpemU7aWYoU28odCkpcmV0dXJuIWtyKHQpLmxlbmd0aDtmb3IodmFyIG4gaW4gdClpZihrdC5jYWxsKHQsbikpcmV0dXJuITE7cmV0dXJuITB9LHFuLmlzRXF1YWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTHIodCxlKX0scW4uaXNFcXVhbFdpdGg9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPShyPSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6bik/cih0LGUpOm47cmV0dXJuIGk9PT1uP0xyKHQsZSxuLHIpOiEhaX0scW4uaXNFcnJvcj1Rcyxxbi5pc0Zpbml0ZT1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJlVlKHQpfSxxbi5pc0Z1bmN0aW9uPSRzLHFuLmlzSW50ZWdlcj10YSxxbi5pc0xlbmd0aD1lYSxxbi5pc01hcD1pYSxxbi5pc01hdGNoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxQcih0LGUsZm8oZSkpfSxxbi5pc01hdGNoV2l0aD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHI9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjpuLFByKHQsZSxmbyhlKSxyKX0scW4uaXNOYU49ZnVuY3Rpb24odCl7cmV0dXJuIG9hKHQpJiZ0IT0rdH0scW4uaXNOYXRpdmU9ZnVuY3Rpb24odCl7aWYoQ28odCkpdGhyb3cgbmV3IFN0KCJVbnN1cHBvcnRlZCBjb3JlLWpzIHVzZS4gVHJ5IGh0dHBzOi8vbnBtcy5pby9zZWFyY2g/cT1wb255ZmlsbC4iKTtyZXR1cm4gUnIodCl9LHFuLmlzTmlsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fSxxbi5pc051bGw9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PT10fSxxbi5pc051bWJlcj1vYSxxbi5pc09iamVjdD1uYSxxbi5pc09iamVjdExpa2U9cmEscW4uaXNQbGFpbk9iamVjdD1zYSxxbi5pc1JlZ0V4cD1hYSxxbi5pc1NhZmVJbnRlZ2VyPWZ1bmN0aW9uKHQpe3JldHVybiB0YSh0KSYmdD49LWYmJnQ8PWZ9LHFuLmlzU2V0PXVhLHFuLmlzU3RyaW5nPWNhLHFuLmlzU3ltYm9sPWxhLHFuLmlzVHlwZWRBcnJheT1oYSxxbi5pc1VuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PW59LHFuLmlzV2Vha01hcD1mdW5jdGlvbih0KXtyZXR1cm4gcmEodCkmJm1vKHQpPT1PfSxxbi5pc1dlYWtTZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiYiW29iamVjdCBXZWFrU2V0XSI9PUFyKHQpfSxxbi5qb2luPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/IiI6WmUuY2FsbCh0LGUpfSxxbi5rZWJhYkNhc2U9WGEscW4ubGFzdD1Rbyxxbi5sYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFpKXJldHVybi0xO3ZhciBvPWk7cmV0dXJuIHIhPT1uJiYobz0obz15YShyKSk8MD94bihpK28sMCk6d24obyxpLTEpKSxlPT1lP2Z1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bisxO3ItLTspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuIHJ9KHQsZSxvKTpWZSh0LFhlLG8sITApfSxxbi5sb3dlckNhc2U9V2EscW4ubG93ZXJGaXJzdD1IYSxxbi5sdD1mYSxxbi5sdGU9cGEscW4ubWF4PWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9tcih0LG91LE5yKTpufSxxbi5tYXhCeT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9tcih0LGxvKGUsMiksTnIpOm59LHFuLm1lYW49ZnVuY3Rpb24odCl7cmV0dXJuIFdlKHQsb3UpfSxxbi5tZWFuQnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gV2UodCxsbyhlLDIpKX0scW4ubWluPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9tcih0LG91LGpyKTpufSxxbi5taW5CeT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9tcih0LGxvKGUsMiksanIpOm59LHFuLnN0dWJBcnJheT1tdSxxbi5zdHViRmFsc2U9dnUscW4uc3R1Yk9iamVjdD1mdW5jdGlvbigpe3JldHVybnt9fSxxbi5zdHViU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIiJ9LHFuLnN0dWJUcnVlPWZ1bmN0aW9uKCl7cmV0dXJuITB9LHFuLm11bHRpcGx5PUR1LHFuLm50aD1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9Zcih0LHlhKGUpKTpufSxxbi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHllLl89PT10aGlzJiYoeWUuXz1WdCksdGhpc30scW4ubm9vcD1sdSxxbi5ub3c9TnMscW4ucGFkPWZ1bmN0aW9uKHQsZSxuKXt0PXhhKHQpO3ZhciByPShlPXlhKGUpKT9kbih0KTowO2lmKCFlfHxyPj1lKXJldHVybiB0O3ZhciBpPShlLXIpLzI7cmV0dXJuIFhpKHZlKGkpLG4pK3QrWGkobWUoaSksbil9LHFuLnBhZEVuZD1mdW5jdGlvbih0LGUsbil7dD14YSh0KTt2YXIgcj0oZT15YShlKSk/ZG4odCk6MDtyZXR1cm4gZSYmcjxlP3QrWGkoZS1yLG4pOnR9LHFuLnBhZFN0YXJ0PWZ1bmN0aW9uKHQsZSxuKXt0PXhhKHQpO3ZhciByPShlPXlhKGUpKT9kbih0KTowO3JldHVybiBlJiZyPGU/WGkoZS1yLG4pK3Q6dH0scW4ucGFyc2VJbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBufHxudWxsPT1lP2U9MDplJiYoZT0rZSksRG4oeGEodCkucmVwbGFjZShzdCwiIiksZXx8MCl9LHFuLnJhbmRvbT1mdW5jdGlvbih0LGUscil7aWYociYmImJvb2xlYW4iIT10eXBlb2YgciYmYm8odCxlLHIpJiYoZT1yPW4pLHI9PT1uJiYoImJvb2xlYW4iPT10eXBlb2YgZT8ocj1lLGU9bik6ImJvb2xlYW4iPT10eXBlb2YgdCYmKHI9dCx0PW4pKSx0PT09biYmZT09PW4/KHQ9MCxlPTEpOih0PWdhKHQpLGU9PT1uPyhlPXQsdD0wKTplPWdhKGUpKSx0PmUpe3ZhciBpPXQ7dD1lLGU9aX1pZihyfHx0JTF8fGUlMSl7dmFyIG89RW4oKTtyZXR1cm4gd24odCtvKihlLXQrZmUoIjFlLSIrKChvKyIiKS5sZW5ndGgtMSkpKSxlKX1yZXR1cm4gS3IodCxlKX0scW4ucmVkdWNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1Ycyh0KT9rZTpLZSxpPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gcih0LGxvKGUsNCksbixpLGRyKX0scW4ucmVkdWNlUmlnaHQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVhzKHQpP3plOktlLGk9YXJndW1lbnRzLmxlbmd0aDwzO3JldHVybiByKHQsbG8oZSw0KSxuLGksZ3IpfSxxbi5yZXBlYXQ9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBlPShyP2JvKHQsZSxyKTplPT09bik/MTp5YShlKSxKcih4YSh0KSxlKX0scW4ucmVwbGFjZT1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cyxlPXhhKHRbMF0pO3JldHVybiB0Lmxlbmd0aDwzP2U6ZS5yZXBsYWNlKHRbMV0sdFsyXSl9LHFuLnJlc3VsdD1mdW5jdGlvbih0LGUscil7dmFyIGk9LTEsbz0oZT13aShlLHQpKS5sZW5ndGg7Zm9yKG98fChvPTEsdD1uKTsrK2k8bzspe3ZhciBzPW51bGw9PXQ/bjp0W3pvKGVbaV0pXTtzPT09biYmKGk9byxzPXIpLHQ9JHMocyk/cy5jYWxsKHQpOnN9cmV0dXJuIHR9LHFuLnJvdW5kPUV1LHFuLnJ1bkluQ29udGV4dD10LHFuLnNhbXBsZT1mdW5jdGlvbih0KXtyZXR1cm4oWHModCk/JG46JHIpKHQpfSxxbi5zaXplPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIDA7aWYoSHModCkpcmV0dXJuIGNhKHQpP2RuKHQpOnQubGVuZ3RoO3ZhciBlPW1vKHQpO3JldHVybiBlPT1DfHxlPT1NP3Quc2l6ZTprcih0KS5sZW5ndGh9LHFuLnNuYWtlQ2FzZT1aYSxxbi5zb21lPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1Ycyh0KT9qZTpzaTtyZXR1cm4gciYmYm8odCxlLHIpJiYoZT1uKSxpKHQsbG8oZSwzKSl9LHFuLnNvcnRlZEluZGV4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFpKHQsZSl9LHFuLnNvcnRlZEluZGV4Qnk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1aSh0LGUsbG8obiwyKSl9LHFuLnNvcnRlZEluZGV4T2Y9ZnVuY3Rpb24odCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGg7aWYobil7dmFyIHI9YWkodCxlKTtpZihyPG4mJnFzKHRbcl0sZSkpcmV0dXJuIHJ9cmV0dXJuLTF9LHFuLnNvcnRlZExhc3RJbmRleD1mdW5jdGlvbih0LGUpe3JldHVybiBhaSh0LGUsITApfSxxbi5zb3J0ZWRMYXN0SW5kZXhCeT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHVpKHQsZSxsbyhuLDIpLCEwKX0scW4uc29ydGVkTGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlKXtpZihudWxsPT10PzA6dC5sZW5ndGgpe3ZhciBuPWFpKHQsZSwhMCktMTtpZihxcyh0W25dLGUpKXJldHVybiBufXJldHVybi0xfSxxbi5zdGFydENhc2U9S2EscW4uc3RhcnRzV2l0aD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9eGEodCksbj1udWxsPT1uPzA6Y3IoeWEobiksMCx0Lmxlbmd0aCksZT1oaShlKSx0LnNsaWNlKG4sbitlLmxlbmd0aCk9PWV9LHFuLnN1YnRyYWN0PUN1LHFuLnN1bT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/SmUodCxvdSk6MH0scW4uc3VtQnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/SmUodCxsbyhlLDIpKTowfSxxbi50ZW1wbGF0ZT1mdW5jdGlvbih0LGUscil7dmFyIGk9cW4udGVtcGxhdGVTZXR0aW5ncztyJiZibyh0LGUscikmJihlPW4pLHQ9eGEodCksZT1EYSh7fSxlLGksdG8pO3ZhciBvLHMsYT1EYSh7fSxlLmltcG9ydHMsaS5pbXBvcnRzLHRvKSx1PU9hKGEpLGM9ZW4oYSx1KSxsPTAsaD1lLmludGVycG9sYXRlfHxidCxmPSJfX3AgKz0gJyIscD1NdCgoZS5lc2NhcGV8fGJ0KS5zb3VyY2UrInwiK2guc291cmNlKyJ8IisoaD09PXR0P2R0OmJ0KS5zb3VyY2UrInwiKyhlLmV2YWx1YXRlfHxidCkuc291cmNlKyJ8JCIsImciKSxkPSIvLyMgc291cmNlVVJMPSIrKGt0LmNhbGwoZSwic291cmNlVVJMIik/KGUuc291cmNlVVJMKyIiKS5yZXBsYWNlKC9ccy9nLCIgIik6ImxvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbIisgKyt1ZSsiXSIpKyJcbiI7dC5yZXBsYWNlKHAsKGZ1bmN0aW9uKGUsbixyLGksYSx1KXtyZXR1cm4gcnx8KHI9aSksZis9dC5zbGljZShsLHUpLnJlcGxhY2UoRHQsdW4pLG4mJihvPSEwLGYrPSInICtcbl9fZSgiK24rIikgK1xuJyIpLGEmJihzPSEwLGYrPSInO1xuIithKyI7XG5fX3AgKz0gJyIpLHImJihmKz0iJyArXG4oKF9fdCA9ICgiK3IrIikpID09IG51bGwgPyAnJyA6IF9fdCkgK1xuJyIpLGw9dStlLmxlbmd0aCxlfSkpLGYrPSInO1xuIjt2YXIgZz1rdC5jYWxsKGUsInZhcmlhYmxlIikmJmUudmFyaWFibGU7aWYoZyl7aWYoZnQudGVzdChnKSl0aHJvdyBuZXcgU3QoIkludmFsaWQgYHZhcmlhYmxlYCBvcHRpb24gcGFzc2VkIGludG8gYF8udGVtcGxhdGVgIil9ZWxzZSBmPSJ3aXRoIChvYmopIHtcbiIrZisiXG59XG4iO2Y9KHM/Zi5yZXBsYWNlKFksIiIpOmYpLnJlcGxhY2UoWCwiJDEiKS5yZXBsYWNlKFcsIiQxOyIpLGY9ImZ1bmN0aW9uKCIrKGd8fCJvYmoiKSsiKSB7XG4iKyhnPyIiOiJvYmogfHwgKG9iaiA9IHt9KTtcbiIpKyJ2YXIgX190LCBfX3AgPSAnJyIrKG8/IiwgX19lID0gXy5lc2NhcGUiOiIiKSsocz8iLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcbmZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrZisicmV0dXJuIF9fcFxufSI7dmFyIHk9dHUoKGZ1bmN0aW9uKCl7cmV0dXJuIEF0KHUsZCsicmV0dXJuICIrZikuYXBwbHkobixjKX0pKTtpZih5LnNvdXJjZT1mLFFzKHkpKXRocm93IHk7cmV0dXJuIHl9LHFuLnRpbWVzPWZ1bmN0aW9uKHQsZSl7aWYoKHQ9eWEodCkpPDF8fHQ+ZilyZXR1cm5bXTt2YXIgbj1kLHI9d24odCxkKTtlPWxvKGUpLHQtPWQ7Zm9yKHZhciBpPVFlKHIsZSk7KytuPHQ7KWUobik7cmV0dXJuIGl9LHFuLnRvRmluaXRlPWdhLHFuLnRvSW50ZWdlcj15YSxxbi50b0xlbmd0aD1tYSxxbi50b0xvd2VyPWZ1bmN0aW9uKHQpe3JldHVybiB4YSh0KS50b0xvd2VyQ2FzZSgpfSxxbi50b051bWJlcj12YSxxbi50b1NhZmVJbnRlZ2VyPWZ1bmN0aW9uKHQpe3JldHVybiB0P2NyKHlhKHQpLC1mLGYpOjA9PT10P3Q6MH0scW4udG9TdHJpbmc9eGEscW4udG9VcHBlcj1mdW5jdGlvbih0KXtyZXR1cm4geGEodCkudG9VcHBlckNhc2UoKX0scW4udHJpbT1mdW5jdGlvbih0LGUscil7aWYoKHQ9eGEodCkpJiYocnx8ZT09PW4pKXJldHVybiAkZSh0KTtpZighdHx8IShlPWhpKGUpKSlyZXR1cm4gdDt2YXIgaT1nbih0KSxvPWduKGUpO3JldHVybiBEaShpLHJuKGksbyksb24oaSxvKSsxKS5qb2luKCIiKX0scW4udHJpbUVuZD1mdW5jdGlvbih0LGUscil7aWYoKHQ9eGEodCkpJiYocnx8ZT09PW4pKXJldHVybiB0LnNsaWNlKDAseW4odCkrMSk7aWYoIXR8fCEoZT1oaShlKSkpcmV0dXJuIHQ7dmFyIGk9Z24odCk7cmV0dXJuIERpKGksMCxvbihpLGduKGUpKSsxKS5qb2luKCIiKX0scW4udHJpbVN0YXJ0PWZ1bmN0aW9uKHQsZSxyKXtpZigodD14YSh0KSkmJihyfHxlPT09bikpcmV0dXJuIHQucmVwbGFjZShzdCwiIik7aWYoIXR8fCEoZT1oaShlKSkpcmV0dXJuIHQ7dmFyIGk9Z24odCk7cmV0dXJuIERpKGkscm4oaSxnbihlKSkpLmpvaW4oIiIpfSxxbi50cnVuY2F0ZT1mdW5jdGlvbih0LGUpe3ZhciByPTMwLGk9Ii4uLiI7aWYobmEoZSkpe3ZhciBvPSJzZXBhcmF0b3IiaW4gZT9lLnNlcGFyYXRvcjpvO3I9Imxlbmd0aCJpbiBlP3lhKGUubGVuZ3RoKTpyLGk9Im9taXNzaW9uImluIGU/aGkoZS5vbWlzc2lvbik6aX12YXIgcz0odD14YSh0KSkubGVuZ3RoO2lmKGNuKHQpKXt2YXIgYT1nbih0KTtzPWEubGVuZ3RofWlmKHI+PXMpcmV0dXJuIHQ7dmFyIHU9ci1kbihpKTtpZih1PDEpcmV0dXJuIGk7dmFyIGM9YT9EaShhLDAsdSkuam9pbigiIik6dC5zbGljZSgwLHUpO2lmKG89PT1uKXJldHVybiBjK2k7aWYoYSYmKHUrPWMubGVuZ3RoLXUpLGFhKG8pKXtpZih0LnNsaWNlKHUpLnNlYXJjaChvKSl7dmFyIGwsaD1jO2ZvcihvLmdsb2JhbHx8KG89TXQoby5zb3VyY2UseGEoZ3QuZXhlYyhvKSkrImciKSksby5sYXN0SW5kZXg9MDtsPW8uZXhlYyhoKTspdmFyIGY9bC5pbmRleDtjPWMuc2xpY2UoMCxmPT09bj91OmYpfX1lbHNlIGlmKHQuaW5kZXhPZihoaShvKSx1KSE9dSl7dmFyIHA9Yy5sYXN0SW5kZXhPZihvKTtwPi0xJiYoYz1jLnNsaWNlKDAscCkpfXJldHVybiBjK2l9LHFuLnVuZXNjYXBlPWZ1bmN0aW9uKHQpe3JldHVybih0PXhhKHQpKSYmSy50ZXN0KHQpP3QucmVwbGFjZShILG1uKTp0fSxxbi51bmlxdWVJZD1mdW5jdGlvbih0KXt2YXIgZT0rK3p0O3JldHVybiB4YSh0KStlfSxxbi51cHBlckNhc2U9SmEscW4udXBwZXJGaXJzdD1RYSxxbi5lYWNoPXhzLHFuLmVhY2hSaWdodD13cyxxbi5maXJzdD1IbyxjdShxbixmdW5jdGlvbigpe3ZhciB0PXt9O3JldHVybiBicihxbiwoZnVuY3Rpb24oZSxuKXtrdC5jYWxsKHFuLnByb3RvdHlwZSxuKXx8KHRbbl09ZSl9KSksdH0oKSx7Y2hhaW46ITF9KSxxbi5WRVJTSU9OPSI0LjE3LjIxIixNZShbImJpbmQiLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwicGFydGlhbCIsInBhcnRpYWxSaWdodCJdLChmdW5jdGlvbih0KXtxblt0XS5wbGFjZWhvbGRlcj1xbn0pKSxNZShbImRyb3AiLCJ0YWtlIl0sKGZ1bmN0aW9uKHQsZSl7WG4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKHIpe3I9cj09PW4/MTp4bih5YShyKSwwKTt2YXIgaT10aGlzLl9fZmlsdGVyZWRfXyYmIWU/bmV3IFhuKHRoaXMpOnRoaXMuY2xvbmUoKTtyZXR1cm4gaS5fX2ZpbHRlcmVkX18/aS5fX3Rha2VDb3VudF9fPXduKHIsaS5fX3Rha2VDb3VudF9fKTppLl9fdmlld3NfXy5wdXNoKHtzaXplOnduKHIsZCksdHlwZTp0KyhpLl9fZGlyX188MD8iUmlnaHQiOiIiKX0pLGl9LFhuLnByb3RvdHlwZVt0KyJSaWdodCJdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJldmVyc2UoKVt0XShlKS5yZXZlcnNlKCl9fSkpLE1lKFsiZmlsdGVyIiwibWFwIiwidGFrZVdoaWxlIl0sKGZ1bmN0aW9uKHQsZSl7dmFyIG49ZSsxLHI9MT09bnx8Mz09bjtYbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jbG9uZSgpO3JldHVybiBlLl9faXRlcmF0ZWVzX18ucHVzaCh7aXRlcmF0ZWU6bG8odCwzKSx0eXBlOm59KSxlLl9fZmlsdGVyZWRfXz1lLl9fZmlsdGVyZWRfX3x8cixlfX0pKSxNZShbImhlYWQiLCJsYXN0Il0sKGZ1bmN0aW9uKHQsZSl7dmFyIG49InRha2UiKyhlPyJSaWdodCI6IiIpO1huLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3JldHVybiB0aGlzW25dKDEpLnZhbHVlKClbMF19fSkpLE1lKFsiaW5pdGlhbCIsInRhaWwiXSwoZnVuY3Rpb24odCxlKXt2YXIgbj0iZHJvcCIrKGU/IiI6IlJpZ2h0Iik7WG4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fP25ldyBYbih0aGlzKTp0aGlzW25dKDEpfX0pKSxYbi5wcm90b3R5cGUuY29tcGFjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcihvdSl9LFhuLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbHRlcih0KS5oZWFkKCl9LFhuLnByb3RvdHlwZS5maW5kTGFzdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZCh0KX0sWG4ucHJvdG90eXBlLmludm9rZU1hcD1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9uZXcgWG4odGhpcyk6dGhpcy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBUcihuLHQsZSl9KSl9KSksWG4ucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maWx0ZXIoQnMobG8odCkpKX0sWG4ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dD15YSh0KTt2YXIgcj10aGlzO3JldHVybiByLl9fZmlsdGVyZWRfXyYmKHQ+MHx8ZTwwKT9uZXcgWG4ocik6KHQ8MD9yPXIudGFrZVJpZ2h0KC10KTp0JiYocj1yLmRyb3AodCkpLGUhPT1uJiYocj0oZT15YShlKSk8MD9yLmRyb3BSaWdodCgtZSk6ci50YWtlKGUtdCkpLHIpfSxYbi5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpLnRha2VXaGlsZSh0KS5yZXZlcnNlKCl9LFhuLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFrZShkKX0sYnIoWG4ucHJvdG90eXBlLChmdW5jdGlvbih0LGUpe3ZhciByPS9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KGUpLGk9L14oPzpoZWFkfGxhc3QpJC8udGVzdChlKSxvPXFuW2k/InRha2UiKygibGFzdCI9PWU/IlJpZ2h0IjoiIik6ZV0scz1pfHwvXmZpbmQvLnRlc3QoZSk7IW98fChxbi5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fd3JhcHBlZF9fLGE9aT9bMV06YXJndW1lbnRzLHU9ZSBpbnN0YW5jZW9mIFhuLGM9YVswXSxsPXV8fFhzKGUpLGg9ZnVuY3Rpb24odCl7dmFyIGU9by5hcHBseShxbixCZShbdF0sYSkpO3JldHVybiBpJiZmP2VbMF06ZX07bCYmciYmImZ1bmN0aW9uIj09dHlwZW9mIGMmJjEhPWMubGVuZ3RoJiYodT1sPSExKTt2YXIgZj10aGlzLl9fY2hhaW5fXyxwPSEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsZD1zJiYhZixnPXUmJiFwO2lmKCFzJiZsKXtlPWc/ZTpuZXcgWG4odGhpcyk7dmFyIHk9dC5hcHBseShlLGEpO3JldHVybiB5Ll9fYWN0aW9uc19fLnB1c2goe2Z1bmM6Z3MsYXJnczpbaF0sdGhpc0FyZzpufSksbmV3IFluKHksZil9cmV0dXJuIGQmJmc/dC5hcHBseSh0aGlzLGEpOih5PXRoaXMudGhydShoKSxkP2k/eS52YWx1ZSgpWzBdOnkudmFsdWUoKTp5KX0pfSkpLE1lKFsicG9wIiwicHVzaCIsInNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSwoZnVuY3Rpb24odCl7dmFyIGU9T3RbdF0sbj0vXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QodCk/InRhcCI6InRocnUiLHI9L14oPzpwb3B8c2hpZnQpJC8udGVzdCh0KTtxbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHM7aWYociYmIXRoaXMuX19jaGFpbl9fKXt2YXIgaT10aGlzLnZhbHVlKCk7cmV0dXJuIGUuYXBwbHkoWHMoaSk/aTpbXSx0KX1yZXR1cm4gdGhpc1tuXSgoZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkoWHMobik/bjpbXSx0KX0pKX19KSksYnIoWG4ucHJvdG90eXBlLChmdW5jdGlvbih0LGUpe3ZhciBuPXFuW2VdO2lmKG4pe3ZhciByPW4ubmFtZSsiIjtrdC5jYWxsKE9uLHIpfHwoT25bcl09W10pLE9uW3JdLnB1c2goe25hbWU6ZSxmdW5jOm59KX19KSksT25bcWkobiwyKS5uYW1lXT1be25hbWU6IndyYXBwZXIiLGZ1bmM6bn1dLFhuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBYbih0aGlzLl9fd3JhcHBlZF9fKTtyZXR1cm4gdC5fX2FjdGlvbnNfXz1GaSh0aGlzLl9fYWN0aW9uc19fKSx0Ll9fZGlyX189dGhpcy5fX2Rpcl9fLHQuX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fLHQuX19pdGVyYXRlZXNfXz1GaSh0aGlzLl9faXRlcmF0ZWVzX18pLHQuX190YWtlQ291bnRfXz10aGlzLl9fdGFrZUNvdW50X18sdC5fX3ZpZXdzX189RmkodGhpcy5fX3ZpZXdzX18pLHR9LFhuLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7aWYodGhpcy5fX2ZpbHRlcmVkX18pe3ZhciB0PW5ldyBYbih0aGlzKTt0Ll9fZGlyX189LTEsdC5fX2ZpbHRlcmVkX189ITB9ZWxzZSh0PXRoaXMuY2xvbmUoKSkuX19kaXJfXyo9LTE7cmV0dXJuIHR9LFhuLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX193cmFwcGVkX18udmFsdWUoKSxlPXRoaXMuX19kaXJfXyxuPVhzKHQpLHI9ZTwwLGk9bj90Lmxlbmd0aDowLG89ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0tMSxpPW4ubGVuZ3RoOysrcjxpOyl7dmFyIG89bltyXSxzPW8uc2l6ZTtzd2l0Y2goby50eXBlKXtjYXNlImRyb3AiOnQrPXM7YnJlYWs7Y2FzZSJkcm9wUmlnaHQiOmUtPXM7YnJlYWs7Y2FzZSJ0YWtlIjplPXduKGUsdCtzKTticmVhaztjYXNlInRha2VSaWdodCI6dD14bih0LGUtcyl9fXJldHVybntzdGFydDp0LGVuZDplfX0oMCxpLHRoaXMuX192aWV3c19fKSxzPW8uc3RhcnQsYT1vLmVuZCx1PWEtcyxjPXI/YTpzLTEsbD10aGlzLl9faXRlcmF0ZWVzX18saD1sLmxlbmd0aCxmPTAscD13bih1LHRoaXMuX190YWtlQ291bnRfXyk7aWYoIW58fCFyJiZpPT11JiZwPT11KXJldHVybiB5aSh0LHRoaXMuX19hY3Rpb25zX18pO3ZhciBkPVtdO3Q6Zm9yKDt1LS0mJmY8cDspe2Zvcih2YXIgZz0tMSx5PXRbYys9ZV07KytnPGg7KXt2YXIgbT1sW2ddLHY9bS5pdGVyYXRlZSxfPW0udHlwZSx4PXYoeSk7aWYoMj09Xyl5PXg7ZWxzZSBpZigheCl7aWYoMT09Xyljb250aW51ZSB0O2JyZWFrIHR9fWRbZisrXT15fXJldHVybiBkfSxxbi5wcm90b3R5cGUuYXQ9eXMscW4ucHJvdG90eXBlLmNoYWluPWZ1bmN0aW9uKCl7cmV0dXJuIGRzKHRoaXMpfSxxbi5wcm90b3R5cGUuY29tbWl0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBZbih0aGlzLnZhbHVlKCksdGhpcy5fX2NoYWluX18pfSxxbi5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe3RoaXMuX192YWx1ZXNfXz09PW4mJih0aGlzLl9fdmFsdWVzX189ZGEodGhpcy52YWx1ZSgpKSk7dmFyIHQ9dGhpcy5fX2luZGV4X18+PXRoaXMuX192YWx1ZXNfXy5sZW5ndGg7cmV0dXJue2RvbmU6dCx2YWx1ZTp0P246dGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdfX0scW4ucHJvdG90eXBlLnBsYW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPXRoaXM7ciBpbnN0YW5jZW9mIEduOyl7dmFyIGk9VW8ocik7aS5fX2luZGV4X189MCxpLl9fdmFsdWVzX189bixlP28uX193cmFwcGVkX189aTplPWk7dmFyIG89aTtyPXIuX193cmFwcGVkX199cmV0dXJuIG8uX193cmFwcGVkX189dCxlfSxxbi5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX193cmFwcGVkX187aWYodCBpbnN0YW5jZW9mIFhuKXt2YXIgZT10O3JldHVybiB0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCYmKGU9bmV3IFhuKHRoaXMpKSwoZT1lLnJldmVyc2UoKSkuX19hY3Rpb25zX18ucHVzaCh7ZnVuYzpncyxhcmdzOltuc10sdGhpc0FyZzpufSksbmV3IFluKGUsdGhpcy5fX2NoYWluX18pfXJldHVybiB0aGlzLnRocnUobnMpfSxxbi5wcm90b3R5cGUudG9KU09OPXFuLnByb3RvdHlwZS52YWx1ZU9mPXFuLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbigpe3JldHVybiB5aSh0aGlzLl9fd3JhcHBlZF9fLHRoaXMuX19hY3Rpb25zX18pfSxxbi5wcm90b3R5cGUuZmlyc3Q9cW4ucHJvdG90eXBlLmhlYWQsdGUmJihxbi5wcm90b3R5cGVbdGVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxxbn0oKTt2ZT8oKHZlLmV4cG9ydHM9dm4pLl89dm4sbWUuXz12bik6eWUuXz12bn0pLmNhbGwodGUpfSkpO3ZhciBuZT02MzcxMDA4LjgscmU9e21ldGVyczpuZSxtZXRyZXM6bmUsbWlsbGltZXRlcnM6MWUzKm5lLG1pbGxpbWV0cmVzOjFlMypuZSxjZW50aW1ldGVyczoxMDAqbmUsY2VudGltZXRyZXM6MTAwKm5lLGtpbG9tZXRlcnM6bmUvMWUzLGtpbG9tZXRyZXM6bmUvMWUzLG1pbGVzOm5lLzE2MDkuMzQ0LG5hdXRpY2FsbWlsZXM6bmUvMTg1MixpbmNoZXM6MzkuMzcqbmUseWFyZHM6bmUvMS4wOTM2LGZlZXQ6My4yODA4NCpuZSxyYWRpYW5zOjEsZGVncmVlczpuZS8xMTEzMjV9LGllPXttZXRlcnM6MSxtZXRyZXM6MSxtaWxsaW1ldGVyczoxZTMsbWlsbGltZXRyZXM6MWUzLGNlbnRpbWV0ZXJzOjEwMCxjZW50aW1ldHJlczoxMDAsa2lsb21ldGVyczouMDAxLGtpbG9tZXRyZXM6LjAwMSxtaWxlczoxLzE2MDkuMzQ0LG5hdXRpY2FsbWlsZXM6MS8xODUyLGluY2hlczozOS4zNyx5YXJkczoxLzEuMDkzNixmZWV0OjMuMjgwODQscmFkaWFuczoxL25lLGRlZ3JlZXM6MS8xMTEzMjV9LG9lPXttZXRlcnM6MSxtZXRyZXM6MSxtaWxsaW1ldGVyczoxZTYsbWlsbGltZXRyZXM6MWU2LGNlbnRpbWV0ZXJzOjFlNCxjZW50aW1ldHJlczoxZTQsa2lsb21ldGVyczoxZS02LGtpbG9tZXRyZXM6MWUtNixhY3JlczoyNDcxMDVlLTksbWlsZXM6Mzg2ZS05LHlhcmRzOjEuMTk1OTkwMDQ2LGZlZXQ6MTAuNzYzOTEwNDE3LGluY2hlczoxNTUwLjAwMzEwMDAwNn07ZnVuY3Rpb24gc2UodCxlLG4pe2lmKCF2ZShuPW58fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciByPW4uYmJveCxpPW4uaWQ7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoImdlb21ldHJ5IGlzIHJlcXVpcmVkIik7aWYoZSYmZS5jb25zdHJ1Y3RvciE9PU9iamVjdCl0aHJvdyBuZXcgRXJyb3IoInByb3BlcnRpZXMgbXVzdCBiZSBhbiBPYmplY3QiKTtyJiZfZShyKSxpJiZ4ZShpKTt2YXIgbz17dHlwZToiRmVhdHVyZSJ9O3JldHVybiBpJiYoby5pZD1pKSxyJiYoby5iYm94PXIpLG8ucHJvcGVydGllcz1lfHx7fSxvLmdlb21ldHJ5PXQsb31mdW5jdGlvbiBhZSh0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheSIpO2lmKHQubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGF0IGxlYXN0IDIgbnVtYmVycyBsb25nIik7aWYoIW1lKHRbMF0pfHwhbWUodFsxXSkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGNvbnRhaW4gbnVtYmVycyIpO3JldHVybiBzZSh7dHlwZToiUG9pbnQiLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24gdWUodCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGk9dFtyXTtpZihpLmxlbmd0aDw0KXRocm93IG5ldyBFcnJvcigiRWFjaCBMaW5lYXJSaW5nIG9mIGEgUG9seWdvbiBtdXN0IGhhdmUgNCBvciBtb3JlIFBvc2l0aW9ucy4iKTtmb3IodmFyIG89MDtvPGlbaS5sZW5ndGgtMV0ubGVuZ3RoO28rKyl7aWYoMD09PXImJjA9PT1vJiYhbWUoaVswXVswXSl8fCFtZShpWzBdWzFdKSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgY29udGFpbiBudW1iZXJzIik7aWYoaVtpLmxlbmd0aC0xXVtvXSE9PWlbMF1bb10pdGhyb3cgbmV3IEVycm9yKCJGaXJzdCBhbmQgbGFzdCBQb3NpdGlvbiBhcmUgbm90IGVxdWl2YWxlbnQuIil9fXJldHVybiBzZSh7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiBjZSh0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2lmKHQubGVuZ3RoPDIpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIGFycmF5IG9mIHR3byBvciBtb3JlIHBvc2l0aW9ucyIpO2lmKCFtZSh0WzBdWzFdKXx8IW1lKHRbMF1bMV0pKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBjb250YWluIG51bWJlcnMiKTtyZXR1cm4gc2Uoe3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24gbGUodCxlKXtpZighdmUoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj1lLmJib3gscj1lLmlkO2lmKCF0KXRocm93IG5ldyBFcnJvcigiTm8gZmVhdHVyZXMgcGFzc2VkIik7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJmZWF0dXJlcyBtdXN0IGJlIGFuIEFycmF5Iik7biYmX2UobiksciYmeGUocik7dmFyIGk9e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIn07cmV0dXJuIHImJihpLmlkPXIpLG4mJihpLmJib3g9biksaS5mZWF0dXJlcz10LGl9ZnVuY3Rpb24gaGUodCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtyZXR1cm4gc2Uoe3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiBmZSh0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO3JldHVybiBzZSh7dHlwZToiTXVsdGlQb2ludCIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiBwZSh0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO3JldHVybiBzZSh7dHlwZToiTXVsdGlQb2x5Z29uIixjb29yZGluYXRlczp0fSxlLG4pfWZ1bmN0aW9uIGRlKHQsZSl7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoInJhZGlhbnMgaXMgcmVxdWlyZWQiKTtpZihlJiYic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJ1bml0cyBtdXN0IGJlIGEgc3RyaW5nIik7dmFyIG49cmVbZXx8ImtpbG9tZXRlcnMiXTtpZighbil0aHJvdyBuZXcgRXJyb3IoZSsiIHVuaXRzIGlzIGludmFsaWQiKTtyZXR1cm4gdCpufWZ1bmN0aW9uIGdlKHQsZSl7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoImRpc3RhbmNlIGlzIHJlcXVpcmVkIik7aWYoZSYmInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigidW5pdHMgbXVzdCBiZSBhIHN0cmluZyIpO3ZhciBuPXJlW2V8fCJraWxvbWV0ZXJzIl07aWYoIW4pdGhyb3cgbmV3IEVycm9yKGUrIiB1bml0cyBpcyBpbnZhbGlkIik7cmV0dXJuIHQvbn1mdW5jdGlvbiB5ZSh0KXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigicmFkaWFucyBpcyByZXF1aXJlZCIpO3JldHVybiAxODAqKHQlKDIqTWF0aC5QSSkpL01hdGguUEl9ZnVuY3Rpb24gbWUodCl7cmV0dXJuIWlzTmFOKHQpJiZudWxsIT09dCYmIUFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gdmUodCl7cmV0dXJuISF0JiZ0LmNvbnN0cnVjdG9yPT09T2JqZWN0fWZ1bmN0aW9uIF9lKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiYmJveCBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiYmJveCBtdXN0IGJlIGFuIEFycmF5Iik7aWYoNCE9PXQubGVuZ3RoJiY2IT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJiYm94IG11c3QgYmUgYW4gQXJyYXkgb2YgNCBvciA2IG51bWJlcnMiKTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFtZSh0KSl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBvbmx5IGNvbnRhaW4gbnVtYmVycyIpfSkpfWZ1bmN0aW9uIHhlKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiaWQgaXMgcmVxdWlyZWQiKTtpZigtMT09PVsic3RyaW5nIiwibnVtYmVyIl0uaW5kZXhPZih0eXBlb2YgdCkpdGhyb3cgbmV3IEVycm9yKCJpZCBtdXN0IGJlIGEgbnVtYmVyIG9yIGEgc3RyaW5nIil9ZnVuY3Rpb24gd2UodCxlLG4pe2lmKG51bGwhPT10KWZvcih2YXIgcixpLG8scyxhLHUsYyxsLGg9MCxmPTAscD10LnR5cGUsZD0iRmVhdHVyZUNvbGxlY3Rpb24iPT09cCxnPSJGZWF0dXJlIj09PXAseT1kP3QuZmVhdHVyZXMubGVuZ3RoOjEsbT0wO208eTttKyspe2E9KGw9ISEoYz1kP3QuZmVhdHVyZXNbbV0uZ2VvbWV0cnk6Zz90Lmdlb21ldHJ5OnQpJiYiR2VvbWV0cnlDb2xsZWN0aW9uIj09PWMudHlwZSk/Yy5nZW9tZXRyaWVzLmxlbmd0aDoxO2Zvcih2YXIgdj0wO3Y8YTt2Kyspe3ZhciBfPTAseD0wO2lmKG51bGwhPT0ocz1sP2MuZ2VvbWV0cmllc1t2XTpjKSl7dT1zLmNvb3JkaW5hdGVzO3ZhciB3PXMudHlwZTtzd2l0Y2goaD0hbnx8IlBvbHlnb24iIT09dyYmIk11bHRpUG9seWdvbiIhPT13PzA6MSx3KXtjYXNlIG51bGw6YnJlYWs7Y2FzZSJQb2ludCI6ZSh1LGYsbSxfLHgpLGYrKyxfKys7YnJlYWs7Y2FzZSJMaW5lU3RyaW5nIjpjYXNlIk11bHRpUG9pbnQiOmZvcihyPTA7cjx1Lmxlbmd0aDtyKyspZSh1W3JdLGYsbSxfLHgpLGYrKywiTXVsdGlQb2ludCI9PT13JiZfKys7IkxpbmVTdHJpbmciPT09dyYmXysrO2JyZWFrO2Nhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aUxpbmVTdHJpbmciOmZvcihyPTA7cjx1Lmxlbmd0aDtyKyspe2ZvcihpPTA7aTx1W3JdLmxlbmd0aC1oO2krKyllKHVbcl1baV0sZixtLF8seCksZisrOyJNdWx0aUxpbmVTdHJpbmciPT09dyYmXysrLCJQb2x5Z29uIj09PXcmJngrK30iUG9seWdvbiI9PT13JiZfKys7YnJlYWs7Y2FzZSJNdWx0aVBvbHlnb24iOmZvcihyPTA7cjx1Lmxlbmd0aDtyKyspe2ZvcigiTXVsdGlQb2x5Z29uIj09PXcmJih4PTApLGk9MDtpPHVbcl0ubGVuZ3RoO2krKyl7Zm9yKG89MDtvPHVbcl1baV0ubGVuZ3RoLWg7bysrKWUodVtyXVtpXVtvXSxmLG0sXyx4KSxmKys7eCsrfV8rK31icmVhaztjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6Zm9yKHI9MDtyPHMuZ2VvbWV0cmllcy5sZW5ndGg7cisrKXdlKHMuZ2VvbWV0cmllc1tyXSxlLG4pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIEdlb21ldHJ5IFR5cGUiKX19fX19ZnVuY3Rpb24gYmUodCxlLG4scil7dmFyIGk9bjtyZXR1cm4gd2UodCwoZnVuY3Rpb24odCxyLG8scyxhKXtpPTA9PT1yJiZ2b2lkIDA9PT1uP3Q6ZShpLHQscixvLHMsYSl9KSxyKSxpfWZ1bmN0aW9uIERlKHQsZSl7dmFyIG47c3dpdGNoKHQudHlwZSl7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6Zm9yKG49MDtuPHQuZmVhdHVyZXMubGVuZ3RoO24rKyllKHQuZmVhdHVyZXNbbl0ucHJvcGVydGllcyxuKTticmVhaztjYXNlIkZlYXR1cmUiOmUodC5wcm9wZXJ0aWVzLDApfX1mdW5jdGlvbiBFZSh0LGUpe2lmKCJGZWF0dXJlIj09PXQudHlwZSllKHQsMCk7ZWxzZSBpZigiRmVhdHVyZUNvbGxlY3Rpb24iPT09dC50eXBlKWZvcih2YXIgbj0wO248dC5mZWF0dXJlcy5sZW5ndGg7bisrKWUodC5mZWF0dXJlc1tuXSxuKX1mdW5jdGlvbiBDZSh0LGUpe3ZhciBuLHIsaSxvLHMsYSx1LGMsbCxoLGY9MCxwPSJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGUsZD0iRmVhdHVyZSI9PT10LnR5cGUsZz1wP3QuZmVhdHVyZXMubGVuZ3RoOjE7Zm9yKG49MDtuPGc7bisrKXtmb3IoYT1wP3QuZmVhdHVyZXNbbl0uZ2VvbWV0cnk6ZD90Lmdlb21ldHJ5OnQsYz1wP3QuZmVhdHVyZXNbbl0ucHJvcGVydGllczpkP3QucHJvcGVydGllczp7fSxsPXA/dC5mZWF0dXJlc1tuXS5iYm94OmQ/dC5iYm94OnZvaWQgMCxoPXA/dC5mZWF0dXJlc1tuXS5pZDpkP3QuaWQ6dm9pZCAwLHM9KHU9ISFhJiYiR2VvbWV0cnlDb2xsZWN0aW9uIj09PWEudHlwZSk/YS5nZW9tZXRyaWVzLmxlbmd0aDoxLGk9MDtpPHM7aSsrKWlmKG51bGwhPT0obz11P2EuZ2VvbWV0cmllc1tpXTphKSlzd2l0Y2goby50eXBlKXtjYXNlIlBvaW50IjpjYXNlIkxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2ludCI6Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvbHlnb24iOmUobyxmLGMsbCxoKTticmVhaztjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6Zm9yKHI9MDtyPG8uZ2VvbWV0cmllcy5sZW5ndGg7cisrKWUoby5nZW9tZXRyaWVzW3JdLGYsYyxsLGgpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIEdlb21ldHJ5IFR5cGUiKX1lbHNlIGUobnVsbCxmLGMsbCxoKTtmKyt9fWZ1bmN0aW9uIFNlKHQsZSl7Q2UodCwoZnVuY3Rpb24odCxuLHIsaSxvKXt2YXIgcyxhPW51bGw9PT10P251bGw6dC50eXBlO3N3aXRjaChhKXtjYXNlIG51bGw6Y2FzZSJQb2ludCI6Y2FzZSJMaW5lU3RyaW5nIjpjYXNlIlBvbHlnb24iOnJldHVybiB2b2lkIGUoc2UodCxyLHtiYm94OmksaWQ6b30pLG4sMCl9c3dpdGNoKGEpe2Nhc2UiTXVsdGlQb2ludCI6cz0iUG9pbnQiO2JyZWFrO2Nhc2UiTXVsdGlMaW5lU3RyaW5nIjpzPSJMaW5lU3RyaW5nIjticmVhaztjYXNlIk11bHRpUG9seWdvbiI6cz0iUG9seWdvbiJ9dC5jb29yZGluYXRlcy5mb3JFYWNoKChmdW5jdGlvbih0LGkpe2Uoc2Uoe3R5cGU6cyxjb29yZGluYXRlczp0fSxyKSxuLGkpfSkpfSkpfWZ1bmN0aW9uIEFlKHQsZSl7U2UodCwoZnVuY3Rpb24odCxuLHIpe3ZhciBpPTA7aWYodC5nZW9tZXRyeSl7dmFyIG89dC5nZW9tZXRyeS50eXBlOyJQb2ludCI9PT1vfHwiTXVsdGlQb2ludCI9PT1vfHxiZSh0LChmdW5jdGlvbihvLHMsYSx1LGMsbCl7dmFyIGg9Y2UoW28sc10sdC5wcm9wZXJ0aWVzKTtyZXR1cm4gZShoLG4scixsLGkpLGkrKyxzfSkpfX0pKX1mdW5jdGlvbiBOZSh0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO1NlKHQsKGZ1bmN0aW9uKHQsbixyKXtpZihudWxsIT09dC5nZW9tZXRyeSl7dmFyIGk9dC5nZW9tZXRyeS50eXBlLG89dC5nZW9tZXRyeS5jb29yZGluYXRlcztzd2l0Y2goaSl7Y2FzZSJMaW5lU3RyaW5nIjplKHQsbixyLDAsMCk7YnJlYWs7Y2FzZSJQb2x5Z29uIjpmb3IodmFyIHM9MDtzPG8ubGVuZ3RoO3MrKyllKGNlKG9bc10sdC5wcm9wZXJ0aWVzKSxuLHIscyl9fX0pKX1mdW5jdGlvbiBJZSh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIm9iaiBpcyByZXF1aXJlZCIpO3ZhciBlPU1lKHQpO2lmKGUubGVuZ3RoPjEmJm1lKGVbMF0pJiZtZShlWzFdKSlyZXR1cm4gZTt0aHJvdyBuZXcgRXJyb3IoIkNvb3JkaW5hdGUgaXMgbm90IGEgdmFsaWQgUG9pbnQiKX1mdW5jdGlvbiBNZSh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIm9iaiBpcyByZXF1aXJlZCIpO3ZhciBlO2lmKHQubGVuZ3RoP2U9dDp0LmNvb3JkaW5hdGVzP2U9dC5jb29yZGluYXRlczp0Lmdlb21ldHJ5JiZ0Lmdlb21ldHJ5LmNvb3JkaW5hdGVzJiYoZT10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzKSxlKXJldHVybiBGZShlKSxlO3Rocm93IG5ldyBFcnJvcigiTm8gdmFsaWQgY29vcmRpbmF0ZXMiKX1mdW5jdGlvbiBGZSh0KXtpZih0Lmxlbmd0aD4xJiZtZSh0WzBdKSYmbWUodFsxXSkpcmV0dXJuITA7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSYmdFswXS5sZW5ndGgpcmV0dXJuIEZlKHRbMF0pO3Rocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBvbmx5IGNvbnRhaW4gbnVtYmVycyIpfU9iamVjdC5mcmVlemUoe2VhcnRoUmFkaXVzOm5lLGZhY3RvcnM6cmUsdW5pdHNGYWN0b3JzOmllLGFyZWFGYWN0b3JzOm9lLGZlYXR1cmU6c2UsZ2VvbWV0cnk6ZnVuY3Rpb24odCxlLG4pe2lmKCF2ZShuPW58fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciByLGk9bi5iYm94O2lmKCF0KXRocm93IG5ldyBFcnJvcigidHlwZSBpcyByZXF1aXJlZCIpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gQXJyYXkiKTtzd2l0Y2goaSYmX2UoaSksdCl7Y2FzZSJQb2ludCI6cj1hZShlKS5nZW9tZXRyeTticmVhaztjYXNlIkxpbmVTdHJpbmciOnI9Y2UoZSkuZ2VvbWV0cnk7YnJlYWs7Y2FzZSJQb2x5Z29uIjpyPXVlKGUpLmdlb21ldHJ5O2JyZWFrO2Nhc2UiTXVsdGlQb2ludCI6cj1mZShlKS5nZW9tZXRyeTticmVhaztjYXNlIk11bHRpTGluZVN0cmluZyI6cj1oZShlKS5nZW9tZXRyeTticmVhaztjYXNlIk11bHRpUG9seWdvbiI6cj1wZShlKS5nZW9tZXRyeTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcih0KyIgaXMgaW52YWxpZCIpfXJldHVybiBpJiYoci5iYm94PWkpLHJ9LHBvaW50OmFlLHBvaW50czpmdW5jdGlvbih0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheSIpO3JldHVybiBsZSh0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGFlKHQsZSl9KSksbil9LHBvbHlnb246dWUscG9seWdvbnM6ZnVuY3Rpb24odCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gQXJyYXkiKTtyZXR1cm4gbGUodC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB1ZSh0LGUpfSkpLG4pfSxsaW5lU3RyaW5nOmNlLGxpbmVTdHJpbmdzOmZ1bmN0aW9uKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Iik7cmV0dXJuIGxlKHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gY2UodCxlKX0pKSxuKX0sZmVhdHVyZUNvbGxlY3Rpb246bGUsbXVsdGlMaW5lU3RyaW5nOmhlLG11bHRpUG9pbnQ6ZmUsbXVsdGlQb2x5Z29uOnBlLGdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbih0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9tZXRyaWVzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJnZW9tZXRyaWVzIG11c3QgYmUgYW4gQXJyYXkiKTtyZXR1cm4gc2Uoe3R5cGU6Ikdlb21ldHJ5Q29sbGVjdGlvbiIsZ2VvbWV0cmllczp0fSxlLG4pfSxyb3VuZDpmdW5jdGlvbih0LGUpe2lmKG51bGw9PXR8fGlzTmFOKHQpKXRocm93IG5ldyBFcnJvcigibnVtIGlzIHJlcXVpcmVkIik7aWYoZSYmIShlPj0wKSl0aHJvdyBuZXcgRXJyb3IoInByZWNpc2lvbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7dmFyIG49TWF0aC5wb3coMTAsZXx8MCk7cmV0dXJuIE1hdGgucm91bmQodCpuKS9ufSxyYWRpYW5zVG9MZW5ndGg6ZGUsbGVuZ3RoVG9SYWRpYW5zOmdlLGxlbmd0aFRvRGVncmVlczpmdW5jdGlvbih0LGUpe3JldHVybiB5ZShnZSh0LGUpKX0sYmVhcmluZ1RvQXppbXV0aDpmdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigiYmVhcmluZyBpcyByZXF1aXJlZCIpO3ZhciBlPXQlMzYwO3JldHVybiBlPDAmJihlKz0zNjApLGV9LHJhZGlhbnNUb0RlZ3JlZXM6eWUsZGVncmVlc1RvUmFkaWFuczpmdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigiZGVncmVlcyBpcyByZXF1aXJlZCIpO3JldHVybiB0JTM2MCpNYXRoLlBJLzE4MH0sY29udmVydExlbmd0aDpmdW5jdGlvbih0LGUsbil7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoImxlbmd0aCBpcyByZXF1aXJlZCIpO2lmKCEodD49MCkpdGhyb3cgbmV3IEVycm9yKCJsZW5ndGggbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIpO3JldHVybiBkZShnZSh0LGUpLG58fCJraWxvbWV0ZXJzIil9LGNvbnZlcnRBcmVhOmZ1bmN0aW9uKHQsZSxuKXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigiYXJlYSBpcyByZXF1aXJlZCIpO2lmKCEodD49MCkpdGhyb3cgbmV3IEVycm9yKCJhcmVhIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTt2YXIgcj1vZVtlfHwibWV0ZXJzIl07aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIG9yaWdpbmFsIHVuaXRzIik7dmFyIGk9b2Vbbnx8ImtpbG9tZXRlcnMiXTtpZighaSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZmluYWwgdW5pdHMiKTtyZXR1cm4gdC9yKml9LGlzTnVtYmVyOm1lLGlzT2JqZWN0OnZlLHZhbGlkYXRlQkJveDpfZSx2YWxpZGF0ZUlkOnhlLHJhZGlhbnMyZGVncmVlczpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigibWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gYHJhZGlhbnNUb0RlZ3JlZXNgIil9LGRlZ3JlZXMycmFkaWFuczpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigibWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gYGRlZ3JlZXNUb1JhZGlhbnNgIil9LGRpc3RhbmNlVG9EZWdyZWVzOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJtZXRob2QgaGFzIGJlZW4gcmVuYW1lZCB0byBgbGVuZ3RoVG9EZWdyZWVzYCIpfSxkaXN0YW5jZVRvUmFkaWFuczpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigibWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gYGxlbmd0aFRvUmFkaWFuc2AiKX0scmFkaWFuc1RvRGlzdGFuY2U6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZCBoYXMgYmVlbiByZW5hbWVkIHRvIGByYWRpYW5zVG9MZW5ndGhgIil9LGJlYXJpbmdUb0FuZ2xlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJtZXRob2QgaGFzIGJlZW4gcmVuYW1lZCB0byBgYmVhcmluZ1RvQXppbXV0aGAiKX0sY29udmVydERpc3RhbmNlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJtZXRob2QgaGFzIGJlZW4gcmVuYW1lZCB0byBgY29udmVydExlbmd0aGAiKX19KSxPYmplY3QuZnJlZXplKHtjb29yZEVhY2g6d2UsY29vcmRSZWR1Y2U6YmUscHJvcEVhY2g6RGUscHJvcFJlZHVjZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bjtyZXR1cm4gRGUodCwoZnVuY3Rpb24odCxpKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSl9KSkscn0sZmVhdHVyZUVhY2g6RWUsZmVhdHVyZVJlZHVjZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bjtyZXR1cm4gRWUodCwoZnVuY3Rpb24odCxpKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSl9KSkscn0sY29vcmRBbGw6ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIHdlKHQsKGZ1bmN0aW9uKHQpe2UucHVzaCh0KX0pKSxlfSxnZW9tRWFjaDpDZSxnZW9tUmVkdWNlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uO3JldHVybiBDZSh0LChmdW5jdGlvbih0LGksbyxzLGEpe3I9MD09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxpLG8scyxhKX0pKSxyfSxmbGF0dGVuRWFjaDpTZSxmbGF0dGVuUmVkdWNlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uO3JldHVybiBTZSh0LChmdW5jdGlvbih0LGksbyl7cj0wPT09aSYmMD09PW8mJnZvaWQgMD09PW4/dDplKHIsdCxpLG8pfSkpLHJ9LHNlZ21lbnRFYWNoOkFlLHNlZ21lbnRSZWR1Y2U6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4saT0hMTtyZXR1cm4gQWUodCwoZnVuY3Rpb24odCxvLHMsYSx1KXtyPSExPT09aSYmdm9pZCAwPT09bj90OmUocix0LG8scyxhLHUpLGk9ITB9KSkscn0sbGluZUVhY2g6TmUsbGluZVJlZHVjZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bjtyZXR1cm4gTmUodCwoZnVuY3Rpb24odCxpLG8scyl7cj0wPT09aSYmdm9pZCAwPT09bj90OmUocix0LGksbyxzKX0pKSxyfX0pLE9iamVjdC5mcmVlemUoe2dldENvb3JkOkllLGdldENvb3JkczpNZSxjb250YWluc051bWJlcjpGZSxnZW9qc29uVHlwZTpmdW5jdGlvbih0LGUsbil7aWYoIWV8fCFuKXRocm93IG5ldyBFcnJvcigidHlwZSBhbmQgbmFtZSByZXF1aXJlZCIpO2lmKCF0fHx0LnR5cGUhPT1lKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0byAiK24rIjogbXVzdCBiZSBhICIrZSsiLCBnaXZlbiAiK3QudHlwZSl9LGZlYXR1cmVPZjpmdW5jdGlvbih0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJObyBmZWF0dXJlIHBhc3NlZCIpO2lmKCFuKXRocm93IG5ldyBFcnJvcigiLmZlYXR1cmVPZigpIHJlcXVpcmVzIGEgbmFtZSIpO2lmKCF0fHwiRmVhdHVyZSIhPT10LnR5cGV8fCF0Lmdlb21ldHJ5KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0byAiK24rIiwgRmVhdHVyZSB3aXRoIGdlb21ldHJ5IHJlcXVpcmVkIik7aWYoIXQuZ2VvbWV0cnl8fHQuZ2VvbWV0cnkudHlwZSE9PWUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiOiBtdXN0IGJlIGEgIitlKyIsIGdpdmVuICIrdC5nZW9tZXRyeS50eXBlKX0sY29sbGVjdGlvbk9mOmZ1bmN0aW9uKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIk5vIGZlYXR1cmVDb2xsZWN0aW9uIHBhc3NlZCIpO2lmKCFuKXRocm93IG5ldyBFcnJvcigiLmNvbGxlY3Rpb25PZigpIHJlcXVpcmVzIGEgbmFtZSIpO2lmKCF0fHwiRmVhdHVyZUNvbGxlY3Rpb24iIT09dC50eXBlKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0byAiK24rIiwgRmVhdHVyZUNvbGxlY3Rpb24gcmVxdWlyZWQiKTtmb3IodmFyIHI9MDtyPHQuZmVhdHVyZXMubGVuZ3RoO3IrKyl7dmFyIGk9dC5mZWF0dXJlc1tyXTtpZighaXx8IkZlYXR1cmUiIT09aS50eXBlfHwhaS5nZW9tZXRyeSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyIsIEZlYXR1cmUgd2l0aCBnZW9tZXRyeSByZXF1aXJlZCIpO2lmKCFpLmdlb21ldHJ5fHxpLmdlb21ldHJ5LnR5cGUhPT1lKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0byAiK24rIjogbXVzdCBiZSBhICIrZSsiLCBnaXZlbiAiK2kuZ2VvbWV0cnkudHlwZSl9fSxnZXRHZW9tOmZ1bmN0aW9uKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO2lmKHZvaWQgMCE9PXQuZ2VvbWV0cnkpcmV0dXJuIHQuZ2VvbWV0cnk7aWYodC5jb29yZGluYXRlc3x8dC5nZW9tZXRyaWVzKXJldHVybiB0O3Rocm93IG5ldyBFcnJvcigiZ2VvanNvbiBtdXN0IGJlIGEgdmFsaWQgRmVhdHVyZSBvciBHZW9tZXRyeSBPYmplY3QiKX0sZ2V0R2VvbVR5cGU6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoImludmFyaWFudC5nZXRHZW9tVHlwZSBoYXMgYmVlbiBkZXByZWNhdGVkIGluIHY1LjAgaW4gZmF2b3Igb2YgaW52YXJpYW50LmdldFR5cGUiKX0sZ2V0VHlwZTpmdW5jdGlvbih0LGUpe2lmKCF0KXRocm93IG5ldyBFcnJvcigoZXx8Imdlb2pzb24iKSsiIGlzIHJlcXVpcmVkIik7aWYodC5nZW9tZXRyeSYmdC5nZW9tZXRyeS50eXBlKXJldHVybiB0Lmdlb21ldHJ5LnR5cGU7aWYodC50eXBlKXJldHVybiB0LnR5cGU7dGhyb3cgbmV3IEVycm9yKChlfHwiZ2VvanNvbiIpKyIgaXMgaW52YWxpZCIpfX0pO3ZhciBUZT1mdW5jdGlvbiB0KGUsbixyLGksbyl7Zm9yKHI9cnx8MCxpPWl8fGUubGVuZ3RoLTEsbz1vfHxMZTtpPnI7KXtpZihpLXI+NjAwKXt2YXIgcz1pLXIrMSxhPW4tcisxLHU9TWF0aC5sb2cocyksYz0uNSpNYXRoLmV4cCgyKnUvMyksbD0uNSpNYXRoLnNxcnQodSpjKihzLWMpL3MpKihhLXMvMjwwPy0xOjEpLGg9TWF0aC5tYXgocixNYXRoLmZsb29yKG4tYSpjL3MrbCkpLGY9TWF0aC5taW4oaSxNYXRoLmZsb29yKG4rKHMtYSkqYy9zK2wpKTt0KGUsbixoLGYsbyl9dmFyIHA9ZVtuXSxkPXIsZz1pO2ZvcihPZShlLHIsbiksbyhlW2ldLHApPjAmJk9lKGUscixpKTtkPGc7KXtmb3IoT2UoZSxkLGcpLGQrKyxnLS07byhlW2RdLHApPDA7KWQrKztmb3IoO28oZVtnXSxwKT4wOylnLS19MD09PW8oZVtyXSxwKT9PZShlLHIsZyk6T2UoZSwrK2csaSksZzw9biYmKHI9ZysxKSxuPD1nJiYoaT1nLTEpfX07ZnVuY3Rpb24gT2UodCxlLG4pe3ZhciByPXRbZV07dFtlXT10W25dLHRbbl09cn1mdW5jdGlvbiBMZSh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6MH12YXIgUGU9UmU7ZnVuY3Rpb24gUmUodCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBSZSkpcmV0dXJuIG5ldyBSZSh0LGUpO3RoaXMuX21heEVudHJpZXM9TWF0aC5tYXgoNCx0fHw5KSx0aGlzLl9taW5FbnRyaWVzPU1hdGgubWF4KDIsTWF0aC5jZWlsKC40KnRoaXMuX21heEVudHJpZXMpKSxlJiZ0aGlzLl9pbml0Rm9ybWF0KGUpLHRoaXMuY2xlYXIoKX1mdW5jdGlvbiBCZSh0LGUsbil7aWYoIW4pcmV0dXJuIGUuaW5kZXhPZih0KTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKylpZihuKHQsZVtyXSkpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24ga2UodCxlKXt6ZSh0LDAsdC5jaGlsZHJlbi5sZW5ndGgsZSx0KX1mdW5jdGlvbiB6ZSh0LGUsbixyLGkpe2l8fChpPVplKG51bGwpKSxpLm1pblg9MS8wLGkubWluWT0xLzAsaS5tYXhYPS0xLzAsaS5tYXhZPS0xLzA7Zm9yKHZhciBvLHM9ZTtzPG47cysrKW89dC5jaGlsZHJlbltzXSxqZShpLHQubGVhZj9yKG8pOm8pO3JldHVybiBpfWZ1bmN0aW9uIGplKHQsZSl7cmV0dXJuIHQubWluWD1NYXRoLm1pbih0Lm1pblgsZS5taW5YKSx0Lm1pblk9TWF0aC5taW4odC5taW5ZLGUubWluWSksdC5tYXhYPU1hdGgubWF4KHQubWF4WCxlLm1heFgpLHQubWF4WT1NYXRoLm1heCh0Lm1heFksZS5tYXhZKSx0fWZ1bmN0aW9uIFVlKHQsZSl7cmV0dXJuIHQubWluWC1lLm1pblh9ZnVuY3Rpb24gcWUodCxlKXtyZXR1cm4gdC5taW5ZLWUubWluWX1mdW5jdGlvbiBWZSh0KXtyZXR1cm4odC5tYXhYLXQubWluWCkqKHQubWF4WS10Lm1pblkpfWZ1bmN0aW9uIEdlKHQpe3JldHVybiB0Lm1heFgtdC5taW5YKyh0Lm1heFktdC5taW5ZKX1mdW5jdGlvbiBZZSh0LGUpe3JldHVybihNYXRoLm1heChlLm1heFgsdC5tYXhYKS1NYXRoLm1pbihlLm1pblgsdC5taW5YKSkqKE1hdGgubWF4KGUubWF4WSx0Lm1heFkpLU1hdGgubWluKGUubWluWSx0Lm1pblkpKX1mdW5jdGlvbiBYZSh0LGUpe3ZhciBuPU1hdGgubWF4KHQubWluWCxlLm1pblgpLHI9TWF0aC5tYXgodC5taW5ZLGUubWluWSksaT1NYXRoLm1pbih0Lm1heFgsZS5tYXhYKSxvPU1hdGgubWluKHQubWF4WSxlLm1heFkpO3JldHVybiBNYXRoLm1heCgwLGktbikqTWF0aC5tYXgoMCxvLXIpfWZ1bmN0aW9uIFdlKHQsZSl7cmV0dXJuIHQubWluWDw9ZS5taW5YJiZ0Lm1pblk8PWUubWluWSYmZS5tYXhYPD10Lm1heFgmJmUubWF4WTw9dC5tYXhZfWZ1bmN0aW9uIEhlKHQsZSl7cmV0dXJuIGUubWluWDw9dC5tYXhYJiZlLm1pblk8PXQubWF4WSYmZS5tYXhYPj10Lm1pblgmJmUubWF4WT49dC5taW5ZfWZ1bmN0aW9uIFplKHQpe3JldHVybntjaGlsZHJlbjp0LGhlaWdodDoxLGxlYWY6ITAsbWluWDoxLzAsbWluWToxLzAsbWF4WDotMS8wLG1heFk6LTEvMH19ZnVuY3Rpb24gS2UodCxlLG4scixpKXtmb3IodmFyIG8scz1bZSxuXTtzLmxlbmd0aDspISgobj1zLnBvcCgpKS0oZT1zLnBvcCgpKTw9cikmJihvPWUrTWF0aC5jZWlsKChuLWUpL3IvMikqcixUZSh0LG8sZSxuLGkpLHMucHVzaChlLG8sbyxuKSl9ZnVuY3Rpb24gSmUodCxlKXtyZXR1cm4gdChlPXtleHBvcnRzOnt9fSxlLmV4cG9ydHMpLGUuZXhwb3J0c31SZS5wcm90b3R5cGU9e2FsbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbGwodGhpcy5kYXRhLFtdKX0sc2VhcmNoOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGF0YSxuPVtdLHI9dGhpcy50b0JCb3g7aWYoIUhlKHQsZSkpcmV0dXJuIG47Zm9yKHZhciBpLG8scyxhLHU9W107ZTspe2ZvcihpPTAsbz1lLmNoaWxkcmVuLmxlbmd0aDtpPG87aSsrKXM9ZS5jaGlsZHJlbltpXSxIZSh0LGE9ZS5sZWFmP3Iocyk6cykmJihlLmxlYWY/bi5wdXNoKHMpOldlKHQsYSk/dGhpcy5fYWxsKHMsbik6dS5wdXNoKHMpKTtlPXUucG9wKCl9cmV0dXJuIG59LGNvbGxpZGVzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGF0YSxuPXRoaXMudG9CQm94O2lmKCFIZSh0LGUpKXJldHVybiExO2Zvcih2YXIgcixpLG8scyxhPVtdO2U7KXtmb3Iocj0wLGk9ZS5jaGlsZHJlbi5sZW5ndGg7cjxpO3IrKylpZihvPWUuY2hpbGRyZW5bcl0sSGUodCxzPWUubGVhZj9uKG8pOm8pKXtpZihlLmxlYWZ8fFdlKHQscykpcmV0dXJuITA7YS5wdXNoKG8pfWU9YS5wb3AoKX1yZXR1cm4hMX0sbG9hZDpmdW5jdGlvbih0KXtpZighdHx8IXQubGVuZ3RoKXJldHVybiB0aGlzO2lmKHQubGVuZ3RoPHRoaXMuX21pbkVudHJpZXMpe2Zvcih2YXIgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmluc2VydCh0W2VdKTtyZXR1cm4gdGhpc312YXIgcj10aGlzLl9idWlsZCh0LnNsaWNlKCksMCx0Lmxlbmd0aC0xLDApO2lmKHRoaXMuZGF0YS5jaGlsZHJlbi5sZW5ndGgpaWYodGhpcy5kYXRhLmhlaWdodD09PXIuaGVpZ2h0KXRoaXMuX3NwbGl0Um9vdCh0aGlzLmRhdGEscik7ZWxzZXtpZih0aGlzLmRhdGEuaGVpZ2h0PHIuaGVpZ2h0KXt2YXIgaT10aGlzLmRhdGE7dGhpcy5kYXRhPXIscj1pfXRoaXMuX2luc2VydChyLHRoaXMuZGF0YS5oZWlnaHQtci5oZWlnaHQtMSwhMCl9ZWxzZSB0aGlzLmRhdGE9cjtyZXR1cm4gdGhpc30saW5zZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0aGlzLl9pbnNlcnQodCx0aGlzLmRhdGEuaGVpZ2h0LTEpLHRoaXN9LGNsZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YT1aZShbXSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuIHRoaXM7Zm9yKHZhciBuLHIsaSxvLHM9dGhpcy5kYXRhLGE9dGhpcy50b0JCb3godCksdT1bXSxjPVtdO3N8fHUubGVuZ3RoOyl7aWYoc3x8KHM9dS5wb3AoKSxyPXVbdS5sZW5ndGgtMV0sbj1jLnBvcCgpLG89ITApLHMubGVhZiYmLTEhPT0oaT1CZSh0LHMuY2hpbGRyZW4sZSkpKXJldHVybiBzLmNoaWxkcmVuLnNwbGljZShpLDEpLHUucHVzaChzKSx0aGlzLl9jb25kZW5zZSh1KSx0aGlzO298fHMubGVhZnx8IVdlKHMsYSk/cj8obisrLHM9ci5jaGlsZHJlbltuXSxvPSExKTpzPW51bGw6KHUucHVzaChzKSxjLnB1c2gobiksbj0wLHI9cyxzPXMuY2hpbGRyZW5bMF0pfXJldHVybiB0aGlzfSx0b0JCb3g6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGNvbXBhcmVNaW5YOlVlLGNvbXBhcmVNaW5ZOnFlLHRvSlNPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGF9LGZyb21KU09OOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGE9dCx0aGlzfSxfYWxsOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdO3Q7KXQubGVhZj9lLnB1c2guYXBwbHkoZSx0LmNoaWxkcmVuKTpuLnB1c2guYXBwbHkobix0LmNoaWxkcmVuKSx0PW4ucG9wKCk7cmV0dXJuIGV9LF9idWlsZDpmdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvPW4tZSsxLHM9dGhpcy5fbWF4RW50cmllcztpZihvPD1zKXJldHVybiBrZShpPVplKHQuc2xpY2UoZSxuKzEpKSx0aGlzLnRvQkJveCksaTtyfHwocj1NYXRoLmNlaWwoTWF0aC5sb2cobykvTWF0aC5sb2cocykpLHM9TWF0aC5jZWlsKG8vTWF0aC5wb3cocyxyLTEpKSksKGk9WmUoW10pKS5sZWFmPSExLGkuaGVpZ2h0PXI7dmFyIGEsdSxjLGwsaD1NYXRoLmNlaWwoby9zKSxmPWgqTWF0aC5jZWlsKE1hdGguc3FydChzKSk7Zm9yKEtlKHQsZSxuLGYsdGhpcy5jb21wYXJlTWluWCksYT1lO2E8PW47YSs9Zilmb3IoS2UodCxhLGM9TWF0aC5taW4oYStmLTEsbiksaCx0aGlzLmNvbXBhcmVNaW5ZKSx1PWE7dTw9Yzt1Kz1oKWw9TWF0aC5taW4odStoLTEsYyksaS5jaGlsZHJlbi5wdXNoKHRoaXMuX2J1aWxkKHQsdSxsLHItMSkpO3JldHVybiBrZShpLHRoaXMudG9CQm94KSxpfSxfY2hvb3NlU3VidHJlZTpmdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGksbyxzLGEsdSxjLGwsaDtyLnB1c2goZSksIWUubGVhZiYmci5sZW5ndGgtMSE9PW47KXtmb3IobD1oPTEvMCxpPTAsbz1lLmNoaWxkcmVuLmxlbmd0aDtpPG87aSsrKXU9VmUocz1lLmNoaWxkcmVuW2ldKSwoYz1ZZSh0LHMpLXUpPGg/KGg9YyxsPXU8bD91OmwsYT1zKTpjPT09aCYmdTxsJiYobD11LGE9cyk7ZT1hfHxlLmNoaWxkcmVuWzBdfXJldHVybiBlfSxfaW5zZXJ0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnRvQkJveCxpPW4/dDpyKHQpLG89W10scz10aGlzLl9jaG9vc2VTdWJ0cmVlKGksdGhpcy5kYXRhLGUsbyk7Zm9yKHMuY2hpbGRyZW4ucHVzaCh0KSxqZShzLGkpO2U+PTAmJm9bZV0uY2hpbGRyZW4ubGVuZ3RoPnRoaXMuX21heEVudHJpZXM7KXRoaXMuX3NwbGl0KG8sZSksZS0tO3RoaXMuX2FkanVzdFBhcmVudEJCb3hlcyhpLG8sZSl9LF9zcGxpdDpmdW5jdGlvbih0LGUpe3ZhciBuPXRbZV0scj1uLmNoaWxkcmVuLmxlbmd0aCxpPXRoaXMuX21pbkVudHJpZXM7dGhpcy5fY2hvb3NlU3BsaXRBeGlzKG4saSxyKTt2YXIgbz10aGlzLl9jaG9vc2VTcGxpdEluZGV4KG4saSxyKSxzPVplKG4uY2hpbGRyZW4uc3BsaWNlKG8sbi5jaGlsZHJlbi5sZW5ndGgtbykpO3MuaGVpZ2h0PW4uaGVpZ2h0LHMubGVhZj1uLmxlYWYsa2Uobix0aGlzLnRvQkJveCksa2Uocyx0aGlzLnRvQkJveCksZT90W2UtMV0uY2hpbGRyZW4ucHVzaChzKTp0aGlzLl9zcGxpdFJvb3QobixzKX0sX3NwbGl0Um9vdDpmdW5jdGlvbih0LGUpe3RoaXMuZGF0YT1aZShbdCxlXSksdGhpcy5kYXRhLmhlaWdodD10LmhlaWdodCsxLHRoaXMuZGF0YS5sZWFmPSExLGtlKHRoaXMuZGF0YSx0aGlzLnRvQkJveCl9LF9jaG9vc2VTcGxpdEluZGV4OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpLG8scyxhLHUsYyxsO2Zvcih1PWM9MS8wLHI9ZTtyPD1uLWU7cisrKXM9WGUoaT16ZSh0LDAscix0aGlzLnRvQkJveCksbz16ZSh0LHIsbix0aGlzLnRvQkJveCkpLGE9VmUoaSkrVmUobyksczx1Pyh1PXMsbD1yLGM9YTxjP2E6Yyk6cz09PXUmJmE8YyYmKGM9YSxsPXIpO3JldHVybiBsfSxfY2hvb3NlU3BsaXRBeGlzOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmxlYWY/dGhpcy5jb21wYXJlTWluWDpVZSxpPXQubGVhZj90aGlzLmNvbXBhcmVNaW5ZOnFlO3RoaXMuX2FsbERpc3RNYXJnaW4odCxlLG4scik8dGhpcy5fYWxsRGlzdE1hcmdpbih0LGUsbixpKSYmdC5jaGlsZHJlbi5zb3J0KHIpfSxfYWxsRGlzdE1hcmdpbjpmdW5jdGlvbih0LGUsbixyKXt0LmNoaWxkcmVuLnNvcnQocik7dmFyIGksbyxzPXRoaXMudG9CQm94LGE9emUodCwwLGUscyksdT16ZSh0LG4tZSxuLHMpLGM9R2UoYSkrR2UodSk7Zm9yKGk9ZTtpPG4tZTtpKyspbz10LmNoaWxkcmVuW2ldLGplKGEsdC5sZWFmP3Mobyk6byksYys9R2UoYSk7Zm9yKGk9bi1lLTE7aT49ZTtpLS0pbz10LmNoaWxkcmVuW2ldLGplKHUsdC5sZWFmP3Mobyk6byksYys9R2UodSk7cmV0dXJuIGN9LF9hZGp1c3RQYXJlbnRCQm94ZXM6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uO3I+PTA7ci0tKWplKGVbcl0sdCl9LF9jb25kZW5zZTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbj10Lmxlbmd0aC0xO24+PTA7bi0tKTA9PT10W25dLmNoaWxkcmVuLmxlbmd0aD9uPjA/KGU9dFtuLTFdLmNoaWxkcmVuKS5zcGxpY2UoZS5pbmRleE9mKHRbbl0pLDEpOnRoaXMuY2xlYXIoKTprZSh0W25dLHRoaXMudG9CQm94KX0sX2luaXRGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9WyJyZXR1cm4gYSIsIiAtIGIiLCI7Il07dGhpcy5jb21wYXJlTWluWD1uZXcgRnVuY3Rpb24oImEiLCJiIixlLmpvaW4odFswXSkpLHRoaXMuY29tcGFyZU1pblk9bmV3IEZ1bmN0aW9uKCJhIiwiYiIsZS5qb2luKHRbMV0pKSx0aGlzLnRvQkJveD1uZXcgRnVuY3Rpb24oImEiLCJyZXR1cm4ge21pblg6IGEiK3RbMF0rIiwgbWluWTogYSIrdFsxXSsiLCBtYXhYOiBhIit0WzJdKyIsIG1heFk6IGEiK3RbM10rIn07Iil9fTt2YXIgUWU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQqZSxpPSRlKnQsbz1pLXQscz1pLW8sYT10LXMsdT0kZSplLGM9dS0odS1lKSxsPWUtYyxoPWEqbC0oci1zKmMtYSpjLXMqbCk7cmV0dXJuIG4/KG5bMF09aCxuWzFdPXIsbik6W2gscl19LCRlPSsoTWF0aC5wb3coMiwyNykrMSk7dmFyIHRuPWZ1bmN0aW9uKHQsZSl7dmFyIG49MHx0Lmxlbmd0aCxyPTB8ZS5sZW5ndGg7aWYoMT09PW4mJjE9PT1yKXJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPXQrZSxyPW4tdCxpPW4tcixvPWUtcixzPXQtaSxhPXMrbztyZXR1cm4gYT9bYSxuXTpbbl19KHRbMF0sZVswXSk7dmFyIGksbyxzPW5ldyBBcnJheShuK3IpLGE9MCx1PTAsYz0wLGw9TWF0aC5hYnMsaD10W3VdLGY9bChoKSxwPWVbY10sZD1sKHApO2Y8ZD8obz1oLCh1Kz0xKTxuJiYoaD10W3VdLGY9bChoKSkpOihvPXAsKGMrPTEpPHImJihwPWVbY10sZD1sKHApKSksdTxuJiZmPGR8fGM+PXI/KGk9aCwodSs9MSk8biYmKGg9dFt1XSxmPWwoaCkpKTooaT1wLChjKz0xKTxyJiYocD1lW2NdLGQ9bChwKSkpO2Zvcih2YXIgZyx5LG09aStvLHY9bS1pLF89by12LHg9Xyx3PW07dTxuJiZjPHI7KWY8ZD8oaT1oLCh1Kz0xKTxuJiYoaD10W3VdLGY9bChoKSkpOihpPXAsKGMrPTEpPHImJihwPWVbY10sZD1sKHApKSksKF89KG89eCktKHY9KG09aStvKS1pKSkmJihzW2ErK109XykseD13LSgoZz13K20pLSh5PWctdykpKyhtLXkpLHc9Zztmb3IoO3U8bjspKF89KG89eCktKHY9KG09KGk9aCkrbyktaSkpJiYoc1thKytdPV8pLHg9dy0oKGc9dyttKS0oeT1nLXcpKSsobS15KSx3PWcsKHUrPTEpPG4mJihoPXRbdV0pO2Zvcig7YzxyOykoXz0obz14KS0odj0obT0oaT1wKStvKS1pKSkmJihzW2ErK109XykseD13LSgoZz13K20pLSh5PWctdykpKyhtLXkpLHc9ZywoYys9MSk8ciYmKHA9ZVtjXSk7cmV0dXJuIHgmJihzW2ErK109eCksdyYmKHNbYSsrXT13KSxhfHwoc1thKytdPTApLHMubGVuZ3RoPWEsc307dmFyIGVuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10K2UsaT1yLXQsbz1lLWkscz10LShyLWkpO3JldHVybiBuPyhuWzBdPXMrbyxuWzFdPXIsbik6W3MrbyxyXX07dmFyIG5uPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5sZW5ndGg7aWYoMT09PW4pe3ZhciByPVFlKHRbMF0sZSk7cmV0dXJuIHJbMF0/cjpbclsxXV19dmFyIGk9bmV3IEFycmF5KDIqbiksbz1bLjEsLjFdLHM9Wy4xLC4xXSxhPTA7UWUodFswXSxlLG8pLG9bMF0mJihpW2ErK109b1swXSk7Zm9yKHZhciB1PTE7dTxuOysrdSl7UWUodFt1XSxlLHMpO3ZhciBjPW9bMV07ZW4oYyxzWzBdLG8pLG9bMF0mJihpW2ErK109b1swXSk7dmFyIGw9c1sxXSxoPW9bMV0sZj1sK2gscD1oLShmLWwpO29bMV09ZixwJiYoaVthKytdPXApfXJldHVybiBvWzFdJiYoaVthKytdPW9bMV0pLDA9PT1hJiYoaVthKytdPTApLGkubGVuZ3RoPWEsaX07dmFyIHJuPWZ1bmN0aW9uKHQsZSl7dmFyIG49MHx0Lmxlbmd0aCxyPTB8ZS5sZW5ndGg7aWYoMT09PW4mJjE9PT1yKXJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPXQrZSxyPW4tdCxpPW4tcixvPWUtcixzPXQtaSxhPXMrbztyZXR1cm4gYT9bYSxuXTpbbl19KHRbMF0sLWVbMF0pO3ZhciBpLG8scz1uZXcgQXJyYXkobityKSxhPTAsdT0wLGM9MCxsPU1hdGguYWJzLGg9dFt1XSxmPWwoaCkscD0tZVtjXSxkPWwocCk7ZjxkPyhvPWgsKHUrPTEpPG4mJihoPXRbdV0sZj1sKGgpKSk6KG89cCwoYys9MSk8ciYmKHA9LWVbY10sZD1sKHApKSksdTxuJiZmPGR8fGM+PXI/KGk9aCwodSs9MSk8biYmKGg9dFt1XSxmPWwoaCkpKTooaT1wLChjKz0xKTxyJiYocD0tZVtjXSxkPWwocCkpKTtmb3IodmFyIGcseSxtPWkrbyx2PW0taSxfPW8tdix4PV8sdz1tO3U8biYmYzxyOylmPGQ/KGk9aCwodSs9MSk8biYmKGg9dFt1XSxmPWwoaCkpKTooaT1wLChjKz0xKTxyJiYocD0tZVtjXSxkPWwocCkpKSwoXz0obz14KS0odj0obT1pK28pLWkpKSYmKHNbYSsrXT1fKSx4PXctKChnPXcrbSktKHk9Zy13KSkrKG0teSksdz1nO2Zvcig7dTxuOykoXz0obz14KS0odj0obT0oaT1oKStvKS1pKSkmJihzW2ErK109XykseD13LSgoZz13K20pLSh5PWctdykpKyhtLXkpLHc9ZywodSs9MSk8biYmKGg9dFt1XSk7Zm9yKDtjPHI7KShfPShvPXgpLSh2PShtPShpPXApK28pLWkpKSYmKHNbYSsrXT1fKSx4PXctKChnPXcrbSktKHk9Zy13KSkrKG0teSksdz1nLChjKz0xKTxyJiYocD0tZVtjXSk7cmV0dXJuIHgmJihzW2ErK109eCksdyYmKHNbYSsrXT13KSxhfHwoc1thKytdPTApLHMubGVuZ3RoPWEsc307dmFyIG9uPUplKChmdW5jdGlvbih0KXt2YXIgZT0xMTEwMjIzMDI0NjI1MTU2NWUtMzIsbj0oMysxNiplKSplLHI9KDcrNTYqZSkqZTtmdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciBuPW5ldyBBcnJheSh0Lmxlbmd0aC0xKSxyPTE7cjx0Lmxlbmd0aDsrK3IpZm9yKHZhciBpPW5bci0xXT1uZXcgQXJyYXkodC5sZW5ndGgtMSksbz0wLHM9MDtvPHQubGVuZ3RoOysrbylvIT09ZSYmKGlbcysrXT10W3JdW29dKTtyZXR1cm4gbn1mdW5jdGlvbiBvKHQpe3JldHVybiAxJnQ/Ii0iOiIifWZ1bmN0aW9uIHModCl7aWYoMT09PXQubGVuZ3RoKXJldHVybiB0WzBdO2lmKDI9PT10Lmxlbmd0aClyZXR1cm5bInN1bSgiLHRbMF0sIiwiLHRbMV0sIikiXS5qb2luKCIiKTt2YXIgZT10Lmxlbmd0aD4+MTtyZXR1cm5bInN1bSgiLHModC5zbGljZSgwLGUpKSwiLCIscyh0LnNsaWNlKGUpKSwiKSJdLmpvaW4oIiIpfWZ1bmN0aW9uIGEodCl7aWYoMj09PXQubGVuZ3RoKXJldHVybltbInN1bShwcm9kKCIsdFswXVswXSwiLCIsdFsxXVsxXSwiKSxwcm9kKC0iLHRbMF1bMV0sIiwiLHRbMV1bMF0sIikpIl0uam9pbigiIildO2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDsrK24pZS5wdXNoKFsic2NhbGUoIixzKGEoaSh0LG4pKSksIiwiLG8obiksdFswXVtuXSwiKSJdLmpvaW4oIiIpKTtyZXR1cm4gZX1mdW5jdGlvbiB1KHQpe2Zvcih2YXIgZT1bXSxuPVtdLHI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0KSxuPTA7bjx0Oysrbil7ZVtuXT1uZXcgQXJyYXkodCk7Zm9yKHZhciByPTA7cjx0OysrcillW25dW3JdPVsibSIsciwiWyIsdC1uLTEsIl0iXS5qb2luKCIiKX1yZXR1cm4gZX0odCksbz1bXSx1PTA7dTx0OysrdSkxJnU/bi5wdXNoLmFwcGx5KG4sYShpKHIsdSkpKTplLnB1c2guYXBwbHkoZSxhKGkocix1KSkpLG8ucHVzaCgibSIrdSk7dmFyIGM9cyhlKSxsPXMobiksaD0ib3JpZW50YXRpb24iK3QrIkV4YWN0IixmPVsiZnVuY3Rpb24gIixoLCIoIixvLmpvaW4oKSwiKXt2YXIgcD0iLGMsIixuPSIsbCwiLGQ9c3ViKHAsbik7cmV0dXJuIGRbZC5sZW5ndGgtMV07fTtyZXR1cm4gIixoXS5qb2luKCIiKTtyZXR1cm4gbmV3IEZ1bmN0aW9uKCJzdW0iLCJwcm9kIiwic2NhbGUiLCJzdWIiLGYpKHRuLFFlLG5uLHJuKX12YXIgYz11KDMpLGw9dSg0KSxoPVtmdW5jdGlvbigpe3JldHVybiAwfSxmdW5jdGlvbigpe3JldHVybiAwfSxmdW5jdGlvbih0LGUpe3JldHVybiBlWzBdLXRbMF19LGZ1bmN0aW9uKHQsZSxyKXt2YXIgaSxvPSh0WzFdLXJbMV0pKihlWzBdLXJbMF0pLHM9KHRbMF0tclswXSkqKGVbMV0tclsxXSksYT1vLXM7aWYobz4wKXtpZihzPD0wKXJldHVybiBhO2k9bytzfWVsc2V7aWYoIShvPDApKXJldHVybiBhO2lmKHM+PTApcmV0dXJuIGE7aT0tKG8rcyl9dmFyIHU9bippO3JldHVybiBhPj11fHxhPD0tdT9hOmModCxlLHIpfSxmdW5jdGlvbih0LGUsbixpKXt2YXIgbz10WzBdLWlbMF0scz1lWzBdLWlbMF0sYT1uWzBdLWlbMF0sdT10WzFdLWlbMV0sYz1lWzFdLWlbMV0saD1uWzFdLWlbMV0sZj10WzJdLWlbMl0scD1lWzJdLWlbMl0sZD1uWzJdLWlbMl0sZz1zKmgseT1hKmMsbT1hKnUsdj1vKmgsXz1vKmMseD1zKnUsdz1mKihnLXkpK3AqKG0tdikrZCooXy14KSxiPShNYXRoLmFicyhnKStNYXRoLmFicyh5KSkqTWF0aC5hYnMoZikrKE1hdGguYWJzKG0pK01hdGguYWJzKHYpKSpNYXRoLmFicyhwKSsoTWF0aC5hYnMoXykrTWF0aC5hYnMoeCkpKk1hdGguYWJzKGQpLEQ9cipiO3JldHVybiB3PkR8fC13PkQ/dzpsKHQsZSxuLGkpfV07ZnVuY3Rpb24gZih0KXt2YXIgZT1oW3QubGVuZ3RoXTtyZXR1cm4gZXx8KGU9aFt0Lmxlbmd0aF09dSh0Lmxlbmd0aCkpLGUuYXBwbHkodm9pZCAwLHQpfSFmdW5jdGlvbigpe2Zvcig7aC5sZW5ndGg8PTU7KWgucHVzaCh1KGgubGVuZ3RoKSk7Zm9yKHZhciBlPVtdLG49WyJzbG93Il0scj0wO3I8PTU7KytyKWUucHVzaCgiYSIrciksbi5wdXNoKCJvIityKTt2YXIgaT1bImZ1bmN0aW9uIGdldE9yaWVudGF0aW9uKCIsZS5qb2luKCksIil7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpjYXNlIDE6cmV0dXJuIDA7Il07Zm9yKHI9MjtyPD01OysrcilpLnB1c2goImNhc2UgIixyLCI6cmV0dXJuIG8iLHIsIigiLGUuc2xpY2UoMCxyKS5qb2luKCksIik7Iik7aS5wdXNoKCJ9dmFyIHM9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO2Zvcih2YXIgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDsrK2kpe3NbaV09YXJndW1lbnRzW2ldfTtyZXR1cm4gc2xvdyhzKTt9cmV0dXJuIGdldE9yaWVudGF0aW9uIiksbi5wdXNoKGkuam9pbigiIikpO3ZhciBvPUZ1bmN0aW9uLmFwcGx5KHZvaWQgMCxuKTtmb3IodC5leHBvcnRzPW8uYXBwbHkodm9pZCAwLFtmXS5jb25jYXQoaCkpLHI9MDtyPD01Oysrcil0LmV4cG9ydHNbcl09aFtyXX0oKX0pKSxzbj1mdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDtpZihlPDMpe2Zvcih2YXIgbj1uZXcgQXJyYXkoZSkscj0wO3I8ZTsrK3IpbltyXT1yO3JldHVybiAyPT09ZSYmdFswXVswXT09PXRbMV1bMF0mJnRbMF1bMV09PT10WzFdWzFdP1swXTpufXZhciBpPW5ldyBBcnJheShlKTtmb3Iocj0wO3I8ZTsrK3IpaVtyXT1yO2kuc29ydCgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdFtlXVswXS10W25dWzBdfHx0W2VdWzFdLXRbbl1bMV19KSk7dmFyIG89W2lbMF0saVsxXV0scz1baVswXSxpWzFdXTtmb3Iocj0yO3I8ZTsrK3Ipe2Zvcih2YXIgYT1pW3JdLHU9dFthXSxjPW8ubGVuZ3RoO2M+MSYmYW4odFtvW2MtMl1dLHRbb1tjLTFdXSx1KTw9MDspYy09MSxvLnBvcCgpO2ZvcihvLnB1c2goYSksYz1zLmxlbmd0aDtjPjEmJmFuKHRbc1tjLTJdXSx0W3NbYy0xXV0sdSk+PTA7KWMtPTEscy5wb3AoKTtzLnB1c2goYSl9bj1uZXcgQXJyYXkocy5sZW5ndGgrby5sZW5ndGgtMik7Zm9yKHZhciBsPTAsaD0ocj0wLG8ubGVuZ3RoKTtyPGg7KytyKW5bbCsrXT1vW3JdO2Zvcih2YXIgZj1zLmxlbmd0aC0yO2Y+MDstLWYpbltsKytdPXNbZl07cmV0dXJuIG59LGFuPW9uWzNdO3ZhciB1bj1sbixjbj1sbjtmdW5jdGlvbiBsbih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGxuKSlyZXR1cm4gbmV3IGxuKHQsZSk7aWYodGhpcy5kYXRhPXR8fFtdLHRoaXMubGVuZ3RoPXRoaXMuZGF0YS5sZW5ndGgsdGhpcy5jb21wYXJlPWV8fGhuLHRoaXMubGVuZ3RoPjApZm9yKHZhciBuPSh0aGlzLmxlbmd0aD4+MSktMTtuPj0wO24tLSl0aGlzLl9kb3duKG4pfWZ1bmN0aW9uIGhuKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTowfWxuLnByb3RvdHlwZT17cHVzaDpmdW5jdGlvbih0KXt0aGlzLmRhdGEucHVzaCh0KSx0aGlzLmxlbmd0aCsrLHRoaXMuX3VwKHRoaXMubGVuZ3RoLTEpfSxwb3A6ZnVuY3Rpb24oKXtpZigwIT09dGhpcy5sZW5ndGgpe3ZhciB0PXRoaXMuZGF0YVswXTtyZXR1cm4gdGhpcy5sZW5ndGgtLSx0aGlzLmxlbmd0aD4wJiYodGhpcy5kYXRhWzBdPXRoaXMuZGF0YVt0aGlzLmxlbmd0aF0sdGhpcy5fZG93bigwKSksdGhpcy5kYXRhLnBvcCgpLHR9fSxwZWVrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YVswXX0sX3VwOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmRhdGEsbj10aGlzLmNvbXBhcmUscj1lW3RdO3Q+MDspe3ZhciBpPXQtMT4+MSxvPWVbaV07aWYobihyLG8pPj0wKWJyZWFrO2VbdF09byx0PWl9ZVt0XT1yfSxfZG93bjpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5kYXRhLG49dGhpcy5jb21wYXJlLHI9dGhpcy5sZW5ndGg+PjEsaT1lW3RdO3Q8cjspe3ZhciBvPTErKHQ8PDEpLHM9bysxLGE9ZVtvXTtpZihzPHRoaXMubGVuZ3RoJiZuKGVbc10sYSk8MCYmKG89cyxhPWVbc10pLG4oYSxpKT49MClicmVhaztlW3RdPWEsdD1vfWVbdF09aX19LHVuLmRlZmF1bHQ9Y247dmFyIGZuPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRbMF0scj10WzFdLGk9ITEsbz0wLHM9ZS5sZW5ndGgtMTtvPGUubGVuZ3RoO3M9bysrKXt2YXIgYT1lW29dWzBdLHU9ZVtvXVsxXSxjPWVbc11bMF0sbD1lW3NdWzFdO3U+ciE9bD5yJiZuPChjLWEpKihyLXUpLyhsLXUpK2EmJihpPSFpKX1yZXR1cm4gaX0scG49b25bM10sZG49Z247ZnVuY3Rpb24gZ24odCxlLG4pe2U9TWF0aC5tYXgoMCx2b2lkIDA9PT1lPzI6ZSksbj1ufHwwO2Zvcih2YXIgcixpPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10WzBdLG49dFswXSxyPXRbMF0saT10WzBdLG89MDtvPHQubGVuZ3RoO28rKyl7dmFyIHM9dFtvXTtzWzBdPGVbMF0mJihlPXMpLHNbMF0+clswXSYmKHI9cyksc1sxXTxuWzFdJiYobj1zKSxzWzFdPmlbMV0mJihpPXMpfXZhciBhPVtlLG4scixpXSx1PWEuc2xpY2UoKTtmb3Iobz0wO288dC5sZW5ndGg7bysrKWZuKHRbb10sYSl8fHUucHVzaCh0W29dKTt2YXIgYz1zbih1KSxsPVtdO2ZvcihvPTA7bzxjLmxlbmd0aDtvKyspbC5wdXNoKHVbY1tvXV0pO3JldHVybiBsfSh0KSxvPVBlKDE2LFsiWzBdIiwiWzFdIiwiWzBdIiwiWzFdIl0pLmxvYWQodCkscz1bXSxhPTA7YTxpLmxlbmd0aDthKyspe3ZhciB1PWlbYV07by5yZW1vdmUodSkscj1Ebih1LHIpLHMucHVzaChyKX12YXIgYz1QZSgxNik7Zm9yKGE9MDthPHMubGVuZ3RoO2ErKyljLmluc2VydChibihzW2FdKSk7Zm9yKHZhciBsPWUqZSxoPW4qbjtzLmxlbmd0aDspe3ZhciBmPXMuc2hpZnQoKSxwPWYucCxkPWYubmV4dC5wLGc9RW4ocCxkKTtpZighKGc8aCkpe3ZhciB5PWcvbDsodT15bihvLGYucHJldi5wLHAsZCxmLm5leHQubmV4dC5wLHksYykpJiZNYXRoLm1pbihFbih1LHApLEVuKHUsZCkpPD15JiYocy5wdXNoKGYpLHMucHVzaChEbih1LGYpKSxvLnJlbW92ZSh1KSxjLnJlbW92ZShmKSxjLmluc2VydChibihmKSksYy5pbnNlcnQoYm4oZi5uZXh0KSkpfX1mPXI7dmFyIG09W107ZG97bS5wdXNoKGYucCksZj1mLm5leHR9d2hpbGUoZiE9PXIpO3JldHVybiBtLnB1c2goZi5wKSxtfWZ1bmN0aW9uIHluKHQsZSxuLHIsaSxvLHMpe2Zvcih2YXIgYT1uZXcgdW4obnVsbCxtbiksdT10LmRhdGE7dTspe2Zvcih2YXIgYz0wO2M8dS5jaGlsZHJlbi5sZW5ndGg7YysrKXt2YXIgbD11LmNoaWxkcmVuW2NdLGg9dS5sZWFmP0NuKGwsbixyKTp2bihuLHIsbCk7aD5vfHxhLnB1c2goe25vZGU6bCxkaXN0Omh9KX1mb3IoO2EubGVuZ3RoJiYhYS5wZWVrKCkubm9kZS5jaGlsZHJlbjspe3ZhciBmPWEucG9wKCkscD1mLm5vZGUsZD1DbihwLGUsbiksZz1DbihwLHIsaSk7aWYoZi5kaXN0PGQmJmYuZGlzdDxnJiZ4bihuLHAscykmJnhuKHIscCxzKSlyZXR1cm4gcH0odT1hLnBvcCgpKSYmKHU9dS5ub2RlKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBtbih0LGUpe3JldHVybiB0LmRpc3QtZS5kaXN0fWZ1bmN0aW9uIHZuKHQsZSxuKXtpZihfbih0LG4pfHxfbihlLG4pKXJldHVybiAwO3ZhciByPVNuKHRbMF0sdFsxXSxlWzBdLGVbMV0sbi5taW5YLG4ubWluWSxuLm1heFgsbi5taW5ZKTtpZigwPT09cilyZXR1cm4gMDt2YXIgaT1Tbih0WzBdLHRbMV0sZVswXSxlWzFdLG4ubWluWCxuLm1pblksbi5taW5YLG4ubWF4WSk7aWYoMD09PWkpcmV0dXJuIDA7dmFyIG89U24odFswXSx0WzFdLGVbMF0sZVsxXSxuLm1heFgsbi5taW5ZLG4ubWF4WCxuLm1heFkpO2lmKDA9PT1vKXJldHVybiAwO3ZhciBzPVNuKHRbMF0sdFsxXSxlWzBdLGVbMV0sbi5taW5YLG4ubWF4WSxuLm1heFgsbi5tYXhZKTtyZXR1cm4gMD09PXM/MDpNYXRoLm1pbihyLGksbyxzKX1mdW5jdGlvbiBfbih0LGUpe3JldHVybiB0WzBdPj1lLm1pblgmJnRbMF08PWUubWF4WCYmdFsxXT49ZS5taW5ZJiZ0WzFdPD1lLm1heFl9ZnVuY3Rpb24geG4odCxlLG4pe2Zvcih2YXIgcj1NYXRoLm1pbih0WzBdLGVbMF0pLGk9TWF0aC5taW4odFsxXSxlWzFdKSxvPU1hdGgubWF4KHRbMF0sZVswXSkscz1NYXRoLm1heCh0WzFdLGVbMV0pLGE9bi5zZWFyY2goe21pblg6cixtaW5ZOmksbWF4WDpvLG1heFk6c30pLHU9MDt1PGEubGVuZ3RoO3UrKylpZih3bihhW3VdLnAsYVt1XS5uZXh0LnAsdCxlKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB3bih0LGUsbixyKXtyZXR1cm4gdCE9PXImJmUhPT1uJiZwbih0LGUsbik+MCE9cG4odCxlLHIpPjAmJnBuKG4scix0KT4wIT1wbihuLHIsZSk+MH1mdW5jdGlvbiBibih0KXt2YXIgZT10LnAsbj10Lm5leHQucDtyZXR1cm4gdC5taW5YPU1hdGgubWluKGVbMF0sblswXSksdC5taW5ZPU1hdGgubWluKGVbMV0sblsxXSksdC5tYXhYPU1hdGgubWF4KGVbMF0sblswXSksdC5tYXhZPU1hdGgubWF4KGVbMV0sblsxXSksdH1mdW5jdGlvbiBEbih0LGUpe3ZhciBuPXtwOnQscHJldjpudWxsLG5leHQ6bnVsbCxtaW5YOjAsbWluWTowLG1heFg6MCxtYXhZOjB9O3JldHVybiBlPyhuLm5leHQ9ZS5uZXh0LG4ucHJldj1lLGUubmV4dC5wcmV2PW4sZS5uZXh0PW4pOihuLnByZXY9bixuLm5leHQ9biksbn1mdW5jdGlvbiBFbih0LGUpe3ZhciBuPXRbMF0tZVswXSxyPXRbMV0tZVsxXTtyZXR1cm4gbipuK3Iqcn1mdW5jdGlvbiBDbih0LGUsbil7dmFyIHI9ZVswXSxpPWVbMV0sbz1uWzBdLXIscz1uWzFdLWk7aWYoMCE9PW98fDAhPT1zKXt2YXIgYT0oKHRbMF0tcikqbysodFsxXS1pKSpzKS8obypvK3Mqcyk7YT4xPyhyPW5bMF0saT1uWzFdKTphPjAmJihyKz1vKmEsaSs9cyphKX1yZXR1cm4obz10WzBdLXIpKm8rKHM9dFsxXS1pKSpzfWZ1bmN0aW9uIFNuKHQsZSxuLHIsaSxvLHMsYSl7dmFyIHUsYyxsLGgsZj1uLXQscD1yLWUsZD1zLWksZz1hLW8seT10LWksbT1lLW8sdj1mKmYrcCpwLF89ZipkK3AqZyx4PWQqZCtnKmcsdz1mKnkrcCptLGI9ZCp5K2cqbSxEPXYqeC1fKl8sRT1ELEM9RDswPT09RD8oYz0wLEU9MSxoPWIsQz14KTooaD12KmItXyp3LChjPV8qYi14KncpPDA/KGM9MCxoPWIsQz14KTpjPkUmJihjPUUsaD1iK18sQz14KSksaDwwPyhoPTAsLXc8MD9jPTA6LXc+dj9jPUU6KGM9LXcsRT12KSk6aD5DJiYoaD1DLC13K188MD9jPTA6LXcrXz52P2M9RTooYz0tdytfLEU9dikpO3ZhciBTPSgxLShsPTA9PT1oPzA6aC9DKSkqaStsKnMtKCgxLSh1PTA9PT1jPzA6Yy9FKSkqdCt1Km4pLEE9KDEtbCkqbytsKmEtKCgxLXUpKmUrdSpyKTtyZXR1cm4gUypTK0EqQX1mdW5jdGlvbiBBbih0LGUsbil7aWYoIm9iamVjdCIhPXR5cGVvZihuPW58fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciByPW4uaWdub3JlQm91bmRhcnk7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJwb2ludCBpcyByZXF1aXJlZCIpO2lmKCFlKXRocm93IG5ldyBFcnJvcigicG9seWdvbiBpcyByZXF1aXJlZCIpO3ZhciBpPUllKHQpLG89TWUoZSkscz1lLmdlb21ldHJ5P2UuZ2VvbWV0cnkudHlwZTplLnR5cGUsYT1lLmJib3g7aWYoYSYmITE9PT1mdW5jdGlvbih0LGUpe3JldHVybiBlWzBdPD10WzBdJiZlWzFdPD10WzFdJiZlWzJdPj10WzBdJiZlWzNdPj10WzFdfShpLGEpKXJldHVybiExOyJQb2x5Z29uIj09PXMmJihvPVtvXSk7Zm9yKHZhciB1PTAsYz0hMTt1PG8ubGVuZ3RoJiYhYzt1KyspaWYoTm4oaSxvW3VdWzBdLHIpKXtmb3IodmFyIGw9ITEsaD0xO2g8b1t1XS5sZW5ndGgmJiFsOylObihpLG9bdV1baF0sIXIpJiYobD0hMCksaCsrO2x8fChjPSEwKX1yZXR1cm4gY31mdW5jdGlvbiBObih0LGUsbil7dmFyIHI9ITE7ZVswXVswXT09PWVbZS5sZW5ndGgtMV1bMF0mJmVbMF1bMV09PT1lW2UubGVuZ3RoLTFdWzFdJiYoZT1lLnNsaWNlKDAsZS5sZW5ndGgtMSkpO2Zvcih2YXIgaT0wLG89ZS5sZW5ndGgtMTtpPGUubGVuZ3RoO289aSsrKXt2YXIgcz1lW2ldWzBdLGE9ZVtpXVsxXSx1PWVbb11bMF0sYz1lW29dWzFdO2lmKHRbMV0qKHMtdSkrYSoodS10WzBdKStjKih0WzBdLXMpPT0wJiYocy10WzBdKSoodS10WzBdKTw9MCYmKGEtdFsxXSkqKGMtdFsxXSk8PTApcmV0dXJuIW47YT50WzFdIT1jPnRbMV0mJnRbMF08KHUtcykqKHRbMV0tYSkvKGMtYSkrcyYmKHI9IXIpfXJldHVybiByfWZ1bmN0aW9uIEluKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO3N3aXRjaCh0LnR5cGUpe2Nhc2UiRmVhdHVyZSI6cmV0dXJuIE1uKHQpO2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOnJldHVybiBmdW5jdGlvbih0KXt2YXIgZT17dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24ifTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24obil7c3dpdGNoKG4pe2Nhc2UidHlwZSI6Y2FzZSJmZWF0dXJlcyI6cmV0dXJuO2RlZmF1bHQ6ZVtuXT10W25dfX0pKSxlLmZlYXR1cmVzPXQuZmVhdHVyZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gTW4odCl9KSksZX0odCk7Y2FzZSJQb2ludCI6Y2FzZSJMaW5lU3RyaW5nIjpjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlQb2ludCI6Y2FzZSJNdWx0aUxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2x5Z29uIjpjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6cmV0dXJuIFRuKHQpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIEdlb0pTT04gdHlwZSIpfX1mdW5jdGlvbiBNbih0KXt2YXIgZT17dHlwZToiRmVhdHVyZSJ9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihuKXtzd2l0Y2gobil7Y2FzZSJ0eXBlIjpjYXNlInByb3BlcnRpZXMiOmNhc2UiZ2VvbWV0cnkiOnJldHVybjtkZWZhdWx0OmVbbl09dFtuXX19KSksZS5wcm9wZXJ0aWVzPUZuKHQucHJvcGVydGllcyksZS5nZW9tZXRyeT1Ubih0Lmdlb21ldHJ5KSxlfWZ1bmN0aW9uIEZuKHQpe3ZhciBlPXt9O3JldHVybiB0JiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgcj10W25dOyJvYmplY3QiPT10eXBlb2Ygcj9udWxsPT09cj9lW25dPW51bGw6ci5sZW5ndGg/ZVtuXT1yLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSk6ZVtuXT1GbihyKTplW25dPXJ9KSksZX1mdW5jdGlvbiBUbih0KXt2YXIgZT17dHlwZTp0LnR5cGV9O3JldHVybiB0LmJib3gmJihlLmJib3g9dC5iYm94KSwiR2VvbWV0cnlDb2xsZWN0aW9uIj09PXQudHlwZT8oZS5nZW9tZXRyaWVzPXQuZ2VvbWV0cmllcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBUbih0KX0pKSxlKTooZS5jb29yZGluYXRlcz1Pbih0LmNvb3JkaW5hdGVzKSxlKX1mdW5jdGlvbiBPbih0KXtyZXR1cm4ib2JqZWN0IiE9dHlwZW9mIHRbMF0/dC5zbGljZSgpOnQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gT24odCl9KSl9ZnVuY3Rpb24gTG4odCl7cmV0dXJuIGZ1bmN0aW9uKHQpe19lKHQpO3ZhciBlPU51bWJlcih0WzBdKSxuPU51bWJlcih0WzFdKSxyPU51bWJlcih0WzJdKSxpPU51bWJlcih0WzNdKTtpZig2PT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJAdHVyZi9iYm94LXBvbHlnb24gZG9lcyBub3Qgc3VwcG9ydCBCQm94IHdpdGggNiBwb3NpdGlvbnMiKTt2YXIgbz1bZSxuXTtyZXR1cm4gdWUoW1tvLFtyLG5dLFtyLGldLFtlLGldLG9dXSl9KGZ1bmN0aW9uKHQpe3ZhciBlPVsxLzAsMS8wLC0xLzAsLTEvMF07cmV0dXJuIHdlKHQsKGZ1bmN0aW9uKHQpe2VbMF0+dFswXSYmKGVbMF09dFswXSksZVsxXT50WzFdJiYoZVsxXT10WzFdKSxlWzJdPHRbMF0mJihlWzJdPXRbMF0pLGVbM108dFsxXSYmKGVbM109dFsxXSl9KSksZX0odCkpfWduLmRlZmF1bHQ9ZG47dmFyIFBuPUJuLFJuPUJuO2Z1bmN0aW9uIEJuKHQsZSxuKXtuPW58fDI7dmFyIHIsaSxvLHMsYSx1LGMsbD1lJiZlLmxlbmd0aCxoPWw/ZVswXSpuOnQubGVuZ3RoLGY9a24odCwwLGgsbiwhMCkscD1bXTtpZighZilyZXR1cm4gcDtpZihsJiYoZj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvLHMsYSx1LGM9W107Zm9yKGk9MCxvPWUubGVuZ3RoO2k8bztpKyspcz1lW2ldKnIsYT1pPG8tMT9lW2krMV0qcjp0Lmxlbmd0aCwodT1rbih0LHMsYSxyLCExKSk9PT11Lm5leHQmJih1LnN0ZWluZXI9ITApLGMucHVzaChIbih1KSk7Zm9yKGMuc29ydChZbiksaT0wO2k8Yy5sZW5ndGg7aSsrKVhuKGNbaV0sbiksbj16bihuLG4ubmV4dCk7cmV0dXJuIG59KHQsZSxmLG4pKSx0Lmxlbmd0aD44MCpuKXtyPW89dFswXSxpPXM9dFsxXTtmb3IodmFyIGQ9bjtkPGg7ZCs9bikoYT10W2RdKTxyJiYocj1hKSwodT10W2QrMV0pPGkmJihpPXUpLGE+byYmKG89YSksdT5zJiYocz11KTtjPTAhPT0oYz1NYXRoLm1heChvLXIscy1pKSk/MS9jOjB9cmV0dXJuIGpuKGYscCxuLHIsaSxjKSxwfWZ1bmN0aW9uIGtuKHQsZSxuLHIsaSl7dmFyIG8scztpZihpPT09b3IodCxlLG4scik+MClmb3Iobz1lO288bjtvKz1yKXM9bnIobyx0W29dLHRbbysxXSxzKTtlbHNlIGZvcihvPW4tcjtvPj1lO28tPXIpcz1ucihvLHRbb10sdFtvKzFdLHMpO3JldHVybiBzJiZRbihzLHMubmV4dCkmJihycihzKSxzPXMubmV4dCksc31mdW5jdGlvbiB6bih0LGUpe2lmKCF0KXJldHVybiB0O2V8fChlPXQpO3ZhciBuLHI9dDtkb3tpZihuPSExLHIuc3RlaW5lcnx8IVFuKHIsci5uZXh0KSYmMCE9PUpuKHIucHJldixyLHIubmV4dCkpcj1yLm5leHQ7ZWxzZXtpZihycihyKSwocj1lPXIucHJldik9PT1yLm5leHQpYnJlYWs7bj0hMH19d2hpbGUobnx8ciE9PWUpO3JldHVybiBlfWZ1bmN0aW9uIGpuKHQsZSxuLHIsaSxvLHMpe2lmKHQpeyFzJiZvJiZmdW5jdGlvbih0LGUsbixyKXt2YXIgaT10O2Rve251bGw9PT1pLnomJihpLno9V24oaS54LGkueSxlLG4scikpLGkucHJldlo9aS5wcmV2LGkubmV4dFo9aS5uZXh0LGk9aS5uZXh0fXdoaWxlKGkhPT10KTtpLnByZXZaLm5leHRaPW51bGwsaS5wcmV2Wj1udWxsLGZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8scyxhLHUsYz0xO2Rve2ZvcihuPXQsdD1udWxsLG89bnVsbCxzPTA7bjspe2ZvcihzKysscj1uLGE9MCxlPTA7ZTxjJiYoYSsrLHI9ci5uZXh0Wik7ZSsrKTtmb3IodT1jO2E+MHx8dT4wJiZyOykwIT09YSYmKDA9PT11fHwhcnx8bi56PD1yLnopPyhpPW4sbj1uLm5leHRaLGEtLSk6KGk9cixyPXIubmV4dFosdS0tKSxvP28ubmV4dFo9aTp0PWksaS5wcmV2Wj1vLG89aTtuPXJ9by5uZXh0Wj1udWxsLGMqPTJ9d2hpbGUocz4xKX0oaSl9KHQscixpLG8pO2Zvcih2YXIgYSx1LGM9dDt0LnByZXYhPT10Lm5leHQ7KWlmKGE9dC5wcmV2LHU9dC5uZXh0LG8/cW4odCxyLGksbyk6VW4odCkpZS5wdXNoKGEuaS9uKSxlLnB1c2godC5pL24pLGUucHVzaCh1LmkvbikscnIodCksdD11Lm5leHQsYz11Lm5leHQ7ZWxzZSBpZigodD11KT09PWMpe3M/MT09PXM/am4odD1Wbih0LGUsbiksZSxuLHIsaSxvLDIpOjI9PT1zJiZHbih0LGUsbixyLGksbyk6am4oem4odCksZSxuLHIsaSxvLDEpO2JyZWFrfX19ZnVuY3Rpb24gVW4odCl7dmFyIGU9dC5wcmV2LG49dCxyPXQubmV4dDtpZihKbihlLG4scik+PTApcmV0dXJuITE7Zm9yKHZhciBpPXQubmV4dC5uZXh0O2khPT10LnByZXY7KXtpZihabihlLngsZS55LG4ueCxuLnksci54LHIueSxpLngsaS55KSYmSm4oaS5wcmV2LGksaS5uZXh0KT49MClyZXR1cm4hMTtpPWkubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBxbih0LGUsbixyKXt2YXIgaT10LnByZXYsbz10LHM9dC5uZXh0O2lmKEpuKGksbyxzKT49MClyZXR1cm4hMTtmb3IodmFyIGE9aS54PG8ueD9pLng8cy54P2kueDpzLng6by54PHMueD9vLng6cy54LHU9aS55PG8ueT9pLnk8cy55P2kueTpzLnk6by55PHMueT9vLnk6cy55LGM9aS54Pm8ueD9pLng+cy54P2kueDpzLng6by54PnMueD9vLng6cy54LGw9aS55Pm8ueT9pLnk+cy55P2kueTpzLnk6by55PnMueT9vLnk6cy55LGg9V24oYSx1LGUsbixyKSxmPVduKGMsbCxlLG4scikscD10Lm5leHRaO3AmJnAuejw9Zjspe2lmKHAhPT10LnByZXYmJnAhPT10Lm5leHQmJlpuKGkueCxpLnksby54LG8ueSxzLngscy55LHAueCxwLnkpJiZKbihwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0Wn1mb3IocD10LnByZXZaO3AmJnAuej49aDspe2lmKHAhPT10LnByZXYmJnAhPT10Lm5leHQmJlpuKGkueCxpLnksby54LG8ueSxzLngscy55LHAueCxwLnkpJiZKbihwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5wcmV2Wn1yZXR1cm4hMH1mdW5jdGlvbiBWbih0LGUsbil7dmFyIHI9dDtkb3t2YXIgaT1yLnByZXYsbz1yLm5leHQubmV4dDshUW4oaSxvKSYmJG4oaSxyLHIubmV4dCxvKSYmdHIoaSxvKSYmdHIobyxpKSYmKGUucHVzaChpLmkvbiksZS5wdXNoKHIuaS9uKSxlLnB1c2goby5pL24pLHJyKHIpLHJyKHIubmV4dCkscj10PW8pLHI9ci5uZXh0fXdoaWxlKHIhPT10KTtyZXR1cm4gcn1mdW5jdGlvbiBHbih0LGUsbixyLGksbyl7dmFyIHM9dDtkb3tmb3IodmFyIGE9cy5uZXh0Lm5leHQ7YSE9PXMucHJldjspe2lmKHMuaSE9PWEuaSYmS24ocyxhKSl7dmFyIHU9ZXIocyxhKTtyZXR1cm4gcz16bihzLHMubmV4dCksdT16bih1LHUubmV4dCksam4ocyxlLG4scixpLG8pLHZvaWQgam4odSxlLG4scixpLG8pfWE9YS5uZXh0fXM9cy5uZXh0fXdoaWxlKHMhPT10KX1mdW5jdGlvbiBZbih0LGUpe3JldHVybiB0LngtZS54fWZ1bmN0aW9uIFhuKHQsZSl7aWYoZT1mdW5jdGlvbih0LGUpe3ZhciBuLHI9ZSxpPXQueCxvPXQueSxzPS0xLzA7ZG97aWYobzw9ci55JiZvPj1yLm5leHQueSYmci5uZXh0LnkhPT1yLnkpe3ZhciBhPXIueCsoby1yLnkpKihyLm5leHQueC1yLngpLyhyLm5leHQueS1yLnkpO2lmKGE8PWkmJmE+cyl7aWYocz1hLGE9PT1pKXtpZihvPT09ci55KXJldHVybiByO2lmKG89PT1yLm5leHQueSlyZXR1cm4gci5uZXh0fW49ci54PHIubmV4dC54P3I6ci5uZXh0fX1yPXIubmV4dH13aGlsZShyIT09ZSk7aWYoIW4pcmV0dXJuIG51bGw7aWYoaT09PXMpcmV0dXJuIG4ucHJldjt2YXIgdSxjPW4sbD1uLngsaD1uLnksZj0xLzA7Zm9yKHI9bi5uZXh0O3IhPT1jOylpPj1yLngmJnIueD49bCYmaSE9PXIueCYmWm4obzxoP2k6cyxvLGwsaCxvPGg/czppLG8sci54LHIueSkmJigodT1NYXRoLmFicyhvLXIueSkvKGktci54KSk8Znx8dT09PWYmJnIueD5uLngpJiZ0cihyLHQpJiYobj1yLGY9dSkscj1yLm5leHQ7cmV0dXJuIG59KHQsZSksZSl7dmFyIG49ZXIoZSx0KTt6bihuLG4ubmV4dCl9fWZ1bmN0aW9uIFduKHQsZSxuLHIsaSl7cmV0dXJuKHQ9MTQzMTY1NTc2NSYoKHQ9ODU4OTkzNDU5JigodD0yNTI2NDUxMzUmKCh0PTE2NzExOTM1JigodD0zMjc2NyoodC1uKSppKXx0PDw4KSl8dDw8NCkpfHQ8PDIpKXx0PDwxKSl8KGU9MTQzMTY1NTc2NSYoKGU9ODU4OTkzNDU5JigoZT0yNTI2NDUxMzUmKChlPTE2NzExOTM1JigoZT0zMjc2NyooZS1yKSppKXxlPDw4KSl8ZTw8NCkpfGU8PDIpKXxlPDwxKSk8PDF9ZnVuY3Rpb24gSG4odCl7dmFyIGU9dCxuPXQ7ZG97ZS54PG4ueCYmKG49ZSksZT1lLm5leHR9d2hpbGUoZSE9PXQpO3JldHVybiBufWZ1bmN0aW9uIFpuKHQsZSxuLHIsaSxvLHMsYSl7cmV0dXJuKGktcykqKGUtYSktKHQtcykqKG8tYSk+PTAmJih0LXMpKihyLWEpLShuLXMpKihlLWEpPj0wJiYobi1zKSooby1hKS0oaS1zKSooci1hKT49MH1mdW5jdGlvbiBLbih0LGUpe3JldHVybiB0Lm5leHQuaSE9PWUuaSYmdC5wcmV2LmkhPT1lLmkmJiFmdW5jdGlvbih0LGUpe3ZhciBuPXQ7ZG97aWYobi5pIT09dC5pJiZuLm5leHQuaSE9PXQuaSYmbi5pIT09ZS5pJiZuLm5leHQuaSE9PWUuaSYmJG4obixuLm5leHQsdCxlKSlyZXR1cm4hMDtuPW4ubmV4dH13aGlsZShuIT09dCk7cmV0dXJuITF9KHQsZSkmJnRyKHQsZSkmJnRyKGUsdCkmJmZ1bmN0aW9uKHQsZSl7dmFyIG49dCxyPSExLGk9KHQueCtlLngpLzIsbz0odC55K2UueSkvMjtkb3tuLnk+byE9bi5uZXh0Lnk+byYmbi5uZXh0LnkhPT1uLnkmJmk8KG4ubmV4dC54LW4ueCkqKG8tbi55KS8obi5uZXh0Lnktbi55KStuLngmJihyPSFyKSxuPW4ubmV4dH13aGlsZShuIT09dCk7cmV0dXJuIHJ9KHQsZSl9ZnVuY3Rpb24gSm4odCxlLG4pe3JldHVybihlLnktdC55KSoobi54LWUueCktKGUueC10LngpKihuLnktZS55KX1mdW5jdGlvbiBRbih0LGUpe3JldHVybiB0Lng9PT1lLngmJnQueT09PWUueX1mdW5jdGlvbiAkbih0LGUsbixyKXtyZXR1cm4hIShRbih0LGUpJiZRbihuLHIpfHxRbih0LHIpJiZRbihuLGUpKXx8Sm4odCxlLG4pPjAhPUpuKHQsZSxyKT4wJiZKbihuLHIsdCk+MCE9Sm4obixyLGUpPjB9ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4gSm4odC5wcmV2LHQsdC5uZXh0KTwwP0puKHQsZSx0Lm5leHQpPj0wJiZKbih0LHQucHJldixlKT49MDpKbih0LGUsdC5wcmV2KTwwfHxKbih0LHQubmV4dCxlKTwwfWZ1bmN0aW9uIGVyKHQsZSl7dmFyIG49bmV3IGlyKHQuaSx0LngsdC55KSxyPW5ldyBpcihlLmksZS54LGUueSksaT10Lm5leHQsbz1lLnByZXY7cmV0dXJuIHQubmV4dD1lLGUucHJldj10LG4ubmV4dD1pLGkucHJldj1uLHIubmV4dD1uLG4ucHJldj1yLG8ubmV4dD1yLHIucHJldj1vLHJ9ZnVuY3Rpb24gbnIodCxlLG4scil7dmFyIGk9bmV3IGlyKHQsZSxuKTtyZXR1cm4gcj8oaS5uZXh0PXIubmV4dCxpLnByZXY9cixyLm5leHQucHJldj1pLHIubmV4dD1pKTooaS5wcmV2PWksaS5uZXh0PWkpLGl9ZnVuY3Rpb24gcnIodCl7dC5uZXh0LnByZXY9dC5wcmV2LHQucHJldi5uZXh0PXQubmV4dCx0LnByZXZaJiYodC5wcmV2Wi5uZXh0Wj10Lm5leHRaKSx0Lm5leHRaJiYodC5uZXh0Wi5wcmV2Wj10LnByZXZaKX1mdW5jdGlvbiBpcih0LGUsbil7dGhpcy5pPXQsdGhpcy54PWUsdGhpcy55PW4sdGhpcy5wcmV2PW51bGwsdGhpcy5uZXh0PW51bGwsdGhpcy56PW51bGwsdGhpcy5wcmV2Wj1udWxsLHRoaXMubmV4dFo9bnVsbCx0aGlzLnN0ZWluZXI9ITF9ZnVuY3Rpb24gb3IodCxlLG4scil7Zm9yKHZhciBpPTAsbz1lLHM9bi1yO288bjtvKz1yKWkrPSh0W3NdLXRbb10pKih0W28rMV0rdFtzKzFdKSxzPW87cmV0dXJuIGl9ZnVuY3Rpb24gc3IodCxlLG4pe2lmKCF2ZShuPW58fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciByPW4ubXV0YXRlO2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO3JldHVybiBBcnJheS5pc0FycmF5KHQpJiZtZSh0WzBdKT90PSJtZXJjYXRvciI9PT1lP2FyKHQpOnVyKHQpOighMCE9PXImJih0PUluKHQpKSx3ZSh0LChmdW5jdGlvbih0KXt2YXIgbj0ibWVyY2F0b3IiPT09ZT9hcih0KTp1cih0KTt0WzBdPW5bMF0sdFsxXT1uWzFdfSkpKSx0fWZ1bmN0aW9uIGFyKHQpe3ZhciBlPU1hdGguUEkvMTgwLG49NjM3ODEzNyxyPTIwMDM3NTA4LjM0Mjc4OTI0NCxpPU1hdGguYWJzKHRbMF0pPD0xODA/dFswXTp0WzBdLTM2MCpmdW5jdGlvbih0KXtyZXR1cm4gdDwwPy0xOnQ+MD8xOjB9KHRbMF0pLG89W24qaSplLG4qTWF0aC5sb2coTWF0aC50YW4oLjI1Kk1hdGguUEkrLjUqdFsxXSplKSldO3JldHVybiBvWzBdPnImJihvWzBdPXIpLG9bMF08LXImJihvWzBdPS1yKSxvWzFdPnImJihvWzFdPXIpLG9bMV08LXImJihvWzFdPS1yKSxvfWZ1bmN0aW9uIHVyKHQpe3ZhciBlPTE4MC9NYXRoLlBJLG49NjM3ODEzNztyZXR1cm5bdFswXSplL24sKC41Kk1hdGguUEktMipNYXRoLmF0YW4oTWF0aC5leHAoLXRbMV0vbikpKSplXX1mdW5jdGlvbiBjcih0LGUsbil7dmFyIHIsaSxvLHMsYSx1PXQubGVuZ3RoLGM9aHIodFswXSxlKSxsPVtdO2ZvcihufHwobj1bXSkscj0xO3I8dTtyKyspe2ZvcihpPXRbci0xXSxzPWE9aHIobz10W3JdLGUpOzspe2lmKCEoY3xzKSl7bC5wdXNoKGkpLHMhPT1hPyhsLnB1c2gobykscjx1LTEmJihuLnB1c2gobCksbD1bXSkpOnI9PT11LTEmJmwucHVzaChvKTticmVha31pZihjJnMpYnJlYWs7Yz9jPWhyKGk9bHIoaSxvLGMsZSksZSk6cz1ocihvPWxyKGksbyxzLGUpLGUpfWM9YX1yZXR1cm4gbC5sZW5ndGgmJm4ucHVzaChsKSxufWZ1bmN0aW9uIGxyKHQsZSxuLHIpe3JldHVybiA4Jm4/W3RbMF0rKGVbMF0tdFswXSkqKHJbM10tdFsxXSkvKGVbMV0tdFsxXSksclszXV06NCZuP1t0WzBdKyhlWzBdLXRbMF0pKihyWzFdLXRbMV0pLyhlWzFdLXRbMV0pLHJbMV1dOjImbj9bclsyXSx0WzFdKyhlWzFdLXRbMV0pKihyWzJdLXRbMF0pLyhlWzBdLXRbMF0pXToxJm4/W3JbMF0sdFsxXSsoZVsxXS10WzFdKSooclswXS10WzBdKS8oZVswXS10WzBdKV06bnVsbH1mdW5jdGlvbiBocih0LGUpe3ZhciBuPTA7cmV0dXJuIHRbMF08ZVswXT9ufD0xOnRbMF0+ZVsyXSYmKG58PTIpLHRbMV08ZVsxXT9ufD00OnRbMV0+ZVszXSYmKG58PTgpLG59ZnVuY3Rpb24gZnIodCxlKXtyZXR1cm4gZS5nZW9tZXRyeS5jb29yZGluYXRlc1swXS5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIEFuKGFlKGUpLHQpfSkpfUJuLmRldmlhdGlvbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1lJiZlLmxlbmd0aCxvPWk/ZVswXSpuOnQubGVuZ3RoLHM9TWF0aC5hYnMob3IodCwwLG8sbikpO2lmKGkpZm9yKHZhciBhPTAsdT1lLmxlbmd0aDthPHU7YSsrKXt2YXIgYz1lW2FdKm4sbD1hPHUtMT9lW2ErMV0qbjp0Lmxlbmd0aDtzLT1NYXRoLmFicyhvcih0LGMsbCxuKSl9dmFyIGg9MDtmb3IoYT0wO2E8ci5sZW5ndGg7YSs9Myl7dmFyIGY9clthXSpuLHA9clthKzFdKm4sZD1yW2ErMl0qbjtoKz1NYXRoLmFicygodFtmXS10W2RdKSoodFtwKzFdLXRbZisxXSktKHRbZl0tdFtwXSkqKHRbZCsxXS10W2YrMV0pKX1yZXR1cm4gMD09PXMmJjA9PT1oPzA6TWF0aC5hYnMoKGgtcykvcyl9LEJuLmZsYXR0ZW49ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF1bMF0ubGVuZ3RoLG49e3ZlcnRpY2VzOltdLGhvbGVzOltdLGRpbWVuc2lvbnM6ZX0scj0wLGk9MDtpPHQubGVuZ3RoO2krKyl7Zm9yKHZhciBvPTA7bzx0W2ldLmxlbmd0aDtvKyspZm9yKHZhciBzPTA7czxlO3MrKyluLnZlcnRpY2VzLnB1c2godFtpXVtvXVtzXSk7aT4wJiYocis9dFtpLTFdLmxlbmd0aCxuLmhvbGVzLnB1c2gocikpfXJldHVybiBufSxQbi5kZWZhdWx0PVJuLE9iamVjdC5mcmVlemUoe3RvTWVyY2F0b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gc3IodCwibWVyY2F0b3IiLGUpfSx0b1dnczg0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHNyKHQsIndnczg0IixlKX19KSxOdW1iZXIucHJvdG90eXBlLm1vZHVsbz1mdW5jdGlvbih0KXtyZXR1cm4odGhpcyV0K3QpJXR9LGNyLnBvbHlsaW5lPWNyLGNyLnBvbHlnb249ZnVuY3Rpb24odCxlKXt2YXIgbixyLGksbyxzLGEsdTtmb3Iocj0xO3I8PTg7cio9Mil7Zm9yKG49W10sbz0hKGhyKGk9dFt0Lmxlbmd0aC0xXSxlKSZyKSxzPTA7czx0Lmxlbmd0aDtzKyspKHU9IShocihhPXRbc10sZSkmcikpIT09byYmbi5wdXNoKGxyKGksYSxyLGUpKSx1JiZuLnB1c2goYSksaT1hLG89dTtpZighKHQ9bikubGVuZ3RoKWJyZWFrfXJldHVybiBufTt2YXIgcHI9ZnVuY3Rpb24oKXt0aGlzLmVkZ2VzPVtdLHRoaXMucG9seWdvbj12b2lkIDAsdGhpcy5lbnZlbG9wZT12b2lkIDB9LGRyPXtsZW5ndGg6e2NvbmZpZ3VyYWJsZTohMH19O3ByLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3RoaXNbdGhpcy5lZGdlcy5sZW5ndGhdPXQsdGhpcy5lZGdlcy5wdXNoKHQpLHRoaXMucG9seWdvbj10aGlzLmVudmVsb3BlPXZvaWQgMH0scHIucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lZGdlc1t0XX0sZHIubGVuZ3RoLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmxlbmd0aH0scHIucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dGhpcy5lZGdlcy5mb3JFYWNoKHQpfSxwci5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVkZ2VzLm1hcCh0KX0scHIucHJvdG90eXBlLnNvbWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWRnZXMuc29tZSh0KX0scHIucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0scHIucHJvdG90eXBlLmlzSG9sZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLmVkZ2VzLnJlZHVjZSgoZnVuY3Rpb24oZSxuLHIpe3JldHVybiBuLmZyb20uY29vcmRpbmF0ZXNbMV0+dC5lZGdlc1tlXS5mcm9tLmNvb3JkaW5hdGVzWzFdJiYoZT1yKSxlfSksMCksbj0oMD09PWU/dGhpcy5sZW5ndGg6ZSktMSxyPShlKzEpJXRoaXMubGVuZ3RoLGk9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWVbMF0tdFswXSxpPWVbMV0tdFsxXSxvPW5bMF0tZVswXSxzPW5bMV0tZVsxXTtyZXR1cm4gTWF0aC5zaWduKHIqcy1vKmkpfSh0aGlzLmVkZ2VzW25dLmZyb20uY29vcmRpbmF0ZXMsdGhpcy5lZGdlc1tlXS5mcm9tLmNvb3JkaW5hdGVzLHRoaXMuZWRnZXNbcl0uZnJvbS5jb29yZGluYXRlcyk7cmV0dXJuIDA9PT1pP3RoaXMuZWRnZXNbbl0uZnJvbS5jb29yZGluYXRlc1swXT50aGlzLmVkZ2VzW3JdLmZyb20uY29vcmRpbmF0ZXNbMF06aT4wfSxwci5wcm90b3R5cGUudG9NdWx0aVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGZlKHRoaXMuZWRnZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5mcm9tLmNvb3JkaW5hdGVzfSkpKX0scHIucHJvdG90eXBlLnRvUG9seWdvbj1mdW5jdGlvbigpe2lmKHRoaXMucG9seWdvbilyZXR1cm4gdGhpcy5wb2x5Z29uO3ZhciB0PXRoaXMuZWRnZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5mcm9tLmNvb3JkaW5hdGVzfSkpO3JldHVybiB0LnB1c2godGhpcy5lZGdlc1swXS5mcm9tLmNvb3JkaW5hdGVzKSx0aGlzLnBvbHlnb249dWUoW3RdKX0scHIucHJvdG90eXBlLmdldEVudmVsb3BlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW52ZWxvcGU/dGhpcy5lbnZlbG9wZTp0aGlzLmVudmVsb3BlPUxuKHRoaXMudG9Qb2x5Z29uKCkpfSxwci5maW5kRWRnZVJpbmdDb250YWluaW5nPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXQuZ2V0RW52ZWxvcGUoKTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbz1lLmdldEVudmVsb3BlKCk7aWYociYmKG49ci5nZXRFbnZlbG9wZSgpKSwhZnVuY3Rpb24odCxlKXt2YXIgbj10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHRbMF19KSkscj10Lmdlb21ldHJ5LmNvb3JkaW5hdGVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHRbMV19KSksaT1lLmdlb21ldHJ5LmNvb3JkaW5hdGVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHRbMF19KSksbz1lLmdlb21ldHJ5LmNvb3JkaW5hdGVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHRbMV19KSk7cmV0dXJuIE1hdGgubWF4KG51bGwsbik9PT1NYXRoLm1heChudWxsLGkpJiZNYXRoLm1heChudWxsLHIpPT09TWF0aC5tYXgobnVsbCxvKSYmTWF0aC5taW4obnVsbCxuKT09PU1hdGgubWluKG51bGwsaSkmJk1hdGgubWluKG51bGwscik9PT1NYXRoLm1pbihudWxsLG8pfShvLGkpJiZmcihvLGkpKXt2YXIgcz10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZnJvbS5jb29yZGluYXRlc30pKS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4hZS5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdfSh0LGUuZnJvbS5jb29yZGluYXRlcyl9KSl9KSk7cyYmZS5pbnNpZGUoYWUocykpJiYoIXJ8fGZyKG4sbykpJiYocj1lKX19KSkscn0scHIucHJvdG90eXBlLmluc2lkZT1mdW5jdGlvbih0KXtyZXR1cm4gQW4odCx0aGlzLnRvUG9seWdvbigpKX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocHIucHJvdG90eXBlLGRyKTt2YXIgZ3I9SmUoKGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbih0KXt2YXIgZT1bXTtmb3IodmFyIG4gaW4gdCllLnB1c2gobik7cmV0dXJuIGV9KHQuZXhwb3J0cz0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmtleXM/T2JqZWN0LmtleXM6bikuc2hpbT1ufSkpO2dyLnNoaW07dmFyIHlyPUplKChmdW5jdGlvbih0LGUpe3ZhciBuPSJbb2JqZWN0IEFyZ3VtZW50c10iPT1mdW5jdGlvbigpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJndW1lbnRzKX0oKTtmdW5jdGlvbiByKHQpe3JldHVybiJbb2JqZWN0IEFyZ3VtZW50c10iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwiY2FsbGVlIikmJiFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCwiY2FsbGVlIil8fCExfShlPXQuZXhwb3J0cz1uP3I6aSkuc3VwcG9ydGVkPXIsZS51bnN1cHBvcnRlZD1pfSkpO3lyLnN1cHBvcnRlZCx5ci51bnN1cHBvcnRlZCxKZSgoZnVuY3Rpb24odCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLG49dC5leHBvcnRzPWZ1bmN0aW9uKHQsbyxzKXtyZXR1cm4gc3x8KHM9e30pLHQ9PT1vfHwodCBpbnN0YW5jZW9mIERhdGUmJm8gaW5zdGFuY2VvZiBEYXRlP3QuZ2V0VGltZSgpPT09by5nZXRUaW1lKCk6IXR8fCFvfHwib2JqZWN0IiE9dHlwZW9mIHQmJiJvYmplY3QiIT10eXBlb2Ygbz9zLnN0cmljdD90PT09bzp0PT1vOmZ1bmN0aW9uKHQsbyxzKXt2YXIgYSx1O2lmKHIodCl8fHIobyl8fHQucHJvdG90eXBlIT09by5wcm90b3R5cGUpcmV0dXJuITE7aWYoeXIodCkpcmV0dXJuISF5cihvKSYmKHQ9ZS5jYWxsKHQpLG89ZS5jYWxsKG8pLG4odCxvLHMpKTtpZihpKHQpKXtpZighaShvKXx8dC5sZW5ndGghPT1vLmxlbmd0aClyZXR1cm4hMTtmb3IoYT0wO2E8dC5sZW5ndGg7YSsrKWlmKHRbYV0hPT1vW2FdKXJldHVybiExO3JldHVybiEwfXRyeXt2YXIgYz1ncih0KSxsPWdyKG8pfWNhdGNoKHQpe3JldHVybiExfWlmKGMubGVuZ3RoIT1sLmxlbmd0aClyZXR1cm4hMTtmb3IoYy5zb3J0KCksbC5zb3J0KCksYT1jLmxlbmd0aC0xO2E+PTA7YS0tKWlmKGNbYV0hPWxbYV0pcmV0dXJuITE7Zm9yKGE9Yy5sZW5ndGgtMTthPj0wO2EtLSlpZih1PWNbYV0sIW4odFt1XSxvW3VdLHMpKXJldHVybiExO3JldHVybiB0eXBlb2YgdD09dHlwZW9mIG99KHQsbyxzKSl9O2Z1bmN0aW9uIHIodCl7cmV0dXJuIG51bGw9PXR9ZnVuY3Rpb24gaSh0KXtyZXR1cm4hKCF0fHwib2JqZWN0IiE9dHlwZW9mIHR8fCJudW1iZXIiIT10eXBlb2YgdC5sZW5ndGh8fCJmdW5jdGlvbiIhPXR5cGVvZiB0LmNvcHl8fCJmdW5jdGlvbiIhPXR5cGVvZiB0LnNsaWNlfHx0Lmxlbmd0aD4wJiYibnVtYmVyIiE9dHlwZW9mIHRbMF0pfX0pKTt2YXIgbXI9SmUoKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlLG4scil7dGhpcy5kYXRhc2V0PVtdLHRoaXMuZXBzaWxvbj0xLHRoaXMubWluUHRzPTIsdGhpcy5kaXN0YW5jZT10aGlzLl9ldWNsaWRlYW5EaXN0YW5jZSx0aGlzLmNsdXN0ZXJzPVtdLHRoaXMubm9pc2U9W10sdGhpcy5fdmlzaXRlZD1bXSx0aGlzLl9hc3NpZ25lZD1bXSx0aGlzLl9kYXRhc2V0TGVuZ3RoPTAsdGhpcy5faW5pdCh0LGUsbixyKX1lLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24odCxlLG4scil7dGhpcy5faW5pdCh0LGUsbixyKTtmb3IodmFyIGk9MDtpPHRoaXMuX2RhdGFzZXRMZW5ndGg7aSsrKWlmKDEhPT10aGlzLl92aXNpdGVkW2ldKXt0aGlzLl92aXNpdGVkW2ldPTE7dmFyIG89dGhpcy5fcmVnaW9uUXVlcnkoaSk7aWYoby5sZW5ndGg8dGhpcy5taW5QdHMpdGhpcy5ub2lzZS5wdXNoKGkpO2Vsc2V7dmFyIHM9dGhpcy5jbHVzdGVycy5sZW5ndGg7dGhpcy5jbHVzdGVycy5wdXNoKFtdKSx0aGlzLl9hZGRUb0NsdXN0ZXIoaSxzKSx0aGlzLl9leHBhbmRDbHVzdGVyKHMsbyl9fXJldHVybiB0aGlzLmNsdXN0ZXJzfSxlLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbixyKXtpZih0KXtpZighKHQgaW5zdGFuY2VvZiBBcnJheSkpdGhyb3cgRXJyb3IoIkRhdGFzZXQgbXVzdCBiZSBvZiB0eXBlIGFycmF5LCAiK3R5cGVvZiB0KyIgZ2l2ZW4iKTt0aGlzLmRhdGFzZXQ9dCx0aGlzLmNsdXN0ZXJzPVtdLHRoaXMubm9pc2U9W10sdGhpcy5fZGF0YXNldExlbmd0aD10Lmxlbmd0aCx0aGlzLl92aXNpdGVkPW5ldyBBcnJheSh0aGlzLl9kYXRhc2V0TGVuZ3RoKSx0aGlzLl9hc3NpZ25lZD1uZXcgQXJyYXkodGhpcy5fZGF0YXNldExlbmd0aCl9ZSYmKHRoaXMuZXBzaWxvbj1lKSxuJiYodGhpcy5taW5QdHM9biksciYmKHRoaXMuZGlzdGFuY2U9cil9LGUucHJvdG90eXBlLl9leHBhbmRDbHVzdGVyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07aWYoMSE9PXRoaXMuX3Zpc2l0ZWRbcl0pe3RoaXMuX3Zpc2l0ZWRbcl09MTt2YXIgaT10aGlzLl9yZWdpb25RdWVyeShyKTtpLmxlbmd0aD49dGhpcy5taW5QdHMmJihlPXRoaXMuX21lcmdlQXJyYXlzKGUsaSkpfTEhPT10aGlzLl9hc3NpZ25lZFtyXSYmdGhpcy5fYWRkVG9DbHVzdGVyKHIsdCl9fSxlLnByb3RvdHlwZS5fYWRkVG9DbHVzdGVyPWZ1bmN0aW9uKHQsZSl7dGhpcy5jbHVzdGVyc1tlXS5wdXNoKHQpLHRoaXMuX2Fzc2lnbmVkW3RdPTF9LGUucHJvdG90eXBlLl9yZWdpb25RdWVyeT1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dGhpcy5fZGF0YXNldExlbmd0aDtuKyspe3RoaXMuZGlzdGFuY2UodGhpcy5kYXRhc2V0W3RdLHRoaXMuZGF0YXNldFtuXSk8dGhpcy5lcHNpbG9uJiZlLnB1c2gobil9cmV0dXJuIGV9LGUucHJvdG90eXBlLl9tZXJnZUFycmF5cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLmxlbmd0aCxyPTA7cjxuO3IrKyl7dmFyIGk9ZVtyXTt0LmluZGV4T2YoaSk8MCYmdC5wdXNoKGkpfXJldHVybiB0fSxlLnByb3RvdHlwZS5fZXVjbGlkZWFuRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKTtyLS07KW4rPSh0W3JdLWVbcl0pKih0W3JdLWVbcl0pO3JldHVybiBNYXRoLnNxcnQobil9LHQuZXhwb3J0cyYmKHQuZXhwb3J0cz1lKX0pKSx2cj1KZSgoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsbil7dGhpcy5rPTMsdGhpcy5kYXRhc2V0PVtdLHRoaXMuYXNzaWdubWVudHM9W10sdGhpcy5jZW50cm9pZHM9W10sdGhpcy5pbml0KHQsZSxuKX1lLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmFzc2lnbm1lbnRzPVtdLHRoaXMuY2VudHJvaWRzPVtdLHZvaWQgMCE9PXQmJih0aGlzLmRhdGFzZXQ9dCksdm9pZCAwIT09ZSYmKHRoaXMuaz1lKSx2b2lkIDAhPT1uJiYodGhpcy5kaXN0YW5jZT1uKX0sZS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKHQsZSl7dGhpcy5pbml0KHQsZSk7Zm9yKHZhciBuPXRoaXMuZGF0YXNldC5sZW5ndGgscj0wO3I8dGhpcy5rO3IrKyl0aGlzLmNlbnRyb2lkc1tyXT10aGlzLnJhbmRvbUNlbnRyb2lkKCk7Zm9yKHZhciBpPSEwO2k7KXtpPXRoaXMuYXNzaWduKCk7Zm9yKHZhciBvPTA7bzx0aGlzLms7bysrKXtmb3IodmFyIHM9bmV3IEFycmF5KGwpLGE9MCx1PTA7dTxsO3UrKylzW3VdPTA7Zm9yKHZhciBjPTA7YzxuO2MrKyl7dmFyIGw9dGhpcy5kYXRhc2V0W2NdLmxlbmd0aDtpZihvPT09dGhpcy5hc3NpZ25tZW50c1tjXSl7Zm9yKHU9MDt1PGw7dSsrKXNbdV0rPXRoaXMuZGF0YXNldFtjXVt1XTthKyt9fWlmKGE+MCl7Zm9yKHU9MDt1PGw7dSsrKXNbdV0vPWE7dGhpcy5jZW50cm9pZHNbb109c31lbHNlIHRoaXMuY2VudHJvaWRzW29dPXRoaXMucmFuZG9tQ2VudHJvaWQoKSxpPSEwfX1yZXR1cm4gdGhpcy5nZXRDbHVzdGVycygpfSxlLnByb3RvdHlwZS5yYW5kb21DZW50cm9pZD1mdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLmRhdGFzZXQubGVuZ3RoLTE7ZG97ZT1NYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqbiksdD10aGlzLmRhdGFzZXRbZV19d2hpbGUodGhpcy5jZW50cm9pZHMuaW5kZXhPZih0KT49MCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmFzc2lnbj1mdW5jdGlvbigpe2Zvcih2YXIgdCxlPSExLG49dGhpcy5kYXRhc2V0Lmxlbmd0aCxyPTA7cjxuO3IrKykodD10aGlzLmFyZ21pbih0aGlzLmRhdGFzZXRbcl0sdGhpcy5jZW50cm9pZHMsdGhpcy5kaXN0YW5jZSkpIT10aGlzLmFzc2lnbm1lbnRzW3JdJiYodGhpcy5hc3NpZ25tZW50c1tyXT10LGU9ITApO3JldHVybiBlfSxlLnByb3RvdHlwZS5nZXRDbHVzdGVycz1mdW5jdGlvbigpe2Zvcih2YXIgdCxlPW5ldyBBcnJheSh0aGlzLmspLG49MDtuPHRoaXMuYXNzaWdubWVudHMubGVuZ3RoO24rKyl2b2lkIDA9PT1lW3Q9dGhpcy5hc3NpZ25tZW50c1tuXV0mJihlW3RdPVtdKSxlW3RdLnB1c2gobik7cmV0dXJuIGV9LGUucHJvdG90eXBlLmFyZ21pbj1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGk9TnVtYmVyLk1BWF9WQUxVRSxvPTAscz1lLmxlbmd0aCxhPTA7YTxzO2ErKykocj1uKHQsZVthXSkpPGkmJihpPXIsbz1hKTtyZXR1cm4gb30sZS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKTtyLS07KXt2YXIgaT10W3JdLWVbcl07bis9aSppfXJldHVybiBNYXRoLnNxcnQobil9LHQuZXhwb3J0cyYmKHQuZXhwb3J0cz1lKX0pKSxfcj1KZSgoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGUsbil7dGhpcy5fcXVldWU9W10sdGhpcy5fcHJpb3JpdGllcz1bXSx0aGlzLl9zb3J0aW5nPSJkZXNjIix0aGlzLl9pbml0KHQsZSxuKX1lLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy5fcXVldWUubGVuZ3RoLHI9bjtyLS07KXt2YXIgaT10aGlzLl9wcmlvcml0aWVzW3JdOyJkZXNjIj09PXRoaXMuX3NvcnRpbmc/ZT5pJiYobj1yKTplPGkmJihuPXIpfXRoaXMuX2luc2VydEF0KHQsZSxuKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9xdWV1ZS5sZW5ndGg7ZS0tOyl7aWYodD09PXRoaXMuX3F1ZXVlW2VdKXt0aGlzLl9xdWV1ZS5zcGxpY2UoZSwxKSx0aGlzLl9wcmlvcml0aWVzLnNwbGljZShlLDEpO2JyZWFrfX19LGUucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dGhpcy5fcXVldWUuZm9yRWFjaCh0KX0sZS5wcm90b3R5cGUuZ2V0RWxlbWVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcXVldWV9LGUucHJvdG90eXBlLmdldEVsZW1lbnRQcmlvcml0eT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHJpb3JpdGllc1t0XX0sZS5wcm90b3R5cGUuZ2V0UHJpb3JpdGllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmlvcml0aWVzfSxlLnByb3RvdHlwZS5nZXRFbGVtZW50c1dpdGhQcmlvcml0aWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX3F1ZXVlLmxlbmd0aDtlPG47ZSsrKXQucHVzaChbdGhpcy5fcXVldWVbZV0sdGhpcy5fcHJpb3JpdGllc1tlXV0pO3JldHVybiB0fSxlLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbil7aWYodCYmZSl7aWYodGhpcy5fcXVldWU9W10sdGhpcy5fcHJpb3JpdGllcz1bXSx0Lmxlbmd0aCE9PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGgiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl0aGlzLmluc2VydCh0W3JdLGVbcl0pfW4mJih0aGlzLl9zb3J0aW5nPW4pfSxlLnByb3RvdHlwZS5faW5zZXJ0QXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMuX3F1ZXVlLmxlbmd0aD09PW4/KHRoaXMuX3F1ZXVlLnB1c2godCksdGhpcy5fcHJpb3JpdGllcy5wdXNoKGUpKToodGhpcy5fcXVldWUuc3BsaWNlKG4sMCx0KSx0aGlzLl9wcmlvcml0aWVzLnNwbGljZShuLDAsZSkpfSx0LmV4cG9ydHMmJih0LmV4cG9ydHM9ZSl9KSkseHI9SmUoKGZ1bmN0aW9uKHQpe2lmKHQuZXhwb3J0cyl2YXIgZT1fcjtmdW5jdGlvbiBuKHQsZSxuLHIpe3RoaXMuZXBzaWxvbj0xLHRoaXMubWluUHRzPTEsdGhpcy5kaXN0YW5jZT10aGlzLl9ldWNsaWRlYW5EaXN0YW5jZSx0aGlzLl9yZWFjaGFiaWxpdHk9W10sdGhpcy5fcHJvY2Vzc2VkPVtdLHRoaXMuX2NvcmVEaXN0YW5jZT0wLHRoaXMuX29yZGVyZWRMaXN0PVtdLHRoaXMuX2luaXQodCxlLG4scil9bi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKHQsbixyLGkpe3RoaXMuX2luaXQodCxuLHIsaSk7Zm9yKHZhciBvPTAscz10aGlzLmRhdGFzZXQubGVuZ3RoO288cztvKyspaWYoMSE9PXRoaXMuX3Byb2Nlc3NlZFtvXSl7dGhpcy5fcHJvY2Vzc2VkW29dPTEsdGhpcy5jbHVzdGVycy5wdXNoKFtvXSk7dmFyIGE9dGhpcy5jbHVzdGVycy5sZW5ndGgtMTt0aGlzLl9vcmRlcmVkTGlzdC5wdXNoKG8pO3ZhciB1PW5ldyBlKG51bGwsbnVsbCwiYXNjIiksYz10aGlzLl9yZWdpb25RdWVyeShvKTt2b2lkIDAhPT10aGlzLl9kaXN0YW5jZVRvQ29yZShvKSYmKHRoaXMuX3VwZGF0ZVF1ZXVlKG8sYyx1KSx0aGlzLl9leHBhbmRDbHVzdGVyKGEsdSkpfXJldHVybiB0aGlzLmNsdXN0ZXJzfSxuLnByb3RvdHlwZS5nZXRSZWFjaGFiaWxpdHlQbG90PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX29yZGVyZWRMaXN0Lmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9vcmRlcmVkTGlzdFtlXSxpPXRoaXMuX3JlYWNoYWJpbGl0eVtyXTt0LnB1c2goW3IsaV0pfXJldHVybiB0fSxuLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbixyKXtpZih0KXtpZighKHQgaW5zdGFuY2VvZiBBcnJheSkpdGhyb3cgRXJyb3IoIkRhdGFzZXQgbXVzdCBiZSBvZiB0eXBlIGFycmF5LCAiK3R5cGVvZiB0KyIgZ2l2ZW4iKTt0aGlzLmRhdGFzZXQ9dCx0aGlzLmNsdXN0ZXJzPVtdLHRoaXMuX3JlYWNoYWJpbGl0eT1uZXcgQXJyYXkodGhpcy5kYXRhc2V0Lmxlbmd0aCksdGhpcy5fcHJvY2Vzc2VkPW5ldyBBcnJheSh0aGlzLmRhdGFzZXQubGVuZ3RoKSx0aGlzLl9jb3JlRGlzdGFuY2U9MCx0aGlzLl9vcmRlcmVkTGlzdD1bXX1lJiYodGhpcy5lcHNpbG9uPWUpLG4mJih0aGlzLm1pblB0cz1uKSxyJiYodGhpcy5kaXN0YW5jZT1yKX0sbi5wcm90b3R5cGUuX3VwZGF0ZVF1ZXVlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO3RoaXMuX2NvcmVEaXN0YW5jZT10aGlzLl9kaXN0YW5jZVRvQ29yZSh0KSxlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PXIuX3Byb2Nlc3NlZFtlXSl7dmFyIGk9ci5kaXN0YW5jZShyLmRhdGFzZXRbdF0sci5kYXRhc2V0W2VdKSxvPU1hdGgubWF4KHIuX2NvcmVEaXN0YW5jZSxpKTt2b2lkIDA9PT1yLl9yZWFjaGFiaWxpdHlbZV0/KHIuX3JlYWNoYWJpbGl0eVtlXT1vLG4uaW5zZXJ0KGUsbykpOm88ci5fcmVhY2hhYmlsaXR5W2VdJiYoci5fcmVhY2hhYmlsaXR5W2VdPW8sbi5yZW1vdmUoZSksbi5pbnNlcnQoZSxvKSl9fSkpfSxuLnByb3RvdHlwZS5fZXhwYW5kQ2x1c3Rlcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLmdldEVsZW1lbnRzKCkscj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl7dmFyIG89bltyXTtpZih2b2lkIDA9PT10aGlzLl9wcm9jZXNzZWRbb10pe3ZhciBzPXRoaXMuX3JlZ2lvblF1ZXJ5KG8pO3RoaXMuX3Byb2Nlc3NlZFtvXT0xLHRoaXMuY2x1c3RlcnNbdF0ucHVzaChvKSx0aGlzLl9vcmRlcmVkTGlzdC5wdXNoKG8pLHZvaWQgMCE9PXRoaXMuX2Rpc3RhbmNlVG9Db3JlKG8pJiYodGhpcy5fdXBkYXRlUXVldWUobyxzLGUpLHRoaXMuX2V4cGFuZENsdXN0ZXIodCxlKSl9fX0sbi5wcm90b3R5cGUuX2Rpc3RhbmNlVG9Db3JlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmVwc2lsb24sbj0wO248ZTtuKyspe2lmKHRoaXMuX3JlZ2lvblF1ZXJ5KHQsbikubGVuZ3RoPj10aGlzLm1pblB0cylyZXR1cm4gbn19LG4ucHJvdG90eXBlLl9yZWdpb25RdWVyeT1mdW5jdGlvbih0LGUpe2U9ZXx8dGhpcy5lcHNpbG9uO2Zvcih2YXIgbj1bXSxyPTAsaT10aGlzLmRhdGFzZXQubGVuZ3RoO3I8aTtyKyspdGhpcy5kaXN0YW5jZSh0aGlzLmRhdGFzZXRbdF0sdGhpcy5kYXRhc2V0W3JdKTxlJiZuLnB1c2gocik7cmV0dXJuIG59LG4ucHJvdG90eXBlLl9ldWNsaWRlYW5EaXN0YW5jZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpO3ItLTspbis9KHRbcl0tZVtyXSkqKHRbcl0tZVtyXSk7cmV0dXJuIE1hdGguc3FydChuKX0sdC5leHBvcnRzJiYodC5leHBvcnRzPW4pfSkpLHdyPUplKChmdW5jdGlvbih0KXt0LmV4cG9ydHMmJih0LmV4cG9ydHM9e0RCU0NBTjptcixLTUVBTlM6dnIsT1BUSUNTOnhyLFByaW9yaXR5UXVldWU6X3J9KX0pKTtmdW5jdGlvbiBicigpe3RoaXMuXz1udWxsfWZ1bmN0aW9uIERyKHQpe3QuVT10LkM9dC5MPXQuUj10LlA9dC5OPW51bGx9ZnVuY3Rpb24gRXIodCxlKXt2YXIgbj1lLHI9ZS5SLGk9bi5VO2k/aS5MPT09bj9pLkw9cjppLlI9cjp0Ll89cixyLlU9aSxuLlU9cixuLlI9ci5MLG4uUiYmKG4uUi5VPW4pLHIuTD1ufWZ1bmN0aW9uIENyKHQsZSl7dmFyIG49ZSxyPWUuTCxpPW4uVTtpP2kuTD09PW4/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksbi5VPXIsbi5MPXIuUixuLkwmJihuLkwuVT1uKSxyLlI9bn1mdW5jdGlvbiBTcih0KXtmb3IoO3QuTDspdD10Lkw7cmV0dXJuIHR9ZnVuY3Rpb24gQXIodCxlLG4scil7dmFyIGk9W251bGwsbnVsbF0sbz1Kci5wdXNoKGkpLTE7cmV0dXJuIGkubGVmdD10LGkucmlnaHQ9ZSxuJiZJcihpLHQsZSxuKSxyJiZJcihpLGUsdCxyKSxaclt0LmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxacltlLmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxpfWZ1bmN0aW9uIE5yKHQsZSxuKXt2YXIgcj1bZSxuXTtyZXR1cm4gci5sZWZ0PXQscn1mdW5jdGlvbiBJcih0LGUsbixyKXt0WzBdfHx0WzFdP3QubGVmdD09PW4/dFsxXT1yOnRbMF09cjoodFswXT1yLHQubGVmdD1lLHQucmlnaHQ9bil9ZnVuY3Rpb24gTXIodCxlLG4scixpKXt2YXIgbyxzPXRbMF0sYT10WzFdLHU9c1swXSxjPXNbMV0sbD0wLGg9MSxmPWFbMF0tdSxwPWFbMV0tYztpZihvPWUtdSxmfHwhKG8+MCkpe2lmKG8vPWYsZjwwKXtpZihvPGwpcmV0dXJuO288aCYmKGg9byl9ZWxzZSBpZihmPjApe2lmKG8+aClyZXR1cm47bz5sJiYobD1vKX1pZihvPXItdSxmfHwhKG88MCkpe2lmKG8vPWYsZjwwKXtpZihvPmgpcmV0dXJuO28+bCYmKGw9byl9ZWxzZSBpZihmPjApe2lmKG88bClyZXR1cm47bzxoJiYoaD1vKX1pZihvPW4tYyxwfHwhKG8+MCkpe2lmKG8vPXAscDwwKXtpZihvPGwpcmV0dXJuO288aCYmKGg9byl9ZWxzZSBpZihwPjApe2lmKG8+aClyZXR1cm47bz5sJiYobD1vKX1pZihvPWktYyxwfHwhKG88MCkpe2lmKG8vPXAscDwwKXtpZihvPmgpcmV0dXJuO28+bCYmKGw9byl9ZWxzZSBpZihwPjApe2lmKG88bClyZXR1cm47bzxoJiYoaD1vKX1yZXR1cm4hKGw+MCkmJiEoaDwxKXx8KGw+MCYmKHRbMF09W3UrbCpmLGMrbCpwXSksaDwxJiYodFsxXT1bdStoKmYsYytoKnBdKSksITB9fX19fWZ1bmN0aW9uIEZyKHQsZSxuLHIsaSl7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciBzLGEsdT10WzBdLGM9dC5sZWZ0LGw9dC5yaWdodCxoPWNbMF0sZj1jWzFdLHA9bFswXSxkPWxbMV0sZz0oaCtwKS8yLHk9KGYrZCkvMjtpZihkPT09Zil7aWYoZzxlfHxnPj1yKXJldHVybjtpZihoPnApe2lmKHUpe2lmKHVbMV0+PWkpcmV0dXJufWVsc2UgdT1bZyxuXTtvPVtnLGldfWVsc2V7aWYodSl7aWYodVsxXTxuKXJldHVybn1lbHNlIHU9W2csaV07bz1bZyxuXX19ZWxzZSBpZihhPXktKHM9KGgtcCkvKGQtZikpKmcsczwtMXx8cz4xKWlmKGg+cCl7aWYodSl7aWYodVsxXT49aSlyZXR1cm59ZWxzZSB1PVsobi1hKS9zLG5dO289WyhpLWEpL3MsaV19ZWxzZXtpZih1KXtpZih1WzFdPG4pcmV0dXJufWVsc2UgdT1bKGktYSkvcyxpXTtvPVsobi1hKS9zLG5dfWVsc2UgaWYoZjxkKXtpZih1KXtpZih1WzBdPj1yKXJldHVybn1lbHNlIHU9W2UscyplK2FdO289W3IscypyK2FdfWVsc2V7aWYodSl7aWYodVswXTxlKXJldHVybn1lbHNlIHU9W3IscypyK2FdO289W2UscyplK2FdfXJldHVybiB0WzBdPXUsdFsxXT1vLCEwfWZ1bmN0aW9uIFRyKHQsZSl7dmFyIG49dC5zaXRlLHI9ZS5sZWZ0LGk9ZS5yaWdodDtyZXR1cm4gbj09PWkmJihpPXIscj1uKSxpP01hdGguYXRhbjIoaVsxXS1yWzFdLGlbMF0tclswXSk6KG49PT1yPyhyPWVbMV0saT1lWzBdKToocj1lWzBdLGk9ZVsxXSksTWF0aC5hdGFuMihyWzBdLWlbMF0saVsxXS1yWzFdKSl9ZnVuY3Rpb24gT3IodCxlKXtyZXR1cm4gZVsrKGUubGVmdCE9PXQuc2l0ZSldfWZ1bmN0aW9uIExyKHQsZSl7cmV0dXJuIGVbKyhlLmxlZnQ9PT10LnNpdGUpXX13ci5EQlNDQU4sd3IuS01FQU5TLHdyLk9QVElDUyx3ci5Qcmlvcml0eVF1ZXVlLGJyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YnIsaW5zZXJ0OmZ1bmN0aW9uKHQsZSl7dmFyIG4scixpO2lmKHQpe2lmKGUuUD10LGUuTj10Lk4sdC5OJiYodC5OLlA9ZSksdC5OPWUsdC5SKXtmb3IodD10LlI7dC5MOyl0PXQuTDt0Lkw9ZX1lbHNlIHQuUj1lO249dH1lbHNlIHRoaXMuXz8odD1Tcih0aGlzLl8pLGUuUD1udWxsLGUuTj10LHQuUD10Lkw9ZSxuPXQpOihlLlA9ZS5OPW51bGwsdGhpcy5fPWUsbj1udWxsKTtmb3IoZS5MPWUuUj1udWxsLGUuVT1uLGUuQz0hMCx0PWU7biYmbi5DOyluPT09KHI9bi5VKS5MPyhpPXIuUikmJmkuQz8obi5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PW4uUiYmKEVyKHRoaXMsbiksbj0odD1uKS5VKSxuLkM9ITEsci5DPSEwLENyKHRoaXMscikpOihpPXIuTCkmJmkuQz8obi5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PW4uTCYmKENyKHRoaXMsbiksbj0odD1uKS5VKSxuLkM9ITEsci5DPSEwLEVyKHRoaXMscikpLG49dC5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24odCl7dC5OJiYodC5OLlA9dC5QKSx0LlAmJih0LlAuTj10Lk4pLHQuTj10LlA9bnVsbDt2YXIgZSxuLHIsaT10LlUsbz10Lkwscz10LlI7aWYobj1vP3M/U3Iocyk6bzpzLGk/aS5MPT09dD9pLkw9bjppLlI9bjp0aGlzLl89bixvJiZzPyhyPW4uQyxuLkM9dC5DLG4uTD1vLG8uVT1uLG4hPT1zPyhpPW4uVSxuLlU9dC5VLHQ9bi5SLGkuTD10LG4uUj1zLHMuVT1uKToobi5VPWksaT1uLHQ9bi5SKSk6KHI9dC5DLHQ9biksdCYmKHQuVT1pKSwhcil7aWYodCYmdC5DKXJldHVybiB2b2lkKHQuQz0hMSk7ZG97aWYodD09PXRoaXMuXylicmVhaztpZih0PT09aS5MKXtpZigoZT1pLlIpLkMmJihlLkM9ITEsaS5DPSEwLEVyKHRoaXMsaSksZT1pLlIpLGUuTCYmZS5MLkN8fGUuUiYmZS5SLkMpeyghZS5SfHwhZS5SLkMpJiYoZS5MLkM9ITEsZS5DPSEwLENyKHRoaXMsZSksZT1pLlIpLGUuQz1pLkMsaS5DPWUuUi5DPSExLEVyKHRoaXMsaSksdD10aGlzLl87YnJlYWt9fWVsc2UgaWYoKGU9aS5MKS5DJiYoZS5DPSExLGkuQz0hMCxDcih0aGlzLGkpLGU9aS5MKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXsoIWUuTHx8IWUuTC5DKSYmKGUuUi5DPSExLGUuQz0hMCxFcih0aGlzLGUpLGU9aS5MKSxlLkM9aS5DLGkuQz1lLkwuQz0hMSxDcih0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfWUuQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIFByLFJyPVtdO2Z1bmN0aW9uIEJyKCl7RHIodGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIGtyKHQpe3ZhciBlPXQuUCxuPXQuTjtpZihlJiZuKXt2YXIgcj1lLnNpdGUsaT10LnNpdGUsbz1uLnNpdGU7aWYociE9PW8pe3ZhciBzPWlbMF0sYT1pWzFdLHU9clswXS1zLGM9clsxXS1hLGw9b1swXS1zLGg9b1sxXS1hLGY9MioodSpoLWMqbCk7aWYoIShmPj0tJHIpKXt2YXIgcD11KnUrYypjLGQ9bCpsK2gqaCxnPShoKnAtYypkKS9mLHk9KHUqZC1sKnApL2YsbT1Sci5wb3AoKXx8bmV3IEJyO20uYXJjPXQsbS5zaXRlPWksbS54PWcrcyxtLnk9KG0uY3k9eSthKStNYXRoLnNxcnQoZypnK3kqeSksdC5jaXJjbGU9bTtmb3IodmFyIHY9bnVsbCxfPUtyLl87XzspaWYobS55PF8ueXx8bS55PT09Xy55JiZtLng8PV8ueCl7aWYoIV8uTCl7dj1fLlA7YnJlYWt9Xz1fLkx9ZWxzZXtpZighXy5SKXt2PV87YnJlYWt9Xz1fLlJ9S3IuaW5zZXJ0KHYsbSksdnx8KFByPW0pfX19fWZ1bmN0aW9uIHpyKHQpe3ZhciBlPXQuY2lyY2xlO2UmJihlLlB8fChQcj1lLk4pLEtyLnJlbW92ZShlKSxSci5wdXNoKGUpLERyKGUpLHQuY2lyY2xlPW51bGwpfXZhciBqcj1bXTtmdW5jdGlvbiBVcigpe0RyKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBxcih0KXt2YXIgZT1qci5wb3AoKXx8bmV3IFVyO3JldHVybiBlLnNpdGU9dCxlfWZ1bmN0aW9uIFZyKHQpe3pyKHQpLEhyLnJlbW92ZSh0KSxqci5wdXNoKHQpLERyKHQpfWZ1bmN0aW9uIEdyKHQpe3ZhciBlPXQuY2lyY2xlLG49ZS54LHI9ZS5jeSxpPVtuLHJdLG89dC5QLHM9dC5OLGE9W3RdO1ZyKHQpO2Zvcih2YXIgdT1vO3UuY2lyY2xlJiZNYXRoLmFicyhuLXUuY2lyY2xlLngpPFFyJiZNYXRoLmFicyhyLXUuY2lyY2xlLmN5KTxRcjspbz11LlAsYS51bnNoaWZ0KHUpLFZyKHUpLHU9bzthLnVuc2hpZnQodSksenIodSk7Zm9yKHZhciBjPXM7Yy5jaXJjbGUmJk1hdGguYWJzKG4tYy5jaXJjbGUueCk8UXImJk1hdGguYWJzKHItYy5jaXJjbGUuY3kpPFFyOylzPWMuTixhLnB1c2goYyksVnIoYyksYz1zO2EucHVzaChjKSx6cihjKTt2YXIgbCxoPWEubGVuZ3RoO2ZvcihsPTE7bDxoOysrbCljPWFbbF0sdT1hW2wtMV0sSXIoYy5lZGdlLHUuc2l0ZSxjLnNpdGUsaSk7dT1hWzBdLChjPWFbaC0xXSkuZWRnZT1Bcih1LnNpdGUsYy5zaXRlLG51bGwsaSksa3IodSksa3IoYyl9ZnVuY3Rpb24gWXIodCl7Zm9yKHZhciBlLG4scixpLG89dFswXSxzPXRbMV0sYT1Ici5fO2E7KWlmKChyPVhyKGEscyktbyk+UXIpYT1hLkw7ZWxzZXtpZighKChpPW8tV3IoYSxzKSk+UXIpKXtyPi1Rcj8oZT1hLlAsbj1hKTppPi1Rcj8oZT1hLG49YS5OKTplPW49YTticmVha31pZighYS5SKXtlPWE7YnJlYWt9YT1hLlJ9IWZ1bmN0aW9uKHQpe1pyW3QuaW5kZXhdPXtzaXRlOnQsaGFsZmVkZ2VzOltdfX0odCk7dmFyIHU9cXIodCk7aWYoSHIuaW5zZXJ0KGUsdSksZXx8bil7aWYoZT09PW4pcmV0dXJuIHpyKGUpLG49cXIoZS5zaXRlKSxIci5pbnNlcnQodSxuKSx1LmVkZ2U9bi5lZGdlPUFyKGUuc2l0ZSx1LnNpdGUpLGtyKGUpLHZvaWQga3Iobik7aWYoIW4pcmV0dXJuIHZvaWQodS5lZGdlPUFyKGUuc2l0ZSx1LnNpdGUpKTt6cihlKSx6cihuKTt2YXIgYz1lLnNpdGUsbD1jWzBdLGg9Y1sxXSxmPXRbMF0tbCxwPXRbMV0taCxkPW4uc2l0ZSxnPWRbMF0tbCx5PWRbMV0taCxtPTIqKGYqeS1wKmcpLHY9ZipmK3AqcCxfPWcqZyt5KnkseD1bKHkqdi1wKl8pL20rbCwoZipfLWcqdikvbStoXTtJcihuLmVkZ2UsYyxkLHgpLHUuZWRnZT1BcihjLHQsbnVsbCx4KSxuLmVkZ2U9QXIodCxkLG51bGwseCksa3IoZSksa3Iobil9fWZ1bmN0aW9uIFhyKHQsZSl7dmFyIG49dC5zaXRlLHI9blswXSxpPW5bMV0sbz1pLWU7aWYoIW8pcmV0dXJuIHI7dmFyIHM9dC5QO2lmKCFzKXJldHVybi0xLzA7dmFyIGE9KG49cy5zaXRlKVswXSx1PW5bMV0sYz11LWU7aWYoIWMpcmV0dXJuIGE7dmFyIGw9YS1yLGg9MS9vLTEvYyxmPWwvYztyZXR1cm4gaD8oLWYrTWF0aC5zcXJ0KGYqZi0yKmgqKGwqbC8oLTIqYyktdStjLzIraS1vLzIpKSkvaCtyOihyK2EpLzJ9ZnVuY3Rpb24gV3IodCxlKXt2YXIgbj10Lk47aWYobilyZXR1cm4gWHIobixlKTt2YXIgcj10LnNpdGU7cmV0dXJuIHJbMV09PT1lP3JbMF06MS8wfXZhciBIcixacixLcixKcixRcj0xZS02LCRyPTFlLTEyO2Z1bmN0aW9uIHRpKHQsZSxuKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS10WzFdKS0odFswXS1lWzBdKSooblsxXS10WzFdKX1mdW5jdGlvbiBlaSh0LGUpe3JldHVybiBlWzFdLXRbMV18fGVbMF0tdFswXX1mdW5jdGlvbiBuaSh0LGUpe3ZhciBuLHIsaSxvPXQuc29ydChlaSkucG9wKCk7Zm9yKEpyPVtdLFpyPW5ldyBBcnJheSh0Lmxlbmd0aCksSHI9bmV3IGJyLEtyPW5ldyBicjs7KWlmKGk9UHIsbyYmKCFpfHxvWzFdPGkueXx8b1sxXT09PWkueSYmb1swXTxpLngpKShvWzBdIT09bnx8b1sxXSE9PXIpJiYoWXIobyksbj1vWzBdLHI9b1sxXSksbz10LnBvcCgpO2Vsc2V7aWYoIWkpYnJlYWs7R3IoaS5hcmMpfWlmKGZ1bmN0aW9uKCl7Zm9yKHZhciB0LGUsbixyLGk9MCxvPVpyLmxlbmd0aDtpPG87KytpKWlmKCh0PVpyW2ldKSYmKHI9KGU9dC5oYWxmZWRnZXMpLmxlbmd0aCkpe3ZhciBzPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3Iobj0wO248cjsrK24pc1tuXT1uLGFbbl09VHIodCxKcltlW25dXSk7Zm9yKHMuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gYVtlXS1hW3RdfSkpLG49MDtuPHI7KytuKWFbbl09ZVtzW25dXTtmb3Iobj0wO248cjsrK24pZVtuXT1hW25dfX0oKSxlKXt2YXIgcz0rZVswXVswXSxhPStlWzBdWzFdLHU9K2VbMV1bMF0sYz0rZVsxXVsxXTsoZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpLG89SnIubGVuZ3RoO28tLTspRnIoaT1KcltvXSx0LGUsbixyKSYmTXIoaSx0LGUsbixyKSYmKE1hdGguYWJzKGlbMF1bMF0taVsxXVswXSk+UXJ8fE1hdGguYWJzKGlbMF1bMV0taVsxXVsxXSk+UXIpfHxkZWxldGUgSnJbb119KShzLGEsdSxjKSxmdW5jdGlvbih0LGUsbixyKXt2YXIgaSxvLHMsYSx1LGMsbCxoLGYscCxkLGcseT1aci5sZW5ndGgsbT0hMDtmb3IoaT0wO2k8eTsrK2kpaWYobz1acltpXSl7Zm9yKHM9by5zaXRlLGE9KHU9by5oYWxmZWRnZXMpLmxlbmd0aDthLS07KUpyW3VbYV1dfHx1LnNwbGljZShhLDEpO2ZvcihhPTAsYz11Lmxlbmd0aDthPGM7KWQ9KHA9THIobyxKclt1W2FdXSkpWzBdLGc9cFsxXSxoPShsPU9yKG8sSnJbdVsrK2ElY11dKSlbMF0sZj1sWzFdLChNYXRoLmFicyhkLWgpPlFyfHxNYXRoLmFicyhnLWYpPlFyKSYmKHUuc3BsaWNlKGEsMCxKci5wdXNoKE5yKHMscCxNYXRoLmFicyhkLXQpPFFyJiZyLWc+UXI/W3QsTWF0aC5hYnMoaC10KTxRcj9mOnJdOk1hdGguYWJzKGctcik8UXImJm4tZD5Rcj9bTWF0aC5hYnMoZi1yKTxRcj9oOm4scl06TWF0aC5hYnMoZC1uKTxRciYmZy1lPlFyP1tuLE1hdGguYWJzKGgtbik8UXI/ZjplXTpNYXRoLmFicyhnLWUpPFFyJiZkLXQ+UXI/W01hdGguYWJzKGYtZSk8UXI/aDp0LGVdOm51bGwpKS0xKSwrK2MpO2MmJihtPSExKX1pZihtKXt2YXIgdixfLHgsdz0xLzA7Zm9yKGk9MCxtPW51bGw7aTx5OysraSkobz1acltpXSkmJih4PSh2PShzPW8uc2l0ZSlbMF0tdCkqdisoXz1zWzFdLWUpKl8pPHcmJih3PXgsbT1vKTtpZihtKXt2YXIgYj1bdCxlXSxEPVt0LHJdLEU9W24scl0sQz1bbixlXTttLmhhbGZlZGdlcy5wdXNoKEpyLnB1c2goTnIocz1tLnNpdGUsYixEKSktMSxKci5wdXNoKE5yKHMsRCxFKSktMSxKci5wdXNoKE5yKHMsRSxDKSktMSxKci5wdXNoKE5yKHMsQyxiKSktMSl9fWZvcihpPTA7aTx5OysraSkobz1acltpXSkmJihvLmhhbGZlZGdlcy5sZW5ndGh8fGRlbGV0ZSBacltpXSl9KHMsYSx1LGMpfXRoaXMuZWRnZXM9SnIsdGhpcy5jZWxscz1acixIcj1Lcj1Kcj1acj1udWxsfWZ1bmN0aW9uIHJpKHQpe2lmKHZlKHQpJiYodD10LmJib3gpLHQmJiFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiYmJveCBpcyBpbnZhbGlkIik7cmV0dXJuIHQ/ZnVuY3Rpb24odCl7cmV0dXJuW01hdGgucmFuZG9tKCkqKHRbMl0tdFswXSkrdFswXSxNYXRoLnJhbmRvbSgpKih0WzNdLXRbMV0pK3RbMV1dfSh0KTpbMzYwKm9pKCksMTgwKm9pKCldfWZ1bmN0aW9uIGlpKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm5bZVswXSt0WzBdLGVbMV0rdFsxXV19fWZ1bmN0aW9uIG9pKCl7cmV0dXJuIE1hdGgucmFuZG9tKCktLjV9ZnVuY3Rpb24gc2kodCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBpcyByZXF1aXJlZCIpO2lmKCJGZWF0dXJlQ29sbGVjdGlvbiIhPT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIG11c3QgYmUgYSBGZWF0dXJlQ29sbGVjdGlvbiIpO2lmKG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJwcm9wZXJ0eSBpcyByZXF1aXJlZCIpO2Zvcih2YXIgcj1haSh0LGUpLGk9T2JqZWN0LmtleXMociksbz0wO288aS5sZW5ndGg7bysrKXtmb3IodmFyIHM9aVtvXSxhPXJbc10sdT1bXSxjPTA7YzxhLmxlbmd0aDtjKyspdS5wdXNoKHQuZmVhdHVyZXNbYVtjXV0pO24obGUodSkscyxvKX19ZnVuY3Rpb24gYWkodCxlKXt2YXIgbj17fTtyZXR1cm4gRWUodCwoZnVuY3Rpb24odCxyKXt2YXIgaT10LnByb3BlcnRpZXN8fHt9O2lmKGkuaGFzT3duUHJvcGVydHkoZSkpe3ZhciBvPWlbZV07bi5oYXNPd25Qcm9wZXJ0eShvKT9uW29dLnB1c2gocik6bltvXT1bcl19fSkpLG59ZnVuY3Rpb24gdWkodCxlKXtpZih2b2lkIDA9PT10KXJldHVybiExO3ZhciBuPXR5cGVvZiBlO2lmKCJudW1iZXIiPT09bnx8InN0cmluZyI9PT1uKXJldHVybiB0Lmhhc093blByb3BlcnR5KGUpO2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKCF1aSh0LGVbcl0pKXJldHVybiExO3JldHVybiEwfXJldHVybiBjaSh0LGUpfWZ1bmN0aW9uIGNpKHQsZSl7Zm9yKHZhciBuPU9iamVjdC5rZXlzKGUpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpZih0W2ldIT09ZVtpXSlyZXR1cm4hMX1yZXR1cm4hMH1uaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOm5pLHBvbHlnb25zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lZGdlcztyZXR1cm4gdGhpcy5jZWxscy5tYXAoKGZ1bmN0aW9uKGUpe3ZhciBuPWUuaGFsZmVkZ2VzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIE9yKGUsdFtuXSl9KSk7cmV0dXJuIG4uZGF0YT1lLnNpdGUuZGF0YSxufSkpfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxlPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaCgoZnVuY3Rpb24obixyKXtpZihvPShpPW4uaGFsZmVkZ2VzKS5sZW5ndGgpZm9yKHZhciBpLG8scyxhPW4uc2l0ZSx1PS0xLGM9ZVtpW28tMV1dLGw9Yy5sZWZ0PT09YT9jLnJpZ2h0OmMubGVmdDsrK3U8bzspcz1sLGw9KGM9ZVtpW3VdXSkubGVmdD09PWE/Yy5yaWdodDpjLmxlZnQscyYmbCYmcjxzLmluZGV4JiZyPGwuaW5kZXgmJnRpKGEscyxsKTwwJiZ0LnB1c2goW2EuZGF0YSxzLmRhdGEsbC5kYXRhXSl9KSksdH0sbGlua3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlcy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJpZ2h0fSkpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTp0LmxlZnQuZGF0YSx0YXJnZXQ6dC5yaWdodC5kYXRhfX0pKX0sZmluZDpmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGksbz10aGlzLHM9by5fZm91bmR8fDAsYT1vLmNlbGxzLmxlbmd0aDshKGk9by5jZWxsc1tzXSk7KWlmKCsrcz49YSlyZXR1cm4gbnVsbDt2YXIgdT10LWkuc2l0ZVswXSxjPWUtaS5zaXRlWzFdLGw9dSp1K2MqYztkb3tpPW8uY2VsbHNbcj1zXSxzPW51bGwsaS5oYWxmZWRnZXMuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIHI9by5lZGdlc1tuXSxhPXIubGVmdDtpZihhIT09aS5zaXRlJiZhfHwoYT1yLnJpZ2h0KSl7dmFyIHU9dC1hWzBdLGM9ZS1hWzFdLGg9dSp1K2MqYztoPGwmJihsPWgscz1hLmluZGV4KX19KSl9d2hpbGUobnVsbCE9PXMpO3JldHVybiBvLl9mb3VuZD1yLG51bGw9PW58fGw8PW4qbj9pLnNpdGU6bnVsbH19LE9iamVjdC5mcmVlemUoe3JhbmRvbVBvc2l0aW9uOnJpLHJhbmRvbVBvaW50OmZ1bmN0aW9uKHQsZSl7aWYoIXZlKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5iYm94O251bGw9PXQmJih0PTEpO2Zvcih2YXIgcj1bXSxpPTA7aTx0O2krKylyLnB1c2goYWUocmkobikpKTtyZXR1cm4gbGUocil9LHJhbmRvbVBvbHlnb246ZnVuY3Rpb24odCxlKXtpZighdmUoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj1lLmJib3gscj1lLm51bV92ZXJ0aWNlcyxpPWUubWF4X3JhZGlhbF9sZW5ndGg7bnVsbD09dCYmKHQ9MSksbWUocil8fChyPTEwKSxtZShpKXx8KGk9MTApO2Zvcih2YXIgbz1bXSxzPTA7czx0O3MrKyl7dmFyIGE9W10sdT1BcnJheS5hcHBseShudWxsLG5ldyBBcnJheShyKzEpKS5tYXAoTWF0aC5yYW5kb20pO3UuZm9yRWFjaChjKSx1LmZvckVhY2gobCksYVthLmxlbmd0aC0xXT1hWzBdLGE9YS5tYXAoaWkocmkobikpKSxvLnB1c2godWUoW2FdKSl9ZnVuY3Rpb24gYyh0LGUsbil7bltlXT1lPjA/dCtuW2UtMV06dH1mdW5jdGlvbiBsKHQpe3Q9Mip0Kk1hdGguUEkvdVt1Lmxlbmd0aC0xXTt2YXIgZT1NYXRoLnJhbmRvbSgpO2EucHVzaChbZSppKk1hdGguc2luKHQpLGUqaSpNYXRoLmNvcyh0KV0pfXJldHVybiBsZShvKX0scmFuZG9tTGluZVN0cmluZzpmdW5jdGlvbih0LGUpe2lmKCF2ZShlPWV8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuPWUuYmJveCxyPWUubnVtX3ZlcnRpY2VzLGk9ZS5tYXhfbGVuZ3RoLG89ZS5tYXhfcm90YXRpb247bnVsbD09dCYmKHQ9MSksKCFtZShyKXx8cjwyKSYmKHI9MTApLG1lKGkpfHwoaT0xZS00KSxtZShvKXx8KG89TWF0aC5QSS84KTtmb3IodmFyIHM9W10sYT0wO2E8dDthKyspe2Zvcih2YXIgdT1bcmkobildLGM9MDtjPHItMTtjKyspe3ZhciBsPSgwPT09Yz8yKk1hdGgucmFuZG9tKCkqTWF0aC5QSTpNYXRoLnRhbigodVtjXVsxXS11W2MtMV1bMV0pLyh1W2NdWzBdLXVbYy0xXVswXSkpKSsoTWF0aC5yYW5kb20oKS0uNSkqbyoyLGg9TWF0aC5yYW5kb20oKSppO3UucHVzaChbdVtjXVswXStoKk1hdGguY29zKGwpLHVbY11bMV0raCpNYXRoLnNpbihsKV0pfXMucHVzaChjZSh1KSl9cmV0dXJuIGxlKHMpfX0pLE9iamVjdC5mcmVlemUoe2dldENsdXN0ZXI6ZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtpZigiRmVhdHVyZUNvbGxlY3Rpb24iIT09dC50eXBlKXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBtdXN0IGJlIGEgRmVhdHVyZUNvbGxlY3Rpb24iKTtpZihudWxsPT1lKXRocm93IG5ldyBFcnJvcigiZmlsdGVyIGlzIHJlcXVpcmVkIik7dmFyIG49W107cmV0dXJuIEVlKHQsKGZ1bmN0aW9uKHQpe3VpKHQucHJvcGVydGllcyxlKSYmbi5wdXNoKHQpfSkpLGxlKG4pfSxjbHVzdGVyRWFjaDpzaSxjbHVzdGVyUmVkdWNlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXI7cmV0dXJuIHNpKHQsZSwoZnVuY3Rpb24odCxlLG8pe2k9MD09PW8mJnZvaWQgMD09PXI/dDpuKGksdCxlLG8pfSkpLGl9LGNyZWF0ZUJpbnM6YWksYXBwbHlGaWx0ZXI6dWkscHJvcGVydGllc0NvbnRhaW5zRmlsdGVyOmNpLGZpbHRlclByb3BlcnRpZXM6ZnVuY3Rpb24odCxlKXtpZighZSlyZXR1cm57fTtpZighZS5sZW5ndGgpcmV0dXJue307Zm9yKHZhciBuPXt9LHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyXTt0Lmhhc093blByb3BlcnR5KGkpJiYobltpXT10W2ldKX1yZXR1cm4gbn19KSwiZmlsbCJpbiBBcnJheS5wcm90b3R5cGV8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsImZpbGwiLHtjb25maWd1cmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24odCl7aWYobnVsbD09dGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKHRoaXMrIiBpcyBub3QgYW4gb2JqZWN0Iik7dmFyIGU9T2JqZWN0KHRoaXMpLG49TWF0aC5tYXgoTWF0aC5taW4oZS5sZW5ndGgsOTAwNzE5OTI1NDc0MDk5MSksMCl8fDAscj0xIGluIGFyZ3VtZW50cyYmcGFyc2VJbnQoTnVtYmVyKGFyZ3VtZW50c1sxXSksMTApfHwwO3I9cjwwP01hdGgubWF4KG4rciwwKTpNYXRoLm1pbihyLG4pO3ZhciBpPTIgaW4gYXJndW1lbnRzJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/cGFyc2VJbnQoTnVtYmVyKGFyZ3VtZW50c1syXSksMTApfHwwOm47Zm9yKGk9aTwwP01hdGgubWF4KG4rYXJndW1lbnRzWzJdLDApOk1hdGgubWluKGksbik7cjxpOyllW3JdPXQsKytyO3JldHVybiBlfSx3cml0YWJsZTohMH0pLE51bWJlci5pc0Zpbml0ZT1OdW1iZXIuaXNGaW5pdGV8fGZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmaXNGaW5pdGUodCl9LE51bWJlci5pc0ludGVnZXI9TnVtYmVyLmlzSW50ZWdlcnx8ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZpc0Zpbml0ZSh0KSYmTWF0aC5mbG9vcih0KT09PXR9LE51bWJlci5wYXJzZUZsb2F0PU51bWJlci5wYXJzZUZsb2F0fHxwYXJzZUZsb2F0LE51bWJlci5pc05hTj1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKHQpe3JldHVybiB0IT10fSxNYXRoLnRydW5jPU1hdGgudHJ1bmN8fGZ1bmN0aW9uKHQpe3JldHVybiB0PDA/TWF0aC5jZWlsKHQpOk1hdGguZmxvb3IodCl9O3ZhciBsaT1mdW5jdGlvbigpe307bGkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGxpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBsaX0sbGkucHJvdG90eXBlLmVxdWFsc1dpdGhUb2xlcmFuY2U9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNYXRoLmFicyh0LWUpPD1ufTt2YXIgaGk9ZnVuY3Rpb24oKXt9LGZpPWZ1bmN0aW9uKCl7fSxwaT17TUFYX1ZBTFVFOntjb25maWd1cmFibGU6ITB9fTtmaS5pc05hTj1mdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyLmlzTmFOKHQpfSxmaS5kb3VibGVUb0xvbmdCaXRzPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxmaS5sb25nQml0c1RvRG91YmxlPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxmaS5pc0luZmluaXRlPWZ1bmN0aW9uKHQpe3JldHVybiFOdW1iZXIuaXNGaW5pdGUodCl9LHBpLk1BWF9WQUxVRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTnVtYmVyLk1BWF9WQUxVRX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZmkscGkpO3ZhciBkaT1mdW5jdGlvbigpe30sZ2k9ZnVuY3Rpb24oKXt9LHlpPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBtaSgpe312YXIgdmk9ZnVuY3Rpb24gdCgpe2lmKHRoaXMueD1udWxsLHRoaXMueT1udWxsLHRoaXMuej1udWxsLDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMueD0wLHRoaXMueT0wLHRoaXMuej10Lk5VTExfT1JESU5BVEU7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMueD1lLngsdGhpcy55PWUueSx0aGlzLno9ZS56fWVsc2UgMj09PWFyZ3VtZW50cy5sZW5ndGg/KHRoaXMueD1hcmd1bWVudHNbMF0sdGhpcy55PWFyZ3VtZW50c1sxXSx0aGlzLno9dC5OVUxMX09SRElOQVRFKTozPT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMueD1hcmd1bWVudHNbMF0sdGhpcy55PWFyZ3VtZW50c1sxXSx0aGlzLno9YXJndW1lbnRzWzJdKX0sX2k9e0RpbWVuc2lvbmFsQ29tcGFyYXRvcjp7Y29uZmlndXJhYmxlOiEwfSxzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LE5VTExfT1JESU5BVEU6e2NvbmZpZ3VyYWJsZTohMH0sWDp7Y29uZmlndXJhYmxlOiEwfSxZOntjb25maWd1cmFibGU6ITB9LFo6e2NvbmZpZ3VyYWJsZTohMH19O3ZpLnByb3RvdHlwZS5zZXRPcmRpbmF0ZT1mdW5jdGlvbih0LGUpe3N3aXRjaCh0KXtjYXNlIHZpLlg6dGhpcy54PWU7YnJlYWs7Y2FzZSB2aS5ZOnRoaXMueT1lO2JyZWFrO2Nhc2UgdmkuWjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBoaX19LHZpLnByb3RvdHlwZS5lcXVhbHMyRD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuISh0aGlzLnghPT10Lnh8fHRoaXMueSE9PXQueSl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4hKCFsaS5lcXVhbHNXaXRoVG9sZXJhbmNlKHRoaXMueCxlLngsbil8fCFsaS5lcXVhbHNXaXRoVG9sZXJhbmNlKHRoaXMueSxlLnksbikpfX0sdmkucHJvdG90eXBlLmdldE9yZGluYXRlPWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlIHZpLlg6cmV0dXJuIHRoaXMueDtjYXNlIHZpLlk6cmV0dXJuIHRoaXMueTtjYXNlIHZpLlo6cmV0dXJuIHRoaXMuen10aHJvdyBuZXcgaGl9LHZpLnByb3RvdHlwZS5lcXVhbHMzRD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54PT09dC54JiZ0aGlzLnk9PT10LnkmJih0aGlzLno9PT10Lnp8fGZpLmlzTmFOKHRoaXMueikpJiZmaS5pc05hTih0LnopfSx2aS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdmkmJnRoaXMuZXF1YWxzMkQodCl9LHZpLnByb3RvdHlwZS5lcXVhbEluWj1mdW5jdGlvbih0LGUpe3JldHVybiBsaS5lcXVhbHNXaXRoVG9sZXJhbmNlKHRoaXMueix0LnosZSl9LHZpLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy54PGUueD8tMTp0aGlzLng+ZS54PzE6dGhpcy55PGUueT8tMTp0aGlzLnk+ZS55PzE6MH0sdmkucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7fSx2aS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3JldHVybiBuZXcgdmkodGhpcyl9LHZpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIoIit0aGlzLngrIiwgIit0aGlzLnkrIiwgIit0aGlzLnorIikifSx2aS5wcm90b3R5cGUuZGlzdGFuY2UzRD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLngtdC54LG49dGhpcy55LXQueSxyPXRoaXMuei10Lno7cmV0dXJuIE1hdGguc3FydChlKmUrbipuK3Iqcil9LHZpLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLngtdC54LG49dGhpcy55LXQueTtyZXR1cm4gTWF0aC5zcXJ0KGUqZStuKm4pfSx2aS5wcm90b3R5cGUuaGFzaENvZGU9ZnVuY3Rpb24oKXt2YXIgdD0xNztyZXR1cm4gdD0zNyoodD0zNyp0K3ZpLmhhc2hDb2RlKHRoaXMueCkpK3ZpLmhhc2hDb2RlKHRoaXMueSl9LHZpLnByb3RvdHlwZS5zZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3RoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56fSx2aS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGksZ2ksbWldfSx2aS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdml9LHZpLmhhc2hDb2RlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2ZpLmRvdWJsZVRvTG9uZ0JpdHMoYXJndW1lbnRzWzBdKTtyZXR1cm4gTWF0aC50cnVuYygwKX19LF9pLkRpbWVuc2lvbmFsQ29tcGFyYXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4geGl9LF9pLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NWNiZjJjMjM1YzdlNTgwMH0sX2kuTlVMTF9PUkRJTkFURS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZmkuTmFOfSxfaS5YLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxfaS5ZLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxfaS5aLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh2aSxfaSk7dmFyIHhpPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2RpbWVuc2lvbnNUb1Rlc3Q9MiwwIT09YXJndW1lbnRzLmxlbmd0aCYmMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTtpZigyIT09ZSYmMyE9PWUpdGhyb3cgbmV3IGhpO3RoaXMuX2RpbWVuc2lvbnNUb1Rlc3Q9ZX19O3hpLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dCxyPWUsaT14aS5jb21wYXJlKG4ueCxyLngpO2lmKDAhPT1pKXJldHVybiBpO3ZhciBvPXhpLmNvbXBhcmUobi55LHIueSk7cmV0dXJuIDAhPT1vP286dGhpcy5fZGltZW5zaW9uc1RvVGVzdDw9Mj8wOnhpLmNvbXBhcmUobi56LHIueil9LHhpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt5aV19LHhpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB4aX0seGkuY29tcGFyZT1mdW5jdGlvbih0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6ZmkuaXNOYU4odCk/ZmkuaXNOYU4oZSk/MDotMTpmaS5pc05hTihlKT8xOjB9O3ZhciB3aT1mdW5jdGlvbigpe307d2kucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbigpe30sd2kucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHdpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB3aX07dmFyIGJpPWZ1bmN0aW9uKCl7fSxEaT17SU5URVJJT1I6e2NvbmZpZ3VyYWJsZTohMH0sQk9VTkRBUlk6e2NvbmZpZ3VyYWJsZTohMH0sRVhURVJJT1I6e2NvbmZpZ3VyYWJsZTohMH0sTk9ORTp7Y29uZmlndXJhYmxlOiEwfX07YmkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGJpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBiaX0sYmkudG9Mb2NhdGlvblN5bWJvbD1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSBiaS5FWFRFUklPUjpyZXR1cm4iZSI7Y2FzZSBiaS5CT1VOREFSWTpyZXR1cm4iYiI7Y2FzZSBiaS5JTlRFUklPUjpyZXR1cm4iaSI7Y2FzZSBiaS5OT05FOnJldHVybiItIn10aHJvdyBuZXcgaGl9LERpLklOVEVSSU9SLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxEaS5CT1VOREFSWS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sRGkuRVhURVJJT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LERpLk5PTkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGJpLERpKTt2YXIgRWk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5pbnRlcmZhY2VzXyYmdC5pbnRlcmZhY2VzXygpLmluZGV4T2YoZSk+LTF9LENpPWZ1bmN0aW9uKCl7fSxTaT17TE9HXzEwOntjb25maWd1cmFibGU6ITB9fTtDaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sQ2kucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIENpfSxDaS5sb2cxMD1mdW5jdGlvbih0KXt2YXIgZT1NYXRoLmxvZyh0KTtyZXR1cm4gZmkuaXNJbmZpbml0ZShlKXx8ZmkuaXNOYU4oZSk/ZTplL0NpLkxPR18xMH0sQ2kubWluPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXQ7cmV0dXJuIGU8aSYmKGk9ZSksbjxpJiYoaT1uKSxyPGkmJihpPXIpLGl9LENpLmNsYW1wPWZ1bmN0aW9uKCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMl0mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3JldHVybiB0PGU/ZTp0Pm4/bjp0fWlmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzJdKSYmTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pJiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1sxXSkpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXTtyZXR1cm4gcjxpP2k6cj5vP286cn19LENpLndyYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDwwP2UtIC10JWU6dCVlfSxDaS5tYXg9ZnVuY3Rpb24oKXtpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzFdLGU9YXJndW1lbnRzWzJdLG49YXJndW1lbnRzWzBdO3JldHVybiB0Pm4mJihuPXQpLGU+biYmKG49ZSksbn1pZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdLG89YXJndW1lbnRzWzNdLHM9YXJndW1lbnRzWzBdO3JldHVybiByPnMmJihzPXIpLGk+cyYmKHM9aSksbz5zJiYocz1vKSxzfX0sQ2kuYXZlcmFnZT1mdW5jdGlvbih0LGUpe3JldHVybih0K2UpLzJ9LFNpLkxPR18xMC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5sb2coMTApfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDaSxTaSk7dmFyIEFpPWZ1bmN0aW9uKHQpe3RoaXMuc3RyPXR9O0FpLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24odCl7dGhpcy5zdHIrPXR9LEFpLnByb3RvdHlwZS5zZXRDaGFyQXQ9ZnVuY3Rpb24odCxlKXt0aGlzLnN0cj10aGlzLnN0ci5zdWJzdHIoMCx0KStlK3RoaXMuc3RyLnN1YnN0cih0KzEpfSxBaS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc3RyfTt2YXIgTmk9ZnVuY3Rpb24odCl7dGhpcy52YWx1ZT10fTtOaS5wcm90b3R5cGUuaW50VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX0sTmkucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy52YWx1ZTx0Py0xOnRoaXMudmFsdWU+dD8xOjB9LE5pLmlzTmFOPWZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIuaXNOYU4odCl9O3ZhciBJaT1mdW5jdGlvbigpe307SWkuaXNXaGl0ZXNwYWNlPWZ1bmN0aW9uKHQpe3JldHVybiB0PD0zMiYmdD49MHx8MTI3PT09dH0sSWkudG9VcHBlckNhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX07dmFyIE1pPWZ1bmN0aW9uIHQoKXtpZih0aGlzLl9oaT0wLHRoaXMuX2xvPTAsMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5pbml0KDApO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5pbml0KGUpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0KXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5pbml0KG4pfWVsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3QuY2FsbCh0aGlzLHQucGFyc2UoYXJndW1lbnRzWzBdKSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTt0aGlzLmluaXQocixpKX19LEZpPXtQSTp7Y29uZmlndXJhYmxlOiEwfSxUV09fUEk6e2NvbmZpZ3VyYWJsZTohMH0sUElfMjp7Y29uZmlndXJhYmxlOiEwfSxFOntjb25maWd1cmFibGU6ITB9LE5hTjp7Y29uZmlndXJhYmxlOiEwfSxFUFM6e2NvbmZpZ3VyYWJsZTohMH0sU1BMSVQ6e2NvbmZpZ3VyYWJsZTohMH0sTUFYX1BSSU5UX0RJR0lUUzp7Y29uZmlndXJhYmxlOiEwfSxURU46e2NvbmZpZ3VyYWJsZTohMH0sT05FOntjb25maWd1cmFibGU6ITB9LFNDSV9OT1RfRVhQT05FTlRfQ0hBUjp7Y29uZmlndXJhYmxlOiEwfSxTQ0lfTk9UX1pFUk86e2NvbmZpZ3VyYWJsZTohMH19O01pLnByb3RvdHlwZS5sZT1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5faGk8dC5faGl8fHRoaXMuX2hpPT09dC5faGkpJiZ0aGlzLl9sbzw9dC5fbG99LE1pLnByb3RvdHlwZS5leHRyYWN0U2lnbmlmaWNhbnREaWdpdHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmFicygpLHI9TWkubWFnbml0dWRlKG4uX2hpKSxpPU1pLlRFTi5wb3cocik7KG49bi5kaXZpZGUoaSkpLmd0KE1pLlRFTik/KG49bi5kaXZpZGUoTWkuVEVOKSxyKz0xKTpuLmx0KE1pLk9ORSkmJihuPW4ubXVsdGlwbHkoTWkuVEVOKSxyLT0xKTtmb3IodmFyIG89cisxLHM9bmV3IEFpLGE9TWkuTUFYX1BSSU5UX0RJR0lUUy0xLHU9MDt1PD1hO3UrKyl7dCYmdT09PW8mJnMuYXBwZW5kKCIuIik7dmFyIGM9TWF0aC50cnVuYyhuLl9oaSk7aWYoYzwwKWJyZWFrO3ZhciBsPSExLGg9MDtjPjk/KGw9ITAsaD0iOSIpOmg9IjAiK2Mscy5hcHBlbmQoaCksbj1uLnN1YnRyYWN0KE1pLnZhbHVlT2YoYykpLm11bHRpcGx5KE1pLlRFTiksbCYmbi5zZWxmQWRkKE1pLlRFTik7dmFyIGY9ITAscD1NaS5tYWduaXR1ZGUobi5faGkpO2lmKHA8MCYmTWF0aC5hYnMocCk+PWEtdSYmKGY9ITEpLCFmKWJyZWFrfXJldHVybiBlWzBdPXIscy50b1N0cmluZygpfSxNaS5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsdGlwbHkodGhpcyl9LE1pLnByb3RvdHlwZS5kb3VibGVWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oaSt0aGlzLl9sb30sTWkucHJvdG90eXBlLnN1YnRyYWN0PWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmFkZCh0Lm5lZ2F0ZSgpKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmFkZCgtZSl9fSxNaS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5faGk9PT10Ll9oaSYmdGhpcy5fbG89PT10Ll9sb319LE1pLnByb3RvdHlwZS5pc1plcm89ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuX2hpJiYwPT09dGhpcy5fbG99LE1pLnByb3RvdHlwZS5zZWxmU3VidHJhY3Q9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuaXNOYU4oKT90aGlzOnRoaXMuc2VsZkFkZCgtdC5faGksLXQuX2xvKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmlzTmFOKCk/dGhpczp0aGlzLnNlbGZBZGQoLWUsMCl9fSxNaS5wcm90b3R5cGUuZ2V0U3BlY2lhbE51bWJlclN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzWmVybygpPyIwLjAiOnRoaXMuaXNOYU4oKT8iTmFOICI6bnVsbH0sTWkucHJvdG90eXBlLm1pbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZSh0KT90aGlzOnR9LE1pLnByb3RvdHlwZS5zZWxmRGl2aWRlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmRGl2aWRlKHQuX2hpLHQuX2xvKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnNlbGZEaXZpZGUoZSwwKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG4scixpLG8scz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV0sdT1udWxsLGM9bnVsbCxsPW51bGwsaD1udWxsO3JldHVybiBpPXRoaXMuX2hpL3MsaD0odT0obD1NaS5TUExJVCppKS0odT1sLWkpKSooYz0oaD1NaS5TUExJVCpzKS0oYz1oLXMpKS0obz1pKnMpK3UqKHI9cy1jKSsobj1pLXUpKmMrbipyLGg9aSsobD0odGhpcy5faGktby1oK3RoaXMuX2xvLWkqYSkvcyksdGhpcy5faGk9aCx0aGlzLl9sbz1pLWgrbCx0aGlzfX0sTWkucHJvdG90eXBlLmR1bXA9ZnVuY3Rpb24oKXtyZXR1cm4iREQ8Iit0aGlzLl9oaSsiLCAiK3RoaXMuX2xvKyI+In0sTWkucHJvdG90eXBlLmRpdmlkZT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0LGUsbixyLGk9YXJndW1lbnRzWzBdLG89bnVsbCxzPW51bGwsYT1udWxsLHU9bnVsbDtyZXR1cm4gdD0obj10aGlzLl9oaS9pLl9oaSktKG89KGE9TWkuU1BMSVQqbiktKG89YS1uKSksdT1vKihzPSh1PU1pLlNQTElUKmkuX2hpKS0ocz11LWkuX2hpKSktKHI9bippLl9oaSkrbyooZT1pLl9oaS1zKSt0KnMrdCplLGE9KHRoaXMuX2hpLXItdSt0aGlzLl9sby1uKmkuX2xvKS9pLl9oaSxuZXcgTWkodT1uK2Esbi11K2EpfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgYz1hcmd1bWVudHNbMF07cmV0dXJuIGZpLmlzTmFOKGMpP01pLmNyZWF0ZU5hTigpOk1pLmNvcHkodGhpcykuc2VsZkRpdmlkZShjLDApfX0sTWkucHJvdG90eXBlLmdlPWZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9oaT50Ll9oaXx8dGhpcy5faGk9PT10Ll9oaSkmJnRoaXMuX2xvPj10Ll9sb30sTWkucHJvdG90eXBlLnBvdz1mdW5jdGlvbih0KXtpZigwPT09dClyZXR1cm4gTWkudmFsdWVPZigxKTt2YXIgZT1uZXcgTWkodGhpcyksbj1NaS52YWx1ZU9mKDEpLHI9TWF0aC5hYnModCk7aWYocj4xKWZvcig7cj4wOylyJTI9PTEmJm4uc2VsZk11bHRpcGx5KGUpLChyLz0yKT4wJiYoZT1lLnNxcigpKTtlbHNlIG49ZTtyZXR1cm4gdDwwP24ucmVjaXByb2NhbCgpOm59LE1pLnByb3RvdHlwZS5jZWlsPWZ1bmN0aW9uKCl7aWYodGhpcy5pc05hTigpKXJldHVybiBNaS5OYU47dmFyIHQ9TWF0aC5jZWlsKHRoaXMuX2hpKSxlPTA7cmV0dXJuIHQ9PT10aGlzLl9oaSYmKGU9TWF0aC5jZWlsKHRoaXMuX2xvKSksbmV3IE1pKHQsZSl9LE1pLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5faGk8ZS5faGk/LTE6dGhpcy5faGk+ZS5faGk/MTp0aGlzLl9sbzxlLl9sbz8tMTp0aGlzLl9sbz5lLl9sbz8xOjB9LE1pLnByb3RvdHlwZS5yaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOYU4oKT90aGlzOnRoaXMuYWRkKC41KS5mbG9vcigpfSxNaS5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuaW5pdCh0KSx0aGlzfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuaW5pdChlKSx0aGlzfX0sTWkucHJvdG90eXBlLm1heD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZSh0KT90aGlzOnR9LE1pLnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uKCl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gTWkudmFsdWVPZigwKTtpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gTWkuTmFOO3ZhciB0PTEvTWF0aC5zcXJ0KHRoaXMuX2hpKSxlPXRoaXMuX2hpKnQsbj1NaS52YWx1ZU9mKGUpLHI9dGhpcy5zdWJ0cmFjdChuLnNxcigpKS5faGkqKC41KnQpO3JldHVybiBuLmFkZChyKX0sTWkucHJvdG90eXBlLnNlbGZBZGQ9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnNlbGZBZGQodC5faGksdC5fbG8pfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZSxuLHIsaSxvLHM9YXJndW1lbnRzWzBdLGE9bnVsbDtyZXR1cm4gYT0ocj10aGlzLl9oaStzKS0oaT1yLXRoaXMuX2hpKSxuPShvPShhPXMtaSsodGhpcy5faGktYSkpK3RoaXMuX2xvKSsoci0oZT1yK28pKSx0aGlzLl9oaT1lK24sdGhpcy5fbG89bisoZS10aGlzLl9oaSksdGhpc319ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHUsYyxsLGgsZj1hcmd1bWVudHNbMF0scD1hcmd1bWVudHNbMV0sZD1udWxsLGc9bnVsbCx5PW51bGw7bD10aGlzLl9oaStmLGM9dGhpcy5fbG8rcCxnPWwtKHk9bC10aGlzLl9oaSksZD1jLShoPWMtdGhpcy5fbG8pO3ZhciBtPSh1PWwrKHk9KGc9Zi15Kyh0aGlzLl9oaS1nKSkrYykpKyh5PShkPXAtaCsodGhpcy5fbG8tZCkpKyh5KyhsLXUpKSksdj15Kyh1LW0pO3JldHVybiB0aGlzLl9oaT1tLHRoaXMuX2xvPXYsdGhpc319LE1pLnByb3RvdHlwZS5zZWxmTXVsdGlwbHk9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnNlbGZNdWx0aXBseSh0Ll9oaSx0Ll9sbyl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmTXVsdGlwbHkoZSwwKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG4scixpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPW51bGwsYT1udWxsLHU9bnVsbCxjPW51bGw7cz0odT1NaS5TUExJVCp0aGlzLl9oaSktdGhpcy5faGksYz1NaS5TUExJVCppLHM9dS1zLG49dGhpcy5faGktcyxhPWMtaTt2YXIgbD0odT10aGlzLl9oaSppKSsoYz1zKihhPWMtYSktdStzKihyPWktYSkrbiphK24qcisodGhpcy5faGkqbyt0aGlzLl9sbyppKSksaD1jKyhzPXUtbCk7cmV0dXJuIHRoaXMuX2hpPWwsdGhpcy5fbG89aCx0aGlzfX0sTWkucHJvdG90eXBlLnNlbGZTcXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxmTXVsdGlwbHkodGhpcyl9LE1pLnByb3RvdHlwZS5mbG9vcj1mdW5jdGlvbigpe2lmKHRoaXMuaXNOYU4oKSlyZXR1cm4gTWkuTmFOO3ZhciB0PU1hdGguZmxvb3IodGhpcy5faGkpLGU9MDtyZXR1cm4gdD09PXRoaXMuX2hpJiYoZT1NYXRoLmZsb29yKHRoaXMuX2xvKSksbmV3IE1pKHQsZSl9LE1pLnByb3RvdHlwZS5uZWdhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc05hTigpP3RoaXM6bmV3IE1pKC10aGlzLl9oaSwtdGhpcy5fbG8pfSxNaS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt9LE1pLnByb3RvdHlwZS5tdWx0aXBseT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdC5pc05hTigpP01pLmNyZWF0ZU5hTigpOk1pLmNvcHkodGhpcykuc2VsZk11bHRpcGx5KHQpfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIGZpLmlzTmFOKGUpP01pLmNyZWF0ZU5hTigpOk1pLmNvcHkodGhpcykuc2VsZk11bHRpcGx5KGUsMCl9fSxNaS5wcm90b3R5cGUuaXNOYU49ZnVuY3Rpb24oKXtyZXR1cm4gZmkuaXNOYU4odGhpcy5faGkpfSxNaS5wcm90b3R5cGUuaW50VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC50cnVuYyh0aGlzLl9oaSl9LE1pLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PU1pLm1hZ25pdHVkZSh0aGlzLl9oaSk7cmV0dXJuIHQ+PS0zJiZ0PD0yMD90aGlzLnRvU3RhbmRhcmROb3RhdGlvbigpOnRoaXMudG9TY2lOb3RhdGlvbigpfSxNaS5wcm90b3R5cGUudG9TdGFuZGFyZE5vdGF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRTcGVjaWFsTnVtYmVyU3RyaW5nKCk7aWYobnVsbCE9PXQpcmV0dXJuIHQ7dmFyIGU9bmV3IEFycmF5KDEpLmZpbGwobnVsbCksbj10aGlzLmV4dHJhY3RTaWduaWZpY2FudERpZ2l0cyghMCxlKSxyPWVbMF0rMSxpPW47aWYoIi4iPT09bi5jaGFyQXQoMCkpaT0iMCIrbjtlbHNlIGlmKHI8MClpPSIwLiIrTWkuc3RyaW5nT2ZDaGFyKCIwIiwtcikrbjtlbHNlIGlmKC0xPT09bi5pbmRleE9mKCIuIikpe3ZhciBvPXItbi5sZW5ndGg7aT1uK01pLnN0cmluZ09mQ2hhcigiMCIsbykrIi4wIn1yZXR1cm4gdGhpcy5pc05lZ2F0aXZlKCk/Ii0iK2k6aX0sTWkucHJvdG90eXBlLnJlY2lwcm9jYWw9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixpPW51bGwsbz1udWxsLHM9bnVsbCxhPW51bGw7dD0obj0xL3RoaXMuX2hpKS0oaT0ocz1NaS5TUExJVCpuKS0oaT1zLW4pKSxvPShhPU1pLlNQTElUKnRoaXMuX2hpKS10aGlzLl9oaTt2YXIgdT1uKyhzPSgxLShyPW4qdGhpcy5faGkpLShhPWkqKG89YS1vKS1yK2kqKGU9dGhpcy5faGktbykrdCpvK3QqZSktbip0aGlzLl9sbykvdGhpcy5faGkpO3JldHVybiBuZXcgTWkodSxuLXUrcyl9LE1pLnByb3RvdHlwZS50b1NjaU5vdGF0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gTWkuU0NJX05PVF9aRVJPO3ZhciB0PXRoaXMuZ2V0U3BlY2lhbE51bWJlclN0cmluZygpO2lmKG51bGwhPT10KXJldHVybiB0O3ZhciBlPW5ldyBBcnJheSgxKS5maWxsKG51bGwpLG49dGhpcy5leHRyYWN0U2lnbmlmaWNhbnREaWdpdHMoITEsZSkscj1NaS5TQ0lfTk9UX0VYUE9ORU5UX0NIQVIrZVswXTtpZigiMCI9PT1uLmNoYXJBdCgwKSl0aHJvdyBuZXcgRXJyb3IoIkZvdW5kIGxlYWRpbmcgemVybzogIituKTt2YXIgaT0iIjtuLmxlbmd0aD4xJiYoaT1uLnN1YnN0cmluZygxKSk7dmFyIG89bi5jaGFyQXQoMCkrIi4iK2k7cmV0dXJuIHRoaXMuaXNOZWdhdGl2ZSgpPyItIitvK3I6bytyfSxNaS5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOYU4oKT9NaS5OYU46dGhpcy5pc05lZ2F0aXZlKCk/dGhpcy5uZWdhdGUoKTpuZXcgTWkodGhpcyl9LE1pLnByb3RvdHlwZS5pc1Bvc2l0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuX2hpPjB8fDA9PT10aGlzLl9oaSkmJnRoaXMuX2xvPjB9LE1pLnByb3RvdHlwZS5sdD1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5faGk8dC5faGl8fHRoaXMuX2hpPT09dC5faGkpJiZ0aGlzLl9sbzx0Ll9sb30sTWkucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gTWkuY29weSh0aGlzKS5zZWxmQWRkKHQpfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIE1pLmNvcHkodGhpcykuc2VsZkFkZChlKX19LE1pLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5faGk9dCx0aGlzLl9sbz0wfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX2hpPWUuX2hpLHRoaXMuX2xvPWUuX2xvfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5faGk9bix0aGlzLl9sbz1yfX0sTWkucHJvdG90eXBlLmd0PWZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9oaT50Ll9oaXx8dGhpcy5faGk9PT10Ll9oaSkmJnRoaXMuX2xvPnQuX2xvfSxNaS5wcm90b3R5cGUuaXNOZWdhdGl2ZT1mdW5jdGlvbigpe3JldHVybih0aGlzLl9oaTwwfHwwPT09dGhpcy5faGkpJiZ0aGlzLl9sbzwwfSxNaS5wcm90b3R5cGUudHJ1bmM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc05hTigpP01pLk5hTjp0aGlzLmlzUG9zaXRpdmUoKT90aGlzLmZsb29yKCk6dGhpcy5jZWlsKCl9LE1pLnByb3RvdHlwZS5zaWdudW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGk+MD8xOnRoaXMuX2hpPDA/LTE6dGhpcy5fbG8+MD8xOnRoaXMuX2xvPDA/LTE6MH0sTWkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW21pLGRpLGdpXX0sTWkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE1pfSxNaS5zcXI9ZnVuY3Rpb24odCl7cmV0dXJuIE1pLnZhbHVlT2YodCkuc2VsZk11bHRpcGx5KHQpfSxNaS52YWx1ZU9mPWZ1bmN0aW9uKCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBhcmd1bWVudHNbMF0/TWkucGFyc2UoYXJndW1lbnRzWzBdKToibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXT9uZXcgTWkoYXJndW1lbnRzWzBdKTp2b2lkIDB9LE1pLnNxcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1pLnZhbHVlT2YodCkuc3FydCgpfSxNaS5wYXJzZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoO0lpLmlzV2hpdGVzcGFjZSh0LmNoYXJBdChlKSk7KWUrKzt2YXIgcj0hMTtpZihlPG4pe3ZhciBpPXQuY2hhckF0KGUpOygiLSI9PT1pfHwiKyI9PT1pKSYmKGUrKywiLSI9PT1pJiYocj0hMCkpfWZvcih2YXIgbz1uZXcgTWkscz0wLGE9MCx1PTA7IShlPj1uKTspe3ZhciBjPXQuY2hhckF0KGUpO2lmKGUrKyxJaS5pc0RpZ2l0KGMpKXt2YXIgbD1jLSIwIjtvLnNlbGZNdWx0aXBseShNaS5URU4pLG8uc2VsZkFkZChsKSxzKyt9ZWxzZXtpZigiLiIhPT1jKXtpZigiZSI9PT1jfHwiRSI9PT1jKXt2YXIgaD10LnN1YnN0cmluZyhlKTt0cnl7dT1OaS5wYXJzZUludChoKX1jYXRjaChlKXt0aHJvdyBlIGluc3RhbmNlb2YgRXJyb3I/bmV3IEVycm9yKCJJbnZhbGlkIGV4cG9uZW50ICIraCsiIGluIHN0cmluZyAiK3QpOmV9YnJlYWt9dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNoYXJhY3RlciAnIitjKyInIGF0IHBvc2l0aW9uICIrZSsiIGluIHN0cmluZyAiK3QpfWE9c319dmFyIGY9byxwPXMtYS11O2lmKDA9PT1wKWY9bztlbHNlIGlmKHA+MCl7dmFyIGQ9TWkuVEVOLnBvdyhwKTtmPW8uZGl2aWRlKGQpfWVsc2UgaWYocDwwKXt2YXIgZz1NaS5URU4ucG93KC1wKTtmPW8ubXVsdGlwbHkoZyl9cmV0dXJuIHI/Zi5uZWdhdGUoKTpmfSxNaS5jcmVhdGVOYU49ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE1pKGZpLk5hTixmaS5OYU4pfSxNaS5jb3B5PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgTWkodCl9LE1pLm1hZ25pdHVkZT1mdW5jdGlvbih0KXt2YXIgZT1NYXRoLmFicyh0KSxuPU1hdGgubG9nKGUpL01hdGgubG9nKDEwKSxyPU1hdGgudHJ1bmMoTWF0aC5mbG9vcihuKSk7cmV0dXJuIDEwKk1hdGgucG93KDEwLHIpPD1lJiYocis9MSkscn0sTWkuc3RyaW5nT2ZDaGFyPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyBBaSxyPTA7cjxlO3IrKyluLmFwcGVuZCh0KTtyZXR1cm4gbi50b1N0cmluZygpfSxGaS5QSS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE1pKDMuMTQxNTkyNjUzNTg5NzkzLDEyMjQ2NDY3OTkxNDczNTMyZS0zMil9LEZpLlRXT19QSS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE1pKDYuMjgzMTg1MzA3MTc5NTg2LDI0NDkyOTM1OTgyOTQ3MDY0ZS0zMil9LEZpLlBJXzIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNaSgxLjU3MDc5NjMyNjc5NDg5NjYsNjEyMzIzMzk5NTczNjc2NmUtMzIpfSxGaS5FLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgTWkoMi43MTgyODE4Mjg0NTkwNDUsMTQ0NTY0Njg5MTcyOTI1MDJlLTMyKX0sRmkuTmFOLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgTWkoZmkuTmFOLGZpLk5hTil9LEZpLkVQUy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTIzMjU5NTE2NDQwNzgzZS00Nn0sRmkuU1BMSVQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDEzNDIxNzcyOX0sRmkuTUFYX1BSSU5UX0RJR0lUUy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMzJ9LEZpLlRFTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWkudmFsdWVPZigxMCl9LEZpLk9ORS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWkudmFsdWVPZigxKX0sRmkuU0NJX05PVF9FWFBPTkVOVF9DSEFSLmdldD1mdW5jdGlvbigpe3JldHVybiJFIn0sRmkuU0NJX05PVF9aRVJPLmdldD1mdW5jdGlvbigpe3JldHVybiIwLjBFMCJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE1pLEZpKTt2YXIgVGk9ZnVuY3Rpb24oKXt9LE9pPXtEUF9TQUZFX0VQU0lMT046e2NvbmZpZ3VyYWJsZTohMH19O1RpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxUaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVGl9LFRpLm9yaWVudGF0aW9uSW5kZXg9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVRpLm9yaWVudGF0aW9uSW5kZXhGaWx0ZXIodCxlLG4pO2lmKHI8PTEpcmV0dXJuIHI7dmFyIGk9TWkudmFsdWVPZihlLngpLnNlbGZBZGQoLXQueCksbz1NaS52YWx1ZU9mKGUueSkuc2VsZkFkZCgtdC55KSxzPU1pLnZhbHVlT2Yobi54KS5zZWxmQWRkKC1lLngpLGE9TWkudmFsdWVPZihuLnkpLnNlbGZBZGQoLWUueSk7cmV0dXJuIGkuc2VsZk11bHRpcGx5KGEpLnNlbGZTdWJ0cmFjdChvLnNlbGZNdWx0aXBseShzKSkuc2lnbnVtKCl9LFRpLnNpZ25PZkRldDJ4Mj1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdC5tdWx0aXBseShyKS5zZWxmU3VidHJhY3QoZS5tdWx0aXBseShuKSkuc2lnbnVtKCl9LFRpLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1NaS52YWx1ZU9mKHIueSkuc2VsZlN1YnRyYWN0KG4ueSkuc2VsZk11bHRpcGx5KE1pLnZhbHVlT2YoZS54KS5zZWxmU3VidHJhY3QodC54KSksbz1NaS52YWx1ZU9mKHIueCkuc2VsZlN1YnRyYWN0KG4ueCkuc2VsZk11bHRpcGx5KE1pLnZhbHVlT2YoZS55KS5zZWxmU3VidHJhY3QodC55KSkscz1pLnN1YnRyYWN0KG8pLGE9TWkudmFsdWVPZihyLngpLnNlbGZTdWJ0cmFjdChuLngpLnNlbGZNdWx0aXBseShNaS52YWx1ZU9mKHQueSkuc2VsZlN1YnRyYWN0KG4ueSkpLHU9TWkudmFsdWVPZihyLnkpLnNlbGZTdWJ0cmFjdChuLnkpLnNlbGZNdWx0aXBseShNaS52YWx1ZU9mKHQueCkuc2VsZlN1YnRyYWN0KG4ueCkpLGM9YS5zdWJ0cmFjdCh1KS5zZWxmRGl2aWRlKHMpLmRvdWJsZVZhbHVlKCksbD1NaS52YWx1ZU9mKHQueCkuc2VsZkFkZChNaS52YWx1ZU9mKGUueCkuc2VsZlN1YnRyYWN0KHQueCkuc2VsZk11bHRpcGx5KGMpKS5kb3VibGVWYWx1ZSgpLGg9TWkudmFsdWVPZihlLngpLnNlbGZTdWJ0cmFjdCh0LngpLnNlbGZNdWx0aXBseShNaS52YWx1ZU9mKHQueSkuc2VsZlN1YnRyYWN0KG4ueSkpLGY9TWkudmFsdWVPZihlLnkpLnNlbGZTdWJ0cmFjdCh0LnkpLnNlbGZNdWx0aXBseShNaS52YWx1ZU9mKHQueCkuc2VsZlN1YnRyYWN0KG4ueCkpLHA9aC5zdWJ0cmFjdChmKS5zZWxmRGl2aWRlKHMpLmRvdWJsZVZhbHVlKCksZD1NaS52YWx1ZU9mKG4ueSkuc2VsZkFkZChNaS52YWx1ZU9mKHIueSkuc2VsZlN1YnRyYWN0KG4ueSkuc2VsZk11bHRpcGx5KHApKS5kb3VibGVWYWx1ZSgpO3JldHVybiBuZXcgdmkobCxkKX0sVGkub3JpZW50YXRpb25JbmRleEZpbHRlcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9bnVsbCxpPSh0Lngtbi54KSooZS55LW4ueSksbz0odC55LW4ueSkqKGUueC1uLngpLHM9aS1vO2lmKGk+MCl7aWYobzw9MClyZXR1cm4gVGkuc2lnbnVtKHMpO3I9aStvfWVsc2V7aWYoIShpPDApKXJldHVybiBUaS5zaWdudW0ocyk7aWYobz49MClyZXR1cm4gVGkuc2lnbnVtKHMpO3I9LWktb312YXIgYT1UaS5EUF9TQUZFX0VQU0lMT04qcjtyZXR1cm4gcz49YXx8LXM+PWE/VGkuc2lnbnVtKHMpOjJ9LFRpLnNpZ251bT1mdW5jdGlvbih0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9LE9pLkRQX1NBRkVfRVBTSUxPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtMTV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFRpLE9pKTt2YXIgTGk9ZnVuY3Rpb24oKXt9LFBpPXtYOntjb25maWd1cmFibGU6ITB9LFk6e2NvbmZpZ3VyYWJsZTohMH0sWjp7Y29uZmlndXJhYmxlOiEwfSxNOntjb25maWd1cmFibGU6ITB9fTtQaS5YLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxQaS5ZLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxQaS5aLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxQaS5NLmdldD1mdW5jdGlvbigpe3JldHVybiAzfSxMaS5wcm90b3R5cGUuc2V0T3JkaW5hdGU9ZnVuY3Rpb24odCxlLG4pe30sTGkucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXt9LExpLnByb3RvdHlwZS5nZXRPcmRpbmF0ZT1mdW5jdGlvbih0LGUpe30sTGkucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXt9LExpLnByb3RvdHlwZS5nZXRDb29yZGluYXRlQ29weT1mdW5jdGlvbih0KXt9LExpLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXt9LExpLnByb3RvdHlwZS5nZXRYPWZ1bmN0aW9uKHQpe30sTGkucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7fSxMaS5wcm90b3R5cGUuZXhwYW5kRW52ZWxvcGU9ZnVuY3Rpb24odCl7fSxMaS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe30sTGkucHJvdG90eXBlLmdldFk9ZnVuY3Rpb24odCl7fSxMaS5wcm90b3R5cGUudG9Db29yZGluYXRlQXJyYXk9ZnVuY3Rpb24oKXt9LExpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltnaV19LExpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBMaX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTGksUGkpO3ZhciBSaT1mdW5jdGlvbigpe30sQmk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzLCJQcm9qZWN0aXZlIHBvaW50IG5vdCByZXByZXNlbnRhYmxlIG9uIHRoZSBDYXJ0ZXNpYW4gcGxhbmUuIil9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KFJpKSxraT1mdW5jdGlvbigpe307a2kuYXJyYXljb3B5PWZ1bmN0aW9uKHQsZSxuLHIsaSl7Zm9yKHZhciBvPTAscz1lO3M8ZStpO3MrKyluW3Irb109dFtzXSxvKyt9LGtpLmdldFByb3BlcnR5PWZ1bmN0aW9uKHQpe3JldHVybnsibGluZS5zZXBhcmF0b3IiOiJcbiJ9W3RdfTt2YXIgemk9ZnVuY3Rpb24gdCgpe2lmKHRoaXMueD1udWxsLHRoaXMueT1udWxsLHRoaXMudz1udWxsLDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMueD0wLHRoaXMueT0wLHRoaXMudz0xO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLng9ZS54LHRoaXMueT1lLnksdGhpcy53PTF9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy54PW4sdGhpcy55PXIsdGhpcy53PTF9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgdCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdO3RoaXMueD1pLnkqby53LW8ueSppLncsdGhpcy55PW8ueCppLnctaS54Km8udyx0aGlzLnc9aS54Km8ueS1vLngqaS55fWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdO3RoaXMueD1zLnktYS55LHRoaXMueT1hLngtcy54LHRoaXMudz1zLngqYS55LWEueCpzLnl9fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB1PWFyZ3VtZW50c1swXSxjPWFyZ3VtZW50c1sxXSxsPWFyZ3VtZW50c1syXTt0aGlzLng9dSx0aGlzLnk9Yyx0aGlzLnc9bH1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaD1hcmd1bWVudHNbMF0sZj1hcmd1bWVudHNbMV0scD1hcmd1bWVudHNbMl0sZD1hcmd1bWVudHNbM10sZz1oLnktZi55LHk9Zi54LWgueCxtPWgueCpmLnktZi54KmgueSx2PXAueS1kLnksXz1kLngtcC54LHg9cC54KmQueS1kLngqcC55O3RoaXMueD15KngtXyptLHRoaXMueT12Km0tZyp4LHRoaXMudz1nKl8tdip5fX07emkucHJvdG90eXBlLmdldFk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnkvdGhpcy53O2lmKGZpLmlzTmFOKHQpfHxmaS5pc0luZmluaXRlKHQpKXRocm93IG5ldyBCaTtyZXR1cm4gdH0semkucHJvdG90eXBlLmdldFg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLngvdGhpcy53O2lmKGZpLmlzTmFOKHQpfHxmaS5pc0luZmluaXRlKHQpKXRocm93IG5ldyBCaTtyZXR1cm4gdH0semkucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgdmk7cmV0dXJuIHQueD10aGlzLmdldFgoKSx0Lnk9dGhpcy5nZXRZKCksdH0semkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHppLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB6aX0semkuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXQueS1lLnksbz1lLngtdC54LHM9dC54KmUueS1lLngqdC55LGE9bi55LXIueSx1PXIueC1uLngsYz1uLngqci55LXIueCpuLnksbD1pKnUtYSpvLGg9KG8qYy11KnMpL2wsZj0oYSpzLWkqYykvbDtpZihmaS5pc05hTihoKXx8ZmkuaXNJbmZpbml0ZShoKXx8ZmkuaXNOYU4oZil8fGZpLmlzSW5maW5pdGUoZikpdGhyb3cgbmV3IEJpO3JldHVybiBuZXcgdmkoaCxmKX07dmFyIGppPWZ1bmN0aW9uIHQoKXtpZih0aGlzLl9taW54PW51bGwsdGhpcy5fbWF4eD1udWxsLHRoaXMuX21pbnk9bnVsbCx0aGlzLl9tYXh5PW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5pbml0KCk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuaW5pdChlLngsZS54LGUueSxlLnkpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0KXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5pbml0KG4pfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV07dGhpcy5pbml0KHIueCxpLngsci55LGkueSl9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdLGE9YXJndW1lbnRzWzJdLHU9YXJndW1lbnRzWzNdO3RoaXMuaW5pdChvLHMsYSx1KX19LFVpPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtqaS5wcm90b3R5cGUuZ2V0QXJlYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFdpZHRoKCkqdGhpcy5nZXRIZWlnaHQoKX0samkucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBqaSkpcmV0dXJuITE7dmFyIGU9dDtyZXR1cm4gdGhpcy5pc051bGwoKT9lLmlzTnVsbCgpOnRoaXMuX21heHg9PT1lLmdldE1heFgoKSYmdGhpcy5fbWF4eT09PWUuZ2V0TWF4WSgpJiZ0aGlzLl9taW54PT09ZS5nZXRNaW5YKCkmJnRoaXMuX21pbnk9PT1lLmdldE1pblkoKX0samkucHJvdG90eXBlLmludGVyc2VjdGlvbj1mdW5jdGlvbih0KXtpZih0aGlzLmlzTnVsbCgpfHx0LmlzTnVsbCgpfHwhdGhpcy5pbnRlcnNlY3RzKHQpKXJldHVybiBuZXcgamk7dmFyIGU9dGhpcy5fbWlueD50Ll9taW54P3RoaXMuX21pbng6dC5fbWlueCxuPXRoaXMuX21pbnk+dC5fbWlueT90aGlzLl9taW55OnQuX21pbnkscj10aGlzLl9tYXh4PHQuX21heHg/dGhpcy5fbWF4eDp0Ll9tYXh4LGk9dGhpcy5fbWF4eTx0Ll9tYXh5P3RoaXMuX21heHk6dC5fbWF4eTtyZXR1cm4gbmV3IGppKGUscixuLGkpfSxqaS5wcm90b3R5cGUuaXNOdWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heHg8dGhpcy5fbWlueH0samkucHJvdG90eXBlLmdldE1heFg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4eH0samkucHJvdG90eXBlLmNvdmVycz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY292ZXJzKHQueCx0LnkpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygamkpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4hdGhpcy5pc051bGwoKSYmIWUuaXNOdWxsKCkmJihlLmdldE1pblgoKT49dGhpcy5fbWlueCYmZS5nZXRNYXhYKCk8PXRoaXMuX21heHgmJmUuZ2V0TWluWSgpPj10aGlzLl9taW55JiZlLmdldE1heFkoKTw9dGhpcy5fbWF4eSl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtyZXR1cm4hdGhpcy5pc051bGwoKSYmKG4+PXRoaXMuX21pbngmJm48PXRoaXMuX21heHgmJnI+PXRoaXMuX21pbnkmJnI8PXRoaXMuX21heHkpfX0samkucHJvdG90eXBlLmludGVyc2VjdHM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBqaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiF0aGlzLmlzTnVsbCgpJiYhdC5pc051bGwoKSYmISh0Ll9taW54PnRoaXMuX21heHh8fHQuX21heHg8dGhpcy5fbWlueHx8dC5fbWlueT50aGlzLl9tYXh5fHx0Ll9tYXh5PHRoaXMuX21pbnkpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzKGUueCxlLnkpfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07cmV0dXJuIXRoaXMuaXNOdWxsKCkmJiEobj50aGlzLl9tYXh4fHxuPHRoaXMuX21pbnh8fHI+dGhpcy5fbWF4eXx8cjx0aGlzLl9taW55KX19LGppLnByb3RvdHlwZS5nZXRNaW5ZPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbnl9LGppLnByb3RvdHlwZS5nZXRNaW5YPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbnh9LGppLnByb3RvdHlwZS5leHBhbmRUb0luY2x1ZGU9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuZXhwYW5kVG9JbmNsdWRlKHQueCx0LnkpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBqaSl7dmFyIGU9YXJndW1lbnRzWzBdO2lmKGUuaXNOdWxsKCkpcmV0dXJuIG51bGw7dGhpcy5pc051bGwoKT8odGhpcy5fbWlueD1lLmdldE1pblgoKSx0aGlzLl9tYXh4PWUuZ2V0TWF4WCgpLHRoaXMuX21pbnk9ZS5nZXRNaW5ZKCksdGhpcy5fbWF4eT1lLmdldE1heFkoKSk6KGUuX21pbng8dGhpcy5fbWlueCYmKHRoaXMuX21pbng9ZS5fbWlueCksZS5fbWF4eD50aGlzLl9tYXh4JiYodGhpcy5fbWF4eD1lLl9tYXh4KSxlLl9taW55PHRoaXMuX21pbnkmJih0aGlzLl9taW55PWUuX21pbnkpLGUuX21heHk+dGhpcy5fbWF4eSYmKHRoaXMuX21heHk9ZS5fbWF4eSkpfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5pc051bGwoKT8odGhpcy5fbWlueD1uLHRoaXMuX21heHg9bix0aGlzLl9taW55PXIsdGhpcy5fbWF4eT1yKToobjx0aGlzLl9taW54JiYodGhpcy5fbWlueD1uKSxuPnRoaXMuX21heHgmJih0aGlzLl9tYXh4PW4pLHI8dGhpcy5fbWlueSYmKHRoaXMuX21pbnk9cikscj50aGlzLl9tYXh5JiYodGhpcy5fbWF4eT1yKSl9fSxqaS5wcm90b3R5cGUubWluRXh0ZW50PWZ1bmN0aW9uKCl7aWYodGhpcy5pc051bGwoKSlyZXR1cm4gMDt2YXIgdD10aGlzLmdldFdpZHRoKCksZT10aGlzLmdldEhlaWdodCgpO3JldHVybiB0PGU/dDplfSxqaS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc051bGwoKT8wOnRoaXMuX21heHgtdGhpcy5fbWlueH0samkucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLmlzTnVsbCgpP2UuaXNOdWxsKCk/MDotMTplLmlzTnVsbCgpPzE6dGhpcy5fbWlueDxlLl9taW54Py0xOnRoaXMuX21pbng+ZS5fbWlueD8xOnRoaXMuX21pbnk8ZS5fbWlueT8tMTp0aGlzLl9taW55PmUuX21pbnk/MTp0aGlzLl9tYXh4PGUuX21heHg/LTE6dGhpcy5fbWF4eD5lLl9tYXh4PzE6dGhpcy5fbWF4eTxlLl9tYXh5Py0xOnRoaXMuX21heHk+ZS5fbWF4eT8xOjB9LGppLnByb3RvdHlwZS50cmFuc2xhdGU9ZnVuY3Rpb24odCxlKXtpZih0aGlzLmlzTnVsbCgpKXJldHVybiBudWxsO3RoaXMuaW5pdCh0aGlzLmdldE1pblgoKSt0LHRoaXMuZ2V0TWF4WCgpK3QsdGhpcy5nZXRNaW5ZKCkrZSx0aGlzLmdldE1heFkoKStlKX0samkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkVudlsiK3RoaXMuX21pbngrIiA6ICIrdGhpcy5fbWF4eCsiLCAiK3RoaXMuX21pbnkrIiA6ICIrdGhpcy5fbWF4eSsiXSJ9LGppLnByb3RvdHlwZS5zZXRUb051bGw9ZnVuY3Rpb24oKXt0aGlzLl9taW54PTAsdGhpcy5fbWF4eD0tMSx0aGlzLl9taW55PTAsdGhpcy5fbWF4eT0tMX0samkucHJvdG90eXBlLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTnVsbCgpPzA6dGhpcy5fbWF4eS10aGlzLl9taW55fSxqaS5wcm90b3R5cGUubWF4RXh0ZW50PWZ1bmN0aW9uKCl7aWYodGhpcy5pc051bGwoKSlyZXR1cm4gMDt2YXIgdD10aGlzLmdldFdpZHRoKCksZT10aGlzLmdldEhlaWdodCgpO3JldHVybiB0PmU/dDplfSxqaS5wcm90b3R5cGUuZXhwYW5kQnk9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuZXhwYW5kQnkodCx0KX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYodGhpcy5pc051bGwoKSlyZXR1cm4gbnVsbDt0aGlzLl9taW54LT1lLHRoaXMuX21heHgrPWUsdGhpcy5fbWlueS09bix0aGlzLl9tYXh5Kz1uLCh0aGlzLl9taW54PnRoaXMuX21heHh8fHRoaXMuX21pbnk+dGhpcy5fbWF4eSkmJnRoaXMuc2V0VG9OdWxsKCl9fSxqaS5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBqaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNvdmVycyh0KX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY292ZXJzKGUpfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuY292ZXJzKG4scil9fSxqaS5wcm90b3R5cGUuY2VudHJlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOdWxsKCk/bnVsbDpuZXcgdmkoKHRoaXMuZ2V0TWluWCgpK3RoaXMuZ2V0TWF4WCgpKS8yLCh0aGlzLmdldE1pblkoKSt0aGlzLmdldE1heFkoKSkvMil9LGppLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5zZXRUb051bGwoKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5pbml0KHQueCx0LngsdC55LHQueSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGppKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5fbWlueD1lLl9taW54LHRoaXMuX21heHg9ZS5fbWF4eCx0aGlzLl9taW55PWUuX21pbnksdGhpcy5fbWF4eT1lLl9tYXh5fX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5pbml0KG4ueCxyLngsbi55LHIueSl9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzNdO2k8bz8odGhpcy5fbWlueD1pLHRoaXMuX21heHg9byk6KHRoaXMuX21pbng9byx0aGlzLl9tYXh4PWkpLHM8YT8odGhpcy5fbWlueT1zLHRoaXMuX21heHk9YSk6KHRoaXMuX21pbnk9YSx0aGlzLl9tYXh5PXMpfX0samkucHJvdG90eXBlLmdldE1heFk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4eX0samkucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKHQpe2lmKHRoaXMuaW50ZXJzZWN0cyh0KSlyZXR1cm4gMDt2YXIgZT0wO3RoaXMuX21heHg8dC5fbWlueD9lPXQuX21pbngtdGhpcy5fbWF4eDp0aGlzLl9taW54PnQuX21heHgmJihlPXRoaXMuX21pbngtdC5fbWF4eCk7dmFyIG49MDtyZXR1cm4gdGhpcy5fbWF4eTx0Ll9taW55P249dC5fbWlueS10aGlzLl9tYXh5OnRoaXMuX21pbnk+dC5fbWF4eSYmKG49dGhpcy5fbWlueS10Ll9tYXh5KSwwPT09ZT9uOjA9PT1uP2U6TWF0aC5zcXJ0KGUqZStuKm4pfSxqaS5wcm90b3R5cGUuaGFzaENvZGU9ZnVuY3Rpb24oKXt2YXIgdD0xNztyZXR1cm4gdD0zNyoodD0zNyoodD0zNyoodD0zNyp0K3ZpLmhhc2hDb2RlKHRoaXMuX21pbngpKSt2aS5oYXNoQ29kZSh0aGlzLl9tYXh4KSkrdmkuaGFzaENvZGUodGhpcy5fbWlueSkpK3ZpLmhhc2hDb2RlKHRoaXMuX21heHkpfSxqaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGksbWldfSxqaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaml9LGppLmludGVyc2VjdHM9ZnVuY3Rpb24oKXtpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3JldHVybiBuLng+PSh0Lng8ZS54P3QueDplLngpJiZuLng8PSh0Lng+ZS54P3QueDplLngpJiZuLnk+PSh0Lnk8ZS55P3QueTplLnkpJiZuLnk8PSh0Lnk+ZS55P3QueTplLnkpfWlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl0scz1hcmd1bWVudHNbM10sYT1NYXRoLm1pbihvLngscy54KSx1PU1hdGgubWF4KG8ueCxzLngpLGM9TWF0aC5taW4oci54LGkueCksbD1NYXRoLm1heChyLngsaS54KTtyZXR1cm4hKGM+dXx8bDxhfHwoYT1NYXRoLm1pbihvLnkscy55KSx1PU1hdGgubWF4KG8ueSxzLnkpLGM9TWF0aC5taW4oci55LGkueSksbD1NYXRoLm1heChyLnksaS55KSxjPnUpfHxsPGEpfX0sVWkuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg1MTg0NWNkNTUyMTg5ODAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhqaSxVaSk7dmFyIHFpPXt0eXBlU3RyOi9eXHMqKFx3KylccypcKFxzKiguKilccypcKVxzKiQvLGVtcHR5VHlwZVN0cjovXlxzKihcdyspXHMqRU1QVFlccyokLyxzcGFjZXM6L1xzKy8scGFyZW5Db21tYTovXClccyosXHMqXCgvLGRvdWJsZVBhcmVuQ29tbWE6L1wpXHMqXClccyosXHMqXChccypcKC8sdHJpbVBhcmVuczovXlxzKlwoPyguKj8pXCk/XHMqJC99LFZpPWZ1bmN0aW9uKHQpe3RoaXMuZ2VvbWV0cnlGYWN0b3J5PXR8fG5ldyBJc307VmkucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24odCl7dmFyIGUsbixyO3Q9dC5yZXBsYWNlKC9bXG5ccl0vZywiICIpO3ZhciBpPXFpLnR5cGVTdHIuZXhlYyh0KTtpZigtMSE9PXQuc2VhcmNoKCJFTVBUWSIpJiYoKGk9cWkuZW1wdHlUeXBlU3RyLmV4ZWModCkpWzJdPXZvaWQgMCksaSYmKG49aVsxXS50b0xvd2VyQ2FzZSgpLHI9aVsyXSxZaVtuXSYmKGU9WWlbbl0uYXBwbHkodGhpcyxbcl0pKSksdm9pZCAwPT09ZSl0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBXS1QgIit0KTtyZXR1cm4gZX0sVmkucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmV4dHJhY3RHZW9tZXRyeSh0KX0sVmkucHJvdG90eXBlLmV4dHJhY3RHZW9tZXRyeT1mdW5jdGlvbih0KXt2YXIgZT10LmdldEdlb21ldHJ5VHlwZSgpLnRvTG93ZXJDYXNlKCk7aWYoIUdpW2VdKXJldHVybiBudWxsO3ZhciBuPWUudG9VcHBlckNhc2UoKTtyZXR1cm4gdC5pc0VtcHR5KCk/bisiIEVNUFRZIjpuKyIoIitHaVtlXS5hcHBseSh0aGlzLFt0XSkrIikifTt2YXIgR2k9e2Nvb3JkaW5hdGU6ZnVuY3Rpb24odCl7cmV0dXJuIHQueCsiICIrdC55fSxwb2ludDpmdW5jdGlvbih0KXtyZXR1cm4gR2kuY29vcmRpbmF0ZS5jYWxsKHRoaXMsdC5fY29vcmRpbmF0ZXMuX2Nvb3JkaW5hdGVzWzBdKX0sbXVsdGlwb2ludDpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5fZ2VvbWV0cmllcy5sZW5ndGg7bjxyOysrbillLnB1c2goIigiK0dpLnBvaW50LmFwcGx5KHRoaXMsW3QuX2dlb21ldHJpZXNbbl1dKSsiKSIpO3JldHVybiBlLmpvaW4oIiwiKX0sbGluZXN0cmluZzpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5fcG9pbnRzLl9jb29yZGluYXRlcy5sZW5ndGg7bjxyOysrbillLnB1c2goR2kuY29vcmRpbmF0ZS5hcHBseSh0aGlzLFt0Ll9wb2ludHMuX2Nvb3JkaW5hdGVzW25dXSkpO3JldHVybiBlLmpvaW4oIiwiKX0sbGluZWFycmluZzpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5fcG9pbnRzLl9jb29yZGluYXRlcy5sZW5ndGg7bjxyOysrbillLnB1c2goR2kuY29vcmRpbmF0ZS5hcHBseSh0aGlzLFt0Ll9wb2ludHMuX2Nvb3JkaW5hdGVzW25dXSkpO3JldHVybiBlLmpvaW4oIiwiKX0sbXVsdGlsaW5lc3RyaW5nOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Ll9nZW9tZXRyaWVzLmxlbmd0aDtuPHI7KytuKWUucHVzaCgiKCIrR2kubGluZXN0cmluZy5hcHBseSh0aGlzLFt0Ll9nZW9tZXRyaWVzW25dXSkrIikiKTtyZXR1cm4gZS5qb2luKCIsIil9LHBvbHlnb246ZnVuY3Rpb24odCl7dmFyIGU9W107ZS5wdXNoKCIoIitHaS5saW5lc3RyaW5nLmFwcGx5KHRoaXMsW3QuX3NoZWxsXSkrIikiKTtmb3IodmFyIG49MCxyPXQuX2hvbGVzLmxlbmd0aDtuPHI7KytuKWUucHVzaCgiKCIrR2kubGluZXN0cmluZy5hcHBseSh0aGlzLFt0Ll9ob2xlc1tuXV0pKyIpIik7cmV0dXJuIGUuam9pbigiLCIpfSxtdWx0aXBvbHlnb246ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX2dlb21ldHJpZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKCIoIitHaS5wb2x5Z29uLmFwcGx5KHRoaXMsW3QuX2dlb21ldHJpZXNbbl1dKSsiKSIpO3JldHVybiBlLmpvaW4oIiwiKX0sZ2VvbWV0cnljb2xsZWN0aW9uOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Ll9nZW9tZXRyaWVzLmxlbmd0aDtuPHI7KytuKWUucHVzaCh0aGlzLmV4dHJhY3RHZW9tZXRyeSh0Ll9nZW9tZXRyaWVzW25dKSk7cmV0dXJuIGUuam9pbigiLCIpfX0sWWk9e3BvaW50OmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvaW50KCk7dmFyIGU9dC50cmltKCkuc3BsaXQocWkuc3BhY2VzKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlUG9pbnQobmV3IHZpKE51bWJlci5wYXJzZUZsb2F0KGVbMF0pLE51bWJlci5wYXJzZUZsb2F0KGVbMV0pKSl9LG11bHRpcG9pbnQ6ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTXVsdGlQb2ludCgpO2Zvcih2YXIgZSxuPXQudHJpbSgpLnNwbGl0KCIsIikscj1bXSxpPTAsbz1uLmxlbmd0aDtpPG87KytpKWU9bltpXS5yZXBsYWNlKHFpLnRyaW1QYXJlbnMsIiQxIiksci5wdXNoKFlpLnBvaW50LmFwcGx5KHRoaXMsW2VdKSk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpUG9pbnQocil9LGxpbmVzdHJpbmc6ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZVN0cmluZygpO2Zvcih2YXIgZSxuPXQudHJpbSgpLnNwbGl0KCIsIikscj1bXSxpPTAsbz1uLmxlbmd0aDtpPG87KytpKWU9bltpXS50cmltKCkuc3BsaXQocWkuc3BhY2VzKSxyLnB1c2gobmV3IHZpKE51bWJlci5wYXJzZUZsb2F0KGVbMF0pLE51bWJlci5wYXJzZUZsb2F0KGVbMV0pKSk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVTdHJpbmcocil9LGxpbmVhcnJpbmc6ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZWFyUmluZygpO2Zvcih2YXIgZSxuPXQudHJpbSgpLnNwbGl0KCIsIikscj1bXSxpPTAsbz1uLmxlbmd0aDtpPG87KytpKWU9bltpXS50cmltKCkuc3BsaXQocWkuc3BhY2VzKSxyLnB1c2gobmV3IHZpKE51bWJlci5wYXJzZUZsb2F0KGVbMF0pLE51bWJlci5wYXJzZUZsb2F0KGVbMV0pKSk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcocil9LG11bHRpbGluZXN0cmluZzpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcoKTtmb3IodmFyIGUsbj10LnRyaW0oKS5zcGxpdChxaS5wYXJlbkNvbW1hKSxyPVtdLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpZT1uW2ldLnJlcGxhY2UocWkudHJpbVBhcmVucywiJDEiKSxyLnB1c2goWWkubGluZXN0cmluZy5hcHBseSh0aGlzLFtlXSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcocil9LHBvbHlnb246ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlUG9seWdvbigpO2Zvcih2YXIgZSxuLHIsaSxvPXQudHJpbSgpLnNwbGl0KHFpLnBhcmVuQ29tbWEpLHM9W10sYT0wLHU9by5sZW5ndGg7YTx1OysrYSllPW9bYV0ucmVwbGFjZShxaS50cmltUGFyZW5zLCIkMSIpLG49WWkubGluZXN0cmluZy5hcHBseSh0aGlzLFtlXSkscj10aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKG4uX3BvaW50cyksMD09PWE/aT1yOnMucHVzaChyKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlUG9seWdvbihpLHMpfSxtdWx0aXBvbHlnb246ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTXVsdGlQb2x5Z29uKCk7Zm9yKHZhciBlLG49dC50cmltKCkuc3BsaXQocWkuZG91YmxlUGFyZW5Db21tYSkscj1bXSxpPTAsbz1uLmxlbmd0aDtpPG87KytpKWU9bltpXS5yZXBsYWNlKHFpLnRyaW1QYXJlbnMsIiQxIiksci5wdXNoKFlpLnBvbHlnb24uYXBwbHkodGhpcyxbZV0pKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTXVsdGlQb2x5Z29uKHIpfSxnZW9tZXRyeWNvbGxlY3Rpb246ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKCk7Zm9yKHZhciBlPSh0PXQucmVwbGFjZSgvLFxzKihbQS1aYS16XSkvZywifCQxIikpLnRyaW0oKS5zcGxpdCgifCIpLG49W10scj0wLGk9ZS5sZW5ndGg7cjxpOysrciluLnB1c2godGhpcy5yZWFkKGVbcl0pKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKG4pfX0sWGk9ZnVuY3Rpb24odCl7dGhpcy5wYXJzZXI9bmV3IFZpKHQpfTtYaS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucGFyc2VyLndyaXRlKHQpfSxYaS50b0xpbmVTdHJpbmc9ZnVuY3Rpb24odCxlKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpO3JldHVybiJMSU5FU1RSSU5HICggIit0LngrIiAiK3QueSsiLCAiK2UueCsiICIrZS55KyIgKSJ9O3ZhciBXaT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzLGUpLHRoaXMubmFtZT0iUnVudGltZUV4Y2VwdGlvbiIsdGhpcy5tZXNzYWdlPWUsdGhpcy5zdGFjaz0obmV3IHQpLnN0YWNrfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlfShFcnJvciksSGk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe2lmKHQuY2FsbCh0aGlzKSwwPT09YXJndW1lbnRzLmxlbmd0aCl0LmNhbGwodGhpcyk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3QuY2FsbCh0aGlzLGUpfX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oV2kpLFppPWZ1bmN0aW9uKCl7fTtaaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWmkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFppfSxaaS5zaG91bGROZXZlclJlYWNoSGVyZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKVppLnNob3VsZE5ldmVyUmVhY2hIZXJlKG51bGwpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aHJvdyBuZXcgSGkoIlNob3VsZCBuZXZlciByZWFjaCBoZXJlIisobnVsbCE9PXQ/IjogIit0OiIiKSl9fSxaaS5pc1RydWU9ZnVuY3Rpb24oKXt2YXIgdDtpZigxPT09YXJndW1lbnRzLmxlbmd0aClaaS5pc1RydWUoYXJndW1lbnRzWzBdLG51bGwpO2Vsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgmJih0PWFyZ3VtZW50c1sxXSwhYXJndW1lbnRzWzBdKSl0aHJvdyBudWxsPT09dD9uZXcgSGk6bmV3IEhpKHQpfSxaaS5lcXVhbHM9ZnVuY3Rpb24oKXt2YXIgdCxlLG47aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpWmkuZXF1YWxzKHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG51bGwpO2Vsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgmJih0PWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1syXSwhKGU9YXJndW1lbnRzWzFdKS5lcXVhbHModCkpKXRocm93IG5ldyBIaSgiRXhwZWN0ZWQgIit0KyIgYnV0IGVuY291bnRlcmVkICIrZSsobnVsbCE9PW4/IjogIituOiIiKSl9O3ZhciBLaT1mdW5jdGlvbigpe3RoaXMuX3Jlc3VsdD1udWxsLHRoaXMuX2lucHV0TGluZXM9QXJyYXkoMikuZmlsbCgpLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkoMil9KSksdGhpcy5faW50UHQ9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5faW50TGluZUluZGV4PW51bGwsdGhpcy5faXNQcm9wZXI9bnVsbCx0aGlzLl9wYT1udWxsLHRoaXMuX3BiPW51bGwsdGhpcy5fcHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl9pbnRQdFswXT1uZXcgdmksdGhpcy5faW50UHRbMV09bmV3IHZpLHRoaXMuX3BhPXRoaXMuX2ludFB0WzBdLHRoaXMuX3BiPXRoaXMuX2ludFB0WzFdLHRoaXMuX3Jlc3VsdD0wfSxKaT17RE9OVF9JTlRFUlNFQ1Q6e2NvbmZpZ3VyYWJsZTohMH0sRE9fSU5URVJTRUNUOntjb25maWd1cmFibGU6ITB9LENPTExJTkVBUjp7Y29uZmlndXJhYmxlOiEwfSxOT19JTlRFUlNFQ1RJT046e2NvbmZpZ3VyYWJsZTohMH0sUE9JTlRfSU5URVJTRUNUSU9OOntjb25maWd1cmFibGU6ITB9LENPTExJTkVBUl9JTlRFUlNFQ1RJT046e2NvbmZpZ3VyYWJsZTohMH19O0tpLnByb3RvdHlwZS5nZXRJbmRleEFsb25nU2VnbWVudD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvbXB1dGVJbnRMaW5lSW5kZXgoKSx0aGlzLl9pbnRMaW5lSW5kZXhbdF1bZV19LEtpLnByb3RvdHlwZS5nZXRUb3BvbG9neVN1bW1hcnk9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQWk7cmV0dXJuIHRoaXMuaXNFbmRQb2ludCgpJiZ0LmFwcGVuZCgiIGVuZHBvaW50IiksdGhpcy5faXNQcm9wZXImJnQuYXBwZW5kKCIgcHJvcGVyIiksdGhpcy5pc0NvbGxpbmVhcigpJiZ0LmFwcGVuZCgiIGNvbGxpbmVhciIpLHQudG9TdHJpbmcoKX0sS2kucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7dGhpcy5faW5wdXRMaW5lc1swXVswXT10LHRoaXMuX2lucHV0TGluZXNbMF1bMV09ZSx0aGlzLl9pbnB1dExpbmVzWzFdWzBdPW4sdGhpcy5faW5wdXRMaW5lc1sxXVsxXT1yLHRoaXMuX3Jlc3VsdD10aGlzLmNvbXB1dGVJbnRlcnNlY3QodCxlLG4scil9LEtpLnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb25OdW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzdWx0fSxLaS5wcm90b3R5cGUuY29tcHV0ZUludExpbmVJbmRleD1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKW51bGw9PT10aGlzLl9pbnRMaW5lSW5kZXgmJih0aGlzLl9pbnRMaW5lSW5kZXg9QXJyYXkoMikuZmlsbCgpLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkoMil9KSksdGhpcy5jb21wdXRlSW50TGluZUluZGV4KDApLHRoaXMuY29tcHV0ZUludExpbmVJbmRleCgxKSk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuZ2V0RWRnZURpc3RhbmNlKHQsMCk+dGhpcy5nZXRFZGdlRGlzdGFuY2UodCwxKT8odGhpcy5faW50TGluZUluZGV4W3RdWzBdPTAsdGhpcy5faW50TGluZUluZGV4W3RdWzFdPTEpOih0aGlzLl9pbnRMaW5lSW5kZXhbdF1bMF09MSx0aGlzLl9pbnRMaW5lSW5kZXhbdF1bMV09MCl9fSxLaS5wcm90b3R5cGUuaXNQcm9wZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNJbnRlcnNlY3Rpb24oKSYmdGhpcy5faXNQcm9wZXJ9LEtpLnByb3RvdHlwZS5zZXRQcmVjaXNpb25Nb2RlbD1mdW5jdGlvbih0KXt0aGlzLl9wcmVjaXNpb25Nb2RlbD10fSxLaS5wcm90b3R5cGUuaXNJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuISghdGhpcy5pc0ludGVyaW9ySW50ZXJzZWN0aW9uKDApJiYhdGhpcy5pc0ludGVyaW9ySW50ZXJzZWN0aW9uKDEpKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPTA7bjx0aGlzLl9yZXN1bHQ7bisrKWlmKCF0Ll9pbnRQdFtuXS5lcXVhbHMyRCh0Ll9pbnB1dExpbmVzW2VdWzBdKSYmIXQuX2ludFB0W25dLmVxdWFsczJEKHQuX2lucHV0TGluZXNbZV1bMV0pKXJldHVybiEwO3JldHVybiExfX0sS2kucHJvdG90eXBlLmdldEludGVyc2VjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW50UHRbdF19LEtpLnByb3RvdHlwZS5pc0VuZFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFzSW50ZXJzZWN0aW9uKCkmJiF0aGlzLl9pc1Byb3Blcn0sS2kucHJvdG90eXBlLmhhc0ludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXN1bHQhPT1LaS5OT19JTlRFUlNFQ1RJT059LEtpLnByb3RvdHlwZS5nZXRFZGdlRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gS2kuY29tcHV0ZUVkZ2VEaXN0YW5jZSh0aGlzLl9pbnRQdFtlXSx0aGlzLl9pbnB1dExpbmVzW3RdWzBdLHRoaXMuX2lucHV0TGluZXNbdF1bMV0pfSxLaS5wcm90b3R5cGUuaXNDb2xsaW5lYXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzdWx0PT09S2kuQ09MTElORUFSX0lOVEVSU0VDVElPTn0sS2kucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFhpLnRvTGluZVN0cmluZyh0aGlzLl9pbnB1dExpbmVzWzBdWzBdLHRoaXMuX2lucHV0TGluZXNbMF1bMV0pKyIgLSAiK1hpLnRvTGluZVN0cmluZyh0aGlzLl9pbnB1dExpbmVzWzFdWzBdLHRoaXMuX2lucHV0TGluZXNbMV1bMV0pK3RoaXMuZ2V0VG9wb2xvZ3lTdW1tYXJ5KCl9LEtpLnByb3RvdHlwZS5nZXRFbmRwb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9pbnB1dExpbmVzW3RdW2VdfSxLaS5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9yZXN1bHQ7ZSsrKWlmKHRoaXMuX2ludFB0W2VdLmVxdWFsczJEKHQpKXJldHVybiEwO3JldHVybiExfSxLaS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0aW9uQWxvbmdTZWdtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29tcHV0ZUludExpbmVJbmRleCgpLHRoaXMuX2ludFB0W3RoaXMuX2ludExpbmVJbmRleFt0XVtlXV19LEtpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxLaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gS2l9LEtpLmNvbXB1dGVFZGdlRGlzdGFuY2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPU1hdGguYWJzKG4ueC1lLngpLGk9TWF0aC5hYnMobi55LWUueSksbz0tMTtpZih0LmVxdWFscyhlKSlvPTA7ZWxzZSBpZih0LmVxdWFscyhuKSlvPXI+aT9yOmk7ZWxzZXt2YXIgcz1NYXRoLmFicyh0LngtZS54KSxhPU1hdGguYWJzKHQueS1lLnkpOzA9PT0obz1yPmk/czphKSYmIXQuZXF1YWxzKGUpJiYobz1NYXRoLm1heChzLGEpKX1yZXR1cm4gWmkuaXNUcnVlKCEoMD09PW8mJiF0LmVxdWFscyhlKSksIkJhZCBkaXN0YW5jZSBjYWxjdWxhdGlvbiIpLG99LEtpLm5vblJvYnVzdENvbXB1dGVFZGdlRGlzdGFuY2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQueC1lLngsaT10LnktZS55LG89TWF0aC5zcXJ0KHIqcitpKmkpO3JldHVybiBaaS5pc1RydWUoISgwPT09byYmIXQuZXF1YWxzKGUpKSwiSW52YWxpZCBkaXN0YW5jZSBjYWxjdWxhdGlvbiIpLG99LEppLkRPTlRfSU5URVJTRUNULmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxKaS5ET19JTlRFUlNFQ1QuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LEppLkNPTExJTkVBUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sSmkuTk9fSU5URVJTRUNUSU9OLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxKaS5QT0lOVF9JTlRFUlNFQ1RJT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LEppLkNPTExJTkVBUl9JTlRFUlNFQ1RJT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEtpLEppKTt2YXIgUWk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pc0luU2VnbWVudEVudmVsb3Blcz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgamkodGhpcy5faW5wdXRMaW5lc1swXVswXSx0aGlzLl9pbnB1dExpbmVzWzBdWzFdKSxuPW5ldyBqaSh0aGlzLl9pbnB1dExpbmVzWzFdWzBdLHRoaXMuX2lucHV0TGluZXNbMV1bMV0pO3JldHVybiBlLmNvbnRhaW5zKHQpJiZuLmNvbnRhaW5zKHQpfSxlLnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7aWYoMyE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQucHJvdG90eXBlLmNvbXB1dGVJbnRlcnNlY3Rpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTtpZih0aGlzLl9pc1Byb3Blcj0hMSxqaS5pbnRlcnNlY3RzKG4scixlKSYmMD09PWVvLm9yaWVudGF0aW9uSW5kZXgobixyLGUpJiYwPT09ZW8ub3JpZW50YXRpb25JbmRleChyLG4sZSkpcmV0dXJuIHRoaXMuX2lzUHJvcGVyPSEwLChlLmVxdWFscyhuKXx8ZS5lcXVhbHMocikpJiYodGhpcy5faXNQcm9wZXI9ITEpLHRoaXMuX3Jlc3VsdD10LlBPSU5UX0lOVEVSU0VDVElPTixudWxsO3RoaXMuX3Jlc3VsdD10Lk5PX0lOVEVSU0VDVElPTn0sZS5wcm90b3R5cGUubm9ybWFsaXplVG9NaW5pbXVtPWZ1bmN0aW9uKHQsZSxuLHIsaSl7aS54PXRoaXMuc21hbGxlc3RJbkFic1ZhbHVlKHQueCxlLngsbi54LHIueCksaS55PXRoaXMuc21hbGxlc3RJbkFic1ZhbHVlKHQueSxlLnksbi55LHIueSksdC54LT1pLngsdC55LT1pLnksZS54LT1pLngsZS55LT1pLnksbi54LT1pLngsbi55LT1pLnksci54LT1pLngsci55LT1pLnl9LGUucHJvdG90eXBlLnNhZmVIQ29vcmRpbmF0ZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LG4scixpKXt2YXIgbz1udWxsO3RyeXtvPXppLmludGVyc2VjdGlvbih0LG4scixpKX1jYXRjaChzKXtpZighKHMgaW5zdGFuY2VvZiBCaSkpdGhyb3cgcztvPWUubmVhcmVzdEVuZHBvaW50KHQsbixyLGkpfXJldHVybiBvfSxlLnByb3RvdHlwZS5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxuLHIsaSl7dmFyIG89dGhpcy5pbnRlcnNlY3Rpb25XaXRoTm9ybWFsaXphdGlvbih0LG4scixpKTtyZXR1cm4gdGhpcy5pc0luU2VnbWVudEVudmVsb3BlcyhvKXx8KG89bmV3IHZpKGUubmVhcmVzdEVuZHBvaW50KHQsbixyLGkpKSksbnVsbCE9PXRoaXMuX3ByZWNpc2lvbk1vZGVsJiZ0aGlzLl9wcmVjaXNpb25Nb2RlbC5tYWtlUHJlY2lzZShvKSxvfSxlLnByb3RvdHlwZS5zbWFsbGVzdEluQWJzVmFsdWU9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dCxvPU1hdGguYWJzKGkpO3JldHVybiBNYXRoLmFicyhlKTxvJiYoaT1lLG89TWF0aC5hYnMoZSkpLE1hdGguYWJzKG4pPG8mJihpPW4sbz1NYXRoLmFicyhuKSksTWF0aC5hYnMocik8byYmKGk9ciksaX0sZS5wcm90b3R5cGUuY2hlY2tERD1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPVRpLmludGVyc2VjdGlvbih0LGUsbixyKSxzPXRoaXMuaXNJblNlZ21lbnRFbnZlbG9wZXMobyk7a2kub3V0LnByaW50bG4oIkREIGluIGVudiA9ICIrcysiICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIitvKSxpLmRpc3RhbmNlKG8pPjFlLTQmJmtpLm91dC5wcmludGxuKCJEaXN0YW5jZSA9ICIraS5kaXN0YW5jZShvKSl9LGUucHJvdG90eXBlLmludGVyc2VjdGlvbldpdGhOb3JtYWxpemF0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW5ldyB2aSh0KSxvPW5ldyB2aShlKSxzPW5ldyB2aShuKSxhPW5ldyB2aShyKSx1PW5ldyB2aTt0aGlzLm5vcm1hbGl6ZVRvRW52Q2VudHJlKGksbyxzLGEsdSk7dmFyIGM9dGhpcy5zYWZlSENvb3JkaW5hdGVJbnRlcnNlY3Rpb24oaSxvLHMsYSk7cmV0dXJuIGMueCs9dS54LGMueSs9dS55LGN9LGUucHJvdG90eXBlLmNvbXB1dGVDb2xsaW5lYXJJbnRlcnNlY3Rpb249ZnVuY3Rpb24oZSxuLHIsaSl7dmFyIG89amkuaW50ZXJzZWN0cyhlLG4scikscz1qaS5pbnRlcnNlY3RzKGUsbixpKSxhPWppLmludGVyc2VjdHMocixpLGUpLHU9amkuaW50ZXJzZWN0cyhyLGksbik7cmV0dXJuIG8mJnM/KHRoaXMuX2ludFB0WzBdPXIsdGhpcy5faW50UHRbMV09aSx0LkNPTExJTkVBUl9JTlRFUlNFQ1RJT04pOmEmJnU/KHRoaXMuX2ludFB0WzBdPWUsdGhpcy5faW50UHRbMV09bix0LkNPTExJTkVBUl9JTlRFUlNFQ1RJT04pOm8mJmE/KHRoaXMuX2ludFB0WzBdPXIsdGhpcy5faW50UHRbMV09ZSwhci5lcXVhbHMoZSl8fHN8fHU/dC5DT0xMSU5FQVJfSU5URVJTRUNUSU9OOnQuUE9JTlRfSU5URVJTRUNUSU9OKTpvJiZ1Pyh0aGlzLl9pbnRQdFswXT1yLHRoaXMuX2ludFB0WzFdPW4sIXIuZXF1YWxzKG4pfHxzfHxhP3QuQ09MTElORUFSX0lOVEVSU0VDVElPTjp0LlBPSU5UX0lOVEVSU0VDVElPTik6cyYmYT8odGhpcy5faW50UHRbMF09aSx0aGlzLl9pbnRQdFsxXT1lLCFpLmVxdWFscyhlKXx8b3x8dT90LkNPTExJTkVBUl9JTlRFUlNFQ1RJT046dC5QT0lOVF9JTlRFUlNFQ1RJT04pOnMmJnU/KHRoaXMuX2ludFB0WzBdPWksdGhpcy5faW50UHRbMV09biwhaS5lcXVhbHMobil8fG98fGE/dC5DT0xMSU5FQVJfSU5URVJTRUNUSU9OOnQuUE9JTlRfSU5URVJTRUNUSU9OKTp0Lk5PX0lOVEVSU0VDVElPTn0sZS5wcm90b3R5cGUubm9ybWFsaXplVG9FbnZDZW50cmU9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz10Lng8ZS54P3QueDplLngscz10Lnk8ZS55P3QueTplLnksYT10Lng+ZS54P3QueDplLngsdT10Lnk+ZS55P3QueTplLnksYz1uLng8ci54P24ueDpyLngsbD1uLnk8ci55P24ueTpyLnksaD1uLng+ci54P24ueDpyLngsZj1uLnk+ci55P24ueTpyLnkscD0oKG8+Yz9vOmMpKyhhPGg/YTpoKSkvMixkPSgocz5sP3M6bCkrKHU8Zj91OmYpKS8yO2kueD1wLGkueT1kLHQueC09aS54LHQueS09aS55LGUueC09aS54LGUueS09aS55LG4ueC09aS54LG4ueS09aS55LHIueC09aS54LHIueS09aS55fSxlLnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0PWZ1bmN0aW9uKGUsbixyLGkpe2lmKHRoaXMuX2lzUHJvcGVyPSExLCFqaS5pbnRlcnNlY3RzKGUsbixyLGkpKXJldHVybiB0Lk5PX0lOVEVSU0VDVElPTjt2YXIgbz1lby5vcmllbnRhdGlvbkluZGV4KGUsbixyKSxzPWVvLm9yaWVudGF0aW9uSW5kZXgoZSxuLGkpO2lmKG8+MCYmcz4wfHxvPDAmJnM8MClyZXR1cm4gdC5OT19JTlRFUlNFQ1RJT047dmFyIGE9ZW8ub3JpZW50YXRpb25JbmRleChyLGksZSksdT1lby5vcmllbnRhdGlvbkluZGV4KHIsaSxuKTtyZXR1cm4gYT4wJiZ1PjB8fGE8MCYmdTwwP3QuTk9fSU5URVJTRUNUSU9OOjA9PT1vJiYwPT09cyYmMD09PWEmJjA9PT11P3RoaXMuY29tcHV0ZUNvbGxpbmVhckludGVyc2VjdGlvbihlLG4scixpKTooMD09PW98fDA9PT1zfHwwPT09YXx8MD09PXU/KHRoaXMuX2lzUHJvcGVyPSExLGUuZXF1YWxzMkQocil8fGUuZXF1YWxzMkQoaSk/dGhpcy5faW50UHRbMF09ZTpuLmVxdWFsczJEKHIpfHxuLmVxdWFsczJEKGkpP3RoaXMuX2ludFB0WzBdPW46MD09PW8/dGhpcy5faW50UHRbMF09bmV3IHZpKHIpOjA9PT1zP3RoaXMuX2ludFB0WzBdPW5ldyB2aShpKTowPT09YT90aGlzLl9pbnRQdFswXT1uZXcgdmkoZSk6MD09PXUmJih0aGlzLl9pbnRQdFswXT1uZXcgdmkobikpKToodGhpcy5faXNQcm9wZXI9ITAsdGhpcy5faW50UHRbMF09dGhpcy5pbnRlcnNlY3Rpb24oZSxuLHIsaSkpLHQuUE9JTlRfSU5URVJTRUNUSU9OKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS5uZWFyZXN0RW5kcG9pbnQ9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dCxvPWVvLmRpc3RhbmNlUG9pbnRMaW5lKHQsbixyKSxzPWVvLmRpc3RhbmNlUG9pbnRMaW5lKGUsbixyKTtyZXR1cm4gczxvJiYobz1zLGk9ZSksKHM9ZW8uZGlzdGFuY2VQb2ludExpbmUobix0LGUpKTxvJiYobz1zLGk9biksKHM9ZW8uZGlzdGFuY2VQb2ludExpbmUocix0LGUpKTxvJiYobz1zLGk9ciksaX0sZX0oS2kpLCRpPWZ1bmN0aW9uKCl7fTskaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sJGkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuICRpfSwkaS5vcmllbnRhdGlvbkluZGV4PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLngtdC54LGk9ZS55LXQueSxvPW4ueC1lLngscz1uLnktZS55O3JldHVybiAkaS5zaWduT2ZEZXQyeDIocixpLG8scyl9LCRpLnNpZ25PZkRldDJ4Mj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1udWxsLG89bnVsbCxzPW51bGw7aWYoaT0xLDA9PT10fHwwPT09cilyZXR1cm4gMD09PWV8fDA9PT1uPzA6ZT4wP24+MD8taTppOm4+MD9pOi1pO2lmKDA9PT1lfHwwPT09bilyZXR1cm4gcj4wP3Q+MD9pOi1pOnQ+MD8taTppO2lmKGU+MD9yPjA/ZTw9cnx8KGk9LWksbz10LHQ9bixuPW8sbz1lLGU9cixyPW8pOmU8PS1yPyhpPS1pLG49LW4scj0tcik6KG89dCx0PS1uLG49byxvPWUsZT0tcixyPW8pOnI+MD8tZTw9cj8oaT0taSx0PS10LGU9LWUpOihvPS10LHQ9bixuPW8sbz0tZSxlPXIscj1vKTplPj1yPyh0PS10LGU9LWUsbj0tbixyPS1yKTooaT0taSxvPS10LHQ9LW4sbj1vLG89LWUsZT0tcixyPW8pLHQ+MCl7aWYoIShuPjApKXJldHVybiBpO2lmKCEodDw9bikpcmV0dXJuIGl9ZWxzZXtpZihuPjApcmV0dXJuLWk7aWYoISh0Pj1uKSlyZXR1cm4taTtpPS1pLHQ9LXQsbj0tbn1mb3IoOzspe2lmKChyLT0ocz1NYXRoLmZsb29yKG4vdCkpKmUpPDApcmV0dXJuLWk7aWYocj5lKXJldHVybiBpO2lmKHQ+KG4tPXMqdCkrbil7aWYoZTxyK3IpcmV0dXJuIGl9ZWxzZXtpZihlPnIrcilyZXR1cm4taTtuPXQtbixyPWUtcixpPS1pfWlmKDA9PT1yKXJldHVybiAwPT09bj8wOi1pO2lmKDA9PT1ufHwodC09KHM9TWF0aC5mbG9vcih0L24pKSpuLChlLT1zKnIpPDApKXJldHVybiBpO2lmKGU+cilyZXR1cm4taTtpZihuPnQrdCl7aWYocjxlK2UpcmV0dXJuLWl9ZWxzZXtpZihyPmUrZSlyZXR1cm4gaTt0PW4tdCxlPXItZSxpPS1pfWlmKDA9PT1lKXJldHVybiAwPT09dD8wOmk7aWYoMD09PXQpcmV0dXJuLWl9fTt2YXIgdG89ZnVuY3Rpb24oKXt0aGlzLl9wPW51bGwsdGhpcy5fY3Jvc3NpbmdDb3VudD0wLHRoaXMuX2lzUG9pbnRPblNlZ21lbnQ9ITE7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX3A9dH07dG8ucHJvdG90eXBlLmNvdW50U2VnbWVudD1mdW5jdGlvbih0LGUpe2lmKHQueDx0aGlzLl9wLngmJmUueDx0aGlzLl9wLngpcmV0dXJuIG51bGw7aWYodGhpcy5fcC54PT09ZS54JiZ0aGlzLl9wLnk9PT1lLnkpcmV0dXJuIHRoaXMuX2lzUG9pbnRPblNlZ21lbnQ9ITAsbnVsbDtpZih0Lnk9PT10aGlzLl9wLnkmJmUueT09PXRoaXMuX3AueSl7dmFyIG49dC54LHI9ZS54O3JldHVybiBuPnImJihuPWUueCxyPXQueCksdGhpcy5fcC54Pj1uJiZ0aGlzLl9wLng8PXImJih0aGlzLl9pc1BvaW50T25TZWdtZW50PSEwKSxudWxsfWlmKHQueT50aGlzLl9wLnkmJmUueTw9dGhpcy5fcC55fHxlLnk+dGhpcy5fcC55JiZ0Lnk8PXRoaXMuX3AueSl7dmFyIGk9dC54LXRoaXMuX3AueCxvPXQueS10aGlzLl9wLnkscz1lLngtdGhpcy5fcC54LGE9ZS55LXRoaXMuX3AueSx1PSRpLnNpZ25PZkRldDJ4MihpLG8scyxhKTtpZigwPT09dSlyZXR1cm4gdGhpcy5faXNQb2ludE9uU2VnbWVudD0hMCxudWxsO2E8byYmKHU9LXUpLHU+MCYmdGhpcy5fY3Jvc3NpbmdDb3VudCsrfX0sdG8ucHJvdG90eXBlLmlzUG9pbnRJblBvbHlnb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMb2NhdGlvbigpIT09YmkuRVhURVJJT1J9LHRvLnByb3RvdHlwZS5nZXRMb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1BvaW50T25TZWdtZW50P2JpLkJPVU5EQVJZOnRoaXMuX2Nyb3NzaW5nQ291bnQlMj09MT9iaS5JTlRFUklPUjpiaS5FWFRFUklPUn0sdG8ucHJvdG90eXBlLmlzT25TZWdtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzUG9pbnRPblNlZ21lbnR9LHRvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx0by5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdG99LHRvLmxvY2F0ZVBvaW50SW5SaW5nPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmRWkoYXJndW1lbnRzWzFdLExpKSl7Zm9yKHZhciB0PWFyZ3VtZW50c1sxXSxlPW5ldyB0byhhcmd1bWVudHNbMF0pLG49bmV3IHZpLHI9bmV3IHZpLGk9MTtpPHQuc2l6ZSgpO2krKylpZih0LmdldENvb3JkaW5hdGUoaSxuKSx0LmdldENvb3JkaW5hdGUoaS0xLHIpLGUuY291bnRTZWdtZW50KG4sciksZS5pc09uU2VnbWVudCgpKXJldHVybiBlLmdldExvY2F0aW9uKCk7cmV0dXJuIGUuZ2V0TG9jYXRpb24oKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIG89YXJndW1lbnRzWzFdLHM9bmV3IHRvKGFyZ3VtZW50c1swXSksYT0xO2E8by5sZW5ndGg7YSsrKXt2YXIgdT1vW2FdLGM9b1thLTFdO2lmKHMuY291bnRTZWdtZW50KHUsYykscy5pc09uU2VnbWVudCgpKXJldHVybiBzLmdldExvY2F0aW9uKCl9cmV0dXJuIHMuZ2V0TG9jYXRpb24oKX19O3ZhciBlbz1mdW5jdGlvbigpe30sbm89e0NMT0NLV0lTRTp7Y29uZmlndXJhYmxlOiEwfSxSSUdIVDp7Y29uZmlndXJhYmxlOiEwfSxDT1VOVEVSQ0xPQ0tXSVNFOntjb25maWd1cmFibGU6ITB9LExFRlQ6e2NvbmZpZ3VyYWJsZTohMH0sQ09MTElORUFSOntjb25maWd1cmFibGU6ITB9LFNUUkFJR0hUOntjb25maWd1cmFibGU6ITB9fTtlby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZW8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGVvfSxlby5vcmllbnRhdGlvbkluZGV4PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gVGkub3JpZW50YXRpb25JbmRleCh0LGUsbil9LGVvLnNpZ25lZEFyZWE9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXt2YXIgdD1hcmd1bWVudHNbMF07aWYodC5sZW5ndGg8MylyZXR1cm4gMDtmb3IodmFyIGU9MCxuPXRbMF0ueCxyPTE7cjx0Lmxlbmd0aC0xO3IrKyl7dmFyIGk9dFtyXS54LW4sbz10W3IrMV0ueTtlKz1pKih0W3ItMV0ueS1vKX1yZXR1cm4gZS8yfWlmKEVpKGFyZ3VtZW50c1swXSxMaSkpe3ZhciBzPWFyZ3VtZW50c1swXSxhPXMuc2l6ZSgpO2lmKGE8MylyZXR1cm4gMDt2YXIgdT1uZXcgdmksYz1uZXcgdmksbD1uZXcgdmk7cy5nZXRDb29yZGluYXRlKDAsYykscy5nZXRDb29yZGluYXRlKDEsbCk7dmFyIGg9Yy54O2wueC09aDtmb3IodmFyIGY9MCxwPTE7cDxhLTE7cCsrKXUueT1jLnksYy54PWwueCxjLnk9bC55LHMuZ2V0Q29vcmRpbmF0ZShwKzEsbCksbC54LT1oLGYrPWMueCoodS55LWwueSk7cmV0dXJuIGYvMn19LGVvLmRpc3RhbmNlTGluZUxpbmU9ZnVuY3Rpb24odCxlLG4scil7aWYodC5lcXVhbHMoZSkpcmV0dXJuIGVvLmRpc3RhbmNlUG9pbnRMaW5lKHQsbixyKTtpZihuLmVxdWFscyhyKSlyZXR1cm4gZW8uZGlzdGFuY2VQb2ludExpbmUocix0LGUpO3ZhciBpPSExO2lmKGppLmludGVyc2VjdHModCxlLG4scikpe3ZhciBvPShlLngtdC54KSooci55LW4ueSktKGUueS10LnkpKihyLngtbi54KTtpZigwPT09bylpPSEwO2Vsc2V7dmFyIHM9KHQueS1uLnkpKihyLngtbi54KS0odC54LW4ueCkqKHIueS1uLnkpLGE9KCh0Lnktbi55KSooZS54LXQueCktKHQueC1uLngpKihlLnktdC55KSkvbyx1PXMvbzsodTwwfHx1PjF8fGE8MHx8YT4xKSYmKGk9ITApfX1lbHNlIGk9ITA7cmV0dXJuIGk/Q2kubWluKGVvLmRpc3RhbmNlUG9pbnRMaW5lKHQsbixyKSxlby5kaXN0YW5jZVBvaW50TGluZShlLG4sciksZW8uZGlzdGFuY2VQb2ludExpbmUobix0LGUpLGVvLmRpc3RhbmNlUG9pbnRMaW5lKHIsdCxlKSk6MH0sZW8uaXNQb2ludEluUmluZz1mdW5jdGlvbih0LGUpe3JldHVybiBlby5sb2NhdGVQb2ludEluUmluZyh0LGUpIT09YmkuRVhURVJJT1J9LGVvLmNvbXB1dGVMZW5ndGg9ZnVuY3Rpb24odCl7dmFyIGU9dC5zaXplKCk7aWYoZTw9MSlyZXR1cm4gMDt2YXIgbj0wLHI9bmV3IHZpO3QuZ2V0Q29vcmRpbmF0ZSgwLHIpO2Zvcih2YXIgaT1yLngsbz1yLnkscz0xO3M8ZTtzKyspe3QuZ2V0Q29vcmRpbmF0ZShzLHIpO3ZhciBhPXIueCx1PXIueSxjPWEtaSxsPXUtbztuKz1NYXRoLnNxcnQoYypjK2wqbCksaT1hLG89dX1yZXR1cm4gbn0sZW8uaXNDQ1c9ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgtMTtpZihlPDMpdGhyb3cgbmV3IGhpO2Zvcih2YXIgbj10WzBdLHI9MCxpPTE7aTw9ZTtpKyspe3ZhciBvPXRbaV07by55Pm4ueSYmKG49byxyPWkpfXZhciBzPXI7ZG97KHMtPTEpPDAmJihzPWUpfXdoaWxlKHRbc10uZXF1YWxzMkQobikmJnMhPT1yKTt2YXIgYT1yO2Rve2E9KGErMSklZX13aGlsZSh0W2FdLmVxdWFsczJEKG4pJiZhIT09cik7dmFyIHU9dFtzXSxjPXRbYV07aWYodS5lcXVhbHMyRChuKXx8Yy5lcXVhbHMyRChuKXx8dS5lcXVhbHMyRChjKSlyZXR1cm4hMTt2YXIgbD1lby5jb21wdXRlT3JpZW50YXRpb24odSxuLGMpO3JldHVybiAwPT09bD91Lng+Yy54Omw+MH0sZW8ubG9jYXRlUG9pbnRJblJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdG8ubG9jYXRlUG9pbnRJblJpbmcodCxlKX0sZW8uZGlzdGFuY2VQb2ludExpbmVQZXJwZW5kaWN1bGFyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0obi54LWUueCkqKG4ueC1lLngpKyhuLnktZS55KSoobi55LWUueSksaT0oKGUueS10LnkpKihuLngtZS54KS0oZS54LXQueCkqKG4ueS1lLnkpKS9yO3JldHVybiBNYXRoLmFicyhpKSpNYXRoLnNxcnQocil9LGVvLmNvbXB1dGVPcmllbnRhdGlvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGVvLm9yaWVudGF0aW9uSW5kZXgodCxlLG4pfSxlby5kaXN0YW5jZVBvaW50TGluZT1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBoaTtmb3IodmFyIG49dC5kaXN0YW5jZShlWzBdKSxyPTA7cjxlLmxlbmd0aC0xO3IrKyl7dmFyIGk9ZW8uZGlzdGFuY2VQb2ludExpbmUodCxlW3JdLGVbcisxXSk7aTxuJiYobj1pKX1yZXR1cm4gbn1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdLGE9YXJndW1lbnRzWzJdO2lmKHMueD09PWEueCYmcy55PT09YS55KXJldHVybiBvLmRpc3RhbmNlKHMpO3ZhciB1PShhLngtcy54KSooYS54LXMueCkrKGEueS1zLnkpKihhLnktcy55KSxjPSgoby54LXMueCkqKGEueC1zLngpKyhvLnktcy55KSooYS55LXMueSkpL3U7aWYoYzw9MClyZXR1cm4gby5kaXN0YW5jZShzKTtpZihjPj0xKXJldHVybiBvLmRpc3RhbmNlKGEpO3ZhciBsPSgocy55LW8ueSkqKGEueC1zLngpLShzLngtby54KSooYS55LXMueSkpL3U7cmV0dXJuIE1hdGguYWJzKGwpKk1hdGguc3FydCh1KX19LGVvLmlzT25MaW5lPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyBRaSxyPTE7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbci0xXSxvPWVbcl07aWYobi5jb21wdXRlSW50ZXJzZWN0aW9uKHQsaSxvKSxuLmhhc0ludGVyc2VjdGlvbigpKXJldHVybiEwfXJldHVybiExfSxuby5DTE9DS1dJU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTF9LG5vLlJJR0hULmdldD1mdW5jdGlvbigpe3JldHVybiBlby5DTE9DS1dJU0V9LG5vLkNPVU5URVJDTE9DS1dJU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LG5vLkxFRlQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGVvLkNPVU5URVJDTE9DS1dJU0V9LG5vLkNPTExJTkVBUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbm8uU1RSQUlHSFQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGVvLkNPTExJTkVBUn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZW8sbm8pO3ZhciBybz1mdW5jdGlvbigpe307cm8ucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt9LHJvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxyby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcm99O3ZhciBpbz1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9lbnZlbG9wZT1udWxsLHRoaXMuX2ZhY3Rvcnk9bnVsbCx0aGlzLl9TUklEPW51bGwsdGhpcy5fdXNlckRhdGE9bnVsbCx0aGlzLl9mYWN0b3J5PXQsdGhpcy5fU1JJRD10LmdldFNSSUQoKX0sb289e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX1BPSU5UOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9NVUxUSVBPSU5UOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9MSU5FU1RSSU5HOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9MSU5FQVJSSU5HOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9NVUxUSUxJTkVTVFJJTkc6e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX1BPTFlHT046e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX01VTFRJUE9MWUdPTjp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfR0VPTUVUUllDT0xMRUNUSU9OOntjb25maWd1cmFibGU6ITB9LGdlb21ldHJ5Q2hhbmdlZEZpbHRlcjp7Y29uZmlndXJhYmxlOiEwfX07aW8ucHJvdG90eXBlLmlzR2VvbWV0cnlDb2xsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U29ydEluZGV4KCk9PT1pby5TT1JUSU5ERVhfR0VPTUVUUllDT0xMRUNUSU9OfSxpby5wcm90b3R5cGUuZ2V0RmFjdG9yeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mYWN0b3J5fSxpby5wcm90b3R5cGUuZ2V0R2VvbWV0cnlOPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzfSxpby5wcm90b3R5cGUuZ2V0QXJlYT1mdW5jdGlvbigpe3JldHVybiAwfSxpby5wcm90b3R5cGUuaXNSZWN0YW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0saW8ucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8pe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gbnVsbCE9PXQmJnRoaXMuZXF1YWxzVG9wbyh0KX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCl7dmFyIGU9YXJndW1lbnRzWzBdO2lmKCEoZSBpbnN0YW5jZW9mIGlvKSlyZXR1cm4hMTt2YXIgbj1lO3JldHVybiB0aGlzLmVxdWFsc0V4YWN0KG4pfX0saW8ucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzPT09dHx8dGhpcy5lcXVhbHNFeGFjdCh0LDApfSxpby5wcm90b3R5cGUuZ2VvbWV0cnlDaGFuZ2VkPWZ1bmN0aW9uKCl7dGhpcy5hcHBseShpby5nZW9tZXRyeUNoYW5nZWRGaWx0ZXIpfSxpby5wcm90b3R5cGUuZ2VvbWV0cnlDaGFuZ2VkQWN0aW9uPWZ1bmN0aW9uKCl7dGhpcy5fZW52ZWxvcGU9bnVsbH0saW8ucHJvdG90eXBlLmVxdWFsc05vcm09ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10JiZ0aGlzLm5vcm0oKS5lcXVhbHNFeGFjdCh0Lm5vcm0oKSl9LGlvLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gMH0saW8ucHJvdG90eXBlLmdldE51bUdlb21ldHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gMX0saW8ucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT10O3JldHVybiB0aGlzLmdldFNvcnRJbmRleCgpIT09ZS5nZXRTb3J0SW5kZXgoKT90aGlzLmdldFNvcnRJbmRleCgpLWUuZ2V0U29ydEluZGV4KCk6dGhpcy5pc0VtcHR5KCkmJmUuaXNFbXB0eSgpPzA6dGhpcy5pc0VtcHR5KCk/LTE6ZS5pc0VtcHR5KCk/MTp0aGlzLmNvbXBhcmVUb1NhbWVDbGFzcyh0KX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmdldFNvcnRJbmRleCgpIT09bi5nZXRTb3J0SW5kZXgoKT90aGlzLmdldFNvcnRJbmRleCgpLW4uZ2V0U29ydEluZGV4KCk6dGhpcy5pc0VtcHR5KCkmJm4uaXNFbXB0eSgpPzA6dGhpcy5pc0VtcHR5KCk/LTE6bi5pc0VtcHR5KCk/MTp0aGlzLmNvbXBhcmVUb1NhbWVDbGFzcyhuLHIpfX0saW8ucHJvdG90eXBlLmdldFVzZXJEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VzZXJEYXRhfSxpby5wcm90b3R5cGUuZ2V0U1JJRD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9TUklEfSxpby5wcm90b3R5cGUuZ2V0RW52ZWxvcGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkudG9HZW9tZXRyeSh0aGlzLmdldEVudmVsb3BlSW50ZXJuYWwoKSl9LGlvLnByb3RvdHlwZS5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbj1mdW5jdGlvbih0KXtpZih0LmdldFNvcnRJbmRleCgpPT09aW8uU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTil0aHJvdyBuZXcgaGl9LGlvLnByb3RvdHlwZS5lcXVhbD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIDA9PT1uP3QuZXF1YWxzKGUpOnQuZGlzdGFuY2UoZSk8PW59LGlvLnByb3RvdHlwZS5ub3JtPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb3B5KCk7cmV0dXJuIHQubm9ybWFsaXplKCksdH0saW8ucHJvdG90eXBlLmdldFByZWNpc2lvbk1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZhY3RvcnkuZ2V0UHJlY2lzaW9uTW9kZWwoKX0saW8ucHJvdG90eXBlLmdldEVudmVsb3BlSW50ZXJuYWw9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuX2VudmVsb3BlJiYodGhpcy5fZW52ZWxvcGU9dGhpcy5jb21wdXRlRW52ZWxvcGVJbnRlcm5hbCgpKSxuZXcgamkodGhpcy5fZW52ZWxvcGUpfSxpby5wcm90b3R5cGUuc2V0U1JJRD1mdW5jdGlvbih0KXt0aGlzLl9TUklEPXR9LGlvLnByb3RvdHlwZS5zZXRVc2VyRGF0YT1mdW5jdGlvbih0KXt0aGlzLl91c2VyRGF0YT10fSxpby5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lml0ZXJhdG9yKCkscj1lLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCkmJnIuaGFzTmV4dCgpOyl7dmFyIGk9bi5uZXh0KCksbz1yLm5leHQoKSxzPWkuY29tcGFyZVRvKG8pO2lmKDAhPT1zKXJldHVybiBzfXJldHVybiBuLmhhc05leHQoKT8xOnIuaGFzTmV4dCgpPy0xOjB9LGlvLnByb3RvdHlwZS5oYXNoQ29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEVudmVsb3BlSW50ZXJuYWwoKS5oYXNoQ29kZSgpfSxpby5wcm90b3R5cGUuaXNHZW9tZXRyeUNvbGxlY3Rpb25PckRlcml2ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRTb3J0SW5kZXgoKT09PWlvLlNPUlRJTkRFWF9HRU9NRVRSWUNPTExFQ1RJT058fHRoaXMuZ2V0U29ydEluZGV4KCk9PT1pby5TT1JUSU5ERVhfTVVMVElQT0lOVHx8dGhpcy5nZXRTb3J0SW5kZXgoKT09PWlvLlNPUlRJTkRFWF9NVUxUSUxJTkVTVFJJTkd8fHRoaXMuZ2V0U29ydEluZGV4KCk9PT1pby5TT1JUSU5ERVhfTVVMVElQT0xZR09OfSxpby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZ2ksZGksbWldfSxpby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaW99LGlvLmhhc05vbkVtcHR5RWxlbWVudHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYoIXRbZV0uaXNFbXB0eSgpKXJldHVybiEwO3JldHVybiExfSxpby5oYXNOdWxsRWxlbWVudHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYobnVsbD09PXRbZV0pcmV0dXJuITA7cmV0dXJuITF9LG9vLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4Nzk5ZWE0NjUyMjg1NGMwMH0sb28uU09SVElOREVYX1BPSU5ULmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxvby5TT1JUSU5ERVhfTVVMVElQT0lOVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sb28uU09SVElOREVYX0xJTkVTVFJJTkcuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LG9vLlNPUlRJTkRFWF9MSU5FQVJSSU5HLmdldD1mdW5jdGlvbigpe3JldHVybiAzfSxvby5TT1JUSU5ERVhfTVVMVElMSU5FU1RSSU5HLmdldD1mdW5jdGlvbigpe3JldHVybiA0fSxvby5TT1JUSU5ERVhfUE9MWUdPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gNX0sb28uU09SVElOREVYX01VTFRJUE9MWUdPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gNn0sb28uU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gN30sb28uZ2VvbWV0cnlDaGFuZ2VkRmlsdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBzb30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaW8sb28pO3ZhciBzbz1mdW5jdGlvbigpe307c28uaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bcm9dfSxzby5maWx0ZXI9ZnVuY3Rpb24odCl7dC5nZW9tZXRyeUNoYW5nZWRBY3Rpb24oKX07dmFyIGFvPWZ1bmN0aW9uKCl7fTthby5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe30sYW8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGFvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBhb307dmFyIHVvPWZ1bmN0aW9uKCl7fSxjbz17TW9kMkJvdW5kYXJ5Tm9kZVJ1bGU6e2NvbmZpZ3VyYWJsZTohMH0sRW5kUG9pbnRCb3VuZGFyeU5vZGVSdWxlOntjb25maWd1cmFibGU6ITB9LE11bHRpVmFsZW50RW5kUG9pbnRCb3VuZGFyeU5vZGVSdWxlOntjb25maWd1cmFibGU6ITB9LE1vbm9WYWxlbnRFbmRQb2ludEJvdW5kYXJ5Tm9kZVJ1bGU6e2NvbmZpZ3VyYWJsZTohMH0sTU9EMl9CT1VOREFSWV9SVUxFOntjb25maWd1cmFibGU6ITB9LEVORFBPSU5UX0JPVU5EQVJZX1JVTEU6e2NvbmZpZ3VyYWJsZTohMH0sTVVMVElWQUxFTlRfRU5EUE9JTlRfQk9VTkRBUllfUlVMRTp7Y29uZmlndXJhYmxlOiEwfSxNT05PVkFMRU5UX0VORFBPSU5UX0JPVU5EQVJZX1JVTEU6e2NvbmZpZ3VyYWJsZTohMH0sT0dDX1NGU19CT1VOREFSWV9SVUxFOntjb25maWd1cmFibGU6ITB9fTt1by5wcm90b3R5cGUuaXNJbkJvdW5kYXJ5PWZ1bmN0aW9uKHQpe30sdW8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHVvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB1b30sY28uTW9kMkJvdW5kYXJ5Tm9kZVJ1bGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGxvfSxjby5FbmRQb2ludEJvdW5kYXJ5Tm9kZVJ1bGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGhvfSxjby5NdWx0aVZhbGVudEVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZm99LGNvLk1vbm9WYWxlbnRFbmRQb2ludEJvdW5kYXJ5Tm9kZVJ1bGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHBvfSxjby5NT0QyX0JPVU5EQVJZX1JVTEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBsb30sY28uRU5EUE9JTlRfQk9VTkRBUllfUlVMRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGhvfSxjby5NVUxUSVZBTEVOVF9FTkRQT0lOVF9CT1VOREFSWV9SVUxFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgZm99LGNvLk1PTk9WQUxFTlRfRU5EUE9JTlRfQk9VTkRBUllfUlVMRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHBvfSxjby5PR0NfU0ZTX0JPVU5EQVJZX1JVTEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHVvLk1PRDJfQk9VTkRBUllfUlVMRX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXModW8sY28pO3ZhciBsbz1mdW5jdGlvbigpe307bG8ucHJvdG90eXBlLmlzSW5Cb3VuZGFyeT1mdW5jdGlvbih0KXtyZXR1cm4gdCUyPT0xfSxsby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdW9dfSxsby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbG99O3ZhciBobz1mdW5jdGlvbigpe307aG8ucHJvdG90eXBlLmlzSW5Cb3VuZGFyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD4wfSxoby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdW9dfSxoby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaG99O3ZhciBmbz1mdW5jdGlvbigpe307Zm8ucHJvdG90eXBlLmlzSW5Cb3VuZGFyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD4xfSxmby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdW9dfSxmby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZm99O3ZhciBwbz1mdW5jdGlvbigpe307cG8ucHJvdG90eXBlLmlzSW5Cb3VuZGFyeT1mdW5jdGlvbih0KXtyZXR1cm4gMT09PXR9LHBvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt1b119LHBvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBwb307dmFyIGdvPWZ1bmN0aW9uKCl7fTtnby5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7fSxnby5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKCl7fSxnby5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe30sZ28ucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7fSxnby5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe30sZ28ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXt9LGdvLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt9O3ZhciB5bz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLm1lc3NhZ2U9ZXx8IiJ9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e25hbWU6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBuLm5hbWUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24ifSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KEVycm9yKSxtbz1mdW5jdGlvbigpe307bW8ucHJvdG90eXBlLmhhc05leHQ9ZnVuY3Rpb24oKXt9LG1vLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7fSxtby5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7fTt2YXIgdm89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLnNldD1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe30sZX0oZ28pO2Z1bmN0aW9uIF9vKHQpe3RoaXMubWVzc2FnZT10fHwiIn1fby5wcm90b3R5cGU9bmV3IEVycm9yLF9vLnByb3RvdHlwZS5uYW1lPSJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIjt2YXIgeG89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLmFycmF5Xz1bXSxhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGdvJiZ0aGlzLmFkZEFsbChhcmd1bWVudHNbMF0pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5lbnN1cmVDYXBhY2l0eT1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdCxnb119LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5hcnJheV8ucHVzaCh0KTp0aGlzLmFycmF5Xy5zcGxpY2UoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSksITB9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5hcnJheV89W119LGUucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl0aGlzLmFkZChlLm5leHQoKSk7cmV0dXJuITB9LGUucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuYXJyYXlfW3RdO3JldHVybiB0aGlzLmFycmF5X1t0XT1lLG59LGUucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB3byh0aGlzKX0sZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2lmKHQ8MHx8dD49dGhpcy5zaXplKCkpdGhyb3cgbmV3IHlvO3JldHVybiB0aGlzLmFycmF5X1t0XX0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5hcnJheV8ubGVuZ3RofSxlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLmxlbmd0aH0sZS5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl0LnB1c2godGhpcy5hcnJheV9bZV0pO3JldHVybiB0fSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSExLG49MCxyPXRoaXMuYXJyYXlfLmxlbmd0aDtuPHI7bisrKWlmKHRoaXMuYXJyYXlfW25dPT09dCl7dGhpcy5hcnJheV8uc3BsaWNlKG4sMSksZT0hMDticmVha31yZXR1cm4gZX0sZX0odm8pLHdvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpLHRoaXMuYXJyYXlMaXN0Xz1lLHRoaXMucG9zaXRpb25fPTB9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvc2l0aW9uXz09PXRoaXMuYXJyYXlMaXN0Xy5zaXplKCkpdGhyb3cgbmV3IF9vO3JldHVybiB0aGlzLmFycmF5TGlzdF8uZ2V0KHRoaXMucG9zaXRpb25fKyspfSxlLnByb3RvdHlwZS5oYXNOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb25fPHRoaXMuYXJyYXlMaXN0Xy5zaXplKCl9LGUucHJvdG90eXBlLnNldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hcnJheUxpc3RfLnNldCh0aGlzLnBvc2l0aW9uXy0xLHQpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLmFycmF5TGlzdF8ucmVtb3ZlKHRoaXMuYXJyYXlMaXN0Xy5nZXQodGhpcy5wb3NpdGlvbl8pKX0sZX0obW8pLGJvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtpZih0LmNhbGwodGhpcyksMCE9PWFyZ3VtZW50cy5sZW5ndGgpaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmVuc3VyZUNhcGFjaXR5KGUubGVuZ3RoKSx0aGlzLmFkZChlLCEwKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5lbnN1cmVDYXBhY2l0eShuLmxlbmd0aCksdGhpcy5hZGQobixyKX19dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e2Nvb3JkQXJyYXlUeXBlOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gbi5jb29yZEFycmF5VHlwZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFycmF5KDApLmZpbGwobnVsbCl9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0KHQpfSxlLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1sxXSxuPSExLHI9YXJndW1lbnRzWzBdLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXRoaXMuYWRkKHIubmV4dCgpLGUpLG49ITA7cmV0dXJuIG59cmV0dXJuIHQucHJvdG90eXBlLmFkZEFsbC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXQucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyksbj0wO248dGhpcy5zaXplKCk7bisrKWUuYWRkKG4sdGhpcy5nZXQobikuY29weSgpKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUudG9Db29yZGluYXRlQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b0FycmF5KGUuY29vcmRBcnJheVR5cGUpfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF07dC5wcm90b3R5cGUuYWRkLmNhbGwodGhpcyxuKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5hZGQocixpLCEwKSwhMH1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBvPWFyZ3VtZW50c1swXTtpZighYXJndW1lbnRzWzFdJiZ0aGlzLnNpemUoKT49MSlpZih0aGlzLmdldCh0aGlzLnNpemUoKS0xKS5lcXVhbHMyRChvKSlyZXR1cm4gbnVsbDt0LnByb3RvdHlwZS5hZGQuY2FsbCh0aGlzLG8pfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPYmplY3QmJiJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmFkZChzLGEpLCEwfX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMl0mJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJiJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIHU9YXJndW1lbnRzWzBdLGM9YXJndW1lbnRzWzFdO2lmKGFyZ3VtZW50c1syXSlmb3IodmFyIGw9MDtsPHUubGVuZ3RoO2wrKyllLmFkZCh1W2xdLGMpO2Vsc2UgZm9yKHZhciBoPXUubGVuZ3RoLTE7aD49MDtoLS0pZS5hZGQodVtoXSxjKTtyZXR1cm4hMH1pZigiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMl0mJk51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIGY9YXJndW1lbnRzWzBdLHA9YXJndW1lbnRzWzFdO2lmKCFhcmd1bWVudHNbMl0pe3ZhciBkPXRoaXMuc2l6ZSgpO2lmKGQ+MCl7aWYoZj4wKWlmKHRoaXMuZ2V0KGYtMSkuZXF1YWxzMkQocCkpcmV0dXJuIG51bGw7aWYoZjxkKWlmKHRoaXMuZ2V0KGYpLmVxdWFsczJEKHApKXJldHVybiBudWxsfX10LnByb3RvdHlwZS5hZGQuY2FsbCh0aGlzLGYscCl9fWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBnPWFyZ3VtZW50c1swXSx5PWFyZ3VtZW50c1sxXSxtPWFyZ3VtZW50c1syXSx2PWFyZ3VtZW50c1szXSxfPTE7bT52JiYoXz0tMSk7Zm9yKHZhciB4PW07eCE9PXY7eCs9XyllLmFkZChnW3hdLHkpO3JldHVybiEwfX0sZS5wcm90b3R5cGUuY2xvc2VSaW5nPWZ1bmN0aW9uKCl7dGhpcy5zaXplKCk+MCYmdGhpcy5hZGQobmV3IHZpKHRoaXMuZ2V0KDApKSwhMSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oeG8pLERvPWZ1bmN0aW9uKCl7fSxFbz17Rm9yd2FyZENvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0sQmlkaXJlY3Rpb25hbENvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0sY29vcmRBcnJheVR5cGU6e2NvbmZpZ3VyYWJsZTohMH19O0VvLkZvcndhcmRDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiBDb30sRW8uQmlkaXJlY3Rpb25hbENvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFNvfSxFby5jb29yZEFycmF5VHlwZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFycmF5KDApLmZpbGwobnVsbCl9LERvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxEby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRG99LERvLmlzUmluZz1mdW5jdGlvbih0KXtyZXR1cm4hKHQubGVuZ3RoPDR8fCF0WzBdLmVxdWFsczJEKHRbdC5sZW5ndGgtMV0pKX0sRG8ucHROb3RJbkxpc3Q9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtpZihEby5pbmRleE9mKHIsZSk8MClyZXR1cm4gcn1yZXR1cm4gbnVsbH0sRG8uc2Nyb2xsPWZ1bmN0aW9uKHQsZSl7dmFyIG49RG8uaW5kZXhPZihlLHQpO2lmKG48MClyZXR1cm4gbnVsbDt2YXIgcj1uZXcgQXJyYXkodC5sZW5ndGgpLmZpbGwobnVsbCk7a2kuYXJyYXljb3B5KHQsbixyLDAsdC5sZW5ndGgtbiksa2kuYXJyYXljb3B5KHQsMCxyLHQubGVuZ3RoLW4sbiksa2kuYXJyYXljb3B5KHIsMCx0LDAsdC5sZW5ndGgpfSxEby5lcXVhbHM9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO2lmKHQ9PT1lKXJldHVybiEwO2lmKG51bGw9PT10fHxudWxsPT09ZXx8dC5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZighdFtuXS5lcXVhbHMoZVtuXSkpcmV0dXJuITE7cmV0dXJuITB9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXTtpZihyPT09aSlyZXR1cm4hMDtpZihudWxsPT09cnx8bnVsbD09PWl8fHIubGVuZ3RoIT09aS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBzPTA7czxyLmxlbmd0aDtzKyspaWYoMCE9PW8uY29tcGFyZShyW3NdLGlbc10pKXJldHVybiExO3JldHVybiEwfX0sRG8uaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyBibyxyPTA7cjx0Lmxlbmd0aDtyKyspZS5pbnRlcnNlY3RzKHRbcl0pJiZuLmFkZCh0W3JdLCEwKTtyZXR1cm4gbi50b0Nvb3JkaW5hdGVBcnJheSgpfSxEby5oYXNSZXBlYXRlZFBvaW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPHQubGVuZ3RoO2UrKylpZih0W2UtMV0uZXF1YWxzKHRbZV0pKXJldHVybiEwO3JldHVybiExfSxEby5yZW1vdmVSZXBlYXRlZFBvaW50cz1mdW5jdGlvbih0KXtyZXR1cm4gRG8uaGFzUmVwZWF0ZWRQb2ludHModCk/bmV3IGJvKHQsITEpLnRvQ29vcmRpbmF0ZUFycmF5KCk6dH0sRG8ucmV2ZXJzZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGgtMSxuPU1hdGgudHJ1bmMoZS8yKSxyPTA7cjw9bjtyKyspe3ZhciBpPXRbcl07dFtyXT10W2Utcl0sdFtlLXJdPWl9fSxEby5yZW1vdmVOdWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49MDtuPHQubGVuZ3RoO24rKyludWxsIT09dFtuXSYmZSsrO3ZhciByPW5ldyBBcnJheShlKS5maWxsKG51bGwpO2lmKDA9PT1lKXJldHVybiByO2Zvcih2YXIgaT0wLG89MDtvPHQubGVuZ3RoO28rKyludWxsIT09dFtvXSYmKHJbaSsrXT10W29dKTtyZXR1cm4gcn0sRG8uY29weURlZXA9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciB0PWFyZ3VtZW50c1swXSxlPW5ldyBBcnJheSh0Lmxlbmd0aCkuZmlsbChudWxsKSxuPTA7bjx0Lmxlbmd0aDtuKyspZVtuXT1uZXcgdmkodFtuXSk7cmV0dXJuIGV9aWYoNT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXSxzPWFyZ3VtZW50c1szXSxhPWFyZ3VtZW50c1s0XSx1PTA7dTxhO3UrKylvW3MrdV09bmV3IHZpKHJbaSt1XSl9LERvLmlzRXF1YWxSZXZlcnNlZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dLGk9ZVt0Lmxlbmd0aC1uLTFdO2lmKDAhPT1yLmNvbXBhcmVUbyhpKSlyZXR1cm4hMX1yZXR1cm4hMH0sRG8uZW52ZWxvcGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBqaSxuPTA7bjx0Lmxlbmd0aDtuKyspZS5leHBhbmRUb0luY2x1ZGUodFtuXSk7cmV0dXJuIGV9LERvLnRvQ29vcmRpbmF0ZUFycmF5PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRvQXJyYXkoRG8uY29vcmRBcnJheVR5cGUpfSxEby5hdExlYXN0TkNvb3JkaW5hdGVzT3JOb3RoaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUubGVuZ3RoPj10P2U6W119LERvLmluZGV4T2Y9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZih0LmVxdWFscyhlW25dKSlyZXR1cm4gbjtyZXR1cm4tMX0sRG8uaW5jcmVhc2luZ0RpcmVjdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPE1hdGgudHJ1bmModC5sZW5ndGgvMik7ZSsrKXt2YXIgbj10Lmxlbmd0aC0xLWUscj10W2VdLmNvbXBhcmVUbyh0W25dKTtpZigwIT09cilyZXR1cm4gcn1yZXR1cm4gMX0sRG8uY29tcGFyZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGgmJm48ZS5sZW5ndGg7KXt2YXIgcj10W25dLmNvbXBhcmVUbyhlW25dKTtpZigwIT09cilyZXR1cm4gcjtuKyt9cmV0dXJuIG48ZS5sZW5ndGg/LTE6bjx0Lmxlbmd0aD8xOjB9LERvLm1pbkNvb3JkaW5hdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW51bGwsbj0wO248dC5sZW5ndGg7bisrKShudWxsPT09ZXx8ZS5jb21wYXJlVG8odFtuXSk+MCkmJihlPXRbbl0pO3JldHVybiBlfSxEby5leHRyYWN0PWZ1bmN0aW9uKHQsZSxuKXtlPUNpLmNsYW1wKGUsMCx0Lmxlbmd0aCk7dmFyIHI9KG49Q2kuY2xhbXAobiwtMSx0Lmxlbmd0aCkpLWUrMTtuPDAmJihyPTApLGU+PXQubGVuZ3RoJiYocj0wKSxuPGUmJihyPTApO3ZhciBpPW5ldyBBcnJheShyKS5maWxsKG51bGwpO2lmKDA9PT1yKXJldHVybiBpO2Zvcih2YXIgbz0wLHM9ZTtzPD1uO3MrKylpW28rK109dFtzXTtyZXR1cm4gaX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRG8sRW8pO3ZhciBDbz1mdW5jdGlvbigpe307Q28ucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gRG8uY29tcGFyZSh0LGUpfSxDby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5beWldfSxDby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQ299O3ZhciBTbz1mdW5jdGlvbigpe307U28ucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LHI9ZTtpZihuLmxlbmd0aDxyLmxlbmd0aClyZXR1cm4tMTtpZihuLmxlbmd0aD5yLmxlbmd0aClyZXR1cm4gMTtpZigwPT09bi5sZW5ndGgpcmV0dXJuIDA7dmFyIGk9RG8uY29tcGFyZShuLHIpO3JldHVybiBEby5pc0VxdWFsUmV2ZXJzZWQobixyKT8wOml9LFNvLnByb3RvdHlwZS5PTERjb21wYXJlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dCxyPWU7aWYobi5sZW5ndGg8ci5sZW5ndGgpcmV0dXJuLTE7aWYobi5sZW5ndGg+ci5sZW5ndGgpcmV0dXJuIDE7aWYoMD09PW4ubGVuZ3RoKXJldHVybiAwO2Zvcih2YXIgaT1Eby5pbmNyZWFzaW5nRGlyZWN0aW9uKG4pLG89RG8uaW5jcmVhc2luZ0RpcmVjdGlvbihyKSxzPWk+MD8wOm4ubGVuZ3RoLTEsYT1vPjA/MDpuLmxlbmd0aC0xLHU9MDt1PG4ubGVuZ3RoO3UrKyl7dmFyIGM9bltzXS5jb21wYXJlVG8oclthXSk7aWYoMCE9PWMpcmV0dXJuIGM7cys9aSxhKz1vfXJldHVybiAwfSxTby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5beWldfSxTby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gU299O3ZhciBBbz1mdW5jdGlvbigpe307QW8ucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe30sQW8ucHJvdG90eXBlLnB1dD1mdW5jdGlvbigpe30sQW8ucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXt9LEFvLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt9LEFvLnByb3RvdHlwZS5lbnRyeVNldD1mdW5jdGlvbigpe307dmFyIE5vPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oQW8pO2Z1bmN0aW9uIElvKHQpe3RoaXMubWVzc2FnZT10fHwiIn1mdW5jdGlvbiBNbygpe31Jby5wcm90b3R5cGU9bmV3IEVycm9yLElvLnByb3RvdHlwZS5uYW1lPSJPcGVyYXRpb25Ob3RTdXBwb3J0ZWQiLE1vLnByb3RvdHlwZT1uZXcgZ28sTW8ucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKCl7fTt2YXIgRm89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLmFycmF5Xz1bXSxhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGdvJiZ0aGlzLmFkZEFsbChhcmd1bWVudHNbMF0pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXtpZih0aGlzLmFycmF5X1tlXT09PXQpcmV0dXJuITB9cmV0dXJuITF9LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4hdGhpcy5jb250YWlucyh0KSYmKHRoaXMuYXJyYXlfLnB1c2godCksITApfSxlLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspdGhpcy5hZGQoZS5uZXh0KCkpO3JldHVybiEwfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yfSxlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLmxlbmd0aH0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5hcnJheV8ubGVuZ3RofSxlLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXQucHVzaCh0aGlzLmFycmF5X1tlXSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBUbyh0aGlzKX0sZX0oTW8pLFRvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpLHRoaXMuaGFzaFNldF89ZSx0aGlzLnBvc2l0aW9uXz0wfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5wb3NpdGlvbl89PT10aGlzLmhhc2hTZXRfLnNpemUoKSl0aHJvdyBuZXcgX287cmV0dXJuIHRoaXMuaGFzaFNldF8uYXJyYXlfW3RoaXMucG9zaXRpb25fKytdfSxlLnByb3RvdHlwZS5oYXNOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb25fPHRoaXMuaGFzaFNldF8uc2l6ZSgpfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgSW99LGV9KG1vKTtmdW5jdGlvbiBPbyh0KXtyZXR1cm4gbnVsbD09PXQ/MDp0LmNvbG9yfWZ1bmN0aW9uIExvKHQpe3JldHVybiBudWxsPT09dD9udWxsOnQucGFyZW50fWZ1bmN0aW9uIFBvKHQsZSl7bnVsbCE9PXQmJih0LmNvbG9yPWUpfWZ1bmN0aW9uIFJvKHQpe3JldHVybiBudWxsPT09dD9udWxsOnQubGVmdH1mdW5jdGlvbiBCbyh0KXtyZXR1cm4gbnVsbD09PXQ/bnVsbDp0LnJpZ2h0fWZ1bmN0aW9uIGtvKCl7dGhpcy5yb290Xz1udWxsLHRoaXMuc2l6ZV89MH1rby5wcm90b3R5cGU9bmV3IE5vLGtvLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMucm9vdF87bnVsbCE9PWU7KXt2YXIgbj10LmNvbXBhcmVUbyhlLmtleSk7aWYobjwwKWU9ZS5sZWZ0O2Vsc2V7aWYoIShuPjApKXJldHVybiBlLnZhbHVlO2U9ZS5yaWdodH19cmV0dXJuIG51bGx9LGtvLnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24odCxlKXtpZihudWxsPT09dGhpcy5yb290XylyZXR1cm4gdGhpcy5yb290Xz17a2V5OnQsdmFsdWU6ZSxsZWZ0Om51bGwscmlnaHQ6bnVsbCxwYXJlbnQ6bnVsbCxjb2xvcjowLGdldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9LGdldEtleTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtleX19LHRoaXMuc2l6ZV89MSxudWxsO3ZhciBuLHIsaT10aGlzLnJvb3RfO2Rve2lmKG49aSwocj10LmNvbXBhcmVUbyhpLmtleSkpPDApaT1pLmxlZnQ7ZWxzZXtpZighKHI+MCkpe3ZhciBvPWkudmFsdWU7cmV0dXJuIGkudmFsdWU9ZSxvfWk9aS5yaWdodH19d2hpbGUobnVsbCE9PWkpO3ZhciBzPXtrZXk6dCxsZWZ0Om51bGwscmlnaHQ6bnVsbCx2YWx1ZTplLHBhcmVudDpuLGNvbG9yOjAsZ2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX0sZ2V0S2V5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2V5fX07cmV0dXJuIHI8MD9uLmxlZnQ9czpuLnJpZ2h0PXMsdGhpcy5maXhBZnRlckluc2VydGlvbihzKSx0aGlzLnNpemVfKyssbnVsbH0sa28ucHJvdG90eXBlLmZpeEFmdGVySW5zZXJ0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7Zm9yKHQuY29sb3I9MTtudWxsIT10JiZ0IT09dGhpcy5yb290XyYmMT09PXQucGFyZW50LmNvbG9yOylpZihMbyh0KT09PVJvKExvKExvKHQpKSkpe3ZhciBuPUJvKExvKExvKHQpKSk7MT09PU9vKG4pPyhQbyhMbyh0KSwwKSxQbyhuLDApLFBvKExvKExvKHQpKSwxKSx0PUxvKExvKHQpKSk6KHQ9PT1CbyhMbyh0KSkmJih0PUxvKHQpLGUucm90YXRlTGVmdCh0KSksUG8oTG8odCksMCksUG8oTG8oTG8odCkpLDEpLGUucm90YXRlUmlnaHQoTG8oTG8odCkpKSl9ZWxzZXt2YXIgcj1SbyhMbyhMbyh0KSkpOzE9PT1PbyhyKT8oUG8oTG8odCksMCksUG8ociwwKSxQbyhMbyhMbyh0KSksMSksdD1MbyhMbyh0KSkpOih0PT09Um8oTG8odCkpJiYodD1Mbyh0KSxlLnJvdGF0ZVJpZ2h0KHQpKSxQbyhMbyh0KSwwKSxQbyhMbyhMbyh0KSksMSksZS5yb3RhdGVMZWZ0KExvKExvKHQpKSkpfXRoaXMucm9vdF8uY29sb3I9MH0sa28ucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3ZhciB0PW5ldyB4byxlPXRoaXMuZ2V0Rmlyc3RFbnRyeSgpO2lmKG51bGwhPT1lKWZvcih0LmFkZChlLnZhbHVlKTtudWxsIT09KGU9a28uc3VjY2Vzc29yKGUpKTspdC5hZGQoZS52YWx1ZSk7cmV0dXJuIHR9LGtvLnByb3RvdHlwZS5lbnRyeVNldD1mdW5jdGlvbigpe3ZhciB0PW5ldyBGbyxlPXRoaXMuZ2V0Rmlyc3RFbnRyeSgpO2lmKG51bGwhPT1lKWZvcih0LmFkZChlKTtudWxsIT09KGU9a28uc3VjY2Vzc29yKGUpKTspdC5hZGQoZSk7cmV0dXJuIHR9LGtvLnByb3RvdHlwZS5yb3RhdGVMZWZ0PWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3ZhciBlPXQucmlnaHQ7dC5yaWdodD1lLmxlZnQsbnVsbCE9ZS5sZWZ0JiYoZS5sZWZ0LnBhcmVudD10KSxlLnBhcmVudD10LnBhcmVudCxudWxsPT09dC5wYXJlbnQ/dGhpcy5yb290Xz1lOnQucGFyZW50LmxlZnQ9PT10P3QucGFyZW50LmxlZnQ9ZTp0LnBhcmVudC5yaWdodD1lLGUubGVmdD10LHQucGFyZW50PWV9fSxrby5wcm90b3R5cGUucm90YXRlUmlnaHQ9ZnVuY3Rpb24odCl7aWYobnVsbCE9dCl7dmFyIGU9dC5sZWZ0O3QubGVmdD1lLnJpZ2h0LG51bGwhPWUucmlnaHQmJihlLnJpZ2h0LnBhcmVudD10KSxlLnBhcmVudD10LnBhcmVudCxudWxsPT09dC5wYXJlbnQ/dGhpcy5yb290Xz1lOnQucGFyZW50LnJpZ2h0PT09dD90LnBhcmVudC5yaWdodD1lOnQucGFyZW50LmxlZnQ9ZSxlLnJpZ2h0PXQsdC5wYXJlbnQ9ZX19LGtvLnByb3RvdHlwZS5nZXRGaXJzdEVudHJ5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yb290XztpZihudWxsIT10KWZvcig7bnVsbCE9dC5sZWZ0Oyl0PXQubGVmdDtyZXR1cm4gdH0sa28uc3VjY2Vzc29yPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10KXJldHVybiBudWxsO2lmKG51bGwhPT10LnJpZ2h0KXtmb3IodmFyIGU9dC5yaWdodDtudWxsIT09ZS5sZWZ0OyllPWUubGVmdDtyZXR1cm4gZX1mb3IodmFyIG49dC5wYXJlbnQscj10O251bGwhPT1uJiZyPT09bi5yaWdodDspcj1uLG49bi5wYXJlbnQ7cmV0dXJuIG59LGtvLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2l6ZV99O3ZhciB6bz1mdW5jdGlvbigpe307ZnVuY3Rpb24gam8oKXt9ZnVuY3Rpb24gVW8oKXt0aGlzLmFycmF5Xz1bXSxhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGdvJiZ0aGlzLmFkZEFsbChhcmd1bWVudHNbMF0pfXpvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx6by5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gem99LGpvLnByb3RvdHlwZT1uZXcgTW8sVW8ucHJvdG90eXBlPW5ldyBqbyxVby5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl7aWYoMD09PXRoaXMuYXJyYXlfW2VdLmNvbXBhcmVUbyh0KSlyZXR1cm4hMH1yZXR1cm4hMX0sVW8ucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtpZih0aGlzLmNvbnRhaW5zKHQpKXJldHVybiExO2Zvcih2YXIgZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspe2lmKDE9PT10aGlzLmFycmF5X1tlXS5jb21wYXJlVG8odCkpcmV0dXJuIHRoaXMuYXJyYXlfLnNwbGljZShlLDAsdCksITB9cmV0dXJuIHRoaXMuYXJyYXlfLnB1c2godCksITB9LFVvLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspdGhpcy5hZGQoZS5uZXh0KCkpO3JldHVybiEwfSxVby5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBJb30sVW8ucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcnJheV8ubGVuZ3RofSxVby5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5hcnJheV8ubGVuZ3RofSxVby5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl0LnB1c2godGhpcy5hcnJheV9bZV0pO3JldHVybiB0fSxVby5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHFvKHRoaXMpfTt2YXIgcW89ZnVuY3Rpb24odCl7dGhpcy50cmVlU2V0Xz10LHRoaXMucG9zaXRpb25fPTB9O3FvLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5wb3NpdGlvbl89PT10aGlzLnRyZWVTZXRfLnNpemUoKSl0aHJvdyBuZXcgX287cmV0dXJuIHRoaXMudHJlZVNldF8uYXJyYXlfW3RoaXMucG9zaXRpb25fKytdfSxxby5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uXzx0aGlzLnRyZWVTZXRfLnNpemUoKX0scW8ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBJb307dmFyIFZvPWZ1bmN0aW9uKCl7fTtWby5zb3J0PWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaT1hcmd1bWVudHNbMF07aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcj1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNvbXBhcmVUbyhlKX0saS5zb3J0KHIpO2Vsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpbj1hcmd1bWVudHNbMV0scj1mdW5jdGlvbih0LGUpe3JldHVybiBuLmNvbXBhcmUodCxlKX0saS5zb3J0KHIpO2Vsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpeyhlPWkuc2xpY2UoYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSkpLnNvcnQoKTt2YXIgbz1pLnNsaWNlKDAsYXJndW1lbnRzWzFdKS5jb25jYXQoZSxpLnNsaWNlKGFyZ3VtZW50c1syXSxpLmxlbmd0aCkpO2ZvcihpLnNwbGljZSgwLGkubGVuZ3RoKSx0PTA7dDxvLmxlbmd0aDt0KyspaS5wdXNoKG9bdF0pfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKGU9aS5zbGljZShhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKSxuPWFyZ3VtZW50c1szXSxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY29tcGFyZSh0LGUpfSxlLnNvcnQociksbz1pLnNsaWNlKDAsYXJndW1lbnRzWzFdKS5jb25jYXQoZSxpLnNsaWNlKGFyZ3VtZW50c1syXSxpLmxlbmd0aCkpLGkuc3BsaWNlKDAsaS5sZW5ndGgpLHQ9MDt0PG8ubGVuZ3RoO3QrKylpLnB1c2gob1t0XSl9LFZvLmFzTGlzdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49MCxyPXQubGVuZ3RoO248cjtuKyspZS5hZGQodFtuXSk7cmV0dXJuIGV9O3ZhciBHbz1mdW5jdGlvbigpe30sWW89e1A6e2NvbmZpZ3VyYWJsZTohMH0sTDp7Y29uZmlndXJhYmxlOiEwfSxBOntjb25maWd1cmFibGU6ITB9LEZBTFNFOntjb25maWd1cmFibGU6ITB9LFRSVUU6e2NvbmZpZ3VyYWJsZTohMH0sRE9OVENBUkU6e2NvbmZpZ3VyYWJsZTohMH0sU1lNX0ZBTFNFOntjb25maWd1cmFibGU6ITB9LFNZTV9UUlVFOntjb25maWd1cmFibGU6ITB9LFNZTV9ET05UQ0FSRTp7Y29uZmlndXJhYmxlOiEwfSxTWU1fUDp7Y29uZmlndXJhYmxlOiEwfSxTWU1fTDp7Y29uZmlndXJhYmxlOiEwfSxTWU1fQTp7Y29uZmlndXJhYmxlOiEwfX07WW8uUC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sWW8uTC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sWW8uQS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sWW8uRkFMU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTF9LFlvLlRSVUUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTJ9LFlvLkRPTlRDQVJFLmdldD1mdW5jdGlvbigpe3JldHVybi0zfSxZby5TWU1fRkFMU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIkYifSxZby5TWU1fVFJVRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iVCJ9LFlvLlNZTV9ET05UQ0FSRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iKiJ9LFlvLlNZTV9QLmdldD1mdW5jdGlvbigpe3JldHVybiIwIn0sWW8uU1lNX0wuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIjEifSxZby5TWU1fQS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iMiJ9LEdvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxHby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gR299LEdvLnRvRGltZW5zaW9uU3ltYm9sPWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlIEdvLkZBTFNFOnJldHVybiBHby5TWU1fRkFMU0U7Y2FzZSBHby5UUlVFOnJldHVybiBHby5TWU1fVFJVRTtjYXNlIEdvLkRPTlRDQVJFOnJldHVybiBHby5TWU1fRE9OVENBUkU7Y2FzZSBHby5QOnJldHVybiBHby5TWU1fUDtjYXNlIEdvLkw6cmV0dXJuIEdvLlNZTV9MO2Nhc2UgR28uQTpyZXR1cm4gR28uU1lNX0F9dGhyb3cgbmV3IGhpfSxHby50b0RpbWVuc2lvblZhbHVlPWZ1bmN0aW9uKHQpe3N3aXRjaChJaS50b1VwcGVyQ2FzZSh0KSl7Y2FzZSBHby5TWU1fRkFMU0U6cmV0dXJuIEdvLkZBTFNFO2Nhc2UgR28uU1lNX1RSVUU6cmV0dXJuIEdvLlRSVUU7Y2FzZSBHby5TWU1fRE9OVENBUkU6cmV0dXJuIEdvLkRPTlRDQVJFO2Nhc2UgR28uU1lNX1A6cmV0dXJuIEdvLlA7Y2FzZSBHby5TWU1fTDpyZXR1cm4gR28uTDtjYXNlIEdvLlNZTV9BOnJldHVybiBHby5BfXRocm93IG5ldyBoaX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoR28sWW8pO3ZhciBYbz1mdW5jdGlvbigpe307WG8ucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt9LFhvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxYby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWG99O3ZhciBXbz1mdW5jdGlvbigpe307V28ucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0LGUpe30sV28ucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe30sV28ucHJvdG90eXBlLmlzR2VvbWV0cnlDaGFuZ2VkPWZ1bmN0aW9uKCl7fSxXby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sV28ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFdvfTt2YXIgSG89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe2lmKHQuY2FsbCh0aGlzLG4pLHRoaXMuX2dlb21ldHJpZXM9ZXx8W10sdC5oYXNOdWxsRWxlbWVudHModGhpcy5fZ2VvbWV0cmllcykpdGhyb3cgbmV3IGhpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuY29tcHV0ZUVudmVsb3BlSW50ZXJuYWw9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IGppLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKyl0LmV4cGFuZFRvSW5jbHVkZSh0aGlzLl9nZW9tZXRyaWVzW2VdLmdldEVudmVsb3BlSW50ZXJuYWwoKSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5Tj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZ2VvbWV0cmllc1t0XX0sZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHQuU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTn0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuZ2V0TnVtUG9pbnRzKCkpLmZpbGwobnVsbCksZT0tMSxuPTA7bjx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtuKyspZm9yKHZhciByPXRoaXMuX2dlb21ldHJpZXNbbl0uZ2V0Q29vcmRpbmF0ZXMoKSxpPTA7aTxyLmxlbmd0aDtpKyspdFsrK2VdPXJbaV07cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldEFyZWE9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdCs9dGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRBcmVhKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZighdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSlyZXR1cm4hMTt2YXIgcj1lO2lmKHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoIT09ci5fZ2VvbWV0cmllcy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBpPTA7aTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtpKyspaWYoIXRoaXMuX2dlb21ldHJpZXNbaV0uZXF1YWxzRXhhY3Qoci5fZ2VvbWV0cmllc1tpXSxuKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO3QrKyl0aGlzLl9nZW9tZXRyaWVzW3RdLm5vcm1hbGl6ZSgpO1ZvLnNvcnQodGhpcy5fZ2VvbWV0cmllcyl9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/bnVsbDp0aGlzLl9nZW9tZXRyaWVzWzBdLmdldENvb3JkaW5hdGUoKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtmb3IodmFyIHQ9R28uRkFMU0UsZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKXQ9TWF0aC5tYXgodCx0aGlzLl9nZW9tZXRyaWVzW2VdLmdldEJvdW5kYXJ5RGltZW5zaW9uKCkpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtmb3IodmFyIHQ9R28uRkFMU0UsZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKXQ9TWF0aC5tYXgodCx0aGlzLl9nZW9tZXRyaWVzW2VdLmdldERpbWVuc2lvbigpKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKXQrPXRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0TGVuZ3RoKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldE51bVBvaW50cz1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKyl0Kz10aGlzLl9nZW9tZXRyaWVzW2VdLmdldE51bVBvaW50cygpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXROdW1HZW9tZXRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dlb21ldHJpZXMubGVuZ3RofSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dlb21ldHJpZXMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLmZpbGwobnVsbCksbj0wO248dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7bisrKWVbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5yZXZlcnNlKCk7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihlKX0sZS5wcm90b3R5cGUuY29tcGFyZVRvU2FtZUNsYXNzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPW5ldyBVbyhWby5hc0xpc3QodGhpcy5fZ2VvbWV0cmllcykpLG49bmV3IFVvKFZvLmFzTGlzdCh0Ll9nZW9tZXRyaWVzKSk7cmV0dXJuIHRoaXMuY29tcGFyZShlLG4pfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzBdLG89dGhpcy5nZXROdW1HZW9tZXRyaWVzKCkscz1pLmdldE51bUdlb21ldHJpZXMoKSxhPTA7YTxvJiZhPHM7KXt2YXIgdT10aGlzLmdldEdlb21ldHJ5TihhKSxjPWkuZ2V0R2VvbWV0cnlOKGEpLGw9dS5jb21wYXJlVG9TYW1lQ2xhc3MoYyxyKTtpZigwIT09bClyZXR1cm4gbDthKyt9cmV0dXJuIGE8bz8xOmE8cz8tMTowfX0sZS5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKEVpKGFyZ3VtZW50c1swXSxhbykpZm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPTA7bjx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtuKyspdC5fZ2VvbWV0cmllc1tuXS5hcHBseShlKTtlbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxXbykpe3ZhciByPWFyZ3VtZW50c1swXTtpZigwPT09dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpcmV0dXJuIG51bGw7Zm9yKHZhciBpPTA7aTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCYmKHQuX2dlb21ldHJpZXNbaV0uYXBwbHkociksIXIuaXNEb25lKCkpO2krKyk7ci5pc0dlb21ldHJ5Q2hhbmdlZCgpJiZ0aGlzLmdlb21ldHJ5Q2hhbmdlZCgpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzBdLFhvKSl7dmFyIG89YXJndW1lbnRzWzBdO28uZmlsdGVyKHRoaXMpO2Zvcih2YXIgcz0wO3M8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7cysrKXQuX2dlb21ldHJpZXNbc10uYXBwbHkobyl9ZWxzZSBpZihFaShhcmd1bWVudHNbMF0scm8pKXt2YXIgYT1hcmd1bWVudHNbMF07YS5maWx0ZXIodGhpcyk7Zm9yKHZhciB1PTA7dTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDt1KyspdC5fZ2VvbWV0cmllc1t1XS5hcHBseShhKX19LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24odGhpcyksWmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoKSxudWxsfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7ZS5fZ2VvbWV0cmllcz1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCk7Zm9yKHZhciBuPTA7bjx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtuKyspZS5fZ2VvbWV0cmllc1tuXT10aGlzLl9nZW9tZXRyaWVzW25dLmNsb25lKCk7cmV0dXJuIGV9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJHZW9tZXRyeUNvbGxlY3Rpb24ifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCkuZmlsbChudWxsKSxuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXT10aGlzLl9nZW9tZXRyaWVzW25dLmNvcHkoKTtyZXR1cm4gbmV3IGUodCx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7dCsrKWlmKCF0aGlzLl9nZW9tZXRyaWVzW3RdLmlzRW1wdHkoKSlyZXR1cm4hMTtyZXR1cm4hMH0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDRmMDdiY2IxZjg1N2Q4MDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oaW8pLFpvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiBpby5TT1JUSU5ERVhfTVVMVElMSU5FU1RSSU5HfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuISF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpJiZ0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5jYWxsKHRoaXMsZSxuKX1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzQ2xvc2VkKCk/R28uRkFMU0U6MH0sZS5wcm90b3R5cGUuaXNDbG9zZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4hMTtmb3IodmFyIHQ9MDt0PHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO3QrKylpZighdGhpcy5fZ2VvbWV0cmllc1t0XS5pc0Nsb3NlZCgpKXJldHVybiExO3JldHVybiEwfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCxlPW5ldyBBcnJheSh0KS5maWxsKG51bGwpLG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyllW3QtMS1uXT10aGlzLl9nZW9tZXRyaWVzW25dLnJldmVyc2UoKTtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKGUpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiBuZXcgS28odGhpcykuZ2V0Qm91bmRhcnkoKX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIk11bHRpTGluZVN0cmluZyJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoKS5maWxsKG51bGwpLG49MDtuPHQubGVuZ3RoO24rKyl0W25dPXRoaXMuX2dlb21ldHJpZXNbbl0uY29weSgpO3JldHVybiBuZXcgZSh0LHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt6b119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg3MTU1ZDJhYjRhZmE4MDAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KEhvKSxLbz1mdW5jdGlvbigpe2lmKHRoaXMuX2dlb209bnVsbCx0aGlzLl9nZW9tRmFjdD1udWxsLHRoaXMuX2JuUnVsZT1udWxsLHRoaXMuX2VuZHBvaW50TWFwPW51bGwsMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXVvLk1PRDJfQk9VTkRBUllfUlVMRTt0aGlzLl9nZW9tPXQsdGhpcy5fZ2VvbUZhY3Q9dC5nZXRGYWN0b3J5KCksdGhpcy5fYm5SdWxlPWV9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMuX2dlb209bix0aGlzLl9nZW9tRmFjdD1uLmdldEZhY3RvcnkoKSx0aGlzLl9iblJ1bGU9cn19O0tvLnByb3RvdHlwZS5ib3VuZGFyeU11bHRpTGluZVN0cmluZz1mdW5jdGlvbih0KXtpZih0aGlzLl9nZW9tLmlzRW1wdHkoKSlyZXR1cm4gdGhpcy5nZXRFbXB0eU11bHRpUG9pbnQoKTt2YXIgZT10aGlzLmNvbXB1dGVCb3VuZGFyeUNvb3JkaW5hdGVzKHQpO3JldHVybiAxPT09ZS5sZW5ndGg/dGhpcy5fZ2VvbUZhY3QuY3JlYXRlUG9pbnQoZVswXSk6dGhpcy5fZ2VvbUZhY3QuY3JlYXRlTXVsdGlQb2ludEZyb21Db29yZHMoZSl9LEtvLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZW9tIGluc3RhbmNlb2YgYXM/dGhpcy5ib3VuZGFyeUxpbmVTdHJpbmcodGhpcy5fZ2VvbSk6dGhpcy5fZ2VvbSBpbnN0YW5jZW9mIFpvP3RoaXMuYm91bmRhcnlNdWx0aUxpbmVTdHJpbmcodGhpcy5fZ2VvbSk6dGhpcy5fZ2VvbS5nZXRCb3VuZGFyeSgpfSxLby5wcm90b3R5cGUuYm91bmRhcnlMaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9nZW9tLmlzRW1wdHkoKT90aGlzLmdldEVtcHR5TXVsdGlQb2ludCgpOnQuaXNDbG9zZWQoKT90aGlzLl9iblJ1bGUuaXNJbkJvdW5kYXJ5KDIpP3QuZ2V0U3RhcnRQb2ludCgpOnRoaXMuX2dlb21GYWN0LmNyZWF0ZU11bHRpUG9pbnQoKTp0aGlzLl9nZW9tRmFjdC5jcmVhdGVNdWx0aVBvaW50KFt0LmdldFN0YXJ0UG9pbnQoKSx0LmdldEVuZFBvaW50KCldKX0sS28ucHJvdG90eXBlLmdldEVtcHR5TXVsdGlQb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZW9tRmFjdC5jcmVhdGVNdWx0aVBvaW50KCl9LEtvLnByb3RvdHlwZS5jb21wdXRlQm91bmRhcnlDb29yZGluYXRlcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49bmV3IHhvO3RoaXMuX2VuZHBvaW50TWFwPW5ldyBrbztmb3IodmFyIHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9dC5nZXRHZW9tZXRyeU4ocik7MCE9PWkuZ2V0TnVtUG9pbnRzKCkmJihlLmFkZEVuZHBvaW50KGkuZ2V0Q29vcmRpbmF0ZU4oMCkpLGUuYWRkRW5kcG9pbnQoaS5nZXRDb29yZGluYXRlTihpLmdldE51bVBvaW50cygpLTEpKSl9Zm9yKHZhciBvPXRoaXMuX2VuZHBvaW50TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspe3ZhciBzPW8ubmV4dCgpLGE9cy5nZXRWYWx1ZSgpLmNvdW50O2UuX2JuUnVsZS5pc0luQm91bmRhcnkoYSkmJm4uYWRkKHMuZ2V0S2V5KCkpfXJldHVybiBEby50b0Nvb3JkaW5hdGVBcnJheShuKX0sS28ucHJvdG90eXBlLmFkZEVuZHBvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2VuZHBvaW50TWFwLmdldCh0KTtudWxsPT09ZSYmKGU9bmV3IEpvLHRoaXMuX2VuZHBvaW50TWFwLnB1dCh0LGUpKSxlLmNvdW50Kyt9LEtvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxLby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gS299LEtvLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBLbyhhcmd1bWVudHNbMF0pLmdldEJvdW5kYXJ5KCk6Mj09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IEtvKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pLmdldEJvdW5kYXJ5KCk6dm9pZCAwfTt2YXIgSm89ZnVuY3Rpb24oKXt0aGlzLmNvdW50PW51bGx9O2Z1bmN0aW9uIFFvKCl7fWZ1bmN0aW9uICRvKCl7fUpvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxKby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSm99O3ZhciB0cz1mdW5jdGlvbigpe307ZnVuY3Rpb24gZXMoKXt9ZnVuY3Rpb24gbnMoKXt9ZnVuY3Rpb24gcnMoKXt9dmFyIGlzPWZ1bmN0aW9uKCl7fSxvcz17TkVXTElORTp7Y29uZmlndXJhYmxlOiEwfSxTSU1QTEVfT1JESU5BVEVfRk9STUFUOntjb25maWd1cmFibGU6ITB9fTtpcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0saXMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGlzfSxpcy5jaGFycz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgQXJyYXkoZSkuZmlsbChudWxsKSxyPTA7cjxlO3IrKyluW3JdPXQ7cmV0dXJuIFN0cmluZyhuKX0saXMuZ2V0U3RhY2tUcmFjZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgZXMsbj1uZXcgUW87cmV0dXJuIHQucHJpbnRTdGFja1RyYWNlKG4pLGUudG9TdHJpbmcoKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzFdLGk9IiI7bmV3ICRvKGlzLmdldFN0YWNrVHJhY2UoYXJndW1lbnRzWzBdKSk7Zm9yKHZhciBvPW5ldyBycyxzPTA7czxyO3MrKyl0cnl7aSs9by5yZWFkTGluZSgpK2lzLk5FV0xJTkV9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2YgbnMpKXRocm93IHQ7Wmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoKX1yZXR1cm4gaX19LGlzLnNwbGl0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9bmV3IHhvLGk9IiIrdCxvPWkuaW5kZXhPZihlKTtvPj0wOyl7dmFyIHM9aS5zdWJzdHJpbmcoMCxvKTtyLmFkZChzKSxvPShpPWkuc3Vic3RyaW5nKG8rbikpLmluZGV4T2YoZSl9aS5sZW5ndGg+MCYmci5hZGQoaSk7Zm9yKHZhciBhPW5ldyBBcnJheShyLnNpemUoKSkuZmlsbChudWxsKSx1PTA7dTxhLmxlbmd0aDt1KyspYVt1XT1yLmdldCh1KTtyZXR1cm4gYX0saXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBpcy5TSU1QTEVfT1JESU5BVEVfRk9STUFULmZvcm1hdCh0KX19LGlzLnNwYWNlcz1mdW5jdGlvbih0KXtyZXR1cm4gaXMuY2hhcnMoIiAiLHQpfSxvcy5ORVdMSU5FLmdldD1mdW5jdGlvbigpe3JldHVybiBraS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKX0sb3MuU0lNUExFX09SRElOQVRFX0ZPUk1BVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRzfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpcyxvcyk7dmFyIHNzPWZ1bmN0aW9uKCl7fTtzcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sc3MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHNzfSxzcy5jb3B5Q29vcmQ9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPU1hdGgubWluKHQuZ2V0RGltZW5zaW9uKCksbi5nZXREaW1lbnNpb24oKSksbz0wO288aTtvKyspbi5zZXRPcmRpbmF0ZShyLG8sdC5nZXRPcmRpbmF0ZShlLG8pKX0sc3MuaXNSaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2l6ZSgpO3JldHVybiAwPT09ZXx8IShlPD0zKSYmKHQuZ2V0T3JkaW5hdGUoMCxMaS5YKT09PXQuZ2V0T3JkaW5hdGUoZS0xLExpLlgpJiZ0LmdldE9yZGluYXRlKDAsTGkuWSk9PT10LmdldE9yZGluYXRlKGUtMSxMaS5ZKSl9LHNzLmlzRXF1YWw9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnNpemUoKTtpZihuIT09ZS5zaXplKCkpcmV0dXJuITE7Zm9yKHZhciByPU1hdGgubWluKHQuZ2V0RGltZW5zaW9uKCksZS5nZXREaW1lbnNpb24oKSksaT0wO2k8bjtpKyspZm9yKHZhciBvPTA7bzxyO28rKyl7dmFyIHM9dC5nZXRPcmRpbmF0ZShpLG8pLGE9ZS5nZXRPcmRpbmF0ZShpLG8pO2lmKCEodC5nZXRPcmRpbmF0ZShpLG8pPT09ZS5nZXRPcmRpbmF0ZShpLG8pfHxmaS5pc05hTihzKSYmZmkuaXNOYU4oYSkpKXJldHVybiExfXJldHVybiEwfSxzcy5leHRlbmQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuY3JlYXRlKG4sZS5nZXREaW1lbnNpb24oKSksaT1lLnNpemUoKTtpZihzcy5jb3B5KGUsMCxyLDAsaSksaT4wKWZvcih2YXIgbz1pO288bjtvKyspc3MuY29weShlLGktMSxyLG8sMSk7cmV0dXJuIHJ9LHNzLnJldmVyc2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuc2l6ZSgpLTEsbj1NYXRoLnRydW5jKGUvMikscj0wO3I8PW47cisrKXNzLnN3YXAodCxyLGUtcil9LHNzLnN3YXA9ZnVuY3Rpb24odCxlLG4pe2lmKGU9PT1uKXJldHVybiBudWxsO2Zvcih2YXIgcj0wO3I8dC5nZXREaW1lbnNpb24oKTtyKyspe3ZhciBpPXQuZ2V0T3JkaW5hdGUoZSxyKTt0LnNldE9yZGluYXRlKGUscix0LmdldE9yZGluYXRlKG4scikpLHQuc2V0T3JkaW5hdGUobixyLGkpfX0sc3MuY29weT1mdW5jdGlvbih0LGUsbixyLGkpe2Zvcih2YXIgbz0wO288aTtvKyspc3MuY29weUNvb3JkKHQsZStvLG4scitvKX0sc3MudG9TdHJpbmc9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dC5zaXplKCk7aWYoMD09PWUpcmV0dXJuIigpIjt2YXIgbj10LmdldERpbWVuc2lvbigpLHI9bmV3IEFpO3IuYXBwZW5kKCIoIik7Zm9yKHZhciBpPTA7aTxlO2krKyl7aT4wJiZyLmFwcGVuZCgiICIpO2Zvcih2YXIgbz0wO288bjtvKyspbz4wJiZyLmFwcGVuZCgiLCIpLHIuYXBwZW5kKGlzLnRvU3RyaW5nKHQuZ2V0T3JkaW5hdGUoaSxvKSkpfXJldHVybiByLmFwcGVuZCgiKSIpLHIudG9TdHJpbmcoKX19LHNzLmVuc3VyZVZhbGlkUmluZz1mdW5jdGlvbih0LGUpe3ZhciBuPWUuc2l6ZSgpO3JldHVybiAwPT09bj9lOm48PTM/c3MuY3JlYXRlQ2xvc2VkUmluZyh0LGUsNCk6ZS5nZXRPcmRpbmF0ZSgwLExpLlgpPT09ZS5nZXRPcmRpbmF0ZShuLTEsTGkuWCkmJmUuZ2V0T3JkaW5hdGUoMCxMaS5ZKT09PWUuZ2V0T3JkaW5hdGUobi0xLExpLlkpP2U6c3MuY3JlYXRlQ2xvc2VkUmluZyh0LGUsbisxKX0sc3MuY3JlYXRlQ2xvc2VkUmluZz1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5jcmVhdGUobixlLmdldERpbWVuc2lvbigpKSxpPWUuc2l6ZSgpO3NzLmNvcHkoZSwwLHIsMCxpKTtmb3IodmFyIG89aTtvPG47bysrKXNzLmNvcHkoZSwwLHIsbywxKTtyZXR1cm4gcn07dmFyIGFzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt0LmNhbGwodGhpcyxuKSx0aGlzLl9wb2ludHM9bnVsbCx0aGlzLmluaXQoZSl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5jb21wdXRlRW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9uZXcgamk6dGhpcy5fcG9pbnRzLmV4cGFuZEVudmVsb3BlKG5ldyBqaSl9LGUucHJvdG90eXBlLmlzUmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzQ2xvc2VkKCkmJnRoaXMuaXNTaW1wbGUoKX0sZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHQuU09SVElOREVYX0xJTkVTVFJJTkd9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvaW50cy50b0Nvb3JkaW5hdGVBcnJheSgpfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYoIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MoZSkpcmV0dXJuITE7dmFyIHI9ZTtpZih0aGlzLl9wb2ludHMuc2l6ZSgpIT09ci5fcG9pbnRzLnNpemUoKSlyZXR1cm4hMTtmb3IodmFyIGk9MDtpPHRoaXMuX3BvaW50cy5zaXplKCk7aSsrKWlmKCF0aGlzLmVxdWFsKHRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKGkpLHIuX3BvaW50cy5nZXRDb29yZGluYXRlKGkpLG4pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9MDtlPE1hdGgudHJ1bmModGhpcy5fcG9pbnRzLnNpemUoKS8yKTtlKyspe3ZhciBuPXQuX3BvaW50cy5zaXplKCktMS1lO2lmKCF0Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShlKS5lcXVhbHModC5fcG9pbnRzLmdldENvb3JkaW5hdGUobikpKXJldHVybiB0Ll9wb2ludHMuZ2V0Q29vcmRpbmF0ZShlKS5jb21wYXJlVG8odC5fcG9pbnRzLmdldENvb3JkaW5hdGUobikpPjAmJnNzLnJldmVyc2UodC5fcG9pbnRzKSxudWxsfX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9udWxsOnRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKDApfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzQ2xvc2VkKCk/R28uRkFMU0U6MH0sZS5wcm90b3R5cGUuaXNDbG9zZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0VtcHR5KCkmJnRoaXMuZ2V0Q29vcmRpbmF0ZU4oMCkuZXF1YWxzMkQodGhpcy5nZXRDb29yZGluYXRlTih0aGlzLmdldE51bVBvaW50cygpLTEpKX0sZS5wcm90b3R5cGUuZ2V0RW5kUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/bnVsbDp0aGlzLmdldFBvaW50Tih0aGlzLmdldE51bVBvaW50cygpLTEpfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZS5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIGVvLmNvbXB1dGVMZW5ndGgodGhpcy5fcG9pbnRzKX0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvaW50cy5zaXplKCl9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wb2ludHMuY29weSgpO3JldHVybiBzcy5yZXZlcnNlKHQpLHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVTdHJpbmcodCl9LGUucHJvdG90eXBlLmNvbXBhcmVUb1NhbWVDbGFzcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9MCxuPTA7ZTx0aGlzLl9wb2ludHMuc2l6ZSgpJiZuPHQuX3BvaW50cy5zaXplKCk7KXt2YXIgcj10aGlzLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZShlKS5jb21wYXJlVG8odC5fcG9pbnRzLmdldENvb3JkaW5hdGUobikpO2lmKDAhPT1yKXJldHVybiByO2UrKyxuKyt9cmV0dXJuIGU8dGhpcy5fcG9pbnRzLnNpemUoKT8xOm48dC5fcG9pbnRzLnNpemUoKT8tMTowfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1sxXS5jb21wYXJlKHRoaXMuX3BvaW50cyxpLl9wb2ludHMpfX0sZS5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oKXtpZihFaShhcmd1bWVudHNbMF0sYW8pKWZvcih2YXIgdD1hcmd1bWVudHNbMF0sZT0wO2U8dGhpcy5fcG9pbnRzLnNpemUoKTtlKyspdC5maWx0ZXIodGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUoZSkpO2Vsc2UgaWYoRWkoYXJndW1lbnRzWzBdLFdvKSl7dmFyIG49YXJndW1lbnRzWzBdO2lmKDA9PT10aGlzLl9wb2ludHMuc2l6ZSgpKXJldHVybiBudWxsO2Zvcih2YXIgcj0wO3I8dGhpcy5fcG9pbnRzLnNpemUoKSYmKG4uZmlsdGVyKHRoaXMuX3BvaW50cyxyKSwhbi5pc0RvbmUoKSk7cisrKTtuLmlzR2VvbWV0cnlDaGFuZ2VkKCkmJnRoaXMuZ2VvbWV0cnlDaGFuZ2VkKCl9ZWxzZSBpZihFaShhcmd1bWVudHNbMF0sWG8pKXthcmd1bWVudHNbMF0uZmlsdGVyKHRoaXMpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzBdLHJvKSl7YXJndW1lbnRzWzBdLmZpbHRlcih0aGlzKX19LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBLbyh0aGlzKS5nZXRCb3VuZGFyeSgpfSxlLnByb3RvdHlwZS5pc0VxdWl2YWxlbnRDbGFzcz1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGV9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtyZXR1cm4gZS5fcG9pbnRzPXRoaXMuX3BvaW50cy5jbG9uZSgpLGV9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVOPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZSh0KX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIkxpbmVTdHJpbmcifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKHRoaXMuX3BvaW50cy5jb3B5KCksdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVTZXF1ZW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb2ludHN9LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuX3BvaW50cy5zaXplKCl9LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCl7aWYobnVsbD09PXQmJih0PXRoaXMuZ2V0RmFjdG9yeSgpLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUoW10pKSwxPT09dC5zaXplKCkpdGhyb3cgbmV3IGhpKCJJbnZhbGlkIG51bWJlciBvZiBwb2ludHMgaW4gTGluZVN0cmluZyAoZm91bmQgIit0LnNpemUoKSsiIC0gbXVzdCBiZSAwIG9yID49IDIpIik7dGhpcy5fcG9pbnRzPXR9LGUucHJvdG90eXBlLmlzQ29vcmRpbmF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX3BvaW50cy5zaXplKCk7ZSsrKWlmKHRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKGUpLmVxdWFscyh0KSlyZXR1cm4hMDtyZXR1cm4hMX0sZS5wcm90b3R5cGUuZ2V0U3RhcnRQb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9udWxsOnRoaXMuZ2V0UG9pbnROKDApfSxlLnByb3RvdHlwZS5nZXRQb2ludE49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZVBvaW50KHRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKHQpKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bem9dfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4MmIyYjUxYmE0MzVjOGUwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShpbyksdXM9ZnVuY3Rpb24oKXt9O3VzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx1cy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdXN9O3ZhciBjcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dC5jYWxsKHRoaXMsbiksdGhpcy5fY29vcmRpbmF0ZXM9ZXx8bnVsbCx0aGlzLmluaXQodGhpcy5fY29vcmRpbmF0ZXMpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuY29tcHV0ZUVudmVsb3BlSW50ZXJuYWw9ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gbmV3IGppO3ZhciB0PW5ldyBqaTtyZXR1cm4gdC5leHBhbmRUb0luY2x1ZGUodGhpcy5fY29vcmRpbmF0ZXMuZ2V0WCgwKSx0aGlzLl9jb29yZGluYXRlcy5nZXRZKDApKSx0fSxlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdC5TT1JUSU5ERVhfUE9JTlR9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP1tdOlt0aGlzLmdldENvb3JkaW5hdGUoKV19LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4hIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MoZSkmJighKCF0aGlzLmlzRW1wdHkoKXx8IWUuaXNFbXB0eSgpKXx8dGhpcy5pc0VtcHR5KCk9PT1lLmlzRW1wdHkoKSYmdGhpcy5lcXVhbChlLmdldENvb3JkaW5hdGUoKSx0aGlzLmdldENvb3JkaW5hdGUoKSxuKSl9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIDAhPT10aGlzLl9jb29yZGluYXRlcy5zaXplKCk/dGhpcy5fY29vcmRpbmF0ZXMuZ2V0Q29vcmRpbmF0ZSgwKTpudWxsfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiBHby5GQUxTRX0sZS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGUucHJvdG90eXBlLmdldE51bVBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT8wOjF9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb3B5KCl9LGUucHJvdG90eXBlLmdldFg9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5nZXRDb29yZGluYXRlKCkpdGhyb3cgbmV3IEVycm9yKCJnZXRYIGNhbGxlZCBvbiBlbXB0eSBQb2ludCIpO3JldHVybiB0aGlzLmdldENvb3JkaW5hdGUoKS54fSxlLnByb3RvdHlwZS5jb21wYXJlVG9TYW1lQ2xhc3M9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmdldENvb3JkaW5hdGUoKS5jb21wYXJlVG8odC5nZXRDb29yZGluYXRlKCkpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1sxXS5jb21wYXJlKHRoaXMuX2Nvb3JkaW5hdGVzLGUuX2Nvb3JkaW5hdGVzKX19LGUucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKCl7aWYoRWkoYXJndW1lbnRzWzBdLGFvKSl7dmFyIHQ9YXJndW1lbnRzWzBdO2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBudWxsO3QuZmlsdGVyKHRoaXMuZ2V0Q29vcmRpbmF0ZSgpKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxXbykpe3ZhciBlPWFyZ3VtZW50c1swXTtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDtlLmZpbHRlcih0aGlzLl9jb29yZGluYXRlcywwKSxlLmlzR2VvbWV0cnlDaGFuZ2VkKCkmJnRoaXMuZ2VvbWV0cnlDaGFuZ2VkKCl9ZWxzZSBpZihFaShhcmd1bWVudHNbMF0sWG8pKXthcmd1bWVudHNbMF0uZmlsdGVyKHRoaXMpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzBdLHJvKSl7YXJndW1lbnRzWzBdLmZpbHRlcih0aGlzKX19LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihudWxsKX0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiBlLl9jb29yZGluYXRlcz10aGlzLl9jb29yZGluYXRlcy5jbG9uZSgpLGV9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJQb2ludCJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGUodGhpcy5fY29vcmRpbmF0ZXMuY29weSgpLHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlU2VxdWVuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXN9LGUucHJvdG90eXBlLmdldFk9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5nZXRDb29yZGluYXRlKCkpdGhyb3cgbmV3IEVycm9yKCJnZXRZIGNhbGxlZCBvbiBlbXB0eSBQb2ludCIpO3JldHVybiB0aGlzLmdldENvb3JkaW5hdGUoKS55fSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9jb29yZGluYXRlcy5zaXplKCl9LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCl7bnVsbD09PXQmJih0PXRoaXMuZ2V0RmFjdG9yeSgpLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUoW10pKSxaaS5pc1RydWUodC5zaXplKCk8PTEpLHRoaXMuX2Nvb3JkaW5hdGVzPXR9LGUucHJvdG90eXBlLmlzU2ltcGxlPWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3VzXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDQ0MDc3YmFkMTYxY2JjMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oaW8pLGxzPWZ1bmN0aW9uKCl7fTtscy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbHMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGxzfTt2YXIgaHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scil7aWYodC5jYWxsKHRoaXMsciksdGhpcy5fc2hlbGw9bnVsbCx0aGlzLl9ob2xlcz1udWxsLG51bGw9PT1lJiYoZT10aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lYXJSaW5nKCkpLG51bGw9PT1uJiYobj1bXSksdC5oYXNOdWxsRWxlbWVudHMobikpdGhyb3cgbmV3IGhpO2lmKGUuaXNFbXB0eSgpJiZ0Lmhhc05vbkVtcHR5RWxlbWVudHMobikpdGhyb3cgbmV3IGhpO3RoaXMuX3NoZWxsPWUsdGhpcy5faG9sZXM9bn10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmNvbXB1dGVFbnZlbG9wZUludGVybmFsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoZWxsLmdldEVudmVsb3BlSW50ZXJuYWwoKX0sZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHQuU09SVElOREVYX1BPTFlHT059LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuW107Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLmdldE51bVBvaW50cygpKS5maWxsKG51bGwpLGU9LTEsbj10aGlzLl9zaGVsbC5nZXRDb29yZGluYXRlcygpLHI9MDtyPG4ubGVuZ3RoO3IrKyl0WysrZV09bltyXTtmb3IodmFyIGk9MDtpPHRoaXMuX2hvbGVzLmxlbmd0aDtpKyspZm9yKHZhciBvPXRoaXMuX2hvbGVzW2ldLmdldENvb3JkaW5hdGVzKCkscz0wO3M8by5sZW5ndGg7cysrKXRbKytlXT1vW3NdO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXRBcmVhPWZ1bmN0aW9uKCl7dmFyIHQ9MDt0Kz1NYXRoLmFicyhlby5zaWduZWRBcmVhKHRoaXMuX3NoZWxsLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpKSk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9ob2xlcy5sZW5ndGg7ZSsrKXQtPU1hdGguYWJzKGVvLnNpZ25lZEFyZWEodGhpcy5faG9sZXNbZV0uZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkpKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuaXNSZWN0YW5nbGU9ZnVuY3Rpb24oKXtpZigwIT09dGhpcy5nZXROdW1JbnRlcmlvclJpbmcoKXx8bnVsbD09PXRoaXMuX3NoZWxsfHw1IT09dGhpcy5fc2hlbGwuZ2V0TnVtUG9pbnRzKCkpcmV0dXJuITE7Zm9yKHZhciB0PXRoaXMuX3NoZWxsLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLGU9dGhpcy5nZXRFbnZlbG9wZUludGVybmFsKCksbj0wO248NTtuKyspe3ZhciByPXQuZ2V0WChuKTtpZihyIT09ZS5nZXRNaW5YKCkmJnIhPT1lLmdldE1heFgoKSlyZXR1cm4hMTt2YXIgaT10LmdldFkobik7aWYoaSE9PWUuZ2V0TWluWSgpJiZpIT09ZS5nZXRNYXhZKCkpcmV0dXJuITF9Zm9yKHZhciBvPXQuZ2V0WCgwKSxzPXQuZ2V0WSgwKSxhPTE7YTw9NDthKyspe3ZhciB1PXQuZ2V0WChhKSxjPXQuZ2V0WShhKTtpZih1IT09bz09PShjIT09cykpcmV0dXJuITE7bz11LHM9Y31yZXR1cm4hMH0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKCF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpKXJldHVybiExO3ZhciByPWUsaT10aGlzLl9zaGVsbCxvPXIuX3NoZWxsO2lmKCFpLmVxdWFsc0V4YWN0KG8sbil8fHRoaXMuX2hvbGVzLmxlbmd0aCE9PXIuX2hvbGVzLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHM9MDtzPHRoaXMuX2hvbGVzLmxlbmd0aDtzKyspaWYoIXRoaXMuX2hvbGVzW3NdLmVxdWFsc0V4YWN0KHIuX2hvbGVzW3NdLG4pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXt0aGlzLm5vcm1hbGl6ZSh0aGlzLl9zaGVsbCwhMCk7Zm9yKHZhciB0PTA7dDx0aGlzLl9ob2xlcy5sZW5ndGg7dCsrKXRoaXMubm9ybWFsaXplKHRoaXMuX2hvbGVzW3RdLCExKTtWby5zb3J0KHRoaXMuX2hvbGVzKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYoZS5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dmFyIHI9bmV3IEFycmF5KGUuZ2V0Q29vcmRpbmF0ZXMoKS5sZW5ndGgtMSkuZmlsbChudWxsKTtraS5hcnJheWNvcHkoZS5nZXRDb29yZGluYXRlcygpLDAsciwwLHIubGVuZ3RoKTt2YXIgaT1Eby5taW5Db29yZGluYXRlKGUuZ2V0Q29vcmRpbmF0ZXMoKSk7RG8uc2Nyb2xsKHIsaSksa2kuYXJyYXljb3B5KHIsMCxlLmdldENvb3JkaW5hdGVzKCksMCxyLmxlbmd0aCksZS5nZXRDb29yZGluYXRlcygpW3IubGVuZ3RoXT1yWzBdLGVvLmlzQ0NXKGUuZ2V0Q29vcmRpbmF0ZXMoKSk9PT1uJiZEby5yZXZlcnNlKGUuZ2V0Q29vcmRpbmF0ZXMoKSl9fSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoZWxsLmdldENvb3JkaW5hdGUoKX0sZS5wcm90b3R5cGUuZ2V0TnVtSW50ZXJpb3JSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hvbGVzLmxlbmd0aH0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LGUucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe3ZhciB0PTA7dCs9dGhpcy5fc2hlbGwuZ2V0TGVuZ3RoKCk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9ob2xlcy5sZW5ndGg7ZSsrKXQrPXRoaXMuX2hvbGVzW2VdLmdldExlbmd0aCgpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXROdW1Qb2ludHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fc2hlbGwuZ2V0TnVtUG9pbnRzKCksZT0wO2U8dGhpcy5faG9sZXMubGVuZ3RoO2UrKyl0Kz10aGlzLl9ob2xlc1tlXS5nZXROdW1Qb2ludHMoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY29weSgpO3QuX3NoZWxsPXRoaXMuX3NoZWxsLmNvcHkoKS5yZXZlcnNlKCksdC5faG9sZXM9bmV3IEFycmF5KHRoaXMuX2hvbGVzLmxlbmd0aCkuZmlsbChudWxsKTtmb3IodmFyIGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdC5faG9sZXNbZV09dGhpcy5faG9sZXNbZV0uY29weSgpLnJldmVyc2UoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuY29udmV4SHVsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEV4dGVyaW9yUmluZygpLmNvbnZleEh1bGwoKX0sZS5wcm90b3R5cGUuY29tcGFyZVRvU2FtZUNsYXNzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXRoaXMuX3NoZWxsLG49dC5fc2hlbGw7cmV0dXJuIGUuY29tcGFyZVRvU2FtZUNsYXNzKG4pfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMF0sbz10aGlzLl9zaGVsbCxzPWkuX3NoZWxsLGE9by5jb21wYXJlVG9TYW1lQ2xhc3MocyxyKTtpZigwIT09YSlyZXR1cm4gYTtmb3IodmFyIHU9dGhpcy5nZXROdW1JbnRlcmlvclJpbmcoKSxjPWkuZ2V0TnVtSW50ZXJpb3JSaW5nKCksbD0wO2w8dSYmbDxjOyl7dmFyIGg9dGhpcy5nZXRJbnRlcmlvclJpbmdOKGwpLGY9aS5nZXRJbnRlcmlvclJpbmdOKGwpLHA9aC5jb21wYXJlVG9TYW1lQ2xhc3MoZixyKTtpZigwIT09cClyZXR1cm4gcDtsKyt9cmV0dXJuIGw8dT8xOmw8Yz8tMTowfX0sZS5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihFaSh0LGFvKSl7dGhpcy5fc2hlbGwuYXBwbHkodCk7Zm9yKHZhciBuPTA7bjx0aGlzLl9ob2xlcy5sZW5ndGg7bisrKWUuX2hvbGVzW25dLmFwcGx5KHQpfWVsc2UgaWYoRWkodCxXbykpe2lmKHRoaXMuX3NoZWxsLmFwcGx5KHQpLCF0LmlzRG9uZSgpKWZvcih2YXIgcj0wO3I8dGhpcy5faG9sZXMubGVuZ3RoJiYoZS5faG9sZXNbcl0uYXBwbHkodCksIXQuaXNEb25lKCkpO3IrKyk7dC5pc0dlb21ldHJ5Q2hhbmdlZCgpJiZ0aGlzLmdlb21ldHJ5Q2hhbmdlZCgpfWVsc2UgaWYoRWkodCxYbykpdC5maWx0ZXIodGhpcyk7ZWxzZSBpZihFaSh0LHJvKSl7dC5maWx0ZXIodGhpcyksdGhpcy5fc2hlbGwuYXBwbHkodCk7Zm9yKHZhciBpPTA7aTx0aGlzLl9ob2xlcy5sZW5ndGg7aSsrKWUuX2hvbGVzW2ldLmFwcGx5KHQpfX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKCk7dmFyIHQ9bmV3IEFycmF5KHRoaXMuX2hvbGVzLmxlbmd0aCsxKS5maWxsKG51bGwpO3RbMF09dGhpcy5fc2hlbGw7Zm9yKHZhciBlPTA7ZTx0aGlzLl9ob2xlcy5sZW5ndGg7ZSsrKXRbZSsxXT10aGlzLl9ob2xlc1tlXTtyZXR1cm4gdC5sZW5ndGg8PTE/dGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTGluZWFyUmluZyh0WzBdLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpKTp0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcodCl9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtlLl9zaGVsbD10aGlzLl9zaGVsbC5jbG9uZSgpLGUuX2hvbGVzPW5ldyBBcnJheSh0aGlzLl9ob2xlcy5sZW5ndGgpLmZpbGwobnVsbCk7Zm9yKHZhciBuPTA7bjx0aGlzLl9ob2xlcy5sZW5ndGg7bisrKWUuX2hvbGVzW25dPXRoaXMuX2hvbGVzW25dLmNsb25lKCk7cmV0dXJuIGV9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJQb2x5Z29uIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9zaGVsbC5jb3B5KCksbj1uZXcgQXJyYXkodGhpcy5faG9sZXMubGVuZ3RoKS5maWxsKG51bGwpLHI9MDtyPG4ubGVuZ3RoO3IrKyluW3JdPXRoaXMuX2hvbGVzW3JdLmNvcHkoKTtyZXR1cm4gbmV3IGUodCxuLHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5nZXRFeHRlcmlvclJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hlbGx9LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hlbGwuaXNFbXB0eSgpfSxlLnByb3RvdHlwZS5nZXRJbnRlcmlvclJpbmdOPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ob2xlc1t0XX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbHNdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4MzA3ZmZlZmQ4ZGM5NzIwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShpbyksZnM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIGlvLlNPUlRJTkRFWF9NVUxUSVBPSU5UfSxlLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4hIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MoZSkmJnQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmNhbGwodGhpcyxlLG4pfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl9nZW9tZXRyaWVzW2VdLmdldENvb3JkaW5hdGUoKX1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIEdvLkZBTFNFfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKG51bGwpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTXVsdGlQb2ludCJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoKS5maWxsKG51bGwpLG49MDtuPHQubGVuZ3RoO24rKyl0W25dPXRoaXMuX2dlb21ldHJpZXNbbl0uY29weSgpO3JldHVybiBuZXcgZSh0LHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt1c119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHg2ZmIxZWQ0MTYyZTBmYzAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KEhvKSxwcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7ZSBpbnN0YW5jZW9mIHZpJiZuIGluc3RhbmNlb2YgSXMmJihlPW4uZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShlKSksdC5jYWxsKHRoaXMsZSxuKSx0aGlzLnZhbGlkYXRlQ29uc3RydWN0aW9uKCl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e01JTklNVU1fVkFMSURfU0laRTp7Y29uZmlndXJhYmxlOiEwfSxzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIGlvLlNPUlRJTkRFWF9MSU5FQVJSSU5HfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiBHby5GQUxTRX0sZS5wcm90b3R5cGUuaXNDbG9zZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuaXNFbXB0eSgpfHx0LnByb3RvdHlwZS5pc0Nsb3NlZC5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcG9pbnRzLmNvcHkoKTtyZXR1cm4gc3MucmV2ZXJzZSh0KSx0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lYXJSaW5nKHQpfSxlLnByb3RvdHlwZS52YWxpZGF0ZUNvbnN0cnVjdGlvbj1mdW5jdGlvbigpe2lmKCF0aGlzLmlzRW1wdHkoKSYmIXQucHJvdG90eXBlLmlzQ2xvc2VkLmNhbGwodGhpcykpdGhyb3cgbmV3IGhpO2lmKHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkuc2l6ZSgpPj0xJiZ0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLnNpemUoKTxlLk1JTklNVU1fVkFMSURfU0laRSl0aHJvdyBuZXcgaGkoIkludmFsaWQgbnVtYmVyIG9mIHBvaW50cyBpbiBMaW5lYXJSaW5nIChmb3VuZCAiK3RoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkuc2l6ZSgpKyIgLSBtdXN0IGJlIDAgb3IgPj0gNCkiKX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIkxpbmVhclJpbmcifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKHRoaXMuX3BvaW50cy5jb3B5KCksdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uTUlOSU1VTV9WQUxJRF9TSVpFLmdldD1mdW5jdGlvbigpe3JldHVybiA0fSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4M2IyMjllMjYyMzY3YTYwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShhcyksZHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIGlvLlNPUlRJTkRFWF9NVUxUSVBPTFlHT059LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4hIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MoZSkmJnQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmNhbGwodGhpcyxlLG4pfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDF9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAyfSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dlb21ldHJpZXMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLmZpbGwobnVsbCksbj0wO248dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7bisrKWVbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5yZXZlcnNlKCk7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpUG9seWdvbihlKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKCk7Zm9yKHZhciB0PW5ldyB4byxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspZm9yKHZhciBuPXRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0Qm91bmRhcnkoKSxyPTA7cjxuLmdldE51bUdlb21ldHJpZXMoKTtyKyspdC5hZGQobi5nZXRHZW9tZXRyeU4ocikpO3ZhciBpPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKHQudG9BcnJheShpKSl9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJNdWx0aVBvbHlnb24ifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCkuZmlsbChudWxsKSxuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXT10aGlzLl9nZW9tZXRyaWVzW25dLmNvcHkoKTtyZXR1cm4gbmV3IGUodCx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbHNdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4N2E1YWExMzY5MTcxOTgwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KEhvKSxncz1mdW5jdGlvbih0KXt0aGlzLl9mYWN0b3J5PXR8fG51bGwsdGhpcy5faXNVc2VyRGF0YUNvcGllZD0hMX0seXM9e05vT3BHZW9tZXRyeU9wZXJhdGlvbjp7Y29uZmlndXJhYmxlOiEwfSxDb29yZGluYXRlT3BlcmF0aW9uOntjb25maWd1cmFibGU6ITB9LENvb3JkaW5hdGVTZXF1ZW5jZU9wZXJhdGlvbjp7Y29uZmlndXJhYmxlOiEwfX07Z3MucHJvdG90eXBlLnNldENvcHlVc2VyRGF0YT1mdW5jdGlvbih0KXt0aGlzLl9pc1VzZXJEYXRhQ29waWVkPXR9LGdzLnByb3RvdHlwZS5lZGl0PWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09PXQpcmV0dXJuIG51bGw7dmFyIG49dGhpcy5lZGl0SW50ZXJuYWwodCxlKTtyZXR1cm4gdGhpcy5faXNVc2VyRGF0YUNvcGllZCYmbi5zZXRVc2VyRGF0YSh0LmdldFVzZXJEYXRhKCkpLG59LGdzLnByb3RvdHlwZS5lZGl0SW50ZXJuYWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09PXRoaXMuX2ZhY3RvcnkmJih0aGlzLl9mYWN0b3J5PXQuZ2V0RmFjdG9yeSgpKSx0IGluc3RhbmNlb2YgSG8/dGhpcy5lZGl0R2VvbWV0cnlDb2xsZWN0aW9uKHQsZSk6dCBpbnN0YW5jZW9mIGhzP3RoaXMuZWRpdFBvbHlnb24odCxlKTp0IGluc3RhbmNlb2YgY3N8fHQgaW5zdGFuY2VvZiBhcz9lLmVkaXQodCx0aGlzLl9mYWN0b3J5KTooWmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoIlVuc3VwcG9ydGVkIEdlb21ldHJ5IGNsYXNzOiAiK3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLG51bGwpfSxncy5wcm90b3R5cGUuZWRpdEdlb21ldHJ5Q29sbGVjdGlvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLmVkaXQodCx0aGlzLl9mYWN0b3J5KSxyPW5ldyB4byxpPTA7aTxuLmdldE51bUdlb21ldHJpZXMoKTtpKyspe3ZhciBvPXRoaXMuZWRpdChuLmdldEdlb21ldHJ5TihpKSxlKTtudWxsPT09b3x8by5pc0VtcHR5KCl8fHIuYWRkKG8pfXJldHVybiBuLmdldENsYXNzKCk9PT1mcz90aGlzLl9mYWN0b3J5LmNyZWF0ZU11bHRpUG9pbnQoci50b0FycmF5KFtdKSk6bi5nZXRDbGFzcygpPT09Wm8/dGhpcy5fZmFjdG9yeS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcoci50b0FycmF5KFtdKSk6bi5nZXRDbGFzcygpPT09ZHM/dGhpcy5fZmFjdG9yeS5jcmVhdGVNdWx0aVBvbHlnb24oci50b0FycmF5KFtdKSk6dGhpcy5fZmFjdG9yeS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oci50b0FycmF5KFtdKSl9LGdzLnByb3RvdHlwZS5lZGl0UG9seWdvbj1mdW5jdGlvbih0LGUpe3ZhciBuPWUuZWRpdCh0LHRoaXMuX2ZhY3RvcnkpO2lmKG51bGw9PT1uJiYobj10aGlzLl9mYWN0b3J5LmNyZWF0ZVBvbHlnb24obnVsbCkpLG4uaXNFbXB0eSgpKXJldHVybiBuO3ZhciByPXRoaXMuZWRpdChuLmdldEV4dGVyaW9yUmluZygpLGUpO2lmKG51bGw9PT1yfHxyLmlzRW1wdHkoKSlyZXR1cm4gdGhpcy5fZmFjdG9yeS5jcmVhdGVQb2x5Z29uKCk7Zm9yKHZhciBpPW5ldyB4byxvPTA7bzxuLmdldE51bUludGVyaW9yUmluZygpO28rKyl7dmFyIHM9dGhpcy5lZGl0KG4uZ2V0SW50ZXJpb3JSaW5nTihvKSxlKTtudWxsPT09c3x8cy5pc0VtcHR5KCl8fGkuYWRkKHMpfXJldHVybiB0aGlzLl9mYWN0b3J5LmNyZWF0ZVBvbHlnb24ocixpLnRvQXJyYXkoW10pKX0sZ3MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGdzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBnc30sZ3MuR2VvbWV0cnlFZGl0b3JPcGVyYXRpb249ZnVuY3Rpb24oKXt9LHlzLk5vT3BHZW9tZXRyeU9wZXJhdGlvbi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbXN9LHlzLkNvb3JkaW5hdGVPcGVyYXRpb24uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHZzfSx5cy5Db29yZGluYXRlU2VxdWVuY2VPcGVyYXRpb24uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIF9zfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhncyx5cyk7dmFyIG1zPWZ1bmN0aW9uKCl7fTttcy5wcm90b3R5cGUuZWRpdD1mdW5jdGlvbih0LGUpe3JldHVybiB0fSxtcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZ3MuR2VvbWV0cnlFZGl0b3JPcGVyYXRpb25dfSxtcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbXN9O3ZhciB2cz1mdW5jdGlvbigpe307dnMucHJvdG90eXBlLmVkaXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmVkaXRDb29yZGluYXRlcyh0LmdldENvb3JkaW5hdGVzKCksdCk7cmV0dXJuIG51bGw9PT1uP3Q6dCBpbnN0YW5jZW9mIHBzP2UuY3JlYXRlTGluZWFyUmluZyhuKTp0IGluc3RhbmNlb2YgYXM/ZS5jcmVhdGVMaW5lU3RyaW5nKG4pOnQgaW5zdGFuY2VvZiBjcz9uLmxlbmd0aD4wP2UuY3JlYXRlUG9pbnQoblswXSk6ZS5jcmVhdGVQb2ludCgpOnR9LHZzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltncy5HZW9tZXRyeUVkaXRvck9wZXJhdGlvbl19LHZzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB2c307dmFyIF9zPWZ1bmN0aW9uKCl7fTtfcy5wcm90b3R5cGUuZWRpdD1mdW5jdGlvbih0LGUpe3JldHVybiB0IGluc3RhbmNlb2YgcHM/ZS5jcmVhdGVMaW5lYXJSaW5nKHRoaXMuZWRpdCh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpKTp0IGluc3RhbmNlb2YgYXM/ZS5jcmVhdGVMaW5lU3RyaW5nKHRoaXMuZWRpdCh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpKTp0IGluc3RhbmNlb2YgY3M/ZS5jcmVhdGVQb2ludCh0aGlzLmVkaXQodC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KSk6dH0sX3MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2dzLkdlb21ldHJ5RWRpdG9yT3BlcmF0aW9uXX0sX3MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIF9zfTt2YXIgeHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHRoaXMuX2RpbWVuc2lvbj0zLHRoaXMuX2Nvb3JkaW5hdGVzPW51bGwsMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpdGhpcy5fY29vcmRpbmF0ZXM9YXJndW1lbnRzWzBdLHRoaXMuX2RpbWVuc2lvbj0zO2Vsc2UgaWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5fY29vcmRpbmF0ZXM9bmV3IEFycmF5KGUpLmZpbGwobnVsbCk7Zm9yKHZhciBuPTA7bjxlO24rKyl0Ll9jb29yZGluYXRlc1tuXT1uZXcgdml9ZWxzZSBpZihFaShhcmd1bWVudHNbMF0sTGkpKXt2YXIgcj1hcmd1bWVudHNbMF07aWYobnVsbD09PXIpcmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzPW5ldyBBcnJheSgwKS5maWxsKG51bGwpLG51bGw7dGhpcy5fZGltZW5zaW9uPXIuZ2V0RGltZW5zaW9uKCksdGhpcy5fY29vcmRpbmF0ZXM9bmV3IEFycmF5KHIuc2l6ZSgpKS5maWxsKG51bGwpO2Zvcih2YXIgaT0wO2k8dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2krKyl0Ll9jb29yZGluYXRlc1tpXT1yLmdldENvb3JkaW5hdGVDb3B5KGkpfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJk51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzFdKSl7dmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdO3RoaXMuX2Nvb3JkaW5hdGVzPW8sdGhpcy5fZGltZW5zaW9uPXMsbnVsbD09PW8mJih0aGlzLl9jb29yZGluYXRlcz1uZXcgQXJyYXkoMCkuZmlsbChudWxsKSl9ZWxzZSBpZihOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkmJk51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzFdKSl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdO3RoaXMuX2Nvb3JkaW5hdGVzPW5ldyBBcnJheShhKS5maWxsKG51bGwpLHRoaXMuX2RpbWVuc2lvbj11O2Zvcih2YXIgYz0wO2M8YTtjKyspdC5fY29vcmRpbmF0ZXNbY109bmV3IHZpfX0sd3M9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3hzLnByb3RvdHlwZS5zZXRPcmRpbmF0ZT1mdW5jdGlvbih0LGUsbil7c3dpdGNoKGUpe2Nhc2UgTGkuWDp0aGlzLl9jb29yZGluYXRlc1t0XS54PW47YnJlYWs7Y2FzZSBMaS5ZOnRoaXMuX2Nvb3JkaW5hdGVzW3RdLnk9bjticmVhaztjYXNlIExpLlo6dGhpcy5fY29vcmRpbmF0ZXNbdF0uej1uO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGhpfX0seHMucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RofSx4cy5wcm90b3R5cGUuZ2V0T3JkaW5hdGU9ZnVuY3Rpb24odCxlKXtzd2l0Y2goZSl7Y2FzZSBMaS5YOnJldHVybiB0aGlzLl9jb29yZGluYXRlc1t0XS54O2Nhc2UgTGkuWTpyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF0ueTtjYXNlIExpLlo6cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdLnp9cmV0dXJuIGZpLk5hTn0seHMucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl9jb29yZGluYXRlc1t0XX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO24ueD10aGlzLl9jb29yZGluYXRlc1tlXS54LG4ueT10aGlzLl9jb29yZGluYXRlc1tlXS55LG4uej10aGlzLl9jb29yZGluYXRlc1tlXS56fX0seHMucHJvdG90eXBlLmdldENvb3JkaW5hdGVDb3B5PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgdmkodGhpcy5fY29vcmRpbmF0ZXNbdF0pfSx4cy5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpbWVuc2lvbn0seHMucHJvdG90eXBlLmdldFg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdLnh9LHhzLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5zaXplKCkpLmZpbGwobnVsbCksZT0wO2U8dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2UrKyl0W2VdPXRoaXMuX2Nvb3JkaW5hdGVzW2VdLmNsb25lKCk7cmV0dXJuIG5ldyB4cyh0LHRoaXMuX2RpbWVuc2lvbil9LHhzLnByb3RvdHlwZS5leHBhbmRFbnZlbG9wZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtlKyspdC5leHBhbmRUb0luY2x1ZGUodGhpcy5fY29vcmRpbmF0ZXNbZV0pO3JldHVybiB0fSx4cy5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5zaXplKCkpLmZpbGwobnVsbCksZT0wO2U8dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2UrKyl0W2VdPXRoaXMuX2Nvb3JkaW5hdGVzW2VdLmNvcHkoKTtyZXR1cm4gbmV3IHhzKHQsdGhpcy5fZGltZW5zaW9uKX0seHMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYodGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoPjApe3ZhciB0PW5ldyBBaSgxNyp0aGlzLl9jb29yZGluYXRlcy5sZW5ndGgpO3QuYXBwZW5kKCIoIiksdC5hcHBlbmQodGhpcy5fY29vcmRpbmF0ZXNbMF0pO2Zvcih2YXIgZT0xO2U8dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoO2UrKyl0LmFwcGVuZCgiLCAiKSx0LmFwcGVuZCh0aGlzLl9jb29yZGluYXRlc1tlXSk7cmV0dXJuIHQuYXBwZW5kKCIpIiksdC50b1N0cmluZygpfXJldHVybiIoKSJ9LHhzLnByb3RvdHlwZS5nZXRZPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jb29yZGluYXRlc1t0XS55fSx4cy5wcm90b3R5cGUudG9Db29yZGluYXRlQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXN9LHhzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltMaSxtaV19LHhzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB4c30sd3Muc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHhjYjQ0YTc3OGRiMThlMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHhzLHdzKTt2YXIgYnM9ZnVuY3Rpb24oKXt9LERzPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LGluc3RhbmNlT2JqZWN0Ontjb25maWd1cmFibGU6ITB9fTticy5wcm90b3R5cGUucmVhZFJlc29sdmU9ZnVuY3Rpb24oKXtyZXR1cm4gYnMuaW5zdGFuY2UoKX0sYnMucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXJldHVybiBuZXcgeHMoYXJndW1lbnRzWzBdKTtpZihFaShhcmd1bWVudHNbMF0sTGkpKXJldHVybiBuZXcgeHMoYXJndW1lbnRzWzBdKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07cmV0dXJuIGU+MyYmKGU9MyksZTwyP25ldyB4cyh0KTpuZXcgeHModCxlKX19LGJzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt3aSxtaV19LGJzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBic30sYnMuaW5zdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gYnMuaW5zdGFuY2VPYmplY3R9LERzLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4MzhlNDlmYTZjZjZmMmUwMH0sRHMuaW5zdGFuY2VPYmplY3QuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBic30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYnMsRHMpO3ZhciBFcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMubWFwXz1uZXcgTWFwfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFwXy5nZXQodCl8fG51bGx9LGUucHJvdG90eXBlLnB1dD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1hcF8uc2V0KHQsZSksZX0sZS5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyB4byxlPXRoaXMubWFwXy52YWx1ZXMoKSxuPWUubmV4dCgpOyFuLmRvbmU7KXQuYWRkKG4udmFsdWUpLG49ZS5uZXh0KCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmVudHJ5U2V0PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEZvO3JldHVybiB0aGlzLm1hcF8uZW50cmllcygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmFkZChlKX0pKSx0fSxlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwXy5zaXplKCl9LGV9KEFvKSxDcz1mdW5jdGlvbiB0KCl7aWYodGhpcy5fbW9kZWxUeXBlPW51bGwsdGhpcy5fc2NhbGU9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLl9tb2RlbFR5cGU9dC5GTE9BVElORztlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXMpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9tb2RlbFR5cGU9ZSxlPT09dC5GSVhFRCYmdGhpcy5zZXRTY2FsZSgxKX1lbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5fbW9kZWxUeXBlPXQuRklYRUQsdGhpcy5zZXRTY2FsZShuKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCl7dmFyIHI9YXJndW1lbnRzWzBdO3RoaXMuX21vZGVsVHlwZT1yLl9tb2RlbFR5cGUsdGhpcy5fc2NhbGU9ci5fc2NhbGV9fSxTcz17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxtYXhpbXVtUHJlY2lzZVZhbHVlOntjb25maWd1cmFibGU6ITB9fTtDcy5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIENzKSlyZXR1cm4hMTt2YXIgZT10O3JldHVybiB0aGlzLl9tb2RlbFR5cGU9PT1lLl9tb2RlbFR5cGUmJnRoaXMuX3NjYWxlPT09ZS5fc2NhbGV9LENzLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dCxuPXRoaXMuZ2V0TWF4aW11bVNpZ25pZmljYW50RGlnaXRzKCkscj1lLmdldE1heGltdW1TaWduaWZpY2FudERpZ2l0cygpO3JldHVybiBuZXcgTmkobikuY29tcGFyZVRvKG5ldyBOaShyKSl9LENzLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZX0sQ3MucHJvdG90eXBlLmlzRmxvYXRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkd8fHRoaXMuX21vZGVsVHlwZT09PUNzLkZMT0FUSU5HX1NJTkdMRX0sQ3MucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9kZWxUeXBlfSxDcy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0iVU5LTk9XTiI7cmV0dXJuIHRoaXMuX21vZGVsVHlwZT09PUNzLkZMT0FUSU5HP3Q9IkZsb2F0aW5nIjp0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GTE9BVElOR19TSU5HTEU/dD0iRmxvYXRpbmctU2luZ2xlIjp0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GSVhFRCYmKHQ9IkZpeGVkIChTY2FsZT0iK3RoaXMuZ2V0U2NhbGUoKSsiKSIpLHR9LENzLnByb3RvdHlwZS5tYWtlUHJlY2lzZT1mdW5jdGlvbigpe2lmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGZpLmlzTmFOKHQpfHx0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GTE9BVElOR19TSU5HTEU/dDp0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GSVhFRD9NYXRoLnJvdW5kKHQqdGhpcy5fc2NhbGUpL3RoaXMuX3NjYWxlOnR9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIGU9YXJndW1lbnRzWzBdO2lmKHRoaXMuX21vZGVsVHlwZT09PUNzLkZMT0FUSU5HKXJldHVybiBudWxsO2UueD10aGlzLm1ha2VQcmVjaXNlKGUueCksZS55PXRoaXMubWFrZVByZWNpc2UoZS55KX19LENzLnByb3RvdHlwZS5nZXRNYXhpbXVtU2lnbmlmaWNhbnREaWdpdHM9ZnVuY3Rpb24oKXt2YXIgdD0xNjtyZXR1cm4gdGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkc/dD0xNjp0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GTE9BVElOR19TSU5HTEU/dD02OnRoaXMuX21vZGVsVHlwZT09PUNzLkZJWEVEJiYodD0xK01hdGgudHJ1bmMoTWF0aC5jZWlsKE1hdGgubG9nKHRoaXMuZ2V0U2NhbGUoKSkvTWF0aC5sb2coMTApKSkpLHR9LENzLnByb3RvdHlwZS5zZXRTY2FsZT1mdW5jdGlvbih0KXt0aGlzLl9zY2FsZT1NYXRoLmFicyh0KX0sQ3MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW21pLGRpXX0sQ3MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIENzfSxDcy5tb3N0UHJlY2lzZT1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNvbXBhcmVUbyhlKT49MD90OmV9LFNzLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NmJlZTY0MDRlOWEyNWMwMH0sU3MubWF4aW11bVByZWNpc2VWYWx1ZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gOTAwNzE5OTI1NDc0MDk5Mn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ3MsU3MpO3ZhciBBcz1mdW5jdGlvbiB0KGUpe3RoaXMuX25hbWU9ZXx8bnVsbCx0Lm5hbWVUb1R5cGVNYXAucHV0KGUsdGhpcyl9LE5zPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LG5hbWVUb1R5cGVNYXA6e2NvbmZpZ3VyYWJsZTohMH19O0FzLnByb3RvdHlwZS5yZWFkUmVzb2x2ZT1mdW5jdGlvbigpe3JldHVybiBBcy5uYW1lVG9UeXBlTWFwLmdldCh0aGlzLl9uYW1lKX0sQXMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25hbWV9LEFzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblttaV19LEFzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBBc30sTnMuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tNTUyODYwMjYzMTczMTU5ZTR9LE5zLm5hbWVUb1R5cGVNYXAuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFc30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQXMsTnMpLENzLlR5cGU9QXMsQ3MuRklYRUQ9bmV3IEFzKCJGSVhFRCIpLENzLkZMT0FUSU5HPW5ldyBBcygiRkxPQVRJTkciKSxDcy5GTE9BVElOR19TSU5HTEU9bmV3IEFzKCJGTE9BVElORyBTSU5HTEUiKTt2YXIgSXM9ZnVuY3Rpb24gdCgpe3RoaXMuX3ByZWNpc2lvbk1vZGVsPW5ldyBDcyx0aGlzLl9TUklEPTAsdGhpcy5fY29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeT10LmdldERlZmF1bHRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCksMD09PWFyZ3VtZW50cy5sZW5ndGh8fCgxPT09YXJndW1lbnRzLmxlbmd0aD9FaShhcmd1bWVudHNbMF0sd2kpP3RoaXMuX2Nvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnk9YXJndW1lbnRzWzBdOmFyZ3VtZW50c1swXWluc3RhbmNlb2YgQ3MmJih0aGlzLl9wcmVjaXNpb25Nb2RlbD1hcmd1bWVudHNbMF0pOjI9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9wcmVjaXNpb25Nb2RlbD1hcmd1bWVudHNbMF0sdGhpcy5fU1JJRD1hcmd1bWVudHNbMV0pOjM9PT1hcmd1bWVudHMubGVuZ3RoJiYodGhpcy5fcHJlY2lzaW9uTW9kZWw9YXJndW1lbnRzWzBdLHRoaXMuX1NSSUQ9YXJndW1lbnRzWzFdLHRoaXMuX2Nvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnk9YXJndW1lbnRzWzJdKSl9LE1zPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtJcy5wcm90b3R5cGUudG9HZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdC5pc051bGwoKT90aGlzLmNyZWF0ZVBvaW50KG51bGwpOnQuZ2V0TWluWCgpPT09dC5nZXRNYXhYKCkmJnQuZ2V0TWluWSgpPT09dC5nZXRNYXhZKCk/dGhpcy5jcmVhdGVQb2ludChuZXcgdmkodC5nZXRNaW5YKCksdC5nZXRNaW5ZKCkpKTp0LmdldE1pblgoKT09PXQuZ2V0TWF4WCgpfHx0LmdldE1pblkoKT09PXQuZ2V0TWF4WSgpP3RoaXMuY3JlYXRlTGluZVN0cmluZyhbbmV3IHZpKHQuZ2V0TWluWCgpLHQuZ2V0TWluWSgpKSxuZXcgdmkodC5nZXRNYXhYKCksdC5nZXRNYXhZKCkpXSk6dGhpcy5jcmVhdGVQb2x5Z29uKHRoaXMuY3JlYXRlTGluZWFyUmluZyhbbmV3IHZpKHQuZ2V0TWluWCgpLHQuZ2V0TWluWSgpKSxuZXcgdmkodC5nZXRNaW5YKCksdC5nZXRNYXhZKCkpLG5ldyB2aSh0LmdldE1heFgoKSx0LmdldE1heFkoKSksbmV3IHZpKHQuZ2V0TWF4WCgpLHQuZ2V0TWluWSgpKSxuZXcgdmkodC5nZXRNaW5YKCksdC5nZXRNaW5ZKCkpXSksbnVsbCl9LElzLnByb3RvdHlwZS5jcmVhdGVMaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0P3QgaW5zdGFuY2VvZiBBcnJheT9uZXcgYXModGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKHQpLHRoaXMpOkVpKHQsTGkpP25ldyBhcyh0LHRoaXMpOnZvaWQgMDpuZXcgYXModGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFtdKSx0aGlzKX0sSXMucHJvdG90eXBlLmNyZWF0ZU11bHRpTGluZVN0cmluZz1mdW5jdGlvbigpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgWm8obnVsbCx0aGlzKToxPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgWm8oYXJndW1lbnRzWzBdLHRoaXMpOnZvaWQgMH0sSXMucHJvdG90eXBlLmJ1aWxkR2VvbWV0cnk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW51bGwsbj0hMSxyPSExLGk9dC5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCkscz1vLmdldENsYXNzKCk7bnVsbD09PWUmJihlPXMpLHMhPT1lJiYobj0hMCksby5pc0dlb21ldHJ5Q29sbGVjdGlvbk9yRGVyaXZlZCgpJiYocj0hMCl9aWYobnVsbD09PWUpcmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKCk7aWYobnx8cilyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oSXMudG9HZW9tZXRyeUFycmF5KHQpKTt2YXIgYT10Lml0ZXJhdG9yKCkubmV4dCgpO2lmKHQuc2l6ZSgpPjEpe2lmKGEgaW5zdGFuY2VvZiBocylyZXR1cm4gdGhpcy5jcmVhdGVNdWx0aVBvbHlnb24oSXMudG9Qb2x5Z29uQXJyYXkodCkpO2lmKGEgaW5zdGFuY2VvZiBhcylyZXR1cm4gdGhpcy5jcmVhdGVNdWx0aUxpbmVTdHJpbmcoSXMudG9MaW5lU3RyaW5nQXJyYXkodCkpO2lmKGEgaW5zdGFuY2VvZiBjcylyZXR1cm4gdGhpcy5jcmVhdGVNdWx0aVBvaW50KElzLnRvUG9pbnRBcnJheSh0KSk7Wmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoIlVuaGFuZGxlZCBjbGFzczogIithLmdldENsYXNzKCkuZ2V0TmFtZSgpKX1yZXR1cm4gYX0sSXMucHJvdG90eXBlLmNyZWF0ZU11bHRpUG9pbnRGcm9tQ29vcmRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNyZWF0ZU11bHRpUG9pbnQobnVsbCE9PXQ/dGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKHQpOm51bGwpfSxJcy5wcm90b3R5cGUuY3JlYXRlUG9pbnQ9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5jcmVhdGVQb2ludCh0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUoW10pKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNyZWF0ZVBvaW50KG51bGwhPT10P3RoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbdF0pOm51bGwpfWlmKEVpKGFyZ3VtZW50c1swXSxMaSkpcmV0dXJuIG5ldyBjcyhhcmd1bWVudHNbMF0sdGhpcyl9fSxJcy5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5fSxJcy5wcm90b3R5cGUuY3JlYXRlUG9seWdvbj1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBuZXcgaHMobnVsbCxudWxsLHRoaXMpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihFaShhcmd1bWVudHNbMF0sTGkpKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlUG9seWdvbih0aGlzLmNyZWF0ZUxpbmVhclJpbmcodCkpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVQb2x5Z29uKHRoaXMuY3JlYXRlTGluZWFyUmluZyhlKSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBwcyl7dmFyIG49YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNyZWF0ZVBvbHlnb24obixudWxsKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7cmV0dXJuIG5ldyBocyhhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdLHRoaXMpfX0sSXMucHJvdG90eXBlLmdldFNSSUQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fU1JJRH0sSXMucHJvdG90eXBlLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgSG8obnVsbCx0aGlzKToxPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgSG8oYXJndW1lbnRzWzBdLHRoaXMpOnZvaWQgMH0sSXMucHJvdG90eXBlLmNyZWF0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZ3ModGhpcykuZWRpdCh0LHtlZGl0OmZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeS5jcmVhdGUodCl9fX0pfSxJcy5wcm90b3R5cGUuZ2V0UHJlY2lzaW9uTW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJlY2lzaW9uTW9kZWx9LElzLnByb3RvdHlwZS5jcmVhdGVMaW5lYXJSaW5nPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuY3JlYXRlTGluZWFyUmluZyh0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUoW10pKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNyZWF0ZUxpbmVhclJpbmcobnVsbCE9PXQ/dGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKHQpOm51bGwpfWlmKEVpKGFyZ3VtZW50c1swXSxMaSkpcmV0dXJuIG5ldyBwcyhhcmd1bWVudHNbMF0sdGhpcyl9fSxJcy5wcm90b3R5cGUuY3JlYXRlTXVsdGlQb2x5Z29uPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBkcyhudWxsLHRoaXMpOjE9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBkcyhhcmd1bWVudHNbMF0sdGhpcyk6dm9pZCAwfSxJcy5wcm90b3R5cGUuY3JlYXRlTXVsdGlQb2ludD1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBuZXcgZnMobnVsbCx0aGlzKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gbmV3IGZzKGFyZ3VtZW50c1swXSx0aGlzKTtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChudWxsIT09dD90aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUodCk6bnVsbCl9aWYoRWkoYXJndW1lbnRzWzBdLExpKSl7dmFyIGU9YXJndW1lbnRzWzBdO2lmKG51bGw9PT1lKXJldHVybiB0aGlzLmNyZWF0ZU11bHRpUG9pbnQobmV3IEFycmF5KDApLmZpbGwobnVsbCkpO2Zvcih2YXIgbj1uZXcgQXJyYXkoZS5zaXplKCkpLmZpbGwobnVsbCkscj0wO3I8ZS5zaXplKCk7cisrKXt2YXIgaT10aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUoMSxlLmdldERpbWVuc2lvbigpKTtzcy5jb3B5KGUscixpLDAsMSksbltyXT10aGlzLmNyZWF0ZVBvaW50KGkpfXJldHVybiB0aGlzLmNyZWF0ZU11bHRpUG9pbnQobil9fX0sSXMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW21pXX0sSXMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIElzfSxJcy50b011bHRpUG9seWdvbkFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy50b0dlb21ldHJ5QXJyYXk9ZnVuY3Rpb24odCl7aWYobnVsbD09PXQpcmV0dXJuIG51bGw7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LElzLmdldERlZmF1bHRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5PWZ1bmN0aW9uKCl7cmV0dXJuIGJzLmluc3RhbmNlKCl9LElzLnRvTXVsdGlMaW5lU3RyaW5nQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LElzLnRvTGluZVN0cmluZ0FycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy50b011bHRpUG9pbnRBcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMudG9MaW5lYXJSaW5nQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LElzLnRvUG9pbnRBcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMudG9Qb2x5Z29uQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LElzLmNyZWF0ZVBvaW50RnJvbUludGVybmFsQ29vcmQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRQcmVjaXNpb25Nb2RlbCgpLm1ha2VQcmVjaXNlKHQpLGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZVBvaW50KHQpfSxNcy5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDVlYTc1ZjIwNTFlZWI0MDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKElzLE1zKTt2YXIgRnM9ZnVuY3Rpb24oKXt9LFRzPXtPTjp7Y29uZmlndXJhYmxlOiEwfSxMRUZUOntjb25maWd1cmFibGU6ITB9LFJJR0hUOntjb25maWd1cmFibGU6ITB9fTtmdW5jdGlvbiBPcyh0KXt0aGlzLm1lc3NhZ2U9dHx8IiJ9ZnVuY3Rpb24gTHMoKXt0aGlzLmFycmF5Xz1bXX1Gcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRnMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEZzfSxGcy5vcHBvc2l0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdD09PUZzLkxFRlQ/RnMuUklHSFQ6dD09PUZzLlJJR0hUP0ZzLkxFRlQ6dH0sVHMuT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LFRzLkxFRlQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LFRzLlJJR0hULmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGcyxUcyksT3MucHJvdG90eXBlPW5ldyBFcnJvcixPcy5wcm90b3R5cGUubmFtZT0iRW1wdHlTdGFja0V4Y2VwdGlvbiIsTHMucHJvdG90eXBlPW5ldyB2byxMcy5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFycmF5Xy5wdXNoKHQpLCEwfSxMcy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2lmKHQ8MHx8dD49dGhpcy5zaXplKCkpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLmFycmF5X1t0XX0sTHMucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXJyYXlfLnB1c2godCksdH0sTHMucHJvdG90eXBlLnBvcD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5hcnJheV8ubGVuZ3RoKXRocm93IG5ldyBPcztyZXR1cm4gdGhpcy5hcnJheV8ucG9wKCl9LExzLnByb3RvdHlwZS5wZWVrPWZ1bmN0aW9uKCl7aWYoMD09PXRoaXMuYXJyYXlfLmxlbmd0aCl0aHJvdyBuZXcgT3M7cmV0dXJuIHRoaXMuYXJyYXlfW3RoaXMuYXJyYXlfLmxlbmd0aC0xXX0sTHMucHJvdG90eXBlLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmFycmF5Xy5sZW5ndGh9LExzLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1wdHkoKX0sTHMucHJvdG90eXBlLnNlYXJjaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hcnJheV8uaW5kZXhPZih0KX0sTHMucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcnJheV8ubGVuZ3RofSxMcy5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl0LnB1c2godGhpcy5hcnJheV9bZV0pO3JldHVybiB0fTt2YXIgUHM9ZnVuY3Rpb24oKXt0aGlzLl9taW5JbmRleD0tMSx0aGlzLl9taW5Db29yZD1udWxsLHRoaXMuX21pbkRlPW51bGwsdGhpcy5fb3JpZW50ZWREZT1udWxsfTtQcy5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5Db29yZH0sUHMucHJvdG90eXBlLmdldFJpZ2h0bW9zdFNpZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldFJpZ2h0bW9zdFNpZGVPZlNlZ21lbnQodCxlKTtyZXR1cm4gbjwwJiYobj10aGlzLmdldFJpZ2h0bW9zdFNpZGVPZlNlZ21lbnQodCxlLTEpKSxuPDAmJih0aGlzLl9taW5Db29yZD1udWxsLHRoaXMuY2hlY2tGb3JSaWdodG1vc3RDb29yZGluYXRlKHQpKSxufSxQcy5wcm90b3R5cGUuZmluZFJpZ2h0bW9zdEVkZ2VBdFZlcnRleD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX21pbkRlLmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpO1ppLmlzVHJ1ZSh0aGlzLl9taW5JbmRleD4wJiZ0aGlzLl9taW5JbmRleDx0Lmxlbmd0aCwicmlnaHRtb3N0IHBvaW50IGV4cGVjdGVkIHRvIGJlIGludGVyaW9yIHZlcnRleCBvZiBlZGdlIik7dmFyIGU9dFt0aGlzLl9taW5JbmRleC0xXSxuPXRbdGhpcy5fbWluSW5kZXgrMV0scj1lby5jb21wdXRlT3JpZW50YXRpb24odGhpcy5fbWluQ29vcmQsbixlKSxpPSExOyhlLnk8dGhpcy5fbWluQ29vcmQueSYmbi55PHRoaXMuX21pbkNvb3JkLnkmJnI9PT1lby5DT1VOVEVSQ0xPQ0tXSVNFfHxlLnk+dGhpcy5fbWluQ29vcmQueSYmbi55PnRoaXMuX21pbkNvb3JkLnkmJnI9PT1lby5DTE9DS1dJU0UpJiYoaT0hMCksaSYmKHRoaXMuX21pbkluZGV4PXRoaXMuX21pbkluZGV4LTEpfSxQcy5wcm90b3R5cGUuZ2V0UmlnaHRtb3N0U2lkZU9mU2VnbWVudD1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0RWRnZSgpLmdldENvb3JkaW5hdGVzKCk7aWYoZTwwfHxlKzE+PW4ubGVuZ3RofHxuW2VdLnk9PT1uW2UrMV0ueSlyZXR1cm4tMTt2YXIgcj1Gcy5MRUZUO3JldHVybiBuW2VdLnk8bltlKzFdLnkmJihyPUZzLlJJR0hUKSxyfSxQcy5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9vcmllbnRlZERlfSxQcy5wcm90b3R5cGUuY2hlY2tGb3JSaWdodG1vc3RDb29yZGluYXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49dC5nZXRFZGdlKCkuZ2V0Q29vcmRpbmF0ZXMoKSxyPTA7cjxuLmxlbmd0aC0xO3IrKykobnVsbD09PWUuX21pbkNvb3JkfHxuW3JdLng+ZS5fbWluQ29vcmQueCkmJihlLl9taW5EZT10LGUuX21pbkluZGV4PXIsZS5fbWluQ29vcmQ9bltyXSl9LFBzLnByb3RvdHlwZS5maW5kUmlnaHRtb3N0RWRnZUF0Tm9kZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX21pbkRlLmdldE5vZGUoKS5nZXRFZGdlcygpO3RoaXMuX21pbkRlPXQuZ2V0UmlnaHRtb3N0RWRnZSgpLHRoaXMuX21pbkRlLmlzRm9yd2FyZCgpfHwodGhpcy5fbWluRGU9dGhpcy5fbWluRGUuZ2V0U3ltKCksdGhpcy5fbWluSW5kZXg9dGhpcy5fbWluRGUuZ2V0RWRnZSgpLmdldENvb3JkaW5hdGVzKCkubGVuZ3RoLTEpfSxQcy5wcm90b3R5cGUuZmluZEVkZ2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpOyFuLmlzRm9yd2FyZCgpfHx0aGlzLmNoZWNrRm9yUmlnaHRtb3N0Q29vcmRpbmF0ZShuKX1aaS5pc1RydWUoMCE9PXRoaXMuX21pbkluZGV4fHx0aGlzLl9taW5Db29yZC5lcXVhbHModGhpcy5fbWluRGUuZ2V0Q29vcmRpbmF0ZSgpKSwiaW5jb25zaXN0ZW5jeSBpbiByaWdodG1vc3QgcHJvY2Vzc2luZyIpLDA9PT10aGlzLl9taW5JbmRleD90aGlzLmZpbmRSaWdodG1vc3RFZGdlQXROb2RlKCk6dGhpcy5maW5kUmlnaHRtb3N0RWRnZUF0VmVydGV4KCksdGhpcy5fb3JpZW50ZWREZT10aGlzLl9taW5EZSx0aGlzLmdldFJpZ2h0bW9zdFNpZGUodGhpcy5fbWluRGUsdGhpcy5fbWluSW5kZXgpPT09RnMuTEVGVCYmKHRoaXMuX29yaWVudGVkRGU9dGhpcy5fbWluRGUuZ2V0U3ltKCkpfSxQcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUHMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFBzfTt2YXIgUnM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuLHIpe3QuY2FsbCh0aGlzLGUubXNnV2l0aENvb3JkKG4scikpLHRoaXMucHQ9cj9uZXcgdmkocik6bnVsbCx0aGlzLm5hbWU9IlRvcG9sb2d5RXhjZXB0aW9uIn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnB0fSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLm1zZ1dpdGhDb29yZD1mdW5jdGlvbih0LGUpe3JldHVybiBlP3Q6dCsiIFsgIitlKyIgXSJ9LGV9KFdpKSxCcz1mdW5jdGlvbigpe3RoaXMuYXJyYXlfPVtdfTtCcy5wcm90b3R5cGUuYWRkTGFzdD1mdW5jdGlvbih0KXt0aGlzLmFycmF5Xy5wdXNoKHQpfSxCcy5wcm90b3R5cGUucmVtb3ZlRmlyc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcnJheV8uc2hpZnQoKX0sQnMucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuYXJyYXlfLmxlbmd0aH07dmFyIGtzPWZ1bmN0aW9uKCl7dGhpcy5fZmluZGVyPW51bGwsdGhpcy5fZGlyRWRnZUxpc3Q9bmV3IHhvLHRoaXMuX25vZGVzPW5ldyB4byx0aGlzLl9yaWdodE1vc3RDb29yZD1udWxsLHRoaXMuX2Vudj1udWxsLHRoaXMuX2ZpbmRlcj1uZXcgUHN9O2tzLnByb3RvdHlwZS5jbGVhclZpc2l0ZWRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9kaXJFZGdlTGlzdC5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuc2V0VmlzaXRlZCghMSl9fSxrcy5wcm90b3R5cGUuZ2V0UmlnaHRtb3N0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yaWdodE1vc3RDb29yZH0sa3MucHJvdG90eXBlLmNvbXB1dGVOb2RlRGVwdGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW51bGwsbj10LmdldEVkZ2VzKCkuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2lmKHIuaXNWaXNpdGVkKCl8fHIuZ2V0U3ltKCkuaXNWaXNpdGVkKCkpe2U9cjticmVha319aWYobnVsbD09PWUpdGhyb3cgbmV3IFJzKCJ1bmFibGUgdG8gZmluZCBlZGdlIHRvIGNvbXB1dGUgZGVwdGhzIGF0ICIrdC5nZXRDb29yZGluYXRlKCkpO3QuZ2V0RWRnZXMoKS5jb21wdXRlRGVwdGhzKGUpO2Zvcih2YXIgaT10LmdldEVkZ2VzKCkuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpO28uc2V0VmlzaXRlZCghMCksdGhpcy5jb3B5U3ltRGVwdGhzKG8pfX0sa3MucHJvdG90eXBlLmNvbXB1dGVEZXB0aD1mdW5jdGlvbih0KXt0aGlzLmNsZWFyVmlzaXRlZEVkZ2VzKCk7dmFyIGU9dGhpcy5fZmluZGVyLmdldEVkZ2UoKTtlLnNldEVkZ2VEZXB0aHMoRnMuUklHSFQsdCksdGhpcy5jb3B5U3ltRGVwdGhzKGUpLHRoaXMuY29tcHV0ZURlcHRocyhlKX0sa3MucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbih0KXt0aGlzLmFkZFJlYWNoYWJsZSh0KSx0aGlzLl9maW5kZXIuZmluZEVkZ2UodGhpcy5fZGlyRWRnZUxpc3QpLHRoaXMuX3JpZ2h0TW9zdENvb3JkPXRoaXMuX2ZpbmRlci5nZXRDb29yZGluYXRlKCl9LGtzLnByb3RvdHlwZS5maW5kUmVzdWx0RWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZGlyRWRnZUxpc3QuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpO2UuZ2V0RGVwdGgoRnMuUklHSFQpPj0xJiZlLmdldERlcHRoKEZzLkxFRlQpPD0wJiYhZS5pc0ludGVyaW9yQXJlYUVkZ2UoKSYmZS5zZXRJblJlc3VsdCghMCl9fSxrcy5wcm90b3R5cGUuY29tcHV0ZURlcHRocz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgRm8sbj1uZXcgQnMscj10LmdldE5vZGUoKTtmb3Iobi5hZGRMYXN0KHIpLGUuYWRkKHIpLHQuc2V0VmlzaXRlZCghMCk7IW4uaXNFbXB0eSgpOyl7dmFyIGk9bi5yZW1vdmVGaXJzdCgpO2UuYWRkKGkpLHRoaXMuY29tcHV0ZU5vZGVEZXB0aChpKTtmb3IodmFyIG89aS5nZXRFZGdlcygpLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKS5nZXRTeW0oKTtpZighcy5pc1Zpc2l0ZWQoKSl7dmFyIGE9cy5nZXROb2RlKCk7ZS5jb250YWlucyhhKXx8KG4uYWRkTGFzdChhKSxlLmFkZChhKSl9fX19LGtzLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5fcmlnaHRNb3N0Q29vcmQueDxlLl9yaWdodE1vc3RDb29yZC54Py0xOnRoaXMuX3JpZ2h0TW9zdENvb3JkLng+ZS5fcmlnaHRNb3N0Q29vcmQueD8xOjB9LGtzLnByb3RvdHlwZS5nZXRFbnZlbG9wZT1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9lbnYpe2Zvcih2YXIgdD1uZXcgamksZT10aGlzLl9kaXJFZGdlTGlzdC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOylmb3IodmFyIG49ZS5uZXh0KCkuZ2V0RWRnZSgpLmdldENvb3JkaW5hdGVzKCkscj0wO3I8bi5sZW5ndGgtMTtyKyspdC5leHBhbmRUb0luY2x1ZGUobltyXSk7dGhpcy5fZW52PXR9cmV0dXJuIHRoaXMuX2Vudn0sa3MucHJvdG90eXBlLmFkZFJlYWNoYWJsZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgTHM7Zm9yKGUuYWRkKHQpOyFlLmVtcHR5KCk7KXt2YXIgbj1lLnBvcCgpO3RoaXMuYWRkKG4sZSl9fSxrcy5wcm90b3R5cGUuY29weVN5bURlcHRocz1mdW5jdGlvbih0KXt2YXIgZT10LmdldFN5bSgpO2Uuc2V0RGVwdGgoRnMuTEVGVCx0LmdldERlcHRoKEZzLlJJR0hUKSksZS5zZXREZXB0aChGcy5SSUdIVCx0LmdldERlcHRoKEZzLkxFRlQpKX0sa3MucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LGUpe3Quc2V0VmlzaXRlZCghMCksdGhpcy5fbm9kZXMuYWRkKHQpO2Zvcih2YXIgbj10LmdldEVkZ2VzKCkuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3RoaXMuX2RpckVkZ2VMaXN0LmFkZChyKTt2YXIgaT1yLmdldFN5bSgpLmdldE5vZGUoKTtpLmlzVmlzaXRlZCgpfHxlLnB1c2goaSl9fSxrcy5wcm90b3R5cGUuZ2V0Tm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZXN9LGtzLnByb3RvdHlwZS5nZXREaXJlY3RlZEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpckVkZ2VMaXN0fSxrcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSxrcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4ga3N9O3ZhciB6cz1mdW5jdGlvbiB0KCl7aWYodGhpcy5sb2NhdGlvbj1udWxsLDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5pbml0KGUubGVuZ3RoKX1lbHNlIGlmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSl7dmFyIG49YXJndW1lbnRzWzBdO3RoaXMuaW5pdCgxKSx0aGlzLmxvY2F0aW9uW0ZzLk9OXT1ufWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0KXt2YXIgcj1hcmd1bWVudHNbMF07aWYodGhpcy5pbml0KHIubG9jYXRpb24ubGVuZ3RoKSxudWxsIT09cilmb3IodmFyIGk9MDtpPHRoaXMubG9jYXRpb24ubGVuZ3RoO2krKyl0aGlzLmxvY2F0aW9uW2ldPXIubG9jYXRpb25baV19fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPWFyZ3VtZW50c1syXTt0aGlzLmluaXQoMyksdGhpcy5sb2NhdGlvbltGcy5PTl09byx0aGlzLmxvY2F0aW9uW0ZzLkxFRlRdPXMsdGhpcy5sb2NhdGlvbltGcy5SSUdIVF09YX19O3pzLnByb3RvdHlwZS5zZXRBbGxMb2NhdGlvbnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmxvY2F0aW9uLmxlbmd0aDtlKyspdGhpcy5sb2NhdGlvbltlXT10fSx6cy5wcm90b3R5cGUuaXNOdWxsPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLmxvY2F0aW9uLmxlbmd0aDt0KyspaWYodGhpcy5sb2NhdGlvblt0XSE9PWJpLk5PTkUpcmV0dXJuITE7cmV0dXJuITB9LHpzLnByb3RvdHlwZS5zZXRBbGxMb2NhdGlvbnNJZk51bGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmxvY2F0aW9uLmxlbmd0aDtlKyspdGhpcy5sb2NhdGlvbltlXT09PWJpLk5PTkUmJih0aGlzLmxvY2F0aW9uW2VdPXQpfSx6cy5wcm90b3R5cGUuaXNMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLmxvY2F0aW9uLmxlbmd0aH0senMucHJvdG90eXBlLm1lcmdlPWZ1bmN0aW9uKHQpe2lmKHQubG9jYXRpb24ubGVuZ3RoPnRoaXMubG9jYXRpb24ubGVuZ3RoKXt2YXIgZT1uZXcgQXJyYXkoMykuZmlsbChudWxsKTtlW0ZzLk9OXT10aGlzLmxvY2F0aW9uW0ZzLk9OXSxlW0ZzLkxFRlRdPWJpLk5PTkUsZVtGcy5SSUdIVF09YmkuTk9ORSx0aGlzLmxvY2F0aW9uPWV9Zm9yKHZhciBuPTA7bjx0aGlzLmxvY2F0aW9uLmxlbmd0aDtuKyspdGhpcy5sb2NhdGlvbltuXT09PWJpLk5PTkUmJm48dC5sb2NhdGlvbi5sZW5ndGgmJih0aGlzLmxvY2F0aW9uW25dPXQubG9jYXRpb25bbl0pfSx6cy5wcm90b3R5cGUuZ2V0TG9jYXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYXRpb259LHpzLnByb3RvdHlwZS5mbGlwPWZ1bmN0aW9uKCl7aWYodGhpcy5sb2NhdGlvbi5sZW5ndGg8PTEpcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5sb2NhdGlvbltGcy5MRUZUXTt0aGlzLmxvY2F0aW9uW0ZzLkxFRlRdPXRoaXMubG9jYXRpb25bRnMuUklHSFRdLHRoaXMubG9jYXRpb25bRnMuUklHSFRdPXR9LHpzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PW5ldyBBaTtyZXR1cm4gdGhpcy5sb2NhdGlvbi5sZW5ndGg+MSYmdC5hcHBlbmQoYmkudG9Mb2NhdGlvblN5bWJvbCh0aGlzLmxvY2F0aW9uW0ZzLkxFRlRdKSksdC5hcHBlbmQoYmkudG9Mb2NhdGlvblN5bWJvbCh0aGlzLmxvY2F0aW9uW0ZzLk9OXSkpLHRoaXMubG9jYXRpb24ubGVuZ3RoPjEmJnQuYXBwZW5kKGJpLnRvTG9jYXRpb25TeW1ib2wodGhpcy5sb2NhdGlvbltGcy5SSUdIVF0pKSx0LnRvU3RyaW5nKCl9LHpzLnByb3RvdHlwZS5zZXRMb2NhdGlvbnM9ZnVuY3Rpb24odCxlLG4pe3RoaXMubG9jYXRpb25bRnMuT05dPXQsdGhpcy5sb2NhdGlvbltGcy5MRUZUXT1lLHRoaXMubG9jYXRpb25bRnMuUklHSFRdPW59LHpzLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ8dGhpcy5sb2NhdGlvbi5sZW5ndGg/dGhpcy5sb2NhdGlvblt0XTpiaS5OT05FfSx6cy5wcm90b3R5cGUuaXNBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYXRpb24ubGVuZ3RoPjF9LHpzLnByb3RvdHlwZS5pc0FueU51bGw9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMubG9jYXRpb24ubGVuZ3RoO3QrKylpZih0aGlzLmxvY2F0aW9uW3RdPT09YmkuTk9ORSlyZXR1cm4hMDtyZXR1cm4hMX0senMucHJvdG90eXBlLnNldExvY2F0aW9uPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldExvY2F0aW9uKEZzLk9OLHQpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLmxvY2F0aW9uW2VdPW59fSx6cy5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0KXt0aGlzLmxvY2F0aW9uPW5ldyBBcnJheSh0KS5maWxsKG51bGwpLHRoaXMuc2V0QWxsTG9jYXRpb25zKGJpLk5PTkUpfSx6cy5wcm90b3R5cGUuaXNFcXVhbE9uU2lkZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmxvY2F0aW9uW2VdPT09dC5sb2NhdGlvbltlXX0senMucHJvdG90eXBlLmFsbFBvc2l0aW9uc0VxdWFsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5sb2NhdGlvbi5sZW5ndGg7ZSsrKWlmKHRoaXMubG9jYXRpb25bZV0hPT10KXJldHVybiExO3JldHVybiEwfSx6cy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0senMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHpzfTt2YXIganM9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuZWx0PW5ldyBBcnJheSgyKS5maWxsKG51bGwpLDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmVsdFswXT1uZXcgenMoZSksdGhpcy5lbHRbMV09bmV3IHpzKGUpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0KXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5lbHRbMF09bmV3IHpzKG4uZWx0WzBdKSx0aGlzLmVsdFsxXT1uZXcgenMobi5lbHRbMV0pfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV07dGhpcy5lbHRbMF09bmV3IHpzKGJpLk5PTkUpLHRoaXMuZWx0WzFdPW5ldyB6cyhiaS5OT05FKSx0aGlzLmVsdFtyXS5zZXRMb2NhdGlvbihpKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl07dGhpcy5lbHRbMF09bmV3IHpzKG8scyxhKSx0aGlzLmVsdFsxXT1uZXcgenMobyxzLGEpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB1PWFyZ3VtZW50c1swXSxjPWFyZ3VtZW50c1sxXSxsPWFyZ3VtZW50c1syXSxoPWFyZ3VtZW50c1szXTt0aGlzLmVsdFswXT1uZXcgenMoYmkuTk9ORSxiaS5OT05FLGJpLk5PTkUpLHRoaXMuZWx0WzFdPW5ldyB6cyhiaS5OT05FLGJpLk5PTkUsYmkuTk9ORSksdGhpcy5lbHRbdV0uc2V0TG9jYXRpb25zKGMsbCxoKX19O2pzLnByb3RvdHlwZS5nZXRHZW9tZXRyeUNvdW50PWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lbHRbMF0uaXNOdWxsKCl8fHQrKyx0aGlzLmVsdFsxXS5pc051bGwoKXx8dCsrLHR9LGpzLnByb3RvdHlwZS5zZXRBbGxMb2NhdGlvbnM9ZnVuY3Rpb24odCxlKXt0aGlzLmVsdFt0XS5zZXRBbGxMb2NhdGlvbnMoZSl9LGpzLnByb3RvdHlwZS5pc051bGw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWx0W3RdLmlzTnVsbCgpfSxqcy5wcm90b3R5cGUuc2V0QWxsTG9jYXRpb25zSWZOdWxsPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldEFsbExvY2F0aW9uc0lmTnVsbCgwLHQpLHRoaXMuc2V0QWxsTG9jYXRpb25zSWZOdWxsKDEsdCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuZWx0W2VdLnNldEFsbExvY2F0aW9uc0lmTnVsbChuKX19LGpzLnByb3RvdHlwZS5pc0xpbmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWx0W3RdLmlzTGluZSgpfSxqcy5wcm90b3R5cGUubWVyZ2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj0wO248MjtuKyspbnVsbD09PWUuZWx0W25dJiZudWxsIT09dC5lbHRbbl0/ZS5lbHRbbl09bmV3IHpzKHQuZWx0W25dKTplLmVsdFtuXS5tZXJnZSh0LmVsdFtuXSl9LGpzLnByb3RvdHlwZS5mbGlwPWZ1bmN0aW9uKCl7dGhpcy5lbHRbMF0uZmxpcCgpLHRoaXMuZWx0WzFdLmZsaXAoKX0sanMucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5lbHRbdF0uZ2V0KEZzLk9OKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmVsdFtlXS5nZXQobil9fSxqcy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQWk7cmV0dXJuIG51bGwhPT10aGlzLmVsdFswXSYmKHQuYXBwZW5kKCJBOiIpLHQuYXBwZW5kKHRoaXMuZWx0WzBdLnRvU3RyaW5nKCkpKSxudWxsIT09dGhpcy5lbHRbMV0mJih0LmFwcGVuZCgiIEI6IiksdC5hcHBlbmQodGhpcy5lbHRbMV0udG9TdHJpbmcoKSkpLHQudG9TdHJpbmcoKX0sanMucHJvdG90eXBlLmlzQXJlYT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmVsdFswXS5pc0FyZWEoKXx8dGhpcy5lbHRbMV0uaXNBcmVhKCk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5lbHRbdF0uaXNBcmVhKCl9fSxqcy5wcm90b3R5cGUuaXNBbnlOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVsdFt0XS5pc0FueU51bGwoKX0sanMucHJvdG90eXBlLnNldExvY2F0aW9uPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLmVsdFt0XS5zZXRMb2NhdGlvbihGcy5PTixlKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl07dGhpcy5lbHRbbl0uc2V0TG9jYXRpb24ocixpKX19LGpzLnByb3RvdHlwZS5pc0VxdWFsT25TaWRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZWx0WzBdLmlzRXF1YWxPblNpZGUodC5lbHRbMF0sZSkmJnRoaXMuZWx0WzFdLmlzRXF1YWxPblNpZGUodC5lbHRbMV0sZSl9LGpzLnByb3RvdHlwZS5hbGxQb3NpdGlvbnNFcXVhbD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVsdFt0XS5hbGxQb3NpdGlvbnNFcXVhbChlKX0sanMucHJvdG90eXBlLnRvTGluZT1mdW5jdGlvbih0KXt0aGlzLmVsdFt0XS5pc0FyZWEoKSYmKHRoaXMuZWx0W3RdPW5ldyB6cyh0aGlzLmVsdFt0XS5sb2NhdGlvblswXSkpfSxqcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sanMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGpzfSxqcy50b0xpbmVMYWJlbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IGpzKGJpLk5PTkUpLG49MDtuPDI7bisrKWUuc2V0TG9jYXRpb24obix0LmdldExvY2F0aW9uKG4pKTtyZXR1cm4gZX07dmFyIFVzPWZ1bmN0aW9uKCl7dGhpcy5fc3RhcnREZT1udWxsLHRoaXMuX21heE5vZGVEZWdyZWU9LTEsdGhpcy5fZWRnZXM9bmV3IHhvLHRoaXMuX3B0cz1uZXcgeG8sdGhpcy5fbGFiZWw9bmV3IGpzKGJpLk5PTkUpLHRoaXMuX3Jpbmc9bnVsbCx0aGlzLl9pc0hvbGU9bnVsbCx0aGlzLl9zaGVsbD1udWxsLHRoaXMuX2hvbGVzPW5ldyB4byx0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZ2VvbWV0cnlGYWN0b3J5PWUsdGhpcy5jb21wdXRlUG9pbnRzKHQpLHRoaXMuY29tcHV0ZVJpbmcoKX07VXMucHJvdG90eXBlLmNvbXB1dGVSaW5nPWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3JpbmcpcmV0dXJuIG51bGw7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLl9wdHMuc2l6ZSgpKS5maWxsKG51bGwpLGU9MDtlPHRoaXMuX3B0cy5zaXplKCk7ZSsrKXRbZV09dGhpcy5fcHRzLmdldChlKTt0aGlzLl9yaW5nPXRoaXMuX2dlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKHQpLHRoaXMuX2lzSG9sZT1lby5pc0NDVyh0aGlzLl9yaW5nLmdldENvb3JkaW5hdGVzKCkpfSxVcy5wcm90b3R5cGUuaXNJc29sYXRlZD1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5fbGFiZWwuZ2V0R2VvbWV0cnlDb3VudCgpfSxVcy5wcm90b3R5cGUuY29tcHV0ZVBvaW50cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX3N0YXJ0RGU9dDt2YXIgbj10LHI9ITA7ZG97aWYobnVsbD09PW4pdGhyb3cgbmV3IFJzKCJGb3VuZCBudWxsIERpcmVjdGVkRWRnZSIpO2lmKG4uZ2V0RWRnZVJpbmcoKT09PWUpdGhyb3cgbmV3IFJzKCJEaXJlY3RlZCBFZGdlIHZpc2l0ZWQgdHdpY2UgZHVyaW5nIHJpbmctYnVpbGRpbmcgYXQgIituLmdldENvb3JkaW5hdGUoKSk7ZS5fZWRnZXMuYWRkKG4pO3ZhciBpPW4uZ2V0TGFiZWwoKTtaaS5pc1RydWUoaS5pc0FyZWEoKSksZS5tZXJnZUxhYmVsKGkpLGUuYWRkUG9pbnRzKG4uZ2V0RWRnZSgpLG4uaXNGb3J3YXJkKCkscikscj0hMSxlLnNldEVkZ2VSaW5nKG4sZSksbj1lLmdldE5leHQobil9d2hpbGUobiE9PXRoaXMuX3N0YXJ0RGUpfSxVcy5wcm90b3R5cGUuZ2V0TGluZWFyUmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yaW5nfSxVcy5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHRzLmdldCh0KX0sVXMucHJvdG90eXBlLmNvbXB1dGVNYXhOb2RlRGVncmVlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9tYXhOb2RlRGVncmVlPTA7dmFyIGU9dGhpcy5fc3RhcnREZTtkb3t2YXIgbj1lLmdldE5vZGUoKS5nZXRFZGdlcygpLmdldE91dGdvaW5nRGVncmVlKHQpO24+dC5fbWF4Tm9kZURlZ3JlZSYmKHQuX21heE5vZGVEZWdyZWU9biksZT10LmdldE5leHQoZSl9d2hpbGUoZSE9PXRoaXMuX3N0YXJ0RGUpO3RoaXMuX21heE5vZGVEZWdyZWUqPTJ9LFVzLnByb3RvdHlwZS5hZGRQb2ludHM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuZ2V0Q29vcmRpbmF0ZXMoKTtpZihlKXt2YXIgaT0xO24mJihpPTApO2Zvcih2YXIgbz1pO288ci5sZW5ndGg7bysrKXRoaXMuX3B0cy5hZGQocltvXSl9ZWxzZXt2YXIgcz1yLmxlbmd0aC0yO24mJihzPXIubGVuZ3RoLTEpO2Zvcih2YXIgYT1zO2E+PTA7YS0tKXRoaXMuX3B0cy5hZGQoclthXSl9fSxVcy5wcm90b3R5cGUuaXNIb2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSG9sZX0sVXMucHJvdG90eXBlLnNldEluUmVzdWx0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3RhcnREZTtkb3t0LmdldEVkZ2UoKS5zZXRJblJlc3VsdCghMCksdD10LmdldE5leHQoKX13aGlsZSh0IT09dGhpcy5fc3RhcnREZSl9LFVzLnByb3RvdHlwZS5jb250YWluc1BvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0TGluZWFyUmluZygpO2lmKCFlLmdldEVudmVsb3BlSW50ZXJuYWwoKS5jb250YWlucyh0KXx8IWVvLmlzUG9pbnRJblJpbmcodCxlLmdldENvb3JkaW5hdGVzKCkpKXJldHVybiExO2Zvcih2YXIgbj10aGlzLl9ob2xlcy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7aWYobi5uZXh0KCkuY29udGFpbnNQb2ludCh0KSlyZXR1cm4hMX1yZXR1cm4hMH0sVXMucHJvdG90eXBlLmFkZEhvbGU9ZnVuY3Rpb24odCl7dGhpcy5faG9sZXMuYWRkKHQpfSxVcy5wcm90b3R5cGUuaXNTaGVsbD1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fc2hlbGx9LFVzLnByb3RvdHlwZS5nZXRMYWJlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0sVXMucHJvdG90eXBlLmdldEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzfSxVcy5wcm90b3R5cGUuZ2V0TWF4Tm9kZURlZ3JlZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhOb2RlRGVncmVlPDAmJnRoaXMuY29tcHV0ZU1heE5vZGVEZWdyZWUoKSx0aGlzLl9tYXhOb2RlRGVncmVlfSxVcy5wcm90b3R5cGUuZ2V0U2hlbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hlbGx9LFVzLnByb3RvdHlwZS5tZXJnZUxhYmVsPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLm1lcmdlTGFiZWwodCwwKSx0aGlzLm1lcmdlTGFiZWwodCwxKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMF0uZ2V0TG9jYXRpb24oZSxGcy5SSUdIVCk7aWYobj09PWJpLk5PTkUpcmV0dXJuIG51bGw7aWYodGhpcy5fbGFiZWwuZ2V0TG9jYXRpb24oZSk9PT1iaS5OT05FKXJldHVybiB0aGlzLl9sYWJlbC5zZXRMb2NhdGlvbihlLG4pLG51bGx9fSxVcy5wcm90b3R5cGUuc2V0U2hlbGw9ZnVuY3Rpb24odCl7dGhpcy5fc2hlbGw9dCxudWxsIT09dCYmdC5hZGRIb2xlKHRoaXMpfSxVcy5wcm90b3R5cGUudG9Qb2x5Z29uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodGhpcy5faG9sZXMuc2l6ZSgpKS5maWxsKG51bGwpLG49MDtuPHRoaXMuX2hvbGVzLnNpemUoKTtuKyspZVtuXT10aGlzLl9ob2xlcy5nZXQobikuZ2V0TGluZWFyUmluZygpO3JldHVybiB0LmNyZWF0ZVBvbHlnb24odGhpcy5nZXRMaW5lYXJSaW5nKCksZSl9LFVzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxVcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVXN9O3ZhciBxcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnNldEVkZ2VSaW5nPWZ1bmN0aW9uKHQsZSl7dC5zZXRNaW5FZGdlUmluZyhlKX0sZS5wcm90b3R5cGUuZ2V0TmV4dD1mdW5jdGlvbih0KXtyZXR1cm4gdC5nZXROZXh0TWluKCl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KFVzKSxWcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmJ1aWxkTWluaW1hbFJpbmdzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHhvLGU9dGhpcy5fc3RhcnREZTtkb3tpZihudWxsPT09ZS5nZXRNaW5FZGdlUmluZygpKXt2YXIgbj1uZXcgcXMoZSx0aGlzLl9nZW9tZXRyeUZhY3RvcnkpO3QuYWRkKG4pfWU9ZS5nZXROZXh0KCl9d2hpbGUoZSE9PXRoaXMuX3N0YXJ0RGUpO3JldHVybiB0fSxlLnByb3RvdHlwZS5zZXRFZGdlUmluZz1mdW5jdGlvbih0LGUpe3Quc2V0RWRnZVJpbmcoZSl9LGUucHJvdG90eXBlLmxpbmtEaXJlY3RlZEVkZ2VzRm9yTWluaW1hbEVkZ2VSaW5ncz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3N0YXJ0RGU7ZG97dC5nZXROb2RlKCkuZ2V0RWRnZXMoKS5saW5rTWluaW1hbERpcmVjdGVkRWRnZXModGhpcyksdD10LmdldE5leHQoKX13aGlsZSh0IT09dGhpcy5fc3RhcnREZSl9LGUucHJvdG90eXBlLmdldE5leHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TmV4dCgpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShVcyksR3M9ZnVuY3Rpb24oKXtpZih0aGlzLl9sYWJlbD1udWxsLHRoaXMuX2lzSW5SZXN1bHQ9ITEsdGhpcy5faXNDb3ZlcmVkPSExLHRoaXMuX2lzQ292ZXJlZFNldD0hMSx0aGlzLl9pc1Zpc2l0ZWQ9ITEsMCE9PWFyZ3VtZW50cy5sZW5ndGgmJjE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbGFiZWw9dH19O0dzLnByb3RvdHlwZS5zZXRWaXNpdGVkPWZ1bmN0aW9uKHQpe3RoaXMuX2lzVmlzaXRlZD10fSxHcy5wcm90b3R5cGUuc2V0SW5SZXN1bHQ9ZnVuY3Rpb24odCl7dGhpcy5faXNJblJlc3VsdD10fSxHcy5wcm90b3R5cGUuaXNDb3ZlcmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQ292ZXJlZH0sR3MucHJvdG90eXBlLmlzQ292ZXJlZFNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0NvdmVyZWRTZXR9LEdzLnByb3RvdHlwZS5zZXRMYWJlbD1mdW5jdGlvbih0KXt0aGlzLl9sYWJlbD10fSxHcy5wcm90b3R5cGUuZ2V0TGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFiZWx9LEdzLnByb3RvdHlwZS5zZXRDb3ZlcmVkPWZ1bmN0aW9uKHQpe3RoaXMuX2lzQ292ZXJlZD10LHRoaXMuX2lzQ292ZXJlZFNldD0hMH0sR3MucHJvdG90eXBlLnVwZGF0ZUlNPWZ1bmN0aW9uKHQpe1ppLmlzVHJ1ZSh0aGlzLl9sYWJlbC5nZXRHZW9tZXRyeUNvdW50KCk+PTIsImZvdW5kIHBhcnRpYWwgbGFiZWwiKSx0aGlzLmNvbXB1dGVJTSh0KX0sR3MucHJvdG90eXBlLmlzSW5SZXN1bHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNJblJlc3VsdH0sR3MucHJvdG90eXBlLmlzVmlzaXRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1Zpc2l0ZWR9LEdzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxHcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gR3N9O3ZhciBZcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX2Nvb3JkPW51bGwsdGhpcy5fZWRnZXM9bnVsbDt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5fY29vcmQ9ZSx0aGlzLl9lZGdlcz1uLHRoaXMuX2xhYmVsPW5ldyBqcygwLGJpLk5PTkUpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pc0luY2lkZW50RWRnZUluUmVzdWx0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuZ2V0RWRnZXMoKS5nZXRFZGdlcygpLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXtpZih0Lm5leHQoKS5nZXRFZGdlKCkuaXNJblJlc3VsdCgpKXJldHVybiEwfXJldHVybiExfSxlLnByb3RvdHlwZS5pc0lzb2xhdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLl9sYWJlbC5nZXRHZW9tZXRyeUNvdW50KCl9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29vcmR9LGUucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnRsbigibm9kZSAiK3RoaXMuX2Nvb3JkKyIgbGJsOiAiK3RoaXMuX2xhYmVsKX0sZS5wcm90b3R5cGUuY29tcHV0ZUlNPWZ1bmN0aW9uKHQpe30sZS5wcm90b3R5cGUuY29tcHV0ZU1lcmdlZExvY2F0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIG49YmkuTk9ORTtpZihuPXRoaXMuX2xhYmVsLmdldExvY2F0aW9uKGUpLCF0LmlzTnVsbChlKSl7dmFyIHI9dC5nZXRMb2NhdGlvbihlKTtuIT09YmkuQk9VTkRBUlkmJihuPXIpfXJldHVybiBufSxlLnByb3RvdHlwZS5zZXRMYWJlbD1mdW5jdGlvbigpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5zZXRMYWJlbC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO251bGw9PT10aGlzLl9sYWJlbD90aGlzLl9sYWJlbD1uZXcganMoZSxuKTp0aGlzLl9sYWJlbC5zZXRMb2NhdGlvbihlLG4pfSxlLnByb3RvdHlwZS5nZXRFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlc30sZS5wcm90b3R5cGUubWVyZ2VMYWJlbD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBlKXt2YXIgbj1hcmd1bWVudHNbMF07dGhpcy5tZXJnZUxhYmVsKG4uX2xhYmVsKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YganMpZm9yKHZhciByPWFyZ3VtZW50c1swXSxpPTA7aTwyO2krKyl7dmFyIG89dC5jb21wdXRlTWVyZ2VkTG9jYXRpb24ocixpKTt0Ll9sYWJlbC5nZXRMb2NhdGlvbihpKT09PWJpLk5PTkUmJnQuX2xhYmVsLnNldExvY2F0aW9uKGksbyl9fSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5fZWRnZXMuaW5zZXJ0KHQpLHQuc2V0Tm9kZSh0aGlzKX0sZS5wcm90b3R5cGUuc2V0TGFiZWxCb3VuZGFyeT1mdW5jdGlvbih0KXtpZihudWxsPT09dGhpcy5fbGFiZWwpcmV0dXJuIG51bGw7dmFyIGU9YmkuTk9ORTtudWxsIT09dGhpcy5fbGFiZWwmJihlPXRoaXMuX2xhYmVsLmdldExvY2F0aW9uKHQpKTt2YXIgbj1udWxsO2lmKGU9PT1iaS5CT1VOREFSWSluPWJpLklOVEVSSU9SO2Vsc2Ugbj1iaS5CT1VOREFSWTt0aGlzLl9sYWJlbC5zZXRMb2NhdGlvbih0LG4pfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShHcyksWHM9ZnVuY3Rpb24oKXt0aGlzLm5vZGVNYXA9bmV3IGtvLHRoaXMubm9kZUZhY3Q9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5ub2RlRmFjdD10fTtYcy5wcm90b3R5cGUuZmluZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5ub2RlTWFwLmdldCh0KX0sWHMucHJvdG90eXBlLmFkZE5vZGU9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgdD1hcmd1bWVudHNbMF0sZT10aGlzLm5vZGVNYXAuZ2V0KHQpO3JldHVybiBudWxsPT09ZSYmKGU9dGhpcy5ub2RlRmFjdC5jcmVhdGVOb2RlKHQpLHRoaXMubm9kZU1hcC5wdXQodCxlKSksZX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFlzKXt2YXIgbj1hcmd1bWVudHNbMF0scj10aGlzLm5vZGVNYXAuZ2V0KG4uZ2V0Q29vcmRpbmF0ZSgpKTtyZXR1cm4gbnVsbD09PXI/KHRoaXMubm9kZU1hcC5wdXQobi5nZXRDb29yZGluYXRlKCksbiksbik6KHIubWVyZ2VMYWJlbChuKSxyKX19LFhzLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkucHJpbnQodCl9fSxYcy5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlTWFwLnZhbHVlcygpLml0ZXJhdG9yKCl9LFhzLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlTWFwLnZhbHVlcygpfSxYcy5wcm90b3R5cGUuZ2V0Qm91bmRhcnlOb2Rlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49dGhpcy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ci5nZXRMYWJlbCgpLmdldExvY2F0aW9uKHQpPT09YmkuQk9VTkRBUlkmJmUuYWRkKHIpfXJldHVybiBlfSxYcy5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0Q29vcmRpbmF0ZSgpO3RoaXMuYWRkTm9kZShlKS5hZGQodCl9LFhzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxYcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWHN9O3ZhciBXcz1mdW5jdGlvbigpe30sSHM9e05FOntjb25maWd1cmFibGU6ITB9LE5XOntjb25maWd1cmFibGU6ITB9LFNXOntjb25maWd1cmFibGU6ITB9LFNFOntjb25maWd1cmFibGU6ITB9fTtXcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sV3MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFdzfSxXcy5pc05vcnRoZXJuPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09V3MuTkV8fHQ9PT1Xcy5OV30sV3MuaXNPcHBvc2l0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0IT09ZSYmMj09PSh0LWUrNCklNH0sV3MuY29tbW9uSGFsZlBsYW5lPWZ1bmN0aW9uKHQsZSl7aWYodD09PWUpcmV0dXJuIHQ7aWYoMj09PSh0LWUrNCklNClyZXR1cm4tMTt2YXIgbj10PGU/dDplO3JldHVybiAwPT09biYmMz09PSh0PmU/dDplKT8zOm59LFdzLmlzSW5IYWxmUGxhbmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT09PVdzLlNFP3Q9PT1Xcy5TRXx8dD09PVdzLlNXOnQ9PT1lfHx0PT09ZSsxfSxXcy5xdWFkcmFudD1mdW5jdGlvbigpe2lmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO2lmKDA9PT10JiYwPT09ZSl0aHJvdyBuZXcgaGk7cmV0dXJuIHQ+PTA/ZT49MD9Xcy5ORTpXcy5TRTplPj0wP1dzLk5XOldzLlNXfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtpZihyLng9PT1uLngmJnIueT09PW4ueSl0aHJvdyBuZXcgaGk7cmV0dXJuIHIueD49bi54P3IueT49bi55P1dzLk5FOldzLlNFOnIueT49bi55P1dzLk5XOldzLlNXfX0sSHMuTkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LEhzLk5XLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxIcy5TVy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sSHMuU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFdzLEhzKTt2YXIgWnM9ZnVuY3Rpb24oKXtpZih0aGlzLl9lZGdlPW51bGwsdGhpcy5fbGFiZWw9bnVsbCx0aGlzLl9ub2RlPW51bGwsdGhpcy5fcDA9bnVsbCx0aGlzLl9wMT1udWxsLHRoaXMuX2R4PW51bGwsdGhpcy5fZHk9bnVsbCx0aGlzLl9xdWFkcmFudD1udWxsLDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZWRnZT10fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTt0aGlzLl9lZGdlPWUsdGhpcy5pbml0KG4sciksdGhpcy5fbGFiZWw9bnVsbH1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbM107dGhpcy5fZWRnZT1pLHRoaXMuaW5pdChvLHMpLHRoaXMuX2xhYmVsPWF9fTtacy5wcm90b3R5cGUuY29tcGFyZURpcmVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHg9PT10Ll9keCYmdGhpcy5fZHk9PT10Ll9keT8wOnRoaXMuX3F1YWRyYW50PnQuX3F1YWRyYW50PzE6dGhpcy5fcXVhZHJhbnQ8dC5fcXVhZHJhbnQ/LTE6ZW8uY29tcHV0ZU9yaWVudGF0aW9uKHQuX3AwLHQuX3AxLHRoaXMuX3AxKX0sWnMucHJvdG90eXBlLmdldER5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2R5fSxacy5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wMH0sWnMucHJvdG90eXBlLnNldE5vZGU9ZnVuY3Rpb24odCl7dGhpcy5fbm9kZT10fSxacy5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5hdGFuMih0aGlzLl9keSx0aGlzLl9keCksbj10aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLHI9bi5sYXN0SW5kZXhPZigiLiIpLGk9bi5zdWJzdHJpbmcocisxKTt0LnByaW50KCIgICIraSsiOiAiK3RoaXMuX3AwKyIgLSAiK3RoaXMuX3AxKyIgIit0aGlzLl9xdWFkcmFudCsiOiIrZSsiICAgIit0aGlzLl9sYWJlbCl9LFpzLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5jb21wYXJlRGlyZWN0aW9uKGUpfSxacy5wcm90b3R5cGUuZ2V0RGlyZWN0ZWRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3AxfSxacy5wcm90b3R5cGUuZ2V0RHg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHh9LFpzLnByb3RvdHlwZS5nZXRMYWJlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0sWnMucHJvdG90eXBlLmdldEVkZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZX0sWnMucHJvdG90eXBlLmdldFF1YWRyYW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3F1YWRyYW50fSxacy5wcm90b3R5cGUuZ2V0Tm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlfSxacy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD1NYXRoLmF0YW4yKHRoaXMuX2R5LHRoaXMuX2R4KSxlPXRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksbj1lLmxhc3RJbmRleE9mKCIuIik7cmV0dXJuIiAgIitlLnN1YnN0cmluZyhuKzEpKyI6ICIrdGhpcy5fcDArIiAtICIrdGhpcy5fcDErIiAiK3RoaXMuX3F1YWRyYW50KyI6Iit0KyIgICAiK3RoaXMuX2xhYmVsfSxacy5wcm90b3R5cGUuY29tcHV0ZUxhYmVsPWZ1bmN0aW9uKHQpe30sWnMucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9wMD10LHRoaXMuX3AxPWUsdGhpcy5fZHg9ZS54LXQueCx0aGlzLl9keT1lLnktdC55LHRoaXMuX3F1YWRyYW50PVdzLnF1YWRyYW50KHRoaXMuX2R4LHRoaXMuX2R5KSxaaS5pc1RydWUoISgwPT09dGhpcy5fZHgmJjA9PT10aGlzLl9keSksIkVkZ2VFbmQgd2l0aCBpZGVudGljYWwgZW5kcG9pbnRzIGZvdW5kIil9LFpzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LFpzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBac307dmFyIEtzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYodC5jYWxsKHRoaXMsZSksdGhpcy5faXNGb3J3YXJkPW51bGwsdGhpcy5faXNJblJlc3VsdD0hMSx0aGlzLl9pc1Zpc2l0ZWQ9ITEsdGhpcy5fc3ltPW51bGwsdGhpcy5fbmV4dD1udWxsLHRoaXMuX25leHRNaW49bnVsbCx0aGlzLl9lZGdlUmluZz1udWxsLHRoaXMuX21pbkVkZ2VSaW5nPW51bGwsdGhpcy5fZGVwdGg9WzAsLTk5OSwtOTk5XSx0aGlzLl9pc0ZvcndhcmQ9bixuKXRoaXMuaW5pdChlLmdldENvb3JkaW5hdGUoMCksZS5nZXRDb29yZGluYXRlKDEpKTtlbHNle3ZhciByPWUuZ2V0TnVtUG9pbnRzKCktMTt0aGlzLmluaXQoZS5nZXRDb29yZGluYXRlKHIpLGUuZ2V0Q29vcmRpbmF0ZShyLTEpKX10aGlzLmNvbXB1dGVEaXJlY3RlZExhYmVsKCl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldE5leHRNaW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmV4dE1pbn0sZS5wcm90b3R5cGUuZ2V0RGVwdGg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RlcHRoW3RdfSxlLnByb3RvdHlwZS5zZXRWaXNpdGVkPWZ1bmN0aW9uKHQpe3RoaXMuX2lzVmlzaXRlZD10fSxlLnByb3RvdHlwZS5jb21wdXRlRGlyZWN0ZWRMYWJlbD1mdW5jdGlvbigpe3RoaXMuX2xhYmVsPW5ldyBqcyh0aGlzLl9lZGdlLmdldExhYmVsKCkpLHRoaXMuX2lzRm9yd2FyZHx8dGhpcy5fbGFiZWwuZmxpcCgpfSxlLnByb3RvdHlwZS5nZXROZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25leHR9LGUucHJvdG90eXBlLnNldERlcHRoPWZ1bmN0aW9uKHQsZSl7aWYoLTk5OSE9PXRoaXMuX2RlcHRoW3RdJiZ0aGlzLl9kZXB0aFt0XSE9PWUpdGhyb3cgbmV3IFJzKCJhc3NpZ25lZCBkZXB0aHMgZG8gbm90IG1hdGNoIix0aGlzLmdldENvb3JkaW5hdGUoKSk7dGhpcy5fZGVwdGhbdF09ZX0sZS5wcm90b3R5cGUuaXNJbnRlcmlvckFyZWFFZGdlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT0hMCxuPTA7bjwyO24rKyl0Ll9sYWJlbC5pc0FyZWEobikmJnQuX2xhYmVsLmdldExvY2F0aW9uKG4sRnMuTEVGVCk9PT1iaS5JTlRFUklPUiYmdC5fbGFiZWwuZ2V0TG9jYXRpb24obixGcy5SSUdIVCk9PT1iaS5JTlRFUklPUnx8KGU9ITEpO3JldHVybiBlfSxlLnByb3RvdHlwZS5zZXROZXh0TWluPWZ1bmN0aW9uKHQpe3RoaXMuX25leHRNaW49dH0sZS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUucHJpbnQuY2FsbCh0aGlzLGUpLGUucHJpbnQoIiAiK3RoaXMuX2RlcHRoW0ZzLkxFRlRdKyIvIit0aGlzLl9kZXB0aFtGcy5SSUdIVF0pLGUucHJpbnQoIiAoIit0aGlzLmdldERlcHRoRGVsdGEoKSsiKSIpLHRoaXMuX2lzSW5SZXN1bHQmJmUucHJpbnQoIiBpblJlc3VsdCIpfSxlLnByb3RvdHlwZS5zZXRNaW5FZGdlUmluZz1mdW5jdGlvbih0KXt0aGlzLl9taW5FZGdlUmluZz10fSxlLnByb3RvdHlwZS5pc0xpbmVFZGdlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbGFiZWwuaXNMaW5lKDApfHx0aGlzLl9sYWJlbC5pc0xpbmUoMSksZT0hdGhpcy5fbGFiZWwuaXNBcmVhKDApfHx0aGlzLl9sYWJlbC5hbGxQb3NpdGlvbnNFcXVhbCgwLGJpLkVYVEVSSU9SKSxuPSF0aGlzLl9sYWJlbC5pc0FyZWEoMSl8fHRoaXMuX2xhYmVsLmFsbFBvc2l0aW9uc0VxdWFsKDEsYmkuRVhURVJJT1IpO3JldHVybiB0JiZlJiZufSxlLnByb3RvdHlwZS5zZXRFZGdlUmluZz1mdW5jdGlvbih0KXt0aGlzLl9lZGdlUmluZz10fSxlLnByb3RvdHlwZS5nZXRNaW5FZGdlUmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5FZGdlUmluZ30sZS5wcm90b3R5cGUuZ2V0RGVwdGhEZWx0YT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2VkZ2UuZ2V0RGVwdGhEZWx0YSgpO3JldHVybiB0aGlzLl9pc0ZvcndhcmR8fCh0PS10KSx0fSxlLnByb3RvdHlwZS5zZXRJblJlc3VsdD1mdW5jdGlvbih0KXt0aGlzLl9pc0luUmVzdWx0PXR9LGUucHJvdG90eXBlLmdldFN5bT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zeW19LGUucHJvdG90eXBlLmlzRm9yd2FyZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0ZvcndhcmR9LGUucHJvdG90eXBlLmdldEVkZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZX0sZS5wcm90b3R5cGUucHJpbnRFZGdlPWZ1bmN0aW9uKHQpe3RoaXMucHJpbnQodCksdC5wcmludCgiICIpLHRoaXMuX2lzRm9yd2FyZD90aGlzLl9lZGdlLnByaW50KHQpOnRoaXMuX2VkZ2UucHJpbnRSZXZlcnNlKHQpfSxlLnByb3RvdHlwZS5zZXRTeW09ZnVuY3Rpb24odCl7dGhpcy5fc3ltPXR9LGUucHJvdG90eXBlLnNldFZpc2l0ZWRFZGdlPWZ1bmN0aW9uKHQpe3RoaXMuc2V0VmlzaXRlZCh0KSx0aGlzLl9zeW0uc2V0VmlzaXRlZCh0KX0sZS5wcm90b3R5cGUuc2V0RWRnZURlcHRocz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0RWRnZSgpLmdldERlcHRoRGVsdGEoKTt0aGlzLl9pc0ZvcndhcmR8fChuPS1uKTt2YXIgcj0xO3Q9PT1Gcy5MRUZUJiYocj0tMSk7dmFyIGk9RnMub3Bwb3NpdGUodCksbz1lK24qcjt0aGlzLnNldERlcHRoKHQsZSksdGhpcy5zZXREZXB0aChpLG8pfSxlLnByb3RvdHlwZS5nZXRFZGdlUmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlUmluZ30sZS5wcm90b3R5cGUuaXNJblJlc3VsdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0luUmVzdWx0fSxlLnByb3RvdHlwZS5zZXROZXh0PWZ1bmN0aW9uKHQpe3RoaXMuX25leHQ9dH0sZS5wcm90b3R5cGUuaXNWaXNpdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmlzaXRlZH0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS5kZXB0aEZhY3Rvcj1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09YmkuRVhURVJJT1ImJmU9PT1iaS5JTlRFUklPUj8xOnQ9PT1iaS5JTlRFUklPUiYmZT09PWJpLkVYVEVSSU9SPy0xOjB9LGV9KFpzKSxKcz1mdW5jdGlvbigpe307SnMucHJvdG90eXBlLmNyZWF0ZU5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBZcyh0LG51bGwpfSxKcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSnMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEpzfTt2YXIgUXM9ZnVuY3Rpb24oKXtpZih0aGlzLl9lZGdlcz1uZXcgeG8sdGhpcy5fbm9kZXM9bnVsbCx0aGlzLl9lZGdlRW5kTGlzdD1uZXcgeG8sMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5fbm9kZXM9bmV3IFhzKG5ldyBKcyk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX25vZGVzPW5ldyBYcyh0KX19O1FzLnByb3RvdHlwZS5wcmludEVkZ2VzPWZ1bmN0aW9uKHQpe3QucHJpbnRsbigiRWRnZXM6Iik7Zm9yKHZhciBlPTA7ZTx0aGlzLl9lZGdlcy5zaXplKCk7ZSsrKXt0LnByaW50bG4oImVkZ2UgIitlKyI6Iik7dmFyIG49dGhpcy5fZWRnZXMuZ2V0KGUpO24ucHJpbnQodCksbi5laUxpc3QucHJpbnQodCl9fSxRcy5wcm90b3R5cGUuZmluZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbm9kZXMuZmluZCh0KX0sUXMucHJvdG90eXBlLmFkZE5vZGU9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIFlzKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX25vZGVzLmFkZE5vZGUodCl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl9ub2Rlcy5hZGROb2RlKGUpfX0sUXMucHJvdG90eXBlLmdldE5vZGVJdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2Rlcy5pdGVyYXRvcigpfSxRcy5wcm90b3R5cGUubGlua1Jlc3VsdERpcmVjdGVkRWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fbm9kZXMuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLmdldEVkZ2VzKCkubGlua1Jlc3VsdERpcmVjdGVkRWRnZXMoKX19LFFzLnByb3RvdHlwZS5kZWJ1Z1ByaW50bG49ZnVuY3Rpb24odCl7a2kub3V0LnByaW50bG4odCl9LFFzLnByb3RvdHlwZS5pc0JvdW5kYXJ5Tm9kZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX25vZGVzLmZpbmQoZSk7aWYobnVsbD09PW4pcmV0dXJuITE7dmFyIHI9bi5nZXRMYWJlbCgpO3JldHVybiBudWxsIT09ciYmci5nZXRMb2NhdGlvbih0KT09PWJpLkJPVU5EQVJZfSxRcy5wcm90b3R5cGUubGlua0FsbERpcmVjdGVkRWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fbm9kZXMuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLmdldEVkZ2VzKCkubGlua0FsbERpcmVjdGVkRWRnZXMoKX19LFFzLnByb3RvdHlwZS5tYXRjaEluU2FtZURpcmVjdGlvbj1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4hIXQuZXF1YWxzKG4pJiYoZW8uY29tcHV0ZU9yaWVudGF0aW9uKHQsZSxyKT09PWVvLkNPTExJTkVBUiYmV3MucXVhZHJhbnQodCxlKT09PVdzLnF1YWRyYW50KG4scikpfSxRcy5wcm90b3R5cGUuZ2V0RWRnZUVuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZUVuZExpc3R9LFFzLnByb3RvdHlwZS5kZWJ1Z1ByaW50PWZ1bmN0aW9uKHQpe2tpLm91dC5wcmludCh0KX0sUXMucHJvdG90eXBlLmdldEVkZ2VJdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlcy5pdGVyYXRvcigpfSxRcy5wcm90b3R5cGUuZmluZEVkZ2VJblNhbWVEaXJlY3Rpb249ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcyxyPTA7cjx0aGlzLl9lZGdlcy5zaXplKCk7cisrKXt2YXIgaT1uLl9lZGdlcy5nZXQociksbz1pLmdldENvb3JkaW5hdGVzKCk7aWYobi5tYXRjaEluU2FtZURpcmVjdGlvbih0LGUsb1swXSxvWzFdKXx8bi5tYXRjaEluU2FtZURpcmVjdGlvbih0LGUsb1tvLmxlbmd0aC0xXSxvW28ubGVuZ3RoLTJdKSlyZXR1cm4gaX1yZXR1cm4gbnVsbH0sUXMucHJvdG90eXBlLmluc2VydEVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5fZWRnZXMuYWRkKHQpfSxRcy5wcm90b3R5cGUuZmluZEVkZ2VFbmQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZ2V0RWRnZUVuZHMoKS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7aWYobi5nZXRFZGdlKCk9PT10KXJldHVybiBufXJldHVybiBudWxsfSxRcy5wcm90b3R5cGUuYWRkRWRnZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtlLl9lZGdlcy5hZGQocik7dmFyIGk9bmV3IEtzKHIsITApLG89bmV3IEtzKHIsITEpO2kuc2V0U3ltKG8pLG8uc2V0U3ltKGkpLGUuYWRkKGkpLGUuYWRkKG8pfX0sUXMucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt0aGlzLl9ub2Rlcy5hZGQodCksdGhpcy5fZWRnZUVuZExpc3QuYWRkKHQpfSxRcy5wcm90b3R5cGUuZ2V0Tm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZXMudmFsdWVzKCl9LFFzLnByb3RvdHlwZS5maW5kRWRnZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dGhpcy5fZWRnZXMuc2l6ZSgpO24rKyl7dmFyIHI9dGhpcy5fZWRnZXMuZ2V0KG4pLGk9ci5nZXRDb29yZGluYXRlcygpO2lmKHQuZXF1YWxzKGlbMF0pJiZlLmVxdWFscyhpWzFdKSlyZXR1cm4gcn1yZXR1cm4gbnVsbH0sUXMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFFzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBRc30sUXMubGlua1Jlc3VsdERpcmVjdGVkRWRnZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLmdldEVkZ2VzKCkubGlua1Jlc3VsdERpcmVjdGVkRWRnZXMoKX19O3ZhciAkcz1mdW5jdGlvbigpe3RoaXMuX2dlb21ldHJ5RmFjdG9yeT1udWxsLHRoaXMuX3NoZWxsTGlzdD1uZXcgeG87dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2dlb21ldHJ5RmFjdG9yeT10fTskcy5wcm90b3R5cGUuc29ydFNoZWxsc0FuZEhvbGVzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9dC5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7aS5pc0hvbGUoKT9uLmFkZChpKTplLmFkZChpKX19LCRzLnByb3RvdHlwZS5jb21wdXRlUG9seWdvbnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPXQuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpLnRvUG9seWdvbih0aGlzLl9nZW9tZXRyeUZhY3RvcnkpO2UuYWRkKHIpfXJldHVybiBlfSwkcy5wcm90b3R5cGUucGxhY2VGcmVlSG9sZXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7aWYobnVsbD09PXIuZ2V0U2hlbGwoKSl7dmFyIGk9dGhpcy5maW5kRWRnZVJpbmdDb250YWluaW5nKHIsdCk7aWYobnVsbD09PWkpdGhyb3cgbmV3IFJzKCJ1bmFibGUgdG8gYXNzaWduIGhvbGUgdG8gYSBzaGVsbCIsci5nZXRDb29yZGluYXRlKDApKTtyLnNldFNoZWxsKGkpfX19LCRzLnByb3RvdHlwZS5idWlsZE1pbmltYWxFZGdlUmluZ3M9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uZXcgeG8saT10Lml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKTtpZihvLmdldE1heE5vZGVEZWdyZWUoKT4yKXtvLmxpbmtEaXJlY3RlZEVkZ2VzRm9yTWluaW1hbEVkZ2VSaW5ncygpO3ZhciBzPW8uYnVpbGRNaW5pbWFsUmluZ3MoKSxhPXRoaXMuZmluZFNoZWxsKHMpO251bGwhPT1hPyh0aGlzLnBsYWNlUG9seWdvbkhvbGVzKGEscyksZS5hZGQoYSkpOm4uYWRkQWxsKHMpfWVsc2Ugci5hZGQobyl9cmV0dXJuIHJ9LCRzLnByb3RvdHlwZS5jb250YWluc1BvaW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9zaGVsbExpc3QuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2lmKGUubmV4dCgpLmNvbnRhaW5zUG9pbnQodCkpcmV0dXJuITB9cmV0dXJuITF9LCRzLnByb3RvdHlwZS5idWlsZE1heGltYWxFZGdlUmluZ3M9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPXQuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2lmKHIuaXNJblJlc3VsdCgpJiZyLmdldExhYmVsKCkuaXNBcmVhKCkmJm51bGw9PT1yLmdldEVkZ2VSaW5nKCkpe3ZhciBpPW5ldyBWcyhyLHRoaXMuX2dlb21ldHJ5RmFjdG9yeSk7ZS5hZGQoaSksaS5zZXRJblJlc3VsdCgpfX1yZXR1cm4gZX0sJHMucHJvdG90eXBlLnBsYWNlUG9seWdvbkhvbGVzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3IuaXNIb2xlKCkmJnIuc2V0U2hlbGwodCl9fSwkcy5wcm90b3R5cGUuZ2V0UG9seWdvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wdXRlUG9seWdvbnModGhpcy5fc2hlbGxMaXN0KX0sJHMucHJvdG90eXBlLmZpbmRFZGdlUmluZ0NvbnRhaW5pbmc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5nZXRMaW5lYXJSaW5nKCkscj1uLmdldEVudmVsb3BlSW50ZXJuYWwoKSxpPW4uZ2V0Q29vcmRpbmF0ZU4oMCksbz1udWxsLHM9bnVsbCxhPWUuaXRlcmF0b3IoKTthLmhhc05leHQoKTspe3ZhciB1PWEubmV4dCgpLGM9dS5nZXRMaW5lYXJSaW5nKCksbD1jLmdldEVudmVsb3BlSW50ZXJuYWwoKTtudWxsIT09byYmKHM9by5nZXRMaW5lYXJSaW5nKCkuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKTt2YXIgaD0hMTtsLmNvbnRhaW5zKHIpJiZlby5pc1BvaW50SW5SaW5nKGksYy5nZXRDb29yZGluYXRlcygpKSYmKGg9ITApLGgmJihudWxsPT09b3x8cy5jb250YWlucyhsKSkmJihvPXUpfXJldHVybiBvfSwkcy5wcm90b3R5cGUuZmluZFNoZWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49bnVsbCxyPXQuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO2kuaXNIb2xlKCl8fChuPWksZSsrKX1yZXR1cm4gWmkuaXNUcnVlKGU8PTEsImZvdW5kIHR3byBzaGVsbHMgaW4gTWluaW1hbEVkZ2VSaW5nIGxpc3QiKSxufSwkcy5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmFkZCh0LmdldEVkZ2VFbmRzKCksdC5nZXROb2RlcygpKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07UXMubGlua1Jlc3VsdERpcmVjdGVkRWRnZXMoYXJndW1lbnRzWzFdKTt2YXIgbj10aGlzLmJ1aWxkTWF4aW1hbEVkZ2VSaW5ncyhlKSxyPW5ldyB4byxpPXRoaXMuYnVpbGRNaW5pbWFsRWRnZVJpbmdzKG4sdGhpcy5fc2hlbGxMaXN0LHIpO3RoaXMuc29ydFNoZWxsc0FuZEhvbGVzKGksdGhpcy5fc2hlbGxMaXN0LHIpLHRoaXMucGxhY2VGcmVlSG9sZXModGhpcy5fc2hlbGxMaXN0LHIpfX0sJHMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LCRzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiAkc307dmFyIHRhPWZ1bmN0aW9uKCl7fTt0YS5wcm90b3R5cGUuZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7fSx0YS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdGEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHRhfTt2YXIgZWE9ZnVuY3Rpb24oKXt0aGlzLl9ib3VuZHM9bnVsbCx0aGlzLl9pdGVtPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2JvdW5kcz10LHRoaXMuX2l0ZW09ZX07ZWEucHJvdG90eXBlLmdldEl0ZW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXRlbX0sZWEucHJvdG90eXBlLmdldEJvdW5kcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ib3VuZHN9LGVhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt0YSxtaV19LGVhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlYX07dmFyIG5hPWZ1bmN0aW9uKCl7dGhpcy5fc2l6ZT1udWxsLHRoaXMuX2l0ZW1zPW51bGwsdGhpcy5fc2l6ZT0wLHRoaXMuX2l0ZW1zPW5ldyB4byx0aGlzLl9pdGVtcy5hZGQobnVsbCl9O25hLnByb3RvdHlwZS5wb2xsPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5faXRlbXMuZ2V0KDEpO3JldHVybiB0aGlzLl9pdGVtcy5zZXQoMSx0aGlzLl9pdGVtcy5nZXQodGhpcy5fc2l6ZSkpLHRoaXMuX3NpemUtPTEsdGhpcy5yZW9yZGVyKDEpLHR9LG5hLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NpemV9LG5hLnByb3RvdHlwZS5yZW9yZGVyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49bnVsbCxyPXRoaXMuX2l0ZW1zLmdldCh0KTsyKnQ8PXRoaXMuX3NpemUmJigobj0yKnQpIT09ZS5fc2l6ZSYmZS5faXRlbXMuZ2V0KG4rMSkuY29tcGFyZVRvKGUuX2l0ZW1zLmdldChuKSk8MCYmbisrLGUuX2l0ZW1zLmdldChuKS5jb21wYXJlVG8ocik8MCk7dD1uKWUuX2l0ZW1zLnNldCh0LGUuX2l0ZW1zLmdldChuKSk7dGhpcy5faXRlbXMuc2V0KHQscil9LG5hLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX3NpemU9MCx0aGlzLl9pdGVtcy5jbGVhcigpfSxuYS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5fc2l6ZX0sbmEucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt0aGlzLl9pdGVtcy5hZGQobnVsbCksdGhpcy5fc2l6ZSs9MTt2YXIgZT10aGlzLl9zaXplO2Zvcih0aGlzLl9pdGVtcy5zZXQoMCx0KTt0LmNvbXBhcmVUbyh0aGlzLl9pdGVtcy5nZXQoTWF0aC50cnVuYyhlLzIpKSk8MDtlLz0yKXRoaXMuX2l0ZW1zLnNldChlLHRoaXMuX2l0ZW1zLmdldChNYXRoLnRydW5jKGUvMikpKTt0aGlzLl9pdGVtcy5zZXQoZSx0KX0sbmEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LG5hLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBuYX07dmFyIHJhPWZ1bmN0aW9uKCl7fTtyYS5wcm90b3R5cGUudmlzaXRJdGVtPWZ1bmN0aW9uKHQpe30scmEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHJhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiByYX07dmFyIGlhPWZ1bmN0aW9uKCl7fTtpYS5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7fSxpYS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7fSxpYS5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24oKXt9LGlhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxpYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaWF9O3ZhciBvYT1mdW5jdGlvbigpe2lmKHRoaXMuX2NoaWxkQm91bmRhYmxlcz1uZXcgeG8sdGhpcy5fYm91bmRzPW51bGwsdGhpcy5fbGV2ZWw9bnVsbCwwIT09YXJndW1lbnRzLmxlbmd0aCYmMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9sZXZlbD10fX0sc2E9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O29hLnByb3RvdHlwZS5nZXRMZXZlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sZXZlbH0sb2EucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hpbGRCb3VuZGFibGVzLnNpemUoKX0sb2EucHJvdG90eXBlLmdldENoaWxkQm91bmRhYmxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGlsZEJvdW5kYWJsZXN9LG9hLnByb3RvdHlwZS5hZGRDaGlsZEJvdW5kYWJsZT1mdW5jdGlvbih0KXtaaS5pc1RydWUobnVsbD09PXRoaXMuX2JvdW5kcyksdGhpcy5fY2hpbGRCb3VuZGFibGVzLmFkZCh0KX0sb2EucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hpbGRCb3VuZGFibGVzLmlzRW1wdHkoKX0sb2EucHJvdG90eXBlLmdldEJvdW5kcz1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fYm91bmRzJiYodGhpcy5fYm91bmRzPXRoaXMuY29tcHV0ZUJvdW5kcygpKSx0aGlzLl9ib3VuZHN9LG9hLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt0YSxtaV19LG9hLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBvYX0sc2Euc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg1YTFlNTVlYzQxMzY5ODAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYSxzYSk7dmFyIGFhPWZ1bmN0aW9uKCl7fTthYS5yZXZlcnNlT3JkZXI9ZnVuY3Rpb24oKXtyZXR1cm57Y29tcGFyZTpmdW5jdGlvbih0LGUpe3JldHVybiBlLmNvbXBhcmVUbyh0KX19fSxhYS5taW49ZnVuY3Rpb24odCl7cmV0dXJuIGFhLnNvcnQodCksdC5nZXQoMCl9LGFhLnNvcnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnRvQXJyYXkoKTtlP1ZvLnNvcnQobixlKTpWby5zb3J0KG4pO2Zvcih2YXIgcj10Lml0ZXJhdG9yKCksaT0wLG89bi5sZW5ndGg7aTxvO2krKylyLm5leHQoKSxyLnNldChuW2ldKX0sYWEuc2luZ2xldG9uTGlzdD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgeG87cmV0dXJuIGUuYWRkKHQpLGV9O3ZhciB1YT1mdW5jdGlvbigpe3RoaXMuX2JvdW5kYWJsZTE9bnVsbCx0aGlzLl9ib3VuZGFibGUyPW51bGwsdGhpcy5fZGlzdGFuY2U9bnVsbCx0aGlzLl9pdGVtRGlzdGFuY2U9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07dGhpcy5fYm91bmRhYmxlMT10LHRoaXMuX2JvdW5kYWJsZTI9ZSx0aGlzLl9pdGVtRGlzdGFuY2U9bix0aGlzLl9kaXN0YW5jZT10aGlzLmRpc3RhbmNlKCl9O3VhLnByb3RvdHlwZS5leHBhbmRUb1F1ZXVlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dWEuaXNDb21wb3NpdGUodGhpcy5fYm91bmRhYmxlMSkscj11YS5pc0NvbXBvc2l0ZSh0aGlzLl9ib3VuZGFibGUyKTtpZihuJiZyKXJldHVybiB1YS5hcmVhKHRoaXMuX2JvdW5kYWJsZTEpPnVhLmFyZWEodGhpcy5fYm91bmRhYmxlMik/KHRoaXMuZXhwYW5kKHRoaXMuX2JvdW5kYWJsZTEsdGhpcy5fYm91bmRhYmxlMix0LGUpLG51bGwpOih0aGlzLmV4cGFuZCh0aGlzLl9ib3VuZGFibGUyLHRoaXMuX2JvdW5kYWJsZTEsdCxlKSxudWxsKTtpZihuKXJldHVybiB0aGlzLmV4cGFuZCh0aGlzLl9ib3VuZGFibGUxLHRoaXMuX2JvdW5kYWJsZTIsdCxlKSxudWxsO2lmKHIpcmV0dXJuIHRoaXMuZXhwYW5kKHRoaXMuX2JvdW5kYWJsZTIsdGhpcy5fYm91bmRhYmxlMSx0LGUpLG51bGw7dGhyb3cgbmV3IGhpfSx1YS5wcm90b3R5cGUuaXNMZWF2ZXM9ZnVuY3Rpb24oKXtyZXR1cm4hKHVhLmlzQ29tcG9zaXRlKHRoaXMuX2JvdW5kYWJsZTEpfHx1YS5pc0NvbXBvc2l0ZSh0aGlzLl9ib3VuZGFibGUyKSl9LHVhLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5fZGlzdGFuY2U8ZS5fZGlzdGFuY2U/LTE6dGhpcy5fZGlzdGFuY2U+ZS5fZGlzdGFuY2U/MTowfSx1YS5wcm90b3R5cGUuZXhwYW5kPWZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaT10LmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKSxzPW5ldyB1YShvLGUsdGhpcy5faXRlbURpc3RhbmNlKTtzLmdldERpc3RhbmNlKCk8ciYmbi5hZGQocyl9fSx1YS5wcm90b3R5cGUuZ2V0Qm91bmRhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dD90aGlzLl9ib3VuZGFibGUxOnRoaXMuX2JvdW5kYWJsZTJ9LHVhLnByb3RvdHlwZS5nZXREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXN0YW5jZX0sdWEucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNMZWF2ZXMoKT90aGlzLl9pdGVtRGlzdGFuY2UuZGlzdGFuY2UodGhpcy5fYm91bmRhYmxlMSx0aGlzLl9ib3VuZGFibGUyKTp0aGlzLl9ib3VuZGFibGUxLmdldEJvdW5kcygpLmRpc3RhbmNlKHRoaXMuX2JvdW5kYWJsZTIuZ2V0Qm91bmRzKCkpfSx1YS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSx1YS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdWF9LHVhLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0Qm91bmRzKCkuZ2V0QXJlYSgpfSx1YS5pc0NvbXBvc2l0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIG9hfTt2YXIgY2E9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX3Jvb3Q9bnVsbCx0aGlzLl9idWlsdD0hMSx0aGlzLl9pdGVtQm91bmRhYmxlcz1uZXcgeG8sdGhpcy5fbm9kZUNhcGFjaXR5PW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPXQuREVGQVVMVF9OT0RFX0NBUEFDSVRZO3RoaXMuX25vZGVDYXBhY2l0eT1lfWVsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXTtaaS5pc1RydWUobj4xLCJOb2RlIGNhcGFjaXR5IG11c3QgYmUgZ3JlYXRlciB0aGFuIDEiKSx0aGlzLl9ub2RlQ2FwYWNpdHk9bn19LGxhPXtJbnRlcnNlY3RzT3A6e2NvbmZpZ3VyYWJsZTohMH0sc2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxERUZBVUxUX05PREVfQ0FQQUNJVFk6e2NvbmZpZ3VyYWJsZTohMH19O2NhLnByb3RvdHlwZS5nZXROb2RlQ2FwYWNpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZUNhcGFjaXR5fSxjYS5wcm90b3R5cGUubGFzdE5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0KHQuc2l6ZSgpLTEpfSxjYS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmlzRW1wdHkoKT8wOih0aGlzLmJ1aWxkKCksdGhpcy5zaXplKHRoaXMuX3Jvb3QpKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciB0PTAsZT1hcmd1bWVudHNbMF0uZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO24gaW5zdGFuY2VvZiBvYT90Kz10aGlzLnNpemUobik6biBpbnN0YW5jZW9mIGVhJiYodCs9MSl9cmV0dXJuIHR9fSxjYS5wcm90b3R5cGUucmVtb3ZlSXRlbT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1udWxsLHI9dC5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7aSBpbnN0YW5jZW9mIGVhJiZpLmdldEl0ZW0oKT09PWUmJihuPWkpfXJldHVybiBudWxsIT09biYmKHQuZ2V0Q2hpbGRCb3VuZGFibGVzKCkucmVtb3ZlKG4pLCEwKX0sY2EucHJvdG90eXBlLml0ZW1zVHJlZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXt0aGlzLmJ1aWxkKCk7dmFyIHQ9dGhpcy5pdGVtc1RyZWUodGhpcy5fcm9vdCk7cmV0dXJuIG51bGw9PT10P25ldyB4bzp0fWlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49bmV3IHhvLHI9ZS5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7aWYoaSBpbnN0YW5jZW9mIG9hKXt2YXIgbz10aGlzLml0ZW1zVHJlZShpKTtudWxsIT09byYmbi5hZGQobyl9ZWxzZSBpIGluc3RhbmNlb2YgZWE/bi5hZGQoaS5nZXRJdGVtKCkpOlppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCl9cmV0dXJuIG4uc2l6ZSgpPD0wP251bGw6bn19LGNhLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlKXtaaS5pc1RydWUoIXRoaXMuX2J1aWx0LCJDYW5ub3QgaW5zZXJ0IGl0ZW1zIGludG8gYW4gU1RSIHBhY2tlZCBSLXRyZWUgYWZ0ZXIgaXQgaGFzIGJlZW4gYnVpbHQuIiksdGhpcy5faXRlbUJvdW5kYWJsZXMuYWRkKG5ldyBlYSh0LGUpKX0sY2EucHJvdG90eXBlLmJvdW5kYWJsZXNBdExldmVsPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPW5ldyB4bztyZXR1cm4gdGhpcy5ib3VuZGFibGVzQXRMZXZlbCh0LHRoaXMuX3Jvb3QsZSksZX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdO2lmKFppLmlzVHJ1ZShuPi0yKSxyLmdldExldmVsKCk9PT1uKXJldHVybiBpLmFkZChyKSxudWxsO2Zvcih2YXIgbz1yLmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKTtzIGluc3RhbmNlb2Ygb2E/dGhpcy5ib3VuZGFibGVzQXRMZXZlbChuLHMsaSk6KFppLmlzVHJ1ZShzIGluc3RhbmNlb2YgZWEpLC0xPT09biYmaS5hZGQocykpfXJldHVybiBudWxsfX0sY2EucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuYnVpbGQoKTt2YXIgbj1uZXcgeG87cmV0dXJuIHRoaXMuaXNFbXB0eSgpfHx0aGlzLmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHModGhpcy5fcm9vdC5nZXRCb3VuZHMoKSxlKSYmdGhpcy5xdWVyeShlLHRoaXMuX3Jvb3Qsbiksbn1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO2lmKHRoaXMuYnVpbGQoKSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt0aGlzLmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHModGhpcy5fcm9vdC5nZXRCb3VuZHMoKSxyKSYmdGhpcy5xdWVyeShyLHRoaXMuX3Jvb3QsaSl9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihFaShhcmd1bWVudHNbMl0scmEpJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBvYSlmb3IodmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzFdLmdldENoaWxkQm91bmRhYmxlcygpLHU9MDt1PGEuc2l6ZSgpO3UrKyl7dmFyIGM9YS5nZXQodSk7IXQuZ2V0SW50ZXJzZWN0c09wKCkuaW50ZXJzZWN0cyhjLmdldEJvdW5kcygpLG8pfHwoYyBpbnN0YW5jZW9mIG9hP3QucXVlcnkobyxjLHMpOmMgaW5zdGFuY2VvZiBlYT9zLnZpc2l0SXRlbShjLmdldEl0ZW0oKSk6Wmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoKSl9ZWxzZSBpZihFaShhcmd1bWVudHNbMl0sdm8pJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBvYSlmb3IodmFyIGw9YXJndW1lbnRzWzBdLGg9YXJndW1lbnRzWzJdLGY9YXJndW1lbnRzWzFdLmdldENoaWxkQm91bmRhYmxlcygpLHA9MDtwPGYuc2l6ZSgpO3ArKyl7dmFyIGQ9Zi5nZXQocCk7IXQuZ2V0SW50ZXJzZWN0c09wKCkuaW50ZXJzZWN0cyhkLmdldEJvdW5kcygpLGwpfHwoZCBpbnN0YW5jZW9mIG9hP3QucXVlcnkobCxkLGgpOmQgaW5zdGFuY2VvZiBlYT9oLmFkZChkLmdldEl0ZW0oKSk6Wmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoKSl9fSxjYS5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9idWlsdClyZXR1cm4gbnVsbDt0aGlzLl9yb290PXRoaXMuX2l0ZW1Cb3VuZGFibGVzLmlzRW1wdHkoKT90aGlzLmNyZWF0ZU5vZGUoMCk6dGhpcy5jcmVhdGVIaWdoZXJMZXZlbHModGhpcy5faXRlbUJvdW5kYWJsZXMsLTEpLHRoaXMuX2l0ZW1Cb3VuZGFibGVzPW51bGwsdGhpcy5fYnVpbHQ9ITB9LGNhLnByb3RvdHlwZS5nZXRSb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnVpbGQoKSx0aGlzLl9yb290fSxjYS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5idWlsZCgpLCEhdGhpcy5nZXRJbnRlcnNlY3RzT3AoKS5pbnRlcnNlY3RzKHRoaXMuX3Jvb3QuZ2V0Qm91bmRzKCksdCkmJnRoaXMucmVtb3ZlKHQsdGhpcy5fcm9vdCxlKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdLG89dGhpcy5yZW1vdmVJdGVtKHIsaSk7aWYobylyZXR1cm4hMDtmb3IodmFyIHM9bnVsbCxhPXIuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTthLmhhc05leHQoKTspe3ZhciB1PWEubmV4dCgpO2lmKHRoaXMuZ2V0SW50ZXJzZWN0c09wKCkuaW50ZXJzZWN0cyh1LmdldEJvdW5kcygpLG4pJiZ1IGluc3RhbmNlb2Ygb2EmJihvPXRoaXMucmVtb3ZlKG4sdSxpKSkpe3M9dTticmVha319cmV0dXJuIG51bGwhPT1zJiZzLmdldENoaWxkQm91bmRhYmxlcygpLmlzRW1wdHkoKSYmci5nZXRDaGlsZEJvdW5kYWJsZXMoKS5yZW1vdmUocyksb319LGNhLnByb3RvdHlwZS5jcmVhdGVIaWdoZXJMZXZlbHM9ZnVuY3Rpb24odCxlKXtaaS5pc1RydWUoIXQuaXNFbXB0eSgpKTt2YXIgbj10aGlzLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXModCxlKzEpO3JldHVybiAxPT09bi5zaXplKCk/bi5nZXQoMCk6dGhpcy5jcmVhdGVIaWdoZXJMZXZlbHMobixlKzEpfSxjYS5wcm90b3R5cGUuZGVwdGg9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5pc0VtcHR5KCk/MDoodGhpcy5idWlsZCgpLHRoaXMuZGVwdGgodGhpcy5fcm9vdCkpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIHQ9MCxlPWFyZ3VtZW50c1swXS5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7aWYobiBpbnN0YW5jZW9mIG9hKXt2YXIgcj10aGlzLmRlcHRoKG4pO3I+dCYmKHQ9cil9fXJldHVybiB0KzF9fSxjYS5wcm90b3R5cGUuY3JlYXRlUGFyZW50Qm91bmRhYmxlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7WmkuaXNUcnVlKCF0LmlzRW1wdHkoKSk7dmFyIHI9bmV3IHhvO3IuYWRkKHRoaXMuY3JlYXRlTm9kZShlKSk7dmFyIGk9bmV3IHhvKHQpO2FhLnNvcnQoaSx0aGlzLmdldENvbXBhcmF0b3IoKSk7Zm9yKHZhciBvPWkuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspe3ZhciBzPW8ubmV4dCgpO24ubGFzdE5vZGUocikuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuc2l6ZSgpPT09bi5nZXROb2RlQ2FwYWNpdHkoKSYmci5hZGQobi5jcmVhdGVOb2RlKGUpKSxuLmxhc3ROb2RlKHIpLmFkZENoaWxkQm91bmRhYmxlKHMpfXJldHVybiByfSxjYS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9idWlsdD90aGlzLl9yb290LmlzRW1wdHkoKTp0aGlzLl9pdGVtQm91bmRhYmxlcy5pc0VtcHR5KCl9LGNhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblttaV19LGNhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBjYX0sY2EuY29tcGFyZURvdWJsZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD5lPzE6dDxlPy0xOjB9LGxhLkludGVyc2VjdHNPcC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gaGF9LGxhLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4MzVlZjY0YzgyZDRjNTQwMH0sbGEuREVGQVVMVF9OT0RFX0NBUEFDSVRZLmdldD1mdW5jdGlvbigpe3JldHVybiAxMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2EsbGEpO3ZhciBoYT1mdW5jdGlvbigpe30sZmE9ZnVuY3Rpb24oKXt9O2ZhLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe30sZmEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGZhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBmYX07dmFyIHBhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7bj1ufHxlLkRFRkFVTFRfTk9ERV9DQVBBQ0lUWSx0LmNhbGwodGhpcyxuKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17U1RSdHJlZU5vZGU6e2NvbmZpZ3VyYWJsZTohMH0sc2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSx4Q29tcGFyYXRvcjp7Y29uZmlndXJhYmxlOiEwfSx5Q29tcGFyYXRvcjp7Y29uZmlndXJhYmxlOiEwfSxpbnRlcnNlY3RzT3A6e2NvbmZpZ3VyYWJsZTohMH0sREVGQVVMVF9OT0RFX0NBUEFDSVRZOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuY3JlYXRlUGFyZW50Qm91bmRhYmxlc0Zyb21WZXJ0aWNhbFNsaWNlcz1mdW5jdGlvbih0LGUpe1ppLmlzVHJ1ZSh0Lmxlbmd0aD4wKTtmb3IodmFyIG49bmV3IHhvLHI9MDtyPHQubGVuZ3RoO3IrKyluLmFkZEFsbCh0aGlzLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXNGcm9tVmVydGljYWxTbGljZSh0W3JdLGUpKTtyZXR1cm4gbn0sZS5wcm90b3R5cGUuY3JlYXRlTm9kZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGRhKHQpfSxlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3QucHJvdG90eXBlLnNpemUuY2FsbCh0aGlzKTp0LnByb3RvdHlwZS5zaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKCl7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQucHJvdG90eXBlLmluc2VydC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKGUuaXNOdWxsKCkpcmV0dXJuIG51bGw7dC5wcm90b3R5cGUuaW5zZXJ0LmNhbGwodGhpcyxlLG4pfSxlLnByb3RvdHlwZS5nZXRJbnRlcnNlY3RzT3A9ZnVuY3Rpb24oKXtyZXR1cm4gZS5pbnRlcnNlY3RzT3B9LGUucHJvdG90eXBlLnZlcnRpY2FsU2xpY2VzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPU1hdGgudHJ1bmMoTWF0aC5jZWlsKHQuc2l6ZSgpL2UpKSxyPW5ldyBBcnJheShlKS5maWxsKG51bGwpLGk9dC5pdGVyYXRvcigpLG89MDtvPGU7bysrKXtyW29dPW5ldyB4bztmb3IodmFyIHM9MDtpLmhhc05leHQoKSYmczxuOyl7dmFyIGE9aS5uZXh0KCk7cltvXS5hZGQoYSkscysrfX1yZXR1cm4gcn0sZS5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0LnByb3RvdHlwZS5xdWVyeS5jYWxsKHRoaXMsZSl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0LnByb3RvdHlwZS5xdWVyeS5jYWxsKHRoaXMsbixyKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKWlmKEVpKGFyZ3VtZW50c1syXSxyYSkmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgT2JqZWN0JiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIG9hKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl07dC5wcm90b3R5cGUucXVlcnkuY2FsbCh0aGlzLGksbyxzKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1syXSx2bykmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgT2JqZWN0JiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIG9hKXt2YXIgYT1hcmd1bWVudHNbMF0sdT1hcmd1bWVudHNbMV0sYz1hcmd1bWVudHNbMl07dC5wcm90b3R5cGUucXVlcnkuY2FsbCh0aGlzLGEsdSxjKX19LGUucHJvdG90eXBlLmdldENvbXBhcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gZS55Q29tcGFyYXRvcn0sZS5wcm90b3R5cGUuY3JlYXRlUGFyZW50Qm91bmRhYmxlc0Zyb21WZXJ0aWNhbFNsaWNlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXMuY2FsbCh0aGlzLGUsbil9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuIHQucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMsZSxuKX1yZXR1cm4gdC5wcm90b3R5cGUucmVtb3ZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuZGVwdGg9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dC5wcm90b3R5cGUuZGVwdGguY2FsbCh0aGlzKTp0LnByb3RvdHlwZS5kZXB0aC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXM9ZnVuY3Rpb24odCxuKXtaaS5pc1RydWUoIXQuaXNFbXB0eSgpKTt2YXIgcj1NYXRoLnRydW5jKE1hdGguY2VpbCh0LnNpemUoKS90aGlzLmdldE5vZGVDYXBhY2l0eSgpKSksaT1uZXcgeG8odCk7YWEuc29ydChpLGUueENvbXBhcmF0b3IpO3ZhciBvPXRoaXMudmVydGljYWxTbGljZXMoaSxNYXRoLnRydW5jKE1hdGguY2VpbChNYXRoLnNxcnQocikpKSk7cmV0dXJuIHRoaXMuY3JlYXRlUGFyZW50Qm91bmRhYmxlc0Zyb21WZXJ0aWNhbFNsaWNlcyhvLG4pfSxlLnByb3RvdHlwZS5uZWFyZXN0TmVpZ2hib3VyPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKEVpKGFyZ3VtZW50c1swXSxmYSkpe3ZhciB0PWFyZ3VtZW50c1swXSxuPW5ldyB1YSh0aGlzLmdldFJvb3QoKSx0aGlzLmdldFJvb3QoKSx0KTtyZXR1cm4gdGhpcy5uZWFyZXN0TmVpZ2hib3VyKG4pfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWEpe3ZhciByPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5uZWFyZXN0TmVpZ2hib3VyKHIsZmkuUE9TSVRJVkVfSU5GSU5JVFkpfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGUmJkVpKGFyZ3VtZW50c1sxXSxmYSkpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPW5ldyB1YSh0aGlzLmdldFJvb3QoKSxpLmdldFJvb3QoKSxvKTtyZXR1cm4gdGhpcy5uZWFyZXN0TmVpZ2hib3VyKHMpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdWEmJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgYT1hcmd1bWVudHNbMF0sdT1hcmd1bWVudHNbMV0sYz1udWxsLGw9bmV3IG5hO2ZvcihsLmFkZChhKTshbC5pc0VtcHR5KCkmJnU+MDspe3ZhciBoPWwucG9sbCgpLGY9aC5nZXREaXN0YW5jZSgpO2lmKGY+PXUpYnJlYWs7aC5pc0xlYXZlcygpPyh1PWYsYz1oKTpoLmV4cGFuZFRvUXVldWUobCx1KX1yZXR1cm5bYy5nZXRCb3VuZGFibGUoMCkuZ2V0SXRlbSgpLGMuZ2V0Qm91bmRhYmxlKDEpLmdldEl0ZW0oKV19fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBwPWFyZ3VtZW50c1syXSxkPW5ldyBlYShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKSxnPW5ldyB1YSh0aGlzLmdldFJvb3QoKSxkLHApO3JldHVybiB0aGlzLm5lYXJlc3ROZWlnaGJvdXIoZylbMF19fSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltpYSxtaV19LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGUuY2VudHJlWD1mdW5jdGlvbih0KXtyZXR1cm4gZS5hdmcodC5nZXRNaW5YKCksdC5nZXRNYXhYKCkpfSxlLmF2Zz1mdW5jdGlvbih0LGUpe3JldHVybih0K2UpLzJ9LGUuY2VudHJlWT1mdW5jdGlvbih0KXtyZXR1cm4gZS5hdmcodC5nZXRNaW5ZKCksdC5nZXRNYXhZKCkpfSxuLlNUUnRyZWVOb2RlLmdldD1mdW5jdGlvbigpe3JldHVybiBkYX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDM5OTIwZjdkNWYyNjFlMH0sbi54Q29tcGFyYXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm57aW50ZXJmYWNlc186ZnVuY3Rpb24oKXtyZXR1cm5beWldfSxjb21wYXJlOmZ1bmN0aW9uKG4scil7cmV0dXJuIHQuY29tcGFyZURvdWJsZXMoZS5jZW50cmVYKG4uZ2V0Qm91bmRzKCkpLGUuY2VudHJlWChyLmdldEJvdW5kcygpKSl9fX0sbi55Q29tcGFyYXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm57aW50ZXJmYWNlc186ZnVuY3Rpb24oKXtyZXR1cm5beWldfSxjb21wYXJlOmZ1bmN0aW9uKG4scil7cmV0dXJuIHQuY29tcGFyZURvdWJsZXMoZS5jZW50cmVZKG4uZ2V0Qm91bmRzKCkpLGUuY2VudHJlWShyLmdldEJvdW5kcygpKSl9fX0sbi5pbnRlcnNlY3RzT3AuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJue2ludGVyZmFjZXNfOmZ1bmN0aW9uKCl7cmV0dXJuW3QuSW50ZXJzZWN0c09wXX0saW50ZXJzZWN0czpmdW5jdGlvbih0LGUpe3JldHVybiB0LmludGVyc2VjdHMoZSl9fX0sbi5ERUZBVUxUX05PREVfQ0FQQUNJVFkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDEwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KGNhKSxkYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9YXJndW1lbnRzWzBdO3QuY2FsbCh0aGlzLGUpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5jb21wdXRlQm91bmRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW51bGwsZT10aGlzLmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtudWxsPT09dD90PW5ldyBqaShuLmdldEJvdW5kcygpKTp0LmV4cGFuZFRvSW5jbHVkZShuLmdldEJvdW5kcygpKX1yZXR1cm4gdH0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0ob2EpLGdhPWZ1bmN0aW9uKCl7fTtnYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZ2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGdhfSxnYS5yZWxhdGl2ZVNpZ249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9LGdhLmNvbXBhcmU9ZnVuY3Rpb24odCxlLG4pe2lmKGUuZXF1YWxzMkQobikpcmV0dXJuIDA7dmFyIHI9Z2EucmVsYXRpdmVTaWduKGUueCxuLngpLGk9Z2EucmVsYXRpdmVTaWduKGUueSxuLnkpO3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIGdhLmNvbXBhcmVWYWx1ZShyLGkpO2Nhc2UgMTpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKGkscik7Y2FzZSAyOnJldHVybiBnYS5jb21wYXJlVmFsdWUoaSwtcik7Y2FzZSAzOnJldHVybiBnYS5jb21wYXJlVmFsdWUoLXIsaSk7Y2FzZSA0OnJldHVybiBnYS5jb21wYXJlVmFsdWUoLXIsLWkpO2Nhc2UgNTpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKC1pLC1yKTtjYXNlIDY6cmV0dXJuIGdhLmNvbXBhcmVWYWx1ZSgtaSxyKTtjYXNlIDc6cmV0dXJuIGdhLmNvbXBhcmVWYWx1ZShyLC1pKX1yZXR1cm4gWmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoImludmFsaWQgb2N0YW50IHZhbHVlIiksMH0sZ2EuY29tcGFyZVZhbHVlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8MD8tMTp0PjA/MTplPDA/LTE6ZT4wPzE6MH07dmFyIHlhPWZ1bmN0aW9uKCl7dGhpcy5fc2VnU3RyaW5nPW51bGwsdGhpcy5jb29yZD1udWxsLHRoaXMuc2VnbWVudEluZGV4PW51bGwsdGhpcy5fc2VnbWVudE9jdGFudD1udWxsLHRoaXMuX2lzSW50ZXJpb3I9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1hcmd1bWVudHNbM107dGhpcy5fc2VnU3RyaW5nPXQsdGhpcy5jb29yZD1uZXcgdmkoZSksdGhpcy5zZWdtZW50SW5kZXg9bix0aGlzLl9zZWdtZW50T2N0YW50PXIsdGhpcy5faXNJbnRlcmlvcj0hZS5lcXVhbHMyRCh0LmdldENvb3JkaW5hdGUobikpfTt5YS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvb3JkfSx5YS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludCh0aGlzLmNvb3JkKSx0LnByaW50KCIgc2VnICMgPSAiK3RoaXMuc2VnbWVudEluZGV4KX0seWEucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiB0aGlzLnNlZ21lbnRJbmRleDxlLnNlZ21lbnRJbmRleD8tMTp0aGlzLnNlZ21lbnRJbmRleD5lLnNlZ21lbnRJbmRleD8xOnRoaXMuY29vcmQuZXF1YWxzMkQoZS5jb29yZCk/MDpnYS5jb21wYXJlKHRoaXMuX3NlZ21lbnRPY3RhbnQsdGhpcy5jb29yZCxlLmNvb3JkKX0seWEucHJvdG90eXBlLmlzRW5kUG9pbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10aGlzLnNlZ21lbnRJbmRleCYmIXRoaXMuX2lzSW50ZXJpb3J8fHRoaXMuc2VnbWVudEluZGV4PT09dH0seWEucHJvdG90eXBlLmlzSW50ZXJpb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNJbnRlcmlvcn0seWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpXX0seWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHlhfTt2YXIgbWE9ZnVuY3Rpb24oKXt0aGlzLl9ub2RlTWFwPW5ldyBrbyx0aGlzLl9lZGdlPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2VkZ2U9dH07bWEucHJvdG90eXBlLmdldFNwbGl0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgYm87dGhpcy5hZGRFbmRwb2ludHMoKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpLG49ZS5uZXh0KCk7ZS5oYXNOZXh0KCk7KXt2YXIgcj1lLm5leHQoKTt0aGlzLmFkZEVkZ2VDb29yZGluYXRlcyhuLHIsdCksbj1yfXJldHVybiB0LnRvQ29vcmRpbmF0ZUFycmF5KCl9LG1hLnByb3RvdHlwZS5hZGRDb2xsYXBzZWROb2Rlcz1mdW5jdGlvbigpe3ZhciB0PW5ldyB4bzt0aGlzLmZpbmRDb2xsYXBzZXNGcm9tSW5zZXJ0ZWROb2Rlcyh0KSx0aGlzLmZpbmRDb2xsYXBzZXNGcm9tRXhpc3RpbmdWZXJ0aWNlcyh0KTtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkuaW50VmFsdWUoKTt0aGlzLmFkZCh0aGlzLl9lZGdlLmdldENvb3JkaW5hdGUobiksbil9fSxtYS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludGxuKCJJbnRlcnNlY3Rpb25zOiIpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5wcmludCh0KX19LG1hLnByb3RvdHlwZS5maW5kQ29sbGFwc2VzRnJvbUV4aXN0aW5nVmVydGljZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9lZGdlLnNpemUoKS0yO2UrKyl7dmFyIG49dGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKGUpLHI9dGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKGUrMik7bi5lcXVhbHMyRChyKSYmdC5hZGQobmV3IE5pKGUrMSkpfX0sbWEucHJvdG90eXBlLmFkZEVkZ2VDb29yZGluYXRlcz1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKGUuc2VnbWVudEluZGV4KSxpPWUuaXNJbnRlcmlvcigpfHwhZS5jb29yZC5lcXVhbHMyRChyKTtuLmFkZChuZXcgdmkodC5jb29yZCksITEpO2Zvcih2YXIgbz10LnNlZ21lbnRJbmRleCsxO288PWUuc2VnbWVudEluZGV4O28rKyluLmFkZCh0aGlzLl9lZGdlLmdldENvb3JkaW5hdGUobykpO2kmJm4uYWRkKG5ldyB2aShlLmNvb3JkKSl9LG1hLnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlTWFwLnZhbHVlcygpLml0ZXJhdG9yKCl9LG1hLnByb3RvdHlwZS5hZGRTcGxpdEVkZ2VzPWZ1bmN0aW9uKHQpe3RoaXMuYWRkRW5kcG9pbnRzKCksdGhpcy5hZGRDb2xsYXBzZWROb2RlcygpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCksbj1lLm5leHQoKTtlLmhhc05leHQoKTspe3ZhciByPWUubmV4dCgpLGk9dGhpcy5jcmVhdGVTcGxpdEVkZ2UobixyKTt0LmFkZChpKSxuPXJ9fSxtYS5wcm90b3R5cGUuZmluZENvbGxhcHNlSW5kZXg9ZnVuY3Rpb24odCxlLG4pe2lmKCF0LmNvb3JkLmVxdWFsczJEKGUuY29vcmQpKXJldHVybiExO3ZhciByPWUuc2VnbWVudEluZGV4LXQuc2VnbWVudEluZGV4O3JldHVybiBlLmlzSW50ZXJpb3IoKXx8ci0tLDE9PT1yJiYoblswXT10LnNlZ21lbnRJbmRleCsxLCEwKX0sbWEucHJvdG90eXBlLmZpbmRDb2xsYXBzZXNGcm9tSW5zZXJ0ZWROb2Rlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KDEpLmZpbGwobnVsbCksbj10aGlzLml0ZXJhdG9yKCkscj1uLm5leHQoKTtuLmhhc05leHQoKTspe3ZhciBpPW4ubmV4dCgpO3RoaXMuZmluZENvbGxhcHNlSW5kZXgocixpLGUpJiZ0LmFkZChuZXcgTmkoZVswXSkpLHI9aX19LG1hLnByb3RvdHlwZS5nZXRFZGdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2V9LG1hLnByb3RvdHlwZS5hZGRFbmRwb2ludHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9lZGdlLnNpemUoKS0xO3RoaXMuYWRkKHRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZSgwKSwwKSx0aGlzLmFkZCh0aGlzLl9lZGdlLmdldENvb3JkaW5hdGUodCksdCl9LG1hLnByb3RvdHlwZS5jcmVhdGVTcGxpdEVkZ2U9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnNlZ21lbnRJbmRleC10LnNlZ21lbnRJbmRleCsyLHI9dGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKGUuc2VnbWVudEluZGV4KSxpPWUuaXNJbnRlcmlvcigpfHwhZS5jb29yZC5lcXVhbHMyRChyKTtpfHxuLS07dmFyIG89bmV3IEFycmF5KG4pLmZpbGwobnVsbCkscz0wO29bcysrXT1uZXcgdmkodC5jb29yZCk7Zm9yKHZhciBhPXQuc2VnbWVudEluZGV4KzE7YTw9ZS5zZWdtZW50SW5kZXg7YSsrKW9bcysrXT10aGlzLl9lZGdlLmdldENvb3JkaW5hdGUoYSk7cmV0dXJuIGkmJihvW3NdPW5ldyB2aShlLmNvb3JkKSksbmV3IHdhKG8sdGhpcy5fZWRnZS5nZXREYXRhKCkpfSxtYS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IHlhKHRoaXMuX2VkZ2UsdCxlLHRoaXMuX2VkZ2UuZ2V0U2VnbWVudE9jdGFudChlKSkscj10aGlzLl9ub2RlTWFwLmdldChuKTtyZXR1cm4gbnVsbCE9PXI/KFppLmlzVHJ1ZShyLmNvb3JkLmVxdWFsczJEKHQpLCJGb3VuZCBlcXVhbCBub2RlcyB3aXRoIGRpZmZlcmVudCBjb29yZGluYXRlcyIpLHIpOih0aGlzLl9ub2RlTWFwLnB1dChuLG4pLG4pfSxtYS5wcm90b3R5cGUuY2hlY2tTcGxpdEVkZ2VzQ29ycmVjdG5lc3M9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZWRnZS5nZXRDb29yZGluYXRlcygpLG49dC5nZXQoMCkuZ2V0Q29vcmRpbmF0ZSgwKTtpZighbi5lcXVhbHMyRChlWzBdKSl0aHJvdyBuZXcgV2koImJhZCBzcGxpdCBlZGdlIHN0YXJ0IHBvaW50IGF0ICIrbik7dmFyIHI9dC5nZXQodC5zaXplKCktMSkuZ2V0Q29vcmRpbmF0ZXMoKSxpPXJbci5sZW5ndGgtMV07aWYoIWkuZXF1YWxzMkQoZVtlLmxlbmd0aC0xXSkpdGhyb3cgbmV3IFdpKCJiYWQgc3BsaXQgZWRnZSBlbmQgcG9pbnQgYXQgIitpKX0sbWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LG1hLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBtYX07dmFyIHZhPWZ1bmN0aW9uKCl7fTt2YS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHZhfSx2YS5vY3RhbnQ9ZnVuY3Rpb24oKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtpZigwPT09dCYmMD09PWUpdGhyb3cgbmV3IGhpO3ZhciBuPU1hdGguYWJzKHQpLHI9TWF0aC5hYnMoZSk7cmV0dXJuIHQ+PTA/ZT49MD9uPj1yPzA6MTpuPj1yPzc6NjplPj0wP24+PXI/MzoyOm4+PXI/NDo1fWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPW8ueC1pLngsYT1vLnktaS55O2lmKDA9PT1zJiYwPT09YSl0aHJvdyBuZXcgaGk7cmV0dXJuIHZhLm9jdGFudChzLGEpfX07dmFyIF9hPWZ1bmN0aW9uKCl7fTtfYS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXt9LF9hLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7fSxfYS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXt9LF9hLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe30sX2EucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7fSxfYS5wcm90b3R5cGUuZ2V0RGF0YT1mdW5jdGlvbigpe30sX2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LF9hLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBfYX07dmFyIHhhPWZ1bmN0aW9uKCl7fTt4YS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSl7fSx4YS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bX2FdfSx4YS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geGF9O3ZhciB3YT1mdW5jdGlvbigpe3RoaXMuX25vZGVMaXN0PW5ldyBtYSh0aGlzKSx0aGlzLl9wdHM9bnVsbCx0aGlzLl9kYXRhPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX3B0cz10LHRoaXMuX2RhdGE9ZX07d2EucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0c30sd2EucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRzLmxlbmd0aH0sd2EucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B0c1t0XX0sd2EucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0c1swXS5lcXVhbHModGhpcy5fcHRzW3RoaXMuX3B0cy5sZW5ndGgtMV0pfSx3YS5wcm90b3R5cGUuZ2V0U2VnbWVudE9jdGFudD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PXRoaXMuX3B0cy5sZW5ndGgtMT8tMTp0aGlzLnNhZmVPY3RhbnQodGhpcy5nZXRDb29yZGluYXRlKHQpLHRoaXMuZ2V0Q29vcmRpbmF0ZSh0KzEpKX0sd2EucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dGhpcy5fZGF0YT10fSx3YS5wcm90b3R5cGUuc2FmZU9jdGFudD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmVxdWFsczJEKGUpPzA6dmEub2N0YW50KHQsZSl9LHdhLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9LHdhLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuYWRkSW50ZXJzZWN0aW9uTm9kZSh0LGUpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1szXSxpPW5ldyB2aShhcmd1bWVudHNbMF0uZ2V0SW50ZXJzZWN0aW9uKHIpKTt0aGlzLmFkZEludGVyc2VjdGlvbihpLG4pfX0sd2EucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFhpLnRvTGluZVN0cmluZyhuZXcgeHModGhpcy5fcHRzKSl9LHdhLnByb3RvdHlwZS5nZXROb2RlTGlzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlTGlzdH0sd2EucHJvdG90eXBlLmFkZEludGVyc2VjdGlvbk5vZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLHI9bisxO2lmKHI8dGhpcy5fcHRzLmxlbmd0aCl7dmFyIGk9dGhpcy5fcHRzW3JdO3QuZXF1YWxzMkQoaSkmJihuPXIpfXJldHVybiB0aGlzLl9ub2RlTGlzdC5hZGQodCxuKX0sd2EucHJvdG90eXBlLmFkZEludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0wO3I8dC5nZXRJbnRlcnNlY3Rpb25OdW0oKTtyKyspdGhpcy5hZGRJbnRlcnNlY3Rpb24odCxlLG4scil9LHdhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt4YV19LHdhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB3YX0sd2EuZ2V0Tm9kZWRTdWJzdHJpbmdzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPW5ldyB4bztyZXR1cm4gd2EuZ2V0Tm9kZWRTdWJzdHJpbmdzKHQsZSksZX1pZigyPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzBdLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXtyLm5leHQoKS5nZXROb2RlTGlzdCgpLmFkZFNwbGl0RWRnZXMobil9fTt2YXIgYmE9ZnVuY3Rpb24oKXtpZih0aGlzLnAwPW51bGwsdGhpcy5wMT1udWxsLDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMucDA9bmV3IHZpLHRoaXMucDE9bmV3IHZpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnAwPW5ldyB2aSh0LnAwKSx0aGlzLnAxPW5ldyB2aSh0LnAxKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMucDA9YXJndW1lbnRzWzBdLHRoaXMucDE9YXJndW1lbnRzWzFdO2Vsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXSxpPWFyZ3VtZW50c1szXTt0aGlzLnAwPW5ldyB2aShlLG4pLHRoaXMucDE9bmV3IHZpKHIsaSl9fSxEYT17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07YmEucHJvdG90eXBlLm1pblg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5wMC54LHRoaXMucDEueCl9LGJhLnByb3RvdHlwZS5vcmllbnRhdGlvbkluZGV4PWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBiYSl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9ZW8ub3JpZW50YXRpb25JbmRleCh0aGlzLnAwLHRoaXMucDEsdC5wMCksbj1lby5vcmllbnRhdGlvbkluZGV4KHRoaXMucDAsdGhpcy5wMSx0LnAxKTtyZXR1cm4gZT49MCYmbj49MHx8ZTw9MCYmbjw9MD9NYXRoLm1heChlLG4pOjB9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIHI9YXJndW1lbnRzWzBdO3JldHVybiBlby5vcmllbnRhdGlvbkluZGV4KHRoaXMucDAsdGhpcy5wMSxyKX19LGJhLnByb3RvdHlwZS50b0dlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0LmNyZWF0ZUxpbmVTdHJpbmcoW3RoaXMucDAsdGhpcy5wMV0pfSxiYS5wcm90b3R5cGUuaXNWZXJ0aWNhbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnAwLng9PT10aGlzLnAxLnh9LGJhLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2YgYmEpKXJldHVybiExO3ZhciBlPXQ7cmV0dXJuIHRoaXMucDAuZXF1YWxzKGUucDApJiZ0aGlzLnAxLmVxdWFscyhlLnAxKX0sYmEucHJvdG90eXBlLmludGVyc2VjdGlvbj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgUWk7cmV0dXJuIGUuY29tcHV0ZUludGVyc2VjdGlvbih0aGlzLnAwLHRoaXMucDEsdC5wMCx0LnAxKSxlLmhhc0ludGVyc2VjdGlvbigpP2UuZ2V0SW50ZXJzZWN0aW9uKDApOm51bGx9LGJhLnByb3RvdHlwZS5wcm9qZWN0PWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIHQ9YXJndW1lbnRzWzBdO2lmKHQuZXF1YWxzKHRoaXMucDApfHx0LmVxdWFscyh0aGlzLnAxKSlyZXR1cm4gbmV3IHZpKHQpO3ZhciBlPXRoaXMucHJvamVjdGlvbkZhY3Rvcih0KSxuPW5ldyB2aTtyZXR1cm4gbi54PXRoaXMucDAueCtlKih0aGlzLnAxLngtdGhpcy5wMC54KSxuLnk9dGhpcy5wMC55K2UqKHRoaXMucDEueS10aGlzLnAwLnkpLG59aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBiYSl7dmFyIHI9YXJndW1lbnRzWzBdLGk9dGhpcy5wcm9qZWN0aW9uRmFjdG9yKHIucDApLG89dGhpcy5wcm9qZWN0aW9uRmFjdG9yKHIucDEpO2lmKGk+PTEmJm8+PTF8fGk8PTAmJm88PTApcmV0dXJuIG51bGw7dmFyIHM9dGhpcy5wcm9qZWN0KHIucDApO2k8MCYmKHM9dGhpcy5wMCksaT4xJiYocz10aGlzLnAxKTt2YXIgYT10aGlzLnByb2plY3Qoci5wMSk7cmV0dXJuIG88MCYmKGE9dGhpcy5wMCksbz4xJiYoYT10aGlzLnAxKSxuZXcgYmEocyxhKX19LGJhLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXt0aGlzLnAxLmNvbXBhcmVUbyh0aGlzLnAwKTwwJiZ0aGlzLnJldmVyc2UoKX0sYmEucHJvdG90eXBlLmFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy5wMS55LXRoaXMucDAueSx0aGlzLnAxLngtdGhpcy5wMC54KX0sYmEucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10P3RoaXMucDA6dGhpcy5wMX0sYmEucHJvdG90eXBlLmRpc3RhbmNlUGVycGVuZGljdWxhcj1mdW5jdGlvbih0KXtyZXR1cm4gZW8uZGlzdGFuY2VQb2ludExpbmVQZXJwZW5kaWN1bGFyKHQsdGhpcy5wMCx0aGlzLnAxKX0sYmEucHJvdG90eXBlLm1pblk9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5wMC55LHRoaXMucDEueSl9LGJhLnByb3RvdHlwZS5taWRQb2ludD1mdW5jdGlvbigpe3JldHVybiBiYS5taWRQb2ludCh0aGlzLnAwLHRoaXMucDEpfSxiYS5wcm90b3R5cGUucHJvamVjdGlvbkZhY3Rvcj1mdW5jdGlvbih0KXtpZih0LmVxdWFscyh0aGlzLnAwKSlyZXR1cm4gMDtpZih0LmVxdWFscyh0aGlzLnAxKSlyZXR1cm4gMTt2YXIgZT10aGlzLnAxLngtdGhpcy5wMC54LG49dGhpcy5wMS55LXRoaXMucDAueSxyPWUqZStuKm47cmV0dXJuIHI8PTA/ZmkuTmFOOigodC54LXRoaXMucDAueCkqZSsodC55LXRoaXMucDAueSkqbikvcn0sYmEucHJvdG90eXBlLmNsb3Nlc3RQb2ludHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbnRlcnNlY3Rpb24odCk7aWYobnVsbCE9PWUpcmV0dXJuW2UsZV07dmFyIG49bmV3IEFycmF5KDIpLmZpbGwobnVsbCkscj1maS5NQVhfVkFMVUUsaT1udWxsLG89dGhpcy5jbG9zZXN0UG9pbnQodC5wMCk7cj1vLmRpc3RhbmNlKHQucDApLG5bMF09byxuWzFdPXQucDA7dmFyIHM9dGhpcy5jbG9zZXN0UG9pbnQodC5wMSk7KGk9cy5kaXN0YW5jZSh0LnAxKSk8ciYmKHI9aSxuWzBdPXMsblsxXT10LnAxKTt2YXIgYT10LmNsb3Nlc3RQb2ludCh0aGlzLnAwKTsoaT1hLmRpc3RhbmNlKHRoaXMucDApKTxyJiYocj1pLG5bMF09dGhpcy5wMCxuWzFdPWEpO3ZhciB1PXQuY2xvc2VzdFBvaW50KHRoaXMucDEpO3JldHVybihpPXUuZGlzdGFuY2UodGhpcy5wMSkpPHImJihyPWksblswXT10aGlzLnAxLG5bMV09dSksbn0sYmEucHJvdG90eXBlLmNsb3Nlc3RQb2ludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnByb2plY3Rpb25GYWN0b3IodCk7cmV0dXJuIGU+MCYmZTwxP3RoaXMucHJvamVjdCh0KTp0aGlzLnAwLmRpc3RhbmNlKHQpPHRoaXMucDEuZGlzdGFuY2UodCk/dGhpcy5wMDp0aGlzLnAxfSxiYS5wcm90b3R5cGUubWF4WD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1heCh0aGlzLnAwLngsdGhpcy5wMS54KX0sYmEucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnAwLmRpc3RhbmNlKHRoaXMucDEpfSxiYS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQsbj10aGlzLnAwLmNvbXBhcmVUbyhlLnAwKTtyZXR1cm4gMCE9PW4/bjp0aGlzLnAxLmNvbXBhcmVUbyhlLnAxKX0sYmEucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnAwO3RoaXMucDA9dGhpcy5wMSx0aGlzLnAxPXR9LGJhLnByb3RvdHlwZS5lcXVhbHNUb3BvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnAwLmVxdWFscyh0LnAwKSYmKHRoaXMucDEuZXF1YWxzKHQucDEpfHx0aGlzLnAwLmVxdWFscyh0LnAxKSkmJnRoaXMucDEuZXF1YWxzKHQucDApfSxiYS5wcm90b3R5cGUubGluZUludGVyc2VjdGlvbj1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIHppLmludGVyc2VjdGlvbih0aGlzLnAwLHRoaXMucDEsdC5wMCx0LnAxKX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBCaSkpdGhyb3cgdH1yZXR1cm4gbnVsbH0sYmEucHJvdG90eXBlLm1heFk9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgodGhpcy5wMC55LHRoaXMucDEueSl9LGJhLnByb3RvdHlwZS5wb2ludEFsb25nT2Zmc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5wMC54K3QqKHRoaXMucDEueC10aGlzLnAwLngpLHI9dGhpcy5wMC55K3QqKHRoaXMucDEueS10aGlzLnAwLnkpLGk9dGhpcy5wMS54LXRoaXMucDAueCxvPXRoaXMucDEueS10aGlzLnAwLnkscz1NYXRoLnNxcnQoaSppK28qbyksYT0wLHU9MDtpZigwIT09ZSl7aWYoczw9MCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb21wdXRlIG9mZnNldCBmcm9tIHplcm8tbGVuZ3RoIGxpbmUgc2VnbWVudCIpO2E9ZSppL3MsdT1lKm8vc31yZXR1cm4gbmV3IHZpKG4tdSxyK2EpfSxiYS5wcm90b3R5cGUuc2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0Q29vcmRpbmF0ZXModC5wMCx0LnAxKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5wMC54PWUueCx0aGlzLnAwLnk9ZS55LHRoaXMucDEueD1uLngsdGhpcy5wMS55PW4ueX19LGJhLnByb3RvdHlwZS5zZWdtZW50RnJhY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wcm9qZWN0aW9uRmFjdG9yKHQpO3JldHVybiBlPDA/ZT0wOihlPjF8fGZpLmlzTmFOKGUpKSYmKGU9MSksZX0sYmEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkxJTkVTVFJJTkcoICIrdGhpcy5wMC54KyIgIit0aGlzLnAwLnkrIiwgIit0aGlzLnAxLngrIiAiK3RoaXMucDEueSsiKSJ9LGJhLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wMC55PT09dGhpcy5wMS55fSxiYS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGJhKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGVvLmRpc3RhbmNlTGluZUxpbmUodGhpcy5wMCx0aGlzLnAxLHQucDAsdC5wMSl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBlby5kaXN0YW5jZVBvaW50TGluZShlLHRoaXMucDAsdGhpcy5wMSl9fSxiYS5wcm90b3R5cGUucG9pbnRBbG9uZz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdmk7cmV0dXJuIGUueD10aGlzLnAwLngrdCoodGhpcy5wMS54LXRoaXMucDAueCksZS55PXRoaXMucDAueSt0Kih0aGlzLnAxLnktdGhpcy5wMC55KSxlfSxiYS5wcm90b3R5cGUuaGFzaENvZGU9ZnVuY3Rpb24oKXt2YXIgdD1maS5kb3VibGVUb0xvbmdCaXRzKHRoaXMucDAueCk7dF49MzEqZmkuZG91YmxlVG9Mb25nQml0cyh0aGlzLnAwLnkpO3ZhciBlPU1hdGgudHJ1bmModCleTWF0aC50cnVuYyh0Pj4zMiksbj1maS5kb3VibGVUb0xvbmdCaXRzKHRoaXMucDEueCk7cmV0dXJuIG5ePTMxKmZpLmRvdWJsZVRvTG9uZ0JpdHModGhpcy5wMS55KSxlXihNYXRoLnRydW5jKG4pXk1hdGgudHJ1bmMobj4+MzIpKX0sYmEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpLG1pXX0sYmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGJhfSxiYS5taWRQb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgdmkoKHQueCtlLngpLzIsKHQueStlLnkpLzIpfSxEYS5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDJkMjE3MjEzNWY0MTFjMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGJhLERhKTt2YXIgRWE9ZnVuY3Rpb24oKXt0aGlzLnRlbXBFbnYxPW5ldyBqaSx0aGlzLnRlbXBFbnYyPW5ldyBqaSx0aGlzLl9vdmVybGFwU2VnMT1uZXcgYmEsdGhpcy5fb3ZlcmxhcFNlZzI9bmV3IGJhfTtFYS5wcm90b3R5cGUub3ZlcmxhcD1mdW5jdGlvbigpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoJiY0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzFdLGU9YXJndW1lbnRzWzJdLG49YXJndW1lbnRzWzNdO2FyZ3VtZW50c1swXS5nZXRMaW5lU2VnbWVudCh0LHRoaXMuX292ZXJsYXBTZWcxKSxlLmdldExpbmVTZWdtZW50KG4sdGhpcy5fb3ZlcmxhcFNlZzIpLHRoaXMub3ZlcmxhcCh0aGlzLl9vdmVybGFwU2VnMSx0aGlzLl9vdmVybGFwU2VnMil9fSxFYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEVhfTt2YXIgQ2E9ZnVuY3Rpb24oKXt0aGlzLl9wdHM9bnVsbCx0aGlzLl9zdGFydD1udWxsLHRoaXMuX2VuZD1udWxsLHRoaXMuX2Vudj1udWxsLHRoaXMuX2NvbnRleHQ9bnVsbCx0aGlzLl9pZD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXSxyPWFyZ3VtZW50c1szXTt0aGlzLl9wdHM9dCx0aGlzLl9zdGFydD1lLHRoaXMuX2VuZD1uLHRoaXMuX2NvbnRleHQ9cn07Q2EucHJvdG90eXBlLmdldExpbmVTZWdtZW50PWZ1bmN0aW9uKHQsZSl7ZS5wMD10aGlzLl9wdHNbdF0sZS5wMT10aGlzLl9wdHNbdCsxXX0sQ2EucHJvdG90eXBlLmNvbXB1dGVTZWxlY3Q9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcy5fcHRzW2VdLG89dGhpcy5fcHRzW25dO2lmKHIudGVtcEVudjEuaW5pdChpLG8pLG4tZT09MSlyZXR1cm4gci5zZWxlY3QodGhpcyxlKSxudWxsO2lmKCF0LmludGVyc2VjdHMoci50ZW1wRW52MSkpcmV0dXJuIG51bGw7dmFyIHM9TWF0aC50cnVuYygoZStuKS8yKTtlPHMmJnRoaXMuY29tcHV0ZVNlbGVjdCh0LGUscyxyKSxzPG4mJnRoaXMuY29tcHV0ZVNlbGVjdCh0LHMsbixyKX0sQ2EucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLl9lbmQtdGhpcy5fc3RhcnQrMSkuZmlsbChudWxsKSxlPTAsbj10aGlzLl9zdGFydDtuPD10aGlzLl9lbmQ7bisrKXRbZSsrXT10aGlzLl9wdHNbbl07cmV0dXJuIHR9LENhLnByb3RvdHlwZS5jb21wdXRlT3ZlcmxhcHM9ZnVuY3Rpb24odCxlKXt0aGlzLmNvbXB1dGVPdmVybGFwc0ludGVybmFsKHRoaXMuX3N0YXJ0LHRoaXMuX2VuZCx0LHQuX3N0YXJ0LHQuX2VuZCxlKX0sQ2EucHJvdG90eXBlLnNldElkPWZ1bmN0aW9uKHQpe3RoaXMuX2lkPXR9LENhLnByb3RvdHlwZS5zZWxlY3Q9ZnVuY3Rpb24odCxlKXt0aGlzLmNvbXB1dGVTZWxlY3QodCx0aGlzLl9zdGFydCx0aGlzLl9lbmQsZSl9LENhLnByb3RvdHlwZS5nZXRFbnZlbG9wZT1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9lbnYpe3ZhciB0PXRoaXMuX3B0c1t0aGlzLl9zdGFydF0sZT10aGlzLl9wdHNbdGhpcy5fZW5kXTt0aGlzLl9lbnY9bmV3IGppKHQsZSl9cmV0dXJuIHRoaXMuX2Vudn0sQ2EucHJvdG90eXBlLmdldEVuZEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZH0sQ2EucHJvdG90eXBlLmdldFN0YXJ0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhcnR9LENhLnByb3RvdHlwZS5nZXRDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRleHR9LENhLnByb3RvdHlwZS5nZXRJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pZH0sQ2EucHJvdG90eXBlLmNvbXB1dGVPdmVybGFwc0ludGVybmFsPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXt2YXIgcz10aGlzLl9wdHNbdF0sYT10aGlzLl9wdHNbZV0sdT1uLl9wdHNbcl0sYz1uLl9wdHNbaV07aWYoZS10PT0xJiZpLXI9PTEpcmV0dXJuIG8ub3ZlcmxhcCh0aGlzLHQsbixyKSxudWxsO2lmKG8udGVtcEVudjEuaW5pdChzLGEpLG8udGVtcEVudjIuaW5pdCh1LGMpLCFvLnRlbXBFbnYxLmludGVyc2VjdHMoby50ZW1wRW52MikpcmV0dXJuIG51bGw7dmFyIGw9TWF0aC50cnVuYygodCtlKS8yKSxoPU1hdGgudHJ1bmMoKHIraSkvMik7dDxsJiYocjxoJiZ0aGlzLmNvbXB1dGVPdmVybGFwc0ludGVybmFsKHQsbCxuLHIsaCxvKSxoPGkmJnRoaXMuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWwodCxsLG4saCxpLG8pKSxsPGUmJihyPGgmJnRoaXMuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWwobCxlLG4scixoLG8pLGg8aSYmdGhpcy5jb21wdXRlT3ZlcmxhcHNJbnRlcm5hbChsLGUsbixoLGksbykpfSxDYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sQ2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIENhfTt2YXIgU2E9ZnVuY3Rpb24oKXt9O1NhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxTYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gU2F9LFNhLmdldENoYWluU3RhcnRJbmRpY2VzPWZ1bmN0aW9uKHQpe3ZhciBlPTAsbj1uZXcgeG87bi5hZGQobmV3IE5pKGUpKTtkb3t2YXIgcj1TYS5maW5kQ2hhaW5FbmQodCxlKTtuLmFkZChuZXcgTmkocikpLGU9cn13aGlsZShlPHQubGVuZ3RoLTEpO3JldHVybiBTYS50b0ludEFycmF5KG4pfSxTYS5maW5kQ2hhaW5FbmQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZTtuPHQubGVuZ3RoLTEmJnRbbl0uZXF1YWxzMkQodFtuKzFdKTspbisrO2lmKG4+PXQubGVuZ3RoLTEpcmV0dXJuIHQubGVuZ3RoLTE7Zm9yKHZhciByPVdzLnF1YWRyYW50KHRbbl0sdFtuKzFdKSxpPWUrMTtpPHQubGVuZ3RoOyl7aWYoIXRbaS0xXS5lcXVhbHMyRCh0W2ldKSlpZihXcy5xdWFkcmFudCh0W2ktMV0sdFtpXSkhPT1yKWJyZWFrO2krK31yZXR1cm4gaS0xfSxTYS5nZXRDaGFpbnM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gU2EuZ2V0Q2hhaW5zKGFyZ3VtZW50c1swXSxudWxsKTtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPW5ldyB4byxyPVNhLmdldENoYWluU3RhcnRJbmRpY2VzKHQpLGk9MDtpPHIubGVuZ3RoLTE7aSsrKXt2YXIgbz1uZXcgQ2EodCxyW2ldLHJbaSsxXSxlKTtuLmFkZChvKX1yZXR1cm4gbn19LFNhLnRvSW50QXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT10LmdldChuKS5pbnRWYWx1ZSgpO3JldHVybiBlfTt2YXIgQWE9ZnVuY3Rpb24oKXt9O0FhLnByb3RvdHlwZS5jb21wdXRlTm9kZXM9ZnVuY3Rpb24odCl7fSxBYS5wcm90b3R5cGUuZ2V0Tm9kZWRTdWJzdHJpbmdzPWZ1bmN0aW9uKCl7fSxBYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sQWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEFhfTt2YXIgTmE9ZnVuY3Rpb24oKXtpZih0aGlzLl9zZWdJbnQ9bnVsbCwwIT09YXJndW1lbnRzLmxlbmd0aCYmMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldFNlZ21lbnRJbnRlcnNlY3Rvcih0KX19O05hLnByb3RvdHlwZS5zZXRTZWdtZW50SW50ZXJzZWN0b3I9ZnVuY3Rpb24odCl7dGhpcy5fc2VnSW50PXR9LE5hLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltBYV19LE5hLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBOYX07dmFyIElhPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7ZT90LmNhbGwodGhpcyxlKTp0LmNhbGwodGhpcyksdGhpcy5fbW9ub0NoYWlucz1uZXcgeG8sdGhpcy5faW5kZXg9bmV3IHBhLHRoaXMuX2lkQ291bnRlcj0wLHRoaXMuX25vZGVkU2VnU3RyaW5ncz1udWxsLHRoaXMuX25PdmVybGFwcz0wfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtTZWdtZW50T3ZlcmxhcEFjdGlvbjp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmdldE1vbm90b25lQ2hhaW5zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vbm9DaGFpbnN9LGUucHJvdG90eXBlLmdldE5vZGVkU3Vic3RyaW5ncz1mdW5jdGlvbigpe3JldHVybiB3YS5nZXROb2RlZFN1YnN0cmluZ3ModGhpcy5fbm9kZWRTZWdTdHJpbmdzKX0sZS5wcm90b3R5cGUuZ2V0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5kZXh9LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPVNhLmdldENoYWlucyh0LmdldENvb3JkaW5hdGVzKCksdCkuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3Iuc2V0SWQoZS5faWRDb3VudGVyKyspLGUuX2luZGV4Lmluc2VydChyLmdldEVudmVsb3BlKCksciksZS5fbW9ub0NoYWlucy5hZGQocil9fSxlLnByb3RvdHlwZS5jb21wdXRlTm9kZXM9ZnVuY3Rpb24odCl7dGhpcy5fbm9kZWRTZWdTdHJpbmdzPXQ7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspdGhpcy5hZGQoZS5uZXh0KCkpO3RoaXMuaW50ZXJzZWN0Q2hhaW5zKCl9LGUucHJvdG90eXBlLmludGVyc2VjdENoYWlucz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9bmV3IE1hKHRoaXMuX3NlZ0ludCksbj10aGlzLl9tb25vQ2hhaW5zLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KWZvcih2YXIgcj1uLm5leHQoKSxpPXQuX2luZGV4LnF1ZXJ5KHIuZ2V0RW52ZWxvcGUoKSkuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpO2lmKG8uZ2V0SWQoKT5yLmdldElkKCkmJihyLmNvbXB1dGVPdmVybGFwcyhvLGUpLHQuX25PdmVybGFwcysrKSx0Ll9zZWdJbnQuaXNEb25lKCkpcmV0dXJuIG51bGx9fSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLlNlZ21lbnRPdmVybGFwQWN0aW9uLmdldD1mdW5jdGlvbigpe3JldHVybiBNYX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShOYSksTWE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9zaT1udWxsO3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9zaT1lfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5vdmVybGFwPWZ1bmN0aW9uKCl7aWYoNCE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQucHJvdG90eXBlLm92ZXJsYXAuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXSxyPWFyZ3VtZW50c1szXSxpPWFyZ3VtZW50c1swXS5nZXRDb250ZXh0KCksbz1uLmdldENvbnRleHQoKTt0aGlzLl9zaS5wcm9jZXNzSW50ZXJzZWN0aW9ucyhpLGUsbyxyKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oRWEpLEZhPWZ1bmN0aW9uIHQoKXtpZih0aGlzLl9xdWFkcmFudFNlZ21lbnRzPXQuREVGQVVMVF9RVUFEUkFOVF9TRUdNRU5UUyx0aGlzLl9lbmRDYXBTdHlsZT10LkNBUF9ST1VORCx0aGlzLl9qb2luU3R5bGU9dC5KT0lOX1JPVU5ELHRoaXMuX21pdHJlTGltaXQ9dC5ERUZBVUxUX01JVFJFX0xJTUlULHRoaXMuX2lzU2luZ2xlU2lkZWQ9ITEsdGhpcy5fc2ltcGxpZnlGYWN0b3I9dC5ERUZBVUxUX1NJTVBMSUZZX0ZBQ1RPUiwwIT09YXJndW1lbnRzLmxlbmd0aClpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuc2V0UXVhZHJhbnRTZWdtZW50cyhlKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5zZXRRdWFkcmFudFNlZ21lbnRzKG4pLHRoaXMuc2V0RW5kQ2FwU3R5bGUocil9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzNdO3RoaXMuc2V0UXVhZHJhbnRTZWdtZW50cyhpKSx0aGlzLnNldEVuZENhcFN0eWxlKG8pLHRoaXMuc2V0Sm9pblN0eWxlKHMpLHRoaXMuc2V0TWl0cmVMaW1pdChhKX19LFRhPXtDQVBfUk9VTkQ6e2NvbmZpZ3VyYWJsZTohMH0sQ0FQX0ZMQVQ6e2NvbmZpZ3VyYWJsZTohMH0sQ0FQX1NRVUFSRTp7Y29uZmlndXJhYmxlOiEwfSxKT0lOX1JPVU5EOntjb25maWd1cmFibGU6ITB9LEpPSU5fTUlUUkU6e2NvbmZpZ3VyYWJsZTohMH0sSk9JTl9CRVZFTDp7Y29uZmlndXJhYmxlOiEwfSxERUZBVUxUX1FVQURSQU5UX1NFR01FTlRTOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfTUlUUkVfTElNSVQ6e2NvbmZpZ3VyYWJsZTohMH0sREVGQVVMVF9TSU1QTElGWV9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH19O0ZhLnByb3RvdHlwZS5nZXRFbmRDYXBTdHlsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmRDYXBTdHlsZX0sRmEucHJvdG90eXBlLmlzU2luZ2xlU2lkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNTaW5nbGVTaWRlZH0sRmEucHJvdG90eXBlLnNldFF1YWRyYW50U2VnbWVudHM9ZnVuY3Rpb24odCl7dGhpcy5fcXVhZHJhbnRTZWdtZW50cz10LDA9PT10aGlzLl9xdWFkcmFudFNlZ21lbnRzJiYodGhpcy5fam9pblN0eWxlPUZhLkpPSU5fQkVWRUwpLHRoaXMuX3F1YWRyYW50U2VnbWVudHM8MCYmKHRoaXMuX2pvaW5TdHlsZT1GYS5KT0lOX01JVFJFLHRoaXMuX21pdHJlTGltaXQ9TWF0aC5hYnModGhpcy5fcXVhZHJhbnRTZWdtZW50cykpLHQ8PTAmJih0aGlzLl9xdWFkcmFudFNlZ21lbnRzPTEpLHRoaXMuX2pvaW5TdHlsZSE9PUZhLkpPSU5fUk9VTkQmJih0aGlzLl9xdWFkcmFudFNlZ21lbnRzPUZhLkRFRkFVTFRfUVVBRFJBTlRfU0VHTUVOVFMpfSxGYS5wcm90b3R5cGUuZ2V0Sm9pblN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2pvaW5TdHlsZX0sRmEucHJvdG90eXBlLnNldEpvaW5TdHlsZT1mdW5jdGlvbih0KXt0aGlzLl9qb2luU3R5bGU9dH0sRmEucHJvdG90eXBlLnNldFNpbXBsaWZ5RmFjdG9yPWZ1bmN0aW9uKHQpe3RoaXMuX3NpbXBsaWZ5RmFjdG9yPXQ8MD8wOnR9LEZhLnByb3RvdHlwZS5nZXRTaW1wbGlmeUZhY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaW1wbGlmeUZhY3Rvcn0sRmEucHJvdG90eXBlLmdldFF1YWRyYW50U2VnbWVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcXVhZHJhbnRTZWdtZW50c30sRmEucHJvdG90eXBlLnNldEVuZENhcFN0eWxlPWZ1bmN0aW9uKHQpe3RoaXMuX2VuZENhcFN0eWxlPXR9LEZhLnByb3RvdHlwZS5nZXRNaXRyZUxpbWl0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pdHJlTGltaXR9LEZhLnByb3RvdHlwZS5zZXRNaXRyZUxpbWl0PWZ1bmN0aW9uKHQpe3RoaXMuX21pdHJlTGltaXQ9dH0sRmEucHJvdG90eXBlLnNldFNpbmdsZVNpZGVkPWZ1bmN0aW9uKHQpe3RoaXMuX2lzU2luZ2xlU2lkZWQ9dH0sRmEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEZhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBGYX0sRmEuYnVmZmVyRGlzdGFuY2VFcnJvcj1mdW5jdGlvbih0KXt2YXIgZT1NYXRoLlBJLzIvdDtyZXR1cm4gMS1NYXRoLmNvcyhlLzIpfSxUYS5DQVBfUk9VTkQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LFRhLkNBUF9GTEFULmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxUYS5DQVBfU1FVQVJFLmdldD1mdW5jdGlvbigpe3JldHVybiAzfSxUYS5KT0lOX1JPVU5ELmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxUYS5KT0lOX01JVFJFLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxUYS5KT0lOX0JFVkVMLmdldD1mdW5jdGlvbigpe3JldHVybiAzfSxUYS5ERUZBVUxUX1FVQURSQU5UX1NFR01FTlRTLmdldD1mdW5jdGlvbigpe3JldHVybiA4fSxUYS5ERUZBVUxUX01JVFJFX0xJTUlULmdldD1mdW5jdGlvbigpe3JldHVybiA1fSxUYS5ERUZBVUxUX1NJTVBMSUZZX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZhLFRhKTt2YXIgT2E9ZnVuY3Rpb24odCl7dGhpcy5fZGlzdGFuY2VUb2w9bnVsbCx0aGlzLl9pc0RlbGV0ZWQ9bnVsbCx0aGlzLl9hbmdsZU9yaWVudGF0aW9uPWVvLkNPVU5URVJDTE9DS1dJU0UsdGhpcy5faW5wdXRMaW5lPXR8fG51bGx9LExhPXtJTklUOntjb25maWd1cmFibGU6ITB9LERFTEVURTp7Y29uZmlndXJhYmxlOiEwfSxLRUVQOntjb25maWd1cmFibGU6ITB9LE5VTV9QVFNfVE9fQ0hFQ0s6e2NvbmZpZ3VyYWJsZTohMH19O09hLnByb3RvdHlwZS5pc0RlbGV0YWJsZT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLl9pbnB1dExpbmVbdF0sbz10aGlzLl9pbnB1dExpbmVbZV0scz10aGlzLl9pbnB1dExpbmVbbl07cmV0dXJuISghdGhpcy5pc0NvbmNhdmUoaSxvLHMpfHwhdGhpcy5pc1NoYWxsb3coaSxvLHMscikpJiZ0aGlzLmlzU2hhbGxvd1NhbXBsZWQoaSxvLHQsbixyKX0sT2EucHJvdG90eXBlLmRlbGV0ZVNoYWxsb3dDb25jYXZpdGllcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9MSxuPXRoaXMuZmluZE5leHROb25EZWxldGVkSW5kZXgoZSkscj10aGlzLmZpbmROZXh0Tm9uRGVsZXRlZEluZGV4KG4pLGk9ITE7cjx0aGlzLl9pbnB1dExpbmUubGVuZ3RoOyl7dmFyIG89ITE7dC5pc0RlbGV0YWJsZShlLG4scix0Ll9kaXN0YW5jZVRvbCkmJih0Ll9pc0RlbGV0ZWRbbl09T2EuREVMRVRFLG89ITAsaT0hMCksZT1vP3I6bixuPXQuZmluZE5leHROb25EZWxldGVkSW5kZXgoZSkscj10LmZpbmROZXh0Tm9uRGVsZXRlZEluZGV4KG4pfXJldHVybiBpfSxPYS5wcm90b3R5cGUuaXNTaGFsbG93Q29uY2F2aXR5PWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBlby5jb21wdXRlT3JpZW50YXRpb24odCxlLG4pPT09dGhpcy5fYW5nbGVPcmllbnRhdGlvbiYmZW8uZGlzdGFuY2VQb2ludExpbmUoZSx0LG4pPHJ9LE9hLnByb3RvdHlwZS5pc1NoYWxsb3dTYW1wbGVkPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89TWF0aC50cnVuYygoci1uKS9PYS5OVU1fUFRTX1RPX0NIRUNLKTtvPD0wJiYobz0xKTtmb3IodmFyIHM9bjtzPHI7cys9bylpZighdGhpcy5pc1NoYWxsb3codCxlLHRoaXMuX2lucHV0TGluZVtzXSxpKSlyZXR1cm4hMTtyZXR1cm4hMH0sT2EucHJvdG90eXBlLmlzQ29uY2F2ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGVvLmNvbXB1dGVPcmllbnRhdGlvbih0LGUsbik9PT10aGlzLl9hbmdsZU9yaWVudGF0aW9ufSxPYS5wcm90b3R5cGUuc2ltcGxpZnk9ZnVuY3Rpb24odCl7dGhpcy5fZGlzdGFuY2VUb2w9TWF0aC5hYnModCksdDwwJiYodGhpcy5fYW5nbGVPcmllbnRhdGlvbj1lby5DTE9DS1dJU0UpLHRoaXMuX2lzRGVsZXRlZD1uZXcgQXJyYXkodGhpcy5faW5wdXRMaW5lLmxlbmd0aCkuZmlsbChudWxsKTt2YXIgZT0hMTtkb3tlPXRoaXMuZGVsZXRlU2hhbGxvd0NvbmNhdml0aWVzKCl9d2hpbGUoZSk7cmV0dXJuIHRoaXMuY29sbGFwc2VMaW5lKCl9LE9hLnByb3RvdHlwZS5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dCsxO2U8dGhpcy5faW5wdXRMaW5lLmxlbmd0aCYmdGhpcy5faXNEZWxldGVkW2VdPT09T2EuREVMRVRFOyllKys7cmV0dXJuIGV9LE9hLnByb3RvdHlwZS5pc1NoYWxsb3c9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIGVvLmRpc3RhbmNlUG9pbnRMaW5lKGUsdCxuKTxyfSxPYS5wcm90b3R5cGUuY29sbGFwc2VMaW5lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBibyxlPTA7ZTx0aGlzLl9pbnB1dExpbmUubGVuZ3RoO2UrKyl0aGlzLl9pc0RlbGV0ZWRbZV0hPT1PYS5ERUxFVEUmJnQuYWRkKHRoaXMuX2lucHV0TGluZVtlXSk7cmV0dXJuIHQudG9Db29yZGluYXRlQXJyYXkoKX0sT2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LE9hLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBPYX0sT2Euc2ltcGxpZnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IE9hKHQpLnNpbXBsaWZ5KGUpfSxMYS5JTklULmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxMYS5ERUxFVEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LExhLktFRVAuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LExhLk5VTV9QVFNfVE9fQ0hFQ0suZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDEwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPYSxMYSk7dmFyIFBhPWZ1bmN0aW9uKCl7dGhpcy5fcHRMaXN0PW51bGwsdGhpcy5fcHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl9taW5pbWltVmVydGV4RGlzdGFuY2U9MCx0aGlzLl9wdExpc3Q9bmV3IHhvfSxSYT17Q09PUkRJTkFURV9BUlJBWV9UWVBFOntjb25maWd1cmFibGU6ITB9fTtQYS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRMaXN0LnRvQXJyYXkoUGEuQ09PUkRJTkFURV9BUlJBWV9UWVBFKX0sUGEucHJvdG90eXBlLnNldFByZWNpc2lvbk1vZGVsPWZ1bmN0aW9uKHQpe3RoaXMuX3ByZWNpc2lvbk1vZGVsPXR9LFBhLnByb3RvdHlwZS5hZGRQdD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdmkodCk7aWYodGhpcy5fcHJlY2lzaW9uTW9kZWwubWFrZVByZWNpc2UoZSksdGhpcy5pc1JlZHVuZGFudChlKSlyZXR1cm4gbnVsbDt0aGlzLl9wdExpc3QuYWRkKGUpfSxQYS5wcm90b3R5cGUucmV2ZXJlPWZ1bmN0aW9uKCl7fSxQYS5wcm90b3R5cGUuYWRkUHRzPWZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0aGlzLmFkZFB0KHRbbl0pO2Vsc2UgZm9yKHZhciByPXQubGVuZ3RoLTE7cj49MDtyLS0pdGhpcy5hZGRQdCh0W3JdKX0sUGEucHJvdG90eXBlLmlzUmVkdW5kYW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX3B0TGlzdC5zaXplKCk8MSlyZXR1cm4hMTt2YXIgZT10aGlzLl9wdExpc3QuZ2V0KHRoaXMuX3B0TGlzdC5zaXplKCktMSk7cmV0dXJuIHQuZGlzdGFuY2UoZSk8dGhpcy5fbWluaW1pbVZlcnRleERpc3RhbmNlfSxQYS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IElzKS5jcmVhdGVMaW5lU3RyaW5nKHRoaXMuZ2V0Q29vcmRpbmF0ZXMoKSkudG9TdHJpbmcoKX0sUGEucHJvdG90eXBlLmNsb3NlUmluZz1mdW5jdGlvbigpe2lmKHRoaXMuX3B0TGlzdC5zaXplKCk8MSlyZXR1cm4gbnVsbDt2YXIgdD1uZXcgdmkodGhpcy5fcHRMaXN0LmdldCgwKSksZT10aGlzLl9wdExpc3QuZ2V0KHRoaXMuX3B0TGlzdC5zaXplKCktMSk7aWYodC5lcXVhbHMoZSkpcmV0dXJuIG51bGw7dGhpcy5fcHRMaXN0LmFkZCh0KX0sUGEucHJvdG90eXBlLnNldE1pbmltdW1WZXJ0ZXhEaXN0YW5jZT1mdW5jdGlvbih0KXt0aGlzLl9taW5pbWltVmVydGV4RGlzdGFuY2U9dH0sUGEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFBhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBQYX0sUmEuQ09PUkRJTkFURV9BUlJBWV9UWVBFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgQXJyYXkoMCkuZmlsbChudWxsKX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUGEsUmEpO3ZhciBCYT1mdW5jdGlvbigpe30sa2E9e1BJX1RJTUVTXzI6e2NvbmZpZ3VyYWJsZTohMH0sUElfT1ZFUl8yOntjb25maWd1cmFibGU6ITB9LFBJX09WRVJfNDp7Y29uZmlndXJhYmxlOiEwfSxDT1VOVEVSQ0xPQ0tXSVNFOntjb25maWd1cmFibGU6ITB9LENMT0NLV0lTRTp7Y29uZmlndXJhYmxlOiEwfSxOT05FOntjb25maWd1cmFibGU6ITB9fTtCYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sQmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEJhfSxCYS50b0RlZ3JlZXM9ZnVuY3Rpb24odCl7cmV0dXJuIDE4MCp0L01hdGguUEl9LEJhLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtmb3IoO3Q+TWF0aC5QSTspdC09QmEuUElfVElNRVNfMjtmb3IoO3Q8PS1NYXRoLlBJOyl0Kz1CYS5QSV9USU1FU18yO3JldHVybiB0fSxCYS5hbmdsZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIE1hdGguYXRhbjIodC55LHQueCl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPW4ueC1lLngsaT1uLnktZS55O3JldHVybiBNYXRoLmF0YW4yKGkscil9fSxCYS5pc0FjdXRlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LngtZS54LGk9dC55LWUueTtyZXR1cm4gcioobi54LWUueCkraSoobi55LWUueSk+MH0sQmEuaXNPYnR1c2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQueC1lLngsaT10LnktZS55O3JldHVybiByKihuLngtZS54KStpKihuLnktZS55KTwwfSxCYS5pbnRlcmlvckFuZ2xlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1CYS5hbmdsZShlLHQpLGk9QmEuYW5nbGUoZSxuKTtyZXR1cm4gTWF0aC5hYnMoaS1yKX0sQmEubm9ybWFsaXplUG9zaXRpdmU9ZnVuY3Rpb24odCl7aWYodDwwKXtmb3IoO3Q8MDspdCs9QmEuUElfVElNRVNfMjt0Pj1CYS5QSV9USU1FU18yJiYodD0wKX1lbHNle2Zvcig7dD49QmEuUElfVElNRVNfMjspdC09QmEuUElfVElNRVNfMjt0PDAmJih0PTApfXJldHVybiB0fSxCYS5hbmdsZUJldHdlZW49ZnVuY3Rpb24odCxlLG4pe3ZhciByPUJhLmFuZ2xlKGUsdCksaT1CYS5hbmdsZShlLG4pO3JldHVybiBCYS5kaWZmKHIsaSl9LEJhLmRpZmY9ZnVuY3Rpb24odCxlKXt2YXIgbj1udWxsO3JldHVybihuPXQ8ZT9lLXQ6dC1lKT5NYXRoLlBJJiYobj0yKk1hdGguUEktbiksbn0sQmEudG9SYWRpYW5zPWZ1bmN0aW9uKHQpe3JldHVybiB0Kk1hdGguUEkvMTgwfSxCYS5nZXRUdXJuPWZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zaW4oZS10KTtyZXR1cm4gbj4wP0JhLkNPVU5URVJDTE9DS1dJU0U6bjwwP0JhLkNMT0NLV0lTRTpCYS5OT05FfSxCYS5hbmdsZUJldHdlZW5PcmllbnRlZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9QmEuYW5nbGUoZSx0KSxpPUJhLmFuZ2xlKGUsbiktcjtyZXR1cm4gaTw9LU1hdGguUEk/aStCYS5QSV9USU1FU18yOmk+TWF0aC5QST9pLUJhLlBJX1RJTUVTXzI6aX0sa2EuUElfVElNRVNfMi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMipNYXRoLlBJfSxrYS5QSV9PVkVSXzIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguUEkvMn0sa2EuUElfT1ZFUl80LmdldD1mdW5jdGlvbigpe3JldHVybiBNYXRoLlBJLzR9LGthLkNPVU5URVJDTE9DS1dJU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGVvLkNPVU5URVJDTE9DS1dJU0V9LGthLkNMT0NLV0lTRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZW8uQ0xPQ0tXSVNFfSxrYS5OT05FLmdldD1mdW5jdGlvbigpe3JldHVybiBlby5DT0xMSU5FQVJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEJhLGthKTt2YXIgemE9ZnVuY3Rpb24gdCgpe3RoaXMuX21heEN1cnZlU2VnbWVudEVycm9yPTAsdGhpcy5fZmlsbGV0QW5nbGVRdWFudHVtPW51bGwsdGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcj0xLHRoaXMuX3NlZ0xpc3Q9bnVsbCx0aGlzLl9kaXN0YW5jZT0wLHRoaXMuX3ByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5fYnVmUGFyYW1zPW51bGwsdGhpcy5fbGk9bnVsbCx0aGlzLl9zMD1udWxsLHRoaXMuX3MxPW51bGwsdGhpcy5fczI9bnVsbCx0aGlzLl9zZWcwPW5ldyBiYSx0aGlzLl9zZWcxPW5ldyBiYSx0aGlzLl9vZmZzZXQwPW5ldyBiYSx0aGlzLl9vZmZzZXQxPW5ldyBiYSx0aGlzLl9zaWRlPTAsdGhpcy5faGFzTmFycm93Q29uY2F2ZUFuZ2xlPSExO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTt0aGlzLl9wcmVjaXNpb25Nb2RlbD1lLHRoaXMuX2J1ZlBhcmFtcz1uLHRoaXMuX2xpPW5ldyBRaSx0aGlzLl9maWxsZXRBbmdsZVF1YW50dW09TWF0aC5QSS8yL24uZ2V0UXVhZHJhbnRTZWdtZW50cygpLG4uZ2V0UXVhZHJhbnRTZWdtZW50cygpPj04JiZuLmdldEpvaW5TdHlsZSgpPT09RmEuSk9JTl9ST1VORCYmKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3I9dC5NQVhfQ0xPU0lOR19TRUdfTEVOX0ZBQ1RPUiksdGhpcy5pbml0KHIpfSxqYT17T0ZGU0VUX1NFR01FTlRfU0VQQVJBVElPTl9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH0sSU5TSURFX1RVUk5fVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SOntjb25maWd1cmFibGU6ITB9LENVUlZFX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfSxNQVhfQ0xPU0lOR19TRUdfTEVOX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfX07emEucHJvdG90eXBlLmFkZE5leHRTZWdtZW50PWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fczA9dGhpcy5fczEsdGhpcy5fczE9dGhpcy5fczIsdGhpcy5fczI9dCx0aGlzLl9zZWcwLnNldENvb3JkaW5hdGVzKHRoaXMuX3MwLHRoaXMuX3MxKSx0aGlzLmNvbXB1dGVPZmZzZXRTZWdtZW50KHRoaXMuX3NlZzAsdGhpcy5fc2lkZSx0aGlzLl9kaXN0YW5jZSx0aGlzLl9vZmZzZXQwKSx0aGlzLl9zZWcxLnNldENvb3JkaW5hdGVzKHRoaXMuX3MxLHRoaXMuX3MyKSx0aGlzLmNvbXB1dGVPZmZzZXRTZWdtZW50KHRoaXMuX3NlZzEsdGhpcy5fc2lkZSx0aGlzLl9kaXN0YW5jZSx0aGlzLl9vZmZzZXQxKSx0aGlzLl9zMS5lcXVhbHModGhpcy5fczIpKXJldHVybiBudWxsO3ZhciBuPWVvLmNvbXB1dGVPcmllbnRhdGlvbih0aGlzLl9zMCx0aGlzLl9zMSx0aGlzLl9zMikscj1uPT09ZW8uQ0xPQ0tXSVNFJiZ0aGlzLl9zaWRlPT09RnMuTEVGVHx8bj09PWVvLkNPVU5URVJDTE9DS1dJU0UmJnRoaXMuX3NpZGU9PT1Gcy5SSUdIVDswPT09bj90aGlzLmFkZENvbGxpbmVhcihlKTpyP3RoaXMuYWRkT3V0c2lkZVR1cm4obixlKTp0aGlzLmFkZEluc2lkZVR1cm4obixlKX0semEucHJvdG90eXBlLmFkZExpbmVFbmRDYXA9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgYmEodCxlKSxyPW5ldyBiYTt0aGlzLmNvbXB1dGVPZmZzZXRTZWdtZW50KG4sRnMuTEVGVCx0aGlzLl9kaXN0YW5jZSxyKTt2YXIgaT1uZXcgYmE7dGhpcy5jb21wdXRlT2Zmc2V0U2VnbWVudChuLEZzLlJJR0hULHRoaXMuX2Rpc3RhbmNlLGkpO3ZhciBvPWUueC10Lngscz1lLnktdC55LGE9TWF0aC5hdGFuMihzLG8pO3N3aXRjaCh0aGlzLl9idWZQYXJhbXMuZ2V0RW5kQ2FwU3R5bGUoKSl7Y2FzZSBGYS5DQVBfUk9VTkQ6dGhpcy5fc2VnTGlzdC5hZGRQdChyLnAxKSx0aGlzLmFkZEZpbGxldEFyYyhlLGErTWF0aC5QSS8yLGEtTWF0aC5QSS8yLGVvLkNMT0NLV0lTRSx0aGlzLl9kaXN0YW5jZSksdGhpcy5fc2VnTGlzdC5hZGRQdChpLnAxKTticmVhaztjYXNlIEZhLkNBUF9GTEFUOnRoaXMuX3NlZ0xpc3QuYWRkUHQoci5wMSksdGhpcy5fc2VnTGlzdC5hZGRQdChpLnAxKTticmVhaztjYXNlIEZhLkNBUF9TUVVBUkU6dmFyIHU9bmV3IHZpO3UueD1NYXRoLmFicyh0aGlzLl9kaXN0YW5jZSkqTWF0aC5jb3MoYSksdS55PU1hdGguYWJzKHRoaXMuX2Rpc3RhbmNlKSpNYXRoLnNpbihhKTt2YXIgYz1uZXcgdmkoci5wMS54K3UueCxyLnAxLnkrdS55KSxsPW5ldyB2aShpLnAxLngrdS54LGkucDEueSt1LnkpO3RoaXMuX3NlZ0xpc3QuYWRkUHQoYyksdGhpcy5fc2VnTGlzdC5hZGRQdChsKX19LHphLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWdMaXN0LmdldENvb3JkaW5hdGVzKCl9LHphLnByb3RvdHlwZS5hZGRNaXRyZUpvaW49ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ITAsbz1udWxsO3RyeXtvPXppLmludGVyc2VjdGlvbihlLnAwLGUucDEsbi5wMCxuLnAxKSwocjw9MD8xOm8uZGlzdGFuY2UodCkvTWF0aC5hYnMocikpPnRoaXMuX2J1ZlBhcmFtcy5nZXRNaXRyZUxpbWl0KCkmJihpPSExKX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBCaSkpdGhyb3cgdDtvPW5ldyB2aSgwLDApLGk9ITF9aT90aGlzLl9zZWdMaXN0LmFkZFB0KG8pOnRoaXMuYWRkTGltaXRlZE1pdHJlSm9pbihlLG4scix0aGlzLl9idWZQYXJhbXMuZ2V0TWl0cmVMaW1pdCgpKX0semEucHJvdG90eXBlLmFkZEZpbGxldENvcm5lcj1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPWUueC10Lngscz1lLnktdC55LGE9TWF0aC5hdGFuMihzLG8pLHU9bi54LXQueCxjPW4ueS10LnksbD1NYXRoLmF0YW4yKGMsdSk7cj09PWVvLkNMT0NLV0lTRT9hPD1sJiYoYSs9MipNYXRoLlBJKTphPj1sJiYoYS09MipNYXRoLlBJKSx0aGlzLl9zZWdMaXN0LmFkZFB0KGUpLHRoaXMuYWRkRmlsbGV0QXJjKHQsYSxsLHIsaSksdGhpcy5fc2VnTGlzdC5hZGRQdChuKX0semEucHJvdG90eXBlLmFkZE91dHNpZGVUdXJuPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fb2Zmc2V0MC5wMS5kaXN0YW5jZSh0aGlzLl9vZmZzZXQxLnAwKTx0aGlzLl9kaXN0YW5jZSp6YS5PRkZTRVRfU0VHTUVOVF9TRVBBUkFUSU9OX0ZBQ1RPUilyZXR1cm4gdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQwLnAxKSxudWxsO3RoaXMuX2J1ZlBhcmFtcy5nZXRKb2luU3R5bGUoKT09PUZhLkpPSU5fTUlUUkU/dGhpcy5hZGRNaXRyZUpvaW4odGhpcy5fczEsdGhpcy5fb2Zmc2V0MCx0aGlzLl9vZmZzZXQxLHRoaXMuX2Rpc3RhbmNlKTp0aGlzLl9idWZQYXJhbXMuZ2V0Sm9pblN0eWxlKCk9PT1GYS5KT0lOX0JFVkVMP3RoaXMuYWRkQmV2ZWxKb2luKHRoaXMuX29mZnNldDAsdGhpcy5fb2Zmc2V0MSk6KGUmJnRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MC5wMSksdGhpcy5hZGRGaWxsZXRDb3JuZXIodGhpcy5fczEsdGhpcy5fb2Zmc2V0MC5wMSx0aGlzLl9vZmZzZXQxLnAwLHQsdGhpcy5fZGlzdGFuY2UpLHRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MS5wMCkpfSx6YS5wcm90b3R5cGUuY3JlYXRlU3F1YXJlPWZ1bmN0aW9uKHQpe3RoaXMuX3NlZ0xpc3QuYWRkUHQobmV3IHZpKHQueCt0aGlzLl9kaXN0YW5jZSx0LnkrdGhpcy5fZGlzdGFuY2UpKSx0aGlzLl9zZWdMaXN0LmFkZFB0KG5ldyB2aSh0LngrdGhpcy5fZGlzdGFuY2UsdC55LXRoaXMuX2Rpc3RhbmNlKSksdGhpcy5fc2VnTGlzdC5hZGRQdChuZXcgdmkodC54LXRoaXMuX2Rpc3RhbmNlLHQueS10aGlzLl9kaXN0YW5jZSkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQobmV3IHZpKHQueC10aGlzLl9kaXN0YW5jZSx0LnkrdGhpcy5fZGlzdGFuY2UpKSx0aGlzLl9zZWdMaXN0LmNsb3NlUmluZygpfSx6YS5wcm90b3R5cGUuYWRkU2VnbWVudHM9ZnVuY3Rpb24odCxlKXt0aGlzLl9zZWdMaXN0LmFkZFB0cyh0LGUpfSx6YS5wcm90b3R5cGUuYWRkRmlyc3RTZWdtZW50PWZ1bmN0aW9uKCl7dGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQxLnAwKX0semEucHJvdG90eXBlLmFkZExhc3RTZWdtZW50PWZ1bmN0aW9uKCl7dGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQxLnAxKX0semEucHJvdG90eXBlLmluaXRTaWRlU2VnbWVudHM9ZnVuY3Rpb24odCxlLG4pe3RoaXMuX3MxPXQsdGhpcy5fczI9ZSx0aGlzLl9zaWRlPW4sdGhpcy5fc2VnMS5zZXRDb29yZGluYXRlcyh0LGUpLHRoaXMuY29tcHV0ZU9mZnNldFNlZ21lbnQodGhpcy5fc2VnMSxuLHRoaXMuX2Rpc3RhbmNlLHRoaXMuX29mZnNldDEpfSx6YS5wcm90b3R5cGUuYWRkTGltaXRlZE1pdHJlSm9pbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLl9zZWcwLnAxLG89QmEuYW5nbGUoaSx0aGlzLl9zZWcwLnAwKSxzPUJhLmFuZ2xlQmV0d2Vlbk9yaWVudGVkKHRoaXMuX3NlZzAucDAsaSx0aGlzLl9zZWcxLnAxKS8yLGE9QmEubm9ybWFsaXplKG8rcyksdT1CYS5ub3JtYWxpemUoYStNYXRoLlBJKSxjPXIqbixsPW4tYypNYXRoLmFicyhNYXRoLnNpbihzKSksaD1pLngrYypNYXRoLmNvcyh1KSxmPWkueStjKk1hdGguc2luKHUpLHA9bmV3IHZpKGgsZiksZD1uZXcgYmEoaSxwKSxnPWQucG9pbnRBbG9uZ09mZnNldCgxLGwpLHk9ZC5wb2ludEFsb25nT2Zmc2V0KDEsLWwpO3RoaXMuX3NpZGU9PT1Gcy5MRUZUPyh0aGlzLl9zZWdMaXN0LmFkZFB0KGcpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoeSkpOih0aGlzLl9zZWdMaXN0LmFkZFB0KHkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoZykpfSx6YS5wcm90b3R5cGUuY29tcHV0ZU9mZnNldFNlZ21lbnQ9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ZT09PUZzLkxFRlQ/MTotMSxvPXQucDEueC10LnAwLngscz10LnAxLnktdC5wMC55LGE9TWF0aC5zcXJ0KG8qbytzKnMpLHU9aSpuKm8vYSxjPWkqbipzL2E7ci5wMC54PXQucDAueC1jLHIucDAueT10LnAwLnkrdSxyLnAxLng9dC5wMS54LWMsci5wMS55PXQucDEueSt1fSx6YS5wcm90b3R5cGUuYWRkRmlsbGV0QXJjPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89cj09PWVvLkNMT0NLV0lTRT8tMToxLHM9TWF0aC5hYnMoZS1uKSxhPU1hdGgudHJ1bmMocy90aGlzLl9maWxsZXRBbmdsZVF1YW50dW0rLjUpO2lmKGE8MSlyZXR1cm4gbnVsbDtmb3IodmFyIHU9cy9hLGM9MCxsPW5ldyB2aTtjPHM7KXt2YXIgaD1lK28qYztsLng9dC54K2kqTWF0aC5jb3MoaCksbC55PXQueStpKk1hdGguc2luKGgpLHRoaXMuX3NlZ0xpc3QuYWRkUHQobCksYys9dX19LHphLnByb3RvdHlwZS5hZGRJbnNpZGVUdXJuPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0aGlzLl9vZmZzZXQwLnAwLHRoaXMuX29mZnNldDAucDEsdGhpcy5fb2Zmc2V0MS5wMCx0aGlzLl9vZmZzZXQxLnAxKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSl0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX2xpLmdldEludGVyc2VjdGlvbigwKSk7ZWxzZSBpZih0aGlzLl9oYXNOYXJyb3dDb25jYXZlQW5nbGU9ITAsdGhpcy5fb2Zmc2V0MC5wMS5kaXN0YW5jZSh0aGlzLl9vZmZzZXQxLnAwKTx0aGlzLl9kaXN0YW5jZSp6YS5JTlNJREVfVFVSTl9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1IpdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQwLnAxKTtlbHNle2lmKHRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MC5wMSksdGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcj4wKXt2YXIgbj1uZXcgdmkoKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IqdGhpcy5fb2Zmc2V0MC5wMS54K3RoaXMuX3MxLngpLyh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKzEpLCh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKnRoaXMuX29mZnNldDAucDEueSt0aGlzLl9zMS55KS8odGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3RvcisxKSk7dGhpcy5fc2VnTGlzdC5hZGRQdChuKTt2YXIgcj1uZXcgdmkoKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IqdGhpcy5fb2Zmc2V0MS5wMC54K3RoaXMuX3MxLngpLyh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKzEpLCh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKnRoaXMuX29mZnNldDEucDAueSt0aGlzLl9zMS55KS8odGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3RvcisxKSk7dGhpcy5fc2VnTGlzdC5hZGRQdChyKX1lbHNlIHRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fczEpO3RoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MS5wMCl9fSx6YS5wcm90b3R5cGUuY3JlYXRlQ2lyY2xlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB2aSh0LngrdGhpcy5fZGlzdGFuY2UsdC55KTt0aGlzLl9zZWdMaXN0LmFkZFB0KGUpLHRoaXMuYWRkRmlsbGV0QXJjKHQsMCwyKk1hdGguUEksLTEsdGhpcy5fZGlzdGFuY2UpLHRoaXMuX3NlZ0xpc3QuY2xvc2VSaW5nKCl9LHphLnByb3RvdHlwZS5hZGRCZXZlbEpvaW49ZnVuY3Rpb24odCxlKXt0aGlzLl9zZWdMaXN0LmFkZFB0KHQucDEpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoZS5wMCl9LHphLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3RhbmNlPXQsdGhpcy5fbWF4Q3VydmVTZWdtZW50RXJyb3I9dCooMS1NYXRoLmNvcyh0aGlzLl9maWxsZXRBbmdsZVF1YW50dW0vMikpLHRoaXMuX3NlZ0xpc3Q9bmV3IFBhLHRoaXMuX3NlZ0xpc3Quc2V0UHJlY2lzaW9uTW9kZWwodGhpcy5fcHJlY2lzaW9uTW9kZWwpLHRoaXMuX3NlZ0xpc3Quc2V0TWluaW11bVZlcnRleERpc3RhbmNlKHQqemEuQ1VSVkVfVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SKX0semEucHJvdG90eXBlLmFkZENvbGxpbmVhcj1mdW5jdGlvbih0KXt0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHRoaXMuX3MwLHRoaXMuX3MxLHRoaXMuX3MxLHRoaXMuX3MyKSx0aGlzLl9saS5nZXRJbnRlcnNlY3Rpb25OdW0oKT49MiYmKHRoaXMuX2J1ZlBhcmFtcy5nZXRKb2luU3R5bGUoKT09PUZhLkpPSU5fQkVWRUx8fHRoaXMuX2J1ZlBhcmFtcy5nZXRKb2luU3R5bGUoKT09PUZhLkpPSU5fTUlUUkU/KHQmJnRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MC5wMSksdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9vZmZzZXQxLnAwKSk6dGhpcy5hZGRGaWxsZXRDb3JuZXIodGhpcy5fczEsdGhpcy5fb2Zmc2V0MC5wMSx0aGlzLl9vZmZzZXQxLnAwLGVvLkNMT0NLV0lTRSx0aGlzLl9kaXN0YW5jZSkpfSx6YS5wcm90b3R5cGUuY2xvc2VSaW5nPWZ1bmN0aW9uKCl7dGhpcy5fc2VnTGlzdC5jbG9zZVJpbmcoKX0semEucHJvdG90eXBlLmhhc05hcnJvd0NvbmNhdmVBbmdsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNOYXJyb3dDb25jYXZlQW5nbGV9LHphLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx6YS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gemF9LGphLk9GRlNFVF9TRUdNRU5UX1NFUEFSQVRJT05fRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybi4wMDF9LGphLklOU0lERV9UVVJOX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDAxfSxqYS5DVVJWRV9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTZ9LGphLk1BWF9DTE9TSU5HX1NFR19MRU5fRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybiA4MH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoemEsamEpO3ZhciBVYT1mdW5jdGlvbigpe3RoaXMuX2Rpc3RhbmNlPTAsdGhpcy5fcHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl9idWZQYXJhbXM9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fcHJlY2lzaW9uTW9kZWw9dCx0aGlzLl9idWZQYXJhbXM9ZX07VWEucHJvdG90eXBlLmdldE9mZnNldEN1cnZlPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fZGlzdGFuY2U9ZSwwPT09ZSlyZXR1cm4gbnVsbDt2YXIgbj1lPDAscj1NYXRoLmFicyhlKSxpPXRoaXMuZ2V0U2VnR2VuKHIpO3QubGVuZ3RoPD0xP3RoaXMuY29tcHV0ZVBvaW50Q3VydmUodFswXSxpKTp0aGlzLmNvbXB1dGVPZmZzZXRDdXJ2ZSh0LG4saSk7dmFyIG89aS5nZXRDb29yZGluYXRlcygpO3JldHVybiBuJiZEby5yZXZlcnNlKG8pLG99LFVhLnByb3RvdHlwZS5jb21wdXRlU2luZ2xlU2lkZWRCdWZmZXJDdXJ2ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5zaW1wbGlmeVRvbGVyYW5jZSh0aGlzLl9kaXN0YW5jZSk7aWYoZSl7bi5hZGRTZWdtZW50cyh0LCEwKTt2YXIgaT1PYS5zaW1wbGlmeSh0LC1yKSxvPWkubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGlbb10saVtvLTFdLEZzLkxFRlQpLG4uYWRkRmlyc3RTZWdtZW50KCk7Zm9yKHZhciBzPW8tMjtzPj0wO3MtLSluLmFkZE5leHRTZWdtZW50KGlbc10sITApfWVsc2V7bi5hZGRTZWdtZW50cyh0LCExKTt2YXIgYT1PYS5zaW1wbGlmeSh0LHIpLHU9YS5sZW5ndGgtMTtuLmluaXRTaWRlU2VnbWVudHMoYVswXSxhWzFdLEZzLkxFRlQpLG4uYWRkRmlyc3RTZWdtZW50KCk7Zm9yKHZhciBjPTI7Yzw9dTtjKyspbi5hZGROZXh0U2VnbWVudChhW2NdLCEwKX1uLmFkZExhc3RTZWdtZW50KCksbi5jbG9zZVJpbmcoKX0sVWEucHJvdG90eXBlLmNvbXB1dGVSaW5nQnVmZmVyQ3VydmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuc2ltcGxpZnlUb2xlcmFuY2UodGhpcy5fZGlzdGFuY2UpO2U9PT1Gcy5SSUdIVCYmKHI9LXIpO3ZhciBpPU9hLnNpbXBsaWZ5KHQsciksbz1pLmxlbmd0aC0xO24uaW5pdFNpZGVTZWdtZW50cyhpW28tMV0saVswXSxlKTtmb3IodmFyIHM9MTtzPD1vO3MrKyl7dmFyIGE9MSE9PXM7bi5hZGROZXh0U2VnbWVudChpW3NdLGEpfW4uY2xvc2VSaW5nKCl9LFVhLnByb3RvdHlwZS5jb21wdXRlTGluZUJ1ZmZlckN1cnZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5zaW1wbGlmeVRvbGVyYW5jZSh0aGlzLl9kaXN0YW5jZSkscj1PYS5zaW1wbGlmeSh0LG4pLGk9ci5sZW5ndGgtMTtlLmluaXRTaWRlU2VnbWVudHMoclswXSxyWzFdLEZzLkxFRlQpO2Zvcih2YXIgbz0yO288PWk7bysrKWUuYWRkTmV4dFNlZ21lbnQocltvXSwhMCk7ZS5hZGRMYXN0U2VnbWVudCgpLGUuYWRkTGluZUVuZENhcChyW2ktMV0scltpXSk7dmFyIHM9T2Euc2ltcGxpZnkodCwtbiksYT1zLmxlbmd0aC0xO2UuaW5pdFNpZGVTZWdtZW50cyhzW2FdLHNbYS0xXSxGcy5MRUZUKTtmb3IodmFyIHU9YS0yO3U+PTA7dS0tKWUuYWRkTmV4dFNlZ21lbnQoc1t1XSwhMCk7ZS5hZGRMYXN0U2VnbWVudCgpLGUuYWRkTGluZUVuZENhcChzWzFdLHNbMF0pLGUuY2xvc2VSaW5nKCl9LFVhLnByb3RvdHlwZS5jb21wdXRlUG9pbnRDdXJ2ZT1mdW5jdGlvbih0LGUpe3N3aXRjaCh0aGlzLl9idWZQYXJhbXMuZ2V0RW5kQ2FwU3R5bGUoKSl7Y2FzZSBGYS5DQVBfUk9VTkQ6ZS5jcmVhdGVDaXJjbGUodCk7YnJlYWs7Y2FzZSBGYS5DQVBfU1FVQVJFOmUuY3JlYXRlU3F1YXJlKHQpfX0sVWEucHJvdG90eXBlLmdldExpbmVDdXJ2ZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2Rpc3RhbmNlPWUsZTwwJiYhdGhpcy5fYnVmUGFyYW1zLmlzU2luZ2xlU2lkZWQoKXx8MD09PWUpcmV0dXJuIG51bGw7dmFyIG49TWF0aC5hYnMoZSkscj10aGlzLmdldFNlZ0dlbihuKTtpZih0Lmxlbmd0aDw9MSl0aGlzLmNvbXB1dGVQb2ludEN1cnZlKHRbMF0scik7ZWxzZSBpZih0aGlzLl9idWZQYXJhbXMuaXNTaW5nbGVTaWRlZCgpKXt2YXIgaT1lPDA7dGhpcy5jb21wdXRlU2luZ2xlU2lkZWRCdWZmZXJDdXJ2ZSh0LGkscil9ZWxzZSB0aGlzLmNvbXB1dGVMaW5lQnVmZmVyQ3VydmUodCxyKTtyZXR1cm4gci5nZXRDb29yZGluYXRlcygpfSxVYS5wcm90b3R5cGUuZ2V0QnVmZmVyUGFyYW1ldGVycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9idWZQYXJhbXN9LFVhLnByb3RvdHlwZS5zaW1wbGlmeVRvbGVyYW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLl9idWZQYXJhbXMuZ2V0U2ltcGxpZnlGYWN0b3IoKX0sVWEucHJvdG90eXBlLmdldFJpbmdDdXJ2ZT1mdW5jdGlvbih0LGUsbil7aWYodGhpcy5fZGlzdGFuY2U9bix0Lmxlbmd0aDw9MilyZXR1cm4gdGhpcy5nZXRMaW5lQ3VydmUodCxuKTtpZigwPT09bilyZXR1cm4gVWEuY29weUNvb3JkaW5hdGVzKHQpO3ZhciByPXRoaXMuZ2V0U2VnR2VuKG4pO3JldHVybiB0aGlzLmNvbXB1dGVSaW5nQnVmZmVyQ3VydmUodCxlLHIpLHIuZ2V0Q29vcmRpbmF0ZXMoKX0sVWEucHJvdG90eXBlLmNvbXB1dGVPZmZzZXRDdXJ2ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5zaW1wbGlmeVRvbGVyYW5jZSh0aGlzLl9kaXN0YW5jZSk7aWYoZSl7dmFyIGk9T2Euc2ltcGxpZnkodCwtciksbz1pLmxlbmd0aC0xO24uaW5pdFNpZGVTZWdtZW50cyhpW29dLGlbby0xXSxGcy5MRUZUKSxuLmFkZEZpcnN0U2VnbWVudCgpO2Zvcih2YXIgcz1vLTI7cz49MDtzLS0pbi5hZGROZXh0U2VnbWVudChpW3NdLCEwKX1lbHNle3ZhciBhPU9hLnNpbXBsaWZ5KHQsciksdT1hLmxlbmd0aC0xO24uaW5pdFNpZGVTZWdtZW50cyhhWzBdLGFbMV0sRnMuTEVGVCksbi5hZGRGaXJzdFNlZ21lbnQoKTtmb3IodmFyIGM9MjtjPD11O2MrKyluLmFkZE5leHRTZWdtZW50KGFbY10sITApfW4uYWRkTGFzdFNlZ21lbnQoKX0sVWEucHJvdG90eXBlLmdldFNlZ0dlbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHphKHRoaXMuX3ByZWNpc2lvbk1vZGVsLHRoaXMuX2J1ZlBhcmFtcyx0KX0sVWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFVhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBVYX0sVWEuY29weUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248ZS5sZW5ndGg7bisrKWVbbl09bmV3IHZpKHRbbl0pO3JldHVybiBlfTt2YXIgcWE9ZnVuY3Rpb24oKXt0aGlzLl9zdWJncmFwaHM9bnVsbCx0aGlzLl9zZWc9bmV3IGJhLHRoaXMuX2NnYT1uZXcgZW87dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX3N1YmdyYXBocz10fSxWYT17RGVwdGhTZWdtZW50Ontjb25maWd1cmFibGU6ITB9fTtxYS5wcm90b3R5cGUuZmluZFN0YWJiZWRTZWdtZW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj1uZXcgeG8scj10aGlzLl9zdWJncmFwaHMuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpLG89aS5nZXRFbnZlbG9wZSgpO2UueTxvLmdldE1pblkoKXx8ZS55Pm8uZ2V0TWF4WSgpfHx0LmZpbmRTdGFiYmVkU2VnbWVudHMoZSxpLmdldERpcmVjdGVkRWRnZXMoKSxuKX1yZXR1cm4gbn1pZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihFaShhcmd1bWVudHNbMl0sdm8pJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIEtzKWZvcih2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV0sdT1hcmd1bWVudHNbMl0sYz1hLmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpLGw9MDtsPGMubGVuZ3RoLTE7bCsrKXtpZih0Ll9zZWcucDA9Y1tsXSx0Ll9zZWcucDE9Y1tsKzFdLHQuX3NlZy5wMC55PnQuX3NlZy5wMS55JiZ0Ll9zZWcucmV2ZXJzZSgpLCEoTWF0aC5tYXgodC5fc2VnLnAwLngsdC5fc2VnLnAxLngpPHMueHx8dC5fc2VnLmlzSG9yaXpvbnRhbCgpfHxzLnk8dC5fc2VnLnAwLnl8fHMueT50Ll9zZWcucDEueXx8ZW8uY29tcHV0ZU9yaWVudGF0aW9uKHQuX3NlZy5wMCx0Ll9zZWcucDEscyk9PT1lby5SSUdIVCkpe3ZhciBoPWEuZ2V0RGVwdGgoRnMuTEVGVCk7dC5fc2VnLnAwLmVxdWFscyhjW2xdKXx8KGg9YS5nZXREZXB0aChGcy5SSUdIVCkpO3ZhciBmPW5ldyBHYSh0Ll9zZWcsaCk7dS5hZGQoZil9fWVsc2UgaWYoRWkoYXJndW1lbnRzWzJdLHZvKSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmRWkoYXJndW1lbnRzWzFdLHZvKSlmb3IodmFyIHA9YXJndW1lbnRzWzBdLGQ9YXJndW1lbnRzWzJdLGc9YXJndW1lbnRzWzFdLml0ZXJhdG9yKCk7Zy5oYXNOZXh0KCk7KXt2YXIgeT1nLm5leHQoKTsheS5pc0ZvcndhcmQoKXx8dC5maW5kU3RhYmJlZFNlZ21lbnRzKHAseSxkKX19LHFhLnByb3RvdHlwZS5nZXREZXB0aD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmZpbmRTdGFiYmVkU2VnbWVudHModCk7cmV0dXJuIDA9PT1lLnNpemUoKT8wOmFhLm1pbihlKS5fbGVmdERlcHRofSxxYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHFhfSxWYS5EZXB0aFNlZ21lbnQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEdhfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhxYSxWYSk7dmFyIEdhPWZ1bmN0aW9uKCl7dGhpcy5fdXB3YXJkU2VnPW51bGwsdGhpcy5fbGVmdERlcHRoPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX3Vwd2FyZFNlZz1uZXcgYmEodCksdGhpcy5fbGVmdERlcHRoPWV9O0dhLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtpZih0aGlzLl91cHdhcmRTZWcubWluWCgpPj1lLl91cHdhcmRTZWcubWF4WCgpKXJldHVybiAxO2lmKHRoaXMuX3Vwd2FyZFNlZy5tYXhYKCk8PWUuX3Vwd2FyZFNlZy5taW5YKCkpcmV0dXJuLTE7dmFyIG49dGhpcy5fdXB3YXJkU2VnLm9yaWVudGF0aW9uSW5kZXgoZS5fdXB3YXJkU2VnKTtyZXR1cm4gMCE9PW58fDAhPT0obj0tMSplLl91cHdhcmRTZWcub3JpZW50YXRpb25JbmRleCh0aGlzLl91cHdhcmRTZWcpKT9uOnRoaXMuX3Vwd2FyZFNlZy5jb21wYXJlVG8oZS5fdXB3YXJkU2VnKX0sR2EucHJvdG90eXBlLmNvbXBhcmVYPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5wMC5jb21wYXJlVG8oZS5wMCk7cmV0dXJuIDAhPT1uP246dC5wMS5jb21wYXJlVG8oZS5wMSl9LEdhLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cHdhcmRTZWcudG9TdHJpbmcoKX0sR2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpXX0sR2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEdhfTt2YXIgWWE9ZnVuY3Rpb24odCxlLG4pe3RoaXMucDA9dHx8bnVsbCx0aGlzLnAxPWV8fG51bGwsdGhpcy5wMj1ufHxudWxsfTtZYS5wcm90b3R5cGUuYXJlYT1mdW5jdGlvbigpe3JldHVybiBZYS5hcmVhKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLnNpZ25lZEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gWWEuc2lnbmVkQXJlYSh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5pbnRlcnBvbGF0ZVo9ZnVuY3Rpb24odCl7aWYobnVsbD09PXQpdGhyb3cgbmV3IGhpO3JldHVybiBZYS5pbnRlcnBvbGF0ZVoodCx0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5sb25nZXN0U2lkZUxlbmd0aD1mdW5jdGlvbigpe3JldHVybiBZYS5sb25nZXN0U2lkZUxlbmd0aCh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5pc0FjdXRlPWZ1bmN0aW9uKCl7cmV0dXJuIFlhLmlzQWN1dGUodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuY2lyY3VtY2VudHJlPWZ1bmN0aW9uKCl7cmV0dXJuIFlhLmNpcmN1bWNlbnRyZSh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5hcmVhM0Q9ZnVuY3Rpb24oKXtyZXR1cm4gWWEuYXJlYTNEKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLmNlbnRyb2lkPWZ1bmN0aW9uKCl7cmV0dXJuIFlhLmNlbnRyb2lkKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLmluQ2VudHJlPWZ1bmN0aW9uKCl7cmV0dXJuIFlhLmluQ2VudHJlKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFlhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBZYX0sWWEuYXJlYT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE1hdGguYWJzKCgobi54LXQueCkqKGUueS10LnkpLShlLngtdC54KSoobi55LXQueSkpLzIpfSxZYS5zaWduZWRBcmVhPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4oKG4ueC10LngpKihlLnktdC55KS0oZS54LXQueCkqKG4ueS10LnkpKS8yfSxZYS5kZXQ9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHQqci1lKm59LFlhLmludGVycG9sYXRlWj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1lLngsbz1lLnkscz1uLngtaSxhPXIueC1pLHU9bi55LW8sYz1yLnktbyxsPXMqYy1hKnUsaD10LngtaSxmPXQueS1vLHA9KGMqaC1hKmYpL2wsZD0oLXUqaCtzKmYpL2w7cmV0dXJuIGUueitwKihuLnotZS56KStkKihyLnotZS56KX0sWWEubG9uZ2VzdFNpZGVMZW5ndGg9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuZGlzdGFuY2UoZSksaT1lLmRpc3RhbmNlKG4pLG89bi5kaXN0YW5jZSh0KSxzPXI7cmV0dXJuIGk+cyYmKHM9aSksbz5zJiYocz1vKSxzfSxZYS5pc0FjdXRlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hKCFCYS5pc0FjdXRlKHQsZSxuKXx8IUJhLmlzQWN1dGUoZSxuLHQpfHwhQmEuaXNBY3V0ZShuLHQsZSkpfSxZYS5jaXJjdW1jZW50cmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW4ueCxpPW4ueSxvPXQueC1yLHM9dC55LWksYT1lLngtcix1PWUueS1pLGM9MipZYS5kZXQobyxzLGEsdSksbD1ZYS5kZXQocyxvKm8rcypzLHUsYSphK3UqdSksaD1ZYS5kZXQobyxvKm8rcypzLGEsYSphK3UqdSk7cmV0dXJuIG5ldyB2aShyLWwvYyxpK2gvYyl9LFlhLnBlcnBlbmRpY3VsYXJCaXNlY3Rvcj1mdW5jdGlvbih0LGUpe3ZhciBuPWUueC10Lngscj1lLnktdC55LGk9bmV3IHppKHQueCtuLzIsdC55K3IvMiwxKSxvPW5ldyB6aSh0LngtcituLzIsdC55K24rci8yLDEpO3JldHVybiBuZXcgemkoaSxvKX0sWWEuYW5nbGVCaXNlY3Rvcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS5kaXN0YW5jZSh0KSxpPXIvKHIrZS5kaXN0YW5jZShuKSksbz1uLngtdC54LHM9bi55LXQueTtyZXR1cm4gbmV3IHZpKHQueCtpKm8sdC55K2kqcyl9LFlhLmFyZWEzRD1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS54LXQueCxpPWUueS10Lnksbz1lLnotdC56LHM9bi54LXQueCxhPW4ueS10LnksdT1uLnotdC56LGM9aSp1LW8qYSxsPW8qcy1yKnUsaD1yKmEtaSpzLGY9YypjK2wqbCtoKmg7cmV0dXJuIE1hdGguc3FydChmKS8yfSxZYS5jZW50cm9pZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9KHQueCtlLngrbi54KS8zLGk9KHQueStlLnkrbi55KS8zO3JldHVybiBuZXcgdmkocixpKX0sWWEuaW5DZW50cmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUuZGlzdGFuY2UobiksaT10LmRpc3RhbmNlKG4pLG89dC5kaXN0YW5jZShlKSxzPXIraStvLGE9KHIqdC54K2kqZS54K28qbi54KS9zLHU9KHIqdC55K2kqZS55K28qbi55KS9zO3JldHVybiBuZXcgdmkoYSx1KX07dmFyIFhhPWZ1bmN0aW9uKCl7dGhpcy5faW5wdXRHZW9tPW51bGwsdGhpcy5fZGlzdGFuY2U9bnVsbCx0aGlzLl9jdXJ2ZUJ1aWxkZXI9bnVsbCx0aGlzLl9jdXJ2ZUxpc3Q9bmV3IHhvO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTt0aGlzLl9pbnB1dEdlb209dCx0aGlzLl9kaXN0YW5jZT1lLHRoaXMuX2N1cnZlQnVpbGRlcj1ufTtYYS5wcm90b3R5cGUuYWRkUG9pbnQ9ZnVuY3Rpb24odCl7aWYodGhpcy5fZGlzdGFuY2U8PTApcmV0dXJuIG51bGw7dmFyIGU9dC5nZXRDb29yZGluYXRlcygpLG49dGhpcy5fY3VydmVCdWlsZGVyLmdldExpbmVDdXJ2ZShlLHRoaXMuX2Rpc3RhbmNlKTt0aGlzLmFkZEN1cnZlKG4sYmkuRVhURVJJT1IsYmkuSU5URVJJT1IpfSxYYS5wcm90b3R5cGUuYWRkUG9seWdvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5fZGlzdGFuY2Uscj1Gcy5MRUZUO3RoaXMuX2Rpc3RhbmNlPDAmJihuPS10aGlzLl9kaXN0YW5jZSxyPUZzLlJJR0hUKTt2YXIgaT10LmdldEV4dGVyaW9yUmluZygpLG89RG8ucmVtb3ZlUmVwZWF0ZWRQb2ludHMoaS5nZXRDb29yZGluYXRlcygpKTtpZih0aGlzLl9kaXN0YW5jZTwwJiZ0aGlzLmlzRXJvZGVkQ29tcGxldGVseShpLHRoaXMuX2Rpc3RhbmNlKXx8dGhpcy5fZGlzdGFuY2U8PTAmJm8ubGVuZ3RoPDMpcmV0dXJuIG51bGw7dGhpcy5hZGRQb2x5Z29uUmluZyhvLG4scixiaS5FWFRFUklPUixiaS5JTlRFUklPUik7Zm9yKHZhciBzPTA7czx0LmdldE51bUludGVyaW9yUmluZygpO3MrKyl7dmFyIGE9dC5nZXRJbnRlcmlvclJpbmdOKHMpLHU9RG8ucmVtb3ZlUmVwZWF0ZWRQb2ludHMoYS5nZXRDb29yZGluYXRlcygpKTtlLl9kaXN0YW5jZT4wJiZlLmlzRXJvZGVkQ29tcGxldGVseShhLC1lLl9kaXN0YW5jZSl8fGUuYWRkUG9seWdvblJpbmcodSxuLEZzLm9wcG9zaXRlKHIpLGJpLklOVEVSSU9SLGJpLkVYVEVSSU9SKX19LFhhLnByb3RvdHlwZS5pc1RyaWFuZ2xlRXJvZGVkQ29tcGxldGVseT1mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBZYSh0WzBdLHRbMV0sdFsyXSkscj1uLmluQ2VudHJlKCk7cmV0dXJuIGVvLmRpc3RhbmNlUG9pbnRMaW5lKHIsbi5wMCxuLnAxKTxNYXRoLmFicyhlKX0sWGEucHJvdG90eXBlLmFkZExpbmVTdHJpbmc9ZnVuY3Rpb24odCl7aWYodGhpcy5fZGlzdGFuY2U8PTAmJiF0aGlzLl9jdXJ2ZUJ1aWxkZXIuZ2V0QnVmZmVyUGFyYW1ldGVycygpLmlzU2luZ2xlU2lkZWQoKSlyZXR1cm4gbnVsbDt2YXIgZT1Eby5yZW1vdmVSZXBlYXRlZFBvaW50cyh0LmdldENvb3JkaW5hdGVzKCkpLG49dGhpcy5fY3VydmVCdWlsZGVyLmdldExpbmVDdXJ2ZShlLHRoaXMuX2Rpc3RhbmNlKTt0aGlzLmFkZEN1cnZlKG4sYmkuRVhURVJJT1IsYmkuSU5URVJJT1IpfSxYYS5wcm90b3R5cGUuYWRkQ3VydmU9ZnVuY3Rpb24odCxlLG4pe2lmKG51bGw9PT10fHx0Lmxlbmd0aDwyKXJldHVybiBudWxsO3ZhciByPW5ldyB3YSh0LG5ldyBqcygwLGJpLkJPVU5EQVJZLGUsbikpO3RoaXMuX2N1cnZlTGlzdC5hZGQocil9LFhhLnByb3RvdHlwZS5nZXRDdXJ2ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGQodGhpcy5faW5wdXRHZW9tKSx0aGlzLl9jdXJ2ZUxpc3R9LFhhLnByb3RvdHlwZS5hZGRQb2x5Z29uUmluZz1mdW5jdGlvbih0LGUsbixyLGkpe2lmKDA9PT1lJiZ0Lmxlbmd0aDxwcy5NSU5JTVVNX1ZBTElEX1NJWkUpcmV0dXJuIG51bGw7dmFyIG89cixzPWk7dC5sZW5ndGg+PXBzLk1JTklNVU1fVkFMSURfU0laRSYmZW8uaXNDQ1codCkmJihvPWkscz1yLG49RnMub3Bwb3NpdGUobikpO3ZhciBhPXRoaXMuX2N1cnZlQnVpbGRlci5nZXRSaW5nQ3VydmUodCxuLGUpO3RoaXMuYWRkQ3VydmUoYSxvLHMpfSxYYS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe2lmKHQuaXNFbXB0eSgpKXJldHVybiBudWxsO3QgaW5zdGFuY2VvZiBocz90aGlzLmFkZFBvbHlnb24odCk6dCBpbnN0YW5jZW9mIGFzP3RoaXMuYWRkTGluZVN0cmluZyh0KTp0IGluc3RhbmNlb2YgY3M/dGhpcy5hZGRQb2ludCh0KToodCBpbnN0YW5jZW9mIGZzfHx0IGluc3RhbmNlb2YgWm98fHQgaW5zdGFuY2VvZiBkc3x8dCBpbnN0YW5jZW9mIEhvKSYmdGhpcy5hZGRDb2xsZWN0aW9uKHQpfSxYYS5wcm90b3R5cGUuaXNFcm9kZWRDb21wbGV0ZWx5PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRDb29yZGluYXRlcygpO2lmKG4ubGVuZ3RoPDQpcmV0dXJuIGU8MDtpZig0PT09bi5sZW5ndGgpcmV0dXJuIHRoaXMuaXNUcmlhbmdsZUVyb2RlZENvbXBsZXRlbHkobixlKTt2YXIgcj10LmdldEVudmVsb3BlSW50ZXJuYWwoKSxpPU1hdGgubWluKHIuZ2V0SGVpZ2h0KCksci5nZXRXaWR0aCgpKTtyZXR1cm4gZTwwJiYyKk1hdGguYWJzKGUpPml9LFhhLnByb3RvdHlwZS5hZGRDb2xsZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5nZXROdW1HZW9tZXRyaWVzKCk7ZSsrKXt2YXIgbj10LmdldEdlb21ldHJ5TihlKTt0aGlzLmFkZChuKX19LFhhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxYYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWGF9O3ZhciBXYT1mdW5jdGlvbigpe307V2EucHJvdG90eXBlLmxvY2F0ZT1mdW5jdGlvbih0KXt9LFdhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxXYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gV2F9O3ZhciBIYT1mdW5jdGlvbigpe3RoaXMuX3BhcmVudD1udWxsLHRoaXMuX2F0U3RhcnQ9bnVsbCx0aGlzLl9tYXg9bnVsbCx0aGlzLl9pbmRleD1udWxsLHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcj1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9wYXJlbnQ9dCx0aGlzLl9hdFN0YXJ0PSEwLHRoaXMuX2luZGV4PTAsdGhpcy5fbWF4PXQuZ2V0TnVtR2VvbWV0cmllcygpfTtIYS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKHRoaXMuX2F0U3RhcnQpcmV0dXJuIHRoaXMuX2F0U3RhcnQ9ITEsSGEuaXNBdG9taWModGhpcy5fcGFyZW50KSYmdGhpcy5faW5kZXgrKyx0aGlzLl9wYXJlbnQ7aWYobnVsbCE9PXRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcil7aWYodGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yLmhhc05leHQoKSlyZXR1cm4gdGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yLm5leHQoKTt0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3I9bnVsbH1pZih0aGlzLl9pbmRleD49dGhpcy5fbWF4KXRocm93IG5ldyBfbzt2YXIgdD10aGlzLl9wYXJlbnQuZ2V0R2VvbWV0cnlOKHRoaXMuX2luZGV4KyspO3JldHVybiB0IGluc3RhbmNlb2YgSG8/KHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcj1uZXcgSGEodCksdGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yLm5leHQoKSk6dH0sSGEucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKX0sSGEucHJvdG90eXBlLmhhc05leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9hdFN0YXJ0KXJldHVybiEwO2lmKG51bGwhPT10aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3Ipe2lmKHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCkpcmV0dXJuITA7dGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yPW51bGx9cmV0dXJuISh0aGlzLl9pbmRleD49dGhpcy5fbWF4KX0sSGEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW21vXX0sSGEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEhhfSxIYS5pc0F0b21pYz1mdW5jdGlvbih0KXtyZXR1cm4hKHQgaW5zdGFuY2VvZiBIbyl9O3ZhciBaYT1mdW5jdGlvbigpe3RoaXMuX2dlb209bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZ2VvbT10fTtaYS5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBaYS5sb2NhdGUodCx0aGlzLl9nZW9tKX0sWmEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1dhXX0sWmEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFphfSxaYS5pc1BvaW50SW5SaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuISFlLmdldEVudmVsb3BlSW50ZXJuYWwoKS5pbnRlcnNlY3RzKHQpJiZlby5pc1BvaW50SW5SaW5nKHQsZS5nZXRDb29yZGluYXRlcygpKX0sWmEuY29udGFpbnNQb2ludEluUG9seWdvbj1mdW5jdGlvbih0LGUpe2lmKGUuaXNFbXB0eSgpKXJldHVybiExO3ZhciBuPWUuZ2V0RXh0ZXJpb3JSaW5nKCk7aWYoIVphLmlzUG9pbnRJblJpbmcodCxuKSlyZXR1cm4hMTtmb3IodmFyIHI9MDtyPGUuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7cisrKXt2YXIgaT1lLmdldEludGVyaW9yUmluZ04ocik7aWYoWmEuaXNQb2ludEluUmluZyh0LGkpKXJldHVybiExfXJldHVybiEwfSxaYS5jb250YWluc1BvaW50PWZ1bmN0aW9uKHQsZSl7aWYoZSBpbnN0YW5jZW9mIGhzKXJldHVybiBaYS5jb250YWluc1BvaW50SW5Qb2x5Z29uKHQsZSk7aWYoZSBpbnN0YW5jZW9mIEhvKWZvcih2YXIgbj1uZXcgSGEoZSk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZihyIT09ZSYmWmEuY29udGFpbnNQb2ludCh0LHIpKXJldHVybiEwfXJldHVybiExfSxaYS5sb2NhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5pc0VtcHR5KCk/YmkuRVhURVJJT1I6WmEuY29udGFpbnNQb2ludCh0LGUpP2JpLklOVEVSSU9SOmJpLkVYVEVSSU9SfTt2YXIgS2E9ZnVuY3Rpb24oKXt0aGlzLl9lZGdlTWFwPW5ldyBrbyx0aGlzLl9lZGdlTGlzdD1udWxsLHRoaXMuX3B0SW5BcmVhTG9jYXRpb249W2JpLk5PTkUsYmkuTk9ORV19O0thLnByb3RvdHlwZS5nZXROZXh0Q1c9ZnVuY3Rpb24odCl7dGhpcy5nZXRFZGdlcygpO3ZhciBlPXRoaXMuX2VkZ2VMaXN0LmluZGV4T2YodCksbj1lLTE7cmV0dXJuIDA9PT1lJiYobj10aGlzLl9lZGdlTGlzdC5zaXplKCktMSksdGhpcy5fZWRnZUxpc3QuZ2V0KG4pfSxLYS5wcm90b3R5cGUucHJvcGFnYXRlU2lkZUxhYmVscz1mdW5jdGlvbih0KXtmb3IodmFyIGU9YmkuTk9ORSxuPXRoaXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpLmdldExhYmVsKCk7ci5pc0FyZWEodCkmJnIuZ2V0TG9jYXRpb24odCxGcy5MRUZUKSE9PWJpLk5PTkUmJihlPXIuZ2V0TG9jYXRpb24odCxGcy5MRUZUKSl9aWYoZT09PWJpLk5PTkUpcmV0dXJuIG51bGw7Zm9yKHZhciBpPWUsbz10aGlzLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKSxhPXMuZ2V0TGFiZWwoKTtpZihhLmdldExvY2F0aW9uKHQsRnMuT04pPT09YmkuTk9ORSYmYS5zZXRMb2NhdGlvbih0LEZzLk9OLGkpLGEuaXNBcmVhKHQpKXt2YXIgdT1hLmdldExvY2F0aW9uKHQsRnMuTEVGVCksYz1hLmdldExvY2F0aW9uKHQsRnMuUklHSFQpO2lmKGMhPT1iaS5OT05FKXtpZihjIT09aSl0aHJvdyBuZXcgUnMoInNpZGUgbG9jYXRpb24gY29uZmxpY3QiLHMuZ2V0Q29vcmRpbmF0ZSgpKTt1PT09YmkuTk9ORSYmWmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoImZvdW5kIHNpbmdsZSBudWxsIHNpZGUgKGF0ICIrcy5nZXRDb29yZGluYXRlKCkrIikiKSxpPXV9ZWxzZSBaaS5pc1RydWUoYS5nZXRMb2NhdGlvbih0LEZzLkxFRlQpPT09YmkuTk9ORSwiZm91bmQgc2luZ2xlIG51bGwgc2lkZSIpLGEuc2V0TG9jYXRpb24odCxGcy5SSUdIVCxpKSxhLnNldExvY2F0aW9uKHQsRnMuTEVGVCxpKX19fSxLYS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuaXRlcmF0b3IoKTtyZXR1cm4gdC5oYXNOZXh0KCk/dC5uZXh0KCkuZ2V0Q29vcmRpbmF0ZSgpOm51bGx9LEthLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXtraS5vdXQucHJpbnRsbigiRWRnZUVuZFN0YXI6ICAgIit0aGlzLmdldENvb3JkaW5hdGUoKSk7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLnByaW50KHQpfX0sS2EucHJvdG90eXBlLmlzQXJlYUxhYmVsc0NvbnNpc3RlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcHV0ZUVkZ2VFbmRMYWJlbHModC5nZXRCb3VuZGFyeU5vZGVSdWxlKCkpLHRoaXMuY2hlY2tBcmVhTGFiZWxzQ29uc2lzdGVudCgwKX0sS2EucHJvdG90eXBlLmNoZWNrQXJlYUxhYmVsc0NvbnNpc3RlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRFZGdlcygpO2lmKGUuc2l6ZSgpPD0wKXJldHVybiEwO3ZhciBuPWUuc2l6ZSgpLTEscj1lLmdldChuKS5nZXRMYWJlbCgpLmdldExvY2F0aW9uKHQsRnMuTEVGVCk7WmkuaXNUcnVlKHIhPT1iaS5OT05FLCJGb3VuZCB1bmxhYmVsbGVkIGFyZWEgZWRnZSIpO2Zvcih2YXIgaT1yLG89dGhpcy5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCkuZ2V0TGFiZWwoKTtaaS5pc1RydWUocy5pc0FyZWEodCksIkZvdW5kIG5vbi1hcmVhIGVkZ2UiKTt2YXIgYT1zLmdldExvY2F0aW9uKHQsRnMuTEVGVCksdT1zLmdldExvY2F0aW9uKHQsRnMuUklHSFQpO2lmKGE9PT11fHx1IT09aSlyZXR1cm4hMTtpPWF9cmV0dXJuITB9LEthLnByb3RvdHlwZS5maW5kSW5kZXg9ZnVuY3Rpb24odCl7dGhpcy5pdGVyYXRvcigpO2Zvcih2YXIgZT0wO2U8dGhpcy5fZWRnZUxpc3Quc2l6ZSgpO2UrKyl7aWYodGhpcy5fZWRnZUxpc3QuZ2V0KGUpPT09dClyZXR1cm4gZX1yZXR1cm4tMX0sS2EucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RWRnZXMoKS5pdGVyYXRvcigpfSxLYS5wcm90b3R5cGUuZ2V0RWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuX2VkZ2VMaXN0JiYodGhpcy5fZWRnZUxpc3Q9bmV3IHhvKHRoaXMuX2VkZ2VNYXAudmFsdWVzKCkpKSx0aGlzLl9lZGdlTGlzdH0sS2EucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5fcHRJbkFyZWFMb2NhdGlvblt0XT09PWJpLk5PTkUmJih0aGlzLl9wdEluQXJlYUxvY2F0aW9uW3RdPVphLmxvY2F0ZShlLG5bdF0uZ2V0R2VvbWV0cnkoKSkpLHRoaXMuX3B0SW5BcmVhTG9jYXRpb25bdF19LEthLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PW5ldyBBaTt0LmFwcGVuZCgiRWRnZUVuZFN0YXI6ICAgIit0aGlzLmdldENvb3JkaW5hdGUoKSksdC5hcHBlbmQoIlxuIik7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3QuYXBwZW5kKG4pLHQuYXBwZW5kKCJcbiIpfXJldHVybiB0LnRvU3RyaW5nKCl9LEthLnByb3RvdHlwZS5jb21wdXRlRWRnZUVuZExhYmVscz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkuY29tcHV0ZUxhYmVsKHQpfX0sS2EucHJvdG90eXBlLmNvbXB1dGVMYWJlbGxpbmc9ZnVuY3Rpb24odCl7dGhpcy5jb21wdXRlRWRnZUVuZExhYmVscyh0WzBdLmdldEJvdW5kYXJ5Tm9kZVJ1bGUoKSksdGhpcy5wcm9wYWdhdGVTaWRlTGFiZWxzKDApLHRoaXMucHJvcGFnYXRlU2lkZUxhYmVscygxKTtmb3IodmFyIGU9WyExLCExXSxuPXRoaXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspZm9yKHZhciByPW4ubmV4dCgpLmdldExhYmVsKCksaT0wO2k8MjtpKyspci5pc0xpbmUoaSkmJnIuZ2V0TG9jYXRpb24oaSk9PT1iaS5CT1VOREFSWSYmKGVbaV09ITApO2Zvcih2YXIgbz10aGlzLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KWZvcih2YXIgcz1vLm5leHQoKSxhPXMuZ2V0TGFiZWwoKSx1PTA7dTwyO3UrKylpZihhLmlzQW55TnVsbCh1KSl7dmFyIGM9YmkuTk9ORTtpZihlW3VdKWM9YmkuRVhURVJJT1I7ZWxzZXt2YXIgbD1zLmdldENvb3JkaW5hdGUoKTtjPXRoaXMuZ2V0TG9jYXRpb24odSxsLHQpfWEuc2V0QWxsTG9jYXRpb25zSWZOdWxsKHUsYyl9fSxLYS5wcm90b3R5cGUuZ2V0RGVncmVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VNYXAuc2l6ZSgpfSxLYS5wcm90b3R5cGUuaW5zZXJ0RWRnZUVuZD1mdW5jdGlvbih0LGUpe3RoaXMuX2VkZ2VNYXAucHV0KHQsZSksdGhpcy5fZWRnZUxpc3Q9bnVsbH0sS2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEthLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBLYX07dmFyIEphPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0PW51bGwsdGhpcy5fbGFiZWw9bnVsbCx0aGlzLl9TQ0FOTklOR19GT1JfSU5DT01JTkc9MSx0aGlzLl9MSU5LSU5HX1RPX09VVEdPSU5HPTJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmdldFJlc3VsdEFyZWFFZGdlcygpO2Zvcih2YXIgZT1udWxsLG49bnVsbCxyPXRoaXMuX1NDQU5OSU5HX0ZPUl9JTkNPTUlORyxpPTA7aTx0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3Quc2l6ZSgpO2krKyl7dmFyIG89dC5fcmVzdWx0QXJlYUVkZ2VMaXN0LmdldChpKSxzPW8uZ2V0U3ltKCk7aWYoby5nZXRMYWJlbCgpLmlzQXJlYSgpKXN3aXRjaChudWxsPT09ZSYmby5pc0luUmVzdWx0KCkmJihlPW8pLHIpe2Nhc2UgdC5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HOmlmKCFzLmlzSW5SZXN1bHQoKSljb250aW51ZTtuPXMscj10Ll9MSU5LSU5HX1RPX09VVEdPSU5HO2JyZWFrO2Nhc2UgdC5fTElOS0lOR19UT19PVVRHT0lORzppZighby5pc0luUmVzdWx0KCkpY29udGludWU7bi5zZXROZXh0KG8pLHI9dC5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HfX1pZihyPT09dGhpcy5fTElOS0lOR19UT19PVVRHT0lORyl7aWYobnVsbD09PWUpdGhyb3cgbmV3IFJzKCJubyBvdXRnb2luZyBkaXJFZGdlIGZvdW5kIix0aGlzLmdldENvb3JkaW5hdGUoKSk7WmkuaXNUcnVlKGUuaXNJblJlc3VsdCgpLCJ1bmFibGUgdG8gbGluayBsYXN0IGluY29taW5nIGRpckVkZ2UiKSxuLnNldE5leHQoZSl9fSxlLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCl7dmFyIGU9dDt0aGlzLmluc2VydEVkZ2VFbmQoZSxlKX0sZS5wcm90b3R5cGUuZ2V0UmlnaHRtb3N0RWRnZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0RWRnZXMoKSxlPXQuc2l6ZSgpO2lmKGU8MSlyZXR1cm4gbnVsbDt2YXIgbj10LmdldCgwKTtpZigxPT09ZSlyZXR1cm4gbjt2YXIgcj10LmdldChlLTEpLGk9bi5nZXRRdWFkcmFudCgpLG89ci5nZXRRdWFkcmFudCgpO3JldHVybiBXcy5pc05vcnRoZXJuKGkpJiZXcy5pc05vcnRoZXJuKG8pP246V3MuaXNOb3J0aGVybihpKXx8V3MuaXNOb3J0aGVybihvKT8wIT09bi5nZXREeSgpP246MCE9PXIuZ2V0RHkoKT9yOihaaS5zaG91bGROZXZlclJlYWNoSGVyZSgiZm91bmQgdHdvIGhvcml6b250YWwgZWRnZXMgaW5jaWRlbnQgb24gbm9kZSIpLG51bGwpOnJ9LGUucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe2tpLm91dC5wcmludGxuKCJEaXJlY3RlZEVkZ2VTdGFyOiAiK3RoaXMuZ2V0Q29vcmRpbmF0ZSgpKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dC5wcmludCgib3V0ICIpLG4ucHJpbnQodCksdC5wcmludGxuKCksdC5wcmludCgiaW4gIiksbi5nZXRTeW0oKS5wcmludCh0KSx0LnByaW50bG4oKX19LGUucHJvdG90eXBlLmdldFJlc3VsdEFyZWFFZGdlcz1mdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3QpcmV0dXJuIHRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdDt0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3Q9bmV3IHhvO2Zvcih2YXIgdD10aGlzLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKTsoZS5pc0luUmVzdWx0KCl8fGUuZ2V0U3ltKCkuaXNJblJlc3VsdCgpKSYmdGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0LmFkZChlKX1yZXR1cm4gdGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0fSxlLnByb3RvdHlwZS51cGRhdGVMYWJlbGxpbmc9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLmdldExhYmVsKCk7bi5zZXRBbGxMb2NhdGlvbnNJZk51bGwoMCx0LmdldExvY2F0aW9uKDApKSxuLnNldEFsbExvY2F0aW9uc0lmTnVsbCgxLHQuZ2V0TG9jYXRpb24oMSkpfX0sZS5wcm90b3R5cGUubGlua0FsbERpcmVjdGVkRWRnZXM9ZnVuY3Rpb24oKXt0aGlzLmdldEVkZ2VzKCk7Zm9yKHZhciB0PW51bGwsZT1udWxsLG49dGhpcy5fZWRnZUxpc3Quc2l6ZSgpLTE7bj49MDtuLS0pe3ZhciByPXRoaXMuX2VkZ2VMaXN0LmdldChuKSxpPXIuZ2V0U3ltKCk7bnVsbD09PWUmJihlPWkpLG51bGwhPT10JiZpLnNldE5leHQodCksdD1yfWUuc2V0TmV4dCh0KX0sZS5wcm90b3R5cGUuY29tcHV0ZURlcHRocz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT10aGlzLmZpbmRJbmRleCh0KSxuPXQuZ2V0RGVwdGgoRnMuTEVGVCkscj10LmdldERlcHRoKEZzLlJJR0hUKSxpPXRoaXMuY29tcHV0ZURlcHRocyhlKzEsdGhpcy5fZWRnZUxpc3Quc2l6ZSgpLG4pO2lmKHRoaXMuY29tcHV0ZURlcHRocygwLGUsaSkhPT1yKXRocm93IG5ldyBScygiZGVwdGggbWlzbWF0Y2ggYXQgIit0LmdldENvb3JkaW5hdGUoKSl9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1swXTthPG87YSsrKXt2YXIgdT10aGlzLl9lZGdlTGlzdC5nZXQoYSk7dS5zZXRFZGdlRGVwdGhzKEZzLlJJR0hULHMpLHM9dS5nZXREZXB0aChGcy5MRUZUKX1yZXR1cm4gc319LGUucHJvdG90eXBlLm1lcmdlU3ltTGFiZWxzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpO2UuZ2V0TGFiZWwoKS5tZXJnZShlLmdldFN5bSgpLmdldExhYmVsKCkpfX0sZS5wcm90b3R5cGUubGlua01pbmltYWxEaXJlY3RlZEVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49bnVsbCxyPW51bGwsaT10aGlzLl9TQ0FOTklOR19GT1JfSU5DT01JTkcsbz10aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3Quc2l6ZSgpLTE7bz49MDtvLS0pe3ZhciBzPWUuX3Jlc3VsdEFyZWFFZGdlTGlzdC5nZXQobyksYT1zLmdldFN5bSgpO3N3aXRjaChudWxsPT09biYmcy5nZXRFZGdlUmluZygpPT09dCYmKG49cyksaSl7Y2FzZSBlLl9TQ0FOTklOR19GT1JfSU5DT01JTkc6aWYoYS5nZXRFZGdlUmluZygpIT09dCljb250aW51ZTtyPWEsaT1lLl9MSU5LSU5HX1RPX09VVEdPSU5HO2JyZWFrO2Nhc2UgZS5fTElOS0lOR19UT19PVVRHT0lORzppZihzLmdldEVkZ2VSaW5nKCkhPT10KWNvbnRpbnVlO3Iuc2V0TmV4dE1pbihzKSxpPWUuX1NDQU5OSU5HX0ZPUl9JTkNPTUlOR319aT09PXRoaXMuX0xJTktJTkdfVE9fT1VUR09JTkcmJihaaS5pc1RydWUobnVsbCE9PW4sImZvdW5kIG51bGwgZm9yIGZpcnN0IG91dGdvaW5nIGRpckVkZ2UiKSxaaS5pc1RydWUobi5nZXRFZGdlUmluZygpPT09dCwidW5hYmxlIHRvIGxpbmsgbGFzdCBpbmNvbWluZyBkaXJFZGdlIiksci5zZXROZXh0TWluKG4pKX0sZS5wcm90b3R5cGUuZ2V0T3V0Z29pbmdEZWdyZWU9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciB0PTAsZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5pc0luUmVzdWx0KCkmJnQrK31yZXR1cm4gdH1pZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBuPWFyZ3VtZW50c1swXSxyPTAsaT10aGlzLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXtpLm5leHQoKS5nZXRFZGdlUmluZygpPT09biYmcisrfXJldHVybiByfX0sZS5wcm90b3R5cGUuZ2V0TGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFiZWx9LGUucHJvdG90eXBlLmZpbmRDb3ZlcmVkTGluZUVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PWJpLk5PTkUsZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKSxyPW4uZ2V0U3ltKCk7aWYoIW4uaXNMaW5lRWRnZSgpKXtpZihuLmlzSW5SZXN1bHQoKSl7dD1iaS5JTlRFUklPUjticmVha31pZihyLmlzSW5SZXN1bHQoKSl7dD1iaS5FWFRFUklPUjticmVha319fWlmKHQ9PT1iaS5OT05FKXJldHVybiBudWxsO2Zvcih2YXIgaT10LG89dGhpcy5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCksYT1zLmdldFN5bSgpO3MuaXNMaW5lRWRnZSgpP3MuZ2V0RWRnZSgpLnNldENvdmVyZWQoaT09PWJpLklOVEVSSU9SKToocy5pc0luUmVzdWx0KCkmJihpPWJpLkVYVEVSSU9SKSxhLmlzSW5SZXN1bHQoKSYmKGk9YmkuSU5URVJJT1IpKX19LGUucHJvdG90eXBlLmNvbXB1dGVMYWJlbGxpbmc9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuY29tcHV0ZUxhYmVsbGluZy5jYWxsKHRoaXMsZSksdGhpcy5fbGFiZWw9bmV3IGpzKGJpLk5PTkUpO2Zvcih2YXIgbj10aGlzLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KWZvcih2YXIgcj1uLm5leHQoKS5nZXRFZGdlKCkuZ2V0TGFiZWwoKSxpPTA7aTwyO2krKyl7dmFyIG89ci5nZXRMb2NhdGlvbihpKTsobz09PWJpLklOVEVSSU9SfHxvPT09YmkuQk9VTkRBUlkpJiZ0aGlzLl9sYWJlbC5zZXRMb2NhdGlvbihpLGJpLklOVEVSSU9SKX19LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KEthKSxRYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmNyZWF0ZU5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBZcyh0LG5ldyBKYSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KEpzKSwkYT1mdW5jdGlvbiB0KCl7dGhpcy5fcHRzPW51bGwsdGhpcy5fb3JpZW50YXRpb249bnVsbDt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5fcHRzPWUsdGhpcy5fb3JpZW50YXRpb249dC5vcmllbnRhdGlvbihlKX07JGEucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10O3JldHVybiAkYS5jb21wYXJlT3JpZW50ZWQodGhpcy5fcHRzLHRoaXMuX29yaWVudGF0aW9uLGUuX3B0cyxlLl9vcmllbnRhdGlvbil9LCRhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LCRhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiAkYX0sJGEub3JpZW50YXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT1Eby5pbmNyZWFzaW5nRGlyZWN0aW9uKHQpfSwkYS5jb21wYXJlT3JpZW50ZWQ9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPWU/MTotMSxvPXI/MTotMSxzPWU/dC5sZW5ndGg6LTEsYT1yP24ubGVuZ3RoOi0xLHU9ZT8wOnQubGVuZ3RoLTEsYz1yPzA6bi5sZW5ndGgtMTs7KXt2YXIgbD10W3VdLmNvbXBhcmVUbyhuW2NdKTtpZigwIT09bClyZXR1cm4gbDt2YXIgaD0odSs9aSk9PT1zLGY9KGMrPW8pPT09YTtpZihoJiYhZilyZXR1cm4tMTtpZighaCYmZilyZXR1cm4gMTtpZihoJiZmKXJldHVybiAwfX07dmFyIHR1PWZ1bmN0aW9uKCl7dGhpcy5fZWRnZXM9bmV3IHhvLHRoaXMuX29jYU1hcD1uZXcga299O3R1LnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50KCJNVUxUSUxJTkVTVFJJTkcgKCAiKTtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2VzLnNpemUoKTtlKyspe3ZhciBuPXRoaXMuX2VkZ2VzLmdldChlKTtlPjAmJnQucHJpbnQoIiwiKSx0LnByaW50KCIoIik7Zm9yKHZhciByPW4uZ2V0Q29vcmRpbmF0ZXMoKSxpPTA7aTxyLmxlbmd0aDtpKyspaT4wJiZ0LnByaW50KCIsIiksdC5wcmludChyW2ldLngrIiAiK3JbaV0ueSk7dC5wcmludGxuKCIpIil9dC5wcmludCgiKSAgIil9LHR1LnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspdGhpcy5hZGQoZS5uZXh0KCkpfSx0dS5wcm90b3R5cGUuZmluZEVkZ2VJbmRleD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2VzLnNpemUoKTtlKyspaWYodGhpcy5fZWRnZXMuZ2V0KGUpLmVxdWFscyh0KSlyZXR1cm4gZTtyZXR1cm4tMX0sdHUucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VzLml0ZXJhdG9yKCl9LHR1LnByb3RvdHlwZS5nZXRFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlc30sdHUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZWRnZXMuZ2V0KHQpfSx0dS5wcm90b3R5cGUuZmluZEVxdWFsRWRnZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgJGEodC5nZXRDb29yZGluYXRlcygpKTtyZXR1cm4gdGhpcy5fb2NhTWFwLmdldChlKX0sdHUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt0aGlzLl9lZGdlcy5hZGQodCk7dmFyIGU9bmV3ICRhKHQuZ2V0Q29vcmRpbmF0ZXMoKSk7dGhpcy5fb2NhTWFwLnB1dChlLHQpfSx0dS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHR1fTt2YXIgZXU9ZnVuY3Rpb24oKXt9O2V1LnByb3RvdHlwZS5wcm9jZXNzSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbixyKXt9LGV1LnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXt9LGV1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxldS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZXV9O3ZhciBudT1mdW5jdGlvbigpe3RoaXMuX2hhc0ludGVyc2VjdGlvbj0hMSx0aGlzLl9oYXNQcm9wZXI9ITEsdGhpcy5faGFzUHJvcGVySW50ZXJpb3I9ITEsdGhpcy5faGFzSW50ZXJpb3I9ITEsdGhpcy5fcHJvcGVySW50ZXJzZWN0aW9uUG9pbnQ9bnVsbCx0aGlzLl9saT1udWxsLHRoaXMuX2lzU2VsZkludGVyc2VjdGlvbj1udWxsLHRoaXMubnVtSW50ZXJzZWN0aW9ucz0wLHRoaXMubnVtSW50ZXJpb3JJbnRlcnNlY3Rpb25zPTAsdGhpcy5udW1Qcm9wZXJJbnRlcnNlY3Rpb25zPTAsdGhpcy5udW1UZXN0cz0wO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9saT10fTtudS5wcm90b3R5cGUuaXNUcml2aWFsSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiYxPT09dGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uTnVtKCkpe2lmKG51LmlzQWRqYWNlbnRTZWdtZW50cyhlLHIpKXJldHVybiEwO2lmKHQuaXNDbG9zZWQoKSl7dmFyIGk9dC5zaXplKCktMTtpZigwPT09ZSYmcj09PWl8fDA9PT1yJiZlPT09aSlyZXR1cm4hMH19cmV0dXJuITF9LG51LnByb3RvdHlwZS5nZXRQcm9wZXJJbnRlcnNlY3Rpb25Qb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJJbnRlcnNlY3Rpb25Qb2ludH0sbnUucHJvdG90eXBlLmhhc1Byb3BlckludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Byb3BlckludGVyaW9yfSxudS5wcm90b3R5cGUuZ2V0TGluZUludGVyc2VjdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xpfSxudS5wcm90b3R5cGUuaGFzUHJvcGVySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Byb3Blcn0sbnUucHJvdG90eXBlLnByb2Nlc3NJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiZlPT09cilyZXR1cm4gbnVsbDt0aGlzLm51bVRlc3RzKys7dmFyIGk9dC5nZXRDb29yZGluYXRlcygpW2VdLG89dC5nZXRDb29yZGluYXRlcygpW2UrMV0scz1uLmdldENvb3JkaW5hdGVzKClbcl0sYT1uLmdldENvb3JkaW5hdGVzKClbcisxXTt0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKGksbyxzLGEpLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiYodGhpcy5udW1JbnRlcnNlY3Rpb25zKyssdGhpcy5fbGkuaXNJbnRlcmlvckludGVyc2VjdGlvbigpJiYodGhpcy5udW1JbnRlcmlvckludGVyc2VjdGlvbnMrKyx0aGlzLl9oYXNJbnRlcmlvcj0hMCksdGhpcy5pc1RyaXZpYWxJbnRlcnNlY3Rpb24odCxlLG4scil8fCh0aGlzLl9oYXNJbnRlcnNlY3Rpb249ITAsdC5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLGUsMCksbi5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLHIsMSksdGhpcy5fbGkuaXNQcm9wZXIoKSYmKHRoaXMubnVtUHJvcGVySW50ZXJzZWN0aW9ucysrLHRoaXMuX2hhc1Byb3Blcj0hMCx0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcj0hMCkpKX0sbnUucHJvdG90eXBlLmhhc0ludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNJbnRlcnNlY3Rpb259LG51LnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbnUucHJvdG90eXBlLmhhc0ludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc0ludGVyaW9yfSxudS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZXVdfSxudS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbnV9LG51LmlzQWRqYWNlbnRTZWdtZW50cz1mdW5jdGlvbih0LGUpe3JldHVybiAxPT09TWF0aC5hYnModC1lKX07dmFyIHJ1PWZ1bmN0aW9uKCl7dGhpcy5jb29yZD1udWxsLHRoaXMuc2VnbWVudEluZGV4PW51bGwsdGhpcy5kaXN0PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuY29vcmQ9bmV3IHZpKHQpLHRoaXMuc2VnbWVudEluZGV4PWUsdGhpcy5kaXN0PW59O3J1LnByb3RvdHlwZS5nZXRTZWdtZW50SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWdtZW50SW5kZXh9LHJ1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29vcmR9LHJ1LnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50KHRoaXMuY29vcmQpLHQucHJpbnQoIiBzZWcgIyA9ICIrdGhpcy5zZWdtZW50SW5kZXgpLHQucHJpbnRsbigiIGRpc3QgPSAiK3RoaXMuZGlzdCl9LHJ1LnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5jb21wYXJlKGUuc2VnbWVudEluZGV4LGUuZGlzdCl9LHJ1LnByb3RvdHlwZS5pc0VuZFBvaW50PWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy5zZWdtZW50SW5kZXgmJjA9PT10aGlzLmRpc3R8fHRoaXMuc2VnbWVudEluZGV4PT09dH0scnUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29vcmQrIiBzZWcgIyA9ICIrdGhpcy5zZWdtZW50SW5kZXgrIiBkaXN0ID0gIit0aGlzLmRpc3R9LHJ1LnByb3RvdHlwZS5nZXREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc3R9LHJ1LnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc2VnbWVudEluZGV4PHQ/LTE6dGhpcy5zZWdtZW50SW5kZXg+dD8xOnRoaXMuZGlzdDxlPy0xOnRoaXMuZGlzdD5lPzE6MH0scnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpXX0scnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHJ1fTt2YXIgaXU9ZnVuY3Rpb24oKXt0aGlzLl9ub2RlTWFwPW5ldyBrbyx0aGlzLmVkZ2U9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5lZGdlPXR9O2l1LnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50bG4oIkludGVyc2VjdGlvbnM6Iik7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLnByaW50KHQpfX0saXUucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVNYXAudmFsdWVzKCkuaXRlcmF0b3IoKX0saXUucHJvdG90eXBlLmFkZFNwbGl0RWRnZXM9ZnVuY3Rpb24odCl7dGhpcy5hZGRFbmRwb2ludHMoKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpLG49ZS5uZXh0KCk7ZS5oYXNOZXh0KCk7KXt2YXIgcj1lLm5leHQoKSxpPXRoaXMuY3JlYXRlU3BsaXRFZGdlKG4scik7dC5hZGQoaSksbj1yfX0saXUucHJvdG90eXBlLmFkZEVuZHBvaW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZS5wdHMubGVuZ3RoLTE7dGhpcy5hZGQodGhpcy5lZGdlLnB0c1swXSwwLDApLHRoaXMuYWRkKHRoaXMuZWRnZS5wdHNbdF0sdCwwKX0saXUucHJvdG90eXBlLmNyZWF0ZVNwbGl0RWRnZT1mdW5jdGlvbih0LGUpe3ZhciBuPWUuc2VnbWVudEluZGV4LXQuc2VnbWVudEluZGV4KzIscj10aGlzLmVkZ2UucHRzW2Uuc2VnbWVudEluZGV4XSxpPWUuZGlzdD4wfHwhZS5jb29yZC5lcXVhbHMyRChyKTtpfHxuLS07dmFyIG89bmV3IEFycmF5KG4pLmZpbGwobnVsbCkscz0wO29bcysrXT1uZXcgdmkodC5jb29yZCk7Zm9yKHZhciBhPXQuc2VnbWVudEluZGV4KzE7YTw9ZS5zZWdtZW50SW5kZXg7YSsrKW9bcysrXT10aGlzLmVkZ2UucHRzW2FdO3JldHVybiBpJiYob1tzXT1lLmNvb3JkKSxuZXcgY3UobyxuZXcganModGhpcy5lZGdlLl9sYWJlbCkpfSxpdS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgcnUodCxlLG4pLGk9dGhpcy5fbm9kZU1hcC5nZXQocik7cmV0dXJuIG51bGwhPT1pP2k6KHRoaXMuX25vZGVNYXAucHV0KHIscikscil9LGl1LnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7aWYoZS5uZXh0KCkuY29vcmQuZXF1YWxzKHQpKXJldHVybiEwfXJldHVybiExfSxpdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0saXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGl1fTt2YXIgb3U9ZnVuY3Rpb24oKXt9O291LnByb3RvdHlwZS5nZXRDaGFpblN0YXJ0SW5kaWNlcz1mdW5jdGlvbih0KXt2YXIgZT0wLG49bmV3IHhvO24uYWRkKG5ldyBOaShlKSk7ZG97dmFyIHI9dGhpcy5maW5kQ2hhaW5FbmQodCxlKTtuLmFkZChuZXcgTmkocikpLGU9cn13aGlsZShlPHQubGVuZ3RoLTEpO3JldHVybiBvdS50b0ludEFycmF5KG4pfSxvdS5wcm90b3R5cGUuZmluZENoYWluRW5kPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVdzLnF1YWRyYW50KHRbZV0sdFtlKzFdKSxyPWUrMTtyPHQubGVuZ3RoOyl7aWYoV3MucXVhZHJhbnQodFtyLTFdLHRbcl0pIT09bilicmVhaztyKyt9cmV0dXJuIHItMX0sb3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LG91LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBvdX0sb3UudG9JbnRBcnJheT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpLG49MDtuPGUubGVuZ3RoO24rKyllW25dPXQuZ2V0KG4pLmludFZhbHVlKCk7cmV0dXJuIGV9O3ZhciBzdT1mdW5jdGlvbigpe3RoaXMuZT1udWxsLHRoaXMucHRzPW51bGwsdGhpcy5zdGFydEluZGV4PW51bGwsdGhpcy5lbnYxPW5ldyBqaSx0aGlzLmVudjI9bmV3IGppO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmU9dCx0aGlzLnB0cz10LmdldENvb3JkaW5hdGVzKCk7dmFyIGU9bmV3IG91O3RoaXMuc3RhcnRJbmRleD1lLmdldENoYWluU3RhcnRJbmRpY2VzKHRoaXMucHRzKX07c3UucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzfSxzdS5wcm90b3R5cGUuZ2V0TWF4WD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnB0c1t0aGlzLnN0YXJ0SW5kZXhbdF1dLngsbj10aGlzLnB0c1t0aGlzLnN0YXJ0SW5kZXhbdCsxXV0ueDtyZXR1cm4gZT5uP2U6bn0sc3UucHJvdG90eXBlLmdldE1pblg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wdHNbdGhpcy5zdGFydEluZGV4W3RdXS54LG49dGhpcy5wdHNbdGhpcy5zdGFydEluZGV4W3QrMV1dLng7cmV0dXJuIGU8bj9lOm59LHN1LnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluPWZ1bmN0aW9uKCl7aWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXSxyPWFyZ3VtZW50c1szXTt0aGlzLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4odGhpcy5zdGFydEluZGV4W3RdLHRoaXMuc3RhcnRJbmRleFt0KzFdLGUsZS5zdGFydEluZGV4W25dLGUuc3RhcnRJbmRleFtuKzFdLHIpfWVsc2UgaWYoNj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1szXSx1PWFyZ3VtZW50c1s0XSxjPWFyZ3VtZW50c1s1XSxsPXRoaXMucHRzW2ldLGg9dGhpcy5wdHNbb10sZj1zLnB0c1thXSxwPXMucHRzW3VdO2lmKG8taT09MSYmdS1hPT0xKXJldHVybiBjLmFkZEludGVyc2VjdGlvbnModGhpcy5lLGkscy5lLGEpLG51bGw7aWYodGhpcy5lbnYxLmluaXQobCxoKSx0aGlzLmVudjIuaW5pdChmLHApLCF0aGlzLmVudjEuaW50ZXJzZWN0cyh0aGlzLmVudjIpKXJldHVybiBudWxsO3ZhciBkPU1hdGgudHJ1bmMoKGkrbykvMiksZz1NYXRoLnRydW5jKChhK3UpLzIpO2k8ZCYmKGE8ZyYmdGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKGksZCxzLGEsZyxjKSxnPHUmJnRoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbihpLGQscyxnLHUsYykpLGQ8byYmKGE8ZyYmdGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKGQsbyxzLGEsZyxjKSxnPHUmJnRoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbihkLG8scyxnLHUsYykpfX0sc3UucHJvdG90eXBlLmdldFN0YXJ0SW5kZXhlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0SW5kZXh9LHN1LnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dGhpcy5zdGFydEluZGV4Lmxlbmd0aC0xO24rKylmb3IodmFyIHI9MDtyPHQuc3RhcnRJbmRleC5sZW5ndGgtMTtyKyspdGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKG4sdCxyLGUpfSxzdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sc3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHN1fTt2YXIgYXU9ZnVuY3Rpb24gdCgpe3RoaXMuX2RlcHRoPUFycmF5KDIpLmZpbGwoKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5KDMpfSkpO2Zvcih2YXIgZT0wO2U8MjtlKyspZm9yKHZhciBuPTA7bjwzO24rKyl0aGlzLl9kZXB0aFtlXVtuXT10Lk5VTExfVkFMVUV9LHV1PXtOVUxMX1ZBTFVFOntjb25maWd1cmFibGU6ITB9fTthdS5wcm90b3R5cGUuZ2V0RGVwdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGVwdGhbdF1bZV19LGF1LnByb3RvdHlwZS5zZXREZXB0aD1mdW5jdGlvbih0LGUsbil7dGhpcy5fZGVwdGhbdF1bZV09bn0sYXUucHJvdG90eXBlLmlzTnVsbD1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIHQ9MDt0PDI7dCsrKWZvcih2YXIgZT0wO2U8MztlKyspaWYodGhpcy5fZGVwdGhbdF1bZV0hPT1hdS5OVUxMX1ZBTFVFKXJldHVybiExO3JldHVybiEwfWlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2RlcHRoW25dWzFdPT09YXUuTlVMTF9WQUxVRX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLl9kZXB0aFtyXVtpXT09PWF1Lk5VTExfVkFMVUV9fSxhdS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT0wO2U8MjtlKyspaWYoIXQuaXNOdWxsKGUpKXt2YXIgbj10Ll9kZXB0aFtlXVsxXTt0Ll9kZXB0aFtlXVsyXTxuJiYobj10Ll9kZXB0aFtlXVsyXSksbjwwJiYobj0wKTtmb3IodmFyIHI9MTtyPDM7cisrKXt2YXIgaT0wO3QuX2RlcHRoW2VdW3JdPm4mJihpPTEpLHQuX2RlcHRoW2VdW3JdPWl9fX0sYXUucHJvdG90eXBlLmdldERlbHRhPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kZXB0aFt0XVtGcy5SSUdIVF0tdGhpcy5fZGVwdGhbdF1bRnMuTEVGVF19LGF1LnByb3RvdHlwZS5nZXRMb2NhdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kZXB0aFt0XVtlXTw9MD9iaS5FWFRFUklPUjpiaS5JTlRFUklPUn0sYXUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkE6ICIrdGhpcy5fZGVwdGhbMF1bMV0rIiwiK3RoaXMuX2RlcHRoWzBdWzJdKyIgQjogIit0aGlzLl9kZXB0aFsxXVsxXSsiLCIrdGhpcy5fZGVwdGhbMV1bMl19LGF1LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgZT1hcmd1bWVudHNbMF0sbj0wO248MjtuKyspZm9yKHZhciByPTE7cjwzO3IrKyl7dmFyIGk9ZS5nZXRMb2NhdGlvbihuLHIpOyhpPT09YmkuRVhURVJJT1J8fGk9PT1iaS5JTlRFUklPUikmJih0LmlzTnVsbChuLHIpP3QuX2RlcHRoW25dW3JdPWF1LmRlcHRoQXRMb2NhdGlvbihpKTp0Ll9kZXB0aFtuXVtyXSs9YXUuZGVwdGhBdExvY2F0aW9uKGkpKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV07YXJndW1lbnRzWzJdPT09YmkuSU5URVJJT1ImJnRoaXMuX2RlcHRoW29dW3NdKyt9fSxhdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sYXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGF1fSxhdS5kZXB0aEF0TG9jYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1iaS5FWFRFUklPUj8wOnQ9PT1iaS5JTlRFUklPUj8xOmF1Lk5VTExfVkFMVUV9LHV1Lk5VTExfVkFMVUUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGF1LHV1KTt2YXIgY3U9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe2lmKHQuY2FsbCh0aGlzKSx0aGlzLnB0cz1udWxsLHRoaXMuX2Vudj1udWxsLHRoaXMuZWlMaXN0PW5ldyBpdSh0aGlzKSx0aGlzLl9uYW1lPW51bGwsdGhpcy5fbWNlPW51bGwsdGhpcy5faXNJc29sYXRlZD0hMCx0aGlzLl9kZXB0aD1uZXcgYXUsdGhpcy5fZGVwdGhEZWx0YT0wLDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF07ZS5jYWxsKHRoaXMsbixudWxsKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV07dGhpcy5wdHM9cix0aGlzLl9sYWJlbD1pfX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0RGVwdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVwdGh9LGUucHJvdG90eXBlLmdldENvbGxhcHNlZEVkZ2U9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQXJyYXkoMikuZmlsbChudWxsKTtyZXR1cm4gdFswXT10aGlzLnB0c1swXSx0WzFdPXRoaXMucHRzWzFdLG5ldyBlKHQsanMudG9MaW5lTGFiZWwodGhpcy5fbGFiZWwpKX0sZS5wcm90b3R5cGUuaXNJc29sYXRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0lzb2xhdGVkfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnB0c30sZS5wcm90b3R5cGUuc2V0SXNvbGF0ZWQ9ZnVuY3Rpb24odCl7dGhpcy5faXNJc29sYXRlZD10fSxlLnByb3RvdHlwZS5zZXROYW1lPWZ1bmN0aW9uKHQpe3RoaXMuX25hbWU9dH0sZS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXJldHVybiExO3ZhciBuPXQ7aWYodGhpcy5wdHMubGVuZ3RoIT09bi5wdHMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgcj0hMCxpPSEwLG89dGhpcy5wdHMubGVuZ3RoLHM9MDtzPHRoaXMucHRzLmxlbmd0aDtzKyspaWYodGhpcy5wdHNbc10uZXF1YWxzMkQobi5wdHNbc10pfHwocj0hMSksdGhpcy5wdHNbc10uZXF1YWxzMkQobi5wdHNbLS1vXSl8fChpPSExKSwhciYmIWkpcmV0dXJuITE7cmV0dXJuITB9LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5wdHMubGVuZ3RoPjA/dGhpcy5wdHNbMF06bnVsbDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnB0c1t0XX19LGUucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnQoImVkZ2UgIit0aGlzLl9uYW1lKyI6ICIpLHQucHJpbnQoIkxJTkVTVFJJTkcgKCIpO2Zvcih2YXIgZT0wO2U8dGhpcy5wdHMubGVuZ3RoO2UrKyllPjAmJnQucHJpbnQoIiwiKSx0LnByaW50KHRoaXMucHRzW2VdLngrIiAiK3RoaXMucHRzW2VdLnkpO3QucHJpbnQoIikgICIrdGhpcy5fbGFiZWwrIiAiK3RoaXMuX2RlcHRoRGVsdGEpfSxlLnByb3RvdHlwZS5jb21wdXRlSU09ZnVuY3Rpb24odCl7ZS51cGRhdGVJTSh0aGlzLl9sYWJlbCx0KX0sZS5wcm90b3R5cGUuaXNDb2xsYXBzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hKCF0aGlzLl9sYWJlbC5pc0FyZWEoKXx8MyE9PXRoaXMucHRzLmxlbmd0aCkmJiEhdGhpcy5wdHNbMF0uZXF1YWxzKHRoaXMucHRzWzJdKX0sZS5wcm90b3R5cGUuaXNDbG9zZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdHNbMF0uZXF1YWxzKHRoaXMucHRzW3RoaXMucHRzLmxlbmd0aC0xXSl9LGUucHJvdG90eXBlLmdldE1heGltdW1TZWdtZW50SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdHMubGVuZ3RoLTF9LGUucHJvdG90eXBlLmdldERlcHRoRGVsdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVwdGhEZWx0YX0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzLmxlbmd0aH0sZS5wcm90b3R5cGUucHJpbnRSZXZlcnNlPWZ1bmN0aW9uKHQpe3QucHJpbnQoImVkZ2UgIit0aGlzLl9uYW1lKyI6ICIpO2Zvcih2YXIgZT10aGlzLnB0cy5sZW5ndGgtMTtlPj0wO2UtLSl0LnByaW50KHRoaXMucHRzW2VdKyIgIik7dC5wcmludGxuKCIiKX0sZS5wcm90b3R5cGUuZ2V0TW9ub3RvbmVDaGFpbkVkZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuX21jZSYmKHRoaXMuX21jZT1uZXcgc3UodGhpcykpLHRoaXMuX21jZX0sZS5wcm90b3R5cGUuZ2V0RW52ZWxvcGU9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fZW52KXt0aGlzLl9lbnY9bmV3IGppO2Zvcih2YXIgdD0wO3Q8dGhpcy5wdHMubGVuZ3RoO3QrKyl0aGlzLl9lbnYuZXhwYW5kVG9JbmNsdWRlKHRoaXMucHRzW3RdKX1yZXR1cm4gdGhpcy5fZW52fSxlLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bmV3IHZpKHQuZ2V0SW50ZXJzZWN0aW9uKHIpKSxvPWUscz10LmdldEVkZ2VEaXN0YW5jZShuLHIpLGE9bysxO2lmKGE8dGhpcy5wdHMubGVuZ3RoKXt2YXIgdT10aGlzLnB0c1thXTtpLmVxdWFsczJEKHUpJiYobz1hLHM9MCl9dGhpcy5laUxpc3QuYWRkKGksbyxzKX0sZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQWk7dC5hcHBlbmQoImVkZ2UgIit0aGlzLl9uYW1lKyI6ICIpLHQuYXBwZW5kKCJMSU5FU1RSSU5HICgiKTtmb3IodmFyIGU9MDtlPHRoaXMucHRzLmxlbmd0aDtlKyspZT4wJiZ0LmFwcGVuZCgiLCIpLHQuYXBwZW5kKHRoaXMucHRzW2VdLngrIiAiK3RoaXMucHRzW2VdLnkpO3JldHVybiB0LmFwcGVuZCgiKSAgIit0aGlzLl9sYWJlbCsiICIrdGhpcy5fZGVwdGhEZWx0YSksdC50b1N0cmluZygpfSxlLnByb3RvdHlwZS5pc1BvaW50d2lzZUVxdWFsPWZ1bmN0aW9uKHQpe2lmKHRoaXMucHRzLmxlbmd0aCE9PXQucHRzLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGU9MDtlPHRoaXMucHRzLmxlbmd0aDtlKyspaWYoIXRoaXMucHRzW2VdLmVxdWFsczJEKHQucHRzW2VdKSlyZXR1cm4hMTtyZXR1cm4hMH0sZS5wcm90b3R5cGUuc2V0RGVwdGhEZWx0YT1mdW5jdGlvbih0KXt0aGlzLl9kZXB0aERlbHRhPXR9LGUucHJvdG90eXBlLmdldEVkZ2VJbnRlcnNlY3Rpb25MaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWlMaXN0fSxlLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MDtyPHQuZ2V0SW50ZXJzZWN0aW9uTnVtKCk7cisrKXRoaXMuYWRkSW50ZXJzZWN0aW9uKHQsZSxuLHIpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLnVwZGF0ZUlNPWZ1bmN0aW9uKCl7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQucHJvdG90eXBlLnVwZGF0ZUlNLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07bi5zZXRBdExlYXN0SWZWYWxpZChlLmdldExvY2F0aW9uKDAsRnMuT04pLGUuZ2V0TG9jYXRpb24oMSxGcy5PTiksMSksZS5pc0FyZWEoKSYmKG4uc2V0QXRMZWFzdElmVmFsaWQoZS5nZXRMb2NhdGlvbigwLEZzLkxFRlQpLGUuZ2V0TG9jYXRpb24oMSxGcy5MRUZUKSwyKSxuLnNldEF0TGVhc3RJZlZhbGlkKGUuZ2V0TG9jYXRpb24oMCxGcy5SSUdIVCksZS5nZXRMb2NhdGlvbigxLEZzLlJJR0hUKSwyKSl9LGV9KEdzKSxsdT1mdW5jdGlvbih0KXt0aGlzLl93b3JraW5nUHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl93b3JraW5nTm9kZXI9bnVsbCx0aGlzLl9nZW9tRmFjdD1udWxsLHRoaXMuX2dyYXBoPW51bGwsdGhpcy5fZWRnZUxpc3Q9bmV3IHR1LHRoaXMuX2J1ZlBhcmFtcz10fHxudWxsfTtsdS5wcm90b3R5cGUuc2V0V29ya2luZ1ByZWNpc2lvbk1vZGVsPWZ1bmN0aW9uKHQpe3RoaXMuX3dvcmtpbmdQcmVjaXNpb25Nb2RlbD10fSxsdS5wcm90b3R5cGUuaW5zZXJ0VW5pcXVlRWRnZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9lZGdlTGlzdC5maW5kRXF1YWxFZGdlKHQpO2lmKG51bGwhPT1lKXt2YXIgbj1lLmdldExhYmVsKCkscj10LmdldExhYmVsKCk7ZS5pc1BvaW50d2lzZUVxdWFsKHQpfHwocj1uZXcganModC5nZXRMYWJlbCgpKSkuZmxpcCgpLG4ubWVyZ2Uocik7dmFyIGk9bHUuZGVwdGhEZWx0YShyKSxvPWUuZ2V0RGVwdGhEZWx0YSgpK2k7ZS5zZXREZXB0aERlbHRhKG8pfWVsc2UgdGhpcy5fZWRnZUxpc3QuYWRkKHQpLHQuc2V0RGVwdGhEZWx0YShsdS5kZXB0aERlbHRhKHQuZ2V0TGFiZWwoKSkpfSxsdS5wcm90b3R5cGUuYnVpbGRTdWJncmFwaHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IHhvLHI9dC5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCksbz1pLmdldFJpZ2h0bW9zdENvb3JkaW5hdGUoKSxzPW5ldyBxYShuKS5nZXREZXB0aChvKTtpLmNvbXB1dGVEZXB0aChzKSxpLmZpbmRSZXN1bHRFZGdlcygpLG4uYWRkKGkpLGUuYWRkKGkuZ2V0RGlyZWN0ZWRFZGdlcygpLGkuZ2V0Tm9kZXMoKSl9fSxsdS5wcm90b3R5cGUuY3JlYXRlU3ViZ3JhcGhzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj10LmdldE5vZGVzKCkuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2lmKCFyLmlzVmlzaXRlZCgpKXt2YXIgaT1uZXcga3M7aS5jcmVhdGUociksZS5hZGQoaSl9fXJldHVybiBhYS5zb3J0KGUsYWEucmV2ZXJzZU9yZGVyKCkpLGV9LGx1LnByb3RvdHlwZS5jcmVhdGVFbXB0eVJlc3VsdEdlb21ldHJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dlb21GYWN0LmNyZWF0ZVBvbHlnb24oKX0sbHUucHJvdG90eXBlLmdldE5vZGVyPWZ1bmN0aW9uKHQpe2lmKG51bGwhPT10aGlzLl93b3JraW5nTm9kZXIpcmV0dXJuIHRoaXMuX3dvcmtpbmdOb2Rlcjt2YXIgZT1uZXcgSWEsbj1uZXcgUWk7cmV0dXJuIG4uc2V0UHJlY2lzaW9uTW9kZWwodCksZS5zZXRTZWdtZW50SW50ZXJzZWN0b3IobmV3IG51KG4pKSxlfSxsdS5wcm90b3R5cGUuYnVmZmVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fd29ya2luZ1ByZWNpc2lvbk1vZGVsO251bGw9PT1uJiYobj10LmdldFByZWNpc2lvbk1vZGVsKCkpLHRoaXMuX2dlb21GYWN0PXQuZ2V0RmFjdG9yeSgpO3ZhciByPW5ldyBVYShuLHRoaXMuX2J1ZlBhcmFtcyksaT1uZXcgWGEodCxlLHIpLmdldEN1cnZlcygpO2lmKGkuc2l6ZSgpPD0wKXJldHVybiB0aGlzLmNyZWF0ZUVtcHR5UmVzdWx0R2VvbWV0cnkoKTt0aGlzLmNvbXB1dGVOb2RlZEVkZ2VzKGksbiksdGhpcy5fZ3JhcGg9bmV3IFFzKG5ldyBRYSksdGhpcy5fZ3JhcGguYWRkRWRnZXModGhpcy5fZWRnZUxpc3QuZ2V0RWRnZXMoKSk7dmFyIG89dGhpcy5jcmVhdGVTdWJncmFwaHModGhpcy5fZ3JhcGgpLHM9bmV3ICRzKHRoaXMuX2dlb21GYWN0KTt0aGlzLmJ1aWxkU3ViZ3JhcGhzKG8scyk7dmFyIGE9cy5nZXRQb2x5Z29ucygpO3JldHVybiBhLnNpemUoKTw9MD90aGlzLmNyZWF0ZUVtcHR5UmVzdWx0R2VvbWV0cnkoKTp0aGlzLl9nZW9tRmFjdC5idWlsZEdlb21ldHJ5KGEpfSxsdS5wcm90b3R5cGUuY29tcHV0ZU5vZGVkRWRnZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldE5vZGVyKGUpO24uY29tcHV0ZU5vZGVzKHQpO2Zvcih2YXIgcj1uLmdldE5vZGVkU3Vic3RyaW5ncygpLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKSxvPWkuZ2V0Q29vcmRpbmF0ZXMoKTtpZigyIT09by5sZW5ndGh8fCFvWzBdLmVxdWFsczJEKG9bMV0pKXt2YXIgcz1pLmdldERhdGEoKSxhPW5ldyBjdShpLmdldENvb3JkaW5hdGVzKCksbmV3IGpzKHMpKTt0aGlzLmluc2VydFVuaXF1ZUVkZ2UoYSl9fX0sbHUucHJvdG90eXBlLnNldE5vZGVyPWZ1bmN0aW9uKHQpe3RoaXMuX3dvcmtpbmdOb2Rlcj10fSxsdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGx1fSxsdS5kZXB0aERlbHRhPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0TG9jYXRpb24oMCxGcy5MRUZUKSxuPXQuZ2V0TG9jYXRpb24oMCxGcy5SSUdIVCk7cmV0dXJuIGU9PT1iaS5JTlRFUklPUiYmbj09PWJpLkVYVEVSSU9SPzE6ZT09PWJpLkVYVEVSSU9SJiZuPT09YmkuSU5URVJJT1I/LTE6MH0sbHUuY29udmVydFNlZ1N0cmluZ3M9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBJcyxuPW5ldyB4bzt0Lmhhc05leHQoKTspe3ZhciByPXQubmV4dCgpLGk9ZS5jcmVhdGVMaW5lU3RyaW5nKHIuZ2V0Q29vcmRpbmF0ZXMoKSk7bi5hZGQoaSl9cmV0dXJuIGUuYnVpbGRHZW9tZXRyeShuKX07dmFyIGh1PWZ1bmN0aW9uKCl7aWYodGhpcy5fbm9kZXI9bnVsbCx0aGlzLl9zY2FsZUZhY3Rvcj1udWxsLHRoaXMuX29mZnNldFg9bnVsbCx0aGlzLl9vZmZzZXRZPW51bGwsdGhpcy5faXNTY2FsZWQ9ITEsMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9ub2Rlcj10LHRoaXMuX3NjYWxlRmFjdG9yPWUsdGhpcy5fb2Zmc2V0WD0wLHRoaXMuX29mZnNldFk9MCx0aGlzLl9pc1NjYWxlZD0hdGhpcy5pc0ludGVnZXJQcmVjaXNpb24oKX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl0sbz1hcmd1bWVudHNbM107dGhpcy5fbm9kZXI9bix0aGlzLl9zY2FsZUZhY3Rvcj1yLHRoaXMuX29mZnNldFg9aSx0aGlzLl9vZmZzZXRZPW8sdGhpcy5faXNTY2FsZWQ9IXRoaXMuaXNJbnRlZ2VyUHJlY2lzaW9uKCl9fTtodS5wcm90b3R5cGUucmVzY2FsZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoRWkoYXJndW1lbnRzWzBdLGdvKSlmb3IodmFyIGU9YXJndW1lbnRzWzBdLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0LnJlc2NhbGUobi5nZXRDb29yZGluYXRlcygpKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe2Zvcih2YXIgcj1hcmd1bWVudHNbMF0saT0wO2k8ci5sZW5ndGg7aSsrKXJbaV0ueD1yW2ldLngvdC5fc2NhbGVGYWN0b3IrdC5fb2Zmc2V0WCxyW2ldLnk9cltpXS55L3QuX3NjYWxlRmFjdG9yK3QuX29mZnNldFk7Mj09PXIubGVuZ3RoJiZyWzBdLmVxdWFsczJEKHJbMV0pJiZraS5vdXQucHJpbnRsbihyKX19LGh1LnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoRWkoYXJndW1lbnRzWzBdLGdvKSl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPW5ldyB4byxyPWUuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO24uYWRkKG5ldyB3YSh0LnNjYWxlKGkuZ2V0Q29vcmRpbmF0ZXMoKSksaS5nZXREYXRhKCkpKX1yZXR1cm4gbn1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIG89YXJndW1lbnRzWzBdLHM9bmV3IEFycmF5KG8ubGVuZ3RoKS5maWxsKG51bGwpLGE9MDthPG8ubGVuZ3RoO2ErKylzW2FdPW5ldyB2aShNYXRoLnJvdW5kKChvW2FdLngtdC5fb2Zmc2V0WCkqdC5fc2NhbGVGYWN0b3IpLE1hdGgucm91bmQoKG9bYV0ueS10Ll9vZmZzZXRZKSp0Ll9zY2FsZUZhY3Rvciksb1thXS56KTtyZXR1cm4gRG8ucmVtb3ZlUmVwZWF0ZWRQb2ludHMocyl9fSxodS5wcm90b3R5cGUuaXNJbnRlZ2VyUHJlY2lzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLl9zY2FsZUZhY3Rvcn0saHUucHJvdG90eXBlLmdldE5vZGVkU3Vic3RyaW5ncz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX25vZGVyLmdldE5vZGVkU3Vic3RyaW5ncygpO3JldHVybiB0aGlzLl9pc1NjYWxlZCYmdGhpcy5yZXNjYWxlKHQpLHR9LGh1LnByb3RvdHlwZS5jb21wdXRlTm9kZXM9ZnVuY3Rpb24odCl7dmFyIGU9dDt0aGlzLl9pc1NjYWxlZCYmKGU9dGhpcy5zY2FsZSh0KSksdGhpcy5fbm9kZXIuY29tcHV0ZU5vZGVzKGUpfSxodS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bQWFdfSxodS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaHV9O3ZhciBmdT1mdW5jdGlvbigpe3RoaXMuX2xpPW5ldyBRaSx0aGlzLl9zZWdTdHJpbmdzPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX3NlZ1N0cmluZ3M9dH0scHU9e2ZhY3Q6e2NvbmZpZ3VyYWJsZTohMH19O2Z1LnByb3RvdHlwZS5jaGVja0VuZFB0VmVydGV4SW50ZXJzZWN0aW9ucz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBlPXRoaXMuX3NlZ1N0cmluZ3MuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLmdldENvb3JkaW5hdGVzKCk7dC5jaGVja0VuZFB0VmVydGV4SW50ZXJzZWN0aW9ucyhuWzBdLHQuX3NlZ1N0cmluZ3MpLHQuY2hlY2tFbmRQdFZlcnRleEludGVyc2VjdGlvbnMobltuLmxlbmd0aC0xXSx0Ll9zZWdTdHJpbmdzKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0uaXRlcmF0b3IoKTtpLmhhc05leHQoKTspZm9yKHZhciBvPWkubmV4dCgpLmdldENvb3JkaW5hdGVzKCkscz0xO3M8by5sZW5ndGgtMTtzKyspaWYob1tzXS5lcXVhbHMocikpdGhyb3cgbmV3IFdpKCJmb3VuZCBlbmRwdC9pbnRlcmlvciBwdCBpbnRlcnNlY3Rpb24gYXQgaW5kZXggIitzKyIgOnB0ICIrcil9LGZ1LnByb3RvdHlwZS5jaGVja0ludGVyaW9ySW50ZXJzZWN0aW9ucz1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgdD10aGlzLl9zZWdTdHJpbmdzLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KWZvcih2YXIgZT10Lm5leHQoKSxuPXRoaXMuX3NlZ1N0cmluZ3MuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3RoaXMuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnMoZSxyKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1pLmdldENvb3JkaW5hdGVzKCksYT1vLmdldENvb3JkaW5hdGVzKCksdT0wO3U8cy5sZW5ndGgtMTt1KyspZm9yKHZhciBjPTA7YzxhLmxlbmd0aC0xO2MrKyl0aGlzLmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zKGksdSxvLGMpO2Vsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBsPWFyZ3VtZW50c1swXSxoPWFyZ3VtZW50c1sxXSxmPWFyZ3VtZW50c1syXSxwPWFyZ3VtZW50c1szXTtpZihsPT09ZiYmaD09PXApcmV0dXJuIG51bGw7dmFyIGQ9bC5nZXRDb29yZGluYXRlcygpW2hdLGc9bC5nZXRDb29yZGluYXRlcygpW2grMV0seT1mLmdldENvb3JkaW5hdGVzKClbcF0sbT1mLmdldENvb3JkaW5hdGVzKClbcCsxXTtpZih0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKGQsZyx5LG0pLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiYodGhpcy5fbGkuaXNQcm9wZXIoKXx8dGhpcy5oYXNJbnRlcmlvckludGVyc2VjdGlvbih0aGlzLl9saSxkLGcpfHx0aGlzLmhhc0ludGVyaW9ySW50ZXJzZWN0aW9uKHRoaXMuX2xpLHksbSkpKXRocm93IG5ldyBXaSgiZm91bmQgbm9uLW5vZGVkIGludGVyc2VjdGlvbiBhdCAiK2QrIi0iK2crIiBhbmQgIit5KyItIittKX19LGZ1LnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKCl7dGhpcy5jaGVja0VuZFB0VmVydGV4SW50ZXJzZWN0aW9ucygpLHRoaXMuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnMoKSx0aGlzLmNoZWNrQ29sbGFwc2VzKCl9LGZ1LnByb3RvdHlwZS5jaGVja0NvbGxhcHNlcz1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgdD10aGlzLl9zZWdTdHJpbmdzLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKTt0aGlzLmNoZWNrQ29sbGFwc2VzKGUpfWVsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBuPWFyZ3VtZW50c1swXS5nZXRDb29yZGluYXRlcygpLHI9MDtyPG4ubGVuZ3RoLTI7cisrKXRoaXMuY2hlY2tDb2xsYXBzZShuW3JdLG5bcisxXSxuW3IrMl0pfSxmdS5wcm90b3R5cGUuaGFzSW50ZXJpb3JJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0wO3I8dC5nZXRJbnRlcnNlY3Rpb25OdW0oKTtyKyspe3ZhciBpPXQuZ2V0SW50ZXJzZWN0aW9uKHIpO2lmKCFpLmVxdWFscyhlKSYmIWkuZXF1YWxzKG4pKXJldHVybiEwfXJldHVybiExfSxmdS5wcm90b3R5cGUuY2hlY2tDb2xsYXBzZT1mdW5jdGlvbih0LGUsbil7aWYodC5lcXVhbHMobikpdGhyb3cgbmV3IFdpKCJmb3VuZCBub24tbm9kZWQgY29sbGFwc2UgYXQgIitmdS5mYWN0LmNyZWF0ZUxpbmVTdHJpbmcoW3QsZSxuXSkpfSxmdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1fSxwdS5mYWN0LmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgSXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGZ1LHB1KTt2YXIgZHU9ZnVuY3Rpb24oKXt0aGlzLl9saT1udWxsLHRoaXMuX3B0PW51bGwsdGhpcy5fb3JpZ2luYWxQdD1udWxsLHRoaXMuX3B0U2NhbGVkPW51bGwsdGhpcy5fcDBTY2FsZWQ9bnVsbCx0aGlzLl9wMVNjYWxlZD1udWxsLHRoaXMuX3NjYWxlRmFjdG9yPW51bGwsdGhpcy5fbWlueD1udWxsLHRoaXMuX21heHg9bnVsbCx0aGlzLl9taW55PW51bGwsdGhpcy5fbWF4eT1udWxsLHRoaXMuX2Nvcm5lcj1uZXcgQXJyYXkoNCkuZmlsbChudWxsKSx0aGlzLl9zYWZlRW52PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO2lmKHRoaXMuX29yaWdpbmFsUHQ9dCx0aGlzLl9wdD10LHRoaXMuX3NjYWxlRmFjdG9yPWUsdGhpcy5fbGk9bixlPD0wKXRocm93IG5ldyBoaTsxIT09ZSYmKHRoaXMuX3B0PW5ldyB2aSh0aGlzLnNjYWxlKHQueCksdGhpcy5zY2FsZSh0LnkpKSx0aGlzLl9wMFNjYWxlZD1uZXcgdmksdGhpcy5fcDFTY2FsZWQ9bmV3IHZpKSx0aGlzLmluaXRDb3JuZXJzKHRoaXMuX3B0KX0sZ3U9e1NBRkVfRU5WX0VYUEFOU0lPTl9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH19O2R1LnByb3RvdHlwZS5pbnRlcnNlY3RzU2NhbGVkPWZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5taW4odC54LGUueCkscj1NYXRoLm1heCh0LngsZS54KSxpPU1hdGgubWluKHQueSxlLnkpLG89TWF0aC5tYXgodC55LGUueSkscz10aGlzLl9tYXh4PG58fHRoaXMuX21pbng+cnx8dGhpcy5fbWF4eTxpfHx0aGlzLl9taW55Pm87aWYocylyZXR1cm4hMTt2YXIgYT10aGlzLmludGVyc2VjdHNUb2xlcmFuY2VTcXVhcmUodCxlKTtyZXR1cm4gWmkuaXNUcnVlKCEocyYmYSksIkZvdW5kIGJhZCBlbnZlbG9wZSB0ZXN0IiksYX0sZHUucHJvdG90eXBlLmluaXRDb3JuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlPS41O3RoaXMuX21pbng9dC54LWUsdGhpcy5fbWF4eD10LngrZSx0aGlzLl9taW55PXQueS1lLHRoaXMuX21heHk9dC55K2UsdGhpcy5fY29ybmVyWzBdPW5ldyB2aSh0aGlzLl9tYXh4LHRoaXMuX21heHkpLHRoaXMuX2Nvcm5lclsxXT1uZXcgdmkodGhpcy5fbWlueCx0aGlzLl9tYXh5KSx0aGlzLl9jb3JuZXJbMl09bmV3IHZpKHRoaXMuX21pbngsdGhpcy5fbWlueSksdGhpcy5fY29ybmVyWzNdPW5ldyB2aSh0aGlzLl9tYXh4LHRoaXMuX21pbnkpfSxkdS5wcm90b3R5cGUuaW50ZXJzZWN0cz1mdW5jdGlvbih0LGUpe3JldHVybiAxPT09dGhpcy5fc2NhbGVGYWN0b3I/dGhpcy5pbnRlcnNlY3RzU2NhbGVkKHQsZSk6KHRoaXMuY29weVNjYWxlZCh0LHRoaXMuX3AwU2NhbGVkKSx0aGlzLmNvcHlTY2FsZWQoZSx0aGlzLl9wMVNjYWxlZCksdGhpcy5pbnRlcnNlY3RzU2NhbGVkKHRoaXMuX3AwU2NhbGVkLHRoaXMuX3AxU2NhbGVkKSl9LGR1LnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KnRoaXMuX3NjYWxlRmFjdG9yKX0sZHUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZ2luYWxQdH0sZHUucHJvdG90eXBlLmNvcHlTY2FsZWQ9ZnVuY3Rpb24odCxlKXtlLng9dGhpcy5zY2FsZSh0LngpLGUueT10aGlzLnNjYWxlKHQueSl9LGR1LnByb3RvdHlwZS5nZXRTYWZlRW52ZWxvcGU9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fc2FmZUVudil7dmFyIHQ9ZHUuU0FGRV9FTlZfRVhQQU5TSU9OX0ZBQ1RPUi90aGlzLl9zY2FsZUZhY3Rvcjt0aGlzLl9zYWZlRW52PW5ldyBqaSh0aGlzLl9vcmlnaW5hbFB0LngtdCx0aGlzLl9vcmlnaW5hbFB0LngrdCx0aGlzLl9vcmlnaW5hbFB0LnktdCx0aGlzLl9vcmlnaW5hbFB0LnkrdCl9cmV0dXJuIHRoaXMuX3NhZmVFbnZ9LGR1LnByb3RvdHlwZS5pbnRlcnNlY3RzUGl4ZWxDbG9zdXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclswXSx0aGlzLl9jb3JuZXJbMV0pLCEhKHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpfHwodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzFdLHRoaXMuX2Nvcm5lclsyXSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkpfHwodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzJdLHRoaXMuX2Nvcm5lclszXSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkpfHwodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzNdLHRoaXMuX2Nvcm5lclswXSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkpKX0sZHUucHJvdG90eXBlLmludGVyc2VjdHNUb2xlcmFuY2VTcXVhcmU9ZnVuY3Rpb24odCxlKXt2YXIgbj0hMSxyPSExO3JldHVybiB0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMF0sdGhpcy5fY29ybmVyWzFdKSwhISh0aGlzLl9saS5pc1Byb3BlcigpfHwodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzFdLHRoaXMuX2Nvcm5lclsyXSksdGhpcy5fbGkuaXNQcm9wZXIoKSl8fCh0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSYmKG49ITApLHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclsyXSx0aGlzLl9jb3JuZXJbM10pLHRoaXMuX2xpLmlzUHJvcGVyKCkpfHwodGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJihyPSEwKSx0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbM10sdGhpcy5fY29ybmVyWzBdKSx0aGlzLl9saS5pc1Byb3BlcigpKXx8biYmcnx8dC5lcXVhbHModGhpcy5fcHQpfHxlLmVxdWFscyh0aGlzLl9wdCkpfSxkdS5wcm90b3R5cGUuYWRkU25hcHBlZE5vZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldENvb3JkaW5hdGUoZSkscj10LmdldENvb3JkaW5hdGUoZSsxKTtyZXR1cm4hIXRoaXMuaW50ZXJzZWN0cyhuLHIpJiYodC5hZGRJbnRlcnNlY3Rpb24odGhpcy5nZXRDb29yZGluYXRlKCksZSksITApfSxkdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGR1fSxndS5TQUZFX0VOVl9FWFBBTlNJT05fRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybi43NX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZHUsZ3UpO3ZhciB5dT1mdW5jdGlvbigpe3RoaXMudGVtcEVudjE9bmV3IGppLHRoaXMuc2VsZWN0ZWRTZWdtZW50PW5ldyBiYX07eXUucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbigpe2lmKDEhPT1hcmd1bWVudHMubGVuZ3RoJiYyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzFdO2FyZ3VtZW50c1swXS5nZXRMaW5lU2VnbWVudCh0LHRoaXMuc2VsZWN0ZWRTZWdtZW50KSx0aGlzLnNlbGVjdCh0aGlzLnNlbGVjdGVkU2VnbWVudCl9fSx5dS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0seXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHl1fTt2YXIgbXU9ZnVuY3Rpb24oKXt0aGlzLl9pbmRleD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9pbmRleD10fSx2dT17SG90UGl4ZWxTbmFwQWN0aW9uOntjb25maWd1cmFibGU6ITB9fTttdS5wcm90b3R5cGUuc25hcD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc25hcCh0LG51bGwsLTEpfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl0saT1lLmdldFNhZmVFbnZlbG9wZSgpLG89bmV3IF91KGUsbixyKTtyZXR1cm4gdGhpcy5faW5kZXgucXVlcnkoaSx7aW50ZXJmYWNlc186ZnVuY3Rpb24oKXtyZXR1cm5bcmFdfSx2aXNpdEl0ZW06ZnVuY3Rpb24odCl7dC5zZWxlY3QoaSxvKX19KSxvLmlzTm9kZUFkZGVkKCl9fSxtdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG11fSx2dS5Ib3RQaXhlbFNuYXBBY3Rpb24uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIF91fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhtdSx2dSk7dmFyIF91PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5faG90UGl4ZWw9bnVsbCx0aGlzLl9wYXJlbnRFZGdlPW51bGwsdGhpcy5faG90UGl4ZWxWZXJ0ZXhJbmRleD1udWxsLHRoaXMuX2lzTm9kZUFkZGVkPSExO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTt0aGlzLl9ob3RQaXhlbD1lLHRoaXMuX3BhcmVudEVkZ2U9bix0aGlzLl9ob3RQaXhlbFZlcnRleEluZGV4PXJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmlzTm9kZUFkZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzTm9kZUFkZGVkfSxlLnByb3RvdHlwZS5zZWxlY3Q9ZnVuY3Rpb24oKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUuc2VsZWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMF0uZ2V0Q29udGV4dCgpO2lmKG51bGwhPT10aGlzLl9wYXJlbnRFZGdlJiZuPT09dGhpcy5fcGFyZW50RWRnZSYmZT09PXRoaXMuX2hvdFBpeGVsVmVydGV4SW5kZXgpcmV0dXJuIG51bGw7dGhpcy5faXNOb2RlQWRkZWQ9dGhpcy5faG90UGl4ZWwuYWRkU25hcHBlZE5vZGUobixlKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oeXUpLHh1PWZ1bmN0aW9uKCl7dGhpcy5fbGk9bnVsbCx0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbnM9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbGk9dCx0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbnM9bmV3IHhvfTt4dS5wcm90b3R5cGUucHJvY2Vzc0ludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4scil7aWYodD09PW4mJmU9PT1yKXJldHVybiBudWxsO3ZhciBpPXQuZ2V0Q29vcmRpbmF0ZXMoKVtlXSxvPXQuZ2V0Q29vcmRpbmF0ZXMoKVtlKzFdLHM9bi5nZXRDb29yZGluYXRlcygpW3JdLGE9bi5nZXRDb29yZGluYXRlcygpW3IrMV07aWYodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbihpLG8scyxhKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSYmdGhpcy5fbGkuaXNJbnRlcmlvckludGVyc2VjdGlvbigpKXtmb3IodmFyIHU9MDt1PHRoaXMuX2xpLmdldEludGVyc2VjdGlvbk51bSgpO3UrKyl0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbnMuYWRkKHRoaXMuX2xpLmdldEludGVyc2VjdGlvbih1KSk7dC5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLGUsMCksbi5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLHIsMSl9fSx4dS5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuITF9LHh1LnByb3RvdHlwZS5nZXRJbnRlcmlvckludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb25zfSx4dS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZXVdfSx4dS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geHV9O3ZhciB3dT1mdW5jdGlvbigpe3RoaXMuX3BtPW51bGwsdGhpcy5fbGk9bnVsbCx0aGlzLl9zY2FsZUZhY3Rvcj1udWxsLHRoaXMuX25vZGVyPW51bGwsdGhpcy5fcG9pbnRTbmFwcGVyPW51bGwsdGhpcy5fbm9kZWRTZWdTdHJpbmdzPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX3BtPXQsdGhpcy5fbGk9bmV3IFFpLHRoaXMuX2xpLnNldFByZWNpc2lvbk1vZGVsKHQpLHRoaXMuX3NjYWxlRmFjdG9yPXQuZ2V0U2NhbGUoKX07d3UucHJvdG90eXBlLmNoZWNrQ29ycmVjdG5lc3M9ZnVuY3Rpb24odCl7dmFyIGU9d2EuZ2V0Tm9kZWRTdWJzdHJpbmdzKHQpLG49bmV3IGZ1KGUpO3RyeXtuLmNoZWNrVmFsaWQoKX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBSaSkpdGhyb3cgdDt0LnByaW50U3RhY2tUcmFjZSgpfX0sd3UucHJvdG90eXBlLmdldE5vZGVkU3Vic3RyaW5ncz1mdW5jdGlvbigpe3JldHVybiB3YS5nZXROb2RlZFN1YnN0cmluZ3ModGhpcy5fbm9kZWRTZWdTdHJpbmdzKX0sd3UucHJvdG90eXBlLnNuYXBSb3VuZD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZmluZEludGVyaW9ySW50ZXJzZWN0aW9ucyh0LGUpO3RoaXMuY29tcHV0ZUludGVyc2VjdGlvblNuYXBzKG4pLHRoaXMuY29tcHV0ZVZlcnRleFNuYXBzKHQpfSx3dS5wcm90b3R5cGUuZmluZEludGVyaW9ySW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyB4dShlKTtyZXR1cm4gdGhpcy5fbm9kZXIuc2V0U2VnbWVudEludGVyc2VjdG9yKG4pLHRoaXMuX25vZGVyLmNvbXB1dGVOb2Rlcyh0KSxuLmdldEludGVyaW9ySW50ZXJzZWN0aW9ucygpfSx3dS5wcm90b3R5cGUuY29tcHV0ZVZlcnRleFNuYXBzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihFaShhcmd1bWVudHNbMF0sZ28pKWZvcih2YXIgZT1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3QuY29tcHV0ZVZlcnRleFNuYXBzKG4pfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB3YSlmb3IodmFyIHI9YXJndW1lbnRzWzBdLGk9ci5nZXRDb29yZGluYXRlcygpLG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIHM9bmV3IGR1KGlbb10sdC5fc2NhbGVGYWN0b3IsdC5fbGkpO3QuX3BvaW50U25hcHBlci5zbmFwKHMscixvKSYmci5hZGRJbnRlcnNlY3Rpb24oaVtvXSxvKX19LHd1LnByb3RvdHlwZS5jb21wdXRlTm9kZXM9ZnVuY3Rpb24odCl7dGhpcy5fbm9kZWRTZWdTdHJpbmdzPXQsdGhpcy5fbm9kZXI9bmV3IElhLHRoaXMuX3BvaW50U25hcHBlcj1uZXcgbXUodGhpcy5fbm9kZXIuZ2V0SW5kZXgoKSksdGhpcy5zbmFwUm91bmQodCx0aGlzLl9saSl9LHd1LnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0aW9uU25hcHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKSxpPW5ldyBkdShyLGUuX3NjYWxlRmFjdG9yLGUuX2xpKTtlLl9wb2ludFNuYXBwZXIuc25hcChpKX19LHd1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltBYV19LHd1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB3dX07dmFyIGJ1PWZ1bmN0aW9uKCl7aWYodGhpcy5fYXJnR2VvbT1udWxsLHRoaXMuX2Rpc3RhbmNlPW51bGwsdGhpcy5fYnVmUGFyYW1zPW5ldyBGYSx0aGlzLl9yZXN1bHRHZW9tZXRyeT1udWxsLHRoaXMuX3NhdmVFeGNlcHRpb249bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2FyZ0dlb209dH1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5fYXJnR2VvbT1lLHRoaXMuX2J1ZlBhcmFtcz1ufX0sRHU9e0NBUF9ST1VORDp7Y29uZmlndXJhYmxlOiEwfSxDQVBfQlVUVDp7Y29uZmlndXJhYmxlOiEwfSxDQVBfRkxBVDp7Y29uZmlndXJhYmxlOiEwfSxDQVBfU1FVQVJFOntjb25maWd1cmFibGU6ITB9LE1BWF9QUkVDSVNJT05fRElHSVRTOntjb25maWd1cmFibGU6ITB9fTtidS5wcm90b3R5cGUuYnVmZmVyRml4ZWRQcmVjaXNpb249ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGh1KG5ldyB3dShuZXcgQ3MoMSkpLHQuZ2V0U2NhbGUoKSksbj1uZXcgbHUodGhpcy5fYnVmUGFyYW1zKTtuLnNldFdvcmtpbmdQcmVjaXNpb25Nb2RlbCh0KSxuLnNldE5vZGVyKGUpLHRoaXMuX3Jlc3VsdEdlb21ldHJ5PW4uYnVmZmVyKHRoaXMuX2FyZ0dlb20sdGhpcy5fZGlzdGFuY2UpfSxidS5wcm90b3R5cGUuYnVmZmVyUmVkdWNlZFByZWNpc2lvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1idS5NQVhfUFJFQ0lTSU9OX0RJR0lUUztlPj0wO2UtLSl7dHJ5e3QuYnVmZmVyUmVkdWNlZFByZWNpc2lvbihlKX1jYXRjaChlKXtpZighKGUgaW5zdGFuY2VvZiBScykpdGhyb3cgZTt0Ll9zYXZlRXhjZXB0aW9uPWV9aWYobnVsbCE9PXQuX3Jlc3VsdEdlb21ldHJ5KXJldHVybiBudWxsfXRocm93IHRoaXMuX3NhdmVFeGNlcHRpb259aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWJ1LnByZWNpc2lvblNjYWxlRmFjdG9yKHRoaXMuX2FyZ0dlb20sdGhpcy5fZGlzdGFuY2UsbiksaT1uZXcgQ3Mocik7dGhpcy5idWZmZXJGaXhlZFByZWNpc2lvbihpKX19LGJ1LnByb3RvdHlwZS5jb21wdXRlR2VvbWV0cnk9ZnVuY3Rpb24oKXtpZih0aGlzLmJ1ZmZlck9yaWdpbmFsUHJlY2lzaW9uKCksbnVsbCE9PXRoaXMuX3Jlc3VsdEdlb21ldHJ5KXJldHVybiBudWxsO3ZhciB0PXRoaXMuX2FyZ0dlb20uZ2V0RmFjdG9yeSgpLmdldFByZWNpc2lvbk1vZGVsKCk7dC5nZXRUeXBlKCk9PT1Dcy5GSVhFRD90aGlzLmJ1ZmZlckZpeGVkUHJlY2lzaW9uKHQpOnRoaXMuYnVmZmVyUmVkdWNlZFByZWNpc2lvbigpfSxidS5wcm90b3R5cGUuc2V0UXVhZHJhbnRTZWdtZW50cz1mdW5jdGlvbih0KXt0aGlzLl9idWZQYXJhbXMuc2V0UXVhZHJhbnRTZWdtZW50cyh0KX0sYnUucHJvdG90eXBlLmJ1ZmZlck9yaWdpbmFsUHJlY2lzaW9uPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBsdSh0aGlzLl9idWZQYXJhbXMpO3RoaXMuX3Jlc3VsdEdlb21ldHJ5PXQuYnVmZmVyKHRoaXMuX2FyZ0dlb20sdGhpcy5fZGlzdGFuY2UpfWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIFdpKSl0aHJvdyB0O3RoaXMuX3NhdmVFeGNlcHRpb249dH19LGJ1LnByb3RvdHlwZS5nZXRSZXN1bHRHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGlzdGFuY2U9dCx0aGlzLmNvbXB1dGVHZW9tZXRyeSgpLHRoaXMuX3Jlc3VsdEdlb21ldHJ5fSxidS5wcm90b3R5cGUuc2V0RW5kQ2FwU3R5bGU9ZnVuY3Rpb24odCl7dGhpcy5fYnVmUGFyYW1zLnNldEVuZENhcFN0eWxlKHQpfSxidS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sYnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGJ1fSxidS5idWZmZXJPcD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMV07cmV0dXJuIG5ldyBidShhcmd1bWVudHNbMF0pLmdldFJlc3VsdEdlb21ldHJ5KHQpfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1syXSkmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1uZXcgYnUoYXJndW1lbnRzWzBdKTtyZXR1cm4gci5zZXRRdWFkcmFudFNlZ21lbnRzKG4pLHIuZ2V0UmVzdWx0R2VvbWV0cnkoZSl9aWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBGYSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBpPWFyZ3VtZW50c1sxXTtyZXR1cm4gbmV3IGJ1KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMl0pLmdldFJlc3VsdEdlb21ldHJ5KGkpfX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbM10sdT1uZXcgYnUoYXJndW1lbnRzWzBdKTtyZXR1cm4gdS5zZXRRdWFkcmFudFNlZ21lbnRzKHMpLHUuc2V0RW5kQ2FwU3R5bGUoYSksdS5nZXRSZXN1bHRHZW9tZXRyeShvKX19LGJ1LnByZWNpc2lvblNjYWxlRmFjdG9yPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmdldEVudmVsb3BlSW50ZXJuYWwoKSxpPUNpLm1heChNYXRoLmFicyhyLmdldE1heFgoKSksTWF0aC5hYnMoci5nZXRNYXhZKCkpLE1hdGguYWJzKHIuZ2V0TWluWCgpKSxNYXRoLmFicyhyLmdldE1pblkoKSkpKzIqKGU+MD9lOjApLG89bi1NYXRoLnRydW5jKE1hdGgubG9nKGkpL01hdGgubG9nKDEwKSsxKTtyZXR1cm4gTWF0aC5wb3coMTAsbyl9LER1LkNBUF9ST1VORC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gRmEuQ0FQX1JPVU5EfSxEdS5DQVBfQlVUVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gRmEuQ0FQX0ZMQVR9LER1LkNBUF9GTEFULmdldD1mdW5jdGlvbigpe3JldHVybiBGYS5DQVBfRkxBVH0sRHUuQ0FQX1NRVUFSRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gRmEuQ0FQX1NRVUFSRX0sRHUuTUFYX1BSRUNJU0lPTl9ESUdJVFMuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDEyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhidSxEdSk7dmFyIEV1PWZ1bmN0aW9uKCl7dGhpcy5fcHQ9W25ldyB2aSxuZXcgdmldLHRoaXMuX2Rpc3RhbmNlPWZpLk5hTix0aGlzLl9pc051bGw9ITB9O0V1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdH0sRXUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B0W3RdfSxFdS5wcm90b3R5cGUuc2V0TWluaW11bT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRNaW5pbXVtKHQuX3B0WzBdLHQuX3B0WzFdKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYodGhpcy5faXNOdWxsKXJldHVybiB0aGlzLmluaXRpYWxpemUoZSxuKSxudWxsO3ZhciByPWUuZGlzdGFuY2Uobik7cjx0aGlzLl9kaXN0YW5jZSYmdGhpcy5pbml0aWFsaXplKGUsbixyKX19LEV1LnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5faXNOdWxsPSEwO2Vsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9wdFswXS5zZXRDb29yZGluYXRlKHQpLHRoaXMuX3B0WzFdLnNldENvb3JkaW5hdGUoZSksdGhpcy5fZGlzdGFuY2U9dC5kaXN0YW5jZShlKSx0aGlzLl9pc051bGw9ITF9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdO3RoaXMuX3B0WzBdLnNldENvb3JkaW5hdGUobiksdGhpcy5fcHRbMV0uc2V0Q29vcmRpbmF0ZShyKSx0aGlzLl9kaXN0YW5jZT1pLHRoaXMuX2lzTnVsbD0hMX19LEV1LnByb3RvdHlwZS5nZXREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXN0YW5jZX0sRXUucHJvdG90eXBlLnNldE1heGltdW09ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0TWF4aW11bSh0Ll9wdFswXSx0Ll9wdFsxXSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKHRoaXMuX2lzTnVsbClyZXR1cm4gdGhpcy5pbml0aWFsaXplKGUsbiksbnVsbDt2YXIgcj1lLmRpc3RhbmNlKG4pO3I+dGhpcy5fZGlzdGFuY2UmJnRoaXMuaW5pdGlhbGl6ZShlLG4scil9fSxFdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEV1fTt2YXIgQ3U9ZnVuY3Rpb24oKXt9O0N1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxDdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQ3V9LEN1LmNvbXB1dGVEaXN0YW5jZT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgRXUmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgYXMmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgdmkpZm9yKHZhciB0PWFyZ3VtZW50c1sxXSxlPWFyZ3VtZW50c1syXSxuPWFyZ3VtZW50c1swXS5nZXRDb29yZGluYXRlcygpLHI9bmV3IGJhLGk9MDtpPG4ubGVuZ3RoLTE7aSsrKXtyLnNldENvb3JkaW5hdGVzKG5baV0sbltpKzFdKTt2YXIgbz1yLmNsb3Nlc3RQb2ludCh0KTtlLnNldE1pbmltdW0obyx0KX1lbHNlIGlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgRXUmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaHMmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXSx1PWFyZ3VtZW50c1syXTtDdS5jb21wdXRlRGlzdGFuY2Uocy5nZXRFeHRlcmlvclJpbmcoKSxhLHUpO2Zvcih2YXIgYz0wO2M8cy5nZXROdW1JbnRlcmlvclJpbmcoKTtjKyspQ3UuY29tcHV0ZURpc3RhbmNlKHMuZ2V0SW50ZXJpb3JSaW5nTihjKSxhLHUpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBFdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIGw9YXJndW1lbnRzWzBdLGg9YXJndW1lbnRzWzFdLGY9YXJndW1lbnRzWzJdO2lmKGwgaW5zdGFuY2VvZiBhcylDdS5jb21wdXRlRGlzdGFuY2UobCxoLGYpO2Vsc2UgaWYobCBpbnN0YW5jZW9mIGhzKUN1LmNvbXB1dGVEaXN0YW5jZShsLGgsZik7ZWxzZSBpZihsIGluc3RhbmNlb2YgSG8pZm9yKHZhciBwPWwsZD0wO2Q8cC5nZXROdW1HZW9tZXRyaWVzKCk7ZCsrKXt2YXIgZz1wLmdldEdlb21ldHJ5TihkKTtDdS5jb21wdXRlRGlzdGFuY2UoZyxoLGYpfWVsc2UgZi5zZXRNaW5pbXVtKGwuZ2V0Q29vcmRpbmF0ZSgpLGgpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBFdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBiYSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIHk9YXJndW1lbnRzWzFdLG09YXJndW1lbnRzWzJdLHY9YXJndW1lbnRzWzBdLmNsb3Nlc3RQb2ludCh5KTttLnNldE1pbmltdW0odix5KX19O3ZhciBTdT1mdW5jdGlvbih0KXt0aGlzLl9tYXhQdERpc3Q9bmV3IEV1LHRoaXMuX2lucHV0R2VvbT10fHxudWxsfSxBdT17TWF4UG9pbnREaXN0YW5jZUZpbHRlcjp7Y29uZmlndXJhYmxlOiEwfSxNYXhNaWRwb2ludERpc3RhbmNlRmlsdGVyOntjb25maWd1cmFibGU6ITB9fTtTdS5wcm90b3R5cGUuY29tcHV0ZU1heE1pZHBvaW50RGlzdGFuY2U9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEl1KHRoaXMuX2lucHV0R2VvbSk7dC5hcHBseShlKSx0aGlzLl9tYXhQdERpc3Quc2V0TWF4aW11bShlLmdldE1heFBvaW50RGlzdGFuY2UoKSl9LFN1LnByb3RvdHlwZS5jb21wdXRlTWF4VmVydGV4RGlzdGFuY2U9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IE51KHRoaXMuX2lucHV0R2VvbSk7dC5hcHBseShlKSx0aGlzLl9tYXhQdERpc3Quc2V0TWF4aW11bShlLmdldE1heFBvaW50RGlzdGFuY2UoKSl9LFN1LnByb3RvdHlwZS5maW5kRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcHV0ZU1heFZlcnRleERpc3RhbmNlKHQpLHRoaXMuY29tcHV0ZU1heE1pZHBvaW50RGlzdGFuY2UodCksdGhpcy5fbWF4UHREaXN0LmdldERpc3RhbmNlKCl9LFN1LnByb3RvdHlwZS5nZXREaXN0YW5jZVBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LFN1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxTdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gU3V9LEF1Lk1heFBvaW50RGlzdGFuY2VGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE51fSxBdS5NYXhNaWRwb2ludERpc3RhbmNlRmlsdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBJdX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU3UsQXUpO3ZhciBOdT1mdW5jdGlvbih0KXt0aGlzLl9tYXhQdERpc3Q9bmV3IEV1LHRoaXMuX21pblB0RGlzdD1uZXcgRXUsdGhpcy5fZ2VvbT10fHxudWxsfTtOdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3RoaXMuX21pblB0RGlzdC5pbml0aWFsaXplKCksQ3UuY29tcHV0ZURpc3RhbmNlKHRoaXMuX2dlb20sdCx0aGlzLl9taW5QdERpc3QpLHRoaXMuX21heFB0RGlzdC5zZXRNYXhpbXVtKHRoaXMuX21pblB0RGlzdCl9LE51LnByb3RvdHlwZS5nZXRNYXhQb2ludERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heFB0RGlzdH0sTnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2FvXX0sTnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE51fTt2YXIgSXU9ZnVuY3Rpb24odCl7dGhpcy5fbWF4UHREaXN0PW5ldyBFdSx0aGlzLl9taW5QdERpc3Q9bmV3IEV1LHRoaXMuX2dlb209dHx8bnVsbH07SXUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0LGUpe2lmKDA9PT1lKXJldHVybiBudWxsO3ZhciBuPXQuZ2V0Q29vcmRpbmF0ZShlLTEpLHI9dC5nZXRDb29yZGluYXRlKGUpLGk9bmV3IHZpKChuLngrci54KS8yLChuLnkrci55KS8yKTt0aGlzLl9taW5QdERpc3QuaW5pdGlhbGl6ZSgpLEN1LmNvbXB1dGVEaXN0YW5jZSh0aGlzLl9nZW9tLGksdGhpcy5fbWluUHREaXN0KSx0aGlzLl9tYXhQdERpc3Quc2V0TWF4aW11bSh0aGlzLl9taW5QdERpc3QpfSxJdS5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuITF9LEl1LnByb3RvdHlwZS5pc0dlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe3JldHVybiExfSxJdS5wcm90b3R5cGUuZ2V0TWF4UG9pbnREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LEl1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltXb119LEl1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBJdX07dmFyIE11PWZ1bmN0aW9uKHQpe3RoaXMuX2NvbXBzPXR8fG51bGx9O011LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIGhzJiZ0aGlzLl9jb21wcy5hZGQodCl9LE11LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltYb119LE11LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBNdX0sTXUuZ2V0UG9seWdvbnM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gTXUuZ2V0UG9seWdvbnMoYXJndW1lbnRzWzBdLG5ldyB4byk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtyZXR1cm4gdCBpbnN0YW5jZW9mIGhzP2UuYWRkKHQpOnQgaW5zdGFuY2VvZiBIbyYmdC5hcHBseShuZXcgTXUoZSkpLGV9fTt2YXIgRnU9ZnVuY3Rpb24oKXtpZih0aGlzLl9saW5lcz1udWxsLHRoaXMuX2lzRm9yY2VkVG9MaW5lU3RyaW5nPSExLDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbGluZXM9dH1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5fbGluZXM9ZSx0aGlzLl9pc0ZvcmNlZFRvTGluZVN0cmluZz1ufX07RnUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXtpZih0aGlzLl9pc0ZvcmNlZFRvTGluZVN0cmluZyYmdCBpbnN0YW5jZW9mIHBzKXt2YXIgZT10LmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lU3RyaW5nKHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCkpO3JldHVybiB0aGlzLl9saW5lcy5hZGQoZSksbnVsbH10IGluc3RhbmNlb2YgYXMmJnRoaXMuX2xpbmVzLmFkZCh0KX0sRnUucHJvdG90eXBlLnNldEZvcmNlVG9MaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX2lzRm9yY2VkVG9MaW5lU3RyaW5nPXR9LEZ1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltyb119LEZ1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBGdX0sRnUuZ2V0R2VvbWV0cnk9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0LmdldEZhY3RvcnkoKS5idWlsZEdlb21ldHJ5KEZ1LmdldExpbmVzKHQpKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiBlLmdldEZhY3RvcnkoKS5idWlsZEdlb21ldHJ5KEZ1LmdldExpbmVzKGUsbikpfX0sRnUuZ2V0TGluZXM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gRnUuZ2V0TGluZXMoYXJndW1lbnRzWzBdLCExKTtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoRWkoYXJndW1lbnRzWzBdLGdvKSYmRWkoYXJndW1lbnRzWzFdLGdvKSl7Zm9yKHZhciB0PWFyZ3VtZW50c1sxXSxlPWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7RnUuZ2V0TGluZXMobix0KX1yZXR1cm4gdH1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvJiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPW5ldyB4bztyZXR1cm4gci5hcHBseShuZXcgRnUobyxpKSksb31pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvJiZFaShhcmd1bWVudHNbMV0sZ28pKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV07cmV0dXJuIHMgaW5zdGFuY2VvZiBhcz9hLmFkZChzKTpzLmFwcGx5KG5ldyBGdShhKSksYX19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzJdJiZFaShhcmd1bWVudHNbMF0sZ28pJiZFaShhcmd1bWVudHNbMV0sZ28pKXtmb3IodmFyIHU9YXJndW1lbnRzWzFdLGM9YXJndW1lbnRzWzJdLGw9YXJndW1lbnRzWzBdLml0ZXJhdG9yKCk7bC5oYXNOZXh0KCk7KXt2YXIgaD1sLm5leHQoKTtGdS5nZXRMaW5lcyhoLHUsYyl9cmV0dXJuIHV9aWYoImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvJiZFaShhcmd1bWVudHNbMV0sZ28pKXt2YXIgZj1hcmd1bWVudHNbMV0scD1hcmd1bWVudHNbMl07cmV0dXJuIGFyZ3VtZW50c1swXS5hcHBseShuZXcgRnUoZixwKSksZn19fTt2YXIgVHU9ZnVuY3Rpb24oKXtpZih0aGlzLl9ib3VuZGFyeVJ1bGU9dW8uT0dDX1NGU19CT1VOREFSWV9SVUxFLHRoaXMuX2lzSW49bnVsbCx0aGlzLl9udW1Cb3VuZGFyaWVzPW51bGwsMCE9PWFyZ3VtZW50cy5sZW5ndGgmJjE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07aWYobnVsbD09PXQpdGhyb3cgbmV3IGhpO3RoaXMuX2JvdW5kYXJ5UnVsZT10fX07VHUucHJvdG90eXBlLmxvY2F0ZUludGVybmFsPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBocyl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO2lmKGUuaXNFbXB0eSgpKXJldHVybiBiaS5FWFRFUklPUjt2YXIgbj1lLmdldEV4dGVyaW9yUmluZygpLHI9dGhpcy5sb2NhdGVJblBvbHlnb25SaW5nKHQsbik7aWYocj09PWJpLkVYVEVSSU9SKXJldHVybiBiaS5FWFRFUklPUjtpZihyPT09YmkuQk9VTkRBUlkpcmV0dXJuIGJpLkJPVU5EQVJZO2Zvcih2YXIgaT0wO2k8ZS5nZXROdW1JbnRlcmlvclJpbmcoKTtpKyspe3ZhciBvPWUuZ2V0SW50ZXJpb3JSaW5nTihpKSxzPXRoaXMubG9jYXRlSW5Qb2x5Z29uUmluZyh0LG8pO2lmKHM9PT1iaS5JTlRFUklPUilyZXR1cm4gYmkuRVhURVJJT1I7aWYocz09PWJpLkJPVU5EQVJZKXJldHVybiBiaS5CT1VOREFSWX1yZXR1cm4gYmkuSU5URVJJT1J9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBhcyl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdO2lmKCF1LmdldEVudmVsb3BlSW50ZXJuYWwoKS5pbnRlcnNlY3RzKGEpKXJldHVybiBiaS5FWFRFUklPUjt2YXIgYz11LmdldENvb3JkaW5hdGVzKCk7cmV0dXJuIHUuaXNDbG9zZWQoKXx8IWEuZXF1YWxzKGNbMF0pJiYhYS5lcXVhbHMoY1tjLmxlbmd0aC0xXSk/ZW8uaXNPbkxpbmUoYSxjKT9iaS5JTlRFUklPUjpiaS5FWFRFUklPUjpiaS5CT1VOREFSWX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIGNzKXt2YXIgbD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1sxXS5nZXRDb29yZGluYXRlKCkuZXF1YWxzMkQobCk/YmkuSU5URVJJT1I6YmkuRVhURVJJT1J9fSxUdS5wcm90b3R5cGUubG9jYXRlSW5Qb2x5Z29uUmluZz1mdW5jdGlvbih0LGUpe3JldHVybiBlLmdldEVudmVsb3BlSW50ZXJuYWwoKS5pbnRlcnNlY3RzKHQpP2VvLmxvY2F0ZVBvaW50SW5SaW5nKHQsZS5nZXRDb29yZGluYXRlcygpKTpiaS5FWFRFUklPUn0sVHUucHJvdG90eXBlLmludGVyc2VjdHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5sb2NhdGUodCxlKSE9PWJpLkVYVEVSSU9SfSxUdS5wcm90b3R5cGUudXBkYXRlTG9jYXRpb25JbmZvPWZ1bmN0aW9uKHQpe3Q9PT1iaS5JTlRFUklPUiYmKHRoaXMuX2lzSW49ITApLHQ9PT1iaS5CT1VOREFSWSYmdGhpcy5fbnVtQm91bmRhcmllcysrfSxUdS5wcm90b3R5cGUuY29tcHV0ZUxvY2F0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZihlIGluc3RhbmNlb2YgY3MmJnRoaXMudXBkYXRlTG9jYXRpb25JbmZvKHRoaXMubG9jYXRlSW50ZXJuYWwodCxlKSksZSBpbnN0YW5jZW9mIGFzKXRoaXMudXBkYXRlTG9jYXRpb25JbmZvKHRoaXMubG9jYXRlSW50ZXJuYWwodCxlKSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgaHMpdGhpcy51cGRhdGVMb2NhdGlvbkluZm8odGhpcy5sb2NhdGVJbnRlcm5hbCh0LGUpKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBabylmb3IodmFyIHI9ZSxpPTA7aTxyLmdldE51bUdlb21ldHJpZXMoKTtpKyspe3ZhciBvPXIuZ2V0R2VvbWV0cnlOKGkpO24udXBkYXRlTG9jYXRpb25JbmZvKG4ubG9jYXRlSW50ZXJuYWwodCxvKSl9ZWxzZSBpZihlIGluc3RhbmNlb2YgZHMpZm9yKHZhciBzPWUsYT0wO2E8cy5nZXROdW1HZW9tZXRyaWVzKCk7YSsrKXt2YXIgdT1zLmdldEdlb21ldHJ5TihhKTtuLnVwZGF0ZUxvY2F0aW9uSW5mbyhuLmxvY2F0ZUludGVybmFsKHQsdSkpfWVsc2UgaWYoZSBpbnN0YW5jZW9mIEhvKWZvcih2YXIgYz1uZXcgSGEoZSk7Yy5oYXNOZXh0KCk7KXt2YXIgbD1jLm5leHQoKTtsIT09ZSYmbi5jb21wdXRlTG9jYXRpb24odCxsKX19LFR1LnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5pc0VtcHR5KCk/YmkuRVhURVJJT1I6ZSBpbnN0YW5jZW9mIGFzfHxlIGluc3RhbmNlb2YgaHM/dGhpcy5sb2NhdGVJbnRlcm5hbCh0LGUpOih0aGlzLl9pc0luPSExLHRoaXMuX251bUJvdW5kYXJpZXM9MCx0aGlzLmNvbXB1dGVMb2NhdGlvbih0LGUpLHRoaXMuX2JvdW5kYXJ5UnVsZS5pc0luQm91bmRhcnkodGhpcy5fbnVtQm91bmRhcmllcyk/YmkuQk9VTkRBUlk6dGhpcy5fbnVtQm91bmRhcmllcz4wfHx0aGlzLl9pc0luP2JpLklOVEVSSU9SOmJpLkVYVEVSSU9SKX0sVHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFR1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBUdX07dmFyIE91PWZ1bmN0aW9uIHQoKXtpZih0aGlzLl9jb21wb25lbnQ9bnVsbCx0aGlzLl9zZWdJbmRleD1udWxsLHRoaXMuX3B0PW51bGwsMj09PWFyZ3VtZW50cy5sZW5ndGgpdC5jYWxsKHRoaXMsYXJndW1lbnRzWzBdLHQuSU5TSURFX0FSRUEsYXJndW1lbnRzWzFdKTtlbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5fY29tcG9uZW50PWUsdGhpcy5fc2VnSW5kZXg9bix0aGlzLl9wdD1yfX0sTHU9e0lOU0lERV9BUkVBOntjb25maWd1cmFibGU6ITB9fTtPdS5wcm90b3R5cGUuaXNJbnNpZGVBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NlZ0luZGV4PT09T3UuSU5TSURFX0FSRUF9LE91LnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0fSxPdS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlDb21wb25lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50fSxPdS5wcm90b3R5cGUuZ2V0U2VnbWVudEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NlZ0luZGV4fSxPdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sT3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE91fSxMdS5JTlNJREVfQVJFQS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoT3UsTHUpO3ZhciBQdT1mdW5jdGlvbih0KXt0aGlzLl9wdHM9dHx8bnVsbH07UHUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt0IGluc3RhbmNlb2YgY3MmJnRoaXMuX3B0cy5hZGQodCl9LFB1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltYb119LFB1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBQdX0sUHUuZ2V0UG9pbnRzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdCBpbnN0YW5jZW9mIGNzP2FhLnNpbmdsZXRvbkxpc3QodCk6UHUuZ2V0UG9pbnRzKHQsbmV3IHhvKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiBlIGluc3RhbmNlb2YgY3M/bi5hZGQoZSk6ZSBpbnN0YW5jZW9mIEhvJiZlLmFwcGx5KG5ldyBQdShuKSksbn19O3ZhciBSdT1mdW5jdGlvbigpe3RoaXMuX2xvY2F0aW9ucz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9sb2NhdGlvbnM9dH07UnUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXsodCBpbnN0YW5jZW9mIGNzfHx0IGluc3RhbmNlb2YgYXN8fHQgaW5zdGFuY2VvZiBocykmJnRoaXMuX2xvY2F0aW9ucy5hZGQobmV3IE91KHQsMCx0LmdldENvb3JkaW5hdGUoKSkpfSxSdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bWG9dfSxSdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUnV9LFJ1LmdldExvY2F0aW9ucz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgeG87cmV0dXJuIHQuYXBwbHkobmV3IFJ1KGUpKSxlfTt2YXIgQnU9ZnVuY3Rpb24oKXtpZih0aGlzLl9nZW9tPW51bGwsdGhpcy5fdGVybWluYXRlRGlzdGFuY2U9MCx0aGlzLl9wdExvY2F0b3I9bmV3IFR1LHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb249bnVsbCx0aGlzLl9taW5EaXN0YW5jZT1maS5NQVhfVkFMVUUsMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9nZW9tPVt0LGVdLHRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlPTB9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdO3RoaXMuX2dlb209bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5fZ2VvbVswXT1uLHRoaXMuX2dlb21bMV09cix0aGlzLl90ZXJtaW5hdGVEaXN0YW5jZT1pfX07QnUucHJvdG90eXBlLmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9bmV3IEFycmF5KDIpLmZpbGwobnVsbCk7aWYodGhpcy5jb21wdXRlQ29udGFpbm1lbnREaXN0YW5jZSgwLGUpLHRoaXMuX21pbkRpc3RhbmNlPD10aGlzLl90ZXJtaW5hdGVEaXN0YW5jZSlyZXR1cm4gbnVsbDt0aGlzLmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlKDEsZSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9MS1uLG89TXUuZ2V0UG9seWdvbnModGhpcy5fZ2VvbVtuXSk7aWYoby5zaXplKCk+MCl7dmFyIHM9UnUuZ2V0TG9jYXRpb25zKHRoaXMuX2dlb21baV0pO2lmKHRoaXMuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2UocyxvLHIpLHRoaXMuX21pbkRpc3RhbmNlPD10aGlzLl90ZXJtaW5hdGVEaXN0YW5jZSlyZXR1cm4gdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbltpXT1yWzBdLHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bbl09clsxXSxudWxsfX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKWlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgQXJyYXkmJkVpKGFyZ3VtZW50c1swXSx2bykmJkVpKGFyZ3VtZW50c1sxXSx2bykpe2Zvcih2YXIgYT1hcmd1bWVudHNbMF0sdT1hcmd1bWVudHNbMV0sYz1hcmd1bWVudHNbMl0sbD0wO2w8YS5zaXplKCk7bCsrKWZvcih2YXIgaD1hLmdldChsKSxmPTA7Zjx1LnNpemUoKTtmKyspaWYodC5jb21wdXRlQ29udGFpbm1lbnREaXN0YW5jZShoLHUuZ2V0KGYpLGMpLHQuX21pbkRpc3RhbmNlPD10Ll90ZXJtaW5hdGVEaXN0YW5jZSlyZXR1cm4gbnVsbH1lbHNlIGlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgQXJyYXkmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgT3UmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgaHMpe3ZhciBwPWFyZ3VtZW50c1swXSxkPWFyZ3VtZW50c1sxXSxnPWFyZ3VtZW50c1syXSx5PXAuZ2V0Q29vcmRpbmF0ZSgpO2lmKGJpLkVYVEVSSU9SIT09dGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh5LGQpKXJldHVybiB0aGlzLl9taW5EaXN0YW5jZT0wLGdbMF09cCxnWzFdPW5ldyBPdShkLHkpLG51bGx9fSxCdS5wcm90b3R5cGUuY29tcHV0ZU1pbkRpc3RhbmNlTGluZXNQb2ludHM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10aGlzLGk9MDtpPHQuc2l6ZSgpO2krKylmb3IodmFyIG89dC5nZXQoaSkscz0wO3M8ZS5zaXplKCk7cysrKXt2YXIgYT1lLmdldChzKTtpZihyLmNvbXB1dGVNaW5EaXN0YW5jZShvLGEsbiksci5fbWluRGlzdGFuY2U8PXIuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfX0sQnUucHJvdG90eXBlLmNvbXB1dGVGYWNldERpc3RhbmNlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksZT1GdS5nZXRMaW5lcyh0aGlzLl9nZW9tWzBdKSxuPUZ1LmdldExpbmVzKHRoaXMuX2dlb21bMV0pLHI9UHUuZ2V0UG9pbnRzKHRoaXMuX2dlb21bMF0pLGk9UHUuZ2V0UG9pbnRzKHRoaXMuX2dlb21bMV0pO2lmKHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlTGluZXMoZSxuLHQpLHRoaXMudXBkYXRlTWluRGlzdGFuY2UodCwhMSksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlfHwodFswXT1udWxsLHRbMV09bnVsbCx0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZUxpbmVzUG9pbnRzKGUsaSx0KSx0aGlzLnVwZGF0ZU1pbkRpc3RhbmNlKHQsITEpLHRoaXMuX21pbkRpc3RhbmNlPD10aGlzLl90ZXJtaW5hdGVEaXN0YW5jZSl8fCh0WzBdPW51bGwsdFsxXT1udWxsLHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlTGluZXNQb2ludHMobixyLHQpLHRoaXMudXBkYXRlTWluRGlzdGFuY2UodCwhMCksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlKSlyZXR1cm4gbnVsbDt0WzBdPW51bGwsdFsxXT1udWxsLHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlUG9pbnRzKHIsaSx0KSx0aGlzLnVwZGF0ZU1pbkRpc3RhbmNlKHQsITEpfSxCdS5wcm90b3R5cGUubmVhcmVzdExvY2F0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZSgpLHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb259LEJ1LnByb3RvdHlwZS51cGRhdGVNaW5EaXN0YW5jZT1mdW5jdGlvbih0LGUpe2lmKG51bGw9PT10WzBdKXJldHVybiBudWxsO2U/KHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMF09dFsxXSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzFdPXRbMF0pOih0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzBdPXRbMF0sdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvblsxXT10WzFdKX0sQnUucHJvdG90eXBlLm5lYXJlc3RQb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wdXRlTWluRGlzdGFuY2UoKSxbdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvblswXS5nZXRDb29yZGluYXRlKCksdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvblsxXS5nZXRDb29yZGluYXRlKCldfSxCdS5wcm90b3R5cGUuY29tcHV0ZU1pbkRpc3RhbmNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7aWYobnVsbCE9PXRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb258fCh0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2UoKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2UpKXJldHVybiBudWxsO3RoaXMuY29tcHV0ZUZhY2V0RGlzdGFuY2UoKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKWlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgQXJyYXkmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgYXMmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgY3Mpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTtpZihlLmdldEVudmVsb3BlSW50ZXJuYWwoKS5kaXN0YW5jZShuLmdldEVudmVsb3BlSW50ZXJuYWwoKSk+dGhpcy5fbWluRGlzdGFuY2UpcmV0dXJuIG51bGw7Zm9yKHZhciBpPWUuZ2V0Q29vcmRpbmF0ZXMoKSxvPW4uZ2V0Q29vcmRpbmF0ZSgpLHM9MDtzPGkubGVuZ3RoLTE7cysrKXt2YXIgYT1lby5kaXN0YW5jZVBvaW50TGluZShvLGlbc10saVtzKzFdKTtpZihhPHQuX21pbkRpc3RhbmNlKXt0Ll9taW5EaXN0YW5jZT1hO3ZhciB1PW5ldyBiYShpW3NdLGlbcysxXSkuY2xvc2VzdFBvaW50KG8pO3JbMF09bmV3IE91KGUscyx1KSxyWzFdPW5ldyBPdShuLDAsbyl9aWYodC5fbWluRGlzdGFuY2U8PXQuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfX1lbHNlIGlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgQXJyYXkmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgYXMmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgYXMpe3ZhciBjPWFyZ3VtZW50c1swXSxsPWFyZ3VtZW50c1sxXSxoPWFyZ3VtZW50c1syXTtpZihjLmdldEVudmVsb3BlSW50ZXJuYWwoKS5kaXN0YW5jZShsLmdldEVudmVsb3BlSW50ZXJuYWwoKSk+dGhpcy5fbWluRGlzdGFuY2UpcmV0dXJuIG51bGw7Zm9yKHZhciBmPWMuZ2V0Q29vcmRpbmF0ZXMoKSxwPWwuZ2V0Q29vcmRpbmF0ZXMoKSxkPTA7ZDxmLmxlbmd0aC0xO2QrKylmb3IodmFyIGc9MDtnPHAubGVuZ3RoLTE7ZysrKXt2YXIgeT1lby5kaXN0YW5jZUxpbmVMaW5lKGZbZF0sZltkKzFdLHBbZ10scFtnKzFdKTtpZih5PHQuX21pbkRpc3RhbmNlKXt0Ll9taW5EaXN0YW5jZT15O3ZhciBtPW5ldyBiYShmW2RdLGZbZCsxXSksdj1uZXcgYmEocFtnXSxwW2crMV0pLF89bS5jbG9zZXN0UG9pbnRzKHYpO2hbMF09bmV3IE91KGMsZCxfWzBdKSxoWzFdPW5ldyBPdShsLGcsX1sxXSl9aWYodC5fbWluRGlzdGFuY2U8PXQuX3Rlcm1pbmF0ZURpc3RhbmNlKXJldHVybiBudWxsfX19LEJ1LnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2VQb2ludHM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10aGlzLGk9MDtpPHQuc2l6ZSgpO2krKylmb3IodmFyIG89dC5nZXQoaSkscz0wO3M8ZS5zaXplKCk7cysrKXt2YXIgYT1lLmdldChzKSx1PW8uZ2V0Q29vcmRpbmF0ZSgpLmRpc3RhbmNlKGEuZ2V0Q29vcmRpbmF0ZSgpKTtpZih1PHIuX21pbkRpc3RhbmNlJiYoci5fbWluRGlzdGFuY2U9dSxuWzBdPW5ldyBPdShvLDAsby5nZXRDb29yZGluYXRlKCkpLG5bMV09bmV3IE91KGEsMCxhLmdldENvb3JkaW5hdGUoKSkpLHIuX21pbkRpc3RhbmNlPD1yLl90ZXJtaW5hdGVEaXN0YW5jZSlyZXR1cm4gbnVsbH19LEJ1LnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9nZW9tWzBdfHxudWxsPT09dGhpcy5fZ2VvbVsxXSl0aHJvdyBuZXcgaGk7cmV0dXJuIHRoaXMuX2dlb21bMF0uaXNFbXB0eSgpfHx0aGlzLl9nZW9tWzFdLmlzRW1wdHkoKT8wOih0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZSgpLHRoaXMuX21pbkRpc3RhbmNlKX0sQnUucHJvdG90eXBlLmNvbXB1dGVNaW5EaXN0YW5jZUxpbmVzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9dGhpcyxpPTA7aTx0LnNpemUoKTtpKyspZm9yKHZhciBvPXQuZ2V0KGkpLHM9MDtzPGUuc2l6ZSgpO3MrKyl7dmFyIGE9ZS5nZXQocyk7aWYoci5jb21wdXRlTWluRGlzdGFuY2UobyxhLG4pLHIuX21pbkRpc3RhbmNlPD1yLl90ZXJtaW5hdGVEaXN0YW5jZSlyZXR1cm4gbnVsbH19LEJ1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxCdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQnV9LEJ1LmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBCdSh0LGUpLmRpc3RhbmNlKCl9LEJ1LmlzV2l0aGluRGlzdGFuY2U9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuZXcgQnUodCxlLG4pLmRpc3RhbmNlKCk8PW59LEJ1Lm5lYXJlc3RQb2ludHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IEJ1KHQsZSkubmVhcmVzdFBvaW50cygpfTt2YXIga3U9ZnVuY3Rpb24oKXt0aGlzLl9wdD1bbmV3IHZpLG5ldyB2aV0sdGhpcy5fZGlzdGFuY2U9ZmkuTmFOLHRoaXMuX2lzTnVsbD0hMH07a3UucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0fSxrdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHRbdF19LGt1LnByb3RvdHlwZS5zZXRNaW5pbXVtPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldE1pbmltdW0odC5fcHRbMF0sdC5fcHRbMV0pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLl9pc051bGwpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShlLG4pLG51bGw7dmFyIHI9ZS5kaXN0YW5jZShuKTtyPHRoaXMuX2Rpc3RhbmNlJiZ0aGlzLmluaXRpYWxpemUoZSxuLHIpfX0sa3UucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLl9pc051bGw9ITA7ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX3B0WzBdLnNldENvb3JkaW5hdGUodCksdGhpcy5fcHRbMV0uc2V0Q29vcmRpbmF0ZShlKSx0aGlzLl9kaXN0YW5jZT10LmRpc3RhbmNlKGUpLHRoaXMuX2lzTnVsbD0hMX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV0saT1hcmd1bWVudHNbMl07dGhpcy5fcHRbMF0uc2V0Q29vcmRpbmF0ZShuKSx0aGlzLl9wdFsxXS5zZXRDb29yZGluYXRlKHIpLHRoaXMuX2Rpc3RhbmNlPWksdGhpcy5faXNOdWxsPSExfX0sa3UucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFhpLnRvTGluZVN0cmluZyh0aGlzLl9wdFswXSx0aGlzLl9wdFsxXSl9LGt1LnByb3RvdHlwZS5nZXREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXN0YW5jZX0sa3UucHJvdG90eXBlLnNldE1heGltdW09ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0TWF4aW11bSh0Ll9wdFswXSx0Ll9wdFsxXSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKHRoaXMuX2lzTnVsbClyZXR1cm4gdGhpcy5pbml0aWFsaXplKGUsbiksbnVsbDt2YXIgcj1lLmRpc3RhbmNlKG4pO3I+dGhpcy5fZGlzdGFuY2UmJnRoaXMuaW5pdGlhbGl6ZShlLG4scil9fSxrdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sa3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGt1fTt2YXIgenU9ZnVuY3Rpb24oKXt9O3p1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx6dS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4genV9LHp1LmNvbXB1dGVEaXN0YW5jZT1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1syXWluc3RhbmNlb2Yga3UmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgYXMmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgdmkpZm9yKHZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXSxyPW5ldyBiYSxpPXQuZ2V0Q29vcmRpbmF0ZXMoKSxvPTA7bzxpLmxlbmd0aC0xO28rKyl7ci5zZXRDb29yZGluYXRlcyhpW29dLGlbbysxXSk7dmFyIHM9ci5jbG9zZXN0UG9pbnQoZSk7bi5zZXRNaW5pbXVtKHMsZSl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIGt1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGhzJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgYT1hcmd1bWVudHNbMF0sdT1hcmd1bWVudHNbMV0sYz1hcmd1bWVudHNbMl07enUuY29tcHV0ZURpc3RhbmNlKGEuZ2V0RXh0ZXJpb3JSaW5nKCksdSxjKTtmb3IodmFyIGw9MDtsPGEuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7bCsrKXp1LmNvbXB1dGVEaXN0YW5jZShhLmdldEludGVyaW9yUmluZ04obCksdSxjKX1lbHNlIGlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2Yga3UmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8mJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciBoPWFyZ3VtZW50c1swXSxmPWFyZ3VtZW50c1sxXSxwPWFyZ3VtZW50c1syXTtpZihoIGluc3RhbmNlb2YgYXMpenUuY29tcHV0ZURpc3RhbmNlKGgsZixwKTtlbHNlIGlmKGggaW5zdGFuY2VvZiBocyl6dS5jb21wdXRlRGlzdGFuY2UoaCxmLHApO2Vsc2UgaWYoaCBpbnN0YW5jZW9mIEhvKWZvcih2YXIgZD1oLGc9MDtnPGQuZ2V0TnVtR2VvbWV0cmllcygpO2crKyl7dmFyIHk9ZC5nZXRHZW9tZXRyeU4oZyk7enUuY29tcHV0ZURpc3RhbmNlKHksZixwKX1lbHNlIHAuc2V0TWluaW11bShoLmdldENvb3JkaW5hdGUoKSxmKX1lbHNlIGlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2Yga3UmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgYmEmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciBtPWFyZ3VtZW50c1sxXSx2PWFyZ3VtZW50c1syXSxfPWFyZ3VtZW50c1swXS5jbG9zZXN0UG9pbnQobSk7di5zZXRNaW5pbXVtKF8sbSl9fTt2YXIganU9ZnVuY3Rpb24oKXt0aGlzLl9nMD1udWxsLHRoaXMuX2cxPW51bGwsdGhpcy5fcHREaXN0PW5ldyBrdSx0aGlzLl9kZW5zaWZ5RnJhYz0wO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9nMD10LHRoaXMuX2cxPWV9LFV1PXtNYXhQb2ludERpc3RhbmNlRmlsdGVyOntjb25maWd1cmFibGU6ITB9LE1heERlbnNpZmllZEJ5RnJhY3Rpb25EaXN0YW5jZUZpbHRlcjp7Y29uZmlndXJhYmxlOiEwfX07anUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0RGlzdC5nZXRDb29yZGluYXRlcygpfSxqdS5wcm90b3R5cGUuc2V0RGVuc2lmeUZyYWN0aW9uPWZ1bmN0aW9uKHQpe2lmKHQ+MXx8dDw9MCl0aHJvdyBuZXcgaGk7dGhpcy5fZGVuc2lmeUZyYWM9dH0sanUucHJvdG90eXBlLmNvbXB1dGU9ZnVuY3Rpb24odCxlKXt0aGlzLmNvbXB1dGVPcmllbnRlZERpc3RhbmNlKHQsZSx0aGlzLl9wdERpc3QpLHRoaXMuY29tcHV0ZU9yaWVudGVkRGlzdGFuY2UoZSx0LHRoaXMuX3B0RGlzdCl9LGp1LnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXB1dGUodGhpcy5fZzAsdGhpcy5fZzEpLHRoaXMuX3B0RGlzdC5nZXREaXN0YW5jZSgpfSxqdS5wcm90b3R5cGUuY29tcHV0ZU9yaWVudGVkRGlzdGFuY2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBxdShlKTtpZih0LmFwcGx5KHIpLG4uc2V0TWF4aW11bShyLmdldE1heFBvaW50RGlzdGFuY2UoKSksdGhpcy5fZGVuc2lmeUZyYWM+MCl7dmFyIGk9bmV3IFZ1KGUsdGhpcy5fZGVuc2lmeUZyYWMpO3QuYXBwbHkoaSksbi5zZXRNYXhpbXVtKGkuZ2V0TWF4UG9pbnREaXN0YW5jZSgpKX19LGp1LnByb3RvdHlwZS5vcmllbnRlZERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZU9yaWVudGVkRGlzdGFuY2UodGhpcy5fZzAsdGhpcy5fZzEsdGhpcy5fcHREaXN0KSx0aGlzLl9wdERpc3QuZ2V0RGlzdGFuY2UoKX0sanUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGp1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBqdX0sanUuZGlzdGFuY2U9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IGp1KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pLmRpc3RhbmNlKCk7aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1syXSxlPW5ldyBqdShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKTtyZXR1cm4gZS5zZXREZW5zaWZ5RnJhY3Rpb24odCksZS5kaXN0YW5jZSgpfX0sVXUuTWF4UG9pbnREaXN0YW5jZUZpbHRlci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gcXV9LFV1Lk1heERlbnNpZmllZEJ5RnJhY3Rpb25EaXN0YW5jZUZpbHRlci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gVnV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGp1LFV1KTt2YXIgcXU9ZnVuY3Rpb24oKXt0aGlzLl9tYXhQdERpc3Q9bmV3IGt1LHRoaXMuX21pblB0RGlzdD1uZXcga3UsdGhpcy5fZXVjbGlkZWFuRGlzdD1uZXcgenUsdGhpcy5fZ2VvbT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9nZW9tPXR9O3F1LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dGhpcy5fbWluUHREaXN0LmluaXRpYWxpemUoKSx6dS5jb21wdXRlRGlzdGFuY2UodGhpcy5fZ2VvbSx0LHRoaXMuX21pblB0RGlzdCksdGhpcy5fbWF4UHREaXN0LnNldE1heGltdW0odGhpcy5fbWluUHREaXN0KX0scXUucHJvdG90eXBlLmdldE1heFBvaW50RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4UHREaXN0fSxxdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bYW9dfSxxdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcXV9O3ZhciBWdT1mdW5jdGlvbigpe3RoaXMuX21heFB0RGlzdD1uZXcga3UsdGhpcy5fbWluUHREaXN0PW5ldyBrdSx0aGlzLl9nZW9tPW51bGwsdGhpcy5fbnVtU3ViU2Vncz0wO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9nZW9tPXQsdGhpcy5fbnVtU3ViU2Vncz1NYXRoLnRydW5jKE1hdGgucm91bmQoMS9lKSl9O1Z1LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKDA9PT1lKXJldHVybiBudWxsO2Zvcih2YXIgcj10LmdldENvb3JkaW5hdGUoZS0xKSxpPXQuZ2V0Q29vcmRpbmF0ZShlKSxvPShpLngtci54KS90aGlzLl9udW1TdWJTZWdzLHM9KGkueS1yLnkpL3RoaXMuX251bVN1YlNlZ3MsYT0wO2E8dGhpcy5fbnVtU3ViU2VnczthKyspe3ZhciB1PXIueCthKm8sYz1yLnkrYSpzLGw9bmV3IHZpKHUsYyk7bi5fbWluUHREaXN0LmluaXRpYWxpemUoKSx6dS5jb21wdXRlRGlzdGFuY2Uobi5fZ2VvbSxsLG4uX21pblB0RGlzdCksbi5fbWF4UHREaXN0LnNldE1heGltdW0obi5fbWluUHREaXN0KX19LFZ1LnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sVnUucHJvdG90eXBlLmlzR2VvbWV0cnlDaGFuZ2VkPWZ1bmN0aW9uKCl7cmV0dXJuITF9LFZ1LnByb3RvdHlwZS5nZXRNYXhQb2ludERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heFB0RGlzdH0sVnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1dvXX0sVnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFZ1fTt2YXIgR3U9ZnVuY3Rpb24odCxlLG4pe3RoaXMuX21pblZhbGlkRGlzdGFuY2U9bnVsbCx0aGlzLl9tYXhWYWxpZERpc3RhbmNlPW51bGwsdGhpcy5fbWluRGlzdGFuY2VGb3VuZD1udWxsLHRoaXMuX21heERpc3RhbmNlRm91bmQ9bnVsbCx0aGlzLl9pc1ZhbGlkPSEwLHRoaXMuX2Vyck1zZz1udWxsLHRoaXMuX2Vycm9yTG9jYXRpb249bnVsbCx0aGlzLl9lcnJvckluZGljYXRvcj1udWxsLHRoaXMuX2lucHV0PXR8fG51bGwsdGhpcy5fYnVmRGlzdGFuY2U9ZXx8bnVsbCx0aGlzLl9yZXN1bHQ9bnx8bnVsbH0sWXU9e1ZFUkJPU0U6e2NvbmZpZ3VyYWJsZTohMH0sTUFYX0RJU1RBTkNFX0RJRkZfRlJBQzp7Y29uZmlndXJhYmxlOiEwfX07R3UucHJvdG90eXBlLmNoZWNrTWF4aW11bURpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcganUoZSx0KTtpZihyLnNldERlbnNpZnlGcmFjdGlvbiguMjUpLHRoaXMuX21heERpc3RhbmNlRm91bmQ9ci5vcmllbnRlZERpc3RhbmNlKCksdGhpcy5fbWF4RGlzdGFuY2VGb3VuZD5uKXt0aGlzLl9pc1ZhbGlkPSExO3ZhciBpPXIuZ2V0Q29vcmRpbmF0ZXMoKTt0aGlzLl9lcnJvckxvY2F0aW9uPWlbMV0sdGhpcy5fZXJyb3JJbmRpY2F0b3I9dC5nZXRGYWN0b3J5KCkuY3JlYXRlTGluZVN0cmluZyhpKSx0aGlzLl9lcnJNc2c9IkRpc3RhbmNlIGJldHdlZW4gYnVmZmVyIGN1cnZlIGFuZCBpbnB1dCBpcyB0b28gbGFyZ2UgKCIrdGhpcy5fbWF4RGlzdGFuY2VGb3VuZCsiIGF0ICIrWGkudG9MaW5lU3RyaW5nKGlbMF0saVsxXSkrIikifX0sR3UucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXt2YXIgdD1NYXRoLmFicyh0aGlzLl9idWZEaXN0YW5jZSksZT1HdS5NQVhfRElTVEFOQ0VfRElGRl9GUkFDKnQ7cmV0dXJuIHRoaXMuX21pblZhbGlkRGlzdGFuY2U9dC1lLHRoaXMuX21heFZhbGlkRGlzdGFuY2U9dCtlLCEoIXRoaXMuX2lucHV0LmlzRW1wdHkoKSYmIXRoaXMuX3Jlc3VsdC5pc0VtcHR5KCkpfHwodGhpcy5fYnVmRGlzdGFuY2U+MD90aGlzLmNoZWNrUG9zaXRpdmVWYWxpZCgpOnRoaXMuY2hlY2tOZWdhdGl2ZVZhbGlkKCksR3UuVkVSQk9TRSYma2kub3V0LnByaW50bG4oIk1pbiBEaXN0PSAiK3RoaXMuX21pbkRpc3RhbmNlRm91bmQrIiAgZXJyPSAiKygxLXRoaXMuX21pbkRpc3RhbmNlRm91bmQvdGhpcy5fYnVmRGlzdGFuY2UpKyIgIE1heCBEaXN0PSAiK3RoaXMuX21heERpc3RhbmNlRm91bmQrIiAgZXJyPSAiKyh0aGlzLl9tYXhEaXN0YW5jZUZvdW5kL3RoaXMuX2J1ZkRpc3RhbmNlLTEpKSx0aGlzLl9pc1ZhbGlkKX0sR3UucHJvdG90eXBlLmNoZWNrTmVnYXRpdmVWYWxpZD1mdW5jdGlvbigpe2lmKCEodGhpcy5faW5wdXQgaW5zdGFuY2VvZiBoc3x8dGhpcy5faW5wdXQgaW5zdGFuY2VvZiBkc3x8dGhpcy5faW5wdXQgaW5zdGFuY2VvZiBIbykpcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5nZXRQb2x5Z29uTGluZXModGhpcy5faW5wdXQpO2lmKHRoaXMuY2hlY2tNaW5pbXVtRGlzdGFuY2UodCx0aGlzLl9yZXN1bHQsdGhpcy5fbWluVmFsaWREaXN0YW5jZSksIXRoaXMuX2lzVmFsaWQpcmV0dXJuIG51bGw7dGhpcy5jaGVja01heGltdW1EaXN0YW5jZSh0LHRoaXMuX3Jlc3VsdCx0aGlzLl9tYXhWYWxpZERpc3RhbmNlKX0sR3UucHJvdG90eXBlLmdldEVycm9ySW5kaWNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vycm9ySW5kaWNhdG9yfSxHdS5wcm90b3R5cGUuY2hlY2tNaW5pbXVtRGlzdGFuY2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBCdSh0LGUsbik7aWYodGhpcy5fbWluRGlzdGFuY2VGb3VuZD1yLmRpc3RhbmNlKCksdGhpcy5fbWluRGlzdGFuY2VGb3VuZDxuKXt0aGlzLl9pc1ZhbGlkPSExO3ZhciBpPXIubmVhcmVzdFBvaW50cygpO3RoaXMuX2Vycm9yTG9jYXRpb249ci5uZWFyZXN0UG9pbnRzKClbMV0sdGhpcy5fZXJyb3JJbmRpY2F0b3I9dC5nZXRGYWN0b3J5KCkuY3JlYXRlTGluZVN0cmluZyhpKSx0aGlzLl9lcnJNc2c9IkRpc3RhbmNlIGJldHdlZW4gYnVmZmVyIGN1cnZlIGFuZCBpbnB1dCBpcyB0b28gc21hbGwgKCIrdGhpcy5fbWluRGlzdGFuY2VGb3VuZCsiIGF0ICIrWGkudG9MaW5lU3RyaW5nKGlbMF0saVsxXSkrIiApIn19LEd1LnByb3RvdHlwZS5jaGVja1Bvc2l0aXZlVmFsaWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9yZXN1bHQuZ2V0Qm91bmRhcnkoKTtpZih0aGlzLmNoZWNrTWluaW11bURpc3RhbmNlKHRoaXMuX2lucHV0LHQsdGhpcy5fbWluVmFsaWREaXN0YW5jZSksIXRoaXMuX2lzVmFsaWQpcmV0dXJuIG51bGw7dGhpcy5jaGVja01heGltdW1EaXN0YW5jZSh0aGlzLl9pbnB1dCx0LHRoaXMuX21heFZhbGlkRGlzdGFuY2UpfSxHdS5wcm90b3R5cGUuZ2V0RXJyb3JMb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJvckxvY2F0aW9ufSxHdS5wcm90b3R5cGUuZ2V0UG9seWdvbkxpbmVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj1uZXcgRnUoZSkscj1NdS5nZXRQb2x5Z29ucyh0KS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7ci5uZXh0KCkuYXBwbHkobil9cmV0dXJuIHQuZ2V0RmFjdG9yeSgpLmJ1aWxkR2VvbWV0cnkoZSl9LEd1LnByb3RvdHlwZS5nZXRFcnJvck1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyTXNnfSxHdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sR3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEd1fSxZdS5WRVJCT1NFLmdldD1mdW5jdGlvbigpe3JldHVybiExfSxZdS5NQVhfRElTVEFOQ0VfRElGRl9GUkFDLmdldD1mdW5jdGlvbigpe3JldHVybi4wMTJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEd1LFl1KTt2YXIgWHU9ZnVuY3Rpb24odCxlLG4pe3RoaXMuX2lzVmFsaWQ9ITAsdGhpcy5fZXJyb3JNc2c9bnVsbCx0aGlzLl9lcnJvckxvY2F0aW9uPW51bGwsdGhpcy5fZXJyb3JJbmRpY2F0b3I9bnVsbCx0aGlzLl9pbnB1dD10fHxudWxsLHRoaXMuX2Rpc3RhbmNlPWV8fG51bGwsdGhpcy5fcmVzdWx0PW58fG51bGx9LFd1PXtWRVJCT1NFOntjb25maWd1cmFibGU6ITB9LE1BWF9FTlZfRElGRl9GUkFDOntjb25maWd1cmFibGU6ITB9fTtYdS5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNoZWNrUG9seWdvbmFsKCksdGhpcy5faXNWYWxpZD8odGhpcy5jaGVja0V4cGVjdGVkRW1wdHkoKSx0aGlzLl9pc1ZhbGlkPyh0aGlzLmNoZWNrRW52ZWxvcGUoKSx0aGlzLl9pc1ZhbGlkPyh0aGlzLmNoZWNrQXJlYSgpLHRoaXMuX2lzVmFsaWQ/KHRoaXMuY2hlY2tEaXN0YW5jZSgpLHRoaXMuX2lzVmFsaWQpOnRoaXMuX2lzVmFsaWQpOnRoaXMuX2lzVmFsaWQpOnRoaXMuX2lzVmFsaWQpOnRoaXMuX2lzVmFsaWR9LFh1LnByb3RvdHlwZS5jaGVja0VudmVsb3BlPWZ1bmN0aW9uKCl7aWYodGhpcy5fZGlzdGFuY2U8MClyZXR1cm4gbnVsbDt2YXIgdD10aGlzLl9kaXN0YW5jZSpYdS5NQVhfRU5WX0RJRkZfRlJBQzswPT09dCYmKHQ9LjAwMSk7dmFyIGU9bmV3IGppKHRoaXMuX2lucHV0LmdldEVudmVsb3BlSW50ZXJuYWwoKSk7ZS5leHBhbmRCeSh0aGlzLl9kaXN0YW5jZSk7dmFyIG49bmV3IGppKHRoaXMuX3Jlc3VsdC5nZXRFbnZlbG9wZUludGVybmFsKCkpO24uZXhwYW5kQnkodCksbi5jb250YWlucyhlKXx8KHRoaXMuX2lzVmFsaWQ9ITEsdGhpcy5fZXJyb3JNc2c9IkJ1ZmZlciBlbnZlbG9wZSBpcyBpbmNvcnJlY3QiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX2lucHV0LmdldEZhY3RvcnkoKS50b0dlb21ldHJ5KG4pKSx0aGlzLnJlcG9ydCgiRW52ZWxvcGUiKX0sWHUucHJvdG90eXBlLmNoZWNrRGlzdGFuY2U9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgR3UodGhpcy5faW5wdXQsdGhpcy5fZGlzdGFuY2UsdGhpcy5fcmVzdWx0KTt0LmlzVmFsaWQoKXx8KHRoaXMuX2lzVmFsaWQ9ITEsdGhpcy5fZXJyb3JNc2c9dC5nZXRFcnJvck1lc3NhZ2UoKSx0aGlzLl9lcnJvckxvY2F0aW9uPXQuZ2V0RXJyb3JMb2NhdGlvbigpLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXQuZ2V0RXJyb3JJbmRpY2F0b3IoKSksdGhpcy5yZXBvcnQoIkRpc3RhbmNlIil9LFh1LnByb3RvdHlwZS5jaGVja0FyZWE9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9pbnB1dC5nZXRBcmVhKCksZT10aGlzLl9yZXN1bHQuZ2V0QXJlYSgpO3RoaXMuX2Rpc3RhbmNlPjAmJnQ+ZSYmKHRoaXMuX2lzVmFsaWQ9ITEsdGhpcy5fZXJyb3JNc2c9IkFyZWEgb2YgcG9zaXRpdmUgYnVmZmVyIGlzIHNtYWxsZXIgdGhhbiBpbnB1dCIsdGhpcy5fZXJyb3JJbmRpY2F0b3I9dGhpcy5fcmVzdWx0KSx0aGlzLl9kaXN0YW5jZTwwJiZ0PGUmJih0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPSJBcmVhIG9mIG5lZ2F0aXZlIGJ1ZmZlciBpcyBsYXJnZXIgdGhhbiBpbnB1dCIsdGhpcy5fZXJyb3JJbmRpY2F0b3I9dGhpcy5fcmVzdWx0KSx0aGlzLnJlcG9ydCgiQXJlYSIpfSxYdS5wcm90b3R5cGUuY2hlY2tQb2x5Z29uYWw9ZnVuY3Rpb24oKXt0aGlzLl9yZXN1bHQgaW5zdGFuY2VvZiBoc3x8dGhpcy5fcmVzdWx0IGluc3RhbmNlb2YgZHN8fCh0aGlzLl9pc1ZhbGlkPSExKSx0aGlzLl9lcnJvck1zZz0iUmVzdWx0IGlzIG5vdCBwb2x5Z29uYWwiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX3Jlc3VsdCx0aGlzLnJlcG9ydCgiUG9seWdvbmFsIil9LFh1LnByb3RvdHlwZS5nZXRFcnJvckluZGljYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJvckluZGljYXRvcn0sWHUucHJvdG90eXBlLmdldEVycm9yTG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyb3JMb2NhdGlvbn0sWHUucHJvdG90eXBlLmNoZWNrRXhwZWN0ZWRFbXB0eT1mdW5jdGlvbigpe2lmKHRoaXMuX2lucHV0LmdldERpbWVuc2lvbigpPj0yfHx0aGlzLl9kaXN0YW5jZT4wKXJldHVybiBudWxsO3RoaXMuX3Jlc3VsdC5pc0VtcHR5KCl8fCh0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPSJSZXN1bHQgaXMgbm9uLWVtcHR5Iix0aGlzLl9lcnJvckluZGljYXRvcj10aGlzLl9yZXN1bHQpLHRoaXMucmVwb3J0KCJFeHBlY3RlZEVtcHR5Iil9LFh1LnByb3RvdHlwZS5yZXBvcnQ9ZnVuY3Rpb24odCl7aWYoIVh1LlZFUkJPU0UpcmV0dXJuIG51bGw7a2kub3V0LnByaW50bG4oIkNoZWNrICIrdCsiOiAiKyh0aGlzLl9pc1ZhbGlkPyJwYXNzZWQiOiJGQUlMRUQiKSl9LFh1LnByb3RvdHlwZS5nZXRFcnJvck1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyb3JNc2d9LFh1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxYdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWHV9LFh1LmlzVmFsaWRNc2c9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBYdSh0LGUsbik7cmV0dXJuIHIuaXNWYWxpZCgpP251bGw6ci5nZXRFcnJvck1lc3NhZ2UoKX0sWHUuaXNWYWxpZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuISFuZXcgWHUodCxlLG4pLmlzVmFsaWQoKX0sV3UuVkVSQk9TRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sV3UuTUFYX0VOVl9ESUZGX0ZSQUMuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLjAxMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoWHUsV3UpO3ZhciBIdT1mdW5jdGlvbigpe3RoaXMuX3B0cz1udWxsLHRoaXMuX2RhdGE9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fcHRzPXQsdGhpcy5fZGF0YT1lfTtIdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRzfSxIdS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHMubGVuZ3RofSxIdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHRzW3RdfSxIdS5wcm90b3R5cGUuaXNDbG9zZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRzWzBdLmVxdWFscyh0aGlzLl9wdHNbdGhpcy5fcHRzLmxlbmd0aC0xXSl9LEh1LnByb3RvdHlwZS5nZXRTZWdtZW50T2N0YW50PWZ1bmN0aW9uKHQpe3JldHVybiB0PT09dGhpcy5fcHRzLmxlbmd0aC0xPy0xOnZhLm9jdGFudCh0aGlzLmdldENvb3JkaW5hdGUodCksdGhpcy5nZXRDb29yZGluYXRlKHQrMSkpfSxIdS5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbih0KXt0aGlzLl9kYXRhPXR9LEh1LnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9LEh1LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBYaS50b0xpbmVTdHJpbmcobmV3IHhzKHRoaXMuX3B0cykpfSxIdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bX2FdfSxIdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSHV9O3ZhciBadT1mdW5jdGlvbigpe3RoaXMuX2ZpbmRBbGxJbnRlcnNlY3Rpb25zPSExLHRoaXMuX2lzQ2hlY2tFbmRTZWdtZW50c09ubHk9ITEsdGhpcy5fbGk9bnVsbCx0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbj1udWxsLHRoaXMuX2ludFNlZ21lbnRzPW51bGwsdGhpcy5faW50ZXJzZWN0aW9ucz1uZXcgeG8sdGhpcy5faW50ZXJzZWN0aW9uQ291bnQ9MCx0aGlzLl9rZWVwSW50ZXJzZWN0aW9ucz0hMDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbGk9dCx0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbj1udWxsfTtadS5wcm90b3R5cGUuZ2V0SW50ZXJpb3JJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb259LFp1LnByb3RvdHlwZS5zZXRDaGVja0VuZFNlZ21lbnRzT25seT1mdW5jdGlvbih0KXt0aGlzLl9pc0NoZWNrRW5kU2VnbWVudHNPbmx5PXR9LFp1LnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb25TZWdtZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnRTZWdtZW50c30sWnUucHJvdG90eXBlLmNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludGVyc2VjdGlvbkNvdW50fSxadS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnRlcnNlY3Rpb25zfSxadS5wcm90b3R5cGUuc2V0RmluZEFsbEludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCl7dGhpcy5fZmluZEFsbEludGVyc2VjdGlvbnM9dH0sWnUucHJvdG90eXBlLnNldEtlZXBJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQpe3RoaXMuX2tlZXBJbnRlcnNlY3Rpb25zPXR9LFp1LnByb3RvdHlwZS5wcm9jZXNzSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbixyKXtpZighdGhpcy5fZmluZEFsbEludGVyc2VjdGlvbnMmJnRoaXMuaGFzSW50ZXJzZWN0aW9uKCl8fHQ9PT1uJiZlPT09cilyZXR1cm4gbnVsbDtpZih0aGlzLl9pc0NoZWNrRW5kU2VnbWVudHNPbmx5JiYhKHRoaXMuaXNFbmRTZWdtZW50KHQsZSl8fHRoaXMuaXNFbmRTZWdtZW50KG4scikpKXJldHVybiBudWxsO3ZhciBpPXQuZ2V0Q29vcmRpbmF0ZXMoKVtlXSxvPXQuZ2V0Q29vcmRpbmF0ZXMoKVtlKzFdLHM9bi5nZXRDb29yZGluYXRlcygpW3JdLGE9bi5nZXRDb29yZGluYXRlcygpW3IrMV07dGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbihpLG8scyxhKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSYmdGhpcy5fbGkuaXNJbnRlcmlvckludGVyc2VjdGlvbigpJiYodGhpcy5faW50U2VnbWVudHM9bmV3IEFycmF5KDQpLmZpbGwobnVsbCksdGhpcy5faW50U2VnbWVudHNbMF09aSx0aGlzLl9pbnRTZWdtZW50c1sxXT1vLHRoaXMuX2ludFNlZ21lbnRzWzJdPXMsdGhpcy5faW50U2VnbWVudHNbM109YSx0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbj10aGlzLl9saS5nZXRJbnRlcnNlY3Rpb24oMCksdGhpcy5fa2VlcEludGVyc2VjdGlvbnMmJnRoaXMuX2ludGVyc2VjdGlvbnMuYWRkKHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uKSx0aGlzLl9pbnRlcnNlY3Rpb25Db3VudCsrKX0sWnUucHJvdG90eXBlLmlzRW5kU2VnbWVudD1mdW5jdGlvbih0LGUpe3JldHVybiAwPT09ZXx8ZT49dC5zaXplKCktMn0sWnUucHJvdG90eXBlLmhhc0ludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb259LFp1LnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fZmluZEFsbEludGVyc2VjdGlvbnMmJm51bGwhPT10aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbn0sWnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2V1XX0sWnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFp1fSxadS5jcmVhdGVBbGxJbnRlcnNlY3Rpb25zRmluZGVyPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBadSh0KTtyZXR1cm4gZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucyghMCksZX0sWnUuY3JlYXRlQW55SW50ZXJzZWN0aW9uRmluZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWnUodCl9LFp1LmNyZWF0ZUludGVyc2VjdGlvbkNvdW50ZXI9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFp1KHQpO3JldHVybiBlLnNldEZpbmRBbGxJbnRlcnNlY3Rpb25zKCEwKSxlLnNldEtlZXBJbnRlcnNlY3Rpb25zKCExKSxlfTt2YXIgS3U9ZnVuY3Rpb24oKXt0aGlzLl9saT1uZXcgUWksdGhpcy5fc2VnU3RyaW5ncz1udWxsLHRoaXMuX2ZpbmRBbGxJbnRlcnNlY3Rpb25zPSExLHRoaXMuX3NlZ0ludD1udWxsLHRoaXMuX2lzVmFsaWQ9ITA7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX3NlZ1N0cmluZ3M9dH07S3UucHJvdG90eXBlLmV4ZWN1dGU9ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy5fc2VnSW50KXJldHVybiBudWxsO3RoaXMuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnMoKX0sS3UucHJvdG90eXBlLmdldEludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VnSW50LmdldEludGVyc2VjdGlvbnMoKX0sS3UucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5leGVjdXRlKCksdGhpcy5faXNWYWxpZH0sS3UucHJvdG90eXBlLnNldEZpbmRBbGxJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQpe3RoaXMuX2ZpbmRBbGxJbnRlcnNlY3Rpb25zPXR9LEt1LnByb3RvdHlwZS5jaGVja0ludGVyaW9ySW50ZXJzZWN0aW9ucz1mdW5jdGlvbigpe3RoaXMuX2lzVmFsaWQ9ITAsdGhpcy5fc2VnSW50PW5ldyBadSh0aGlzLl9saSksdGhpcy5fc2VnSW50LnNldEZpbmRBbGxJbnRlcnNlY3Rpb25zKHRoaXMuX2ZpbmRBbGxJbnRlcnNlY3Rpb25zKTt2YXIgdD1uZXcgSWE7aWYodC5zZXRTZWdtZW50SW50ZXJzZWN0b3IodGhpcy5fc2VnSW50KSx0LmNvbXB1dGVOb2Rlcyh0aGlzLl9zZWdTdHJpbmdzKSx0aGlzLl9zZWdJbnQuaGFzSW50ZXJzZWN0aW9uKCkpcmV0dXJuIHRoaXMuX2lzVmFsaWQ9ITEsbnVsbH0sS3UucHJvdG90eXBlLmNoZWNrVmFsaWQ9ZnVuY3Rpb24oKXtpZih0aGlzLmV4ZWN1dGUoKSwhdGhpcy5faXNWYWxpZCl0aHJvdyBuZXcgUnModGhpcy5nZXRFcnJvck1lc3NhZ2UoKSx0aGlzLl9zZWdJbnQuZ2V0SW50ZXJpb3JJbnRlcnNlY3Rpb24oKSl9LEt1LnByb3RvdHlwZS5nZXRFcnJvck1lc3NhZ2U9ZnVuY3Rpb24oKXtpZih0aGlzLl9pc1ZhbGlkKXJldHVybiJubyBpbnRlcnNlY3Rpb25zIGZvdW5kIjt2YXIgdD10aGlzLl9zZWdJbnQuZ2V0SW50ZXJzZWN0aW9uU2VnbWVudHMoKTtyZXR1cm4iZm91bmQgbm9uLW5vZGVkIGludGVyc2VjdGlvbiBiZXR3ZWVuICIrWGkudG9MaW5lU3RyaW5nKHRbMF0sdFsxXSkrIiBhbmQgIitYaS50b0xpbmVTdHJpbmcodFsyXSx0WzNdKX0sS3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEt1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBLdX0sS3UuY29tcHV0ZUludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEt1KHQpO3JldHVybiBlLnNldEZpbmRBbGxJbnRlcnNlY3Rpb25zKCEwKSxlLmlzVmFsaWQoKSxlLmdldEludGVyc2VjdGlvbnMoKX07dmFyIEp1PWZ1bmN0aW9uIHQoKXt0aGlzLl9udj1udWxsO3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9udj1uZXcgS3UodC50b1NlZ21lbnRTdHJpbmdzKGUpKX07SnUucHJvdG90eXBlLmNoZWNrVmFsaWQ9ZnVuY3Rpb24oKXt0aGlzLl9udi5jaGVja1ZhbGlkKCl9LEp1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxKdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSnV9LEp1LnRvU2VnbWVudFN0cmluZ3M9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPXQuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2UuYWRkKG5ldyBIdShyLmdldENvb3JkaW5hdGVzKCkscikpfXJldHVybiBlfSxKdS5jaGVja1ZhbGlkPWZ1bmN0aW9uKHQpe25ldyBKdSh0KS5jaGVja1ZhbGlkKCl9O3ZhciBRdT1mdW5jdGlvbih0KXt0aGlzLl9tYXBPcD10fTtRdS5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj0wO248dC5nZXROdW1HZW9tZXRyaWVzKCk7bisrKXt2YXIgcj10aGlzLl9tYXBPcC5tYXAodC5nZXRHZW9tZXRyeU4obikpO3IuaXNFbXB0eSgpfHxlLmFkZChyKX1yZXR1cm4gdC5nZXRGYWN0b3J5KCkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKElzLnRvR2VvbWV0cnlBcnJheShlKSl9LFF1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxRdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUXV9LFF1Lm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgUXUoZSkubWFwKHQpfTt2YXIgJHU9ZnVuY3Rpb24oKXt0aGlzLl9vcD1udWxsLHRoaXMuX2dlb21ldHJ5RmFjdG9yeT1udWxsLHRoaXMuX3B0TG9jYXRvcj1udWxsLHRoaXMuX2xpbmVFZGdlc0xpc3Q9bmV3IHhvLHRoaXMuX3Jlc3VsdExpbmVMaXN0PW5ldyB4bzt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07dGhpcy5fb3A9dCx0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9ZSx0aGlzLl9wdExvY2F0b3I9bn07JHUucHJvdG90eXBlLmNvbGxlY3RMaW5lcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPXRoaXMuX29wLmdldEdyYXBoKCkuZ2V0RWRnZUVuZHMoKS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ZS5jb2xsZWN0TGluZUVkZ2Uocix0LGUuX2xpbmVFZGdlc0xpc3QpLGUuY29sbGVjdEJvdW5kYXJ5VG91Y2hFZGdlKHIsdCxlLl9saW5lRWRnZXNMaXN0KX19LCR1LnByb3RvdHlwZS5sYWJlbElzb2xhdGVkTGluZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3B0TG9jYXRvci5sb2NhdGUodC5nZXRDb29yZGluYXRlKCksdGhpcy5fb3AuZ2V0QXJnR2VvbWV0cnkoZSkpO3QuZ2V0TGFiZWwoKS5zZXRMb2NhdGlvbihlLG4pfSwkdS5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmluZENvdmVyZWRMaW5lRWRnZXMoKSx0aGlzLmNvbGxlY3RMaW5lcyh0KSx0aGlzLmJ1aWxkTGluZXModCksdGhpcy5fcmVzdWx0TGluZUxpc3R9LCR1LnByb3RvdHlwZS5jb2xsZWN0TGluZUVkZ2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuZ2V0TGFiZWwoKSxpPXQuZ2V0RWRnZSgpO3QuaXNMaW5lRWRnZSgpJiYhdC5pc1Zpc2l0ZWQoKSYmT2MuaXNSZXN1bHRPZk9wKHIsZSkmJiFpLmlzQ292ZXJlZCgpJiYobi5hZGQoaSksdC5zZXRWaXNpdGVkRWRnZSghMCkpfSwkdS5wcm90b3R5cGUuZmluZENvdmVyZWRMaW5lRWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fb3AuZ2V0R3JhcGgoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt0Lm5leHQoKS5nZXRFZGdlcygpLmZpbmRDb3ZlcmVkTGluZUVkZ2VzKCl9Zm9yKHZhciBlPXRoaXMuX29wLmdldEdyYXBoKCkuZ2V0RWRnZUVuZHMoKS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkscj1uLmdldEVkZ2UoKTtpZihuLmlzTGluZUVkZ2UoKSYmIXIuaXNDb3ZlcmVkU2V0KCkpe3ZhciBpPXRoaXMuX29wLmlzQ292ZXJlZEJ5QShuLmdldENvb3JkaW5hdGUoKSk7ci5zZXRDb3ZlcmVkKGkpfX19LCR1LnByb3RvdHlwZS5sYWJlbElzb2xhdGVkTGluZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLHI9bi5nZXRMYWJlbCgpO24uaXNJc29sYXRlZCgpJiYoci5pc051bGwoMCk/dGhpcy5sYWJlbElzb2xhdGVkTGluZShuLDApOnRoaXMubGFiZWxJc29sYXRlZExpbmUobiwxKSl9fSwkdS5wcm90b3R5cGUuYnVpbGRMaW5lcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fbGluZUVkZ2VzTGlzdC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkscj10aGlzLl9nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZVN0cmluZyhuLmdldENvb3JkaW5hdGVzKCkpO3RoaXMuX3Jlc3VsdExpbmVMaXN0LmFkZChyKSxuLnNldEluUmVzdWx0KCEwKX19LCR1LnByb3RvdHlwZS5jb2xsZWN0Qm91bmRhcnlUb3VjaEVkZ2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuZ2V0TGFiZWwoKTtpZih0LmlzTGluZUVkZ2UoKXx8dC5pc1Zpc2l0ZWQoKXx8dC5pc0ludGVyaW9yQXJlYUVkZ2UoKXx8dC5nZXRFZGdlKCkuaXNJblJlc3VsdCgpKXJldHVybiBudWxsO1ppLmlzVHJ1ZSghKHQuaXNJblJlc3VsdCgpfHx0LmdldFN5bSgpLmlzSW5SZXN1bHQoKSl8fCF0LmdldEVkZ2UoKS5pc0luUmVzdWx0KCkpLE9jLmlzUmVzdWx0T2ZPcChyLGUpJiZlPT09T2MuSU5URVJTRUNUSU9OJiYobi5hZGQodC5nZXRFZGdlKCkpLHQuc2V0VmlzaXRlZEVkZ2UoITApKX0sJHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LCR1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiAkdX07dmFyIHRjPWZ1bmN0aW9uKCl7dGhpcy5fb3A9bnVsbCx0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9bnVsbCx0aGlzLl9yZXN1bHRQb2ludExpc3Q9bmV3IHhvO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9vcD10LHRoaXMuX2dlb21ldHJ5RmFjdG9yeT1lfTt0Yy5wcm90b3R5cGUuZmlsdGVyQ292ZXJlZE5vZGVUb1BvaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0Q29vcmRpbmF0ZSgpO2lmKCF0aGlzLl9vcC5pc0NvdmVyZWRCeUxBKGUpKXt2YXIgbj10aGlzLl9nZW9tZXRyeUZhY3RvcnkuY3JlYXRlUG9pbnQoZSk7dGhpcy5fcmVzdWx0UG9pbnRMaXN0LmFkZChuKX19LHRjLnByb3RvdHlwZS5leHRyYWN0Tm9uQ292ZXJlZFJlc3VsdE5vZGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9vcC5nZXRHcmFwaCgpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO2lmKCEobi5pc0luUmVzdWx0KCl8fG4uaXNJbmNpZGVudEVkZ2VJblJlc3VsdCgpfHwwIT09bi5nZXRFZGdlcygpLmdldERlZ3JlZSgpJiZ0IT09T2MuSU5URVJTRUNUSU9OKSl7dmFyIHI9bi5nZXRMYWJlbCgpO09jLmlzUmVzdWx0T2ZPcChyLHQpJiZ0aGlzLmZpbHRlckNvdmVyZWROb2RlVG9Qb2ludChuKX19fSx0Yy5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZXh0cmFjdE5vbkNvdmVyZWRSZXN1bHROb2Rlcyh0KSx0aGlzLl9yZXN1bHRQb2ludExpc3R9LHRjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx0Yy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGN9O3ZhciBlYz1mdW5jdGlvbigpe3RoaXMuX2lucHV0R2VvbT1udWxsLHRoaXMuX2ZhY3Rvcnk9bnVsbCx0aGlzLl9wcnVuZUVtcHR5R2VvbWV0cnk9ITAsdGhpcy5fcHJlc2VydmVHZW9tZXRyeUNvbGxlY3Rpb25UeXBlPSEwLHRoaXMuX3ByZXNlcnZlQ29sbGVjdGlvbnM9ITEsdGhpcy5fcHJlc2VydmVUeXBlPSExfTtlYy5wcm90b3R5cGUudHJhbnNmb3JtUG9pbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZmFjdG9yeS5jcmVhdGVQb2ludCh0aGlzLnRyYW5zZm9ybUNvb3JkaW5hdGVzKHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksdCkpfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtUG9seWdvbj1mdW5jdGlvbih0LGUpe3ZhciBuPSEwLHI9dGhpcy50cmFuc2Zvcm1MaW5lYXJSaW5nKHQuZ2V0RXh0ZXJpb3JSaW5nKCksdCk7KG51bGw9PT1yfHwhKHIgaW5zdGFuY2VvZiBwcyl8fHIuaXNFbXB0eSgpKSYmKG49ITEpO2Zvcih2YXIgaT1uZXcgeG8sbz0wO288dC5nZXROdW1JbnRlcmlvclJpbmcoKTtvKyspe3ZhciBzPXRoaXMudHJhbnNmb3JtTGluZWFyUmluZyh0LmdldEludGVyaW9yUmluZ04obyksdCk7bnVsbD09PXN8fHMuaXNFbXB0eSgpfHwocyBpbnN0YW5jZW9mIHBzfHwobj0hMSksaS5hZGQocykpfWlmKG4pcmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9seWdvbihyLGkudG9BcnJheShbXSkpO3ZhciBhPW5ldyB4bztyZXR1cm4gbnVsbCE9PXImJmEuYWRkKHIpLGEuYWRkQWxsKGkpLHRoaXMuX2ZhY3RvcnkuYnVpbGRHZW9tZXRyeShhKX0sZWMucHJvdG90eXBlLmNyZWF0ZUNvb3JkaW5hdGVTZXF1ZW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZmFjdG9yeS5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKHQpfSxlYy5wcm90b3R5cGUuZ2V0SW5wdXRHZW9tZXRyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnB1dEdlb219LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1NdWx0aUxpbmVTdHJpbmc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IHhvLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9dGhpcy50cmFuc2Zvcm1MaW5lU3RyaW5nKHQuZ2V0R2VvbWV0cnlOKHIpLHQpO251bGwhPT1pJiYoaS5pc0VtcHR5KCl8fG4uYWRkKGkpKX1yZXR1cm4gdGhpcy5fZmFjdG9yeS5idWlsZEdlb21ldHJ5KG4pfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtQ29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb3B5KHQpfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtTGluZVN0cmluZz1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9mYWN0b3J5LmNyZWF0ZUxpbmVTdHJpbmcodGhpcy50cmFuc2Zvcm1Db29yZGluYXRlcyh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpKX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybU11bHRpUG9pbnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IHhvLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9dGhpcy50cmFuc2Zvcm1Qb2ludCh0LmdldEdlb21ldHJ5TihyKSx0KTtudWxsIT09aSYmKGkuaXNFbXB0eSgpfHxuLmFkZChpKSl9cmV0dXJuIHRoaXMuX2ZhY3RvcnkuYnVpbGRHZW9tZXRyeShuKX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybU11bHRpUG9seWdvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgeG8scj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10aGlzLnRyYW5zZm9ybVBvbHlnb24odC5nZXRHZW9tZXRyeU4ociksdCk7bnVsbCE9PWkmJihpLmlzRW1wdHkoKXx8bi5hZGQoaSkpfXJldHVybiB0aGlzLl9mYWN0b3J5LmJ1aWxkR2VvbWV0cnkobil9LGVjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybUdlb21ldHJ5Q29sbGVjdGlvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgeG8scj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT10aGlzLnRyYW5zZm9ybSh0LmdldEdlb21ldHJ5TihyKSk7bnVsbCE9PWkmJih0aGlzLl9wcnVuZUVtcHR5R2VvbWV0cnkmJmkuaXNFbXB0eSgpfHxuLmFkZChpKSl9cmV0dXJuIHRoaXMuX3ByZXNlcnZlR2VvbWV0cnlDb2xsZWN0aW9uVHlwZT90aGlzLl9mYWN0b3J5LmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihJcy50b0dlb21ldHJ5QXJyYXkobikpOnRoaXMuX2ZhY3RvcnkuYnVpbGRHZW9tZXRyeShuKX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbih0KXtpZih0aGlzLl9pbnB1dEdlb209dCx0aGlzLl9mYWN0b3J5PXQuZ2V0RmFjdG9yeSgpLHQgaW5zdGFuY2VvZiBjcylyZXR1cm4gdGhpcy50cmFuc2Zvcm1Qb2ludCh0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBmcylyZXR1cm4gdGhpcy50cmFuc2Zvcm1NdWx0aVBvaW50KHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIHBzKXJldHVybiB0aGlzLnRyYW5zZm9ybUxpbmVhclJpbmcodCxudWxsKTtpZih0IGluc3RhbmNlb2YgYXMpcmV0dXJuIHRoaXMudHJhbnNmb3JtTGluZVN0cmluZyh0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBabylyZXR1cm4gdGhpcy50cmFuc2Zvcm1NdWx0aUxpbmVTdHJpbmcodCxudWxsKTtpZih0IGluc3RhbmNlb2YgaHMpcmV0dXJuIHRoaXMudHJhbnNmb3JtUG9seWdvbih0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBkcylyZXR1cm4gdGhpcy50cmFuc2Zvcm1NdWx0aVBvbHlnb24odCxudWxsKTtpZih0IGluc3RhbmNlb2YgSG8pcmV0dXJuIHRoaXMudHJhbnNmb3JtR2VvbWV0cnlDb2xsZWN0aW9uKHQsbnVsbCk7dGhyb3cgbmV3IGhpKCJVbmtub3duIEdlb21ldHJ5IHN1YnR5cGU6ICIrdC5nZXRDbGFzcygpLmdldE5hbWUoKSl9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1MaW5lYXJSaW5nPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy50cmFuc2Zvcm1Db29yZGluYXRlcyh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpO2lmKG51bGw9PT1uKXJldHVybiB0aGlzLl9mYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcobnVsbCk7dmFyIHI9bi5zaXplKCk7cmV0dXJuIHI+MCYmcjw0JiYhdGhpcy5fcHJlc2VydmVUeXBlP3RoaXMuX2ZhY3RvcnkuY3JlYXRlTGluZVN0cmluZyhuKTp0aGlzLl9mYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcobil9LGVjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZWN9O3ZhciBuYz1mdW5jdGlvbiB0KCl7aWYodGhpcy5fc25hcFRvbGVyYW5jZT0wLHRoaXMuX3NyY1B0cz1udWxsLHRoaXMuX3NlZz1uZXcgYmEsdGhpcy5fYWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXM9ITEsdGhpcy5faXNDbG9zZWQ9ITEsYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBhcyYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBlPWFyZ3VtZW50c1sxXTt0LmNhbGwodGhpcyxhcmd1bWVudHNbMF0uZ2V0Q29vcmRpbmF0ZXMoKSxlKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkmJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dGhpcy5fc3JjUHRzPW4sdGhpcy5faXNDbG9zZWQ9dC5pc0Nsb3NlZChuKSx0aGlzLl9zbmFwVG9sZXJhbmNlPXJ9fTtuYy5wcm90b3R5cGUuc25hcFZlcnRpY2VzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMuX2lzQ2xvc2VkP3Quc2l6ZSgpLTE6dC5zaXplKCkscj0wO3I8bjtyKyspe3ZhciBpPXQuZ2V0KHIpLG89dGhpcy5maW5kU25hcEZvclZlcnRleChpLGUpO251bGwhPT1vJiYodC5zZXQocixuZXcgdmkobykpLDA9PT1yJiZ0aGlzLl9pc0Nsb3NlZCYmdC5zZXQodC5zaXplKCktMSxuZXcgdmkobykpKX19LG5jLnByb3RvdHlwZS5maW5kU25hcEZvclZlcnRleD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXtpZih0LmVxdWFsczJEKGVbbl0pKXJldHVybiBudWxsO2lmKHQuZGlzdGFuY2UoZVtuXSk8dGhpcy5fc25hcFRvbGVyYW5jZSlyZXR1cm4gZVtuXX1yZXR1cm4gbnVsbH0sbmMucHJvdG90eXBlLnNuYXBUbz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgYm8odGhpcy5fc3JjUHRzKTtyZXR1cm4gdGhpcy5zbmFwVmVydGljZXMoZSx0KSx0aGlzLnNuYXBTZWdtZW50cyhlLHQpLGUudG9Db29yZGluYXRlQXJyYXkoKX0sbmMucHJvdG90eXBlLnNuYXBTZWdtZW50cz1mdW5jdGlvbih0LGUpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gbnVsbDt2YXIgbj1lLmxlbmd0aDtlWzBdLmVxdWFsczJEKGVbZS5sZW5ndGgtMV0pJiYobj1lLmxlbmd0aC0xKTtmb3IodmFyIHI9MDtyPG47cisrKXt2YXIgaT1lW3JdLG89dGhpcy5maW5kU2VnbWVudEluZGV4VG9TbmFwKGksdCk7bz49MCYmdC5hZGQobysxLG5ldyB2aShpKSwhMSl9fSxuYy5wcm90b3R5cGUuZmluZFNlZ21lbnRJbmRleFRvU25hcD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLHI9ZmkuTUFYX1ZBTFVFLGk9LTEsbz0wO288ZS5zaXplKCktMTtvKyspe2lmKG4uX3NlZy5wMD1lLmdldChvKSxuLl9zZWcucDE9ZS5nZXQobysxKSxuLl9zZWcucDAuZXF1YWxzMkQodCl8fG4uX3NlZy5wMS5lcXVhbHMyRCh0KSl7aWYobi5fYWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXMpY29udGludWU7cmV0dXJuLTF9dmFyIHM9bi5fc2VnLmRpc3RhbmNlKHQpO3M8bi5fc25hcFRvbGVyYW5jZSYmczxyJiYocj1zLGk9byl9cmV0dXJuIGl9LG5jLnByb3RvdHlwZS5zZXRBbGxvd1NuYXBwaW5nVG9Tb3VyY2VWZXJ0aWNlcz1mdW5jdGlvbih0KXt0aGlzLl9hbGxvd1NuYXBwaW5nVG9Tb3VyY2VWZXJ0aWNlcz10fSxuYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG5jfSxuYy5pc0Nsb3NlZD1mdW5jdGlvbih0KXtyZXR1cm4hKHQubGVuZ3RoPD0xKSYmdFswXS5lcXVhbHMyRCh0W3QubGVuZ3RoLTFdKX07dmFyIHJjPWZ1bmN0aW9uKHQpe3RoaXMuX3NyY0dlb209dHx8bnVsbH0saWM9e1NOQVBfUFJFQ0lTSU9OX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfX07cmMucHJvdG90eXBlLnNuYXBUbz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZXh0cmFjdFRhcmdldENvb3JkaW5hdGVzKHQpO3JldHVybiBuZXcgb2MoZSxuKS50cmFuc2Zvcm0odGhpcy5fc3JjR2VvbSl9LHJjLnByb3RvdHlwZS5zbmFwVG9TZWxmPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5leHRyYWN0VGFyZ2V0Q29vcmRpbmF0ZXModGhpcy5fc3JjR2VvbSkscj1uZXcgb2ModCxuLCEwKS50cmFuc2Zvcm0odGhpcy5fc3JjR2VvbSksaT1yO3JldHVybiBlJiZFaShpLGxzKSYmKGk9ci5idWZmZXIoMCkpLGl9LHJjLnByb3RvdHlwZS5jb21wdXRlU25hcFRvbGVyYW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb21wdXRlTWluaW11bVNlZ21lbnRMZW5ndGgodCkvMTB9LHJjLnByb3RvdHlwZS5leHRyYWN0VGFyZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBVbyxuPXQuZ2V0Q29vcmRpbmF0ZXMoKSxyPTA7cjxuLmxlbmd0aDtyKyspZS5hZGQobltyXSk7cmV0dXJuIGUudG9BcnJheShuZXcgQXJyYXkoMCkuZmlsbChudWxsKSl9LHJjLnByb3RvdHlwZS5jb21wdXRlTWluaW11bVNlZ21lbnRMZW5ndGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWZpLk1BWF9WQUxVRSxuPTA7bjx0Lmxlbmd0aC0xO24rKyl7dmFyIHI9dFtuXS5kaXN0YW5jZSh0W24rMV0pO3I8ZSYmKGU9cil9cmV0dXJuIGV9LHJjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxyYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcmN9LHJjLnNuYXA9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLGk9bmV3IHJjKHQpO3JbMF09aS5zbmFwVG8oZSxuKTt2YXIgbz1uZXcgcmMoZSk7cmV0dXJuIHJbMV09by5zbmFwVG8oclswXSxuKSxyfSxyYy5jb21wdXRlT3ZlcmxheVNuYXBUb2xlcmFuY2U9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9cmMuY29tcHV0ZVNpemVCYXNlZFNuYXBUb2xlcmFuY2UodCksbj10LmdldFByZWNpc2lvbk1vZGVsKCk7aWYobi5nZXRUeXBlKCk9PT1Dcy5GSVhFRCl7dmFyIHI9MS9uLmdldFNjYWxlKCkqMi8xLjQxNTtyPmUmJihlPXIpfXJldHVybiBlfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV07cmV0dXJuIE1hdGgubWluKHJjLmNvbXB1dGVPdmVybGF5U25hcFRvbGVyYW5jZShpKSxyYy5jb21wdXRlT3ZlcmxheVNuYXBUb2xlcmFuY2UobykpfX0scmMuY29tcHV0ZVNpemVCYXNlZFNuYXBUb2xlcmFuY2U9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRFbnZlbG9wZUludGVybmFsKCk7cmV0dXJuIE1hdGgubWluKGUuZ2V0SGVpZ2h0KCksZS5nZXRXaWR0aCgpKSpyYy5TTkFQX1BSRUNJU0lPTl9GQUNUT1J9LHJjLnNuYXBUb1NlbGY9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuZXcgcmModCkuc25hcFRvU2VsZihlLG4pfSxpYy5TTkFQX1BSRUNJU0lPTl9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJjLGljKTt2YXIgb2M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4scil7dC5jYWxsKHRoaXMpLHRoaXMuX3NuYXBUb2xlcmFuY2U9ZXx8bnVsbCx0aGlzLl9zbmFwUHRzPW58fG51bGwsdGhpcy5faXNTZWxmU25hcD12b2lkIDAhPT1yJiZyfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5zbmFwTGluZT1mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBuYyh0LHRoaXMuX3NuYXBUb2xlcmFuY2UpO3JldHVybiBuLnNldEFsbG93U25hcHBpbmdUb1NvdXJjZVZlcnRpY2VzKHRoaXMuX2lzU2VsZlNuYXApLG4uc25hcFRvKGUpfSxlLnByb3RvdHlwZS50cmFuc2Zvcm1Db29yZGluYXRlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXQudG9Db29yZGluYXRlQXJyYXkoKSxyPXRoaXMuc25hcExpbmUobix0aGlzLl9zbmFwUHRzKTtyZXR1cm4gdGhpcy5fZmFjdG9yeS5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKHIpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShlYyksc2M9ZnVuY3Rpb24oKXt0aGlzLl9pc0ZpcnN0PSEwLHRoaXMuX2NvbW1vbk1hbnRpc3NhQml0c0NvdW50PTUzLHRoaXMuX2NvbW1vbkJpdHM9MCx0aGlzLl9jb21tb25TaWduRXhwPW51bGx9O3NjLnByb3RvdHlwZS5nZXRDb21tb249ZnVuY3Rpb24oKXtyZXR1cm4gZmkubG9uZ0JpdHNUb0RvdWJsZSh0aGlzLl9jb21tb25CaXRzKX0sc2MucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt2YXIgZT1maS5kb3VibGVUb0xvbmdCaXRzKHQpO3JldHVybiB0aGlzLl9pc0ZpcnN0Pyh0aGlzLl9jb21tb25CaXRzPWUsdGhpcy5fY29tbW9uU2lnbkV4cD1zYy5zaWduRXhwQml0cyh0aGlzLl9jb21tb25CaXRzKSx0aGlzLl9pc0ZpcnN0PSExLG51bGwpOnNjLnNpZ25FeHBCaXRzKGUpIT09dGhpcy5fY29tbW9uU2lnbkV4cD8odGhpcy5fY29tbW9uQml0cz0wLG51bGwpOih0aGlzLl9jb21tb25NYW50aXNzYUJpdHNDb3VudD1zYy5udW1Db21tb25Nb3N0U2lnTWFudGlzc2FCaXRzKHRoaXMuX2NvbW1vbkJpdHMsZSksdm9pZCh0aGlzLl9jb21tb25CaXRzPXNjLnplcm9Mb3dlckJpdHModGhpcy5fY29tbW9uQml0cyw2NC0oMTIrdGhpcy5fY29tbW9uTWFudGlzc2FCaXRzQ291bnQpKSkpfSxzYy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9ZmkubG9uZ0JpdHNUb0RvdWJsZSh0KSxuPSIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIitmaS50b0JpbmFyeVN0cmluZyh0KSxyPW4uc3Vic3RyaW5nKG4ubGVuZ3RoLTY0KTtyZXR1cm4gci5zdWJzdHJpbmcoMCwxKSsiICAiK3Iuc3Vic3RyaW5nKDEsMTIpKyIoZXhwKSAiK3Iuc3Vic3RyaW5nKDEyKSsiIFsgIitlKyIgXSJ9fSxzYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sc2MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHNjfSxzYy5nZXRCaXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYxPDxlPzE6MH0sc2Muc2lnbkV4cEJpdHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PjUyfSxzYy56ZXJvTG93ZXJCaXRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmfigoMTw8ZSktMSl9LHNjLm51bUNvbW1vbk1vc3RTaWdNYW50aXNzYUJpdHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPTUyO3I+PTA7ci0tKXtpZihzYy5nZXRCaXQodCxyKSE9PXNjLmdldEJpdChlLHIpKXJldHVybiBuO24rK31yZXR1cm4gNTJ9O3ZhciBhYz1mdW5jdGlvbigpe3RoaXMuX2NvbW1vbkNvb3JkPW51bGwsdGhpcy5fY2NGaWx0ZXI9bmV3IGNjfSx1Yz17Q29tbW9uQ29vcmRpbmF0ZUZpbHRlcjp7Y29uZmlndXJhYmxlOiEwfSxUcmFuc2xhdGVyOntjb25maWd1cmFibGU6ITB9fTthYy5wcm90b3R5cGUuYWRkQ29tbW9uQml0cz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbGModGhpcy5fY29tbW9uQ29vcmQpO3QuYXBwbHkoZSksdC5nZW9tZXRyeUNoYW5nZWQoKX0sYWMucHJvdG90eXBlLnJlbW92ZUNvbW1vbkJpdHM9ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMuX2NvbW1vbkNvb3JkLngmJjA9PT10aGlzLl9jb21tb25Db29yZC55KXJldHVybiB0O3ZhciBlPW5ldyB2aSh0aGlzLl9jb21tb25Db29yZCk7ZS54PS1lLngsZS55PS1lLnk7dmFyIG49bmV3IGxjKGUpO3JldHVybiB0LmFwcGx5KG4pLHQuZ2VvbWV0cnlDaGFuZ2VkKCksdH0sYWMucHJvdG90eXBlLmdldENvbW1vbkNvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tbW9uQ29vcmR9LGFjLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dC5hcHBseSh0aGlzLl9jY0ZpbHRlciksdGhpcy5fY29tbW9uQ29vcmQ9dGhpcy5fY2NGaWx0ZXIuZ2V0Q29tbW9uQ29vcmRpbmF0ZSgpfSxhYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sYWMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGFjfSx1Yy5Db21tb25Db29yZGluYXRlRmlsdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBjY30sdWMuVHJhbnNsYXRlci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbGN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGFjLHVjKTt2YXIgY2M9ZnVuY3Rpb24oKXt0aGlzLl9jb21tb25CaXRzWD1uZXcgc2MsdGhpcy5fY29tbW9uQml0c1k9bmV3IHNjfTtjYy5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3RoaXMuX2NvbW1vbkJpdHNYLmFkZCh0LngpLHRoaXMuX2NvbW1vbkJpdHNZLmFkZCh0LnkpfSxjYy5wcm90b3R5cGUuZ2V0Q29tbW9uQ29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgdmkodGhpcy5fY29tbW9uQml0c1guZ2V0Q29tbW9uKCksdGhpcy5fY29tbW9uQml0c1kuZ2V0Q29tbW9uKCkpfSxjYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bYW9dfSxjYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gY2N9O3ZhciBsYz1mdW5jdGlvbigpe3RoaXMudHJhbnM9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy50cmFucz10fTtsYy5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRPcmRpbmF0ZShlLDApK3RoaXMudHJhbnMueCxyPXQuZ2V0T3JkaW5hdGUoZSwxKSt0aGlzLnRyYW5zLnk7dC5zZXRPcmRpbmF0ZShlLDAsbiksdC5zZXRPcmRpbmF0ZShlLDEscil9LGxjLnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbGMucHJvdG90eXBlLmlzR2VvbWV0cnlDaGFuZ2VkPWZ1bmN0aW9uKCl7cmV0dXJuITB9LGxjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltXb119LGxjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBsY307dmFyIGhjPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZ2VvbT1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9zbmFwVG9sZXJhbmNlPW51bGwsdGhpcy5fY2JyPW51bGwsdGhpcy5fZ2VvbVswXT10LHRoaXMuX2dlb21bMV09ZSx0aGlzLmNvbXB1dGVTbmFwVG9sZXJhbmNlKCl9O2hjLnByb3RvdHlwZS5zZWxmU25hcD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHJjKHQpLnNuYXBUbyh0LHRoaXMuX3NuYXBUb2xlcmFuY2UpfSxoYy5wcm90b3R5cGUucmVtb3ZlQ29tbW9uQml0cz1mdW5jdGlvbih0KXt0aGlzLl9jYnI9bmV3IGFjLHRoaXMuX2Nici5hZGQodFswXSksdGhpcy5fY2JyLmFkZCh0WzFdKTt2YXIgZT1uZXcgQXJyYXkoMikuZmlsbChudWxsKTtyZXR1cm4gZVswXT10aGlzLl9jYnIucmVtb3ZlQ29tbW9uQml0cyh0WzBdLmNvcHkoKSksZVsxXT10aGlzLl9jYnIucmVtb3ZlQ29tbW9uQml0cyh0WzFdLmNvcHkoKSksZX0saGMucHJvdG90eXBlLnByZXBhcmVSZXN1bHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Nici5hZGRDb21tb25CaXRzKHQpLHR9LGhjLnByb3RvdHlwZS5nZXRSZXN1bHRHZW9tZXRyeT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnNuYXAodGhpcy5fZ2VvbSksbj1PYy5vdmVybGF5T3AoZVswXSxlWzFdLHQpO3JldHVybiB0aGlzLnByZXBhcmVSZXN1bHQobil9LGhjLnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKHQpe3QuaXNWYWxpZCgpfHxraS5vdXQucHJpbnRsbigiU25hcHBlZCBnZW9tZXRyeSBpcyBpbnZhbGlkIil9LGhjLnByb3RvdHlwZS5jb21wdXRlU25hcFRvbGVyYW5jZT1mdW5jdGlvbigpe3RoaXMuX3NuYXBUb2xlcmFuY2U9cmMuY29tcHV0ZU92ZXJsYXlTbmFwVG9sZXJhbmNlKHRoaXMuX2dlb21bMF0sdGhpcy5fZ2VvbVsxXSl9LGhjLnByb3RvdHlwZS5zbmFwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucmVtb3ZlQ29tbW9uQml0cyh0KTtyZXR1cm4gcmMuc25hcChlWzBdLGVbMV0sdGhpcy5fc25hcFRvbGVyYW5jZSl9LGhjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxoYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gaGN9LGhjLm92ZXJsYXlPcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyBoYyh0LGUpLmdldFJlc3VsdEdlb21ldHJ5KG4pfSxoYy51bmlvbj1mdW5jdGlvbih0LGUpe3JldHVybiBoYy5vdmVybGF5T3AodCxlLE9jLlVOSU9OKX0saGMuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGhjLm92ZXJsYXlPcCh0LGUsT2MuSU5URVJTRUNUSU9OKX0saGMuc3ltRGlmZmVyZW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBoYy5vdmVybGF5T3AodCxlLE9jLlNZTURJRkZFUkVOQ0UpfSxoYy5kaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGhjLm92ZXJsYXlPcCh0LGUsT2MuRElGRkVSRU5DRSl9O3ZhciBmYz1mdW5jdGlvbih0LGUpe3RoaXMuX2dlb209bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5fZ2VvbVswXT10LHRoaXMuX2dlb21bMV09ZX07ZmMucHJvdG90eXBlLmdldFJlc3VsdEdlb21ldHJ5PWZ1bmN0aW9uKHQpe3ZhciBlPW51bGwsbj0hMSxyPW51bGw7dHJ5e2U9T2Mub3ZlcmxheU9wKHRoaXMuX2dlb21bMF0sdGhpcy5fZ2VvbVsxXSx0KTtuPSEwfWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIFdpKSl0aHJvdyB0O3I9dH1pZighbil0cnl7ZT1oYy5vdmVybGF5T3AodGhpcy5fZ2VvbVswXSx0aGlzLl9nZW9tWzFdLHQpfWNhdGNoKHQpe3Rocm93IHQgaW5zdGFuY2VvZiBXaT9yOnR9cmV0dXJuIGV9LGZjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxmYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZmN9LGZjLm92ZXJsYXlPcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyBmYyh0LGUpLmdldFJlc3VsdEdlb21ldHJ5KG4pfSxmYy51bmlvbj1mdW5jdGlvbih0LGUpe3JldHVybiBmYy5vdmVybGF5T3AodCxlLE9jLlVOSU9OKX0sZmMuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZjLm92ZXJsYXlPcCh0LGUsT2MuSU5URVJTRUNUSU9OKX0sZmMuc3ltRGlmZmVyZW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBmYy5vdmVybGF5T3AodCxlLE9jLlNZTURJRkZFUkVOQ0UpfSxmYy5kaWZmZXJlbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZjLm92ZXJsYXlPcCh0LGUsT2MuRElGRkVSRU5DRSl9O3ZhciBwYz1mdW5jdGlvbigpe3RoaXMubWNlPW51bGwsdGhpcy5jaGFpbkluZGV4PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMubWNlPXQsdGhpcy5jaGFpbkluZGV4PWV9O3BjLnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUpe3RoaXMubWNlLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4odGhpcy5jaGFpbkluZGV4LHQubWNlLHQuY2hhaW5JbmRleCxlKX0scGMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHBjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBwY307dmFyIGRjPWZ1bmN0aW9uIHQoKXtpZih0aGlzLl9sYWJlbD1udWxsLHRoaXMuX3hWYWx1ZT1udWxsLHRoaXMuX2V2ZW50VHlwZT1udWxsLHRoaXMuX2luc2VydEV2ZW50PW51bGwsdGhpcy5fZGVsZXRlRXZlbnRJbmRleD1udWxsLHRoaXMuX29iaj1udWxsLDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5fZXZlbnRUeXBlPXQuREVMRVRFLHRoaXMuX3hWYWx1ZT1lLHRoaXMuX2luc2VydEV2ZW50PW59ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdO3RoaXMuX2V2ZW50VHlwZT10LklOU0VSVCx0aGlzLl9sYWJlbD1yLHRoaXMuX3hWYWx1ZT1pLHRoaXMuX29iaj1vfX0sZ2M9e0lOU0VSVDp7Y29uZmlndXJhYmxlOiEwfSxERUxFVEU6e2NvbmZpZ3VyYWJsZTohMH19O2RjLnByb3RvdHlwZS5pc0RlbGV0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudFR5cGU9PT1kYy5ERUxFVEV9LGRjLnByb3RvdHlwZS5zZXREZWxldGVFdmVudEluZGV4PWZ1bmN0aW9uKHQpe3RoaXMuX2RlbGV0ZUV2ZW50SW5kZXg9dH0sZGMucHJvdG90eXBlLmdldE9iamVjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9vYmp9LGRjLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5feFZhbHVlPGUuX3hWYWx1ZT8tMTp0aGlzLl94VmFsdWU+ZS5feFZhbHVlPzE6dGhpcy5fZXZlbnRUeXBlPGUuX2V2ZW50VHlwZT8tMTp0aGlzLl9ldmVudFR5cGU+ZS5fZXZlbnRUeXBlPzE6MH0sZGMucHJvdG90eXBlLmdldEluc2VydEV2ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2luc2VydEV2ZW50fSxkYy5wcm90b3R5cGUuaXNJbnNlcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRUeXBlPT09ZGMuSU5TRVJUfSxkYy5wcm90b3R5cGUuaXNTYW1lTGFiZWw9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10aGlzLl9sYWJlbCYmdGhpcy5fbGFiZWw9PT10Ll9sYWJlbH0sZGMucHJvdG90eXBlLmdldERlbGV0ZUV2ZW50SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVsZXRlRXZlbnRJbmRleH0sZGMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpXX0sZGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGRjfSxnYy5JTlNFUlQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LGdjLkRFTEVURS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGMsZ2MpO3ZhciB5Yz1mdW5jdGlvbigpe307eWMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHljLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB5Y307dmFyIG1jPWZ1bmN0aW9uKCl7dGhpcy5faGFzSW50ZXJzZWN0aW9uPSExLHRoaXMuX2hhc1Byb3Blcj0hMSx0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcj0hMSx0aGlzLl9wcm9wZXJJbnRlcnNlY3Rpb25Qb2ludD1udWxsLHRoaXMuX2xpPW51bGwsdGhpcy5faW5jbHVkZVByb3Blcj1udWxsLHRoaXMuX3JlY29yZElzb2xhdGVkPW51bGwsdGhpcy5faXNTZWxmSW50ZXJzZWN0aW9uPW51bGwsdGhpcy5fbnVtSW50ZXJzZWN0aW9ucz0wLHRoaXMubnVtVGVzdHM9MCx0aGlzLl9iZHlOb2Rlcz1udWxsLHRoaXMuX2lzRG9uZT0hMSx0aGlzLl9pc0RvbmVXaGVuUHJvcGVySW50PSExO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTt0aGlzLl9saT10LHRoaXMuX2luY2x1ZGVQcm9wZXI9ZSx0aGlzLl9yZWNvcmRJc29sYXRlZD1ufTttYy5wcm90b3R5cGUuaXNUcml2aWFsSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiYxPT09dGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uTnVtKCkpe2lmKG1jLmlzQWRqYWNlbnRTZWdtZW50cyhlLHIpKXJldHVybiEwO2lmKHQuaXNDbG9zZWQoKSl7dmFyIGk9dC5nZXROdW1Qb2ludHMoKS0xO2lmKDA9PT1lJiZyPT09aXx8MD09PXImJmU9PT1pKXJldHVybiEwfX1yZXR1cm4hMX0sbWMucHJvdG90eXBlLmdldFByb3BlckludGVyc2VjdGlvblBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlckludGVyc2VjdGlvblBvaW50fSxtYy5wcm90b3R5cGUuc2V0SXNEb25lSWZQcm9wZXJJbnQ9ZnVuY3Rpb24odCl7dGhpcy5faXNEb25lV2hlblByb3BlckludD10fSxtYy5wcm90b3R5cGUuaGFzUHJvcGVySW50ZXJpb3JJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzUHJvcGVySW50ZXJpb3J9LG1jLnByb3RvdHlwZS5pc0JvdW5kYXJ5UG9pbnRJbnRlcm5hbD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKS5nZXRDb29yZGluYXRlKCk7aWYodC5pc0ludGVyc2VjdGlvbihyKSlyZXR1cm4hMH1yZXR1cm4hMX0sbWMucHJvdG90eXBlLmhhc1Byb3BlckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJ9LG1jLnByb3RvdHlwZS5oYXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzSW50ZXJzZWN0aW9ufSxtYy5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRG9uZX0sbWMucHJvdG90eXBlLmlzQm91bmRhcnlQb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT09ZSYmISghdGhpcy5pc0JvdW5kYXJ5UG9pbnRJbnRlcm5hbCh0LGVbMF0pJiYhdGhpcy5pc0JvdW5kYXJ5UG9pbnRJbnRlcm5hbCh0LGVbMV0pKX0sbWMucHJvdG90eXBlLnNldEJvdW5kYXJ5Tm9kZXM9ZnVuY3Rpb24odCxlKXt0aGlzLl9iZHlOb2Rlcz1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9iZHlOb2Rlc1swXT10LHRoaXMuX2JkeU5vZGVzWzFdPWV9LG1jLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiZlPT09cilyZXR1cm4gbnVsbDt0aGlzLm51bVRlc3RzKys7dmFyIGk9dC5nZXRDb29yZGluYXRlcygpW2VdLG89dC5nZXRDb29yZGluYXRlcygpW2UrMV0scz1uLmdldENvb3JkaW5hdGVzKClbcl0sYT1uLmdldENvb3JkaW5hdGVzKClbcisxXTt0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKGksbyxzLGEpLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiYodGhpcy5fcmVjb3JkSXNvbGF0ZWQmJih0LnNldElzb2xhdGVkKCExKSxuLnNldElzb2xhdGVkKCExKSksdGhpcy5fbnVtSW50ZXJzZWN0aW9ucysrLHRoaXMuaXNUcml2aWFsSW50ZXJzZWN0aW9uKHQsZSxuLHIpfHwodGhpcy5faGFzSW50ZXJzZWN0aW9uPSEwLCh0aGlzLl9pbmNsdWRlUHJvcGVyfHwhdGhpcy5fbGkuaXNQcm9wZXIoKSkmJih0LmFkZEludGVyc2VjdGlvbnModGhpcy5fbGksZSwwKSxuLmFkZEludGVyc2VjdGlvbnModGhpcy5fbGksciwxKSksdGhpcy5fbGkuaXNQcm9wZXIoKSYmKHRoaXMuX3Byb3BlckludGVyc2VjdGlvblBvaW50PXRoaXMuX2xpLmdldEludGVyc2VjdGlvbigwKS5jb3B5KCksdGhpcy5faGFzUHJvcGVyPSEwLHRoaXMuX2lzRG9uZVdoZW5Qcm9wZXJJbnQmJih0aGlzLl9pc0RvbmU9ITApLHRoaXMuaXNCb3VuZGFyeVBvaW50KHRoaXMuX2xpLHRoaXMuX2JkeU5vZGVzKXx8KHRoaXMuX2hhc1Byb3BlckludGVyaW9yPSEwKSkpKX0sbWMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LG1jLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBtY30sbWMuaXNBZGphY2VudFNlZ21lbnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDE9PT1NYXRoLmFicyh0LWUpfTt2YXIgdmM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLmV2ZW50cz1uZXcgeG8sdGhpcy5uT3ZlcmxhcHM9bnVsbH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUucHJlcGFyZUV2ZW50cz1mdW5jdGlvbigpe2FhLnNvcnQodGhpcy5ldmVudHMpO2Zvcih2YXIgdD0wO3Q8dGhpcy5ldmVudHMuc2l6ZSgpO3QrKyl7dmFyIGU9dGhpcy5ldmVudHMuZ2V0KHQpO2UuaXNEZWxldGUoKSYmZS5nZXRJbnNlcnRFdmVudCgpLnNldERlbGV0ZUV2ZW50SW5kZXgodCl9fSxlLnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0aW9ucz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5uT3ZlcmxhcHM9MCx0aGlzLnByZXBhcmVFdmVudHMoKTtmb3IodmFyIGU9MDtlPHRoaXMuZXZlbnRzLnNpemUoKTtlKyspe3ZhciBuPXRoaXMuZXZlbnRzLmdldChlKTtpZihuLmlzSW5zZXJ0KCkmJnRoaXMucHJvY2Vzc092ZXJsYXBzKGUsbi5nZXREZWxldGVFdmVudEluZGV4KCksbix0KSx0LmlzRG9uZSgpKWJyZWFrfX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKWlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgbWMmJkVpKGFyZ3VtZW50c1swXSx2bykmJkVpKGFyZ3VtZW50c1sxXSx2bykpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXTt0aGlzLmFkZEVkZ2VzKHIsciksdGhpcy5hZGRFZGdlcyhpLGkpLHRoaXMuY29tcHV0ZUludGVyc2VjdGlvbnMobyl9ZWxzZSBpZigiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMl0mJkVpKGFyZ3VtZW50c1swXSx2bykmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgbWMpe3ZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXTthcmd1bWVudHNbMl0/dGhpcy5hZGRFZGdlcyhzLG51bGwpOnRoaXMuYWRkRWRnZXMocyksdGhpcy5jb21wdXRlSW50ZXJzZWN0aW9ucyhhKX19LGUucHJvdG90eXBlLmFkZEVkZ2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5nZXRNb25vdG9uZUNoYWluRWRnZSgpLHI9bi5nZXRTdGFydEluZGV4ZXMoKSxpPTA7aTxyLmxlbmd0aC0xO2krKyl7dmFyIG89bmV3IHBjKG4saSkscz1uZXcgZGMoZSxuLmdldE1pblgoaSksbyk7dGhpcy5ldmVudHMuYWRkKHMpLHRoaXMuZXZlbnRzLmFkZChuZXcgZGMobi5nZXRNYXhYKGkpLHMpKX19LGUucHJvdG90eXBlLnByb2Nlc3NPdmVybGFwcz1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9bi5nZXRPYmplY3QoKSxvPXQ7bzxlO28rKyl7dmFyIHM9dGhpcy5ldmVudHMuZ2V0KG8pO2lmKHMuaXNJbnNlcnQoKSl7dmFyIGE9cy5nZXRPYmplY3QoKTtuLmlzU2FtZUxhYmVsKHMpfHwoaS5jb21wdXRlSW50ZXJzZWN0aW9ucyhhLHIpLHRoaXMubk92ZXJsYXBzKyspfX19LGUucHJvdG90eXBlLmFkZEVkZ2VzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciB0PWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCk7dGhpcy5hZGRFZGdlKGUsZSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzBdLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTt0aGlzLmFkZEVkZ2UoaSxuKX19LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KHljKSxfYz1mdW5jdGlvbigpe3RoaXMuX21pbj1maS5QT1NJVElWRV9JTkZJTklUWSx0aGlzLl9tYXg9ZmkuTkVHQVRJVkVfSU5GSU5JVFl9LHhjPXtOb2RlQ29tcGFyYXRvcjp7Y29uZmlndXJhYmxlOiEwfX07X2MucHJvdG90eXBlLmdldE1pbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW59LF9jLnByb3RvdHlwZS5pbnRlcnNlY3RzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuISh0aGlzLl9taW4+ZXx8dGhpcy5fbWF4PHQpfSxfYy5wcm90b3R5cGUuZ2V0TWF4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heH0sX2MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFhpLnRvTGluZVN0cmluZyhuZXcgdmkodGhpcy5fbWluLDApLG5ldyB2aSh0aGlzLl9tYXgsMCkpfSxfYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sX2MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIF9jfSx4Yy5Ob2RlQ29tcGFyYXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gd2N9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKF9jLHhjKTt2YXIgd2M9ZnVuY3Rpb24oKXt9O3djLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dCxyPWUsaT0obi5fbWluK24uX21heCkvMixvPShyLl9taW4rci5fbWF4KS8yO3JldHVybiBpPG8/LTE6aT5vPzE6MH0sd2MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3lpXX0sd2MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHdjfTt2YXIgYmM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9pdGVtPW51bGw7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO3RoaXMuX21pbj1lLHRoaXMuX21heD1uLHRoaXMuX2l0ZW09cn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24odCxlLG4pe2lmKCF0aGlzLmludGVyc2VjdHModCxlKSlyZXR1cm4gbnVsbDtuLnZpc2l0SXRlbSh0aGlzLl9pdGVtKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oX2MpLERjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5fbm9kZTE9bnVsbCx0aGlzLl9ub2RlMj1udWxsO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLl9ub2RlMT1lLHRoaXMuX25vZGUyPW4sdGhpcy5idWlsZEV4dGVudCh0aGlzLl9ub2RlMSx0aGlzLl9ub2RlMil9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmJ1aWxkRXh0ZW50PWZ1bmN0aW9uKHQsZSl7dGhpcy5fbWluPU1hdGgubWluKHQuX21pbixlLl9taW4pLHRoaXMuX21heD1NYXRoLm1heCh0Ll9tYXgsZS5fbWF4KX0sZS5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24odCxlLG4pe2lmKCF0aGlzLmludGVyc2VjdHModCxlKSlyZXR1cm4gbnVsbDtudWxsIT09dGhpcy5fbm9kZTEmJnRoaXMuX25vZGUxLnF1ZXJ5KHQsZSxuKSxudWxsIT09dGhpcy5fbm9kZTImJnRoaXMuX25vZGUyLnF1ZXJ5KHQsZSxuKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oX2MpLEVjPWZ1bmN0aW9uKCl7dGhpcy5fbGVhdmVzPW5ldyB4byx0aGlzLl9yb290PW51bGwsdGhpcy5fbGV2ZWw9MH07RWMucHJvdG90eXBlLmJ1aWxkVHJlZT1mdW5jdGlvbigpe2FhLnNvcnQodGhpcy5fbGVhdmVzLG5ldyBfYy5Ob2RlQ29tcGFyYXRvcik7Zm9yKHZhciB0PXRoaXMuX2xlYXZlcyxlPW51bGwsbj1uZXcgeG87Oyl7aWYodGhpcy5idWlsZExldmVsKHQsbiksMT09PW4uc2l6ZSgpKXJldHVybiBuLmdldCgwKTtlPXQsdD1uLG49ZX19LEVjLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxlLG4pe2lmKG51bGwhPT10aGlzLl9yb290KXRocm93IG5ldyBFcnJvcigiSW5kZXggY2Fubm90IGJlIGFkZGVkIHRvIG9uY2UgaXQgaGFzIGJlZW4gcXVlcmllZCIpO3RoaXMuX2xlYXZlcy5hZGQobmV3IGJjKHQsZSxuKSl9LEVjLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbih0LGUsbil7dGhpcy5pbml0KCksdGhpcy5fcm9vdC5xdWVyeSh0LGUsbil9LEVjLnByb3RvdHlwZS5idWlsZFJvb3Q9ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy5fcm9vdClyZXR1cm4gbnVsbDt0aGlzLl9yb290PXRoaXMuYnVpbGRUcmVlKCl9LEVjLnByb3RvdHlwZS5wcmludE5vZGU9ZnVuY3Rpb24odCl7a2kub3V0LnByaW50bG4oWGkudG9MaW5lU3RyaW5nKG5ldyB2aSh0Ll9taW4sdGhpcy5fbGV2ZWwpLG5ldyB2aSh0Ll9tYXgsdGhpcy5fbGV2ZWwpKSl9LEVjLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3Jvb3QpcmV0dXJuIG51bGw7dGhpcy5idWlsZFJvb3QoKX0sRWMucHJvdG90eXBlLmJ1aWxkTGV2ZWw9ZnVuY3Rpb24odCxlKXt0aGlzLl9sZXZlbCsrLGUuY2xlYXIoKTtmb3IodmFyIG49MDtuPHQuc2l6ZSgpO24rPTIpe3ZhciByPXQuZ2V0KG4pO2lmKG51bGw9PT0obisxPHQuc2l6ZSgpP3QuZ2V0KG4pOm51bGwpKWUuYWRkKHIpO2Vsc2V7dmFyIGk9bmV3IERjKHQuZ2V0KG4pLHQuZ2V0KG4rMSkpO2UuYWRkKGkpfX19LEVjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxFYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRWN9O3ZhciBDYz1mdW5jdGlvbigpe3RoaXMuX2l0ZW1zPW5ldyB4b307Q2MucHJvdG90eXBlLnZpc2l0SXRlbT1mdW5jdGlvbih0KXt0aGlzLl9pdGVtcy5hZGQodCl9LENjLnByb3RvdHlwZS5nZXRJdGVtcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pdGVtc30sQ2MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3JhXX0sQ2MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIENjfTt2YXIgU2M9ZnVuY3Rpb24oKXt0aGlzLl9pbmRleD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTtpZighRWkodCxscykpdGhyb3cgbmV3IGhpO3RoaXMuX2luZGV4PW5ldyBJYyh0KX0sQWM9e1NlZ21lbnRWaXNpdG9yOntjb25maWd1cmFibGU6ITB9LEludGVydmFsSW5kZXhlZEdlb21ldHJ5Ontjb25maWd1cmFibGU6ITB9fTtTYy5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB0byh0KSxuPW5ldyBOYyhlKTtyZXR1cm4gdGhpcy5faW5kZXgucXVlcnkodC55LHQueSxuKSxlLmdldExvY2F0aW9uKCl9LFNjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltXYV19LFNjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBTY30sQWMuU2VnbWVudFZpc2l0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE5jfSxBYy5JbnRlcnZhbEluZGV4ZWRHZW9tZXRyeS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gSWN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFNjLEFjKTt2YXIgTmM9ZnVuY3Rpb24oKXt0aGlzLl9jb3VudGVyPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2NvdW50ZXI9dH07TmMucHJvdG90eXBlLnZpc2l0SXRlbT1mdW5jdGlvbih0KXt2YXIgZT10O3RoaXMuX2NvdW50ZXIuY291bnRTZWdtZW50KGUuZ2V0Q29vcmRpbmF0ZSgwKSxlLmdldENvb3JkaW5hdGUoMSkpfSxOYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bcmFdfSxOYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTmN9O3ZhciBJYz1mdW5jdGlvbigpe3RoaXMuX2luZGV4PW5ldyBFYzt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5pbml0KHQpfTtJYy5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9RnUuZ2V0TGluZXModCkuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLmdldENvb3JkaW5hdGVzKCk7dGhpcy5hZGRMaW5lKG4pfX0sSWMucHJvdG90eXBlLmFkZExpbmU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPW5ldyBiYSh0W2UtMV0sdFtlXSkscj1NYXRoLm1pbihuLnAwLnksbi5wMS55KSxpPU1hdGgubWF4KG4ucDAueSxuLnAxLnkpO3RoaXMuX2luZGV4Lmluc2VydChyLGksbil9fSxJYy5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IENjO3JldHVybiB0aGlzLl9pbmRleC5xdWVyeSh0LGUsbiksbi5nZXRJdGVtcygpfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl07dGhpcy5faW5kZXgucXVlcnkocixpLG8pfX0sSWMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEljLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBJY307dmFyIE1jPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtpZih0LmNhbGwodGhpcyksdGhpcy5fcGFyZW50R2VvbT1udWxsLHRoaXMuX2xpbmVFZGdlTWFwPW5ldyBFcyx0aGlzLl9ib3VuZGFyeU5vZGVSdWxlPW51bGwsdGhpcy5fdXNlQm91bmRhcnlEZXRlcm1pbmF0aW9uUnVsZT0hMCx0aGlzLl9hcmdJbmRleD1udWxsLHRoaXMuX2JvdW5kYXJ5Tm9kZXM9bnVsbCx0aGlzLl9oYXNUb29GZXdQb2ludHM9ITEsdGhpcy5faW52YWxpZFBvaW50PW51bGwsdGhpcy5fYXJlYVB0TG9jYXRvcj1udWxsLHRoaXMuX3B0TG9jYXRvcj1uZXcgVHUsMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPXVvLk9HQ19TRlNfQk9VTkRBUllfUlVMRTt0aGlzLl9hcmdJbmRleD1lLHRoaXMuX3BhcmVudEdlb209bix0aGlzLl9ib3VuZGFyeU5vZGVSdWxlPXIsbnVsbCE9PW4mJnRoaXMuYWRkKG4pfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXTt0aGlzLl9hcmdJbmRleD1pLHRoaXMuX3BhcmVudEdlb209byx0aGlzLl9ib3VuZGFyeU5vZGVSdWxlPXMsbnVsbCE9PW8mJnRoaXMuYWRkKG8pfX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaW5zZXJ0Qm91bmRhcnlQb2ludD1mdW5jdGlvbih0LG4pe3ZhciByPXRoaXMuX25vZGVzLmFkZE5vZGUobikuZ2V0TGFiZWwoKSxpPTE7ci5nZXRMb2NhdGlvbih0LEZzLk9OKT09PWJpLkJPVU5EQVJZJiZpKys7dmFyIG89ZS5kZXRlcm1pbmVCb3VuZGFyeSh0aGlzLl9ib3VuZGFyeU5vZGVSdWxlLGkpO3Iuc2V0TG9jYXRpb24odCxvKX0sZS5wcm90b3R5cGUuY29tcHV0ZVNlbGZOb2Rlcz1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuY29tcHV0ZVNlbGZOb2Rlcyh0LGUsITEpfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl0saT1uZXcgbWMoYXJndW1lbnRzWzBdLCEwLCExKTtpLnNldElzRG9uZUlmUHJvcGVySW50KHIpO3ZhciBvPXRoaXMuY3JlYXRlRWRnZVNldEludGVyc2VjdG9yKCkscz10aGlzLl9wYXJlbnRHZW9tIGluc3RhbmNlb2YgcHN8fHRoaXMuX3BhcmVudEdlb20gaW5zdGFuY2VvZiBoc3x8dGhpcy5fcGFyZW50R2VvbSBpbnN0YW5jZW9mIGRzLGE9bnx8IXM7cmV0dXJuIG8uY29tcHV0ZUludGVyc2VjdGlvbnModGhpcy5fZWRnZXMsaSxhKSx0aGlzLmFkZFNlbGZJbnRlcnNlY3Rpb25Ob2Rlcyh0aGlzLl9hcmdJbmRleCksaX19LGUucHJvdG90eXBlLmNvbXB1dGVTcGxpdEVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9lZGdlcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkuZWlMaXN0LmFkZFNwbGl0RWRnZXModCl9fSxlLnByb3RvdHlwZS5jb21wdXRlRWRnZUludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBtYyhlLG4sITApO3JldHVybiByLnNldEJvdW5kYXJ5Tm9kZXModGhpcy5nZXRCb3VuZGFyeU5vZGVzKCksdC5nZXRCb3VuZGFyeU5vZGVzKCkpLHRoaXMuY3JlYXRlRWRnZVNldEludGVyc2VjdG9yKCkuY29tcHV0ZUludGVyc2VjdGlvbnModGhpcy5fZWRnZXMsdC5fZWRnZXMscikscn0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFyZW50R2VvbX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlOb2RlUnVsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ib3VuZGFyeU5vZGVSdWxlfSxlLnByb3RvdHlwZS5oYXNUb29GZXdQb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzVG9vRmV3UG9pbnRzfSxlLnByb3RvdHlwZS5hZGRQb2ludD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgY3Mpe3ZhciB0PWFyZ3VtZW50c1swXS5nZXRDb29yZGluYXRlKCk7dGhpcy5pbnNlcnRQb2ludCh0aGlzLl9hcmdJbmRleCx0LGJpLklOVEVSSU9SKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmluc2VydFBvaW50KHRoaXMuX2FyZ0luZGV4LGUsYmkuSU5URVJJT1IpfX0sZS5wcm90b3R5cGUuYWRkUG9seWdvbj1mdW5jdGlvbih0KXt0aGlzLmFkZFBvbHlnb25SaW5nKHQuZ2V0RXh0ZXJpb3JSaW5nKCksYmkuRVhURVJJT1IsYmkuSU5URVJJT1IpO2Zvcih2YXIgZT0wO2U8dC5nZXROdW1JbnRlcmlvclJpbmcoKTtlKyspe3ZhciBuPXQuZ2V0SW50ZXJpb3JSaW5nTihlKTt0aGlzLmFkZFBvbHlnb25SaW5nKG4sYmkuSU5URVJJT1IsYmkuRVhURVJJT1IpfX0sZS5wcm90b3R5cGUuYWRkRWRnZT1mdW5jdGlvbih0KXt0aGlzLmluc2VydEVkZ2UodCk7dmFyIGU9dC5nZXRDb29yZGluYXRlcygpO3RoaXMuaW5zZXJ0UG9pbnQodGhpcy5fYXJnSW5kZXgsZVswXSxiaS5CT1VOREFSWSksdGhpcy5pbnNlcnRQb2ludCh0aGlzLl9hcmdJbmRleCxlW2UubGVuZ3RoLTFdLGJpLkJPVU5EQVJZKX0sZS5wcm90b3R5cGUuYWRkTGluZVN0cmluZz1mdW5jdGlvbih0KXt2YXIgZT1Eby5yZW1vdmVSZXBlYXRlZFBvaW50cyh0LmdldENvb3JkaW5hdGVzKCkpO2lmKGUubGVuZ3RoPDIpcmV0dXJuIHRoaXMuX2hhc1Rvb0Zld1BvaW50cz0hMCx0aGlzLl9pbnZhbGlkUG9pbnQ9ZVswXSxudWxsO3ZhciBuPW5ldyBjdShlLG5ldyBqcyh0aGlzLl9hcmdJbmRleCxiaS5JTlRFUklPUikpO3RoaXMuX2xpbmVFZGdlTWFwLnB1dCh0LG4pLHRoaXMuaW5zZXJ0RWRnZShuKSxaaS5pc1RydWUoZS5sZW5ndGg+PTIsImZvdW5kIExpbmVTdHJpbmcgd2l0aCBzaW5nbGUgcG9pbnQiKSx0aGlzLmluc2VydEJvdW5kYXJ5UG9pbnQodGhpcy5fYXJnSW5kZXgsZVswXSksdGhpcy5pbnNlcnRCb3VuZGFyeVBvaW50KHRoaXMuX2FyZ0luZGV4LGVbZS5sZW5ndGgtMV0pfSxlLnByb3RvdHlwZS5nZXRJbnZhbGlkUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW52YWxpZFBvaW50fSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeVBvaW50cz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmdldEJvdW5kYXJ5Tm9kZXMoKSxlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKSxuPTAscj10Lml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtlW24rK109aS5nZXRDb29yZGluYXRlKCkuY29weSgpfXJldHVybiBlfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeU5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9ib3VuZGFyeU5vZGVzJiYodGhpcy5fYm91bmRhcnlOb2Rlcz10aGlzLl9ub2Rlcy5nZXRCb3VuZGFyeU5vZGVzKHRoaXMuX2FyZ0luZGV4KSksdGhpcy5fYm91bmRhcnlOb2Rlc30sZS5wcm90b3R5cGUuYWRkU2VsZkludGVyc2VjdGlvbk5vZGU9ZnVuY3Rpb24odCxlLG4pe2lmKHRoaXMuaXNCb3VuZGFyeU5vZGUodCxlKSlyZXR1cm4gbnVsbDtuPT09YmkuQk9VTkRBUlkmJnRoaXMuX3VzZUJvdW5kYXJ5RGV0ZXJtaW5hdGlvblJ1bGU/dGhpcy5pbnNlcnRCb3VuZGFyeVBvaW50KHQsZSk6dGhpcy5pbnNlcnRQb2ludCh0LGUsbil9LGUucHJvdG90eXBlLmFkZFBvbHlnb25SaW5nPWZ1bmN0aW9uKHQsZSxuKXtpZih0LmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt2YXIgcj1Eby5yZW1vdmVSZXBlYXRlZFBvaW50cyh0LmdldENvb3JkaW5hdGVzKCkpO2lmKHIubGVuZ3RoPDQpcmV0dXJuIHRoaXMuX2hhc1Rvb0Zld1BvaW50cz0hMCx0aGlzLl9pbnZhbGlkUG9pbnQ9clswXSxudWxsO3ZhciBpPWUsbz1uO2VvLmlzQ0NXKHIpJiYoaT1uLG89ZSk7dmFyIHM9bmV3IGN1KHIsbmV3IGpzKHRoaXMuX2FyZ0luZGV4LGJpLkJPVU5EQVJZLGksbykpO3RoaXMuX2xpbmVFZGdlTWFwLnB1dCh0LHMpLHRoaXMuaW5zZXJ0RWRnZShzKSx0aGlzLmluc2VydFBvaW50KHRoaXMuX2FyZ0luZGV4LHJbMF0sYmkuQk9VTkRBUlkpfSxlLnByb3RvdHlwZS5pbnNlcnRQb2ludD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5fbm9kZXMuYWRkTm9kZShlKSxpPXIuZ2V0TGFiZWwoKTtudWxsPT09aT9yLl9sYWJlbD1uZXcganModCxuKTppLnNldExvY2F0aW9uKHQsbil9LGUucHJvdG90eXBlLmNyZWF0ZUVkZ2VTZXRJbnRlcnNlY3Rvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgdmN9LGUucHJvdG90eXBlLmFkZFNlbGZJbnRlcnNlY3Rpb25Ob2Rlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fZWRnZXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspZm9yKHZhciBuPWUubmV4dCgpLHI9bi5nZXRMYWJlbCgpLmdldExvY2F0aW9uKHQpLGk9bi5laUxpc3QuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpO3RoaXMuYWRkU2VsZkludGVyc2VjdGlvbk5vZGUodCxvLmNvb3JkLHIpfX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7aWYoMSE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQucHJvdG90eXBlLmFkZC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzBdO2lmKGUuaXNFbXB0eSgpKXJldHVybiBudWxsO2lmKGUgaW5zdGFuY2VvZiBkcyYmKHRoaXMuX3VzZUJvdW5kYXJ5RGV0ZXJtaW5hdGlvblJ1bGU9ITEpLGUgaW5zdGFuY2VvZiBocyl0aGlzLmFkZFBvbHlnb24oZSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgYXMpdGhpcy5hZGRMaW5lU3RyaW5nKGUpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGNzKXRoaXMuYWRkUG9pbnQoZSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgZnMpdGhpcy5hZGRDb2xsZWN0aW9uKGUpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIFpvKXRoaXMuYWRkQ29sbGVjdGlvbihlKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBkcyl0aGlzLmFkZENvbGxlY3Rpb24oZSk7ZWxzZXtpZighKGUgaW5zdGFuY2VvZiBIbykpdGhyb3cgbmV3IEVycm9yKGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpO3RoaXMuYWRkQ29sbGVjdGlvbihlKX19LGUucHJvdG90eXBlLmFkZENvbGxlY3Rpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0LmdldE51bUdlb21ldHJpZXMoKTtlKyspe3ZhciBuPXQuZ2V0R2VvbWV0cnlOKGUpO3RoaXMuYWRkKG4pfX0sZS5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBFaSh0aGlzLl9wYXJlbnRHZW9tLGxzKSYmdGhpcy5fcGFyZW50R2VvbS5nZXROdW1HZW9tZXRyaWVzKCk+NTA/KG51bGw9PT10aGlzLl9hcmVhUHRMb2NhdG9yJiYodGhpcy5fYXJlYVB0TG9jYXRvcj1uZXcgU2ModGhpcy5fcGFyZW50R2VvbSkpLHRoaXMuX2FyZWFQdExvY2F0b3IubG9jYXRlKHQpKTp0aGlzLl9wdExvY2F0b3IubG9jYXRlKHQsdGhpcy5fcGFyZW50R2VvbSl9LGUucHJvdG90eXBlLmZpbmRFZGdlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fbGluZUVkZ2VNYXAuZ2V0KGUpfXJldHVybiB0LnByb3RvdHlwZS5maW5kRWRnZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGUuZGV0ZXJtaW5lQm91bmRhcnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5pc0luQm91bmRhcnkoZSk/YmkuQk9VTkRBUlk6YmkuSU5URVJJT1J9LGV9KFFzKSxGYz1mdW5jdGlvbigpe2lmKHRoaXMuX2xpPW5ldyBRaSx0aGlzLl9yZXN1bHRQcmVjaXNpb25Nb2RlbD1udWxsLHRoaXMuX2FyZz1udWxsLDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRDb21wdXRhdGlvblByZWNpc2lvbih0LmdldFByZWNpc2lvbk1vZGVsKCkpLHRoaXMuX2FyZz1uZXcgQXJyYXkoMSkuZmlsbChudWxsKSx0aGlzLl9hcmdbMF09bmV3IE1jKDAsdCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9dW8uT0dDX1NGU19CT1VOREFSWV9SVUxFO2UuZ2V0UHJlY2lzaW9uTW9kZWwoKS5jb21wYXJlVG8obi5nZXRQcmVjaXNpb25Nb2RlbCgpKT49MD90aGlzLnNldENvbXB1dGF0aW9uUHJlY2lzaW9uKGUuZ2V0UHJlY2lzaW9uTW9kZWwoKSk6dGhpcy5zZXRDb21wdXRhdGlvblByZWNpc2lvbihuLmdldFByZWNpc2lvbk1vZGVsKCkpLHRoaXMuX2FyZz1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9hcmdbMF09bmV3IE1jKDAsZSxyKSx0aGlzLl9hcmdbMV09bmV3IE1jKDEsbixyKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl07aS5nZXRQcmVjaXNpb25Nb2RlbCgpLmNvbXBhcmVUbyhvLmdldFByZWNpc2lvbk1vZGVsKCkpPj0wP3RoaXMuc2V0Q29tcHV0YXRpb25QcmVjaXNpb24oaS5nZXRQcmVjaXNpb25Nb2RlbCgpKTp0aGlzLnNldENvbXB1dGF0aW9uUHJlY2lzaW9uKG8uZ2V0UHJlY2lzaW9uTW9kZWwoKSksdGhpcy5fYXJnPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX2FyZ1swXT1uZXcgTWMoMCxpLHMpLHRoaXMuX2FyZ1sxXT1uZXcgTWMoMSxvLHMpfX07RmMucHJvdG90eXBlLmdldEFyZ0dlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hcmdbdF0uZ2V0R2VvbWV0cnkoKX0sRmMucHJvdG90eXBlLnNldENvbXB1dGF0aW9uUHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3RoaXMuX3Jlc3VsdFByZWNpc2lvbk1vZGVsPXQsdGhpcy5fbGkuc2V0UHJlY2lzaW9uTW9kZWwodGhpcy5fcmVzdWx0UHJlY2lzaW9uTW9kZWwpfSxGYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEZjfTt2YXIgVGM9ZnVuY3Rpb24oKXt9O1RjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxUYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVGN9LFRjLm1hcD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8mJkVpKGFyZ3VtZW50c1sxXSxUYy5NYXBPcCkpe2Zvcih2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1uZXcgeG8scj0wO3I8dC5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXt2YXIgaT1lLm1hcCh0LmdldEdlb21ldHJ5TihyKSk7bnVsbCE9PWkmJm4uYWRkKGkpfXJldHVybiB0LmdldEZhY3RvcnkoKS5idWlsZEdlb21ldHJ5KG4pfWlmKEVpKGFyZ3VtZW50c1swXSxnbykmJkVpKGFyZ3VtZW50c1sxXSxUYy5NYXBPcCkpe2Zvcih2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1uZXcgeG8sdT1vLml0ZXJhdG9yKCk7dS5oYXNOZXh0KCk7KXt2YXIgYz11Lm5leHQoKSxsPXMubWFwKGMpO251bGwhPT1sJiZhLmFkZChsKX1yZXR1cm4gYX19LFRjLk1hcE9wPWZ1bmN0aW9uKCl7fTt2YXIgT2M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0LmNhbGwodGhpcyxlLG4pLHRoaXMuX3B0TG9jYXRvcj1uZXcgVHUsdGhpcy5fZ2VvbUZhY3Q9bnVsbCx0aGlzLl9yZXN1bHRHZW9tPW51bGwsdGhpcy5fZ3JhcGg9bnVsbCx0aGlzLl9lZGdlTGlzdD1uZXcgdHUsdGhpcy5fcmVzdWx0UG9seUxpc3Q9bmV3IHhvLHRoaXMuX3Jlc3VsdExpbmVMaXN0PW5ldyB4byx0aGlzLl9yZXN1bHRQb2ludExpc3Q9bmV3IHhvLHRoaXMuX2dyYXBoPW5ldyBRcyhuZXcgUWEpLHRoaXMuX2dlb21GYWN0PWUuZ2V0RmFjdG9yeSgpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pbnNlcnRVbmlxdWVFZGdlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2VkZ2VMaXN0LmZpbmRFcXVhbEVkZ2UodCk7aWYobnVsbCE9PWUpe3ZhciBuPWUuZ2V0TGFiZWwoKSxyPXQuZ2V0TGFiZWwoKTtlLmlzUG9pbnR3aXNlRXF1YWwodCl8fChyPW5ldyBqcyh0LmdldExhYmVsKCkpKS5mbGlwKCk7dmFyIGk9ZS5nZXREZXB0aCgpO2kuaXNOdWxsKCkmJmkuYWRkKG4pLGkuYWRkKHIpLG4ubWVyZ2Uocil9ZWxzZSB0aGlzLl9lZGdlTGlzdC5hZGQodCl9LGUucHJvdG90eXBlLmdldEdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dyYXBofSxlLnByb3RvdHlwZS5jYW5jZWxEdXBsaWNhdGVSZXN1bHRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncmFwaC5nZXRFZGdlRW5kcygpLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKSxuPWUuZ2V0U3ltKCk7ZS5pc0luUmVzdWx0KCkmJm4uaXNJblJlc3VsdCgpJiYoZS5zZXRJblJlc3VsdCghMSksbi5zZXRJblJlc3VsdCghMSkpfX0sZS5wcm90b3R5cGUuaXNDb3ZlcmVkQnlMQT1mdW5jdGlvbih0KXtyZXR1cm4hKCF0aGlzLmlzQ292ZXJlZCh0LHRoaXMuX3Jlc3VsdExpbmVMaXN0KSYmIXRoaXMuaXNDb3ZlcmVkKHQsdGhpcy5fcmVzdWx0UG9seUxpc3QpKX0sZS5wcm90b3R5cGUuY29tcHV0ZUdlb21ldHJ5PWZ1bmN0aW9uKHQsbixyLGkpe3ZhciBvPW5ldyB4bztyZXR1cm4gby5hZGRBbGwodCksby5hZGRBbGwobiksby5hZGRBbGwociksby5pc0VtcHR5KCk/ZS5jcmVhdGVFbXB0eVJlc3VsdChpLHRoaXMuX2FyZ1swXS5nZXRHZW9tZXRyeSgpLHRoaXMuX2FyZ1sxXS5nZXRHZW9tZXRyeSgpLHRoaXMuX2dlb21GYWN0KTp0aGlzLl9nZW9tRmFjdC5idWlsZEdlb21ldHJ5KG8pfSxlLnByb3RvdHlwZS5tZXJnZVN5bUxhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncmFwaC5nZXROb2RlcygpLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt0Lm5leHQoKS5nZXRFZGdlcygpLm1lcmdlU3ltTGFiZWxzKCl9fSxlLnByb3RvdHlwZS5pc0NvdmVyZWQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7aWYodGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh0LHIpIT09YmkuRVhURVJJT1IpcmV0dXJuITB9cmV0dXJuITF9LGUucHJvdG90eXBlLnJlcGxhY2VDb2xsYXBzZWRFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgeG8sZT10aGlzLl9lZGdlTGlzdC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7bi5pc0NvbGxhcHNlZCgpJiYoZS5yZW1vdmUoKSx0LmFkZChuLmdldENvbGxhcHNlZEVkZ2UoKSkpfXRoaXMuX2VkZ2VMaXN0LmFkZEFsbCh0KX0sZS5wcm90b3R5cGUudXBkYXRlTm9kZUxhYmVsbGluZz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncmFwaC5nZXROb2RlcygpLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKSxuPWUuZ2V0RWRnZXMoKS5nZXRMYWJlbCgpO2UuZ2V0TGFiZWwoKS5tZXJnZShuKX19LGUucHJvdG90eXBlLmdldFJlc3VsdEdlb21ldHJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbXB1dGVPdmVybGF5KHQpLHRoaXMuX3Jlc3VsdEdlb219LGUucHJvdG90eXBlLmluc2VydFVuaXF1ZUVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0aGlzLmluc2VydFVuaXF1ZUVkZ2Uobil9fSxlLnByb3RvdHlwZS5jb21wdXRlT3ZlcmxheT1mdW5jdGlvbih0KXt0aGlzLmNvcHlQb2ludHMoMCksdGhpcy5jb3B5UG9pbnRzKDEpLHRoaXMuX2FyZ1swXS5jb21wdXRlU2VsZk5vZGVzKHRoaXMuX2xpLCExKSx0aGlzLl9hcmdbMV0uY29tcHV0ZVNlbGZOb2Rlcyh0aGlzLl9saSwhMSksdGhpcy5fYXJnWzBdLmNvbXB1dGVFZGdlSW50ZXJzZWN0aW9ucyh0aGlzLl9hcmdbMV0sdGhpcy5fbGksITApO3ZhciBlPW5ldyB4bzt0aGlzLl9hcmdbMF0uY29tcHV0ZVNwbGl0RWRnZXMoZSksdGhpcy5fYXJnWzFdLmNvbXB1dGVTcGxpdEVkZ2VzKGUpLHRoaXMuaW5zZXJ0VW5pcXVlRWRnZXMoZSksdGhpcy5jb21wdXRlTGFiZWxzRnJvbURlcHRocygpLHRoaXMucmVwbGFjZUNvbGxhcHNlZEVkZ2VzKCksSnUuY2hlY2tWYWxpZCh0aGlzLl9lZGdlTGlzdC5nZXRFZGdlcygpKSx0aGlzLl9ncmFwaC5hZGRFZGdlcyh0aGlzLl9lZGdlTGlzdC5nZXRFZGdlcygpKSx0aGlzLmNvbXB1dGVMYWJlbGxpbmcoKSx0aGlzLmxhYmVsSW5jb21wbGV0ZU5vZGVzKCksdGhpcy5maW5kUmVzdWx0QXJlYUVkZ2VzKHQpLHRoaXMuY2FuY2VsRHVwbGljYXRlUmVzdWx0RWRnZXMoKTt2YXIgbj1uZXcgJHModGhpcy5fZ2VvbUZhY3QpO24uYWRkKHRoaXMuX2dyYXBoKSx0aGlzLl9yZXN1bHRQb2x5TGlzdD1uLmdldFBvbHlnb25zKCk7dmFyIHI9bmV3ICR1KHRoaXMsdGhpcy5fZ2VvbUZhY3QsdGhpcy5fcHRMb2NhdG9yKTt0aGlzLl9yZXN1bHRMaW5lTGlzdD1yLmJ1aWxkKHQpO3ZhciBpPW5ldyB0Yyh0aGlzLHRoaXMuX2dlb21GYWN0LHRoaXMuX3B0TG9jYXRvcik7dGhpcy5fcmVzdWx0UG9pbnRMaXN0PWkuYnVpbGQodCksdGhpcy5fcmVzdWx0R2VvbT10aGlzLmNvbXB1dGVHZW9tZXRyeSh0aGlzLl9yZXN1bHRQb2ludExpc3QsdGhpcy5fcmVzdWx0TGluZUxpc3QsdGhpcy5fcmVzdWx0UG9seUxpc3QsdCl9LGUucHJvdG90eXBlLmxhYmVsSW5jb21wbGV0ZU5vZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9wdExvY2F0b3IubG9jYXRlKHQuZ2V0Q29vcmRpbmF0ZSgpLHRoaXMuX2FyZ1tlXS5nZXRHZW9tZXRyeSgpKTt0LmdldExhYmVsKCkuc2V0TG9jYXRpb24oZSxuKX0sZS5wcm90b3R5cGUuY29weVBvaW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fYXJnW3RdLmdldE5vZGVJdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dGhpcy5fZ3JhcGguYWRkTm9kZShuLmdldENvb3JkaW5hdGUoKSkuc2V0TGFiZWwodCxuLmdldExhYmVsKCkuZ2V0TG9jYXRpb24odCkpfX0sZS5wcm90b3R5cGUuZmluZFJlc3VsdEFyZWFFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5fZ3JhcGguZ2V0RWRnZUVuZHMoKS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCksaT1yLmdldExhYmVsKCk7aS5pc0FyZWEoKSYmIXIuaXNJbnRlcmlvckFyZWFFZGdlKCkmJmUuaXNSZXN1bHRPZk9wKGkuZ2V0TG9jYXRpb24oMCxGcy5SSUdIVCksaS5nZXRMb2NhdGlvbigxLEZzLlJJR0hUKSx0KSYmci5zZXRJblJlc3VsdCghMCl9fSxlLnByb3RvdHlwZS5jb21wdXRlTGFiZWxzRnJvbURlcHRocz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9lZGdlTGlzdC5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCksbj1lLmdldExhYmVsKCkscj1lLmdldERlcHRoKCk7aWYoIXIuaXNOdWxsKCkpe3Iubm9ybWFsaXplKCk7Zm9yKHZhciBpPTA7aTwyO2krKykhbi5pc051bGwoaSkmJm4uaXNBcmVhKCkmJiFyLmlzTnVsbChpKSYmKDA9PT1yLmdldERlbHRhKGkpP24udG9MaW5lKGkpOihaaS5pc1RydWUoIXIuaXNOdWxsKGksRnMuTEVGVCksImRlcHRoIG9mIExFRlQgc2lkZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQiKSxuLnNldExvY2F0aW9uKGksRnMuTEVGVCxyLmdldExvY2F0aW9uKGksRnMuTEVGVCkpLFppLmlzVHJ1ZSghci5pc051bGwoaSxGcy5SSUdIVCksImRlcHRoIG9mIFJJR0hUIHNpZGUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIiksbi5zZXRMb2NhdGlvbihpLEZzLlJJR0hULHIuZ2V0TG9jYXRpb24oaSxGcy5SSUdIVCkpKSl9fX0sZS5wcm90b3R5cGUuY29tcHV0ZUxhYmVsbGluZz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncmFwaC5nZXROb2RlcygpLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt0Lm5leHQoKS5nZXRFZGdlcygpLmNvbXB1dGVMYWJlbGxpbmcodGhpcy5fYXJnKX10aGlzLm1lcmdlU3ltTGFiZWxzKCksdGhpcy51cGRhdGVOb2RlTGFiZWxsaW5nKCl9LGUucHJvdG90eXBlLmxhYmVsSW5jb21wbGV0ZU5vZGVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyYXBoLmdldE5vZGVzKCkuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpLG49ZS5nZXRMYWJlbCgpO2UuaXNJc29sYXRlZCgpJiYobi5pc051bGwoMCk/dGhpcy5sYWJlbEluY29tcGxldGVOb2RlKGUsMCk6dGhpcy5sYWJlbEluY29tcGxldGVOb2RlKGUsMSkpLGUuZ2V0RWRnZXMoKS51cGRhdGVMYWJlbGxpbmcobil9fSxlLnByb3RvdHlwZS5pc0NvdmVyZWRCeUE9ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLmlzQ292ZXJlZCh0LHRoaXMuX3Jlc3VsdFBvbHlMaXN0KX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oRmMpO09jLm92ZXJsYXlPcD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG5ldyBPYyh0LGUpLmdldFJlc3VsdEdlb21ldHJ5KG4pfSxPYy5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXtpZih0LmlzRW1wdHkoKXx8ZS5pc0VtcHR5KCkpcmV0dXJuIE9jLmNyZWF0ZUVtcHR5UmVzdWx0KE9jLklOVEVSU0VDVElPTix0LGUsdC5nZXRGYWN0b3J5KCkpO2lmKHQuaXNHZW9tZXRyeUNvbGxlY3Rpb24oKSl7dmFyIG49ZTtyZXR1cm4gUXUubWFwKHQse2ludGVyZmFjZXNfOmZ1bmN0aW9uKCl7cmV0dXJuW1RjLk1hcE9wXX0sbWFwOmZ1bmN0aW9uKHQpe3JldHVybiB0LmludGVyc2VjdGlvbihuKX19KX1yZXR1cm4gdC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbih0KSx0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKGUpLGZjLm92ZXJsYXlPcCh0LGUsT2MuSU5URVJTRUNUSU9OKX0sT2Muc3ltRGlmZmVyZW5jZT1mdW5jdGlvbih0LGUpe2lmKHQuaXNFbXB0eSgpfHxlLmlzRW1wdHkoKSl7aWYodC5pc0VtcHR5KCkmJmUuaXNFbXB0eSgpKXJldHVybiBPYy5jcmVhdGVFbXB0eVJlc3VsdChPYy5TWU1ESUZGRVJFTkNFLHQsZSx0LmdldEZhY3RvcnkoKSk7aWYodC5pc0VtcHR5KCkpcmV0dXJuIGUuY29weSgpO2lmKGUuaXNFbXB0eSgpKXJldHVybiB0LmNvcHkoKX1yZXR1cm4gdC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbih0KSx0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKGUpLGZjLm92ZXJsYXlPcCh0LGUsT2MuU1lNRElGRkVSRU5DRSl9LE9jLnJlc3VsdERpbWVuc2lvbj1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS5nZXREaW1lbnNpb24oKSxpPW4uZ2V0RGltZW5zaW9uKCksbz0tMTtzd2l0Y2godCl7Y2FzZSBPYy5JTlRFUlNFQ1RJT046bz1NYXRoLm1pbihyLGkpO2JyZWFrO2Nhc2UgT2MuVU5JT046bz1NYXRoLm1heChyLGkpO2JyZWFrO2Nhc2UgT2MuRElGRkVSRU5DRTpvPXI7YnJlYWs7Y2FzZSBPYy5TWU1ESUZGRVJFTkNFOm89TWF0aC5tYXgocixpKX1yZXR1cm4gb30sT2MuY3JlYXRlRW1wdHlSZXN1bHQ9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bnVsbDtzd2l0Y2goT2MucmVzdWx0RGltZW5zaW9uKHQsZSxuKSl7Y2FzZS0xOmk9ci5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24obmV3IEFycmF5KDApLmZpbGwobnVsbCkpO2JyZWFrO2Nhc2UgMDppPXIuY3JlYXRlUG9pbnQoKTticmVhaztjYXNlIDE6aT1yLmNyZWF0ZUxpbmVTdHJpbmcoKTticmVhaztjYXNlIDI6aT1yLmNyZWF0ZVBvbHlnb24oKX1yZXR1cm4gaX0sT2MuZGlmZmVyZW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiB0LmlzRW1wdHkoKT9PYy5jcmVhdGVFbXB0eVJlc3VsdChPYy5ESUZGRVJFTkNFLHQsZSx0LmdldEZhY3RvcnkoKSk6ZS5pc0VtcHR5KCk/dC5jb3B5KCk6KHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24odCksdC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbihlKSxmYy5vdmVybGF5T3AodCxlLE9jLkRJRkZFUkVOQ0UpKX0sT2MuaXNSZXN1bHRPZk9wPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPXQuZ2V0TG9jYXRpb24oMCkscj10LmdldExvY2F0aW9uKDEpO3JldHVybiBPYy5pc1Jlc3VsdE9mT3AobixyLGUpfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV07c3dpdGNoKGk9PT1iaS5CT1VOREFSWSYmKGk9YmkuSU5URVJJT1IpLG89PT1iaS5CT1VOREFSWSYmKG89YmkuSU5URVJJT1IpLGFyZ3VtZW50c1syXSl7Y2FzZSBPYy5JTlRFUlNFQ1RJT046cmV0dXJuIGk9PT1iaS5JTlRFUklPUiYmbz09PWJpLklOVEVSSU9SO2Nhc2UgT2MuVU5JT046cmV0dXJuIGk9PT1iaS5JTlRFUklPUnx8bz09PWJpLklOVEVSSU9SO2Nhc2UgT2MuRElGRkVSRU5DRTpyZXR1cm4gaT09PWJpLklOVEVSSU9SJiZvIT09YmkuSU5URVJJT1I7Y2FzZSBPYy5TWU1ESUZGRVJFTkNFOnJldHVybiBpPT09YmkuSU5URVJJT1ImJm8hPT1iaS5JTlRFUklPUnx8aSE9PWJpLklOVEVSSU9SJiZvPT09YmkuSU5URVJJT1J9cmV0dXJuITF9fSxPYy5JTlRFUlNFQ1RJT049MSxPYy5VTklPTj0yLE9jLkRJRkZFUkVOQ0U9MyxPYy5TWU1ESUZGRVJFTkNFPTQ7dmFyIExjPWZ1bmN0aW9uKCl7dGhpcy5fZz1udWxsLHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9bnVsbCx0aGlzLl9saW5ld29yaz1udWxsLHRoaXMuX3B0TG9jYXRvcj1uZXcgVHUsdGhpcy5fc2VnPW5ldyBiYTt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZz10LHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9ZSx0aGlzLl9saW5ld29yaz10aGlzLmV4dHJhY3RMaW5ld29yayh0KX07TGMucHJvdG90eXBlLmlzV2l0aGluVG9sZXJhbmNlT2ZCb3VuZGFyeT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPTA7bjx0aGlzLl9saW5ld29yay5nZXROdW1HZW9tZXRyaWVzKCk7bisrKWZvcih2YXIgcj1lLl9saW5ld29yay5nZXRHZW9tZXRyeU4obikuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksaT0wO2k8ci5zaXplKCktMTtpKyspe2lmKHIuZ2V0Q29vcmRpbmF0ZShpLGUuX3NlZy5wMCksci5nZXRDb29yZGluYXRlKGkrMSxlLl9zZWcucDEpLGUuX3NlZy5kaXN0YW5jZSh0KTw9ZS5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZSlyZXR1cm4hMH1yZXR1cm4hMX0sTGMucHJvdG90eXBlLmdldExvY2F0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmlzV2l0aGluVG9sZXJhbmNlT2ZCb3VuZGFyeSh0KT9iaS5CT1VOREFSWTp0aGlzLl9wdExvY2F0b3IubG9jYXRlKHQsdGhpcy5fZyl9LExjLnByb3RvdHlwZS5leHRyYWN0TGluZXdvcms9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFBjO3QuYXBwbHkoZSk7dmFyIG49ZS5nZXRMaW5ld29yaygpLHI9SXMudG9MaW5lU3RyaW5nQXJyYXkobik7cmV0dXJuIHQuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZyhyKX0sTGMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LExjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBMY307dmFyIFBjPWZ1bmN0aW9uKCl7dGhpcy5fbGluZXdvcms9bnVsbCx0aGlzLl9saW5ld29yaz1uZXcgeG99O1BjLnByb3RvdHlwZS5nZXRMaW5ld29yaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9saW5ld29ya30sUGMucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgaHMpe3ZhciBlPXQ7dGhpcy5fbGluZXdvcmsuYWRkKGUuZ2V0RXh0ZXJpb3JSaW5nKCkpO2Zvcih2YXIgbj0wO248ZS5nZXROdW1JbnRlcmlvclJpbmcoKTtuKyspdGhpcy5fbGluZXdvcmsuYWRkKGUuZ2V0SW50ZXJpb3JSaW5nTihuKSl9fSxQYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bWG9dfSxQYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUGN9O3ZhciBSYz1mdW5jdGlvbigpe3RoaXMuX2c9bnVsbCx0aGlzLl9kb0xlZnQ9ITAsdGhpcy5fZG9SaWdodD0hMDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZz10fTtSYy5wcm90b3R5cGUuZXh0cmFjdFBvaW50cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXQuZ2V0Q29vcmRpbmF0ZXMoKSxpPTA7aTxyLmxlbmd0aC0xO2krKyl0aGlzLmNvbXB1dGVPZmZzZXRQb2ludHMocltpXSxyW2krMV0sZSxuKX0sUmMucHJvdG90eXBlLnNldFNpZGVzVG9HZW5lcmF0ZT1mdW5jdGlvbih0LGUpe3RoaXMuX2RvTGVmdD10LHRoaXMuX2RvUmlnaHQ9ZX0sUmMucHJvdG90eXBlLmdldFBvaW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49RnUuZ2V0TGluZXModGhpcy5fZykuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3RoaXMuZXh0cmFjdFBvaW50cyhyLHQsZSl9cmV0dXJuIGV9LFJjLnByb3RvdHlwZS5jb21wdXRlT2Zmc2V0UG9pbnRzPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWUueC10Lngsbz1lLnktdC55LHM9TWF0aC5zcXJ0KGkqaStvKm8pLGE9bippL3MsdT1uKm8vcyxjPShlLngrdC54KS8yLGw9KGUueSt0LnkpLzI7aWYodGhpcy5fZG9MZWZ0KXt2YXIgaD1uZXcgdmkoYy11LGwrYSk7ci5hZGQoaCl9aWYodGhpcy5fZG9SaWdodCl7dmFyIGY9bmV3IHZpKGMrdSxsLWEpO3IuYWRkKGYpfX0sUmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFJjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBSY307dmFyIEJjPWZ1bmN0aW9uIHQoKXt0aGlzLl9nZW9tPW51bGwsdGhpcy5fbG9jRmluZGVyPW51bGwsdGhpcy5fbG9jYXRpb249bmV3IEFycmF5KDMpLmZpbGwobnVsbCksdGhpcy5faW52YWxpZExvY2F0aW9uPW51bGwsdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZT10LlRPTEVSQU5DRSx0aGlzLl90ZXN0Q29vcmRzPW5ldyB4bzt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZT10LmNvbXB1dGVCb3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlKGUsbiksdGhpcy5fZ2VvbT1bZSxuLHJdLHRoaXMuX2xvY0ZpbmRlcj1bbmV3IExjKHRoaXMuX2dlb21bMF0sdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZSksbmV3IExjKHRoaXMuX2dlb21bMV0sdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZSksbmV3IExjKHRoaXMuX2dlb21bMl0sdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZSldfSxrYz17VE9MRVJBTkNFOntjb25maWd1cmFibGU6ITB9fTtCYy5wcm90b3R5cGUucmVwb3J0UmVzdWx0PWZ1bmN0aW9uKHQsZSxuKXtraS5vdXQucHJpbnRsbigiT3ZlcmxheSByZXN1bHQgaW52YWxpZCAtIEE6IitiaS50b0xvY2F0aW9uU3ltYm9sKGVbMF0pKyIgQjoiK2JpLnRvTG9jYXRpb25TeW1ib2woZVsxXSkrIiBleHBlY3RlZDoiKyhuPyJpIjoiZSIpKyIgYWN0dWFsOiIrYmkudG9Mb2NhdGlvblN5bWJvbChlWzJdKSl9LEJjLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFkZFRlc3RQdHModGhpcy5fZ2VvbVswXSksdGhpcy5hZGRUZXN0UHRzKHRoaXMuX2dlb21bMV0pLHRoaXMuY2hlY2tWYWxpZCh0KX0sQmMucHJvdG90eXBlLmNoZWNrVmFsaWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49MDtuPHRoaXMuX3Rlc3RDb29yZHMuc2l6ZSgpO24rKyl7dmFyIHI9dC5fdGVzdENvb3Jkcy5nZXQobik7aWYoIXQuY2hlY2tWYWxpZChlLHIpKXJldHVybiB0Ll9pbnZhbGlkTG9jYXRpb249ciwhMX1yZXR1cm4hMH1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLl9sb2NhdGlvblswXT10aGlzLl9sb2NGaW5kZXJbMF0uZ2V0TG9jYXRpb24obyksdGhpcy5fbG9jYXRpb25bMV09dGhpcy5fbG9jRmluZGVyWzFdLmdldExvY2F0aW9uKG8pLHRoaXMuX2xvY2F0aW9uWzJdPXRoaXMuX2xvY0ZpbmRlclsyXS5nZXRMb2NhdGlvbihvKSwhIUJjLmhhc0xvY2F0aW9uKHRoaXMuX2xvY2F0aW9uLGJpLkJPVU5EQVJZKXx8dGhpcy5pc1ZhbGlkUmVzdWx0KGksdGhpcy5fbG9jYXRpb24pfX0sQmMucHJvdG90eXBlLmFkZFRlc3RQdHM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFJjKHQpO3RoaXMuX3Rlc3RDb29yZHMuYWRkQWxsKGUuZ2V0UG9pbnRzKDUqdGhpcy5fYm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZSkpfSxCYy5wcm90b3R5cGUuaXNWYWxpZFJlc3VsdD1mdW5jdGlvbih0LGUpe3ZhciBuPU9jLmlzUmVzdWx0T2ZPcChlWzBdLGVbMV0sdCkscj0hKG5eZVsyXT09PWJpLklOVEVSSU9SKTtyZXR1cm4gcnx8dGhpcy5yZXBvcnRSZXN1bHQodCxlLG4pLHJ9LEJjLnByb3RvdHlwZS5nZXRJbnZhbGlkTG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW52YWxpZExvY2F0aW9ufSxCYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sQmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEJjfSxCYy5oYXNMb2NhdGlvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248MztuKyspaWYodFtuXT09PWUpcmV0dXJuITA7cmV0dXJuITF9LEJjLmNvbXB1dGVCb3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWluKHJjLmNvbXB1dGVTaXplQmFzZWRTbmFwVG9sZXJhbmNlKHQpLHJjLmNvbXB1dGVTaXplQmFzZWRTbmFwVG9sZXJhbmNlKGUpKX0sQmMuaXNWYWxpZD1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gbmV3IEJjKHQsZSxyKS5pc1ZhbGlkKG4pfSxrYy5UT0xFUkFOQ0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTZ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEJjLGtjKTt2YXIgemM9ZnVuY3Rpb24gdChlKXt0aGlzLl9nZW9tRmFjdG9yeT1udWxsLHRoaXMuX3NraXBFbXB0eT0hMSx0aGlzLl9pbnB1dEdlb21zPW51bGwsdGhpcy5fZ2VvbUZhY3Rvcnk9dC5leHRyYWN0RmFjdG9yeShlKSx0aGlzLl9pbnB1dEdlb21zPWV9O3pjLnByb3RvdHlwZS5leHRyYWN0RWxlbWVudHM9ZnVuY3Rpb24odCxlKXtpZihudWxsPT09dClyZXR1cm4gbnVsbDtmb3IodmFyIG49MDtuPHQuZ2V0TnVtR2VvbWV0cmllcygpO24rKyl7dmFyIHI9dC5nZXRHZW9tZXRyeU4obik7dGhpcy5fc2tpcEVtcHR5JiZyLmlzRW1wdHkoKXx8ZS5hZGQocil9fSx6Yy5wcm90b3R5cGUuY29tYmluZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgeG8sZT10aGlzLl9pbnB1dEdlb21zLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0aGlzLmV4dHJhY3RFbGVtZW50cyhuLHQpfXJldHVybiAwPT09dC5zaXplKCk/bnVsbCE9PXRoaXMuX2dlb21GYWN0b3J5P3RoaXMuX2dlb21GYWN0b3J5LmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihudWxsKTpudWxsOnRoaXMuX2dlb21GYWN0b3J5LmJ1aWxkR2VvbWV0cnkodCl9LHpjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx6Yy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gemN9LHpjLmNvbWJpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IHpjKGFyZ3VtZW50c1swXSkuY29tYmluZSgpOjI9PT1hcmd1bWVudHMubGVuZ3RoP25ldyB6Yyh6Yy5jcmVhdGVMaXN0KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pKS5jb21iaW5lKCk6Mz09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IHpjKHpjLmNyZWF0ZUxpc3QoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pKS5jb21iaW5lKCk6dm9pZCAwfSx6Yy5leHRyYWN0RmFjdG9yeT1mdW5jdGlvbih0KXtyZXR1cm4gdC5pc0VtcHR5KCk/bnVsbDp0Lml0ZXJhdG9yKCkubmV4dCgpLmdldEZhY3RvcnkoKX0semMuY3JlYXRlTGlzdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1uZXcgeG87cmV0dXJuIG4uYWRkKHQpLG4uYWRkKGUpLG59aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXSxzPW5ldyB4bztyZXR1cm4gcy5hZGQocikscy5hZGQoaSkscy5hZGQobyksc319O3ZhciBqYz1mdW5jdGlvbigpe3RoaXMuX2lucHV0UG9seXM9bnVsbCx0aGlzLl9nZW9tRmFjdG9yeT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9pbnB1dFBvbHlzPXQsbnVsbD09PXRoaXMuX2lucHV0UG9seXMmJih0aGlzLl9pbnB1dFBvbHlzPW5ldyB4byl9LFVjPXtTVFJUUkVFX05PREVfQ0FQQUNJVFk6e2NvbmZpZ3VyYWJsZTohMH19O2pjLnByb3RvdHlwZS5yZWR1Y2VUb0dlb21ldHJpZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPXQuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpLGk9bnVsbDtFaShyLHZvKT9pPXRoaXMudW5pb25UcmVlKHIpOnIgaW5zdGFuY2VvZiBpbyYmKGk9ciksZS5hZGQoaSl9cmV0dXJuIGV9LGpjLnByb3RvdHlwZS5leHRyYWN0QnlFbnZlbG9wZT1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW5ldyB4byxpPTA7aTxlLmdldE51bUdlb21ldHJpZXMoKTtpKyspe3ZhciBvPWUuZ2V0R2VvbWV0cnlOKGkpO28uZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLmludGVyc2VjdHModCk/ci5hZGQobyk6bi5hZGQobyl9cmV0dXJuIHRoaXMuX2dlb21GYWN0b3J5LmJ1aWxkR2VvbWV0cnkocil9LGpjLnByb3RvdHlwZS51bmlvbk9wdGltaXplZD1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLHI9ZS5nZXRFbnZlbG9wZUludGVybmFsKCk7aWYoIW4uaW50ZXJzZWN0cyhyKSlyZXR1cm4gemMuY29tYmluZSh0LGUpO2lmKHQuZ2V0TnVtR2VvbWV0cmllcygpPD0xJiZlLmdldE51bUdlb21ldHJpZXMoKTw9MSlyZXR1cm4gdGhpcy51bmlvbkFjdHVhbCh0LGUpO3ZhciBpPW4uaW50ZXJzZWN0aW9uKHIpO3JldHVybiB0aGlzLnVuaW9uVXNpbmdFbnZlbG9wZUludGVyc2VjdGlvbih0LGUsaSl9LGpjLnByb3RvdHlwZS51bmlvbj1mdW5jdGlvbigpe2lmKG51bGw9PT10aGlzLl9pbnB1dFBvbHlzKXRocm93IG5ldyBFcnJvcigidW5pb24oKSBtZXRob2QgY2Fubm90IGJlIGNhbGxlZCB0d2ljZSIpO2lmKHRoaXMuX2lucHV0UG9seXMuaXNFbXB0eSgpKXJldHVybiBudWxsO3RoaXMuX2dlb21GYWN0b3J5PXRoaXMuX2lucHV0UG9seXMuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RmFjdG9yeSgpO2Zvcih2YXIgdD1uZXcgcGEoamMuU1RSVFJFRV9OT0RFX0NBUEFDSVRZKSxlPXRoaXMuX2lucHV0UG9seXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3QuaW5zZXJ0KG4uZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLG4pfXRoaXMuX2lucHV0UG9seXM9bnVsbDt2YXIgcj10Lml0ZW1zVHJlZSgpO3JldHVybiB0aGlzLnVuaW9uVHJlZShyKX0samMucHJvdG90eXBlLmJpbmFyeVVuaW9uPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5iaW5hcnlVbmlvbih0LDAsdC5zaXplKCkpfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07aWYoci1uPD0xKXt2YXIgaT1qYy5nZXRHZW9tZXRyeShlLG4pO3JldHVybiB0aGlzLnVuaW9uU2FmZShpLG51bGwpfWlmKHItbj09MilyZXR1cm4gdGhpcy51bmlvblNhZmUoamMuZ2V0R2VvbWV0cnkoZSxuKSxqYy5nZXRHZW9tZXRyeShlLG4rMSkpO3ZhciBvPU1hdGgudHJ1bmMoKHIrbikvMikscz10aGlzLmJpbmFyeVVuaW9uKGUsbixvKSxhPXRoaXMuYmluYXJ5VW5pb24oZSxvLHIpO3JldHVybiB0aGlzLnVuaW9uU2FmZShzLGEpfX0samMucHJvdG90eXBlLnJlcGVhdGVkVW5pb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW51bGwsbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtlPW51bGw9PT1lP3IuY29weSgpOmUudW5pb24ocil9cmV0dXJuIGV9LGpjLnByb3RvdHlwZS51bmlvblNhZmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09PXQmJm51bGw9PT1lP251bGw6bnVsbD09PXQ/ZS5jb3B5KCk6bnVsbD09PWU/dC5jb3B5KCk6dGhpcy51bmlvbk9wdGltaXplZCh0LGUpfSxqYy5wcm90b3R5cGUudW5pb25BY3R1YWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gamMucmVzdHJpY3RUb1BvbHlnb25zKHQudW5pb24oZSkpfSxqYy5wcm90b3R5cGUudW5pb25UcmVlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucmVkdWNlVG9HZW9tZXRyaWVzKHQpO3JldHVybiB0aGlzLmJpbmFyeVVuaW9uKGUpfSxqYy5wcm90b3R5cGUudW5pb25Vc2luZ0VudmVsb3BlSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgeG8saT10aGlzLmV4dHJhY3RCeUVudmVsb3BlKG4sdCxyKSxvPXRoaXMuZXh0cmFjdEJ5RW52ZWxvcGUobixlLHIpLHM9dGhpcy51bmlvbkFjdHVhbChpLG8pO3JldHVybiByLmFkZChzKSx6Yy5jb21iaW5lKHIpfSxqYy5wcm90b3R5cGUuYnVmZmVyVW5pb249ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0LmdldCgwKS5nZXRGYWN0b3J5KCkuYnVpbGRHZW9tZXRyeSh0KS5idWZmZXIoMCl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4gZS5nZXRGYWN0b3J5KCkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKFtlLG5dKS5idWZmZXIoMCl9fSxqYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0samMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGpjfSxqYy5yZXN0cmljdFRvUG9seWdvbnM9ZnVuY3Rpb24odCl7aWYoRWkodCxscykpcmV0dXJuIHQ7dmFyIGU9TXUuZ2V0UG9seWdvbnModCk7cmV0dXJuIDE9PT1lLnNpemUoKT9lLmdldCgwKTp0LmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aVBvbHlnb24oSXMudG9Qb2x5Z29uQXJyYXkoZSkpfSxqYy5nZXRHZW9tZXRyeT1mdW5jdGlvbih0LGUpe3JldHVybiBlPj10LnNpemUoKT9udWxsOnQuZ2V0KGUpfSxqYy51bmlvbj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGpjKHQpLnVuaW9uKCl9LFVjLlNUUlRSRUVfTk9ERV9DQVBBQ0lUWS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gNH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoamMsVWMpO3ZhciBxYz1mdW5jdGlvbigpe307cWMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHFjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBxY30scWMudW5pb249ZnVuY3Rpb24odCxlKXtpZih0LmlzRW1wdHkoKXx8ZS5pc0VtcHR5KCkpe2lmKHQuaXNFbXB0eSgpJiZlLmlzRW1wdHkoKSlyZXR1cm4gT2MuY3JlYXRlRW1wdHlSZXN1bHQoT2MuVU5JT04sdCxlLHQuZ2V0RmFjdG9yeSgpKTtpZih0LmlzRW1wdHkoKSlyZXR1cm4gZS5jb3B5KCk7aWYoZS5pc0VtcHR5KCkpcmV0dXJuIHQuY29weSgpfXJldHVybiB0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKHQpLHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24oZSksZmMub3ZlcmxheU9wKHQsZSxPYy5VTklPTil9O3ZhciBWYz1mdW5jdGlvbigpe3JldHVybiBuZXcgR2N9O2Z1bmN0aW9uIEdjKCl7dGhpcy5yZXNldCgpfUdjLnByb3RvdHlwZT17Y29uc3RydWN0b3I6R2MscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXtYYyhZYyx0LHRoaXMudCksWGModGhpcyxZYy5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9WWMudDp0aGlzLnM9WWMudH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgWWM9bmV3IEdjO2Z1bmN0aW9uIFhjKHQsZSxuKXt2YXIgcj10LnM9ZStuLGk9ci1lLG89ci1pO3QudD1lLW8rKG4taSl9dmFyIFdjPU1hdGguUEksSGM9MipXYztmdW5jdGlvbiBaYyh0LGUpe3JldHVyblt0PldjP3QtSGM6dDwtV2M/dCtIYzp0LGVdfVZjKCksVmMoKSxWYygpLFpjLmludmVydD1aYzt2YXIgS2MsSmMsUWMsJGMsdGwsZWwsbmwscmwsaWwsb2wsc2wsYWwsdWwsY2wsbGwsaGwsZmwscGwsZGwsZ2wseWwsbWwsdmwsX2wseGwsd2wsYmwsRGwsRWwsQ2wsU2wsQWwsTmwsSWwsTWwsRmwsVGwsT2wsTGwsUGwsUmw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59O2Z1bmN0aW9uIEJsKCl7fWZ1bmN0aW9uIGtsKHQsZSxuKXt2YXIgcj12b2lkIDA9PT1lP251bGw6ZSxpPWZ1bmN0aW9uKHQsZSl7dmFyIG49YXRvYih0KTtpZihlKXtmb3IodmFyIHI9bmV3IFVpbnQ4QXJyYXkobi5sZW5ndGgpLGk9MCxvPW4ubGVuZ3RoO2k8bzsrK2kpcltpXT1uLmNoYXJDb2RlQXQoaSk7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDE2QXJyYXkoci5idWZmZXIpKX1yZXR1cm4gbn0odCx2b2lkIDAhPT1uJiZuKSxvPWkuaW5kZXhPZigiXG4iLDEwKSsxLHM9aS5zdWJzdHJpbmcobykrKHI/Ii8vIyBzb3VyY2VNYXBwaW5nVVJMPSIrcjoiIiksYT1uZXcgQmxvYihbc10se3R5cGU6ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQifSk7cmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwoYSl9ZnVuY3Rpb24gemwodD04LGU9NjIpe2NvbnN0IG49IjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ii5zcGxpdCgiIikscj1bXTtsZXQgaTtpZihlPWV8fG4ubGVuZ3RoLHQpZm9yKGk9MDtpPHQ7aSsrKXJbaV09blswfE1hdGgucmFuZG9tKCkqZV07ZWxzZXtsZXQgdDtmb3Iocls4XT1yWzEzXT1yWzE4XT1yWzIzXT0iLSIsclsxNF09IjQiLGk9MDtpPDM2O2krKylyW2ldfHwodD0wfDE2Kk1hdGgucmFuZG9tKCkscltpXT1uWzE5PT09aT8zJnR8ODp0XSl9cmV0dXJuIHIuam9pbigiIil9KGZ1bmN0aW9uKHQpezE9PT10Lmxlbmd0aCYmKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIFJsKHQoZSksbil9fSh0KSl9KShSbCksVmMoKSxWYygpLFZjKCksVmMoKSxWYygpLEJsLnByb3RvdHlwZT17Y29uc3RydWN0b3I6QmwscG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLnN0cmVhbS5wb2ludCh0LGUpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX0sZnVuY3Rpb24odCl7dC5Qb2ludENsb3VkPSJwb2ludENsb3VkVG9vbCJ9KEtjfHwoS2M9e30pKSxmdW5jdGlvbih0KXt0LlZpZGVvVGV4dFRvb2w9InZpZGVvVGV4dFRvb2wiLHQuVmlkZW9UYWdUb29sPSJ2aWRlb1RhZ1Rvb2wiLHQuVmlkZW9DbGlwVG9vbD0idmlkZW9DbGlwVG9vbCJ9KEpjfHwoSmM9e30pKSxmdW5jdGlvbih0KXt0LkF1ZGlvVGV4dFRvb2w9ImF1ZGlvVGV4dFRvb2wifShRY3x8KFFjPXt9KSksZnVuY3Rpb24odCl7dFt0LlJlY3Q9MF09IlJlY3QiLHRbdC5UYWc9MV09IlRhZyJ9KCRjfHwoJGM9e30pKSxmdW5jdGlvbih0KXt0LlJlY3Q9InJlY3RUb29sIix0LlRhZz0idGFnVG9vbCIsdC5Qb2ludD0icG9pbnRUb29sIix0LlBvaW50TWFya2VyPSJwb2ludE1hcmtlclRvb2wiLHQuU2VnbWVudGF0aW9uPSJzZWdtZW50YXRpb25Ub29sIix0LkZpbHRlcj0iZmlsdGVyVG9vbCIsdC5UZXh0PSJ0ZXh0VG9vbCIsdC5Qb2x5Z29uPSJwb2x5Z29uVG9vbCIsdC5MaW5lPSJsaW5lVG9vbCIsdC5MaW5lTWFya2VyPSJsaW5lTWFya2VyVG9vbCIsdC5FbXB0eT0iZW1wdHlUb29sIix0LkZvbGRlclRhZz0iZm9sZGVyVGFnVG9vbCIsdC5SZWN0VHJhY2s9InJlY3RUcmFja1Rvb2wiLHQuU2NyaWJibGVUb29sPSJzY3JpYmJsZVRvb2wiLHQuRmFjZT0iZmFjZVRvb2wiLHQuQ2xpZW50QXR0cmlidXRlPSJjbGllbnRBdHRyaWJ1dGVUb29sIix0Lk9DUlJlbGF0aW9uPSJPQ1JSZWxhdGlvblRvb2wiLHQuU2VnbWVudEJ5UmVjdD0ic2VnbWVudEJ5UmVjdFRvb2wiLHQuQ3Vib2lkPSJjdWJvaWRUb29sIix0LlBvaW50Q2xvdWRQb2x5Z29uPSJwb2ludENsb3VkUG9seWdvbiIsdC5MTE09IkxMTVRvb2wiLHQuTkxQPSJOTFBUb29sIix0LkxMTU11bHRpV2hlZWw9IkxMTU11bHRpV2hlZWxUb29sIn0odGx8fCh0bD17fSkpLGZ1bmN0aW9uKHQpe3QuQ2hlY2s9ImNoZWNrIn0oZWx8fChlbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5ub3RoaW5nPTBdPSJub3RoaW5nIix0W3QuUmVjdEJHPTFdPSJSZWN0QkciLHRbdC5zaG93T3JkZXI9Ml09InNob3dPcmRlciJ9KG5sfHwobmw9e30pKSx0bC5SZWN0LHRsLlRhZyx0bC5Qb2ludCx0bC5Qb2ludE1hcmtlcix0bC5TZWdtZW50YXRpb24sdGwuRmlsdGVyLHRsLlRleHQsdGwuUG9seWdvbix0bC5MaW5lLHRsLkxpbmVNYXJrZXIsdGwuRm9sZGVyVGFnLHRsLlJlY3RUcmFjayx0bC5GYWNlLHRsLkNsaWVudEF0dHJpYnV0ZSx0bC5PQ1JSZWxhdGlvbix0bC5TZWdtZW50QnlSZWN0LEpjLlZpZGVvVGV4dFRvb2wsSmMuVmlkZW9UYWdUb29sLEpjLlZpZGVvQ2xpcFRvb2wsS2MuUG9pbnRDbG91ZCx0bC5DdWJvaWQsdGwuTExNLHRsLk5MUCx0bC5MTE1NdWx0aVdoZWVsLHRsLlJlY3QsdGwuVGFnLHRsLlBvaW50LHRsLlBvaW50TWFya2VyLHRsLlNlZ21lbnRhdGlvbix0bC5GaWx0ZXIsdGwuVGV4dCx0bC5Qb2x5Z29uLHRsLkxpbmUsdGwuTGluZU1hcmtlcix0bC5Gb2xkZXJUYWcsdGwuUmVjdFRyYWNrLHRsLkZhY2UsdGwuQ2xpZW50QXR0cmlidXRlLHRsLk9DUlJlbGF0aW9uLHRsLlNlZ21lbnRCeVJlY3QsSmMuVmlkZW9UZXh0VG9vbCxKYy5WaWRlb1RhZ1Rvb2wsSmMuVmlkZW9DbGlwVG9vbCxLYy5Qb2ludENsb3VkLHRsLkN1Ym9pZCx0bC5MTE0sdGwuTkxQLHRsLkxMTU11bHRpV2hlZWwsZnVuY3Rpb24odCl7dFt0Lm5vRGVwZW5kPTFdPSJub0RlcGVuZCIsdFt0LmRlcGVuZE9yaWdpbj0yXT0iZGVwZW5kT3JpZ2luIix0W3QuZGVwZW5kU2hhcGU9M109ImRlcGVuZFNoYXBlIix0W3QuZGVwZW5kTGluZT00XT0iZGVwZW5kTGluZSIsdFt0LmRlcGVuZFBvbHlnb249NV09ImRlcGVuZFBvbHlnb24iLHRbdC5kZXBlbmRQcmVTaGFwZT0xMDFdPSJkZXBlbmRQcmVTaGFwZSIsdFt0LmRlcGVuZFByZUxpbmU9MTAyXT0iZGVwZW5kUHJlTGluZSIsdFt0LmRlcGVuZFByZVBvbHlnb249MTAzXT0iZGVwZW5kUHJlUG9seWdvbiJ9KHJsfHwocmw9e30pKSxmdW5jdGlvbih0KXt0LmxjPSJsZWZ0Q2xpY2siLHQucmM9InJpZ2h0Q2xpY2siLHQuY2xjPSJjdHJsTGVmdENsaWNrIix0LmNyYz0iY3RybFJpZ2h0Q2xpY2sifShpbHx8KGlsPXt9KSksZnVuY3Rpb24odCl7dFt0Lk5vcm1hbD0xXT0iTm9ybWFsIix0W3QuTW9kaWZ5PTJdPSJNb2RpZnkifShvbHx8KG9sPXt9KSksZnVuY3Rpb24odCl7dFt0LkxpbmU9MF09IkxpbmUiLHRbdC5DdXJ2ZT0xXT0iQ3VydmUifShzbHx8KHNsPXt9KSksZnVuY3Rpb24odCl7dFt0LlNpbmdsZUNvbG9yPTBdPSJTaW5nbGVDb2xvciIsdFt0Lk11bHRpQ29sb3I9MV09Ik11bHRpQ29sb3IifShhbHx8KGFsPXt9KSksZnVuY3Rpb24odCl7dFt0LkZvcm09MV09IkZvcm0iLHRbdC5Kc29uPTJdPSJKc29uIn0odWx8fCh1bD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5Qb2ludD0wXT0iUG9pbnQiLHRbdC5MaW5lPTFdPSJMaW5lIix0W3QuUGxhbmU9Ml09IlBsYW5lIn0oY2x8fChjbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5Ob25lPTBdPSJOb25lIix0W3QuRHJhd2luZz0xXT0iRHJhd2luZyIsdFt0LkVkaXQ9Ml09IkVkaXQifShsbHx8KGxsPXt9KSksZnVuY3Rpb24odCl7dFt0LkJhY2t3YXJkPTBdPSJCYWNrd2FyZCIsdFt0LkZvcndhcmQ9MV09IkZvcndhcmQiLHRbdC5KdW1wU2tpcD0yXT0iSnVtcFNraXAiLHRbdC5Ob25lPTNdPSJOb25lIn0oaGx8fChobD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5XYWl0PTBdPSJXYWl0Iix0W3QuUGFzcz0xXT0iUGFzcyIsdFt0LkZhaWw9Ml09IkZhaWwiLHRbdC5Mb2FkaW5nPTNdPSJMb2FkaW5nIn0oZmx8fChmbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5BbnlTdHJpbmc9MF09IkFueVN0cmluZyIsdFt0Lk9yZGVyPTFdPSJPcmRlciIsdFt0LkVuZ2xpc2hPbmx5PTJdPSJFbmdsaXNoT25seSIsdFt0Lk51bWJlck9ubHk9M109Ik51bWJlck9ubHkiLHRbdC5DdXN0b21Gb3JtYXQ9NF09IkN1c3RvbUZvcm1hdCJ9KHBsfHwocGw9e30pKSxmdW5jdGlvbih0KXt0W3QuSW1nTGlzdD0xZTNdPSJJbWdMaXN0Iix0W3QuVHJhY2tQcmVkaWN0aW9uPTEwMDFdPSJUcmFja1ByZWRpY3Rpb24iLHRbdC5JbWdTZWFyY2g9MTAwMl09IkltZ1NlYXJjaCJ9KGRsfHwoZGw9e30pKSxLYy5Qb2ludENsb3VkLHRsLkNsaWVudEF0dHJpYnV0ZSx0bC5GYWNlLHRsLk9DUlJlbGF0aW9uLEtjLlBvaW50Q2xvdWQsdGwuQ2xpZW50QXR0cmlidXRlLHRsLkZhY2UsdGwuT0NSUmVsYXRpb24sZnVuY3Rpb24odCl7dFt0Lk5vcm1hbD0wXT0iTm9ybWFsIix0W3QuUmVjdD0xXT0iUmVjdCJ9KGdsfHwoZ2w9e30pKSxmdW5jdGlvbih0KXt0W3QuU2NyaWJibGU9MV09IlNjcmliYmxlIix0W3QuRXJhc2U9Ml09IkVyYXNlIn0oeWx8fCh5bD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5HZW5lcmFsPTFdPSJHZW5lcmFsIix0W3QuTXVsdGlNb3ZlPTJdPSJNdWx0aU1vdmUifShtbHx8KG1sPXt9KSksZnVuY3Rpb24odCl7dFt0LkFOTk9UQVRJT049MV09IkFOTk9UQVRJT04iLHRbdC5RVUFMSVRZX0lOU1BFQ1RJT049Ml09IlFVQUxJVFlfSU5TUEVDVElPTiIsdFt0LlBSRV9BTk5PVEFUSU9OPTNdPSJQUkVfQU5OT1RBVElPTiIsdFt0Lk1BTlVBTF9DT1JSRUNUSU9OPTRdPSJNQU5VQUxfQ09SUkVDVElPTiJ9KHZsfHwodmw9e30pKSxmdW5jdGlvbih0KXt0W3QuQmFja3dhcmQ9MF09IkJhY2t3YXJkIix0W3QuRm9yd2FyZD0xXT0iRm9yd2FyZCIsdFt0Lkp1bXBTa2lwPTJdPSJKdW1wU2tpcCIsdFt0Lk5vbmU9M109Ik5vbmUifShfbHx8KF9sPXt9KSksZnVuY3Rpb24odCl7dFt0LlN0YXJ0PTBdPSJTdGFydCIsdFt0LlN0b3A9MV09IlN0b3AiLHRbdC5XYWl0PTJdPSJXYWl0Iix0W3QuTW92ZT0zXT0iTW92ZSJ9KHhsfHwoeGw9e30pKSxmdW5jdGlvbih0KXt0W3QuUG9pbnQ9MF09IlBvaW50Iix0W3QuTGluZT0xXT0iTGluZSIsdFt0LlBsYW5lPTJdPSJQbGFuZSIsdFt0LkN1Ym9pZD0zXT0iQ3Vib2lkIn0od2x8fCh3bD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5hc2NlbmQ9MF09ImFzY2VuZCIsdFt0LmRlc2NlbmQ9MV09ImRlc2NlbmQifShibHx8KGJsPXt9KSksZnVuY3Rpb24odCl7dFt0LkludGVsbGlnZW5jZT0wXT0iSW50ZWxsaWdlbmNlIix0W3QuTGluZWFyPTFdPSJMaW5lYXIifShEbHx8KERsPXt9KSksZnVuY3Rpb24odCl7dC5aaD0iemhfQ04iLHQuVVM9ImVuX1VTIn0oRWx8fChFbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5DbG9ja3dpc2U9MF09IkNsb2Nrd2lzZSIsdFt0LkFudGljbG9ja3dpc2U9MV09IkFudGljbG9ja3dpc2UifShDbHx8KENsPXt9KSksZnVuY3Rpb24odCl7dC5Gcm9udD0iZnJvbnQiLHQuQmFjaz0iYmFjayIsdC5TaWRlPSJzaWRlIn0oU2x8fChTbD17fSkpLGZ1bmN0aW9uKHQpe3QuVEw9InRsIix0LlRSPSJ0ciIsdC5CTD0iYmwiLHQuQlI9ImJyIn0oQWx8fChBbD17fSkpLGZ1bmN0aW9uKHQpe3QuRnJvbnQ9ImZyb250Iix0LkJhY2s9ImJhY2siLHQuTGVmdD0ibGVmdCIsdC5SaWdodD0icmlnaHQiLHQuVG9wPSJ0b3AifShObHx8KE5sPXt9KSksZnVuY3Rpb24odCl7dC5Sb3c9InJvdyIsdC5Db2x1bW49ImNvbHVtbiJ9KElsfHwoSWw9e30pKSxBbC5UTCxBbC5UUixBbC5UUixBbC5UTCxBbC5CTCxBbC5CUixBbC5CUixBbC5CTCxBbC5UTCxBbC5CTCxBbC5UUixBbC5CUixBbC5CTCxBbC5UTCxBbC5CUixBbC5UUixmdW5jdGlvbih0KXt0W3QuQT02NV09IkEiLHRbdC5CPTY2XT0iQiIsdFt0LkM9NjddPSJDIix0W3QuRD02OF09IkQiLHRbdC5FPTY5XT0iRSIsdFt0LkY9NzBdPSJGIix0W3QuRz03MV09IkciLHRbdC5IPTcyXT0iSCIsdFt0Lkk9NzNdPSJJIix0W3QuTz03OV09Ik8iLHRbdC5MPTc2XT0iTCIsdFt0LlI9ODJdPSJSIix0W3QuWj05MF09IloiLHRbdC5XPTg3XT0iVyIsdFt0Llg9ODhdPSJYIix0W3QuWT04OV09IlkiLHRbdC5TPTgzXT0iUyIsdFt0LlE9ODFdPSJRIix0W3QuUD04MF09IlAiLHRbdC5PbmU9NDldPSJPbmUiLHRbdC5Ud289NTBdPSJUd28iLHRbdC5UaHJlZT01MV09IlRocmVlIix0W3QuRGVsZXRlPTQ2XT0iRGVsZXRlIix0W3QuRjExPTEyMl09IkYxMSIsdFt0LlNwYWNlPTMyXT0iU3BhY2UiLHRbdC5Fc2M9MjddPSJFc2MiLHRbdC5MZWZ0PTM3XT0iTGVmdCIsdFt0LlVwPTM4XT0iVXAiLHRbdC5SaWdodD0zOV09IlJpZ2h0Iix0W3QuRG93bj00MF09IkRvd24iLHRbdC5FbnRlcj0xM109IkVudGVyIix0W3QuQ3RybD0xN109IkN0cmwiLHRbdC5BbHQ9MThdPSJBbHQiLHRbdC5TaGlmdD0xNl09IlNoaWZ0Iix0W3QuVGFiPTldPSJUYWIiLHRbdC5CYWNrU3BhY2U9OF09IkJhY2tTcGFjZSIsdFt0Lk1pbnVzPTE4OV09Ik1pbnVzIix0W3QuRXF1YWw9MTg3XT0iRXF1YWwifShNbHx8KE1sPXt9KSksZnVuY3Rpb24odCl7dFt0LkNyZWF0ZT0wXT0iQ3JlYXRlIix0W3QuQWN0aXZlPTFdPSJBY3RpdmUiLHRbdC5FZGl0PTFdPSJFZGl0Iix0W3QuTm9uZT0yXT0iTm9uZSJ9KEZsfHwoRmw9e30pKSxmdW5jdGlvbih0KXt0LkFjdGl2ZUFyZWE9IiNCM0I4RkYifShUbHx8KFRsPXt9KSksZnVuY3Rpb24odCl7dFt0Lk91dHNpZGU9MF09Ik91dHNpZGUiLHRbdC5QYXJ0aWFsbHlJbnNpZGU9MV09IlBhcnRpYWxseUluc2lkZSIsdFt0LkZ1bGx5SW5zaWRlPTJdPSJGdWxseUluc2lkZSJ9KE9sfHwoT2w9e30pKSxmdW5jdGlvbih0KXt0Lk5vUm90YXRlTm90aWNlPSJub1JvdGF0ZU5vdGljZSIsdC5SZWN0RXJyb3JTaXplTm90aWNlPSJyZWN0RXJyb3JTaXplTm90aWNlIix0LlRleHRDaGVja051bWJlckVycm9yTm90aWNlPSJ0ZXh0Q2hlY2tOdW1iZXJFcnJvck5vdGljZSIsdC5UZXh0Q2hlY2tFbmdsaXNoRXJyb3JOb3RpY2U9InRleHRDaGVja0VuZ2xpc2hFcnJvck5vdGljZSIsdC5UZXh0Q2hlY2tDdXN0b21FcnJvck5vdGljZT0idGV4dENoZWNrQ3VzdG9tRXJyb3JOb3RpY2UiLHQuVXBwZXJMaW1pdEVycm9yTm90aWNlPSJVcHBlckxpbWl0RXJyb3JOb3RpY2UiLHQuTG93ZXJMaW1pdEVycm9yTm90aWNlPSJMb3dlckxpbWl0RXJyb3JOb3RpY2UiLHQuTWluQXJlYUxpbWl0RXJyb3JOb3RpY2U9Ik1pbkFyZWFMaW1pdEVycm9yTm90aWNlIix0Lk1pbkxlbmd0aExpbWl0RXJyb3JOb3RpY2U9Ik1pbkxlbmd0aExpbWl0RXJyb3JOb3RpY2UiLHQuSW52YWxpZEltYWdlPSJJbnZhbGlkSW1hZ2UiLHQuRGlzYWJsZURlbGV0ZT0iRGlzYWJsZURlbGV0ZSIsdC5DbGVhclBhcnRpYWxEYXRhPSJDbGVhclBhcnRpYWxEYXRhIix0Lk1hcmtlckZpbmlzaD0iTWFya2VyRmluaXNoIix0Lkxvd2VyTGltaXRQb2ludD0iTG93ZXJMaW1pdFBvaW50Iix0Lk5vUm90YXRlSW5EZXBlbmRlbmNlPSJub1JvdGF0ZUluRGVwZW5kZW5jZSIsdC5VbmFibGVUb1JlYW5ub3RhdGlvbj0idW5hYmxlVG9SZWFubm90YXRpb24iLHQuRm9yYmlkZGVuQ3JlYXRpb25PdXRzaWRlQm91bmRhcnk9IkZvcmJpZGRlbkNyZWF0aW9uT3V0c2lkZUJvdW5kYXJ5Iix0LlN1Y2Nlc3NmdWxFZGdlQWRzb3JwdGlvbj0iU3VjY2Vzc2Z1bEVkZ2VBZHNvcnB0aW9uIix0LkZvcmJpZEFkZE5ld1BvaW50PSJGb3JiaWRBZGROZXdQb2ludCJ9KExsfHwoTGw9e30pKSxMbC5Ob1JvdGF0ZU5vdGljZSxMbC5SZWN0RXJyb3JTaXplTm90aWNlLExsLlRleHRDaGVja051bWJlckVycm9yTm90aWNlLExsLlRleHRDaGVja0VuZ2xpc2hFcnJvck5vdGljZSxMbC5UZXh0Q2hlY2tDdXN0b21FcnJvck5vdGljZSxMbC5VcHBlckxpbWl0RXJyb3JOb3RpY2UsTGwuTG93ZXJMaW1pdEVycm9yTm90aWNlLExsLk1pbkFyZWFMaW1pdEVycm9yTm90aWNlLExsLk1pbkxlbmd0aExpbWl0RXJyb3JOb3RpY2UsTGwuSW52YWxpZEltYWdlLExsLkRpc2FibGVEZWxldGUsTGwuQ2xlYXJQYXJ0aWFsRGF0YSxMbC5NYXJrZXJGaW5pc2gsTGwuTG93ZXJMaW1pdFBvaW50LExsLk5vUm90YXRlSW5EZXBlbmRlbmNlLExsLlVuYWJsZVRvUmVhbm5vdGF0aW9uLExsLkZvcmJpZGRlbkNyZWF0aW9uT3V0c2lkZUJvdW5kYXJ5LExsLlN1Y2Nlc3NmdWxFZGdlQWRzb3JwdGlvbixMbC5Gb3JiaWRBZGROZXdQb2ludCxMbC5Ob1JvdGF0ZU5vdGljZSxMbC5SZWN0RXJyb3JTaXplTm90aWNlLExsLlRleHRDaGVja051bWJlckVycm9yTm90aWNlLExsLlRleHRDaGVja0VuZ2xpc2hFcnJvck5vdGljZSxMbC5UZXh0Q2hlY2tDdXN0b21FcnJvck5vdGljZSxMbC5VcHBlckxpbWl0RXJyb3JOb3RpY2UsTGwuTG93ZXJMaW1pdEVycm9yTm90aWNlLExsLk1pbkFyZWFMaW1pdEVycm9yTm90aWNlLExsLk1pbkxlbmd0aExpbWl0RXJyb3JOb3RpY2UsTGwuSW52YWxpZEltYWdlLExsLkRpc2FibGVEZWxldGUsTGwuQ2xlYXJQYXJ0aWFsRGF0YSxMbC5NYXJrZXJGaW5pc2gsTGwuTG93ZXJMaW1pdFBvaW50LExsLk5vUm90YXRlSW5EZXBlbmRlbmNlLExsLlVuYWJsZVRvUmVhbm5vdGF0aW9uLExsLkZvcmJpZGRlbkNyZWF0aW9uT3V0c2lkZUJvdW5kYXJ5LExsLlN1Y2Nlc3NmdWxFZGdlQWRzb3JwdGlvbixMbC5Gb3JiaWRBZGROZXdQb2ludCxpbC5sYyxpbC5yYyxpbC5jbGMsaWwuY3JjLFsxLDUsMTAsMjAsMzAsNTAsODAsMTAwXS5jb25jYXQoQXJyYXkuZnJvbSh7bGVuZ3RoOjl9KS5tYXAoKCh0LGUpPT4xMDAqKGUrMikpKSksRWwuWmgsRWwuVVMsZnVuY3Rpb24odCl7dFt0LkNyZWF0ZT0wXT0iQ3JlYXRlIix0W3QuQWN0aXZlPTFdPSJBY3RpdmUiLHRbdC5Ob25lPTJdPSJOb25lIn0oUGx8fChQbD17fSkpO2NvbnN0IGpsPTEwMDEsVWw9InNyZ2IiLHFsPSJzcmdiLWxpbmVhciIsVmw9ImRpc3BsYXktcDMiLEdsPSJkaXNwbGF5LXAzLWxpbmVhciIsWWw9ImxpbmVhciIsWGw9InNyZ2IiLFdsPSJyZWM3MDkiLEhsPTJlMztjbGFzcyBabHthZGRFdmVudExpc3RlbmVyKHQsZSl7dm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBuPXRoaXMuX2xpc3RlbmVyczt2b2lkIDA9PT1uW3RdJiYoblt0XT1bXSksLTE9PT1uW3RdLmluZGV4T2YoZSkmJm5bdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybiExO2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiB2b2lkIDAhPT1uW3RdJiYtMSE9PW5bdF0uaW5kZXhPZihlKX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBuPXRoaXMuX2xpc3RlbmVyc1t0XTtpZih2b2lkIDAhPT1uKXtjb25zdCB0PW4uaW5kZXhPZihlKTstMSE9PXQmJm4uc3BsaWNlKHQsMSl9fWRpc3BhdGNoRXZlbnQodCl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBlPXRoaXMuX2xpc3RlbmVyc1t0LnR5cGVdO2lmKHZvaWQgMCE9PWUpe3QudGFyZ2V0PXRoaXM7Y29uc3Qgbj1lLnNsaWNlKDApO2ZvcihsZXQgZT0wLHI9bi5sZW5ndGg7ZTxyO2UrKyluW2VdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgS2w9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2Z1bmN0aW9uIEpsKCl7Y29uc3QgdD00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxlPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLG49NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAscj00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MDtyZXR1cm4oS2xbMjU1JnRdK0tsW3Q+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/XGQrKVwlXHMqLFxzKihcZCpcLj9cZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMobykpcmV0dXJuIG4odFs0XSksdGhpcy5zZXRIU0wocGFyc2VGbG9hdCh0WzFdKS8zNjAscGFyc2VGbG9hdCh0WzJdKS8xMDAscGFyc2VGbG9hdCh0WzNdKS8xMDAsZSl9fWVsc2UgaWYocj0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IHQ9clsxXSxuPXQubGVuZ3RoO2lmKDM9PT1uKXJldHVybiB0aGlzLnNldFJHQihwYXJzZUludCh0LmNoYXJBdCgwKSwxNikvMTUscGFyc2VJbnQodC5jaGFyQXQoMSksMTYpLzE1LHBhcnNlSW50KHQuY2hhckF0KDIpLDE2KS8xNSxlKTtpZig2PT09bilyZXR1cm4gdGhpcy5zZXRIZXgocGFyc2VJbnQodCwxNiksZSl9ZWxzZSBpZih0JiZ0Lmxlbmd0aD4wKXJldHVybiB0aGlzLnNldENvbG9yTmFtZSh0LGUpO3JldHVybiB0aGlzfXNldENvbG9yTmFtZSh0LGU9VWwpe2NvbnN0IG49RWZbdC50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gdm9pZCAwIT09biYmdGhpcy5zZXRIZXgobixlKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMucix0aGlzLmcsdGhpcy5iKX1jb3B5KHQpe3JldHVybiB0aGlzLnI9dC5yLHRoaXMuZz10LmcsdGhpcy5iPXQuYix0aGlzfWNvcHlTUkdCVG9MaW5lYXIodCl7cmV0dXJuIHRoaXMucj1jaCh0LnIpLHRoaXMuZz1jaCh0LmcpLHRoaXMuYj1jaCh0LmIpLHRoaXN9Y29weUxpbmVhclRvU1JHQih0KXtyZXR1cm4gdGhpcy5yPWxoKHQuciksdGhpcy5nPWxoKHQuZyksdGhpcy5iPWxoKHQuYiksdGhpc31jb252ZXJ0U1JHQlRvTGluZWFyKCl7cmV0dXJuIHRoaXMuY29weVNSR0JUb0xpbmVhcih0aGlzKSx0aGlzfWNvbnZlcnRMaW5lYXJUb1NSR0IoKXtyZXR1cm4gdGhpcy5jb3B5TGluZWFyVG9TUkdCKHRoaXMpLHRoaXN9Z2V0SGV4KHQ9VWwpe3JldHVybiB1aC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoSWYuY29weSh0aGlzKSx0KSw2NTUzNipNYXRoLnJvdW5kKFFsKDI1NSpJZi5yLDAsMjU1KSkrMjU2Kk1hdGgucm91bmQoUWwoMjU1KklmLmcsMCwyNTUpKStNYXRoLnJvdW5kKFFsKDI1NSpJZi5iLDAsMjU1KSl9Z2V0SGV4U3RyaW5nKHQ9VWwpe3JldHVybigiMDAwMDAwIit0aGlzLmdldEhleCh0KS50b1N0cmluZygxNikpLnNsaWNlKC02KX1nZXRIU0wodCxlPXVoLndvcmtpbmdDb2xvclNwYWNlKXt1aC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoSWYuY29weSh0aGlzKSxlKTtjb25zdCBuPUlmLnIscj1JZi5nLGk9SWYuYixvPU1hdGgubWF4KG4scixpKSxzPU1hdGgubWluKG4scixpKTtsZXQgYSx1O2NvbnN0IGM9KHMrbykvMjtpZihzPT09bylhPTAsdT0wO2Vsc2V7Y29uc3QgdD1vLXM7c3dpdGNoKHU9Yzw9LjU/dC8obytzKTp0LygyLW8tcyksbyl7Y2FzZSBuOmE9KHItaSkvdCsocjxpPzY6MCk7YnJlYWs7Y2FzZSByOmE9KGktbikvdCsyO2JyZWFrO2Nhc2UgaTphPShuLXIpL3QrNH1hLz02fXJldHVybiB0Lmg9YSx0LnM9dSx0Lmw9Yyx0fWdldFJHQih0LGU9dWgud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB1aC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoSWYuY29weSh0aGlzKSxlKSx0LnI9SWYucix0Lmc9SWYuZyx0LmI9SWYuYix0fWdldFN0eWxlKHQ9VWwpe3VoLmZyb21Xb3JraW5nQ29sb3JTcGFjZShJZi5jb3B5KHRoaXMpLHQpO2NvbnN0IGU9SWYucixuPUlmLmcscj1JZi5iO3JldHVybiB0IT09VWw/YGNvbG9yKCR7dH0gJHtlLnRvRml4ZWQoMyl9ICR7bi50b0ZpeGVkKDMpfSAke3IudG9GaXhlZCgzKX0pYDpgcmdiKCR7TWF0aC5yb3VuZCgyNTUqZSl9LCR7TWF0aC5yb3VuZCgyNTUqbil9LCR7TWF0aC5yb3VuZCgyNTUqcil9KWB9b2Zmc2V0SFNMKHQsZSxuKXtyZXR1cm4gdGhpcy5nZXRIU0woQ2YpLHRoaXMuc2V0SFNMKENmLmgrdCxDZi5zK2UsQ2YubCtuKX1hZGQodCl7cmV0dXJuIHRoaXMucis9dC5yLHRoaXMuZys9dC5nLHRoaXMuYis9dC5iLHRoaXN9YWRkQ29sb3JzKHQsZSl7cmV0dXJuIHRoaXMucj10LnIrZS5yLHRoaXMuZz10LmcrZS5nLHRoaXMuYj10LmIrZS5iLHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLnIrPXQsdGhpcy5nKz10LHRoaXMuYis9dCx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy5yPU1hdGgubWF4KDAsdGhpcy5yLXQuciksdGhpcy5nPU1hdGgubWF4KDAsdGhpcy5nLXQuZyksdGhpcy5iPU1hdGgubWF4KDAsdGhpcy5iLXQuYiksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5yKj10LnIsdGhpcy5nKj10LmcsdGhpcy5iKj10LmIsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKj10LHRoaXMuZyo9dCx0aGlzLmIqPXQsdGhpc31sZXJwKHQsZSl7cmV0dXJuIHRoaXMucis9KHQuci10aGlzLnIpKmUsdGhpcy5nKz0odC5nLXRoaXMuZykqZSx0aGlzLmIrPSh0LmItdGhpcy5iKSplLHRoaXN9bGVycENvbG9ycyh0LGUsbil7cmV0dXJuIHRoaXMucj10LnIrKGUuci10LnIpKm4sdGhpcy5nPXQuZysoZS5nLXQuZykqbix0aGlzLmI9dC5iKyhlLmItdC5iKSpuLHRoaXN9bGVycEhTTCh0LGUpe3RoaXMuZ2V0SFNMKENmKSx0LmdldEhTTChTZik7Y29uc3Qgbj0kbChDZi5oLFNmLmgsZSkscj0kbChDZi5zLFNmLnMsZSksaT0kbChDZi5sLFNmLmwsZSk7cmV0dXJuIHRoaXMuc2V0SFNMKG4scixpKSx0aGlzfXNldEZyb21WZWN0b3IzKHQpe3JldHVybiB0aGlzLnI9dC54LHRoaXMuZz10LnksdGhpcy5iPXQueix0aGlzfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMucixuPXRoaXMuZyxyPXRoaXMuYixpPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMucj1pWzBdKmUraVszXSpuK2lbNl0qcix0aGlzLmc9aVsxXSplK2lbNF0qbitpWzddKnIsdGhpcy5iPWlbMl0qZStpWzVdKm4raVs4XSpyLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnI9PT10aGlzLnImJnQuZz09PXRoaXMuZyYmdC5iPT09dGhpcy5ifWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMucj10W2VdLHRoaXMuZz10W2UrMV0sdGhpcy5iPXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMucix0W2UrMV09dGhpcy5nLHRbZSsyXT10aGlzLmIsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMucj10LmdldFgoZSksdGhpcy5nPXQuZ2V0WShlKSx0aGlzLmI9dC5nZXRaKGUpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMuZ2V0SGV4KCl9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5yLHlpZWxkIHRoaXMuZyx5aWVsZCB0aGlzLmJ9fWNvbnN0IElmPW5ldyBOZjtOZi5OQU1FUz1FZjtuZXcgeGgsbmV3IHRoO25ldyBaaCxuZXcgRGYsbmV3IHhoLG5ldyBEaCxuZXcgRGgsbmV3IHhoO25ldyBaaCxuZXcgY2xhc3N7Y29uc3RydWN0b3IodD1uZXcgeGgsZT1uZXcgeGgoMCwwLC0xKSl7dGhpcy5vcmlnaW49dCx0aGlzLmRpcmVjdGlvbj1lfXNldCh0LGUpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLHRoaXMuZGlyZWN0aW9uLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQub3JpZ2luKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSx0aGlzfWF0KHQsZSl7cmV0dXJuIGUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLHQpfWxvb2tBdCh0KXtyZXR1cm4gdGhpcy5kaXJlY3Rpb24uY29weSh0KS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpLHRoaXN9cmVjYXN0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHRoaXMuYXQodCxxaCkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sbil9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSl9ZGlzdGFuY2VTcVRvUG9pbnQodCl7Y29uc3QgZT1xaC5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIGU8MD90aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCh0KToocWguY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGUpLHFoLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVNxVG9TZWdtZW50KHQsZSxuLHIpe1ZoLmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSxHaC5jb3B5KGUpLnN1Yih0KS5ub3JtYWxpemUoKSxZaC5jb3B5KHRoaXMub3JpZ2luKS5zdWIoVmgpO2NvbnN0IGk9LjUqdC5kaXN0YW5jZVRvKGUpLG89LXRoaXMuZGlyZWN0aW9uLmRvdChHaCkscz1ZaC5kb3QodGhpcy5kaXJlY3Rpb24pLGE9LVloLmRvdChHaCksdT1ZaC5sZW5ndGhTcSgpLGM9TWF0aC5hYnMoMS1vKm8pO2xldCBsLGgsZixwO2lmKGM+MClpZihsPW8qYS1zLGg9bypzLWEscD1pKmMsbD49MClpZihoPj0tcClpZihoPD1wKXtjb25zdCB0PTEvYztsKj10LGgqPXQsZj1sKihsK28qaCsyKnMpK2gqKG8qbCtoKzIqYSkrdX1lbHNlIGg9aSxsPU1hdGgubWF4KDAsLShvKmgrcykpLGY9LWwqbCtoKihoKzIqYSkrdTtlbHNlIGg9LWksbD1NYXRoLm1heCgwLC0obypoK3MpKSxmPS1sKmwraCooaCsyKmEpK3U7ZWxzZSBoPD0tcD8obD1NYXRoLm1heCgwLC0oLW8qaStzKSksaD1sPjA/LWk6TWF0aC5taW4oTWF0aC5tYXgoLWksLWEpLGkpLGY9LWwqbCtoKihoKzIqYSkrdSk6aDw9cD8obD0wLGg9TWF0aC5taW4oTWF0aC5tYXgoLWksLWEpLGkpLGY9aCooaCsyKmEpK3UpOihsPU1hdGgubWF4KDAsLShvKmkrcykpLGg9bD4wP2k6TWF0aC5taW4oTWF0aC5tYXgoLWksLWEpLGkpLGY9LWwqbCtoKihoKzIqYSkrdSk7ZWxzZSBoPW8+MD8taTppLGw9TWF0aC5tYXgoMCwtKG8qaCtzKSksZj0tbCpsK2gqKGgrMiphKSt1O3JldHVybiBuJiZuLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixsKSxyJiZyLmNvcHkoVmgpLmFkZFNjYWxlZFZlY3RvcihHaCxoKSxmfWludGVyc2VjdFNwaGVyZSh0LGUpe3FoLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5vcmlnaW4pO2NvbnN0IG49cWguZG90KHRoaXMuZGlyZWN0aW9uKSxyPXFoLmRvdChxaCktbipuLGk9dC5yYWRpdXMqdC5yYWRpdXM7aWYocj5pKXJldHVybiBudWxsO2NvbnN0IG89TWF0aC5zcXJ0KGktcikscz1uLW8sYT1uK287cmV0dXJuIGE8MD9udWxsOnM8MD90aGlzLmF0KGEsZSk6dGhpcy5hdChzLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31kaXN0YW5jZVRvUGxhbmUodCl7Y29uc3QgZT10Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1lKXJldHVybiAwPT09dC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDtjb25zdCBuPS0odGhpcy5vcmlnaW4uZG90KHQubm9ybWFsKSt0LmNvbnN0YW50KS9lO3JldHVybiBuPj0wP246bnVsbH1pbnRlcnNlY3RQbGFuZSh0LGUpe2NvbnN0IG49dGhpcy5kaXN0YW5jZVRvUGxhbmUodCk7cmV0dXJuIG51bGw9PT1uP251bGw6dGhpcy5hdChuLGUpfWludGVyc2VjdHNQbGFuZSh0KXtjb25zdCBlPXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTtyZXR1cm4gMD09PWV8fHQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZTwwfWludGVyc2VjdEJveCh0LGUpe2xldCBuLHIsaSxvLHMsYTtjb25zdCB1PTEvdGhpcy5kaXJlY3Rpb24ueCxjPTEvdGhpcy5kaXJlY3Rpb24ueSxsPTEvdGhpcy5kaXJlY3Rpb24ueixoPXRoaXMub3JpZ2luO3JldHVybiB1Pj0wPyhuPSh0Lm1pbi54LWgueCkqdSxyPSh0Lm1heC54LWgueCkqdSk6KG49KHQubWF4LngtaC54KSp1LHI9KHQubWluLngtaC54KSp1KSxjPj0wPyhpPSh0Lm1pbi55LWgueSkqYyxvPSh0Lm1heC55LWgueSkqYyk6KGk9KHQubWF4LnktaC55KSpjLG89KHQubWluLnktaC55KSpjKSxuPm98fGk+cnx8KChpPm58fGlzTmFOKG4pKSYmKG49aSksKG88cnx8aXNOYU4ocikpJiYocj1vKSxsPj0wPyhzPSh0Lm1pbi56LWgueikqbCxhPSh0Lm1heC56LWgueikqbCk6KHM9KHQubWF4LnotaC56KSpsLGE9KHQubWluLnotaC56KSpsKSxuPmF8fHM+cil8fCgocz5ufHxuIT1uKSYmKG49cyksKGE8cnx8ciE9cikmJihyPWEpLHI8MCk/bnVsbDp0aGlzLmF0KG4+PTA/bjpyLGUpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveCh0LHFoKX1pbnRlcnNlY3RUcmlhbmdsZSh0LGUsbixyLGkpe1hoLnN1YlZlY3RvcnMoZSx0KSxXaC5zdWJWZWN0b3JzKG4sdCksSGguY3Jvc3NWZWN0b3JzKFhoLFdoKTtsZXQgbyxzPXRoaXMuZGlyZWN0aW9uLmRvdChIaCk7aWYocz4wKXtpZihyKXJldHVybiBudWxsO289MX1lbHNle2lmKCEoczwwKSlyZXR1cm4gbnVsbDtvPS0xLHM9LXN9WWguc3ViVmVjdG9ycyh0aGlzLm9yaWdpbix0KTtjb25zdCBhPW8qdGhpcy5kaXJlY3Rpb24uZG90KFdoLmNyb3NzVmVjdG9ycyhZaCxXaCkpO2lmKGE8MClyZXR1cm4gbnVsbDtjb25zdCB1PW8qdGhpcy5kaXJlY3Rpb24uZG90KFhoLmNyb3NzKFloKSk7aWYodTwwfHxhK3U+cylyZXR1cm4gbnVsbDtjb25zdCBjPS1vKlloLmRvdChIaCk7cmV0dXJuIGM8MD9udWxsOnRoaXMuYXQoYy9zLGkpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KHQpLHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmdC5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19LG5ldyBVaCxuZXcgeGg7Y29uc3QgTWY9bmV3IGNsYXNze2NvbnN0cnVjdG9yKHQsZSxuKXtjb25zdCByPXRoaXM7bGV0IGksbz0hMSxzPTAsYT0wO2NvbnN0IHU9W107dGhpcy5vblN0YXJ0PXZvaWQgMCx0aGlzLm9uTG9hZD10LHRoaXMub25Qcm9ncmVzcz1lLHRoaXMub25FcnJvcj1uLHRoaXMuaXRlbVN0YXJ0PWZ1bmN0aW9uKHQpe2ErKywhMT09PW8mJnZvaWQgMCE9PXIub25TdGFydCYmci5vblN0YXJ0KHQscyxhKSxvPSEwfSx0aGlzLml0ZW1FbmQ9ZnVuY3Rpb24odCl7cysrLHZvaWQgMCE9PXIub25Qcm9ncmVzcyYmci5vblByb2dyZXNzKHQscyxhKSxzPT09YSYmKG89ITEsdm9pZCAwIT09ci5vbkxvYWQmJnIub25Mb2FkKCkpfSx0aGlzLml0ZW1FcnJvcj1mdW5jdGlvbih0KXt2b2lkIDAhPT1yLm9uRXJyb3ImJnIub25FcnJvcih0KX0sdGhpcy5yZXNvbHZlVVJMPWZ1bmN0aW9uKHQpe3JldHVybiBpP2kodCk6dH0sdGhpcy5zZXRVUkxNb2RpZmllcj1mdW5jdGlvbih0KXtyZXR1cm4gaT10LHRoaXN9LHRoaXMuYWRkSGFuZGxlcj1mdW5jdGlvbih0LGUpe3JldHVybiB1LnB1c2godCxlKSx0aGlzfSx0aGlzLnJlbW92ZUhhbmRsZXI9ZnVuY3Rpb24odCl7Y29uc3QgZT11LmluZGV4T2YodCk7cmV0dXJuLTEhPT1lJiZ1LnNwbGljZShlLDIpLHRoaXN9LHRoaXMuZ2V0SGFuZGxlcj1mdW5jdGlvbih0KXtmb3IobGV0IGU9MCxuPXUubGVuZ3RoO2U8bjtlKz0yKXtjb25zdCBuPXVbZV0scj11W2UrMV07aWYobi5nbG9iYWwmJihuLmxhc3RJbmRleD0wKSxuLnRlc3QodCkpcmV0dXJuIHJ9cmV0dXJuIG51bGx9fX07Y2xhc3MgRmZ7Y29uc3RydWN0b3IodCl7dGhpcy5tYW5hZ2VyPXZvaWQgMCE9PXQ/dDpNZix0aGlzLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLHRoaXMud2l0aENyZWRlbnRpYWxzPSExLHRoaXMucGF0aD0iIix0aGlzLnJlc291cmNlUGF0aD0iIix0aGlzLnJlcXVlc3RIZWFkZXI9e319bG9hZCgpe31sb2FkQXN5bmModCxlKXtjb25zdCBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLGkpe24ubG9hZCh0LHIsZSxpKX0pKX1wYXJzZSgpe31zZXRDcm9zc09yaWdpbih0KXtyZXR1cm4gdGhpcy5jcm9zc09yaWdpbj10LHRoaXN9c2V0V2l0aENyZWRlbnRpYWxzKHQpe3JldHVybiB0aGlzLndpdGhDcmVkZW50aWFscz10LHRoaXN9c2V0UGF0aCh0KXtyZXR1cm4gdGhpcy5wYXRoPXQsdGhpc31zZXRSZXNvdXJjZVBhdGgodCl7cmV0dXJuIHRoaXMucmVzb3VyY2VQYXRoPXQsdGhpc31zZXRSZXF1ZXN0SGVhZGVyKHQpe3JldHVybiB0aGlzLnJlcXVlc3RIZWFkZXI9dCx0aGlzfX1GZi5ERUZBVUxUX01BVEVSSUFMX05BTUU9Il9fREVGQVVMVCI7RXJyb3I7ZnVuY3Rpb24gT2YoKXtyZXR1cm4gT2Y9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciByIGluIG4pKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJih0W3JdPW5bcl0pfXJldHVybiB0fSxPZi5hcHBseShudWxsLGFyZ3VtZW50cyl9InVuZGVmaW5lZCIhPXR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18mJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicmVnaXN0ZXIiLHtkZXRhaWw6e3JldmlzaW9uOiIxNjkifX0pKSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5fX1RIUkVFX198fCh3aW5kb3cuX19USFJFRV9fPSIxNjkiKSk7dmFyIExmPXtlcHNpbG9uOjFlLTEyLG1hdHJpeDoiTWF0cml4IixudW1iZXI6Im51bWJlciIscHJlY2lzaW9uOjY0LHByZWRpY3RhYmxlOiExLHJhbmRvbVNlZWQ6bnVsbH07ZnVuY3Rpb24gUGYodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fWZ1bmN0aW9uIFJmKHQpe3JldHVybiEoIXR8fCJvYmplY3QiIT10eXBlb2YgdHx8ImZ1bmN0aW9uIiE9dHlwZW9mIHQuY29uc3RydWN0b3IpJiYoITA9PT10LmlzQmlnTnVtYmVyJiYib2JqZWN0Ij09dHlwZW9mIHQuY29uc3RydWN0b3IucHJvdG90eXBlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzQmlnTnVtYmVyfHwiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3Rvci5pc0RlY2ltYWwmJiEwPT09dC5jb25zdHJ1Y3Rvci5pc0RlY2ltYWwodCkpfWZ1bmN0aW9uIEJmKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJiEwPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpLmlzQ29tcGxleHx8ITF9ZnVuY3Rpb24ga2YodCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdCYmITA9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCkuaXNGcmFjdGlvbnx8ITF9ZnVuY3Rpb24gemYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNVbml0fHwhMX1mdW5jdGlvbiBqZih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9dmFyIFVmPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gcWYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNNYXRyaXh8fCExfWZ1bmN0aW9uIFZmKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpfHxxZih0KX1mdW5jdGlvbiBHZih0KXtyZXR1cm4gdCYmdC5pc0RlbnNlTWF0cml4JiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTWF0cml4fHwhMX1mdW5jdGlvbiBZZih0KXtyZXR1cm4gdCYmdC5pc1NwYXJzZU1hdHJpeCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc01hdHJpeHx8ITF9ZnVuY3Rpb24gWGYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNSYW5nZXx8ITF9ZnVuY3Rpb24gV2YodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNJbmRleHx8ITF9ZnVuY3Rpb24gSGYodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH1mdW5jdGlvbiBaZih0KXtyZXR1cm4gdCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc1Jlc3VsdFNldHx8ITF9ZnVuY3Rpb24gS2YodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNIZWxwfHwhMX1mdW5jdGlvbiBKZih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBRZih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGV9ZnVuY3Rpb24gJGYodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBSZWdFeHB9ZnVuY3Rpb24gdHAodCl7cmV0dXJuISghdHx8Im9iamVjdCIhPXR5cGVvZiB0fHx0LmNvbnN0cnVjdG9yIT09T2JqZWN0fHxCZih0KXx8a2YodCkpfWZ1bmN0aW9uIGVwKHQpe3JldHVybiBudWxsPT09dH1mdW5jdGlvbiBucCh0KXtyZXR1cm4gdm9pZCAwPT09dH1mdW5jdGlvbiBycCh0KXtyZXR1cm4gdCYmITA9PT10LmlzQWNjZXNzb3JOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gaXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0FycmF5Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIG9wKHQpe3JldHVybiB0JiYhMD09PXQuaXNBc3NpZ25tZW50Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIHNwKHQpe3JldHVybiB0JiYhMD09PXQuaXNCbG9ja05vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBhcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzQ29uZGl0aW9uYWxOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gdXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0NvbnN0YW50Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGNwKHQpe3JldHVybiB0JiYhMD09PXQuaXNGdW5jdGlvbkFzc2lnbm1lbnROb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gbHAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0Z1bmN0aW9uTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGhwKHQpe3JldHVybiB0JiYhMD09PXQuaXNJbmRleE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBmcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIHBwKHQpe3JldHVybiB0JiYhMD09PXQuaXNPYmplY3ROb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gZHAodCl7cmV0dXJuIHQmJiEwPT09dC5pc09wZXJhdG9yTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGdwKHQpe3JldHVybiB0JiYhMD09PXQuaXNQYXJlbnRoZXNpc05vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiB5cCh0KXtyZXR1cm4gdCYmITA9PT10LmlzUmFuZ2VOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gbXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc1JlbGF0aW9uYWxOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gdnAodCl7cmV0dXJuIHQmJiEwPT09dC5pc1N5bWJvbE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBfcCh0KXtyZXR1cm4gdCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc0NoYWlufHwhMX1mdW5jdGlvbiB4cCh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ib2JqZWN0Ij09PWU/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+ZCh2KHQpKSkpLGU9aihhcmd1bWVudHMpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbGxiYWNrIGZ1bmN0aW9uIGV4cGVjdGVkIGFzIGxhc3QgYXJndW1lbnQiKTtyZXR1cm4gcSh0LGUpfSxhLnJlZmVyVG9TZWxmPVYsYS5jb252ZXJ0PWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj11KGUpO2lmKG4udGVzdCh0KSlyZXR1cm4gdDtjb25zdCByPW4uY29udmVyc2lvbnNUbztpZigwPT09ci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBhcmUgbm8gY29udmVyc2lvbnMgdG8gIitlKyIgZGVmaW5lZC4iKTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKylpZih1KHJbZV0uZnJvbSkudGVzdCh0KSlyZXR1cm4gcltlXS5jb252ZXJ0KHQpO3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgIit0KyIgdG8gIitlKX0sYS5maW5kU2lnbmF0dXJlPXAsYS5maW5kPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcCh0LGUsbikuaW1wbGVtZW50YXRpb259LGEuaXNUeXBlZEZ1bmN0aW9uPWYsYS53YXJuQWdhaW5zdERlcHJlY2F0ZWRUaGlzPSEwLGEuYWRkVHlwZT1mdW5jdGlvbih0LGUpe2xldCBuPSJhbnkiOyExIT09ZSYmaS5oYXMoIk9iamVjdCIpJiYobj0iT2JqZWN0IiksYS5hZGRUeXBlcyhbdF0sbil9LGEuYWRkQ29udmVyc2lvbj1mdW5jdGlvbih0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e292ZXJyaWRlOiExfTtLKHQpO2NvbnN0IG49dSh0LnRvKSxyPW4uY29udmVyc2lvbnNUby5maW5kKChlPT5lLmZyb209PT10LmZyb20pKTtpZihyKXtpZighZXx8IWUub3ZlcnJpZGUpdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBhbHJlYWR5IGEgY29udmVyc2lvbiBmcm9tICInK3QuZnJvbSsnIiB0byAiJytuLm5hbWUrJyInKTthLnJlbW92ZUNvbnZlcnNpb24oe2Zyb206ci5mcm9tLHRvOnQudG8sY29udmVydDpyLmNvbnZlcnR9KX1uLmNvbnZlcnNpb25zVG8ucHVzaCh7ZnJvbTp0LmZyb20sY29udmVydDp0LmNvbnZlcnQsaW5kZXg6cysrfSl9LGEuYWRkQ29udmVyc2lvbnM9ZnVuY3Rpb24odCxlKXt0LmZvckVhY2goKHQ9PmEuYWRkQ29udmVyc2lvbih0LGUpKSl9LGEucmVtb3ZlQ29udmVyc2lvbj1mdW5jdGlvbih0KXtLKHQpO2NvbnN0IGU9dSh0LnRvKSxuPWZ1bmN0aW9uKHQsZSl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYoZSh0W25dKSlyZXR1cm4gdFtuXX0oZS5jb252ZXJzaW9uc1RvLChlPT5lLmZyb209PT10LmZyb20pKTtpZighbil0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHQgdG8gcmVtb3ZlIG5vbmV4aXN0ZW50IGNvbnZlcnNpb24gZnJvbSAiK3QuZnJvbSsiIHRvICIrdC50byk7aWYobi5jb252ZXJ0IT09dC5jb252ZXJ0KXRocm93IG5ldyBFcnJvcigiQ29udmVyc2lvbiB0byByZW1vdmUgZG9lcyBub3QgbWF0Y2ggZXhpc3RpbmcgY29udmVyc2lvbiIpO2NvbnN0IHI9ZS5jb252ZXJzaW9uc1RvLmluZGV4T2Yobik7ZS5jb252ZXJzaW9uc1RvLnNwbGljZShyLDEpfSxhLnJlc29sdmU9ZnVuY3Rpb24odCxlKXtpZighZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKE5wKTtjb25zdCBuPXQuX3R5cGVkRnVuY3Rpb25EYXRhLnNpZ25hdHVyZXM7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDsrK3QpaWYoblt0XS50ZXN0KGUpKXJldHVybiBuW3RdO3JldHVybiBudWxsfSxhfSgpO2Z1bmN0aW9uIE1wKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR8fCEhaXNGaW5pdGUodCkmJnQ9PT1NYXRoLnJvdW5kKHQpfWZ1bmN0aW9uIEZwKHQsZSxuKXt2YXIgcj17MjoiMGIiLDg6IjBvIiwxNjoiMHgifVtlXSxpPSIiO2lmKG4pe2lmKG48MSl0aHJvdyBuZXcgRXJyb3IoInNpemUgbXVzdCBiZSBpbiBncmVhdGVyIHRoYW4gMCIpO2lmKCFNcChuKSl0aHJvdyBuZXcgRXJyb3IoInNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYodD5UZigyLG4tMSktMXx8dDwtVGYoMixuLTEpKXRocm93IG5ldyBFcnJvcigiVmFsdWUgbXVzdCBiZSBpbiByYW5nZSBbLTJeIi5jb25jYXQobi0xLCIsIDJeIikuY29uY2F0KG4tMSwiLTFdIikpO2lmKCFNcCh0KSl0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciIpO3Q8MCYmKHQrPVRmKDIsbikpLGk9ImkiLmNvbmNhdChuKX12YXIgbz0iIjtyZXR1cm4gdDwwJiYodD0tdCxvPSItIiksIiIuY29uY2F0KG8pLmNvbmNhdChyKS5jb25jYXQodC50b1N0cmluZyhlKSkuY29uY2F0KGkpfWZ1bmN0aW9uIFRwKHQsZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuIGUodCk7aWYodD09PTEvMClyZXR1cm4iSW5maW5pdHkiO2lmKHQ9PT0tMS8wKXJldHVybiItSW5maW5pdHkiO2lmKGlzTmFOKHQpKXJldHVybiJOYU4iO3ZhciBuLHIsaT0iYXV0byI7aWYoZSYmKGUubm90YXRpb24mJihpPWUubm90YXRpb24pLFBmKGUpP249ZTpQZihlLnByZWNpc2lvbikmJihuPWUucHJlY2lzaW9uKSxlLndvcmRTaXplJiYibnVtYmVyIiE9dHlwZW9mKHI9ZS53b3JkU2l6ZSkpKXRocm93IG5ldyBFcnJvcignT3B0aW9uICJ3b3JkU2l6ZSIgbXVzdCBiZSBhIG51bWJlcicpO3N3aXRjaChpKXtjYXNlImZpeGVkIjpyZXR1cm4gZnVuY3Rpb24odCxlKXtpZihpc05hTih0KXx8IWlzRmluaXRlKHQpKXJldHVybiBTdHJpbmcodCk7dmFyIG49T3AodCkscj0ibnVtYmVyIj09dHlwZW9mIGU/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/bmV3IHIoMCp0LnMpOih0LmU9S2QoYyxsKSx0LmQ9YyxBZD0hMSxzJiYodD1XZCh0LGksNCphKSksdSYmKHQ9dC50aW1lcyhNYXRoLmFicyh1KTw1ND9MZCgyLHUpOiRnLnBvdygyLHUpKSksQWQ9ITAsdCl9KGksdCl9aWYoby5wcm90b3R5cGU9cWQsby5ST1VORF9VUD0wLG8uUk9VTkRfRE9XTj0xLG8uUk9VTkRfQ0VJTD0yLG8uUk9VTkRfRkxPT1I9MyxvLlJPVU5EX0hBTEZfVVA9NCxvLlJPVU5EX0hBTEZfRE9XTj01LG8uUk9VTkRfSEFMRl9FVkVOPTYsby5ST1VORF9IQUxGX0NFSUw9NyxvLlJPVU5EX0hBTEZfRkxPT1I9OCxvLkVVQ0xJRD05LG8uY29uZmlnPW8uc2V0PUNnLG8uY2xvbmU9dCxvLmlzRGVjaW1hbD1UZyxvLmFicz1wZyxvLmFjb3M9ZGcsby5hY29zaD1nZyxvLmFkZD15ZyxvLmFzaW49bWcsby5hc2luaD12ZyxvLmF0YW49X2csby5hdGFuaD14ZyxvLmF0YW4yPXdnLG8uY2JydD1iZyxvLmNlaWw9RGcsby5jbGFtcD1FZyxvLmNvcz1TZyxvLmNvc2g9QWcsby5kaXY9Tmcsby5leHA9SWcsby5mbG9vcj1NZyxvLmh5cG90PUZnLG8ubG49T2csby5sb2c9TGcsby5sb2cxMD1SZyxvLmxvZzI9UGcsby5tYXg9Qmcsby5taW49a2csby5tb2Q9emcsby5tdWw9amcsby5wb3c9VWcsby5yYW5kb209cWcsby5yb3VuZD1WZyxvLnNpZ249R2csby5zaW49WWcsby5zaW5oPVhnLG8uc3FydD1XZyxvLnN1Yj1IZyxvLnN1bT1aZyxvLnRhbj1LZyxvLnRhbmg9Smcsby50cnVuYz1RZyx2b2lkIDA9PT1lJiYoZT17fSksZSYmITAhPT1lLmRlZmF1bHRzKWZvcihpPVsicHJlY2lzaW9uIiwicm91bmRpbmciLCJ0b0V4cE5lZyIsInRvRXhwUG9zIiwibWF4RSIsIm1pbkUiLCJtb2R1bG8iLCJjcnlwdG8iXSxuPTA7bjxpLmxlbmd0aDspZS5oYXNPd25Qcm9wZXJ0eShyPWlbbisrXSl8fChlW3JdPXRoaXNbcl0pO3JldHVybiBvLmNvbmZpZyhlKSxvfShTZCk7RWQ9bmV3ICRnKEVkKSxDZD1uZXcgJGcoQ2QpO3ZhciB0eT1pZCgiQmlnTnVtYmVyIixbIj9vbiIsImNvbmZpZyJdLCh0PT57dmFye29uOmUsY29uZmlnOm59PXQscj0kZy5jbG9uZSh7cHJlY2lzaW9uOm4ucHJlY2lzaW9uLG1vZHVsbzokZy5FVUNMSUR9KTtyZXR1cm4gci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSksci5wcm90b3R5cGUudHlwZT0iQmlnTnVtYmVyIixyLnByb3RvdHlwZS5pc0JpZ051bWJlcj0hMCxyLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJCaWdOdW1iZXIiLHZhbHVlOnRoaXMudG9TdHJpbmcoKX19LHIuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyByKHQudmFsdWUpfSxlJiZlKCJjb25maWciLChmdW5jdGlvbih0LGUpe3QucHJlY2lzaW9uIT09ZS5wcmVjaXNpb24mJnIuY29uZmlnKHtwcmVjaXNpb246dC5wcmVjaXNpb259KX0pKSxyfSkse2lzQ2xhc3M6ITB9KSxleT1NYXRoLmNvc2h8fGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmFicyh0KTwxZS05PzEtdDouNSooTWF0aC5leHAodCkrTWF0aC5leHAoLXQpKX0sbnk9TWF0aC5zaW5ofHxmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5hYnModCk8MWUtOT90Oi41KihNYXRoLmV4cCh0KS1NYXRoLmV4cCgtdCkpfSxyeT1mdW5jdGlvbigpe3Rocm93IFN5bnRheEVycm9yKCJJbnZhbGlkIFBhcmFtIil9O2Z1bmN0aW9uIGl5KHQsZSl7dmFyIG49TWF0aC5hYnModCkscj1NYXRoLmFicyhlKTtyZXR1cm4gMD09PXQ/TWF0aC5sb2cocik6MD09PWU/TWF0aC5sb2cobik6bjwzZTMmJnI8M2UzPy41Kk1hdGgubG9nKHQqdCtlKmUpOih0Lz0yLGUvPTIsLjUqTWF0aC5sb2codCp0K2UqZSkrTWF0aC5MTjIpfWZ1bmN0aW9uIG95KHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2Ygb3kpKXJldHVybiBuZXcgb3kodCxlKTt2YXIgbj1mdW5jdGlvbih0LGUpe3ZhciBuPXtyZTowLGltOjB9O2lmKG51bGw9PXQpbi5yZT1uLmltPTA7ZWxzZSBpZih2b2lkIDAhPT1lKW4ucmU9dCxuLmltPWU7ZWxzZSBzd2l0Y2godHlwZW9mIHQpe2Nhc2Uib2JqZWN0IjppZigiaW0iaW4gdCYmInJlImluIHQpbi5yZT10LnJlLG4uaW09dC5pbTtlbHNlIGlmKCJhYnMiaW4gdCYmImFyZyJpbiB0KXtpZighTnVtYmVyLmlzRmluaXRlKHQuYWJzKSYmTnVtYmVyLmlzRmluaXRlKHQuYXJnKSlyZXR1cm4gb3kuSU5GSU5JVFk7bi5yZT10LmFicypNYXRoLmNvcyh0LmFyZyksbi5pbT10LmFicypNYXRoLnNpbih0LmFyZyl9ZWxzZSBpZigiciJpbiB0JiYicGhpImluIHQpe2lmKCFOdW1iZXIuaXNGaW5pdGUodC5yKSYmTnVtYmVyLmlzRmluaXRlKHQucGhpKSlyZXR1cm4gb3kuSU5GSU5JVFk7bi5yZT10LnIqTWF0aC5jb3ModC5waGkpLG4uaW09dC5yKk1hdGguc2luKHQucGhpKX1lbHNlIDI9PT10Lmxlbmd0aD8obi5yZT10WzBdLG4uaW09dFsxXSk6cnkoKTticmVhaztjYXNlInN0cmluZyI6bi5pbT1uLnJlPTA7dmFyIHI9dC5yZXBsYWNlKC9fL2csIiIpLm1hdGNoKC9cZCtcLj9cZCplWystXT9cZCt8XGQrXC4/XGQqfFwuXGQrfC4vZyksaT0xLG89MDtudWxsPT09ciYmcnkoKTtmb3IodmFyIHM9MDtzPHIubGVuZ3RoO3MrKyl7dmFyIGE9cltzXTsiICI9PT1hfHwiXHQiPT09YXx8IlxuIj09PWF8fCgiKyI9PT1hP2krKzoiLSI9PT1hP28rKzoiaSI9PT1hfHwiSSI9PT1hPyhpK289PT0wJiZyeSgpLCIgIj09PXJbcysxXXx8aXNOYU4ocltzKzFdKT9uLmltKz1wYXJzZUZsb2F0KChvJTI/Ii0iOiIiKSsiMSIpOihuLmltKz1wYXJzZUZsb2F0KChvJTI/Ii0iOiIiKStyW3MrMV0pLHMrKyksaT1vPTApOigoaStvPT09MHx8aXNOYU4oYSkpJiZyeSgpLCJpIj09PXJbcysxXXx8IkkiPT09cltzKzFdPyhuLmltKz1wYXJzZUZsb2F0KChvJTI/Ii0iOiIiKSthKSxzKyspOm4ucmUrPXBhcnNlRmxvYXQoKG8lMj8iLSI6IiIpK2EpLGk9bz0wKSl9aStvPjAmJnJ5KCk7YnJlYWs7Y2FzZSJudW1iZXIiOm4uaW09MCxuLnJlPXQ7YnJlYWs7ZGVmYXVsdDpyeSgpfXJldHVybiBpc05hTihuLnJlKXx8aXNOYU4obi5pbSksbn0odCxlKTt0aGlzLnJlPW4ucmUsdGhpcy5pbT1uLmltfW95LnByb3RvdHlwZT17cmU6MCxpbTowLHNpZ246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmFicygpO3JldHVybiBuZXcgb3kodGhpcy5yZS90LHRoaXMuaW0vdCl9LGFkZDpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBveSh0LGUpO3JldHVybiB0aGlzLmlzSW5maW5pdGUoKSYmbi5pc0luZmluaXRlKCk/b3kuTkFOOnRoaXMuaXNJbmZpbml0ZSgpfHxuLmlzSW5maW5pdGUoKT9veS5JTkZJTklUWTpuZXcgb3kodGhpcy5yZStuLnJlLHRoaXMuaW0rbi5pbSl9LHN1YjpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBveSh0LGUpO3JldHVybiB0aGlzLmlzSW5maW5pdGUoKSYmbi5pc0luZmluaXRlKCk/b3kuTkFOOnRoaXMuaXNJbmZpbml0ZSgpfHxuLmlzSW5maW5pdGUoKT9veS5JTkZJTklUWTpuZXcgb3kodGhpcy5yZS1uLnJlLHRoaXMuaW0tbi5pbSl9LG11bDpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBveSh0LGUpO3JldHVybiB0aGlzLmlzSW5maW5pdGUoKSYmbi5pc1plcm8oKXx8dGhpcy5pc1plcm8oKSYmbi5pc0luZmluaXRlKCk/b3kuTkFOOnRoaXMuaXNJbmZpbml0ZSgpfHxuLmlzSW5maW5pdGUoKT9veS5JTkZJTklUWTowPT09bi5pbSYmMD09PXRoaXMuaW0/bmV3IG95KHRoaXMucmUqbi5yZSwwKTpuZXcgb3kodGhpcy5yZSpuLnJlLXRoaXMuaW0qbi5pbSx0aGlzLnJlKm4uaW0rdGhpcy5pbSpuLnJlKX0sZGl2OmZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IG95KHQsZSk7aWYodGhpcy5pc1plcm8oKSYmbi5pc1plcm8oKXx8dGhpcy5pc0luZmluaXRlKCkmJm4uaXNJbmZpbml0ZSgpKXJldHVybiBveS5OQU47aWYodGhpcy5pc0luZmluaXRlKCl8fG4uaXNaZXJvKCkpcmV0dXJuIG95LklORklOSVRZO2lmKHRoaXMuaXNaZXJvKCl8fG4uaXNJbmZpbml0ZSgpKXJldHVybiBveS5aRVJPO3Q9dGhpcy5yZSxlPXRoaXMuaW07dmFyIHIsaSxvPW4ucmUscz1uLmltO3JldHVybiAwPT09cz9uZXcgb3kodC9vLGUvbyk6TWF0aC5hYnMobyk8TWF0aC5hYnMocyk/bmV3IG95KCh0KihpPW8vcykrZSkvKHI9byppK3MpLChlKmktdCkvcik6bmV3IG95KCh0K2UqKGk9cy9vKSkvKHI9cyppK28pLChlLXQqaSkvcil9LHBvdzpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBveSh0LGUpO2lmKHQ9dGhpcy5yZSxlPXRoaXMuaW0sbi5pc1plcm8oKSlyZXR1cm4gb3kuT05FO2lmKDA9PT1uLmltKXtpZigwPT09ZSYmdD4wKXJldHVybiBuZXcgb3koTWF0aC5wb3codCxuLnJlKSwwKTtpZigwPT09dClzd2l0Y2goKG4ucmUlNCs0KSU0KXtjYXNlIDA6cmV0dXJuIG5ldyBveShNYXRoLnBvdyhlLG4ucmUpLDApO2Nhc2UgMTpyZXR1cm4gbmV3IG95KDAsTWF0aC5wb3coZSxuLnJlKSk7Y2FzZSAyOnJldHVybiBuZXcgb3koLU1hdGgucG93KGUsbi5yZSksMCk7Y2FzZSAzOnJldHVybiBuZXcgb3koMCwtTWF0aC5wb3coZSxuLnJlKSl9fWlmKDA9PT10JiYwPT09ZSYmbi5yZT4wJiZuLmltPj0wKXJldHVybiBveS5aRVJPO3ZhciByPU1hdGguYXRhbjIoZSx0KSxpPWl5KHQsZSk7cmV0dXJuIHQ9TWF0aC5leHAobi5yZSppLW4uaW0qciksZT1uLmltKmkrbi5yZSpyLG5ldyBveSh0Kk1hdGguY29zKGUpLHQqTWF0aC5zaW4oZSkpfSxzcXJ0OmZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMucmUscj10aGlzLmltLGk9dGhpcy5hYnMoKTtpZihuPj0wKXtpZigwPT09cilyZXR1cm4gbmV3IG95KE1hdGguc3FydChuKSwwKTt0PS41Kk1hdGguc3FydCgyKihpK24pKX1lbHNlIHQ9TWF0aC5hYnMocikvTWF0aC5zcXJ0KDIqKGktbikpO3JldHVybiBlPW48PTA/LjUqTWF0aC5zcXJ0KDIqKGktbikpOk1hdGguYWJzKHIpL01hdGguc3FydCgyKihpK24pKSxuZXcgb3kodCxyPDA/LWU6ZSl9LGV4cDpmdW5jdGlvbigpe3ZhciB0PU1hdGguZXhwKHRoaXMucmUpO3JldHVybiB0aGlzLmltLG5ldyBveSh0Kk1hdGguY29zKHRoaXMuaW0pLHQqTWF0aC5zaW4odGhpcy5pbSkpfSxleHBtMTpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltO3JldHVybiBuZXcgb3koTWF0aC5leHBtMSh0KSpNYXRoLmNvcyhlKStmdW5jdGlvbih0KXt2YXIgZT1NYXRoLlBJLzQ7aWYoLWU+dHx8dD5lKXJldHVybiBNYXRoLmNvcyh0KS0xO3ZhciBuPXQqdDtyZXR1cm4gbioobioobioobioobioobioobioobi8yMDkyMjc4OTg4OGUzLTEvODcxNzgyOTEyMDApKzEvNDc5MDAxNjAwKS0xLzM2Mjg4MDApKzEvNDAzMjApLTEvNzIwKSsxLzI0KS0uNSl9KGUpLE1hdGguZXhwKHQpKk1hdGguc2luKGUpKX0sbG9nOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07cmV0dXJuIG5ldyBveShpeSh0LGUpLE1hdGguYXRhbjIoZSx0KSl9LGFiczpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguYWJzKHQpLHI9TWF0aC5hYnMoZSk7cmV0dXJuIG48M2UzJiZyPDNlMz9NYXRoLnNxcnQobipuK3Iqcik6KG48cj8obj1yLHI9dC9lKTpyPWUvdCxuKk1hdGguc3FydCgxK3IqcikpfSh0aGlzLnJlLHRoaXMuaW0pfSxhcmc6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLmltLHRoaXMucmUpfSxzaW46ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtyZXR1cm4gbmV3IG95KE1hdGguc2luKHQpKmV5KGUpLE1hdGguY29zKHQpKm55KGUpKX0sY29zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07cmV0dXJuIG5ldyBveShNYXRoLmNvcyh0KSpleShlKSwtTWF0aC5zaW4odCkqbnkoZSkpfSx0YW46ZnVuY3Rpb24oKXt2YXIgdD0yKnRoaXMucmUsZT0yKnRoaXMuaW0sbj1NYXRoLmNvcyh0KStleShlKTtyZXR1cm4gbmV3IG95KE1hdGguc2luKHQpL24sbnkoZSkvbil9LGNvdDpmdW5jdGlvbigpe3ZhciB0PTIqdGhpcy5yZSxlPTIqdGhpcy5pbSxuPU1hdGguY29zKHQpLWV5KGUpO3JldHVybiBuZXcgb3koLU1hdGguc2luKHQpL24sbnkoZSkvbil9LHNlYzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltLG49LjUqZXkoMiplKSsuNSpNYXRoLmNvcygyKnQpO3JldHVybiBuZXcgb3koTWF0aC5jb3ModCkqZXkoZSkvbixNYXRoLnNpbih0KSpueShlKS9uKX0sY3NjOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj0uNSpleSgyKmUpLS41Kk1hdGguY29zKDIqdCk7cmV0dXJuIG5ldyBveShNYXRoLnNpbih0KSpleShlKS9uLC1NYXRoLmNvcyh0KSpueShlKS9uKX0sYXNpbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltLG49bmV3IG95KGUqZS10KnQrMSwtMip0KmUpLnNxcnQoKSxyPW5ldyBveShuLnJlLWUsbi5pbSt0KS5sb2coKTtyZXR1cm4gbmV3IG95KHIuaW0sLXIucmUpfSxhY29zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj1uZXcgb3koZSplLXQqdCsxLC0yKnQqZSkuc3FydCgpLHI9bmV3IG95KG4ucmUtZSxuLmltK3QpLmxvZygpO3JldHVybiBuZXcgb3koTWF0aC5QSS8yLXIuaW0sci5yZSl9LGF0YW46ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtpZigwPT09dCl7aWYoMT09PWUpcmV0dXJuIG5ldyBveSgwLDEvMCk7aWYoLTE9PT1lKXJldHVybiBuZXcgb3koMCwtMS8wKX12YXIgbj10KnQrKDEtZSkqKDEtZSkscj1uZXcgb3koKDEtZSplLXQqdCkvbiwtMip0L24pLmxvZygpO3JldHVybiBuZXcgb3koLS41KnIuaW0sLjUqci5yZSl9LGFjb3Q6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtpZigwPT09ZSlyZXR1cm4gbmV3IG95KE1hdGguYXRhbjIoMSx0KSwwKTt2YXIgbj10KnQrZSplO3JldHVybiAwIT09bj9uZXcgb3kodC9uLC1lL24pLmF0YW4oKTpuZXcgb3koMCE9PXQ/dC8wOjAsMCE9PWU/LWUvMDowKS5hdGFuKCl9LGFzZWM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtpZigwPT09dCYmMD09PWUpcmV0dXJuIG5ldyBveSgwLDEvMCk7dmFyIG49dCp0K2UqZTtyZXR1cm4gMCE9PW4/bmV3IG95KHQvbiwtZS9uKS5hY29zKCk6bmV3IG95KDAhPT10P3QvMDowLDAhPT1lPy1lLzA6MCkuYWNvcygpfSxhY3NjOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PXQmJjA9PT1lKXJldHVybiBuZXcgb3koTWF0aC5QSS8yLDEvMCk7dmFyIG49dCp0K2UqZTtyZXR1cm4gMCE9PW4/bmV3IG95KHQvbiwtZS9uKS5hc2luKCk6bmV3IG95KDAhPT10P3QvMDowLDAhPT1lPy1lLzA6MCkuYXNpbigpfSxzaW5oOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07cmV0dXJuIG5ldyBveShueSh0KSpNYXRoLmNvcyhlKSxleSh0KSpNYXRoLnNpbihlKSl9LGNvc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtyZXR1cm4gbmV3IG95KGV5KHQpKk1hdGguY29zKGUpLG55KHQpKk1hdGguc2luKGUpKX0sdGFuaDpmdW5jdGlvbigpe3ZhciB0PTIqdGhpcy5yZSxlPTIqdGhpcy5pbSxuPWV5KHQpK01hdGguY29zKGUpO3JldHVybiBuZXcgb3kobnkodCkvbixNYXRoLnNpbihlKS9uKX0sY290aDpmdW5jdGlvbigpe3ZhciB0PTIqdGhpcy5yZSxlPTIqdGhpcy5pbSxuPWV5KHQpLU1hdGguY29zKGUpO3JldHVybiBuZXcgb3kobnkodCkvbiwtTWF0aC5zaW4oZSkvbil9LGNzY2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbSxuPU1hdGguY29zKDIqZSktZXkoMip0KTtyZXR1cm4gbmV3IG95KC0yKm55KHQpKk1hdGguY29zKGUpL24sMipleSh0KSpNYXRoLnNpbihlKS9uKX0sc2VjaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltLG49TWF0aC5jb3MoMiplKStleSgyKnQpO3JldHVybiBuZXcgb3koMipleSh0KSpNYXRoLmNvcyhlKS9uLC0yKm55KHQpKk1hdGguc2luKGUpL24pfSxhc2luaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaW07dGhpcy5pbT0tdGhpcy5yZSx0aGlzLnJlPXQ7dmFyIGU9dGhpcy5hc2luKCk7cmV0dXJuIHRoaXMucmU9LXRoaXMuaW0sdGhpcy5pbT10LHQ9ZS5yZSxlLnJlPS1lLmltLGUuaW09dCxlfSxhY29zaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYWNvcygpO2lmKHQuaW08PTApe3ZhciBlPXQucmU7dC5yZT0tdC5pbSx0LmltPWV9ZWxzZXtlPXQuaW07dC5pbT0tdC5yZSx0LnJlPWV9cmV0dXJuIHR9LGF0YW5oOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj10PjEmJjA9PT1lLHI9MS10LGk9MSt0LG89cipyK2UqZSxzPTAhPT1vP25ldyBveSgoaSpyLWUqZSkvbywoZSpyK2kqZSkvbyk6bmV3IG95KC0xIT09dD90LzA6MCwwIT09ZT9lLzA6MCksYT1zLnJlO3JldHVybiBzLnJlPWl5KHMucmUscy5pbSkvMixzLmltPU1hdGguYXRhbjIocy5pbSxhKS8yLG4mJihzLmltPS1zLmltKSxzfSxhY290aDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltO2lmKDA9PT10JiYwPT09ZSlyZXR1cm4gbmV3IG95KDAsTWF0aC5QSS8yKTt2YXIgbj10KnQrZSplO3JldHVybiAwIT09bj9uZXcgb3kodC9uLC1lL24pLmF0YW5oKCk6bmV3IG95KDAhPT10P3QvMDowLDAhPT1lPy1lLzA6MCkuYXRhbmgoKX0sYWNzY2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtpZigwPT09ZSlyZXR1cm4gbmV3IG95KDAhPT10P01hdGgubG9nKHQrTWF0aC5zcXJ0KHQqdCsxKSk6MS8wLDApO3ZhciBuPXQqdCtlKmU7cmV0dXJuIDAhPT1uP25ldyBveSh0L24sLWUvbikuYXNpbmgoKTpuZXcgb3koMCE9PXQ/dC8wOjAsMCE9PWU/LWUvMDowKS5hc2luaCgpfSxhc2VjaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltO2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIG95LklORklOSVRZO3ZhciBuPXQqdCtlKmU7cmV0dXJuIDAhPT1uP25ldyBveSh0L24sLWUvbikuYWNvc2goKTpuZXcgb3koMCE9PXQ/dC8wOjAsMCE9PWU/LWUvMDowKS5hY29zaCgpfSxpbnZlcnNlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gb3kuSU5GSU5JVFk7aWYodGhpcy5pc0luZmluaXRlKCkpcmV0dXJuIG95LlpFUk87dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj10KnQrZSplO3JldHVybiBuZXcgb3kodC9uLC1lL24pfSxjb25qdWdhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG95KHRoaXMucmUsLXRoaXMuaW0pfSxuZWc6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG95KC10aGlzLnJlLC10aGlzLmltKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLnBvdygxMCx0fHwwKSxuZXcgb3koTWF0aC5jZWlsKHRoaXMucmUqdCkvdCxNYXRoLmNlaWwodGhpcy5pbSp0KS90KX0sZmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coMTAsdHx8MCksbmV3IG95KE1hdGguZmxvb3IodGhpcy5yZSp0KS90LE1hdGguZmxvb3IodGhpcy5pbSp0KS90KX0scm91bmQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coMTAsdHx8MCksbmV3IG95KE1hdGgucm91bmQodGhpcy5yZSp0KS90LE1hdGgucm91bmQodGhpcy5pbSp0KS90KX0sZXF1YWxzOmZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IG95KHQsZSk7cmV0dXJuIE1hdGguYWJzKG4ucmUtdGhpcy5yZSk8PW95LkVQU0lMT04mJk1hdGguYWJzKG4uaW0tdGhpcy5pbSk8PW95LkVQU0lMT059LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBveSh0aGlzLnJlLHRoaXMuaW0pfSx0b1N0cmluZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltLG49IiI7cmV0dXJuIHRoaXMuaXNOYU4oKT8iTmFOIjp0aGlzLmlzSW5maW5pdGUoKT8iSW5maW5pdHkiOihNYXRoLmFicyh0KTxveS5FUFNJTE9OJiYodD0wKSxNYXRoLmFicyhlKTxveS5FUFNJTE9OJiYoZT0wKSwwPT09ZT9uK3Q6KDAhPT10PyhuKz10LG4rPSIgIixlPDA/KGU9LWUsbis9Ii0iKTpuKz0iKyIsbis9IiAiKTplPDAmJihlPS1lLG4rPSItIiksMSE9PWUmJihuKz1lKSxuKyJpIikpfSx0b1ZlY3RvcjpmdW5jdGlvbigpe3JldHVyblt0aGlzLnJlLHRoaXMuaW1dfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmltP3RoaXMucmU6bnVsbH0saXNOYU46ZnVuY3Rpb24oKXtyZXR1cm4gaXNOYU4odGhpcy5yZSl8fGlzTmFOKHRoaXMuaW0pfSxpc1plcm86ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuaW0mJjA9PT10aGlzLnJlfSxpc0Zpbml0ZTpmdW5jdGlvbigpe3JldHVybiBpc0Zpbml0ZSh0aGlzLnJlKSYmaXNGaW5pdGUodGhpcy5pbSl9LGlzSW5maW5pdGU6ZnVuY3Rpb24oKXtyZXR1cm4hKHRoaXMuaXNOYU4oKXx8dGhpcy5pc0Zpbml0ZSgpKX19LG95LlpFUk89bmV3IG95KDAsMCksb3kuT05FPW5ldyBveSgxLDApLG95Lkk9bmV3IG95KDAsMSksb3kuUEk9bmV3IG95KE1hdGguUEksMCksb3kuRT1uZXcgb3koTWF0aC5FLDApLG95LklORklOSVRZPW5ldyBveSgxLzAsMS8wKSxveS5OQU49bmV3IG95KE5hTixOYU4pLG95LkVQU0lMT049MWUtMTU7dmFyIHN5PWlkKCJDb21wbGV4IixbXSwoKCk9PihPYmplY3QuZGVmaW5lUHJvcGVydHkob3ksIm5hbWUiLHt2YWx1ZToiQ29tcGxleCJ9KSxveS5wcm90b3R5cGUuY29uc3RydWN0b3I9b3ksb3kucHJvdG90eXBlLnR5cGU9IkNvbXBsZXgiLG95LnByb3RvdHlwZS5pc0NvbXBsZXg9ITAsb3kucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkNvbXBsZXgiLHJlOnRoaXMucmUsaW06dGhpcy5pbX19LG95LnByb3RvdHlwZS50b1BvbGFyPWZ1bmN0aW9uKCl7cmV0dXJue3I6dGhpcy5hYnMoKSxwaGk6dGhpcy5hcmcoKX19LG95LnByb3RvdHlwZS5mb3JtYXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbSxuPXRoaXMucmUscj1UcCh0aGlzLnJlLHQpLGk9VHAodGhpcy5pbSx0KSxvPVBmKHQpP3Q6dD90LnByZWNpc2lvbjpudWxsO2lmKG51bGwhPT1vKXt2YXIgcz1NYXRoLnBvdygxMCwtbyk7TWF0aC5hYnMobi9lKTxzJiYobj0wKSxNYXRoLmFicyhlL24pPHMmJihlPTApfXJldHVybiAwPT09ZT9yOjA9PT1uPzE9PT1lPyJpIjotMT09PWU/Ii1pIjppKyJpIjplPDA/LTE9PT1lP3IrIiAtIGkiOnIrIiAtICIraS5zdWJzdHJpbmcoMSkrImkiOjE9PT1lP3IrIiArIGkiOnIrIiArICIraSsiaSJ9LG95LmZyb21Qb2xhcj1mdW5jdGlvbih0KXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOnZhciBlPWFyZ3VtZW50c1swXTtpZigib2JqZWN0Ij09dHlwZW9mIGUpcmV0dXJuIG95KGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIklucHV0IGhhcyB0byBiZSBhbiBvYmplY3Qgd2l0aCByIGFuZCBwaGkga2V5cy4iKTtjYXNlIDI6dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO2lmKFBmKG4pKXtpZih6ZihyKSYmci5oYXNCYXNlKCJBTkdMRSIpJiYocj1yLnRvTnVtYmVyKCJyYWQiKSksUGYocikpcmV0dXJuIG5ldyBveSh7cjpuLHBoaTpyfSk7dGhyb3cgbmV3IFR5cGVFcnJvcigiUGhpIGlzIG5vdCBhIG51bWJlciBub3IgYW4gYW5nbGUgdW5pdC4iKX10aHJvdyBuZXcgVHlwZUVycm9yKCJSYWRpdXMgciBpcyBub3QgYSBudW1iZXIuIik7ZGVmYXVsdDp0aHJvdyBuZXcgU3ludGF4RXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgaW4gZnVuY3Rpb24gZnJvbVBvbGFyIil9fSxveS5wcm90b3R5cGUudmFsdWVPZj1veS5wcm90b3R5cGUudG9TdHJpbmcsb3kuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBveSh0KX0sb3kuY29tcGFyZT1mdW5jdGlvbih0LGUpe3JldHVybiB0LnJlPmUucmU/MTp0LnJlPGUucmU/LTE6dC5pbT5lLmltPzE6dC5pbTxlLmltPy0xOjB9LG95KSkse2lzQ2xhc3M6ITB9KSxheT17czoxLG46MCxkOjF9O2Z1bmN0aW9uIHV5KHQsZSl7aWYoaXNOYU4odD1wYXJzZUludCh0LDEwKSkpdGhyb3cgZ3koKTtyZXR1cm4gdCplfWZ1bmN0aW9uIGN5KHQsZSl7aWYoMD09PWUpdGhyb3cgZHkoKTt2YXIgbj1PYmplY3QuY3JlYXRlKHB5LnByb3RvdHlwZSk7bi5zPXQ8MD8tMToxO3ZhciByPWZ5KHQ9dDwwPy10OnQsZSk7cmV0dXJuIG4ubj10L3Isbi5kPWUvcixufWZ1bmN0aW9uIGx5KHQpe2Zvcih2YXIgZT17fSxuPXQscj0yLGk9NDtpPD1uOyl7Zm9yKDtuJXI9PTA7KW4vPXIsZVtyXT0oZVtyXXx8MCkrMTtpKz0xKzIqcisrfXJldHVybiBuIT09dD9uPjEmJihlW25dPShlW25dfHwwKSsxKTplW3RdPShlW3RdfHwwKSsxLGV9dmFyIGh5PWZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wLGk9MSxvPTEscz0wLGE9MCx1PTAsYz0xLGw9MSxoPTAsZj0xLHA9MSxkPTEsZz0xZTc7aWYobnVsbCE9dClpZih2b2lkIDAhPT1lKXtpZihvPShyPXQpKihpPWUpLHIlMSE9MHx8aSUxIT0wKXRocm93IHl5KCl9ZWxzZSBzd2l0Y2godHlwZW9mIHQpe2Nhc2Uib2JqZWN0IjppZigiZCJpbiB0JiYibiJpbiB0KXI9dC5uLGk9dC5kLCJzImluIHQmJihyKj10LnMpO2Vsc2V7aWYoISgwIGluIHQpKXRocm93IGd5KCk7cj10WzBdLDEgaW4gdCYmKGk9dFsxXSl9bz1yKmk7YnJlYWs7Y2FzZSJudW1iZXIiOmlmKHQ8MCYmKG89dCx0PS10KSx0JTE9PTApcj10O2Vsc2UgaWYodD4wKXtmb3IodD49MSYmKHQvPWw9TWF0aC5wb3coMTAsTWF0aC5mbG9vcigxK01hdGgubG9nKHQpL01hdGguTE4xMCkpKTtmPD1nJiZkPD1nOyl7aWYodD09PShuPShoK3ApLyhmK2QpKSl7ZitkPD1nPyhyPWgrcCxpPWYrZCk6ZD5mPyhyPXAsaT1kKToocj1oLGk9Zik7YnJlYWt9dD5uPyhoKz1wLGYrPWQpOihwKz1oLGQrPWYpLGY+Zz8ocj1wLGk9ZCk6KHI9aCxpPWYpfXIqPWx9ZWxzZShpc05hTih0KXx8aXNOYU4oZSkpJiYoaT1yPU5hTik7YnJlYWs7Y2FzZSJzdHJpbmciOmlmKG51bGw9PT0oZj10Lm1hdGNoKC9cZCt8Li9nKSkpdGhyb3cgZ3koKTtpZigiLSI9PT1mW2hdPyhvPS0xLGgrKyk6IisiPT09ZltoXSYmaCsrLGYubGVuZ3RoPT09aCsxP2E9dXkoZltoKytdLG8pOiIuIj09PWZbaCsxXXx8Ii4iPT09ZltoXT8oIi4iIT09ZltoXSYmKHM9dXkoZltoKytdLG8pKSwoKytoKzE9PT1mLmxlbmd0aHx8IigiPT09ZltoKzFdJiYiKSI9PT1mW2grM118fCInIj09PWZbaCsxXSYmIiciPT09ZltoKzNdKSYmKGE9dXkoZltoXSxvKSxjPU1hdGgucG93KDEwLGZbaF0ubGVuZ3RoKSxoKyspLCgiKCI9PT1mW2hdJiYiKSI9PT1mW2grMl18fCInIj09PWZbaF0mJiInIj09PWZbaCsyXSkmJih1PXV5KGZbaCsxXSxvKSxsPU1hdGgucG93KDEwLGZbaCsxXS5sZW5ndGgpLTEsaCs9MykpOiIvIj09PWZbaCsxXXx8IjoiPT09ZltoKzFdPyhhPXV5KGZbaF0sbyksYz11eShmW2grMl0sMSksaCs9Myk6Ii8iPT09ZltoKzNdJiYiICI9PT1mW2grMV0mJihzPXV5KGZbaF0sbyksYT11eShmW2grMl0sbyksYz11eShmW2grNF0sMSksaCs9NSksZi5sZW5ndGg8PWgpe289cj11KyhpPWMqbCkqcytsKmE7YnJlYWt9ZGVmYXVsdDp0aHJvdyBneSgpfWlmKDA9PT1pKXRocm93IGR5KCk7YXkucz1vPDA/LTE6MSxheS5uPU1hdGguYWJzKHIpLGF5LmQ9TWF0aC5hYnMoaSl9O2Z1bmN0aW9uIGZ5KHQsZSl7aWYoIXQpcmV0dXJuIGU7aWYoIWUpcmV0dXJuIHQ7Zm9yKDs7KXtpZighKHQlPWUpKXJldHVybiBlO2lmKCEoZSU9dCkpcmV0dXJuIHR9fWZ1bmN0aW9uIHB5KHQsZSl7aWYoaHkodCxlKSwhKHRoaXMgaW5zdGFuY2VvZiBweSkpcmV0dXJuIGN5KGF5LnMqYXkubixheS5kKTt0PWZ5KGF5LmQsYXkubiksdGhpcy5zPWF5LnMsdGhpcy5uPWF5Lm4vdCx0aGlzLmQ9YXkuZC90fXZhciBkeT1mdW5jdGlvbigpe3JldHVybiBuZXcgRXJyb3IoIkRpdmlzaW9uIGJ5IFplcm8iKX0sZ3k9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50Iil9LHl5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcigiUGFyYW1ldGVycyBtdXN0IGJlIGludGVnZXIiKX07cHkucHJvdG90eXBlPXtzOjEsbjowLGQ6MSxhYnM6ZnVuY3Rpb24oKXtyZXR1cm4gY3kodGhpcy5uLHRoaXMuZCl9LG5lZzpmdW5jdGlvbigpe3JldHVybiBjeSgtdGhpcy5zKnRoaXMubix0aGlzLmQpfSxhZGQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaHkodCxlKSxjeSh0aGlzLnMqdGhpcy5uKmF5LmQrYXkucyp0aGlzLmQqYXkubix0aGlzLmQqYXkuZCl9LHN1YjpmdW5jdGlvbih0LGUpe3JldHVybiBoeSh0LGUpLGN5KHRoaXMucyp0aGlzLm4qYXkuZC1heS5zKnRoaXMuZCpheS5uLHRoaXMuZCpheS5kKX0sbXVsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGh5KHQsZSksY3kodGhpcy5zKmF5LnMqdGhpcy5uKmF5Lm4sdGhpcy5kKmF5LmQpfSxkaXY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaHkodCxlKSxjeSh0aGlzLnMqYXkucyp0aGlzLm4qYXkuZCx0aGlzLmQqYXkubil9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIGN5KHRoaXMucyp0aGlzLm4sdGhpcy5kKX0sbW9kOmZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odGhpcy5uKXx8aXNOYU4odGhpcy5kKSlyZXR1cm4gbmV3IHB5KE5hTik7aWYodm9pZCAwPT09dClyZXR1cm4gY3kodGhpcy5zKnRoaXMubiV0aGlzLmQsMSk7aWYoaHkodCxlKSwwPT09YXkubiYmMD09PXRoaXMuZCl0aHJvdyBkeSgpO3JldHVybiBjeSh0aGlzLnMqKGF5LmQqdGhpcy5uKSUoYXkubip0aGlzLmQpLGF5LmQqdGhpcy5kKX0sZ2NkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGh5KHQsZSksY3koZnkoYXkubix0aGlzLm4pKmZ5KGF5LmQsdGhpcy5kKSxheS5kKnRoaXMuZCl9LGxjbTpmdW5jdGlvbih0LGUpe3JldHVybiBoeSh0LGUpLDA9PT1heS5uJiYwPT09dGhpcy5uP2N5KDAsMSk6Y3koYXkubip0aGlzLm4sZnkoYXkubix0aGlzLm4pKmZ5KGF5LmQsdGhpcy5kKSl9LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coMTAsdHx8MCksaXNOYU4odGhpcy5uKXx8aXNOYU4odGhpcy5kKT9uZXcgcHkoTmFOKTpjeShNYXRoLmNlaWwodCp0aGlzLnMqdGhpcy5uL3RoaXMuZCksdCl9LGZsb29yOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KDEwLHR8fDApLGlzTmFOKHRoaXMubil8fGlzTmFOKHRoaXMuZCk/bmV3IHB5KE5hTik6Y3koTWF0aC5mbG9vcih0KnRoaXMucyp0aGlzLm4vdGhpcy5kKSx0KX0scm91bmQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coMTAsdHx8MCksaXNOYU4odGhpcy5uKXx8aXNOYU4odGhpcy5kKT9uZXcgcHkoTmFOKTpjeShNYXRoLnJvdW5kKHQqdGhpcy5zKnRoaXMubi90aGlzLmQpLHQpfSxyb3VuZFRvOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGh5KHQsZSksY3kodGhpcy5zKk1hdGgucm91bmQodGhpcy5uKmF5LmQvKHRoaXMuZCpheS5uKSkqYXkubixheS5kKX0saW52ZXJzZTpmdW5jdGlvbigpe3JldHVybiBjeSh0aGlzLnMqdGhpcy5kLHRoaXMubil9LHBvdzpmdW5jdGlvbih0LGUpe2lmKGh5KHQsZSksMT09PWF5LmQpcmV0dXJuIGF5LnM8MD9jeShNYXRoLnBvdyh0aGlzLnMqdGhpcy5kLGF5Lm4pLE1hdGgucG93KHRoaXMubixheS5uKSk6Y3koTWF0aC5wb3codGhpcy5zKnRoaXMubixheS5uKSxNYXRoLnBvdyh0aGlzLmQsYXkubikpO2lmKHRoaXMuczwwKXJldHVybiBudWxsO3ZhciBuPWx5KHRoaXMubikscj1seSh0aGlzLmQpLGk9MSxvPTE7Zm9yKHZhciBzIGluIG4paWYoIjEiIT09cyl7aWYoIjAiPT09cyl7aT0wO2JyZWFrfWlmKG5bc10qPWF5Lm4sbltzXSVheS5kIT0wKXJldHVybiBudWxsO25bc10vPWF5LmQsaSo9TWF0aC5wb3cocyxuW3NdKX1mb3IodmFyIHMgaW4gcilpZigiMSIhPT1zKXtpZihyW3NdKj1heS5uLHJbc10lYXkuZCE9MClyZXR1cm4gbnVsbDtyW3NdLz1heS5kLG8qPU1hdGgucG93KHMscltzXSl9cmV0dXJuIGF5LnM8MD9jeShvLGkpOmN5KGksbyl9LGVxdWFsczpmdW5jdGlvbih0LGUpe3JldHVybiBoeSh0LGUpLHRoaXMucyp0aGlzLm4qYXkuZD09YXkucypheS5uKnRoaXMuZH0sY29tcGFyZTpmdW5jdGlvbih0LGUpe2h5KHQsZSk7dmFyIG49dGhpcy5zKnRoaXMubipheS5kLWF5LnMqYXkubip0aGlzLmQ7cmV0dXJuKDA8biktKG48MCl9LHNpbXBsaWZ5OmZ1bmN0aW9uKHQpe2lmKGlzTmFOKHRoaXMubil8fGlzTmFOKHRoaXMuZCkpcmV0dXJuIHRoaXM7dD10fHwuMDAxO2Zvcih2YXIgZT10aGlzLmFicygpLG49ZS50b0NvbnRpbnVlZCgpLHI9MTtyPG4ubGVuZ3RoO3IrKyl7Zm9yKHZhciBpPWN5KG5bci0xXSwxKSxvPXItMjtvPj0wO28tLSlpPWkuaW52ZXJzZSgpLmFkZChuW29dKTtpZihNYXRoLmFicyhpLnN1YihlKS52YWx1ZU9mKCkpPHQpcmV0dXJuIGkubXVsKHRoaXMucyl9cmV0dXJuIHRoaXN9LGRpdmlzaWJsZTpmdW5jdGlvbih0LGUpe3JldHVybiBoeSh0LGUpLCEoIShheS5uKnRoaXMuZCl8fHRoaXMubipheS5kJShheS5uKnRoaXMuZCkpfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucyp0aGlzLm4vdGhpcy5kfSx0b0ZyYWN0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlLG49IiIscj10aGlzLm4saT10aGlzLmQ7cmV0dXJuIHRoaXMuczwwJiYobis9Ii0iKSwxPT09aT9uKz1yOih0JiYoZT1NYXRoLmZsb29yKHIvaSkpPjAmJihuKz1lLG4rPSIgIixyJT1pKSxuKz1yLG4rPSIvIixuKz1pKSxufSx0b0xhdGV4OmZ1bmN0aW9uKHQpe3ZhciBlLG49IiIscj10aGlzLm4saT10aGlzLmQ7cmV0dXJuIHRoaXMuczwwJiYobis9Ii0iKSwxPT09aT9uKz1yOih0JiYoZT1NYXRoLmZsb29yKHIvaSkpPjAmJihuKz1lLHIlPWkpLG4rPSJcXGZyYWN7IixuKz1yLG4rPSJ9eyIsbis9aSxuKz0ifSIpLG59LHRvQ29udGludWVkOmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLm4sbj10aGlzLmQscj1bXTtpZihpc05hTihlKXx8aXNOYU4obikpcmV0dXJuIHI7ZG97ci5wdXNoKE1hdGguZmxvb3IoZS9uKSksdD1lJW4sZT1uLG49dH13aGlsZSgxIT09ZSk7cmV0dXJuIHJ9LHRvU3RyaW5nOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubixuPXRoaXMuZDtpZihpc05hTihlKXx8aXNOYU4obikpcmV0dXJuIk5hTiI7dD10fHwxNTt2YXIgcj1mdW5jdGlvbih0LGUpe2Zvcig7ZSUyPT0wO2UvPTIpO2Zvcig7ZSU1PT0wO2UvPTUpO2lmKDE9PT1lKXJldHVybiAwO2Zvcih2YXIgbj0xMCVlLHI9MTsxIT09bjtyKyspaWYobj0xMCpuJWUscj4yZTMpcmV0dXJuIDA7cmV0dXJuIHJ9KDAsbiksaT1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTEsaT1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTE7ZT4wO3Q9dCp0JW4sZT4+PTEpMSZlJiYocj1yKnQlbik7cmV0dXJuIHJ9KDEwLG4sZSksbz0wO288MzAwO28rKyl7aWYocj09PWkpcmV0dXJuIG87cj0xMCpyJWUsaT0xMCppJWV9cmV0dXJuIDB9KDAsbixyKSxvPXRoaXMuczwwPyItIjoiIjtpZihvKz1lL258MCxlJT1uLChlKj0xMCkmJihvKz0iLiIpLHIpe2Zvcih2YXIgcz1pO3MtLTspbys9ZS9ufDAsZSU9bixlKj0xMDtvKz0iKCI7Zm9yKHM9cjtzLS07KW8rPWUvbnwwLGUlPW4sZSo9MTA7bys9IikifWVsc2UgZm9yKHM9dDtlJiZzLS07KW8rPWUvbnwwLGUlPW4sZSo9MTA7cmV0dXJuIG99fTt2YXIgbXk9aWQoIkZyYWN0aW9uIixbXSwoKCk9PihPYmplY3QuZGVmaW5lUHJvcGVydHkocHksIm5hbWUiLHt2YWx1ZToiRnJhY3Rpb24ifSkscHkucHJvdG90eXBlLmNvbnN0cnVjdG9yPXB5LHB5LnByb3RvdHlwZS50eXBlPSJGcmFjdGlvbiIscHkucHJvdG90eXBlLmlzRnJhY3Rpb249ITAscHkucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkZyYWN0aW9uIixuOnRoaXMucyp0aGlzLm4sZDp0aGlzLmR9fSxweS5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHB5KHQpfSxweSkpLHtpc0NsYXNzOiEwfSksdnk9aWQoIk1hdHJpeCIsW10sKCgpPT57ZnVuY3Rpb24gdCgpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIil9cmV0dXJuIHQucHJvdG90eXBlLnR5cGU9Ik1hdHJpeCIsdC5wcm90b3R5cGUuaXNNYXRyaXg9ITAsdC5wcm90b3R5cGUuc3RvcmFnZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzdG9yYWdlIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5kYXRhdHlwZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBkYXRhdHlwZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGNyZWF0ZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuc3Vic2V0PWZ1bmN0aW9uKHQsZSxuKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc3Vic2V0IG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGdldCBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc2V0IG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgcmVzaXplIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHJlc2hhcGUgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGNsb25lIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHNpemUgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0LGUpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBtYXAgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGZvckVhY2ggb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpdGVyYXRlIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHRvQXJyYXkgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgdmFsdWVPZiBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBmb3JtYXQgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHRvU3RyaW5nIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0fSkse2lzQ2xhc3M6ITB9KTtmdW5jdGlvbiBfeSh0KXtyZXR1cm4gT2JqZWN0LmtleXModC5zaWduYXR1cmVzfHx7fSkucmVkdWNlKChmdW5jdGlvbih0LGUpe3ZhciBuPShlLm1hdGNoKC8sL2cpfHxbXSkubGVuZ3RoKzE7cmV0dXJuIE1hdGgubWF4KHQsbil9KSwtMSl9dmFyIHh5PWlkKCJEZW5zZU1hdHJpeCIsWyJNYXRyaXgiXSwodD0+e3ZhcntNYXRyaXg6ZX09dDtmdW5jdGlvbiBuKHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3IiKTtpZihlJiYhamYoZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRhdGF0eXBlOiAiK2UpO2lmKHFmKHQpKSJEZW5zZU1hdHJpeCI9PT10LnR5cGU/KHRoaXMuX2RhdGE9d3AodC5fZGF0YSksdGhpcy5fc2l6ZT13cCh0Ll9zaXplKSx0aGlzLl9kYXRhdHlwZT1lfHx0Ll9kYXRhdHlwZSk6KHRoaXMuX2RhdGE9dC50b0FycmF5KCksdGhpcy5fc2l6ZT10LnNpemUoKSx0aGlzLl9kYXRhdHlwZT1lfHx0Ll9kYXRhdHlwZSk7ZWxzZSBpZih0JiZVZih0LmRhdGEpJiZVZih0LnNpemUpKXRoaXMuX2RhdGE9dC5kYXRhLHRoaXMuX3NpemU9dC5zaXplLEhwKHRoaXMuX2RhdGEsdGhpcy5fc2l6ZSksdGhpcy5fZGF0YXR5cGU9ZXx8dC5kYXRhdHlwZTtlbHNlIGlmKFVmKHQpKXRoaXMuX2RhdGE9YSh0KSx0aGlzLl9zaXplPVhwKHRoaXMuX2RhdGEpLEhwKHRoaXMuX2RhdGEsdGhpcy5fc2l6ZSksdGhpcy5fZGF0YXR5cGU9ZTtlbHNle2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSBvZiBkYXRhICgiK3hwKHQpKyIpIik7dGhpcy5fZGF0YT1bXSx0aGlzLl9zaXplPVswXSx0aGlzLl9kYXRhdHlwZT1lfX1mdW5jdGlvbiByKHQsZSxuLGkpe3ZhciBvPWk9PT1uLTEscz1lLmRpbWVuc2lvbihpKTtyZXR1cm4gbz9zLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIFpwKGUsdC5sZW5ndGgpLHRbZV19KSkudmFsdWVPZigpOnMubWFwKChmdW5jdGlvbihvKXtyZXR1cm4gWnAobyx0Lmxlbmd0aCkscih0W29dLGUsbixpKzEpfSkpLnZhbHVlT2YoKX1mdW5jdGlvbiBpKHQsZSxuLHIsbyl7dmFyIHM9bz09PXItMSxhPWUuZGltZW5zaW9uKG8pO3M/YS5mb3JFYWNoKChmdW5jdGlvbihlLHIpe1pwKGUpLHRbZV09bltyWzBdXX0pKTphLmZvckVhY2goKGZ1bmN0aW9uKHMsYSl7WnAocyksaSh0W3NdLGUsblthWzBdXSxyLG8rMSl9KSl9ZnVuY3Rpb24gbyh0LGUsbil7aWYoMD09PWUubGVuZ3RoKXtmb3IodmFyIHI9dC5fZGF0YTtVZihyKTspcj1yWzBdO3JldHVybiByfXJldHVybiB0Ll9zaXplPWUuc2xpY2UoMCksdC5fZGF0YT1LcCh0Ll9kYXRhLHQuX3NpemUsbiksdH1mdW5jdGlvbiBzKHQsZSxuKXtmb3IodmFyIHI9dC5fc2l6ZS5zbGljZSgwKSxpPSExO3IubGVuZ3RoPGUubGVuZ3RoOylyLnB1c2goMCksaT0hMDtmb3IodmFyIHM9MCxhPWUubGVuZ3RoO3M8YTtzKyspZVtzXT5yW3NdJiYocltzXT1lW3NdLGk9ITApO2kmJm8odCxyLG4pfWZ1bmN0aW9uIGEodCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10W2VdO1VmKHIpP3RbZV09YShyKTpyJiYhMD09PXIuaXNNYXRyaXgmJih0W2VdPWEoci52YWx1ZU9mKCkpKX1yZXR1cm4gdH1yZXR1cm4gbi5wcm90b3R5cGU9bmV3IGUsbi5wcm90b3R5cGUuY3JlYXRlRGVuc2VNYXRyaXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG4odCxlKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIm5hbWUiLHt2YWx1ZToiRGVuc2VNYXRyaXgifSksbi5wcm90b3R5cGUuY29uc3RydWN0b3I9bixuLnByb3RvdHlwZS50eXBlPSJEZW5zZU1hdHJpeCIsbi5wcm90b3R5cGUuaXNEZW5zZU1hdHJpeD0hMCxuLnByb3RvdHlwZS5nZXREYXRhVHlwZT1mdW5jdGlvbigpe3JldHVybiByZCh0aGlzLl9kYXRhLHhwKX0sbi5wcm90b3R5cGUuc3RvcmFnZT1mdW5jdGlvbigpe3JldHVybiJkZW5zZSJ9LG4ucHJvdG90eXBlLmRhdGF0eXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF0eXBlfSxuLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG4odCxlKX0sbi5wcm90b3R5cGUuc3Vic2V0PWZ1bmN0aW9uKHQsZSxvKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbih0LGUpe2lmKCFXZihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGluZGV4Iik7dmFyIGk9ZS5pc1NjYWxhcigpO2lmKGkpcmV0dXJuIHQuZ2V0KGUubWluKCkpO3ZhciBvPWUuc2l6ZSgpO2lmKG8ubGVuZ3RoIT09dC5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKG8ubGVuZ3RoLHQuX3NpemUubGVuZ3RoKTtmb3IodmFyIHM9ZS5taW4oKSxhPWUubWF4KCksdT0wLGM9dC5fc2l6ZS5sZW5ndGg7dTxjO3UrKylacChzW3VdLHQuX3NpemVbdV0pLFpwKGFbdV0sdC5fc2l6ZVt1XSk7cmV0dXJuIG5ldyBuKHIodC5fZGF0YSxlLG8ubGVuZ3RoLDApLHQuX2RhdGF0eXBlKX0odGhpcyx0KTtjYXNlIDI6Y2FzZSAzOnJldHVybiBmdW5jdGlvbih0LGUsbixyKXtpZighZXx8ITAhPT1lLmlzSW5kZXgpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBpbmRleCIpO3ZhciBvLGE9ZS5zaXplKCksdT1lLmlzU2NhbGFyKCk7aWYocWYobik/KG89bi5zaXplKCksbj1uLnZhbHVlT2YoKSk6bz1YcChuKSx1KXtpZigwIT09by5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiU2NhbGFyIGV4cGVjdGVkIik7dC5zZXQoZS5taW4oKSxuLHIpfWVsc2V7aWYoYS5sZW5ndGg8dC5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKGEubGVuZ3RoLHQuX3NpemUubGVuZ3RoLCI8Iik7aWYoby5sZW5ndGg8YS5sZW5ndGgpe2Zvcih2YXIgYz0wLGw9MDsxPT09YVtjXSYmMT09PW9bY107KWMrKztmb3IoOzE9PT1hW2NdOylsKyssYysrO249ZWQobixhLmxlbmd0aCxsLG8pfWlmKCFicChhLG8pKXRocm93IG5ldyBHcChhLG8sIj4iKTtzKHQsZS5tYXgoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0KzF9KSkscik7dmFyIGg9YS5sZW5ndGgsZj0wO2kodC5fZGF0YSxlLG4saCxmKX1yZXR1cm4gdH0odGhpcyx0LGUsbyk7ZGVmYXVsdDp0aHJvdyBuZXcgU3ludGF4RXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMiKX19LG4ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZighVWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aCE9PXRoaXMuX3NpemUubGVuZ3RoKXRocm93IG5ldyBHcCh0Lmxlbmd0aCx0aGlzLl9zaXplLmxlbmd0aCk7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspWnAodFtlXSx0aGlzLl9zaXplW2VdKTtmb3IodmFyIG49dGhpcy5fZGF0YSxyPTAsaT10Lmxlbmd0aDtyPGk7cisrKXt2YXIgbz10W3JdO1pwKG8sbi5sZW5ndGgpLG49bltvXX1yZXR1cm4gbn0sbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXtpZighVWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aDx0aGlzLl9zaXplLmxlbmd0aCl0aHJvdyBuZXcgR3AodC5sZW5ndGgsdGhpcy5fc2l6ZS5sZW5ndGgsIjwiKTt2YXIgcixpLG87cyh0aGlzLHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdCsxfSkpLG4pO3ZhciBhPXRoaXMuX2RhdGE7Zm9yKHI9MCxpPXQubGVuZ3RoLTE7cjxpO3IrKylacChvPXRbcl0sYS5sZW5ndGgpLGE9YVtvXTtyZXR1cm4gWnAobz10W3QubGVuZ3RoLTFdLGEubGVuZ3RoKSxhW29dPWUsdGhpc30sbi5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKHQsZSxuKXtpZighVmYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgb3IgTWF0cml4IGV4cGVjdGVkIik7dmFyIHI9dC52YWx1ZU9mKCkubWFwKCh0PT5BcnJheS5pc0FycmF5KHQpJiYxPT09dC5sZW5ndGg/dFswXTp0KSk7cmV0dXJuIG8obj90aGlzLmNsb25lKCk6dGhpcyxyLGUpfSxuLnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZT90aGlzLmNsb25lKCk6dGhpcztuLl9kYXRhPVFwKG4uX2RhdGEsdCk7dmFyIHI9bi5fc2l6ZS5yZWR1Y2UoKCh0LGUpPT50KmUpKTtyZXR1cm4gbi5fc2l6ZT0kcCh0LHIpLG59LG4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHtkYXRhOndwKHRoaXMuX2RhdGEpLHNpemU6d3AodGhpcy5fc2l6ZSksZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9KX0sbi5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaXplLnNsaWNlKDApfSxuLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxyPV95KHQpLGk9ZnVuY3Rpb24gbihpLG8pe3JldHVybiBVZihpKT9pLm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0LG8uY29uY2F0KGUpKX0pKToxPT09cj90KGkpOjI9PT1yP3QoaSxvKTp0KGksbyxlKX0odGhpcy5fZGF0YSxbXSk7cmV0dXJuIG5ldyBuKGksdm9pZCAwIT09dGhpcy5fZGF0YXR5cGU/cmQoaSx4cCk6dm9pZCAwKX0sbi5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXt2YXIgZT10aGlzOyFmdW5jdGlvbiBuKHIsaSl7VWYocik/ci5mb3JFYWNoKChmdW5jdGlvbih0LGUpe24odCxpLmNvbmNhdChlKSl9KSk6dChyLGksZSl9KHRoaXMuX2RhdGEsW10pfSxuLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKigpe3lpZWxkKmZ1bmN0aW9uKnQoZSxuKXtpZihVZihlKSlmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl5aWVsZCp0KGVbcl0sbi5jb25jYXQocikpO2Vsc2UgeWllbGR7dmFsdWU6ZSxpbmRleDpufX0odGhpcy5fZGF0YSxbXSl9LG4ucHJvdG90eXBlLnJvd3M9ZnVuY3Rpb24oKXt2YXIgdD1bXTtpZigyIT09dGhpcy5zaXplKCkubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlJvd3MgY2FuIG9ubHkgYmUgcmV0dXJuZWQgZm9yIGEgMkQgbWF0cml4LiIpO3ZhciBlPXRoaXMuX2RhdGE7Zm9yKHZhciByIG9mIGUpdC5wdXNoKG5ldyBuKFtyXSx0aGlzLl9kYXRhdHlwZSkpO3JldHVybiB0fSxuLnByb3RvdHlwZS5jb2x1bW5zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPVtdLHI9dGhpcy5zaXplKCk7aWYoMiE9PXIubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlJvd3MgY2FuIG9ubHkgYmUgcmV0dXJuZWQgZm9yIGEgMkQgbWF0cml4LiIpO2Zvcih2YXIgaT10aGlzLl9kYXRhLG89ZnVuY3Rpb24ocil7dmFyIG89aS5tYXAoKHQ9Plt0W3JdXSkpO2UucHVzaChuZXcgbihvLHQuX2RhdGF0eXBlKSl9LHM9MDtzPHJbMV07cysrKW8ocyk7cmV0dXJuIGV9LG4ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gd3AodGhpcy5fZGF0YSl9LG4ucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX0sbi5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKHQpe3JldHVybiBxcCh0aGlzLl9kYXRhLHQpfSxuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBxcCh0aGlzLl9kYXRhKX0sbi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21hdGhqczoiRGVuc2VNYXRyaXgiLGRhdGE6dGhpcy5fZGF0YSxzaXplOnRoaXMuX3NpemUsZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9fSxuLnByb3RvdHlwZS5kaWFnb25hbD1mdW5jdGlvbih0KXtpZih0KXtpZihSZih0KSYmKHQ9dC50b051bWJlcigpKSwhUGYodCl8fCFNcCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFyYW1ldGVyIGsgbXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlciIpfWVsc2UgdD0wO2Zvcih2YXIgZT10PjA/dDowLHI9dDwwPy10OjAsaT10aGlzLl9zaXplWzBdLG89dGhpcy5fc2l6ZVsxXSxzPU1hdGgubWluKGktcixvLWUpLGE9W10sdT0wO3U8czt1KyspYVt1XT10aGlzLl9kYXRhW3Urcl1bdStlXTtyZXR1cm4gbmV3IG4oe2RhdGE6YSxzaXplOltzXSxkYXRhdHlwZTp0aGlzLl9kYXRhdHlwZX0pfSxuLmRpYWdvbmFsPWZ1bmN0aW9uKHQsZSxyLGkpe2lmKCFVZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCwgc2l6ZSBwYXJhbWV0ZXIiKTtpZigyIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJPbmx5IHR3byBkaW1lbnNpb25zIG1hdHJpeCBhcmUgc3VwcG9ydGVkIik7aWYodD10Lm1hcCgoZnVuY3Rpb24odCl7aWYoUmYodCkmJih0PXQudG9OdW1iZXIoKSksIVBmKHQpfHwhTXAodCl8fHQ8MSl0aHJvdyBuZXcgRXJyb3IoIlNpemUgdmFsdWVzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKTtyZXR1cm4gdH0pKSxyKXtpZihSZihyKSYmKHI9ci50b051bWJlcigpKSwhUGYocil8fCFNcChyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFyYW1ldGVyIGsgbXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlciIpfWVsc2Ugcj0wO3ZhciBvLHM9cj4wP3I6MCxhPXI8MD8tcjowLHU9dFswXSxjPXRbMV0sbD1NYXRoLm1pbih1LWEsYy1zKTtpZihVZihlKSl7aWYoZS5sZW5ndGghPT1sKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCB2YWx1ZSBhcnJheSBsZW5ndGgiKTtvPWZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfX1lbHNlIGlmKHFmKGUpKXt2YXIgaD1lLnNpemUoKTtpZigxIT09aC5sZW5ndGh8fGhbMF0hPT1sKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtYXRyaXggbGVuZ3RoIik7bz1mdW5jdGlvbih0KXtyZXR1cm4gZS5nZXQoW3RdKX19ZWxzZSBvPWZ1bmN0aW9uKCl7cmV0dXJuIGV9O2l8fChpPVJmKG8oMCkpP28oMCkubXVsKDApOjApO3ZhciBmPVtdO2lmKHQubGVuZ3RoPjApe2Y9S3AoZix0LGkpO2Zvcih2YXIgcD0wO3A8bDtwKyspZltwK2FdW3Arc109byhwKX1yZXR1cm4gbmV3IG4oe2RhdGE6ZixzaXplOlt1LGNdfSl9LG4uZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQpfSxuLnByb3RvdHlwZS5zd2FwUm93cz1mdW5jdGlvbih0LGUpe2lmKCEoUGYodCkmJk1wKHQpJiZQZihlKSYmTXAoZSkpKXRocm93IG5ldyBFcnJvcigiUm93IGluZGV4IG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKTtpZigyIT09dGhpcy5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJPbmx5IHR3byBkaW1lbnNpb25hbCBtYXRyaXggaXMgc3VwcG9ydGVkIik7cmV0dXJuIFpwKHQsdGhpcy5fc2l6ZVswXSksWnAoZSx0aGlzLl9zaXplWzBdKSxuLl9zd2FwUm93cyh0LGUsdGhpcy5fZGF0YSksdGhpc30sbi5fc3dhcFJvd3M9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5bdF07blt0XT1uW2VdLG5bZV09cn0sbn0pLHtpc0NsYXNzOiEwfSk7ZnVuY3Rpb24gd3kodCxlLG4pe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5tYXA/dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB3eSh0LGUpfSkpOmUodCl9dmFyIGJ5PSJpc0ludGVnZXIiLER5PWlkKGJ5LFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBlKGJ5LHtudW1iZXI6TXAsQmlnTnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LmlzSW50KCl9LEZyYWN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5kJiZpc0Zpbml0ZSh0Lm4pfSwiQXJyYXkgfCBNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnd5KGUsdCkpKX0pfSkpLEV5PSJudW1iZXIsIG51bWJlciI7ZnVuY3Rpb24gQ3kodCxlKXtyZXR1cm4gdCtlfWZ1bmN0aW9uIFN5KHQsZSl7cmV0dXJuIHQqZX1mdW5jdGlvbiBBeSh0LGUsbil7aWYobnVsbD09bilyZXR1cm4gdC5lcShlKTtpZih0LmVxKGUpKXJldHVybiEwO2lmKHQuaXNOYU4oKXx8ZS5pc05hTigpKXJldHVybiExO2lmKHQuaXNGaW5pdGUoKSYmZS5pc0Zpbml0ZSgpKXt2YXIgcj10Lm1pbnVzKGUpLmFicygpO2lmKHIuaXNaZXJvKCkpcmV0dXJuITA7dmFyIGk9dC5jb25zdHJ1Y3Rvci5tYXgodC5hYnMoKSxlLmFicygpKTtyZXR1cm4gci5sdGUoaS50aW1lcyhuKSl9cmV0dXJuITF9Q3kuc2lnbmF0dXJlPUV5LFN5LnNpZ25hdHVyZT1FeTt2YXIgTnk9aWQoImNvbXBhcmVVbml0cyIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJueyJVbml0LCBVbml0IjplLnJlZmVyVG9TZWxmKCh0PT4obixyKT0+e2lmKCFuLmVxdWFsQmFzZShyKSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb21wYXJlIHVuaXRzIHdpdGggZGlmZmVyZW50IGJhc2UiKTtyZXR1cm4gZS5maW5kKHQsW24udmFsdWVUeXBlKCksci52YWx1ZVR5cGUoKV0pKG4udmFsdWUsci52YWx1ZSl9KSl9fSkpLEl5PSJlcXVhbFNjYWxhciIsTXk9aWQoSXksWyJ0eXBlZCIsImNvbmZpZyJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm59PXQscj1OeSh7dHlwZWQ6ZX0pO3JldHVybiBlKEl5LHsiYm9vbGVhbiwgYm9vbGVhbiI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV9LCJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4ga3AodCxlLG4uZXBzaWxvbil9LCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5lcShlKXx8QXkodCxlLG4uZXBzaWxvbil9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZXF1YWxzKGUpfSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3JldHVybiBrcCh0LnJlLGUucmUsbikmJmtwKHQuaW0sZS5pbSxuKX0odCxlLG4uZXBzaWxvbil9fSxyKX0pKTtpZChJeSxbInR5cGVkIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bn09dDtyZXR1cm4gZShJeSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiBrcCh0LGUsbi5lcHNpbG9uKX19KX0pKTt2YXIgRnk9aWQoIlNwYXJzZU1hdHJpeCIsWyJ0eXBlZCIsImVxdWFsU2NhbGFyIiwiTWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpuLE1hdHJpeDpyfT10O2Z1bmN0aW9uIGkodCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO2lmKGUmJiFqZihlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZGF0YXR5cGU6ICIrZSk7aWYocWYodCkpIWZ1bmN0aW9uKHQsZSxuKXsiU3BhcnNlTWF0cml4Ij09PWUudHlwZT8odC5fdmFsdWVzPWUuX3ZhbHVlcz93cChlLl92YWx1ZXMpOnZvaWQgMCx0Ll9pbmRleD13cChlLl9pbmRleCksdC5fcHRyPXdwKGUuX3B0ciksdC5fc2l6ZT13cChlLl9zaXplKSx0Ll9kYXRhdHlwZT1ufHxlLl9kYXRhdHlwZSk6byh0LGUudmFsdWVPZigpLG58fGUuX2RhdGF0eXBlKX0odGhpcyx0LGUpO2Vsc2UgaWYodCYmVWYodC5pbmRleCkmJlVmKHQucHRyKSYmVWYodC5zaXplKSl0aGlzLl92YWx1ZXM9dC52YWx1ZXMsdGhpcy5faW5kZXg9dC5pbmRleCx0aGlzLl9wdHI9dC5wdHIsdGhpcy5fc2l6ZT10LnNpemUsdGhpcy5fZGF0YXR5cGU9ZXx8dC5kYXRhdHlwZTtlbHNlIGlmKFVmKHQpKW8odGhpcyx0LGUpO2Vsc2V7aWYodCl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbnN1cHBvcnRlZCB0eXBlIG9mIGRhdGEgKCIreHAodCkrIikiKTt0aGlzLl92YWx1ZXM9W10sdGhpcy5faW5kZXg9W10sdGhpcy5fcHRyPVswXSx0aGlzLl9zaXplPVswLDBdLHRoaXMuX2RhdGF0eXBlPWV9fWZ1bmN0aW9uIG8odCxyLGkpe3QuX3ZhbHVlcz1bXSx0Ll9pbmRleD1bXSx0Ll9wdHI9W10sdC5fZGF0YXR5cGU9aTt2YXIgbz1yLmxlbmd0aCxzPTAsYT1uLHU9MDtpZihqZihpKSYmKGE9ZS5maW5kKG4sW2ksaV0pfHxuLHU9ZS5jb252ZXJ0KDAsaSkpLG8+MCl7dmFyIGM9MDtkb3t0Ll9wdHIucHVzaCh0Ll9pbmRleC5sZW5ndGgpO2Zvcih2YXIgbD0wO2w8bztsKyspe3ZhciBoPXJbbF07aWYoVWYoaCkpe2lmKDA9PT1jJiZzPGgubGVuZ3RoJiYocz1oLmxlbmd0aCksYzxoLmxlbmd0aCl7dmFyIGY9aFtjXTthKGYsdSl8fCh0Ll92YWx1ZXMucHVzaChmKSx0Ll9pbmRleC5wdXNoKGwpKX19ZWxzZSAwPT09YyYmczwxJiYocz0xKSxhKGgsdSl8fCh0Ll92YWx1ZXMucHVzaChoKSx0Ll9pbmRleC5wdXNoKGwpKX1jKyt9d2hpbGUoYzxzKX10Ll9wdHIucHVzaCh0Ll9pbmRleC5sZW5ndGgpLHQuX3NpemU9W28sc119ZnVuY3Rpb24gcyh0LGUsbixyKXtpZihuLWU9PTApcmV0dXJuIG47Zm9yKHZhciBpPWU7aTxuO2krKylpZihyW2ldPT09dClyZXR1cm4gaTtyZXR1cm4gZX1mdW5jdGlvbiBhKHQsZSxuLHIsaSxvLHMpe2kuc3BsaWNlKHQsMCxyKSxvLnNwbGljZSh0LDAsZSk7Zm9yKHZhciBhPW4rMTthPHMubGVuZ3RoO2ErKylzW2FdKyt9ZnVuY3Rpb24gdSh0LHIsaSxvKXt2YXIgcz1vfHwwLGE9bix1PTA7amYodC5fZGF0YXR5cGUpJiYoYT1lLmZpbmQobixbdC5fZGF0YXR5cGUsdC5fZGF0YXR5cGVdKXx8bix1PWUuY29udmVydCgwLHQuX2RhdGF0eXBlKSxzPWUuY29udmVydChzLHQuX2RhdGF0eXBlKSk7dmFyIGMsbCxoLGY9IWEocyx1KSxwPXQuX3NpemVbMF0sZD10Ll9zaXplWzFdO2lmKGk+ZCl7Zm9yKGw9ZDtsPGk7bCsrKWlmKHQuX3B0cltsXT10Ll92YWx1ZXMubGVuZ3RoLGYpZm9yKGM9MDtjPHA7YysrKXQuX3ZhbHVlcy5wdXNoKHMpLHQuX2luZGV4LnB1c2goYyk7dC5fcHRyW2ldPXQuX3ZhbHVlcy5sZW5ndGh9ZWxzZSBpPGQmJih0Ll9wdHIuc3BsaWNlKGkrMSxkLWkpLHQuX3ZhbHVlcy5zcGxpY2UodC5fcHRyW2ldLHQuX3ZhbHVlcy5sZW5ndGgpLHQuX2luZGV4LnNwbGljZSh0Ll9wdHJbaV0sdC5faW5kZXgubGVuZ3RoKSk7aWYoZD1pLHI+cCl7aWYoZil7dmFyIGc9MDtmb3IobD0wO2w8ZDtsKyspe3QuX3B0cltsXT10Ll9wdHJbbF0rZyxoPXQuX3B0cltsKzFdK2c7dmFyIHk9MDtmb3IoYz1wO2M8cjtjKysseSsrKXQuX3ZhbHVlcy5zcGxpY2UoaCt5LDAscyksdC5faW5kZXguc3BsaWNlKGgreSwwLGMpLGcrK310Ll9wdHJbZF09dC5fdmFsdWVzLmxlbmd0aH19ZWxzZSBpZihyPHApe3ZhciBtPTA7Zm9yKGw9MDtsPGQ7bCsrKXt0Ll9wdHJbbF09dC5fcHRyW2xdLW07dmFyIHY9dC5fcHRyW2xdLF89dC5fcHRyW2wrMV0tbTtmb3IoaD12O2g8XztoKyspKGM9dC5faW5kZXhbaF0pPnItMSYmKHQuX3ZhbHVlcy5zcGxpY2UoaCwxKSx0Ll9pbmRleC5zcGxpY2UoaCwxKSxtKyspfXQuX3B0cltsXT10Ll92YWx1ZXMubGVuZ3RofXJldHVybiB0Ll9zaXplWzBdPXIsdC5fc2l6ZVsxXT1pLHR9ZnVuY3Rpb24gYyh0LGUsbixyLGkpe3ZhciBvLHMsYT1yWzBdLHU9clsxXSxjPVtdO2ZvcihvPTA7bzxhO28rKylmb3IoY1tvXT1bXSxzPTA7czx1O3MrKyljW29dW3NdPTA7Zm9yKHM9MDtzPHU7cysrKWZvcih2YXIgbD1uW3NdLGg9bltzKzFdLGY9bDtmPGg7ZisrKWNbbz1lW2ZdXVtzXT10P2k/d3AodFtmXSk6dFtmXToxO3JldHVybiBjfXJldHVybiBpLnByb3RvdHlwZT1uZXcgcixpLnByb3RvdHlwZS5jcmVhdGVTcGFyc2VNYXRyaXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGkodCxlKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGksIm5hbWUiLHt2YWx1ZToiU3BhcnNlTWF0cml4In0pLGkucHJvdG90eXBlLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUudHlwZT0iU3BhcnNlTWF0cml4IixpLnByb3RvdHlwZS5pc1NwYXJzZU1hdHJpeD0hMCxpLnByb3RvdHlwZS5nZXREYXRhVHlwZT1mdW5jdGlvbigpe3JldHVybiByZCh0aGlzLl92YWx1ZXMseHApfSxpLnByb3RvdHlwZS5zdG9yYWdlPWZ1bmN0aW9uKCl7cmV0dXJuInNwYXJzZSJ9LGkucHJvdG90eXBlLmRhdGF0eXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF0eXBlfSxpLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGkodCxlKX0saS5wcm90b3R5cGUuZGVuc2l0eT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3NpemVbMF0sZT10aGlzLl9zaXplWzFdO3JldHVybiAwIT09dCYmMCE9PWU/dGhpcy5faW5kZXgubGVuZ3RoLyh0KmUpOjB9LGkucHJvdG90eXBlLnN1YnNldD1mdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuX3ZhbHVlcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc3Vic2V0IG9uIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoIVdmKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaW5kZXgiKTt2YXIgbj1lLmlzU2NhbGFyKCk7aWYobilyZXR1cm4gdC5nZXQoZS5taW4oKSk7dmFyIHI9ZS5zaXplKCk7aWYoci5sZW5ndGghPT10Ll9zaXplLmxlbmd0aCl0aHJvdyBuZXcgR3Aoci5sZW5ndGgsdC5fc2l6ZS5sZW5ndGgpO3ZhciBvLHMsYSx1LGM9ZS5taW4oKSxsPWUubWF4KCk7Zm9yKG89MCxzPXQuX3NpemUubGVuZ3RoO288cztvKyspWnAoY1tvXSx0Ll9zaXplW29dKSxacChsW29dLHQuX3NpemVbb10pO3ZhciBoPXQuX3ZhbHVlcyxmPXQuX2luZGV4LHA9dC5fcHRyLGQ9ZS5kaW1lbnNpb24oMCksZz1lLmRpbWVuc2lvbigxKSx5PVtdLG09W107ZC5mb3JFYWNoKChmdW5jdGlvbih0LGUpe21bdF09ZVswXSx5W3RdPSEwfSkpO3ZhciB2PWg/W106dm9pZCAwLF89W10seD1bXTtyZXR1cm4gZy5mb3JFYWNoKChmdW5jdGlvbih0KXtmb3IoeC5wdXNoKF8ubGVuZ3RoKSxhPXBbdF0sdT1wW3QrMV07YTx1O2ErKylvPWZbYV0sITA9PT15W29dJiYoXy5wdXNoKG1bb10pLHYmJnYucHVzaChoW2FdKSl9KSkseC5wdXNoKF8ubGVuZ3RoKSxuZXcgaSh7dmFsdWVzOnYsaW5kZXg6XyxwdHI6eCxzaXplOnIsZGF0YXR5cGU6dC5fZGF0YXR5cGV9KX0odGhpcyx0KTtjYXNlIDI6Y2FzZSAzOnJldHVybiBmdW5jdGlvbih0LGUsbixyKXtpZighZXx8ITAhPT1lLmlzSW5kZXgpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBpbmRleCIpO3ZhciBpLG89ZS5zaXplKCkscz1lLmlzU2NhbGFyKCk7aWYocWYobik/KGk9bi5zaXplKCksbj1uLnRvQXJyYXkoKSk6aT1YcChuKSxzKXtpZigwIT09aS5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiU2NhbGFyIGV4cGVjdGVkIik7dC5zZXQoZS5taW4oKSxuLHIpfWVsc2V7aWYoMSE9PW8ubGVuZ3RoJiYyIT09by5sZW5ndGgpdGhyb3cgbmV3IEdwKG8ubGVuZ3RoLHQuX3NpemUubGVuZ3RoLCI8Iik7aWYoaS5sZW5ndGg8by5sZW5ndGgpe2Zvcih2YXIgYT0wLHU9MDsxPT09b1thXSYmMT09PWlbYV07KWErKztmb3IoOzE9PT1vW2FdOyl1KyssYSsrO249ZWQobixvLmxlbmd0aCx1LGkpfWlmKCFicChvLGkpKXRocm93IG5ldyBHcChvLGksIj4iKTtpZigxPT09by5sZW5ndGgpe2UuZGltZW5zaW9uKDApLmZvckVhY2goKGZ1bmN0aW9uKGUsaSl7WnAoZSksdC5zZXQoW2UsMF0sbltpWzBdXSxyKX0pKX1lbHNle3ZhciBjPWUuZGltZW5zaW9uKDApLGw9ZS5kaW1lbnNpb24oMSk7Yy5mb3JFYWNoKChmdW5jdGlvbihlLGkpe1pwKGUpLGwuZm9yRWFjaCgoZnVuY3Rpb24obyxzKXtacChvKSx0LnNldChbZSxvXSxuW2lbMF1dW3NbMF1dLHIpfSkpfSkpfX1yZXR1cm4gdH0odGhpcyx0LGUsbik7ZGVmYXVsdDp0aHJvdyBuZXcgU3ludGF4RXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMiKX19LGkucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZighVWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aCE9PXRoaXMuX3NpemUubGVuZ3RoKXRocm93IG5ldyBHcCh0Lmxlbmd0aCx0aGlzLl9zaXplLmxlbmd0aCk7aWYoIXRoaXMuX3ZhbHVlcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgZ2V0IG9uIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO3ZhciBlPXRbMF0sbj10WzFdO1pwKGUsdGhpcy5fc2l6ZVswXSksWnAobix0aGlzLl9zaXplWzFdKTt2YXIgcj1zKGUsdGhpcy5fcHRyW25dLHRoaXMuX3B0cltuKzFdLHRoaXMuX2luZGV4KTtyZXR1cm4gcjx0aGlzLl9wdHJbbisxXSYmdGhpcy5faW5kZXhbcl09PT1lP3RoaXMuX3ZhbHVlc1tyXTowfSxpLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxyLGkpe2lmKCFVZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCIpO2lmKHQubGVuZ3RoIT09dGhpcy5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKHQubGVuZ3RoLHRoaXMuX3NpemUubGVuZ3RoKTtpZighdGhpcy5fdmFsdWVzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzZXQgb24gYSBQYXR0ZXJuIG9ubHkgbWF0cml4Iik7dmFyIG89dFswXSxjPXRbMV0sbD10aGlzLl9zaXplWzBdLGg9dGhpcy5fc2l6ZVsxXSxmPW4scD0wO2pmKHRoaXMuX2RhdGF0eXBlKSYmKGY9ZS5maW5kKG4sW3RoaXMuX2RhdGF0eXBlLHRoaXMuX2RhdGF0eXBlXSl8fG4scD1lLmNvbnZlcnQoMCx0aGlzLl9kYXRhdHlwZSkpLChvPmwtMXx8Yz5oLTEpJiYodSh0aGlzLE1hdGgubWF4KG8rMSxsKSxNYXRoLm1heChjKzEsaCksaSksbD10aGlzLl9zaXplWzBdLGg9dGhpcy5fc2l6ZVsxXSksWnAobyxsKSxacChjLGgpO3ZhciBkPXMobyx0aGlzLl9wdHJbY10sdGhpcy5fcHRyW2MrMV0sdGhpcy5faW5kZXgpO3JldHVybiBkPHRoaXMuX3B0cltjKzFdJiZ0aGlzLl9pbmRleFtkXT09PW8/ZihyLHApP2Z1bmN0aW9uKHQsZSxuLHIsaSl7bi5zcGxpY2UodCwxKSxyLnNwbGljZSh0LDEpO2Zvcih2YXIgbz1lKzE7bzxpLmxlbmd0aDtvKyspaVtvXS0tfShkLGMsdGhpcy5fdmFsdWVzLHRoaXMuX2luZGV4LHRoaXMuX3B0cik6dGhpcy5fdmFsdWVzW2RdPXI6ZihyLHApfHxhKGQsbyxjLHIsdGhpcy5fdmFsdWVzLHRoaXMuX2luZGV4LHRoaXMuX3B0ciksdGhpc30saS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKHQsZSxuKXtpZighVmYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgb3IgTWF0cml4IGV4cGVjdGVkIik7dmFyIHI9dC52YWx1ZU9mKCkubWFwKCh0PT5BcnJheS5pc0FycmF5KHQpJiYxPT09dC5sZW5ndGg/dFswXTp0KSk7aWYoMiE9PXIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSB0d28gZGltZW5zaW9ucyBtYXRyaXggYXJlIHN1cHBvcnRlZCIpO3JldHVybiByLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFQZih0KXx8IU1wKHQpfHx0PDApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBzaXplLCBtdXN0IGNvbnRhaW4gcG9zaXRpdmUgaW50ZWdlcnMgKHNpemU6ICIrcXAocikrIikiKX0pKSx1KG4/dGhpcy5jbG9uZSgpOnRoaXMsclswXSxyWzFdLGUpfSxpLnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKHQsZSl7aWYoIVVmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkIik7aWYoMiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU3BhcnNlIG1hdHJpY2VzIGNhbiBvbmx5IGJlIHJlc2hhcGVkIGluIHR3byBkaW1lbnNpb25zIik7dC5mb3JFYWNoKChmdW5jdGlvbihlKXtpZighUGYoZSl8fCFNcChlKXx8ZTw9LTJ8fDA9PT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgc2l6ZSwgbXVzdCBjb250YWluIHBvc2l0aXZlIGludGVnZXJzIG9yIC0xIChzaXplOiAiK3FwKHQpKyIpIil9KSk7dmFyIG49dGhpcy5fc2l6ZVswXSp0aGlzLl9zaXplWzFdO2lmKG4hPT0odD0kcCh0LG4pKVswXSp0WzFdKXRocm93IG5ldyBFcnJvcigiUmVzaGFwaW5nIHNwYXJzZSBtYXRyaXggd2lsbCByZXN1bHQgaW4gdGhlIHdyb25nIG51bWJlciBvZiBlbGVtZW50cyIpO3ZhciByPWU/dGhpcy5jbG9uZSgpOnRoaXM7aWYodGhpcy5fc2l6ZVswXT09PXRbMF0mJnRoaXMuX3NpemVbMV09PT10WzFdKXJldHVybiByO2Zvcih2YXIgaT1bXSxvPTA7bzxyLl9wdHIubGVuZ3RoO28rKylmb3IodmFyIHU9MDt1PHIuX3B0cltvKzFdLXIuX3B0cltvXTt1KyspaS5wdXNoKG8pO2Zvcih2YXIgYz1yLl92YWx1ZXMuc2xpY2UoKSxsPXIuX2luZGV4LnNsaWNlKCksaD0wO2g8ci5faW5kZXgubGVuZ3RoO2grKyl7dmFyIGY9bFtoXSxwPWlbaF0sZD1mKnIuX3NpemVbMV0rcDtpW2hdPWQldFsxXSxsW2hdPU1hdGguZmxvb3IoZC90WzFdKX1yLl92YWx1ZXMubGVuZ3RoPTAsci5faW5kZXgubGVuZ3RoPTAsci5fcHRyLmxlbmd0aD10WzFdKzEsci5fc2l6ZT10LnNsaWNlKCk7Zm9yKHZhciBnPTA7ZzxyLl9wdHIubGVuZ3RoO2crKylyLl9wdHJbZ109MDtmb3IodmFyIHk9MDt5PGMubGVuZ3RoO3krKyl7dmFyIG09bFt5XSx2PWlbeV0sXz1jW3ldO2EocyhtLHIuX3B0clt2XSxyLl9wdHJbdisxXSxyLl9pbmRleCksbSx2LF8sci5fdmFsdWVzLHIuX2luZGV4LHIuX3B0cil9cmV0dXJuIHJ9LGkucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpKHt2YWx1ZXM6dGhpcy5fdmFsdWVzP3dwKHRoaXMuX3ZhbHVlcyk6dm9pZCAwLGluZGV4OndwKHRoaXMuX2luZGV4KSxwdHI6d3AodGhpcy5fcHRyKSxzaXplOndwKHRoaXMuX3NpemUpLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfSl9LGkucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZS5zbGljZSgwKX0saS5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQscil7aWYoIXRoaXMuX3ZhbHVlcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgbWFwIG9uIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO3ZhciBvPXRoaXMscz10aGlzLl9zaXplWzBdLGE9dGhpcy5fc2l6ZVsxXSx1PV95KHQpO3JldHVybiBmdW5jdGlvbih0LHIsbyxzLGEsdSxjKXt2YXIgbD1bXSxoPVtdLGY9W10scD1uLGQ9MDtqZih0Ll9kYXRhdHlwZSkmJihwPWUuZmluZChuLFt0Ll9kYXRhdHlwZSx0Ll9kYXRhdHlwZV0pfHxuLGQ9ZS5jb252ZXJ0KDAsdC5fZGF0YXR5cGUpKTtmb3IodmFyIGc9ZnVuY3Rpb24odCxlLG4pe3Q9dSh0LGUsbikscCh0LGQpfHwobC5wdXNoKHQpLGgucHVzaChlKSl9LHk9czt5PD1hO3krKyl7Zi5wdXNoKGwubGVuZ3RoKTt2YXIgbT10Ll9wdHJbeV0sdj10Ll9wdHJbeSsxXTtpZihjKWZvcih2YXIgXz1tO188djtfKyspe3ZhciB4PXQuX2luZGV4W19dO3g+PXImJng8PW8mJmcodC5fdmFsdWVzW19dLHgtcix5LXMpfWVsc2V7Zm9yKHZhciB3PXt9LGI9bTtiPHY7YisrKXt3W3QuX2luZGV4W2JdXT10Ll92YWx1ZXNbYl19Zm9yKHZhciBEPXI7RDw9bztEKyspe2coRCBpbiB3P3dbRF06MCxELXIseS1zKX19fXJldHVybiBmLnB1c2gobC5sZW5ndGgpLG5ldyBpKHt2YWx1ZXM6bCxpbmRleDpoLHB0cjpmLHNpemU6W28tcisxLGEtcysxXX0pfSh0aGlzLDAscy0xLDAsYS0xLChmdW5jdGlvbihlLG4scil7cmV0dXJuIDE9PT11P3QoZSk6Mj09PXU/dChlLFtuLHJdKTp0KGUsW24scl0sbyl9KSxyKX0saS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLl92YWx1ZXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGZvckVhY2ggb24gYSBQYXR0ZXJuIG9ubHkgbWF0cml4Iik7Zm9yKHZhciBuPXRoaXMuX3NpemVbMF0scj10aGlzLl9zaXplWzFdLGk9MDtpPHI7aSsrKXt2YXIgbz10aGlzLl9wdHJbaV0scz10aGlzLl9wdHJbaSsxXTtpZihlKWZvcih2YXIgYT1vO2E8czthKyspe3ZhciB1PXRoaXMuX2luZGV4W2FdO3QodGhpcy5fdmFsdWVzW2FdLFt1LGldLHRoaXMpfWVsc2V7Zm9yKHZhciBjPXt9LGw9bztsPHM7bCsrKXtjW3RoaXMuX2luZGV4W2xdXT10aGlzLl92YWx1ZXNbbF19Zm9yKHZhciBoPTA7aDxuO2grKyl7dChoIGluIGM/Y1toXTowLFtoLGldLHRoaXMpfX19fSxpLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKigpe2lmKCF0aGlzLl92YWx1ZXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaXRlcmF0ZSBhIFBhdHRlcm4gb25seSBtYXRyaXgiKTtmb3IodmFyIHQ9dGhpcy5fc2l6ZVsxXSxlPTA7ZTx0O2UrKylmb3IodmFyIG49dGhpcy5fcHRyW2VdLHI9dGhpcy5fcHRyW2UrMV0saT1uO2k8cjtpKyspe3ZhciBvPXRoaXMuX2luZGV4W2ldO3lpZWxke3ZhbHVlOnRoaXMuX3ZhbHVlc1tpXSxpbmRleDpbbyxlXX19fSxpLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIGModGhpcy5fdmFsdWVzLHRoaXMuX2luZGV4LHRoaXMuX3B0cix0aGlzLl9zaXplLCEwKX0saS5wcm90b3R5cGUudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiBjKHRoaXMuX3ZhbHVlcyx0aGlzLl9pbmRleCx0aGlzLl9wdHIsdGhpcy5fc2l6ZSwhMSl9LGkucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fc2l6ZVswXSxuPXRoaXMuX3NpemVbMV0scj10aGlzLmRlbnNpdHkoKSxpPSJTcGFyc2UgTWF0cml4IFsiK3FwKGUsdCkrIiB4ICIrcXAobix0KSsiXSBkZW5zaXR5OiAiK3FwKHIsdCkrIlxuIixvPTA7bzxuO28rKylmb3IodmFyIHM9dGhpcy5fcHRyW29dLGE9dGhpcy5fcHRyW28rMV0sdT1zO3U8YTt1Kyspe2krPSJcbiAgICAoIitxcCh0aGlzLl9pbmRleFt1XSx0KSsiLCAiK3FwKG8sdCkrIikgPT0+ICIrKHRoaXMuX3ZhbHVlcz9xcCh0aGlzLl92YWx1ZXNbdV0sdCk6IlgiKX1yZXR1cm4gaX0saS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gcXAodGhpcy50b0FycmF5KCkpfSxpLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJTcGFyc2VNYXRyaXgiLHZhbHVlczp0aGlzLl92YWx1ZXMsaW5kZXg6dGhpcy5faW5kZXgscHRyOnRoaXMuX3B0cixzaXplOnRoaXMuX3NpemUsZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9fSxpLnByb3RvdHlwZS5kaWFnb25hbD1mdW5jdGlvbih0KXtpZih0KXtpZihSZih0KSYmKHQ9dC50b051bWJlcigpKSwhUGYodCl8fCFNcCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFyYW1ldGVyIGsgbXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlciIpfWVsc2UgdD0wO3ZhciBlPXQ+MD90OjAsbj10PDA/LXQ6MCxyPXRoaXMuX3NpemVbMF0sbz10aGlzLl9zaXplWzFdLHM9TWF0aC5taW4oci1uLG8tZSksYT1bXSx1PVtdLGM9W107Y1swXT0wO2Zvcih2YXIgbD1lO2w8byYmYS5sZW5ndGg8cztsKyspZm9yKHZhciBoPXRoaXMuX3B0cltsXSxmPXRoaXMuX3B0cltsKzFdLHA9aDtwPGY7cCsrKXt2YXIgZD10aGlzLl9pbmRleFtwXTtpZihkPT09bC1lK24pe2EucHVzaCh0aGlzLl92YWx1ZXNbcF0pLHVbYS5sZW5ndGgtMV09ZC1uO2JyZWFrfX1yZXR1cm4gYy5wdXNoKGEubGVuZ3RoKSxuZXcgaSh7dmFsdWVzOmEsaW5kZXg6dSxwdHI6YyxzaXplOltzLDFdfSl9LGkuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBpKHQpfSxpLmRpYWdvbmFsPWZ1bmN0aW9uKHQscixvLHMsYSl7aWYoIVVmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkLCBzaXplIHBhcmFtZXRlciIpO2lmKDIhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk9ubHkgdHdvIGRpbWVuc2lvbnMgbWF0cml4IGFyZSBzdXBwb3J0ZWQiKTtpZih0PXQubWFwKChmdW5jdGlvbih0KXtpZihSZih0KSYmKHQ9dC50b051bWJlcigpKSwhUGYodCl8fCFNcCh0KXx8dDwxKXRocm93IG5ldyBFcnJvcigiU2l6ZSB2YWx1ZXMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VycyIpO3JldHVybiB0fSkpLG8pe2lmKFJmKG8pJiYobz1vLnRvTnVtYmVyKCkpLCFQZihvKXx8IU1wKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXJhbWV0ZXIgayBtdXN0IGJlIGFuIGludGVnZXIgbnVtYmVyIil9ZWxzZSBvPTA7dmFyIHU9bixjPTA7amYoYSkmJih1PWUuZmluZChuLFthLGFdKXx8bixjPWUuY29udmVydCgwLGEpKTt2YXIgbCxoPW8+MD9vOjAsZj1vPDA/LW86MCxwPXRbMF0sZD10WzFdLGc9TWF0aC5taW4ocC1mLGQtaCk7aWYoVWYocikpe2lmKHIubGVuZ3RoIT09Zyl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdmFsdWUgYXJyYXkgbGVuZ3RoIik7bD1mdW5jdGlvbih0KXtyZXR1cm4gclt0XX19ZWxzZSBpZihxZihyKSl7dmFyIHk9ci5zaXplKCk7aWYoMSE9PXkubGVuZ3RofHx5WzBdIT09Zyl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbWF0cml4IGxlbmd0aCIpO2w9ZnVuY3Rpb24odCl7cmV0dXJuIHIuZ2V0KFt0XSl9fWVsc2UgbD1mdW5jdGlvbigpe3JldHVybiByfTtmb3IodmFyIG09W10sdj1bXSxfPVtdLHg9MDt4PGQ7eCsrKXtfLnB1c2gobS5sZW5ndGgpO3ZhciB3PXgtaDtpZih3Pj0wJiZ3PGcpe3ZhciBiPWwodyk7dShiLGMpfHwodi5wdXNoKHcrZiksbS5wdXNoKGIpKX19cmV0dXJuIF8ucHVzaChtLmxlbmd0aCksbmV3IGkoe3ZhbHVlczptLGluZGV4OnYscHRyOl8sc2l6ZTpbcCxkXX0pfSxpLnByb3RvdHlwZS5zd2FwUm93cz1mdW5jdGlvbih0LGUpe2lmKCEoUGYodCkmJk1wKHQpJiZQZihlKSYmTXAoZSkpKXRocm93IG5ldyBFcnJvcigiUm93IGluZGV4IG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKTtpZigyIT09dGhpcy5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJPbmx5IHR3byBkaW1lbnNpb25hbCBtYXRyaXggaXMgc3VwcG9ydGVkIik7cmV0dXJuIFpwKHQsdGhpcy5fc2l6ZVswXSksWnAoZSx0aGlzLl9zaXplWzBdKSxpLl9zd2FwUm93cyh0LGUsdGhpcy5fc2l6ZVsxXSx0aGlzLl92YWx1ZXMsdGhpcy5faW5kZXgsdGhpcy5fcHRyKSx0aGlzfSxpLl9mb3JFYWNoUm93PWZ1bmN0aW9uKHQsZSxuLHIsaSl7Zm9yKHZhciBvPXJbdF0scz1yW3QrMV0sYT1vO2E8czthKyspaShuW2FdLGVbYV0pfSxpLl9zd2FwUm93cz1mdW5jdGlvbih0LGUsbixyLGksbyl7Zm9yKHZhciBhPTA7YTxuO2ErKyl7dmFyIHU9b1thXSxjPW9bYSsxXSxsPXModCx1LGMsaSksaD1zKGUsdSxjLGkpO2lmKGw8YyYmaDxjJiZpW2xdPT09dCYmaVtoXT09PWUpe2lmKHIpe3ZhciBmPXJbbF07cltsXT1yW2hdLHJbaF09Zn19ZWxzZSBpZihsPGMmJmlbbF09PT10JiYoaD49Y3x8aVtoXSE9PWUpKXt2YXIgcD1yP3JbbF06dm9pZCAwO2kuc3BsaWNlKGgsMCxlKSxyJiZyLnNwbGljZShoLDAscCksaS5zcGxpY2UoaDw9bD9sKzE6bCwxKSxyJiZyLnNwbGljZShoPD1sP2wrMTpsLDEpfWVsc2UgaWYoaDxjJiZpW2hdPT09ZSYmKGw+PWN8fGlbbF0hPT10KSl7dmFyIGQ9cj9yW2hdOnZvaWQgMDtpLnNwbGljZShsLDAsdCksciYmci5zcGxpY2UobCwwLGQpLGkuc3BsaWNlKGw8PWg/aCsxOmgsMSksciYmci5zcGxpY2UobDw9aD9oKzE6aCwxKX19fSxpfSkse2lzQ2xhc3M6ITB9KTt2YXIgVHk9aWQoIm51bWJlciIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQsbj1lKCJudW1iZXIiLHsiIjpmdW5jdGlvbigpe3JldHVybiAwfSxudW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHN0cmluZzpmdW5jdGlvbih0KXtpZigiTmFOIj09PXQpcmV0dXJuIE5hTjt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT10Lm1hdGNoKC8oMFtib3hdKShbMC05YS1mQS1GXSopXC4oWzAtOWEtZkEtRl0qKS8pO3JldHVybiBlP3tpbnB1dDp0LHJhZGl4OnsiMGIiOjIsIjBvIjo4LCIweCI6MTZ9W2VbMV1dLGludGVnZXJQYXJ0OmVbMl0sZnJhY3Rpb25hbFBhcnQ6ZVszXX06bnVsbH0odCk7aWYoZSlyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPXBhcnNlSW50KHQuaW50ZWdlclBhcnQsdC5yYWRpeCksbj0wLHI9MDtyPHQuZnJhY3Rpb25hbFBhcnQubGVuZ3RoO3IrKyluKz1wYXJzZUludCh0LmZyYWN0aW9uYWxQYXJ0W3JdLHQucmFkaXgpL01hdGgucG93KHQucmFkaXgscisxKTt2YXIgaT1lK247aWYoaXNOYU4oaSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCdTdHJpbmcgIicrdC5pbnB1dCsnIiBpcyBubyB2YWxpZCBudW1iZXInKTtyZXR1cm4gaX0oZSk7dmFyIG49MCxyPXQubWF0Y2goLygwW2JveF1bMC05YS1mQS1GXSopaShbMC05XSopLyk7ciYmKG49TnVtYmVyKHJbMl0pLHQ9clsxXSk7dmFyIGk9TnVtYmVyKHQpO2lmKGlzTmFOKGkpKXRocm93IG5ldyBTeW50YXhFcnJvcignU3RyaW5nICInK3QrJyIgaXMgbm8gdmFsaWQgbnVtYmVyJyk7aWYocil7aWYoaT5UZigyLG4pLTEpdGhyb3cgbmV3IFN5bnRheEVycm9yKCdTdHJpbmcgIicuY29uY2F0KHQsJyIgaXMgb3V0IG9mIHJhbmdlJykpO2k+PVRmKDIsbi0xKSYmKGktPVRmKDIsbikpfXJldHVybiBpfSxCaWdOdW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9OdW1iZXIoKX0sRnJhY3Rpb246ZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWVPZigpfSxVbml0OmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnt2YXIgbj1lLmNsb25lKCk7cmV0dXJuIG4udmFsdWU9dChlLnZhbHVlKSxufSkpLG51bGw6ZnVuY3Rpb24odCl7cmV0dXJuIDB9LCJVbml0LCBzdHJpbmcgfCBVbml0IjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvTnVtYmVyKGUpfSwiQXJyYXkgfCBNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnd5KGUsdCkpKX0pO3JldHVybiBuLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUZsb2F0KHQudmFsdWUpfSxufSkpLE95PWlkKCJiaWdudW1iZXIiLFsidHlwZWQiLCJCaWdOdW1iZXIiXSwodD0+e3Zhcnt0eXBlZDplLEJpZ051bWJlcjpufT10O3JldHVybiBlKCJiaWdudW1iZXIiLHsiIjpmdW5jdGlvbigpe3JldHVybiBuZXcgbigwKX0sbnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbih0KyIiKX0sc3RyaW5nOmZ1bmN0aW9uKHQpe3ZhciBlPXQubWF0Y2goLygwW2JveF1bMC05YS1mQS1GXSopaShbMC05XSopLyk7aWYoZSl7dmFyIHI9ZVsyXSxpPW4oZVsxXSksbz1uZXcgbigyKS5wb3coTnVtYmVyKHIpKTtpZihpLmd0KG8uc3ViKDEpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N0cmluZyAiJy5jb25jYXQodCwnIiBpcyBvdXQgb2YgcmFuZ2UnKSk7dmFyIHM9bmV3IG4oMikucG93KE51bWJlcihyKS0xKTtyZXR1cm4gaS5ndGUocyk/aS5zdWIobyk6aX1yZXR1cm4gbmV3IG4odCl9LEJpZ051bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sVW5pdDplLnJlZmVyVG9TZWxmKCh0PT5lPT57dmFyIG49ZS5jbG9uZSgpO3JldHVybiBuLnZhbHVlPXQoZS52YWx1ZSksbn0pKSxGcmFjdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odC5uKS5kaXYodC5kKS50aW1lcyh0LnMpfSxudWxsOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbigwKX0sIkFycmF5IHwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT5lPT53eShlLHQpKSl9KX0pKSxMeT1pZCgiZnJhY3Rpb24iLFsidHlwZWQiLCJGcmFjdGlvbiJdLCh0PT57dmFye3R5cGVkOmUsRnJhY3Rpb246bn09dDtyZXR1cm4gZSgiZnJhY3Rpb24iLHtudW1iZXI6ZnVuY3Rpb24odCl7aWYoIWlzRmluaXRlKHQpfHxpc05hTih0KSl0aHJvdyBuZXcgRXJyb3IodCsiIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhcyBhIGZyYWN0aW9uIik7cmV0dXJuIG5ldyBuKHQpfSxzdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQpfSwibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBuKHQsZSl9LG51bGw6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKDApfSxCaWdOdW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQudG9TdHJpbmcoKSl9LEZyYWN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxVbml0OmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnt2YXIgbj1lLmNsb25lKCk7cmV0dXJuIG4udmFsdWU9dChlLnZhbHVlKSxufSkpLE9iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odCl9LCJBcnJheSB8IE1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+ZT0+d3koZSx0KSkpfSl9KSksUHk9Im1hdHJpeCIsUnk9aWQoUHksWyJ0eXBlZCIsIk1hdHJpeCIsIkRlbnNlTWF0cml4IiwiU3BhcnNlTWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxNYXRyaXg6bixEZW5zZU1hdHJpeDpyLFNwYXJzZU1hdHJpeDppfT10O3JldHVybiBlKFB5LHsiIjpmdW5jdGlvbigpe3JldHVybiBvKFtdKX0sc3RyaW5nOmZ1bmN0aW9uKHQpe3JldHVybiBvKFtdLHQpfSwic3RyaW5nLCBzdHJpbmciOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8oW10sdCxlKX0sQXJyYXk6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCl9LE1hdHJpeDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LHQuc3RvcmFnZSgpKX0sIkFycmF5IHwgTWF0cml4LCBzdHJpbmciOm8sIkFycmF5IHwgTWF0cml4LCBzdHJpbmcsIHN0cmluZyI6b30pO2Z1bmN0aW9uIG8odCxlLG4pe2lmKCJkZW5zZSI9PT1lfHwiZGVmYXVsdCI9PT1lfHx2b2lkIDA9PT1lKXJldHVybiBuZXcgcih0LG4pO2lmKCJzcGFyc2UiPT09ZSlyZXR1cm4gbmV3IGkodCxuKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIG1hdHJpeCB0eXBlICIrSlNPTi5zdHJpbmdpZnkoZSkrIi4iKX19KSksQnk9ImFkZFNjYWxhciIsa3k9aWQoQnksWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGUoQnkseyJudW1iZXIsIG51bWJlciI6Q3ksIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYWRkKGUpfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucGx1cyhlKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5hZGQoZSl9LCJVbml0LCBVbml0IjplLnJlZmVyVG9TZWxmKCh0PT4obixyKT0+e2lmKG51bGw9PT1uLnZhbHVlfHx2b2lkIDA9PT1uLnZhbHVlKXRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVyIHggY29udGFpbnMgYSB1bml0IHdpdGggdW5kZWZpbmVkIHZhbHVlIik7aWYobnVsbD09PXIudmFsdWV8fHZvaWQgMD09PXIudmFsdWUpdGhyb3cgbmV3IEVycm9yKCJQYXJhbWV0ZXIgeSBjb250YWlucyBhIHVuaXQgd2l0aCB1bmRlZmluZWQgdmFsdWUiKTtpZighbi5lcXVhbEJhc2UocikpdGhyb3cgbmV3IEVycm9yKCJVbml0cyBkbyBub3QgbWF0Y2giKTt2YXIgaT1uLmNsb25lKCk7cmV0dXJuIGkudmFsdWU9ZS5maW5kKHQsW2kudmFsdWVUeXBlKCksci52YWx1ZVR5cGUoKV0pKGkudmFsdWUsci52YWx1ZSksaS5maXhQcmVmaXg9ITEsaX0pKX0pfSkpLHp5PWlkKCJtYXRBbGdvMTF4UzBzIixbInR5cGVkIiwiZXF1YWxTY2FsYXIiXSwodD0+e3Zhcnt0eXBlZDplLGVxdWFsU2NhbGFyOm59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpLG8pe3ZhciBzPXQuX3ZhbHVlcyxhPXQuX2luZGV4LHU9dC5fcHRyLGM9dC5fc2l6ZSxsPXQuX2RhdGF0eXBlO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIG9uIFBhdHRlcm4gU3BhcnNlIE1hdHJpeCBhbmQgU2NhbGFyIHZhbHVlIik7dmFyIGgsZj1jWzBdLHA9Y1sxXSxkPW4sZz0wLHk9aTsic3RyaW5nIj09dHlwZW9mIGwmJihoPWwsZD1lLmZpbmQobixbaCxoXSksZz1lLmNvbnZlcnQoMCxoKSxyPWUuY29udmVydChyLGgpLHk9ZS5maW5kKGksW2gsaF0pKTtmb3IodmFyIG09W10sdj1bXSxfPVtdLHg9MDt4PHA7eCsrKXtfW3hdPXYubGVuZ3RoO2Zvcih2YXIgdz11W3hdLGI9dVt4KzFdLEQ9dztEPGI7RCsrKXt2YXIgRT1hW0RdLEM9bz95KHIsc1tEXSk6eShzW0RdLHIpO2QoQyxnKXx8KHYucHVzaChFKSxtLnB1c2goQykpfX1yZXR1cm4gX1twXT12Lmxlbmd0aCx0LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOm0saW5kZXg6dixwdHI6XyxzaXplOltmLHBdLGRhdGF0eXBlOmh9KX19KSksank9aWQoIm1hdEFsZ28xMnhTZnMiLFsidHlwZWQiLCJEZW5zZU1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsRGVuc2VNYXRyaXg6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGksbyl7dmFyIHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9zaXplLGw9dC5fZGF0YXR5cGU7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gb24gUGF0dGVybiBTcGFyc2UgTWF0cml4IGFuZCBTY2FsYXIgdmFsdWUiKTt2YXIgaCxmPWNbMF0scD1jWzFdLGQ9aTsic3RyaW5nIj09dHlwZW9mIGwmJihoPWwscj1lLmNvbnZlcnQocixoKSxkPWUuZmluZChpLFtoLGhdKSk7Zm9yKHZhciBnPVtdLHk9W10sbT1bXSx2PTA7djxwO3YrKyl7Zm9yKHZhciBfPXYrMSx4PXVbdl0sdz11W3YrMV0sYj14O2I8dztiKyspe3ZhciBEPWFbYl07eVtEXT1zW2JdLG1bRF09X31mb3IodmFyIEU9MDtFPGY7RSsrKTA9PT12JiYoZ1tFXT1bXSksbVtFXT09PV8/Z1tFXVt2XT1vP2Qocix5W0VdKTpkKHlbRV0scik6Z1tFXVt2XT1vP2QociwwKTpkKDAscil9cmV0dXJuIG5ldyBuKHtkYXRhOmcsc2l6ZTpbZixwXSxkYXRhdHlwZTpofSl9fSkpLFV5PWlkKCJtYXRBbGdvMTR4RHMiLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBmdW5jdGlvbih0LHIsaSxvKXt2YXIgcyxhPXQuX2RhdGEsdT10Ll9zaXplLGM9dC5fZGF0YXR5cGUsbD1pOyJzdHJpbmciPT10eXBlb2YgYyYmKHM9YyxyPWUuY29udmVydChyLHMpLGw9ZS5maW5kKGksW3Msc10pKTt2YXIgaD11Lmxlbmd0aD4wP24obCwwLHUsdVswXSxhLHIsbyk6W107cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6aCxzaXplOndwKHUpLGRhdGF0eXBlOnN9KX07ZnVuY3Rpb24gbih0LGUscixpLG8scyxhKXt2YXIgdT1bXTtpZihlPT09ci5sZW5ndGgtMSlmb3IodmFyIGM9MDtjPGk7YysrKXVbY109YT90KHMsb1tjXSk6dChvW2NdLHMpO2Vsc2UgZm9yKHZhciBsPTA7bDxpO2wrKyl1W2xdPW4odCxlKzEscixyW2UrMV0sb1tsXSxzLGEpO3JldHVybiB1fX0pKSxxeT1pZCgibWF0QWxnbzAxeERTaWQiLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBmdW5jdGlvbih0LG4scixpKXt2YXIgbz10Ll9kYXRhLHM9dC5fc2l6ZSxhPXQuX2RhdGF0eXBlLHU9bi5fdmFsdWVzLGM9bi5faW5kZXgsbD1uLl9wdHIsaD1uLl9zaXplLGY9bi5fZGF0YXR5cGU7aWYocy5sZW5ndGghPT1oLmxlbmd0aCl0aHJvdyBuZXcgR3Aocy5sZW5ndGgsaC5sZW5ndGgpO2lmKHNbMF0hPT1oWzBdfHxzWzFdIT09aFsxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIitzKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIraCsiKSIpO2lmKCF1KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIG9uIERlbnNlIE1hdHJpeCBhbmQgUGF0dGVybiBTcGFyc2UgTWF0cml4Iik7dmFyIHAsZCxnPXNbMF0seT1zWzFdLG09InN0cmluZyI9PXR5cGVvZiBhJiZhPT09Zj9hOnZvaWQgMCx2PW0/ZS5maW5kKHIsW20sbV0pOnIsXz1bXTtmb3IocD0wO3A8ZztwKyspX1twXT1bXTt2YXIgeD1bXSx3PVtdO2ZvcihkPTA7ZDx5O2QrKyl7Zm9yKHZhciBiPWQrMSxEPWxbZF0sRT1sW2QrMV0sQz1EO0M8RTtDKyspeFtwPWNbQ11dPWk/dih1W0NdLG9bcF1bZF0pOnYob1twXVtkXSx1W0NdKSx3W3BdPWI7Zm9yKHA9MDtwPGc7cCsrKXdbcF09PT1iP19bcF1bZF09eFtwXTpfW3BdW2RdPW9bcF1bZF19cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6XyxzaXplOltnLHldLGRhdGF0eXBlOm19KX19KSksVnk9aWQoIm1hdEFsZ28wNHhTaWRTaWQiLFsidHlwZWQiLCJlcXVhbFNjYWxhciJdLCh0PT57dmFye3R5cGVkOmUsZXF1YWxTY2FsYXI6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGkpe3ZhciBvPXQuX3ZhbHVlcyxzPXQuX2luZGV4LGE9dC5fcHRyLHU9dC5fc2l6ZSxjPXQuX2RhdGF0eXBlLGw9ci5fdmFsdWVzLGg9ci5faW5kZXgsZj1yLl9wdHIscD1yLl9zaXplLGQ9ci5fZGF0YXR5cGU7aWYodS5sZW5ndGghPT1wLmxlbmd0aCl0aHJvdyBuZXcgR3AodS5sZW5ndGgscC5sZW5ndGgpO2lmKHVbMF0hPT1wWzBdfHx1WzFdIT09cFsxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIit1KyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIrcCsiKSIpO3ZhciBnLHk9dVswXSxtPXVbMV0sdj1uLF89MCx4PWk7InN0cmluZyI9PXR5cGVvZiBjJiZjPT09ZCYmKGc9Yyx2PWUuZmluZChuLFtnLGddKSxfPWUuY29udmVydCgwLGcpLHg9ZS5maW5kKGksW2csZ10pKTt2YXIgdyxiLEQsRSxDLFM9byYmbD9bXTp2b2lkIDAsQT1bXSxOPVtdLEk9byYmbD9bXTp2b2lkIDAsTT1vJiZsP1tdOnZvaWQgMCxGPVtdLFQ9W107Zm9yKGI9MDtiPG07YisrKXtOW2JdPUEubGVuZ3RoO3ZhciBPPWIrMTtmb3IoRT1hW2JdLEM9YVtiKzFdLEQ9RTtEPEM7RCsrKXc9c1tEXSxBLnB1c2godyksRlt3XT1PLEkmJihJW3ddPW9bRF0pO2ZvcihFPWZbYl0sQz1mW2IrMV0sRD1FO0Q8QztEKyspaWYoRlt3PWhbRF1dPT09Tyl7aWYoSSl7dmFyIEw9eChJW3ddLGxbRF0pO3YoTCxfKT9GW3ddPW51bGw6SVt3XT1MfX1lbHNlIEEucHVzaCh3KSxUW3ddPU8sTSYmKE1bd109bFtEXSk7aWYoSSYmTSlmb3IoRD1OW2JdO0Q8QS5sZW5ndGg7KUZbdz1BW0RdXT09PU8/KFNbRF09SVt3XSxEKyspOlRbd109PT1PPyhTW0RdPU1bd10sRCsrKTpBLnNwbGljZShELDEpfXJldHVybiBOW21dPUEubGVuZ3RoLHQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6UyxpbmRleDpBLHB0cjpOLHNpemU6W3ksbV0sZGF0YXR5cGU6Z30pfX0pKSxHeT1pZCgibWF0QWxnbzEweFNpZHMiLFsidHlwZWQiLCJEZW5zZU1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsRGVuc2VNYXRyaXg6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGksbyl7dmFyIHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9zaXplLGw9dC5fZGF0YXR5cGU7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gb24gUGF0dGVybiBTcGFyc2UgTWF0cml4IGFuZCBTY2FsYXIgdmFsdWUiKTt2YXIgaCxmPWNbMF0scD1jWzFdLGQ9aTsic3RyaW5nIj09dHlwZW9mIGwmJihoPWwscj1lLmNvbnZlcnQocixoKSxkPWUuZmluZChpLFtoLGhdKSk7Zm9yKHZhciBnPVtdLHk9W10sbT1bXSx2PTA7djxwO3YrKyl7Zm9yKHZhciBfPXYrMSx4PXVbdl0sdz11W3YrMV0sYj14O2I8dztiKyspe3ZhciBEPWFbYl07eVtEXT1zW2JdLG1bRF09X31mb3IodmFyIEU9MDtFPGY7RSsrKTA9PT12JiYoZ1tFXT1bXSksbVtFXT09PV8/Z1tFXVt2XT1vP2Qocix5W0VdKTpkKHlbRV0scik6Z1tFXVt2XT1yfXJldHVybiBuZXcgbih7ZGF0YTpnLHNpemU6W2YscF0sZGF0YXR5cGU6aH0pfX0pKSxZeT1pZCgibWF0QWxnbzEzeEREIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGkpe3ZhciBvPXQuX2RhdGEscz10Ll9zaXplLGE9dC5fZGF0YXR5cGUsdT1yLl9kYXRhLGM9ci5fc2l6ZSxsPXIuX2RhdGF0eXBlLGg9W107aWYocy5sZW5ndGghPT1jLmxlbmd0aCl0aHJvdyBuZXcgR3Aocy5sZW5ndGgsYy5sZW5ndGgpO2Zvcih2YXIgZj0wO2Y8cy5sZW5ndGg7ZisrKXtpZihzW2ZdIT09Y1tmXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIitzKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIrYysiKSIpO2hbZl09c1tmXX12YXIgcCxkPWk7InN0cmluZyI9PXR5cGVvZiBhJiZhPT09bCYmKHA9YSxkPWUuZmluZChpLFtwLHBdKSk7dmFyIGc9aC5sZW5ndGg+MD9uKGQsMCxoLGhbMF0sbyx1KTpbXTtyZXR1cm4gdC5jcmVhdGVEZW5zZU1hdHJpeCh7ZGF0YTpnLHNpemU6aCxkYXRhdHlwZTpwfSl9O2Z1bmN0aW9uIG4odCxlLHIsaSxvLHMpe3ZhciBhPVtdO2lmKGU9PT1yLmxlbmd0aC0xKWZvcih2YXIgdT0wO3U8aTt1KyspYVt1XT10KG9bdV0sc1t1XSk7ZWxzZSBmb3IodmFyIGM9MDtjPGk7YysrKWFbY109bih0LGUrMSxyLHJbZSsxXSxvW2NdLHNbY10pO3JldHVybiBhfX0pKSxYeT1pZCgiYnJvYWRjYXN0IixbImNvbmNhdCJdLCh0PT57dmFye2NvbmNhdDplfT10O3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBvPU1hdGgubWF4KHQuX3NpemUubGVuZ3RoLGUuX3NpemUubGVuZ3RoKTtpZih0Ll9zaXplLmxlbmd0aD09PWUuX3NpemUubGVuZ3RoJiZ0Ll9zaXplLmV2ZXJ5KCgodCxuKT0+dD09PWUuX3NpemVbbl0pKSlyZXR1cm5bdCxlXTtmb3IodmFyIHM9bih0Ll9zaXplLG8sMCksYT1uKGUuX3NpemUsbywwKSx1PVtdLGM9MDtjPG87YysrKXVbY109TWF0aC5tYXgoc1tjXSxhW2NdKTtmb3IodmFyIGw9MDtsPG87bCsrKWkocyx1LGwpLGkoYSx1LGwpO3ZhciBoPXQuY2xvbmUoKSxmPWUuY2xvbmUoKTtoLl9zaXplLmxlbmd0aDxvP2gucmVzaGFwZShuKGguX3NpemUsbywxKSk6Zi5fc2l6ZS5sZW5ndGg8byYmZi5yZXNoYXBlKG4oZi5fc2l6ZSxvLDEpKTtmb3IodmFyIHA9MDtwPG87cCsrKWguX3NpemVbcF08dVtwXSYmKGg9cihoLHVbcF0scCkpLGYuX3NpemVbcF08dVtwXSYmKGY9cihmLHVbcF0scCkpO3JldHVybltoLGZdfTtmdW5jdGlvbiBuKHQsZSxuKXtyZXR1cm5bLi4uQXJyYXkoZS10Lmxlbmd0aCkuZmlsbChuKSwuLi50XX1mdW5jdGlvbiByKHQsbixyKXtyZXR1cm4gZSguLi5BcnJheShuKS5maWxsKHQpLHIpfWZ1bmN0aW9uIGkodCxlLG4pe2lmKHRbbl08ZVtuXSZ0W25dPjEpdGhyb3cgbmV3IEVycm9yKCJzaGFwZSBtaXNzbWF0Y2g6IG1pc3NtYXRjaCBpcyBmb3VuZCBpbiBhcmcgd2l0aCBzaGFwZSAoIi5jb25jYXQodCwiKSBub3QgcG9zc2libGUgdG8gYnJvYWRjYXN0IGRpbWVuc2lvbiAiKS5jb25jYXQobiwiIHdpdGggc2l6ZSAiKS5jb25jYXQodFtuXSwiIHRvIHNpemUgIikuY29uY2F0KGVbbl0pKX19KSksV3k9aWQoIm1hdHJpeEFsZ29yaXRobVN1aXRlIixbInR5cGVkIiwibWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixjb25jYXQ6cn09dCxpPVl5KHt0eXBlZDplfSksbz1VeSh7dHlwZWQ6ZX0pLHM9WHkoe2NvbmNhdDpyfSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByLGE9dC5lbG9wLHU9dC5TRHx8dC5EUzthPyhyPXsiRGVuc2VNYXRyaXgsIERlbnNlTWF0cml4IjoodCxlKT0+aSguLi5zKHQsZSksYSksIkFycmF5LCBBcnJheSI6KHQsZSk9PmkoLi4ucyhuKHQpLG4oZSkpLGEpLnZhbHVlT2YoKSwiQXJyYXksIERlbnNlTWF0cml4IjoodCxlKT0+aSguLi5zKG4odCksZSksYSksIkRlbnNlTWF0cml4LCBBcnJheSI6KHQsZSk9PmkoLi4ucyh0LG4oZSkpLGEpfSx0LlNTJiYoclsiU3BhcnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiXT0oZSxuKT0+dC5TUyguLi5zKGUsbiksYSwhMSkpLHQuRFMmJihyWyJEZW5zZU1hdHJpeCwgU3BhcnNlTWF0cml4Il09KGUsbik9PnQuRFMoLi4ucyhlLG4pLGEsITEpLHJbIkFycmF5LCBTcGFyc2VNYXRyaXgiXT0oZSxyKT0+dC5EUyguLi5zKG4oZSksciksYSwhMSkpLHUmJihyWyJTcGFyc2VNYXRyaXgsIERlbnNlTWF0cml4Il09KHQsZSk9PnUoLi4ucyhlLHQpLGEsITApLHJbIlNwYXJzZU1hdHJpeCwgQXJyYXkiXT0odCxlKT0+dSguLi5zKG4oZSksdCksYSwhMCkpKToocj17IkRlbnNlTWF0cml4LCBEZW5zZU1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+KGUsbik9PmkoLi4ucyhlLG4pLHQpKSksIkFycmF5LCBBcnJheSI6ZS5yZWZlclRvU2VsZigodD0+KGUscik9PmkoLi4ucyhuKGUpLG4ocikpLHQpLnZhbHVlT2YoKSkpLCJBcnJheSwgRGVuc2VNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT5pKC4uLnMobihlKSxyKSx0KSkpLCJEZW5zZU1hdHJpeCwgQXJyYXkiOmUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT5pKC4uLnMoZSxuKHIpKSx0KSkpfSx0LlNTJiYoclsiU3BhcnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiXT1lLnJlZmVyVG9TZWxmKChlPT4obixyKT0+dC5TUyguLi5zKG4sciksZSwhMSkpKSksdC5EUyYmKHJbIkRlbnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiXT1lLnJlZmVyVG9TZWxmKChlPT4obixyKT0+dC5EUyguLi5zKG4sciksZSwhMSkpKSxyWyJBcnJheSwgU3BhcnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigoZT0+KHIsaSk9PnQuRFMoLi4ucyhuKHIpLGkpLGUsITEpKSkpLHUmJihyWyJTcGFyc2VNYXRyaXgsIERlbnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigodD0+KGUsbik9PnUoLi4ucyhuLGUpLHQsITApKSksclsiU3BhcnNlTWF0cml4LCBBcnJheSJdPWUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT51KC4uLnMobihyKSxlKSx0LCEwKSkpKSk7dmFyIGM9dC5zY2FsYXJ8fCJhbnkiOyh0LkRzfHx0LlNzKSYmKGE/KHJbIkRlbnNlTWF0cml4LCIrY109KHQsZSk9Pm8odCxlLGEsITEpLHJbYysiLCBEZW5zZU1hdHJpeCJdPSh0LGUpPT5vKGUsdCxhLCEwKSxyWyJBcnJheSwiK2NdPSh0LGUpPT5vKG4odCksZSxhLCExKS52YWx1ZU9mKCkscltjKyIsIEFycmF5Il09KHQsZSk9Pm8obihlKSx0LGEsITApLnZhbHVlT2YoKSk6KHJbIkRlbnNlTWF0cml4LCIrY109ZS5yZWZlclRvU2VsZigodD0+KGUsbik9Pm8oZSxuLHQsITEpKSkscltjKyIsIERlbnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigodD0+KGUsbik9Pm8obixlLHQsITApKSksclsiQXJyYXksIitjXT1lLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+byhuKGUpLHIsdCwhMSkudmFsdWVPZigpKSkscltjKyIsIEFycmF5Il09ZS5yZWZlclRvU2VsZigodD0+KGUscik9Pm8obihyKSxlLHQsITApLnZhbHVlT2YoKSkpKSk7dmFyIGw9dm9pZCAwIT09dC5zUz90LnNTOnQuU3M7cmV0dXJuIGE/KHQuU3MmJihyWyJTcGFyc2VNYXRyaXgsIitjXT0oZSxuKT0+dC5TcyhlLG4sYSwhMSkpLGwmJihyW2MrIiwgU3BhcnNlTWF0cml4Il09KHQsZSk9PmwoZSx0LGEsITApKSk6KHQuU3MmJihyWyJTcGFyc2VNYXRyaXgsIitjXT1lLnJlZmVyVG9TZWxmKChlPT4obixyKT0+dC5TcyhuLHIsZSwhMSkpKSksbCYmKHJbYysiLCBTcGFyc2VNYXRyaXgiXT1lLnJlZmVyVG9TZWxmKCh0PT4oZSxuKT0+bChuLGUsdCwhMCkpKSkpLGEmJmEuc2lnbmF0dXJlcyYmZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSlEcChlLG4pJiYodFtuXT1lW25dKX0ocixhLnNpZ25hdHVyZXMpLHJ9fSkpLEh5PWlkKCJtYXRBbGdvMDJ4RFMwIixbInR5cGVkIiwiZXF1YWxTY2FsYXIiXSwodD0+e3Zhcnt0eXBlZDplLGVxdWFsU2NhbGFyOm59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpLG8pe3ZhciBzPXQuX2RhdGEsYT10Ll9zaXplLHU9dC5fZGF0YXR5cGUsYz1yLl92YWx1ZXMsbD1yLl9pbmRleCxoPXIuX3B0cixmPXIuX3NpemUscD1yLl9kYXRhdHlwZTtpZihhLmxlbmd0aCE9PWYubGVuZ3RoKXRocm93IG5ldyBHcChhLmxlbmd0aCxmLmxlbmd0aCk7aWYoYVswXSE9PWZbMF18fGFbMV0hPT1mWzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2guIE1hdHJpeCBBICgiK2ErIikgbXVzdCBtYXRjaCBNYXRyaXggQiAoIitmKyIpIik7aWYoIWMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gb24gRGVuc2UgTWF0cml4IGFuZCBQYXR0ZXJuIFNwYXJzZSBNYXRyaXgiKTt2YXIgZCxnPWFbMF0seT1hWzFdLG09bix2PTAsXz1pOyJzdHJpbmciPT10eXBlb2YgdSYmdT09PXAmJihkPXUsbT1lLmZpbmQobixbZCxkXSksdj1lLmNvbnZlcnQoMCxkKSxfPWUuZmluZChpLFtkLGRdKSk7Zm9yKHZhciB4PVtdLHc9W10sYj1bXSxEPTA7RDx5O0QrKyl7YltEXT13Lmxlbmd0aDtmb3IodmFyIEU9aFtEXSxDPWhbRCsxXSxTPUU7UzxDO1MrKyl7dmFyIEE9bFtTXSxOPW8/XyhjW1NdLHNbQV1bRF0pOl8oc1tBXVtEXSxjW1NdKTttKE4sdil8fCh3LnB1c2goQSkseC5wdXNoKE4pKX19cmV0dXJuIGJbeV09dy5sZW5ndGgsci5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczp4LGluZGV4OncscHRyOmIsc2l6ZTpbZyx5XSxkYXRhdHlwZTpkfSl9fSkpLFp5PWlkKCJtYXRBbGdvMDN4RFNmIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZnVuY3Rpb24odCxuLHIsaSl7dmFyIG89dC5fZGF0YSxzPXQuX3NpemUsYT10Ll9kYXRhdHlwZSx1PW4uX3ZhbHVlcyxjPW4uX2luZGV4LGw9bi5fcHRyLGg9bi5fc2l6ZSxmPW4uX2RhdGF0eXBlO2lmKHMubGVuZ3RoIT09aC5sZW5ndGgpdGhyb3cgbmV3IEdwKHMubGVuZ3RoLGgubGVuZ3RoKTtpZihzWzBdIT09aFswXXx8c1sxXSE9PWhbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrcysiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK2grIikiKTtpZighdSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBvbiBEZW5zZSBNYXRyaXggYW5kIFBhdHRlcm4gU3BhcnNlIE1hdHJpeCIpO3ZhciBwLGQ9c1swXSxnPXNbMV0seT0wLG09cjsic3RyaW5nIj09dHlwZW9mIGEmJmE9PT1mJiYocD1hLHk9ZS5jb252ZXJ0KDAscCksbT1lLmZpbmQocixbcCxwXSkpO2Zvcih2YXIgdj1bXSxfPTA7XzxkO18rKyl2W19dPVtdO2Zvcih2YXIgeD1bXSx3PVtdLGI9MDtiPGc7YisrKXtmb3IodmFyIEQ9YisxLEU9bFtiXSxDPWxbYisxXSxTPUU7UzxDO1MrKyl7dmFyIEE9Y1tTXTt4W0FdPWk/bSh1W1NdLG9bQV1bYl0pOm0ob1tBXVtiXSx1W1NdKSx3W0FdPUR9Zm9yKHZhciBOPTA7TjxkO04rKyl3W05dPT09RD92W05dW2JdPXhbTl06dltOXVtiXT1pP20oeSxvW05dW2JdKTptKG9bTl1bYl0seSl9cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6dixzaXplOltkLGddLGRhdGF0eXBlOnB9KX19KSksS3k9aWQoIm11bHRpcGx5U2NhbGFyIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZSgibXVsdGlwbHlTY2FsYXIiLHsibnVtYmVyLCBudW1iZXIiOlN5LCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lm11bChlKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRpbWVzKGUpfSwiRnJhY3Rpb24sIEZyYWN0aW9uIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lm11bChlKX0sIm51bWJlciB8IEZyYWN0aW9uIHwgQmlnTnVtYmVyIHwgQ29tcGxleCwgVW5pdCI6KHQsZSk9PmUubXVsdGlwbHkodCksIlVuaXQsIG51bWJlciB8IEZyYWN0aW9uIHwgQmlnTnVtYmVyIHwgQ29tcGxleCB8IFVuaXQiOih0LGUpPT50Lm11bHRpcGx5KGUpfSl9KSksSnk9Im11bHRpcGx5IixReT1pZChKeSxbInR5cGVkIiwibWF0cml4IiwiYWRkU2NhbGFyIiwibXVsdGlwbHlTY2FsYXIiLCJlcXVhbFNjYWxhciIsImRvdCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4sYWRkU2NhbGFyOnIsbXVsdGlwbHlTY2FsYXI6aSxlcXVhbFNjYWxhcjpvLGRvdDpzfT10LGE9enkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6b30pLHU9VXkoe3R5cGVkOmV9KTtmdW5jdGlvbiBjKHQsZSl7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDE6aWYodFswXSE9PWVbMF0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaCBpbiBtdWx0aXBsaWNhdGlvbi4gVmVjdG9ycyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIik7YnJlYWs7Y2FzZSAyOmlmKHRbMF0hPT1lWzBdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2ggaW4gbXVsdGlwbGljYXRpb24uIFZlY3RvciBsZW5ndGggKCIrdFswXSsiKSBtdXN0IG1hdGNoIE1hdHJpeCByb3dzICgiK2VbMF0rIikiKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiQ2FuIG9ubHkgbXVsdGlwbHkgYSAxIG9yIDIgZGltZW5zaW9uYWwgbWF0cml4IChNYXRyaXggQiBoYXMgIitlLmxlbmd0aCsiIGRpbWVuc2lvbnMpIil9YnJlYWs7Y2FzZSAyOnN3aXRjaChlLmxlbmd0aCl7Y2FzZSAxOmlmKHRbMV0hPT1lWzBdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2ggaW4gbXVsdGlwbGljYXRpb24uIE1hdHJpeCBjb2x1bW5zICgiK3RbMV0rIikgbXVzdCBtYXRjaCBWZWN0b3IgbGVuZ3RoICgiK2VbMF0rIikiKTticmVhaztjYXNlIDI6aWYodFsxXSE9PWVbMF0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaCBpbiBtdWx0aXBsaWNhdGlvbi4gTWF0cml4IEEgY29sdW1ucyAoIit0WzFdKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgcm93cyAoIitlWzBdKyIpIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkNhbiBvbmx5IG11bHRpcGx5IGEgMSBvciAyIGRpbWVuc2lvbmFsIG1hdHJpeCAoTWF0cml4IEIgaGFzICIrZS5sZW5ndGgrIiBkaW1lbnNpb25zKSIpfWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJDYW4gb25seSBtdWx0aXBseSBhIDEgb3IgMiBkaW1lbnNpb25hbCBtYXRyaXggKE1hdHJpeCBBIGhhcyAiK3QubGVuZ3RoKyIgZGltZW5zaW9ucykiKX19ZnVuY3Rpb24gbCh0LG4pe2lmKCJkZW5zZSIhPT1uLnN0b3JhZ2UoKSl0aHJvdyBuZXcgRXJyb3IoIlN1cHBvcnQgZm9yIFNwYXJzZU1hdHJpeCBub3QgaW1wbGVtZW50ZWQiKTtyZXR1cm4gZnVuY3Rpb24odCxuKXt2YXIgbyxzPXQuX2RhdGEsYT10Ll9zaXplLHU9dC5fZGF0YXR5cGUsYz1uLl9kYXRhLGw9bi5fc2l6ZSxoPW4uX2RhdGF0eXBlLGY9YVswXSxwPWxbMV0sZD1yLGc9aTt1JiZoJiZ1PT09aCYmInN0cmluZyI9PXR5cGVvZiB1JiYobz11LGQ9ZS5maW5kKHIsW28sb10pLGc9ZS5maW5kKGksW28sb10pKTtmb3IodmFyIHk9W10sbT0wO208cDttKyspe2Zvcih2YXIgdj1nKHNbMF0sY1swXVttXSksXz0xO188ZjtfKyspdj1kKHYsZyhzW19dLGNbX11bbV0pKTt5W21dPXZ9cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6eSxzaXplOltwXSxkYXRhdHlwZTpvfSl9KHQsbil9dmFyIGg9ZSgiX211bHRpcGx5TWF0cml4VmVjdG9yIix7IkRlbnNlTWF0cml4LCBhbnkiOmZ1bmN0aW9uKHQsbil7dmFyIG8scz10Ll9kYXRhLGE9dC5fc2l6ZSx1PXQuX2RhdGF0eXBlLGM9bi5fZGF0YSxsPW4uX2RhdGF0eXBlLGg9YVswXSxmPWFbMV0scD1yLGQ9aTt1JiZsJiZ1PT09bCYmInN0cmluZyI9PXR5cGVvZiB1JiYobz11LHA9ZS5maW5kKHIsW28sb10pLGQ9ZS5maW5kKGksW28sb10pKTtmb3IodmFyIGc9W10seT0wO3k8aDt5Kyspe2Zvcih2YXIgbT1zW3ldLHY9ZChtWzBdLGNbMF0pLF89MTtfPGY7XysrKXY9cCh2LGQobVtfXSxjW19dKSk7Z1t5XT12fXJldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOmcsc2l6ZTpbaF0sZGF0YXR5cGU6b30pfSwiU3BhcnNlTWF0cml4LCBhbnkiOmZ1bmN0aW9uKHQsbil7dmFyIHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9kYXRhdHlwZTtpZighcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBtdWx0aXBseSBQYXR0ZXJuIG9ubHkgTWF0cml4IHRpbWVzIERlbnNlIE1hdHJpeCIpO3ZhciBsLGg9bi5fZGF0YSxmPW4uX2RhdGF0eXBlLHA9dC5fc2l6ZVswXSxkPW4uX3NpemVbMF0sZz1bXSx5PVtdLG09W10sdj1yLF89aSx4PW8sdz0wO2MmJmYmJmM9PT1mJiYic3RyaW5nIj09dHlwZW9mIGMmJihsPWMsdj1lLmZpbmQocixbbCxsXSksXz1lLmZpbmQoaSxbbCxsXSkseD1lLmZpbmQobyxbbCxsXSksdz1lLmNvbnZlcnQoMCxsKSk7dmFyIGI9W10sRD1bXTttWzBdPTA7Zm9yKHZhciBFPTA7RTxkO0UrKyl7dmFyIEM9aFtFXTtpZigheChDLHcpKWZvcih2YXIgUz11W0VdLEE9dVtFKzFdLE49UztOPEE7TisrKXt2YXIgST1hW05dO0RbSV0/YltJXT12KGJbSV0sXyhDLHNbTl0pKTooRFtJXT0hMCx5LnB1c2goSSksYltJXT1fKEMsc1tOXSkpfX1mb3IodmFyIE09eS5sZW5ndGgsRj0wO0Y8TTtGKyspe3ZhciBUPXlbRl07Z1tGXT1iW1RdfXJldHVybiBtWzFdPXkubGVuZ3RoLHQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6ZyxpbmRleDp5LHB0cjptLHNpemU6W3AsMV0sZGF0YXR5cGU6bH0pfX0pLGY9ZSgiX211bHRpcGx5TWF0cml4TWF0cml4Iix7IkRlbnNlTWF0cml4LCBEZW5zZU1hdHJpeCI6ZnVuY3Rpb24odCxuKXt2YXIgbyxzPXQuX2RhdGEsYT10Ll9zaXplLHU9dC5fZGF0YXR5cGUsYz1uLl9kYXRhLGw9bi5fc2l6ZSxoPW4uX2RhdGF0eXBlLGY9YVswXSxwPWFbMV0sZD1sWzFdLGc9cix5PWk7dSYmaCYmdT09PWgmJiJzdHJpbmciPT10eXBlb2YgdSYmKG89dSxnPWUuZmluZChyLFtvLG9dKSx5PWUuZmluZChpLFtvLG9dKSk7Zm9yKHZhciBtPVtdLHY9MDt2PGY7disrKXt2YXIgXz1zW3ZdO21bdl09W107Zm9yKHZhciB4PTA7eDxkO3grKyl7Zm9yKHZhciB3PXkoX1swXSxjWzBdW3hdKSxiPTE7YjxwO2IrKyl3PWcodyx5KF9bYl0sY1tiXVt4XSkpO21bdl1beF09d319cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6bSxzaXplOltmLGRdLGRhdGF0eXBlOm99KX0sIkRlbnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiOmZ1bmN0aW9uKHQsbil7dmFyIHM9dC5fZGF0YSxhPXQuX3NpemUsdT10Ll9kYXRhdHlwZSxjPW4uX3ZhbHVlcyxsPW4uX2luZGV4LGg9bi5fcHRyLGY9bi5fc2l6ZSxwPW4uX2RhdGF0eXBlO2lmKCFjKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG11bHRpcGx5IERlbnNlIE1hdHJpeCB0aW1lcyBQYXR0ZXJuIG9ubHkgTWF0cml4Iik7dmFyIGQsZz1hWzBdLHk9ZlsxXSxtPXIsdj1pLF89byx4PTA7dSYmcCYmdT09PXAmJiJzdHJpbmciPT10eXBlb2YgdSYmKGQ9dSxtPWUuZmluZChyLFtkLGRdKSx2PWUuZmluZChpLFtkLGRdKSxfPWUuZmluZChvLFtkLGRdKSx4PWUuY29udmVydCgwLGQpKTtmb3IodmFyIHc9W10sYj1bXSxEPVtdLEU9bi5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczp3LGluZGV4OmIscHRyOkQsc2l6ZTpbZyx5XSxkYXRhdHlwZTpkfSksQz0wO0M8eTtDKyspe0RbQ109Yi5sZW5ndGg7dmFyIFM9aFtDXSxBPWhbQysxXTtpZihBPlMpZm9yKHZhciBOPTAsST0wO0k8ZztJKyspe2Zvcih2YXIgTT1JKzEsRj12b2lkIDAsVD1TO1Q8QTtUKyspe3ZhciBPPWxbVF07TiE9PU0/KEY9dihzW0ldW09dLGNbVF0pLE49TSk6Rj1tKEYsdihzW0ldW09dLGNbVF0pKX1OPT09TSYmIV8oRix4KSYmKGIucHVzaChJKSx3LnB1c2goRikpfX1yZXR1cm4gRFt5XT1iLmxlbmd0aCxFfSwiU3BhcnNlTWF0cml4LCBEZW5zZU1hdHJpeCI6ZnVuY3Rpb24odCxuKXt2YXIgcz10Ll92YWx1ZXMsYT10Ll9pbmRleCx1PXQuX3B0cixjPXQuX2RhdGF0eXBlO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG11bHRpcGx5IFBhdHRlcm4gb25seSBNYXRyaXggdGltZXMgRGVuc2UgTWF0cml4Iik7dmFyIGwsaD1uLl9kYXRhLGY9bi5fZGF0YXR5cGUscD10Ll9zaXplWzBdLGQ9bi5fc2l6ZVswXSxnPW4uX3NpemVbMV0seT1yLG09aSx2PW8sXz0wO2MmJmYmJmM9PT1mJiYic3RyaW5nIj09dHlwZW9mIGMmJihsPWMseT1lLmZpbmQocixbbCxsXSksbT1lLmZpbmQoaSxbbCxsXSksdj1lLmZpbmQobyxbbCxsXSksXz1lLmNvbnZlcnQoMCxsKSk7Zm9yKHZhciB4PVtdLHc9W10sYj1bXSxEPXQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6eCxpbmRleDp3LHB0cjpiLHNpemU6W3AsZ10sZGF0YXR5cGU6bH0pLEU9W10sQz1bXSxTPTA7UzxnO1MrKyl7YltTXT13Lmxlbmd0aDtmb3IodmFyIEE9UysxLE49MDtOPGQ7TisrKXt2YXIgST1oW05dW1NdO2lmKCF2KEksXykpZm9yKHZhciBNPXVbTl0sRj11W04rMV0sVD1NO1Q8RjtUKyspe3ZhciBPPWFbVF07Q1tPXSE9PUE/KENbT109QSx3LnB1c2goTyksRVtPXT1tKEksc1tUXSkpOkVbT109eShFW09dLG0oSSxzW1RdKSl9fWZvcih2YXIgTD1iW1NdLFA9dy5sZW5ndGgsUj1MO1I8UDtSKyspe3ZhciBCPXdbUl07eFtSXT1FW0JdfX1yZXR1cm4gYltnXT13Lmxlbmd0aCxEfSwiU3BhcnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiOmZ1bmN0aW9uKHQsbil7dmFyIG8scz10Ll92YWx1ZXMsYT10Ll9pbmRleCx1PXQuX3B0cixjPXQuX2RhdGF0eXBlLGw9bi5fdmFsdWVzLGg9bi5faW5kZXgsZj1uLl9wdHIscD1uLl9kYXRhdHlwZSxkPXQuX3NpemVbMF0sZz1uLl9zaXplWzFdLHk9cyYmbCxtPXIsdj1pO2MmJnAmJmM9PT1wJiYic3RyaW5nIj09dHlwZW9mIGMmJihvPWMsbT1lLmZpbmQocixbbyxvXSksdj1lLmZpbmQoaSxbbyxvXSkpO2Zvcih2YXIgXyx4LHcsYixELEUsQyxTLEE9eT9bXTp2b2lkIDAsTj1bXSxJPVtdLE09dC5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczpBLGluZGV4Ok4scHRyOkksc2l6ZTpbZCxnXSxkYXRhdHlwZTpvfSksRj15P1tdOnZvaWQgMCxUPVtdLE89MDtPPGc7TysrKXtJW09dPU4ubGVuZ3RoO3ZhciBMPU8rMTtmb3IoRD1mW09dLEU9ZltPKzFdLGI9RDtiPEU7YisrKWlmKFM9aFtiXSx5KWZvcih4PXVbU10sdz11W1MrMV0sXz14O188dztfKyspVFtDPWFbX11dIT09TD8oVFtDXT1MLE4ucHVzaChDKSxGW0NdPXYobFtiXSxzW19dKSk6RltDXT1tKEZbQ10sdihsW2JdLHNbX10pKTtlbHNlIGZvcih4PXVbU10sdz11W1MrMV0sXz14O188dztfKyspVFtDPWFbX11dIT09TCYmKFRbQ109TCxOLnB1c2goQykpO2lmKHkpZm9yKHZhciBQPUlbT10sUj1OLmxlbmd0aCxCPVA7QjxSO0IrKyl7dmFyIGs9TltCXTtBW0JdPUZba119fXJldHVybiBJW2ddPU4ubGVuZ3RoLE19fSk7cmV0dXJuIGUoSnksaSx7IkFycmF5LCBBcnJheSI6ZS5yZWZlclRvKCJNYXRyaXgsIE1hdHJpeCIsKHQ9PihlLHIpPT57YyhYcChlKSxYcChyKSk7dmFyIGk9dChuKGUpLG4ocikpO3JldHVybiBxZihpKT9pLnZhbHVlT2YoKTppfSkpLCJNYXRyaXgsIE1hdHJpeCI6ZnVuY3Rpb24odCxlKXt2YXIgbj10LnNpemUoKSxyPWUuc2l6ZSgpO3JldHVybiBjKG4sciksMT09PW4ubGVuZ3RoPzE9PT1yLmxlbmd0aD9mdW5jdGlvbih0LGUsbil7aWYoMD09PW4pdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgbXVsdGlwbHkgdHdvIGVtcHR5IHZlY3RvcnMiKTtyZXR1cm4gcyh0LGUpfSh0LGUsblswXSk6bCh0LGUpOjE9PT1yLmxlbmd0aD9oKHQsZSk6Zih0LGUpfSwiTWF0cml4LCBBcnJheSI6ZS5yZWZlclRvKCJNYXRyaXgsTWF0cml4IiwodD0+KGUscik9PnQoZSxuKHIpKSkpLCJBcnJheSwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+dChuKGUsci5zdG9yYWdlKCkpLHIpKSksIlNwYXJzZU1hdHJpeCwgYW55IjpmdW5jdGlvbih0LGUpe3JldHVybiBhKHQsZSxpLCExKX0sIkRlbnNlTWF0cml4LCBhbnkiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUodCxlLGksITEpfSwiYW55LCBTcGFyc2VNYXRyaXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGEoZSx0LGksITApfSwiYW55LCBEZW5zZU1hdHJpeCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdShlLHQsaSwhMCl9LCJBcnJheSwgYW55IjpmdW5jdGlvbih0LGUpe3JldHVybiB1KG4odCksZSxpLCExKS52YWx1ZU9mKCl9LCJhbnksIEFycmF5IjpmdW5jdGlvbih0LGUpe3JldHVybiB1KG4oZSksdCxpLCEwKS52YWx1ZU9mKCl9LCJhbnksIGFueSI6aSwiYW55LCBhbnksIC4uLmFueSI6ZS5yZWZlclRvU2VsZigodD0+KGUsbixyKT0+e2Zvcih2YXIgaT10KGUsbiksbz0wO288ci5sZW5ndGg7bysrKWk9dChpLHJbb10pO3JldHVybiBpfSkpfSl9KSksJHk9aWQoIm1hdEFsZ28wOXhTMFNmIixbInR5cGVkIiwiZXF1YWxTY2FsYXIiXSwodD0+e3Zhcnt0eXBlZDplLGVxdWFsU2NhbGFyOm59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpKXt2YXIgbz10Ll92YWx1ZXMscz10Ll9pbmRleCxhPXQuX3B0cix1PXQuX3NpemUsYz10Ll9kYXRhdHlwZSxsPXIuX3ZhbHVlcyxoPXIuX2luZGV4LGY9ci5fcHRyLHA9ci5fc2l6ZSxkPXIuX2RhdGF0eXBlO2lmKHUubGVuZ3RoIT09cC5sZW5ndGgpdGhyb3cgbmV3IEdwKHUubGVuZ3RoLHAubGVuZ3RoKTtpZih1WzBdIT09cFswXXx8dVsxXSE9PXBbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrdSsiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK3ArIikiKTt2YXIgZyx5PXVbMF0sbT11WzFdLHY9bixfPTAseD1pOyJzdHJpbmciPT10eXBlb2YgYyYmYz09PWQmJihnPWMsdj1lLmZpbmQobixbZyxnXSksXz1lLmNvbnZlcnQoMCxnKSx4PWUuZmluZChpLFtnLGddKSk7dmFyIHcsYixELEUsQyxTPW8mJmw/W106dm9pZCAwLEE9W10sTj1bXSxJPVM/W106dm9pZCAwLE09W107Zm9yKGI9MDtiPG07YisrKXtOW2JdPUEubGVuZ3RoO3ZhciBGPWIrMTtpZihJKWZvcihFPWZbYl0sQz1mW2IrMV0sRD1FO0Q8QztEKyspTVt3PWhbRF1dPUYsSVt3XT1sW0RdO2ZvcihFPWFbYl0sQz1hW2IrMV0sRD1FO0Q8QztEKyspaWYodz1zW0RdLEkpe3ZhciBUPU1bd109PT1GP0lbd106XyxPPXgob1tEXSxUKTt2KE8sXyl8fChBLnB1c2godyksUy5wdXNoKE8pKX1lbHNlIEEucHVzaCh3KX1yZXR1cm4gTlttXT1BLmxlbmd0aCx0LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOlMsaW5kZXg6QSxwdHI6TixzaXplOlt5LG1dLGRhdGF0eXBlOmd9KX19KSksdG09aWQoIm1hdEFsZ28wN3hTU2YiLFsidHlwZWQiLCJEZW5zZU1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsRGVuc2VNYXRyaXg6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxpLG8pe3ZhciBzPXQuX3NpemUsYT10Ll9kYXRhdHlwZSx1PWkuX3NpemUsYz1pLl9kYXRhdHlwZTtpZihzLmxlbmd0aCE9PXUubGVuZ3RoKXRocm93IG5ldyBHcChzLmxlbmd0aCx1Lmxlbmd0aCk7aWYoc1swXSE9PXVbMF18fHNbMV0hPT11WzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2guIE1hdHJpeCBBICgiK3MrIikgbXVzdCBtYXRjaCBNYXRyaXggQiAoIit1KyIpIik7dmFyIGwsaD1zWzBdLGY9c1sxXSxwPTAsZD1vOyJzdHJpbmciPT10eXBlb2YgYSYmYT09PWMmJihsPWEscD1lLmNvbnZlcnQoMCxsKSxkPWUuZmluZChvLFtsLGxdKSk7dmFyIGcseSxtPVtdO2ZvcihnPTA7ZzxoO2crKyltW2ddPVtdO3ZhciB2PVtdLF89W10seD1bXSx3PVtdO2Zvcih5PTA7eTxmO3krKyl7dmFyIGI9eSsxO2ZvcihyKHQseSx4LHYsYikscihpLHksdyxfLGIpLGc9MDtnPGg7ZysrKXt2YXIgRD14W2ddPT09Yj92W2ddOnAsRT13W2ddPT09Yj9fW2ddOnA7bVtnXVt5XT1kKEQsRSl9fXJldHVybiBuZXcgbih7ZGF0YTptLHNpemU6W2gsZl0sZGF0YXR5cGU6bH0pfTtmdW5jdGlvbiByKHQsZSxuLHIsaSl7Zm9yKHZhciBvPXQuX3ZhbHVlcyxzPXQuX2luZGV4LGE9dC5fcHRyLHU9YVtlXSxjPWFbZSsxXTt1PGM7dSsrKXt2YXIgbD1zW3VdO25bbF09aSxyW2xdPW9bdV19fX0pKSxlbT0iY29uaiIsbm09aWQoZW0sWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGUoZW0seyJudW1iZXIgfCBCaWdOdW1iZXIgfCBGcmFjdGlvbiI6dD0+dCxDb21wbGV4OnQ9PnQuY29uanVnYXRlKCksIkFycmF5IHwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT5lPT53eShlLHQpKSl9KX0pKSxybT0iY29uY2F0IixpbT1pZChybSxbInR5cGVkIiwibWF0cml4IiwiaXNJbnRlZ2VyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixpc0ludGVnZXI6cn09dDtyZXR1cm4gZShybSx7Ii4uLkFycmF5IHwgTWF0cml4IHwgbnVtYmVyIHwgQmlnTnVtYmVyIjpmdW5jdGlvbih0KXt2YXIgZSxpLG89dC5sZW5ndGgscz0tMSxhPSExLHU9W107Zm9yKGU9MDtlPG87ZSsrKXt2YXIgYz10W2VdO2lmKHFmKGMpJiYoYT0hMCksUGYoYyl8fFJmKGMpKXtpZihlIT09by0xKXRocm93IG5ldyBFcnJvcigiRGltZW5zaW9uIG11c3QgYmUgc3BlY2lmaWVkIGFzIGxhc3QgYXJndW1lbnQiKTtpZihpPXMscz1jLnZhbHVlT2YoKSwhcihzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnRlZ2VyIG51bWJlciBleHBlY3RlZCBmb3IgZGltZW5zaW9uIik7aWYoczwwfHxlPjAmJnM+aSl0aHJvdyBuZXcgWXAocyxpKzEpfWVsc2V7dmFyIGw9d3AoYykudmFsdWVPZigpLGg9WHAobCk7aWYodVtlXT1sLGk9cyxzPWgubGVuZ3RoLTEsZT4wJiZzIT09aSl0aHJvdyBuZXcgR3AoaSsxLHMrMSl9fWlmKDA9PT11Lmxlbmd0aCl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkF0IGxlYXN0IG9uZSBtYXRyaXggZXhwZWN0ZWQiKTtmb3IodmFyIGY9dS5zaGlmdCgpO3UubGVuZ3RoOylmPW9tKGYsdS5zaGlmdCgpLHMsMCk7cmV0dXJuIGE/bihmKTpmfSwiLi4uc3RyaW5nIjpmdW5jdGlvbih0KXtyZXR1cm4gdC5qb2luKCIiKX19KX0pKTtmdW5jdGlvbiBvbSh0LGUsbixyKXtpZihyPG4pe2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKHQubGVuZ3RoLGUubGVuZ3RoKTtmb3IodmFyIGk9W10sbz0wO288dC5sZW5ndGg7bysrKWlbb109b20odFtvXSxlW29dLG4scisxKTtyZXR1cm4gaX1yZXR1cm4gdC5jb25jYXQoZSl9dmFyIHNtPWlkKCJvbmVzIixbInR5cGVkIiwiY29uZmlnIiwibWF0cml4IiwiQmlnTnVtYmVyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixCaWdOdW1iZXI6aX09dDtyZXR1cm4gZSgib25lcyIseyIiOmZ1bmN0aW9uKCl7cmV0dXJuIkFycmF5Ij09PW4ubWF0cml4P28oW10pOm8oW10sImRlZmF1bHQiKX0sIi4uLm51bWJlciB8IEJpZ051bWJlciB8IHN0cmluZyI6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0W3QubGVuZ3RoLTFdKXt2YXIgZT10LnBvcCgpO3JldHVybiBvKHQsZSl9cmV0dXJuIkFycmF5Ij09PW4ubWF0cml4P28odCk6byh0LCJkZWZhdWx0Iil9LEFycmF5Om8sTWF0cml4OmZ1bmN0aW9uKHQpe3ZhciBlPXQuc3RvcmFnZSgpO3JldHVybiBvKHQudmFsdWVPZigpLGUpfSwiQXJyYXkgfCBNYXRyaXgsIHN0cmluZyI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbyh0LnZhbHVlT2YoKSxlKX19KTtmdW5jdGlvbiBvKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7dmFyIGU9ITE7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxuLHIpe1JmKHQpJiYoZT0hMCxyW25dPXQudG9OdW1iZXIoKSl9KSksZX0odCksbz1uP25ldyBpKDEpOjE7aWYoZnVuY3Rpb24odCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHR8fCFNcCh0KXx8dDwwKXRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVycyBpbiBmdW5jdGlvbiBvbmVzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKX0pKX0odCksZSl7dmFyIHM9cihlKTtyZXR1cm4gdC5sZW5ndGg+MD9zLnJlc2l6ZSh0LG8pOnN9dmFyIGE9W107cmV0dXJuIHQubGVuZ3RoPjA/S3AoYSx0LG8pOmF9fSkpO2Z1bmN0aW9uIGFtKCl7dGhyb3cgbmV3IEVycm9yKCdObyAiYmlnbnVtYmVyIiBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUnKX1mdW5jdGlvbiB1bSgpe3Rocm93IG5ldyBFcnJvcignTm8gImZyYWN0aW9uIiBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUnKX1mdW5jdGlvbiBjbSgpe3Rocm93IG5ldyBFcnJvcignTm8gIm1hdHJpeCIgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlJyl9dmFyIGxtPSJyYW5nZSIsaG09aWQobG0sWyJ0eXBlZCIsImNvbmZpZyIsIj9tYXRyaXgiLCI/YmlnbnVtYmVyIiwic21hbGxlciIsInNtYWxsZXJFcSIsImxhcmdlciIsImxhcmdlckVxIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixiaWdudW1iZXI6aSxzbWFsbGVyOm8sc21hbGxlckVxOnMsbGFyZ2VyOmEsbGFyZ2VyRXE6dX09dDtyZXR1cm4gZShsbSx7c3RyaW5nOmwsInN0cmluZywgYm9vbGVhbiI6bCwibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGMoaCh0LGUsMSkpfSwibnVtYmVyLCBudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjKGgodCxlLG4pKX0sIm51bWJlciwgbnVtYmVyLCBib29sZWFuIjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGMobj9mKHQsZSwxKTpoKHQsZSwxKSl9LCJudW1iZXIsIG51bWJlciwgbnVtYmVyLCBib29sZWFuIjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gYyhyP2YodCxlLG4pOmgodCxlLG4pKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiBjKHAodCxlLG5ldygwLHQuY29uc3RydWN0b3IpKDEpKSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGMocCh0LGUsbikpfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIsIGJvb2xlYW4iOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmNvbnN0cnVjdG9yO3JldHVybiBjKG4/ZCh0LGUsbmV3IHIoMSkpOnAodCxlLG5ldyByKDEpKSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciwgQmlnTnVtYmVyLCBib29sZWFuIjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gYyhyP2QodCxlLG4pOnAodCxlLG4pKX19KTtmdW5jdGlvbiBjKHQpe3JldHVybiJNYXRyaXgiPT09bi5tYXRyaXg/cj9yKHQpOmNtKCk6dH1mdW5jdGlvbiBsKHQsZSl7dmFyIHI9ZnVuY3Rpb24odCl7dmFyIGU9dC5zcGxpdCgiOiIpLG49ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCl9KSkscj1uLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0KX0pKTtpZihyKXJldHVybiBudWxsO3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAyOnJldHVybntzdGFydDpuWzBdLGVuZDpuWzFdLHN0ZXA6MX07Y2FzZSAzOnJldHVybntzdGFydDpuWzBdLGVuZDpuWzJdLHN0ZXA6blsxXX07ZGVmYXVsdDpyZXR1cm4gbnVsbH19KHQpO2lmKCFyKXRocm93IG5ldyBTeW50YXhFcnJvcignU3RyaW5nICInK3QrJyIgaXMgbm8gdmFsaWQgcmFuZ2UnKTtyZXR1cm4iQmlnTnVtYmVyIj09PW4ubnVtYmVyPyh2b2lkIDA9PT1pJiZhbSgpLGMoKGU/ZDpwKShpKHIuc3RhcnQpLGkoci5lbmQpLGkoci5zdGVwKSkpKTpjKChlP2Y6aCkoci5zdGFydCxyLmVuZCxyLnN0ZXApKX1mdW5jdGlvbiBoKHQsZSxuKXt2YXIgcj1bXSxpPXQ7aWYobj4wKWZvcig7byhpLGUpOylyLnB1c2goaSksaSs9bjtlbHNlIGlmKG48MClmb3IoO2EoaSxlKTspci5wdXNoKGkpLGkrPW47cmV0dXJuIHJ9ZnVuY3Rpb24gZih0LGUsbil7dmFyIHI9W10saT10O2lmKG4+MClmb3IoO3MoaSxlKTspci5wdXNoKGkpLGkrPW47ZWxzZSBpZihuPDApZm9yKDt1KGksZSk7KXIucHVzaChpKSxpKz1uO3JldHVybiByfWZ1bmN0aW9uIHAodCxlLG4pe3ZhciByPWkoMCkscz1bXSx1PXQ7aWYobi5ndChyKSlmb3IoO28odSxlKTspcy5wdXNoKHUpLHU9dS5wbHVzKG4pO2Vsc2UgaWYobi5sdChyKSlmb3IoO2EodSxlKTspcy5wdXNoKHUpLHU9dS5wbHVzKG4pO3JldHVybiBzfWZ1bmN0aW9uIGQodCxlLG4pe3ZhciByPWkoMCksbz1bXSxhPXQ7aWYobi5ndChyKSlmb3IoO3MoYSxlKTspby5wdXNoKGEpLGE9YS5wbHVzKG4pO2Vsc2UgaWYobi5sdChyKSlmb3IoO3UoYSxlKTspby5wdXNoKGEpLGE9YS5wbHVzKG4pO3JldHVybiBvfX0pKSxmbT0ic2l6ZSIscG09aWQoZm0sWyJ0eXBlZCIsImNvbmZpZyIsIj9tYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpuLG1hdHJpeDpyfT10O3JldHVybiBlKGZtLHtNYXRyaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY3JlYXRlKHQuc2l6ZSgpKX0sQXJyYXk6WHAsc3RyaW5nOmZ1bmN0aW9uKHQpe3JldHVybiJBcnJheSI9PT1uLm1hdHJpeD9bdC5sZW5ndGhdOnIoW3QubGVuZ3RoXSl9LCJudW1iZXIgfCBDb21wbGV4IHwgQmlnTnVtYmVyIHwgVW5pdCB8IGJvb2xlYW4gfCBudWxsIjpmdW5jdGlvbih0KXtyZXR1cm4iQXJyYXkiPT09bi5tYXRyaXg/W106cj9yKFtdKTpjbSgpfX0pfSkpLGRtPSJzdWJzZXQiLGdtPWlkKGRtLFsidHlwZWQiLCJtYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLG1hdHJpeDpufT10O3JldHVybiBlKGRtLHsiQXJyYXksIEluZGV4IjpmdW5jdGlvbih0LGUpe3ZhciByPW4odCkuc3Vic2V0KGUpO3JldHVybiBlLmlzU2NhbGFyKCk/cjpyLnZhbHVlT2YoKX0sIk1hdHJpeCwgSW5kZXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc3Vic2V0KGUpfSwiT2JqZWN0LCBJbmRleCI6dm0sInN0cmluZywgSW5kZXgiOnltLCJBcnJheSwgSW5kZXgsIGFueSI6ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuKHdwKHQpKS5zdWJzZXQoZSxyLHZvaWQgMCkudmFsdWVPZigpfSwiQXJyYXksIEluZGV4LCBhbnksIGFueSI6ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIG4od3AodCkpLnN1YnNldChlLHIsaSkudmFsdWVPZigpfSwiTWF0cml4LCBJbmRleCwgYW55IjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQuY2xvbmUoKS5zdWJzZXQoZSxuKX0sIk1hdHJpeCwgSW5kZXgsIGFueSwgYW55IjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdC5jbG9uZSgpLnN1YnNldChlLG4scil9LCJzdHJpbmcsIEluZGV4LCBzdHJpbmciOm1tLCJzdHJpbmcsIEluZGV4LCBzdHJpbmcsIHN0cmluZyI6bW0sIk9iamVjdCwgSW5kZXgsIGFueSI6X219KX0pKTtmdW5jdGlvbiB5bSh0LGUpe2lmKCFXZihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbmRleCBleHBlY3RlZCIpO2lmKDEhPT1lLnNpemUoKS5sZW5ndGgpdGhyb3cgbmV3IEdwKGUuc2l6ZSgpLmxlbmd0aCwxKTt2YXIgbj10Lmxlbmd0aDtacChlLm1pbigpWzBdLG4pLFpwKGUubWF4KClbMF0sbik7dmFyIHI9ZS5kaW1lbnNpb24oMCksaT0iIjtyZXR1cm4gci5mb3JFYWNoKChmdW5jdGlvbihlKXtpKz10LmNoYXJBdChlKX0pKSxpfWZ1bmN0aW9uIG1tKHQsZSxuLHIpe2lmKCFlfHwhMCE9PWUuaXNJbmRleCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbmRleCBleHBlY3RlZCIpO2lmKDEhPT1lLnNpemUoKS5sZW5ndGgpdGhyb3cgbmV3IEdwKGUuc2l6ZSgpLmxlbmd0aCwxKTtpZih2b2lkIDAhPT1yKXtpZigic3RyaW5nIiE9dHlwZW9mIHJ8fDEhPT1yLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTaW5nbGUgY2hhcmFjdGVyIGV4cGVjdGVkIGFzIGRlZmF1bHRWYWx1ZSIpfWVsc2Ugcj0iICI7dmFyIGk9ZS5kaW1lbnNpb24oMCk7aWYoaS5zaXplKClbMF0hPT1uLmxlbmd0aCl0aHJvdyBuZXcgR3AoaS5zaXplKClbMF0sbi5sZW5ndGgpO3ZhciBvPXQubGVuZ3RoO1pwKGUubWluKClbMF0pLFpwKGUubWF4KClbMF0pO2Zvcih2YXIgcz1bXSxhPTA7YTxvO2ErKylzW2FdPXQuY2hhckF0KGEpO2lmKGkuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtzW3RdPW4uY2hhckF0KGVbMF0pfSkpLHMubGVuZ3RoPm8pZm9yKHZhciB1PW8tMSxjPXMubGVuZ3RoO3U8Yzt1Kyspc1t1XXx8KHNbdV09cik7cmV0dXJuIHMuam9pbigiIil9ZnVuY3Rpb24gdm0odCxlKXtpZigxIT09ZS5zaXplKCkubGVuZ3RoKXRocm93IG5ldyBHcChlLnNpemUoKSwxKTt2YXIgbj1lLmRpbWVuc2lvbigwKTtpZigic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiU3RyaW5nIGV4cGVjdGVkIGFzIGluZGV4IHRvIHJldHJpZXZlIGFuIG9iamVjdCBwcm9wZXJ0eSIpO3JldHVybiBzZCh0LG4pfWZ1bmN0aW9uIF9tKHQsZSxuKXtpZigxIT09ZS5zaXplKCkubGVuZ3RoKXRocm93IG5ldyBHcChlLnNpemUoKSwxKTt2YXIgcj1lLmRpbWVuc2lvbigwKTtpZigic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3RyaW5nIGV4cGVjdGVkIGFzIGluZGV4IHRvIHJldHJpZXZlIGFuIG9iamVjdCBwcm9wZXJ0eSIpO3ZhciBpPXdwKHQpO3JldHVybiBhZChpLHIsbiksaX12YXIgeG09InRyYW5zcG9zZSIsd209aWQoeG0sWyJ0eXBlZCIsIm1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om59PXQ7cmV0dXJuIGUoeG0se0FycmF5OnQ9PnIobih0KSkudmFsdWVPZigpLE1hdHJpeDpyLGFueTp3cH0pO2Z1bmN0aW9uIHIodCl7dmFyIGUsbj10LnNpemUoKTtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMTplPXQuY2xvbmUoKTticmVhaztjYXNlIDI6dmFyIHI9blswXSxpPW5bMV07aWYoMD09PWkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNhbm5vdCB0cmFuc3Bvc2UgYSAyRCBtYXRyaXggd2l0aCBubyBjb2x1bW5zIChzaXplOiAiK3FwKG4pKyIpIik7c3dpdGNoKHQuc3RvcmFnZSgpKXtjYXNlImRlbnNlIjplPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsaT10Ll9kYXRhLG89W10scz0wO3M8bjtzKyspe3I9b1tzXT1bXTtmb3IodmFyIGE9MDthPGU7YSsrKXJbYV09d3AoaVthXVtzXSl9cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6byxzaXplOltuLGVdLGRhdGF0eXBlOnQuX2RhdGF0eXBlfSl9KHQscixpKTticmVhaztjYXNlInNwYXJzZSI6ZT1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXQuX3ZhbHVlcyxpPXQuX2luZGV4LG89dC5fcHRyLHM9cj9bXTp2b2lkIDAsYT1bXSx1PVtdLGM9W10sbD0wO2w8ZTtsKyspY1tsXT0wO3ZhciBoLGYscDtmb3IoaD0wLGY9aS5sZW5ndGg7aDxmO2grKyljW2lbaF1dKys7Zm9yKHZhciBkPTAsZz0wO2c8ZTtnKyspdS5wdXNoKGQpLGQrPWNbZ10sY1tnXT11W2ddO2Zvcih1LnB1c2goZCkscD0wO3A8bjtwKyspZm9yKHZhciB5PW9bcF0sbT1vW3ArMV0sdj15O3Y8bTt2Kyspe3ZhciBfPWNbaVt2XV0rKzthW19dPXAsciYmKHNbX109d3Aoclt2XSkpfXJldHVybiB0LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOnMsaW5kZXg6YSxwdHI6dSxzaXplOltuLGVdLGRhdGF0eXBlOnQuX2RhdGF0eXBlfSl9KHQscixpKX1icmVhaztkZWZhdWx0OnRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaXggbXVzdCBiZSBhIHZlY3RvciBvciB0d28gZGltZW5zaW9uYWwgKHNpemU6ICIrcXAobikrIikiKX1yZXR1cm4gZX19KSksYm09aWQoIm51bWVyaWMiLFsibnVtYmVyIiwiP2JpZ251bWJlciIsIj9mcmFjdGlvbiJdLCh0PT57dmFye251bWJlcjplLGJpZ251bWJlcjpuLGZyYWN0aW9uOnJ9PXQsaT17c3RyaW5nOiEwLG51bWJlcjohMCxCaWdOdW1iZXI6ITAsRnJhY3Rpb246ITB9LG89e251bWJlcjp0PT5lKHQpLEJpZ051bWJlcjpuP3Q9Pm4odCk6YW0sRnJhY3Rpb246cj90PT5yKHQpOnVtfTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiJudW1iZXIiO2lmKHZvaWQgMCE9PShhcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJudW1lcmljKCkgdGFrZXMgb25lIG9yIHR3byBhcmd1bWVudHMiKTt2YXIgbj14cCh0KTtpZighKG4gaW4gaSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgIit0Kycgb2YgdHlwZSAiJytuKyciOyB2YWxpZCBpbnB1dCB0eXBlcyBhcmUgJytPYmplY3Qua2V5cyhpKS5qb2luKCIsICIpKTtpZighKGUgaW4gbykpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgIit0KycgdG8gdHlwZSAiJytlKyciOyB2YWxpZCBvdXRwdXQgdHlwZXMgYXJlICcrT2JqZWN0LmtleXMobykuam9pbigiLCAiKSk7cmV0dXJuIGU9PT1uP3Q6b1tlXSh0KX19KSksRG09ImRpdmlkZVNjYWxhciIsRW09aWQoRG0sWyJ0eXBlZCIsIm51bWVyaWMiXSwodD0+e3Zhcnt0eXBlZDplLG51bWVyaWM6bn09dDtyZXR1cm4gZShEbSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0L2V9LCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmRpdihlKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmRpdihlKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5kaXYoZSl9LCJVbml0LCBudW1iZXIgfCBDb21wbGV4IHwgRnJhY3Rpb24gfCBCaWdOdW1iZXIgfCBVbml0IjoodCxlKT0+dC5kaXZpZGUoZSksIm51bWJlciB8IEZyYWN0aW9uIHwgQ29tcGxleCB8IEJpZ051bWJlciwgVW5pdCI6KHQsZSk9PmUuZGl2aWRlSW50byh0KX0pfSkpLENtPSJkb3REaXZpZGUiLFNtPWlkKENtLFsidHlwZWQiLCJtYXRyaXgiLCJlcXVhbFNjYWxhciIsImRpdmlkZVNjYWxhciIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixlcXVhbFNjYWxhcjpyLGRpdmlkZVNjYWxhcjppLERlbnNlTWF0cml4Om8sY29uY2F0OnN9PXQsYT1IeSh7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpyfSksdT1aeSh7dHlwZWQ6ZX0pLGM9dG0oe3R5cGVkOmUsRGVuc2VNYXRyaXg6b30pLGw9enkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6cn0pLGg9ankoe3R5cGVkOmUsRGVuc2VNYXRyaXg6b30pLGY9V3koe3R5cGVkOmUsbWF0cml4Om4sY29uY2F0OnN9KTtyZXR1cm4gZShDbSxmKHtlbG9wOmksU1M6YyxEUzp1LFNEOmEsU3M6bCxzUzpofSkpfSkpLEFtPSJzbWFsbGVyIixObT1pZChBbSxbInR5cGVkIiwiY29uZmlnIiwibWF0cml4IiwiRGVuc2VNYXRyaXgiLCJjb25jYXQiXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpuLG1hdHJpeDpyLERlbnNlTWF0cml4OmksY29uY2F0Om99PXQscz1aeSh7dHlwZWQ6ZX0pLGE9dG0oe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLHU9ankoe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLGM9V3koe3R5cGVkOmUsbWF0cml4OnIsY29uY2F0Om99KSxsPU55KHt0eXBlZDplfSk7cmV0dXJuIGUoQW0sSW0oe3R5cGVkOmUsY29uZmlnOm59KSx7ImJvb2xlYW4sIGJvb2xlYW4iOih0LGUpPT50PGUsIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lmx0KGUpJiYhQXkodCxlLG4uZXBzaWxvbil9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOih0LGUpPT4tMT09PXQuY29tcGFyZShlKSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJObyBvcmRlcmluZyByZWxhdGlvbiBpcyBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMiKX19LGwsYyh7U1M6YSxEUzpzLFNzOnV9KSl9KSksSW09aWQoQW0sWyJ0eXBlZCIsImNvbmZpZyJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm59PXQ7cmV0dXJuIGUoQW0seyJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlJiYha3AodCxlLG4uZXBzaWxvbil9fSl9KSksTW09InNtYWxsZXJFcSIsRm09aWQoTW0sWyJ0eXBlZCIsImNvbmZpZyIsIm1hdHJpeCIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixEZW5zZU1hdHJpeDppLGNvbmNhdDpvfT10LHM9Wnkoe3R5cGVkOmV9KSxhPXRtKHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSx1PWp5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSxjPVd5KHt0eXBlZDplLG1hdHJpeDpyLGNvbmNhdDpvfSksbD1OeSh7dHlwZWQ6ZX0pO3JldHVybiBlKE1tLFRtKHt0eXBlZDplLGNvbmZpZzpufSkseyJib29sZWFuLCBib29sZWFuIjoodCxlKT0+dDw9ZSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubHRlKGUpfHxBeSh0LGUsbi5lcHNpbG9uKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6KHQsZSk9PjEhPT10LmNvbXBhcmUoZSksIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiTm8gb3JkZXJpbmcgcmVsYXRpb24gaXMgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzIil9fSxsLGMoe1NTOmEsRFM6cyxTczp1fSkpfSkpLFRtPWlkKE1tLFsidHlwZWQiLCJjb25maWciXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpufT10O3JldHVybiBlKE1tLHsibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8PWV8fGtwKHQsZSxuLmVwc2lsb24pfX0pfSkpLE9tPSJsYXJnZXIiLExtPWlkKE9tLFsidHlwZWQiLCJjb25maWciLCJtYXRyaXgiLCJEZW5zZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm4sbWF0cml4OnIsRGVuc2VNYXRyaXg6aSxjb25jYXQ6b309dCxzPVp5KHt0eXBlZDplfSksYT10bSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksdT1qeSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksYz1XeSh7dHlwZWQ6ZSxtYXRyaXg6cixjb25jYXQ6b30pLGw9Tnkoe3R5cGVkOmV9KTtyZXR1cm4gZShPbSxQbSh7dHlwZWQ6ZSxjb25maWc6bn0pLHsiYm9vbGVhbiwgYm9vbGVhbiI6KHQsZSk9PnQ+ZSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ3QoZSkmJiFBeSh0LGUsbi5lcHNpbG9uKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6KHQsZSk9PjE9PT10LmNvbXBhcmUoZSksIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiTm8gb3JkZXJpbmcgcmVsYXRpb24gaXMgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzIil9fSxsLGMoe1NTOmEsRFM6cyxTczp1fSkpfSkpLFBtPWlkKE9tLFsidHlwZWQiLCJjb25maWciXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpufT10O3JldHVybiBlKE9tLHsibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+ZSYmIWtwKHQsZSxuLmVwc2lsb24pfX0pfSkpLFJtPSJsYXJnZXJFcSIsQm09aWQoUm0sWyJ0eXBlZCIsImNvbmZpZyIsIm1hdHJpeCIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixEZW5zZU1hdHJpeDppLGNvbmNhdDpvfT10LHM9Wnkoe3R5cGVkOmV9KSxhPXRtKHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSx1PWp5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSxjPVd5KHt0eXBlZDplLG1hdHJpeDpyLGNvbmNhdDpvfSksbD1OeSh7dHlwZWQ6ZX0pO3JldHVybiBlKFJtLGttKHt0eXBlZDplLGNvbmZpZzpufSkseyJib29sZWFuLCBib29sZWFuIjoodCxlKT0+dD49ZSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ3RlKGUpfHxBeSh0LGUsbi5lcHNpbG9uKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6KHQsZSk9Pi0xIT09dC5jb21wYXJlKGUpLCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIk5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVycyIpfX0sbCxjKHtTUzphLERTOnMsU3M6dX0pKX0pKSxrbT1pZChSbSxbInR5cGVkIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bn09dDtyZXR1cm4gZShSbSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Pj1lfHxrcCh0LGUsbi5lcHNpbG9uKX19KX0pKSx6bT1pZCgiSW1tdXRhYmxlRGVuc2VNYXRyaXgiLFsic21hbGxlciIsIkRlbnNlTWF0cml4Il0sKHQ9Pnt2YXJ7c21hbGxlcjplLERlbnNlTWF0cml4Om59PXQ7ZnVuY3Rpb24gcih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIik7aWYoZSYmIWpmKGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBkYXRhdHlwZTogIitlKTtpZihxZih0KXx8VWYodCkpe3ZhciBpPW5ldyBuKHQsZSk7dGhpcy5fZGF0YT1pLl9kYXRhLHRoaXMuX3NpemU9aS5fc2l6ZSx0aGlzLl9kYXRhdHlwZT1pLl9kYXRhdHlwZSx0aGlzLl9taW49bnVsbCx0aGlzLl9tYXg9bnVsbH1lbHNlIGlmKHQmJlVmKHQuZGF0YSkmJlVmKHQuc2l6ZSkpdGhpcy5fZGF0YT10LmRhdGEsdGhpcy5fc2l6ZT10LnNpemUsdGhpcy5fZGF0YXR5cGU9dC5kYXRhdHlwZSx0aGlzLl9taW49dm9pZCAwIT09dC5taW4/dC5taW46bnVsbCx0aGlzLl9tYXg9dm9pZCAwIT09dC5tYXg/dC5tYXg6bnVsbDtlbHNle2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSBvZiBkYXRhICgiK3hwKHQpKyIpIik7dGhpcy5fZGF0YT1bXSx0aGlzLl9zaXplPVswXSx0aGlzLl9kYXRhdHlwZT1lLHRoaXMuX21pbj1udWxsLHRoaXMuX21heD1udWxsfX1yZXR1cm4gci5wcm90b3R5cGU9bmV3IG4sci5wcm90b3R5cGUudHlwZT0iSW1tdXRhYmxlRGVuc2VNYXRyaXgiLHIucHJvdG90eXBlLmlzSW1tdXRhYmxlRGVuc2VNYXRyaXg9ITAsci5wcm90b3R5cGUuc3Vic2V0PWZ1bmN0aW9uKHQpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6dmFyIGU9bi5wcm90b3R5cGUuc3Vic2V0LmNhbGwodGhpcyx0KTtyZXR1cm4gcWYoZSk/bmV3IHIoe2RhdGE6ZS5fZGF0YSxzaXplOmUuX3NpemUsZGF0YXR5cGU6ZS5fZGF0YXR5cGV9KTplO2Nhc2UgMjpjYXNlIDM6dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHNldCBzdWJzZXQgb24gYW4gSW1tdXRhYmxlIE1hdHJpeCBpbnN0YW5jZSIpO2RlZmF1bHQ6dGhyb3cgbmV3IFN5bnRheEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIil9fSxyLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc2V0IG9uIGFuIEltbXV0YWJsZSBNYXRyaXggaW5zdGFuY2UiKX0sci5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHJlc2l6ZSBvbiBhbiBJbW11dGFibGUgTWF0cml4IGluc3RhbmNlIil9LHIucHJvdG90eXBlLnJlc2hhcGU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgcmVzaGFwZSBvbiBhbiBJbW11dGFibGUgTWF0cml4IGluc3RhbmNlIil9LHIucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyByKHtkYXRhOndwKHRoaXMuX2RhdGEpLHNpemU6d3AodGhpcy5fc2l6ZSksZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9KX0sci5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21hdGhqczoiSW1tdXRhYmxlRGVuc2VNYXRyaXgiLGRhdGE6dGhpcy5fZGF0YSxzaXplOnRoaXMuX3NpemUsZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9fSxyLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcih0KX0sci5wcm90b3R5cGUuc3dhcFJvd3M9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc3dhcFJvd3Mgb24gYW4gSW1tdXRhYmxlIE1hdHJpeCBpbnN0YW5jZSIpfSxyLnByb3RvdHlwZS5taW49ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fbWluKXt2YXIgdD1udWxsO3RoaXMuZm9yRWFjaCgoZnVuY3Rpb24obil7KG51bGw9PT10fHxlKG4sdCkpJiYodD1uKX0pKSx0aGlzLl9taW49bnVsbCE9PXQ/dDp2b2lkIDB9cmV0dXJuIHRoaXMuX21pbn0sci5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX21heCl7dmFyIHQ9bnVsbDt0aGlzLmZvckVhY2goKGZ1bmN0aW9uKG4peyhudWxsPT09dHx8ZSh0LG4pKSYmKHQ9bil9KSksdGhpcy5fbWF4PW51bGwhPT10P3Q6dm9pZCAwfXJldHVybiB0aGlzLl9tYXh9LHJ9KSx7aXNDbGFzczohMH0pLGptPWlkKCJJbmRleCIsWyJJbW11dGFibGVEZW5zZU1hdHJpeCJdLCh0PT57dmFye0ltbXV0YWJsZURlbnNlTWF0cml4OmV9PXQ7ZnVuY3Rpb24gbih0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO3RoaXMuX2RpbWVuc2lvbnM9W10sdGhpcy5faXNTY2FsYXI9ITA7Zm9yKHZhciBlPTAsaT1hcmd1bWVudHMubGVuZ3RoO2U8aTtlKyspe3ZhciBvPWFyZ3VtZW50c1tlXTtpZihYZihvKSl0aGlzLl9kaW1lbnNpb25zLnB1c2gobyksdGhpcy5faXNTY2FsYXI9ITE7ZWxzZSBpZihBcnJheS5pc0FycmF5KG8pfHxxZihvKSl7dmFyIHM9cihvLnZhbHVlT2YoKSk7dGhpcy5fZGltZW5zaW9ucy5wdXNoKHMpO3ZhciBhPXMuc2l6ZSgpOygxIT09YS5sZW5ndGh8fDEhPT1hWzBdKSYmKHRoaXMuX2lzU2NhbGFyPSExKX1lbHNlIGlmKCJudW1iZXIiPT10eXBlb2Ygbyl0aGlzLl9kaW1lbnNpb25zLnB1c2gocihbb10pKTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2Ygbyl0aHJvdyBuZXcgVHlwZUVycm9yKCJEaW1lbnNpb24gbXVzdCBiZSBhbiBBcnJheSwgTWF0cml4LCBudW1iZXIsIHN0cmluZywgb3IgUmFuZ2UiKTt0aGlzLl9kaW1lbnNpb25zLnB1c2gobyl9fX1mdW5jdGlvbiByKHQpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZigibnVtYmVyIiE9dHlwZW9mIHRbbl18fCFNcCh0W25dKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbmRleCBwYXJhbWV0ZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlciBudW1iZXJzIik7cmV0dXJuIG5ldyBlKHQpfXJldHVybiBuLnByb3RvdHlwZS50eXBlPSJJbmRleCIsbi5wcm90b3R5cGUuaXNJbmRleD0hMCxuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBuO3JldHVybiB0Ll9kaW1lbnNpb25zPXdwKHRoaXMuX2RpbWVuc2lvbnMpLHQuX2lzU2NhbGFyPXRoaXMuX2lzU2NhbGFyLHR9LG4uY3JlYXRlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBuO3JldHVybiBuLmFwcGx5KGUsdCksZX0sbi5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9kaW1lbnNpb25zLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9kaW1lbnNpb25zW2VdO3RbZV09InN0cmluZyI9PXR5cGVvZiByPzE6ci5zaXplKClbMF19cmV0dXJuIHR9LG4ucHJvdG90eXBlLm1heD1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9kaW1lbnNpb25zLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9kaW1lbnNpb25zW2VdO3RbZV09InN0cmluZyI9PXR5cGVvZiByP3I6ci5tYXgoKX1yZXR1cm4gdH0sbi5wcm90b3R5cGUubWluPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuX2RpbWVuc2lvbnNbZV07dFtlXT0ic3RyaW5nIj09dHlwZW9mIHI/cjpyLm1pbigpfXJldHVybiB0fSxuLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dGhpcy5fZGltZW5zaW9ucy5sZW5ndGg7ZTxuO2UrKyl0KHRoaXMuX2RpbWVuc2lvbnNbZV0sZSx0aGlzKX0sbi5wcm90b3R5cGUuZGltZW5zaW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kaW1lbnNpb25zW3RdfHxudWxsfSxuLnByb3RvdHlwZS5pc09iamVjdFByb3BlcnR5PWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLl9kaW1lbnNpb25zLmxlbmd0aCYmInN0cmluZyI9PXR5cGVvZiB0aGlzLl9kaW1lbnNpb25zWzBdfSxuLnByb3RvdHlwZS5nZXRPYmplY3RQcm9wZXJ0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzT2JqZWN0UHJvcGVydHkoKT90aGlzLl9kaW1lbnNpb25zWzBdOm51bGx9LG4ucHJvdG90eXBlLmlzU2NhbGFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzU2NhbGFyfSxuLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuX2RpbWVuc2lvbnNbZV07dC5wdXNoKCJzdHJpbmciPT10eXBlb2Ygcj9yOnIudG9BcnJheSgpKX1yZXR1cm4gdH0sbi5wcm90b3R5cGUudmFsdWVPZj1uLnByb3RvdHlwZS50b0FycmF5LG4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuX2RpbWVuc2lvbnNbZV07InN0cmluZyI9PXR5cGVvZiByP3QucHVzaChKU09OLnN0cmluZ2lmeShyKSk6dC5wdXNoKHIudG9TdHJpbmcoKSl9cmV0dXJuIlsiK3Quam9pbigiLCAiKSsiXSJ9LG4ucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkluZGV4IixkaW1lbnNpb25zOnRoaXMuX2RpbWVuc2lvbnN9fSxuLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuLmNyZWF0ZSh0LmRpbWVuc2lvbnMpfSxufSkse2lzQ2xhc3M6ITB9KSxVbT0iYXRhbjIiLHFtPWlkKFVtLFsidHlwZWQiLCJtYXRyaXgiLCJlcXVhbFNjYWxhciIsIkJpZ051bWJlciIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixlcXVhbFNjYWxhcjpyLEJpZ051bWJlcjppLERlbnNlTWF0cml4Om8sY29uY2F0OnN9PXQsYT1IeSh7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpyfSksdT1aeSh7dHlwZWQ6ZX0pLGM9JHkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6cn0pLGw9enkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6cn0pLGg9ankoe3R5cGVkOmUsRGVuc2VNYXRyaXg6b30pLGY9V3koe3R5cGVkOmUsbWF0cml4Om4sY29uY2F0OnN9KTtyZXR1cm4gZShVbSx7Im51bWJlciwgbnVtYmVyIjpNYXRoLmF0YW4yLCJCaWdOdW1iZXIsIEJpZ051bWJlciI6KHQsZSk9PmkuYXRhbjIodCxlKX0sZih7c2NhbGFyOiJudW1iZXIgfCBCaWdOdW1iZXIiLFNTOmMsRFM6dSxTRDphLFNzOmwsc1M6aH0pKX0pKSxWbT1pZCgiYWRkIixbInR5cGVkIiwibWF0cml4IiwiYWRkU2NhbGFyIiwiZXF1YWxTY2FsYXIiLCJEZW5zZU1hdHJpeCIsIlNwYXJzZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4sYWRkU2NhbGFyOnIsZXF1YWxTY2FsYXI6aSxEZW5zZU1hdHJpeDpvLFNwYXJzZU1hdHJpeDpzLGNvbmNhdDphfT10LHU9cXkoe3R5cGVkOmV9KSxjPVZ5KHt0eXBlZDplLGVxdWFsU2NhbGFyOml9KSxsPUd5KHt0eXBlZDplLERlbnNlTWF0cml4Om99KSxoPVd5KHt0eXBlZDplLG1hdHJpeDpuLGNvbmNhdDphfSk7cmV0dXJuIGUoImFkZCIseyJhbnksIGFueSI6ciwiYW55LCBhbnksIC4uLmFueSI6ZS5yZWZlclRvU2VsZigodD0+KGUsbixyKT0+e2Zvcih2YXIgaT10KGUsbiksbz0wO288ci5sZW5ndGg7bysrKWk9dChpLHJbb10pO3JldHVybiBpfSkpfSxoKHtlbG9wOnIsRFM6dSxTUzpjLFNzOmx9KSl9KSksR209aWQoImRvdCIsWyJ0eXBlZCIsImFkZFNjYWxhciIsIm11bHRpcGx5U2NhbGFyIiwiY29uaiIsInNpemUiXSwodD0+e3Zhcnt0eXBlZDplLGFkZFNjYWxhcjpuLG11bHRpcGx5U2NhbGFyOnIsY29uajppLHNpemU6b309dDtyZXR1cm4gZSgiZG90Iix7IkFycmF5IHwgRGVuc2VNYXRyaXgsIEFycmF5IHwgRGVuc2VNYXRyaXgiOmZ1bmN0aW9uKHQsbyl7dmFyIHU9cyh0LG8pLGM9cWYodCk/dC5fZGF0YTp0LGw9cWYodCk/dC5fZGF0YXR5cGU6dm9pZCAwLGg9cWYobyk/by5fZGF0YTpvLGY9cWYobyk/by5fZGF0YXR5cGU6dm9pZCAwLHA9Mj09PWEodCkubGVuZ3RoLGQ9Mj09PWEobykubGVuZ3RoLGc9bix5PXI7aWYobCYmZiYmbD09PWYmJiJzdHJpbmciPT10eXBlb2YgbCl7dmFyIG09bDtnPWUuZmluZChuLFttLG1dKSx5PWUuZmluZChyLFttLG1dKX1pZighcCYmIWQpe2Zvcih2YXIgdj15KGkoY1swXSksaFswXSksXz0xO188dTtfKyspdj1nKHYseShpKGNbX10pLGhbX10pKTtyZXR1cm4gdn1pZighcCYmZCl7Zm9yKHZhciB4PXkoaShjWzBdKSxoWzBdWzBdKSx3PTE7dzx1O3crKyl4PWcoeCx5KGkoY1t3XSksaFt3XVswXSkpO3JldHVybiB4fWlmKHAmJiFkKXtmb3IodmFyIGI9eShpKGNbMF1bMF0pLGhbMF0pLEQ9MTtEPHU7RCsrKWI9ZyhiLHkoaShjW0RdWzBdKSxoW0RdKSk7cmV0dXJuIGJ9aWYocCYmZCl7Zm9yKHZhciBFPXkoaShjWzBdWzBdKSxoWzBdWzBdKSxDPTE7Qzx1O0MrKylFPWcoRSx5KGkoY1tDXVswXSksaFtDXVswXSkpO3JldHVybiBFfX0sIlNwYXJzZU1hdHJpeCwgU3BhcnNlTWF0cml4IjpmdW5jdGlvbih0LGUpe3ModCxlKTtmb3IodmFyIGk9dC5faW5kZXgsbz10Ll92YWx1ZXMsYT1lLl9pbmRleCx1PWUuX3ZhbHVlcyxjPTAsbD1uLGg9cixmPTAscD0wO2Y8aS5sZW5ndGgmJnA8YS5sZW5ndGg7KXt2YXIgZD1pW2ZdLGc9YVtwXTtkPGc/ZisrOmQ+Zz9wKys6ZD09PWcmJihjPWwoYyxoKG9bZl0sdVtwXSkpLGYrKyxwKyspfXJldHVybiBjfX0pO2Z1bmN0aW9uIHModCxlKXt2YXIgbixyLGk9YSh0KSxvPWEoZSk7aWYoMT09PWkubGVuZ3RoKW49aVswXTtlbHNle2lmKDIhPT1pLmxlbmd0aHx8MSE9PWlbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkV4cGVjdGVkIGEgY29sdW1uIHZlY3RvciwgaW5zdGVhZCBnb3QgYSBtYXRyaXggb2Ygc2l6ZSAoIitpLmpvaW4oIiwgIikrIikiKTtuPWlbMF19aWYoMT09PW8ubGVuZ3RoKXI9b1swXTtlbHNle2lmKDIhPT1vLmxlbmd0aHx8MSE9PW9bMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkV4cGVjdGVkIGEgY29sdW1uIHZlY3RvciwgaW5zdGVhZCBnb3QgYSBtYXRyaXggb2Ygc2l6ZSAoIitvLmpvaW4oIiwgIikrIikiKTtyPW9bMF19aWYobiE9PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlZlY3RvcnMgbXVzdCBoYXZlIGVxdWFsIGxlbmd0aCAoIituKyIgIT0gIityKyIpIik7aWYoMD09PW4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNhbm5vdCBjYWxjdWxhdGUgdGhlIGRvdCBwcm9kdWN0IG9mIGVtcHR5IHZlY3RvcnMiKTtyZXR1cm4gbn1mdW5jdGlvbiBhKHQpe3JldHVybiBxZih0KT90LnNpemUoKTpvKHQpfX0pKSxZbT0iaW5kZXgiLFhtPWlkKFltLFsidHlwZWQiLCJJbmRleCJdLCh0PT57dmFye3R5cGVkOmUsSW5kZXg6bn09dDtyZXR1cm4gZShZbSx7Ii4uLm51bWJlciB8IHN0cmluZyB8IEJpZ051bWJlciB8IFJhbmdlIHwgQXJyYXkgfCBNYXRyaXgiOmZ1bmN0aW9uKHQpe3ZhciBlPXQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gUmYodCk/dC50b051bWJlcigpOkFycmF5LmlzQXJyYXkodCl8fHFmKHQpP3QubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gUmYodCk/dC50b051bWJlcigpOnR9KSk6dH0pKSxyPW5ldyBuO3JldHVybiBuLmFwcGx5KHIsZSkscn19KX0pKSxXbT10eSh7Y29uZmlnOkVwfSksSG09c3koe30pLFptPW15KHt9KSxLbT12eSh7fSksSm09eHkoe01hdHJpeDpLbX0pLFFtPWdkKHtCaWdOdW1iZXI6V20sQ29tcGxleDpIbSxEZW5zZU1hdHJpeDpKbSxGcmFjdGlvbjpabX0pLCRtPWt5KHt0eXBlZDpRbX0pLHR2PU95KHtCaWdOdW1iZXI6V20sdHlwZWQ6UW19KSxldj1ubSh7dHlwZWQ6UW19KSxudj1NeSh7Y29uZmlnOkVwLHR5cGVkOlFtfSkscnY9RHkoe3R5cGVkOlFtfSksaXY9S3koe3R5cGVkOlFtfSksb3Y9VHkoe3R5cGVkOlFtfSksc3Y9Rnkoe01hdHJpeDpLbSxlcXVhbFNjYWxhcjpudix0eXBlZDpRbX0pLGF2PUx5KHtGcmFjdGlvbjpabSx0eXBlZDpRbX0pLHV2PVJ5KHtEZW5zZU1hdHJpeDpKbSxNYXRyaXg6S20sU3BhcnNlTWF0cml4OnN2LHR5cGVkOlFtfSksY3Y9Ym0oe2JpZ251bWJlcjp0dixmcmFjdGlvbjphdixudW1iZXI6b3Z9KSxsdj1wbSh7bWF0cml4OnV2LGNvbmZpZzpFcCx0eXBlZDpRbX0pLGh2PWdtKHttYXRyaXg6dXYsdHlwZWQ6UW19KSxmdj13bSh7bWF0cml4OnV2LHR5cGVkOlFtfSkscHY9aW0oe2lzSW50ZWdlcjpydixtYXRyaXg6dXYsdHlwZWQ6UW19KSxkdj1TbSh7RGVuc2VNYXRyaXg6Sm0sY29uY2F0OnB2LGRpdmlkZVNjYWxhcjpFbSh7bnVtZXJpYzpjdix0eXBlZDpRbX0pLGVxdWFsU2NhbGFyOm52LG1hdHJpeDp1dix0eXBlZDpRbX0pLGd2PUJtKHtEZW5zZU1hdHJpeDpKbSxjb25jYXQ6cHYsY29uZmlnOkVwLG1hdHJpeDp1dix0eXBlZDpRbX0pLHl2PXNtKHtCaWdOdW1iZXI6V20sY29uZmlnOkVwLG1hdHJpeDp1dix0eXBlZDpRbX0pLG12PU5tKHtEZW5zZU1hdHJpeDpKbSxjb25jYXQ6cHYsY29uZmlnOkVwLG1hdHJpeDp1dix0eXBlZDpRbX0pLHZ2PVZtKHtEZW5zZU1hdHJpeDpKbSxTcGFyc2VNYXRyaXg6c3YsYWRkU2NhbGFyOiRtLGNvbmNhdDpwdixlcXVhbFNjYWxhcjpudixtYXRyaXg6dXYsdHlwZWQ6UW19KSxfdj1HbSh7YWRkU2NhbGFyOiRtLGNvbmo6ZXYsbXVsdGlwbHlTY2FsYXI6aXYsc2l6ZTpsdix0eXBlZDpRbX0pLHh2PWptKHtJbW11dGFibGVEZW5zZU1hdHJpeDp6bSh7RGVuc2VNYXRyaXg6Sm0sc21hbGxlcjptdn0pfSksd3Y9TG0oe0RlbnNlTWF0cml4OkptLGNvbmNhdDpwdixjb25maWc6RXAsbWF0cml4OnV2LHR5cGVkOlFtfSksYnY9UXkoe2FkZFNjYWxhcjokbSxkb3Q6X3YsZXF1YWxTY2FsYXI6bnYsbWF0cml4OnV2LG11bHRpcGx5U2NhbGFyOml2LHR5cGVkOlFtfSksRHY9Rm0oe0RlbnNlTWF0cml4OkptLGNvbmNhdDpwdixjb25maWc6RXAsbWF0cml4OnV2LHR5cGVkOlFtfSksRXY9WG0oe0luZGV4Onh2LHR5cGVkOlFtfSksQ3Y9aG0oe2JpZ251bWJlcjp0dixtYXRyaXg6dXYsY29uZmlnOkVwLGxhcmdlcjp3dixsYXJnZXJFcTpndixzbWFsbGVyOm12LHNtYWxsZXJFcTpEdix0eXBlZDpRbX0pLFN2PXFtKHtCaWdOdW1iZXI6V20sRGVuc2VNYXRyaXg6Sm0sY29uY2F0OnB2LGVxdWFsU2NhbGFyOm52LG1hdHJpeDp1dix0eXBlZDpRbX0pO2Z1bmN0aW9uIEF2KHQsZSxuKXtjb25zdCByPXV2KFtbZVswXVswXSxlWzBdWzFdXSxbZVsxXVswXSxlWzFdWzFdXV0pLGk9ZVswXVsyXSxvPWVbMV1bMl0scz1uLGE9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgcj10W25dLGk9clswXSpyWzBdK3JbMV0qclsxXSxvPU1hdGguc3FydChpKTtlLnB1c2gobyl9cmV0dXJuIGV9KHQudG9BcnJheSgpLm1hcCgodD0+dC5zbGljZSgwLDIpKSkpLHU9ZHYoeXYodXYoYSkuc2l6ZSgpKSxhKSxjPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10Lmxlbmd0aCxyPVtdO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtsZXQgbz0wO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKW89dFtuLXItMV0rbyplW2ldO3IucHVzaChvKX1yZXR1cm4gcn0ocyxTdihidigtMSx0LnN1YnNldChFdihDdigwLHV2KHQpLnNpemUoKVswXSksMikpKSxhKSk7bGV0IGw9eXYoMix0LnNpemUoKVswXSk7Y29uc3QgaD1idih0LnN1YnNldChFdihDdigwLHQuc2l6ZSgpWzBdKSwwKSksdSpjKSxmPWJ2KHQuc3Vic2V0KEV2KEN2KDAsdC5zaXplKClbMF0pLDEpKSx1KmMpLHA9dXYoW1toLDBdLFtmLDBdXSk7bD1odihwLEV2KEN2KDAscC5zaXplKClbMF0pLDApKTtjb25zdCBkPXV2KFtpLG9dKSxnPWJ2KHIsbCkseT1kLnJlc2hhcGUoWzIsMV0pO3JldHVybiBmdih2dihnLHkpKS50b0FycmF5KCl9ZnVuY3Rpb24gTnYodD1bXSxlLG4scil7Y29uc3QgaT11dihmdW5jdGlvbih0KXtpZigxIT09dC5sZW5ndGh8fDMhPT10WzBdLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIklucHV0IG1hdHJpeCBtdXN0IGJlIGEgMXgzIG9yIDN4MSBtYXRyaXgiKTtyZXR1cm5bW3RbMF1bMF1dLFt0WzBdWzFdXSxbdFswXVsyXV0sWzFdXX0odCkpLG89dXYoZSkscz1idihvLGkpO3JldHVybiBBdihmdihzKSxuLHIpfXZhciBJdj1PYmplY3QuZGVmaW5lUHJvcGVydHksTXY9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsRnY9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsVHY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxPdj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEx2PU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsUHY9TWF0aC5wb3csUnY9KHQsZSxuKT0+ZSBpbiB0P0l2KHQsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOnRbZV09bjtmdW5jdGlvbiBCdih0KXtyZXR1cm4obmV3IFpoKS5zZXQoLi4udCl9ZnVuY3Rpb24ga3YodCxlLG4pe3RyeXtjb25zdCByPVZ0LnRyYW5zZmVyTWF0cml4MzRGcm9tS2l0dGkyVGhyZWUodCksaT1WdC50cmFuc2Zlck1hdHJpeDMzRnJvbUtpdHRpMlRocmVlKGUpLG89VnQudHJhbnNmZXJNYXRyaXgzNEZyb21LaXR0aTJUaHJlZShuKSxzPUJ2KHIpLGE9QnYoaSksdT1CdihvKTtyZXR1cm57Y29tcG9zZU1hdHJpeDQ6dS5jbG9uZSgpLnByZW11bHRpcGx5KGEpLnByZW11bHRpcGx5KHMpLFBNOnMsUk06YSxUTTp1fX1jYXRjaCh0KXt9fWNvbnN0IHp2PSh0LGUpPT5lLnNvbWUoKGU9PmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hKHQubGVuZ3RoIT09ZXx8dC5zb21lKCh0PT50Lmxlbmd0aCE9PW4pKSl9KHQsZVswXSxlWzFdKSkpLGp2PXQ9Pnt2YXIgZTtyZXR1cm4hISgobnVsbD09KGU9dC5maXNoZXllRGlzdG9ydGlvbik/dm9pZCAwOmUubGVuZ3RoKT4wJiZ6dih0LlAsW1szLDRdLFs0LDRdXSkmJnp2KHQuVCxbWzMsNF0sWzQsNF1dKSl9LFV2PSh0LGUpPT57aWYoITEhPT1qdihlKSlyZXR1cm4obnVsbD09ZT92b2lkIDA6ZS5jYW1lcmFUeXBlKT09PUp0Lk9tbmlDYW1lcmE/KCh0LGUpPT57aWYoITE9PT1qdihlKSlyZXR1cm47Y29uc3R7UDpuLGZpc2hleWVEaXN0b3J0aW9uOnIsVDppfT1lLG89bmV3IHZoKHQueCx0LnksdC56KSxzPUJ2KFZ0LnRyYW5zZmVyTWF0cml4MzRGcm9tS2l0dGkyVGhyZWUoaSkpLGE9QnYoVnQudHJhbnNmZXJNYXRyaXgzNEZyb21LaXR0aTJUaHJlZShuKSksdT1vLmFwcGx5TWF0cml4NChzKSxjPVB2KFB2KHUueCwyKStQdih1LnksMiksLjUpLGw9TWF0aC5hdGFuKHUuei9jKSxoPXIucmVkdWNlKCgodCxlLG4pPT50K2UqUHYobCxuKSksMCk7cmV0dXJuIHUueD11LngvYypoLHUueT11LnkvYypoLHUuej0xLHUuYXBwbHlNYXRyaXg0KGEpfSkodCxlKToobnVsbD09ZT92b2lkIDA6ZS5jYW1lcmFUeXBlKT09PUp0Lkthbm5hbGFCcmFuZHQ/KCh0LGUpPT57Y29uc3R7UDpuLFQ6cixmaXNoZXllRGlzdG9ydGlvbjppfT1lLG89W3QueCx0LnksdC56LDFdLHM9ci5tYXAoKHQ9PnQucmVkdWNlKCgodCxlLG4pPT50K2Uqb1tuXSksMCkpKSxhPXNbMF0sdT1zWzFdLGM9c1syXTtpZighKGM+PS4wMSYmaXNGaW5pdGUoYykpKXJldHVybjtjb25zdCBsPVtbblswXVswXSxuWzBdWzFdXSxbblsxXVswXSxuWzFdWzFdXV0saD1uWzBdWzJdLGY9blsxXVsyXSxwPU1hdGguc3FydChhKmErdSp1KSxkPU1hdGguYXRhbjIocCxjKSxnPWQraS5yZWR1Y2UoKCh0LGUsbik9PnQrZSpNYXRoLnBvdyhkLDIqbiszKSksMCk7bGV0IHksbTtyZXR1cm4gMCE9PXA/KHk9YSpnL3AsbT11KmcvcCk6KHk9MCxtPTApLHt4OmxbMF1bMF0qeStsWzBdWzFdKm0raCx5OmxbMV1bMF0qeStsWzFdWzFdKm0rZn19KSh0LGUpOihudWxsPT1lP3ZvaWQgMDplLmNhbWVyYVR5cGUpPT09SnQuT21uaUNhbWVyYTExVj8oKHQsZSk9PntpZighMT09PWp2KGUpKXJldHVybjtjb25zdHtQOm4sZmlzaGV5ZURpc3RvcnRpb246cixUOml9PWUsbz1OdihbW3QueCx0LnksdC56XV0saSxuLHIpO3JldHVybiBuZXcgdmgob1swXVswXSxvWzBdWzFdLDEpfSkodCxlKTp2b2lkIDB9O2Z1bmN0aW9uIHF2KHQsZSl7Y29uc3Qgbj1uZXcgdmgodC54LHQueSx0LnopLmFwcGx5TWF0cml4NChlKTtpZihuLno8MClyZXR1cm47Y29uc3Qgcj0xL24ueixpPShuZXcgWmgpLnNldChyLDAsMCwwLDAsciwwLDAsMCwwLHIsMCwwLDAsMCwxKTtyZXR1cm4gbi5hcHBseU1hdHJpeDQoaSl9ZnVuY3Rpb24gVnYodCxlLG4pe2NvbnN0IHI9ZS54LXQueCxpPWUueS10Lnksbz1uLngtdC54O3JldHVybiByKihuLnktdC55KS1vKml9ZnVuY3Rpb24gR3YodCxlLG49e2NyZWF0ZVJhbmdlOiExfSl7dmFyIHI7aWYoIWUpcmV0dXJue3RyYW5zZmVyVmlld0RhdGE6W10sdmlld1JhbmdlUG9pbnRMaXN0OltdfTtjb25zdHtjcmVhdGVSYW5nZTppfT1uLG89VXQuZ2V0QWxsVmlld0RhdGEodCkscz1qdihlKSx7UDphLFI6dSxUOmN9PWU7bGV0IGw7aWYoITE9PT1zKXtjb25zdHtjb21wb3NlTWF0cml4NDp0fT1udWxsIT0ocj1rdihhLHUsYykpP3I6e307aWYoIXQpcmV0dXJuO2w9dH1jb25zdCBoPW8ubWFwKChuPT4oe3R5cGU6bi50eXBlLHBvaW50TGlzdDpuLnBvaW50TGlzdC5tYXAoKGU9PmZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtjb25zdCBpPW5ldyB4aCh0LngsdC55LG51bGwhPShyPW51bGw9PXQ/dm9pZCAwOnQueik/cjoxKSxvPShuZXcgWmgpLm1ha2VSb3RhdGlvbloobikscz0obmV3IFpoKS5tYWtlVHJhbnNsYXRpb24oZS54LGUueSxlLnopLGE9KG5ldyBaaCkubWFrZVRyYW5zbGF0aW9uKC1lLngsLWUueSwtZS56KTtyZXR1cm4gaS5jbG9uZSgpLmFwcGx5TWF0cml4NChhKS5hcHBseU1hdHJpeDQobykuYXBwbHlNYXRyaXg0KHMpfShlLHQuY2VudGVyLHQucm90YXRpb24pKSkubWFwKCh0PT5zP1V2KHQsZSk6bCYmcXYodCxsKSkpLm1hcCgodD0+e2lmKHQpcmV0dXJue2lkOnpsKCkseDpudWxsPT10P3ZvaWQgMDp0LngseTpudWxsPT10P3ZvaWQgMDp0Lnl9fSkpLmZpbHRlcigodD0+dm9pZCAwIT09dCkpfSkpKS5maWx0ZXIoKHQ9PjAhPT10LnBvaW50TGlzdC5sZW5ndGgpKTtoWzBdJiZoWzBdLnBvaW50TGlzdCYmKGhbMF0ucG9pbnRMaXN0PWhbMF0ucG9pbnRMaXN0Lm1hcCgodD0+KCh0LGUpPT5Ndih0LEZ2KGUpKSkoKCh0LGUpPT57Zm9yKHZhciBuIGluIGV8fChlPXt9KSlPdi5jYWxsKGUsbikmJlJ2KHQsbixlW25dKTtpZihUdilmb3IodmFyIG4gb2YgVHYoZSkpTHYuY2FsbChlLG4pJiZSdih0LG4sZVtuXSk7cmV0dXJuIHR9KSh7fSx0KSx7c3BlY2lhbEVkZ2U6ITB9KSkpKTtsZXQgZj1bXTtpZig2PT09aC5sZW5ndGgmJiEwPT09aSl7Zj1mdW5jdGlvbih0KXtjb25zdCBlPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5zbGljZSgpO3JldHVybiBlLnNvcnQoKCh0LGUpPT50Lng9PT1lLng/ZS55LXQueTp0LngtZS54KSksZX0odCksbj1bXTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Zm9yKDtuLmxlbmd0aD49MiYmVnYobltuLmxlbmd0aC0yXSxuW24ubGVuZ3RoLTFdLGVbdF0pPD0wOyluLnBvcCgpO24ucHVzaChlW3RdKX1jb25zdCByPVtdO2ZvcihsZXQgdD1lLmxlbmd0aC0xO3Q+PTA7dC0tKXtmb3IoO3IubGVuZ3RoPj0yJiZWdihyW3IubGVuZ3RoLTJdLHJbci5sZW5ndGgtMV0sZVt0XSk8PTA7KXIucG9wKCk7ci5wdXNoKGVbdF0pfXJldHVybiBuLnBvcCgpLHIucG9wKCksbi5jb25jYXQocil9KFsuLi5oWzBdLnBvaW50TGlzdCwuLi5oWzFdLnBvaW50TGlzdF0pfXJldHVybnt0cmFuc2ZlclZpZXdEYXRhOmgsdmlld1JhbmdlUG9pbnRMaXN0OmZ9fXZhciBZdixYdjshZnVuY3Rpb24odCl7dFt0LlVwbG9hZD0wXT0iVXBsb2FkIix0W3QuVXBsb2FkUmV0cnk9MV09IlVwbG9hZFJldHJ5Iix0W3QuVXBsb2FkRmFpbD0yXT0iVXBsb2FkRmFpbCIsdFt0LkFubm90YXRpb249M109IkFubm90YXRpb24iLHRbdC5UZXJtaW5hdGVkPTRdPSJUZXJtaW5hdGVkIix0W3QuRmluaXNoPTVdPSJGaW5pc2giLHRbdC5QdWJsaXNoPTZdPSJQdWJsaXNoIn0oWXZ8fChZdj17fSkpLGZ1bmN0aW9uKHQpe3RbdC5SZWFkeT0xXT0iUmVhZHkiLHRbdC5GaXJzdFBvaW50PTJdPSJGaXJzdFBvaW50Iix0W3QuQ3Vib2lkPTNdPSJDdWJvaWQifShYdnx8KFh2PXt9KSk7dmFyIFd2PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIHI9cnx8a2wodCxlLG4pLG5ldyBXb3JrZXIocixpKX19KCJMeW9nY205c2JIVndMWEJzZFdkcGJpMTNaV0l0ZDI5eWEyVnlMV3h2WVdSbGNpQXFMd3AyWVhJZ2QyOXlhMlZ5WDJOdlpHVTlablZ1WTNScGIyNG9jQ2w3SW5WelpTQnpkSEpwWTNRaU8yTnZibk4wSUhZOVd5MHhMQzB4TEMweFhUdHNaWFFnU1QwaE1UdG1kVzVqZEdsdmJpQkNLR1VwZTJOdmJuTjBJSFE5TFRjc2J6MHpMRzQ5YnkxME8zSmxkSFZ5YmlCbFBIUW1KaWhsUFhRcExHVStieVltS0dVOWJ5a3NUV0YwYUM1bWJHOXZjaWdvWlMxMEtTOXVLakkxTlNsOVpuVnVZM1JwYjI0Z1JTZ3BlMnhsZENCbE8yTnZibk4wSUhROWJtVjNJRUZ5Y21GNUtESTFOaWt1Wm1sc2JDZ2lJaWt1YldGd0tDZ3BQVDV1WlhjZ1FYSnlZWGtvTXlrdVptbHNiQ2dpSWlrcE8yWnZjaWhzWlhRZ2J6MHdPMjg4TWpBN2J5c3JLWHRtYjNJb1pUMHdPMlU4TXpJN1pTc3JLWFJiWlYxYk1GMDlNVEk0S3pRcVpTeDBXMlZkV3pGZFBUQXNkRnRsWFZzeVhUMHdPMlp2Y2loMFd6TXlYVnN3WFQweU5UVXNkRnN6TWwxYk1WMDlNQ3gwV3pNeVhWc3lYVDB3TEdVOU1EdGxQRFl6TzJVckt5bDBXek16SzJWZFd6QmRQVEkxTlN4MFd6TXpLMlZkV3pGZFBUUXJOQ3BsTEhSYk16TXJaVjFiTWwwOU1EdG1iM0lvZEZzNU5sMWJNRjA5TWpVMExIUmJPVFpkV3pGZFBUSTFOU3gwV3prMlhWc3lYVDB5TEdVOU1EdGxQRFl5TzJVckt5bDBXemszSzJWZFd6QmRQVEkxTUMwMEttVXNkRnM1Tnl0bFhWc3hYVDB5TlRVc2RGczVOeXRsWFZzeVhUMDJLelFxWlR0bWIzSW9kRnN4TlRsZFd6QmRQVEVzZEZzeE5UbGRXekZkUFRJMU5TeDBXekUxT1YxYk1sMDlNalUwTEdVOU1EdGxQRFkwTzJVckt5bDBXekUyTUN0bFhWc3dYVDB3TEhSYk1UWXdLMlZkV3pGZFBUSTFNaTFsS2pRc2RGc3hOakFyWlYxYk1sMDlNalUxTzJadmNpaGxQVEE3WlR3ek1qdGxLeXNwZEZzeU1qUXJaVjFiTUYwOU1DeDBXekl5TkN0bFhWc3hYVDB3TEhSYk1qSTBLMlZkV3pKZFBUSTFNaTAwS21WOWNtVjBkWEp1SUhSOVkyOXVjM1FnVWoxRktDazdablZ1WTNScGIyNGdhQ2hsTEhRc2J6MHdLWHRzWlhRZ2JqMHdMR0VzZUN4cExHdzdkRDFiTGk0dWRGMHNiejA5UFRFbUppaDBQV055WldGMFpWTnRiMjkwYUVOMWNuWmxVRzlwYm5SektIUXVjbVZrZFdObEtDaDVMR01wUFQ1YkxpNHVlU3hqTG5nc1l5NTVYU3hiWFNrc0xqVXNJVEFzVTBWSFRVVk9WRjlPVlUxQ1JWSXBLU3hiYVYwOWREdGpiMjV6ZENCMVBYUXViR1Z1WjNSb08yWnZjaWhoUFRFN1lUdzlkVHRoS3lzcGJEMTBXMkVsZFYwc1pTNTRQazFoZEdndWJXbHVLR2t1ZUN4c0xuZ3BKaVpsTG5nOFBVMWhkR2d1YldGNEtHa3VlQ3hzTG5ncEppWmxMbms4UFUxaGRHZ3ViV0Y0S0drdWVTeHNMbmtwSmlacExuZ2hQVDFzTG5nbUppaDRQU2hsTG5ndGFTNTRLU29vYkM1NUxXa3VlU2t2S0d3dWVDMXBMbmdwSzJrdWVTd29hUzU1UFQwOWJDNTVmSHhsTG5rOFBYZ3BKaVp1S3lzcExHazliRHR5WlhSMWNtNGdiaVV5SVQwd2ZXWjFibU4wYVc5dUlFOG9lM3BOYVc0NlpTeDZUV0Y0T25Rc2NHOXNlV2R2YmxCdmFXNTBUR2x6ZERwdkxHRjBkSEpwWW5WMFpUcHVMSGc2WVN4NU9uZ3NlanBwTEdOdmJHOXlUR2x6ZERwc0xIWmhiR2xrT25WOUtYdHBaaWhvS0h0NE9tRXNlVHA0ZlN4dktTWW1hVDQ5WlNZbWFUdzlkQ2x5WlhSMWNtNGdkVDA5UFNFeFAxc3hMREV3TXk4eU5UVXNNVEF5THpJMU5WMDZiRnR1WFQ5c1cyNWRMbkpuWW1FdWMyeHBZMlVvTUN3ektTNXRZWEFvWXowK1l5OHlOVFVwT2xzeExEQXNNRjE5Wm5WdVkzUnBiMjRnYlNobEtYdGpiMjV6ZENCMFBVSW9aU2tzYnoxU1czUmRMRnR1TEdFc2VGMDlienR5WlhSMWNtNWJiaTh5TlRVc1lTOHlOVFVzZUM4eU5UVmRmWEpsZEhWeWJpQnZibTFsYzNOaFoyVTlablZ1WTNScGIyNG9kQ2w3WTI5dWMzUjdjRzl6YVhScGIyNDZieXhqYjJ4dmNqcHVMR04xWW05cFpFeHBjM1E2WVN4amIyeHZja3hwYzNRNmVDeG9hV2RvYkdsbmFIUkpibVJsZURwcGZUMTBMbVJoZEdFN2JHVjBlMjF2WkdsbWFXVmtRbTk0U1dSek9tdzlXMTBzY21WelpYUkJjbVZoY3pwMVBWdGRmVDEwTG1SaGRHRXNlVDB3TzJaMWJtTjBhVzl1SUdNb0tYdDVLejB4ZldsbUtDRnZLWEpsZEhWeWJqdGpiMjV6ZENCZlBTRWhLR2s5UFc1MWJHdy9kbTlwWkNBd09ta3ViR1Z1WjNSb0tUc29YM3g4U1NrbUppaHNQVnRkTEhVOVcxMHBPMk52Ym5OMElIYzliQzVzWlc1bmRHZy9ZUzVtYVd4MFpYSW9jajArYkM1cGJtTnNkV1JsY3loeUxtbGtLU2s2WVR0bWIzSW9iR1YwSUhJOU1EdHlQRzh1YkdWdVozUm9PM0lyUFRNcGUyTnZibk4wSUVNOWIxdHlYU3hNUFc5YmNpc3hYU3hrUFc5YmNpc3lYVHRzWlhRZ1p6dHBaaWgxTG14bGJtZDBhRDA5UFRFbUppRnNMbXhsYm1kMGFDbG9LSHQ0T2tNc2VUcE1mU3gxV3pCZEtUOW5QVzBvWkNrNlp6MTJPMlZzYzJVZ2FXWW9kUzVzWlc1bmRHaDhmR3d1YkdWdVozUm9LWHRzWlhRZ2N6MGhNVHQzTG5OdmJXVW9aajArZTJOdmJuTjBJRTA5VHloN2NHOXNlV2R2YmxCdmFXNTBUR2x6ZERwbUxuQnZiSGxuYjI1UWIybHVkRXhwYzNRc2VrMXBianBtTG5wTmFXNHNlazFoZURwbUxucE5ZWGdzZURwRExIazZUQ3g2T21Rc1lYUjBjbWxpZFhSbE9tWXVZWFIwY21saWRYUmxMR052Ykc5eVRHbHpkRHA0TEhaaGJHbGtPbVl1ZG1Gc2FXUjlLVHR5WlhSMWNtNGdUVDhvWXlncExHYzlUU3h6UFNFd0xDRXdLVG9oTVgwcExDRnpKaVoxTG14bGJtZDBhQ1ltS0hNOWRTNXpiMjFsS0dZOVBtZ29lM2c2UXl4NU9reDlMR1lwUHloblBXMG9aQ2tzSVRBcE9pRXhLU2tzSVhNbUppRmZKaVlvU1Q5blBXMG9aQ2s2WnoxMktYMWxiSE5sSUhjdWMyOXRaU2h6UFQ1N1kyOXVjM1FnWmoxUEtIdHdiMng1WjI5dVVHOXBiblJNYVhOME9uTXVjRzlzZVdkdmJsQnZhVzUwVEdsemRDeDZUV2x1T25NdWVrMXBiaXg2VFdGNE9uTXVlazFoZUN4NE9rTXNlVHBNTEhvNlpDeGhkSFJ5YVdKMWRHVTZjeTVoZEhSeWFXSjFkR1VzWTI5c2IzSk1hWE4wT25nc2RtRnNhV1E2Y3k1MllXeHBaSDBwTzNKbGRIVnliaUJtUHloaktDa3NaejFtTENFd0tUb2hNWDBwTzJOdmJuTjBJRUU5Y3owK2UyTnZibk4wSUdZOVRXRjBhQzVtYkc5dmNpaHpMek1wTzNKbGRIVnliaUJwSmlacFcyWmRQVDA5TVgwN2FXWW9aeWxwWmlobld6QmRQVDA5ZGxzd1hTWW1RU2h5S1NsdVczSmRQVEFzYmx0eUt6RmRQVEFzYmx0eUt6SmRQVEE3Wld4elpYdGpiMjV6ZEZ0ekxHWXNUVjA5Wnp0dVczSmRQWE1zYmx0eUt6RmRQV1lzYmx0eUt6SmRQVTE5Wld4elpTQnBaaWhCS0hJcEtXNWJjbDA5TUN4dVczSXJNVjA5TUN4dVczSXJNbDA5TUR0bGJITmxlMk52Ym5OMFczTXNaaXhOWFQxdEtHUXBPMjViY2wwOWN5eHVXM0lyTVYwOVppeHVXM0lyTWwwOVRYMTlTVDFmTEhCdmMzUk5aWE56WVdkbEtIdHdiMmx1ZEhNNmJ5eGpiMnh2Y2pwdUxHNTFiVHA1ZlNsOUxIQXVhWE5KYmxCdmJIbG5iMjQ5YUN4UFltcGxZM1F1WkdWbWFXNWxVSEp2Y0dWeWRIa29jQ3dpWDE5bGMwMXZaSFZzWlNJc2UzWmhiSFZsT2lFd2ZTa3NjSDBvZTMwcE93b0siLG51bGwsITEpO09iamVjdC5kZWZpbmVQcm9wZXJ0eTtuZXcgY2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnNlZ21lbnRTdGF0dXM9S3QuUmVhZHl9c3RhdHVzVG9nZ2xlKCl7c3dpdGNoKHRoaXMuc2VnbWVudFN0YXR1cyl7Y2FzZSBLdC5SZWFkeTp0aGlzLnNlZ21lbnRTdGF0dXM9S3QuQ2hlY2s7YnJlYWs7Y2FzZSBLdC5DaGVjazp0aGlzLnNlZ21lbnRTdGF0dXM9S3QuRWRpdDticmVhaztjYXNlIEt0LkVkaXQ6dGhpcy5zZWdtZW50U3RhdHVzPUt0LlJlYWR5fX11cGRhdGVTdGF0dXMyRWRpdCgpe3RoaXMuc2VnbWVudFN0YXR1cz1LdC5FZGl0fXVwZGF0ZVN0YXR1czJDaGVjaygpe3RoaXMuc2VnbWVudFN0YXR1cz1LdC5DaGVja311cGRhdGVTdGF0dXMyUmVhZHkoKXt0aGlzLnNlZ21lbnRTdGF0dXM9S3QuUmVhZHl9Z2V0IGlzUmVhZHlTdGF0dXMoKXtyZXR1cm4gdGhpcy5zZWdtZW50U3RhdHVzPT09S3QuUmVhZHl9Z2V0IGlzQ2hlY2tTdGF0dXMoKXtyZXR1cm4gdGhpcy5zZWdtZW50U3RhdHVzPT09S3QuQ2hlY2t9Z2V0IGlzRWRpdFN0YXR1cygpe3JldHVybiB0aGlzLnNlZ21lbnRTdGF0dXM9PT1LdC5FZGl0fX0sbmV3IFd2KHt0eXBlOiJtb2R1bGUifSk7dmFyIEh2PWVlKChmdW5jdGlvbih0LGUpeyhmdW5jdGlvbigpe3ZhciBuLHI9IkV4cGVjdGVkIGEgZnVuY3Rpb24iLGk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLG89Il9fbG9kYXNoX3BsYWNlaG9sZGVyX18iLHM9MTYsYT0zMix1PTY0LGM9MTI4LGw9MjU2LGg9MS8wLGY9OTAwNzE5OTI1NDc0MDk5MSxwPU5hTixkPTQyOTQ5NjcyOTUsZz1kLTEseT1kPj4+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/KCh2ZS5leHBvcnRzPXZuKS5fPXZuLG1lLl89dm4pOnllLl89dm59KS5jYWxsKHRlKX0pKTtjb25zdCBadj0odCxlLG4pPT57aWYobltlXSlyZXR1cm4gbnVsbCE9PSgodCxlKT0+e2NvbnN0IG49TWF0aC5tYXgodC54LGUueCkscj1NYXRoLm1heCh0LnksZS55KSxpPU1hdGgubWluKHQueCt0LndpZHRoLGUueCtlLndpZHRoKS1uLG89TWF0aC5taW4odC55K3QuaGVpZ2h0LGUueStlLmhlaWdodCktcjtyZXR1cm4gaT49MCYmbz49MD97eDpuLHk6cix3aWR0aDppLGhlaWdodDpvfTpudWxsfSkodCx7eDowLHk6MCx3aWR0aDpuW2VdLndpZHRoLGhlaWdodDpuW2VdLmhlaWdodH0pO3JldHVybiExfTt2YXIgS3Y9T2JqZWN0LmRlZmluZVByb3BlcnR5LEp2PU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLFF2PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCR2PU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsdF89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxlXz1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLG5fPSh0LGUsbik9PmUgaW4gdD9Ldih0LGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm59KTp0W2VdPW4scl89KHQsZSk9Pntmb3IodmFyIG4gaW4gZXx8KGU9e30pKXRfLmNhbGwoZSxuKSYmbl8odCxuLGVbbl0pO2lmKCR2KWZvcih2YXIgbiBvZiAkdihlKSllXy5jYWxsKGUsbikmJm5fKHQsbixlW25dKTtyZXR1cm4gdH0saV89KHQsZSk9Pkp2KHQsUXYoZSkpO2Z1bmN0aW9uIG9fKHQpe3ZhciBlO2NvbnN0e2N1cnJlbnREYXRhOm4sZGlzcGxheVBvaW50Q2xvdWRMaXN0OnIsc2VsZWN0ZWRJRDppLGhpZ2hsaWdodEF0dHJpYnV0ZTpvLGltYWdlU2l6ZXM6cyxjb25maWc6YSxwb2x5Z29uTGlzdDp1LHNlbGVjdGVkSURzOmN9PXQsbD17ZmlsbDoidHJhbnNwYXJlbnQiLGNvbG9yOiJncmVlbiJ9O2xldCBoPVtdO3JldHVybiBudWxsPT0oZT1udWxsPT1uP3ZvaWQgMDpuLm1hcHBpbmdJbWdMaXN0KXx8ZS5mb3JFYWNoKCh0PT57dmFyIGUsbixmLHA7Y29uc3QgZD1yLnJlZHVjZSgoKGUsbik9Pnt2YXIgcix1O2NvbnN0IGM9bi5pZD09PWl8fG89PT1uLmF0dHJpYnV0ZSx7dHJhbnNmZXJWaWV3RGF0YTpoLHZpZXdSYW5nZVBvaW50TGlzdDpmfT1udWxsIT0ocj1HdihuLHQuY2FsaWIse2NyZWF0ZVJhbmdlOmN9KSk/cjp7fTtpZighaHx8IWYpcmV0dXJuW107Y29uc3QgcD1oLnJlZHVjZSgoKHQsZSk9PiJsaW5lIj09PWUudHlwZT9bLi4udCwuLi5lLnBvaW50TGlzdF06dCksW10pLGQ9aV8ocl8oe30sKHQ9PntsZXQgZT0xLzAsbj0xLzAscj0tMS8wLGk9LTEvMDtmb3IoY29uc3QgbyBvZiB0KWU9TWF0aC5taW4oZSxvLngpLG49TWF0aC5taW4obixvLnkpLHI9TWF0aC5tYXgocixvLngpLGk9TWF0aC5tYXgoaSxvLnkpO3JldHVybnt4OmUseTpuLHdpZHRoOnItZSxoZWlnaHQ6aS1ufX0pKHApKSx7aW1hZ2VOYW1lOnQucGF0aH0pO2lmKCFadihkLHQucGF0aCxzKSlyZXR1cm4gZTtjb25zdCBnPW51bGw9PSh1PUZ0LmdldENvbG9yRnJvbUNvbmZpZyh7YXR0cmlidXRlOm4uYXR0cmlidXRlfSxpXyhyXyh7fSxhKSx7YXR0cmlidXRlQ29uZmlndXJhYmxlOiEwfSkse30pKT92b2lkIDA6dS5zdHJva2UseT0oKHt2aWV3RGF0YVBvaW50TGlzdDp0LHBvaW50Q2xvdWRCb3g6ZSxkZWZhdWx0Vmlld1N0eWxlOm4sc3Ryb2tlOnJ9KT0+dD90Lm1hcCgodD0+KHt0eXBlOnQudHlwZSxhbm5vdGF0aW9uOmlfKHJfKHtpZDplLmlkLHBvaW50TGlzdDp0LnBvaW50TGlzdH0sbikse3N0cm9rZTpyfSl9KSkpOltdKSh7dmlld0RhdGFQb2ludExpc3Q6aCxwb2ludENsb3VkQm94Om4sZGVmYXVsdFZpZXdTdHlsZTpsLHN0cm9rZTpnfSksbT1bLi4uZSwuLi55XTtyZXR1cm4obnVsbD09Zj92b2lkIDA6Zi5sZW5ndGgpPjAmJm0udW5zaGlmdCh7dHlwZToicG9seWdvbiIsYW5ub3RhdGlvbjppXyhyXyh7aWQ6aSxwb2ludExpc3Q6Zn0sbCkse3N0cm9rZTpnLGZpbGw6InJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSJ9KX0pLG19KSxbXSksZz1zW251bGwhPShlPW51bGw9PXQ/dm9pZCAwOnQucGF0aCk/ZToiIl07ZyYmSHYuaXNOdW1iZXIobnVsbD09KG49bnVsbD09dD92b2lkIDA6dC5jYWxpYik/dm9pZCAwOm4uZ3JvdW5kSGVpZ2h0KSYmdS5mb3JFYWNoKChlPT57Y29uc3Qgbj1mdW5jdGlvbih0LGUsbil7dmFyIHI7aWYoIWV8fCFuKXJldHVybjtjb25zdCBpPWp2KGUpLHtQOm8sUjpzLFQ6YX09ZTtsZXQgdTtpZighMT09PWkpe2NvbnN0e2NvbXBvc2VNYXRyaXg0OnR9PW51bGwhPShyPWt2KG8scyxhKSk/cjp7fTtpZighdClyZXR1cm47dT10fWNvbnN0IGM9W107cmV0dXJuIHQuZm9yRWFjaCgodD0+e2xldCBuO2lmKG49aT9Vdih0LGUpOnUmJnF2KHQsdSksbil7Y29uc3R7eDp0LHk6ZX09bjtjLnB1c2goe3g6dCx5OmV9KX19KSksYy5zb21lKCh0PT50Lng+MCYmdC54PG4ud2lkdGgmJnQueT4wJiZ0Lnk8bi5oZWlnaHQpKT9jOnZvaWQgMH0oZS5wb2ludExpc3QubWFwKChlPT57dmFyIG47cmV0dXJuIGlfKHJfKHt9LGUpLHt6Om51bGw9PShuPW51bGw9PXQ/dm9pZCAwOnQuY2FsaWIpP3ZvaWQgMDpuLmdyb3VuZEhlaWdodH0pfSkpLG51bGw9PXQ/dm9pZCAwOnQuY2FsaWIsZyk7aWYobil7Y29uc3QgdD1GdC5nZXRDb2xvckZyb21Db25maWcoe2F0dHJpYnV0ZTplLmF0dHJpYnV0ZX0saV8ocl8oe30sYSkse2F0dHJpYnV0ZUNvbmZpZ3VyYWJsZTohMH0pLHt9KTtkLnB1c2goe3R5cGU6InBvbHlnb24iLGFubm90YXRpb246aV8ocl8oe2lkOmUuaWQscG9pbnRMaXN0Om59LGwpLHtzdHJva2U6bnVsbD09dD92b2lkIDA6dC5zdHJva2UsZmlsbDpjLmluY2x1ZGVzKGUuaWQpP251bGw9PXQ/dm9pZCAwOnQuZmlsbDoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpIn0pfSl9fSkpLGgucHVzaCh7YW5ub3RhdGlvbnM6ZCx1cmw6bnVsbD09dD92b2lkIDA6dC51cmwsZmFsbGJhY2tVcmw6bnVsbCE9KGY9bnVsbD09dD92b2lkIDA6dC5mYWxsYmFja1VybCk/ZjoiIixjYWxOYW1lOm51bGw9PShwPW51bGw9PXQ/dm9pZCAwOnQuY2FsaWIpP3ZvaWQgMDpwLmNhbE5hbWUsY2FsaWI6bnVsbD09dD92b2lkIDA6dC5jYWxpYixwYXRoOm51bGw9PXQ/dm9pZCAwOnQucGF0aH0pfSkpLGh9b25tZXNzYWdlPXQ9Pntjb25zdHtjdXJyZW50RGF0YTplLGRpc3BsYXlQb2ludENsb3VkTGlzdDpuLHNlbGVjdGVkSUQ6cixoaWdobGlnaHRBdHRyaWJ1dGU6aSxpbWFnZVNpemVzOm8sY29uZmlnOnMscG9seWdvbkxpc3Q6YSxzZWxlY3RlZElEczp1fT10LmRhdGEsYz1vXyh7Y3VycmVudERhdGE6ZSxkaXNwbGF5UG9pbnRDbG91ZExpc3Q6bixzZWxlY3RlZElEOnIsaGlnaGxpZ2h0QXR0cmlidXRlOmksaW1hZ2VTaXplczpvLGNvbmZpZzpzLHBvbHlnb25MaXN0OmEsc2VsZWN0ZWRJRHM6dX0pO3Bvc3RNZXNzYWdlKGMpfX0oKTsKCg==",null,!1);module.exports=WorkerFactory;
|