@labelbee/lb-components 1.23.0-alpha.9 → 1.23.0-alpha.90

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.
Files changed (250) hide show
  1. package/dist/App.js +1 -1
  2. package/dist/_virtual/2DViewWorker.js +1 -0
  3. package/dist/_virtual/highlightSegmentWorker.js +1 -1
  4. package/dist/assets/annotation/icon_link.svg.js +1 -0
  5. package/dist/assets/annotation/icon_unlink.svg.js +1 -0
  6. package/dist/assets/annotation/pointCloudTool/Image2DBoxScale.svg.js +1 -0
  7. package/dist/assets/annotation/pointCloudTool/leftArrow.svg.js +1 -1
  8. package/dist/assets/annotation/pointCloudTool/rightArrow.svg.js +1 -1
  9. package/dist/assets/annotation/pointCloudTool/rotate90_black.svg.js +1 -0
  10. package/dist/assets/icons/ad33251.svg +26 -0
  11. package/dist/components/AnnotationView/index.js +1 -1
  12. package/dist/components/DynamicResizer/DynamicResizer.js +1 -0
  13. package/dist/components/DynamicResizer/assets/bottomToZero.svg.js +1 -0
  14. package/dist/components/DynamicResizer/assets/divider.svg.js +1 -0
  15. package/dist/components/DynamicResizer/assets/topToZero.svg.js +1 -0
  16. package/dist/components/DynamicResizer/hooks/useDrag.js +1 -0
  17. package/dist/components/DynamicResizer/hooks/useUpdateHeight.js +1 -0
  18. package/dist/components/DynamicResizer/index.js +1 -0
  19. package/dist/components/LLMToolView/index.js +1 -1
  20. package/dist/components/LLMToolView/questionView/components/header/index.js +1 -1
  21. package/dist/components/LLMToolView/sidebar/components/textEditor/index.js +2 -2
  22. package/dist/components/LLMToolView/sidebar/components/textEditor/index.module.scss.js +1 -1
  23. package/dist/components/LLMToolView/sidebar/components/textInputBox/index.js +2 -2
  24. package/dist/components/LLMToolView/sidebar/index.js +1 -1
  25. package/dist/components/LLMToolView/utils/data.js +1 -1
  26. package/dist/components/NLPToolView/index.js +1 -1
  27. package/dist/components/audioAnnotate/audioContext/index.js +1 -1
  28. package/dist/components/audioAnnotate/audioSide/clipSidebar/index.js +2 -1
  29. package/dist/components/audioAnnotate/index.js +1 -1
  30. package/dist/components/audioAnnotate/textInput/index.js +1 -1
  31. package/dist/components/audioAnnotate/textInput/index.module.scss.js +1 -1
  32. package/dist/components/audioAnnotate/utils/dataTransform.js +1 -0
  33. package/dist/components/audioPlayer/clipRegion/index.js +1 -1
  34. package/dist/components/audioPlayer/index.js +1 -1
  35. package/dist/components/audioPlayer/useAudioCombine/index.js +3 -2
  36. package/dist/components/audioPlayer/useAudioSegment/index.js +1 -1
  37. package/dist/components/longText/index.js +1 -1
  38. package/dist/components/pointCloud2DRectOperationView/index.js +1 -1
  39. package/dist/components/pointCloud2DRectOperationView/useUpdateRectList.js +1 -0
  40. package/dist/components/pointCloud2DRectOperationView/util.js +1 -0
  41. package/dist/components/pointCloudView/PointCloud2DSingleView.js +1 -1
  42. package/dist/components/pointCloudView/PointCloud2DView.js +1 -1
  43. package/dist/components/pointCloudView/PointCloud3DView.js +1 -1
  44. package/dist/components/pointCloudView/PointCloudBackView.js +1 -1
  45. package/dist/components/pointCloudView/PointCloudContext.js +1 -1
  46. package/dist/components/pointCloudView/PointCloudInfos.js +1 -1
  47. package/dist/components/pointCloudView/PointCloudLayout.js +1 -1
  48. package/dist/components/pointCloudView/PointCloudListener.js +1 -1
  49. package/dist/components/pointCloudView/PointCloudSegment2DView.js +1 -1
  50. package/dist/components/pointCloudView/PointCloudSideView.js +1 -1
  51. package/dist/components/pointCloudView/PointCloudTopView.js +1 -1
  52. package/dist/components/pointCloudView/components/HighlightVisible/index.js +1 -1
  53. package/dist/components/pointCloudView/hooks/useBoxes.js +1 -1
  54. package/dist/components/pointCloudView/hooks/useDataLinkSwitch.js +1 -0
  55. package/dist/components/pointCloudView/hooks/useHighlight.js +1 -1
  56. package/dist/components/pointCloudView/hooks/useHistory.js +1 -1
  57. package/dist/components/pointCloudView/hooks/usePointCloudViews.js +1 -1
  58. package/dist/components/pointCloudView/hooks/usePolygon.js +1 -1
  59. package/dist/components/pointCloudView/hooks/useRotate.js +1 -1
  60. package/dist/components/pointCloudView/hooks/useRotateEdge.js +1 -0
  61. package/dist/components/pointCloudView/hooks/useSingleBox.js +1 -1
  62. package/dist/components/pointCloudView/hooks/useStatus.js +1 -1
  63. package/dist/components/pointCloudView/hooks/useTimeoutFunc.js +1 -0
  64. package/dist/components/pointCloudView/hooks/useWindowKeydownListener.js +1 -0
  65. package/dist/components/pointCloudView/index.js +1 -1
  66. package/dist/components/pointCloudView/utils/event-polyfill.js +1 -0
  67. package/dist/components/pointCloudView/utils/map.js +1 -0
  68. package/dist/components/subAttributeList/index.js +1 -0
  69. package/dist/components/videoAnnotate/videoClipTool/index.js +1 -1
  70. package/dist/components/videoAnnotate/videoTagTool/TagToolInstanceAdaptor.js +1 -1
  71. package/dist/hooks/useToolStyle.js +1 -0
  72. package/dist/index.css +140 -17
  73. package/dist/index.js +1 -1
  74. package/dist/store/Actions.js +1 -1
  75. package/dist/store/annotatedBox/index.js +1 -1
  76. package/dist/store/annotation/actionCreators.js +1 -1
  77. package/dist/store/annotation/reducer.js +1 -1
  78. package/dist/types/App.d.ts +5 -1
  79. package/dist/types/components/AnnotationView/index.d.ts +1 -0
  80. package/dist/types/components/DynamicResizer/DynamicResizer.d.ts +5 -0
  81. package/dist/types/components/DynamicResizer/hooks/useDrag.d.ts +12 -0
  82. package/dist/types/components/DynamicResizer/hooks/useUpdateHeight.d.ts +23 -0
  83. package/dist/types/components/DynamicResizer/index.d.ts +2 -0
  84. package/dist/types/components/DynamicResizer/types/interface.d.ts +17 -0
  85. package/dist/types/components/LLMToolView/utils/data.d.ts +1 -1
  86. package/dist/types/components/audioAnnotate/audioContext/index.d.ts +10 -2
  87. package/dist/types/components/audioAnnotate/textInput/index.d.ts +1 -0
  88. package/dist/types/components/audioAnnotate/utils/dataTransform.d.ts +9 -0
  89. package/dist/types/components/audioPlayer/clipRegion/index.d.ts +1 -0
  90. package/dist/types/components/audioPlayer/index.d.ts +28 -21
  91. package/dist/types/components/longText/index.d.ts +1 -0
  92. package/dist/types/components/pointCloud2DRectOperationView/index.d.ts +1 -0
  93. package/dist/types/components/pointCloud2DRectOperationView/useUpdateRectList.d.ts +2 -0
  94. package/dist/types/components/pointCloud2DRectOperationView/util.d.ts +8 -0
  95. package/dist/types/components/pointCloudView/2DViewWorker.d.ts +1 -0
  96. package/dist/types/components/pointCloudView/PointCloud2DView.d.ts +2 -1
  97. package/dist/types/components/pointCloudView/PointCloudContext.d.ts +28 -4
  98. package/dist/types/components/pointCloudView/PointCloudLayout.d.ts +1 -0
  99. package/dist/types/components/pointCloudView/components/HighlightVisible/index.d.ts +2 -1
  100. package/dist/types/components/pointCloudView/hooks/useDataLinkSwitch.d.ts +19 -0
  101. package/dist/types/components/pointCloudView/hooks/useHighlight.d.ts +1 -1
  102. package/dist/types/components/pointCloudView/hooks/usePointCloudViews.d.ts +8 -0
  103. package/dist/types/components/pointCloudView/hooks/useRotateEdge.d.ts +9 -0
  104. package/dist/types/components/pointCloudView/hooks/useSingleBox.d.ts +3 -2
  105. package/dist/types/components/pointCloudView/hooks/useTimeoutFunc.d.ts +6 -0
  106. package/dist/types/components/pointCloudView/hooks/useWindowKeydownListener.d.ts +16 -0
  107. package/dist/types/components/pointCloudView/utils/event-polyfill.d.ts +8 -0
  108. package/dist/types/components/pointCloudView/utils/map.d.ts +11 -0
  109. package/dist/types/components/subAttributeList/index.d.ts +10 -0
  110. package/dist/types/components/videoAnnotate/index.d.ts +2 -1
  111. package/dist/types/components/videoAnnotate/videoClipTool/index.d.ts +2 -1
  112. package/dist/types/components/videoAnnotate/videoTagTool/TagToolInstanceAdaptor.d.ts +1 -1
  113. package/dist/types/hooks/useToolStyle.d.ts +30 -0
  114. package/dist/types/index.d.ts +7 -2
  115. package/dist/types/store/Actions.d.ts +1 -0
  116. package/dist/types/store/annotatedBox/index.d.ts +2 -0
  117. package/dist/types/store/annotation/actionCreators.d.ts +3 -2
  118. package/dist/types/store/annotation/reducer.d.ts +1 -0
  119. package/dist/types/store/annotation/types.d.ts +9 -2
  120. package/dist/types/utils/AnnotationDataUtils.d.ts +58 -1
  121. package/dist/types/utils/ToolPointCloudBoxRenderHelper.d.ts +23 -0
  122. package/dist/types/utils/index.d.ts +31 -1
  123. package/dist/types/views/MainView/sidebar/GeneralOperation/ActionsConfirm.d.ts +1 -0
  124. package/dist/types/views/MainView/sidebar/GeneralOperation/index.d.ts +2 -0
  125. package/dist/types/views/MainView/sidebar/PointCloudToolSidebar/components/rectRotateSensitivitySlider/index.d.ts +3 -0
  126. package/dist/types/views/MainView/sidebar/TextToolSidebar/index.d.ts +1 -1
  127. package/dist/types/views/MainView/toolFooter/BatchSwitchConnectIn2DView/BatchSwitchConnectIn2DView.d.ts +9 -0
  128. package/dist/types/views/MainView/toolFooter/BatchSwitchConnectIn2DView/Icons.d.ts +3 -0
  129. package/dist/types/views/MainView/toolFooter/BatchSwitchConnectIn2DView/index.d.ts +1 -0
  130. package/dist/types/views/MainView/toolFooter/SwitchCuboidBoxIn2DView/index.d.ts +10 -2
  131. package/dist/types/views/MainView/toolFooter/index.d.ts +1 -1
  132. package/dist/types/views/MainView/toolHeader/StepSwitch/index.d.ts +1 -1
  133. package/dist/types/views/MainView/toolHeader/index.d.ts +1 -1
  134. package/dist/utils/AnnotationDataUtils.js +1 -1
  135. package/dist/utils/ToolPointCloudBoxRenderHelper.js +1 -0
  136. package/dist/utils/index.js +1 -1
  137. package/dist/views/MainView/index.js +1 -1
  138. package/dist/views/MainView/sidebar/GeneralOperation/ActionsConfirm.js +1 -1
  139. package/dist/views/MainView/sidebar/GeneralOperation/index.js +1 -1
  140. package/dist/views/MainView/sidebar/NLPSidebar/NLPAnnotatedList.js +1 -1
  141. package/dist/views/MainView/sidebar/PointCloudToolSidebar/components/rectRotateSensitivitySlider/index.js +1 -0
  142. package/dist/views/MainView/sidebar/PointCloudToolSidebar/components/rectRotateSensitivitySlider/index.module.scss.js +1 -0
  143. package/dist/views/MainView/sidebar/PointCloudToolSidebar/index.js +1 -1
  144. package/dist/views/MainView/sidebar/TagSidebar/index.js +1 -1
  145. package/dist/views/MainView/sidebar/TextToolSidebar/index.js +1 -1
  146. package/dist/views/MainView/sidebar/index.js +1 -1
  147. package/dist/views/MainView/toolFooter/BatchSwitchConnectIn2DView/BatchSwitchConnectIn2DView.js +1 -0
  148. package/dist/views/MainView/toolFooter/BatchSwitchConnectIn2DView/Icons.js +1 -0
  149. package/dist/views/MainView/toolFooter/FooterTips/ToolHotKey/pointCloud/index.js +1 -1
  150. package/dist/views/MainView/toolFooter/SwitchCuboidBoxIn2DView/index.js +1 -1
  151. package/dist/views/MainView/toolFooter/index.js +1 -1
  152. package/dist/views/MainView/toolHeader/index.js +1 -1
  153. package/es/App.js +1 -1
  154. package/es/_virtual/2DViewWorker.js +1 -0
  155. package/es/_virtual/highlightSegmentWorker.js +1 -1
  156. package/es/assets/annotation/icon_link.svg.js +1 -0
  157. package/es/assets/annotation/icon_unlink.svg.js +1 -0
  158. package/es/assets/annotation/pointCloudTool/Image2DBoxScale.svg.js +1 -0
  159. package/es/assets/annotation/pointCloudTool/leftArrow.svg.js +1 -1
  160. package/es/assets/annotation/pointCloudTool/rightArrow.svg.js +1 -1
  161. package/es/assets/annotation/pointCloudTool/rotate90_black.svg.js +1 -0
  162. package/es/components/AnnotationView/index.js +1 -1
  163. package/es/components/DynamicResizer/DynamicResizer.js +1 -0
  164. package/es/components/DynamicResizer/assets/bottomToZero.svg.js +1 -0
  165. package/es/components/DynamicResizer/assets/divider.svg.js +1 -0
  166. package/es/components/DynamicResizer/assets/topToZero.svg.js +1 -0
  167. package/es/components/DynamicResizer/hooks/useDrag.js +1 -0
  168. package/es/components/DynamicResizer/hooks/useUpdateHeight.js +1 -0
  169. package/es/components/DynamicResizer/index.js +1 -0
  170. package/es/components/LLMToolView/index.js +1 -1
  171. package/es/components/LLMToolView/questionView/components/header/index.js +1 -1
  172. package/es/components/LLMToolView/sidebar/components/textEditor/index.js +2 -2
  173. package/es/components/LLMToolView/sidebar/components/textEditor/index.module.scss.js +1 -1
  174. package/es/components/LLMToolView/sidebar/components/textInputBox/index.js +2 -2
  175. package/es/components/LLMToolView/sidebar/index.js +1 -1
  176. package/es/components/LLMToolView/utils/data.js +1 -1
  177. package/es/components/NLPToolView/index.js +1 -1
  178. package/es/components/audioAnnotate/audioContext/index.js +1 -1
  179. package/es/components/audioAnnotate/audioSide/clipSidebar/index.js +2 -1
  180. package/es/components/audioAnnotate/index.js +1 -1
  181. package/es/components/audioAnnotate/textInput/index.js +1 -1
  182. package/es/components/audioAnnotate/textInput/index.module.scss.js +1 -1
  183. package/es/components/audioAnnotate/utils/dataTransform.js +1 -0
  184. package/es/components/audioPlayer/clipRegion/index.js +1 -1
  185. package/es/components/audioPlayer/index.js +1 -1
  186. package/es/components/audioPlayer/useAudioCombine/index.js +3 -2
  187. package/es/components/audioPlayer/useAudioSegment/index.js +1 -1
  188. package/es/components/longText/index.js +1 -1
  189. package/es/components/pointCloud2DRectOperationView/index.js +1 -1
  190. package/es/components/pointCloud2DRectOperationView/useUpdateRectList.js +1 -0
  191. package/es/components/pointCloud2DRectOperationView/util.js +1 -0
  192. package/es/components/pointCloudView/PointCloud2DSingleView.js +1 -1
  193. package/es/components/pointCloudView/PointCloud2DView.js +1 -1
  194. package/es/components/pointCloudView/PointCloud3DView.js +1 -1
  195. package/es/components/pointCloudView/PointCloudBackView.js +1 -1
  196. package/es/components/pointCloudView/PointCloudContext.js +1 -1
  197. package/es/components/pointCloudView/PointCloudInfos.js +1 -1
  198. package/es/components/pointCloudView/PointCloudLayout.js +1 -1
  199. package/es/components/pointCloudView/PointCloudListener.js +1 -1
  200. package/es/components/pointCloudView/PointCloudSegment2DView.js +1 -1
  201. package/es/components/pointCloudView/PointCloudSideView.js +1 -1
  202. package/es/components/pointCloudView/PointCloudTopView.js +1 -1
  203. package/es/components/pointCloudView/components/HighlightVisible/index.js +1 -1
  204. package/es/components/pointCloudView/hooks/useBoxes.js +1 -1
  205. package/es/components/pointCloudView/hooks/useDataLinkSwitch.js +1 -0
  206. package/es/components/pointCloudView/hooks/useHighlight.js +1 -1
  207. package/es/components/pointCloudView/hooks/useHistory.js +1 -1
  208. package/es/components/pointCloudView/hooks/usePointCloudViews.js +1 -1
  209. package/es/components/pointCloudView/hooks/usePolygon.js +1 -1
  210. package/es/components/pointCloudView/hooks/useRotate.js +1 -1
  211. package/es/components/pointCloudView/hooks/useRotateEdge.js +1 -0
  212. package/es/components/pointCloudView/hooks/useSingleBox.js +1 -1
  213. package/es/components/pointCloudView/hooks/useStatus.js +1 -1
  214. package/es/components/pointCloudView/hooks/useTimeoutFunc.js +1 -0
  215. package/es/components/pointCloudView/hooks/useWindowKeydownListener.js +1 -0
  216. package/es/components/pointCloudView/index.js +1 -1
  217. package/es/components/pointCloudView/utils/event-polyfill.js +1 -0
  218. package/es/components/pointCloudView/utils/map.js +1 -0
  219. package/es/components/subAttributeList/index.js +1 -0
  220. package/es/components/videoAnnotate/videoClipTool/index.js +1 -1
  221. package/es/components/videoAnnotate/videoTagTool/TagToolInstanceAdaptor.js +1 -1
  222. package/es/hooks/useToolStyle.js +1 -0
  223. package/es/index.css +140 -17
  224. package/es/index.js +1 -1
  225. package/es/store/Actions.js +1 -1
  226. package/es/store/annotatedBox/index.js +1 -1
  227. package/es/store/annotation/actionCreators.js +1 -1
  228. package/es/store/annotation/reducer.js +1 -1
  229. package/es/utils/AnnotationDataUtils.js +1 -1
  230. package/es/utils/ToolPointCloudBoxRenderHelper.js +1 -0
  231. package/es/utils/index.js +1 -1
  232. package/es/views/MainView/index.js +1 -1
  233. package/es/views/MainView/sidebar/GeneralOperation/ActionsConfirm.js +1 -1
  234. package/es/views/MainView/sidebar/GeneralOperation/index.js +1 -1
  235. package/es/views/MainView/sidebar/NLPSidebar/NLPAnnotatedList.js +1 -1
  236. package/es/views/MainView/sidebar/PointCloudToolSidebar/components/rectRotateSensitivitySlider/index.js +1 -0
  237. package/es/views/MainView/sidebar/PointCloudToolSidebar/components/rectRotateSensitivitySlider/index.module.scss.js +1 -0
  238. package/es/views/MainView/sidebar/PointCloudToolSidebar/index.js +1 -1
  239. package/es/views/MainView/sidebar/TagSidebar/index.js +1 -1
  240. package/es/views/MainView/sidebar/TextToolSidebar/index.js +1 -1
  241. package/es/views/MainView/sidebar/index.js +1 -1
  242. package/es/views/MainView/toolFooter/BatchSwitchConnectIn2DView/BatchSwitchConnectIn2DView.js +1 -0
  243. package/es/views/MainView/toolFooter/BatchSwitchConnectIn2DView/Icons.js +1 -0
  244. package/es/views/MainView/toolFooter/FooterTips/ToolHotKey/pointCloud/index.js +1 -1
  245. package/es/views/MainView/toolFooter/SwitchCuboidBoxIn2DView/index.js +1 -1
  246. package/es/views/MainView/toolHeader/index.js +1 -1
  247. package/package.json +5 -3
  248. package/dist/assets/annotation/pointCloudTool/rotate180_black.svg.js +0 -1
  249. package/dist/assets/icons/9d70807.svg +0 -5
  250. 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("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgSWY9TWF0aC5wb3c7IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuKHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KShlKX1mdW5jdGlvbiBlKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbihlKXt2YXIgbj1mdW5jdGlvbihlLG4pe2lmKCJvYmplY3QiIT10KGUpfHwhZSlyZXR1cm4gZTt2YXIgcj1lW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09cil7dmFyIGk9ci5jYWxsKGUsbnx8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9dChpKSlyZXR1cm4gaTt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PW4/U3RyaW5nOk51bWJlcikoZSl9KGUsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT10KG4pP246bisiIn1mdW5jdGlvbiByKHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuKGkua2V5KSxpKX19ZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIGUmJnIodC5wcm90b3R5cGUsZSksbiYmcih0LG4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLHR9ZnVuY3Rpb24gbyh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9ZnVuY3Rpb24gcyh0LGUpe3JldHVybihzPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX19wcm90b19fPWUsdH0pKHQsZSl9ZnVuY3Rpb24gYSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlJiZzKHQsZSl9ZnVuY3Rpb24gdShlLG4pe2lmKG4mJigib2JqZWN0Ij09dChuKXx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pKXJldHVybiBuO2lmKHZvaWQgMCE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTtyZXR1cm4gbyhlKX1mdW5jdGlvbiBjKHQpe3JldHVybihjPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gbCh0LGUscil7cmV0dXJuKGU9bihlKSlpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPXIsdH1mdW5jdGlvbiBoKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1BcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn1mdW5jdGlvbiBmKHQpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fSh0KXx8ZnVuY3Rpb24odCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJm51bGwhPXRbU3ltYm9sLml0ZXJhdG9yXXx8bnVsbCE9dFsiQEBpdGVyYXRvciJdKXJldHVybiBBcnJheS5mcm9tKHQpfSh0KXx8ZnVuY3Rpb24odCxlKXtpZih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGgodCxlKTt2YXIgbj17fS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpO3JldHVybiJPYmplY3QiPT09biYmdC5jb25zdHJ1Y3RvciYmKG49dC5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PW58fCJTZXQiPT09bj9BcnJheS5mcm9tKHQpOiJBcmd1bWVudHMiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/aCh0LGUpOnZvaWQgMH19KHQpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gcCh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gZCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9wKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bCh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6cChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH12YXIgZz17dHlwZToibG9nZ2VyIixsb2c6ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoImxvZyIsdCl9LHdhcm46ZnVuY3Rpb24odCl7dGhpcy5vdXRwdXQoIndhcm4iLHQpfSxlcnJvcjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgiZXJyb3IiLHQpfSxvdXRwdXQ6ZnVuY3Rpb24odCxlKXtjb25zb2xlJiZjb25zb2xlW3RdfX0seT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2UodGhpcyx0KSx0aGlzLmluaXQobixyKX1yZXR1cm4gaSh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307dGhpcy5wcmVmaXg9ZS5wcmVmaXh8fCJpMThuZXh0OiIsdGhpcy5sb2dnZXI9dHx8Zyx0aGlzLm9wdGlvbnM9ZSx0aGlzLmRlYnVnPWUuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZChlLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiB0WzBdJiYodFswXT0iIi5jb25jYXQobikuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltlXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCh0aGlzLmxvZ2dlcixkKGQoe30se3ByZWZpeDoiIi5jb25jYXQodGhpcy5wcmVmaXgsIjoiKS5jb25jYXQoZSwiOiIpfSksdGhpcy5vcHRpb25zKSl9fSx7a2V5OiJjbG9uZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuKGU9ZXx8dGhpcy5vcHRpb25zKS5wcmVmaXg9ZS5wcmVmaXh8fHRoaXMucHJlZml4LG5ldyB0KHRoaXMubG9nZ2VyLGUpfX1dKSx0fSgpLG09bmV3IHksdj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtlKHRoaXMsdCksdGhpcy5vYnNlcnZlcnM9e319cmV0dXJuIGkodCxbe2tleToib24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gdC5zcGxpdCgiICIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe24ub2JzZXJ2ZXJzW3RdPW4ub2JzZXJ2ZXJzW3RdfHxbXSxuLm9ic2VydmVyc1t0XS5wdXNoKGUpfSkpLHRoaXN9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5vYnNlcnZlcnNbdF0pe2lmKCFlKXJldHVybiB2b2lkIGRlbGV0ZSB0aGlzLm9ic2VydmVyc1t0XTt0aGlzLm9ic2VydmVyc1t0XT10aGlzLm9ic2VydmVyc1t0XS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09ZX0pKX19fSx7a2V5OiJlbWl0Iix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07dGhpcy5vYnNlcnZlcnNbdF0mJltdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1t0XSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hcHBseSh2b2lkIDAsbil9KSk7dGhpcy5vYnNlcnZlcnNbIioiXSYmW10uY29uY2F0KHRoaXMub2JzZXJ2ZXJzWyIqIl0pLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuYXBwbHkoZSxbdF0uY29uY2F0KG4pKX0pKX19XSksdH0oKTtmdW5jdGlvbiBfKCl7dmFyIHQsZSxuPW5ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe3Q9bixlPXJ9KSk7cmV0dXJuIG4ucmVzb2x2ZT10LG4ucmVqZWN0PWUsbn1mdW5jdGlvbiB4KHQpe3JldHVybiBudWxsPT10PyIiOiIiK3R9ZnVuY3Rpb24gdyh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mdW5jdGlvbiBpKCl7cmV0dXJuIXR8fCJzdHJpbmciPT10eXBlb2YgdH1mb3IodmFyIG89InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7by5sZW5ndGg+MTspe2lmKGkoKSlyZXR1cm57fTt2YXIgcz1yKG8uc2hpZnQoKSk7IXRbc10mJm4mJih0W3NdPW5ldyBuKSx0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHMpP3Rbc106e319cmV0dXJuIGkoKT97fTp7b2JqOnQsazpyKG8uc2hpZnQoKSl9fWZ1bmN0aW9uIGIodCxlLG4pe3ZhciByPXcodCxlLE9iamVjdCk7ci5vYmpbci5rXT1ufWZ1bmN0aW9uIEQodCxlKXt2YXIgbj13KHQsZSkscj1uLm9iaixpPW4uaztpZihyKXJldHVybiByW2ldfWZ1bmN0aW9uIEUodCxlLG4pe3ZhciByPUQodCxuKTtyZXR1cm4gdm9pZCAwIT09cj9yOkQoZSxuKX1mdW5jdGlvbiBDKHQsZSxuKXtmb3IodmFyIHIgaW4gZSkiX19wcm90b19fIiE9PXImJiJjb25zdHJ1Y3RvciIhPT1yJiYociBpbiB0PyJzdHJpbmciPT10eXBlb2YgdFtyXXx8dFtyXWluc3RhbmNlb2YgU3RyaW5nfHwic3RyaW5nIj09dHlwZW9mIGVbcl18fGVbcl1pbnN0YW5jZW9mIFN0cmluZz9uJiYodFtyXT1lW3JdKTpDKHRbcl0sZVtyXSxuKTp0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIFModCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCJcXCQmIil9dmFyIEE9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiBOKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnJlcGxhY2UoL1smPD4iJ1wvXS9nLChmdW5jdGlvbih0KXtyZXR1cm4gQVt0XX0pKTp0fXZhciBJPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ2b2lkIDA9PT13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudERhdGEmJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIik+LTEsTT1bIiAiLCIsIiwiPyIsIiEiLCI7Il07ZnVuY3Rpb24gRih0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gVCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9GKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bCh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6RihPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBPKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1jKHQpO2lmKGUpe3ZhciBpPWModGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHUodGhpcyxuKX19ZnVuY3Rpb24gTCh0LGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXToiLiI7aWYodCl7aWYodFtlXSlyZXR1cm4gdFtlXTtmb3IodmFyIHI9ZS5zcGxpdChuKSxpPXQsbz0wO288ci5sZW5ndGg7KytvKXtpZighaXx8InN0cmluZyI9PXR5cGVvZiBpW3Jbb11dJiZvKzE8ci5sZW5ndGgpcmV0dXJuO2lmKHZvaWQgMD09PWlbcltvXV0pe2Zvcih2YXIgcz0yLGE9ci5zbGljZShvLG8rcykuam9pbihuKSx1PWlbYV07dm9pZCAwPT09dSYmci5sZW5ndGg+bytzOylzKyssdT1pW2E9ci5zbGljZShvLG8rcykuam9pbihuKV07aWYodm9pZCAwPT09dSlyZXR1cm47aWYobnVsbD09PXUpcmV0dXJuIG51bGw7aWYoZS5lbmRzV2l0aChhKSl7aWYoInN0cmluZyI9PXR5cGVvZiB1KXJldHVybiB1O2lmKGEmJiJzdHJpbmciPT10eXBlb2YgdVthXSlyZXR1cm4gdVthXX12YXIgYz1yLnNsaWNlKG8rcykuam9pbihuKTtyZXR1cm4gYz9MKHUsYyxuKTp2b2lkIDB9aT1pW3Jbb11dfXJldHVybiBpfX12YXIgUD1mdW5jdGlvbih0KXthKHIsdCk7dmFyIG49TyhyKTtmdW5jdGlvbiByKHQpe3ZhciBpLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOiJ0cmFuc2xhdGlvbiJ9O3JldHVybiBlKHRoaXMsciksaT1uLmNhbGwodGhpcyksSSYmdi5jYWxsKG8oaSkpLGkuZGF0YT10fHx7fSxpLm9wdGlvbnM9cyx2b2lkIDA9PT1pLm9wdGlvbnMua2V5U2VwYXJhdG9yJiYoaS5vcHRpb25zLmtleVNlcGFyYXRvcj0iLiIpLHZvaWQgMD09PWkub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlJiYoaS5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmU9ITApLGl9cmV0dXJuIGkocixbe2tleToiYWRkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm5zLmluZGV4T2YodCk8MCYmdGhpcy5vcHRpb25zLm5zLnB1c2godCl9fSx7a2V5OiJyZW1vdmVOYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTtlPi0xJiZ0aGlzLm9wdGlvbnMubnMuc3BsaWNlKGUsMSl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxpPXZvaWQgMCE9PXIua2V5U2VwYXJhdG9yP3Iua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3Isbz12b2lkIDAhPT1yLmlnbm9yZUpTT05TdHJ1Y3R1cmU/ci5pZ25vcmVKU09OU3RydWN0dXJlOnRoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlLHM9W3QsZV07biYmInN0cmluZyIhPXR5cGVvZiBuJiYocz1zLmNvbmNhdChuKSksbiYmInN0cmluZyI9PXR5cGVvZiBuJiYocz1zLmNvbmNhdChpP24uc3BsaXQoaSk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYocz10LnNwbGl0KCIuIikpO3ZhciBhPUQodGhpcy5kYXRhLHMpO3JldHVybiBhfHwhb3x8InN0cmluZyIhPXR5cGVvZiBuP2E6TCh0aGlzLmRhdGEmJnRoaXMuZGF0YVt0XSYmdGhpcy5kYXRhW3RdW2VdLG4saSl9fSx7a2V5OiJhZGRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOntzaWxlbnQ6ITF9LG89dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcjt2b2lkIDA9PT1vJiYobz0iLiIpO3ZhciBzPVt0LGVdO24mJihzPXMuY29uY2F0KG8/bi5zcGxpdChvKTpuKSksdC5pbmRleE9mKCIuIik+LTEmJihyPWUsZT0ocz10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSksYih0aGlzLmRhdGEscyxyKSxpLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4scil9fSx7a2V5OiJhZGRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e3NpbGVudDohMX07Zm9yKHZhciBpIGluIG4pKCJzdHJpbmciPT10eXBlb2YgbltpXXx8IltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkobltpXSkpJiZ0aGlzLmFkZFJlc291cmNlKHQsZSxpLG5baV0se3NpbGVudDohMH0pO3Iuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e3NpbGVudDohMX0scz1bdCxlXTt0LmluZGV4T2YoIi4iKT4tMSYmKHI9bixuPWUsZT0ocz10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSk7dmFyIGE9RCh0aGlzLmRhdGEscyl8fHt9O3I/QyhhLG4saSk6YT1UKFQoe30sYSksbiksYih0aGlzLmRhdGEscyxhKSxvLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsdCxlLG4pfX0se2tleToicmVtb3ZlUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5oYXNSZXNvdXJjZUJ1bmRsZSh0LGUpJiZkZWxldGUgdGhpcy5kYXRhW3RdW2VdLHRoaXMucmVtb3ZlTmFtZXNwYWNlcyhlKSx0aGlzLmVtaXQoInJlbW92ZWQiLHQsZSl9fSx7a2V5OiJoYXNSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5nZXRSZXNvdXJjZSh0LGUpfX0se2tleToiZ2V0UmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fChlPXRoaXMub3B0aW9ucy5kZWZhdWx0TlMpLCJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQST9UKFQoe30se30pLHRoaXMuZ2V0UmVzb3VyY2UodCxlKSk6dGhpcy5nZXRSZXNvdXJjZSh0LGUpfX0se2tleToiZ2V0RGF0YUJ5TGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGFbdF19fSx7a2V5OiJoYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RGF0YUJ5TGFuZ3VhZ2UodCk7cmV0dXJuISEoZSYmT2JqZWN0LmtleXMoZSl8fFtdKS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XSYmT2JqZWN0LmtleXMoZVt0XSkubGVuZ3RoPjB9KSl9fSx7a2V5OiJ0b0pTT04iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YX19XSkscn0odiksUj17cHJvY2Vzc29yczp7fSxhZGRQb3N0UHJvY2Vzc29yOmZ1bmN0aW9uKHQpe3RoaXMucHJvY2Vzc29yc1t0Lm5hbWVdPXR9LGhhbmRsZTpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXRoaXM7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7by5wcm9jZXNzb3JzW3RdJiYoZT1vLnByb2Nlc3NvcnNbdF0ucHJvY2VzcyhlLG4scixpKSl9KSksZX19O2Z1bmN0aW9uIEIodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIGsodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/QihPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOkIoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24geih0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9Yyh0KTtpZihlKXt2YXIgaT1jKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB1KHRoaXMsbil9fXZhciBqPXt9LFU9ZnVuY3Rpb24obil7YShzLG4pO3ZhciByPXoocyk7ZnVuY3Rpb24gcyh0KXt2YXIgbixpPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4gZSh0aGlzLHMpLG49ci5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKG4pKSxmdW5jdGlvbih0LGUsbil7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3RdJiYoblt0XT1lW3RdKX0pKX0oWyJyZXNvdXJjZVN0b3JlIiwibGFuZ3VhZ2VVdGlscyIsInBsdXJhbFJlc29sdmVyIiwiaW50ZXJwb2xhdG9yIiwiYmFja2VuZENvbm5lY3RvciIsImkxOG5Gb3JtYXQiLCJ1dGlscyJdLHQsbyhuKSksbi5vcHRpb25zPWksdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxuLmxvZ2dlcj1tLmNyZWF0ZSgidHJhbnNsYXRvciIpLG59cmV0dXJuIGkocyxbe2tleToiY2hhbmdlTGFuZ3VhZ2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3QmJih0aGlzLmxhbmd1YWdlPXQpfX0se2tleToiZXhpc3RzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319O2lmKG51bGw9PXQpcmV0dXJuITE7dmFyIG49dGhpcy5yZXNvbHZlKHQsZSk7cmV0dXJuIG4mJnZvaWQgMCE9PW4ucmVzfX0se2tleToiZXh0cmFjdEZyb21LZXkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dm9pZCAwIT09ZS5uc1NlcGFyYXRvcj9lLm5zU2VwYXJhdG9yOnRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjt2b2lkIDA9PT1uJiYobj0iOiIpO3ZhciByPXZvaWQgMCE9PWUua2V5U2VwYXJhdG9yP2Uua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsaT1lLm5zfHx0aGlzLm9wdGlvbnMuZGVmYXVsdE5TfHxbXSxvPW4mJnQuaW5kZXhPZihuKT4tMSxzPSEodGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkS2V5U2VwYXJhdG9yfHxlLmtleVNlcGFyYXRvcnx8dGhpcy5vcHRpb25zLnVzZXJEZWZpbmVkTnNTZXBhcmF0b3J8fGUubnNTZXBhcmF0b3J8fGZ1bmN0aW9uKHQsZSxuKXtlPWV8fCIiLG49bnx8IiI7dmFyIHI9TS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmluZGV4T2YodCk8MCYmbi5pbmRleE9mKHQpPDB9KSk7aWYoMD09PXIubGVuZ3RoKXJldHVybiEwO3ZhciBpPW5ldyBSZWdFeHAoIigiLmNvbmNhdChyLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIj8iPT09dD8iXFw/Ijp0fSkpLmpvaW4oInwiKSwiKSIpKSxvPSFpLnRlc3QodCk7aWYoIW8pe3ZhciBzPXQuaW5kZXhPZihuKTtzPjAmJiFpLnRlc3QodC5zdWJzdHJpbmcoMCxzKSkmJihvPSEwKX1yZXR1cm4gb30odCxuLHIpKTtpZihvJiYhcyl7dmFyIGE9dC5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtpZihhJiZhLmxlbmd0aD4wKXJldHVybntrZXk6dCxuYW1lc3BhY2VzOml9O3ZhciB1PXQuc3BsaXQobik7KG4hPT1yfHxuPT09ciYmdGhpcy5vcHRpb25zLm5zLmluZGV4T2YodVswXSk+LTEpJiYoaT11LnNoaWZ0KCkpLHQ9dS5qb2luKHIpfXJldHVybiJzdHJpbmciPT10eXBlb2YgaSYmKGk9W2ldKSx7a2V5OnQsbmFtZXNwYWNlczppfX19LHtrZXk6InRyYW5zbGF0ZSIsdmFsdWU6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPXRoaXM7aWYoIm9iamVjdCIhPT10KG4pJiZ0aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXImJihuPXRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihhcmd1bWVudHMpKSxufHwobj17fSksbnVsbD09ZSlyZXR1cm4iIjtBcnJheS5pc0FycmF5KGUpfHwoZT1bU3RyaW5nKGUpXSk7dmFyIG89dm9pZCAwIT09bi5yZXR1cm5EZXRhaWxzP24ucmV0dXJuRGV0YWlsczp0aGlzLm9wdGlvbnMucmV0dXJuRGV0YWlscyxhPXZvaWQgMCE9PW4ua2V5U2VwYXJhdG9yP24ua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsdT10aGlzLmV4dHJhY3RGcm9tS2V5KGVbZS5sZW5ndGgtMV0sbiksYz11LmtleSxsPXUubmFtZXNwYWNlcyxoPWxbbC5sZW5ndGgtMV0sZj1uLmxuZ3x8dGhpcy5sYW5ndWFnZSxwPW4uYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGV8fHRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZTtpZihmJiYiY2ltb2RlIj09PWYudG9Mb3dlckNhc2UoKSl7aWYocCl7dmFyIGQ9bi5uc1NlcGFyYXRvcnx8dGhpcy5vcHRpb25zLm5zU2VwYXJhdG9yO3JldHVybiBvPyhnLnJlcz0iIi5jb25jYXQoaCkuY29uY2F0KGQpLmNvbmNhdChjKSxnKToiIi5jb25jYXQoaCkuY29uY2F0KGQpLmNvbmNhdChjKX1yZXR1cm4gbz8oZy5yZXM9YyxnKTpjfXZhciBnPXRoaXMucmVzb2x2ZShlLG4pLHk9ZyYmZy5yZXMsbT1nJiZnLnVzZWRLZXl8fGMsdj1nJiZnLmV4YWN0VXNlZEtleXx8YyxfPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoeSkseD12b2lkIDAhPT1uLmpvaW5BcnJheXM/bi5qb2luQXJyYXlzOnRoaXMub3B0aW9ucy5qb2luQXJyYXlzLHc9IXRoaXMuaTE4bkZvcm1hdHx8dGhpcy5pMThuRm9ybWF0LmhhbmRsZUFzT2JqZWN0O2lmKHcmJnkmJigic3RyaW5nIiE9dHlwZW9mIHkmJiJib29sZWFuIiE9dHlwZW9mIHkmJiJudW1iZXIiIT10eXBlb2YgeSkmJlsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXS5pbmRleE9mKF8pPDAmJigic3RyaW5nIiE9dHlwZW9mIHh8fCJbb2JqZWN0IEFycmF5XSIhPT1fKSl7aWYoIW4ucmV0dXJuT2JqZWN0cyYmIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKXt0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyfHx0aGlzLmxvZ2dlci53YXJuKCJhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEiKTt2YXIgYj10aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyP3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIobSx5LGsoayh7fSxuKSx7fSx7bnM6bH0pKToia2V5ICciLmNvbmNhdChjLCIgKCIpLmNvbmNhdCh0aGlzLmxhbmd1YWdlLCIpJyByZXR1cm5lZCBhbiBvYmplY3QgaW5zdGVhZCBvZiBzdHJpbmcuIik7cmV0dXJuIG8/KGcucmVzPWIsZyk6Yn1pZihhKXt2YXIgRD0iW29iamVjdCBBcnJheV0iPT09XyxFPUQ/W106e30sQz1EP3Y6bTtmb3IodmFyIFMgaW4geSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeSxTKSl7dmFyIEE9IiIuY29uY2F0KEMpLmNvbmNhdChhKS5jb25jYXQoUyk7RVtTXT10aGlzLnRyYW5zbGF0ZShBLGsoayh7fSxuKSx7am9pbkFycmF5czohMSxuczpsfSkpLEVbU109PT1BJiYoRVtTXT15W1NdKX15PUV9fWVsc2UgaWYodyYmInN0cmluZyI9PXR5cGVvZiB4JiYiW29iamVjdCBBcnJheV0iPT09XykoeT15LmpvaW4oeCkpJiYoeT10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKHksZSxuLHIpKTtlbHNle3ZhciBOPSExLEk9ITEsTT12b2lkIDAhPT1uLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIG4uY291bnQsRj1zLmhhc0RlZmF1bHRWYWx1ZShuKSxUPU0/dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoZixuLmNvdW50LG4pOiIiLE89blsiZGVmYXVsdFZhbHVlIi5jb25jYXQoVCldfHxuLmRlZmF1bHRWYWx1ZTshdGhpcy5pc1ZhbGlkTG9va3VwKHkpJiZGJiYoTj0hMCx5PU8pLHRoaXMuaXNWYWxpZExvb2t1cCh5KXx8KEk9ITAseT1jKTt2YXIgTD0obi5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXl8fHRoaXMub3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXkpJiZJP3ZvaWQgMDp5LFA9RiYmTyE9PXkmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKEl8fE58fFApe2lmKHRoaXMubG9nZ2VyLmxvZyhQPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixmLGgsYyxQP086eSksYSl7dmFyIFI9dGhpcy5yZXNvbHZlKGMsayhrKHt9LG4pLHt9LHtrZXlTZXBhcmF0b3I6ITF9KSk7UiYmUi5yZXMmJnRoaXMubG9nZ2VyLndhcm4oIlNlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4iKX12YXIgQj1bXSx6PXRoaXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxuLmxuZ3x8dGhpcy5sYW5ndWFnZSk7aWYoImZhbGxiYWNrIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvJiZ6JiZ6WzBdKWZvcih2YXIgaj0wO2o8ei5sZW5ndGg7aisrKUIucHVzaCh6W2pdKTtlbHNlImFsbCI9PT10aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz9CPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobi5sbmd8fHRoaXMubGFuZ3VhZ2UpOkIucHVzaChuLmxuZ3x8dGhpcy5sYW5ndWFnZSk7dmFyIFU9ZnVuY3Rpb24odCxlLHIpe3ZhciBvPUYmJnIhPT15P3I6TDtpLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXI/aS5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyKHQsaCxlLG8sUCxuKTppLmJhY2tlbmRDb25uZWN0b3ImJmkuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyYmaS5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nKHQsaCxlLG8sUCxuKSxpLmVtaXQoIm1pc3NpbmdLZXkiLHQsaCxlLHkpfTt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmcmJih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZNP0IuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXhlcyh0LG4pLmZvckVhY2goKGZ1bmN0aW9uKGUpe1UoW3RdLGMrZSxuWyJkZWZhdWx0VmFsdWUiLmNvbmNhdChlKV18fE8pfSkpfSkpOlUoQixjLE8pKX15PXRoaXMuZXh0ZW5kVHJhbnNsYXRpb24oeSxlLG4sZyxyKSxJJiZ5PT09YyYmdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSYmKHk9IiIuY29uY2F0KGgsIjoiKS5jb25jYXQoYykpLChJfHxOKSYmdGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXImJih5PSJ2MSIhPT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQST90aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcih0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5PyIiLmNvbmNhdChoLCI6IikuY29uY2F0KGMpOmMsTj95OnZvaWQgMCk6dGhpcy5vcHRpb25zLnBhcnNlTWlzc2luZ0tleUhhbmRsZXIoeSkpfXJldHVybiBvPyhnLnJlcz15LGcpOnl9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKXQ9dGhpcy5pMThuRm9ybWF0LnBhcnNlKHQsayhrKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLG4pLHIudXNlZExuZyxyLnVzZWROUyxyLnVzZWRLZXkse3Jlc29sdmVkOnJ9KTtlbHNlIGlmKCFuLnNraXBJbnRlcnBvbGF0aW9uKXtuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLmluaXQoayhrKHt9LG4pLHtpbnRlcnBvbGF0aW9uOmsoayh7fSx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiksbi5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgcyxhPSJzdHJpbmciPT10eXBlb2YgdCYmKG4mJm4uaW50ZXJwb2xhdGlvbiYmdm9pZCAwIT09bi5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcz9uLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzOnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcyk7aWYoYSl7dmFyIHU9dC5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtzPXUmJnUubGVuZ3RofXZhciBjPW4ucmVwbGFjZSYmInN0cmluZyIhPXR5cGVvZiBuLnJlcGxhY2U/bi5yZXBsYWNlOm47aWYodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyYmKGM9ayhrKHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMpLGMpKSx0PXRoaXMuaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKHQsYyxuLmxuZ3x8dGhpcy5sYW5ndWFnZSxuKSxhKXt2YXIgbD10Lm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO3M8KGwmJmwubGVuZ3RoKSYmKG4ubmVzdD0hMSl9ITEhPT1uLm5lc3QmJih0PXRoaXMuaW50ZXJwb2xhdG9yLm5lc3QodCwoZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheSh0KSxzPTA7czx0O3MrKylyW3NdPWFyZ3VtZW50c1tzXTtyZXR1cm4gaSYmaVswXT09PXJbMF0mJiFuLmNvbnRleHQ/KG8ubG9nZ2VyLndhcm4oIkl0IHNlZW1zIHlvdSBhcmUgbmVzdGluZyByZWN1cnNpdmVseSBrZXk6ICIuY29uY2F0KHJbMF0sIiBpbiBrZXk6ICIpLmNvbmNhdChlWzBdKSksbnVsbCk6by50cmFuc2xhdGUuYXBwbHkobyxyLmNvbmNhdChbZV0pKX0pLG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIGg9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLGY9InN0cmluZyI9PXR5cGVvZiBoP1toXTpoO3JldHVybiBudWxsIT10JiZmJiZmLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKHQ9Ui5oYW5kbGUoZix0LGUsdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMucG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQ/ayh7aTE4blJlc29sdmVkOnJ9LG4pOm4sdGhpcykpLHR9fSx7a2V5OiJyZXNvbHZlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHM9dGhpcyxhPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighcy5pc1ZhbGlkTG9va3VwKGUpKXt2YXIgdT1zLmV4dHJhY3RGcm9tS2V5KHQsYSksYz11LmtleTtuPWM7dmFyIGw9dS5uYW1lc3BhY2VzO3Mub3B0aW9ucy5mYWxsYmFja05TJiYobD1sLmNvbmNhdChzLm9wdGlvbnMuZmFsbGJhY2tOUykpO3ZhciBoPXZvaWQgMCE9PWEuY291bnQmJiJzdHJpbmciIT10eXBlb2YgYS5jb3VudCxmPWgmJiFhLm9yZGluYWwmJjA9PT1hLmNvdW50JiZzLnBsdXJhbFJlc29sdmVyLnNob3VsZFVzZUludGxBcGkoKSxwPXZvaWQgMCE9PWEuY29udGV4dCYmKCJzdHJpbmciPT10eXBlb2YgYS5jb250ZXh0fHwibnVtYmVyIj09dHlwZW9mIGEuY29udGV4dCkmJiIiIT09YS5jb250ZXh0LGQ9YS5sbmdzP2EubG5nczpzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KGEubG5nfHxzLmxhbmd1YWdlLGEuZmFsbGJhY2tMbmcpO2wuZm9yRWFjaCgoZnVuY3Rpb24odCl7cy5pc1ZhbGlkTG9va3VwKGUpfHwobz10LCFqWyIiLmNvbmNhdChkWzBdLCItIikuY29uY2F0KHQpXSYmcy51dGlscyYmcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UmJiFzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZShvKSYmKGpbIiIuY29uY2F0KGRbMF0sIi0iKS5jb25jYXQodCldPSEwLHMubG9nZ2VyLndhcm4oJ2tleSAiJy5jb25jYXQobiwnIiBmb3IgbGFuZ3VhZ2VzICInKS5jb25jYXQoZC5qb2luKCIsICIpLCciIHdvblwndCBnZXQgcmVzb2x2ZWQgYXMgbmFtZXNwYWNlICInKS5jb25jYXQobywnIiB3YXMgbm90IHlldCBsb2FkZWQnKSwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIikpLGQuZm9yRWFjaCgoZnVuY3Rpb24obil7aWYoIXMuaXNWYWxpZExvb2t1cChlKSl7aT1uO3ZhciBvLHU9W2NdO2lmKHMuaTE4bkZvcm1hdCYmcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMpcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXModSxjLG4sdCxhKTtlbHNle3ZhciBsO2gmJihsPXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KG4sYS5jb3VudCxhKSk7dmFyIGQ9IiIuY29uY2F0KHMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IsInplcm8iKTtpZihoJiYodS5wdXNoKGMrbCksZiYmdS5wdXNoKGMrZCkpLHApe3ZhciBnPSIiLmNvbmNhdChjKS5jb25jYXQocy5vcHRpb25zLmNvbnRleHRTZXBhcmF0b3IpLmNvbmNhdChhLmNvbnRleHQpO3UucHVzaChnKSxoJiYodS5wdXNoKGcrbCksZiYmdS5wdXNoKGcrZCkpfX1mb3IoO289dS5wb3AoKTspcy5pc1ZhbGlkTG9va3VwKGUpfHwocj1vLGU9cy5nZXRSZXNvdXJjZShuLHQsbyxhKSl9fSkpKX0pKX19KSkse3JlczplLHVzZWRLZXk6bixleGFjdFVzZWRLZXk6cix1c2VkTG5nOmksdXNlZE5TOm99fX0se2tleToiaXNWYWxpZExvb2t1cCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuISh2b2lkIDA9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybk51bGwmJm51bGw9PT10fHwhdGhpcy5vcHRpb25zLnJldHVybkVtcHR5U3RyaW5nJiYiIj09PXQpfX0se2tleToiZ2V0UmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e307cmV0dXJuIHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlP3RoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZSh0LGUsbixyKTp0aGlzLnJlc291cmNlU3RvcmUuZ2V0UmVzb3VyY2UodCxlLG4scil9fV0sW3trZXk6Imhhc0RlZmF1bHRWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9ImRlZmF1bHRWYWx1ZSI7Zm9yKHZhciBuIGluIHQpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJmU9PT1uLnN1YnN0cmluZygwLDEyKSYmdm9pZCAwIT09dFtuXSlyZXR1cm4hMDtyZXR1cm4hMX19XSksc30odik7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfXZhciBWPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuKXtlKHRoaXMsdCksdGhpcy5vcHRpb25zPW4sdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1tLmNyZWF0ZSgibGFuZ3VhZ2VVdGlscyIpfXJldHVybiBpKHQsW3trZXk6ImdldFNjcmlwdFBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIG51bGw7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiAyPT09ZS5sZW5ndGh8fChlLnBvcCgpLCJ4Ij09PWVbZS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKSk/bnVsbDp0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlLmpvaW4oIi0iKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIHQ7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMSl7dmFyIGU9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/bj1uLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKX0pKToyPT09bi5sZW5ndGg/KG5bMF09blswXS50b0xvd2VyQ2FzZSgpLG5bMV09blsxXS50b1VwcGVyQ2FzZSgpLGUuaW5kZXhPZihuWzFdLnRvTG93ZXJDYXNlKCkpPi0xJiYoblsxXT1xKG5bMV0udG9Mb3dlckNhc2UoKSkpKTozPT09bi5sZW5ndGgmJihuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSwyPT09blsxXS5sZW5ndGgmJihuWzFdPW5bMV0udG9VcHBlckNhc2UoKSksInNnbiIhPT1uWzBdJiYyPT09blsyXS5sZW5ndGgmJihuWzJdPW5bMl0udG9VcHBlckNhc2UoKSksZS5pbmRleE9mKG5bMV0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzFdPXEoblsxXS50b0xvd2VyQ2FzZSgpKSksZS5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPXEoblsyXS50b0xvd2VyQ2FzZSgpKSkpLG4uam9pbigiLSIpfXJldHVybiB0aGlzLm9wdGlvbnMuY2xlYW5Db2RlfHx0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nP3QudG9Mb3dlckNhc2UoKTp0fX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO3JldHVybiB0Pyh0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmZvcm1hdExhbmd1YWdlQ29kZSh0KTsoIW4ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHxuLmlzU3VwcG9ydGVkQ29kZShyKSkmJihlPXIpfX0pKSwhZSYmdGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3MmJnQuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIWUpe3ZhciByPW4uZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCk7aWYobi5pc1N1cHBvcnRlZENvZGUocikpcmV0dXJuIGU9cjtlPW4ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzLmZpbmQoKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YocikpcmV0dXJuIHR9KSl9fSkpLGV8fChlPXRoaXMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpWzBdKSxlKTpudWxsfX0se2tleToiZ2V0RmFsbGJhY2tDb2RlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXtpZighdClyZXR1cm5bXTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dChlKSksInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLCJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KHQpKXJldHVybiB0O2lmKCFlKXJldHVybiB0LmRlZmF1bHR8fFtdO3ZhciBuPXRbZV07cmV0dXJuIG58fChuPXRbdGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUoZSldKSxufHwobj10W3RoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGUpXSksbnx8KG49dFt0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGUpXSksbnx8KG49dC5kZWZhdWx0KSxufHxbXX19LHtrZXk6InRvUmVzb2x2ZUhpZXJhcmNoeSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dGhpcy5nZXRGYWxsYmFja0NvZGVzKGV8fHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZ3x8W10sdCksaT1bXSxvPWZ1bmN0aW9uKHQpeyF0fHwobi5pc1N1cHBvcnRlZENvZGUodCk/aS5wdXNoKHQpOm4ubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdCh0KSkpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigiLSIpPi0xPygibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZvKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSwibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiYiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJm8odGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUodCkpLCJjdXJyZW50T25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmbyh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSk6InN0cmluZyI9PXR5cGVvZiB0JiZvKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSxyLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuaW5kZXhPZih0KTwwJiZvKG4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKX0pKSxpfX1dKSx0fSgpLEc9W3tsbmdzOlsiYWNoIiwiYWsiLCJhbSIsImFybiIsImJyIiwiZmlsIiwiZ3VuIiwibG4iLCJtZmUiLCJtZyIsIm1pIiwib2MiLCJwdCIsInB0LUJSIiwidGciLCJ0bCIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtrIiwia24iLCJrdSIsImxiIiwibWFpIiwibWwiLCJtbiIsIm1yIiwibmFoIiwibmFwIiwibmIiLCJuZSIsIm5sIiwibm4iLCJubyIsIm5zbyIsInBhIiwicGFwIiwicG1zIiwicHMiLCJwdC1QVCIsInJtIiwic2NvIiwic2UiLCJzaSIsInNvIiwic29uIiwic3EiLCJzdiIsInN3IiwidGEiLCJ0ZSIsInRrIiwidXIiLCJ5byJdLG5yOlsxLDJdLGZjOjJ9LHtsbmdzOlsiYXkiLCJibyIsImNnZyIsImZhIiwiaHQiLCJpZCIsImphIiwiamJvIiwia2EiLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sWT17MTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ+MSl9LDI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxIT10KX0sMzpmdW5jdGlvbih0KXtyZXR1cm4gMH0sNDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTA9PTEmJnQlMTAwIT0xMT8wOnQlMTA+PTImJnQlMTA8PTQmJih0JTEwMDwxMHx8dCUxMDA+PTIwKT8xOjIpfSw1OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMD09dD8wOjE9PXQ/MToyPT10PzI6dCUxMDA+PTMmJnQlMTAwPD0xMD8zOnQlMTAwPj0xMT80OjUpfSw2OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOnQ+PTImJnQ8PTQ/MToyKX0sNzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDp0JTEwPj0yJiZ0JTEwPD00JiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sODpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6OCE9dCYmMTEhPXQ/MjozKX0sOTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQ+PTIpfSwxMDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6dDw3PzI6dDwxMT8zOjQpfSwxMTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXR8fDExPT10PzA6Mj09dHx8MTI9PXQ/MTp0PjImJnQ8MjA/MjozKX0sMTI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwIT0xfHx0JTEwMD09MTEpfSwxMzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDAhPT10KX0sMTQ6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOjM9PXQ/MjozKX0sMTU6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDp0JTEwPj0yJiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sMTY6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDowIT09dD8xOjIpfSwxNzpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXR8fHQlMTA9PTEmJnQlMTAwIT0xMT8wOjEpfSwxODpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDA9PXQ/MDoxPT10PzE6Mil9LDE5OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjA9PXR8fHQlMTAwPjEmJnQlMTAwPDExPzE6dCUxMDA+MTAmJnQlMTAwPDIwPzI6Myl9LDIwOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjA9PXR8fHQlMTAwPjAmJnQlMTAwPDIwPzE6Mil9LDIxOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMDA9PTE/MTp0JTEwMD09Mj8yOnQlMTAwPT0zfHx0JTEwMD09ND8zOjApfSwyMjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDoyPT10PzE6KHQ8MHx8dD4xMCkmJnQlMTA9PTA/MjozKX19LFg9WyJ2MSIsInYyIiwidjMiXSxXPXt6ZXJvOjAsb25lOjEsdHdvOjIsZmV3OjMsbWFueTo0LG90aGVyOjV9O3ZhciBIPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307ZSh0aGlzLHQpLHRoaXMubGFuZ3VhZ2VVdGlscz1uLHRoaXMub3B0aW9ucz1yLHRoaXMubG9nZ2VyPW0uY3JlYXRlKCJwbHVyYWxSZXNvbHZlciIpLCghdGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OfHwidjQiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgSW50bHx8IUludGwuUGx1cmFsUnVsZXMpJiYodGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OPSJ2MyIsdGhpcy5sb2dnZXIuZXJyb3IoIllvdXIgZW52aXJvbm1lbnQgc2VlbXMgbm90IHRvIGJlIEludGwgQVBJIGNvbXBhdGlibGUsIHVzZSBhbiBJbnRsLlBsdXJhbFJ1bGVzIHBvbHlmaWxsLiBXaWxsIGZhbGxiYWNrIHRvIHRoZSBjb21wYXRpYmlsaXR5SlNPTiB2MyBmb3JtYXQgaGFuZGxpbmcuIikpLHRoaXMucnVsZXM9ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gRy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmxuZ3MuZm9yRWFjaCgoZnVuY3Rpb24obil7dFtuXT17bnVtYmVyczplLm5yLHBsdXJhbHM6WVtlLmZjXX19KSl9KSksdH0oKX1yZXR1cm4gaSh0LFt7a2V5OiJhZGRSdWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucnVsZXNbdF09ZX19LHtrZXk6ImdldFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZih0aGlzLnNob3VsZFVzZUludGxBcGkoKSl0cnl7cmV0dXJuIG5ldyBJbnRsLlBsdXJhbFJ1bGVzKHQse3R5cGU6ZS5vcmRpbmFsPyJvcmRpbmFsIjoiY2FyZGluYWwifSl9Y2F0Y2godCl7cmV0dXJufXJldHVybiB0aGlzLnJ1bGVzW3RdfHx0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KV19fSx7a2V5OiJuZWVkc1BsdXJhbCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49dGhpcy5nZXRSdWxlKHQsZSk7cmV0dXJuIHRoaXMuc2hvdWxkVXNlSW50bEFwaSgpP24mJm4ucmVzb2x2ZWRPcHRpb25zKCkucGx1cmFsQ2F0ZWdvcmllcy5sZW5ndGg+MTpuJiZuLm51bWJlcnMubGVuZ3RoPjF9fSx7a2V5OiJnZXRQbHVyYWxGb3Jtc09mS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fTtyZXR1cm4gdGhpcy5nZXRTdWZmaXhlcyh0LG4pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIiIuY29uY2F0KGUpLmNvbmNhdCh0KX0pKX19LHtrZXk6ImdldFN1ZmZpeGVzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LHI9dGhpcy5nZXRSdWxlKHQsbik7cmV0dXJuIHI/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/ci5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdbdF0tV1tlXX0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIiLmNvbmNhdChlLm9wdGlvbnMucHJlcGVuZCkuY29uY2F0KHQpfSkpOnIubnVtYmVycy5tYXAoKGZ1bmN0aW9uKHIpe3JldHVybiBlLmdldFN1ZmZpeCh0LHIsbil9KSk6W119fSx7a2V5OiJnZXRTdWZmaXgiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LHI9dGhpcy5nZXRSdWxlKHQsbik7cmV0dXJuIHI/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/IiIuY29uY2F0KHRoaXMub3B0aW9ucy5wcmVwZW5kKS5jb25jYXQoci5zZWxlY3QoZSkpOnRoaXMuZ2V0U3VmZml4UmV0cm9Db21wYXRpYmxlKHIsZSk6KHRoaXMubG9nZ2VyLndhcm4oIm5vIHBsdXJhbCBydWxlIGZvdW5kIGZvcjogIi5jb25jYXQodCkpLCIiKX19LHtrZXk6ImdldFN1ZmZpeFJldHJvQ29tcGF0aWJsZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9dC5ub0Ficz90LnBsdXJhbHMoZSk6dC5wbHVyYWxzKE1hdGguYWJzKGUpKSxpPXQubnVtYmVyc1tyXTt0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT10Lm51bWJlcnMubGVuZ3RoJiYxPT09dC5udW1iZXJzWzBdJiYoMj09PWk/aT0icGx1cmFsIjoxPT09aSYmKGk9IiIpKTt2YXIgbz1mdW5jdGlvbigpe3JldHVybiBuLm9wdGlvbnMucHJlcGVuZCYmaS50b1N0cmluZygpP24ub3B0aW9ucy5wcmVwZW5kK2kudG9TdHJpbmcoKTppLnRvU3RyaW5nKCl9O3JldHVybiJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/MT09PWk/IiI6Im51bWJlciI9PXR5cGVvZiBpPyJfcGx1cmFsXyIuY29uY2F0KGkudG9TdHJpbmcoKSk6bygpOiJ2MiI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT058fHRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PXQubnVtYmVycy5sZW5ndGgmJjE9PT10Lm51bWJlcnNbMF0/bygpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZyLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrci50b1N0cmluZygpOnIudG9TdHJpbmcoKX19LHtrZXk6InNob3VsZFVzZUludGxBcGkiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIVguaW5jbHVkZXModGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKX19XSksdH0oKTtmdW5jdGlvbiBaKHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBLKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP1ooT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtsKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpaKE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fXZhciBKPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtlKHRoaXMsdCksdGhpcy5sb2dnZXI9bS5jcmVhdGUoImludGVycG9sYXRvciIpLHRoaXMub3B0aW9ucz1uLHRoaXMuZm9ybWF0PW4uaW50ZXJwb2xhdGlvbiYmbi5pbnRlcnBvbGF0aW9uLmZvcm1hdHx8ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHRoaXMuaW5pdChuKX1yZXR1cm4gaSh0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTt0LmludGVycG9sYXRpb258fCh0LmludGVycG9sYXRpb249e2VzY2FwZVZhbHVlOiEwfSk7dmFyIGU9dC5pbnRlcnBvbGF0aW9uO3RoaXMuZXNjYXBlPXZvaWQgMCE9PWUuZXNjYXBlP2UuZXNjYXBlOk4sdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1lLmVzY2FwZVZhbHVlfHxlLmVzY2FwZVZhbHVlLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1lLnVzZVJhd1ZhbHVlVG9Fc2NhcGUmJmUudXNlUmF3VmFsdWVUb0VzY2FwZSx0aGlzLnByZWZpeD1lLnByZWZpeD9TKGUucHJlZml4KTplLnByZWZpeEVzY2FwZWR8fCJ7eyIsdGhpcy5zdWZmaXg9ZS5zdWZmaXg/UyhlLnN1ZmZpeCk6ZS5zdWZmaXhFc2NhcGVkfHwifX0iLHRoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCIsdGhpcy51bmVzY2FwZVByZWZpeD1lLnVuZXNjYXBlU3VmZml4PyIiOmUudW5lc2NhcGVQcmVmaXh8fCItIix0aGlzLnVuZXNjYXBlU3VmZml4PXRoaXMudW5lc2NhcGVQcmVmaXg/IiI6ZS51bmVzY2FwZVN1ZmZpeHx8IiIsdGhpcy5uZXN0aW5nUHJlZml4PWUubmVzdGluZ1ByZWZpeD9TKGUubmVzdGluZ1ByZWZpeCk6ZS5uZXN0aW5nUHJlZml4RXNjYXBlZHx8UygiJHQoIiksdGhpcy5uZXN0aW5nU3VmZml4PWUubmVzdGluZ1N1ZmZpeD9TKGUubmVzdGluZ1N1ZmZpeCk6ZS5uZXN0aW5nU3VmZml4RXNjYXBlZHx8UygiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9ZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9lLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOmUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPWUubWF4UmVwbGFjZXM/ZS5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9dm9pZCAwIT09ZS5hbHdheXNGb3JtYXQmJmUuYWx3YXlzRm9ybWF0LHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKHQsImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChlLCJnIik7dmFyIG49IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChuLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxzLGE9dGhpcyx1PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBsPWZ1bmN0aW9uKHQpe2lmKHQuaW5kZXhPZihhLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIGk9RShlLHUsdCk7cmV0dXJuIGEuYWx3YXlzRm9ybWF0P2EuZm9ybWF0KGksdm9pZCAwLG4sSyhLKEsoe30sciksZSkse30se2ludGVycG9sYXRpb25rZXk6dH0pKTppfXZhciBvPXQuc3BsaXQoYS5mb3JtYXRTZXBhcmF0b3IpLHM9by5zaGlmdCgpLnRyaW0oKSxjPW8uam9pbihhLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBhLmZvcm1hdChFKGUsdSxzKSxjLG4sSyhLKEsoe30sciksZSkse30se2ludGVycG9sYXRpb25rZXk6c30pKX07dGhpcy5yZXNldFJlZ0V4cCgpO3ZhciBoPXImJnIubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyfHx0aGlzLm9wdGlvbnMubWlzc2luZ0ludGVycG9sYXRpb25IYW5kbGVyLGY9ciYmci5pbnRlcnBvbGF0aW9uJiZ2b2lkIDAhPT1yLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzP3IuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXM6dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO3JldHVyblt7cmVnZXg6dGhpcy5yZWdleHBVbmVzY2FwZSxzYWZlVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIGModCl9fSx7cmVnZXg6dGhpcy5yZWdleHAsc2FmZVZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBhLmVzY2FwZVZhbHVlP2MoYS5lc2NhcGUodCkpOmModCl9fV0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7Zm9yKHM9MDtpPWUucmVnZXguZXhlYyh0KTspe3ZhciBuPWlbMV0udHJpbSgpO2lmKHZvaWQgMD09PShvPWwobikpKWlmKCJmdW5jdGlvbiI9PXR5cGVvZiBoKXt2YXIgdT1oKHQsaSxyKTtvPSJzdHJpbmciPT10eXBlb2YgdT91OiIifWVsc2UgaWYociYmci5oYXNPd25Qcm9wZXJ0eShuKSlvPSIiO2Vsc2V7aWYoZil7bz1pWzBdO2NvbnRpbnVlfWEubG9nZ2VyLndhcm4oIm1pc3NlZCB0byBwYXNzIGluIHZhcmlhYmxlICIuY29uY2F0KG4sIiBmb3IgaW50ZXJwb2xhdGluZyAiKS5jb25jYXQodCkpLG89IiJ9ZWxzZSJzdHJpbmciIT10eXBlb2YgbyYmIWEudXNlUmF3VmFsdWVUb0VzY2FwZSYmKG89eChvKSk7dmFyIGM9ZS5zYWZlVmFsdWUobyk7aWYodD10LnJlcGxhY2UoaVswXSxjKSxmPyhlLnJlZ2V4Lmxhc3RJbmRleCs9by5sZW5ndGgsZS5yZWdleC5sYXN0SW5kZXgtPWlbMF0ubGVuZ3RoKTplLnJlZ2V4Lmxhc3RJbmRleD0wLCsrcz49YS5tYXhSZXBsYWNlcylicmVha319KSksdH19LHtrZXk6Im5lc3QiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixpPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30scz1LKHt9LG8pO2Z1bmN0aW9uIGEodCxlKXt2YXIgbj10aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO2lmKHQuaW5kZXhPZihuKTwwKXJldHVybiB0O3ZhciByPXQuc3BsaXQobmV3IFJlZ0V4cCgiIi5jb25jYXQobiwiWyBdKnsiKSkpLGk9InsiLmNvbmNhdChyWzFdKTt0PXJbMF07dmFyIG89KGk9dGhpcy5pbnRlcnBvbGF0ZShpLHMpKS5tYXRjaCgvJy9nKSxhPWkubWF0Y2goLyIvZyk7KG8mJm8ubGVuZ3RoJTI9PTAmJiFhfHxhLmxlbmd0aCUyIT0wKSYmKGk9aS5yZXBsYWNlKC8nL2csJyInKSk7dHJ5e3M9SlNPTi5wYXJzZShpKSxlJiYocz1LKEsoe30sZSkscykpfWNhdGNoKGUpe3JldHVybiB0aGlzLmxvZ2dlci53YXJuKCJmYWlsZWQgcGFyc2luZyBvcHRpb25zIHN0cmluZyBpbiBuZXN0aW5nIGZvciBrZXkgIi5jb25jYXQodCksZSksIiIuY29uY2F0KHQpLmNvbmNhdChuKS5jb25jYXQoaSl9cmV0dXJuIGRlbGV0ZSBzLmRlZmF1bHRWYWx1ZSx0fWZvcihzLmFwcGx5UG9zdFByb2Nlc3Nvcj0hMSxkZWxldGUgcy5kZWZhdWx0VmFsdWU7bj10aGlzLm5lc3RpbmdSZWdleHAuZXhlYyh0KTspe3ZhciB1PVtdLGM9ITE7aWYoLTEhPT1uWzBdLmluZGV4T2YodGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe3ZhciBsPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpfSkpO25bMV09bC5zaGlmdCgpLHU9bCxjPSEwfWlmKChyPWUoYS5jYWxsKHRoaXMsblsxXS50cmltKCkscykscykpJiZuWzBdPT09dCYmInN0cmluZyIhPXR5cGVvZiByKXJldHVybiByOyJzdHJpbmciIT10eXBlb2YgciYmKHI9eChyKSkscnx8KHRoaXMubG9nZ2VyLndhcm4oIm1pc3NlZCB0byByZXNvbHZlICIuY29uY2F0KG5bMV0sIiBmb3IgbmVzdGluZyAiKS5jb25jYXQodCkpLHI9IiIpLGMmJihyPXUucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBpLmZvcm1hdCh0LGUsby5sbmcsSyhLKHt9LG8pLHt9LHtpbnRlcnBvbGF0aW9ua2V5Om5bMV0udHJpbSgpfSkpfSksci50cmltKCkpKSx0PXQucmVwbGFjZShuWzBdLHIpLHRoaXMucmVnZXhwLmxhc3RJbmRleD0wfXJldHVybiB0fX1dKSx0fSgpO2Z1bmN0aW9uIFEodCxlKXt2YXIgbj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihyPXIuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uICQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/UShPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOlEoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gdHQodCl7dmFyIGU9e307cmV0dXJuIGZ1bmN0aW9uKG4scixpKXt2YXIgbz1yK0pTT04uc3RyaW5naWZ5KGkpLHM9ZVtvXTtyZXR1cm4gc3x8KHM9dChyLGkpLGVbb109cykscyhuKX19dmFyIGV0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtlKHRoaXMsdCksdGhpcy5sb2dnZXI9bS5jcmVhdGUoImZvcm1hdHRlciIpLHRoaXMub3B0aW9ucz1uLHRoaXMuZm9ybWF0cz17bnVtYmVyOnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLk51bWJlckZvcm1hdCh0LGUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5mb3JtYXQodCl9fSkpLGN1cnJlbmN5OnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLk51bWJlckZvcm1hdCh0LCQoJCh7fSxlKSx7fSx7c3R5bGU6ImN1cnJlbmN5In0pKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQpfX0pKSxkYXRldGltZTp0dCgoZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0LCQoe30sZSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5mb3JtYXQodCl9fSkpLHJlbGF0aXZldGltZTp0dCgoZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodCwkKHt9LGUpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQsZS5yYW5nZXx8ImRheSIpfX0pKSxsaXN0OnR0KChmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBJbnRsLkxpc3RGb3JtYXQodCwkKHt9LGUpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uZm9ybWF0KHQpfX0pKX0sdGhpcy5pbml0KG4pfXJldHVybiBpKHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319KS5pbnRlcnBvbGF0aW9uO3RoaXMuZm9ybWF0U2VwYXJhdG9yPWUuZm9ybWF0U2VwYXJhdG9yP2UuZm9ybWF0U2VwYXJhdG9yOmUuZm9ybWF0U2VwYXJhdG9yfHwiLCJ9fSx7a2V5OiJhZGQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPWV9fSx7a2V5OiJhZGRDYWNoZWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5mb3JtYXRzW3QudG9Mb3dlckNhc2UoKS50cmltKCldPXR0KGUpfX0se2tleToiZm9ybWF0Iix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT10aGlzLG89ZS5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcikucmVkdWNlKChmdW5jdGlvbih0LGUpe3ZhciBvPWZ1bmN0aW9uKHQpe3ZhciBlPXQudG9Mb3dlckNhc2UoKS50cmltKCksbj17fTtpZih0LmluZGV4T2YoIigiKT4tMSl7dmFyIHI9dC5zcGxpdCgiKCIpO2U9clswXS50b0xvd2VyQ2FzZSgpLnRyaW0oKTt2YXIgaT1yWzFdLnN1YnN0cmluZygwLHJbMV0ubGVuZ3RoLTEpOyJjdXJyZW5jeSI9PT1lJiZpLmluZGV4T2YoIjoiKTwwP24uY3VycmVuY3l8fChuLmN1cnJlbmN5PWkudHJpbSgpKToicmVsYXRpdmV0aW1lIj09PWUmJmkuaW5kZXhPZigiOiIpPDA/bi5yYW5nZXx8KG4ucmFuZ2U9aS50cmltKCkpOmkuc3BsaXQoIjsiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0KXt2YXIgZT1mKHQuc3BsaXQoIjoiKSkscj1lWzBdLGk9ZS5zbGljZSgxKS5qb2luKCI6IikudHJpbSgpLnJlcGxhY2UoL14nK3wnKyQvZywiIik7bltyLnRyaW0oKV18fChuW3IudHJpbSgpXT1pKSwiZmFsc2UiPT09aSYmKG5bci50cmltKCldPSExKSwidHJ1ZSI9PT1pJiYobltyLnRyaW0oKV09ITApLGlzTmFOKGkpfHwobltyLnRyaW0oKV09cGFyc2VJbnQoaSwxMCkpfX0pKX1yZXR1cm57Zm9ybWF0TmFtZTplLGZvcm1hdE9wdGlvbnM6bn19KGUpLHM9by5mb3JtYXROYW1lLGE9by5mb3JtYXRPcHRpb25zO2lmKGkuZm9ybWF0c1tzXSl7dmFyIHU9dDt0cnl7dmFyIGM9ciYmci5mb3JtYXRQYXJhbXMmJnIuZm9ybWF0UGFyYW1zW3IuaW50ZXJwb2xhdGlvbmtleV18fHt9LGw9Yy5sb2NhbGV8fGMubG5nfHxyLmxvY2FsZXx8ci5sbmd8fG47dT1pLmZvcm1hdHNbc10odCxsLCQoJCgkKHt9LGEpLHIpLGMpKX1jYXRjaCh0KXtpLmxvZ2dlci53YXJuKHQpfXJldHVybiB1fXJldHVybiBpLmxvZ2dlci53YXJuKCJ0aGVyZSB3YXMgbm8gZm9ybWF0IGZ1bmN0aW9uIGZvciAiLmNvbmNhdChzKSksdH0pLHQpO3JldHVybiBvfX1dKSx0fSgpO2Z1bmN0aW9uIG50KHQsZSl7dmFyIG49T2JqZWN0LmtleXModCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTtlJiYocj1yLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBydCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9udChPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKGUpe2wodCxlLG5bZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOm50KE9iamVjdChuKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkpfSkpfXJldHVybiB0fWZ1bmN0aW9uIGl0KHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1jKHQpO2lmKGUpe3ZhciBpPWModGhpcykuY29uc3RydWN0b3I7bj1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHUodGhpcyxuKX19dmFyIG90PWZ1bmN0aW9uKHQpe2Eocix0KTt2YXIgbj1pdChyKTtmdW5jdGlvbiByKHQsaSxzKXt2YXIgYSx1PWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gZSh0aGlzLHIpLGE9bi5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKGEpKSxhLmJhY2tlbmQ9dCxhLnN0b3JlPWksYS5zZXJ2aWNlcz1zLGEubGFuZ3VhZ2VVdGlscz1zLmxhbmd1YWdlVXRpbHMsYS5vcHRpb25zPXUsYS5sb2dnZXI9bS5jcmVhdGUoImJhY2tlbmRDb25uZWN0b3IiKSxhLndhaXRpbmdSZWFkcz1bXSxhLm1heFBhcmFsbGVsUmVhZHM9dS5tYXhQYXJhbGxlbFJlYWRzfHwxMCxhLnJlYWRpbmdDYWxscz0wLGEubWF4UmV0cmllcz11Lm1heFJldHJpZXM+PTA/dS5tYXhSZXRyaWVzOjUsYS5yZXRyeVRpbWVvdXQ9dS5yZXRyeVRpbWVvdXQ+PTE/dS5yZXRyeVRpbWVvdXQ6MzUwLGEuc3RhdGU9e30sYS5xdWV1ZT1bXSxhLmJhY2tlbmQmJmEuYmFja2VuZC5pbml0JiZhLmJhY2tlbmQuaW5pdChzLHUuYmFja2VuZCx1KSxhfXJldHVybiBpKHIsW3trZXk6InF1ZXVlTG9hZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcyxvPXt9LHM9e30sYT17fSx1PXt9O3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPSEwO2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGE9IiIuY29uY2F0KHQsInwiKS5jb25jYXQoZSk7IW4ucmVsb2FkJiZpLnN0b3JlLmhhc1Jlc291cmNlQnVuZGxlKHQsZSk/aS5zdGF0ZVthXT0yOmkuc3RhdGVbYV08MHx8KDE9PT1pLnN0YXRlW2FdP3ZvaWQgMD09PXNbYV0mJihzW2FdPSEwKTooaS5zdGF0ZVthXT0xLHI9ITEsdm9pZCAwPT09c1thXSYmKHNbYV09ITApLHZvaWQgMD09PW9bYV0mJihvW2FdPSEwKSx2b2lkIDA9PT11W2VdJiYodVtlXT0hMCkpKX0pKSxyfHwoYVt0XT0hMCl9KSksKE9iamVjdC5rZXlzKG8pLmxlbmd0aHx8T2JqZWN0LmtleXMocykubGVuZ3RoKSYmdGhpcy5xdWV1ZS5wdXNoKHtwZW5kaW5nOnMscGVuZGluZ0NvdW50Ok9iamVjdC5rZXlzKHMpLmxlbmd0aCxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOk9iamVjdC5rZXlzKG8pLHBlbmRpbmc6T2JqZWN0LmtleXMocyksdG9Mb2FkTGFuZ3VhZ2VzOk9iamVjdC5rZXlzKGEpLHRvTG9hZE5hbWVzcGFjZXM6T2JqZWN0LmtleXModSl9fX0se2tleToibG9hZGVkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5zcGxpdCgifCIpLGk9clswXSxvPXJbMV07ZSYmdGhpcy5lbWl0KCJmYWlsZWRMb2FkaW5nIixpLG8sZSksbiYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZUJ1bmRsZShpLG8sbiksdGhpcy5zdGF0ZVt0XT1lPy0xOjI7dmFyIHM9e307dGhpcy5xdWV1ZS5mb3JFYWNoKChmdW5jdGlvbihuKXsoZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dyh0LGUsT2JqZWN0KSxvPWkub2JqLHM9aS5rO29bc109b1tzXXx8W10sciYmKG9bc109b1tzXS5jb25jYXQobikpLHJ8fG9bc10ucHVzaChuKX0pKG4ubG9hZGVkLFtpXSxvKSxmdW5jdGlvbih0LGUpe3ZvaWQgMCE9PXQucGVuZGluZ1tlXSYmKGRlbGV0ZSB0LnBlbmRpbmdbZV0sdC5wZW5kaW5nQ291bnQtLSl9KG4sdCksZSYmbi5lcnJvcnMucHVzaChlKSwwPT09bi5wZW5kaW5nQ291bnQmJiFuLmRvbmUmJihPYmplY3Qua2V5cyhuLmxvYWRlZCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7c1t0XXx8KHNbdF09e30pO3ZhciBlPW4ubG9hZGVkW3RdO2UubGVuZ3RoJiZlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZvaWQgMD09PXNbdF1bZV0mJihzW3RdW2VdPSEwKX0pKX0pKSxuLmRvbmU9ITAsbi5lcnJvcnMubGVuZ3RoP24uY2FsbGJhY2sobi5lcnJvcnMpOm4uY2FsbGJhY2soKSl9KSksdGhpcy5lbWl0KCJsb2FkZWQiLHMpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmRvbmV9KSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTowLG89YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOnRoaXMucmV0cnlUaW1lb3V0LHM9YXJndW1lbnRzLmxlbmd0aD41P2FyZ3VtZW50c1s1XTp2b2lkIDA7cmV0dXJuIHQubGVuZ3RoP3RoaXMucmVhZGluZ0NhbGxzPj10aGlzLm1heFBhcmFsbGVsUmVhZHM/dm9pZCB0aGlzLndhaXRpbmdSZWFkcy5wdXNoKHtsbmc6dCxuczplLGZjTmFtZTpuLHRyaWVkOmksd2FpdDpvLGNhbGxiYWNrOnN9KToodGhpcy5yZWFkaW5nQ2FsbHMrKyx0aGlzLmJhY2tlbmRbbl0odCxlLChmdW5jdGlvbihhLHUpe2lmKHIucmVhZGluZ0NhbGxzLS0sci53YWl0aW5nUmVhZHMubGVuZ3RoPjApe3ZhciBjPXIud2FpdGluZ1JlYWRzLnNoaWZ0KCk7ci5yZWFkKGMubG5nLGMubnMsYy5mY05hbWUsYy50cmllZCxjLndhaXQsYy5jYWxsYmFjayl9YSYmdSYmaTxyLm1heFJldHJpZXM/c2V0VGltZW91dCgoZnVuY3Rpb24oKXtyLnJlYWQuY2FsbChyLHQsZSxuLGkrMSwyKm8scyl9KSxvKTpzKGEsdSl9KSkpOnMobnVsbCx7fSl9fSx7a2V5OiJwcmVwYXJlTG9hZGluZyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7aWYoIXRoaXMuYmFja2VuZClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiTm8gYmFja2VuZCB3YXMgYWRkZWQgdmlhIGkxOG5leHQudXNlLiBXaWxsIG5vdCBsb2FkIHJlc291cmNlcy4iKSxpJiZpKCk7InN0cmluZyI9PXR5cGVvZiB0JiYodD10aGlzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpKSwic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSk7dmFyIG89dGhpcy5xdWV1ZUxvYWQodCxlLHIsaSk7aWYoIW8udG9Mb2FkLmxlbmd0aClyZXR1cm4gby5wZW5kaW5nLmxlbmd0aHx8aSgpLG51bGw7by50b0xvYWQuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5sb2FkT25lKHQpfSkpfX0se2tleToibG9hZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3RoaXMucHJlcGFyZUxvYWRpbmcodCxlLHt9LG4pfX0se2tleToicmVsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse3JlbG9hZDohMH0sbil9fSx7a2V5OiJsb2FkT25lIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiIiLHI9dC5zcGxpdCgifCIpLGk9clswXSxvPXJbMV07dGhpcy5yZWFkKGksbywicmVhZCIsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24ocixzKXtyJiZlLmxvZ2dlci53YXJuKCIiLmNvbmNhdChuLCJsb2FkaW5nIG5hbWVzcGFjZSAiKS5jb25jYXQobywiIGZvciBsYW5ndWFnZSAiKS5jb25jYXQoaSwiIGZhaWxlZCIpLHIpLCFyJiZzJiZlLmxvZ2dlci5sb2coIiIuY29uY2F0KG4sImxvYWRlZCBuYW1lc3BhY2UgIikuY29uY2F0KG8sIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KGkpLHMpLGUubG9hZGVkKHQscixzKX0pKX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTp7fTt0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGUpP3RoaXMubG9nZ2VyLndhcm4oJ2RpZCBub3Qgc2F2ZSBrZXkgIicuY29uY2F0KG4sJyIgYXMgdGhlIG5hbWVzcGFjZSAiJykuY29uY2F0KGUsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpOm51bGw9PW58fCIiPT09bnx8KHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZSh0LGUsbixyLG51bGwscnQocnQoe30sbykse30se2lzVXBkYXRlOml9KSksdCYmdFswXSYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZSh0WzBdLGUsbixyKSl9fV0pLHJ9KHYpO2Z1bmN0aW9uIHN0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdC5ucyYmKHQubnM9W3QubnNdKSwic3RyaW5nIj09dHlwZW9mIHQuZmFsbGJhY2tMbmcmJih0LmZhbGxiYWNrTG5nPVt0LmZhbGxiYWNrTG5nXSksInN0cmluZyI9PXR5cGVvZiB0LmZhbGxiYWNrTlMmJih0LmZhbGxiYWNrTlM9W3QuZmFsbGJhY2tOU10pLHQuc3VwcG9ydGVkTG5ncyYmdC5zdXBwb3J0ZWRMbmdzLmluZGV4T2YoImNpbW9kZSIpPDAmJih0LnN1cHBvcnRlZExuZ3M9dC5zdXBwb3J0ZWRMbmdzLmNvbmNhdChbImNpbW9kZSJdKSksdH1mdW5jdGlvbiBhdCh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gdXQodCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW2VdP2FyZ3VtZW50c1tlXTp7fTtlJTI/YXQoT2JqZWN0KG4pLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtsKHQsZSxuW2VdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTphdChPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH1mdW5jdGlvbiBjdCh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9Yyh0KTtpZihlKXt2YXIgaT1jKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsaSl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB1KHRoaXMsbil9fWZ1bmN0aW9uIGx0KCl7fXZhciBodD1mdW5jdGlvbihuKXthKHMsbik7dmFyIHI9Y3Qocyk7ZnVuY3Rpb24gcygpe3ZhciB0LG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LGk9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYoZSh0aGlzLHMpLHQ9ci5jYWxsKHRoaXMpLEkmJnYuY2FsbChvKHQpKSx0Lm9wdGlvbnM9c3QobiksdC5zZXJ2aWNlcz17fSx0LmxvZ2dlcj1tLHQubW9kdWxlcz17ZXh0ZXJuYWw6W119LGZ1bmN0aW9uKHQpe09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIHRbZV0mJih0W2VdPXRbZV0uYmluZCh0KSl9KSl9KG8odCkpLGkmJiF0LmlzSW5pdGlhbGl6ZWQmJiFuLmlzQ2xvbmUpe2lmKCF0Lm9wdGlvbnMuaW5pdEltbWVkaWF0ZSlyZXR1cm4gdC5pbml0KG4saSksdSh0LG8odCkpO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5pbml0KG4saSl9KSwwKX1yZXR1cm4gdH1yZXR1cm4gaShzLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDsiZnVuY3Rpb24iPT10eXBlb2YgbiYmKHI9bixuPXt9KSwhbi5kZWZhdWx0TlMmJiExIT09bi5kZWZhdWx0TlMmJm4ubnMmJigic3RyaW5nIj09dHlwZW9mIG4ubnM/bi5kZWZhdWx0TlM9bi5uczpuLm5zLmluZGV4T2YoInRyYW5zbGF0aW9uIik8MCYmKG4uZGVmYXVsdE5TPW4ubnNbMF0pKTt2YXIgaT17ZGVidWc6ITEsaW5pdEltbWVkaWF0ZTohMCxuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOlsidHJhbnNsYXRpb24iXSxmYWxsYmFja0xuZzpbImRldiJdLGZhbGxiYWNrTlM6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIG49e307aWYoIm9iamVjdCI9PT10KGVbMV0pJiYobj1lWzFdKSwic3RyaW5nIj09dHlwZW9mIGVbMV0mJihuLmRlZmF1bHRWYWx1ZT1lWzFdKSwic3RyaW5nIj09dHlwZW9mIGVbMl0mJihuLnREZXNjcmlwdGlvbj1lWzJdKSwib2JqZWN0Ij09PXQoZVsyXSl8fCJvYmplY3QiPT09dChlWzNdKSl7dmFyIHI9ZVszXXx8ZVsyXTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKChmdW5jdGlvbih0KXtuW3RdPXJbdF19KSl9cmV0dXJuIG59LGludGVycG9sYXRpb246e2VzY2FwZVZhbHVlOiEwLGZvcm1hdDpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdH0scHJlZml4OiJ7eyIsc3VmZml4OiJ9fSIsZm9ybWF0U2VwYXJhdG9yOiIsIix1bmVzY2FwZVByZWZpeDoiLSIsbmVzdGluZ1ByZWZpeDoiJHQoIixuZXN0aW5nU3VmZml4OiIpIixuZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjoiLCIsbWF4UmVwbGFjZXM6MWUzLHNraXBPblZhcmlhYmxlczohMH19O2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQ/ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bmV3IHQ6dDpudWxsfWlmKHRoaXMub3B0aW9ucz11dCh1dCh1dCh7fSxpKSx0aGlzLm9wdGlvbnMpLHN0KG4pKSwidjEiIT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkmJih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbj11dCh1dCh7fSxpLmludGVycG9sYXRpb24pLHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uKSksdm9pZCAwIT09bi5rZXlTZXBhcmF0b3ImJih0aGlzLm9wdGlvbnMudXNlckRlZmluZWRLZXlTZXBhcmF0b3I9bi5rZXlTZXBhcmF0b3IpLHZvaWQgMCE9PW4ubnNTZXBhcmF0b3ImJih0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvcj1uLm5zU2VwYXJhdG9yKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe3ZhciBzO3RoaXMubW9kdWxlcy5sb2dnZXI/bS5pbml0KG8odGhpcy5tb2R1bGVzLmxvZ2dlciksdGhpcy5vcHRpb25zKTptLmluaXQobnVsbCx0aGlzLm9wdGlvbnMpLHRoaXMubW9kdWxlcy5mb3JtYXR0ZXI/cz10aGlzLm1vZHVsZXMuZm9ybWF0dGVyOiJ1bmRlZmluZWQiIT10eXBlb2YgSW50bCYmKHM9ZXQpO3ZhciBhPW5ldyBWKHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgUCh0aGlzLm9wdGlvbnMucmVzb3VyY2VzLHRoaXMub3B0aW9ucyk7dmFyIHU9dGhpcy5zZXJ2aWNlczt1LmxvZ2dlcj1tLHUucmVzb3VyY2VTdG9yZT10aGlzLnN0b3JlLHUubGFuZ3VhZ2VVdGlscz1hLHUucGx1cmFsUmVzb2x2ZXI9bmV3IEgoYSx7cHJlcGVuZDp0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLGNvbXBhdGliaWxpdHlKU09OOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixzaW1wbGlmeVBsdXJhbFN1ZmZpeDp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXh9KSxzJiYoIXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdHx8dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0PT09aS5pbnRlcnBvbGF0aW9uLmZvcm1hdCkmJih1LmZvcm1hdHRlcj1vKHMpLHUuZm9ybWF0dGVyLmluaXQodSx0aGlzLm9wdGlvbnMpLHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdD11LmZvcm1hdHRlci5mb3JtYXQuYmluZCh1LmZvcm1hdHRlcikpLHUuaW50ZXJwb2xhdG9yPW5ldyBKKHRoaXMub3B0aW9ucyksdS51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOnRoaXMuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQodGhpcyl9LHUuYmFja2VuZENvbm5lY3Rvcj1uZXcgb3Qobyh0aGlzLm1vZHVsZXMuYmFja2VuZCksdS5yZXNvdXJjZVN0b3JlLHUsdGhpcy5vcHRpb25zKSx1LmJhY2tlbmRDb25uZWN0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLGk9MTtpPG47aSsrKXJbaS0xXT1hcmd1bWVudHNbaV07ZS5lbWl0LmFwcGx5KGUsW3RdLmNvbmNhdChyKSl9KSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJih1Lmxhbmd1YWdlRGV0ZWN0b3I9byh0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksdS5sYW5ndWFnZURldGVjdG9yLmluaXQodSx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYodS5pMThuRm9ybWF0PW8odGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLHUuaTE4bkZvcm1hdC5pbml0JiZ1LmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBVKHRoaXMuc2VydmljZXMsdGhpcy5vcHRpb25zKSx0aGlzLnRyYW5zbGF0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLGk9MTtpPG47aSsrKXJbaS0xXT1hcmd1bWVudHNbaV07ZS5lbWl0LmFwcGx5KGUsW3RdLmNvbmNhdChyKSl9KSksdGhpcy5tb2R1bGVzLmV4dGVybmFsLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuaW5pdCYmdC5pbml0KGUpfSkpfWlmKHRoaXMuZm9ybWF0PXRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmZvcm1hdCxyfHwocj1sdCksdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nJiYhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5vcHRpb25zLmxuZyl7dmFyIGM9dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKTtjLmxlbmd0aD4wJiYiZGV2IiE9PWNbMF0mJih0aGlzLm9wdGlvbnMubG5nPWNbMF0pfSF0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJiF0aGlzLm9wdGlvbnMubG5nJiZ0aGlzLmxvZ2dlci53YXJuKCJpbml0OiBubyBsYW5ndWFnZURldGVjdG9yIGlzIHVzZWQgYW5kIG5vIGxuZyBpcyBkZWZpbmVkIik7WyJnZXRSZXNvdXJjZSIsImhhc1Jlc291cmNlQnVuZGxlIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJnZXREYXRhQnlMYW5ndWFnZSJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe2VbdF09ZnVuY3Rpb24oKXt2YXIgbjtyZXR1cm4obj1lLnN0b3JlKVt0XS5hcHBseShuLGFyZ3VtZW50cyl9fSkpO1siYWRkUmVzb3VyY2UiLCJhZGRSZXNvdXJjZXMiLCJhZGRSZXNvdXJjZUJ1bmRsZSIsInJlbW92ZVJlc291cmNlQnVuZGxlIl0uZm9yRWFjaCgoZnVuY3Rpb24odCl7ZVt0XT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPWUuc3RvcmUpW3RdLmFwcGx5KG4sYXJndW1lbnRzKSxlfX0pKTt2YXIgbD1fKCksaD1mdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKHQsbil7ZS5pc0luaXRpYWxpemVkJiYhZS5pbml0aWFsaXplZFN0b3JlT25jZSYmZS5sb2dnZXIud2FybigiaW5pdDogaTE4bmV4dCBpcyBhbHJlYWR5IGluaXRpYWxpemVkLiBZb3Ugc2hvdWxkIGNhbGwgaW5pdCBqdXN0IG9uY2UhIiksZS5pc0luaXRpYWxpemVkPSEwLGUub3B0aW9ucy5pc0Nsb25lfHxlLmxvZ2dlci5sb2coImluaXRpYWxpemVkIixlLm9wdGlvbnMpLGUuZW1pdCgiaW5pdGlhbGl6ZWQiLGUub3B0aW9ucyksbC5yZXNvbHZlKG4pLHIodCxuKX07aWYoZS5sYW5ndWFnZXMmJiJ2MSIhPT1lLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSYmIWUuaXNJbml0aWFsaXplZClyZXR1cm4gdChudWxsLGUudC5iaW5kKGUpKTtlLmNoYW5nZUxhbmd1YWdlKGUub3B0aW9ucy5sbmcsdCl9O3JldHVybiB0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHwhdGhpcy5vcHRpb25zLmluaXRJbW1lZGlhdGU/aCgpOnNldFRpbWVvdXQoaCwwKSxsfX0se2tleToibG9hZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpsdCxyPSJzdHJpbmciPT10eXBlb2YgdD90OnRoaXMubGFuZ3VhZ2U7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPXQpLCF0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHx0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXMpe2lmKHImJiJjaW1vZGUiPT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiBuKCk7dmFyIGk9W10sbz1mdW5jdGlvbih0KXt0JiZlLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuaW5kZXhPZih0KTwwJiZpLnB1c2godCl9KSl9O2lmKHIpbyhyKTtlbHNlIHRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZykuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIG8odCl9KSk7dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBvKHQpfSkpLHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5sb2FkKGksdGhpcy5vcHRpb25zLm5zLChmdW5jdGlvbih0KXshdCYmIWUucmVzb2x2ZWRMYW5ndWFnZSYmZS5sYW5ndWFnZSYmZS5zZXRSZXNvbHZlZExhbmd1YWdlKGUubGFuZ3VhZ2UpLG4odCl9KSl9ZWxzZSBuKG51bGwpfX0se2tleToicmVsb2FkUmVzb3VyY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9XygpO3JldHVybiB0fHwodD10aGlzLmxhbmd1YWdlcyksZXx8KGU9dGhpcy5vcHRpb25zLm5zKSxufHwobj1sdCksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZCh0LGUsKGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLG4odCl9KSkscn19LHtrZXk6InVzZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJZb3UgYXJlIHBhc3NpbmcgYW4gdW5kZWZpbmVkIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtpZighdC50eXBlKXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGEgd3JvbmcgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO3JldHVybiJiYWNrZW5kIj09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5iYWNrZW5kPXQpLCgibG9nZ2VyIj09PXQudHlwZXx8dC5sb2cmJnQud2FybiYmdC5lcnJvcikmJih0aGlzLm1vZHVsZXMubG9nZ2VyPXQpLCJsYW5ndWFnZURldGVjdG9yIj09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yPXQpLCJpMThuRm9ybWF0Ij09PXQudHlwZSYmKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0PXQpLCJwb3N0UHJvY2Vzc29yIj09PXQudHlwZSYmUi5hZGRQb3N0UHJvY2Vzc29yKHQpLCJmb3JtYXR0ZXIiPT09dC50eXBlJiYodGhpcy5tb2R1bGVzLmZvcm1hdHRlcj10KSwiM3JkUGFydHkiPT09dC50eXBlJiZ0aGlzLm1vZHVsZXMuZXh0ZXJuYWwucHVzaCh0KSx0aGlzfX0se2tleToic2V0UmVzb2x2ZWRMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodCYmdGhpcy5sYW5ndWFnZXMmJiEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKHQpPi0xKSlmb3IodmFyIGU9MDtlPHRoaXMubGFuZ3VhZ2VzLmxlbmd0aDtlKyspe3ZhciBuPXRoaXMubGFuZ3VhZ2VzW2VdO2lmKCEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKG4pPi0xKSYmdGhpcy5zdG9yZS5oYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMobikpe3RoaXMucmVzb2x2ZWRMYW5ndWFnZT1uO2JyZWFrfX19fSx7a2V5OiJjaGFuZ2VMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG89dDt2YXIgcj1fKCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIix0KTt2YXIgaT1mdW5jdGlvbih0KXtuLmxhbmd1YWdlPXQsbi5sYW5ndWFnZXM9bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeSh0KSxuLnJlc29sdmVkTGFuZ3VhZ2U9dm9pZCAwLG4uc2V0UmVzb2x2ZWRMYW5ndWFnZSh0KX0sbz1mdW5jdGlvbihvKXshdCYmIW8mJm4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmKG89W10pO3ZhciBzPSJzdHJpbmciPT10eXBlb2Ygbz9vOm4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRCZXN0TWF0Y2hGcm9tQ29kZXMobyk7cyYmKG4ubGFuZ3VhZ2V8fGkocyksbi50cmFuc2xhdG9yLmxhbmd1YWdlfHxuLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2Uocyksbi5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiZuLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuY2FjaGVVc2VyTGFuZ3VhZ2UocykpLG4ubG9hZFJlc291cmNlcyhzLChmdW5jdGlvbih0KXshZnVuY3Rpb24odCxvKXtvPyhpKG8pLG4udHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShvKSxuLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxuLmVtaXQoImxhbmd1YWdlQ2hhbmdlZCIsbyksbi5sb2dnZXIubG9nKCJsYW5ndWFnZUNoYW5nZWQiLG8pKTpuLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxyLnJlc29sdmUoKGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KSksZSYmZSh0LChmdW5jdGlvbigpe3JldHVybiBuLnQuYXBwbHkobixhcmd1bWVudHMpfSkpfSh0LHMpfSkpfTtyZXR1cm4gdHx8IXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jPyF0JiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYz90aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KG8pOm8odCk6byh0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuZGV0ZWN0KCkpLHJ9fSx7a2V5OiJnZXRGaXhlZFQiLHZhbHVlOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT10aGlzLG89ZnVuY3Rpb24gZShuLG8pe3ZhciBzO2lmKCJvYmplY3QiIT09dChvKSl7Zm9yKHZhciBhPWFyZ3VtZW50cy5sZW5ndGgsdT1uZXcgQXJyYXkoYT4yP2EtMjowKSxjPTI7YzxhO2MrKyl1W2MtMl09YXJndW1lbnRzW2NdO3M9aS5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKFtuLG9dLmNvbmNhdCh1KSl9ZWxzZSBzPXV0KHt9LG8pO3MubG5nPXMubG5nfHxlLmxuZyxzLmxuZ3M9cy5sbmdzfHxlLmxuZ3Mscy5ucz1zLm5zfHxlLm5zLHMua2V5UHJlZml4PXMua2V5UHJlZml4fHxyfHxlLmtleVByZWZpeDt2YXIgbD1pLm9wdGlvbnMua2V5U2VwYXJhdG9yfHwiLiIsaD1zLmtleVByZWZpeD8iIi5jb25jYXQocy5rZXlQcmVmaXgpLmNvbmNhdChsKS5jb25jYXQobik6bjtyZXR1cm4gaS50KGgscyl9O3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9vLmxuZz1lOm8ubG5ncz1lLG8ubnM9bixvLmtleVByZWZpeD1yLG99fSx7a2V5OiJ0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0O3JldHVybiB0aGlzLnRyYW5zbGF0b3ImJih0PXRoaXMudHJhbnNsYXRvcikudHJhbnNsYXRlLmFwcGx5KHQsYXJndW1lbnRzKX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYodD10aGlzLnRyYW5zbGF0b3IpLmV4aXN0cy5hcHBseSh0LGFyZ3VtZW50cyl9fSx7a2V5OiJzZXREZWZhdWx0TmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMuZGVmYXVsdE5TPXR9fSx7a2V5OiJoYXNMb2FkZWROYW1lc3BhY2UiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXRoaXMuaXNJbml0aWFsaXplZClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuZXh0IHdhcyBub3QgaW5pdGlhbGl6ZWQiLHRoaXMubGFuZ3VhZ2VzKSwhMTtpZighdGhpcy5sYW5ndWFnZXN8fCF0aGlzLmxhbmd1YWdlcy5sZW5ndGgpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bi5sYW5ndWFnZXMgd2VyZSB1bmRlZmluZWQgb3IgZW1wdHkiLHRoaXMubGFuZ3VhZ2VzKSwhMTt2YXIgcj10aGlzLnJlc29sdmVkTGFuZ3VhZ2V8fHRoaXMubGFuZ3VhZ2VzWzBdLGk9ISF0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyxvPXRoaXMubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VzLmxlbmd0aC0xXTtpZigiY2ltb2RlIj09PXIudG9Mb3dlckNhc2UoKSlyZXR1cm4hMDt2YXIgcz1mdW5jdGlvbih0LG4pe3ZhciByPWUuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5zdGF0ZVsiIi5jb25jYXQodCwifCIpLmNvbmNhdChuKV07cmV0dXJuLTE9PT1yfHwyPT09cn07aWYobi5wcmVjaGVjayl7dmFyIGE9bi5wcmVjaGVjayh0aGlzLHMpO2lmKHZvaWQgMCE9PWEpcmV0dXJuIGF9cmV0dXJuISEodGhpcy5oYXNSZXNvdXJjZUJ1bmRsZShyLHQpfHwhdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLmJhY2tlbmR8fHRoaXMub3B0aW9ucy5yZXNvdXJjZXMmJiF0aGlzLm9wdGlvbnMucGFydGlhbEJ1bmRsZWRMYW5ndWFnZXN8fHMocix0KSYmKCFpfHxzKG8sdCkpKX19LHtrZXk6ImxvYWROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1fKCk7cmV0dXJuIHRoaXMub3B0aW9ucy5ucz8oInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5vcHRpb25zLm5zLmluZGV4T2YodCk8MCYmbi5vcHRpb25zLm5zLnB1c2godCl9KSksdGhpcy5sb2FkUmVzb3VyY2VzKChmdW5jdGlvbih0KXtyLnJlc29sdmUoKSxlJiZlKHQpfSkpLHIpOihlJiZlKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToibG9hZExhbmd1YWdlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj1fKCk7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pO3ZhciByPXRoaXMub3B0aW9ucy5wcmVsb2FkfHxbXSxpPXQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gci5pbmRleE9mKHQpPDB9KSk7cmV0dXJuIGkubGVuZ3RoPyh0aGlzLm9wdGlvbnMucHJlbG9hZD1yLmNvbmNhdChpKSx0aGlzLmxvYWRSZXNvdXJjZXMoKGZ1bmN0aW9uKHQpe24ucmVzb2x2ZSgpLGUmJmUodCl9KSksbik6KGUmJmUoKSxQcm9taXNlLnJlc29sdmUoKSl9fSx7a2V5OiJkaXIiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHR8fCh0PXRoaXMucmVzb2x2ZWRMYW5ndWFnZXx8KHRoaXMubGFuZ3VhZ2VzJiZ0aGlzLmxhbmd1YWdlcy5sZW5ndGg+MD90aGlzLmxhbmd1YWdlc1swXTp0aGlzLmxhbmd1YWdlKSksIXQpcmV0dXJuInJ0bCI7cmV0dXJuWyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSIsImNrYiJdLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKT4tMXx8dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi1hcmFiIik+MT8icnRsIjoibHRyIn19LHtrZXk6ImNsb25lSW5zdGFuY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpsdCxyPXV0KHV0KHV0KHt9LHRoaXMub3B0aW9ucyksZSkse2lzQ2xvbmU6ITB9KSxpPW5ldyBzKHIpOyh2b2lkIDAhPT1lLmRlYnVnfHx2b2lkIDAhPT1lLnByZWZpeCkmJihpLmxvZ2dlcj1pLmxvZ2dlci5jbG9uZShlKSk7cmV0dXJuWyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXS5mb3JFYWNoKChmdW5jdGlvbihlKXtpW2VdPXRbZV19KSksaS5zZXJ2aWNlcz11dCh7fSx0aGlzLnNlcnZpY2VzKSxpLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saS50cmFuc2xhdG9yPW5ldyBVKGkuc2VydmljZXMsaS5vcHRpb25zKSxpLnRyYW5zbGF0b3Iub24oIioiLChmdW5jdGlvbih0KXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlPjE/ZS0xOjApLHI9MTtyPGU7cisrKW5bci0xXT1hcmd1bWVudHNbcl07aS5lbWl0LmFwcGx5KGksW3RdLmNvbmNhdChuKSl9KSksaS5pbml0KHIsbiksaS50cmFuc2xhdG9yLm9wdGlvbnM9aS5vcHRpb25zLGkudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57b3B0aW9uczp0aGlzLm9wdGlvbnMsc3RvcmU6dGhpcy5zdG9yZSxsYW5ndWFnZTp0aGlzLmxhbmd1YWdlLGxhbmd1YWdlczp0aGlzLmxhbmd1YWdlcyxyZXNvbHZlZExhbmd1YWdlOnRoaXMucmVzb2x2ZWRMYW5ndWFnZX19fV0pLHN9KHYpO2woaHQsImNyZWF0ZUluc3RhbmNlIiwoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGh0KGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSk7dmFyIGZ0PWh0LmNyZWF0ZUluc3RhbmNlKCk7ZnQuY3JlYXRlSW5zdGFuY2U9aHQuY3JlYXRlSW5zdGFuY2UsZnQuY3JlYXRlSW5zdGFuY2UsZnQuaW5pdCxmdC5sb2FkUmVzb3VyY2VzLGZ0LnJlbG9hZFJlc291cmNlcyxmdC51c2UsZnQuY2hhbmdlTGFuZ3VhZ2UsZnQuZ2V0Rml4ZWRULGZ0LnQsZnQuZXhpc3RzLGZ0LnNldERlZmF1bHROYW1lc3BhY2UsZnQuaGFzTG9hZGVkTmFtZXNwYWNlLGZ0LmxvYWROYW1lc3BhY2VzLGZ0LmxvYWRMYW5ndWFnZXM7dmFyIHB0PXtDb25maXJtVG86IkNvbmZpcm0gVG8gIixUZXh0SW5wdXQ6IlRleHQgSW5wdXQiLEF0dHJpYnV0ZToiQXR0cmlidXRlIixOb0F0dHJpYnV0ZToiTm8gQXR0cmlidXRlIixTYXZlOiJTYXZlIixVbmRvOiJVbmRvIixSZWRvOiJSZWRvIixSb3RhdGU6IlJvdGF0ZSIsU3R5bGU6IlN0eWxlIixBZGp1c3Q6IkFkanVzdCIsQm9yZGVyVGhpY2tuZXNzOiJCb3JkZXIgVGhpY2tuZXNzIixDb2xvcjoiQ29sb3IiLEJvcmRlck9wYWNpdHk6IkJvcmRlciBPcGFjaXR5IixGaWxsT3BhY2l0eToiRmlsbCBPcGFjaXR5IixTYXR1cmF0aW9uOiJTYXR1cmF0aW9uIixDb250cmFzdDoiQ29udHJhc3QiLEV4cG9zdXJlOiJFeHBvc3VyZSIsU2NyZWVuUmF0aW86IlNjcmVlbiBSYXRpbyIsT3JpZ2luYWxTY2FsZToiT3JpZ2luYWwgU2NhbGUiLENvcHlUaGVQcmV2aW91czoiQ29weSBQcmV2IixDbGVhckxhYmVsOiJDbGVhciIsU2V0QXNJbnZhbGlkOiJTZXQgQXMgSW52YWxpZCIsU2V0QXNWYWxpZDoiU2V0IEFzIFZhbGlkIixDb25maXJtOiJDb25maXJtIixGaW5pc2g6IkZpbmlzaCIsQ2FuY2VsOiJDYW5jZWwiLEl0ZW1zT2ZUaGlzUGFnZToiSXRlbXMgT2YgVGhpcyBQYWdlIixIb3RrZXlzOiJIb3RrZXlzIixBbm5vdGF0ZVJlY3Q6IkFubm90YXRlIFJlY3QiLEFubm90YXRlSW52YWxpZFJlY3Q6IkFubm90YXRlIEludmFsaWQgUmVjdCIsU2VsZWN0UmVjdDoiU2VsZWN0IFJlY3QiLFJpZ2h0Q2xpY2s6IlJpZ2h0LWNsaWNrIixUb2dnbGVSZWN0RWZmZWN0aXZlbmVzczoiVG9nZ2xlIFJlY3QgVmFsaWRpdHkiLFRvZ2dsZUVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBWYWxpZGl0eSIsRGVsZXRlUmVjdDoiRGVsZXRlIFJlY3QiLFNlbGVjdEFuZERvdWJsZUNsaWNrOiJTZWxlY3QgQW5kIERvdWJsZSBDbGljayIsU2NhbGU6IlNjYWxlIixGdWxsc2NyZWVuOiJGdWxsc2NyZWVuIixQcmV2aW91c0ltYWdlOiJQcmV2aW91cyIsUHJldmlvdXNGaWxlOiJQcmV2aW91cyIsTmV4dEltYWdlOiJOZXh0IixOZXh0RmlsZToiTmV4dCIsUHJldmlvdXNGb2xkZXI6IlByZXZpb3VzIEZvbGRlciIsTmV4dEZvbGRlcjoiTmV4dCBGb2xkZXIiLERyYWc6IkRyYWciLFRvZ2dsZVNlbGVjdGVkOiJUb2dnbGUgU2VsZWN0ZWQiLFRvZ2dsZVNlbGVjdGVkUmV2ZXJzZToiVG9nZ2xlIFNlbGVjdGVkIFJldmVyc2UiLEhpZGVHcmFwaGljczoiSGlkZSBHcmFwaGljcyIsVG9nZ2xlTGluZVBhcnRpY3VsYXJpdHk6IlRvZ2dsZSBMaW5lIFBhcnRpY3VsYXJpdHkiLFRvU2lkZToiVG8gTGluZSIsU3BlY2lmaWVkQXR0cmlidXRlc09ubHk6IlNwZWNpZmllZCBBdHRyaWJ1dGVzIE9ubHkiLE51bWJlcjoiTnVtYmVyIixQcmVzczoiUHJlc3MiLFRvT3JpZ2luYWxTdGVwOiJUbyBPcmlnaW5hbCIsSG9yaXpvbnRhbE9yVmVydGljYWw6Ikhvcml6b250YWwvVmVydGljYWwiLEFubm90YXRlSW52YWxpZExpbmU6IkFubm90YXRlIEludmFsaWQgTGluZSIsQW5ub3RhdGVMaW5lOiJBbm5vdGF0ZSBMaW5lIixTZWxlY3RMaW5lOiJTZWxlY3QgTGluZSIsVG9nZ2xlTGluZUVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBMaW5lIFZhbGlkaXR5IixEZWxldGVMaW5lOiJEZWxldGUgTGluZSIsQ29udGludWVUb0xhYmVsOiJDb250aW51ZSBUbyBMYWJlbCIsU2VsZWN0OiJTZWxlY3QiLEluc2VydFBvaW50OiJJbnNlcnQgUG9pbnQiLENsaWNrT25MaW5lOiJDbGljayBPbiBMaW5lIixEZWxldGVQb2ludDoiRGVsZXRlIFBvaW50IixEYmxDbGlja09uUG9pbnQ6IkRvdWJsZSBDbGljayBPbiBQb2ludCIsU3RvcEFkc29ycHRpb246IlN0b3AgQWRzb3JwdGlvbiIsUHJldmlvdXNMaW5lOiJQcmV2aW91cyBMaW5lIixOZXh0TGluZToiTmV4dCBMaW5lIixTZWxlY3RQb2ludDoiU2VsZWN0IFBvaW50IixBbm5vdGF0ZUludmFsaWRQb2ludDoiQW5ub3RhdGUgSW52YWxpZCBQb2ludCIsQW5ub3RhdGVQb2ludDoiQW5ub3RhdGUgUG9pbnQiLEFubm90YXRlUG9seWdvbjoiQW5ub3RhdGUgUG9seWdvbiIsU2VsZWN0UG9seWdvbjoiU2VsZWN0IFBvbHlnb24iLEFubm90YXRlSW52YWxpZFBvbHlnb246IkFubm90YXRlIEludmFsaWQgUG9seWdvbiIsVG9nZ2xlUG9seWdvbkVmZmVjdGl2ZW5lc3M6IlRvZ2dsZSBQb2x5Z29uIFZhbGlkaXR5IixEZWxldGVQb2x5Z29uOiJEZWxldGUgUG9seWdvbiIsRGVsZXRlOiJEZWxldGUiLFRvZ2dsZVBvaW50UGFydGljdWxhcml0eToiVG9nZ2xlIFBvaW50IFBhcnRpY3VsYXJpdHkiLENyb3BPdmVybGFwQXJlYToiQ3JvcCBPdmVybGFwIEFyZWEiLFNlZ21lbnRhdGlvblJlY29nbml0aW9uOiJTZWdtZW50YXRpb24gUmVjb2duaXRpb24iLFN3aXRjaFBhdHRlcm46IlN3aXRjaCBQYXR0ZXJuIixUYWdnaW5nOiJUYWdnaW5nIixIaWRlOiJIaWRlICIsVGFnZ2luZ09yQXR0cjoiVGFnL2F0dHJpYnV0ZSIsSGlkZURyYXduQW5ub3RhdGlvbjoiSGlkZGVuIERyYXduIEFubm90YXRpb24iLEJsdWU6IkJsdWUiLEN5YW46IkN5YW4iLEdyZWVuOiJHcmVlbiIsWWVsbG93OiJZZWxsb3ciLFBpbms6IlBpbmsiLFN0ZXBzOiJTdGVwcyIsRXhwb3J0OiJFeHBvcnQiLE5leHRTdGVwOiJOZXh0IFN0ZXAiLFN0ZXBOb3RGaW5pc2hlZE5vdGlmeToiVGhlcmUgYXJlIHVuYW5ub3RhdGVkIGZpbGVzIGluIHRoZSBjdXJyZW50IHN0ZXAgLCBwbGVhc2UgZmluaXNoIGJlZm9yZSB0aGUgbmV4dCBzdGVwIixjdXJJdGVtczoie3tjdXJyZW50fX0ve3t0b3RhbH19IEl0ZW1zIixUdXJuUGFnZToiVHVybiBQYWdlIixTd2l0Y2g6IlN3aXRjaCIsRW1wdHlUZXh0SW5wdXQ6IkVtcHR5IFRleHQgSW5wdXQiLFJlZ3VsYXJFeHBJbmNvcnJlY3RseToiUmVndWxhciBleHByZXNzaW9uIGlzIGluY29ycmVjdGx5IixOb0NvbmZpZ3VyYXRpb246Ik1pc3NpbmcgQ29uZmlndXJhdGlvbiIsQ2xlYXJUaGlzT3B0aW9uOiJDbGVhciBUaGlzIE9wdGlvbiIsUmVzdG9yZUltYWdlQXR0cmlidXRlczoiUmVzdG9yZSBJbWFnZSBBdHRyaWJ1dGVzIixyZWN0VG9vbDoiUmVjdFRvb2wiLHRhZ1Rvb2w6IlRhZ1Rvb2wiLHBvbHlnb25Ub29sOiJQb2x5Z29uVG9vbCIsbGluZVRvb2w6IkxpbmVUb29sIixwb2ludFRvb2w6IlBvaW50VG9vbCIsdGV4dFRvb2w6IlRleHRUb29sIixTcGVlZDoiU3BlZWQiLFBsYXlQYXVzZToiUGxheSAvIFBhdXNlIixGYXN0Rm9yd2FyZDoiRmFzdCBGb3J3YXJkIixSZXdpbmQ6IlJld2luZCIsdmlkZW9JbnZhbGlkQW5kU2tpcDoiVmlkZW8gaW52YWxpZCwgcGxlYXNlIHNraXAiLGltYWdlSW52YWxpZEFuZFNraXA6IkltYWdlIGludmFsaWQsIHBsZWFzZSBza2lwIix2aWRlb0Vycm9yQW5kUmVsb2FkOiJGYWlsZWQgdG8gbG9hZCB2aWRlbywgcGxlYXNlIHJlbG9hZCIsaW1hZ2VFcnJvckFuZFJlbG9hZDoiRmFpbGVkIHRvIGxvYWQgaW1hZ2UsIHBsZWFzZSByZWxvYWQiLG9yTWFza0FzSW52YWxpZDoiIG9yIG1hc2sgaXQgYXMgaW52YWxpZCIsQ2xpY2tBbm90aGVyUG9seWdvbjoiQ2xpY2sgYW5vdGhlciBwb2x5Z29uIixQb2x5Z29uc1RvQmVDb21iaW5lZE5lZWRUb0JlU2VsZWN0ZWQ6IlBvbHlnb25zIHRvIGJlIGNvbWJpbmVkIG5lZWQgdG8gYmUgc2VsZWN0ZWQiLEN1cnZlTW9kZURvZXNOb3RTdXBwb3J0Q3V0dGluZzoiQ3VydmUgbW9kZSBkb2VzIG5vdCBzdXBwb3J0IGN1dHRpbmciLENvbWJpbmVTdWNjZXNzOiJDb21iaW5lIHN1Y2Nlc3MiLENvbWJpbmluZ0ZhaWxlZE5vdGlmeToiQ29tYmluaW5nIGZhaWxlZC4gUGxlYXNlIGNoZWNrIHdoZXRoZXIgdHdvIHBvbHlnb25zIGludGVyc2VjdCBvciB3aGV0aGVyIHBvbHlnb24gY29tYmluaW5nIGZvcm1zIGEgbGVhayIsQ29tYmluZU92ZXJsYXBBcmVhOiJDb21iaW5lIE92ZXJsYXAgQXJlYSIsTm9EZXBlbmRlbmN5OiJUaGlzIGltYWdlIGRvZXMgbm90IG5lZWQgdG8gYmUgbGFiZWxlZCIsVGV4dENoZWNrTnVtYmVyT25seToiUGxlYXNlIGVudGVyIHRoZSBudW1iZXIiLFRleHRDaGVja0VuZ2xpc2hPbmx5OiJQbGVhc2UgZW50ZXIgRW5nbGlzaCIsVGV4dENoZWNrQ3VzdG9tRm9ybWF0OiJQbGVhc2UgZW50ZXIgZGF0YSBpbiBjdXN0b20gZm9ybWF0IixGcmFtaW5nT2ZPYmplY3RUb0JlRGl2aWRlZDoiUGxlYXNlIGZyYW1lIHRoZSBvYmplY3QgdG8gYmUgZGl2aWRlZCBmaXJzdCIsQ2xpY2tPblRhcmdldDoiUGxlYXNlIGNsaWNrIG9uIHRhcmdldCBvYmplY3QiLFNwbGl0dGluZ0FsZ29yaXRobVByZWRpY3Rpb246IlNwbGl0dGluZyBhbGdvcml0aG0gcHJlZGljdGlvbiBpbiBwcm9ncmVzcy4uLiIsIjJEVmlldyI6IjJEVmlldyIsIjNEVmlldyI6IjNEVmlldyIsVG9wVmlldzoiVG9wVmlldyIsU2lkZVZpZXc6IlNpZGVWaWV3IixCYWNrVmlldzoiQmFja1ZpZXciLFNob3dBcnJvd3M6IlNob3cgQXJyb3dzIixMZW5ndGg6Ikxlbmd0aCIsV2lkdGg6IldpZHRoIixIZWlnaHQ6IkhlaWdodCIsUm90YXRpb25feToiUm90YXRpb25feSIsUG9pbnRDb3VudDoiUG9pbnQgQ291bnQiLEludmFsaWQ6IkludmFsaWQiLFRhZzoiVGFnIixTZWFyY2hUYWc6IlNlYXJjaCB0YWdzIixTdWJBdHRyaWJ1dGU6IlN1YkF0dHJpYnV0ZSIsUGxlYXNlU2VsZWN0OiJQbGVhc2UgU2VsZWN0IixDb3B5RW1wdHlJblBvaW50Q2xvdWQ6IlRoZSBjb3B5IGNvbnRlbnQgaXMgZW1wdHksIHBsZWFzZSBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgY2xvdWQgZGF0YSIsUGFzdGVFbXB0eUluUG9pbnRDbG91ZDoiUGxlYXNlIGNvcHkgdGhlIHBvaW50Q2xvdWQgZGF0YSBiZWZvcmUgcGFzdGluZyIsSGFzRHVwbGljYXRlSUQ6IkR1cGxpY2F0ZSBJRCBleGlzdHMsIGNvcHkgZmFpbGVkIixIYXNEdXBsaWNhdGVJREhlYWRlcjoiVHJhY2tJRCBkdXBsaWNhdGlvbiBleGlzdHMiLEhhc0R1cGxpY2F0ZUlETXNnOiJUaGVyZSBpcyBhbiBpc3N1ZSB3aXRoIGR1cGxpY2F0ZSB0cmFja0lEcywgb3ZlcnJpZGUgaXQ/IixMb3dlckxpbWl0UG9pbnRzTnVtSW5Cb3g6IlRoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBib3ggbXVzdCBub3QgYmUgbGVzcyB0aGFuIHt7bnVtfX0iLFBvaW50VGhpY2tuZXNzOiJQb2ludCBUaGlja25lc3MiLFJvdGF0ZUFyb3VuZENlbnRlclBvaW50OiJSb3RhdGUgQXJvdW5kIENlbnRlciBQb2ludCIsUG9pbnRDbG91ZFZpZXdUcmFuc2xhdGU6IlBvaW50Q2xvdWRWaWV3IFRyYW5zbGF0aW9uIixUb3BWaWV3VHJhbnNsYXRlOiJUb3BWaWV3IFRyYW5zbGF0aW9uIixDaGFuZ2VQb2ludENsb3VkVmFsaWQ6IkNoYW5nZSBQb2ludENsb3VkIFZhbGlkIixMYXNzb1NlbGVjdG9yOiJMYXNzbyIsUmVjdFNlbGVjdG9yOiJSZWN0IixTZWxlY3Rvck1zZzoiUmlnaHQtY2xpY2sgZHJhZyB0byBzZWxlY3QiLEFkZFBvaW50OiJBZGQgUG9pbnQiLENpcmNsZVNlbGVjdG9yOiJQb2ludCIsRGV0ZWN0aW9uTW9kZToiRGV0ZWN0aW9uTW9kZSIsU2VnbWVudGF0aW9uTW9kZToiU2VnbWVudGF0aW9uTW9kZSIsRW50ZXJFZGl0TW9kZToiRW50ZXIgZWRpdCBtb2RlIixTZWxlY3RlZFBvaW50czoiU2VsZWN0ZWQgUG9pbnRzIixDb3B5Qm94OiJDb3B5IEJveCIsUGFzdGVCb3g6IlBhc3RlIEJveCIsUm90YXRlTGVmdDoiUm90YXRlIExlZnQiLFJvdGF0ZVJpZ2h0OiJSb3RhdGUgUmlnaHQiLE5leHRCb3g6Ik5leHQgQm94IixQcmV2aW91c0JveDoiUHJldmlvdXMgQm94IixSb3RhdGU5MDoiUm90YXRlIDkwwrAiLENvcHlQcmV2UGFnZToiQ29weSBQcmV2aW91cyBQYWdlIixDaGFuZ2VCb3hWYWxpZDoiQ2hhbmdlIEJveCdzIFZhbGlkIixNdWx0aVNlbGVjdDoiTXVsdGkgU2VsZWN0IixTZWxlY3RBbGxCb3g6IlNlbGVjdCBBbGwgQm94ZXMiLEdlbmVyYWxPcGVyYXRpb246IkdlbmVyYWwgT3BlcmF0aW9uIixSZWN0UGF0dGVybjoiUmVjdCBQYXR0ZXJuIixQb2x5Z29uUGF0dGVybjoiUG9seWdvbiBQYXR0ZXJuIixDaGFuZ2VQYXR0ZXJuTXNnOiJDaGFuZ2UgUGF0dGVybiB0byB7e3BhdHRlcm59fSBzdWNjZXNzZnVsbHkiLERyYWdPcGVyYXRpb246IkRyYWciLFNlbGVjdGVkU3RhdHVzOiJTZWxlY3RlZCIsdXBkYXRlVmFsaWRGcm9tVmFsaWRUb0luVmFsaWQ6IkNvbmZpcm0gdXBkYXRlIGFzIGludmFsaWQgcGFnZe+8nyIsdXBkYXRlVmFsaWRGcm9tSW5WYWxpZFRvVmFsaWQ6IkNvbmZpcm0gdXBkYXRlIGFzIHZhbGlkIHBhZ2XvvJ8iLEFsbFRyYWNrSURzOiJBbGwgVHJhY2tJRHMiLEN1cnJlbnRCb3hUcmFja0lEczoiQ3VycmVudCBUcmFja0lEIixQb3NpdGl2ZUludGVnZXJDaGVjazoiUGxlYXNlIGVudGVyIGEgcG9zaXRpdmUgaW50ZWdlciIsTm90QWxsb3dEZWNpbWFsUG9pbnRzSW5UcmFja0lEOiJUcmFja0lEIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGRlY2ltYWwiLER1cGxpY2F0ZVRyYWNrSURzRXhpc3Q6IkR1cGxpY2F0ZSB0cmFja0lEcyBleGl0cyIsQmF0Y2hVcGRhdGVUZXh0OiJCYXRjaCBVcGRhdGUiLEJhdGNoVXBkYXRlVHJhY2tJRDoiQmF0Y2ggdXBkYXRlIHRyYWNrSURzIixUcmFja0lEVW5pZnlBczoiVHJhY2tJRCBpcyBVbmlmeSBhcyIsVW5pZnlUcmFja0lEUmFuZ2U6IlVuaWZ5IFRyYWNrSUQgUmFuZ2UiLFBhZ2U6IlBhZ2UiLE9rVGV4dDoiT0siLENhbmNlbFRleHQ6IkNhbmNlbCIsVW5pZnlQYXJhbXM6IlVuaWZ5IFBhcmFtcyIsVW5pZnlBdHRyaWJ1dGVSYW5nZToiVW5pZnkgUmFuZ2UiLFVuaWZ5VHJhY2tJRDoiVW5pZnkgVHJhY2tJRCIsVW5pZnlTaXplOiJVbmlmeSBTaXplIixVbmlmeVRhZzoiVW5pZnkgVGFnIixOb0RhdGE6Ik5vIERhdGEiLEFubm90YXRlZExpc3Q6IkFubm90YXRlZCBMaXN0IixvbkRlbGV0ZUdyYXBoQnlBdHRyOiJBcmUgeW91IHN1cmUgdG8gZGVsZXRlIHRoZSBkYXRhIHdpdGggYXR0cmlidXRlIHt7YXR0cmlidXRlfX0/IixDYW5jZWxGaXhlZDoiQ2FuY2VsIEZpeGVkIixGaXhlZE9uTGVmdDoiRml4ZWQgT24gTGVmdCIsRml4ZWRPblJpZ2h0OiJGaXhlZCBPbiBSaWdodCIsQW5ub3RhdGVkUmVzdWx0OiJBbm5vdGF0ZWQgUmVzdWx0IixDb21wbGVtZW50YXJ5VHJhY2tpbmc6IkNvbXBsZW1lbnRhcnkgdHJhY2tpbmciLENvbXBsZW1lbnRhcnlUcmFja2luZ1ByZWRpY3Rpb246IkNvbXBsZW1lbnRhcnkgdHJhY2tpbmcgcHJlZGljdGlvbiIsQXBwbHk6IkFwcGx5IixCZWZvcmVQcmVkaWN0U3RhcnRpbmc6IkJlZm9yZSBzdGFydGluZywgcGxlYXNlIG1hcmsgdGhlIGZpcnN0IGFuZCBsYXN0IGJveCwgbmVlZCB0aGUgc2FtZSB0cmFja0lEIixUaGVQcmVkaWN0ZWRQb2ludENsb3VkOiJUaGUgcHJlZGljdGVkIHBvaW50IGNsb3VkIG5vdyBuZWVkcyB0byBiZSBsZXNzIHRoYW4gMTAgZnJhbWVzIixDYW1lcmFGb2xsb3dUb3BWaWV3OiJQb3NpdGlvbmVkIGJ5IHRvcCB2aWV3IixNYXJrT25seU9uZToiTWFyayBvbmx5IG9uZSBmcmFtZSBvZiBkYXRhLCBuZWVkIHRvIG1hcmsgdGhlIGZpcnN0IGFuZCBsYXN0IGZyYW1lIG9mIGRhdGEiLEhhdmVOb05lZWQ6IkhhdmUgbm8gbmVlZCB0byBwcmVkaWN0IHRoZSBkYXRhIGJldHdlZW4gdHdvIGZyYW1lcywgcGxlYXNlIG1hcmsgdGhlIGZpcnN0IGFuZCBsYXN0IGZyYW1lIGZpcnN0LCBhbmQgbmVlZCB0aGUgc2FtZSBzZXJpYWwgbnVtYmVyIixQcmVkaWN0aW5nRGF0YUZyb206IlByZWRpY3RpbmcgZGF0YSBmcm9tIHBhZ2Uge3tzdGFydFBhZ2V9fSB0byBwYWdlIHt7ZW5kUGFnZX19IHdpdGggYm94IElEIHt7c2VsZWN0ZWRCb3hUcmFja0lEfX0iLFBvaW50Q2xvdWRDb3Zlck1vZGU6IldoZW4gdGhlIHNhbWUgcG9pbnQgY2xvdWQgaXMgc2VsZWN0ZWQsIHRoZSBsYXRlciBtYXJrZXIgb3ZlcndyaXRlcyB0aGUgcHJldmlvdXMgb25lIixQb2ludENsb3VkVW5jb3Zlck1vZGU6IldoZW4gdGhlIHNhbWUgcG9pbnQgY2xvdWQgaXMgc2VsZWN0ZWQsIHRoZSBsYXR0ZXIgbWFya2VyIGNhbm5vdCBvdmVyd3JpdGUgdGhlIGZvcm1lciBtYXJrZXIiLFBvaW50Q2xvdWRGb2N1c01vZGU6IkZvY3VzIG1vZGUgaGFzIGJlZW4gdHVybmVkIG9uIixQb2ludENsb3VkVW5mb2N1c01vZGU6IkZvY3VzIG1vZGUgaXMgdHVybmVkIG9mZiIsUG9pbnRDbG91ZEhpZGVTZWdtZW50OiJNYXJrZWQgcG9pbnQgY2xvdWQgaXMgaGlkZGVuIixQb2ludENsb3VkU2hvd1NlZ21lbnQ6IkFsbCBwb2ludCBjbG91ZHMgaGF2ZSBiZWVuIGRpc3BsYXllZCIsUG9pbnRDbG91ZEhpZGVTZWdtZW50SW52YWxpZDoiVW5hdmFpbGFibGUgaW4gZm9jdXMgbW9kZSIsUG9pbnRDbG91ZEhpZGVGb2N1c0ludmFsaWRfaGlkZToiRm9jdXMgbW9kZSBpcyBub3QgYXZhaWxhYmxlLCBwbGVhc2Ugc2hvdyB0aGUgbWFya2VkIHBvaW50IGZpcnN0IixQb2ludENsb3VkSGlkZUZvY3VzSW52YWxpZF9ub25lOiJGb2N1cyBtb2RlIGlzIG5vdCBhdmFpbGFibGUsIHBsZWFzZSBzZWxlY3QgdGhlIG1hcmtlciB0byBiZSBmb2N1c2VkIGZpcnN0IixQYWxldHRlOiJQYWxldHRlIixFZmZpY2llbnRMaXN0ZW5pbmc6IlRoZSB0YXNrIGlzIG1hcmtlZCBpbiB0aGUgZWZmaWNpZW5jeSBtb25pdG9yaW5nLi4uIixUaXRsZToiVGl0bGUiLEFuc3dlcjoiQW5zd2VyIixGaW5pc2hlZDoiRmluaXNoZWQiLFVuZmluaXNoZWQ6IlVuZmluaXNoZWQiLE92ZXJhbGxTY29yZToiT3ZlcmFsbFNjb3JlIixOb1Njb3JpbmdTY2FsZToiQ29uZmlndXJhYmxlIHN0ZXAgZGV0YWlscyBvbiB0aGUgbGVmdCIsQmVzdDoiQmVzdCIsV29yc3Q6IldvcnN0IixSYW5raW5nUXVhbGl0eU9mQW5zd2VyczoiUmFua2luZ1F1YWxpdHlPZkFuc3dlcnMiLFRvQmVTb3J0ZWQ6IlRvQmVTb3J0ZWQiLFllczoiWWVzIixObzoiTm8iLEFkZGl0aW9uYWxDb250ZW50OiJBZGRpdGlvbmFsQ29udGVudCIsU3VibWl0OiJTdWJtaXQiLERyYWdBbmREcm9wOiJEcmFnIGFuZCBkcmFwIixEZWZhdWx0U2l6ZToiQ2xpY2sgdG8gdXNlIHRoZSBkZWZhdWx0IHNpemUuIixOb3JtYWxTaXplUmFuZ2U6Ik5vcm1hbCBzaXplIHJhbmdlIixOb3JtYWxDZW50ZXJQb2ludFJhbmdlOiJOb3JtYWwgY2VudGVyIHBvaW50IHJhbmdlIixMb2FkaW5nVGlwczoiV2FpdCBhIG1pbnV0ZSwgRGF0YSBMb2FkaW5nIH4iLFVubG9ja2VkOiJVbmxvY2tlZCIsTG9ja2VkOiJMb2NrZWQiLExlYXN0Q2hhcmFjdGVyRXJyb3I6IlBsZWFzZSBlbnRlciBhdCBsZWFzdCB7e251bX19IGNoYXJhY3RlcnMiLEFuZDoiQW5kIixPcjoiT3IiLEltYWdlTGFiZWxzOiJJbWFnZSBsYWJlbHMiLCIzRFJlY3QiOiIzRCBSZWN0IiwiMkRSZWN0IjoiMkQgUmVjdCIsQWRkUG9pbnRzOiJBREQiLFJlbW92ZVBvaW50czoiUkVNT1ZFIixSZXNldDoiUmVzZXQiLFBsZWFzZUZyYW1lVGhlT2JqZWN0VG9CZURpdmlkZWRGaXJzdDoiUGxlYXNlIGZyYW1lIHRoZSBvYmplY3QgdG8gYmUgZGl2aWRlZCBmaXJzdCIsQ2xpY2tPblRoZVRhcmdldE9iamVjdFRvU3BsaXRJdDoiQ2xpY2sgb24gdGhlIHRhcmdldCBvYmplY3QgdG8gc3BsaXQgaXQiLENsaWNrVGhlVGFyZ2V0T2JqZWN0QWdhaW5Ub0luY3JlYXNlVGhlU2VnbWVudGF0aW9uOiJDbGljayB0aGUgdGFyZ2V0IG9iamVjdCBhZ2FpbiB0byBpbmNyZWFzZSB0aGUgc2VnbWVudGF0aW9uIixDbGlja09uVGhlVGFyZ2V0T2JqZWN0VG9EZWxldGVUaGVTZWdtZW50YXRpb246IkNsaWNrIG9uIHRoZSB0YXJnZXQgb2JqZWN0IHRvIGRlbGV0ZSB0aGUgc2VnbWVudGF0aW9uIixDbGlja0FnYWluT25UaGVUYXJnZXRPYmplY3RUb0RlbGV0ZVRoZVNlZ21lbnRhdGlvbjoiQ2xpY2sgYWdhaW4gb24gdGhlIHRhcmdldCBvYmplY3QgdG8gZGVsZXRlIHRoZSBzZWdtZW50YXRpb24iLEFuc3dlcnNBcmVCZWluZ0dlbmVyYXRlZDoiQW5zd2VycyBhcmUgYmVpbmcgZ2VuZXJhdGVkIixBbnN3ZXJHZW5lcmF0aW9uRmFpbGVkUGxlYXNlVHJ5QWdhaW5MYXRlcjoiQW5zd2VyIGdlbmVyYXRpb24gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIixSZUdlbmVyYXRlOiJSZS1nZW5lcmF0ZSIsQW5zd2VyVGV4dEVkaXQ6IkFuc3dlciB0ZXh0IGVkaXQiLFNob3dFZGl0aW5nUmVzdWx0RGlmZmVyZW5jZXNJblRleHRNb2RlT25seToiU2hvdyBlZGl0aW5nIHJlc3VsdCBkaWZmZXJlbmNlcyBpbiB0ZXh0IG1vZGUgb25seSIsQXR0cmlidXRlTG9ja05vdGlmeToiVmlldyBQcm9wZXJ0aWVz77yae3tsYWJlbH1977yMb25seSBkaXNwbGF5IHRoZSBhbm5vdGF0aW9uIGNvbnRlbnQgb2YgdGhlIHNlbGVjdGVkIHByb3BlcnRpZXMiLEF1ZGlvU2VnbWVudFRpcDoiUGxlYXNlIHNlbGVjdCB0aGUgZGVzaXJlZCB0aW1lIHBvaW50IGZvciBjYXB0dXJl77yIe3t0aW1lfX3vvIkiLEF1ZGlvQ29tYmluZVRpcDoiUGxlYXNlIGNsaWNrIG9uIHRoZSBpbnRlcnZhbHMgeW91IHdpc2ggdG8gbWVyZ2UiLENsaXBwZWRBdWRpbzoiQ2FwdHVyZWQgY29udGVudCIsTm9DbGlwcGVkRGF0YToiTm8gY2FwdHVyZWQgY29udGVudCIsQ29tcGFyZVRhZ3M6IlRhZyBjb21wYXJpc29uIGRpc3BsYXkiLENvbWJpbmVBdWRpbzoiTWVyZ2UgaW50ZXJ2YWxzIixDbGlwQXVkaW86IlNwbGl0IGludGVydmFscyIsU3dpdGNoQ2xpcE1vZGU6IlN3aXRjaCB0byBjYXB0dXJlIG1vZGUiLFN3aXRjaFRhZ01vZGU6IlN3aXRjaCB0byB0YWcgbW9kZSIsQ2xpcDoiQ2FwdHVyZSIsUHJldmlvdXNJbnRlcnZhbDoiUHJldmlvdXMgaW50ZXJ2YWwiLE5leHRJbnRlcnZhbDoiTmV4dCBpbnRlcnZhbCIsRGVsZXRlQ29tbWVudDoiRGVsZXRlIENvbW1lbnRzIixEZWxldGVDb21tZW50Q29uZmlybToiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFubm90YXRpb24/IixQcmV2aW91c0NvbW1lbnQ6IlByZXZpb3VzIGNvbW1lbnQiLE5leHRDb21tZW50OiJOZXh0IGNvbW1lbnQiLENsaXBTZWxlY3Q6IlNlbGVjdCIsIkZvcndhcmQwLjEiOiJBZHZhbmNlIGJ5IDAuMSBzZWNvbmRzIiwiQmFjazAuMSI6IlJld2luZCBieSAwLjEgc2Vjb25kcyIsTGVmdENsaWNrOiJMZWZ0LWNsaWNrIixTY3JpYmJsZToiU2NyaWJibGUiLEVyYXNlOiJFcmFzZSIsU2NyaWJibGVMaW5lOiJTY3JpYmJsZSAoQ29ubmVjdCkiLFN0cm9rZUVubGFyZ2U6IlN0cm9rZSB0byBlbmxhcmdlIixTdHJva2VSZWR1Y3Rpb246IlN0cm9rZSByZWR1Y3Rpb24iLHRvZ2dsZVNob3dUZXh0OiJUZXh0IENvbXBhcmlzb24gRGlzcGxheSIsQ2xpcFNsaWNlOiJUcmltIFNlZ21lbnQiLFRpbWVTdGFtcDoiQWRkIFRpbWVzdGFtcCIsQ2xpcFRpbWU6IlRyaW0gVGltZSIsU3RhbXBUaW1lOiJUaW1lc3RhbXAgVGltZSIsR2V0U3RhcnRUaW1lOiJSZXRyaWV2ZSBTdGFydCBUaW1lIixHZXRFbmRUaW1lOiJSZXRyaWV2ZSBFbmQgVGltZSIsT3V0cHV0RGlzcGxheToiT3V0cHV0IGRpc3BsYXkiLE1heGltdW1DaGFyYWN0ZXJFcnJvcjoiVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNhbm5vdCBleGNlZWQge3tudW19fSIsQ29tbW9uU3ltYm9sczoiQ29tbW9uIHN5bWJvbHMiLEJpbmFyeU9wZXJhdGlvbnM6IkJpbmFyeSBvcGVyYXRpb25zIixCaW5hcnlSZWxhdGlvbnM6IkJpbmFyeSByZWxhdGlvbnMiLEFycm93czoiQXJyb3dzIixPdGhlcnM6Ik90aGVycyIsR3JlZWs6IkdyZWVrIGFscGhhYmV0IixMb3dlcmNhc2U6Ikxvd2VyY2FzZSIsVXBwZXJjYXNlOiJVcHBlcmNhc2UiLEFkdmFuY2VkTWF0aGVtYXRpY3M6IkFkdmFuY2VkIG1hdGhlbWF0aWNzIixGcmFjdGlvbmFsRGlmZmVyZW50aWF0aW9uOiJGcmFjdGlvbmFsIGRpZmZlcmVudGlhdGlvbiIsRnJhY3Rpb246IkZyYWN0aW9uIixEZXJpdmF0aXZlOiJEZXJpdmF0aXZlIixNb2R1bGFyQXJpdGhtZXRpYzoiTW9kdWxhciBhcml0aG1ldGljIixSYWRpY2FsOiJSYWRpY2FsIixTdXBBbmRTdWI6IlN1cGVyc2NyaXB0IGFuZCBzdWJzY3JpcHQiLExpbWl0TG9nYXJpdGhtOiJMaW1pdCBsb2dhcml0aG0iLExpbWl0czoiTGltaXRzIixMb2dhcml0aG1zQW5kRXhwb25lbnRzOiJMb2dhcml0aG1zIGFuZCBleHBvbmVudHMiLEJvdW5kczoiQm91bmRzIixJbnRlZ3JhbE9wZXJhdGlvbjoiSW50ZWdyYWwgb3BlcmF0aW9uIixJbnRlZ3JhbDoiSW50ZWdyYWwiLERvdWJsZUludGVncmFsOiJEb3VibGUgaW50ZWdyYWwiLFRyaXBsZUludGVncmFsOiJUcmlwbGUgaW50ZWdyYWwiLExhcmdlT3BlcmF0aW9uczoiTGFyZ2Ugb3BlcmF0aW9ucyIsUHJvZHVjdHNBbmRDb3Byb2R1Y3RzOiJQcm9kdWN0cyBhbmQgY29wcm9kdWN0cyIsSW50ZXJzZWN0aW9uQW5kVW5pb246IkludGVyc2VjdGlvbiBhbmQgdW5pb24iLExpbmVhckFsZ2VicmE6IkxpbmVhciBhbGdlYnJhIixCcmFja2V0Rm9yZW5zaWNzOiJCcmFja2V0IGZvcmVuc2ljcyIsQnJhY2tldDoiQnJhY2tldCIsQ29tbW9uOiJDb21tb24iLEFycmF5TWF0cml4OiJBcnJheSBtYXRyaXgiLFRyaWdvbm9tZXRyaWNGdW5jdGlvbnM6IlRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIixJbnZlcnNlVHJpZ29ub21ldHJpY0Z1bmN0aW9uczoiSW52ZXJzZSB0cmlnb25vbWV0cmljIGZ1bmN0aW9ucyIsSHlwZXJibGljRnVuY3Rpb25zOiJIeXBlcmJsaWMgZnVuY3Rpb25zIixJbnZlcnNlSHlwZXJibGljRnVuY3Rpb25zOiJJbnZlcnNlIGh5cGVyYmxpYyBmdW5jdGlvbnMiLEZvcm11bGFUZW1wbGF0ZToiRm9ybXVsYSB0ZW1wbGF0ZSIsQWxnZWJyYToiQWxnZWJyYSIsR2VvbWV0cnk6Ikdlb21ldHJ5IixJbmVxdWFsaXR5OiJJbmVxdWFsaXR5IixNYXRyaXg6Ik1hdHJpeCIsVHJpYW5nbGU6IlRyaWFuZ2xlIixTdGF0aXN0aWNzOiJTdGF0aXN0aWNzIixTZXF1ZW5jZToiU2VxdWVuY2UiLFBoeXNpY3M6IlBoeXNpY3MiLEluZGljYXRvckp1ZGdtZW50OiJJbmRpY2F0b3IganVkZ21lbnQiLE9ubHlDdXJyZW50RnJhbWU6Ik9ubHkgY3VycmVudCBmcmFtZSIsQ2xpY2tPblRoZUlkVG9IaWdobGlnaHRUaGVNYXJrdXBCb3g6IkNsaWNrIG9uIHRoZSBJRCB0byBoaWdobGlnaHQgdGhlIG1hcmt1cCBib3giLERvdWJsZUNsaWNrT25UaGVJZFRvQ29udGludW91c2x5SGlnaGxpZ2h0Qm94ZXNBY3Jvc3NGcmFtZXM6IkRvdWJsZS1jbGljayBvbiB0aGUgSUQgdG8gY29udGludW91c2x5IGhpZ2hsaWdodCBib3hlcyBhY3Jvc3MgZnJhbWVzIixGaW5kVGhlRnJhbWVDb3JyZXNwb25kaW5nVG9UaGVMYWJlbGVkRnJhbWVJZDoiRmluZCB0aGUgZnJhbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbGFiZWxlZCBmcmFtZSBJRCIsR2xvYmFsQW5ub3RhdGlvbjoiR2xvYmFsIGFubm90YXRpb24iLFF1YWxpZmllZEFubm90YXRpb246IlF1YWxpZmllZCBhbm5vdGF0aW9uIixJbnZhbGlkUXVlc3Rpb25BbmRTa2lwOiJJbnZhbGlkIHF1ZXN0aW9uLCBwbGVhc2Ugc2tpcCB0aGlzIHF1ZXN0aW9uIixQcm9qZWN0aW9uRnJhbWVDYW5ub3RCZURlbGV0ZWQ6IlByb2plY3Rpb24gZnJhbWUgY2Fubm90IGJlIGRlbGV0ZWQiLEZhaWxlZFRvQ29weVJlc3VsdHM6IkZhaWxlZCB0byBjb3B5IHJlc3VsdHMiLFBhcnRpYWxSZXN1bHRzUmVwbGljYXRpb25GYWlsdXJlOiJQYXJ0aWFsIHJlc3VsdHMgcmVwbGljYXRpb24gZmFpbHVyZSIsUm90YXRpb25BbmdsZVNlbnNpdGl2aXR5OiJSb3RhdGlvbiBhbmdsZSBzZW5zaXRpdml0eSIsIjJESW1hZ2VCYXRjaCI6IjJEIEltYWdlIEJhdGNoIiwiMkRJbWFnZUJhdGNoQ29ubmVjdGlvbiI6IjJEIEltYWdlIEJhdGNoIENvbm5lY3Rpb24iLCIyREltYWdlQmF0Y2hEaXNjb25uZWN0aW9uIjoiMkQgSW1hZ2UgQmF0Y2ggRGlzY29ubmVjdGlvbiIsQ29uZmlybVRvQmF0Y2hDb25uZWN0OiJDb25maXJtIGJhdGNoIGNvbm5lY3Rpb24/IixDb25maXJtVG9CYXRjaERpc2Nvbm5lY3Q6IkNvbmZpcm0gYmF0Y2ggZGlzY29ubmVjdGlvbj8iLENvbm5lY3Q6IkNvbm5lY3QiLERpc2Nvbm5lY3Q6ImRpc2Nvbm5lY3QiLEltYWdlMkRCb3hTY2FsZToiSW1hZ2UgMkQgQm94IFNjYWxlIixTZWxlY3RlZFJlY3Q6IlNlbGVjdGVkIFJlY3QifSxkdD17VGV4dElucHV0OiLmlofmnKzovpPlhaUiLEF0dHJpYnV0ZToi5Li75bGe5oCnIixOb0F0dHJpYnV0ZToi5peg5bGe5oCnIixTYXZlOiLkv53lrZgiLFVuZG86IuaSpOmUgCIsUmVkbzoi6YeN5YGaIixSb3RhdGU6IuaXi+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/IixMb3dlckxpbWl0UG9pbnRzTnVtSW5Cb3g6IuahhuS9k+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+WkhOeQhiIsU2VsZWN0ZWRSZWN0OiLpgInkuK3moYbkvZMifTtmdC5sYW5ndWFnZXx8ZnQuaW5pdCh7bG5nOiJlbiIsaW50ZXJwb2xhdGlvbjp7ZXNjYXBlVmFsdWU6ITF9fSksZnQuYWRkUmVzb3VyY2VCdW5kbGUoImVuIiwidHJhbnNsYXRpb24iLHB0LCEwKSxmdC5hZGRSZXNvdXJjZUJ1bmRsZSgiY24iLCJ0cmFuc2xhdGlvbiIsZHQsITApO2NvbnN0IGd0PXswOjAsMTouMiwzOi40LDU6LjYsNzouOCw5OjEsMTA6MX0seXQ9ezA6MCwxOjAsMzouMiw1Oi40LDc6LjYsOTouOCwxMDoxfSxtdD1jbGFzc3tzdGF0aWMgcmdiYVN0cmluZ1RvSGV4KHQpe2NvbnN0IGU9dC5zdWJzdHJpbmcoNSx0Lmxlbmd0aC0xKS5yZXBsYWNlKC8gL2csIiIpLnNwbGl0KCIsIiksbj1wYXJzZUludChlWzBdKSxyPXBhcnNlSW50KGVbMV0pLGk9cGFyc2VJbnQoZVsyXSksbz1wYXJzZUZsb2F0KGVbM10pO3JldHVybiIjIituLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikrci50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpK2kudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKStNYXRoLnJvdW5kKDI1NSpvKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfX07bGV0IHZ0PW10O3Z0LnJlcGxhY2VBRnJvbVJHQkE9KHQsZSk9PnQuc3BsaXQoIiAiKS5qb2luKCIiKS5yZXBsYWNlKC8sWzAtOV0rKFsuXXsxfVswLTldKyl7MCwxfVwpLyxgLCR7ZS50b0ZpeGVkKDIpfSlgKSx2dC50b1JHQkFBcnI9dD0+e2NvbnN0IGU9dC5tYXRjaCgvXGQrL2cpO2lmKGUpe2NvbnN0W3QsbixyLGldPWU7cmV0dXJuW3QsbixyLGldfX0sdnQuZ2V0VG9vbFN0cm9rZUFuZEZpbGw9KHQsZSk9Pntjb25zdHtob3ZlcjpuPSExLHNlbGVjdGVkOnI9ITEsYm9yZGVyT3BhY2l0eTppPTEsZmlsbE9wYWNpdHk6bz0xLGNvbW1vbk9wYWNpdHk6cz0uOH09ZTtyZXR1cm4gcnx8bj97c3Ryb2tlOm10LnJlcGxhY2VBRnJvbVJHQkEodCxpKSxmaWxsOm10LnJlcGxhY2VBRnJvbVJHQkEodCxvKSxyZ2JhOm10LnRvUkdCQUFycih0KX06e3N0cm9rZTptdC5yZXBsYWNlQUZyb21SR0JBKHQsaSpzKSxmaWxsOm10LnJlcGxhY2VBRnJvbVJHQkEodCxvKnMpLHJnYmE6bXQudG9SR0JBQXJyKHQpfX0sdnQuZ2V0U3Ryb2tlQW5kRmlsbD0odCxlPTEsbj0xKT0+KHtzdHJva2U6bXQucmVwbGFjZUFGcm9tUkdCQSh0LGUpLGZpbGw6bXQucmVwbGFjZUFGcm9tUkdCQSh0LG4pfSksdnQuZ2V0VG9vbENvbG9yTGlzdD0odCxlPTksbj05KT0+e2NvbnN0IHI9Z3RbZV0saT15dFtuXTtyZXR1cm57dmFsaWQ6bXQuZ2V0U3Ryb2tlQW5kRmlsbCh0LDEqciwuNCppKSxpbnZhbGlkOm10LmdldFN0cm9rZUFuZEZpbGwoSXQsMSpyLC44KmkpLHZhbGlkU2VsZWN0ZWQ6bXQuZ2V0U3Ryb2tlQW5kRmlsbCh0LDEqciwuOCppKSxpbnZhbGlkU2VsZWN0ZWQ6bXQuZ2V0U3Ryb2tlQW5kRmlsbChJdCwxKnIsLjI0KmkpLHZhbGlkSG92ZXI6bXQuZ2V0U3Ryb2tlQW5kRmlsbCh0LDEqciwuNjQqaSksaW52YWxpZEhvdmVyOm10LmdldFN0cm9rZUFuZEZpbGwoSXQsMSpyLC40KmkpfX0sdnQuZ2V0QXR0cmlidXRlSW5kZXg9KHQsZSk9Pnt0cnl7cmV0dXJuIGUuZmluZEluZGV4KChlPT5lLnZhbHVlPT09dCkpfWNhdGNoKHQpe3JldHVybi0xfX07dmFyIF90PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSx4dD1PYmplY3QuZGVmaW5lUHJvcGVydGllcyx3dD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxidD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLER0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksRXQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxDdD0odCxlLG4pPT5lIGluIHQ/X3QodCxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpufSk6dFtlXT1uO2NvbnN0IFN0PVsicmdiYSgxMDIsIDExMSwgMjU1LCAxKSIsInJnYmEoMTAyLCAyMzAsIDI1NSwgMSkiLCJyZ2JhKDE5MSwgMjU1LCAxMDIsIDEpIiwicmdiYSgyNTUsIDIzMCwgMTAyLCAxKSIsInJnYmEoMjMwLCAxMDIsIDI1NSwgMSkiXSxBdD1bInJnYmEoMTI4LCAxMiwgMjQ5LCAxKSIsInJnYmEoMCwgMjU1LCA0OCwgMSkiLCJyZ2JhKDI1NSwgMTM2LCAyNDcsIDEpIiwicmdiYSgyNTUsIDIyNiwgNTAsIDEpIiwicmdiYSgxNTMsIDY2LCAyMywgMSkiLCJyZ2JhKDIsIDEzMCwgMjUwLCAxKSIsInJnYmEoMjU1LCAzNSwgMzUsIDEpIiwicmdiYSgwLCAyNTUsIDIzNCwgMSkiXSxOdD1be3JnYmE6InJnYmEoMTI4LCAxMiwgMjQ5LCAxKSIsaGV4OjgzOTE5Mjl9LHtyZ2JhOiJyZ2JhKDAsIDI1NSwgNDgsIDEpIixoZXg6NjUzMjh9LHtyZ2JhOiJyZ2JhKDI1NSwgMTM2LCAyNDcsIDEpIixoZXg6MTY3NDY3NDN9LHtyZ2JhOiJyZ2JhKDI1NSwgMjI2LCA1MCwgMSkiLGhleDoxNjc2OTU4Nn0se3JnYmE6InJnYmEoMTUzLCA2NiwgMjMsIDEpIixoZXg6MTAwNDM5Mjd9LHtyZ2JhOiJyZ2JhKDIsIDEzMCwgMjUwLCAxKSIsaGV4OjE2NDYwMn0se3JnYmE6InJnYmEoMjU1LCAzNSwgMzUsIDEpIixoZXg6MTY3MjA2NzV9LHtyZ2JhOiJyZ2JhKDAsIDI1NSwgMjM0LCAxKSIsaGV4OjY1NTE0fV0sSXQ9InJnYmEoMjU1LCAxNTMsIDEwMiwgMSkiLE10PSJyZ2JhKDIwNCwgMjA0LCAyMDQsIDEpIjshZnVuY3Rpb24oKXtsZXQgdDtjb25zdCBlPW5ldyBBcnJheSgyNTYpLmZpbGwoIiIpLm1hcCgodD0+bmV3IEFycmF5KDMpLmZpbGwoIiIpKSk7Zm9yKGxldCBuPTA7bjwyMDtuKyspe2Zvcih0PTA7dDwzMjt0KyspZVt0XVswXT0xMjgrNCp0LGVbdF1bMV09MCxlW3RdWzJdPTA7Zm9yKGVbMzJdWzBdPTI1NSxlWzMyXVsxXT0wLGVbMzJdWzJdPTAsdD0wO3Q8NjM7dCsrKWVbMzMrdF1bMF09MjU1LGVbMzMrdF1bMV09NCs0KnQsZVszMyt0XVsyXT0wO2ZvcihlWzk2XVswXT0yNTQsZVs5Nl1bMV09MjU1LGVbOTZdWzJdPTIsdD0wO3Q8NjI7dCsrKWVbOTcrdF1bMF09MjUwLTQqdCxlWzk3K3RdWzFdPTI1NSxlWzk3K3RdWzJdPTYrNCp0O2ZvcihlWzE1OV1bMF09MSxlWzE1OV1bMV09MjU1LGVbMTU5XVsyXT0yNTQsdD0wO3Q8NjQ7dCsrKWVbMTYwK3RdWzBdPTAsZVsxNjArdF1bMV09MjUyLTQqdCxlWzE2MCt0XVsyXT0yNTU7Zm9yKHQ9MDt0PDMyO3QrKyllWzIyNCt0XVswXT0wLGVbMjI0K3RdWzFdPTAsZVsyMjQrdF1bMl09MjUyLTQqdH19KCk7dmFyIEZ0PW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2RlZmF1bHRDb2xvcnM9U3QsdGhpcy5fYXR0cmlidXRlQ29sb3JzPUF0fWdldCBkZWZhdWx0Q29sb3JzKCl7cmV0dXJuIHRoaXMuX2RlZmF1bHRDb2xvcnN9Z2V0IGF0dHJpYnV0ZUNvbG9ycygpe3JldHVybiB0aGlzLl9hdHRyaWJ1dGVDb2xvcnN9Z2V0Q29sb3JGcm9tQ29uZmlnKHQsZSxuLHIpe3ZhciBpLG8scyxhLHU7aWYoIltvYmplY3QgT2JqZWN0XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpdGhyb3ciQ29uZmlnIG11c3QgYmUgT2JqZWN0IjtpZigiW29iamVjdCBPYmplY3RdIiE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSl0aHJvdyJSZXN1bHQgbXVzdCBiZSBPYmplY3QiO2NvbnN0e2JvcmRlck9wYWNpdHk6Yz0xLGZpbGxPcGFjaXR5Omw9LjYsY29sb3JJbmRleDpoPTB9PW47cnx8KHI9e30pO2NvbnN0IGY9bnVsbD09KGk9bnVsbD09dD92b2lkIDA6dC52YWxpZCl8fGkse211bHRpQ29sb3JJbmRleDpwPS0xLHNlbGVjdGVkOmQsaG92ZXI6Z309cix5PXtzZWxlY3RlZDpkLGhvdmVyOmcsYm9yZGVyT3BhY2l0eTpjLGZpbGxPcGFjaXR5Omx9O2xldCBtPXRoaXMuZGVmYXVsdENvbG9ycztpZigoITA9PT0obnVsbD09ZT92b2lkIDA6ZS5hdHRyaWJ1dGVDb25maWd1cmFibGUpfHxwPi0xKSYmKG09dGhpcy5hdHRyaWJ1dGVDb2xvcnMpLCExPT09ZilyZXR1cm4gdnQuZ2V0VG9vbFN0cm9rZUFuZEZpbGwoSXQseSk7aWYoITA9PT0obnVsbD09ZT92b2lkIDA6ZS5hdHRyaWJ1dGVDb25maWd1cmFibGUpKXtjb25zdCBuPXZ0LmdldEF0dHJpYnV0ZUluZGV4KG51bGw9PXQ/dm9pZCAwOnQuYXR0cmlidXRlLG51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlTGlzdCk7bGV0IHI9bnVsbD09KHM9bnVsbD09KG89bnVsbD09ZT92b2lkIDA6ZS5hdHRyaWJ1dGVMaXN0KT92b2lkIDA6by5maW5kKChlPT5lLnZhbHVlPT09KG51bGw9PXQ/dm9pZCAwOnQuYXR0cmlidXRlKSkpKT92b2lkIDA6cy5jb2xvcixpPSIiOyFyJiYtMSE9PW4mJihyPW1bbiVtLmxlbmd0aF0pLC0xPT09biYmKHI9TXQpLGk9dnQucmdiYVN0cmluZ1RvSGV4KHIpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpO2NvbnN0IGM9cGFyc2VJbnQoaSwxNiksbD1udWxsIT0odT1udWxsPT0oYT1OdFtuJW0ubGVuZ3RoXSk/dm9pZCAwOmEuaGV4KT91OiIiO3JldHVybigodCxlKT0+eHQodCx3dChlKSkpKCgodCxlKT0+e2Zvcih2YXIgbiBpbiBlfHwoZT17fSkpRHQuY2FsbChlLG4pJiZDdCh0LG4sZVtuXSk7aWYoYnQpZm9yKHZhciBuIG9mIGJ0KGUpKUV0LmNhbGwoZSxuKSYmQ3QodCxuLGVbbl0pO3JldHVybiB0fSkoe30sdnQuZ2V0VG9vbFN0cm9rZUFuZEZpbGwocix5KSkse2hleDpjfHxsfSl9cmV0dXJuIHA+LTE/dnQuZ2V0VG9vbFN0cm9rZUFuZEZpbGwobVtwJW0ubGVuZ3RoXSx5KTp2dC5nZXRUb29sU3Ryb2tlQW5kRmlsbChtW2glbS5sZW5ndGhdLHkpfWdldENvbG9yQnlDb25maWcoe2F0dHJpYnV0ZTp0LGNvbmZpZzplLHN0eWxlOm59KXt2YXIgcixpLG87aWYoITA9PT0obnVsbD09ZT92b2lkIDA6ZS5hdHRyaWJ1dGVDb25maWd1cmFibGUpKXtjb25zdCBzPW51bGw9PShpPW51bGw9PShyPW51bGw9PWU/dm9pZCAwOmUuYXR0cmlidXRlTGlzdCk/dm9pZCAwOnIuZmluZCgoZT0+ZS52YWx1ZT09PXQpKSk/dm9pZCAwOmkuY29sb3I7aWYocylyZXR1cm4gdnQuZ2V0VG9vbENvbG9yTGlzdChzLG51bGw9PW4/dm9pZCAwOm4uYm9yZGVyT3BhY2l0eSxudWxsPT1uP3ZvaWQgMDpuLmZpbGxPcGFjaXR5KTtpZihudWxsPT1uP3ZvaWQgMDpuLmF0dHJpYnV0ZUNvbG9yKXtjb25zdCByPXZ0LmdldEF0dHJpYnV0ZUluZGV4KHQsbnVsbCE9KG89bnVsbD09ZT92b2lkIDA6ZS5hdHRyaWJ1dGVMaXN0KT9vOltdKSU4KzE7cmV0dXJuIG4uYXR0cmlidXRlQ29sb3Jbcl19fWlmKG4pe2NvbnN0e2NvbG9yOnQsdG9vbENvbG9yOmV9PW47aWYoZSlyZXR1cm4gZVt0XX1yZXR1cm4gdnQuZ2V0VG9vbENvbG9yTGlzdChNdCl9fSxUdD1PYmplY3QuZGVmaW5lUHJvcGVydHksT3Q9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxMdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFB0PU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsUnQ9KHQsZSxuKT0+ZSBpbiB0P1R0KHQsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOnRbZV09bixCdD0odCxlKT0+e2Zvcih2YXIgbiBpbiBlfHwoZT17fSkpTHQuY2FsbChlLG4pJiZSdCh0LG4sZVtuXSk7aWYoT3QpZm9yKHZhciBuIG9mIE90KGUpKVB0LmNhbGwoZSxuKSYmUnQodCxuLGVbbl0pO3JldHVybiB0fSxrdD0odCxlKT0+e3ZhciBuPXt9O2Zvcih2YXIgciBpbiB0KUx0LmNhbGwodCxyKSYmZS5pbmRleE9mKHIpPDAmJihuW3JdPXRbcl0pO2lmKG51bGwhPXQmJk90KWZvcih2YXIgciBvZiBPdCh0KSllLmluZGV4T2Yocik8MCYmUHQuY2FsbCh0LHIpJiYobltyXT10W3JdKTtyZXR1cm4gbn07Y29uc3QgenQ9InN0ZXBfMSIsanQ9Y2xhc3N7c3RhdGljIGdlbkNvbG9yQnlDb29yZCh0LGUsbil7cmV0dXJuIG48PTA/WzEyOCwxMjgsMTI4XTpuPDU/WzI1NSwwLDBdOm48MTA/WzAsMjU1LDBdOlswLDAsMjU1XX1zdGF0aWMgZ2V0U3RhbmRhcmRDb2xvckJ5Q29vcmQodCxlLG4pe3JldHVybiB0aGlzLmdlbkNvbG9yQnlDb29yZCh0LGUsbikubWFwKCh0PT50LzI1NSkpfXN0YXRpYyBwYXJzZVBvaW50Q2xvdWRDdXJyZW50UmVzdWx0KHQpe3ZhciBlLG4scixpLG8scyxhLHU7Y29uc3QgYz10aGlzLmpzb25QYXJzZXIodCksbD1udWxsIT0oZT1udWxsPT1jP3ZvaWQgMDpjW3p0XSk/ZTp7fSxoPW51bGwhPShuPW51bGw9PWw/dm9pZCAwOmwucmVzdWx0KT9uOltdLGY9bnVsbCE9KGk9bnVsbCE9KHI9bnVsbD09bD92b2lkIDA6bC5yZXN1bHRQb2x5Z29uKT9yOm51bGw9PWw/dm9pZCAwOmwucmVuZGVyUG9seWdvbik/aTpbXSxwPW51bGwhPShvPW51bGw9PWw/dm9pZCAwOmwucmVzdWx0TGluZSk/bzpbXSxkPW51bGwhPShzPW51bGw9PWw/dm9pZCAwOmwucmVzdWx0UG9pbnQpP3M6W10sZz1udWxsIT0oYT1udWxsPT1sP3ZvaWQgMDpsLnNlZ21lbnRhdGlvbik/YTpbXSx5PW51bGwhPSh1PW51bGw9PWw/dm9pZCAwOmwucmVzdWx0UmVjdCk/dTpbXTtyZXR1cm57Ym94UGFyYW1zTGlzdDpoLmZpbHRlcigodD0+IXRoaXMuaGFzRXJyb3JWYWx1ZU9iaih0KSkpLHBvbHlnb25MaXN0OmYsbGluZUxpc3Q6cCxzcGhlcmVQYXJhbXNMaXN0OmQsc2VnbWVudGF0aW9uOmcscmVjdExpc3Q6eX19c3RhdGljIGhhc0Vycm9yVmFsdWVPYmoodCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbnVsbD09dHx8TnVtYmVyLmlzTmFOKHQpfXJldHVybiBmdW5jdGlvbiB0KG4pe2lmKCJvYmplY3QiIT10eXBlb2Ygbnx8bnVsbD09PW4pcmV0dXJuIGUobik7Zm9yKGNvbnN0IHIgaW4gbil7Y29uc3QgaT1uW3JdO2lmKGUoaSl8fCJvYmplY3QiPT10eXBlb2YgaSYmdChpKSlyZXR1cm4hMH1yZXR1cm4hMX0odCl9c3RhdGljIGdldEJveFBhcmFtc0Zyb21SZXN1bHRMaXN0KHQpe2NvbnN0e2JveFBhcmFtc0xpc3Q6ZX09dGhpcy5wYXJzZVBvaW50Q2xvdWRDdXJyZW50UmVzdWx0KHQpO3JldHVybiBlfXN0YXRpYyBnZXRSZWN0UGFyYW1zRnJvbVJlc3VsdExpc3QodCl7dmFyIGUsbjtjb25zdCByPXRoaXMuanNvblBhcnNlcih0KTtyZXR1cm4gbnVsbCE9KG49bnVsbD09KGU9bnVsbD09cj92b2lkIDA6clt6dF0pP3ZvaWQgMDplLnJlc3VsdFJlY3QpP246W119c3RhdGljIGdldFNwaGVyZVBhcmFtc0Zyb21SZXN1bHRMaXN0KHQpe3ZhciBlLG47Y29uc3Qgcj10aGlzLmpzb25QYXJzZXIodCk7cmV0dXJuIG51bGwhPShuPW51bGw9PShlPW51bGw9PXI/dm9pZCAwOnJbenRdKT92b2lkIDA6ZS5yZXN1bHRQb2ludCk/bjpbXX1zdGF0aWMgZ2V0U2VnbWVudEZyb21SZXN1bHRMaXN0KHQpe3ZhciBlLG47Y29uc3Qgcj10aGlzLmpzb25QYXJzZXIodCk7cmV0dXJuIG51bGwhPShuPW51bGw9PShlPW51bGw9PXI/dm9pZCAwOnJbenRdKT92b2lkIDA6ZS5zZWdtZW50YXRpb24pP246W119c3RhdGljIGdldExpbmVMaXN0RnJvbVJlc3VsdExpc3QodCl7dmFyIGUsbjtjb25zdCByPXRoaXMuanNvblBhcnNlcih0KTtyZXR1cm4gbnVsbCE9KG49bnVsbD09KGU9bnVsbD09cj92b2lkIDA6clt6dF0pP3ZvaWQgMDplLnJlc3VsdExpbmUpP246W119c3RhdGljIGdldFBvbHlnb25MaXN0RnJvbVJlc3VsdExpc3QodCl7dmFyIGUsbixyLGk7Y29uc3Qgbz10aGlzLmpzb25QYXJzZXIodCk7cmV0dXJuIG51bGwhPShpPW51bGwhPShyPW51bGw9PShlPW51bGw9PW8/dm9pZCAwOm9benRdKT92b2lkIDA6ZS5yZXN1bHRQb2x5Z29uKT9yOm51bGw9PShuPW51bGw9PW8/dm9pZCAwOm9benRdKT92b2lkIDA6bi5yZW5kZXJQb2x5Z29uKT9pOltdfXN0YXRpYyBnZXRGcm9udFZpZXdQb2x5Z29uKHQpe2NvbnN0e2NlbnRlcjp7eDplLHk6bix6OnJ9LHdpZHRoOmksaGVpZ2h0Om8sZGVwdGg6c309dDtyZXR1cm5be3g6ZStpLzIseTpuK28vMix6OnItcy8yfSx7eDplK2kvMix5Om4rby8yLHo6citzLzJ9LHt4OmUraS8yLHk6bi1vLzIsejpyK3MvMn0se3g6ZStpLzIseTpuLW8vMix6OnItcy8yfSx7eDplK2kvMix5Om4rby8yLHo6ci1zLzJ9XX1zdGF0aWMgZ2V0QmFja1ZpZXdQb2x5Z29uKHQpe2NvbnN0e2NlbnRlcjp7eDplLHk6bix6OnJ9LHdpZHRoOmksaGVpZ2h0Om8sZGVwdGg6c309dDtyZXR1cm5be3g6ZS1pLzIseTpuLW8vMix6OnItcy8yfSx7eDplLWkvMix5Om4rby8yLHo6ci1zLzJ9LHt4OmUtaS8yLHk6bitvLzIsejpyK3MvMn0se3g6ZS1pLzIseTpuLW8vMix6OnIrcy8yfSx7eDplLWkvMix5Om4tby8yLHo6ci1zLzJ9XX1zdGF0aWMgZ2V0QWxsRGlyZWN0aW9uTGluZSh0KXtjb25zdHtjZW50ZXI6e3g6ZSx5Om4sejpyfSx3aWR0aDppLGhlaWdodDpvLGRlcHRoOnN9PXQ7cmV0dXJuW1t7eDplK2kvMix5Om4tby8yLHo6ci1zLzJ9LHt4OmUtaS8yLHk6bi1vLzIsejpyLXMvMn1dLFt7eDplK2kvMix5Om4rby8yLHo6ci1zLzJ9LHt4OmUtaS8yLHk6bitvLzIsejpyLXMvMn1dLFt7eDplK2kvMix5Om4tby8yLHo6citzLzJ9LHt4OmUtaS8yLHk6bi1vLzIsejpyK3MvMn1dLFt7eDplK2kvMix5Om4rby8yLHo6citzLzJ9LHt4OmUtaS8yLHk6bitvLzIsejpyK3MvMn1dXX1zdGF0aWMgZ2V0QWxsVmlld0RhdGEodCl7cmV0dXJuW3t0eXBlOiJwb2x5Z29uIixwb2ludExpc3Q6dGhpcy5nZXRGcm9udFZpZXdQb2x5Z29uKHQpfSx7dHlwZToicG9seWdvbiIscG9pbnRMaXN0OnRoaXMuZ2V0QmFja1ZpZXdQb2x5Z29uKHQpfSwuLi50aGlzLmdldEFsbERpcmVjdGlvbkxpbmUodCkubWFwKCh0PT4oe3R5cGU6ImxpbmUiLHBvaW50TGlzdDp0fSkpKV19c3RhdGljIHRyYW5zZmVyQm94MktpdHRpKHQpe3ZhciBlLG4scjtyZXR1cm57aGVpZ2h0Om51bGwhPShlPXQuZGVwdGgpP2U6MCxsZW5ndGg6bnVsbCE9KG49dC53aWR0aCk/bjowLHdpZHRoOm51bGwhPShyPXQuaGVpZ2h0KT9yOjAscm90YXRpb25feTp0LnJvdGF0aW9uP3RoaXMudHJhbnNmZXJSb3RhdGlvbjJLaXR0aVJvdGF0aW9uX3kodC5yb3RhdGlvbik6MH19c3RhdGljIHJlc3RyaWN0QW5nbGVSYW5nZSh0KXtjb25zdCBlPTIqTWF0aC5QSTtsZXQgbj10JWU7cmV0dXJuIG48MD9lK246bn1zdGF0aWMgdHJhbnNmZXJSb3RhdGlvbjJLaXR0aVJvdGF0aW9uX3kodCl7aWYodDwwKXJldHVybi10O2NvbnN0IGU9MipNYXRoLlBJLXQ7cmV0dXJuIGU+TWF0aC5QSSYmZTwyKk1hdGguUEk/LTEqdDoyKk1hdGguUEktdH1zdGF0aWMgZ2V0QWxsUG9pbnRDbG91ZFJlc3VsdCh7aW1nTGlzdDp0LHN0ZXA6ZT0xLGV4dHJhQm94TGlzdDpuLGV4dHJhU3BoZXJlTGlzdDpyPVtdLGlnbm9yZUluZGV4TGlzdDppPVtdLGlzUHJlUmVzdWx0Om89ITF9KXtjb25zdCBzPXQuZmlsdGVyKCgodCxlKT0+IShudWxsPT1pP3ZvaWQgMDppLmluY2x1ZGVzKGUpKSkpLm1hcCgodD0+e3ZhciBlO3JldHVybiB0aGlzLmpzb25QYXJzZXIobnVsbCE9KGU9bnVsbD09dD92b2lkIDA6dFtvPyJwcmVSZXN1bHQiOiJyZXN1bHQiXSk/ZToiIil9KSksYT1gc3RlcF8ke2V9YDtsZXQgdT1bXTtyZXR1cm4gcy5mb3JFYWNoKCh0PT57dmFyIGUsbjsobnVsbD09KG49bnVsbD09KGU9bnVsbD09dD92b2lkIDA6dFthXSk/dm9pZCAwOmUucmVzdWx0KT92b2lkIDA6bi5sZW5ndGgpPjAmJih1PXUuY29uY2F0KHRbYV0ucmVzdWx0KSl9KSksbiYmKHU9dS5jb25jYXQobikpLHImJih1PXUuY29uY2F0KHIpKSx1fXN0YXRpYyBnZXRJbmRleEJ5VHJhY2tJRCh0LGUsbil7Y29uc3Qgcj1bXSxpPWUubWFwKCh0PT57dmFyIGU7cmV0dXJuIHRoaXMuanNvblBhcnNlcihudWxsIT0oZT1udWxsPT10P3ZvaWQgMDp0W24/InByZVJlc3VsdCI6InJlc3VsdCJdKT9lOiIiKX0pKTtyZXR1cm4gaS5mb3JFYWNoKCgoZSxuKT0+e3ZhciBpO2NvbnN0IG89bnVsbD09KGk9bnVsbD09ZT92b2lkIDA6ZS5zdGVwXzEpP3ZvaWQgMDppLnJlc3VsdDsobnVsbD09bz92b2lkIDA6by5sZW5ndGgpPjAmJihudWxsPT1vP3ZvaWQgMDpvLmZpbmQoKGU9PihudWxsPT1lP3ZvaWQgMDplLnRyYWNrSUQpPT09dCkpKSYmci5wdXNoKG4pfSkpLHJ9c3RhdGljIGdldE5leHRUcmFja0lEKHtpbWdMaXN0OnQsc3RlcDplPTEsZXh0cmFCb3hMaXN0Om4sZXh0cmFTcGhlcmVMaXN0OnJ9KXtsZXQgaT0xO3JldHVybiB0aGlzLmdldEFsbFBvaW50Q2xvdWRSZXN1bHQoe2ltZ0xpc3Q6dCxzdGVwOmUsZXh0cmFCb3hMaXN0Om4sZXh0cmFTcGhlcmVMaXN0OnJ9KS5mb3JFYWNoKCh0PT57Im51bWJlciI9PXR5cGVvZihudWxsPT10P3ZvaWQgMDp0LnRyYWNrSUQpJiZ0LnRyYWNrSUQ+PWkmJihpPXQudHJhY2tJRCsxKX0pKSxpfXN0YXRpYyBiYXRjaFVwZGF0ZVRyYWNrSUQoe2lkOnQsbmV3SUQ6ZSxyZXN1bHQ6bixzdGVwOnI9MX0pe3ZhciBpO2NvbnN0IG89YHN0ZXBfJHtyfWAscz10aGlzLmpzb25QYXJzZXIobiksYT1udWxsPT0oaT1udWxsPT1zP3ZvaWQgMDpzW29dKT92b2lkIDA6aS5yZXN1bHQ7cmV0dXJuIGE/KGEuZm9yRWFjaCgobj0+KChudWxsPT1uP3ZvaWQgMDpuLnRyYWNrSUQpPT09dCYmKG4udHJhY2tJRD1lKSxuKSkpLEpTT04uc3RyaW5naWZ5KHMpKTpufXN0YXRpYyBiYXRjaFVwZGF0ZVRyYWNrSURDaGVjayh7bmV3SUQ6dCxyZXN1bHQ6ZSxzdGVwOm49MX0pe3ZhciByO2NvbnN0IGk9YHN0ZXBfJHtufWAsbz10aGlzLmpzb25QYXJzZXIoZSkscz1udWxsPT0ocj1udWxsPT1vP3ZvaWQgMDpvW2ldKT92b2lkIDA6ci5yZXN1bHQ7cmV0dXJuISFzJiZzLnNvbWUoKGU9PmUudHJhY2tJRD09PXQpKX1zdGF0aWMgYmF0Y2hVcGRhdGVSZXN1bHRCeVRyYWNrSUQoe2lkOnQsbmV3RGF0YTplLHJlc3VsdDpuLHN0ZXA6cj0xfSl7dmFyIGk7Y29uc3Qgbz1gc3RlcF8ke3J9YCxzPXRoaXMuanNvblBhcnNlcihuKSxhPW51bGw9PShpPW51bGw9PXM/dm9pZCAwOnNbb10pP3ZvaWQgMDppLnJlc3VsdDtyZXR1cm4gYT8oc1tvXS5yZXN1bHQ9YS5tYXAoKG49PntpZigobnVsbD09bj92b2lkIDA6bi50cmFja0lEKT09PXQpe2NvbnN0IHQ9QnQoe30sZSkscj10LnN1YkF0dHJpYnV0ZTtyZXR1cm4gciYmbi5zdWJBdHRyaWJ1dGUmJk9iamVjdC5hc3NpZ24odCx7c3ViQXR0cmlidXRlOkJ0KEJ0KHt9LG4uc3ViQXR0cmlidXRlKSxyKX0pLEJ0KEJ0KHt9LG4pLHQpfXJldHVybiBufSkpLEpTT04uc3RyaW5naWZ5KHMpKTpufXN0YXRpYyBnZXRNYXhTaXplRnJvbUJveCh7dHJhY2tJRDp0LGltZ0xpc3Q6ZX0pe2xldCBuO3JldHVybiBlLmZvckVhY2goKGU9Pnt2YXIgcjtjb25zdCBpPXRoaXMuanNvblBhcnNlcihlLnJlc3VsdCksbz1udWxsPT0ocj1udWxsPT1pP3ZvaWQgMDppW3p0XSk/dm9pZCAwOnIucmVzdWx0OyFvfHxvLmZvckVhY2goKGU9PntpZigobnVsbD09ZT92b2lkIDA6ZS50cmFja0lEKT09PXQpe2lmKCFuKXJldHVybiB2b2lkKG49e3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LGRlcHRoOmUuZGVwdGh9KTtlLndpZHRoPm4ud2lkdGgmJihuLndpZHRoPWUud2lkdGgpLGUuaGVpZ2h0Pm4uaGVpZ2h0JiYobi5oZWlnaHQ9ZS5oZWlnaHQpLGUuZGVwdGg+bi5kZXB0aCYmKG4uZGVwdGg9ZS5kZXB0aCl9fSkpfSkpLG59c3RhdGljIGdldFN1YkF0dHJpYnV0ZU5hbWUodCxlKXtjb25zdCBuPWUuaW5wdXRMaXN0O3JldHVybiBPYmplY3QuZW50cmllcyh0KS5tYXAoKChbdCxlXSk9Pnt2YXIgcjtjb25zdCBpPW4uZmluZCgoZT0+ZS52YWx1ZT09PXQpKTtpZihpKXtjb25zdCB0PW51bGw9PShyPW51bGw9PWk/dm9pZCAwOmkuc3ViU2VsZWN0ZWQpP3ZvaWQgMDpyLmZpbmQoKHQ9PnQudmFsdWU9PT1lKSk7aWYodClyZXR1cm57bGFiZWw6aS5rZXksdmFsdWU6dC5rZXl9fXJldHVybntsYWJlbDp0LHZhbHVlOmV9fSkpfXN0YXRpYyBnZXRJbnRlcnNlY3Rpb25CeVNsb3BlKHQpe2NvbnN0e3AxOmUsbGluZTE6bixwMjpyLGxpbmUyOml9PXQ7aWYoZS54PT09ci54JiZlLnk9PT1yLnkpcmV0dXJuIGU7bGV0IG8scztuWzBdLng9PT1uWzFdLngmJihvPWUueCksblswXS55PT09blsxXS55JiYocz1lLnkpLGlbMF0ueD09PWlbMV0ueCYmKG89ci54KSxpWzBdLnk9PT1pWzFdLnkmJihzPXIueSk7Y29uc3QgYT0oblswXS55LW5bMV0ueSkvKG5bMF0ueC1uWzFdLngpLHU9KGlbMF0ueS1pWzFdLnkpLyhpWzBdLngtaVsxXS54KTtyZXR1cm4gbz1udWxsIT1vP286KGUueS1yLnktYSplLngrdSpyLngpLyh1LWEpLHM9bnVsbCE9cz9zOmUueS1hKihlLngtbykse3g6byx5OnN9fXN0YXRpYyBnZXRDbG91ZEtleXModCxlLG4pe3JldHVyblt0LGUsbl0uam9pbigiQCIpfXN0YXRpYyBzcGxpdFBvaW50c0Zyb21JbmRleGVzKHQsZSl7Y29uc3Qgbj1uZXcgU2V0O2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9MSluLmFkZChlW3RdKTtjb25zdCByPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9MSluLmhhcyh0W2VdKXx8ci5wdXNoKHRbZV0pO3JldHVybiByfXN0YXRpYyBzcGxpdFBvaW50c0Zyb21Qb2ludHModCxlKXtjb25zdCBuPW5ldyBNYXA7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz0zKW4uc2V0KGp0LmdldENsb3VkS2V5cyhlW3RdLGVbdCsxXSxlW3QrMl0pLDEpO2NvbnN0IHI9W107Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz0zKXtjb25zdCBpPWp0LmdldENsb3VkS2V5cyh0W2VdLHRbZSsxXSx0W2UrMl0pO24uaGFzKGkpfHxyLnB1c2godFtlXSx0W2UrMV0sdFtlKzJdKX1yZXR1cm4gbmV3IEZsb2F0MzJBcnJheShyKX1zdGF0aWMgZ2V0RGVmYXVsdE9ydGhvZ3JhcGhpY1BhcmFtcyh0KXtyZXR1cm57bGVmdDotdC53aWR0aC8yLHJpZ2h0OnQud2lkdGgvMix0b3A6dC5oZWlnaHQvMixib3R0b206LXQuaGVpZ2h0LzIsbmVhcjouMSxmYXI6MWU0fX19O2xldCBVdD1qdDtVdC5qc29uUGFyc2VyPXQ9Pnt0cnl7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2godCl7cmV0dXJue319fSxVdC50cmFuc2ZlckNhbnZhczJXb3JsZD0odCxlKT0+e2NvbnN0e3dpZHRoOm4saGVpZ2h0OnJ9PWUsaT10LHt4Om8seTpzfT1pLGE9a3QoaSxbIngiLCJ5Il0pO3JldHVybiBCdCh7eDpyLzItcyx5Oi0oby1uLzIpfSxhKX0sVXQucG9pbnRMaXN0VHJhbnNmZXJDYW52YXMyV29ybGQ9KHQsZSk9Pm51bGw9PXQ/dm9pZCAwOnQubWFwKCh0PT5CdChCdCh7fSx0KSxqdC50cmFuc2ZlckNhbnZhczJXb3JsZCh0LGUpKSkpLFV0LnRyYW5zZmVyV29ybGQyQ2FudmFzPSh0LGUpPT57Y29uc3R7d2lkdGg6bixoZWlnaHQ6cn09ZSxpPXQse3g6byx5OnN9PWksYT1rdChpLFsieCIsInkiXSk7cmV0dXJuIEJ0KHt4Om4vMi1zLHk6ci8yLW99LGEpfTtjb25zdCBxdD0odCxlKT0+Wy4uLnQsLi4uZV07Y2xhc3MgVnR7c3RhdGljIHRyYW5zZmVyTWF0cml4MzRGcm9tS2l0dGkyVGhyZWUodCl7cmV0dXJuWy4uLnQucmVkdWNlKHF0LFtdKSwwLDAsMCwxXX1zdGF0aWMgdHJhbnNmZXJNYXRyaXgzM0Zyb21LaXR0aTJUaHJlZSh0KXtyZXR1cm5bLi4udC5yZWR1Y2UoKCh0LGUpPT5bLi4udCwuLi5lXS5jb25jYXQoWzBdKSksW10pLDAsMCwwLDFdfX12YXIgR3QsWXQsWHQsV3QsSHQsWnQsS3QsSnQsUXQsJHQ7KFl0PUd0fHwoR3Q9e30pKS5Gcm9udD0iRlJPTlQiLFl0LkJhY2s9IkJBQ0siLFl0LkxlZnQ9IkxFRlQiLFl0LlJpZ2h0PSJSSUdIVCIsWXQuVG9wPSJUT1AiLFl0LkxGVD0iTEVGVF9GUk9OVF9UT1AiLFl0LlJCVD0iUklHSFRfQkFDS19UT1AiLGZ1bmN0aW9uKHQpe3QuRGV0ZWN0aW9uPSJEZXRlY3Rpb24iLHQuU2VnbWVudGF0aW9uPSJTZWdtZW50YXRpb24ifShYdHx8KFh0PXt9KSksZnVuY3Rpb24odCl7dC5BZGQ9IkFERCIsdC5SZW1vdmU9IlJFTU9WRSJ9KFd0fHwoV3Q9e30pKSxmdW5jdGlvbih0KXt0LkNvdmVyPSJDb3ZlciIsdC5VbmNvdmVyPSJVbmNvdmVyIn0oSHR8fChIdD17fSkpLGZ1bmN0aW9uKHQpe3QuRm9jdXM9IkZvY3VzIix0LlVuZm9jdXM9IlVuZm9jdXMifShadHx8KFp0PXt9KSksZnVuY3Rpb24odCl7dC5SZWFkeT0iUkVBRFkiLHQuQ2hlY2s9IkNIRUNLIix0LkVkaXQ9IkVESVQiLHQuSG92ZXI9IkhPVkVSIn0oS3R8fChLdD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5Ob3JtYWw9MF09Ik5vcm1hbCIsdFt0Lk9tbmlDYW1lcmE9MV09Ik9tbmlDYW1lcmEiLHRbdC5LYW5uYWxhQnJhbmR0PTJdPSJLYW5uYWxhQnJhbmR0Iix0W3QuT21uaUNhbWVyYTExVj0zXT0iT21uaUNhbWVyYTExViJ9KEp0fHwoSnQ9e30pKSxmdW5jdGlvbih0KXt0W3QuTGluZT0wXT0iTGluZSIsdFt0LkN1cnZlPTFdPSJDdXJ2ZSJ9KFF0fHwoUXQ9e30pKSxmdW5jdGlvbih0KXt0W3QuUGVyaW9kPTBdPSJQZXJpb2QiLHRbdC5UaW1lPTFdPSJUaW1lIn0oJHR8fCgkdD17fSkpO3ZhciB0ZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIGVlKHQpe3ZhciBlPXtleHBvcnRzOnt9fTtyZXR1cm4gdChlLGUuZXhwb3J0cyksZS5leHBvcnRzfWVlKChmdW5jdGlvbih0LGUpeyhmdW5jdGlvbigpe3ZhciBuLHI9IkV4cGVjdGVkIGEgZnVuY3Rpb24iLGk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLG89Il9fbG9kYXNoX3BsYWNlaG9sZGVyX18iLHM9MTYsYT0zMix1PTY0LGM9MTI4LGw9MjU2LGg9MS8wLGY9OTAwNzE5OTI1NDc0MDk5MSxwPU5hTixkPTQyOTQ5NjcyOTUsZz1kLTEseT1kPj4+MSxtPVtbImFyeSIsY10sWyJiaW5kIiwxXSxbImJpbmRLZXkiLDJdLFsiY3VycnkiLDhdLFsiY3VycnlSaWdodCIsc10sWyJmbGlwIiw1MTJdLFsicGFydGlhbCIsYV0sWyJwYXJ0aWFsUmlnaHQiLHVdLFsicmVhcmciLGxdXSx2PSJbb2JqZWN0IEFyZ3VtZW50c10iLF89IltvYmplY3QgQXJyYXldIix4PSJbb2JqZWN0IEJvb2xlYW5dIix3PSJbb2JqZWN0IERhdGVdIixiPSJbb2JqZWN0IEVycm9yXSIsRD0iW29iamVjdCBGdW5jdGlvbl0iLEU9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixDPSJbb2JqZWN0IE1hcF0iLFM9IltvYmplY3QgTnVtYmVyXSIsQT0iW29iamVjdCBPYmplY3RdIixOPSJbb2JqZWN0IFByb21pc2VdIixJPSJbb2JqZWN0IFJlZ0V4cF0iLE09IltvYmplY3QgU2V0XSIsRj0iW29iamVjdCBTdHJpbmddIixUPSJbb2JqZWN0IFN5bWJvbF0iLE89IltvYmplY3QgV2Vha01hcF0iLEw9IltvYmplY3QgQXJyYXlCdWZmZXJdIixQPSJbb2JqZWN0IERhdGFWaWV3XSIsUj0iW29iamVjdCBGbG9hdDMyQXJyYXldIixCPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLGs9IltvYmplY3QgSW50OEFycmF5XSIsej0iW29iamVjdCBJbnQxNkFycmF5XSIsaj0iW29iamVjdCBJbnQzMkFycmF5XSIsVT0iW29iamVjdCBVaW50OEFycmF5XSIscT0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLFY9IltvYmplY3QgVWludDE2QXJyYXldIixHPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsWT0vXGJfX3AgXCs9ICcnOy9nLFg9L1xiKF9fcCBcKz0pICcnIFwrL2csVz0vKF9fZVwoLio/XCl8XGJfX3RcKSkgXCtcbicnOy9nLEg9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFo9L1smPD4iJ10vZyxLPVJlZ0V4cChILnNvdXJjZSksSj1SZWdFeHAoWi5zb3VyY2UpLFE9LzwlLShbXHNcU10rPyklPi9nLCQ9LzwlKFtcc1xTXSs/KSU+L2csdHQ9LzwlPShbXHNcU10rPyklPi9nLGV0PS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLG50PS9eXHcqJC8scnQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csaXQ9L1tcXF4kLiorPygpW1xde318XS9nLG90PVJlZ0V4cChpdC5zb3VyY2UpLHN0PS9eXHMrLyxhdD0vXHMvLHV0PS9ceyg/OlxuXC9cKiBcW3dyYXBwZWQgd2l0aCAuK1xdIFwqXC8pP1xuPy8sY3Q9L1x7XG5cL1wqIFxbd3JhcHBlZCB3aXRoICguKylcXSBcKi8sbHQ9Lyw/ICYgLyxodD0vW15ceDAwLVx4MmZceDNhLVx4NDBceDViLVx4NjBceDdiLVx4N2ZdKy9nLGZ0PS9bKCk9LHt9XFtcXVwvXHNdLyxwdD0vXFwoXFwpPy9nLGR0PS9cJFx7KFteXFx9XSooPzpcXC5bXlxcfV0qKSopXH0vZyxndD0vXHcqJC8seXQ9L15bLStdMHhbMC05YS1mXSskL2ksbXQ9L14wYlswMV0rJC9pLHZ0PS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLF90PS9eMG9bMC03XSskL2kseHQ9L14oPzowfFsxLTldXGQqKSQvLHd0PS9bXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1ceGZmXHUwMTAwLVx1MDE3Zl0vZyxidD0vKCReKS8sRHQ9L1snXG5cclx1MjAyOFx1MjAyOVxcXS9nLEV0PSJcXHVkODAwLVxcdWRmZmYiLEN0PSJcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmYiLFN0PSJcXHUyNzAwLVxcdTI3YmYiLEF0PSJhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmIixOdD0iQS1aXFx4YzAtXFx4ZDZcXHhkOC1cXHhkZSIsSXQ9IlxcdWZlMGVcXHVmZTBmIixNdD0iXFx4YWNcXHhiMVxceGQ3XFx4ZjdcXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHhiZlxcdTIwMDAtXFx1MjA2ZiBcXHRcXHgwYlxcZlxceGEwXFx1ZmVmZlxcblxcclxcdTIwMjhcXHUyMDI5XFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMCIsRnQ9Ilsn4oCZXSIsVHQ9IlsiK0V0KyJdIixPdD0iWyIrTXQrIl0iLEx0PSJbIitDdCsiXSIsUHQ9IlxcZCsiLFJ0PSJbIitTdCsiXSIsQnQ9IlsiK0F0KyJdIixrdD0iW14iK0V0K010K1B0K1N0K0F0K050KyJdIix6dD0iXFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdIixqdD0iW14iK0V0KyJdIixVdD0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIscXQ9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLFZ0PSJbIitOdCsiXSIsR3Q9IlxcdTIwMGQiLFl0PSIoPzoiK0J0KyJ8IitrdCsiKSIsWHQ9Iig/OiIrVnQrInwiK2t0KyIpIixXdD0iKD86WyfigJldKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIsSHQ9Iig/Olsn4oCZXSg/OkR8TEx8TXxSRXxTfFR8VkUpKT8iLFp0PSIoPzoiK0x0KyJ8Iit6dCsiKSIrIj8iLEt0PSJbIitJdCsiXT8iLEp0PUt0K1p0KygiKD86IitHdCsiKD86IitbanQsVXQscXRdLmpvaW4oInwiKSsiKSIrS3QrWnQrIikqIiksUXQ9Iig/OiIrW1J0LFV0LHF0XS5qb2luKCJ8IikrIikiK0p0LCR0PSIoPzoiK1tqdCtMdCsiPyIsTHQsVXQscXQsVHRdLmpvaW4oInwiKSsiKSIsZWU9UmVnRXhwKEZ0LCJnIiksbmU9UmVnRXhwKEx0LCJnIikscmU9UmVnRXhwKHp0KyIoPz0iK3p0KyIpfCIrJHQrSnQsImciKSxpZT1SZWdFeHAoW1Z0KyI/IitCdCsiKyIrV3QrIig/PSIrW090LFZ0LCIkIl0uam9pbigifCIpKyIpIixYdCsiKyIrSHQrIig/PSIrW090LFZ0K1l0LCIkIl0uam9pbigifCIpKyIpIixWdCsiPyIrWXQrIisiK1d0LFZ0KyIrIitIdCwiXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcZFRIKSg/PVxcYnxbYS16X10pIiwiXFxkKig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcZHRoKSg/PVxcYnxbQS1aX10pIixQdCxRdF0uam9pbigifCIpLCJnIiksb2U9UmVnRXhwKCJbIitHdCtFdCtDdCtJdCsiXSIpLHNlPS9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vLGFlPVsiQXJyYXkiLCJCdWZmZXIiLCJEYXRhVmlldyIsIkRhdGUiLCJFcnJvciIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkZ1bmN0aW9uIiwiSW50OEFycmF5IiwiSW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJNYXAiLCJNYXRoIiwiT2JqZWN0IiwiUHJvbWlzZSIsIlJlZ0V4cCIsIlNldCIsIlN0cmluZyIsIlN5bWJvbCIsIlR5cGVFcnJvciIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIlVpbnQxNkFycmF5IiwiVWludDMyQXJyYXkiLCJXZWFrTWFwIiwiXyIsImNsZWFyVGltZW91dCIsImlzRmluaXRlIiwicGFyc2VJbnQiLCJzZXRUaW1lb3V0Il0sdWU9LTEsY2U9e307Y2VbUl09Y2VbQl09Y2Vba109Y2Vbel09Y2Vbal09Y2VbVV09Y2VbcV09Y2VbVl09Y2VbR109ITAsY2Vbdl09Y2VbX109Y2VbTF09Y2VbeF09Y2VbUF09Y2Vbd109Y2VbYl09Y2VbRF09Y2VbQ109Y2VbU109Y2VbQV09Y2VbSV09Y2VbTV09Y2VbRl09Y2VbT109ITE7dmFyIGxlPXt9O2xlW3ZdPWxlW19dPWxlW0xdPWxlW1BdPWxlW3hdPWxlW3ddPWxlW1JdPWxlW0JdPWxlW2tdPWxlW3pdPWxlW2pdPWxlW0NdPWxlW1NdPWxlW0FdPWxlW0ldPWxlW01dPWxlW0ZdPWxlW1RdPWxlW1VdPWxlW3FdPWxlW1ZdPWxlW0ddPSEwLGxlW2JdPWxlW0RdPWxlW09dPSExO3ZhciBoZT17IlxcIjoiXFwiLCInIjoiJyIsIlxuIjoibiIsIlxyIjoiciIsIlx1MjAyOCI6InUyMDI4IiwiXHUyMDI5IjoidTIwMjkifSxmZT1wYXJzZUZsb2F0LHBlPXBhcnNlSW50LGRlPSJvYmplY3QiPT10eXBlb2YgdGUmJnRlJiZ0ZS5PYmplY3Q9PT1PYmplY3QmJnRlLGdlPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYseWU9ZGV8fGdlfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLG1lPWUmJiFlLm5vZGVUeXBlJiZlLHZlPW1lJiZ0JiYhdC5ub2RlVHlwZSYmdCxfZT12ZSYmdmUuZXhwb3J0cz09PW1lLHhlPV9lJiZkZS5wcm9jZXNzLHdlPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB2ZSYmdmUucmVxdWlyZSYmdmUucmVxdWlyZSgidXRpbCIpLnR5cGVzfHx4ZSYmeGUuYmluZGluZyYmeGUuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCksYmU9d2UmJndlLmlzQXJyYXlCdWZmZXIsRGU9d2UmJndlLmlzRGF0ZSxFZT13ZSYmd2UuaXNNYXAsQ2U9d2UmJndlLmlzUmVnRXhwLFNlPXdlJiZ3ZS5pc1NldCxBZT13ZSYmd2UuaXNUeXBlZEFycmF5O2Z1bmN0aW9uIE5lKHQsZSxuKXtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdC5jYWxsKGUpO2Nhc2UgMTpyZXR1cm4gdC5jYWxsKGUsblswXSk7Y2FzZSAyOnJldHVybiB0LmNhbGwoZSxuWzBdLG5bMV0pO2Nhc2UgMzpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdLG5bMl0pfXJldHVybiB0LmFwcGx5KGUsbil9ZnVuY3Rpb24gSWUodCxlLG4scil7Zm9yKHZhciBpPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoOysraTxvOyl7dmFyIHM9dFtpXTtlKHIscyxuKHMpLHQpfXJldHVybiByfWZ1bmN0aW9uIE1lKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxyJiYhMSE9PWUodFtuXSxuLHQpOyk7cmV0dXJuIHR9ZnVuY3Rpb24gRmUodCxlKXtmb3IodmFyIG49bnVsbD09dD8wOnQubGVuZ3RoO24tLSYmITEhPT1lKHRbbl0sbix0KTspO3JldHVybiB0fWZ1bmN0aW9uIFRlKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxyOylpZighZSh0W25dLG4sdCkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gT2UodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGgsaT0wLG89W107KytuPHI7KXt2YXIgcz10W25dO2UocyxuLHQpJiYob1tpKytdPXMpfXJldHVybiBvfWZ1bmN0aW9uIExlKHQsZSl7cmV0dXJuISEobnVsbD09dD8wOnQubGVuZ3RoKSYmR2UodCxlLDApPi0xfWZ1bmN0aW9uIFBlKHQsZSxuKXtmb3IodmFyIHI9LTEsaT1udWxsPT10PzA6dC5sZW5ndGg7KytyPGk7KWlmKG4oZSx0W3JdKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBSZSh0LGUpe2Zvcih2YXIgbj0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPUFycmF5KHIpOysrbjxyOylpW25dPWUodFtuXSxuLHQpO3JldHVybiBpfWZ1bmN0aW9uIEJlKHQsZSl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgsaT10Lmxlbmd0aDsrK248cjspdFtpK25dPWVbbl07cmV0dXJuIHR9ZnVuY3Rpb24ga2UodCxlLG4scil7dmFyIGk9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHImJm8mJihuPXRbKytpXSk7KytpPG87KW49ZShuLHRbaV0saSx0KTtyZXR1cm4gbn1mdW5jdGlvbiB6ZSh0LGUsbixyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHImJmkmJihuPXRbLS1pXSk7aS0tOyluPWUobix0W2ldLGksdCk7cmV0dXJuIG59ZnVuY3Rpb24gamUodCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytuPHI7KWlmKGUodFtuXSxuLHQpKXJldHVybiEwO3JldHVybiExfXZhciBVZT1IZSgibGVuZ3RoIik7ZnVuY3Rpb24gcWUodCxlLG4pe3ZhciByO3JldHVybiBuKHQsKGZ1bmN0aW9uKHQsbixpKXtpZihlKHQsbixpKSlyZXR1cm4gcj1uLCExfSkpLHJ9ZnVuY3Rpb24gVmUodCxlLG4scil7Zm9yKHZhciBpPXQubGVuZ3RoLG89bisocj8xOi0xKTtyP28tLTorK288aTspaWYoZSh0W29dLG8sdCkpcmV0dXJuIG87cmV0dXJuLTF9ZnVuY3Rpb24gR2UodCxlLG4pe3JldHVybiBlPT1lP2Z1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bi0xLGk9dC5sZW5ndGg7KytyPGk7KWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfSh0LGUsbik6VmUodCxYZSxuKX1mdW5jdGlvbiBZZSh0LGUsbixyKXtmb3IodmFyIGk9bi0xLG89dC5sZW5ndGg7KytpPG87KWlmKHIodFtpXSxlKSlyZXR1cm4gaTtyZXR1cm4tMX1mdW5jdGlvbiBYZSh0KXtyZXR1cm4gdCE9dH1mdW5jdGlvbiBXZSh0LGUpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gbj9KZSh0LGUpL246cH1mdW5jdGlvbiBIZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/bjplW3RdfX1mdW5jdGlvbiBaZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PXQ/bjp0W2VdfX1mdW5jdGlvbiBLZSh0LGUsbixyLGkpe3JldHVybiBpKHQsKGZ1bmN0aW9uKHQsaSxvKXtuPXI/KHI9ITEsdCk6ZShuLHQsaSxvKX0pKSxufWZ1bmN0aW9uIEplKHQsZSl7Zm9yKHZhciByLGk9LTEsbz10Lmxlbmd0aDsrK2k8bzspe3ZhciBzPWUodFtpXSk7cyE9PW4mJihyPXI9PT1uP3M6citzKX1yZXR1cm4gcn1mdW5jdGlvbiBRZSh0LGUpe2Zvcih2YXIgbj0tMSxyPUFycmF5KHQpOysrbjx0OylyW25dPWUobik7cmV0dXJuIHJ9ZnVuY3Rpb24gJGUodCl7cmV0dXJuIHQmJnQuc2xpY2UoMCx5bih0KSsxKS5yZXBsYWNlKHN0LCIiKX1mdW5jdGlvbiB0bih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fWZ1bmN0aW9uIGVuKHQsZSl7cmV0dXJuIFJlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpfWZ1bmN0aW9uIG5uKHQsZSl7cmV0dXJuIHQuaGFzKGUpfWZ1bmN0aW9uIHJuKHQsZSl7Zm9yKHZhciBuPS0xLHI9dC5sZW5ndGg7KytuPHImJkdlKGUsdFtuXSwwKT4tMTspO3JldHVybiBufWZ1bmN0aW9uIG9uKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoO24tLSYmR2UoZSx0W25dLDApPi0xOyk7cmV0dXJuIG59dmFyIHNuPVplKHsiw4AiOiJBIiwiw4EiOiJBIiwiw4IiOiJBIiwiw4MiOiJBIiwiw4QiOiJBIiwiw4UiOiJBIiwiw6AiOiJhIiwiw6EiOiJhIiwiw6IiOiJhIiwiw6MiOiJhIiwiw6QiOiJhIiwiw6UiOiJhIiwiw4ciOiJDIiwiw6ciOiJjIiwiw5AiOiJEIiwiw7AiOiJkIiwiw4giOiJFIiwiw4kiOiJFIiwiw4oiOiJFIiwiw4siOiJFIiwiw6giOiJlIiwiw6kiOiJlIiwiw6oiOiJlIiwiw6siOiJlIiwiw4wiOiJJIiwiw40iOiJJIiwiw44iOiJJIiwiw48iOiJJIiwiw6wiOiJpIiwiw60iOiJpIiwiw64iOiJpIiwiw68iOiJpIiwiw5EiOiJOIiwiw7EiOiJuIiwiw5IiOiJPIiwiw5MiOiJPIiwiw5QiOiJPIiwiw5UiOiJPIiwiw5YiOiJPIiwiw5giOiJPIiwiw7IiOiJvIiwiw7MiOiJvIiwiw7QiOiJvIiwiw7UiOiJvIiwiw7YiOiJvIiwiw7giOiJvIiwiw5kiOiJVIiwiw5oiOiJVIiwiw5siOiJVIiwiw5wiOiJVIiwiw7kiOiJ1Iiwiw7oiOiJ1Iiwiw7siOiJ1Iiwiw7wiOiJ1Iiwiw50iOiJZIiwiw70iOiJ5Iiwiw78iOiJ5Iiwiw4YiOiJBZSIsIsOmIjoiYWUiLCLDniI6IlRoIiwiw74iOiJ0aCIsIsOfIjoic3MiLCLEgCI6IkEiLCLEgiI6IkEiLCLEhCI6IkEiLCLEgSI6ImEiLCLEgyI6ImEiLCLEhSI6ImEiLCLEhiI6IkMiLCLEiCI6IkMiLCLEiiI6IkMiLCLEjCI6IkMiLCLEhyI6ImMiLCLEiSI6ImMiLCLEiyI6ImMiLCLEjSI6ImMiLCLEjiI6IkQiLCLEkCI6IkQiLCLEjyI6ImQiLCLEkSI6ImQiLCLEkiI6IkUiLCLElCI6IkUiLCLEliI6IkUiLCLEmCI6IkUiLCLEmiI6IkUiLCLEkyI6ImUiLCLElSI6ImUiLCLElyI6ImUiLCLEmSI6ImUiLCLEmyI6ImUiLCLEnCI6IkciLCLEniI6IkciLCLEoCI6IkciLCLEoiI6IkciLCLEnSI6ImciLCLEnyI6ImciLCLEoSI6ImciLCLEoyI6ImciLCLEpCI6IkgiLCLEpiI6IkgiLCLEpSI6ImgiLCLEpyI6ImgiLCLEqCI6IkkiLCLEqiI6IkkiLCLErCI6IkkiLCLEriI6IkkiLCLEsCI6IkkiLCLEqSI6ImkiLCLEqyI6ImkiLCLErSI6ImkiLCLEryI6ImkiLCLEsSI6ImkiLCLEtCI6IkoiLCLEtSI6ImoiLCLEtiI6IksiLCLEtyI6ImsiLCLEuCI6ImsiLCLEuSI6IkwiLCLEuyI6IkwiLCLEvSI6IkwiLCLEvyI6IkwiLCLFgSI6IkwiLCLEuiI6ImwiLCLEvCI6ImwiLCLEviI6ImwiLCLFgCI6ImwiLCLFgiI6ImwiLCLFgyI6Ik4iLCLFhSI6Ik4iLCLFhyI6Ik4iLCLFiiI6Ik4iLCLFhCI6Im4iLCLFhiI6Im4iLCLFiCI6Im4iLCLFiyI6Im4iLCLFjCI6Ik8iLCLFjiI6Ik8iLCLFkCI6Ik8iLCLFjSI6Im8iLCLFjyI6Im8iLCLFkSI6Im8iLCLFlCI6IlIiLCLFliI6IlIiLCLFmCI6IlIiLCLFlSI6InIiLCLFlyI6InIiLCLFmSI6InIiLCLFmiI6IlMiLCLFnCI6IlMiLCLFniI6IlMiLCLFoCI6IlMiLCLFmyI6InMiLCLFnSI6InMiLCLFnyI6InMiLCLFoSI6InMiLCLFoiI6IlQiLCLFpCI6IlQiLCLFpiI6IlQiLCLFoyI6InQiLCLFpSI6InQiLCLFpyI6InQiLCLFqCI6IlUiLCLFqiI6IlUiLCLFrCI6IlUiLCLFriI6IlUiLCLFsCI6IlUiLCLFsiI6IlUiLCLFqSI6InUiLCLFqyI6InUiLCLFrSI6InUiLCLFryI6InUiLCLFsSI6InUiLCLFsyI6InUiLCLFtCI6IlciLCLFtSI6InciLCLFtiI6IlkiLCLFtyI6InkiLCLFuCI6IlkiLCLFuSI6IloiLCLFuyI6IloiLCLFvSI6IloiLCLFuiI6InoiLCLFvCI6InoiLCLFviI6InoiLCLEsiI6IklKIiwixLMiOiJpaiIsIsWSIjoiT2UiLCLFkyI6Im9lIiwixYkiOiInbiIsIsW/IjoicyJ9KSxhbj1aZSh7IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7In0pO2Z1bmN0aW9uIHVuKHQpe3JldHVybiJcXCIraGVbdF19ZnVuY3Rpb24gY24odCl7cmV0dXJuIG9lLnRlc3QodCl9ZnVuY3Rpb24gbG4odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQscil7blsrK2VdPVtyLHRdfSkpLG59ZnVuY3Rpb24gaG4odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQoZShuKSl9fWZ1bmN0aW9uIGZuKHQsZSl7Zm9yKHZhciBuPS0xLHI9dC5sZW5ndGgsaT0wLHM9W107KytuPHI7KXt2YXIgYT10W25dOyhhPT09ZXx8YT09PW8pJiYodFtuXT1vLHNbaSsrXT1uKX1yZXR1cm4gc31mdW5jdGlvbiBwbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7blsrK2VdPXR9KSksbn1mdW5jdGlvbiBkbih0KXtyZXR1cm4gY24odCk/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXJlLmxhc3RJbmRleD0wO3JlLnRlc3QodCk7KSsrZTtyZXR1cm4gZX0odCk6VWUodCl9ZnVuY3Rpb24gZ24odCl7cmV0dXJuIGNuKHQpP2Z1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoKHJlKXx8W119KHQpOmZ1bmN0aW9uKHQpe3JldHVybiB0LnNwbGl0KCIiKX0odCl9ZnVuY3Rpb24geW4odCl7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLSYmYXQudGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX12YXIgbW49WmUoeyImYW1wOyI6IiYiLCImbHQ7IjoiPCIsIiZndDsiOiI+IiwiJnF1b3Q7IjonIicsIiYjMzk7IjoiJyJ9KTt2YXIgdm49ZnVuY3Rpb24gdChlKXt2YXIgYXQsRXQ9KGU9bnVsbD09ZT95ZTp2bi5kZWZhdWx0cyh5ZS5PYmplY3QoKSxlLHZuLnBpY2soeWUsYWUpKSkuQXJyYXksQ3Q9ZS5EYXRlLFN0PWUuRXJyb3IsQXQ9ZS5GdW5jdGlvbixOdD1lLk1hdGgsSXQ9ZS5PYmplY3QsTXQ9ZS5SZWdFeHAsRnQ9ZS5TdHJpbmcsVHQ9ZS5UeXBlRXJyb3IsT3Q9RXQucHJvdG90eXBlLEx0PUF0LnByb3RvdHlwZSxQdD1JdC5wcm90b3R5cGUsUnQ9ZVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sQnQ9THQudG9TdHJpbmcsa3Q9UHQuaGFzT3duUHJvcGVydHksenQ9MCxqdD0oYXQ9L1teLl0rJC8uZXhlYyhSdCYmUnQua2V5cyYmUnQua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK2F0OiIiLFV0PVB0LnRvU3RyaW5nLHF0PUJ0LmNhbGwoSXQpLFZ0PXllLl8sR3Q9TXQoIl4iK0J0LmNhbGwoa3QpLnJlcGxhY2UoaXQsIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIiksWXQ9X2U/ZS5CdWZmZXI6bixYdD1lLlN5bWJvbCxXdD1lLlVpbnQ4QXJyYXksSHQ9WXQ/WXQuYWxsb2NVbnNhZmU6bixadD1obihJdC5nZXRQcm90b3R5cGVPZixJdCksS3Q9SXQuY3JlYXRlLEp0PVB0LnByb3BlcnR5SXNFbnVtZXJhYmxlLFF0PU90LnNwbGljZSwkdD1YdD9YdC5pc0NvbmNhdFNwcmVhZGFibGU6bix0ZT1YdD9YdC5pdGVyYXRvcjpuLHJlPVh0P1h0LnRvU3RyaW5nVGFnOm4sb2U9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9cG8oSXQsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2godCl7fX0oKSxoZT1lLmNsZWFyVGltZW91dCE9PXllLmNsZWFyVGltZW91dCYmZS5jbGVhclRpbWVvdXQsZGU9Q3QmJkN0Lm5vdyE9PXllLkRhdGUubm93JiZDdC5ub3csZ2U9ZS5zZXRUaW1lb3V0IT09eWUuc2V0VGltZW91dCYmZS5zZXRUaW1lb3V0LG1lPU50LmNlaWwsdmU9TnQuZmxvb3IseGU9SXQuZ2V0T3duUHJvcGVydHlTeW1ib2xzLHdlPVl0P1l0LmlzQnVmZmVyOm4sVWU9ZS5pc0Zpbml0ZSxaZT1PdC5qb2luLF9uPWhuKEl0LmtleXMsSXQpLHhuPU50Lm1heCx3bj1OdC5taW4sYm49Q3Qubm93LERuPWUucGFyc2VJbnQsRW49TnQucmFuZG9tLENuPU90LnJldmVyc2UsU249cG8oZSwiRGF0YVZpZXciKSxBbj1wbyhlLCJNYXAiKSxObj1wbyhlLCJQcm9taXNlIiksSW49cG8oZSwiU2V0IiksTW49cG8oZSwiV2Vha01hcCIpLEZuPXBvKEl0LCJjcmVhdGUiKSxUbj1NbiYmbmV3IE1uLE9uPXt9LExuPWpvKFNuKSxQbj1qbyhBbiksUm49am8oTm4pLEJuPWpvKEluKSxrbj1qbyhNbiksem49WHQ/WHQucHJvdG90eXBlOm4sam49em4/em4udmFsdWVPZjpuLFVuPXpuP3puLnRvU3RyaW5nOm47ZnVuY3Rpb24gcW4odCl7aWYocmEodCkmJiFYcyh0KSYmISh0IGluc3RhbmNlb2YgWG4pKXtpZih0IGluc3RhbmNlb2YgWW4pcmV0dXJuIHQ7aWYoa3QuY2FsbCh0LCJfX3dyYXBwZWRfXyIpKXJldHVybiBVbyh0KX1yZXR1cm4gbmV3IFluKHQpfXZhciBWbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKCFuYShlKSlyZXR1cm57fTtpZihLdClyZXR1cm4gS3QoZSk7dC5wcm90b3R5cGU9ZTt2YXIgcj1uZXcgdDtyZXR1cm4gdC5wcm90b3R5cGU9bixyfX0oKTtmdW5jdGlvbiBHbigpe31mdW5jdGlvbiBZbih0LGUpe3RoaXMuX193cmFwcGVkX189dCx0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19jaGFpbl9fPSEhZSx0aGlzLl9faW5kZXhfXz0wLHRoaXMuX192YWx1ZXNfXz1ufWZ1bmN0aW9uIFhuKHQpe3RoaXMuX193cmFwcGVkX189dCx0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19kaXJfXz0xLHRoaXMuX19maWx0ZXJlZF9fPSExLHRoaXMuX19pdGVyYXRlZXNfXz1bXSx0aGlzLl9fdGFrZUNvdW50X189ZCx0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBXbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1mdW5jdGlvbiBIbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1mdW5jdGlvbiBabih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX1mdW5jdGlvbiBLbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgWm47KytlPG47KXRoaXMuYWRkKHRbZV0pfWZ1bmN0aW9uIEpuKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IEhuKHQpO3RoaXMuc2l6ZT1lLnNpemV9ZnVuY3Rpb24gUW4odCxlKXt2YXIgbj1Ycyh0KSxyPSFuJiZZcyh0KSxpPSFuJiYhciYmS3ModCksbz0hbiYmIXImJiFpJiZoYSh0KSxzPW58fHJ8fGl8fG8sYT1zP1FlKHQubGVuZ3RoLEZ0KTpbXSx1PWEubGVuZ3RoO2Zvcih2YXIgYyBpbiB0KShlfHxrdC5jYWxsKHQsYykpJiYoIXN8fCEoImxlbmd0aCI9PWN8fGkmJigib2Zmc2V0Ij09Y3x8InBhcmVudCI9PWMpfHxvJiYoImJ1ZmZlciI9PWN8fCJieXRlTGVuZ3RoIj09Y3x8ImJ5dGVPZmZzZXQiPT1jKXx8d28oYyx1KSkpJiZhLnB1c2goYyk7cmV0dXJuIGF9ZnVuY3Rpb24gJG4odCl7dmFyIGU9dC5sZW5ndGg7cmV0dXJuIGU/dFtLcigwLGUtMSldOm59ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm4gQm8oRmkodCksY3IoZSwwLHQubGVuZ3RoKSl9ZnVuY3Rpb24gZXIodCl7cmV0dXJuIEJvKEZpKHQpKX1mdW5jdGlvbiBucih0LGUscil7KHIhPT1uJiYhcXModFtlXSxyKXx8cj09PW4mJiEoZSBpbiB0KSkmJmFyKHQsZSxyKX1mdW5jdGlvbiBycih0LGUscil7dmFyIGk9dFtlXTsoIWt0LmNhbGwodCxlKXx8IXFzKGkscil8fHI9PT1uJiYhKGUgaW4gdCkpJiZhcih0LGUscil9ZnVuY3Rpb24gaXIodCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihxcyh0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIG9yKHQsZSxuLHIpe3JldHVybiBkcih0LChmdW5jdGlvbih0LGksbyl7ZShyLHQsbih0KSxvKX0pKSxyfWZ1bmN0aW9uIHNyKHQsZSl7cmV0dXJuIHQmJlRpKGUsT2EoZSksdCl9ZnVuY3Rpb24gYXIodCxlLG4peyJfX3Byb3RvX18iPT1lJiZvZT9vZSh0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm4sd3JpdGFibGU6ITB9KTp0W2VdPW59ZnVuY3Rpb24gdXIodCxlKXtmb3IodmFyIHI9LTEsaT1lLmxlbmd0aCxvPUV0KGkpLHM9bnVsbD09dDsrK3I8aTspb1tyXT1zP246TmEodCxlW3JdKTtyZXR1cm4gb31mdW5jdGlvbiBjcih0LGUscil7cmV0dXJuIHQ9PXQmJihyIT09biYmKHQ9dDw9cj90OnIpLGUhPT1uJiYodD10Pj1lP3Q6ZSkpLHR9ZnVuY3Rpb24gbHIodCxlLHIsaSxvLHMpe3ZhciBhLHU9MSZlLGM9MiZlLGw9NCZlO2lmKHImJihhPW8/cih0LGksbyxzKTpyKHQpKSxhIT09bilyZXR1cm4gYTtpZighbmEodCkpcmV0dXJuIHQ7dmFyIGg9WHModCk7aWYoaCl7aWYoYT1mdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aCxuPW5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiBlJiYic3RyaW5nIj09dHlwZW9mIHRbMF0mJmt0LmNhbGwodCwiaW5kZXgiKSYmKG4uaW5kZXg9dC5pbmRleCxuLmlucHV0PXQuaW5wdXQpLG59KHQpLCF1KXJldHVybiBGaSh0LGEpfWVsc2V7dmFyIGY9bW8odCkscD1mPT1EfHxmPT1FO2lmKEtzKHQpKXJldHVybiBDaSh0LHUpO2lmKGY9PUF8fGY9PXZ8fHAmJiFvKXtpZihhPWN8fHA/e306X28odCksIXUpcmV0dXJuIGM/ZnVuY3Rpb24odCxlKXtyZXR1cm4gVGkodCx5byh0KSxlKX0odCxmdW5jdGlvbih0LGUpe3JldHVybiB0JiZUaShlLExhKGUpLHQpfShhLHQpKTpmdW5jdGlvbih0LGUpe3JldHVybiBUaSh0LGdvKHQpLGUpfSh0LHNyKGEsdCkpfWVsc2V7aWYoIWxlW2ZdKXJldHVybiBvP3Q6e307YT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5jb25zdHJ1Y3Rvcjtzd2l0Y2goZSl7Y2FzZSBMOnJldHVybiBTaSh0KTtjYXNlIHg6Y2FzZSB3OnJldHVybiBuZXcgcigrdCk7Y2FzZSBQOnJldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPWU/U2kodC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfSh0LG4pO2Nhc2UgUjpjYXNlIEI6Y2FzZSBrOmNhc2UgejpjYXNlIGo6Y2FzZSBVOmNhc2UgcTpjYXNlIFY6Y2FzZSBHOnJldHVybiBBaSh0LG4pO2Nhc2UgQzpyZXR1cm4gbmV3IHI7Y2FzZSBTOmNhc2UgRjpyZXR1cm4gbmV3IHIodCk7Y2FzZSBJOnJldHVybiBmdW5jdGlvbih0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSxndC5leGVjKHQpKTtyZXR1cm4gZS5sYXN0SW5kZXg9dC5sYXN0SW5kZXgsZX0odCk7Y2FzZSBNOnJldHVybiBuZXcgcjtjYXNlIFQ6cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBqbj9JdChqbi5jYWxsKHQpKTp7fX0odCl9fSh0LGYsdSl9fXN8fChzPW5ldyBKbik7dmFyIGQ9cy5nZXQodCk7aWYoZClyZXR1cm4gZDtzLnNldCh0LGEpLHVhKHQpP3QuZm9yRWFjaCgoZnVuY3Rpb24obil7YS5hZGQobHIobixlLHIsbix0LHMpKX0pKTppYSh0KSYmdC5mb3JFYWNoKChmdW5jdGlvbihuLGkpe2Euc2V0KGksbHIobixlLHIsaSx0LHMpKX0pKTt2YXIgZz1oP246KGw/Yz9zbzpvbzpjP0xhOk9hKSh0KTtyZXR1cm4gTWUoZ3x8dCwoZnVuY3Rpb24obixpKXtnJiYobj10W2k9bl0pLHJyKGEsaSxscihuLGUscixpLHQscykpfSkpLGF9ZnVuY3Rpb24gaHIodCxlLHIpe3ZhciBpPXIubGVuZ3RoO2lmKG51bGw9PXQpcmV0dXJuIWk7Zm9yKHQ9SXQodCk7aS0tOyl7dmFyIG89cltpXSxzPWVbb10sYT10W29dO2lmKGE9PT1uJiYhKG8gaW4gdCl8fCFzKGEpKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGZyKHQsZSxpKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7cmV0dXJuIE9vKChmdW5jdGlvbigpe3QuYXBwbHkobixpKX0pLGUpfWZ1bmN0aW9uIHByKHQsZSxuLHIpe3ZhciBpPS0xLG89TGUscz0hMCxhPXQubGVuZ3RoLHU9W10sYz1lLmxlbmd0aDtpZighYSlyZXR1cm4gdTtuJiYoZT1SZShlLHRuKG4pKSkscj8obz1QZSxzPSExKTplLmxlbmd0aD49MjAwJiYobz1ubixzPSExLGU9bmV3IEtuKGUpKTt0OmZvcig7KytpPGE7KXt2YXIgbD10W2ldLGg9bnVsbD09bj9sOm4obCk7aWYobD1yfHwwIT09bD9sOjAscyYmaD09aCl7Zm9yKHZhciBmPWM7Zi0tOylpZihlW2ZdPT09aCljb250aW51ZSB0O3UucHVzaChsKX1lbHNlIG8oZSxoLHIpfHx1LnB1c2gobCl9cmV0dXJuIHV9cW4udGVtcGxhdGVTZXR0aW5ncz17ZXNjYXBlOlEsZXZhbHVhdGU6JCxpbnRlcnBvbGF0ZTp0dCx2YXJpYWJsZToiIixpbXBvcnRzOntfOnFufX0scW4ucHJvdG90eXBlPUduLnByb3RvdHlwZSxxbi5wcm90b3R5cGUuY29uc3RydWN0b3I9cW4sWW4ucHJvdG90eXBlPVZuKEduLnByb3RvdHlwZSksWW4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPVluLFhuLnByb3RvdHlwZT1WbihHbi5wcm90b3R5cGUpLFhuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YbixXbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPUZuP0ZuKG51bGwpOnt9LHRoaXMuc2l6ZT0wfSxXbi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxXbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoRm4pe3ZhciByPWVbdF07cmV0dXJuIHI9PT1pP246cn1yZXR1cm4ga3QuY2FsbChlLHQpP2VbdF06bn0sV24ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBGbj9lW3RdIT09bjprdC5jYWxsKGUsdCl9LFduLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxyW3RdPUZuJiZlPT09bj9pOmUsdGhpc30sSG4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH0sSG4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49aXIoZSx0KTtyZXR1cm4hKG48MCkmJihuPT1lLmxlbmd0aC0xP2UucG9wKCk6UXQuY2FsbChlLG4sMSksLS10aGlzLnNpemUsITApfSxIbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18scj1pcihlLHQpO3JldHVybiByPDA/bjplW3JdWzFdfSxIbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiBpcih0aGlzLl9fZGF0YV9fLHQpPi0xfSxIbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPWlyKG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9LFpuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IFduLG1hcDpuZXcoQW58fEhuKSxzdHJpbmc6bmV3IFdufX0sWm4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT1obyh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxabi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBobyh0aGlzLHQpLmdldCh0KX0sWm4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gaG8odGhpcyx0KS5oYXModCl9LFpuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1obyh0aGlzLHQpLHI9bi5zaXplO3JldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZSs9bi5zaXplPT1yPzA6MSx0aGlzfSxLbi5wcm90b3R5cGUuYWRkPUtuLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LGkpLHRoaXN9LEtuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSxKbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPW5ldyBIbix0aGlzLnNpemU9MH0sSm4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn0sSm4ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9LEpuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSxKbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztpZihuIGluc3RhbmNlb2YgSG4pe3ZhciByPW4uX19kYXRhX187aWYoIUFufHxyLmxlbmd0aDwxOTkpcmV0dXJuIHIucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBabihyKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9O3ZhciBkcj1QaShiciksZ3I9UGkoRHIsITApO2Z1bmN0aW9uIHlyKHQsZSl7dmFyIG49ITA7cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQscixpKXtyZXR1cm4gbj0hIWUodCxyLGkpfSkpLG59ZnVuY3Rpb24gbXIodCxlLHIpe2Zvcih2YXIgaT0tMSxvPXQubGVuZ3RoOysraTxvOyl7dmFyIHM9dFtpXSxhPWUocyk7aWYobnVsbCE9YSYmKHU9PT1uP2E9PWEmJiFsYShhKTpyKGEsdSkpKXZhciB1PWEsYz1zfXJldHVybiBjfWZ1bmN0aW9uIHZyKHQsZSl7dmFyIG49W107cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQscixpKXtlKHQscixpKSYmbi5wdXNoKHQpfSkpLG59ZnVuY3Rpb24gX3IodCxlLG4scixpKXt2YXIgbz0tMSxzPXQubGVuZ3RoO2ZvcihufHwobj14byksaXx8KGk9W10pOysrbzxzOyl7dmFyIGE9dFtvXTtlPjAmJm4oYSk/ZT4xP19yKGEsZS0xLG4scixpKTpCZShpLGEpOnJ8fChpW2kubGVuZ3RoXT1hKX1yZXR1cm4gaX12YXIgeHI9UmkoKSx3cj1SaSghMCk7ZnVuY3Rpb24gYnIodCxlKXtyZXR1cm4gdCYmeHIodCxlLE9hKX1mdW5jdGlvbiBEcih0LGUpe3JldHVybiB0JiZ3cih0LGUsT2EpfWZ1bmN0aW9uIEVyKHQsZSl7cmV0dXJuIE9lKGUsKGZ1bmN0aW9uKGUpe3JldHVybiAkcyh0W2VdKX0pKX1mdW5jdGlvbiBDcih0LGUpe2Zvcih2YXIgcj0wLGk9KGU9d2koZSx0KSkubGVuZ3RoO251bGwhPXQmJnI8aTspdD10W3pvKGVbcisrXSldO3JldHVybiByJiZyPT1pP3Q6bn1mdW5jdGlvbiBTcih0LGUsbil7dmFyIHI9ZSh0KTtyZXR1cm4gWHModCk/cjpCZShyLG4odCkpfWZ1bmN0aW9uIEFyKHQpe3JldHVybiBudWxsPT10P3Q9PT1uPyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjpyZSYmcmUgaW4gSXQodCk/ZnVuY3Rpb24odCl7dmFyIGU9a3QuY2FsbCh0LHJlKSxyPXRbcmVdO3RyeXt0W3JlXT1uO3ZhciBpPSEwfWNhdGNoKHQpe312YXIgbz1VdC5jYWxsKHQpO3JldHVybiBpJiYoZT90W3JlXT1yOmRlbGV0ZSB0W3JlXSksb30odCk6ZnVuY3Rpb24odCl7cmV0dXJuIFV0LmNhbGwodCl9KHQpfWZ1bmN0aW9uIE5yKHQsZSl7cmV0dXJuIHQ+ZX1mdW5jdGlvbiBJcih0LGUpe3JldHVybiBudWxsIT10JiZrdC5jYWxsKHQsZSl9ZnVuY3Rpb24gTXIodCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBJdCh0KX1mdW5jdGlvbiBGcih0LGUscil7Zm9yKHZhciBpPXI/UGU6TGUsbz10WzBdLmxlbmd0aCxzPXQubGVuZ3RoLGE9cyx1PUV0KHMpLGM9MS8wLGw9W107YS0tOyl7dmFyIGg9dFthXTthJiZlJiYoaD1SZShoLHRuKGUpKSksYz13bihoLmxlbmd0aCxjKSx1W2FdPSFyJiYoZXx8bz49MTIwJiZoLmxlbmd0aD49MTIwKT9uZXcgS24oYSYmaCk6bn1oPXRbMF07dmFyIGY9LTEscD11WzBdO3Q6Zm9yKDsrK2Y8byYmbC5sZW5ndGg8Yzspe3ZhciBkPWhbZl0sZz1lP2UoZCk6ZDtpZihkPXJ8fDAhPT1kP2Q6MCwhKHA/bm4ocCxnKTppKGwsZyxyKSkpe2ZvcihhPXM7LS1hOyl7dmFyIHk9dVthXTtpZighKHk/bm4oeSxnKTppKHRbYV0sZyxyKSkpY29udGludWUgdH1wJiZwLnB1c2goZyksbC5wdXNoKGQpfX1yZXR1cm4gbH1mdW5jdGlvbiBUcih0LGUscil7dmFyIGk9bnVsbD09KHQ9TW8odCxlPXdpKGUsdCkpKT90OnRbem8oUW8oZSkpXTtyZXR1cm4gbnVsbD09aT9uOk5lKGksdCxyKX1mdW5jdGlvbiBPcih0KXtyZXR1cm4gcmEodCkmJkFyKHQpPT12fWZ1bmN0aW9uIExyKHQsZSxyLGksbyl7cmV0dXJuIHQ9PT1lfHwobnVsbD09dHx8bnVsbD09ZXx8IXJhKHQpJiYhcmEoZSk/dCE9dCYmZSE9ZTpmdW5jdGlvbih0LGUscixpLG8scyl7dmFyIGE9WHModCksdT1YcyhlKSxjPWE/Xzptbyh0KSxsPXU/XzptbyhlKSxoPShjPWM9PXY/QTpjKT09QSxmPShsPWw9PXY/QTpsKT09QSxwPWM9PWw7aWYocCYmS3ModCkpe2lmKCFLcyhlKSlyZXR1cm4hMTthPSEwLGg9ITF9aWYocCYmIWgpcmV0dXJuIHN8fChzPW5ldyBKbiksYXx8aGEodCk/cm8odCxlLHIsaSxvLHMpOmZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMpe3N3aXRjaChuKXtjYXNlIFA6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIEw6cmV0dXJuISh0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8IW8obmV3IFd0KHQpLG5ldyBXdChlKSkpO2Nhc2UgeDpjYXNlIHc6Y2FzZSBTOnJldHVybiBxcygrdCwrZSk7Y2FzZSBiOnJldHVybiB0Lm5hbWU9PWUubmFtZSYmdC5tZXNzYWdlPT1lLm1lc3NhZ2U7Y2FzZSBJOmNhc2UgRjpyZXR1cm4gdD09ZSsiIjtjYXNlIEM6dmFyIGE9bG47Y2FzZSBNOnZhciB1PTEmcjtpZihhfHwoYT1wbiksdC5zaXplIT1lLnNpemUmJiF1KXJldHVybiExO3ZhciBjPXMuZ2V0KHQpO2lmKGMpcmV0dXJuIGM9PWU7cnw9MixzLnNldCh0LGUpO3ZhciBsPXJvKGEodCksYShlKSxyLGksbyxzKTtyZXR1cm4gcy5kZWxldGUodCksbDtjYXNlIFQ6aWYoam4pcmV0dXJuIGpuLmNhbGwodCk9PWpuLmNhbGwoZSl9cmV0dXJuITF9KHQsZSxjLHIsaSxvLHMpO2lmKCEoMSZyKSl7dmFyIGQ9aCYma3QuY2FsbCh0LCJfX3dyYXBwZWRfXyIpLGc9ZiYma3QuY2FsbChlLCJfX3dyYXBwZWRfXyIpO2lmKGR8fGcpe3ZhciB5PWQ/dC52YWx1ZSgpOnQsbT1nP2UudmFsdWUoKTplO3JldHVybiBzfHwocz1uZXcgSm4pLG8oeSxtLHIsaSxzKX19cmV0dXJuISFwJiYoc3x8KHM9bmV3IEpuKSxmdW5jdGlvbih0LGUscixpLG8scyl7dmFyIGE9MSZyLHU9b28odCksYz11Lmxlbmd0aCxsPW9vKGUpLGg9bC5sZW5ndGg7aWYoYyE9aCYmIWEpcmV0dXJuITE7Zm9yKHZhciBmPWM7Zi0tOyl7dmFyIHA9dVtmXTtpZighKGE/cCBpbiBlOmt0LmNhbGwoZSxwKSkpcmV0dXJuITF9dmFyIGQ9cy5nZXQodCksZz1zLmdldChlKTtpZihkJiZnKXJldHVybiBkPT1lJiZnPT10O3ZhciB5PSEwO3Muc2V0KHQsZSkscy5zZXQoZSx0KTtmb3IodmFyIG09YTsrK2Y8Yzspe3ZhciB2PXRbcD11W2ZdXSxfPWVbcF07aWYoaSl2YXIgeD1hP2koXyx2LHAsZSx0LHMpOmkodixfLHAsdCxlLHMpO2lmKCEoeD09PW4/dj09PV98fG8odixfLHIsaSxzKTp4KSl7eT0hMTticmVha31tfHwobT0iY29uc3RydWN0b3IiPT1wKX1pZih5JiYhbSl7dmFyIHc9dC5jb25zdHJ1Y3RvcixiPWUuY29uc3RydWN0b3I7dyE9YiYmImNvbnN0cnVjdG9yImluIHQmJiJjb25zdHJ1Y3RvciJpbiBlJiYhKCJmdW5jdGlvbiI9PXR5cGVvZiB3JiZ3IGluc3RhbmNlb2YgdyYmImZ1bmN0aW9uIj09dHlwZW9mIGImJmIgaW5zdGFuY2VvZiBiKSYmKHk9ITEpfXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSx5fSh0LGUscixpLG8scykpfSh0LGUscixpLExyLG8pKX1mdW5jdGlvbiBQcih0LGUscixpKXt2YXIgbz1yLmxlbmd0aCxzPW8sYT0haTtpZihudWxsPT10KXJldHVybiFzO2Zvcih0PUl0KHQpO28tLTspe3ZhciB1PXJbb107aWYoYSYmdVsyXT91WzFdIT09dFt1WzBdXTohKHVbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrbzxzOyl7dmFyIGM9KHU9cltvXSlbMF0sbD10W2NdLGg9dVsxXTtpZihhJiZ1WzJdKXtpZihsPT09biYmIShjIGluIHQpKXJldHVybiExfWVsc2V7dmFyIGY9bmV3IEpuO2lmKGkpdmFyIHA9aShsLGgsYyx0LGUsZik7aWYoIShwPT09bj9McihoLGwsMyxpLGYpOnApKXJldHVybiExfX1yZXR1cm4hMH1mdW5jdGlvbiBScih0KXtyZXR1cm4hKCFuYSh0KXx8ZnVuY3Rpb24odCl7cmV0dXJuISFqdCYmanQgaW4gdH0odCkpJiYoJHModCk/R3Q6dnQpLnRlc3Qoam8odCkpfWZ1bmN0aW9uIEJyKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bnVsbD09dD9vdToib2JqZWN0Ij09dHlwZW9mIHQ/WHModCk/VnIodFswXSx0WzFdKTpxcih0KTpkdSh0KX1mdW5jdGlvbiBrcih0KXtpZighU28odCkpcmV0dXJuIF9uKHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiBJdCh0KSlrdC5jYWxsKHQsbikmJiJjb25zdHJ1Y3RvciIhPW4mJmUucHVzaChuKTtyZXR1cm4gZX1mdW5jdGlvbiB6cih0KXtpZighbmEodCkpcmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKG51bGwhPXQpZm9yKHZhciBuIGluIEl0KHQpKWUucHVzaChuKTtyZXR1cm4gZX0odCk7dmFyIGU9U28odCksbj1bXTtmb3IodmFyIHIgaW4gdCkiY29uc3RydWN0b3IiPT1yJiYoZXx8IWt0LmNhbGwodCxyKSl8fG4ucHVzaChyKTtyZXR1cm4gbn1mdW5jdGlvbiBqcih0LGUpe3JldHVybiB0PGV9ZnVuY3Rpb24gVXIodCxlKXt2YXIgbj0tMSxyPUhzKHQpP0V0KHQubGVuZ3RoKTpbXTtyZXR1cm4gZHIodCwoZnVuY3Rpb24odCxpLG8pe3JbKytuXT1lKHQsaSxvKX0pKSxyfWZ1bmN0aW9uIHFyKHQpe3ZhciBlPWZvKHQpO3JldHVybiAxPT1lLmxlbmd0aCYmZVswXVsyXT9ObyhlWzBdWzBdLGVbMF1bMV0pOmZ1bmN0aW9uKG4pe3JldHVybiBuPT09dHx8UHIobix0LGUpfX1mdW5jdGlvbiBWcih0LGUpe3JldHVybiBEbyh0KSYmQW8oZSk/Tm8oem8odCksZSk6ZnVuY3Rpb24ocil7dmFyIGk9TmEocix0KTtyZXR1cm4gaT09PW4mJmk9PT1lP0lhKHIsdCk6THIoZSxpLDMpfX1mdW5jdGlvbiBHcih0LGUscixpLG8pe3QhPT1lJiZ4cihlLChmdW5jdGlvbihzLGEpe2lmKG98fChvPW5ldyBKbiksbmEocykpIWZ1bmN0aW9uKHQsZSxyLGksbyxzLGEpe3ZhciB1PUZvKHQsciksYz1GbyhlLHIpLGw9YS5nZXQoYyk7aWYobClyZXR1cm4gdm9pZCBucih0LHIsbCk7dmFyIGg9cz9zKHUsYyxyKyIiLHQsZSxhKTpuLGY9aD09PW47aWYoZil7dmFyIHA9WHMoYyksZD0hcCYmS3MoYyksZz0hcCYmIWQmJmhhKGMpO2g9YyxwfHxkfHxnP1hzKHUpP2g9dTpacyh1KT9oPUZpKHUpOmQ/KGY9ITEsaD1DaShjLCEwKSk6Zz8oZj0hMSxoPUFpKGMsITApKTpoPVtdOnNhKGMpfHxZcyhjKT8oaD11LFlzKHUpP2g9X2EodSk6KCFuYSh1KXx8JHModSkpJiYoaD1fbyhjKSkpOmY9ITF9ZiYmKGEuc2V0KGMsaCksbyhoLGMsaSxzLGEpLGEuZGVsZXRlKGMpKSxucih0LHIsaCl9KHQsZSxhLHIsR3IsaSxvKTtlbHNle3ZhciB1PWk/aShGbyh0LGEpLHMsYSsiIix0LGUsbyk6bjt1PT09biYmKHU9cyksbnIodCxhLHUpfX0pLExhKX1mdW5jdGlvbiBZcih0LGUpe3ZhciByPXQubGVuZ3RoO2lmKHIpcmV0dXJuIHdvKGUrPWU8MD9yOjAscik/dFtlXTpufWZ1bmN0aW9uIFhyKHQsZSxuKXtlPWUubGVuZ3RoP1JlKGUsKGZ1bmN0aW9uKHQpe3JldHVybiBYcyh0KT9mdW5jdGlvbihlKXtyZXR1cm4gQ3IoZSwxPT09dC5sZW5ndGg/dFswXTp0KX06dH0pKTpbb3VdO3ZhciByPS0xO3JldHVybiBlPVJlKGUsdG4obG8oKSkpLGZ1bmN0aW9uKHQsZSl7dmFyIG49dC5sZW5ndGg7Zm9yKHQuc29ydChlKTtuLS07KXRbbl09dFtuXS52YWx1ZTtyZXR1cm4gdH0oVXIodCwoZnVuY3Rpb24odCxuLGkpe3JldHVybntjcml0ZXJpYTpSZShlLChmdW5jdGlvbihlKXtyZXR1cm4gZSh0KX0pKSxpbmRleDorK3IsdmFsdWU6dH19KSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9LTEsaT10LmNyaXRlcmlhLG89ZS5jcml0ZXJpYSxzPWkubGVuZ3RoLGE9bi5sZW5ndGg7KytyPHM7KXt2YXIgdT1OaShpW3JdLG9bcl0pO2lmKHUpcmV0dXJuIHI+PWE/dTp1KigiZGVzYyI9PW5bcl0/LTE6MSl9cmV0dXJuIHQuaW5kZXgtZS5pbmRleH0odCxlLG4pfSkpfWZ1bmN0aW9uIFdyKHQsZSxuKXtmb3IodmFyIHI9LTEsaT1lLmxlbmd0aCxvPXt9OysrcjxpOyl7dmFyIHM9ZVtyXSxhPUNyKHQscyk7bihhLHMpJiZlaShvLHdpKHMsdCksYSl9cmV0dXJuIG99ZnVuY3Rpb24gSHIodCxlLG4scil7dmFyIGk9cj9ZZTpHZSxvPS0xLHM9ZS5sZW5ndGgsYT10O2Zvcih0PT09ZSYmKGU9RmkoZSkpLG4mJihhPVJlKHQsdG4obikpKTsrK288czspZm9yKHZhciB1PTAsYz1lW29dLGw9bj9uKGMpOmM7KHU9aShhLGwsdSxyKSk+LTE7KWEhPT10JiZRdC5jYWxsKGEsdSwxKSxRdC5jYWxsKHQsdSwxKTtyZXR1cm4gdH1mdW5jdGlvbiBacih0LGUpe2Zvcih2YXIgbj10P2UubGVuZ3RoOjAscj1uLTE7bi0tOyl7dmFyIGk9ZVtuXTtpZihuPT1yfHxpIT09byl7dmFyIG89aTt3byhpKT9RdC5jYWxsKHQsaSwxKTpwaSh0LGkpfX1yZXR1cm4gdH1mdW5jdGlvbiBLcih0LGUpe3JldHVybiB0K3ZlKEVuKCkqKGUtdCsxKSl9ZnVuY3Rpb24gSnIodCxlKXt2YXIgbj0iIjtpZighdHx8ZTwxfHxlPmYpcmV0dXJuIG47ZG97ZSUyJiYobis9dCksKGU9dmUoZS8yKSkmJih0Kz10KX13aGlsZShlKTtyZXR1cm4gbn1mdW5jdGlvbiBRcih0LGUpe3JldHVybiBMbyhJbyh0LGUsb3UpLHQrIiIpfWZ1bmN0aW9uICRyKHQpe3JldHVybiAkbihxYSh0KSl9ZnVuY3Rpb24gdGkodCxlKXt2YXIgbj1xYSh0KTtyZXR1cm4gQm8obixjcihlLDAsbi5sZW5ndGgpKX1mdW5jdGlvbiBlaSh0LGUscixpKXtpZighbmEodCkpcmV0dXJuIHQ7Zm9yKHZhciBvPS0xLHM9KGU9d2koZSx0KSkubGVuZ3RoLGE9cy0xLHU9dDtudWxsIT11JiYrK288czspe3ZhciBjPXpvKGVbb10pLGw9cjtpZigiX19wcm90b19fIj09PWN8fCJjb25zdHJ1Y3RvciI9PT1jfHwicHJvdG90eXBlIj09PWMpcmV0dXJuIHQ7aWYobyE9YSl7dmFyIGg9dVtjXTsobD1pP2koaCxjLHUpOm4pPT09biYmKGw9bmEoaCk/aDp3byhlW28rMV0pP1tdOnt9KX1ycih1LGMsbCksdT11W2NdfXJldHVybiB0fXZhciBuaT1Ubj9mdW5jdGlvbih0LGUpe3JldHVybiBUbi5zZXQodCxlKSx0fTpvdSxyaT1vZT9mdW5jdGlvbih0LGUpe3JldHVybiBvZSh0LCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOm51KGUpLHdyaXRhYmxlOiEwfSl9Om91O2Z1bmN0aW9uIGlpKHQpe3JldHVybiBCbyhxYSh0KSl9ZnVuY3Rpb24gb2kodCxlLG4pe3ZhciByPS0xLGk9dC5sZW5ndGg7ZTwwJiYoZT0tZT5pPzA6aStlKSwobj1uPmk/aTpuKTwwJiYobis9aSksaT1lPm4/MDpuLWU+Pj4wLGU+Pj49MDtmb3IodmFyIG89RXQoaSk7KytyPGk7KW9bcl09dFtyK2VdO3JldHVybiBvfWZ1bmN0aW9uIHNpKHQsZSl7dmFyIG47cmV0dXJuIGRyKHQsKGZ1bmN0aW9uKHQscixpKXtyZXR1cm4hKG49ZSh0LHIsaSkpfSkpLCEhbn1mdW5jdGlvbiBhaSh0LGUsbil7dmFyIHI9MCxpPW51bGw9PXQ/cjp0Lmxlbmd0aDtpZigibnVtYmVyIj09dHlwZW9mIGUmJmU9PWUmJmk8PXkpe2Zvcig7cjxpOyl7dmFyIG89citpPj4+MSxzPXRbb107bnVsbCE9PXMmJiFsYShzKSYmKG4/czw9ZTpzPGUpP3I9bysxOmk9b31yZXR1cm4gaX1yZXR1cm4gdWkodCxlLG91LG4pfWZ1bmN0aW9uIHVpKHQsZSxyLGkpe3ZhciBvPTAscz1udWxsPT10PzA6dC5sZW5ndGg7aWYoMD09PXMpcmV0dXJuIDA7Zm9yKHZhciBhPShlPXIoZSkpIT1lLHU9bnVsbD09PWUsYz1sYShlKSxsPWU9PT1uO288czspe3ZhciBoPXZlKChvK3MpLzIpLGY9cih0W2hdKSxwPWYhPT1uLGQ9bnVsbD09PWYseT1mPT1mLG09bGEoZik7aWYoYSl2YXIgdj1pfHx5O2Vsc2Ugdj1sP3kmJihpfHxwKTp1P3kmJnAmJihpfHwhZCk6Yz95JiZwJiYhZCYmKGl8fCFtKTohZCYmIW0mJihpP2Y8PWU6ZjxlKTt2P289aCsxOnM9aH1yZXR1cm4gd24ocyxnKX1mdW5jdGlvbiBjaSh0LGUpe2Zvcih2YXIgbj0tMSxyPXQubGVuZ3RoLGk9MCxvPVtdOysrbjxyOyl7dmFyIHM9dFtuXSxhPWU/ZShzKTpzO2lmKCFufHwhcXMoYSx1KSl7dmFyIHU9YTtvW2krK109MD09PXM/MDpzfX1yZXR1cm4gb31mdW5jdGlvbiBsaSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dDpsYSh0KT9wOit0fWZ1bmN0aW9uIGhpKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gdDtpZihYcyh0KSlyZXR1cm4gUmUodCxoaSkrIiI7aWYobGEodCkpcmV0dXJuIFVuP1VuLmNhbGwodCk6IiI7dmFyIGU9dCsiIjtyZXR1cm4iMCI9PWUmJjEvdD09LWg/Ii0wIjplfWZ1bmN0aW9uIGZpKHQsZSxuKXt2YXIgcj0tMSxpPUxlLG89dC5sZW5ndGgscz0hMCxhPVtdLHU9YTtpZihuKXM9ITEsaT1QZTtlbHNlIGlmKG8+PTIwMCl7dmFyIGM9ZT9udWxsOkppKHQpO2lmKGMpcmV0dXJuIHBuKGMpO3M9ITEsaT1ubix1PW5ldyBLbn1lbHNlIHU9ZT9bXTphO3Q6Zm9yKDsrK3I8bzspe3ZhciBsPXRbcl0saD1lP2UobCk6bDtpZihsPW58fDAhPT1sP2w6MCxzJiZoPT1oKXtmb3IodmFyIGY9dS5sZW5ndGg7Zi0tOylpZih1W2ZdPT09aCljb250aW51ZSB0O2UmJnUucHVzaChoKSxhLnB1c2gobCl9ZWxzZSBpKHUsaCxuKXx8KHUhPT1hJiZ1LnB1c2goaCksYS5wdXNoKGwpKX1yZXR1cm4gYX1mdW5jdGlvbiBwaSh0LGUpe3JldHVybiBudWxsPT0odD1Nbyh0LGU9d2koZSx0KSkpfHxkZWxldGUgdFt6byhRbyhlKSldfWZ1bmN0aW9uIGRpKHQsZSxuLHIpe3JldHVybiBlaSh0LGUsbihDcih0LGUpKSxyKX1mdW5jdGlvbiBnaSh0LGUsbixyKXtmb3IodmFyIGk9dC5sZW5ndGgsbz1yP2k6LTE7KHI/by0tOisrbzxpKSYmZSh0W29dLG8sdCk7KTtyZXR1cm4gbj9vaSh0LHI/MDpvLHI/bysxOmkpOm9pKHQscj9vKzE6MCxyP2k6byl9ZnVuY3Rpb24geWkodCxlKXt2YXIgbj10O3JldHVybiBuIGluc3RhbmNlb2YgWG4mJihuPW4udmFsdWUoKSksa2UoZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5mdW5jLmFwcGx5KGUudGhpc0FyZyxCZShbdF0sZS5hcmdzKSl9KSxuKX1mdW5jdGlvbiBtaSh0LGUsbil7dmFyIHI9dC5sZW5ndGg7aWYocjwyKXJldHVybiByP2ZpKHRbMF0pOltdO2Zvcih2YXIgaT0tMSxvPUV0KHIpOysraTxyOylmb3IodmFyIHM9dFtpXSxhPS0xOysrYTxyOylhIT1pJiYob1tpXT1wcihvW2ldfHxzLHRbYV0sZSxuKSk7cmV0dXJuIGZpKF9yKG8sMSksZSxuKX1mdW5jdGlvbiB2aSh0LGUscil7Zm9yKHZhciBpPS0xLG89dC5sZW5ndGgscz1lLmxlbmd0aCxhPXt9OysraTxvOyl7dmFyIHU9aTxzP2VbaV06bjtyKGEsdFtpXSx1KX1yZXR1cm4gYX1mdW5jdGlvbiBfaSh0KXtyZXR1cm4gWnModCk/dDpbXX1mdW5jdGlvbiB4aSh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om91fWZ1bmN0aW9uIHdpKHQsZSl7cmV0dXJuIFhzKHQpP3Q6RG8odCxlKT9bdF06a28oeGEodCkpfXZhciBiaT1RcjtmdW5jdGlvbiBEaSh0LGUscil7dmFyIGk9dC5sZW5ndGg7cmV0dXJuIHI9cj09PW4/aTpyLCFlJiZyPj1pP3Q6b2kodCxlLHIpfXZhciBFaT1oZXx8ZnVuY3Rpb24odCl7cmV0dXJuIHllLmNsZWFyVGltZW91dCh0KX07ZnVuY3Rpb24gQ2kodCxlKXtpZihlKXJldHVybiB0LnNsaWNlKCk7dmFyIG49dC5sZW5ndGgscj1IdD9IdChuKTpuZXcgdC5jb25zdHJ1Y3RvcihuKTtyZXR1cm4gdC5jb3B5KHIpLHJ9ZnVuY3Rpb24gU2kodCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IFd0KGUpLnNldChuZXcgV3QodCkpLGV9ZnVuY3Rpb24gQWkodCxlKXt2YXIgbj1lP1NpKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfWZ1bmN0aW9uIE5pKHQsZSl7aWYodCE9PWUpe3ZhciByPXQhPT1uLGk9bnVsbD09PXQsbz10PT10LHM9bGEodCksYT1lIT09bix1PW51bGw9PT1lLGM9ZT09ZSxsPWxhKGUpO2lmKCF1JiYhbCYmIXMmJnQ+ZXx8cyYmYSYmYyYmIXUmJiFsfHxpJiZhJiZjfHwhciYmY3x8IW8pcmV0dXJuIDE7aWYoIWkmJiFzJiYhbCYmdDxlfHxsJiZyJiZvJiYhaSYmIXN8fHUmJnImJm98fCFhJiZvfHwhYylyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBJaSh0LGUsbixyKXtmb3IodmFyIGk9LTEsbz10Lmxlbmd0aCxzPW4ubGVuZ3RoLGE9LTEsdT1lLmxlbmd0aCxjPXhuKG8tcywwKSxsPUV0KHUrYyksaD0hcjsrK2E8dTspbFthXT1lW2FdO2Zvcig7KytpPHM7KShofHxpPG8pJiYobFtuW2ldXT10W2ldKTtmb3IoO2MtLTspbFthKytdPXRbaSsrXTtyZXR1cm4gbH1mdW5jdGlvbiBNaSh0LGUsbixyKXtmb3IodmFyIGk9LTEsbz10Lmxlbmd0aCxzPS0xLGE9bi5sZW5ndGgsdT0tMSxjPWUubGVuZ3RoLGw9eG4oby1hLDApLGg9RXQobCtjKSxmPSFyOysraTxsOyloW2ldPXRbaV07Zm9yKHZhciBwPWk7Kyt1PGM7KWhbcCt1XT1lW3VdO2Zvcig7KytzPGE7KShmfHxpPG8pJiYoaFtwK25bc11dPXRbaSsrXSk7cmV0dXJuIGh9ZnVuY3Rpb24gRmkodCxlKXt2YXIgbj0tMSxyPXQubGVuZ3RoO2ZvcihlfHwoZT1FdChyKSk7KytuPHI7KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBUaSh0LGUscixpKXt2YXIgbz0hcjtyfHwocj17fSk7Zm9yKHZhciBzPS0xLGE9ZS5sZW5ndGg7KytzPGE7KXt2YXIgdT1lW3NdLGM9aT9pKHJbdV0sdFt1XSx1LHIsdCk6bjtjPT09biYmKGM9dFt1XSksbz9hcihyLHUsYyk6cnIocix1LGMpfXJldHVybiByfWZ1bmN0aW9uIE9pKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scil7dmFyIGk9WHMobik/SWU6b3Isbz1lP2UoKTp7fTtyZXR1cm4gaShuLHQsbG8ociwyKSxvKX19ZnVuY3Rpb24gTGkodCl7cmV0dXJuIFFyKChmdW5jdGlvbihlLHIpe3ZhciBpPS0xLG89ci5sZW5ndGgscz1vPjE/cltvLTFdOm4sYT1vPjI/clsyXTpuO2ZvcihzPXQubGVuZ3RoPjMmJiJmdW5jdGlvbiI9PXR5cGVvZiBzPyhvLS0scyk6bixhJiZibyhyWzBdLHJbMV0sYSkmJihzPW88Mz9uOnMsbz0xKSxlPUl0KGUpOysraTxvOyl7dmFyIHU9cltpXTt1JiZ0KGUsdSxpLHMpfXJldHVybiBlfSkpfWZ1bmN0aW9uIFBpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4scil7aWYobnVsbD09bilyZXR1cm4gbjtpZighSHMobikpcmV0dXJuIHQobixyKTtmb3IodmFyIGk9bi5sZW5ndGgsbz1lP2k6LTEscz1JdChuKTsoZT9vLS06KytvPGkpJiYhMSE9PXIoc1tvXSxvLHMpOyk7cmV0dXJuIG59fWZ1bmN0aW9uIFJpKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7Zm9yKHZhciBpPS0xLG89SXQoZSkscz1yKGUpLGE9cy5sZW5ndGg7YS0tOyl7dmFyIHU9c1t0P2E6KytpXTtpZighMT09PW4ob1t1XSx1LG8pKWJyZWFrfXJldHVybiBlfX1mdW5jdGlvbiBCaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9Y24oZT14YShlKSk/Z24oZSk6bixpPXI/clswXTplLmNoYXJBdCgwKSxvPXI/RGkociwxKS5qb2luKCIiKTplLnNsaWNlKDEpO3JldHVybiBpW3RdKCkrb319ZnVuY3Rpb24ga2kodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBrZSgkYShZYShlKS5yZXBsYWNlKGVlLCIiKSksdCwiIil9fWZ1bmN0aW9uIHppKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdKTtjYXNlIDU6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSk7Y2FzZSA2OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSk7Y2FzZSA3OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdKX12YXIgbj1Wbih0LnByb3RvdHlwZSkscj10LmFwcGx5KG4sZSk7cmV0dXJuIG5hKHIpP3I6bn19ZnVuY3Rpb24gamkodCl7cmV0dXJuIGZ1bmN0aW9uKGUscixpKXt2YXIgbz1JdChlKTtpZighSHMoZSkpe3ZhciBzPWxvKHIsMyk7ZT1PYShlKSxyPWZ1bmN0aW9uKHQpe3JldHVybiBzKG9bdF0sdCxvKX19dmFyIGE9dChlLHIsaSk7cmV0dXJuIGE+LTE/b1tzP2VbYV06YV06bn19ZnVuY3Rpb24gVWkodCl7cmV0dXJuIGlvKChmdW5jdGlvbihlKXt2YXIgaT1lLmxlbmd0aCxvPWkscz1Zbi5wcm90b3R5cGUudGhydTtmb3IodCYmZS5yZXZlcnNlKCk7by0tOyl7dmFyIGE9ZVtvXTtpZigiZnVuY3Rpb24iIT10eXBlb2YgYSl0aHJvdyBuZXcgVHQocik7aWYocyYmIXUmJiJ3cmFwcGVyIj09dW8oYSkpdmFyIHU9bmV3IFluKFtdLCEwKX1mb3Iobz11P286aTsrK288aTspe3ZhciBjPXVvKGE9ZVtvXSksbD0id3JhcHBlciI9PWM/YW8oYSk6bjt1PWwmJkVvKGxbMF0pJiY0MjQ9PWxbMV0mJiFsWzRdLmxlbmd0aCYmMT09bFs5XT91W3VvKGxbMF0pXS5hcHBseSh1LGxbM10pOjE9PWEubGVuZ3RoJiZFbyhhKT91W2NdKCk6dS50aHJ1KGEpfXJldHVybiBmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cyxuPXRbMF07aWYodSYmMT09dC5sZW5ndGgmJlhzKG4pKXJldHVybiB1LnBsYW50KG4pLnZhbHVlKCk7Zm9yKHZhciByPTAsbz1pP2Vbcl0uYXBwbHkodGhpcyx0KTpuOysrcjxpOylvPWVbcl0uY2FsbCh0aGlzLG8pO3JldHVybiBvfX0pKX1mdW5jdGlvbiBxaSh0LGUscixpLG8scyxhLHUsbCxoKXt2YXIgZj1lJmMscD0xJmUsZD0yJmUsZz0yNCZlLHk9NTEyJmUsbT1kP246emkodCk7cmV0dXJuIGZ1bmN0aW9uIGMoKXtmb3IodmFyIHY9YXJndW1lbnRzLmxlbmd0aCxfPUV0KHYpLHg9djt4LS07KV9beF09YXJndW1lbnRzW3hdO2lmKGcpdmFyIHc9Y28oYyksYj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aCxyPTA7bi0tOyl0W25dPT09ZSYmKytyO3JldHVybiByfShfLHcpO2lmKGkmJihfPUlpKF8saSxvLGcpKSxzJiYoXz1NaShfLHMsYSxnKSksdi09YixnJiZ2PGgpe3ZhciBEPWZuKF8sdyk7cmV0dXJuIFppKHQsZSxxaSxjLnBsYWNlaG9sZGVyLHIsXyxELHUsbCxoLXYpfXZhciBFPXA/cjp0aGlzLEM9ZD9FW3RdOnQ7cmV0dXJuIHY9Xy5sZW5ndGgsdT9fPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoLGk9d24oZS5sZW5ndGgsciksbz1GaSh0KTtpLS07KXt2YXIgcz1lW2ldO3RbaV09d28ocyxyKT9vW3NdOm59cmV0dXJuIHR9KF8sdSk6eSYmdj4xJiZfLnJldmVyc2UoKSxmJiZsPHYmJihfLmxlbmd0aD1sKSx0aGlzJiZ0aGlzIT09eWUmJnRoaXMgaW5zdGFuY2VvZiBjJiYoQz1tfHx6aShDKSksQy5hcHBseShFLF8pfX1mdW5jdGlvbiBWaSh0LGUpe3JldHVybiBmdW5jdGlvbihuLHIpe3JldHVybiBmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gYnIodCwoZnVuY3Rpb24odCxpLG8pe2UocixuKHQpLGksbyl9KSkscn0obix0LGUocikse30pfX1mdW5jdGlvbiBHaSh0LGUpe3JldHVybiBmdW5jdGlvbihyLGkpe3ZhciBvO2lmKHI9PT1uJiZpPT09bilyZXR1cm4gZTtpZihyIT09biYmKG89ciksaSE9PW4pe2lmKG89PT1uKXJldHVybiBpOyJzdHJpbmciPT10eXBlb2Ygcnx8InN0cmluZyI9PXR5cGVvZiBpPyhyPWhpKHIpLGk9aGkoaSkpOihyPWxpKHIpLGk9bGkoaSkpLG89dChyLGkpfXJldHVybiBvfX1mdW5jdGlvbiBZaSh0KXtyZXR1cm4gaW8oKGZ1bmN0aW9uKGUpe3JldHVybiBlPVJlKGUsdG4obG8oKSkpLFFyKChmdW5jdGlvbihuKXt2YXIgcj10aGlzO3JldHVybiB0KGUsKGZ1bmN0aW9uKHQpe3JldHVybiBOZSh0LHIsbil9KSl9KSl9KSl9ZnVuY3Rpb24gWGkodCxlKXt2YXIgcj0oZT1lPT09bj8iICI6aGkoZSkpLmxlbmd0aDtpZihyPDIpcmV0dXJuIHI/SnIoZSx0KTplO3ZhciBpPUpyKGUsbWUodC9kbihlKSkpO3JldHVybiBjbihlKT9EaShnbihpKSwwLHQpLmpvaW4oIiIpOmkuc2xpY2UoMCx0KX1mdW5jdGlvbiBXaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLGkpe3JldHVybiBpJiYibnVtYmVyIiE9dHlwZW9mIGkmJmJvKGUscixpKSYmKHI9aT1uKSxlPWdhKGUpLHI9PT1uPyhyPWUsZT0wKTpyPWdhKHIpLGZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaT0tMSxvPXhuKG1lKChlLXQpLyhufHwxKSksMCkscz1FdChvKTtvLS07KXNbcj9vOisraV09dCx0Kz1uO3JldHVybiBzfShlLHIsaT1pPT09bj9lPHI/MTotMTpnYShpKSx0KX19ZnVuY3Rpb24gSGkodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYic3RyaW5nIj09dHlwZW9mIG58fChlPXZhKGUpLG49dmEobikpLHQoZSxuKX19ZnVuY3Rpb24gWmkodCxlLHIsaSxvLHMsYyxsLGgsZil7dmFyIHA9OCZlO2V8PXA/YTp1LDQmKGUmPX4ocD91OmEpKXx8KGUmPS00KTt2YXIgZD1bdCxlLG8scD9zOm4scD9jOm4scD9uOnMscD9uOmMsbCxoLGZdLGc9ci5hcHBseShuLGQpO3JldHVybiBFbyh0KSYmVG8oZyxkKSxnLnBsYWNlaG9sZGVyPWksUG8oZyx0LGUpfWZ1bmN0aW9uIEtpKHQpe3ZhciBlPU50W3RdO3JldHVybiBmdW5jdGlvbih0LG4pe2lmKHQ9dmEodCksKG49bnVsbD09bj8wOnduKHlhKG4pLDI5MikpJiZVZSh0KSl7dmFyIHI9KHhhKHQpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKChyPSh4YShlKHJbMF0rImUiKygrclsxXStuKSkpKyJlIikuc3BsaXQoImUiKSlbMF0rImUiKygrclsxXS1uKSl9cmV0dXJuIGUodCl9fXZhciBKaT1JbiYmMS9wbihuZXcgSW4oWywtMF0pKVsxXT09aD9mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEluKHQpfTpsdTtmdW5jdGlvbiBRaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49bW8oZSk7cmV0dXJuIG49PUM/bG4oZSk6bj09TT9mdW5jdGlvbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7blsrK2VdPVt0LHRdfSkpLG59KGUpOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFJlKGUsKGZ1bmN0aW9uKGUpe3JldHVybltlLHRbZV1dfSkpfShlLHQoZSkpfX1mdW5jdGlvbiAkaSh0LGUsaSxoLGYscCxkLGcpe3ZhciB5PTImZTtpZigheSYmImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3ZhciBtPWg/aC5sZW5ndGg6MDtpZihtfHwoZSY9LTk3LGg9Zj1uKSxkPWQ9PT1uP2Q6eG4oeWEoZCksMCksZz1nPT09bj9nOnlhKGcpLG0tPWY/Zi5sZW5ndGg6MCxlJnUpe3ZhciB2PWgsXz1mO2g9Zj1ufXZhciB4PXk/bjphbyh0KSx3PVt0LGUsaSxoLGYsdixfLHAsZCxnXTtpZih4JiZmdW5jdGlvbih0LGUpe3ZhciBuPXRbMV0scj1lWzFdLGk9bnxyLHM9aTwxMzEsYT1yPT1jJiY4PT1ufHxyPT1jJiZuPT1sJiZ0WzddLmxlbmd0aDw9ZVs4XXx8Mzg0PT1yJiZlWzddLmxlbmd0aDw9ZVs4XSYmOD09bjtpZighcyYmIWEpcmV0dXJuIHQ7MSZyJiYodFsyXT1lWzJdLGl8PTEmbj8wOjQpO3ZhciB1PWVbM107aWYodSl7dmFyIGg9dFszXTt0WzNdPWg/SWkoaCx1LGVbNF0pOnUsdFs0XT1oP2ZuKHRbM10sbyk6ZVs0XX11PWVbNV0sdSYmKGg9dFs1XSx0WzVdPWg/TWkoaCx1LGVbNl0pOnUsdFs2XT1oP2ZuKHRbNV0sbyk6ZVs2XSksdT1lWzddLHUmJih0WzddPXUpLHImYyYmKHRbOF09bnVsbD09dFs4XT9lWzhdOnduKHRbOF0sZVs4XSkpLG51bGw9PXRbOV0mJih0WzldPWVbOV0pLHRbMF09ZVswXSx0WzFdPWl9KHcseCksdD13WzBdLGU9d1sxXSxpPXdbMl0saD13WzNdLGY9d1s0XSwhKGc9d1s5XT13WzldPT09bj95PzA6dC5sZW5ndGg6eG4od1s5XS1tLDApKSYmMjQmZSYmKGUmPS0yNSksZSYmMSE9ZSliPTg9PWV8fGU9PXM/ZnVuY3Rpb24odCxlLHIpe3ZhciBpPXppKHQpO3JldHVybiBmdW5jdGlvbiBvKCl7Zm9yKHZhciBzPWFyZ3VtZW50cy5sZW5ndGgsYT1FdChzKSx1PXMsYz1jbyhvKTt1LS07KWFbdV09YXJndW1lbnRzW3VdO3ZhciBsPXM8MyYmYVswXSE9PWMmJmFbcy0xXSE9PWM/W106Zm4oYSxjKTtyZXR1cm4ocy09bC5sZW5ndGgpPHI/WmkodCxlLHFpLG8ucGxhY2Vob2xkZXIsbixhLGwsbixuLHItcyk6TmUodGhpcyYmdGhpcyE9PXllJiZ0aGlzIGluc3RhbmNlb2Ygbz9pOnQsdGhpcyxhKX19KHQsZSxnKTplIT1hJiYzMyE9ZXx8Zi5sZW5ndGg/cWkuYXBwbHkobix3KTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT0xJmUsbz16aSh0KTtyZXR1cm4gZnVuY3Rpb24gZSgpe2Zvcih2YXIgcz0tMSxhPWFyZ3VtZW50cy5sZW5ndGgsdT0tMSxjPXIubGVuZ3RoLGw9RXQoYythKSxoPXRoaXMmJnRoaXMhPT15ZSYmdGhpcyBpbnN0YW5jZW9mIGU/bzp0OysrdTxjOylsW3VdPXJbdV07Zm9yKDthLS07KWxbdSsrXT1hcmd1bWVudHNbKytzXTtyZXR1cm4gTmUoaCxpP246dGhpcyxsKX19KHQsZSxpLGgpO2Vsc2UgdmFyIGI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPTEmZSxpPXppKHQpO3JldHVybiBmdW5jdGlvbiBlKCl7cmV0dXJuKHRoaXMmJnRoaXMhPT15ZSYmdGhpcyBpbnN0YW5jZW9mIGU/aTp0KS5hcHBseShyP246dGhpcyxhcmd1bWVudHMpfX0odCxlLGkpO3JldHVybiBQbygoeD9uaTpUbykoYix3KSx0LGUpfWZ1bmN0aW9uIHRvKHQsZSxyLGkpe3JldHVybiB0PT09bnx8cXModCxQdFtyXSkmJiFrdC5jYWxsKGkscik/ZTp0fWZ1bmN0aW9uIGVvKHQsZSxyLGksbyxzKXtyZXR1cm4gbmEodCkmJm5hKGUpJiYocy5zZXQoZSx0KSxHcih0LGUsbixlbyxzKSxzLmRlbGV0ZShlKSksdH1mdW5jdGlvbiBubyh0KXtyZXR1cm4gc2EodCk/bjp0fWZ1bmN0aW9uIHJvKHQsZSxyLGksbyxzKXt2YXIgYT0xJnIsdT10Lmxlbmd0aCxjPWUubGVuZ3RoO2lmKHUhPWMmJiEoYSYmYz51KSlyZXR1cm4hMTt2YXIgbD1zLmdldCh0KSxoPXMuZ2V0KGUpO2lmKGwmJmgpcmV0dXJuIGw9PWUmJmg9PXQ7dmFyIGY9LTEscD0hMCxkPTImcj9uZXcgS246bjtmb3Iocy5zZXQodCxlKSxzLnNldChlLHQpOysrZjx1Oyl7dmFyIGc9dFtmXSx5PWVbZl07aWYoaSl2YXIgbT1hP2koeSxnLGYsZSx0LHMpOmkoZyx5LGYsdCxlLHMpO2lmKG0hPT1uKXtpZihtKWNvbnRpbnVlO3A9ITE7YnJlYWt9aWYoZCl7aWYoIWplKGUsKGZ1bmN0aW9uKHQsZSl7aWYoIW5uKGQsZSkmJihnPT09dHx8byhnLHQscixpLHMpKSlyZXR1cm4gZC5wdXNoKGUpfSkpKXtwPSExO2JyZWFrfX1lbHNlIGlmKGchPT15JiYhbyhnLHkscixpLHMpKXtwPSExO2JyZWFrfX1yZXR1cm4gcy5kZWxldGUodCkscy5kZWxldGUoZSkscH1mdW5jdGlvbiBpbyh0KXtyZXR1cm4gTG8oSW8odCxuLFdvKSx0KyIiKX1mdW5jdGlvbiBvbyh0KXtyZXR1cm4gU3IodCxPYSxnbyl9ZnVuY3Rpb24gc28odCl7cmV0dXJuIFNyKHQsTGEseW8pfXZhciBhbz1Ubj9mdW5jdGlvbih0KXtyZXR1cm4gVG4uZ2V0KHQpfTpsdTtmdW5jdGlvbiB1byh0KXtmb3IodmFyIGU9dC5uYW1lKyIiLG49T25bZV0scj1rdC5jYWxsKE9uLGUpP24ubGVuZ3RoOjA7ci0tOyl7dmFyIGk9bltyXSxvPWkuZnVuYztpZihudWxsPT1vfHxvPT10KXJldHVybiBpLm5hbWV9cmV0dXJuIGV9ZnVuY3Rpb24gY28odCl7cmV0dXJuKGt0LmNhbGwocW4sInBsYWNlaG9sZGVyIik/cW46dCkucGxhY2Vob2xkZXJ9ZnVuY3Rpb24gbG8oKXt2YXIgdD1xbi5pdGVyYXRlZXx8c3U7cmV0dXJuIHQ9dD09PXN1P0JyOnQsYXJndW1lbnRzLmxlbmd0aD90KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOnR9ZnVuY3Rpb24gaG8odCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fShlKT9uWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIGZvKHQpe2Zvcih2YXIgZT1PYSh0KSxuPWUubGVuZ3RoO24tLTspe3ZhciByPWVbbl0saT10W3JdO2Vbbl09W3IsaSxBbyhpKV19cmV0dXJuIGV9ZnVuY3Rpb24gcG8odCxlKXt2YXIgcj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P246dFtlXX0odCxlKTtyZXR1cm4gUnIocik/cjpufXZhciBnbz14ZT9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1JdCh0KSxPZSh4ZSh0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIEp0LmNhbGwodCxlKX0pKSl9Om11LHlvPXhlP2Z1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXTt0OylCZShlLGdvKHQpKSx0PVp0KHQpO3JldHVybiBlfTptdSxtbz1BcjtmdW5jdGlvbiB2byh0LGUsbil7Zm9yKHZhciByPS0xLGk9KGU9d2koZSx0KSkubGVuZ3RoLG89ITE7KytyPGk7KXt2YXIgcz16byhlW3JdKTtpZighKG89bnVsbCE9dCYmbih0LHMpKSlicmVhazt0PXRbc119cmV0dXJuIG98fCsrciE9aT9vOiEhKGk9bnVsbD09dD8wOnQubGVuZ3RoKSYmZWEoaSkmJndvKHMsaSkmJihYcyh0KXx8WXModCkpfWZ1bmN0aW9uIF9vKHQpe3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0LmNvbnN0cnVjdG9yfHxTbyh0KT97fTpWbihadCh0KSl9ZnVuY3Rpb24geG8odCl7cmV0dXJuIFhzKHQpfHxZcyh0KXx8ISEoJHQmJnQmJnRbJHRdKX1mdW5jdGlvbiB3byh0LGUpe3ZhciBuPXR5cGVvZiB0O3JldHVybiEhKGU9bnVsbD09ZT9mOmUpJiYoIm51bWJlciI9PW58fCJzeW1ib2wiIT1uJiZ4dC50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9ZnVuY3Rpb24gYm8odCxlLG4pe2lmKCFuYShuKSlyZXR1cm4hMTt2YXIgcj10eXBlb2YgZTtyZXR1cm4hISgibnVtYmVyIj09cj9IcyhuKSYmd28oZSxuLmxlbmd0aCk6InN0cmluZyI9PXImJmUgaW4gbikmJnFzKG5bZV0sdCl9ZnVuY3Rpb24gRG8odCxlKXtpZihYcyh0KSlyZXR1cm4hMTt2YXIgbj10eXBlb2YgdDtyZXR1cm4hKCJudW1iZXIiIT1uJiYic3ltYm9sIiE9biYmImJvb2xlYW4iIT1uJiZudWxsIT10JiYhbGEodCkpfHwobnQudGVzdCh0KXx8IWV0LnRlc3QodCl8fG51bGwhPWUmJnQgaW4gSXQoZSkpfWZ1bmN0aW9uIEVvKHQpe3ZhciBlPXVvKHQpLG49cW5bZV07aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG58fCEoZSBpbiBYbi5wcm90b3R5cGUpKXJldHVybiExO2lmKHQ9PT1uKXJldHVybiEwO3ZhciByPWFvKG4pO3JldHVybiEhciYmdD09PXJbMF19KFNuJiZtbyhuZXcgU24obmV3IEFycmF5QnVmZmVyKDEpKSkhPVB8fEFuJiZtbyhuZXcgQW4pIT1DfHxObiYmbW8oTm4ucmVzb2x2ZSgpKSE9Tnx8SW4mJm1vKG5ldyBJbikhPU18fE1uJiZtbyhuZXcgTW4pIT1PKSYmKG1vPWZ1bmN0aW9uKHQpe3ZhciBlPUFyKHQpLHI9ZT09QT90LmNvbnN0cnVjdG9yOm4saT1yP2pvKHIpOiIiO2lmKGkpc3dpdGNoKGkpe2Nhc2UgTG46cmV0dXJuIFA7Y2FzZSBQbjpyZXR1cm4gQztjYXNlIFJuOnJldHVybiBOO2Nhc2UgQm46cmV0dXJuIE07Y2FzZSBrbjpyZXR1cm4gT31yZXR1cm4gZX0pO3ZhciBDbz1SdD8kczp2dTtmdW5jdGlvbiBTbyh0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8UHQpfWZ1bmN0aW9uIEFvKHQpe3JldHVybiB0PT10JiYhbmEodCl9ZnVuY3Rpb24gTm8odCxlKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIG51bGwhPXImJihyW3RdPT09ZSYmKGUhPT1ufHx0IGluIEl0KHIpKSl9fWZ1bmN0aW9uIElvKHQsZSxyKXtyZXR1cm4gZT14bihlPT09bj90Lmxlbmd0aC0xOmUsMCksZnVuY3Rpb24oKXtmb3IodmFyIG49YXJndW1lbnRzLGk9LTEsbz14bihuLmxlbmd0aC1lLDApLHM9RXQobyk7KytpPG87KXNbaV09bltlK2ldO2k9LTE7Zm9yKHZhciBhPUV0KGUrMSk7KytpPGU7KWFbaV09bltpXTtyZXR1cm4gYVtlXT1yKHMpLE5lKHQsdGhpcyxhKX19ZnVuY3Rpb24gTW8odCxlKXtyZXR1cm4gZS5sZW5ndGg8Mj90OkNyKHQsb2koZSwwLC0xKSl9ZnVuY3Rpb24gRm8odCxlKXtpZigoImNvbnN0cnVjdG9yIiE9PWV8fCJmdW5jdGlvbiIhPXR5cGVvZiB0W2VdKSYmIl9fcHJvdG9fXyIhPWUpcmV0dXJuIHRbZV19dmFyIFRvPVJvKG5pKSxPbz1nZXx8ZnVuY3Rpb24odCxlKXtyZXR1cm4geWUuc2V0VGltZW91dCh0LGUpfSxMbz1SbyhyaSk7ZnVuY3Rpb24gUG8odCxlLG4pe3ZhciByPWUrIiI7cmV0dXJuIExvKHQsZnVuY3Rpb24odCxlKXt2YXIgbj1lLmxlbmd0aDtpZighbilyZXR1cm4gdDt2YXIgcj1uLTE7cmV0dXJuIGVbcl09KG4+MT8iJiAiOiIiKStlW3JdLGU9ZS5qb2luKG4+Mj8iLCAiOiIgIiksdC5yZXBsYWNlKHV0LCJ7XG4vKiBbd3JhcHBlZCB3aXRoICIrZSsiXSAqL1xuIil9KHIsZnVuY3Rpb24odCxlKXtyZXR1cm4gTWUobSwoZnVuY3Rpb24obil7dmFyIHI9Il8uIituWzBdO2UmblsxXSYmIUxlKHQscikmJnQucHVzaChyKX0pKSx0LnNvcnQoKX0oZnVuY3Rpb24odCl7dmFyIGU9dC5tYXRjaChjdCk7cmV0dXJuIGU/ZVsxXS5zcGxpdChsdCk6W119KHIpLG4pKSl9ZnVuY3Rpb24gUm8odCl7dmFyIGU9MCxyPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9Ym4oKSxvPTE2LShpLXIpO2lmKHI9aSxvPjApe2lmKCsrZT49ODAwKXJldHVybiBhcmd1bWVudHNbMF19ZWxzZSBlPTA7cmV0dXJuIHQuYXBwbHkobixhcmd1bWVudHMpfX1mdW5jdGlvbiBCbyh0LGUpe3ZhciByPS0xLGk9dC5sZW5ndGgsbz1pLTE7Zm9yKGU9ZT09PW4/aTplOysrcjxlOyl7dmFyIHM9S3IocixvKSxhPXRbc107dFtzXT10W3JdLHRbcl09YX1yZXR1cm4gdC5sZW5ndGg9ZSx0fXZhciBrbz1mdW5jdGlvbih0KXt2YXIgZT1Scyh0LChmdW5jdGlvbih0KXtyZXR1cm4gNTAwPT09bi5zaXplJiZuLmNsZWFyKCksdH0pKSxuPWUuY2FjaGU7cmV0dXJuIGV9KChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKHJ0LChmdW5jdGlvbih0LG4scixpKXtlLnB1c2gocj9pLnJlcGxhY2UocHQsIiQxIik6bnx8dCl9KSksZX0pKTtmdW5jdGlvbiB6byh0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fGxhKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1oPyItMCI6ZX1mdW5jdGlvbiBqbyh0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIEJ0LmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifWZ1bmN0aW9uIFVvKHQpe2lmKHQgaW5zdGFuY2VvZiBYbilyZXR1cm4gdC5jbG9uZSgpO3ZhciBlPW5ldyBZbih0Ll9fd3JhcHBlZF9fLHQuX19jaGFpbl9fKTtyZXR1cm4gZS5fX2FjdGlvbnNfXz1GaSh0Ll9fYWN0aW9uc19fKSxlLl9faW5kZXhfXz10Ll9faW5kZXhfXyxlLl9fdmFsdWVzX189dC5fX3ZhbHVlc19fLGV9dmFyIHFvPVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBacyh0KT9wcih0LF9yKGUsMSxacywhMCkpOltdfSkpLFZvPVFyKChmdW5jdGlvbih0LGUpe3ZhciByPVFvKGUpO3JldHVybiBacyhyKSYmKHI9biksWnModCk/cHIodCxfcihlLDEsWnMsITApLGxvKHIsMikpOltdfSkpLEdvPVFyKChmdW5jdGlvbih0LGUpe3ZhciByPVFvKGUpO3JldHVybiBacyhyKSYmKHI9biksWnModCk/cHIodCxfcihlLDEsWnMsITApLG4scik6W119KSk7ZnVuY3Rpb24gWW8odCxlLG4pe3ZhciByPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgaT1udWxsPT1uPzA6eWEobik7cmV0dXJuIGk8MCYmKGk9eG4ocitpLDApKSxWZSh0LGxvKGUsMyksaSl9ZnVuY3Rpb24gWG8odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaSlyZXR1cm4tMTt2YXIgbz1pLTE7cmV0dXJuIHIhPT1uJiYobz15YShyKSxvPXI8MD94bihpK28sMCk6d24obyxpLTEpKSxWZSh0LGxvKGUsMyksbywhMCl9ZnVuY3Rpb24gV28odCl7cmV0dXJuKG51bGw9PXQ/MDp0Lmxlbmd0aCk/X3IodCwxKTpbXX1mdW5jdGlvbiBIbyh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/dFswXTpufXZhciBabz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UmUodCxfaSk7cmV0dXJuIGUubGVuZ3RoJiZlWzBdPT09dFswXT9GcihlKTpbXX0pKSxLbz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCkscj1SZSh0LF9pKTtyZXR1cm4gZT09PVFvKHIpP2U9bjpyLnBvcCgpLHIubGVuZ3RoJiZyWzBdPT09dFswXT9GcihyLGxvKGUsMikpOltdfSkpLEpvPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KSxyPVJlKHQsX2kpO3JldHVybihlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bikmJnIucG9wKCksci5sZW5ndGgmJnJbMF09PT10WzBdP0ZyKHIsbixlKTpbXX0pKTtmdW5jdGlvbiBRbyh0KXt2YXIgZT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGU/dFtlLTFdOm59dmFyICRvPVFyKHRzKTtmdW5jdGlvbiB0cyh0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aCYmZSYmZS5sZW5ndGg/SHIodCxlKTp0fXZhciBlcz1pbygoZnVuY3Rpb24odCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGgscj11cih0LGUpO3JldHVybiBacih0LFJlKGUsKGZ1bmN0aW9uKHQpe3JldHVybiB3byh0LG4pPyt0OnR9KSkuc29ydChOaSkpLHJ9KSk7ZnVuY3Rpb24gbnModCl7cmV0dXJuIG51bGw9PXQ/dDpDbi5jYWxsKHQpfXZhciBycz1RcigoZnVuY3Rpb24odCl7cmV0dXJuIGZpKF9yKHQsMSxacywhMCkpfSkpLGlzPVFyKChmdW5jdGlvbih0KXt2YXIgZT1Rbyh0KTtyZXR1cm4gWnMoZSkmJihlPW4pLGZpKF9yKHQsMSxacywhMCksbG8oZSwyKSl9KSksb3M9UXIoKGZ1bmN0aW9uKHQpe3ZhciBlPVFvKHQpO3JldHVybiBlPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bixmaShfcih0LDEsWnMsITApLG4sZSl9KSk7ZnVuY3Rpb24gc3ModCl7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm5bXTt2YXIgZT0wO3JldHVybiB0PU9lKHQsKGZ1bmN0aW9uKHQpe2lmKFpzKHQpKXJldHVybiBlPXhuKHQubGVuZ3RoLGUpLCEwfSkpLFFlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBSZSh0LEhlKGUpKX0pKX1mdW5jdGlvbiBhcyh0LGUpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuW107dmFyIHI9c3ModCk7cmV0dXJuIG51bGw9PWU/cjpSZShyLChmdW5jdGlvbih0KXtyZXR1cm4gTmUoZSxuLHQpfSkpfXZhciB1cz1RcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gWnModCk/cHIodCxlKTpbXX0pKSxjcz1RcigoZnVuY3Rpb24odCl7cmV0dXJuIG1pKE9lKHQsWnMpKX0pKSxscz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCk7cmV0dXJuIFpzKGUpJiYoZT1uKSxtaShPZSh0LFpzKSxsbyhlLDIpKX0pKSxocz1RcigoZnVuY3Rpb24odCl7dmFyIGU9UW8odCk7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuLG1pKE9lKHQsWnMpLG4sZSl9KSksZnM9UXIoc3MpO3ZhciBwcz1RcigoZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGgscj1lPjE/dFtlLTFdOm47cmV0dXJuIHI9ImZ1bmN0aW9uIj09dHlwZW9mIHI/KHQucG9wKCkscik6bixhcyh0LHIpfSkpO2Z1bmN0aW9uIGRzKHQpe3ZhciBlPXFuKHQpO3JldHVybiBlLl9fY2hhaW5fXz0hMCxlfWZ1bmN0aW9uIGdzKHQsZSl7cmV0dXJuIGUodCl9dmFyIHlzPWlvKChmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aCxyPWU/dFswXTowLGk9dGhpcy5fX3dyYXBwZWRfXyxvPWZ1bmN0aW9uKGUpe3JldHVybiB1cihlLHQpfTtyZXR1cm4hKGU+MXx8dGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpJiZpIGluc3RhbmNlb2YgWG4mJndvKHIpPygoaT1pLnNsaWNlKHIsK3IrKGU/MTowKSkpLl9fYWN0aW9uc19fLnB1c2goe2Z1bmM6Z3MsYXJnczpbb10sdGhpc0FyZzpufSksbmV3IFluKGksdGhpcy5fX2NoYWluX18pLnRocnUoKGZ1bmN0aW9uKHQpe3JldHVybiBlJiYhdC5sZW5ndGgmJnQucHVzaChuKSx0fSkpKTp0aGlzLnRocnUobyl9KSk7dmFyIG1zPU9pKChmdW5jdGlvbih0LGUsbil7a3QuY2FsbCh0LG4pPysrdFtuXTphcih0LG4sMSl9KSk7dmFyIHZzPWppKFlvKSxfcz1qaShYbyk7ZnVuY3Rpb24geHModCxlKXtyZXR1cm4oWHModCk/TWU6ZHIpKHQsbG8oZSwzKSl9ZnVuY3Rpb24gd3ModCxlKXtyZXR1cm4oWHModCk/RmU6Z3IpKHQsbG8oZSwzKSl9dmFyIGJzPU9pKChmdW5jdGlvbih0LGUsbil7a3QuY2FsbCh0LG4pP3Rbbl0ucHVzaChlKTphcih0LG4sW2VdKX0pKTt2YXIgRHM9UXIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0tMSxpPSJmdW5jdGlvbiI9PXR5cGVvZiBlLG89SHModCk/RXQodC5sZW5ndGgpOltdO3JldHVybiBkcih0LChmdW5jdGlvbih0KXtvWysrcl09aT9OZShlLHQsbik6VHIodCxlLG4pfSkpLG99KSksRXM9T2koKGZ1bmN0aW9uKHQsZSxuKXthcih0LG4sZSl9KSk7ZnVuY3Rpb24gQ3ModCxlKXtyZXR1cm4oWHModCk/UmU6VXIpKHQsbG8oZSwzKSl9dmFyIFNzPU9pKChmdW5jdGlvbih0LGUsbil7dFtuPzA6MV0ucHVzaChlKX0pLChmdW5jdGlvbigpe3JldHVybltbXSxbXV19KSk7dmFyIEFzPVFyKChmdW5jdGlvbih0LGUpe2lmKG51bGw9PXQpcmV0dXJuW107dmFyIG49ZS5sZW5ndGg7cmV0dXJuIG4+MSYmYm8odCxlWzBdLGVbMV0pP2U9W106bj4yJiZibyhlWzBdLGVbMV0sZVsyXSkmJihlPVtlWzBdXSksWHIodCxfcihlLDEpLFtdKX0pKSxOcz1kZXx8ZnVuY3Rpb24oKXtyZXR1cm4geWUuRGF0ZS5ub3coKX07ZnVuY3Rpb24gSXModCxlLHIpe3JldHVybiBlPXI/bjplLGU9dCYmbnVsbD09ZT90Lmxlbmd0aDplLCRpKHQsYyxuLG4sbixuLGUpfWZ1bmN0aW9uIE1zKHQsZSl7dmFyIGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR0KHIpO3JldHVybiB0PXlhKHQpLGZ1bmN0aW9uKCl7cmV0dXJuLS10PjAmJihpPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpKSx0PD0xJiYoZT1uKSxpfX12YXIgRnM9UXIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0xO2lmKG4ubGVuZ3RoKXt2YXIgaT1mbihuLGNvKEZzKSk7cnw9YX1yZXR1cm4gJGkodCxyLGUsbixpKX0pKSxUcz1RcigoZnVuY3Rpb24odCxlLG4pe3ZhciByPTM7aWYobi5sZW5ndGgpe3ZhciBpPWZuKG4sY28oVHMpKTtyfD1hfXJldHVybiAkaShlLHIsdCxuLGkpfSkpO2Z1bmN0aW9uIE9zKHQsZSxpKXt2YXIgbyxzLGEsdSxjLGwsaD0wLGY9ITEscD0hMSxkPSEwO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtmdW5jdGlvbiBnKGUpe3ZhciByPW8saT1zO3JldHVybiBvPXM9bixoPWUsdT10LmFwcGx5KGkscil9ZnVuY3Rpb24geSh0KXt2YXIgcj10LWw7cmV0dXJuIGw9PT1ufHxyPj1lfHxyPDB8fHAmJnQtaD49YX1mdW5jdGlvbiBtKCl7dmFyIHQ9TnMoKTtpZih5KHQpKXJldHVybiB2KHQpO2M9T28obSxmdW5jdGlvbih0KXt2YXIgbj1lLSh0LWwpO3JldHVybiBwP3duKG4sYS0odC1oKSk6bn0odCkpfWZ1bmN0aW9uIHYodCl7cmV0dXJuIGM9bixkJiZvP2codCk6KG89cz1uLHUpfWZ1bmN0aW9uIF8oKXt2YXIgdD1OcygpLHI9eSh0KTtpZihvPWFyZ3VtZW50cyxzPXRoaXMsbD10LHIpe2lmKGM9PT1uKXJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaD10LGM9T28obSxlKSxmP2codCk6dX0obCk7aWYocClyZXR1cm4gRWkoYyksYz1PbyhtLGUpLGcobCl9cmV0dXJuIGM9PT1uJiYoYz1PbyhtLGUpKSx1fXJldHVybiBlPXZhKGUpfHwwLG5hKGkpJiYoZj0hIWkubGVhZGluZyxhPShwPSJtYXhXYWl0ImluIGkpP3huKHZhKGkubWF4V2FpdCl8fDAsZSk6YSxkPSJ0cmFpbGluZyJpbiBpPyEhaS50cmFpbGluZzpkKSxfLmNhbmNlbD1mdW5jdGlvbigpe2MhPT1uJiZFaShjKSxoPTAsbz1sPXM9Yz1ufSxfLmZsdXNoPWZ1bmN0aW9uKCl7cmV0dXJuIGM9PT1uP3U6dihOcygpKX0sX312YXIgTHM9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZyKHQsMSxlKX0pKSxQcz1RcigoZnVuY3Rpb24odCxlLG4pe3JldHVybiBmcih0LHZhKGUpfHwwLG4pfSkpO2Z1bmN0aW9uIFJzKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUdChyKTt2YXIgbj1mdW5jdGlvbigpe3ZhciByPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLHIpOnJbMF0sbz1uLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgcz10LmFwcGx5KHRoaXMscik7cmV0dXJuIG4uY2FjaGU9by5zZXQoaSxzKXx8byxzfTtyZXR1cm4gbi5jYWNoZT1uZXcoUnMuQ2FjaGV8fFpuKSxufWZ1bmN0aW9uIEJzKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUdChyKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIXQuY2FsbCh0aGlzKTtjYXNlIDE6cmV0dXJuIXQuY2FsbCh0aGlzLGVbMF0pO2Nhc2UgMjpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSxlWzFdKTtjYXNlIDM6cmV0dXJuIXQuY2FsbCh0aGlzLGVbMF0sZVsxXSxlWzJdKX1yZXR1cm4hdC5hcHBseSh0aGlzLGUpfX1Scy5DYWNoZT1abjt2YXIga3M9YmkoKGZ1bmN0aW9uKHQsZSl7dmFyIG49KGU9MT09ZS5sZW5ndGgmJlhzKGVbMF0pP1JlKGVbMF0sdG4obG8oKSkpOlJlKF9yKGUsMSksdG4obG8oKSkpKS5sZW5ndGg7cmV0dXJuIFFyKChmdW5jdGlvbihyKXtmb3IodmFyIGk9LTEsbz13bihyLmxlbmd0aCxuKTsrK2k8bzspcltpXT1lW2ldLmNhbGwodGhpcyxyW2ldKTtyZXR1cm4gTmUodCx0aGlzLHIpfSkpfSkpLHpzPVFyKChmdW5jdGlvbih0LGUpe3ZhciByPWZuKGUsY28oenMpKTtyZXR1cm4gJGkodCxhLG4sZSxyKX0pKSxqcz1RcigoZnVuY3Rpb24odCxlKXt2YXIgcj1mbihlLGNvKGpzKSk7cmV0dXJuICRpKHQsdSxuLGUscil9KSksVXM9aW8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuICRpKHQsbCxuLG4sbixlKX0pKTtmdW5jdGlvbiBxcyh0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX12YXIgVnM9SGkoTnIpLEdzPUhpKChmdW5jdGlvbih0LGUpe3JldHVybiB0Pj1lfSkpLFlzPU9yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/T3I6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZrdC5jYWxsKHQsImNhbGxlZSIpJiYhSnQuY2FsbCh0LCJjYWxsZWUiKX0sWHM9RXQuaXNBcnJheSxXcz1iZT90bihiZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZBcih0KT09TH07ZnVuY3Rpb24gSHModCl7cmV0dXJuIG51bGwhPXQmJmVhKHQubGVuZ3RoKSYmISRzKHQpfWZ1bmN0aW9uIFpzKHQpe3JldHVybiByYSh0KSYmSHModCl9dmFyIEtzPXdlfHx2dSxKcz1EZT90bihEZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZBcih0KT09d307ZnVuY3Rpb24gUXModCl7aWYoIXJhKHQpKXJldHVybiExO3ZhciBlPUFyKHQpO3JldHVybiBlPT1ifHwiW29iamVjdCBET01FeGNlcHRpb25dIj09ZXx8InN0cmluZyI9PXR5cGVvZiB0Lm1lc3NhZ2UmJiJzdHJpbmciPT10eXBlb2YgdC5uYW1lJiYhc2EodCl9ZnVuY3Rpb24gJHModCl7aWYoIW5hKHQpKXJldHVybiExO3ZhciBlPUFyKHQpO3JldHVybiBlPT1EfHxlPT1FfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9ZnVuY3Rpb24gdGEodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0PT15YSh0KX1mdW5jdGlvbiBlYSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnQ+LTEmJnQlMT09MCYmdDw9Zn1mdW5jdGlvbiBuYSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX1mdW5jdGlvbiByYSh0KXtyZXR1cm4gbnVsbCE9dCYmIm9iamVjdCI9PXR5cGVvZiB0fXZhciBpYT1FZT90bihFZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZtbyh0KT09Q307ZnVuY3Rpb24gb2EodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fHxyYSh0KSYmQXIodCk9PVN9ZnVuY3Rpb24gc2EodCl7aWYoIXJhKHQpfHxBcih0KSE9QSlyZXR1cm4hMTt2YXIgZT1adCh0KTtpZihudWxsPT09ZSlyZXR1cm4hMDt2YXIgbj1rdC5jYWxsKGUsImNvbnN0cnVjdG9yIikmJmUuY29uc3RydWN0b3I7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4mJm4gaW5zdGFuY2VvZiBuJiZCdC5jYWxsKG4pPT1xdH12YXIgYWE9Q2U/dG4oQ2UpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmQXIodCk9PUl9O3ZhciB1YT1TZT90bihTZSk6ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZtbyh0KT09TX07ZnVuY3Rpb24gY2EodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHwhWHModCkmJnJhKHQpJiZBcih0KT09Rn1mdW5jdGlvbiBsYSh0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fHJhKHQpJiZBcih0KT09VH12YXIgaGE9QWU/dG4oQWUpOmZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmZWEodC5sZW5ndGgpJiYhIWNlW0FyKHQpXX07dmFyIGZhPUhpKGpyKSxwYT1IaSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdDw9ZX0pKTtmdW5jdGlvbiBkYSh0KXtpZighdClyZXR1cm5bXTtpZihIcyh0KSlyZXR1cm4gY2EodCk/Z24odCk6RmkodCk7aWYodGUmJnRbdGVdKXJldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGUsbj1bXTshKGU9dC5uZXh0KCkpLmRvbmU7KW4ucHVzaChlLnZhbHVlKTtyZXR1cm4gbn0odFt0ZV0oKSk7dmFyIGU9bW8odCk7cmV0dXJuKGU9PUM/bG46ZT09TT9wbjpxYSkodCl9ZnVuY3Rpb24gZ2EodCl7cmV0dXJuIHQ/KHQ9dmEodCkpPT09aHx8dD09PS1oPzE3OTc2OTMxMzQ4NjIzMTU3ZTI5MioodDwwPy0xOjEpOnQ9PXQ/dDowOjA9PT10P3Q6MH1mdW5jdGlvbiB5YSh0KXt2YXIgZT1nYSh0KSxuPWUlMTtyZXR1cm4gZT09ZT9uP2UtbjplOjB9ZnVuY3Rpb24gbWEodCl7cmV0dXJuIHQ/Y3IoeWEodCksMCxkKTowfWZ1bmN0aW9uIHZhKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihsYSh0KSlyZXR1cm4gcDtpZihuYSh0KSl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQudmFsdWVPZj90LnZhbHVlT2YoKTp0O3Q9bmEoZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PSRlKHQpO3ZhciBuPW10LnRlc3QodCk7cmV0dXJuIG58fF90LnRlc3QodCk/cGUodC5zbGljZSgyKSxuPzI6OCk6eXQudGVzdCh0KT9wOit0fWZ1bmN0aW9uIF9hKHQpe3JldHVybiBUaSh0LExhKHQpKX1mdW5jdGlvbiB4YSh0KXtyZXR1cm4gbnVsbD09dD8iIjpoaSh0KX12YXIgd2E9TGkoKGZ1bmN0aW9uKHQsZSl7aWYoU28oZSl8fEhzKGUpKVRpKGUsT2EoZSksdCk7ZWxzZSBmb3IodmFyIG4gaW4gZSlrdC5jYWxsKGUsbikmJnJyKHQsbixlW25dKX0pKSxiYT1MaSgoZnVuY3Rpb24odCxlKXtUaShlLExhKGUpLHQpfSkpLERhPUxpKChmdW5jdGlvbih0LGUsbixyKXtUaShlLExhKGUpLHQscil9KSksRWE9TGkoKGZ1bmN0aW9uKHQsZSxuLHIpe1RpKGUsT2EoZSksdCxyKX0pKSxDYT1pbyh1cik7dmFyIFNhPVFyKChmdW5jdGlvbih0LGUpe3Q9SXQodCk7dmFyIHI9LTEsaT1lLmxlbmd0aCxvPWk+Mj9lWzJdOm47Zm9yKG8mJmJvKGVbMF0sZVsxXSxvKSYmKGk9MSk7KytyPGk7KWZvcih2YXIgcz1lW3JdLGE9TGEocyksdT0tMSxjPWEubGVuZ3RoOysrdTxjOyl7dmFyIGw9YVt1XSxoPXRbbF07KGg9PT1ufHxxcyhoLFB0W2xdKSYmIWt0LmNhbGwodCxsKSkmJih0W2xdPXNbbF0pfXJldHVybiB0fSkpLEFhPVFyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5wdXNoKG4sZW8pLE5lKFJhLG4sdCl9KSk7ZnVuY3Rpb24gTmEodCxlLHIpe3ZhciBpPW51bGw9PXQ/bjpDcih0LGUpO3JldHVybiBpPT09bj9yOml9ZnVuY3Rpb24gSWEodCxlKXtyZXR1cm4gbnVsbCE9dCYmdm8odCxlLE1yKX12YXIgTWE9VmkoKGZ1bmN0aW9uKHQsZSxuKXtudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZyYmKGU9VXQuY2FsbChlKSksdFtlXT1ufSksbnUob3UpKSxGYT1WaSgoZnVuY3Rpb24odCxlLG4pe251bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLnRvU3RyaW5nJiYoZT1VdC5jYWxsKGUpKSxrdC5jYWxsKHQsZSk/dFtlXS5wdXNoKG4pOnRbZV09W25dfSksbG8pLFRhPVFyKFRyKTtmdW5jdGlvbiBPYSh0KXtyZXR1cm4gSHModCk/UW4odCk6a3IodCl9ZnVuY3Rpb24gTGEodCl7cmV0dXJuIEhzKHQpP1FuKHQsITApOnpyKHQpfXZhciBQYT1MaSgoZnVuY3Rpb24odCxlLG4pe0dyKHQsZSxuKX0pKSxSYT1MaSgoZnVuY3Rpb24odCxlLG4scil7R3IodCxlLG4scil9KSksQmE9aW8oKGZ1bmN0aW9uKHQsZSl7dmFyIG49e307aWYobnVsbD09dClyZXR1cm4gbjt2YXIgcj0hMTtlPVJlKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlPXdpKGUsdCkscnx8KHI9ZS5sZW5ndGg+MSksZX0pKSxUaSh0LHNvKHQpLG4pLHImJihuPWxyKG4sNyxubykpO2Zvcih2YXIgaT1lLmxlbmd0aDtpLS07KXBpKG4sZVtpXSk7cmV0dXJuIG59KSk7dmFyIGthPWlvKChmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3t9OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdyKHQsZSwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gSWEodCxuKX0pKX0odCxlKX0pKTtmdW5jdGlvbiB6YSh0LGUpe2lmKG51bGw9PXQpcmV0dXJue307dmFyIG49UmUoc28odCksKGZ1bmN0aW9uKHQpe3JldHVyblt0XX0pKTtyZXR1cm4gZT1sbyhlKSxXcih0LG4sKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUodCxuWzBdKX0pKX12YXIgamE9UWkoT2EpLFVhPVFpKExhKTtmdW5jdGlvbiBxYSh0KXtyZXR1cm4gbnVsbD09dD9bXTplbih0LE9hKHQpKX12YXIgVmE9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZT1lLnRvTG93ZXJDYXNlKCksdCsobj9HYShlKTplKX0pKTtmdW5jdGlvbiBHYSh0KXtyZXR1cm4gUWEoeGEodCkudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gWWEodCl7cmV0dXJuKHQ9eGEodCkpJiZ0LnJlcGxhY2Uod3Qsc24pLnJlcGxhY2UobmUsIiIpfXZhciBYYT1raSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyItIjoiIikrZS50b0xvd2VyQ2FzZSgpfSkpLFdhPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/IiAiOiIiKStlLnRvTG93ZXJDYXNlKCl9KSksSGE9QmkoInRvTG93ZXJDYXNlIik7dmFyIFphPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/Il8iOiIiKStlLnRvTG93ZXJDYXNlKCl9KSk7dmFyIEthPWtpKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/IiAiOiIiKStRYShlKX0pKTt2YXIgSmE9a2koKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iICI6IiIpK2UudG9VcHBlckNhc2UoKX0pKSxRYT1CaSgidG9VcHBlckNhc2UiKTtmdW5jdGlvbiAkYSh0LGUscil7cmV0dXJuIHQ9eGEodCksKGU9cj9uOmUpPT09bj9mdW5jdGlvbih0KXtyZXR1cm4gc2UudGVzdCh0KX0odCk/ZnVuY3Rpb24odCl7cmV0dXJuIHQubWF0Y2goaWUpfHxbXX0odCk6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWF0Y2goaHQpfHxbXX0odCk6dC5tYXRjaChlKXx8W119dmFyIHR1PVFyKChmdW5jdGlvbih0LGUpe3RyeXtyZXR1cm4gTmUodCxuLGUpfWNhdGNoKHQpe3JldHVybiBRcyh0KT90Om5ldyBTdCh0KX19KSksZXU9aW8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1lKGUsKGZ1bmN0aW9uKGUpe2U9em8oZSksYXIodCxlLEZzKHRbZV0sdCkpfSkpLHR9KSk7ZnVuY3Rpb24gbnUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBydT1VaSgpLGl1PVVpKCEwKTtmdW5jdGlvbiBvdSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBzdSh0KXtyZXR1cm4gQnIoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpscih0LDEpKX12YXIgYXU9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBUcihuLHQsZSl9fSkpLHV1PVFyKChmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gVHIodCxuLGUpfX0pKTtmdW5jdGlvbiBjdSh0LGUsbil7dmFyIHI9T2EoZSksaT1FcihlLHIpO251bGw9PW4mJighbmEoZSl8fCFpLmxlbmd0aCYmci5sZW5ndGgpJiYobj1lLGU9dCx0PXRoaXMsaT1FcihlLE9hKGUpKSk7dmFyIG89IShuYShuKSYmImNoYWluImluIG4mJiFuLmNoYWluKSxzPSRzKHQpO3JldHVybiBNZShpLChmdW5jdGlvbihuKXt2YXIgcj1lW25dO3Rbbl09cixzJiYodC5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fY2hhaW5fXztpZihvfHxlKXt2YXIgbj10KHRoaXMuX193cmFwcGVkX18pO3JldHVybihuLl9fYWN0aW9uc19fPUZpKHRoaXMuX19hY3Rpb25zX18pKS5wdXNoKHtmdW5jOnIsYXJnczphcmd1bWVudHMsdGhpc0FyZzp0fSksbi5fX2NoYWluX189ZSxufXJldHVybiByLmFwcGx5KHQsQmUoW3RoaXMudmFsdWUoKV0sYXJndW1lbnRzKSl9KX0pKSx0fWZ1bmN0aW9uIGx1KCl7fXZhciBodT1ZaShSZSksZnU9WWkoVGUpLHB1PVlpKGplKTtmdW5jdGlvbiBkdSh0KXtyZXR1cm4gRG8odCk/SGUoem8odCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gQ3IoZSx0KX19KHQpfXZhciBndT1XaSgpLHl1PVdpKCEwKTtmdW5jdGlvbiBtdSgpe3JldHVybltdfWZ1bmN0aW9uIHZ1KCl7cmV0dXJuITF9dmFyIF91PUdpKChmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9KSwwKSx4dT1LaSgiY2VpbCIpLHd1PUdpKChmdW5jdGlvbih0LGUpe3JldHVybiB0L2V9KSwxKSxidT1LaSgiZmxvb3IiKTt2YXIgRHU9R2koKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQqZX0pLDEpLEV1PUtpKCJyb3VuZCIpLEN1PUdpKChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSwwKTtyZXR1cm4gcW4uYWZ0ZXI9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHQocik7cmV0dXJuIHQ9eWEodCksZnVuY3Rpb24oKXtpZigtLXQ8MSlyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSxxbi5hcnk9SXMscW4uYXNzaWduPXdhLHFuLmFzc2lnbkluPWJhLHFuLmFzc2lnbkluV2l0aD1EYSxxbi5hc3NpZ25XaXRoPUVhLHFuLmF0PUNhLHFuLmJlZm9yZT1Ncyxxbi5iaW5kPUZzLHFuLmJpbmRBbGw9ZXUscW4uYmluZEtleT1Ucyxxbi5jYXN0QXJyYXk9ZnVuY3Rpb24oKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bXTt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIFhzKHQpP3Q6W3RdfSxxbi5jaGFpbj1kcyxxbi5jaHVuaz1mdW5jdGlvbih0LGUscil7ZT0ocj9ibyh0LGUscik6ZT09PW4pPzE6eG4oeWEoZSksMCk7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFpfHxlPDEpcmV0dXJuW107Zm9yKHZhciBvPTAscz0wLGE9RXQobWUoaS9lKSk7bzxpOylhW3MrK109b2kodCxvLG8rPWUpO3JldHVybiBhfSxxbi5jb21wYWN0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPTAsaT1bXTsrK2U8bjspe3ZhciBvPXRbZV07byYmKGlbcisrXT1vKX1yZXR1cm4gaX0scW4uY29uY2F0PWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDtpZighdClyZXR1cm5bXTtmb3IodmFyIGU9RXQodC0xKSxuPWFyZ3VtZW50c1swXSxyPXQ7ci0tOyllW3ItMV09YXJndW1lbnRzW3JdO3JldHVybiBCZShYcyhuKT9GaShuKTpbbl0sX3IoZSwxKSl9LHFuLmNvbmQ9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbD09dD8wOnQubGVuZ3RoLG49bG8oKTtyZXR1cm4gdD1lP1JlKHQsKGZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0WzFdKXRocm93IG5ldyBUdChyKTtyZXR1cm5bbih0WzBdKSx0WzFdXX0pKTpbXSxRcigoZnVuY3Rpb24obil7Zm9yKHZhciByPS0xOysrcjxlOyl7dmFyIGk9dFtyXTtpZihOZShpWzBdLHRoaXMsbikpcmV0dXJuIE5lKGlbMV0sdGhpcyxuKX19KSl9LHFuLmNvbmZvcm1zPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1PYSh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGhyKG4sdCxlKX19KGxyKHQsMSkpfSxxbi5jb25zdGFudD1udSxxbi5jb3VudEJ5PW1zLHFuLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPVZuKHQpO3JldHVybiBudWxsPT1lP246c3IobixlKX0scW4uY3Vycnk9ZnVuY3Rpb24gdChlLHIsaSl7dmFyIG89JGkoZSw4LG4sbixuLG4sbixyPWk/bjpyKTtyZXR1cm4gby5wbGFjZWhvbGRlcj10LnBsYWNlaG9sZGVyLG99LHFuLmN1cnJ5UmlnaHQ9ZnVuY3Rpb24gdChlLHIsaSl7dmFyIG89JGkoZSxzLG4sbixuLG4sbixyPWk/bjpyKTtyZXR1cm4gby5wbGFjZWhvbGRlcj10LnBsYWNlaG9sZGVyLG99LHFuLmRlYm91bmNlPU9zLHFuLmRlZmF1bHRzPVNhLHFuLmRlZmF1bHRzRGVlcD1BYSxxbi5kZWZlcj1Mcyxxbi5kZWxheT1Qcyxxbi5kaWZmZXJlbmNlPXFvLHFuLmRpZmZlcmVuY2VCeT1Wbyxxbi5kaWZmZXJlbmNlV2l0aD1Hbyxxbi5kcm9wPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGk/b2kodCwoZT1yfHxlPT09bj8xOnlhKGUpKTwwPzA6ZSxpKTpbXX0scW4uZHJvcFJpZ2h0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGk/b2kodCwwLChlPWktKGU9cnx8ZT09PW4/MTp5YShlKSkpPDA/MDplKTpbXX0scW4uZHJvcFJpZ2h0V2hpbGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/Z2kodCxsbyhlLDMpLCEwLCEwKTpbXX0scW4uZHJvcFdoaWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2dpKHQsbG8oZSwzKSwhMCk6W119LHFuLmZpbGw9ZnVuY3Rpb24odCxlLHIsaSl7dmFyIG89bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBvPyhyJiYibnVtYmVyIiE9dHlwZW9mIHImJmJvKHQsZSxyKSYmKHI9MCxpPW8pLGZ1bmN0aW9uKHQsZSxyLGkpe3ZhciBvPXQubGVuZ3RoO2Zvcigocj15YShyKSk8MCYmKHI9LXI+bz8wOm8rciksKGk9aT09PW58fGk+bz9vOnlhKGkpKTwwJiYoaSs9byksaT1yPmk/MDptYShpKTtyPGk7KXRbcisrXT1lO3JldHVybiB0fSh0LGUscixpKSk6W119LHFuLmZpbHRlcj1mdW5jdGlvbih0LGUpe3JldHVybihYcyh0KT9PZTp2cikodCxsbyhlLDMpKX0scW4uZmxhdE1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBfcihDcyh0LGUpLDEpfSxxbi5mbGF0TWFwRGVlcD1mdW5jdGlvbih0LGUpe3JldHVybiBfcihDcyh0LGUpLGgpfSxxbi5mbGF0TWFwRGVwdGg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByPXI9PT1uPzE6eWEociksX3IoQ3ModCxlKSxyKX0scW4uZmxhdHRlbj1Xbyxxbi5mbGF0dGVuRGVlcD1mdW5jdGlvbih0KXtyZXR1cm4obnVsbD09dD8wOnQubGVuZ3RoKT9fcih0LGgpOltdfSxxbi5mbGF0dGVuRGVwdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4obnVsbD09dD8wOnQubGVuZ3RoKT9fcih0LGU9ZT09PW4/MTp5YShlKSk6W119LHFuLmZsaXA9ZnVuY3Rpb24odCl7cmV0dXJuICRpKHQsNTEyKX0scW4uZmxvdz1ydSxxbi5mbG93UmlnaHQ9aXUscW4uZnJvbVBhaXJzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPXt9OysrZTxuOyl7dmFyIGk9dFtlXTtyW2lbMF1dPWlbMV19cmV0dXJuIHJ9LHFuLmZ1bmN0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXTpFcih0LE9hKHQpKX0scW4uZnVuY3Rpb25zSW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106RXIodCxMYSh0KSl9LHFuLmdyb3VwQnk9YnMscW4uaW5pdGlhbD1mdW5jdGlvbih0KXtyZXR1cm4obnVsbD09dD8wOnQubGVuZ3RoKT9vaSh0LDAsLTEpOltdfSxxbi5pbnRlcnNlY3Rpb249Wm8scW4uaW50ZXJzZWN0aW9uQnk9S28scW4uaW50ZXJzZWN0aW9uV2l0aD1Kbyxxbi5pbnZlcnQ9TWEscW4uaW52ZXJ0Qnk9RmEscW4uaW52b2tlTWFwPURzLHFuLml0ZXJhdGVlPXN1LHFuLmtleUJ5PUVzLHFuLmtleXM9T2EscW4ua2V5c0luPUxhLHFuLm1hcD1Dcyxxbi5tYXBLZXlzPWZ1bmN0aW9uKHQsZSl7dmFyIG49e307cmV0dXJuIGU9bG8oZSwzKSxicih0LChmdW5jdGlvbih0LHIsaSl7YXIobixlKHQscixpKSx0KX0pKSxufSxxbi5tYXBWYWx1ZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj17fTtyZXR1cm4gZT1sbyhlLDMpLGJyKHQsKGZ1bmN0aW9uKHQscixpKXthcihuLHIsZSh0LHIsaSkpfSkpLG59LHFuLm1hdGNoZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHFyKGxyKHQsMSkpfSxxbi5tYXRjaGVzUHJvcGVydHk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gVnIodCxscihlLDEpKX0scW4ubWVtb2l6ZT1Scyxxbi5tZXJnZT1QYSxxbi5tZXJnZVdpdGg9UmEscW4ubWV0aG9kPWF1LHFuLm1ldGhvZE9mPXV1LHFuLm1peGluPWN1LHFuLm5lZ2F0ZT1Ccyxxbi5udGhBcmc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9eWEodCksUXIoKGZ1bmN0aW9uKGUpe3JldHVybiBZcihlLHQpfSkpfSxxbi5vbWl0PUJhLHFuLm9taXRCeT1mdW5jdGlvbih0LGUpe3JldHVybiB6YSh0LEJzKGxvKGUpKSl9LHFuLm9uY2U9ZnVuY3Rpb24odCl7cmV0dXJuIE1zKDIsdCl9LHFuLm9yZGVyQnk9ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIG51bGw9PXQ/W106KFhzKGUpfHwoZT1udWxsPT1lP1tdOltlXSksWHMocj1pP246cil8fChyPW51bGw9PXI/W106W3JdKSxYcih0LGUscikpfSxxbi5vdmVyPWh1LHFuLm92ZXJBcmdzPWtzLHFuLm92ZXJFdmVyeT1mdSxxbi5vdmVyU29tZT1wdSxxbi5wYXJ0aWFsPXpzLHFuLnBhcnRpYWxSaWdodD1qcyxxbi5wYXJ0aXRpb249U3MscW4ucGljaz1rYSxxbi5waWNrQnk9emEscW4ucHJvcGVydHk9ZHUscW4ucHJvcGVydHlPZj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PXQ/bjpDcih0LGUpfX0scW4ucHVsbD0kbyxxbi5wdWxsQWxsPXRzLHFuLnB1bGxBbGxCeT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQmJnQubGVuZ3RoJiZlJiZlLmxlbmd0aD9Icih0LGUsbG8obiwyKSk6dH0scW4ucHVsbEFsbFdpdGg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0JiZ0Lmxlbmd0aCYmZSYmZS5sZW5ndGg/SHIodCxlLG4scik6dH0scW4ucHVsbEF0PWVzLHFuLnJhbmdlPWd1LHFuLnJhbmdlUmlnaHQ9eXUscW4ucmVhcmc9VXMscW4ucmVqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuKFhzKHQpP09lOnZyKSh0LEJzKGxvKGUsMykpKX0scW4ucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49W107aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4gbjt2YXIgcj0tMSxpPVtdLG89dC5sZW5ndGg7Zm9yKGU9bG8oZSwzKTsrK3I8bzspe3ZhciBzPXRbcl07ZShzLHIsdCkmJihuLnB1c2gocyksaS5wdXNoKHIpKX1yZXR1cm4gWnIodCxpKSxufSxxbi5yZXN0PWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBRcih0LGU9ZT09PW4/ZTp5YShlKSl9LHFuLnJldmVyc2U9bnMscW4uc2FtcGxlU2l6ZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGU9KHI/Ym8odCxlLHIpOmU9PT1uKT8xOnlhKGUpLChYcyh0KT90cjp0aSkodCxlKX0scW4uc2V0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09dD90OmVpKHQsZSxuKX0scW4uc2V0V2l0aD1mdW5jdGlvbih0LGUscixpKXtyZXR1cm4gaT0iZnVuY3Rpb24iPT10eXBlb2YgaT9pOm4sbnVsbD09dD90OmVpKHQsZSxyLGkpfSxxbi5zaHVmZmxlPWZ1bmN0aW9uKHQpe3JldHVybihYcyh0KT9lcjppaSkodCl9LHFuLnNsaWNlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGk/KHImJiJudW1iZXIiIT10eXBlb2YgciYmYm8odCxlLHIpPyhlPTAscj1pKTooZT1udWxsPT1lPzA6eWEoZSkscj1yPT09bj9pOnlhKHIpKSxvaSh0LGUscikpOltdfSxxbi5zb3J0Qnk9QXMscW4uc29ydGVkVW5pcT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/Y2kodCk6W119LHFuLnNvcnRlZFVuaXFCeT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9jaSh0LGxvKGUsMikpOltdfSxxbi5zcGxpdD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHImJiJudW1iZXIiIT10eXBlb2YgciYmYm8odCxlLHIpJiYoZT1yPW4pLChyPXI9PT1uP2Q6cj4+PjApPyh0PXhhKHQpKSYmKCJzdHJpbmciPT10eXBlb2YgZXx8bnVsbCE9ZSYmIWFhKGUpKSYmKCEoZT1oaShlKSkmJmNuKHQpKT9EaShnbih0KSwwLHIpOnQuc3BsaXQoZSxyKTpbXX0scW4uc3ByZWFkPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR0KHIpO3JldHVybiBlPW51bGw9PWU/MDp4bih5YShlKSwwKSxRcigoZnVuY3Rpb24obil7dmFyIHI9bltlXSxpPURpKG4sMCxlKTtyZXR1cm4gciYmQmUoaSxyKSxOZSh0LHRoaXMsaSl9KSl9LHFuLnRhaWw9ZnVuY3Rpb24odCl7dmFyIGU9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBlP29pKHQsMSxlKTpbXX0scW4udGFrZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQmJnQubGVuZ3RoP29pKHQsMCwoZT1yfHxlPT09bj8xOnlhKGUpKTwwPzA6ZSk6W119LHFuLnRha2VSaWdodD1mdW5jdGlvbih0LGUscil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO3JldHVybiBpP29pKHQsKGU9aS0oZT1yfHxlPT09bj8xOnlhKGUpKSk8MD8wOmUsaSk6W119LHFuLnRha2VSaWdodFdoaWxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2dpKHQsbG8oZSwzKSwhMSwhMCk6W119LHFuLnRha2VXaGlsZT1mdW5jdGlvbih0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9naSh0LGxvKGUsMykpOltdfSxxbi50YXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZSh0KSx0fSxxbi50aHJvdHRsZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9ITAsbz0hMDtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHQocik7cmV0dXJuIG5hKG4pJiYoaT0ibGVhZGluZyJpbiBuPyEhbi5sZWFkaW5nOmksbz0idHJhaWxpbmciaW4gbj8hIW4udHJhaWxpbmc6byksT3ModCxlLHtsZWFkaW5nOmksbWF4V2FpdDplLHRyYWlsaW5nOm99KX0scW4udGhydT1ncyxxbi50b0FycmF5PWRhLHFuLnRvUGFpcnM9amEscW4udG9QYWlyc0luPVVhLHFuLnRvUGF0aD1mdW5jdGlvbih0KXtyZXR1cm4gWHModCk/UmUodCx6byk6bGEodCk/W3RdOkZpKGtvKHhhKHQpKSl9LHFuLnRvUGxhaW5PYmplY3Q9X2EscW4udHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1Ycyh0KSxpPXJ8fEtzKHQpfHxoYSh0KTtpZihlPWxvKGUsNCksbnVsbD09bil7dmFyIG89dCYmdC5jb25zdHJ1Y3RvcjtuPWk/cj9uZXcgbzpbXTpuYSh0KSYmJHMobyk/Vm4oWnQodCkpOnt9fXJldHVybihpP01lOmJyKSh0LChmdW5jdGlvbih0LHIsaSl7cmV0dXJuIGUobix0LHIsaSl9KSksbn0scW4udW5hcnk9ZnVuY3Rpb24odCl7cmV0dXJuIElzKHQsMSl9LHFuLnVuaW9uPXJzLHFuLnVuaW9uQnk9aXMscW4udW5pb25XaXRoPW9zLHFuLnVuaXE9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP2ZpKHQpOltdfSxxbi51bmlxQnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/ZmkodCxsbyhlLDIpKTpbXX0scW4udW5pcVdpdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4sdCYmdC5sZW5ndGg/ZmkodCxuLGUpOltdfSxxbi51bnNldD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10fHxwaSh0LGUpfSxxbi51bnppcD1zcyxxbi51bnppcFdpdGg9YXMscW4udXBkYXRlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09dD90OmRpKHQsZSx4aShuKSl9LHFuLnVwZGF0ZVdpdGg9ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGk/aTpuLG51bGw9PXQ/dDpkaSh0LGUseGkociksaSl9LHFuLnZhbHVlcz1xYSxxbi52YWx1ZXNJbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXTplbih0LExhKHQpKX0scW4ud2l0aG91dD11cyxxbi53b3Jkcz0kYSxxbi53cmFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHpzKHhpKGUpLHQpfSxxbi54b3I9Y3MscW4ueG9yQnk9bHMscW4ueG9yV2l0aD1ocyxxbi56aXA9ZnMscW4uemlwT2JqZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZpKHR8fFtdLGV8fFtdLHJyKX0scW4uemlwT2JqZWN0RGVlcD1mdW5jdGlvbih0LGUpe3JldHVybiB2aSh0fHxbXSxlfHxbXSxlaSl9LHFuLnppcFdpdGg9cHMscW4uZW50cmllcz1qYSxxbi5lbnRyaWVzSW49VWEscW4uZXh0ZW5kPWJhLHFuLmV4dGVuZFdpdGg9RGEsY3UocW4scW4pLHFuLmFkZD1fdSxxbi5hdHRlbXB0PXR1LHFuLmNhbWVsQ2FzZT1WYSxxbi5jYXBpdGFsaXplPUdhLHFuLmNlaWw9eHUscW4uY2xhbXA9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByPT09biYmKHI9ZSxlPW4pLHIhPT1uJiYocj0ocj12YShyKSk9PXI/cjowKSxlIT09biYmKGU9KGU9dmEoZSkpPT1lP2U6MCksY3IodmEodCksZSxyKX0scW4uY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGxyKHQsNCl9LHFuLmNsb25lRGVlcD1mdW5jdGlvbih0KXtyZXR1cm4gbHIodCw1KX0scW4uY2xvbmVEZWVwV2l0aD1mdW5jdGlvbih0LGUpe3JldHVybiBscih0LDUsZT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm4pfSxxbi5jbG9uZVdpdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHIodCw0LGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpuKX0scW4uY29uZm9ybXNUbz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lfHxocih0LGUsT2EoZSkpfSxxbi5kZWJ1cnI9WWEscW4uZGVmYXVsdFRvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXR8fHQhPXQ/ZTp0fSxxbi5kaXZpZGU9d3UscW4uZW5kc1dpdGg9ZnVuY3Rpb24odCxlLHIpe3Q9eGEodCksZT1oaShlKTt2YXIgaT10Lmxlbmd0aCxvPXI9cj09PW4/aTpjcih5YShyKSwwLGkpO3JldHVybihyLT1lLmxlbmd0aCk+PTAmJnQuc2xpY2UocixvKT09ZX0scW4uZXE9cXMscW4uZXNjYXBlPWZ1bmN0aW9uKHQpe3JldHVybih0PXhhKHQpKSYmSi50ZXN0KHQpP3QucmVwbGFjZShaLGFuKTp0fSxxbi5lc2NhcGVSZWdFeHA9ZnVuY3Rpb24odCl7cmV0dXJuKHQ9eGEodCkpJiZvdC50ZXN0KHQpP3QucmVwbGFjZShpdCwiXFwkJiIpOnR9LHFuLmV2ZXJ5PWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1Ycyh0KT9UZTp5cjtyZXR1cm4gciYmYm8odCxlLHIpJiYoZT1uKSxpKHQsbG8oZSwzKSl9LHFuLmZpbmQ9dnMscW4uZmluZEluZGV4PVlvLHFuLmZpbmRLZXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcWUodCxsbyhlLDMpLGJyKX0scW4uZmluZExhc3Q9X3MscW4uZmluZExhc3RJbmRleD1Ybyxxbi5maW5kTGFzdEtleT1mdW5jdGlvbih0LGUpe3JldHVybiBxZSh0LGxvKGUsMyksRHIpfSxxbi5mbG9vcj1idSxxbi5mb3JFYWNoPXhzLHFuLmZvckVhY2hSaWdodD13cyxxbi5mb3JJbj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3Q6eHIodCxsbyhlLDMpLExhKX0scW4uZm9ySW5SaWdodD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3Q6d3IodCxsbyhlLDMpLExhKX0scW4uZm9yT3duPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJmJyKHQsbG8oZSwzKSl9LHFuLmZvck93blJpZ2h0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJkRyKHQsbG8oZSwzKSl9LHFuLmdldD1OYSxxbi5ndD1Wcyxxbi5ndGU9R3MscW4uaGFzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPXQmJnZvKHQsZSxJcil9LHFuLmhhc0luPUlhLHFuLmhlYWQ9SG8scW4uaWRlbnRpdHk9b3UscW4uaW5jbHVkZXM9ZnVuY3Rpb24odCxlLG4scil7dD1Icyh0KT90OnFhKHQpLG49biYmIXI/eWEobik6MDt2YXIgaT10Lmxlbmd0aDtyZXR1cm4gbjwwJiYobj14bihpK24sMCkpLGNhKHQpP248PWkmJnQuaW5kZXhPZihlLG4pPi0xOiEhaSYmR2UodCxlLG4pPi0xfSxxbi5pbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1udWxsPT10PzA6dC5sZW5ndGg7aWYoIXIpcmV0dXJuLTE7dmFyIGk9bnVsbD09bj8wOnlhKG4pO3JldHVybiBpPDAmJihpPXhuKHIraSwwKSksR2UodCxlLGkpfSxxbi5pblJhbmdlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZT1nYShlKSxyPT09bj8ocj1lLGU9MCk6cj1nYShyKSxmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ+PXduKGUsbikmJnQ8eG4oZSxuKX0odD12YSh0KSxlLHIpfSxxbi5pbnZva2U9VGEscW4uaXNBcmd1bWVudHM9WXMscW4uaXNBcnJheT1Ycyxxbi5pc0FycmF5QnVmZmVyPVdzLHFuLmlzQXJyYXlMaWtlPUhzLHFuLmlzQXJyYXlMaWtlT2JqZWN0PVpzLHFuLmlzQm9vbGVhbj1mdW5jdGlvbih0KXtyZXR1cm4hMD09PXR8fCExPT09dHx8cmEodCkmJkFyKHQpPT14fSxxbi5pc0J1ZmZlcj1Lcyxxbi5pc0RhdGU9SnMscW4uaXNFbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmMT09PXQubm9kZVR5cGUmJiFzYSh0KX0scW4uaXNFbXB0eT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiEwO2lmKEhzKHQpJiYoWHModCl8fCJzdHJpbmciPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQuc3BsaWNlfHxLcyh0KXx8aGEodCl8fFlzKHQpKSlyZXR1cm4hdC5sZW5ndGg7dmFyIGU9bW8odCk7aWYoZT09Q3x8ZT09TSlyZXR1cm4hdC5zaXplO2lmKFNvKHQpKXJldHVybiFrcih0KS5sZW5ndGg7Zm9yKHZhciBuIGluIHQpaWYoa3QuY2FsbCh0LG4pKXJldHVybiExO3JldHVybiEwfSxxbi5pc0VxdWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIExyKHQsZSl9LHFuLmlzRXF1YWxXaXRoPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT0ocj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOm4pP3IodCxlKTpuO3JldHVybiBpPT09bj9Mcih0LGUsbixyKTohIWl9LHFuLmlzRXJyb3I9UXMscW4uaXNGaW5pdGU9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZVZSh0KX0scW4uaXNGdW5jdGlvbj0kcyxxbi5pc0ludGVnZXI9dGEscW4uaXNMZW5ndGg9ZWEscW4uaXNNYXA9aWEscW4uaXNNYXRjaD1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8UHIodCxlLGZvKGUpKX0scW4uaXNNYXRjaFdpdGg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiByPSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6bixQcih0LGUsZm8oZSkscil9LHFuLmlzTmFOPWZ1bmN0aW9uKHQpe3JldHVybiBvYSh0KSYmdCE9K3R9LHFuLmlzTmF0aXZlPWZ1bmN0aW9uKHQpe2lmKENvKHQpKXRocm93IG5ldyBTdCgiVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuIik7cmV0dXJuIFJyKHQpfSxxbi5pc05pbD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dH0scW4uaXNOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dH0scW4uaXNOdW1iZXI9b2EscW4uaXNPYmplY3Q9bmEscW4uaXNPYmplY3RMaWtlPXJhLHFuLmlzUGxhaW5PYmplY3Q9c2EscW4uaXNSZWdFeHA9YWEscW4uaXNTYWZlSW50ZWdlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGEodCkmJnQ+PS1mJiZ0PD1mfSxxbi5pc1NldD11YSxxbi5pc1N0cmluZz1jYSxxbi5pc1N5bWJvbD1sYSxxbi5pc1R5cGVkQXJyYXk9aGEscW4uaXNVbmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1ufSxxbi5pc1dlYWtNYXA9ZnVuY3Rpb24odCl7cmV0dXJuIHJhKHQpJiZtbyh0KT09T30scW4uaXNXZWFrU2V0PWZ1bmN0aW9uKHQpe3JldHVybiByYSh0KSYmIltvYmplY3QgV2Vha1NldF0iPT1Bcih0KX0scW4uam9pbj1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10PyIiOlplLmNhbGwodCxlKX0scW4ua2ViYWJDYXNlPVhhLHFuLmxhc3Q9UW8scW4ubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaSlyZXR1cm4tMTt2YXIgbz1pO3JldHVybiByIT09biYmKG89KG89eWEocikpPDA/eG4oaStvLDApOnduKG8saS0xKSksZT09ZT9mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW4rMTtyLS07KWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybiByfSh0LGUsbyk6VmUodCxYZSxvLCEwKX0scW4ubG93ZXJDYXNlPVdhLHFuLmxvd2VyRmlyc3Q9SGEscW4ubHQ9ZmEscW4ubHRlPXBhLHFuLm1heD1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/bXIodCxvdSxOcik6bn0scW4ubWF4Qnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/bXIodCxsbyhlLDIpLE5yKTpufSxxbi5tZWFuPWZ1bmN0aW9uKHQpe3JldHVybiBXZSh0LG91KX0scW4ubWVhbkJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdlKHQsbG8oZSwyKSl9LHFuLm1pbj1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGg/bXIodCxvdSxqcik6bn0scW4ubWluQnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/bXIodCxsbyhlLDIpLGpyKTpufSxxbi5zdHViQXJyYXk9bXUscW4uc3R1YkZhbHNlPXZ1LHFuLnN0dWJPYmplY3Q9ZnVuY3Rpb24oKXtyZXR1cm57fX0scW4uc3R1YlN0cmluZz1mdW5jdGlvbigpe3JldHVybiIifSxxbi5zdHViVHJ1ZT1mdW5jdGlvbigpe3JldHVybiEwfSxxbi5tdWx0aXBseT1EdSxxbi5udGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/WXIodCx5YShlKSk6bn0scW4ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiB5ZS5fPT09dGhpcyYmKHllLl89VnQpLHRoaXN9LHFuLm5vb3A9bHUscW4ubm93PU5zLHFuLnBhZD1mdW5jdGlvbih0LGUsbil7dD14YSh0KTt2YXIgcj0oZT15YShlKSk/ZG4odCk6MDtpZighZXx8cj49ZSlyZXR1cm4gdDt2YXIgaT0oZS1yKS8yO3JldHVybiBYaSh2ZShpKSxuKSt0K1hpKG1lKGkpLG4pfSxxbi5wYWRFbmQ9ZnVuY3Rpb24odCxlLG4pe3Q9eGEodCk7dmFyIHI9KGU9eWEoZSkpP2RuKHQpOjA7cmV0dXJuIGUmJnI8ZT90K1hpKGUtcixuKTp0fSxxbi5wYWRTdGFydD1mdW5jdGlvbih0LGUsbil7dD14YSh0KTt2YXIgcj0oZT15YShlKSk/ZG4odCk6MDtyZXR1cm4gZSYmcjxlP1hpKGUtcixuKSt0OnR9LHFuLnBhcnNlSW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnx8bnVsbD09ZT9lPTA6ZSYmKGU9K2UpLERuKHhhKHQpLnJlcGxhY2Uoc3QsIiIpLGV8fDApfSxxbi5yYW5kb209ZnVuY3Rpb24odCxlLHIpe2lmKHImJiJib29sZWFuIiE9dHlwZW9mIHImJmJvKHQsZSxyKSYmKGU9cj1uKSxyPT09biYmKCJib29sZWFuIj09dHlwZW9mIGU/KHI9ZSxlPW4pOiJib29sZWFuIj09dHlwZW9mIHQmJihyPXQsdD1uKSksdD09PW4mJmU9PT1uPyh0PTAsZT0xKToodD1nYSh0KSxlPT09bj8oZT10LHQ9MCk6ZT1nYShlKSksdD5lKXt2YXIgaT10O3Q9ZSxlPWl9aWYocnx8dCUxfHxlJTEpe3ZhciBvPUVuKCk7cmV0dXJuIHduKHQrbyooZS10K2ZlKCIxZS0iKygobysiIikubGVuZ3RoLTEpKSksZSl9cmV0dXJuIEtyKHQsZSl9LHFuLnJlZHVjZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9WHModCk/a2U6S2UsaT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIHIodCxsbyhlLDQpLG4saSxkcil9LHFuLnJlZHVjZVJpZ2h0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1Ycyh0KT96ZTpLZSxpPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gcih0LGxvKGUsNCksbixpLGdyKX0scW4ucmVwZWF0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZT0ocj9ibyh0LGUscik6ZT09PW4pPzE6eWEoZSksSnIoeGEodCksZSl9LHFuLnJlcGxhY2U9ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMsZT14YSh0WzBdKTtyZXR1cm4gdC5sZW5ndGg8Mz9lOmUucmVwbGFjZSh0WzFdLHRbMl0pfSxxbi5yZXN1bHQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPS0xLG89KGU9d2koZSx0KSkubGVuZ3RoO2ZvcihvfHwobz0xLHQ9bik7KytpPG87KXt2YXIgcz1udWxsPT10P246dFt6byhlW2ldKV07cz09PW4mJihpPW8scz1yKSx0PSRzKHMpP3MuY2FsbCh0KTpzfXJldHVybiB0fSxxbi5yb3VuZD1FdSxxbi5ydW5JbkNvbnRleHQ9dCxxbi5zYW1wbGU9ZnVuY3Rpb24odCl7cmV0dXJuKFhzKHQpPyRuOiRyKSh0KX0scW4uc2l6ZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKEhzKHQpKXJldHVybiBjYSh0KT9kbih0KTp0Lmxlbmd0aDt2YXIgZT1tbyh0KTtyZXR1cm4gZT09Q3x8ZT09TT90LnNpemU6a3IodCkubGVuZ3RofSxxbi5zbmFrZUNhc2U9WmEscW4uc29tZT1mdW5jdGlvbih0LGUscil7dmFyIGk9WHModCk/amU6c2k7cmV0dXJuIHImJmJvKHQsZSxyKSYmKGU9biksaSh0LGxvKGUsMykpfSxxbi5zb3J0ZWRJbmRleD1mdW5jdGlvbih0LGUpe3JldHVybiBhaSh0LGUpfSxxbi5zb3J0ZWRJbmRleEJ5PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdWkodCxlLGxvKG4sMikpfSxxbi5zb3J0ZWRJbmRleE9mPWZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbD09dD8wOnQubGVuZ3RoO2lmKG4pe3ZhciByPWFpKHQsZSk7aWYocjxuJiZxcyh0W3JdLGUpKXJldHVybiByfXJldHVybi0xfSxxbi5zb3J0ZWRMYXN0SW5kZXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYWkodCxlLCEwKX0scW4uc29ydGVkTGFzdEluZGV4Qnk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB1aSh0LGUsbG8obiwyKSwhMCl9LHFuLnNvcnRlZExhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dD8wOnQubGVuZ3RoKXt2YXIgbj1haSh0LGUsITApLTE7aWYocXModFtuXSxlKSlyZXR1cm4gbn1yZXR1cm4tMX0scW4uc3RhcnRDYXNlPUthLHFuLnN0YXJ0c1dpdGg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PXhhKHQpLG49bnVsbD09bj8wOmNyKHlhKG4pLDAsdC5sZW5ndGgpLGU9aGkoZSksdC5zbGljZShuLG4rZS5sZW5ndGgpPT1lfSxxbi5zdWJ0cmFjdD1DdSxxbi5zdW09ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubGVuZ3RoP0plKHQsb3UpOjB9LHFuLnN1bUJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP0plKHQsbG8oZSwyKSk6MH0scW4udGVtcGxhdGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPXFuLnRlbXBsYXRlU2V0dGluZ3M7ciYmYm8odCxlLHIpJiYoZT1uKSx0PXhhKHQpLGU9RGEoe30sZSxpLHRvKTt2YXIgbyxzLGE9RGEoe30sZS5pbXBvcnRzLGkuaW1wb3J0cyx0byksdT1PYShhKSxjPWVuKGEsdSksbD0wLGg9ZS5pbnRlcnBvbGF0ZXx8YnQsZj0iX19wICs9ICciLHA9TXQoKGUuZXNjYXBlfHxidCkuc291cmNlKyJ8IitoLnNvdXJjZSsifCIrKGg9PT10dD9kdDpidCkuc291cmNlKyJ8IisoZS5ldmFsdWF0ZXx8YnQpLnNvdXJjZSsifCQiLCJnIiksZD0iLy8jIHNvdXJjZVVSTD0iKyhrdC5jYWxsKGUsInNvdXJjZVVSTCIpPyhlLnNvdXJjZVVSTCsiIikucmVwbGFjZSgvXHMvZywiICIpOiJsb2Rhc2gudGVtcGxhdGVTb3VyY2VzWyIrICsrdWUrIl0iKSsiXG4iO3QucmVwbGFjZShwLChmdW5jdGlvbihlLG4scixpLGEsdSl7cmV0dXJuIHJ8fChyPWkpLGYrPXQuc2xpY2UobCx1KS5yZXBsYWNlKER0LHVuKSxuJiYobz0hMCxmKz0iJyArXG5fX2UoIituKyIpICtcbiciKSxhJiYocz0hMCxmKz0iJztcbiIrYSsiO1xuX19wICs9ICciKSxyJiYoZis9IicgK1xuKChfX3QgPSAoIityKyIpKSA9PSBudWxsID8gJycgOiBfX3QpICtcbiciKSxsPXUrZS5sZW5ndGgsZX0pKSxmKz0iJztcbiI7dmFyIGc9a3QuY2FsbChlLCJ2YXJpYWJsZSIpJiZlLnZhcmlhYmxlO2lmKGcpe2lmKGZ0LnRlc3QoZykpdGhyb3cgbmV3IFN0KCJJbnZhbGlkIGB2YXJpYWJsZWAgb3B0aW9uIHBhc3NlZCBpbnRvIGBfLnRlbXBsYXRlYCIpfWVsc2UgZj0id2l0aCAob2JqKSB7XG4iK2YrIlxufVxuIjtmPShzP2YucmVwbGFjZShZLCIiKTpmKS5yZXBsYWNlKFgsIiQxIikucmVwbGFjZShXLCIkMTsiKSxmPSJmdW5jdGlvbigiKyhnfHwib2JqIikrIikge1xuIisoZz8iIjoib2JqIHx8IChvYmogPSB7fSk7XG4iKSsidmFyIF9fdCwgX19wID0gJyciKyhvPyIsIF9fZSA9IF8uZXNjYXBlIjoiIikrKHM/IiwgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XG5mdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cbiI6IjtcbiIpK2YrInJldHVybiBfX3Bcbn0iO3ZhciB5PXR1KChmdW5jdGlvbigpe3JldHVybiBBdCh1LGQrInJldHVybiAiK2YpLmFwcGx5KG4sYyl9KSk7aWYoeS5zb3VyY2U9ZixRcyh5KSl0aHJvdyB5O3JldHVybiB5fSxxbi50aW1lcz1mdW5jdGlvbih0LGUpe2lmKCh0PXlhKHQpKTwxfHx0PmYpcmV0dXJuW107dmFyIG49ZCxyPXduKHQsZCk7ZT1sbyhlKSx0LT1kO2Zvcih2YXIgaT1RZShyLGUpOysrbjx0OyllKG4pO3JldHVybiBpfSxxbi50b0Zpbml0ZT1nYSxxbi50b0ludGVnZXI9eWEscW4udG9MZW5ndGg9bWEscW4udG9Mb3dlcj1mdW5jdGlvbih0KXtyZXR1cm4geGEodCkudG9Mb3dlckNhc2UoKX0scW4udG9OdW1iZXI9dmEscW4udG9TYWZlSW50ZWdlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD9jcih5YSh0KSwtZixmKTowPT09dD90OjB9LHFuLnRvU3RyaW5nPXhhLHFuLnRvVXBwZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHhhKHQpLnRvVXBwZXJDYXNlKCl9LHFuLnRyaW09ZnVuY3Rpb24odCxlLHIpe2lmKCh0PXhhKHQpKSYmKHJ8fGU9PT1uKSlyZXR1cm4gJGUodCk7aWYoIXR8fCEoZT1oaShlKSkpcmV0dXJuIHQ7dmFyIGk9Z24odCksbz1nbihlKTtyZXR1cm4gRGkoaSxybihpLG8pLG9uKGksbykrMSkuam9pbigiIil9LHFuLnRyaW1FbmQ9ZnVuY3Rpb24odCxlLHIpe2lmKCh0PXhhKHQpKSYmKHJ8fGU9PT1uKSlyZXR1cm4gdC5zbGljZSgwLHluKHQpKzEpO2lmKCF0fHwhKGU9aGkoZSkpKXJldHVybiB0O3ZhciBpPWduKHQpO3JldHVybiBEaShpLDAsb24oaSxnbihlKSkrMSkuam9pbigiIil9LHFuLnRyaW1TdGFydD1mdW5jdGlvbih0LGUscil7aWYoKHQ9eGEodCkpJiYocnx8ZT09PW4pKXJldHVybiB0LnJlcGxhY2Uoc3QsIiIpO2lmKCF0fHwhKGU9aGkoZSkpKXJldHVybiB0O3ZhciBpPWduKHQpO3JldHVybiBEaShpLHJuKGksZ24oZSkpKS5qb2luKCIiKX0scW4udHJ1bmNhdGU9ZnVuY3Rpb24odCxlKXt2YXIgcj0zMCxpPSIuLi4iO2lmKG5hKGUpKXt2YXIgbz0ic2VwYXJhdG9yImluIGU/ZS5zZXBhcmF0b3I6bztyPSJsZW5ndGgiaW4gZT95YShlLmxlbmd0aCk6cixpPSJvbWlzc2lvbiJpbiBlP2hpKGUub21pc3Npb24pOml9dmFyIHM9KHQ9eGEodCkpLmxlbmd0aDtpZihjbih0KSl7dmFyIGE9Z24odCk7cz1hLmxlbmd0aH1pZihyPj1zKXJldHVybiB0O3ZhciB1PXItZG4oaSk7aWYodTwxKXJldHVybiBpO3ZhciBjPWE/RGkoYSwwLHUpLmpvaW4oIiIpOnQuc2xpY2UoMCx1KTtpZihvPT09bilyZXR1cm4gYytpO2lmKGEmJih1Kz1jLmxlbmd0aC11KSxhYShvKSl7aWYodC5zbGljZSh1KS5zZWFyY2gobykpe3ZhciBsLGg9Yztmb3Ioby5nbG9iYWx8fChvPU10KG8uc291cmNlLHhhKGd0LmV4ZWMobykpKyJnIikpLG8ubGFzdEluZGV4PTA7bD1vLmV4ZWMoaCk7KXZhciBmPWwuaW5kZXg7Yz1jLnNsaWNlKDAsZj09PW4/dTpmKX19ZWxzZSBpZih0LmluZGV4T2YoaGkobyksdSkhPXUpe3ZhciBwPWMubGFzdEluZGV4T2Yobyk7cD4tMSYmKGM9Yy5zbGljZSgwLHApKX1yZXR1cm4gYytpfSxxbi51bmVzY2FwZT1mdW5jdGlvbih0KXtyZXR1cm4odD14YSh0KSkmJksudGVzdCh0KT90LnJlcGxhY2UoSCxtbik6dH0scW4udW5pcXVlSWQ9ZnVuY3Rpb24odCl7dmFyIGU9Kyt6dDtyZXR1cm4geGEodCkrZX0scW4udXBwZXJDYXNlPUphLHFuLnVwcGVyRmlyc3Q9UWEscW4uZWFjaD14cyxxbi5lYWNoUmlnaHQ9d3MscW4uZmlyc3Q9SG8sY3UocW4sZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gYnIocW4sKGZ1bmN0aW9uKGUsbil7a3QuY2FsbChxbi5wcm90b3R5cGUsbil8fCh0W25dPWUpfSkpLHR9KCkse2NoYWluOiExfSkscW4uVkVSU0lPTj0iNC4xNy4yMSIsTWUoWyJiaW5kIiwiYmluZEtleSIsImN1cnJ5IiwiY3VycnlSaWdodCIsInBhcnRpYWwiLCJwYXJ0aWFsUmlnaHQiXSwoZnVuY3Rpb24odCl7cW5bdF0ucGxhY2Vob2xkZXI9cW59KSksTWUoWyJkcm9wIiwidGFrZSJdLChmdW5jdGlvbih0LGUpe1huLnByb3RvdHlwZVt0XT1mdW5jdGlvbihyKXtyPXI9PT1uPzE6eG4oeWEociksMCk7dmFyIGk9dGhpcy5fX2ZpbHRlcmVkX18mJiFlP25ldyBYbih0aGlzKTp0aGlzLmNsb25lKCk7cmV0dXJuIGkuX19maWx0ZXJlZF9fP2kuX190YWtlQ291bnRfXz13bihyLGkuX190YWtlQ291bnRfXyk6aS5fX3ZpZXdzX18ucHVzaCh7c2l6ZTp3bihyLGQpLHR5cGU6dCsoaS5fX2Rpcl9fPDA/IlJpZ2h0IjoiIil9KSxpfSxYbi5wcm90b3R5cGVbdCsiUmlnaHQiXT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKClbdF0oZSkucmV2ZXJzZSgpfX0pKSxNZShbImZpbHRlciIsIm1hcCIsInRha2VXaGlsZSJdLChmdW5jdGlvbih0LGUpe3ZhciBuPWUrMSxyPTE9PW58fDM9PW47WG4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY2xvbmUoKTtyZXR1cm4gZS5fX2l0ZXJhdGVlc19fLnB1c2goe2l0ZXJhdGVlOmxvKHQsMyksdHlwZTpufSksZS5fX2ZpbHRlcmVkX189ZS5fX2ZpbHRlcmVkX198fHIsZX19KSksTWUoWyJoZWFkIiwibGFzdCJdLChmdW5jdGlvbih0LGUpe3ZhciBuPSJ0YWtlIisoZT8iUmlnaHQiOiIiKTtYbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tuXSgxKS52YWx1ZSgpWzBdfX0pKSxNZShbImluaXRpYWwiLCJ0YWlsIl0sKGZ1bmN0aW9uKHQsZSl7dmFyIG49ImRyb3AiKyhlPyIiOiJSaWdodCIpO1huLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZmlsdGVyZWRfXz9uZXcgWG4odGhpcyk6dGhpc1tuXSgxKX19KSksWG4ucHJvdG90eXBlLmNvbXBhY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXIob3UpfSxYbi5wcm90b3R5cGUuZmluZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maWx0ZXIodCkuaGVhZCgpfSxYbi5wcm90b3R5cGUuZmluZExhc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpLmZpbmQodCl9LFhuLnByb3RvdHlwZS5pbnZva2VNYXA9UXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/bmV3IFhuKHRoaXMpOnRoaXMubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gVHIobix0LGUpfSkpfSkpLFhuLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmlsdGVyKEJzKGxvKHQpKSl9LFhuLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe3Q9eWEodCk7dmFyIHI9dGhpcztyZXR1cm4gci5fX2ZpbHRlcmVkX18mJih0PjB8fGU8MCk/bmV3IFhuKHIpOih0PDA/cj1yLnRha2VSaWdodCgtdCk6dCYmKHI9ci5kcm9wKHQpKSxlIT09biYmKHI9KGU9eWEoZSkpPDA/ci5kcm9wUmlnaHQoLWUpOnIudGFrZShlLXQpKSxyKX0sWG4ucHJvdG90eXBlLnRha2VSaWdodFdoaWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJldmVyc2UoKS50YWtlV2hpbGUodCkucmV2ZXJzZSgpfSxYbi5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRha2UoZCl9LGJyKFhuLnByb3RvdHlwZSwoZnVuY3Rpb24odCxlKXt2YXIgcj0vXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChlKSxpPS9eKD86aGVhZHxsYXN0KSQvLnRlc3QoZSksbz1xbltpPyJ0YWtlIisoImxhc3QiPT1lPyJSaWdodCI6IiIpOmVdLHM9aXx8L15maW5kLy50ZXN0KGUpOyFvfHwocW4ucHJvdG90eXBlW2VdPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX3dyYXBwZWRfXyxhPWk/WzFdOmFyZ3VtZW50cyx1PWUgaW5zdGFuY2VvZiBYbixjPWFbMF0sbD11fHxYcyhlKSxoPWZ1bmN0aW9uKHQpe3ZhciBlPW8uYXBwbHkocW4sQmUoW3RdLGEpKTtyZXR1cm4gaSYmZj9lWzBdOmV9O2wmJnImJiJmdW5jdGlvbiI9PXR5cGVvZiBjJiYxIT1jLmxlbmd0aCYmKHU9bD0hMSk7dmFyIGY9dGhpcy5fX2NoYWluX18scD0hIXRoaXMuX19hY3Rpb25zX18ubGVuZ3RoLGQ9cyYmIWYsZz11JiYhcDtpZighcyYmbCl7ZT1nP2U6bmV3IFhuKHRoaXMpO3ZhciB5PXQuYXBwbHkoZSxhKTtyZXR1cm4geS5fX2FjdGlvbnNfXy5wdXNoKHtmdW5jOmdzLGFyZ3M6W2hdLHRoaXNBcmc6bn0pLG5ldyBZbih5LGYpfXJldHVybiBkJiZnP3QuYXBwbHkodGhpcyxhKTooeT10aGlzLnRocnUoaCksZD9pP3kudmFsdWUoKVswXTp5LnZhbHVlKCk6eSl9KX0pKSxNZShbInBvcCIsInB1c2giLCJzaGlmdCIsInNvcnQiLCJzcGxpY2UiLCJ1bnNoaWZ0Il0sKGZ1bmN0aW9uKHQpe3ZhciBlPU90W3RdLG49L14oPzpwdXNofHNvcnR8dW5zaGlmdCkkLy50ZXN0KHQpPyJ0YXAiOiJ0aHJ1IixyPS9eKD86cG9wfHNoaWZ0KSQvLnRlc3QodCk7cW4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO2lmKHImJiF0aGlzLl9fY2hhaW5fXyl7dmFyIGk9dGhpcy52YWx1ZSgpO3JldHVybiBlLmFwcGx5KFhzKGkpP2k6W10sdCl9cmV0dXJuIHRoaXNbbl0oKGZ1bmN0aW9uKG4pe3JldHVybiBlLmFwcGx5KFhzKG4pP246W10sdCl9KSl9fSkpLGJyKFhuLnByb3RvdHlwZSwoZnVuY3Rpb24odCxlKXt2YXIgbj1xbltlXTtpZihuKXt2YXIgcj1uLm5hbWUrIiI7a3QuY2FsbChPbixyKXx8KE9uW3JdPVtdKSxPbltyXS5wdXNoKHtuYW1lOmUsZnVuYzpufSl9fSkpLE9uW3FpKG4sMikubmFtZV09W3tuYW1lOiJ3cmFwcGVyIixmdW5jOm59XSxYbi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgWG4odGhpcy5fX3dyYXBwZWRfXyk7cmV0dXJuIHQuX19hY3Rpb25zX189RmkodGhpcy5fX2FjdGlvbnNfXyksdC5fX2Rpcl9fPXRoaXMuX19kaXJfXyx0Ll9fZmlsdGVyZWRfXz10aGlzLl9fZmlsdGVyZWRfXyx0Ll9faXRlcmF0ZWVzX189RmkodGhpcy5fX2l0ZXJhdGVlc19fKSx0Ll9fdGFrZUNvdW50X189dGhpcy5fX3Rha2VDb3VudF9fLHQuX192aWV3c19fPUZpKHRoaXMuX192aWV3c19fKSx0fSxYbi5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2lmKHRoaXMuX19maWx0ZXJlZF9fKXt2YXIgdD1uZXcgWG4odGhpcyk7dC5fX2Rpcl9fPS0xLHQuX19maWx0ZXJlZF9fPSEwfWVsc2UodD10aGlzLmNsb25lKCkpLl9fZGlyX18qPS0xO3JldHVybiB0fSxYbi5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9fd3JhcHBlZF9fLnZhbHVlKCksZT10aGlzLl9fZGlyX18sbj1Ycyh0KSxyPWU8MCxpPW4/dC5sZW5ndGg6MCxvPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspe3ZhciBvPW5bcl0scz1vLnNpemU7c3dpdGNoKG8udHlwZSl7Y2FzZSJkcm9wIjp0Kz1zO2JyZWFrO2Nhc2UiZHJvcFJpZ2h0IjplLT1zO2JyZWFrO2Nhc2UidGFrZSI6ZT13bihlLHQrcyk7YnJlYWs7Y2FzZSJ0YWtlUmlnaHQiOnQ9eG4odCxlLXMpfX1yZXR1cm57c3RhcnQ6dCxlbmQ6ZX19KDAsaSx0aGlzLl9fdmlld3NfXykscz1vLnN0YXJ0LGE9by5lbmQsdT1hLXMsYz1yP2E6cy0xLGw9dGhpcy5fX2l0ZXJhdGVlc19fLGg9bC5sZW5ndGgsZj0wLHA9d24odSx0aGlzLl9fdGFrZUNvdW50X18pO2lmKCFufHwhciYmaT09dSYmcD09dSlyZXR1cm4geWkodCx0aGlzLl9fYWN0aW9uc19fKTt2YXIgZD1bXTt0OmZvcig7dS0tJiZmPHA7KXtmb3IodmFyIGc9LTEseT10W2MrPWVdOysrZzxoOyl7dmFyIG09bFtnXSx2PW0uaXRlcmF0ZWUsXz1tLnR5cGUseD12KHkpO2lmKDI9PV8peT14O2Vsc2UgaWYoIXgpe2lmKDE9PV8pY29udGludWUgdDticmVhayB0fX1kW2YrK109eX1yZXR1cm4gZH0scW4ucHJvdG90eXBlLmF0PXlzLHFuLnByb3RvdHlwZS5jaGFpbj1mdW5jdGlvbigpe3JldHVybiBkcyh0aGlzKX0scW4ucHJvdG90eXBlLmNvbW1pdD1mdW5jdGlvbigpe3JldHVybiBuZXcgWW4odGhpcy52YWx1ZSgpLHRoaXMuX19jaGFpbl9fKX0scW4ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXt0aGlzLl9fdmFsdWVzX189PT1uJiYodGhpcy5fX3ZhbHVlc19fPWRhKHRoaXMudmFsdWUoKSkpO3ZhciB0PXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoO3JldHVybntkb25lOnQsdmFsdWU6dD9uOnRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXX19LHFuLnByb3RvdHlwZS5wbGFudD1mdW5jdGlvbih0KXtmb3IodmFyIGUscj10aGlzO3IgaW5zdGFuY2VvZiBHbjspe3ZhciBpPVVvKHIpO2kuX19pbmRleF9fPTAsaS5fX3ZhbHVlc19fPW4sZT9vLl9fd3JhcHBlZF9fPWk6ZT1pO3ZhciBvPWk7cj1yLl9fd3JhcHBlZF9ffXJldHVybiBvLl9fd3JhcHBlZF9fPXQsZX0scW4ucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9fd3JhcHBlZF9fO2lmKHQgaW5zdGFuY2VvZiBYbil7dmFyIGU9dDtyZXR1cm4gdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgmJihlPW5ldyBYbih0aGlzKSksKGU9ZS5yZXZlcnNlKCkpLl9fYWN0aW9uc19fLnB1c2goe2Z1bmM6Z3MsYXJnczpbbnNdLHRoaXNBcmc6bn0pLG5ldyBZbihlLHRoaXMuX19jaGFpbl9fKX1yZXR1cm4gdGhpcy50aHJ1KG5zKX0scW4ucHJvdG90eXBlLnRvSlNPTj1xbi5wcm90b3R5cGUudmFsdWVPZj1xbi5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4geWkodGhpcy5fX3dyYXBwZWRfXyx0aGlzLl9fYWN0aW9uc19fKX0scW4ucHJvdG90eXBlLmZpcnN0PXFuLnByb3RvdHlwZS5oZWFkLHRlJiYocW4ucHJvdG90eXBlW3RlXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSkscW59KCk7dmU/KCh2ZS5leHBvcnRzPXZuKS5fPXZuLG1lLl89dm4pOnllLl89dm59KS5jYWxsKHRlKX0pKTt2YXIgbmU9NjM3MTAwOC44LHJlPXttZXRlcnM6bmUsbWV0cmVzOm5lLG1pbGxpbWV0ZXJzOjFlMypuZSxtaWxsaW1ldHJlczoxZTMqbmUsY2VudGltZXRlcnM6MTAwKm5lLGNlbnRpbWV0cmVzOjEwMCpuZSxraWxvbWV0ZXJzOm5lLzFlMyxraWxvbWV0cmVzOm5lLzFlMyxtaWxlczpuZS8xNjA5LjM0NCxuYXV0aWNhbG1pbGVzOm5lLzE4NTIsaW5jaGVzOjM5LjM3Km5lLHlhcmRzOm5lLzEuMDkzNixmZWV0OjMuMjgwODQqbmUscmFkaWFuczoxLGRlZ3JlZXM6bmUvMTExMzI1fSxpZT17bWV0ZXJzOjEsbWV0cmVzOjEsbWlsbGltZXRlcnM6MWUzLG1pbGxpbWV0cmVzOjFlMyxjZW50aW1ldGVyczoxMDAsY2VudGltZXRyZXM6MTAwLGtpbG9tZXRlcnM6LjAwMSxraWxvbWV0cmVzOi4wMDEsbWlsZXM6MS8xNjA5LjM0NCxuYXV0aWNhbG1pbGVzOjEvMTg1MixpbmNoZXM6MzkuMzcseWFyZHM6MS8xLjA5MzYsZmVldDozLjI4MDg0LHJhZGlhbnM6MS9uZSxkZWdyZWVzOjEvMTExMzI1fSxvZT17bWV0ZXJzOjEsbWV0cmVzOjEsbWlsbGltZXRlcnM6MWU2LG1pbGxpbWV0cmVzOjFlNixjZW50aW1ldGVyczoxZTQsY2VudGltZXRyZXM6MWU0LGtpbG9tZXRlcnM6MWUtNixraWxvbWV0cmVzOjFlLTYsYWNyZXM6MjQ3MTA1ZS05LG1pbGVzOjM4NmUtOSx5YXJkczoxLjE5NTk5MDA0NixmZWV0OjEwLjc2MzkxMDQxNyxpbmNoZXM6MTU1MC4wMDMxMDAwMDZ9O2Z1bmN0aW9uIHNlKHQsZSxuKXtpZighdmUobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLmJib3gsaT1uLmlkO2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKCJnZW9tZXRyeSBpcyByZXF1aXJlZCIpO2lmKGUmJmUuY29uc3RydWN0b3IhPT1PYmplY3QpdGhyb3cgbmV3IEVycm9yKCJwcm9wZXJ0aWVzIG11c3QgYmUgYW4gT2JqZWN0Iik7ciYmX2UociksaSYmeGUoaSk7dmFyIG89e3R5cGU6IkZlYXR1cmUifTtyZXR1cm4gaSYmKG8uaWQ9aSksciYmKG8uYmJveD1yKSxvLnByb3BlcnRpZXM9ZXx8e30sby5nZW9tZXRyeT10LG99ZnVuY3Rpb24gYWUodCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gQXJyYXkiKTtpZih0Lmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhdCBsZWFzdCAyIG51bWJlcnMgbG9uZyIpO2lmKCFtZSh0WzBdKXx8IW1lKHRbMV0pKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBjb250YWluIG51bWJlcnMiKTtyZXR1cm4gc2Uoe3R5cGU6IlBvaW50Iixjb29yZGluYXRlczp0fSxlLG4pfWZ1bmN0aW9uIHVlKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBpPXRbcl07aWYoaS5sZW5ndGg8NCl0aHJvdyBuZXcgRXJyb3IoIkVhY2ggTGluZWFyUmluZyBvZiBhIFBvbHlnb24gbXVzdCBoYXZlIDQgb3IgbW9yZSBQb3NpdGlvbnMuIik7Zm9yKHZhciBvPTA7bzxpW2kubGVuZ3RoLTFdLmxlbmd0aDtvKyspe2lmKDA9PT1yJiYwPT09byYmIW1lKGlbMF1bMF0pfHwhbWUoaVswXVsxXSkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGNvbnRhaW4gbnVtYmVycyIpO2lmKGlbaS5sZW5ndGgtMV1bb10hPT1pWzBdW29dKXRocm93IG5ldyBFcnJvcigiRmlyc3QgYW5kIGxhc3QgUG9zaXRpb24gYXJlIG5vdCBlcXVpdmFsZW50LiIpfX1yZXR1cm4gc2Uoe3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24gY2UodCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtpZih0Lmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBhcnJheSBvZiB0d28gb3IgbW9yZSBwb3NpdGlvbnMiKTtpZighbWUodFswXVsxXSl8fCFtZSh0WzBdWzFdKSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgY29udGFpbiBudW1iZXJzIik7cmV0dXJuIHNlKHt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fSxlLG4pfWZ1bmN0aW9uIGxlKHQsZSl7aWYoIXZlKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5iYm94LHI9ZS5pZDtpZighdCl0aHJvdyBuZXcgRXJyb3IoIk5vIGZlYXR1cmVzIHBhc3NlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiZmVhdHVyZXMgbXVzdCBiZSBhbiBBcnJheSIpO24mJl9lKG4pLHImJnhlKHIpO3ZhciBpPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiJ9O3JldHVybiByJiYoaS5pZD1yKSxuJiYoaS5iYm94PW4pLGkuZmVhdHVyZXM9dCxpfWZ1bmN0aW9uIGhlKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7cmV0dXJuIHNlKHt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24gZmUodCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtyZXR1cm4gc2Uoe3R5cGU6Ik11bHRpUG9pbnQiLGNvb3JkaW5hdGVzOnR9LGUsbil9ZnVuY3Rpb24gcGUodCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtyZXR1cm4gc2Uoe3R5cGU6Ik11bHRpUG9seWdvbiIsY29vcmRpbmF0ZXM6dH0sZSxuKX1mdW5jdGlvbiBkZSh0LGUpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJyYWRpYW5zIGlzIHJlcXVpcmVkIik7aWYoZSYmInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigidW5pdHMgbXVzdCBiZSBhIHN0cmluZyIpO3ZhciBuPXJlW2V8fCJraWxvbWV0ZXJzIl07aWYoIW4pdGhyb3cgbmV3IEVycm9yKGUrIiB1bml0cyBpcyBpbnZhbGlkIik7cmV0dXJuIHQqbn1mdW5jdGlvbiBnZSh0LGUpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJkaXN0YW5jZSBpcyByZXF1aXJlZCIpO2lmKGUmJiJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoInVuaXRzIG11c3QgYmUgYSBzdHJpbmciKTt2YXIgbj1yZVtlfHwia2lsb21ldGVycyJdO2lmKCFuKXRocm93IG5ldyBFcnJvcihlKyIgdW5pdHMgaXMgaW52YWxpZCIpO3JldHVybiB0L259ZnVuY3Rpb24geWUodCl7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoInJhZGlhbnMgaXMgcmVxdWlyZWQiKTtyZXR1cm4gMTgwKih0JSgyKk1hdGguUEkpKS9NYXRoLlBJfWZ1bmN0aW9uIG1lKHQpe3JldHVybiFpc05hTih0KSYmbnVsbCE9PXQmJiFBcnJheS5pc0FycmF5KHQpfWZ1bmN0aW9uIHZlKHQpe3JldHVybiEhdCYmdC5jb25zdHJ1Y3Rvcj09PU9iamVjdH1mdW5jdGlvbiBfZSh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImJib3ggaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImJib3ggbXVzdCBiZSBhbiBBcnJheSIpO2lmKDQhPT10Lmxlbmd0aCYmNiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiYmJveCBtdXN0IGJlIGFuIEFycmF5IG9mIDQgb3IgNiBudW1iZXJzIik7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighbWUodCkpdGhyb3cgbmV3IEVycm9yKCJiYm94IG11c3Qgb25seSBjb250YWluIG51bWJlcnMiKX0pKX1mdW5jdGlvbiB4ZSh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImlkIGlzIHJlcXVpcmVkIik7aWYoLTE9PT1bInN0cmluZyIsIm51bWJlciJdLmluZGV4T2YodHlwZW9mIHQpKXRocm93IG5ldyBFcnJvcigiaWQgbXVzdCBiZSBhIG51bWJlciBvciBhIHN0cmluZyIpfWZ1bmN0aW9uIHdlKHQsZSxuKXtpZihudWxsIT09dClmb3IodmFyIHIsaSxvLHMsYSx1LGMsbCxoPTAsZj0wLHA9dC50eXBlLGQ9IkZlYXR1cmVDb2xsZWN0aW9uIj09PXAsZz0iRmVhdHVyZSI9PT1wLHk9ZD90LmZlYXR1cmVzLmxlbmd0aDoxLG09MDttPHk7bSsrKXthPShsPSEhKGM9ZD90LmZlYXR1cmVzW21dLmdlb21ldHJ5Omc/dC5nZW9tZXRyeTp0KSYmIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT1jLnR5cGUpP2MuZ2VvbWV0cmllcy5sZW5ndGg6MTtmb3IodmFyIHY9MDt2PGE7disrKXt2YXIgXz0wLHg9MDtpZihudWxsIT09KHM9bD9jLmdlb21ldHJpZXNbdl06Yykpe3U9cy5jb29yZGluYXRlczt2YXIgdz1zLnR5cGU7c3dpdGNoKGg9IW58fCJQb2x5Z29uIiE9PXcmJiJNdWx0aVBvbHlnb24iIT09dz8wOjEsdyl7Y2FzZSBudWxsOmJyZWFrO2Nhc2UiUG9pbnQiOmUodSxmLG0sXyx4KSxmKyssXysrO2JyZWFrO2Nhc2UiTGluZVN0cmluZyI6Y2FzZSJNdWx0aVBvaW50Ijpmb3Iocj0wO3I8dS5sZW5ndGg7cisrKWUodVtyXSxmLG0sXyx4KSxmKyssIk11bHRpUG9pbnQiPT09dyYmXysrOyJMaW5lU3RyaW5nIj09PXcmJl8rKzticmVhaztjYXNlIlBvbHlnb24iOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpmb3Iocj0wO3I8dS5sZW5ndGg7cisrKXtmb3IoaT0wO2k8dVtyXS5sZW5ndGgtaDtpKyspZSh1W3JdW2ldLGYsbSxfLHgpLGYrKzsiTXVsdGlMaW5lU3RyaW5nIj09PXcmJl8rKywiUG9seWdvbiI9PT13JiZ4Kyt9IlBvbHlnb24iPT09dyYmXysrO2JyZWFrO2Nhc2UiTXVsdGlQb2x5Z29uIjpmb3Iocj0wO3I8dS5sZW5ndGg7cisrKXtmb3IoIk11bHRpUG9seWdvbiI9PT13JiYoeD0wKSxpPTA7aTx1W3JdLmxlbmd0aDtpKyspe2ZvcihvPTA7bzx1W3JdW2ldLmxlbmd0aC1oO28rKyllKHVbcl1baV1bb10sZixtLF8seCksZisrO3grK31fKyt9YnJlYWs7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOmZvcihyPTA7cjxzLmdlb21ldHJpZXMubGVuZ3RoO3IrKyl3ZShzLmdlb21ldHJpZXNbcl0sZSxuKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBHZW9tZXRyeSBUeXBlIil9fX19fWZ1bmN0aW9uIGJlKHQsZSxuLHIpe3ZhciBpPW47cmV0dXJuIHdlKHQsKGZ1bmN0aW9uKHQscixvLHMsYSl7aT0wPT09ciYmdm9pZCAwPT09bj90OmUoaSx0LHIsbyxzLGEpfSksciksaX1mdW5jdGlvbiBEZSh0LGUpe3ZhciBuO3N3aXRjaCh0LnR5cGUpe2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOmZvcihuPTA7bjx0LmZlYXR1cmVzLmxlbmd0aDtuKyspZSh0LmZlYXR1cmVzW25dLnByb3BlcnRpZXMsbik7YnJlYWs7Y2FzZSJGZWF0dXJlIjplKHQucHJvcGVydGllcywwKX19ZnVuY3Rpb24gRWUodCxlKXtpZigiRmVhdHVyZSI9PT10LnR5cGUpZSh0LDApO2Vsc2UgaWYoIkZlYXR1cmVDb2xsZWN0aW9uIj09PXQudHlwZSlmb3IodmFyIG49MDtuPHQuZmVhdHVyZXMubGVuZ3RoO24rKyllKHQuZmVhdHVyZXNbbl0sbil9ZnVuY3Rpb24gQ2UodCxlKXt2YXIgbixyLGksbyxzLGEsdSxjLGwsaCxmPTAscD0iRmVhdHVyZUNvbGxlY3Rpb24iPT09dC50eXBlLGQ9IkZlYXR1cmUiPT09dC50eXBlLGc9cD90LmZlYXR1cmVzLmxlbmd0aDoxO2ZvcihuPTA7bjxnO24rKyl7Zm9yKGE9cD90LmZlYXR1cmVzW25dLmdlb21ldHJ5OmQ/dC5nZW9tZXRyeTp0LGM9cD90LmZlYXR1cmVzW25dLnByb3BlcnRpZXM6ZD90LnByb3BlcnRpZXM6e30sbD1wP3QuZmVhdHVyZXNbbl0uYmJveDpkP3QuYmJveDp2b2lkIDAsaD1wP3QuZmVhdHVyZXNbbl0uaWQ6ZD90LmlkOnZvaWQgMCxzPSh1PSEhYSYmIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT1hLnR5cGUpP2EuZ2VvbWV0cmllcy5sZW5ndGg6MSxpPTA7aTxzO2krKylpZihudWxsIT09KG89dT9hLmdlb21ldHJpZXNbaV06YSkpc3dpdGNoKG8udHlwZSl7Y2FzZSJQb2ludCI6Y2FzZSJMaW5lU3RyaW5nIjpjYXNlIk11bHRpUG9pbnQiOmNhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aUxpbmVTdHJpbmciOmNhc2UiTXVsdGlQb2x5Z29uIjplKG8sZixjLGwsaCk7YnJlYWs7Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOmZvcihyPTA7cjxvLmdlb21ldHJpZXMubGVuZ3RoO3IrKyllKG8uZ2VvbWV0cmllc1tyXSxmLGMsbCxoKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBHZW9tZXRyeSBUeXBlIil9ZWxzZSBlKG51bGwsZixjLGwsaCk7ZisrfX1mdW5jdGlvbiBTZSh0LGUpe0NlKHQsKGZ1bmN0aW9uKHQsbixyLGksbyl7dmFyIHMsYT1udWxsPT09dD9udWxsOnQudHlwZTtzd2l0Y2goYSl7Y2FzZSBudWxsOmNhc2UiUG9pbnQiOmNhc2UiTGluZVN0cmluZyI6Y2FzZSJQb2x5Z29uIjpyZXR1cm4gdm9pZCBlKHNlKHQscix7YmJveDppLGlkOm99KSxuLDApfXN3aXRjaChhKXtjYXNlIk11bHRpUG9pbnQiOnM9IlBvaW50IjticmVhaztjYXNlIk11bHRpTGluZVN0cmluZyI6cz0iTGluZVN0cmluZyI7YnJlYWs7Y2FzZSJNdWx0aVBvbHlnb24iOnM9IlBvbHlnb24ifXQuY29vcmRpbmF0ZXMuZm9yRWFjaCgoZnVuY3Rpb24odCxpKXtlKHNlKHt0eXBlOnMsY29vcmRpbmF0ZXM6dH0sciksbixpKX0pKX0pKX1mdW5jdGlvbiBBZSh0LGUpe1NlKHQsKGZ1bmN0aW9uKHQsbixyKXt2YXIgaT0wO2lmKHQuZ2VvbWV0cnkpe3ZhciBvPXQuZ2VvbWV0cnkudHlwZTsiUG9pbnQiPT09b3x8Ik11bHRpUG9pbnQiPT09b3x8YmUodCwoZnVuY3Rpb24obyxzLGEsdSxjLGwpe3ZhciBoPWNlKFtvLHNdLHQucHJvcGVydGllcyk7cmV0dXJuIGUoaCxuLHIsbCxpKSxpKyssc30pKX19KSl9ZnVuY3Rpb24gTmUodCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtTZSh0LChmdW5jdGlvbih0LG4scil7aWYobnVsbCE9PXQuZ2VvbWV0cnkpe3ZhciBpPXQuZ2VvbWV0cnkudHlwZSxvPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7c3dpdGNoKGkpe2Nhc2UiTGluZVN0cmluZyI6ZSh0LG4sciwwLDApO2JyZWFrO2Nhc2UiUG9seWdvbiI6Zm9yKHZhciBzPTA7czxvLmxlbmd0aDtzKyspZShjZShvW3NdLHQucHJvcGVydGllcyksbixyLHMpfX19KSl9ZnVuY3Rpb24gSWUodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJvYmogaXMgcmVxdWlyZWQiKTt2YXIgZT1NZSh0KTtpZihlLmxlbmd0aD4xJiZtZShlWzBdKSYmbWUoZVsxXSkpcmV0dXJuIGU7dGhyb3cgbmV3IEVycm9yKCJDb29yZGluYXRlIGlzIG5vdCBhIHZhbGlkIFBvaW50Iil9ZnVuY3Rpb24gTWUodCl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJvYmogaXMgcmVxdWlyZWQiKTt2YXIgZTtpZih0Lmxlbmd0aD9lPXQ6dC5jb29yZGluYXRlcz9lPXQuY29vcmRpbmF0ZXM6dC5nZW9tZXRyeSYmdC5nZW9tZXRyeS5jb29yZGluYXRlcyYmKGU9dC5nZW9tZXRyeS5jb29yZGluYXRlcyksZSlyZXR1cm4gRmUoZSksZTt0aHJvdyBuZXcgRXJyb3IoIk5vIHZhbGlkIGNvb3JkaW5hdGVzIil9ZnVuY3Rpb24gRmUodCl7aWYodC5sZW5ndGg+MSYmbWUodFswXSkmJm1lKHRbMV0pKXJldHVybiEwO2lmKEFycmF5LmlzQXJyYXkodFswXSkmJnRbMF0ubGVuZ3RoKXJldHVybiBGZSh0WzBdKTt0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3Qgb25seSBjb250YWluIG51bWJlcnMiKX1PYmplY3QuZnJlZXplKHtlYXJ0aFJhZGl1czpuZSxmYWN0b3JzOnJlLHVuaXRzRmFjdG9yczppZSxhcmVhRmFjdG9yczpvZSxmZWF0dXJlOnNlLGdlb21ldHJ5OmZ1bmN0aW9uKHQsZSxuKXtpZighdmUobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcixpPW4uYmJveDtpZighdCl0aHJvdyBuZXcgRXJyb3IoInR5cGUgaXMgcmVxdWlyZWQiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Iik7c3dpdGNoKGkmJl9lKGkpLHQpe2Nhc2UiUG9pbnQiOnI9YWUoZSkuZ2VvbWV0cnk7YnJlYWs7Y2FzZSJMaW5lU3RyaW5nIjpyPWNlKGUpLmdlb21ldHJ5O2JyZWFrO2Nhc2UiUG9seWdvbiI6cj11ZShlKS5nZW9tZXRyeTticmVhaztjYXNlIk11bHRpUG9pbnQiOnI9ZmUoZSkuZ2VvbWV0cnk7YnJlYWs7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnI9aGUoZSkuZ2VvbWV0cnk7YnJlYWs7Y2FzZSJNdWx0aVBvbHlnb24iOnI9cGUoZSkuZ2VvbWV0cnk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IodCsiIGlzIGludmFsaWQiKX1yZXR1cm4gaSYmKHIuYmJveD1pKSxyfSxwb2ludDphZSxwb2ludHM6ZnVuY3Rpb24odCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIG11c3QgYmUgYW4gQXJyYXkiKTtyZXR1cm4gbGUodC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBhZSh0LGUpfSkpLG4pfSxwb2x5Z29uOnVlLHBvbHlnb25zOmZ1bmN0aW9uKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImNvb3JkaW5hdGVzIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBtdXN0IGJlIGFuIEFycmF5Iik7cmV0dXJuIGxlKHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdWUodCxlKX0pKSxuKX0sbGluZVN0cmluZzpjZSxsaW5lU3RyaW5nczpmdW5jdGlvbih0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJjb29yZGluYXRlcyBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheSIpO3JldHVybiBsZSh0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGNlKHQsZSl9KSksbil9LGZlYXR1cmVDb2xsZWN0aW9uOmxlLG11bHRpTGluZVN0cmluZzpoZSxtdWx0aVBvaW50OmZlLG11bHRpUG9seWdvbjpwZSxnZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiZ2VvbWV0cmllcyBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiZ2VvbWV0cmllcyBtdXN0IGJlIGFuIEFycmF5Iik7cmV0dXJuIHNlKHt0eXBlOiJHZW9tZXRyeUNvbGxlY3Rpb24iLGdlb21ldHJpZXM6dH0sZSxuKX0scm91bmQ6ZnVuY3Rpb24odCxlKXtpZihudWxsPT10fHxpc05hTih0KSl0aHJvdyBuZXcgRXJyb3IoIm51bSBpcyByZXF1aXJlZCIpO2lmKGUmJiEoZT49MCkpdGhyb3cgbmV3IEVycm9yKCJwcmVjaXNpb24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIpO3ZhciBuPU1hdGgucG93KDEwLGV8fDApO3JldHVybiBNYXRoLnJvdW5kKHQqbikvbn0scmFkaWFuc1RvTGVuZ3RoOmRlLGxlbmd0aFRvUmFkaWFuczpnZSxsZW5ndGhUb0RlZ3JlZXM6ZnVuY3Rpb24odCxlKXtyZXR1cm4geWUoZ2UodCxlKSl9LGJlYXJpbmdUb0F6aW11dGg6ZnVuY3Rpb24odCl7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoImJlYXJpbmcgaXMgcmVxdWlyZWQiKTt2YXIgZT10JTM2MDtyZXR1cm4gZTwwJiYoZSs9MzYwKSxlfSxyYWRpYW5zVG9EZWdyZWVzOnllLGRlZ3JlZXNUb1JhZGlhbnM6ZnVuY3Rpb24odCl7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoImRlZ3JlZXMgaXMgcmVxdWlyZWQiKTtyZXR1cm4gdCUzNjAqTWF0aC5QSS8xODB9LGNvbnZlcnRMZW5ndGg6ZnVuY3Rpb24odCxlLG4pe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJsZW5ndGggaXMgcmVxdWlyZWQiKTtpZighKHQ+PTApKXRocm93IG5ldyBFcnJvcigibGVuZ3RoIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTtyZXR1cm4gZGUoZ2UodCxlKSxufHwia2lsb21ldGVycyIpfSxjb252ZXJ0QXJlYTpmdW5jdGlvbih0LGUsbil7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoImFyZWEgaXMgcmVxdWlyZWQiKTtpZighKHQ+PTApKXRocm93IG5ldyBFcnJvcigiYXJlYSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7dmFyIHI9b2VbZXx8Im1ldGVycyJdO2lmKCFyKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBvcmlnaW5hbCB1bml0cyIpO3ZhciBpPW9lW258fCJraWxvbWV0ZXJzIl07aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZpbmFsIHVuaXRzIik7cmV0dXJuIHQvcippfSxpc051bWJlcjptZSxpc09iamVjdDp2ZSx2YWxpZGF0ZUJCb3g6X2UsdmFsaWRhdGVJZDp4ZSxyYWRpYW5zMmRlZ3JlZXM6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZCBoYXMgYmVlbiByZW5hbWVkIHRvIGByYWRpYW5zVG9EZWdyZWVzYCIpfSxkZWdyZWVzMnJhZGlhbnM6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZCBoYXMgYmVlbiByZW5hbWVkIHRvIGBkZWdyZWVzVG9SYWRpYW5zYCIpfSxkaXN0YW5jZVRvRGVncmVlczpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigibWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gYGxlbmd0aFRvRGVncmVlc2AiKX0sZGlzdGFuY2VUb1JhZGlhbnM6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIm1ldGhvZCBoYXMgYmVlbiByZW5hbWVkIHRvIGBsZW5ndGhUb1JhZGlhbnNgIil9LHJhZGlhbnNUb0Rpc3RhbmNlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJtZXRob2QgaGFzIGJlZW4gcmVuYW1lZCB0byBgcmFkaWFuc1RvTGVuZ3RoYCIpfSxiZWFyaW5nVG9BbmdsZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigibWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gYGJlYXJpbmdUb0F6aW11dGhgIil9LGNvbnZlcnREaXN0YW5jZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigibWV0aG9kIGhhcyBiZWVuIHJlbmFtZWQgdG8gYGNvbnZlcnRMZW5ndGhgIil9fSksT2JqZWN0LmZyZWV6ZSh7Y29vcmRFYWNoOndlLGNvb3JkUmVkdWNlOmJlLHByb3BFYWNoOkRlLHByb3BSZWR1Y2U6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIERlKHQsKGZ1bmN0aW9uKHQsaSl7cj0wPT09aSYmdm9pZCAwPT09bj90OmUocix0LGkpfSkpLHJ9LGZlYXR1cmVFYWNoOkVlLGZlYXR1cmVSZWR1Y2U6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIEVlKHQsKGZ1bmN0aW9uKHQsaSl7cj0wPT09aSYmdm9pZCAwPT09bj90OmUocix0LGkpfSkpLHJ9LGNvb3JkQWxsOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB3ZSh0LChmdW5jdGlvbih0KXtlLnB1c2godCl9KSksZX0sZ2VvbUVhY2g6Q2UsZ2VvbVJlZHVjZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bjtyZXR1cm4gQ2UodCwoZnVuY3Rpb24odCxpLG8scyxhKXtyPTA9PT1pJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSxvLHMsYSl9KSkscn0sZmxhdHRlbkVhY2g6U2UsZmxhdHRlblJlZHVjZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bjtyZXR1cm4gU2UodCwoZnVuY3Rpb24odCxpLG8pe3I9MD09PWkmJjA9PT1vJiZ2b2lkIDA9PT1uP3Q6ZShyLHQsaSxvKX0pKSxyfSxzZWdtZW50RWFjaDpBZSxzZWdtZW50UmVkdWNlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uLGk9ITE7cmV0dXJuIEFlKHQsKGZ1bmN0aW9uKHQsbyxzLGEsdSl7cj0hMT09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxvLHMsYSx1KSxpPSEwfSkpLHJ9LGxpbmVFYWNoOk5lLGxpbmVSZWR1Y2U6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW47cmV0dXJuIE5lKHQsKGZ1bmN0aW9uKHQsaSxvLHMpe3I9MD09PWkmJnZvaWQgMD09PW4/dDplKHIsdCxpLG8scyl9KSkscn19KSxPYmplY3QuZnJlZXplKHtnZXRDb29yZDpJZSxnZXRDb29yZHM6TWUsY29udGFpbnNOdW1iZXI6RmUsZ2VvanNvblR5cGU6ZnVuY3Rpb24odCxlLG4pe2lmKCFlfHwhbil0aHJvdyBuZXcgRXJyb3IoInR5cGUgYW5kIG5hbWUgcmVxdWlyZWQiKTtpZighdHx8dC50eXBlIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyI6IG11c3QgYmUgYSAiK2UrIiwgZ2l2ZW4gIit0LnR5cGUpfSxmZWF0dXJlT2Y6ZnVuY3Rpb24odCxlLG4pe2lmKCF0KXRocm93IG5ldyBFcnJvcigiTm8gZmVhdHVyZSBwYXNzZWQiKTtpZighbil0aHJvdyBuZXcgRXJyb3IoIi5mZWF0dXJlT2YoKSByZXF1aXJlcyBhIG5hbWUiKTtpZighdHx8IkZlYXR1cmUiIT09dC50eXBlfHwhdC5nZW9tZXRyeSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyIsIEZlYXR1cmUgd2l0aCBnZW9tZXRyeSByZXF1aXJlZCIpO2lmKCF0Lmdlb21ldHJ5fHx0Lmdlb21ldHJ5LnR5cGUhPT1lKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnB1dCB0byAiK24rIjogbXVzdCBiZSBhICIrZSsiLCBnaXZlbiAiK3QuZ2VvbWV0cnkudHlwZSl9LGNvbGxlY3Rpb25PZjpmdW5jdGlvbih0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJObyBmZWF0dXJlQ29sbGVjdGlvbiBwYXNzZWQiKTtpZighbil0aHJvdyBuZXcgRXJyb3IoIi5jb2xsZWN0aW9uT2YoKSByZXF1aXJlcyBhIG5hbWUiKTtpZighdHx8IkZlYXR1cmVDb2xsZWN0aW9uIiE9PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyIsIEZlYXR1cmVDb2xsZWN0aW9uIHJlcXVpcmVkIik7Zm9yKHZhciByPTA7cjx0LmZlYXR1cmVzLmxlbmd0aDtyKyspe3ZhciBpPXQuZmVhdHVyZXNbcl07aWYoIWl8fCJGZWF0dXJlIiE9PWkudHlwZXx8IWkuZ2VvbWV0cnkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvICIrbisiLCBGZWF0dXJlIHdpdGggZ2VvbWV0cnkgcmVxdWlyZWQiKTtpZighaS5nZW9tZXRyeXx8aS5nZW9tZXRyeS50eXBlIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gIituKyI6IG11c3QgYmUgYSAiK2UrIiwgZ2l2ZW4gIitpLmdlb21ldHJ5LnR5cGUpfX0sZ2V0R2VvbTpmdW5jdGlvbih0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtpZih2b2lkIDAhPT10Lmdlb21ldHJ5KXJldHVybiB0Lmdlb21ldHJ5O2lmKHQuY29vcmRpbmF0ZXN8fHQuZ2VvbWV0cmllcylyZXR1cm4gdDt0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gbXVzdCBiZSBhIHZhbGlkIEZlYXR1cmUgb3IgR2VvbWV0cnkgT2JqZWN0Iil9LGdldEdlb21UeXBlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJpbnZhcmlhbnQuZ2V0R2VvbVR5cGUgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiB2NS4wIGluIGZhdm9yIG9mIGludmFyaWFudC5nZXRUeXBlIil9LGdldFR5cGU6ZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoKGV8fCJnZW9qc29uIikrIiBpcyByZXF1aXJlZCIpO2lmKHQuZ2VvbWV0cnkmJnQuZ2VvbWV0cnkudHlwZSlyZXR1cm4gdC5nZW9tZXRyeS50eXBlO2lmKHQudHlwZSlyZXR1cm4gdC50eXBlO3Rocm93IG5ldyBFcnJvcigoZXx8Imdlb2pzb24iKSsiIGlzIGludmFsaWQiKX19KTt2YXIgVGU9ZnVuY3Rpb24gdChlLG4scixpLG8pe2ZvcihyPXJ8fDAsaT1pfHxlLmxlbmd0aC0xLG89b3x8TGU7aT5yOyl7aWYoaS1yPjYwMCl7dmFyIHM9aS1yKzEsYT1uLXIrMSx1PU1hdGgubG9nKHMpLGM9LjUqTWF0aC5leHAoMip1LzMpLGw9LjUqTWF0aC5zcXJ0KHUqYyoocy1jKS9zKSooYS1zLzI8MD8tMToxKSxoPU1hdGgubWF4KHIsTWF0aC5mbG9vcihuLWEqYy9zK2wpKSxmPU1hdGgubWluKGksTWF0aC5mbG9vcihuKyhzLWEpKmMvcytsKSk7dChlLG4saCxmLG8pfXZhciBwPWVbbl0sZD1yLGc9aTtmb3IoT2UoZSxyLG4pLG8oZVtpXSxwKT4wJiZPZShlLHIsaSk7ZDxnOyl7Zm9yKE9lKGUsZCxnKSxkKyssZy0tO28oZVtkXSxwKTwwOylkKys7Zm9yKDtvKGVbZ10scCk+MDspZy0tfTA9PT1vKGVbcl0scCk/T2UoZSxyLGcpOk9lKGUsKytnLGkpLGc8PW4mJihyPWcrMSksbjw9ZyYmKGk9Zy0xKX19O2Z1bmN0aW9uIE9lKHQsZSxuKXt2YXIgcj10W2VdO3RbZV09dFtuXSx0W25dPXJ9ZnVuY3Rpb24gTGUodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9dmFyIFBlPVJlO2Z1bmN0aW9uIFJlKHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgUmUpKXJldHVybiBuZXcgUmUodCxlKTt0aGlzLl9tYXhFbnRyaWVzPU1hdGgubWF4KDQsdHx8OSksdGhpcy5fbWluRW50cmllcz1NYXRoLm1heCgyLE1hdGguY2VpbCguNCp0aGlzLl9tYXhFbnRyaWVzKSksZSYmdGhpcy5faW5pdEZvcm1hdChlKSx0aGlzLmNsZWFyKCl9ZnVuY3Rpb24gQmUodCxlLG4pe2lmKCFuKXJldHVybiBlLmluZGV4T2YodCk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspaWYobih0LGVbcl0pKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIGtlKHQsZSl7emUodCwwLHQuY2hpbGRyZW4ubGVuZ3RoLGUsdCl9ZnVuY3Rpb24gemUodCxlLG4scixpKXtpfHwoaT1aZShudWxsKSksaS5taW5YPTEvMCxpLm1pblk9MS8wLGkubWF4WD0tMS8wLGkubWF4WT0tMS8wO2Zvcih2YXIgbyxzPWU7czxuO3MrKylvPXQuY2hpbGRyZW5bc10samUoaSx0LmxlYWY/cihvKTpvKTtyZXR1cm4gaX1mdW5jdGlvbiBqZSh0LGUpe3JldHVybiB0Lm1pblg9TWF0aC5taW4odC5taW5YLGUubWluWCksdC5taW5ZPU1hdGgubWluKHQubWluWSxlLm1pblkpLHQubWF4WD1NYXRoLm1heCh0Lm1heFgsZS5tYXhYKSx0Lm1heFk9TWF0aC5tYXgodC5tYXhZLGUubWF4WSksdH1mdW5jdGlvbiBVZSh0LGUpe3JldHVybiB0Lm1pblgtZS5taW5YfWZ1bmN0aW9uIHFlKHQsZSl7cmV0dXJuIHQubWluWS1lLm1pbll9ZnVuY3Rpb24gVmUodCl7cmV0dXJuKHQubWF4WC10Lm1pblgpKih0Lm1heFktdC5taW5ZKX1mdW5jdGlvbiBHZSh0KXtyZXR1cm4gdC5tYXhYLXQubWluWCsodC5tYXhZLXQubWluWSl9ZnVuY3Rpb24gWWUodCxlKXtyZXR1cm4oTWF0aC5tYXgoZS5tYXhYLHQubWF4WCktTWF0aC5taW4oZS5taW5YLHQubWluWCkpKihNYXRoLm1heChlLm1heFksdC5tYXhZKS1NYXRoLm1pbihlLm1pblksdC5taW5ZKSl9ZnVuY3Rpb24gWGUodCxlKXt2YXIgbj1NYXRoLm1heCh0Lm1pblgsZS5taW5YKSxyPU1hdGgubWF4KHQubWluWSxlLm1pblkpLGk9TWF0aC5taW4odC5tYXhYLGUubWF4WCksbz1NYXRoLm1pbih0Lm1heFksZS5tYXhZKTtyZXR1cm4gTWF0aC5tYXgoMCxpLW4pKk1hdGgubWF4KDAsby1yKX1mdW5jdGlvbiBXZSh0LGUpe3JldHVybiB0Lm1pblg8PWUubWluWCYmdC5taW5ZPD1lLm1pblkmJmUubWF4WDw9dC5tYXhYJiZlLm1heFk8PXQubWF4WX1mdW5jdGlvbiBIZSh0LGUpe3JldHVybiBlLm1pblg8PXQubWF4WCYmZS5taW5ZPD10Lm1heFkmJmUubWF4WD49dC5taW5YJiZlLm1heFk+PXQubWluWX1mdW5jdGlvbiBaZSh0KXtyZXR1cm57Y2hpbGRyZW46dCxoZWlnaHQ6MSxsZWFmOiEwLG1pblg6MS8wLG1pblk6MS8wLG1heFg6LTEvMCxtYXhZOi0xLzB9fWZ1bmN0aW9uIEtlKHQsZSxuLHIsaSl7Zm9yKHZhciBvLHM9W2Usbl07cy5sZW5ndGg7KSEoKG49cy5wb3AoKSktKGU9cy5wb3AoKSk8PXIpJiYobz1lK01hdGguY2VpbCgobi1lKS9yLzIpKnIsVGUodCxvLGUsbixpKSxzLnB1c2goZSxvLG8sbikpfWZ1bmN0aW9uIEplKHQsZSl7cmV0dXJuIHQoZT17ZXhwb3J0czp7fX0sZS5leHBvcnRzKSxlLmV4cG9ydHN9UmUucHJvdG90eXBlPXthbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWxsKHRoaXMuZGF0YSxbXSl9LHNlYXJjaDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmRhdGEsbj1bXSxyPXRoaXMudG9CQm94O2lmKCFIZSh0LGUpKXJldHVybiBuO2Zvcih2YXIgaSxvLHMsYSx1PVtdO2U7KXtmb3IoaT0wLG89ZS5jaGlsZHJlbi5sZW5ndGg7aTxvO2krKylzPWUuY2hpbGRyZW5baV0sSGUodCxhPWUubGVhZj9yKHMpOnMpJiYoZS5sZWFmP24ucHVzaChzKTpXZSh0LGEpP3RoaXMuX2FsbChzLG4pOnUucHVzaChzKSk7ZT11LnBvcCgpfXJldHVybiBufSxjb2xsaWRlczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmRhdGEsbj10aGlzLnRvQkJveDtpZighSGUodCxlKSlyZXR1cm4hMTtmb3IodmFyIHIsaSxvLHMsYT1bXTtlOyl7Zm9yKHI9MCxpPWUuY2hpbGRyZW4ubGVuZ3RoO3I8aTtyKyspaWYobz1lLmNoaWxkcmVuW3JdLEhlKHQscz1lLmxlYWY/bihvKTpvKSl7aWYoZS5sZWFmfHxXZSh0LHMpKXJldHVybiEwO2EucHVzaChvKX1lPWEucG9wKCl9cmV0dXJuITF9LGxvYWQ6ZnVuY3Rpb24odCl7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4gdGhpcztpZih0Lmxlbmd0aDx0aGlzLl9taW5FbnRyaWVzKXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5pbnNlcnQodFtlXSk7cmV0dXJuIHRoaXN9dmFyIHI9dGhpcy5fYnVpbGQodC5zbGljZSgpLDAsdC5sZW5ndGgtMSwwKTtpZih0aGlzLmRhdGEuY2hpbGRyZW4ubGVuZ3RoKWlmKHRoaXMuZGF0YS5oZWlnaHQ9PT1yLmhlaWdodCl0aGlzLl9zcGxpdFJvb3QodGhpcy5kYXRhLHIpO2Vsc2V7aWYodGhpcy5kYXRhLmhlaWdodDxyLmhlaWdodCl7dmFyIGk9dGhpcy5kYXRhO3RoaXMuZGF0YT1yLHI9aX10aGlzLl9pbnNlcnQocix0aGlzLmRhdGEuaGVpZ2h0LXIuaGVpZ2h0LTEsITApfWVsc2UgdGhpcy5kYXRhPXI7cmV0dXJuIHRoaXN9LGluc2VydDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdGhpcy5faW5zZXJ0KHQsdGhpcy5kYXRhLmhlaWdodC0xKSx0aGlzfSxjbGVhcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGE9WmUoW10pLHRoaXN9LHJlbW92ZTpmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0aGlzO2Zvcih2YXIgbixyLGksbyxzPXRoaXMuZGF0YSxhPXRoaXMudG9CQm94KHQpLHU9W10sYz1bXTtzfHx1Lmxlbmd0aDspe2lmKHN8fChzPXUucG9wKCkscj11W3UubGVuZ3RoLTFdLG49Yy5wb3AoKSxvPSEwKSxzLmxlYWYmJi0xIT09KGk9QmUodCxzLmNoaWxkcmVuLGUpKSlyZXR1cm4gcy5jaGlsZHJlbi5zcGxpY2UoaSwxKSx1LnB1c2gocyksdGhpcy5fY29uZGVuc2UodSksdGhpcztvfHxzLmxlYWZ8fCFXZShzLGEpP3I/KG4rKyxzPXIuY2hpbGRyZW5bbl0sbz0hMSk6cz1udWxsOih1LnB1c2gocyksYy5wdXNoKG4pLG49MCxyPXMscz1zLmNoaWxkcmVuWzBdKX1yZXR1cm4gdGhpc30sdG9CQm94OmZ1bmN0aW9uKHQpe3JldHVybiB0fSxjb21wYXJlTWluWDpVZSxjb21wYXJlTWluWTpxZSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfSxmcm9tSlNPTjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kYXRhPXQsdGhpc30sX2FsbDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXTt0Oyl0LmxlYWY/ZS5wdXNoLmFwcGx5KGUsdC5jaGlsZHJlbik6bi5wdXNoLmFwcGx5KG4sdC5jaGlsZHJlbiksdD1uLnBvcCgpO3JldHVybiBlfSxfYnVpbGQ6ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbz1uLWUrMSxzPXRoaXMuX21heEVudHJpZXM7aWYobzw9cylyZXR1cm4ga2UoaT1aZSh0LnNsaWNlKGUsbisxKSksdGhpcy50b0JCb3gpLGk7cnx8KHI9TWF0aC5jZWlsKE1hdGgubG9nKG8pL01hdGgubG9nKHMpKSxzPU1hdGguY2VpbChvL01hdGgucG93KHMsci0xKSkpLChpPVplKFtdKSkubGVhZj0hMSxpLmhlaWdodD1yO3ZhciBhLHUsYyxsLGg9TWF0aC5jZWlsKG8vcyksZj1oKk1hdGguY2VpbChNYXRoLnNxcnQocykpO2ZvcihLZSh0LGUsbixmLHRoaXMuY29tcGFyZU1pblgpLGE9ZTthPD1uO2ErPWYpZm9yKEtlKHQsYSxjPU1hdGgubWluKGErZi0xLG4pLGgsdGhpcy5jb21wYXJlTWluWSksdT1hO3U8PWM7dSs9aClsPU1hdGgubWluKHUraC0xLGMpLGkuY2hpbGRyZW4ucHVzaCh0aGlzLl9idWlsZCh0LHUsbCxyLTEpKTtyZXR1cm4ga2UoaSx0aGlzLnRvQkJveCksaX0sX2Nob29zZVN1YnRyZWU6ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpLG8scyxhLHUsYyxsLGg7ci5wdXNoKGUpLCFlLmxlYWYmJnIubGVuZ3RoLTEhPT1uOyl7Zm9yKGw9aD0xLzAsaT0wLG89ZS5jaGlsZHJlbi5sZW5ndGg7aTxvO2krKyl1PVZlKHM9ZS5jaGlsZHJlbltpXSksKGM9WWUodCxzKS11KTxoPyhoPWMsbD11PGw/dTpsLGE9cyk6Yz09PWgmJnU8bCYmKGw9dSxhPXMpO2U9YXx8ZS5jaGlsZHJlblswXX1yZXR1cm4gZX0sX2luc2VydDpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy50b0JCb3gsaT1uP3Q6cih0KSxvPVtdLHM9dGhpcy5fY2hvb3NlU3VidHJlZShpLHRoaXMuZGF0YSxlLG8pO2ZvcihzLmNoaWxkcmVuLnB1c2godCksamUocyxpKTtlPj0wJiZvW2VdLmNoaWxkcmVuLmxlbmd0aD50aGlzLl9tYXhFbnRyaWVzOyl0aGlzLl9zcGxpdChvLGUpLGUtLTt0aGlzLl9hZGp1c3RQYXJlbnRCQm94ZXMoaSxvLGUpfSxfc3BsaXQ6ZnVuY3Rpb24odCxlKXt2YXIgbj10W2VdLHI9bi5jaGlsZHJlbi5sZW5ndGgsaT10aGlzLl9taW5FbnRyaWVzO3RoaXMuX2Nob29zZVNwbGl0QXhpcyhuLGkscik7dmFyIG89dGhpcy5fY2hvb3NlU3BsaXRJbmRleChuLGkscikscz1aZShuLmNoaWxkcmVuLnNwbGljZShvLG4uY2hpbGRyZW4ubGVuZ3RoLW8pKTtzLmhlaWdodD1uLmhlaWdodCxzLmxlYWY9bi5sZWFmLGtlKG4sdGhpcy50b0JCb3gpLGtlKHMsdGhpcy50b0JCb3gpLGU/dFtlLTFdLmNoaWxkcmVuLnB1c2gocyk6dGhpcy5fc3BsaXRSb290KG4scyl9LF9zcGxpdFJvb3Q6ZnVuY3Rpb24odCxlKXt0aGlzLmRhdGE9WmUoW3QsZV0pLHRoaXMuZGF0YS5oZWlnaHQ9dC5oZWlnaHQrMSx0aGlzLmRhdGEubGVhZj0hMSxrZSh0aGlzLmRhdGEsdGhpcy50b0JCb3gpfSxfY2hvb3NlU3BsaXRJbmRleDpmdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvLHMsYSx1LGMsbDtmb3IodT1jPTEvMCxyPWU7cjw9bi1lO3IrKylzPVhlKGk9emUodCwwLHIsdGhpcy50b0JCb3gpLG89emUodCxyLG4sdGhpcy50b0JCb3gpKSxhPVZlKGkpK1ZlKG8pLHM8dT8odT1zLGw9cixjPWE8Yz9hOmMpOnM9PT11JiZhPGMmJihjPWEsbD1yKTtyZXR1cm4gbH0sX2Nob29zZVNwbGl0QXhpczpmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5sZWFmP3RoaXMuY29tcGFyZU1pblg6VWUsaT10LmxlYWY/dGhpcy5jb21wYXJlTWluWTpxZTt0aGlzLl9hbGxEaXN0TWFyZ2luKHQsZSxuLHIpPHRoaXMuX2FsbERpc3RNYXJnaW4odCxlLG4saSkmJnQuY2hpbGRyZW4uc29ydChyKX0sX2FsbERpc3RNYXJnaW46ZnVuY3Rpb24odCxlLG4scil7dC5jaGlsZHJlbi5zb3J0KHIpO3ZhciBpLG8scz10aGlzLnRvQkJveCxhPXplKHQsMCxlLHMpLHU9emUodCxuLWUsbixzKSxjPUdlKGEpK0dlKHUpO2ZvcihpPWU7aTxuLWU7aSsrKW89dC5jaGlsZHJlbltpXSxqZShhLHQubGVhZj9zKG8pOm8pLGMrPUdlKGEpO2ZvcihpPW4tZS0xO2k+PWU7aS0tKW89dC5jaGlsZHJlbltpXSxqZSh1LHQubGVhZj9zKG8pOm8pLGMrPUdlKHUpO3JldHVybiBjfSxfYWRqdXN0UGFyZW50QkJveGVzOmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bjtyPj0wO3ItLSlqZShlW3JdLHQpfSxfY29uZGVuc2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dC5sZW5ndGgtMTtuPj0wO24tLSkwPT09dFtuXS5jaGlsZHJlbi5sZW5ndGg/bj4wPyhlPXRbbi0xXS5jaGlsZHJlbikuc3BsaWNlKGUuaW5kZXhPZih0W25dKSwxKTp0aGlzLmNsZWFyKCk6a2UodFtuXSx0aGlzLnRvQkJveCl9LF9pbml0Rm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPVsicmV0dXJuIGEiLCIgLSBiIiwiOyJdO3RoaXMuY29tcGFyZU1pblg9bmV3IEZ1bmN0aW9uKCJhIiwiYiIsZS5qb2luKHRbMF0pKSx0aGlzLmNvbXBhcmVNaW5ZPW5ldyBGdW5jdGlvbigiYSIsImIiLGUuam9pbih0WzFdKSksdGhpcy50b0JCb3g9bmV3IEZ1bmN0aW9uKCJhIiwicmV0dXJuIHttaW5YOiBhIit0WzBdKyIsIG1pblk6IGEiK3RbMV0rIiwgbWF4WDogYSIrdFsyXSsiLCBtYXhZOiBhIit0WzNdKyJ9OyIpfX07dmFyIFFlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10KmUsaT0kZSp0LG89aS10LHM9aS1vLGE9dC1zLHU9JGUqZSxjPXUtKHUtZSksbD1lLWMsaD1hKmwtKHItcypjLWEqYy1zKmwpO3JldHVybiBuPyhuWzBdPWgsblsxXT1yLG4pOltoLHJdfSwkZT0rKE1hdGgucG93KDIsMjcpKzEpO3ZhciB0bj1mdW5jdGlvbih0LGUpe3ZhciBuPTB8dC5sZW5ndGgscj0wfGUubGVuZ3RoO2lmKDE9PT1uJiYxPT09cilyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj10K2Uscj1uLXQsaT1uLXIsbz1lLXIscz10LWksYT1zK287cmV0dXJuIGE/W2Esbl06W25dfSh0WzBdLGVbMF0pO3ZhciBpLG8scz1uZXcgQXJyYXkobityKSxhPTAsdT0wLGM9MCxsPU1hdGguYWJzLGg9dFt1XSxmPWwoaCkscD1lW2NdLGQ9bChwKTtmPGQ/KG89aCwodSs9MSk8biYmKGg9dFt1XSxmPWwoaCkpKToobz1wLChjKz0xKTxyJiYocD1lW2NdLGQ9bChwKSkpLHU8biYmZjxkfHxjPj1yPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0sZj1sKGgpKSk6KGk9cCwoYys9MSk8ciYmKHA9ZVtjXSxkPWwocCkpKTtmb3IodmFyIGcseSxtPWkrbyx2PW0taSxfPW8tdix4PV8sdz1tO3U8biYmYzxyOylmPGQ/KGk9aCwodSs9MSk8biYmKGg9dFt1XSxmPWwoaCkpKTooaT1wLChjKz0xKTxyJiYocD1lW2NdLGQ9bChwKSkpLChfPShvPXgpLSh2PShtPWkrbyktaSkpJiYoc1thKytdPV8pLHg9dy0oKGc9dyttKS0oeT1nLXcpKSsobS15KSx3PWc7Zm9yKDt1PG47KShfPShvPXgpLSh2PShtPShpPWgpK28pLWkpKSYmKHNbYSsrXT1fKSx4PXctKChnPXcrbSktKHk9Zy13KSkrKG0teSksdz1nLCh1Kz0xKTxuJiYoaD10W3VdKTtmb3IoO2M8cjspKF89KG89eCktKHY9KG09KGk9cCkrbyktaSkpJiYoc1thKytdPV8pLHg9dy0oKGc9dyttKS0oeT1nLXcpKSsobS15KSx3PWcsKGMrPTEpPHImJihwPWVbY10pO3JldHVybiB4JiYoc1thKytdPXgpLHcmJihzW2ErK109dyksYXx8KHNbYSsrXT0wKSxzLmxlbmd0aD1hLHN9O3ZhciBlbj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dCtlLGk9ci10LG89ZS1pLHM9dC0oci1pKTtyZXR1cm4gbj8oblswXT1zK28sblsxXT1yLG4pOltzK28scl19O3ZhciBubj1mdW5jdGlvbih0LGUpe3ZhciBuPXQubGVuZ3RoO2lmKDE9PT1uKXt2YXIgcj1RZSh0WzBdLGUpO3JldHVybiByWzBdP3I6W3JbMV1dfXZhciBpPW5ldyBBcnJheSgyKm4pLG89Wy4xLC4xXSxzPVsuMSwuMV0sYT0wO1FlKHRbMF0sZSxvKSxvWzBdJiYoaVthKytdPW9bMF0pO2Zvcih2YXIgdT0xO3U8bjsrK3Upe1FlKHRbdV0sZSxzKTt2YXIgYz1vWzFdO2VuKGMsc1swXSxvKSxvWzBdJiYoaVthKytdPW9bMF0pO3ZhciBsPXNbMV0saD1vWzFdLGY9bCtoLHA9aC0oZi1sKTtvWzFdPWYscCYmKGlbYSsrXT1wKX1yZXR1cm4gb1sxXSYmKGlbYSsrXT1vWzFdKSwwPT09YSYmKGlbYSsrXT0wKSxpLmxlbmd0aD1hLGl9O3ZhciBybj1mdW5jdGlvbih0LGUpe3ZhciBuPTB8dC5sZW5ndGgscj0wfGUubGVuZ3RoO2lmKDE9PT1uJiYxPT09cilyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj10K2Uscj1uLXQsaT1uLXIsbz1lLXIscz10LWksYT1zK287cmV0dXJuIGE/W2Esbl06W25dfSh0WzBdLC1lWzBdKTt2YXIgaSxvLHM9bmV3IEFycmF5KG4rciksYT0wLHU9MCxjPTAsbD1NYXRoLmFicyxoPXRbdV0sZj1sKGgpLHA9LWVbY10sZD1sKHApO2Y8ZD8obz1oLCh1Kz0xKTxuJiYoaD10W3VdLGY9bChoKSkpOihvPXAsKGMrPTEpPHImJihwPS1lW2NdLGQ9bChwKSkpLHU8biYmZjxkfHxjPj1yPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0sZj1sKGgpKSk6KGk9cCwoYys9MSk8ciYmKHA9LWVbY10sZD1sKHApKSk7Zm9yKHZhciBnLHksbT1pK28sdj1tLWksXz1vLXYseD1fLHc9bTt1PG4mJmM8cjspZjxkPyhpPWgsKHUrPTEpPG4mJihoPXRbdV0sZj1sKGgpKSk6KGk9cCwoYys9MSk8ciYmKHA9LWVbY10sZD1sKHApKSksKF89KG89eCktKHY9KG09aStvKS1pKSkmJihzW2ErK109XykseD13LSgoZz13K20pLSh5PWctdykpKyhtLXkpLHc9Zztmb3IoO3U8bjspKF89KG89eCktKHY9KG09KGk9aCkrbyktaSkpJiYoc1thKytdPV8pLHg9dy0oKGc9dyttKS0oeT1nLXcpKSsobS15KSx3PWcsKHUrPTEpPG4mJihoPXRbdV0pO2Zvcig7YzxyOykoXz0obz14KS0odj0obT0oaT1wKStvKS1pKSkmJihzW2ErK109XykseD13LSgoZz13K20pLSh5PWctdykpKyhtLXkpLHc9ZywoYys9MSk8ciYmKHA9LWVbY10pO3JldHVybiB4JiYoc1thKytdPXgpLHcmJihzW2ErK109dyksYXx8KHNbYSsrXT0wKSxzLmxlbmd0aD1hLHN9O3ZhciBvbj1KZSgoZnVuY3Rpb24odCl7dmFyIGU9MTExMDIyMzAyNDYyNTE1NjVlLTMyLG49KDMrMTYqZSkqZSxyPSg3KzU2KmUpKmU7ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgbj1uZXcgQXJyYXkodC5sZW5ndGgtMSkscj0xO3I8dC5sZW5ndGg7KytyKWZvcih2YXIgaT1uW3ItMV09bmV3IEFycmF5KHQubGVuZ3RoLTEpLG89MCxzPTA7bzx0Lmxlbmd0aDsrK28pbyE9PWUmJihpW3MrK109dFtyXVtvXSk7cmV0dXJuIG59ZnVuY3Rpb24gbyh0KXtyZXR1cm4gMSZ0PyItIjoiIn1mdW5jdGlvbiBzKHQpe2lmKDE9PT10Lmxlbmd0aClyZXR1cm4gdFswXTtpZigyPT09dC5sZW5ndGgpcmV0dXJuWyJzdW0oIix0WzBdLCIsIix0WzFdLCIpIl0uam9pbigiIik7dmFyIGU9dC5sZW5ndGg+PjE7cmV0dXJuWyJzdW0oIixzKHQuc2xpY2UoMCxlKSksIiwiLHModC5zbGljZShlKSksIikiXS5qb2luKCIiKX1mdW5jdGlvbiBhKHQpe2lmKDI9PT10Lmxlbmd0aClyZXR1cm5bWyJzdW0ocHJvZCgiLHRbMF1bMF0sIiwiLHRbMV1bMV0sIikscHJvZCgtIix0WzBdWzFdLCIsIix0WzFdWzBdLCIpKSJdLmpvaW4oIiIpXTtmb3IodmFyIGU9W10sbj0wO248dC5sZW5ndGg7KytuKWUucHVzaChbInNjYWxlKCIscyhhKGkodCxuKSkpLCIsIixvKG4pLHRbMF1bbl0sIikiXS5qb2luKCIiKSk7cmV0dXJuIGV9ZnVuY3Rpb24gdSh0KXtmb3IodmFyIGU9W10sbj1bXSxyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCksbj0wO248dDsrK24pe2Vbbl09bmV3IEFycmF5KHQpO2Zvcih2YXIgcj0wO3I8dDsrK3IpZVtuXVtyXT1bIm0iLHIsIlsiLHQtbi0xLCJdIl0uam9pbigiIil9cmV0dXJuIGV9KHQpLG89W10sdT0wO3U8dDsrK3UpMSZ1P24ucHVzaC5hcHBseShuLGEoaShyLHUpKSk6ZS5wdXNoLmFwcGx5KGUsYShpKHIsdSkpKSxvLnB1c2goIm0iK3UpO3ZhciBjPXMoZSksbD1zKG4pLGg9Im9yaWVudGF0aW9uIit0KyJFeGFjdCIsZj1bImZ1bmN0aW9uICIsaCwiKCIsby5qb2luKCksIil7dmFyIHA9IixjLCIsbj0iLGwsIixkPXN1YihwLG4pO3JldHVybiBkW2QubGVuZ3RoLTFdO307cmV0dXJuICIsaF0uam9pbigiIik7cmV0dXJuIG5ldyBGdW5jdGlvbigic3VtIiwicHJvZCIsInNjYWxlIiwic3ViIixmKSh0bixRZSxubixybil9dmFyIGM9dSgzKSxsPXUoNCksaD1bZnVuY3Rpb24oKXtyZXR1cm4gMH0sZnVuY3Rpb24oKXtyZXR1cm4gMH0sZnVuY3Rpb24odCxlKXtyZXR1cm4gZVswXS10WzBdfSxmdW5jdGlvbih0LGUscil7dmFyIGksbz0odFsxXS1yWzFdKSooZVswXS1yWzBdKSxzPSh0WzBdLXJbMF0pKihlWzFdLXJbMV0pLGE9by1zO2lmKG8+MCl7aWYoczw9MClyZXR1cm4gYTtpPW8rc31lbHNle2lmKCEobzwwKSlyZXR1cm4gYTtpZihzPj0wKXJldHVybiBhO2k9LShvK3MpfXZhciB1PW4qaTtyZXR1cm4gYT49dXx8YTw9LXU/YTpjKHQsZSxyKX0sZnVuY3Rpb24odCxlLG4saSl7dmFyIG89dFswXS1pWzBdLHM9ZVswXS1pWzBdLGE9blswXS1pWzBdLHU9dFsxXS1pWzFdLGM9ZVsxXS1pWzFdLGg9blsxXS1pWzFdLGY9dFsyXS1pWzJdLHA9ZVsyXS1pWzJdLGQ9blsyXS1pWzJdLGc9cypoLHk9YSpjLG09YSp1LHY9bypoLF89bypjLHg9cyp1LHc9ZiooZy15KStwKihtLXYpK2QqKF8teCksYj0oTWF0aC5hYnMoZykrTWF0aC5hYnMoeSkpKk1hdGguYWJzKGYpKyhNYXRoLmFicyhtKStNYXRoLmFicyh2KSkqTWF0aC5hYnMocCkrKE1hdGguYWJzKF8pK01hdGguYWJzKHgpKSpNYXRoLmFicyhkKSxEPXIqYjtyZXR1cm4gdz5EfHwtdz5EP3c6bCh0LGUsbixpKX1dO2Z1bmN0aW9uIGYodCl7dmFyIGU9aFt0Lmxlbmd0aF07cmV0dXJuIGV8fChlPWhbdC5sZW5ndGhdPXUodC5sZW5ndGgpKSxlLmFwcGx5KHZvaWQgMCx0KX0hZnVuY3Rpb24oKXtmb3IoO2gubGVuZ3RoPD01OyloLnB1c2godShoLmxlbmd0aCkpO2Zvcih2YXIgZT1bXSxuPVsic2xvdyJdLHI9MDtyPD01OysrcillLnB1c2goImEiK3IpLG4ucHVzaCgibyIrcik7dmFyIGk9WyJmdW5jdGlvbiBnZXRPcmllbnRhdGlvbigiLGUuam9pbigpLCIpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6Y2FzZSAxOnJldHVybiAwOyJdO2ZvcihyPTI7cjw9NTsrK3IpaS5wdXNoKCJjYXNlICIsciwiOnJldHVybiBvIixyLCIoIixlLnNsaWNlKDAscikuam9pbigpLCIpOyIpO2kucHVzaCgifXZhciBzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtmb3IodmFyIGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7KytpKXtzW2ldPWFyZ3VtZW50c1tpXX07cmV0dXJuIHNsb3cocyk7fXJldHVybiBnZXRPcmllbnRhdGlvbiIpLG4ucHVzaChpLmpvaW4oIiIpKTt2YXIgbz1GdW5jdGlvbi5hcHBseSh2b2lkIDAsbik7Zm9yKHQuZXhwb3J0cz1vLmFwcGx5KHZvaWQgMCxbZl0uY29uY2F0KGgpKSxyPTA7cjw9NTsrK3IpdC5leHBvcnRzW3JdPWhbcl19KCl9KSksc249ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7aWYoZTwzKXtmb3IodmFyIG49bmV3IEFycmF5KGUpLHI9MDtyPGU7KytyKW5bcl09cjtyZXR1cm4gMj09PWUmJnRbMF1bMF09PT10WzFdWzBdJiZ0WzBdWzFdPT09dFsxXVsxXT9bMF06bn12YXIgaT1uZXcgQXJyYXkoZSk7Zm9yKHI9MDtyPGU7KytyKWlbcl09cjtpLnNvcnQoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHRbZV1bMF0tdFtuXVswXXx8dFtlXVsxXS10W25dWzFdfSkpO3ZhciBvPVtpWzBdLGlbMV1dLHM9W2lbMF0saVsxXV07Zm9yKHI9MjtyPGU7KytyKXtmb3IodmFyIGE9aVtyXSx1PXRbYV0sYz1vLmxlbmd0aDtjPjEmJmFuKHRbb1tjLTJdXSx0W29bYy0xXV0sdSk8PTA7KWMtPTEsby5wb3AoKTtmb3Ioby5wdXNoKGEpLGM9cy5sZW5ndGg7Yz4xJiZhbih0W3NbYy0yXV0sdFtzW2MtMV1dLHUpPj0wOyljLT0xLHMucG9wKCk7cy5wdXNoKGEpfW49bmV3IEFycmF5KHMubGVuZ3RoK28ubGVuZ3RoLTIpO2Zvcih2YXIgbD0wLGg9KHI9MCxvLmxlbmd0aCk7cjxoOysrciluW2wrK109b1tyXTtmb3IodmFyIGY9cy5sZW5ndGgtMjtmPjA7LS1mKW5bbCsrXT1zW2ZdO3JldHVybiBufSxhbj1vblszXTt2YXIgdW49bG4sY249bG47ZnVuY3Rpb24gbG4odCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBsbikpcmV0dXJuIG5ldyBsbih0LGUpO2lmKHRoaXMuZGF0YT10fHxbXSx0aGlzLmxlbmd0aD10aGlzLmRhdGEubGVuZ3RoLHRoaXMuY29tcGFyZT1lfHxobix0aGlzLmxlbmd0aD4wKWZvcih2YXIgbj0odGhpcy5sZW5ndGg+PjEpLTE7bj49MDtuLS0pdGhpcy5fZG93bihuKX1mdW5jdGlvbiBobih0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6MH1sbi5wcm90b3R5cGU9e3B1c2g6ZnVuY3Rpb24odCl7dGhpcy5kYXRhLnB1c2godCksdGhpcy5sZW5ndGgrKyx0aGlzLl91cCh0aGlzLmxlbmd0aC0xKX0scG9wOmZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmRhdGFbMF07cmV0dXJuIHRoaXMubGVuZ3RoLS0sdGhpcy5sZW5ndGg+MCYmKHRoaXMuZGF0YVswXT10aGlzLmRhdGFbdGhpcy5sZW5ndGhdLHRoaXMuX2Rvd24oMCkpLHRoaXMuZGF0YS5wb3AoKSx0fX0scGVlazpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGFbMF19LF91cDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5kYXRhLG49dGhpcy5jb21wYXJlLHI9ZVt0XTt0PjA7KXt2YXIgaT10LTE+PjEsbz1lW2ldO2lmKG4ocixvKT49MClicmVhaztlW3RdPW8sdD1pfWVbdF09cn0sX2Rvd246ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuZGF0YSxuPXRoaXMuY29tcGFyZSxyPXRoaXMubGVuZ3RoPj4xLGk9ZVt0XTt0PHI7KXt2YXIgbz0xKyh0PDwxKSxzPW8rMSxhPWVbb107aWYoczx0aGlzLmxlbmd0aCYmbihlW3NdLGEpPDAmJihvPXMsYT1lW3NdKSxuKGEsaSk+PTApYnJlYWs7ZVt0XT1hLHQ9b31lW3RdPWl9fSx1bi5kZWZhdWx0PWNuO3ZhciBmbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10WzBdLHI9dFsxXSxpPSExLG89MCxzPWUubGVuZ3RoLTE7bzxlLmxlbmd0aDtzPW8rKyl7dmFyIGE9ZVtvXVswXSx1PWVbb11bMV0sYz1lW3NdWzBdLGw9ZVtzXVsxXTt1PnIhPWw+ciYmbjwoYy1hKSooci11KS8obC11KSthJiYoaT0haSl9cmV0dXJuIGl9LHBuPW9uWzNdLGRuPWduO2Z1bmN0aW9uIGduKHQsZSxuKXtlPU1hdGgubWF4KDAsdm9pZCAwPT09ZT8yOmUpLG49bnx8MDtmb3IodmFyIHIsaT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXSxuPXRbMF0scj10WzBdLGk9dFswXSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBzPXRbb107c1swXTxlWzBdJiYoZT1zKSxzWzBdPnJbMF0mJihyPXMpLHNbMV08blsxXSYmKG49cyksc1sxXT5pWzFdJiYoaT1zKX12YXIgYT1bZSxuLHIsaV0sdT1hLnNsaWNlKCk7Zm9yKG89MDtvPHQubGVuZ3RoO28rKylmbih0W29dLGEpfHx1LnB1c2godFtvXSk7dmFyIGM9c24odSksbD1bXTtmb3Iobz0wO288Yy5sZW5ndGg7bysrKWwucHVzaCh1W2Nbb11dKTtyZXR1cm4gbH0odCksbz1QZSgxNixbIlswXSIsIlsxXSIsIlswXSIsIlsxXSJdKS5sb2FkKHQpLHM9W10sYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgdT1pW2FdO28ucmVtb3ZlKHUpLHI9RG4odSxyKSxzLnB1c2gocil9dmFyIGM9UGUoMTYpO2ZvcihhPTA7YTxzLmxlbmd0aDthKyspYy5pbnNlcnQoYm4oc1thXSkpO2Zvcih2YXIgbD1lKmUsaD1uKm47cy5sZW5ndGg7KXt2YXIgZj1zLnNoaWZ0KCkscD1mLnAsZD1mLm5leHQucCxnPUVuKHAsZCk7aWYoIShnPGgpKXt2YXIgeT1nL2w7KHU9eW4obyxmLnByZXYucCxwLGQsZi5uZXh0Lm5leHQucCx5LGMpKSYmTWF0aC5taW4oRW4odSxwKSxFbih1LGQpKTw9eSYmKHMucHVzaChmKSxzLnB1c2goRG4odSxmKSksby5yZW1vdmUodSksYy5yZW1vdmUoZiksYy5pbnNlcnQoYm4oZikpLGMuaW5zZXJ0KGJuKGYubmV4dCkpKX19Zj1yO3ZhciBtPVtdO2Rve20ucHVzaChmLnApLGY9Zi5uZXh0fXdoaWxlKGYhPT1yKTtyZXR1cm4gbS5wdXNoKGYucCksbX1mdW5jdGlvbiB5bih0LGUsbixyLGksbyxzKXtmb3IodmFyIGE9bmV3IHVuKG51bGwsbW4pLHU9dC5kYXRhO3U7KXtmb3IodmFyIGM9MDtjPHUuY2hpbGRyZW4ubGVuZ3RoO2MrKyl7dmFyIGw9dS5jaGlsZHJlbltjXSxoPXUubGVhZj9DbihsLG4scik6dm4obixyLGwpO2g+b3x8YS5wdXNoKHtub2RlOmwsZGlzdDpofSl9Zm9yKDthLmxlbmd0aCYmIWEucGVlaygpLm5vZGUuY2hpbGRyZW47KXt2YXIgZj1hLnBvcCgpLHA9Zi5ub2RlLGQ9Q24ocCxlLG4pLGc9Q24ocCxyLGkpO2lmKGYuZGlzdDxkJiZmLmRpc3Q8ZyYmeG4obixwLHMpJiZ4bihyLHAscykpcmV0dXJuIHB9KHU9YS5wb3AoKSkmJih1PXUubm9kZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gbW4odCxlKXtyZXR1cm4gdC5kaXN0LWUuZGlzdH1mdW5jdGlvbiB2bih0LGUsbil7aWYoX24odCxuKXx8X24oZSxuKSlyZXR1cm4gMDt2YXIgcj1Tbih0WzBdLHRbMV0sZVswXSxlWzFdLG4ubWluWCxuLm1pblksbi5tYXhYLG4ubWluWSk7aWYoMD09PXIpcmV0dXJuIDA7dmFyIGk9U24odFswXSx0WzFdLGVbMF0sZVsxXSxuLm1pblgsbi5taW5ZLG4ubWluWCxuLm1heFkpO2lmKDA9PT1pKXJldHVybiAwO3ZhciBvPVNuKHRbMF0sdFsxXSxlWzBdLGVbMV0sbi5tYXhYLG4ubWluWSxuLm1heFgsbi5tYXhZKTtpZigwPT09bylyZXR1cm4gMDt2YXIgcz1Tbih0WzBdLHRbMV0sZVswXSxlWzFdLG4ubWluWCxuLm1heFksbi5tYXhYLG4ubWF4WSk7cmV0dXJuIDA9PT1zPzA6TWF0aC5taW4ocixpLG8scyl9ZnVuY3Rpb24gX24odCxlKXtyZXR1cm4gdFswXT49ZS5taW5YJiZ0WzBdPD1lLm1heFgmJnRbMV0+PWUubWluWSYmdFsxXTw9ZS5tYXhZfWZ1bmN0aW9uIHhuKHQsZSxuKXtmb3IodmFyIHI9TWF0aC5taW4odFswXSxlWzBdKSxpPU1hdGgubWluKHRbMV0sZVsxXSksbz1NYXRoLm1heCh0WzBdLGVbMF0pLHM9TWF0aC5tYXgodFsxXSxlWzFdKSxhPW4uc2VhcmNoKHttaW5YOnIsbWluWTppLG1heFg6byxtYXhZOnN9KSx1PTA7dTxhLmxlbmd0aDt1KyspaWYod24oYVt1XS5wLGFbdV0ubmV4dC5wLHQsZSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gd24odCxlLG4scil7cmV0dXJuIHQhPT1yJiZlIT09biYmcG4odCxlLG4pPjAhPXBuKHQsZSxyKT4wJiZwbihuLHIsdCk+MCE9cG4obixyLGUpPjB9ZnVuY3Rpb24gYm4odCl7dmFyIGU9dC5wLG49dC5uZXh0LnA7cmV0dXJuIHQubWluWD1NYXRoLm1pbihlWzBdLG5bMF0pLHQubWluWT1NYXRoLm1pbihlWzFdLG5bMV0pLHQubWF4WD1NYXRoLm1heChlWzBdLG5bMF0pLHQubWF4WT1NYXRoLm1heChlWzFdLG5bMV0pLHR9ZnVuY3Rpb24gRG4odCxlKXt2YXIgbj17cDp0LHByZXY6bnVsbCxuZXh0Om51bGwsbWluWDowLG1pblk6MCxtYXhYOjAsbWF4WTowfTtyZXR1cm4gZT8obi5uZXh0PWUubmV4dCxuLnByZXY9ZSxlLm5leHQucHJldj1uLGUubmV4dD1uKToobi5wcmV2PW4sbi5uZXh0PW4pLG59ZnVuY3Rpb24gRW4odCxlKXt2YXIgbj10WzBdLWVbMF0scj10WzFdLWVbMV07cmV0dXJuIG4qbityKnJ9ZnVuY3Rpb24gQ24odCxlLG4pe3ZhciByPWVbMF0saT1lWzFdLG89blswXS1yLHM9blsxXS1pO2lmKDAhPT1vfHwwIT09cyl7dmFyIGE9KCh0WzBdLXIpKm8rKHRbMV0taSkqcykvKG8qbytzKnMpO2E+MT8ocj1uWzBdLGk9blsxXSk6YT4wJiYocis9byphLGkrPXMqYSl9cmV0dXJuKG89dFswXS1yKSpvKyhzPXRbMV0taSkqc31mdW5jdGlvbiBTbih0LGUsbixyLGksbyxzLGEpe3ZhciB1LGMsbCxoLGY9bi10LHA9ci1lLGQ9cy1pLGc9YS1vLHk9dC1pLG09ZS1vLHY9ZipmK3AqcCxfPWYqZCtwKmcseD1kKmQrZypnLHc9Zip5K3AqbSxiPWQqeStnKm0sRD12KngtXypfLEU9RCxDPUQ7MD09PUQ/KGM9MCxFPTEsaD1iLEM9eCk6KGg9dipiLV8qdywoYz1fKmIteCp3KTwwPyhjPTAsaD1iLEM9eCk6Yz5FJiYoYz1FLGg9YitfLEM9eCkpLGg8MD8oaD0wLC13PDA/Yz0wOi13PnY/Yz1FOihjPS13LEU9dikpOmg+QyYmKGg9QywtdytfPDA/Yz0wOi13K18+dj9jPUU6KGM9LXcrXyxFPXYpKTt2YXIgUz0oMS0obD0wPT09aD8wOmgvQykpKmkrbCpzLSgoMS0odT0wPT09Yz8wOmMvRSkpKnQrdSpuKSxBPSgxLWwpKm8rbCphLSgoMS11KSplK3Uqcik7cmV0dXJuIFMqUytBKkF9ZnVuY3Rpb24gQW4odCxlLG4pe2lmKCJvYmplY3QiIT10eXBlb2Yobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLmlnbm9yZUJvdW5kYXJ5O2lmKCF0KXRocm93IG5ldyBFcnJvcigicG9pbnQgaXMgcmVxdWlyZWQiKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoInBvbHlnb24gaXMgcmVxdWlyZWQiKTt2YXIgaT1JZSh0KSxvPU1lKGUpLHM9ZS5nZW9tZXRyeT9lLmdlb21ldHJ5LnR5cGU6ZS50eXBlLGE9ZS5iYm94O2lmKGEmJiExPT09ZnVuY3Rpb24odCxlKXtyZXR1cm4gZVswXTw9dFswXSYmZVsxXTw9dFsxXSYmZVsyXT49dFswXSYmZVszXT49dFsxXX0oaSxhKSlyZXR1cm4hMTsiUG9seWdvbiI9PT1zJiYobz1bb10pO2Zvcih2YXIgdT0wLGM9ITE7dTxvLmxlbmd0aCYmIWM7dSsrKWlmKE5uKGksb1t1XVswXSxyKSl7Zm9yKHZhciBsPSExLGg9MTtoPG9bdV0ubGVuZ3RoJiYhbDspTm4oaSxvW3VdW2hdLCFyKSYmKGw9ITApLGgrKztsfHwoYz0hMCl9cmV0dXJuIGN9ZnVuY3Rpb24gTm4odCxlLG4pe3ZhciByPSExO2VbMF1bMF09PT1lW2UubGVuZ3RoLTFdWzBdJiZlWzBdWzFdPT09ZVtlLmxlbmd0aC0xXVsxXSYmKGU9ZS5zbGljZSgwLGUubGVuZ3RoLTEpKTtmb3IodmFyIGk9MCxvPWUubGVuZ3RoLTE7aTxlLmxlbmd0aDtvPWkrKyl7dmFyIHM9ZVtpXVswXSxhPWVbaV1bMV0sdT1lW29dWzBdLGM9ZVtvXVsxXTtpZih0WzFdKihzLXUpK2EqKHUtdFswXSkrYyoodFswXS1zKT09MCYmKHMtdFswXSkqKHUtdFswXSk8PTAmJihhLXRbMV0pKihjLXRbMV0pPD0wKXJldHVybiFuO2E+dFsxXSE9Yz50WzFdJiZ0WzBdPCh1LXMpKih0WzFdLWEpLyhjLWEpK3MmJihyPSFyKX1yZXR1cm4gcn1mdW5jdGlvbiBJbih0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtzd2l0Y2godC50eXBlKXtjYXNlIkZlYXR1cmUiOnJldHVybiBNbih0KTtjYXNlIkZlYXR1cmVDb2xsZWN0aW9uIjpyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIn07cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3N3aXRjaChuKXtjYXNlInR5cGUiOmNhc2UiZmVhdHVyZXMiOnJldHVybjtkZWZhdWx0OmVbbl09dFtuXX19KSksZS5mZWF0dXJlcz10LmZlYXR1cmVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIE1uKHQpfSkpLGV9KHQpO2Nhc2UiUG9pbnQiOmNhc2UiTGluZVN0cmluZyI6Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpUG9pbnQiOmNhc2UiTXVsdGlMaW5lU3RyaW5nIjpjYXNlIk11bHRpUG9seWdvbiI6Y2FzZSJHZW9tZXRyeUNvbGxlY3Rpb24iOnJldHVybiBUbih0KTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidW5rbm93biBHZW9KU09OIHR5cGUiKX19ZnVuY3Rpb24gTW4odCl7dmFyIGU9e3R5cGU6IkZlYXR1cmUifTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24obil7c3dpdGNoKG4pe2Nhc2UidHlwZSI6Y2FzZSJwcm9wZXJ0aWVzIjpjYXNlImdlb21ldHJ5IjpyZXR1cm47ZGVmYXVsdDplW25dPXRbbl19fSkpLGUucHJvcGVydGllcz1Gbih0LnByb3BlcnRpZXMpLGUuZ2VvbWV0cnk9VG4odC5nZW9tZXRyeSksZX1mdW5jdGlvbiBGbih0KXt2YXIgZT17fTtyZXR1cm4gdCYmT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIHI9dFtuXTsib2JqZWN0Ij09dHlwZW9mIHI/bnVsbD09PXI/ZVtuXT1udWxsOnIubGVuZ3RoP2Vbbl09ci5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpOmVbbl09Rm4ocik6ZVtuXT1yfSkpLGV9ZnVuY3Rpb24gVG4odCl7dmFyIGU9e3R5cGU6dC50eXBlfTtyZXR1cm4gdC5iYm94JiYoZS5iYm94PXQuYmJveCksIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT10LnR5cGU/KGUuZ2VvbWV0cmllcz10Lmdlb21ldHJpZXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gVG4odCl9KSksZSk6KGUuY29vcmRpbmF0ZXM9T24odC5jb29yZGluYXRlcyksZSl9ZnVuY3Rpb24gT24odCl7cmV0dXJuIm9iamVjdCIhPXR5cGVvZiB0WzBdP3Quc2xpY2UoKTp0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIE9uKHQpfSkpfWZ1bmN0aW9uIExuKHQpe3JldHVybiBmdW5jdGlvbih0KXtfZSh0KTt2YXIgZT1OdW1iZXIodFswXSksbj1OdW1iZXIodFsxXSkscj1OdW1iZXIodFsyXSksaT1OdW1iZXIodFszXSk7aWYoNj09PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQHR1cmYvYmJveC1wb2x5Z29uIGRvZXMgbm90IHN1cHBvcnQgQkJveCB3aXRoIDYgcG9zaXRpb25zIik7dmFyIG89W2Usbl07cmV0dXJuIHVlKFtbbyxbcixuXSxbcixpXSxbZSxpXSxvXV0pfShmdW5jdGlvbih0KXt2YXIgZT1bMS8wLDEvMCwtMS8wLC0xLzBdO3JldHVybiB3ZSh0LChmdW5jdGlvbih0KXtlWzBdPnRbMF0mJihlWzBdPXRbMF0pLGVbMV0+dFsxXSYmKGVbMV09dFsxXSksZVsyXTx0WzBdJiYoZVsyXT10WzBdKSxlWzNdPHRbMV0mJihlWzNdPXRbMV0pfSkpLGV9KHQpKX1nbi5kZWZhdWx0PWRuO3ZhciBQbj1CbixSbj1CbjtmdW5jdGlvbiBCbih0LGUsbil7bj1ufHwyO3ZhciByLGksbyxzLGEsdSxjLGw9ZSYmZS5sZW5ndGgsaD1sP2VbMF0qbjp0Lmxlbmd0aCxmPWtuKHQsMCxoLG4sITApLHA9W107aWYoIWYpcmV0dXJuIHA7aWYobCYmKGY9ZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxzLGEsdSxjPVtdO2ZvcihpPTAsbz1lLmxlbmd0aDtpPG87aSsrKXM9ZVtpXSpyLGE9aTxvLTE/ZVtpKzFdKnI6dC5sZW5ndGgsKHU9a24odCxzLGEsciwhMSkpPT09dS5uZXh0JiYodS5zdGVpbmVyPSEwKSxjLnB1c2goSG4odSkpO2ZvcihjLnNvcnQoWW4pLGk9MDtpPGMubGVuZ3RoO2krKylYbihjW2ldLG4pLG49em4obixuLm5leHQpO3JldHVybiBufSh0LGUsZixuKSksdC5sZW5ndGg+ODAqbil7cj1vPXRbMF0saT1zPXRbMV07Zm9yKHZhciBkPW47ZDxoO2QrPW4pKGE9dFtkXSk8ciYmKHI9YSksKHU9dFtkKzFdKTxpJiYoaT11KSxhPm8mJihvPWEpLHU+cyYmKHM9dSk7Yz0wIT09KGM9TWF0aC5tYXgoby1yLHMtaSkpPzEvYzowfXJldHVybiBqbihmLHAsbixyLGksYykscH1mdW5jdGlvbiBrbih0LGUsbixyLGkpe3ZhciBvLHM7aWYoaT09PW9yKHQsZSxuLHIpPjApZm9yKG89ZTtvPG47bys9cilzPW5yKG8sdFtvXSx0W28rMV0scyk7ZWxzZSBmb3Iobz1uLXI7bz49ZTtvLT1yKXM9bnIobyx0W29dLHRbbysxXSxzKTtyZXR1cm4gcyYmUW4ocyxzLm5leHQpJiYocnIocykscz1zLm5leHQpLHN9ZnVuY3Rpb24gem4odCxlKXtpZighdClyZXR1cm4gdDtlfHwoZT10KTt2YXIgbixyPXQ7ZG97aWYobj0hMSxyLnN0ZWluZXJ8fCFRbihyLHIubmV4dCkmJjAhPT1KbihyLnByZXYscixyLm5leHQpKXI9ci5uZXh0O2Vsc2V7aWYocnIociksKHI9ZT1yLnByZXYpPT09ci5uZXh0KWJyZWFrO249ITB9fXdoaWxlKG58fHIhPT1lKTtyZXR1cm4gZX1mdW5jdGlvbiBqbih0LGUsbixyLGksbyxzKXtpZih0KXshcyYmbyYmZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dDtkb3tudWxsPT09aS56JiYoaS56PVduKGkueCxpLnksZSxuLHIpKSxpLnByZXZaPWkucHJldixpLm5leHRaPWkubmV4dCxpPWkubmV4dH13aGlsZShpIT09dCk7aS5wcmV2Wi5uZXh0Wj1udWxsLGkucHJldlo9bnVsbCxmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYSx1LGM9MTtkb3tmb3Iobj10LHQ9bnVsbCxvPW51bGwscz0wO247KXtmb3IocysrLHI9bixhPTAsZT0wO2U8YyYmKGErKyxyPXIubmV4dFopO2UrKyk7Zm9yKHU9YzthPjB8fHU+MCYmcjspMCE9PWEmJigwPT09dXx8IXJ8fG4uejw9ci56KT8oaT1uLG49bi5uZXh0WixhLS0pOihpPXIscj1yLm5leHRaLHUtLSksbz9vLm5leHRaPWk6dD1pLGkucHJldlo9byxvPWk7bj1yfW8ubmV4dFo9bnVsbCxjKj0yfXdoaWxlKHM+MSl9KGkpfSh0LHIsaSxvKTtmb3IodmFyIGEsdSxjPXQ7dC5wcmV2IT09dC5uZXh0OylpZihhPXQucHJldix1PXQubmV4dCxvP3FuKHQscixpLG8pOlVuKHQpKWUucHVzaChhLmkvbiksZS5wdXNoKHQuaS9uKSxlLnB1c2godS5pL24pLHJyKHQpLHQ9dS5uZXh0LGM9dS5uZXh0O2Vsc2UgaWYoKHQ9dSk9PT1jKXtzPzE9PT1zP2puKHQ9Vm4odCxlLG4pLGUsbixyLGksbywyKToyPT09cyYmR24odCxlLG4scixpLG8pOmpuKHpuKHQpLGUsbixyLGksbywxKTticmVha319fWZ1bmN0aW9uIFVuKHQpe3ZhciBlPXQucHJldixuPXQscj10Lm5leHQ7aWYoSm4oZSxuLHIpPj0wKXJldHVybiExO2Zvcih2YXIgaT10Lm5leHQubmV4dDtpIT09dC5wcmV2Oyl7aWYoWm4oZS54LGUueSxuLngsbi55LHIueCxyLnksaS54LGkueSkmJkpuKGkucHJldixpLGkubmV4dCk+PTApcmV0dXJuITE7aT1pLm5leHR9cmV0dXJuITB9ZnVuY3Rpb24gcW4odCxlLG4scil7dmFyIGk9dC5wcmV2LG89dCxzPXQubmV4dDtpZihKbihpLG8scyk+PTApcmV0dXJuITE7Zm9yKHZhciBhPWkueDxvLng/aS54PHMueD9pLng6cy54Om8ueDxzLng/by54OnMueCx1PWkueTxvLnk/aS55PHMueT9pLnk6cy55Om8ueTxzLnk/by55OnMueSxjPWkueD5vLng/aS54PnMueD9pLng6cy54Om8ueD5zLng/by54OnMueCxsPWkueT5vLnk/aS55PnMueT9pLnk6cy55Om8ueT5zLnk/by55OnMueSxoPVduKGEsdSxlLG4sciksZj1XbihjLGwsZSxuLHIpLHA9dC5uZXh0WjtwJiZwLno8PWY7KXtpZihwIT09dC5wcmV2JiZwIT09dC5uZXh0JiZabihpLngsaS55LG8ueCxvLnkscy54LHMueSxwLngscC55KSYmSm4ocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAubmV4dFp9Zm9yKHA9dC5wcmV2WjtwJiZwLno+PWg7KXtpZihwIT09dC5wcmV2JiZwIT09dC5uZXh0JiZabihpLngsaS55LG8ueCxvLnkscy54LHMueSxwLngscC55KSYmSm4ocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAucHJldlp9cmV0dXJuITB9ZnVuY3Rpb24gVm4odCxlLG4pe3ZhciByPXQ7ZG97dmFyIGk9ci5wcmV2LG89ci5uZXh0Lm5leHQ7IVFuKGksbykmJiRuKGkscixyLm5leHQsbykmJnRyKGksbykmJnRyKG8saSkmJihlLnB1c2goaS5pL24pLGUucHVzaChyLmkvbiksZS5wdXNoKG8uaS9uKSxycihyKSxycihyLm5leHQpLHI9dD1vKSxyPXIubmV4dH13aGlsZShyIT09dCk7cmV0dXJuIHJ9ZnVuY3Rpb24gR24odCxlLG4scixpLG8pe3ZhciBzPXQ7ZG97Zm9yKHZhciBhPXMubmV4dC5uZXh0O2EhPT1zLnByZXY7KXtpZihzLmkhPT1hLmkmJktuKHMsYSkpe3ZhciB1PWVyKHMsYSk7cmV0dXJuIHM9em4ocyxzLm5leHQpLHU9em4odSx1Lm5leHQpLGpuKHMsZSxuLHIsaSxvKSx2b2lkIGpuKHUsZSxuLHIsaSxvKX1hPWEubmV4dH1zPXMubmV4dH13aGlsZShzIT09dCl9ZnVuY3Rpb24gWW4odCxlKXtyZXR1cm4gdC54LWUueH1mdW5jdGlvbiBYbih0LGUpe2lmKGU9ZnVuY3Rpb24odCxlKXt2YXIgbixyPWUsaT10Lngsbz10Lnkscz0tMS8wO2Rve2lmKG88PXIueSYmbz49ci5uZXh0LnkmJnIubmV4dC55IT09ci55KXt2YXIgYT1yLngrKG8tci55KSooci5uZXh0Lngtci54KS8oci5uZXh0Lnktci55KTtpZihhPD1pJiZhPnMpe2lmKHM9YSxhPT09aSl7aWYobz09PXIueSlyZXR1cm4gcjtpZihvPT09ci5uZXh0LnkpcmV0dXJuIHIubmV4dH1uPXIueDxyLm5leHQueD9yOnIubmV4dH19cj1yLm5leHR9d2hpbGUociE9PWUpO2lmKCFuKXJldHVybiBudWxsO2lmKGk9PT1zKXJldHVybiBuLnByZXY7dmFyIHUsYz1uLGw9bi54LGg9bi55LGY9MS8wO2ZvcihyPW4ubmV4dDtyIT09YzspaT49ci54JiZyLng+PWwmJmkhPT1yLngmJlpuKG88aD9pOnMsbyxsLGgsbzxoP3M6aSxvLHIueCxyLnkpJiYoKHU9TWF0aC5hYnMoby1yLnkpLyhpLXIueCkpPGZ8fHU9PT1mJiZyLng+bi54KSYmdHIocix0KSYmKG49cixmPXUpLHI9ci5uZXh0O3JldHVybiBufSh0LGUpLGUpe3ZhciBuPWVyKGUsdCk7em4obixuLm5leHQpfX1mdW5jdGlvbiBXbih0LGUsbixyLGkpe3JldHVybih0PTE0MzE2NTU3NjUmKCh0PTg1ODk5MzQ1OSYoKHQ9MjUyNjQ1MTM1JigodD0xNjcxMTkzNSYoKHQ9MzI3NjcqKHQtbikqaSl8dDw8OCkpfHQ8PDQpKXx0PDwyKSl8dDw8MSkpfChlPTE0MzE2NTU3NjUmKChlPTg1ODk5MzQ1OSYoKGU9MjUyNjQ1MTM1JigoZT0xNjcxMTkzNSYoKGU9MzI3NjcqKGUtcikqaSl8ZTw8OCkpfGU8PDQpKXxlPDwyKSl8ZTw8MSkpPDwxfWZ1bmN0aW9uIEhuKHQpe3ZhciBlPXQsbj10O2Rve2UueDxuLngmJihuPWUpLGU9ZS5uZXh0fXdoaWxlKGUhPT10KTtyZXR1cm4gbn1mdW5jdGlvbiBabih0LGUsbixyLGksbyxzLGEpe3JldHVybihpLXMpKihlLWEpLSh0LXMpKihvLWEpPj0wJiYodC1zKSooci1hKS0obi1zKSooZS1hKT49MCYmKG4tcykqKG8tYSktKGktcykqKHItYSk+PTB9ZnVuY3Rpb24gS24odCxlKXtyZXR1cm4gdC5uZXh0LmkhPT1lLmkmJnQucHJldi5pIT09ZS5pJiYhZnVuY3Rpb24odCxlKXt2YXIgbj10O2Rve2lmKG4uaSE9PXQuaSYmbi5uZXh0LmkhPT10LmkmJm4uaSE9PWUuaSYmbi5uZXh0LmkhPT1lLmkmJiRuKG4sbi5uZXh0LHQsZSkpcmV0dXJuITA7bj1uLm5leHR9d2hpbGUobiE9PXQpO3JldHVybiExfSh0LGUpJiZ0cih0LGUpJiZ0cihlLHQpJiZmdW5jdGlvbih0LGUpe3ZhciBuPXQscj0hMSxpPSh0LngrZS54KS8yLG89KHQueStlLnkpLzI7ZG97bi55Pm8hPW4ubmV4dC55Pm8mJm4ubmV4dC55IT09bi55JiZpPChuLm5leHQueC1uLngpKihvLW4ueSkvKG4ubmV4dC55LW4ueSkrbi54JiYocj0hciksbj1uLm5leHR9d2hpbGUobiE9PXQpO3JldHVybiByfSh0LGUpfWZ1bmN0aW9uIEpuKHQsZSxuKXtyZXR1cm4oZS55LXQueSkqKG4ueC1lLngpLShlLngtdC54KSoobi55LWUueSl9ZnVuY3Rpb24gUW4odCxlKXtyZXR1cm4gdC54PT09ZS54JiZ0Lnk9PT1lLnl9ZnVuY3Rpb24gJG4odCxlLG4scil7cmV0dXJuISEoUW4odCxlKSYmUW4obixyKXx8UW4odCxyKSYmUW4obixlKSl8fEpuKHQsZSxuKT4wIT1Kbih0LGUscik+MCYmSm4obixyLHQpPjAhPUpuKG4scixlKT4wfWZ1bmN0aW9uIHRyKHQsZSl7cmV0dXJuIEpuKHQucHJldix0LHQubmV4dCk8MD9Kbih0LGUsdC5uZXh0KT49MCYmSm4odCx0LnByZXYsZSk+PTA6Sm4odCxlLHQucHJldik8MHx8Sm4odCx0Lm5leHQsZSk8MH1mdW5jdGlvbiBlcih0LGUpe3ZhciBuPW5ldyBpcih0LmksdC54LHQueSkscj1uZXcgaXIoZS5pLGUueCxlLnkpLGk9dC5uZXh0LG89ZS5wcmV2O3JldHVybiB0Lm5leHQ9ZSxlLnByZXY9dCxuLm5leHQ9aSxpLnByZXY9bixyLm5leHQ9bixuLnByZXY9cixvLm5leHQ9cixyLnByZXY9byxyfWZ1bmN0aW9uIG5yKHQsZSxuLHIpe3ZhciBpPW5ldyBpcih0LGUsbik7cmV0dXJuIHI/KGkubmV4dD1yLm5leHQsaS5wcmV2PXIsci5uZXh0LnByZXY9aSxyLm5leHQ9aSk6KGkucHJldj1pLGkubmV4dD1pKSxpfWZ1bmN0aW9uIHJyKHQpe3QubmV4dC5wcmV2PXQucHJldix0LnByZXYubmV4dD10Lm5leHQsdC5wcmV2WiYmKHQucHJldloubmV4dFo9dC5uZXh0WiksdC5uZXh0WiYmKHQubmV4dFoucHJldlo9dC5wcmV2Wil9ZnVuY3Rpb24gaXIodCxlLG4pe3RoaXMuaT10LHRoaXMueD1lLHRoaXMueT1uLHRoaXMucHJldj1udWxsLHRoaXMubmV4dD1udWxsLHRoaXMuej1udWxsLHRoaXMucHJldlo9bnVsbCx0aGlzLm5leHRaPW51bGwsdGhpcy5zdGVpbmVyPSExfWZ1bmN0aW9uIG9yKHQsZSxuLHIpe2Zvcih2YXIgaT0wLG89ZSxzPW4tcjtvPG47bys9cilpKz0odFtzXS10W29dKSoodFtvKzFdK3RbcysxXSkscz1vO3JldHVybiBpfWZ1bmN0aW9uIHNyKHQsZSxuKXtpZighdmUobj1ufHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgcj1uLm11dGF0ZTtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmbWUodFswXSk/dD0ibWVyY2F0b3IiPT09ZT9hcih0KTp1cih0KTooITAhPT1yJiYodD1Jbih0KSksd2UodCwoZnVuY3Rpb24odCl7dmFyIG49Im1lcmNhdG9yIj09PWU/YXIodCk6dXIodCk7dFswXT1uWzBdLHRbMV09blsxXX0pKSksdH1mdW5jdGlvbiBhcih0KXt2YXIgZT1NYXRoLlBJLzE4MCxuPTYzNzgxMzcscj0yMDAzNzUwOC4zNDI3ODkyNDQsaT1NYXRoLmFicyh0WzBdKTw9MTgwP3RbMF06dFswXS0zNjAqZnVuY3Rpb24odCl7cmV0dXJuIHQ8MD8tMTp0PjA/MTowfSh0WzBdKSxvPVtuKmkqZSxuKk1hdGgubG9nKE1hdGgudGFuKC4yNSpNYXRoLlBJKy41KnRbMV0qZSkpXTtyZXR1cm4gb1swXT5yJiYob1swXT1yKSxvWzBdPC1yJiYob1swXT0tciksb1sxXT5yJiYob1sxXT1yKSxvWzFdPC1yJiYob1sxXT0tciksb31mdW5jdGlvbiB1cih0KXt2YXIgZT0xODAvTWF0aC5QSSxuPTYzNzgxMzc7cmV0dXJuW3RbMF0qZS9uLCguNSpNYXRoLlBJLTIqTWF0aC5hdGFuKE1hdGguZXhwKC10WzFdL24pKSkqZV19ZnVuY3Rpb24gY3IodCxlLG4pe3ZhciByLGksbyxzLGEsdT10Lmxlbmd0aCxjPWhyKHRbMF0sZSksbD1bXTtmb3Iobnx8KG49W10pLHI9MTtyPHU7cisrKXtmb3IoaT10W3ItMV0scz1hPWhyKG89dFtyXSxlKTs7KXtpZighKGN8cykpe2wucHVzaChpKSxzIT09YT8obC5wdXNoKG8pLHI8dS0xJiYobi5wdXNoKGwpLGw9W10pKTpyPT09dS0xJiZsLnB1c2gobyk7YnJlYWt9aWYoYyZzKWJyZWFrO2M/Yz1ocihpPWxyKGksbyxjLGUpLGUpOnM9aHIobz1scihpLG8scyxlKSxlKX1jPWF9cmV0dXJuIGwubGVuZ3RoJiZuLnB1c2gobCksbn1mdW5jdGlvbiBscih0LGUsbixyKXtyZXR1cm4gOCZuP1t0WzBdKyhlWzBdLXRbMF0pKihyWzNdLXRbMV0pLyhlWzFdLXRbMV0pLHJbM11dOjQmbj9bdFswXSsoZVswXS10WzBdKSooclsxXS10WzFdKS8oZVsxXS10WzFdKSxyWzFdXToyJm4/W3JbMl0sdFsxXSsoZVsxXS10WzFdKSooclsyXS10WzBdKS8oZVswXS10WzBdKV06MSZuP1tyWzBdLHRbMV0rKGVbMV0tdFsxXSkqKHJbMF0tdFswXSkvKGVbMF0tdFswXSldOm51bGx9ZnVuY3Rpb24gaHIodCxlKXt2YXIgbj0wO3JldHVybiB0WzBdPGVbMF0/bnw9MTp0WzBdPmVbMl0mJihufD0yKSx0WzFdPGVbMV0/bnw9NDp0WzFdPmVbM10mJihufD04KSxufWZ1bmN0aW9uIGZyKHQsZSl7cmV0dXJuIGUuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0uZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBBbihhZShlKSx0KX0pKX1Cbi5kZXZpYXRpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ZSYmZS5sZW5ndGgsbz1pP2VbMF0qbjp0Lmxlbmd0aCxzPU1hdGguYWJzKG9yKHQsMCxvLG4pKTtpZihpKWZvcih2YXIgYT0wLHU9ZS5sZW5ndGg7YTx1O2ErKyl7dmFyIGM9ZVthXSpuLGw9YTx1LTE/ZVthKzFdKm46dC5sZW5ndGg7cy09TWF0aC5hYnMob3IodCxjLGwsbikpfXZhciBoPTA7Zm9yKGE9MDthPHIubGVuZ3RoO2ErPTMpe3ZhciBmPXJbYV0qbixwPXJbYSsxXSpuLGQ9clthKzJdKm47aCs9TWF0aC5hYnMoKHRbZl0tdFtkXSkqKHRbcCsxXS10W2YrMV0pLSh0W2ZdLXRbcF0pKih0W2QrMV0tdFtmKzFdKSl9cmV0dXJuIDA9PT1zJiYwPT09aD8wOk1hdGguYWJzKChoLXMpL3MpfSxCbi5mbGF0dGVuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10WzBdWzBdLmxlbmd0aCxuPXt2ZXJ0aWNlczpbXSxob2xlczpbXSxkaW1lbnNpb25zOmV9LHI9MCxpPTA7aTx0Lmxlbmd0aDtpKyspe2Zvcih2YXIgbz0wO288dFtpXS5sZW5ndGg7bysrKWZvcih2YXIgcz0wO3M8ZTtzKyspbi52ZXJ0aWNlcy5wdXNoKHRbaV1bb11bc10pO2k+MCYmKHIrPXRbaS0xXS5sZW5ndGgsbi5ob2xlcy5wdXNoKHIpKX1yZXR1cm4gbn0sUG4uZGVmYXVsdD1SbixPYmplY3QuZnJlZXplKHt0b01lcmNhdG9yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHNyKHQsIm1lcmNhdG9yIixlKX0sdG9XZ3M4NDpmdW5jdGlvbih0LGUpe3JldHVybiBzcih0LCJ3Z3M4NCIsZSl9fSksTnVtYmVyLnByb3RvdHlwZS5tb2R1bG89ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMldCt0KSV0fSxjci5wb2x5bGluZT1jcixjci5wb2x5Z29uPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixpLG8scyxhLHU7Zm9yKHI9MTtyPD04O3IqPTIpe2ZvcihuPVtdLG89IShocihpPXRbdC5sZW5ndGgtMV0sZSkmcikscz0wO3M8dC5sZW5ndGg7cysrKSh1PSEoaHIoYT10W3NdLGUpJnIpKSE9PW8mJm4ucHVzaChscihpLGEscixlKSksdSYmbi5wdXNoKGEpLGk9YSxvPXU7aWYoISh0PW4pLmxlbmd0aClicmVha31yZXR1cm4gbn07dmFyIHByPWZ1bmN0aW9uKCl7dGhpcy5lZGdlcz1bXSx0aGlzLnBvbHlnb249dm9pZCAwLHRoaXMuZW52ZWxvcGU9dm9pZCAwfSxkcj17bGVuZ3RoOntjb25maWd1cmFibGU6ITB9fTtwci5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXt0aGlzW3RoaXMuZWRnZXMubGVuZ3RoXT10LHRoaXMuZWRnZXMucHVzaCh0KSx0aGlzLnBvbHlnb249dGhpcy5lbnZlbG9wZT12b2lkIDB9LHByLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWRnZXNbdF19LGRyLmxlbmd0aC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlcy5sZW5ndGh9LHByLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe3RoaXMuZWRnZXMuZm9yRWFjaCh0KX0scHIucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lZGdlcy5tYXAodCl9LHByLnByb3RvdHlwZS5zb21lPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVkZ2VzLnNvbWUodCl9LHByLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuITB9LHByLnByb3RvdHlwZS5pc0hvbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5lZGdlcy5yZWR1Y2UoKGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gbi5mcm9tLmNvb3JkaW5hdGVzWzFdPnQuZWRnZXNbZV0uZnJvbS5jb29yZGluYXRlc1sxXSYmKGU9ciksZX0pLDApLG49KDA9PT1lP3RoaXMubGVuZ3RoOmUpLTEscj0oZSsxKSV0aGlzLmxlbmd0aCxpPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lWzBdLXRbMF0saT1lWzFdLXRbMV0sbz1uWzBdLWVbMF0scz1uWzFdLWVbMV07cmV0dXJuIE1hdGguc2lnbihyKnMtbyppKX0odGhpcy5lZGdlc1tuXS5mcm9tLmNvb3JkaW5hdGVzLHRoaXMuZWRnZXNbZV0uZnJvbS5jb29yZGluYXRlcyx0aGlzLmVkZ2VzW3JdLmZyb20uY29vcmRpbmF0ZXMpO3JldHVybiAwPT09aT90aGlzLmVkZ2VzW25dLmZyb20uY29vcmRpbmF0ZXNbMF0+dGhpcy5lZGdlc1tyXS5mcm9tLmNvb3JkaW5hdGVzWzBdOmk+MH0scHIucHJvdG90eXBlLnRvTXVsdGlQb2ludD1mdW5jdGlvbigpe3JldHVybiBmZSh0aGlzLmVkZ2VzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZnJvbS5jb29yZGluYXRlc30pKSl9LHByLnByb3RvdHlwZS50b1BvbHlnb249ZnVuY3Rpb24oKXtpZih0aGlzLnBvbHlnb24pcmV0dXJuIHRoaXMucG9seWdvbjt2YXIgdD10aGlzLmVkZ2VzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZnJvbS5jb29yZGluYXRlc30pKTtyZXR1cm4gdC5wdXNoKHRoaXMuZWRnZXNbMF0uZnJvbS5jb29yZGluYXRlcyksdGhpcy5wb2x5Z29uPXVlKFt0XSl9LHByLnByb3RvdHlwZS5nZXRFbnZlbG9wZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVudmVsb3BlP3RoaXMuZW52ZWxvcGU6dGhpcy5lbnZlbG9wZT1Mbih0aGlzLnRvUG9seWdvbigpKX0scHIuZmluZEVkZ2VSaW5nQ29udGFpbmluZz1mdW5jdGlvbih0LGUpe3ZhciBuLHIsaT10LmdldEVudmVsb3BlKCk7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG89ZS5nZXRFbnZlbG9wZSgpO2lmKHImJihuPXIuZ2V0RW52ZWxvcGUoKSksIWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZW9tZXRyeS5jb29yZGluYXRlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0WzBdfSkpLHI9dC5nZW9tZXRyeS5jb29yZGluYXRlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0WzFdfSkpLGk9ZS5nZW9tZXRyeS5jb29yZGluYXRlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0WzBdfSkpLG89ZS5nZW9tZXRyeS5jb29yZGluYXRlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0WzFdfSkpO3JldHVybiBNYXRoLm1heChudWxsLG4pPT09TWF0aC5tYXgobnVsbCxpKSYmTWF0aC5tYXgobnVsbCxyKT09PU1hdGgubWF4KG51bGwsbykmJk1hdGgubWluKG51bGwsbik9PT1NYXRoLm1pbihudWxsLGkpJiZNYXRoLm1pbihudWxsLHIpPT09TWF0aC5taW4obnVsbCxvKX0obyxpKSYmZnIobyxpKSl7dmFyIHM9dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmZyb20uY29vcmRpbmF0ZXN9KSkuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIWUuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX0odCxlLmZyb20uY29vcmRpbmF0ZXMpfSkpfSkpO3MmJmUuaW5zaWRlKGFlKHMpKSYmKCFyfHxmcihuLG8pKSYmKHI9ZSl9fSkpLHJ9LHByLnByb3RvdHlwZS5pbnNpZGU9ZnVuY3Rpb24odCl7cmV0dXJuIEFuKHQsdGhpcy50b1BvbHlnb24oKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHByLnByb3RvdHlwZSxkcik7dmFyIGdyPUplKChmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4odCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpZS5wdXNoKG4pO3JldHVybiBlfSh0LmV4cG9ydHM9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5rZXlzP09iamVjdC5rZXlzOm4pLnNoaW09bn0pKTtnci5zaGltO3ZhciB5cj1KZSgoZnVuY3Rpb24odCxlKXt2YXIgbj0iW29iamVjdCBBcmd1bWVudHNdIj09ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50cyl9KCk7ZnVuY3Rpb24gcih0KXtyZXR1cm4iW29iamVjdCBBcmd1bWVudHNdIj09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImNhbGxlZSIpJiYhT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsImNhbGxlZSIpfHwhMX0oZT10LmV4cG9ydHM9bj9yOmkpLnN1cHBvcnRlZD1yLGUudW5zdXBwb3J0ZWQ9aX0pKTt5ci5zdXBwb3J0ZWQseXIudW5zdXBwb3J0ZWQsSmUoKGZ1bmN0aW9uKHQpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZSxuPXQuZXhwb3J0cz1mdW5jdGlvbih0LG8scyl7cmV0dXJuIHN8fChzPXt9KSx0PT09b3x8KHQgaW5zdGFuY2VvZiBEYXRlJiZvIGluc3RhbmNlb2YgRGF0ZT90LmdldFRpbWUoKT09PW8uZ2V0VGltZSgpOiF0fHwhb3x8Im9iamVjdCIhPXR5cGVvZiB0JiYib2JqZWN0IiE9dHlwZW9mIG8/cy5zdHJpY3Q/dD09PW86dD09bzpmdW5jdGlvbih0LG8scyl7dmFyIGEsdTtpZihyKHQpfHxyKG8pfHx0LnByb3RvdHlwZSE9PW8ucHJvdG90eXBlKXJldHVybiExO2lmKHlyKHQpKXJldHVybiEheXIobykmJih0PWUuY2FsbCh0KSxvPWUuY2FsbChvKSxuKHQsbyxzKSk7aWYoaSh0KSl7aWYoIWkobyl8fHQubGVuZ3RoIT09by5sZW5ndGgpcmV0dXJuITE7Zm9yKGE9MDthPHQubGVuZ3RoO2ErKylpZih0W2FdIT09b1thXSlyZXR1cm4hMTtyZXR1cm4hMH10cnl7dmFyIGM9Z3IodCksbD1ncihvKX1jYXRjaCh0KXtyZXR1cm4hMX1pZihjLmxlbmd0aCE9bC5sZW5ndGgpcmV0dXJuITE7Zm9yKGMuc29ydCgpLGwuc29ydCgpLGE9Yy5sZW5ndGgtMTthPj0wO2EtLSlpZihjW2FdIT1sW2FdKXJldHVybiExO2ZvcihhPWMubGVuZ3RoLTE7YT49MDthLS0paWYodT1jW2FdLCFuKHRbdV0sb1t1XSxzKSlyZXR1cm4hMTtyZXR1cm4gdHlwZW9mIHQ9PXR5cGVvZiBvfSh0LG8scykpfTtmdW5jdGlvbiByKHQpe3JldHVybiBudWxsPT10fWZ1bmN0aW9uIGkodCl7cmV0dXJuISghdHx8Im9iamVjdCIhPXR5cGVvZiB0fHwibnVtYmVyIiE9dHlwZW9mIHQubGVuZ3RofHwiZnVuY3Rpb24iIT10eXBlb2YgdC5jb3B5fHwiZnVuY3Rpb24iIT10eXBlb2YgdC5zbGljZXx8dC5sZW5ndGg+MCYmIm51bWJlciIhPXR5cGVvZiB0WzBdKX19KSk7dmFyIG1yPUplKChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSxuLHIpe3RoaXMuZGF0YXNldD1bXSx0aGlzLmVwc2lsb249MSx0aGlzLm1pblB0cz0yLHRoaXMuZGlzdGFuY2U9dGhpcy5fZXVjbGlkZWFuRGlzdGFuY2UsdGhpcy5jbHVzdGVycz1bXSx0aGlzLm5vaXNlPVtdLHRoaXMuX3Zpc2l0ZWQ9W10sdGhpcy5fYXNzaWduZWQ9W10sdGhpcy5fZGF0YXNldExlbmd0aD0wLHRoaXMuX2luaXQodCxlLG4scil9ZS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKHQsZSxuLHIpe3RoaXMuX2luaXQodCxlLG4scik7Zm9yKHZhciBpPTA7aTx0aGlzLl9kYXRhc2V0TGVuZ3RoO2krKylpZigxIT09dGhpcy5fdmlzaXRlZFtpXSl7dGhpcy5fdmlzaXRlZFtpXT0xO3ZhciBvPXRoaXMuX3JlZ2lvblF1ZXJ5KGkpO2lmKG8ubGVuZ3RoPHRoaXMubWluUHRzKXRoaXMubm9pc2UucHVzaChpKTtlbHNle3ZhciBzPXRoaXMuY2x1c3RlcnMubGVuZ3RoO3RoaXMuY2x1c3RlcnMucHVzaChbXSksdGhpcy5fYWRkVG9DbHVzdGVyKGkscyksdGhpcy5fZXhwYW5kQ2x1c3RlcihzLG8pfX1yZXR1cm4gdGhpcy5jbHVzdGVyc30sZS5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCxlLG4scil7aWYodCl7aWYoISh0IGluc3RhbmNlb2YgQXJyYXkpKXRocm93IEVycm9yKCJEYXRhc2V0IG11c3QgYmUgb2YgdHlwZSBhcnJheSwgIit0eXBlb2YgdCsiIGdpdmVuIik7dGhpcy5kYXRhc2V0PXQsdGhpcy5jbHVzdGVycz1bXSx0aGlzLm5vaXNlPVtdLHRoaXMuX2RhdGFzZXRMZW5ndGg9dC5sZW5ndGgsdGhpcy5fdmlzaXRlZD1uZXcgQXJyYXkodGhpcy5fZGF0YXNldExlbmd0aCksdGhpcy5fYXNzaWduZWQ9bmV3IEFycmF5KHRoaXMuX2RhdGFzZXRMZW5ndGgpfWUmJih0aGlzLmVwc2lsb249ZSksbiYmKHRoaXMubWluUHRzPW4pLHImJih0aGlzLmRpc3RhbmNlPXIpfSxlLnByb3RvdHlwZS5fZXhwYW5kQ2x1c3Rlcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO2lmKDEhPT10aGlzLl92aXNpdGVkW3JdKXt0aGlzLl92aXNpdGVkW3JdPTE7dmFyIGk9dGhpcy5fcmVnaW9uUXVlcnkocik7aS5sZW5ndGg+PXRoaXMubWluUHRzJiYoZT10aGlzLl9tZXJnZUFycmF5cyhlLGkpKX0xIT09dGhpcy5fYXNzaWduZWRbcl0mJnRoaXMuX2FkZFRvQ2x1c3RlcihyLHQpfX0sZS5wcm90b3R5cGUuX2FkZFRvQ2x1c3Rlcj1mdW5jdGlvbih0LGUpe3RoaXMuY2x1c3RlcnNbZV0ucHVzaCh0KSx0aGlzLl9hc3NpZ25lZFt0XT0xfSxlLnByb3RvdHlwZS5fcmVnaW9uUXVlcnk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MDtuPHRoaXMuX2RhdGFzZXRMZW5ndGg7bisrKXt0aGlzLmRpc3RhbmNlKHRoaXMuZGF0YXNldFt0XSx0aGlzLmRhdGFzZXRbbl0pPHRoaXMuZXBzaWxvbiYmZS5wdXNoKG4pfXJldHVybiBlfSxlLnByb3RvdHlwZS5fbWVyZ2VBcnJheXM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5sZW5ndGgscj0wO3I8bjtyKyspe3ZhciBpPWVbcl07dC5pbmRleE9mKGkpPDAmJnQucHVzaChpKX1yZXR1cm4gdH0sZS5wcm90b3R5cGUuX2V1Y2xpZGVhbkRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCk7ci0tOyluKz0odFtyXS1lW3JdKSoodFtyXS1lW3JdKTtyZXR1cm4gTWF0aC5zcXJ0KG4pfSx0LmV4cG9ydHMmJih0LmV4cG9ydHM9ZSl9KSksdnI9SmUoKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlLG4pe3RoaXMuaz0zLHRoaXMuZGF0YXNldD1bXSx0aGlzLmFzc2lnbm1lbnRzPVtdLHRoaXMuY2VudHJvaWRzPVtdLHRoaXMuaW5pdCh0LGUsbil9ZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0LGUsbil7dGhpcy5hc3NpZ25tZW50cz1bXSx0aGlzLmNlbnRyb2lkcz1bXSx2b2lkIDAhPT10JiYodGhpcy5kYXRhc2V0PXQpLHZvaWQgMCE9PWUmJih0aGlzLms9ZSksdm9pZCAwIT09biYmKHRoaXMuZGlzdGFuY2U9bil9LGUucHJvdG90eXBlLnJ1bj1mdW5jdGlvbih0LGUpe3RoaXMuaW5pdCh0LGUpO2Zvcih2YXIgbj10aGlzLmRhdGFzZXQubGVuZ3RoLHI9MDtyPHRoaXMuaztyKyspdGhpcy5jZW50cm9pZHNbcl09dGhpcy5yYW5kb21DZW50cm9pZCgpO2Zvcih2YXIgaT0hMDtpOyl7aT10aGlzLmFzc2lnbigpO2Zvcih2YXIgbz0wO288dGhpcy5rO28rKyl7Zm9yKHZhciBzPW5ldyBBcnJheShsKSxhPTAsdT0wO3U8bDt1Kyspc1t1XT0wO2Zvcih2YXIgYz0wO2M8bjtjKyspe3ZhciBsPXRoaXMuZGF0YXNldFtjXS5sZW5ndGg7aWYobz09PXRoaXMuYXNzaWdubWVudHNbY10pe2Zvcih1PTA7dTxsO3UrKylzW3VdKz10aGlzLmRhdGFzZXRbY11bdV07YSsrfX1pZihhPjApe2Zvcih1PTA7dTxsO3UrKylzW3VdLz1hO3RoaXMuY2VudHJvaWRzW29dPXN9ZWxzZSB0aGlzLmNlbnRyb2lkc1tvXT10aGlzLnJhbmRvbUNlbnRyb2lkKCksaT0hMH19cmV0dXJuIHRoaXMuZ2V0Q2x1c3RlcnMoKX0sZS5wcm90b3R5cGUucmFuZG9tQ2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcy5kYXRhc2V0Lmxlbmd0aC0xO2Rve2U9TWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpKm4pLHQ9dGhpcy5kYXRhc2V0W2VdfXdoaWxlKHRoaXMuY2VudHJvaWRzLmluZGV4T2YodCk+PTApO3JldHVybiB0fSxlLnByb3RvdHlwZS5hc3NpZ249ZnVuY3Rpb24oKXtmb3IodmFyIHQsZT0hMSxuPXRoaXMuZGF0YXNldC5sZW5ndGgscj0wO3I8bjtyKyspKHQ9dGhpcy5hcmdtaW4odGhpcy5kYXRhc2V0W3JdLHRoaXMuY2VudHJvaWRzLHRoaXMuZGlzdGFuY2UpKSE9dGhpcy5hc3NpZ25tZW50c1tyXSYmKHRoaXMuYXNzaWdubWVudHNbcl09dCxlPSEwKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0Q2x1c3RlcnM9ZnVuY3Rpb24oKXtmb3IodmFyIHQsZT1uZXcgQXJyYXkodGhpcy5rKSxuPTA7bjx0aGlzLmFzc2lnbm1lbnRzLmxlbmd0aDtuKyspdm9pZCAwPT09ZVt0PXRoaXMuYXNzaWdubWVudHNbbl1dJiYoZVt0XT1bXSksZVt0XS5wdXNoKG4pO3JldHVybiBlfSxlLnByb3RvdHlwZS5hcmdtaW49ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcixpPU51bWJlci5NQVhfVkFMVUUsbz0wLHM9ZS5sZW5ndGgsYT0wO2E8czthKyspKHI9bih0LGVbYV0pKTxpJiYoaT1yLG89YSk7cmV0dXJuIG99LGUucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCk7ci0tOyl7dmFyIGk9dFtyXS1lW3JdO24rPWkqaX1yZXR1cm4gTWF0aC5zcXJ0KG4pfSx0LmV4cG9ydHMmJih0LmV4cG9ydHM9ZSl9KSksX3I9SmUoKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxlLG4pe3RoaXMuX3F1ZXVlPVtdLHRoaXMuX3ByaW9yaXRpZXM9W10sdGhpcy5fc29ydGluZz0iZGVzYyIsdGhpcy5faW5pdCh0LGUsbil9ZS5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMuX3F1ZXVlLmxlbmd0aCxyPW47ci0tOyl7dmFyIGk9dGhpcy5fcHJpb3JpdGllc1tyXTsiZGVzYyI9PT10aGlzLl9zb3J0aW5nP2U+aSYmKG49cik6ZTxpJiYobj1yKX10aGlzLl9pbnNlcnRBdCh0LGUsbil9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fcXVldWUubGVuZ3RoO2UtLTspe2lmKHQ9PT10aGlzLl9xdWV1ZVtlXSl7dGhpcy5fcXVldWUuc3BsaWNlKGUsMSksdGhpcy5fcHJpb3JpdGllcy5zcGxpY2UoZSwxKTticmVha319fSxlLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe3RoaXMuX3F1ZXVlLmZvckVhY2godCl9LGUucHJvdG90eXBlLmdldEVsZW1lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3F1ZXVlfSxlLnByb3RvdHlwZS5nZXRFbGVtZW50UHJpb3JpdHk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3ByaW9yaXRpZXNbdF19LGUucHJvdG90eXBlLmdldFByaW9yaXRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJpb3JpdGllc30sZS5wcm90b3R5cGUuZ2V0RWxlbWVudHNXaXRoUHJpb3JpdGllcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9xdWV1ZS5sZW5ndGg7ZTxuO2UrKyl0LnB1c2goW3RoaXMuX3F1ZXVlW2VdLHRoaXMuX3ByaW9yaXRpZXNbZV1dKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCxlLG4pe2lmKHQmJmUpe2lmKHRoaXMuX3F1ZXVlPVtdLHRoaXMuX3ByaW9yaXRpZXM9W10sdC5sZW5ndGghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkFycmF5cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIik7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspdGhpcy5pbnNlcnQodFtyXSxlW3JdKX1uJiYodGhpcy5fc29ydGluZz1uKX0sZS5wcm90b3R5cGUuX2luc2VydEF0PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9xdWV1ZS5sZW5ndGg9PT1uPyh0aGlzLl9xdWV1ZS5wdXNoKHQpLHRoaXMuX3ByaW9yaXRpZXMucHVzaChlKSk6KHRoaXMuX3F1ZXVlLnNwbGljZShuLDAsdCksdGhpcy5fcHJpb3JpdGllcy5zcGxpY2UobiwwLGUpKX0sdC5leHBvcnRzJiYodC5leHBvcnRzPWUpfSkpLHhyPUplKChmdW5jdGlvbih0KXtpZih0LmV4cG9ydHMpdmFyIGU9X3I7ZnVuY3Rpb24gbih0LGUsbixyKXt0aGlzLmVwc2lsb249MSx0aGlzLm1pblB0cz0xLHRoaXMuZGlzdGFuY2U9dGhpcy5fZXVjbGlkZWFuRGlzdGFuY2UsdGhpcy5fcmVhY2hhYmlsaXR5PVtdLHRoaXMuX3Byb2Nlc3NlZD1bXSx0aGlzLl9jb3JlRGlzdGFuY2U9MCx0aGlzLl9vcmRlcmVkTGlzdD1bXSx0aGlzLl9pbml0KHQsZSxuLHIpfW4ucHJvdG90eXBlLnJ1bj1mdW5jdGlvbih0LG4scixpKXt0aGlzLl9pbml0KHQsbixyLGkpO2Zvcih2YXIgbz0wLHM9dGhpcy5kYXRhc2V0Lmxlbmd0aDtvPHM7bysrKWlmKDEhPT10aGlzLl9wcm9jZXNzZWRbb10pe3RoaXMuX3Byb2Nlc3NlZFtvXT0xLHRoaXMuY2x1c3RlcnMucHVzaChbb10pO3ZhciBhPXRoaXMuY2x1c3RlcnMubGVuZ3RoLTE7dGhpcy5fb3JkZXJlZExpc3QucHVzaChvKTt2YXIgdT1uZXcgZShudWxsLG51bGwsImFzYyIpLGM9dGhpcy5fcmVnaW9uUXVlcnkobyk7dm9pZCAwIT09dGhpcy5fZGlzdGFuY2VUb0NvcmUobykmJih0aGlzLl91cGRhdGVRdWV1ZShvLGMsdSksdGhpcy5fZXhwYW5kQ2x1c3RlcihhLHUpKX1yZXR1cm4gdGhpcy5jbHVzdGVyc30sbi5wcm90b3R5cGUuZ2V0UmVhY2hhYmlsaXR5UGxvdD1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9vcmRlcmVkTGlzdC5sZW5ndGg7ZTxuO2UrKyl7dmFyIHI9dGhpcy5fb3JkZXJlZExpc3RbZV0saT10aGlzLl9yZWFjaGFiaWxpdHlbcl07dC5wdXNoKFtyLGldKX1yZXR1cm4gdH0sbi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24odCxlLG4scil7aWYodCl7aWYoISh0IGluc3RhbmNlb2YgQXJyYXkpKXRocm93IEVycm9yKCJEYXRhc2V0IG11c3QgYmUgb2YgdHlwZSBhcnJheSwgIit0eXBlb2YgdCsiIGdpdmVuIik7dGhpcy5kYXRhc2V0PXQsdGhpcy5jbHVzdGVycz1bXSx0aGlzLl9yZWFjaGFiaWxpdHk9bmV3IEFycmF5KHRoaXMuZGF0YXNldC5sZW5ndGgpLHRoaXMuX3Byb2Nlc3NlZD1uZXcgQXJyYXkodGhpcy5kYXRhc2V0Lmxlbmd0aCksdGhpcy5fY29yZURpc3RhbmNlPTAsdGhpcy5fb3JkZXJlZExpc3Q9W119ZSYmKHRoaXMuZXBzaWxvbj1lKSxuJiYodGhpcy5taW5QdHM9biksciYmKHRoaXMuZGlzdGFuY2U9cil9LG4ucHJvdG90eXBlLl91cGRhdGVRdWV1ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpczt0aGlzLl9jb3JlRGlzdGFuY2U9dGhpcy5fZGlzdGFuY2VUb0NvcmUodCksZS5mb3JFYWNoKChmdW5jdGlvbihlKXtpZih2b2lkIDA9PT1yLl9wcm9jZXNzZWRbZV0pe3ZhciBpPXIuZGlzdGFuY2Uoci5kYXRhc2V0W3RdLHIuZGF0YXNldFtlXSksbz1NYXRoLm1heChyLl9jb3JlRGlzdGFuY2UsaSk7dm9pZCAwPT09ci5fcmVhY2hhYmlsaXR5W2VdPyhyLl9yZWFjaGFiaWxpdHlbZV09byxuLmluc2VydChlLG8pKTpvPHIuX3JlYWNoYWJpbGl0eVtlXSYmKHIuX3JlYWNoYWJpbGl0eVtlXT1vLG4ucmVtb3ZlKGUpLG4uaW5zZXJ0KGUsbykpfX0pKX0sbi5wcm90b3R5cGUuX2V4cGFuZENsdXN0ZXI9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5nZXRFbGVtZW50cygpLHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07aWYodm9pZCAwPT09dGhpcy5fcHJvY2Vzc2VkW29dKXt2YXIgcz10aGlzLl9yZWdpb25RdWVyeShvKTt0aGlzLl9wcm9jZXNzZWRbb109MSx0aGlzLmNsdXN0ZXJzW3RdLnB1c2gobyksdGhpcy5fb3JkZXJlZExpc3QucHVzaChvKSx2b2lkIDAhPT10aGlzLl9kaXN0YW5jZVRvQ29yZShvKSYmKHRoaXMuX3VwZGF0ZVF1ZXVlKG8scyxlKSx0aGlzLl9leHBhbmRDbHVzdGVyKHQsZSkpfX19LG4ucHJvdG90eXBlLl9kaXN0YW5jZVRvQ29yZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5lcHNpbG9uLG49MDtuPGU7bisrKXtpZih0aGlzLl9yZWdpb25RdWVyeSh0LG4pLmxlbmd0aD49dGhpcy5taW5QdHMpcmV0dXJuIG59fSxuLnByb3RvdHlwZS5fcmVnaW9uUXVlcnk9ZnVuY3Rpb24odCxlKXtlPWV8fHRoaXMuZXBzaWxvbjtmb3IodmFyIG49W10scj0wLGk9dGhpcy5kYXRhc2V0Lmxlbmd0aDtyPGk7cisrKXRoaXMuZGlzdGFuY2UodGhpcy5kYXRhc2V0W3RdLHRoaXMuZGF0YXNldFtyXSk8ZSYmbi5wdXNoKHIpO3JldHVybiBufSxuLnByb3RvdHlwZS5fZXVjbGlkZWFuRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxyPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKTtyLS07KW4rPSh0W3JdLWVbcl0pKih0W3JdLWVbcl0pO3JldHVybiBNYXRoLnNxcnQobil9LHQuZXhwb3J0cyYmKHQuZXhwb3J0cz1uKX0pKSx3cj1KZSgoZnVuY3Rpb24odCl7dC5leHBvcnRzJiYodC5leHBvcnRzPXtEQlNDQU46bXIsS01FQU5TOnZyLE9QVElDUzp4cixQcmlvcml0eVF1ZXVlOl9yfSl9KSk7ZnVuY3Rpb24gYnIoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBEcih0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIEVyKHQsZSl7dmFyIG49ZSxyPWUuUixpPW4uVTtpP2kuTD09PW4/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksbi5VPXIsbi5SPXIuTCxuLlImJihuLlIuVT1uKSxyLkw9bn1mdW5jdGlvbiBDcih0LGUpe3ZhciBuPWUscj1lLkwsaT1uLlU7aT9pLkw9PT1uP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLG4uVT1yLG4uTD1yLlIsbi5MJiYobi5MLlU9biksci5SPW59ZnVuY3Rpb24gU3IodCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIEFyKHQsZSxuLHIpe3ZhciBpPVtudWxsLG51bGxdLG89SnIucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PWUsbiYmSXIoaSx0LGUsbiksciYmSXIoaSxlLHQsciksWnJbdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksWnJbZS5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBOcih0LGUsbil7dmFyIHI9W2Usbl07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gSXIodCxlLG4scil7dFswXXx8dFsxXT90LmxlZnQ9PT1uP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9ZSx0LnJpZ2h0PW4pfWZ1bmN0aW9uIE1yKHQsZSxuLHIsaSl7dmFyIG8scz10WzBdLGE9dFsxXSx1PXNbMF0sYz1zWzFdLGw9MCxoPTEsZj1hWzBdLXUscD1hWzFdLWM7aWYobz1lLXUsZnx8IShvPjApKXtpZihvLz1mLGY8MCl7aWYobzxsKXJldHVybjtvPGgmJihoPW8pfWVsc2UgaWYoZj4wKXtpZihvPmgpcmV0dXJuO28+bCYmKGw9byl9aWYobz1yLXUsZnx8IShvPDApKXtpZihvLz1mLGY8MCl7aWYobz5oKXJldHVybjtvPmwmJihsPW8pfWVsc2UgaWYoZj4wKXtpZihvPGwpcmV0dXJuO288aCYmKGg9byl9aWYobz1uLWMscHx8IShvPjApKXtpZihvLz1wLHA8MCl7aWYobzxsKXJldHVybjtvPGgmJihoPW8pfWVsc2UgaWYocD4wKXtpZihvPmgpcmV0dXJuO28+bCYmKGw9byl9aWYobz1pLWMscHx8IShvPDApKXtpZihvLz1wLHA8MCl7aWYobz5oKXJldHVybjtvPmwmJihsPW8pfWVsc2UgaWYocD4wKXtpZihvPGwpcmV0dXJuO288aCYmKGg9byl9cmV0dXJuIShsPjApJiYhKGg8MSl8fChsPjAmJih0WzBdPVt1K2wqZixjK2wqcF0pLGg8MSYmKHRbMV09W3UraCpmLGMraCpwXSkpLCEwfX19fX1mdW5jdGlvbiBGcih0LGUsbixyLGkpe3ZhciBvPXRbMV07aWYobylyZXR1cm4hMDt2YXIgcyxhLHU9dFswXSxjPXQubGVmdCxsPXQucmlnaHQsaD1jWzBdLGY9Y1sxXSxwPWxbMF0sZD1sWzFdLGc9KGgrcCkvMix5PShmK2QpLzI7aWYoZD09PWYpe2lmKGc8ZXx8Zz49cilyZXR1cm47aWYoaD5wKXtpZih1KXtpZih1WzFdPj1pKXJldHVybn1lbHNlIHU9W2csbl07bz1bZyxpXX1lbHNle2lmKHUpe2lmKHVbMV08bilyZXR1cm59ZWxzZSB1PVtnLGldO289W2csbl19fWVsc2UgaWYoYT15LShzPShoLXApLyhkLWYpKSpnLHM8LTF8fHM+MSlpZihoPnApe2lmKHUpe2lmKHVbMV0+PWkpcmV0dXJufWVsc2UgdT1bKG4tYSkvcyxuXTtvPVsoaS1hKS9zLGldfWVsc2V7aWYodSl7aWYodVsxXTxuKXJldHVybn1lbHNlIHU9WyhpLWEpL3MsaV07bz1bKG4tYSkvcyxuXX1lbHNlIGlmKGY8ZCl7aWYodSl7aWYodVswXT49cilyZXR1cm59ZWxzZSB1PVtlLHMqZSthXTtvPVtyLHMqcithXX1lbHNle2lmKHUpe2lmKHVbMF08ZSlyZXR1cm59ZWxzZSB1PVtyLHMqcithXTtvPVtlLHMqZSthXX1yZXR1cm4gdFswXT11LHRbMV09bywhMH1mdW5jdGlvbiBUcih0LGUpe3ZhciBuPXQuc2l0ZSxyPWUubGVmdCxpPWUucmlnaHQ7cmV0dXJuIG49PT1pJiYoaT1yLHI9biksaT9NYXRoLmF0YW4yKGlbMV0tclsxXSxpWzBdLXJbMF0pOihuPT09cj8ocj1lWzFdLGk9ZVswXSk6KHI9ZVswXSxpPWVbMV0pLE1hdGguYXRhbjIoclswXS1pWzBdLGlbMV0tclsxXSkpfWZ1bmN0aW9uIE9yKHQsZSl7cmV0dXJuIGVbKyhlLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiBMcih0LGUpe3JldHVybiBlWysoZS5sZWZ0PT09dC5zaXRlKV19d3IuREJTQ0FOLHdyLktNRUFOUyx3ci5PUFRJQ1Msd3IuUHJpb3JpdHlRdWV1ZSxici5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmJyLGluc2VydDpmdW5jdGlvbih0LGUpe3ZhciBuLHIsaTtpZih0KXtpZihlLlA9dCxlLk49dC5OLHQuTiYmKHQuTi5QPWUpLHQuTj1lLHQuUil7Zm9yKHQ9dC5SO3QuTDspdD10Lkw7dC5MPWV9ZWxzZSB0LlI9ZTtuPXR9ZWxzZSB0aGlzLl8/KHQ9U3IodGhpcy5fKSxlLlA9bnVsbCxlLk49dCx0LlA9dC5MPWUsbj10KTooZS5QPWUuTj1udWxsLHRoaXMuXz1lLG49bnVsbCk7Zm9yKGUuTD1lLlI9bnVsbCxlLlU9bixlLkM9ITAsdD1lO24mJm4uQzspbj09PShyPW4uVSkuTD8oaT1yLlIpJiZpLkM/KG4uQz1pLkM9ITEsci5DPSEwLHQ9cik6KHQ9PT1uLlImJihFcih0aGlzLG4pLG49KHQ9bikuVSksbi5DPSExLHIuQz0hMCxDcih0aGlzLHIpKTooaT1yLkwpJiZpLkM/KG4uQz1pLkM9ITEsci5DPSEwLHQ9cik6KHQ9PT1uLkwmJihDcih0aGlzLG4pLG49KHQ9bikuVSksbi5DPSExLHIuQz0hMCxFcih0aGlzLHIpKSxuPXQuVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3QuTiYmKHQuTi5QPXQuUCksdC5QJiYodC5QLk49dC5OKSx0Lk49dC5QPW51bGw7dmFyIGUsbixyLGk9dC5VLG89dC5MLHM9dC5SO2lmKG49bz9zP1NyKHMpOm86cyxpP2kuTD09PXQ/aS5MPW46aS5SPW46dGhpcy5fPW4sbyYmcz8ocj1uLkMsbi5DPXQuQyxuLkw9byxvLlU9bixuIT09cz8oaT1uLlUsbi5VPXQuVSx0PW4uUixpLkw9dCxuLlI9cyxzLlU9bik6KG4uVT1pLGk9bix0PW4uUikpOihyPXQuQyx0PW4pLHQmJih0LlU9aSksIXIpe2lmKHQmJnQuQylyZXR1cm4gdm9pZCh0LkM9ITEpO2Rve2lmKHQ9PT10aGlzLl8pYnJlYWs7aWYodD09PWkuTCl7aWYoKGU9aS5SKS5DJiYoZS5DPSExLGkuQz0hMCxFcih0aGlzLGkpLGU9aS5SKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXsoIWUuUnx8IWUuUi5DKSYmKGUuTC5DPSExLGUuQz0hMCxDcih0aGlzLGUpLGU9aS5SKSxlLkM9aS5DLGkuQz1lLlIuQz0hMSxFcih0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChlPWkuTCkuQyYmKGUuQz0hMSxpLkM9ITAsQ3IodGhpcyxpKSxlPWkuTCksZS5MJiZlLkwuQ3x8ZS5SJiZlLlIuQyl7KCFlLkx8fCFlLkwuQykmJihlLlIuQz0hMSxlLkM9ITAsRXIodGhpcyxlKSxlPWkuTCksZS5DPWkuQyxpLkM9ZS5MLkM9ITEsQ3IodGhpcyxpKSx0PXRoaXMuXzticmVha31lLkM9ITAsdD1pLGk9aS5VfXdoaWxlKCF0LkMpO3QmJih0LkM9ITEpfX19O3ZhciBQcixScj1bXTtmdW5jdGlvbiBCcigpe0RyKHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH1mdW5jdGlvbiBrcih0KXt2YXIgZT10LlAsbj10Lk47aWYoZSYmbil7dmFyIHI9ZS5zaXRlLGk9dC5zaXRlLG89bi5zaXRlO2lmKHIhPT1vKXt2YXIgcz1pWzBdLGE9aVsxXSx1PXJbMF0tcyxjPXJbMV0tYSxsPW9bMF0tcyxoPW9bMV0tYSxmPTIqKHUqaC1jKmwpO2lmKCEoZj49LSRyKSl7dmFyIHA9dSp1K2MqYyxkPWwqbCtoKmgsZz0oaCpwLWMqZCkvZix5PSh1KmQtbCpwKS9mLG09UnIucG9wKCl8fG5ldyBCcjttLmFyYz10LG0uc2l0ZT1pLG0ueD1nK3MsbS55PShtLmN5PXkrYSkrTWF0aC5zcXJ0KGcqZyt5KnkpLHQuY2lyY2xlPW07Zm9yKHZhciB2PW51bGwsXz1Lci5fO187KWlmKG0ueTxfLnl8fG0ueT09PV8ueSYmbS54PD1fLngpe2lmKCFfLkwpe3Y9Xy5QO2JyZWFrfV89Xy5MfWVsc2V7aWYoIV8uUil7dj1fO2JyZWFrfV89Xy5SfUtyLmluc2VydCh2LG0pLHZ8fChQcj1tKX19fX1mdW5jdGlvbiB6cih0KXt2YXIgZT10LmNpcmNsZTtlJiYoZS5QfHwoUHI9ZS5OKSxLci5yZW1vdmUoZSksUnIucHVzaChlKSxEcihlKSx0LmNpcmNsZT1udWxsKX12YXIganI9W107ZnVuY3Rpb24gVXIoKXtEcih0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gcXIodCl7dmFyIGU9anIucG9wKCl8fG5ldyBVcjtyZXR1cm4gZS5zaXRlPXQsZX1mdW5jdGlvbiBWcih0KXt6cih0KSxIci5yZW1vdmUodCksanIucHVzaCh0KSxEcih0KX1mdW5jdGlvbiBHcih0KXt2YXIgZT10LmNpcmNsZSxuPWUueCxyPWUuY3ksaT1bbixyXSxvPXQuUCxzPXQuTixhPVt0XTtWcih0KTtmb3IodmFyIHU9bzt1LmNpcmNsZSYmTWF0aC5hYnMobi11LmNpcmNsZS54KTxRciYmTWF0aC5hYnMoci11LmNpcmNsZS5jeSk8UXI7KW89dS5QLGEudW5zaGlmdCh1KSxWcih1KSx1PW87YS51bnNoaWZ0KHUpLHpyKHUpO2Zvcih2YXIgYz1zO2MuY2lyY2xlJiZNYXRoLmFicyhuLWMuY2lyY2xlLngpPFFyJiZNYXRoLmFicyhyLWMuY2lyY2xlLmN5KTxRcjspcz1jLk4sYS5wdXNoKGMpLFZyKGMpLGM9czthLnB1c2goYyksenIoYyk7dmFyIGwsaD1hLmxlbmd0aDtmb3IobD0xO2w8aDsrK2wpYz1hW2xdLHU9YVtsLTFdLElyKGMuZWRnZSx1LnNpdGUsYy5zaXRlLGkpO3U9YVswXSwoYz1hW2gtMV0pLmVkZ2U9QXIodS5zaXRlLGMuc2l0ZSxudWxsLGkpLGtyKHUpLGtyKGMpfWZ1bmN0aW9uIFlyKHQpe2Zvcih2YXIgZSxuLHIsaSxvPXRbMF0scz10WzFdLGE9SHIuXzthOylpZigocj1YcihhLHMpLW8pPlFyKWE9YS5MO2Vsc2V7aWYoISgoaT1vLVdyKGEscykpPlFyKSl7cj4tUXI/KGU9YS5QLG49YSk6aT4tUXI/KGU9YSxuPWEuTik6ZT1uPWE7YnJlYWt9aWYoIWEuUil7ZT1hO2JyZWFrfWE9YS5SfSFmdW5jdGlvbih0KXtaclt0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19KHQpO3ZhciB1PXFyKHQpO2lmKEhyLmluc2VydChlLHUpLGV8fG4pe2lmKGU9PT1uKXJldHVybiB6cihlKSxuPXFyKGUuc2l0ZSksSHIuaW5zZXJ0KHUsbiksdS5lZGdlPW4uZWRnZT1BcihlLnNpdGUsdS5zaXRlKSxrcihlKSx2b2lkIGtyKG4pO2lmKCFuKXJldHVybiB2b2lkKHUuZWRnZT1BcihlLnNpdGUsdS5zaXRlKSk7enIoZSksenIobik7dmFyIGM9ZS5zaXRlLGw9Y1swXSxoPWNbMV0sZj10WzBdLWwscD10WzFdLWgsZD1uLnNpdGUsZz1kWzBdLWwseT1kWzFdLWgsbT0yKihmKnktcCpnKSx2PWYqZitwKnAsXz1nKmcreSp5LHg9Wyh5KnYtcCpfKS9tK2wsKGYqXy1nKnYpL20raF07SXIobi5lZGdlLGMsZCx4KSx1LmVkZ2U9QXIoYyx0LG51bGwseCksbi5lZGdlPUFyKHQsZCxudWxsLHgpLGtyKGUpLGtyKG4pfX1mdW5jdGlvbiBYcih0LGUpe3ZhciBuPXQuc2l0ZSxyPW5bMF0saT1uWzFdLG89aS1lO2lmKCFvKXJldHVybiByO3ZhciBzPXQuUDtpZighcylyZXR1cm4tMS8wO3ZhciBhPShuPXMuc2l0ZSlbMF0sdT1uWzFdLGM9dS1lO2lmKCFjKXJldHVybiBhO3ZhciBsPWEtcixoPTEvby0xL2MsZj1sL2M7cmV0dXJuIGg/KC1mK01hdGguc3FydChmKmYtMipoKihsKmwvKC0yKmMpLXUrYy8yK2ktby8yKSkpL2grcjoocithKS8yfWZ1bmN0aW9uIFdyKHQsZSl7dmFyIG49dC5OO2lmKG4pcmV0dXJuIFhyKG4sZSk7dmFyIHI9dC5zaXRlO3JldHVybiByWzFdPT09ZT9yWzBdOjEvMH12YXIgSHIsWnIsS3IsSnIsUXI9MWUtNiwkcj0xZS0xMjtmdW5jdGlvbiB0aSh0LGUsbil7cmV0dXJuKHRbMF0tblswXSkqKGVbMV0tdFsxXSktKHRbMF0tZVswXSkqKG5bMV0tdFsxXSl9ZnVuY3Rpb24gZWkodCxlKXtyZXR1cm4gZVsxXS10WzFdfHxlWzBdLXRbMF19ZnVuY3Rpb24gbmkodCxlKXt2YXIgbixyLGksbz10LnNvcnQoZWkpLnBvcCgpO2ZvcihKcj1bXSxacj1uZXcgQXJyYXkodC5sZW5ndGgpLEhyPW5ldyBicixLcj1uZXcgYnI7OylpZihpPVByLG8mJighaXx8b1sxXTxpLnl8fG9bMV09PT1pLnkmJm9bMF08aS54KSkob1swXSE9PW58fG9bMV0hPT1yKSYmKFlyKG8pLG49b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO0dyKGkuYXJjKX1pZihmdW5jdGlvbigpe2Zvcih2YXIgdCxlLG4scixpPTAsbz1aci5sZW5ndGg7aTxvOysraSlpZigodD1acltpXSkmJihyPShlPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgcz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkocik7Zm9yKG49MDtuPHI7KytuKXNbbl09bixhW25dPVRyKHQsSnJbZVtuXV0pO2ZvcihzLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFbZV0tYVt0XX0pKSxuPTA7bjxyOysrbilhW25dPWVbc1tuXV07Zm9yKG49MDtuPHI7KytuKWVbbl09YVtuXX19KCksZSl7dmFyIHM9K2VbMF1bMF0sYT0rZVswXVsxXSx1PStlWzFdWzBdLGM9K2VbMV1bMV07KGZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaSxvPUpyLmxlbmd0aDtvLS07KUZyKGk9SnJbb10sdCxlLG4scikmJk1yKGksdCxlLG4scikmJihNYXRoLmFicyhpWzBdWzBdLWlbMV1bMF0pPlFyfHxNYXRoLmFicyhpWzBdWzFdLWlbMV1bMV0pPlFyKXx8ZGVsZXRlIEpyW29dfSkocyxhLHUsYyksZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyxzLGEsdSxjLGwsaCxmLHAsZCxnLHk9WnIubGVuZ3RoLG09ITA7Zm9yKGk9MDtpPHk7KytpKWlmKG89WnJbaV0pe2ZvcihzPW8uc2l0ZSxhPSh1PW8uaGFsZmVkZ2VzKS5sZW5ndGg7YS0tOylKclt1W2FdXXx8dS5zcGxpY2UoYSwxKTtmb3IoYT0wLGM9dS5sZW5ndGg7YTxjOylkPShwPUxyKG8sSnJbdVthXV0pKVswXSxnPXBbMV0saD0obD1PcihvLEpyW3VbKythJWNdXSkpWzBdLGY9bFsxXSwoTWF0aC5hYnMoZC1oKT5Rcnx8TWF0aC5hYnMoZy1mKT5RcikmJih1LnNwbGljZShhLDAsSnIucHVzaChOcihzLHAsTWF0aC5hYnMoZC10KTxRciYmci1nPlFyP1t0LE1hdGguYWJzKGgtdCk8UXI/ZjpyXTpNYXRoLmFicyhnLXIpPFFyJiZuLWQ+UXI/W01hdGguYWJzKGYtcik8UXI/aDpuLHJdOk1hdGguYWJzKGQtbik8UXImJmctZT5Rcj9bbixNYXRoLmFicyhoLW4pPFFyP2Y6ZV06TWF0aC5hYnMoZy1lKTxRciYmZC10PlFyP1tNYXRoLmFicyhmLWUpPFFyP2g6dCxlXTpudWxsKSktMSksKytjKTtjJiYobT0hMSl9aWYobSl7dmFyIHYsXyx4LHc9MS8wO2ZvcihpPTAsbT1udWxsO2k8eTsrK2kpKG89WnJbaV0pJiYoeD0odj0ocz1vLnNpdGUpWzBdLXQpKnYrKF89c1sxXS1lKSpfKTx3JiYodz14LG09byk7aWYobSl7dmFyIGI9W3QsZV0sRD1bdCxyXSxFPVtuLHJdLEM9W24sZV07bS5oYWxmZWRnZXMucHVzaChKci5wdXNoKE5yKHM9bS5zaXRlLGIsRCkpLTEsSnIucHVzaChOcihzLEQsRSkpLTEsSnIucHVzaChOcihzLEUsQykpLTEsSnIucHVzaChOcihzLEMsYikpLTEpfX1mb3IoaT0wO2k8eTsrK2kpKG89WnJbaV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgWnJbaV0pfShzLGEsdSxjKX10aGlzLmVkZ2VzPUpyLHRoaXMuY2VsbHM9WnIsSHI9S3I9SnI9WnI9bnVsbH1mdW5jdGlvbiByaSh0KXtpZih2ZSh0KSYmKHQ9dC5iYm94KSx0JiYhQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgRXJyb3IoImJib3ggaXMgaW52YWxpZCIpO3JldHVybiB0P2Z1bmN0aW9uKHQpe3JldHVybltNYXRoLnJhbmRvbSgpKih0WzJdLXRbMF0pK3RbMF0sTWF0aC5yYW5kb20oKSoodFszXS10WzFdKSt0WzFdXX0odCk6WzM2MCpvaSgpLDE4MCpvaSgpXX1mdW5jdGlvbiBpaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuW2VbMF0rdFswXSxlWzFdK3RbMV1dfX1mdW5jdGlvbiBvaSgpe3JldHVybiBNYXRoLnJhbmRvbSgpLS41fWZ1bmN0aW9uIHNpKHQsZSxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gaXMgcmVxdWlyZWQiKTtpZigiRmVhdHVyZUNvbGxlY3Rpb24iIT09dC50eXBlKXRocm93IG5ldyBFcnJvcigiZ2VvanNvbiBtdXN0IGJlIGEgRmVhdHVyZUNvbGxlY3Rpb24iKTtpZihudWxsPT1lKXRocm93IG5ldyBFcnJvcigicHJvcGVydHkgaXMgcmVxdWlyZWQiKTtmb3IodmFyIHI9YWkodCxlKSxpPU9iamVjdC5rZXlzKHIpLG89MDtvPGkubGVuZ3RoO28rKyl7Zm9yKHZhciBzPWlbb10sYT1yW3NdLHU9W10sYz0wO2M8YS5sZW5ndGg7YysrKXUucHVzaCh0LmZlYXR1cmVzW2FbY11dKTtuKGxlKHUpLHMsbyl9fWZ1bmN0aW9uIGFpKHQsZSl7dmFyIG49e307cmV0dXJuIEVlKHQsKGZ1bmN0aW9uKHQscil7dmFyIGk9dC5wcm9wZXJ0aWVzfHx7fTtpZihpLmhhc093blByb3BlcnR5KGUpKXt2YXIgbz1pW2VdO24uaGFzT3duUHJvcGVydHkobyk/bltvXS5wdXNoKHIpOm5bb109W3JdfX0pKSxufWZ1bmN0aW9uIHVpKHQsZSl7aWYodm9pZCAwPT09dClyZXR1cm4hMTt2YXIgbj10eXBlb2YgZTtpZigibnVtYmVyIj09PW58fCJzdHJpbmciPT09bilyZXR1cm4gdC5oYXNPd25Qcm9wZXJ0eShlKTtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKylpZighdWkodCxlW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gY2kodCxlKX1mdW5jdGlvbiBjaSh0LGUpe2Zvcih2YXIgbj1PYmplY3Qua2V5cyhlKSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBpPW5bcl07aWYodFtpXSE9PWVbaV0pcmV0dXJuITF9cmV0dXJuITB9bmkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpuaSxwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKChmdW5jdGlvbihlKXt2YXIgbj1lLmhhbGZlZGdlcy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBPcihlLHRbbl0pfSkpO3JldHVybiBuLmRhdGE9ZS5zaXRlLmRhdGEsbn0pKX0sdHJpYW5nbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9W10sZT10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLmZvckVhY2goKGZ1bmN0aW9uKG4scil7aWYobz0oaT1uLmhhbGZlZGdlcykubGVuZ3RoKWZvcih2YXIgaSxvLHMsYT1uLnNpdGUsdT0tMSxjPWVbaVtvLTFdXSxsPWMubGVmdD09PWE/Yy5yaWdodDpjLmxlZnQ7Kyt1PG87KXM9bCxsPShjPWVbaVt1XV0pLmxlZnQ9PT1hP2MucmlnaHQ6Yy5sZWZ0LHMmJmwmJnI8cy5pbmRleCYmcjxsLmluZGV4JiZ0aShhLHMsbCk8MCYmdC5wdXNoKFthLmRhdGEscy5kYXRhLGwuZGF0YV0pfSkpLHR9LGxpbmtzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6dC5sZWZ0LmRhdGEsdGFyZ2V0OnQucmlnaHQuZGF0YX19KSl9LGZpbmQ6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcixpLG89dGhpcyxzPW8uX2ZvdW5kfHwwLGE9by5jZWxscy5sZW5ndGg7IShpPW8uY2VsbHNbc10pOylpZigrK3M+PWEpcmV0dXJuIG51bGw7dmFyIHU9dC1pLnNpdGVbMF0sYz1lLWkuc2l0ZVsxXSxsPXUqdStjKmM7ZG97aT1vLmNlbGxzW3I9c10scz1udWxsLGkuaGFsZmVkZ2VzLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciByPW8uZWRnZXNbbl0sYT1yLmxlZnQ7aWYoYSE9PWkuc2l0ZSYmYXx8KGE9ci5yaWdodCkpe3ZhciB1PXQtYVswXSxjPWUtYVsxXSxoPXUqdStjKmM7aDxsJiYobD1oLHM9YS5pbmRleCl9fSkpfXdoaWxlKG51bGwhPT1zKTtyZXR1cm4gby5fZm91bmQ9cixudWxsPT1ufHxsPD1uKm4/aS5zaXRlOm51bGx9fSxPYmplY3QuZnJlZXplKHtyYW5kb21Qb3NpdGlvbjpyaSxyYW5kb21Qb2ludDpmdW5jdGlvbih0LGUpe2lmKCF2ZShlPWV8fHt9KSl0aHJvdyBuZXcgRXJyb3IoIm9wdGlvbnMgaXMgaW52YWxpZCIpO3ZhciBuPWUuYmJveDtudWxsPT10JiYodD0xKTtmb3IodmFyIHI9W10saT0wO2k8dDtpKyspci5wdXNoKGFlKHJpKG4pKSk7cmV0dXJuIGxlKHIpfSxyYW5kb21Qb2x5Z29uOmZ1bmN0aW9uKHQsZSl7aWYoIXZlKGU9ZXx8e30pKXRocm93IG5ldyBFcnJvcigib3B0aW9ucyBpcyBpbnZhbGlkIik7dmFyIG49ZS5iYm94LHI9ZS5udW1fdmVydGljZXMsaT1lLm1heF9yYWRpYWxfbGVuZ3RoO251bGw9PXQmJih0PTEpLG1lKHIpfHwocj0xMCksbWUoaSl8fChpPTEwKTtmb3IodmFyIG89W10scz0wO3M8dDtzKyspe3ZhciBhPVtdLHU9QXJyYXkuYXBwbHkobnVsbCxuZXcgQXJyYXkocisxKSkubWFwKE1hdGgucmFuZG9tKTt1LmZvckVhY2goYyksdS5mb3JFYWNoKGwpLGFbYS5sZW5ndGgtMV09YVswXSxhPWEubWFwKGlpKHJpKG4pKSksby5wdXNoKHVlKFthXSkpfWZ1bmN0aW9uIGModCxlLG4pe25bZV09ZT4wP3QrbltlLTFdOnR9ZnVuY3Rpb24gbCh0KXt0PTIqdCpNYXRoLlBJL3VbdS5sZW5ndGgtMV07dmFyIGU9TWF0aC5yYW5kb20oKTthLnB1c2goW2UqaSpNYXRoLnNpbih0KSxlKmkqTWF0aC5jb3ModCldKX1yZXR1cm4gbGUobyl9LHJhbmRvbUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtpZighdmUoZT1lfHx7fSkpdGhyb3cgbmV3IEVycm9yKCJvcHRpb25zIGlzIGludmFsaWQiKTt2YXIgbj1lLmJib3gscj1lLm51bV92ZXJ0aWNlcyxpPWUubWF4X2xlbmd0aCxvPWUubWF4X3JvdGF0aW9uO251bGw9PXQmJih0PTEpLCghbWUocil8fHI8MikmJihyPTEwKSxtZShpKXx8KGk9MWUtNCksbWUobyl8fChvPU1hdGguUEkvOCk7Zm9yKHZhciBzPVtdLGE9MDthPHQ7YSsrKXtmb3IodmFyIHU9W3JpKG4pXSxjPTA7YzxyLTE7YysrKXt2YXIgbD0oMD09PWM/MipNYXRoLnJhbmRvbSgpKk1hdGguUEk6TWF0aC50YW4oKHVbY11bMV0tdVtjLTFdWzFdKS8odVtjXVswXS11W2MtMV1bMF0pKSkrKE1hdGgucmFuZG9tKCktLjUpKm8qMixoPU1hdGgucmFuZG9tKCkqaTt1LnB1c2goW3VbY11bMF0raCpNYXRoLmNvcyhsKSx1W2NdWzFdK2gqTWF0aC5zaW4obCldKX1zLnB1c2goY2UodSkpfXJldHVybiBsZShzKX19KSxPYmplY3QuZnJlZXplKHtnZXRDbHVzdGVyOmZ1bmN0aW9uKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJnZW9qc29uIGlzIHJlcXVpcmVkIik7aWYoIkZlYXR1cmVDb2xsZWN0aW9uIiE9PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoImdlb2pzb24gbXVzdCBiZSBhIEZlYXR1cmVDb2xsZWN0aW9uIik7aWYobnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoImZpbHRlciBpcyByZXF1aXJlZCIpO3ZhciBuPVtdO3JldHVybiBFZSh0LChmdW5jdGlvbih0KXt1aSh0LnByb3BlcnRpZXMsZSkmJm4ucHVzaCh0KX0pKSxsZShuKX0sY2x1c3RlckVhY2g6c2ksY2x1c3RlclJlZHVjZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1yO3JldHVybiBzaSh0LGUsKGZ1bmN0aW9uKHQsZSxvKXtpPTA9PT1vJiZ2b2lkIDA9PT1yP3Q6bihpLHQsZSxvKX0pKSxpfSxjcmVhdGVCaW5zOmFpLGFwcGx5RmlsdGVyOnVpLHByb3BlcnRpZXNDb250YWluc0ZpbHRlcjpjaSxmaWx0ZXJQcm9wZXJ0aWVzOmZ1bmN0aW9uKHQsZSl7aWYoIWUpcmV0dXJue307aWYoIWUubGVuZ3RoKXJldHVybnt9O2Zvcih2YXIgbj17fSxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07dC5oYXNPd25Qcm9wZXJ0eShpKSYmKG5baV09dFtpXSl9cmV0dXJuIG59fSksImZpbGwiaW4gQXJyYXkucHJvdG90eXBlfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCJmaWxsIix7Y29uZmlndXJhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKG51bGw9PXRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcih0aGlzKyIgaXMgbm90IGFuIG9iamVjdCIpO3ZhciBlPU9iamVjdCh0aGlzKSxuPU1hdGgubWF4KE1hdGgubWluKGUubGVuZ3RoLDkwMDcxOTkyNTQ3NDA5OTEpLDApfHwwLHI9MSBpbiBhcmd1bWVudHMmJnBhcnNlSW50KE51bWJlcihhcmd1bWVudHNbMV0pLDEwKXx8MDtyPXI8MD9NYXRoLm1heChuK3IsMCk6TWF0aC5taW4ocixuKTt2YXIgaT0yIGluIGFyZ3VtZW50cyYmdm9pZCAwIT09YXJndW1lbnRzWzJdP3BhcnNlSW50KE51bWJlcihhcmd1bWVudHNbMl0pLDEwKXx8MDpuO2ZvcihpPWk8MD9NYXRoLm1heChuK2FyZ3VtZW50c1syXSwwKTpNYXRoLm1pbihpLG4pO3I8aTspZVtyXT10LCsrcjtyZXR1cm4gZX0sd3JpdGFibGU6ITB9KSxOdW1iZXIuaXNGaW5pdGU9TnVtYmVyLmlzRmluaXRlfHxmdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJmlzRmluaXRlKHQpfSxOdW1iZXIuaXNJbnRlZ2VyPU51bWJlci5pc0ludGVnZXJ8fGZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmaXNGaW5pdGUodCkmJk1hdGguZmxvb3IodCk9PT10fSxOdW1iZXIucGFyc2VGbG9hdD1OdW1iZXIucGFyc2VGbG9hdHx8cGFyc2VGbG9hdCxOdW1iZXIuaXNOYU49TnVtYmVyLmlzTmFOfHxmdW5jdGlvbih0KXtyZXR1cm4gdCE9dH0sTWF0aC50cnVuYz1NYXRoLnRydW5jfHxmdW5jdGlvbih0KXtyZXR1cm4gdDwwP01hdGguY2VpbCh0KTpNYXRoLmZsb29yKHQpfTt2YXIgbGk9ZnVuY3Rpb24oKXt9O2xpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxsaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbGl9LGxpLnByb3RvdHlwZS5lcXVhbHNXaXRoVG9sZXJhbmNlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5hYnModC1lKTw9bn07dmFyIGhpPWZ1bmN0aW9uKCl7fSxmaT1mdW5jdGlvbigpe30scGk9e01BWF9WQUxVRTp7Y29uZmlndXJhYmxlOiEwfX07ZmkuaXNOYU49ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlci5pc05hTih0KX0sZmkuZG91YmxlVG9Mb25nQml0cz1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZmkubG9uZ0JpdHNUb0RvdWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0sZmkuaXNJbmZpbml0ZT1mdW5jdGlvbih0KXtyZXR1cm4hTnVtYmVyLmlzRmluaXRlKHQpfSxwaS5NQVhfVkFMVUUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE51bWJlci5NQVhfVkFMVUV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGZpLHBpKTt2YXIgZGk9ZnVuY3Rpb24oKXt9LGdpPWZ1bmN0aW9uKCl7fSx5aT1mdW5jdGlvbigpe307ZnVuY3Rpb24gbWkoKXt9dmFyIHZpPWZ1bmN0aW9uIHQoKXtpZih0aGlzLng9bnVsbCx0aGlzLnk9bnVsbCx0aGlzLno9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLng9MCx0aGlzLnk9MCx0aGlzLno9dC5OVUxMX09SRElOQVRFO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLng9ZS54LHRoaXMueT1lLnksdGhpcy56PWUuen1lbHNlIDI9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLng9YXJndW1lbnRzWzBdLHRoaXMueT1hcmd1bWVudHNbMV0sdGhpcy56PXQuTlVMTF9PUkRJTkFURSk6Mz09PWFyZ3VtZW50cy5sZW5ndGgmJih0aGlzLng9YXJndW1lbnRzWzBdLHRoaXMueT1hcmd1bWVudHNbMV0sdGhpcy56PWFyZ3VtZW50c1syXSl9LF9pPXtEaW1lbnNpb25hbENvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0sc2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxOVUxMX09SRElOQVRFOntjb25maWd1cmFibGU6ITB9LFg6e2NvbmZpZ3VyYWJsZTohMH0sWTp7Y29uZmlndXJhYmxlOiEwfSxaOntjb25maWd1cmFibGU6ITB9fTt2aS5wcm90b3R5cGUuc2V0T3JkaW5hdGU9ZnVuY3Rpb24odCxlKXtzd2l0Y2godCl7Y2FzZSB2aS5YOnRoaXMueD1lO2JyZWFrO2Nhc2UgdmkuWTp0aGlzLnk9ZTticmVhaztjYXNlIHZpLlo6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgaGl9fSx2aS5wcm90b3R5cGUuZXF1YWxzMkQ9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiEodGhpcy54IT09dC54fHx0aGlzLnkhPT10LnkpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuISghbGkuZXF1YWxzV2l0aFRvbGVyYW5jZSh0aGlzLngsZS54LG4pfHwhbGkuZXF1YWxzV2l0aFRvbGVyYW5jZSh0aGlzLnksZS55LG4pKX19LHZpLnByb3RvdHlwZS5nZXRPcmRpbmF0ZT1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSB2aS5YOnJldHVybiB0aGlzLng7Y2FzZSB2aS5ZOnJldHVybiB0aGlzLnk7Y2FzZSB2aS5aOnJldHVybiB0aGlzLnp9dGhyb3cgbmV3IGhpfSx2aS5wcm90b3R5cGUuZXF1YWxzM0Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueD09PXQueCYmdGhpcy55PT09dC55JiYodGhpcy56PT09dC56fHxmaS5pc05hTih0aGlzLnopKSYmZmkuaXNOYU4odC56KX0sdmkucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHZpJiZ0aGlzLmVxdWFsczJEKHQpfSx2aS5wcm90b3R5cGUuZXF1YWxJblo9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbGkuZXF1YWxzV2l0aFRvbGVyYW5jZSh0aGlzLnosdC56LGUpfSx2aS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMueDxlLng/LTE6dGhpcy54PmUueD8xOnRoaXMueTxlLnk/LTE6dGhpcy55PmUueT8xOjB9LHZpLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe30sdmkucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHZpKHRoaXMpfSx2aS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iKCIrdGhpcy54KyIsICIrdGhpcy55KyIsICIrdGhpcy56KyIpIn0sdmkucHJvdG90eXBlLmRpc3RhbmNlM0Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnkscj10aGlzLnotdC56O3JldHVybiBNYXRoLnNxcnQoZSplK24qbityKnIpfSx2aS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnk7cmV0dXJuIE1hdGguc3FydChlKmUrbipuKX0sdmkucHJvdG90eXBlLmhhc2hDb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9MTc7cmV0dXJuIHQ9MzcqKHQ9MzcqdCt2aS5oYXNoQ29kZSh0aGlzLngpKSt2aS5oYXNoQ29kZSh0aGlzLnkpfSx2aS5wcm90b3R5cGUuc2V0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXt0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQuen0sdmkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpLGdpLG1pXX0sdmkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHZpfSx2aS5oYXNoQ29kZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmaS5kb3VibGVUb0xvbmdCaXRzKGFyZ3VtZW50c1swXSk7cmV0dXJuIE1hdGgudHJ1bmMoMCl9fSxfaS5EaW1lbnNpb25hbENvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHhpfSxfaS5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDVjYmYyYzIzNWM3ZTU4MDB9LF9pLk5VTExfT1JESU5BVEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGZpLk5hTn0sX2kuWC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sX2kuWS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sX2kuWi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXModmksX2kpO3ZhciB4aT1mdW5jdGlvbih0KXtpZih0aGlzLl9kaW1lbnNpb25zVG9UZXN0PTIsMCE9PWFyZ3VtZW50cy5sZW5ndGgmJjE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07aWYoMiE9PWUmJjMhPT1lKXRocm93IG5ldyBoaTt0aGlzLl9kaW1lbnNpb25zVG9UZXN0PWV9fTt4aS5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQscj1lLGk9eGkuY29tcGFyZShuLngsci54KTtpZigwIT09aSlyZXR1cm4gaTt2YXIgbz14aS5jb21wYXJlKG4ueSxyLnkpO3JldHVybiAwIT09bz9vOnRoaXMuX2RpbWVuc2lvbnNUb1Rlc3Q8PTI/MDp4aS5jb21wYXJlKG4ueixyLnopfSx4aS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5beWldfSx4aS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geGl9LHhpLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOmZpLmlzTmFOKHQpP2ZpLmlzTmFOKGUpPzA6LTE6ZmkuaXNOYU4oZSk/MTowfTt2YXIgd2k9ZnVuY3Rpb24oKXt9O3dpLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24oKXt9LHdpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx3aS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gd2l9O3ZhciBiaT1mdW5jdGlvbigpe30sRGk9e0lOVEVSSU9SOntjb25maWd1cmFibGU6ITB9LEJPVU5EQVJZOntjb25maWd1cmFibGU6ITB9LEVYVEVSSU9SOntjb25maWd1cmFibGU6ITB9LE5PTkU6e2NvbmZpZ3VyYWJsZTohMH19O2JpLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxiaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYml9LGJpLnRvTG9jYXRpb25TeW1ib2w9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgYmkuRVhURVJJT1I6cmV0dXJuImUiO2Nhc2UgYmkuQk9VTkRBUlk6cmV0dXJuImIiO2Nhc2UgYmkuSU5URVJJT1I6cmV0dXJuImkiO2Nhc2UgYmkuTk9ORTpyZXR1cm4iLSJ9dGhyb3cgbmV3IGhpfSxEaS5JTlRFUklPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sRGkuQk9VTkRBUlkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LERpLkVYVEVSSU9SLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxEaS5OT05FLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiaSxEaSk7dmFyIEVpPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaW50ZXJmYWNlc18mJnQuaW50ZXJmYWNlc18oKS5pbmRleE9mKGUpPi0xfSxDaT1mdW5jdGlvbigpe30sU2k9e0xPR18xMDp7Y29uZmlndXJhYmxlOiEwfX07Q2kucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LENpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDaX0sQ2kubG9nMTA9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5sb2codCk7cmV0dXJuIGZpLmlzSW5maW5pdGUoZSl8fGZpLmlzTmFOKGUpP2U6ZS9DaS5MT0dfMTB9LENpLm1pbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10O3JldHVybiBlPGkmJihpPWUpLG48aSYmKGk9bikscjxpJiYoaT1yKSxpfSxDaS5jbGFtcD1mdW5jdGlvbigpe2lmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzJdJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTtyZXR1cm4gdDxlP2U6dD5uP246dH1pZihOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1syXSkmJk51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSYmTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMV0pKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl07cmV0dXJuIHI8aT9pOnI+bz9vOnJ9fSxDaS53cmFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8MD9lLSAtdCVlOnQlZX0sQ2kubWF4PWZ1bmN0aW9uKCl7aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1sxXSxlPWFyZ3VtZW50c1syXSxuPWFyZ3VtZW50c1swXTtyZXR1cm4gdD5uJiYobj10KSxlPm4mJihuPWUpLG59aWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXSxvPWFyZ3VtZW50c1szXSxzPWFyZ3VtZW50c1swXTtyZXR1cm4gcj5zJiYocz1yKSxpPnMmJihzPWkpLG8+cyYmKHM9byksc319LENpLmF2ZXJhZ2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4odCtlKS8yfSxTaS5MT0dfMTAuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubG9nKDEwKX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ2ksU2kpO3ZhciBBaT1mdW5jdGlvbih0KXt0aGlzLnN0cj10fTtBaS5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKHQpe3RoaXMuc3RyKz10fSxBaS5wcm90b3R5cGUuc2V0Q2hhckF0PWZ1bmN0aW9uKHQsZSl7dGhpcy5zdHI9dGhpcy5zdHIuc3Vic3RyKDAsdCkrZSt0aGlzLnN0ci5zdWJzdHIodCsxKX0sQWkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0cn07dmFyIE5pPWZ1bmN0aW9uKHQpe3RoaXMudmFsdWU9dH07TmkucHJvdG90eXBlLmludFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9LE5pLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudmFsdWU8dD8tMTp0aGlzLnZhbHVlPnQ/MTowfSxOaS5pc05hTj1mdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyLmlzTmFOKHQpfTt2YXIgSWk9ZnVuY3Rpb24oKXt9O0lpLmlzV2hpdGVzcGFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdDw9MzImJnQ+PTB8fDEyNz09PXR9LElpLnRvVXBwZXJDYXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9O3ZhciBNaT1mdW5jdGlvbiB0KCl7aWYodGhpcy5faGk9MCx0aGlzLl9sbz0wLDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuaW5pdCgwKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuaW5pdChlKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCl7dmFyIG49YXJndW1lbnRzWzBdO3RoaXMuaW5pdChuKX1lbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgYXJndW1lbnRzWzBdKXt0LmNhbGwodGhpcyx0LnBhcnNlKGFyZ3VtZW50c1swXSkpfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV07dGhpcy5pbml0KHIsaSl9fSxGaT17UEk6e2NvbmZpZ3VyYWJsZTohMH0sVFdPX1BJOntjb25maWd1cmFibGU6ITB9LFBJXzI6e2NvbmZpZ3VyYWJsZTohMH0sRTp7Y29uZmlndXJhYmxlOiEwfSxOYU46e2NvbmZpZ3VyYWJsZTohMH0sRVBTOntjb25maWd1cmFibGU6ITB9LFNQTElUOntjb25maWd1cmFibGU6ITB9LE1BWF9QUklOVF9ESUdJVFM6e2NvbmZpZ3VyYWJsZTohMH0sVEVOOntjb25maWd1cmFibGU6ITB9LE9ORTp7Y29uZmlndXJhYmxlOiEwfSxTQ0lfTk9UX0VYUE9ORU5UX0NIQVI6e2NvbmZpZ3VyYWJsZTohMH0sU0NJX05PVF9aRVJPOntjb25maWd1cmFibGU6ITB9fTtNaS5wcm90b3R5cGUubGU9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMuX2hpPHQuX2hpfHx0aGlzLl9oaT09PXQuX2hpKSYmdGhpcy5fbG88PXQuX2xvfSxNaS5wcm90b3R5cGUuZXh0cmFjdFNpZ25pZmljYW50RGlnaXRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5hYnMoKSxyPU1pLm1hZ25pdHVkZShuLl9oaSksaT1NaS5URU4ucG93KHIpOyhuPW4uZGl2aWRlKGkpKS5ndChNaS5URU4pPyhuPW4uZGl2aWRlKE1pLlRFTikscis9MSk6bi5sdChNaS5PTkUpJiYobj1uLm11bHRpcGx5KE1pLlRFTiksci09MSk7Zm9yKHZhciBvPXIrMSxzPW5ldyBBaSxhPU1pLk1BWF9QUklOVF9ESUdJVFMtMSx1PTA7dTw9YTt1Kyspe3QmJnU9PT1vJiZzLmFwcGVuZCgiLiIpO3ZhciBjPU1hdGgudHJ1bmMobi5faGkpO2lmKGM8MClicmVhazt2YXIgbD0hMSxoPTA7Yz45PyhsPSEwLGg9IjkiKTpoPSIwIitjLHMuYXBwZW5kKGgpLG49bi5zdWJ0cmFjdChNaS52YWx1ZU9mKGMpKS5tdWx0aXBseShNaS5URU4pLGwmJm4uc2VsZkFkZChNaS5URU4pO3ZhciBmPSEwLHA9TWkubWFnbml0dWRlKG4uX2hpKTtpZihwPDAmJk1hdGguYWJzKHApPj1hLXUmJihmPSExKSwhZilicmVha31yZXR1cm4gZVswXT1yLHMudG9TdHJpbmcoKX0sTWkucHJvdG90eXBlLnNxcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLm11bHRpcGx5KHRoaXMpfSxNaS5wcm90b3R5cGUuZG91YmxlVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGkrdGhpcy5fbG99LE1pLnByb3RvdHlwZS5zdWJ0cmFjdD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5hZGQodC5uZWdhdGUoKSl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5hZGQoLWUpfX0sTWkucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2hpPT09dC5faGkmJnRoaXMuX2xvPT09dC5fbG99fSxNaS5wcm90b3R5cGUuaXNaZXJvPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9oaSYmMD09PXRoaXMuX2xvfSxNaS5wcm90b3R5cGUuc2VsZlN1YnRyYWN0PWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmlzTmFOKCk/dGhpczp0aGlzLnNlbGZBZGQoLXQuX2hpLC10Ll9sbyl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5pc05hTigpP3RoaXM6dGhpcy5zZWxmQWRkKC1lLDApfX0sTWkucHJvdG90eXBlLmdldFNwZWNpYWxOdW1iZXJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1plcm8oKT8iMC4wIjp0aGlzLmlzTmFOKCk/Ik5hTiAiOm51bGx9LE1pLnByb3RvdHlwZS5taW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGUodCk/dGhpczp0fSxNaS5wcm90b3R5cGUuc2VsZkRpdmlkZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc2VsZkRpdmlkZSh0Ll9oaSx0Ll9sbyl9aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0pe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmRGl2aWRlKGUsMCl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuLHIsaSxvLHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdLHU9bnVsbCxjPW51bGwsbD1udWxsLGg9bnVsbDtyZXR1cm4gaT10aGlzLl9oaS9zLGg9KHU9KGw9TWkuU1BMSVQqaSktKHU9bC1pKSkqKGM9KGg9TWkuU1BMSVQqcyktKGM9aC1zKSktKG89aSpzKSt1KihyPXMtYykrKG49aS11KSpjK24qcixoPWkrKGw9KHRoaXMuX2hpLW8taCt0aGlzLl9sby1pKmEpL3MpLHRoaXMuX2hpPWgsdGhpcy5fbG89aS1oK2wsdGhpc319LE1pLnByb3RvdHlwZS5kdW1wPWZ1bmN0aW9uKCl7cmV0dXJuIkREPCIrdGhpcy5faGkrIiwgIit0aGlzLl9sbysiPiJ9LE1pLnByb3RvdHlwZS5kaXZpZGU9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdCxlLG4scixpPWFyZ3VtZW50c1swXSxvPW51bGwscz1udWxsLGE9bnVsbCx1PW51bGw7cmV0dXJuIHQ9KG49dGhpcy5faGkvaS5faGkpLShvPShhPU1pLlNQTElUKm4pLShvPWEtbikpLHU9byoocz0odT1NaS5TUExJVCppLl9oaSktKHM9dS1pLl9oaSkpLShyPW4qaS5faGkpK28qKGU9aS5faGktcykrdCpzK3QqZSxhPSh0aGlzLl9oaS1yLXUrdGhpcy5fbG8tbippLl9sbykvaS5faGksbmV3IE1pKHU9bithLG4tdSthKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGM9YXJndW1lbnRzWzBdO3JldHVybiBmaS5pc05hTihjKT9NaS5jcmVhdGVOYU4oKTpNaS5jb3B5KHRoaXMpLnNlbGZEaXZpZGUoYywwKX19LE1pLnByb3RvdHlwZS5nZT1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5faGk+dC5faGl8fHRoaXMuX2hpPT09dC5faGkpJiZ0aGlzLl9sbz49dC5fbG99LE1pLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7aWYoMD09PXQpcmV0dXJuIE1pLnZhbHVlT2YoMSk7dmFyIGU9bmV3IE1pKHRoaXMpLG49TWkudmFsdWVPZigxKSxyPU1hdGguYWJzKHQpO2lmKHI+MSlmb3IoO3I+MDspciUyPT0xJiZuLnNlbGZNdWx0aXBseShlKSwoci89Mik+MCYmKGU9ZS5zcXIoKSk7ZWxzZSBuPWU7cmV0dXJuIHQ8MD9uLnJlY2lwcm9jYWwoKTpufSxNaS5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbigpe2lmKHRoaXMuaXNOYU4oKSlyZXR1cm4gTWkuTmFOO3ZhciB0PU1hdGguY2VpbCh0aGlzLl9oaSksZT0wO3JldHVybiB0PT09dGhpcy5faGkmJihlPU1hdGguY2VpbCh0aGlzLl9sbykpLG5ldyBNaSh0LGUpfSxNaS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX2hpPGUuX2hpPy0xOnRoaXMuX2hpPmUuX2hpPzE6dGhpcy5fbG88ZS5fbG8/LTE6dGhpcy5fbG8+ZS5fbG8/MTowfSxNaS5wcm90b3R5cGUucmludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/dGhpczp0aGlzLmFkZCguNSkuZmxvb3IoKX0sTWkucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBNaSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmluaXQodCksdGhpc31pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmluaXQoZSksdGhpc319LE1pLnByb3RvdHlwZS5tYXg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2UodCk/dGhpczp0fSxNaS5wcm90b3R5cGUuc3FydD1mdW5jdGlvbigpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIE1pLnZhbHVlT2YoMCk7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIE1pLk5hTjt2YXIgdD0xL01hdGguc3FydCh0aGlzLl9oaSksZT10aGlzLl9oaSp0LG49TWkudmFsdWVPZihlKSxyPXRoaXMuc3VidHJhY3Qobi5zcXIoKSkuX2hpKiguNSp0KTtyZXR1cm4gbi5hZGQocil9LE1pLnByb3RvdHlwZS5zZWxmQWRkPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmQWRkKHQuX2hpLHQuX2xvKX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGUsbixyLGksbyxzPWFyZ3VtZW50c1swXSxhPW51bGw7cmV0dXJuIGE9KHI9dGhpcy5faGkrcyktKGk9ci10aGlzLl9oaSksbj0obz0oYT1zLWkrKHRoaXMuX2hpLWEpKSt0aGlzLl9sbykrKHItKGU9citvKSksdGhpcy5faGk9ZStuLHRoaXMuX2xvPW4rKGUtdGhpcy5faGkpLHRoaXN9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB1LGMsbCxoLGY9YXJndW1lbnRzWzBdLHA9YXJndW1lbnRzWzFdLGQ9bnVsbCxnPW51bGwseT1udWxsO2w9dGhpcy5faGkrZixjPXRoaXMuX2xvK3AsZz1sLSh5PWwtdGhpcy5faGkpLGQ9Yy0oaD1jLXRoaXMuX2xvKTt2YXIgbT0odT1sKyh5PShnPWYteSsodGhpcy5faGktZykpK2MpKSsoeT0oZD1wLWgrKHRoaXMuX2xvLWQpKSsoeSsobC11KSkpLHY9eSsodS1tKTtyZXR1cm4gdGhpcy5faGk9bSx0aGlzLl9sbz12LHRoaXN9fSxNaS5wcm90b3R5cGUuc2VsZk11bHRpcGx5PWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5zZWxmTXVsdGlwbHkodC5faGksdC5fbG8pfWlmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuc2VsZk11bHRpcGx5KGUsMCl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuLHIsaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1udWxsLGE9bnVsbCx1PW51bGwsYz1udWxsO3M9KHU9TWkuU1BMSVQqdGhpcy5faGkpLXRoaXMuX2hpLGM9TWkuU1BMSVQqaSxzPXUtcyxuPXRoaXMuX2hpLXMsYT1jLWk7dmFyIGw9KHU9dGhpcy5faGkqaSkrKGM9cyooYT1jLWEpLXUrcyoocj1pLWEpK24qYStuKnIrKHRoaXMuX2hpKm8rdGhpcy5fbG8qaSkpLGg9Yysocz11LWwpO3JldHVybiB0aGlzLl9oaT1sLHRoaXMuX2xvPWgsdGhpc319LE1pLnByb3RvdHlwZS5zZWxmU3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZk11bHRpcGx5KHRoaXMpfSxNaS5wcm90b3R5cGUuZmxvb3I9ZnVuY3Rpb24oKXtpZih0aGlzLmlzTmFOKCkpcmV0dXJuIE1pLk5hTjt2YXIgdD1NYXRoLmZsb29yKHRoaXMuX2hpKSxlPTA7cmV0dXJuIHQ9PT10aGlzLl9oaSYmKGU9TWF0aC5mbG9vcih0aGlzLl9sbykpLG5ldyBNaSh0LGUpfSxNaS5wcm90b3R5cGUubmVnYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOYU4oKT90aGlzOm5ldyBNaSgtdGhpcy5faGksLXRoaXMuX2xvKX0sTWkucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7fSxNaS5wcm90b3R5cGUubXVsdGlwbHk9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHQuaXNOYU4oKT9NaS5jcmVhdGVOYU4oKTpNaS5jb3B5KHRoaXMpLnNlbGZNdWx0aXBseSh0KX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBmaS5pc05hTihlKT9NaS5jcmVhdGVOYU4oKTpNaS5jb3B5KHRoaXMpLnNlbGZNdWx0aXBseShlLDApfX0sTWkucHJvdG90eXBlLmlzTmFOPWZ1bmN0aW9uKCl7cmV0dXJuIGZpLmlzTmFOKHRoaXMuX2hpKX0sTWkucHJvdG90eXBlLmludFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgudHJ1bmModGhpcy5faGkpfSxNaS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD1NaS5tYWduaXR1ZGUodGhpcy5faGkpO3JldHVybiB0Pj0tMyYmdDw9MjA/dGhpcy50b1N0YW5kYXJkTm90YXRpb24oKTp0aGlzLnRvU2NpTm90YXRpb24oKX0sTWkucHJvdG90eXBlLnRvU3RhbmRhcmROb3RhdGlvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0U3BlY2lhbE51bWJlclN0cmluZygpO2lmKG51bGwhPT10KXJldHVybiB0O3ZhciBlPW5ldyBBcnJheSgxKS5maWxsKG51bGwpLG49dGhpcy5leHRyYWN0U2lnbmlmaWNhbnREaWdpdHMoITAsZSkscj1lWzBdKzEsaT1uO2lmKCIuIj09PW4uY2hhckF0KDApKWk9IjAiK247ZWxzZSBpZihyPDApaT0iMC4iK01pLnN0cmluZ09mQ2hhcigiMCIsLXIpK247ZWxzZSBpZigtMT09PW4uaW5kZXhPZigiLiIpKXt2YXIgbz1yLW4ubGVuZ3RoO2k9bitNaS5zdHJpbmdPZkNoYXIoIjAiLG8pKyIuMCJ9cmV0dXJuIHRoaXMuaXNOZWdhdGl2ZSgpPyItIitpOml9LE1pLnByb3RvdHlwZS5yZWNpcHJvY2FsPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaT1udWxsLG89bnVsbCxzPW51bGwsYT1udWxsO3Q9KG49MS90aGlzLl9oaSktKGk9KHM9TWkuU1BMSVQqbiktKGk9cy1uKSksbz0oYT1NaS5TUExJVCp0aGlzLl9oaSktdGhpcy5faGk7dmFyIHU9bisocz0oMS0ocj1uKnRoaXMuX2hpKS0oYT1pKihvPWEtbyktcitpKihlPXRoaXMuX2hpLW8pK3Qqbyt0KmUpLW4qdGhpcy5fbG8pL3RoaXMuX2hpKTtyZXR1cm4gbmV3IE1pKHUsbi11K3MpfSxNaS5wcm90b3R5cGUudG9TY2lOb3RhdGlvbj1mdW5jdGlvbigpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIE1pLlNDSV9OT1RfWkVSTzt2YXIgdD10aGlzLmdldFNwZWNpYWxOdW1iZXJTdHJpbmcoKTtpZihudWxsIT09dClyZXR1cm4gdDt2YXIgZT1uZXcgQXJyYXkoMSkuZmlsbChudWxsKSxuPXRoaXMuZXh0cmFjdFNpZ25pZmljYW50RGlnaXRzKCExLGUpLHI9TWkuU0NJX05PVF9FWFBPTkVOVF9DSEFSK2VbMF07aWYoIjAiPT09bi5jaGFyQXQoMCkpdGhyb3cgbmV3IEVycm9yKCJGb3VuZCBsZWFkaW5nIHplcm86ICIrbik7dmFyIGk9IiI7bi5sZW5ndGg+MSYmKGk9bi5zdWJzdHJpbmcoMSkpO3ZhciBvPW4uY2hhckF0KDApKyIuIitpO3JldHVybiB0aGlzLmlzTmVnYXRpdmUoKT8iLSIrbytyOm8rcn0sTWkucHJvdG90eXBlLmFicz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmFOKCk/TWkuTmFOOnRoaXMuaXNOZWdhdGl2ZSgpP3RoaXMubmVnYXRlKCk6bmV3IE1pKHRoaXMpfSxNaS5wcm90b3R5cGUuaXNQb3NpdGl2ZT1mdW5jdGlvbigpe3JldHVybih0aGlzLl9oaT4wfHwwPT09dGhpcy5faGkpJiZ0aGlzLl9sbz4wfSxNaS5wcm90b3R5cGUubHQ9ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMuX2hpPHQuX2hpfHx0aGlzLl9oaT09PXQuX2hpKSYmdGhpcy5fbG88dC5fbG99LE1pLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE1pKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIE1pLmNvcHkodGhpcykuc2VsZkFkZCh0KX1pZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBNaS5jb3B5KHRoaXMpLnNlbGZBZGQoZSl9fSxNaS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2hpPXQsdGhpcy5fbG89MH1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgTWkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLl9oaT1lLl9oaSx0aGlzLl9sbz1lLl9sb319ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMuX2hpPW4sdGhpcy5fbG89cn19LE1pLnByb3RvdHlwZS5ndD1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5faGk+dC5faGl8fHRoaXMuX2hpPT09dC5faGkpJiZ0aGlzLl9sbz50Ll9sb30sTWkucHJvdG90eXBlLmlzTmVnYXRpdmU9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5faGk8MHx8MD09PXRoaXMuX2hpKSYmdGhpcy5fbG88MH0sTWkucHJvdG90eXBlLnRydW5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOYU4oKT9NaS5OYU46dGhpcy5pc1Bvc2l0aXZlKCk/dGhpcy5mbG9vcigpOnRoaXMuY2VpbCgpfSxNaS5wcm90b3R5cGUuc2lnbnVtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hpPjA/MTp0aGlzLl9oaTwwPy0xOnRoaXMuX2xvPjA/MTp0aGlzLl9sbzwwPy0xOjB9LE1pLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblttaSxkaSxnaV19LE1pLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBNaX0sTWkuc3FyPWZ1bmN0aW9uKHQpe3JldHVybiBNaS52YWx1ZU9mKHQpLnNlbGZNdWx0aXBseSh0KX0sTWkudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYXJndW1lbnRzWzBdP01pLnBhcnNlKGFyZ3VtZW50c1swXSk6Im51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0/bmV3IE1pKGFyZ3VtZW50c1swXSk6dm9pZCAwfSxNaS5zcXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBNaS52YWx1ZU9mKHQpLnNxcnQoKX0sTWkucGFyc2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDtJaS5pc1doaXRlc3BhY2UodC5jaGFyQXQoZSkpOyllKys7dmFyIHI9ITE7aWYoZTxuKXt2YXIgaT10LmNoYXJBdChlKTsoIi0iPT09aXx8IisiPT09aSkmJihlKyssIi0iPT09aSYmKHI9ITApKX1mb3IodmFyIG89bmV3IE1pLHM9MCxhPTAsdT0wOyEoZT49bik7KXt2YXIgYz10LmNoYXJBdChlKTtpZihlKyssSWkuaXNEaWdpdChjKSl7dmFyIGw9Yy0iMCI7by5zZWxmTXVsdGlwbHkoTWkuVEVOKSxvLnNlbGZBZGQobCkscysrfWVsc2V7aWYoIi4iIT09Yyl7aWYoImUiPT09Y3x8IkUiPT09Yyl7dmFyIGg9dC5zdWJzdHJpbmcoZSk7dHJ5e3U9TmkucGFyc2VJbnQoaCl9Y2F0Y2goZSl7dGhyb3cgZSBpbnN0YW5jZW9mIEVycm9yP25ldyBFcnJvcigiSW52YWxpZCBleHBvbmVudCAiK2grIiBpbiBzdHJpbmcgIit0KTplfWJyZWFrfXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBjaGFyYWN0ZXIgJyIrYysiJyBhdCBwb3NpdGlvbiAiK2UrIiBpbiBzdHJpbmcgIit0KX1hPXN9fXZhciBmPW8scD1zLWEtdTtpZigwPT09cClmPW87ZWxzZSBpZihwPjApe3ZhciBkPU1pLlRFTi5wb3cocCk7Zj1vLmRpdmlkZShkKX1lbHNlIGlmKHA8MCl7dmFyIGc9TWkuVEVOLnBvdygtcCk7Zj1vLm11bHRpcGx5KGcpfXJldHVybiByP2YubmVnYXRlKCk6Zn0sTWkuY3JlYXRlTmFOPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNaShmaS5OYU4sZmkuTmFOKX0sTWkuY29weT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IE1pKHQpfSxNaS5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5hYnModCksbj1NYXRoLmxvZyhlKS9NYXRoLmxvZygxMCkscj1NYXRoLnRydW5jKE1hdGguZmxvb3IobikpO3JldHVybiAxMCpNYXRoLnBvdygxMCxyKTw9ZSYmKHIrPTEpLHJ9LE1pLnN0cmluZ09mQ2hhcj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgQWkscj0wO3I8ZTtyKyspbi5hcHBlbmQodCk7cmV0dXJuIG4udG9TdHJpbmcoKX0sRmkuUEkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNaSgzLjE0MTU5MjY1MzU4OTc5MywxMjI0NjQ2Nzk5MTQ3MzUzMmUtMzIpfSxGaS5UV09fUEkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNaSg2LjI4MzE4NTMwNzE3OTU4NiwyNDQ5MjkzNTk4Mjk0NzA2NGUtMzIpfSxGaS5QSV8yLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgTWkoMS41NzA3OTYzMjY3OTQ4OTY2LDYxMjMyMzM5OTU3MzY3NjZlLTMyKX0sRmkuRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE1pKDIuNzE4MjgxODI4NDU5MDQ1LDE0NDU2NDY4OTE3MjkyNTAyZS0zMil9LEZpLk5hTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE1pKGZpLk5hTixmaS5OYU4pfSxGaS5FUFMuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDEyMzI1OTUxNjQ0MDc4M2UtNDZ9LEZpLlNQTElULmdldD1mdW5jdGlvbigpe3JldHVybiAxMzQyMTc3Mjl9LEZpLk1BWF9QUklOVF9ESUdJVFMuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDMyfSxGaS5URU4uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1pLnZhbHVlT2YoMTApfSxGaS5PTkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIE1pLnZhbHVlT2YoMSl9LEZpLlNDSV9OT1RfRVhQT05FTlRfQ0hBUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iRSJ9LEZpLlNDSV9OT1RfWkVSTy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iMC4wRTAifSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhNaSxGaSk7dmFyIFRpPWZ1bmN0aW9uKCl7fSxPaT17RFBfU0FGRV9FUFNJTE9OOntjb25maWd1cmFibGU6ITB9fTtUaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sVGkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFRpfSxUaS5vcmllbnRhdGlvbkluZGV4PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1UaS5vcmllbnRhdGlvbkluZGV4RmlsdGVyKHQsZSxuKTtpZihyPD0xKXJldHVybiByO3ZhciBpPU1pLnZhbHVlT2YoZS54KS5zZWxmQWRkKC10LngpLG89TWkudmFsdWVPZihlLnkpLnNlbGZBZGQoLXQueSkscz1NaS52YWx1ZU9mKG4ueCkuc2VsZkFkZCgtZS54KSxhPU1pLnZhbHVlT2Yobi55KS5zZWxmQWRkKC1lLnkpO3JldHVybiBpLnNlbGZNdWx0aXBseShhKS5zZWxmU3VidHJhY3Qoby5zZWxmTXVsdGlwbHkocykpLnNpZ251bSgpfSxUaS5zaWduT2ZEZXQyeDI9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHQubXVsdGlwbHkocikuc2VsZlN1YnRyYWN0KGUubXVsdGlwbHkobikpLnNpZ251bSgpfSxUaS5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9TWkudmFsdWVPZihyLnkpLnNlbGZTdWJ0cmFjdChuLnkpLnNlbGZNdWx0aXBseShNaS52YWx1ZU9mKGUueCkuc2VsZlN1YnRyYWN0KHQueCkpLG89TWkudmFsdWVPZihyLngpLnNlbGZTdWJ0cmFjdChuLngpLnNlbGZNdWx0aXBseShNaS52YWx1ZU9mKGUueSkuc2VsZlN1YnRyYWN0KHQueSkpLHM9aS5zdWJ0cmFjdChvKSxhPU1pLnZhbHVlT2Yoci54KS5zZWxmU3VidHJhY3Qobi54KS5zZWxmTXVsdGlwbHkoTWkudmFsdWVPZih0LnkpLnNlbGZTdWJ0cmFjdChuLnkpKSx1PU1pLnZhbHVlT2Yoci55KS5zZWxmU3VidHJhY3Qobi55KS5zZWxmTXVsdGlwbHkoTWkudmFsdWVPZih0LngpLnNlbGZTdWJ0cmFjdChuLngpKSxjPWEuc3VidHJhY3QodSkuc2VsZkRpdmlkZShzKS5kb3VibGVWYWx1ZSgpLGw9TWkudmFsdWVPZih0LngpLnNlbGZBZGQoTWkudmFsdWVPZihlLngpLnNlbGZTdWJ0cmFjdCh0LngpLnNlbGZNdWx0aXBseShjKSkuZG91YmxlVmFsdWUoKSxoPU1pLnZhbHVlT2YoZS54KS5zZWxmU3VidHJhY3QodC54KS5zZWxmTXVsdGlwbHkoTWkudmFsdWVPZih0LnkpLnNlbGZTdWJ0cmFjdChuLnkpKSxmPU1pLnZhbHVlT2YoZS55KS5zZWxmU3VidHJhY3QodC55KS5zZWxmTXVsdGlwbHkoTWkudmFsdWVPZih0LngpLnNlbGZTdWJ0cmFjdChuLngpKSxwPWguc3VidHJhY3QoZikuc2VsZkRpdmlkZShzKS5kb3VibGVWYWx1ZSgpLGQ9TWkudmFsdWVPZihuLnkpLnNlbGZBZGQoTWkudmFsdWVPZihyLnkpLnNlbGZTdWJ0cmFjdChuLnkpLnNlbGZNdWx0aXBseShwKSkuZG91YmxlVmFsdWUoKTtyZXR1cm4gbmV3IHZpKGwsZCl9LFRpLm9yaWVudGF0aW9uSW5kZXhGaWx0ZXI9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW51bGwsaT0odC54LW4ueCkqKGUueS1uLnkpLG89KHQueS1uLnkpKihlLngtbi54KSxzPWktbztpZihpPjApe2lmKG88PTApcmV0dXJuIFRpLnNpZ251bShzKTtyPWkrb31lbHNle2lmKCEoaTwwKSlyZXR1cm4gVGkuc2lnbnVtKHMpO2lmKG8+PTApcmV0dXJuIFRpLnNpZ251bShzKTtyPS1pLW99dmFyIGE9VGkuRFBfU0FGRV9FUFNJTE9OKnI7cmV0dXJuIHM+PWF8fC1zPj1hP1RpLnNpZ251bShzKToyfSxUaS5zaWdudW09ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD8xOnQ8MD8tMTowfSxPaS5EUF9TQUZFX0VQU0lMT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTE1fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhUaSxPaSk7dmFyIExpPWZ1bmN0aW9uKCl7fSxQaT17WDp7Y29uZmlndXJhYmxlOiEwfSxZOntjb25maWd1cmFibGU6ITB9LFo6e2NvbmZpZ3VyYWJsZTohMH0sTTp7Y29uZmlndXJhYmxlOiEwfX07UGkuWC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sUGkuWS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sUGkuWi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sUGkuTS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gM30sTGkucHJvdG90eXBlLnNldE9yZGluYXRlPWZ1bmN0aW9uKHQsZSxuKXt9LExpLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7fSxMaS5wcm90b3R5cGUuZ2V0T3JkaW5hdGU9ZnVuY3Rpb24odCxlKXt9LExpLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7fSxMaS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZUNvcHk9ZnVuY3Rpb24odCl7fSxMaS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7fSxMaS5wcm90b3R5cGUuZ2V0WD1mdW5jdGlvbih0KXt9LExpLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe30sTGkucHJvdG90eXBlLmV4cGFuZEVudmVsb3BlPWZ1bmN0aW9uKHQpe30sTGkucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXt9LExpLnByb3RvdHlwZS5nZXRZPWZ1bmN0aW9uKHQpe30sTGkucHJvdG90eXBlLnRvQ29vcmRpbmF0ZUFycmF5PWZ1bmN0aW9uKCl7fSxMaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZ2ldfSxMaS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTGl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKExpLFBpKTt2YXIgUmk9ZnVuY3Rpb24oKXt9LEJpPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcywiUHJvamVjdGl2ZSBwb2ludCBub3QgcmVwcmVzZW50YWJsZSBvbiB0aGUgQ2FydGVzaWFuIHBsYW5lLiIpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShSaSksa2k9ZnVuY3Rpb24oKXt9O2tpLmFycmF5Y29weT1mdW5jdGlvbih0LGUsbixyLGkpe2Zvcih2YXIgbz0wLHM9ZTtzPGUraTtzKyspbltyK29dPXRbc10sbysrfSxraS5nZXRQcm9wZXJ0eT1mdW5jdGlvbih0KXtyZXR1cm57ImxpbmUuc2VwYXJhdG9yIjoiXG4ifVt0XX07dmFyIHppPWZ1bmN0aW9uIHQoKXtpZih0aGlzLng9bnVsbCx0aGlzLnk9bnVsbCx0aGlzLnc9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLng9MCx0aGlzLnk9MCx0aGlzLnc9MTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy54PWUueCx0aGlzLnk9ZS55LHRoaXMudz0xfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzBdJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMueD1uLHRoaXMueT1yLHRoaXMudz0xfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB0JiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHQpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXTt0aGlzLng9aS55Km8udy1vLnkqaS53LHRoaXMueT1vLngqaS53LWkueCpvLncsdGhpcy53PWkueCpvLnktby54KmkueX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXTt0aGlzLng9cy55LWEueSx0aGlzLnk9YS54LXMueCx0aGlzLnc9cy54KmEueS1hLngqcy55fX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdT1hcmd1bWVudHNbMF0sYz1hcmd1bWVudHNbMV0sbD1hcmd1bWVudHNbMl07dGhpcy54PXUsdGhpcy55PWMsdGhpcy53PWx9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGg9YXJndW1lbnRzWzBdLGY9YXJndW1lbnRzWzFdLHA9YXJndW1lbnRzWzJdLGQ9YXJndW1lbnRzWzNdLGc9aC55LWYueSx5PWYueC1oLngsbT1oLngqZi55LWYueCpoLnksdj1wLnktZC55LF89ZC54LXAueCx4PXAueCpkLnktZC54KnAueTt0aGlzLng9eSp4LV8qbSx0aGlzLnk9diptLWcqeCx0aGlzLnc9ZypfLXYqeX19O3ppLnByb3RvdHlwZS5nZXRZPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55L3RoaXMudztpZihmaS5pc05hTih0KXx8ZmkuaXNJbmZpbml0ZSh0KSl0aHJvdyBuZXcgQmk7cmV0dXJuIHR9LHppLnByb3RvdHlwZS5nZXRYPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy54L3RoaXMudztpZihmaS5pc05hTih0KXx8ZmkuaXNJbmZpbml0ZSh0KSl0aHJvdyBuZXcgQmk7cmV0dXJuIHR9LHppLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHZpO3JldHVybiB0Lng9dGhpcy5nZXRYKCksdC55PXRoaXMuZ2V0WSgpLHR9LHppLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx6aS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geml9LHppLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10LnktZS55LG89ZS54LXQueCxzPXQueCplLnktZS54KnQueSxhPW4ueS1yLnksdT1yLngtbi54LGM9bi54KnIueS1yLngqbi55LGw9aSp1LWEqbyxoPShvKmMtdSpzKS9sLGY9KGEqcy1pKmMpL2w7aWYoZmkuaXNOYU4oaCl8fGZpLmlzSW5maW5pdGUoaCl8fGZpLmlzTmFOKGYpfHxmaS5pc0luZmluaXRlKGYpKXRocm93IG5ldyBCaTtyZXR1cm4gbmV3IHZpKGgsZil9O3ZhciBqaT1mdW5jdGlvbiB0KCl7aWYodGhpcy5fbWlueD1udWxsLHRoaXMuX21heHg9bnVsbCx0aGlzLl9taW55PW51bGwsdGhpcy5fbWF4eT1udWxsLDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuaW5pdCgpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmluaXQoZS54LGUueCxlLnksZS55KX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCl7dmFyIG49YXJndW1lbnRzWzBdO3RoaXMuaW5pdChuKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3RoaXMuaW5pdChyLngsaS54LHIueSxpLnkpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPWFyZ3VtZW50c1syXSx1PWFyZ3VtZW50c1szXTt0aGlzLmluaXQobyxzLGEsdSl9fSxVaT17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07amkucHJvdG90eXBlLmdldEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRXaWR0aCgpKnRoaXMuZ2V0SGVpZ2h0KCl9LGppLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2YgamkpKXJldHVybiExO3ZhciBlPXQ7cmV0dXJuIHRoaXMuaXNOdWxsKCk/ZS5pc051bGwoKTp0aGlzLl9tYXh4PT09ZS5nZXRNYXhYKCkmJnRoaXMuX21heHk9PT1lLmdldE1heFkoKSYmdGhpcy5fbWlueD09PWUuZ2V0TWluWCgpJiZ0aGlzLl9taW55PT09ZS5nZXRNaW5ZKCl9LGppLnByb3RvdHlwZS5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7aWYodGhpcy5pc051bGwoKXx8dC5pc051bGwoKXx8IXRoaXMuaW50ZXJzZWN0cyh0KSlyZXR1cm4gbmV3IGppO3ZhciBlPXRoaXMuX21pbng+dC5fbWlueD90aGlzLl9taW54OnQuX21pbngsbj10aGlzLl9taW55PnQuX21pbnk/dGhpcy5fbWlueTp0Ll9taW55LHI9dGhpcy5fbWF4eDx0Ll9tYXh4P3RoaXMuX21heHg6dC5fbWF4eCxpPXRoaXMuX21heHk8dC5fbWF4eT90aGlzLl9tYXh5OnQuX21heHk7cmV0dXJuIG5ldyBqaShlLHIsbixpKX0samkucHJvdG90eXBlLmlzTnVsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXh4PHRoaXMuX21pbnh9LGppLnByb3RvdHlwZS5nZXRNYXhYPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heHh9LGppLnByb3RvdHlwZS5jb3ZlcnM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNvdmVycyh0LngsdC55KX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGppKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIXRoaXMuaXNOdWxsKCkmJiFlLmlzTnVsbCgpJiYoZS5nZXRNaW5YKCk+PXRoaXMuX21pbngmJmUuZ2V0TWF4WCgpPD10aGlzLl9tYXh4JiZlLmdldE1pblkoKT49dGhpcy5fbWlueSYmZS5nZXRNYXhZKCk8PXRoaXMuX21heHkpfX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07cmV0dXJuIXRoaXMuaXNOdWxsKCkmJihuPj10aGlzLl9taW54JiZuPD10aGlzLl9tYXh4JiZyPj10aGlzLl9taW55JiZyPD10aGlzLl9tYXh5KX19LGppLnByb3RvdHlwZS5pbnRlcnNlY3RzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygamkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4hdGhpcy5pc051bGwoKSYmIXQuaXNOdWxsKCkmJiEodC5fbWlueD50aGlzLl9tYXh4fHx0Ll9tYXh4PHRoaXMuX21pbnh8fHQuX21pbnk+dGhpcy5fbWF4eXx8dC5fbWF4eTx0aGlzLl9taW55KX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuaW50ZXJzZWN0cyhlLngsZS55KX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3JldHVybiF0aGlzLmlzTnVsbCgpJiYhKG4+dGhpcy5fbWF4eHx8bjx0aGlzLl9taW54fHxyPnRoaXMuX21heHl8fHI8dGhpcy5fbWlueSl9fSxqaS5wcm90b3R5cGUuZ2V0TWluWT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW55fSxqaS5wcm90b3R5cGUuZ2V0TWluWD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW54fSxqaS5wcm90b3R5cGUuZXhwYW5kVG9JbmNsdWRlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmV4cGFuZFRvSW5jbHVkZSh0LngsdC55KX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygamkpe3ZhciBlPWFyZ3VtZW50c1swXTtpZihlLmlzTnVsbCgpKXJldHVybiBudWxsO3RoaXMuaXNOdWxsKCk/KHRoaXMuX21pbng9ZS5nZXRNaW5YKCksdGhpcy5fbWF4eD1lLmdldE1heFgoKSx0aGlzLl9taW55PWUuZ2V0TWluWSgpLHRoaXMuX21heHk9ZS5nZXRNYXhZKCkpOihlLl9taW54PHRoaXMuX21pbngmJih0aGlzLl9taW54PWUuX21pbngpLGUuX21heHg+dGhpcy5fbWF4eCYmKHRoaXMuX21heHg9ZS5fbWF4eCksZS5fbWlueTx0aGlzLl9taW55JiYodGhpcy5fbWlueT1lLl9taW55KSxlLl9tYXh5PnRoaXMuX21heHkmJih0aGlzLl9tYXh5PWUuX21heHkpKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMuaXNOdWxsKCk/KHRoaXMuX21pbng9bix0aGlzLl9tYXh4PW4sdGhpcy5fbWlueT1yLHRoaXMuX21heHk9cik6KG48dGhpcy5fbWlueCYmKHRoaXMuX21pbng9biksbj50aGlzLl9tYXh4JiYodGhpcy5fbWF4eD1uKSxyPHRoaXMuX21pbnkmJih0aGlzLl9taW55PXIpLHI+dGhpcy5fbWF4eSYmKHRoaXMuX21heHk9cikpfX0samkucHJvdG90eXBlLm1pbkV4dGVudD1mdW5jdGlvbigpe2lmKHRoaXMuaXNOdWxsKCkpcmV0dXJuIDA7dmFyIHQ9dGhpcy5nZXRXaWR0aCgpLGU9dGhpcy5nZXRIZWlnaHQoKTtyZXR1cm4gdDxlP3Q6ZX0samkucHJvdG90eXBlLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNOdWxsKCk/MDp0aGlzLl9tYXh4LXRoaXMuX21pbnh9LGppLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5pc051bGwoKT9lLmlzTnVsbCgpPzA6LTE6ZS5pc051bGwoKT8xOnRoaXMuX21pbng8ZS5fbWlueD8tMTp0aGlzLl9taW54PmUuX21pbng/MTp0aGlzLl9taW55PGUuX21pbnk/LTE6dGhpcy5fbWlueT5lLl9taW55PzE6dGhpcy5fbWF4eDxlLl9tYXh4Py0xOnRoaXMuX21heHg+ZS5fbWF4eD8xOnRoaXMuX21heHk8ZS5fbWF4eT8tMTp0aGlzLl9tYXh5PmUuX21heHk/MTowfSxqaS5wcm90b3R5cGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5pc051bGwoKSlyZXR1cm4gbnVsbDt0aGlzLmluaXQodGhpcy5nZXRNaW5YKCkrdCx0aGlzLmdldE1heFgoKSt0LHRoaXMuZ2V0TWluWSgpK2UsdGhpcy5nZXRNYXhZKCkrZSl9LGppLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJFbnZbIit0aGlzLl9taW54KyIgOiAiK3RoaXMuX21heHgrIiwgIit0aGlzLl9taW55KyIgOiAiK3RoaXMuX21heHkrIl0ifSxqaS5wcm90b3R5cGUuc2V0VG9OdWxsPWZ1bmN0aW9uKCl7dGhpcy5fbWlueD0wLHRoaXMuX21heHg9LTEsdGhpcy5fbWlueT0wLHRoaXMuX21heHk9LTF9LGppLnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc051bGwoKT8wOnRoaXMuX21heHktdGhpcy5fbWlueX0samkucHJvdG90eXBlLm1heEV4dGVudD1mdW5jdGlvbigpe2lmKHRoaXMuaXNOdWxsKCkpcmV0dXJuIDA7dmFyIHQ9dGhpcy5nZXRXaWR0aCgpLGU9dGhpcy5nZXRIZWlnaHQoKTtyZXR1cm4gdD5lP3Q6ZX0samkucHJvdG90eXBlLmV4cGFuZEJ5PWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmV4cGFuZEJ5KHQsdCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKHRoaXMuaXNOdWxsKCkpcmV0dXJuIG51bGw7dGhpcy5fbWlueC09ZSx0aGlzLl9tYXh4Kz1lLHRoaXMuX21pbnktPW4sdGhpcy5fbWF4eSs9biwodGhpcy5fbWlueD50aGlzLl9tYXh4fHx0aGlzLl9taW55PnRoaXMuX21heHkpJiZ0aGlzLnNldFRvTnVsbCgpfX0samkucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygamkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jb3ZlcnModCl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNvdmVycyhlKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmNvdmVycyhuLHIpfX0samkucHJvdG90eXBlLmNlbnRyZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTnVsbCgpP251bGw6bmV3IHZpKCh0aGlzLmdldE1pblgoKSt0aGlzLmdldE1heFgoKSkvMiwodGhpcy5nZXRNaW5ZKCkrdGhpcy5nZXRNYXhZKCkpLzIpfSxqaS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuc2V0VG9OdWxsKCk7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuaW5pdCh0LngsdC54LHQueSx0LnkpfWVsc2UgaWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBqaSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX21pbng9ZS5fbWlueCx0aGlzLl9tYXh4PWUuX21heHgsdGhpcy5fbWlueT1lLl9taW55LHRoaXMuX21heHk9ZS5fbWF4eX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMuaW5pdChuLngsci54LG4ueSxyLnkpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1szXTtpPG8/KHRoaXMuX21pbng9aSx0aGlzLl9tYXh4PW8pOih0aGlzLl9taW54PW8sdGhpcy5fbWF4eD1pKSxzPGE/KHRoaXMuX21pbnk9cyx0aGlzLl9tYXh5PWEpOih0aGlzLl9taW55PWEsdGhpcy5fbWF4eT1zKX19LGppLnByb3RvdHlwZS5nZXRNYXhZPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heHl9LGppLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbih0KXtpZih0aGlzLmludGVyc2VjdHModCkpcmV0dXJuIDA7dmFyIGU9MDt0aGlzLl9tYXh4PHQuX21pbng/ZT10Ll9taW54LXRoaXMuX21heHg6dGhpcy5fbWlueD50Ll9tYXh4JiYoZT10aGlzLl9taW54LXQuX21heHgpO3ZhciBuPTA7cmV0dXJuIHRoaXMuX21heHk8dC5fbWlueT9uPXQuX21pbnktdGhpcy5fbWF4eTp0aGlzLl9taW55PnQuX21heHkmJihuPXRoaXMuX21pbnktdC5fbWF4eSksMD09PWU/bjowPT09bj9lOk1hdGguc3FydChlKmUrbipuKX0samkucHJvdG90eXBlLmhhc2hDb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9MTc7cmV0dXJuIHQ9MzcqKHQ9MzcqKHQ9MzcqKHQ9MzcqdCt2aS5oYXNoQ29kZSh0aGlzLl9taW54KSkrdmkuaGFzaENvZGUodGhpcy5fbWF4eCkpK3ZpLmhhc2hDb2RlKHRoaXMuX21pbnkpKSt2aS5oYXNoQ29kZSh0aGlzLl9tYXh5KX0samkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpLG1pXX0samkucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGppfSxqaS5pbnRlcnNlY3RzPWZ1bmN0aW9uKCl7aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTtyZXR1cm4gbi54Pj0odC54PGUueD90Lng6ZS54KSYmbi54PD0odC54PmUueD90Lng6ZS54KSYmbi55Pj0odC55PGUueT90Lnk6ZS55KSYmbi55PD0odC55PmUueT90Lnk6ZS55KX1pZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdLHM9YXJndW1lbnRzWzNdLGE9TWF0aC5taW4oby54LHMueCksdT1NYXRoLm1heChvLngscy54KSxjPU1hdGgubWluKHIueCxpLngpLGw9TWF0aC5tYXgoci54LGkueCk7cmV0dXJuIShjPnV8fGw8YXx8KGE9TWF0aC5taW4oby55LHMueSksdT1NYXRoLm1heChvLnkscy55KSxjPU1hdGgubWluKHIueSxpLnkpLGw9TWF0aC5tYXgoci55LGkueSksYz51KXx8bDxhKX19LFVpLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NTE4NDVjZDU1MjE4OTgwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoamksVWkpO3ZhciBxaT17dHlwZVN0cjovXlxzKihcdyspXHMqXChccyooLiopXHMqXClccyokLyxlbXB0eVR5cGVTdHI6L15ccyooXHcrKVxzKkVNUFRZXHMqJC8sc3BhY2VzOi9ccysvLHBhcmVuQ29tbWE6L1wpXHMqLFxzKlwoLyxkb3VibGVQYXJlbkNvbW1hOi9cKVxzKlwpXHMqLFxzKlwoXHMqXCgvLHRyaW1QYXJlbnM6L15ccypcKD8oLio/KVwpP1xzKiQvfSxWaT1mdW5jdGlvbih0KXt0aGlzLmdlb21ldHJ5RmFjdG9yeT10fHxuZXcgSXN9O1ZpLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKHQpe3ZhciBlLG4scjt0PXQucmVwbGFjZSgvW1xuXHJdL2csIiAiKTt2YXIgaT1xaS50eXBlU3RyLmV4ZWModCk7aWYoLTEhPT10LnNlYXJjaCgiRU1QVFkiKSYmKChpPXFpLmVtcHR5VHlwZVN0ci5leGVjKHQpKVsyXT12b2lkIDApLGkmJihuPWlbMV0udG9Mb3dlckNhc2UoKSxyPWlbMl0sWWlbbl0mJihlPVlpW25dLmFwcGx5KHRoaXMsW3JdKSkpLHZvaWQgMD09PWUpdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgcGFyc2UgV0tUICIrdCk7cmV0dXJuIGV9LFZpLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5leHRyYWN0R2VvbWV0cnkodCl9LFZpLnByb3RvdHlwZS5leHRyYWN0R2VvbWV0cnk9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRHZW9tZXRyeVR5cGUoKS50b0xvd2VyQ2FzZSgpO2lmKCFHaVtlXSlyZXR1cm4gbnVsbDt2YXIgbj1lLnRvVXBwZXJDYXNlKCk7cmV0dXJuIHQuaXNFbXB0eSgpP24rIiBFTVBUWSI6bisiKCIrR2lbZV0uYXBwbHkodGhpcyxbdF0pKyIpIn07dmFyIEdpPXtjb29yZGluYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0LngrIiAiK3QueX0scG9pbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIEdpLmNvb3JkaW5hdGUuY2FsbCh0aGlzLHQuX2Nvb3JkaW5hdGVzLl9jb29yZGluYXRlc1swXSl9LG11bHRpcG9pbnQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX2dlb21ldHJpZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKCIoIitHaS5wb2ludC5hcHBseSh0aGlzLFt0Ll9nZW9tZXRyaWVzW25dXSkrIikiKTtyZXR1cm4gZS5qb2luKCIsIil9LGxpbmVzdHJpbmc6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX3BvaW50cy5fY29vcmRpbmF0ZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKEdpLmNvb3JkaW5hdGUuYXBwbHkodGhpcyxbdC5fcG9pbnRzLl9jb29yZGluYXRlc1tuXV0pKTtyZXR1cm4gZS5qb2luKCIsIil9LGxpbmVhcnJpbmc6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MCxyPXQuX3BvaW50cy5fY29vcmRpbmF0ZXMubGVuZ3RoO248cjsrK24pZS5wdXNoKEdpLmNvb3JkaW5hdGUuYXBwbHkodGhpcyxbdC5fcG9pbnRzLl9jb29yZGluYXRlc1tuXV0pKTtyZXR1cm4gZS5qb2luKCIsIil9LG11bHRpbGluZXN0cmluZzpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5fZ2VvbWV0cmllcy5sZW5ndGg7bjxyOysrbillLnB1c2goIigiK0dpLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbdC5fZ2VvbWV0cmllc1tuXV0pKyIpIik7cmV0dXJuIGUuam9pbigiLCIpfSxwb2x5Z29uOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2UucHVzaCgiKCIrR2kubGluZXN0cmluZy5hcHBseSh0aGlzLFt0Ll9zaGVsbF0pKyIpIik7Zm9yKHZhciBuPTAscj10Ll9ob2xlcy5sZW5ndGg7bjxyOysrbillLnB1c2goIigiK0dpLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbdC5faG9sZXNbbl1dKSsiKSIpO3JldHVybiBlLmpvaW4oIiwiKX0sbXVsdGlwb2x5Z29uOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Ll9nZW9tZXRyaWVzLmxlbmd0aDtuPHI7KytuKWUucHVzaCgiKCIrR2kucG9seWdvbi5hcHBseSh0aGlzLFt0Ll9nZW9tZXRyaWVzW25dXSkrIikiKTtyZXR1cm4gZS5qb2luKCIsIil9LGdlb21ldHJ5Y29sbGVjdGlvbjpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wLHI9dC5fZ2VvbWV0cmllcy5sZW5ndGg7bjxyOysrbillLnB1c2godGhpcy5leHRyYWN0R2VvbWV0cnkodC5fZ2VvbWV0cmllc1tuXSkpO3JldHVybiBlLmpvaW4oIiwiKX19LFlpPXtwb2ludDpmdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXJldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVQb2ludCgpO3ZhciBlPXQudHJpbSgpLnNwbGl0KHFpLnNwYWNlcyk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvaW50KG5ldyB2aShOdW1iZXIucGFyc2VGbG9hdChlWzBdKSxOdW1iZXIucGFyc2VGbG9hdChlWzFdKSkpfSxtdWx0aXBvaW50OmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpUG9pbnQoKTtmb3IodmFyIGUsbj10LnRyaW0oKS5zcGxpdCgiLCIpLHI9W10saT0wLG89bi5sZW5ndGg7aTxvOysraSllPW5baV0ucmVwbGFjZShxaS50cmltUGFyZW5zLCIkMSIpLHIucHVzaChZaS5wb2ludC5hcHBseSh0aGlzLFtlXSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVNdWx0aVBvaW50KHIpfSxsaW5lc3RyaW5nOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVTdHJpbmcoKTtmb3IodmFyIGUsbj10LnRyaW0oKS5zcGxpdCgiLCIpLHI9W10saT0wLG89bi5sZW5ndGg7aTxvOysraSllPW5baV0udHJpbSgpLnNwbGl0KHFpLnNwYWNlcyksci5wdXNoKG5ldyB2aShOdW1iZXIucGFyc2VGbG9hdChlWzBdKSxOdW1iZXIucGFyc2VGbG9hdChlWzFdKSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKHIpfSxsaW5lYXJyaW5nOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVhclJpbmcoKTtmb3IodmFyIGUsbj10LnRyaW0oKS5zcGxpdCgiLCIpLHI9W10saT0wLG89bi5sZW5ndGg7aTxvOysraSllPW5baV0udHJpbSgpLnNwbGl0KHFpLnNwYWNlcyksci5wdXNoKG5ldyB2aShOdW1iZXIucGFyc2VGbG9hdChlWzBdKSxOdW1iZXIucGFyc2VGbG9hdChlWzFdKSkpO3JldHVybiB0aGlzLmdlb21ldHJ5RmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKHIpfSxtdWx0aWxpbmVzdHJpbmc6ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKCk7Zm9yKHZhciBlLG49dC50cmltKCkuc3BsaXQocWkucGFyZW5Db21tYSkscj1bXSxpPTAsbz1uLmxlbmd0aDtpPG87KytpKWU9bltpXS5yZXBsYWNlKHFpLnRyaW1QYXJlbnMsIiQxIiksci5wdXNoKFlpLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbZV0pKTtyZXR1cm4gdGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKHIpfSxwb2x5Z29uOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvbHlnb24oKTtmb3IodmFyIGUsbixyLGksbz10LnRyaW0oKS5zcGxpdChxaS5wYXJlbkNvbW1hKSxzPVtdLGE9MCx1PW8ubGVuZ3RoO2E8dTsrK2EpZT1vW2FdLnJlcGxhY2UocWkudHJpbVBhcmVucywiJDEiKSxuPVlpLmxpbmVzdHJpbmcuYXBwbHkodGhpcyxbZV0pLHI9dGhpcy5nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyhuLl9wb2ludHMpLDA9PT1hP2k9cjpzLnB1c2gocik7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvbHlnb24oaSxzKX0sbXVsdGlwb2x5Z29uOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpUG9seWdvbigpO2Zvcih2YXIgZSxuPXQudHJpbSgpLnNwbGl0KHFpLmRvdWJsZVBhcmVuQ29tbWEpLHI9W10saT0wLG89bi5sZW5ndGg7aTxvOysraSllPW5baV0ucmVwbGFjZShxaS50cmltUGFyZW5zLCIkMSIpLHIucHVzaChZaS5wb2x5Z29uLmFwcGx5KHRoaXMsW2VdKSk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZU11bHRpUG9seWdvbihyKX0sZ2VvbWV0cnljb2xsZWN0aW9uOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbigpO2Zvcih2YXIgZT0odD10LnJlcGxhY2UoLyxccyooW0EtWmEtel0pL2csInwkMSIpKS50cmltKCkuc3BsaXQoInwiKSxuPVtdLHI9MCxpPWUubGVuZ3RoO3I8aTsrK3Ipbi5wdXNoKHRoaXMucmVhZChlW3JdKSk7cmV0dXJuIHRoaXMuZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihuKX19LFhpPWZ1bmN0aW9uKHQpe3RoaXMucGFyc2VyPW5ldyBWaSh0KX07WGkucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBhcnNlci53cml0ZSh0KX0sWGkudG9MaW5lU3RyaW5nPWZ1bmN0aW9uKHQsZSl7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQiKTtyZXR1cm4iTElORVNUUklORyAoICIrdC54KyIgIit0LnkrIiwgIitlLngrIiAiK2UueSsiICkifTt2YXIgV2k9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyxlKSx0aGlzLm5hbWU9IlJ1bnRpbWVFeGNlcHRpb24iLHRoaXMubWVzc2FnZT1lLHRoaXMuc3RhY2s9KG5ldyB0KS5zdGFja31yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX0oRXJyb3IpLEhpPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtpZih0LmNhbGwodGhpcyksMD09PWFyZ3VtZW50cy5sZW5ndGgpdC5jYWxsKHRoaXMpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0LmNhbGwodGhpcyxlKX19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KFdpKSxaaT1mdW5jdGlvbigpe307WmkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFppLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBaaX0sWmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmU9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClaaS5zaG91bGROZXZlclJlYWNoSGVyZShudWxsKTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhyb3cgbmV3IEhpKCJTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSIrKG51bGwhPT10PyI6ICIrdDoiIikpfX0sWmkuaXNUcnVlPWZ1bmN0aW9uKCl7dmFyIHQ7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpWmkuaXNUcnVlKGFyZ3VtZW50c1swXSxudWxsKTtlbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYodD1hcmd1bWVudHNbMV0sIWFyZ3VtZW50c1swXSkpdGhyb3cgbnVsbD09PXQ/bmV3IEhpOm5ldyBIaSh0KX0sWmkuZXF1YWxzPWZ1bmN0aW9uKCl7dmFyIHQsZSxuO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKVppLmVxdWFscyh0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxudWxsKTtlbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoJiYodD1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMl0sIShlPWFyZ3VtZW50c1sxXSkuZXF1YWxzKHQpKSl0aHJvdyBuZXcgSGkoIkV4cGVjdGVkICIrdCsiIGJ1dCBlbmNvdW50ZXJlZCAiK2UrKG51bGwhPT1uPyI6ICIrbjoiIikpfTt2YXIgS2k9ZnVuY3Rpb24oKXt0aGlzLl9yZXN1bHQ9bnVsbCx0aGlzLl9pbnB1dExpbmVzPUFycmF5KDIpLmZpbGwoKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5KDIpfSkpLHRoaXMuX2ludFB0PW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX2ludExpbmVJbmRleD1udWxsLHRoaXMuX2lzUHJvcGVyPW51bGwsdGhpcy5fcGE9bnVsbCx0aGlzLl9wYj1udWxsLHRoaXMuX3ByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5faW50UHRbMF09bmV3IHZpLHRoaXMuX2ludFB0WzFdPW5ldyB2aSx0aGlzLl9wYT10aGlzLl9pbnRQdFswXSx0aGlzLl9wYj10aGlzLl9pbnRQdFsxXSx0aGlzLl9yZXN1bHQ9MH0sSmk9e0RPTlRfSU5URVJTRUNUOntjb25maWd1cmFibGU6ITB9LERPX0lOVEVSU0VDVDp7Y29uZmlndXJhYmxlOiEwfSxDT0xMSU5FQVI6e2NvbmZpZ3VyYWJsZTohMH0sTk9fSU5URVJTRUNUSU9OOntjb25maWd1cmFibGU6ITB9LFBPSU5UX0lOVEVSU0VDVElPTjp7Y29uZmlndXJhYmxlOiEwfSxDT0xMSU5FQVJfSU5URVJTRUNUSU9OOntjb25maWd1cmFibGU6ITB9fTtLaS5wcm90b3R5cGUuZ2V0SW5kZXhBbG9uZ1NlZ21lbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb21wdXRlSW50TGluZUluZGV4KCksdGhpcy5faW50TGluZUluZGV4W3RdW2VdfSxLaS5wcm90b3R5cGUuZ2V0VG9wb2xvZ3lTdW1tYXJ5PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFpO3JldHVybiB0aGlzLmlzRW5kUG9pbnQoKSYmdC5hcHBlbmQoIiBlbmRwb2ludCIpLHRoaXMuX2lzUHJvcGVyJiZ0LmFwcGVuZCgiIHByb3BlciIpLHRoaXMuaXNDb2xsaW5lYXIoKSYmdC5hcHBlbmQoIiBjb2xsaW5lYXIiKSx0LnRvU3RyaW5nKCl9LEtpLnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3RoaXMuX2lucHV0TGluZXNbMF1bMF09dCx0aGlzLl9pbnB1dExpbmVzWzBdWzFdPWUsdGhpcy5faW5wdXRMaW5lc1sxXVswXT1uLHRoaXMuX2lucHV0TGluZXNbMV1bMV09cix0aGlzLl9yZXN1bHQ9dGhpcy5jb21wdXRlSW50ZXJzZWN0KHQsZSxuLHIpfSxLaS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0aW9uTnVtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc3VsdH0sS2kucHJvdG90eXBlLmNvbXB1dGVJbnRMaW5lSW5kZXg9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCludWxsPT09dGhpcy5faW50TGluZUluZGV4JiYodGhpcy5faW50TGluZUluZGV4PUFycmF5KDIpLmZpbGwoKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5KDIpfSkpLHRoaXMuY29tcHV0ZUludExpbmVJbmRleCgwKSx0aGlzLmNvbXB1dGVJbnRMaW5lSW5kZXgoMSkpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLmdldEVkZ2VEaXN0YW5jZSh0LDApPnRoaXMuZ2V0RWRnZURpc3RhbmNlKHQsMSk/KHRoaXMuX2ludExpbmVJbmRleFt0XVswXT0wLHRoaXMuX2ludExpbmVJbmRleFt0XVsxXT0xKToodGhpcy5faW50TGluZUluZGV4W3RdWzBdPTEsdGhpcy5faW50TGluZUluZGV4W3RdWzFdPTApfX0sS2kucHJvdG90eXBlLmlzUHJvcGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFzSW50ZXJzZWN0aW9uKCkmJnRoaXMuX2lzUHJvcGVyfSxLaS5wcm90b3R5cGUuc2V0UHJlY2lzaW9uTW9kZWw9ZnVuY3Rpb24odCl7dGhpcy5fcHJlY2lzaW9uTW9kZWw9dH0sS2kucHJvdG90eXBlLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiEoIXRoaXMuaXNJbnRlcmlvckludGVyc2VjdGlvbigwKSYmIXRoaXMuaXNJbnRlcmlvckludGVyc2VjdGlvbigxKSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj0wO248dGhpcy5fcmVzdWx0O24rKylpZighdC5faW50UHRbbl0uZXF1YWxzMkQodC5faW5wdXRMaW5lc1tlXVswXSkmJiF0Ll9pbnRQdFtuXS5lcXVhbHMyRCh0Ll9pbnB1dExpbmVzW2VdWzFdKSlyZXR1cm4hMDtyZXR1cm4hMX19LEtpLnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ludFB0W3RdfSxLaS5wcm90b3R5cGUuaXNFbmRQb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhhc0ludGVyc2VjdGlvbigpJiYhdGhpcy5faXNQcm9wZXJ9LEtpLnByb3RvdHlwZS5oYXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzdWx0IT09S2kuTk9fSU5URVJTRUNUSU9OfSxLaS5wcm90b3R5cGUuZ2V0RWRnZURpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEtpLmNvbXB1dGVFZGdlRGlzdGFuY2UodGhpcy5faW50UHRbZV0sdGhpcy5faW5wdXRMaW5lc1t0XVswXSx0aGlzLl9pbnB1dExpbmVzW3RdWzFdKX0sS2kucHJvdG90eXBlLmlzQ29sbGluZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc3VsdD09PUtpLkNPTExJTkVBUl9JTlRFUlNFQ1RJT059LEtpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBYaS50b0xpbmVTdHJpbmcodGhpcy5faW5wdXRMaW5lc1swXVswXSx0aGlzLl9pbnB1dExpbmVzWzBdWzFdKSsiIC0gIitYaS50b0xpbmVTdHJpbmcodGhpcy5faW5wdXRMaW5lc1sxXVswXSx0aGlzLl9pbnB1dExpbmVzWzFdWzFdKSt0aGlzLmdldFRvcG9sb2d5U3VtbWFyeSgpfSxLaS5wcm90b3R5cGUuZ2V0RW5kcG9pbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5faW5wdXRMaW5lc1t0XVtlXX0sS2kucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fcmVzdWx0O2UrKylpZih0aGlzLl9pbnRQdFtlXS5lcXVhbHMyRCh0KSlyZXR1cm4hMDtyZXR1cm4hMX0sS2kucHJvdG90eXBlLmdldEludGVyc2VjdGlvbkFsb25nU2VnbWVudD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvbXB1dGVJbnRMaW5lSW5kZXgoKSx0aGlzLl9pbnRQdFt0aGlzLl9pbnRMaW5lSW5kZXhbdF1bZV1dfSxLaS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sS2kucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEtpfSxLaS5jb21wdXRlRWRnZURpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1NYXRoLmFicyhuLngtZS54KSxpPU1hdGguYWJzKG4ueS1lLnkpLG89LTE7aWYodC5lcXVhbHMoZSkpbz0wO2Vsc2UgaWYodC5lcXVhbHMobikpbz1yPmk/cjppO2Vsc2V7dmFyIHM9TWF0aC5hYnModC54LWUueCksYT1NYXRoLmFicyh0LnktZS55KTswPT09KG89cj5pP3M6YSkmJiF0LmVxdWFscyhlKSYmKG89TWF0aC5tYXgocyxhKSl9cmV0dXJuIFppLmlzVHJ1ZSghKDA9PT1vJiYhdC5lcXVhbHMoZSkpLCJCYWQgZGlzdGFuY2UgY2FsY3VsYXRpb24iKSxvfSxLaS5ub25Sb2J1c3RDb21wdXRlRWRnZURpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LngtZS54LGk9dC55LWUueSxvPU1hdGguc3FydChyKnIraSppKTtyZXR1cm4gWmkuaXNUcnVlKCEoMD09PW8mJiF0LmVxdWFscyhlKSksIkludmFsaWQgZGlzdGFuY2UgY2FsY3VsYXRpb24iKSxvfSxKaS5ET05UX0lOVEVSU0VDVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sSmkuRE9fSU5URVJTRUNULmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxKaS5DT0xMSU5FQVIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LEppLk5PX0lOVEVSU0VDVElPTi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sSmkuUE9JTlRfSU5URVJTRUNUSU9OLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxKaS5DT0xMSU5FQVJfSU5URVJTRUNUSU9OLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhLaSxKaSk7dmFyIFFpPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaXNJblNlZ21lbnRFbnZlbG9wZXM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGppKHRoaXMuX2lucHV0TGluZXNbMF1bMF0sdGhpcy5faW5wdXRMaW5lc1swXVsxXSksbj1uZXcgamkodGhpcy5faW5wdXRMaW5lc1sxXVswXSx0aGlzLl9pbnB1dExpbmVzWzFdWzFdKTtyZXR1cm4gZS5jb250YWlucyh0KSYmbi5jb250YWlucyh0KX0sZS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbj1mdW5jdGlvbigpe2lmKDMhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5jb21wdXRlSW50ZXJzZWN0aW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07aWYodGhpcy5faXNQcm9wZXI9ITEsamkuaW50ZXJzZWN0cyhuLHIsZSkmJjA9PT1lby5vcmllbnRhdGlvbkluZGV4KG4scixlKSYmMD09PWVvLm9yaWVudGF0aW9uSW5kZXgocixuLGUpKXJldHVybiB0aGlzLl9pc1Byb3Blcj0hMCwoZS5lcXVhbHMobil8fGUuZXF1YWxzKHIpKSYmKHRoaXMuX2lzUHJvcGVyPSExKSx0aGlzLl9yZXN1bHQ9dC5QT0lOVF9JTlRFUlNFQ1RJT04sbnVsbDt0aGlzLl9yZXN1bHQ9dC5OT19JTlRFUlNFQ1RJT059LGUucHJvdG90eXBlLm5vcm1hbGl6ZVRvTWluaW11bT1mdW5jdGlvbih0LGUsbixyLGkpe2kueD10aGlzLnNtYWxsZXN0SW5BYnNWYWx1ZSh0LngsZS54LG4ueCxyLngpLGkueT10aGlzLnNtYWxsZXN0SW5BYnNWYWx1ZSh0LnksZS55LG4ueSxyLnkpLHQueC09aS54LHQueS09aS55LGUueC09aS54LGUueS09aS55LG4ueC09aS54LG4ueS09aS55LHIueC09aS54LHIueS09aS55fSxlLnByb3RvdHlwZS5zYWZlSENvb3JkaW5hdGVJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxuLHIsaSl7dmFyIG89bnVsbDt0cnl7bz16aS5pbnRlcnNlY3Rpb24odCxuLHIsaSl9Y2F0Y2gocyl7aWYoIShzIGluc3RhbmNlb2YgQmkpKXRocm93IHM7bz1lLm5lYXJlc3RFbmRwb2ludCh0LG4scixpKX1yZXR1cm4gb30sZS5wcm90b3R5cGUuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsbixyLGkpe3ZhciBvPXRoaXMuaW50ZXJzZWN0aW9uV2l0aE5vcm1hbGl6YXRpb24odCxuLHIsaSk7cmV0dXJuIHRoaXMuaXNJblNlZ21lbnRFbnZlbG9wZXMobyl8fChvPW5ldyB2aShlLm5lYXJlc3RFbmRwb2ludCh0LG4scixpKSkpLG51bGwhPT10aGlzLl9wcmVjaXNpb25Nb2RlbCYmdGhpcy5fcHJlY2lzaW9uTW9kZWwubWFrZVByZWNpc2Uobyksb30sZS5wcm90b3R5cGUuc21hbGxlc3RJbkFic1ZhbHVlPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXQsbz1NYXRoLmFicyhpKTtyZXR1cm4gTWF0aC5hYnMoZSk8byYmKGk9ZSxvPU1hdGguYWJzKGUpKSxNYXRoLmFicyhuKTxvJiYoaT1uLG89TWF0aC5hYnMobikpLE1hdGguYWJzKHIpPG8mJihpPXIpLGl9LGUucHJvdG90eXBlLmNoZWNrREQ9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1UaS5pbnRlcnNlY3Rpb24odCxlLG4scikscz10aGlzLmlzSW5TZWdtZW50RW52ZWxvcGVzKG8pO2tpLm91dC5wcmludGxuKCJERCBpbiBlbnYgPSAiK3MrIiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICIrbyksaS5kaXN0YW5jZShvKT4xZS00JiZraS5vdXQucHJpbnRsbigiRGlzdGFuY2UgPSAiK2kuZGlzdGFuY2UobykpfSxlLnByb3RvdHlwZS5pbnRlcnNlY3Rpb25XaXRoTm9ybWFsaXphdGlvbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1uZXcgdmkodCksbz1uZXcgdmkoZSkscz1uZXcgdmkobiksYT1uZXcgdmkociksdT1uZXcgdmk7dGhpcy5ub3JtYWxpemVUb0VudkNlbnRyZShpLG8scyxhLHUpO3ZhciBjPXRoaXMuc2FmZUhDb29yZGluYXRlSW50ZXJzZWN0aW9uKGksbyxzLGEpO3JldHVybiBjLngrPXUueCxjLnkrPXUueSxjfSxlLnByb3RvdHlwZS5jb21wdXRlQ29sbGluZWFySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKGUsbixyLGkpe3ZhciBvPWppLmludGVyc2VjdHMoZSxuLHIpLHM9amkuaW50ZXJzZWN0cyhlLG4saSksYT1qaS5pbnRlcnNlY3RzKHIsaSxlKSx1PWppLmludGVyc2VjdHMocixpLG4pO3JldHVybiBvJiZzPyh0aGlzLl9pbnRQdFswXT1yLHRoaXMuX2ludFB0WzFdPWksdC5DT0xMSU5FQVJfSU5URVJTRUNUSU9OKTphJiZ1Pyh0aGlzLl9pbnRQdFswXT1lLHRoaXMuX2ludFB0WzFdPW4sdC5DT0xMSU5FQVJfSU5URVJTRUNUSU9OKTpvJiZhPyh0aGlzLl9pbnRQdFswXT1yLHRoaXMuX2ludFB0WzFdPWUsIXIuZXF1YWxzKGUpfHxzfHx1P3QuQ09MTElORUFSX0lOVEVSU0VDVElPTjp0LlBPSU5UX0lOVEVSU0VDVElPTik6byYmdT8odGhpcy5faW50UHRbMF09cix0aGlzLl9pbnRQdFsxXT1uLCFyLmVxdWFscyhuKXx8c3x8YT90LkNPTExJTkVBUl9JTlRFUlNFQ1RJT046dC5QT0lOVF9JTlRFUlNFQ1RJT04pOnMmJmE/KHRoaXMuX2ludFB0WzBdPWksdGhpcy5faW50UHRbMV09ZSwhaS5lcXVhbHMoZSl8fG98fHU/dC5DT0xMSU5FQVJfSU5URVJTRUNUSU9OOnQuUE9JTlRfSU5URVJTRUNUSU9OKTpzJiZ1Pyh0aGlzLl9pbnRQdFswXT1pLHRoaXMuX2ludFB0WzFdPW4sIWkuZXF1YWxzKG4pfHxvfHxhP3QuQ09MTElORUFSX0lOVEVSU0VDVElPTjp0LlBPSU5UX0lOVEVSU0VDVElPTik6dC5OT19JTlRFUlNFQ1RJT059LGUucHJvdG90eXBlLm5vcm1hbGl6ZVRvRW52Q2VudHJlPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG89dC54PGUueD90Lng6ZS54LHM9dC55PGUueT90Lnk6ZS55LGE9dC54PmUueD90Lng6ZS54LHU9dC55PmUueT90Lnk6ZS55LGM9bi54PHIueD9uLng6ci54LGw9bi55PHIueT9uLnk6ci55LGg9bi54PnIueD9uLng6ci54LGY9bi55PnIueT9uLnk6ci55LHA9KChvPmM/bzpjKSsoYTxoP2E6aCkpLzIsZD0oKHM+bD9zOmwpKyh1PGY/dTpmKSkvMjtpLng9cCxpLnk9ZCx0LngtPWkueCx0LnktPWkueSxlLngtPWkueCxlLnktPWkueSxuLngtPWkueCxuLnktPWkueSxyLngtPWkueCxyLnktPWkueX0sZS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdD1mdW5jdGlvbihlLG4scixpKXtpZih0aGlzLl9pc1Byb3Blcj0hMSwhamkuaW50ZXJzZWN0cyhlLG4scixpKSlyZXR1cm4gdC5OT19JTlRFUlNFQ1RJT047dmFyIG89ZW8ub3JpZW50YXRpb25JbmRleChlLG4scikscz1lby5vcmllbnRhdGlvbkluZGV4KGUsbixpKTtpZihvPjAmJnM+MHx8bzwwJiZzPDApcmV0dXJuIHQuTk9fSU5URVJTRUNUSU9OO3ZhciBhPWVvLm9yaWVudGF0aW9uSW5kZXgocixpLGUpLHU9ZW8ub3JpZW50YXRpb25JbmRleChyLGksbik7cmV0dXJuIGE+MCYmdT4wfHxhPDAmJnU8MD90Lk5PX0lOVEVSU0VDVElPTjowPT09byYmMD09PXMmJjA9PT1hJiYwPT09dT90aGlzLmNvbXB1dGVDb2xsaW5lYXJJbnRlcnNlY3Rpb24oZSxuLHIsaSk6KDA9PT1vfHwwPT09c3x8MD09PWF8fDA9PT11Pyh0aGlzLl9pc1Byb3Blcj0hMSxlLmVxdWFsczJEKHIpfHxlLmVxdWFsczJEKGkpP3RoaXMuX2ludFB0WzBdPWU6bi5lcXVhbHMyRChyKXx8bi5lcXVhbHMyRChpKT90aGlzLl9pbnRQdFswXT1uOjA9PT1vP3RoaXMuX2ludFB0WzBdPW5ldyB2aShyKTowPT09cz90aGlzLl9pbnRQdFswXT1uZXcgdmkoaSk6MD09PWE/dGhpcy5faW50UHRbMF09bmV3IHZpKGUpOjA9PT11JiYodGhpcy5faW50UHRbMF09bmV3IHZpKG4pKSk6KHRoaXMuX2lzUHJvcGVyPSEwLHRoaXMuX2ludFB0WzBdPXRoaXMuaW50ZXJzZWN0aW9uKGUsbixyLGkpKSx0LlBPSU5UX0lOVEVSU0VDVElPTil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGUubmVhcmVzdEVuZHBvaW50PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXQsbz1lby5kaXN0YW5jZVBvaW50TGluZSh0LG4scikscz1lby5kaXN0YW5jZVBvaW50TGluZShlLG4scik7cmV0dXJuIHM8byYmKG89cyxpPWUpLChzPWVvLmRpc3RhbmNlUG9pbnRMaW5lKG4sdCxlKSk8byYmKG89cyxpPW4pLChzPWVvLmRpc3RhbmNlUG9pbnRMaW5lKHIsdCxlKSk8byYmKG89cyxpPXIpLGl9LGV9KEtpKSwkaT1mdW5jdGlvbigpe307JGkucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LCRpLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiAkaX0sJGkub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS54LXQueCxpPWUueS10Lnksbz1uLngtZS54LHM9bi55LWUueTtyZXR1cm4gJGkuc2lnbk9mRGV0MngyKHIsaSxvLHMpfSwkaS5zaWduT2ZEZXQyeDI9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9bnVsbCxvPW51bGwscz1udWxsO2lmKGk9MSwwPT09dHx8MD09PXIpcmV0dXJuIDA9PT1lfHwwPT09bj8wOmU+MD9uPjA/LWk6aTpuPjA/aTotaTtpZigwPT09ZXx8MD09PW4pcmV0dXJuIHI+MD90PjA/aTotaTp0PjA/LWk6aTtpZihlPjA/cj4wP2U8PXJ8fChpPS1pLG89dCx0PW4sbj1vLG89ZSxlPXIscj1vKTplPD0tcj8oaT0taSxuPS1uLHI9LXIpOihvPXQsdD0tbixuPW8sbz1lLGU9LXIscj1vKTpyPjA/LWU8PXI/KGk9LWksdD0tdCxlPS1lKToobz0tdCx0PW4sbj1vLG89LWUsZT1yLHI9byk6ZT49cj8odD0tdCxlPS1lLG49LW4scj0tcik6KGk9LWksbz0tdCx0PS1uLG49byxvPS1lLGU9LXIscj1vKSx0PjApe2lmKCEobj4wKSlyZXR1cm4gaTtpZighKHQ8PW4pKXJldHVybiBpfWVsc2V7aWYobj4wKXJldHVybi1pO2lmKCEodD49bikpcmV0dXJuLWk7aT0taSx0PS10LG49LW59Zm9yKDs7KXtpZigoci09KHM9TWF0aC5mbG9vcihuL3QpKSplKTwwKXJldHVybi1pO2lmKHI+ZSlyZXR1cm4gaTtpZih0PihuLT1zKnQpK24pe2lmKGU8cityKXJldHVybiBpfWVsc2V7aWYoZT5yK3IpcmV0dXJuLWk7bj10LW4scj1lLXIsaT0taX1pZigwPT09cilyZXR1cm4gMD09PW4/MDotaTtpZigwPT09bnx8KHQtPShzPU1hdGguZmxvb3IodC9uKSkqbiwoZS09cypyKTwwKSlyZXR1cm4gaTtpZihlPnIpcmV0dXJuLWk7aWYobj50K3Qpe2lmKHI8ZStlKXJldHVybi1pfWVsc2V7aWYocj5lK2UpcmV0dXJuIGk7dD1uLXQsZT1yLWUsaT0taX1pZigwPT09ZSlyZXR1cm4gMD09PXQ/MDppO2lmKDA9PT10KXJldHVybi1pfX07dmFyIHRvPWZ1bmN0aW9uKCl7dGhpcy5fcD1udWxsLHRoaXMuX2Nyb3NzaW5nQ291bnQ9MCx0aGlzLl9pc1BvaW50T25TZWdtZW50PSExO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9wPXR9O3RvLnByb3RvdHlwZS5jb3VudFNlZ21lbnQ9ZnVuY3Rpb24odCxlKXtpZih0Lng8dGhpcy5fcC54JiZlLng8dGhpcy5fcC54KXJldHVybiBudWxsO2lmKHRoaXMuX3AueD09PWUueCYmdGhpcy5fcC55PT09ZS55KXJldHVybiB0aGlzLl9pc1BvaW50T25TZWdtZW50PSEwLG51bGw7aWYodC55PT09dGhpcy5fcC55JiZlLnk9PT10aGlzLl9wLnkpe3ZhciBuPXQueCxyPWUueDtyZXR1cm4gbj5yJiYobj1lLngscj10LngpLHRoaXMuX3AueD49biYmdGhpcy5fcC54PD1yJiYodGhpcy5faXNQb2ludE9uU2VnbWVudD0hMCksbnVsbH1pZih0Lnk+dGhpcy5fcC55JiZlLnk8PXRoaXMuX3AueXx8ZS55PnRoaXMuX3AueSYmdC55PD10aGlzLl9wLnkpe3ZhciBpPXQueC10aGlzLl9wLngsbz10LnktdGhpcy5fcC55LHM9ZS54LXRoaXMuX3AueCxhPWUueS10aGlzLl9wLnksdT0kaS5zaWduT2ZEZXQyeDIoaSxvLHMsYSk7aWYoMD09PXUpcmV0dXJuIHRoaXMuX2lzUG9pbnRPblNlZ21lbnQ9ITAsbnVsbDthPG8mJih1PS11KSx1PjAmJnRoaXMuX2Nyb3NzaW5nQ291bnQrK319LHRvLnByb3RvdHlwZS5pc1BvaW50SW5Qb2x5Z29uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TG9jYXRpb24oKSE9PWJpLkVYVEVSSU9SfSx0by5wcm90b3R5cGUuZ2V0TG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNQb2ludE9uU2VnbWVudD9iaS5CT1VOREFSWTp0aGlzLl9jcm9zc2luZ0NvdW50JTI9PTE/YmkuSU5URVJJT1I6YmkuRVhURVJJT1J9LHRvLnByb3RvdHlwZS5pc09uU2VnbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1BvaW50T25TZWdtZW50fSx0by5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdG8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHRvfSx0by5sb2NhdGVQb2ludEluUmluZz1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJkVpKGFyZ3VtZW50c1sxXSxMaSkpe2Zvcih2YXIgdD1hcmd1bWVudHNbMV0sZT1uZXcgdG8oYXJndW1lbnRzWzBdKSxuPW5ldyB2aSxyPW5ldyB2aSxpPTE7aTx0LnNpemUoKTtpKyspaWYodC5nZXRDb29yZGluYXRlKGksbiksdC5nZXRDb29yZGluYXRlKGktMSxyKSxlLmNvdW50U2VnbWVudChuLHIpLGUuaXNPblNlZ21lbnQoKSlyZXR1cm4gZS5nZXRMb2NhdGlvbigpO3JldHVybiBlLmdldExvY2F0aW9uKCl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciBvPWFyZ3VtZW50c1sxXSxzPW5ldyB0byhhcmd1bWVudHNbMF0pLGE9MTthPG8ubGVuZ3RoO2ErKyl7dmFyIHU9b1thXSxjPW9bYS0xXTtpZihzLmNvdW50U2VnbWVudCh1LGMpLHMuaXNPblNlZ21lbnQoKSlyZXR1cm4gcy5nZXRMb2NhdGlvbigpfXJldHVybiBzLmdldExvY2F0aW9uKCl9fTt2YXIgZW89ZnVuY3Rpb24oKXt9LG5vPXtDTE9DS1dJU0U6e2NvbmZpZ3VyYWJsZTohMH0sUklHSFQ6e2NvbmZpZ3VyYWJsZTohMH0sQ09VTlRFUkNMT0NLV0lTRTp7Y29uZmlndXJhYmxlOiEwfSxMRUZUOntjb25maWd1cmFibGU6ITB9LENPTExJTkVBUjp7Y29uZmlndXJhYmxlOiEwfSxTVFJBSUdIVDp7Y29uZmlndXJhYmxlOiEwfX07ZW8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGVvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlb30sZW8ub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIFRpLm9yaWVudGF0aW9uSW5kZXgodCxlLG4pfSxlby5zaWduZWRBcmVhPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7dmFyIHQ9YXJndW1lbnRzWzBdO2lmKHQubGVuZ3RoPDMpcmV0dXJuIDA7Zm9yKHZhciBlPTAsbj10WzBdLngscj0xO3I8dC5sZW5ndGgtMTtyKyspe3ZhciBpPXRbcl0ueC1uLG89dFtyKzFdLnk7ZSs9aSoodFtyLTFdLnktbyl9cmV0dXJuIGUvMn1pZihFaShhcmd1bWVudHNbMF0sTGkpKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1zLnNpemUoKTtpZihhPDMpcmV0dXJuIDA7dmFyIHU9bmV3IHZpLGM9bmV3IHZpLGw9bmV3IHZpO3MuZ2V0Q29vcmRpbmF0ZSgwLGMpLHMuZ2V0Q29vcmRpbmF0ZSgxLGwpO3ZhciBoPWMueDtsLngtPWg7Zm9yKHZhciBmPTAscD0xO3A8YS0xO3ArKyl1Lnk9Yy55LGMueD1sLngsYy55PWwueSxzLmdldENvb3JkaW5hdGUocCsxLGwpLGwueC09aCxmKz1jLngqKHUueS1sLnkpO3JldHVybiBmLzJ9fSxlby5kaXN0YW5jZUxpbmVMaW5lPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQuZXF1YWxzKGUpKXJldHVybiBlby5kaXN0YW5jZVBvaW50TGluZSh0LG4scik7aWYobi5lcXVhbHMocikpcmV0dXJuIGVvLmRpc3RhbmNlUG9pbnRMaW5lKHIsdCxlKTt2YXIgaT0hMTtpZihqaS5pbnRlcnNlY3RzKHQsZSxuLHIpKXt2YXIgbz0oZS54LXQueCkqKHIueS1uLnkpLShlLnktdC55KSooci54LW4ueCk7aWYoMD09PW8paT0hMDtlbHNle3ZhciBzPSh0Lnktbi55KSooci54LW4ueCktKHQueC1uLngpKihyLnktbi55KSxhPSgodC55LW4ueSkqKGUueC10LngpLSh0Lngtbi54KSooZS55LXQueSkpL28sdT1zL287KHU8MHx8dT4xfHxhPDB8fGE+MSkmJihpPSEwKX19ZWxzZSBpPSEwO3JldHVybiBpP0NpLm1pbihlby5kaXN0YW5jZVBvaW50TGluZSh0LG4sciksZW8uZGlzdGFuY2VQb2ludExpbmUoZSxuLHIpLGVvLmRpc3RhbmNlUG9pbnRMaW5lKG4sdCxlKSxlby5kaXN0YW5jZVBvaW50TGluZShyLHQsZSkpOjB9LGVvLmlzUG9pbnRJblJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZW8ubG9jYXRlUG9pbnRJblJpbmcodCxlKSE9PWJpLkVYVEVSSU9SfSxlby5jb21wdXRlTGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2l6ZSgpO2lmKGU8PTEpcmV0dXJuIDA7dmFyIG49MCxyPW5ldyB2aTt0LmdldENvb3JkaW5hdGUoMCxyKTtmb3IodmFyIGk9ci54LG89ci55LHM9MTtzPGU7cysrKXt0LmdldENvb3JkaW5hdGUocyxyKTt2YXIgYT1yLngsdT1yLnksYz1hLWksbD11LW87bis9TWF0aC5zcXJ0KGMqYytsKmwpLGk9YSxvPXV9cmV0dXJuIG59LGVvLmlzQ0NXPWZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoLTE7aWYoZTwzKXRocm93IG5ldyBoaTtmb3IodmFyIG49dFswXSxyPTAsaT0xO2k8PWU7aSsrKXt2YXIgbz10W2ldO28ueT5uLnkmJihuPW8scj1pKX12YXIgcz1yO2RveyhzLT0xKTwwJiYocz1lKX13aGlsZSh0W3NdLmVxdWFsczJEKG4pJiZzIT09cik7dmFyIGE9cjtkb3thPShhKzEpJWV9d2hpbGUodFthXS5lcXVhbHMyRChuKSYmYSE9PXIpO3ZhciB1PXRbc10sYz10W2FdO2lmKHUuZXF1YWxzMkQobil8fGMuZXF1YWxzMkQobil8fHUuZXF1YWxzMkQoYykpcmV0dXJuITE7dmFyIGw9ZW8uY29tcHV0ZU9yaWVudGF0aW9uKHUsbixjKTtyZXR1cm4gMD09PWw/dS54PmMueDpsPjB9LGVvLmxvY2F0ZVBvaW50SW5SaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRvLmxvY2F0ZVBvaW50SW5SaW5nKHQsZSl9LGVvLmRpc3RhbmNlUG9pbnRMaW5lUGVycGVuZGljdWxhcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9KG4ueC1lLngpKihuLngtZS54KSsobi55LWUueSkqKG4ueS1lLnkpLGk9KChlLnktdC55KSoobi54LWUueCktKGUueC10LngpKihuLnktZS55KSkvcjtyZXR1cm4gTWF0aC5hYnMoaSkqTWF0aC5zcXJ0KHIpfSxlby5jb21wdXRlT3JpZW50YXRpb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlby5vcmllbnRhdGlvbkluZGV4KHQsZSxuKX0sZW8uZGlzdGFuY2VQb2ludExpbmU9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO2lmKDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgaGk7Zm9yKHZhciBuPXQuZGlzdGFuY2UoZVswXSkscj0wO3I8ZS5sZW5ndGgtMTtyKyspe3ZhciBpPWVvLmRpc3RhbmNlUG9pbnRMaW5lKHQsZVtyXSxlW3IrMV0pO2k8biYmKG49aSl9cmV0dXJuIG59aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXSxhPWFyZ3VtZW50c1syXTtpZihzLng9PT1hLngmJnMueT09PWEueSlyZXR1cm4gby5kaXN0YW5jZShzKTt2YXIgdT0oYS54LXMueCkqKGEueC1zLngpKyhhLnktcy55KSooYS55LXMueSksYz0oKG8ueC1zLngpKihhLngtcy54KSsoby55LXMueSkqKGEueS1zLnkpKS91O2lmKGM8PTApcmV0dXJuIG8uZGlzdGFuY2Uocyk7aWYoYz49MSlyZXR1cm4gby5kaXN0YW5jZShhKTt2YXIgbD0oKHMueS1vLnkpKihhLngtcy54KS0ocy54LW8ueCkqKGEueS1zLnkpKS91O3JldHVybiBNYXRoLmFicyhsKSpNYXRoLnNxcnQodSl9fSxlby5pc09uTGluZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgUWkscj0xO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3ItMV0sbz1lW3JdO2lmKG4uY29tcHV0ZUludGVyc2VjdGlvbih0LGksbyksbi5oYXNJbnRlcnNlY3Rpb24oKSlyZXR1cm4hMH1yZXR1cm4hMX0sbm8uQ0xPQ0tXSVNFLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxuby5SSUdIVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZW8uQ0xPQ0tXSVNFfSxuby5DT1VOVEVSQ0xPQ0tXSVNFLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxuby5MRUZULmdldD1mdW5jdGlvbigpe3JldHVybiBlby5DT1VOVEVSQ0xPQ0tXSVNFfSxuby5DT0xMSU5FQVIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LG5vLlNUUkFJR0hULmdldD1mdW5jdGlvbigpe3JldHVybiBlby5DT0xMSU5FQVJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGVvLG5vKTt2YXIgcm89ZnVuY3Rpb24oKXt9O3JvLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7fSxyby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scm8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHJvfTt2YXIgaW89ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZW52ZWxvcGU9bnVsbCx0aGlzLl9mYWN0b3J5PW51bGwsdGhpcy5fU1JJRD1udWxsLHRoaXMuX3VzZXJEYXRhPW51bGwsdGhpcy5fZmFjdG9yeT10LHRoaXMuX1NSSUQ9dC5nZXRTUklEKCl9LG9vPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9QT0lOVDp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTVVMVElQT0lOVDp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTElORVNUUklORzp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTElORUFSUklORzp7Y29uZmlndXJhYmxlOiEwfSxTT1JUSU5ERVhfTVVMVElMSU5FU1RSSU5HOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9QT0xZR09OOntjb25maWd1cmFibGU6ITB9LFNPUlRJTkRFWF9NVUxUSVBPTFlHT046e2NvbmZpZ3VyYWJsZTohMH0sU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTjp7Y29uZmlndXJhYmxlOiEwfSxnZW9tZXRyeUNoYW5nZWRGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH19O2lvLnByb3RvdHlwZS5pc0dlb21ldHJ5Q29sbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFNvcnRJbmRleCgpPT09aW8uU09SVElOREVYX0dFT01FVFJZQ09MTEVDVElPTn0saW8ucHJvdG90eXBlLmdldEZhY3Rvcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmFjdG9yeX0saW8ucHJvdG90eXBlLmdldEdlb21ldHJ5Tj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpc30saW8ucHJvdG90eXBlLmdldEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gMH0saW8ucHJvdG90eXBlLmlzUmVjdGFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGlvLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIG51bGwhPT10JiZ0aGlzLmVxdWFsc1RvcG8odCl9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPYmplY3Qpe3ZhciBlPWFyZ3VtZW50c1swXTtpZighKGUgaW5zdGFuY2VvZiBpbykpcmV0dXJuITE7dmFyIG49ZTtyZXR1cm4gdGhpcy5lcXVhbHNFeGFjdChuKX19LGlvLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcz09PXR8fHRoaXMuZXF1YWxzRXhhY3QodCwwKX0saW8ucHJvdG90eXBlLmdlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe3RoaXMuYXBwbHkoaW8uZ2VvbWV0cnlDaGFuZ2VkRmlsdGVyKX0saW8ucHJvdG90eXBlLmdlb21ldHJ5Q2hhbmdlZEFjdGlvbj1mdW5jdGlvbigpe3RoaXMuX2VudmVsb3BlPW51bGx9LGlvLnByb3RvdHlwZS5lcXVhbHNOb3JtPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dCYmdGhpcy5ub3JtKCkuZXF1YWxzRXhhY3QodC5ub3JtKCkpfSxpby5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGlvLnByb3RvdHlwZS5nZXROdW1HZW9tZXRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIDF9LGlvLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dDtyZXR1cm4gdGhpcy5nZXRTb3J0SW5kZXgoKSE9PWUuZ2V0U29ydEluZGV4KCk/dGhpcy5nZXRTb3J0SW5kZXgoKS1lLmdldFNvcnRJbmRleCgpOnRoaXMuaXNFbXB0eSgpJiZlLmlzRW1wdHkoKT8wOnRoaXMuaXNFbXB0eSgpPy0xOmUuaXNFbXB0eSgpPzE6dGhpcy5jb21wYXJlVG9TYW1lQ2xhc3ModCl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5nZXRTb3J0SW5kZXgoKSE9PW4uZ2V0U29ydEluZGV4KCk/dGhpcy5nZXRTb3J0SW5kZXgoKS1uLmdldFNvcnRJbmRleCgpOnRoaXMuaXNFbXB0eSgpJiZuLmlzRW1wdHkoKT8wOnRoaXMuaXNFbXB0eSgpPy0xOm4uaXNFbXB0eSgpPzE6dGhpcy5jb21wYXJlVG9TYW1lQ2xhc3MobixyKX19LGlvLnByb3RvdHlwZS5nZXRVc2VyRGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91c2VyRGF0YX0saW8ucHJvdG90eXBlLmdldFNSSUQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fU1JJRH0saW8ucHJvdG90eXBlLmdldEVudmVsb3BlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLnRvR2VvbWV0cnkodGhpcy5nZXRFbnZlbG9wZUludGVybmFsKCkpfSxpby5wcm90b3R5cGUuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24odCl7aWYodC5nZXRTb3J0SW5kZXgoKT09PWlvLlNPUlRJTkRFWF9HRU9NRVRSWUNPTExFQ1RJT04pdGhyb3cgbmV3IGhpfSxpby5wcm90b3R5cGUuZXF1YWw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiAwPT09bj90LmVxdWFscyhlKTp0LmRpc3RhbmNlKGUpPD1ufSxpby5wcm90b3R5cGUubm9ybT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY29weSgpO3JldHVybiB0Lm5vcm1hbGl6ZSgpLHR9LGlvLnByb3RvdHlwZS5nZXRQcmVjaXNpb25Nb2RlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mYWN0b3J5LmdldFByZWNpc2lvbk1vZGVsKCl9LGlvLnByb3RvdHlwZS5nZXRFbnZlbG9wZUludGVybmFsPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9lbnZlbG9wZSYmKHRoaXMuX2VudmVsb3BlPXRoaXMuY29tcHV0ZUVudmVsb3BlSW50ZXJuYWwoKSksbmV3IGppKHRoaXMuX2VudmVsb3BlKX0saW8ucHJvdG90eXBlLnNldFNSSUQ9ZnVuY3Rpb24odCl7dGhpcy5fU1JJRD10fSxpby5wcm90b3R5cGUuc2V0VXNlckRhdGE9ZnVuY3Rpb24odCl7dGhpcy5fdXNlckRhdGE9dH0saW8ucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5pdGVyYXRvcigpLHI9ZS5pdGVyYXRvcigpO24uaGFzTmV4dCgpJiZyLmhhc05leHQoKTspe3ZhciBpPW4ubmV4dCgpLG89ci5uZXh0KCkscz1pLmNvbXBhcmVUbyhvKTtpZigwIT09cylyZXR1cm4gc31yZXR1cm4gbi5oYXNOZXh0KCk/MTpyLmhhc05leHQoKT8tMTowfSxpby5wcm90b3R5cGUuaGFzaENvZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFbnZlbG9wZUludGVybmFsKCkuaGFzaENvZGUoKX0saW8ucHJvdG90eXBlLmlzR2VvbWV0cnlDb2xsZWN0aW9uT3JEZXJpdmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U29ydEluZGV4KCk9PT1pby5TT1JUSU5ERVhfR0VPTUVUUllDT0xMRUNUSU9OfHx0aGlzLmdldFNvcnRJbmRleCgpPT09aW8uU09SVElOREVYX01VTFRJUE9JTlR8fHRoaXMuZ2V0U29ydEluZGV4KCk9PT1pby5TT1JUSU5ERVhfTVVMVElMSU5FU1RSSU5HfHx0aGlzLmdldFNvcnRJbmRleCgpPT09aW8uU09SVElOREVYX01VTFRJUE9MWUdPTn0saW8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2dpLGRpLG1pXX0saW8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGlvfSxpby5oYXNOb25FbXB0eUVsZW1lbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCF0W2VdLmlzRW1wdHkoKSlyZXR1cm4hMDtyZXR1cm4hMX0saW8uaGFzTnVsbEVsZW1lbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKG51bGw9PT10W2VdKXJldHVybiEwO3JldHVybiExfSxvby5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDc5OWVhNDY1MjI4NTRjMDB9LG9vLlNPUlRJTkRFWF9QT0lOVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sb28uU09SVElOREVYX01VTFRJUE9JTlQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LG9vLlNPUlRJTkRFWF9MSU5FU1RSSU5HLmdldD1mdW5jdGlvbigpe3JldHVybiAyfSxvby5TT1JUSU5ERVhfTElORUFSUklORy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gM30sb28uU09SVElOREVYX01VTFRJTElORVNUUklORy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gNH0sb28uU09SVElOREVYX1BPTFlHT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDV9LG9vLlNPUlRJTkRFWF9NVUxUSVBPTFlHT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDZ9LG9vLlNPUlRJTkRFWF9HRU9NRVRSWUNPTExFQ1RJT04uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDd9LG9vLmdlb21ldHJ5Q2hhbmdlZEZpbHRlci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gc299LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGlvLG9vKTt2YXIgc289ZnVuY3Rpb24oKXt9O3NvLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3JvXX0sc28uZmlsdGVyPWZ1bmN0aW9uKHQpe3QuZ2VvbWV0cnlDaGFuZ2VkQWN0aW9uKCl9O3ZhciBhbz1mdW5jdGlvbigpe307YW8ucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt9LGFvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxhby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYW99O3ZhciB1bz1mdW5jdGlvbigpe30sY289e01vZDJCb3VuZGFyeU5vZGVSdWxlOntjb25maWd1cmFibGU6ITB9LEVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZTp7Y29uZmlndXJhYmxlOiEwfSxNdWx0aVZhbGVudEVuZFBvaW50Qm91bmRhcnlOb2RlUnVsZTp7Y29uZmlndXJhYmxlOiEwfSxNb25vVmFsZW50RW5kUG9pbnRCb3VuZGFyeU5vZGVSdWxlOntjb25maWd1cmFibGU6ITB9LE1PRDJfQk9VTkRBUllfUlVMRTp7Y29uZmlndXJhYmxlOiEwfSxFTkRQT0lOVF9CT1VOREFSWV9SVUxFOntjb25maWd1cmFibGU6ITB9LE1VTFRJVkFMRU5UX0VORFBPSU5UX0JPVU5EQVJZX1JVTEU6e2NvbmZpZ3VyYWJsZTohMH0sTU9OT1ZBTEVOVF9FTkRQT0lOVF9CT1VOREFSWV9SVUxFOntjb25maWd1cmFibGU6ITB9LE9HQ19TRlNfQk9VTkRBUllfUlVMRTp7Y29uZmlndXJhYmxlOiEwfX07dW8ucHJvdG90eXBlLmlzSW5Cb3VuZGFyeT1mdW5jdGlvbih0KXt9LHVvLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx1by5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdW99LGNvLk1vZDJCb3VuZGFyeU5vZGVSdWxlLmdldD1mdW5jdGlvbigpe3JldHVybiBsb30sY28uRW5kUG9pbnRCb3VuZGFyeU5vZGVSdWxlLmdldD1mdW5jdGlvbigpe3JldHVybiBob30sY28uTXVsdGlWYWxlbnRFbmRQb2ludEJvdW5kYXJ5Tm9kZVJ1bGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGZvfSxjby5Nb25vVmFsZW50RW5kUG9pbnRCb3VuZGFyeU5vZGVSdWxlLmdldD1mdW5jdGlvbigpe3JldHVybiBwb30sY28uTU9EMl9CT1VOREFSWV9SVUxFLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgbG99LGNvLkVORFBPSU5UX0JPVU5EQVJZX1JVTEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBob30sY28uTVVMVElWQUxFTlRfRU5EUE9JTlRfQk9VTkRBUllfUlVMRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGZvfSxjby5NT05PVkFMRU5UX0VORFBPSU5UX0JPVU5EQVJZX1JVTEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwb30sY28uT0dDX1NGU19CT1VOREFSWV9SVUxFLmdldD1mdW5jdGlvbigpe3JldHVybiB1by5NT0QyX0JPVU5EQVJZX1JVTEV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHVvLGNvKTt2YXIgbG89ZnVuY3Rpb24oKXt9O2xvLnByb3RvdHlwZS5pc0luQm91bmRhcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQlMj09MX0sbG8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3VvXX0sbG8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGxvfTt2YXIgaG89ZnVuY3Rpb24oKXt9O2hvLnByb3RvdHlwZS5pc0luQm91bmRhcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MH0saG8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3VvXX0saG8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGhvfTt2YXIgZm89ZnVuY3Rpb24oKXt9O2ZvLnByb3RvdHlwZS5pc0luQm91bmRhcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MX0sZm8ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3VvXX0sZm8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGZvfTt2YXIgcG89ZnVuY3Rpb24oKXt9O3BvLnByb3RvdHlwZS5pc0luQm91bmRhcnk9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10fSxwby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdW9dfSxwby5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcG99O3ZhciBnbz1mdW5jdGlvbigpe307Z28ucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe30sZ28ucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbigpe30sZ28ucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXt9LGdvLnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe30sZ28ucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXt9LGdvLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7fSxnby5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7fTt2YXIgeW89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt0LmNhbGwodGhpcyksdGhpcy5tZXNzYWdlPWV8fCIifXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtuYW1lOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gbi5uYW1lLmdldD1mdW5jdGlvbigpe3JldHVybiJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShFcnJvciksbW89ZnVuY3Rpb24oKXt9O21vLnByb3RvdHlwZS5oYXNOZXh0PWZ1bmN0aW9uKCl7fSxtby5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe30sbW8ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe307dmFyIHZvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7fSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXt9LGV9KGdvKTtmdW5jdGlvbiBfbyh0KXt0aGlzLm1lc3NhZ2U9dHx8IiJ9X28ucHJvdG90eXBlPW5ldyBFcnJvcixfby5wcm90b3R5cGUubmFtZT0iTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiI7dmFyIHhvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5hcnJheV89W10sYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBnbyYmdGhpcy5hZGRBbGwoYXJndW1lbnRzWzBdKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZW5zdXJlQ2FwYWNpdHk9ZnVuY3Rpb24oKXt9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3QsZ29dfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuYXJyYXlfLnB1c2godCk6dGhpcy5hcnJheV8uc3BsaWNlKGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pLCEwfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuYXJyYXlfPVtdfSxlLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspdGhpcy5hZGQoZS5uZXh0KCkpO3JldHVybiEwfSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmFycmF5X1t0XTtyZXR1cm4gdGhpcy5hcnJheV9bdF09ZSxufSxlLnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgd28odGhpcyl9LGUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZih0PDB8fHQ+PXRoaXMuc2l6ZSgpKXRocm93IG5ldyB5bztyZXR1cm4gdGhpcy5hcnJheV9bdF19LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuYXJyYXlfLmxlbmd0aH0sZS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFycmF5Xy5sZW5ndGh9LGUucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspdC5wdXNoKHRoaXMuYXJyYXlfW2VdKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0hMSxuPTAscj10aGlzLmFycmF5Xy5sZW5ndGg7bjxyO24rKylpZih0aGlzLmFycmF5X1tuXT09PXQpe3RoaXMuYXJyYXlfLnNwbGljZShuLDEpLGU9ITA7YnJlYWt9cmV0dXJuIGV9LGV9KHZvKSx3bz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLmFycmF5TGlzdF89ZSx0aGlzLnBvc2l0aW9uXz0wfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5wb3NpdGlvbl89PT10aGlzLmFycmF5TGlzdF8uc2l6ZSgpKXRocm93IG5ldyBfbztyZXR1cm4gdGhpcy5hcnJheUxpc3RfLmdldCh0aGlzLnBvc2l0aW9uXysrKX0sZS5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uXzx0aGlzLmFycmF5TGlzdF8uc2l6ZSgpfSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXJyYXlMaXN0Xy5zZXQodGhpcy5wb3NpdGlvbl8tMSx0KX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5hcnJheUxpc3RfLnJlbW92ZSh0aGlzLmFycmF5TGlzdF8uZ2V0KHRoaXMucG9zaXRpb25fKSl9LGV9KG1vKSxibz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7aWYodC5jYWxsKHRoaXMpLDAhPT1hcmd1bWVudHMubGVuZ3RoKWlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5lbnN1cmVDYXBhY2l0eShlLmxlbmd0aCksdGhpcy5hZGQoZSwhMCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMuZW5zdXJlQ2FwYWNpdHkobi5sZW5ndGgpLHRoaXMuYWRkKG4scil9fXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtjb29yZEFycmF5VHlwZTp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIG4uY29vcmRBcnJheVR5cGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBcnJheSgwKS5maWxsKG51bGwpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldCh0KX0sZS5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT1hcmd1bWVudHNbMV0sbj0hMSxyPWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl0aGlzLmFkZChyLm5leHQoKSxlKSxuPSEwO3JldHVybiBufXJldHVybiB0LnByb3RvdHlwZS5hZGRBbGwuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe2Zvcih2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpLG49MDtuPHRoaXMuc2l6ZSgpO24rKyllLmFkZChuLHRoaXMuZ2V0KG4pLmNvcHkoKSk7cmV0dXJuIGV9LGUucHJvdG90eXBlLnRvQ29vcmRpbmF0ZUFycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9BcnJheShlLmNvb3JkQXJyYXlUeXBlKX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdO3QucHJvdG90eXBlLmFkZC5jYWxsKHRoaXMsbil9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSYmImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuYWRkKHIsaSwhMCksITB9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgbz1hcmd1bWVudHNbMF07aWYoIWFyZ3VtZW50c1sxXSYmdGhpcy5zaXplKCk+PTEpaWYodGhpcy5nZXQodGhpcy5zaXplKCktMSkuZXF1YWxzMkQobykpcmV0dXJuIG51bGw7dC5wcm90b3R5cGUuYWRkLmNhbGwodGhpcyxvKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgT2JqZWN0JiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBzPWFyZ3VtZW50c1swXSxhPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5hZGQocyxhKSwhMH19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYiYm9vbGVhbiI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciB1PWFyZ3VtZW50c1swXSxjPWFyZ3VtZW50c1sxXTtpZihhcmd1bWVudHNbMl0pZm9yKHZhciBsPTA7bDx1Lmxlbmd0aDtsKyspZS5hZGQodVtsXSxjKTtlbHNlIGZvcih2YXIgaD11Lmxlbmd0aC0xO2g+PTA7aC0tKWUuYWRkKHVbaF0sYyk7cmV0dXJuITB9aWYoImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzJdJiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciBmPWFyZ3VtZW50c1swXSxwPWFyZ3VtZW50c1sxXTtpZighYXJndW1lbnRzWzJdKXt2YXIgZD10aGlzLnNpemUoKTtpZihkPjApe2lmKGY+MClpZih0aGlzLmdldChmLTEpLmVxdWFsczJEKHApKXJldHVybiBudWxsO2lmKGY8ZClpZih0aGlzLmdldChmKS5lcXVhbHMyRChwKSlyZXR1cm4gbnVsbH19dC5wcm90b3R5cGUuYWRkLmNhbGwodGhpcyxmLHApfX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZz1hcmd1bWVudHNbMF0seT1hcmd1bWVudHNbMV0sbT1hcmd1bWVudHNbMl0sdj1hcmd1bWVudHNbM10sXz0xO20+diYmKF89LTEpO2Zvcih2YXIgeD1tO3ghPT12O3grPV8pZS5hZGQoZ1t4XSx5KTtyZXR1cm4hMH19LGUucHJvdG90eXBlLmNsb3NlUmluZz1mdW5jdGlvbigpe3RoaXMuc2l6ZSgpPjAmJnRoaXMuYWRkKG5ldyB2aSh0aGlzLmdldCgwKSksITEpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KHhvKSxEbz1mdW5jdGlvbigpe30sRW89e0ZvcndhcmRDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LEJpZGlyZWN0aW9uYWxDb21wYXJhdG9yOntjb25maWd1cmFibGU6ITB9LGNvb3JkQXJyYXlUeXBlOntjb25maWd1cmFibGU6ITB9fTtFby5Gb3J3YXJkQ29tcGFyYXRvci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gQ299LEVvLkJpZGlyZWN0aW9uYWxDb21wYXJhdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiBTb30sRW8uY29vcmRBcnJheVR5cGUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBcnJheSgwKS5maWxsKG51bGwpfSxEby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRG8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIERvfSxEby5pc1Jpbmc9ZnVuY3Rpb24odCl7cmV0dXJuISh0Lmxlbmd0aDw0fHwhdFswXS5lcXVhbHMyRCh0W3QubGVuZ3RoLTFdKSl9LERvLnB0Tm90SW5MaXN0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07aWYoRG8uaW5kZXhPZihyLGUpPDApcmV0dXJuIHJ9cmV0dXJuIG51bGx9LERvLnNjcm9sbD1mdW5jdGlvbih0LGUpe3ZhciBuPURvLmluZGV4T2YoZSx0KTtpZihuPDApcmV0dXJuIG51bGw7dmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKS5maWxsKG51bGwpO2tpLmFycmF5Y29weSh0LG4sciwwLHQubGVuZ3RoLW4pLGtpLmFycmF5Y29weSh0LDAscix0Lmxlbmd0aC1uLG4pLGtpLmFycmF5Y29weShyLDAsdCwwLHQubGVuZ3RoKX0sRG8uZXF1YWxzPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtpZih0PT09ZSlyZXR1cm4hMDtpZihudWxsPT09dHx8bnVsbD09PWV8fHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYoIXRbbl0uZXF1YWxzKGVbbl0pKXJldHVybiExO3JldHVybiEwfWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl07aWYocj09PWkpcmV0dXJuITA7aWYobnVsbD09PXJ8fG51bGw9PT1pfHxyLmxlbmd0aCE9PWkubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgcz0wO3M8ci5sZW5ndGg7cysrKWlmKDAhPT1vLmNvbXBhcmUocltzXSxpW3NdKSlyZXR1cm4hMTtyZXR1cm4hMH19LERvLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1uZXcgYm8scj0wO3I8dC5sZW5ndGg7cisrKWUuaW50ZXJzZWN0cyh0W3JdKSYmbi5hZGQodFtyXSwhMCk7cmV0dXJuIG4udG9Db29yZGluYXRlQXJyYXkoKX0sRG8uaGFzUmVwZWF0ZWRQb2ludHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTx0Lmxlbmd0aDtlKyspaWYodFtlLTFdLmVxdWFscyh0W2VdKSlyZXR1cm4hMDtyZXR1cm4hMX0sRG8ucmVtb3ZlUmVwZWF0ZWRQb2ludHM9ZnVuY3Rpb24odCl7cmV0dXJuIERvLmhhc1JlcGVhdGVkUG9pbnRzKHQpP25ldyBibyh0LCExKS50b0Nvb3JkaW5hdGVBcnJheSgpOnR9LERvLnJldmVyc2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQubGVuZ3RoLTEsbj1NYXRoLnRydW5jKGUvMikscj0wO3I8PW47cisrKXt2YXIgaT10W3JdO3Rbcl09dFtlLXJdLHRbZS1yXT1pfX0sRG8ucmVtb3ZlTnVsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspbnVsbCE9PXRbbl0mJmUrKzt2YXIgcj1uZXcgQXJyYXkoZSkuZmlsbChudWxsKTtpZigwPT09ZSlyZXR1cm4gcjtmb3IodmFyIGk9MCxvPTA7bzx0Lmxlbmd0aDtvKyspbnVsbCE9PXRbb10mJihyW2krK109dFtvXSk7cmV0dXJuIHJ9LERvLmNvcHlEZWVwPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgQXJyYXkodC5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKWVbbl09bmV3IHZpKHRbbl0pO3JldHVybiBlfWlmKDU9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl0scz1hcmd1bWVudHNbM10sYT1hcmd1bWVudHNbNF0sdT0wO3U8YTt1Kyspb1tzK3VdPW5ldyB2aShyW2krdV0pfSxEby5pc0VxdWFsUmV2ZXJzZWQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXSxpPWVbdC5sZW5ndGgtbi0xXTtpZigwIT09ci5jb21wYXJlVG8oaSkpcmV0dXJuITF9cmV0dXJuITB9LERvLmVudmVsb3BlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgamksbj0wO248dC5sZW5ndGg7bisrKWUuZXhwYW5kVG9JbmNsdWRlKHRbbl0pO3JldHVybiBlfSxEby50b0Nvb3JkaW5hdGVBcnJheT1mdW5jdGlvbih0KXtyZXR1cm4gdC50b0FycmF5KERvLmNvb3JkQXJyYXlUeXBlKX0sRG8uYXRMZWFzdE5Db29yZGluYXRlc09yTm90aGluZz1mdW5jdGlvbih0LGUpe3JldHVybiBlLmxlbmd0aD49dD9lOltdfSxEby5pbmRleE9mPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYodC5lcXVhbHMoZVtuXSkpcmV0dXJuIG47cmV0dXJuLTF9LERvLmluY3JlYXNpbmdEaXJlY3Rpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTxNYXRoLnRydW5jKHQubGVuZ3RoLzIpO2UrKyl7dmFyIG49dC5sZW5ndGgtMS1lLHI9dFtlXS5jb21wYXJlVG8odFtuXSk7aWYoMCE9PXIpcmV0dXJuIHJ9cmV0dXJuIDF9LERvLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoJiZuPGUubGVuZ3RoOyl7dmFyIHI9dFtuXS5jb21wYXJlVG8oZVtuXSk7aWYoMCE9PXIpcmV0dXJuIHI7bisrfXJldHVybiBuPGUubGVuZ3RoPy0xOm48dC5sZW5ndGg/MTowfSxEby5taW5Db29yZGluYXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLG49MDtuPHQubGVuZ3RoO24rKykobnVsbD09PWV8fGUuY29tcGFyZVRvKHRbbl0pPjApJiYoZT10W25dKTtyZXR1cm4gZX0sRG8uZXh0cmFjdD1mdW5jdGlvbih0LGUsbil7ZT1DaS5jbGFtcChlLDAsdC5sZW5ndGgpO3ZhciByPShuPUNpLmNsYW1wKG4sLTEsdC5sZW5ndGgpKS1lKzE7bjwwJiYocj0wKSxlPj10Lmxlbmd0aCYmKHI9MCksbjxlJiYocj0wKTt2YXIgaT1uZXcgQXJyYXkocikuZmlsbChudWxsKTtpZigwPT09cilyZXR1cm4gaTtmb3IodmFyIG89MCxzPWU7czw9bjtzKyspaVtvKytdPXRbc107cmV0dXJuIGl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERvLEVvKTt2YXIgQ289ZnVuY3Rpb24oKXt9O0NvLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIERvLmNvbXBhcmUodCxlKX0sQ28ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3lpXX0sQ28ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIENvfTt2YXIgU289ZnVuY3Rpb24oKXt9O1NvLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dCxyPWU7aWYobi5sZW5ndGg8ci5sZW5ndGgpcmV0dXJuLTE7aWYobi5sZW5ndGg+ci5sZW5ndGgpcmV0dXJuIDE7aWYoMD09PW4ubGVuZ3RoKXJldHVybiAwO3ZhciBpPURvLmNvbXBhcmUobixyKTtyZXR1cm4gRG8uaXNFcXVhbFJldmVyc2VkKG4scik/MDppfSxTby5wcm90b3R5cGUuT0xEY29tcGFyZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQscj1lO2lmKG4ubGVuZ3RoPHIubGVuZ3RoKXJldHVybi0xO2lmKG4ubGVuZ3RoPnIubGVuZ3RoKXJldHVybiAxO2lmKDA9PT1uLmxlbmd0aClyZXR1cm4gMDtmb3IodmFyIGk9RG8uaW5jcmVhc2luZ0RpcmVjdGlvbihuKSxvPURvLmluY3JlYXNpbmdEaXJlY3Rpb24ocikscz1pPjA/MDpuLmxlbmd0aC0xLGE9bz4wPzA6bi5sZW5ndGgtMSx1PTA7dTxuLmxlbmd0aDt1Kyspe3ZhciBjPW5bc10uY29tcGFyZVRvKHJbYV0pO2lmKDAhPT1jKXJldHVybiBjO3MrPWksYSs9b31yZXR1cm4gMH0sU28ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3lpXX0sU28ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFNvfTt2YXIgQW89ZnVuY3Rpb24oKXt9O0FvLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt9LEFvLnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24oKXt9LEFvLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7fSxBby5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7fSxBby5wcm90b3R5cGUuZW50cnlTZXQ9ZnVuY3Rpb24oKXt9O3ZhciBObz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KEFvKTtmdW5jdGlvbiBJbyh0KXt0aGlzLm1lc3NhZ2U9dHx8IiJ9ZnVuY3Rpb24gTW8oKXt9SW8ucHJvdG90eXBlPW5ldyBFcnJvcixJby5wcm90b3R5cGUubmFtZT0iT3BlcmF0aW9uTm90U3VwcG9ydGVkIixNby5wcm90b3R5cGU9bmV3IGdvLE1vLnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbigpe307dmFyIEZvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5hcnJheV89W10sYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBnbyYmdGhpcy5hZGRBbGwoYXJndW1lbnRzWzBdKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl7aWYodGhpcy5hcnJheV9bZV09PT10KXJldHVybiEwfXJldHVybiExfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIXRoaXMuY29udGFpbnModCkmJih0aGlzLmFycmF5Xy5wdXNoKHQpLCEwKX0sZS5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXRoaXMuYWRkKGUubmV4dCgpKTtyZXR1cm4hMH0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcn0sZS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFycmF5Xy5sZW5ndGh9LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuYXJyYXlfLmxlbmd0aH0sZS5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLmFycmF5Xy5sZW5ndGg7ZTxuO2UrKyl0LnB1c2godGhpcy5hcnJheV9bZV0pO3JldHVybiB0fSxlLnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgVG8odGhpcyl9LGV9KE1vKSxUbz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLmhhc2hTZXRfPWUsdGhpcy5wb3NpdGlvbl89MH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKHRoaXMucG9zaXRpb25fPT09dGhpcy5oYXNoU2V0Xy5zaXplKCkpdGhyb3cgbmV3IF9vO3JldHVybiB0aGlzLmhhc2hTZXRfLmFycmF5X1t0aGlzLnBvc2l0aW9uXysrXX0sZS5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uXzx0aGlzLmhhc2hTZXRfLnNpemUoKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IElvfSxlfShtbyk7ZnVuY3Rpb24gT28odCl7cmV0dXJuIG51bGw9PT10PzA6dC5jb2xvcn1mdW5jdGlvbiBMbyh0KXtyZXR1cm4gbnVsbD09PXQ/bnVsbDp0LnBhcmVudH1mdW5jdGlvbiBQbyh0LGUpe251bGwhPT10JiYodC5jb2xvcj1lKX1mdW5jdGlvbiBSbyh0KXtyZXR1cm4gbnVsbD09PXQ/bnVsbDp0LmxlZnR9ZnVuY3Rpb24gQm8odCl7cmV0dXJuIG51bGw9PT10P251bGw6dC5yaWdodH1mdW5jdGlvbiBrbygpe3RoaXMucm9vdF89bnVsbCx0aGlzLnNpemVfPTB9a28ucHJvdG90eXBlPW5ldyBObyxrby5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnJvb3RfO251bGwhPT1lOyl7dmFyIG49dC5jb21wYXJlVG8oZS5rZXkpO2lmKG48MCllPWUubGVmdDtlbHNle2lmKCEobj4wKSlyZXR1cm4gZS52YWx1ZTtlPWUucmlnaHR9fXJldHVybiBudWxsfSxrby5wcm90b3R5cGUucHV0PWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09PXRoaXMucm9vdF8pcmV0dXJuIHRoaXMucm9vdF89e2tleTp0LHZhbHVlOmUsbGVmdDpudWxsLHJpZ2h0Om51bGwscGFyZW50Om51bGwsY29sb3I6MCxnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfSxnZXRLZXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rZXl9fSx0aGlzLnNpemVfPTEsbnVsbDt2YXIgbixyLGk9dGhpcy5yb290Xztkb3tpZihuPWksKHI9dC5jb21wYXJlVG8oaS5rZXkpKTwwKWk9aS5sZWZ0O2Vsc2V7aWYoIShyPjApKXt2YXIgbz1pLnZhbHVlO3JldHVybiBpLnZhbHVlPWUsb31pPWkucmlnaHR9fXdoaWxlKG51bGwhPT1pKTt2YXIgcz17a2V5OnQsbGVmdDpudWxsLHJpZ2h0Om51bGwsdmFsdWU6ZSxwYXJlbnQ6bixjb2xvcjowLGdldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9LGdldEtleTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtleX19O3JldHVybiByPDA/bi5sZWZ0PXM6bi5yaWdodD1zLHRoaXMuZml4QWZ0ZXJJbnNlcnRpb24ocyksdGhpcy5zaXplXysrLG51bGx9LGtvLnByb3RvdHlwZS5maXhBZnRlckluc2VydGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2Zvcih0LmNvbG9yPTE7bnVsbCE9dCYmdCE9PXRoaXMucm9vdF8mJjE9PT10LnBhcmVudC5jb2xvcjspaWYoTG8odCk9PT1SbyhMbyhMbyh0KSkpKXt2YXIgbj1CbyhMbyhMbyh0KSkpOzE9PT1PbyhuKT8oUG8oTG8odCksMCksUG8obiwwKSxQbyhMbyhMbyh0KSksMSksdD1MbyhMbyh0KSkpOih0PT09Qm8oTG8odCkpJiYodD1Mbyh0KSxlLnJvdGF0ZUxlZnQodCkpLFBvKExvKHQpLDApLFBvKExvKExvKHQpKSwxKSxlLnJvdGF0ZVJpZ2h0KExvKExvKHQpKSkpfWVsc2V7dmFyIHI9Um8oTG8oTG8odCkpKTsxPT09T28ocik/KFBvKExvKHQpLDApLFBvKHIsMCksUG8oTG8oTG8odCkpLDEpLHQ9TG8oTG8odCkpKToodD09PVJvKExvKHQpKSYmKHQ9TG8odCksZS5yb3RhdGVSaWdodCh0KSksUG8oTG8odCksMCksUG8oTG8oTG8odCkpLDEpLGUucm90YXRlTGVmdChMbyhMbyh0KSkpKX10aGlzLnJvb3RfLmNvbG9yPTB9LGtvLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgeG8sZT10aGlzLmdldEZpcnN0RW50cnkoKTtpZihudWxsIT09ZSlmb3IodC5hZGQoZS52YWx1ZSk7bnVsbCE9PShlPWtvLnN1Y2Nlc3NvcihlKSk7KXQuYWRkKGUudmFsdWUpO3JldHVybiB0fSxrby5wcm90b3R5cGUuZW50cnlTZXQ9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRm8sZT10aGlzLmdldEZpcnN0RW50cnkoKTtpZihudWxsIT09ZSlmb3IodC5hZGQoZSk7bnVsbCE9PShlPWtvLnN1Y2Nlc3NvcihlKSk7KXQuYWRkKGUpO3JldHVybiB0fSxrby5wcm90b3R5cGUucm90YXRlTGVmdD1mdW5jdGlvbih0KXtpZihudWxsIT10KXt2YXIgZT10LnJpZ2h0O3QucmlnaHQ9ZS5sZWZ0LG51bGwhPWUubGVmdCYmKGUubGVmdC5wYXJlbnQ9dCksZS5wYXJlbnQ9dC5wYXJlbnQsbnVsbD09PXQucGFyZW50P3RoaXMucm9vdF89ZTp0LnBhcmVudC5sZWZ0PT09dD90LnBhcmVudC5sZWZ0PWU6dC5wYXJlbnQucmlnaHQ9ZSxlLmxlZnQ9dCx0LnBhcmVudD1lfX0sa28ucHJvdG90eXBlLnJvdGF0ZVJpZ2h0PWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe3ZhciBlPXQubGVmdDt0LmxlZnQ9ZS5yaWdodCxudWxsIT1lLnJpZ2h0JiYoZS5yaWdodC5wYXJlbnQ9dCksZS5wYXJlbnQ9dC5wYXJlbnQsbnVsbD09PXQucGFyZW50P3RoaXMucm9vdF89ZTp0LnBhcmVudC5yaWdodD09PXQ/dC5wYXJlbnQucmlnaHQ9ZTp0LnBhcmVudC5sZWZ0PWUsZS5yaWdodD10LHQucGFyZW50PWV9fSxrby5wcm90b3R5cGUuZ2V0Rmlyc3RFbnRyeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMucm9vdF87aWYobnVsbCE9dClmb3IoO251bGwhPXQubGVmdDspdD10LmxlZnQ7cmV0dXJuIHR9LGtvLnN1Y2Nlc3Nvcj1mdW5jdGlvbih0KXtpZihudWxsPT09dClyZXR1cm4gbnVsbDtpZihudWxsIT09dC5yaWdodCl7Zm9yKHZhciBlPXQucmlnaHQ7bnVsbCE9PWUubGVmdDspZT1lLmxlZnQ7cmV0dXJuIGV9Zm9yKHZhciBuPXQucGFyZW50LHI9dDtudWxsIT09biYmcj09PW4ucmlnaHQ7KXI9bixuPW4ucGFyZW50O3JldHVybiBufSxrby5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNpemVffTt2YXIgem89ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIGpvKCl7fWZ1bmN0aW9uIFVvKCl7dGhpcy5hcnJheV89W10sYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBnbyYmdGhpcy5hZGRBbGwoYXJndW1lbnRzWzBdKX16by5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sem8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHpvfSxqby5wcm90b3R5cGU9bmV3IE1vLFVvLnByb3RvdHlwZT1uZXcgam8sVW8ucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspe2lmKDA9PT10aGlzLmFycmF5X1tlXS5jb21wYXJlVG8odCkpcmV0dXJuITB9cmV0dXJuITF9LFVvLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7aWYodGhpcy5jb250YWlucyh0KSlyZXR1cm4hMTtmb3IodmFyIGU9MCxuPXRoaXMuYXJyYXlfLmxlbmd0aDtlPG47ZSsrKXtpZigxPT09dGhpcy5hcnJheV9bZV0uY29tcGFyZVRvKHQpKXJldHVybiB0aGlzLmFycmF5Xy5zcGxpY2UoZSwwLHQpLCEwfXJldHVybiB0aGlzLmFycmF5Xy5wdXNoKHQpLCEwfSxVby5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXRoaXMuYWRkKGUubmV4dCgpKTtyZXR1cm4hMH0sVW8ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt0aHJvdyBuZXcgSW99LFVvLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLmxlbmd0aH0sVW8ucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuYXJyYXlfLmxlbmd0aH0sVW8ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspdC5wdXNoKHRoaXMuYXJyYXlfW2VdKTtyZXR1cm4gdH0sVW8ucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxbyh0aGlzKX07dmFyIHFvPWZ1bmN0aW9uKHQpe3RoaXMudHJlZVNldF89dCx0aGlzLnBvc2l0aW9uXz0wfTtxby5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2lmKHRoaXMucG9zaXRpb25fPT09dGhpcy50cmVlU2V0Xy5zaXplKCkpdGhyb3cgbmV3IF9vO3JldHVybiB0aGlzLnRyZWVTZXRfLmFycmF5X1t0aGlzLnBvc2l0aW9uXysrXX0scW8ucHJvdG90eXBlLmhhc05leHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wb3NpdGlvbl88dGhpcy50cmVlU2V0Xy5zaXplKCl9LHFvLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgSW99O3ZhciBWbz1mdW5jdGlvbigpe307Vm8uc29ydD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGk9YXJndW1lbnRzWzBdO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb21wYXJlVG8oZSl9LGkuc29ydChyKTtlbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKW49YXJndW1lbnRzWzFdLHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5jb21wYXJlKHQsZSl9LGkuc29ydChyKTtlbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXsoZT1pLnNsaWNlKGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pKS5zb3J0KCk7dmFyIG89aS5zbGljZSgwLGFyZ3VtZW50c1sxXSkuY29uY2F0KGUsaS5zbGljZShhcmd1bWVudHNbMl0saS5sZW5ndGgpKTtmb3IoaS5zcGxpY2UoMCxpLmxlbmd0aCksdD0wO3Q8by5sZW5ndGg7dCsrKWkucHVzaChvW3RdKX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKWZvcihlPWkuc2xpY2UoYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSksbj1hcmd1bWVudHNbM10scj1mdW5jdGlvbih0LGUpe3JldHVybiBuLmNvbXBhcmUodCxlKX0sZS5zb3J0KHIpLG89aS5zbGljZSgwLGFyZ3VtZW50c1sxXSkuY29uY2F0KGUsaS5zbGljZShhcmd1bWVudHNbMl0saS5sZW5ndGgpKSxpLnNwbGljZSgwLGkubGVuZ3RoKSx0PTA7dDxvLmxlbmd0aDt0KyspaS5wdXNoKG9bdF0pfSxWby5hc0xpc3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPTAscj10Lmxlbmd0aDtuPHI7bisrKWUuYWRkKHRbbl0pO3JldHVybiBlfTt2YXIgR289ZnVuY3Rpb24oKXt9LFlvPXtQOntjb25maWd1cmFibGU6ITB9LEw6e2NvbmZpZ3VyYWJsZTohMH0sQTp7Y29uZmlndXJhYmxlOiEwfSxGQUxTRTp7Y29uZmlndXJhYmxlOiEwfSxUUlVFOntjb25maWd1cmFibGU6ITB9LERPTlRDQVJFOntjb25maWd1cmFibGU6ITB9LFNZTV9GQUxTRTp7Y29uZmlndXJhYmxlOiEwfSxTWU1fVFJVRTp7Y29uZmlndXJhYmxlOiEwfSxTWU1fRE9OVENBUkU6e2NvbmZpZ3VyYWJsZTohMH0sU1lNX1A6e2NvbmZpZ3VyYWJsZTohMH0sU1lNX0w6e2NvbmZpZ3VyYWJsZTohMH0sU1lNX0E6e2NvbmZpZ3VyYWJsZTohMH19O1lvLlAuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LFlvLkwuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDF9LFlvLkEuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LFlvLkZBTFNFLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxZby5UUlVFLmdldD1mdW5jdGlvbigpe3JldHVybi0yfSxZby5ET05UQ0FSRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tM30sWW8uU1lNX0ZBTFNFLmdldD1mdW5jdGlvbigpe3JldHVybiJGIn0sWW8uU1lNX1RSVUUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIlQifSxZby5TWU1fRE9OVENBUkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIioifSxZby5TWU1fUC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4iMCJ9LFlvLlNZTV9MLmdldD1mdW5jdGlvbigpe3JldHVybiIxIn0sWW8uU1lNX0EuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIjIifSxHby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sR28ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEdvfSxHby50b0RpbWVuc2lvblN5bWJvbD1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSBHby5GQUxTRTpyZXR1cm4gR28uU1lNX0ZBTFNFO2Nhc2UgR28uVFJVRTpyZXR1cm4gR28uU1lNX1RSVUU7Y2FzZSBHby5ET05UQ0FSRTpyZXR1cm4gR28uU1lNX0RPTlRDQVJFO2Nhc2UgR28uUDpyZXR1cm4gR28uU1lNX1A7Y2FzZSBHby5MOnJldHVybiBHby5TWU1fTDtjYXNlIEdvLkE6cmV0dXJuIEdvLlNZTV9BfXRocm93IG5ldyBoaX0sR28udG9EaW1lbnNpb25WYWx1ZT1mdW5jdGlvbih0KXtzd2l0Y2goSWkudG9VcHBlckNhc2UodCkpe2Nhc2UgR28uU1lNX0ZBTFNFOnJldHVybiBHby5GQUxTRTtjYXNlIEdvLlNZTV9UUlVFOnJldHVybiBHby5UUlVFO2Nhc2UgR28uU1lNX0RPTlRDQVJFOnJldHVybiBHby5ET05UQ0FSRTtjYXNlIEdvLlNZTV9QOnJldHVybiBHby5QO2Nhc2UgR28uU1lNX0w6cmV0dXJuIEdvLkw7Y2FzZSBHby5TWU1fQTpyZXR1cm4gR28uQX10aHJvdyBuZXcgaGl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEdvLFlvKTt2YXIgWG89ZnVuY3Rpb24oKXt9O1hvLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7fSxYby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWG8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFhvfTt2YXIgV289ZnVuY3Rpb24oKXt9O1dvLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCxlKXt9LFdvLnByb3RvdHlwZS5pc0RvbmU9ZnVuY3Rpb24oKXt9LFdvLnByb3RvdHlwZS5pc0dlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe30sV28ucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFdvLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBXb307dmFyIEhvPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXtpZih0LmNhbGwodGhpcyxuKSx0aGlzLl9nZW9tZXRyaWVzPWV8fFtdLHQuaGFzTnVsbEVsZW1lbnRzKHRoaXMuX2dlb21ldHJpZXMpKXRocm93IG5ldyBoaX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmNvbXB1dGVFbnZlbG9wZUludGVybmFsPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBqaSxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdC5leHBhbmRUb0luY2x1ZGUodGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRFbnZlbG9wZUludGVybmFsKCkpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeU49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2dlb21ldHJpZXNbdF19LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9HRU9NRVRSWUNPTExFQ1RJT059LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLmdldE51bVBvaW50cygpKS5maWxsKG51bGwpLGU9LTEsbj0wO248dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7bisrKWZvcih2YXIgcj10aGlzLl9nZW9tZXRyaWVzW25dLmdldENvb3JkaW5hdGVzKCksaT0wO2k8ci5sZW5ndGg7aSsrKXRbKytlXT1yW2ldO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXRBcmVhPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKXQrPXRoaXMuX2dlb21ldHJpZXNbZV0uZ2V0QXJlYSgpO3JldHVybiB0fSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYoIXRoaXMuaXNFcXVpdmFsZW50Q2xhc3MoZSkpcmV0dXJuITE7dmFyIHI9ZTtpZih0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCE9PXIuX2dlb21ldHJpZXMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgaT0wO2k8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7aSsrKWlmKCF0aGlzLl9nZW9tZXRyaWVzW2ldLmVxdWFsc0V4YWN0KHIuX2dlb21ldHJpZXNbaV0sbikpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDt0KyspdGhpcy5fZ2VvbWV0cmllc1t0XS5ub3JtYWxpemUoKTtWby5zb3J0KHRoaXMuX2dlb21ldHJpZXMpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP251bGw6dGhpcy5fZ2VvbWV0cmllc1swXS5nZXRDb29yZGluYXRlKCl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PUdvLkZBTFNFLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKyl0PU1hdGgubWF4KHQsdGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRCb3VuZGFyeURpbWVuc2lvbigpKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PUdvLkZBTFNFLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKyl0PU1hdGgubWF4KHQsdGhpcy5fZ2VvbWV0cmllc1tlXS5nZXREaW1lbnNpb24oKSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MDtlPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO2UrKyl0Kz10aGlzLl9nZW9tZXRyaWVzW2VdLmdldExlbmd0aCgpO3JldHVybiB0fSxlLnByb3RvdHlwZS5nZXROdW1Qb2ludHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7ZTx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtlKyspdCs9dGhpcy5fZ2VvbWV0cmllc1tlXS5nZXROdW1Qb2ludHMoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0TnVtR2VvbWV0cmllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aH0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCxlPW5ldyBBcnJheSh0KS5maWxsKG51bGwpLG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyllW25dPXRoaXMuX2dlb21ldHJpZXNbbl0ucmV2ZXJzZSgpO3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oZSl9LGUucHJvdG90eXBlLmNvbXBhcmVUb1NhbWVDbGFzcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgVW8oVm8uYXNMaXN0KHRoaXMuX2dlb21ldHJpZXMpKSxuPW5ldyBVbyhWby5hc0xpc3QodC5fZ2VvbWV0cmllcykpO3JldHVybiB0aGlzLmNvbXBhcmUoZSxuKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciByPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1swXSxvPXRoaXMuZ2V0TnVtR2VvbWV0cmllcygpLHM9aS5nZXROdW1HZW9tZXRyaWVzKCksYT0wO2E8byYmYTxzOyl7dmFyIHU9dGhpcy5nZXRHZW9tZXRyeU4oYSksYz1pLmdldEdlb21ldHJ5TihhKSxsPXUuY29tcGFyZVRvU2FtZUNsYXNzKGMscik7aWYoMCE9PWwpcmV0dXJuIGw7YSsrfXJldHVybiBhPG8/MTphPHM/LTE6MH19LGUucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihFaShhcmd1bWVudHNbMF0sYW8pKWZvcih2YXIgZT1hcmd1bWVudHNbMF0sbj0wO248dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7bisrKXQuX2dlb21ldHJpZXNbbl0uYXBwbHkoZSk7ZWxzZSBpZihFaShhcmd1bWVudHNbMF0sV28pKXt2YXIgcj1hcmd1bWVudHNbMF07aWYoMD09PXRoaXMuX2dlb21ldHJpZXMubGVuZ3RoKXJldHVybiBudWxsO2Zvcih2YXIgaT0wO2k8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgmJih0Ll9nZW9tZXRyaWVzW2ldLmFwcGx5KHIpLCFyLmlzRG9uZSgpKTtpKyspO3IuaXNHZW9tZXRyeUNoYW5nZWQoKSYmdGhpcy5nZW9tZXRyeUNoYW5nZWQoKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxYbykpe3ZhciBvPWFyZ3VtZW50c1swXTtvLmZpbHRlcih0aGlzKTtmb3IodmFyIHM9MDtzPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO3MrKyl0Ll9nZW9tZXRyaWVzW3NdLmFwcGx5KG8pfWVsc2UgaWYoRWkoYXJndW1lbnRzWzBdLHJvKSl7dmFyIGE9YXJndW1lbnRzWzBdO2EuZmlsdGVyKHRoaXMpO2Zvcih2YXIgdT0wO3U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7dSsrKXQuX2dlb21ldHJpZXNbdV0uYXBwbHkoYSl9fSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKHRoaXMpLFppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCksbnVsbH0sZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5jbG9uZS5jYWxsKHRoaXMpO2UuX2dlb21ldHJpZXM9bmV3IEFycmF5KHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoKS5maWxsKG51bGwpO2Zvcih2YXIgbj0wO248dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7bisrKWUuX2dlb21ldHJpZXNbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jbG9uZSgpO3JldHVybiBlfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iR2VvbWV0cnlDb2xsZWN0aW9uIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO3QrKylpZighdGhpcy5fZ2VvbWV0cmllc1t0XS5pc0VtcHR5KCkpcmV0dXJuITE7cmV0dXJuITB9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHg0ZjA3YmNiMWY4NTdkODAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KGlvKSxabz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRTb3J0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gaW8uU09SVElOREVYX01VTFRJTElORVNUUklOR30sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiEhdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSYmdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQucHJvdG90eXBlLmVxdWFsc0V4YWN0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0Nsb3NlZCgpP0dvLkZBTFNFOjB9LGUucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7Zm9yKHZhciB0PTA7dDx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDt0KyspaWYoIXRoaXMuX2dlb21ldHJpZXNbdF0uaXNDbG9zZWQoKSlyZXR1cm4hMTtyZXR1cm4hMH0sZS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDF9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgsZT1uZXcgQXJyYXkodCkuZmlsbChudWxsKSxuPTA7bjx0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aDtuKyspZVt0LTEtbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5yZXZlcnNlKCk7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZyhlKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEtvKHRoaXMpLmdldEJvdW5kYXJ5KCl9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJNdWx0aUxpbmVTdHJpbmcifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCkuZmlsbChudWxsKSxuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXT10aGlzLl9nZW9tZXRyaWVzW25dLmNvcHkoKTtyZXR1cm4gbmV3IGUodCx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bem9dfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NzE1NWQyYWI0YWZhODAwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShIbyksS289ZnVuY3Rpb24oKXtpZih0aGlzLl9nZW9tPW51bGwsdGhpcy5fZ2VvbUZhY3Q9bnVsbCx0aGlzLl9iblJ1bGU9bnVsbCx0aGlzLl9lbmRwb2ludE1hcD1udWxsLDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT11by5NT0QyX0JPVU5EQVJZX1JVTEU7dGhpcy5fZ2VvbT10LHRoaXMuX2dlb21GYWN0PXQuZ2V0RmFjdG9yeSgpLHRoaXMuX2JuUnVsZT1lfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXTt0aGlzLl9nZW9tPW4sdGhpcy5fZ2VvbUZhY3Q9bi5nZXRGYWN0b3J5KCksdGhpcy5fYm5SdWxlPXJ9fTtLby5wcm90b3R5cGUuYm91bmRhcnlNdWx0aUxpbmVTdHJpbmc9ZnVuY3Rpb24odCl7aWYodGhpcy5fZ2VvbS5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuZ2V0RW1wdHlNdWx0aVBvaW50KCk7dmFyIGU9dGhpcy5jb21wdXRlQm91bmRhcnlDb29yZGluYXRlcyh0KTtyZXR1cm4gMT09PWUubGVuZ3RoP3RoaXMuX2dlb21GYWN0LmNyZWF0ZVBvaW50KGVbMF0pOnRoaXMuX2dlb21GYWN0LmNyZWF0ZU11bHRpUG9pbnRGcm9tQ29vcmRzKGUpfSxLby5wcm90b3R5cGUuZ2V0Qm91bmRhcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2VvbSBpbnN0YW5jZW9mIGFzP3RoaXMuYm91bmRhcnlMaW5lU3RyaW5nKHRoaXMuX2dlb20pOnRoaXMuX2dlb20gaW5zdGFuY2VvZiBabz90aGlzLmJvdW5kYXJ5TXVsdGlMaW5lU3RyaW5nKHRoaXMuX2dlb20pOnRoaXMuX2dlb20uZ2V0Qm91bmRhcnkoKX0sS28ucHJvdG90eXBlLmJvdW5kYXJ5TGluZVN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZ2VvbS5pc0VtcHR5KCk/dGhpcy5nZXRFbXB0eU11bHRpUG9pbnQoKTp0LmlzQ2xvc2VkKCk/dGhpcy5fYm5SdWxlLmlzSW5Cb3VuZGFyeSgyKT90LmdldFN0YXJ0UG9pbnQoKTp0aGlzLl9nZW9tRmFjdC5jcmVhdGVNdWx0aVBvaW50KCk6dGhpcy5fZ2VvbUZhY3QuY3JlYXRlTXVsdGlQb2ludChbdC5nZXRTdGFydFBvaW50KCksdC5nZXRFbmRQb2ludCgpXSl9LEtvLnByb3RvdHlwZS5nZXRFbXB0eU11bHRpUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2VvbUZhY3QuY3JlYXRlTXVsdGlQb2ludCgpfSxLby5wcm90b3R5cGUuY29tcHV0ZUJvdW5kYXJ5Q29vcmRpbmF0ZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPW5ldyB4bzt0aGlzLl9lbmRwb2ludE1hcD1uZXcga287Zm9yKHZhciByPTA7cjx0LmdldE51bUdlb21ldHJpZXMoKTtyKyspe3ZhciBpPXQuZ2V0R2VvbWV0cnlOKHIpOzAhPT1pLmdldE51bVBvaW50cygpJiYoZS5hZGRFbmRwb2ludChpLmdldENvb3JkaW5hdGVOKDApKSxlLmFkZEVuZHBvaW50KGkuZ2V0Q29vcmRpbmF0ZU4oaS5nZXROdW1Qb2ludHMoKS0xKSkpfWZvcih2YXIgbz10aGlzLl9lbmRwb2ludE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKSxhPXMuZ2V0VmFsdWUoKS5jb3VudDtlLl9iblJ1bGUuaXNJbkJvdW5kYXJ5KGEpJiZuLmFkZChzLmdldEtleSgpKX1yZXR1cm4gRG8udG9Db29yZGluYXRlQXJyYXkobil9LEtvLnByb3RvdHlwZS5hZGRFbmRwb2ludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9lbmRwb2ludE1hcC5nZXQodCk7bnVsbD09PWUmJihlPW5ldyBKbyx0aGlzLl9lbmRwb2ludE1hcC5wdXQodCxlKSksZS5jb3VudCsrfSxLby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sS28ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEtvfSxLby5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgS28oYXJndW1lbnRzWzBdKS5nZXRCb3VuZGFyeSgpOjI9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBLbyhhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKS5nZXRCb3VuZGFyeSgpOnZvaWQgMH07dmFyIEpvPWZ1bmN0aW9uKCl7dGhpcy5jb3VudD1udWxsfTtmdW5jdGlvbiBRbygpe31mdW5jdGlvbiAkbygpe31Kby5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSm8ucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEpvfTt2YXIgdHM9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIGVzKCl7fWZ1bmN0aW9uIG5zKCl7fWZ1bmN0aW9uIHJzKCl7fXZhciBpcz1mdW5jdGlvbigpe30sb3M9e05FV0xJTkU6e2NvbmZpZ3VyYWJsZTohMH0sU0lNUExFX09SRElOQVRFX0ZPUk1BVDp7Y29uZmlndXJhYmxlOiEwfX07aXMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGlzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBpc30saXMuY2hhcnM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IEFycmF5KGUpLmZpbGwobnVsbCkscj0wO3I8ZTtyKyspbltyXT10O3JldHVybiBTdHJpbmcobil9LGlzLmdldFN0YWNrVHJhY2U9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9bmV3IGVzLG49bmV3IFFvO3JldHVybiB0LnByaW50U3RhY2tUcmFjZShuKSxlLnRvU3RyaW5nKCl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1sxXSxpPSIiO25ldyAkbyhpcy5nZXRTdGFja1RyYWNlKGFyZ3VtZW50c1swXSkpO2Zvcih2YXIgbz1uZXcgcnMscz0wO3M8cjtzKyspdHJ5e2krPW8ucmVhZExpbmUoKStpcy5ORVdMSU5FfWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIG5zKSl0aHJvdyB0O1ppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCl9cmV0dXJuIGl9fSxpcy5zcGxpdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLmxlbmd0aCxyPW5ldyB4byxpPSIiK3Qsbz1pLmluZGV4T2YoZSk7bz49MDspe3ZhciBzPWkuc3Vic3RyaW5nKDAsbyk7ci5hZGQocyksbz0oaT1pLnN1YnN0cmluZyhvK24pKS5pbmRleE9mKGUpfWkubGVuZ3RoPjAmJnIuYWRkKGkpO2Zvcih2YXIgYT1uZXcgQXJyYXkoci5zaXplKCkpLmZpbGwobnVsbCksdT0wO3U8YS5sZW5ndGg7dSsrKWFbdV09ci5nZXQodSk7cmV0dXJuIGF9LGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gaXMuU0lNUExFX09SRElOQVRFX0ZPUk1BVC5mb3JtYXQodCl9fSxpcy5zcGFjZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGlzLmNoYXJzKCIgIix0KX0sb3MuTkVXTElORS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4ga2kuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIil9LG9zLlNJTVBMRV9PUkRJTkFURV9GT1JNQVQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0c30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaXMsb3MpO3ZhciBzcz1mdW5jdGlvbigpe307c3MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHNzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBzc30sc3MuY29weUNvb3JkPWZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaT1NYXRoLm1pbih0LmdldERpbWVuc2lvbigpLG4uZ2V0RGltZW5zaW9uKCkpLG89MDtvPGk7bysrKW4uc2V0T3JkaW5hdGUocixvLHQuZ2V0T3JkaW5hdGUoZSxvKSl9LHNzLmlzUmluZz1mdW5jdGlvbih0KXt2YXIgZT10LnNpemUoKTtyZXR1cm4gMD09PWV8fCEoZTw9MykmJih0LmdldE9yZGluYXRlKDAsTGkuWCk9PT10LmdldE9yZGluYXRlKGUtMSxMaS5YKSYmdC5nZXRPcmRpbmF0ZSgwLExpLlkpPT09dC5nZXRPcmRpbmF0ZShlLTEsTGkuWSkpfSxzcy5pc0VxdWFsPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5zaXplKCk7aWYobiE9PWUuc2l6ZSgpKXJldHVybiExO2Zvcih2YXIgcj1NYXRoLm1pbih0LmdldERpbWVuc2lvbigpLGUuZ2V0RGltZW5zaW9uKCkpLGk9MDtpPG47aSsrKWZvcih2YXIgbz0wO288cjtvKyspe3ZhciBzPXQuZ2V0T3JkaW5hdGUoaSxvKSxhPWUuZ2V0T3JkaW5hdGUoaSxvKTtpZighKHQuZ2V0T3JkaW5hdGUoaSxvKT09PWUuZ2V0T3JkaW5hdGUoaSxvKXx8ZmkuaXNOYU4ocykmJmZpLmlzTmFOKGEpKSlyZXR1cm4hMX1yZXR1cm4hMH0sc3MuZXh0ZW5kPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmNyZWF0ZShuLGUuZ2V0RGltZW5zaW9uKCkpLGk9ZS5zaXplKCk7aWYoc3MuY29weShlLDAsciwwLGkpLGk+MClmb3IodmFyIG89aTtvPG47bysrKXNzLmNvcHkoZSxpLTEscixvLDEpO3JldHVybiByfSxzcy5yZXZlcnNlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LnNpemUoKS0xLG49TWF0aC50cnVuYyhlLzIpLHI9MDtyPD1uO3IrKylzcy5zd2FwKHQscixlLXIpfSxzcy5zd2FwPWZ1bmN0aW9uKHQsZSxuKXtpZihlPT09bilyZXR1cm4gbnVsbDtmb3IodmFyIHI9MDtyPHQuZ2V0RGltZW5zaW9uKCk7cisrKXt2YXIgaT10LmdldE9yZGluYXRlKGUscik7dC5zZXRPcmRpbmF0ZShlLHIsdC5nZXRPcmRpbmF0ZShuLHIpKSx0LnNldE9yZGluYXRlKG4scixpKX19LHNzLmNvcHk9ZnVuY3Rpb24odCxlLG4scixpKXtmb3IodmFyIG89MDtvPGk7bysrKXNzLmNvcHlDb29yZCh0LGUrbyxuLHIrbyl9LHNzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXQuc2l6ZSgpO2lmKDA9PT1lKXJldHVybiIoKSI7dmFyIG49dC5nZXREaW1lbnNpb24oKSxyPW5ldyBBaTtyLmFwcGVuZCgiKCIpO2Zvcih2YXIgaT0wO2k8ZTtpKyspe2k+MCYmci5hcHBlbmQoIiAiKTtmb3IodmFyIG89MDtvPG47bysrKW8+MCYmci5hcHBlbmQoIiwiKSxyLmFwcGVuZChpcy50b1N0cmluZyh0LmdldE9yZGluYXRlKGksbykpKX1yZXR1cm4gci5hcHBlbmQoIikiKSxyLnRvU3RyaW5nKCl9fSxzcy5lbnN1cmVWYWxpZFJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnNpemUoKTtyZXR1cm4gMD09PW4/ZTpuPD0zP3NzLmNyZWF0ZUNsb3NlZFJpbmcodCxlLDQpOmUuZ2V0T3JkaW5hdGUoMCxMaS5YKT09PWUuZ2V0T3JkaW5hdGUobi0xLExpLlgpJiZlLmdldE9yZGluYXRlKDAsTGkuWSk9PT1lLmdldE9yZGluYXRlKG4tMSxMaS5ZKT9lOnNzLmNyZWF0ZUNsb3NlZFJpbmcodCxlLG4rMSl9LHNzLmNyZWF0ZUNsb3NlZFJpbmc9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuY3JlYXRlKG4sZS5nZXREaW1lbnNpb24oKSksaT1lLnNpemUoKTtzcy5jb3B5KGUsMCxyLDAsaSk7Zm9yKHZhciBvPWk7bzxuO28rKylzcy5jb3B5KGUsMCxyLG8sMSk7cmV0dXJuIHJ9O3ZhciBhcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dC5jYWxsKHRoaXMsbiksdGhpcy5fcG9pbnRzPW51bGwsdGhpcy5pbml0KGUpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtyZXR1cm4gZS5wcm90b3R5cGUuY29tcHV0ZUVudmVsb3BlSW50ZXJuYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/bmV3IGppOnRoaXMuX3BvaW50cy5leHBhbmRFbnZlbG9wZShuZXcgamkpfSxlLnByb3RvdHlwZS5pc1Jpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0Nsb3NlZCgpJiZ0aGlzLmlzU2ltcGxlKCl9LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9MSU5FU1RSSU5HfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb2ludHMudG9Db29yZGluYXRlQXJyYXkoKX0sZS5wcm90b3R5cGUuZXF1YWxzRXhhY3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKCF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpKXJldHVybiExO3ZhciByPWU7aWYodGhpcy5fcG9pbnRzLnNpemUoKSE9PXIuX3BvaW50cy5zaXplKCkpcmV0dXJuITE7Zm9yKHZhciBpPTA7aTx0aGlzLl9wb2ludHMuc2l6ZSgpO2krKylpZighdGhpcy5lcXVhbCh0aGlzLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZShpKSxyLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZShpKSxuKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPTA7ZTxNYXRoLnRydW5jKHRoaXMuX3BvaW50cy5zaXplKCkvMik7ZSsrKXt2YXIgbj10Ll9wb2ludHMuc2l6ZSgpLTEtZTtpZighdC5fcG9pbnRzLmdldENvb3JkaW5hdGUoZSkuZXF1YWxzKHQuX3BvaW50cy5nZXRDb29yZGluYXRlKG4pKSlyZXR1cm4gdC5fcG9pbnRzLmdldENvb3JkaW5hdGUoZSkuY29tcGFyZVRvKHQuX3BvaW50cy5nZXRDb29yZGluYXRlKG4pKT4wJiZzcy5yZXZlcnNlKHQuX3BvaW50cyksbnVsbH19LGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/bnVsbDp0aGlzLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZSgwKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0Nsb3NlZCgpP0dvLkZBTFNFOjB9LGUucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNFbXB0eSgpJiZ0aGlzLmdldENvb3JkaW5hdGVOKDApLmVxdWFsczJEKHRoaXMuZ2V0Q29vcmRpbmF0ZU4odGhpcy5nZXROdW1Qb2ludHMoKS0xKSl9LGUucHJvdG90eXBlLmdldEVuZFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP251bGw6dGhpcy5nZXRQb2ludE4odGhpcy5nZXROdW1Qb2ludHMoKS0xKX0sZS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDF9LGUucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiBlby5jb21wdXRlTGVuZ3RoKHRoaXMuX3BvaW50cyl9LGUucHJvdG90eXBlLmdldE51bVBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb2ludHMuc2l6ZSgpfSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcG9pbnRzLmNvcHkoKTtyZXR1cm4gc3MucmV2ZXJzZSh0KSx0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVMaW5lU3RyaW5nKHQpfSxlLnByb3RvdHlwZS5jb21wYXJlVG9TYW1lQ2xhc3M9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciB0PWFyZ3VtZW50c1swXSxlPTAsbj0wO2U8dGhpcy5fcG9pbnRzLnNpemUoKSYmbjx0Ll9wb2ludHMuc2l6ZSgpOyl7dmFyIHI9dGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUoZSkuY29tcGFyZVRvKHQuX3BvaW50cy5nZXRDb29yZGluYXRlKG4pKTtpZigwIT09cilyZXR1cm4gcjtlKyssbisrfXJldHVybiBlPHRoaXMuX3BvaW50cy5zaXplKCk/MTpuPHQuX3BvaW50cy5zaXplKCk/LTE6MH1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMV0uY29tcGFyZSh0aGlzLl9wb2ludHMsaS5fcG9pbnRzKX19LGUucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKCl7aWYoRWkoYXJndW1lbnRzWzBdLGFvKSlmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9MDtlPHRoaXMuX3BvaW50cy5zaXplKCk7ZSsrKXQuZmlsdGVyKHRoaXMuX3BvaW50cy5nZXRDb29yZGluYXRlKGUpKTtlbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxXbykpe3ZhciBuPWFyZ3VtZW50c1swXTtpZigwPT09dGhpcy5fcG9pbnRzLnNpemUoKSlyZXR1cm4gbnVsbDtmb3IodmFyIHI9MDtyPHRoaXMuX3BvaW50cy5zaXplKCkmJihuLmZpbHRlcih0aGlzLl9wb2ludHMsciksIW4uaXNEb25lKCkpO3IrKyk7bi5pc0dlb21ldHJ5Q2hhbmdlZCgpJiZ0aGlzLmdlb21ldHJ5Q2hhbmdlZCgpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzBdLFhvKSl7YXJndW1lbnRzWzBdLmZpbHRlcih0aGlzKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxybykpe2FyZ3VtZW50c1swXS5maWx0ZXIodGhpcyl9fSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiBuZXcgS28odGhpcykuZ2V0Qm91bmRhcnkoKX0sZS5wcm90b3R5cGUuaXNFcXVpdmFsZW50Q2xhc3M9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBlfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7cmV0dXJuIGUuX3BvaW50cz10aGlzLl9wb2ludHMuY2xvbmUoKSxlfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlTj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcG9pbnRzLmdldENvb3JkaW5hdGUodCl9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJMaW5lU3RyaW5nIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLl9wb2ludHMuY29weSgpLHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlU2VxdWVuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9pbnRzfSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9wb2ludHMuc2l6ZSgpfSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10JiYodD10aGlzLmdldEZhY3RvcnkoKS5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFtdKSksMT09PXQuc2l6ZSgpKXRocm93IG5ldyBoaSgiSW52YWxpZCBudW1iZXIgb2YgcG9pbnRzIGluIExpbmVTdHJpbmcgKGZvdW5kICIrdC5zaXplKCkrIiAtIG11c3QgYmUgMCBvciA+PSAyKSIpO3RoaXMuX3BvaW50cz10fSxlLnByb3RvdHlwZS5pc0Nvb3JkaW5hdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9wb2ludHMuc2l6ZSgpO2UrKylpZih0aGlzLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZShlKS5lcXVhbHModCkpcmV0dXJuITA7cmV0dXJuITF9LGUucHJvdG90eXBlLmdldFN0YXJ0UG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/bnVsbDp0aGlzLmdldFBvaW50TigwKX0sZS5wcm90b3R5cGUuZ2V0UG9pbnROPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVQb2ludCh0aGlzLl9wb2ludHMuZ2V0Q29vcmRpbmF0ZSh0KSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3pvXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDJiMmI1MWJhNDM1YzhlMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oaW8pLHVzPWZ1bmN0aW9uKCl7fTt1cy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdXMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHVzfTt2YXIgY3M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3QuY2FsbCh0aGlzLG4pLHRoaXMuX2Nvb3JkaW5hdGVzPWV8fG51bGwsdGhpcy5pbml0KHRoaXMuX2Nvb3JkaW5hdGVzKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmNvbXB1dGVFbnZlbG9wZUludGVybmFsPWZ1bmN0aW9uKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIG5ldyBqaTt2YXIgdD1uZXcgamk7cmV0dXJuIHQuZXhwYW5kVG9JbmNsdWRlKHRoaXMuX2Nvb3JkaW5hdGVzLmdldFgoMCksdGhpcy5fY29vcmRpbmF0ZXMuZ2V0WSgwKSksdH0sZS5wcm90b3R5cGUuZ2V0U29ydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHQuU09SVElOREVYX1BPSU5UfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9bXTpbdGhpcy5nZXRDb29yZGluYXRlKCldfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuISF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpJiYoISghdGhpcy5pc0VtcHR5KCl8fCFlLmlzRW1wdHkoKSl8fHRoaXMuaXNFbXB0eSgpPT09ZS5pc0VtcHR5KCkmJnRoaXMuZXF1YWwoZS5nZXRDb29yZGluYXRlKCksdGhpcy5nZXRDb29yZGluYXRlKCksbikpfXJldHVybiB0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe30sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy5fY29vcmRpbmF0ZXMuc2l6ZSgpP3RoaXMuX2Nvb3JkaW5hdGVzLmdldENvb3JkaW5hdGUoMCk6bnVsbH0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gR28uRkFMU0V9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAwfSxlLnByb3RvdHlwZS5nZXROdW1Qb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/MDoxfSxlLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29weSgpfSxlLnByb3RvdHlwZS5nZXRYPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuZ2V0Q29vcmRpbmF0ZSgpKXRocm93IG5ldyBFcnJvcigiZ2V0WCBjYWxsZWQgb24gZW1wdHkgUG9pbnQiKTtyZXR1cm4gdGhpcy5nZXRDb29yZGluYXRlKCkueH0sZS5wcm90b3R5cGUuY29tcGFyZVRvU2FtZUNsYXNzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5nZXRDb29yZGluYXRlKCkuY29tcGFyZVRvKHQuZ2V0Q29vcmRpbmF0ZSgpKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMV0uY29tcGFyZSh0aGlzLl9jb29yZGluYXRlcyxlLl9jb29yZGluYXRlcyl9fSxlLnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbigpe2lmKEVpKGFyZ3VtZW50c1swXSxhbykpe3ZhciB0PWFyZ3VtZW50c1swXTtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt0LmZpbHRlcih0aGlzLmdldENvb3JkaW5hdGUoKSl9ZWxzZSBpZihFaShhcmd1bWVudHNbMF0sV28pKXt2YXIgZT1hcmd1bWVudHNbMF07aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIG51bGw7ZS5maWx0ZXIodGhpcy5fY29vcmRpbmF0ZXMsMCksZS5pc0dlb21ldHJ5Q2hhbmdlZCgpJiZ0aGlzLmdlb21ldHJ5Q2hhbmdlZCgpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzBdLFhvKSl7YXJndW1lbnRzWzBdLmZpbHRlcih0aGlzKX1lbHNlIGlmKEVpKGFyZ3VtZW50c1swXSxybykpe2FyZ3VtZW50c1swXS5maWx0ZXIodGhpcyl9fSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24obnVsbCl9LGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuY2xvbmUuY2FsbCh0aGlzKTtyZXR1cm4gZS5fY29vcmRpbmF0ZXM9dGhpcy5fY29vcmRpbmF0ZXMuY2xvbmUoKSxlfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iUG9pbnQifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlKHRoaXMuX2Nvb3JkaW5hdGVzLmNvcHkoKSx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzfSxlLnByb3RvdHlwZS5nZXRZPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuZ2V0Q29vcmRpbmF0ZSgpKXRocm93IG5ldyBFcnJvcigiZ2V0WSBjYWxsZWQgb24gZW1wdHkgUG9pbnQiKTtyZXR1cm4gdGhpcy5nZXRDb29yZGluYXRlKCkueX0sZS5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5fY29vcmRpbmF0ZXMuc2l6ZSgpfSxlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe251bGw9PT10JiYodD10aGlzLmdldEZhY3RvcnkoKS5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFtdKSksWmkuaXNUcnVlKHQuc2l6ZSgpPD0xKSx0aGlzLl9jb29yZGluYXRlcz10fSxlLnByb3RvdHlwZS5pc1NpbXBsZT1mdW5jdGlvbigpe3JldHVybiEwfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt1c119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHg0NDA3N2JhZDE2MWNiYzAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLG4pLGV9KGlvKSxscz1mdW5jdGlvbigpe307bHMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGxzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBsc307dmFyIGhzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIpe2lmKHQuY2FsbCh0aGlzLHIpLHRoaXMuX3NoZWxsPW51bGwsdGhpcy5faG9sZXM9bnVsbCxudWxsPT09ZSYmKGU9dGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTGluZWFyUmluZygpKSxudWxsPT09biYmKG49W10pLHQuaGFzTnVsbEVsZW1lbnRzKG4pKXRocm93IG5ldyBoaTtpZihlLmlzRW1wdHkoKSYmdC5oYXNOb25FbXB0eUVsZW1lbnRzKG4pKXRocm93IG5ldyBoaTt0aGlzLl9zaGVsbD1lLHRoaXMuX2hvbGVzPW59dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5jb21wdXRlRW52ZWxvcGVJbnRlcm5hbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbC5nZXRFbnZlbG9wZUludGVybmFsKCl9LGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0LlNPUlRJTkRFWF9QT0xZR09OfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybltdO2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5nZXROdW1Qb2ludHMoKSkuZmlsbChudWxsKSxlPS0xLG49dGhpcy5fc2hlbGwuZ2V0Q29vcmRpbmF0ZXMoKSxyPTA7cjxuLmxlbmd0aDtyKyspdFsrK2VdPW5bcl07Zm9yKHZhciBpPTA7aTx0aGlzLl9ob2xlcy5sZW5ndGg7aSsrKWZvcih2YXIgbz10aGlzLl9ob2xlc1tpXS5nZXRDb29yZGluYXRlcygpLHM9MDtzPG8ubGVuZ3RoO3MrKyl0WysrZV09b1tzXTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0QXJlYT1mdW5jdGlvbigpe3ZhciB0PTA7dCs9TWF0aC5hYnMoZW8uc2lnbmVkQXJlYSh0aGlzLl9zaGVsbC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSkpO2Zvcih2YXIgZT0wO2U8dGhpcy5faG9sZXMubGVuZ3RoO2UrKyl0LT1NYXRoLmFicyhlby5zaWduZWRBcmVhKHRoaXMuX2hvbGVzW2VdLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpKSk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmlzUmVjdGFuZ2xlPWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMuZ2V0TnVtSW50ZXJpb3JSaW5nKCl8fG51bGw9PT10aGlzLl9zaGVsbHx8NSE9PXRoaXMuX3NoZWxsLmdldE51bVBvaW50cygpKXJldHVybiExO2Zvcih2YXIgdD10aGlzLl9zaGVsbC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSxlPXRoaXMuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpLG49MDtuPDU7bisrKXt2YXIgcj10LmdldFgobik7aWYociE9PWUuZ2V0TWluWCgpJiZyIT09ZS5nZXRNYXhYKCkpcmV0dXJuITE7dmFyIGk9dC5nZXRZKG4pO2lmKGkhPT1lLmdldE1pblkoKSYmaSE9PWUuZ2V0TWF4WSgpKXJldHVybiExfWZvcih2YXIgbz10LmdldFgoMCkscz10LmdldFkoMCksYT0xO2E8PTQ7YSsrKXt2YXIgdT10LmdldFgoYSksYz10LmdldFkoYSk7aWYodSE9PW89PT0oYyE9PXMpKXJldHVybiExO289dSxzPWN9cmV0dXJuITB9LGUucHJvdG90eXBlLmVxdWFsc0V4YWN0PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZighdGhpcy5pc0VxdWl2YWxlbnRDbGFzcyhlKSlyZXR1cm4hMTt2YXIgcj1lLGk9dGhpcy5fc2hlbGwsbz1yLl9zaGVsbDtpZighaS5lcXVhbHNFeGFjdChvLG4pfHx0aGlzLl9ob2xlcy5sZW5ndGghPT1yLl9ob2xlcy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBzPTA7czx0aGlzLl9ob2xlcy5sZW5ndGg7cysrKWlmKCF0aGlzLl9ob2xlc1tzXS5lcXVhbHNFeGFjdChyLl9ob2xlc1tzXSxuKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7dGhpcy5ub3JtYWxpemUodGhpcy5fc2hlbGwsITApO2Zvcih2YXIgdD0wO3Q8dGhpcy5faG9sZXMubGVuZ3RoO3QrKyl0aGlzLm5vcm1hbGl6ZSh0aGlzLl9ob2xlc1t0XSwhMSk7Vm8uc29ydCh0aGlzLl9ob2xlcyl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKGUuaXNFbXB0eSgpKXJldHVybiBudWxsO3ZhciByPW5ldyBBcnJheShlLmdldENvb3JkaW5hdGVzKCkubGVuZ3RoLTEpLmZpbGwobnVsbCk7a2kuYXJyYXljb3B5KGUuZ2V0Q29vcmRpbmF0ZXMoKSwwLHIsMCxyLmxlbmd0aCk7dmFyIGk9RG8ubWluQ29vcmRpbmF0ZShlLmdldENvb3JkaW5hdGVzKCkpO0RvLnNjcm9sbChyLGkpLGtpLmFycmF5Y29weShyLDAsZS5nZXRDb29yZGluYXRlcygpLDAsci5sZW5ndGgpLGUuZ2V0Q29vcmRpbmF0ZXMoKVtyLmxlbmd0aF09clswXSxlby5pc0NDVyhlLmdldENvb3JkaW5hdGVzKCkpPT09biYmRG8ucmV2ZXJzZShlLmdldENvb3JkaW5hdGVzKCkpfX0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGVsbC5nZXRDb29yZGluYXRlKCl9LGUucHJvdG90eXBlLmdldE51bUludGVyaW9yUmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ob2xlcy5sZW5ndGh9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDF9LGUucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAyfSxlLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXt2YXIgdD0wO3QrPXRoaXMuX3NoZWxsLmdldExlbmd0aCgpO2Zvcih2YXIgZT0wO2U8dGhpcy5faG9sZXMubGVuZ3RoO2UrKyl0Kz10aGlzLl9ob2xlc1tlXS5nZXRMZW5ndGgoKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZ2V0TnVtUG9pbnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3NoZWxsLmdldE51bVBvaW50cygpLGU9MDtlPHRoaXMuX2hvbGVzLmxlbmd0aDtlKyspdCs9dGhpcy5faG9sZXNbZV0uZ2V0TnVtUG9pbnRzKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvcHkoKTt0Ll9zaGVsbD10aGlzLl9zaGVsbC5jb3B5KCkucmV2ZXJzZSgpLHQuX2hvbGVzPW5ldyBBcnJheSh0aGlzLl9ob2xlcy5sZW5ndGgpLmZpbGwobnVsbCk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9ob2xlcy5sZW5ndGg7ZSsrKXQuX2hvbGVzW2VdPXRoaXMuX2hvbGVzW2VdLmNvcHkoKS5yZXZlcnNlKCk7cmV0dXJuIHR9LGUucHJvdG90eXBlLmNvbnZleEh1bGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFeHRlcmlvclJpbmcoKS5jb252ZXhIdWxsKCl9LGUucHJvdG90eXBlLmNvbXBhcmVUb1NhbWVDbGFzcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT10aGlzLl9zaGVsbCxuPXQuX3NoZWxsO3JldHVybiBlLmNvbXBhcmVUb1NhbWVDbGFzcyhuKX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzBdLG89dGhpcy5fc2hlbGwscz1pLl9zaGVsbCxhPW8uY29tcGFyZVRvU2FtZUNsYXNzKHMscik7aWYoMCE9PWEpcmV0dXJuIGE7Zm9yKHZhciB1PXRoaXMuZ2V0TnVtSW50ZXJpb3JSaW5nKCksYz1pLmdldE51bUludGVyaW9yUmluZygpLGw9MDtsPHUmJmw8Yzspe3ZhciBoPXRoaXMuZ2V0SW50ZXJpb3JSaW5nTihsKSxmPWkuZ2V0SW50ZXJpb3JSaW5nTihsKSxwPWguY29tcGFyZVRvU2FtZUNsYXNzKGYscik7aWYoMCE9PXApcmV0dXJuIHA7bCsrfXJldHVybiBsPHU/MTpsPGM/LTE6MH19LGUucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoRWkodCxhbykpe3RoaXMuX3NoZWxsLmFwcGx5KHQpO2Zvcih2YXIgbj0wO248dGhpcy5faG9sZXMubGVuZ3RoO24rKyllLl9ob2xlc1tuXS5hcHBseSh0KX1lbHNlIGlmKEVpKHQsV28pKXtpZih0aGlzLl9zaGVsbC5hcHBseSh0KSwhdC5pc0RvbmUoKSlmb3IodmFyIHI9MDtyPHRoaXMuX2hvbGVzLmxlbmd0aCYmKGUuX2hvbGVzW3JdLmFwcGx5KHQpLCF0LmlzRG9uZSgpKTtyKyspO3QuaXNHZW9tZXRyeUNoYW5nZWQoKSYmdGhpcy5nZW9tZXRyeUNoYW5nZWQoKX1lbHNlIGlmKEVpKHQsWG8pKXQuZmlsdGVyKHRoaXMpO2Vsc2UgaWYoRWkodCxybykpe3QuZmlsdGVyKHRoaXMpLHRoaXMuX3NoZWxsLmFwcGx5KHQpO2Zvcih2YXIgaT0wO2k8dGhpcy5faG9sZXMubGVuZ3RoO2krKyllLl9ob2xlc1tpXS5hcHBseSh0KX19LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZygpO3ZhciB0PW5ldyBBcnJheSh0aGlzLl9ob2xlcy5sZW5ndGgrMSkuZmlsbChudWxsKTt0WzBdPXRoaXMuX3NoZWxsO2Zvcih2YXIgZT0wO2U8dGhpcy5faG9sZXMubGVuZ3RoO2UrKyl0W2UrMV09dGhpcy5faG9sZXNbZV07cmV0dXJuIHQubGVuZ3RoPD0xP3RoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVhclJpbmcodFswXS5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSk6dGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKHQpfSxlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLmNsb25lLmNhbGwodGhpcyk7ZS5fc2hlbGw9dGhpcy5fc2hlbGwuY2xvbmUoKSxlLl9ob2xlcz1uZXcgQXJyYXkodGhpcy5faG9sZXMubGVuZ3RoKS5maWxsKG51bGwpO2Zvcih2YXIgbj0wO248dGhpcy5faG9sZXMubGVuZ3RoO24rKyllLl9ob2xlc1tuXT10aGlzLl9ob2xlc1tuXS5jbG9uZSgpO3JldHVybiBlfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iUG9seWdvbiJ9LGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fc2hlbGwuY29weSgpLG49bmV3IEFycmF5KHRoaXMuX2hvbGVzLmxlbmd0aCkuZmlsbChudWxsKSxyPTA7cjxuLmxlbmd0aDtyKyspbltyXT10aGlzLl9ob2xlc1tyXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsbix0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuZ2V0RXh0ZXJpb3JSaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoZWxsfSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoZWxsLmlzRW1wdHkoKX0sZS5wcm90b3R5cGUuZ2V0SW50ZXJpb3JSaW5nTj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faG9sZXNbdF19LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2xzXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDMwN2ZmZWZkOGRjOTcyMDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oaW8pLGZzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiBpby5TT1JUSU5ERVhfTVVMVElQT0lOVH0sZS5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbigpe3JldHVybiEwfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuISF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpJiZ0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5jYWxsKHRoaXMsZSxuKX1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fZ2VvbWV0cmllc1tlXS5nZXRDb29yZGluYXRlKCl9cmV0dXJuIHQucHJvdG90eXBlLmdldENvb3JkaW5hdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiBHby5GQUxTRX0sZS5wcm90b3R5cGUuZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihudWxsKX0sZS5wcm90b3R5cGUuZ2V0R2VvbWV0cnlUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIk11bHRpUG9pbnQifSxlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSh0aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCkuZmlsbChudWxsKSxuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXT10aGlzLl9nZW9tZXRyaWVzW25dLmNvcHkoKTtyZXR1cm4gbmV3IGUodCx0aGlzLl9mYWN0b3J5KX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdXNdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4NmZiMWVkNDE2MmUwZmMwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShIbykscHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe2UgaW5zdGFuY2VvZiB2aSYmbiBpbnN0YW5jZW9mIElzJiYoZT1uLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUoZSkpLHQuY2FsbCh0aGlzLGUsbiksdGhpcy52YWxpZGF0ZUNvbnN0cnVjdGlvbigpfXQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lO3ZhciBuPXtNSU5JTVVNX1ZBTElEX1NJWkU6e2NvbmZpZ3VyYWJsZTohMH0sc2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiBpby5TT1JUSU5ERVhfTElORUFSUklOR30sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlEaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gR28uRkFMU0V9LGUucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmlzRW1wdHkoKXx8dC5wcm90b3R5cGUuaXNDbG9zZWQuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BvaW50cy5jb3B5KCk7cmV0dXJuIHNzLnJldmVyc2UodCksdGhpcy5nZXRGYWN0b3J5KCkuY3JlYXRlTGluZWFyUmluZyh0KX0sZS5wcm90b3R5cGUudmFsaWRhdGVDb25zdHJ1Y3Rpb249ZnVuY3Rpb24oKXtpZighdGhpcy5pc0VtcHR5KCkmJiF0LnByb3RvdHlwZS5pc0Nsb3NlZC5jYWxsKHRoaXMpKXRocm93IG5ldyBoaTtpZih0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLnNpemUoKT49MSYmdGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2UoKS5zaXplKCk8ZS5NSU5JTVVNX1ZBTElEX1NJWkUpdGhyb3cgbmV3IGhpKCJJbnZhbGlkIG51bWJlciBvZiBwb2ludHMgaW4gTGluZWFyUmluZyAoZm91bmQgIit0aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLnNpemUoKSsiIC0gbXVzdCBiZSAwIG9yID49IDQpIil9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5VHlwZT1mdW5jdGlvbigpe3JldHVybiJMaW5lYXJSaW5nIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe3JldHVybiBuZXcgZSh0aGlzLl9wb2ludHMuY29weSgpLHRoaXMuX2ZhY3RvcnkpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxuLk1JTklNVU1fVkFMSURfU0laRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gNH0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDNiMjI5ZTI2MjM2N2E2MDB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oYXMpLGRzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmdldFNvcnRJbmRleD1mdW5jdGlvbigpe3JldHVybiBpby5TT1JUSU5ERVhfTVVMVElQT0xZR09OfSxlLnByb3RvdHlwZS5lcXVhbHNFeGFjdD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuISF0aGlzLmlzRXF1aXZhbGVudENsYXNzKGUpJiZ0LnByb3RvdHlwZS5lcXVhbHNFeGFjdC5jYWxsKHRoaXMsZSxuKX1yZXR1cm4gdC5wcm90b3R5cGUuZXF1YWxzRXhhY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5nZXRCb3VuZGFyeURpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiAxfSxlLnByb3RvdHlwZS5nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gMn0sZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9nZW9tZXRyaWVzLmxlbmd0aCxlPW5ldyBBcnJheSh0KS5maWxsKG51bGwpLG49MDtuPHRoaXMuX2dlb21ldHJpZXMubGVuZ3RoO24rKyllW25dPXRoaXMuX2dlb21ldHJpZXNbbl0ucmV2ZXJzZSgpO3JldHVybiB0aGlzLmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aVBvbHlnb24oZSl9LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5PWZ1bmN0aW9uKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZygpO2Zvcih2YXIgdD1uZXcgeG8sZT0wO2U8dGhpcy5fZ2VvbWV0cmllcy5sZW5ndGg7ZSsrKWZvcih2YXIgbj10aGlzLl9nZW9tZXRyaWVzW2VdLmdldEJvdW5kYXJ5KCkscj0wO3I8bi5nZXROdW1HZW9tZXRyaWVzKCk7cisrKXQuYWRkKG4uZ2V0R2VvbWV0cnlOKHIpKTt2YXIgaT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmNyZWF0ZU11bHRpTGluZVN0cmluZyh0LnRvQXJyYXkoaSkpfSxlLnByb3RvdHlwZS5nZXRHZW9tZXRyeVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iTXVsdGlQb2x5Z29uIn0sZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZ2VvbWV0cmllcy5sZW5ndGgpLmZpbGwobnVsbCksbj0wO248dC5sZW5ndGg7bisrKXRbbl09dGhpcy5fZ2VvbWV0cmllc1tuXS5jb3B5KCk7cmV0dXJuIG5ldyBlKHQsdGhpcy5fZmFjdG9yeSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2xzXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDdhNWFhMTM2OTE3MTk4MH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShIbyksZ3M9ZnVuY3Rpb24odCl7dGhpcy5fZmFjdG9yeT10fHxudWxsLHRoaXMuX2lzVXNlckRhdGFDb3BpZWQ9ITF9LHlzPXtOb09wR2VvbWV0cnlPcGVyYXRpb246e2NvbmZpZ3VyYWJsZTohMH0sQ29vcmRpbmF0ZU9wZXJhdGlvbjp7Y29uZmlndXJhYmxlOiEwfSxDb29yZGluYXRlU2VxdWVuY2VPcGVyYXRpb246e2NvbmZpZ3VyYWJsZTohMH19O2dzLnByb3RvdHlwZS5zZXRDb3B5VXNlckRhdGE9ZnVuY3Rpb24odCl7dGhpcy5faXNVc2VyRGF0YUNvcGllZD10fSxncy5wcm90b3R5cGUuZWRpdD1mdW5jdGlvbih0LGUpe2lmKG51bGw9PT10KXJldHVybiBudWxsO3ZhciBuPXRoaXMuZWRpdEludGVybmFsKHQsZSk7cmV0dXJuIHRoaXMuX2lzVXNlckRhdGFDb3BpZWQmJm4uc2V0VXNlckRhdGEodC5nZXRVc2VyRGF0YSgpKSxufSxncy5wcm90b3R5cGUuZWRpdEludGVybmFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PT10aGlzLl9mYWN0b3J5JiYodGhpcy5fZmFjdG9yeT10LmdldEZhY3RvcnkoKSksdCBpbnN0YW5jZW9mIEhvP3RoaXMuZWRpdEdlb21ldHJ5Q29sbGVjdGlvbih0LGUpOnQgaW5zdGFuY2VvZiBocz90aGlzLmVkaXRQb2x5Z29uKHQsZSk6dCBpbnN0YW5jZW9mIGNzfHx0IGluc3RhbmNlb2YgYXM/ZS5lZGl0KHQsdGhpcy5fZmFjdG9yeSk6KFppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJVbnN1cHBvcnRlZCBHZW9tZXRyeSBjbGFzczogIit0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSxudWxsKX0sZ3MucHJvdG90eXBlLmVkaXRHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5lZGl0KHQsdGhpcy5fZmFjdG9yeSkscj1uZXcgeG8saT0wO2k8bi5nZXROdW1HZW9tZXRyaWVzKCk7aSsrKXt2YXIgbz10aGlzLmVkaXQobi5nZXRHZW9tZXRyeU4oaSksZSk7bnVsbD09PW98fG8uaXNFbXB0eSgpfHxyLmFkZChvKX1yZXR1cm4gbi5nZXRDbGFzcygpPT09ZnM/dGhpcy5fZmFjdG9yeS5jcmVhdGVNdWx0aVBvaW50KHIudG9BcnJheShbXSkpOm4uZ2V0Q2xhc3MoKT09PVpvP3RoaXMuX2ZhY3RvcnkuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKHIudG9BcnJheShbXSkpOm4uZ2V0Q2xhc3MoKT09PWRzP3RoaXMuX2ZhY3RvcnkuY3JlYXRlTXVsdGlQb2x5Z29uKHIudG9BcnJheShbXSkpOnRoaXMuX2ZhY3RvcnkuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKHIudG9BcnJheShbXSkpfSxncy5wcm90b3R5cGUuZWRpdFBvbHlnb249ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmVkaXQodCx0aGlzLl9mYWN0b3J5KTtpZihudWxsPT09biYmKG49dGhpcy5fZmFjdG9yeS5jcmVhdGVQb2x5Z29uKG51bGwpKSxuLmlzRW1wdHkoKSlyZXR1cm4gbjt2YXIgcj10aGlzLmVkaXQobi5nZXRFeHRlcmlvclJpbmcoKSxlKTtpZihudWxsPT09cnx8ci5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9seWdvbigpO2Zvcih2YXIgaT1uZXcgeG8sbz0wO288bi5nZXROdW1JbnRlcmlvclJpbmcoKTtvKyspe3ZhciBzPXRoaXMuZWRpdChuLmdldEludGVyaW9yUmluZ04obyksZSk7bnVsbD09PXN8fHMuaXNFbXB0eSgpfHxpLmFkZChzKX1yZXR1cm4gdGhpcy5fZmFjdG9yeS5jcmVhdGVQb2x5Z29uKHIsaS50b0FycmF5KFtdKSl9LGdzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxncy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZ3N9LGdzLkdlb21ldHJ5RWRpdG9yT3BlcmF0aW9uPWZ1bmN0aW9uKCl7fSx5cy5Ob09wR2VvbWV0cnlPcGVyYXRpb24uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG1zfSx5cy5Db29yZGluYXRlT3BlcmF0aW9uLmdldD1mdW5jdGlvbigpe3JldHVybiB2c30seXMuQ29vcmRpbmF0ZVNlcXVlbmNlT3BlcmF0aW9uLmdldD1mdW5jdGlvbigpe3JldHVybiBfc30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZ3MseXMpO3ZhciBtcz1mdW5jdGlvbigpe307bXMucHJvdG90eXBlLmVkaXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdH0sbXMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2dzLkdlb21ldHJ5RWRpdG9yT3BlcmF0aW9uXX0sbXMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG1zfTt2YXIgdnM9ZnVuY3Rpb24oKXt9O3ZzLnByb3RvdHlwZS5lZGl0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5lZGl0Q29vcmRpbmF0ZXModC5nZXRDb29yZGluYXRlcygpLHQpO3JldHVybiBudWxsPT09bj90OnQgaW5zdGFuY2VvZiBwcz9lLmNyZWF0ZUxpbmVhclJpbmcobik6dCBpbnN0YW5jZW9mIGFzP2UuY3JlYXRlTGluZVN0cmluZyhuKTp0IGluc3RhbmNlb2YgY3M/bi5sZW5ndGg+MD9lLmNyZWF0ZVBvaW50KG5bMF0pOmUuY3JlYXRlUG9pbnQoKTp0fSx2cy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZ3MuR2VvbWV0cnlFZGl0b3JPcGVyYXRpb25dfSx2cy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdnN9O3ZhciBfcz1mdW5jdGlvbigpe307X3MucHJvdG90eXBlLmVkaXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCBpbnN0YW5jZW9mIHBzP2UuY3JlYXRlTGluZWFyUmluZyh0aGlzLmVkaXQodC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KSk6dCBpbnN0YW5jZW9mIGFzP2UuY3JlYXRlTGluZVN0cmluZyh0aGlzLmVkaXQodC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KSk6dCBpbnN0YW5jZW9mIGNzP2UuY3JlYXRlUG9pbnQodGhpcy5lZGl0KHQuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlKCksdCkpOnR9LF9zLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltncy5HZW9tZXRyeUVkaXRvck9wZXJhdGlvbl19LF9zLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBfc307dmFyIHhzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZih0aGlzLl9kaW1lbnNpb249Myx0aGlzLl9jb29yZGluYXRlcz1udWxsLDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXRoaXMuX2Nvb3JkaW5hdGVzPWFyZ3VtZW50c1swXSx0aGlzLl9kaW1lbnNpb249MztlbHNlIGlmKE51bWJlci5pc0ludGVnZXIoYXJndW1lbnRzWzBdKSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX2Nvb3JkaW5hdGVzPW5ldyBBcnJheShlKS5maWxsKG51bGwpO2Zvcih2YXIgbj0wO248ZTtuKyspdC5fY29vcmRpbmF0ZXNbbl09bmV3IHZpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzBdLExpKSl7dmFyIHI9YXJndW1lbnRzWzBdO2lmKG51bGw9PT1yKXJldHVybiB0aGlzLl9jb29yZGluYXRlcz1uZXcgQXJyYXkoMCkuZmlsbChudWxsKSxudWxsO3RoaXMuX2RpbWVuc2lvbj1yLmdldERpbWVuc2lvbigpLHRoaXMuX2Nvb3JkaW5hdGVzPW5ldyBBcnJheShyLnNpemUoKSkuZmlsbChudWxsKTtmb3IodmFyIGk9MDtpPHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtpKyspdC5fY29vcmRpbmF0ZXNbaV09ci5nZXRDb29yZGluYXRlQ29weShpKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aClpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1sxXSkpe3ZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1sxXTt0aGlzLl9jb29yZGluYXRlcz1vLHRoaXMuX2RpbWVuc2lvbj1zLG51bGw9PT1vJiYodGhpcy5fY29vcmRpbmF0ZXM9bmV3IEFycmF5KDApLmZpbGwobnVsbCkpfWVsc2UgaWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pJiZOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1sxXSkpe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXTt0aGlzLl9jb29yZGluYXRlcz1uZXcgQXJyYXkoYSkuZmlsbChudWxsKSx0aGlzLl9kaW1lbnNpb249dTtmb3IodmFyIGM9MDtjPGE7YysrKXQuX2Nvb3JkaW5hdGVzW2NdPW5ldyB2aX19LHdzPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTt4cy5wcm90b3R5cGUuc2V0T3JkaW5hdGU9ZnVuY3Rpb24odCxlLG4pe3N3aXRjaChlKXtjYXNlIExpLlg6dGhpcy5fY29vcmRpbmF0ZXNbdF0ueD1uO2JyZWFrO2Nhc2UgTGkuWTp0aGlzLl9jb29yZGluYXRlc1t0XS55PW47YnJlYWs7Y2FzZSBMaS5aOnRoaXMuX2Nvb3JkaW5hdGVzW3RdLno9bjticmVhaztkZWZhdWx0OnRocm93IG5ldyBoaX19LHhzLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aH0seHMucHJvdG90eXBlLmdldE9yZGluYXRlPWZ1bmN0aW9uKHQsZSl7c3dpdGNoKGUpe2Nhc2UgTGkuWDpyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF0ueDtjYXNlIExpLlk6cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzW3RdLnk7Y2FzZSBMaS5aOnJldHVybiB0aGlzLl9jb29yZGluYXRlc1t0XS56fXJldHVybiBmaS5OYU59LHhzLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF19aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtuLng9dGhpcy5fY29vcmRpbmF0ZXNbZV0ueCxuLnk9dGhpcy5fY29vcmRpbmF0ZXNbZV0ueSxuLno9dGhpcy5fY29vcmRpbmF0ZXNbZV0uen19LHhzLnByb3RvdHlwZS5nZXRDb29yZGluYXRlQ29weT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHZpKHRoaXMuX2Nvb3JkaW5hdGVzW3RdKX0seHMucHJvdG90eXBlLmdldERpbWVuc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaW1lbnNpb259LHhzLnByb3RvdHlwZS5nZXRYPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jb29yZGluYXRlc1t0XS54fSx4cy5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKS5maWxsKG51bGwpLGU9MDtlPHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtlKyspdFtlXT10aGlzLl9jb29yZGluYXRlc1tlXS5jbG9uZSgpO3JldHVybiBuZXcgeHModCx0aGlzLl9kaW1lbnNpb24pfSx4cy5wcm90b3R5cGUuZXhwYW5kRW52ZWxvcGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9jb29yZGluYXRlcy5sZW5ndGg7ZSsrKXQuZXhwYW5kVG9JbmNsdWRlKHRoaXMuX2Nvb3JkaW5hdGVzW2VdKTtyZXR1cm4gdH0seHMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKS5maWxsKG51bGwpLGU9MDtlPHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtlKyspdFtlXT10aGlzLl9jb29yZGluYXRlc1tlXS5jb3B5KCk7cmV0dXJuIG5ldyB4cyh0LHRoaXMuX2RpbWVuc2lvbil9LHhzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2lmKHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aD4wKXt2YXIgdD1uZXcgQWkoMTcqdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoKTt0LmFwcGVuZCgiKCIpLHQuYXBwZW5kKHRoaXMuX2Nvb3JkaW5hdGVzWzBdKTtmb3IodmFyIGU9MTtlPHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDtlKyspdC5hcHBlbmQoIiwgIiksdC5hcHBlbmQodGhpcy5fY29vcmRpbmF0ZXNbZV0pO3JldHVybiB0LmFwcGVuZCgiKSIpLHQudG9TdHJpbmcoKX1yZXR1cm4iKCkifSx4cy5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZXNbdF0ueX0seHMucHJvdG90eXBlLnRvQ29vcmRpbmF0ZUFycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVzfSx4cy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bTGksbWldfSx4cy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geHN9LHdzLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTB4Y2I0NGE3NzhkYjE4ZTAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh4cyx3cyk7dmFyIGJzPWZ1bmN0aW9uKCl7fSxEcz17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxpbnN0YW5jZU9iamVjdDp7Y29uZmlndXJhYmxlOiEwfX07YnMucHJvdG90eXBlLnJlYWRSZXNvbHZlPWZ1bmN0aW9uKCl7cmV0dXJuIGJzLmluc3RhbmNlKCl9LGJzLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gbmV3IHhzKGFyZ3VtZW50c1swXSk7aWYoRWkoYXJndW1lbnRzWzBdLExpKSlyZXR1cm4gbmV3IHhzKGFyZ3VtZW50c1swXSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3JldHVybiBlPjMmJihlPTMpLGU8Mj9uZXcgeHModCk6bmV3IHhzKHQsZSl9fSxicy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bd2ksbWldfSxicy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gYnN9LGJzLmluc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIGJzLmluc3RhbmNlT2JqZWN0fSxEcy5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDM4ZTQ5ZmE2Y2Y2ZjJlMDB9LERzLmluc3RhbmNlT2JqZWN0LmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgYnN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGJzLERzKTt2YXIgRXM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLm1hcF89bmV3IE1hcH1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1hcF8uZ2V0KHQpfHxudWxsfSxlLnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5tYXBfLnNldCh0LGUpLGV9LGUucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgeG8sZT10aGlzLm1hcF8udmFsdWVzKCksbj1lLm5leHQoKTshbi5kb25lOyl0LmFkZChuLnZhbHVlKSxuPWUubmV4dCgpO3JldHVybiB0fSxlLnByb3RvdHlwZS5lbnRyeVNldD1mdW5jdGlvbigpe3ZhciB0PW5ldyBGbztyZXR1cm4gdGhpcy5tYXBfLmVudHJpZXMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gdC5hZGQoZSl9KSksdH0sZS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcF8uc2l6ZSgpfSxlfShBbyksQ3M9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX21vZGVsVHlwZT1udWxsLHRoaXMuX3NjYWxlPW51bGwsMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5fbW9kZWxUeXBlPXQuRkxPQVRJTkc7ZWxzZSBpZigxPT09YXJndW1lbnRzLmxlbmd0aClpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFzKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5fbW9kZWxUeXBlPWUsZT09PXQuRklYRUQmJnRoaXMuc2V0U2NhbGUoMSl9ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIG49YXJndW1lbnRzWzBdO3RoaXMuX21vZGVsVHlwZT10LkZJWEVELHRoaXMuc2V0U2NhbGUobil9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHQpe3ZhciByPWFyZ3VtZW50c1swXTt0aGlzLl9tb2RlbFR5cGU9ci5fbW9kZWxUeXBlLHRoaXMuX3NjYWxlPXIuX3NjYWxlfX0sU3M9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0sbWF4aW11bVByZWNpc2VWYWx1ZTp7Y29uZmlndXJhYmxlOiEwfX07Q3MucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBDcykpcmV0dXJuITE7dmFyIGU9dDtyZXR1cm4gdGhpcy5fbW9kZWxUeXBlPT09ZS5fbW9kZWxUeXBlJiZ0aGlzLl9zY2FsZT09PWUuX3NjYWxlfSxDcy5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQsbj10aGlzLmdldE1heGltdW1TaWduaWZpY2FudERpZ2l0cygpLHI9ZS5nZXRNYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMoKTtyZXR1cm4gbmV3IE5pKG4pLmNvbXBhcmVUbyhuZXcgTmkocikpfSxDcy5wcm90b3R5cGUuZ2V0U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NhbGV9LENzLnByb3RvdHlwZS5pc0Zsb2F0aW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZGVsVHlwZT09PUNzLkZMT0FUSU5HfHx0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GTE9BVElOR19TSU5HTEV9LENzLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZGVsVHlwZX0sQ3MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9IlVOS05PV04iO3JldHVybiB0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GTE9BVElORz90PSJGbG9hdGluZyI6dGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkdfU0lOR0xFP3Q9IkZsb2F0aW5nLVNpbmdsZSI6dGhpcy5fbW9kZWxUeXBlPT09Q3MuRklYRUQmJih0PSJGaXhlZCAoU2NhbGU9Iit0aGlzLmdldFNjYWxlKCkrIikiKSx0fSxDcy5wcm90b3R5cGUubWFrZVByZWNpc2U9ZnVuY3Rpb24oKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBmaS5pc05hTih0KXx8dGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkdfU0lOR0xFP3Q6dGhpcy5fbW9kZWxUeXBlPT09Q3MuRklYRUQ/TWF0aC5yb3VuZCh0KnRoaXMuX3NjYWxlKS90aGlzLl9zY2FsZTp0fWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciBlPWFyZ3VtZW50c1swXTtpZih0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GTE9BVElORylyZXR1cm4gbnVsbDtlLng9dGhpcy5tYWtlUHJlY2lzZShlLngpLGUueT10aGlzLm1ha2VQcmVjaXNlKGUueSl9fSxDcy5wcm90b3R5cGUuZ2V0TWF4aW11bVNpZ25pZmljYW50RGlnaXRzPWZ1bmN0aW9uKCl7dmFyIHQ9MTY7cmV0dXJuIHRoaXMuX21vZGVsVHlwZT09PUNzLkZMT0FUSU5HP3Q9MTY6dGhpcy5fbW9kZWxUeXBlPT09Q3MuRkxPQVRJTkdfU0lOR0xFP3Q9Njp0aGlzLl9tb2RlbFR5cGU9PT1Dcy5GSVhFRCYmKHQ9MStNYXRoLnRydW5jKE1hdGguY2VpbChNYXRoLmxvZyh0aGlzLmdldFNjYWxlKCkpL01hdGgubG9nKDEwKSkpKSx0fSxDcy5wcm90b3R5cGUuc2V0U2NhbGU9ZnVuY3Rpb24odCl7dGhpcy5fc2NhbGU9TWF0aC5hYnModCl9LENzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblttaSxkaV19LENzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDc30sQ3MubW9zdFByZWNpc2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb21wYXJlVG8oZSk+PTA/dDplfSxTcy5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybiAweDZiZWU2NDA0ZTlhMjVjMDB9LFNzLm1heGltdW1QcmVjaXNlVmFsdWUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDkwMDcxOTkyNTQ3NDA5OTJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENzLFNzKTt2YXIgQXM9ZnVuY3Rpb24gdChlKXt0aGlzLl9uYW1lPWV8fG51bGwsdC5uYW1lVG9UeXBlTWFwLnB1dChlLHRoaXMpfSxOcz17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfSxuYW1lVG9UeXBlTWFwOntjb25maWd1cmFibGU6ITB9fTtBcy5wcm90b3R5cGUucmVhZFJlc29sdmU9ZnVuY3Rpb24oKXtyZXR1cm4gQXMubmFtZVRvVHlwZU1hcC5nZXQodGhpcy5fbmFtZSl9LEFzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9uYW1lfSxBcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbWldfSxBcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gQXN9LE5zLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTU1Mjg2MDI2MzE3MzE1OWU0fSxOcy5uYW1lVG9UeXBlTWFwLmdldD1mdW5jdGlvbigpe3JldHVybiBuZXcgRXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEFzLE5zKSxDcy5UeXBlPUFzLENzLkZJWEVEPW5ldyBBcygiRklYRUQiKSxDcy5GTE9BVElORz1uZXcgQXMoIkZMT0FUSU5HIiksQ3MuRkxPQVRJTkdfU0lOR0xFPW5ldyBBcygiRkxPQVRJTkcgU0lOR0xFIik7dmFyIElzPWZ1bmN0aW9uIHQoKXt0aGlzLl9wcmVjaXNpb25Nb2RlbD1uZXcgQ3MsdGhpcy5fU1JJRD0wLHRoaXMuX2Nvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnk9dC5nZXREZWZhdWx0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLDA9PT1hcmd1bWVudHMubGVuZ3RofHwoMT09PWFyZ3VtZW50cy5sZW5ndGg/RWkoYXJndW1lbnRzWzBdLHdpKT90aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5PWFyZ3VtZW50c1swXTphcmd1bWVudHNbMF1pbnN0YW5jZW9mIENzJiYodGhpcy5fcHJlY2lzaW9uTW9kZWw9YXJndW1lbnRzWzBdKToyPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5fcHJlY2lzaW9uTW9kZWw9YXJndW1lbnRzWzBdLHRoaXMuX1NSSUQ9YXJndW1lbnRzWzFdKTozPT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX3ByZWNpc2lvbk1vZGVsPWFyZ3VtZW50c1swXSx0aGlzLl9TUklEPWFyZ3VtZW50c1sxXSx0aGlzLl9jb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5PWFyZ3VtZW50c1syXSkpfSxNcz17c2VyaWFsVmVyc2lvblVJRDp7Y29uZmlndXJhYmxlOiEwfX07SXMucHJvdG90eXBlLnRvR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNOdWxsKCk/dGhpcy5jcmVhdGVQb2ludChudWxsKTp0LmdldE1pblgoKT09PXQuZ2V0TWF4WCgpJiZ0LmdldE1pblkoKT09PXQuZ2V0TWF4WSgpP3RoaXMuY3JlYXRlUG9pbnQobmV3IHZpKHQuZ2V0TWluWCgpLHQuZ2V0TWluWSgpKSk6dC5nZXRNaW5YKCk9PT10LmdldE1heFgoKXx8dC5nZXRNaW5ZKCk9PT10LmdldE1heFkoKT90aGlzLmNyZWF0ZUxpbmVTdHJpbmcoW25ldyB2aSh0LmdldE1pblgoKSx0LmdldE1pblkoKSksbmV3IHZpKHQuZ2V0TWF4WCgpLHQuZ2V0TWF4WSgpKV0pOnRoaXMuY3JlYXRlUG9seWdvbih0aGlzLmNyZWF0ZUxpbmVhclJpbmcoW25ldyB2aSh0LmdldE1pblgoKSx0LmdldE1pblkoKSksbmV3IHZpKHQuZ2V0TWluWCgpLHQuZ2V0TWF4WSgpKSxuZXcgdmkodC5nZXRNYXhYKCksdC5nZXRNYXhZKCkpLG5ldyB2aSh0LmdldE1heFgoKSx0LmdldE1pblkoKSksbmV3IHZpKHQuZ2V0TWluWCgpLHQuZ2V0TWluWSgpKV0pLG51bGwpfSxJcy5wcm90b3R5cGUuY3JlYXRlTGluZVN0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdD90IGluc3RhbmNlb2YgQXJyYXk/bmV3IGFzKHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KSx0aGlzKTpFaSh0LExpKT9uZXcgYXModCx0aGlzKTp2b2lkIDA6bmV3IGFzKHRoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShbXSksdGhpcyl9LElzLnByb3RvdHlwZS5jcmVhdGVNdWx0aUxpbmVTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IFpvKG51bGwsdGhpcyk6MT09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IFpvKGFyZ3VtZW50c1swXSx0aGlzKTp2b2lkIDB9LElzLnByb3RvdHlwZS5idWlsZEdlb21ldHJ5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLG49ITEscj0hMSxpPXQuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspe3ZhciBvPWkubmV4dCgpLHM9by5nZXRDbGFzcygpO251bGw9PT1lJiYoZT1zKSxzIT09ZSYmKG49ITApLG8uaXNHZW9tZXRyeUNvbGxlY3Rpb25PckRlcml2ZWQoKSYmKHI9ITApfWlmKG51bGw9PT1lKXJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbigpO2lmKG58fHIpcmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKElzLnRvR2VvbWV0cnlBcnJheSh0KSk7dmFyIGE9dC5pdGVyYXRvcigpLm5leHQoKTtpZih0LnNpemUoKT4xKXtpZihhIGluc3RhbmNlb2YgaHMpcmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2x5Z29uKElzLnRvUG9seWdvbkFycmF5KHQpKTtpZihhIGluc3RhbmNlb2YgYXMpcmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlMaW5lU3RyaW5nKElzLnRvTGluZVN0cmluZ0FycmF5KHQpKTtpZihhIGluc3RhbmNlb2YgY3MpcmV0dXJuIHRoaXMuY3JlYXRlTXVsdGlQb2ludChJcy50b1BvaW50QXJyYXkodCkpO1ppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJVbmhhbmRsZWQgY2xhc3M6ICIrYS5nZXRDbGFzcygpLmdldE5hbWUoKSl9cmV0dXJuIGF9LElzLnByb3RvdHlwZS5jcmVhdGVNdWx0aVBvaW50RnJvbUNvb3Jkcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jcmVhdGVNdWx0aVBvaW50KG51bGwhPT10P3RoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KTpudWxsKX0sSXMucHJvdG90eXBlLmNyZWF0ZVBvaW50PWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuY3JlYXRlUG9pbnQodGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFtdKSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVQb2ludChudWxsIT09dD90aGlzLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkoKS5jcmVhdGUoW3RdKTpudWxsKX1pZihFaShhcmd1bWVudHNbMF0sTGkpKXJldHVybiBuZXcgY3MoYXJndW1lbnRzWzBdLHRoaXMpfX0sSXMucHJvdG90eXBlLmdldENvb3JkaW5hdGVTZXF1ZW5jZUZhY3Rvcnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeX0sSXMucHJvdG90eXBlLmNyZWF0ZVBvbHlnb249ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IGhzKG51bGwsbnVsbCx0aGlzKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoRWkoYXJndW1lbnRzWzBdLExpKSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNyZWF0ZVBvbHlnb24odGhpcy5jcmVhdGVMaW5lYXJSaW5nKHQpKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuY3JlYXRlUG9seWdvbih0aGlzLmNyZWF0ZUxpbmVhclJpbmcoZSkpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgcHMpe3ZhciBuPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVQb2x5Z29uKG4sbnVsbCl9fWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3JldHVybiBuZXcgaHMoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSx0aGlzKX19LElzLnByb3RvdHlwZS5nZXRTUklEPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX1NSSUR9LElzLnByb3RvdHlwZS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IEhvKG51bGwsdGhpcyk6MT09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IEhvKGFyZ3VtZW50c1swXSx0aGlzKTp2b2lkIDB9LElzLnByb3RvdHlwZS5jcmVhdGVHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGdzKHRoaXMpLmVkaXQodCx7ZWRpdDpmdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2Nvb3JkaW5hdGVTZXF1ZW5jZUZhY3RvcnkuY3JlYXRlKHQpfX19KX0sSXMucHJvdG90eXBlLmdldFByZWNpc2lvbk1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZWNpc2lvbk1vZGVsfSxJcy5wcm90b3R5cGUuY3JlYXRlTGluZWFyUmluZz1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmNyZWF0ZUxpbmVhclJpbmcodGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKFtdKSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5jcmVhdGVMaW5lYXJSaW5nKG51bGwhPT10P3RoaXMuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KTpudWxsKX1pZihFaShhcmd1bWVudHNbMF0sTGkpKXJldHVybiBuZXcgcHMoYXJndW1lbnRzWzBdLHRoaXMpfX0sSXMucHJvdG90eXBlLmNyZWF0ZU11bHRpUG9seWdvbj1mdW5jdGlvbigpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgZHMobnVsbCx0aGlzKToxPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgZHMoYXJndW1lbnRzWzBdLHRoaXMpOnZvaWQgMH0sSXMucHJvdG90eXBlLmNyZWF0ZU11bHRpUG9pbnQ9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IGZzKG51bGwsdGhpcyk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIG5ldyBmcyhhcmd1bWVudHNbMF0sdGhpcyk7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLmNyZWF0ZU11bHRpUG9pbnQobnVsbCE9PXQ/dGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKHQpOm51bGwpfWlmKEVpKGFyZ3VtZW50c1swXSxMaSkpe3ZhciBlPWFyZ3VtZW50c1swXTtpZihudWxsPT09ZSlyZXR1cm4gdGhpcy5jcmVhdGVNdWx0aVBvaW50KG5ldyBBcnJheSgwKS5maWxsKG51bGwpKTtmb3IodmFyIG49bmV3IEFycmF5KGUuc2l6ZSgpKS5maWxsKG51bGwpLHI9MDtyPGUuc2l6ZSgpO3IrKyl7dmFyIGk9dGhpcy5nZXRDb29yZGluYXRlU2VxdWVuY2VGYWN0b3J5KCkuY3JlYXRlKDEsZS5nZXREaW1lbnNpb24oKSk7c3MuY29weShlLHIsaSwwLDEpLG5bcl09dGhpcy5jcmVhdGVQb2ludChpKX1yZXR1cm4gdGhpcy5jcmVhdGVNdWx0aVBvaW50KG4pfX19LElzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblttaV19LElzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBJc30sSXMudG9NdWx0aVBvbHlnb25BcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMudG9HZW9tZXRyeUFycmF5PWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10KXJldHVybiBudWxsO3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy5nZXREZWZhdWx0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeT1mdW5jdGlvbigpe3JldHVybiBicy5pbnN0YW5jZSgpfSxJcy50b011bHRpTGluZVN0cmluZ0FycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy50b0xpbmVTdHJpbmdBcnJheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCk7cmV0dXJuIHQudG9BcnJheShlKX0sSXMudG9NdWx0aVBvaW50QXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LElzLnRvTGluZWFyUmluZ0FycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy50b1BvaW50QXJyYXk9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEFycmF5KHQuc2l6ZSgpKS5maWxsKG51bGwpO3JldHVybiB0LnRvQXJyYXkoZSl9LElzLnRvUG9seWdvbkFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKTtyZXR1cm4gdC50b0FycmF5KGUpfSxJcy5jcmVhdGVQb2ludEZyb21JbnRlcm5hbENvb3JkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0UHJlY2lzaW9uTW9kZWwoKS5tYWtlUHJlY2lzZSh0KSxlLmdldEZhY3RvcnkoKS5jcmVhdGVQb2ludCh0KX0sTXMuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tMHg1ZWE3NWYyMDUxZWViNDAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhJcyxNcyk7dmFyIEZzPWZ1bmN0aW9uKCl7fSxUcz17T046e2NvbmZpZ3VyYWJsZTohMH0sTEVGVDp7Y29uZmlndXJhYmxlOiEwfSxSSUdIVDp7Y29uZmlndXJhYmxlOiEwfX07ZnVuY3Rpb24gT3ModCl7dGhpcy5tZXNzYWdlPXR8fCIifWZ1bmN0aW9uIExzKCl7dGhpcy5hcnJheV89W119RnMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEZzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBGc30sRnMub3Bwb3NpdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1Gcy5MRUZUP0ZzLlJJR0hUOnQ9PT1Gcy5SSUdIVD9Gcy5MRUZUOnR9LFRzLk9OLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxUcy5MRUZULmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxUcy5SSUdIVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRnMsVHMpLE9zLnByb3RvdHlwZT1uZXcgRXJyb3IsT3MucHJvdG90eXBlLm5hbWU9IkVtcHR5U3RhY2tFeGNlcHRpb24iLExzLnByb3RvdHlwZT1uZXcgdm8sTHMucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hcnJheV8ucHVzaCh0KSwhMH0sTHMucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZih0PDB8fHQ+PXRoaXMuc2l6ZSgpKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy5hcnJheV9bdF19LExzLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFycmF5Xy5wdXNoKHQpLHR9LExzLnByb3RvdHlwZS5wb3A9ZnVuY3Rpb24odCl7aWYoMD09PXRoaXMuYXJyYXlfLmxlbmd0aCl0aHJvdyBuZXcgT3M7cmV0dXJuIHRoaXMuYXJyYXlfLnBvcCgpfSxMcy5wcm90b3R5cGUucGVlaz1mdW5jdGlvbigpe2lmKDA9PT10aGlzLmFycmF5Xy5sZW5ndGgpdGhyb3cgbmV3IE9zO3JldHVybiB0aGlzLmFycmF5X1t0aGlzLmFycmF5Xy5sZW5ndGgtMV19LExzLnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5hcnJheV8ubGVuZ3RofSxMcy5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVtcHR5KCl9LExzLnByb3RvdHlwZS5zZWFyY2g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXJyYXlfLmluZGV4T2YodCl9LExzLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLmxlbmd0aH0sTHMucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wLG49dGhpcy5hcnJheV8ubGVuZ3RoO2U8bjtlKyspdC5wdXNoKHRoaXMuYXJyYXlfW2VdKTtyZXR1cm4gdH07dmFyIFBzPWZ1bmN0aW9uKCl7dGhpcy5fbWluSW5kZXg9LTEsdGhpcy5fbWluQ29vcmQ9bnVsbCx0aGlzLl9taW5EZT1udWxsLHRoaXMuX29yaWVudGVkRGU9bnVsbH07UHMucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWluQ29vcmR9LFBzLnByb3RvdHlwZS5nZXRSaWdodG1vc3RTaWRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRSaWdodG1vc3RTaWRlT2ZTZWdtZW50KHQsZSk7cmV0dXJuIG48MCYmKG49dGhpcy5nZXRSaWdodG1vc3RTaWRlT2ZTZWdtZW50KHQsZS0xKSksbjwwJiYodGhpcy5fbWluQ29vcmQ9bnVsbCx0aGlzLmNoZWNrRm9yUmlnaHRtb3N0Q29vcmRpbmF0ZSh0KSksbn0sUHMucHJvdG90eXBlLmZpbmRSaWdodG1vc3RFZGdlQXRWZXJ0ZXg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9taW5EZS5nZXRFZGdlKCkuZ2V0Q29vcmRpbmF0ZXMoKTtaaS5pc1RydWUodGhpcy5fbWluSW5kZXg+MCYmdGhpcy5fbWluSW5kZXg8dC5sZW5ndGgsInJpZ2h0bW9zdCBwb2ludCBleHBlY3RlZCB0byBiZSBpbnRlcmlvciB2ZXJ0ZXggb2YgZWRnZSIpO3ZhciBlPXRbdGhpcy5fbWluSW5kZXgtMV0sbj10W3RoaXMuX21pbkluZGV4KzFdLHI9ZW8uY29tcHV0ZU9yaWVudGF0aW9uKHRoaXMuX21pbkNvb3JkLG4sZSksaT0hMTsoZS55PHRoaXMuX21pbkNvb3JkLnkmJm4ueTx0aGlzLl9taW5Db29yZC55JiZyPT09ZW8uQ09VTlRFUkNMT0NLV0lTRXx8ZS55PnRoaXMuX21pbkNvb3JkLnkmJm4ueT50aGlzLl9taW5Db29yZC55JiZyPT09ZW8uQ0xPQ0tXSVNFKSYmKGk9ITApLGkmJih0aGlzLl9taW5JbmRleD10aGlzLl9taW5JbmRleC0xKX0sUHMucHJvdG90eXBlLmdldFJpZ2h0bW9zdFNpZGVPZlNlZ21lbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpO2lmKGU8MHx8ZSsxPj1uLmxlbmd0aHx8bltlXS55PT09bltlKzFdLnkpcmV0dXJuLTE7dmFyIHI9RnMuTEVGVDtyZXR1cm4gbltlXS55PG5bZSsxXS55JiYocj1Gcy5SSUdIVCkscn0sUHMucHJvdG90eXBlLmdldEVkZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50ZWREZX0sUHMucHJvdG90eXBlLmNoZWNrRm9yUmlnaHRtb3N0Q29vcmRpbmF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPXQuZ2V0RWRnZSgpLmdldENvb3JkaW5hdGVzKCkscj0wO3I8bi5sZW5ndGgtMTtyKyspKG51bGw9PT1lLl9taW5Db29yZHx8bltyXS54PmUuX21pbkNvb3JkLngpJiYoZS5fbWluRGU9dCxlLl9taW5JbmRleD1yLGUuX21pbkNvb3JkPW5bcl0pfSxQcy5wcm90b3R5cGUuZmluZFJpZ2h0bW9zdEVkZ2VBdE5vZGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9taW5EZS5nZXROb2RlKCkuZ2V0RWRnZXMoKTt0aGlzLl9taW5EZT10LmdldFJpZ2h0bW9zdEVkZ2UoKSx0aGlzLl9taW5EZS5pc0ZvcndhcmQoKXx8KHRoaXMuX21pbkRlPXRoaXMuX21pbkRlLmdldFN5bSgpLHRoaXMuX21pbkluZGV4PXRoaXMuX21pbkRlLmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpLmxlbmd0aC0xKX0sUHMucHJvdG90eXBlLmZpbmRFZGdlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTshbi5pc0ZvcndhcmQoKXx8dGhpcy5jaGVja0ZvclJpZ2h0bW9zdENvb3JkaW5hdGUobil9WmkuaXNUcnVlKDAhPT10aGlzLl9taW5JbmRleHx8dGhpcy5fbWluQ29vcmQuZXF1YWxzKHRoaXMuX21pbkRlLmdldENvb3JkaW5hdGUoKSksImluY29uc2lzdGVuY3kgaW4gcmlnaHRtb3N0IHByb2Nlc3NpbmciKSwwPT09dGhpcy5fbWluSW5kZXg/dGhpcy5maW5kUmlnaHRtb3N0RWRnZUF0Tm9kZSgpOnRoaXMuZmluZFJpZ2h0bW9zdEVkZ2VBdFZlcnRleCgpLHRoaXMuX29yaWVudGVkRGU9dGhpcy5fbWluRGUsdGhpcy5nZXRSaWdodG1vc3RTaWRlKHRoaXMuX21pbkRlLHRoaXMuX21pbkluZGV4KT09PUZzLkxFRlQmJih0aGlzLl9vcmllbnRlZERlPXRoaXMuX21pbkRlLmdldFN5bSgpKX0sUHMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFBzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBQc307dmFyIFJzPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobixyKXt0LmNhbGwodGhpcyxlLm1zZ1dpdGhDb29yZChuLHIpKSx0aGlzLnB0PXI/bmV3IHZpKHIpOm51bGwsdGhpcy5uYW1lPSJUb3BvbG9neUV4Y2VwdGlvbiJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdH0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS5tc2dXaXRoQ29vcmQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT90OnQrIiBbICIrZSsiIF0ifSxlfShXaSksQnM9ZnVuY3Rpb24oKXt0aGlzLmFycmF5Xz1bXX07QnMucHJvdG90eXBlLmFkZExhc3Q9ZnVuY3Rpb24odCl7dGhpcy5hcnJheV8ucHVzaCh0KX0sQnMucHJvdG90eXBlLnJlbW92ZUZpcnN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlfLnNoaWZ0KCl9LEJzLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmFycmF5Xy5sZW5ndGh9O3ZhciBrcz1mdW5jdGlvbigpe3RoaXMuX2ZpbmRlcj1udWxsLHRoaXMuX2RpckVkZ2VMaXN0PW5ldyB4byx0aGlzLl9ub2Rlcz1uZXcgeG8sdGhpcy5fcmlnaHRNb3N0Q29vcmQ9bnVsbCx0aGlzLl9lbnY9bnVsbCx0aGlzLl9maW5kZXI9bmV3IFBzfTtrcy5wcm90b3R5cGUuY2xlYXJWaXNpdGVkRWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZGlyRWRnZUxpc3QuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3QubmV4dCgpLnNldFZpc2l0ZWQoITEpfX0sa3MucHJvdG90eXBlLmdldFJpZ2h0bW9zdENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmlnaHRNb3N0Q29vcmR9LGtzLnByb3RvdHlwZS5jb21wdXRlTm9kZURlcHRoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLG49dC5nZXRFZGdlcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZihyLmlzVmlzaXRlZCgpfHxyLmdldFN5bSgpLmlzVmlzaXRlZCgpKXtlPXI7YnJlYWt9fWlmKG51bGw9PT1lKXRocm93IG5ldyBScygidW5hYmxlIHRvIGZpbmQgZWRnZSB0byBjb21wdXRlIGRlcHRocyBhdCAiK3QuZ2V0Q29vcmRpbmF0ZSgpKTt0LmdldEVkZ2VzKCkuY29tcHV0ZURlcHRocyhlKTtmb3IodmFyIGk9dC5nZXRFZGdlcygpLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKTtvLnNldFZpc2l0ZWQoITApLHRoaXMuY29weVN5bURlcHRocyhvKX19LGtzLnByb3RvdHlwZS5jb21wdXRlRGVwdGg9ZnVuY3Rpb24odCl7dGhpcy5jbGVhclZpc2l0ZWRFZGdlcygpO3ZhciBlPXRoaXMuX2ZpbmRlci5nZXRFZGdlKCk7ZS5zZXRFZGdlRGVwdGhzKEZzLlJJR0hULHQpLHRoaXMuY29weVN5bURlcHRocyhlKSx0aGlzLmNvbXB1dGVEZXB0aHMoZSl9LGtzLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24odCl7dGhpcy5hZGRSZWFjaGFibGUodCksdGhpcy5fZmluZGVyLmZpbmRFZGdlKHRoaXMuX2RpckVkZ2VMaXN0KSx0aGlzLl9yaWdodE1vc3RDb29yZD10aGlzLl9maW5kZXIuZ2V0Q29vcmRpbmF0ZSgpfSxrcy5wcm90b3R5cGUuZmluZFJlc3VsdEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2RpckVkZ2VMaXN0Lml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKTtlLmdldERlcHRoKEZzLlJJR0hUKT49MSYmZS5nZXREZXB0aChGcy5MRUZUKTw9MCYmIWUuaXNJbnRlcmlvckFyZWFFZGdlKCkmJmUuc2V0SW5SZXN1bHQoITApfX0sa3MucHJvdG90eXBlLmNvbXB1dGVEZXB0aHM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IEZvLG49bmV3IEJzLHI9dC5nZXROb2RlKCk7Zm9yKG4uYWRkTGFzdChyKSxlLmFkZChyKSx0LnNldFZpc2l0ZWQoITApOyFuLmlzRW1wdHkoKTspe3ZhciBpPW4ucmVtb3ZlRmlyc3QoKTtlLmFkZChpKSx0aGlzLmNvbXB1dGVOb2RlRGVwdGgoaSk7Zm9yKHZhciBvPWkuZ2V0RWRnZXMoKS5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCkuZ2V0U3ltKCk7aWYoIXMuaXNWaXNpdGVkKCkpe3ZhciBhPXMuZ2V0Tm9kZSgpO2UuY29udGFpbnMoYSl8fChuLmFkZExhc3QoYSksZS5hZGQoYSkpfX19fSxrcy5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX3JpZ2h0TW9zdENvb3JkLng8ZS5fcmlnaHRNb3N0Q29vcmQueD8tMTp0aGlzLl9yaWdodE1vc3RDb29yZC54PmUuX3JpZ2h0TW9zdENvb3JkLng/MTowfSxrcy5wcm90b3R5cGUuZ2V0RW52ZWxvcGU9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fZW52KXtmb3IodmFyIHQ9bmV3IGppLGU9dGhpcy5fZGlyRWRnZUxpc3QuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspZm9yKHZhciBuPWUubmV4dCgpLmdldEVkZ2UoKS5nZXRDb29yZGluYXRlcygpLHI9MDtyPG4ubGVuZ3RoLTE7cisrKXQuZXhwYW5kVG9JbmNsdWRlKG5bcl0pO3RoaXMuX2Vudj10fXJldHVybiB0aGlzLl9lbnZ9LGtzLnByb3RvdHlwZS5hZGRSZWFjaGFibGU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IExzO2ZvcihlLmFkZCh0KTshZS5lbXB0eSgpOyl7dmFyIG49ZS5wb3AoKTt0aGlzLmFkZChuLGUpfX0sa3MucHJvdG90eXBlLmNvcHlTeW1EZXB0aHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRTeW0oKTtlLnNldERlcHRoKEZzLkxFRlQsdC5nZXREZXB0aChGcy5SSUdIVCkpLGUuc2V0RGVwdGgoRnMuUklHSFQsdC5nZXREZXB0aChGcy5MRUZUKSl9LGtzLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXt0LnNldFZpc2l0ZWQoITApLHRoaXMuX25vZGVzLmFkZCh0KTtmb3IodmFyIG49dC5nZXRFZGdlcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTt0aGlzLl9kaXJFZGdlTGlzdC5hZGQocik7dmFyIGk9ci5nZXRTeW0oKS5nZXROb2RlKCk7aS5pc1Zpc2l0ZWQoKXx8ZS5wdXNoKGkpfX0sa3MucHJvdG90eXBlLmdldE5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzfSxrcy5wcm90b3R5cGUuZ2V0RGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXJFZGdlTGlzdH0sa3MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpXX0sa3MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGtzfTt2YXIgenM9ZnVuY3Rpb24gdCgpe2lmKHRoaXMubG9jYXRpb249bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuaW5pdChlLmxlbmd0aCl9ZWxzZSBpZihOdW1iZXIuaXNJbnRlZ2VyKGFyZ3VtZW50c1swXSkpe3ZhciBuPWFyZ3VtZW50c1swXTt0aGlzLmluaXQoMSksdGhpcy5sb2NhdGlvbltGcy5PTl09bn1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCl7dmFyIHI9YXJndW1lbnRzWzBdO2lmKHRoaXMuaW5pdChyLmxvY2F0aW9uLmxlbmd0aCksbnVsbCE9PXIpZm9yKHZhciBpPTA7aTx0aGlzLmxvY2F0aW9uLmxlbmd0aDtpKyspdGhpcy5sb2NhdGlvbltpXT1yLmxvY2F0aW9uW2ldfX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl07dGhpcy5pbml0KDMpLHRoaXMubG9jYXRpb25bRnMuT05dPW8sdGhpcy5sb2NhdGlvbltGcy5MRUZUXT1zLHRoaXMubG9jYXRpb25bRnMuUklHSFRdPWF9fTt6cy5wcm90b3R5cGUuc2V0QWxsTG9jYXRpb25zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5sb2NhdGlvbi5sZW5ndGg7ZSsrKXRoaXMubG9jYXRpb25bZV09dH0senMucHJvdG90eXBlLmlzTnVsbD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5sb2NhdGlvbi5sZW5ndGg7dCsrKWlmKHRoaXMubG9jYXRpb25bdF0hPT1iaS5OT05FKXJldHVybiExO3JldHVybiEwfSx6cy5wcm90b3R5cGUuc2V0QWxsTG9jYXRpb25zSWZOdWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5sb2NhdGlvbi5sZW5ndGg7ZSsrKXRoaXMubG9jYXRpb25bZV09PT1iaS5OT05FJiYodGhpcy5sb2NhdGlvbltlXT10KX0senMucHJvdG90eXBlLmlzTGluZT1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5sb2NhdGlvbi5sZW5ndGh9LHpzLnByb3RvdHlwZS5tZXJnZT1mdW5jdGlvbih0KXtpZih0LmxvY2F0aW9uLmxlbmd0aD50aGlzLmxvY2F0aW9uLmxlbmd0aCl7dmFyIGU9bmV3IEFycmF5KDMpLmZpbGwobnVsbCk7ZVtGcy5PTl09dGhpcy5sb2NhdGlvbltGcy5PTl0sZVtGcy5MRUZUXT1iaS5OT05FLGVbRnMuUklHSFRdPWJpLk5PTkUsdGhpcy5sb2NhdGlvbj1lfWZvcih2YXIgbj0wO248dGhpcy5sb2NhdGlvbi5sZW5ndGg7bisrKXRoaXMubG9jYXRpb25bbl09PT1iaS5OT05FJiZuPHQubG9jYXRpb24ubGVuZ3RoJiYodGhpcy5sb2NhdGlvbltuXT10LmxvY2F0aW9uW25dKX0senMucHJvdG90eXBlLmdldExvY2F0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2F0aW9ufSx6cy5wcm90b3R5cGUuZmxpcD1mdW5jdGlvbigpe2lmKHRoaXMubG9jYXRpb24ubGVuZ3RoPD0xKXJldHVybiBudWxsO3ZhciB0PXRoaXMubG9jYXRpb25bRnMuTEVGVF07dGhpcy5sb2NhdGlvbltGcy5MRUZUXT10aGlzLmxvY2F0aW9uW0ZzLlJJR0hUXSx0aGlzLmxvY2F0aW9uW0ZzLlJJR0hUXT10fSx6cy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQWk7cmV0dXJuIHRoaXMubG9jYXRpb24ubGVuZ3RoPjEmJnQuYXBwZW5kKGJpLnRvTG9jYXRpb25TeW1ib2wodGhpcy5sb2NhdGlvbltGcy5MRUZUXSkpLHQuYXBwZW5kKGJpLnRvTG9jYXRpb25TeW1ib2wodGhpcy5sb2NhdGlvbltGcy5PTl0pKSx0aGlzLmxvY2F0aW9uLmxlbmd0aD4xJiZ0LmFwcGVuZChiaS50b0xvY2F0aW9uU3ltYm9sKHRoaXMubG9jYXRpb25bRnMuUklHSFRdKSksdC50b1N0cmluZygpfSx6cy5wcm90b3R5cGUuc2V0TG9jYXRpb25zPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLmxvY2F0aW9uW0ZzLk9OXT10LHRoaXMubG9jYXRpb25bRnMuTEVGVF09ZSx0aGlzLmxvY2F0aW9uW0ZzLlJJR0hUXT1ufSx6cy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0PHRoaXMubG9jYXRpb24ubGVuZ3RoP3RoaXMubG9jYXRpb25bdF06YmkuTk9ORX0senMucHJvdG90eXBlLmlzQXJlYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2F0aW9uLmxlbmd0aD4xfSx6cy5wcm90b3R5cGUuaXNBbnlOdWxsPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLmxvY2F0aW9uLmxlbmd0aDt0KyspaWYodGhpcy5sb2NhdGlvblt0XT09PWJpLk5PTkUpcmV0dXJuITA7cmV0dXJuITF9LHpzLnByb3RvdHlwZS5zZXRMb2NhdGlvbj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRMb2NhdGlvbihGcy5PTix0KX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5sb2NhdGlvbltlXT1ufX0senMucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCl7dGhpcy5sb2NhdGlvbj1uZXcgQXJyYXkodCkuZmlsbChudWxsKSx0aGlzLnNldEFsbExvY2F0aW9ucyhiaS5OT05FKX0senMucHJvdG90eXBlLmlzRXF1YWxPblNpZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5sb2NhdGlvbltlXT09PXQubG9jYXRpb25bZV19LHpzLnByb3RvdHlwZS5hbGxQb3NpdGlvbnNFcXVhbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMubG9jYXRpb24ubGVuZ3RoO2UrKylpZih0aGlzLmxvY2F0aW9uW2VdIT09dClyZXR1cm4hMTtyZXR1cm4hMH0senMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHpzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB6c307dmFyIGpzPWZ1bmN0aW9uIHQoKXtpZih0aGlzLmVsdD1uZXcgQXJyYXkoMikuZmlsbChudWxsKSwxPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMF0pKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5lbHRbMF09bmV3IHpzKGUpLHRoaXMuZWx0WzFdPW5ldyB6cyhlKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdCl7dmFyIG49YXJndW1lbnRzWzBdO3RoaXMuZWx0WzBdPW5ldyB6cyhuLmVsdFswXSksdGhpcy5lbHRbMV09bmV3IHpzKG4uZWx0WzFdKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3RoaXMuZWx0WzBdPW5ldyB6cyhiaS5OT05FKSx0aGlzLmVsdFsxXT1uZXcgenMoYmkuTk9ORSksdGhpcy5lbHRbcl0uc2V0TG9jYXRpb24oaSl9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdLGE9YXJndW1lbnRzWzJdO3RoaXMuZWx0WzBdPW5ldyB6cyhvLHMsYSksdGhpcy5lbHRbMV09bmV3IHpzKG8scyxhKX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdT1hcmd1bWVudHNbMF0sYz1hcmd1bWVudHNbMV0sbD1hcmd1bWVudHNbMl0saD1hcmd1bWVudHNbM107dGhpcy5lbHRbMF09bmV3IHpzKGJpLk5PTkUsYmkuTk9ORSxiaS5OT05FKSx0aGlzLmVsdFsxXT1uZXcgenMoYmkuTk9ORSxiaS5OT05FLGJpLk5PTkUpLHRoaXMuZWx0W3VdLnNldExvY2F0aW9ucyhjLGwsaCl9fTtqcy5wcm90b3R5cGUuZ2V0R2VvbWV0cnlDb3VudD1mdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWx0WzBdLmlzTnVsbCgpfHx0KyssdGhpcy5lbHRbMV0uaXNOdWxsKCl8fHQrKyx0fSxqcy5wcm90b3R5cGUuc2V0QWxsTG9jYXRpb25zPWZ1bmN0aW9uKHQsZSl7dGhpcy5lbHRbdF0uc2V0QWxsTG9jYXRpb25zKGUpfSxqcy5wcm90b3R5cGUuaXNOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVsdFt0XS5pc051bGwoKX0sanMucHJvdG90eXBlLnNldEFsbExvY2F0aW9uc0lmTnVsbD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRBbGxMb2NhdGlvbnNJZk51bGwoMCx0KSx0aGlzLnNldEFsbExvY2F0aW9uc0lmTnVsbCgxLHQpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0aGlzLmVsdFtlXS5zZXRBbGxMb2NhdGlvbnNJZk51bGwobil9fSxqcy5wcm90b3R5cGUuaXNMaW5lPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVsdFt0XS5pc0xpbmUoKX0sanMucHJvdG90eXBlLm1lcmdlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49MDtuPDI7bisrKW51bGw9PT1lLmVsdFtuXSYmbnVsbCE9PXQuZWx0W25dP2UuZWx0W25dPW5ldyB6cyh0LmVsdFtuXSk6ZS5lbHRbbl0ubWVyZ2UodC5lbHRbbl0pfSxqcy5wcm90b3R5cGUuZmxpcD1mdW5jdGlvbigpe3RoaXMuZWx0WzBdLmZsaXAoKSx0aGlzLmVsdFsxXS5mbGlwKCl9LGpzLnByb3RvdHlwZS5nZXRMb2NhdGlvbj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuZWx0W3RdLmdldChGcy5PTil9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5lbHRbZV0uZ2V0KG4pfX0sanMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFpO3JldHVybiBudWxsIT09dGhpcy5lbHRbMF0mJih0LmFwcGVuZCgiQToiKSx0LmFwcGVuZCh0aGlzLmVsdFswXS50b1N0cmluZygpKSksbnVsbCE9PXRoaXMuZWx0WzFdJiYodC5hcHBlbmQoIiBCOiIpLHQuYXBwZW5kKHRoaXMuZWx0WzFdLnRvU3RyaW5nKCkpKSx0LnRvU3RyaW5nKCl9LGpzLnByb3RvdHlwZS5pc0FyZWE9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5lbHRbMF0uaXNBcmVhKCl8fHRoaXMuZWx0WzFdLmlzQXJlYSgpO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuZWx0W3RdLmlzQXJlYSgpfX0sanMucHJvdG90eXBlLmlzQW55TnVsbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lbHRbdF0uaXNBbnlOdWxsKCl9LGpzLnByb3RvdHlwZS5zZXRMb2NhdGlvbj1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5lbHRbdF0uc2V0TG9jYXRpb24oRnMuT04sZSl9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdO3RoaXMuZWx0W25dLnNldExvY2F0aW9uKHIsaSl9fSxqcy5wcm90b3R5cGUuaXNFcXVhbE9uU2lkZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVsdFswXS5pc0VxdWFsT25TaWRlKHQuZWx0WzBdLGUpJiZ0aGlzLmVsdFsxXS5pc0VxdWFsT25TaWRlKHQuZWx0WzFdLGUpfSxqcy5wcm90b3R5cGUuYWxsUG9zaXRpb25zRXF1YWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lbHRbdF0uYWxsUG9zaXRpb25zRXF1YWwoZSl9LGpzLnByb3RvdHlwZS50b0xpbmU9ZnVuY3Rpb24odCl7dGhpcy5lbHRbdF0uaXNBcmVhKCkmJih0aGlzLmVsdFt0XT1uZXcgenModGhpcy5lbHRbdF0ubG9jYXRpb25bMF0pKX0sanMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGpzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBqc30sanMudG9MaW5lTGFiZWw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBqcyhiaS5OT05FKSxuPTA7bjwyO24rKyllLnNldExvY2F0aW9uKG4sdC5nZXRMb2NhdGlvbihuKSk7cmV0dXJuIGV9O3ZhciBVcz1mdW5jdGlvbigpe3RoaXMuX3N0YXJ0RGU9bnVsbCx0aGlzLl9tYXhOb2RlRGVncmVlPS0xLHRoaXMuX2VkZ2VzPW5ldyB4byx0aGlzLl9wdHM9bmV3IHhvLHRoaXMuX2xhYmVsPW5ldyBqcyhiaS5OT05FKSx0aGlzLl9yaW5nPW51bGwsdGhpcy5faXNIb2xlPW51bGwsdGhpcy5fc2hlbGw9bnVsbCx0aGlzLl9ob2xlcz1uZXcgeG8sdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2dlb21ldHJ5RmFjdG9yeT1lLHRoaXMuY29tcHV0ZVBvaW50cyh0KSx0aGlzLmNvbXB1dGVSaW5nKCl9O1VzLnByb3RvdHlwZS5jb21wdXRlUmluZz1mdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLl9yaW5nKXJldHVybiBudWxsO2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fcHRzLnNpemUoKSkuZmlsbChudWxsKSxlPTA7ZTx0aGlzLl9wdHMuc2l6ZSgpO2UrKyl0W2VdPXRoaXMuX3B0cy5nZXQoZSk7dGhpcy5fcmluZz10aGlzLl9nZW9tZXRyeUZhY3RvcnkuY3JlYXRlTGluZWFyUmluZyh0KSx0aGlzLl9pc0hvbGU9ZW8uaXNDQ1codGhpcy5fcmluZy5nZXRDb29yZGluYXRlcygpKX0sVXMucHJvdG90eXBlLmlzSXNvbGF0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gMT09PXRoaXMuX2xhYmVsLmdldEdlb21ldHJ5Q291bnQoKX0sVXMucHJvdG90eXBlLmNvbXB1dGVQb2ludHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9zdGFydERlPXQ7dmFyIG49dCxyPSEwO2Rve2lmKG51bGw9PT1uKXRocm93IG5ldyBScygiRm91bmQgbnVsbCBEaXJlY3RlZEVkZ2UiKTtpZihuLmdldEVkZ2VSaW5nKCk9PT1lKXRocm93IG5ldyBScygiRGlyZWN0ZWQgRWRnZSB2aXNpdGVkIHR3aWNlIGR1cmluZyByaW5nLWJ1aWxkaW5nIGF0ICIrbi5nZXRDb29yZGluYXRlKCkpO2UuX2VkZ2VzLmFkZChuKTt2YXIgaT1uLmdldExhYmVsKCk7WmkuaXNUcnVlKGkuaXNBcmVhKCkpLGUubWVyZ2VMYWJlbChpKSxlLmFkZFBvaW50cyhuLmdldEVkZ2UoKSxuLmlzRm9yd2FyZCgpLHIpLHI9ITEsZS5zZXRFZGdlUmluZyhuLGUpLG49ZS5nZXROZXh0KG4pfXdoaWxlKG4hPT10aGlzLl9zdGFydERlKX0sVXMucHJvdG90eXBlLmdldExpbmVhclJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmluZ30sVXMucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B0cy5nZXQodCl9LFVzLnByb3RvdHlwZS5jb21wdXRlTWF4Tm9kZURlZ3JlZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fbWF4Tm9kZURlZ3JlZT0wO3ZhciBlPXRoaXMuX3N0YXJ0RGU7ZG97dmFyIG49ZS5nZXROb2RlKCkuZ2V0RWRnZXMoKS5nZXRPdXRnb2luZ0RlZ3JlZSh0KTtuPnQuX21heE5vZGVEZWdyZWUmJih0Ll9tYXhOb2RlRGVncmVlPW4pLGU9dC5nZXROZXh0KGUpfXdoaWxlKGUhPT10aGlzLl9zdGFydERlKTt0aGlzLl9tYXhOb2RlRGVncmVlKj0yfSxVcy5wcm90b3R5cGUuYWRkUG9pbnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmdldENvb3JkaW5hdGVzKCk7aWYoZSl7dmFyIGk9MTtuJiYoaT0wKTtmb3IodmFyIG89aTtvPHIubGVuZ3RoO28rKyl0aGlzLl9wdHMuYWRkKHJbb10pfWVsc2V7dmFyIHM9ci5sZW5ndGgtMjtuJiYocz1yLmxlbmd0aC0xKTtmb3IodmFyIGE9czthPj0wO2EtLSl0aGlzLl9wdHMuYWRkKHJbYV0pfX0sVXMucHJvdG90eXBlLmlzSG9sZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0hvbGV9LFVzLnByb3RvdHlwZS5zZXRJblJlc3VsdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3N0YXJ0RGU7ZG97dC5nZXRFZGdlKCkuc2V0SW5SZXN1bHQoITApLHQ9dC5nZXROZXh0KCl9d2hpbGUodCE9PXRoaXMuX3N0YXJ0RGUpfSxVcy5wcm90b3R5cGUuY29udGFpbnNQb2ludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldExpbmVhclJpbmcoKTtpZighZS5nZXRFbnZlbG9wZUludGVybmFsKCkuY29udGFpbnModCl8fCFlby5pc1BvaW50SW5SaW5nKHQsZS5nZXRDb29yZGluYXRlcygpKSlyZXR1cm4hMTtmb3IodmFyIG49dGhpcy5faG9sZXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe2lmKG4ubmV4dCgpLmNvbnRhaW5zUG9pbnQodCkpcmV0dXJuITF9cmV0dXJuITB9LFVzLnByb3RvdHlwZS5hZGRIb2xlPWZ1bmN0aW9uKHQpe3RoaXMuX2hvbGVzLmFkZCh0KX0sVXMucHJvdG90eXBlLmlzU2hlbGw9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuX3NoZWxsfSxVcy5wcm90b3R5cGUuZ2V0TGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFiZWx9LFVzLnByb3RvdHlwZS5nZXRFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlc30sVXMucHJvdG90eXBlLmdldE1heE5vZGVEZWdyZWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4Tm9kZURlZ3JlZTwwJiZ0aGlzLmNvbXB1dGVNYXhOb2RlRGVncmVlKCksdGhpcy5fbWF4Tm9kZURlZ3JlZX0sVXMucHJvdG90eXBlLmdldFNoZWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoZWxsfSxVcy5wcm90b3R5cGUubWVyZ2VMYWJlbD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5tZXJnZUxhYmVsKHQsMCksdGhpcy5tZXJnZUxhYmVsKHQsMSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzBdLmdldExvY2F0aW9uKGUsRnMuUklHSFQpO2lmKG49PT1iaS5OT05FKXJldHVybiBudWxsO2lmKHRoaXMuX2xhYmVsLmdldExvY2F0aW9uKGUpPT09YmkuTk9ORSlyZXR1cm4gdGhpcy5fbGFiZWwuc2V0TG9jYXRpb24oZSxuKSxudWxsfX0sVXMucHJvdG90eXBlLnNldFNoZWxsPWZ1bmN0aW9uKHQpe3RoaXMuX3NoZWxsPXQsbnVsbCE9PXQmJnQuYWRkSG9sZSh0aGlzKX0sVXMucHJvdG90eXBlLnRvUG9seWdvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHRoaXMuX2hvbGVzLnNpemUoKSkuZmlsbChudWxsKSxuPTA7bjx0aGlzLl9ob2xlcy5zaXplKCk7bisrKWVbbl09dGhpcy5faG9sZXMuZ2V0KG4pLmdldExpbmVhclJpbmcoKTtyZXR1cm4gdC5jcmVhdGVQb2x5Z29uKHRoaXMuZ2V0TGluZWFyUmluZygpLGUpfSxVcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sVXMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFVzfTt2YXIgcXM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0LmNhbGwodGhpcyxlLG4pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5zZXRFZGdlUmluZz1mdW5jdGlvbih0LGUpe3Quc2V0TWluRWRnZVJpbmcoZSl9LGUucHJvdG90eXBlLmdldE5leHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TmV4dE1pbigpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShVcyksVnM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTt0LmNhbGwodGhpcyxlLG4pfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5idWlsZE1pbmltYWxSaW5ncz1mdW5jdGlvbigpe3ZhciB0PW5ldyB4byxlPXRoaXMuX3N0YXJ0RGU7ZG97aWYobnVsbD09PWUuZ2V0TWluRWRnZVJpbmcoKSl7dmFyIG49bmV3IHFzKGUsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5KTt0LmFkZChuKX1lPWUuZ2V0TmV4dCgpfXdoaWxlKGUhPT10aGlzLl9zdGFydERlKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuc2V0RWRnZVJpbmc9ZnVuY3Rpb24odCxlKXt0LnNldEVkZ2VSaW5nKGUpfSxlLnByb3RvdHlwZS5saW5rRGlyZWN0ZWRFZGdlc0Zvck1pbmltYWxFZGdlUmluZ3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdGFydERlO2Rve3QuZ2V0Tm9kZSgpLmdldEVkZ2VzKCkubGlua01pbmltYWxEaXJlY3RlZEVkZ2VzKHRoaXMpLHQ9dC5nZXROZXh0KCl9d2hpbGUodCE9PXRoaXMuX3N0YXJ0RGUpfSxlLnByb3RvdHlwZS5nZXROZXh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE5leHQoKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oVXMpLEdzPWZ1bmN0aW9uKCl7aWYodGhpcy5fbGFiZWw9bnVsbCx0aGlzLl9pc0luUmVzdWx0PSExLHRoaXMuX2lzQ292ZXJlZD0hMSx0aGlzLl9pc0NvdmVyZWRTZXQ9ITEsdGhpcy5faXNWaXNpdGVkPSExLDAhPT1hcmd1bWVudHMubGVuZ3RoJiYxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xhYmVsPXR9fTtHcy5wcm90b3R5cGUuc2V0VmlzaXRlZD1mdW5jdGlvbih0KXt0aGlzLl9pc1Zpc2l0ZWQ9dH0sR3MucHJvdG90eXBlLnNldEluUmVzdWx0PWZ1bmN0aW9uKHQpe3RoaXMuX2lzSW5SZXN1bHQ9dH0sR3MucHJvdG90eXBlLmlzQ292ZXJlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0NvdmVyZWR9LEdzLnByb3RvdHlwZS5pc0NvdmVyZWRTZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNDb3ZlcmVkU2V0fSxHcy5wcm90b3R5cGUuc2V0TGFiZWw9ZnVuY3Rpb24odCl7dGhpcy5fbGFiZWw9dH0sR3MucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfSxHcy5wcm90b3R5cGUuc2V0Q292ZXJlZD1mdW5jdGlvbih0KXt0aGlzLl9pc0NvdmVyZWQ9dCx0aGlzLl9pc0NvdmVyZWRTZXQ9ITB9LEdzLnByb3RvdHlwZS51cGRhdGVJTT1mdW5jdGlvbih0KXtaaS5pc1RydWUodGhpcy5fbGFiZWwuZ2V0R2VvbWV0cnlDb3VudCgpPj0yLCJmb3VuZCBwYXJ0aWFsIGxhYmVsIiksdGhpcy5jb21wdXRlSU0odCl9LEdzLnByb3RvdHlwZS5pc0luUmVzdWx0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSW5SZXN1bHR9LEdzLnByb3RvdHlwZS5pc1Zpc2l0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWaXNpdGVkfSxHcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sR3MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEdzfTt2YXIgWXM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuY2FsbCh0aGlzKSx0aGlzLl9jb29yZD1udWxsLHRoaXMuX2VkZ2VzPW51bGw7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuX2Nvb3JkPWUsdGhpcy5fZWRnZXM9bix0aGlzLl9sYWJlbD1uZXcganMoMCxiaS5OT05FKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaXNJbmNpZGVudEVkZ2VJblJlc3VsdD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmdldEVkZ2VzKCkuZ2V0RWRnZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7aWYodC5uZXh0KCkuZ2V0RWRnZSgpLmlzSW5SZXN1bHQoKSlyZXR1cm4hMH1yZXR1cm4hMX0sZS5wcm90b3R5cGUuaXNJc29sYXRlZD1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5fbGFiZWwuZ2V0R2VvbWV0cnlDb3VudCgpfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Nvb3JkfSxlLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50bG4oIm5vZGUgIit0aGlzLl9jb29yZCsiIGxibDogIit0aGlzLl9sYWJlbCl9LGUucHJvdG90eXBlLmNvbXB1dGVJTT1mdW5jdGlvbih0KXt9LGUucHJvdG90eXBlLmNvbXB1dGVNZXJnZWRMb2NhdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPWJpLk5PTkU7aWYobj10aGlzLl9sYWJlbC5nZXRMb2NhdGlvbihlKSwhdC5pc051bGwoZSkpe3ZhciByPXQuZ2V0TG9jYXRpb24oZSk7biE9PWJpLkJPVU5EQVJZJiYobj1yKX1yZXR1cm4gbn0sZS5wcm90b3R5cGUuc2V0TGFiZWw9ZnVuY3Rpb24oKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdC5wcm90b3R5cGUuc2V0TGFiZWwuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtudWxsPT09dGhpcy5fbGFiZWw/dGhpcy5fbGFiZWw9bmV3IGpzKGUsbik6dGhpcy5fbGFiZWwuc2V0TG9jYXRpb24oZSxuKX0sZS5wcm90b3R5cGUuZ2V0RWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZXN9LGUucHJvdG90eXBlLm1lcmdlTGFiZWw9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgZSl7dmFyIG49YXJndW1lbnRzWzBdO3RoaXMubWVyZ2VMYWJlbChuLl9sYWJlbCl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGpzKWZvcih2YXIgcj1hcmd1bWVudHNbMF0saT0wO2k8MjtpKyspe3ZhciBvPXQuY29tcHV0ZU1lcmdlZExvY2F0aW9uKHIsaSk7dC5fbGFiZWwuZ2V0TG9jYXRpb24oaSk9PT1iaS5OT05FJiZ0Ll9sYWJlbC5zZXRMb2NhdGlvbihpLG8pfX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3RoaXMuX2VkZ2VzLmluc2VydCh0KSx0LnNldE5vZGUodGhpcyl9LGUucHJvdG90eXBlLnNldExhYmVsQm91bmRhcnk9ZnVuY3Rpb24odCl7aWYobnVsbD09PXRoaXMuX2xhYmVsKXJldHVybiBudWxsO3ZhciBlPWJpLk5PTkU7bnVsbCE9PXRoaXMuX2xhYmVsJiYoZT10aGlzLl9sYWJlbC5nZXRMb2NhdGlvbih0KSk7dmFyIG49bnVsbDtpZihlPT09YmkuQk9VTkRBUlkpbj1iaS5JTlRFUklPUjtlbHNlIG49YmkuQk9VTkRBUlk7dGhpcy5fbGFiZWwuc2V0TG9jYXRpb24odCxuKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oR3MpLFhzPWZ1bmN0aW9uKCl7dGhpcy5ub2RlTWFwPW5ldyBrbyx0aGlzLm5vZGVGYWN0PW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMubm9kZUZhY3Q9dH07WHMucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubm9kZU1hcC5nZXQodCl9LFhzLnByb3RvdHlwZS5hZGROb2RlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dGhpcy5ub2RlTWFwLmdldCh0KTtyZXR1cm4gbnVsbD09PWUmJihlPXRoaXMubm9kZUZhY3QuY3JlYXRlTm9kZSh0KSx0aGlzLm5vZGVNYXAucHV0KHQsZSkpLGV9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBZcyl7dmFyIG49YXJndW1lbnRzWzBdLHI9dGhpcy5ub2RlTWFwLmdldChuLmdldENvb3JkaW5hdGUoKSk7cmV0dXJuIG51bGw9PT1yPyh0aGlzLm5vZGVNYXAucHV0KG4uZ2V0Q29vcmRpbmF0ZSgpLG4pLG4pOihyLm1lcmdlTGFiZWwobikscil9fSxYcy5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLnByaW50KHQpfX0sWHMucHJvdG90eXBlLml0ZXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpfSxYcy5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZU1hcC52YWx1ZXMoKX0sWHMucHJvdG90eXBlLmdldEJvdW5kYXJ5Tm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPXRoaXMuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO3IuZ2V0TGFiZWwoKS5nZXRMb2NhdGlvbih0KT09PWJpLkJPVU5EQVJZJiZlLmFkZChyKX1yZXR1cm4gZX0sWHMucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt2YXIgZT10LmdldENvb3JkaW5hdGUoKTt0aGlzLmFkZE5vZGUoZSkuYWRkKHQpfSxYcy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWHMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFhzfTt2YXIgV3M9ZnVuY3Rpb24oKXt9LEhzPXtORTp7Y29uZmlndXJhYmxlOiEwfSxOVzp7Y29uZmlndXJhYmxlOiEwfSxTVzp7Y29uZmlndXJhYmxlOiEwfSxTRTp7Y29uZmlndXJhYmxlOiEwfX07V3MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LFdzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBXc30sV3MuaXNOb3J0aGVybj1mdW5jdGlvbih0KXtyZXR1cm4gdD09PVdzLk5FfHx0PT09V3MuTld9LFdzLmlzT3Bwb3NpdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCE9PWUmJjI9PT0odC1lKzQpJTR9LFdzLmNvbW1vbkhhbGZQbGFuZT1mdW5jdGlvbih0LGUpe2lmKHQ9PT1lKXJldHVybiB0O2lmKDI9PT0odC1lKzQpJTQpcmV0dXJuLTE7dmFyIG49dDxlP3Q6ZTtyZXR1cm4gMD09PW4mJjM9PT0odD5lP3Q6ZSk/MzpufSxXcy5pc0luSGFsZlBsYW5lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9PT1Xcy5TRT90PT09V3MuU0V8fHQ9PT1Xcy5TVzp0PT09ZXx8dD09PWUrMX0sV3MucXVhZHJhbnQ9ZnVuY3Rpb24oKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1swXSYmIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtpZigwPT09dCYmMD09PWUpdGhyb3cgbmV3IGhpO3JldHVybiB0Pj0wP2U+PTA/V3MuTkU6V3MuU0U6ZT49MD9Xcy5OVzpXcy5TV31pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07aWYoci54PT09bi54JiZyLnk9PT1uLnkpdGhyb3cgbmV3IGhpO3JldHVybiByLng+PW4ueD9yLnk+PW4ueT9Xcy5ORTpXcy5TRTpyLnk+PW4ueT9Xcy5OVzpXcy5TV319LEhzLk5FLmdldD1mdW5jdGlvbigpe3JldHVybiAwfSxIcy5OVy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sSHMuU1cuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LEhzLlNFLmdldD1mdW5jdGlvbigpe3JldHVybiAzfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhXcyxIcyk7dmFyIFpzPWZ1bmN0aW9uKCl7aWYodGhpcy5fZWRnZT1udWxsLHRoaXMuX2xhYmVsPW51bGwsdGhpcy5fbm9kZT1udWxsLHRoaXMuX3AwPW51bGwsdGhpcy5fcDE9bnVsbCx0aGlzLl9keD1udWxsLHRoaXMuX2R5PW51bGwsdGhpcy5fcXVhZHJhbnQ9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2VkZ2U9dH1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5fZWRnZT1lLHRoaXMuaW5pdChuLHIpLHRoaXMuX2xhYmVsPW51bGx9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzNdO3RoaXMuX2VkZ2U9aSx0aGlzLmluaXQobyxzKSx0aGlzLl9sYWJlbD1hfX07WnMucHJvdG90eXBlLmNvbXBhcmVEaXJlY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2R4PT09dC5fZHgmJnRoaXMuX2R5PT09dC5fZHk/MDp0aGlzLl9xdWFkcmFudD50Ll9xdWFkcmFudD8xOnRoaXMuX3F1YWRyYW50PHQuX3F1YWRyYW50Py0xOmVvLmNvbXB1dGVPcmllbnRhdGlvbih0Ll9wMCx0Ll9wMSx0aGlzLl9wMSl9LFpzLnByb3RvdHlwZS5nZXREeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9keX0sWnMucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcDB9LFpzLnByb3RvdHlwZS5zZXROb2RlPWZ1bmN0aW9uKHQpe3RoaXMuX25vZGU9dH0sWnMucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguYXRhbjIodGhpcy5fZHksdGhpcy5fZHgpLG49dGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSxyPW4ubGFzdEluZGV4T2YoIi4iKSxpPW4uc3Vic3RyaW5nKHIrMSk7dC5wcmludCgiICAiK2krIjogIit0aGlzLl9wMCsiIC0gIit0aGlzLl9wMSsiICIrdGhpcy5fcXVhZHJhbnQrIjoiK2UrIiAgICIrdGhpcy5fbGFiZWwpfSxacy5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuY29tcGFyZURpcmVjdGlvbihlKX0sWnMucHJvdG90eXBlLmdldERpcmVjdGVkQ29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wMX0sWnMucHJvdG90eXBlLmdldER4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2R4fSxacy5wcm90b3R5cGUuZ2V0TGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFiZWx9LFpzLnByb3RvdHlwZS5nZXRFZGdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2V9LFpzLnByb3RvdHlwZS5nZXRRdWFkcmFudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9xdWFkcmFudH0sWnMucHJvdG90eXBlLmdldE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZX0sWnMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9TWF0aC5hdGFuMih0aGlzLl9keSx0aGlzLl9keCksZT10aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLG49ZS5sYXN0SW5kZXhPZigiLiIpO3JldHVybiIgICIrZS5zdWJzdHJpbmcobisxKSsiOiAiK3RoaXMuX3AwKyIgLSAiK3RoaXMuX3AxKyIgIit0aGlzLl9xdWFkcmFudCsiOiIrdCsiICAgIit0aGlzLl9sYWJlbH0sWnMucHJvdG90eXBlLmNvbXB1dGVMYWJlbD1mdW5jdGlvbih0KXt9LFpzLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSl7dGhpcy5fcDA9dCx0aGlzLl9wMT1lLHRoaXMuX2R4PWUueC10LngsdGhpcy5fZHk9ZS55LXQueSx0aGlzLl9xdWFkcmFudD1Xcy5xdWFkcmFudCh0aGlzLl9keCx0aGlzLl9keSksWmkuaXNUcnVlKCEoMD09PXRoaXMuX2R4JiYwPT09dGhpcy5fZHkpLCJFZGdlRW5kIHdpdGggaWRlbnRpY2FsIGVuZHBvaW50cyBmb3VuZCIpfSxacy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSxacy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWnN9O3ZhciBLcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKHQuY2FsbCh0aGlzLGUpLHRoaXMuX2lzRm9yd2FyZD1udWxsLHRoaXMuX2lzSW5SZXN1bHQ9ITEsdGhpcy5faXNWaXNpdGVkPSExLHRoaXMuX3N5bT1udWxsLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9uZXh0TWluPW51bGwsdGhpcy5fZWRnZVJpbmc9bnVsbCx0aGlzLl9taW5FZGdlUmluZz1udWxsLHRoaXMuX2RlcHRoPVswLC05OTksLTk5OV0sdGhpcy5faXNGb3J3YXJkPW4sbil0aGlzLmluaXQoZS5nZXRDb29yZGluYXRlKDApLGUuZ2V0Q29vcmRpbmF0ZSgxKSk7ZWxzZXt2YXIgcj1lLmdldE51bVBvaW50cygpLTE7dGhpcy5pbml0KGUuZ2V0Q29vcmRpbmF0ZShyKSxlLmdldENvb3JkaW5hdGUoci0xKSl9dGhpcy5jb21wdXRlRGlyZWN0ZWRMYWJlbCgpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXROZXh0TWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25leHRNaW59LGUucHJvdG90eXBlLmdldERlcHRoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kZXB0aFt0XX0sZS5wcm90b3R5cGUuc2V0VmlzaXRlZD1mdW5jdGlvbih0KXt0aGlzLl9pc1Zpc2l0ZWQ9dH0sZS5wcm90b3R5cGUuY29tcHV0ZURpcmVjdGVkTGFiZWw9ZnVuY3Rpb24oKXt0aGlzLl9sYWJlbD1uZXcganModGhpcy5fZWRnZS5nZXRMYWJlbCgpKSx0aGlzLl9pc0ZvcndhcmR8fHRoaXMuX2xhYmVsLmZsaXAoKX0sZS5wcm90b3R5cGUuZ2V0TmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9uZXh0fSxlLnByb3RvdHlwZS5zZXREZXB0aD1mdW5jdGlvbih0LGUpe2lmKC05OTkhPT10aGlzLl9kZXB0aFt0XSYmdGhpcy5fZGVwdGhbdF0hPT1lKXRocm93IG5ldyBScygiYXNzaWduZWQgZGVwdGhzIGRvIG5vdCBtYXRjaCIsdGhpcy5nZXRDb29yZGluYXRlKCkpO3RoaXMuX2RlcHRoW3RdPWV9LGUucHJvdG90eXBlLmlzSW50ZXJpb3JBcmVhRWRnZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9ITAsbj0wO248MjtuKyspdC5fbGFiZWwuaXNBcmVhKG4pJiZ0Ll9sYWJlbC5nZXRMb2NhdGlvbihuLEZzLkxFRlQpPT09YmkuSU5URVJJT1ImJnQuX2xhYmVsLmdldExvY2F0aW9uKG4sRnMuUklHSFQpPT09YmkuSU5URVJJT1J8fChlPSExKTtyZXR1cm4gZX0sZS5wcm90b3R5cGUuc2V0TmV4dE1pbj1mdW5jdGlvbih0KXt0aGlzLl9uZXh0TWluPXR9LGUucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLnByaW50LmNhbGwodGhpcyxlKSxlLnByaW50KCIgIit0aGlzLl9kZXB0aFtGcy5MRUZUXSsiLyIrdGhpcy5fZGVwdGhbRnMuUklHSFRdKSxlLnByaW50KCIgKCIrdGhpcy5nZXREZXB0aERlbHRhKCkrIikiKSx0aGlzLl9pc0luUmVzdWx0JiZlLnByaW50KCIgaW5SZXN1bHQiKX0sZS5wcm90b3R5cGUuc2V0TWluRWRnZVJpbmc9ZnVuY3Rpb24odCl7dGhpcy5fbWluRWRnZVJpbmc9dH0sZS5wcm90b3R5cGUuaXNMaW5lRWRnZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2xhYmVsLmlzTGluZSgwKXx8dGhpcy5fbGFiZWwuaXNMaW5lKDEpLGU9IXRoaXMuX2xhYmVsLmlzQXJlYSgwKXx8dGhpcy5fbGFiZWwuYWxsUG9zaXRpb25zRXF1YWwoMCxiaS5FWFRFUklPUiksbj0hdGhpcy5fbGFiZWwuaXNBcmVhKDEpfHx0aGlzLl9sYWJlbC5hbGxQb3NpdGlvbnNFcXVhbCgxLGJpLkVYVEVSSU9SKTtyZXR1cm4gdCYmZSYmbn0sZS5wcm90b3R5cGUuc2V0RWRnZVJpbmc9ZnVuY3Rpb24odCl7dGhpcy5fZWRnZVJpbmc9dH0sZS5wcm90b3R5cGUuZ2V0TWluRWRnZVJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWluRWRnZVJpbmd9LGUucHJvdG90eXBlLmdldERlcHRoRGVsdGE9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9lZGdlLmdldERlcHRoRGVsdGEoKTtyZXR1cm4gdGhpcy5faXNGb3J3YXJkfHwodD0tdCksdH0sZS5wcm90b3R5cGUuc2V0SW5SZXN1bHQ9ZnVuY3Rpb24odCl7dGhpcy5faXNJblJlc3VsdD10fSxlLnByb3RvdHlwZS5nZXRTeW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3ltfSxlLnByb3RvdHlwZS5pc0ZvcndhcmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNGb3J3YXJkfSxlLnByb3RvdHlwZS5nZXRFZGdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2V9LGUucHJvdG90eXBlLnByaW50RWRnZT1mdW5jdGlvbih0KXt0aGlzLnByaW50KHQpLHQucHJpbnQoIiAiKSx0aGlzLl9pc0ZvcndhcmQ/dGhpcy5fZWRnZS5wcmludCh0KTp0aGlzLl9lZGdlLnByaW50UmV2ZXJzZSh0KX0sZS5wcm90b3R5cGUuc2V0U3ltPWZ1bmN0aW9uKHQpe3RoaXMuX3N5bT10fSxlLnByb3RvdHlwZS5zZXRWaXNpdGVkRWRnZT1mdW5jdGlvbih0KXt0aGlzLnNldFZpc2l0ZWQodCksdGhpcy5fc3ltLnNldFZpc2l0ZWQodCl9LGUucHJvdG90eXBlLnNldEVkZ2VEZXB0aHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmdldEVkZ2UoKS5nZXREZXB0aERlbHRhKCk7dGhpcy5faXNGb3J3YXJkfHwobj0tbik7dmFyIHI9MTt0PT09RnMuTEVGVCYmKHI9LTEpO3ZhciBpPUZzLm9wcG9zaXRlKHQpLG89ZStuKnI7dGhpcy5zZXREZXB0aCh0LGUpLHRoaXMuc2V0RGVwdGgoaSxvKX0sZS5wcm90b3R5cGUuZ2V0RWRnZVJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZVJpbmd9LGUucHJvdG90eXBlLmlzSW5SZXN1bHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNJblJlc3VsdH0sZS5wcm90b3R5cGUuc2V0TmV4dD1mdW5jdGlvbih0KXt0aGlzLl9uZXh0PXR9LGUucHJvdG90eXBlLmlzVmlzaXRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1Zpc2l0ZWR9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGUuZGVwdGhGYWN0b3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWJpLkVYVEVSSU9SJiZlPT09YmkuSU5URVJJT1I/MTp0PT09YmkuSU5URVJJT1ImJmU9PT1iaS5FWFRFUklPUj8tMTowfSxlfShacyksSnM9ZnVuY3Rpb24oKXt9O0pzLnByb3RvdHlwZS5jcmVhdGVOb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWXModCxudWxsKX0sSnMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEpzLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBKc307dmFyIFFzPWZ1bmN0aW9uKCl7aWYodGhpcy5fZWRnZXM9bmV3IHhvLHRoaXMuX25vZGVzPW51bGwsdGhpcy5fZWRnZUVuZExpc3Q9bmV3IHhvLDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuX25vZGVzPW5ldyBYcyhuZXcgSnMpO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9ub2Rlcz1uZXcgWHModCl9fTtRcy5wcm90b3R5cGUucHJpbnRFZGdlcz1mdW5jdGlvbih0KXt0LnByaW50bG4oIkVkZ2VzOiIpO2Zvcih2YXIgZT0wO2U8dGhpcy5fZWRnZXMuc2l6ZSgpO2UrKyl7dC5wcmludGxuKCJlZGdlICIrZSsiOiIpO3ZhciBuPXRoaXMuX2VkZ2VzLmdldChlKTtuLnByaW50KHQpLG4uZWlMaXN0LnByaW50KHQpfX0sUXMucHJvdG90eXBlLmZpbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25vZGVzLmZpbmQodCl9LFFzLnByb3RvdHlwZS5hZGROb2RlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBZcyl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl9ub2Rlcy5hZGROb2RlKHQpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5fbm9kZXMuYWRkTm9kZShlKX19LFFzLnByb3RvdHlwZS5nZXROb2RlSXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZXMuaXRlcmF0b3IoKX0sUXMucHJvdG90eXBlLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25vZGVzLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt0Lm5leHQoKS5nZXRFZGdlcygpLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzKCl9fSxRcy5wcm90b3R5cGUuZGVidWdQcmludGxuPWZ1bmN0aW9uKHQpe2tpLm91dC5wcmludGxuKHQpfSxRcy5wcm90b3R5cGUuaXNCb3VuZGFyeU5vZGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9ub2Rlcy5maW5kKGUpO2lmKG51bGw9PT1uKXJldHVybiExO3ZhciByPW4uZ2V0TGFiZWwoKTtyZXR1cm4gbnVsbCE9PXImJnIuZ2V0TG9jYXRpb24odCk9PT1iaS5CT1VOREFSWX0sUXMucHJvdG90eXBlLmxpbmtBbGxEaXJlY3RlZEVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25vZGVzLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt0Lm5leHQoKS5nZXRFZGdlcygpLmxpbmtBbGxEaXJlY3RlZEVkZ2VzKCl9fSxRcy5wcm90b3R5cGUubWF0Y2hJblNhbWVEaXJlY3Rpb249ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuISF0LmVxdWFscyhuKSYmKGVvLmNvbXB1dGVPcmllbnRhdGlvbih0LGUscik9PT1lby5DT0xMSU5FQVImJldzLnF1YWRyYW50KHQsZSk9PT1Xcy5xdWFkcmFudChuLHIpKX0sUXMucHJvdG90eXBlLmdldEVkZ2VFbmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VFbmRMaXN0fSxRcy5wcm90b3R5cGUuZGVidWdQcmludD1mdW5jdGlvbih0KXtraS5vdXQucHJpbnQodCl9LFFzLnByb3RvdHlwZS5nZXRFZGdlSXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZXMuaXRlcmF0b3IoKX0sUXMucHJvdG90eXBlLmZpbmRFZGdlSW5TYW1lRGlyZWN0aW9uPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMscj0wO3I8dGhpcy5fZWRnZXMuc2l6ZSgpO3IrKyl7dmFyIGk9bi5fZWRnZXMuZ2V0KHIpLG89aS5nZXRDb29yZGluYXRlcygpO2lmKG4ubWF0Y2hJblNhbWVEaXJlY3Rpb24odCxlLG9bMF0sb1sxXSl8fG4ubWF0Y2hJblNhbWVEaXJlY3Rpb24odCxlLG9bby5sZW5ndGgtMV0sb1tvLmxlbmd0aC0yXSkpcmV0dXJuIGl9cmV0dXJuIG51bGx9LFFzLnByb3RvdHlwZS5pbnNlcnRFZGdlPWZ1bmN0aW9uKHQpe3RoaXMuX2VkZ2VzLmFkZCh0KX0sUXMucHJvdG90eXBlLmZpbmRFZGdlRW5kPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO2lmKG4uZ2V0RWRnZSgpPT09dClyZXR1cm4gbn1yZXR1cm4gbnVsbH0sUXMucHJvdG90eXBlLmFkZEVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ZS5fZWRnZXMuYWRkKHIpO3ZhciBpPW5ldyBLcyhyLCEwKSxvPW5ldyBLcyhyLCExKTtpLnNldFN5bShvKSxvLnNldFN5bShpKSxlLmFkZChpKSxlLmFkZChvKX19LFFzLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5fbm9kZXMuYWRkKHQpLHRoaXMuX2VkZ2VFbmRMaXN0LmFkZCh0KX0sUXMucHJvdG90eXBlLmdldE5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVzLnZhbHVlcygpfSxRcy5wcm90b3R5cGUuZmluZEVkZ2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHRoaXMuX2VkZ2VzLnNpemUoKTtuKyspe3ZhciByPXRoaXMuX2VkZ2VzLmdldChuKSxpPXIuZ2V0Q29vcmRpbmF0ZXMoKTtpZih0LmVxdWFscyhpWzBdKSYmZS5lcXVhbHMoaVsxXSkpcmV0dXJuIHJ9cmV0dXJuIG51bGx9LFFzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxRcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUXN9LFFzLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5nZXRFZGdlcygpLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzKCl9fTt2YXIgJHM9ZnVuY3Rpb24oKXt0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9bnVsbCx0aGlzLl9zaGVsbExpc3Q9bmV3IHhvO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9dH07JHMucHJvdG90eXBlLnNvcnRTaGVsbHNBbmRIb2xlcz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXQuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO2kuaXNIb2xlKCk/bi5hZGQoaSk6ZS5hZGQoaSl9fSwkcy5wcm90b3R5cGUuY29tcHV0ZVBvbHlnb25zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKS50b1BvbHlnb24odGhpcy5fZ2VvbWV0cnlGYWN0b3J5KTtlLmFkZChyKX1yZXR1cm4gZX0sJHMucHJvdG90eXBlLnBsYWNlRnJlZUhvbGVzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2lmKG51bGw9PT1yLmdldFNoZWxsKCkpe3ZhciBpPXRoaXMuZmluZEVkZ2VSaW5nQ29udGFpbmluZyhyLHQpO2lmKG51bGw9PT1pKXRocm93IG5ldyBScygidW5hYmxlIHRvIGFzc2lnbiBob2xlIHRvIGEgc2hlbGwiLHIuZ2V0Q29vcmRpbmF0ZSgwKSk7ci5zZXRTaGVsbChpKX19fSwkcy5wcm90b3R5cGUuYnVpbGRNaW5pbWFsRWRnZVJpbmdzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9bmV3IHhvLGk9dC5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCk7aWYoby5nZXRNYXhOb2RlRGVncmVlKCk+Mil7by5saW5rRGlyZWN0ZWRFZGdlc0Zvck1pbmltYWxFZGdlUmluZ3MoKTt2YXIgcz1vLmJ1aWxkTWluaW1hbFJpbmdzKCksYT10aGlzLmZpbmRTaGVsbChzKTtudWxsIT09YT8odGhpcy5wbGFjZVBvbHlnb25Ib2xlcyhhLHMpLGUuYWRkKGEpKTpuLmFkZEFsbChzKX1lbHNlIHIuYWRkKG8pfXJldHVybiByfSwkcy5wcm90b3R5cGUuY29udGFpbnNQb2ludD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fc2hlbGxMaXN0Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtpZihlLm5leHQoKS5jb250YWluc1BvaW50KHQpKXJldHVybiEwfXJldHVybiExfSwkcy5wcm90b3R5cGUuYnVpbGRNYXhpbWFsRWRnZVJpbmdzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZihyLmlzSW5SZXN1bHQoKSYmci5nZXRMYWJlbCgpLmlzQXJlYSgpJiZudWxsPT09ci5nZXRFZGdlUmluZygpKXt2YXIgaT1uZXcgVnMocix0aGlzLl9nZW9tZXRyeUZhY3RvcnkpO2UuYWRkKGkpLGkuc2V0SW5SZXN1bHQoKX19cmV0dXJuIGV9LCRzLnByb3RvdHlwZS5wbGFjZVBvbHlnb25Ib2xlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1lLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtyLmlzSG9sZSgpJiZyLnNldFNoZWxsKHQpfX0sJHMucHJvdG90eXBlLmdldFBvbHlnb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZVBvbHlnb25zKHRoaXMuX3NoZWxsTGlzdCl9LCRzLnByb3RvdHlwZS5maW5kRWRnZVJpbmdDb250YWluaW5nPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2V0TGluZWFyUmluZygpLHI9bi5nZXRFbnZlbG9wZUludGVybmFsKCksaT1uLmdldENvb3JkaW5hdGVOKDApLG89bnVsbCxzPW51bGwsYT1lLml0ZXJhdG9yKCk7YS5oYXNOZXh0KCk7KXt2YXIgdT1hLm5leHQoKSxjPXUuZ2V0TGluZWFyUmluZygpLGw9Yy5nZXRFbnZlbG9wZUludGVybmFsKCk7bnVsbCE9PW8mJihzPW8uZ2V0TGluZWFyUmluZygpLmdldEVudmVsb3BlSW50ZXJuYWwoKSk7dmFyIGg9ITE7bC5jb250YWlucyhyKSYmZW8uaXNQb2ludEluUmluZyhpLGMuZ2V0Q29vcmRpbmF0ZXMoKSkmJihoPSEwKSxoJiYobnVsbD09PW98fHMuY29udGFpbnMobCkpJiYobz11KX1yZXR1cm4gb30sJHMucHJvdG90eXBlLmZpbmRTaGVsbD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPW51bGwscj10Lml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtpLmlzSG9sZSgpfHwobj1pLGUrKyl9cmV0dXJuIFppLmlzVHJ1ZShlPD0xLCJmb3VuZCB0d28gc2hlbGxzIGluIE1pbmltYWxFZGdlUmluZyBsaXN0Iiksbn0sJHMucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5hZGQodC5nZXRFZGdlRW5kcygpLHQuZ2V0Tm9kZXMoKSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdO1FzLmxpbmtSZXN1bHREaXJlY3RlZEVkZ2VzKGFyZ3VtZW50c1sxXSk7dmFyIG49dGhpcy5idWlsZE1heGltYWxFZGdlUmluZ3MoZSkscj1uZXcgeG8saT10aGlzLmJ1aWxkTWluaW1hbEVkZ2VSaW5ncyhuLHRoaXMuX3NoZWxsTGlzdCxyKTt0aGlzLnNvcnRTaGVsbHNBbmRIb2xlcyhpLHRoaXMuX3NoZWxsTGlzdCxyKSx0aGlzLnBsYWNlRnJlZUhvbGVzKHRoaXMuX3NoZWxsTGlzdCxyKX19LCRzLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSwkcy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gJHN9O3ZhciB0YT1mdW5jdGlvbigpe307dGEucHJvdG90eXBlLmdldEJvdW5kcz1mdW5jdGlvbigpe30sdGEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHRhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB0YX07dmFyIGVhPWZ1bmN0aW9uKCl7dGhpcy5fYm91bmRzPW51bGwsdGhpcy5faXRlbT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9ib3VuZHM9dCx0aGlzLl9pdGVtPWV9O2VhLnByb3RvdHlwZS5nZXRJdGVtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2l0ZW19LGVhLnByb3RvdHlwZS5nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm91bmRzfSxlYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdGEsbWldfSxlYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZWF9O3ZhciBuYT1mdW5jdGlvbigpe3RoaXMuX3NpemU9bnVsbCx0aGlzLl9pdGVtcz1udWxsLHRoaXMuX3NpemU9MCx0aGlzLl9pdGVtcz1uZXcgeG8sdGhpcy5faXRlbXMuYWRkKG51bGwpfTtuYS5wcm90b3R5cGUucG9sbD1mdW5jdGlvbigpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiBudWxsO3ZhciB0PXRoaXMuX2l0ZW1zLmdldCgxKTtyZXR1cm4gdGhpcy5faXRlbXMuc2V0KDEsdGhpcy5faXRlbXMuZ2V0KHRoaXMuX3NpemUpKSx0aGlzLl9zaXplLT0xLHRoaXMucmVvcmRlcigxKSx0fSxuYS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaXplfSxuYS5wcm90b3R5cGUucmVvcmRlcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPW51bGwscj10aGlzLl9pdGVtcy5nZXQodCk7Mip0PD10aGlzLl9zaXplJiYoKG49Mip0KSE9PWUuX3NpemUmJmUuX2l0ZW1zLmdldChuKzEpLmNvbXBhcmVUbyhlLl9pdGVtcy5nZXQobikpPDAmJm4rKyxlLl9pdGVtcy5nZXQobikuY29tcGFyZVRvKHIpPDApO3Q9billLl9pdGVtcy5zZXQodCxlLl9pdGVtcy5nZXQobikpO3RoaXMuX2l0ZW1zLnNldCh0LHIpfSxuYS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLl9zaXplPTAsdGhpcy5faXRlbXMuY2xlYXIoKX0sbmEucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuX3NpemV9LG5hLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5faXRlbXMuYWRkKG51bGwpLHRoaXMuX3NpemUrPTE7dmFyIGU9dGhpcy5fc2l6ZTtmb3IodGhpcy5faXRlbXMuc2V0KDAsdCk7dC5jb21wYXJlVG8odGhpcy5faXRlbXMuZ2V0KE1hdGgudHJ1bmMoZS8yKSkpPDA7ZS89Mil0aGlzLl9pdGVtcy5zZXQoZSx0aGlzLl9pdGVtcy5nZXQoTWF0aC50cnVuYyhlLzIpKSk7dGhpcy5faXRlbXMuc2V0KGUsdCl9LG5hLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxuYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbmF9O3ZhciByYT1mdW5jdGlvbigpe307cmEucHJvdG90eXBlLnZpc2l0SXRlbT1mdW5jdGlvbih0KXt9LHJhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxyYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcmF9O3ZhciBpYT1mdW5jdGlvbigpe307aWEucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUpe30saWEucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0LGUpe30saWEucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKCl7fSxpYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0saWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGlhfTt2YXIgb2E9ZnVuY3Rpb24oKXtpZih0aGlzLl9jaGlsZEJvdW5kYWJsZXM9bmV3IHhvLHRoaXMuX2JvdW5kcz1udWxsLHRoaXMuX2xldmVsPW51bGwsMCE9PWFyZ3VtZW50cy5sZW5ndGgmJjE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbGV2ZWw9dH19LHNhPXtzZXJpYWxWZXJzaW9uVUlEOntjb25maWd1cmFibGU6ITB9fTtvYS5wcm90b3R5cGUuZ2V0TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGV2ZWx9LG9hLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQm91bmRhYmxlcy5zaXplKCl9LG9hLnByb3RvdHlwZS5nZXRDaGlsZEJvdW5kYWJsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hpbGRCb3VuZGFibGVzfSxvYS5wcm90b3R5cGUuYWRkQ2hpbGRCb3VuZGFibGU9ZnVuY3Rpb24odCl7WmkuaXNUcnVlKG51bGw9PT10aGlzLl9ib3VuZHMpLHRoaXMuX2NoaWxkQm91bmRhYmxlcy5hZGQodCl9LG9hLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQm91bmRhYmxlcy5pc0VtcHR5KCl9LG9hLnByb3RvdHlwZS5nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09PXRoaXMuX2JvdW5kcyYmKHRoaXMuX2JvdW5kcz10aGlzLmNvbXB1dGVCb3VuZHMoKSksdGhpcy5fYm91bmRzfSxvYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bdGEsbWldfSxvYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gb2F9LHNhLnNlcmlhbFZlcnNpb25VSUQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDB4NWExZTU1ZWM0MTM2OTgwMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2Esc2EpO3ZhciBhYT1mdW5jdGlvbigpe307YWEucmV2ZXJzZU9yZGVyPWZ1bmN0aW9uKCl7cmV0dXJue2NvbXBhcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5jb21wYXJlVG8odCl9fX0sYWEubWluPWZ1bmN0aW9uKHQpe3JldHVybiBhYS5zb3J0KHQpLHQuZ2V0KDApfSxhYS5zb3J0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dC50b0FycmF5KCk7ZT9Wby5zb3J0KG4sZSk6Vm8uc29ydChuKTtmb3IodmFyIHI9dC5pdGVyYXRvcigpLGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspci5uZXh0KCksci5zZXQobltpXSl9LGFhLnNpbmdsZXRvbkxpc3Q9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHhvO3JldHVybiBlLmFkZCh0KSxlfTt2YXIgdWE9ZnVuY3Rpb24oKXt0aGlzLl9ib3VuZGFibGUxPW51bGwsdGhpcy5fYm91bmRhYmxlMj1udWxsLHRoaXMuX2Rpc3RhbmNlPW51bGwsdGhpcy5faXRlbURpc3RhbmNlPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX2JvdW5kYWJsZTE9dCx0aGlzLl9ib3VuZGFibGUyPWUsdGhpcy5faXRlbURpc3RhbmNlPW4sdGhpcy5fZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSgpfTt1YS5wcm90b3R5cGUuZXhwYW5kVG9RdWV1ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXVhLmlzQ29tcG9zaXRlKHRoaXMuX2JvdW5kYWJsZTEpLHI9dWEuaXNDb21wb3NpdGUodGhpcy5fYm91bmRhYmxlMik7aWYobiYmcilyZXR1cm4gdWEuYXJlYSh0aGlzLl9ib3VuZGFibGUxKT51YS5hcmVhKHRoaXMuX2JvdW5kYWJsZTIpPyh0aGlzLmV4cGFuZCh0aGlzLl9ib3VuZGFibGUxLHRoaXMuX2JvdW5kYWJsZTIsdCxlKSxudWxsKToodGhpcy5leHBhbmQodGhpcy5fYm91bmRhYmxlMix0aGlzLl9ib3VuZGFibGUxLHQsZSksbnVsbCk7aWYobilyZXR1cm4gdGhpcy5leHBhbmQodGhpcy5fYm91bmRhYmxlMSx0aGlzLl9ib3VuZGFibGUyLHQsZSksbnVsbDtpZihyKXJldHVybiB0aGlzLmV4cGFuZCh0aGlzLl9ib3VuZGFibGUyLHRoaXMuX2JvdW5kYWJsZTEsdCxlKSxudWxsO3Rocm93IG5ldyBoaX0sdWEucHJvdG90eXBlLmlzTGVhdmVzPWZ1bmN0aW9uKCl7cmV0dXJuISh1YS5pc0NvbXBvc2l0ZSh0aGlzLl9ib3VuZGFibGUxKXx8dWEuaXNDb21wb3NpdGUodGhpcy5fYm91bmRhYmxlMikpfSx1YS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlPGUuX2Rpc3RhbmNlPy0xOnRoaXMuX2Rpc3RhbmNlPmUuX2Rpc3RhbmNlPzE6MH0sdWEucHJvdG90eXBlLmV4cGFuZD1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9dC5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7dmFyIG89aS5uZXh0KCkscz1uZXcgdWEobyxlLHRoaXMuX2l0ZW1EaXN0YW5jZSk7cy5nZXREaXN0YW5jZSgpPHImJm4uYWRkKHMpfX0sdWEucHJvdG90eXBlLmdldEJvdW5kYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXQ/dGhpcy5fYm91bmRhYmxlMTp0aGlzLl9ib3VuZGFibGUyfSx1YS5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2V9LHVhLnByb3RvdHlwZS5kaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTGVhdmVzKCk/dGhpcy5faXRlbURpc3RhbmNlLmRpc3RhbmNlKHRoaXMuX2JvdW5kYWJsZTEsdGhpcy5fYm91bmRhYmxlMik6dGhpcy5fYm91bmRhYmxlMS5nZXRCb3VuZHMoKS5kaXN0YW5jZSh0aGlzLl9ib3VuZGFibGUyLmdldEJvdW5kcygpKX0sdWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2RpXX0sdWEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHVhfSx1YS5hcmVhPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEJvdW5kcygpLmdldEFyZWEoKX0sdWEuaXNDb21wb3NpdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBvYX07dmFyIGNhPWZ1bmN0aW9uIHQoKXtpZih0aGlzLl9yb290PW51bGwsdGhpcy5fYnVpbHQ9ITEsdGhpcy5faXRlbUJvdW5kYWJsZXM9bmV3IHhvLHRoaXMuX25vZGVDYXBhY2l0eT1udWxsLDA9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT10LkRFRkFVTFRfTk9ERV9DQVBBQ0lUWTt0aGlzLl9ub2RlQ2FwYWNpdHk9ZX1lbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF07WmkuaXNUcnVlKG4+MSwiTm9kZSBjYXBhY2l0eSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxIiksdGhpcy5fbm9kZUNhcGFjaXR5PW59fSxsYT17SW50ZXJzZWN0c09wOntjb25maWd1cmFibGU6ITB9LHNlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0sREVGQVVMVF9OT0RFX0NBUEFDSVRZOntjb25maWd1cmFibGU6ITB9fTtjYS5wcm90b3R5cGUuZ2V0Tm9kZUNhcGFjaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVDYXBhY2l0eX0sY2EucHJvdG90eXBlLmxhc3ROb2RlPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldCh0LnNpemUoKS0xKX0sY2EucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5pc0VtcHR5KCk/MDoodGhpcy5idWlsZCgpLHRoaXMuc2l6ZSh0aGlzLl9yb290KSk7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD0wLGU9YXJndW1lbnRzWzBdLmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtuIGluc3RhbmNlb2Ygb2E/dCs9dGhpcy5zaXplKG4pOm4gaW5zdGFuY2VvZiBlYSYmKHQrPTEpfXJldHVybiB0fX0sY2EucHJvdG90eXBlLnJlbW92ZUl0ZW09ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bnVsbCxyPXQuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO2kgaW5zdGFuY2VvZiBlYSYmaS5nZXRJdGVtKCk9PT1lJiYobj1pKX1yZXR1cm4gbnVsbCE9PW4mJih0LmdldENoaWxkQm91bmRhYmxlcygpLnJlbW92ZShuKSwhMCl9LGNhLnByb3RvdHlwZS5pdGVtc1RyZWU9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7dGhpcy5idWlsZCgpO3ZhciB0PXRoaXMuaXRlbXNUcmVlKHRoaXMuX3Jvb3QpO3JldHVybiBudWxsPT09dD9uZXcgeG86dH1pZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPW5ldyB4byxyPWUuZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpO2lmKGkgaW5zdGFuY2VvZiBvYSl7dmFyIG89dGhpcy5pdGVtc1RyZWUoaSk7bnVsbCE9PW8mJm4uYWRkKG8pfWVsc2UgaSBpbnN0YW5jZW9mIGVhP24uYWRkKGkuZ2V0SXRlbSgpKTpaaS5zaG91bGROZXZlclJlYWNoSGVyZSgpfXJldHVybiBuLnNpemUoKTw9MD9udWxsOm59fSxjYS5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7WmkuaXNUcnVlKCF0aGlzLl9idWlsdCwiQ2Fubm90IGluc2VydCBpdGVtcyBpbnRvIGFuIFNUUiBwYWNrZWQgUi10cmVlIGFmdGVyIGl0IGhhcyBiZWVuIGJ1aWx0LiIpLHRoaXMuX2l0ZW1Cb3VuZGFibGVzLmFkZChuZXcgZWEodCxlKSl9LGNhLnByb3RvdHlwZS5ib3VuZGFibGVzQXRMZXZlbD1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgeG87cmV0dXJuIHRoaXMuYm91bmRhYmxlc0F0TGV2ZWwodCx0aGlzLl9yb290LGUpLGV9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXTtpZihaaS5pc1RydWUobj4tMiksci5nZXRMZXZlbCgpPT09bilyZXR1cm4gaS5hZGQociksbnVsbDtmb3IodmFyIG89ci5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCk7cyBpbnN0YW5jZW9mIG9hP3RoaXMuYm91bmRhYmxlc0F0TGV2ZWwobixzLGkpOihaaS5pc1RydWUocyBpbnN0YW5jZW9mIGVhKSwtMT09PW4mJmkuYWRkKHMpKX1yZXR1cm4gbnVsbH19LGNhLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLmJ1aWxkKCk7dmFyIG49bmV3IHhvO3JldHVybiB0aGlzLmlzRW1wdHkoKXx8dGhpcy5nZXRJbnRlcnNlY3RzT3AoKS5pbnRlcnNlY3RzKHRoaXMuX3Jvb3QuZ2V0Qm91bmRzKCksZSkmJnRoaXMucXVlcnkoZSx0aGlzLl9yb290LG4pLG59aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTtpZih0aGlzLmJ1aWxkKCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dGhpcy5nZXRJbnRlcnNlY3RzT3AoKS5pbnRlcnNlY3RzKHRoaXMuX3Jvb3QuZ2V0Qm91bmRzKCkscikmJnRoaXMucXVlcnkocix0aGlzLl9yb290LGkpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoRWkoYXJndW1lbnRzWzJdLHJhKSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPYmplY3QmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygb2EpZm9yKHZhciBvPWFyZ3VtZW50c1swXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1sxXS5nZXRDaGlsZEJvdW5kYWJsZXMoKSx1PTA7dTxhLnNpemUoKTt1Kyspe3ZhciBjPWEuZ2V0KHUpOyF0LmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHMoYy5nZXRCb3VuZHMoKSxvKXx8KGMgaW5zdGFuY2VvZiBvYT90LnF1ZXJ5KG8sYyxzKTpjIGluc3RhbmNlb2YgZWE/cy52aXNpdEl0ZW0oYy5nZXRJdGVtKCkpOlppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCkpfWVsc2UgaWYoRWkoYXJndW1lbnRzWzJdLHZvKSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBPYmplY3QmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygb2EpZm9yKHZhciBsPWFyZ3VtZW50c1swXSxoPWFyZ3VtZW50c1syXSxmPWFyZ3VtZW50c1sxXS5nZXRDaGlsZEJvdW5kYWJsZXMoKSxwPTA7cDxmLnNpemUoKTtwKyspe3ZhciBkPWYuZ2V0KHApOyF0LmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHMoZC5nZXRCb3VuZHMoKSxsKXx8KGQgaW5zdGFuY2VvZiBvYT90LnF1ZXJ5KGwsZCxoKTpkIGluc3RhbmNlb2YgZWE/aC5hZGQoZC5nZXRJdGVtKCkpOlppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCkpfX0sY2EucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKCl7aWYodGhpcy5fYnVpbHQpcmV0dXJuIG51bGw7dGhpcy5fcm9vdD10aGlzLl9pdGVtQm91bmRhYmxlcy5pc0VtcHR5KCk/dGhpcy5jcmVhdGVOb2RlKDApOnRoaXMuY3JlYXRlSGlnaGVyTGV2ZWxzKHRoaXMuX2l0ZW1Cb3VuZGFibGVzLC0xKSx0aGlzLl9pdGVtQm91bmRhYmxlcz1udWxsLHRoaXMuX2J1aWx0PSEwfSxjYS5wcm90b3R5cGUuZ2V0Um9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1aWxkKCksdGhpcy5fcm9vdH0sY2EucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07cmV0dXJuIHRoaXMuYnVpbGQoKSwhIXRoaXMuZ2V0SW50ZXJzZWN0c09wKCkuaW50ZXJzZWN0cyh0aGlzLl9yb290LmdldEJvdW5kcygpLHQpJiZ0aGlzLnJlbW92ZSh0LHRoaXMuX3Jvb3QsZSl9aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXSxvPXRoaXMucmVtb3ZlSXRlbShyLGkpO2lmKG8pcmV0dXJuITA7Zm9yKHZhciBzPW51bGwsYT1yLmdldENoaWxkQm91bmRhYmxlcygpLml0ZXJhdG9yKCk7YS5oYXNOZXh0KCk7KXt2YXIgdT1hLm5leHQoKTtpZih0aGlzLmdldEludGVyc2VjdHNPcCgpLmludGVyc2VjdHModS5nZXRCb3VuZHMoKSxuKSYmdSBpbnN0YW5jZW9mIG9hJiYobz10aGlzLnJlbW92ZShuLHUsaSkpKXtzPXU7YnJlYWt9fXJldHVybiBudWxsIT09cyYmcy5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pc0VtcHR5KCkmJnIuZ2V0Q2hpbGRCb3VuZGFibGVzKCkucmVtb3ZlKHMpLG99fSxjYS5wcm90b3R5cGUuY3JlYXRlSGlnaGVyTGV2ZWxzPWZ1bmN0aW9uKHQsZSl7WmkuaXNUcnVlKCF0LmlzRW1wdHkoKSk7dmFyIG49dGhpcy5jcmVhdGVQYXJlbnRCb3VuZGFibGVzKHQsZSsxKTtyZXR1cm4gMT09PW4uc2l6ZSgpP24uZ2V0KDApOnRoaXMuY3JlYXRlSGlnaGVyTGV2ZWxzKG4sZSsxKX0sY2EucHJvdG90eXBlLmRlcHRoPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuaXNFbXB0eSgpPzA6KHRoaXMuYnVpbGQoKSx0aGlzLmRlcHRoKHRoaXMuX3Jvb3QpKTtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciB0PTAsZT1hcmd1bWVudHNbMF0uZ2V0Q2hpbGRCb3VuZGFibGVzKCkuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO2lmKG4gaW5zdGFuY2VvZiBvYSl7dmFyIHI9dGhpcy5kZXB0aChuKTtyPnQmJih0PXIpfX1yZXR1cm4gdCsxfX0sY2EucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO1ppLmlzVHJ1ZSghdC5pc0VtcHR5KCkpO3ZhciByPW5ldyB4bztyLmFkZCh0aGlzLmNyZWF0ZU5vZGUoZSkpO3ZhciBpPW5ldyB4byh0KTthYS5zb3J0KGksdGhpcy5nZXRDb21wYXJhdG9yKCkpO2Zvcih2YXIgbz1pLml0ZXJhdG9yKCk7by5oYXNOZXh0KCk7KXt2YXIgcz1vLm5leHQoKTtuLmxhc3ROb2RlKHIpLmdldENoaWxkQm91bmRhYmxlcygpLnNpemUoKT09PW4uZ2V0Tm9kZUNhcGFjaXR5KCkmJnIuYWRkKG4uY3JlYXRlTm9kZShlKSksbi5sYXN0Tm9kZShyKS5hZGRDaGlsZEJvdW5kYWJsZShzKX1yZXR1cm4gcn0sY2EucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYnVpbHQ/dGhpcy5fcm9vdC5pc0VtcHR5KCk6dGhpcy5faXRlbUJvdW5kYWJsZXMuaXNFbXB0eSgpfSxjYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bbWldfSxjYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gY2F9LGNhLmNvbXBhcmVEb3VibGVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+ZT8xOnQ8ZT8tMTowfSxsYS5JbnRlcnNlY3RzT3AuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGhhfSxsYS5zZXJpYWxWZXJzaW9uVUlELmdldD1mdW5jdGlvbigpe3JldHVybi0weDM1ZWY2NGM4MmQ0YzU0MDB9LGxhLkRFRkFVTFRfTk9ERV9DQVBBQ0lUWS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMTB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNhLGxhKTt2YXIgaGE9ZnVuY3Rpb24oKXt9LGZhPWZ1bmN0aW9uKCl7fTtmYS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXt9LGZhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxmYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZmF9O3ZhciBwYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe249bnx8ZS5ERUZBVUxUX05PREVfQ0FQQUNJVFksdC5jYWxsKHRoaXMsbil9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG49e1NUUnRyZWVOb2RlOntjb25maWd1cmFibGU6ITB9LHNlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH0seENvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0seUNvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH0saW50ZXJzZWN0c09wOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfTk9ERV9DQVBBQ0lUWTp7Y29uZmlndXJhYmxlOiEwfX07cmV0dXJuIGUucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXNGcm9tVmVydGljYWxTbGljZXM9ZnVuY3Rpb24odCxlKXtaaS5pc1RydWUodC5sZW5ndGg+MCk7Zm9yKHZhciBuPW5ldyB4byxyPTA7cjx0Lmxlbmd0aDtyKyspbi5hZGRBbGwodGhpcy5jcmVhdGVQYXJlbnRCb3VuZGFibGVzRnJvbVZlcnRpY2FsU2xpY2UodFtyXSxlKSk7cmV0dXJuIG59LGUucHJvdG90eXBlLmNyZWF0ZU5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBkYSh0KX0sZS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90LnByb3RvdHlwZS5zaXplLmNhbGwodGhpcyk6dC5wcm90b3R5cGUuc2l6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbigpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5pbnNlcnQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZihlLmlzTnVsbCgpKXJldHVybiBudWxsO3QucHJvdG90eXBlLmluc2VydC5jYWxsKHRoaXMsZSxuKX0sZS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0c09wPWZ1bmN0aW9uKCl7cmV0dXJuIGUuaW50ZXJzZWN0c09wfSxlLnByb3RvdHlwZS52ZXJ0aWNhbFNsaWNlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1NYXRoLnRydW5jKE1hdGguY2VpbCh0LnNpemUoKS9lKSkscj1uZXcgQXJyYXkoZSkuZmlsbChudWxsKSxpPXQuaXRlcmF0b3IoKSxvPTA7bzxlO28rKyl7cltvXT1uZXcgeG87Zm9yKHZhciBzPTA7aS5oYXNOZXh0KCkmJnM8bjspe3ZhciBhPWkubmV4dCgpO3Jbb10uYWRkKGEpLHMrK319cmV0dXJuIHJ9LGUucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gdC5wcm90b3R5cGUucXVlcnkuY2FsbCh0aGlzLGUpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1hcmd1bWVudHNbMV07dC5wcm90b3R5cGUucXVlcnkuY2FsbCh0aGlzLG4scil9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihFaShhcmd1bWVudHNbMl0scmEpJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBvYSl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdO3QucHJvdG90eXBlLnF1ZXJ5LmNhbGwodGhpcyxpLG8scyl9ZWxzZSBpZihFaShhcmd1bWVudHNbMl0sdm8pJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE9iamVjdCYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBvYSl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGM9YXJndW1lbnRzWzJdO3QucHJvdG90eXBlLnF1ZXJ5LmNhbGwodGhpcyxhLHUsYyl9fSxlLnByb3RvdHlwZS5nZXRDb21wYXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIGUueUNvbXBhcmF0b3J9LGUucHJvdG90eXBlLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXNGcm9tVmVydGljYWxTbGljZT1mdW5jdGlvbihlLG4pe3JldHVybiB0LnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzLmNhbGwodGhpcyxlLG4pfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3JldHVybiB0LnByb3RvdHlwZS5yZW1vdmUuY2FsbCh0aGlzLGUsbil9cmV0dXJuIHQucHJvdG90eXBlLnJlbW92ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlLmRlcHRoPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3QucHJvdG90eXBlLmRlcHRoLmNhbGwodGhpcyk6dC5wcm90b3R5cGUuZGVwdGguYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5jcmVhdGVQYXJlbnRCb3VuZGFibGVzPWZ1bmN0aW9uKHQsbil7WmkuaXNUcnVlKCF0LmlzRW1wdHkoKSk7dmFyIHI9TWF0aC50cnVuYyhNYXRoLmNlaWwodC5zaXplKCkvdGhpcy5nZXROb2RlQ2FwYWNpdHkoKSkpLGk9bmV3IHhvKHQpO2FhLnNvcnQoaSxlLnhDb21wYXJhdG9yKTt2YXIgbz10aGlzLnZlcnRpY2FsU2xpY2VzKGksTWF0aC50cnVuYyhNYXRoLmNlaWwoTWF0aC5zcXJ0KHIpKSkpO3JldHVybiB0aGlzLmNyZWF0ZVBhcmVudEJvdW5kYWJsZXNGcm9tVmVydGljYWxTbGljZXMobyxuKX0sZS5wcm90b3R5cGUubmVhcmVzdE5laWdoYm91cj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihFaShhcmd1bWVudHNbMF0sZmEpKXt2YXIgdD1hcmd1bWVudHNbMF0sbj1uZXcgdWEodGhpcy5nZXRSb290KCksdGhpcy5nZXRSb290KCksdCk7cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihuKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVhKXt2YXIgcj1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihyLGZpLlBPU0lUSVZFX0lORklOSVRZKX19ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBlJiZFaShhcmd1bWVudHNbMV0sZmEpKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1uZXcgdWEodGhpcy5nZXRSb290KCksaS5nZXRSb290KCksbyk7cmV0dXJuIHRoaXMubmVhcmVzdE5laWdoYm91cihzKX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHVhJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGM9bnVsbCxsPW5ldyBuYTtmb3IobC5hZGQoYSk7IWwuaXNFbXB0eSgpJiZ1PjA7KXt2YXIgaD1sLnBvbGwoKSxmPWguZ2V0RGlzdGFuY2UoKTtpZihmPj11KWJyZWFrO2guaXNMZWF2ZXMoKT8odT1mLGM9aCk6aC5leHBhbmRUb1F1ZXVlKGwsdSl9cmV0dXJuW2MuZ2V0Qm91bmRhYmxlKDApLmdldEl0ZW0oKSxjLmdldEJvdW5kYWJsZSgxKS5nZXRJdGVtKCldfX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcD1hcmd1bWVudHNbMl0sZD1uZXcgZWEoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSksZz1uZXcgdWEodGhpcy5nZXRSb290KCksZCxwKTtyZXR1cm4gdGhpcy5uZWFyZXN0TmVpZ2hib3VyKGcpWzBdfX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5baWEsbWldfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLmNlbnRyZVg9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYXZnKHQuZ2V0TWluWCgpLHQuZ2V0TWF4WCgpKX0sZS5hdmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4odCtlKS8yfSxlLmNlbnRyZVk9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYXZnKHQuZ2V0TWluWSgpLHQuZ2V0TWF4WSgpKX0sbi5TVFJ0cmVlTm9kZS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZGF9LG4uc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHgzOTkyMGY3ZDVmMjYxZTB9LG4ueENvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJue2ludGVyZmFjZXNfOmZ1bmN0aW9uKCl7cmV0dXJuW3lpXX0sY29tcGFyZTpmdW5jdGlvbihuLHIpe3JldHVybiB0LmNvbXBhcmVEb3VibGVzKGUuY2VudHJlWChuLmdldEJvdW5kcygpKSxlLmNlbnRyZVgoci5nZXRCb3VuZHMoKSkpfX19LG4ueUNvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJue2ludGVyZmFjZXNfOmZ1bmN0aW9uKCl7cmV0dXJuW3lpXX0sY29tcGFyZTpmdW5jdGlvbihuLHIpe3JldHVybiB0LmNvbXBhcmVEb3VibGVzKGUuY2VudHJlWShuLmdldEJvdW5kcygpKSxlLmNlbnRyZVkoci5nZXRCb3VuZHMoKSkpfX19LG4uaW50ZXJzZWN0c09wLmdldD1mdW5jdGlvbigpe3JldHVybntpbnRlcmZhY2VzXzpmdW5jdGlvbigpe3JldHVyblt0LkludGVyc2VjdHNPcF19LGludGVyc2VjdHM6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5pbnRlcnNlY3RzKGUpfX19LG4uREVGQVVMVF9OT0RFX0NBUEFDSVRZLmdldD1mdW5jdGlvbigpe3JldHVybiAxMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxuKSxlfShjYSksZGE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPWFyZ3VtZW50c1swXTt0LmNhbGwodGhpcyxlKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuY29tcHV0ZUJvdW5kcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1udWxsLGU9dGhpcy5nZXRDaGlsZEJvdW5kYWJsZXMoKS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7bnVsbD09PXQ/dD1uZXcgamkobi5nZXRCb3VuZHMoKSk6dC5leHBhbmRUb0luY2x1ZGUobi5nZXRCb3VuZHMoKSl9cmV0dXJuIHR9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KG9hKSxnYT1mdW5jdGlvbigpe307Z2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGdhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBnYX0sZ2EucmVsYXRpdmVTaWduPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTowfSxnYS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxuKXtpZihlLmVxdWFsczJEKG4pKXJldHVybiAwO3ZhciByPWdhLnJlbGF0aXZlU2lnbihlLngsbi54KSxpPWdhLnJlbGF0aXZlU2lnbihlLnksbi55KTtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiBnYS5jb21wYXJlVmFsdWUocixpKTtjYXNlIDE6cmV0dXJuIGdhLmNvbXBhcmVWYWx1ZShpLHIpO2Nhc2UgMjpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKGksLXIpO2Nhc2UgMzpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKC1yLGkpO2Nhc2UgNDpyZXR1cm4gZ2EuY29tcGFyZVZhbHVlKC1yLC1pKTtjYXNlIDU6cmV0dXJuIGdhLmNvbXBhcmVWYWx1ZSgtaSwtcik7Y2FzZSA2OnJldHVybiBnYS5jb21wYXJlVmFsdWUoLWkscik7Y2FzZSA3OnJldHVybiBnYS5jb21wYXJlVmFsdWUociwtaSl9cmV0dXJuIFppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJpbnZhbGlkIG9jdGFudCB2YWx1ZSIpLDB9LGdhLmNvbXBhcmVWYWx1ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0PDA/LTE6dD4wPzE6ZTwwPy0xOmU+MD8xOjB9O3ZhciB5YT1mdW5jdGlvbigpe3RoaXMuX3NlZ1N0cmluZz1udWxsLHRoaXMuY29vcmQ9bnVsbCx0aGlzLnNlZ21lbnRJbmRleD1udWxsLHRoaXMuX3NlZ21lbnRPY3RhbnQ9bnVsbCx0aGlzLl9pc0ludGVyaW9yPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9YXJndW1lbnRzWzNdO3RoaXMuX3NlZ1N0cmluZz10LHRoaXMuY29vcmQ9bmV3IHZpKGUpLHRoaXMuc2VnbWVudEluZGV4PW4sdGhpcy5fc2VnbWVudE9jdGFudD1yLHRoaXMuX2lzSW50ZXJpb3I9IWUuZXF1YWxzMkQodC5nZXRDb29yZGluYXRlKG4pKX07eWEucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb29yZH0seWEucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnQodGhpcy5jb29yZCksdC5wcmludCgiIHNlZyAjID0gIit0aGlzLnNlZ21lbnRJbmRleCl9LHlhLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gdGhpcy5zZWdtZW50SW5kZXg8ZS5zZWdtZW50SW5kZXg/LTE6dGhpcy5zZWdtZW50SW5kZXg+ZS5zZWdtZW50SW5kZXg/MTp0aGlzLmNvb3JkLmVxdWFsczJEKGUuY29vcmQpPzA6Z2EuY29tcGFyZSh0aGlzLl9zZWdtZW50T2N0YW50LHRoaXMuY29vcmQsZS5jb29yZCl9LHlhLnByb3RvdHlwZS5pc0VuZFBvaW50PWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy5zZWdtZW50SW5kZXgmJiF0aGlzLl9pc0ludGVyaW9yfHx0aGlzLnNlZ21lbnRJbmRleD09PXR9LHlhLnByb3RvdHlwZS5pc0ludGVyaW9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzSW50ZXJpb3J9LHlhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LHlhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB5YX07dmFyIG1hPWZ1bmN0aW9uKCl7dGhpcy5fbm9kZU1hcD1uZXcga28sdGhpcy5fZWRnZT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9lZGdlPXR9O21hLnByb3RvdHlwZS5nZXRTcGxpdENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGJvO3RoaXMuYWRkRW5kcG9pbnRzKCk7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKSxuPWUubmV4dCgpO2UuaGFzTmV4dCgpOyl7dmFyIHI9ZS5uZXh0KCk7dGhpcy5hZGRFZGdlQ29vcmRpbmF0ZXMobixyLHQpLG49cn1yZXR1cm4gdC50b0Nvb3JkaW5hdGVBcnJheSgpfSxtYS5wcm90b3R5cGUuYWRkQ29sbGFwc2VkTm9kZXM9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgeG87dGhpcy5maW5kQ29sbGFwc2VzRnJvbUluc2VydGVkTm9kZXModCksdGhpcy5maW5kQ29sbGFwc2VzRnJvbUV4aXN0aW5nVmVydGljZXModCk7Zm9yKHZhciBlPXQuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLmludFZhbHVlKCk7dGhpcy5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKG4pLG4pfX0sbWEucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3QucHJpbnRsbigiSW50ZXJzZWN0aW9uczoiKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkucHJpbnQodCl9fSxtYS5wcm90b3R5cGUuZmluZENvbGxhcHNlc0Zyb21FeGlzdGluZ1ZlcnRpY2VzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fZWRnZS5zaXplKCktMjtlKyspe3ZhciBuPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlKSxyPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlKzIpO24uZXF1YWxzMkQocikmJnQuYWRkKG5ldyBOaShlKzEpKX19LG1hLnByb3RvdHlwZS5hZGRFZGdlQ29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlLnNlZ21lbnRJbmRleCksaT1lLmlzSW50ZXJpb3IoKXx8IWUuY29vcmQuZXF1YWxzMkQocik7bi5hZGQobmV3IHZpKHQuY29vcmQpLCExKTtmb3IodmFyIG89dC5zZWdtZW50SW5kZXgrMTtvPD1lLnNlZ21lbnRJbmRleDtvKyspbi5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKG8pKTtpJiZuLmFkZChuZXcgdmkoZS5jb29yZCkpfSxtYS5wcm90b3R5cGUuaXRlcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpfSxtYS5wcm90b3R5cGUuYWRkU3BsaXRFZGdlcz1mdW5jdGlvbih0KXt0aGlzLmFkZEVuZHBvaW50cygpLHRoaXMuYWRkQ29sbGFwc2VkTm9kZXMoKTtmb3IodmFyIGU9dGhpcy5pdGVyYXRvcigpLG49ZS5uZXh0KCk7ZS5oYXNOZXh0KCk7KXt2YXIgcj1lLm5leHQoKSxpPXRoaXMuY3JlYXRlU3BsaXRFZGdlKG4scik7dC5hZGQoaSksbj1yfX0sbWEucHJvdG90eXBlLmZpbmRDb2xsYXBzZUluZGV4PWZ1bmN0aW9uKHQsZSxuKXtpZighdC5jb29yZC5lcXVhbHMyRChlLmNvb3JkKSlyZXR1cm4hMTt2YXIgcj1lLnNlZ21lbnRJbmRleC10LnNlZ21lbnRJbmRleDtyZXR1cm4gZS5pc0ludGVyaW9yKCl8fHItLSwxPT09ciYmKG5bMF09dC5zZWdtZW50SW5kZXgrMSwhMCl9LG1hLnByb3RvdHlwZS5maW5kQ29sbGFwc2VzRnJvbUluc2VydGVkTm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSgxKS5maWxsKG51bGwpLG49dGhpcy5pdGVyYXRvcigpLHI9bi5uZXh0KCk7bi5oYXNOZXh0KCk7KXt2YXIgaT1uLm5leHQoKTt0aGlzLmZpbmRDb2xsYXBzZUluZGV4KHIsaSxlKSYmdC5hZGQobmV3IE5pKGVbMF0pKSxyPWl9fSxtYS5wcm90b3R5cGUuZ2V0RWRnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlfSxtYS5wcm90b3R5cGUuYWRkRW5kcG9pbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWRnZS5zaXplKCktMTt0aGlzLmFkZCh0aGlzLl9lZGdlLmdldENvb3JkaW5hdGUoMCksMCksdGhpcy5hZGQodGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKHQpLHQpfSxtYS5wcm90b3R5cGUuY3JlYXRlU3BsaXRFZGdlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5zZWdtZW50SW5kZXgtdC5zZWdtZW50SW5kZXgrMixyPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZShlLnNlZ21lbnRJbmRleCksaT1lLmlzSW50ZXJpb3IoKXx8IWUuY29vcmQuZXF1YWxzMkQocik7aXx8bi0tO3ZhciBvPW5ldyBBcnJheShuKS5maWxsKG51bGwpLHM9MDtvW3MrK109bmV3IHZpKHQuY29vcmQpO2Zvcih2YXIgYT10LnNlZ21lbnRJbmRleCsxO2E8PWUuc2VnbWVudEluZGV4O2ErKylvW3MrK109dGhpcy5fZWRnZS5nZXRDb29yZGluYXRlKGEpO3JldHVybiBpJiYob1tzXT1uZXcgdmkoZS5jb29yZCkpLG5ldyB3YShvLHRoaXMuX2VkZ2UuZ2V0RGF0YSgpKX0sbWEucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyB5YSh0aGlzLl9lZGdlLHQsZSx0aGlzLl9lZGdlLmdldFNlZ21lbnRPY3RhbnQoZSkpLHI9dGhpcy5fbm9kZU1hcC5nZXQobik7cmV0dXJuIG51bGwhPT1yPyhaaS5pc1RydWUoci5jb29yZC5lcXVhbHMyRCh0KSwiRm91bmQgZXF1YWwgbm9kZXMgd2l0aCBkaWZmZXJlbnQgY29vcmRpbmF0ZXMiKSxyKToodGhpcy5fbm9kZU1hcC5wdXQobixuKSxuKX0sbWEucHJvdG90eXBlLmNoZWNrU3BsaXRFZGdlc0NvcnJlY3RuZXNzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2VkZ2UuZ2V0Q29vcmRpbmF0ZXMoKSxuPXQuZ2V0KDApLmdldENvb3JkaW5hdGUoMCk7aWYoIW4uZXF1YWxzMkQoZVswXSkpdGhyb3cgbmV3IFdpKCJiYWQgc3BsaXQgZWRnZSBzdGFydCBwb2ludCBhdCAiK24pO3ZhciByPXQuZ2V0KHQuc2l6ZSgpLTEpLmdldENvb3JkaW5hdGVzKCksaT1yW3IubGVuZ3RoLTFdO2lmKCFpLmVxdWFsczJEKGVbZS5sZW5ndGgtMV0pKXRocm93IG5ldyBXaSgiYmFkIHNwbGl0IGVkZ2UgZW5kIHBvaW50IGF0ICIraSl9LG1hLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxtYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbWF9O3ZhciB2YT1mdW5jdGlvbigpe307dmEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHZhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB2YX0sdmEub2N0YW50PWZ1bmN0aW9uKCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMF0mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07aWYoMD09PXQmJjA9PT1lKXRocm93IG5ldyBoaTt2YXIgbj1NYXRoLmFicyh0KSxyPU1hdGguYWJzKGUpO3JldHVybiB0Pj0wP2U+PTA/bj49cj8wOjE6bj49cj83OjY6ZT49MD9uPj1yPzM6MjpuPj1yPzQ6NX1pZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1vLngtaS54LGE9by55LWkueTtpZigwPT09cyYmMD09PWEpdGhyb3cgbmV3IGhpO3JldHVybiB2YS5vY3RhbnQocyxhKX19O3ZhciBfYT1mdW5jdGlvbigpe307X2EucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7fSxfYS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe30sX2EucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7fSxfYS5wcm90b3R5cGUuaXNDbG9zZWQ9ZnVuY3Rpb24oKXt9LF9hLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe30sX2EucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXt9LF9hLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxfYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gX2F9O3ZhciB4YT1mdW5jdGlvbigpe307eGEucHJvdG90eXBlLmFkZEludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUpe30seGEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW19hXX0seGEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHhhfTt2YXIgd2E9ZnVuY3Rpb24oKXt0aGlzLl9ub2RlTGlzdD1uZXcgbWEodGhpcyksdGhpcy5fcHRzPW51bGwsdGhpcy5fZGF0YT1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9wdHM9dCx0aGlzLl9kYXRhPWV9O3dhLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHN9LHdhLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0cy5sZW5ndGh9LHdhLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdHNbdF19LHdhLnByb3RvdHlwZS5pc0Nsb3NlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdHNbMF0uZXF1YWxzKHRoaXMuX3B0c1t0aGlzLl9wdHMubGVuZ3RoLTFdKX0sd2EucHJvdG90eXBlLmdldFNlZ21lbnRPY3RhbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT10aGlzLl9wdHMubGVuZ3RoLTE/LTE6dGhpcy5zYWZlT2N0YW50KHRoaXMuZ2V0Q29vcmRpbmF0ZSh0KSx0aGlzLmdldENvb3JkaW5hdGUodCsxKSl9LHdhLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe3RoaXMuX2RhdGE9dH0sd2EucHJvdG90eXBlLnNhZmVPY3RhbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5lcXVhbHMyRChlKT8wOnZhLm9jdGFudCh0LGUpfSx3YS5wcm90b3R5cGUuZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSx3YS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLmFkZEludGVyc2VjdGlvbk5vZGUodCxlKX1lbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbM10saT1uZXcgdmkoYXJndW1lbnRzWzBdLmdldEludGVyc2VjdGlvbihyKSk7dGhpcy5hZGRJbnRlcnNlY3Rpb24oaSxuKX19LHdhLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBYaS50b0xpbmVTdHJpbmcobmV3IHhzKHRoaXMuX3B0cykpfSx3YS5wcm90b3R5cGUuZ2V0Tm9kZUxpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZUxpc3R9LHdhLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb25Ob2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZSxyPW4rMTtpZihyPHRoaXMuX3B0cy5sZW5ndGgpe3ZhciBpPXRoaXMuX3B0c1tyXTt0LmVxdWFsczJEKGkpJiYobj1yKX1yZXR1cm4gdGhpcy5fbm9kZUxpc3QuYWRkKHQsbil9LHdhLnByb3RvdHlwZS5hZGRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MDtyPHQuZ2V0SW50ZXJzZWN0aW9uTnVtKCk7cisrKXRoaXMuYWRkSW50ZXJzZWN0aW9uKHQsZSxuLHIpfSx3YS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5beGFdfSx3YS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gd2F9LHdhLmdldE5vZGVkU3Vic3RyaW5ncz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1uZXcgeG87cmV0dXJuIHdhLmdldE5vZGVkU3Vic3RyaW5ncyh0LGUpLGV9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7ci5uZXh0KCkuZ2V0Tm9kZUxpc3QoKS5hZGRTcGxpdEVkZ2VzKG4pfX07dmFyIGJhPWZ1bmN0aW9uKCl7aWYodGhpcy5wMD1udWxsLHRoaXMucDE9bnVsbCwwPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLnAwPW5ldyB2aSx0aGlzLnAxPW5ldyB2aTtlbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5wMD1uZXcgdmkodC5wMCksdGhpcy5wMT1uZXcgdmkodC5wMSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl0aGlzLnAwPWFyZ3VtZW50c1swXSx0aGlzLnAxPWFyZ3VtZW50c1sxXTtlbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl0saT1hcmd1bWVudHNbM107dGhpcy5wMD1uZXcgdmkoZSxuKSx0aGlzLnAxPW5ldyB2aShyLGkpfX0sRGE9e3NlcmlhbFZlcnNpb25VSUQ6e2NvbmZpZ3VyYWJsZTohMH19O2JhLnByb3RvdHlwZS5taW5YPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKHRoaXMucDAueCx0aGlzLnAxLngpfSxiYS5wcm90b3R5cGUub3JpZW50YXRpb25JbmRleD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgYmEpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWVvLm9yaWVudGF0aW9uSW5kZXgodGhpcy5wMCx0aGlzLnAxLHQucDApLG49ZW8ub3JpZW50YXRpb25JbmRleCh0aGlzLnAwLHRoaXMucDEsdC5wMSk7cmV0dXJuIGU+PTAmJm4+PTB8fGU8PTAmJm48PTA/TWF0aC5tYXgoZSxuKTowfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciByPWFyZ3VtZW50c1swXTtyZXR1cm4gZW8ub3JpZW50YXRpb25JbmRleCh0aGlzLnAwLHRoaXMucDEscil9fSxiYS5wcm90b3R5cGUudG9HZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdC5jcmVhdGVMaW5lU3RyaW5nKFt0aGlzLnAwLHRoaXMucDFdKX0sYmEucHJvdG90eXBlLmlzVmVydGljYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wMC54PT09dGhpcy5wMS54fSxiYS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIGJhKSlyZXR1cm4hMTt2YXIgZT10O3JldHVybiB0aGlzLnAwLmVxdWFscyhlLnAwKSYmdGhpcy5wMS5lcXVhbHMoZS5wMSl9LGJhLnByb3RvdHlwZS5pbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFFpO3JldHVybiBlLmNvbXB1dGVJbnRlcnNlY3Rpb24odGhpcy5wMCx0aGlzLnAxLHQucDAsdC5wMSksZS5oYXNJbnRlcnNlY3Rpb24oKT9lLmdldEludGVyc2VjdGlvbigwKTpudWxsfSxiYS5wcm90b3R5cGUucHJvamVjdD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciB0PWFyZ3VtZW50c1swXTtpZih0LmVxdWFscyh0aGlzLnAwKXx8dC5lcXVhbHModGhpcy5wMSkpcmV0dXJuIG5ldyB2aSh0KTt2YXIgZT10aGlzLnByb2plY3Rpb25GYWN0b3IodCksbj1uZXcgdmk7cmV0dXJuIG4ueD10aGlzLnAwLngrZSoodGhpcy5wMS54LXRoaXMucDAueCksbi55PXRoaXMucDAueStlKih0aGlzLnAxLnktdGhpcy5wMC55KSxufWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgYmEpe3ZhciByPWFyZ3VtZW50c1swXSxpPXRoaXMucHJvamVjdGlvbkZhY3RvcihyLnAwKSxvPXRoaXMucHJvamVjdGlvbkZhY3RvcihyLnAxKTtpZihpPj0xJiZvPj0xfHxpPD0wJiZvPD0wKXJldHVybiBudWxsO3ZhciBzPXRoaXMucHJvamVjdChyLnAwKTtpPDAmJihzPXRoaXMucDApLGk+MSYmKHM9dGhpcy5wMSk7dmFyIGE9dGhpcy5wcm9qZWN0KHIucDEpO3JldHVybiBvPDAmJihhPXRoaXMucDApLG8+MSYmKGE9dGhpcy5wMSksbmV3IGJhKHMsYSl9fSxiYS5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKCl7dGhpcy5wMS5jb21wYXJlVG8odGhpcy5wMCk8MCYmdGhpcy5yZXZlcnNlKCl9LGJhLnByb3RvdHlwZS5hbmdsZT1mdW5jdGlvbigpe3JldHVybiBNYXRoLmF0YW4yKHRoaXMucDEueS10aGlzLnAwLnksdGhpcy5wMS54LXRoaXMucDAueCl9LGJhLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dD90aGlzLnAwOnRoaXMucDF9LGJhLnByb3RvdHlwZS5kaXN0YW5jZVBlcnBlbmRpY3VsYXI9ZnVuY3Rpb24odCl7cmV0dXJuIGVvLmRpc3RhbmNlUG9pbnRMaW5lUGVycGVuZGljdWxhcih0LHRoaXMucDAsdGhpcy5wMSl9LGJhLnByb3RvdHlwZS5taW5ZPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKHRoaXMucDAueSx0aGlzLnAxLnkpfSxiYS5wcm90b3R5cGUubWlkUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gYmEubWlkUG9pbnQodGhpcy5wMCx0aGlzLnAxKX0sYmEucHJvdG90eXBlLnByb2plY3Rpb25GYWN0b3I9ZnVuY3Rpb24odCl7aWYodC5lcXVhbHModGhpcy5wMCkpcmV0dXJuIDA7aWYodC5lcXVhbHModGhpcy5wMSkpcmV0dXJuIDE7dmFyIGU9dGhpcy5wMS54LXRoaXMucDAueCxuPXRoaXMucDEueS10aGlzLnAwLnkscj1lKmUrbipuO3JldHVybiByPD0wP2ZpLk5hTjooKHQueC10aGlzLnAwLngpKmUrKHQueS10aGlzLnAwLnkpKm4pL3J9LGJhLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaW50ZXJzZWN0aW9uKHQpO2lmKG51bGwhPT1lKXJldHVybltlLGVdO3ZhciBuPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHI9ZmkuTUFYX1ZBTFVFLGk9bnVsbCxvPXRoaXMuY2xvc2VzdFBvaW50KHQucDApO3I9by5kaXN0YW5jZSh0LnAwKSxuWzBdPW8sblsxXT10LnAwO3ZhciBzPXRoaXMuY2xvc2VzdFBvaW50KHQucDEpOyhpPXMuZGlzdGFuY2UodC5wMSkpPHImJihyPWksblswXT1zLG5bMV09dC5wMSk7dmFyIGE9dC5jbG9zZXN0UG9pbnQodGhpcy5wMCk7KGk9YS5kaXN0YW5jZSh0aGlzLnAwKSk8ciYmKHI9aSxuWzBdPXRoaXMucDAsblsxXT1hKTt2YXIgdT10LmNsb3Nlc3RQb2ludCh0aGlzLnAxKTtyZXR1cm4oaT11LmRpc3RhbmNlKHRoaXMucDEpKTxyJiYocj1pLG5bMF09dGhpcy5wMSxuWzFdPXUpLG59LGJhLnByb3RvdHlwZS5jbG9zZXN0UG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wcm9qZWN0aW9uRmFjdG9yKHQpO3JldHVybiBlPjAmJmU8MT90aGlzLnByb2plY3QodCk6dGhpcy5wMC5kaXN0YW5jZSh0KTx0aGlzLnAxLmRpc3RhbmNlKHQpP3RoaXMucDA6dGhpcy5wMX0sYmEucHJvdG90eXBlLm1heFg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgodGhpcy5wMC54LHRoaXMucDEueCl9LGJhLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wMC5kaXN0YW5jZSh0aGlzLnAxKX0sYmEucHJvdG90eXBlLmNvbXBhcmVUbz1mdW5jdGlvbih0KXt2YXIgZT10LG49dGhpcy5wMC5jb21wYXJlVG8oZS5wMCk7cmV0dXJuIDAhPT1uP246dGhpcy5wMS5jb21wYXJlVG8oZS5wMSl9LGJhLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wMDt0aGlzLnAwPXRoaXMucDEsdGhpcy5wMT10fSxiYS5wcm90b3R5cGUuZXF1YWxzVG9wbz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wMC5lcXVhbHModC5wMCkmJih0aGlzLnAxLmVxdWFscyh0LnAxKXx8dGhpcy5wMC5lcXVhbHModC5wMSkpJiZ0aGlzLnAxLmVxdWFscyh0LnAwKX0sYmEucHJvdG90eXBlLmxpbmVJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB6aS5pbnRlcnNlY3Rpb24odGhpcy5wMCx0aGlzLnAxLHQucDAsdC5wMSl9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2YgQmkpKXRocm93IHR9cmV0dXJuIG51bGx9LGJhLnByb3RvdHlwZS5tYXhZPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWF4KHRoaXMucDAueSx0aGlzLnAxLnkpfSxiYS5wcm90b3R5cGUucG9pbnRBbG9uZ09mZnNldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMucDAueCt0Kih0aGlzLnAxLngtdGhpcy5wMC54KSxyPXRoaXMucDAueSt0Kih0aGlzLnAxLnktdGhpcy5wMC55KSxpPXRoaXMucDEueC10aGlzLnAwLngsbz10aGlzLnAxLnktdGhpcy5wMC55LHM9TWF0aC5zcXJ0KGkqaStvKm8pLGE9MCx1PTA7aWYoMCE9PWUpe2lmKHM8PTApdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29tcHV0ZSBvZmZzZXQgZnJvbSB6ZXJvLWxlbmd0aCBsaW5lIHNlZ21lbnQiKTthPWUqaS9zLHU9ZSpvL3N9cmV0dXJuIG5ldyB2aShuLXUscithKX0sYmEucHJvdG90eXBlLnNldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldENvb3JkaW5hdGVzKHQucDAsdC5wMSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMucDAueD1lLngsdGhpcy5wMC55PWUueSx0aGlzLnAxLng9bi54LHRoaXMucDEueT1uLnl9fSxiYS5wcm90b3R5cGUuc2VnbWVudEZyYWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHJvamVjdGlvbkZhY3Rvcih0KTtyZXR1cm4gZTwwP2U9MDooZT4xfHxmaS5pc05hTihlKSkmJihlPTEpLGV9LGJhLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJMSU5FU1RSSU5HKCAiK3RoaXMucDAueCsiICIrdGhpcy5wMC55KyIsICIrdGhpcy5wMS54KyIgIit0aGlzLnAxLnkrIikifSxiYS5wcm90b3R5cGUuaXNIb3Jpem9udGFsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucDAueT09PXRoaXMucDEueX0sYmEucHJvdG90eXBlLmRpc3RhbmNlPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBiYSl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBlby5kaXN0YW5jZUxpbmVMaW5lKHRoaXMucDAsdGhpcy5wMSx0LnAwLHQucDEpfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygdmkpe3ZhciBlPWFyZ3VtZW50c1swXTtyZXR1cm4gZW8uZGlzdGFuY2VQb2ludExpbmUoZSx0aGlzLnAwLHRoaXMucDEpfX0sYmEucHJvdG90eXBlLnBvaW50QWxvbmc9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHZpO3JldHVybiBlLng9dGhpcy5wMC54K3QqKHRoaXMucDEueC10aGlzLnAwLngpLGUueT10aGlzLnAwLnkrdCoodGhpcy5wMS55LXRoaXMucDAueSksZX0sYmEucHJvdG90eXBlLmhhc2hDb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9ZmkuZG91YmxlVG9Mb25nQml0cyh0aGlzLnAwLngpO3RePTMxKmZpLmRvdWJsZVRvTG9uZ0JpdHModGhpcy5wMC55KTt2YXIgZT1NYXRoLnRydW5jKHQpXk1hdGgudHJ1bmModD4+MzIpLG49ZmkuZG91YmxlVG9Mb25nQml0cyh0aGlzLnAxLngpO3JldHVybiBuXj0zMSpmaS5kb3VibGVUb0xvbmdCaXRzKHRoaXMucDEueSksZV4oTWF0aC50cnVuYyhuKV5NYXRoLnRydW5jKG4+PjMyKSl9LGJhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaSxtaV19LGJhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBiYX0sYmEubWlkUG9pbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHZpKCh0LngrZS54KS8yLCh0LnkrZS55KS8yKX0sRGEuc2VyaWFsVmVyc2lvblVJRC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMHgyZDIxNzIxMzVmNDExYzAwfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiYSxEYSk7dmFyIEVhPWZ1bmN0aW9uKCl7dGhpcy50ZW1wRW52MT1uZXcgamksdGhpcy50ZW1wRW52Mj1uZXcgamksdGhpcy5fb3ZlcmxhcFNlZzE9bmV3IGJhLHRoaXMuX292ZXJsYXBTZWcyPW5ldyBiYX07RWEucHJvdG90eXBlLm92ZXJsYXA9ZnVuY3Rpb24oKXtpZigyIT09YXJndW1lbnRzLmxlbmd0aCYmND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1sxXSxlPWFyZ3VtZW50c1syXSxuPWFyZ3VtZW50c1szXTthcmd1bWVudHNbMF0uZ2V0TGluZVNlZ21lbnQodCx0aGlzLl9vdmVybGFwU2VnMSksZS5nZXRMaW5lU2VnbWVudChuLHRoaXMuX292ZXJsYXBTZWcyKSx0aGlzLm92ZXJsYXAodGhpcy5fb3ZlcmxhcFNlZzEsdGhpcy5fb3ZlcmxhcFNlZzIpfX0sRWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEVhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBFYX07dmFyIENhPWZ1bmN0aW9uKCl7dGhpcy5fcHRzPW51bGwsdGhpcy5fc3RhcnQ9bnVsbCx0aGlzLl9lbmQ9bnVsbCx0aGlzLl9lbnY9bnVsbCx0aGlzLl9jb250ZXh0PW51bGwsdGhpcy5faWQ9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1hcmd1bWVudHNbM107dGhpcy5fcHRzPXQsdGhpcy5fc3RhcnQ9ZSx0aGlzLl9lbmQ9bix0aGlzLl9jb250ZXh0PXJ9O0NhLnByb3RvdHlwZS5nZXRMaW5lU2VnbWVudD1mdW5jdGlvbih0LGUpe2UucDA9dGhpcy5fcHRzW3RdLGUucDE9dGhpcy5fcHRzW3QrMV19LENhLnByb3RvdHlwZS5jb21wdXRlU2VsZWN0PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPXRoaXMuX3B0c1tlXSxvPXRoaXMuX3B0c1tuXTtpZihyLnRlbXBFbnYxLmluaXQoaSxvKSxuLWU9PTEpcmV0dXJuIHIuc2VsZWN0KHRoaXMsZSksbnVsbDtpZighdC5pbnRlcnNlY3RzKHIudGVtcEVudjEpKXJldHVybiBudWxsO3ZhciBzPU1hdGgudHJ1bmMoKGUrbikvMik7ZTxzJiZ0aGlzLmNvbXB1dGVTZWxlY3QodCxlLHMsciksczxuJiZ0aGlzLmNvbXB1dGVTZWxlY3QodCxzLG4scil9LENhLnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkodGhpcy5fZW5kLXRoaXMuX3N0YXJ0KzEpLmZpbGwobnVsbCksZT0wLG49dGhpcy5fc3RhcnQ7bjw9dGhpcy5fZW5kO24rKyl0W2UrK109dGhpcy5fcHRzW25dO3JldHVybiB0fSxDYS5wcm90b3R5cGUuY29tcHV0ZU92ZXJsYXBzPWZ1bmN0aW9uKHQsZSl7dGhpcy5jb21wdXRlT3ZlcmxhcHNJbnRlcm5hbCh0aGlzLl9zdGFydCx0aGlzLl9lbmQsdCx0Ll9zdGFydCx0Ll9lbmQsZSl9LENhLnByb3RvdHlwZS5zZXRJZD1mdW5jdGlvbih0KXt0aGlzLl9pZD10fSxDYS5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKHQsZSl7dGhpcy5jb21wdXRlU2VsZWN0KHQsdGhpcy5fc3RhcnQsdGhpcy5fZW5kLGUpfSxDYS5wcm90b3R5cGUuZ2V0RW52ZWxvcGU9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fZW52KXt2YXIgdD10aGlzLl9wdHNbdGhpcy5fc3RhcnRdLGU9dGhpcy5fcHRzW3RoaXMuX2VuZF07dGhpcy5fZW52PW5ldyBqaSh0LGUpfXJldHVybiB0aGlzLl9lbnZ9LENhLnByb3RvdHlwZS5nZXRFbmRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmR9LENhLnByb3RvdHlwZS5nZXRTdGFydEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YXJ0fSxDYS5wcm90b3R5cGUuZ2V0Q29udGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb250ZXh0fSxDYS5wcm90b3R5cGUuZ2V0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWR9LENhLnByb3RvdHlwZS5jb21wdXRlT3ZlcmxhcHNJbnRlcm5hbD1mdW5jdGlvbih0LGUsbixyLGksbyl7dmFyIHM9dGhpcy5fcHRzW3RdLGE9dGhpcy5fcHRzW2VdLHU9bi5fcHRzW3JdLGM9bi5fcHRzW2ldO2lmKGUtdD09MSYmaS1yPT0xKXJldHVybiBvLm92ZXJsYXAodGhpcyx0LG4sciksbnVsbDtpZihvLnRlbXBFbnYxLmluaXQocyxhKSxvLnRlbXBFbnYyLmluaXQodSxjKSwhby50ZW1wRW52MS5pbnRlcnNlY3RzKG8udGVtcEVudjIpKXJldHVybiBudWxsO3ZhciBsPU1hdGgudHJ1bmMoKHQrZSkvMiksaD1NYXRoLnRydW5jKChyK2kpLzIpO3Q8bCYmKHI8aCYmdGhpcy5jb21wdXRlT3ZlcmxhcHNJbnRlcm5hbCh0LGwsbixyLGgsbyksaDxpJiZ0aGlzLmNvbXB1dGVPdmVybGFwc0ludGVybmFsKHQsbCxuLGgsaSxvKSksbDxlJiYocjxoJiZ0aGlzLmNvbXB1dGVPdmVybGFwc0ludGVybmFsKGwsZSxuLHIsaCxvKSxoPGkmJnRoaXMuY29tcHV0ZU92ZXJsYXBzSW50ZXJuYWwobCxlLG4saCxpLG8pKX0sQ2EucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LENhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDYX07dmFyIFNhPWZ1bmN0aW9uKCl7fTtTYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sU2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFNhfSxTYS5nZXRDaGFpblN0YXJ0SW5kaWNlcz1mdW5jdGlvbih0KXt2YXIgZT0wLG49bmV3IHhvO24uYWRkKG5ldyBOaShlKSk7ZG97dmFyIHI9U2EuZmluZENoYWluRW5kKHQsZSk7bi5hZGQobmV3IE5pKHIpKSxlPXJ9d2hpbGUoZTx0Lmxlbmd0aC0xKTtyZXR1cm4gU2EudG9JbnRBcnJheShuKX0sU2EuZmluZENoYWluRW5kPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWU7bjx0Lmxlbmd0aC0xJiZ0W25dLmVxdWFsczJEKHRbbisxXSk7KW4rKztpZihuPj10Lmxlbmd0aC0xKXJldHVybiB0Lmxlbmd0aC0xO2Zvcih2YXIgcj1Xcy5xdWFkcmFudCh0W25dLHRbbisxXSksaT1lKzE7aTx0Lmxlbmd0aDspe2lmKCF0W2ktMV0uZXF1YWxzMkQodFtpXSkpaWYoV3MucXVhZHJhbnQodFtpLTFdLHRbaV0pIT09cilicmVhaztpKyt9cmV0dXJuIGktMX0sU2EuZ2V0Q2hhaW5zPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIFNhLmdldENoYWlucyhhcmd1bWVudHNbMF0sbnVsbCk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1uZXcgeG8scj1TYS5nZXRDaGFpblN0YXJ0SW5kaWNlcyh0KSxpPTA7aTxyLmxlbmd0aC0xO2krKyl7dmFyIG89bmV3IENhKHQscltpXSxyW2krMV0sZSk7bi5hZGQobyl9cmV0dXJuIG59fSxTYS50b0ludEFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCksbj0wO248ZS5sZW5ndGg7bisrKWVbbl09dC5nZXQobikuaW50VmFsdWUoKTtyZXR1cm4gZX07dmFyIEFhPWZ1bmN0aW9uKCl7fTtBYS5wcm90b3R5cGUuY29tcHV0ZU5vZGVzPWZ1bmN0aW9uKHQpe30sQWEucHJvdG90eXBlLmdldE5vZGVkU3Vic3RyaW5ncz1mdW5jdGlvbigpe30sQWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEFhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBBYX07dmFyIE5hPWZ1bmN0aW9uKCl7aWYodGhpcy5fc2VnSW50PW51bGwsMCE9PWFyZ3VtZW50cy5sZW5ndGgmJjE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRTZWdtZW50SW50ZXJzZWN0b3IodCl9fTtOYS5wcm90b3R5cGUuc2V0U2VnbWVudEludGVyc2VjdG9yPWZ1bmN0aW9uKHQpe3RoaXMuX3NlZ0ludD10fSxOYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bQWFdfSxOYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTmF9O3ZhciBJYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2U/dC5jYWxsKHRoaXMsZSk6dC5jYWxsKHRoaXMpLHRoaXMuX21vbm9DaGFpbnM9bmV3IHhvLHRoaXMuX2luZGV4PW5ldyBwYSx0aGlzLl9pZENvdW50ZXI9MCx0aGlzLl9ub2RlZFNlZ1N0cmluZ3M9bnVsbCx0aGlzLl9uT3ZlcmxhcHM9MH10JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTt2YXIgbj17U2VnbWVudE92ZXJsYXBBY3Rpb246e2NvbmZpZ3VyYWJsZTohMH19O3JldHVybiBlLnByb3RvdHlwZS5nZXRNb25vdG9uZUNoYWlucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb25vQ2hhaW5zfSxlLnByb3RvdHlwZS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gd2EuZ2V0Tm9kZWRTdWJzdHJpbmdzKHRoaXMuX25vZGVkU2VnU3RyaW5ncyl9LGUucHJvdG90eXBlLmdldEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2luZGV4fSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj1TYS5nZXRDaGFpbnModC5nZXRDb29yZGluYXRlcygpLHQpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtyLnNldElkKGUuX2lkQ291bnRlcisrKSxlLl9pbmRleC5pbnNlcnQoci5nZXRFbnZlbG9wZSgpLHIpLGUuX21vbm9DaGFpbnMuYWRkKHIpfX0sZS5wcm90b3R5cGUuY29tcHV0ZU5vZGVzPWZ1bmN0aW9uKHQpe3RoaXMuX25vZGVkU2VnU3RyaW5ncz10O2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXRoaXMuYWRkKGUubmV4dCgpKTt0aGlzLmludGVyc2VjdENoYWlucygpfSxlLnByb3RvdHlwZS5pbnRlcnNlY3RDaGFpbnM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPW5ldyBNYSh0aGlzLl9zZWdJbnQpLG49dGhpcy5fbW9ub0NoYWlucy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOylmb3IodmFyIHI9bi5uZXh0KCksaT10Ll9pbmRleC5xdWVyeShyLmdldEVudmVsb3BlKCkpLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKTtpZihvLmdldElkKCk+ci5nZXRJZCgpJiYoci5jb21wdXRlT3ZlcmxhcHMobyxlKSx0Ll9uT3ZlcmxhcHMrKyksdC5fc2VnSW50LmlzRG9uZSgpKXJldHVybiBudWxsfX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5TZWdtZW50T3ZlcmxhcEFjdGlvbi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsbiksZX0oTmEpLE1hPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5fc2k9bnVsbDt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5fc2k9ZX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUub3ZlcmxhcD1mdW5jdGlvbigpe2lmKDQhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5vdmVybGFwLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1hcmd1bWVudHNbM10saT1hcmd1bWVudHNbMF0uZ2V0Q29udGV4dCgpLG89bi5nZXRDb250ZXh0KCk7dGhpcy5fc2kucHJvY2Vzc0ludGVyc2VjdGlvbnMoaSxlLG8scil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KEVhKSxGYT1mdW5jdGlvbiB0KCl7aWYodGhpcy5fcXVhZHJhbnRTZWdtZW50cz10LkRFRkFVTFRfUVVBRFJBTlRfU0VHTUVOVFMsdGhpcy5fZW5kQ2FwU3R5bGU9dC5DQVBfUk9VTkQsdGhpcy5fam9pblN0eWxlPXQuSk9JTl9ST1VORCx0aGlzLl9taXRyZUxpbWl0PXQuREVGQVVMVF9NSVRSRV9MSU1JVCx0aGlzLl9pc1NpbmdsZVNpZGVkPSExLHRoaXMuX3NpbXBsaWZ5RmFjdG9yPXQuREVGQVVMVF9TSU1QTElGWV9GQUNUT1IsMCE9PWFyZ3VtZW50cy5sZW5ndGgpaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXTt0aGlzLnNldFF1YWRyYW50U2VnbWVudHMoZSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMuc2V0UXVhZHJhbnRTZWdtZW50cyhuKSx0aGlzLnNldEVuZENhcFN0eWxlKHIpfWVsc2UgaWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSxzPWFyZ3VtZW50c1syXSxhPWFyZ3VtZW50c1szXTt0aGlzLnNldFF1YWRyYW50U2VnbWVudHMoaSksdGhpcy5zZXRFbmRDYXBTdHlsZShvKSx0aGlzLnNldEpvaW5TdHlsZShzKSx0aGlzLnNldE1pdHJlTGltaXQoYSl9fSxUYT17Q0FQX1JPVU5EOntjb25maWd1cmFibGU6ITB9LENBUF9GTEFUOntjb25maWd1cmFibGU6ITB9LENBUF9TUVVBUkU6e2NvbmZpZ3VyYWJsZTohMH0sSk9JTl9ST1VORDp7Y29uZmlndXJhYmxlOiEwfSxKT0lOX01JVFJFOntjb25maWd1cmFibGU6ITB9LEpPSU5fQkVWRUw6e2NvbmZpZ3VyYWJsZTohMH0sREVGQVVMVF9RVUFEUkFOVF9TRUdNRU5UUzp7Y29uZmlndXJhYmxlOiEwfSxERUZBVUxUX01JVFJFX0xJTUlUOntjb25maWd1cmFibGU6ITB9LERFRkFVTFRfU0lNUExJRllfRkFDVE9SOntjb25maWd1cmFibGU6ITB9fTtGYS5wcm90b3R5cGUuZ2V0RW5kQ2FwU3R5bGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW5kQ2FwU3R5bGV9LEZhLnByb3RvdHlwZS5pc1NpbmdsZVNpZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzU2luZ2xlU2lkZWR9LEZhLnByb3RvdHlwZS5zZXRRdWFkcmFudFNlZ21lbnRzPWZ1bmN0aW9uKHQpe3RoaXMuX3F1YWRyYW50U2VnbWVudHM9dCwwPT09dGhpcy5fcXVhZHJhbnRTZWdtZW50cyYmKHRoaXMuX2pvaW5TdHlsZT1GYS5KT0lOX0JFVkVMKSx0aGlzLl9xdWFkcmFudFNlZ21lbnRzPDAmJih0aGlzLl9qb2luU3R5bGU9RmEuSk9JTl9NSVRSRSx0aGlzLl9taXRyZUxpbWl0PU1hdGguYWJzKHRoaXMuX3F1YWRyYW50U2VnbWVudHMpKSx0PD0wJiYodGhpcy5fcXVhZHJhbnRTZWdtZW50cz0xKSx0aGlzLl9qb2luU3R5bGUhPT1GYS5KT0lOX1JPVU5EJiYodGhpcy5fcXVhZHJhbnRTZWdtZW50cz1GYS5ERUZBVUxUX1FVQURSQU5UX1NFR01FTlRTKX0sRmEucHJvdG90eXBlLmdldEpvaW5TdHlsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9qb2luU3R5bGV9LEZhLnByb3RvdHlwZS5zZXRKb2luU3R5bGU9ZnVuY3Rpb24odCl7dGhpcy5fam9pblN0eWxlPXR9LEZhLnByb3RvdHlwZS5zZXRTaW1wbGlmeUZhY3Rvcj1mdW5jdGlvbih0KXt0aGlzLl9zaW1wbGlmeUZhY3Rvcj10PDA/MDp0fSxGYS5wcm90b3R5cGUuZ2V0U2ltcGxpZnlGYWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2ltcGxpZnlGYWN0b3J9LEZhLnByb3RvdHlwZS5nZXRRdWFkcmFudFNlZ21lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3F1YWRyYW50U2VnbWVudHN9LEZhLnByb3RvdHlwZS5zZXRFbmRDYXBTdHlsZT1mdW5jdGlvbih0KXt0aGlzLl9lbmRDYXBTdHlsZT10fSxGYS5wcm90b3R5cGUuZ2V0TWl0cmVMaW1pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9taXRyZUxpbWl0fSxGYS5wcm90b3R5cGUuc2V0TWl0cmVMaW1pdD1mdW5jdGlvbih0KXt0aGlzLl9taXRyZUxpbWl0PXR9LEZhLnByb3RvdHlwZS5zZXRTaW5nbGVTaWRlZD1mdW5jdGlvbih0KXt0aGlzLl9pc1NpbmdsZVNpZGVkPXR9LEZhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxGYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRmF9LEZhLmJ1ZmZlckRpc3RhbmNlRXJyb3I9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5QSS8yL3Q7cmV0dXJuIDEtTWF0aC5jb3MoZS8yKX0sVGEuQ0FQX1JPVU5ELmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxUYS5DQVBfRkxBVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sVGEuQ0FQX1NRVUFSRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gM30sVGEuSk9JTl9ST1VORC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sVGEuSk9JTl9NSVRSRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMn0sVGEuSk9JTl9CRVZFTC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gM30sVGEuREVGQVVMVF9RVUFEUkFOVF9TRUdNRU5UUy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gOH0sVGEuREVGQVVMVF9NSVRSRV9MSU1JVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gNX0sVGEuREVGQVVMVF9TSU1QTElGWV9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLjAxfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGYSxUYSk7dmFyIE9hPWZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3RhbmNlVG9sPW51bGwsdGhpcy5faXNEZWxldGVkPW51bGwsdGhpcy5fYW5nbGVPcmllbnRhdGlvbj1lby5DT1VOVEVSQ0xPQ0tXSVNFLHRoaXMuX2lucHV0TGluZT10fHxudWxsfSxMYT17SU5JVDp7Y29uZmlndXJhYmxlOiEwfSxERUxFVEU6e2NvbmZpZ3VyYWJsZTohMH0sS0VFUDp7Y29uZmlndXJhYmxlOiEwfSxOVU1fUFRTX1RPX0NIRUNLOntjb25maWd1cmFibGU6ITB9fTtPYS5wcm90b3R5cGUuaXNEZWxldGFibGU9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcy5faW5wdXRMaW5lW3RdLG89dGhpcy5faW5wdXRMaW5lW2VdLHM9dGhpcy5faW5wdXRMaW5lW25dO3JldHVybiEoIXRoaXMuaXNDb25jYXZlKGksbyxzKXx8IXRoaXMuaXNTaGFsbG93KGksbyxzLHIpKSYmdGhpcy5pc1NoYWxsb3dTYW1wbGVkKGksbyx0LG4scil9LE9hLnByb3RvdHlwZS5kZWxldGVTaGFsbG93Q29uY2F2aXRpZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPTEsbj10aGlzLmZpbmROZXh0Tm9uRGVsZXRlZEluZGV4KGUpLHI9dGhpcy5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleChuKSxpPSExO3I8dGhpcy5faW5wdXRMaW5lLmxlbmd0aDspe3ZhciBvPSExO3QuaXNEZWxldGFibGUoZSxuLHIsdC5fZGlzdGFuY2VUb2wpJiYodC5faXNEZWxldGVkW25dPU9hLkRFTEVURSxvPSEwLGk9ITApLGU9bz9yOm4sbj10LmZpbmROZXh0Tm9uRGVsZXRlZEluZGV4KGUpLHI9dC5maW5kTmV4dE5vbkRlbGV0ZWRJbmRleChuKX1yZXR1cm4gaX0sT2EucHJvdG90eXBlLmlzU2hhbGxvd0NvbmNhdml0eT1mdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gZW8uY29tcHV0ZU9yaWVudGF0aW9uKHQsZSxuKT09PXRoaXMuX2FuZ2xlT3JpZW50YXRpb24mJmVvLmRpc3RhbmNlUG9pbnRMaW5lKGUsdCxuKTxyfSxPYS5wcm90b3R5cGUuaXNTaGFsbG93U2FtcGxlZD1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPU1hdGgudHJ1bmMoKHItbikvT2EuTlVNX1BUU19UT19DSEVDSyk7bzw9MCYmKG89MSk7Zm9yKHZhciBzPW47czxyO3MrPW8paWYoIXRoaXMuaXNTaGFsbG93KHQsZSx0aGlzLl9pbnB1dExpbmVbc10saSkpcmV0dXJuITE7cmV0dXJuITB9LE9hLnByb3RvdHlwZS5pc0NvbmNhdmU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlby5jb21wdXRlT3JpZW50YXRpb24odCxlLG4pPT09dGhpcy5fYW5nbGVPcmllbnRhdGlvbn0sT2EucHJvdG90eXBlLnNpbXBsaWZ5PWZ1bmN0aW9uKHQpe3RoaXMuX2Rpc3RhbmNlVG9sPU1hdGguYWJzKHQpLHQ8MCYmKHRoaXMuX2FuZ2xlT3JpZW50YXRpb249ZW8uQ0xPQ0tXSVNFKSx0aGlzLl9pc0RlbGV0ZWQ9bmV3IEFycmF5KHRoaXMuX2lucHV0TGluZS5sZW5ndGgpLmZpbGwobnVsbCk7dmFyIGU9ITE7ZG97ZT10aGlzLmRlbGV0ZVNoYWxsb3dDb25jYXZpdGllcygpfXdoaWxlKGUpO3JldHVybiB0aGlzLmNvbGxhcHNlTGluZSgpfSxPYS5wcm90b3R5cGUuZmluZE5leHROb25EZWxldGVkSW5kZXg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXQrMTtlPHRoaXMuX2lucHV0TGluZS5sZW5ndGgmJnRoaXMuX2lzRGVsZXRlZFtlXT09PU9hLkRFTEVURTspZSsrO3JldHVybiBlfSxPYS5wcm90b3R5cGUuaXNTaGFsbG93PWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBlby5kaXN0YW5jZVBvaW50TGluZShlLHQsbik8cn0sT2EucHJvdG90eXBlLmNvbGxhcHNlTGluZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgYm8sZT0wO2U8dGhpcy5faW5wdXRMaW5lLmxlbmd0aDtlKyspdGhpcy5faXNEZWxldGVkW2VdIT09T2EuREVMRVRFJiZ0LmFkZCh0aGlzLl9pbnB1dExpbmVbZV0pO3JldHVybiB0LnRvQ29vcmRpbmF0ZUFycmF5KCl9LE9hLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxPYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gT2F9LE9hLnNpbXBsaWZ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBPYSh0KS5zaW1wbGlmeShlKX0sTGEuSU5JVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sTGEuREVMRVRFLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxMYS5LRUVQLmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxMYS5OVU1fUFRTX1RPX0NIRUNLLmdldD1mdW5jdGlvbigpe3JldHVybiAxMH0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoT2EsTGEpO3ZhciBQYT1mdW5jdGlvbigpe3RoaXMuX3B0TGlzdD1udWxsLHRoaXMuX3ByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5fbWluaW1pbVZlcnRleERpc3RhbmNlPTAsdGhpcy5fcHRMaXN0PW5ldyB4b30sUmE9e0NPT1JESU5BVEVfQVJSQVlfVFlQRTp7Y29uZmlndXJhYmxlOiEwfX07UGEucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0TGlzdC50b0FycmF5KFBhLkNPT1JESU5BVEVfQVJSQVlfVFlQRSl9LFBhLnByb3RvdHlwZS5zZXRQcmVjaXNpb25Nb2RlbD1mdW5jdGlvbih0KXt0aGlzLl9wcmVjaXNpb25Nb2RlbD10fSxQYS5wcm90b3R5cGUuYWRkUHQ9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHZpKHQpO2lmKHRoaXMuX3ByZWNpc2lvbk1vZGVsLm1ha2VQcmVjaXNlKGUpLHRoaXMuaXNSZWR1bmRhbnQoZSkpcmV0dXJuIG51bGw7dGhpcy5fcHRMaXN0LmFkZChlKX0sUGEucHJvdG90eXBlLnJldmVyZT1mdW5jdGlvbigpe30sUGEucHJvdG90eXBlLmFkZFB0cz1mdW5jdGlvbih0LGUpe2lmKGUpZm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdGhpcy5hZGRQdCh0W25dKTtlbHNlIGZvcih2YXIgcj10Lmxlbmd0aC0xO3I+PTA7ci0tKXRoaXMuYWRkUHQodFtyXSl9LFBhLnByb3RvdHlwZS5pc1JlZHVuZGFudD1mdW5jdGlvbih0KXtpZih0aGlzLl9wdExpc3Quc2l6ZSgpPDEpcmV0dXJuITE7dmFyIGU9dGhpcy5fcHRMaXN0LmdldCh0aGlzLl9wdExpc3Quc2l6ZSgpLTEpO3JldHVybiB0LmRpc3RhbmNlKGUpPHRoaXMuX21pbmltaW1WZXJ0ZXhEaXN0YW5jZX0sUGEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBJcykuY3JlYXRlTGluZVN0cmluZyh0aGlzLmdldENvb3JkaW5hdGVzKCkpLnRvU3RyaW5nKCl9LFBhLnByb3RvdHlwZS5jbG9zZVJpbmc9ZnVuY3Rpb24oKXtpZih0aGlzLl9wdExpc3Quc2l6ZSgpPDEpcmV0dXJuIG51bGw7dmFyIHQ9bmV3IHZpKHRoaXMuX3B0TGlzdC5nZXQoMCkpLGU9dGhpcy5fcHRMaXN0LmdldCh0aGlzLl9wdExpc3Quc2l6ZSgpLTEpO2lmKHQuZXF1YWxzKGUpKXJldHVybiBudWxsO3RoaXMuX3B0TGlzdC5hZGQodCl9LFBhLnByb3RvdHlwZS5zZXRNaW5pbXVtVmVydGV4RGlzdGFuY2U9ZnVuY3Rpb24odCl7dGhpcy5fbWluaW1pbVZlcnRleERpc3RhbmNlPXR9LFBhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxQYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUGF9LFJhLkNPT1JESU5BVEVfQVJSQVlfVFlQRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEFycmF5KDApLmZpbGwobnVsbCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFBhLFJhKTt2YXIgQmE9ZnVuY3Rpb24oKXt9LGthPXtQSV9USU1FU18yOntjb25maWd1cmFibGU6ITB9LFBJX09WRVJfMjp7Y29uZmlndXJhYmxlOiEwfSxQSV9PVkVSXzQ6e2NvbmZpZ3VyYWJsZTohMH0sQ09VTlRFUkNMT0NLV0lTRTp7Y29uZmlndXJhYmxlOiEwfSxDTE9DS1dJU0U6e2NvbmZpZ3VyYWJsZTohMH0sTk9ORTp7Y29uZmlndXJhYmxlOiEwfX07QmEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEJhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBCYX0sQmEudG9EZWdyZWVzPWZ1bmN0aW9uKHQpe3JldHVybiAxODAqdC9NYXRoLlBJfSxCYS5ub3JtYWxpemU9ZnVuY3Rpb24odCl7Zm9yKDt0Pk1hdGguUEk7KXQtPUJhLlBJX1RJTUVTXzI7Zm9yKDt0PD0tTWF0aC5QSTspdCs9QmEuUElfVElNRVNfMjtyZXR1cm4gdH0sQmEuYW5nbGU9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBNYXRoLmF0YW4yKHQueSx0LngpfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1uLngtZS54LGk9bi55LWUueTtyZXR1cm4gTWF0aC5hdGFuMihpLHIpfX0sQmEuaXNBY3V0ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC54LWUueCxpPXQueS1lLnk7cmV0dXJuIHIqKG4ueC1lLngpK2kqKG4ueS1lLnkpPjB9LEJhLmlzT2J0dXNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LngtZS54LGk9dC55LWUueTtyZXR1cm4gcioobi54LWUueCkraSoobi55LWUueSk8MH0sQmEuaW50ZXJpb3JBbmdsZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9QmEuYW5nbGUoZSx0KSxpPUJhLmFuZ2xlKGUsbik7cmV0dXJuIE1hdGguYWJzKGktcil9LEJhLm5vcm1hbGl6ZVBvc2l0aXZlPWZ1bmN0aW9uKHQpe2lmKHQ8MCl7Zm9yKDt0PDA7KXQrPUJhLlBJX1RJTUVTXzI7dD49QmEuUElfVElNRVNfMiYmKHQ9MCl9ZWxzZXtmb3IoO3Q+PUJhLlBJX1RJTUVTXzI7KXQtPUJhLlBJX1RJTUVTXzI7dDwwJiYodD0wKX1yZXR1cm4gdH0sQmEuYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1CYS5hbmdsZShlLHQpLGk9QmEuYW5nbGUoZSxuKTtyZXR1cm4gQmEuZGlmZihyLGkpfSxCYS5kaWZmPWZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbDtyZXR1cm4obj10PGU/ZS10OnQtZSk+TWF0aC5QSSYmKG49MipNYXRoLlBJLW4pLG59LEJhLnRvUmFkaWFucz1mdW5jdGlvbih0KXtyZXR1cm4gdCpNYXRoLlBJLzE4MH0sQmEuZ2V0VHVybj1mdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc2luKGUtdCk7cmV0dXJuIG4+MD9CYS5DT1VOVEVSQ0xPQ0tXSVNFOm48MD9CYS5DTE9DS1dJU0U6QmEuTk9ORX0sQmEuYW5nbGVCZXR3ZWVuT3JpZW50ZWQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPUJhLmFuZ2xlKGUsdCksaT1CYS5hbmdsZShlLG4pLXI7cmV0dXJuIGk8PS1NYXRoLlBJP2krQmEuUElfVElNRVNfMjppPk1hdGguUEk/aS1CYS5QSV9USU1FU18yOml9LGthLlBJX1RJTUVTXzIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDIqTWF0aC5QSX0sa2EuUElfT1ZFUl8yLmdldD1mdW5jdGlvbigpe3JldHVybiBNYXRoLlBJLzJ9LGthLlBJX09WRVJfNC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5QSS80fSxrYS5DT1VOVEVSQ0xPQ0tXSVNFLmdldD1mdW5jdGlvbigpe3JldHVybiBlby5DT1VOVEVSQ0xPQ0tXSVNFfSxrYS5DTE9DS1dJU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGVvLkNMT0NLV0lTRX0sa2EuTk9ORS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZW8uQ09MTElORUFSfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhCYSxrYSk7dmFyIHphPWZ1bmN0aW9uIHQoKXt0aGlzLl9tYXhDdXJ2ZVNlZ21lbnRFcnJvcj0wLHRoaXMuX2ZpbGxldEFuZ2xlUXVhbnR1bT1udWxsLHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3I9MSx0aGlzLl9zZWdMaXN0PW51bGwsdGhpcy5fZGlzdGFuY2U9MCx0aGlzLl9wcmVjaXNpb25Nb2RlbD1udWxsLHRoaXMuX2J1ZlBhcmFtcz1udWxsLHRoaXMuX2xpPW51bGwsdGhpcy5fczA9bnVsbCx0aGlzLl9zMT1udWxsLHRoaXMuX3MyPW51bGwsdGhpcy5fc2VnMD1uZXcgYmEsdGhpcy5fc2VnMT1uZXcgYmEsdGhpcy5fb2Zmc2V0MD1uZXcgYmEsdGhpcy5fb2Zmc2V0MT1uZXcgYmEsdGhpcy5fc2lkZT0wLHRoaXMuX2hhc05hcnJvd0NvbmNhdmVBbmdsZT0hMTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5fcHJlY2lzaW9uTW9kZWw9ZSx0aGlzLl9idWZQYXJhbXM9bix0aGlzLl9saT1uZXcgUWksdGhpcy5fZmlsbGV0QW5nbGVRdWFudHVtPU1hdGguUEkvMi9uLmdldFF1YWRyYW50U2VnbWVudHMoKSxuLmdldFF1YWRyYW50U2VnbWVudHMoKT49OCYmbi5nZXRKb2luU3R5bGUoKT09PUZhLkpPSU5fUk9VTkQmJih0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yPXQuTUFYX0NMT1NJTkdfU0VHX0xFTl9GQUNUT1IpLHRoaXMuaW5pdChyKX0samE9e09GRlNFVF9TRUdNRU5UX1NFUEFSQVRJT05fRkFDVE9SOntjb25maWd1cmFibGU6ITB9LElOU0lERV9UVVJOX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUjp7Y29uZmlndXJhYmxlOiEwfSxDVVJWRV9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH0sTUFYX0NMT1NJTkdfU0VHX0xFTl9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH19O3phLnByb3RvdHlwZS5hZGROZXh0U2VnbWVudD1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX3MwPXRoaXMuX3MxLHRoaXMuX3MxPXRoaXMuX3MyLHRoaXMuX3MyPXQsdGhpcy5fc2VnMC5zZXRDb29yZGluYXRlcyh0aGlzLl9zMCx0aGlzLl9zMSksdGhpcy5jb21wdXRlT2Zmc2V0U2VnbWVudCh0aGlzLl9zZWcwLHRoaXMuX3NpZGUsdGhpcy5fZGlzdGFuY2UsdGhpcy5fb2Zmc2V0MCksdGhpcy5fc2VnMS5zZXRDb29yZGluYXRlcyh0aGlzLl9zMSx0aGlzLl9zMiksdGhpcy5jb21wdXRlT2Zmc2V0U2VnbWVudCh0aGlzLl9zZWcxLHRoaXMuX3NpZGUsdGhpcy5fZGlzdGFuY2UsdGhpcy5fb2Zmc2V0MSksdGhpcy5fczEuZXF1YWxzKHRoaXMuX3MyKSlyZXR1cm4gbnVsbDt2YXIgbj1lby5jb21wdXRlT3JpZW50YXRpb24odGhpcy5fczAsdGhpcy5fczEsdGhpcy5fczIpLHI9bj09PWVvLkNMT0NLV0lTRSYmdGhpcy5fc2lkZT09PUZzLkxFRlR8fG49PT1lby5DT1VOVEVSQ0xPQ0tXSVNFJiZ0aGlzLl9zaWRlPT09RnMuUklHSFQ7MD09PW4/dGhpcy5hZGRDb2xsaW5lYXIoZSk6cj90aGlzLmFkZE91dHNpZGVUdXJuKG4sZSk6dGhpcy5hZGRJbnNpZGVUdXJuKG4sZSl9LHphLnByb3RvdHlwZS5hZGRMaW5lRW5kQ2FwPWZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IGJhKHQsZSkscj1uZXcgYmE7dGhpcy5jb21wdXRlT2Zmc2V0U2VnbWVudChuLEZzLkxFRlQsdGhpcy5fZGlzdGFuY2Uscik7dmFyIGk9bmV3IGJhO3RoaXMuY29tcHV0ZU9mZnNldFNlZ21lbnQobixGcy5SSUdIVCx0aGlzLl9kaXN0YW5jZSxpKTt2YXIgbz1lLngtdC54LHM9ZS55LXQueSxhPU1hdGguYXRhbjIocyxvKTtzd2l0Y2godGhpcy5fYnVmUGFyYW1zLmdldEVuZENhcFN0eWxlKCkpe2Nhc2UgRmEuQ0FQX1JPVU5EOnRoaXMuX3NlZ0xpc3QuYWRkUHQoci5wMSksdGhpcy5hZGRGaWxsZXRBcmMoZSxhK01hdGguUEkvMixhLU1hdGguUEkvMixlby5DTE9DS1dJU0UsdGhpcy5fZGlzdGFuY2UpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoaS5wMSk7YnJlYWs7Y2FzZSBGYS5DQVBfRkxBVDp0aGlzLl9zZWdMaXN0LmFkZFB0KHIucDEpLHRoaXMuX3NlZ0xpc3QuYWRkUHQoaS5wMSk7YnJlYWs7Y2FzZSBGYS5DQVBfU1FVQVJFOnZhciB1PW5ldyB2aTt1Lng9TWF0aC5hYnModGhpcy5fZGlzdGFuY2UpKk1hdGguY29zKGEpLHUueT1NYXRoLmFicyh0aGlzLl9kaXN0YW5jZSkqTWF0aC5zaW4oYSk7dmFyIGM9bmV3IHZpKHIucDEueCt1Lngsci5wMS55K3UueSksbD1uZXcgdmkoaS5wMS54K3UueCxpLnAxLnkrdS55KTt0aGlzLl9zZWdMaXN0LmFkZFB0KGMpLHRoaXMuX3NlZ0xpc3QuYWRkUHQobCl9fSx6YS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2VnTGlzdC5nZXRDb29yZGluYXRlcygpfSx6YS5wcm90b3R5cGUuYWRkTWl0cmVKb2luPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPSEwLG89bnVsbDt0cnl7bz16aS5pbnRlcnNlY3Rpb24oZS5wMCxlLnAxLG4ucDAsbi5wMSksKHI8PTA/MTpvLmRpc3RhbmNlKHQpL01hdGguYWJzKHIpKT50aGlzLl9idWZQYXJhbXMuZ2V0TWl0cmVMaW1pdCgpJiYoaT0hMSl9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2YgQmkpKXRocm93IHQ7bz1uZXcgdmkoMCwwKSxpPSExfWk/dGhpcy5fc2VnTGlzdC5hZGRQdChvKTp0aGlzLmFkZExpbWl0ZWRNaXRyZUpvaW4oZSxuLHIsdGhpcy5fYnVmUGFyYW1zLmdldE1pdHJlTGltaXQoKSl9LHphLnByb3RvdHlwZS5hZGRGaWxsZXRDb3JuZXI9ZnVuY3Rpb24odCxlLG4scixpKXt2YXIgbz1lLngtdC54LHM9ZS55LXQueSxhPU1hdGguYXRhbjIocyxvKSx1PW4ueC10LngsYz1uLnktdC55LGw9TWF0aC5hdGFuMihjLHUpO3I9PT1lby5DTE9DS1dJU0U/YTw9bCYmKGErPTIqTWF0aC5QSSk6YT49bCYmKGEtPTIqTWF0aC5QSSksdGhpcy5fc2VnTGlzdC5hZGRQdChlKSx0aGlzLmFkZEZpbGxldEFyYyh0LGEsbCxyLGkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQobil9LHphLnByb3RvdHlwZS5hZGRPdXRzaWRlVHVybj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX29mZnNldDAucDEuZGlzdGFuY2UodGhpcy5fb2Zmc2V0MS5wMCk8dGhpcy5fZGlzdGFuY2UqemEuT0ZGU0VUX1NFR01FTlRfU0VQQVJBVElPTl9GQUNUT1IpcmV0dXJuIHRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MC5wMSksbnVsbDt0aGlzLl9idWZQYXJhbXMuZ2V0Sm9pblN0eWxlKCk9PT1GYS5KT0lOX01JVFJFP3RoaXMuYWRkTWl0cmVKb2luKHRoaXMuX3MxLHRoaXMuX29mZnNldDAsdGhpcy5fb2Zmc2V0MSx0aGlzLl9kaXN0YW5jZSk6dGhpcy5fYnVmUGFyYW1zLmdldEpvaW5TdHlsZSgpPT09RmEuSk9JTl9CRVZFTD90aGlzLmFkZEJldmVsSm9pbih0aGlzLl9vZmZzZXQwLHRoaXMuX29mZnNldDEpOihlJiZ0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDAucDEpLHRoaXMuYWRkRmlsbGV0Q29ybmVyKHRoaXMuX3MxLHRoaXMuX29mZnNldDAucDEsdGhpcy5fb2Zmc2V0MS5wMCx0LHRoaXMuX2Rpc3RhbmNlKSx0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDEucDApKX0semEucHJvdG90eXBlLmNyZWF0ZVNxdWFyZT1mdW5jdGlvbih0KXt0aGlzLl9zZWdMaXN0LmFkZFB0KG5ldyB2aSh0LngrdGhpcy5fZGlzdGFuY2UsdC55K3RoaXMuX2Rpc3RhbmNlKSksdGhpcy5fc2VnTGlzdC5hZGRQdChuZXcgdmkodC54K3RoaXMuX2Rpc3RhbmNlLHQueS10aGlzLl9kaXN0YW5jZSkpLHRoaXMuX3NlZ0xpc3QuYWRkUHQobmV3IHZpKHQueC10aGlzLl9kaXN0YW5jZSx0LnktdGhpcy5fZGlzdGFuY2UpKSx0aGlzLl9zZWdMaXN0LmFkZFB0KG5ldyB2aSh0LngtdGhpcy5fZGlzdGFuY2UsdC55K3RoaXMuX2Rpc3RhbmNlKSksdGhpcy5fc2VnTGlzdC5jbG9zZVJpbmcoKX0semEucHJvdG90eXBlLmFkZFNlZ21lbnRzPWZ1bmN0aW9uKHQsZSl7dGhpcy5fc2VnTGlzdC5hZGRQdHModCxlKX0semEucHJvdG90eXBlLmFkZEZpcnN0U2VnbWVudD1mdW5jdGlvbigpe3RoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MS5wMCl9LHphLnByb3RvdHlwZS5hZGRMYXN0U2VnbWVudD1mdW5jdGlvbigpe3RoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MS5wMSl9LHphLnByb3RvdHlwZS5pbml0U2lkZVNlZ21lbnRzPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9zMT10LHRoaXMuX3MyPWUsdGhpcy5fc2lkZT1uLHRoaXMuX3NlZzEuc2V0Q29vcmRpbmF0ZXModCxlKSx0aGlzLmNvbXB1dGVPZmZzZXRTZWdtZW50KHRoaXMuX3NlZzEsbix0aGlzLl9kaXN0YW5jZSx0aGlzLl9vZmZzZXQxKX0semEucHJvdG90eXBlLmFkZExpbWl0ZWRNaXRyZUpvaW49ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcy5fc2VnMC5wMSxvPUJhLmFuZ2xlKGksdGhpcy5fc2VnMC5wMCkscz1CYS5hbmdsZUJldHdlZW5PcmllbnRlZCh0aGlzLl9zZWcwLnAwLGksdGhpcy5fc2VnMS5wMSkvMixhPUJhLm5vcm1hbGl6ZShvK3MpLHU9QmEubm9ybWFsaXplKGErTWF0aC5QSSksYz1yKm4sbD1uLWMqTWF0aC5hYnMoTWF0aC5zaW4ocykpLGg9aS54K2MqTWF0aC5jb3ModSksZj1pLnkrYypNYXRoLnNpbih1KSxwPW5ldyB2aShoLGYpLGQ9bmV3IGJhKGkscCksZz1kLnBvaW50QWxvbmdPZmZzZXQoMSxsKSx5PWQucG9pbnRBbG9uZ09mZnNldCgxLC1sKTt0aGlzLl9zaWRlPT09RnMuTEVGVD8odGhpcy5fc2VnTGlzdC5hZGRQdChnKSx0aGlzLl9zZWdMaXN0LmFkZFB0KHkpKToodGhpcy5fc2VnTGlzdC5hZGRQdCh5KSx0aGlzLl9zZWdMaXN0LmFkZFB0KGcpKX0semEucHJvdG90eXBlLmNvbXB1dGVPZmZzZXRTZWdtZW50PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPWU9PT1Gcy5MRUZUPzE6LTEsbz10LnAxLngtdC5wMC54LHM9dC5wMS55LXQucDAueSxhPU1hdGguc3FydChvKm8rcypzKSx1PWkqbipvL2EsYz1pKm4qcy9hO3IucDAueD10LnAwLngtYyxyLnAwLnk9dC5wMC55K3Usci5wMS54PXQucDEueC1jLHIucDEueT10LnAxLnkrdX0semEucHJvdG90eXBlLmFkZEZpbGxldEFyYz1mdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvPXI9PT1lby5DTE9DS1dJU0U/LTE6MSxzPU1hdGguYWJzKGUtbiksYT1NYXRoLnRydW5jKHMvdGhpcy5fZmlsbGV0QW5nbGVRdWFudHVtKy41KTtpZihhPDEpcmV0dXJuIG51bGw7Zm9yKHZhciB1PXMvYSxjPTAsbD1uZXcgdmk7YzxzOyl7dmFyIGg9ZStvKmM7bC54PXQueCtpKk1hdGguY29zKGgpLGwueT10LnkraSpNYXRoLnNpbihoKSx0aGlzLl9zZWdMaXN0LmFkZFB0KGwpLGMrPXV9fSx6YS5wcm90b3R5cGUuYWRkSW5zaWRlVHVybj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odGhpcy5fb2Zmc2V0MC5wMCx0aGlzLl9vZmZzZXQwLnAxLHRoaXMuX29mZnNldDEucDAsdGhpcy5fb2Zmc2V0MS5wMSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkpdGhpcy5fc2VnTGlzdC5hZGRQdCh0aGlzLl9saS5nZXRJbnRlcnNlY3Rpb24oMCkpO2Vsc2UgaWYodGhpcy5faGFzTmFycm93Q29uY2F2ZUFuZ2xlPSEwLHRoaXMuX29mZnNldDAucDEuZGlzdGFuY2UodGhpcy5fb2Zmc2V0MS5wMCk8dGhpcy5fZGlzdGFuY2UqemEuSU5TSURFX1RVUk5fVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SKXRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MC5wMSk7ZWxzZXtpZih0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDAucDEpLHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3I+MCl7dmFyIG49bmV3IHZpKCh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKnRoaXMuX29mZnNldDAucDEueCt0aGlzLl9zMS54KS8odGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3RvcisxKSwodGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcip0aGlzLl9vZmZzZXQwLnAxLnkrdGhpcy5fczEueSkvKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IrMSkpO3RoaXMuX3NlZ0xpc3QuYWRkUHQobik7dmFyIHI9bmV3IHZpKCh0aGlzLl9jbG9zaW5nU2VnTGVuZ3RoRmFjdG9yKnRoaXMuX29mZnNldDEucDAueCt0aGlzLl9zMS54KS8odGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3RvcisxKSwodGhpcy5fY2xvc2luZ1NlZ0xlbmd0aEZhY3Rvcip0aGlzLl9vZmZzZXQxLnAwLnkrdGhpcy5fczEueSkvKHRoaXMuX2Nsb3NpbmdTZWdMZW5ndGhGYWN0b3IrMSkpO3RoaXMuX3NlZ0xpc3QuYWRkUHQocil9ZWxzZSB0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX3MxKTt0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDEucDApfX0semEucHJvdG90eXBlLmNyZWF0ZUNpcmNsZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdmkodC54K3RoaXMuX2Rpc3RhbmNlLHQueSk7dGhpcy5fc2VnTGlzdC5hZGRQdChlKSx0aGlzLmFkZEZpbGxldEFyYyh0LDAsMipNYXRoLlBJLC0xLHRoaXMuX2Rpc3RhbmNlKSx0aGlzLl9zZWdMaXN0LmNsb3NlUmluZygpfSx6YS5wcm90b3R5cGUuYWRkQmV2ZWxKb2luPWZ1bmN0aW9uKHQsZSl7dGhpcy5fc2VnTGlzdC5hZGRQdCh0LnAxKSx0aGlzLl9zZWdMaXN0LmFkZFB0KGUucDApfSx6YS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih0KXt0aGlzLl9kaXN0YW5jZT10LHRoaXMuX21heEN1cnZlU2VnbWVudEVycm9yPXQqKDEtTWF0aC5jb3ModGhpcy5fZmlsbGV0QW5nbGVRdWFudHVtLzIpKSx0aGlzLl9zZWdMaXN0PW5ldyBQYSx0aGlzLl9zZWdMaXN0LnNldFByZWNpc2lvbk1vZGVsKHRoaXMuX3ByZWNpc2lvbk1vZGVsKSx0aGlzLl9zZWdMaXN0LnNldE1pbmltdW1WZXJ0ZXhEaXN0YW5jZSh0KnphLkNVUlZFX1ZFUlRFWF9TTkFQX0RJU1RBTkNFX0ZBQ1RPUil9LHphLnByb3RvdHlwZS5hZGRDb2xsaW5lYXI9ZnVuY3Rpb24odCl7dGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0aGlzLl9zMCx0aGlzLl9zMSx0aGlzLl9zMSx0aGlzLl9zMiksdGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uTnVtKCk+PTImJih0aGlzLl9idWZQYXJhbXMuZ2V0Sm9pblN0eWxlKCk9PT1GYS5KT0lOX0JFVkVMfHx0aGlzLl9idWZQYXJhbXMuZ2V0Sm9pblN0eWxlKCk9PT1GYS5KT0lOX01JVFJFPyh0JiZ0aGlzLl9zZWdMaXN0LmFkZFB0KHRoaXMuX29mZnNldDAucDEpLHRoaXMuX3NlZ0xpc3QuYWRkUHQodGhpcy5fb2Zmc2V0MS5wMCkpOnRoaXMuYWRkRmlsbGV0Q29ybmVyKHRoaXMuX3MxLHRoaXMuX29mZnNldDAucDEsdGhpcy5fb2Zmc2V0MS5wMCxlby5DTE9DS1dJU0UsdGhpcy5fZGlzdGFuY2UpKX0semEucHJvdG90eXBlLmNsb3NlUmluZz1mdW5jdGlvbigpe3RoaXMuX3NlZ0xpc3QuY2xvc2VSaW5nKCl9LHphLnByb3RvdHlwZS5oYXNOYXJyb3dDb25jYXZlQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzTmFycm93Q29uY2F2ZUFuZ2xlfSx6YS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0semEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHphfSxqYS5PRkZTRVRfU0VHTUVOVF9TRVBBUkFUSU9OX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDAxfSxqYS5JTlNJREVfVFVSTl9WRVJURVhfU05BUF9ESVNUQU5DRV9GQUNUT1IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLjAwMX0samEuQ1VSVkVfVkVSVEVYX1NOQVBfRElTVEFOQ0VfRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybiAxZS02fSxqYS5NQVhfQ0xPU0lOR19TRUdfTEVOX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gODB9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHphLGphKTt2YXIgVWE9ZnVuY3Rpb24oKXt0aGlzLl9kaXN0YW5jZT0wLHRoaXMuX3ByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5fYnVmUGFyYW1zPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX3ByZWNpc2lvbk1vZGVsPXQsdGhpcy5fYnVmUGFyYW1zPWV9O1VhLnByb3RvdHlwZS5nZXRPZmZzZXRDdXJ2ZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX2Rpc3RhbmNlPWUsMD09PWUpcmV0dXJuIG51bGw7dmFyIG49ZTwwLHI9TWF0aC5hYnMoZSksaT10aGlzLmdldFNlZ0dlbihyKTt0Lmxlbmd0aDw9MT90aGlzLmNvbXB1dGVQb2ludEN1cnZlKHRbMF0saSk6dGhpcy5jb21wdXRlT2Zmc2V0Q3VydmUodCxuLGkpO3ZhciBvPWkuZ2V0Q29vcmRpbmF0ZXMoKTtyZXR1cm4gbiYmRG8ucmV2ZXJzZShvKSxvfSxVYS5wcm90b3R5cGUuY29tcHV0ZVNpbmdsZVNpZGVkQnVmZmVyQ3VydmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuc2ltcGxpZnlUb2xlcmFuY2UodGhpcy5fZGlzdGFuY2UpO2lmKGUpe24uYWRkU2VnbWVudHModCwhMCk7dmFyIGk9T2Euc2ltcGxpZnkodCwtciksbz1pLmxlbmd0aC0xO24uaW5pdFNpZGVTZWdtZW50cyhpW29dLGlbby0xXSxGcy5MRUZUKSxuLmFkZEZpcnN0U2VnbWVudCgpO2Zvcih2YXIgcz1vLTI7cz49MDtzLS0pbi5hZGROZXh0U2VnbWVudChpW3NdLCEwKX1lbHNle24uYWRkU2VnbWVudHModCwhMSk7dmFyIGE9T2Euc2ltcGxpZnkodCxyKSx1PWEubGVuZ3RoLTE7bi5pbml0U2lkZVNlZ21lbnRzKGFbMF0sYVsxXSxGcy5MRUZUKSxuLmFkZEZpcnN0U2VnbWVudCgpO2Zvcih2YXIgYz0yO2M8PXU7YysrKW4uYWRkTmV4dFNlZ21lbnQoYVtjXSwhMCl9bi5hZGRMYXN0U2VnbWVudCgpLG4uY2xvc2VSaW5nKCl9LFVhLnByb3RvdHlwZS5jb21wdXRlUmluZ0J1ZmZlckN1cnZlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnNpbXBsaWZ5VG9sZXJhbmNlKHRoaXMuX2Rpc3RhbmNlKTtlPT09RnMuUklHSFQmJihyPS1yKTt2YXIgaT1PYS5zaW1wbGlmeSh0LHIpLG89aS5sZW5ndGgtMTtuLmluaXRTaWRlU2VnbWVudHMoaVtvLTFdLGlbMF0sZSk7Zm9yKHZhciBzPTE7czw9bztzKyspe3ZhciBhPTEhPT1zO24uYWRkTmV4dFNlZ21lbnQoaVtzXSxhKX1uLmNsb3NlUmluZygpfSxVYS5wcm90b3R5cGUuY29tcHV0ZUxpbmVCdWZmZXJDdXJ2ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuc2ltcGxpZnlUb2xlcmFuY2UodGhpcy5fZGlzdGFuY2UpLHI9T2Euc2ltcGxpZnkodCxuKSxpPXIubGVuZ3RoLTE7ZS5pbml0U2lkZVNlZ21lbnRzKHJbMF0sclsxXSxGcy5MRUZUKTtmb3IodmFyIG89MjtvPD1pO28rKyllLmFkZE5leHRTZWdtZW50KHJbb10sITApO2UuYWRkTGFzdFNlZ21lbnQoKSxlLmFkZExpbmVFbmRDYXAocltpLTFdLHJbaV0pO3ZhciBzPU9hLnNpbXBsaWZ5KHQsLW4pLGE9cy5sZW5ndGgtMTtlLmluaXRTaWRlU2VnbWVudHMoc1thXSxzW2EtMV0sRnMuTEVGVCk7Zm9yKHZhciB1PWEtMjt1Pj0wO3UtLSllLmFkZE5leHRTZWdtZW50KHNbdV0sITApO2UuYWRkTGFzdFNlZ21lbnQoKSxlLmFkZExpbmVFbmRDYXAoc1sxXSxzWzBdKSxlLmNsb3NlUmluZygpfSxVYS5wcm90b3R5cGUuY29tcHV0ZVBvaW50Q3VydmU9ZnVuY3Rpb24odCxlKXtzd2l0Y2godGhpcy5fYnVmUGFyYW1zLmdldEVuZENhcFN0eWxlKCkpe2Nhc2UgRmEuQ0FQX1JPVU5EOmUuY3JlYXRlQ2lyY2xlKHQpO2JyZWFrO2Nhc2UgRmEuQ0FQX1NRVUFSRTplLmNyZWF0ZVNxdWFyZSh0KX19LFVhLnByb3RvdHlwZS5nZXRMaW5lQ3VydmU9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9kaXN0YW5jZT1lLGU8MCYmIXRoaXMuX2J1ZlBhcmFtcy5pc1NpbmdsZVNpZGVkKCl8fDA9PT1lKXJldHVybiBudWxsO3ZhciBuPU1hdGguYWJzKGUpLHI9dGhpcy5nZXRTZWdHZW4obik7aWYodC5sZW5ndGg8PTEpdGhpcy5jb21wdXRlUG9pbnRDdXJ2ZSh0WzBdLHIpO2Vsc2UgaWYodGhpcy5fYnVmUGFyYW1zLmlzU2luZ2xlU2lkZWQoKSl7dmFyIGk9ZTwwO3RoaXMuY29tcHV0ZVNpbmdsZVNpZGVkQnVmZmVyQ3VydmUodCxpLHIpfWVsc2UgdGhpcy5jb21wdXRlTGluZUJ1ZmZlckN1cnZlKHQscik7cmV0dXJuIHIuZ2V0Q29vcmRpbmF0ZXMoKX0sVWEucHJvdG90eXBlLmdldEJ1ZmZlclBhcmFtZXRlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYnVmUGFyYW1zfSxVYS5wcm90b3R5cGUuc2ltcGxpZnlUb2xlcmFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5fYnVmUGFyYW1zLmdldFNpbXBsaWZ5RmFjdG9yKCl9LFVhLnByb3RvdHlwZS5nZXRSaW5nQ3VydmU9ZnVuY3Rpb24odCxlLG4pe2lmKHRoaXMuX2Rpc3RhbmNlPW4sdC5sZW5ndGg8PTIpcmV0dXJuIHRoaXMuZ2V0TGluZUN1cnZlKHQsbik7aWYoMD09PW4pcmV0dXJuIFVhLmNvcHlDb29yZGluYXRlcyh0KTt2YXIgcj10aGlzLmdldFNlZ0dlbihuKTtyZXR1cm4gdGhpcy5jb21wdXRlUmluZ0J1ZmZlckN1cnZlKHQsZSxyKSxyLmdldENvb3JkaW5hdGVzKCl9LFVhLnByb3RvdHlwZS5jb21wdXRlT2Zmc2V0Q3VydmU9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuc2ltcGxpZnlUb2xlcmFuY2UodGhpcy5fZGlzdGFuY2UpO2lmKGUpe3ZhciBpPU9hLnNpbXBsaWZ5KHQsLXIpLG89aS5sZW5ndGgtMTtuLmluaXRTaWRlU2VnbWVudHMoaVtvXSxpW28tMV0sRnMuTEVGVCksbi5hZGRGaXJzdFNlZ21lbnQoKTtmb3IodmFyIHM9by0yO3M+PTA7cy0tKW4uYWRkTmV4dFNlZ21lbnQoaVtzXSwhMCl9ZWxzZXt2YXIgYT1PYS5zaW1wbGlmeSh0LHIpLHU9YS5sZW5ndGgtMTtuLmluaXRTaWRlU2VnbWVudHMoYVswXSxhWzFdLEZzLkxFRlQpLG4uYWRkRmlyc3RTZWdtZW50KCk7Zm9yKHZhciBjPTI7Yzw9dTtjKyspbi5hZGROZXh0U2VnbWVudChhW2NdLCEwKX1uLmFkZExhc3RTZWdtZW50KCl9LFVhLnByb3RvdHlwZS5nZXRTZWdHZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB6YSh0aGlzLl9wcmVjaXNpb25Nb2RlbCx0aGlzLl9idWZQYXJhbXMsdCl9LFVhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxVYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVWF9LFVhLmNvcHlDb29yZGluYXRlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQubGVuZ3RoKS5maWxsKG51bGwpLG49MDtuPGUubGVuZ3RoO24rKyllW25dPW5ldyB2aSh0W25dKTtyZXR1cm4gZX07dmFyIHFhPWZ1bmN0aW9uKCl7dGhpcy5fc3ViZ3JhcGhzPW51bGwsdGhpcy5fc2VnPW5ldyBiYSx0aGlzLl9jZ2E9bmV3IGVvO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9zdWJncmFwaHM9dH0sVmE9e0RlcHRoU2VnbWVudDp7Y29uZmlndXJhYmxlOiEwfX07cWEucHJvdG90eXBlLmZpbmRTdGFiYmVkU2VnbWVudHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49bmV3IHhvLHI9dGhpcy5fc3ViZ3JhcGhzLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKSxvPWkuZ2V0RW52ZWxvcGUoKTtlLnk8by5nZXRNaW5ZKCl8fGUueT5vLmdldE1heFkoKXx8dC5maW5kU3RhYmJlZFNlZ21lbnRzKGUsaS5nZXREaXJlY3RlZEVkZ2VzKCksbil9cmV0dXJuIG59aWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpaWYoRWkoYXJndW1lbnRzWzJdLHZvKSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBLcylmb3IodmFyIHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdLHU9YXJndW1lbnRzWzJdLGM9YS5nZXRFZGdlKCkuZ2V0Q29vcmRpbmF0ZXMoKSxsPTA7bDxjLmxlbmd0aC0xO2wrKyl7aWYodC5fc2VnLnAwPWNbbF0sdC5fc2VnLnAxPWNbbCsxXSx0Ll9zZWcucDAueT50Ll9zZWcucDEueSYmdC5fc2VnLnJldmVyc2UoKSwhKE1hdGgubWF4KHQuX3NlZy5wMC54LHQuX3NlZy5wMS54KTxzLnh8fHQuX3NlZy5pc0hvcml6b250YWwoKXx8cy55PHQuX3NlZy5wMC55fHxzLnk+dC5fc2VnLnAxLnl8fGVvLmNvbXB1dGVPcmllbnRhdGlvbih0Ll9zZWcucDAsdC5fc2VnLnAxLHMpPT09ZW8uUklHSFQpKXt2YXIgaD1hLmdldERlcHRoKEZzLkxFRlQpO3QuX3NlZy5wMC5lcXVhbHMoY1tsXSl8fChoPWEuZ2V0RGVwdGgoRnMuUklHSFQpKTt2YXIgZj1uZXcgR2EodC5fc2VnLGgpO3UuYWRkKGYpfX1lbHNlIGlmKEVpKGFyZ3VtZW50c1syXSx2bykmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJkVpKGFyZ3VtZW50c1sxXSx2bykpZm9yKHZhciBwPWFyZ3VtZW50c1swXSxkPWFyZ3VtZW50c1syXSxnPWFyZ3VtZW50c1sxXS5pdGVyYXRvcigpO2cuaGFzTmV4dCgpOyl7dmFyIHk9Zy5uZXh0KCk7IXkuaXNGb3J3YXJkKCl8fHQuZmluZFN0YWJiZWRTZWdtZW50cyhwLHksZCl9fSxxYS5wcm90b3R5cGUuZ2V0RGVwdGg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5maW5kU3RhYmJlZFNlZ21lbnRzKHQpO3JldHVybiAwPT09ZS5zaXplKCk/MDphYS5taW4oZSkuX2xlZnREZXB0aH0scWEucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHFhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBxYX0sVmEuRGVwdGhTZWdtZW50LmdldD1mdW5jdGlvbigpe3JldHVybiBHYX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocWEsVmEpO3ZhciBHYT1mdW5jdGlvbigpe3RoaXMuX3Vwd2FyZFNlZz1udWxsLHRoaXMuX2xlZnREZXB0aD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl91cHdhcmRTZWc9bmV3IGJhKHQpLHRoaXMuX2xlZnREZXB0aD1lfTtHYS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7aWYodGhpcy5fdXB3YXJkU2VnLm1pblgoKT49ZS5fdXB3YXJkU2VnLm1heFgoKSlyZXR1cm4gMTtpZih0aGlzLl91cHdhcmRTZWcubWF4WCgpPD1lLl91cHdhcmRTZWcubWluWCgpKXJldHVybi0xO3ZhciBuPXRoaXMuX3Vwd2FyZFNlZy5vcmllbnRhdGlvbkluZGV4KGUuX3Vwd2FyZFNlZyk7cmV0dXJuIDAhPT1ufHwwIT09KG49LTEqZS5fdXB3YXJkU2VnLm9yaWVudGF0aW9uSW5kZXgodGhpcy5fdXB3YXJkU2VnKSk/bjp0aGlzLl91cHdhcmRTZWcuY29tcGFyZVRvKGUuX3Vwd2FyZFNlZyl9LEdhLnByb3RvdHlwZS5jb21wYXJlWD1mdW5jdGlvbih0LGUpe3ZhciBuPXQucDAuY29tcGFyZVRvKGUucDApO3JldHVybiAwIT09bj9uOnQucDEuY29tcGFyZVRvKGUucDEpfSxHYS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXB3YXJkU2VnLnRvU3RyaW5nKCl9LEdhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LEdhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBHYX07dmFyIFlhPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLnAwPXR8fG51bGwsdGhpcy5wMT1lfHxudWxsLHRoaXMucDI9bnx8bnVsbH07WWEucHJvdG90eXBlLmFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gWWEuYXJlYSh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5zaWduZWRBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIFlhLnNpZ25lZEFyZWEodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuaW50ZXJwb2xhdGVaPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10KXRocm93IG5ldyBoaTtyZXR1cm4gWWEuaW50ZXJwb2xhdGVaKHQsdGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUubG9uZ2VzdFNpZGVMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gWWEubG9uZ2VzdFNpZGVMZW5ndGgodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuaXNBY3V0ZT1mdW5jdGlvbigpe3JldHVybiBZYS5pc0FjdXRlKHRoaXMucDAsdGhpcy5wMSx0aGlzLnAyKX0sWWEucHJvdG90eXBlLmNpcmN1bWNlbnRyZT1mdW5jdGlvbigpe3JldHVybiBZYS5jaXJjdW1jZW50cmUodGhpcy5wMCx0aGlzLnAxLHRoaXMucDIpfSxZYS5wcm90b3R5cGUuYXJlYTNEPWZ1bmN0aW9uKCl7cmV0dXJuIFlhLmFyZWEzRCh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5jZW50cm9pZD1mdW5jdGlvbigpe3JldHVybiBZYS5jZW50cm9pZCh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5pbkNlbnRyZT1mdW5jdGlvbigpe3JldHVybiBZYS5pbkNlbnRyZSh0aGlzLnAwLHRoaXMucDEsdGhpcy5wMil9LFlhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxZYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gWWF9LFlhLmFyZWE9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNYXRoLmFicygoKG4ueC10LngpKihlLnktdC55KS0oZS54LXQueCkqKG4ueS10LnkpKS8yKX0sWWEuc2lnbmVkQXJlYT1mdW5jdGlvbih0LGUsbil7cmV0dXJuKChuLngtdC54KSooZS55LXQueSktKGUueC10LngpKihuLnktdC55KSkvMn0sWWEuZGV0PWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0KnItZSpufSxZYS5pbnRlcnBvbGF0ZVo9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9ZS54LG89ZS55LHM9bi54LWksYT1yLngtaSx1PW4ueS1vLGM9ci55LW8sbD1zKmMtYSp1LGg9dC54LWksZj10LnktbyxwPShjKmgtYSpmKS9sLGQ9KC11KmgrcypmKS9sO3JldHVybiBlLnorcCoobi56LWUueikrZCooci56LWUueil9LFlhLmxvbmdlc3RTaWRlTGVuZ3RoPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmRpc3RhbmNlKGUpLGk9ZS5kaXN0YW5jZShuKSxvPW4uZGlzdGFuY2UodCkscz1yO3JldHVybiBpPnMmJihzPWkpLG8+cyYmKHM9byksc30sWWEuaXNBY3V0ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuISghQmEuaXNBY3V0ZSh0LGUsbil8fCFCYS5pc0FjdXRlKGUsbix0KXx8IUJhLmlzQWN1dGUobix0LGUpKX0sWWEuY2lyY3VtY2VudHJlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uLngsaT1uLnksbz10LngtcixzPXQueS1pLGE9ZS54LXIsdT1lLnktaSxjPTIqWWEuZGV0KG8scyxhLHUpLGw9WWEuZGV0KHMsbypvK3Mqcyx1LGEqYSt1KnUpLGg9WWEuZGV0KG8sbypvK3MqcyxhLGEqYSt1KnUpO3JldHVybiBuZXcgdmkoci1sL2MsaStoL2MpfSxZYS5wZXJwZW5kaWN1bGFyQmlzZWN0b3I9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLngtdC54LHI9ZS55LXQueSxpPW5ldyB6aSh0Lngrbi8yLHQueStyLzIsMSksbz1uZXcgemkodC54LXIrbi8yLHQueStuK3IvMiwxKTtyZXR1cm4gbmV3IHppKGksbyl9LFlhLmFuZ2xlQmlzZWN0b3I9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUuZGlzdGFuY2UodCksaT1yLyhyK2UuZGlzdGFuY2UobikpLG89bi54LXQueCxzPW4ueS10Lnk7cmV0dXJuIG5ldyB2aSh0LngraSpvLHQueStpKnMpfSxZYS5hcmVhM0Q9ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUueC10LngsaT1lLnktdC55LG89ZS56LXQueixzPW4ueC10LngsYT1uLnktdC55LHU9bi56LXQueixjPWkqdS1vKmEsbD1vKnMtcip1LGg9ciphLWkqcyxmPWMqYytsKmwraCpoO3JldHVybiBNYXRoLnNxcnQoZikvMn0sWWEuY2VudHJvaWQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPSh0LngrZS54K24ueCkvMyxpPSh0LnkrZS55K24ueSkvMztyZXR1cm4gbmV3IHZpKHIsaSl9LFlhLmluQ2VudHJlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lLmRpc3RhbmNlKG4pLGk9dC5kaXN0YW5jZShuKSxvPXQuZGlzdGFuY2UoZSkscz1yK2krbyxhPShyKnQueCtpKmUueCtvKm4ueCkvcyx1PShyKnQueStpKmUueStvKm4ueSkvcztyZXR1cm4gbmV3IHZpKGEsdSl9O3ZhciBYYT1mdW5jdGlvbigpe3RoaXMuX2lucHV0R2VvbT1udWxsLHRoaXMuX2Rpc3RhbmNlPW51bGwsdGhpcy5fY3VydmVCdWlsZGVyPW51bGwsdGhpcy5fY3VydmVMaXN0PW5ldyB4bzt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07dGhpcy5faW5wdXRHZW9tPXQsdGhpcy5fZGlzdGFuY2U9ZSx0aGlzLl9jdXJ2ZUJ1aWxkZXI9bn07WGEucHJvdG90eXBlLmFkZFBvaW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2Rpc3RhbmNlPD0wKXJldHVybiBudWxsO3ZhciBlPXQuZ2V0Q29vcmRpbmF0ZXMoKSxuPXRoaXMuX2N1cnZlQnVpbGRlci5nZXRMaW5lQ3VydmUoZSx0aGlzLl9kaXN0YW5jZSk7dGhpcy5hZGRDdXJ2ZShuLGJpLkVYVEVSSU9SLGJpLklOVEVSSU9SKX0sWGEucHJvdG90eXBlLmFkZFBvbHlnb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuX2Rpc3RhbmNlLHI9RnMuTEVGVDt0aGlzLl9kaXN0YW5jZTwwJiYobj0tdGhpcy5fZGlzdGFuY2Uscj1Gcy5SSUdIVCk7dmFyIGk9dC5nZXRFeHRlcmlvclJpbmcoKSxvPURvLnJlbW92ZVJlcGVhdGVkUG9pbnRzKGkuZ2V0Q29vcmRpbmF0ZXMoKSk7aWYodGhpcy5fZGlzdGFuY2U8MCYmdGhpcy5pc0Vyb2RlZENvbXBsZXRlbHkoaSx0aGlzLl9kaXN0YW5jZSl8fHRoaXMuX2Rpc3RhbmNlPD0wJiZvLmxlbmd0aDwzKXJldHVybiBudWxsO3RoaXMuYWRkUG9seWdvblJpbmcobyxuLHIsYmkuRVhURVJJT1IsYmkuSU5URVJJT1IpO2Zvcih2YXIgcz0wO3M8dC5nZXROdW1JbnRlcmlvclJpbmcoKTtzKyspe3ZhciBhPXQuZ2V0SW50ZXJpb3JSaW5nTihzKSx1PURvLnJlbW92ZVJlcGVhdGVkUG9pbnRzKGEuZ2V0Q29vcmRpbmF0ZXMoKSk7ZS5fZGlzdGFuY2U+MCYmZS5pc0Vyb2RlZENvbXBsZXRlbHkoYSwtZS5fZGlzdGFuY2UpfHxlLmFkZFBvbHlnb25SaW5nKHUsbixGcy5vcHBvc2l0ZShyKSxiaS5JTlRFUklPUixiaS5FWFRFUklPUil9fSxYYS5wcm90b3R5cGUuaXNUcmlhbmdsZUVyb2RlZENvbXBsZXRlbHk9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgWWEodFswXSx0WzFdLHRbMl0pLHI9bi5pbkNlbnRyZSgpO3JldHVybiBlby5kaXN0YW5jZVBvaW50TGluZShyLG4ucDAsbi5wMSk8TWF0aC5hYnMoZSl9LFhhLnByb3RvdHlwZS5hZGRMaW5lU3RyaW5nPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2Rpc3RhbmNlPD0wJiYhdGhpcy5fY3VydmVCdWlsZGVyLmdldEJ1ZmZlclBhcmFtZXRlcnMoKS5pc1NpbmdsZVNpZGVkKCkpcmV0dXJuIG51bGw7dmFyIGU9RG8ucmVtb3ZlUmVwZWF0ZWRQb2ludHModC5nZXRDb29yZGluYXRlcygpKSxuPXRoaXMuX2N1cnZlQnVpbGRlci5nZXRMaW5lQ3VydmUoZSx0aGlzLl9kaXN0YW5jZSk7dGhpcy5hZGRDdXJ2ZShuLGJpLkVYVEVSSU9SLGJpLklOVEVSSU9SKX0sWGEucHJvdG90eXBlLmFkZEN1cnZlPWZ1bmN0aW9uKHQsZSxuKXtpZihudWxsPT09dHx8dC5sZW5ndGg8MilyZXR1cm4gbnVsbDt2YXIgcj1uZXcgd2EodCxuZXcganMoMCxiaS5CT1VOREFSWSxlLG4pKTt0aGlzLl9jdXJ2ZUxpc3QuYWRkKHIpfSxYYS5wcm90b3R5cGUuZ2V0Q3VydmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMuX2lucHV0R2VvbSksdGhpcy5fY3VydmVMaXN0fSxYYS5wcm90b3R5cGUuYWRkUG9seWdvblJpbmc9ZnVuY3Rpb24odCxlLG4scixpKXtpZigwPT09ZSYmdC5sZW5ndGg8cHMuTUlOSU1VTV9WQUxJRF9TSVpFKXJldHVybiBudWxsO3ZhciBvPXIscz1pO3QubGVuZ3RoPj1wcy5NSU5JTVVNX1ZBTElEX1NJWkUmJmVvLmlzQ0NXKHQpJiYobz1pLHM9cixuPUZzLm9wcG9zaXRlKG4pKTt2YXIgYT10aGlzLl9jdXJ2ZUJ1aWxkZXIuZ2V0UmluZ0N1cnZlKHQsbixlKTt0aGlzLmFkZEN1cnZlKGEsbyxzKX0sWGEucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtpZih0LmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt0IGluc3RhbmNlb2YgaHM/dGhpcy5hZGRQb2x5Z29uKHQpOnQgaW5zdGFuY2VvZiBhcz90aGlzLmFkZExpbmVTdHJpbmcodCk6dCBpbnN0YW5jZW9mIGNzP3RoaXMuYWRkUG9pbnQodCk6KHQgaW5zdGFuY2VvZiBmc3x8dCBpbnN0YW5jZW9mIFpvfHx0IGluc3RhbmNlb2YgZHN8fHQgaW5zdGFuY2VvZiBIbykmJnRoaXMuYWRkQ29sbGVjdGlvbih0KX0sWGEucHJvdG90eXBlLmlzRXJvZGVkQ29tcGxldGVseT1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0Q29vcmRpbmF0ZXMoKTtpZihuLmxlbmd0aDw0KXJldHVybiBlPDA7aWYoND09PW4ubGVuZ3RoKXJldHVybiB0aGlzLmlzVHJpYW5nbGVFcm9kZWRDb21wbGV0ZWx5KG4sZSk7dmFyIHI9dC5nZXRFbnZlbG9wZUludGVybmFsKCksaT1NYXRoLm1pbihyLmdldEhlaWdodCgpLHIuZ2V0V2lkdGgoKSk7cmV0dXJuIGU8MCYmMipNYXRoLmFicyhlKT5pfSxYYS5wcm90b3R5cGUuYWRkQ29sbGVjdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQuZ2V0TnVtR2VvbWV0cmllcygpO2UrKyl7dmFyIG49dC5nZXRHZW9tZXRyeU4oZSk7dGhpcy5hZGQobil9fSxYYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWGEucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFhhfTt2YXIgV2E9ZnVuY3Rpb24oKXt9O1dhLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24odCl7fSxXYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sV2EucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFdhfTt2YXIgSGE9ZnVuY3Rpb24oKXt0aGlzLl9wYXJlbnQ9bnVsbCx0aGlzLl9hdFN0YXJ0PW51bGwsdGhpcy5fbWF4PW51bGwsdGhpcy5faW5kZXg9bnVsbCx0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3I9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fcGFyZW50PXQsdGhpcy5fYXRTdGFydD0hMCx0aGlzLl9pbmRleD0wLHRoaXMuX21heD10LmdldE51bUdlb21ldHJpZXMoKX07SGEucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9hdFN0YXJ0KXJldHVybiB0aGlzLl9hdFN0YXJ0PSExLEhhLmlzQXRvbWljKHRoaXMuX3BhcmVudCkmJnRoaXMuX2luZGV4KyssdGhpcy5fcGFyZW50O2lmKG51bGwhPT10aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3Ipe2lmKHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCkpcmV0dXJuIHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvci5uZXh0KCk7dGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yPW51bGx9aWYodGhpcy5faW5kZXg+PXRoaXMuX21heCl0aHJvdyBuZXcgX287dmFyIHQ9dGhpcy5fcGFyZW50LmdldEdlb21ldHJ5Tih0aGlzLl9pbmRleCsrKTtyZXR1cm4gdCBpbnN0YW5jZW9mIEhvPyh0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3I9bmV3IEhhKHQpLHRoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvci5uZXh0KCkpOnR9LEhhLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSl9LEhhLnByb3RvdHlwZS5oYXNOZXh0PWZ1bmN0aW9uKCl7aWYodGhpcy5fYXRTdGFydClyZXR1cm4hMDtpZihudWxsIT09dGhpcy5fc3ViY29sbGVjdGlvbkl0ZXJhdG9yKXtpZih0aGlzLl9zdWJjb2xsZWN0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKXJldHVybiEwO3RoaXMuX3N1YmNvbGxlY3Rpb25JdGVyYXRvcj1udWxsfXJldHVybiEodGhpcy5faW5kZXg+PXRoaXMuX21heCl9LEhhLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblttb119LEhhLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBIYX0sSGEuaXNBdG9taWM9ZnVuY3Rpb24odCl7cmV0dXJuISh0IGluc3RhbmNlb2YgSG8pfTt2YXIgWmE9ZnVuY3Rpb24oKXt0aGlzLl9nZW9tPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2dlb209dH07WmEucHJvdG90eXBlLmxvY2F0ZT1mdW5jdGlvbih0KXtyZXR1cm4gWmEubG9jYXRlKHQsdGhpcy5fZ2VvbSl9LFphLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltXYV19LFphLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBaYX0sWmEuaXNQb2ludEluUmluZz1mdW5jdGlvbih0LGUpe3JldHVybiEhZS5nZXRFbnZlbG9wZUludGVybmFsKCkuaW50ZXJzZWN0cyh0KSYmZW8uaXNQb2ludEluUmluZyh0LGUuZ2V0Q29vcmRpbmF0ZXMoKSl9LFphLmNvbnRhaW5zUG9pbnRJblBvbHlnb249ZnVuY3Rpb24odCxlKXtpZihlLmlzRW1wdHkoKSlyZXR1cm4hMTt2YXIgbj1lLmdldEV4dGVyaW9yUmluZygpO2lmKCFaYS5pc1BvaW50SW5SaW5nKHQsbikpcmV0dXJuITE7Zm9yKHZhciByPTA7cjxlLmdldE51bUludGVyaW9yUmluZygpO3IrKyl7dmFyIGk9ZS5nZXRJbnRlcmlvclJpbmdOKHIpO2lmKFphLmlzUG9pbnRJblJpbmcodCxpKSlyZXR1cm4hMX1yZXR1cm4hMH0sWmEuY29udGFpbnNQb2ludD1mdW5jdGlvbih0LGUpe2lmKGUgaW5zdGFuY2VvZiBocylyZXR1cm4gWmEuY29udGFpbnNQb2ludEluUG9seWdvbih0LGUpO2lmKGUgaW5zdGFuY2VvZiBIbylmb3IodmFyIG49bmV3IEhhKGUpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7aWYociE9PWUmJlphLmNvbnRhaW5zUG9pbnQodCxyKSlyZXR1cm4hMH1yZXR1cm4hMX0sWmEubG9jYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaXNFbXB0eSgpP2JpLkVYVEVSSU9SOlphLmNvbnRhaW5zUG9pbnQodCxlKT9iaS5JTlRFUklPUjpiaS5FWFRFUklPUn07dmFyIEthPWZ1bmN0aW9uKCl7dGhpcy5fZWRnZU1hcD1uZXcga28sdGhpcy5fZWRnZUxpc3Q9bnVsbCx0aGlzLl9wdEluQXJlYUxvY2F0aW9uPVtiaS5OT05FLGJpLk5PTkVdfTtLYS5wcm90b3R5cGUuZ2V0TmV4dENXPWZ1bmN0aW9uKHQpe3RoaXMuZ2V0RWRnZXMoKTt2YXIgZT10aGlzLl9lZGdlTGlzdC5pbmRleE9mKHQpLG49ZS0xO3JldHVybiAwPT09ZSYmKG49dGhpcy5fZWRnZUxpc3Quc2l6ZSgpLTEpLHRoaXMuX2VkZ2VMaXN0LmdldChuKX0sS2EucHJvdG90eXBlLnByb3BhZ2F0ZVNpZGVMYWJlbHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWJpLk5PTkUsbj10aGlzLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKS5nZXRMYWJlbCgpO3IuaXNBcmVhKHQpJiZyLmdldExvY2F0aW9uKHQsRnMuTEVGVCkhPT1iaS5OT05FJiYoZT1yLmdldExvY2F0aW9uKHQsRnMuTEVGVCkpfWlmKGU9PT1iaS5OT05FKXJldHVybiBudWxsO2Zvcih2YXIgaT1lLG89dGhpcy5pdGVyYXRvcigpO28uaGFzTmV4dCgpOyl7dmFyIHM9by5uZXh0KCksYT1zLmdldExhYmVsKCk7aWYoYS5nZXRMb2NhdGlvbih0LEZzLk9OKT09PWJpLk5PTkUmJmEuc2V0TG9jYXRpb24odCxGcy5PTixpKSxhLmlzQXJlYSh0KSl7dmFyIHU9YS5nZXRMb2NhdGlvbih0LEZzLkxFRlQpLGM9YS5nZXRMb2NhdGlvbih0LEZzLlJJR0hUKTtpZihjIT09YmkuTk9ORSl7aWYoYyE9PWkpdGhyb3cgbmV3IFJzKCJzaWRlIGxvY2F0aW9uIGNvbmZsaWN0IixzLmdldENvb3JkaW5hdGUoKSk7dT09PWJpLk5PTkUmJlppLnNob3VsZE5ldmVyUmVhY2hIZXJlKCJmb3VuZCBzaW5nbGUgbnVsbCBzaWRlIChhdCAiK3MuZ2V0Q29vcmRpbmF0ZSgpKyIpIiksaT11fWVsc2UgWmkuaXNUcnVlKGEuZ2V0TG9jYXRpb24odCxGcy5MRUZUKT09PWJpLk5PTkUsImZvdW5kIHNpbmdsZSBudWxsIHNpZGUiKSxhLnNldExvY2F0aW9uKHQsRnMuUklHSFQsaSksYS5zZXRMb2NhdGlvbih0LEZzLkxFRlQsaSl9fX0sS2EucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLml0ZXJhdG9yKCk7cmV0dXJuIHQuaGFzTmV4dCgpP3QubmV4dCgpLmdldENvb3JkaW5hdGUoKTpudWxsfSxLYS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7a2kub3V0LnByaW50bG4oIkVkZ2VFbmRTdGFyOiAgICIrdGhpcy5nZXRDb29yZGluYXRlKCkpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5wcmludCh0KX19LEthLnByb3RvdHlwZS5pc0FyZWFMYWJlbHNDb25zaXN0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbXB1dGVFZGdlRW5kTGFiZWxzKHQuZ2V0Qm91bmRhcnlOb2RlUnVsZSgpKSx0aGlzLmNoZWNrQXJlYUxhYmVsc0NvbnNpc3RlbnQoMCl9LEthLnByb3RvdHlwZS5jaGVja0FyZWFMYWJlbHNDb25zaXN0ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0RWRnZXMoKTtpZihlLnNpemUoKTw9MClyZXR1cm4hMDt2YXIgbj1lLnNpemUoKS0xLHI9ZS5nZXQobikuZ2V0TGFiZWwoKS5nZXRMb2NhdGlvbih0LEZzLkxFRlQpO1ppLmlzVHJ1ZShyIT09YmkuTk9ORSwiRm91bmQgdW5sYWJlbGxlZCBhcmVhIGVkZ2UiKTtmb3IodmFyIGk9cixvPXRoaXMuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspe3ZhciBzPW8ubmV4dCgpLmdldExhYmVsKCk7WmkuaXNUcnVlKHMuaXNBcmVhKHQpLCJGb3VuZCBub24tYXJlYSBlZGdlIik7dmFyIGE9cy5nZXRMb2NhdGlvbih0LEZzLkxFRlQpLHU9cy5nZXRMb2NhdGlvbih0LEZzLlJJR0hUKTtpZihhPT09dXx8dSE9PWkpcmV0dXJuITE7aT1hfXJldHVybiEwfSxLYS5wcm90b3R5cGUuZmluZEluZGV4PWZ1bmN0aW9uKHQpe3RoaXMuaXRlcmF0b3IoKTtmb3IodmFyIGU9MDtlPHRoaXMuX2VkZ2VMaXN0LnNpemUoKTtlKyspe2lmKHRoaXMuX2VkZ2VMaXN0LmdldChlKT09PXQpcmV0dXJuIGV9cmV0dXJuLTF9LEthLnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEVkZ2VzKCkuaXRlcmF0b3IoKX0sS2EucHJvdG90eXBlLmdldEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9lZGdlTGlzdCYmKHRoaXMuX2VkZ2VMaXN0PW5ldyB4byh0aGlzLl9lZGdlTWFwLnZhbHVlcygpKSksdGhpcy5fZWRnZUxpc3R9LEthLnByb3RvdHlwZS5nZXRMb2NhdGlvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX3B0SW5BcmVhTG9jYXRpb25bdF09PT1iaS5OT05FJiYodGhpcy5fcHRJbkFyZWFMb2NhdGlvblt0XT1aYS5sb2NhdGUoZSxuW3RdLmdldEdlb21ldHJ5KCkpKSx0aGlzLl9wdEluQXJlYUxvY2F0aW9uW3RdfSxLYS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgQWk7dC5hcHBlbmQoIkVkZ2VFbmRTdGFyOiAgICIrdGhpcy5nZXRDb29yZGluYXRlKCkpLHQuYXBwZW5kKCJcbiIpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0LmFwcGVuZChuKSx0LmFwcGVuZCgiXG4iKX1yZXR1cm4gdC50b1N0cmluZygpfSxLYS5wcm90b3R5cGUuY29tcHV0ZUVkZ2VFbmRMYWJlbHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLmNvbXB1dGVMYWJlbCh0KX19LEthLnByb3RvdHlwZS5jb21wdXRlTGFiZWxsaW5nPWZ1bmN0aW9uKHQpe3RoaXMuY29tcHV0ZUVkZ2VFbmRMYWJlbHModFswXS5nZXRCb3VuZGFyeU5vZGVSdWxlKCkpLHRoaXMucHJvcGFnYXRlU2lkZUxhYmVscygwKSx0aGlzLnByb3BhZ2F0ZVNpZGVMYWJlbHMoMSk7Zm9yKHZhciBlPVshMSwhMV0sbj10aGlzLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KWZvcih2YXIgcj1uLm5leHQoKS5nZXRMYWJlbCgpLGk9MDtpPDI7aSsrKXIuaXNMaW5lKGkpJiZyLmdldExvY2F0aW9uKGkpPT09YmkuQk9VTkRBUlkmJihlW2ldPSEwKTtmb3IodmFyIG89dGhpcy5pdGVyYXRvcigpO28uaGFzTmV4dCgpOylmb3IodmFyIHM9by5uZXh0KCksYT1zLmdldExhYmVsKCksdT0wO3U8Mjt1KyspaWYoYS5pc0FueU51bGwodSkpe3ZhciBjPWJpLk5PTkU7aWYoZVt1XSljPWJpLkVYVEVSSU9SO2Vsc2V7dmFyIGw9cy5nZXRDb29yZGluYXRlKCk7Yz10aGlzLmdldExvY2F0aW9uKHUsbCx0KX1hLnNldEFsbExvY2F0aW9uc0lmTnVsbCh1LGMpfX0sS2EucHJvdG90eXBlLmdldERlZ3JlZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlTWFwLnNpemUoKX0sS2EucHJvdG90eXBlLmluc2VydEVkZ2VFbmQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9lZGdlTWFwLnB1dCh0LGUpLHRoaXMuX2VkZ2VMaXN0PW51bGx9LEthLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxLYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gS2F9O3ZhciBKYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdD1udWxsLHRoaXMuX2xhYmVsPW51bGwsdGhpcy5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HPTEsdGhpcy5fTElOS0lOR19UT19PVVRHT0lORz0yfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5saW5rUmVzdWx0RGlyZWN0ZWRFZGdlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5nZXRSZXN1bHRBcmVhRWRnZXMoKTtmb3IodmFyIGU9bnVsbCxuPW51bGwscj10aGlzLl9TQ0FOTklOR19GT1JfSU5DT01JTkcsaT0wO2k8dGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0LnNpemUoKTtpKyspe3ZhciBvPXQuX3Jlc3VsdEFyZWFFZGdlTGlzdC5nZXQoaSkscz1vLmdldFN5bSgpO2lmKG8uZ2V0TGFiZWwoKS5pc0FyZWEoKSlzd2l0Y2gobnVsbD09PWUmJm8uaXNJblJlc3VsdCgpJiYoZT1vKSxyKXtjYXNlIHQuX1NDQU5OSU5HX0ZPUl9JTkNPTUlORzppZighcy5pc0luUmVzdWx0KCkpY29udGludWU7bj1zLHI9dC5fTElOS0lOR19UT19PVVRHT0lORzticmVhaztjYXNlIHQuX0xJTktJTkdfVE9fT1VUR09JTkc6aWYoIW8uaXNJblJlc3VsdCgpKWNvbnRpbnVlO24uc2V0TmV4dChvKSxyPXQuX1NDQU5OSU5HX0ZPUl9JTkNPTUlOR319aWYocj09PXRoaXMuX0xJTktJTkdfVE9fT1VUR09JTkcpe2lmKG51bGw9PT1lKXRocm93IG5ldyBScygibm8gb3V0Z29pbmcgZGlyRWRnZSBmb3VuZCIsdGhpcy5nZXRDb29yZGluYXRlKCkpO1ppLmlzVHJ1ZShlLmlzSW5SZXN1bHQoKSwidW5hYmxlIHRvIGxpbmsgbGFzdCBpbmNvbWluZyBkaXJFZGdlIiksbi5zZXROZXh0KGUpfX0sZS5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQpe3ZhciBlPXQ7dGhpcy5pbnNlcnRFZGdlRW5kKGUsZSl9LGUucHJvdG90eXBlLmdldFJpZ2h0bW9zdEVkZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEVkZ2VzKCksZT10LnNpemUoKTtpZihlPDEpcmV0dXJuIG51bGw7dmFyIG49dC5nZXQoMCk7aWYoMT09PWUpcmV0dXJuIG47dmFyIHI9dC5nZXQoZS0xKSxpPW4uZ2V0UXVhZHJhbnQoKSxvPXIuZ2V0UXVhZHJhbnQoKTtyZXR1cm4gV3MuaXNOb3J0aGVybihpKSYmV3MuaXNOb3J0aGVybihvKT9uOldzLmlzTm9ydGhlcm4oaSl8fFdzLmlzTm9ydGhlcm4obyk/MCE9PW4uZ2V0RHkoKT9uOjAhPT1yLmdldER5KCk/cjooWmkuc2hvdWxkTmV2ZXJSZWFjaEhlcmUoImZvdW5kIHR3byBob3Jpem9udGFsIGVkZ2VzIGluY2lkZW50IG9uIG5vZGUiKSxudWxsKTpyfSxlLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXtraS5vdXQucHJpbnRsbigiRGlyZWN0ZWRFZGdlU3RhcjogIit0aGlzLmdldENvb3JkaW5hdGUoKSk7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3QucHJpbnQoIm91dCAiKSxuLnByaW50KHQpLHQucHJpbnRsbigpLHQucHJpbnQoImluICIpLG4uZ2V0U3ltKCkucHJpbnQodCksdC5wcmludGxuKCl9fSxlLnByb3RvdHlwZS5nZXRSZXN1bHRBcmVhRWRnZXM9ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0KXJldHVybiB0aGlzLl9yZXN1bHRBcmVhRWRnZUxpc3Q7dGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0PW5ldyB4bztmb3IodmFyIHQ9dGhpcy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCk7KGUuaXNJblJlc3VsdCgpfHxlLmdldFN5bSgpLmlzSW5SZXN1bHQoKSkmJnRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdC5hZGQoZSl9cmV0dXJuIHRoaXMuX3Jlc3VsdEFyZWFFZGdlTGlzdH0sZS5wcm90b3R5cGUudXBkYXRlTGFiZWxsaW5nPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKS5nZXRMYWJlbCgpO24uc2V0QWxsTG9jYXRpb25zSWZOdWxsKDAsdC5nZXRMb2NhdGlvbigwKSksbi5zZXRBbGxMb2NhdGlvbnNJZk51bGwoMSx0LmdldExvY2F0aW9uKDEpKX19LGUucHJvdG90eXBlLmxpbmtBbGxEaXJlY3RlZEVkZ2VzPWZ1bmN0aW9uKCl7dGhpcy5nZXRFZGdlcygpO2Zvcih2YXIgdD1udWxsLGU9bnVsbCxuPXRoaXMuX2VkZ2VMaXN0LnNpemUoKS0xO24+PTA7bi0tKXt2YXIgcj10aGlzLl9lZGdlTGlzdC5nZXQobiksaT1yLmdldFN5bSgpO251bGw9PT1lJiYoZT1pKSxudWxsIT09dCYmaS5zZXROZXh0KHQpLHQ9cn1lLnNldE5leHQodCl9LGUucHJvdG90eXBlLmNvbXB1dGVEZXB0aHM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9dGhpcy5maW5kSW5kZXgodCksbj10LmdldERlcHRoKEZzLkxFRlQpLHI9dC5nZXREZXB0aChGcy5SSUdIVCksaT10aGlzLmNvbXB1dGVEZXB0aHMoZSsxLHRoaXMuX2VkZ2VMaXN0LnNpemUoKSxuKTtpZih0aGlzLmNvbXB1dGVEZXB0aHMoMCxlLGkpIT09cil0aHJvdyBuZXcgUnMoImRlcHRoIG1pc21hdGNoIGF0ICIrdC5nZXRDb29yZGluYXRlKCkpfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbMF07YTxvO2ErKyl7dmFyIHU9dGhpcy5fZWRnZUxpc3QuZ2V0KGEpO3Uuc2V0RWRnZURlcHRocyhGcy5SSUdIVCxzKSxzPXUuZ2V0RGVwdGgoRnMuTEVGVCl9cmV0dXJuIHN9fSxlLnByb3RvdHlwZS5tZXJnZVN5bUxhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKTtlLmdldExhYmVsKCkubWVyZ2UoZS5nZXRTeW0oKS5nZXRMYWJlbCgpKX19LGUucHJvdG90eXBlLmxpbmtNaW5pbWFsRGlyZWN0ZWRFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcyxuPW51bGwscj1udWxsLGk9dGhpcy5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HLG89dGhpcy5fcmVzdWx0QXJlYUVkZ2VMaXN0LnNpemUoKS0xO28+PTA7by0tKXt2YXIgcz1lLl9yZXN1bHRBcmVhRWRnZUxpc3QuZ2V0KG8pLGE9cy5nZXRTeW0oKTtzd2l0Y2gobnVsbD09PW4mJnMuZ2V0RWRnZVJpbmcoKT09PXQmJihuPXMpLGkpe2Nhc2UgZS5fU0NBTk5JTkdfRk9SX0lOQ09NSU5HOmlmKGEuZ2V0RWRnZVJpbmcoKSE9PXQpY29udGludWU7cj1hLGk9ZS5fTElOS0lOR19UT19PVVRHT0lORzticmVhaztjYXNlIGUuX0xJTktJTkdfVE9fT1VUR09JTkc6aWYocy5nZXRFZGdlUmluZygpIT09dCljb250aW51ZTtyLnNldE5leHRNaW4ocyksaT1lLl9TQ0FOTklOR19GT1JfSU5DT01JTkd9fWk9PT10aGlzLl9MSU5LSU5HX1RPX09VVEdPSU5HJiYoWmkuaXNUcnVlKG51bGwhPT1uLCJmb3VuZCBudWxsIGZvciBmaXJzdCBvdXRnb2luZyBkaXJFZGdlIiksWmkuaXNUcnVlKG4uZ2V0RWRnZVJpbmcoKT09PXQsInVuYWJsZSB0byBsaW5rIGxhc3QgaW5jb21pbmcgZGlyRWRnZSIpLHIuc2V0TmV4dE1pbihuKSl9LGUucHJvdG90eXBlLmdldE91dGdvaW5nRGVncmVlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgdD0wLGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7ZS5uZXh0KCkuaXNJblJlc3VsdCgpJiZ0Kyt9cmV0dXJuIHR9aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgbj1hcmd1bWVudHNbMF0scj0wLGk9dGhpcy5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7aS5uZXh0KCkuZ2V0RWRnZVJpbmcoKT09PW4mJnIrK31yZXR1cm4gcn19LGUucHJvdG90eXBlLmdldExhYmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfSxlLnByb3RvdHlwZS5maW5kQ292ZXJlZExpbmVFZGdlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1iaS5OT05FLGU9dGhpcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCkscj1uLmdldFN5bSgpO2lmKCFuLmlzTGluZUVkZ2UoKSl7aWYobi5pc0luUmVzdWx0KCkpe3Q9YmkuSU5URVJJT1I7YnJlYWt9aWYoci5pc0luUmVzdWx0KCkpe3Q9YmkuRVhURVJJT1I7YnJlYWt9fX1pZih0PT09YmkuTk9ORSlyZXR1cm4gbnVsbDtmb3IodmFyIGk9dCxvPXRoaXMuaXRlcmF0b3IoKTtvLmhhc05leHQoKTspe3ZhciBzPW8ubmV4dCgpLGE9cy5nZXRTeW0oKTtzLmlzTGluZUVkZ2UoKT9zLmdldEVkZ2UoKS5zZXRDb3ZlcmVkKGk9PT1iaS5JTlRFUklPUik6KHMuaXNJblJlc3VsdCgpJiYoaT1iaS5FWFRFUklPUiksYS5pc0luUmVzdWx0KCkmJihpPWJpLklOVEVSSU9SKSl9fSxlLnByb3RvdHlwZS5jb21wdXRlTGFiZWxsaW5nPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLmNvbXB1dGVMYWJlbGxpbmcuY2FsbCh0aGlzLGUpLHRoaXMuX2xhYmVsPW5ldyBqcyhiaS5OT05FKTtmb3IodmFyIG49dGhpcy5pdGVyYXRvcigpO24uaGFzTmV4dCgpOylmb3IodmFyIHI9bi5uZXh0KCkuZ2V0RWRnZSgpLmdldExhYmVsKCksaT0wO2k8MjtpKyspe3ZhciBvPXIuZ2V0TG9jYXRpb24oaSk7KG89PT1iaS5JTlRFUklPUnx8bz09PWJpLkJPVU5EQVJZKSYmdGhpcy5fbGFiZWwuc2V0TG9jYXRpb24oaSxiaS5JTlRFUklPUil9fSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShLYSksUWE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5jcmVhdGVOb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWXModCxuZXcgSmEpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfShKcyksJGE9ZnVuY3Rpb24gdCgpe3RoaXMuX3B0cz1udWxsLHRoaXMuX29yaWVudGF0aW9uPW51bGw7dmFyIGU9YXJndW1lbnRzWzBdO3RoaXMuX3B0cz1lLHRoaXMuX29yaWVudGF0aW9uPXQub3JpZW50YXRpb24oZSl9OyRhLnByb3RvdHlwZS5jb21wYXJlVG89ZnVuY3Rpb24odCl7dmFyIGU9dDtyZXR1cm4gJGEuY29tcGFyZU9yaWVudGVkKHRoaXMuX3B0cyx0aGlzLl9vcmllbnRhdGlvbixlLl9wdHMsZS5fb3JpZW50YXRpb24pfSwkYS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bZGldfSwkYS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gJGF9LCRhLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiAxPT09RG8uaW5jcmVhc2luZ0RpcmVjdGlvbih0KX0sJGEuY29tcGFyZU9yaWVudGVkPWZ1bmN0aW9uKHQsZSxuLHIpe2Zvcih2YXIgaT1lPzE6LTEsbz1yPzE6LTEscz1lP3QubGVuZ3RoOi0xLGE9cj9uLmxlbmd0aDotMSx1PWU/MDp0Lmxlbmd0aC0xLGM9cj8wOm4ubGVuZ3RoLTE7Oyl7dmFyIGw9dFt1XS5jb21wYXJlVG8obltjXSk7aWYoMCE9PWwpcmV0dXJuIGw7dmFyIGg9KHUrPWkpPT09cyxmPShjKz1vKT09PWE7aWYoaCYmIWYpcmV0dXJuLTE7aWYoIWgmJmYpcmV0dXJuIDE7aWYoaCYmZilyZXR1cm4gMH19O3ZhciB0dT1mdW5jdGlvbigpe3RoaXMuX2VkZ2VzPW5ldyB4byx0aGlzLl9vY2FNYXA9bmV3IGtvfTt0dS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludCgiTVVMVElMSU5FU1RSSU5HICggIik7Zm9yKHZhciBlPTA7ZTx0aGlzLl9lZGdlcy5zaXplKCk7ZSsrKXt2YXIgbj10aGlzLl9lZGdlcy5nZXQoZSk7ZT4wJiZ0LnByaW50KCIsIiksdC5wcmludCgiKCIpO2Zvcih2YXIgcj1uLmdldENvb3JkaW5hdGVzKCksaT0wO2k8ci5sZW5ndGg7aSsrKWk+MCYmdC5wcmludCgiLCIpLHQucHJpbnQocltpXS54KyIgIityW2ldLnkpO3QucHJpbnRsbigiKSIpfXQucHJpbnQoIikgICIpfSx0dS5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXRoaXMuYWRkKGUubmV4dCgpKX0sdHUucHJvdG90eXBlLmZpbmRFZGdlSW5kZXg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9lZGdlcy5zaXplKCk7ZSsrKWlmKHRoaXMuX2VkZ2VzLmdldChlKS5lcXVhbHModCkpcmV0dXJuIGU7cmV0dXJuLTF9LHR1LnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlcy5pdGVyYXRvcigpfSx0dS5wcm90b3R5cGUuZ2V0RWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZXN9LHR1LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2VkZ2VzLmdldCh0KX0sdHUucHJvdG90eXBlLmZpbmRFcXVhbEVkZ2U9ZnVuY3Rpb24odCl7dmFyIGU9bmV3ICRhKHQuZ2V0Q29vcmRpbmF0ZXMoKSk7cmV0dXJuIHRoaXMuX29jYU1hcC5nZXQoZSl9LHR1LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dGhpcy5fZWRnZXMuYWRkKHQpO3ZhciBlPW5ldyAkYSh0LmdldENvb3JkaW5hdGVzKCkpO3RoaXMuX29jYU1hcC5wdXQoZSx0KX0sdHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHR1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB0dX07dmFyIGV1PWZ1bmN0aW9uKCl7fTtldS5wcm90b3R5cGUucHJvY2Vzc0ludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4scil7fSxldS5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7fSxldS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV1fTt2YXIgbnU9ZnVuY3Rpb24oKXt0aGlzLl9oYXNJbnRlcnNlY3Rpb249ITEsdGhpcy5faGFzUHJvcGVyPSExLHRoaXMuX2hhc1Byb3BlckludGVyaW9yPSExLHRoaXMuX2hhc0ludGVyaW9yPSExLHRoaXMuX3Byb3BlckludGVyc2VjdGlvblBvaW50PW51bGwsdGhpcy5fbGk9bnVsbCx0aGlzLl9pc1NlbGZJbnRlcnNlY3Rpb249bnVsbCx0aGlzLm51bUludGVyc2VjdGlvbnM9MCx0aGlzLm51bUludGVyaW9ySW50ZXJzZWN0aW9ucz0wLHRoaXMubnVtUHJvcGVySW50ZXJzZWN0aW9ucz0wLHRoaXMubnVtVGVzdHM9MDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbGk9dH07bnUucHJvdG90eXBlLmlzVHJpdmlhbEludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixyKXtpZih0PT09biYmMT09PXRoaXMuX2xpLmdldEludGVyc2VjdGlvbk51bSgpKXtpZihudS5pc0FkamFjZW50U2VnbWVudHMoZSxyKSlyZXR1cm4hMDtpZih0LmlzQ2xvc2VkKCkpe3ZhciBpPXQuc2l6ZSgpLTE7aWYoMD09PWUmJnI9PT1pfHwwPT09ciYmZT09PWkpcmV0dXJuITB9fXJldHVybiExfSxudS5wcm90b3R5cGUuZ2V0UHJvcGVySW50ZXJzZWN0aW9uUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVySW50ZXJzZWN0aW9uUG9pbnR9LG51LnByb3RvdHlwZS5oYXNQcm9wZXJJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcn0sbnUucHJvdG90eXBlLmdldExpbmVJbnRlcnNlY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9saX0sbnUucHJvdG90eXBlLmhhc1Byb3BlckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJ9LG51LnByb3RvdHlwZS5wcm9jZXNzSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbixyKXtpZih0PT09biYmZT09PXIpcmV0dXJuIG51bGw7dGhpcy5udW1UZXN0cysrO3ZhciBpPXQuZ2V0Q29vcmRpbmF0ZXMoKVtlXSxvPXQuZ2V0Q29vcmRpbmF0ZXMoKVtlKzFdLHM9bi5nZXRDb29yZGluYXRlcygpW3JdLGE9bi5nZXRDb29yZGluYXRlcygpW3IrMV07dGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbihpLG8scyxhKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSYmKHRoaXMubnVtSW50ZXJzZWN0aW9ucysrLHRoaXMuX2xpLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oKSYmKHRoaXMubnVtSW50ZXJpb3JJbnRlcnNlY3Rpb25zKyssdGhpcy5faGFzSW50ZXJpb3I9ITApLHRoaXMuaXNUcml2aWFsSW50ZXJzZWN0aW9uKHQsZSxuLHIpfHwodGhpcy5faGFzSW50ZXJzZWN0aW9uPSEwLHQuYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxlLDApLG4uYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxyLDEpLHRoaXMuX2xpLmlzUHJvcGVyKCkmJih0aGlzLm51bVByb3BlckludGVyc2VjdGlvbnMrKyx0aGlzLl9oYXNQcm9wZXI9ITAsdGhpcy5faGFzUHJvcGVySW50ZXJpb3I9ITApKSl9LG51LnByb3RvdHlwZS5oYXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzSW50ZXJzZWN0aW9ufSxudS5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuITF9LG51LnByb3RvdHlwZS5oYXNJbnRlcmlvckludGVyc2VjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oYXNJbnRlcmlvcn0sbnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2V1XX0sbnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIG51fSxudS5pc0FkamFjZW50U2VnbWVudHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMT09PU1hdGguYWJzKHQtZSl9O3ZhciBydT1mdW5jdGlvbigpe3RoaXMuY29vcmQ9bnVsbCx0aGlzLnNlZ21lbnRJbmRleD1udWxsLHRoaXMuZGlzdD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTt0aGlzLmNvb3JkPW5ldyB2aSh0KSx0aGlzLnNlZ21lbnRJbmRleD1lLHRoaXMuZGlzdD1ufTtydS5wcm90b3R5cGUuZ2V0U2VnbWVudEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VnbWVudEluZGV4fSxydS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvb3JkfSxydS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludCh0aGlzLmNvb3JkKSx0LnByaW50KCIgc2VnICMgPSAiK3RoaXMuc2VnbWVudEluZGV4KSx0LnByaW50bG4oIiBkaXN0ID0gIit0aGlzLmRpc3QpfSxydS5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuY29tcGFyZShlLnNlZ21lbnRJbmRleCxlLmRpc3QpfSxydS5wcm90b3R5cGUuaXNFbmRQb2ludD1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXRoaXMuc2VnbWVudEluZGV4JiYwPT09dGhpcy5kaXN0fHx0aGlzLnNlZ21lbnRJbmRleD09PXR9LHJ1LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvb3JkKyIgc2VnICMgPSAiK3RoaXMuc2VnbWVudEluZGV4KyIgZGlzdCA9ICIrdGhpcy5kaXN0fSxydS5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXN0fSxydS5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnNlZ21lbnRJbmRleDx0Py0xOnRoaXMuc2VnbWVudEluZGV4PnQ/MTp0aGlzLmRpc3Q8ZT8tMTp0aGlzLmRpc3Q+ZT8xOjB9LHJ1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LHJ1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBydX07dmFyIGl1PWZ1bmN0aW9uKCl7dGhpcy5fbm9kZU1hcD1uZXcga28sdGhpcy5lZGdlPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuZWRnZT10fTtpdS5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dC5wcmludGxuKCJJbnRlcnNlY3Rpb25zOiIpO2Zvcih2YXIgZT10aGlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXtlLm5leHQoKS5wcmludCh0KX19LGl1LnByb3RvdHlwZS5pdGVyYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlTWFwLnZhbHVlcygpLml0ZXJhdG9yKCl9LGl1LnByb3RvdHlwZS5hZGRTcGxpdEVkZ2VzPWZ1bmN0aW9uKHQpe3RoaXMuYWRkRW5kcG9pbnRzKCk7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKSxuPWUubmV4dCgpO2UuaGFzTmV4dCgpOyl7dmFyIHI9ZS5uZXh0KCksaT10aGlzLmNyZWF0ZVNwbGl0RWRnZShuLHIpO3QuYWRkKGkpLG49cn19LGl1LnByb3RvdHlwZS5hZGRFbmRwb2ludHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVkZ2UucHRzLmxlbmd0aC0xO3RoaXMuYWRkKHRoaXMuZWRnZS5wdHNbMF0sMCwwKSx0aGlzLmFkZCh0aGlzLmVkZ2UucHRzW3RdLHQsMCl9LGl1LnByb3RvdHlwZS5jcmVhdGVTcGxpdEVkZ2U9ZnVuY3Rpb24odCxlKXt2YXIgbj1lLnNlZ21lbnRJbmRleC10LnNlZ21lbnRJbmRleCsyLHI9dGhpcy5lZGdlLnB0c1tlLnNlZ21lbnRJbmRleF0saT1lLmRpc3Q+MHx8IWUuY29vcmQuZXF1YWxzMkQocik7aXx8bi0tO3ZhciBvPW5ldyBBcnJheShuKS5maWxsKG51bGwpLHM9MDtvW3MrK109bmV3IHZpKHQuY29vcmQpO2Zvcih2YXIgYT10LnNlZ21lbnRJbmRleCsxO2E8PWUuc2VnbWVudEluZGV4O2ErKylvW3MrK109dGhpcy5lZGdlLnB0c1thXTtyZXR1cm4gaSYmKG9bc109ZS5jb29yZCksbmV3IGN1KG8sbmV3IGpzKHRoaXMuZWRnZS5fbGFiZWwpKX0saXUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IHJ1KHQsZSxuKSxpPXRoaXMuX25vZGVNYXAuZ2V0KHIpO3JldHVybiBudWxsIT09aT9pOih0aGlzLl9ub2RlTWFwLnB1dChyLHIpLHIpfSxpdS5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2lmKGUubmV4dCgpLmNvb3JkLmVxdWFscyh0KSlyZXR1cm4hMH1yZXR1cm4hMX0saXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGl1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBpdX07dmFyIG91PWZ1bmN0aW9uKCl7fTtvdS5wcm90b3R5cGUuZ2V0Q2hhaW5TdGFydEluZGljZXM9ZnVuY3Rpb24odCl7dmFyIGU9MCxuPW5ldyB4bztuLmFkZChuZXcgTmkoZSkpO2Rve3ZhciByPXRoaXMuZmluZENoYWluRW5kKHQsZSk7bi5hZGQobmV3IE5pKHIpKSxlPXJ9d2hpbGUoZTx0Lmxlbmd0aC0xKTtyZXR1cm4gb3UudG9JbnRBcnJheShuKX0sb3UucHJvdG90eXBlLmZpbmRDaGFpbkVuZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1Xcy5xdWFkcmFudCh0W2VdLHRbZSsxXSkscj1lKzE7cjx0Lmxlbmd0aDspe2lmKFdzLnF1YWRyYW50KHRbci0xXSx0W3JdKSE9PW4pYnJlYWs7cisrfXJldHVybiByLTF9LG91LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxvdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gb3V9LG91LnRvSW50QXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0LnNpemUoKSkuZmlsbChudWxsKSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT10LmdldChuKS5pbnRWYWx1ZSgpO3JldHVybiBlfTt2YXIgc3U9ZnVuY3Rpb24oKXt0aGlzLmU9bnVsbCx0aGlzLnB0cz1udWxsLHRoaXMuc3RhcnRJbmRleD1udWxsLHRoaXMuZW52MT1uZXcgamksdGhpcy5lbnYyPW5ldyBqaTt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5lPXQsdGhpcy5wdHM9dC5nZXRDb29yZGluYXRlcygpO3ZhciBlPW5ldyBvdTt0aGlzLnN0YXJ0SW5kZXg9ZS5nZXRDaGFpblN0YXJ0SW5kaWNlcyh0aGlzLnB0cyl9O3N1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnB0c30sc3UucHJvdG90eXBlLmdldE1heFg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wdHNbdGhpcy5zdGFydEluZGV4W3RdXS54LG49dGhpcy5wdHNbdGhpcy5zdGFydEluZGV4W3QrMV1dLng7cmV0dXJuIGU+bj9lOm59LHN1LnByb3RvdHlwZS5nZXRNaW5YPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHRzW3RoaXMuc3RhcnRJbmRleFt0XV0ueCxuPXRoaXMucHRzW3RoaXMuc3RhcnRJbmRleFt0KzFdXS54O3JldHVybiBlPG4/ZTpufSxzdS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbj1mdW5jdGlvbigpe2lmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1hcmd1bWVudHNbM107dGhpcy5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKHRoaXMuc3RhcnRJbmRleFt0XSx0aGlzLnN0YXJ0SW5kZXhbdCsxXSxlLGUuc3RhcnRJbmRleFtuXSxlLnN0YXJ0SW5kZXhbbisxXSxyKX1lbHNlIGlmKDY9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl0sYT1hcmd1bWVudHNbM10sdT1hcmd1bWVudHNbNF0sYz1hcmd1bWVudHNbNV0sbD10aGlzLnB0c1tpXSxoPXRoaXMucHRzW29dLGY9cy5wdHNbYV0scD1zLnB0c1t1XTtpZihvLWk9PTEmJnUtYT09MSlyZXR1cm4gYy5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuZSxpLHMuZSxhKSxudWxsO2lmKHRoaXMuZW52MS5pbml0KGwsaCksdGhpcy5lbnYyLmluaXQoZixwKSwhdGhpcy5lbnYxLmludGVyc2VjdHModGhpcy5lbnYyKSlyZXR1cm4gbnVsbDt2YXIgZD1NYXRoLnRydW5jKChpK28pLzIpLGc9TWF0aC50cnVuYygoYSt1KS8yKTtpPGQmJihhPGcmJnRoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbihpLGQscyxhLGcsYyksZzx1JiZ0aGlzLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4oaSxkLHMsZyx1LGMpKSxkPG8mJihhPGcmJnRoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbihkLG8scyxhLGcsYyksZzx1JiZ0aGlzLmNvbXB1dGVJbnRlcnNlY3RzRm9yQ2hhaW4oZCxvLHMsZyx1LGMpKX19LHN1LnByb3RvdHlwZS5nZXRTdGFydEluZGV4ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydEluZGV4fSxzdS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPHRoaXMuc3RhcnRJbmRleC5sZW5ndGgtMTtuKyspZm9yKHZhciByPTA7cjx0LnN0YXJ0SW5kZXgubGVuZ3RoLTE7cisrKXRoaXMuY29tcHV0ZUludGVyc2VjdHNGb3JDaGFpbihuLHQscixlKX0sc3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHN1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBzdX07dmFyIGF1PWZ1bmN0aW9uIHQoKXt0aGlzLl9kZXB0aD1BcnJheSgyKS5maWxsKCkubWFwKChmdW5jdGlvbigpe3JldHVybiBBcnJheSgzKX0pKTtmb3IodmFyIGU9MDtlPDI7ZSsrKWZvcih2YXIgbj0wO248MztuKyspdGhpcy5fZGVwdGhbZV1bbl09dC5OVUxMX1ZBTFVFfSx1dT17TlVMTF9WQUxVRTp7Y29uZmlndXJhYmxlOiEwfX07YXUucHJvdG90eXBlLmdldERlcHRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2RlcHRoW3RdW2VdfSxhdS5wcm90b3R5cGUuc2V0RGVwdGg9ZnVuY3Rpb24odCxlLG4pe3RoaXMuX2RlcHRoW3RdW2VdPW59LGF1LnByb3RvdHlwZS5pc051bGw9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciB0PTA7dDwyO3QrKylmb3IodmFyIGU9MDtlPDM7ZSsrKWlmKHRoaXMuX2RlcHRoW3RdW2VdIT09YXUuTlVMTF9WQUxVRSlyZXR1cm4hMTtyZXR1cm4hMH1pZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLl9kZXB0aFtuXVsxXT09PWF1Lk5VTExfVkFMVUV9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5fZGVwdGhbcl1baV09PT1hdS5OVUxMX1ZBTFVFfX0sYXUucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9MDtlPDI7ZSsrKWlmKCF0LmlzTnVsbChlKSl7dmFyIG49dC5fZGVwdGhbZV1bMV07dC5fZGVwdGhbZV1bMl08biYmKG49dC5fZGVwdGhbZV1bMl0pLG48MCYmKG49MCk7Zm9yKHZhciByPTE7cjwzO3IrKyl7dmFyIGk9MDt0Ll9kZXB0aFtlXVtyXT5uJiYoaT0xKSx0Ll9kZXB0aFtlXVtyXT1pfX19LGF1LnByb3RvdHlwZS5nZXREZWx0YT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGVwdGhbdF1bRnMuUklHSFRdLXRoaXMuX2RlcHRoW3RdW0ZzLkxFRlRdfSxhdS5wcm90b3R5cGUuZ2V0TG9jYXRpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGVwdGhbdF1bZV08PTA/YmkuRVhURVJJT1I6YmkuSU5URVJJT1J9LGF1LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJBOiAiK3RoaXMuX2RlcHRoWzBdWzFdKyIsIit0aGlzLl9kZXB0aFswXVsyXSsiIEI6ICIrdGhpcy5fZGVwdGhbMV1bMV0rIiwiK3RoaXMuX2RlcHRoWzFdWzJdfSxhdS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGU9YXJndW1lbnRzWzBdLG49MDtuPDI7bisrKWZvcih2YXIgcj0xO3I8MztyKyspe3ZhciBpPWUuZ2V0TG9jYXRpb24obixyKTsoaT09PWJpLkVYVEVSSU9SfHxpPT09YmkuSU5URVJJT1IpJiYodC5pc051bGwobixyKT90Ll9kZXB0aFtuXVtyXT1hdS5kZXB0aEF0TG9jYXRpb24oaSk6dC5fZGVwdGhbbl1bcl0rPWF1LmRlcHRoQXRMb2NhdGlvbihpKSl9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdO2FyZ3VtZW50c1syXT09PWJpLklOVEVSSU9SJiZ0aGlzLl9kZXB0aFtvXVtzXSsrfX0sYXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGF1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBhdX0sYXUuZGVwdGhBdExvY2F0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09YmkuRVhURVJJT1I/MDp0PT09YmkuSU5URVJJT1I/MTphdS5OVUxMX1ZBTFVFfSx1dS5OVUxMX1ZBTFVFLmdldD1mdW5jdGlvbigpe3JldHVybi0xfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhhdSx1dSk7dmFyIGN1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtpZih0LmNhbGwodGhpcyksdGhpcy5wdHM9bnVsbCx0aGlzLl9lbnY9bnVsbCx0aGlzLmVpTGlzdD1uZXcgaXUodGhpcyksdGhpcy5fbmFtZT1udWxsLHRoaXMuX21jZT1udWxsLHRoaXMuX2lzSXNvbGF0ZWQ9ITAsdGhpcy5fZGVwdGg9bmV3IGF1LHRoaXMuX2RlcHRoRGVsdGE9MCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdO2UuY2FsbCh0aGlzLG4sbnVsbCl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdO3RoaXMucHRzPXIsdGhpcy5fbGFiZWw9aX19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldERlcHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlcHRofSxlLnByb3RvdHlwZS5nZXRDb2xsYXBzZWRFZGdlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KDIpLmZpbGwobnVsbCk7cmV0dXJuIHRbMF09dGhpcy5wdHNbMF0sdFsxXT10aGlzLnB0c1sxXSxuZXcgZSh0LGpzLnRvTGluZUxhYmVsKHRoaXMuX2xhYmVsKSl9LGUucHJvdG90eXBlLmlzSXNvbGF0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNJc29sYXRlZH0sZS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdHN9LGUucHJvdG90eXBlLnNldElzb2xhdGVkPWZ1bmN0aW9uKHQpe3RoaXMuX2lzSXNvbGF0ZWQ9dH0sZS5wcm90b3R5cGUuc2V0TmFtZT1mdW5jdGlvbih0KXt0aGlzLl9uYW1lPXR9LGUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBlKSlyZXR1cm4hMTt2YXIgbj10O2lmKHRoaXMucHRzLmxlbmd0aCE9PW4ucHRzLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHI9ITAsaT0hMCxvPXRoaXMucHRzLmxlbmd0aCxzPTA7czx0aGlzLnB0cy5sZW5ndGg7cysrKWlmKHRoaXMucHRzW3NdLmVxdWFsczJEKG4ucHRzW3NdKXx8KHI9ITEpLHRoaXMucHRzW3NdLmVxdWFsczJEKG4ucHRzWy0tb10pfHwoaT0hMSksIXImJiFpKXJldHVybiExO3JldHVybiEwfSxlLnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMucHRzLmxlbmd0aD4wP3RoaXMucHRzWzBdOm51bGw7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5wdHNbdF19fSxlLnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LnByaW50KCJlZGdlICIrdGhpcy5fbmFtZSsiOiAiKSx0LnByaW50KCJMSU5FU1RSSU5HICgiKTtmb3IodmFyIGU9MDtlPHRoaXMucHRzLmxlbmd0aDtlKyspZT4wJiZ0LnByaW50KCIsIiksdC5wcmludCh0aGlzLnB0c1tlXS54KyIgIit0aGlzLnB0c1tlXS55KTt0LnByaW50KCIpICAiK3RoaXMuX2xhYmVsKyIgIit0aGlzLl9kZXB0aERlbHRhKX0sZS5wcm90b3R5cGUuY29tcHV0ZUlNPWZ1bmN0aW9uKHQpe2UudXBkYXRlSU0odGhpcy5fbGFiZWwsdCl9LGUucHJvdG90eXBlLmlzQ29sbGFwc2VkPWZ1bmN0aW9uKCl7cmV0dXJuISghdGhpcy5fbGFiZWwuaXNBcmVhKCl8fDMhPT10aGlzLnB0cy5sZW5ndGgpJiYhIXRoaXMucHRzWzBdLmVxdWFscyh0aGlzLnB0c1syXSl9LGUucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzWzBdLmVxdWFscyh0aGlzLnB0c1t0aGlzLnB0cy5sZW5ndGgtMV0pfSxlLnByb3RvdHlwZS5nZXRNYXhpbXVtU2VnbWVudEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHRzLmxlbmd0aC0xfSxlLnByb3RvdHlwZS5nZXREZXB0aERlbHRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlcHRoRGVsdGF9LGUucHJvdG90eXBlLmdldE51bVBvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnB0cy5sZW5ndGh9LGUucHJvdG90eXBlLnByaW50UmV2ZXJzZT1mdW5jdGlvbih0KXt0LnByaW50KCJlZGdlICIrdGhpcy5fbmFtZSsiOiAiKTtmb3IodmFyIGU9dGhpcy5wdHMubGVuZ3RoLTE7ZT49MDtlLS0pdC5wcmludCh0aGlzLnB0c1tlXSsiICIpO3QucHJpbnRsbigiIil9LGUucHJvdG90eXBlLmdldE1vbm90b25lQ2hhaW5FZGdlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT10aGlzLl9tY2UmJih0aGlzLl9tY2U9bmV3IHN1KHRoaXMpKSx0aGlzLl9tY2V9LGUucHJvdG90eXBlLmdldEVudmVsb3BlPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX2Vudil7dGhpcy5fZW52PW5ldyBqaTtmb3IodmFyIHQ9MDt0PHRoaXMucHRzLmxlbmd0aDt0KyspdGhpcy5fZW52LmV4cGFuZFRvSW5jbHVkZSh0aGlzLnB0c1t0XSl9cmV0dXJuIHRoaXMuX2Vudn0sZS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW5ldyB2aSh0LmdldEludGVyc2VjdGlvbihyKSksbz1lLHM9dC5nZXRFZGdlRGlzdGFuY2UobixyKSxhPW8rMTtpZihhPHRoaXMucHRzLmxlbmd0aCl7dmFyIHU9dGhpcy5wdHNbYV07aS5lcXVhbHMyRCh1KSYmKG89YSxzPTApfXRoaXMuZWlMaXN0LmFkZChpLG8scyl9LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFpO3QuYXBwZW5kKCJlZGdlICIrdGhpcy5fbmFtZSsiOiAiKSx0LmFwcGVuZCgiTElORVNUUklORyAoIik7Zm9yKHZhciBlPTA7ZTx0aGlzLnB0cy5sZW5ndGg7ZSsrKWU+MCYmdC5hcHBlbmQoIiwiKSx0LmFwcGVuZCh0aGlzLnB0c1tlXS54KyIgIit0aGlzLnB0c1tlXS55KTtyZXR1cm4gdC5hcHBlbmQoIikgICIrdGhpcy5fbGFiZWwrIiAiK3RoaXMuX2RlcHRoRGVsdGEpLHQudG9TdHJpbmcoKX0sZS5wcm90b3R5cGUuaXNQb2ludHdpc2VFcXVhbD1mdW5jdGlvbih0KXtpZih0aGlzLnB0cy5sZW5ndGghPT10LnB0cy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBlPTA7ZTx0aGlzLnB0cy5sZW5ndGg7ZSsrKWlmKCF0aGlzLnB0c1tlXS5lcXVhbHMyRCh0LnB0c1tlXSkpcmV0dXJuITE7cmV0dXJuITB9LGUucHJvdG90eXBlLnNldERlcHRoRGVsdGE9ZnVuY3Rpb24odCl7dGhpcy5fZGVwdGhEZWx0YT10fSxlLnByb3RvdHlwZS5nZXRFZGdlSW50ZXJzZWN0aW9uTGlzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVpTGlzdH0sZS5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTA7cjx0LmdldEludGVyc2VjdGlvbk51bSgpO3IrKyl0aGlzLmFkZEludGVyc2VjdGlvbih0LGUsbixyKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZS51cGRhdGVJTT1mdW5jdGlvbigpe2lmKDIhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS51cGRhdGVJTS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO24uc2V0QXRMZWFzdElmVmFsaWQoZS5nZXRMb2NhdGlvbigwLEZzLk9OKSxlLmdldExvY2F0aW9uKDEsRnMuT04pLDEpLGUuaXNBcmVhKCkmJihuLnNldEF0TGVhc3RJZlZhbGlkKGUuZ2V0TG9jYXRpb24oMCxGcy5MRUZUKSxlLmdldExvY2F0aW9uKDEsRnMuTEVGVCksMiksbi5zZXRBdExlYXN0SWZWYWxpZChlLmdldExvY2F0aW9uKDAsRnMuUklHSFQpLGUuZ2V0TG9jYXRpb24oMSxGcy5SSUdIVCksMikpfSxlfShHcyksbHU9ZnVuY3Rpb24odCl7dGhpcy5fd29ya2luZ1ByZWNpc2lvbk1vZGVsPW51bGwsdGhpcy5fd29ya2luZ05vZGVyPW51bGwsdGhpcy5fZ2VvbUZhY3Q9bnVsbCx0aGlzLl9ncmFwaD1udWxsLHRoaXMuX2VkZ2VMaXN0PW5ldyB0dSx0aGlzLl9idWZQYXJhbXM9dHx8bnVsbH07bHUucHJvdG90eXBlLnNldFdvcmtpbmdQcmVjaXNpb25Nb2RlbD1mdW5jdGlvbih0KXt0aGlzLl93b3JraW5nUHJlY2lzaW9uTW9kZWw9dH0sbHUucHJvdG90eXBlLmluc2VydFVuaXF1ZUVkZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZWRnZUxpc3QuZmluZEVxdWFsRWRnZSh0KTtpZihudWxsIT09ZSl7dmFyIG49ZS5nZXRMYWJlbCgpLHI9dC5nZXRMYWJlbCgpO2UuaXNQb2ludHdpc2VFcXVhbCh0KXx8KHI9bmV3IGpzKHQuZ2V0TGFiZWwoKSkpLmZsaXAoKSxuLm1lcmdlKHIpO3ZhciBpPWx1LmRlcHRoRGVsdGEociksbz1lLmdldERlcHRoRGVsdGEoKStpO2Uuc2V0RGVwdGhEZWx0YShvKX1lbHNlIHRoaXMuX2VkZ2VMaXN0LmFkZCh0KSx0LnNldERlcHRoRGVsdGEobHUuZGVwdGhEZWx0YSh0LmdldExhYmVsKCkpKX0sbHUucHJvdG90eXBlLmJ1aWxkU3ViZ3JhcGhzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyB4byxyPXQuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3ZhciBpPXIubmV4dCgpLG89aS5nZXRSaWdodG1vc3RDb29yZGluYXRlKCkscz1uZXcgcWEobikuZ2V0RGVwdGgobyk7aS5jb21wdXRlRGVwdGgocyksaS5maW5kUmVzdWx0RWRnZXMoKSxuLmFkZChpKSxlLmFkZChpLmdldERpcmVjdGVkRWRnZXMoKSxpLmdldE5vZGVzKCkpfX0sbHUucHJvdG90eXBlLmNyZWF0ZVN1YmdyYXBocz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49dC5nZXROb2RlcygpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtpZighci5pc1Zpc2l0ZWQoKSl7dmFyIGk9bmV3IGtzO2kuY3JlYXRlKHIpLGUuYWRkKGkpfX1yZXR1cm4gYWEuc29ydChlLGFhLnJldmVyc2VPcmRlcigpKSxlfSxsdS5wcm90b3R5cGUuY3JlYXRlRW1wdHlSZXN1bHRHZW9tZXRyeT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZW9tRmFjdC5jcmVhdGVQb2x5Z29uKCl9LGx1LnByb3RvdHlwZS5nZXROb2Rlcj1mdW5jdGlvbih0KXtpZihudWxsIT09dGhpcy5fd29ya2luZ05vZGVyKXJldHVybiB0aGlzLl93b3JraW5nTm9kZXI7dmFyIGU9bmV3IElhLG49bmV3IFFpO3JldHVybiBuLnNldFByZWNpc2lvbk1vZGVsKHQpLGUuc2V0U2VnbWVudEludGVyc2VjdG9yKG5ldyBudShuKSksZX0sbHUucHJvdG90eXBlLmJ1ZmZlcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3dvcmtpbmdQcmVjaXNpb25Nb2RlbDtudWxsPT09biYmKG49dC5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9nZW9tRmFjdD10LmdldEZhY3RvcnkoKTt2YXIgcj1uZXcgVWEobix0aGlzLl9idWZQYXJhbXMpLGk9bmV3IFhhKHQsZSxyKS5nZXRDdXJ2ZXMoKTtpZihpLnNpemUoKTw9MClyZXR1cm4gdGhpcy5jcmVhdGVFbXB0eVJlc3VsdEdlb21ldHJ5KCk7dGhpcy5jb21wdXRlTm9kZWRFZGdlcyhpLG4pLHRoaXMuX2dyYXBoPW5ldyBRcyhuZXcgUWEpLHRoaXMuX2dyYXBoLmFkZEVkZ2VzKHRoaXMuX2VkZ2VMaXN0LmdldEVkZ2VzKCkpO3ZhciBvPXRoaXMuY3JlYXRlU3ViZ3JhcGhzKHRoaXMuX2dyYXBoKSxzPW5ldyAkcyh0aGlzLl9nZW9tRmFjdCk7dGhpcy5idWlsZFN1YmdyYXBocyhvLHMpO3ZhciBhPXMuZ2V0UG9seWdvbnMoKTtyZXR1cm4gYS5zaXplKCk8PTA/dGhpcy5jcmVhdGVFbXB0eVJlc3VsdEdlb21ldHJ5KCk6dGhpcy5fZ2VvbUZhY3QuYnVpbGRHZW9tZXRyeShhKX0sbHUucHJvdG90eXBlLmNvbXB1dGVOb2RlZEVkZ2VzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXROb2RlcihlKTtuLmNvbXB1dGVOb2Rlcyh0KTtmb3IodmFyIHI9bi5nZXROb2RlZFN1YnN0cmluZ3MoKS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCksbz1pLmdldENvb3JkaW5hdGVzKCk7aWYoMiE9PW8ubGVuZ3RofHwhb1swXS5lcXVhbHMyRChvWzFdKSl7dmFyIHM9aS5nZXREYXRhKCksYT1uZXcgY3UoaS5nZXRDb29yZGluYXRlcygpLG5ldyBqcyhzKSk7dGhpcy5pbnNlcnRVbmlxdWVFZGdlKGEpfX19LGx1LnByb3RvdHlwZS5zZXROb2Rlcj1mdW5jdGlvbih0KXt0aGlzLl93b3JraW5nTm9kZXI9dH0sbHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGx1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBsdX0sbHUuZGVwdGhEZWx0YT1mdW5jdGlvbih0KXt2YXIgZT10LmdldExvY2F0aW9uKDAsRnMuTEVGVCksbj10LmdldExvY2F0aW9uKDAsRnMuUklHSFQpO3JldHVybiBlPT09YmkuSU5URVJJT1ImJm49PT1iaS5FWFRFUklPUj8xOmU9PT1iaS5FWFRFUklPUiYmbj09PWJpLklOVEVSSU9SPy0xOjB9LGx1LmNvbnZlcnRTZWdTdHJpbmdzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgSXMsbj1uZXcgeG87dC5oYXNOZXh0KCk7KXt2YXIgcj10Lm5leHQoKSxpPWUuY3JlYXRlTGluZVN0cmluZyhyLmdldENvb3JkaW5hdGVzKCkpO24uYWRkKGkpfXJldHVybiBlLmJ1aWxkR2VvbWV0cnkobil9O3ZhciBodT1mdW5jdGlvbigpe2lmKHRoaXMuX25vZGVyPW51bGwsdGhpcy5fc2NhbGVGYWN0b3I9bnVsbCx0aGlzLl9vZmZzZXRYPW51bGwsdGhpcy5fb2Zmc2V0WT1udWxsLHRoaXMuX2lzU2NhbGVkPSExLDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fbm9kZXI9dCx0aGlzLl9zY2FsZUZhY3Rvcj1lLHRoaXMuX29mZnNldFg9MCx0aGlzLl9vZmZzZXRZPTAsdGhpcy5faXNTY2FsZWQ9IXRoaXMuaXNJbnRlZ2VyUHJlY2lzaW9uKCl9ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdLG89YXJndW1lbnRzWzNdO3RoaXMuX25vZGVyPW4sdGhpcy5fc2NhbGVGYWN0b3I9cix0aGlzLl9vZmZzZXRYPWksdGhpcy5fb2Zmc2V0WT1vLHRoaXMuX2lzU2NhbGVkPSF0aGlzLmlzSW50ZWdlclByZWNpc2lvbigpfX07aHUucHJvdG90eXBlLnJlc2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKEVpKGFyZ3VtZW50c1swXSxnbykpZm9yKHZhciBlPWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dC5yZXNjYWxlKG4uZ2V0Q29vcmRpbmF0ZXMoKSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5KXtmb3IodmFyIHI9YXJndW1lbnRzWzBdLGk9MDtpPHIubGVuZ3RoO2krKylyW2ldLng9cltpXS54L3QuX3NjYWxlRmFjdG9yK3QuX29mZnNldFgscltpXS55PXJbaV0ueS90Ll9zY2FsZUZhY3Rvcit0Ll9vZmZzZXRZOzI9PT1yLmxlbmd0aCYmclswXS5lcXVhbHMyRChyWzFdKSYma2kub3V0LnByaW50bG4ocil9fSxodS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKEVpKGFyZ3VtZW50c1swXSxnbykpe2Zvcih2YXIgZT1hcmd1bWVudHNbMF0sbj1uZXcgeG8scj1lLml0ZXJhdG9yKCk7ci5oYXNOZXh0KCk7KXt2YXIgaT1yLm5leHQoKTtuLmFkZChuZXcgd2EodC5zY2FsZShpLmdldENvb3JkaW5hdGVzKCkpLGkuZ2V0RGF0YSgpKSl9cmV0dXJuIG59aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBBcnJheSl7Zm9yKHZhciBvPWFyZ3VtZW50c1swXSxzPW5ldyBBcnJheShvLmxlbmd0aCkuZmlsbChudWxsKSxhPTA7YTxvLmxlbmd0aDthKyspc1thXT1uZXcgdmkoTWF0aC5yb3VuZCgob1thXS54LXQuX29mZnNldFgpKnQuX3NjYWxlRmFjdG9yKSxNYXRoLnJvdW5kKChvW2FdLnktdC5fb2Zmc2V0WSkqdC5fc2NhbGVGYWN0b3IpLG9bYV0ueik7cmV0dXJuIERvLnJlbW92ZVJlcGVhdGVkUG9pbnRzKHMpfX0saHUucHJvdG90eXBlLmlzSW50ZWdlclByZWNpc2lvbj1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5fc2NhbGVGYWN0b3J9LGh1LnByb3RvdHlwZS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9ub2Rlci5nZXROb2RlZFN1YnN0cmluZ3MoKTtyZXR1cm4gdGhpcy5faXNTY2FsZWQmJnRoaXMucmVzY2FsZSh0KSx0fSxodS5wcm90b3R5cGUuY29tcHV0ZU5vZGVzPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7dGhpcy5faXNTY2FsZWQmJihlPXRoaXMuc2NhbGUodCkpLHRoaXMuX25vZGVyLmNvbXB1dGVOb2RlcyhlKX0saHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW0FhXX0saHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGh1fTt2YXIgZnU9ZnVuY3Rpb24oKXt0aGlzLl9saT1uZXcgUWksdGhpcy5fc2VnU3RyaW5ncz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9zZWdTdHJpbmdzPXR9LHB1PXtmYWN0Ontjb25maWd1cmFibGU6ITB9fTtmdS5wcm90b3R5cGUuY2hlY2tFbmRQdFZlcnRleEludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgZT10aGlzLl9zZWdTdHJpbmdzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKS5nZXRDb29yZGluYXRlcygpO3QuY2hlY2tFbmRQdFZlcnRleEludGVyc2VjdGlvbnMoblswXSx0Ll9zZWdTdHJpbmdzKSx0LmNoZWNrRW5kUHRWZXJ0ZXhJbnRlcnNlY3Rpb25zKG5bbi5sZW5ndGgtMV0sdC5fc2VnU3RyaW5ncyl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KWZvcih2YXIgbz1pLm5leHQoKS5nZXRDb29yZGluYXRlcygpLHM9MTtzPG8ubGVuZ3RoLTE7cysrKWlmKG9bc10uZXF1YWxzKHIpKXRocm93IG5ldyBXaSgiZm91bmQgZW5kcHQvaW50ZXJpb3IgcHQgaW50ZXJzZWN0aW9uIGF0IGluZGV4ICIrcysiIDpwdCAiK3IpfSxmdS5wcm90b3R5cGUuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIHQ9dGhpcy5fc2VnU3RyaW5ncy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOylmb3IodmFyIGU9dC5uZXh0KCksbj10aGlzLl9zZWdTdHJpbmdzLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTt0aGlzLmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zKGUscil9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9aS5nZXRDb29yZGluYXRlcygpLGE9by5nZXRDb29yZGluYXRlcygpLHU9MDt1PHMubGVuZ3RoLTE7dSsrKWZvcih2YXIgYz0wO2M8YS5sZW5ndGgtMTtjKyspdGhpcy5jaGVja0ludGVyaW9ySW50ZXJzZWN0aW9ucyhpLHUsbyxjKTtlbHNlIGlmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbD1hcmd1bWVudHNbMF0saD1hcmd1bWVudHNbMV0sZj1hcmd1bWVudHNbMl0scD1hcmd1bWVudHNbM107aWYobD09PWYmJmg9PT1wKXJldHVybiBudWxsO3ZhciBkPWwuZ2V0Q29vcmRpbmF0ZXMoKVtoXSxnPWwuZ2V0Q29vcmRpbmF0ZXMoKVtoKzFdLHk9Zi5nZXRDb29yZGluYXRlcygpW3BdLG09Zi5nZXRDb29yZGluYXRlcygpW3ArMV07aWYodGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbihkLGcseSxtKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSYmKHRoaXMuX2xpLmlzUHJvcGVyKCl8fHRoaXMuaGFzSW50ZXJpb3JJbnRlcnNlY3Rpb24odGhpcy5fbGksZCxnKXx8dGhpcy5oYXNJbnRlcmlvckludGVyc2VjdGlvbih0aGlzLl9saSx5LG0pKSl0aHJvdyBuZXcgV2koImZvdW5kIG5vbi1ub2RlZCBpbnRlcnNlY3Rpb24gYXQgIitkKyItIitnKyIgYW5kICIreSsiLSIrbSl9fSxmdS5wcm90b3R5cGUuY2hlY2tWYWxpZD1mdW5jdGlvbigpe3RoaXMuY2hlY2tFbmRQdFZlcnRleEludGVyc2VjdGlvbnMoKSx0aGlzLmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zKCksdGhpcy5jaGVja0NvbGxhcHNlcygpfSxmdS5wcm90b3R5cGUuY2hlY2tDb2xsYXBzZXM9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIHQ9dGhpcy5fc2VnU3RyaW5ncy5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCk7dGhpcy5jaGVja0NvbGxhcHNlcyhlKX1lbHNlIGlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgbj1hcmd1bWVudHNbMF0uZ2V0Q29vcmRpbmF0ZXMoKSxyPTA7cjxuLmxlbmd0aC0yO3IrKyl0aGlzLmNoZWNrQ29sbGFwc2UobltyXSxuW3IrMV0sbltyKzJdKX0sZnUucHJvdG90eXBlLmhhc0ludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9MDtyPHQuZ2V0SW50ZXJzZWN0aW9uTnVtKCk7cisrKXt2YXIgaT10LmdldEludGVyc2VjdGlvbihyKTtpZighaS5lcXVhbHMoZSkmJiFpLmVxdWFscyhuKSlyZXR1cm4hMH1yZXR1cm4hMX0sZnUucHJvdG90eXBlLmNoZWNrQ29sbGFwc2U9ZnVuY3Rpb24odCxlLG4pe2lmKHQuZXF1YWxzKG4pKXRocm93IG5ldyBXaSgiZm91bmQgbm9uLW5vZGVkIGNvbGxhcHNlIGF0ICIrZnUuZmFjdC5jcmVhdGVMaW5lU3RyaW5nKFt0LGUsbl0pKX0sZnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGZ1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBmdX0scHUuZmFjdC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IElzfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmdSxwdSk7dmFyIGR1PWZ1bmN0aW9uKCl7dGhpcy5fbGk9bnVsbCx0aGlzLl9wdD1udWxsLHRoaXMuX29yaWdpbmFsUHQ9bnVsbCx0aGlzLl9wdFNjYWxlZD1udWxsLHRoaXMuX3AwU2NhbGVkPW51bGwsdGhpcy5fcDFTY2FsZWQ9bnVsbCx0aGlzLl9zY2FsZUZhY3Rvcj1udWxsLHRoaXMuX21pbng9bnVsbCx0aGlzLl9tYXh4PW51bGwsdGhpcy5fbWlueT1udWxsLHRoaXMuX21heHk9bnVsbCx0aGlzLl9jb3JuZXI9bmV3IEFycmF5KDQpLmZpbGwobnVsbCksdGhpcy5fc2FmZUVudj1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1syXTtpZih0aGlzLl9vcmlnaW5hbFB0PXQsdGhpcy5fcHQ9dCx0aGlzLl9zY2FsZUZhY3Rvcj1lLHRoaXMuX2xpPW4sZTw9MCl0aHJvdyBuZXcgaGk7MSE9PWUmJih0aGlzLl9wdD1uZXcgdmkodGhpcy5zY2FsZSh0LngpLHRoaXMuc2NhbGUodC55KSksdGhpcy5fcDBTY2FsZWQ9bmV3IHZpLHRoaXMuX3AxU2NhbGVkPW5ldyB2aSksdGhpcy5pbml0Q29ybmVycyh0aGlzLl9wdCl9LGd1PXtTQUZFX0VOVl9FWFBBTlNJT05fRkFDVE9SOntjb25maWd1cmFibGU6ITB9fTtkdS5wcm90b3R5cGUuaW50ZXJzZWN0c1NjYWxlZD1mdW5jdGlvbih0LGUpe3ZhciBuPU1hdGgubWluKHQueCxlLngpLHI9TWF0aC5tYXgodC54LGUueCksaT1NYXRoLm1pbih0LnksZS55KSxvPU1hdGgubWF4KHQueSxlLnkpLHM9dGhpcy5fbWF4eDxufHx0aGlzLl9taW54PnJ8fHRoaXMuX21heHk8aXx8dGhpcy5fbWlueT5vO2lmKHMpcmV0dXJuITE7dmFyIGE9dGhpcy5pbnRlcnNlY3RzVG9sZXJhbmNlU3F1YXJlKHQsZSk7cmV0dXJuIFppLmlzVHJ1ZSghKHMmJmEpLCJGb3VuZCBiYWQgZW52ZWxvcGUgdGVzdCIpLGF9LGR1LnByb3RvdHlwZS5pbml0Q29ybmVycz1mdW5jdGlvbih0KXt2YXIgZT0uNTt0aGlzLl9taW54PXQueC1lLHRoaXMuX21heHg9dC54K2UsdGhpcy5fbWlueT10LnktZSx0aGlzLl9tYXh5PXQueStlLHRoaXMuX2Nvcm5lclswXT1uZXcgdmkodGhpcy5fbWF4eCx0aGlzLl9tYXh5KSx0aGlzLl9jb3JuZXJbMV09bmV3IHZpKHRoaXMuX21pbngsdGhpcy5fbWF4eSksdGhpcy5fY29ybmVyWzJdPW5ldyB2aSh0aGlzLl9taW54LHRoaXMuX21pbnkpLHRoaXMuX2Nvcm5lclszXT1uZXcgdmkodGhpcy5fbWF4eCx0aGlzLl9taW55KX0sZHUucHJvdG90eXBlLmludGVyc2VjdHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMT09PXRoaXMuX3NjYWxlRmFjdG9yP3RoaXMuaW50ZXJzZWN0c1NjYWxlZCh0LGUpOih0aGlzLmNvcHlTY2FsZWQodCx0aGlzLl9wMFNjYWxlZCksdGhpcy5jb3B5U2NhbGVkKGUsdGhpcy5fcDFTY2FsZWQpLHRoaXMuaW50ZXJzZWN0c1NjYWxlZCh0aGlzLl9wMFNjYWxlZCx0aGlzLl9wMVNjYWxlZCkpfSxkdS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCp0aGlzLl9zY2FsZUZhY3Rvcil9LGR1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWdpbmFsUHR9LGR1LnByb3RvdHlwZS5jb3B5U2NhbGVkPWZ1bmN0aW9uKHQsZSl7ZS54PXRoaXMuc2NhbGUodC54KSxlLnk9dGhpcy5zY2FsZSh0LnkpfSxkdS5wcm90b3R5cGUuZ2V0U2FmZUVudmVsb3BlPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX3NhZmVFbnYpe3ZhciB0PWR1LlNBRkVfRU5WX0VYUEFOU0lPTl9GQUNUT1IvdGhpcy5fc2NhbGVGYWN0b3I7dGhpcy5fc2FmZUVudj1uZXcgamkodGhpcy5fb3JpZ2luYWxQdC54LXQsdGhpcy5fb3JpZ2luYWxQdC54K3QsdGhpcy5fb3JpZ2luYWxQdC55LXQsdGhpcy5fb3JpZ2luYWxQdC55K3QpfXJldHVybiB0aGlzLl9zYWZlRW52fSxkdS5wcm90b3R5cGUuaW50ZXJzZWN0c1BpeGVsQ2xvc3VyZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMF0sdGhpcy5fY29ybmVyWzFdKSwhISh0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKXx8KHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclsxXSx0aGlzLl9jb3JuZXJbMl0pLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpKXx8KHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclsyXSx0aGlzLl9jb3JuZXJbM10pLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpKXx8KHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclszXSx0aGlzLl9jb3JuZXJbMF0pLHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpKSl9LGR1LnByb3RvdHlwZS5pbnRlcnNlY3RzVG9sZXJhbmNlU3F1YXJlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ITEscj0hMTtyZXR1cm4gdGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzBdLHRoaXMuX2Nvcm5lclsxXSksISEodGhpcy5fbGkuaXNQcm9wZXIoKXx8KHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24odCxlLHRoaXMuX2Nvcm5lclsxXSx0aGlzLl9jb3JuZXJbMl0pLHRoaXMuX2xpLmlzUHJvcGVyKCkpfHwodGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJihuPSEwKSx0aGlzLl9saS5jb21wdXRlSW50ZXJzZWN0aW9uKHQsZSx0aGlzLl9jb3JuZXJbMl0sdGhpcy5fY29ybmVyWzNdKSx0aGlzLl9saS5pc1Byb3BlcigpKXx8KHRoaXMuX2xpLmhhc0ludGVyc2VjdGlvbigpJiYocj0hMCksdGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbih0LGUsdGhpcy5fY29ybmVyWzNdLHRoaXMuX2Nvcm5lclswXSksdGhpcy5fbGkuaXNQcm9wZXIoKSl8fG4mJnJ8fHQuZXF1YWxzKHRoaXMuX3B0KXx8ZS5lcXVhbHModGhpcy5fcHQpKX0sZHUucHJvdG90eXBlLmFkZFNuYXBwZWROb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5nZXRDb29yZGluYXRlKGUpLHI9dC5nZXRDb29yZGluYXRlKGUrMSk7cmV0dXJuISF0aGlzLmludGVyc2VjdHMobixyKSYmKHQuYWRkSW50ZXJzZWN0aW9uKHRoaXMuZ2V0Q29vcmRpbmF0ZSgpLGUpLCEwKX0sZHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGR1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBkdX0sZ3UuU0FGRV9FTlZfRVhQQU5TSU9OX0ZBQ1RPUi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uNzV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGR1LGd1KTt2YXIgeXU9ZnVuY3Rpb24oKXt0aGlzLnRlbXBFbnYxPW5ldyBqaSx0aGlzLnNlbGVjdGVkU2VnbWVudD1uZXcgYmF9O3l1LnByb3RvdHlwZS5zZWxlY3Q9ZnVuY3Rpb24oKXtpZigxIT09YXJndW1lbnRzLmxlbmd0aCYmMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1sxXTthcmd1bWVudHNbMF0uZ2V0TGluZVNlZ21lbnQodCx0aGlzLnNlbGVjdGVkU2VnbWVudCksdGhpcy5zZWxlY3QodGhpcy5zZWxlY3RlZFNlZ21lbnQpfX0seXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHl1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB5dX07dmFyIG11PWZ1bmN0aW9uKCl7dGhpcy5faW5kZXg9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5faW5kZXg9dH0sdnU9e0hvdFBpeGVsU25hcEFjdGlvbjp7Y29uZmlndXJhYmxlOiEwfX07bXUucHJvdG90eXBlLnNuYXA9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiB0aGlzLnNuYXAodCxudWxsLC0xKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdLGk9ZS5nZXRTYWZlRW52ZWxvcGUoKSxvPW5ldyBfdShlLG4scik7cmV0dXJuIHRoaXMuX2luZGV4LnF1ZXJ5KGkse2ludGVyZmFjZXNfOmZ1bmN0aW9uKCl7cmV0dXJuW3JhXX0sdmlzaXRJdGVtOmZ1bmN0aW9uKHQpe3Quc2VsZWN0KGksbyl9fSksby5pc05vZGVBZGRlZCgpfX0sbXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LG11LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBtdX0sdnUuSG90UGl4ZWxTbmFwQWN0aW9uLmdldD1mdW5jdGlvbigpe3JldHVybiBfdX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobXUsdnUpO3ZhciBfdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX2hvdFBpeGVsPW51bGwsdGhpcy5fcGFyZW50RWRnZT1udWxsLHRoaXMuX2hvdFBpeGVsVmVydGV4SW5kZXg9bnVsbCx0aGlzLl9pc05vZGVBZGRlZD0hMTt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07dGhpcy5faG90UGl4ZWw9ZSx0aGlzLl9wYXJlbnRFZGdlPW4sdGhpcy5faG90UGl4ZWxWZXJ0ZXhJbmRleD1yfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5pc05vZGVBZGRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc05vZGVBZGRlZH0sZS5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKCl7aWYoMiE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQucHJvdG90eXBlLnNlbGVjdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzBdLmdldENvbnRleHQoKTtpZihudWxsIT09dGhpcy5fcGFyZW50RWRnZSYmbj09PXRoaXMuX3BhcmVudEVkZ2UmJmU9PT10aGlzLl9ob3RQaXhlbFZlcnRleEluZGV4KXJldHVybiBudWxsO3RoaXMuX2lzTm9kZUFkZGVkPXRoaXMuX2hvdFBpeGVsLmFkZFNuYXBwZWROb2RlKG4sZSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KHl1KSx4dT1mdW5jdGlvbigpe3RoaXMuX2xpPW51bGwsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb25zPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xpPXQsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb25zPW5ldyB4b307eHUucHJvdG90eXBlLnByb2Nlc3NJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9PT1uJiZlPT09cilyZXR1cm4gbnVsbDt2YXIgaT10LmdldENvb3JkaW5hdGVzKClbZV0sbz10LmdldENvb3JkaW5hdGVzKClbZSsxXSxzPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyXSxhPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyKzFdO2lmKHRoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oaSxvLHMsYSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJnRoaXMuX2xpLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oKSl7Zm9yKHZhciB1PTA7dTx0aGlzLl9saS5nZXRJbnRlcnNlY3Rpb25OdW0oKTt1KyspdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb25zLmFkZCh0aGlzLl9saS5nZXRJbnRlcnNlY3Rpb24odSkpO3QuYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxlLDApLG4uYWRkSW50ZXJzZWN0aW9ucyh0aGlzLl9saSxyLDEpfX0seHUucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSx4dS5wcm90b3R5cGUuZ2V0SW50ZXJpb3JJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9uc30seHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2V1XX0seHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHh1fTt2YXIgd3U9ZnVuY3Rpb24oKXt0aGlzLl9wbT1udWxsLHRoaXMuX2xpPW51bGwsdGhpcy5fc2NhbGVGYWN0b3I9bnVsbCx0aGlzLl9ub2Rlcj1udWxsLHRoaXMuX3BvaW50U25hcHBlcj1udWxsLHRoaXMuX25vZGVkU2VnU3RyaW5ncz1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9wbT10LHRoaXMuX2xpPW5ldyBRaSx0aGlzLl9saS5zZXRQcmVjaXNpb25Nb2RlbCh0KSx0aGlzLl9zY2FsZUZhY3Rvcj10LmdldFNjYWxlKCl9O3d1LnByb3RvdHlwZS5jaGVja0NvcnJlY3RuZXNzPWZ1bmN0aW9uKHQpe3ZhciBlPXdhLmdldE5vZGVkU3Vic3RyaW5ncyh0KSxuPW5ldyBmdShlKTt0cnl7bi5jaGVja1ZhbGlkKCl9Y2F0Y2godCl7aWYoISh0IGluc3RhbmNlb2YgUmkpKXRocm93IHQ7dC5wcmludFN0YWNrVHJhY2UoKX19LHd1LnByb3RvdHlwZS5nZXROb2RlZFN1YnN0cmluZ3M9ZnVuY3Rpb24oKXtyZXR1cm4gd2EuZ2V0Tm9kZWRTdWJzdHJpbmdzKHRoaXMuX25vZGVkU2VnU3RyaW5ncyl9LHd1LnByb3RvdHlwZS5zbmFwUm91bmQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmZpbmRJbnRlcmlvckludGVyc2VjdGlvbnModCxlKTt0aGlzLmNvbXB1dGVJbnRlcnNlY3Rpb25TbmFwcyhuKSx0aGlzLmNvbXB1dGVWZXJ0ZXhTbmFwcyh0KX0sd3UucHJvdG90eXBlLmZpbmRJbnRlcmlvckludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgeHUoZSk7cmV0dXJuIHRoaXMuX25vZGVyLnNldFNlZ21lbnRJbnRlcnNlY3RvcihuKSx0aGlzLl9ub2Rlci5jb21wdXRlTm9kZXModCksbi5nZXRJbnRlcmlvckludGVyc2VjdGlvbnMoKX0sd3UucHJvdG90eXBlLmNvbXB1dGVWZXJ0ZXhTbmFwcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoRWkoYXJndW1lbnRzWzBdLGdvKSlmb3IodmFyIGU9YXJndW1lbnRzWzBdLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0LmNvbXB1dGVWZXJ0ZXhTbmFwcyhuKX1lbHNlIGlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2Ygd2EpZm9yKHZhciByPWFyZ3VtZW50c1swXSxpPXIuZ2V0Q29vcmRpbmF0ZXMoKSxvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBzPW5ldyBkdShpW29dLHQuX3NjYWxlRmFjdG9yLHQuX2xpKTt0Ll9wb2ludFNuYXBwZXIuc25hcChzLHIsbykmJnIuYWRkSW50ZXJzZWN0aW9uKGlbb10sbyl9fSx3dS5wcm90b3R5cGUuY29tcHV0ZU5vZGVzPWZ1bmN0aW9uKHQpe3RoaXMuX25vZGVkU2VnU3RyaW5ncz10LHRoaXMuX25vZGVyPW5ldyBJYSx0aGlzLl9wb2ludFNuYXBwZXI9bmV3IG11KHRoaXMuX25vZGVyLmdldEluZGV4KCkpLHRoaXMuc25hcFJvdW5kKHQsdGhpcy5fbGkpfSx3dS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvblNuYXBzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCksaT1uZXcgZHUocixlLl9zY2FsZUZhY3RvcixlLl9saSk7ZS5fcG9pbnRTbmFwcGVyLnNuYXAoaSl9fSx3dS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bQWFdfSx3dS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gd3V9O3ZhciBidT1mdW5jdGlvbigpe2lmKHRoaXMuX2FyZ0dlb209bnVsbCx0aGlzLl9kaXN0YW5jZT1udWxsLHRoaXMuX2J1ZlBhcmFtcz1uZXcgRmEsdGhpcy5fcmVzdWx0R2VvbWV0cnk9bnVsbCx0aGlzLl9zYXZlRXhjZXB0aW9uPW51bGwsMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9hcmdHZW9tPXR9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuX2FyZ0dlb209ZSx0aGlzLl9idWZQYXJhbXM9bn19LER1PXtDQVBfUk9VTkQ6e2NvbmZpZ3VyYWJsZTohMH0sQ0FQX0JVVFQ6e2NvbmZpZ3VyYWJsZTohMH0sQ0FQX0ZMQVQ6e2NvbmZpZ3VyYWJsZTohMH0sQ0FQX1NRVUFSRTp7Y29uZmlndXJhYmxlOiEwfSxNQVhfUFJFQ0lTSU9OX0RJR0lUUzp7Y29uZmlndXJhYmxlOiEwfX07YnUucHJvdG90eXBlLmJ1ZmZlckZpeGVkUHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBodShuZXcgd3UobmV3IENzKDEpKSx0LmdldFNjYWxlKCkpLG49bmV3IGx1KHRoaXMuX2J1ZlBhcmFtcyk7bi5zZXRXb3JraW5nUHJlY2lzaW9uTW9kZWwodCksbi5zZXROb2RlcihlKSx0aGlzLl9yZXN1bHRHZW9tZXRyeT1uLmJ1ZmZlcih0aGlzLl9hcmdHZW9tLHRoaXMuX2Rpc3RhbmNlKX0sYnUucHJvdG90eXBlLmJ1ZmZlclJlZHVjZWRQcmVjaXNpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGU9YnUuTUFYX1BSRUNJU0lPTl9ESUdJVFM7ZT49MDtlLS0pe3RyeXt0LmJ1ZmZlclJlZHVjZWRQcmVjaXNpb24oZSl9Y2F0Y2goZSl7aWYoIShlIGluc3RhbmNlb2YgUnMpKXRocm93IGU7dC5fc2F2ZUV4Y2VwdGlvbj1lfWlmKG51bGwhPT10Ll9yZXN1bHRHZW9tZXRyeSlyZXR1cm4gbnVsbH10aHJvdyB0aGlzLl9zYXZlRXhjZXB0aW9ufWlmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj1hcmd1bWVudHNbMF0scj1idS5wcmVjaXNpb25TY2FsZUZhY3Rvcih0aGlzLl9hcmdHZW9tLHRoaXMuX2Rpc3RhbmNlLG4pLGk9bmV3IENzKHIpO3RoaXMuYnVmZmVyRml4ZWRQcmVjaXNpb24oaSl9fSxidS5wcm90b3R5cGUuY29tcHV0ZUdlb21ldHJ5PWZ1bmN0aW9uKCl7aWYodGhpcy5idWZmZXJPcmlnaW5hbFByZWNpc2lvbigpLG51bGwhPT10aGlzLl9yZXN1bHRHZW9tZXRyeSlyZXR1cm4gbnVsbDt2YXIgdD10aGlzLl9hcmdHZW9tLmdldEZhY3RvcnkoKS5nZXRQcmVjaXNpb25Nb2RlbCgpO3QuZ2V0VHlwZSgpPT09Q3MuRklYRUQ/dGhpcy5idWZmZXJGaXhlZFByZWNpc2lvbih0KTp0aGlzLmJ1ZmZlclJlZHVjZWRQcmVjaXNpb24oKX0sYnUucHJvdG90eXBlLnNldFF1YWRyYW50U2VnbWVudHM9ZnVuY3Rpb24odCl7dGhpcy5fYnVmUGFyYW1zLnNldFF1YWRyYW50U2VnbWVudHModCl9LGJ1LnByb3RvdHlwZS5idWZmZXJPcmlnaW5hbFByZWNpc2lvbj1mdW5jdGlvbigpe3RyeXt2YXIgdD1uZXcgbHUodGhpcy5fYnVmUGFyYW1zKTt0aGlzLl9yZXN1bHRHZW9tZXRyeT10LmJ1ZmZlcih0aGlzLl9hcmdHZW9tLHRoaXMuX2Rpc3RhbmNlKX1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBXaSkpdGhyb3cgdDt0aGlzLl9zYXZlRXhjZXB0aW9uPXR9fSxidS5wcm90b3R5cGUuZ2V0UmVzdWx0R2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlPXQsdGhpcy5jb21wdXRlR2VvbWV0cnkoKSx0aGlzLl9yZXN1bHRHZW9tZXRyeX0sYnUucHJvdG90eXBlLnNldEVuZENhcFN0eWxlPWZ1bmN0aW9uKHQpe3RoaXMuX2J1ZlBhcmFtcy5zZXRFbmRDYXBTdHlsZSh0KX0sYnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGJ1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBidX0sYnUuYnVmZmVyT3A9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzFdO3JldHVybiBuZXcgYnUoYXJndW1lbnRzWzBdKS5nZXRSZXN1bHRHZW9tZXRyeSh0KX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7aWYoTnVtYmVyLmlzSW50ZWdlcihhcmd1bWVudHNbMl0pJiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvJiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdLHI9bmV3IGJ1KGFyZ3VtZW50c1swXSk7cmV0dXJuIHIuc2V0UXVhZHJhbnRTZWdtZW50cyhuKSxyLmdldFJlc3VsdEdlb21ldHJ5KGUpfWlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgRmEmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8mJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgaT1hcmd1bWVudHNbMV07cmV0dXJuIG5ldyBidShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzJdKS5nZXRSZXN1bHRHZW9tZXRyeShpKX19ZWxzZSBpZig0PT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdLGE9YXJndW1lbnRzWzNdLHU9bmV3IGJ1KGFyZ3VtZW50c1swXSk7cmV0dXJuIHUuc2V0UXVhZHJhbnRTZWdtZW50cyhzKSx1LnNldEVuZENhcFN0eWxlKGEpLHUuZ2V0UmVzdWx0R2VvbWV0cnkobyl9fSxidS5wcmVjaXNpb25TY2FsZUZhY3Rvcj1mdW5jdGlvbih0LGUsbil7dmFyIHI9dC5nZXRFbnZlbG9wZUludGVybmFsKCksaT1DaS5tYXgoTWF0aC5hYnMoci5nZXRNYXhYKCkpLE1hdGguYWJzKHIuZ2V0TWF4WSgpKSxNYXRoLmFicyhyLmdldE1pblgoKSksTWF0aC5hYnMoci5nZXRNaW5ZKCkpKSsyKihlPjA/ZTowKSxvPW4tTWF0aC50cnVuYyhNYXRoLmxvZyhpKS9NYXRoLmxvZygxMCkrMSk7cmV0dXJuIE1hdGgucG93KDEwLG8pfSxEdS5DQVBfUk9VTkQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEZhLkNBUF9ST1VORH0sRHUuQ0FQX0JVVFQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEZhLkNBUF9GTEFUfSxEdS5DQVBfRkxBVC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gRmEuQ0FQX0ZMQVR9LER1LkNBUF9TUVVBUkUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEZhLkNBUF9TUVVBUkV9LER1Lk1BWF9QUkVDSVNJT05fRElHSVRTLmdldD1mdW5jdGlvbigpe3JldHVybiAxMn0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYnUsRHUpO3ZhciBFdT1mdW5jdGlvbigpe3RoaXMuX3B0PVtuZXcgdmksbmV3IHZpXSx0aGlzLl9kaXN0YW5jZT1maS5OYU4sdGhpcy5faXNOdWxsPSEwfTtFdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHR9LEV1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdFt0XX0sRXUucHJvdG90eXBlLnNldE1pbmltdW09ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0TWluaW11bSh0Ll9wdFswXSx0Ll9wdFsxXSl9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO2lmKHRoaXMuX2lzTnVsbClyZXR1cm4gdGhpcy5pbml0aWFsaXplKGUsbiksbnVsbDt2YXIgcj1lLmRpc3RhbmNlKG4pO3I8dGhpcy5fZGlzdGFuY2UmJnRoaXMuaW5pdGlhbGl6ZShlLG4scil9fSxFdS5wcm90b3R5cGUuaW5pdGlhbGl6ZT1mdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuX2lzTnVsbD0hMDtlbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fcHRbMF0uc2V0Q29vcmRpbmF0ZSh0KSx0aGlzLl9wdFsxXS5zZXRDb29yZGluYXRlKGUpLHRoaXMuX2Rpc3RhbmNlPXQuZGlzdGFuY2UoZSksdGhpcy5faXNOdWxsPSExfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXTt0aGlzLl9wdFswXS5zZXRDb29yZGluYXRlKG4pLHRoaXMuX3B0WzFdLnNldENvb3JkaW5hdGUociksdGhpcy5fZGlzdGFuY2U9aSx0aGlzLl9pc051bGw9ITF9fSxFdS5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2V9LEV1LnByb3RvdHlwZS5zZXRNYXhpbXVtPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldE1heGltdW0odC5fcHRbMF0sdC5fcHRbMV0pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLl9pc051bGwpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShlLG4pLG51bGw7dmFyIHI9ZS5kaXN0YW5jZShuKTtyPnRoaXMuX2Rpc3RhbmNlJiZ0aGlzLmluaXRpYWxpemUoZSxuLHIpfX0sRXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEV1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBFdX07dmFyIEN1PWZ1bmN0aW9uKCl7fTtDdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sQ3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEN1fSxDdS5jb21wdXRlRGlzdGFuY2U9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEV1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGFzJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKWZvcih2YXIgdD1hcmd1bWVudHNbMV0sZT1hcmd1bWVudHNbMl0sbj1hcmd1bWVudHNbMF0uZ2V0Q29vcmRpbmF0ZXMoKSxyPW5ldyBiYSxpPTA7aTxuLmxlbmd0aC0xO2krKyl7ci5zZXRDb29yZGluYXRlcyhuW2ldLG5baSsxXSk7dmFyIG89ci5jbG9zZXN0UG9pbnQodCk7ZS5zZXRNaW5pbXVtKG8sdCl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEV1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGhzJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV0sdT1hcmd1bWVudHNbMl07Q3UuY29tcHV0ZURpc3RhbmNlKHMuZ2V0RXh0ZXJpb3JSaW5nKCksYSx1KTtmb3IodmFyIGM9MDtjPHMuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7YysrKUN1LmNvbXB1dGVEaXN0YW5jZShzLmdldEludGVyaW9yUmluZ04oYyksYSx1KX1lbHNlIGlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgRXUmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgaW8mJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciBsPWFyZ3VtZW50c1swXSxoPWFyZ3VtZW50c1sxXSxmPWFyZ3VtZW50c1syXTtpZihsIGluc3RhbmNlb2YgYXMpQ3UuY29tcHV0ZURpc3RhbmNlKGwsaCxmKTtlbHNlIGlmKGwgaW5zdGFuY2VvZiBocylDdS5jb21wdXRlRGlzdGFuY2UobCxoLGYpO2Vsc2UgaWYobCBpbnN0YW5jZW9mIEhvKWZvcih2YXIgcD1sLGQ9MDtkPHAuZ2V0TnVtR2VvbWV0cmllcygpO2QrKyl7dmFyIGc9cC5nZXRHZW9tZXRyeU4oZCk7Q3UuY29tcHV0ZURpc3RhbmNlKGcsaCxmKX1lbHNlIGYuc2V0TWluaW11bShsLmdldENvb3JkaW5hdGUoKSxoKX1lbHNlIGlmKGFyZ3VtZW50c1syXWluc3RhbmNlb2YgRXUmJmFyZ3VtZW50c1swXWluc3RhbmNlb2YgYmEmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2Ygdmkpe3ZhciB5PWFyZ3VtZW50c1sxXSxtPWFyZ3VtZW50c1syXSx2PWFyZ3VtZW50c1swXS5jbG9zZXN0UG9pbnQoeSk7bS5zZXRNaW5pbXVtKHYseSl9fTt2YXIgU3U9ZnVuY3Rpb24odCl7dGhpcy5fbWF4UHREaXN0PW5ldyBFdSx0aGlzLl9pbnB1dEdlb209dHx8bnVsbH0sQXU9e01heFBvaW50RGlzdGFuY2VGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH0sTWF4TWlkcG9pbnREaXN0YW5jZUZpbHRlcjp7Y29uZmlndXJhYmxlOiEwfX07U3UucHJvdG90eXBlLmNvbXB1dGVNYXhNaWRwb2ludERpc3RhbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBJdSh0aGlzLl9pbnB1dEdlb20pO3QuYXBwbHkoZSksdGhpcy5fbWF4UHREaXN0LnNldE1heGltdW0oZS5nZXRNYXhQb2ludERpc3RhbmNlKCkpfSxTdS5wcm90b3R5cGUuY29tcHV0ZU1heFZlcnRleERpc3RhbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBOdSh0aGlzLl9pbnB1dEdlb20pO3QuYXBwbHkoZSksdGhpcy5fbWF4UHREaXN0LnNldE1heGltdW0oZS5nZXRNYXhQb2ludERpc3RhbmNlKCkpfSxTdS5wcm90b3R5cGUuZmluZERpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbXB1dGVNYXhWZXJ0ZXhEaXN0YW5jZSh0KSx0aGlzLmNvbXB1dGVNYXhNaWRwb2ludERpc3RhbmNlKHQpLHRoaXMuX21heFB0RGlzdC5nZXREaXN0YW5jZSgpfSxTdS5wcm90b3R5cGUuZ2V0RGlzdGFuY2VQb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4UHREaXN0fSxTdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sU3UucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFN1fSxBdS5NYXhQb2ludERpc3RhbmNlRmlsdGVyLmdldD1mdW5jdGlvbigpe3JldHVybiBOdX0sQXUuTWF4TWlkcG9pbnREaXN0YW5jZUZpbHRlci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gSXV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFN1LEF1KTt2YXIgTnU9ZnVuY3Rpb24odCl7dGhpcy5fbWF4UHREaXN0PW5ldyBFdSx0aGlzLl9taW5QdERpc3Q9bmV3IEV1LHRoaXMuX2dlb209dHx8bnVsbH07TnUucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt0aGlzLl9taW5QdERpc3QuaW5pdGlhbGl6ZSgpLEN1LmNvbXB1dGVEaXN0YW5jZSh0aGlzLl9nZW9tLHQsdGhpcy5fbWluUHREaXN0KSx0aGlzLl9tYXhQdERpc3Quc2V0TWF4aW11bSh0aGlzLl9taW5QdERpc3QpfSxOdS5wcm90b3R5cGUuZ2V0TWF4UG9pbnREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LE51LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblthb119LE51LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBOdX07dmFyIEl1PWZ1bmN0aW9uKHQpe3RoaXMuX21heFB0RGlzdD1uZXcgRXUsdGhpcy5fbWluUHREaXN0PW5ldyBFdSx0aGlzLl9nZW9tPXR8fG51bGx9O0l1LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCxlKXtpZigwPT09ZSlyZXR1cm4gbnVsbDt2YXIgbj10LmdldENvb3JkaW5hdGUoZS0xKSxyPXQuZ2V0Q29vcmRpbmF0ZShlKSxpPW5ldyB2aSgobi54K3IueCkvMiwobi55K3IueSkvMik7dGhpcy5fbWluUHREaXN0LmluaXRpYWxpemUoKSxDdS5jb21wdXRlRGlzdGFuY2UodGhpcy5fZ2VvbSxpLHRoaXMuX21pblB0RGlzdCksdGhpcy5fbWF4UHREaXN0LnNldE1heGltdW0odGhpcy5fbWluUHREaXN0KX0sSXUucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiExfSxJdS5wcm90b3R5cGUuaXNHZW9tZXRyeUNoYW5nZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSXUucHJvdG90eXBlLmdldE1heFBvaW50RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4UHREaXN0fSxJdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bV29dfSxJdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSXV9O3ZhciBNdT1mdW5jdGlvbih0KXt0aGlzLl9jb21wcz10fHxudWxsfTtNdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBocyYmdGhpcy5fY29tcHMuYWRkKHQpfSxNdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bWG9dfSxNdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTXV9LE11LmdldFBvbHlnb25zPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIE11LmdldFBvbHlnb25zKGFyZ3VtZW50c1swXSxuZXcgeG8pO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07cmV0dXJuIHQgaW5zdGFuY2VvZiBocz9lLmFkZCh0KTp0IGluc3RhbmNlb2YgSG8mJnQuYXBwbHkobmV3IE11KGUpKSxlfX07dmFyIEZ1PWZ1bmN0aW9uKCl7aWYodGhpcy5fbGluZXM9bnVsbCx0aGlzLl9pc0ZvcmNlZFRvTGluZVN0cmluZz0hMSwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xpbmVzPXR9ZWxzZSBpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuX2xpbmVzPWUsdGhpcy5faXNGb3JjZWRUb0xpbmVTdHJpbmc9bn19O0Z1LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7aWYodGhpcy5faXNGb3JjZWRUb0xpbmVTdHJpbmcmJnQgaW5zdGFuY2VvZiBwcyl7dmFyIGU9dC5nZXRGYWN0b3J5KCkuY3JlYXRlTGluZVN0cmluZyh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpKTtyZXR1cm4gdGhpcy5fbGluZXMuYWRkKGUpLG51bGx9dCBpbnN0YW5jZW9mIGFzJiZ0aGlzLl9saW5lcy5hZGQodCl9LEZ1LnByb3RvdHlwZS5zZXRGb3JjZVRvTGluZVN0cmluZz1mdW5jdGlvbih0KXt0aGlzLl9pc0ZvcmNlZFRvTGluZVN0cmluZz10fSxGdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bcm9dfSxGdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gRnV9LEZ1LmdldEdlb21ldHJ5PWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdC5nZXRGYWN0b3J5KCkuYnVpbGRHZW9tZXRyeShGdS5nZXRMaW5lcyh0KSl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4gZS5nZXRGYWN0b3J5KCkuYnVpbGRHZW9tZXRyeShGdS5nZXRMaW5lcyhlLG4pKX19LEZ1LmdldExpbmVzPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIEZ1LmdldExpbmVzKGFyZ3VtZW50c1swXSwhMSk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKEVpKGFyZ3VtZW50c1swXSxnbykmJkVpKGFyZ3VtZW50c1sxXSxnbykpe2Zvcih2YXIgdD1hcmd1bWVudHNbMV0sZT1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO0Z1LmdldExpbmVzKG4sdCl9cmV0dXJuIHR9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1uZXcgeG87cmV0dXJuIHIuYXBwbHkobmV3IEZ1KG8saSkpLG99aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmRWkoYXJndW1lbnRzWzFdLGdvKSl7dmFyIHM9YXJndW1lbnRzWzBdLGE9YXJndW1lbnRzWzFdO3JldHVybiBzIGluc3RhbmNlb2YgYXM/YS5hZGQocyk6cy5hcHBseShuZXcgRnUoYSkpLGF9fWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmRWkoYXJndW1lbnRzWzBdLGdvKSYmRWkoYXJndW1lbnRzWzFdLGdvKSl7Zm9yKHZhciB1PWFyZ3VtZW50c1sxXSxjPWFyZ3VtZW50c1syXSxsPWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO2wuaGFzTmV4dCgpOyl7dmFyIGg9bC5uZXh0KCk7RnUuZ2V0TGluZXMoaCx1LGMpfXJldHVybiB1fWlmKCJib29sZWFuIj09dHlwZW9mIGFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBpbyYmRWkoYXJndW1lbnRzWzFdLGdvKSl7dmFyIGY9YXJndW1lbnRzWzFdLHA9YXJndW1lbnRzWzJdO3JldHVybiBhcmd1bWVudHNbMF0uYXBwbHkobmV3IEZ1KGYscCkpLGZ9fX07dmFyIFR1PWZ1bmN0aW9uKCl7aWYodGhpcy5fYm91bmRhcnlSdWxlPXVvLk9HQ19TRlNfQk9VTkRBUllfUlVMRSx0aGlzLl9pc0luPW51bGwsdGhpcy5fbnVtQm91bmRhcmllcz1udWxsLDAhPT1hcmd1bWVudHMubGVuZ3RoJiYxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO2lmKG51bGw9PT10KXRocm93IG5ldyBoaTt0aGlzLl9ib3VuZGFyeVJ1bGU9dH19O1R1LnByb3RvdHlwZS5sb2NhdGVJbnRlcm5hbD1mdW5jdGlvbigpe2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgaHMpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gYmkuRVhURVJJT1I7dmFyIG49ZS5nZXRFeHRlcmlvclJpbmcoKSxyPXRoaXMubG9jYXRlSW5Qb2x5Z29uUmluZyh0LG4pO2lmKHI9PT1iaS5FWFRFUklPUilyZXR1cm4gYmkuRVhURVJJT1I7aWYocj09PWJpLkJPVU5EQVJZKXJldHVybiBiaS5CT1VOREFSWTtmb3IodmFyIGk9MDtpPGUuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7aSsrKXt2YXIgbz1lLmdldEludGVyaW9yUmluZ04oaSkscz10aGlzLmxvY2F0ZUluUG9seWdvblJpbmcodCxvKTtpZihzPT09YmkuSU5URVJJT1IpcmV0dXJuIGJpLkVYVEVSSU9SO2lmKHM9PT1iaS5CT1VOREFSWSlyZXR1cm4gYmkuQk9VTkRBUll9cmV0dXJuIGJpLklOVEVSSU9SfWlmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgdmkmJmFyZ3VtZW50c1sxXWluc3RhbmNlb2YgYXMpe3ZhciBhPWFyZ3VtZW50c1swXSx1PWFyZ3VtZW50c1sxXTtpZighdS5nZXRFbnZlbG9wZUludGVybmFsKCkuaW50ZXJzZWN0cyhhKSlyZXR1cm4gYmkuRVhURVJJT1I7dmFyIGM9dS5nZXRDb29yZGluYXRlcygpO3JldHVybiB1LmlzQ2xvc2VkKCl8fCFhLmVxdWFscyhjWzBdKSYmIWEuZXF1YWxzKGNbYy5sZW5ndGgtMV0pP2VvLmlzT25MaW5lKGEsYyk/YmkuSU5URVJJT1I6YmkuRVhURVJJT1I6YmkuQk9VTkRBUll9aWYoYXJndW1lbnRzWzBdaW5zdGFuY2VvZiB2aSYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiBjcyl7dmFyIGw9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMV0uZ2V0Q29vcmRpbmF0ZSgpLmVxdWFsczJEKGwpP2JpLklOVEVSSU9SOmJpLkVYVEVSSU9SfX0sVHUucHJvdG90eXBlLmxvY2F0ZUluUG9seWdvblJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRFbnZlbG9wZUludGVybmFsKCkuaW50ZXJzZWN0cyh0KT9lby5sb2NhdGVQb2ludEluUmluZyh0LGUuZ2V0Q29vcmRpbmF0ZXMoKSk6YmkuRVhURVJJT1J9LFR1LnByb3RvdHlwZS5pbnRlcnNlY3RzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubG9jYXRlKHQsZSkhPT1iaS5FWFRFUklPUn0sVHUucHJvdG90eXBlLnVwZGF0ZUxvY2F0aW9uSW5mbz1mdW5jdGlvbih0KXt0PT09YmkuSU5URVJJT1ImJih0aGlzLl9pc0luPSEwKSx0PT09YmkuQk9VTkRBUlkmJnRoaXMuX251bUJvdW5kYXJpZXMrK30sVHUucHJvdG90eXBlLmNvbXB1dGVMb2NhdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoZSBpbnN0YW5jZW9mIGNzJiZ0aGlzLnVwZGF0ZUxvY2F0aW9uSW5mbyh0aGlzLmxvY2F0ZUludGVybmFsKHQsZSkpLGUgaW5zdGFuY2VvZiBhcyl0aGlzLnVwZGF0ZUxvY2F0aW9uSW5mbyh0aGlzLmxvY2F0ZUludGVybmFsKHQsZSkpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGhzKXRoaXMudXBkYXRlTG9jYXRpb25JbmZvKHRoaXMubG9jYXRlSW50ZXJuYWwodCxlKSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgWm8pZm9yKHZhciByPWUsaT0wO2k8ci5nZXROdW1HZW9tZXRyaWVzKCk7aSsrKXt2YXIgbz1yLmdldEdlb21ldHJ5TihpKTtuLnVwZGF0ZUxvY2F0aW9uSW5mbyhuLmxvY2F0ZUludGVybmFsKHQsbykpfWVsc2UgaWYoZSBpbnN0YW5jZW9mIGRzKWZvcih2YXIgcz1lLGE9MDthPHMuZ2V0TnVtR2VvbWV0cmllcygpO2ErKyl7dmFyIHU9cy5nZXRHZW9tZXRyeU4oYSk7bi51cGRhdGVMb2NhdGlvbkluZm8obi5sb2NhdGVJbnRlcm5hbCh0LHUpKX1lbHNlIGlmKGUgaW5zdGFuY2VvZiBIbylmb3IodmFyIGM9bmV3IEhhKGUpO2MuaGFzTmV4dCgpOyl7dmFyIGw9Yy5uZXh0KCk7bCE9PWUmJm4uY29tcHV0ZUxvY2F0aW9uKHQsbCl9fSxUdS5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaXNFbXB0eSgpP2JpLkVYVEVSSU9SOmUgaW5zdGFuY2VvZiBhc3x8ZSBpbnN0YW5jZW9mIGhzP3RoaXMubG9jYXRlSW50ZXJuYWwodCxlKToodGhpcy5faXNJbj0hMSx0aGlzLl9udW1Cb3VuZGFyaWVzPTAsdGhpcy5jb21wdXRlTG9jYXRpb24odCxlKSx0aGlzLl9ib3VuZGFyeVJ1bGUuaXNJbkJvdW5kYXJ5KHRoaXMuX251bUJvdW5kYXJpZXMpP2JpLkJPVU5EQVJZOnRoaXMuX251bUJvdW5kYXJpZXM+MHx8dGhpcy5faXNJbj9iaS5JTlRFUklPUjpiaS5FWFRFUklPUil9LFR1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxUdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gVHV9O3ZhciBPdT1mdW5jdGlvbiB0KCl7aWYodGhpcy5fY29tcG9uZW50PW51bGwsdGhpcy5fc2VnSW5kZXg9bnVsbCx0aGlzLl9wdD1udWxsLDI9PT1hcmd1bWVudHMubGVuZ3RoKXQuY2FsbCh0aGlzLGFyZ3VtZW50c1swXSx0LklOU0lERV9BUkVBLGFyZ3VtZW50c1sxXSk7ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO3RoaXMuX2NvbXBvbmVudD1lLHRoaXMuX3NlZ0luZGV4PW4sdGhpcy5fcHQ9cn19LEx1PXtJTlNJREVfQVJFQTp7Y29uZmlndXJhYmxlOiEwfX07T3UucHJvdG90eXBlLmlzSW5zaWRlQXJlYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWdJbmRleD09PU91LklOU0lERV9BUkVBfSxPdS5wcm90b3R5cGUuZ2V0Q29vcmRpbmF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdH0sT3UucHJvdG90eXBlLmdldEdlb21ldHJ5Q29tcG9uZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudH0sT3UucHJvdG90eXBlLmdldFNlZ21lbnRJbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZWdJbmRleH0sT3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LE91LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBPdX0sTHUuSU5TSURFX0FSRUEuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLTF9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE91LEx1KTt2YXIgUHU9ZnVuY3Rpb24odCl7dGhpcy5fcHRzPXR8fG51bGx9O1B1LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIGNzJiZ0aGlzLl9wdHMuYWRkKHQpfSxQdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bWG9dfSxQdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUHV9LFB1LmdldFBvaW50cz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHQgaW5zdGFuY2VvZiBjcz9hYS5zaW5nbGV0b25MaXN0KHQpOlB1LmdldFBvaW50cyh0LG5ldyB4byl9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtyZXR1cm4gZSBpbnN0YW5jZW9mIGNzP24uYWRkKGUpOmUgaW5zdGFuY2VvZiBIbyYmZS5hcHBseShuZXcgUHUobikpLG59fTt2YXIgUnU9ZnVuY3Rpb24oKXt0aGlzLl9sb2NhdGlvbnM9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fbG9jYXRpb25zPXR9O1J1LnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7KHQgaW5zdGFuY2VvZiBjc3x8dCBpbnN0YW5jZW9mIGFzfHx0IGluc3RhbmNlb2YgaHMpJiZ0aGlzLl9sb2NhdGlvbnMuYWRkKG5ldyBPdSh0LDAsdC5nZXRDb29yZGluYXRlKCkpKX0sUnUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1hvXX0sUnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFJ1fSxSdS5nZXRMb2NhdGlvbnM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHhvO3JldHVybiB0LmFwcGx5KG5ldyBSdShlKSksZX07dmFyIEJ1PWZ1bmN0aW9uKCl7aWYodGhpcy5fZ2VvbT1udWxsLHRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlPTAsdGhpcy5fcHRMb2NhdG9yPW5ldyBUdSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uPW51bGwsdGhpcy5fbWluRGlzdGFuY2U9ZmkuTUFYX1ZBTFVFLDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZ2VvbT1bdCxlXSx0aGlzLl90ZXJtaW5hdGVEaXN0YW5jZT0wfWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50c1syXTt0aGlzLl9nZW9tPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX2dlb21bMF09bix0aGlzLl9nZW9tWzFdPXIsdGhpcy5fdGVybWluYXRlRGlzdGFuY2U9aX19O0J1LnByb3RvdHlwZS5jb21wdXRlQ29udGFpbm1lbnREaXN0YW5jZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPW5ldyBBcnJheSgyKS5maWxsKG51bGwpO2lmKHRoaXMuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2UoMCxlKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGw7dGhpcy5jb21wdXRlQ29udGFpbm1lbnREaXN0YW5jZSgxLGUpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBuPWFyZ3VtZW50c1swXSxyPWFyZ3VtZW50c1sxXSxpPTEtbixvPU11LmdldFBvbHlnb25zKHRoaXMuX2dlb21bbl0pO2lmKG8uc2l6ZSgpPjApe3ZhciBzPVJ1LmdldExvY2F0aW9ucyh0aGlzLl9nZW9tW2ldKTtpZih0aGlzLmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlKHMsbyxyKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25baV09clswXSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uW25dPXJbMV0sbnVsbH19ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFycmF5JiZFaShhcmd1bWVudHNbMF0sdm8pJiZFaShhcmd1bWVudHNbMV0sdm8pKXtmb3IodmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGM9YXJndW1lbnRzWzJdLGw9MDtsPGEuc2l6ZSgpO2wrKylmb3IodmFyIGg9YS5nZXQobCksZj0wO2Y8dS5zaXplKCk7ZisrKWlmKHQuY29tcHV0ZUNvbnRhaW5tZW50RGlzdGFuY2UoaCx1LmdldChmKSxjKSx0Ll9taW5EaXN0YW5jZTw9dC5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFycmF5JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIE91JiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIGhzKXt2YXIgcD1hcmd1bWVudHNbMF0sZD1hcmd1bWVudHNbMV0sZz1hcmd1bWVudHNbMl0seT1wLmdldENvb3JkaW5hdGUoKTtpZihiaS5FWFRFUklPUiE9PXRoaXMuX3B0TG9jYXRvci5sb2NhdGUoeSxkKSlyZXR1cm4gdGhpcy5fbWluRGlzdGFuY2U9MCxnWzBdPXAsZ1sxXT1uZXcgT3UoZCx5KSxudWxsfX0sQnUucHJvdG90eXBlLmNvbXB1dGVNaW5EaXN0YW5jZUxpbmVzUG9pbnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9dGhpcyxpPTA7aTx0LnNpemUoKTtpKyspZm9yKHZhciBvPXQuZ2V0KGkpLHM9MDtzPGUuc2l6ZSgpO3MrKyl7dmFyIGE9ZS5nZXQocyk7aWYoci5jb21wdXRlTWluRGlzdGFuY2UobyxhLG4pLHIuX21pbkRpc3RhbmNlPD1yLl90ZXJtaW5hdGVEaXN0YW5jZSlyZXR1cm4gbnVsbH19LEJ1LnByb3RvdHlwZS5jb21wdXRlRmFjZXREaXN0YW5jZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBBcnJheSgyKS5maWxsKG51bGwpLGU9RnUuZ2V0TGluZXModGhpcy5fZ2VvbVswXSksbj1GdS5nZXRMaW5lcyh0aGlzLl9nZW9tWzFdKSxyPVB1LmdldFBvaW50cyh0aGlzLl9nZW9tWzBdKSxpPVB1LmdldFBvaW50cyh0aGlzLl9nZW9tWzFdKTtpZih0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZUxpbmVzKGUsbix0KSx0aGlzLnVwZGF0ZU1pbkRpc3RhbmNlKHQsITEpLHRoaXMuX21pbkRpc3RhbmNlPD10aGlzLl90ZXJtaW5hdGVEaXN0YW5jZXx8KHRbMF09bnVsbCx0WzFdPW51bGwsdGhpcy5jb21wdXRlTWluRGlzdGFuY2VMaW5lc1BvaW50cyhlLGksdCksdGhpcy51cGRhdGVNaW5EaXN0YW5jZSh0LCExKSx0aGlzLl9taW5EaXN0YW5jZTw9dGhpcy5fdGVybWluYXRlRGlzdGFuY2UpfHwodFswXT1udWxsLHRbMV09bnVsbCx0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZUxpbmVzUG9pbnRzKG4scix0KSx0aGlzLnVwZGF0ZU1pbkRpc3RhbmNlKHQsITApLHRoaXMuX21pbkRpc3RhbmNlPD10aGlzLl90ZXJtaW5hdGVEaXN0YW5jZSkpcmV0dXJuIG51bGw7dFswXT1udWxsLHRbMV09bnVsbCx0aGlzLmNvbXB1dGVNaW5EaXN0YW5jZVBvaW50cyhyLGksdCksdGhpcy51cGRhdGVNaW5EaXN0YW5jZSh0LCExKX0sQnUucHJvdG90eXBlLm5lYXJlc3RMb2NhdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wdXRlTWluRGlzdGFuY2UoKSx0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9ufSxCdS5wcm90b3R5cGUudXBkYXRlTWluRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXtpZihudWxsPT09dFswXSlyZXR1cm4gbnVsbDtlPyh0aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9uWzBdPXRbMV0sdGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvblsxXT10WzBdKToodGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvblswXT10WzBdLHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMV09dFsxXSl9LEJ1LnByb3RvdHlwZS5uZWFyZXN0UG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcHV0ZU1pbkRpc3RhbmNlKCksW3RoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMF0uZ2V0Q29vcmRpbmF0ZSgpLHRoaXMuX21pbkRpc3RhbmNlTG9jYXRpb25bMV0uZ2V0Q29vcmRpbmF0ZSgpXX0sQnUucHJvdG90eXBlLmNvbXB1dGVNaW5EaXN0YW5jZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGwhPT10aGlzLl9taW5EaXN0YW5jZUxvY2F0aW9ufHwodGhpcy5fbWluRGlzdGFuY2VMb2NhdGlvbj1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLmNvbXB1dGVDb250YWlubWVudERpc3RhbmNlKCksdGhpcy5fbWluRGlzdGFuY2U8PXRoaXMuX3Rlcm1pbmF0ZURpc3RhbmNlKSlyZXR1cm4gbnVsbDt0aGlzLmNvbXB1dGVGYWNldERpc3RhbmNlKCl9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFycmF5JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGFzJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIGNzKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj1hcmd1bWVudHNbMl07aWYoZS5nZXRFbnZlbG9wZUludGVybmFsKCkuZGlzdGFuY2Uobi5nZXRFbnZlbG9wZUludGVybmFsKCkpPnRoaXMuX21pbkRpc3RhbmNlKXJldHVybiBudWxsO2Zvcih2YXIgaT1lLmdldENvb3JkaW5hdGVzKCksbz1uLmdldENvb3JkaW5hdGUoKSxzPTA7czxpLmxlbmd0aC0xO3MrKyl7dmFyIGE9ZW8uZGlzdGFuY2VQb2ludExpbmUobyxpW3NdLGlbcysxXSk7aWYoYTx0Ll9taW5EaXN0YW5jZSl7dC5fbWluRGlzdGFuY2U9YTt2YXIgdT1uZXcgYmEoaVtzXSxpW3MrMV0pLmNsb3Nlc3RQb2ludChvKTtyWzBdPW5ldyBPdShlLHMsdSksclsxXT1uZXcgT3UobiwwLG8pfWlmKHQuX21pbkRpc3RhbmNlPD10Ll90ZXJtaW5hdGVEaXN0YW5jZSlyZXR1cm4gbnVsbH19ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIEFycmF5JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGFzJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIGFzKXt2YXIgYz1hcmd1bWVudHNbMF0sbD1hcmd1bWVudHNbMV0saD1hcmd1bWVudHNbMl07aWYoYy5nZXRFbnZlbG9wZUludGVybmFsKCkuZGlzdGFuY2UobC5nZXRFbnZlbG9wZUludGVybmFsKCkpPnRoaXMuX21pbkRpc3RhbmNlKXJldHVybiBudWxsO2Zvcih2YXIgZj1jLmdldENvb3JkaW5hdGVzKCkscD1sLmdldENvb3JkaW5hdGVzKCksZD0wO2Q8Zi5sZW5ndGgtMTtkKyspZm9yKHZhciBnPTA7ZzxwLmxlbmd0aC0xO2crKyl7dmFyIHk9ZW8uZGlzdGFuY2VMaW5lTGluZShmW2RdLGZbZCsxXSxwW2ddLHBbZysxXSk7aWYoeTx0Ll9taW5EaXN0YW5jZSl7dC5fbWluRGlzdGFuY2U9eTt2YXIgbT1uZXcgYmEoZltkXSxmW2QrMV0pLHY9bmV3IGJhKHBbZ10scFtnKzFdKSxfPW0uY2xvc2VzdFBvaW50cyh2KTtoWzBdPW5ldyBPdShjLGQsX1swXSksaFsxXT1uZXcgT3UobCxnLF9bMV0pfWlmKHQuX21pbkRpc3RhbmNlPD10Ll90ZXJtaW5hdGVEaXN0YW5jZSlyZXR1cm4gbnVsbH19fSxCdS5wcm90b3R5cGUuY29tcHV0ZU1pbkRpc3RhbmNlUG9pbnRzPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9dGhpcyxpPTA7aTx0LnNpemUoKTtpKyspZm9yKHZhciBvPXQuZ2V0KGkpLHM9MDtzPGUuc2l6ZSgpO3MrKyl7dmFyIGE9ZS5nZXQocyksdT1vLmdldENvb3JkaW5hdGUoKS5kaXN0YW5jZShhLmdldENvb3JkaW5hdGUoKSk7aWYodTxyLl9taW5EaXN0YW5jZSYmKHIuX21pbkRpc3RhbmNlPXUsblswXT1uZXcgT3UobywwLG8uZ2V0Q29vcmRpbmF0ZSgpKSxuWzFdPW5ldyBPdShhLDAsYS5nZXRDb29yZGluYXRlKCkpKSxyLl9taW5EaXN0YW5jZTw9ci5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fSxCdS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fZ2VvbVswXXx8bnVsbD09PXRoaXMuX2dlb21bMV0pdGhyb3cgbmV3IGhpO3JldHVybiB0aGlzLl9nZW9tWzBdLmlzRW1wdHkoKXx8dGhpcy5fZ2VvbVsxXS5pc0VtcHR5KCk/MDoodGhpcy5jb21wdXRlTWluRGlzdGFuY2UoKSx0aGlzLl9taW5EaXN0YW5jZSl9LEJ1LnByb3RvdHlwZS5jb21wdXRlTWluRGlzdGFuY2VMaW5lcz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXRoaXMsaT0wO2k8dC5zaXplKCk7aSsrKWZvcih2YXIgbz10LmdldChpKSxzPTA7czxlLnNpemUoKTtzKyspe3ZhciBhPWUuZ2V0KHMpO2lmKHIuY29tcHV0ZU1pbkRpc3RhbmNlKG8sYSxuKSxyLl9taW5EaXN0YW5jZTw9ci5fdGVybWluYXRlRGlzdGFuY2UpcmV0dXJuIG51bGx9fSxCdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sQnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEJ1fSxCdS5kaXN0YW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgQnUodCxlKS5kaXN0YW5jZSgpfSxCdS5pc1dpdGhpbkRpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IEJ1KHQsZSxuKS5kaXN0YW5jZSgpPD1ufSxCdS5uZWFyZXN0UG9pbnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBCdSh0LGUpLm5lYXJlc3RQb2ludHMoKX07dmFyIGt1PWZ1bmN0aW9uKCl7dGhpcy5fcHQ9W25ldyB2aSxuZXcgdmldLHRoaXMuX2Rpc3RhbmNlPWZpLk5hTix0aGlzLl9pc051bGw9ITB9O2t1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdH0sa3UucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B0W3RdfSxrdS5wcm90b3R5cGUuc2V0TWluaW11bT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5zZXRNaW5pbXVtKHQuX3B0WzBdLHQuX3B0WzFdKX1lbHNlIGlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07aWYodGhpcy5faXNOdWxsKXJldHVybiB0aGlzLmluaXRpYWxpemUoZSxuKSxudWxsO3ZhciByPWUuZGlzdGFuY2Uobik7cjx0aGlzLl9kaXN0YW5jZSYmdGhpcy5pbml0aWFsaXplKGUsbixyKX19LGt1LnByb3RvdHlwZS5pbml0aWFsaXplPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpdGhpcy5faXNOdWxsPSEwO2Vsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLl9wdFswXS5zZXRDb29yZGluYXRlKHQpLHRoaXMuX3B0WzFdLnNldENvb3JkaW5hdGUoZSksdGhpcy5fZGlzdGFuY2U9dC5kaXN0YW5jZShlKSx0aGlzLl9pc051bGw9ITF9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzWzJdO3RoaXMuX3B0WzBdLnNldENvb3JkaW5hdGUobiksdGhpcy5fcHRbMV0uc2V0Q29vcmRpbmF0ZShyKSx0aGlzLl9kaXN0YW5jZT1pLHRoaXMuX2lzTnVsbD0hMX19LGt1LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBYaS50b0xpbmVTdHJpbmcodGhpcy5fcHRbMF0sdGhpcy5fcHRbMV0pfSxrdS5wcm90b3R5cGUuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2V9LGt1LnByb3RvdHlwZS5zZXRNYXhpbXVtPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLnNldE1heGltdW0odC5fcHRbMF0sdC5fcHRbMV0pfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXTtpZih0aGlzLl9pc051bGwpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShlLG4pLG51bGw7dmFyIHI9ZS5kaXN0YW5jZShuKTtyPnRoaXMuX2Rpc3RhbmNlJiZ0aGlzLmluaXRpYWxpemUoZSxuLHIpfX0sa3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGt1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBrdX07dmFyIHp1PWZ1bmN0aW9uKCl7fTt6dS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0senUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHp1fSx6dS5jb21wdXRlRGlzdGFuY2U9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIGt1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGFzJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKWZvcih2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl0scj1uZXcgYmEsaT10LmdldENvb3JkaW5hdGVzKCksbz0wO288aS5sZW5ndGgtMTtvKyspe3Iuc2V0Q29vcmRpbmF0ZXMoaVtvXSxpW28rMV0pO3ZhciBzPXIuY2xvc2VzdFBvaW50KGUpO24uc2V0TWluaW11bShzLGUpfWVsc2UgaWYoYXJndW1lbnRzWzJdaW5zdGFuY2VvZiBrdSYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiBocyYmYXJndW1lbnRzWzFdaW5zdGFuY2VvZiB2aSl7dmFyIGE9YXJndW1lbnRzWzBdLHU9YXJndW1lbnRzWzFdLGM9YXJndW1lbnRzWzJdO3p1LmNvbXB1dGVEaXN0YW5jZShhLmdldEV4dGVyaW9yUmluZygpLHUsYyk7Zm9yKHZhciBsPTA7bDxhLmdldE51bUludGVyaW9yUmluZygpO2wrKyl6dS5jb21wdXRlRGlzdGFuY2UoYS5nZXRJbnRlcmlvclJpbmdOKGwpLHUsYyl9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIGt1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgaD1hcmd1bWVudHNbMF0sZj1hcmd1bWVudHNbMV0scD1hcmd1bWVudHNbMl07aWYoaCBpbnN0YW5jZW9mIGFzKXp1LmNvbXB1dGVEaXN0YW5jZShoLGYscCk7ZWxzZSBpZihoIGluc3RhbmNlb2YgaHMpenUuY29tcHV0ZURpc3RhbmNlKGgsZixwKTtlbHNlIGlmKGggaW5zdGFuY2VvZiBIbylmb3IodmFyIGQ9aCxnPTA7ZzxkLmdldE51bUdlb21ldHJpZXMoKTtnKyspe3ZhciB5PWQuZ2V0R2VvbWV0cnlOKGcpO3p1LmNvbXB1dGVEaXN0YW5jZSh5LGYscCl9ZWxzZSBwLnNldE1pbmltdW0oaC5nZXRDb29yZGluYXRlKCksZil9ZWxzZSBpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIGt1JiZhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGJhJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIHZpKXt2YXIgbT1hcmd1bWVudHNbMV0sdj1hcmd1bWVudHNbMl0sXz1hcmd1bWVudHNbMF0uY2xvc2VzdFBvaW50KG0pO3Yuc2V0TWluaW11bShfLG0pfX07dmFyIGp1PWZ1bmN0aW9uKCl7dGhpcy5fZzA9bnVsbCx0aGlzLl9nMT1udWxsLHRoaXMuX3B0RGlzdD1uZXcga3UsdGhpcy5fZGVuc2lmeUZyYWM9MDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZzA9dCx0aGlzLl9nMT1lfSxVdT17TWF4UG9pbnREaXN0YW5jZUZpbHRlcjp7Y29uZmlndXJhYmxlOiEwfSxNYXhEZW5zaWZpZWRCeUZyYWN0aW9uRGlzdGFuY2VGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH19O2p1LnByb3RvdHlwZS5nZXRDb29yZGluYXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wdERpc3QuZ2V0Q29vcmRpbmF0ZXMoKX0sanUucHJvdG90eXBlLnNldERlbnNpZnlGcmFjdGlvbj1mdW5jdGlvbih0KXtpZih0PjF8fHQ8PTApdGhyb3cgbmV3IGhpO3RoaXMuX2RlbnNpZnlGcmFjPXR9LGp1LnByb3RvdHlwZS5jb21wdXRlPWZ1bmN0aW9uKHQsZSl7dGhpcy5jb21wdXRlT3JpZW50ZWREaXN0YW5jZSh0LGUsdGhpcy5fcHREaXN0KSx0aGlzLmNvbXB1dGVPcmllbnRlZERpc3RhbmNlKGUsdCx0aGlzLl9wdERpc3QpfSxqdS5wcm90b3R5cGUuZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wdXRlKHRoaXMuX2cwLHRoaXMuX2cxKSx0aGlzLl9wdERpc3QuZ2V0RGlzdGFuY2UoKX0sanUucHJvdG90eXBlLmNvbXB1dGVPcmllbnRlZERpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgcXUoZSk7aWYodC5hcHBseShyKSxuLnNldE1heGltdW0oci5nZXRNYXhQb2ludERpc3RhbmNlKCkpLHRoaXMuX2RlbnNpZnlGcmFjPjApe3ZhciBpPW5ldyBWdShlLHRoaXMuX2RlbnNpZnlGcmFjKTt0LmFwcGx5KGkpLG4uc2V0TWF4aW11bShpLmdldE1heFBvaW50RGlzdGFuY2UoKSl9fSxqdS5wcm90b3R5cGUub3JpZW50ZWREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXB1dGVPcmllbnRlZERpc3RhbmNlKHRoaXMuX2cwLHRoaXMuX2cxLHRoaXMuX3B0RGlzdCksdGhpcy5fcHREaXN0LmdldERpc3RhbmNlKCl9LGp1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxqdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4ganV9LGp1LmRpc3RhbmNlPWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG5ldyBqdShhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKS5kaXN0YW5jZSgpO2lmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMl0sZT1uZXcganUoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk7cmV0dXJuIGUuc2V0RGVuc2lmeUZyYWN0aW9uKHQpLGUuZGlzdGFuY2UoKX19LFV1Lk1heFBvaW50RGlzdGFuY2VGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHF1fSxVdS5NYXhEZW5zaWZpZWRCeUZyYWN0aW9uRGlzdGFuY2VGaWx0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFZ1fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhqdSxVdSk7dmFyIHF1PWZ1bmN0aW9uKCl7dGhpcy5fbWF4UHREaXN0PW5ldyBrdSx0aGlzLl9taW5QdERpc3Q9bmV3IGt1LHRoaXMuX2V1Y2xpZGVhbkRpc3Q9bmV3IHp1LHRoaXMuX2dlb209bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5fZ2VvbT10fTtxdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3RoaXMuX21pblB0RGlzdC5pbml0aWFsaXplKCksenUuY29tcHV0ZURpc3RhbmNlKHRoaXMuX2dlb20sdCx0aGlzLl9taW5QdERpc3QpLHRoaXMuX21heFB0RGlzdC5zZXRNYXhpbXVtKHRoaXMuX21pblB0RGlzdCl9LHF1LnByb3RvdHlwZS5nZXRNYXhQb2ludERpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heFB0RGlzdH0scXUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2FvXX0scXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHF1fTt2YXIgVnU9ZnVuY3Rpb24oKXt0aGlzLl9tYXhQdERpc3Q9bmV3IGt1LHRoaXMuX21pblB0RGlzdD1uZXcga3UsdGhpcy5fZ2VvbT1udWxsLHRoaXMuX251bVN1YlNlZ3M9MDt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fZ2VvbT10LHRoaXMuX251bVN1YlNlZ3M9TWF0aC50cnVuYyhNYXRoLnJvdW5kKDEvZSkpfTtWdS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZigwPT09ZSlyZXR1cm4gbnVsbDtmb3IodmFyIHI9dC5nZXRDb29yZGluYXRlKGUtMSksaT10LmdldENvb3JkaW5hdGUoZSksbz0oaS54LXIueCkvdGhpcy5fbnVtU3ViU2VncyxzPShpLnktci55KS90aGlzLl9udW1TdWJTZWdzLGE9MDthPHRoaXMuX251bVN1YlNlZ3M7YSsrKXt2YXIgdT1yLngrYSpvLGM9ci55K2EqcyxsPW5ldyB2aSh1LGMpO24uX21pblB0RGlzdC5pbml0aWFsaXplKCksenUuY29tcHV0ZURpc3RhbmNlKG4uX2dlb20sbCxuLl9taW5QdERpc3QpLG4uX21heFB0RGlzdC5zZXRNYXhpbXVtKG4uX21pblB0RGlzdCl9fSxWdS5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuITF9LFZ1LnByb3RvdHlwZS5pc0dlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe3JldHVybiExfSxWdS5wcm90b3R5cGUuZ2V0TWF4UG9pbnREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhQdERpc3R9LFZ1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltXb119LFZ1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBWdX07dmFyIEd1PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9taW5WYWxpZERpc3RhbmNlPW51bGwsdGhpcy5fbWF4VmFsaWREaXN0YW5jZT1udWxsLHRoaXMuX21pbkRpc3RhbmNlRm91bmQ9bnVsbCx0aGlzLl9tYXhEaXN0YW5jZUZvdW5kPW51bGwsdGhpcy5faXNWYWxpZD0hMCx0aGlzLl9lcnJNc2c9bnVsbCx0aGlzLl9lcnJvckxvY2F0aW9uPW51bGwsdGhpcy5fZXJyb3JJbmRpY2F0b3I9bnVsbCx0aGlzLl9pbnB1dD10fHxudWxsLHRoaXMuX2J1ZkRpc3RhbmNlPWV8fG51bGwsdGhpcy5fcmVzdWx0PW58fG51bGx9LFl1PXtWRVJCT1NFOntjb25maWd1cmFibGU6ITB9LE1BWF9ESVNUQU5DRV9ESUZGX0ZSQUM6e2NvbmZpZ3VyYWJsZTohMH19O0d1LnByb3RvdHlwZS5jaGVja01heGltdW1EaXN0YW5jZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IGp1KGUsdCk7aWYoci5zZXREZW5zaWZ5RnJhY3Rpb24oLjI1KSx0aGlzLl9tYXhEaXN0YW5jZUZvdW5kPXIub3JpZW50ZWREaXN0YW5jZSgpLHRoaXMuX21heERpc3RhbmNlRm91bmQ+bil7dGhpcy5faXNWYWxpZD0hMTt2YXIgaT1yLmdldENvb3JkaW5hdGVzKCk7dGhpcy5fZXJyb3JMb2NhdGlvbj1pWzFdLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVTdHJpbmcoaSksdGhpcy5fZXJyTXNnPSJEaXN0YW5jZSBiZXR3ZWVuIGJ1ZmZlciBjdXJ2ZSBhbmQgaW5wdXQgaXMgdG9vIGxhcmdlICgiK3RoaXMuX21heERpc3RhbmNlRm91bmQrIiBhdCAiK1hpLnRvTGluZVN0cmluZyhpWzBdLGlbMV0pKyIpIn19LEd1LnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7dmFyIHQ9TWF0aC5hYnModGhpcy5fYnVmRGlzdGFuY2UpLGU9R3UuTUFYX0RJU1RBTkNFX0RJRkZfRlJBQyp0O3JldHVybiB0aGlzLl9taW5WYWxpZERpc3RhbmNlPXQtZSx0aGlzLl9tYXhWYWxpZERpc3RhbmNlPXQrZSwhKCF0aGlzLl9pbnB1dC5pc0VtcHR5KCkmJiF0aGlzLl9yZXN1bHQuaXNFbXB0eSgpKXx8KHRoaXMuX2J1ZkRpc3RhbmNlPjA/dGhpcy5jaGVja1Bvc2l0aXZlVmFsaWQoKTp0aGlzLmNoZWNrTmVnYXRpdmVWYWxpZCgpLEd1LlZFUkJPU0UmJmtpLm91dC5wcmludGxuKCJNaW4gRGlzdD0gIit0aGlzLl9taW5EaXN0YW5jZUZvdW5kKyIgIGVycj0gIisoMS10aGlzLl9taW5EaXN0YW5jZUZvdW5kL3RoaXMuX2J1ZkRpc3RhbmNlKSsiICBNYXggRGlzdD0gIit0aGlzLl9tYXhEaXN0YW5jZUZvdW5kKyIgIGVycj0gIisodGhpcy5fbWF4RGlzdGFuY2VGb3VuZC90aGlzLl9idWZEaXN0YW5jZS0xKSksdGhpcy5faXNWYWxpZCl9LEd1LnByb3RvdHlwZS5jaGVja05lZ2F0aXZlVmFsaWQ9ZnVuY3Rpb24oKXtpZighKHRoaXMuX2lucHV0IGluc3RhbmNlb2YgaHN8fHRoaXMuX2lucHV0IGluc3RhbmNlb2YgZHN8fHRoaXMuX2lucHV0IGluc3RhbmNlb2YgSG8pKXJldHVybiBudWxsO3ZhciB0PXRoaXMuZ2V0UG9seWdvbkxpbmVzKHRoaXMuX2lucHV0KTtpZih0aGlzLmNoZWNrTWluaW11bURpc3RhbmNlKHQsdGhpcy5fcmVzdWx0LHRoaXMuX21pblZhbGlkRGlzdGFuY2UpLCF0aGlzLl9pc1ZhbGlkKXJldHVybiBudWxsO3RoaXMuY2hlY2tNYXhpbXVtRGlzdGFuY2UodCx0aGlzLl9yZXN1bHQsdGhpcy5fbWF4VmFsaWREaXN0YW5jZSl9LEd1LnByb3RvdHlwZS5nZXRFcnJvckluZGljYXRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lcnJvckluZGljYXRvcn0sR3UucHJvdG90eXBlLmNoZWNrTWluaW11bURpc3RhbmNlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgQnUodCxlLG4pO2lmKHRoaXMuX21pbkRpc3RhbmNlRm91bmQ9ci5kaXN0YW5jZSgpLHRoaXMuX21pbkRpc3RhbmNlRm91bmQ8bil7dGhpcy5faXNWYWxpZD0hMTt2YXIgaT1yLm5lYXJlc3RQb2ludHMoKTt0aGlzLl9lcnJvckxvY2F0aW9uPXIubmVhcmVzdFBvaW50cygpWzFdLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUxpbmVTdHJpbmcoaSksdGhpcy5fZXJyTXNnPSJEaXN0YW5jZSBiZXR3ZWVuIGJ1ZmZlciBjdXJ2ZSBhbmQgaW5wdXQgaXMgdG9vIHNtYWxsICgiK3RoaXMuX21pbkRpc3RhbmNlRm91bmQrIiBhdCAiK1hpLnRvTGluZVN0cmluZyhpWzBdLGlbMV0pKyIgKSJ9fSxHdS5wcm90b3R5cGUuY2hlY2tQb3NpdGl2ZVZhbGlkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVzdWx0LmdldEJvdW5kYXJ5KCk7aWYodGhpcy5jaGVja01pbmltdW1EaXN0YW5jZSh0aGlzLl9pbnB1dCx0LHRoaXMuX21pblZhbGlkRGlzdGFuY2UpLCF0aGlzLl9pc1ZhbGlkKXJldHVybiBudWxsO3RoaXMuY2hlY2tNYXhpbXVtRGlzdGFuY2UodGhpcy5faW5wdXQsdCx0aGlzLl9tYXhWYWxpZERpc3RhbmNlKX0sR3UucHJvdG90eXBlLmdldEVycm9yTG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyb3JMb2NhdGlvbn0sR3UucHJvdG90eXBlLmdldFBvbHlnb25MaW5lcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49bmV3IEZ1KGUpLHI9TXUuZ2V0UG9seWdvbnModCkuaXRlcmF0b3IoKTtyLmhhc05leHQoKTspe3IubmV4dCgpLmFwcGx5KG4pfXJldHVybiB0LmdldEZhY3RvcnkoKS5idWlsZEdlb21ldHJ5KGUpfSxHdS5wcm90b3R5cGUuZ2V0RXJyb3JNZXNzYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vyck1zZ30sR3UucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEd1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBHdX0sWXUuVkVSQk9TRS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sWXUuTUFYX0RJU1RBTkNFX0RJRkZfRlJBQy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4uMDEyfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhHdSxZdSk7dmFyIFh1PWZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9pc1ZhbGlkPSEwLHRoaXMuX2Vycm9yTXNnPW51bGwsdGhpcy5fZXJyb3JMb2NhdGlvbj1udWxsLHRoaXMuX2Vycm9ySW5kaWNhdG9yPW51bGwsdGhpcy5faW5wdXQ9dHx8bnVsbCx0aGlzLl9kaXN0YW5jZT1lfHxudWxsLHRoaXMuX3Jlc3VsdD1ufHxudWxsfSxXdT17VkVSQk9TRTp7Y29uZmlndXJhYmxlOiEwfSxNQVhfRU5WX0RJRkZfRlJBQzp7Y29uZmlndXJhYmxlOiEwfX07WHUucHJvdG90eXBlLmlzVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGVja1BvbHlnb25hbCgpLHRoaXMuX2lzVmFsaWQ/KHRoaXMuY2hlY2tFeHBlY3RlZEVtcHR5KCksdGhpcy5faXNWYWxpZD8odGhpcy5jaGVja0VudmVsb3BlKCksdGhpcy5faXNWYWxpZD8odGhpcy5jaGVja0FyZWEoKSx0aGlzLl9pc1ZhbGlkPyh0aGlzLmNoZWNrRGlzdGFuY2UoKSx0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkKTp0aGlzLl9pc1ZhbGlkfSxYdS5wcm90b3R5cGUuY2hlY2tFbnZlbG9wZT1mdW5jdGlvbigpe2lmKHRoaXMuX2Rpc3RhbmNlPDApcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5fZGlzdGFuY2UqWHUuTUFYX0VOVl9ESUZGX0ZSQUM7MD09PXQmJih0PS4wMDEpO3ZhciBlPW5ldyBqaSh0aGlzLl9pbnB1dC5nZXRFbnZlbG9wZUludGVybmFsKCkpO2UuZXhwYW5kQnkodGhpcy5fZGlzdGFuY2UpO3ZhciBuPW5ldyBqaSh0aGlzLl9yZXN1bHQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpKTtuLmV4cGFuZEJ5KHQpLG4uY29udGFpbnMoZSl8fCh0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPSJCdWZmZXIgZW52ZWxvcGUgaXMgaW5jb3JyZWN0Iix0aGlzLl9lcnJvckluZGljYXRvcj10aGlzLl9pbnB1dC5nZXRGYWN0b3J5KCkudG9HZW9tZXRyeShuKSksdGhpcy5yZXBvcnQoIkVudmVsb3BlIil9LFh1LnByb3RvdHlwZS5jaGVja0Rpc3RhbmNlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEd1KHRoaXMuX2lucHV0LHRoaXMuX2Rpc3RhbmNlLHRoaXMuX3Jlc3VsdCk7dC5pc1ZhbGlkKCl8fCh0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPXQuZ2V0RXJyb3JNZXNzYWdlKCksdGhpcy5fZXJyb3JMb2NhdGlvbj10LmdldEVycm9yTG9jYXRpb24oKSx0aGlzLl9lcnJvckluZGljYXRvcj10LmdldEVycm9ySW5kaWNhdG9yKCkpLHRoaXMucmVwb3J0KCJEaXN0YW5jZSIpfSxYdS5wcm90b3R5cGUuY2hlY2tBcmVhPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5faW5wdXQuZ2V0QXJlYSgpLGU9dGhpcy5fcmVzdWx0LmdldEFyZWEoKTt0aGlzLl9kaXN0YW5jZT4wJiZ0PmUmJih0aGlzLl9pc1ZhbGlkPSExLHRoaXMuX2Vycm9yTXNnPSJBcmVhIG9mIHBvc2l0aXZlIGJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gaW5wdXQiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX3Jlc3VsdCksdGhpcy5fZGlzdGFuY2U8MCYmdDxlJiYodGhpcy5faXNWYWxpZD0hMSx0aGlzLl9lcnJvck1zZz0iQXJlYSBvZiBuZWdhdGl2ZSBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gaW5wdXQiLHRoaXMuX2Vycm9ySW5kaWNhdG9yPXRoaXMuX3Jlc3VsdCksdGhpcy5yZXBvcnQoIkFyZWEiKX0sWHUucHJvdG90eXBlLmNoZWNrUG9seWdvbmFsPWZ1bmN0aW9uKCl7dGhpcy5fcmVzdWx0IGluc3RhbmNlb2YgaHN8fHRoaXMuX3Jlc3VsdCBpbnN0YW5jZW9mIGRzfHwodGhpcy5faXNWYWxpZD0hMSksdGhpcy5fZXJyb3JNc2c9IlJlc3VsdCBpcyBub3QgcG9seWdvbmFsIix0aGlzLl9lcnJvckluZGljYXRvcj10aGlzLl9yZXN1bHQsdGhpcy5yZXBvcnQoIlBvbHlnb25hbCIpfSxYdS5wcm90b3R5cGUuZ2V0RXJyb3JJbmRpY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXJyb3JJbmRpY2F0b3J9LFh1LnByb3RvdHlwZS5nZXRFcnJvckxvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vycm9yTG9jYXRpb259LFh1LnByb3RvdHlwZS5jaGVja0V4cGVjdGVkRW1wdHk9ZnVuY3Rpb24oKXtpZih0aGlzLl9pbnB1dC5nZXREaW1lbnNpb24oKT49Mnx8dGhpcy5fZGlzdGFuY2U+MClyZXR1cm4gbnVsbDt0aGlzLl9yZXN1bHQuaXNFbXB0eSgpfHwodGhpcy5faXNWYWxpZD0hMSx0aGlzLl9lcnJvck1zZz0iUmVzdWx0IGlzIG5vbi1lbXB0eSIsdGhpcy5fZXJyb3JJbmRpY2F0b3I9dGhpcy5fcmVzdWx0KSx0aGlzLnJlcG9ydCgiRXhwZWN0ZWRFbXB0eSIpfSxYdS5wcm90b3R5cGUucmVwb3J0PWZ1bmN0aW9uKHQpe2lmKCFYdS5WRVJCT1NFKXJldHVybiBudWxsO2tpLm91dC5wcmludGxuKCJDaGVjayAiK3QrIjogIisodGhpcy5faXNWYWxpZD8icGFzc2VkIjoiRkFJTEVEIikpfSxYdS5wcm90b3R5cGUuZ2V0RXJyb3JNZXNzYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Vycm9yTXNnfSxYdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sWHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFh1fSxYdS5pc1ZhbGlkTXNnPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgWHUodCxlLG4pO3JldHVybiByLmlzVmFsaWQoKT9udWxsOnIuZ2V0RXJyb3JNZXNzYWdlKCl9LFh1LmlzVmFsaWQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiEhbmV3IFh1KHQsZSxuKS5pc1ZhbGlkKCl9LFd1LlZFUkJPU0UuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuITF9LFd1Lk1BWF9FTlZfRElGRl9GUkFDLmdldD1mdW5jdGlvbigpe3JldHVybi4wMTJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFh1LFd1KTt2YXIgSHU9ZnVuY3Rpb24oKXt0aGlzLl9wdHM9bnVsbCx0aGlzLl9kYXRhPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX3B0cz10LHRoaXMuX2RhdGE9ZX07SHUucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0c30sSHUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHRzLmxlbmd0aH0sSHUucHJvdG90eXBlLmdldENvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B0c1t0XX0sSHUucHJvdG90eXBlLmlzQ2xvc2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3B0c1swXS5lcXVhbHModGhpcy5fcHRzW3RoaXMuX3B0cy5sZW5ndGgtMV0pfSxIdS5wcm90b3R5cGUuZ2V0U2VnbWVudE9jdGFudD1mdW5jdGlvbih0KXtyZXR1cm4gdD09PXRoaXMuX3B0cy5sZW5ndGgtMT8tMTp2YS5vY3RhbnQodGhpcy5nZXRDb29yZGluYXRlKHQpLHRoaXMuZ2V0Q29vcmRpbmF0ZSh0KzEpKX0sSHUucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dGhpcy5fZGF0YT10fSxIdS5wcm90b3R5cGUuZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSxIdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gWGkudG9MaW5lU3RyaW5nKG5ldyB4cyh0aGlzLl9wdHMpKX0sSHUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW19hXX0sSHUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEh1fTt2YXIgWnU9ZnVuY3Rpb24oKXt0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz0hMSx0aGlzLl9pc0NoZWNrRW5kU2VnbWVudHNPbmx5PSExLHRoaXMuX2xpPW51bGwsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb249bnVsbCx0aGlzLl9pbnRTZWdtZW50cz1udWxsLHRoaXMuX2ludGVyc2VjdGlvbnM9bmV3IHhvLHRoaXMuX2ludGVyc2VjdGlvbkNvdW50PTAsdGhpcy5fa2VlcEludGVyc2VjdGlvbnM9ITA7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2xpPXQsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb249bnVsbH07WnUucHJvdG90eXBlLmdldEludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ufSxadS5wcm90b3R5cGUuc2V0Q2hlY2tFbmRTZWdtZW50c09ubHk9ZnVuY3Rpb24odCl7dGhpcy5faXNDaGVja0VuZFNlZ21lbnRzT25seT10fSxadS5wcm90b3R5cGUuZ2V0SW50ZXJzZWN0aW9uU2VnbWVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW50U2VnbWVudHN9LFp1LnByb3RvdHlwZS5jb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnRlcnNlY3Rpb25Db3VudH0sWnUucHJvdG90eXBlLmdldEludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW50ZXJzZWN0aW9uc30sWnUucHJvdG90eXBlLnNldEZpbmRBbGxJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQpe3RoaXMuX2ZpbmRBbGxJbnRlcnNlY3Rpb25zPXR9LFp1LnByb3RvdHlwZS5zZXRLZWVwSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0KXt0aGlzLl9rZWVwSW50ZXJzZWN0aW9ucz10fSxadS5wcm90b3R5cGUucHJvY2Vzc0ludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlLG4scil7aWYoIXRoaXMuX2ZpbmRBbGxJbnRlcnNlY3Rpb25zJiZ0aGlzLmhhc0ludGVyc2VjdGlvbigpfHx0PT09biYmZT09PXIpcmV0dXJuIG51bGw7aWYodGhpcy5faXNDaGVja0VuZFNlZ21lbnRzT25seSYmISh0aGlzLmlzRW5kU2VnbWVudCh0LGUpfHx0aGlzLmlzRW5kU2VnbWVudChuLHIpKSlyZXR1cm4gbnVsbDt2YXIgaT10LmdldENvb3JkaW5hdGVzKClbZV0sbz10LmdldENvb3JkaW5hdGVzKClbZSsxXSxzPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyXSxhPW4uZ2V0Q29vcmRpbmF0ZXMoKVtyKzFdO3RoaXMuX2xpLmNvbXB1dGVJbnRlcnNlY3Rpb24oaSxvLHMsYSksdGhpcy5fbGkuaGFzSW50ZXJzZWN0aW9uKCkmJnRoaXMuX2xpLmlzSW50ZXJpb3JJbnRlcnNlY3Rpb24oKSYmKHRoaXMuX2ludFNlZ21lbnRzPW5ldyBBcnJheSg0KS5maWxsKG51bGwpLHRoaXMuX2ludFNlZ21lbnRzWzBdPWksdGhpcy5faW50U2VnbWVudHNbMV09byx0aGlzLl9pbnRTZWdtZW50c1syXT1zLHRoaXMuX2ludFNlZ21lbnRzWzNdPWEsdGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb249dGhpcy5fbGkuZ2V0SW50ZXJzZWN0aW9uKDApLHRoaXMuX2tlZXBJbnRlcnNlY3Rpb25zJiZ0aGlzLl9pbnRlcnNlY3Rpb25zLmFkZCh0aGlzLl9pbnRlcmlvckludGVyc2VjdGlvbiksdGhpcy5faW50ZXJzZWN0aW9uQ291bnQrKyl9LFp1LnByb3RvdHlwZS5pc0VuZFNlZ21lbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gMD09PWV8fGU+PXQuc2l6ZSgpLTJ9LFp1LnByb3RvdHlwZS5oYXNJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2ludGVyaW9ySW50ZXJzZWN0aW9ufSxadS5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2ZpbmRBbGxJbnRlcnNlY3Rpb25zJiZudWxsIT09dGhpcy5faW50ZXJpb3JJbnRlcnNlY3Rpb259LFp1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltldV19LFp1LnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBadX0sWnUuY3JlYXRlQWxsSW50ZXJzZWN0aW9uc0ZpbmRlcj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgWnUodCk7cmV0dXJuIGUuc2V0RmluZEFsbEludGVyc2VjdGlvbnMoITApLGV9LFp1LmNyZWF0ZUFueUludGVyc2VjdGlvbkZpbmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFp1KHQpfSxadS5jcmVhdGVJbnRlcnNlY3Rpb25Db3VudGVyPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBadSh0KTtyZXR1cm4gZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucyghMCksZS5zZXRLZWVwSW50ZXJzZWN0aW9ucyghMSksZX07dmFyIEt1PWZ1bmN0aW9uKCl7dGhpcy5fbGk9bmV3IFFpLHRoaXMuX3NlZ1N0cmluZ3M9bnVsbCx0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz0hMSx0aGlzLl9zZWdJbnQ9bnVsbCx0aGlzLl9pc1ZhbGlkPSEwO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9zZWdTdHJpbmdzPXR9O0t1LnByb3RvdHlwZS5leGVjdXRlPWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3NlZ0ludClyZXR1cm4gbnVsbDt0aGlzLmNoZWNrSW50ZXJpb3JJbnRlcnNlY3Rpb25zKCl9LEt1LnByb3RvdHlwZS5nZXRJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NlZ0ludC5nZXRJbnRlcnNlY3Rpb25zKCl9LEt1LnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXhlY3V0ZSgpLHRoaXMuX2lzVmFsaWR9LEt1LnByb3RvdHlwZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0KXt0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucz10fSxLdS5wcm90b3R5cGUuY2hlY2tJbnRlcmlvckludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLl9pc1ZhbGlkPSEwLHRoaXMuX3NlZ0ludD1uZXcgWnUodGhpcy5fbGkpLHRoaXMuX3NlZ0ludC5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucyh0aGlzLl9maW5kQWxsSW50ZXJzZWN0aW9ucyk7dmFyIHQ9bmV3IElhO2lmKHQuc2V0U2VnbWVudEludGVyc2VjdG9yKHRoaXMuX3NlZ0ludCksdC5jb21wdXRlTm9kZXModGhpcy5fc2VnU3RyaW5ncyksdGhpcy5fc2VnSW50Lmhhc0ludGVyc2VjdGlvbigpKXJldHVybiB0aGlzLl9pc1ZhbGlkPSExLG51bGx9LEt1LnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKCl7aWYodGhpcy5leGVjdXRlKCksIXRoaXMuX2lzVmFsaWQpdGhyb3cgbmV3IFJzKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKCksdGhpcy5fc2VnSW50LmdldEludGVyaW9ySW50ZXJzZWN0aW9uKCkpfSxLdS5wcm90b3R5cGUuZ2V0RXJyb3JNZXNzYWdlPWZ1bmN0aW9uKCl7aWYodGhpcy5faXNWYWxpZClyZXR1cm4ibm8gaW50ZXJzZWN0aW9ucyBmb3VuZCI7dmFyIHQ9dGhpcy5fc2VnSW50LmdldEludGVyc2VjdGlvblNlZ21lbnRzKCk7cmV0dXJuImZvdW5kIG5vbi1ub2RlZCBpbnRlcnNlY3Rpb24gYmV0d2VlbiAiK1hpLnRvTGluZVN0cmluZyh0WzBdLHRbMV0pKyIgYW5kICIrWGkudG9MaW5lU3RyaW5nKHRbMl0sdFszXSl9LEt1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxLdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gS3V9LEt1LmNvbXB1dGVJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBLdSh0KTtyZXR1cm4gZS5zZXRGaW5kQWxsSW50ZXJzZWN0aW9ucyghMCksZS5pc1ZhbGlkKCksZS5nZXRJbnRlcnNlY3Rpb25zKCl9O3ZhciBKdT1mdW5jdGlvbiB0KCl7dGhpcy5fbnY9bnVsbDt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5fbnY9bmV3IEt1KHQudG9TZWdtZW50U3RyaW5ncyhlKSl9O0p1LnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKCl7dGhpcy5fbnYuY2hlY2tWYWxpZCgpfSxKdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sSnUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEp1fSxKdS50b1NlZ21lbnRTdHJpbmdzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTtlLmFkZChuZXcgSHUoci5nZXRDb29yZGluYXRlcygpLHIpKX1yZXR1cm4gZX0sSnUuY2hlY2tWYWxpZD1mdW5jdGlvbih0KXtuZXcgSnUodCkuY2hlY2tWYWxpZCgpfTt2YXIgUXU9ZnVuY3Rpb24odCl7dGhpcy5fbWFwT3A9dH07UXUucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IHhvLG49MDtuPHQuZ2V0TnVtR2VvbWV0cmllcygpO24rKyl7dmFyIHI9dGhpcy5fbWFwT3AubWFwKHQuZ2V0R2VvbWV0cnlOKG4pKTtyLmlzRW1wdHkoKXx8ZS5hZGQocil9cmV0dXJuIHQuZ2V0RmFjdG9yeSgpLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihJcy50b0dlb21ldHJ5QXJyYXkoZSkpfSxRdS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sUXUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFF1fSxRdS5tYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IFF1KGUpLm1hcCh0KX07dmFyICR1PWZ1bmN0aW9uKCl7dGhpcy5fb3A9bnVsbCx0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9bnVsbCx0aGlzLl9wdExvY2F0b3I9bnVsbCx0aGlzLl9saW5lRWRnZXNMaXN0PW5ldyB4byx0aGlzLl9yZXN1bHRMaW5lTGlzdD1uZXcgeG87dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzJdO3RoaXMuX29wPXQsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PWUsdGhpcy5fcHRMb2NhdG9yPW59OyR1LnByb3RvdHlwZS5jb2xsZWN0TGluZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj10aGlzLl9vcC5nZXRHcmFwaCgpLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2UuY29sbGVjdExpbmVFZGdlKHIsdCxlLl9saW5lRWRnZXNMaXN0KSxlLmNvbGxlY3RCb3VuZGFyeVRvdWNoRWRnZShyLHQsZS5fbGluZUVkZ2VzTGlzdCl9fSwkdS5wcm90b3R5cGUubGFiZWxJc29sYXRlZExpbmU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9wdExvY2F0b3IubG9jYXRlKHQuZ2V0Q29vcmRpbmF0ZSgpLHRoaXMuX29wLmdldEFyZ0dlb21ldHJ5KGUpKTt0LmdldExhYmVsKCkuc2V0TG9jYXRpb24oZSxuKX0sJHUucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbmRDb3ZlcmVkTGluZUVkZ2VzKCksdGhpcy5jb2xsZWN0TGluZXModCksdGhpcy5idWlsZExpbmVzKHQpLHRoaXMuX3Jlc3VsdExpbmVMaXN0fSwkdS5wcm90b3R5cGUuY29sbGVjdExpbmVFZGdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmdldExhYmVsKCksaT10LmdldEVkZ2UoKTt0LmlzTGluZUVkZ2UoKSYmIXQuaXNWaXNpdGVkKCkmJk9jLmlzUmVzdWx0T2ZPcChyLGUpJiYhaS5pc0NvdmVyZWQoKSYmKG4uYWRkKGkpLHQuc2V0VmlzaXRlZEVkZ2UoITApKX0sJHUucHJvdG90eXBlLmZpbmRDb3ZlcmVkTGluZUVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX29wLmdldEdyYXBoKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5maW5kQ292ZXJlZExpbmVFZGdlcygpfWZvcih2YXIgZT10aGlzLl9vcC5nZXRHcmFwaCgpLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLHI9bi5nZXRFZGdlKCk7aWYobi5pc0xpbmVFZGdlKCkmJiFyLmlzQ292ZXJlZFNldCgpKXt2YXIgaT10aGlzLl9vcC5pc0NvdmVyZWRCeUEobi5nZXRDb29yZGluYXRlKCkpO3Iuc2V0Q292ZXJlZChpKX19fSwkdS5wcm90b3R5cGUubGFiZWxJc29sYXRlZExpbmVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKSxyPW4uZ2V0TGFiZWwoKTtuLmlzSXNvbGF0ZWQoKSYmKHIuaXNOdWxsKDApP3RoaXMubGFiZWxJc29sYXRlZExpbmUobiwwKTp0aGlzLmxhYmVsSXNvbGF0ZWRMaW5lKG4sMSkpfX0sJHUucHJvdG90eXBlLmJ1aWxkTGluZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2xpbmVFZGdlc0xpc3QuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpLHI9dGhpcy5fZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZUxpbmVTdHJpbmcobi5nZXRDb29yZGluYXRlcygpKTt0aGlzLl9yZXN1bHRMaW5lTGlzdC5hZGQociksbi5zZXRJblJlc3VsdCghMCl9fSwkdS5wcm90b3R5cGUuY29sbGVjdEJvdW5kYXJ5VG91Y2hFZGdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmdldExhYmVsKCk7aWYodC5pc0xpbmVFZGdlKCl8fHQuaXNWaXNpdGVkKCl8fHQuaXNJbnRlcmlvckFyZWFFZGdlKCl8fHQuZ2V0RWRnZSgpLmlzSW5SZXN1bHQoKSlyZXR1cm4gbnVsbDtaaS5pc1RydWUoISh0LmlzSW5SZXN1bHQoKXx8dC5nZXRTeW0oKS5pc0luUmVzdWx0KCkpfHwhdC5nZXRFZGdlKCkuaXNJblJlc3VsdCgpKSxPYy5pc1Jlc3VsdE9mT3AocixlKSYmZT09PU9jLklOVEVSU0VDVElPTiYmKG4uYWRkKHQuZ2V0RWRnZSgpKSx0LnNldFZpc2l0ZWRFZGdlKCEwKSl9LCR1LnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSwkdS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gJHV9O3ZhciB0Yz1mdW5jdGlvbigpe3RoaXMuX29wPW51bGwsdGhpcy5fZ2VvbWV0cnlGYWN0b3J5PW51bGwsdGhpcy5fcmVzdWx0UG9pbnRMaXN0PW5ldyB4bzt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV07dGhpcy5fb3A9dCx0aGlzLl9nZW9tZXRyeUZhY3Rvcnk9ZX07dGMucHJvdG90eXBlLmZpbHRlckNvdmVyZWROb2RlVG9Qb2ludD1mdW5jdGlvbih0KXt2YXIgZT10LmdldENvb3JkaW5hdGUoKTtpZighdGhpcy5fb3AuaXNDb3ZlcmVkQnlMQShlKSl7dmFyIG49dGhpcy5fZ2VvbWV0cnlGYWN0b3J5LmNyZWF0ZVBvaW50KGUpO3RoaXMuX3Jlc3VsdFBvaW50TGlzdC5hZGQobil9fSx0Yy5wcm90b3R5cGUuZXh0cmFjdE5vbkNvdmVyZWRSZXN1bHROb2Rlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fb3AuZ2V0R3JhcGgoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTtpZighKG4uaXNJblJlc3VsdCgpfHxuLmlzSW5jaWRlbnRFZGdlSW5SZXN1bHQoKXx8MCE9PW4uZ2V0RWRnZXMoKS5nZXREZWdyZWUoKSYmdCE9PU9jLklOVEVSU0VDVElPTikpe3ZhciByPW4uZ2V0TGFiZWwoKTtPYy5pc1Jlc3VsdE9mT3Aocix0KSYmdGhpcy5maWx0ZXJDb3ZlcmVkTm9kZVRvUG9pbnQobil9fX0sdGMucHJvdG90eXBlLmJ1aWxkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmV4dHJhY3ROb25Db3ZlcmVkUmVzdWx0Tm9kZXModCksdGhpcy5fcmVzdWx0UG9pbnRMaXN0fSx0Yy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHRjfTt2YXIgZWM9ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEdlb209bnVsbCx0aGlzLl9mYWN0b3J5PW51bGwsdGhpcy5fcHJ1bmVFbXB0eUdlb21ldHJ5PSEwLHRoaXMuX3ByZXNlcnZlR2VvbWV0cnlDb2xsZWN0aW9uVHlwZT0hMCx0aGlzLl9wcmVzZXJ2ZUNvbGxlY3Rpb25zPSExLHRoaXMuX3ByZXNlcnZlVHlwZT0hMX07ZWMucHJvdG90eXBlLnRyYW5zZm9ybVBvaW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2ZhY3RvcnkuY3JlYXRlUG9pbnQodGhpcy50cmFuc2Zvcm1Db29yZGluYXRlcyh0LmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLHQpKX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybVBvbHlnb249ZnVuY3Rpb24odCxlKXt2YXIgbj0hMCxyPXRoaXMudHJhbnNmb3JtTGluZWFyUmluZyh0LmdldEV4dGVyaW9yUmluZygpLHQpOyhudWxsPT09cnx8IShyIGluc3RhbmNlb2YgcHMpfHxyLmlzRW1wdHkoKSkmJihuPSExKTtmb3IodmFyIGk9bmV3IHhvLG89MDtvPHQuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7bysrKXt2YXIgcz10aGlzLnRyYW5zZm9ybUxpbmVhclJpbmcodC5nZXRJbnRlcmlvclJpbmdOKG8pLHQpO251bGw9PT1zfHxzLmlzRW1wdHkoKXx8KHMgaW5zdGFuY2VvZiBwc3x8KG49ITEpLGkuYWRkKHMpKX1pZihuKXJldHVybiB0aGlzLl9mYWN0b3J5LmNyZWF0ZVBvbHlnb24ocixpLnRvQXJyYXkoW10pKTt2YXIgYT1uZXcgeG87cmV0dXJuIG51bGwhPT1yJiZhLmFkZChyKSxhLmFkZEFsbChpKSx0aGlzLl9mYWN0b3J5LmJ1aWxkR2VvbWV0cnkoYSl9LGVjLnByb3RvdHlwZS5jcmVhdGVDb29yZGluYXRlU2VxdWVuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ZhY3RvcnkuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZSh0KX0sZWMucHJvdG90eXBlLmdldElucHV0R2VvbWV0cnk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5wdXRHZW9tfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtTXVsdGlMaW5lU3RyaW5nPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyB4byxyPTA7cjx0LmdldE51bUdlb21ldHJpZXMoKTtyKyspe3ZhciBpPXRoaXMudHJhbnNmb3JtTGluZVN0cmluZyh0LmdldEdlb21ldHJ5TihyKSx0KTtudWxsIT09aSYmKGkuaXNFbXB0eSgpfHxuLmFkZChpKSl9cmV0dXJuIHRoaXMuX2ZhY3RvcnkuYnVpbGRHZW9tZXRyeShuKX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybUNvb3JkaW5hdGVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29weSh0KX0sZWMucHJvdG90eXBlLnRyYW5zZm9ybUxpbmVTdHJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZmFjdG9yeS5jcmVhdGVMaW5lU3RyaW5nKHRoaXMudHJhbnNmb3JtQ29vcmRpbmF0ZXModC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KSl9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1NdWx0aVBvaW50PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW5ldyB4byxyPTA7cjx0LmdldE51bUdlb21ldHJpZXMoKTtyKyspe3ZhciBpPXRoaXMudHJhbnNmb3JtUG9pbnQodC5nZXRHZW9tZXRyeU4ociksdCk7bnVsbCE9PWkmJihpLmlzRW1wdHkoKXx8bi5hZGQoaSkpfXJldHVybiB0aGlzLl9mYWN0b3J5LmJ1aWxkR2VvbWV0cnkobil9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1NdWx0aVBvbHlnb249ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IHhvLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9dGhpcy50cmFuc2Zvcm1Qb2x5Z29uKHQuZ2V0R2VvbWV0cnlOKHIpLHQpO251bGwhPT1pJiYoaS5pc0VtcHR5KCl8fG4uYWRkKGkpKX1yZXR1cm4gdGhpcy5fZmFjdG9yeS5idWlsZEdlb21ldHJ5KG4pfSxlYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCl9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm1HZW9tZXRyeUNvbGxlY3Rpb249ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49bmV3IHhvLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9dGhpcy50cmFuc2Zvcm0odC5nZXRHZW9tZXRyeU4ocikpO251bGwhPT1pJiYodGhpcy5fcHJ1bmVFbXB0eUdlb21ldHJ5JiZpLmlzRW1wdHkoKXx8bi5hZGQoaSkpfXJldHVybiB0aGlzLl9wcmVzZXJ2ZUdlb21ldHJ5Q29sbGVjdGlvblR5cGU/dGhpcy5fZmFjdG9yeS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24oSXMudG9HZW9tZXRyeUFycmF5KG4pKTp0aGlzLl9mYWN0b3J5LmJ1aWxkR2VvbWV0cnkobil9LGVjLnByb3RvdHlwZS50cmFuc2Zvcm09ZnVuY3Rpb24odCl7aWYodGhpcy5faW5wdXRHZW9tPXQsdGhpcy5fZmFjdG9yeT10LmdldEZhY3RvcnkoKSx0IGluc3RhbmNlb2YgY3MpcmV0dXJuIHRoaXMudHJhbnNmb3JtUG9pbnQodCxudWxsKTtpZih0IGluc3RhbmNlb2YgZnMpcmV0dXJuIHRoaXMudHJhbnNmb3JtTXVsdGlQb2ludCh0LG51bGwpO2lmKHQgaW5zdGFuY2VvZiBwcylyZXR1cm4gdGhpcy50cmFuc2Zvcm1MaW5lYXJSaW5nKHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIGFzKXJldHVybiB0aGlzLnRyYW5zZm9ybUxpbmVTdHJpbmcodCxudWxsKTtpZih0IGluc3RhbmNlb2YgWm8pcmV0dXJuIHRoaXMudHJhbnNmb3JtTXVsdGlMaW5lU3RyaW5nKHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIGhzKXJldHVybiB0aGlzLnRyYW5zZm9ybVBvbHlnb24odCxudWxsKTtpZih0IGluc3RhbmNlb2YgZHMpcmV0dXJuIHRoaXMudHJhbnNmb3JtTXVsdGlQb2x5Z29uKHQsbnVsbCk7aWYodCBpbnN0YW5jZW9mIEhvKXJldHVybiB0aGlzLnRyYW5zZm9ybUdlb21ldHJ5Q29sbGVjdGlvbih0LG51bGwpO3Rocm93IG5ldyBoaSgiVW5rbm93biBHZW9tZXRyeSBzdWJ0eXBlOiAiK3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpfSxlYy5wcm90b3R5cGUudHJhbnNmb3JtTGluZWFyUmluZz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMudHJhbnNmb3JtQ29vcmRpbmF0ZXModC5nZXRDb29yZGluYXRlU2VxdWVuY2UoKSx0KTtpZihudWxsPT09bilyZXR1cm4gdGhpcy5fZmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKG51bGwpO3ZhciByPW4uc2l6ZSgpO3JldHVybiByPjAmJnI8NCYmIXRoaXMuX3ByZXNlcnZlVHlwZT90aGlzLl9mYWN0b3J5LmNyZWF0ZUxpbmVTdHJpbmcobik6dGhpcy5fZmFjdG9yeS5jcmVhdGVMaW5lYXJSaW5nKG4pfSxlYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZWMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGVjfTt2YXIgbmM9ZnVuY3Rpb24gdCgpe2lmKHRoaXMuX3NuYXBUb2xlcmFuY2U9MCx0aGlzLl9zcmNQdHM9bnVsbCx0aGlzLl9zZWc9bmV3IGJhLHRoaXMuX2FsbG93U25hcHBpbmdUb1NvdXJjZVZlcnRpY2VzPSExLHRoaXMuX2lzQ2xvc2VkPSExLGFyZ3VtZW50c1swXWluc3RhbmNlb2YgYXMmJiJudW1iZXIiPT10eXBlb2YgYXJndW1lbnRzWzFdKXt2YXIgZT1hcmd1bWVudHNbMV07dC5jYWxsKHRoaXMsYXJndW1lbnRzWzBdLmdldENvb3JkaW5hdGVzKCksZSl9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5JiYibnVtYmVyIj09dHlwZW9mIGFyZ3VtZW50c1sxXSl7dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO3RoaXMuX3NyY1B0cz1uLHRoaXMuX2lzQ2xvc2VkPXQuaXNDbG9zZWQobiksdGhpcy5fc25hcFRvbGVyYW5jZT1yfX07bmMucHJvdG90eXBlLnNuYXBWZXJ0aWNlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLl9pc0Nsb3NlZD90LnNpemUoKS0xOnQuc2l6ZSgpLHI9MDtyPG47cisrKXt2YXIgaT10LmdldChyKSxvPXRoaXMuZmluZFNuYXBGb3JWZXJ0ZXgoaSxlKTtudWxsIT09byYmKHQuc2V0KHIsbmV3IHZpKG8pKSwwPT09ciYmdGhpcy5faXNDbG9zZWQmJnQuc2V0KHQuc2l6ZSgpLTEsbmV3IHZpKG8pKSl9fSxuYy5wcm90b3R5cGUuZmluZFNuYXBGb3JWZXJ0ZXg9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7aWYodC5lcXVhbHMyRChlW25dKSlyZXR1cm4gbnVsbDtpZih0LmRpc3RhbmNlKGVbbl0pPHRoaXMuX3NuYXBUb2xlcmFuY2UpcmV0dXJuIGVbbl19cmV0dXJuIG51bGx9LG5jLnByb3RvdHlwZS5zbmFwVG89ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGJvKHRoaXMuX3NyY1B0cyk7cmV0dXJuIHRoaXMuc25hcFZlcnRpY2VzKGUsdCksdGhpcy5zbmFwU2VnbWVudHMoZSx0KSxlLnRvQ29vcmRpbmF0ZUFycmF5KCl9LG5jLnByb3RvdHlwZS5zbmFwU2VnbWVudHM9ZnVuY3Rpb24odCxlKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIG49ZS5sZW5ndGg7ZVswXS5lcXVhbHMyRChlW2UubGVuZ3RoLTFdKSYmKG49ZS5sZW5ndGgtMSk7Zm9yKHZhciByPTA7cjxuO3IrKyl7dmFyIGk9ZVtyXSxvPXRoaXMuZmluZFNlZ21lbnRJbmRleFRvU25hcChpLHQpO28+PTAmJnQuYWRkKG8rMSxuZXcgdmkoaSksITEpfX0sbmMucHJvdG90eXBlLmZpbmRTZWdtZW50SW5kZXhUb1NuYXA9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcyxyPWZpLk1BWF9WQUxVRSxpPS0xLG89MDtvPGUuc2l6ZSgpLTE7bysrKXtpZihuLl9zZWcucDA9ZS5nZXQobyksbi5fc2VnLnAxPWUuZ2V0KG8rMSksbi5fc2VnLnAwLmVxdWFsczJEKHQpfHxuLl9zZWcucDEuZXF1YWxzMkQodCkpe2lmKG4uX2FsbG93U25hcHBpbmdUb1NvdXJjZVZlcnRpY2VzKWNvbnRpbnVlO3JldHVybi0xfXZhciBzPW4uX3NlZy5kaXN0YW5jZSh0KTtzPG4uX3NuYXBUb2xlcmFuY2UmJnM8ciYmKHI9cyxpPW8pfXJldHVybiBpfSxuYy5wcm90b3R5cGUuc2V0QWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXM9ZnVuY3Rpb24odCl7dGhpcy5fYWxsb3dTbmFwcGluZ1RvU291cmNlVmVydGljZXM9dH0sbmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LG5jLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBuY30sbmMuaXNDbG9zZWQ9ZnVuY3Rpb24odCl7cmV0dXJuISh0Lmxlbmd0aDw9MSkmJnRbMF0uZXF1YWxzMkQodFt0Lmxlbmd0aC0xXSl9O3ZhciByYz1mdW5jdGlvbih0KXt0aGlzLl9zcmNHZW9tPXR8fG51bGx9LGljPXtTTkFQX1BSRUNJU0lPTl9GQUNUT1I6e2NvbmZpZ3VyYWJsZTohMH19O3JjLnByb3RvdHlwZS5zbmFwVG89ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmV4dHJhY3RUYXJnZXRDb29yZGluYXRlcyh0KTtyZXR1cm4gbmV3IG9jKGUsbikudHJhbnNmb3JtKHRoaXMuX3NyY0dlb20pfSxyYy5wcm90b3R5cGUuc25hcFRvU2VsZj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZXh0cmFjdFRhcmdldENvb3JkaW5hdGVzKHRoaXMuX3NyY0dlb20pLHI9bmV3IG9jKHQsbiwhMCkudHJhbnNmb3JtKHRoaXMuX3NyY0dlb20pLGk9cjtyZXR1cm4gZSYmRWkoaSxscykmJihpPXIuYnVmZmVyKDApKSxpfSxyYy5wcm90b3R5cGUuY29tcHV0ZVNuYXBUb2xlcmFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29tcHV0ZU1pbmltdW1TZWdtZW50TGVuZ3RoKHQpLzEwfSxyYy5wcm90b3R5cGUuZXh0cmFjdFRhcmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgVW8sbj10LmdldENvb3JkaW5hdGVzKCkscj0wO3I8bi5sZW5ndGg7cisrKWUuYWRkKG5bcl0pO3JldHVybiBlLnRvQXJyYXkobmV3IEFycmF5KDApLmZpbGwobnVsbCkpfSxyYy5wcm90b3R5cGUuY29tcHV0ZU1pbmltdW1TZWdtZW50TGVuZ3RoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1maS5NQVhfVkFMVUUsbj0wO248dC5sZW5ndGgtMTtuKyspe3ZhciByPXRbbl0uZGlzdGFuY2UodFtuKzFdKTtyPGUmJihlPXIpfXJldHVybiBlfSxyYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0scmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHJjfSxyYy5zbmFwPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgQXJyYXkoMikuZmlsbChudWxsKSxpPW5ldyByYyh0KTtyWzBdPWkuc25hcFRvKGUsbik7dmFyIG89bmV3IHJjKGUpO3JldHVybiByWzFdPW8uc25hcFRvKHJbMF0sbikscn0scmMuY29tcHV0ZU92ZXJsYXlTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPXJjLmNvbXB1dGVTaXplQmFzZWRTbmFwVG9sZXJhbmNlKHQpLG49dC5nZXRQcmVjaXNpb25Nb2RlbCgpO2lmKG4uZ2V0VHlwZSgpPT09Q3MuRklYRUQpe3ZhciByPTEvbi5nZXRTY2FsZSgpKjIvMS40MTU7cj5lJiYoZT1yKX1yZXR1cm4gZX1pZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdO3JldHVybiBNYXRoLm1pbihyYy5jb21wdXRlT3ZlcmxheVNuYXBUb2xlcmFuY2UoaSkscmMuY29tcHV0ZU92ZXJsYXlTbmFwVG9sZXJhbmNlKG8pKX19LHJjLmNvbXB1dGVTaXplQmFzZWRTbmFwVG9sZXJhbmNlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpO3JldHVybiBNYXRoLm1pbihlLmdldEhlaWdodCgpLGUuZ2V0V2lkdGgoKSkqcmMuU05BUF9QUkVDSVNJT05fRkFDVE9SfSxyYy5zbmFwVG9TZWxmPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IHJjKHQpLnNuYXBUb1NlbGYoZSxuKX0saWMuU05BUF9QUkVDSVNJT05fRkFDVE9SLmdldD1mdW5jdGlvbigpe3JldHVybiAxZS05fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhyYyxpYyk7dmFyIG9jPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuLHIpe3QuY2FsbCh0aGlzKSx0aGlzLl9zbmFwVG9sZXJhbmNlPWV8fG51bGwsdGhpcy5fc25hcFB0cz1ufHxudWxsLHRoaXMuX2lzU2VsZlNuYXA9dm9pZCAwIT09ciYmcn1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuc25hcExpbmU9ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgbmModCx0aGlzLl9zbmFwVG9sZXJhbmNlKTtyZXR1cm4gbi5zZXRBbGxvd1NuYXBwaW5nVG9Tb3VyY2VWZXJ0aWNlcyh0aGlzLl9pc1NlbGZTbmFwKSxuLnNuYXBUbyhlKX0sZS5wcm90b3R5cGUudHJhbnNmb3JtQ29vcmRpbmF0ZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnRvQ29vcmRpbmF0ZUFycmF5KCkscj10aGlzLnNuYXBMaW5lKG4sdGhpcy5fc25hcFB0cyk7cmV0dXJuIHRoaXMuX2ZhY3RvcnkuZ2V0Q29vcmRpbmF0ZVNlcXVlbmNlRmFjdG9yeSgpLmNyZWF0ZShyKX0sZS5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sZX0oZWMpLHNjPWZ1bmN0aW9uKCl7dGhpcy5faXNGaXJzdD0hMCx0aGlzLl9jb21tb25NYW50aXNzYUJpdHNDb3VudD01Myx0aGlzLl9jb21tb25CaXRzPTAsdGhpcy5fY29tbW9uU2lnbkV4cD1udWxsfTtzYy5wcm90b3R5cGUuZ2V0Q29tbW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGZpLmxvbmdCaXRzVG9Eb3VibGUodGhpcy5fY29tbW9uQml0cyl9LHNjLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7dmFyIGU9ZmkuZG91YmxlVG9Mb25nQml0cyh0KTtyZXR1cm4gdGhpcy5faXNGaXJzdD8odGhpcy5fY29tbW9uQml0cz1lLHRoaXMuX2NvbW1vblNpZ25FeHA9c2Muc2lnbkV4cEJpdHModGhpcy5fY29tbW9uQml0cyksdGhpcy5faXNGaXJzdD0hMSxudWxsKTpzYy5zaWduRXhwQml0cyhlKSE9PXRoaXMuX2NvbW1vblNpZ25FeHA/KHRoaXMuX2NvbW1vbkJpdHM9MCxudWxsKToodGhpcy5fY29tbW9uTWFudGlzc2FCaXRzQ291bnQ9c2MubnVtQ29tbW9uTW9zdFNpZ01hbnRpc3NhQml0cyh0aGlzLl9jb21tb25CaXRzLGUpLHZvaWQodGhpcy5fY29tbW9uQml0cz1zYy56ZXJvTG93ZXJCaXRzKHRoaXMuX2NvbW1vbkJpdHMsNjQtKDEyK3RoaXMuX2NvbW1vbk1hbnRpc3NhQml0c0NvdW50KSkpKX0sc2MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWZpLmxvbmdCaXRzVG9Eb3VibGUodCksbj0iMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIrZmkudG9CaW5hcnlTdHJpbmcodCkscj1uLnN1YnN0cmluZyhuLmxlbmd0aC02NCk7cmV0dXJuIHIuc3Vic3RyaW5nKDAsMSkrIiAgIityLnN1YnN0cmluZygxLDEyKSsiKGV4cCkgIityLnN1YnN0cmluZygxMikrIiBbICIrZSsiIF0ifX0sc2MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LHNjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBzY30sc2MuZ2V0Qml0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmMTw8ZT8xOjB9LHNjLnNpZ25FeHBCaXRzPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj41Mn0sc2MuemVyb0xvd2VyQml0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0Jn4oKDE8PGUpLTEpfSxzYy5udW1Db21tb25Nb3N0U2lnTWFudGlzc2FCaXRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAscj01MjtyPj0wO3ItLSl7aWYoc2MuZ2V0Qml0KHQscikhPT1zYy5nZXRCaXQoZSxyKSlyZXR1cm4gbjtuKyt9cmV0dXJuIDUyfTt2YXIgYWM9ZnVuY3Rpb24oKXt0aGlzLl9jb21tb25Db29yZD1udWxsLHRoaXMuX2NjRmlsdGVyPW5ldyBjY30sdWM9e0NvbW1vbkNvb3JkaW5hdGVGaWx0ZXI6e2NvbmZpZ3VyYWJsZTohMH0sVHJhbnNsYXRlcjp7Y29uZmlndXJhYmxlOiEwfX07YWMucHJvdG90eXBlLmFkZENvbW1vbkJpdHM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGxjKHRoaXMuX2NvbW1vbkNvb3JkKTt0LmFwcGx5KGUpLHQuZ2VvbWV0cnlDaGFuZ2VkKCl9LGFjLnByb3RvdHlwZS5yZW1vdmVDb21tb25CaXRzPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLl9jb21tb25Db29yZC54JiYwPT09dGhpcy5fY29tbW9uQ29vcmQueSlyZXR1cm4gdDt2YXIgZT1uZXcgdmkodGhpcy5fY29tbW9uQ29vcmQpO2UueD0tZS54LGUueT0tZS55O3ZhciBuPW5ldyBsYyhlKTtyZXR1cm4gdC5hcHBseShuKSx0Lmdlb21ldHJ5Q2hhbmdlZCgpLHR9LGFjLnByb3RvdHlwZS5nZXRDb21tb25Db29yZGluYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbW1vbkNvb3JkfSxhYy5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3QuYXBwbHkodGhpcy5fY2NGaWx0ZXIpLHRoaXMuX2NvbW1vbkNvb3JkPXRoaXMuX2NjRmlsdGVyLmdldENvbW1vbkNvb3JkaW5hdGUoKX0sYWMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGFjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBhY30sdWMuQ29tbW9uQ29vcmRpbmF0ZUZpbHRlci5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gY2N9LHVjLlRyYW5zbGF0ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGxjfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhhYyx1Yyk7dmFyIGNjPWZ1bmN0aW9uKCl7dGhpcy5fY29tbW9uQml0c1g9bmV3IHNjLHRoaXMuX2NvbW1vbkJpdHNZPW5ldyBzY307Y2MucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt0aGlzLl9jb21tb25CaXRzWC5hZGQodC54KSx0aGlzLl9jb21tb25CaXRzWS5hZGQodC55KX0sY2MucHJvdG90eXBlLmdldENvbW1vbkNvb3JkaW5hdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHZpKHRoaXMuX2NvbW1vbkJpdHNYLmdldENvbW1vbigpLHRoaXMuX2NvbW1vbkJpdHNZLmdldENvbW1vbigpKX0sY2MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW2FvXX0sY2MucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGNjfTt2YXIgbGM9ZnVuY3Rpb24oKXt0aGlzLnRyYW5zPW51bGw7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMudHJhbnM9dH07bGMucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0LGUpe3ZhciBuPXQuZ2V0T3JkaW5hdGUoZSwwKSt0aGlzLnRyYW5zLngscj10LmdldE9yZGluYXRlKGUsMSkrdGhpcy50cmFucy55O3Quc2V0T3JkaW5hdGUoZSwwLG4pLHQuc2V0T3JkaW5hdGUoZSwxLHIpfSxsYy5wcm90b3R5cGUuaXNEb25lPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGxjLnByb3RvdHlwZS5pc0dlb21ldHJ5Q2hhbmdlZD1mdW5jdGlvbigpe3JldHVybiEwfSxsYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bV29dfSxsYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbGN9O3ZhciBoYz1mdW5jdGlvbih0LGUpe3RoaXMuX2dlb209bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5fc25hcFRvbGVyYW5jZT1udWxsLHRoaXMuX2Nicj1udWxsLHRoaXMuX2dlb21bMF09dCx0aGlzLl9nZW9tWzFdPWUsdGhpcy5jb21wdXRlU25hcFRvbGVyYW5jZSgpfTtoYy5wcm90b3R5cGUuc2VsZlNuYXA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyByYyh0KS5zbmFwVG8odCx0aGlzLl9zbmFwVG9sZXJhbmNlKX0saGMucHJvdG90eXBlLnJlbW92ZUNvbW1vbkJpdHM9ZnVuY3Rpb24odCl7dGhpcy5fY2JyPW5ldyBhYyx0aGlzLl9jYnIuYWRkKHRbMF0pLHRoaXMuX2Nici5hZGQodFsxXSk7dmFyIGU9bmV3IEFycmF5KDIpLmZpbGwobnVsbCk7cmV0dXJuIGVbMF09dGhpcy5fY2JyLnJlbW92ZUNvbW1vbkJpdHModFswXS5jb3B5KCkpLGVbMV09dGhpcy5fY2JyLnJlbW92ZUNvbW1vbkJpdHModFsxXS5jb3B5KCkpLGV9LGhjLnByb3RvdHlwZS5wcmVwYXJlUmVzdWx0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jYnIuYWRkQ29tbW9uQml0cyh0KSx0fSxoYy5wcm90b3R5cGUuZ2V0UmVzdWx0R2VvbWV0cnk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zbmFwKHRoaXMuX2dlb20pLG49T2Mub3ZlcmxheU9wKGVbMF0sZVsxXSx0KTtyZXR1cm4gdGhpcy5wcmVwYXJlUmVzdWx0KG4pfSxoYy5wcm90b3R5cGUuY2hlY2tWYWxpZD1mdW5jdGlvbih0KXt0LmlzVmFsaWQoKXx8a2kub3V0LnByaW50bG4oIlNuYXBwZWQgZ2VvbWV0cnkgaXMgaW52YWxpZCIpfSxoYy5wcm90b3R5cGUuY29tcHV0ZVNuYXBUb2xlcmFuY2U9ZnVuY3Rpb24oKXt0aGlzLl9zbmFwVG9sZXJhbmNlPXJjLmNvbXB1dGVPdmVybGF5U25hcFRvbGVyYW5jZSh0aGlzLl9nZW9tWzBdLHRoaXMuX2dlb21bMV0pfSxoYy5wcm90b3R5cGUuc25hcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnJlbW92ZUNvbW1vbkJpdHModCk7cmV0dXJuIHJjLnNuYXAoZVswXSxlWzFdLHRoaXMuX3NuYXBUb2xlcmFuY2UpfSxoYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0saGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGhjfSxoYy5vdmVybGF5T3A9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuZXcgaGModCxlKS5nZXRSZXN1bHRHZW9tZXRyeShuKX0saGMudW5pb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gaGMub3ZlcmxheU9wKHQsZSxPYy5VTklPTil9LGhjLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiBoYy5vdmVybGF5T3AodCxlLE9jLklOVEVSU0VDVElPTil9LGhjLnN5bURpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaGMub3ZlcmxheU9wKHQsZSxPYy5TWU1ESUZGRVJFTkNFKX0saGMuZGlmZmVyZW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBoYy5vdmVybGF5T3AodCxlLE9jLkRJRkZFUkVOQ0UpfTt2YXIgZmM9ZnVuY3Rpb24odCxlKXt0aGlzLl9nZW9tPW5ldyBBcnJheSgyKS5maWxsKG51bGwpLHRoaXMuX2dlb21bMF09dCx0aGlzLl9nZW9tWzFdPWV9O2ZjLnByb3RvdHlwZS5nZXRSZXN1bHRHZW9tZXRyeT1mdW5jdGlvbih0KXt2YXIgZT1udWxsLG49ITEscj1udWxsO3RyeXtlPU9jLm92ZXJsYXlPcCh0aGlzLl9nZW9tWzBdLHRoaXMuX2dlb21bMV0sdCk7bj0hMH1jYXRjaCh0KXtpZighKHQgaW5zdGFuY2VvZiBXaSkpdGhyb3cgdDtyPXR9aWYoIW4pdHJ5e2U9aGMub3ZlcmxheU9wKHRoaXMuX2dlb21bMF0sdGhpcy5fZ2VvbVsxXSx0KX1jYXRjaCh0KXt0aHJvdyB0IGluc3RhbmNlb2YgV2k/cjp0fXJldHVybiBlfSxmYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGZjfSxmYy5vdmVybGF5T3A9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuZXcgZmModCxlKS5nZXRSZXN1bHRHZW9tZXRyeShuKX0sZmMudW5pb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gZmMub3ZlcmxheU9wKHQsZSxPYy5VTklPTil9LGZjLmludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUpe3JldHVybiBmYy5vdmVybGF5T3AodCxlLE9jLklOVEVSU0VDVElPTil9LGZjLnN5bURpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZmMub3ZlcmxheU9wKHQsZSxPYy5TWU1ESUZGRVJFTkNFKX0sZmMuZGlmZmVyZW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBmYy5vdmVybGF5T3AodCxlLE9jLkRJRkZFUkVOQ0UpfTt2YXIgcGM9ZnVuY3Rpb24oKXt0aGlzLm1jZT1udWxsLHRoaXMuY2hhaW5JbmRleD1udWxsO3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXTt0aGlzLm1jZT10LHRoaXMuY2hhaW5JbmRleD1lfTtwYy5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbnM9ZnVuY3Rpb24odCxlKXt0aGlzLm1jZS5jb21wdXRlSW50ZXJzZWN0c0ZvckNoYWluKHRoaXMuY2hhaW5JbmRleCx0Lm1jZSx0LmNoYWluSW5kZXgsZSl9LHBjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxwYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcGN9O3ZhciBkYz1mdW5jdGlvbiB0KCl7aWYodGhpcy5fbGFiZWw9bnVsbCx0aGlzLl94VmFsdWU9bnVsbCx0aGlzLl9ldmVudFR5cGU9bnVsbCx0aGlzLl9pbnNlcnRFdmVudD1udWxsLHRoaXMuX2RlbGV0ZUV2ZW50SW5kZXg9bnVsbCx0aGlzLl9vYmo9bnVsbCwyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdO3RoaXMuX2V2ZW50VHlwZT10LkRFTEVURSx0aGlzLl94VmFsdWU9ZSx0aGlzLl9pbnNlcnRFdmVudD1ufWVsc2UgaWYoMz09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciByPWFyZ3VtZW50c1swXSxpPWFyZ3VtZW50c1sxXSxvPWFyZ3VtZW50c1syXTt0aGlzLl9ldmVudFR5cGU9dC5JTlNFUlQsdGhpcy5fbGFiZWw9cix0aGlzLl94VmFsdWU9aSx0aGlzLl9vYmo9b319LGdjPXtJTlNFUlQ6e2NvbmZpZ3VyYWJsZTohMH0sREVMRVRFOntjb25maWd1cmFibGU6ITB9fTtkYy5wcm90b3R5cGUuaXNEZWxldGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRUeXBlPT09ZGMuREVMRVRFfSxkYy5wcm90b3R5cGUuc2V0RGVsZXRlRXZlbnRJbmRleD1mdW5jdGlvbih0KXt0aGlzLl9kZWxldGVFdmVudEluZGV4PXR9LGRjLnByb3RvdHlwZS5nZXRPYmplY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb2JqfSxkYy5wcm90b3R5cGUuY29tcGFyZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPXQ7cmV0dXJuIHRoaXMuX3hWYWx1ZTxlLl94VmFsdWU/LTE6dGhpcy5feFZhbHVlPmUuX3hWYWx1ZT8xOnRoaXMuX2V2ZW50VHlwZTxlLl9ldmVudFR5cGU/LTE6dGhpcy5fZXZlbnRUeXBlPmUuX2V2ZW50VHlwZT8xOjB9LGRjLnByb3RvdHlwZS5nZXRJbnNlcnRFdmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnNlcnRFdmVudH0sZGMucHJvdG90eXBlLmlzSW5zZXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2V2ZW50VHlwZT09PWRjLklOU0VSVH0sZGMucHJvdG90eXBlLmlzU2FtZUxhYmVsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dGhpcy5fbGFiZWwmJnRoaXMuX2xhYmVsPT09dC5fbGFiZWx9LGRjLnByb3RvdHlwZS5nZXREZWxldGVFdmVudEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlbGV0ZUV2ZW50SW5kZXh9LGRjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltkaV19LGRjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBkY30sZ2MuSU5TRVJULmdldD1mdW5jdGlvbigpe3JldHVybiAxfSxnYy5ERUxFVEUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDJ9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGRjLGdjKTt2YXIgeWM9ZnVuY3Rpb24oKXt9O3ljLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSx5Yy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4geWN9O3ZhciBtYz1mdW5jdGlvbigpe3RoaXMuX2hhc0ludGVyc2VjdGlvbj0hMSx0aGlzLl9oYXNQcm9wZXI9ITEsdGhpcy5faGFzUHJvcGVySW50ZXJpb3I9ITEsdGhpcy5fcHJvcGVySW50ZXJzZWN0aW9uUG9pbnQ9bnVsbCx0aGlzLl9saT1udWxsLHRoaXMuX2luY2x1ZGVQcm9wZXI9bnVsbCx0aGlzLl9yZWNvcmRJc29sYXRlZD1udWxsLHRoaXMuX2lzU2VsZkludGVyc2VjdGlvbj1udWxsLHRoaXMuX251bUludGVyc2VjdGlvbnM9MCx0aGlzLm51bVRlc3RzPTAsdGhpcy5fYmR5Tm9kZXM9bnVsbCx0aGlzLl9pc0RvbmU9ITEsdGhpcy5faXNEb25lV2hlblByb3BlckludD0hMTt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj1hcmd1bWVudHNbMl07dGhpcy5fbGk9dCx0aGlzLl9pbmNsdWRlUHJvcGVyPWUsdGhpcy5fcmVjb3JkSXNvbGF0ZWQ9bn07bWMucHJvdG90eXBlLmlzVHJpdmlhbEludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbixyKXtpZih0PT09biYmMT09PXRoaXMuX2xpLmdldEludGVyc2VjdGlvbk51bSgpKXtpZihtYy5pc0FkamFjZW50U2VnbWVudHMoZSxyKSlyZXR1cm4hMDtpZih0LmlzQ2xvc2VkKCkpe3ZhciBpPXQuZ2V0TnVtUG9pbnRzKCktMTtpZigwPT09ZSYmcj09PWl8fDA9PT1yJiZlPT09aSlyZXR1cm4hMH19cmV0dXJuITF9LG1jLnByb3RvdHlwZS5nZXRQcm9wZXJJbnRlcnNlY3Rpb25Qb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJJbnRlcnNlY3Rpb25Qb2ludH0sbWMucHJvdG90eXBlLnNldElzRG9uZUlmUHJvcGVySW50PWZ1bmN0aW9uKHQpe3RoaXMuX2lzRG9uZVdoZW5Qcm9wZXJJbnQ9dH0sbWMucHJvdG90eXBlLmhhc1Byb3BlckludGVyaW9ySW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Byb3BlckludGVyaW9yfSxtYy5wcm90b3R5cGUuaXNCb3VuZGFyeVBvaW50SW50ZXJuYWw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ZS5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCkuZ2V0Q29vcmRpbmF0ZSgpO2lmKHQuaXNJbnRlcnNlY3Rpb24ocikpcmV0dXJuITB9cmV0dXJuITF9LG1jLnByb3RvdHlwZS5oYXNQcm9wZXJJbnRlcnNlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGFzUHJvcGVyfSxtYy5wcm90b3R5cGUuaGFzSW50ZXJzZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc0ludGVyc2VjdGlvbn0sbWMucHJvdG90eXBlLmlzRG9uZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0RvbmV9LG1jLnByb3RvdHlwZS5pc0JvdW5kYXJ5UG9pbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9PWUmJiEoIXRoaXMuaXNCb3VuZGFyeVBvaW50SW50ZXJuYWwodCxlWzBdKSYmIXRoaXMuaXNCb3VuZGFyeVBvaW50SW50ZXJuYWwodCxlWzFdKSl9LG1jLnByb3RvdHlwZS5zZXRCb3VuZGFyeU5vZGVzPWZ1bmN0aW9uKHQsZSl7dGhpcy5fYmR5Tm9kZXM9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5fYmR5Tm9kZXNbMF09dCx0aGlzLl9iZHlOb2Rlc1sxXT1lfSxtYy5wcm90b3R5cGUuYWRkSW50ZXJzZWN0aW9ucz1mdW5jdGlvbih0LGUsbixyKXtpZih0PT09biYmZT09PXIpcmV0dXJuIG51bGw7dGhpcy5udW1UZXN0cysrO3ZhciBpPXQuZ2V0Q29vcmRpbmF0ZXMoKVtlXSxvPXQuZ2V0Q29vcmRpbmF0ZXMoKVtlKzFdLHM9bi5nZXRDb29yZGluYXRlcygpW3JdLGE9bi5nZXRDb29yZGluYXRlcygpW3IrMV07dGhpcy5fbGkuY29tcHV0ZUludGVyc2VjdGlvbihpLG8scyxhKSx0aGlzLl9saS5oYXNJbnRlcnNlY3Rpb24oKSYmKHRoaXMuX3JlY29yZElzb2xhdGVkJiYodC5zZXRJc29sYXRlZCghMSksbi5zZXRJc29sYXRlZCghMSkpLHRoaXMuX251bUludGVyc2VjdGlvbnMrKyx0aGlzLmlzVHJpdmlhbEludGVyc2VjdGlvbih0LGUsbixyKXx8KHRoaXMuX2hhc0ludGVyc2VjdGlvbj0hMCwodGhpcy5faW5jbHVkZVByb3Blcnx8IXRoaXMuX2xpLmlzUHJvcGVyKCkpJiYodC5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLGUsMCksbi5hZGRJbnRlcnNlY3Rpb25zKHRoaXMuX2xpLHIsMSkpLHRoaXMuX2xpLmlzUHJvcGVyKCkmJih0aGlzLl9wcm9wZXJJbnRlcnNlY3Rpb25Qb2ludD10aGlzLl9saS5nZXRJbnRlcnNlY3Rpb24oMCkuY29weSgpLHRoaXMuX2hhc1Byb3Blcj0hMCx0aGlzLl9pc0RvbmVXaGVuUHJvcGVySW50JiYodGhpcy5faXNEb25lPSEwKSx0aGlzLmlzQm91bmRhcnlQb2ludCh0aGlzLl9saSx0aGlzLl9iZHlOb2Rlcyl8fCh0aGlzLl9oYXNQcm9wZXJJbnRlcmlvcj0hMCkpKSl9LG1jLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxtYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gbWN9LG1jLmlzQWRqYWNlbnRTZWdtZW50cz1mdW5jdGlvbih0LGUpe3JldHVybiAxPT09TWF0aC5hYnModC1lKX07dmFyIHZjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5ldmVudHM9bmV3IHhvLHRoaXMubk92ZXJsYXBzPW51bGx9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnByZXBhcmVFdmVudHM9ZnVuY3Rpb24oKXthYS5zb3J0KHRoaXMuZXZlbnRzKTtmb3IodmFyIHQ9MDt0PHRoaXMuZXZlbnRzLnNpemUoKTt0Kyspe3ZhciBlPXRoaXMuZXZlbnRzLmdldCh0KTtlLmlzRGVsZXRlKCkmJmUuZ2V0SW5zZXJ0RXZlbnQoKS5zZXREZWxldGVFdmVudEluZGV4KHQpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUludGVyc2VjdGlvbnM9ZnVuY3Rpb24oKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMubk92ZXJsYXBzPTAsdGhpcy5wcmVwYXJlRXZlbnRzKCk7Zm9yKHZhciBlPTA7ZTx0aGlzLmV2ZW50cy5zaXplKCk7ZSsrKXt2YXIgbj10aGlzLmV2ZW50cy5nZXQoZSk7aWYobi5pc0luc2VydCgpJiZ0aGlzLnByb2Nlc3NPdmVybGFwcyhlLG4uZ2V0RGVsZXRlRXZlbnRJbmRleCgpLG4sdCksdC5pc0RvbmUoKSlicmVha319ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aClpZihhcmd1bWVudHNbMl1pbnN0YW5jZW9mIG1jJiZFaShhcmd1bWVudHNbMF0sdm8pJiZFaShhcmd1bWVudHNbMV0sdm8pKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl07dGhpcy5hZGRFZGdlcyhyLHIpLHRoaXMuYWRkRWRnZXMoaSxpKSx0aGlzLmNvbXB1dGVJbnRlcnNlY3Rpb25zKG8pfWVsc2UgaWYoImJvb2xlYW4iPT10eXBlb2YgYXJndW1lbnRzWzJdJiZFaShhcmd1bWVudHNbMF0sdm8pJiZhcmd1bWVudHNbMV1pbnN0YW5jZW9mIG1jKXt2YXIgcz1hcmd1bWVudHNbMF0sYT1hcmd1bWVudHNbMV07YXJndW1lbnRzWzJdP3RoaXMuYWRkRWRnZXMocyxudWxsKTp0aGlzLmFkZEVkZ2VzKHMpLHRoaXMuY29tcHV0ZUludGVyc2VjdGlvbnMoYSl9fSxlLnByb3RvdHlwZS5hZGRFZGdlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2V0TW9ub3RvbmVDaGFpbkVkZ2UoKSxyPW4uZ2V0U3RhcnRJbmRleGVzKCksaT0wO2k8ci5sZW5ndGgtMTtpKyspe3ZhciBvPW5ldyBwYyhuLGkpLHM9bmV3IGRjKGUsbi5nZXRNaW5YKGkpLG8pO3RoaXMuZXZlbnRzLmFkZChzKSx0aGlzLmV2ZW50cy5hZGQobmV3IGRjKG4uZ2V0TWF4WChpKSxzKSl9fSxlLnByb3RvdHlwZS5wcm9jZXNzT3ZlcmxhcHM9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPW4uZ2V0T2JqZWN0KCksbz10O288ZTtvKyspe3ZhciBzPXRoaXMuZXZlbnRzLmdldChvKTtpZihzLmlzSW5zZXJ0KCkpe3ZhciBhPXMuZ2V0T2JqZWN0KCk7bi5pc1NhbWVMYWJlbChzKXx8KGkuY29tcHV0ZUludGVyc2VjdGlvbnMoYSxyKSx0aGlzLm5PdmVybGFwcysrKX19fSxlLnByb3RvdHlwZS5hZGRFZGdlcz1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgdD1hcmd1bWVudHNbMF0uaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpO3RoaXMuYWRkRWRnZShlLGUpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1swXS5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7dGhpcy5hZGRFZGdlKGksbil9fSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlfSh5YyksX2M9ZnVuY3Rpb24oKXt0aGlzLl9taW49ZmkuUE9TSVRJVkVfSU5GSU5JVFksdGhpcy5fbWF4PWZpLk5FR0FUSVZFX0lORklOSVRZfSx4Yz17Tm9kZUNvbXBhcmF0b3I6e2NvbmZpZ3VyYWJsZTohMH19O19jLnByb3RvdHlwZS5nZXRNaW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWlufSxfYy5wcm90b3R5cGUuaW50ZXJzZWN0cz1mdW5jdGlvbih0LGUpe3JldHVybiEodGhpcy5fbWluPmV8fHRoaXMuX21heDx0KX0sX2MucHJvdG90eXBlLmdldE1heD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXh9LF9jLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBYaS50b0xpbmVTdHJpbmcobmV3IHZpKHRoaXMuX21pbiwwKSxuZXcgdmkodGhpcy5fbWF4LDApKX0sX2MucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LF9jLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBfY30seGMuTm9kZUNvbXBhcmF0b3IuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHdjfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhfYyx4Yyk7dmFyIHdjPWZ1bmN0aW9uKCl7fTt3Yy5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUpe3ZhciBuPXQscj1lLGk9KG4uX21pbituLl9tYXgpLzIsbz0oci5fbWluK3IuX21heCkvMjtyZXR1cm4gaTxvPy0xOmk+bz8xOjB9LHdjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVyblt5aV19LHdjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiB3Y307dmFyIGJjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt0LmNhbGwodGhpcyksdGhpcy5faXRlbT1udWxsO3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPWFyZ3VtZW50c1syXTt0aGlzLl9taW49ZSx0aGlzLl9tYXg9bix0aGlzLl9pdGVtPXJ9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5pbnRlcnNlY3RzKHQsZSkpcmV0dXJuIG51bGw7bi52aXNpdEl0ZW0odGhpcy5faXRlbSl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KF9jKSxEYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5jYWxsKHRoaXMpLHRoaXMuX25vZGUxPW51bGwsdGhpcy5fbm9kZTI9bnVsbDt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dGhpcy5fbm9kZTE9ZSx0aGlzLl9ub2RlMj1uLHRoaXMuYnVpbGRFeHRlbnQodGhpcy5fbm9kZTEsdGhpcy5fbm9kZTIpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5idWlsZEV4dGVudD1mdW5jdGlvbih0LGUpe3RoaXMuX21pbj1NYXRoLm1pbih0Ll9taW4sZS5fbWluKSx0aGlzLl9tYXg9TWF0aC5tYXgodC5fbWF4LGUuX21heCl9LGUucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5pbnRlcnNlY3RzKHQsZSkpcmV0dXJuIG51bGw7bnVsbCE9PXRoaXMuX25vZGUxJiZ0aGlzLl9ub2RlMS5xdWVyeSh0LGUsbiksbnVsbCE9PXRoaXMuX25vZGUyJiZ0aGlzLl9ub2RlMi5xdWVyeSh0LGUsbil9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KF9jKSxFYz1mdW5jdGlvbigpe3RoaXMuX2xlYXZlcz1uZXcgeG8sdGhpcy5fcm9vdD1udWxsLHRoaXMuX2xldmVsPTB9O0VjLnByb3RvdHlwZS5idWlsZFRyZWU9ZnVuY3Rpb24oKXthYS5zb3J0KHRoaXMuX2xlYXZlcyxuZXcgX2MuTm9kZUNvbXBhcmF0b3IpO2Zvcih2YXIgdD10aGlzLl9sZWF2ZXMsZT1udWxsLG49bmV3IHhvOzspe2lmKHRoaXMuYnVpbGRMZXZlbCh0LG4pLDE9PT1uLnNpemUoKSlyZXR1cm4gbi5nZXQoMCk7ZT10LHQ9bixuPWV9fSxFYy5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQsZSxuKXtpZihudWxsIT09dGhpcy5fcm9vdCl0aHJvdyBuZXcgRXJyb3IoIkluZGV4IGNhbm5vdCBiZSBhZGRlZCB0byBvbmNlIGl0IGhhcyBiZWVuIHF1ZXJpZWQiKTt0aGlzLl9sZWF2ZXMuYWRkKG5ldyBiYyh0LGUsbikpfSxFYy5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24odCxlLG4pe3RoaXMuaW5pdCgpLHRoaXMuX3Jvb3QucXVlcnkodCxlLG4pfSxFYy5wcm90b3R5cGUuYnVpbGRSb290PWZ1bmN0aW9uKCl7aWYobnVsbCE9PXRoaXMuX3Jvb3QpcmV0dXJuIG51bGw7dGhpcy5fcm9vdD10aGlzLmJ1aWxkVHJlZSgpfSxFYy5wcm90b3R5cGUucHJpbnROb2RlPWZ1bmN0aW9uKHQpe2tpLm91dC5wcmludGxuKFhpLnRvTGluZVN0cmluZyhuZXcgdmkodC5fbWluLHRoaXMuX2xldmVsKSxuZXcgdmkodC5fbWF4LHRoaXMuX2xldmVsKSkpfSxFYy5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe2lmKG51bGwhPT10aGlzLl9yb290KXJldHVybiBudWxsO3RoaXMuYnVpbGRSb290KCl9LEVjLnByb3RvdHlwZS5idWlsZExldmVsPWZ1bmN0aW9uKHQsZSl7dGhpcy5fbGV2ZWwrKyxlLmNsZWFyKCk7Zm9yKHZhciBuPTA7bjx0LnNpemUoKTtuKz0yKXt2YXIgcj10LmdldChuKTtpZihudWxsPT09KG4rMTx0LnNpemUoKT90LmdldChuKTpudWxsKSllLmFkZChyKTtlbHNle3ZhciBpPW5ldyBEYyh0LmdldChuKSx0LmdldChuKzEpKTtlLmFkZChpKX19fSxFYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sRWMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIEVjfTt2YXIgQ2M9ZnVuY3Rpb24oKXt0aGlzLl9pdGVtcz1uZXcgeG99O0NjLnByb3RvdHlwZS52aXNpdEl0ZW09ZnVuY3Rpb24odCl7dGhpcy5faXRlbXMuYWRkKHQpfSxDYy5wcm90b3R5cGUuZ2V0SXRlbXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXRlbXN9LENjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltyYV19LENjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBDY307dmFyIFNjPWZ1bmN0aW9uKCl7dGhpcy5faW5kZXg9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07aWYoIUVpKHQsbHMpKXRocm93IG5ldyBoaTt0aGlzLl9pbmRleD1uZXcgSWModCl9LEFjPXtTZWdtZW50VmlzaXRvcjp7Y29uZmlndXJhYmxlOiEwfSxJbnRlcnZhbEluZGV4ZWRHZW9tZXRyeTp7Y29uZmlndXJhYmxlOiEwfX07U2MucHJvdG90eXBlLmxvY2F0ZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdG8odCksbj1uZXcgTmMoZSk7cmV0dXJuIHRoaXMuX2luZGV4LnF1ZXJ5KHQueSx0LnksbiksZS5nZXRMb2NhdGlvbigpfSxTYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bV2FdfSxTYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gU2N9LEFjLlNlZ21lbnRWaXNpdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiBOY30sQWMuSW50ZXJ2YWxJbmRleGVkR2VvbWV0cnkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEljfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhTYyxBYyk7dmFyIE5jPWZ1bmN0aW9uKCl7dGhpcy5fY291bnRlcj1udWxsO3ZhciB0PWFyZ3VtZW50c1swXTt0aGlzLl9jb3VudGVyPXR9O05jLnByb3RvdHlwZS52aXNpdEl0ZW09ZnVuY3Rpb24odCl7dmFyIGU9dDt0aGlzLl9jb3VudGVyLmNvdW50U2VnbWVudChlLmdldENvb3JkaW5hdGUoMCksZS5nZXRDb29yZGluYXRlKDEpKX0sTmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW3JhXX0sTmMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIE5jfTt2YXIgSWM9ZnVuY3Rpb24oKXt0aGlzLl9pbmRleD1uZXcgRWM7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuaW5pdCh0KX07SWMucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPUZ1LmdldExpbmVzKHQpLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKS5nZXRDb29yZGluYXRlcygpO3RoaXMuYWRkTGluZShuKX19LEljLnByb3RvdHlwZS5hZGRMaW5lPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8dC5sZW5ndGg7ZSsrKXt2YXIgbj1uZXcgYmEodFtlLTFdLHRbZV0pLHI9TWF0aC5taW4obi5wMC55LG4ucDEueSksaT1NYXRoLm1heChuLnAwLnksbi5wMS55KTt0aGlzLl9pbmRleC5pbnNlcnQocixpLG4pfX0sSWMucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKCl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXSxlPWFyZ3VtZW50c1sxXSxuPW5ldyBDYztyZXR1cm4gdGhpcy5faW5kZXgucXVlcnkodCxlLG4pLG4uZ2V0SXRlbXMoKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHI9YXJndW1lbnRzWzBdLGk9YXJndW1lbnRzWzFdLG89YXJndW1lbnRzWzJdO3RoaXMuX2luZGV4LnF1ZXJ5KHIsaSxvKX19LEljLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxJYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gSWN9O3ZhciBNYz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7aWYodC5jYWxsKHRoaXMpLHRoaXMuX3BhcmVudEdlb209bnVsbCx0aGlzLl9saW5lRWRnZU1hcD1uZXcgRXMsdGhpcy5fYm91bmRhcnlOb2RlUnVsZT1udWxsLHRoaXMuX3VzZUJvdW5kYXJ5RGV0ZXJtaW5hdGlvblJ1bGU9ITAsdGhpcy5fYXJnSW5kZXg9bnVsbCx0aGlzLl9ib3VuZGFyeU5vZGVzPW51bGwsdGhpcy5faGFzVG9vRmV3UG9pbnRzPSExLHRoaXMuX2ludmFsaWRQb2ludD1udWxsLHRoaXMuX2FyZWFQdExvY2F0b3I9bnVsbCx0aGlzLl9wdExvY2F0b3I9bmV3IFR1LDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV0scj11by5PR0NfU0ZTX0JPVU5EQVJZX1JVTEU7dGhpcy5fYXJnSW5kZXg9ZSx0aGlzLl9wYXJlbnRHZW9tPW4sdGhpcy5fYm91bmRhcnlOb2RlUnVsZT1yLG51bGwhPT1uJiZ0aGlzLmFkZChuKX1lbHNlIGlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgaT1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0scz1hcmd1bWVudHNbMl07dGhpcy5fYXJnSW5kZXg9aSx0aGlzLl9wYXJlbnRHZW9tPW8sdGhpcy5fYm91bmRhcnlOb2RlUnVsZT1zLG51bGwhPT1vJiZ0aGlzLmFkZChvKX19cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmluc2VydEJvdW5kYXJ5UG9pbnQ9ZnVuY3Rpb24odCxuKXt2YXIgcj10aGlzLl9ub2Rlcy5hZGROb2RlKG4pLmdldExhYmVsKCksaT0xO3IuZ2V0TG9jYXRpb24odCxGcy5PTik9PT1iaS5CT1VOREFSWSYmaSsrO3ZhciBvPWUuZGV0ZXJtaW5lQm91bmRhcnkodGhpcy5fYm91bmRhcnlOb2RlUnVsZSxpKTtyLnNldExvY2F0aW9uKHQsbyl9LGUucHJvdG90eXBlLmNvbXB1dGVTZWxmTm9kZXM9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3JldHVybiB0aGlzLmNvbXB1dGVTZWxmTm9kZXModCxlLCExKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdLGk9bmV3IG1jKGFyZ3VtZW50c1swXSwhMCwhMSk7aS5zZXRJc0RvbmVJZlByb3BlckludChyKTt2YXIgbz10aGlzLmNyZWF0ZUVkZ2VTZXRJbnRlcnNlY3RvcigpLHM9dGhpcy5fcGFyZW50R2VvbSBpbnN0YW5jZW9mIHBzfHx0aGlzLl9wYXJlbnRHZW9tIGluc3RhbmNlb2YgaHN8fHRoaXMuX3BhcmVudEdlb20gaW5zdGFuY2VvZiBkcyxhPW58fCFzO3JldHVybiBvLmNvbXB1dGVJbnRlcnNlY3Rpb25zKHRoaXMuX2VkZ2VzLGksYSksdGhpcy5hZGRTZWxmSW50ZXJzZWN0aW9uTm9kZXModGhpcy5fYXJnSW5kZXgpLGl9fSxlLnByb3RvdHlwZS5jb21wdXRlU3BsaXRFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fZWRnZXMuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe2UubmV4dCgpLmVpTGlzdC5hZGRTcGxpdEVkZ2VzKHQpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUVkZ2VJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgbWMoZSxuLCEwKTtyZXR1cm4gci5zZXRCb3VuZGFyeU5vZGVzKHRoaXMuZ2V0Qm91bmRhcnlOb2RlcygpLHQuZ2V0Qm91bmRhcnlOb2RlcygpKSx0aGlzLmNyZWF0ZUVkZ2VTZXRJbnRlcnNlY3RvcigpLmNvbXB1dGVJbnRlcnNlY3Rpb25zKHRoaXMuX2VkZ2VzLHQuX2VkZ2VzLHIpLHJ9LGUucHJvdG90eXBlLmdldEdlb21ldHJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcmVudEdlb219LGUucHJvdG90eXBlLmdldEJvdW5kYXJ5Tm9kZVJ1bGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm91bmRhcnlOb2RlUnVsZX0sZS5wcm90b3R5cGUuaGFzVG9vRmV3UG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc1Rvb0Zld1BvaW50c30sZS5wcm90b3R5cGUuYWRkUG9pbnQ9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGNzKXt2YXIgdD1hcmd1bWVudHNbMF0uZ2V0Q29vcmRpbmF0ZSgpO3RoaXMuaW5zZXJ0UG9pbnQodGhpcy5fYXJnSW5kZXgsdCxiaS5JTlRFUklPUil9ZWxzZSBpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIHZpKXt2YXIgZT1hcmd1bWVudHNbMF07dGhpcy5pbnNlcnRQb2ludCh0aGlzLl9hcmdJbmRleCxlLGJpLklOVEVSSU9SKX19LGUucHJvdG90eXBlLmFkZFBvbHlnb249ZnVuY3Rpb24odCl7dGhpcy5hZGRQb2x5Z29uUmluZyh0LmdldEV4dGVyaW9yUmluZygpLGJpLkVYVEVSSU9SLGJpLklOVEVSSU9SKTtmb3IodmFyIGU9MDtlPHQuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7ZSsrKXt2YXIgbj10LmdldEludGVyaW9yUmluZ04oZSk7dGhpcy5hZGRQb2x5Z29uUmluZyhuLGJpLklOVEVSSU9SLGJpLkVYVEVSSU9SKX19LGUucHJvdG90eXBlLmFkZEVkZ2U9ZnVuY3Rpb24odCl7dGhpcy5pbnNlcnRFZGdlKHQpO3ZhciBlPXQuZ2V0Q29vcmRpbmF0ZXMoKTt0aGlzLmluc2VydFBvaW50KHRoaXMuX2FyZ0luZGV4LGVbMF0sYmkuQk9VTkRBUlkpLHRoaXMuaW5zZXJ0UG9pbnQodGhpcy5fYXJnSW5kZXgsZVtlLmxlbmd0aC0xXSxiaS5CT1VOREFSWSl9LGUucHJvdG90eXBlLmFkZExpbmVTdHJpbmc9ZnVuY3Rpb24odCl7dmFyIGU9RG8ucmVtb3ZlUmVwZWF0ZWRQb2ludHModC5nZXRDb29yZGluYXRlcygpKTtpZihlLmxlbmd0aDwyKXJldHVybiB0aGlzLl9oYXNUb29GZXdQb2ludHM9ITAsdGhpcy5faW52YWxpZFBvaW50PWVbMF0sbnVsbDt2YXIgbj1uZXcgY3UoZSxuZXcganModGhpcy5fYXJnSW5kZXgsYmkuSU5URVJJT1IpKTt0aGlzLl9saW5lRWRnZU1hcC5wdXQodCxuKSx0aGlzLmluc2VydEVkZ2UobiksWmkuaXNUcnVlKGUubGVuZ3RoPj0yLCJmb3VuZCBMaW5lU3RyaW5nIHdpdGggc2luZ2xlIHBvaW50IiksdGhpcy5pbnNlcnRCb3VuZGFyeVBvaW50KHRoaXMuX2FyZ0luZGV4LGVbMF0pLHRoaXMuaW5zZXJ0Qm91bmRhcnlQb2ludCh0aGlzLl9hcmdJbmRleCxlW2UubGVuZ3RoLTFdKX0sZS5wcm90b3R5cGUuZ2V0SW52YWxpZFBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludmFsaWRQb2ludH0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlQb2ludHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5nZXRCb3VuZGFyeU5vZGVzKCksZT1uZXcgQXJyYXkodC5zaXplKCkpLmZpbGwobnVsbCksbj0wLHI9dC5pdGVyYXRvcigpO3IuaGFzTmV4dCgpOyl7dmFyIGk9ci5uZXh0KCk7ZVtuKytdPWkuZ2V0Q29vcmRpbmF0ZSgpLmNvcHkoKX1yZXR1cm4gZX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRhcnlOb2Rlcz1mdW5jdGlvbigpe3JldHVybiBudWxsPT09dGhpcy5fYm91bmRhcnlOb2RlcyYmKHRoaXMuX2JvdW5kYXJ5Tm9kZXM9dGhpcy5fbm9kZXMuZ2V0Qm91bmRhcnlOb2Rlcyh0aGlzLl9hcmdJbmRleCkpLHRoaXMuX2JvdW5kYXJ5Tm9kZXN9LGUucHJvdG90eXBlLmFkZFNlbGZJbnRlcnNlY3Rpb25Ob2RlPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLmlzQm91bmRhcnlOb2RlKHQsZSkpcmV0dXJuIG51bGw7bj09PWJpLkJPVU5EQVJZJiZ0aGlzLl91c2VCb3VuZGFyeURldGVybWluYXRpb25SdWxlP3RoaXMuaW5zZXJ0Qm91bmRhcnlQb2ludCh0LGUpOnRoaXMuaW5zZXJ0UG9pbnQodCxlLG4pfSxlLnByb3RvdHlwZS5hZGRQb2x5Z29uUmluZz1mdW5jdGlvbih0LGUsbil7aWYodC5pc0VtcHR5KCkpcmV0dXJuIG51bGw7dmFyIHI9RG8ucmVtb3ZlUmVwZWF0ZWRQb2ludHModC5nZXRDb29yZGluYXRlcygpKTtpZihyLmxlbmd0aDw0KXJldHVybiB0aGlzLl9oYXNUb29GZXdQb2ludHM9ITAsdGhpcy5faW52YWxpZFBvaW50PXJbMF0sbnVsbDt2YXIgaT1lLG89bjtlby5pc0NDVyhyKSYmKGk9bixvPWUpO3ZhciBzPW5ldyBjdShyLG5ldyBqcyh0aGlzLl9hcmdJbmRleCxiaS5CT1VOREFSWSxpLG8pKTt0aGlzLl9saW5lRWRnZU1hcC5wdXQodCxzKSx0aGlzLmluc2VydEVkZ2UocyksdGhpcy5pbnNlcnRQb2ludCh0aGlzLl9hcmdJbmRleCxyWzBdLGJpLkJPVU5EQVJZKX0sZS5wcm90b3R5cGUuaW5zZXJ0UG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuX25vZGVzLmFkZE5vZGUoZSksaT1yLmdldExhYmVsKCk7bnVsbD09PWk/ci5fbGFiZWw9bmV3IGpzKHQsbik6aS5zZXRMb2NhdGlvbih0LG4pfSxlLnByb3RvdHlwZS5jcmVhdGVFZGdlU2V0SW50ZXJzZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHZjfSxlLnByb3RvdHlwZS5hZGRTZWxmSW50ZXJzZWN0aW9uTm9kZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2VkZ2VzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KWZvcih2YXIgbj1lLm5leHQoKSxyPW4uZ2V0TGFiZWwoKS5nZXRMb2NhdGlvbih0KSxpPW4uZWlMaXN0Lml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KXt2YXIgbz1pLm5leHQoKTt0aGlzLmFkZFNlbGZJbnRlcnNlY3Rpb25Ob2RlKHQsby5jb29yZCxyKX19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe2lmKDEhPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0LnByb3RvdHlwZS5hZGQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBlPWFyZ3VtZW50c1swXTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDtpZihlIGluc3RhbmNlb2YgZHMmJih0aGlzLl91c2VCb3VuZGFyeURldGVybWluYXRpb25SdWxlPSExKSxlIGluc3RhbmNlb2YgaHMpdGhpcy5hZGRQb2x5Z29uKGUpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGFzKXRoaXMuYWRkTGluZVN0cmluZyhlKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBjcyl0aGlzLmFkZFBvaW50KGUpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIGZzKXRoaXMuYWRkQ29sbGVjdGlvbihlKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBabyl0aGlzLmFkZENvbGxlY3Rpb24oZSk7ZWxzZSBpZihlIGluc3RhbmNlb2YgZHMpdGhpcy5hZGRDb2xsZWN0aW9uKGUpO2Vsc2V7aWYoIShlIGluc3RhbmNlb2YgSG8pKXRocm93IG5ldyBFcnJvcihlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTt0aGlzLmFkZENvbGxlY3Rpb24oZSl9fSxlLnByb3RvdHlwZS5hZGRDb2xsZWN0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5nZXROdW1HZW9tZXRyaWVzKCk7ZSsrKXt2YXIgbj10LmdldEdlb21ldHJ5TihlKTt0aGlzLmFkZChuKX19LGUucHJvdG90eXBlLmxvY2F0ZT1mdW5jdGlvbih0KXtyZXR1cm4gRWkodGhpcy5fcGFyZW50R2VvbSxscykmJnRoaXMuX3BhcmVudEdlb20uZ2V0TnVtR2VvbWV0cmllcygpPjUwPyhudWxsPT09dGhpcy5fYXJlYVB0TG9jYXRvciYmKHRoaXMuX2FyZWFQdExvY2F0b3I9bmV3IFNjKHRoaXMuX3BhcmVudEdlb20pKSx0aGlzLl9hcmVhUHRMb2NhdG9yLmxvY2F0ZSh0KSk6dGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh0LHRoaXMuX3BhcmVudEdlb20pfSxlLnByb3RvdHlwZS5maW5kRWRnZT1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuX2xpbmVFZGdlTWFwLmdldChlKX1yZXR1cm4gdC5wcm90b3R5cGUuZmluZEVkZ2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBlfSxlLmRldGVybWluZUJvdW5kYXJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuaXNJbkJvdW5kYXJ5KGUpP2JpLkJPVU5EQVJZOmJpLklOVEVSSU9SfSxlfShRcyksRmM9ZnVuY3Rpb24oKXtpZih0aGlzLl9saT1uZXcgUWksdGhpcy5fcmVzdWx0UHJlY2lzaW9uTW9kZWw9bnVsbCx0aGlzLl9hcmc9bnVsbCwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuc2V0Q29tcHV0YXRpb25QcmVjaXNpb24odC5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9hcmc9bmV3IEFycmF5KDEpLmZpbGwobnVsbCksdGhpcy5fYXJnWzBdPW5ldyBNYygwLHQpfWVsc2UgaWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBlPWFyZ3VtZW50c1swXSxuPWFyZ3VtZW50c1sxXSxyPXVvLk9HQ19TRlNfQk9VTkRBUllfUlVMRTtlLmdldFByZWNpc2lvbk1vZGVsKCkuY29tcGFyZVRvKG4uZ2V0UHJlY2lzaW9uTW9kZWwoKSk+PTA/dGhpcy5zZXRDb21wdXRhdGlvblByZWNpc2lvbihlLmdldFByZWNpc2lvbk1vZGVsKCkpOnRoaXMuc2V0Q29tcHV0YXRpb25QcmVjaXNpb24obi5nZXRQcmVjaXNpb25Nb2RlbCgpKSx0aGlzLl9hcmc9bmV3IEFycmF5KDIpLmZpbGwobnVsbCksdGhpcy5fYXJnWzBdPW5ldyBNYygwLGUsciksdGhpcy5fYXJnWzFdPW5ldyBNYygxLG4scil9ZWxzZSBpZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdLHM9YXJndW1lbnRzWzJdO2kuZ2V0UHJlY2lzaW9uTW9kZWwoKS5jb21wYXJlVG8oby5nZXRQcmVjaXNpb25Nb2RlbCgpKT49MD90aGlzLnNldENvbXB1dGF0aW9uUHJlY2lzaW9uKGkuZ2V0UHJlY2lzaW9uTW9kZWwoKSk6dGhpcy5zZXRDb21wdXRhdGlvblByZWNpc2lvbihvLmdldFByZWNpc2lvbk1vZGVsKCkpLHRoaXMuX2FyZz1uZXcgQXJyYXkoMikuZmlsbChudWxsKSx0aGlzLl9hcmdbMF09bmV3IE1jKDAsaSxzKSx0aGlzLl9hcmdbMV09bmV3IE1jKDEsbyxzKX19O0ZjLnByb3RvdHlwZS5nZXRBcmdHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYXJnW3RdLmdldEdlb21ldHJ5KCl9LEZjLnByb3RvdHlwZS5zZXRDb21wdXRhdGlvblByZWNpc2lvbj1mdW5jdGlvbih0KXt0aGlzLl9yZXN1bHRQcmVjaXNpb25Nb2RlbD10LHRoaXMuX2xpLnNldFByZWNpc2lvbk1vZGVsKHRoaXMuX3Jlc3VsdFByZWNpc2lvbk1vZGVsKX0sRmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEZjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBGY307dmFyIFRjPWZ1bmN0aW9uKCl7fTtUYy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0sVGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFRjfSxUYy5tYXA9ZnVuY3Rpb24oKXtpZihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIGlvJiZFaShhcmd1bWVudHNbMV0sVGMuTWFwT3ApKXtmb3IodmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IHhvLHI9MDtyPHQuZ2V0TnVtR2VvbWV0cmllcygpO3IrKyl7dmFyIGk9ZS5tYXAodC5nZXRHZW9tZXRyeU4ocikpO251bGwhPT1pJiZuLmFkZChpKX1yZXR1cm4gdC5nZXRGYWN0b3J5KCkuYnVpbGRHZW9tZXRyeShuKX1pZihFaShhcmd1bWVudHNbMF0sZ28pJiZFaShhcmd1bWVudHNbMV0sVGMuTWFwT3ApKXtmb3IodmFyIG89YXJndW1lbnRzWzBdLHM9YXJndW1lbnRzWzFdLGE9bmV3IHhvLHU9by5pdGVyYXRvcigpO3UuaGFzTmV4dCgpOyl7dmFyIGM9dS5uZXh0KCksbD1zLm1hcChjKTtudWxsIT09bCYmYS5hZGQobCl9cmV0dXJuIGF9fSxUYy5NYXBPcD1mdW5jdGlvbigpe307dmFyIE9jPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07dC5jYWxsKHRoaXMsZSxuKSx0aGlzLl9wdExvY2F0b3I9bmV3IFR1LHRoaXMuX2dlb21GYWN0PW51bGwsdGhpcy5fcmVzdWx0R2VvbT1udWxsLHRoaXMuX2dyYXBoPW51bGwsdGhpcy5fZWRnZUxpc3Q9bmV3IHR1LHRoaXMuX3Jlc3VsdFBvbHlMaXN0PW5ldyB4byx0aGlzLl9yZXN1bHRMaW5lTGlzdD1uZXcgeG8sdGhpcy5fcmVzdWx0UG9pbnRMaXN0PW5ldyB4byx0aGlzLl9ncmFwaD1uZXcgUXMobmV3IFFhKSx0aGlzLl9nZW9tRmFjdD1lLmdldEZhY3RvcnkoKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUuaW5zZXJ0VW5pcXVlRWRnZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9lZGdlTGlzdC5maW5kRXF1YWxFZGdlKHQpO2lmKG51bGwhPT1lKXt2YXIgbj1lLmdldExhYmVsKCkscj10LmdldExhYmVsKCk7ZS5pc1BvaW50d2lzZUVxdWFsKHQpfHwocj1uZXcganModC5nZXRMYWJlbCgpKSkuZmxpcCgpO3ZhciBpPWUuZ2V0RGVwdGgoKTtpLmlzTnVsbCgpJiZpLmFkZChuKSxpLmFkZChyKSxuLm1lcmdlKHIpfWVsc2UgdGhpcy5fZWRnZUxpc3QuYWRkKHQpfSxlLnByb3RvdHlwZS5nZXRHcmFwaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ncmFwaH0sZS5wcm90b3R5cGUuY2FuY2VsRHVwbGljYXRlUmVzdWx0RWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0RWRnZUVuZHMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCksbj1lLmdldFN5bSgpO2UuaXNJblJlc3VsdCgpJiZuLmlzSW5SZXN1bHQoKSYmKGUuc2V0SW5SZXN1bHQoITEpLG4uc2V0SW5SZXN1bHQoITEpKX19LGUucHJvdG90eXBlLmlzQ292ZXJlZEJ5TEE9ZnVuY3Rpb24odCl7cmV0dXJuISghdGhpcy5pc0NvdmVyZWQodCx0aGlzLl9yZXN1bHRMaW5lTGlzdCkmJiF0aGlzLmlzQ292ZXJlZCh0LHRoaXMuX3Jlc3VsdFBvbHlMaXN0KSl9LGUucHJvdG90eXBlLmNvbXB1dGVHZW9tZXRyeT1mdW5jdGlvbih0LG4scixpKXt2YXIgbz1uZXcgeG87cmV0dXJuIG8uYWRkQWxsKHQpLG8uYWRkQWxsKG4pLG8uYWRkQWxsKHIpLG8uaXNFbXB0eSgpP2UuY3JlYXRlRW1wdHlSZXN1bHQoaSx0aGlzLl9hcmdbMF0uZ2V0R2VvbWV0cnkoKSx0aGlzLl9hcmdbMV0uZ2V0R2VvbWV0cnkoKSx0aGlzLl9nZW9tRmFjdCk6dGhpcy5fZ2VvbUZhY3QuYnVpbGRHZW9tZXRyeShvKX0sZS5wcm90b3R5cGUubWVyZ2VTeW1MYWJlbHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5tZXJnZVN5bUxhYmVscygpfX0sZS5wcm90b3R5cGUuaXNDb3ZlcmVkPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWUuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpO2lmKHRoaXMuX3B0TG9jYXRvci5sb2NhdGUodCxyKSE9PWJpLkVYVEVSSU9SKXJldHVybiEwfXJldHVybiExfSxlLnByb3RvdHlwZS5yZXBsYWNlQ29sbGFwc2VkRWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IHhvLGU9dGhpcy5fZWRnZUxpc3QuaXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO24uaXNDb2xsYXBzZWQoKSYmKGUucmVtb3ZlKCksdC5hZGQobi5nZXRDb2xsYXBzZWRFZGdlKCkpKX10aGlzLl9lZGdlTGlzdC5hZGRBbGwodCl9LGUucHJvdG90eXBlLnVwZGF0ZU5vZGVMYWJlbGxpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dmFyIGU9dC5uZXh0KCksbj1lLmdldEVkZ2VzKCkuZ2V0TGFiZWwoKTtlLmdldExhYmVsKCkubWVyZ2Uobil9fSxlLnByb3RvdHlwZS5nZXRSZXN1bHRHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb21wdXRlT3ZlcmxheSh0KSx0aGlzLl9yZXN1bHRHZW9tfSxlLnByb3RvdHlwZS5pbnNlcnRVbmlxdWVFZGdlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dGhpcy5pbnNlcnRVbmlxdWVFZGdlKG4pfX0sZS5wcm90b3R5cGUuY29tcHV0ZU92ZXJsYXk9ZnVuY3Rpb24odCl7dGhpcy5jb3B5UG9pbnRzKDApLHRoaXMuY29weVBvaW50cygxKSx0aGlzLl9hcmdbMF0uY29tcHV0ZVNlbGZOb2Rlcyh0aGlzLl9saSwhMSksdGhpcy5fYXJnWzFdLmNvbXB1dGVTZWxmTm9kZXModGhpcy5fbGksITEpLHRoaXMuX2FyZ1swXS5jb21wdXRlRWRnZUludGVyc2VjdGlvbnModGhpcy5fYXJnWzFdLHRoaXMuX2xpLCEwKTt2YXIgZT1uZXcgeG87dGhpcy5fYXJnWzBdLmNvbXB1dGVTcGxpdEVkZ2VzKGUpLHRoaXMuX2FyZ1sxXS5jb21wdXRlU3BsaXRFZGdlcyhlKSx0aGlzLmluc2VydFVuaXF1ZUVkZ2VzKGUpLHRoaXMuY29tcHV0ZUxhYmVsc0Zyb21EZXB0aHMoKSx0aGlzLnJlcGxhY2VDb2xsYXBzZWRFZGdlcygpLEp1LmNoZWNrVmFsaWQodGhpcy5fZWRnZUxpc3QuZ2V0RWRnZXMoKSksdGhpcy5fZ3JhcGguYWRkRWRnZXModGhpcy5fZWRnZUxpc3QuZ2V0RWRnZXMoKSksdGhpcy5jb21wdXRlTGFiZWxsaW5nKCksdGhpcy5sYWJlbEluY29tcGxldGVOb2RlcygpLHRoaXMuZmluZFJlc3VsdEFyZWFFZGdlcyh0KSx0aGlzLmNhbmNlbER1cGxpY2F0ZVJlc3VsdEVkZ2VzKCk7dmFyIG49bmV3ICRzKHRoaXMuX2dlb21GYWN0KTtuLmFkZCh0aGlzLl9ncmFwaCksdGhpcy5fcmVzdWx0UG9seUxpc3Q9bi5nZXRQb2x5Z29ucygpO3ZhciByPW5ldyAkdSh0aGlzLHRoaXMuX2dlb21GYWN0LHRoaXMuX3B0TG9jYXRvcik7dGhpcy5fcmVzdWx0TGluZUxpc3Q9ci5idWlsZCh0KTt2YXIgaT1uZXcgdGModGhpcyx0aGlzLl9nZW9tRmFjdCx0aGlzLl9wdExvY2F0b3IpO3RoaXMuX3Jlc3VsdFBvaW50TGlzdD1pLmJ1aWxkKHQpLHRoaXMuX3Jlc3VsdEdlb209dGhpcy5jb21wdXRlR2VvbWV0cnkodGhpcy5fcmVzdWx0UG9pbnRMaXN0LHRoaXMuX3Jlc3VsdExpbmVMaXN0LHRoaXMuX3Jlc3VsdFBvbHlMaXN0LHQpfSxlLnByb3RvdHlwZS5sYWJlbEluY29tcGxldGVOb2RlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh0LmdldENvb3JkaW5hdGUoKSx0aGlzLl9hcmdbZV0uZ2V0R2VvbWV0cnkoKSk7dC5nZXRMYWJlbCgpLnNldExvY2F0aW9uKGUsbil9LGUucHJvdG90eXBlLmNvcHlQb2ludHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2FyZ1t0XS5nZXROb2RlSXRlcmF0b3IoKTtlLmhhc05leHQoKTspe3ZhciBuPWUubmV4dCgpO3RoaXMuX2dyYXBoLmFkZE5vZGUobi5nZXRDb29yZGluYXRlKCkpLnNldExhYmVsKHQsbi5nZXRMYWJlbCgpLmdldExvY2F0aW9uKHQpKX19LGUucHJvdG90eXBlLmZpbmRSZXN1bHRBcmVhRWRnZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuX2dyYXBoLmdldEVkZ2VFbmRzKCkuaXRlcmF0b3IoKTtuLmhhc05leHQoKTspe3ZhciByPW4ubmV4dCgpLGk9ci5nZXRMYWJlbCgpO2kuaXNBcmVhKCkmJiFyLmlzSW50ZXJpb3JBcmVhRWRnZSgpJiZlLmlzUmVzdWx0T2ZPcChpLmdldExvY2F0aW9uKDAsRnMuUklHSFQpLGkuZ2V0TG9jYXRpb24oMSxGcy5SSUdIVCksdCkmJnIuc2V0SW5SZXN1bHQoITApfX0sZS5wcm90b3R5cGUuY29tcHV0ZUxhYmVsc0Zyb21EZXB0aHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZWRnZUxpc3QuaXRlcmF0b3IoKTt0Lmhhc05leHQoKTspe3ZhciBlPXQubmV4dCgpLG49ZS5nZXRMYWJlbCgpLHI9ZS5nZXREZXB0aCgpO2lmKCFyLmlzTnVsbCgpKXtyLm5vcm1hbGl6ZSgpO2Zvcih2YXIgaT0wO2k8MjtpKyspIW4uaXNOdWxsKGkpJiZuLmlzQXJlYSgpJiYhci5pc051bGwoaSkmJigwPT09ci5nZXREZWx0YShpKT9uLnRvTGluZShpKTooWmkuaXNUcnVlKCFyLmlzTnVsbChpLEZzLkxFRlQpLCJkZXB0aCBvZiBMRUZUIHNpZGUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIiksbi5zZXRMb2NhdGlvbihpLEZzLkxFRlQsci5nZXRMb2NhdGlvbihpLEZzLkxFRlQpKSxaaS5pc1RydWUoIXIuaXNOdWxsKGksRnMuUklHSFQpLCJkZXB0aCBvZiBSSUdIVCBzaWRlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCIpLG4uc2V0TG9jYXRpb24oaSxGcy5SSUdIVCxyLmdldExvY2F0aW9uKGksRnMuUklHSFQpKSkpfX19LGUucHJvdG90eXBlLmNvbXB1dGVMYWJlbGxpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JhcGguZ2V0Tm9kZXMoKS5pdGVyYXRvcigpO3QuaGFzTmV4dCgpOyl7dC5uZXh0KCkuZ2V0RWRnZXMoKS5jb21wdXRlTGFiZWxsaW5nKHRoaXMuX2FyZyl9dGhpcy5tZXJnZVN5bUxhYmVscygpLHRoaXMudXBkYXRlTm9kZUxhYmVsbGluZygpfSxlLnByb3RvdHlwZS5sYWJlbEluY29tcGxldGVOb2Rlcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncmFwaC5nZXROb2RlcygpLml0ZXJhdG9yKCk7dC5oYXNOZXh0KCk7KXt2YXIgZT10Lm5leHQoKSxuPWUuZ2V0TGFiZWwoKTtlLmlzSXNvbGF0ZWQoKSYmKG4uaXNOdWxsKDApP3RoaXMubGFiZWxJbmNvbXBsZXRlTm9kZShlLDApOnRoaXMubGFiZWxJbmNvbXBsZXRlTm9kZShlLDEpKSxlLmdldEVkZ2VzKCkudXBkYXRlTGFiZWxsaW5nKG4pfX0sZS5wcm90b3R5cGUuaXNDb3ZlcmVkQnlBPWZ1bmN0aW9uKHQpe3JldHVybiEhdGhpcy5pc0NvdmVyZWQodCx0aGlzLl9yZXN1bHRQb2x5TGlzdCl9LGUucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGUucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGV9KEZjKTtPYy5vdmVybGF5T3A9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBuZXcgT2ModCxlKS5nZXRSZXN1bHRHZW9tZXRyeShuKX0sT2MuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSl7aWYodC5pc0VtcHR5KCl8fGUuaXNFbXB0eSgpKXJldHVybiBPYy5jcmVhdGVFbXB0eVJlc3VsdChPYy5JTlRFUlNFQ1RJT04sdCxlLHQuZ2V0RmFjdG9yeSgpKTtpZih0LmlzR2VvbWV0cnlDb2xsZWN0aW9uKCkpe3ZhciBuPWU7cmV0dXJuIFF1Lm1hcCh0LHtpbnRlcmZhY2VzXzpmdW5jdGlvbigpe3JldHVybltUYy5NYXBPcF19LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pbnRlcnNlY3Rpb24obil9fSl9cmV0dXJuIHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24odCksdC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbihlKSxmYy5vdmVybGF5T3AodCxlLE9jLklOVEVSU0VDVElPTil9LE9jLnN5bURpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtpZih0LmlzRW1wdHkoKXx8ZS5pc0VtcHR5KCkpe2lmKHQuaXNFbXB0eSgpJiZlLmlzRW1wdHkoKSlyZXR1cm4gT2MuY3JlYXRlRW1wdHlSZXN1bHQoT2MuU1lNRElGRkVSRU5DRSx0LGUsdC5nZXRGYWN0b3J5KCkpO2lmKHQuaXNFbXB0eSgpKXJldHVybiBlLmNvcHkoKTtpZihlLmlzRW1wdHkoKSlyZXR1cm4gdC5jb3B5KCl9cmV0dXJuIHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24odCksdC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbihlKSxmYy5vdmVybGF5T3AodCxlLE9jLlNZTURJRkZFUkVOQ0UpfSxPYy5yZXN1bHREaW1lbnNpb249ZnVuY3Rpb24odCxlLG4pe3ZhciByPWUuZ2V0RGltZW5zaW9uKCksaT1uLmdldERpbWVuc2lvbigpLG89LTE7c3dpdGNoKHQpe2Nhc2UgT2MuSU5URVJTRUNUSU9OOm89TWF0aC5taW4ocixpKTticmVhaztjYXNlIE9jLlVOSU9OOm89TWF0aC5tYXgocixpKTticmVhaztjYXNlIE9jLkRJRkZFUkVOQ0U6bz1yO2JyZWFrO2Nhc2UgT2MuU1lNRElGRkVSRU5DRTpvPU1hdGgubWF4KHIsaSl9cmV0dXJuIG99LE9jLmNyZWF0ZUVtcHR5UmVzdWx0PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW51bGw7c3dpdGNoKE9jLnJlc3VsdERpbWVuc2lvbih0LGUsbikpe2Nhc2UtMTppPXIuY3JlYXRlR2VvbWV0cnlDb2xsZWN0aW9uKG5ldyBBcnJheSgwKS5maWxsKG51bGwpKTticmVhaztjYXNlIDA6aT1yLmNyZWF0ZVBvaW50KCk7YnJlYWs7Y2FzZSAxOmk9ci5jcmVhdGVMaW5lU3RyaW5nKCk7YnJlYWs7Y2FzZSAyOmk9ci5jcmVhdGVQb2x5Z29uKCl9cmV0dXJuIGl9LE9jLmRpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5pc0VtcHR5KCk/T2MuY3JlYXRlRW1wdHlSZXN1bHQoT2MuRElGRkVSRU5DRSx0LGUsdC5nZXRGYWN0b3J5KCkpOmUuaXNFbXB0eSgpP3QuY29weSgpOih0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKHQpLHQuY2hlY2tOb3RHZW9tZXRyeUNvbGxlY3Rpb24oZSksZmMub3ZlcmxheU9wKHQsZSxPYy5ESUZGRVJFTkNFKSl9LE9jLmlzUmVzdWx0T2ZPcD1mdW5jdGlvbigpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF0sZT1hcmd1bWVudHNbMV0sbj10LmdldExvY2F0aW9uKDApLHI9dC5nZXRMb2NhdGlvbigxKTtyZXR1cm4gT2MuaXNSZXN1bHRPZk9wKG4scixlKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGk9YXJndW1lbnRzWzBdLG89YXJndW1lbnRzWzFdO3N3aXRjaChpPT09YmkuQk9VTkRBUlkmJihpPWJpLklOVEVSSU9SKSxvPT09YmkuQk9VTkRBUlkmJihvPWJpLklOVEVSSU9SKSxhcmd1bWVudHNbMl0pe2Nhc2UgT2MuSU5URVJTRUNUSU9OOnJldHVybiBpPT09YmkuSU5URVJJT1ImJm89PT1iaS5JTlRFUklPUjtjYXNlIE9jLlVOSU9OOnJldHVybiBpPT09YmkuSU5URVJJT1J8fG89PT1iaS5JTlRFUklPUjtjYXNlIE9jLkRJRkZFUkVOQ0U6cmV0dXJuIGk9PT1iaS5JTlRFUklPUiYmbyE9PWJpLklOVEVSSU9SO2Nhc2UgT2MuU1lNRElGRkVSRU5DRTpyZXR1cm4gaT09PWJpLklOVEVSSU9SJiZvIT09YmkuSU5URVJJT1J8fGkhPT1iaS5JTlRFUklPUiYmbz09PWJpLklOVEVSSU9SfXJldHVybiExfX0sT2MuSU5URVJTRUNUSU9OPTEsT2MuVU5JT049MixPYy5ESUZGRVJFTkNFPTMsT2MuU1lNRElGRkVSRU5DRT00O3ZhciBMYz1mdW5jdGlvbigpe3RoaXMuX2c9bnVsbCx0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlPW51bGwsdGhpcy5fbGluZXdvcms9bnVsbCx0aGlzLl9wdExvY2F0b3I9bmV3IFR1LHRoaXMuX3NlZz1uZXcgYmE7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdO3RoaXMuX2c9dCx0aGlzLl9ib3VuZGFyeURpc3RhbmNlVG9sZXJhbmNlPWUsdGhpcy5fbGluZXdvcms9dGhpcy5leHRyYWN0TGluZXdvcmsodCl9O0xjLnByb3RvdHlwZS5pc1dpdGhpblRvbGVyYW5jZU9mQm91bmRhcnk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMsbj0wO248dGhpcy5fbGluZXdvcmsuZ2V0TnVtR2VvbWV0cmllcygpO24rKylmb3IodmFyIHI9ZS5fbGluZXdvcmsuZ2V0R2VvbWV0cnlOKG4pLmdldENvb3JkaW5hdGVTZXF1ZW5jZSgpLGk9MDtpPHIuc2l6ZSgpLTE7aSsrKXtpZihyLmdldENvb3JkaW5hdGUoaSxlLl9zZWcucDApLHIuZ2V0Q29vcmRpbmF0ZShpKzEsZS5fc2VnLnAxKSxlLl9zZWcuZGlzdGFuY2UodCk8PWUuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2UpcmV0dXJuITB9cmV0dXJuITF9LExjLnByb3RvdHlwZS5nZXRMb2NhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pc1dpdGhpblRvbGVyYW5jZU9mQm91bmRhcnkodCk/YmkuQk9VTkRBUlk6dGhpcy5fcHRMb2NhdG9yLmxvY2F0ZSh0LHRoaXMuX2cpfSxMYy5wcm90b3R5cGUuZXh0cmFjdExpbmV3b3JrPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBQYzt0LmFwcGx5KGUpO3ZhciBuPWUuZ2V0TGluZXdvcmsoKSxyPUlzLnRvTGluZVN0cmluZ0FycmF5KG4pO3JldHVybiB0LmdldEZhY3RvcnkoKS5jcmVhdGVNdWx0aUxpbmVTdHJpbmcocil9LExjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxMYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gTGN9O3ZhciBQYz1mdW5jdGlvbigpe3RoaXMuX2xpbmV3b3JrPW51bGwsdGhpcy5fbGluZXdvcms9bmV3IHhvfTtQYy5wcm90b3R5cGUuZ2V0TGluZXdvcms9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGluZXdvcmt9LFBjLnByb3RvdHlwZS5maWx0ZXI9ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIGhzKXt2YXIgZT10O3RoaXMuX2xpbmV3b3JrLmFkZChlLmdldEV4dGVyaW9yUmluZygpKTtmb3IodmFyIG49MDtuPGUuZ2V0TnVtSW50ZXJpb3JSaW5nKCk7bisrKXRoaXMuX2xpbmV3b3JrLmFkZChlLmdldEludGVyaW9yUmluZ04obikpfX0sUGMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW1hvXX0sUGMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIFBjfTt2YXIgUmM9ZnVuY3Rpb24oKXt0aGlzLl9nPW51bGwsdGhpcy5fZG9MZWZ0PSEwLHRoaXMuX2RvUmlnaHQ9ITA7dmFyIHQ9YXJndW1lbnRzWzBdO3RoaXMuX2c9dH07UmMucHJvdG90eXBlLmV4dHJhY3RQb2ludHM9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj10LmdldENvb3JkaW5hdGVzKCksaT0wO2k8ci5sZW5ndGgtMTtpKyspdGhpcy5jb21wdXRlT2Zmc2V0UG9pbnRzKHJbaV0scltpKzFdLGUsbil9LFJjLnByb3RvdHlwZS5zZXRTaWRlc1RvR2VuZXJhdGU9ZnVuY3Rpb24odCxlKXt0aGlzLl9kb0xlZnQ9dCx0aGlzLl9kb1JpZ2h0PWV9LFJjLnByb3RvdHlwZS5nZXRQb2ludHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyB4byxuPUZ1LmdldExpbmVzKHRoaXMuX2cpLml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKTt0aGlzLmV4dHJhY3RQb2ludHMocix0LGUpfXJldHVybiBlfSxSYy5wcm90b3R5cGUuY29tcHV0ZU9mZnNldFBvaW50cz1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1lLngtdC54LG89ZS55LXQueSxzPU1hdGguc3FydChpKmkrbypvKSxhPW4qaS9zLHU9bipvL3MsYz0oZS54K3QueCkvMixsPShlLnkrdC55KS8yO2lmKHRoaXMuX2RvTGVmdCl7dmFyIGg9bmV3IHZpKGMtdSxsK2EpO3IuYWRkKGgpfWlmKHRoaXMuX2RvUmlnaHQpe3ZhciBmPW5ldyB2aShjK3UsbC1hKTtyLmFkZChmKX19LFJjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxSYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gUmN9O3ZhciBCYz1mdW5jdGlvbiB0KCl7dGhpcy5fZ2VvbT1udWxsLHRoaXMuX2xvY0ZpbmRlcj1udWxsLHRoaXMuX2xvY2F0aW9uPW5ldyBBcnJheSgzKS5maWxsKG51bGwpLHRoaXMuX2ludmFsaWRMb2NhdGlvbj1udWxsLHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9dC5UT0xFUkFOQ0UsdGhpcy5fdGVzdENvb3Jkcz1uZXcgeG87dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO3RoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2U9dC5jb21wdXRlQm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZShlLG4pLHRoaXMuX2dlb209W2UsbixyXSx0aGlzLl9sb2NGaW5kZXI9W25ldyBMYyh0aGlzLl9nZW9tWzBdLHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2UpLG5ldyBMYyh0aGlzLl9nZW9tWzFdLHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2UpLG5ldyBMYyh0aGlzLl9nZW9tWzJdLHRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2UpXX0sa2M9e1RPTEVSQU5DRTp7Y29uZmlndXJhYmxlOiEwfX07QmMucHJvdG90eXBlLnJlcG9ydFJlc3VsdD1mdW5jdGlvbih0LGUsbil7a2kub3V0LnByaW50bG4oIk92ZXJsYXkgcmVzdWx0IGludmFsaWQgLSBBOiIrYmkudG9Mb2NhdGlvblN5bWJvbChlWzBdKSsiIEI6IitiaS50b0xvY2F0aW9uU3ltYm9sKGVbMV0pKyIgZXhwZWN0ZWQ6Iisobj8iaSI6ImUiKSsiIGFjdHVhbDoiK2JpLnRvTG9jYXRpb25TeW1ib2woZVsyXSkpfSxCYy5wcm90b3R5cGUuaXNWYWxpZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hZGRUZXN0UHRzKHRoaXMuX2dlb21bMF0pLHRoaXMuYWRkVGVzdFB0cyh0aGlzLl9nZW9tWzFdKSx0aGlzLmNoZWNrVmFsaWQodCl9LEJjLnByb3RvdHlwZS5jaGVja1ZhbGlkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSxuPTA7bjx0aGlzLl90ZXN0Q29vcmRzLnNpemUoKTtuKyspe3ZhciByPXQuX3Rlc3RDb29yZHMuZ2V0KG4pO2lmKCF0LmNoZWNrVmFsaWQoZSxyKSlyZXR1cm4gdC5faW52YWxpZExvY2F0aW9uPXIsITF9cmV0dXJuITB9aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXTtyZXR1cm4gdGhpcy5fbG9jYXRpb25bMF09dGhpcy5fbG9jRmluZGVyWzBdLmdldExvY2F0aW9uKG8pLHRoaXMuX2xvY2F0aW9uWzFdPXRoaXMuX2xvY0ZpbmRlclsxXS5nZXRMb2NhdGlvbihvKSx0aGlzLl9sb2NhdGlvblsyXT10aGlzLl9sb2NGaW5kZXJbMl0uZ2V0TG9jYXRpb24obyksISFCYy5oYXNMb2NhdGlvbih0aGlzLl9sb2NhdGlvbixiaS5CT1VOREFSWSl8fHRoaXMuaXNWYWxpZFJlc3VsdChpLHRoaXMuX2xvY2F0aW9uKX19LEJjLnByb3RvdHlwZS5hZGRUZXN0UHRzPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBSYyh0KTt0aGlzLl90ZXN0Q29vcmRzLmFkZEFsbChlLmdldFBvaW50cyg1KnRoaXMuX2JvdW5kYXJ5RGlzdGFuY2VUb2xlcmFuY2UpKX0sQmMucHJvdG90eXBlLmlzVmFsaWRSZXN1bHQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1PYy5pc1Jlc3VsdE9mT3AoZVswXSxlWzFdLHQpLHI9IShuXmVbMl09PT1iaS5JTlRFUklPUik7cmV0dXJuIHJ8fHRoaXMucmVwb3J0UmVzdWx0KHQsZSxuKSxyfSxCYy5wcm90b3R5cGUuZ2V0SW52YWxpZExvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ludmFsaWRMb2NhdGlvbn0sQmMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LEJjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBCY30sQmMuaGFzTG9jYXRpb249ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MDtuPDM7bisrKWlmKHRbbl09PT1lKXJldHVybiEwO3JldHVybiExfSxCYy5jb21wdXRlQm91bmRhcnlEaXN0YW5jZVRvbGVyYW5jZT1mdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1pbihyYy5jb21wdXRlU2l6ZUJhc2VkU25hcFRvbGVyYW5jZSh0KSxyYy5jb21wdXRlU2l6ZUJhc2VkU25hcFRvbGVyYW5jZShlKSl9LEJjLmlzVmFsaWQ9ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIG5ldyBCYyh0LGUscikuaXNWYWxpZChuKX0sa2MuVE9MRVJBTkNFLmdldD1mdW5jdGlvbigpe3JldHVybiAxZS02fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhCYyxrYyk7dmFyIHpjPWZ1bmN0aW9uIHQoZSl7dGhpcy5fZ2VvbUZhY3Rvcnk9bnVsbCx0aGlzLl9za2lwRW1wdHk9ITEsdGhpcy5faW5wdXRHZW9tcz1udWxsLHRoaXMuX2dlb21GYWN0b3J5PXQuZXh0cmFjdEZhY3RvcnkoZSksdGhpcy5faW5wdXRHZW9tcz1lfTt6Yy5wcm90b3R5cGUuZXh0cmFjdEVsZW1lbnRzPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09PXQpcmV0dXJuIG51bGw7Zm9yKHZhciBuPTA7bjx0LmdldE51bUdlb21ldHJpZXMoKTtuKyspe3ZhciByPXQuZ2V0R2VvbWV0cnlOKG4pO3RoaXMuX3NraXBFbXB0eSYmci5pc0VtcHR5KCl8fGUuYWRkKHIpfX0semMucHJvdG90eXBlLmNvbWJpbmU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IHhvLGU9dGhpcy5faW5wdXRHZW9tcy5pdGVyYXRvcigpO2UuaGFzTmV4dCgpOyl7dmFyIG49ZS5uZXh0KCk7dGhpcy5leHRyYWN0RWxlbWVudHMobix0KX1yZXR1cm4gMD09PXQuc2l6ZSgpP251bGwhPT10aGlzLl9nZW9tRmFjdG9yeT90aGlzLl9nZW9tRmFjdG9yeS5jcmVhdGVHZW9tZXRyeUNvbGxlY3Rpb24obnVsbCk6bnVsbDp0aGlzLl9nZW9tRmFjdG9yeS5idWlsZEdlb21ldHJ5KHQpfSx6Yy5wcm90b3R5cGUuaW50ZXJmYWNlc189ZnVuY3Rpb24oKXtyZXR1cm5bXX0semMucHJvdG90eXBlLmdldENsYXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHpjfSx6Yy5jb21iaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP25ldyB6Yyhhcmd1bWVudHNbMF0pLmNvbWJpbmUoKToyPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgemMoemMuY3JlYXRlTGlzdChhcmd1bWVudHNbMF0sYXJndW1lbnRzWzFdKSkuY29tYmluZSgpOjM9PT1hcmd1bWVudHMubGVuZ3RoP25ldyB6Yyh6Yy5jcmVhdGVMaXN0KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKSkuY29tYmluZSgpOnZvaWQgMH0semMuZXh0cmFjdEZhY3Rvcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNFbXB0eSgpP251bGw6dC5pdGVyYXRvcigpLm5leHQoKS5nZXRGYWN0b3J5KCl9LHpjLmNyZWF0ZUxpc3Q9ZnVuY3Rpb24oKXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHQ9YXJndW1lbnRzWzBdLGU9YXJndW1lbnRzWzFdLG49bmV3IHhvO3JldHVybiBuLmFkZCh0KSxuLmFkZChlKSxufWlmKDM9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgcj1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl0scz1uZXcgeG87cmV0dXJuIHMuYWRkKHIpLHMuYWRkKGkpLHMuYWRkKG8pLHN9fTt2YXIgamM9ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dFBvbHlzPW51bGwsdGhpcy5fZ2VvbUZhY3Rvcnk9bnVsbDt2YXIgdD1hcmd1bWVudHNbMF07dGhpcy5faW5wdXRQb2x5cz10LG51bGw9PT10aGlzLl9pbnB1dFBvbHlzJiYodGhpcy5faW5wdXRQb2x5cz1uZXcgeG8pfSxVYz17U1RSVFJFRV9OT0RFX0NBUEFDSVRZOntjb25maWd1cmFibGU6ITB9fTtqYy5wcm90b3R5cGUucmVkdWNlVG9HZW9tZXRyaWVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgeG8sbj10Lml0ZXJhdG9yKCk7bi5oYXNOZXh0KCk7KXt2YXIgcj1uLm5leHQoKSxpPW51bGw7RWkocix2byk/aT10aGlzLnVuaW9uVHJlZShyKTpyIGluc3RhbmNlb2YgaW8mJihpPXIpLGUuYWRkKGkpfXJldHVybiBlfSxqYy5wcm90b3R5cGUuZXh0cmFjdEJ5RW52ZWxvcGU9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uZXcgeG8saT0wO2k8ZS5nZXROdW1HZW9tZXRyaWVzKCk7aSsrKXt2YXIgbz1lLmdldEdlb21ldHJ5TihpKTtvLmdldEVudmVsb3BlSW50ZXJuYWwoKS5pbnRlcnNlY3RzKHQpP3IuYWRkKG8pOm4uYWRkKG8pfXJldHVybiB0aGlzLl9nZW9tRmFjdG9yeS5idWlsZEdlb21ldHJ5KHIpfSxqYy5wcm90b3R5cGUudW5pb25PcHRpbWl6ZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmdldEVudmVsb3BlSW50ZXJuYWwoKSxyPWUuZ2V0RW52ZWxvcGVJbnRlcm5hbCgpO2lmKCFuLmludGVyc2VjdHMocikpcmV0dXJuIHpjLmNvbWJpbmUodCxlKTtpZih0LmdldE51bUdlb21ldHJpZXMoKTw9MSYmZS5nZXROdW1HZW9tZXRyaWVzKCk8PTEpcmV0dXJuIHRoaXMudW5pb25BY3R1YWwodCxlKTt2YXIgaT1uLmludGVyc2VjdGlvbihyKTtyZXR1cm4gdGhpcy51bmlvblVzaW5nRW52ZWxvcGVJbnRlcnNlY3Rpb24odCxlLGkpfSxqYy5wcm90b3R5cGUudW5pb249ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5faW5wdXRQb2x5cyl0aHJvdyBuZXcgRXJyb3IoInVuaW9uKCkgbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQgdHdpY2UiKTtpZih0aGlzLl9pbnB1dFBvbHlzLmlzRW1wdHkoKSlyZXR1cm4gbnVsbDt0aGlzLl9nZW9tRmFjdG9yeT10aGlzLl9pbnB1dFBvbHlzLml0ZXJhdG9yKCkubmV4dCgpLmdldEZhY3RvcnkoKTtmb3IodmFyIHQ9bmV3IHBhKGpjLlNUUlRSRUVfTk9ERV9DQVBBQ0lUWSksZT10aGlzLl9pbnB1dFBvbHlzLml0ZXJhdG9yKCk7ZS5oYXNOZXh0KCk7KXt2YXIgbj1lLm5leHQoKTt0Lmluc2VydChuLmdldEVudmVsb3BlSW50ZXJuYWwoKSxuKX10aGlzLl9pbnB1dFBvbHlzPW51bGw7dmFyIHI9dC5pdGVtc1RyZWUoKTtyZXR1cm4gdGhpcy51bmlvblRyZWUocil9LGpjLnByb3RvdHlwZS5iaW5hcnlVbmlvbj1mdW5jdGlvbigpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuYmluYXJ5VW5pb24odCwwLHQuc2l6ZSgpKX1pZigzPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9YXJndW1lbnRzWzBdLG49YXJndW1lbnRzWzFdLHI9YXJndW1lbnRzWzJdO2lmKHItbjw9MSl7dmFyIGk9amMuZ2V0R2VvbWV0cnkoZSxuKTtyZXR1cm4gdGhpcy51bmlvblNhZmUoaSxudWxsKX1pZihyLW49PTIpcmV0dXJuIHRoaXMudW5pb25TYWZlKGpjLmdldEdlb21ldHJ5KGUsbiksamMuZ2V0R2VvbWV0cnkoZSxuKzEpKTt2YXIgbz1NYXRoLnRydW5jKChyK24pLzIpLHM9dGhpcy5iaW5hcnlVbmlvbihlLG4sbyksYT10aGlzLmJpbmFyeVVuaW9uKGUsbyxyKTtyZXR1cm4gdGhpcy51bmlvblNhZmUocyxhKX19LGpjLnByb3RvdHlwZS5yZXBlYXRlZFVuaW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1udWxsLG49dC5pdGVyYXRvcigpO24uaGFzTmV4dCgpOyl7dmFyIHI9bi5uZXh0KCk7ZT1udWxsPT09ZT9yLmNvcHkoKTplLnVuaW9uKHIpfXJldHVybiBlfSxqYy5wcm90b3R5cGUudW5pb25TYWZlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PT10JiZudWxsPT09ZT9udWxsOm51bGw9PT10P2UuY29weSgpOm51bGw9PT1lP3QuY29weSgpOnRoaXMudW5pb25PcHRpbWl6ZWQodCxlKX0samMucHJvdG90eXBlLnVuaW9uQWN0dWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGpjLnJlc3RyaWN0VG9Qb2x5Z29ucyh0LnVuaW9uKGUpKX0samMucHJvdG90eXBlLnVuaW9uVHJlZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnJlZHVjZVRvR2VvbWV0cmllcyh0KTtyZXR1cm4gdGhpcy5iaW5hcnlVbmlvbihlKX0samMucHJvdG90eXBlLnVuaW9uVXNpbmdFbnZlbG9wZUludGVyc2VjdGlvbj1mdW5jdGlvbih0LGUsbil7dmFyIHI9bmV3IHhvLGk9dGhpcy5leHRyYWN0QnlFbnZlbG9wZShuLHQsciksbz10aGlzLmV4dHJhY3RCeUVudmVsb3BlKG4sZSxyKSxzPXRoaXMudW5pb25BY3R1YWwoaSxvKTtyZXR1cm4gci5hZGQocyksemMuY29tYmluZShyKX0samMucHJvdG90eXBlLmJ1ZmZlclVuaW9uPWZ1bmN0aW9uKCl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gdC5nZXQoMCkuZ2V0RmFjdG9yeSgpLmJ1aWxkR2VvbWV0cnkodCkuYnVmZmVyKDApfWlmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIgZT1hcmd1bWVudHNbMF0sbj1hcmd1bWVudHNbMV07cmV0dXJuIGUuZ2V0RmFjdG9yeSgpLmNyZWF0ZUdlb21ldHJ5Q29sbGVjdGlvbihbZSxuXSkuYnVmZmVyKDApfX0samMucHJvdG90eXBlLmludGVyZmFjZXNfPWZ1bmN0aW9uKCl7cmV0dXJuW119LGpjLnByb3RvdHlwZS5nZXRDbGFzcz1mdW5jdGlvbigpe3JldHVybiBqY30samMucmVzdHJpY3RUb1BvbHlnb25zPWZ1bmN0aW9uKHQpe2lmKEVpKHQsbHMpKXJldHVybiB0O3ZhciBlPU11LmdldFBvbHlnb25zKHQpO3JldHVybiAxPT09ZS5zaXplKCk/ZS5nZXQoMCk6dC5nZXRGYWN0b3J5KCkuY3JlYXRlTXVsdGlQb2x5Z29uKElzLnRvUG9seWdvbkFycmF5KGUpKX0samMuZ2V0R2VvbWV0cnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT49dC5zaXplKCk/bnVsbDp0LmdldChlKX0samMudW5pb249ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBqYyh0KS51bmlvbigpfSxVYy5TVFJUUkVFX05PREVfQ0FQQUNJVFkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDR9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGpjLFVjKTt2YXIgcWM9ZnVuY3Rpb24oKXt9O3FjLnByb3RvdHlwZS5pbnRlcmZhY2VzXz1mdW5jdGlvbigpe3JldHVybltdfSxxYy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gcWN9LHFjLnVuaW9uPWZ1bmN0aW9uKHQsZSl7aWYodC5pc0VtcHR5KCl8fGUuaXNFbXB0eSgpKXtpZih0LmlzRW1wdHkoKSYmZS5pc0VtcHR5KCkpcmV0dXJuIE9jLmNyZWF0ZUVtcHR5UmVzdWx0KE9jLlVOSU9OLHQsZSx0LmdldEZhY3RvcnkoKSk7aWYodC5pc0VtcHR5KCkpcmV0dXJuIGUuY29weSgpO2lmKGUuaXNFbXB0eSgpKXJldHVybiB0LmNvcHkoKX1yZXR1cm4gdC5jaGVja05vdEdlb21ldHJ5Q29sbGVjdGlvbih0KSx0LmNoZWNrTm90R2VvbWV0cnlDb2xsZWN0aW9uKGUpLGZjLm92ZXJsYXlPcCh0LGUsT2MuVU5JT04pfTt2YXIgVmM9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEdjfTtmdW5jdGlvbiBHYygpe3RoaXMucmVzZXQoKX1HYy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkdjLHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSxhZGQ6ZnVuY3Rpb24odCl7WGMoWWMsdCx0aGlzLnQpLFhjKHRoaXMsWWMucyx0aGlzLnMpLHRoaXMucz90aGlzLnQrPVljLnQ6dGhpcy5zPVljLnR9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIFljPW5ldyBHYztmdW5jdGlvbiBYYyh0LGUsbil7dmFyIHI9dC5zPWUrbixpPXItZSxvPXItaTt0LnQ9ZS1vKyhuLWkpfXZhciBXYz1NYXRoLlBJLEhjPTIqV2M7ZnVuY3Rpb24gWmModCxlKXtyZXR1cm5bdD5XYz90LUhjOnQ8LVdjP3QrSGM6dCxlXX1WYygpLFZjKCksVmMoKSxaYy5pbnZlcnQ9WmM7dmFyIEtjLEpjLFFjLCRjLHRsLGVsLG5sLHJsLGlsLG9sLHNsLGFsLHVsLGNsLGxsLGhsLGZsLHBsLGRsLGdsLHlsLG1sLHZsLF9sLHhsLHdsLGJsLERsLEVsLENsLFNsLEFsLE5sLElsLE1sLEZsLFRsLE9sLExsLFBsLFJsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfTtmdW5jdGlvbiBCbCgpe31mdW5jdGlvbiBrbCh0LGUsbil7dmFyIHI9dm9pZCAwPT09ZT9udWxsOmUsaT1mdW5jdGlvbih0LGUpe3ZhciBuPWF0b2IodCk7aWYoZSl7Zm9yKHZhciByPW5ldyBVaW50OEFycmF5KG4ubGVuZ3RoKSxpPTAsbz1uLmxlbmd0aDtpPG87KytpKXJbaV09bi5jaGFyQ29kZUF0KGkpO3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQxNkFycmF5KHIuYnVmZmVyKSl9cmV0dXJuIG59KHQsdm9pZCAwIT09biYmbiksbz1pLmluZGV4T2YoIlxuIiwxMCkrMSxzPWkuc3Vic3RyaW5nKG8pKyhyPyIvLyMgc291cmNlTWFwcGluZ1VSTD0iK3I6IiIpLGE9bmV3IEJsb2IoW3NdLHt0eXBlOiJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0In0pO3JldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGEpfWZ1bmN0aW9uIHpsKHQ9OCxlPTYyKXtjb25zdCBuPSIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIuc3BsaXQoIiIpLHI9W107bGV0IGk7aWYoZT1lfHxuLmxlbmd0aCx0KWZvcihpPTA7aTx0O2krKylyW2ldPW5bMHxNYXRoLnJhbmRvbSgpKmVdO2Vsc2V7bGV0IHQ7Zm9yKHJbOF09clsxM109clsxOF09clsyM109Ii0iLHJbMTRdPSI0IixpPTA7aTwzNjtpKyspcltpXXx8KHQ9MHwxNipNYXRoLnJhbmRvbSgpLHJbaV09blsxOT09PWk/MyZ0fDg6dF0pfXJldHVybiByLmpvaW4oIiIpfShmdW5jdGlvbih0KXsxPT09dC5sZW5ndGgmJih0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiBSbCh0KGUpLG4pfX0odCkpfSkoUmwpLFZjKCksVmMoKSxWYygpLFZjKCksVmMoKSxCbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkJsLHBvaW50OmZ1bmN0aW9uKHQsZSl7dGhpcy5zdHJlYW0ucG9pbnQodCxlKX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19LGZ1bmN0aW9uKHQpe3QuUG9pbnRDbG91ZD0icG9pbnRDbG91ZFRvb2wifShLY3x8KEtjPXt9KSksZnVuY3Rpb24odCl7dC5WaWRlb1RleHRUb29sPSJ2aWRlb1RleHRUb29sIix0LlZpZGVvVGFnVG9vbD0idmlkZW9UYWdUb29sIix0LlZpZGVvQ2xpcFRvb2w9InZpZGVvQ2xpcFRvb2wifShKY3x8KEpjPXt9KSksZnVuY3Rpb24odCl7dC5BdWRpb1RleHRUb29sPSJhdWRpb1RleHRUb29sIn0oUWN8fChRYz17fSkpLGZ1bmN0aW9uKHQpe3RbdC5SZWN0PTBdPSJSZWN0Iix0W3QuVGFnPTFdPSJUYWcifSgkY3x8KCRjPXt9KSksZnVuY3Rpb24odCl7dC5SZWN0PSJyZWN0VG9vbCIsdC5UYWc9InRhZ1Rvb2wiLHQuUG9pbnQ9InBvaW50VG9vbCIsdC5Qb2ludE1hcmtlcj0icG9pbnRNYXJrZXJUb29sIix0LlNlZ21lbnRhdGlvbj0ic2VnbWVudGF0aW9uVG9vbCIsdC5GaWx0ZXI9ImZpbHRlclRvb2wiLHQuVGV4dD0idGV4dFRvb2wiLHQuUG9seWdvbj0icG9seWdvblRvb2wiLHQuTGluZT0ibGluZVRvb2wiLHQuTGluZU1hcmtlcj0ibGluZU1hcmtlclRvb2wiLHQuRW1wdHk9ImVtcHR5VG9vbCIsdC5Gb2xkZXJUYWc9ImZvbGRlclRhZ1Rvb2wiLHQuUmVjdFRyYWNrPSJyZWN0VHJhY2tUb29sIix0LlNjcmliYmxlVG9vbD0ic2NyaWJibGVUb29sIix0LkZhY2U9ImZhY2VUb29sIix0LkNsaWVudEF0dHJpYnV0ZT0iY2xpZW50QXR0cmlidXRlVG9vbCIsdC5PQ1JSZWxhdGlvbj0iT0NSUmVsYXRpb25Ub29sIix0LlNlZ21lbnRCeVJlY3Q9InNlZ21lbnRCeVJlY3RUb29sIix0LkN1Ym9pZD0iY3Vib2lkVG9vbCIsdC5Qb2ludENsb3VkUG9seWdvbj0icG9pbnRDbG91ZFBvbHlnb24iLHQuTExNPSJMTE1Ub29sIix0Lk5MUD0iTkxQVG9vbCJ9KHRsfHwodGw9e30pKSxmdW5jdGlvbih0KXt0LkNoZWNrPSJjaGVjayJ9KGVsfHwoZWw9e30pKSxmdW5jdGlvbih0KXt0W3Qubm90aGluZz0wXT0ibm90aGluZyIsdFt0LlJlY3RCRz0xXT0iUmVjdEJHIix0W3Quc2hvd09yZGVyPTJdPSJzaG93T3JkZXIifShubHx8KG5sPXt9KSksdGwuUmVjdCx0bC5UYWcsdGwuUG9pbnQsdGwuUG9pbnRNYXJrZXIsdGwuU2VnbWVudGF0aW9uLHRsLkZpbHRlcix0bC5UZXh0LHRsLlBvbHlnb24sdGwuTGluZSx0bC5MaW5lTWFya2VyLHRsLkZvbGRlclRhZyx0bC5SZWN0VHJhY2ssdGwuRmFjZSx0bC5DbGllbnRBdHRyaWJ1dGUsdGwuT0NSUmVsYXRpb24sdGwuU2VnbWVudEJ5UmVjdCxKYy5WaWRlb1RleHRUb29sLEpjLlZpZGVvVGFnVG9vbCxKYy5WaWRlb0NsaXBUb29sLEtjLlBvaW50Q2xvdWQsdGwuQ3Vib2lkLHRsLkxMTSx0bC5OTFAsdGwuUmVjdCx0bC5UYWcsdGwuUG9pbnQsdGwuUG9pbnRNYXJrZXIsdGwuU2VnbWVudGF0aW9uLHRsLkZpbHRlcix0bC5UZXh0LHRsLlBvbHlnb24sdGwuTGluZSx0bC5MaW5lTWFya2VyLHRsLkZvbGRlclRhZyx0bC5SZWN0VHJhY2ssdGwuRmFjZSx0bC5DbGllbnRBdHRyaWJ1dGUsdGwuT0NSUmVsYXRpb24sdGwuU2VnbWVudEJ5UmVjdCxKYy5WaWRlb1RleHRUb29sLEpjLlZpZGVvVGFnVG9vbCxKYy5WaWRlb0NsaXBUb29sLEtjLlBvaW50Q2xvdWQsdGwuQ3Vib2lkLHRsLkxMTSx0bC5OTFAsZnVuY3Rpb24odCl7dFt0Lm5vRGVwZW5kPTFdPSJub0RlcGVuZCIsdFt0LmRlcGVuZE9yaWdpbj0yXT0iZGVwZW5kT3JpZ2luIix0W3QuZGVwZW5kU2hhcGU9M109ImRlcGVuZFNoYXBlIix0W3QuZGVwZW5kTGluZT00XT0iZGVwZW5kTGluZSIsdFt0LmRlcGVuZFBvbHlnb249NV09ImRlcGVuZFBvbHlnb24iLHRbdC5kZXBlbmRQcmVTaGFwZT0xMDFdPSJkZXBlbmRQcmVTaGFwZSIsdFt0LmRlcGVuZFByZUxpbmU9MTAyXT0iZGVwZW5kUHJlTGluZSIsdFt0LmRlcGVuZFByZVBvbHlnb249MTAzXT0iZGVwZW5kUHJlUG9seWdvbiJ9KHJsfHwocmw9e30pKSxmdW5jdGlvbih0KXt0LmxjPSJsZWZ0Q2xpY2siLHQucmM9InJpZ2h0Q2xpY2siLHQuY2xjPSJjdHJsTGVmdENsaWNrIix0LmNyYz0iY3RybFJpZ2h0Q2xpY2sifShpbHx8KGlsPXt9KSksZnVuY3Rpb24odCl7dFt0Lk5vcm1hbD0xXT0iTm9ybWFsIix0W3QuTW9kaWZ5PTJdPSJNb2RpZnkifShvbHx8KG9sPXt9KSksZnVuY3Rpb24odCl7dFt0LkxpbmU9MF09IkxpbmUiLHRbdC5DdXJ2ZT0xXT0iQ3VydmUifShzbHx8KHNsPXt9KSksZnVuY3Rpb24odCl7dFt0LlNpbmdsZUNvbG9yPTBdPSJTaW5nbGVDb2xvciIsdFt0Lk11bHRpQ29sb3I9MV09Ik11bHRpQ29sb3IifShhbHx8KGFsPXt9KSksZnVuY3Rpb24odCl7dFt0LkZvcm09MV09IkZvcm0iLHRbdC5Kc29uPTJdPSJKc29uIn0odWx8fCh1bD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5Qb2ludD0wXT0iUG9pbnQiLHRbdC5MaW5lPTFdPSJMaW5lIix0W3QuUGxhbmU9Ml09IlBsYW5lIn0oY2x8fChjbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5Ob25lPTBdPSJOb25lIix0W3QuRHJhd2luZz0xXT0iRHJhd2luZyIsdFt0LkVkaXQ9Ml09IkVkaXQifShsbHx8KGxsPXt9KSksZnVuY3Rpb24odCl7dFt0LkJhY2t3YXJkPTBdPSJCYWNrd2FyZCIsdFt0LkZvcndhcmQ9MV09IkZvcndhcmQiLHRbdC5KdW1wU2tpcD0yXT0iSnVtcFNraXAiLHRbdC5Ob25lPTNdPSJOb25lIn0oaGx8fChobD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5XYWl0PTBdPSJXYWl0Iix0W3QuUGFzcz0xXT0iUGFzcyIsdFt0LkZhaWw9Ml09IkZhaWwiLHRbdC5Mb2FkaW5nPTNdPSJMb2FkaW5nIn0oZmx8fChmbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5BbnlTdHJpbmc9MF09IkFueVN0cmluZyIsdFt0Lk9yZGVyPTFdPSJPcmRlciIsdFt0LkVuZ2xpc2hPbmx5PTJdPSJFbmdsaXNoT25seSIsdFt0Lk51bWJlck9ubHk9M109Ik51bWJlck9ubHkiLHRbdC5DdXN0b21Gb3JtYXQ9NF09IkN1c3RvbUZvcm1hdCJ9KHBsfHwocGw9e30pKSxmdW5jdGlvbih0KXt0W3QuSW1nTGlzdD0xZTNdPSJJbWdMaXN0Iix0W3QuVHJhY2tQcmVkaWN0aW9uPTEwMDFdPSJUcmFja1ByZWRpY3Rpb24iLHRbdC5JbWdTZWFyY2g9MTAwMl09IkltZ1NlYXJjaCJ9KGRsfHwoZGw9e30pKSxLYy5Qb2ludENsb3VkLHRsLkNsaWVudEF0dHJpYnV0ZSx0bC5GYWNlLHRsLk9DUlJlbGF0aW9uLEtjLlBvaW50Q2xvdWQsdGwuQ2xpZW50QXR0cmlidXRlLHRsLkZhY2UsdGwuT0NSUmVsYXRpb24sZnVuY3Rpb24odCl7dFt0Lk5vcm1hbD0wXT0iTm9ybWFsIix0W3QuUmVjdD0xXT0iUmVjdCJ9KGdsfHwoZ2w9e30pKSxmdW5jdGlvbih0KXt0W3QuU2NyaWJibGU9MV09IlNjcmliYmxlIix0W3QuRXJhc2U9Ml09IkVyYXNlIn0oeWx8fCh5bD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5HZW5lcmFsPTFdPSJHZW5lcmFsIix0W3QuTXVsdGlNb3ZlPTJdPSJNdWx0aU1vdmUifShtbHx8KG1sPXt9KSksZnVuY3Rpb24odCl7dFt0LkFOTk9UQVRJT049MV09IkFOTk9UQVRJT04iLHRbdC5RVUFMSVRZX0lOU1BFQ1RJT049Ml09IlFVQUxJVFlfSU5TUEVDVElPTiIsdFt0LlBSRV9BTk5PVEFUSU9OPTNdPSJQUkVfQU5OT1RBVElPTiIsdFt0Lk1BTlVBTF9DT1JSRUNUSU9OPTRdPSJNQU5VQUxfQ09SUkVDVElPTiJ9KHZsfHwodmw9e30pKSxmdW5jdGlvbih0KXt0W3QuQmFja3dhcmQ9MF09IkJhY2t3YXJkIix0W3QuRm9yd2FyZD0xXT0iRm9yd2FyZCIsdFt0Lkp1bXBTa2lwPTJdPSJKdW1wU2tpcCIsdFt0Lk5vbmU9M109Ik5vbmUifShfbHx8KF9sPXt9KSksZnVuY3Rpb24odCl7dFt0LlN0YXJ0PTBdPSJTdGFydCIsdFt0LlN0b3A9MV09IlN0b3AiLHRbdC5XYWl0PTJdPSJXYWl0Iix0W3QuTW92ZT0zXT0iTW92ZSJ9KHhsfHwoeGw9e30pKSxmdW5jdGlvbih0KXt0W3QuUG9pbnQ9MF09IlBvaW50Iix0W3QuTGluZT0xXT0iTGluZSIsdFt0LlBsYW5lPTJdPSJQbGFuZSIsdFt0LkN1Ym9pZD0zXT0iQ3Vib2lkIn0od2x8fCh3bD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5hc2NlbmQ9MF09ImFzY2VuZCIsdFt0LmRlc2NlbmQ9MV09ImRlc2NlbmQifShibHx8KGJsPXt9KSksZnVuY3Rpb24odCl7dFt0LkludGVsbGlnZW5jZT0wXT0iSW50ZWxsaWdlbmNlIix0W3QuTGluZWFyPTFdPSJMaW5lYXIifShEbHx8KERsPXt9KSksZnVuY3Rpb24odCl7dC5aaD0iemhfQ04iLHQuVVM9ImVuX1VTIn0oRWx8fChFbD17fSkpLGZ1bmN0aW9uKHQpe3RbdC5DbG9ja3dpc2U9MF09IkNsb2Nrd2lzZSIsdFt0LkFudGljbG9ja3dpc2U9MV09IkFudGljbG9ja3dpc2UifShDbHx8KENsPXt9KSksZnVuY3Rpb24odCl7dC5Gcm9udD0iZnJvbnQiLHQuQmFjaz0iYmFjayIsdC5TaWRlPSJzaWRlIn0oU2x8fChTbD17fSkpLGZ1bmN0aW9uKHQpe3QuVEw9InRsIix0LlRSPSJ0ciIsdC5CTD0iYmwiLHQuQlI9ImJyIn0oQWx8fChBbD17fSkpLGZ1bmN0aW9uKHQpe3QuRnJvbnQ9ImZyb250Iix0LkJhY2s9ImJhY2siLHQuTGVmdD0ibGVmdCIsdC5SaWdodD0icmlnaHQiLHQuVG9wPSJ0b3AifShObHx8KE5sPXt9KSksZnVuY3Rpb24odCl7dC5Sb3c9InJvdyIsdC5Db2x1bW49ImNvbHVtbiJ9KElsfHwoSWw9e30pKSxBbC5UTCxBbC5UUixBbC5UUixBbC5UTCxBbC5CTCxBbC5CUixBbC5CUixBbC5CTCxBbC5UTCxBbC5CTCxBbC5UUixBbC5CUixBbC5CTCxBbC5UTCxBbC5CUixBbC5UUixmdW5jdGlvbih0KXt0W3QuQT02NV09IkEiLHRbdC5CPTY2XT0iQiIsdFt0LkM9NjddPSJDIix0W3QuRD02OF09IkQiLHRbdC5FPTY5XT0iRSIsdFt0LkY9NzBdPSJGIix0W3QuRz03MV09IkciLHRbdC5IPTcyXT0iSCIsdFt0Lkk9NzNdPSJJIix0W3QuTz03OV09Ik8iLHRbdC5MPTc2XT0iTCIsdFt0LlI9ODJdPSJSIix0W3QuWj05MF09IloiLHRbdC5XPTg3XT0iVyIsdFt0Llg9ODhdPSJYIix0W3QuWT04OV09IlkiLHRbdC5TPTgzXT0iUyIsdFt0LlE9ODFdPSJRIix0W3QuUD04MF09IlAiLHRbdC5PbmU9NDldPSJPbmUiLHRbdC5Ud289NTBdPSJUd28iLHRbdC5UaHJlZT01MV09IlRocmVlIix0W3QuRGVsZXRlPTQ2XT0iRGVsZXRlIix0W3QuRjExPTEyMl09IkYxMSIsdFt0LlNwYWNlPTMyXT0iU3BhY2UiLHRbdC5Fc2M9MjddPSJFc2MiLHRbdC5MZWZ0PTM3XT0iTGVmdCIsdFt0LlVwPTM4XT0iVXAiLHRbdC5SaWdodD0zOV09IlJpZ2h0Iix0W3QuRG93bj00MF09IkRvd24iLHRbdC5FbnRlcj0xM109IkVudGVyIix0W3QuQ3RybD0xN109IkN0cmwiLHRbdC5BbHQ9MThdPSJBbHQiLHRbdC5TaGlmdD0xNl09IlNoaWZ0Iix0W3QuVGFiPTldPSJUYWIiLHRbdC5CYWNrU3BhY2U9OF09IkJhY2tTcGFjZSIsdFt0Lk1pbnVzPTE4OV09Ik1pbnVzIix0W3QuRXF1YWw9MTg3XT0iRXF1YWwifShNbHx8KE1sPXt9KSksZnVuY3Rpb24odCl7dFt0LkNyZWF0ZT0wXT0iQ3JlYXRlIix0W3QuQWN0aXZlPTFdPSJBY3RpdmUiLHRbdC5FZGl0PTFdPSJFZGl0Iix0W3QuTm9uZT0yXT0iTm9uZSJ9KEZsfHwoRmw9e30pKSxmdW5jdGlvbih0KXt0LkFjdGl2ZUFyZWE9IiNCM0I4RkYifShUbHx8KFRsPXt9KSksZnVuY3Rpb24odCl7dFt0Lk91dHNpZGU9MF09Ik91dHNpZGUiLHRbdC5QYXJ0aWFsbHlJbnNpZGU9MV09IlBhcnRpYWxseUluc2lkZSIsdFt0LkZ1bGx5SW5zaWRlPTJdPSJGdWxseUluc2lkZSJ9KE9sfHwoT2w9e30pKSxmdW5jdGlvbih0KXt0Lk5vUm90YXRlTm90aWNlPSJub1JvdGF0ZU5vdGljZSIsdC5SZWN0RXJyb3JTaXplTm90aWNlPSJyZWN0RXJyb3JTaXplTm90aWNlIix0LlRleHRDaGVja051bWJlckVycm9yTm90aWNlPSJ0ZXh0Q2hlY2tOdW1iZXJFcnJvck5vdGljZSIsdC5UZXh0Q2hlY2tFbmdsaXNoRXJyb3JOb3RpY2U9InRleHRDaGVja0VuZ2xpc2hFcnJvck5vdGljZSIsdC5UZXh0Q2hlY2tDdXN0b21FcnJvck5vdGljZT0idGV4dENoZWNrQ3VzdG9tRXJyb3JOb3RpY2UiLHQuVXBwZXJMaW1pdEVycm9yTm90aWNlPSJVcHBlckxpbWl0RXJyb3JOb3RpY2UiLHQuTG93ZXJMaW1pdEVycm9yTm90aWNlPSJMb3dlckxpbWl0RXJyb3JOb3RpY2UiLHQuTWluQXJlYUxpbWl0RXJyb3JOb3RpY2U9Ik1pbkFyZWFMaW1pdEVycm9yTm90aWNlIix0Lk1pbkxlbmd0aExpbWl0RXJyb3JOb3RpY2U9Ik1pbkxlbmd0aExpbWl0RXJyb3JOb3RpY2UiLHQuSW52YWxpZEltYWdlPSJJbnZhbGlkSW1hZ2UiLHQuRGlzYWJsZURlbGV0ZT0iRGlzYWJsZURlbGV0ZSIsdC5DbGVhclBhcnRpYWxEYXRhPSJDbGVhclBhcnRpYWxEYXRhIix0Lk1hcmtlckZpbmlzaD0iTWFya2VyRmluaXNoIix0Lkxvd2VyTGltaXRQb2ludD0iTG93ZXJMaW1pdFBvaW50Iix0Lk5vUm90YXRlSW5EZXBlbmRlbmNlPSJub1JvdGF0ZUluRGVwZW5kZW5jZSIsdC5VbmFibGVUb1JlYW5ub3RhdGlvbj0idW5hYmxlVG9SZWFubm90YXRpb24iLHQuRm9yYmlkZGVuQ3JlYXRpb25PdXRzaWRlQm91bmRhcnk9IkZvcmJpZGRlbkNyZWF0aW9uT3V0c2lkZUJvdW5kYXJ5Iix0LlN1Y2Nlc3NmdWxFZGdlQWRzb3JwdGlvbj0iU3VjY2Vzc2Z1bEVkZ2VBZHNvcnB0aW9uIix0LkZvcmJpZEFkZE5ld1BvaW50PSJGb3JiaWRBZGROZXdQb2ludCJ9KExsfHwoTGw9e30pKSxMbC5Ob1JvdGF0ZU5vdGljZSxMbC5SZWN0RXJyb3JTaXplTm90aWNlLExsLlRleHRDaGVja051bWJlckVycm9yTm90aWNlLExsLlRleHRDaGVja0VuZ2xpc2hFcnJvck5vdGljZSxMbC5UZXh0Q2hlY2tDdXN0b21FcnJvck5vdGljZSxMbC5VcHBlckxpbWl0RXJyb3JOb3RpY2UsTGwuTG93ZXJMaW1pdEVycm9yTm90aWNlLExsLk1pbkFyZWFMaW1pdEVycm9yTm90aWNlLExsLk1pbkxlbmd0aExpbWl0RXJyb3JOb3RpY2UsTGwuSW52YWxpZEltYWdlLExsLkRpc2FibGVEZWxldGUsTGwuQ2xlYXJQYXJ0aWFsRGF0YSxMbC5NYXJrZXJGaW5pc2gsTGwuTG93ZXJMaW1pdFBvaW50LExsLk5vUm90YXRlSW5EZXBlbmRlbmNlLExsLlVuYWJsZVRvUmVhbm5vdGF0aW9uLExsLkZvcmJpZGRlbkNyZWF0aW9uT3V0c2lkZUJvdW5kYXJ5LExsLlN1Y2Nlc3NmdWxFZGdlQWRzb3JwdGlvbixMbC5Gb3JiaWRBZGROZXdQb2ludCxMbC5Ob1JvdGF0ZU5vdGljZSxMbC5SZWN0RXJyb3JTaXplTm90aWNlLExsLlRleHRDaGVja051bWJlckVycm9yTm90aWNlLExsLlRleHRDaGVja0VuZ2xpc2hFcnJvck5vdGljZSxMbC5UZXh0Q2hlY2tDdXN0b21FcnJvck5vdGljZSxMbC5VcHBlckxpbWl0RXJyb3JOb3RpY2UsTGwuTG93ZXJMaW1pdEVycm9yTm90aWNlLExsLk1pbkFyZWFMaW1pdEVycm9yTm90aWNlLExsLk1pbkxlbmd0aExpbWl0RXJyb3JOb3RpY2UsTGwuSW52YWxpZEltYWdlLExsLkRpc2FibGVEZWxldGUsTGwuQ2xlYXJQYXJ0aWFsRGF0YSxMbC5NYXJrZXJGaW5pc2gsTGwuTG93ZXJMaW1pdFBvaW50LExsLk5vUm90YXRlSW5EZXBlbmRlbmNlLExsLlVuYWJsZVRvUmVhbm5vdGF0aW9uLExsLkZvcmJpZGRlbkNyZWF0aW9uT3V0c2lkZUJvdW5kYXJ5LExsLlN1Y2Nlc3NmdWxFZGdlQWRzb3JwdGlvbixMbC5Gb3JiaWRBZGROZXdQb2ludCxpbC5sYyxpbC5yYyxpbC5jbGMsaWwuY3JjLFsxLDUsMTAsMjAsMzAsNTAsODAsMTAwXS5jb25jYXQoQXJyYXkuZnJvbSh7bGVuZ3RoOjl9KS5tYXAoKCh0LGUpPT4xMDAqKGUrMikpKSksRWwuWmgsRWwuVVMsZnVuY3Rpb24odCl7dFt0LkNyZWF0ZT0wXT0iQ3JlYXRlIix0W3QuQWN0aXZlPTFdPSJBY3RpdmUiLHRbdC5Ob25lPTJdPSJOb25lIn0oUGx8fChQbD17fSkpO2NvbnN0IGpsPTEwMDEsVWw9InNyZ2IiLHFsPSJzcmdiLWxpbmVhciIsVmw9ImRpc3BsYXktcDMiLEdsPSJkaXNwbGF5LXAzLWxpbmVhciIsWWw9ImxpbmVhciIsWGw9InNyZ2IiLFdsPSJyZWM3MDkiLEhsPTJlMztjbGFzcyBabHthZGRFdmVudExpc3RlbmVyKHQsZSl7dm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBuPXRoaXMuX2xpc3RlbmVyczt2b2lkIDA9PT1uW3RdJiYoblt0XT1bXSksLTE9PT1uW3RdLmluZGV4T2YoZSkmJm5bdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybiExO2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiB2b2lkIDAhPT1uW3RdJiYtMSE9PW5bdF0uaW5kZXhPZihlKX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBuPXRoaXMuX2xpc3RlbmVyc1t0XTtpZih2b2lkIDAhPT1uKXtjb25zdCB0PW4uaW5kZXhPZihlKTstMSE9PXQmJm4uc3BsaWNlKHQsMSl9fWRpc3BhdGNoRXZlbnQodCl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBlPXRoaXMuX2xpc3RlbmVyc1t0LnR5cGVdO2lmKHZvaWQgMCE9PWUpe3QudGFyZ2V0PXRoaXM7Y29uc3Qgbj1lLnNsaWNlKDApO2ZvcihsZXQgZT0wLHI9bi5sZW5ndGg7ZTxyO2UrKyluW2VdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgS2w9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2Z1bmN0aW9uIEpsKCl7Y29uc3QgdD00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxlPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLG49NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAscj00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MDtyZXR1cm4oS2xbMjU1JnRdK0tsW3Q+PjgmMjU1XStLbFt0Pj4xNiYyNTVdK0tsW3Q+PjI0JjI1NV0rIi0iK0tsWzI1NSZlXStLbFtlPj44JjI1NV0rIi0iK0tsW2U+PjE2JjE1fDY0XStLbFtlPj4yNCYyNTVdKyItIitLbFs2MyZufDEyOF0rS2xbbj4+OCYyNTVdKyItIitLbFtuPj4xNiYyNTVdK0tsW24+PjI0JjI1NV0rS2xbMjU1JnJdK0tsW3I+PjgmMjU1XStLbFtyPj4xNiYyNTVdK0tsW3I+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gUWwodCxlLG4pe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKG4sdCkpfWZ1bmN0aW9uICRsKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX1jbGFzcyB0aHtjb25zdHJ1Y3Rvcih0PTAsZT0wKXt0aC5wcm90b3R5cGUuaXNWZWN0b3IyPSEwLHRoaXMueD10LHRoaXMueT1lfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnh9c2V0IHdpZHRoKHQpe3RoaXMueD10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy55fXNldCBoZWlnaHQodCl7dGhpcy55PXR9c2V0KHQsZSl7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbM10qbityWzZdLHRoaXMueT1yWzFdKmUrcls0XSpuK3JbN10sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX1jcm9zcyh0KXtyZXR1cm4gdGhpcy54KnQueS10aGlzLnkqdC54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZigwPT09ZSlyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKFFsKG4sLTEsMSkpfWRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVRvU3F1YXJlZCh0KXtjb25zdCBlPXRoaXMueC10Lngsbj10aGlzLnktdC55O3JldHVybiBlKmUrbipufW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueX1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzfXJvdGF0ZUFyb3VuZCh0LGUpe2NvbnN0IG49TWF0aC5jb3MoZSkscj1NYXRoLnNpbihlKSxpPXRoaXMueC10Lngsbz10aGlzLnktdC55O3JldHVybiB0aGlzLng9aSpuLW8qcit0LngsdGhpcy55PWkqcitvKm4rdC55LHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueX19Y2xhc3MgZWh7Y29uc3RydWN0b3IodCxlLG4scixpLG8scyxhLHUpe2VoLnByb3RvdHlwZS5pc01hdHJpeDM9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdLHZvaWQgMCE9PXQmJnRoaXMuc2V0KHQsZSxuLHIsaSxvLHMsYSx1KX1zZXQodCxlLG4scixpLG8scyxhLHUpe2NvbnN0IGM9dGhpcy5lbGVtZW50cztyZXR1cm4gY1swXT10LGNbMV09cixjWzJdPXMsY1szXT1lLGNbNF09aSxjWzVdPWEsY1s2XT1uLGNbN109byxjWzhdPXUsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSksdGhpc31jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZVsyXT1uWzJdLGVbM109blszXSxlWzRdPW5bNF0sZVs1XT1uWzVdLGVbNl09bls2XSxlWzddPW5bN10sZVs4XT1uWzhdLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMiksdGhpc31zZXRGcm9tTWF0cml4NCh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVs0XSxlWzhdLGVbMV0sZVs1XSxlWzldLGVbMl0sZVs2XSxlWzEwXSksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscj1lLmVsZW1lbnRzLGk9dGhpcy5lbGVtZW50cyxvPW5bMF0scz1uWzNdLGE9bls2XSx1PW5bMV0sYz1uWzRdLGw9bls3XSxoPW5bMl0sZj1uWzVdLHA9bls4XSxkPXJbMF0sZz1yWzNdLHk9cls2XSxtPXJbMV0sdj1yWzRdLF89cls3XSx4PXJbMl0sdz1yWzVdLGI9cls4XTtyZXR1cm4gaVswXT1vKmQrcyptK2EqeCxpWzNdPW8qZytzKnYrYSp3LGlbNl09byp5K3MqXythKmIsaVsxXT11KmQrYyptK2wqeCxpWzRdPXUqZytjKnYrbCp3LGlbN109dSp5K2MqXytsKmIsaVsyXT1oKmQrZiptK3AqeCxpWzVdPWgqZytmKnYrcCp3LGlbOF09aCp5K2YqXytwKmIsdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVszXSo9dCxlWzZdKj10LGVbMV0qPXQsZVs0XSo9dCxlWzddKj10LGVbMl0qPXQsZVs1XSo9dCxlWzhdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxyPXRbMl0saT10WzNdLG89dFs0XSxzPXRbNV0sYT10WzZdLHU9dFs3XSxjPXRbOF07cmV0dXJuIGUqbypjLWUqcyp1LW4qaSpjK24qcyphK3IqaSp1LXIqbyphfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHI9dFsyXSxpPXRbM10sbz10WzRdLHM9dFs1XSxhPXRbNl0sdT10WzddLGM9dFs4XSxsPWMqby1zKnUsaD1zKmEtYyppLGY9dSppLW8qYSxwPWUqbCtuKmgrcipmO2lmKDA9PT1wKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgZD0xL3A7cmV0dXJuIHRbMF09bCpkLHRbMV09KHIqdS1jKm4pKmQsdFsyXT0ocypuLXIqbykqZCx0WzNdPWgqZCx0WzRdPShjKmUtciphKSpkLHRbNV09KHIqaS1zKmUpKmQsdFs2XT1mKmQsdFs3XT0obiphLXUqZSkqZCx0WzhdPShvKmUtbippKSpkLHRoaXN9dHJhbnNwb3NlKCl7bGV0IHQ7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0PWVbMV0sZVsxXT1lWzNdLGVbM109dCx0PWVbMl0sZVsyXT1lWzZdLGVbNl09dCx0PWVbNV0sZVs1XT1lWzddLGVbN109dCx0aGlzfWdldE5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCh0KS5pbnZlcnQoKS50cmFuc3Bvc2UoKX10cmFuc3Bvc2VJbnRvQXJyYXkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0aGlzfXNldFV2VHJhbnNmb3JtKHQsZSxuLHIsaSxvLHMpe2NvbnN0IGE9TWF0aC5jb3MoaSksdT1NYXRoLnNpbihpKTtyZXR1cm4gdGhpcy5zZXQobiphLG4qdSwtbiooYSpvK3Uqcykrbyt0LC1yKnUsciphLC1yKigtdSpvK2EqcykrcytlLDAsMCwxKSx0aGlzfXNjYWxlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkobmgubWFrZVNjYWxlKHQsZSkpLHRoaXN9cm90YXRlKHQpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KG5oLm1ha2VSb3RhdGlvbigtdCkpLHRoaXN9dHJhbnNsYXRlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkobmgubWFrZVRyYW5zbGF0aW9uKHQsZSkpLHRoaXN9bWFrZVRyYW5zbGF0aW9uKHQsZSl7cmV0dXJuIHQuaXNWZWN0b3IyP3RoaXMuc2V0KDEsMCx0LngsMCwxLHQueSwwLDAsMSk6dGhpcy5zZXQoMSwwLHQsMCwxLGUsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtbiwwLG4sZSwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUpe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLGUsMCwwLDAsMSksdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHQ9MDt0PDk7dCsrKWlmKGVbdF0hPT1uW3RdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0fWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9fWNvbnN0IG5oPW5ldyBlaDtmdW5jdGlvbiByaCh0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIix0KX1jb25zdCBpaD0obmV3IGVoKS5zZXQoLjgyMjQ2MjEsLjE3NzUzOCwwLC4wMzMxOTQxLC45NjY4MDU4LDAsLjAxNzA4MjcsLjA3MjM5NzQsLjkxMDUxOTkpLG9oPShuZXcgZWgpLnNldCgxLjIyNDk0MDEsLS4yMjQ5NDA0LDAsLS4wNDIwNTY5LDEuMDQyMDU3MSwwLC0uMDE5NjM3NiwtLjA3ODYzNjEsMS4wOTgyNzM1KSxzaD17W3FsXTp7dHJhbnNmZXI6WWwscHJpbWFyaWVzOldsLGx1bWluYW5jZUNvZWZmaWNpZW50czpbLjIxMjYsLjcxNTIsLjA3MjJdLHRvUmVmZXJlbmNlOnQ9PnQsZnJvbVJlZmVyZW5jZTp0PT50fSxbVWxdOnt0cmFuc2ZlcjpYbCxwcmltYXJpZXM6V2wsbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjEyNiwuNzE1MiwuMDcyMl0sdG9SZWZlcmVuY2U6dD0+dC5jb252ZXJ0U1JHQlRvTGluZWFyKCksZnJvbVJlZmVyZW5jZTp0PT50LmNvbnZlcnRMaW5lYXJUb1NSR0IoKX0sW0dsXTp7dHJhbnNmZXI6WWwscHJpbWFyaWVzOiJwMyIsbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjI4OSwuNjkxNywuMDc5M10sdG9SZWZlcmVuY2U6dD0+dC5hcHBseU1hdHJpeDMob2gpLGZyb21SZWZlcmVuY2U6dD0+dC5hcHBseU1hdHJpeDMoaWgpfSxbVmxdOnt0cmFuc2ZlcjpYbCxwcmltYXJpZXM6InAzIixsdW1pbmFuY2VDb2VmZmljaWVudHM6Wy4yMjg5LC42OTE3LC4wNzkzXSx0b1JlZmVyZW5jZTp0PT50LmNvbnZlcnRTUkdCVG9MaW5lYXIoKS5hcHBseU1hdHJpeDMob2gpLGZyb21SZWZlcmVuY2U6dD0+dC5hcHBseU1hdHJpeDMoaWgpLmNvbnZlcnRMaW5lYXJUb1NSR0IoKX19LGFoPW5ldyBTZXQoW3FsLEdsXSksdWg9e2VuYWJsZWQ6ITAsX3dvcmtpbmdDb2xvclNwYWNlOnFsLGdldCB3b3JraW5nQ29sb3JTcGFjZSgpe3JldHVybiB0aGlzLl93b3JraW5nQ29sb3JTcGFjZX0sc2V0IHdvcmtpbmdDb2xvclNwYWNlKHQpe2lmKCFhaC5oYXModCkpdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB3b3JraW5nIGNvbG9yIHNwYWNlLCAiJHt0fSIuYCk7dGhpcy5fd29ya2luZ0NvbG9yU3BhY2U9dH0sY29udmVydDpmdW5jdGlvbih0LGUsbil7aWYoITE9PT10aGlzLmVuYWJsZWR8fGU9PT1ufHwhZXx8IW4pcmV0dXJuIHQ7Y29uc3Qgcj1zaFtlXS50b1JlZmVyZW5jZTtyZXR1cm4gc2hbbl0uZnJvbVJlZmVyZW5jZShyKHQpKX0sZnJvbVdvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29udmVydCh0LHRoaXMuX3dvcmtpbmdDb2xvclNwYWNlLGUpfSx0b1dvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29udmVydCh0LGUsdGhpcy5fd29ya2luZ0NvbG9yU3BhY2UpfSxnZXRQcmltYXJpZXM6ZnVuY3Rpb24odCl7cmV0dXJuIHNoW3RdLnByaW1hcmllc30sZ2V0VHJhbnNmZXI6ZnVuY3Rpb24odCl7cmV0dXJuIiI9PT10P1lsOnNoW3RdLnRyYW5zZmVyfSxnZXRMdW1pbmFuY2VDb2VmZmljaWVudHM6ZnVuY3Rpb24odCxlPXRoaXMuX3dvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gdC5mcm9tQXJyYXkoc2hbZV0ubHVtaW5hbmNlQ29lZmZpY2llbnRzKX19O2Z1bmN0aW9uIGNoKHQpe3JldHVybiB0PC4wNDA0NT8uMDc3Mzk5MzgwOCp0Ok1hdGgucG93KC45NDc4NjcyOTg2KnQrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBsaCh0KXtyZXR1cm4gdDwuMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsLjQxNjY2KS0uMDU1fWxldCBoaDtjbGFzcyBmaHtzdGF0aWMgZ2V0RGF0YVVSTCh0KXtpZigvXmRhdGE6L2kudGVzdCh0LnNyYyl8fCJ1bmRlZmluZWQiPT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQpcmV0dXJuIHQuc3JjO2xldCBlO2lmKHQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCllPXQ7ZWxzZXt2b2lkIDA9PT1oaCYmKGhoPXJoKCJjYW52YXMiKSksaGgud2lkdGg9dC53aWR0aCxoaC5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgbj1oaC5nZXRDb250ZXh0KCIyZCIpO3QgaW5zdGFuY2VvZiBJbWFnZURhdGE/bi5wdXRJbWFnZURhdGEodCwwLDApOm4uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGU9aGh9cmV0dXJuIGUud2lkdGg+MjA0OHx8ZS5oZWlnaHQ+MjA0OD9lLnRvRGF0YVVSTCgiaW1hZ2UvanBlZyIsLjYpOmUudG9EYXRhVVJMKCJpbWFnZS9wbmciKX1zdGF0aWMgc1JHQlRvTGluZWFyKHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTEltYWdlRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZUJpdG1hcCYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwKXtjb25zdCBlPXJoKCJjYW52YXMiKTtlLndpZHRoPXQud2lkdGgsZS5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgbj1lLmdldENvbnRleHQoIjJkIik7bi5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCk7Y29uc3Qgcj1uLmdldEltYWdlRGF0YSgwLDAsdC53aWR0aCx0LmhlaWdodCksaT1yLmRhdGE7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0KyspaVt0XT0yNTUqY2goaVt0XS8yNTUpO3JldHVybiBuLnB1dEltYWdlRGF0YShyLDAsMCksZX1pZih0LmRhdGEpe2NvbnN0IGU9dC5kYXRhLnNsaWNlKDApO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/ZVt0XT1NYXRoLmZsb29yKDI1NSpjaChlW3RdLzI1NSkpOmVbdF09Y2goZVt0XSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19cmV0dXJuIHR9fWxldCBwaD0wO2NsYXNzIGRoe2NvbnN0cnVjdG9yKHQ9bnVsbCl7dGhpcy5pc1NvdXJjZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpwaCsrfSksdGhpcy51dWlkPUpsKCksdGhpcy5kYXRhPXQsdGhpcy5kYXRhUmVhZHk9ITAsdGhpcy52ZXJzaW9uPTB9c2V0IG5lZWRzVXBkYXRlKHQpeyEwPT09dCYmdGhpcy52ZXJzaW9uKyt9dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0O2lmKCFlJiZ2b2lkIDAhPT10LmltYWdlc1t0aGlzLnV1aWRdKXJldHVybiB0LmltYWdlc1t0aGlzLnV1aWRdO2NvbnN0IG49e3V1aWQ6dGhpcy51dWlkLHVybDoiIn0scj10aGlzLmRhdGE7aWYobnVsbCE9PXIpe2xldCB0O2lmKEFycmF5LmlzQXJyYXkocikpe3Q9W107Zm9yKGxldCBlPTAsbj1yLmxlbmd0aDtlPG47ZSsrKXJbZV0uaXNEYXRhVGV4dHVyZT90LnB1c2goZ2gocltlXS5pbWFnZSkpOnQucHVzaChnaChyW2VdKSl9ZWxzZSB0PWdoKHIpO24udXJsPXR9cmV0dXJuIGV8fCh0LmltYWdlc1t0aGlzLnV1aWRdPW4pLG59fWZ1bmN0aW9uIGdoKHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTEltYWdlRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZUJpdG1hcCYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwP2ZoLmdldERhdGFVUkwodCk6dC5kYXRhP3tkYXRhOkFycmF5LmZyb20odC5kYXRhKSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodCx0eXBlOnQuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTp7fX1sZXQgeWg9MDtjbGFzcyBtaCBleHRlbmRzIFpse2NvbnN0cnVjdG9yKHQ9bWguREVGQVVMVF9JTUFHRSxlPW1oLkRFRkFVTFRfTUFQUElORyxuPWpsLHI9amwsaT0xMDA2LG89MTAwOCxzPTEwMjMsYT0xMDA5LHU9bWguREVGQVVMVF9BTklTT1RST1BZLGM9IiIpe3N1cGVyKCksdGhpcy5pc1RleHR1cmU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6eWgrK30pLHRoaXMudXVpZD1KbCgpLHRoaXMubmFtZT0iIix0aGlzLnNvdXJjZT1uZXcgZGgodCksdGhpcy5taXBtYXBzPVtdLHRoaXMubWFwcGluZz1lLHRoaXMuY2hhbm5lbD0wLHRoaXMud3JhcFM9bix0aGlzLndyYXBUPXIsdGhpcy5tYWdGaWx0ZXI9aSx0aGlzLm1pbkZpbHRlcj1vLHRoaXMuYW5pc290cm9weT11LHRoaXMuZm9ybWF0PXMsdGhpcy5pbnRlcm5hbEZvcm1hdD1udWxsLHRoaXMudHlwZT1hLHRoaXMub2Zmc2V0PW5ldyB0aCgwLDApLHRoaXMucmVwZWF0PW5ldyB0aCgxLDEpLHRoaXMuY2VudGVyPW5ldyB0aCgwLDApLHRoaXMucm90YXRpb249MCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITAsdGhpcy5tYXRyaXg9bmV3IGVoLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5jb2xvclNwYWNlPWMsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLm9uVXBkYXRlPW51bGwsdGhpcy5pc1JlbmRlclRhcmdldFRleHR1cmU9ITEsdGhpcy5wbXJlbVZlcnNpb249MH1nZXQgaW1hZ2UoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZGF0YX1zZXQgaW1hZ2UodD1udWxsKXt0aGlzLnNvdXJjZS5kYXRhPXR9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0odGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5uYW1lPXQubmFtZSx0aGlzLnNvdXJjZT10LnNvdXJjZSx0aGlzLm1pcG1hcHM9dC5taXBtYXBzLnNsaWNlKDApLHRoaXMubWFwcGluZz10Lm1hcHBpbmcsdGhpcy5jaGFubmVsPXQuY2hhbm5lbCx0aGlzLndyYXBTPXQud3JhcFMsdGhpcy53cmFwVD10LndyYXBULHRoaXMubWFnRmlsdGVyPXQubWFnRmlsdGVyLHRoaXMubWluRmlsdGVyPXQubWluRmlsdGVyLHRoaXMuYW5pc290cm9weT10LmFuaXNvdHJvcHksdGhpcy5mb3JtYXQ9dC5mb3JtYXQsdGhpcy5pbnRlcm5hbEZvcm1hdD10LmludGVybmFsRm9ybWF0LHRoaXMudHlwZT10LnR5cGUsdGhpcy5vZmZzZXQuY29weSh0Lm9mZnNldCksdGhpcy5yZXBlYXQuY29weSh0LnJlcGVhdCksdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yb3RhdGlvbj10LnJvdGF0aW9uLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5nZW5lcmF0ZU1pcG1hcHM9dC5nZW5lcmF0ZU1pcG1hcHMsdGhpcy5wcmVtdWx0aXBseUFscGhhPXQucHJlbXVsdGlwbHlBbHBoYSx0aGlzLmZsaXBZPXQuZmxpcFksdGhpcy51bnBhY2tBbGlnbm1lbnQ9dC51bnBhY2tBbGlnbm1lbnQsdGhpcy5jb2xvclNwYWNlPXQuY29sb3JTcGFjZSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc310b0pTT04odCl7Y29uc3QgZT12b2lkIDA9PT10fHwic3RyaW5nIj09dHlwZW9mIHQ7aWYoIWUmJnZvaWQgMCE9PXQudGV4dHVyZXNbdGhpcy51dWlkXSlyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcsY2hhbm5lbDp0aGlzLmNoYW5uZWwscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCxpbnRlcm5hbEZvcm1hdDp0aGlzLmludGVybmFsRm9ybWF0LHR5cGU6dGhpcy50eXBlLGNvbG9yU3BhY2U6dGhpcy5jb2xvclNwYWNlLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09biksbn1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKDMwMCE9PXRoaXMubWFwcGluZylyZXR1cm4gdDtpZih0LmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksdC54PDB8fHQueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFlMzp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVhaztjYXNlIGpsOnQueD10Lng8MD8wOjE7YnJlYWs7Y2FzZSAxMDAyOjE9PT1NYXRoLmFicyhNYXRoLmZsb29yKHQueCklMik/dC54PU1hdGguY2VpbCh0LngpLXQueDp0Lng9dC54LU1hdGguZmxvb3IodC54KX1pZih0Lnk8MHx8dC55PjEpc3dpdGNoKHRoaXMud3JhcFQpe2Nhc2UgMWUzOnQueT10LnktTWF0aC5mbG9vcih0LnkpO2JyZWFrO2Nhc2Ugamw6dC55PXQueTwwPzA6MTticmVhaztjYXNlIDEwMDI6MT09PU1hdGguYWJzKE1hdGguZmxvb3IodC55KSUyKT90Lnk9TWF0aC5jZWlsKHQueSktdC55OnQueT10LnktTWF0aC5mbG9vcih0LnkpfXJldHVybiB0aGlzLmZsaXBZJiYodC55PTEtdC55KSx0fXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJih0aGlzLnZlcnNpb24rKyx0aGlzLnNvdXJjZS5uZWVkc1VwZGF0ZT0hMCl9c2V0IG5lZWRzUE1SRU1VcGRhdGUodCl7ITA9PT10JiZ0aGlzLnBtcmVtVmVyc2lvbisrfX1taC5ERUZBVUxUX0lNQUdFPW51bGwsbWguREVGQVVMVF9NQVBQSU5HPTMwMCxtaC5ERUZBVUxUX0FOSVNPVFJPUFk9MTtjbGFzcyB2aHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxyPTEpe3ZoLnByb3RvdHlwZS5pc1ZlY3RvcjQ9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpcy53PXJ9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMuen1zZXQgd2lkdGgodCl7dGhpcy56PXR9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnd9c2V0IGhlaWdodCh0KXt0aGlzLnc9dH1zZXQodCxlLG4scil7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1yLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzLnc9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldFcodCl7cmV0dXJuIHRoaXMudz10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7Y2FzZSAyOnRoaXMuej1lO2JyZWFrO2Nhc2UgMzp0aGlzLnc9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7Y2FzZSAzOnJldHVybiB0aGlzLnc7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnosdGhpcy53KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzLnc9dm9pZCAwIT09dC53P3QudzoxLHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzLncrPXQudyx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpcy53Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzLnc9dC53K2Uudyx0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzLncrPXQudyplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzLnctPXQudyx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpcy53LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzLnc9dC53LWUudyx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzLncqPXQudyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzLncqPXQsdGhpc31hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnosaT10aGlzLncsbz10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9b1swXSplK29bNF0qbitvWzhdKnIrb1sxMl0qaSx0aGlzLnk9b1sxXSplK29bNV0qbitvWzldKnIrb1sxM10qaSx0aGlzLno9b1syXSplK29bNl0qbitvWzEwXSpyK29bMTRdKmksdGhpcy53PW9bM10qZStvWzddKm4rb1sxMV0qcitvWzE1XSppLHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24odCl7dGhpcy53PTIqTWF0aC5hY29zKHQudyk7Y29uc3QgZT1NYXRoLnNxcnQoMS10LncqdC53KTtyZXR1cm4gZTwxZS00Pyh0aGlzLng9MSx0aGlzLnk9MCx0aGlzLno9MCk6KHRoaXMueD10LngvZSx0aGlzLnk9dC55L2UsdGhpcy56PXQuei9lKSx0aGlzfXNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeCh0KXtsZXQgZSxuLHIsaTtjb25zdCBvPS4wMSxzPS4xLGE9dC5lbGVtZW50cyx1PWFbMF0sYz1hWzRdLGw9YVs4XSxoPWFbMV0sZj1hWzVdLHA9YVs5XSxkPWFbMl0sZz1hWzZdLHk9YVsxMF07aWYoTWF0aC5hYnMoYy1oKTxvJiZNYXRoLmFicyhsLWQpPG8mJk1hdGguYWJzKHAtZyk8byl7aWYoTWF0aC5hYnMoYytoKTxzJiZNYXRoLmFicyhsK2QpPHMmJk1hdGguYWJzKHArZyk8cyYmTWF0aC5hYnModStmK3ktMyk8cylyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztlPU1hdGguUEk7Y29uc3QgdD0odSsxKS8yLGE9KGYrMSkvMixtPSh5KzEpLzIsdj0oYytoKS80LF89KGwrZCkvNCx4PShwK2cpLzQ7cmV0dXJuIHQ+YSYmdD5tP3Q8bz8obj0wLHI9LjcwNzEwNjc4MSxpPS43MDcxMDY3ODEpOihuPU1hdGguc3FydCh0KSxyPXYvbixpPV8vbik6YT5tP2E8bz8obj0uNzA3MTA2NzgxLHI9MCxpPS43MDcxMDY3ODEpOihyPU1hdGguc3FydChhKSxuPXYvcixpPXgvcik6bTxvPyhuPS43MDcxMDY3ODEscj0uNzA3MTA2NzgxLGk9MCk6KGk9TWF0aC5zcXJ0KG0pLG49Xy9pLHI9eC9pKSx0aGlzLnNldChuLHIsaSxlKSx0aGlzfWxldCBtPU1hdGguc3FydCgoZy1wKSooZy1wKSsobC1kKSoobC1kKSsoaC1jKSooaC1jKSk7cmV0dXJuIE1hdGguYWJzKG0pPC4wMDEmJihtPTEpLHRoaXMueD0oZy1wKS9tLHRoaXMueT0obC1kKS9tLHRoaXMuej0oaC1jKS9tLHRoaXMudz1NYXRoLmFjb3MoKHUrZit5LTEpLzIpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpcy53PWVbMTVdLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5taW4odGhpcy53LHQudyksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1heCh0aGlzLncsdC53KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LnosTWF0aC5taW4oZS56LHRoaXMueikpLHRoaXMudz1NYXRoLm1heCh0LncsTWF0aC5taW4oZS53LHRoaXMudykpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy56KSksdGhpcy53PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLncpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzLnc9TWF0aC5yb3VuZCh0aGlzLncpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpcy53PU1hdGgudHJ1bmModGhpcy53KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzLnc9LXRoaXMudyx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0LnordGhpcy53KnQud31sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXMudys9KHQudy10aGlzLncpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXMudz10LncrKGUudy10LncpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnomJnQudz09PXRoaXMud31mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpcy53PXRbZSszXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdFtlKzNdPXRoaXMudyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpcy53PXQuZ2V0VyhlKSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzLno9TWF0aC5yYW5kb20oKSx0aGlzLnc9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56LHlpZWxkIHRoaXMud319Y2xhc3MgX2h7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscj0xKXt0aGlzLmlzUXVhdGVybmlvbj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PXJ9c3RhdGljIHNsZXJwRmxhdCh0LGUsbixyLGksbyxzKXtsZXQgYT1uW3IrMF0sdT1uW3IrMV0sYz1uW3IrMl0sbD1uW3IrM107Y29uc3QgaD1pW28rMF0sZj1pW28rMV0scD1pW28rMl0sZD1pW28rM107aWYoMD09PXMpcmV0dXJuIHRbZSswXT1hLHRbZSsxXT11LHRbZSsyXT1jLHZvaWQodFtlKzNdPWwpO2lmKDE9PT1zKXJldHVybiB0W2UrMF09aCx0W2UrMV09Zix0W2UrMl09cCx2b2lkKHRbZSszXT1kKTtpZihsIT09ZHx8YSE9PWh8fHUhPT1mfHxjIT09cCl7bGV0IHQ9MS1zO2NvbnN0IGU9YSpoK3UqZitjKnArbCpkLG49ZT49MD8xOi0xLHI9MS1lKmU7aWYocj5OdW1iZXIuRVBTSUxPTil7Y29uc3QgaT1NYXRoLnNxcnQociksbz1NYXRoLmF0YW4yKGksZSpuKTt0PU1hdGguc2luKHQqbykvaSxzPU1hdGguc2luKHMqbykvaX1jb25zdCBpPXMqbjtpZihhPWEqdCtoKmksdT11KnQrZippLGM9Yyp0K3AqaSxsPWwqdCtkKmksdD09PTEtcyl7Y29uc3QgdD0xL01hdGguc3FydChhKmErdSp1K2MqYytsKmwpO2EqPXQsdSo9dCxjKj10LGwqPXR9fXRbZV09YSx0W2UrMV09dSx0W2UrMl09Yyx0W2UrM109bH1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodCxlLG4scixpLG8pe2NvbnN0IHM9bltyXSxhPW5bcisxXSx1PW5bcisyXSxjPW5bciszXSxsPWlbb10saD1pW28rMV0sZj1pW28rMl0scD1pW28rM107cmV0dXJuIHRbZV09cypwK2MqbCthKmYtdSpoLHRbZSsxXT1hKnArYypoK3UqbC1zKmYsdFtlKzJdPXUqcCtjKmYrcypoLWEqbCx0W2UrM109YypwLXMqbC1hKmgtdSpmLHR9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyh0KXt0aGlzLl93PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixyKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1yLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC54LHRoaXMuX3k9dC55LHRoaXMuX3o9dC56LHRoaXMuX3c9dC53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcih0LGU9ITApe2NvbnN0IG49dC5feCxyPXQuX3ksaT10Ll96LG89dC5fb3JkZXIscz1NYXRoLmNvcyxhPU1hdGguc2luLHU9cyhuLzIpLGM9cyhyLzIpLGw9cyhpLzIpLGg9YShuLzIpLGY9YShyLzIpLHA9YShpLzIpO3N3aXRjaChvKXtjYXNlIlhZWiI6dGhpcy5feD1oKmMqbCt1KmYqcCx0aGlzLl95PXUqZipsLWgqYypwLHRoaXMuX3o9dSpjKnAraCpmKmwsdGhpcy5fdz11KmMqbC1oKmYqcDticmVhaztjYXNlIllYWiI6dGhpcy5feD1oKmMqbCt1KmYqcCx0aGlzLl95PXUqZipsLWgqYypwLHRoaXMuX3o9dSpjKnAtaCpmKmwsdGhpcy5fdz11KmMqbCtoKmYqcDticmVhaztjYXNlIlpYWSI6dGhpcy5feD1oKmMqbC11KmYqcCx0aGlzLl95PXUqZipsK2gqYypwLHRoaXMuX3o9dSpjKnAraCpmKmwsdGhpcy5fdz11KmMqbC1oKmYqcDticmVhaztjYXNlIlpZWCI6dGhpcy5feD1oKmMqbC11KmYqcCx0aGlzLl95PXUqZipsK2gqYypwLHRoaXMuX3o9dSpjKnAtaCpmKmwsdGhpcy5fdz11KmMqbCtoKmYqcDticmVhaztjYXNlIllaWCI6dGhpcy5feD1oKmMqbCt1KmYqcCx0aGlzLl95PXUqZipsK2gqYypwLHRoaXMuX3o9dSpjKnAtaCpmKmwsdGhpcy5fdz11KmMqbC1oKmYqcDticmVhaztjYXNlIlhaWSI6dGhpcy5feD1oKmMqbC11KmYqcCx0aGlzLl95PXUqZipsLWgqYypwLHRoaXMuX3o9dSpjKnAraCpmKmwsdGhpcy5fdz11KmMqbCtoKmYqcH1yZXR1cm4hMD09PWUmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21BeGlzQW5nbGUodCxlKXtjb25zdCBuPWUvMixyPU1hdGguc2luKG4pO3JldHVybiB0aGlzLl94PXQueCpyLHRoaXMuX3k9dC55KnIsdGhpcy5fej10Lnoqcix0aGlzLl93PU1hdGguY29zKG4pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KXtjb25zdCBlPXQuZWxlbWVudHMsbj1lWzBdLHI9ZVs0XSxpPWVbOF0sbz1lWzFdLHM9ZVs1XSxhPWVbOV0sdT1lWzJdLGM9ZVs2XSxsPWVbMTBdLGg9bitzK2w7aWYoaD4wKXtjb25zdCB0PS41L01hdGguc3FydChoKzEpO3RoaXMuX3c9LjI1L3QsdGhpcy5feD0oYy1hKSp0LHRoaXMuX3k9KGktdSkqdCx0aGlzLl96PShvLXIpKnR9ZWxzZSBpZihuPnMmJm4+bCl7Y29uc3QgdD0yKk1hdGguc3FydCgxK24tcy1sKTt0aGlzLl93PShjLWEpL3QsdGhpcy5feD0uMjUqdCx0aGlzLl95PShyK28pL3QsdGhpcy5fej0oaSt1KS90fWVsc2UgaWYocz5sKXtjb25zdCB0PTIqTWF0aC5zcXJ0KDErcy1uLWwpO3RoaXMuX3c9KGktdSkvdCx0aGlzLl94PShyK28pL3QsdGhpcy5feT0uMjUqdCx0aGlzLl96PShhK2MpL3R9ZWxzZXtjb25zdCB0PTIqTWF0aC5zcXJ0KDErbC1uLXMpO3RoaXMuX3c9KG8tcikvdCx0aGlzLl94PShpK3UpL3QsdGhpcy5feT0oYStjKS90LHRoaXMuX3o9LjI1KnR9cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Vbml0VmVjdG9ycyh0LGUpe2xldCBuPXQuZG90KGUpKzE7cmV0dXJuIG48TnVtYmVyLkVQU0lMT04/KG49MCxNYXRoLmFicyh0LngpPk1hdGguYWJzKHQueik/KHRoaXMuX3g9LXQueSx0aGlzLl95PXQueCx0aGlzLl96PTAsdGhpcy5fdz1uKToodGhpcy5feD0wLHRoaXMuX3k9LXQueix0aGlzLl96PXQueSx0aGlzLl93PW4pKToodGhpcy5feD10LnkqZS56LXQueiplLnksdGhpcy5feT10LnoqZS54LXQueCplLnosdGhpcy5fej10LngqZS55LXQueSplLngsdGhpcy5fdz1uKSx0aGlzLm5vcm1hbGl6ZSgpfWFuZ2xlVG8odCl7cmV0dXJuIDIqTWF0aC5hY29zKE1hdGguYWJzKFFsKHRoaXMuZG90KHQpLC0xLDEpKSl9cm90YXRlVG93YXJkcyh0LGUpe2NvbnN0IG49dGhpcy5hbmdsZVRvKHQpO2lmKDA9PT1uKXJldHVybiB0aGlzO2NvbnN0IHI9TWF0aC5taW4oMSxlL24pO3JldHVybiB0aGlzLnNsZXJwKHQsciksdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgwLDAsMCwxKX1pbnZlcnQoKXtyZXR1cm4gdGhpcy5jb25qdWdhdGUoKX1jb25qdWdhdGUoKXtyZXR1cm4gdGhpcy5feCo9LTEsdGhpcy5feSo9LTEsdGhpcy5feio9LTEsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLl94KnQuX3grdGhpcy5feSp0Ll95K3RoaXMuX3oqdC5feit0aGlzLl93KnQuX3d9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93KX1ub3JtYWxpemUoKXtsZXQgdD10aGlzLmxlbmd0aCgpO3JldHVybiAwPT09dD8odGhpcy5feD0wLHRoaXMuX3k9MCx0aGlzLl96PTAsdGhpcy5fdz0xKToodD0xL3QsdGhpcy5feD10aGlzLl94KnQsdGhpcy5feT10aGlzLl95KnQsdGhpcy5fej10aGlzLl96KnQsdGhpcy5fdz10aGlzLl93KnQpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHQsdGhpcyl9bXVsdGlwbHlRdWF0ZXJuaW9ucyh0LGUpe2NvbnN0IG49dC5feCxyPXQuX3ksaT10Ll96LG89dC5fdyxzPWUuX3gsYT1lLl95LHU9ZS5feixjPWUuX3c7cmV0dXJuIHRoaXMuX3g9bipjK28qcytyKnUtaSphLHRoaXMuX3k9cipjK28qYStpKnMtbip1LHRoaXMuX3o9aSpjK28qdStuKmEtcipzLHRoaXMuX3c9bypjLW4qcy1yKmEtaSp1LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwKHQsZSl7aWYoMD09PWUpcmV0dXJuIHRoaXM7aWYoMT09PWUpcmV0dXJuIHRoaXMuY29weSh0KTtjb25zdCBuPXRoaXMuX3gscj10aGlzLl95LGk9dGhpcy5feixvPXRoaXMuX3c7bGV0IHM9byp0Ll93K24qdC5feCtyKnQuX3kraSp0Ll96O2lmKHM8MD8odGhpcy5fdz0tdC5fdyx0aGlzLl94PS10Ll94LHRoaXMuX3k9LXQuX3ksdGhpcy5fej0tdC5feixzPS1zKTp0aGlzLmNvcHkodCkscz49MSlyZXR1cm4gdGhpcy5fdz1vLHRoaXMuX3g9bix0aGlzLl95PXIsdGhpcy5fej1pLHRoaXM7Y29uc3QgYT0xLXMqcztpZihhPD1OdW1iZXIuRVBTSUxPTil7Y29uc3QgdD0xLWU7cmV0dXJuIHRoaXMuX3c9dCpvK2UqdGhpcy5fdyx0aGlzLl94PXQqbitlKnRoaXMuX3gsdGhpcy5feT10KnIrZSp0aGlzLl95LHRoaXMuX3o9dCppK2UqdGhpcy5feix0aGlzLm5vcm1hbGl6ZSgpLHRoaXN9Y29uc3QgdT1NYXRoLnNxcnQoYSksYz1NYXRoLmF0YW4yKHUscyksbD1NYXRoLnNpbigoMS1lKSpjKS91LGg9TWF0aC5zaW4oZSpjKS91O3JldHVybiB0aGlzLl93PW8qbCt0aGlzLl93KmgsdGhpcy5feD1uKmwrdGhpcy5feCpoLHRoaXMuX3k9cipsK3RoaXMuX3kqaCx0aGlzLl96PWkqbCt0aGlzLl96KmgsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2xlcnBRdWF0ZXJuaW9ucyh0LGUsbil7cmV0dXJuIHRoaXMuY29weSh0KS5zbGVycChlLG4pfXJhbmRvbSgpe2NvbnN0IHQ9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksZT0yKk1hdGguUEkqTWF0aC5yYW5kb20oKSxuPU1hdGgucmFuZG9tKCkscj1NYXRoLnNxcnQoMS1uKSxpPU1hdGguc3FydChuKTtyZXR1cm4gdGhpcy5zZXQocipNYXRoLnNpbih0KSxyKk1hdGguY29zKHQpLGkqTWF0aC5zaW4oZSksaSpNYXRoLmNvcyhlKSl9ZXF1YWxzKHQpe3JldHVybiB0Ll94PT09dGhpcy5feCYmdC5feT09PXRoaXMuX3kmJnQuX3o9PT10aGlzLl96JiZ0Ll93PT09dGhpcy5fd31mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLl94PXRbZV0sdGhpcy5feT10W2UrMV0sdGhpcy5fej10W2UrMl0sdGhpcy5fdz10W2UrM10sdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5feCx0W2UrMV09dGhpcy5feSx0W2UrMl09dGhpcy5feix0W2UrM109dGhpcy5fdyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5feD10LmdldFgoZSksdGhpcy5feT10LmdldFkoZSksdGhpcy5fej10LmdldFooZSksdGhpcy5fdz10LmdldFcoZSksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMudG9BcnJheSgpfV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fd319Y2xhc3MgeGh7Y29uc3RydWN0b3IodD0wLGU9MCxuPTApe3hoLnByb3RvdHlwZS5pc1ZlY3RvcjM9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW59c2V0KHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49dGhpcy56KSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzfW11bHRpcGx5VmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54KmUueCx0aGlzLnk9dC55KmUueSx0aGlzLno9dC56KmUueix0aGlzfWFwcGx5RXVsZXIodCl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKGJoLnNldEZyb21FdWxlcih0KSl9YXBwbHlBeGlzQW5nbGUodCxlKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oYmguc2V0RnJvbUF4aXNBbmdsZSh0LGUpKX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnosaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbM10qbitpWzZdKnIsdGhpcy55PWlbMV0qZStpWzRdKm4raVs3XSpyLHRoaXMuej1pWzJdKmUraVs1XSpuK2lbOF0qcix0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4Myh0KS5ub3JtYWxpemUoKX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnosaT10LmVsZW1lbnRzLG89MS8oaVszXSplK2lbN10qbitpWzExXSpyK2lbMTVdKTtyZXR1cm4gdGhpcy54PShpWzBdKmUraVs0XSpuK2lbOF0qcitpWzEyXSkqbyx0aGlzLnk9KGlbMV0qZStpWzVdKm4raVs5XSpyK2lbMTNdKSpvLHRoaXMuej0oaVsyXSplK2lbNl0qbitpWzEwXSpyK2lbMTRdKSpvLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHI9dGhpcy56LGk9dC54LG89dC55LHM9dC56LGE9dC53LHU9MioobypyLXMqbiksYz0yKihzKmUtaSpyKSxsPTIqKGkqbi1vKmUpO3JldHVybiB0aGlzLng9ZSthKnUrbypsLXMqYyx0aGlzLnk9bithKmMrcyp1LWkqbCx0aGlzLno9cithKmwraSpjLW8qdSx0aGlzfXByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4KX11bnByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKX10cmFuc2Zvcm1EaXJlY3Rpb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscj10aGlzLnosaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbNF0qbitpWzhdKnIsdGhpcy55PWlbMV0qZStpWzVdKm4raVs5XSpyLHRoaXMuej1pWzJdKmUraVs2XSpuK2lbMTBdKnIsdGhpcy5ub3JtYWxpemUoKX1kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodC56LE1hdGgubWluKGUueix0aGlzLnopKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueikpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KHQsTWF0aC5taW4oZSxuKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgbj10Lngscj10LnksaT10Lnosbz1lLngscz1lLnksYT1lLno7cmV0dXJuIHRoaXMueD1yKmEtaSpzLHRoaXMueT1pKm8tbiphLHRoaXMuej1uKnMtcipvLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKDA9PT1lKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgbj10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIobil9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIHdoLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKHdoKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1Yih3aC5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKDA9PT1lKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoUWwobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnkscj10aGlzLnotdC56O3JldHVybiBlKmUrbipuK3Iqcn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KStNYXRoLmFicyh0aGlzLnotdC56KX1zZXRGcm9tU3BoZXJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHModC5yYWRpdXMsdC5waGksdC50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LGUsbil7Y29uc3Qgcj1NYXRoLnNpbihlKSp0O3JldHVybiB0aGlzLng9cipNYXRoLnNpbihuKSx0aGlzLnk9TWF0aC5jb3MoZSkqdCx0aGlzLno9cipNYXRoLmNvcyhuKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModC5yYWRpdXMsdC50aGV0YSx0LnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LGUsbil7cmV0dXJuIHRoaXMueD10Kk1hdGguc2luKGUpLHRoaXMueT1uLHRoaXMuej10Kk1hdGguY29zKGUpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUodCl7Y29uc3QgZT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxuPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLHI9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXMuej1yLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLDQqZSl9c2V0RnJvbU1hdHJpeDNDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cywzKmUpfXNldEZyb21FdWxlcih0KXtyZXR1cm4gdGhpcy54PXQuX3gsdGhpcy55PXQuX3ksdGhpcy56PXQuX3osdGhpc31zZXRGcm9tQ29sb3IodCl7cmV0dXJuIHRoaXMueD10LnIsdGhpcy55PXQuZyx0aGlzLno9dC5iLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9cmFuZG9tRGlyZWN0aW9uKCl7Y29uc3QgdD1NYXRoLnJhbmRvbSgpKk1hdGguUEkqMixlPTIqTWF0aC5yYW5kb20oKS0xLG49TWF0aC5zcXJ0KDEtZSplKTtyZXR1cm4gdGhpcy54PW4qTWF0aC5jb3ModCksdGhpcy55PWUsdGhpcy56PW4qTWF0aC5zaW4odCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMuen19Y29uc3Qgd2g9bmV3IHhoLGJoPW5ldyBfaDtjbGFzcyBEaHtjb25zdHJ1Y3Rvcih0PW5ldyB4aCgxLzAsMS8wLDEvMCksZT1uZXcgeGgoLTEvMCwtMS8wLC0xLzApKXt0aGlzLmlzQm94Mz0hMCx0aGlzLm1pbj10LHRoaXMubWF4PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzfXNldEZyb21BcnJheSh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrPTMpdGhpcy5leHBhbmRCeVBvaW50KENoLmZyb21BcnJheSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10LmNvdW50O2U8bjtlKyspdGhpcy5leHBhbmRCeVBvaW50KENoLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSk7cmV0dXJuIHRoaXN9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQodFtlXSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUodCxlKXtjb25zdCBuPUNoLmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLnN1YihuKSx0aGlzLm1heC5jb3B5KHQpLmFkZChuKSx0aGlzfXNldEZyb21PYmplY3QodCxlPSExKXtyZXR1cm4gdGhpcy5tYWtlRW1wdHkoKSx0aGlzLmV4cGFuZEJ5T2JqZWN0KHQsZSl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PXRoaXMubWluLno9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS0xLzAsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fHx0aGlzLm1heC56PHRoaXMubWluLnp9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9ZXhwYW5kQnlQb2ludCh0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQpLHRoaXMubWF4Lm1heCh0KSx0aGlzfWV4cGFuZEJ5VmVjdG9yKHQpe3JldHVybiB0aGlzLm1pbi5zdWIodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXhwYW5kQnlTY2FsYXIodCl7cmV0dXJuIHRoaXMubWluLmFkZFNjYWxhcigtdCksdGhpcy5tYXguYWRkU2NhbGFyKHQpLHRoaXN9ZXhwYW5kQnlPYmplY3QodCxlPSExKXt0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTtjb25zdCBuPXQuZ2VvbWV0cnk7aWYodm9pZCAwIT09bil7Y29uc3Qgcj1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZighMD09PWUmJnZvaWQgMCE9PXImJiEwIT09dC5pc0luc3RhbmNlZE1lc2gpZm9yKGxldCBlPTAsbj1yLmNvdW50O2U8bjtlKyspITA9PT10LmlzTWVzaD90LmdldFZlcnRleFBvc2l0aW9uKGUsQ2gpOkNoLmZyb21CdWZmZXJBdHRyaWJ1dGUocixlKSxDaC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KENoKTtlbHNlIHZvaWQgMCE9PXQuYm91bmRpbmdCb3g/KG51bGw9PT10LmJvdW5kaW5nQm94JiZ0LmNvbXB1dGVCb3VuZGluZ0JveCgpLFNoLmNvcHkodC5ib3VuZGluZ0JveCkpOihudWxsPT09bi5ib3VuZGluZ0JveCYmbi5jb21wdXRlQm91bmRpbmdCb3goKSxTaC5jb3B5KG4uYm91bmRpbmdCb3gpKSxTaC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy51bmlvbihTaCl9Y29uc3Qgcj10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLG49ci5sZW5ndGg7dDxuO3QrKyl0aGlzLmV4cGFuZEJ5T2JqZWN0KHJbdF0sZSk7cmV0dXJuIHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC54Pj10aGlzLm1pbi54JiZ0Lng8PXRoaXMubWF4LngmJnQueT49dGhpcy5taW4ueSYmdC55PD10aGlzLm1heC55JiZ0Lno+PXRoaXMubWluLnomJnQuejw9dGhpcy5tYXguen1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9dC5taW4ueiYmdC5tYXguejw9dGhpcy5tYXguen1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLCh0LnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQubWF4Lng+PXRoaXMubWluLngmJnQubWluLng8PXRoaXMubWF4LngmJnQubWF4Lnk+PXRoaXMubWluLnkmJnQubWluLnk8PXRoaXMubWF4LnkmJnQubWF4Lno+PXRoaXMubWluLnomJnQubWluLno8PXRoaXMubWF4Lnp9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQuY2VudGVyLENoKSxDaC5kaXN0YW5jZVRvU3F1YXJlZCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWludGVyc2VjdHNQbGFuZSh0KXtsZXQgZSxuO3JldHVybiB0Lm5vcm1hbC54PjA/KGU9dC5ub3JtYWwueCp0aGlzLm1pbi54LG49dC5ub3JtYWwueCp0aGlzLm1heC54KTooZT10Lm5vcm1hbC54KnRoaXMubWF4Lngsbj10Lm5vcm1hbC54KnRoaXMubWluLngpLHQubm9ybWFsLnk+MD8oZSs9dC5ub3JtYWwueSp0aGlzLm1pbi55LG4rPXQubm9ybWFsLnkqdGhpcy5tYXgueSk6KGUrPXQubm9ybWFsLnkqdGhpcy5tYXgueSxuKz10Lm5vcm1hbC55KnRoaXMubWluLnkpLHQubm9ybWFsLno+MD8oZSs9dC5ub3JtYWwueip0aGlzLm1pbi56LG4rPXQubm9ybWFsLnoqdGhpcy5tYXgueik6KGUrPXQubm9ybWFsLnoqdGhpcy5tYXgueixuKz10Lm5vcm1hbC56KnRoaXMubWluLnopLGU8PS10LmNvbnN0YW50JiZuPj0tdC5jb25zdGFudH1pbnRlcnNlY3RzVHJpYW5nbGUodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIoT2gpLExoLnN1YlZlY3RvcnModGhpcy5tYXgsT2gpLEFoLnN1YlZlY3RvcnModC5hLE9oKSxOaC5zdWJWZWN0b3JzKHQuYixPaCksSWguc3ViVmVjdG9ycyh0LmMsT2gpLE1oLnN1YlZlY3RvcnMoTmgsQWgpLEZoLnN1YlZlY3RvcnMoSWgsTmgpLFRoLnN1YlZlY3RvcnMoQWgsSWgpO2xldCBlPVswLC1NaC56LE1oLnksMCwtRmgueixGaC55LDAsLVRoLnosVGgueSxNaC56LDAsLU1oLngsRmgueiwwLC1GaC54LFRoLnosMCwtVGgueCwtTWgueSxNaC54LDAsLUZoLnksRmgueCwwLC1UaC55LFRoLngsMF07cmV0dXJuISghQmgoZSxBaCxOaCxJaCxMaCl8fChlPVsxLDAsMCwwLDEsMCwwLDAsMV0sIUJoKGUsQWgsTmgsSWgsTGgpKSkmJihQaC5jcm9zc1ZlY3RvcnMoTWgsRmgpLGU9W1BoLngsUGgueSxQaC56XSxCaChlLEFoLE5oLEloLExoKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQsQ2gpLmRpc3RhbmNlVG8odCl9Z2V0Qm91bmRpbmdTcGhlcmUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3QubWFrZUVtcHR5KCk6KHRoaXMuZ2V0Q2VudGVyKHQuY2VudGVyKSx0LnJhZGl1cz0uNSp0aGlzLmdldFNpemUoQ2gpLmxlbmd0aCgpKSx0fWludGVyc2VjdCh0KXtyZXR1cm4gdGhpcy5taW4ubWF4KHQubWluKSx0aGlzLm1heC5taW4odC5tYXgpLHRoaXMuaXNFbXB0eSgpJiZ0aGlzLm1ha2VFbXB0eSgpLHRoaXN9dW5pb24odCl7cmV0dXJuIHRoaXMubWluLm1pbih0Lm1pbiksdGhpcy5tYXgubWF4KHQubWF4KSx0aGlzfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCl8fChFaFswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxFaFsxXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxFaFsyXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxFaFszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxFaFs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxFaFs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxFaFs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxFaFs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldEZyb21Qb2ludHMoRWgpKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5taW4uYWRkKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5taW4uZXF1YWxzKHRoaXMubWluKSYmdC5tYXguZXF1YWxzKHRoaXMubWF4KX19Y29uc3QgRWg9W25ldyB4aCxuZXcgeGgsbmV3IHhoLG5ldyB4aCxuZXcgeGgsbmV3IHhoLG5ldyB4aCxuZXcgeGhdLENoPW5ldyB4aCxTaD1uZXcgRGgsQWg9bmV3IHhoLE5oPW5ldyB4aCxJaD1uZXcgeGgsTWg9bmV3IHhoLEZoPW5ldyB4aCxUaD1uZXcgeGgsT2g9bmV3IHhoLExoPW5ldyB4aCxQaD1uZXcgeGgsUmg9bmV3IHhoO2Z1bmN0aW9uIEJoKHQsZSxuLHIsaSl7Zm9yKGxldCBvPTAscz10Lmxlbmd0aC0zO288PXM7bys9Myl7UmguZnJvbUFycmF5KHQsbyk7Y29uc3Qgcz1pLngqTWF0aC5hYnMoUmgueCkraS55Kk1hdGguYWJzKFJoLnkpK2kueipNYXRoLmFicyhSaC56KSxhPWUuZG90KFJoKSx1PW4uZG90KFJoKSxjPXIuZG90KFJoKTtpZihNYXRoLm1heCgtTWF0aC5tYXgoYSx1LGMpLE1hdGgubWluKGEsdSxjKSk+cylyZXR1cm4hMX1yZXR1cm4hMH1jb25zdCBraD1uZXcgRGgsemg9bmV3IHhoLGpoPW5ldyB4aDtjbGFzcyBVaHtjb25zdHJ1Y3Rvcih0PW5ldyB4aCxlPS0xKXt0aGlzLmlzU3BoZXJlPSEwLHRoaXMuY2VudGVyPXQsdGhpcy5yYWRpdXM9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz1lLHRoaXN9c2V0RnJvbVBvaW50cyh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXI7dm9pZCAwIT09ZT9uLmNvcHkoZSk6a2guc2V0RnJvbVBvaW50cyh0KS5nZXRDZW50ZXIobik7bGV0IHI9MDtmb3IobGV0IGU9MCxpPXQubGVuZ3RoO2U8aTtlKyspcj1NYXRoLm1heChyLG4uZGlzdGFuY2VUb1NxdWFyZWQodFtlXSkpO3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQociksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5yYWRpdXM8MH1tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5jZW50ZXIuc2V0KDAsMCwwKSx0aGlzLnJhZGl1cz0tMSx0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUbyh0aGlzLmNlbnRlciktdGhpcy5yYWRpdXN9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucmFkaXVzK3QucmFkaXVzO3JldHVybiB0LmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PWUqZX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNTcGhlcmUodGhpcyl9aW50ZXJzZWN0c1BsYW5lKHQpe3JldHVybiBNYXRoLmFicyh0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c31jbGFtcFBvaW50KHQsZSl7Y29uc3Qgbj10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0KTtyZXR1cm4gZS5jb3B5KHQpLG4+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihlLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSksZX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/KHQubWFrZUVtcHR5KCksdCk6KHQuc2V0KHRoaXMuY2VudGVyLHRoaXMuY2VudGVyKSx0LmV4cGFuZEJ5U2NhbGFyKHRoaXMucmFkaXVzKSx0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCh0KSx0aGlzLnJhZGl1cz10aGlzLnJhZGl1cyp0LmdldE1heFNjYWxlT25BeGlzKCksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFkZCh0KSx0aGlzfWV4cGFuZEJ5UG9pbnQodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9MCx0aGlzO3poLnN1YlZlY3RvcnModCx0aGlzLmNlbnRlcik7Y29uc3QgZT16aC5sZW5ndGhTcSgpO2lmKGU+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IHQ9TWF0aC5zcXJ0KGUpLG49LjUqKHQtdGhpcy5yYWRpdXMpO3RoaXMuY2VudGVyLmFkZFNjYWxlZFZlY3Rvcih6aCxuL3QpLHRoaXMucmFkaXVzKz1ufXJldHVybiB0aGlzfXVuaW9uKHQpe3JldHVybiB0LmlzRW1wdHkoKT90aGlzOnRoaXMuaXNFbXB0eSgpPyh0aGlzLmNvcHkodCksdGhpcyk6KCEwPT09dGhpcy5jZW50ZXIuZXF1YWxzKHQuY2VudGVyKT90aGlzLnJhZGl1cz1NYXRoLm1heCh0aGlzLnJhZGl1cyx0LnJhZGl1cyk6KGpoLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5jZW50ZXIpLnNldExlbmd0aCh0LnJhZGl1cyksdGhpcy5leHBhbmRCeVBvaW50KHpoLmNvcHkodC5jZW50ZXIpLmFkZChqaCkpLHRoaXMuZXhwYW5kQnlQb2ludCh6aC5jb3B5KHQuY2VudGVyKS5zdWIoamgpKSksdGhpcyl9ZXF1YWxzKHQpe3JldHVybiB0LmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZ0LnJhZGl1cz09PXRoaXMucmFkaXVzfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX1jb25zdCBxaD1uZXcgeGgsVmg9bmV3IHhoLEdoPW5ldyB4aCxZaD1uZXcgeGgsWGg9bmV3IHhoLFdoPW5ldyB4aCxIaD1uZXcgeGg7Y2xhc3MgWmh7Y29uc3RydWN0b3IodCxlLG4scixpLG8scyxhLHUsYyxsLGgsZixwLGQsZyl7WmgucHJvdG90eXBlLmlzTWF0cml4ND0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSx2b2lkIDAhPT10JiZ0aGlzLnNldCh0LGUsbixyLGksbyxzLGEsdSxjLGwsaCxmLHAsZCxnKX1zZXQodCxlLG4scixpLG8scyxhLHUsYyxsLGgsZixwLGQsZyl7Y29uc3QgeT10aGlzLmVsZW1lbnRzO3JldHVybiB5WzBdPXQseVs0XT1lLHlbOF09bix5WzEyXT1yLHlbMV09aSx5WzVdPW8seVs5XT1zLHlbMTNdPWEseVsyXT11LHlbNl09Yyx5WzEwXT1sLHlbMTRdPWgseVszXT1mLHlbN109cCx5WzExXT1kLHlbMTVdPWcsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfWNsb25lKCl7cmV0dXJuKG5ldyBaaCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sZVs5XT1uWzldLGVbMTBdPW5bMTBdLGVbMTFdPW5bMTFdLGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLGVbMTVdPW5bMTVdLHRoaXN9Y29weVBvc2l0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLHRoaXN9c2V0RnJvbU1hdHJpeDModCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbM10sZVs2XSwwLGVbMV0sZVs0XSxlWzddLDAsZVsyXSxlWzVdLGVbOF0sMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpLHRoaXN9bWFrZUJhc2lzKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodC54LGUueCxuLngsMCx0LnksZS55LG4ueSwwLHQueixlLnosbi56LDAsMCwwLDAsMSksdGhpc31leHRyYWN0Um90YXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cyxyPTEvS2guc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLGk9MS9LaC5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCksbz0xL0toLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gZVswXT1uWzBdKnIsZVsxXT1uWzFdKnIsZVsyXT1uWzJdKnIsZVszXT0wLGVbNF09bls0XSppLGVbNV09bls1XSppLGVbNl09bls2XSppLGVbN109MCxlWzhdPW5bOF0qbyxlWzldPW5bOV0qbyxlWzEwXT1uWzEwXSpvLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21FdWxlcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10Lngscj10LnksaT10Lnosbz1NYXRoLmNvcyhuKSxzPU1hdGguc2luKG4pLGE9TWF0aC5jb3MociksdT1NYXRoLnNpbihyKSxjPU1hdGguY29zKGkpLGw9TWF0aC5zaW4oaSk7aWYoIlhZWiI9PT10Lm9yZGVyKXtjb25zdCB0PW8qYyxuPW8qbCxyPXMqYyxpPXMqbDtlWzBdPWEqYyxlWzRdPS1hKmwsZVs4XT11LGVbMV09bityKnUsZVs1XT10LWkqdSxlWzldPS1zKmEsZVsyXT1pLXQqdSxlWzZdPXIrbip1LGVbMTBdPW8qYX1lbHNlIGlmKCJZWFoiPT09dC5vcmRlcil7Y29uc3QgdD1hKmMsbj1hKmwscj11KmMsaT11Kmw7ZVswXT10K2kqcyxlWzRdPXIqcy1uLGVbOF09byp1LGVbMV09bypsLGVbNV09bypjLGVbOV09LXMsZVsyXT1uKnMtcixlWzZdPWkrdCpzLGVbMTBdPW8qYX1lbHNlIGlmKCJaWFkiPT09dC5vcmRlcil7Y29uc3QgdD1hKmMsbj1hKmwscj11KmMsaT11Kmw7ZVswXT10LWkqcyxlWzRdPS1vKmwsZVs4XT1yK24qcyxlWzFdPW4rcipzLGVbNV09bypjLGVbOV09aS10KnMsZVsyXT0tbyp1LGVbNl09cyxlWzEwXT1vKmF9ZWxzZSBpZigiWllYIj09PXQub3JkZXIpe2NvbnN0IHQ9bypjLG49bypsLHI9cypjLGk9cypsO2VbMF09YSpjLGVbNF09cip1LW4sZVs4XT10KnUraSxlWzFdPWEqbCxlWzVdPWkqdSt0LGVbOV09bip1LXIsZVsyXT0tdSxlWzZdPXMqYSxlWzEwXT1vKmF9ZWxzZSBpZigiWVpYIj09PXQub3JkZXIpe2NvbnN0IHQ9byphLG49byp1LHI9cyphLGk9cyp1O2VbMF09YSpjLGVbNF09aS10KmwsZVs4XT1yKmwrbixlWzFdPWwsZVs1XT1vKmMsZVs5XT0tcypjLGVbMl09LXUqYyxlWzZdPW4qbCtyLGVbMTBdPXQtaSpsfWVsc2UgaWYoIlhaWSI9PT10Lm9yZGVyKXtjb25zdCB0PW8qYSxuPW8qdSxyPXMqYSxpPXMqdTtlWzBdPWEqYyxlWzRdPS1sLGVbOF09dSpjLGVbMV09dCpsK2ksZVs1XT1vKmMsZVs5XT1uKmwtcixlWzJdPXIqbC1uLGVbNl09cypjLGVbMTBdPWkqbCt0fXJldHVybiBlWzNdPTAsZVs3XT0wLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLmNvbXBvc2UoUWgsdCwkaCl9bG9va0F0KHQsZSxuKXtjb25zdCByPXRoaXMuZWxlbWVudHM7cmV0dXJuIG5mLnN1YlZlY3RvcnModCxlKSwwPT09bmYubGVuZ3RoU3EoKSYmKG5mLno9MSksbmYubm9ybWFsaXplKCksdGYuY3Jvc3NWZWN0b3JzKG4sbmYpLDA9PT10Zi5sZW5ndGhTcSgpJiYoMT09PU1hdGguYWJzKG4ueik/bmYueCs9MWUtNDpuZi56Kz0xZS00LG5mLm5vcm1hbGl6ZSgpLHRmLmNyb3NzVmVjdG9ycyhuLG5mKSksdGYubm9ybWFsaXplKCksZWYuY3Jvc3NWZWN0b3JzKG5mLHRmKSxyWzBdPXRmLngscls0XT1lZi54LHJbOF09bmYueCxyWzFdPXRmLnkscls1XT1lZi55LHJbOV09bmYueSxyWzJdPXRmLnoscls2XT1lZi56LHJbMTBdPW5mLnosdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscj1lLmVsZW1lbnRzLGk9dGhpcy5lbGVtZW50cyxvPW5bMF0scz1uWzRdLGE9bls4XSx1PW5bMTJdLGM9blsxXSxsPW5bNV0saD1uWzldLGY9blsxM10scD1uWzJdLGQ9bls2XSxnPW5bMTBdLHk9blsxNF0sbT1uWzNdLHY9bls3XSxfPW5bMTFdLHg9blsxNV0sdz1yWzBdLGI9cls0XSxEPXJbOF0sRT1yWzEyXSxDPXJbMV0sUz1yWzVdLEE9cls5XSxOPXJbMTNdLEk9clsyXSxNPXJbNl0sRj1yWzEwXSxUPXJbMTRdLE89clszXSxMPXJbN10sUD1yWzExXSxSPXJbMTVdO3JldHVybiBpWzBdPW8qdytzKkMrYSpJK3UqTyxpWzRdPW8qYitzKlMrYSpNK3UqTCxpWzhdPW8qRCtzKkErYSpGK3UqUCxpWzEyXT1vKkUrcypOK2EqVCt1KlIsaVsxXT1jKncrbCpDK2gqSStmKk8saVs1XT1jKmIrbCpTK2gqTStmKkwsaVs5XT1jKkQrbCpBK2gqRitmKlAsaVsxM109YypFK2wqTitoKlQrZipSLGlbMl09cCp3K2QqQytnKkkreSpPLGlbNl09cCpiK2QqUytnKk0reSpMLGlbMTBdPXAqRCtkKkErZypGK3kqUCxpWzE0XT1wKkUrZCpOK2cqVCt5KlIsaVszXT1tKncrdipDK18qSSt4Kk8saVs3XT1tKmIrdipTK18qTSt4KkwsaVsxMV09bSpEK3YqQStfKkYreCpQLGlbMTVdPW0qRSt2Kk4rXypUK3gqUix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzRdKj10LGVbOF0qPXQsZVsxMl0qPXQsZVsxXSo9dCxlWzVdKj10LGVbOV0qPXQsZVsxM10qPXQsZVsyXSo9dCxlWzZdKj10LGVbMTBdKj10LGVbMTRdKj10LGVbM10qPXQsZVs3XSo9dCxlWzExXSo9dCxlWzE1XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbNF0scj10WzhdLGk9dFsxMl0sbz10WzFdLHM9dFs1XSxhPXRbOV0sdT10WzEzXSxjPXRbMl0sbD10WzZdLGg9dFsxMF0sZj10WzE0XTtyZXR1cm4gdFszXSooK2kqYSpsLXIqdSpsLWkqcypoK24qdSpoK3IqcypmLW4qYSpmKSt0WzddKigrZSphKmYtZSp1KmgraSpvKmgtcipvKmYrcip1KmMtaSphKmMpK3RbMTFdKigrZSp1KmwtZSpzKmYtaSpvKmwrbipvKmYraSpzKmMtbip1KmMpK3RbMTVdKigtcipzKmMtZSphKmwrZSpzKmgrcipvKmwtbipvKmgrbiphKmMpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxuKXtjb25zdCByPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhyWzEyXT10LngsclsxM109dC55LHJbMTRdPXQueik6KHJbMTJdPXQsclsxM109ZSxyWzE0XT1uKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHI9dFsyXSxpPXRbM10sbz10WzRdLHM9dFs1XSxhPXRbNl0sdT10WzddLGM9dFs4XSxsPXRbOV0saD10WzEwXSxmPXRbMTFdLHA9dFsxMl0sZD10WzEzXSxnPXRbMTRdLHk9dFsxNV0sbT1sKmcqdS1kKmgqdStkKmEqZi1zKmcqZi1sKmEqeStzKmgqeSx2PXAqaCp1LWMqZyp1LXAqYSpmK28qZypmK2MqYSp5LW8qaCp5LF89YypkKnUtcCpsKnUrcCpzKmYtbypkKmYtYypzKnkrbypsKnkseD1wKmwqYS1jKmQqYS1wKnMqaCtvKmQqaCtjKnMqZy1vKmwqZyx3PWUqbStuKnYrcipfK2kqeDtpZigwPT09dylyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgYj0xL3c7cmV0dXJuIHRbMF09bSpiLHRbMV09KGQqaCppLWwqZyppLWQqcipmK24qZypmK2wqcip5LW4qaCp5KSpiLHRbMl09KHMqZyppLWQqYSppK2Qqcip1LW4qZyp1LXMqcip5K24qYSp5KSpiLHRbM109KGwqYSppLXMqaCppLWwqcip1K24qaCp1K3MqcipmLW4qYSpmKSpiLHRbNF09dipiLHRbNV09KGMqZyppLXAqaCppK3AqcipmLWUqZypmLWMqcip5K2UqaCp5KSpiLHRbNl09KHAqYSppLW8qZyppLXAqcip1K2UqZyp1K28qcip5LWUqYSp5KSpiLHRbN109KG8qaCppLWMqYSppK2Mqcip1LWUqaCp1LW8qcipmK2UqYSpmKSpiLHRbOF09XypiLHRbOV09KHAqbCppLWMqZCppLXAqbipmK2UqZCpmK2Mqbip5LWUqbCp5KSpiLHRbMTBdPShvKmQqaS1wKnMqaStwKm4qdS1lKmQqdS1vKm4qeStlKnMqeSkqYix0WzExXT0oYypzKmktbypsKmktYypuKnUrZSpsKnUrbypuKmYtZSpzKmYpKmIsdFsxMl09eCpiLHRbMTNdPShjKmQqci1wKmwqcitwKm4qaC1lKmQqaC1jKm4qZytlKmwqZykqYix0WzE0XT0ocCpzKnItbypkKnItcCpuKmErZSpkKmErbypuKmctZSpzKmcpKmIsdFsxNV09KG8qbCpyLWMqcypyK2MqbiphLWUqbCphLW8qbipoK2UqcypoKSpiLHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LHI9dC55LGk9dC56O3JldHVybiBlWzBdKj1uLGVbNF0qPXIsZVs4XSo9aSxlWzFdKj1uLGVbNV0qPXIsZVs5XSo9aSxlWzJdKj1uLGVbNl0qPXIsZVsxMF0qPWksZVszXSo9bixlWzddKj1yLGVbMTFdKj1pLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSxuPXRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLHI9dFs4XSp0WzhdK3RbOV0qdFs5XSt0WzEwXSp0WzEwXTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGUsbixyKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxuKXtyZXR1cm4gdC5pc1ZlY3RvcjM/dGhpcy5zZXQoMSwwLDAsdC54LDAsMSwwLHQueSwwLDAsMSx0LnosMCwwLDAsMSk6dGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLG4sMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxuLDAsMCwxLDAsMCwtbiwwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsMCxuLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxyPU1hdGguc2luKGUpLGk9MS1uLG89dC54LHM9dC55LGE9dC56LHU9aSpvLGM9aSpzO3JldHVybiB0aGlzLnNldCh1Km8rbix1KnMtciphLHUqYStyKnMsMCx1KnMrciphLGMqcytuLGMqYS1yKm8sMCx1KmEtcipzLGMqYStyKm8saSphKmErbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxuLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLG4scixpLG8pe3JldHVybiB0aGlzLnNldCgxLG4saSwwLHQsMSxvLDAsZSxyLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLG4pe2NvbnN0IHI9dGhpcy5lbGVtZW50cyxpPWUuX3gsbz1lLl95LHM9ZS5feixhPWUuX3csdT1pK2ksYz1vK28sbD1zK3MsaD1pKnUsZj1pKmMscD1pKmwsZD1vKmMsZz1vKmwseT1zKmwsbT1hKnUsdj1hKmMsXz1hKmwseD1uLngsdz1uLnksYj1uLno7cmV0dXJuIHJbMF09KDEtKGQreSkpKngsclsxXT0oZitfKSp4LHJbMl09KHAtdikqeCxyWzNdPTAscls0XT0oZi1fKSp3LHJbNV09KDEtKGgreSkpKncscls2XT0oZyttKSp3LHJbN109MCxyWzhdPShwK3YpKmIscls5XT0oZy1tKSpiLHJbMTBdPSgxLShoK2QpKSpiLHJbMTFdPTAsclsxMl09dC54LHJbMTNdPXQueSxyWzE0XT10LnosclsxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUsbil7Y29uc3Qgcj10aGlzLmVsZW1lbnRzO2xldCBpPUtoLnNldChyWzBdLHJbMV0sclsyXSkubGVuZ3RoKCk7Y29uc3Qgbz1LaC5zZXQocls0XSxyWzVdLHJbNl0pLmxlbmd0aCgpLHM9S2guc2V0KHJbOF0scls5XSxyWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihpPS1pKSx0Lng9clsxMl0sdC55PXJbMTNdLHQuej1yWzE0XSxKaC5jb3B5KHRoaXMpO2NvbnN0IGE9MS9pLHU9MS9vLGM9MS9zO3JldHVybiBKaC5lbGVtZW50c1swXSo9YSxKaC5lbGVtZW50c1sxXSo9YSxKaC5lbGVtZW50c1syXSo9YSxKaC5lbGVtZW50c1s0XSo9dSxKaC5lbGVtZW50c1s1XSo9dSxKaC5lbGVtZW50c1s2XSo9dSxKaC5lbGVtZW50c1s4XSo9YyxKaC5lbGVtZW50c1s5XSo9YyxKaC5lbGVtZW50c1sxMF0qPWMsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgoSmgpLG4ueD1pLG4ueT1vLG4uej1zLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxuLHIsaSxvLHM9SGwpe2NvbnN0IGE9dGhpcy5lbGVtZW50cyx1PTIqaS8oZS10KSxjPTIqaS8obi1yKSxsPShlK3QpLyhlLXQpLGg9KG4rcikvKG4tcik7bGV0IGYscDtpZihzPT09SGwpZj0tKG8raSkvKG8taSkscD0tMipvKmkvKG8taSk7ZWxzZXtpZigyMDAxIT09cyl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZVBlcnNwZWN0aXZlKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrcyk7Zj0tby8oby1pKSxwPS1vKmkvKG8taSl9cmV0dXJuIGFbMF09dSxhWzRdPTAsYVs4XT1sLGFbMTJdPTAsYVsxXT0wLGFbNV09YyxhWzldPWgsYVsxM109MCxhWzJdPTAsYVs2XT0wLGFbMTBdPWYsYVsxNF09cCxhWzNdPTAsYVs3XT0wLGFbMTFdPS0xLGFbMTVdPTAsdGhpc31tYWtlT3J0aG9ncmFwaGljKHQsZSxuLHIsaSxvLHM9SGwpe2NvbnN0IGE9dGhpcy5lbGVtZW50cyx1PTEvKGUtdCksYz0xLyhuLXIpLGw9MS8oby1pKSxoPShlK3QpKnUsZj0obityKSpjO2xldCBwLGQ7aWYocz09PUhsKXA9KG8raSkqbCxkPS0yKmw7ZWxzZXtpZigyMDAxIT09cyl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZU9ydGhvZ3JhcGhpYygpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK3MpO3A9aSpsLGQ9LTEqbH1yZXR1cm4gYVswXT0yKnUsYVs0XT0wLGFbOF09MCxhWzEyXT0taCxhWzFdPTAsYVs1XT0yKmMsYVs5XT0wLGFbMTNdPS1mLGFbMl09MCxhWzZdPTAsYVsxMF09ZCxhWzE0XT0tcCxhWzNdPTAsYVs3XT0wLGFbMTFdPTAsYVsxNV09MSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgdD0wO3Q8MTY7dCsrKWlmKGVbdF0hPT1uW3RdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjwxNjtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdFtlKzldPW5bOV0sdFtlKzEwXT1uWzEwXSx0W2UrMTFdPW5bMTFdLHRbZSsxMl09blsxMl0sdFtlKzEzXT1uWzEzXSx0W2UrMTRdPW5bMTRdLHRbZSsxNV09blsxNV0sdH19Y29uc3QgS2g9bmV3IHhoLEpoPW5ldyBaaCxRaD1uZXcgeGgoMCwwLDApLCRoPW5ldyB4aCgxLDEsMSksdGY9bmV3IHhoLGVmPW5ldyB4aCxuZj1uZXcgeGgscmY9bmV3IFpoLG9mPW5ldyBfaDtjbGFzcyBzZntjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxyPXNmLkRFRkFVTFRfT1JERVIpe3RoaXMuaXNFdWxlcj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1yfWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCBvcmRlcigpe3JldHVybiB0aGlzLl9vcmRlcn1zZXQgb3JkZXIodCl7dGhpcy5fb3JkZXI9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxuLHI9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1yLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX29yZGVyKX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQuX3gsdGhpcy5feT10Ll95LHRoaXMuX3o9dC5feix0aGlzLl9vcmRlcj10Ll9vcmRlcix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCxlPXRoaXMuX29yZGVyLG49ITApe2NvbnN0IHI9dC5lbGVtZW50cyxpPXJbMF0sbz1yWzRdLHM9cls4XSxhPXJbMV0sdT1yWzVdLGM9cls5XSxsPXJbMl0saD1yWzZdLGY9clsxMF07c3dpdGNoKGUpe2Nhc2UiWFlaIjp0aGlzLl95PU1hdGguYXNpbihRbChzLC0xLDEpKSxNYXRoLmFicyhzKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1jLGYpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihoLHUpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9TWF0aC5hc2luKC1RbChjLC0xLDEpKSxNYXRoLmFicyhjKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKHMsZiksdGhpcy5fej1NYXRoLmF0YW4yKGEsdSkpOih0aGlzLl95PU1hdGguYXRhbjIoLWwsaSksdGhpcy5fej0wKTticmVhaztjYXNlIlpYWSI6dGhpcy5feD1NYXRoLmFzaW4oUWwoaCwtMSwxKSksTWF0aC5hYnMoaCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMigtbCxmKSx0aGlzLl96PU1hdGguYXRhbjIoLW8sdSkpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKGEsaSkpO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl95PU1hdGguYXNpbigtUWwobCwtMSwxKSksTWF0aC5hYnMobCk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihoLGYpLHRoaXMuX3o9TWF0aC5hdGFuMihhLGkpKToodGhpcy5feD0wLHRoaXMuX3o9TWF0aC5hdGFuMigtbyx1KSk7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3o9TWF0aC5hc2luKFFsKGEsLTEsMSkpLE1hdGguYWJzKGEpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWMsdSksdGhpcy5feT1NYXRoLmF0YW4yKC1sLGkpKToodGhpcy5feD0wLHRoaXMuX3k9TWF0aC5hdGFuMihzLGYpKTticmVhaztjYXNlIlhaWSI6dGhpcy5fej1NYXRoLmFzaW4oLVFsKG8sLTEsMSkpLE1hdGguYWJzKG8pPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoaCx1KSx0aGlzLl95PU1hdGguYXRhbjIocyxpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtYyxmKSx0aGlzLl95PTApfXJldHVybiB0aGlzLl9vcmRlcj1lLCEwPT09biYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVF1YXRlcm5pb24odCxlLG4pe3JldHVybiByZi5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeChyZixlLG4pfXNldEZyb21WZWN0b3IzKHQsZT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuc2V0KHQueCx0LnksdC56LGUpfXJlb3JkZXIodCl7cmV0dXJuIG9mLnNldEZyb21FdWxlcih0aGlzKSx0aGlzLnNldEZyb21RdWF0ZXJuaW9uKG9mLHQpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fb3JkZXI9PT10aGlzLl9vcmRlcn1mcm9tQXJyYXkodCl7cmV0dXJuIHRoaXMuX3g9dFswXSx0aGlzLl95PXRbMV0sdGhpcy5fej10WzJdLHZvaWQgMCE9PXRbM10mJih0aGlzLl9vcmRlcj10WzNdKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl9vcmRlcix0fV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fb3JkZXJ9fXNmLkRFRkFVTFRfT1JERVI9IlhZWiI7Y2xhc3MgYWZ7Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQodCl7dGhpcy5tYXNrPTE8PHQ+Pj4wfWVuYWJsZSh0KXt0aGlzLm1hc2t8PTE8PHR9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZSh0KXt0aGlzLm1hc2tePTE8PHR9ZGlzYWJsZSh0KXt0aGlzLm1hc2smPX4oMTw8dCl9ZGlzYWJsZUFsbCgpe3RoaXMubWFzaz0wfXRlc3QodCl7cmV0dXJuISEodGhpcy5tYXNrJnQubWFzayl9aXNFbmFibGVkKHQpe3JldHVybiEhKHRoaXMubWFzayYxPDx0KX19bGV0IHVmPTA7Y29uc3QgY2Y9bmV3IHhoLGxmPW5ldyBfaCxoZj1uZXcgWmgsZmY9bmV3IHhoLHBmPW5ldyB4aCxkZj1uZXcgeGgsZ2Y9bmV3IF9oLHlmPW5ldyB4aCgxLDAsMCksbWY9bmV3IHhoKDAsMSwwKSx2Zj1uZXcgeGgoMCwwLDEpLF9mPXt0eXBlOiJhZGRlZCJ9LHhmPXt0eXBlOiJyZW1vdmVkIn0sd2Y9e3R5cGU6ImNoaWxkYWRkZWQiLGNoaWxkOm51bGx9LGJmPXt0eXBlOiJjaGlsZHJlbW92ZWQiLGNoaWxkOm51bGx9O2NsYXNzIERmIGV4dGVuZHMgWmx7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNPYmplY3QzRD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTp1ZisrfSksdGhpcy51dWlkPUpsKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iT2JqZWN0M0QiLHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnVwPURmLkRFRkFVTFRfVVAuY2xvbmUoKTtjb25zdCB0PW5ldyB4aCxlPW5ldyBzZixuPW5ldyBfaCxyPW5ldyB4aCgxLDEsMSk7ZS5fb25DaGFuZ2UoKGZ1bmN0aW9uKCl7bi5zZXRGcm9tRXVsZXIoZSwhMSl9KSksbi5fb25DaGFuZ2UoKGZ1bmN0aW9uKCl7ZS5zZXRGcm9tUXVhdGVybmlvbihuLHZvaWQgMCwhMSl9KSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9zaXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnR9LHJvdGF0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplfSxxdWF0ZXJuaW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpufSxzY2FsZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6cn0sbW9kZWxWaWV3TWF0cml4Ont2YWx1ZTpuZXcgWmh9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3IGVofX0pLHRoaXMubWF0cml4PW5ldyBaaCx0aGlzLm1hdHJpeFdvcmxkPW5ldyBaaCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9RGYuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9RGYuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHRoaXMubGF5ZXJzPW5ldyBhZix0aGlzLnZpc2libGU9ITAsdGhpcy5jYXN0U2hhZG93PSExLHRoaXMucmVjZWl2ZVNoYWRvdz0hMSx0aGlzLmZydXN0dW1DdWxsZWQ9ITAsdGhpcy5yZW5kZXJPcmRlcj0wLHRoaXMuYW5pbWF0aW9ucz1bXSx0aGlzLnVzZXJEYXRhPXt9fW9uQmVmb3JlU2hhZG93KCl7fW9uQWZ0ZXJTaGFkb3coKXt9b25CZWZvcmVSZW5kZXIoKXt9b25BZnRlclJlbmRlcigpe31hcHBseU1hdHJpeDQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWF0cml4LnByZW11bHRpcGx5KHQpLHRoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX1hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSh0KSx0aGlzfXNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZSh0LGUpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSl9c2V0Um90YXRpb25Gcm9tRXVsZXIodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcih0LCEwKX1zZXRSb3RhdGlvbkZyb21NYXRyaXgodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KX1zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3RoaXMucXVhdGVybmlvbi5jb3B5KHQpfXJvdGF0ZU9uQXhpcyh0LGUpe3JldHVybiBsZi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KGxmKSx0aGlzfXJvdGF0ZU9uV29ybGRBeGlzKHQsZSl7cmV0dXJuIGxmLnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkobGYpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoeWYsdCl9cm90YXRlWSh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMobWYsdCl9cm90YXRlWih0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXModmYsdCl9dHJhbnNsYXRlT25BeGlzKHQsZSl7cmV0dXJuIGNmLmNvcHkodCkuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucXVhdGVybmlvbiksdGhpcy5wb3NpdGlvbi5hZGQoY2YubXVsdGlwbHlTY2FsYXIoZSkpLHRoaXN9dHJhbnNsYXRlWCh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoeWYsdCl9dHJhbnNsYXRlWSh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMobWYsdCl9dHJhbnNsYXRlWih0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXModmYsdCl9bG9jYWxUb1dvcmxkKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKX13b3JsZFRvTG9jYWwodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuYXBwbHlNYXRyaXg0KGhmLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkpfWxvb2tBdCh0LGUsbil7dC5pc1ZlY3RvcjM/ZmYuY29weSh0KTpmZi5zZXQodCxlLG4pO2NvbnN0IHI9dGhpcy5wYXJlbnQ7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSkscGYuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpLHRoaXMuaXNDYW1lcmF8fHRoaXMuaXNMaWdodD9oZi5sb29rQXQocGYsZmYsdGhpcy51cCk6aGYubG9va0F0KGZmLHBmLHRoaXMudXApLHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoaGYpLHImJihoZi5leHRyYWN0Um90YXRpb24oci5tYXRyaXhXb3JsZCksbGYuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGhmKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkobGYuaW52ZXJ0KCkpKX1hZGQodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXRoaXMuYWRkKGFyZ3VtZW50c1t0XSk7cmV0dXJuIHRoaXN9cmV0dXJuIHQ9PT10aGlzfHx0JiZ0LmlzT2JqZWN0M0QmJih0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LmRpc3BhdGNoRXZlbnQoX2YpLHdmLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KHdmKSx3Zi5jaGlsZD1udWxsKSx0aGlzfXJlbW92ZSh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW3RdKTtyZXR1cm4gdGhpc31jb25zdCBlPXRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KTtyZXR1cm4tMSE9PWUmJih0LnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGUsMSksdC5kaXNwYXRjaEV2ZW50KHhmKSxiZi5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudChiZiksYmYuY2hpbGQ9bnVsbCksdGhpc31yZW1vdmVGcm9tUGFyZW50KCl7Y29uc3QgdD10aGlzLnBhcmVudDtyZXR1cm4gbnVsbCE9PXQmJnQucmVtb3ZlKHRoaXMpLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy5yZW1vdmUoLi4udGhpcy5jaGlsZHJlbil9YXR0YWNoKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxoZi5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpLG51bGwhPT10LnBhcmVudCYmKHQucGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxoZi5tdWx0aXBseSh0LnBhcmVudC5tYXRyaXhXb3JsZCkpLHQuYXBwbHlNYXRyaXg0KGhmKSx0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKSx0LmRpc3BhdGNoRXZlbnQoX2YpLHdmLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KHdmKSx3Zi5jaGlsZD1udWxsLHRoaXN9Z2V0T2JqZWN0QnlJZCh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsdCl9Z2V0T2JqZWN0QnlOYW1lKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoIm5hbWUiLHQpfWdldE9iamVjdEJ5UHJvcGVydHkodCxlKXtpZih0aGlzW3RdPT09ZSlyZXR1cm4gdGhpcztmb3IobGV0IG49MCxyPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO248cjtuKyspe2NvbnN0IHI9dGhpcy5jaGlsZHJlbltuXS5nZXRPYmplY3RCeVByb3BlcnR5KHQsZSk7aWYodm9pZCAwIT09cilyZXR1cm4gcn19Z2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLG49W10pe3RoaXNbdF09PT1lJiZuLnB1c2godGhpcyk7Y29uc3Qgcj10aGlzLmNoaWxkcmVuO2ZvcihsZXQgaT0wLG89ci5sZW5ndGg7aTxvO2krKylyW2ldLmdldE9iamVjdHNCeVByb3BlcnR5KHQsZSxuKTtyZXR1cm4gbn1nZXRXb3JsZFBvc2l0aW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKX1nZXRXb3JsZFF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKHBmLHQsZGYpLHR9Z2V0V29ybGRTY2FsZSh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UocGYsZ2YsdCksdH1nZXRXb3JsZERpcmVjdGlvbih0KXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtjb25zdCBlPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIHQuc2V0KGVbOF0sZVs5XSxlWzEwXSkubm9ybWFsaXplKCl9cmF5Y2FzdCgpe310cmF2ZXJzZSh0KXt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspZVtuXS50cmF2ZXJzZSh0KX10cmF2ZXJzZVZpc2libGUodCl7aWYoITE9PT10aGlzLnZpc2libGUpcmV0dXJuO3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyllW25dLnRyYXZlcnNlVmlzaWJsZSh0KX10cmF2ZXJzZUFuY2VzdG9ycyh0KXtjb25zdCBlPXRoaXMucGFyZW50O251bGwhPT1lJiYodChlKSxlLnRyYXZlcnNlQW5jZXN0b3JzKHQpKX11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH11cGRhdGVNYXRyaXhXb3JsZCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8dCkmJighMD09PXRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlJiYobnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHQ9ITApO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspZVtuXS51cGRhdGVNYXRyaXhXb3JsZCh0KX11cGRhdGVXb3JsZE1hdHJpeCh0LGUpe2NvbnN0IG49dGhpcy5wYXJlbnQ7aWYoITA9PT10JiZudWxsIT09biYmbi51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLCEwPT09dGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGUmJihudWxsPT09dGhpcy5wYXJlbnQ/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSwhMD09PWUpe2NvbnN0IHQ9dGhpcy5jaGlsZHJlbjtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdFtlXS51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCl9fXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdCxuPXt9O2UmJih0PXtnZW9tZXRyaWVzOnt9LG1hdGVyaWFsczp7fSx0ZXh0dXJlczp7fSxpbWFnZXM6e30sc2hhcGVzOnt9LHNrZWxldG9uczp7fSxhbmltYXRpb25zOnt9LG5vZGVzOnt9fSxuLm1ldGFkYXRhPXt2ZXJzaW9uOjQuNix0eXBlOiJPYmplY3QiLGdlbmVyYXRvcjoiT2JqZWN0M0QudG9KU09OIn0pO2NvbnN0IHI9e307ZnVuY3Rpb24gaShlLG4pe3JldHVybiB2b2lkIDA9PT1lW24udXVpZF0mJihlW24udXVpZF09bi50b0pTT04odCkpLG4udXVpZH1pZihyLnV1aWQ9dGhpcy51dWlkLHIudHlwZT10aGlzLnR5cGUsIiIhPT10aGlzLm5hbWUmJihyLm5hbWU9dGhpcy5uYW1lKSwhMD09PXRoaXMuY2FzdFNoYWRvdyYmKHIuY2FzdFNoYWRvdz0hMCksITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJihyLnJlY2VpdmVTaGFkb3c9ITApLCExPT09dGhpcy52aXNpYmxlJiYoci52aXNpYmxlPSExKSwhMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKHIuZnJ1c3R1bUN1bGxlZD0hMSksMCE9PXRoaXMucmVuZGVyT3JkZXImJihyLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYoci51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxyLmxheWVycz10aGlzLmxheWVycy5tYXNrLHIubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSxyLnVwPXRoaXMudXAudG9BcnJheSgpLCExPT09dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiYoci5tYXRyaXhBdXRvVXBkYXRlPSExKSx0aGlzLmlzSW5zdGFuY2VkTWVzaCYmKHIudHlwZT0iSW5zdGFuY2VkTWVzaCIsci5jb3VudD10aGlzLmNvdW50LHIuaW5zdGFuY2VNYXRyaXg9dGhpcy5pbnN0YW5jZU1hdHJpeC50b0pTT04oKSxudWxsIT09dGhpcy5pbnN0YW5jZUNvbG9yJiYoci5pbnN0YW5jZUNvbG9yPXRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKSkpLHRoaXMuaXNCYXRjaGVkTWVzaCYmKHIudHlwZT0iQmF0Y2hlZE1lc2giLHIucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQsci5zb3J0T2JqZWN0cz10aGlzLnNvcnRPYmplY3RzLHIuZHJhd1Jhbmdlcz10aGlzLl9kcmF3UmFuZ2VzLHIucmVzZXJ2ZWRSYW5nZXM9dGhpcy5fcmVzZXJ2ZWRSYW5nZXMsci52aXNpYmlsaXR5PXRoaXMuX3Zpc2liaWxpdHksci5hY3RpdmU9dGhpcy5fYWN0aXZlLHIuYm91bmRzPXRoaXMuX2JvdW5kcy5tYXAoKHQ9Pih7Ym94SW5pdGlhbGl6ZWQ6dC5ib3hJbml0aWFsaXplZCxib3hNaW46dC5ib3gubWluLnRvQXJyYXkoKSxib3hNYXg6dC5ib3gubWF4LnRvQXJyYXkoKSxzcGhlcmVJbml0aWFsaXplZDp0LnNwaGVyZUluaXRpYWxpemVkLHNwaGVyZVJhZGl1czp0LnNwaGVyZS5yYWRpdXMsc3BoZXJlQ2VudGVyOnQuc3BoZXJlLmNlbnRlci50b0FycmF5KCl9KSkpLHIubWF4SW5zdGFuY2VDb3VudD10aGlzLl9tYXhJbnN0YW5jZUNvdW50LHIubWF4VmVydGV4Q291bnQ9dGhpcy5fbWF4VmVydGV4Q291bnQsci5tYXhJbmRleENvdW50PXRoaXMuX21heEluZGV4Q291bnQsci5nZW9tZXRyeUluaXRpYWxpemVkPXRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQsci5nZW9tZXRyeUNvdW50PXRoaXMuX2dlb21ldHJ5Q291bnQsci5tYXRyaWNlc1RleHR1cmU9dGhpcy5fbWF0cmljZXNUZXh0dXJlLnRvSlNPTih0KSxudWxsIT09dGhpcy5fY29sb3JzVGV4dHVyZSYmKHIuY29sb3JzVGV4dHVyZT10aGlzLl9jb2xvcnNUZXh0dXJlLnRvSlNPTih0KSksbnVsbCE9PXRoaXMuYm91bmRpbmdTcGhlcmUmJihyLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6ci5ib3VuZGluZ1NwaGVyZS5jZW50ZXIudG9BcnJheSgpLHJhZGl1czpyLmJvdW5kaW5nU3BoZXJlLnJhZGl1c30pLG51bGwhPT10aGlzLmJvdW5kaW5nQm94JiYoci5ib3VuZGluZ0JveD17bWluOnIuYm91bmRpbmdCb3gubWluLnRvQXJyYXkoKSxtYXg6ci5ib3VuZGluZ0JveC5tYXgudG9BcnJheSgpfSkpLHRoaXMuaXNTY2VuZSl0aGlzLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQuaXNDb2xvcj9yLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTigpOnRoaXMuYmFja2dyb3VuZC5pc1RleHR1cmUmJihyLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTih0KS51dWlkKSksdGhpcy5lbnZpcm9ubWVudCYmdGhpcy5lbnZpcm9ubWVudC5pc1RleHR1cmUmJiEwIT09dGhpcy5lbnZpcm9ubWVudC5pc1JlbmRlclRhcmdldFRleHR1cmUmJihyLmVudmlyb25tZW50PXRoaXMuZW52aXJvbm1lbnQudG9KU09OKHQpLnV1aWQpO2Vsc2UgaWYodGhpcy5pc01lc2h8fHRoaXMuaXNMaW5lfHx0aGlzLmlzUG9pbnRzKXtyLmdlb21ldHJ5PWkodC5nZW9tZXRyaWVzLHRoaXMuZ2VvbWV0cnkpO2NvbnN0IGU9dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKHZvaWQgMCE9PWUmJnZvaWQgMCE9PWUuc2hhcGVzKXtjb25zdCBuPWUuc2hhcGVzO2lmKEFycmF5LmlzQXJyYXkobikpZm9yKGxldCBlPTAscj1uLmxlbmd0aDtlPHI7ZSsrKXtjb25zdCByPW5bZV07aSh0LnNoYXBlcyxyKX1lbHNlIGkodC5zaGFwZXMsbil9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKHIuYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxyLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx2b2lkIDAhPT10aGlzLnNrZWxldG9uJiYoaSh0LnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxyLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHZvaWQgMCE9PXRoaXMubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxyPXRoaXMubWF0ZXJpYWwubGVuZ3RoO248cjtuKyspZS5wdXNoKGkodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtuXSkpO3IubWF0ZXJpYWw9ZX1lbHNlIHIubWF0ZXJpYWw9aSh0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtyLmNoaWxkcmVuPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZSsrKXIuY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2VdLnRvSlNPTih0KS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7ci5hbmltYXRpb25zPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5hbmltYXRpb25zLmxlbmd0aDtlKyspe2NvbnN0IG49dGhpcy5hbmltYXRpb25zW2VdO3IuYW5pbWF0aW9ucy5wdXNoKGkodC5hbmltYXRpb25zLG4pKX19aWYoZSl7Y29uc3QgZT1vKHQuZ2VvbWV0cmllcykscj1vKHQubWF0ZXJpYWxzKSxpPW8odC50ZXh0dXJlcykscz1vKHQuaW1hZ2VzKSxhPW8odC5zaGFwZXMpLHU9byh0LnNrZWxldG9ucyksYz1vKHQuYW5pbWF0aW9ucyksbD1vKHQubm9kZXMpO2UubGVuZ3RoPjAmJihuLmdlb21ldHJpZXM9ZSksci5sZW5ndGg+MCYmKG4ubWF0ZXJpYWxzPXIpLGkubGVuZ3RoPjAmJihuLnRleHR1cmVzPWkpLHMubGVuZ3RoPjAmJihuLmltYWdlcz1zKSxhLmxlbmd0aD4wJiYobi5zaGFwZXM9YSksdS5sZW5ndGg+MCYmKG4uc2tlbGV0b25zPXUpLGMubGVuZ3RoPjAmJihuLmFuaW1hdGlvbnM9YyksbC5sZW5ndGg+MCYmKG4ubm9kZXM9bCl9cmV0dXJuIG4ub2JqZWN0PXIsbjtmdW5jdGlvbiBvKHQpe2NvbnN0IGU9W107Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3Qgcj10W25dO2RlbGV0ZSByLm1ldGFkYXRhLGUucHVzaChyKX1yZXR1cm4gZX19Y2xvbmUodCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMsdCl9Y29weSh0LGU9ITApe2lmKHRoaXMubmFtZT10Lm5hbWUsdGhpcy51cC5jb3B5KHQudXApLHRoaXMucG9zaXRpb24uY29weSh0LnBvc2l0aW9uKSx0aGlzLnJvdGF0aW9uLm9yZGVyPXQucm90YXRpb24ub3JkZXIsdGhpcy5xdWF0ZXJuaW9uLmNvcHkodC5xdWF0ZXJuaW9uKSx0aGlzLnNjYWxlLmNvcHkodC5zY2FsZSksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5tYXRyaXhXb3JsZC5jb3B5KHQubWF0cml4V29ybGQpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9dC5tYXRyaXhXb3JsZEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPXQubWF0cml4V29ybGROZWVkc1VwZGF0ZSx0aGlzLmxheWVycy5tYXNrPXQubGF5ZXJzLm1hc2ssdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLmNhc3RTaGFkb3c9dC5jYXN0U2hhZG93LHRoaXMucmVjZWl2ZVNoYWRvdz10LnJlY2VpdmVTaGFkb3csdGhpcy5mcnVzdHVtQ3VsbGVkPXQuZnJ1c3R1bUN1bGxlZCx0aGlzLnJlbmRlck9yZGVyPXQucmVuZGVyT3JkZXIsdGhpcy5hbmltYXRpb25zPXQuYW5pbWF0aW9ucy5zbGljZSgpLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksITA9PT1lKWZvcihsZXQgZT0wO2U8dC5jaGlsZHJlbi5sZW5ndGg7ZSsrKXtjb25zdCBuPXQuY2hpbGRyZW5bZV07dGhpcy5hZGQobi5jbG9uZSgpKX1yZXR1cm4gdGhpc319RGYuREVGQVVMVF9VUD1uZXcgeGgoMCwxLDApLERmLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFPSEwLERmLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFPSEwO2NvbnN0IEVmPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LENmPXtoOjAsczowLGw6MH0sU2Y9e2g6MCxzOjAsbDowfTtmdW5jdGlvbiBBZih0LGUsbil7cmV0dXJuIG48MCYmKG4rPTEpLG4+MSYmKG4tPTEpLG48MS82P3QrNiooZS10KSpuOm48LjU/ZTpuPDIvMz90KzYqKGUtdCkqKDIvMy1uKTp0fWNsYXNzIE5me2NvbnN0cnVjdG9yKHQsZSxuKXtyZXR1cm4gdGhpcy5pc0NvbG9yPSEwLHRoaXMucj0xLHRoaXMuZz0xLHRoaXMuYj0xLHRoaXMuc2V0KHQsZSxuKX1zZXQodCxlLG4pe2lmKHZvaWQgMD09PWUmJnZvaWQgMD09PW4pe2NvbnN0IGU9dDtlJiZlLmlzQ29sb3I/dGhpcy5jb3B5KGUpOiJudW1iZXIiPT10eXBlb2YgZT90aGlzLnNldEhleChlKToic3RyaW5nIj09dHlwZW9mIGUmJnRoaXMuc2V0U3R5bGUoZSl9ZWxzZSB0aGlzLnNldFJHQih0LGUsbik7cmV0dXJuIHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9dCx0aGlzLmI9dCx0aGlzfXNldEhleCh0LGU9VWwpe3JldHVybiB0PU1hdGguZmxvb3IodCksdGhpcy5yPSh0Pj4xNiYyNTUpLzI1NSx0aGlzLmc9KHQ+PjgmMjU1KS8yNTUsdGhpcy5iPSgyNTUmdCkvMjU1LHVoLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxlKSx0aGlzfXNldFJHQih0LGUsbixyPXVoLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPWUsdGhpcy5iPW4sdWgudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLHIpLHRoaXN9c2V0SFNMKHQsZSxuLHI9dWgud29ya2luZ0NvbG9yU3BhY2Upe2lmKHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4odCVlK2UpJWV9KHQsMSksZT1RbChlLDAsMSksbj1RbChuLDAsMSksMD09PWUpdGhpcy5yPXRoaXMuZz10aGlzLmI9bjtlbHNle2NvbnN0IHI9bjw9LjU/biooMStlKTpuK2UtbiplLGk9MipuLXI7dGhpcy5yPUFmKGkscix0KzEvMyksdGhpcy5nPUFmKGkscix0KSx0aGlzLmI9QWYoaSxyLHQtMS8zKX1yZXR1cm4gdWgudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLHIpLHRoaXN9c2V0U3R5bGUodCxlPVVsKXtmdW5jdGlvbiBuKHQpe3ZvaWQgMCE9PXQmJnBhcnNlRmxvYXQodCl9bGV0IHI7aWYocj0vXihcdyspXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgdDtjb25zdCBpPXJbMV0sbz1yWzJdO3N3aXRjaChpKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZih0PS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMobykpcmV0dXJuIG4odFs0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LHBhcnNlSW50KHRbMV0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHRbMl0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHRbM10sMTApKS8yNTUsZSk7aWYodD0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKG8pKXJldHVybiBuKHRbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDEwMCxwYXJzZUludCh0WzFdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludCh0WzJdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludCh0WzNdLDEwKSkvMTAwLGUpO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKHQ9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQqXC4/XGQrKVwlXHMqLFxzKihcZCpcLj9cZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMobykpcmV0dXJuIG4odFs0XSksdGhpcy5zZXRIU0wocGFyc2VGbG9hdCh0WzFdKS8zNjAscGFyc2VGbG9hdCh0WzJdKS8xMDAscGFyc2VGbG9hdCh0WzNdKS8xMDAsZSl9fWVsc2UgaWYocj0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IHQ9clsxXSxuPXQubGVuZ3RoO2lmKDM9PT1uKXJldHVybiB0aGlzLnNldFJHQihwYXJzZUludCh0LmNoYXJBdCgwKSwxNikvMTUscGFyc2VJbnQodC5jaGFyQXQoMSksMTYpLzE1LHBhcnNlSW50KHQuY2hhckF0KDIpLDE2KS8xNSxlKTtpZig2PT09bilyZXR1cm4gdGhpcy5zZXRIZXgocGFyc2VJbnQodCwxNiksZSl9ZWxzZSBpZih0JiZ0Lmxlbmd0aD4wKXJldHVybiB0aGlzLnNldENvbG9yTmFtZSh0LGUpO3JldHVybiB0aGlzfXNldENvbG9yTmFtZSh0LGU9VWwpe2NvbnN0IG49RWZbdC50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gdm9pZCAwIT09biYmdGhpcy5zZXRIZXgobixlKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMucix0aGlzLmcsdGhpcy5iKX1jb3B5KHQpe3JldHVybiB0aGlzLnI9dC5yLHRoaXMuZz10LmcsdGhpcy5iPXQuYix0aGlzfWNvcHlTUkdCVG9MaW5lYXIodCl7cmV0dXJuIHRoaXMucj1jaCh0LnIpLHRoaXMuZz1jaCh0LmcpLHRoaXMuYj1jaCh0LmIpLHRoaXN9Y29weUxpbmVhclRvU1JHQih0KXtyZXR1cm4gdGhpcy5yPWxoKHQuciksdGhpcy5nPWxoKHQuZyksdGhpcy5iPWxoKHQuYiksdGhpc31jb252ZXJ0U1JHQlRvTGluZWFyKCl7cmV0dXJuIHRoaXMuY29weVNSR0JUb0xpbmVhcih0aGlzKSx0aGlzfWNvbnZlcnRMaW5lYXJUb1NSR0IoKXtyZXR1cm4gdGhpcy5jb3B5TGluZWFyVG9TUkdCKHRoaXMpLHRoaXN9Z2V0SGV4KHQ9VWwpe3JldHVybiB1aC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoTWYuY29weSh0aGlzKSx0KSw2NTUzNipNYXRoLnJvdW5kKFFsKDI1NSpNZi5yLDAsMjU1KSkrMjU2Kk1hdGgucm91bmQoUWwoMjU1Kk1mLmcsMCwyNTUpKStNYXRoLnJvdW5kKFFsKDI1NSpNZi5iLDAsMjU1KSl9Z2V0SGV4U3RyaW5nKHQ9VWwpe3JldHVybigiMDAwMDAwIit0aGlzLmdldEhleCh0KS50b1N0cmluZygxNikpLnNsaWNlKC02KX1nZXRIU0wodCxlPXVoLndvcmtpbmdDb2xvclNwYWNlKXt1aC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoTWYuY29weSh0aGlzKSxlKTtjb25zdCBuPU1mLnIscj1NZi5nLGk9TWYuYixvPU1hdGgubWF4KG4scixpKSxzPU1hdGgubWluKG4scixpKTtsZXQgYSx1O2NvbnN0IGM9KHMrbykvMjtpZihzPT09bylhPTAsdT0wO2Vsc2V7Y29uc3QgdD1vLXM7c3dpdGNoKHU9Yzw9LjU/dC8obytzKTp0LygyLW8tcyksbyl7Y2FzZSBuOmE9KHItaSkvdCsocjxpPzY6MCk7YnJlYWs7Y2FzZSByOmE9KGktbikvdCsyO2JyZWFrO2Nhc2UgaTphPShuLXIpL3QrNH1hLz02fXJldHVybiB0Lmg9YSx0LnM9dSx0Lmw9Yyx0fWdldFJHQih0LGU9dWgud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB1aC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoTWYuY29weSh0aGlzKSxlKSx0LnI9TWYucix0Lmc9TWYuZyx0LmI9TWYuYix0fWdldFN0eWxlKHQ9VWwpe3VoLmZyb21Xb3JraW5nQ29sb3JTcGFjZShNZi5jb3B5KHRoaXMpLHQpO2NvbnN0IGU9TWYucixuPU1mLmcscj1NZi5iO3JldHVybiB0IT09VWw/YGNvbG9yKCR7dH0gJHtlLnRvRml4ZWQoMyl9ICR7bi50b0ZpeGVkKDMpfSAke3IudG9GaXhlZCgzKX0pYDpgcmdiKCR7TWF0aC5yb3VuZCgyNTUqZSl9LCR7TWF0aC5yb3VuZCgyNTUqbil9LCR7TWF0aC5yb3VuZCgyNTUqcil9KWB9b2Zmc2V0SFNMKHQsZSxuKXtyZXR1cm4gdGhpcy5nZXRIU0woQ2YpLHRoaXMuc2V0SFNMKENmLmgrdCxDZi5zK2UsQ2YubCtuKX1hZGQodCl7cmV0dXJuIHRoaXMucis9dC5yLHRoaXMuZys9dC5nLHRoaXMuYis9dC5iLHRoaXN9YWRkQ29sb3JzKHQsZSl7cmV0dXJuIHRoaXMucj10LnIrZS5yLHRoaXMuZz10LmcrZS5nLHRoaXMuYj10LmIrZS5iLHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLnIrPXQsdGhpcy5nKz10LHRoaXMuYis9dCx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy5yPU1hdGgubWF4KDAsdGhpcy5yLXQuciksdGhpcy5nPU1hdGgubWF4KDAsdGhpcy5nLXQuZyksdGhpcy5iPU1hdGgubWF4KDAsdGhpcy5iLXQuYiksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5yKj10LnIsdGhpcy5nKj10LmcsdGhpcy5iKj10LmIsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKj10LHRoaXMuZyo9dCx0aGlzLmIqPXQsdGhpc31sZXJwKHQsZSl7cmV0dXJuIHRoaXMucis9KHQuci10aGlzLnIpKmUsdGhpcy5nKz0odC5nLXRoaXMuZykqZSx0aGlzLmIrPSh0LmItdGhpcy5iKSplLHRoaXN9bGVycENvbG9ycyh0LGUsbil7cmV0dXJuIHRoaXMucj10LnIrKGUuci10LnIpKm4sdGhpcy5nPXQuZysoZS5nLXQuZykqbix0aGlzLmI9dC5iKyhlLmItdC5iKSpuLHRoaXN9bGVycEhTTCh0LGUpe3RoaXMuZ2V0SFNMKENmKSx0LmdldEhTTChTZik7Y29uc3Qgbj0kbChDZi5oLFNmLmgsZSkscj0kbChDZi5zLFNmLnMsZSksaT0kbChDZi5sLFNmLmwsZSk7cmV0dXJuIHRoaXMuc2V0SFNMKG4scixpKSx0aGlzfXNldEZyb21WZWN0b3IzKHQpe3JldHVybiB0aGlzLnI9dC54LHRoaXMuZz10LnksdGhpcy5iPXQueix0aGlzfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMucixuPXRoaXMuZyxyPXRoaXMuYixpPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMucj1pWzBdKmUraVszXSpuK2lbNl0qcix0aGlzLmc9aVsxXSplK2lbNF0qbitpWzddKnIsdGhpcy5iPWlbMl0qZStpWzVdKm4raVs4XSpyLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnI9PT10aGlzLnImJnQuZz09PXRoaXMuZyYmdC5iPT09dGhpcy5ifWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMucj10W2VdLHRoaXMuZz10W2UrMV0sdGhpcy5iPXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMucix0W2UrMV09dGhpcy5nLHRbZSsyXT10aGlzLmIsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMucj10LmdldFgoZSksdGhpcy5nPXQuZ2V0WShlKSx0aGlzLmI9dC5nZXRaKGUpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMuZ2V0SGV4KCl9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5yLHlpZWxkIHRoaXMuZyx5aWVsZCB0aGlzLmJ9fWNvbnN0IE1mPW5ldyBOZjtOZi5OQU1FUz1FZjtuZXcgeGgsbmV3IHRoO25ldyBaaCxuZXcgRGYsbmV3IHhoLG5ldyBEaCxuZXcgRGgsbmV3IHhoO25ldyBaaCxuZXcgY2xhc3N7Y29uc3RydWN0b3IodD1uZXcgeGgsZT1uZXcgeGgoMCwwLC0xKSl7dGhpcy5vcmlnaW49dCx0aGlzLmRpcmVjdGlvbj1lfXNldCh0LGUpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLHRoaXMuZGlyZWN0aW9uLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQub3JpZ2luKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSx0aGlzfWF0KHQsZSl7cmV0dXJuIGUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLHQpfWxvb2tBdCh0KXtyZXR1cm4gdGhpcy5kaXJlY3Rpb24uY29weSh0KS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpLHRoaXN9cmVjYXN0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHRoaXMuYXQodCxxaCkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sbil9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSl9ZGlzdGFuY2VTcVRvUG9pbnQodCl7Y29uc3QgZT1xaC5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIGU8MD90aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCh0KToocWguY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGUpLHFoLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVNxVG9TZWdtZW50KHQsZSxuLHIpe1ZoLmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSxHaC5jb3B5KGUpLnN1Yih0KS5ub3JtYWxpemUoKSxZaC5jb3B5KHRoaXMub3JpZ2luKS5zdWIoVmgpO2NvbnN0IGk9LjUqdC5kaXN0YW5jZVRvKGUpLG89LXRoaXMuZGlyZWN0aW9uLmRvdChHaCkscz1ZaC5kb3QodGhpcy5kaXJlY3Rpb24pLGE9LVloLmRvdChHaCksdT1ZaC5sZW5ndGhTcSgpLGM9TWF0aC5hYnMoMS1vKm8pO2xldCBsLGgsZixwO2lmKGM+MClpZihsPW8qYS1zLGg9bypzLWEscD1pKmMsbD49MClpZihoPj0tcClpZihoPD1wKXtjb25zdCB0PTEvYztsKj10LGgqPXQsZj1sKihsK28qaCsyKnMpK2gqKG8qbCtoKzIqYSkrdX1lbHNlIGg9aSxsPU1hdGgubWF4KDAsLShvKmgrcykpLGY9LWwqbCtoKihoKzIqYSkrdTtlbHNlIGg9LWksbD1NYXRoLm1heCgwLC0obypoK3MpKSxmPS1sKmwraCooaCsyKmEpK3U7ZWxzZSBoPD0tcD8obD1NYXRoLm1heCgwLC0oLW8qaStzKSksaD1sPjA/LWk6TWF0aC5taW4oTWF0aC5tYXgoLWksLWEpLGkpLGY9LWwqbCtoKihoKzIqYSkrdSk6aDw9cD8obD0wLGg9TWF0aC5taW4oTWF0aC5tYXgoLWksLWEpLGkpLGY9aCooaCsyKmEpK3UpOihsPU1hdGgubWF4KDAsLShvKmkrcykpLGg9bD4wP2k6TWF0aC5taW4oTWF0aC5tYXgoLWksLWEpLGkpLGY9LWwqbCtoKihoKzIqYSkrdSk7ZWxzZSBoPW8+MD8taTppLGw9TWF0aC5tYXgoMCwtKG8qaCtzKSksZj0tbCpsK2gqKGgrMiphKSt1O3JldHVybiBuJiZuLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixsKSxyJiZyLmNvcHkoVmgpLmFkZFNjYWxlZFZlY3RvcihHaCxoKSxmfWludGVyc2VjdFNwaGVyZSh0LGUpe3FoLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5vcmlnaW4pO2NvbnN0IG49cWguZG90KHRoaXMuZGlyZWN0aW9uKSxyPXFoLmRvdChxaCktbipuLGk9dC5yYWRpdXMqdC5yYWRpdXM7aWYocj5pKXJldHVybiBudWxsO2NvbnN0IG89TWF0aC5zcXJ0KGktcikscz1uLW8sYT1uK287cmV0dXJuIGE8MD9udWxsOnM8MD90aGlzLmF0KGEsZSk6dGhpcy5hdChzLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31kaXN0YW5jZVRvUGxhbmUodCl7Y29uc3QgZT10Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1lKXJldHVybiAwPT09dC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDtjb25zdCBuPS0odGhpcy5vcmlnaW4uZG90KHQubm9ybWFsKSt0LmNvbnN0YW50KS9lO3JldHVybiBuPj0wP246bnVsbH1pbnRlcnNlY3RQbGFuZSh0LGUpe2NvbnN0IG49dGhpcy5kaXN0YW5jZVRvUGxhbmUodCk7cmV0dXJuIG51bGw9PT1uP251bGw6dGhpcy5hdChuLGUpfWludGVyc2VjdHNQbGFuZSh0KXtjb25zdCBlPXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTtyZXR1cm4gMD09PWV8fHQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZTwwfWludGVyc2VjdEJveCh0LGUpe2xldCBuLHIsaSxvLHMsYTtjb25zdCB1PTEvdGhpcy5kaXJlY3Rpb24ueCxjPTEvdGhpcy5kaXJlY3Rpb24ueSxsPTEvdGhpcy5kaXJlY3Rpb24ueixoPXRoaXMub3JpZ2luO3JldHVybiB1Pj0wPyhuPSh0Lm1pbi54LWgueCkqdSxyPSh0Lm1heC54LWgueCkqdSk6KG49KHQubWF4LngtaC54KSp1LHI9KHQubWluLngtaC54KSp1KSxjPj0wPyhpPSh0Lm1pbi55LWgueSkqYyxvPSh0Lm1heC55LWgueSkqYyk6KGk9KHQubWF4LnktaC55KSpjLG89KHQubWluLnktaC55KSpjKSxuPm98fGk+cnx8KChpPm58fGlzTmFOKG4pKSYmKG49aSksKG88cnx8aXNOYU4ocikpJiYocj1vKSxsPj0wPyhzPSh0Lm1pbi56LWgueikqbCxhPSh0Lm1heC56LWgueikqbCk6KHM9KHQubWF4LnotaC56KSpsLGE9KHQubWluLnotaC56KSpsKSxuPmF8fHM+cil8fCgocz5ufHxuIT1uKSYmKG49cyksKGE8cnx8ciE9cikmJihyPWEpLHI8MCk/bnVsbDp0aGlzLmF0KG4+PTA/bjpyLGUpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveCh0LHFoKX1pbnRlcnNlY3RUcmlhbmdsZSh0LGUsbixyLGkpe1hoLnN1YlZlY3RvcnMoZSx0KSxXaC5zdWJWZWN0b3JzKG4sdCksSGguY3Jvc3NWZWN0b3JzKFhoLFdoKTtsZXQgbyxzPXRoaXMuZGlyZWN0aW9uLmRvdChIaCk7aWYocz4wKXtpZihyKXJldHVybiBudWxsO289MX1lbHNle2lmKCEoczwwKSlyZXR1cm4gbnVsbDtvPS0xLHM9LXN9WWguc3ViVmVjdG9ycyh0aGlzLm9yaWdpbix0KTtjb25zdCBhPW8qdGhpcy5kaXJlY3Rpb24uZG90KFdoLmNyb3NzVmVjdG9ycyhZaCxXaCkpO2lmKGE8MClyZXR1cm4gbnVsbDtjb25zdCB1PW8qdGhpcy5kaXJlY3Rpb24uZG90KFhoLmNyb3NzKFloKSk7aWYodTwwfHxhK3U+cylyZXR1cm4gbnVsbDtjb25zdCBjPS1vKlloLmRvdChIaCk7cmV0dXJuIGM8MD9udWxsOnRoaXMuYXQoYy9zLGkpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KHQpLHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmdC5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19LG5ldyBVaCxuZXcgeGg7Y29uc3QgRmY9bmV3IGNsYXNze2NvbnN0cnVjdG9yKHQsZSxuKXtjb25zdCByPXRoaXM7bGV0IGksbz0hMSxzPTAsYT0wO2NvbnN0IHU9W107dGhpcy5vblN0YXJ0PXZvaWQgMCx0aGlzLm9uTG9hZD10LHRoaXMub25Qcm9ncmVzcz1lLHRoaXMub25FcnJvcj1uLHRoaXMuaXRlbVN0YXJ0PWZ1bmN0aW9uKHQpe2ErKywhMT09PW8mJnZvaWQgMCE9PXIub25TdGFydCYmci5vblN0YXJ0KHQscyxhKSxvPSEwfSx0aGlzLml0ZW1FbmQ9ZnVuY3Rpb24odCl7cysrLHZvaWQgMCE9PXIub25Qcm9ncmVzcyYmci5vblByb2dyZXNzKHQscyxhKSxzPT09YSYmKG89ITEsdm9pZCAwIT09ci5vbkxvYWQmJnIub25Mb2FkKCkpfSx0aGlzLml0ZW1FcnJvcj1mdW5jdGlvbih0KXt2b2lkIDAhPT1yLm9uRXJyb3ImJnIub25FcnJvcih0KX0sdGhpcy5yZXNvbHZlVVJMPWZ1bmN0aW9uKHQpe3JldHVybiBpP2kodCk6dH0sdGhpcy5zZXRVUkxNb2RpZmllcj1mdW5jdGlvbih0KXtyZXR1cm4gaT10LHRoaXN9LHRoaXMuYWRkSGFuZGxlcj1mdW5jdGlvbih0LGUpe3JldHVybiB1LnB1c2godCxlKSx0aGlzfSx0aGlzLnJlbW92ZUhhbmRsZXI9ZnVuY3Rpb24odCl7Y29uc3QgZT11LmluZGV4T2YodCk7cmV0dXJuLTEhPT1lJiZ1LnNwbGljZShlLDIpLHRoaXN9LHRoaXMuZ2V0SGFuZGxlcj1mdW5jdGlvbih0KXtmb3IobGV0IGU9MCxuPXUubGVuZ3RoO2U8bjtlKz0yKXtjb25zdCBuPXVbZV0scj11W2UrMV07aWYobi5nbG9iYWwmJihuLmxhc3RJbmRleD0wKSxuLnRlc3QodCkpcmV0dXJuIHJ9cmV0dXJuIG51bGx9fX07Y2xhc3MgVGZ7Y29uc3RydWN0b3IodCl7dGhpcy5tYW5hZ2VyPXZvaWQgMCE9PXQ/dDpGZix0aGlzLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLHRoaXMud2l0aENyZWRlbnRpYWxzPSExLHRoaXMucGF0aD0iIix0aGlzLnJlc291cmNlUGF0aD0iIix0aGlzLnJlcXVlc3RIZWFkZXI9e319bG9hZCgpe31sb2FkQXN5bmModCxlKXtjb25zdCBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLGkpe24ubG9hZCh0LHIsZSxpKX0pKX1wYXJzZSgpe31zZXRDcm9zc09yaWdpbih0KXtyZXR1cm4gdGhpcy5jcm9zc09yaWdpbj10LHRoaXN9c2V0V2l0aENyZWRlbnRpYWxzKHQpe3JldHVybiB0aGlzLndpdGhDcmVkZW50aWFscz10LHRoaXN9c2V0UGF0aCh0KXtyZXR1cm4gdGhpcy5wYXRoPXQsdGhpc31zZXRSZXNvdXJjZVBhdGgodCl7cmV0dXJuIHRoaXMucmVzb3VyY2VQYXRoPXQsdGhpc31zZXRSZXF1ZXN0SGVhZGVyKHQpe3JldHVybiB0aGlzLnJlcXVlc3RIZWFkZXI9dCx0aGlzfX1UZi5ERUZBVUxUX01BVEVSSUFMX05BTUU9Il9fREVGQVVMVCI7RXJyb3I7ZnVuY3Rpb24gT2YoKXtyZXR1cm4gT2Y9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1hcmd1bWVudHNbZV07Zm9yKHZhciByIGluIG4pKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJih0W3JdPW5bcl0pfXJldHVybiB0fSxPZi5hcHBseShudWxsLGFyZ3VtZW50cyl9InVuZGVmaW5lZCIhPXR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18mJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicmVnaXN0ZXIiLHtkZXRhaWw6e3JldmlzaW9uOiIxNjcifX0pKSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5fX1RIUkVFX198fCh3aW5kb3cuX19USFJFRV9fPSIxNjciKSk7dmFyIExmPXtlcHNpbG9uOjFlLTEyLG1hdHJpeDoiTWF0cml4IixudW1iZXI6Im51bWJlciIscHJlY2lzaW9uOjY0LHByZWRpY3RhYmxlOiExLHJhbmRvbVNlZWQ6bnVsbH07ZnVuY3Rpb24gUGYodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fWZ1bmN0aW9uIFJmKHQpe3JldHVybiEoIXR8fCJvYmplY3QiIT10eXBlb2YgdHx8ImZ1bmN0aW9uIiE9dHlwZW9mIHQuY29uc3RydWN0b3IpJiYoITA9PT10LmlzQmlnTnVtYmVyJiYib2JqZWN0Ij09dHlwZW9mIHQuY29uc3RydWN0b3IucHJvdG90eXBlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzQmlnTnVtYmVyfHwiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3Rvci5pc0RlY2ltYWwmJiEwPT09dC5jb25zdHJ1Y3Rvci5pc0RlY2ltYWwodCkpfWZ1bmN0aW9uIEJmKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJiEwPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpLmlzQ29tcGxleHx8ITF9ZnVuY3Rpb24ga2YodCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdCYmITA9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCkuaXNGcmFjdGlvbnx8ITF9ZnVuY3Rpb24gemYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNVbml0fHwhMX1mdW5jdGlvbiBqZih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9dmFyIFVmPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gcWYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNNYXRyaXh8fCExfWZ1bmN0aW9uIFZmKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpfHxxZih0KX1mdW5jdGlvbiBHZih0KXtyZXR1cm4gdCYmdC5pc0RlbnNlTWF0cml4JiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTWF0cml4fHwhMX1mdW5jdGlvbiBZZih0KXtyZXR1cm4gdCYmdC5pc1NwYXJzZU1hdHJpeCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc01hdHJpeHx8ITF9ZnVuY3Rpb24gWGYodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNSYW5nZXx8ITF9ZnVuY3Rpb24gV2YodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNJbmRleHx8ITF9ZnVuY3Rpb24gSGYodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdH1mdW5jdGlvbiBaZih0KXtyZXR1cm4gdCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc1Jlc3VsdFNldHx8ITF9ZnVuY3Rpb24gS2YodCl7cmV0dXJuIHQmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNIZWxwfHwhMX1mdW5jdGlvbiBKZih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBRZih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGV9ZnVuY3Rpb24gJGYodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBSZWdFeHB9ZnVuY3Rpb24gdHAodCl7cmV0dXJuISghdHx8Im9iamVjdCIhPXR5cGVvZiB0fHx0LmNvbnN0cnVjdG9yIT09T2JqZWN0fHxCZih0KXx8a2YodCkpfWZ1bmN0aW9uIGVwKHQpe3JldHVybiBudWxsPT09dH1mdW5jdGlvbiBucCh0KXtyZXR1cm4gdm9pZCAwPT09dH1mdW5jdGlvbiBycCh0KXtyZXR1cm4gdCYmITA9PT10LmlzQWNjZXNzb3JOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gaXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0FycmF5Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIG9wKHQpe3JldHVybiB0JiYhMD09PXQuaXNBc3NpZ25tZW50Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIHNwKHQpe3JldHVybiB0JiYhMD09PXQuaXNCbG9ja05vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBhcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzQ29uZGl0aW9uYWxOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gdXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0NvbnN0YW50Tm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGNwKHQpe3JldHVybiB0JiYhMD09PXQuaXNGdW5jdGlvbkFzc2lnbm1lbnROb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gbHAodCl7cmV0dXJuIHQmJiEwPT09dC5pc0Z1bmN0aW9uTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGhwKHQpe3JldHVybiB0JiYhMD09PXQuaXNJbmRleE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBmcCh0KXtyZXR1cm4gdCYmITA9PT10LmlzTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIHBwKHQpe3JldHVybiB0JiYhMD09PXQuaXNPYmplY3ROb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gZHAodCl7cmV0dXJuIHQmJiEwPT09dC5pc09wZXJhdG9yTm9kZSYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc05vZGV8fCExfWZ1bmN0aW9uIGdwKHQpe3JldHVybiB0JiYhMD09PXQuaXNQYXJlbnRoZXNpc05vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiB5cCh0KXtyZXR1cm4gdCYmITA9PT10LmlzUmFuZ2VOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gbXAodCl7cmV0dXJuIHQmJiEwPT09dC5pc1JlbGF0aW9uYWxOb2RlJiYhMD09PXQuY29uc3RydWN0b3IucHJvdG90eXBlLmlzTm9kZXx8ITF9ZnVuY3Rpb24gdnAodCl7cmV0dXJuIHQmJiEwPT09dC5pc1N5bWJvbE5vZGUmJiEwPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuaXNOb2RlfHwhMX1mdW5jdGlvbiBfcCh0KXtyZXR1cm4gdCYmITA9PT10LmNvbnN0cnVjdG9yLnByb3RvdHlwZS5pc0NoYWlufHwhMX1mdW5jdGlvbiB4cCh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ib2JqZWN0Ij09PWU/bnVsbD09PXQ/Im51bGwiOlJmKHQpPyJCaWdOdW1iZXIiOnQuY29uc3RydWN0b3ImJnQuY29uc3RydWN0b3IubmFtZT90LmNvbnN0cnVjdG9yLm5hbWU6Ik9iamVjdCI6ZX1mdW5jdGlvbiB3cCh0KXt2YXIgZT10eXBlb2YgdDtpZigibnVtYmVyIj09PWV8fCJzdHJpbmciPT09ZXx8ImJvb2xlYW4iPT09ZXx8bnVsbD09dClyZXR1cm4gdDtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5jbG9uZSlyZXR1cm4gdC5jbG9uZSgpO2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gd3AodCl9KSk7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIG5ldyBEYXRlKHQudmFsdWVPZigpKTtpZihSZih0KSlyZXR1cm4gdDtpZih0IGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjbG9uZSAiK3QpO3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiB0KURwKHQscikmJihuW3JdPWUodFtyXSkpO3JldHVybiBufSh0LHdwKX1mdW5jdGlvbiBicCh0LGUpe3ZhciBuLHIsaTtpZihBcnJheS5pc0FycmF5KHQpKXtpZighQXJyYXkuaXNBcnJheShlKXx8dC5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm4hMTtmb3Iocj0wLGk9dC5sZW5ndGg7cjxpO3IrKylpZighYnAodFtyXSxlW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1pZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gdD09PWU7aWYodCBpbnN0YW5jZW9mIE9iamVjdCl7aWYoQXJyYXkuaXNBcnJheShlKXx8IShlIGluc3RhbmNlb2YgT2JqZWN0KSlyZXR1cm4hMTtmb3IobiBpbiB0KWlmKCEobiBpbiBlKXx8IWJwKHRbbl0sZVtuXSkpcmV0dXJuITE7Zm9yKG4gaW4gZSlpZighKG4gaW4gdCkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHQ9PT1lfWZ1bmN0aW9uIERwKHQsZSl7cmV0dXJuIHQmJk9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9dmFyIEVwPWZ1bmN0aW9uKHQpe2lmKHQpdGhyb3cgbmV3IEVycm9yKCJUaGUgZ2xvYmFsIGNvbmZpZyBpcyByZWFkb25seS4gXG5QbGVhc2UgY3JlYXRlIGEgbWF0aGpzIGluc3RhbmNlIGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLiBcbkV4YW1wbGU6XG5cbiAgaW1wb3J0IHsgY3JlYXRlLCBhbGwgfSBmcm9tICdtYXRoanMnO1xuICBjb25zdCBtYXRoanMgPSBjcmVhdGUoYWxsKTtcbiAgbWF0aGpzLmNvbmZpZyh7IG51bWJlcjogJ0JpZ051bWJlcicgfSk7XG4iKTtyZXR1cm4gT2JqZWN0LmZyZWV6ZShMZil9O2Z1bmN0aW9uIENwKCl7cmV0dXJuITB9ZnVuY3Rpb24gU3AoKXtyZXR1cm4hMX1mdW5jdGlvbiBBcCgpe31PZihFcCxMZix7TUFUUklYX09QVElPTlM6WyJNYXRyaXgiLCJBcnJheSJdLE5VTUJFUl9PUFRJT05TOlsibnVtYmVyIiwiQmlnTnVtYmVyIiwiRnJhY3Rpb24iXX0pO2NvbnN0IE5wPSJBcmd1bWVudCBpcyBub3QgYSB0eXBlZC1mdW5jdGlvbi4iO3ZhciBJcD1mdW5jdGlvbiB0KCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10JiZ0LmNvbnN0cnVjdG9yPT09T2JqZWN0fWNvbnN0IG49W3tuYW1lOiJudW1iZXIiLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fX0se25hbWU6InN0cmluZyIsdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR9fSx7bmFtZToiYm9vbGVhbiIsdGVzdDpmdW5jdGlvbih0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0fX0se25hbWU6IkZ1bmN0aW9uIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fX0se25hbWU6IkFycmF5Iix0ZXN0OkFycmF5LmlzQXJyYXl9LHtuYW1lOiJEYXRlIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZX19LHtuYW1lOiJSZWdFeHAiLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBSZWdFeHB9fSx7bmFtZToiT2JqZWN0Iix0ZXN0OmV9LHtuYW1lOiJudWxsIix0ZXN0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dH19LHtuYW1lOiJ1bmRlZmluZWQiLHRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXR9fV0scj17bmFtZToiYW55Iix0ZXN0OkNwLGlzQW55OiEwfTtsZXQgaSxvLHM9MCxhPXtjcmVhdGVDb3VudDowfTtmdW5jdGlvbiB1KHQpe2NvbnN0IGU9aS5nZXQodCk7aWYoZSlyZXR1cm4gZTtsZXQgbj0nVW5rbm93biB0eXBlICInK3QrJyInO2NvbnN0IHI9dC50b0xvd2VyQ2FzZSgpO2xldCBzO2ZvcihzIG9mIG8paWYocy50b0xvd2VyQ2FzZSgpPT09cil7bis9Jy4gRGlkIHlvdSBtZWFuICInK3MrJyIgPyc7YnJlYWt9dGhyb3cgbmV3IFR5cGVFcnJvcihuKX1mdW5jdGlvbiBjKHQpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToiYW55Ijtjb25zdCBuPWU/dShlKS5pbmRleDpvLmxlbmd0aCxyPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXtpZighdFtlXXx8InN0cmluZyIhPXR5cGVvZiB0W2VdLm5hbWV8fCJmdW5jdGlvbiIhPXR5cGVvZiB0W2VdLnRlc3QpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IHdpdGggcHJvcGVydGllcyB7bmFtZTogc3RyaW5nLCB0ZXN0OiBmdW5jdGlvbn0gZXhwZWN0ZWQiKTtjb25zdCBvPXRbZV0ubmFtZTtpZihpLmhhcyhvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdEdXBsaWNhdGUgdHlwZSBuYW1lICInK28rJyInKTtyLnB1c2gobyksaS5zZXQobyx7bmFtZTpvLHRlc3Q6dFtlXS50ZXN0LGlzQW55OnRbZV0uaXNBbnksaW5kZXg6bitlLGNvbnZlcnNpb25zVG86W119KX1jb25zdCBzPW8uc2xpY2Uobik7bz1vLnNsaWNlKDAsbikuY29uY2F0KHIpLmNvbmNhdChzKTtmb3IobGV0IHQ9bityLmxlbmd0aDt0PG8ubGVuZ3RoOysrdClpLmdldChvW3RdKS5pbmRleD10fWZ1bmN0aW9uIGwoKXtpPW5ldyBNYXAsbz1bXSxzPTAsYyhbcl0sITEpfWZ1bmN0aW9uIGgodCl7Y29uc3QgZT1vLmZpbHRlcigoZT0+e2NvbnN0IG49aS5nZXQoZSk7cmV0dXJuIW4uaXNBbnkmJm4udGVzdCh0KX0pKTtyZXR1cm4gZS5sZW5ndGg/ZTpbImFueSJdfWZ1bmN0aW9uIGYodCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYiX3R5cGVkRnVuY3Rpb25EYXRhImluIHR9ZnVuY3Rpb24gcCh0LGUsbil7aWYoIWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcihOcCk7Y29uc3Qgcj1uJiZuLmV4YWN0LGk9dihBcnJheS5pc0FycmF5KGUpP2Uuam9pbigiLCIpOmUpLG89ZChpKTtpZighcnx8byBpbiB0LnNpZ25hdHVyZXMpe2NvbnN0IGU9dC5fdHlwZWRGdW5jdGlvbkRhdGEuc2lnbmF0dXJlTWFwLmdldChvKTtpZihlKXJldHVybiBlfWNvbnN0IHM9aS5sZW5ndGg7bGV0IGEsdTtpZihyKXtsZXQgZTtmb3IoZSBpbiBhPVtdLHQuc2lnbmF0dXJlcylhLnB1c2godC5fdHlwZWRGdW5jdGlvbkRhdGEuc2lnbmF0dXJlTWFwLmdldChlKSl9ZWxzZSBhPXQuX3R5cGVkRnVuY3Rpb25EYXRhLnNpZ25hdHVyZXM7Zm9yKGxldCB0PTA7dDxzOysrdCl7Y29uc3QgZT1pW3RdLG49W107bGV0IHI7Zm9yKHIgb2YgYSl7Y29uc3QgaT1iKHIucGFyYW1zLHQpO2lmKGkmJighZS5yZXN0UGFyYW18fGkucmVzdFBhcmFtKSl7aWYoIWkuaGFzQW55KXtjb25zdCB0PW0oaSk7aWYoZS50eXBlcy5zb21lKChlPT4hdC5oYXMoZS5uYW1lKSkpKWNvbnRpbnVlfW4ucHVzaChyKX19aWYoYT1uLDA9PT1hLmxlbmd0aClicmVha31mb3IodSBvZiBhKWlmKHUucGFyYW1zLmxlbmd0aDw9cylyZXR1cm4gdTt0aHJvdyBuZXcgVHlwZUVycm9yKCJTaWduYXR1cmUgbm90IGZvdW5kIChzaWduYXR1cmU6ICIrKHQubmFtZXx8InVubmFtZWQiKSsiKCIrZChpLCIsICIpKyIpKSIpfWZ1bmN0aW9uIGQodCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiIsIjtyZXR1cm4gdC5tYXAoKHQ9PnQubmFtZSkpLmpvaW4oZSl9ZnVuY3Rpb24gZyh0KXtjb25zdCBlPTA9PT10LmluZGV4T2YoIi4uLiIpLG49KGU/dC5sZW5ndGg+Mz90LnNsaWNlKDMpOiJhbnkiOnQpLnNwbGl0KCJ8IikubWFwKCh0PT51KHQudHJpbSgpKSkpO2xldCByPSExLGk9ZT8iLi4uIjoiIjtyZXR1cm57dHlwZXM6bi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiByPXQuaXNBbnl8fHIsaSs9dC5uYW1lKyJ8Iix7bmFtZTp0Lm5hbWUsdHlwZUluZGV4OnQuaW5kZXgsdGVzdDp0LnRlc3QsaXNBbnk6dC5pc0FueSxjb252ZXJzaW9uOm51bGwsY29udmVyc2lvbkluZGV4Oi0xfX0pKSxuYW1lOmkuc2xpY2UoMCwtMSksaGFzQW55OnIsaGFzQ29udmVyc2lvbjohMSxyZXN0UGFyYW06ZX19ZnVuY3Rpb24geSh0KXtjb25zdCBlPWZ1bmN0aW9uKHQpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm5bXTtjb25zdCBlPXQubWFwKHUpO3QubGVuZ3RoPjEmJmUuc29ydCgoKHQsZSk9PnQuaW5kZXgtZS5pbmRleCkpO2xldCBuPWVbMF0uY29udmVyc2lvbnNUbztpZigxPT09dC5sZW5ndGgpcmV0dXJuIG47bj1uLmNvbmNhdChbXSk7Y29uc3Qgcj1uZXcgU2V0KHQpO2ZvcihsZXQgdD0xO3Q8ZS5sZW5ndGg7Kyt0KXtsZXQgaTtmb3IoaSBvZiBlW3RdLmNvbnZlcnNpb25zVG8pci5oYXMoaS5mcm9tKXx8KG4ucHVzaChpKSxyLmFkZChpLmZyb20pKX1yZXR1cm4gbn0odC50eXBlcy5tYXAoKHQ9PnQubmFtZSkpKTtsZXQgbj10Lmhhc0FueSxyPXQubmFtZTtjb25zdCBpPWUubWFwKChmdW5jdGlvbih0KXtjb25zdCBlPXUodC5mcm9tKTtyZXR1cm4gbj1lLmlzQW55fHxuLHIrPSJ8Iit0LmZyb20se25hbWU6dC5mcm9tLHR5cGVJbmRleDplLmluZGV4LHRlc3Q6ZS50ZXN0LGlzQW55OmUuaXNBbnksY29udmVyc2lvbjp0LGNvbnZlcnNpb25JbmRleDp0LmluZGV4fX0pKTtyZXR1cm57dHlwZXM6dC50eXBlcy5jb25jYXQoaSksbmFtZTpyLGhhc0FueTpuLGhhc0NvbnZlcnNpb246aS5sZW5ndGg+MCxyZXN0UGFyYW06dC5yZXN0UGFyYW19fWZ1bmN0aW9uIG0odCl7cmV0dXJuIHQudHlwZVNldHx8KHQudHlwZVNldD1uZXcgU2V0LHQudHlwZXMuZm9yRWFjaCgoZT0+dC50eXBlU2V0LmFkZChlLm5hbWUpKSkpLHQudHlwZVNldH1mdW5jdGlvbiB2KHQpe2NvbnN0IGU9W107aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIlNpZ25hdHVyZXMgbXVzdCBiZSBzdHJpbmdzIik7Y29uc3Qgbj10LnRyaW0oKTtpZigiIj09PW4pcmV0dXJuIGU7Y29uc3Qgcj1uLnNwbGl0KCIsIik7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDsrK3Qpe2NvbnN0IG49ZyhyW3RdLnRyaW0oKSk7aWYobi5yZXN0UGFyYW0mJnQhPT1yLmxlbmd0aC0xKXRocm93IG5ldyBTeW50YXhFcnJvcignVW5leHBlY3RlZCByZXN0IHBhcmFtZXRlciAiJytyW3RdKyciOiBvbmx5IGFsbG93ZWQgZm9yIHRoZSBsYXN0IHBhcmFtZXRlcicpO2lmKDA9PT1uLnR5cGVzLmxlbmd0aClyZXR1cm4gbnVsbDtlLnB1c2gobil9cmV0dXJuIGV9ZnVuY3Rpb24gXyh0KXtjb25zdCBlPWoodCk7cmV0dXJuISFlJiZlLnJlc3RQYXJhbX1mdW5jdGlvbiB4KHQpe2lmKCF0fHwwPT09dC50eXBlcy5sZW5ndGgpcmV0dXJuIENwO2lmKDE9PT10LnR5cGVzLmxlbmd0aClyZXR1cm4gdSh0LnR5cGVzWzBdLm5hbWUpLnRlc3Q7aWYoMj09PXQudHlwZXMubGVuZ3RoKXtjb25zdCBlPXUodC50eXBlc1swXS5uYW1lKS50ZXN0LG49dSh0LnR5cGVzWzFdLm5hbWUpLnRlc3Q7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfHxuKHQpfX17Y29uc3QgZT10LnR5cGVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHUodC5uYW1lKS50ZXN0fSkpO3JldHVybiBmdW5jdGlvbih0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylpZihlW25dKHQpKXJldHVybiEwO3JldHVybiExfX19ZnVuY3Rpb24gdyh0KXtsZXQgZSxuLHI7aWYoXyh0KSl7ZT16KHQpLm1hcCh4KTtjb25zdCBuPWUubGVuZ3RoLHI9eChqKHQpKSxpPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT1uO2U8dC5sZW5ndGg7ZSsrKWlmKCFyKHRbZV0pKXJldHVybiExO3JldHVybiEwfTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYoIWVbbl0odFtuXSkpcmV0dXJuITE7cmV0dXJuIGkodCkmJnQubGVuZ3RoPj1uKzF9fXJldHVybiAwPT09dC5sZW5ndGg/ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10Lmxlbmd0aH06MT09PXQubGVuZ3RoPyhuPXgodFswXSksZnVuY3Rpb24odCl7cmV0dXJuIG4odFswXSkmJjE9PT10Lmxlbmd0aH0pOjI9PT10Lmxlbmd0aD8obj14KHRbMF0pLHI9eCh0WzFdKSxmdW5jdGlvbih0KXtyZXR1cm4gbih0WzBdKSYmcih0WzFdKSYmMj09PXQubGVuZ3RofSk6KGU9dC5tYXAoeCksZnVuY3Rpb24odCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYoIWVbbl0odFtuXSkpcmV0dXJuITE7cmV0dXJuIHQubGVuZ3RoPT09ZS5sZW5ndGh9KX1mdW5jdGlvbiBiKHQsZSl7cmV0dXJuIGU8dC5sZW5ndGg/dFtlXTpfKHQpP2oodCk6bnVsbH1mdW5jdGlvbiBEKHQsZSl7Y29uc3Qgbj1iKHQsZSk7cmV0dXJuIG4/bShuKTpuZXcgU2V0fWZ1bmN0aW9uIEUodCl7cmV0dXJuIG51bGw9PT10LmNvbnZlcnNpb258fHZvaWQgMD09PXQuY29udmVyc2lvbn1mdW5jdGlvbiBDKHQsZSl7Y29uc3Qgbj1uZXcgU2V0O3JldHVybiB0LmZvckVhY2goKHQ9Pntjb25zdCByPUQodC5wYXJhbXMsZSk7bGV0IGk7Zm9yKGkgb2YgciluLmFkZChpKX0pKSxuLmhhcygiYW55Iik/WyJhbnkiXTpBcnJheS5mcm9tKG4pfWZ1bmN0aW9uIFModCxlLG4pe2xldCByLGk7Y29uc3Qgbz10fHwidW5uYW1lZCI7bGV0IHMsYT1uO2ZvcihzPTA7czxlLmxlbmd0aDtzKyspe2NvbnN0IHQ9W107aWYoYS5mb3JFYWNoKChuPT57Y29uc3Qgcj14KGIobi5wYXJhbXMscykpOyhzPG4ucGFyYW1zLmxlbmd0aHx8XyhuLnBhcmFtcykpJiZyKGVbc10pJiZ0LnB1c2gobil9KSksMD09PXQubGVuZ3RoKXtpZihpPUMoYSxzKSxpLmxlbmd0aD4wKXtjb25zdCB0PWgoZVtzXSk7cmV0dXJuIHI9bmV3IFR5cGVFcnJvcigiVW5leHBlY3RlZCB0eXBlIG9mIGFyZ3VtZW50IGluIGZ1bmN0aW9uICIrbysiIChleHBlY3RlZDogIitpLmpvaW4oIiBvciAiKSsiLCBhY3R1YWw6ICIrdC5qb2luKCIgfCAiKSsiLCBpbmRleDogIitzKyIpIiksci5kYXRhPXtjYXRlZ29yeToid3JvbmdUeXBlIixmbjpvLGluZGV4OnMsYWN0dWFsOnQsZXhwZWN0ZWQ6aX0scn19ZWxzZSBhPXR9Y29uc3QgdT1hLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIF8odC5wYXJhbXMpPzEvMDp0LnBhcmFtcy5sZW5ndGh9KSk7aWYoZS5sZW5ndGg8TWF0aC5taW4uYXBwbHkobnVsbCx1KSlyZXR1cm4gaT1DKGEscykscj1uZXcgVHlwZUVycm9yKCJUb28gZmV3IGFyZ3VtZW50cyBpbiBmdW5jdGlvbiAiK28rIiAoZXhwZWN0ZWQ6ICIraS5qb2luKCIgb3IgIikrIiwgaW5kZXg6ICIrZS5sZW5ndGgrIikiKSxyLmRhdGE9e2NhdGVnb3J5OiJ0b29GZXdBcmdzIixmbjpvLGluZGV4OmUubGVuZ3RoLGV4cGVjdGVkOml9LHI7Y29uc3QgYz1NYXRoLm1heC5hcHBseShudWxsLHUpO2lmKGUubGVuZ3RoPmMpcmV0dXJuIHI9bmV3IFR5cGVFcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIGluIGZ1bmN0aW9uICIrbysiIChleHBlY3RlZDogIitjKyIsIGFjdHVhbDogIitlLmxlbmd0aCsiKSIpLHIuZGF0YT17Y2F0ZWdvcnk6InRvb01hbnlBcmdzIixmbjpvLGluZGV4OmUubGVuZ3RoLGV4cGVjdGVkTGVuZ3RoOmN9LHI7Y29uc3QgbD1bXTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdClsLnB1c2goaChlW3RdKS5qb2luKCJ8IikpO3JldHVybiByPW5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBvZiB0eXBlICInK2wuam9pbigiLCAiKSsnIiBkbyBub3QgbWF0Y2ggYW55IG9mIHRoZSBkZWZpbmVkIHNpZ25hdHVyZXMgb2YgZnVuY3Rpb24gJytvKyIuIiksci5kYXRhPXtjYXRlZ29yeToibWlzbWF0Y2giLGFjdHVhbDpsfSxyfWZ1bmN0aW9uIEEodCl7bGV0IGU9by5sZW5ndGgrMTtmb3IobGV0IG49MDtuPHQudHlwZXMubGVuZ3RoO24rKylFKHQudHlwZXNbbl0pJiYoZT1NYXRoLm1pbihlLHQudHlwZXNbbl0udHlwZUluZGV4KSk7cmV0dXJuIGV9ZnVuY3Rpb24gTih0KXtsZXQgZT1zKzE7Zm9yKGxldCBuPTA7bjx0LnR5cGVzLmxlbmd0aDtuKyspRSh0LnR5cGVzW25dKXx8KGU9TWF0aC5taW4oZSx0LnR5cGVzW25dLmNvbnZlcnNpb25JbmRleCkpO3JldHVybiBlfWZ1bmN0aW9uIEkodCxlKXtpZih0Lmhhc0FueSl7aWYoIWUuaGFzQW55KXJldHVybiAxfWVsc2UgaWYoZS5oYXNBbnkpcmV0dXJuLTE7aWYodC5yZXN0UGFyYW0pe2lmKCFlLnJlc3RQYXJhbSlyZXR1cm4gMX1lbHNlIGlmKGUucmVzdFBhcmFtKXJldHVybi0xO2lmKHQuaGFzQ29udmVyc2lvbil7aWYoIWUuaGFzQ29udmVyc2lvbilyZXR1cm4gMX1lbHNlIGlmKGUuaGFzQ29udmVyc2lvbilyZXR1cm4tMTtjb25zdCBuPUEodCktQShlKTtpZihuPDApcmV0dXJuLTE7aWYobj4wKXJldHVybiAxO2NvbnN0IHI9Tih0KS1OKGUpO3JldHVybiByPDA/LTE6cj4wPzE6MH1mdW5jdGlvbiBNKHQsZSl7Y29uc3Qgbj10LnBhcmFtcyxyPWUucGFyYW1zLGk9aihuKSxvPWoocikscz1fKG4pLGE9XyhyKTtpZihzJiZpLmhhc0FueSl7aWYoIWF8fCFvLmhhc0FueSlyZXR1cm4gMX1lbHNlIGlmKGEmJm8uaGFzQW55KXJldHVybi0xO2xldCB1LGM9MCxsPTA7Zm9yKHUgb2Ygbil1Lmhhc0FueSYmKytjLHUuaGFzQ29udmVyc2lvbiYmKytsO2xldCBoPTAsZj0wO2Zvcih1IG9mIHIpdS5oYXNBbnkmJisraCx1Lmhhc0NvbnZlcnNpb24mJisrZjtpZihjIT09aClyZXR1cm4gYy1oO2lmKHMmJmkuaGFzQ29udmVyc2lvbil7aWYoIWF8fCFvLmhhc0NvbnZlcnNpb24pcmV0dXJuIDF9ZWxzZSBpZihhJiZvLmhhc0NvbnZlcnNpb24pcmV0dXJuLTE7aWYobCE9PWYpcmV0dXJuIGwtZjtpZihzKXtpZighYSlyZXR1cm4gMX1lbHNlIGlmKGEpcmV0dXJuLTE7Y29uc3QgcD0obi5sZW5ndGgtci5sZW5ndGgpKihzPy0xOjEpO2lmKDAhPT1wKXJldHVybiBwO2NvbnN0IGQ9W107bGV0IGcseT0wO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7Kyt0KXtjb25zdCBlPUkoblt0XSxyW3RdKTtkLnB1c2goZSkseSs9ZX1pZigwIT09eSlyZXR1cm4geTtmb3IoZyBvZiBkKWlmKDAhPT1nKXJldHVybiBnO3JldHVybiAwfWZ1bmN0aW9uIEYodCxlKXtsZXQgbj1lO2lmKHQuc29tZSgodD0+dC5oYXNDb252ZXJzaW9uKSkpe2NvbnN0IHI9Xyh0KSxpPXQubWFwKFQpO249ZnVuY3Rpb24oKXtjb25zdCB0PVtdLG49cj9hcmd1bWVudHMubGVuZ3RoLTE6YXJndW1lbnRzLmxlbmd0aDtmb3IobGV0IGU9MDtlPG47ZSsrKXRbZV09aVtlXShhcmd1bWVudHNbZV0pO3JldHVybiByJiYodFtuXT1hcmd1bWVudHNbbl0ubWFwKGlbbl0pKSxlLmFwcGx5KHRoaXMsdCl9fWxldCByPW47aWYoXyh0KSl7Y29uc3QgZT10Lmxlbmd0aC0xO3I9ZnVuY3Rpb24oKXtyZXR1cm4gbi5hcHBseSh0aGlzLFUoYXJndW1lbnRzLDAsZSkuY29uY2F0KFtVKGFyZ3VtZW50cyxlKV0pKX19cmV0dXJuIHJ9ZnVuY3Rpb24gVCh0KXtsZXQgZSxuLHIsaTtjb25zdCBvPVtdLHM9W107c3dpdGNoKHQudHlwZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jb252ZXJzaW9uJiYoby5wdXNoKHUodC5jb252ZXJzaW9uLmZyb20pLnRlc3QpLHMucHVzaCh0LmNvbnZlcnNpb24uY29udmVydCkpfSkpLHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0fTtjYXNlIDE6cmV0dXJuIGU9b1swXSxyPXNbMF0sZnVuY3Rpb24odCl7cmV0dXJuIGUodCk/cih0KTp0fTtjYXNlIDI6cmV0dXJuIGU9b1swXSxuPW9bMV0scj1zWzBdLGk9c1sxXSxmdW5jdGlvbih0KXtyZXR1cm4gZSh0KT9yKHQpOm4odCk/aSh0KTp0fTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbih0KXtmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKylpZihvW2VdKHQpKXJldHVybiBzW2VdKHQpO3JldHVybiB0fX19ZnVuY3Rpb24gTyh0KXtyZXR1cm4gZnVuY3Rpb24gdChlLG4scil7aWYobjxlLmxlbmd0aCl7Y29uc3QgaT1lW25dO2xldCBvPVtdO2lmKGkucmVzdFBhcmFtKXtjb25zdCB0PWkudHlwZXMuZmlsdGVyKEUpO3QubGVuZ3RoPGkudHlwZXMubGVuZ3RoJiZvLnB1c2goe3R5cGVzOnQsbmFtZToiLi4uIit0Lm1hcCgodD0+dC5uYW1lKSkuam9pbigifCIpLGhhc0FueTp0LnNvbWUoKHQ9PnQuaXNBbnkpKSxoYXNDb252ZXJzaW9uOiExLHJlc3RQYXJhbTohMH0pLG8ucHVzaChpKX1lbHNlIG89aS50eXBlcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlczpbdF0sbmFtZTp0Lm5hbWUsaGFzQW55OnQuaXNBbnksaGFzQ29udmVyc2lvbjp0LmNvbnZlcnNpb24scmVzdFBhcmFtOiExfX0pKTtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSx0Lm1hcChlKSl9KG8sKGZ1bmN0aW9uKGkpe3JldHVybiB0KGUsbisxLHIuY29uY2F0KFtpXSkpfSkpfXJldHVybltyXX0odCwwLFtdKX1mdW5jdGlvbiBMKHQsZSl7Y29uc3Qgbj1NYXRoLm1heCh0Lmxlbmd0aCxlLmxlbmd0aCk7Zm9yKGxldCByPTA7cjxuO3IrKyl7Y29uc3Qgbj1EKHQsciksaT1EKGUscik7bGV0IG8scz0hMTtmb3IobyBvZiBpKWlmKG4uaGFzKG8pKXtzPSEwO2JyZWFrfWlmKCFzKXJldHVybiExfWNvbnN0IHI9dC5sZW5ndGgsaT1lLmxlbmd0aCxvPV8odCkscz1fKGUpO3JldHVybiBvP3M/cj09PWk6aT49cjpzP3I+PWk6cj09PWl9ZnVuY3Rpb24gUCh0LGUsbil7Y29uc3Qgcj1bXTtsZXQgaTtmb3IoaSBvZiB0KXtsZXQgdD1uW2ldO2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBkZWZpbml0aW9uIGZvciByZWZlcmVuY2VkIHNpZ25hdHVyZSAiJytpKyciJyk7aWYodD1lW3RdLCJmdW5jdGlvbiIhPXR5cGVvZiB0KXJldHVybiExO3IucHVzaCh0KX1yZXR1cm4gcn1mdW5jdGlvbiBSKHQsZSxuKXtjb25zdCByPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcCgodD0+WSh0KT9WKHQucmVmZXJUb1NlbGYuY2FsbGJhY2spOkcodCk/cSh0LnJlZmVyVG8ucmVmZXJlbmNlcyx0LnJlZmVyVG8uY2FsbGJhY2spOnQpKX0odCksaT1uZXcgQXJyYXkoci5sZW5ndGgpLmZpbGwoITEpO2xldCBvPSEwO2Zvcig7bzspe289ITE7bGV0IHQ9ITA7Zm9yKGxldCBzPTA7czxyLmxlbmd0aDsrK3Mpe2lmKGlbc10pY29udGludWU7Y29uc3QgYT1yW3NdO2lmKFkoYSkpcltzXT1hLnJlZmVyVG9TZWxmLmNhbGxiYWNrKG4pLHJbc10ucmVmZXJUb1NlbGY9YS5yZWZlclRvU2VsZixpW3NdPSEwLHQ9ITE7ZWxzZSBpZihHKGEpKXtjb25zdCBuPVAoYS5yZWZlclRvLnJlZmVyZW5jZXMscixlKTtuPyhyW3NdPWEucmVmZXJUby5jYWxsYmFjay5hcHBseSh0aGlzLG4pLHJbc10ucmVmZXJUbz1hLnJlZmVyVG8saVtzXT0hMCx0PSExKTpvPSEwfX1pZih0JiZvKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluIHJlc29sdmluZyB0eXBlZC5yZWZlclRvIil9cmV0dXJuIHJ9ZnVuY3Rpb24gQih0LGUpe2lmKGEuY3JlYXRlQ291bnQrKywwPT09T2JqZWN0LmtleXMoZSkubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiTm8gc2lnbmF0dXJlcyBwcm92aWRlZCIpO2Eud2FybkFnYWluc3REZXByZWNhdGVkVGhpcyYmZnVuY3Rpb24odCl7Y29uc3QgZT0vXGJ0aGlzKFwofFwuc2lnbmF0dXJlc1xiKS87T2JqZWN0LmtleXModCkuZm9yRWFjaCgobj0+e2NvbnN0IHI9dFtuXTtpZihlLnRlc3Qoci50b1N0cmluZygpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVzaW5nIGB0aGlzYCB0byBzZWxmLXJlZmVyZW5jZSBhIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgc2luY2UgdHlwZWQtZnVuY3Rpb25AMy4gVXNlIHR5cGVkLnJlZmVyVG8gYW5kIHR5cGVkLnJlZmVyVG9TZWxmIGluc3RlYWQuIil9KSl9KGUpO2NvbnN0IG49W10scj1bXSxpPXt9LG89W107bGV0IHM7Zm9yKHMgaW4gZSl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHMpKWNvbnRpbnVlO2NvbnN0IHQ9dihzKTtpZighdCljb250aW51ZTtuLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKEwoZSx0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCdDb25mbGljdGluZyBzaWduYXR1cmVzICInK2QoZSkrJyIgYW5kICInK2QodCkrJyIuJyl9KSksbi5wdXNoKHQpO2NvbnN0IGE9ci5sZW5ndGg7ci5wdXNoKGVbc10pO2NvbnN0IHU9dC5tYXAoeSk7bGV0IGM7Zm9yKGMgb2YgTyh1KSl7Y29uc3QgdD1kKGMpO28ucHVzaCh7cGFyYW1zOmMsbmFtZTp0LGZuOmF9KSxjLmV2ZXJ5KCh0PT4hdC5oYXNDb252ZXJzaW9uKSkmJihpW3RdPWEpfX1vLnNvcnQoTSk7Y29uc3QgdT1SKHIsaSxvdCk7bGV0IGM7Zm9yKGMgaW4gaSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaSxjKSYmKGlbY109dVtpW2NdXSk7Y29uc3QgbD1bXSxoPW5ldyBNYXA7Zm9yKGMgb2YgbyloLmhhcyhjLm5hbWUpfHwoYy5mbj11W2MuZm5dLGwucHVzaChjKSxoLnNldChjLm5hbWUsYykpO2NvbnN0IGY9bFswXSYmbFswXS5wYXJhbXMubGVuZ3RoPD0yJiYhXyhsWzBdLnBhcmFtcykscD1sWzFdJiZsWzFdLnBhcmFtcy5sZW5ndGg8PTImJiFfKGxbMV0ucGFyYW1zKSxnPWxbMl0mJmxbMl0ucGFyYW1zLmxlbmd0aDw9MiYmIV8obFsyXS5wYXJhbXMpLG09bFszXSYmbFszXS5wYXJhbXMubGVuZ3RoPD0yJiYhXyhsWzNdLnBhcmFtcyksYj1sWzRdJiZsWzRdLnBhcmFtcy5sZW5ndGg8PTImJiFfKGxbNF0ucGFyYW1zKSxEPWxbNV0mJmxbNV0ucGFyYW1zLmxlbmd0aDw9MiYmIV8obFs1XS5wYXJhbXMpLEU9ZiYmcCYmZyYmbSYmYiYmRDtmb3IobGV0IHQ9MDt0PGwubGVuZ3RoOysrdClsW3RdLnRlc3Q9dyhsW3RdLnBhcmFtcyk7Y29uc3QgQz1mP3gobFswXS5wYXJhbXNbMF0pOlNwLFM9cD94KGxbMV0ucGFyYW1zWzBdKTpTcCxBPWc/eChsWzJdLnBhcmFtc1swXSk6U3AsTj1tP3gobFszXS5wYXJhbXNbMF0pOlNwLEk9Yj94KGxbNF0ucGFyYW1zWzBdKTpTcCxUPUQ/eChsWzVdLnBhcmFtc1swXSk6U3AsUD1mP3gobFswXS5wYXJhbXNbMV0pOlNwLEI9cD94KGxbMV0ucGFyYW1zWzFdKTpTcCxrPWc/eChsWzJdLnBhcmFtc1sxXSk6U3Asej1tP3gobFszXS5wYXJhbXNbMV0pOlNwLGo9Yj94KGxbNF0ucGFyYW1zWzFdKTpTcCxVPUQ/eChsWzVdLnBhcmFtc1sxXSk6U3A7Zm9yKGxldCB0PTA7dDxsLmxlbmd0aDsrK3QpbFt0XS5pbXBsZW1lbnRhdGlvbj1GKGxbdF0ucGFyYW1zLGxbdF0uZm4pO2NvbnN0IHE9Zj9sWzBdLmltcGxlbWVudGF0aW9uOkFwLFY9cD9sWzFdLmltcGxlbWVudGF0aW9uOkFwLEc9Zz9sWzJdLmltcGxlbWVudGF0aW9uOkFwLFk9bT9sWzNdLmltcGxlbWVudGF0aW9uOkFwLFg9Yj9sWzRdLmltcGxlbWVudGF0aW9uOkFwLFc9RD9sWzVdLmltcGxlbWVudGF0aW9uOkFwLEg9Zj9sWzBdLnBhcmFtcy5sZW5ndGg6LTEsWj1wP2xbMV0ucGFyYW1zLmxlbmd0aDotMSxLPWc/bFsyXS5wYXJhbXMubGVuZ3RoOi0xLEo9bT9sWzNdLnBhcmFtcy5sZW5ndGg6LTEsUT1iP2xbNF0ucGFyYW1zLmxlbmd0aDotMSwkPUQ/bFs1XS5wYXJhbXMubGVuZ3RoOi0xLHR0PUU/NjowLGV0PWwubGVuZ3RoLG50PWwubWFwKCh0PT50LnRlc3QpKSxydD1sLm1hcCgodD0+dC5pbXBsZW1lbnRhdGlvbikpLGl0PWZ1bmN0aW9uKCl7Zm9yKGxldCB0PXR0O3Q8ZXQ7dCsrKWlmKG50W3RdKGFyZ3VtZW50cykpcmV0dXJuIHJ0W3RdLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gYS5vbk1pc21hdGNoKHQsYXJndW1lbnRzLGwpfTtmdW5jdGlvbiBvdCh0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09SCYmQyh0KSYmUChlKT9xLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09WiYmUyh0KSYmQihlKT9WLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09SyYmQSh0KSYmayhlKT9HLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09SiYmTih0KSYmeihlKT9ZLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09USYmSSh0KSYmaihlKT9YLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHMubGVuZ3RoPT09JCYmVCh0KSYmVShlKT9XLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShvdCwibmFtZSIse3ZhbHVlOnR9KX1jYXRjaCh0KXt9cmV0dXJuIG90LnNpZ25hdHVyZXM9aSxvdC5fdHlwZWRGdW5jdGlvbkRhdGE9e3NpZ25hdHVyZXM6bCxzaWduYXR1cmVNYXA6aH0sb3R9ZnVuY3Rpb24gayh0LGUsbil7dGhyb3cgUyh0LGUsbil9ZnVuY3Rpb24geih0KXtyZXR1cm4gVSh0LDAsdC5sZW5ndGgtMSl9ZnVuY3Rpb24gaih0KXtyZXR1cm4gdFt0Lmxlbmd0aC0xXX1mdW5jdGlvbiBVKHQsZSxuKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCxlLG4pfWZ1bmN0aW9uIHEodCxlKXtyZXR1cm57cmVmZXJUbzp7cmVmZXJlbmNlczp0LGNhbGxiYWNrOmV9fX1mdW5jdGlvbiBWKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbGxiYWNrIGZ1bmN0aW9uIGV4cGVjdGVkIGFzIGZpcnN0IGFyZ3VtZW50Iik7cmV0dXJue3JlZmVyVG9TZWxmOntjYWxsYmFjazp0fX19ZnVuY3Rpb24gRyh0KXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0LnJlZmVyVG8mJkFycmF5LmlzQXJyYXkodC5yZWZlclRvLnJlZmVyZW5jZXMpJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWZlclRvLmNhbGxiYWNrfWZ1bmN0aW9uIFkodCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdC5yZWZlclRvU2VsZiYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmVmZXJUb1NlbGYuY2FsbGJhY2t9ZnVuY3Rpb24gWCh0LGUpe2lmKCF0KXJldHVybiBlO2lmKGUmJmUhPT10KXtjb25zdCBuPW5ldyBFcnJvcigiRnVuY3Rpb24gbmFtZXMgZG8gbm90IG1hdGNoIChleHBlY3RlZDogIit0KyIsIGFjdHVhbDogIitlKyIpIik7dGhyb3cgbi5kYXRhPXthY3R1YWw6ZSxleHBlY3RlZDp0fSxufXJldHVybiB0fWZ1bmN0aW9uIFcodCl7bGV0IGU7Zm9yKGNvbnN0IG4gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGYodFtuXSl8fCJzdHJpbmciPT10eXBlb2YgdFtuXS5zaWduYXR1cmUpJiYoZT1YKGUsdFtuXS5uYW1lKSk7cmV0dXJuIGV9ZnVuY3Rpb24gSCh0LGUpe2xldCBuO2ZvcihuIGluIGUpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikpe2lmKG4gaW4gdCYmZVtuXSE9PXRbbl0pe2NvbnN0IHI9bmV3IEVycm9yKCdTaWduYXR1cmUgIicrbisnIiBpcyBkZWZpbmVkIHR3aWNlJyk7dGhyb3cgci5kYXRhPXtzaWduYXR1cmU6bixzb3VyY2VGdW5jdGlvbjplW25dLGRlc3RGdW5jdGlvbjp0W25dfSxyfXRbbl09ZVtuXX19bCgpLGMobik7Y29uc3QgWj1hO2Z1bmN0aW9uIEsodCl7aWYoIXR8fCJzdHJpbmciIT10eXBlb2YgdC5mcm9tfHwic3RyaW5nIiE9dHlwZW9mIHQudG98fCJmdW5jdGlvbiIhPXR5cGVvZiB0LmNvbnZlcnQpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0IHdpdGggcHJvcGVydGllcyB7ZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBjb252ZXJ0OiBmdW5jdGlvbn0gZXhwZWN0ZWQiKTtpZih0LnRvPT09dC5mcm9tKXRocm93IG5ldyBTeW50YXhFcnJvcignSWxsZWdhbCB0byBkZWZpbmUgY29udmVyc2lvbiBmcm9tICInK3QuZnJvbSsnIiB0byBpdHNlbGYuJyl9cmV0dXJuIGE9ZnVuY3Rpb24odCl7Y29uc3Qgbj0ic3RyaW5nIj09dHlwZW9mIHQ7bGV0IHI9bj90OiIiO2NvbnN0IGk9e307Zm9yKGxldCB0PW4/MTowO3Q8YXJndW1lbnRzLmxlbmd0aDsrK3Qpe2NvbnN0IG89YXJndW1lbnRzW3RdO2xldCBzLGE9e307aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8/KHM9by5uYW1lLCJzdHJpbmciPT10eXBlb2Ygby5zaWduYXR1cmU/YVtvLnNpZ25hdHVyZV09bzpmKG8pJiYoYT1vLnNpZ25hdHVyZXMpKTplKG8pJiYoYT1vLG58fChzPVcobykpKSwwPT09T2JqZWN0LmtleXMoYSkubGVuZ3RoKXtjb25zdCBlPW5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IHRvICd0eXBlZCcgYXQgaW5kZXggIit0KyIgaXMgbm90IGEgKHR5cGVkKSBmdW5jdGlvbiwgbm9yIGFuIG9iamVjdCB3aXRoIHNpZ25hdHVyZXMgYXMga2V5cyBhbmQgZnVuY3Rpb25zIGFzIHZhbHVlcy4iKTt0aHJvdyBlLmRhdGE9e2luZGV4OnQsYXJndW1lbnQ6b30sZX1ufHwocj1YKHIscykpLEgoaSxhKX1yZXR1cm4gQihyfHwiIixpKX0sYS5jcmVhdGU9dCxhLmNyZWF0ZUNvdW50PVouY3JlYXRlQ291bnQsYS5vbk1pc21hdGNoPWssYS50aHJvd01pc21hdGNoRXJyb3I9ayxhLmNyZWF0ZUVycm9yPVMsYS5jbGVhcj1sLGEuY2xlYXJDb252ZXJzaW9ucz1mdW5jdGlvbigpe2xldCB0O2Zvcih0IG9mIG8paS5nZXQodCkuY29udmVyc2lvbnNUbz1bXTtzPTB9LGEuYWRkVHlwZXM9YyxhLl9maW5kVHlwZT11LGEucmVmZXJUbz1mdW5jdGlvbigpe2NvbnN0IHQ9eihhcmd1bWVudHMpLm1hcCgodD0+ZCh2KHQpKSkpLGU9aihhcmd1bWVudHMpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbGxiYWNrIGZ1bmN0aW9uIGV4cGVjdGVkIGFzIGxhc3QgYXJndW1lbnQiKTtyZXR1cm4gcSh0LGUpfSxhLnJlZmVyVG9TZWxmPVYsYS5jb252ZXJ0PWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj11KGUpO2lmKG4udGVzdCh0KSlyZXR1cm4gdDtjb25zdCByPW4uY29udmVyc2lvbnNUbztpZigwPT09ci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBhcmUgbm8gY29udmVyc2lvbnMgdG8gIitlKyIgZGVmaW5lZC4iKTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKylpZih1KHJbZV0uZnJvbSkudGVzdCh0KSlyZXR1cm4gcltlXS5jb252ZXJ0KHQpO3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgIit0KyIgdG8gIitlKX0sYS5maW5kU2lnbmF0dXJlPXAsYS5maW5kPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcCh0LGUsbikuaW1wbGVtZW50YXRpb259LGEuaXNUeXBlZEZ1bmN0aW9uPWYsYS53YXJuQWdhaW5zdERlcHJlY2F0ZWRUaGlzPSEwLGEuYWRkVHlwZT1mdW5jdGlvbih0LGUpe2xldCBuPSJhbnkiOyExIT09ZSYmaS5oYXMoIk9iamVjdCIpJiYobj0iT2JqZWN0IiksYS5hZGRUeXBlcyhbdF0sbil9LGEuYWRkQ29udmVyc2lvbj1mdW5jdGlvbih0KXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e292ZXJyaWRlOiExfTtLKHQpO2NvbnN0IG49dSh0LnRvKSxyPW4uY29udmVyc2lvbnNUby5maW5kKChlPT5lLmZyb209PT10LmZyb20pKTtpZihyKXtpZighZXx8IWUub3ZlcnJpZGUpdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBhbHJlYWR5IGEgY29udmVyc2lvbiBmcm9tICInK3QuZnJvbSsnIiB0byAiJytuLm5hbWUrJyInKTthLnJlbW92ZUNvbnZlcnNpb24oe2Zyb206ci5mcm9tLHRvOnQudG8sY29udmVydDpyLmNvbnZlcnR9KX1uLmNvbnZlcnNpb25zVG8ucHVzaCh7ZnJvbTp0LmZyb20sY29udmVydDp0LmNvbnZlcnQsaW5kZXg6cysrfSl9LGEuYWRkQ29udmVyc2lvbnM9ZnVuY3Rpb24odCxlKXt0LmZvckVhY2goKHQ9PmEuYWRkQ29udmVyc2lvbih0LGUpKSl9LGEucmVtb3ZlQ29udmVyc2lvbj1mdW5jdGlvbih0KXtLKHQpO2NvbnN0IGU9dSh0LnRvKSxuPWZ1bmN0aW9uKHQsZSl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYoZSh0W25dKSlyZXR1cm4gdFtuXX0oZS5jb252ZXJzaW9uc1RvLChlPT5lLmZyb209PT10LmZyb20pKTtpZighbil0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHQgdG8gcmVtb3ZlIG5vbmV4aXN0ZW50IGNvbnZlcnNpb24gZnJvbSAiK3QuZnJvbSsiIHRvICIrdC50byk7aWYobi5jb252ZXJ0IT09dC5jb252ZXJ0KXRocm93IG5ldyBFcnJvcigiQ29udmVyc2lvbiB0byByZW1vdmUgZG9lcyBub3QgbWF0Y2ggZXhpc3RpbmcgY29udmVyc2lvbiIpO2NvbnN0IHI9ZS5jb252ZXJzaW9uc1RvLmluZGV4T2Yobik7ZS5jb252ZXJzaW9uc1RvLnNwbGljZShyLDEpfSxhLnJlc29sdmU9ZnVuY3Rpb24odCxlKXtpZighZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKE5wKTtjb25zdCBuPXQuX3R5cGVkRnVuY3Rpb25EYXRhLnNpZ25hdHVyZXM7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDsrK3QpaWYoblt0XS50ZXN0KGUpKXJldHVybiBuW3RdO3JldHVybiBudWxsfSxhfSgpO2Z1bmN0aW9uIE1wKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR8fCEhaXNGaW5pdGUodCkmJnQ9PT1NYXRoLnJvdW5kKHQpfWZ1bmN0aW9uIEZwKHQsZSxuKXt2YXIgcj17MjoiMGIiLDg6IjBvIiwxNjoiMHgifVtlXSxpPSIiO2lmKG4pe2lmKG48MSl0aHJvdyBuZXcgRXJyb3IoInNpemUgbXVzdCBiZSBpbiBncmVhdGVyIHRoYW4gMCIpO2lmKCFNcChuKSl0aHJvdyBuZXcgRXJyb3IoInNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIik7aWYodD5JZigyLG4tMSktMXx8dDwtSWYoMixuLTEpKXRocm93IG5ldyBFcnJvcigiVmFsdWUgbXVzdCBiZSBpbiByYW5nZSBbLTJeIi5jb25jYXQobi0xLCIsIDJeIikuY29uY2F0KG4tMSwiLTFdIikpO2lmKCFNcCh0KSl0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciIpO3Q8MCYmKHQrPUlmKDIsbikpLGk9ImkiLmNvbmNhdChuKX12YXIgbz0iIjtyZXR1cm4gdDwwJiYodD0tdCxvPSItIiksIiIuY29uY2F0KG8pLmNvbmNhdChyKS5jb25jYXQodC50b1N0cmluZyhlKSkuY29uY2F0KGkpfWZ1bmN0aW9uIFRwKHQsZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuIGUodCk7aWYodD09PTEvMClyZXR1cm4iSW5maW5pdHkiO2lmKHQ9PT0tMS8wKXJldHVybiItSW5maW5pdHkiO2lmKGlzTmFOKHQpKXJldHVybiJOYU4iO3ZhciBuLHIsaT0iYXV0byI7aWYoZSYmKGUubm90YXRpb24mJihpPWUubm90YXRpb24pLFBmKGUpP249ZTpQZihlLnByZWNpc2lvbikmJihuPWUucHJlY2lzaW9uKSxlLndvcmRTaXplJiYibnVtYmVyIiE9dHlwZW9mKHI9ZS53b3JkU2l6ZSkpKXRocm93IG5ldyBFcnJvcignT3B0aW9uICJ3b3JkU2l6ZSIgbXVzdCBiZSBhIG51bWJlcicpO3N3aXRjaChpKXtjYXNlImZpeGVkIjpyZXR1cm4gZnVuY3Rpb24odCxlKXtpZihpc05hTih0KXx8IWlzRmluaXRlKHQpKXJldHVybiBTdHJpbmcodCk7dmFyIG49T3AodCkscj0ibnVtYmVyIj09dHlwZW9mIGU/UHAobixuLmV4cG9uZW50KzErZSk6bixpPXIuY29lZmZpY2llbnRzLG89ci5leHBvbmVudCsxLHM9bysoZXx8MCk7cmV0dXJuIGkubGVuZ3RoPHMmJihpPWkuY29uY2F0KFJwKHMtaS5sZW5ndGgpKSksbzwwJiYoaT1ScCgxLW8pLmNvbmNhdChpKSxvPTEpLG88aS5sZW5ndGgmJmkuc3BsaWNlKG8sMCwwPT09bz8iMC4iOiIuIiksci5zaWduK2kuam9pbigiIil9KHQsbik7Y2FzZSJleHBvbmVudGlhbCI6cmV0dXJuIExwKHQsbik7Y2FzZSJlbmdpbmVlcmluZyI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odCl8fCFpc0Zpbml0ZSh0KSlyZXR1cm4gU3RyaW5nKHQpO3ZhciBuPU9wKHQpLHI9UHAobixlKSxpPXIuZXhwb25lbnQsbz1yLmNvZWZmaWNpZW50cyxzPWklMz09MD9pOmk8MD9pLTMtaSUzOmktaSUzO2lmKFBmKGUpKWZvcig7ZT5vLmxlbmd0aHx8aS1zKzE+by5sZW5ndGg7KW8ucHVzaCgwKTtlbHNlIGZvcih2YXIgYT1NYXRoLmFicyhpLXMpLShvLmxlbmd0aC0xKSx1PTA7dTxhO3UrKylvLnB1c2goMCk7Zm9yKHZhciBjPU1hdGguYWJzKGktcyksbD0xO2M+MDspbCsrLGMtLTt2YXIgaD1vLnNsaWNlKGwpLmpvaW4oIiIpLGY9UGYoZSkmJmgubGVuZ3RofHxoLm1hdGNoKC9bMS05XS8pPyIuIitoOiIiLHA9by5zbGljZSgwLGwpLmpvaW4oIiIpK2YrImUiKyhpPj0wPyIrIjoiIikrcy50b1N0cmluZygpO3JldHVybiByLnNpZ24rcH0odCxuKTtjYXNlImJpbiI6cmV0dXJuIEZwKHQsMixyKTtjYXNlIm9jdCI6cmV0dXJuIEZwKHQsOCxyKTtjYXNlImhleCI6cmV0dXJuIEZwKHQsMTYscik7Y2FzZSJhdXRvIjpyZXR1cm4gZnVuY3Rpb24odCxlLG4pe2lmKGlzTmFOKHQpfHwhaXNGaW5pdGUodCkpcmV0dXJuIFN0cmluZyh0KTt2YXIgcj1uJiZ2b2lkIDAhPT1uLmxvd2VyRXhwP24ubG93ZXJFeHA6LTMsaT1uJiZ2b2lkIDAhPT1uLnVwcGVyRXhwP24udXBwZXJFeHA6NSxvPU9wKHQpLHM9ZT9QcChvLGUpOm87aWYocy5leHBvbmVudDxyfHxzLmV4cG9uZW50Pj1pKXJldHVybiBMcCh0LGUpO3ZhciBhPXMuY29lZmZpY2llbnRzLHU9cy5leHBvbmVudDthLmxlbmd0aDxlJiYoYT1hLmNvbmNhdChScChlLWEubGVuZ3RoKSkpLGE9YS5jb25jYXQoUnAodS1hLmxlbmd0aCsxKyhhLmxlbmd0aDxlP2UtYS5sZW5ndGg6MCkpKSxhPVJwKC11KS5jb25jYXQoYSk7dmFyIGM9dT4wP3U6MDtyZXR1cm4gYzxhLmxlbmd0aC0xJiZhLnNwbGljZShjKzEsMCwiLiIpLHMuc2lnbithLmpvaW4oIiIpfSh0LG4sZSYmZSkucmVwbGFjZSgvKChcLlxkKj8pKDArKSkoJHxlKS8sKGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzJdLGU9YXJndW1lbnRzWzRdO3JldHVybiIuIiE9PXQ/dCtlOmV9KSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm90YXRpb24gIicraSsnIi4gQ2hvb3NlICJhdXRvIiwgImV4cG9uZW50aWFsIiwgImZpeGVkIiwgImJpbiIsICJvY3QiLCBvciAiaGV4LicpfX1mdW5jdGlvbiBPcCh0KXt2YXIgZT1TdHJpbmcodCkudG9Mb3dlckNhc2UoKS5tYXRjaCgvXigtPykoXGQrXC4/XGQqKShlKFsrLV0/XGQrKSk/JC8pO2lmKCFlKXRocm93IG5ldyBTeW50YXhFcnJvcigiSW52YWxpZCBudW1iZXIgIit0KTt2YXIgbj1lWzFdLHI9ZVsyXSxpPXBhcnNlRmxvYXQoZVs0XXx8IjAiKSxvPXIuaW5kZXhPZigiLiIpO2krPS0xIT09bz9vLTE6ci5sZW5ndGgtMTt2YXIgcz1yLnJlcGxhY2UoIi4iLCIiKS5yZXBsYWNlKC9eMCovLChmdW5jdGlvbih0KXtyZXR1cm4gaS09dC5sZW5ndGgsIiJ9KSkucmVwbGFjZSgvMCokLywiIikuc3BsaXQoIiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQpfSkpO3JldHVybiAwPT09cy5sZW5ndGgmJihzLnB1c2goMCksaSsrKSx7c2lnbjpuLGNvZWZmaWNpZW50czpzLGV4cG9uZW50Oml9fWZ1bmN0aW9uIExwKHQsZSl7aWYoaXNOYU4odCl8fCFpc0Zpbml0ZSh0KSlyZXR1cm4gU3RyaW5nKHQpO3ZhciBuPU9wKHQpLHI9ZT9QcChuLGUpOm4saT1yLmNvZWZmaWNpZW50cyxvPXIuZXhwb25lbnQ7aS5sZW5ndGg8ZSYmKGk9aS5jb25jYXQoUnAoZS1pLmxlbmd0aCkpKTt2YXIgcz1pLnNoaWZ0KCk7cmV0dXJuIHIuc2lnbitzKyhpLmxlbmd0aD4wPyIuIitpLmpvaW4oIiIpOiIiKSsiZSIrKG8+PTA/IisiOiIiKStvfWZ1bmN0aW9uIFBwKHQsZSl7Zm9yKHZhciBuPXtzaWduOnQuc2lnbixjb2VmZmljaWVudHM6dC5jb2VmZmljaWVudHMsZXhwb25lbnQ6dC5leHBvbmVudH0scj1uLmNvZWZmaWNpZW50cztlPD0wOylyLnVuc2hpZnQoMCksbi5leHBvbmVudCsrLGUrKztpZihyLmxlbmd0aD5lJiZyLnNwbGljZShlLHIubGVuZ3RoLWUpWzBdPj01KXt2YXIgaT1lLTE7Zm9yKHJbaV0rKzsxMD09PXJbaV07KXIucG9wKCksMD09PWkmJihyLnVuc2hpZnQoMCksbi5leHBvbmVudCsrLGkrKyksclstLWldKyt9cmV0dXJuIG59ZnVuY3Rpb24gUnAodCl7Zm9yKHZhciBlPVtdLG49MDtuPHQ7bisrKWUucHVzaCgwKTtyZXR1cm4gZX12YXIgQnA9TnVtYmVyLkVQU0lMT058fDIyMjA0NDYwNDkyNTAzMTNlLTMxO2Z1bmN0aW9uIGtwKHQsZSxuKXtpZihudWxsPT1uKXJldHVybiB0PT09ZTtpZih0PT09ZSlyZXR1cm4hMDtpZihpc05hTih0KXx8aXNOYU4oZSkpcmV0dXJuITE7aWYoaXNGaW5pdGUodCkmJmlzRmluaXRlKGUpKXt2YXIgcj1NYXRoLmFicyh0LWUpO3JldHVybiByPEJwfHxyPD1NYXRoLm1heChNYXRoLmFicyh0KSxNYXRoLmFicyhlKSkqbn1yZXR1cm4hMX1mdW5jdGlvbiB6cCh0LGUsbil7dmFyIHI9bmV3KDAsdC5jb25zdHJ1Y3RvcikoMiksaT0iIjtpZihuKXtpZihuPDEpdGhyb3cgbmV3IEVycm9yKCJzaXplIG11c3QgYmUgaW4gZ3JlYXRlciB0aGFuIDAiKTtpZighTXAobikpdGhyb3cgbmV3IEVycm9yKCJzaXplIG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKHQuZ3JlYXRlclRoYW4oci5wb3cobi0xKS5zdWIoMSkpfHx0Lmxlc3NUaGFuKHIucG93KG4tMSkubXVsKC0xKSkpdGhyb3cgbmV3IEVycm9yKCJWYWx1ZSBtdXN0IGJlIGluIHJhbmdlIFstMl4iLmNvbmNhdChuLTEsIiwgMl4iKS5jb25jYXQobi0xLCItMV0iKSk7aWYoIXQuaXNJbnRlZ2VyKCkpdGhyb3cgbmV3IEVycm9yKCJWYWx1ZSBtdXN0IGJlIGFuIGludGVnZXIiKTt0Lmxlc3NUaGFuKDApJiYodD10LmFkZChyLnBvdyhuKSkpLGk9ImkiLmNvbmNhdChuKX1zd2l0Y2goZSl7Y2FzZSAyOnJldHVybiIiLmNvbmNhdCh0LnRvQmluYXJ5KCkpLmNvbmNhdChpKTtjYXNlIDg6cmV0dXJuIiIuY29uY2F0KHQudG9PY3RhbCgpKS5jb25jYXQoaSk7Y2FzZSAxNjpyZXR1cm4iIi5jb25jYXQodC50b0hleGFkZWNpbWFsKCkpLmNvbmNhdChpKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiQmFzZSAiLmNvbmNhdChlLCIgbm90IHN1cHBvcnRlZCAiKSl9fWZ1bmN0aW9uIGpwKHQsZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuIGUodCk7aWYoIXQuaXNGaW5pdGUoKSlyZXR1cm4gdC5pc05hTigpPyJOYU4iOnQuZ3QoMCk/IkluZmluaXR5IjoiLUluZmluaXR5Ijt2YXIgbixyLGk9ImF1dG8iO2lmKHZvaWQgMCE9PWUmJihlLm5vdGF0aW9uJiYoaT1lLm5vdGF0aW9uKSwibnVtYmVyIj09dHlwZW9mIGU/bj1lOnZvaWQgMCE9PWUucHJlY2lzaW9uJiYobj1lLnByZWNpc2lvbiksZS53b3JkU2l6ZSYmIm51bWJlciIhPXR5cGVvZihyPWUud29yZFNpemUpKSl0aHJvdyBuZXcgRXJyb3IoJ09wdGlvbiAid29yZFNpemUiIG11c3QgYmUgYSBudW1iZXInKTtzd2l0Y2goaSl7Y2FzZSJmaXhlZCI6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9GaXhlZChlKX0odCxuKTtjYXNlImV4cG9uZW50aWFsIjpyZXR1cm4gVXAodCxuKTtjYXNlImVuZ2luZWVyaW5nIjpyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj10LmUscj1uJTM9PTA/bjpuPDA/bi0zLW4lMzpuLW4lMyxpPXQubXVsKE1hdGgucG93KDEwLC1yKSksbz1pLnRvUHJlY2lzaW9uKGUpO2lmKC0xIT09by5pbmRleE9mKCJlIikpe289bmV3KDAsdC5jb25zdHJ1Y3RvcikobykudG9GaXhlZCgpfXJldHVybiBvKyJlIisobj49MD8iKyI6IiIpK3IudG9TdHJpbmcoKX0odCxuKTtjYXNlImJpbiI6cmV0dXJuIHpwKHQsMixyKTtjYXNlIm9jdCI6cmV0dXJuIHpwKHQsOCxyKTtjYXNlImhleCI6cmV0dXJuIHpwKHQsMTYscik7Y2FzZSJhdXRvIjp2YXIgbz1lJiZ2b2lkIDAhPT1lLmxvd2VyRXhwP2UubG93ZXJFeHA6LTMscz1lJiZ2b2lkIDAhPT1lLnVwcGVyRXhwP2UudXBwZXJFeHA6NTtpZih0LmlzWmVybygpKXJldHVybiIwIjt2YXIgYT10LnRvU2lnbmlmaWNhbnREaWdpdHMobiksdT1hLmU7cmV0dXJuKHU+PW8mJnU8cz9hLnRvRml4ZWQoKTpVcCh0LG4pKS5yZXBsYWNlKC8oKFwuXGQqPykoMCspKSgkfGUpLywoZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMl0sZT1hcmd1bWVudHNbNF07cmV0dXJuIi4iIT09dD90K2U6ZX0pKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcignVW5rbm93biBub3RhdGlvbiAiJytpKyciLiBDaG9vc2UgImF1dG8iLCAiZXhwb25lbnRpYWwiLCAiZml4ZWQiLCAiYmluIiwgIm9jdCIsIG9yICJoZXguJyl9fWZ1bmN0aW9uIFVwKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/dC50b0V4cG9uZW50aWFsKGUtMSk6dC50b0V4cG9uZW50aWFsKCl9ZnVuY3Rpb24gcXAodCxlKXt2YXIgbj1mdW5jdGlvbih0LGUpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gVHAodCxlKTtpZihSZih0KSlyZXR1cm4ganAodCxlKTtpZihmdW5jdGlvbih0KXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0JiYibnVtYmVyIj09dHlwZW9mIHQucyYmIm51bWJlciI9PXR5cGVvZiB0Lm4mJiJudW1iZXIiPT10eXBlb2YgdC5kfHwhMX0odCkpcmV0dXJuIGUmJiJkZWNpbWFsIj09PWUuZnJhY3Rpb24/dC50b1N0cmluZygpOnQucyp0Lm4rIi8iK3QuZDtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBWcCh0LGUpO2lmKGpmKHQpKXJldHVybiciJyt0KyciJztpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gdC5zeW50YXg/U3RyaW5nKHQuc3ludGF4KToiZnVuY3Rpb24iO2lmKHQmJiJvYmplY3QiPT10eXBlb2YgdCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQuZm9ybWF0P3QuZm9ybWF0KGUpOnQmJnQudG9TdHJpbmcoZSkhPT17fS50b1N0cmluZygpP3QudG9TdHJpbmcoZSk6InsiK09iamVjdC5rZXlzKHQpLm1hcCgobj0+JyInK24rJyI6ICcrcXAodFtuXSxlKSkpLmpvaW4oIiwgIikrIn0ifXJldHVybiBTdHJpbmcodCl9KHQsZSk7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmInRydW5jYXRlImluIGUmJm4ubGVuZ3RoPmUudHJ1bmNhdGU/bi5zdWJzdHJpbmcoMCxlLnRydW5jYXRlLTMpKyIuLi4iOm59ZnVuY3Rpb24gVnAodCxlKXtpZihBcnJheS5pc0FycmF5KHQpKXtmb3IodmFyIG49IlsiLHI9dC5sZW5ndGgsaT0wO2k8cjtpKyspMCE9PWkmJihuKz0iLCAiKSxuKz1WcCh0W2ldLGUpO3JldHVybiBuKz0iXSJ9cmV0dXJuIHFwKHQsZSl9ZnVuY3Rpb24gR3AodCxlLG4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIEdwKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO3RoaXMuYWN0dWFsPXQsdGhpcy5leHBlY3RlZD1lLHRoaXMucmVsYXRpb249bix0aGlzLm1lc3NhZ2U9IkRpbWVuc2lvbiBtaXNtYXRjaCAoIisoQXJyYXkuaXNBcnJheSh0KT8iWyIrdC5qb2luKCIsICIpKyJdIjp0KSsiICIrKHRoaXMucmVsYXRpb258fCIhPSIpKyIgIisoQXJyYXkuaXNBcnJheShlKT8iWyIrZS5qb2luKCIsICIpKyJdIjplKSsiKSIsdGhpcy5zdGFjaz0obmV3IEVycm9yKS5zdGFja31mdW5jdGlvbiBZcCh0LGUsbil7aWYoISh0aGlzIGluc3RhbmNlb2YgWXApKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIik7dGhpcy5pbmRleD10LGFyZ3VtZW50cy5sZW5ndGg8Mz8odGhpcy5taW49MCx0aGlzLm1heD1lKToodGhpcy5taW49ZSx0aGlzLm1heD1uKSx2b2lkIDAhPT10aGlzLm1pbiYmdGhpcy5pbmRleDx0aGlzLm1pbj90aGlzLm1lc3NhZ2U9IkluZGV4IG91dCBvZiByYW5nZSAoIit0aGlzLmluZGV4KyIgPCAiK3RoaXMubWluKyIpIjp2b2lkIDAhPT10aGlzLm1heCYmdGhpcy5pbmRleD49dGhpcy5tYXg/dGhpcy5tZXNzYWdlPSJJbmRleCBvdXQgb2YgcmFuZ2UgKCIrdGhpcy5pbmRleCsiID4gIisodGhpcy5tYXgtMSkrIikiOnRoaXMubWVzc2FnZT0iSW5kZXggb3V0IG9mIHJhbmdlICgiK3RoaXMuaW5kZXgrIikiLHRoaXMuc3RhY2s9KG5ldyBFcnJvcikuc3RhY2t9ZnVuY3Rpb24gWHAodCl7Zm9yKHZhciBlPVtdO0FycmF5LmlzQXJyYXkodCk7KWUucHVzaCh0Lmxlbmd0aCksdD10WzBdO3JldHVybiBlfWZ1bmN0aW9uIFdwKHQsZSxuKXt2YXIgcixpPXQubGVuZ3RoO2lmKGkhPT1lW25dKXRocm93IG5ldyBHcChpLGVbbl0pO2lmKG48ZS5sZW5ndGgtMSl7dmFyIG89bisxO2ZvcihyPTA7cjxpO3IrKyl7dmFyIHM9dFtyXTtpZighQXJyYXkuaXNBcnJheShzKSl0aHJvdyBuZXcgR3AoZS5sZW5ndGgtMSxlLmxlbmd0aCwiPCIpO1dwKHRbcl0sZSxvKX19ZWxzZSBmb3Iocj0wO3I8aTtyKyspaWYoQXJyYXkuaXNBcnJheSh0W3JdKSl0aHJvdyBuZXcgR3AoZS5sZW5ndGgrMSxlLmxlbmd0aCwiPiIpfWZ1bmN0aW9uIEhwKHQsZSl7aWYoMD09PWUubGVuZ3RoKXtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBHcCh0Lmxlbmd0aCwwKX1lbHNlIFdwKHQsZSwwKX1mdW5jdGlvbiBacCh0LGUpe2lmKCFQZih0KXx8IU1wKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkluZGV4IG11c3QgYmUgYW4gaW50ZWdlciAodmFsdWU6ICIrdCsiKSIpO2lmKHQ8MHx8Im51bWJlciI9PXR5cGVvZiBlJiZ0Pj1lKXRocm93IG5ldyBZcCh0LGUpfWZ1bmN0aW9uIEtwKHQsZSxuKXtpZighQXJyYXkuaXNBcnJheSh0KXx8IUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJSZXNpemluZyB0byBzY2FsYXIgaXMgbm90IHN1cHBvcnRlZCIpO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFQZih0KXx8IU1wKHQpfHx0PDApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBzaXplLCBtdXN0IGNvbnRhaW4gcG9zaXRpdmUgaW50ZWdlcnMgKHNpemU6ICIrcXAoZSkrIikiKX0pKSxKcCh0LGUsMCx2b2lkIDAhPT1uP246MCksdH1mdW5jdGlvbiBKcCh0LGUsbixyKXt2YXIgaSxvLHM9dC5sZW5ndGgsYT1lW25dLHU9TWF0aC5taW4ocyxhKTtpZih0Lmxlbmd0aD1hLG48ZS5sZW5ndGgtMSl7dmFyIGM9bisxO2ZvcihpPTA7aTx1O2krKylvPXRbaV0sQXJyYXkuaXNBcnJheShvKXx8KG89W29dLHRbaV09byksSnAobyxlLGMscik7Zm9yKGk9dTtpPGE7aSsrKW89W10sdFtpXT1vLEpwKG8sZSxjLHIpfWVsc2V7Zm9yKGk9MDtpPHU7aSsrKWZvcig7QXJyYXkuaXNBcnJheSh0W2ldKTspdFtpXT10W2ldWzBdO2ZvcihpPXU7aTxhO2krKyl0W2ldPXJ9fWZ1bmN0aW9uIFFwKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQ7dmFyIGU9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24gdChuKXtBcnJheS5pc0FycmF5KG4pP24uZm9yRWFjaCh0KTplLnB1c2gobil9KSksZX0odCkscj1uLmxlbmd0aDtpZighQXJyYXkuaXNBcnJheSh0KXx8IUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKDAsciwiIT0iKTt2YXIgaT10ZChlPSRwKGUscikpO2lmKHIhPT1pKXRocm93IG5ldyBHcChpLHIsIiE9Iik7dHJ5e3JldHVybiBmdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyPXQsaT1lLmxlbmd0aC0xO2k+MDtpLS0pe3ZhciBvPWVbaV07bj1bXTtmb3IodmFyIHM9ci5sZW5ndGgvbyxhPTA7YTxzO2ErKyluLnB1c2goci5zbGljZShhKm8sKGErMSkqbykpO3I9bn1yZXR1cm4gcn0obixlKX1jYXRjaCh0KXt0aHJvdyB0IGluc3RhbmNlb2YgR3A/bmV3IEdwKGksciwiIT0iKTp0fX1mdW5jdGlvbiAkcCh0LGUpe3ZhciBuPXRkKHQpLHI9dC5zbGljZSgpLGk9dC5pbmRleE9mKC0xKTtpZih0LmluZGV4T2YoLTEsaSsxKT49MCl0aHJvdyBuZXcgRXJyb3IoIk1vcmUgdGhhbiBvbmUgd2lsZGNhcmQgaW4gc2l6ZXMiKTtpZihpPj0wKXtpZighKGUlbj09MCkpdGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgcmVwbGFjZSB3aWxkY2FyZCwgc2luY2UgIitlKyIgaXMgbm8gbXVsdGlwbGUgb2YgIistbik7cltpXT0tZS9ufXJldHVybiByfWZ1bmN0aW9uIHRkKHQpe3JldHVybiB0LnJlZHVjZSgoKHQsZSk9PnQqZSksMSl9ZnVuY3Rpb24gZWQodCxlLG4scil7dmFyIGk9cnx8WHAodCk7aWYobilmb3IodmFyIG89MDtvPG47bysrKXQ9W3RdLGkudW5zaGlmdCgxKTtmb3IodD1uZCh0LGUsMCk7aS5sZW5ndGg8ZTspaS5wdXNoKDEpO3JldHVybiB0fWZ1bmN0aW9uIG5kKHQsZSxuKXt2YXIgcixpO2lmKEFycmF5LmlzQXJyYXkodCkpe3ZhciBvPW4rMTtmb3Iocj0wLGk9dC5sZW5ndGg7cjxpO3IrKyl0W3JdPW5kKHRbcl0sZSxvKX1lbHNlIGZvcih2YXIgcz1uO3M8ZTtzKyspdD1bdF07cmV0dXJuIHR9ZnVuY3Rpb24gcmQodCxlKXtmb3IodmFyIG4scj0wLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIG89dFtpXSxzPUFycmF5LmlzQXJyYXkobyk7aWYoMD09PWkmJnMmJihyPW8ubGVuZ3RoKSxzJiZvLmxlbmd0aCE9PXIpcmV0dXJuO3ZhciBhPXM/cmQobyxlKTplKG8pO2lmKHZvaWQgMD09PW4pbj1hO2Vsc2UgaWYobiE9PWEpcmV0dXJuIm1peGVkIn1yZXR1cm4gbn1mdW5jdGlvbiBpZCh0LGUsbixyKXtmdW5jdGlvbiBpKHIpe3ZhciBpPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXt9LHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyXSxvPXRbaV07dm9pZCAwIT09byYmKG5baV09byl9cmV0dXJuIG59KHIsZS5tYXAob2QpKTtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3ZhciByPWUuZmlsdGVyKCh0PT4hZnVuY3Rpb24odCl7cmV0dXJuIHQmJiI/Ij09PXRbMF19KHQpKSkuZXZlcnkoKHQ9PnZvaWQgMCE9PW5bdF0pKTtpZighcil7dmFyIGk9ZS5maWx0ZXIoKHQ9PnZvaWQgMD09PW5bdF0pKTt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgZnVuY3Rpb24gIicuY29uY2F0KHQsJyIsICcpKyJzb21lIGRlcGVuZGVuY2llcyBhcmUgbWlzc2luZzogIi5jb25jYXQoaS5tYXAoKHQ9PiciJy5jb25jYXQodCwnIicpKSkuam9pbigiLCAiKSwiLiIpKX19KHQsZSxyKSxuKGkpfXJldHVybiBpLmlzRmFjdG9yeT0hMCxpLmZuPXQsaS5kZXBlbmRlbmNpZXM9ZS5zbGljZSgpLnNvcnQoKSxyJiYoaS5tZXRhPXIpLGl9ZnVuY3Rpb24gb2QodCl7cmV0dXJuIHQmJiI/Ij09PXRbMF0/dC5zbGljZSgxKTp0fWZ1bmN0aW9uIHNkKHQsZSl7aWYoY2QodCkmJnVkKHQsZSkpcmV0dXJuIHRbZV07dGhyb3ciZnVuY3Rpb24iPT10eXBlb2YgdFtlXSYmZnVuY3Rpb24odCxlKXtyZXR1cm4hKG51bGw9PXR8fCJmdW5jdGlvbiIhPXR5cGVvZiB0W2VdfHxEcCh0LGUpJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YmJmUgaW4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpKSYmKCEhRHAoaGQsZSl8fCEoZSBpbiBPYmplY3QucHJvdG90eXBlfHxlIGluIEZ1bmN0aW9uLnByb3RvdHlwZSkpfSh0LGUpP25ldyBFcnJvcignQ2Fubm90IGFjY2VzcyBtZXRob2QgIicrZSsnIiBhcyBhIHByb3BlcnR5Jyk6bmV3IEVycm9yKCdObyBhY2Nlc3MgdG8gcHJvcGVydHkgIicrZSsnIicpfWZ1bmN0aW9uIGFkKHQsZSxuKXtpZihjZCh0KSYmdWQodCxlKSlyZXR1cm4gdFtlXT1uLG47dGhyb3cgbmV3IEVycm9yKCdObyBhY2Nlc3MgdG8gcHJvcGVydHkgIicrZSsnIicpfWZ1bmN0aW9uIHVkKHQsZSl7cmV0dXJuISghdHx8Im9iamVjdCIhPXR5cGVvZiB0KSYmKCEhRHAobGQsZSl8fCEoZSBpbiBPYmplY3QucHJvdG90eXBlfHxlIGluIEZ1bmN0aW9uLnByb3RvdHlwZSkpfWZ1bmN0aW9uIGNkKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmdCYmdC5jb25zdHJ1Y3Rvcj09PU9iamVjdH1HcC5wcm90b3R5cGU9bmV3IFJhbmdlRXJyb3IsR3AucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJhbmdlRXJyb3IsR3AucHJvdG90eXBlLm5hbWU9IkRpbWVuc2lvbkVycm9yIixHcC5wcm90b3R5cGUuaXNEaW1lbnNpb25FcnJvcj0hMCxZcC5wcm90b3R5cGU9bmV3IFJhbmdlRXJyb3IsWXAucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJhbmdlRXJyb3IsWXAucHJvdG90eXBlLm5hbWU9IkluZGV4RXJyb3IiLFlwLnByb3RvdHlwZS5pc0luZGV4RXJyb3I9ITA7dmFyIGxkPXtsZW5ndGg6ITAsbmFtZTohMH0saGQ9e3RvU3RyaW5nOiEwLHZhbHVlT2Y6ITAsdG9Mb2NhbGVTdHJpbmc6ITB9O2NsYXNzIGZke2NvbnN0cnVjdG9yKHQpe3RoaXMud3JhcHBlZE9iamVjdD10fWtleXMoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy53cmFwcGVkT2JqZWN0KX1nZXQodCl7cmV0dXJuIHNkKHRoaXMud3JhcHBlZE9iamVjdCx0KX1zZXQodCxlKXtyZXR1cm4gYWQodGhpcy53cmFwcGVkT2JqZWN0LHQsZSksdGhpc31oYXModCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUgaW4gdH0odGhpcy53cmFwcGVkT2JqZWN0LHQpfX1mdW5jdGlvbiBwZCh0KXtyZXR1cm4hIXQmJih0IGluc3RhbmNlb2YgTWFwfHx0IGluc3RhbmNlb2YgZmR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0LnNldCYmImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5rZXlzJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5oYXMpfXZhciBkZD1mdW5jdGlvbigpe3JldHVybiBkZD1JcC5jcmVhdGUsSXB9LGdkPWlkKCJ0eXBlZCIsWyI/QmlnTnVtYmVyIiwiP0NvbXBsZXgiLCI/RGVuc2VNYXRyaXgiLCI/RnJhY3Rpb24iXSwoZnVuY3Rpb24odCl7dmFye0JpZ051bWJlcjplLENvbXBsZXg6bixEZW5zZU1hdHJpeDpyLEZyYWN0aW9uOml9PXQsbz1kZCgpO3JldHVybiBvLmNsZWFyKCksby5hZGRUeXBlcyhbe25hbWU6Im51bWJlciIsdGVzdDpQZn0se25hbWU6IkNvbXBsZXgiLHRlc3Q6QmZ9LHtuYW1lOiJCaWdOdW1iZXIiLHRlc3Q6UmZ9LHtuYW1lOiJGcmFjdGlvbiIsdGVzdDprZn0se25hbWU6IlVuaXQiLHRlc3Q6emZ9LHtuYW1lOiJpZGVudGlmaWVyIix0ZXN0OnQ9PmpmJiYvXig/OltBLVphLXpceEFBXHhCNVx4QkFceEMwLVx4RDZceEQ4LVx4RjZceEY4LVx1MDJDMVx1MDJDNi1cdTAyRDFcdTAyRTAtXHUwMkU0XHUwMkVDXHUwMkVFXHUwMzcwLVx1MDM3NFx1MDM3Nlx1MDM3N1x1MDM3QS1cdTAzN0RcdTAzN0ZcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzRjVcdTAzRjctXHUwNDgxXHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjAtXHUwNTg4XHUwNUQwLVx1MDVFQVx1MDVFRi1cdTA1RjJcdTA2MjAtXHUwNjRBXHUwNjZFXHUwNjZGXHUwNjcxLVx1MDZEM1x1MDZENVx1MDZFNVx1MDZFNlx1MDZFRVx1MDZFRlx1MDZGQS1cdTA2RkNcdTA2RkZcdTA3MTBcdTA3MTItXHUwNzJGXHUwNzRELVx1MDdBNVx1MDdCMVx1MDdDQS1cdTA3RUFcdTA3RjRcdTA3RjVcdTA3RkFcdTA4MDAtXHUwODE1XHUwODFBXHUwODI0XHUwODI4XHUwODQwLVx1MDg1OFx1MDg2MC1cdTA4NkFcdTA4NzAtXHUwODg3XHUwODg5LVx1MDg4RVx1MDhBMC1cdTA4QzlcdTA5MDQtXHUwOTM5XHUwOTNEXHUwOTUwXHUwOTU4LVx1MDk2MVx1MDk3MS1cdTA5ODBcdTA5ODUtXHUwOThDXHUwOThGXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOUJEXHUwOUNFXHUwOURDXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMFx1MDlGMVx1MDlGQ1x1MEEwNS1cdTBBMEFcdTBBMEZcdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMlx1MEEzM1x1MEEzNVx1MEEzNlx1MEEzOFx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMlx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRDBcdTBBRTBcdTBBRTFcdTBBRjlcdTBCMDUtXHUwQjBDXHUwQjBGXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzJcdTBCMzNcdTBCMzUtXHUwQjM5XHUwQjNEXHUwQjVDXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI3MVx1MEI4M1x1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OVx1MEI5QVx1MEI5Q1x1MEI5RVx1MEI5Rlx1MEJBM1x1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI5XHUwQkQwXHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzOVx1MEMzRFx1MEM1OC1cdTBDNUFcdTBDNURcdTBDNjBcdTBDNjFcdTBDODBcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENCRFx1MENERFx1MENERVx1MENFMFx1MENFMVx1MENGMVx1MENGMlx1MEQwNC1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQzQVx1MEQzRFx1MEQ0RVx1MEQ1NC1cdTBENTZcdTBENUYtXHUwRDYxXHUwRDdBLVx1MEQ3Rlx1MEQ4NS1cdTBEOTZcdTBEOUEtXHUwREIxXHUwREIzLVx1MERCQlx1MERCRFx1MERDMC1cdTBEQzZcdTBFMDEtXHUwRTMwXHUwRTMyXHUwRTMzXHUwRTQwLVx1MEU0Nlx1MEU4MVx1MEU4Mlx1MEU4NFx1MEU4Ni1cdTBFOEFcdTBFOEMtXHUwRUEzXHUwRUE1XHUwRUE3LVx1MEVCMFx1MEVCMlx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBFQzZcdTBFREMtXHUwRURGXHUwRjAwXHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNkNcdTBGODgtXHUwRjhDXHUxMDAwLVx1MTAyQVx1MTAzRlx1MTA1MC1cdTEwNTVcdTEwNUEtXHUxMDVEXHUxMDYxXHUxMDY1XHUxMDY2XHUxMDZFLVx1MTA3MFx1MTA3NS1cdTEwODFcdTEwOEVcdTEwQTAtXHUxMEM1XHUxMEM3XHUxMENEXHUxMEQwLVx1MTBGQVx1MTBGQy1cdTEyNDhcdTEyNEEtXHUxMjREXHUxMjUwLVx1MTI1Nlx1MTI1OFx1MTI1QS1cdTEyNURcdTEyNjAtXHUxMjg4XHUxMjhBLVx1MTI4RFx1MTI5MC1cdTEyQjBcdTEyQjItXHUxMkI1XHUxMkI4LVx1MTJCRVx1MTJDMFx1MTJDMi1cdTEyQzVcdTEyQzgtXHUxMkQ2XHUxMkQ4LVx1MTMxMFx1MTMxMi1cdTEzMTVcdTEzMTgtXHUxMzVBXHUxMzgwLVx1MTM4Rlx1MTNBMC1cdTEzRjVcdTEzRjgtXHUxM0ZEXHUxNDAxLVx1MTY2Q1x1MTY2Ri1cdTE2N0ZcdTE2ODEtXHUxNjlBXHUxNkEwLVx1MTZFQVx1MTZGMS1cdTE2RjhcdTE3MDAtXHUxNzExXHUxNzFGLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc4MC1cdTE3QjNcdTE3RDdcdTE3RENcdTE4MjAtXHUxODc4XHUxODgwLVx1MTg4NFx1MTg4Ny1cdTE4QThcdTE4QUFcdTE4QjAtXHUxOEY1XHUxOTAwLVx1MTkxRVx1MTk1MC1cdTE5NkRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlBQlx1MTlCMC1cdTE5QzlcdTFBMDAtXHUxQTE2XHUxQTIwLVx1MUE1NFx1MUFBN1x1MUIwNS1cdTFCMzNcdTFCNDUtXHUxQjRDXHUxQjgzLVx1MUJBMFx1MUJBRVx1MUJBRlx1MUJCQS1cdTFCRTVcdTFDMDAtXHUxQzIzXHUxQzRELVx1MUM0Rlx1MUM1QS1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQzkwLVx1MUNCQVx1MUNCRC1cdTFDQkZcdTFDRTktXHUxQ0VDXHUxQ0VFLVx1MUNGM1x1MUNGNVx1MUNGNlx1MUNGQVx1MUQwMC1cdTFEQkZcdTFFMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIwNzFcdTIwN0ZcdTIwOTAtXHUyMDlDXHUyMTAyXHUyMTA3XHUyMTBBLVx1MjExM1x1MjExNVx1MjExOS1cdTIxMURcdTIxMjRcdTIxMjZcdTIxMjhcdTIxMkEtXHUyMTJEXHUyMTJGLVx1MjEzOVx1MjEzQy1cdTIxM0ZcdTIxNDUtXHUyMTQ5XHUyMTRFXHUyMTgzXHUyMTg0XHUyQzAwLVx1MkNFNFx1MkNFQi1cdTJDRUVcdTJDRjJcdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ4MC1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkUyRlx1MzAwNVx1MzAwNlx1MzAzMS1cdTMwMzVcdTMwM0JcdTMwM0NcdTMwNDEtXHUzMDk2XHUzMDlELVx1MzA5Rlx1MzBBMS1cdTMwRkFcdTMwRkMtXHUzMEZGXHUzMTA1LVx1MzEyRlx1MzEzMS1cdTMxOEVcdTMxQTAtXHUzMUJGXHUzMUYwLVx1MzFGRlx1MzQwMC1cdTREQkZcdTRFMDAtXHVBNDhDXHVBNEQwLVx1QTRGRFx1QTUwMC1cdUE2MENcdUE2MTAtXHVBNjFGXHVBNjJBXHVBNjJCXHVBNjQwLVx1QTY2RVx1QTY3Ri1cdUE2OURcdUE2QTAtXHVBNkU1XHVBNzE3LVx1QTcxRlx1QTcyMi1cdUE3ODhcdUE3OEItXHVBN0NBXHVBN0QwXHVBN0QxXHVBN0QzXHVBN0Q1LVx1QTdEOVx1QTdGMi1cdUE4MDFcdUE4MDMtXHVBODA1XHVBODA3LVx1QTgwQVx1QTgwQy1cdUE4MjJcdUE4NDAtXHVBODczXHVBODgyLVx1QThCM1x1QThGMi1cdUE4RjdcdUE4RkJcdUE4RkRcdUE4RkVcdUE5MEEtXHVBOTI1XHVBOTMwLVx1QTk0Nlx1QTk2MC1cdUE5N0NcdUE5ODQtXHVBOUIyXHVBOUNGXHVBOUUwLVx1QTlFNFx1QTlFNi1cdUE5RUZcdUE5RkEtXHVBOUZFXHVBQTAwLVx1QUEyOFx1QUE0MC1cdUFBNDJcdUFBNDQtXHVBQTRCXHVBQTYwLVx1QUE3Nlx1QUE3QVx1QUE3RS1cdUFBQUZcdUFBQjFcdUFBQjVcdUFBQjZcdUFBQjktXHVBQUJEXHVBQUMwXHVBQUMyXHVBQURCLVx1QUFERFx1QUFFMC1cdUFBRUFcdUFBRjItXHVBQUY0XHVBQjAxLVx1QUIwNlx1QUIwOS1cdUFCMEVcdUFCMTEtXHVBQjE2XHVBQjIwLVx1QUIyNlx1QUIyOC1cdUFCMkVcdUFCMzAtXHVBQjVBXHVBQjVDLVx1QUI2OVx1QUI3MC1cdUFCRTJcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQTZEXHVGQTcwLVx1RkFEOVx1RkIwMC1cdUZCMDZcdUZCMTMtXHVGQjE3XHVGQjFEXHVGQjFGLVx1RkIyOFx1RkIyQS1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJCMVx1RkJEMy1cdUZEM0RcdUZENTAtXHVGRDhGXHVGRDkyLVx1RkRDN1x1RkRGMC1cdUZERkJcdUZFNzAtXHVGRTc0XHVGRTc2LVx1RkVGQ1x1RkYyMS1cdUZGM0FcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURFODAtXHVERTlDXHVERUEwLVx1REVEMFx1REYwMC1cdURGMUZcdURGMkQtXHVERjQwXHVERjQyLVx1REY0OVx1REY1MC1cdURGNzVcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZdfFx1RDgwMVtcdURDMDAtXHVEQzlEXHVEQ0IwLVx1RENEM1x1RENEOC1cdURDRkJcdUREMDAtXHVERDI3XHVERDMwLVx1REQ2M1x1REQ3MC1cdUREN0FcdUREN0MtXHVERDhBXHVERDhDLVx1REQ5Mlx1REQ5NFx1REQ5NVx1REQ5Ny1cdUREQTFcdUREQTMtXHVEREIxXHVEREIzLVx1RERCOVx1RERCQlx1RERCQ1x1REUwMC1cdURGMzZcdURGNDAtXHVERjU1XHVERjYwLVx1REY2N1x1REY4MC1cdURGODVcdURGODctXHVERkIwXHVERkIyLVx1REZCQV18XHVEODAyW1x1REMwMC1cdURDMDVcdURDMDhcdURDMEEtXHVEQzM1XHVEQzM3XHVEQzM4XHVEQzNDXHVEQzNGLVx1REM1NVx1REM2MC1cdURDNzZcdURDODAtXHVEQzlFXHVEQ0UwLVx1RENGMlx1RENGNFx1RENGNVx1REQwMC1cdUREMTVcdUREMjAtXHVERDM5XHVERDgwLVx1RERCN1x1RERCRVx1RERCRlx1REUwMFx1REUxMC1cdURFMTNcdURFMTUtXHVERTE3XHVERTE5LVx1REUzNVx1REU2MC1cdURFN0NcdURFODAtXHVERTlDXHVERUMwLVx1REVDN1x1REVDOS1cdURFRTRcdURGMDAtXHVERjM1XHVERjQwLVx1REY1NVx1REY2MC1cdURGNzJcdURGODAtXHVERjkxXXxcdUQ4MDNbXHVEQzAwLVx1REM0OFx1REM4MC1cdURDQjJcdURDQzAtXHVEQ0YyXHVERDAwLVx1REQyM1x1REU4MC1cdURFQTlcdURFQjBcdURFQjFcdURGMDAtXHVERjFDXHVERjI3XHVERjMwLVx1REY0NVx1REY3MC1cdURGODFcdURGQjAtXHVERkM0XHVERkUwLVx1REZGNl18XHVEODA0W1x1REMwMy1cdURDMzdcdURDNzFcdURDNzJcdURDNzVcdURDODMtXHVEQ0FGXHVEQ0QwLVx1RENFOFx1REQwMy1cdUREMjZcdURENDRcdURENDdcdURENTAtXHVERDcyXHVERDc2XHVERDgzLVx1RERCMlx1RERDMS1cdUREQzRcdUREREFcdURERENcdURFMDAtXHVERTExXHVERTEzLVx1REUyQlx1REUzRlx1REU0MFx1REU4MC1cdURFODZcdURFODhcdURFOEEtXHVERThEXHVERThGLVx1REU5RFx1REU5Ri1cdURFQThcdURFQjAtXHVERURFXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzRFx1REY1MFx1REY1RC1cdURGNjFdfFx1RDgwNVtcdURDMDAtXHVEQzM0XHVEQzQ3LVx1REM0QVx1REM1Ri1cdURDNjFcdURDODAtXHVEQ0FGXHVEQ0M0XHVEQ0M1XHVEQ0M3XHVERDgwLVx1RERBRVx1REREOC1cdUREREJcdURFMDAtXHVERTJGXHVERTQ0XHVERTgwLVx1REVBQVx1REVCOFx1REYwMC1cdURGMUFcdURGNDAtXHVERjQ2XXxcdUQ4MDZbXHVEQzAwLVx1REMyQlx1RENBMC1cdURDREZcdURDRkYtXHVERDA2XHVERDA5XHVERDBDLVx1REQxM1x1REQxNVx1REQxNlx1REQxOC1cdUREMkZcdUREM0ZcdURENDFcdUREQTAtXHVEREE3XHVEREFBLVx1REREMFx1RERFMVx1RERFM1x1REUwMFx1REUwQi1cdURFMzJcdURFM0FcdURFNTBcdURFNUMtXHVERTg5XHVERTlEXHVERUIwLVx1REVGOF18XHVEODA3W1x1REMwMC1cdURDMDhcdURDMEEtXHVEQzJFXHVEQzQwXHVEQzcyLVx1REM4Rlx1REQwMC1cdUREMDZcdUREMDhcdUREMDlcdUREMEItXHVERDMwXHVERDQ2XHVERDYwLVx1REQ2NVx1REQ2N1x1REQ2OFx1REQ2QS1cdUREODlcdUREOThcdURFRTAtXHVERUYyXHVERjAyXHVERjA0LVx1REYxMFx1REYxMi1cdURGMzNcdURGQjBdfFx1RDgwOFtcdURDMDAtXHVERjk5XXxcdUQ4MDlbXHVEQzgwLVx1REQ0M118XHVEODBCW1x1REY5MC1cdURGRjBdfFtcdUQ4MENcdUQ4MUMtXHVEODIwXHVEODIyXHVEODQwLVx1RDg2OFx1RDg2QS1cdUQ4NkNcdUQ4NkYtXHVEODcyXHVEODc0LVx1RDg3OVx1RDg4MC1cdUQ4ODNcdUQ4ODUtXHVEODg3XVtcdURDMDAtXHVERkZGXXxcdUQ4MERbXHVEQzAwLVx1REMyRlx1REM0MS1cdURDNDZdfFx1RDgxMVtcdURDMDAtXHVERTQ2XXxcdUQ4MUFbXHVEQzAwLVx1REUzOFx1REU0MC1cdURFNUVcdURFNzAtXHVERUJFXHVERUQwLVx1REVFRFx1REYwMC1cdURGMkZcdURGNDAtXHVERjQzXHVERjYzLVx1REY3N1x1REY3RC1cdURGOEZdfFx1RDgxQltcdURFNDAtXHVERTdGXHVERjAwLVx1REY0QVx1REY1MFx1REY5My1cdURGOUZcdURGRTBcdURGRTFcdURGRTNdfFx1RDgyMVtcdURDMDAtXHVERkY3XXxcdUQ4MjNbXHVEQzAwLVx1RENENVx1REQwMC1cdUREMDhdfFx1RDgyQltcdURGRjAtXHVERkYzXHVERkY1LVx1REZGQlx1REZGRFx1REZGRV18XHVEODJDW1x1REMwMC1cdUREMjJcdUREMzJcdURENTAtXHVERDUyXHVERDU1XHVERDY0LVx1REQ2N1x1REQ3MC1cdURFRkJdfFx1RDgyRltcdURDMDAtXHVEQzZBXHVEQzcwLVx1REM3Q1x1REM4MC1cdURDODhcdURDOTAtXHVEQzk5XXxcdUQ4MzVbXHVEQzAwLVx1REM1NFx1REM1Ni1cdURDOUNcdURDOUVcdURDOUZcdURDQTJcdURDQTVcdURDQTZcdURDQTktXHVEQ0FDXHVEQ0FFLVx1RENCOVx1RENCQlx1RENCRC1cdURDQzNcdURDQzUtXHVERDA1XHVERDA3LVx1REQwQVx1REQwRC1cdUREMTRcdUREMTYtXHVERDFDXHVERDFFLVx1REQzOVx1REQzQi1cdUREM0VcdURENDAtXHVERDQ0XHVERDQ2XHVERDRBLVx1REQ1MFx1REQ1Mi1cdURFQTVcdURFQTgtXHVERUMwXHVERUMyLVx1REVEQVx1REVEQy1cdURFRkFcdURFRkMtXHVERjE0XHVERjE2LVx1REYzNFx1REYzNi1cdURGNEVcdURGNTAtXHVERjZFXHVERjcwLVx1REY4OFx1REY4QS1cdURGQThcdURGQUEtXHVERkMyXHVERkM0LVx1REZDQl18XHVEODM3W1x1REYwMC1cdURGMUVcdURGMjUtXHVERjJBXXxcdUQ4MzhbXHVEQzMwLVx1REM2RFx1REQwMC1cdUREMkNcdUREMzctXHVERDNEXHVERDRFXHVERTkwLVx1REVBRFx1REVDMC1cdURFRUJdfFx1RDgzOVtcdURDRDAtXHVEQ0VCXHVERkUwLVx1REZFNlx1REZFOC1cdURGRUJcdURGRURcdURGRUVcdURGRjAtXHVERkZFXXxcdUQ4M0FbXHVEQzAwLVx1RENDNFx1REQwMC1cdURENDNcdURENEJdfFx1RDgzQltcdURFMDAtXHVERTAzXHVERTA1LVx1REUxRlx1REUyMVx1REUyMlx1REUyNFx1REUyN1x1REUyOS1cdURFMzJcdURFMzQtXHVERTM3XHVERTM5XHVERTNCXHVERTQyXHVERTQ3XHVERTQ5XHVERTRCXHVERTRELVx1REU0Rlx1REU1MVx1REU1Mlx1REU1NFx1REU1N1x1REU1OVx1REU1Qlx1REU1RFx1REU1Rlx1REU2MVx1REU2Mlx1REU2NFx1REU2Ny1cdURFNkFcdURFNkMtXHVERTcyXHVERTc0LVx1REU3N1x1REU3OS1cdURFN0NcdURFN0VcdURFODAtXHVERTg5XHVERThCLVx1REU5Qlx1REVBMS1cdURFQTNcdURFQTUtXHVERUE5XHVERUFCLVx1REVCQl18XHVEODY5W1x1REMwMC1cdURFREZcdURGMDAtXHVERkZGXXxcdUQ4NkRbXHVEQzAwLVx1REYzOVx1REY0MC1cdURGRkZdfFx1RDg2RVtcdURDMDAtXHVEQzFEXHVEQzIwLVx1REZGRl18XHVEODczW1x1REMwMC1cdURFQTFcdURFQjAtXHVERkZGXXxcdUQ4N0FbXHVEQzAwLVx1REZFMF18XHVEODdFW1x1REMwMC1cdURFMURdfFx1RDg4NFtcdURDMDAtXHVERjRBXHVERjUwLVx1REZGRl18XHVEODg4W1x1REMwMC1cdURGQUZdKSg/OlswLTlBLVphLXpceEFBXHhCNVx4QkFceEMwLVx4RDZceEQ4LVx4RjZceEY4LVx1MDJDMVx1MDJDNi1cdTAyRDFcdTAyRTAtXHUwMkU0XHUwMkVDXHUwMkVFXHUwMzcwLVx1MDM3NFx1MDM3Nlx1MDM3N1x1MDM3QS1cdTAzN0RcdTAzN0ZcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzRjVcdTAzRjctXHUwNDgxXHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjAtXHUwNTg4XHUwNUQwLVx1MDVFQVx1MDVFRi1cdTA1RjJcdTA2MjAtXHUwNjRBXHUwNjZFXHUwNjZGXHUwNjcxLVx1MDZEM1x1MDZENVx1MDZFNVx1MDZFNlx1MDZFRVx1MDZFRlx1MDZGQS1cdTA2RkNcdTA2RkZcdTA3MTBcdTA3MTItXHUwNzJGXHUwNzRELVx1MDdBNVx1MDdCMVx1MDdDQS1cdTA3RUFcdTA3RjRcdTA3RjVcdTA3RkFcdTA4MDAtXHUwODE1XHUwODFBXHUwODI0XHUwODI4XHUwODQwLVx1MDg1OFx1MDg2MC1cdTA4NkFcdTA4NzAtXHUwODg3XHUwODg5LVx1MDg4RVx1MDhBMC1cdTA4QzlcdTA5MDQtXHUwOTM5XHUwOTNEXHUwOTUwXHUwOTU4LVx1MDk2MVx1MDk3MS1cdTA5ODBcdTA5ODUtXHUwOThDXHUwOThGXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOUJEXHUwOUNFXHUwOURDXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMFx1MDlGMVx1MDlGQ1x1MEEwNS1cdTBBMEFcdTBBMEZcdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMlx1MEEzM1x1MEEzNVx1MEEzNlx1MEEzOFx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMlx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRDBcdTBBRTBcdTBBRTFcdTBBRjlcdTBCMDUtXHUwQjBDXHUwQjBGXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzJcdTBCMzNcdTBCMzUtXHUwQjM5XHUwQjNEXHUwQjVDXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI3MVx1MEI4M1x1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OVx1MEI5QVx1MEI5Q1x1MEI5RVx1MEI5Rlx1MEJBM1x1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI5XHUwQkQwXHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzOVx1MEMzRFx1MEM1OC1cdTBDNUFcdTBDNURcdTBDNjBcdTBDNjFcdTBDODBcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENCRFx1MENERFx1MENERVx1MENFMFx1MENFMVx1MENGMVx1MENGMlx1MEQwNC1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQzQVx1MEQzRFx1MEQ0RVx1MEQ1NC1cdTBENTZcdTBENUYtXHUwRDYxXHUwRDdBLVx1MEQ3Rlx1MEQ4NS1cdTBEOTZcdTBEOUEtXHUwREIxXHUwREIzLVx1MERCQlx1MERCRFx1MERDMC1cdTBEQzZcdTBFMDEtXHUwRTMwXHUwRTMyXHUwRTMzXHUwRTQwLVx1MEU0Nlx1MEU4MVx1MEU4Mlx1MEU4NFx1MEU4Ni1cdTBFOEFcdTBFOEMtXHUwRUEzXHUwRUE1XHUwRUE3LVx1MEVCMFx1MEVCMlx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBFQzZcdTBFREMtXHUwRURGXHUwRjAwXHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNkNcdTBGODgtXHUwRjhDXHUxMDAwLVx1MTAyQVx1MTAzRlx1MTA1MC1cdTEwNTVcdTEwNUEtXHUxMDVEXHUxMDYxXHUxMDY1XHUxMDY2XHUxMDZFLVx1MTA3MFx1MTA3NS1cdTEwODFcdTEwOEVcdTEwQTAtXHUxMEM1XHUxMEM3XHUxMENEXHUxMEQwLVx1MTBGQVx1MTBGQy1cdTEyNDhcdTEyNEEtXHUxMjREXHUxMjUwLVx1MTI1Nlx1MTI1OFx1MTI1QS1cdTEyNURcdTEyNjAtXHUxMjg4XHUxMjhBLVx1MTI4RFx1MTI5MC1cdTEyQjBcdTEyQjItXHUxMkI1XHUxMkI4LVx1MTJCRVx1MTJDMFx1MTJDMi1cdTEyQzVcdTEyQzgtXHUxMkQ2XHUxMkQ4LVx1MTMxMFx1MTMxMi1cdTEzMTVcdTEzMTgtXHUxMzVBXHUxMzgwLVx1MTM4Rlx1MTNBMC1cdTEzRjVcdTEzRjgtXHUxM0ZEXHUxNDAxLVx1MTY2Q1x1MTY2Ri1cdTE2N0ZcdTE2ODEtXHUxNjlBXHUxNkEwLVx1MTZFQVx1MTZGMS1cdTE2RjhcdTE3MDAtXHUxNzExXHUxNzFGLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc4MC1cdTE3QjNcdTE3RDdcdTE3RENcdTE4MjAtXHUxODc4XHUxODgwLVx1MTg4NFx1MTg4Ny1cdTE4QThcdTE4QUFcdTE4QjAtXHUxOEY1XHUxOTAwLVx1MTkxRVx1MTk1MC1cdTE5NkRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlBQlx1MTlCMC1cdTE5QzlcdTFBMDAtXHUxQTE2XHUxQTIwLVx1MUE1NFx1MUFBN1x1MUIwNS1cdTFCMzNcdTFCNDUtXHUxQjRDXHUxQjgzLVx1MUJBMFx1MUJBRVx1MUJBRlx1MUJCQS1cdTFCRTVcdTFDMDAtXHUxQzIzXHUxQzRELVx1MUM0Rlx1MUM1QS1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQzkwLVx1MUNCQVx1MUNCRC1cdTFDQkZcdTFDRTktXHUxQ0VDXHUxQ0VFLVx1MUNGM1x1MUNGNVx1MUNGNlx1MUNGQVx1MUQwMC1cdTFEQkZcdTFFMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIwNzFcdTIwN0ZcdTIwOTAtXHUyMDlDXHUyMTAyXHUyMTA3XHUyMTBBLVx1MjExM1x1MjExNVx1MjExOS1cdTIxMURcdTIxMjRcdTIxMjZcdTIxMjhcdTIxMkEtXHUyMTJEXHUyMTJGLVx1MjEzOVx1MjEzQy1cdTIxM0ZcdTIxNDUtXHUyMTQ5XHUyMTRFXHUyMTgzXHUyMTg0XHUyQzAwLVx1MkNFNFx1MkNFQi1cdTJDRUVcdTJDRjJcdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ4MC1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkUyRlx1MzAwNVx1MzAwNlx1MzAzMS1cdTMwMzVcdTMwM0JcdTMwM0NcdTMwNDEtXHUzMDk2XHUzMDlELVx1MzA5Rlx1MzBBMS1cdTMwRkFcdTMwRkMtXHUzMEZGXHUzMTA1LVx1MzEyRlx1MzEzMS1cdTMxOEVcdTMxQTAtXHUzMUJGXHUzMUYwLVx1MzFGRlx1MzQwMC1cdTREQkZcdTRFMDAtXHVBNDhDXHVBNEQwLVx1QTRGRFx1QTUwMC1cdUE2MENcdUE2MTAtXHVBNjFGXHVBNjJBXHVBNjJCXHVBNjQwLVx1QTY2RVx1QTY3Ri1cdUE2OURcdUE2QTAtXHVBNkU1XHVBNzE3LVx1QTcxRlx1QTcyMi1cdUE3ODhcdUE3OEItXHVBN0NBXHVBN0QwXHVBN0QxXHVBN0QzXHVBN0Q1LVx1QTdEOVx1QTdGMi1cdUE4MDFcdUE4MDMtXHVBODA1XHVBODA3LVx1QTgwQVx1QTgwQy1cdUE4MjJcdUE4NDAtXHVBODczXHVBODgyLVx1QThCM1x1QThGMi1cdUE4RjdcdUE4RkJcdUE4RkRcdUE4RkVcdUE5MEEtXHVBOTI1XHVBOTMwLVx1QTk0Nlx1QTk2MC1cdUE5N0NcdUE5ODQtXHVBOUIyXHVBOUNGXHVBOUUwLVx1QTlFNFx1QTlFNi1cdUE5RUZcdUE5RkEtXHVBOUZFXHVBQTAwLVx1QUEyOFx1QUE0MC1cdUFBNDJcdUFBNDQtXHVBQTRCXHVBQTYwLVx1QUE3Nlx1QUE3QVx1QUE3RS1cdUFBQUZcdUFBQjFcdUFBQjVcdUFBQjZcdUFBQjktXHVBQUJEXHVBQUMwXHVBQUMyXHVBQURCLVx1QUFERFx1QUFFMC1cdUFBRUFcdUFBRjItXHVBQUY0XHVBQjAxLVx1QUIwNlx1QUIwOS1cdUFCMEVcdUFCMTEtXHVBQjE2XHVBQjIwLVx1QUIyNlx1QUIyOC1cdUFCMkVcdUFCMzAtXHVBQjVBXHVBQjVDLVx1QUI2OVx1QUI3MC1cdUFCRTJcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQTZEXHVGQTcwLVx1RkFEOVx1RkIwMC1cdUZCMDZcdUZCMTMtXHVGQjE3XHVGQjFEXHVGQjFGLVx1RkIyOFx1RkIyQS1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJCMVx1RkJEMy1cdUZEM0RcdUZENTAtXHVGRDhGXHVGRDkyLVx1RkRDN1x1RkRGMC1cdUZERkJcdUZFNzAtXHVGRTc0XHVGRTc2LVx1RkVGQ1x1RkYyMS1cdUZGM0FcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURFODAtXHVERTlDXHVERUEwLVx1REVEMFx1REYwMC1cdURGMUZcdURGMkQtXHVERjQwXHVERjQyLVx1REY0OVx1REY1MC1cdURGNzVcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZdfFx1RDgwMVtcdURDMDAtXHVEQzlEXHVEQ0IwLVx1RENEM1x1RENEOC1cdURDRkJcdUREMDAtXHVERDI3XHVERDMwLVx1REQ2M1x1REQ3MC1cdUREN0FcdUREN0MtXHVERDhBXHVERDhDLVx1REQ5Mlx1REQ5NFx1REQ5NVx1REQ5Ny1cdUREQTFcdUREQTMtXHVEREIxXHVEREIzLVx1RERCOVx1RERCQlx1RERCQ1x1REUwMC1cdURGMzZcdURGNDAtXHVERjU1XHVERjYwLVx1REY2N1x1REY4MC1cdURGODVcdURGODctXHVERkIwXHVERkIyLVx1REZCQV18XHVEODAyW1x1REMwMC1cdURDMDVcdURDMDhcdURDMEEtXHVEQzM1XHVEQzM3XHVEQzM4XHVEQzNDXHVEQzNGLVx1REM1NVx1REM2MC1cdURDNzZcdURDODAtXHVEQzlFXHVEQ0UwLVx1RENGMlx1RENGNFx1RENGNVx1REQwMC1cdUREMTVcdUREMjAtXHVERDM5XHVERDgwLVx1RERCN1x1RERCRVx1RERCRlx1REUwMFx1REUxMC1cdURFMTNcdURFMTUtXHVERTE3XHVERTE5LVx1REUzNVx1REU2MC1cdURFN0NcdURFODAtXHVERTlDXHVERUMwLVx1REVDN1x1REVDOS1cdURFRTRcdURGMDAtXHVERjM1XHVERjQwLVx1REY1NVx1REY2MC1cdURGNzJcdURGODAtXHVERjkxXXxcdUQ4MDNbXHVEQzAwLVx1REM0OFx1REM4MC1cdURDQjJcdURDQzAtXHVEQ0YyXHVERDAwLVx1REQyM1x1REU4MC1cdURFQTlcdURFQjBcdURFQjFcdURGMDAtXHVERjFDXHVERjI3XHVERjMwLVx1REY0NVx1REY3MC1cdURGODFcdURGQjAtXHVERkM0XHVERkUwLVx1REZGNl18XHVEODA0W1x1REMwMy1cdURDMzdcdURDNzFcdURDNzJcdURDNzVcdURDODMtXHVEQ0FGXHVEQ0QwLVx1RENFOFx1REQwMy1cdUREMjZcdURENDRcdURENDdcdURENTAtXHVERDcyXHVERDc2XHVERDgzLVx1RERCMlx1RERDMS1cdUREQzRcdUREREFcdURERENcdURFMDAtXHVERTExXHVERTEzLVx1REUyQlx1REUzRlx1REU0MFx1REU4MC1cdURFODZcdURFODhcdURFOEEtXHVERThEXHVERThGLVx1REU5RFx1REU5Ri1cdURFQThcdURFQjAtXHVERURFXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzRFx1REY1MFx1REY1RC1cdURGNjFdfFx1RDgwNVtcdURDMDAtXHVEQzM0XHVEQzQ3LVx1REM0QVx1REM1Ri1cdURDNjFcdURDODAtXHVEQ0FGXHVEQ0M0XHVEQ0M1XHVEQ0M3XHVERDgwLVx1RERBRVx1REREOC1cdUREREJcdURFMDAtXHVERTJGXHVERTQ0XHVERTgwLVx1REVBQVx1REVCOFx1REYwMC1cdURGMUFcdURGNDAtXHVERjQ2XXxcdUQ4MDZbXHVEQzAwLVx1REMyQlx1RENBMC1cdURDREZcdURDRkYtXHVERDA2XHVERDA5XHVERDBDLVx1REQxM1x1REQxNVx1REQxNlx1REQxOC1cdUREMkZcdUREM0ZcdURENDFcdUREQTAtXHVEREE3XHVEREFBLVx1REREMFx1RERFMVx1RERFM1x1REUwMFx1REUwQi1cdURFMzJcdURFM0FcdURFNTBcdURFNUMtXHVERTg5XHVERTlEXHVERUIwLVx1REVGOF18XHVEODA3W1x1REMwMC1cdURDMDhcdURDMEEtXHVEQzJFXHVEQzQwXHVEQzcyLVx1REM4Rlx1REQwMC1cdUREMDZcdUREMDhcdUREMDlcdUREMEItXHVERDMwXHVERDQ2XHVERDYwLVx1REQ2NVx1REQ2N1x1REQ2OFx1REQ2QS1cdUREODlcdUREOThcdURFRTAtXHVERUYyXHVERjAyXHVERjA0LVx1REYxMFx1REYxMi1cdURGMzNcdURGQjBdfFx1RDgwOFtcdURDMDAtXHVERjk5XXxcdUQ4MDlbXHVEQzgwLVx1REQ0M118XHVEODBCW1x1REY5MC1cdURGRjBdfFtcdUQ4MENcdUQ4MUMtXHVEODIwXHVEODIyXHVEODQwLVx1RDg2OFx1RDg2QS1cdUQ4NkNcdUQ4NkYtXHVEODcyXHVEODc0LVx1RDg3OVx1RDg4MC1cdUQ4ODNcdUQ4ODUtXHVEODg3XVtcdURDMDAtXHVERkZGXXxcdUQ4MERbXHVEQzAwLVx1REMyRlx1REM0MS1cdURDNDZdfFx1RDgxMVtcdURDMDAtXHVERTQ2XXxcdUQ4MUFbXHVEQzAwLVx1REUzOFx1REU0MC1cdURFNUVcdURFNzAtXHVERUJFXHVERUQwLVx1REVFRFx1REYwMC1cdURGMkZcdURGNDAtXHVERjQzXHVERjYzLVx1REY3N1x1REY3RC1cdURGOEZdfFx1RDgxQltcdURFNDAtXHVERTdGXHVERjAwLVx1REY0QVx1REY1MFx1REY5My1cdURGOUZcdURGRTBcdURGRTFcdURGRTNdfFx1RDgyMVtcdURDMDAtXHVERkY3XXxcdUQ4MjNbXHVEQzAwLVx1RENENVx1REQwMC1cdUREMDhdfFx1RDgyQltcdURGRjAtXHVERkYzXHVERkY1LVx1REZGQlx1REZGRFx1REZGRV18XHVEODJDW1x1REMwMC1cdUREMjJcdUREMzJcdURENTAtXHVERDUyXHVERDU1XHVERDY0LVx1REQ2N1x1REQ3MC1cdURFRkJdfFx1RDgyRltcdURDMDAtXHVEQzZBXHVEQzcwLVx1REM3Q1x1REM4MC1cdURDODhcdURDOTAtXHVEQzk5XXxcdUQ4MzVbXHVEQzAwLVx1REM1NFx1REM1Ni1cdURDOUNcdURDOUVcdURDOUZcdURDQTJcdURDQTVcdURDQTZcdURDQTktXHVEQ0FDXHVEQ0FFLVx1RENCOVx1RENCQlx1RENCRC1cdURDQzNcdURDQzUtXHVERDA1XHVERDA3LVx1REQwQVx1REQwRC1cdUREMTRcdUREMTYtXHVERDFDXHVERDFFLVx1REQzOVx1REQzQi1cdUREM0VcdURENDAtXHVERDQ0XHVERDQ2XHVERDRBLVx1REQ1MFx1REQ1Mi1cdURFQTVcdURFQTgtXHVERUMwXHVERUMyLVx1REVEQVx1REVEQy1cdURFRkFcdURFRkMtXHVERjE0XHVERjE2LVx1REYzNFx1REYzNi1cdURGNEVcdURGNTAtXHVERjZFXHVERjcwLVx1REY4OFx1REY4QS1cdURGQThcdURGQUEtXHVERkMyXHVERkM0LVx1REZDQl18XHVEODM3W1x1REYwMC1cdURGMUVcdURGMjUtXHVERjJBXXxcdUQ4MzhbXHVEQzMwLVx1REM2RFx1REQwMC1cdUREMkNcdUREMzctXHVERDNEXHVERDRFXHVERTkwLVx1REVBRFx1REVDMC1cdURFRUJdfFx1RDgzOVtcdURDRDAtXHVEQ0VCXHVERkUwLVx1REZFNlx1REZFOC1cdURGRUJcdURGRURcdURGRUVcdURGRjAtXHVERkZFXXxcdUQ4M0FbXHVEQzAwLVx1RENDNFx1REQwMC1cdURENDNcdURENEJdfFx1RDgzQltcdURFMDAtXHVERTAzXHVERTA1LVx1REUxRlx1REUyMVx1REUyMlx1REUyNFx1REUyN1x1REUyOS1cdURFMzJcdURFMzQtXHVERTM3XHVERTM5XHVERTNCXHVERTQyXHVERTQ3XHVERTQ5XHVERTRCXHVERTRELVx1REU0Rlx1REU1MVx1REU1Mlx1REU1NFx1REU1N1x1REU1OVx1REU1Qlx1REU1RFx1REU1Rlx1REU2MVx1REU2Mlx1REU2NFx1REU2Ny1cdURFNkFcdURFNkMtXHVERTcyXHVERTc0LVx1REU3N1x1REU3OS1cdURFN0NcdURFN0VcdURFODAtXHVERTg5XHVERThCLVx1REU5Qlx1REVBMS1cdURFQTNcdURFQTUtXHVERUE5XHVERUFCLVx1REVCQl18XHVEODY5W1x1REMwMC1cdURFREZcdURGMDAtXHVERkZGXXxcdUQ4NkRbXHVEQzAwLVx1REYzOVx1REY0MC1cdURGRkZdfFx1RDg2RVtcdURDMDAtXHVEQzFEXHVEQzIwLVx1REZGRl18XHVEODczW1x1REMwMC1cdURFQTFcdURFQjAtXHVERkZGXXxcdUQ4N0FbXHVEQzAwLVx1REZFMF18XHVEODdFW1x1REMwMC1cdURFMURdfFx1RDg4NFtcdURDMDAtXHVERjRBXHVERjUwLVx1REZGRl18XHVEODg4W1x1REMwMC1cdURGQUZdKSokLy50ZXN0KHQpfSx7bmFtZToic3RyaW5nIix0ZXN0OmpmfSx7bmFtZToiQ2hhaW4iLHRlc3Q6X3B9LHtuYW1lOiJBcnJheSIsdGVzdDpVZn0se25hbWU6Ik1hdHJpeCIsdGVzdDpxZn0se25hbWU6IkRlbnNlTWF0cml4Iix0ZXN0OkdmfSx7bmFtZToiU3BhcnNlTWF0cml4Iix0ZXN0OllmfSx7bmFtZToiUmFuZ2UiLHRlc3Q6WGZ9LHtuYW1lOiJJbmRleCIsdGVzdDpXZn0se25hbWU6ImJvb2xlYW4iLHRlc3Q6SGZ9LHtuYW1lOiJSZXN1bHRTZXQiLHRlc3Q6WmZ9LHtuYW1lOiJIZWxwIix0ZXN0OktmfSx7bmFtZToiZnVuY3Rpb24iLHRlc3Q6SmZ9LHtuYW1lOiJEYXRlIix0ZXN0OlFmfSx7bmFtZToiUmVnRXhwIix0ZXN0OiRmfSx7bmFtZToibnVsbCIsdGVzdDplcH0se25hbWU6InVuZGVmaW5lZCIsdGVzdDpucH0se25hbWU6IkFjY2Vzc29yTm9kZSIsdGVzdDpycH0se25hbWU6IkFycmF5Tm9kZSIsdGVzdDppcH0se25hbWU6IkFzc2lnbm1lbnROb2RlIix0ZXN0Om9wfSx7bmFtZToiQmxvY2tOb2RlIix0ZXN0OnNwfSx7bmFtZToiQ29uZGl0aW9uYWxOb2RlIix0ZXN0OmFwfSx7bmFtZToiQ29uc3RhbnROb2RlIix0ZXN0OnVwfSx7bmFtZToiRnVuY3Rpb25Ob2RlIix0ZXN0OmxwfSx7bmFtZToiRnVuY3Rpb25Bc3NpZ25tZW50Tm9kZSIsdGVzdDpjcH0se25hbWU6IkluZGV4Tm9kZSIsdGVzdDpocH0se25hbWU6Ik5vZGUiLHRlc3Q6ZnB9LHtuYW1lOiJPYmplY3ROb2RlIix0ZXN0OnBwfSx7bmFtZToiT3BlcmF0b3JOb2RlIix0ZXN0OmRwfSx7bmFtZToiUGFyZW50aGVzaXNOb2RlIix0ZXN0OmdwfSx7bmFtZToiUmFuZ2VOb2RlIix0ZXN0OnlwfSx7bmFtZToiUmVsYXRpb25hbE5vZGUiLHRlc3Q6bXB9LHtuYW1lOiJTeW1ib2xOb2RlIix0ZXN0OnZwfSx7bmFtZToiTWFwIix0ZXN0OnBkfSx7bmFtZToiT2JqZWN0Iix0ZXN0OnRwfV0pLG8uYWRkQ29udmVyc2lvbnMoW3tmcm9tOiJudW1iZXIiLHRvOiJCaWdOdW1iZXIiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7aWYoZXx8eWQodCksZnVuY3Rpb24odCl7cmV0dXJuIHQudG9FeHBvbmVudGlhbCgpLnJlcGxhY2UoL2UuKiQvLCIiKS5yZXBsYWNlKC9eMFwuPzAqfFwuLywiIikubGVuZ3RofSh0KT4xNSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgaW1wbGljaXRseSBjb252ZXJ0IGEgbnVtYmVyIHdpdGggPjE1IHNpZ25pZmljYW50IGRpZ2l0cyB0byBCaWdOdW1iZXIgKHZhbHVlOiAiK3QrIikuIFVzZSBmdW5jdGlvbiBiaWdudW1iZXIoeCkgdG8gY29udmVydCB0byBCaWdOdW1iZXIuIik7cmV0dXJuIG5ldyBlKHQpfX0se2Zyb206Im51bWJlciIsdG86IkNvbXBsZXgiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIG58fG1kKHQpLG5ldyBuKHQsMCl9fSx7ZnJvbToiQmlnTnVtYmVyIix0bzoiQ29tcGxleCIsY29udmVydDpmdW5jdGlvbih0KXtyZXR1cm4gbnx8bWQodCksbmV3IG4odC50b051bWJlcigpLDApfX0se2Zyb206IkZyYWN0aW9uIix0bzoiQmlnTnVtYmVyIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBpbXBsaWNpdGx5IGNvbnZlcnQgYSBGcmFjdGlvbiB0byBCaWdOdW1iZXIgb3IgdmljZSB2ZXJzYS4gVXNlIGZ1bmN0aW9uIGJpZ251bWJlcih4KSB0byBjb252ZXJ0IHRvIEJpZ051bWJlciBvciBmcmFjdGlvbih4KSB0byBjb252ZXJ0IHRvIEZyYWN0aW9uLiIpfX0se2Zyb206IkZyYWN0aW9uIix0bzoiQ29tcGxleCIsY29udmVydDpmdW5jdGlvbih0KXtyZXR1cm4gbnx8bWQodCksbmV3IG4odC52YWx1ZU9mKCksMCl9fSx7ZnJvbToibnVtYmVyIix0bzoiRnJhY3Rpb24iLGNvbnZlcnQ6ZnVuY3Rpb24odCl7aXx8dmQodCk7dmFyIGU9bmV3IGkodCk7aWYoZS52YWx1ZU9mKCkhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBpbXBsaWNpdGx5IGNvbnZlcnQgYSBudW1iZXIgdG8gYSBGcmFjdGlvbiB3aGVuIHRoZXJlIHdpbGwgYmUgYSBsb3NzIG9mIHByZWNpc2lvbiAodmFsdWU6ICIrdCsiKS4gVXNlIGZ1bmN0aW9uIGZyYWN0aW9uKHgpIHRvIGNvbnZlcnQgdG8gRnJhY3Rpb24uIik7cmV0dXJuIGV9fSx7ZnJvbToic3RyaW5nIix0bzoibnVtYmVyIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3ZhciBlPU51bWJlcih0KTtpZihpc05hTihlKSl0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK3QrJyIgdG8gYSBudW1iZXInKTtyZXR1cm4gZX19LHtmcm9tOiJzdHJpbmciLHRvOiJCaWdOdW1iZXIiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7ZXx8eWQodCk7dHJ5e3JldHVybiBuZXcgZSh0KX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK3QrJyIgdG8gQmlnTnVtYmVyJyl9fX0se2Zyb206InN0cmluZyIsdG86IkZyYWN0aW9uIixjb252ZXJ0OmZ1bmN0aW9uKHQpe2l8fHZkKHQpO3RyeXtyZXR1cm4gbmV3IGkodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCAiJyt0KyciIHRvIEZyYWN0aW9uJyl9fX0se2Zyb206InN0cmluZyIsdG86IkNvbXBsZXgiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7bnx8bWQodCk7dHJ5e3JldHVybiBuZXcgbih0KX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0ICInK3QrJyIgdG8gQ29tcGxleCcpfX19LHtmcm9tOiJib29sZWFuIix0bzoibnVtYmVyIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3JldHVybit0fX0se2Zyb206ImJvb2xlYW4iLHRvOiJCaWdOdW1iZXIiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIGV8fHlkKHQpLG5ldyBlKCt0KX19LHtmcm9tOiJib29sZWFuIix0bzoiRnJhY3Rpb24iLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIGl8fHZkKHQpLG5ldyBpKCt0KX19LHtmcm9tOiJib29sZWFuIix0bzoic3RyaW5nIixjb252ZXJ0OmZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcodCl9fSx7ZnJvbToiQXJyYXkiLHRvOiJNYXRyaXgiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHJ8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29udmVydCBhcnJheSBpbnRvIGEgTWF0cml4OiBubyBjbGFzcyAnRGVuc2VNYXRyaXgnIHByb3ZpZGVkIil9KCksbmV3IHIodCl9fSx7ZnJvbToiTWF0cml4Iix0bzoiQXJyYXkiLGNvbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWVPZigpfX1dKSxvLm9uTWlzbWF0Y2g9KHQsZSxuKT0+e3ZhciByPW8uY3JlYXRlRXJyb3IodCxlLG4pO2lmKFsid3JvbmdUeXBlIiwibWlzbWF0Y2giXS5pbmNsdWRlcyhyLmRhdGEuY2F0ZWdvcnkpJiYxPT09ZS5sZW5ndGgmJlZmKGVbMF0pJiZuLnNvbWUoKHQ9PiF0LnBhcmFtcy5pbmNsdWRlcygiLCIpKSkpe3ZhciBpPW5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uICciLmNvbmNhdCh0LCInIGRvZXNuJ3QgYXBwbHkgdG8gbWF0cmljZXMuIFRvIGNhbGwgaXQgIikrImVsZW1lbnR3aXNlIG9uIGEgbWF0cml4ICdNJywgdHJ5ICdtYXAoTSwgIi5jb25jYXQodCwiKScuIikpO3Rocm93IGkuZGF0YT1yLmRhdGEsaX10aHJvdyByfSxvLm9uTWlzbWF0Y2g9KHQsZSxuKT0+e3ZhciByPW8uY3JlYXRlRXJyb3IodCxlLG4pO2lmKFsid3JvbmdUeXBlIiwibWlzbWF0Y2giXS5pbmNsdWRlcyhyLmRhdGEuY2F0ZWdvcnkpJiYxPT09ZS5sZW5ndGgmJlZmKGVbMF0pJiZuLnNvbWUoKHQ9PiF0LnBhcmFtcy5pbmNsdWRlcygiLCIpKSkpe3ZhciBpPW5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uICciLmNvbmNhdCh0LCInIGRvZXNuJ3QgYXBwbHkgdG8gbWF0cmljZXMuIFRvIGNhbGwgaXQgIikrImVsZW1lbnR3aXNlIG9uIGEgbWF0cml4ICdNJywgdHJ5ICdtYXAoTSwgIi5jb25jYXQodCwiKScuIikpO3Rocm93IGkuZGF0YT1yLmRhdGEsaX10aHJvdyByfSxvfSkpO2Z1bmN0aW9uIHlkKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgdmFsdWUgIi5jb25jYXQodCwiIGludG8gYSBCaWdOdW1iZXI6IG5vIGNsYXNzICdCaWdOdW1iZXInIHByb3ZpZGVkIikpfWZ1bmN0aW9uIG1kKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgdmFsdWUgIi5jb25jYXQodCwiIGludG8gYSBDb21wbGV4IG51bWJlcjogbm8gY2xhc3MgJ0NvbXBsZXgnIHByb3ZpZGVkIikpfWZ1bmN0aW9uIHZkKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGNvbnZlcnQgdmFsdWUgIi5jb25jYXQodCwiIGludG8gYSBGcmFjdGlvbiwgbm8gY2xhc3MgJ0ZyYWN0aW9uJyBwcm92aWRlZC4iKSl9dmFyIF9kLHhkLHdkPTllMTUsYmQ9MWU5LERkPSIwMTIzNDU2Nzg5YWJjZGVmIixFZD0iMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNjQyMDc2MDExMDE0ODg2Mjg3NzI5NzYwMzMzMjc5MDA5Njc1NzI2MDk2NzczNTI0ODAyMzU5OTcyMDUwODk1OTgyOTgzNDE5Njc3ODQwNDIyODYyNDg2MzM0MDk1MjU0NjUwODI4MDY3NTY2NjYyODczNjkwOTg3ODE2ODk0ODI5MDcyMDgzMjU1NTQ2ODA4NDM3OTk4OTQ4MjYyMzMxOTg1MjgzOTM1MDUzMDg5NjUzNzc3MzI2Mjg4NDYxNjMzNjYyMjIyODc2OTgyMTk4ODY3NDY1NDM2Njc0NzQ0MDQyNDMyNzQzNjUxNTUwNDg5MzQzMTQ5MzkzOTE0Nzk2MTk0MDQ0MDAyMjIxMDUxMDE3MTQxNzQ4MDAzNjg4MDg0MDEyNjQ3MDgwNjg1NTY3NzQzMjE2MjI4MzU1MjIwMTE0ODA0NjYzNzE1NjU5MTIxMzczNDUwNzQ3ODU2OTQ3NjgzNDYzNjE2NzkyMTAxODA2NDQ1MDcwNjQ4MDAwMjc3NTAyNjg0OTE2NzQ2NTUwNTg2ODU2OTM1NjczNDIwNjcwNTgxMTM2NDI5MjI0NTU0NDA1NzU4OTI1NzI0MjA4MjQxMzE0Njk1Njg5MDE2NzU4OTQwMjU2Nzc2MzExMzU2OTE5MjkyMDMzMzc2NTg3MTQxNjYwMjMwMTA1NzAzMDg5NjM0NTcyMDc1NDQwMzcwODQ3NDY5OTQwMTY4MjY5MjgyODA4NDgxMTg0Mjg5MzE0ODQ4NTI0OTQ4NjQ0ODcxOTI3ODA5Njc2MjcxMjc1Nzc1Mzk3MDI3NjY4NjA1OTUyNDk2NzE2Njc0MTgzNDg1NzA0NDIyNTA3MTk3OTY1MDA0NzE0OTUxMDUwNDkyMjE0Nzc2NTY3NjM2OTM4NjYyOTc2OTc5NTIyMTEwNzE4MjY0NTQ5NzM0NzcyNjYyNDI1NzA5NDI5MzIyNTgyNzk4NTAyNTg1NTA5Nzg1MjY1MzgzMjA3NjA2NzI2MzE3MTY0MzA5NTA1OTk1MDg3ODA3NTIzNzEwMzMzMTAxMTk3ODU3NTQ3MzMxNTQxNDIxODA4NDI3NTQzODYzNTkxNzc4MTE3MDU0MzA5ODI3NDgyMzg1MDQ1NjQ4MDE5MDk1NjEwMjk5MjkxODI0MzE4MjM3NTI1MzU3NzA5NzUwNTM5NTY1MTg3Njk3NTEwMzc0OTcwODg4NjkyMTgwMjA1MTg5MzM5NTA3MjM4NTM5MjA1MTQ0NjM0MTk3MjY1Mjg3Mjg2OTY1MTEwODYyNTcxNDkyMTk4ODQ5OTc4NzQ4ODczNzcxMzQ1Njg2MjA5MTY3MDU4IixDZD0iMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI4ODQxOTcxNjkzOTkzNzUxMDU4MjA5NzQ5NDQ1OTIzMDc4MTY0MDYyODYyMDg5OTg2MjgwMzQ4MjUzNDIxMTcwNjc5ODIxNDgwODY1MTMyODIzMDY2NDcwOTM4NDQ2MDk1NTA1ODIyMzE3MjUzNTk0MDgxMjg0ODExMTc0NTAyODQxMDI3MDE5Mzg1MjExMDU1NTk2NDQ2MjI5NDg5NTQ5MzAzODE5NjQ0Mjg4MTA5NzU2NjU5MzM0NDYxMjg0NzU2NDgyMzM3ODY3ODMxNjUyNzEyMDE5MDkxNDU2NDg1NjY5MjM0NjAzNDg2MTA0NTQzMjY2NDgyMTMzOTM2MDcyNjAyNDkxNDEyNzM3MjQ1ODcwMDY2MDYzMTU1ODgxNzQ4ODE1MjA5MjA5NjI4MjkyNTQwOTE3MTUzNjQzNjc4OTI1OTAzNjAwMTEzMzA1MzA1NDg4MjA0NjY1MjEzODQxNDY5NTE5NDE1MTE2MDk0MzMwNTcyNzAzNjU3NTk1OTE5NTMwOTIxODYxMTczODE5MzI2MTE3OTMxMDUxMTg1NDgwNzQ0NjIzNzk5NjI3NDk1NjczNTE4ODU3NTI3MjQ4OTEyMjc5MzgxODMwMTE5NDkxMjk4MzM2NzMzNjI0NDA2NTY2NDMwODYwMjEzOTQ5NDYzOTUyMjQ3MzcxOTA3MDIxNzk4NjA5NDM3MDI3NzA1MzkyMTcxNzYyOTMxNzY3NTIzODQ2NzQ4MTg0Njc2Njk0MDUxMzIwMDA1NjgxMjcxNDUyNjM1NjA4Mjc3ODU3NzEzNDI3NTc3ODk2MDkxNzM2MzcxNzg3MjE0Njg0NDA5MDEyMjQ5NTM0MzAxNDY1NDk1ODUzNzEwNTA3OTIyNzk2ODkyNTg5MjM1NDIwMTk5NTYxMTIxMjkwMjE5NjA4NjQwMzQ0MTgxNTk4MTM2Mjk3NzQ3NzEzMDk5NjA1MTg3MDcyMTEzNDk5OTk5OTgzNzI5NzgwNDk5NTEwNTk3MzE3MzI4MTYwOTYzMTg1OTUwMjQ0NTk0NTUzNDY5MDgzMDI2NDI1MjIzMDgyNTMzNDQ2ODUwMzUyNjE5MzExODgxNzEwMTAwMDMxMzc4Mzg3NTI4ODY1ODc1MzMyMDgzODE0MjA2MTcxNzc2NjkxNDczMDM1OTgyNTM0OTA0Mjg3NTU0Njg3MzExNTk1NjI4NjM4ODIzNTM3ODc1OTM3NTE5NTc3ODE4NTc3ODA1MzIxNzEyMjY4MDY2MTMwMDE5Mjc4NzY2MTExOTU5MDkyMTY0MjAxOTg5MzgwOTUyNTcyMDEwNjU0ODU4NjMyNzg5IixTZD17cHJlY2lzaW9uOjIwLHJvdW5kaW5nOjQsbW9kdWxvOjEsdG9FeHBOZWc6LTcsdG9FeHBQb3M6MjEsbWluRTotd2QsbWF4RTp3ZCxjcnlwdG86ITF9LEFkPSEwLE5kPSJbRGVjaW1hbEVycm9yXSAiLElkPU5kKyJJbnZhbGlkIGFyZ3VtZW50OiAiLE1kPU5kKyJQcmVjaXNpb24gbGltaXQgZXhjZWVkZWQiLEZkPU5kKyJjcnlwdG8gdW5hdmFpbGFibGUiLFRkPSJbb2JqZWN0IERlY2ltYWxdIixPZD1NYXRoLmZsb29yLExkPU1hdGgucG93LFBkPS9eMGIoWzAxXSsoXC5bMDFdKik/fFwuWzAxXSspKHBbKy1dP1xkKyk/JC9pLFJkPS9eMHgoWzAtOWEtZl0rKFwuWzAtOWEtZl0qKT98XC5bMC05YS1mXSspKHBbKy1dP1xkKyk/JC9pLEJkPS9eMG8oWzAtN10rKFwuWzAtN10qKT98XC5bMC03XSspKHBbKy1dP1xkKyk/JC9pLGtkPS9eKFxkKyhcLlxkKik/fFwuXGQrKShlWystXT9cZCspPyQvaSx6ZD0xZTcsamQ9NyxVZD1FZC5sZW5ndGgtMSxxZD1DZC5sZW5ndGgtMSxWZD17dG9TdHJpbmdUYWc6VGR9O2Z1bmN0aW9uIEdkKHQpe3ZhciBlLG4scixpPXQubGVuZ3RoLTEsbz0iIixzPXRbMF07aWYoaT4wKXtmb3Iobys9cyxlPTE7ZTxpO2UrKylyPXRbZV0rIiIsKG49amQtci5sZW5ndGgpJiYobys9ZWcobikpLG8rPXI7cz10W2VdLChuPWpkLShyPXMrIiIpLmxlbmd0aCkmJihvKz1lZyhuKSl9ZWxzZSBpZigwPT09cylyZXR1cm4iMCI7Zm9yKDtzJTEwPT0wOylzLz0xMDtyZXR1cm4gbytzfWZ1bmN0aW9uIFlkKHQsZSxuKXtpZih0IT09fn50fHx0PGV8fHQ+bil0aHJvdyBFcnJvcihJZCt0KX1mdW5jdGlvbiBYZCh0LGUsbixyKXt2YXIgaSxvLHMsYTtmb3Iobz10WzBdO28+PTEwO28vPTEwKS0tZTtyZXR1cm4tLWU8MD8oZSs9amQsaT0wKTooaT1NYXRoLmNlaWwoKGUrMSkvamQpLGUlPWpkKSxvPUxkKDEwLGpkLWUpLGE9dFtpXSVvfDAsbnVsbD09cj9lPDM/KDA9PWU/YT1hLzEwMHwwOjE9PWUmJihhPWEvMTB8MCkscz1uPDQmJjk5OTk5PT1hfHxuPjMmJjQ5OTk5PT1hfHw1ZTQ9PWF8fDA9PWEpOnM9KG48NCYmYSsxPT1vfHxuPjMmJmErMT09by8yKSYmKHRbaSsxXS9vLzEwMHwwKT09TGQoMTAsZS0yKS0xfHwoYT09by8yfHwwPT1hKSYmISh0W2krMV0vby8xMDB8MCk6ZTw0PygwPT1lP2E9YS8xZTN8MDoxPT1lP2E9YS8xMDB8MDoyPT1lJiYoYT1hLzEwfDApLHM9KHJ8fG48NCkmJjk5OTk9PWF8fCFyJiZuPjMmJjQ5OTk9PWEpOnM9KChyfHxuPDQpJiZhKzE9PW98fCFyJiZuPjMmJmErMT09by8yKSYmKHRbaSsxXS9vLzFlM3wwKT09TGQoMTAsZS0zKS0xLHN9ZnVuY3Rpb24gV2QodCxlLG4pe2Zvcih2YXIgcixpLG89WzBdLHM9MCxhPXQubGVuZ3RoO3M8YTspe2ZvcihpPW8ubGVuZ3RoO2ktLTspb1tpXSo9ZTtmb3Iob1swXSs9RGQuaW5kZXhPZih0LmNoYXJBdChzKyspKSxyPTA7cjxvLmxlbmd0aDtyKyspb1tyXT5uLTEmJih2b2lkIDA9PT1vW3IrMV0mJihvW3IrMV09MCksb1tyKzFdKz1vW3JdL258MCxvW3JdJT1uKX1yZXR1cm4gby5yZXZlcnNlKCl9VmQuYWJzb2x1dGVWYWx1ZT1WZC5hYnM9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKTtyZXR1cm4gdC5zPDAmJih0LnM9MSksWmQodCl9LFZkLmNlaWw9ZnVuY3Rpb24oKXtyZXR1cm4gWmQobmV3IHRoaXMuY29uc3RydWN0b3IodGhpcyksdGhpcy5lKzEsMil9LFZkLmNsYW1wZWRUbz1WZC5jbGFtcD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1uLmNvbnN0cnVjdG9yO2lmKHQ9bmV3IHIodCksZT1uZXcgcihlKSwhdC5zfHwhZS5zKXJldHVybiBuZXcgcihOYU4pO2lmKHQuZ3QoZSkpdGhyb3cgRXJyb3IoSWQrZSk7cmV0dXJuIG4uY21wKHQpPDA/dDpuLmNtcChlKT4wP2U6bmV3IHIobil9LFZkLmNvbXBhcmVkVG89VmQuY21wPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG89dGhpcyxzPW8uZCxhPSh0PW5ldyBvLmNvbnN0cnVjdG9yKHQpKS5kLHU9by5zLGM9dC5zO2lmKCFzfHwhYSlyZXR1cm4gdSYmYz91IT09Yz91OnM9PT1hPzA6IXNedTwwPzE6LTE6TmFOO2lmKCFzWzBdfHwhYVswXSlyZXR1cm4gc1swXT91OmFbMF0/LWM6MDtpZih1IT09YylyZXR1cm4gdTtpZihvLmUhPT10LmUpcmV0dXJuIG8uZT50LmVedTwwPzE6LTE7Zm9yKGU9MCxuPShyPXMubGVuZ3RoKTwoaT1hLmxlbmd0aCk/cjppO2U8bjsrK2UpaWYoc1tlXSE9PWFbZV0pcmV0dXJuIHNbZV0+YVtlXV51PDA/MTotMTtyZXR1cm4gcj09PWk/MDpyPmledTwwPzE6LTF9LFZkLmNvc2luZT1WZC5jb3M9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxyPW4uY29uc3RydWN0b3I7cmV0dXJuIG4uZD9uLmRbMF0/KHQ9ci5wcmVjaXNpb24sZT1yLnJvdW5kaW5nLHIucHJlY2lzaW9uPXQrTWF0aC5tYXgobi5lLG4uc2QoKSkramQsci5yb3VuZGluZz0xLG49ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7aWYoZS5pc1plcm8oKSlyZXR1cm4gZTtyPWUuZC5sZW5ndGgscjwzMj8obj1NYXRoLmNlaWwoci8zKSxpPSgxL2xnKDQsbikpLnRvU3RyaW5nKCkpOihuPTE2LGk9IjIuMzI4MzA2NDM2NTM4Njk2Mjg5MDYyNWUtMTAiKSx0LnByZWNpc2lvbis9bixlPWNnKHQsMSxlLnRpbWVzKGkpLG5ldyB0KDEpKTtmb3IodmFyIG89bjtvLS07KXt2YXIgcz1lLnRpbWVzKGUpO2U9cy50aW1lcyhzKS5taW51cyhzKS50aW1lcyg4KS5wbHVzKDEpfXJldHVybiB0LnByZWNpc2lvbi09bixlfShyLGhnKHIsbikpLHIucHJlY2lzaW9uPXQsci5yb3VuZGluZz1lLFpkKDI9PXhkfHwzPT14ZD9uLm5lZygpOm4sdCxlLCEwKSk6bmV3IHIoMSk6bmV3IHIoTmFOKX0sVmQuY3ViZVJvb3Q9VmQuY2JydD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGksbyxzLGEsdSxjLGw9dGhpcyxoPWwuY29uc3RydWN0b3I7aWYoIWwuaXNGaW5pdGUoKXx8bC5pc1plcm8oKSlyZXR1cm4gbmV3IGgobCk7Zm9yKEFkPSExLChvPWwucypMZChsLnMqbCwxLzMpKSYmTWF0aC5hYnMobykhPTEvMD9yPW5ldyBoKG8udG9TdHJpbmcoKSk6KG49R2QobC5kKSwobz0oKHQ9bC5lKS1uLmxlbmd0aCsxKSUzKSYmKG4rPTE9PW98fC0yPT1vPyIwIjoiMDAiKSxvPUxkKG4sMS8zKSx0PU9kKCh0KzEpLzMpLSh0JTM9PSh0PDA/LTE6MikpLG89PTEvMD9uPSI1ZSIrdDpuPShuPW8udG9FeHBvbmVudGlhbCgpKS5zbGljZSgwLG4uaW5kZXhPZigiZSIpKzEpK3QsKHI9bmV3IGgobikpLnM9bC5zKSxzPSh0PWgucHJlY2lzaW9uKSszOzspaWYoYz0odT0oYT1yKS50aW1lcyhhKS50aW1lcyhhKSkucGx1cyhsKSxyPUhkKGMucGx1cyhsKS50aW1lcyhhKSxjLnBsdXModSkscysyLDEpLEdkKGEuZCkuc2xpY2UoMCxzKT09PShuPUdkKHIuZCkpLnNsaWNlKDAscykpe2lmKCI5OTk5IiE9KG49bi5zbGljZShzLTMscysxKSkmJihpfHwiNDk5OSIhPW4pKXsoIStufHwhK24uc2xpY2UoMSkmJiI1Ij09bi5jaGFyQXQoMCkpJiYoWmQocix0KzEsMSksZT0hci50aW1lcyhyKS50aW1lcyhyKS5lcShsKSk7YnJlYWt9aWYoIWkmJihaZChhLHQrMSwwKSxhLnRpbWVzKGEpLnRpbWVzKGEpLmVxKGwpKSl7cj1hO2JyZWFrfXMrPTQsaT0xfXJldHVybiBBZD0hMCxaZChyLHQsaC5yb3VuZGluZyxlKX0sVmQuZGVjaW1hbFBsYWNlcz1WZC5kcD1mdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5kLG49TmFOO2lmKGUpe2lmKG49KCh0PWUubGVuZ3RoLTEpLU9kKHRoaXMuZS9qZCkpKmpkLHQ9ZVt0XSlmb3IoO3QlMTA9PTA7dC89MTApbi0tO248MCYmKG49MCl9cmV0dXJuIG59LFZkLmRpdmlkZWRCeT1WZC5kaXY9ZnVuY3Rpb24odCl7cmV0dXJuIEhkKHRoaXMsbmV3IHRoaXMuY29uc3RydWN0b3IodCkpfSxWZC5kaXZpZGVkVG9JbnRlZ2VyQnk9VmQuZGl2VG9JbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gWmQoSGQodGhpcyxuZXcgZSh0KSwwLDEsMSksZS5wcmVjaXNpb24sZS5yb3VuZGluZyl9LFZkLmVxdWFscz1WZC5lcT1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXRoaXMuY21wKHQpfSxWZC5mbG9vcj1mdW5jdGlvbigpe3JldHVybiBaZChuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKSx0aGlzLmUrMSwzKX0sVmQuZ3JlYXRlclRoYW49VmQuZ3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wKHQpPjB9LFZkLmdyZWF0ZXJUaGFuT3JFcXVhbFRvPVZkLmd0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNtcCh0KTtyZXR1cm4gMT09ZXx8MD09PWV9LFZkLmh5cGVyYm9saWNDb3NpbmU9VmQuY29zaD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGksbz10aGlzLHM9by5jb25zdHJ1Y3RvcixhPW5ldyBzKDEpO2lmKCFvLmlzRmluaXRlKCkpcmV0dXJuIG5ldyBzKG8ucz8xLzA6TmFOKTtpZihvLmlzWmVybygpKXJldHVybiBhO249cy5wcmVjaXNpb24scj1zLnJvdW5kaW5nLHMucHJlY2lzaW9uPW4rTWF0aC5tYXgoby5lLG8uc2QoKSkrNCxzLnJvdW5kaW5nPTEsKGk9by5kLmxlbmd0aCk8MzI/ZT0oMS9sZyg0LHQ9TWF0aC5jZWlsKGkvMykpKS50b1N0cmluZygpOih0PTE2LGU9IjIuMzI4MzA2NDM2NTM4Njk2Mjg5MDYyNWUtMTAiKSxvPWNnKHMsMSxvLnRpbWVzKGUpLG5ldyBzKDEpLCEwKTtmb3IodmFyIHUsYz10LGw9bmV3IHMoOCk7Yy0tOyl1PW8udGltZXMobyksbz1hLm1pbnVzKHUudGltZXMobC5taW51cyh1LnRpbWVzKGwpKSkpO3JldHVybiBaZChvLHMucHJlY2lzaW9uPW4scy5yb3VuZGluZz1yLCEwKX0sVmQuaHlwZXJib2xpY1NpbmU9VmQuc2luaD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGk9dGhpcyxvPWkuY29uc3RydWN0b3I7aWYoIWkuaXNGaW5pdGUoKXx8aS5pc1plcm8oKSlyZXR1cm4gbmV3IG8oaSk7aWYoZT1vLnByZWNpc2lvbixuPW8ucm91bmRpbmcsby5wcmVjaXNpb249ZStNYXRoLm1heChpLmUsaS5zZCgpKSs0LG8ucm91bmRpbmc9MSwocj1pLmQubGVuZ3RoKTwzKWk9Y2cobywyLGksaSwhMCk7ZWxzZXt0PSh0PTEuNCpNYXRoLnNxcnQocikpPjE2PzE2OjB8dCxpPWNnKG8sMixpPWkudGltZXMoMS9sZyg1LHQpKSxpLCEwKTtmb3IodmFyIHMsYT1uZXcgbyg1KSx1PW5ldyBvKDE2KSxjPW5ldyBvKDIwKTt0LS07KXM9aS50aW1lcyhpKSxpPWkudGltZXMoYS5wbHVzKHMudGltZXModS50aW1lcyhzKS5wbHVzKGMpKSkpfXJldHVybiBvLnByZWNpc2lvbj1lLG8ucm91bmRpbmc9bixaZChpLGUsbiwhMCl9LFZkLmh5cGVyYm9saWNUYW5nZW50PVZkLnRhbmg9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxyPW4uY29uc3RydWN0b3I7cmV0dXJuIG4uaXNGaW5pdGUoKT9uLmlzWmVybygpP25ldyByKG4pOih0PXIucHJlY2lzaW9uLGU9ci5yb3VuZGluZyxyLnByZWNpc2lvbj10Kzcsci5yb3VuZGluZz0xLEhkKG4uc2luaCgpLG4uY29zaCgpLHIucHJlY2lzaW9uPXQsci5yb3VuZGluZz1lKSk6bmV3IHIobi5zKX0sVmQuaW52ZXJzZUNvc2luZT1WZC5hY29zPWZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLG49ZS5jb25zdHJ1Y3RvcixyPWUuYWJzKCkuY21wKDEpLGk9bi5wcmVjaXNpb24sbz1uLnJvdW5kaW5nO3JldHVybi0xIT09cj8wPT09cj9lLmlzTmVnKCk/JGQobixpLG8pOm5ldyBuKDApOm5ldyBuKE5hTik6ZS5pc1plcm8oKT8kZChuLGkrNCxvKS50aW1lcyguNSk6KG4ucHJlY2lzaW9uPWkrNixuLnJvdW5kaW5nPTEsZT1lLmFzaW4oKSx0PSRkKG4saSs0LG8pLnRpbWVzKC41KSxuLnByZWNpc2lvbj1pLG4ucm91bmRpbmc9byx0Lm1pbnVzKGUpKX0sVmQuaW52ZXJzZUh5cGVyYm9saWNDb3NpbmU9VmQuYWNvc2g9ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxyPW4uY29uc3RydWN0b3I7cmV0dXJuIG4ubHRlKDEpP25ldyByKG4uZXEoMSk/MDpOYU4pOm4uaXNGaW5pdGUoKT8odD1yLnByZWNpc2lvbixlPXIucm91bmRpbmcsci5wcmVjaXNpb249dCtNYXRoLm1heChNYXRoLmFicyhuLmUpLG4uc2QoKSkrNCxyLnJvdW5kaW5nPTEsQWQ9ITEsbj1uLnRpbWVzKG4pLm1pbnVzKDEpLnNxcnQoKS5wbHVzKG4pLEFkPSEwLHIucHJlY2lzaW9uPXQsci5yb3VuZGluZz1lLG4ubG4oKSk6bmV3IHIobil9LFZkLmludmVyc2VIeXBlcmJvbGljU2luZT1WZC5hc2luaD1mdW5jdGlvbigpe3ZhciB0LGUsbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtyZXR1cm4hbi5pc0Zpbml0ZSgpfHxuLmlzWmVybygpP25ldyByKG4pOih0PXIucHJlY2lzaW9uLGU9ci5yb3VuZGluZyxyLnByZWNpc2lvbj10KzIqTWF0aC5tYXgoTWF0aC5hYnMobi5lKSxuLnNkKCkpKzYsci5yb3VuZGluZz0xLEFkPSExLG49bi50aW1lcyhuKS5wbHVzKDEpLnNxcnQoKS5wbHVzKG4pLEFkPSEwLHIucHJlY2lzaW9uPXQsci5yb3VuZGluZz1lLG4ubG4oKSl9LFZkLmludmVyc2VIeXBlcmJvbGljVGFuZ2VudD1WZC5hdGFuaD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGk9dGhpcyxvPWkuY29uc3RydWN0b3I7cmV0dXJuIGkuaXNGaW5pdGUoKT9pLmU+PTA/bmV3IG8oaS5hYnMoKS5lcSgxKT9pLnMvMDppLmlzWmVybygpP2k6TmFOKToodD1vLnByZWNpc2lvbixlPW8ucm91bmRpbmcscj1pLnNkKCksTWF0aC5tYXgocix0KTwyKi1pLmUtMT9aZChuZXcgbyhpKSx0LGUsITApOihvLnByZWNpc2lvbj1uPXItaS5lLGk9SGQoaS5wbHVzKDEpLG5ldyBvKDEpLm1pbnVzKGkpLG4rdCwxKSxvLnByZWNpc2lvbj10KzQsby5yb3VuZGluZz0xLGk9aS5sbigpLG8ucHJlY2lzaW9uPXQsby5yb3VuZGluZz1lLGkudGltZXMoLjUpKSk6bmV3IG8oTmFOKX0sVmQuaW52ZXJzZVNpbmU9VmQuYXNpbj1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGk9dGhpcyxvPWkuY29uc3RydWN0b3I7cmV0dXJuIGkuaXNaZXJvKCk/bmV3IG8oaSk6KGU9aS5hYnMoKS5jbXAoMSksbj1vLnByZWNpc2lvbixyPW8ucm91bmRpbmcsLTEhPT1lPzA9PT1lPygodD0kZChvLG4rNCxyKS50aW1lcyguNSkpLnM9aS5zLHQpOm5ldyBvKE5hTik6KG8ucHJlY2lzaW9uPW4rNixvLnJvdW5kaW5nPTEsaT1pLmRpdihuZXcgbygxKS5taW51cyhpLnRpbWVzKGkpKS5zcXJ0KCkucGx1cygxKSkuYXRhbigpLG8ucHJlY2lzaW9uPW4sby5yb3VuZGluZz1yLGkudGltZXMoMikpKX0sVmQuaW52ZXJzZVRhbmdlbnQ9VmQuYXRhbj1mdW5jdGlvbigpe3ZhciB0LGUsbixyLGksbyxzLGEsdSxjPXRoaXMsbD1jLmNvbnN0cnVjdG9yLGg9bC5wcmVjaXNpb24sZj1sLnJvdW5kaW5nO2lmKGMuaXNGaW5pdGUoKSl7aWYoYy5pc1plcm8oKSlyZXR1cm4gbmV3IGwoYyk7aWYoYy5hYnMoKS5lcSgxKSYmaCs0PD1xZClyZXR1cm4ocz0kZChsLGgrNCxmKS50aW1lcyguMjUpKS5zPWMucyxzfWVsc2V7aWYoIWMucylyZXR1cm4gbmV3IGwoTmFOKTtpZihoKzQ8PXFkKXJldHVybihzPSRkKGwsaCs0LGYpLnRpbWVzKC41KSkucz1jLnMsc31mb3IobC5wcmVjaXNpb249YT1oKzEwLGwucm91bmRpbmc9MSx0PW49TWF0aC5taW4oMjgsYS9qZCsyfDApO3Q7LS10KWM9Yy5kaXYoYy50aW1lcyhjKS5wbHVzKDEpLnNxcnQoKS5wbHVzKDEpKTtmb3IoQWQ9ITEsZT1NYXRoLmNlaWwoYS9qZCkscj0xLHU9Yy50aW1lcyhjKSxzPW5ldyBsKGMpLGk9YzstMSE9PXQ7KWlmKGk9aS50aW1lcyh1KSxvPXMubWludXMoaS5kaXYocis9MikpLGk9aS50aW1lcyh1KSx2b2lkIDAhPT0ocz1vLnBsdXMoaS5kaXYocis9MikpKS5kW2VdKWZvcih0PWU7cy5kW3RdPT09by5kW3RdJiZ0LS07KTtyZXR1cm4gbiYmKHM9cy50aW1lcygyPDxuLTEpKSxBZD0hMCxaZChzLGwucHJlY2lzaW9uPWgsbC5yb3VuZGluZz1mLCEwKX0sVmQuaXNGaW5pdGU9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuZH0sVmQuaXNJbnRlZ2VyPVZkLmlzSW50PWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmQmJk9kKHRoaXMuZS9qZCk+dGhpcy5kLmxlbmd0aC0yfSxWZC5pc05hTj1mdW5jdGlvbigpe3JldHVybiF0aGlzLnN9LFZkLmlzTmVnYXRpdmU9VmQuaXNOZWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zPDB9LFZkLmlzUG9zaXRpdmU9VmQuaXNQb3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zPjB9LFZkLmlzWmVybz1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5kJiYwPT09dGhpcy5kWzBdfSxWZC5sZXNzVGhhbj1WZC5sdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXAodCk8MH0sVmQubGVzc1RoYW5PckVxdWFsVG89VmQubHRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNtcCh0KTwxfSxWZC5sb2dhcml0aG09VmQubG9nPWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8scyxhLHUsYz10aGlzLGw9Yy5jb25zdHJ1Y3RvcixoPWwucHJlY2lzaW9uLGY9bC5yb3VuZGluZztpZihudWxsPT10KXQ9bmV3IGwoMTApLGU9ITA7ZWxzZXtpZihuPSh0PW5ldyBsKHQpKS5kLHQuczwwfHwhbnx8IW5bMF18fHQuZXEoMSkpcmV0dXJuIG5ldyBsKE5hTik7ZT10LmVxKDEwKX1pZihuPWMuZCxjLnM8MHx8IW58fCFuWzBdfHxjLmVxKDEpKXJldHVybiBuZXcgbChuJiYhblswXT8tMS8wOjEhPWMucz9OYU46bj8wOjEvMCk7aWYoZSlpZihuLmxlbmd0aD4xKW89ITA7ZWxzZXtmb3IoaT1uWzBdO2klMTA9PTA7KWkvPTEwO289MSE9PWl9aWYoQWQ9ITEscz1zZyhjLGE9aCs1KSxyPWU/UWQobCxhKzEwKTpzZyh0LGEpLFhkKCh1PUhkKHMscixhLDEpKS5kLGk9aCxmKSlkb3tpZihzPXNnKGMsYSs9MTApLHI9ZT9RZChsLGErMTApOnNnKHQsYSksdT1IZChzLHIsYSwxKSwhbyl7K0dkKHUuZCkuc2xpY2UoaSsxLGkrMTUpKzE9PTFlMTQmJih1PVpkKHUsaCsxLDApKTticmVha319d2hpbGUoWGQodS5kLGkrPTEwLGYpKTtyZXR1cm4gQWQ9ITAsWmQodSxoLGYpfSxWZC5taW51cz1WZC5zdWI9ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxzLGEsdSxjLGwsaCxmLHA9dGhpcyxkPXAuY29uc3RydWN0b3I7aWYodD1uZXcgZCh0KSwhcC5kfHwhdC5kKXJldHVybiBwLnMmJnQucz9wLmQ/dC5zPS10LnM6dD1uZXcgZCh0LmR8fHAucyE9PXQucz9wOk5hTik6dD1uZXcgZChOYU4pLHQ7aWYocC5zIT10LnMpcmV0dXJuIHQucz0tdC5zLHAucGx1cyh0KTtpZihjPXAuZCxmPXQuZCxhPWQucHJlY2lzaW9uLHU9ZC5yb3VuZGluZywhY1swXXx8IWZbMF0pe2lmKGZbMF0pdC5zPS10LnM7ZWxzZXtpZighY1swXSlyZXR1cm4gbmV3IGQoMz09PXU/LTA6MCk7dD1uZXcgZChwKX1yZXR1cm4gQWQ/WmQodCxhLHUpOnR9aWYobj1PZCh0LmUvamQpLGw9T2QocC5lL2pkKSxjPWMuc2xpY2UoKSxvPWwtbil7Zm9yKChoPW88MCk/KGU9YyxvPS1vLHM9Zi5sZW5ndGgpOihlPWYsbj1sLHM9Yy5sZW5ndGgpLG8+KHI9TWF0aC5tYXgoTWF0aC5jZWlsKGEvamQpLHMpKzIpJiYobz1yLGUubGVuZ3RoPTEpLGUucmV2ZXJzZSgpLHI9bztyLS07KWUucHVzaCgwKTtlLnJldmVyc2UoKX1lbHNle2ZvcigoaD0ocj1jLmxlbmd0aCk8KHM9Zi5sZW5ndGgpKSYmKHM9cikscj0wO3I8cztyKyspaWYoY1tyXSE9ZltyXSl7aD1jW3JdPGZbcl07YnJlYWt9bz0wfWZvcihoJiYoZT1jLGM9ZixmPWUsdC5zPS10LnMpLHM9Yy5sZW5ndGgscj1mLmxlbmd0aC1zO3I+MDstLXIpY1tzKytdPTA7Zm9yKHI9Zi5sZW5ndGg7cj5vOyl7aWYoY1stLXJdPGZbcl0pe2ZvcihpPXI7aSYmMD09PWNbLS1pXTspY1tpXT16ZC0xOy0tY1tpXSxjW3JdKz16ZH1jW3JdLT1mW3JdfWZvcig7MD09PWNbLS1zXTspYy5wb3AoKTtmb3IoOzA9PT1jWzBdO2Muc2hpZnQoKSktLW47cmV0dXJuIGNbMF0/KHQuZD1jLHQuZT1KZChjLG4pLEFkP1pkKHQsYSx1KTp0KTpuZXcgZCgzPT09dT8tMDowKX0sVmQubW9kdWxvPVZkLm1vZD1mdW5jdGlvbih0KXt2YXIgZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiB0PW5ldyByKHQpLCFuLmR8fCF0LnN8fHQuZCYmIXQuZFswXT9uZXcgcihOYU4pOiF0LmR8fG4uZCYmIW4uZFswXT9aZChuZXcgcihuKSxyLnByZWNpc2lvbixyLnJvdW5kaW5nKTooQWQ9ITEsOT09ci5tb2R1bG8/KGU9SGQobix0LmFicygpLDAsMywxKSkucyo9dC5zOmU9SGQobix0LDAsci5tb2R1bG8sMSksZT1lLnRpbWVzKHQpLEFkPSEwLG4ubWludXMoZSkpfSxWZC5uYXR1cmFsRXhwb25lbnRpYWw9VmQuZXhwPWZ1bmN0aW9uKCl7cmV0dXJuIG9nKHRoaXMpfSxWZC5uYXR1cmFsTG9nYXJpdGhtPVZkLmxuPWZ1bmN0aW9uKCl7cmV0dXJuIHNnKHRoaXMpfSxWZC5uZWdhdGVkPVZkLm5lZz1mdW5jdGlvbigpe3ZhciB0PW5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpO3JldHVybiB0LnM9LXQucyxaZCh0KX0sVmQucGx1cz1WZC5hZGQ9ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxzLGEsdSxjLGwsaD10aGlzLGY9aC5jb25zdHJ1Y3RvcjtpZih0PW5ldyBmKHQpLCFoLmR8fCF0LmQpcmV0dXJuIGgucyYmdC5zP2guZHx8KHQ9bmV3IGYodC5kfHxoLnM9PT10LnM/aDpOYU4pKTp0PW5ldyBmKE5hTiksdDtpZihoLnMhPXQucylyZXR1cm4gdC5zPS10LnMsaC5taW51cyh0KTtpZihjPWguZCxsPXQuZCxhPWYucHJlY2lzaW9uLHU9Zi5yb3VuZGluZywhY1swXXx8IWxbMF0pcmV0dXJuIGxbMF18fCh0PW5ldyBmKGgpKSxBZD9aZCh0LGEsdSk6dDtpZihvPU9kKGguZS9qZCkscj1PZCh0LmUvamQpLGM9Yy5zbGljZSgpLGk9by1yKXtmb3IoaTwwPyhuPWMsaT0taSxzPWwubGVuZ3RoKToobj1sLHI9byxzPWMubGVuZ3RoKSxpPihzPShvPU1hdGguY2VpbChhL2pkKSk+cz9vKzE6cysxKSYmKGk9cyxuLmxlbmd0aD0xKSxuLnJldmVyc2UoKTtpLS07KW4ucHVzaCgwKTtuLnJldmVyc2UoKX1mb3IoKHM9Yy5sZW5ndGgpLShpPWwubGVuZ3RoKTwwJiYoaT1zLG49bCxsPWMsYz1uKSxlPTA7aTspZT0oY1stLWldPWNbaV0rbFtpXStlKS96ZHwwLGNbaV0lPXpkO2ZvcihlJiYoYy51bnNoaWZ0KGUpLCsrcikscz1jLmxlbmd0aDswPT1jWy0tc107KWMucG9wKCk7cmV0dXJuIHQuZD1jLHQuZT1KZChjLHIpLEFkP1pkKHQsYSx1KTp0fSxWZC5wcmVjaXNpb249VmQuc2Q9ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO2lmKHZvaWQgMCE9PXQmJnQhPT0hIXQmJjEhPT10JiYwIT09dCl0aHJvdyBFcnJvcihJZCt0KTtyZXR1cm4gbi5kPyhlPXRnKG4uZCksdCYmbi5lKzE+ZSYmKGU9bi5lKzEpKTplPU5hTixlfSxWZC5yb3VuZD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10LmNvbnN0cnVjdG9yO3JldHVybiBaZChuZXcgZSh0KSx0LmUrMSxlLnJvdW5kaW5nKX0sVmQuc2luZT1WZC5zaW49ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcyxyPW4uY29uc3RydWN0b3I7cmV0dXJuIG4uaXNGaW5pdGUoKT9uLmlzWmVybygpP25ldyByKG4pOih0PXIucHJlY2lzaW9uLGU9ci5yb3VuZGluZyxyLnByZWNpc2lvbj10K01hdGgubWF4KG4uZSxuLnNkKCkpK2pkLHIucm91bmRpbmc9MSxuPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj1lLmQubGVuZ3RoO2lmKHI8MylyZXR1cm4gZS5pc1plcm8oKT9lOmNnKHQsMixlLGUpO249MS40Kk1hdGguc3FydChyKSxuPW4+MTY/MTY6MHxuLGU9ZS50aW1lcygxL2xnKDUsbikpLGU9Y2codCwyLGUsZSk7Zm9yKHZhciBpLG89bmV3IHQoNSkscz1uZXcgdCgxNiksYT1uZXcgdCgyMCk7bi0tOylpPWUudGltZXMoZSksZT1lLnRpbWVzKG8ucGx1cyhpLnRpbWVzKHMudGltZXMoaSkubWludXMoYSkpKSk7cmV0dXJuIGV9KHIsaGcocixuKSksci5wcmVjaXNpb249dCxyLnJvdW5kaW5nPWUsWmQoeGQ+Mj9uLm5lZygpOm4sdCxlLCEwKSk6bmV3IHIoTmFOKX0sVmQuc3F1YXJlUm9vdD1WZC5zcXJ0PWZ1bmN0aW9uKCl7dmFyIHQsZSxuLHIsaSxvLHM9dGhpcyxhPXMuZCx1PXMuZSxjPXMucyxsPXMuY29uc3RydWN0b3I7aWYoMSE9PWN8fCFhfHwhYVswXSlyZXR1cm4gbmV3IGwoIWN8fGM8MCYmKCFhfHxhWzBdKT9OYU46YT9zOjEvMCk7Zm9yKEFkPSExLDA9PShjPU1hdGguc3FydCgrcykpfHxjPT0xLzA/KCgoZT1HZChhKSkubGVuZ3RoK3UpJTI9PTAmJihlKz0iMCIpLGM9TWF0aC5zcXJ0KGUpLHU9T2QoKHUrMSkvMiktKHU8MHx8dSUyKSxjPT0xLzA/ZT0iNWUiK3U6ZT0oZT1jLnRvRXhwb25lbnRpYWwoKSkuc2xpY2UoMCxlLmluZGV4T2YoImUiKSsxKSt1LHI9bmV3IGwoZSkpOnI9bmV3IGwoYy50b1N0cmluZygpKSxuPSh1PWwucHJlY2lzaW9uKSszOzspaWYocj0obz1yKS5wbHVzKEhkKHMsbyxuKzIsMSkpLnRpbWVzKC41KSxHZChvLmQpLnNsaWNlKDAsbik9PT0oZT1HZChyLmQpKS5zbGljZSgwLG4pKXtpZigiOTk5OSIhPShlPWUuc2xpY2Uobi0zLG4rMSkpJiYoaXx8IjQ5OTkiIT1lKSl7KCErZXx8IStlLnNsaWNlKDEpJiYiNSI9PWUuY2hhckF0KDApKSYmKFpkKHIsdSsxLDEpLHQ9IXIudGltZXMocikuZXEocykpO2JyZWFrfWlmKCFpJiYoWmQobyx1KzEsMCksby50aW1lcyhvKS5lcShzKSkpe3I9bzticmVha31uKz00LGk9MX1yZXR1cm4gQWQ9ITAsWmQocix1LGwucm91bmRpbmcsdCl9LFZkLnRhbmdlbnQ9VmQudGFuPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiBuLmlzRmluaXRlKCk/bi5pc1plcm8oKT9uZXcgcihuKToodD1yLnByZWNpc2lvbixlPXIucm91bmRpbmcsci5wcmVjaXNpb249dCsxMCxyLnJvdW5kaW5nPTEsKG49bi5zaW4oKSkucz0xLG49SGQobixuZXcgcigxKS5taW51cyhuLnRpbWVzKG4pKS5zcXJ0KCksdCsxMCwwKSxyLnByZWNpc2lvbj10LHIucm91bmRpbmc9ZSxaZCgyPT14ZHx8ND09eGQ/bi5uZWcoKTpuLHQsZSwhMCkpOm5ldyByKE5hTil9LFZkLnRpbWVzPVZkLm11bD1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYSx1LGMsbD10aGlzLGg9bC5jb25zdHJ1Y3RvcixmPWwuZCxwPSh0PW5ldyBoKHQpKS5kO2lmKHQucyo9bC5zLCEoZiYmZlswXSYmcCYmcFswXSkpcmV0dXJuIG5ldyBoKCF0LnN8fGYmJiFmWzBdJiYhcHx8cCYmIXBbMF0mJiFmP05hTjpmJiZwPzAqdC5zOnQucy8wKTtmb3Iobj1PZChsLmUvamQpK09kKHQuZS9qZCksKHU9Zi5sZW5ndGgpPChjPXAubGVuZ3RoKSYmKG89ZixmPXAscD1vLHM9dSx1PWMsYz1zKSxvPVtdLHI9cz11K2M7ci0tOylvLnB1c2goMCk7Zm9yKHI9YzstLXI+PTA7KXtmb3IoZT0wLGk9dStyO2k+cjspYT1vW2ldK3Bbcl0qZltpLXItMV0rZSxvW2ktLV09YSV6ZHwwLGU9YS96ZHwwO29baV09KG9baV0rZSklemR8MH1mb3IoOyFvWy0tc107KW8ucG9wKCk7cmV0dXJuIGU/KytuOm8uc2hpZnQoKSx0LmQ9byx0LmU9SmQobyxuKSxBZD9aZCh0LGgucHJlY2lzaW9uLGgucm91bmRpbmcpOnR9LFZkLnRvQmluYXJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZnKHRoaXMsMix0LGUpfSxWZC50b0RlY2ltYWxQbGFjZXM9VmQudG9EUD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1uLmNvbnN0cnVjdG9yO3JldHVybiBuPW5ldyByKG4pLHZvaWQgMD09PXQ/bjooWWQodCwwLGJkKSx2b2lkIDA9PT1lP2U9ci5yb3VuZGluZzpZZChlLDAsOCksWmQobix0K24uZSsxLGUpKX0sVmQudG9FeHBvbmVudGlhbD1mdW5jdGlvbih0LGUpe3ZhciBuLHI9dGhpcyxpPXIuY29uc3RydWN0b3I7cmV0dXJuIHZvaWQgMD09PXQ/bj1LZChyLCEwKTooWWQodCwwLGJkKSx2b2lkIDA9PT1lP2U9aS5yb3VuZGluZzpZZChlLDAsOCksbj1LZChyPVpkKG5ldyBpKHIpLHQrMSxlKSwhMCx0KzEpKSxyLmlzTmVnKCkmJiFyLmlzWmVybygpPyItIituOm59LFZkLnRvRml4ZWQ9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk9dGhpcyxvPWkuY29uc3RydWN0b3I7cmV0dXJuIHZvaWQgMD09PXQ/bj1LZChpKTooWWQodCwwLGJkKSx2b2lkIDA9PT1lP2U9by5yb3VuZGluZzpZZChlLDAsOCksbj1LZChyPVpkKG5ldyBvKGkpLHQraS5lKzEsZSksITEsdCtyLmUrMSkpLGkuaXNOZWcoKSYmIWkuaXNaZXJvKCk/Ii0iK246bn0sVmQudG9GcmFjdGlvbj1mdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHMsYSx1LGMsbCxoLGYscD10aGlzLGQ9cC5kLGc9cC5jb25zdHJ1Y3RvcjtpZighZClyZXR1cm4gbmV3IGcocCk7aWYoYz1uPW5ldyBnKDEpLHI9dT1uZXcgZygwKSxzPShvPShlPW5ldyBnKHIpKS5lPXRnKGQpLXAuZS0xKSVqZCxlLmRbMF09TGQoMTAsczwwP2pkK3M6cyksbnVsbD09dCl0PW8+MD9lOmM7ZWxzZXtpZighKGE9bmV3IGcodCkpLmlzSW50KCl8fGEubHQoYykpdGhyb3cgRXJyb3IoSWQrYSk7dD1hLmd0KGUpP28+MD9lOmM6YX1mb3IoQWQ9ITEsYT1uZXcgZyhHZChkKSksbD1nLnByZWNpc2lvbixnLnByZWNpc2lvbj1vPWQubGVuZ3RoKmpkKjI7aD1IZChhLGUsMCwxLDEpLDEhPShpPW4ucGx1cyhoLnRpbWVzKHIpKSkuY21wKHQpOyluPXIscj1pLGk9YyxjPXUucGx1cyhoLnRpbWVzKGkpKSx1PWksaT1lLGU9YS5taW51cyhoLnRpbWVzKGkpKSxhPWk7cmV0dXJuIGk9SGQodC5taW51cyhuKSxyLDAsMSwxKSx1PXUucGx1cyhpLnRpbWVzKGMpKSxuPW4ucGx1cyhpLnRpbWVzKHIpKSx1LnM9Yy5zPXAucyxmPUhkKGMscixvLDEpLm1pbnVzKHApLmFicygpLmNtcChIZCh1LG4sbywxKS5taW51cyhwKS5hYnMoKSk8MT9bYyxyXTpbdSxuXSxnLnByZWNpc2lvbj1sLEFkPSEwLGZ9LFZkLnRvSGV4YWRlY2ltYWw9VmQudG9IZXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZmcodGhpcywxNix0LGUpfSxWZC50b05lYXJlc3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9bi5jb25zdHJ1Y3RvcjtpZihuPW5ldyByKG4pLG51bGw9PXQpe2lmKCFuLmQpcmV0dXJuIG47dD1uZXcgcigxKSxlPXIucm91bmRpbmd9ZWxzZXtpZih0PW5ldyByKHQpLHZvaWQgMD09PWU/ZT1yLnJvdW5kaW5nOllkKGUsMCw4KSwhbi5kKXJldHVybiB0LnM/bjp0O2lmKCF0LmQpcmV0dXJuIHQucyYmKHQucz1uLnMpLHR9cmV0dXJuIHQuZFswXT8oQWQ9ITEsbj1IZChuLHQsMCxlLDEpLnRpbWVzKHQpLEFkPSEwLFpkKG4pKToodC5zPW4ucyxuPXQpLG59LFZkLnRvTnVtYmVyPWZ1bmN0aW9uKCl7cmV0dXJuK3RoaXN9LFZkLnRvT2N0YWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZmcodGhpcyw4LHQsZSl9LFZkLnRvUG93ZXI9VmQucG93PWZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8scyxhPXRoaXMsdT1hLmNvbnN0cnVjdG9yLGM9Kyh0PW5ldyB1KHQpKTtpZighKGEuZCYmdC5kJiZhLmRbMF0mJnQuZFswXSkpcmV0dXJuIG5ldyB1KExkKCthLGMpKTtpZigoYT1uZXcgdShhKSkuZXEoMSkpcmV0dXJuIGE7aWYocj11LnByZWNpc2lvbixvPXUucm91bmRpbmcsdC5lcSgxKSlyZXR1cm4gWmQoYSxyLG8pO2lmKChlPU9kKHQuZS9qZCkpPj10LmQubGVuZ3RoLTEmJihuPWM8MD8tYzpjKTw9OTAwNzE5OTI1NDc0MDk5MSlyZXR1cm4gaT1uZyh1LGEsbixyKSx0LnM8MD9uZXcgdSgxKS5kaXYoaSk6WmQoaSxyLG8pO2lmKChzPWEucyk8MCl7aWYoZTx0LmQubGVuZ3RoLTEpcmV0dXJuIG5ldyB1KE5hTik7aWYoISgxJnQuZFtlXSkmJihzPTEpLDA9PWEuZSYmMT09YS5kWzBdJiYxPT1hLmQubGVuZ3RoKXJldHVybiBhLnM9cyxhfXJldHVybihlPTAhPShuPUxkKCthLGMpKSYmaXNGaW5pdGUobik/bmV3IHUobisiIikuZTpPZChjKihNYXRoLmxvZygiMC4iK0dkKGEuZCkpL01hdGguTE4xMCthLmUrMSkpKT51Lm1heEUrMXx8ZTx1Lm1pbkUtMT9uZXcgdShlPjA/cy8wOjApOihBZD0hMSx1LnJvdW5kaW5nPWEucz0xLG49TWF0aC5taW4oMTIsKGUrIiIpLmxlbmd0aCksKGk9b2codC50aW1lcyhzZyhhLHIrbikpLHIpKS5kJiYoWGQoKGk9WmQoaSxyKzUsMSkpLmQscixvKSYmKGU9cisxMCwrR2QoKGk9WmQob2codC50aW1lcyhzZyhhLGUrbikpLGUpLGUrNSwxKSkuZCkuc2xpY2UocisxLHIrMTUpKzE9PTFlMTQmJihpPVpkKGkscisxLDApKSkpLGkucz1zLEFkPSEwLHUucm91bmRpbmc9byxaZChpLHIsbykpfSxWZC50b1ByZWNpc2lvbj1mdW5jdGlvbih0LGUpe3ZhciBuLHI9dGhpcyxpPXIuY29uc3RydWN0b3I7cmV0dXJuIHZvaWQgMD09PXQ/bj1LZChyLHIuZTw9aS50b0V4cE5lZ3x8ci5lPj1pLnRvRXhwUG9zKTooWWQodCwxLGJkKSx2b2lkIDA9PT1lP2U9aS5yb3VuZGluZzpZZChlLDAsOCksbj1LZChyPVpkKG5ldyBpKHIpLHQsZSksdDw9ci5lfHxyLmU8PWkudG9FeHBOZWcsdCkpLHIuaXNOZWcoKSYmIXIuaXNaZXJvKCk/Ii0iK246bn0sVmQudG9TaWduaWZpY2FudERpZ2l0cz1WZC50b1NEPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09dD8odD1uLnByZWNpc2lvbixlPW4ucm91bmRpbmcpOihZZCh0LDEsYmQpLHZvaWQgMD09PWU/ZT1uLnJvdW5kaW5nOllkKGUsMCw4KSksWmQobmV3IG4odGhpcyksdCxlKX0sVmQudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5jb25zdHJ1Y3RvcixuPUtkKHQsdC5lPD1lLnRvRXhwTmVnfHx0LmU+PWUudG9FeHBQb3MpO3JldHVybiB0LmlzTmVnKCkmJiF0LmlzWmVybygpPyItIituOm59LFZkLnRydW5jYXRlZD1WZC50cnVuYz1mdW5jdGlvbigpe3JldHVybiBaZChuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzKSx0aGlzLmUrMSwxKX0sVmQudmFsdWVPZj1WZC50b0pTT049ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5jb25zdHJ1Y3RvcixuPUtkKHQsdC5lPD1lLnRvRXhwTmVnfHx0LmU+PWUudG9FeHBQb3MpO3JldHVybiB0LmlzTmVnKCk/Ii0iK246bn07dmFyIEhkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dmFyIHIsaT0wLG89dC5sZW5ndGg7Zm9yKHQ9dC5zbGljZSgpO28tLTspcj10W29dKmUraSx0W29dPXIlbnwwLGk9ci9ufDA7cmV0dXJuIGkmJnQudW5zaGlmdChpKSx0fWZ1bmN0aW9uIGUodCxlLG4scil7dmFyIGksbztpZihuIT1yKW89bj5yPzE6LTE7ZWxzZSBmb3IoaT1vPTA7aTxuO2krKylpZih0W2ldIT1lW2ldKXtvPXRbaV0+ZVtpXT8xOi0xO2JyZWFrfXJldHVybiBvfWZ1bmN0aW9uIG4odCxlLG4scil7Zm9yKHZhciBpPTA7bi0tOyl0W25dLT1pLGk9dFtuXTxlW25dPzE6MCx0W25dPWkqcit0W25dLWVbbl07Zm9yKDshdFswXSYmdC5sZW5ndGg+MTspdC5zaGlmdCgpfXJldHVybiBmdW5jdGlvbihyLGksbyxzLGEsdSl7dmFyIGMsbCxoLGYscCxkLGcseSxtLHYsXyx4LHcsYixELEUsQyxTLEEsTixJPXIuY29uc3RydWN0b3IsTT1yLnM9PWkucz8xOi0xLEY9ci5kLFQ9aS5kO2lmKCEoRiYmRlswXSYmVCYmVFswXSkpcmV0dXJuIG5ldyBJKHIucyYmaS5zJiYoRj8hVHx8RlswXSE9VFswXTpUKT9GJiYwPT1GWzBdfHwhVD8wKk06TS8wOk5hTik7Zm9yKHU/KHA9MSxsPXIuZS1pLmUpOih1PXpkLHA9amQsbD1PZChyLmUvcCktT2QoaS5lL3ApKSxBPVQubGVuZ3RoLEM9Ri5sZW5ndGgsdj0obT1uZXcgSShNKSkuZD1bXSxoPTA7VFtoXT09KEZbaF18fDApO2grKyk7aWYoVFtoXT4oRltoXXx8MCkmJmwtLSxudWxsPT1vPyhiPW89SS5wcmVjaXNpb24scz1JLnJvdW5kaW5nKTpiPWE/bysoci5lLWkuZSkrMTpvLGI8MCl2LnB1c2goMSksZD0hMDtlbHNle2lmKGI9Yi9wKzJ8MCxoPTAsMT09QSl7Zm9yKGY9MCxUPVRbMF0sYisrOyhoPEN8fGYpJiZiLS07aCsrKUQ9Zip1KyhGW2hdfHwwKSx2W2hdPUQvVHwwLGY9RCVUfDA7ZD1mfHxoPEN9ZWxzZXtmb3IoKGY9dS8oVFswXSsxKXwwKT4xJiYoVD10KFQsZix1KSxGPXQoRixmLHUpLEE9VC5sZW5ndGgsQz1GLmxlbmd0aCksRT1BLHg9KF89Ri5zbGljZSgwLEEpKS5sZW5ndGg7eDxBOylfW3grK109MDsoTj1ULnNsaWNlKCkpLnVuc2hpZnQoMCksUz1UWzBdLFRbMV0+PXUvMiYmKytTO2Rve2Y9MCwoYz1lKFQsXyxBLHgpKTwwPyh3PV9bMF0sQSE9eCYmKHc9dyp1KyhfWzFdfHwwKSksKGY9dy9TfDApPjE/KGY+PXUmJihmPXUtMSksMT09KGM9ZShnPXQoVCxmLHUpLF8seT1nLmxlbmd0aCx4PV8ubGVuZ3RoKSkmJihmLS0sbihnLEE8eT9OOlQseSx1KSkpOigwPT1mJiYoYz1mPTEpLGc9VC5zbGljZSgpKSwoeT1nLmxlbmd0aCk8eCYmZy51bnNoaWZ0KDApLG4oXyxnLHgsdSksLTE9PWMmJigoYz1lKFQsXyxBLHg9Xy5sZW5ndGgpKTwxJiYoZisrLG4oXyxBPHg/TjpULHgsdSkpKSx4PV8ubGVuZ3RoKTowPT09YyYmKGYrKyxfPVswXSksdltoKytdPWYsYyYmX1swXT9fW3grK109RltFXXx8MDooXz1bRltFXV0seD0xKX13aGlsZSgoRSsrPEN8fHZvaWQgMCE9PV9bMF0pJiZiLS0pO2Q9dm9pZCAwIT09X1swXX12WzBdfHx2LnNoaWZ0KCl9aWYoMT09cCltLmU9bCxfZD1kO2Vsc2V7Zm9yKGg9MSxmPXZbMF07Zj49MTA7Zi89MTApaCsrO20uZT1oK2wqcC0xLFpkKG0sYT9vK20uZSsxOm8scyxkKX1yZXR1cm4gbX19KCk7ZnVuY3Rpb24gWmQodCxlLG4scil7dmFyIGksbyxzLGEsdSxjLGwsaCxmLHA9dC5jb25zdHJ1Y3Rvcjt0OmlmKG51bGwhPWUpe2lmKCEoaD10LmQpKXJldHVybiB0O2ZvcihpPTEsYT1oWzBdO2E+PTEwO2EvPTEwKWkrKztpZigobz1lLWkpPDApbys9amQscz1lLHU9KGw9aFtmPTBdKS9MZCgxMCxpLXMtMSklMTB8MDtlbHNlIGlmKChmPU1hdGguY2VpbCgobysxKS9qZCkpPj0oYT1oLmxlbmd0aCkpe2lmKCFyKWJyZWFrIHQ7Zm9yKDthKys8PWY7KWgucHVzaCgwKTtsPXU9MCxpPTEscz0obyU9amQpLWpkKzF9ZWxzZXtmb3IobD1hPWhbZl0saT0xO2E+PTEwO2EvPTEwKWkrKzt1PShzPShvJT1qZCktamQraSk8MD8wOmwvTGQoMTAsaS1zLTEpJTEwfDB9aWYocj1yfHxlPDB8fHZvaWQgMCE9PWhbZisxXXx8KHM8MD9sOmwlTGQoMTAsaS1zLTEpKSxjPW48ND8odXx8cikmJigwPT1ufHxuPT0odC5zPDA/MzoyKSk6dT41fHw1PT11JiYoND09bnx8cnx8Nj09biYmKG8+MD9zPjA/bC9MZCgxMCxpLXMpOjA6aFtmLTFdKSUxMCYxfHxuPT0odC5zPDA/ODo3KSksZTwxfHwhaFswXSlyZXR1cm4gaC5sZW5ndGg9MCxjPyhlLT10LmUrMSxoWzBdPUxkKDEwLChqZC1lJWpkKSVqZCksdC5lPS1lfHwwKTpoWzBdPXQuZT0wLHQ7aWYoMD09bz8oaC5sZW5ndGg9ZixhPTEsZi0tKTooaC5sZW5ndGg9ZisxLGE9TGQoMTAsamQtbyksaFtmXT1zPjA/KGwvTGQoMTAsaS1zKSVMZCgxMCxzKXwwKSphOjApLGMpZm9yKDs7KXtpZigwPT1mKXtmb3Iobz0xLHM9aFswXTtzPj0xMDtzLz0xMClvKys7Zm9yKHM9aFswXSs9YSxhPTE7cz49MTA7cy89MTApYSsrO28hPWEmJih0LmUrKyxoWzBdPT16ZCYmKGhbMF09MSkpO2JyZWFrfWlmKGhbZl0rPWEsaFtmXSE9emQpYnJlYWs7aFtmLS1dPTAsYT0xfWZvcihvPWgubGVuZ3RoOzA9PT1oWy0tb107KWgucG9wKCl9cmV0dXJuIEFkJiYodC5lPnAubWF4RT8odC5kPW51bGwsdC5lPU5hTik6dC5lPHAubWluRSYmKHQuZT0wLHQuZD1bMF0pKSx0fWZ1bmN0aW9uIEtkKHQsZSxuKXtpZighdC5pc0Zpbml0ZSgpKXJldHVybiBhZyh0KTt2YXIgcixpPXQuZSxvPUdkKHQuZCkscz1vLmxlbmd0aDtyZXR1cm4gZT8obiYmKHI9bi1zKT4wP289by5jaGFyQXQoMCkrIi4iK28uc2xpY2UoMSkrZWcocik6cz4xJiYobz1vLmNoYXJBdCgwKSsiLiIrby5zbGljZSgxKSksbz1vKyh0LmU8MD8iZSI6ImUrIikrdC5lKTppPDA/KG89IjAuIitlZygtaS0xKStvLG4mJihyPW4tcyk+MCYmKG8rPWVnKHIpKSk6aT49cz8obys9ZWcoaSsxLXMpLG4mJihyPW4taS0xKT4wJiYobz1vKyIuIitlZyhyKSkpOigocj1pKzEpPHMmJihvPW8uc2xpY2UoMCxyKSsiLiIrby5zbGljZShyKSksbiYmKHI9bi1zKT4wJiYoaSsxPT09cyYmKG8rPSIuIiksbys9ZWcocikpKSxvfWZ1bmN0aW9uIEpkKHQsZSl7dmFyIG49dFswXTtmb3IoZSo9amQ7bj49MTA7bi89MTApZSsrO3JldHVybiBlfWZ1bmN0aW9uIFFkKHQsZSxuKXtpZihlPlVkKXRocm93IEFkPSEwLG4mJih0LnByZWNpc2lvbj1uKSxFcnJvcihNZCk7cmV0dXJuIFpkKG5ldyB0KEVkKSxlLDEsITApfWZ1bmN0aW9uICRkKHQsZSxuKXtpZihlPnFkKXRocm93IEVycm9yKE1kKTtyZXR1cm4gWmQobmV3IHQoQ2QpLGUsbiwhMCl9ZnVuY3Rpb24gdGcodCl7dmFyIGU9dC5sZW5ndGgtMSxuPWUqamQrMTtpZihlPXRbZV0pe2Zvcig7ZSUxMD09MDtlLz0xMCluLS07Zm9yKGU9dFswXTtlPj0xMDtlLz0xMCluKyt9cmV0dXJuIG59ZnVuY3Rpb24gZWcodCl7Zm9yKHZhciBlPSIiO3QtLTspZSs9IjAiO3JldHVybiBlfWZ1bmN0aW9uIG5nKHQsZSxuLHIpe3ZhciBpLG89bmV3IHQoMSkscz1NYXRoLmNlaWwoci9qZCs0KTtmb3IoQWQ9ITE7Oyl7aWYobiUyJiYocGcoKG89by50aW1lcyhlKSkuZCxzKSYmKGk9ITApKSwwPT09KG49T2Qobi8yKSkpe249by5kLmxlbmd0aC0xLGkmJjA9PT1vLmRbbl0mJisrby5kW25dO2JyZWFrfXBnKChlPWUudGltZXMoZSkpLmQscyl9cmV0dXJuIEFkPSEwLG99ZnVuY3Rpb24gcmcodCl7cmV0dXJuIDEmdC5kW3QuZC5sZW5ndGgtMV19ZnVuY3Rpb24gaWcodCxlLG4pe2Zvcih2YXIgcixpPW5ldyB0KGVbMF0pLG89MDsrK288ZS5sZW5ndGg7KXtpZighKHI9bmV3IHQoZVtvXSkpLnMpe2k9cjticmVha31pW25dKHIpJiYoaT1yKX1yZXR1cm4gaX1mdW5jdGlvbiBvZyh0LGUpe3ZhciBuLHIsaSxvLHMsYSx1LGM9MCxsPTAsaD0wLGY9dC5jb25zdHJ1Y3RvcixwPWYucm91bmRpbmcsZD1mLnByZWNpc2lvbjtpZighdC5kfHwhdC5kWzBdfHx0LmU+MTcpcmV0dXJuIG5ldyBmKHQuZD90LmRbMF0/dC5zPDA/MDoxLzA6MTp0LnM/dC5zPDA/MDp0Ok5hTik7Zm9yKG51bGw9PWU/KEFkPSExLHU9ZCk6dT1lLGE9bmV3IGYoLjAzMTI1KTt0LmU+LTI7KXQ9dC50aW1lcyhhKSxoKz01O2Zvcih1Kz1yPU1hdGgubG9nKExkKDIsaCkpL01hdGguTE4xMCoyKzV8MCxuPW89cz1uZXcgZigxKSxmLnByZWNpc2lvbj11Ozspe2lmKG89WmQoby50aW1lcyh0KSx1LDEpLG49bi50aW1lcygrK2wpLEdkKChhPXMucGx1cyhIZChvLG4sdSwxKSkpLmQpLnNsaWNlKDAsdSk9PT1HZChzLmQpLnNsaWNlKDAsdSkpe2ZvcihpPWg7aS0tOylzPVpkKHMudGltZXMocyksdSwxKTtpZihudWxsIT1lKXJldHVybiBmLnByZWNpc2lvbj1kLHM7aWYoIShjPDMmJlhkKHMuZCx1LXIscCxjKSkpcmV0dXJuIFpkKHMsZi5wcmVjaXNpb249ZCxwLEFkPSEwKTtmLnByZWNpc2lvbj11Kz0xMCxuPW89YT1uZXcgZigxKSxsPTAsYysrfXM9YX19ZnVuY3Rpb24gc2codCxlKXt2YXIgbixyLGksbyxzLGEsdSxjLGwsaCxmLHA9MSxkPXQsZz1kLmQseT1kLmNvbnN0cnVjdG9yLG09eS5yb3VuZGluZyx2PXkucHJlY2lzaW9uO2lmKGQuczwwfHwhZ3x8IWdbMF18fCFkLmUmJjE9PWdbMF0mJjE9PWcubGVuZ3RoKXJldHVybiBuZXcgeShnJiYhZ1swXT8tMS8wOjEhPWQucz9OYU46Zz8wOmQpO2lmKG51bGw9PWU/KEFkPSExLGw9dik6bD1lLHkucHJlY2lzaW9uPWwrPTEwLHI9KG49R2QoZykpLmNoYXJBdCgwKSwhKE1hdGguYWJzKG89ZC5lKTwxNWUxNCkpcmV0dXJuIGM9UWQoeSxsKzIsdikudGltZXMobysiIiksZD1zZyhuZXcgeShyKyIuIituLnNsaWNlKDEpKSxsLTEwKS5wbHVzKGMpLHkucHJlY2lzaW9uPXYsbnVsbD09ZT9aZChkLHYsbSxBZD0hMCk6ZDtmb3IoO3I8NyYmMSE9cnx8MT09ciYmbi5jaGFyQXQoMSk+Mzspcj0obj1HZCgoZD1kLnRpbWVzKHQpKS5kKSkuY2hhckF0KDApLHArKztmb3Iobz1kLmUscj4xPyhkPW5ldyB5KCIwLiIrbiksbysrKTpkPW5ldyB5KHIrIi4iK24uc2xpY2UoMSkpLGg9ZCx1PXM9ZD1IZChkLm1pbnVzKDEpLGQucGx1cygxKSxsLDEpLGY9WmQoZC50aW1lcyhkKSxsLDEpLGk9Mzs7KXtpZihzPVpkKHMudGltZXMoZiksbCwxKSxHZCgoYz11LnBsdXMoSGQocyxuZXcgeShpKSxsLDEpKSkuZCkuc2xpY2UoMCxsKT09PUdkKHUuZCkuc2xpY2UoMCxsKSl7aWYodT11LnRpbWVzKDIpLDAhPT1vJiYodT11LnBsdXMoUWQoeSxsKzIsdikudGltZXMobysiIikpKSx1PUhkKHUsbmV3IHkocCksbCwxKSxudWxsIT1lKXJldHVybiB5LnByZWNpc2lvbj12LHU7aWYoIVhkKHUuZCxsLTEwLG0sYSkpcmV0dXJuIFpkKHUseS5wcmVjaXNpb249dixtLEFkPSEwKTt5LnByZWNpc2lvbj1sKz0xMCxjPXM9ZD1IZChoLm1pbnVzKDEpLGgucGx1cygxKSxsLDEpLGY9WmQoZC50aW1lcyhkKSxsLDEpLGk9YT0xfXU9YyxpKz0yfX1mdW5jdGlvbiBhZyh0KXtyZXR1cm4gU3RyaW5nKHQucyp0LnMvMCl9ZnVuY3Rpb24gdWcodCxlKXt2YXIgbixyLGk7Zm9yKChuPWUuaW5kZXhPZigiLiIpKT4tMSYmKGU9ZS5yZXBsYWNlKCIuIiwiIikpLChyPWUuc2VhcmNoKC9lL2kpKT4wPyhuPDAmJihuPXIpLG4rPStlLnNsaWNlKHIrMSksZT1lLnN1YnN0cmluZygwLHIpKTpuPDAmJihuPWUubGVuZ3RoKSxyPTA7NDg9PT1lLmNoYXJDb2RlQXQocik7cisrKTtmb3IoaT1lLmxlbmd0aDs0OD09PWUuY2hhckNvZGVBdChpLTEpOy0taSk7aWYoZT1lLnNsaWNlKHIsaSkpe2lmKGktPXIsdC5lPW49bi1yLTEsdC5kPVtdLHI9KG4rMSklamQsbjwwJiYocis9amQpLHI8aSl7Zm9yKHImJnQuZC5wdXNoKCtlLnNsaWNlKDAscikpLGktPWpkO3I8aTspdC5kLnB1c2goK2Uuc2xpY2UocixyKz1qZCkpO2U9ZS5zbGljZShyKSxyPWpkLWUubGVuZ3RofWVsc2Ugci09aTtmb3IoO3ItLTspZSs9IjAiO3QuZC5wdXNoKCtlKSxBZCYmKHQuZT50LmNvbnN0cnVjdG9yLm1heEU/KHQuZD1udWxsLHQuZT1OYU4pOnQuZTx0LmNvbnN0cnVjdG9yLm1pbkUmJih0LmU9MCx0LmQ9WzBdKSl9ZWxzZSB0LmU9MCx0LmQ9WzBdO3JldHVybiB0fWZ1bmN0aW9uIGNnKHQsZSxuLHIsaSl7dmFyIG8scyxhLHUsYz10LnByZWNpc2lvbixsPU1hdGguY2VpbChjL2pkKTtmb3IoQWQ9ITEsdT1uLnRpbWVzKG4pLGE9bmV3IHQocik7Oyl7aWYocz1IZChhLnRpbWVzKHUpLG5ldyB0KGUrKyplKyspLGMsMSksYT1pP3IucGx1cyhzKTpyLm1pbnVzKHMpLHI9SGQocy50aW1lcyh1KSxuZXcgdChlKysqZSsrKSxjLDEpLHZvaWQgMCE9PShzPWEucGx1cyhyKSkuZFtsXSl7Zm9yKG89bDtzLmRbb109PT1hLmRbb10mJm8tLTspO2lmKC0xPT1vKWJyZWFrfW89YSxhPXIscj1zLHM9b31yZXR1cm4gQWQ9ITAscy5kLmxlbmd0aD1sKzEsc31mdW5jdGlvbiBsZyh0LGUpe2Zvcih2YXIgbj10Oy0tZTspbio9dDtyZXR1cm4gbn1mdW5jdGlvbiBoZyh0LGUpe3ZhciBuLHI9ZS5zPDAsaT0kZCh0LHQucHJlY2lzaW9uLDEpLG89aS50aW1lcyguNSk7aWYoKGU9ZS5hYnMoKSkubHRlKG8pKXJldHVybiB4ZD1yPzQ6MSxlO2lmKChuPWUuZGl2VG9JbnQoaSkpLmlzWmVybygpKXhkPXI/MzoyO2Vsc2V7aWYoKGU9ZS5taW51cyhuLnRpbWVzKGkpKSkubHRlKG8pKXJldHVybiB4ZD1yZyhuKT9yPzI6MzpyPzQ6MSxlO3hkPXJnKG4pP3I/MTo0OnI/MzoyfXJldHVybiBlLm1pbnVzKGkpLmFicygpfWZ1bmN0aW9uIGZnKHQsZSxuLHIpe3ZhciBpLG8scyxhLHUsYyxsLGgsZixwPXQuY29uc3RydWN0b3IsZD12b2lkIDAhPT1uO2lmKGQ/KFlkKG4sMSxiZCksdm9pZCAwPT09cj9yPXAucm91bmRpbmc6WWQociwwLDgpKToobj1wLnByZWNpc2lvbixyPXAucm91bmRpbmcpLHQuaXNGaW5pdGUoKSl7Zm9yKGQ/KGk9MiwxNj09ZT9uPTQqbi0zOjg9PWUmJihuPTMqbi0yKSk6aT1lLChzPShsPUtkKHQpKS5pbmRleE9mKCIuIikpPj0wJiYobD1sLnJlcGxhY2UoIi4iLCIiKSwoZj1uZXcgcCgxKSkuZT1sLmxlbmd0aC1zLGYuZD1XZChLZChmKSwxMCxpKSxmLmU9Zi5kLmxlbmd0aCksbz11PShoPVdkKGwsMTAsaSkpLmxlbmd0aDswPT1oWy0tdV07KWgucG9wKCk7aWYoaFswXSl7aWYoczwwP28tLTooKHQ9bmV3IHAodCkpLmQ9aCx0LmU9byxoPSh0PUhkKHQsZixuLHIsMCxpKSkuZCxvPXQuZSxjPV9kKSxzPWhbbl0sYT1pLzIsYz1jfHx2b2lkIDAhPT1oW24rMV0sYz1yPDQ/KHZvaWQgMCE9PXN8fGMpJiYoMD09PXJ8fHI9PT0odC5zPDA/MzoyKSk6cz5hfHxzPT09YSYmKDQ9PT1yfHxjfHw2PT09ciYmMSZoW24tMV18fHI9PT0odC5zPDA/ODo3KSksaC5sZW5ndGg9bixjKWZvcig7KytoWy0tbl0+aS0xOyloW25dPTAsbnx8KCsrbyxoLnVuc2hpZnQoMSkpO2Zvcih1PWgubGVuZ3RoOyFoW3UtMV07LS11KTtmb3Iocz0wLGw9IiI7czx1O3MrKylsKz1EZC5jaGFyQXQoaFtzXSk7aWYoZCl7aWYodT4xKWlmKDE2PT1lfHw4PT1lKXtmb3Iocz0xNj09ZT80OjMsLS11O3Ulczt1KyspbCs9IjAiO2Zvcih1PShoPVdkKGwsaSxlKSkubGVuZ3RoOyFoW3UtMV07LS11KTtmb3Iocz0xLGw9IjEuIjtzPHU7cysrKWwrPURkLmNoYXJBdChoW3NdKX1lbHNlIGw9bC5jaGFyQXQoMCkrIi4iK2wuc2xpY2UoMSk7bD1sKyhvPDA/InAiOiJwKyIpK299ZWxzZSBpZihvPDApe2Zvcig7KytvOylsPSIwIitsO2w9IjAuIitsfWVsc2UgaWYoKytvPnUpZm9yKG8tPXU7by0tOylsKz0iMCI7ZWxzZSBvPHUmJihsPWwuc2xpY2UoMCxvKSsiLiIrbC5zbGljZShvKSl9ZWxzZSBsPWQ/IjBwKzAiOiIwIjtsPSgxNj09ZT8iMHgiOjI9PWU/IjBiIjo4PT1lPyIwbyI6IiIpK2x9ZWxzZSBsPWFnKHQpO3JldHVybiB0LnM8MD8iLSIrbDpsfWZ1bmN0aW9uIHBnKHQsZSl7aWYodC5sZW5ndGg+ZSlyZXR1cm4gdC5sZW5ndGg9ZSwhMH1mdW5jdGlvbiBkZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuYWJzKCl9ZnVuY3Rpb24gZ2codCl7cmV0dXJuIG5ldyB0aGlzKHQpLmFjb3MoKX1mdW5jdGlvbiB5Zyh0KXtyZXR1cm4gbmV3IHRoaXModCkuYWNvc2goKX1mdW5jdGlvbiBtZyh0LGUpe3JldHVybiBuZXcgdGhpcyh0KS5wbHVzKGUpfWZ1bmN0aW9uIHZnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5hc2luKCl9ZnVuY3Rpb24gX2codCl7cmV0dXJuIG5ldyB0aGlzKHQpLmFzaW5oKCl9ZnVuY3Rpb24geGcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmF0YW4oKX1mdW5jdGlvbiB3Zyh0KXtyZXR1cm4gbmV3IHRoaXModCkuYXRhbmgoKX1mdW5jdGlvbiBiZyh0LGUpe3Q9bmV3IHRoaXModCksZT1uZXcgdGhpcyhlKTt2YXIgbixyPXRoaXMucHJlY2lzaW9uLGk9dGhpcy5yb3VuZGluZyxvPXIrNDtyZXR1cm4gdC5zJiZlLnM/dC5kfHxlLmQ/IWUuZHx8dC5pc1plcm8oKT8obj1lLnM8MD8kZCh0aGlzLHIsaSk6bmV3IHRoaXMoMCkpLnM9dC5zOiF0LmR8fGUuaXNaZXJvKCk/KG49JGQodGhpcyxvLDEpLnRpbWVzKC41KSkucz10LnM6ZS5zPDA/KHRoaXMucHJlY2lzaW9uPW8sdGhpcy5yb3VuZGluZz0xLG49dGhpcy5hdGFuKEhkKHQsZSxvLDEpKSxlPSRkKHRoaXMsbywxKSx0aGlzLnByZWNpc2lvbj1yLHRoaXMucm91bmRpbmc9aSxuPXQuczwwP24ubWludXMoZSk6bi5wbHVzKGUpKTpuPXRoaXMuYXRhbihIZCh0LGUsbywxKSk6KG49JGQodGhpcyxvLDEpLnRpbWVzKGUucz4wPy4yNTouNzUpKS5zPXQuczpuPW5ldyB0aGlzKE5hTiksbn1mdW5jdGlvbiBEZyh0KXtyZXR1cm4gbmV3IHRoaXModCkuY2JydCgpfWZ1bmN0aW9uIEVnKHQpe3JldHVybiBaZCh0PW5ldyB0aGlzKHQpLHQuZSsxLDIpfWZ1bmN0aW9uIENnKHQsZSxuKXtyZXR1cm4gbmV3IHRoaXModCkuY2xhbXAoZSxuKX1mdW5jdGlvbiBTZyh0KXtpZighdHx8Im9iamVjdCIhPXR5cGVvZiB0KXRocm93IEVycm9yKE5kKyJPYmplY3QgZXhwZWN0ZWQiKTt2YXIgZSxuLHIsaT0hMD09PXQuZGVmYXVsdHMsbz1bInByZWNpc2lvbiIsMSxiZCwicm91bmRpbmciLDAsOCwidG9FeHBOZWciLC13ZCwwLCJ0b0V4cFBvcyIsMCx3ZCwibWF4RSIsMCx3ZCwibWluRSIsLXdkLDAsIm1vZHVsbyIsMCw5XTtmb3IoZT0wO2U8by5sZW5ndGg7ZSs9MylpZihuPW9bZV0saSYmKHRoaXNbbl09U2Rbbl0pLHZvaWQgMCE9PShyPXRbbl0pKXtpZighKE9kKHIpPT09ciYmcj49b1tlKzFdJiZyPD1vW2UrMl0pKXRocm93IEVycm9yKElkK24rIjogIityKTt0aGlzW25dPXJ9aWYobj0iY3J5cHRvIixpJiYodGhpc1tuXT1TZFtuXSksdm9pZCAwIT09KHI9dFtuXSkpe2lmKCEwIT09ciYmITEhPT1yJiYwIT09ciYmMSE9PXIpdGhyb3cgRXJyb3IoSWQrbisiOiAiK3IpO2lmKHIpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgY3J5cHRvfHwhY3J5cHRvfHwhY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmIWNyeXB0by5yYW5kb21CeXRlcyl0aHJvdyBFcnJvcihGZCk7dGhpc1tuXT0hMH1lbHNlIHRoaXNbbl09ITF9cmV0dXJuIHRoaXN9ZnVuY3Rpb24gQWcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmNvcygpfWZ1bmN0aW9uIE5nKHQpe3JldHVybiBuZXcgdGhpcyh0KS5jb3NoKCl9ZnVuY3Rpb24gSWcodCxlKXtyZXR1cm4gbmV3IHRoaXModCkuZGl2KGUpfWZ1bmN0aW9uIE1nKHQpe3JldHVybiBuZXcgdGhpcyh0KS5leHAoKX1mdW5jdGlvbiBGZyh0KXtyZXR1cm4gWmQodD1uZXcgdGhpcyh0KSx0LmUrMSwzKX1mdW5jdGlvbiBUZygpe3ZhciB0LGUsbj1uZXcgdGhpcygwKTtmb3IoQWQ9ITEsdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDspaWYoKGU9bmV3IHRoaXMoYXJndW1lbnRzW3QrK10pKS5kKW4uZCYmKG49bi5wbHVzKGUudGltZXMoZSkpKTtlbHNle2lmKGUucylyZXR1cm4gQWQ9ITAsbmV3IHRoaXMoMS8wKTtuPWV9cmV0dXJuIEFkPSEwLG4uc3FydCgpfWZ1bmN0aW9uIE9nKHQpe3JldHVybiB0IGluc3RhbmNlb2YgdHl8fHQmJnQudG9TdHJpbmdUYWc9PT1UZHx8ITF9ZnVuY3Rpb24gTGcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmxuKCl9ZnVuY3Rpb24gUGcodCxlKXtyZXR1cm4gbmV3IHRoaXModCkubG9nKGUpfWZ1bmN0aW9uIFJnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5sb2coMil9ZnVuY3Rpb24gQmcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLmxvZygxMCl9ZnVuY3Rpb24ga2coKXtyZXR1cm4gaWcodGhpcyxhcmd1bWVudHMsImx0Iil9ZnVuY3Rpb24gemcoKXtyZXR1cm4gaWcodGhpcyxhcmd1bWVudHMsImd0Iil9ZnVuY3Rpb24gamcodCxlKXtyZXR1cm4gbmV3IHRoaXModCkubW9kKGUpfWZ1bmN0aW9uIFVnKHQsZSl7cmV0dXJuIG5ldyB0aGlzKHQpLm11bChlKX1mdW5jdGlvbiBxZyh0LGUpe3JldHVybiBuZXcgdGhpcyh0KS5wb3coZSl9ZnVuY3Rpb24gVmcodCl7dmFyIGUsbixyLGksbz0wLHM9bmV3IHRoaXMoMSksYT1bXTtpZih2b2lkIDA9PT10P3Q9dGhpcy5wcmVjaXNpb246WWQodCwxLGJkKSxyPU1hdGguY2VpbCh0L2pkKSx0aGlzLmNyeXB0bylpZihjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKWZvcihlPWNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KHIpKTtvPHI7KShpPWVbb10pPj00MjllNz9lW29dPWNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KDEpKVswXTphW28rK109aSUxZTc7ZWxzZXtpZighY3J5cHRvLnJhbmRvbUJ5dGVzKXRocm93IEVycm9yKEZkKTtmb3IoZT1jcnlwdG8ucmFuZG9tQnl0ZXMocio9NCk7bzxyOykoaT1lW29dKyhlW28rMV08PDgpKyhlW28rMl08PDE2KSsoKDEyNyZlW28rM10pPDwyNCkpPj0yMTRlNz9jcnlwdG8ucmFuZG9tQnl0ZXMoNCkuY29weShlLG8pOihhLnB1c2goaSUxZTcpLG8rPTQpO289ci80fWVsc2UgZm9yKDtvPHI7KWFbbysrXT0xZTcqTWF0aC5yYW5kb20oKXwwO2ZvcihyPWFbLS1vXSx0JT1qZCxyJiZ0JiYoaT1MZCgxMCxqZC10KSxhW29dPShyL2l8MCkqaSk7MD09PWFbb107by0tKWEucG9wKCk7aWYobzwwKW49MCxhPVswXTtlbHNle2ZvcihuPS0xOzA9PT1hWzBdO24tPWpkKWEuc2hpZnQoKTtmb3Iocj0xLGk9YVswXTtpPj0xMDtpLz0xMClyKys7cjxqZCYmKG4tPWpkLXIpfXJldHVybiBzLmU9bixzLmQ9YSxzfWZ1bmN0aW9uIEdnKHQpe3JldHVybiBaZCh0PW5ldyB0aGlzKHQpLHQuZSsxLHRoaXMucm91bmRpbmcpfWZ1bmN0aW9uIFlnKHQpe3JldHVybih0PW5ldyB0aGlzKHQpKS5kP3QuZFswXT90LnM6MCp0LnM6dC5zfHxOYU59ZnVuY3Rpb24gWGcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLnNpbigpfWZ1bmN0aW9uIFdnKHQpe3JldHVybiBuZXcgdGhpcyh0KS5zaW5oKCl9ZnVuY3Rpb24gSGcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLnNxcnQoKX1mdW5jdGlvbiBaZyh0LGUpe3JldHVybiBuZXcgdGhpcyh0KS5zdWIoZSl9ZnVuY3Rpb24gS2coKXt2YXIgdD0wLGU9YXJndW1lbnRzLG49bmV3IHRoaXMoZVt0XSk7Zm9yKEFkPSExO24ucyYmKyt0PGUubGVuZ3RoOyluPW4ucGx1cyhlW3RdKTtyZXR1cm4gQWQ9ITAsWmQobix0aGlzLnByZWNpc2lvbix0aGlzLnJvdW5kaW5nKX1mdW5jdGlvbiBKZyh0KXtyZXR1cm4gbmV3IHRoaXModCkudGFuKCl9ZnVuY3Rpb24gUWcodCl7cmV0dXJuIG5ldyB0aGlzKHQpLnRhbmgoKX1mdW5jdGlvbiAkZyh0KXtyZXR1cm4gWmQodD1uZXcgdGhpcyh0KSx0LmUrMSwxKX1WZFtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1WZC50b1N0cmluZyxWZFtTeW1ib2wudG9TdHJpbmdUYWddPSJEZWNpbWFsIjt2YXIgdHk9VmQuY29uc3RydWN0b3I9ZnVuY3Rpb24gdChlKXt2YXIgbixyLGk7ZnVuY3Rpb24gbyh0KXt2YXIgZSxuLHIsaT10aGlzO2lmKCEoaSBpbnN0YW5jZW9mIG8pKXJldHVybiBuZXcgbyh0KTtpZihpLmNvbnN0cnVjdG9yPW8sT2codCkpcmV0dXJuIGkucz10LnMsdm9pZChBZD8hdC5kfHx0LmU+by5tYXhFPyhpLmU9TmFOLGkuZD1udWxsKTp0LmU8by5taW5FPyhpLmU9MCxpLmQ9WzBdKTooaS5lPXQuZSxpLmQ9dC5kLnNsaWNlKCkpOihpLmU9dC5lLGkuZD10LmQ/dC5kLnNsaWNlKCk6dC5kKSk7aWYoIm51bWJlciI9PT0ocj10eXBlb2YgdCkpe2lmKDA9PT10KXJldHVybiBpLnM9MS90PDA/LTE6MSxpLmU9MCx2b2lkKGkuZD1bMF0pO2lmKHQ8MD8odD0tdCxpLnM9LTEpOmkucz0xLHQ9PT1+fnQmJnQ8MWU3KXtmb3IoZT0wLG49dDtuPj0xMDtuLz0xMCllKys7cmV0dXJuIHZvaWQoQWQ/ZT5vLm1heEU/KGkuZT1OYU4saS5kPW51bGwpOmU8by5taW5FPyhpLmU9MCxpLmQ9WzBdKTooaS5lPWUsaS5kPVt0XSk6KGkuZT1lLGkuZD1bdF0pKX1yZXR1cm4gMCp0IT0wPyh0fHwoaS5zPU5hTiksaS5lPU5hTix2b2lkKGkuZD1udWxsKSk6dWcoaSx0LnRvU3RyaW5nKCkpfWlmKCJzdHJpbmciIT09cil0aHJvdyBFcnJvcihJZCt0KTtyZXR1cm4gNDU9PT0obj10LmNoYXJDb2RlQXQoMCkpPyh0PXQuc2xpY2UoMSksaS5zPS0xKTooNDM9PT1uJiYodD10LnNsaWNlKDEpKSxpLnM9MSksa2QudGVzdCh0KT91ZyhpLHQpOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixpLG8scyxhLHUsYyxsO2lmKGUuaW5kZXhPZigiXyIpPi0xKXtpZihlPWUucmVwbGFjZSgvKFxkKV8oPz1cZCkvZywiJDEiKSxrZC50ZXN0KGUpKXJldHVybiB1Zyh0LGUpfWVsc2UgaWYoIkluZmluaXR5Ij09PWV8fCJOYU4iPT09ZSlyZXR1cm4rZXx8KHQucz1OYU4pLHQuZT1OYU4sdC5kPW51bGwsdDtpZihSZC50ZXN0KGUpKW49MTYsZT1lLnRvTG93ZXJDYXNlKCk7ZWxzZSBpZihQZC50ZXN0KGUpKW49MjtlbHNle2lmKCFCZC50ZXN0KGUpKXRocm93IEVycm9yKElkK2UpO249OH1mb3IoKG89ZS5zZWFyY2goL3AvaSkpPjA/KHU9K2Uuc2xpY2UobysxKSxlPWUuc3Vic3RyaW5nKDIsbykpOmU9ZS5zbGljZSgyKSxzPShvPWUuaW5kZXhPZigiLiIpKT49MCxyPXQuY29uc3RydWN0b3IscyYmKG89KGE9KGU9ZS5yZXBsYWNlKCIuIiwiIikpLmxlbmd0aCktbyxpPW5nKHIsbmV3IHIobiksbywyKm8pKSxvPWw9KGM9V2QoZSxuLHpkKSkubGVuZ3RoLTE7MD09PWNbb107LS1vKWMucG9wKCk7cmV0dXJuIG88MD9uZXcgcigwKnQucyk6KHQuZT1KZChjLGwpLHQuZD1jLEFkPSExLHMmJih0PUhkKHQsaSw0KmEpKSx1JiYodD10LnRpbWVzKE1hdGguYWJzKHUpPDU0P0xkKDIsdSk6dHkucG93KDIsdSkpKSxBZD0hMCx0KX0oaSx0KX1pZihvLnByb3RvdHlwZT1WZCxvLlJPVU5EX1VQPTAsby5ST1VORF9ET1dOPTEsby5ST1VORF9DRUlMPTIsby5ST1VORF9GTE9PUj0zLG8uUk9VTkRfSEFMRl9VUD00LG8uUk9VTkRfSEFMRl9ET1dOPTUsby5ST1VORF9IQUxGX0VWRU49NixvLlJPVU5EX0hBTEZfQ0VJTD03LG8uUk9VTkRfSEFMRl9GTE9PUj04LG8uRVVDTElEPTksby5jb25maWc9by5zZXQ9U2csby5jbG9uZT10LG8uaXNEZWNpbWFsPU9nLG8uYWJzPWRnLG8uYWNvcz1nZyxvLmFjb3NoPXlnLG8uYWRkPW1nLG8uYXNpbj12ZyxvLmFzaW5oPV9nLG8uYXRhbj14ZyxvLmF0YW5oPXdnLG8uYXRhbjI9Ymcsby5jYnJ0PURnLG8uY2VpbD1FZyxvLmNsYW1wPUNnLG8uY29zPUFnLG8uY29zaD1OZyxvLmRpdj1JZyxvLmV4cD1NZyxvLmZsb29yPUZnLG8uaHlwb3Q9VGcsby5sbj1MZyxvLmxvZz1QZyxvLmxvZzEwPUJnLG8ubG9nMj1SZyxvLm1heD1rZyxvLm1pbj16ZyxvLm1vZD1qZyxvLm11bD1VZyxvLnBvdz1xZyxvLnJhbmRvbT1WZyxvLnJvdW5kPUdnLG8uc2lnbj1ZZyxvLnNpbj1YZyxvLnNpbmg9V2csby5zcXJ0PUhnLG8uc3ViPVpnLG8uc3VtPUtnLG8udGFuPUpnLG8udGFuaD1RZyxvLnRydW5jPSRnLHZvaWQgMD09PWUmJihlPXt9KSxlJiYhMCE9PWUuZGVmYXVsdHMpZm9yKGk9WyJwcmVjaXNpb24iLCJyb3VuZGluZyIsInRvRXhwTmVnIiwidG9FeHBQb3MiLCJtYXhFIiwibWluRSIsIm1vZHVsbyIsImNyeXB0byJdLG49MDtuPGkubGVuZ3RoOyllLmhhc093blByb3BlcnR5KHI9aVtuKytdKXx8KGVbcl09dGhpc1tyXSk7cmV0dXJuIG8uY29uZmlnKGUpLG99KFNkKTtFZD1uZXcgdHkoRWQpLENkPW5ldyB0eShDZCk7dmFyIGV5PWlkKCJCaWdOdW1iZXIiLFsiP29uIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7b246ZSxjb25maWc6bn09dCxyPXR5LmNsb25lKHtwcmVjaXNpb246bi5wcmVjaXNpb24sbW9kdWxvOnR5LkVVQ0xJRH0pO3JldHVybiByLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSxyLnByb3RvdHlwZS50eXBlPSJCaWdOdW1iZXIiLHIucHJvdG90eXBlLmlzQmlnTnVtYmVyPSEwLHIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkJpZ051bWJlciIsdmFsdWU6dGhpcy50b1N0cmluZygpfX0sci5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHIodC52YWx1ZSl9LGUmJmUoImNvbmZpZyIsKGZ1bmN0aW9uKHQsZSl7dC5wcmVjaXNpb24hPT1lLnByZWNpc2lvbiYmci5jb25maWcoe3ByZWNpc2lvbjp0LnByZWNpc2lvbn0pfSkpLHJ9KSx7aXNDbGFzczohMH0pLG55PWVlKChmdW5jdGlvbih0LGUpeyFmdW5jdGlvbigpe3ZhciBlPU1hdGguY29zaHx8ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHQpPDFlLTk/MS10Oi41KihNYXRoLmV4cCh0KStNYXRoLmV4cCgtdCkpfSxuPU1hdGguc2luaHx8ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHQpPDFlLTk/dDouNSooTWF0aC5leHAodCktTWF0aC5leHAoLXQpKX0scj1mdW5jdGlvbigpe3Rocm93IFN5bnRheEVycm9yKCJJbnZhbGlkIFBhcmFtIil9O2Z1bmN0aW9uIGkodCxlKXt2YXIgbj1NYXRoLmFicyh0KSxyPU1hdGguYWJzKGUpO3JldHVybiAwPT09dD9NYXRoLmxvZyhyKTowPT09ZT9NYXRoLmxvZyhuKTpuPDNlMyYmcjwzZTM/LjUqTWF0aC5sb2codCp0K2UqZSk6KHQvPTIsZS89MiwuNSpNYXRoLmxvZyh0KnQrZSplKStNYXRoLkxOMil9ZnVuY3Rpb24gbyh0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG8pKXJldHVybiBuZXcgbyh0LGUpO3ZhciBuPWZ1bmN0aW9uKHQsZSl7dmFyIG49e3JlOjAsaW06MH07aWYobnVsbD09dCluLnJlPW4uaW09MDtlbHNlIGlmKHZvaWQgMCE9PWUpbi5yZT10LG4uaW09ZTtlbHNlIHN3aXRjaCh0eXBlb2YgdCl7Y2FzZSJvYmplY3QiOmlmKCJpbSJpbiB0JiYicmUiaW4gdCluLnJlPXQucmUsbi5pbT10LmltO2Vsc2UgaWYoImFicyJpbiB0JiYiYXJnImluIHQpe2lmKCFOdW1iZXIuaXNGaW5pdGUodC5hYnMpJiZOdW1iZXIuaXNGaW5pdGUodC5hcmcpKXJldHVybiBvLklORklOSVRZO24ucmU9dC5hYnMqTWF0aC5jb3ModC5hcmcpLG4uaW09dC5hYnMqTWF0aC5zaW4odC5hcmcpfWVsc2UgaWYoInIiaW4gdCYmInBoaSJpbiB0KXtpZighTnVtYmVyLmlzRmluaXRlKHQucikmJk51bWJlci5pc0Zpbml0ZSh0LnBoaSkpcmV0dXJuIG8uSU5GSU5JVFk7bi5yZT10LnIqTWF0aC5jb3ModC5waGkpLG4uaW09dC5yKk1hdGguc2luKHQucGhpKX1lbHNlIDI9PT10Lmxlbmd0aD8obi5yZT10WzBdLG4uaW09dFsxXSk6cigpO2JyZWFrO2Nhc2Uic3RyaW5nIjpuLmltPW4ucmU9MDt2YXIgaT10Lm1hdGNoKC9cZCtcLj9cZCplWystXT9cZCt8XGQrXC4/XGQqfFwuXGQrfC4vZykscz0xLGE9MDtudWxsPT09aSYmcigpO2Zvcih2YXIgdT0wO3U8aS5sZW5ndGg7dSsrKXt2YXIgYz1pW3VdOyIgIj09PWN8fCJcdCI9PT1jfHwiXG4iPT09Y3x8KCIrIj09PWM/cysrOiItIj09PWM/YSsrOiJpIj09PWN8fCJJIj09PWM/KHMrYT09PTAmJnIoKSwiICI9PT1pW3UrMV18fGlzTmFOKGlbdSsxXSk/bi5pbSs9cGFyc2VGbG9hdCgoYSUyPyItIjoiIikrIjEiKToobi5pbSs9cGFyc2VGbG9hdCgoYSUyPyItIjoiIikraVt1KzFdKSx1KyspLHM9YT0wKTooKHMrYT09PTB8fGlzTmFOKGMpKSYmcigpLCJpIj09PWlbdSsxXXx8IkkiPT09aVt1KzFdPyhuLmltKz1wYXJzZUZsb2F0KChhJTI/Ii0iOiIiKStjKSx1KyspOm4ucmUrPXBhcnNlRmxvYXQoKGElMj8iLSI6IiIpK2MpLHM9YT0wKSl9cythPjAmJnIoKTticmVhaztjYXNlIm51bWJlciI6bi5pbT0wLG4ucmU9dDticmVhaztkZWZhdWx0OnIoKX1yZXR1cm4gaXNOYU4obi5yZSl8fGlzTmFOKG4uaW0pLG59KHQsZSk7dGhpcy5yZT1uLnJlLHRoaXMuaW09bi5pbX1vLnByb3RvdHlwZT17cmU6MCxpbTowLHNpZ246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmFicygpO3JldHVybiBuZXcgbyh0aGlzLnJlL3QsdGhpcy5pbS90KX0sYWRkOmZ1bmN0aW9uKHQsZSl7dmFyIG49bmV3IG8odCxlKTtyZXR1cm4gdGhpcy5pc0luZmluaXRlKCkmJm4uaXNJbmZpbml0ZSgpP28uTkFOOnRoaXMuaXNJbmZpbml0ZSgpfHxuLmlzSW5maW5pdGUoKT9vLklORklOSVRZOm5ldyBvKHRoaXMucmUrbi5yZSx0aGlzLmltK24uaW0pfSxzdWI6ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgbyh0LGUpO3JldHVybiB0aGlzLmlzSW5maW5pdGUoKSYmbi5pc0luZmluaXRlKCk/by5OQU46dGhpcy5pc0luZmluaXRlKCl8fG4uaXNJbmZpbml0ZSgpP28uSU5GSU5JVFk6bmV3IG8odGhpcy5yZS1uLnJlLHRoaXMuaW0tbi5pbSl9LG11bDpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBvKHQsZSk7cmV0dXJuIHRoaXMuaXNJbmZpbml0ZSgpJiZuLmlzWmVybygpfHx0aGlzLmlzWmVybygpJiZuLmlzSW5maW5pdGUoKT9vLk5BTjp0aGlzLmlzSW5maW5pdGUoKXx8bi5pc0luZmluaXRlKCk/by5JTkZJTklUWTowPT09bi5pbSYmMD09PXRoaXMuaW0/bmV3IG8odGhpcy5yZSpuLnJlLDApOm5ldyBvKHRoaXMucmUqbi5yZS10aGlzLmltKm4uaW0sdGhpcy5yZSpuLmltK3RoaXMuaW0qbi5yZSl9LGRpdjpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBvKHQsZSk7aWYodGhpcy5pc1plcm8oKSYmbi5pc1plcm8oKXx8dGhpcy5pc0luZmluaXRlKCkmJm4uaXNJbmZpbml0ZSgpKXJldHVybiBvLk5BTjtpZih0aGlzLmlzSW5maW5pdGUoKXx8bi5pc1plcm8oKSlyZXR1cm4gby5JTkZJTklUWTtpZih0aGlzLmlzWmVybygpfHxuLmlzSW5maW5pdGUoKSlyZXR1cm4gby5aRVJPO3Q9dGhpcy5yZSxlPXRoaXMuaW07dmFyIHIsaSxzPW4ucmUsYT1uLmltO3JldHVybiAwPT09YT9uZXcgbyh0L3MsZS9zKTpNYXRoLmFicyhzKTxNYXRoLmFicyhhKT9uZXcgbygodCooaT1zL2EpK2UpLyhyPXMqaSthKSwoZSppLXQpL3IpOm5ldyBvKCh0K2UqKGk9YS9zKSkvKHI9YSppK3MpLChlLXQqaSkvcil9LHBvdzpmdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBvKHQsZSk7aWYodD10aGlzLnJlLGU9dGhpcy5pbSxuLmlzWmVybygpKXJldHVybiBvLk9ORTtpZigwPT09bi5pbSl7aWYoMD09PWUmJnQ+MClyZXR1cm4gbmV3IG8oTWF0aC5wb3codCxuLnJlKSwwKTtpZigwPT09dClzd2l0Y2goKG4ucmUlNCs0KSU0KXtjYXNlIDA6cmV0dXJuIG5ldyBvKE1hdGgucG93KGUsbi5yZSksMCk7Y2FzZSAxOnJldHVybiBuZXcgbygwLE1hdGgucG93KGUsbi5yZSkpO2Nhc2UgMjpyZXR1cm4gbmV3IG8oLU1hdGgucG93KGUsbi5yZSksMCk7Y2FzZSAzOnJldHVybiBuZXcgbygwLC1NYXRoLnBvdyhlLG4ucmUpKX19aWYoMD09PXQmJjA9PT1lJiZuLnJlPjAmJm4uaW0+PTApcmV0dXJuIG8uWkVSTzt2YXIgcj1NYXRoLmF0YW4yKGUsdCkscz1pKHQsZSk7cmV0dXJuIHQ9TWF0aC5leHAobi5yZSpzLW4uaW0qciksZT1uLmltKnMrbi5yZSpyLG5ldyBvKHQqTWF0aC5jb3MoZSksdCpNYXRoLnNpbihlKSl9LHNxcnQ6ZnVuY3Rpb24oKXt2YXIgdCxlLG49dGhpcy5yZSxyPXRoaXMuaW0saT10aGlzLmFicygpO2lmKG4+PTApe2lmKDA9PT1yKXJldHVybiBuZXcgbyhNYXRoLnNxcnQobiksMCk7dD0uNSpNYXRoLnNxcnQoMiooaStuKSl9ZWxzZSB0PU1hdGguYWJzKHIpL01hdGguc3FydCgyKihpLW4pKTtyZXR1cm4gZT1uPD0wPy41Kk1hdGguc3FydCgyKihpLW4pKTpNYXRoLmFicyhyKS9NYXRoLnNxcnQoMiooaStuKSksbmV3IG8odCxyPDA/LWU6ZSl9LGV4cDpmdW5jdGlvbigpe3ZhciB0PU1hdGguZXhwKHRoaXMucmUpO3JldHVybiB0aGlzLmltLG5ldyBvKHQqTWF0aC5jb3ModGhpcy5pbSksdCpNYXRoLnNpbih0aGlzLmltKSl9LGV4cG0xOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07cmV0dXJuIG5ldyBvKE1hdGguZXhwbTEodCkqTWF0aC5jb3MoZSkrZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5QSS80O2lmKC1lPnR8fHQ+ZSlyZXR1cm4gTWF0aC5jb3ModCktMTt2YXIgbj10KnQ7cmV0dXJuIG4qKG4qKG4qKG4qKG4qKG4qKG4qKG4vMjA5MjI3ODk4ODhlMy0xLzg3MTc4MjkxMjAwKSsxLzQ3OTAwMTYwMCktMS8zNjI4ODAwKSsxLzQwMzIwKS0xLzcyMCkrMS8yNCktLjUpfShlKSxNYXRoLmV4cCh0KSpNYXRoLnNpbihlKSl9LGxvZzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltO3JldHVybiBuZXcgbyhpKHQsZSksTWF0aC5hdGFuMihlLHQpKX0sYWJzOmZ1bmN0aW9uKCl7cmV0dXJuIHQ9dGhpcy5yZSxlPXRoaXMuaW0sbj1NYXRoLmFicyh0KSxyPU1hdGguYWJzKGUpLG48M2UzJiZyPDNlMz9NYXRoLnNxcnQobipuK3Iqcik6KG48cj8obj1yLHI9dC9lKTpyPWUvdCxuKk1hdGguc3FydCgxK3IqcikpO3ZhciB0LGUsbixyfSxhcmc6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5hdGFuMih0aGlzLmltLHRoaXMucmUpfSxzaW46ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLHI9dGhpcy5pbTtyZXR1cm4gbmV3IG8oTWF0aC5zaW4odCkqZShyKSxNYXRoLmNvcyh0KSpuKHIpKX0sY29zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxyPXRoaXMuaW07cmV0dXJuIG5ldyBvKE1hdGguY29zKHQpKmUociksLU1hdGguc2luKHQpKm4ocikpfSx0YW46ZnVuY3Rpb24oKXt2YXIgdD0yKnRoaXMucmUscj0yKnRoaXMuaW0saT1NYXRoLmNvcyh0KStlKHIpO3JldHVybiBuZXcgbyhNYXRoLnNpbih0KS9pLG4ocikvaSl9LGNvdDpmdW5jdGlvbigpe3ZhciB0PTIqdGhpcy5yZSxyPTIqdGhpcy5pbSxpPU1hdGguY29zKHQpLWUocik7cmV0dXJuIG5ldyBvKC1NYXRoLnNpbih0KS9pLG4ocikvaSl9LHNlYzpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUscj10aGlzLmltLGk9LjUqZSgyKnIpKy41Kk1hdGguY29zKDIqdCk7cmV0dXJuIG5ldyBvKE1hdGguY29zKHQpKmUocikvaSxNYXRoLnNpbih0KSpuKHIpL2kpfSxjc2M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLHI9dGhpcy5pbSxpPS41KmUoMipyKS0uNSpNYXRoLmNvcygyKnQpO3JldHVybiBuZXcgbyhNYXRoLnNpbih0KSplKHIpL2ksLU1hdGguY29zKHQpKm4ocikvaSl9LGFzaW46ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbSxuPW5ldyBvKGUqZS10KnQrMSwtMip0KmUpLnNxcnQoKSxyPW5ldyBvKG4ucmUtZSxuLmltK3QpLmxvZygpO3JldHVybiBuZXcgbyhyLmltLC1yLnJlKX0sYWNvczpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltLG49bmV3IG8oZSplLXQqdCsxLC0yKnQqZSkuc3FydCgpLHI9bmV3IG8obi5yZS1lLG4uaW0rdCkubG9nKCk7cmV0dXJuIG5ldyBvKE1hdGguUEkvMi1yLmltLHIucmUpfSxhdGFuOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PXQpe2lmKDE9PT1lKXJldHVybiBuZXcgbygwLDEvMCk7aWYoLTE9PT1lKXJldHVybiBuZXcgbygwLC0xLzApfXZhciBuPXQqdCsoMS1lKSooMS1lKSxyPW5ldyBvKCgxLWUqZS10KnQpL24sLTIqdC9uKS5sb2coKTtyZXR1cm4gbmV3IG8oLS41KnIuaW0sLjUqci5yZSl9LGFjb3Q6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtpZigwPT09ZSlyZXR1cm4gbmV3IG8oTWF0aC5hdGFuMigxLHQpLDApO3ZhciBuPXQqdCtlKmU7cmV0dXJuIDAhPT1uP25ldyBvKHQvbiwtZS9uKS5hdGFuKCk6bmV3IG8oMCE9PXQ/dC8wOjAsMCE9PWU/LWUvMDowKS5hdGFuKCl9LGFzZWM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtpZigwPT09dCYmMD09PWUpcmV0dXJuIG5ldyBvKDAsMS8wKTt2YXIgbj10KnQrZSplO3JldHVybiAwIT09bj9uZXcgbyh0L24sLWUvbikuYWNvcygpOm5ldyBvKDAhPT10P3QvMDowLDAhPT1lPy1lLzA6MCkuYWNvcygpfSxhY3NjOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PXQmJjA9PT1lKXJldHVybiBuZXcgbyhNYXRoLlBJLzIsMS8wKTt2YXIgbj10KnQrZSplO3JldHVybiAwIT09bj9uZXcgbyh0L24sLWUvbikuYXNpbigpOm5ldyBvKDAhPT10P3QvMDowLDAhPT1lPy1lLzA6MCkuYXNpbigpfSxzaW5oOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxyPXRoaXMuaW07cmV0dXJuIG5ldyBvKG4odCkqTWF0aC5jb3MociksZSh0KSpNYXRoLnNpbihyKSl9LGNvc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLHI9dGhpcy5pbTtyZXR1cm4gbmV3IG8oZSh0KSpNYXRoLmNvcyhyKSxuKHQpKk1hdGguc2luKHIpKX0sdGFuaDpmdW5jdGlvbigpe3ZhciB0PTIqdGhpcy5yZSxyPTIqdGhpcy5pbSxpPWUodCkrTWF0aC5jb3Mocik7cmV0dXJuIG5ldyBvKG4odCkvaSxNYXRoLnNpbihyKS9pKX0sY290aDpmdW5jdGlvbigpe3ZhciB0PTIqdGhpcy5yZSxyPTIqdGhpcy5pbSxpPWUodCktTWF0aC5jb3Mocik7cmV0dXJuIG5ldyBvKG4odCkvaSwtTWF0aC5zaW4ocikvaSl9LGNzY2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLHI9dGhpcy5pbSxpPU1hdGguY29zKDIqciktZSgyKnQpO3JldHVybiBuZXcgbygtMipuKHQpKk1hdGguY29zKHIpL2ksMiplKHQpKk1hdGguc2luKHIpL2kpfSxzZWNoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxyPXRoaXMuaW0saT1NYXRoLmNvcygyKnIpK2UoMip0KTtyZXR1cm4gbmV3IG8oMiplKHQpKk1hdGguY29zKHIpL2ksLTIqbih0KSpNYXRoLnNpbihyKS9pKX0sYXNpbmg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmltO3RoaXMuaW09LXRoaXMucmUsdGhpcy5yZT10O3ZhciBlPXRoaXMuYXNpbigpO3JldHVybiB0aGlzLnJlPS10aGlzLmltLHRoaXMuaW09dCx0PWUucmUsZS5yZT0tZS5pbSxlLmltPXQsZX0sYWNvc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmFjb3MoKTtpZih0LmltPD0wKXt2YXIgZT10LnJlO3QucmU9LXQuaW0sdC5pbT1lfWVsc2V7ZT10LmltO3QuaW09LXQucmUsdC5yZT1lfXJldHVybiB0fSxhdGFuaDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmUsZT10aGlzLmltLG49dD4xJiYwPT09ZSxyPTEtdCxzPTErdCxhPXIqcitlKmUsdT0wIT09YT9uZXcgbygocypyLWUqZSkvYSwoZSpyK3MqZSkvYSk6bmV3IG8oLTEhPT10P3QvMDowLDAhPT1lP2UvMDowKSxjPXUucmU7cmV0dXJuIHUucmU9aSh1LnJlLHUuaW0pLzIsdS5pbT1NYXRoLmF0YW4yKHUuaW0sYykvMixuJiYodS5pbT0tdS5pbSksdX0sYWNvdGg6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtpZigwPT09dCYmMD09PWUpcmV0dXJuIG5ldyBvKDAsTWF0aC5QSS8yKTt2YXIgbj10KnQrZSplO3JldHVybiAwIT09bj9uZXcgbyh0L24sLWUvbikuYXRhbmgoKTpuZXcgbygwIT09dD90LzA6MCwwIT09ZT8tZS8wOjApLmF0YW5oKCl9LGFjc2NoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5yZSxlPXRoaXMuaW07aWYoMD09PWUpcmV0dXJuIG5ldyBvKDAhPT10P01hdGgubG9nKHQrTWF0aC5zcXJ0KHQqdCsxKSk6MS8wLDApO3ZhciBuPXQqdCtlKmU7cmV0dXJuIDAhPT1uP25ldyBvKHQvbiwtZS9uKS5hc2luaCgpOm5ldyBvKDAhPT10P3QvMDowLDAhPT1lPy1lLzA6MCkuYXNpbmgoKX0sYXNlY2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbTtpZih0aGlzLmlzWmVybygpKXJldHVybiBvLklORklOSVRZO3ZhciBuPXQqdCtlKmU7cmV0dXJuIDAhPT1uP25ldyBvKHQvbiwtZS9uKS5hY29zaCgpOm5ldyBvKDAhPT10P3QvMDowLDAhPT1lPy1lLzA6MCkuYWNvc2goKX0saW52ZXJzZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIG8uSU5GSU5JVFk7aWYodGhpcy5pc0luZmluaXRlKCkpcmV0dXJuIG8uWkVSTzt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbSxuPXQqdCtlKmU7cmV0dXJuIG5ldyBvKHQvbiwtZS9uKX0sY29uanVnYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKHRoaXMucmUsLXRoaXMuaW0pfSxuZWc6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8oLXRoaXMucmUsLXRoaXMuaW0pfSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KDEwLHR8fDApLG5ldyBvKE1hdGguY2VpbCh0aGlzLnJlKnQpL3QsTWF0aC5jZWlsKHRoaXMuaW0qdCkvdCl9LGZsb29yOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KDEwLHR8fDApLG5ldyBvKE1hdGguZmxvb3IodGhpcy5yZSp0KS90LE1hdGguZmxvb3IodGhpcy5pbSp0KS90KX0scm91bmQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coMTAsdHx8MCksbmV3IG8oTWF0aC5yb3VuZCh0aGlzLnJlKnQpL3QsTWF0aC5yb3VuZCh0aGlzLmltKnQpL3QpfSxlcXVhbHM6ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgbyh0LGUpO3JldHVybiBNYXRoLmFicyhuLnJlLXRoaXMucmUpPD1vLkVQU0lMT04mJk1hdGguYWJzKG4uaW0tdGhpcy5pbSk8PW8uRVBTSUxPTn0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8odGhpcy5yZSx0aGlzLmltKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlLGU9dGhpcy5pbSxuPSIiO3JldHVybiB0aGlzLmlzTmFOKCk/Ik5hTiI6dGhpcy5pc0luZmluaXRlKCk/IkluZmluaXR5IjooTWF0aC5hYnModCk8by5FUFNJTE9OJiYodD0wKSxNYXRoLmFicyhlKTxvLkVQU0lMT04mJihlPTApLDA9PT1lP24rdDooMCE9PXQ/KG4rPXQsbis9IiAiLGU8MD8oZT0tZSxuKz0iLSIpOm4rPSIrIixuKz0iICIpOmU8MCYmKGU9LWUsbis9Ii0iKSwxIT09ZSYmKG4rPWUpLG4rImkiKSl9LHRvVmVjdG9yOmZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMucmUsdGhpcy5pbV19LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuaW0/dGhpcy5yZTpudWxsfSxpc05hTjpmdW5jdGlvbigpe3JldHVybiBpc05hTih0aGlzLnJlKXx8aXNOYU4odGhpcy5pbSl9LGlzWmVybzpmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5pbSYmMD09PXRoaXMucmV9LGlzRmluaXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGlzRmluaXRlKHRoaXMucmUpJiZpc0Zpbml0ZSh0aGlzLmltKX0saXNJbmZpbml0ZTpmdW5jdGlvbigpe3JldHVybiEodGhpcy5pc05hTigpfHx0aGlzLmlzRmluaXRlKCkpfX0sby5aRVJPPW5ldyBvKDAsMCksby5PTkU9bmV3IG8oMSwwKSxvLkk9bmV3IG8oMCwxKSxvLlBJPW5ldyBvKE1hdGguUEksMCksby5FPW5ldyBvKE1hdGguRSwwKSxvLklORklOSVRZPW5ldyBvKDEvMCwxLzApLG8uTkFOPW5ldyBvKE5hTixOYU4pLG8uRVBTSUxPTj0xZS0xNSxPYmplY3QuZGVmaW5lUHJvcGVydHkobywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksby5kZWZhdWx0PW8sby5Db21wbGV4PW8sdC5leHBvcnRzPW99KCl9KSkscnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsImRlZmF1bHQiKT90LmRlZmF1bHQ6dH0obnkpLGl5PWlkKCJDb21wbGV4IixbXSwoKCk9PihPYmplY3QuZGVmaW5lUHJvcGVydHkocnksIm5hbWUiLHt2YWx1ZToiQ29tcGxleCJ9KSxyeS5wcm90b3R5cGUuY29uc3RydWN0b3I9cnkscnkucHJvdG90eXBlLnR5cGU9IkNvbXBsZXgiLHJ5LnByb3RvdHlwZS5pc0NvbXBsZXg9ITAscnkucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkNvbXBsZXgiLHJlOnRoaXMucmUsaW06dGhpcy5pbX19LHJ5LnByb3RvdHlwZS50b1BvbGFyPWZ1bmN0aW9uKCl7cmV0dXJue3I6dGhpcy5hYnMoKSxwaGk6dGhpcy5hcmcoKX19LHJ5LnByb3RvdHlwZS5mb3JtYXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pbSxuPXRoaXMucmUscj1UcCh0aGlzLnJlLHQpLGk9VHAodGhpcy5pbSx0KSxvPVBmKHQpP3Q6dD90LnByZWNpc2lvbjpudWxsO2lmKG51bGwhPT1vKXt2YXIgcz1NYXRoLnBvdygxMCwtbyk7TWF0aC5hYnMobi9lKTxzJiYobj0wKSxNYXRoLmFicyhlL24pPHMmJihlPTApfXJldHVybiAwPT09ZT9yOjA9PT1uPzE9PT1lPyJpIjotMT09PWU/Ii1pIjppKyJpIjplPDA/LTE9PT1lP3IrIiAtIGkiOnIrIiAtICIraS5zdWJzdHJpbmcoMSkrImkiOjE9PT1lP3IrIiArIGkiOnIrIiArICIraSsiaSJ9LHJ5LmZyb21Qb2xhcj1mdW5jdGlvbih0KXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOnZhciBlPWFyZ3VtZW50c1swXTtpZigib2JqZWN0Ij09dHlwZW9mIGUpcmV0dXJuIHJ5KGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIklucHV0IGhhcyB0byBiZSBhbiBvYmplY3Qgd2l0aCByIGFuZCBwaGkga2V5cy4iKTtjYXNlIDI6dmFyIG49YXJndW1lbnRzWzBdLHI9YXJndW1lbnRzWzFdO2lmKFBmKG4pKXtpZih6ZihyKSYmci5oYXNCYXNlKCJBTkdMRSIpJiYocj1yLnRvTnVtYmVyKCJyYWQiKSksUGYocikpcmV0dXJuIG5ldyByeSh7cjpuLHBoaTpyfSk7dGhyb3cgbmV3IFR5cGVFcnJvcigiUGhpIGlzIG5vdCBhIG51bWJlciBub3IgYW4gYW5nbGUgdW5pdC4iKX10aHJvdyBuZXcgVHlwZUVycm9yKCJSYWRpdXMgciBpcyBub3QgYSBudW1iZXIuIik7ZGVmYXVsdDp0aHJvdyBuZXcgU3ludGF4RXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgaW4gZnVuY3Rpb24gZnJvbVBvbGFyIil9fSxyeS5wcm90b3R5cGUudmFsdWVPZj1yeS5wcm90b3R5cGUudG9TdHJpbmcscnkuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyByeSh0KX0scnkuY29tcGFyZT1mdW5jdGlvbih0LGUpe3JldHVybiB0LnJlPmUucmU/MTp0LnJlPGUucmU/LTE6dC5pbT5lLmltPzE6dC5pbTxlLmltPy0xOjB9LHJ5KSkse2lzQ2xhc3M6ITB9KSxveT17czoxLG46MCxkOjF9O2Z1bmN0aW9uIHN5KHQsZSl7aWYoaXNOYU4odD1wYXJzZUludCh0LDEwKSkpdGhyb3cgcHkoKTtyZXR1cm4gdCplfWZ1bmN0aW9uIGF5KHQsZSl7aWYoMD09PWUpdGhyb3cgZnkoKTt2YXIgbj1PYmplY3QuY3JlYXRlKGh5LnByb3RvdHlwZSk7bi5zPXQ8MD8tMToxO3ZhciByPWx5KHQ9dDwwPy10OnQsZSk7cmV0dXJuIG4ubj10L3Isbi5kPWUvcixufWZ1bmN0aW9uIHV5KHQpe2Zvcih2YXIgZT17fSxuPXQscj0yLGk9NDtpPD1uOyl7Zm9yKDtuJXI9PTA7KW4vPXIsZVtyXT0oZVtyXXx8MCkrMTtpKz0xKzIqcisrfXJldHVybiBuIT09dD9uPjEmJihlW25dPShlW25dfHwwKSsxKTplW3RdPShlW3RdfHwwKSsxLGV9dmFyIGN5PWZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wLGk9MSxvPTEscz0wLGE9MCx1PTAsYz0xLGw9MSxoPTAsZj0xLHA9MSxkPTEsZz0xZTc7aWYobnVsbCE9dClpZih2b2lkIDAhPT1lKXtpZihvPShyPXQpKihpPWUpLHIlMSE9MHx8aSUxIT0wKXRocm93IGR5KCl9ZWxzZSBzd2l0Y2godHlwZW9mIHQpe2Nhc2Uib2JqZWN0IjppZigiZCJpbiB0JiYibiJpbiB0KXI9dC5uLGk9dC5kLCJzImluIHQmJihyKj10LnMpO2Vsc2V7aWYoISgwIGluIHQpKXRocm93IHB5KCk7cj10WzBdLDEgaW4gdCYmKGk9dFsxXSl9bz1yKmk7YnJlYWs7Y2FzZSJudW1iZXIiOmlmKHQ8MCYmKG89dCx0PS10KSx0JTE9PTApcj10O2Vsc2UgaWYodD4wKXtmb3IodD49MSYmKHQvPWw9TWF0aC5wb3coMTAsTWF0aC5mbG9vcigxK01hdGgubG9nKHQpL01hdGguTE4xMCkpKTtmPD1nJiZkPD1nOyl7aWYodD09PShuPShoK3ApLyhmK2QpKSl7ZitkPD1nPyhyPWgrcCxpPWYrZCk6ZD5mPyhyPXAsaT1kKToocj1oLGk9Zik7YnJlYWt9dD5uPyhoKz1wLGYrPWQpOihwKz1oLGQrPWYpLGY+Zz8ocj1wLGk9ZCk6KHI9aCxpPWYpfXIqPWx9ZWxzZShpc05hTih0KXx8aXNOYU4oZSkpJiYoaT1yPU5hTik7YnJlYWs7Y2FzZSJzdHJpbmciOmlmKG51bGw9PT0oZj10Lm1hdGNoKC9cZCt8Li9nKSkpdGhyb3cgcHkoKTtpZigiLSI9PT1mW2hdPyhvPS0xLGgrKyk6IisiPT09ZltoXSYmaCsrLGYubGVuZ3RoPT09aCsxP2E9c3koZltoKytdLG8pOiIuIj09PWZbaCsxXXx8Ii4iPT09ZltoXT8oIi4iIT09ZltoXSYmKHM9c3koZltoKytdLG8pKSwoKytoKzE9PT1mLmxlbmd0aHx8IigiPT09ZltoKzFdJiYiKSI9PT1mW2grM118fCInIj09PWZbaCsxXSYmIiciPT09ZltoKzNdKSYmKGE9c3koZltoXSxvKSxjPU1hdGgucG93KDEwLGZbaF0ubGVuZ3RoKSxoKyspLCgiKCI9PT1mW2hdJiYiKSI9PT1mW2grMl18fCInIj09PWZbaF0mJiInIj09PWZbaCsyXSkmJih1PXN5KGZbaCsxXSxvKSxsPU1hdGgucG93KDEwLGZbaCsxXS5sZW5ndGgpLTEsaCs9MykpOiIvIj09PWZbaCsxXXx8IjoiPT09ZltoKzFdPyhhPXN5KGZbaF0sbyksYz1zeShmW2grMl0sMSksaCs9Myk6Ii8iPT09ZltoKzNdJiYiICI9PT1mW2grMV0mJihzPXN5KGZbaF0sbyksYT1zeShmW2grMl0sbyksYz1zeShmW2grNF0sMSksaCs9NSksZi5sZW5ndGg8PWgpe289cj11KyhpPWMqbCkqcytsKmE7YnJlYWt9ZGVmYXVsdDp0aHJvdyBweSgpfWlmKDA9PT1pKXRocm93IGZ5KCk7b3kucz1vPDA/LTE6MSxveS5uPU1hdGguYWJzKHIpLG95LmQ9TWF0aC5hYnMoaSl9O2Z1bmN0aW9uIGx5KHQsZSl7aWYoIXQpcmV0dXJuIGU7aWYoIWUpcmV0dXJuIHQ7Zm9yKDs7KXtpZighKHQlPWUpKXJldHVybiBlO2lmKCEoZSU9dCkpcmV0dXJuIHR9fWZ1bmN0aW9uIGh5KHQsZSl7aWYoY3kodCxlKSwhKHRoaXMgaW5zdGFuY2VvZiBoeSkpcmV0dXJuIGF5KG95LnMqb3kubixveS5kKTt0PWx5KG95LmQsb3kubiksdGhpcy5zPW95LnMsdGhpcy5uPW95Lm4vdCx0aGlzLmQ9b3kuZC90fXZhciBmeT1mdW5jdGlvbigpe3JldHVybiBuZXcgRXJyb3IoIkRpdmlzaW9uIGJ5IFplcm8iKX0scHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEVycm9yKCJJbnZhbGlkIGFyZ3VtZW50Iil9LGR5PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcigiUGFyYW1ldGVycyBtdXN0IGJlIGludGVnZXIiKX07aHkucHJvdG90eXBlPXtzOjEsbjowLGQ6MSxhYnM6ZnVuY3Rpb24oKXtyZXR1cm4gYXkodGhpcy5uLHRoaXMuZCl9LG5lZzpmdW5jdGlvbigpe3JldHVybiBheSgtdGhpcy5zKnRoaXMubix0aGlzLmQpfSxhZGQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gY3kodCxlKSxheSh0aGlzLnMqdGhpcy5uKm95LmQrb3kucyp0aGlzLmQqb3kubix0aGlzLmQqb3kuZCl9LHN1YjpmdW5jdGlvbih0LGUpe3JldHVybiBjeSh0LGUpLGF5KHRoaXMucyp0aGlzLm4qb3kuZC1veS5zKnRoaXMuZCpveS5uLHRoaXMuZCpveS5kKX0sbXVsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGN5KHQsZSksYXkodGhpcy5zKm95LnMqdGhpcy5uKm95Lm4sdGhpcy5kKm95LmQpfSxkaXY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gY3kodCxlKSxheSh0aGlzLnMqb3kucyp0aGlzLm4qb3kuZCx0aGlzLmQqb3kubil9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIGF5KHRoaXMucyp0aGlzLm4sdGhpcy5kKX0sbW9kOmZ1bmN0aW9uKHQsZSl7aWYoaXNOYU4odGhpcy5uKXx8aXNOYU4odGhpcy5kKSlyZXR1cm4gbmV3IGh5KE5hTik7aWYodm9pZCAwPT09dClyZXR1cm4gYXkodGhpcy5zKnRoaXMubiV0aGlzLmQsMSk7aWYoY3kodCxlKSwwPT09b3kubiYmMD09PXRoaXMuZCl0aHJvdyBmeSgpO3JldHVybiBheSh0aGlzLnMqKG95LmQqdGhpcy5uKSUob3kubip0aGlzLmQpLG95LmQqdGhpcy5kKX0sZ2NkOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGN5KHQsZSksYXkobHkob3kubix0aGlzLm4pKmx5KG95LmQsdGhpcy5kKSxveS5kKnRoaXMuZCl9LGxjbTpmdW5jdGlvbih0LGUpe3JldHVybiBjeSh0LGUpLDA9PT1veS5uJiYwPT09dGhpcy5uP2F5KDAsMSk6YXkob3kubip0aGlzLm4sbHkob3kubix0aGlzLm4pKmx5KG95LmQsdGhpcy5kKSl9LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coMTAsdHx8MCksaXNOYU4odGhpcy5uKXx8aXNOYU4odGhpcy5kKT9uZXcgaHkoTmFOKTpheShNYXRoLmNlaWwodCp0aGlzLnMqdGhpcy5uL3RoaXMuZCksdCl9LGZsb29yOmZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KDEwLHR8fDApLGlzTmFOKHRoaXMubil8fGlzTmFOKHRoaXMuZCk/bmV3IGh5KE5hTik6YXkoTWF0aC5mbG9vcih0KnRoaXMucyp0aGlzLm4vdGhpcy5kKSx0KX0scm91bmQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coMTAsdHx8MCksaXNOYU4odGhpcy5uKXx8aXNOYU4odGhpcy5kKT9uZXcgaHkoTmFOKTpheShNYXRoLnJvdW5kKHQqdGhpcy5zKnRoaXMubi90aGlzLmQpLHQpfSxyb3VuZFRvOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGN5KHQsZSksYXkodGhpcy5zKk1hdGgucm91bmQodGhpcy5uKm95LmQvKHRoaXMuZCpveS5uKSkqb3kubixveS5kKX0saW52ZXJzZTpmdW5jdGlvbigpe3JldHVybiBheSh0aGlzLnMqdGhpcy5kLHRoaXMubil9LHBvdzpmdW5jdGlvbih0LGUpe2lmKGN5KHQsZSksMT09PW95LmQpcmV0dXJuIG95LnM8MD9heShNYXRoLnBvdyh0aGlzLnMqdGhpcy5kLG95Lm4pLE1hdGgucG93KHRoaXMubixveS5uKSk6YXkoTWF0aC5wb3codGhpcy5zKnRoaXMubixveS5uKSxNYXRoLnBvdyh0aGlzLmQsb3kubikpO2lmKHRoaXMuczwwKXJldHVybiBudWxsO3ZhciBuPXV5KHRoaXMubikscj11eSh0aGlzLmQpLGk9MSxvPTE7Zm9yKHZhciBzIGluIG4paWYoIjEiIT09cyl7aWYoIjAiPT09cyl7aT0wO2JyZWFrfWlmKG5bc10qPW95Lm4sbltzXSVveS5kIT0wKXJldHVybiBudWxsO25bc10vPW95LmQsaSo9TWF0aC5wb3cocyxuW3NdKX1mb3IodmFyIHMgaW4gcilpZigiMSIhPT1zKXtpZihyW3NdKj1veS5uLHJbc10lb3kuZCE9MClyZXR1cm4gbnVsbDtyW3NdLz1veS5kLG8qPU1hdGgucG93KHMscltzXSl9cmV0dXJuIG95LnM8MD9heShvLGkpOmF5KGksbyl9LGVxdWFsczpmdW5jdGlvbih0LGUpe3JldHVybiBjeSh0LGUpLHRoaXMucyp0aGlzLm4qb3kuZD09b3kucypveS5uKnRoaXMuZH0sY29tcGFyZTpmdW5jdGlvbih0LGUpe2N5KHQsZSk7dmFyIG49dGhpcy5zKnRoaXMubipveS5kLW95LnMqb3kubip0aGlzLmQ7cmV0dXJuKDA8biktKG48MCl9LHNpbXBsaWZ5OmZ1bmN0aW9uKHQpe2lmKGlzTmFOKHRoaXMubil8fGlzTmFOKHRoaXMuZCkpcmV0dXJuIHRoaXM7dD10fHwuMDAxO2Zvcih2YXIgZT10aGlzLmFicygpLG49ZS50b0NvbnRpbnVlZCgpLHI9MTtyPG4ubGVuZ3RoO3IrKyl7Zm9yKHZhciBpPWF5KG5bci0xXSwxKSxvPXItMjtvPj0wO28tLSlpPWkuaW52ZXJzZSgpLmFkZChuW29dKTtpZihNYXRoLmFicyhpLnN1YihlKS52YWx1ZU9mKCkpPHQpcmV0dXJuIGkubXVsKHRoaXMucyl9cmV0dXJuIHRoaXN9LGRpdmlzaWJsZTpmdW5jdGlvbih0LGUpe3JldHVybiBjeSh0LGUpLCEoIShveS5uKnRoaXMuZCl8fHRoaXMubipveS5kJShveS5uKnRoaXMuZCkpfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucyp0aGlzLm4vdGhpcy5kfSx0b0ZyYWN0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlLG49IiIscj10aGlzLm4saT10aGlzLmQ7cmV0dXJuIHRoaXMuczwwJiYobis9Ii0iKSwxPT09aT9uKz1yOih0JiYoZT1NYXRoLmZsb29yKHIvaSkpPjAmJihuKz1lLG4rPSIgIixyJT1pKSxuKz1yLG4rPSIvIixuKz1pKSxufSx0b0xhdGV4OmZ1bmN0aW9uKHQpe3ZhciBlLG49IiIscj10aGlzLm4saT10aGlzLmQ7cmV0dXJuIHRoaXMuczwwJiYobis9Ii0iKSwxPT09aT9uKz1yOih0JiYoZT1NYXRoLmZsb29yKHIvaSkpPjAmJihuKz1lLHIlPWkpLG4rPSJcXGZyYWN7IixuKz1yLG4rPSJ9eyIsbis9aSxuKz0ifSIpLG59LHRvQ29udGludWVkOmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLm4sbj10aGlzLmQscj1bXTtpZihpc05hTihlKXx8aXNOYU4obikpcmV0dXJuIHI7ZG97ci5wdXNoKE1hdGguZmxvb3IoZS9uKSksdD1lJW4sZT1uLG49dH13aGlsZSgxIT09ZSk7cmV0dXJuIHJ9LHRvU3RyaW5nOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubixuPXRoaXMuZDtpZihpc05hTihlKXx8aXNOYU4obikpcmV0dXJuIk5hTiI7dD10fHwxNTt2YXIgcj1mdW5jdGlvbih0LGUpe2Zvcig7ZSUyPT0wO2UvPTIpO2Zvcig7ZSU1PT0wO2UvPTUpO2lmKDE9PT1lKXJldHVybiAwO2Zvcih2YXIgbj0xMCVlLHI9MTsxIT09bjtyKyspaWYobj0xMCpuJWUscj4yZTMpcmV0dXJuIDA7cmV0dXJuIHJ9KDAsbiksaT1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTEsaT1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPTE7ZT4wO3Q9dCp0JW4sZT4+PTEpMSZlJiYocj1yKnQlbik7cmV0dXJuIHJ9KDEwLG4sZSksbz0wO288MzAwO28rKyl7aWYocj09PWkpcmV0dXJuIG87cj0xMCpyJWUsaT0xMCppJWV9cmV0dXJuIDB9KDAsbixyKSxvPXRoaXMuczwwPyItIjoiIjtpZihvKz1lL258MCxlJT1uLChlKj0xMCkmJihvKz0iLiIpLHIpe2Zvcih2YXIgcz1pO3MtLTspbys9ZS9ufDAsZSU9bixlKj0xMDtvKz0iKCI7Zm9yKHM9cjtzLS07KW8rPWUvbnwwLGUlPW4sZSo9MTA7bys9IikifWVsc2UgZm9yKHM9dDtlJiZzLS07KW8rPWUvbnwwLGUlPW4sZSo9MTA7cmV0dXJuIG99fTt2YXIgZ3k9aWQoIkZyYWN0aW9uIixbXSwoKCk9PihPYmplY3QuZGVmaW5lUHJvcGVydHkoaHksIm5hbWUiLHt2YWx1ZToiRnJhY3Rpb24ifSksaHkucHJvdG90eXBlLmNvbnN0cnVjdG9yPWh5LGh5LnByb3RvdHlwZS50eXBlPSJGcmFjdGlvbiIsaHkucHJvdG90eXBlLmlzRnJhY3Rpb249ITAsaHkucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkZyYWN0aW9uIixuOnRoaXMucyp0aGlzLm4sZDp0aGlzLmR9fSxoeS5mcm9tSlNPTj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGh5KHQpfSxoeSkpLHtpc0NsYXNzOiEwfSkseXk9aWQoIk1hdHJpeCIsW10sKCgpPT57ZnVuY3Rpb24gdCgpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIil9cmV0dXJuIHQucHJvdG90eXBlLnR5cGU9Ik1hdHJpeCIsdC5wcm90b3R5cGUuaXNNYXRyaXg9ITAsdC5wcm90b3R5cGUuc3RvcmFnZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzdG9yYWdlIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5kYXRhdHlwZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBkYXRhdHlwZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGNyZWF0ZSBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuc3Vic2V0PWZ1bmN0aW9uKHQsZSxuKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc3Vic2V0IG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGdldCBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc2V0IG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgcmVzaXplIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHJlc2hhcGUgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGNsb25lIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHNpemUgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0LGUpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBtYXAgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGZvckVhY2ggb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpdGVyYXRlIGEgTWF0cml4IGludGVyZmFjZSIpfSx0LnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHRvQXJyYXkgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgdmFsdWVPZiBvbiBhIE1hdHJpeCBpbnRlcmZhY2UiKX0sdC5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBmb3JtYXQgb24gYSBNYXRyaXggaW50ZXJmYWNlIil9LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHRvU3RyaW5nIG9uIGEgTWF0cml4IGludGVyZmFjZSIpfSx0fSkse2lzQ2xhc3M6ITB9KTtmdW5jdGlvbiBteSh0KXtyZXR1cm4gT2JqZWN0LmtleXModC5zaWduYXR1cmVzfHx7fSkucmVkdWNlKChmdW5jdGlvbih0LGUpe3ZhciBuPShlLm1hdGNoKC8sL2cpfHxbXSkubGVuZ3RoKzE7cmV0dXJuIE1hdGgubWF4KHQsbil9KSwtMSl9dmFyIHZ5PWlkKCJEZW5zZU1hdHJpeCIsWyJNYXRyaXgiXSwodD0+e3ZhcntNYXRyaXg6ZX09dDtmdW5jdGlvbiBuKHQsZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3IiKTtpZihlJiYhamYoZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRhdGF0eXBlOiAiK2UpO2lmKHFmKHQpKSJEZW5zZU1hdHJpeCI9PT10LnR5cGU/KHRoaXMuX2RhdGE9d3AodC5fZGF0YSksdGhpcy5fc2l6ZT13cCh0Ll9zaXplKSx0aGlzLl9kYXRhdHlwZT1lfHx0Ll9kYXRhdHlwZSk6KHRoaXMuX2RhdGE9dC50b0FycmF5KCksdGhpcy5fc2l6ZT10LnNpemUoKSx0aGlzLl9kYXRhdHlwZT1lfHx0Ll9kYXRhdHlwZSk7ZWxzZSBpZih0JiZVZih0LmRhdGEpJiZVZih0LnNpemUpKXRoaXMuX2RhdGE9dC5kYXRhLHRoaXMuX3NpemU9dC5zaXplLEhwKHRoaXMuX2RhdGEsdGhpcy5fc2l6ZSksdGhpcy5fZGF0YXR5cGU9ZXx8dC5kYXRhdHlwZTtlbHNlIGlmKFVmKHQpKXRoaXMuX2RhdGE9YSh0KSx0aGlzLl9zaXplPVhwKHRoaXMuX2RhdGEpLEhwKHRoaXMuX2RhdGEsdGhpcy5fc2l6ZSksdGhpcy5fZGF0YXR5cGU9ZTtlbHNle2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSBvZiBkYXRhICgiK3hwKHQpKyIpIik7dGhpcy5fZGF0YT1bXSx0aGlzLl9zaXplPVswXSx0aGlzLl9kYXRhdHlwZT1lfX1mdW5jdGlvbiByKHQsZSxuLGkpe3ZhciBvPWk9PT1uLTEscz1lLmRpbWVuc2lvbihpKTtyZXR1cm4gbz9zLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIFpwKGUsdC5sZW5ndGgpLHRbZV19KSkudmFsdWVPZigpOnMubWFwKChmdW5jdGlvbihvKXtyZXR1cm4gWnAobyx0Lmxlbmd0aCkscih0W29dLGUsbixpKzEpfSkpLnZhbHVlT2YoKX1mdW5jdGlvbiBpKHQsZSxuLHIsbyl7dmFyIHM9bz09PXItMSxhPWUuZGltZW5zaW9uKG8pO3M/YS5mb3JFYWNoKChmdW5jdGlvbihlLHIpe1pwKGUpLHRbZV09bltyWzBdXX0pKTphLmZvckVhY2goKGZ1bmN0aW9uKHMsYSl7WnAocyksaSh0W3NdLGUsblthWzBdXSxyLG8rMSl9KSl9ZnVuY3Rpb24gbyh0LGUsbil7aWYoMD09PWUubGVuZ3RoKXtmb3IodmFyIHI9dC5fZGF0YTtVZihyKTspcj1yWzBdO3JldHVybiByfXJldHVybiB0Ll9zaXplPWUuc2xpY2UoMCksdC5fZGF0YT1LcCh0Ll9kYXRhLHQuX3NpemUsbiksdH1mdW5jdGlvbiBzKHQsZSxuKXtmb3IodmFyIHI9dC5fc2l6ZS5zbGljZSgwKSxpPSExO3IubGVuZ3RoPGUubGVuZ3RoOylyLnB1c2goMCksaT0hMDtmb3IodmFyIHM9MCxhPWUubGVuZ3RoO3M8YTtzKyspZVtzXT5yW3NdJiYocltzXT1lW3NdLGk9ITApO2kmJm8odCxyLG4pfWZ1bmN0aW9uIGEodCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10W2VdO1VmKHIpP3RbZV09YShyKTpyJiYhMD09PXIuaXNNYXRyaXgmJih0W2VdPWEoci52YWx1ZU9mKCkpKX1yZXR1cm4gdH1yZXR1cm4gbi5wcm90b3R5cGU9bmV3IGUsbi5wcm90b3R5cGUuY3JlYXRlRGVuc2VNYXRyaXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG4odCxlKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIm5hbWUiLHt2YWx1ZToiRGVuc2VNYXRyaXgifSksbi5wcm90b3R5cGUuY29uc3RydWN0b3I9bixuLnByb3RvdHlwZS50eXBlPSJEZW5zZU1hdHJpeCIsbi5wcm90b3R5cGUuaXNEZW5zZU1hdHJpeD0hMCxuLnByb3RvdHlwZS5nZXREYXRhVHlwZT1mdW5jdGlvbigpe3JldHVybiByZCh0aGlzLl9kYXRhLHhwKX0sbi5wcm90b3R5cGUuc3RvcmFnZT1mdW5jdGlvbigpe3JldHVybiJkZW5zZSJ9LG4ucHJvdG90eXBlLmRhdGF0eXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF0eXBlfSxuLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IG4odCxlKX0sbi5wcm90b3R5cGUuc3Vic2V0PWZ1bmN0aW9uKHQsZSxvKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbih0LGUpe2lmKCFXZihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGluZGV4Iik7dmFyIGk9ZS5pc1NjYWxhcigpO2lmKGkpcmV0dXJuIHQuZ2V0KGUubWluKCkpO3ZhciBvPWUuc2l6ZSgpO2lmKG8ubGVuZ3RoIT09dC5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKG8ubGVuZ3RoLHQuX3NpemUubGVuZ3RoKTtmb3IodmFyIHM9ZS5taW4oKSxhPWUubWF4KCksdT0wLGM9dC5fc2l6ZS5sZW5ndGg7dTxjO3UrKylacChzW3VdLHQuX3NpemVbdV0pLFpwKGFbdV0sdC5fc2l6ZVt1XSk7cmV0dXJuIG5ldyBuKHIodC5fZGF0YSxlLG8ubGVuZ3RoLDApLHQuX2RhdGF0eXBlKX0odGhpcyx0KTtjYXNlIDI6Y2FzZSAzOnJldHVybiBmdW5jdGlvbih0LGUsbixyKXtpZighZXx8ITAhPT1lLmlzSW5kZXgpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBpbmRleCIpO3ZhciBvLGE9ZS5zaXplKCksdT1lLmlzU2NhbGFyKCk7aWYocWYobik/KG89bi5zaXplKCksbj1uLnZhbHVlT2YoKSk6bz1YcChuKSx1KXtpZigwIT09by5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiU2NhbGFyIGV4cGVjdGVkIik7dC5zZXQoZS5taW4oKSxuLHIpfWVsc2V7aWYoYS5sZW5ndGg8dC5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKGEubGVuZ3RoLHQuX3NpemUubGVuZ3RoLCI8Iik7aWYoby5sZW5ndGg8YS5sZW5ndGgpe2Zvcih2YXIgYz0wLGw9MDsxPT09YVtjXSYmMT09PW9bY107KWMrKztmb3IoOzE9PT1hW2NdOylsKyssYysrO249ZWQobixhLmxlbmd0aCxsLG8pfWlmKCFicChhLG8pKXRocm93IG5ldyBHcChhLG8sIj4iKTtzKHQsZS5tYXgoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0KzF9KSkscik7dmFyIGg9YS5sZW5ndGgsZj0wO2kodC5fZGF0YSxlLG4saCxmKX1yZXR1cm4gdH0odGhpcyx0LGUsbyk7ZGVmYXVsdDp0aHJvdyBuZXcgU3ludGF4RXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMiKX19LG4ucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZighVWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aCE9PXRoaXMuX3NpemUubGVuZ3RoKXRocm93IG5ldyBHcCh0Lmxlbmd0aCx0aGlzLl9zaXplLmxlbmd0aCk7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspWnAodFtlXSx0aGlzLl9zaXplW2VdKTtmb3IodmFyIG49dGhpcy5fZGF0YSxyPTAsaT10Lmxlbmd0aDtyPGk7cisrKXt2YXIgbz10W3JdO1pwKG8sbi5sZW5ndGgpLG49bltvXX1yZXR1cm4gbn0sbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSxuKXtpZighVWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aDx0aGlzLl9zaXplLmxlbmd0aCl0aHJvdyBuZXcgR3AodC5sZW5ndGgsdGhpcy5fc2l6ZS5sZW5ndGgsIjwiKTt2YXIgcixpLG87cyh0aGlzLHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdCsxfSkpLG4pO3ZhciBhPXRoaXMuX2RhdGE7Zm9yKHI9MCxpPXQubGVuZ3RoLTE7cjxpO3IrKylacChvPXRbcl0sYS5sZW5ndGgpLGE9YVtvXTtyZXR1cm4gWnAobz10W3QubGVuZ3RoLTFdLGEubGVuZ3RoKSxhW29dPWUsdGhpc30sbi5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKHQsZSxuKXtpZighVmYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgb3IgTWF0cml4IGV4cGVjdGVkIik7dmFyIHI9dC52YWx1ZU9mKCkubWFwKCh0PT5BcnJheS5pc0FycmF5KHQpJiYxPT09dC5sZW5ndGg/dFswXTp0KSk7cmV0dXJuIG8obj90aGlzLmNsb25lKCk6dGhpcyxyLGUpfSxuLnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZT90aGlzLmNsb25lKCk6dGhpcztuLl9kYXRhPVFwKG4uX2RhdGEsdCk7dmFyIHI9bi5fc2l6ZS5yZWR1Y2UoKCh0LGUpPT50KmUpKTtyZXR1cm4gbi5fc2l6ZT0kcCh0LHIpLG59LG4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHtkYXRhOndwKHRoaXMuX2RhdGEpLHNpemU6d3AodGhpcy5fc2l6ZSksZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9KX0sbi5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaXplLnNsaWNlKDApfSxuLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxyPW15KHQpLGk9ZnVuY3Rpb24gbihpLG8pe3JldHVybiBVZihpKT9pLm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0LG8uY29uY2F0KGUpKX0pKToxPT09cj90KGkpOjI9PT1yP3QoaSxvKTp0KGksbyxlKX0odGhpcy5fZGF0YSxbXSk7cmV0dXJuIG5ldyBuKGksdm9pZCAwIT09dGhpcy5fZGF0YXR5cGU/cmQoaSx4cCk6dm9pZCAwKX0sbi5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0KXt2YXIgZT10aGlzOyFmdW5jdGlvbiBuKHIsaSl7VWYocik/ci5mb3JFYWNoKChmdW5jdGlvbih0LGUpe24odCxpLmNvbmNhdChlKSl9KSk6dChyLGksZSl9KHRoaXMuX2RhdGEsW10pfSxuLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKigpe3lpZWxkKmZ1bmN0aW9uKnQoZSxuKXtpZihVZihlKSlmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl5aWVsZCp0KGVbcl0sbi5jb25jYXQocikpO2Vsc2UgeWllbGR7dmFsdWU6ZSxpbmRleDpufX0odGhpcy5fZGF0YSxbXSl9LG4ucHJvdG90eXBlLnJvd3M9ZnVuY3Rpb24oKXt2YXIgdD1bXTtpZigyIT09dGhpcy5zaXplKCkubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlJvd3MgY2FuIG9ubHkgYmUgcmV0dXJuZWQgZm9yIGEgMkQgbWF0cml4LiIpO3ZhciBlPXRoaXMuX2RhdGE7Zm9yKHZhciByIG9mIGUpdC5wdXNoKG5ldyBuKFtyXSx0aGlzLl9kYXRhdHlwZSkpO3JldHVybiB0fSxuLnByb3RvdHlwZS5jb2x1bW5zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPVtdLHI9dGhpcy5zaXplKCk7aWYoMiE9PXIubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlJvd3MgY2FuIG9ubHkgYmUgcmV0dXJuZWQgZm9yIGEgMkQgbWF0cml4LiIpO2Zvcih2YXIgaT10aGlzLl9kYXRhLG89ZnVuY3Rpb24ocil7dmFyIG89aS5tYXAoKHQ9Plt0W3JdXSkpO2UucHVzaChuZXcgbihvLHQuX2RhdGF0eXBlKSl9LHM9MDtzPHJbMV07cysrKW8ocyk7cmV0dXJuIGV9LG4ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24oKXtyZXR1cm4gd3AodGhpcy5fZGF0YSl9LG4ucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX0sbi5wcm90b3R5cGUuZm9ybWF0PWZ1bmN0aW9uKHQpe3JldHVybiBxcCh0aGlzLl9kYXRhLHQpfSxuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBxcCh0aGlzLl9kYXRhKX0sbi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21hdGhqczoiRGVuc2VNYXRyaXgiLGRhdGE6dGhpcy5fZGF0YSxzaXplOnRoaXMuX3NpemUsZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9fSxuLnByb3RvdHlwZS5kaWFnb25hbD1mdW5jdGlvbih0KXtpZih0KXtpZihSZih0KSYmKHQ9dC50b051bWJlcigpKSwhUGYodCl8fCFNcCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFyYW1ldGVyIGsgbXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlciIpfWVsc2UgdD0wO2Zvcih2YXIgZT10PjA/dDowLHI9dDwwPy10OjAsaT10aGlzLl9zaXplWzBdLG89dGhpcy5fc2l6ZVsxXSxzPU1hdGgubWluKGktcixvLWUpLGE9W10sdT0wO3U8czt1KyspYVt1XT10aGlzLl9kYXRhW3Urcl1bdStlXTtyZXR1cm4gbmV3IG4oe2RhdGE6YSxzaXplOltzXSxkYXRhdHlwZTp0aGlzLl9kYXRhdHlwZX0pfSxuLmRpYWdvbmFsPWZ1bmN0aW9uKHQsZSxyLGkpe2lmKCFVZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCwgc2l6ZSBwYXJhbWV0ZXIiKTtpZigyIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJPbmx5IHR3byBkaW1lbnNpb25zIG1hdHJpeCBhcmUgc3VwcG9ydGVkIik7aWYodD10Lm1hcCgoZnVuY3Rpb24odCl7aWYoUmYodCkmJih0PXQudG9OdW1iZXIoKSksIVBmKHQpfHwhTXAodCl8fHQ8MSl0aHJvdyBuZXcgRXJyb3IoIlNpemUgdmFsdWVzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKTtyZXR1cm4gdH0pKSxyKXtpZihSZihyKSYmKHI9ci50b051bWJlcigpKSwhUGYocil8fCFNcChyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFyYW1ldGVyIGsgbXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlciIpfWVsc2Ugcj0wO3ZhciBvLHM9cj4wP3I6MCxhPXI8MD8tcjowLHU9dFswXSxjPXRbMV0sbD1NYXRoLm1pbih1LWEsYy1zKTtpZihVZihlKSl7aWYoZS5sZW5ndGghPT1sKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCB2YWx1ZSBhcnJheSBsZW5ndGgiKTtvPWZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfX1lbHNlIGlmKHFmKGUpKXt2YXIgaD1lLnNpemUoKTtpZigxIT09aC5sZW5ndGh8fGhbMF0hPT1sKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtYXRyaXggbGVuZ3RoIik7bz1mdW5jdGlvbih0KXtyZXR1cm4gZS5nZXQoW3RdKX19ZWxzZSBvPWZ1bmN0aW9uKCl7cmV0dXJuIGV9O2l8fChpPVJmKG8oMCkpP28oMCkubXVsKDApOjApO3ZhciBmPVtdO2lmKHQubGVuZ3RoPjApe2Y9S3AoZix0LGkpO2Zvcih2YXIgcD0wO3A8bDtwKyspZltwK2FdW3Arc109byhwKX1yZXR1cm4gbmV3IG4oe2RhdGE6ZixzaXplOlt1LGNdfSl9LG4uZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQpfSxuLnByb3RvdHlwZS5zd2FwUm93cz1mdW5jdGlvbih0LGUpe2lmKCEoUGYodCkmJk1wKHQpJiZQZihlKSYmTXAoZSkpKXRocm93IG5ldyBFcnJvcigiUm93IGluZGV4IG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKTtpZigyIT09dGhpcy5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJPbmx5IHR3byBkaW1lbnNpb25hbCBtYXRyaXggaXMgc3VwcG9ydGVkIik7cmV0dXJuIFpwKHQsdGhpcy5fc2l6ZVswXSksWnAoZSx0aGlzLl9zaXplWzBdKSxuLl9zd2FwUm93cyh0LGUsdGhpcy5fZGF0YSksdGhpc30sbi5fc3dhcFJvd3M9ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5bdF07blt0XT1uW2VdLG5bZV09cn0sbn0pLHtpc0NsYXNzOiEwfSk7ZnVuY3Rpb24gX3kodCxlLG4pe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5tYXA/dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBfeSh0LGUpfSkpOmUodCl9dmFyIHh5PSJpc0ludGVnZXIiLHd5PWlkKHh5LFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBlKHh5LHtudW1iZXI6TXAsQmlnTnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LmlzSW50KCl9LEZyYWN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5kJiZpc0Zpbml0ZSh0Lm4pfSwiQXJyYXkgfCBNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PmU9Pl95KGUsdCkpKX0pfSkpLGJ5PSJudW1iZXIsIG51bWJlciI7ZnVuY3Rpb24gRHkodCxlKXtyZXR1cm4gdCtlfWZ1bmN0aW9uIEV5KHQsZSl7cmV0dXJuIHQqZX1mdW5jdGlvbiBDeSh0LGUsbil7aWYobnVsbD09bilyZXR1cm4gdC5lcShlKTtpZih0LmVxKGUpKXJldHVybiEwO2lmKHQuaXNOYU4oKXx8ZS5pc05hTigpKXJldHVybiExO2lmKHQuaXNGaW5pdGUoKSYmZS5pc0Zpbml0ZSgpKXt2YXIgcj10Lm1pbnVzKGUpLmFicygpO2lmKHIuaXNaZXJvKCkpcmV0dXJuITA7dmFyIGk9dC5jb25zdHJ1Y3Rvci5tYXgodC5hYnMoKSxlLmFicygpKTtyZXR1cm4gci5sdGUoaS50aW1lcyhuKSl9cmV0dXJuITF9RHkuc2lnbmF0dXJlPWJ5LEV5LnNpZ25hdHVyZT1ieTt2YXIgU3k9aWQoImNvbXBhcmVVbml0cyIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJueyJVbml0LCBVbml0IjplLnJlZmVyVG9TZWxmKCh0PT4obixyKT0+e2lmKCFuLmVxdWFsQmFzZShyKSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjb21wYXJlIHVuaXRzIHdpdGggZGlmZmVyZW50IGJhc2UiKTtyZXR1cm4gZS5maW5kKHQsW24udmFsdWVUeXBlKCksci52YWx1ZVR5cGUoKV0pKG4udmFsdWUsci52YWx1ZSl9KSl9fSkpLEF5PSJlcXVhbFNjYWxhciIsTnk9aWQoQXksWyJ0eXBlZCIsImNvbmZpZyJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm59PXQscj1TeSh7dHlwZWQ6ZX0pO3JldHVybiBlKEF5LHsiYm9vbGVhbiwgYm9vbGVhbiI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV9LCJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4ga3AodCxlLG4uZXBzaWxvbil9LCJCaWdOdW1iZXIsIEJpZ051bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5lcShlKXx8Q3kodCxlLG4uZXBzaWxvbil9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZXF1YWxzKGUpfSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3JldHVybiBrcCh0LnJlLGUucmUsbikmJmtwKHQuaW0sZS5pbSxuKX0odCxlLG4uZXBzaWxvbil9fSxyKX0pKTtpZChBeSxbInR5cGVkIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bn09dDtyZXR1cm4gZShBeSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiBrcCh0LGUsbi5lcHNpbG9uKX19KX0pKTt2YXIgSXk9aWQoIlNwYXJzZU1hdHJpeCIsWyJ0eXBlZCIsImVxdWFsU2NhbGFyIiwiTWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpuLE1hdHJpeDpyfT10O2Z1bmN0aW9uIGkodCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO2lmKGUmJiFqZihlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZGF0YXR5cGU6ICIrZSk7aWYocWYodCkpIWZ1bmN0aW9uKHQsZSxuKXsiU3BhcnNlTWF0cml4Ij09PWUudHlwZT8odC5fdmFsdWVzPWUuX3ZhbHVlcz93cChlLl92YWx1ZXMpOnZvaWQgMCx0Ll9pbmRleD13cChlLl9pbmRleCksdC5fcHRyPXdwKGUuX3B0ciksdC5fc2l6ZT13cChlLl9zaXplKSx0Ll9kYXRhdHlwZT1ufHxlLl9kYXRhdHlwZSk6byh0LGUudmFsdWVPZigpLG58fGUuX2RhdGF0eXBlKX0odGhpcyx0LGUpO2Vsc2UgaWYodCYmVWYodC5pbmRleCkmJlVmKHQucHRyKSYmVWYodC5zaXplKSl0aGlzLl92YWx1ZXM9dC52YWx1ZXMsdGhpcy5faW5kZXg9dC5pbmRleCx0aGlzLl9wdHI9dC5wdHIsdGhpcy5fc2l6ZT10LnNpemUsdGhpcy5fZGF0YXR5cGU9ZXx8dC5kYXRhdHlwZTtlbHNlIGlmKFVmKHQpKW8odGhpcyx0LGUpO2Vsc2V7aWYodCl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbnN1cHBvcnRlZCB0eXBlIG9mIGRhdGEgKCIreHAodCkrIikiKTt0aGlzLl92YWx1ZXM9W10sdGhpcy5faW5kZXg9W10sdGhpcy5fcHRyPVswXSx0aGlzLl9zaXplPVswLDBdLHRoaXMuX2RhdGF0eXBlPWV9fWZ1bmN0aW9uIG8odCxyLGkpe3QuX3ZhbHVlcz1bXSx0Ll9pbmRleD1bXSx0Ll9wdHI9W10sdC5fZGF0YXR5cGU9aTt2YXIgbz1yLmxlbmd0aCxzPTAsYT1uLHU9MDtpZihqZihpKSYmKGE9ZS5maW5kKG4sW2ksaV0pfHxuLHU9ZS5jb252ZXJ0KDAsaSkpLG8+MCl7dmFyIGM9MDtkb3t0Ll9wdHIucHVzaCh0Ll9pbmRleC5sZW5ndGgpO2Zvcih2YXIgbD0wO2w8bztsKyspe3ZhciBoPXJbbF07aWYoVWYoaCkpe2lmKDA9PT1jJiZzPGgubGVuZ3RoJiYocz1oLmxlbmd0aCksYzxoLmxlbmd0aCl7dmFyIGY9aFtjXTthKGYsdSl8fCh0Ll92YWx1ZXMucHVzaChmKSx0Ll9pbmRleC5wdXNoKGwpKX19ZWxzZSAwPT09YyYmczwxJiYocz0xKSxhKGgsdSl8fCh0Ll92YWx1ZXMucHVzaChoKSx0Ll9pbmRleC5wdXNoKGwpKX1jKyt9d2hpbGUoYzxzKX10Ll9wdHIucHVzaCh0Ll9pbmRleC5sZW5ndGgpLHQuX3NpemU9W28sc119ZnVuY3Rpb24gcyh0LGUsbixyKXtpZihuLWU9PTApcmV0dXJuIG47Zm9yKHZhciBpPWU7aTxuO2krKylpZihyW2ldPT09dClyZXR1cm4gaTtyZXR1cm4gZX1mdW5jdGlvbiBhKHQsZSxuLHIsaSxvLHMpe2kuc3BsaWNlKHQsMCxyKSxvLnNwbGljZSh0LDAsZSk7Zm9yKHZhciBhPW4rMTthPHMubGVuZ3RoO2ErKylzW2FdKyt9ZnVuY3Rpb24gdSh0LHIsaSxvKXt2YXIgcz1vfHwwLGE9bix1PTA7amYodC5fZGF0YXR5cGUpJiYoYT1lLmZpbmQobixbdC5fZGF0YXR5cGUsdC5fZGF0YXR5cGVdKXx8bix1PWUuY29udmVydCgwLHQuX2RhdGF0eXBlKSxzPWUuY29udmVydChzLHQuX2RhdGF0eXBlKSk7dmFyIGMsbCxoLGY9IWEocyx1KSxwPXQuX3NpemVbMF0sZD10Ll9zaXplWzFdO2lmKGk+ZCl7Zm9yKGw9ZDtsPGk7bCsrKWlmKHQuX3B0cltsXT10Ll92YWx1ZXMubGVuZ3RoLGYpZm9yKGM9MDtjPHA7YysrKXQuX3ZhbHVlcy5wdXNoKHMpLHQuX2luZGV4LnB1c2goYyk7dC5fcHRyW2ldPXQuX3ZhbHVlcy5sZW5ndGh9ZWxzZSBpPGQmJih0Ll9wdHIuc3BsaWNlKGkrMSxkLWkpLHQuX3ZhbHVlcy5zcGxpY2UodC5fcHRyW2ldLHQuX3ZhbHVlcy5sZW5ndGgpLHQuX2luZGV4LnNwbGljZSh0Ll9wdHJbaV0sdC5faW5kZXgubGVuZ3RoKSk7aWYoZD1pLHI+cCl7aWYoZil7dmFyIGc9MDtmb3IobD0wO2w8ZDtsKyspe3QuX3B0cltsXT10Ll9wdHJbbF0rZyxoPXQuX3B0cltsKzFdK2c7dmFyIHk9MDtmb3IoYz1wO2M8cjtjKysseSsrKXQuX3ZhbHVlcy5zcGxpY2UoaCt5LDAscyksdC5faW5kZXguc3BsaWNlKGgreSwwLGMpLGcrK310Ll9wdHJbZF09dC5fdmFsdWVzLmxlbmd0aH19ZWxzZSBpZihyPHApe3ZhciBtPTA7Zm9yKGw9MDtsPGQ7bCsrKXt0Ll9wdHJbbF09dC5fcHRyW2xdLW07dmFyIHY9dC5fcHRyW2xdLF89dC5fcHRyW2wrMV0tbTtmb3IoaD12O2g8XztoKyspKGM9dC5faW5kZXhbaF0pPnItMSYmKHQuX3ZhbHVlcy5zcGxpY2UoaCwxKSx0Ll9pbmRleC5zcGxpY2UoaCwxKSxtKyspfXQuX3B0cltsXT10Ll92YWx1ZXMubGVuZ3RofXJldHVybiB0Ll9zaXplWzBdPXIsdC5fc2l6ZVsxXT1pLHR9ZnVuY3Rpb24gYyh0LGUsbixyLGkpe3ZhciBvLHMsYT1yWzBdLHU9clsxXSxjPVtdO2ZvcihvPTA7bzxhO28rKylmb3IoY1tvXT1bXSxzPTA7czx1O3MrKyljW29dW3NdPTA7Zm9yKHM9MDtzPHU7cysrKWZvcih2YXIgbD1uW3NdLGg9bltzKzFdLGY9bDtmPGg7ZisrKWNbbz1lW2ZdXVtzXT10P2k/d3AodFtmXSk6dFtmXToxO3JldHVybiBjfXJldHVybiBpLnByb3RvdHlwZT1uZXcgcixpLnByb3RvdHlwZS5jcmVhdGVTcGFyc2VNYXRyaXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGkodCxlKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGksIm5hbWUiLHt2YWx1ZToiU3BhcnNlTWF0cml4In0pLGkucHJvdG90eXBlLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUudHlwZT0iU3BhcnNlTWF0cml4IixpLnByb3RvdHlwZS5pc1NwYXJzZU1hdHJpeD0hMCxpLnByb3RvdHlwZS5nZXREYXRhVHlwZT1mdW5jdGlvbigpe3JldHVybiByZCh0aGlzLl92YWx1ZXMseHApfSxpLnByb3RvdHlwZS5zdG9yYWdlPWZ1bmN0aW9uKCl7cmV0dXJuInNwYXJzZSJ9LGkucHJvdG90eXBlLmRhdGF0eXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF0eXBlfSxpLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IGkodCxlKX0saS5wcm90b3R5cGUuZGVuc2l0eT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3NpemVbMF0sZT10aGlzLl9zaXplWzFdO3JldHVybiAwIT09dCYmMCE9PWU/dGhpcy5faW5kZXgubGVuZ3RoLyh0KmUpOjB9LGkucHJvdG90eXBlLnN1YnNldD1mdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuX3ZhbHVlcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc3Vic2V0IG9uIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoIVdmKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaW5kZXgiKTt2YXIgbj1lLmlzU2NhbGFyKCk7aWYobilyZXR1cm4gdC5nZXQoZS5taW4oKSk7dmFyIHI9ZS5zaXplKCk7aWYoci5sZW5ndGghPT10Ll9zaXplLmxlbmd0aCl0aHJvdyBuZXcgR3Aoci5sZW5ndGgsdC5fc2l6ZS5sZW5ndGgpO3ZhciBvLHMsYSx1LGM9ZS5taW4oKSxsPWUubWF4KCk7Zm9yKG89MCxzPXQuX3NpemUubGVuZ3RoO288cztvKyspWnAoY1tvXSx0Ll9zaXplW29dKSxacChsW29dLHQuX3NpemVbb10pO3ZhciBoPXQuX3ZhbHVlcyxmPXQuX2luZGV4LHA9dC5fcHRyLGQ9ZS5kaW1lbnNpb24oMCksZz1lLmRpbWVuc2lvbigxKSx5PVtdLG09W107ZC5mb3JFYWNoKChmdW5jdGlvbih0LGUpe21bdF09ZVswXSx5W3RdPSEwfSkpO3ZhciB2PWg/W106dm9pZCAwLF89W10seD1bXTtyZXR1cm4gZy5mb3JFYWNoKChmdW5jdGlvbih0KXtmb3IoeC5wdXNoKF8ubGVuZ3RoKSxhPXBbdF0sdT1wW3QrMV07YTx1O2ErKylvPWZbYV0sITA9PT15W29dJiYoXy5wdXNoKG1bb10pLHYmJnYucHVzaChoW2FdKSl9KSkseC5wdXNoKF8ubGVuZ3RoKSxuZXcgaSh7dmFsdWVzOnYsaW5kZXg6XyxwdHI6eCxzaXplOnIsZGF0YXR5cGU6dC5fZGF0YXR5cGV9KX0odGhpcyx0KTtjYXNlIDI6Y2FzZSAzOnJldHVybiBmdW5jdGlvbih0LGUsbixyKXtpZighZXx8ITAhPT1lLmlzSW5kZXgpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBpbmRleCIpO3ZhciBpLG89ZS5zaXplKCkscz1lLmlzU2NhbGFyKCk7aWYocWYobik/KGk9bi5zaXplKCksbj1uLnRvQXJyYXkoKSk6aT1YcChuKSxzKXtpZigwIT09aS5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiU2NhbGFyIGV4cGVjdGVkIik7dC5zZXQoZS5taW4oKSxuLHIpfWVsc2V7aWYoMSE9PW8ubGVuZ3RoJiYyIT09by5sZW5ndGgpdGhyb3cgbmV3IEdwKG8ubGVuZ3RoLHQuX3NpemUubGVuZ3RoLCI8Iik7aWYoaS5sZW5ndGg8by5sZW5ndGgpe2Zvcih2YXIgYT0wLHU9MDsxPT09b1thXSYmMT09PWlbYV07KWErKztmb3IoOzE9PT1vW2FdOyl1KyssYSsrO249ZWQobixvLmxlbmd0aCx1LGkpfWlmKCFicChvLGkpKXRocm93IG5ldyBHcChvLGksIj4iKTtpZigxPT09by5sZW5ndGgpe2UuZGltZW5zaW9uKDApLmZvckVhY2goKGZ1bmN0aW9uKGUsaSl7WnAoZSksdC5zZXQoW2UsMF0sbltpWzBdXSxyKX0pKX1lbHNle3ZhciBjPWUuZGltZW5zaW9uKDApLGw9ZS5kaW1lbnNpb24oMSk7Yy5mb3JFYWNoKChmdW5jdGlvbihlLGkpe1pwKGUpLGwuZm9yRWFjaCgoZnVuY3Rpb24obyxzKXtacChvKSx0LnNldChbZSxvXSxuW2lbMF1dW3NbMF1dLHIpfSkpfSkpfX1yZXR1cm4gdH0odGhpcyx0LGUsbik7ZGVmYXVsdDp0aHJvdyBuZXcgU3ludGF4RXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMiKX19LGkucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZighVWYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aCE9PXRoaXMuX3NpemUubGVuZ3RoKXRocm93IG5ldyBHcCh0Lmxlbmd0aCx0aGlzLl9zaXplLmxlbmd0aCk7aWYoIXRoaXMuX3ZhbHVlcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgZ2V0IG9uIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO3ZhciBlPXRbMF0sbj10WzFdO1pwKGUsdGhpcy5fc2l6ZVswXSksWnAobix0aGlzLl9zaXplWzFdKTt2YXIgcj1zKGUsdGhpcy5fcHRyW25dLHRoaXMuX3B0cltuKzFdLHRoaXMuX2luZGV4KTtyZXR1cm4gcjx0aGlzLl9wdHJbbisxXSYmdGhpcy5faW5kZXhbcl09PT1lP3RoaXMuX3ZhbHVlc1tyXTowfSxpLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxyLGkpe2lmKCFVZih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheSBleHBlY3RlZCIpO2lmKHQubGVuZ3RoIT09dGhpcy5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKHQubGVuZ3RoLHRoaXMuX3NpemUubGVuZ3RoKTtpZighdGhpcy5fdmFsdWVzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGludm9rZSBzZXQgb24gYSBQYXR0ZXJuIG9ubHkgbWF0cml4Iik7dmFyIG89dFswXSxjPXRbMV0sbD10aGlzLl9zaXplWzBdLGg9dGhpcy5fc2l6ZVsxXSxmPW4scD0wO2pmKHRoaXMuX2RhdGF0eXBlKSYmKGY9ZS5maW5kKG4sW3RoaXMuX2RhdGF0eXBlLHRoaXMuX2RhdGF0eXBlXSl8fG4scD1lLmNvbnZlcnQoMCx0aGlzLl9kYXRhdHlwZSkpLChvPmwtMXx8Yz5oLTEpJiYodSh0aGlzLE1hdGgubWF4KG8rMSxsKSxNYXRoLm1heChjKzEsaCksaSksbD10aGlzLl9zaXplWzBdLGg9dGhpcy5fc2l6ZVsxXSksWnAobyxsKSxacChjLGgpO3ZhciBkPXMobyx0aGlzLl9wdHJbY10sdGhpcy5fcHRyW2MrMV0sdGhpcy5faW5kZXgpO3JldHVybiBkPHRoaXMuX3B0cltjKzFdJiZ0aGlzLl9pbmRleFtkXT09PW8/ZihyLHApP2Z1bmN0aW9uKHQsZSxuLHIsaSl7bi5zcGxpY2UodCwxKSxyLnNwbGljZSh0LDEpO2Zvcih2YXIgbz1lKzE7bzxpLmxlbmd0aDtvKyspaVtvXS0tfShkLGMsdGhpcy5fdmFsdWVzLHRoaXMuX2luZGV4LHRoaXMuX3B0cik6dGhpcy5fdmFsdWVzW2RdPXI6ZihyLHApfHxhKGQsbyxjLHIsdGhpcy5fdmFsdWVzLHRoaXMuX2luZGV4LHRoaXMuX3B0ciksdGhpc30saS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKHQsZSxuKXtpZighVmYodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkgb3IgTWF0cml4IGV4cGVjdGVkIik7dmFyIHI9dC52YWx1ZU9mKCkubWFwKCh0PT5BcnJheS5pc0FycmF5KHQpJiYxPT09dC5sZW5ndGg/dFswXTp0KSk7aWYoMiE9PXIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiT25seSB0d28gZGltZW5zaW9ucyBtYXRyaXggYXJlIHN1cHBvcnRlZCIpO3JldHVybiByLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCFQZih0KXx8IU1wKHQpfHx0PDApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBzaXplLCBtdXN0IGNvbnRhaW4gcG9zaXRpdmUgaW50ZWdlcnMgKHNpemU6ICIrcXAocikrIikiKX0pKSx1KG4/dGhpcy5jbG9uZSgpOnRoaXMsclswXSxyWzFdLGUpfSxpLnByb3RvdHlwZS5yZXNoYXBlPWZ1bmN0aW9uKHQsZSl7aWYoIVVmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkIik7aWYoMiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU3BhcnNlIG1hdHJpY2VzIGNhbiBvbmx5IGJlIHJlc2hhcGVkIGluIHR3byBkaW1lbnNpb25zIik7dC5mb3JFYWNoKChmdW5jdGlvbihlKXtpZighUGYoZSl8fCFNcChlKXx8ZTw9LTJ8fDA9PT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgc2l6ZSwgbXVzdCBjb250YWluIHBvc2l0aXZlIGludGVnZXJzIG9yIC0xIChzaXplOiAiK3FwKHQpKyIpIil9KSk7dmFyIG49dGhpcy5fc2l6ZVswXSp0aGlzLl9zaXplWzFdO2lmKG4hPT0odD0kcCh0LG4pKVswXSp0WzFdKXRocm93IG5ldyBFcnJvcigiUmVzaGFwaW5nIHNwYXJzZSBtYXRyaXggd2lsbCByZXN1bHQgaW4gdGhlIHdyb25nIG51bWJlciBvZiBlbGVtZW50cyIpO3ZhciByPWU/dGhpcy5jbG9uZSgpOnRoaXM7aWYodGhpcy5fc2l6ZVswXT09PXRbMF0mJnRoaXMuX3NpemVbMV09PT10WzFdKXJldHVybiByO2Zvcih2YXIgaT1bXSxvPTA7bzxyLl9wdHIubGVuZ3RoO28rKylmb3IodmFyIHU9MDt1PHIuX3B0cltvKzFdLXIuX3B0cltvXTt1KyspaS5wdXNoKG8pO2Zvcih2YXIgYz1yLl92YWx1ZXMuc2xpY2UoKSxsPXIuX2luZGV4LnNsaWNlKCksaD0wO2g8ci5faW5kZXgubGVuZ3RoO2grKyl7dmFyIGY9bFtoXSxwPWlbaF0sZD1mKnIuX3NpemVbMV0rcDtpW2hdPWQldFsxXSxsW2hdPU1hdGguZmxvb3IoZC90WzFdKX1yLl92YWx1ZXMubGVuZ3RoPTAsci5faW5kZXgubGVuZ3RoPTAsci5fcHRyLmxlbmd0aD10WzFdKzEsci5fc2l6ZT10LnNsaWNlKCk7Zm9yKHZhciBnPTA7ZzxyLl9wdHIubGVuZ3RoO2crKylyLl9wdHJbZ109MDtmb3IodmFyIHk9MDt5PGMubGVuZ3RoO3krKyl7dmFyIG09bFt5XSx2PWlbeV0sXz1jW3ldO2EocyhtLHIuX3B0clt2XSxyLl9wdHJbdisxXSxyLl9pbmRleCksbSx2LF8sci5fdmFsdWVzLHIuX2luZGV4LHIuX3B0cil9cmV0dXJuIHJ9LGkucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpKHt2YWx1ZXM6dGhpcy5fdmFsdWVzP3dwKHRoaXMuX3ZhbHVlcyk6dm9pZCAwLGluZGV4OndwKHRoaXMuX2luZGV4KSxwdHI6d3AodGhpcy5fcHRyKSxzaXplOndwKHRoaXMuX3NpemUpLGRhdGF0eXBlOnRoaXMuX2RhdGF0eXBlfSl9LGkucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2l6ZS5zbGljZSgwKX0saS5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQscil7aWYoIXRoaXMuX3ZhbHVlcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgbWFwIG9uIGEgUGF0dGVybiBvbmx5IG1hdHJpeCIpO3ZhciBvPXRoaXMscz10aGlzLl9zaXplWzBdLGE9dGhpcy5fc2l6ZVsxXSx1PW15KHQpO3JldHVybiBmdW5jdGlvbih0LHIsbyxzLGEsdSxjKXt2YXIgbD1bXSxoPVtdLGY9W10scD1uLGQ9MDtqZih0Ll9kYXRhdHlwZSkmJihwPWUuZmluZChuLFt0Ll9kYXRhdHlwZSx0Ll9kYXRhdHlwZV0pfHxuLGQ9ZS5jb252ZXJ0KDAsdC5fZGF0YXR5cGUpKTtmb3IodmFyIGc9ZnVuY3Rpb24odCxlLG4pe3Q9dSh0LGUsbikscCh0LGQpfHwobC5wdXNoKHQpLGgucHVzaChlKSl9LHk9czt5PD1hO3krKyl7Zi5wdXNoKGwubGVuZ3RoKTt2YXIgbT10Ll9wdHJbeV0sdj10Ll9wdHJbeSsxXTtpZihjKWZvcih2YXIgXz1tO188djtfKyspe3ZhciB4PXQuX2luZGV4W19dO3g+PXImJng8PW8mJmcodC5fdmFsdWVzW19dLHgtcix5LXMpfWVsc2V7Zm9yKHZhciB3PXt9LGI9bTtiPHY7YisrKXt3W3QuX2luZGV4W2JdXT10Ll92YWx1ZXNbYl19Zm9yKHZhciBEPXI7RDw9bztEKyspe2coRCBpbiB3P3dbRF06MCxELXIseS1zKX19fXJldHVybiBmLnB1c2gobC5sZW5ndGgpLG5ldyBpKHt2YWx1ZXM6bCxpbmRleDpoLHB0cjpmLHNpemU6W28tcisxLGEtcysxXX0pfSh0aGlzLDAscy0xLDAsYS0xLChmdW5jdGlvbihlLG4scil7cmV0dXJuIDE9PT11P3QoZSk6Mj09PXU/dChlLFtuLHJdKTp0KGUsW24scl0sbyl9KSxyKX0saS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLl92YWx1ZXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIGZvckVhY2ggb24gYSBQYXR0ZXJuIG9ubHkgbWF0cml4Iik7Zm9yKHZhciBuPXRoaXMuX3NpemVbMF0scj10aGlzLl9zaXplWzFdLGk9MDtpPHI7aSsrKXt2YXIgbz10aGlzLl9wdHJbaV0scz10aGlzLl9wdHJbaSsxXTtpZihlKWZvcih2YXIgYT1vO2E8czthKyspe3ZhciB1PXRoaXMuX2luZGV4W2FdO3QodGhpcy5fdmFsdWVzW2FdLFt1LGldLHRoaXMpfWVsc2V7Zm9yKHZhciBjPXt9LGw9bztsPHM7bCsrKXtjW3RoaXMuX2luZGV4W2xdXT10aGlzLl92YWx1ZXNbbF19Zm9yKHZhciBoPTA7aDxuO2grKyl7dChoIGluIGM/Y1toXTowLFtoLGldLHRoaXMpfX19fSxpLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKigpe2lmKCF0aGlzLl92YWx1ZXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaXRlcmF0ZSBhIFBhdHRlcm4gb25seSBtYXRyaXgiKTtmb3IodmFyIHQ9dGhpcy5fc2l6ZVsxXSxlPTA7ZTx0O2UrKylmb3IodmFyIG49dGhpcy5fcHRyW2VdLHI9dGhpcy5fcHRyW2UrMV0saT1uO2k8cjtpKyspe3ZhciBvPXRoaXMuX2luZGV4W2ldO3lpZWxke3ZhbHVlOnRoaXMuX3ZhbHVlc1tpXSxpbmRleDpbbyxlXX19fSxpLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIGModGhpcy5fdmFsdWVzLHRoaXMuX2luZGV4LHRoaXMuX3B0cix0aGlzLl9zaXplLCEwKX0saS5wcm90b3R5cGUudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiBjKHRoaXMuX3ZhbHVlcyx0aGlzLl9pbmRleCx0aGlzLl9wdHIsdGhpcy5fc2l6ZSwhMSl9LGkucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fc2l6ZVswXSxuPXRoaXMuX3NpemVbMV0scj10aGlzLmRlbnNpdHkoKSxpPSJTcGFyc2UgTWF0cml4IFsiK3FwKGUsdCkrIiB4ICIrcXAobix0KSsiXSBkZW5zaXR5OiAiK3FwKHIsdCkrIlxuIixvPTA7bzxuO28rKylmb3IodmFyIHM9dGhpcy5fcHRyW29dLGE9dGhpcy5fcHRyW28rMV0sdT1zO3U8YTt1Kyspe2krPSJcbiAgICAoIitxcCh0aGlzLl9pbmRleFt1XSx0KSsiLCAiK3FwKG8sdCkrIikgPT0+ICIrKHRoaXMuX3ZhbHVlcz9xcCh0aGlzLl92YWx1ZXNbdV0sdCk6IlgiKX1yZXR1cm4gaX0saS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gcXAodGhpcy50b0FycmF5KCkpfSxpLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWF0aGpzOiJTcGFyc2VNYXRyaXgiLHZhbHVlczp0aGlzLl92YWx1ZXMsaW5kZXg6dGhpcy5faW5kZXgscHRyOnRoaXMuX3B0cixzaXplOnRoaXMuX3NpemUsZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9fSxpLnByb3RvdHlwZS5kaWFnb25hbD1mdW5jdGlvbih0KXtpZih0KXtpZihSZih0KSYmKHQ9dC50b051bWJlcigpKSwhUGYodCl8fCFNcCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFyYW1ldGVyIGsgbXVzdCBiZSBhbiBpbnRlZ2VyIG51bWJlciIpfWVsc2UgdD0wO3ZhciBlPXQ+MD90OjAsbj10PDA/LXQ6MCxyPXRoaXMuX3NpemVbMF0sbz10aGlzLl9zaXplWzFdLHM9TWF0aC5taW4oci1uLG8tZSksYT1bXSx1PVtdLGM9W107Y1swXT0wO2Zvcih2YXIgbD1lO2w8byYmYS5sZW5ndGg8cztsKyspZm9yKHZhciBoPXRoaXMuX3B0cltsXSxmPXRoaXMuX3B0cltsKzFdLHA9aDtwPGY7cCsrKXt2YXIgZD10aGlzLl9pbmRleFtwXTtpZihkPT09bC1lK24pe2EucHVzaCh0aGlzLl92YWx1ZXNbcF0pLHVbYS5sZW5ndGgtMV09ZC1uO2JyZWFrfX1yZXR1cm4gYy5wdXNoKGEubGVuZ3RoKSxuZXcgaSh7dmFsdWVzOmEsaW5kZXg6dSxwdHI6YyxzaXplOltzLDFdfSl9LGkuZnJvbUpTT049ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBpKHQpfSxpLmRpYWdvbmFsPWZ1bmN0aW9uKHQscixvLHMsYSl7aWYoIVVmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5IGV4cGVjdGVkLCBzaXplIHBhcmFtZXRlciIpO2lmKDIhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk9ubHkgdHdvIGRpbWVuc2lvbnMgbWF0cml4IGFyZSBzdXBwb3J0ZWQiKTtpZih0PXQubWFwKChmdW5jdGlvbih0KXtpZihSZih0KSYmKHQ9dC50b051bWJlcigpKSwhUGYodCl8fCFNcCh0KXx8dDwxKXRocm93IG5ldyBFcnJvcigiU2l6ZSB2YWx1ZXMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VycyIpO3JldHVybiB0fSkpLG8pe2lmKFJmKG8pJiYobz1vLnRvTnVtYmVyKCkpLCFQZihvKXx8IU1wKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXJhbWV0ZXIgayBtdXN0IGJlIGFuIGludGVnZXIgbnVtYmVyIil9ZWxzZSBvPTA7dmFyIHU9bixjPTA7amYoYSkmJih1PWUuZmluZChuLFthLGFdKXx8bixjPWUuY29udmVydCgwLGEpKTt2YXIgbCxoPW8+MD9vOjAsZj1vPDA/LW86MCxwPXRbMF0sZD10WzFdLGc9TWF0aC5taW4ocC1mLGQtaCk7aWYoVWYocikpe2lmKHIubGVuZ3RoIT09Zyl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdmFsdWUgYXJyYXkgbGVuZ3RoIik7bD1mdW5jdGlvbih0KXtyZXR1cm4gclt0XX19ZWxzZSBpZihxZihyKSl7dmFyIHk9ci5zaXplKCk7aWYoMSE9PXkubGVuZ3RofHx5WzBdIT09Zyl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbWF0cml4IGxlbmd0aCIpO2w9ZnVuY3Rpb24odCl7cmV0dXJuIHIuZ2V0KFt0XSl9fWVsc2UgbD1mdW5jdGlvbigpe3JldHVybiByfTtmb3IodmFyIG09W10sdj1bXSxfPVtdLHg9MDt4PGQ7eCsrKXtfLnB1c2gobS5sZW5ndGgpO3ZhciB3PXgtaDtpZih3Pj0wJiZ3PGcpe3ZhciBiPWwodyk7dShiLGMpfHwodi5wdXNoKHcrZiksbS5wdXNoKGIpKX19cmV0dXJuIF8ucHVzaChtLmxlbmd0aCksbmV3IGkoe3ZhbHVlczptLGluZGV4OnYscHRyOl8sc2l6ZTpbcCxkXX0pfSxpLnByb3RvdHlwZS5zd2FwUm93cz1mdW5jdGlvbih0LGUpe2lmKCEoUGYodCkmJk1wKHQpJiZQZihlKSYmTXAoZSkpKXRocm93IG5ldyBFcnJvcigiUm93IGluZGV4IG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKTtpZigyIT09dGhpcy5fc2l6ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJPbmx5IHR3byBkaW1lbnNpb25hbCBtYXRyaXggaXMgc3VwcG9ydGVkIik7cmV0dXJuIFpwKHQsdGhpcy5fc2l6ZVswXSksWnAoZSx0aGlzLl9zaXplWzBdKSxpLl9zd2FwUm93cyh0LGUsdGhpcy5fc2l6ZVsxXSx0aGlzLl92YWx1ZXMsdGhpcy5faW5kZXgsdGhpcy5fcHRyKSx0aGlzfSxpLl9mb3JFYWNoUm93PWZ1bmN0aW9uKHQsZSxuLHIsaSl7Zm9yKHZhciBvPXJbdF0scz1yW3QrMV0sYT1vO2E8czthKyspaShuW2FdLGVbYV0pfSxpLl9zd2FwUm93cz1mdW5jdGlvbih0LGUsbixyLGksbyl7Zm9yKHZhciBhPTA7YTxuO2ErKyl7dmFyIHU9b1thXSxjPW9bYSsxXSxsPXModCx1LGMsaSksaD1zKGUsdSxjLGkpO2lmKGw8YyYmaDxjJiZpW2xdPT09dCYmaVtoXT09PWUpe2lmKHIpe3ZhciBmPXJbbF07cltsXT1yW2hdLHJbaF09Zn19ZWxzZSBpZihsPGMmJmlbbF09PT10JiYoaD49Y3x8aVtoXSE9PWUpKXt2YXIgcD1yP3JbbF06dm9pZCAwO2kuc3BsaWNlKGgsMCxlKSxyJiZyLnNwbGljZShoLDAscCksaS5zcGxpY2UoaDw9bD9sKzE6bCwxKSxyJiZyLnNwbGljZShoPD1sP2wrMTpsLDEpfWVsc2UgaWYoaDxjJiZpW2hdPT09ZSYmKGw+PWN8fGlbbF0hPT10KSl7dmFyIGQ9cj9yW2hdOnZvaWQgMDtpLnNwbGljZShsLDAsdCksciYmci5zcGxpY2UobCwwLGQpLGkuc3BsaWNlKGw8PWg/aCsxOmgsMSksciYmci5zcGxpY2UobDw9aD9oKzE6aCwxKX19fSxpfSkse2lzQ2xhc3M6ITB9KTt2YXIgTXk9aWQoIm51bWJlciIsWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQsbj1lKCJudW1iZXIiLHsiIjpmdW5jdGlvbigpe3JldHVybiAwfSxudW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHN0cmluZzpmdW5jdGlvbih0KXtpZigiTmFOIj09PXQpcmV0dXJuIE5hTjt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZT10Lm1hdGNoKC8oMFtib3hdKShbMC05YS1mQS1GXSopXC4oWzAtOWEtZkEtRl0qKS8pO3JldHVybiBlP3tpbnB1dDp0LHJhZGl4OnsiMGIiOjIsIjBvIjo4LCIweCI6MTZ9W2VbMV1dLGludGVnZXJQYXJ0OmVbMl0sZnJhY3Rpb25hbFBhcnQ6ZVszXX06bnVsbH0odCk7aWYoZSlyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBlPXBhcnNlSW50KHQuaW50ZWdlclBhcnQsdC5yYWRpeCksbj0wLHI9MDtyPHQuZnJhY3Rpb25hbFBhcnQubGVuZ3RoO3IrKyluKz1wYXJzZUludCh0LmZyYWN0aW9uYWxQYXJ0W3JdLHQucmFkaXgpL01hdGgucG93KHQucmFkaXgscisxKTt2YXIgaT1lK247aWYoaXNOYU4oaSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCdTdHJpbmcgIicrdC5pbnB1dCsnIiBpcyBubyB2YWxpZCBudW1iZXInKTtyZXR1cm4gaX0oZSk7dmFyIG49MCxyPXQubWF0Y2goLygwW2JveF1bMC05YS1mQS1GXSopaShbMC05XSopLyk7ciYmKG49TnVtYmVyKHJbMl0pLHQ9clsxXSk7dmFyIGk9TnVtYmVyKHQpO2lmKGlzTmFOKGkpKXRocm93IG5ldyBTeW50YXhFcnJvcignU3RyaW5nICInK3QrJyIgaXMgbm8gdmFsaWQgbnVtYmVyJyk7aWYocil7aWYoaT5JZigyLG4pLTEpdGhyb3cgbmV3IFN5bnRheEVycm9yKCdTdHJpbmcgIicuY29uY2F0KHQsJyIgaXMgb3V0IG9mIHJhbmdlJykpO2k+PUlmKDIsbi0xKSYmKGktPUlmKDIsbikpfXJldHVybiBpfSxCaWdOdW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9OdW1iZXIoKX0sRnJhY3Rpb246ZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWVPZigpfSxVbml0OmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnt2YXIgbj1lLmNsb25lKCk7cmV0dXJuIG4udmFsdWU9dChlLnZhbHVlKSxufSkpLG51bGw6ZnVuY3Rpb24odCl7cmV0dXJuIDB9LCJVbml0LCBzdHJpbmcgfCBVbml0IjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvTnVtYmVyKGUpfSwiQXJyYXkgfCBNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PmU9Pl95KGUsdCkpKX0pO3JldHVybiBuLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUZsb2F0KHQudmFsdWUpfSxufSkpLEZ5PWlkKCJiaWdudW1iZXIiLFsidHlwZWQiLCJCaWdOdW1iZXIiXSwodD0+e3Zhcnt0eXBlZDplLEJpZ051bWJlcjpufT10O3JldHVybiBlKCJiaWdudW1iZXIiLHsiIjpmdW5jdGlvbigpe3JldHVybiBuZXcgbigwKX0sbnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbih0KyIiKX0sc3RyaW5nOmZ1bmN0aW9uKHQpe3ZhciBlPXQubWF0Y2goLygwW2JveF1bMC05YS1mQS1GXSopaShbMC05XSopLyk7aWYoZSl7dmFyIHI9ZVsyXSxpPW4oZVsxXSksbz1uZXcgbigyKS5wb3coTnVtYmVyKHIpKTtpZihpLmd0KG8uc3ViKDEpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N0cmluZyAiJy5jb25jYXQodCwnIiBpcyBvdXQgb2YgcmFuZ2UnKSk7dmFyIHM9bmV3IG4oMikucG93KE51bWJlcihyKS0xKTtyZXR1cm4gaS5ndGUocyk/aS5zdWIobyk6aX1yZXR1cm4gbmV3IG4odCl9LEJpZ051bWJlcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sVW5pdDplLnJlZmVyVG9TZWxmKCh0PT5lPT57dmFyIG49ZS5jbG9uZSgpO3JldHVybiBuLnZhbHVlPXQoZS52YWx1ZSksbn0pKSxGcmFjdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odC5uKS5kaXYodC5kKS50aW1lcyh0LnMpfSxudWxsOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbigwKX0sIkFycmF5IHwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT5lPT5feShlLHQpKSl9KX0pKSxUeT1pZCgiZnJhY3Rpb24iLFsidHlwZWQiLCJGcmFjdGlvbiJdLCh0PT57dmFye3R5cGVkOmUsRnJhY3Rpb246bn09dDtyZXR1cm4gZSgiZnJhY3Rpb24iLHtudW1iZXI6ZnVuY3Rpb24odCl7aWYoIWlzRmluaXRlKHQpfHxpc05hTih0KSl0aHJvdyBuZXcgRXJyb3IodCsiIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhcyBhIGZyYWN0aW9uIik7cmV0dXJuIG5ldyBuKHQpfSxzdHJpbmc6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQpfSwibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBuKHQsZSl9LG51bGw6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKDApfSxCaWdOdW1iZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKHQudG9TdHJpbmcoKSl9LEZyYWN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxVbml0OmUucmVmZXJUb1NlbGYoKHQ9PmU9Pnt2YXIgbj1lLmNsb25lKCk7cmV0dXJuIG4udmFsdWU9dChlLnZhbHVlKSxufSkpLE9iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG4odCl9LCJBcnJheSB8IE1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+ZT0+X3koZSx0KSkpfSl9KSksT3k9Im1hdHJpeCIsTHk9aWQoT3ksWyJ0eXBlZCIsIk1hdHJpeCIsIkRlbnNlTWF0cml4IiwiU3BhcnNlTWF0cml4Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxNYXRyaXg6bixEZW5zZU1hdHJpeDpyLFNwYXJzZU1hdHJpeDppfT10O3JldHVybiBlKE95LHsiIjpmdW5jdGlvbigpe3JldHVybiBvKFtdKX0sc3RyaW5nOmZ1bmN0aW9uKHQpe3JldHVybiBvKFtdLHQpfSwic3RyaW5nLCBzdHJpbmciOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8oW10sdCxlKX0sQXJyYXk6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCl9LE1hdHJpeDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LHQuc3RvcmFnZSgpKX0sIkFycmF5IHwgTWF0cml4LCBzdHJpbmciOm8sIkFycmF5IHwgTWF0cml4LCBzdHJpbmcsIHN0cmluZyI6b30pO2Z1bmN0aW9uIG8odCxlLG4pe2lmKCJkZW5zZSI9PT1lfHwiZGVmYXVsdCI9PT1lfHx2b2lkIDA9PT1lKXJldHVybiBuZXcgcih0LG4pO2lmKCJzcGFyc2UiPT09ZSlyZXR1cm4gbmV3IGkodCxuKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIG1hdHJpeCB0eXBlICIrSlNPTi5zdHJpbmdpZnkoZSkrIi4iKX19KSksUHk9ImFkZFNjYWxhciIsUnk9aWQoUHksWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGUoUHkseyJudW1iZXIsIG51bWJlciI6RHksIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYWRkKGUpfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucGx1cyhlKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5hZGQoZSl9LCJVbml0LCBVbml0IjplLnJlZmVyVG9TZWxmKCh0PT4obixyKT0+e2lmKG51bGw9PT1uLnZhbHVlfHx2b2lkIDA9PT1uLnZhbHVlKXRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVyIHggY29udGFpbnMgYSB1bml0IHdpdGggdW5kZWZpbmVkIHZhbHVlIik7aWYobnVsbD09PXIudmFsdWV8fHZvaWQgMD09PXIudmFsdWUpdGhyb3cgbmV3IEVycm9yKCJQYXJhbWV0ZXIgeSBjb250YWlucyBhIHVuaXQgd2l0aCB1bmRlZmluZWQgdmFsdWUiKTtpZighbi5lcXVhbEJhc2UocikpdGhyb3cgbmV3IEVycm9yKCJVbml0cyBkbyBub3QgbWF0Y2giKTt2YXIgaT1uLmNsb25lKCk7cmV0dXJuIGkudmFsdWU9ZS5maW5kKHQsW2kudmFsdWVUeXBlKCksci52YWx1ZVR5cGUoKV0pKGkudmFsdWUsci52YWx1ZSksaS5maXhQcmVmaXg9ITEsaX0pKX0pfSkpLEJ5PWlkKCJtYXRBbGdvMTF4UzBzIixbInR5cGVkIiwiZXF1YWxTY2FsYXIiXSwodD0+e3Zhcnt0eXBlZDplLGVxdWFsU2NhbGFyOm59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpLG8pe3ZhciBzPXQuX3ZhbHVlcyxhPXQuX2luZGV4LHU9dC5fcHRyLGM9dC5fc2l6ZSxsPXQuX2RhdGF0eXBlO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIG9uIFBhdHRlcm4gU3BhcnNlIE1hdHJpeCBhbmQgU2NhbGFyIHZhbHVlIik7dmFyIGgsZj1jWzBdLHA9Y1sxXSxkPW4sZz0wLHk9aTsic3RyaW5nIj09dHlwZW9mIGwmJihoPWwsZD1lLmZpbmQobixbaCxoXSksZz1lLmNvbnZlcnQoMCxoKSxyPWUuY29udmVydChyLGgpLHk9ZS5maW5kKGksW2gsaF0pKTtmb3IodmFyIG09W10sdj1bXSxfPVtdLHg9MDt4PHA7eCsrKXtfW3hdPXYubGVuZ3RoO2Zvcih2YXIgdz11W3hdLGI9dVt4KzFdLEQ9dztEPGI7RCsrKXt2YXIgRT1hW0RdLEM9bz95KHIsc1tEXSk6eShzW0RdLHIpO2QoQyxnKXx8KHYucHVzaChFKSxtLnB1c2goQykpfX1yZXR1cm4gX1twXT12Lmxlbmd0aCx0LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOm0saW5kZXg6dixwdHI6XyxzaXplOltmLHBdLGRhdGF0eXBlOmh9KX19KSksa3k9aWQoIm1hdEFsZ28xMnhTZnMiLFsidHlwZWQiLCJEZW5zZU1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsRGVuc2VNYXRyaXg6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGksbyl7dmFyIHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9zaXplLGw9dC5fZGF0YXR5cGU7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gb24gUGF0dGVybiBTcGFyc2UgTWF0cml4IGFuZCBTY2FsYXIgdmFsdWUiKTt2YXIgaCxmPWNbMF0scD1jWzFdLGQ9aTsic3RyaW5nIj09dHlwZW9mIGwmJihoPWwscj1lLmNvbnZlcnQocixoKSxkPWUuZmluZChpLFtoLGhdKSk7Zm9yKHZhciBnPVtdLHk9W10sbT1bXSx2PTA7djxwO3YrKyl7Zm9yKHZhciBfPXYrMSx4PXVbdl0sdz11W3YrMV0sYj14O2I8dztiKyspe3ZhciBEPWFbYl07eVtEXT1zW2JdLG1bRF09X31mb3IodmFyIEU9MDtFPGY7RSsrKTA9PT12JiYoZ1tFXT1bXSksbVtFXT09PV8/Z1tFXVt2XT1vP2Qocix5W0VdKTpkKHlbRV0scik6Z1tFXVt2XT1vP2QociwwKTpkKDAscil9cmV0dXJuIG5ldyBuKHtkYXRhOmcsc2l6ZTpbZixwXSxkYXRhdHlwZTpofSl9fSkpLHp5PWlkKCJtYXRBbGdvMTR4RHMiLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBmdW5jdGlvbih0LHIsaSxvKXt2YXIgcyxhPXQuX2RhdGEsdT10Ll9zaXplLGM9dC5fZGF0YXR5cGUsbD1pOyJzdHJpbmciPT10eXBlb2YgYyYmKHM9YyxyPWUuY29udmVydChyLHMpLGw9ZS5maW5kKGksW3Msc10pKTt2YXIgaD11Lmxlbmd0aD4wP24obCwwLHUsdVswXSxhLHIsbyk6W107cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6aCxzaXplOndwKHUpLGRhdGF0eXBlOnN9KX07ZnVuY3Rpb24gbih0LGUscixpLG8scyxhKXt2YXIgdT1bXTtpZihlPT09ci5sZW5ndGgtMSlmb3IodmFyIGM9MDtjPGk7YysrKXVbY109YT90KHMsb1tjXSk6dChvW2NdLHMpO2Vsc2UgZm9yKHZhciBsPTA7bDxpO2wrKyl1W2xdPW4odCxlKzEscixyW2UrMV0sb1tsXSxzLGEpO3JldHVybiB1fX0pKSxqeT1pZCgibWF0QWxnbzAxeERTaWQiLFsidHlwZWQiXSwodD0+e3Zhcnt0eXBlZDplfT10O3JldHVybiBmdW5jdGlvbih0LG4scixpKXt2YXIgbz10Ll9kYXRhLHM9dC5fc2l6ZSxhPXQuX2RhdGF0eXBlLHU9bi5fdmFsdWVzLGM9bi5faW5kZXgsbD1uLl9wdHIsaD1uLl9zaXplLGY9bi5fZGF0YXR5cGU7aWYocy5sZW5ndGghPT1oLmxlbmd0aCl0aHJvdyBuZXcgR3Aocy5sZW5ndGgsaC5sZW5ndGgpO2lmKHNbMF0hPT1oWzBdfHxzWzFdIT09aFsxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIitzKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIraCsiKSIpO2lmKCF1KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIG9uIERlbnNlIE1hdHJpeCBhbmQgUGF0dGVybiBTcGFyc2UgTWF0cml4Iik7dmFyIHAsZCxnPXNbMF0seT1zWzFdLG09InN0cmluZyI9PXR5cGVvZiBhJiZhPT09Zj9hOnZvaWQgMCx2PW0/ZS5maW5kKHIsW20sbV0pOnIsXz1bXTtmb3IocD0wO3A8ZztwKyspX1twXT1bXTt2YXIgeD1bXSx3PVtdO2ZvcihkPTA7ZDx5O2QrKyl7Zm9yKHZhciBiPWQrMSxEPWxbZF0sRT1sW2QrMV0sQz1EO0M8RTtDKyspeFtwPWNbQ11dPWk/dih1W0NdLG9bcF1bZF0pOnYob1twXVtkXSx1W0NdKSx3W3BdPWI7Zm9yKHA9MDtwPGc7cCsrKXdbcF09PT1iP19bcF1bZF09eFtwXTpfW3BdW2RdPW9bcF1bZF19cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6XyxzaXplOltnLHldLGRhdGF0eXBlOm19KX19KSksVXk9aWQoIm1hdEFsZ28wNHhTaWRTaWQiLFsidHlwZWQiLCJlcXVhbFNjYWxhciJdLCh0PT57dmFye3R5cGVkOmUsZXF1YWxTY2FsYXI6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGkpe3ZhciBvPXQuX3ZhbHVlcyxzPXQuX2luZGV4LGE9dC5fcHRyLHU9dC5fc2l6ZSxjPXQuX2RhdGF0eXBlLGw9ci5fdmFsdWVzLGg9ci5faW5kZXgsZj1yLl9wdHIscD1yLl9zaXplLGQ9ci5fZGF0YXR5cGU7aWYodS5sZW5ndGghPT1wLmxlbmd0aCl0aHJvdyBuZXcgR3AodS5sZW5ndGgscC5sZW5ndGgpO2lmKHVbMF0hPT1wWzBdfHx1WzFdIT09cFsxXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIit1KyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIrcCsiKSIpO3ZhciBnLHk9dVswXSxtPXVbMV0sdj1uLF89MCx4PWk7InN0cmluZyI9PXR5cGVvZiBjJiZjPT09ZCYmKGc9Yyx2PWUuZmluZChuLFtnLGddKSxfPWUuY29udmVydCgwLGcpLHg9ZS5maW5kKGksW2csZ10pKTt2YXIgdyxiLEQsRSxDLFM9byYmbD9bXTp2b2lkIDAsQT1bXSxOPVtdLEk9byYmbD9bXTp2b2lkIDAsTT1vJiZsP1tdOnZvaWQgMCxGPVtdLFQ9W107Zm9yKGI9MDtiPG07YisrKXtOW2JdPUEubGVuZ3RoO3ZhciBPPWIrMTtmb3IoRT1hW2JdLEM9YVtiKzFdLEQ9RTtEPEM7RCsrKXc9c1tEXSxBLnB1c2godyksRlt3XT1PLEkmJihJW3ddPW9bRF0pO2ZvcihFPWZbYl0sQz1mW2IrMV0sRD1FO0Q8QztEKyspaWYoRlt3PWhbRF1dPT09Tyl7aWYoSSl7dmFyIEw9eChJW3ddLGxbRF0pO3YoTCxfKT9GW3ddPW51bGw6SVt3XT1MfX1lbHNlIEEucHVzaCh3KSxUW3ddPU8sTSYmKE1bd109bFtEXSk7aWYoSSYmTSlmb3IoRD1OW2JdO0Q8QS5sZW5ndGg7KUZbdz1BW0RdXT09PU8/KFNbRF09SVt3XSxEKyspOlRbd109PT1PPyhTW0RdPU1bd10sRCsrKTpBLnNwbGljZShELDEpfXJldHVybiBOW21dPUEubGVuZ3RoLHQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6UyxpbmRleDpBLHB0cjpOLHNpemU6W3ksbV0sZGF0YXR5cGU6Z30pfX0pKSxxeT1pZCgibWF0QWxnbzEweFNpZHMiLFsidHlwZWQiLCJEZW5zZU1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsRGVuc2VNYXRyaXg6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGksbyl7dmFyIHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9zaXplLGw9dC5fZGF0YXR5cGU7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gb24gUGF0dGVybiBTcGFyc2UgTWF0cml4IGFuZCBTY2FsYXIgdmFsdWUiKTt2YXIgaCxmPWNbMF0scD1jWzFdLGQ9aTsic3RyaW5nIj09dHlwZW9mIGwmJihoPWwscj1lLmNvbnZlcnQocixoKSxkPWUuZmluZChpLFtoLGhdKSk7Zm9yKHZhciBnPVtdLHk9W10sbT1bXSx2PTA7djxwO3YrKyl7Zm9yKHZhciBfPXYrMSx4PXVbdl0sdz11W3YrMV0sYj14O2I8dztiKyspe3ZhciBEPWFbYl07eVtEXT1zW2JdLG1bRF09X31mb3IodmFyIEU9MDtFPGY7RSsrKTA9PT12JiYoZ1tFXT1bXSksbVtFXT09PV8/Z1tFXVt2XT1vP2Qocix5W0VdKTpkKHlbRV0scik6Z1tFXVt2XT1yfXJldHVybiBuZXcgbih7ZGF0YTpnLHNpemU6W2YscF0sZGF0YXR5cGU6aH0pfX0pKSxWeT1pZCgibWF0QWxnbzEzeEREIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZnVuY3Rpb24odCxyLGkpe3ZhciBvPXQuX2RhdGEscz10Ll9zaXplLGE9dC5fZGF0YXR5cGUsdT1yLl9kYXRhLGM9ci5fc2l6ZSxsPXIuX2RhdGF0eXBlLGg9W107aWYocy5sZW5ndGghPT1jLmxlbmd0aCl0aHJvdyBuZXcgR3Aocy5sZW5ndGgsYy5sZW5ndGgpO2Zvcih2YXIgZj0wO2Y8cy5sZW5ndGg7ZisrKXtpZihzW2ZdIT09Y1tmXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRGltZW5zaW9uIG1pc21hdGNoLiBNYXRyaXggQSAoIitzKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgKCIrYysiKSIpO2hbZl09c1tmXX12YXIgcCxkPWk7InN0cmluZyI9PXR5cGVvZiBhJiZhPT09bCYmKHA9YSxkPWUuZmluZChpLFtwLHBdKSk7dmFyIGc9aC5sZW5ndGg+MD9uKGQsMCxoLGhbMF0sbyx1KTpbXTtyZXR1cm4gdC5jcmVhdGVEZW5zZU1hdHJpeCh7ZGF0YTpnLHNpemU6aCxkYXRhdHlwZTpwfSl9O2Z1bmN0aW9uIG4odCxlLHIsaSxvLHMpe3ZhciBhPVtdO2lmKGU9PT1yLmxlbmd0aC0xKWZvcih2YXIgdT0wO3U8aTt1KyspYVt1XT10KG9bdV0sc1t1XSk7ZWxzZSBmb3IodmFyIGM9MDtjPGk7YysrKWFbY109bih0LGUrMSxyLHJbZSsxXSxvW2NdLHNbY10pO3JldHVybiBhfX0pKSxHeT1pZCgiYnJvYWRjYXN0IixbImNvbmNhdCJdLCh0PT57dmFye2NvbmNhdDplfT10O3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBvPU1hdGgubWF4KHQuX3NpemUubGVuZ3RoLGUuX3NpemUubGVuZ3RoKTtpZih0Ll9zaXplLmxlbmd0aD09PWUuX3NpemUubGVuZ3RoJiZ0Ll9zaXplLmV2ZXJ5KCgodCxuKT0+dD09PWUuX3NpemVbbl0pKSlyZXR1cm5bdCxlXTtmb3IodmFyIHM9bih0Ll9zaXplLG8sMCksYT1uKGUuX3NpemUsbywwKSx1PVtdLGM9MDtjPG87YysrKXVbY109TWF0aC5tYXgoc1tjXSxhW2NdKTtmb3IodmFyIGw9MDtsPG87bCsrKWkocyx1LGwpLGkoYSx1LGwpO3ZhciBoPXQuY2xvbmUoKSxmPWUuY2xvbmUoKTtoLl9zaXplLmxlbmd0aDxvP2gucmVzaGFwZShuKGguX3NpemUsbywxKSk6Zi5fc2l6ZS5sZW5ndGg8byYmZi5yZXNoYXBlKG4oZi5fc2l6ZSxvLDEpKTtmb3IodmFyIHA9MDtwPG87cCsrKWguX3NpemVbcF08dVtwXSYmKGg9cihoLHVbcF0scCkpLGYuX3NpemVbcF08dVtwXSYmKGY9cihmLHVbcF0scCkpO3JldHVybltoLGZdfTtmdW5jdGlvbiBuKHQsZSxuKXtyZXR1cm5bLi4uQXJyYXkoZS10Lmxlbmd0aCkuZmlsbChuKSwuLi50XX1mdW5jdGlvbiByKHQsbixyKXtyZXR1cm4gZSguLi5BcnJheShuKS5maWxsKHQpLHIpfWZ1bmN0aW9uIGkodCxlLG4pe2lmKHRbbl08ZVtuXSZ0W25dPjEpdGhyb3cgbmV3IEVycm9yKCJzaGFwZSBtaXNzbWF0Y2g6IG1pc3NtYXRjaCBpcyBmb3VuZCBpbiBhcmcgd2l0aCBzaGFwZSAoIi5jb25jYXQodCwiKSBub3QgcG9zc2libGUgdG8gYnJvYWRjYXN0IGRpbWVuc2lvbiAiKS5jb25jYXQobiwiIHdpdGggc2l6ZSAiKS5jb25jYXQodFtuXSwiIHRvIHNpemUgIikuY29uY2F0KGVbbl0pKX19KSksWXk9aWQoIm1hdHJpeEFsZ29yaXRobVN1aXRlIixbInR5cGVkIiwibWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixjb25jYXQ6cn09dCxpPVZ5KHt0eXBlZDplfSksbz16eSh7dHlwZWQ6ZX0pLHM9R3koe2NvbmNhdDpyfSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByLGE9dC5lbG9wLHU9dC5TRHx8dC5EUzthPyhyPXsiRGVuc2VNYXRyaXgsIERlbnNlTWF0cml4IjoodCxlKT0+aSguLi5zKHQsZSksYSksIkFycmF5LCBBcnJheSI6KHQsZSk9PmkoLi4ucyhuKHQpLG4oZSkpLGEpLnZhbHVlT2YoKSwiQXJyYXksIERlbnNlTWF0cml4IjoodCxlKT0+aSguLi5zKG4odCksZSksYSksIkRlbnNlTWF0cml4LCBBcnJheSI6KHQsZSk9PmkoLi4ucyh0LG4oZSkpLGEpfSx0LlNTJiYoclsiU3BhcnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiXT0oZSxuKT0+dC5TUyguLi5zKGUsbiksYSwhMSkpLHQuRFMmJihyWyJEZW5zZU1hdHJpeCwgU3BhcnNlTWF0cml4Il09KGUsbik9PnQuRFMoLi4ucyhlLG4pLGEsITEpLHJbIkFycmF5LCBTcGFyc2VNYXRyaXgiXT0oZSxyKT0+dC5EUyguLi5zKG4oZSksciksYSwhMSkpLHUmJihyWyJTcGFyc2VNYXRyaXgsIERlbnNlTWF0cml4Il09KHQsZSk9PnUoLi4ucyhlLHQpLGEsITApLHJbIlNwYXJzZU1hdHJpeCwgQXJyYXkiXT0odCxlKT0+dSguLi5zKG4oZSksdCksYSwhMCkpKToocj17IkRlbnNlTWF0cml4LCBEZW5zZU1hdHJpeCI6ZS5yZWZlclRvU2VsZigodD0+KGUsbik9PmkoLi4ucyhlLG4pLHQpKSksIkFycmF5LCBBcnJheSI6ZS5yZWZlclRvU2VsZigodD0+KGUscik9PmkoLi4ucyhuKGUpLG4ocikpLHQpLnZhbHVlT2YoKSkpLCJBcnJheSwgRGVuc2VNYXRyaXgiOmUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT5pKC4uLnMobihlKSxyKSx0KSkpLCJEZW5zZU1hdHJpeCwgQXJyYXkiOmUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT5pKC4uLnMoZSxuKHIpKSx0KSkpfSx0LlNTJiYoclsiU3BhcnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiXT1lLnJlZmVyVG9TZWxmKChlPT4obixyKT0+dC5TUyguLi5zKG4sciksZSwhMSkpKSksdC5EUyYmKHJbIkRlbnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiXT1lLnJlZmVyVG9TZWxmKChlPT4obixyKT0+dC5EUyguLi5zKG4sciksZSwhMSkpKSxyWyJBcnJheSwgU3BhcnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigoZT0+KHIsaSk9PnQuRFMoLi4ucyhuKHIpLGkpLGUsITEpKSkpLHUmJihyWyJTcGFyc2VNYXRyaXgsIERlbnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigodD0+KGUsbik9PnUoLi4ucyhuLGUpLHQsITApKSksclsiU3BhcnNlTWF0cml4LCBBcnJheSJdPWUucmVmZXJUb1NlbGYoKHQ9PihlLHIpPT51KC4uLnMobihyKSxlKSx0LCEwKSkpKSk7dmFyIGM9dC5zY2FsYXJ8fCJhbnkiOyh0LkRzfHx0LlNzKSYmKGE/KHJbIkRlbnNlTWF0cml4LCIrY109KHQsZSk9Pm8odCxlLGEsITEpLHJbYysiLCBEZW5zZU1hdHJpeCJdPSh0LGUpPT5vKGUsdCxhLCEwKSxyWyJBcnJheSwiK2NdPSh0LGUpPT5vKG4odCksZSxhLCExKS52YWx1ZU9mKCkscltjKyIsIEFycmF5Il09KHQsZSk9Pm8obihlKSx0LGEsITApLnZhbHVlT2YoKSk6KHJbIkRlbnNlTWF0cml4LCIrY109ZS5yZWZlclRvU2VsZigodD0+KGUsbik9Pm8oZSxuLHQsITEpKSkscltjKyIsIERlbnNlTWF0cml4Il09ZS5yZWZlclRvU2VsZigodD0+KGUsbik9Pm8obixlLHQsITApKSksclsiQXJyYXksIitjXT1lLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+byhuKGUpLHIsdCwhMSkudmFsdWVPZigpKSkscltjKyIsIEFycmF5Il09ZS5yZWZlclRvU2VsZigodD0+KGUscik9Pm8obihyKSxlLHQsITApLnZhbHVlT2YoKSkpKSk7dmFyIGw9dm9pZCAwIT09dC5zUz90LnNTOnQuU3M7cmV0dXJuIGE/KHQuU3MmJihyWyJTcGFyc2VNYXRyaXgsIitjXT0oZSxuKT0+dC5TcyhlLG4sYSwhMSkpLGwmJihyW2MrIiwgU3BhcnNlTWF0cml4Il09KHQsZSk9PmwoZSx0LGEsITApKSk6KHQuU3MmJihyWyJTcGFyc2VNYXRyaXgsIitjXT1lLnJlZmVyVG9TZWxmKChlPT4obixyKT0+dC5TcyhuLHIsZSwhMSkpKSksbCYmKHJbYysiLCBTcGFyc2VNYXRyaXgiXT1lLnJlZmVyVG9TZWxmKCh0PT4oZSxuKT0+bChuLGUsdCwhMCkpKSkpLGEmJmEuc2lnbmF0dXJlcyYmZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSlEcChlLG4pJiYodFtuXT1lW25dKX0ocixhLnNpZ25hdHVyZXMpLHJ9fSkpLFh5PWlkKCJtYXRBbGdvMDJ4RFMwIixbInR5cGVkIiwiZXF1YWxTY2FsYXIiXSwodD0+e3Zhcnt0eXBlZDplLGVxdWFsU2NhbGFyOm59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpLG8pe3ZhciBzPXQuX2RhdGEsYT10Ll9zaXplLHU9dC5fZGF0YXR5cGUsYz1yLl92YWx1ZXMsbD1yLl9pbmRleCxoPXIuX3B0cixmPXIuX3NpemUscD1yLl9kYXRhdHlwZTtpZihhLmxlbmd0aCE9PWYubGVuZ3RoKXRocm93IG5ldyBHcChhLmxlbmd0aCxmLmxlbmd0aCk7aWYoYVswXSE9PWZbMF18fGFbMV0hPT1mWzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2guIE1hdHJpeCBBICgiK2ErIikgbXVzdCBtYXRjaCBNYXRyaXggQiAoIitmKyIpIik7aWYoIWMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gb24gRGVuc2UgTWF0cml4IGFuZCBQYXR0ZXJuIFNwYXJzZSBNYXRyaXgiKTt2YXIgZCxnPWFbMF0seT1hWzFdLG09bix2PTAsXz1pOyJzdHJpbmciPT10eXBlb2YgdSYmdT09PXAmJihkPXUsbT1lLmZpbmQobixbZCxkXSksdj1lLmNvbnZlcnQoMCxkKSxfPWUuZmluZChpLFtkLGRdKSk7Zm9yKHZhciB4PVtdLHc9W10sYj1bXSxEPTA7RDx5O0QrKyl7YltEXT13Lmxlbmd0aDtmb3IodmFyIEU9aFtEXSxDPWhbRCsxXSxTPUU7UzxDO1MrKyl7dmFyIEE9bFtTXSxOPW8/XyhjW1NdLHNbQV1bRF0pOl8oc1tBXVtEXSxjW1NdKTttKE4sdil8fCh3LnB1c2goQSkseC5wdXNoKE4pKX19cmV0dXJuIGJbeV09dy5sZW5ndGgsci5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczp4LGluZGV4OncscHRyOmIsc2l6ZTpbZyx5XSxkYXRhdHlwZTpkfSl9fSkpLFd5PWlkKCJtYXRBbGdvMDN4RFNmIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZnVuY3Rpb24odCxuLHIsaSl7dmFyIG89dC5fZGF0YSxzPXQuX3NpemUsYT10Ll9kYXRhdHlwZSx1PW4uX3ZhbHVlcyxjPW4uX2luZGV4LGw9bi5fcHRyLGg9bi5fc2l6ZSxmPW4uX2RhdGF0eXBlO2lmKHMubGVuZ3RoIT09aC5sZW5ndGgpdGhyb3cgbmV3IEdwKHMubGVuZ3RoLGgubGVuZ3RoKTtpZihzWzBdIT09aFswXXx8c1sxXSE9PWhbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrcysiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK2grIikiKTtpZighdSl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBvbiBEZW5zZSBNYXRyaXggYW5kIFBhdHRlcm4gU3BhcnNlIE1hdHJpeCIpO3ZhciBwLGQ9c1swXSxnPXNbMV0seT0wLG09cjsic3RyaW5nIj09dHlwZW9mIGEmJmE9PT1mJiYocD1hLHk9ZS5jb252ZXJ0KDAscCksbT1lLmZpbmQocixbcCxwXSkpO2Zvcih2YXIgdj1bXSxfPTA7XzxkO18rKyl2W19dPVtdO2Zvcih2YXIgeD1bXSx3PVtdLGI9MDtiPGc7YisrKXtmb3IodmFyIEQ9YisxLEU9bFtiXSxDPWxbYisxXSxTPUU7UzxDO1MrKyl7dmFyIEE9Y1tTXTt4W0FdPWk/bSh1W1NdLG9bQV1bYl0pOm0ob1tBXVtiXSx1W1NdKSx3W0FdPUR9Zm9yKHZhciBOPTA7TjxkO04rKyl3W05dPT09RD92W05dW2JdPXhbTl06dltOXVtiXT1pP20oeSxvW05dW2JdKTptKG9bTl1bYl0seSl9cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6dixzaXplOltkLGddLGRhdGF0eXBlOnB9KX19KSksSHk9aWQoIm11bHRpcGx5U2NhbGFyIixbInR5cGVkIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZX09dDtyZXR1cm4gZSgibXVsdGlwbHlTY2FsYXIiLHsibnVtYmVyLCBudW1iZXIiOkV5LCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lm11bChlKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRpbWVzKGUpfSwiRnJhY3Rpb24sIEZyYWN0aW9uIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lm11bChlKX0sIm51bWJlciB8IEZyYWN0aW9uIHwgQmlnTnVtYmVyIHwgQ29tcGxleCwgVW5pdCI6KHQsZSk9PmUubXVsdGlwbHkodCksIlVuaXQsIG51bWJlciB8IEZyYWN0aW9uIHwgQmlnTnVtYmVyIHwgQ29tcGxleCB8IFVuaXQiOih0LGUpPT50Lm11bHRpcGx5KGUpfSl9KSksWnk9Im11bHRpcGx5IixLeT1pZChaeSxbInR5cGVkIiwibWF0cml4IiwiYWRkU2NhbGFyIiwibXVsdGlwbHlTY2FsYXIiLCJlcXVhbFNjYWxhciIsImRvdCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4sYWRkU2NhbGFyOnIsbXVsdGlwbHlTY2FsYXI6aSxlcXVhbFNjYWxhcjpvLGRvdDpzfT10LGE9Qnkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6b30pLHU9enkoe3R5cGVkOmV9KTtmdW5jdGlvbiBjKHQsZSl7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDE6aWYodFswXSE9PWVbMF0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaCBpbiBtdWx0aXBsaWNhdGlvbi4gVmVjdG9ycyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIik7YnJlYWs7Y2FzZSAyOmlmKHRbMF0hPT1lWzBdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2ggaW4gbXVsdGlwbGljYXRpb24uIFZlY3RvciBsZW5ndGggKCIrdFswXSsiKSBtdXN0IG1hdGNoIE1hdHJpeCByb3dzICgiK2VbMF0rIikiKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiQ2FuIG9ubHkgbXVsdGlwbHkgYSAxIG9yIDIgZGltZW5zaW9uYWwgbWF0cml4IChNYXRyaXggQiBoYXMgIitlLmxlbmd0aCsiIGRpbWVuc2lvbnMpIil9YnJlYWs7Y2FzZSAyOnN3aXRjaChlLmxlbmd0aCl7Y2FzZSAxOmlmKHRbMV0hPT1lWzBdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2ggaW4gbXVsdGlwbGljYXRpb24uIE1hdHJpeCBjb2x1bW5zICgiK3RbMV0rIikgbXVzdCBtYXRjaCBWZWN0b3IgbGVuZ3RoICgiK2VbMF0rIikiKTticmVhaztjYXNlIDI6aWYodFsxXSE9PWVbMF0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaCBpbiBtdWx0aXBsaWNhdGlvbi4gTWF0cml4IEEgY29sdW1ucyAoIit0WzFdKyIpIG11c3QgbWF0Y2ggTWF0cml4IEIgcm93cyAoIitlWzBdKyIpIik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkNhbiBvbmx5IG11bHRpcGx5IGEgMSBvciAyIGRpbWVuc2lvbmFsIG1hdHJpeCAoTWF0cml4IEIgaGFzICIrZS5sZW5ndGgrIiBkaW1lbnNpb25zKSIpfWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJDYW4gb25seSBtdWx0aXBseSBhIDEgb3IgMiBkaW1lbnNpb25hbCBtYXRyaXggKE1hdHJpeCBBIGhhcyAiK3QubGVuZ3RoKyIgZGltZW5zaW9ucykiKX19ZnVuY3Rpb24gbCh0LG4pe2lmKCJkZW5zZSIhPT1uLnN0b3JhZ2UoKSl0aHJvdyBuZXcgRXJyb3IoIlN1cHBvcnQgZm9yIFNwYXJzZU1hdHJpeCBub3QgaW1wbGVtZW50ZWQiKTtyZXR1cm4gZnVuY3Rpb24odCxuKXt2YXIgbyxzPXQuX2RhdGEsYT10Ll9zaXplLHU9dC5fZGF0YXR5cGUsYz1uLl9kYXRhLGw9bi5fc2l6ZSxoPW4uX2RhdGF0eXBlLGY9YVswXSxwPWxbMV0sZD1yLGc9aTt1JiZoJiZ1PT09aCYmInN0cmluZyI9PXR5cGVvZiB1JiYobz11LGQ9ZS5maW5kKHIsW28sb10pLGc9ZS5maW5kKGksW28sb10pKTtmb3IodmFyIHk9W10sbT0wO208cDttKyspe2Zvcih2YXIgdj1nKHNbMF0sY1swXVttXSksXz0xO188ZjtfKyspdj1kKHYsZyhzW19dLGNbX11bbV0pKTt5W21dPXZ9cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6eSxzaXplOltwXSxkYXRhdHlwZTpvfSl9KHQsbil9dmFyIGg9ZSgiX211bHRpcGx5TWF0cml4VmVjdG9yIix7IkRlbnNlTWF0cml4LCBhbnkiOmZ1bmN0aW9uKHQsbil7dmFyIG8scz10Ll9kYXRhLGE9dC5fc2l6ZSx1PXQuX2RhdGF0eXBlLGM9bi5fZGF0YSxsPW4uX2RhdGF0eXBlLGg9YVswXSxmPWFbMV0scD1yLGQ9aTt1JiZsJiZ1PT09bCYmInN0cmluZyI9PXR5cGVvZiB1JiYobz11LHA9ZS5maW5kKHIsW28sb10pLGQ9ZS5maW5kKGksW28sb10pKTtmb3IodmFyIGc9W10seT0wO3k8aDt5Kyspe2Zvcih2YXIgbT1zW3ldLHY9ZChtWzBdLGNbMF0pLF89MTtfPGY7XysrKXY9cCh2LGQobVtfXSxjW19dKSk7Z1t5XT12fXJldHVybiB0LmNyZWF0ZURlbnNlTWF0cml4KHtkYXRhOmcsc2l6ZTpbaF0sZGF0YXR5cGU6b30pfSwiU3BhcnNlTWF0cml4LCBhbnkiOmZ1bmN0aW9uKHQsbil7dmFyIHM9dC5fdmFsdWVzLGE9dC5faW5kZXgsdT10Ll9wdHIsYz10Ll9kYXRhdHlwZTtpZighcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBtdWx0aXBseSBQYXR0ZXJuIG9ubHkgTWF0cml4IHRpbWVzIERlbnNlIE1hdHJpeCIpO3ZhciBsLGg9bi5fZGF0YSxmPW4uX2RhdGF0eXBlLHA9dC5fc2l6ZVswXSxkPW4uX3NpemVbMF0sZz1bXSx5PVtdLG09W10sdj1yLF89aSx4PW8sdz0wO2MmJmYmJmM9PT1mJiYic3RyaW5nIj09dHlwZW9mIGMmJihsPWMsdj1lLmZpbmQocixbbCxsXSksXz1lLmZpbmQoaSxbbCxsXSkseD1lLmZpbmQobyxbbCxsXSksdz1lLmNvbnZlcnQoMCxsKSk7dmFyIGI9W10sRD1bXTttWzBdPTA7Zm9yKHZhciBFPTA7RTxkO0UrKyl7dmFyIEM9aFtFXTtpZigheChDLHcpKWZvcih2YXIgUz11W0VdLEE9dVtFKzFdLE49UztOPEE7TisrKXt2YXIgST1hW05dO0RbSV0/YltJXT12KGJbSV0sXyhDLHNbTl0pKTooRFtJXT0hMCx5LnB1c2goSSksYltJXT1fKEMsc1tOXSkpfX1mb3IodmFyIE09eS5sZW5ndGgsRj0wO0Y8TTtGKyspe3ZhciBUPXlbRl07Z1tGXT1iW1RdfXJldHVybiBtWzFdPXkubGVuZ3RoLHQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6ZyxpbmRleDp5LHB0cjptLHNpemU6W3AsMV0sZGF0YXR5cGU6bH0pfX0pLGY9ZSgiX211bHRpcGx5TWF0cml4TWF0cml4Iix7IkRlbnNlTWF0cml4LCBEZW5zZU1hdHJpeCI6ZnVuY3Rpb24odCxuKXt2YXIgbyxzPXQuX2RhdGEsYT10Ll9zaXplLHU9dC5fZGF0YXR5cGUsYz1uLl9kYXRhLGw9bi5fc2l6ZSxoPW4uX2RhdGF0eXBlLGY9YVswXSxwPWFbMV0sZD1sWzFdLGc9cix5PWk7dSYmaCYmdT09PWgmJiJzdHJpbmciPT10eXBlb2YgdSYmKG89dSxnPWUuZmluZChyLFtvLG9dKSx5PWUuZmluZChpLFtvLG9dKSk7Zm9yKHZhciBtPVtdLHY9MDt2PGY7disrKXt2YXIgXz1zW3ZdO21bdl09W107Zm9yKHZhciB4PTA7eDxkO3grKyl7Zm9yKHZhciB3PXkoX1swXSxjWzBdW3hdKSxiPTE7YjxwO2IrKyl3PWcodyx5KF9bYl0sY1tiXVt4XSkpO21bdl1beF09d319cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6bSxzaXplOltmLGRdLGRhdGF0eXBlOm99KX0sIkRlbnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiOmZ1bmN0aW9uKHQsbil7dmFyIHM9dC5fZGF0YSxhPXQuX3NpemUsdT10Ll9kYXRhdHlwZSxjPW4uX3ZhbHVlcyxsPW4uX2luZGV4LGg9bi5fcHRyLGY9bi5fc2l6ZSxwPW4uX2RhdGF0eXBlO2lmKCFjKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG11bHRpcGx5IERlbnNlIE1hdHJpeCB0aW1lcyBQYXR0ZXJuIG9ubHkgTWF0cml4Iik7dmFyIGQsZz1hWzBdLHk9ZlsxXSxtPXIsdj1pLF89byx4PTA7dSYmcCYmdT09PXAmJiJzdHJpbmciPT10eXBlb2YgdSYmKGQ9dSxtPWUuZmluZChyLFtkLGRdKSx2PWUuZmluZChpLFtkLGRdKSxfPWUuZmluZChvLFtkLGRdKSx4PWUuY29udmVydCgwLGQpKTtmb3IodmFyIHc9W10sYj1bXSxEPVtdLEU9bi5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczp3LGluZGV4OmIscHRyOkQsc2l6ZTpbZyx5XSxkYXRhdHlwZTpkfSksQz0wO0M8eTtDKyspe0RbQ109Yi5sZW5ndGg7dmFyIFM9aFtDXSxBPWhbQysxXTtpZihBPlMpZm9yKHZhciBOPTAsST0wO0k8ZztJKyspe2Zvcih2YXIgTT1JKzEsRj12b2lkIDAsVD1TO1Q8QTtUKyspe3ZhciBPPWxbVF07TiE9PU0/KEY9dihzW0ldW09dLGNbVF0pLE49TSk6Rj1tKEYsdihzW0ldW09dLGNbVF0pKX1OPT09TSYmIV8oRix4KSYmKGIucHVzaChJKSx3LnB1c2goRikpfX1yZXR1cm4gRFt5XT1iLmxlbmd0aCxFfSwiU3BhcnNlTWF0cml4LCBEZW5zZU1hdHJpeCI6ZnVuY3Rpb24odCxuKXt2YXIgcz10Ll92YWx1ZXMsYT10Ll9pbmRleCx1PXQuX3B0cixjPXQuX2RhdGF0eXBlO2lmKCFzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG11bHRpcGx5IFBhdHRlcm4gb25seSBNYXRyaXggdGltZXMgRGVuc2UgTWF0cml4Iik7dmFyIGwsaD1uLl9kYXRhLGY9bi5fZGF0YXR5cGUscD10Ll9zaXplWzBdLGQ9bi5fc2l6ZVswXSxnPW4uX3NpemVbMV0seT1yLG09aSx2PW8sXz0wO2MmJmYmJmM9PT1mJiYic3RyaW5nIj09dHlwZW9mIGMmJihsPWMseT1lLmZpbmQocixbbCxsXSksbT1lLmZpbmQoaSxbbCxsXSksdj1lLmZpbmQobyxbbCxsXSksXz1lLmNvbnZlcnQoMCxsKSk7Zm9yKHZhciB4PVtdLHc9W10sYj1bXSxEPXQuY3JlYXRlU3BhcnNlTWF0cml4KHt2YWx1ZXM6eCxpbmRleDp3LHB0cjpiLHNpemU6W3AsZ10sZGF0YXR5cGU6bH0pLEU9W10sQz1bXSxTPTA7UzxnO1MrKyl7YltTXT13Lmxlbmd0aDtmb3IodmFyIEE9UysxLE49MDtOPGQ7TisrKXt2YXIgST1oW05dW1NdO2lmKCF2KEksXykpZm9yKHZhciBNPXVbTl0sRj11W04rMV0sVD1NO1Q8RjtUKyspe3ZhciBPPWFbVF07Q1tPXSE9PUE/KENbT109QSx3LnB1c2goTyksRVtPXT1tKEksc1tUXSkpOkVbT109eShFW09dLG0oSSxzW1RdKSl9fWZvcih2YXIgTD1iW1NdLFA9dy5sZW5ndGgsUj1MO1I8UDtSKyspe3ZhciBCPXdbUl07eFtSXT1FW0JdfX1yZXR1cm4gYltnXT13Lmxlbmd0aCxEfSwiU3BhcnNlTWF0cml4LCBTcGFyc2VNYXRyaXgiOmZ1bmN0aW9uKHQsbil7dmFyIG8scz10Ll92YWx1ZXMsYT10Ll9pbmRleCx1PXQuX3B0cixjPXQuX2RhdGF0eXBlLGw9bi5fdmFsdWVzLGg9bi5faW5kZXgsZj1uLl9wdHIscD1uLl9kYXRhdHlwZSxkPXQuX3NpemVbMF0sZz1uLl9zaXplWzFdLHk9cyYmbCxtPXIsdj1pO2MmJnAmJmM9PT1wJiYic3RyaW5nIj09dHlwZW9mIGMmJihvPWMsbT1lLmZpbmQocixbbyxvXSksdj1lLmZpbmQoaSxbbyxvXSkpO2Zvcih2YXIgXyx4LHcsYixELEUsQyxTLEE9eT9bXTp2b2lkIDAsTj1bXSxJPVtdLE09dC5jcmVhdGVTcGFyc2VNYXRyaXgoe3ZhbHVlczpBLGluZGV4Ok4scHRyOkksc2l6ZTpbZCxnXSxkYXRhdHlwZTpvfSksRj15P1tdOnZvaWQgMCxUPVtdLE89MDtPPGc7TysrKXtJW09dPU4ubGVuZ3RoO3ZhciBMPU8rMTtmb3IoRD1mW09dLEU9ZltPKzFdLGI9RDtiPEU7YisrKWlmKFM9aFtiXSx5KWZvcih4PXVbU10sdz11W1MrMV0sXz14O188dztfKyspVFtDPWFbX11dIT09TD8oVFtDXT1MLE4ucHVzaChDKSxGW0NdPXYobFtiXSxzW19dKSk6RltDXT1tKEZbQ10sdihsW2JdLHNbX10pKTtlbHNlIGZvcih4PXVbU10sdz11W1MrMV0sXz14O188dztfKyspVFtDPWFbX11dIT09TCYmKFRbQ109TCxOLnB1c2goQykpO2lmKHkpZm9yKHZhciBQPUlbT10sUj1OLmxlbmd0aCxCPVA7QjxSO0IrKyl7dmFyIGs9TltCXTtBW0JdPUZba119fXJldHVybiBJW2ddPU4ubGVuZ3RoLE19fSk7cmV0dXJuIGUoWnksaSx7IkFycmF5LCBBcnJheSI6ZS5yZWZlclRvKCJNYXRyaXgsIE1hdHJpeCIsKHQ9PihlLHIpPT57YyhYcChlKSxYcChyKSk7dmFyIGk9dChuKGUpLG4ocikpO3JldHVybiBxZihpKT9pLnZhbHVlT2YoKTppfSkpLCJNYXRyaXgsIE1hdHJpeCI6ZnVuY3Rpb24odCxlKXt2YXIgbj10LnNpemUoKSxyPWUuc2l6ZSgpO3JldHVybiBjKG4sciksMT09PW4ubGVuZ3RoPzE9PT1yLmxlbmd0aD9mdW5jdGlvbih0LGUsbil7aWYoMD09PW4pdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgbXVsdGlwbHkgdHdvIGVtcHR5IHZlY3RvcnMiKTtyZXR1cm4gcyh0LGUpfSh0LGUsblswXSk6bCh0LGUpOjE9PT1yLmxlbmd0aD9oKHQsZSk6Zih0LGUpfSwiTWF0cml4LCBBcnJheSI6ZS5yZWZlclRvKCJNYXRyaXgsTWF0cml4IiwodD0+KGUscik9PnQoZSxuKHIpKSkpLCJBcnJheSwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT4oZSxyKT0+dChuKGUsci5zdG9yYWdlKCkpLHIpKSksIlNwYXJzZU1hdHJpeCwgYW55IjpmdW5jdGlvbih0LGUpe3JldHVybiBhKHQsZSxpLCExKX0sIkRlbnNlTWF0cml4LCBhbnkiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHUodCxlLGksITEpfSwiYW55LCBTcGFyc2VNYXRyaXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGEoZSx0LGksITApfSwiYW55LCBEZW5zZU1hdHJpeCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdShlLHQsaSwhMCl9LCJBcnJheSwgYW55IjpmdW5jdGlvbih0LGUpe3JldHVybiB1KG4odCksZSxpLCExKS52YWx1ZU9mKCl9LCJhbnksIEFycmF5IjpmdW5jdGlvbih0LGUpe3JldHVybiB1KG4oZSksdCxpLCEwKS52YWx1ZU9mKCl9LCJhbnksIGFueSI6aSwiYW55LCBhbnksIC4uLmFueSI6ZS5yZWZlclRvU2VsZigodD0+KGUsbixyKT0+e2Zvcih2YXIgaT10KGUsbiksbz0wO288ci5sZW5ndGg7bysrKWk9dChpLHJbb10pO3JldHVybiBpfSkpfSl9KSksSnk9aWQoIm1hdEFsZ28wOXhTMFNmIixbInR5cGVkIiwiZXF1YWxTY2FsYXIiXSwodD0+e3Zhcnt0eXBlZDplLGVxdWFsU2NhbGFyOm59PXQ7cmV0dXJuIGZ1bmN0aW9uKHQscixpKXt2YXIgbz10Ll92YWx1ZXMscz10Ll9pbmRleCxhPXQuX3B0cix1PXQuX3NpemUsYz10Ll9kYXRhdHlwZSxsPXIuX3ZhbHVlcyxoPXIuX2luZGV4LGY9ci5fcHRyLHA9ci5fc2l6ZSxkPXIuX2RhdGF0eXBlO2lmKHUubGVuZ3RoIT09cC5sZW5ndGgpdGhyb3cgbmV3IEdwKHUubGVuZ3RoLHAubGVuZ3RoKTtpZih1WzBdIT09cFswXXx8dVsxXSE9PXBbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkRpbWVuc2lvbiBtaXNtYXRjaC4gTWF0cml4IEEgKCIrdSsiKSBtdXN0IG1hdGNoIE1hdHJpeCBCICgiK3ArIikiKTt2YXIgZyx5PXVbMF0sbT11WzFdLHY9bixfPTAseD1pOyJzdHJpbmciPT10eXBlb2YgYyYmYz09PWQmJihnPWMsdj1lLmZpbmQobixbZyxnXSksXz1lLmNvbnZlcnQoMCxnKSx4PWUuZmluZChpLFtnLGddKSk7dmFyIHcsYixELEUsQyxTPW8mJmw/W106dm9pZCAwLEE9W10sTj1bXSxJPVM/W106dm9pZCAwLE09W107Zm9yKGI9MDtiPG07YisrKXtOW2JdPUEubGVuZ3RoO3ZhciBGPWIrMTtpZihJKWZvcihFPWZbYl0sQz1mW2IrMV0sRD1FO0Q8QztEKyspTVt3PWhbRF1dPUYsSVt3XT1sW0RdO2ZvcihFPWFbYl0sQz1hW2IrMV0sRD1FO0Q8QztEKyspaWYodz1zW0RdLEkpe3ZhciBUPU1bd109PT1GP0lbd106XyxPPXgob1tEXSxUKTt2KE8sXyl8fChBLnB1c2godyksUy5wdXNoKE8pKX1lbHNlIEEucHVzaCh3KX1yZXR1cm4gTlttXT1BLmxlbmd0aCx0LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOlMsaW5kZXg6QSxwdHI6TixzaXplOlt5LG1dLGRhdGF0eXBlOmd9KX19KSksUXk9aWQoIm1hdEFsZ28wN3hTU2YiLFsidHlwZWQiLCJEZW5zZU1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsRGVuc2VNYXRyaXg6bn09dDtyZXR1cm4gZnVuY3Rpb24odCxpLG8pe3ZhciBzPXQuX3NpemUsYT10Ll9kYXRhdHlwZSx1PWkuX3NpemUsYz1pLl9kYXRhdHlwZTtpZihzLmxlbmd0aCE9PXUubGVuZ3RoKXRocm93IG5ldyBHcChzLmxlbmd0aCx1Lmxlbmd0aCk7aWYoc1swXSE9PXVbMF18fHNbMV0hPT11WzFdKXRocm93IG5ldyBSYW5nZUVycm9yKCJEaW1lbnNpb24gbWlzbWF0Y2guIE1hdHJpeCBBICgiK3MrIikgbXVzdCBtYXRjaCBNYXRyaXggQiAoIit1KyIpIik7dmFyIGwsaD1zWzBdLGY9c1sxXSxwPTAsZD1vOyJzdHJpbmciPT10eXBlb2YgYSYmYT09PWMmJihsPWEscD1lLmNvbnZlcnQoMCxsKSxkPWUuZmluZChvLFtsLGxdKSk7dmFyIGcseSxtPVtdO2ZvcihnPTA7ZzxoO2crKyltW2ddPVtdO3ZhciB2PVtdLF89W10seD1bXSx3PVtdO2Zvcih5PTA7eTxmO3krKyl7dmFyIGI9eSsxO2ZvcihyKHQseSx4LHYsYikscihpLHksdyxfLGIpLGc9MDtnPGg7ZysrKXt2YXIgRD14W2ddPT09Yj92W2ddOnAsRT13W2ddPT09Yj9fW2ddOnA7bVtnXVt5XT1kKEQsRSl9fXJldHVybiBuZXcgbih7ZGF0YTptLHNpemU6W2gsZl0sZGF0YXR5cGU6bH0pfTtmdW5jdGlvbiByKHQsZSxuLHIsaSl7Zm9yKHZhciBvPXQuX3ZhbHVlcyxzPXQuX2luZGV4LGE9dC5fcHRyLHU9YVtlXSxjPWFbZSsxXTt1PGM7dSsrKXt2YXIgbD1zW3VdO25bbF09aSxyW2xdPW9bdV19fX0pKSwkeT0iY29uaiIsdG09aWQoJHksWyJ0eXBlZCJdLCh0PT57dmFye3R5cGVkOmV9PXQ7cmV0dXJuIGUoJHkseyJudW1iZXIgfCBCaWdOdW1iZXIgfCBGcmFjdGlvbiI6dD0+dCxDb21wbGV4OnQ9PnQuY29uanVnYXRlKCksIkFycmF5IHwgTWF0cml4IjplLnJlZmVyVG9TZWxmKCh0PT5lPT5feShlLHQpKSl9KX0pKSxlbT0iY29uY2F0IixubT1pZChlbSxbInR5cGVkIiwibWF0cml4IiwiaXNJbnRlZ2VyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixpc0ludGVnZXI6cn09dDtyZXR1cm4gZShlbSx7Ii4uLkFycmF5IHwgTWF0cml4IHwgbnVtYmVyIHwgQmlnTnVtYmVyIjpmdW5jdGlvbih0KXt2YXIgZSxpLG89dC5sZW5ndGgscz0tMSxhPSExLHU9W107Zm9yKGU9MDtlPG87ZSsrKXt2YXIgYz10W2VdO2lmKHFmKGMpJiYoYT0hMCksUGYoYyl8fFJmKGMpKXtpZihlIT09by0xKXRocm93IG5ldyBFcnJvcigiRGltZW5zaW9uIG11c3QgYmUgc3BlY2lmaWVkIGFzIGxhc3QgYXJndW1lbnQiKTtpZihpPXMscz1jLnZhbHVlT2YoKSwhcihzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnRlZ2VyIG51bWJlciBleHBlY3RlZCBmb3IgZGltZW5zaW9uIik7aWYoczwwfHxlPjAmJnM+aSl0aHJvdyBuZXcgWXAocyxpKzEpfWVsc2V7dmFyIGw9d3AoYykudmFsdWVPZigpLGg9WHAobCk7aWYodVtlXT1sLGk9cyxzPWgubGVuZ3RoLTEsZT4wJiZzIT09aSl0aHJvdyBuZXcgR3AoaSsxLHMrMSl9fWlmKDA9PT11Lmxlbmd0aCl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkF0IGxlYXN0IG9uZSBtYXRyaXggZXhwZWN0ZWQiKTtmb3IodmFyIGY9dS5zaGlmdCgpO3UubGVuZ3RoOylmPXJtKGYsdS5zaGlmdCgpLHMsMCk7cmV0dXJuIGE/bihmKTpmfSwiLi4uc3RyaW5nIjpmdW5jdGlvbih0KXtyZXR1cm4gdC5qb2luKCIiKX19KX0pKTtmdW5jdGlvbiBybSh0LGUsbixyKXtpZihyPG4pe2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEdwKHQubGVuZ3RoLGUubGVuZ3RoKTtmb3IodmFyIGk9W10sbz0wO288dC5sZW5ndGg7bysrKWlbb109cm0odFtvXSxlW29dLG4scisxKTtyZXR1cm4gaX1yZXR1cm4gdC5jb25jYXQoZSl9dmFyIGltPWlkKCJvbmVzIixbInR5cGVkIiwiY29uZmlnIiwibWF0cml4IiwiQmlnTnVtYmVyIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixCaWdOdW1iZXI6aX09dDtyZXR1cm4gZSgib25lcyIseyIiOmZ1bmN0aW9uKCl7cmV0dXJuIkFycmF5Ij09PW4ubWF0cml4P28oW10pOm8oW10sImRlZmF1bHQiKX0sIi4uLm51bWJlciB8IEJpZ051bWJlciB8IHN0cmluZyI6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0W3QubGVuZ3RoLTFdKXt2YXIgZT10LnBvcCgpO3JldHVybiBvKHQsZSl9cmV0dXJuIkFycmF5Ij09PW4ubWF0cml4P28odCk6byh0LCJkZWZhdWx0Iil9LEFycmF5Om8sTWF0cml4OmZ1bmN0aW9uKHQpe3ZhciBlPXQuc3RvcmFnZSgpO3JldHVybiBvKHQudmFsdWVPZigpLGUpfSwiQXJyYXkgfCBNYXRyaXgsIHN0cmluZyI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbyh0LnZhbHVlT2YoKSxlKX19KTtmdW5jdGlvbiBvKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7dmFyIGU9ITE7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxuLHIpe1JmKHQpJiYoZT0hMCxyW25dPXQudG9OdW1iZXIoKSl9KSksZX0odCksbz1uP25ldyBpKDEpOjE7aWYoZnVuY3Rpb24odCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHR8fCFNcCh0KXx8dDwwKXRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVycyBpbiBmdW5jdGlvbiBvbmVzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMiKX0pKX0odCksZSl7dmFyIHM9cihlKTtyZXR1cm4gdC5sZW5ndGg+MD9zLnJlc2l6ZSh0LG8pOnN9dmFyIGE9W107cmV0dXJuIHQubGVuZ3RoPjA/S3AoYSx0LG8pOmF9fSkpO2Z1bmN0aW9uIG9tKCl7dGhyb3cgbmV3IEVycm9yKCdObyAiYmlnbnVtYmVyIiBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUnKX1mdW5jdGlvbiBzbSgpe3Rocm93IG5ldyBFcnJvcignTm8gImZyYWN0aW9uIiBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUnKX1mdW5jdGlvbiBhbSgpe3Rocm93IG5ldyBFcnJvcignTm8gIm1hdHJpeCIgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlJyl9dmFyIHVtPSJyYW5nZSIsY209aWQodW0sWyJ0eXBlZCIsImNvbmZpZyIsIj9tYXRyaXgiLCI/YmlnbnVtYmVyIiwic21hbGxlciIsInNtYWxsZXJFcSIsImxhcmdlciIsImxhcmdlckVxIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixiaWdudW1iZXI6aSxzbWFsbGVyOm8sc21hbGxlckVxOnMsbGFyZ2VyOmEsbGFyZ2VyRXE6dX09dDtyZXR1cm4gZSh1bSx7c3RyaW5nOmwsInN0cmluZywgYm9vbGVhbiI6bCwibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGMoaCh0LGUsMSkpfSwibnVtYmVyLCBudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjKGgodCxlLG4pKX0sIm51bWJlciwgbnVtYmVyLCBib29sZWFuIjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGMobj9mKHQsZSwxKTpoKHQsZSwxKSl9LCJudW1iZXIsIG51bWJlciwgbnVtYmVyLCBib29sZWFuIjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gYyhyP2YodCxlLG4pOmgodCxlLG4pKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiBjKHAodCxlLG5ldygwLHQuY29uc3RydWN0b3IpKDEpKSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGMocCh0LGUsbikpfSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIsIGJvb2xlYW4iOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmNvbnN0cnVjdG9yO3JldHVybiBjKG4/ZCh0LGUsbmV3IHIoMSkpOnAodCxlLG5ldyByKDEpKSl9LCJCaWdOdW1iZXIsIEJpZ051bWJlciwgQmlnTnVtYmVyLCBib29sZWFuIjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gYyhyP2QodCxlLG4pOnAodCxlLG4pKX19KTtmdW5jdGlvbiBjKHQpe3JldHVybiJNYXRyaXgiPT09bi5tYXRyaXg/cj9yKHQpOmFtKCk6dH1mdW5jdGlvbiBsKHQsZSl7dmFyIHI9ZnVuY3Rpb24odCl7dmFyIGU9dC5zcGxpdCgiOiIpLG49ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCl9KSkscj1uLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0KX0pKTtpZihyKXJldHVybiBudWxsO3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAyOnJldHVybntzdGFydDpuWzBdLGVuZDpuWzFdLHN0ZXA6MX07Y2FzZSAzOnJldHVybntzdGFydDpuWzBdLGVuZDpuWzJdLHN0ZXA6blsxXX07ZGVmYXVsdDpyZXR1cm4gbnVsbH19KHQpO2lmKCFyKXRocm93IG5ldyBTeW50YXhFcnJvcignU3RyaW5nICInK3QrJyIgaXMgbm8gdmFsaWQgcmFuZ2UnKTtyZXR1cm4iQmlnTnVtYmVyIj09PW4ubnVtYmVyPyh2b2lkIDA9PT1pJiZvbSgpLGMoKGU/ZDpwKShpKHIuc3RhcnQpLGkoci5lbmQpLGkoci5zdGVwKSkpKTpjKChlP2Y6aCkoci5zdGFydCxyLmVuZCxyLnN0ZXApKX1mdW5jdGlvbiBoKHQsZSxuKXt2YXIgcj1bXSxpPXQ7aWYobj4wKWZvcig7byhpLGUpOylyLnB1c2goaSksaSs9bjtlbHNlIGlmKG48MClmb3IoO2EoaSxlKTspci5wdXNoKGkpLGkrPW47cmV0dXJuIHJ9ZnVuY3Rpb24gZih0LGUsbil7dmFyIHI9W10saT10O2lmKG4+MClmb3IoO3MoaSxlKTspci5wdXNoKGkpLGkrPW47ZWxzZSBpZihuPDApZm9yKDt1KGksZSk7KXIucHVzaChpKSxpKz1uO3JldHVybiByfWZ1bmN0aW9uIHAodCxlLG4pe3ZhciByPWkoMCkscz1bXSx1PXQ7aWYobi5ndChyKSlmb3IoO28odSxlKTspcy5wdXNoKHUpLHU9dS5wbHVzKG4pO2Vsc2UgaWYobi5sdChyKSlmb3IoO2EodSxlKTspcy5wdXNoKHUpLHU9dS5wbHVzKG4pO3JldHVybiBzfWZ1bmN0aW9uIGQodCxlLG4pe3ZhciByPWkoMCksbz1bXSxhPXQ7aWYobi5ndChyKSlmb3IoO3MoYSxlKTspby5wdXNoKGEpLGE9YS5wbHVzKG4pO2Vsc2UgaWYobi5sdChyKSlmb3IoO3UoYSxlKTspby5wdXNoKGEpLGE9YS5wbHVzKG4pO3JldHVybiBvfX0pKSxsbT0ic2l6ZSIsaG09aWQobG0sWyJ0eXBlZCIsImNvbmZpZyIsIj9tYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpuLG1hdHJpeDpyfT10O3JldHVybiBlKGxtLHtNYXRyaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY3JlYXRlKHQuc2l6ZSgpKX0sQXJyYXk6WHAsc3RyaW5nOmZ1bmN0aW9uKHQpe3JldHVybiJBcnJheSI9PT1uLm1hdHJpeD9bdC5sZW5ndGhdOnIoW3QubGVuZ3RoXSl9LCJudW1iZXIgfCBDb21wbGV4IHwgQmlnTnVtYmVyIHwgVW5pdCB8IGJvb2xlYW4gfCBudWxsIjpmdW5jdGlvbih0KXtyZXR1cm4iQXJyYXkiPT09bi5tYXRyaXg/W106cj9yKFtdKTphbSgpfX0pfSkpLGZtPSJzdWJzZXQiLHBtPWlkKGZtLFsidHlwZWQiLCJtYXRyaXgiXSwodD0+e3Zhcnt0eXBlZDplLG1hdHJpeDpufT10O3JldHVybiBlKGZtLHsiQXJyYXksIEluZGV4IjpmdW5jdGlvbih0LGUpe3ZhciByPW4odCkuc3Vic2V0KGUpO3JldHVybiBlLmlzU2NhbGFyKCk/cjpyLnZhbHVlT2YoKX0sIk1hdHJpeCwgSW5kZXgiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc3Vic2V0KGUpfSwiT2JqZWN0LCBJbmRleCI6eW0sInN0cmluZywgSW5kZXgiOmRtLCJBcnJheSwgSW5kZXgsIGFueSI6ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuKHdwKHQpKS5zdWJzZXQoZSxyLHZvaWQgMCkudmFsdWVPZigpfSwiQXJyYXksIEluZGV4LCBhbnksIGFueSI6ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIG4od3AodCkpLnN1YnNldChlLHIsaSkudmFsdWVPZigpfSwiTWF0cml4LCBJbmRleCwgYW55IjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQuY2xvbmUoKS5zdWJzZXQoZSxuKX0sIk1hdHJpeCwgSW5kZXgsIGFueSwgYW55IjpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdC5jbG9uZSgpLnN1YnNldChlLG4scil9LCJzdHJpbmcsIEluZGV4LCBzdHJpbmciOmdtLCJzdHJpbmcsIEluZGV4LCBzdHJpbmcsIHN0cmluZyI6Z20sIk9iamVjdCwgSW5kZXgsIGFueSI6bW19KX0pKTtmdW5jdGlvbiBkbSh0LGUpe2lmKCFXZihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbmRleCBleHBlY3RlZCIpO2lmKDEhPT1lLnNpemUoKS5sZW5ndGgpdGhyb3cgbmV3IEdwKGUuc2l6ZSgpLmxlbmd0aCwxKTt2YXIgbj10Lmxlbmd0aDtacChlLm1pbigpWzBdLG4pLFpwKGUubWF4KClbMF0sbik7dmFyIHI9ZS5kaW1lbnNpb24oMCksaT0iIjtyZXR1cm4gci5mb3JFYWNoKChmdW5jdGlvbihlKXtpKz10LmNoYXJBdChlKX0pKSxpfWZ1bmN0aW9uIGdtKHQsZSxuLHIpe2lmKCFlfHwhMCE9PWUuaXNJbmRleCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbmRleCBleHBlY3RlZCIpO2lmKDEhPT1lLnNpemUoKS5sZW5ndGgpdGhyb3cgbmV3IEdwKGUuc2l6ZSgpLmxlbmd0aCwxKTtpZih2b2lkIDAhPT1yKXtpZigic3RyaW5nIiE9dHlwZW9mIHJ8fDEhPT1yLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTaW5nbGUgY2hhcmFjdGVyIGV4cGVjdGVkIGFzIGRlZmF1bHRWYWx1ZSIpfWVsc2Ugcj0iICI7dmFyIGk9ZS5kaW1lbnNpb24oMCk7aWYoaS5zaXplKClbMF0hPT1uLmxlbmd0aCl0aHJvdyBuZXcgR3AoaS5zaXplKClbMF0sbi5sZW5ndGgpO3ZhciBvPXQubGVuZ3RoO1pwKGUubWluKClbMF0pLFpwKGUubWF4KClbMF0pO2Zvcih2YXIgcz1bXSxhPTA7YTxvO2ErKylzW2FdPXQuY2hhckF0KGEpO2lmKGkuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtzW3RdPW4uY2hhckF0KGVbMF0pfSkpLHMubGVuZ3RoPm8pZm9yKHZhciB1PW8tMSxjPXMubGVuZ3RoO3U8Yzt1Kyspc1t1XXx8KHNbdV09cik7cmV0dXJuIHMuam9pbigiIil9ZnVuY3Rpb24geW0odCxlKXtpZigxIT09ZS5zaXplKCkubGVuZ3RoKXRocm93IG5ldyBHcChlLnNpemUoKSwxKTt2YXIgbj1lLmRpbWVuc2lvbigwKTtpZigic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiU3RyaW5nIGV4cGVjdGVkIGFzIGluZGV4IHRvIHJldHJpZXZlIGFuIG9iamVjdCBwcm9wZXJ0eSIpO3JldHVybiBzZCh0LG4pfWZ1bmN0aW9uIG1tKHQsZSxuKXtpZigxIT09ZS5zaXplKCkubGVuZ3RoKXRocm93IG5ldyBHcChlLnNpemUoKSwxKTt2YXIgcj1lLmRpbWVuc2lvbigwKTtpZigic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3RyaW5nIGV4cGVjdGVkIGFzIGluZGV4IHRvIHJldHJpZXZlIGFuIG9iamVjdCBwcm9wZXJ0eSIpO3ZhciBpPXdwKHQpO3JldHVybiBhZChpLHIsbiksaX12YXIgdm09InRyYW5zcG9zZSIsX209aWQodm0sWyJ0eXBlZCIsIm1hdHJpeCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om59PXQ7cmV0dXJuIGUodm0se0FycmF5OnQ9PnIobih0KSkudmFsdWVPZigpLE1hdHJpeDpyLGFueTp3cH0pO2Z1bmN0aW9uIHIodCl7dmFyIGUsbj10LnNpemUoKTtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMTplPXQuY2xvbmUoKTticmVhaztjYXNlIDI6dmFyIHI9blswXSxpPW5bMV07aWYoMD09PWkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNhbm5vdCB0cmFuc3Bvc2UgYSAyRCBtYXRyaXggd2l0aCBubyBjb2x1bW5zIChzaXplOiAiK3FwKG4pKyIpIik7c3dpdGNoKHQuc3RvcmFnZSgpKXtjYXNlImRlbnNlIjplPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHIsaT10Ll9kYXRhLG89W10scz0wO3M8bjtzKyspe3I9b1tzXT1bXTtmb3IodmFyIGE9MDthPGU7YSsrKXJbYV09d3AoaVthXVtzXSl9cmV0dXJuIHQuY3JlYXRlRGVuc2VNYXRyaXgoe2RhdGE6byxzaXplOltuLGVdLGRhdGF0eXBlOnQuX2RhdGF0eXBlfSl9KHQscixpKTticmVhaztjYXNlInNwYXJzZSI6ZT1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPXQuX3ZhbHVlcyxpPXQuX2luZGV4LG89dC5fcHRyLHM9cj9bXTp2b2lkIDAsYT1bXSx1PVtdLGM9W10sbD0wO2w8ZTtsKyspY1tsXT0wO3ZhciBoLGYscDtmb3IoaD0wLGY9aS5sZW5ndGg7aDxmO2grKyljW2lbaF1dKys7Zm9yKHZhciBkPTAsZz0wO2c8ZTtnKyspdS5wdXNoKGQpLGQrPWNbZ10sY1tnXT11W2ddO2Zvcih1LnB1c2goZCkscD0wO3A8bjtwKyspZm9yKHZhciB5PW9bcF0sbT1vW3ArMV0sdj15O3Y8bTt2Kyspe3ZhciBfPWNbaVt2XV0rKzthW19dPXAsciYmKHNbX109d3Aoclt2XSkpfXJldHVybiB0LmNyZWF0ZVNwYXJzZU1hdHJpeCh7dmFsdWVzOnMsaW5kZXg6YSxwdHI6dSxzaXplOltuLGVdLGRhdGF0eXBlOnQuX2RhdGF0eXBlfSl9KHQscixpKX1icmVhaztkZWZhdWx0OnRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaXggbXVzdCBiZSBhIHZlY3RvciBvciB0d28gZGltZW5zaW9uYWwgKHNpemU6ICIrcXAobikrIikiKX1yZXR1cm4gZX19KSkseG09aWQoIm51bWVyaWMiLFsibnVtYmVyIiwiP2JpZ251bWJlciIsIj9mcmFjdGlvbiJdLCh0PT57dmFye251bWJlcjplLGJpZ251bWJlcjpuLGZyYWN0aW9uOnJ9PXQsaT17c3RyaW5nOiEwLG51bWJlcjohMCxCaWdOdW1iZXI6ITAsRnJhY3Rpb246ITB9LG89e251bWJlcjp0PT5lKHQpLEJpZ051bWJlcjpuP3Q9Pm4odCk6b20sRnJhY3Rpb246cj90PT5yKHQpOnNtfTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiJudW1iZXIiO2lmKHZvaWQgMCE9PShhcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJudW1lcmljKCkgdGFrZXMgb25lIG9yIHR3byBhcmd1bWVudHMiKTt2YXIgbj14cCh0KTtpZighKG4gaW4gaSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgIit0Kycgb2YgdHlwZSAiJytuKyciOyB2YWxpZCBpbnB1dCB0eXBlcyBhcmUgJytPYmplY3Qua2V5cyhpKS5qb2luKCIsICIpKTtpZighKGUgaW4gbykpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgIit0KycgdG8gdHlwZSAiJytlKyciOyB2YWxpZCBvdXRwdXQgdHlwZXMgYXJlICcrT2JqZWN0LmtleXMobykuam9pbigiLCAiKSk7cmV0dXJuIGU9PT1uP3Q6b1tlXSh0KX19KSksd209ImRpdmlkZVNjYWxhciIsYm09aWQod20sWyJ0eXBlZCIsIm51bWVyaWMiXSwodD0+e3Zhcnt0eXBlZDplLG51bWVyaWM6bn09dDtyZXR1cm4gZSh3bSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0L2V9LCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmRpdihlKX0sIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0LmRpdihlKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5kaXYoZSl9LCJVbml0LCBudW1iZXIgfCBDb21wbGV4IHwgRnJhY3Rpb24gfCBCaWdOdW1iZXIgfCBVbml0IjoodCxlKT0+dC5kaXZpZGUoZSksIm51bWJlciB8IEZyYWN0aW9uIHwgQ29tcGxleCB8IEJpZ051bWJlciwgVW5pdCI6KHQsZSk9PmUuZGl2aWRlSW50byh0KX0pfSkpLERtPSJkb3REaXZpZGUiLEVtPWlkKERtLFsidHlwZWQiLCJtYXRyaXgiLCJlcXVhbFNjYWxhciIsImRpdmlkZVNjYWxhciIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixlcXVhbFNjYWxhcjpyLGRpdmlkZVNjYWxhcjppLERlbnNlTWF0cml4Om8sY29uY2F0OnN9PXQsYT1YeSh7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpyfSksdT1XeSh7dHlwZWQ6ZX0pLGM9UXkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6b30pLGw9Qnkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6cn0pLGg9a3koe3R5cGVkOmUsRGVuc2VNYXRyaXg6b30pLGY9WXkoe3R5cGVkOmUsbWF0cml4Om4sY29uY2F0OnN9KTtyZXR1cm4gZShEbSxmKHtlbG9wOmksU1M6YyxEUzp1LFNEOmEsU3M6bCxzUzpofSkpfSkpLENtPSJzbWFsbGVyIixTbT1pZChDbSxbInR5cGVkIiwiY29uZmlnIiwibWF0cml4IiwiRGVuc2VNYXRyaXgiLCJjb25jYXQiXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpuLG1hdHJpeDpyLERlbnNlTWF0cml4OmksY29uY2F0Om99PXQscz1XeSh7dHlwZWQ6ZX0pLGE9UXkoe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLHU9a3koe3R5cGVkOmUsRGVuc2VNYXRyaXg6aX0pLGM9WXkoe3R5cGVkOmUsbWF0cml4OnIsY29uY2F0Om99KSxsPVN5KHt0eXBlZDplfSk7cmV0dXJuIGUoQ20sQW0oe3R5cGVkOmUsY29uZmlnOm59KSx7ImJvb2xlYW4sIGJvb2xlYW4iOih0LGUpPT50PGUsIkJpZ051bWJlciwgQmlnTnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Lmx0KGUpJiYhQ3kodCxlLG4uZXBzaWxvbil9LCJGcmFjdGlvbiwgRnJhY3Rpb24iOih0LGUpPT4tMT09PXQuY29tcGFyZShlKSwiQ29tcGxleCwgQ29tcGxleCI6ZnVuY3Rpb24odCxlKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJObyBvcmRlcmluZyByZWxhdGlvbiBpcyBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMiKX19LGwsYyh7U1M6YSxEUzpzLFNzOnV9KSl9KSksQW09aWQoQ20sWyJ0eXBlZCIsImNvbmZpZyJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm59PXQ7cmV0dXJuIGUoQ20seyJudW1iZXIsIG51bWJlciI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlJiYha3AodCxlLG4uZXBzaWxvbil9fSl9KSksTm09InNtYWxsZXJFcSIsSW09aWQoTm0sWyJ0eXBlZCIsImNvbmZpZyIsIm1hdHJpeCIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixEZW5zZU1hdHJpeDppLGNvbmNhdDpvfT10LHM9V3koe3R5cGVkOmV9KSxhPVF5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSx1PWt5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSxjPVl5KHt0eXBlZDplLG1hdHJpeDpyLGNvbmNhdDpvfSksbD1TeSh7dHlwZWQ6ZX0pO3JldHVybiBlKE5tLE1tKHt0eXBlZDplLGNvbmZpZzpufSkseyJib29sZWFuLCBib29sZWFuIjoodCxlKT0+dDw9ZSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubHRlKGUpfHxDeSh0LGUsbi5lcHNpbG9uKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6KHQsZSk9PjEhPT10LmNvbXBhcmUoZSksIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiTm8gb3JkZXJpbmcgcmVsYXRpb24gaXMgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzIil9fSxsLGMoe1NTOmEsRFM6cyxTczp1fSkpfSkpLE1tPWlkKE5tLFsidHlwZWQiLCJjb25maWciXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpufT10O3JldHVybiBlKE5tLHsibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8PWV8fGtwKHQsZSxuLmVwc2lsb24pfX0pfSkpLEZtPSJsYXJnZXIiLFRtPWlkKEZtLFsidHlwZWQiLCJjb25maWciLCJtYXRyaXgiLCJEZW5zZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsY29uZmlnOm4sbWF0cml4OnIsRGVuc2VNYXRyaXg6aSxjb25jYXQ6b309dCxzPVd5KHt0eXBlZDplfSksYT1ReSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksdT1reSh7dHlwZWQ6ZSxEZW5zZU1hdHJpeDppfSksYz1ZeSh7dHlwZWQ6ZSxtYXRyaXg6cixjb25jYXQ6b30pLGw9U3koe3R5cGVkOmV9KTtyZXR1cm4gZShGbSxPbSh7dHlwZWQ6ZSxjb25maWc6bn0pLHsiYm9vbGVhbiwgYm9vbGVhbiI6KHQsZSk9PnQ+ZSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ3QoZSkmJiFDeSh0LGUsbi5lcHNpbG9uKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6KHQsZSk9PjE9PT10LmNvbXBhcmUoZSksIkNvbXBsZXgsIENvbXBsZXgiOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiTm8gb3JkZXJpbmcgcmVsYXRpb24gaXMgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzIil9fSxsLGMoe1NTOmEsRFM6cyxTczp1fSkpfSkpLE9tPWlkKEZtLFsidHlwZWQiLCJjb25maWciXSwodD0+e3Zhcnt0eXBlZDplLGNvbmZpZzpufT10O3JldHVybiBlKEZtLHsibnVtYmVyLCBudW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+ZSYmIWtwKHQsZSxuLmVwc2lsb24pfX0pfSkpLExtPSJsYXJnZXJFcSIsUG09aWQoTG0sWyJ0eXBlZCIsImNvbmZpZyIsIm1hdHJpeCIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bixtYXRyaXg6cixEZW5zZU1hdHJpeDppLGNvbmNhdDpvfT10LHM9V3koe3R5cGVkOmV9KSxhPVF5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSx1PWt5KHt0eXBlZDplLERlbnNlTWF0cml4Oml9KSxjPVl5KHt0eXBlZDplLG1hdHJpeDpyLGNvbmNhdDpvfSksbD1TeSh7dHlwZWQ6ZX0pO3JldHVybiBlKExtLFJtKHt0eXBlZDplLGNvbmZpZzpufSkseyJib29sZWFuLCBib29sZWFuIjoodCxlKT0+dD49ZSwiQmlnTnVtYmVyLCBCaWdOdW1iZXIiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ3RlKGUpfHxDeSh0LGUsbi5lcHNpbG9uKX0sIkZyYWN0aW9uLCBGcmFjdGlvbiI6KHQsZSk9Pi0xIT09dC5jb21wYXJlKGUpLCJDb21wbGV4LCBDb21wbGV4IjpmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIk5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVycyIpfX0sbCxjKHtTUzphLERTOnMsU3M6dX0pKX0pKSxSbT1pZChMbSxbInR5cGVkIiwiY29uZmlnIl0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxjb25maWc6bn09dDtyZXR1cm4gZShMbSx7Im51bWJlciwgbnVtYmVyIjpmdW5jdGlvbih0LGUpe3JldHVybiB0Pj1lfHxrcCh0LGUsbi5lcHNpbG9uKX19KX0pKSxCbT1pZCgiSW1tdXRhYmxlRGVuc2VNYXRyaXgiLFsic21hbGxlciIsIkRlbnNlTWF0cml4Il0sKHQ9Pnt2YXJ7c21hbGxlcjplLERlbnNlTWF0cml4Om59PXQ7ZnVuY3Rpb24gcih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBTeW50YXhFcnJvcigiQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yIik7aWYoZSYmIWpmKGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBkYXRhdHlwZTogIitlKTtpZihxZih0KXx8VWYodCkpe3ZhciBpPW5ldyBuKHQsZSk7dGhpcy5fZGF0YT1pLl9kYXRhLHRoaXMuX3NpemU9aS5fc2l6ZSx0aGlzLl9kYXRhdHlwZT1pLl9kYXRhdHlwZSx0aGlzLl9taW49bnVsbCx0aGlzLl9tYXg9bnVsbH1lbHNlIGlmKHQmJlVmKHQuZGF0YSkmJlVmKHQuc2l6ZSkpdGhpcy5fZGF0YT10LmRhdGEsdGhpcy5fc2l6ZT10LnNpemUsdGhpcy5fZGF0YXR5cGU9dC5kYXRhdHlwZSx0aGlzLl9taW49dm9pZCAwIT09dC5taW4/dC5taW46bnVsbCx0aGlzLl9tYXg9dm9pZCAwIT09dC5tYXg/dC5tYXg6bnVsbDtlbHNle2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSBvZiBkYXRhICgiK3hwKHQpKyIpIik7dGhpcy5fZGF0YT1bXSx0aGlzLl9zaXplPVswXSx0aGlzLl9kYXRhdHlwZT1lLHRoaXMuX21pbj1udWxsLHRoaXMuX21heD1udWxsfX1yZXR1cm4gci5wcm90b3R5cGU9bmV3IG4sci5wcm90b3R5cGUudHlwZT0iSW1tdXRhYmxlRGVuc2VNYXRyaXgiLHIucHJvdG90eXBlLmlzSW1tdXRhYmxlRGVuc2VNYXRyaXg9ITAsci5wcm90b3R5cGUuc3Vic2V0PWZ1bmN0aW9uKHQpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6dmFyIGU9bi5wcm90b3R5cGUuc3Vic2V0LmNhbGwodGhpcyx0KTtyZXR1cm4gcWYoZSk/bmV3IHIoe2RhdGE6ZS5fZGF0YSxzaXplOmUuX3NpemUsZGF0YXR5cGU6ZS5fZGF0YXR5cGV9KTplO2Nhc2UgMjpjYXNlIDM6dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHNldCBzdWJzZXQgb24gYW4gSW1tdXRhYmxlIE1hdHJpeCBpbnN0YW5jZSIpO2RlZmF1bHQ6dGhyb3cgbmV3IFN5bnRheEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIil9fSxyLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc2V0IG9uIGFuIEltbXV0YWJsZSBNYXRyaXggaW5zdGFuY2UiKX0sci5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW52b2tlIHJlc2l6ZSBvbiBhbiBJbW11dGFibGUgTWF0cml4IGluc3RhbmNlIil9LHIucHJvdG90eXBlLnJlc2hhcGU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2UgcmVzaGFwZSBvbiBhbiBJbW11dGFibGUgTWF0cml4IGluc3RhbmNlIil9LHIucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyByKHtkYXRhOndwKHRoaXMuX2RhdGEpLHNpemU6d3AodGhpcy5fc2l6ZSksZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9KX0sci5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21hdGhqczoiSW1tdXRhYmxlRGVuc2VNYXRyaXgiLGRhdGE6dGhpcy5fZGF0YSxzaXplOnRoaXMuX3NpemUsZGF0YXR5cGU6dGhpcy5fZGF0YXR5cGV9fSxyLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcih0KX0sci5wcm90b3R5cGUuc3dhcFJvd3M9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbnZva2Ugc3dhcFJvd3Mgb24gYW4gSW1tdXRhYmxlIE1hdHJpeCBpbnN0YW5jZSIpfSxyLnByb3RvdHlwZS5taW49ZnVuY3Rpb24oKXtpZihudWxsPT09dGhpcy5fbWluKXt2YXIgdD1udWxsO3RoaXMuZm9yRWFjaCgoZnVuY3Rpb24obil7KG51bGw9PT10fHxlKG4sdCkpJiYodD1uKX0pKSx0aGlzLl9taW49bnVsbCE9PXQ/dDp2b2lkIDB9cmV0dXJuIHRoaXMuX21pbn0sci5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuX21heCl7dmFyIHQ9bnVsbDt0aGlzLmZvckVhY2goKGZ1bmN0aW9uKG4peyhudWxsPT09dHx8ZSh0LG4pKSYmKHQ9bil9KSksdGhpcy5fbWF4PW51bGwhPT10P3Q6dm9pZCAwfXJldHVybiB0aGlzLl9tYXh9LHJ9KSx7aXNDbGFzczohMH0pLGttPWlkKCJJbmRleCIsWyJJbW11dGFibGVEZW5zZU1hdHJpeCJdLCh0PT57dmFye0ltbXV0YWJsZURlbnNlTWF0cml4OmV9PXQ7ZnVuY3Rpb24gbih0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvciIpO3RoaXMuX2RpbWVuc2lvbnM9W10sdGhpcy5faXNTY2FsYXI9ITA7Zm9yKHZhciBlPTAsaT1hcmd1bWVudHMubGVuZ3RoO2U8aTtlKyspe3ZhciBvPWFyZ3VtZW50c1tlXTtpZihYZihvKSl0aGlzLl9kaW1lbnNpb25zLnB1c2gobyksdGhpcy5faXNTY2FsYXI9ITE7ZWxzZSBpZihBcnJheS5pc0FycmF5KG8pfHxxZihvKSl7dmFyIHM9cihvLnZhbHVlT2YoKSk7dGhpcy5fZGltZW5zaW9ucy5wdXNoKHMpO3ZhciBhPXMuc2l6ZSgpOygxIT09YS5sZW5ndGh8fDEhPT1hWzBdKSYmKHRoaXMuX2lzU2NhbGFyPSExKX1lbHNlIGlmKCJudW1iZXIiPT10eXBlb2Ygbyl0aGlzLl9kaW1lbnNpb25zLnB1c2gocihbb10pKTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2Ygbyl0aHJvdyBuZXcgVHlwZUVycm9yKCJEaW1lbnNpb24gbXVzdCBiZSBhbiBBcnJheSwgTWF0cml4LCBudW1iZXIsIHN0cmluZywgb3IgUmFuZ2UiKTt0aGlzLl9kaW1lbnNpb25zLnB1c2gobyl9fX1mdW5jdGlvbiByKHQpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZigibnVtYmVyIiE9dHlwZW9mIHRbbl18fCFNcCh0W25dKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbmRleCBwYXJhbWV0ZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlciBudW1iZXJzIik7cmV0dXJuIG5ldyBlKHQpfXJldHVybiBuLnByb3RvdHlwZS50eXBlPSJJbmRleCIsbi5wcm90b3R5cGUuaXNJbmRleD0hMCxuLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBuO3JldHVybiB0Ll9kaW1lbnNpb25zPXdwKHRoaXMuX2RpbWVuc2lvbnMpLHQuX2lzU2NhbGFyPXRoaXMuX2lzU2NhbGFyLHR9LG4uY3JlYXRlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBuO3JldHVybiBuLmFwcGx5KGUsdCksZX0sbi5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9kaW1lbnNpb25zLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9kaW1lbnNpb25zW2VdO3RbZV09InN0cmluZyI9PXR5cGVvZiByPzE6ci5zaXplKClbMF19cmV0dXJuIHR9LG4ucHJvdG90eXBlLm1heD1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTAsbj10aGlzLl9kaW1lbnNpb25zLmxlbmd0aDtlPG47ZSsrKXt2YXIgcj10aGlzLl9kaW1lbnNpb25zW2VdO3RbZV09InN0cmluZyI9PXR5cGVvZiByP3I6ci5tYXgoKX1yZXR1cm4gdH0sbi5wcm90b3R5cGUubWluPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuX2RpbWVuc2lvbnNbZV07dFtlXT0ic3RyaW5nIj09dHlwZW9mIHI/cjpyLm1pbigpfXJldHVybiB0fSxuLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dGhpcy5fZGltZW5zaW9ucy5sZW5ndGg7ZTxuO2UrKyl0KHRoaXMuX2RpbWVuc2lvbnNbZV0sZSx0aGlzKX0sbi5wcm90b3R5cGUuZGltZW5zaW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kaW1lbnNpb25zW3RdfHxudWxsfSxuLnByb3RvdHlwZS5pc09iamVjdFByb3BlcnR5PWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLl9kaW1lbnNpb25zLmxlbmd0aCYmInN0cmluZyI9PXR5cGVvZiB0aGlzLl9kaW1lbnNpb25zWzBdfSxuLnByb3RvdHlwZS5nZXRPYmplY3RQcm9wZXJ0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzT2JqZWN0UHJvcGVydHkoKT90aGlzLl9kaW1lbnNpb25zWzBdOm51bGx9LG4ucHJvdG90eXBlLmlzU2NhbGFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzU2NhbGFyfSxuLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuX2RpbWVuc2lvbnNbZV07dC5wdXNoKCJzdHJpbmciPT10eXBlb2Ygcj9yOnIudG9BcnJheSgpKX1yZXR1cm4gdH0sbi5wcm90b3R5cGUudmFsdWVPZj1uLnByb3RvdHlwZS50b0FycmF5LG4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MCxuPXRoaXMuX2RpbWVuc2lvbnMubGVuZ3RoO2U8bjtlKyspe3ZhciByPXRoaXMuX2RpbWVuc2lvbnNbZV07InN0cmluZyI9PXR5cGVvZiByP3QucHVzaChKU09OLnN0cmluZ2lmeShyKSk6dC5wdXNoKHIudG9TdHJpbmcoKSl9cmV0dXJuIlsiK3Quam9pbigiLCAiKSsiXSJ9LG4ucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttYXRoanM6IkluZGV4IixkaW1lbnNpb25zOnRoaXMuX2RpbWVuc2lvbnN9fSxuLmZyb21KU09OPWZ1bmN0aW9uKHQpe3JldHVybiBuLmNyZWF0ZSh0LmRpbWVuc2lvbnMpfSxufSkse2lzQ2xhc3M6ITB9KSx6bT0iYXRhbjIiLGptPWlkKHptLFsidHlwZWQiLCJtYXRyaXgiLCJlcXVhbFNjYWxhciIsIkJpZ051bWJlciIsIkRlbnNlTWF0cml4IiwiY29uY2F0Il0sKHQ9Pnt2YXJ7dHlwZWQ6ZSxtYXRyaXg6bixlcXVhbFNjYWxhcjpyLEJpZ051bWJlcjppLERlbnNlTWF0cml4Om8sY29uY2F0OnN9PXQsYT1YeSh7dHlwZWQ6ZSxlcXVhbFNjYWxhcjpyfSksdT1XeSh7dHlwZWQ6ZX0pLGM9Snkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6cn0pLGw9Qnkoe3R5cGVkOmUsZXF1YWxTY2FsYXI6cn0pLGg9a3koe3R5cGVkOmUsRGVuc2VNYXRyaXg6b30pLGY9WXkoe3R5cGVkOmUsbWF0cml4Om4sY29uY2F0OnN9KTtyZXR1cm4gZSh6bSx7Im51bWJlciwgbnVtYmVyIjpNYXRoLmF0YW4yLCJCaWdOdW1iZXIsIEJpZ051bWJlciI6KHQsZSk9PmkuYXRhbjIodCxlKX0sZih7c2NhbGFyOiJudW1iZXIgfCBCaWdOdW1iZXIiLFNTOmMsRFM6dSxTRDphLFNzOmwsc1M6aH0pKX0pKSxVbT1pZCgiYWRkIixbInR5cGVkIiwibWF0cml4IiwiYWRkU2NhbGFyIiwiZXF1YWxTY2FsYXIiLCJEZW5zZU1hdHJpeCIsIlNwYXJzZU1hdHJpeCIsImNvbmNhdCJdLCh0PT57dmFye3R5cGVkOmUsbWF0cml4Om4sYWRkU2NhbGFyOnIsZXF1YWxTY2FsYXI6aSxEZW5zZU1hdHJpeDpvLFNwYXJzZU1hdHJpeDpzLGNvbmNhdDphfT10LHU9ankoe3R5cGVkOmV9KSxjPVV5KHt0eXBlZDplLGVxdWFsU2NhbGFyOml9KSxsPXF5KHt0eXBlZDplLERlbnNlTWF0cml4Om99KSxoPVl5KHt0eXBlZDplLG1hdHJpeDpuLGNvbmNhdDphfSk7cmV0dXJuIGUoImFkZCIseyJhbnksIGFueSI6ciwiYW55LCBhbnksIC4uLmFueSI6ZS5yZWZlclRvU2VsZigodD0+KGUsbixyKT0+e2Zvcih2YXIgaT10KGUsbiksbz0wO288ci5sZW5ndGg7bysrKWk9dChpLHJbb10pO3JldHVybiBpfSkpfSxoKHtlbG9wOnIsRFM6dSxTUzpjLFNzOmx9KSl9KSkscW09aWQoImRvdCIsWyJ0eXBlZCIsImFkZFNjYWxhciIsIm11bHRpcGx5U2NhbGFyIiwiY29uaiIsInNpemUiXSwodD0+e3Zhcnt0eXBlZDplLGFkZFNjYWxhcjpuLG11bHRpcGx5U2NhbGFyOnIsY29uajppLHNpemU6b309dDtyZXR1cm4gZSgiZG90Iix7IkFycmF5IHwgRGVuc2VNYXRyaXgsIEFycmF5IHwgRGVuc2VNYXRyaXgiOmZ1bmN0aW9uKHQsbyl7dmFyIHU9cyh0LG8pLGM9cWYodCk/dC5fZGF0YTp0LGw9cWYodCk/dC5fZGF0YXR5cGU6dm9pZCAwLGg9cWYobyk/by5fZGF0YTpvLGY9cWYobyk/by5fZGF0YXR5cGU6dm9pZCAwLHA9Mj09PWEodCkubGVuZ3RoLGQ9Mj09PWEobykubGVuZ3RoLGc9bix5PXI7aWYobCYmZiYmbD09PWYmJiJzdHJpbmciPT10eXBlb2YgbCl7dmFyIG09bDtnPWUuZmluZChuLFttLG1dKSx5PWUuZmluZChyLFttLG1dKX1pZighcCYmIWQpe2Zvcih2YXIgdj15KGkoY1swXSksaFswXSksXz0xO188dTtfKyspdj1nKHYseShpKGNbX10pLGhbX10pKTtyZXR1cm4gdn1pZighcCYmZCl7Zm9yKHZhciB4PXkoaShjWzBdKSxoWzBdWzBdKSx3PTE7dzx1O3crKyl4PWcoeCx5KGkoY1t3XSksaFt3XVswXSkpO3JldHVybiB4fWlmKHAmJiFkKXtmb3IodmFyIGI9eShpKGNbMF1bMF0pLGhbMF0pLEQ9MTtEPHU7RCsrKWI9ZyhiLHkoaShjW0RdWzBdKSxoW0RdKSk7cmV0dXJuIGJ9aWYocCYmZCl7Zm9yKHZhciBFPXkoaShjWzBdWzBdKSxoWzBdWzBdKSxDPTE7Qzx1O0MrKylFPWcoRSx5KGkoY1tDXVswXSksaFtDXVswXSkpO3JldHVybiBFfX0sIlNwYXJzZU1hdHJpeCwgU3BhcnNlTWF0cml4IjpmdW5jdGlvbih0LGUpe3ModCxlKTtmb3IodmFyIGk9dC5faW5kZXgsbz10Ll92YWx1ZXMsYT1lLl9pbmRleCx1PWUuX3ZhbHVlcyxjPTAsbD1uLGg9cixmPTAscD0wO2Y8aS5sZW5ndGgmJnA8YS5sZW5ndGg7KXt2YXIgZD1pW2ZdLGc9YVtwXTtkPGc/ZisrOmQ+Zz9wKys6ZD09PWcmJihjPWwoYyxoKG9bZl0sdVtwXSkpLGYrKyxwKyspfXJldHVybiBjfX0pO2Z1bmN0aW9uIHModCxlKXt2YXIgbixyLGk9YSh0KSxvPWEoZSk7aWYoMT09PWkubGVuZ3RoKW49aVswXTtlbHNle2lmKDIhPT1pLmxlbmd0aHx8MSE9PWlbMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkV4cGVjdGVkIGEgY29sdW1uIHZlY3RvciwgaW5zdGVhZCBnb3QgYSBtYXRyaXggb2Ygc2l6ZSAoIitpLmpvaW4oIiwgIikrIikiKTtuPWlbMF19aWYoMT09PW8ubGVuZ3RoKXI9b1swXTtlbHNle2lmKDIhPT1vLmxlbmd0aHx8MSE9PW9bMV0pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkV4cGVjdGVkIGEgY29sdW1uIHZlY3RvciwgaW5zdGVhZCBnb3QgYSBtYXRyaXggb2Ygc2l6ZSAoIitvLmpvaW4oIiwgIikrIikiKTtyPW9bMF19aWYobiE9PXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlZlY3RvcnMgbXVzdCBoYXZlIGVxdWFsIGxlbmd0aCAoIituKyIgIT0gIityKyIpIik7aWYoMD09PW4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkNhbm5vdCBjYWxjdWxhdGUgdGhlIGRvdCBwcm9kdWN0IG9mIGVtcHR5IHZlY3RvcnMiKTtyZXR1cm4gbn1mdW5jdGlvbiBhKHQpe3JldHVybiBxZih0KT90LnNpemUoKTpvKHQpfX0pKSxWbT0iaW5kZXgiLEdtPWlkKFZtLFsidHlwZWQiLCJJbmRleCJdLCh0PT57dmFye3R5cGVkOmUsSW5kZXg6bn09dDtyZXR1cm4gZShWbSx7Ii4uLm51bWJlciB8IHN0cmluZyB8IEJpZ051bWJlciB8IFJhbmdlIHwgQXJyYXkgfCBNYXRyaXgiOmZ1bmN0aW9uKHQpe3ZhciBlPXQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gUmYodCk/dC50b051bWJlcigpOkFycmF5LmlzQXJyYXkodCl8fHFmKHQpP3QubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gUmYodCk/dC50b051bWJlcigpOnR9KSk6dH0pKSxyPW5ldyBuO3JldHVybiBuLmFwcGx5KHIsZSkscn19KX0pKSxZbT1leSh7Y29uZmlnOkVwfSksWG09aXkoe30pLFdtPWd5KHt9KSxIbT15eSh7fSksWm09dnkoe01hdHJpeDpIbX0pLEttPWdkKHtCaWdOdW1iZXI6WW0sQ29tcGxleDpYbSxEZW5zZU1hdHJpeDpabSxGcmFjdGlvbjpXbX0pLEptPVJ5KHt0eXBlZDpLbX0pLFFtPUZ5KHtCaWdOdW1iZXI6WW0sdHlwZWQ6S219KSwkbT10bSh7dHlwZWQ6S219KSx0dj1OeSh7Y29uZmlnOkVwLHR5cGVkOkttfSksZXY9d3koe3R5cGVkOkttfSksbnY9SHkoe3R5cGVkOkttfSkscnY9TXkoe3R5cGVkOkttfSksaXY9SXkoe01hdHJpeDpIbSxlcXVhbFNjYWxhcjp0dix0eXBlZDpLbX0pLG92PVR5KHtGcmFjdGlvbjpXbSx0eXBlZDpLbX0pLHN2PUx5KHtEZW5zZU1hdHJpeDpabSxNYXRyaXg6SG0sU3BhcnNlTWF0cml4Oml2LHR5cGVkOkttfSksYXY9eG0oe2JpZ251bWJlcjpRbSxmcmFjdGlvbjpvdixudW1iZXI6cnZ9KSx1dj1obSh7bWF0cml4OnN2LGNvbmZpZzpFcCx0eXBlZDpLbX0pLGN2PXBtKHttYXRyaXg6c3YsdHlwZWQ6S219KSxsdj1fbSh7bWF0cml4OnN2LHR5cGVkOkttfSksaHY9bm0oe2lzSW50ZWdlcjpldixtYXRyaXg6c3YsdHlwZWQ6S219KSxmdj1FbSh7RGVuc2VNYXRyaXg6Wm0sY29uY2F0Omh2LGRpdmlkZVNjYWxhcjpibSh7bnVtZXJpYzphdix0eXBlZDpLbX0pLGVxdWFsU2NhbGFyOnR2LG1hdHJpeDpzdix0eXBlZDpLbX0pLHB2PVBtKHtEZW5zZU1hdHJpeDpabSxjb25jYXQ6aHYsY29uZmlnOkVwLG1hdHJpeDpzdix0eXBlZDpLbX0pLGR2PWltKHtCaWdOdW1iZXI6WW0sY29uZmlnOkVwLG1hdHJpeDpzdix0eXBlZDpLbX0pLGd2PVNtKHtEZW5zZU1hdHJpeDpabSxjb25jYXQ6aHYsY29uZmlnOkVwLG1hdHJpeDpzdix0eXBlZDpLbX0pLHl2PVVtKHtEZW5zZU1hdHJpeDpabSxTcGFyc2VNYXRyaXg6aXYsYWRkU2NhbGFyOkptLGNvbmNhdDpodixlcXVhbFNjYWxhcjp0dixtYXRyaXg6c3YsdHlwZWQ6S219KSxtdj1xbSh7YWRkU2NhbGFyOkptLGNvbmo6JG0sbXVsdGlwbHlTY2FsYXI6bnYsc2l6ZTp1dix0eXBlZDpLbX0pLHZ2PWttKHtJbW11dGFibGVEZW5zZU1hdHJpeDpCbSh7RGVuc2VNYXRyaXg6Wm0sc21hbGxlcjpndn0pfSksX3Y9VG0oe0RlbnNlTWF0cml4OlptLGNvbmNhdDpodixjb25maWc6RXAsbWF0cml4OnN2LHR5cGVkOkttfSkseHY9S3koe2FkZFNjYWxhcjpKbSxkb3Q6bXYsZXF1YWxTY2FsYXI6dHYsbWF0cml4OnN2LG11bHRpcGx5U2NhbGFyOm52LHR5cGVkOkttfSksd3Y9SW0oe0RlbnNlTWF0cml4OlptLGNvbmNhdDpodixjb25maWc6RXAsbWF0cml4OnN2LHR5cGVkOkttfSksYnY9R20oe0luZGV4OnZ2LHR5cGVkOkttfSksRHY9Y20oe2JpZ251bWJlcjpRbSxtYXRyaXg6c3YsY29uZmlnOkVwLGxhcmdlcjpfdixsYXJnZXJFcTpwdixzbWFsbGVyOmd2LHNtYWxsZXJFcTp3dix0eXBlZDpLbX0pLEV2PWptKHtCaWdOdW1iZXI6WW0sRGVuc2VNYXRyaXg6Wm0sY29uY2F0Omh2LGVxdWFsU2NhbGFyOnR2LG1hdHJpeDpzdix0eXBlZDpLbX0pO2Z1bmN0aW9uIEN2KHQsZSxuKXtjb25zdCByPXN2KFtbZVswXVswXSxlWzBdWzFdXSxbZVsxXVswXSxlWzFdWzFdXV0pLGk9ZVswXVsyXSxvPWVbMV1bMl0scz1uLGE9ZnVuY3Rpb24odCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgcj10W25dLGk9clswXSpyWzBdK3JbMV0qclsxXSxvPU1hdGguc3FydChpKTtlLnB1c2gobyl9cmV0dXJuIGV9KHQudG9BcnJheSgpLm1hcCgodD0+dC5zbGljZSgwLDIpKSkpLHU9ZnYoZHYoc3YoYSkuc2l6ZSgpKSxhKSxjPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgbj10Lmxlbmd0aCxyPVtdO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtsZXQgbz0wO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKW89dFtuLXItMV0rbyplW2ldO3IucHVzaChvKX1yZXR1cm4gcn0ocyxFdih4digtMSx0LnN1YnNldChidihEdigwLHN2KHQpLnNpemUoKVswXSksMikpKSxhKSk7bGV0IGw9ZHYoMix0LnNpemUoKVswXSk7Y29uc3QgaD14dih0LnN1YnNldChidihEdigwLHQuc2l6ZSgpWzBdKSwwKSksdSpjKSxmPXh2KHQuc3Vic2V0KGJ2KER2KDAsdC5zaXplKClbMF0pLDEpKSx1KmMpLHA9c3YoW1toLDBdLFtmLDBdXSk7bD1jdihwLGJ2KER2KDAscC5zaXplKClbMF0pLDApKTtjb25zdCBkPXN2KFtpLG9dKSxnPXh2KHIsbCkseT1kLnJlc2hhcGUoWzIsMV0pO3JldHVybiBsdih5dihnLHkpKS50b0FycmF5KCl9ZnVuY3Rpb24gU3YodD1bXSxlLG4scil7Y29uc3QgaT1zdihmdW5jdGlvbih0KXtpZigxIT09dC5sZW5ndGh8fDMhPT10WzBdLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIklucHV0IG1hdHJpeCBtdXN0IGJlIGEgMXgzIG9yIDN4MSBtYXRyaXgiKTtyZXR1cm5bW3RbMF1bMF1dLFt0WzBdWzFdXSxbdFswXVsyXV0sWzFdXX0odCkpLG89c3YoZSkscz14dihvLGkpO3JldHVybiBDdihsdihzKSxuLHIpfXZhciBBdj1PYmplY3QuZGVmaW5lUHJvcGVydHksTnY9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsSXY9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsTXY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxGdj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFR2PU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsT3Y9TWF0aC5wb3csTHY9KHQsZSxuKT0+ZSBpbiB0P0F2KHQsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOnRbZV09bixQdj0odCxlKT0+e2Zvcih2YXIgbiBpbiBlfHwoZT17fSkpRnYuY2FsbChlLG4pJiZMdih0LG4sZVtuXSk7aWYoTXYpZm9yKHZhciBuIG9mIE12KGUpKVR2LmNhbGwoZSxuKSYmTHYodCxuLGVbbl0pO3JldHVybiB0fSxSdj0odCxlKT0+TnYodCxJdihlKSk7ZnVuY3Rpb24gQnYodCl7cmV0dXJuKG5ldyBaaCkuc2V0KC4uLnQpfWZ1bmN0aW9uIGt2KHQsZSxuKXt0cnl7Y29uc3Qgcj1WdC50cmFuc2Zlck1hdHJpeDM0RnJvbUtpdHRpMlRocmVlKHQpLGk9VnQudHJhbnNmZXJNYXRyaXgzM0Zyb21LaXR0aTJUaHJlZShlKSxvPVZ0LnRyYW5zZmVyTWF0cml4MzRGcm9tS2l0dGkyVGhyZWUobikscz1CdihyKSxhPUJ2KGkpLHU9QnYobyk7cmV0dXJue2NvbXBvc2VNYXRyaXg0OnUuY2xvbmUoKS5wcmVtdWx0aXBseShhKS5wcmVtdWx0aXBseShzKSxQTTpzLFJNOmEsVE06dX19Y2F0Y2godCl7fX1jb25zdCB6dj0odCxlKT0+ZS5zb21lKChlPT5mdW5jdGlvbih0LGUsbil7cmV0dXJuISh0Lmxlbmd0aCE9PWV8fHQuc29tZSgodD0+dC5sZW5ndGghPT1uKSkpfSh0LGVbMF0sZVsxXSkpKSxqdj10PT57dmFyIGU7cmV0dXJuISEoKG51bGw9PShlPXQuZmlzaGV5ZURpc3RvcnRpb24pP3ZvaWQgMDplLmxlbmd0aCk+MCYmenYodC5QLFtbMyw0XSxbNCw0XV0pJiZ6dih0LlQsW1szLDRdLFs0LDRdXSkpfSxVdj0odCxlKT0+e2lmKCExIT09anYoZSkpcmV0dXJuKG51bGw9PWU/dm9pZCAwOmUuY2FtZXJhVHlwZSk9PT1KdC5PbW5pQ2FtZXJhPygodCxlKT0+e2lmKCExPT09anYoZSkpcmV0dXJuO2NvbnN0e1A6bixmaXNoZXllRGlzdG9ydGlvbjpyLFQ6aX09ZSxvPW5ldyB2aCh0LngsdC55LHQueikscz1CdihWdC50cmFuc2Zlck1hdHJpeDM0RnJvbUtpdHRpMlRocmVlKGkpKSxhPUJ2KFZ0LnRyYW5zZmVyTWF0cml4MzRGcm9tS2l0dGkyVGhyZWUobikpLHU9by5hcHBseU1hdHJpeDQocyksYz1PdihPdih1LngsMikrT3YodS55LDIpLC41KSxsPU1hdGguYXRhbih1LnovYyksaD1yLnJlZHVjZSgoKHQsZSxuKT0+dCtlKk92KGwsbikpLDApO3JldHVybiB1Lng9dS54L2MqaCx1Lnk9dS55L2MqaCx1Lno9MSx1LmFwcGx5TWF0cml4NChhKX0pKHQsZSk6KG51bGw9PWU/dm9pZCAwOmUuY2FtZXJhVHlwZSk9PT1KdC5LYW5uYWxhQnJhbmR0PygodCxlKT0+e2NvbnN0e1A6bixUOnIsZmlzaGV5ZURpc3RvcnRpb246aX09ZSxvPVt0LngsdC55LHQueiwxXSxzPXIubWFwKCh0PT50LnJlZHVjZSgoKHQsZSxuKT0+dCtlKm9bbl0pLDApKSksYT1zWzBdLHU9c1sxXSxjPXNbMl07aWYoIShjPj0uMDEmJmlzRmluaXRlKGMpKSlyZXR1cm47Y29uc3QgbD1bW25bMF1bMF0sblswXVsxXV0sW25bMV1bMF0sblsxXVsxXV1dLGg9blswXVsyXSxmPW5bMV1bMl0scD1NYXRoLnNxcnQoYSphK3UqdSksZD1NYXRoLmF0YW4yKHAsYyksZz1kK2kucmVkdWNlKCgodCxlLG4pPT50K2UqTWF0aC5wb3coZCwyKm4rMykpLDApO2xldCB5LG07cmV0dXJuIDAhPT1wPyh5PWEqZy9wLG09dSpnL3ApOih5PTAsbT0wKSx7eDpsWzBdWzBdKnkrbFswXVsxXSptK2gseTpsWzFdWzBdKnkrbFsxXVsxXSptK2Z9fSkodCxlKToobnVsbD09ZT92b2lkIDA6ZS5jYW1lcmFUeXBlKT09PUp0Lk9tbmlDYW1lcmExMVY/KCh0LGUpPT57aWYoITE9PT1qdihlKSlyZXR1cm47Y29uc3R7UDpuLGZpc2hleWVEaXN0b3J0aW9uOnIsVDppfT1lLG89U3YoW1t0LngsdC55LHQuel1dLGksbixyKTtyZXR1cm4gbmV3IHZoKG9bMF1bMF0sb1swXVsxXSwxKX0pKHQsZSk6dm9pZCAwfTtmdW5jdGlvbiBxdih0LGUpe2NvbnN0IG49bmV3IHZoKHQueCx0LnksdC56KS5hcHBseU1hdHJpeDQoZSk7aWYobi56PDApcmV0dXJuO2NvbnN0IHI9MS9uLnosaT0obmV3IFpoKS5zZXQociwwLDAsMCwwLHIsMCwwLDAsMCxyLDAsMCwwLDAsMSk7cmV0dXJuIG4uYXBwbHlNYXRyaXg0KGkpfWZ1bmN0aW9uIFZ2KHQsZSxuKXtjb25zdCByPWUueC10LngsaT1lLnktdC55LG89bi54LXQueDtyZXR1cm4gcioobi55LXQueSktbyppfWZ1bmN0aW9uIEd2KHQsZSxuPXtjcmVhdGVSYW5nZTohMX0pe3ZhciByO2lmKCFlKXJldHVybnt0cmFuc2ZlclZpZXdEYXRhOltdLHZpZXdSYW5nZVBvaW50TGlzdDpbXX07Y29uc3R7Y3JlYXRlUmFuZ2U6aX09bixvPVV0LmdldEFsbFZpZXdEYXRhKHQpLHM9anYoZSkse1A6YSxSOnUsVDpjfT1lO2xldCBsO2lmKCExPT09cyl7Y29uc3R7Y29tcG9zZU1hdHJpeDQ6dH09bnVsbCE9KHI9a3YoYSx1LGMpKT9yOnt9O2lmKCF0KXJldHVybjtsPXR9Y29uc3QgaD1vLm1hcCgobj0+KHt0eXBlOm4udHlwZSxwb2ludExpc3Q6bi5wb2ludExpc3QubWFwKChlPT5mdW5jdGlvbih0LGUsbil7dmFyIHI7Y29uc3QgaT1uZXcgeGgodC54LHQueSxudWxsIT0ocj1udWxsPT10P3ZvaWQgMDp0LnopP3I6MSksbz0obmV3IFpoKS5tYWtlUm90YXRpb25aKG4pLHM9KG5ldyBaaCkubWFrZVRyYW5zbGF0aW9uKGUueCxlLnksZS56KSxhPShuZXcgWmgpLm1ha2VUcmFuc2xhdGlvbigtZS54LC1lLnksLWUueik7cmV0dXJuIGkuY2xvbmUoKS5hcHBseU1hdHJpeDQoYSkuYXBwbHlNYXRyaXg0KG8pLmFwcGx5TWF0cml4NChzKX0oZSx0LmNlbnRlcix0LnJvdGF0aW9uKSkpLm1hcCgodD0+cz9Vdih0LGUpOmwmJnF2KHQsbCkpKS5tYXAoKHQ9PntpZih0KXJldHVybntpZDp6bCgpLHg6bnVsbD09dD92b2lkIDA6dC54LHk6bnVsbD09dD92b2lkIDA6dC55fX0pKS5maWx0ZXIoKHQ9PnZvaWQgMCE9PXQpKX0pKSkuZmlsdGVyKCh0PT4wIT09dC5wb2ludExpc3QubGVuZ3RoKSk7aFswXSYmaFswXS5wb2ludExpc3QmJihoWzBdLnBvaW50TGlzdD1oWzBdLnBvaW50TGlzdC5tYXAoKHQ9PlJ2KFB2KHt9LHQpLHtzcGVjaWFsRWRnZTohMH0pKSkpO2xldCBmPVtdO2lmKDY9PT1oLmxlbmd0aCYmITA9PT1pKXtmPWZ1bmN0aW9uKHQpe2NvbnN0IGU9ZnVuY3Rpb24odCl7Y29uc3QgZT10LnNsaWNlKCk7cmV0dXJuIGUuc29ydCgoKHQsZSk9PnQueD09PWUueD9lLnktdC55OnQueC1lLngpKSxlfSh0KSxuPVtdO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtmb3IoO24ubGVuZ3RoPj0yJiZWdihuW24ubGVuZ3RoLTJdLG5bbi5sZW5ndGgtMV0sZVt0XSk8PTA7KW4ucG9wKCk7bi5wdXNoKGVbdF0pfWNvbnN0IHI9W107Zm9yKGxldCB0PWUubGVuZ3RoLTE7dD49MDt0LS0pe2Zvcig7ci5sZW5ndGg+PTImJlZ2KHJbci5sZW5ndGgtMl0scltyLmxlbmd0aC0xXSxlW3RdKTw9MDspci5wb3AoKTtyLnB1c2goZVt0XSl9cmV0dXJuIG4ucG9wKCksci5wb3AoKSxuLmNvbmNhdChyKX0oWy4uLmhbMF0ucG9pbnRMaXN0LC4uLmhbMV0ucG9pbnRMaXN0XSl9cmV0dXJue3RyYW5zZmVyVmlld0RhdGE6aCx2aWV3UmFuZ2VQb2ludExpc3Q6Zn19dmFyIFl2LFh2OyFmdW5jdGlvbih0KXt0W3QuVXBsb2FkPTBdPSJVcGxvYWQiLHRbdC5VcGxvYWRSZXRyeT0xXT0iVXBsb2FkUmV0cnkiLHRbdC5VcGxvYWRGYWlsPTJdPSJVcGxvYWRGYWlsIix0W3QuQW5ub3RhdGlvbj0zXT0iQW5ub3RhdGlvbiIsdFt0LlRlcm1pbmF0ZWQ9NF09IlRlcm1pbmF0ZWQiLHRbdC5GaW5pc2g9NV09IkZpbmlzaCIsdFt0LlB1Ymxpc2g9Nl09IlB1Ymxpc2gifShZdnx8KFl2PXt9KSksZnVuY3Rpb24odCl7dFt0LlJlYWR5PTFdPSJSZWFkeSIsdFt0LkZpcnN0UG9pbnQ9Ml09IkZpcnN0UG9pbnQiLHRbdC5DdWJvaWQ9M109IkN1Ym9pZCJ9KFh2fHwoWHY9e30pKTt2YXIgV3Y9ZnVuY3Rpb24odCxlLG4pe3ZhciByO3JldHVybiBmdW5jdGlvbihpKXtyZXR1cm4gcj1yfHxrbCh0LGUsbiksbmV3IFdvcmtlcihyLGkpfX0oIkx5b2djbTlzYkhWd0xYQnNkV2RwYmkxM1pXSXRkMjl5YTJWeUxXeHZZV1JsY2lBcUx3cDJZWElnZDI5eWEyVnlYMk52WkdVOVpuVnVZM1JwYjI0b2NDbDdJblZ6WlNCemRISnBZM1FpTzJOdmJuTjBJSFk5V3kweExDMHhMQzB4WFR0c1pYUWdTVDBoTVR0bWRXNWpkR2x2YmlCQ0tHVXBlMk52Ym5OMElIUTlMVGNzYnowekxHNDlieTEwTzNKbGRIVnliaUJsUEhRbUppaGxQWFFwTEdVK2J5WW1LR1U5Ynlrc1RXRjBhQzVtYkc5dmNpZ29aUzEwS1M5dUtqSTFOU2w5Wm5WdVkzUnBiMjRnUlNncGUyeGxkQ0JsTzJOdmJuTjBJSFE5Ym1WM0lFRnljbUY1S0RJMU5pa3VabWxzYkNnaUlpa3ViV0Z3S0NncFBUNXVaWGNnUVhKeVlYa29NeWt1Wm1sc2JDZ2lJaWtwTzJadmNpaHNaWFFnYnowd08yODhNakE3YnlzcktYdG1iM0lvWlQwd08yVThNekk3WlNzcktYUmJaVjFiTUYwOU1USTRLelFxWlN4MFcyVmRXekZkUFRBc2RGdGxYVnN5WFQwd08yWnZjaWgwV3pNeVhWc3dYVDB5TlRVc2RGc3pNbDFiTVYwOU1DeDBXek15WFZzeVhUMHdMR1U5TUR0bFBEWXpPMlVyS3lsMFd6TXpLMlZkV3pCZFBUSTFOU3gwV3pNeksyVmRXekZkUFRRck5DcGxMSFJiTXpNclpWMWJNbDA5TUR0bWIzSW9kRnM1TmwxYk1GMDlNalUwTEhSYk9UWmRXekZkUFRJMU5TeDBXemsyWFZzeVhUMHlMR1U5TUR0bFBEWXlPMlVyS3lsMFd6azNLMlZkV3pCZFBUSTFNQzAwS21Vc2RGczVOeXRsWFZzeFhUMHlOVFVzZEZzNU55dGxYVnN5WFQwMkt6UXFaVHRtYjNJb2RGc3hOVGxkV3pCZFBURXNkRnN4TlRsZFd6RmRQVEkxTlN4MFd6RTFPVjFiTWwwOU1qVTBMR1U5TUR0bFBEWTBPMlVyS3lsMFd6RTJNQ3RsWFZzd1hUMHdMSFJiTVRZd0syVmRXekZkUFRJMU1pMWxLalFzZEZzeE5qQXJaVjFiTWwwOU1qVTFPMlp2Y2lobFBUQTdaVHd6TWp0bEt5c3BkRnN5TWpRclpWMWJNRjA5TUN4MFd6SXlOQ3RsWFZzeFhUMHdMSFJiTWpJMEsyVmRXekpkUFRJMU1pMDBLbVY5Y21WMGRYSnVJSFI5WTI5dWMzUWdVajFGS0NrN1puVnVZM1JwYjI0Z2FDaGxMSFFzYnowd0tYdHNaWFFnYmowd0xHRXNlQ3hwTEd3N2REMWJMaTR1ZEYwc2J6MDlQVEVtSmloMFBXTnlaV0YwWlZOdGIyOTBhRU4xY25abFVHOXBiblJ6S0hRdWNtVmtkV05sS0NoNUxHTXBQVDViTGk0dWVTeGpMbmdzWXk1NVhTeGJYU2tzTGpVc0lUQXNVMFZIVFVWT1ZGOU9WVTFDUlZJcEtTeGJhVjA5ZER0amIyNXpkQ0IxUFhRdWJHVnVaM1JvTzJadmNpaGhQVEU3WVR3OWRUdGhLeXNwYkQxMFcyRWxkVjBzWlM1NFBrMWhkR2d1YldsdUtHa3VlQ3hzTG5ncEppWmxMbmc4UFUxaGRHZ3ViV0Y0S0drdWVDeHNMbmdwSmlabExuazhQVTFoZEdndWJXRjRLR2t1ZVN4c0xua3BKaVpwTG5naFBUMXNMbmdtSmloNFBTaGxMbmd0YVM1NEtTb29iQzU1TFdrdWVTa3ZLR3d1ZUMxcExuZ3BLMmt1ZVN3b2FTNTVQVDA5YkM1NWZIeGxMbms4UFhncEppWnVLeXNwTEdrOWJEdHlaWFIxY200Z2JpVXlJVDB3ZldaMWJtTjBhVzl1SUU4b2UzcE5hVzQ2WlN4NlRXRjRPblFzY0c5c2VXZHZibEJ2YVc1MFRHbHpkRHB2TEdGMGRISnBZblYwWlRwdUxIZzZZU3g1T25nc2VqcHBMR052Ykc5eVRHbHpkRHBzTEhaaGJHbGtPblY5S1h0cFppaG9LSHQ0T21Fc2VUcDRmU3h2S1NZbWFUNDlaU1ltYVR3OWRDbHlaWFIxY200Z2RUMDlQU0V4UDFzeExERXdNeTh5TlRVc01UQXlMekkxTlYwNmJGdHVYVDlzVzI1ZExuSm5ZbUV1YzJ4cFkyVW9NQ3d6S1M1dFlYQW9ZejArWXk4eU5UVXBPbHN4TERBc01GMTlablZ1WTNScGIyNGdiU2hsS1h0amIyNXpkQ0IwUFVJb1pTa3NiejFTVzNSZExGdHVMR0VzZUYwOWJ6dHlaWFIxY201YmJpOHlOVFVzWVM4eU5UVXNlQzh5TlRWZGZYSmxkSFZ5YmlCdmJtMWxjM05oWjJVOVpuVnVZM1JwYjI0b2RDbDdZMjl1YzNSN2NHOXphWFJwYjI0NmJ5eGpiMnh2Y2pwdUxHTjFZbTlwWkV4cGMzUTZZU3hqYjJ4dmNreHBjM1E2ZUN4b2FXZG9iR2xuYUhSSmJtUmxlRHBwZlQxMExtUmhkR0U3YkdWMGUyMXZaR2xtYVdWa1FtOTRTV1J6T213OVcxMHNjbVZ6WlhSQmNtVmhjenAxUFZ0ZGZUMTBMbVJoZEdFc2VUMHdPMloxYm1OMGFXOXVJR01vS1h0NUt6MHhmV2xtS0NGdktYSmxkSFZ5Ymp0amIyNXpkQ0JmUFNFaEtHazlQVzUxYkd3L2RtOXBaQ0F3T21rdWJHVnVaM1JvS1Rzb1gzeDhTU2ttSmloc1BWdGRMSFU5VzEwcE8yTnZibk4wSUhjOWJDNXNaVzVuZEdnL1lTNW1hV3gwWlhJb2NqMCtiQzVwYm1Oc2RXUmxjeWh5TG1sa0tTazZZVHRtYjNJb2JHVjBJSEk5TUR0eVBHOHViR1Z1WjNSb08zSXJQVE1wZTJOdmJuTjBJRU05YjF0eVhTeE1QVzliY2lzeFhTeGtQVzliY2lzeVhUdHNaWFFnWnp0cFppaDFMbXhsYm1kMGFEMDlQVEVtSmlGc0xteGxibWQwYUNsb0tIdDRPa01zZVRwTWZTeDFXekJkS1Q5blBXMG9aQ2s2WnoxMk8yVnNjMlVnYVdZb2RTNXNaVzVuZEdoOGZHd3ViR1Z1WjNSb0tYdHNaWFFnY3owaE1UdDNMbk52YldVb1pqMCtlMk52Ym5OMElFMDlUeWg3Y0c5c2VXZHZibEJ2YVc1MFRHbHpkRHBtTG5CdmJIbG5iMjVRYjJsdWRFeHBjM1FzZWsxcGJqcG1MbnBOYVc0c2VrMWhlRHBtTG5wTllYZ3NlRHBETEhrNlRDeDZPbVFzWVhSMGNtbGlkWFJsT21ZdVlYUjBjbWxpZFhSbExHTnZiRzl5VEdsemREcDRMSFpoYkdsa09tWXVkbUZzYVdSOUtUdHlaWFIxY200Z1RUOG9ZeWdwTEdjOVRTeHpQU0V3TENFd0tUb2hNWDBwTENGekppWjFMbXhsYm1kMGFDWW1LSE05ZFM1emIyMWxLR1k5UG1nb2UzZzZReXg1T2t4OUxHWXBQeWhuUFcwb1pDa3NJVEFwT2lFeEtTa3NJWE1tSmlGZkppWW9TVDluUFcwb1pDazZaejEyS1gxbGJITmxJSGN1YzI5dFpTaHpQVDU3WTI5dWMzUWdaajFQS0h0d2IyeDVaMjl1VUc5cGJuUk1hWE4wT25NdWNHOXNlV2R2YmxCdmFXNTBUR2x6ZEN4NlRXbHVPbk11ZWsxcGJpeDZUV0Y0T25NdWVrMWhlQ3g0T2tNc2VUcE1MSG82WkN4aGRIUnlhV0oxZEdVNmN5NWhkSFJ5YVdKMWRHVXNZMjlzYjNKTWFYTjBPbmdzZG1Gc2FXUTZjeTUyWVd4cFpIMHBPM0psZEhWeWJpQm1QeWhqS0Nrc1p6MW1MQ0V3S1RvaE1YMHBPMk52Ym5OMElFRTljejArZTJOdmJuTjBJR1k5VFdGMGFDNW1iRzl2Y2loekx6TXBPM0psZEhWeWJpQnBKaVpwVzJaZFBUMDlNWDA3YVdZb1p5bHBaaWhuV3pCZFBUMDlkbHN3WFNZbVFTaHlLU2x1VzNKZFBUQXNibHR5S3pGZFBUQXNibHR5S3pKZFBUQTdaV3h6Wlh0amIyNXpkRnR6TEdZc1RWMDlaenR1VzNKZFBYTXNibHR5S3pGZFBXWXNibHR5S3pKZFBVMTlaV3h6WlNCcFppaEJLSElwS1c1YmNsMDlNQ3h1VzNJck1WMDlNQ3h1VzNJck1sMDlNRHRsYkhObGUyTnZibk4wVzNNc1ppeE5YVDF0S0dRcE8yNWJjbDA5Y3l4dVczSXJNVjA5Wml4dVczSXJNbDA5VFgxOVNUMWZMSEJ2YzNSTlpYTnpZV2RsS0h0d2IybHVkSE02Ynl4amIyeHZjanB1TEc1MWJUcDVmU2w5TEhBdWFYTkpibEJ2YkhsbmIyNDlhQ3hQWW1wbFkzUXVaR1ZtYVc1bFVISnZjR1Z5ZEhrb2NDd2lYMTlsYzAxdlpIVnNaU0lzZTNaaGJIVmxPaUV3ZlNrc2NIMG9lMzBwT3dvSyIsbnVsbCwhMSk7T2JqZWN0LmRlZmluZVByb3BlcnR5O25ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuc2VnbWVudFN0YXR1cz1LdC5SZWFkeX1zdGF0dXNUb2dnbGUoKXtzd2l0Y2godGhpcy5zZWdtZW50U3RhdHVzKXtjYXNlIEt0LlJlYWR5OnRoaXMuc2VnbWVudFN0YXR1cz1LdC5DaGVjazticmVhaztjYXNlIEt0LkNoZWNrOnRoaXMuc2VnbWVudFN0YXR1cz1LdC5FZGl0O2JyZWFrO2Nhc2UgS3QuRWRpdDp0aGlzLnNlZ21lbnRTdGF0dXM9S3QuUmVhZHl9fXVwZGF0ZVN0YXR1czJFZGl0KCl7dGhpcy5zZWdtZW50U3RhdHVzPUt0LkVkaXR9dXBkYXRlU3RhdHVzMkNoZWNrKCl7dGhpcy5zZWdtZW50U3RhdHVzPUt0LkNoZWNrfXVwZGF0ZVN0YXR1czJSZWFkeSgpe3RoaXMuc2VnbWVudFN0YXR1cz1LdC5SZWFkeX1nZXQgaXNSZWFkeVN0YXR1cygpe3JldHVybiB0aGlzLnNlZ21lbnRTdGF0dXM9PT1LdC5SZWFkeX1nZXQgaXNDaGVja1N0YXR1cygpe3JldHVybiB0aGlzLnNlZ21lbnRTdGF0dXM9PT1LdC5DaGVja31nZXQgaXNFZGl0U3RhdHVzKCl7cmV0dXJuIHRoaXMuc2VnbWVudFN0YXR1cz09PUt0LkVkaXR9fSxuZXcgV3Yoe3R5cGU6Im1vZHVsZSJ9KTt2YXIgSHY9ZWUoKGZ1bmN0aW9uKHQsZSl7KGZ1bmN0aW9uKCl7dmFyIG4scj0iRXhwZWN0ZWQgYSBmdW5jdGlvbiIsaT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIsbz0iX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyIscz0xNixhPTMyLHU9NjQsYz0xMjgsbD0yNTYsaD0xLzAsZj05MDA3MTk5MjU0NzQwOTkxLHA9TmFOLGQ9NDI5NDk2NzI5NSxnPWQtMSx5PWQ+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+PXRoaXMuX192YWx1ZXNfXy5sZW5ndGg7cmV0dXJue2RvbmU6dCx2YWx1ZTp0P246dGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdfX0scW4ucHJvdG90eXBlLnBsYW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPXRoaXM7ciBpbnN0YW5jZW9mIEduOyl7dmFyIGk9VW8ocik7aS5fX2luZGV4X189MCxpLl9fdmFsdWVzX189bixlP28uX193cmFwcGVkX189aTplPWk7dmFyIG89aTtyPXIuX193cmFwcGVkX199cmV0dXJuIG8uX193cmFwcGVkX189dCxlfSxxbi5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX193cmFwcGVkX187aWYodCBpbnN0YW5jZW9mIFhuKXt2YXIgZT10O3JldHVybiB0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCYmKGU9bmV3IFhuKHRoaXMpKSwoZT1lLnJldmVyc2UoKSkuX19hY3Rpb25zX18ucHVzaCh7ZnVuYzpncyxhcmdzOltuc10sdGhpc0FyZzpufSksbmV3IFluKGUsdGhpcy5fX2NoYWluX18pfXJldHVybiB0aGlzLnRocnUobnMpfSxxbi5wcm90b3R5cGUudG9KU09OPXFuLnByb3RvdHlwZS52YWx1ZU9mPXFuLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbigpe3JldHVybiB5aSh0aGlzLl9fd3JhcHBlZF9fLHRoaXMuX19hY3Rpb25zX18pfSxxbi5wcm90b3R5cGUuZmlyc3Q9cW4ucHJvdG90eXBlLmhlYWQsdGUmJihxbi5wcm90b3R5cGVbdGVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxxbn0oKTt2ZT8oKHZlLmV4cG9ydHM9dm4pLl89dm4sbWUuXz12bik6eWUuXz12bn0pLmNhbGwodGUpfSkpO2NvbnN0IFp2PSh0LGUsbik9PntpZihuW2VdKXJldHVybiBudWxsIT09KCh0LGUpPT57Y29uc3Qgbj1NYXRoLm1heCh0LngsZS54KSxyPU1hdGgubWF4KHQueSxlLnkpLGk9TWF0aC5taW4odC54K3Qud2lkdGgsZS54K2Uud2lkdGgpLW4sbz1NYXRoLm1pbih0LnkrdC5oZWlnaHQsZS55K2UuaGVpZ2h0KS1yO3JldHVybiBpPj0wJiZvPj0wP3t4Om4seTpyLHdpZHRoOmksaGVpZ2h0Om99Om51bGx9KSh0LHt4OjAseTowLHdpZHRoOm5bZV0ud2lkdGgsaGVpZ2h0Om5bZV0uaGVpZ2h0fSk7cmV0dXJuITF9O3ZhciBLdj1PYmplY3QuZGVmaW5lUHJvcGVydHksSnY9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsUXY9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsJHY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyx0Xz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGVfPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsbl89KHQsZSxuKT0+ZSBpbiB0P0t2KHQsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOnRbZV09bixyXz0odCxlKT0+e2Zvcih2YXIgbiBpbiBlfHwoZT17fSkpdF8uY2FsbChlLG4pJiZuXyh0LG4sZVtuXSk7aWYoJHYpZm9yKHZhciBuIG9mICR2KGUpKWVfLmNhbGwoZSxuKSYmbl8odCxuLGVbbl0pO3JldHVybiB0fSxpXz0odCxlKT0+SnYodCxRdihlKSk7ZnVuY3Rpb24gb18odCl7dmFyIGU7Y29uc3R7Y3VycmVudERhdGE6bixkaXNwbGF5UG9pbnRDbG91ZExpc3Q6cixzZWxlY3RlZElEOmksaGlnaGxpZ2h0QXR0cmlidXRlOm8saW1hZ2VTaXplczpzLGNvbmZpZzphLHBvbHlnb25MaXN0OnUsc2VsZWN0ZWRJRHM6Y309dCxsPXtmaWxsOiJ0cmFuc3BhcmVudCIsY29sb3I6ImdyZWVuIn07bGV0IGg9W107cmV0dXJuIG51bGw9PShlPW51bGw9PW4/dm9pZCAwOm4ubWFwcGluZ0ltZ0xpc3QpfHxlLmZvckVhY2goKHQ9Pnt2YXIgZSxuLGYscDtjb25zdCBkPXIucmVkdWNlKCgoZSxuKT0+e3ZhciByLHU7Y29uc3QgYz1uLmlkPT09aXx8bz09PW4uYXR0cmlidXRlLHt0cmFuc2ZlclZpZXdEYXRhOmgsdmlld1JhbmdlUG9pbnRMaXN0OmZ9PW51bGwhPShyPUd2KG4sdC5jYWxpYix7Y3JlYXRlUmFuZ2U6Y30pKT9yOnt9O2lmKCFofHwhZilyZXR1cm5bXTtjb25zdCBwPWgucmVkdWNlKCgodCxlKT0+ImxpbmUiPT09ZS50eXBlP1suLi50LC4uLmUucG9pbnRMaXN0XTp0KSxbXSksZD1pXyhyXyh7fSwodD0+e2xldCBlPTEvMCxuPTEvMCxyPS0xLzAsaT0tMS8wO2Zvcihjb25zdCBvIG9mIHQpZT1NYXRoLm1pbihlLG8ueCksbj1NYXRoLm1pbihuLG8ueSkscj1NYXRoLm1heChyLG8ueCksaT1NYXRoLm1heChpLG8ueSk7cmV0dXJue3g6ZSx5Om4sd2lkdGg6ci1lLGhlaWdodDppLW59fSkocCkpLHtpbWFnZU5hbWU6dC5wYXRofSk7aWYoIVp2KGQsdC5wYXRoLHMpKXJldHVybiBlO2NvbnN0IGc9bnVsbD09KHU9RnQuZ2V0Q29sb3JGcm9tQ29uZmlnKHthdHRyaWJ1dGU6bi5hdHRyaWJ1dGV9LGlfKHJfKHt9LGEpLHthdHRyaWJ1dGVDb25maWd1cmFibGU6ITB9KSx7fSkpP3ZvaWQgMDp1LnN0cm9rZSx5PSgoe3ZpZXdEYXRhUG9pbnRMaXN0OnQscG9pbnRDbG91ZEJveDplLGRlZmF1bHRWaWV3U3R5bGU6bixzdHJva2U6cn0pPT50P3QubWFwKCh0PT4oe3R5cGU6dC50eXBlLGFubm90YXRpb246aV8ocl8oe2lkOmUuaWQscG9pbnRMaXN0OnQucG9pbnRMaXN0fSxuKSx7c3Ryb2tlOnJ9KX0pKSk6W10pKHt2aWV3RGF0YVBvaW50TGlzdDpoLHBvaW50Q2xvdWRCb3g6bixkZWZhdWx0Vmlld1N0eWxlOmwsc3Ryb2tlOmd9KSxtPVsuLi5lLC4uLnldO3JldHVybihudWxsPT1mP3ZvaWQgMDpmLmxlbmd0aCk+MCYmbS51bnNoaWZ0KHt0eXBlOiJwb2x5Z29uIixhbm5vdGF0aW9uOmlfKHJfKHtpZDppLHBvaW50TGlzdDpmfSxsKSx7c3Ryb2tlOmcsZmlsbDoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpIn0pfSksbX0pLFtdKSxnPXNbbnVsbCE9KGU9bnVsbD09dD92b2lkIDA6dC5wYXRoKT9lOiIiXTtnJiZIdi5pc051bWJlcihudWxsPT0obj1udWxsPT10P3ZvaWQgMDp0LmNhbGliKT92b2lkIDA6bi5ncm91bmRIZWlnaHQpJiZ1LmZvckVhY2goKGU9Pntjb25zdCBuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtpZighZXx8IW4pcmV0dXJuO2NvbnN0IGk9anYoZSkse1A6byxSOnMsVDphfT1lO2xldCB1O2lmKCExPT09aSl7Y29uc3R7Y29tcG9zZU1hdHJpeDQ6dH09bnVsbCE9KHI9a3YobyxzLGEpKT9yOnt9O2lmKCF0KXJldHVybjt1PXR9Y29uc3QgYz1bXTtyZXR1cm4gdC5mb3JFYWNoKCh0PT57bGV0IG47aWYobj1pP1V2KHQsZSk6dSYmcXYodCx1KSxuKXtjb25zdHt4OnQseTplfT1uO2MucHVzaCh7eDp0LHk6ZX0pfX0pKSxjLnNvbWUoKHQ9PnQueD4wJiZ0Lng8bi53aWR0aCYmdC55PjAmJnQueTxuLmhlaWdodCkpP2M6dm9pZCAwfShlLnBvaW50TGlzdC5tYXAoKGU9Pnt2YXIgbjtyZXR1cm4gaV8ocl8oe30sZSkse3o6bnVsbD09KG49bnVsbD09dD92b2lkIDA6dC5jYWxpYik/dm9pZCAwOm4uZ3JvdW5kSGVpZ2h0fSl9KSksbnVsbD09dD92b2lkIDA6dC5jYWxpYixnKTtpZihuKXtjb25zdCB0PUZ0LmdldENvbG9yRnJvbUNvbmZpZyh7YXR0cmlidXRlOmUuYXR0cmlidXRlfSxpXyhyXyh7fSxhKSx7YXR0cmlidXRlQ29uZmlndXJhYmxlOiEwfSkse30pO2QucHVzaCh7dHlwZToicG9seWdvbiIsYW5ub3RhdGlvbjppXyhyXyh7aWQ6ZS5pZCxwb2ludExpc3Q6bn0sbCkse3N0cm9rZTpudWxsPT10P3ZvaWQgMDp0LnN0cm9rZSxmaWxsOmMuaW5jbHVkZXMoZS5pZCk/bnVsbD09dD92b2lkIDA6dC5maWxsOiJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNikifSl9KX19KSksaC5wdXNoKHthbm5vdGF0aW9uczpkLHVybDpudWxsPT10P3ZvaWQgMDp0LnVybCxmYWxsYmFja1VybDpudWxsIT0oZj1udWxsPT10P3ZvaWQgMDp0LmZhbGxiYWNrVXJsKT9mOiIiLGNhbE5hbWU6bnVsbD09KHA9bnVsbD09dD92b2lkIDA6dC5jYWxpYik/dm9pZCAwOnAuY2FsTmFtZSxjYWxpYjpudWxsPT10P3ZvaWQgMDp0LmNhbGliLHBhdGg6bnVsbD09dD92b2lkIDA6dC5wYXRofSl9KSksaH1vbm1lc3NhZ2U9dD0+e2NvbnN0e2N1cnJlbnREYXRhOmUsZGlzcGxheVBvaW50Q2xvdWRMaXN0Om4sc2VsZWN0ZWRJRDpyLGhpZ2hsaWdodEF0dHJpYnV0ZTppLGltYWdlU2l6ZXM6byxjb25maWc6cyxwb2x5Z29uTGlzdDphLHNlbGVjdGVkSURzOnV9PXQuZGF0YSxjPW9fKHtjdXJyZW50RGF0YTplLGRpc3BsYXlQb2ludENsb3VkTGlzdDpuLHNlbGVjdGVkSUQ6cixoaWdobGlnaHRBdHRyaWJ1dGU6aSxpbWFnZVNpemVzOm8sY29uZmlnOnMscG9seWdvbkxpc3Q6YSxzZWxlY3RlZElEczp1fSk7cG9zdE1lc3NhZ2UoYyl9fSgpOwoK",null,!1);module.exports=WorkerFactory;