@gnwebsoft/ui 4.0.3 → 4.0.5

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 (335) hide show
  1. package/dist/{chunk-DKD73ADK.cjs → chunk-2QTXS736.cjs} +28 -77
  2. package/dist/{chunk-DS524L7W.cjs → chunk-3RZ4JNO3.cjs} +5 -5
  3. package/dist/chunk-3TYKVE3E.js +2514 -0
  4. package/dist/chunk-HKO2FXDM.js +2232 -0
  5. package/dist/chunk-LUW7V5GI.cjs +1 -1
  6. package/dist/chunk-MVPLBJRK.cjs +1 -1
  7. package/dist/{chunk-M3NVOZ7L.cjs → chunk-UBPAGZNC.cjs} +8 -6
  8. package/dist/chunk-XN3KVY4J.js +467 -0
  9. package/dist/chunk-XTPFOURJ.cjs +72 -0
  10. package/dist/chunk-Y3QTSDLJ.cjs +1 -1
  11. package/dist/core/api/ApiClient.d.ts +329 -0
  12. package/dist/core/api/ApiClient.d.ts.map +1 -0
  13. package/dist/core/api/CorrelationIdGenerator.d.ts +52 -0
  14. package/dist/core/api/CorrelationIdGenerator.d.ts.map +1 -0
  15. package/dist/core/api/Errors/ErrorNormalizer.d.ts +106 -0
  16. package/dist/core/api/Errors/ErrorNormalizer.d.ts.map +1 -0
  17. package/dist/core/api/Interceptors/InterceptorManager.d.ts +236 -0
  18. package/dist/core/api/Interceptors/InterceptorManager.d.ts.map +1 -0
  19. package/dist/core/api/Models/FilterModel.d.ts +22 -0
  20. package/dist/core/api/Models/FilterModel.d.ts.map +1 -0
  21. package/dist/core/api/Models/QueryParams.d.ts +13 -0
  22. package/dist/core/api/Models/QueryParams.d.ts.map +1 -0
  23. package/dist/core/api/Models/index.d.ts +3 -0
  24. package/dist/core/api/Models/index.d.ts.map +1 -0
  25. package/dist/core/api/RequestManager.d.ts +142 -0
  26. package/dist/core/api/RequestManager.d.ts.map +1 -0
  27. package/dist/core/api/Retry/RetryHandler.d.ts +100 -0
  28. package/dist/core/api/Retry/RetryHandler.d.ts.map +1 -0
  29. package/dist/core/api/Signals/SignalManager.d.ts +153 -0
  30. package/dist/core/api/Signals/SignalManager.d.ts.map +1 -0
  31. package/dist/core/api/Utils/ResponseParser.d.ts +105 -0
  32. package/dist/core/api/Utils/ResponseParser.d.ts.map +1 -0
  33. package/dist/core/api/Utils/UrlBuilder.d.ts +111 -0
  34. package/dist/core/api/Utils/UrlBuilder.d.ts.map +1 -0
  35. package/dist/core/api/createApiClient.d.ts +265 -0
  36. package/dist/core/api/createApiClient.d.ts.map +1 -0
  37. package/dist/core/api/index.d.ts +7 -0
  38. package/dist/core/api/index.d.ts.map +1 -0
  39. package/dist/core/api/types/ApiError.d.ts +17 -0
  40. package/dist/core/api/types/ApiError.d.ts.map +1 -0
  41. package/dist/core/api/types/ApiResponse.d.ts +76 -0
  42. package/dist/core/api/types/ApiResponse.d.ts.map +1 -0
  43. package/dist/core/api/types/CancelToken.d.ts +15 -0
  44. package/dist/core/api/types/CancelToken.d.ts.map +1 -0
  45. package/dist/core/api/types/ErrorInterceptor.d.ts +3 -0
  46. package/dist/core/api/types/ErrorInterceptor.d.ts.map +1 -0
  47. package/dist/core/api/types/ErrorResponseData.d.ts +68 -0
  48. package/dist/core/api/types/ErrorResponseData.d.ts.map +1 -0
  49. package/dist/core/api/types/RequestConfig.d.ts +21 -0
  50. package/dist/core/api/types/RequestConfig.d.ts.map +1 -0
  51. package/dist/core/api/types/RequestInterceptor.d.ts +3 -0
  52. package/dist/core/api/types/RequestInterceptor.d.ts.map +1 -0
  53. package/dist/core/api/types/ResponseInterceptor.d.ts +3 -0
  54. package/dist/core/api/types/ResponseInterceptor.d.ts.map +1 -0
  55. package/dist/core/api/types/ValidationErrors.d.ts +7 -0
  56. package/dist/core/api/types/ValidationErrors.d.ts.map +1 -0
  57. package/dist/core/api/types/index.d.ts +10 -0
  58. package/dist/core/api/types/index.d.ts.map +1 -0
  59. package/dist/core/api/useValidationErrors.d.ts +11 -0
  60. package/dist/core/api/useValidationErrors.d.ts.map +1 -0
  61. package/dist/core/components/AuthorizedView/AuthorizedView.d.ts +7 -0
  62. package/dist/core/components/AuthorizedView/AuthorizedView.d.ts.map +1 -0
  63. package/dist/core/components/AuthorizedView/index.d.ts +2 -0
  64. package/dist/core/components/AuthorizedView/index.d.ts.map +1 -0
  65. package/dist/core/components/CancelButton/CancelButton.d.ts +4 -0
  66. package/dist/core/components/CancelButton/CancelButton.d.ts.map +1 -0
  67. package/dist/core/components/CancelButton/index.d.ts +2 -0
  68. package/dist/core/components/CancelButton/index.d.ts.map +1 -0
  69. package/dist/core/components/ClearButton/ClearButton.d.ts +63 -0
  70. package/dist/core/components/ClearButton/ClearButton.d.ts.map +1 -0
  71. package/dist/core/components/ClearButton/index.d.ts +2 -0
  72. package/dist/core/components/ClearButton/index.d.ts.map +1 -0
  73. package/dist/core/components/Containers/SimpleContainer.d.ts +10 -0
  74. package/dist/core/components/Containers/SimpleContainer.d.ts.map +1 -0
  75. package/dist/core/components/Containers/index.d.ts +2 -0
  76. package/dist/core/components/Containers/index.d.ts.map +1 -0
  77. package/dist/core/components/FilterButton/FilterButton.d.ts +86 -0
  78. package/dist/core/components/FilterButton/FilterButton.d.ts.map +1 -0
  79. package/dist/core/components/FilterButton/index.d.ts +2 -0
  80. package/dist/core/components/FilterButton/index.d.ts.map +1 -0
  81. package/dist/core/components/FilterDisplay/FilterChip.d.ts +9 -0
  82. package/dist/core/components/FilterDisplay/FilterChip.d.ts.map +1 -0
  83. package/dist/core/components/FilterDisplay/FilterDisplay.d.ts +10 -0
  84. package/dist/core/components/FilterDisplay/FilterDisplay.d.ts.map +1 -0
  85. package/dist/core/components/FilterDisplay/index.d.ts +3 -0
  86. package/dist/core/components/FilterDisplay/index.d.ts.map +1 -0
  87. package/dist/core/components/FilterWrapper/FilterWrapper.d.ts +99 -0
  88. package/dist/core/components/FilterWrapper/FilterWrapper.d.ts.map +1 -0
  89. package/dist/core/components/FilterWrapper/index.d.ts +2 -0
  90. package/dist/core/components/FilterWrapper/index.d.ts.map +1 -0
  91. package/dist/core/components/Footer/Footer.d.ts +3 -0
  92. package/dist/core/components/Footer/Footer.d.ts.map +1 -0
  93. package/dist/core/components/Footer/index.d.ts +2 -0
  94. package/dist/core/components/Footer/index.d.ts.map +1 -0
  95. package/dist/core/components/LabelText/LabelText.d.ts +103 -0
  96. package/dist/core/components/LabelText/LabelText.d.ts.map +1 -0
  97. package/dist/core/components/LabelText/index.d.ts +2 -0
  98. package/dist/core/components/LabelText/index.d.ts.map +1 -0
  99. package/dist/core/components/RenderIf/RenderIf.d.ts +7 -0
  100. package/dist/core/components/RenderIf/RenderIf.d.ts.map +1 -0
  101. package/dist/core/components/RenderIf/index.d.ts +2 -0
  102. package/dist/core/components/RenderIf/index.d.ts.map +1 -0
  103. package/dist/core/components/SectionBox/SectionBox.d.ts +15 -0
  104. package/dist/core/components/SectionBox/SectionBox.d.ts.map +1 -0
  105. package/dist/core/components/SectionBox/index.d.ts +2 -0
  106. package/dist/core/components/SectionBox/index.d.ts.map +1 -0
  107. package/dist/core/components/SimpleTabs/SimpleTabs.d.ts +17 -0
  108. package/dist/core/components/SimpleTabs/SimpleTabs.d.ts.map +1 -0
  109. package/dist/core/components/SimpleTabs/index.d.ts +2 -0
  110. package/dist/core/components/SimpleTabs/index.d.ts.map +1 -0
  111. package/dist/core/components/SubmitButton/SubmitButton.d.ts +6 -0
  112. package/dist/core/components/SubmitButton/SubmitButton.d.ts.map +1 -0
  113. package/dist/core/components/SubmitButton/index.d.ts +2 -0
  114. package/dist/core/components/SubmitButton/index.d.ts.map +1 -0
  115. package/dist/core/components/WithRef/WithRef.d.ts +14 -0
  116. package/dist/core/components/WithRef/WithRef.d.ts.map +1 -0
  117. package/dist/core/components/WithRef/index.d.ts +2 -0
  118. package/dist/core/components/WithRef/index.d.ts.map +1 -0
  119. package/dist/core/components/index.d.ts +15 -0
  120. package/dist/core/components/index.d.ts.map +1 -0
  121. package/dist/core/config.d.ts +24 -0
  122. package/dist/core/config.d.ts.map +1 -0
  123. package/dist/core/hooks/index.d.ts +3 -0
  124. package/dist/core/hooks/index.d.ts.map +1 -0
  125. package/dist/core/hooks/makeQuery.d.ts +12 -0
  126. package/dist/core/hooks/makeQuery.d.ts.map +1 -0
  127. package/dist/core/hooks/useApiClient.d.ts +3 -0
  128. package/dist/core/hooks/useApiClient.d.ts.map +1 -0
  129. package/dist/core/hooks/useFormErrorHandler.d.ts +35 -0
  130. package/dist/core/hooks/useFormErrorHandler.d.ts.map +1 -0
  131. package/dist/core/hooks/useListView.d.ts +20 -0
  132. package/dist/core/hooks/useListView.d.ts.map +1 -0
  133. package/dist/core/index.cjs +3 -3
  134. package/dist/core/index.d.ts +9 -0
  135. package/dist/core/index.d.ts.map +1 -0
  136. package/dist/core/index.js +1 -1
  137. package/dist/core/models.d.ts +5 -0
  138. package/dist/core/models.d.ts.map +1 -0
  139. package/dist/core/types/FilterLabel.d.ts +6 -0
  140. package/dist/core/types/FilterLabel.d.ts.map +1 -0
  141. package/dist/core/types/ListModels.d.ts +18 -0
  142. package/dist/core/types/ListModels.d.ts.map +1 -0
  143. package/dist/core/types/OptionsRequest.d.ts +4 -0
  144. package/dist/core/types/OptionsRequest.d.ts.map +1 -0
  145. package/dist/core/types/index.d.ts +4 -0
  146. package/dist/core/types/index.d.ts.map +1 -0
  147. package/dist/core/utils/CacheUtility/index.d.ts +15 -0
  148. package/dist/core/utils/CacheUtility/index.d.ts.map +1 -0
  149. package/dist/core/utils/calculateFilterCount.d.ts +2 -0
  150. package/dist/core/utils/calculateFilterCount.d.ts.map +1 -0
  151. package/dist/core/utils/format-time.d.ts +79 -0
  152. package/dist/core/utils/format-time.d.ts.map +1 -0
  153. package/dist/core/utils/getEmptyObject.d.ts +7 -0
  154. package/dist/core/utils/getEmptyObject.d.ts.map +1 -0
  155. package/dist/core/utils/index.d.ts +7 -0
  156. package/dist/core/utils/index.d.ts.map +1 -0
  157. package/dist/core/utils/useStableRowCount.d.ts +9 -0
  158. package/dist/core/utils/useStableRowCount.d.ts.map +1 -0
  159. package/dist/core/utils/watch/core.d.ts +22 -0
  160. package/dist/core/utils/watch/core.d.ts.map +1 -0
  161. package/dist/core/utils/watch/index.d.ts +49 -0
  162. package/dist/core/utils/watch/index.d.ts.map +1 -0
  163. package/dist/core/utils/watch/utilities.d.ts +34 -0
  164. package/dist/core/utils/watch/utilities.d.ts.map +1 -0
  165. package/dist/hooks/index.cjs +1 -1
  166. package/dist/hooks/index.d.ts +3 -0
  167. package/dist/hooks/index.d.ts.map +1 -0
  168. package/dist/hooks/useTransform/enhanced.d.ts +133 -0
  169. package/dist/hooks/useTransform/enhanced.d.ts.map +1 -0
  170. package/dist/hooks/useTransform/index.d.ts +93 -0
  171. package/dist/hooks/useTransform/index.d.ts.map +1 -0
  172. package/dist/index.cjs +6 -24
  173. package/dist/index.d.ts +6 -0
  174. package/dist/index.d.ts.map +1 -0
  175. package/dist/index.js +4 -22
  176. package/dist/types/AsyncSelectPayload.d.ts +9 -0
  177. package/dist/types/AsyncSelectPayload.d.ts.map +1 -0
  178. package/dist/types/OperationResponse.d.ts +5 -0
  179. package/dist/types/OperationResponse.d.ts.map +1 -0
  180. package/dist/types/OptionItem.d.ts +75 -0
  181. package/dist/types/OptionItem.d.ts.map +1 -0
  182. package/dist/types/api.d.ts +127 -0
  183. package/dist/types/api.d.ts.map +1 -0
  184. package/dist/types/events.d.ts +74 -0
  185. package/dist/types/events.d.ts.map +1 -0
  186. package/dist/types/index.cjs +3 -3
  187. package/dist/types/index.d.ts +17 -0
  188. package/dist/types/index.d.ts.map +1 -0
  189. package/dist/types/index.js +1 -1
  190. package/dist/types/utilities.d.ts +458 -0
  191. package/dist/types/utilities.d.ts.map +1 -0
  192. package/dist/utils/api.d.ts +14 -0
  193. package/dist/utils/api.d.ts.map +1 -0
  194. package/dist/utils/api2.d.ts +14 -0
  195. package/dist/utils/api2.d.ts.map +1 -0
  196. package/dist/utils/flattenObjectKeys.d.ts +63 -0
  197. package/dist/utils/flattenObjectKeys.d.ts.map +1 -0
  198. package/dist/utils/getTimezone.d.ts +4 -0
  199. package/dist/utils/getTimezone.d.ts.map +1 -0
  200. package/dist/utils/handleServerErrors.d.ts +70 -0
  201. package/dist/utils/handleServerErrors.d.ts.map +1 -0
  202. package/dist/utils/index.cjs +3 -3
  203. package/dist/utils/index.d.ts +11 -0
  204. package/dist/utils/index.d.ts.map +1 -0
  205. package/dist/utils/index.js +1 -1
  206. package/dist/utils/propertyExists.d.ts +35 -0
  207. package/dist/utils/propertyExists.d.ts.map +1 -0
  208. package/dist/utils/readValueAsDate.d.ts +4 -0
  209. package/dist/utils/readValueAsDate.d.ts.map +1 -0
  210. package/dist/utils/removeLeadingTrailingSlashes.d.ts +2 -0
  211. package/dist/utils/removeLeadingTrailingSlashes.d.ts.map +1 -0
  212. package/dist/utils/schemaTools.d.ts +82 -0
  213. package/dist/utils/schemaTools.d.ts.map +1 -0
  214. package/dist/utils/typeGuards.d.ts +316 -0
  215. package/dist/utils/typeGuards.d.ts.map +1 -0
  216. package/dist/utils/watch/core.d.ts +22 -0
  217. package/dist/utils/watch/core.d.ts.map +1 -0
  218. package/dist/utils/watch/index.d.ts +49 -0
  219. package/dist/utils/watch/index.d.ts.map +1 -0
  220. package/dist/utils/watch/utilities.d.ts +34 -0
  221. package/dist/utils/watch/utilities.d.ts.map +1 -0
  222. package/dist/wrappers/AsyncMultiSelect/AsyncMultiSelect.d.ts +9 -0
  223. package/dist/wrappers/AsyncMultiSelect/AsyncMultiSelect.d.ts.map +1 -0
  224. package/dist/wrappers/AsyncMultiSelect/index.d.ts +3 -0
  225. package/dist/wrappers/AsyncMultiSelect/index.d.ts.map +1 -0
  226. package/dist/wrappers/AsyncMultiSelect/types.d.ts +19 -0
  227. package/dist/wrappers/AsyncMultiSelect/types.d.ts.map +1 -0
  228. package/dist/wrappers/AsyncMultiSelect2/AsyncMultiSelect2.d.ts +8 -0
  229. package/dist/wrappers/AsyncMultiSelect2/AsyncMultiSelect2.d.ts.map +1 -0
  230. package/dist/wrappers/AsyncMultiSelect2/index.d.ts +3 -0
  231. package/dist/wrappers/AsyncMultiSelect2/index.d.ts.map +1 -0
  232. package/dist/wrappers/AsyncMultiSelect2/types.d.ts +29 -0
  233. package/dist/wrappers/AsyncMultiSelect2/types.d.ts.map +1 -0
  234. package/dist/wrappers/AsyncSelect/index.d.ts +9 -0
  235. package/dist/wrappers/AsyncSelect/index.d.ts.map +1 -0
  236. package/dist/wrappers/AsyncSelect/types.d.ts +19 -0
  237. package/dist/wrappers/AsyncSelect/types.d.ts.map +1 -0
  238. package/dist/wrappers/Button.d.ts +49 -0
  239. package/dist/wrappers/Button.d.ts.map +1 -0
  240. package/dist/wrappers/CheckboxElement/CheckboxElement.d.ts +102 -0
  241. package/dist/wrappers/CheckboxElement/CheckboxElement.d.ts.map +1 -0
  242. package/dist/wrappers/CheckboxElement/index.d.ts +3 -0
  243. package/dist/wrappers/CheckboxElement/index.d.ts.map +1 -0
  244. package/dist/wrappers/CheckboxElement/types.d.ts +76 -0
  245. package/dist/wrappers/CheckboxElement/types.d.ts.map +1 -0
  246. package/dist/wrappers/CheckboxGroup/CheckboxGroup.d.ts +96 -0
  247. package/dist/wrappers/CheckboxGroup/CheckboxGroup.d.ts.map +1 -0
  248. package/dist/wrappers/CheckboxGroup/EnhancedCheckboxGroup.d.ts +49 -0
  249. package/dist/wrappers/CheckboxGroup/EnhancedCheckboxGroup.d.ts.map +1 -0
  250. package/dist/wrappers/CheckboxGroup/enhanced-types.d.ts +171 -0
  251. package/dist/wrappers/CheckboxGroup/enhanced-types.d.ts.map +1 -0
  252. package/dist/wrappers/CheckboxGroup/index.d.ts +3 -0
  253. package/dist/wrappers/CheckboxGroup/index.d.ts.map +1 -0
  254. package/dist/wrappers/CheckboxGroup/types.d.ts +106 -0
  255. package/dist/wrappers/CheckboxGroup/types.d.ts.map +1 -0
  256. package/dist/wrappers/DatePickerElement/DatePickerElement.d.ts +131 -0
  257. package/dist/wrappers/DatePickerElement/DatePickerElement.d.ts.map +1 -0
  258. package/dist/wrappers/DatePickerElement/DatePickerElementCore.d.ts +57 -0
  259. package/dist/wrappers/DatePickerElement/DatePickerElementCore.d.ts.map +1 -0
  260. package/dist/wrappers/DatePickerElement/hooks/index.d.ts +24 -0
  261. package/dist/wrappers/DatePickerElement/hooks/index.d.ts.map +1 -0
  262. package/dist/wrappers/DatePickerElement/hooks/useDatePickerStyles.d.ts +63 -0
  263. package/dist/wrappers/DatePickerElement/hooks/useDatePickerStyles.d.ts.map +1 -0
  264. package/dist/wrappers/DatePickerElement/hooks/useDatePickerValidation.d.ts +79 -0
  265. package/dist/wrappers/DatePickerElement/hooks/useDatePickerValidation.d.ts.map +1 -0
  266. package/dist/wrappers/DatePickerElement/hooks/useDatePickerValue.d.ts +73 -0
  267. package/dist/wrappers/DatePickerElement/hooks/useDatePickerValue.d.ts.map +1 -0
  268. package/dist/wrappers/DatePickerElement/index.d.ts +47 -0
  269. package/dist/wrappers/DatePickerElement/index.d.ts.map +1 -0
  270. package/dist/wrappers/DatePickerElement/types.d.ts +183 -0
  271. package/dist/wrappers/DatePickerElement/types.d.ts.map +1 -0
  272. package/dist/wrappers/DatePickerElement/utils.d.ts +89 -0
  273. package/dist/wrappers/DatePickerElement/utils.d.ts.map +1 -0
  274. package/dist/wrappers/DateTimePickerElement/index.d.ts +1 -0
  275. package/dist/wrappers/DateTimePickerElement/index.d.ts.map +1 -0
  276. package/dist/wrappers/DateTimePickerElement/types.d.ts +1 -0
  277. package/dist/wrappers/DateTimePickerElement/types.d.ts.map +1 -0
  278. package/dist/wrappers/Field/index.d.ts +42 -0
  279. package/dist/wrappers/Field/index.d.ts.map +1 -0
  280. package/dist/wrappers/NumberFieldElement/NumberFieldElement.d.ts +176 -0
  281. package/dist/wrappers/NumberFieldElement/NumberFieldElement.d.ts.map +1 -0
  282. package/dist/wrappers/NumberFieldElement/index.d.ts +3 -0
  283. package/dist/wrappers/NumberFieldElement/index.d.ts.map +1 -0
  284. package/dist/wrappers/OTPInputElement/HelperText.d.ts +8 -0
  285. package/dist/wrappers/OTPInputElement/HelperText.d.ts.map +1 -0
  286. package/dist/wrappers/OTPInputElement/OTPInputElement.d.ts +32 -0
  287. package/dist/wrappers/OTPInputElement/OTPInputElement.d.ts.map +1 -0
  288. package/dist/wrappers/OTPInputElement/index.d.ts +3 -0
  289. package/dist/wrappers/OTPInputElement/index.d.ts.map +1 -0
  290. package/dist/wrappers/PasswordElement/PasswordElement.d.ts +104 -0
  291. package/dist/wrappers/PasswordElement/PasswordElement.d.ts.map +1 -0
  292. package/dist/wrappers/PasswordElement/index.d.ts +2 -0
  293. package/dist/wrappers/PasswordElement/index.d.ts.map +1 -0
  294. package/dist/wrappers/RadioButtonGroup/RadioButtonGroup.d.ts +38 -0
  295. package/dist/wrappers/RadioButtonGroup/RadioButtonGroup.d.ts.map +1 -0
  296. package/dist/wrappers/RadioButtonGroup/index.d.ts +2 -0
  297. package/dist/wrappers/RadioButtonGroup/index.d.ts.map +1 -0
  298. package/dist/wrappers/SelectCascadeElement/SelectCascadeElement.d.ts +22 -0
  299. package/dist/wrappers/SelectCascadeElement/SelectCascadeElement.d.ts.map +1 -0
  300. package/dist/wrappers/SelectCascadeElement/index.d.ts +2 -0
  301. package/dist/wrappers/SelectCascadeElement/index.d.ts.map +1 -0
  302. package/dist/wrappers/SelectElement/SelectElement.d.ts +152 -0
  303. package/dist/wrappers/SelectElement/SelectElement.d.ts.map +1 -0
  304. package/dist/wrappers/SelectElement/index.d.ts +2 -0
  305. package/dist/wrappers/SelectElement/index.d.ts.map +1 -0
  306. package/dist/wrappers/SelectMultiElement/SelectMultiElement.d.ts +21 -0
  307. package/dist/wrappers/SelectMultiElement/SelectMultiElement.d.ts.map +1 -0
  308. package/dist/wrappers/SelectMultiElement/index.d.ts +2 -0
  309. package/dist/wrappers/SelectMultiElement/index.d.ts.map +1 -0
  310. package/dist/wrappers/TextFieldElement/TextFieldElement.d.ts +179 -0
  311. package/dist/wrappers/TextFieldElement/TextFieldElement.d.ts.map +1 -0
  312. package/dist/wrappers/TextFieldElement/index.d.ts +3 -0
  313. package/dist/wrappers/TextFieldElement/index.d.ts.map +1 -0
  314. package/dist/wrappers/TimePickerElement/TimePickerElement.d.ts +30 -0
  315. package/dist/wrappers/TimePickerElement/TimePickerElement.d.ts.map +1 -0
  316. package/dist/wrappers/TimePickerElement/index.d.ts +2 -0
  317. package/dist/wrappers/TimePickerElement/index.d.ts.map +1 -0
  318. package/dist/wrappers/index.cjs +3 -4
  319. package/dist/wrappers/index.d.ts +14 -0
  320. package/dist/wrappers/index.d.ts.map +1 -0
  321. package/dist/wrappers/index.js +1 -2
  322. package/dist/wrappers/types/common.d.ts +87 -0
  323. package/dist/wrappers/types/common.d.ts.map +1 -0
  324. package/dist/wrappers/types/index.d.ts +8 -0
  325. package/dist/wrappers/types/index.d.ts.map +1 -0
  326. package/package.json +4 -8
  327. package/dist/chunk-BXWPG6VW.js +0 -108
  328. package/dist/chunk-EOUSOGZ6.js +0 -2281
  329. package/dist/chunk-EYXPJMEF.cjs +0 -108
  330. package/dist/chunk-GHW77WIM.cjs +0 -72
  331. package/dist/chunk-PUQIPRL2.js +0 -467
  332. package/dist/chunk-YAYXHYKC.js +0 -2512
  333. package/dist/i18n/index.cjs +0 -21
  334. package/dist/i18n/index.js +0 -21
  335. /package/dist/{chunk-MULSVYFT.js → chunk-6GKAC3KH.js} +0 -0
@@ -1,2281 +0,0 @@
1
- import {
2
- useEnhancedTransform,
3
- useTransform
4
- } from "./chunk-GVWCGJ3F.js";
5
- import {
6
- useFormI18n
7
- } from "./chunk-BXWPG6VW.js";
8
- import {
9
- readValueAsDate
10
- } from "./chunk-FYU2OIMD.js";
11
-
12
- // src/wrappers/types/common.ts
13
- function isValidOption(Value) {
14
- return typeof Value === "object" && Value !== null && "label" in Value && "value" in Value && typeof Value.Label === "string" && (typeof Value.Value === "string" || typeof Value.Value === "number" || typeof Value.Value === "boolean");
15
- }
16
- function normalizeOptions(options, labelField = "label", valueField = "value") {
17
- return options.map((option) => ({
18
- label: String(option[labelField] ?? ""),
19
- value: option[valueField],
20
- disabled: Boolean(option.disabled)
21
- }));
22
- }
23
-
24
- // src/wrappers/AsyncMultiSelect2/AsyncMultiSelect2.tsx
25
- import {
26
- Autocomplete,
27
- CircularProgress,
28
- Grid,
29
- TextField
30
- } from "@mui/material";
31
- import { debounce } from "lodash";
32
- import { useCallback, useEffect, useReducer, useMemo } from "react";
33
- import { useController } from "react-hook-form";
34
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
35
- var initialState = {
36
- options: [],
37
- selectedOptions: [],
38
- inputValue: "",
39
- loading: false,
40
- initialLoaded: false
41
- };
42
- function componentReducer(state, action) {
43
- switch (action.type) {
44
- case "SET_OPTIONS":
45
- return { ...state, options: action.payload, loading: false };
46
- case "SET_SELECTED_OPTIONS":
47
- return { ...state, selectedOptions: action.payload };
48
- case "SET_INPUT_VALUE":
49
- return { ...state, inputValue: action.payload };
50
- case "SET_LOADING":
51
- return { ...state, loading: action.payload };
52
- case "SET_INITIAL_LOADED":
53
- return { ...state, initialLoaded: action.payload };
54
- case "RESET_OPTIONS":
55
- return { ...state, options: state.selectedOptions };
56
- default:
57
- return state;
58
- }
59
- }
60
- var AsyncMultiSelect2Component = ({
61
- name,
62
- control,
63
- placeholder,
64
- initialValues,
65
- label,
66
- queryFn,
67
- variant = "outlined",
68
- disabled = false,
69
- debounceMs = 400,
70
- loadingText = "Loading...",
71
- noOptionsText = "No options",
72
- renderInput,
73
- ...rest
74
- }) => {
75
- const [state, dispatch] = useReducer(componentReducer, initialState);
76
- const {
77
- field,
78
- fieldState: { error }
79
- } = useController({
80
- name,
81
- control
82
- });
83
- const debouncedFetch = useMemo(
84
- () => debounce(async (payload) => {
85
- try {
86
- const results = await queryFn(payload);
87
- const mergedOptions = [
88
- ...state.selectedOptions,
89
- ...results.filter(
90
- (option) => !state.selectedOptions.some(
91
- (selected) => selected.value === option.value
92
- )
93
- )
94
- ];
95
- dispatch({ type: "SET_OPTIONS", payload: mergedOptions });
96
- } catch (_error) {
97
- dispatch({ type: "SET_LOADING", payload: false });
98
- }
99
- }, debounceMs),
100
- [queryFn, state.selectedOptions, debounceMs]
101
- );
102
- useEffect(() => {
103
- if (!initialValues?.length || state.initialLoaded) return;
104
- dispatch({ type: "SET_LOADING", payload: true });
105
- const payload = {
106
- query: null,
107
- initialValues
108
- };
109
- queryFn(payload).then((results) => {
110
- if (results) {
111
- dispatch({ type: "SET_SELECTED_OPTIONS", payload: results });
112
- dispatch({ type: "SET_OPTIONS", payload: results });
113
- dispatch({ type: "SET_INITIAL_LOADED", payload: true });
114
- field.onChange(results.map((option) => option.value));
115
- }
116
- dispatch({ type: "SET_LOADING", payload: false });
117
- }).catch((_error) => {
118
- dispatch({ type: "SET_LOADING", payload: false });
119
- });
120
- }, [initialValues, state.initialLoaded, queryFn, field]);
121
- useEffect(() => {
122
- if (!state.initialLoaded) return;
123
- if (state.inputValue === "") {
124
- dispatch({ type: "RESET_OPTIONS" });
125
- return;
126
- }
127
- dispatch({ type: "SET_LOADING", payload: true });
128
- const payload = {
129
- query: state.inputValue,
130
- initialValues: null
131
- };
132
- debouncedFetch(payload);
133
- }, [state.inputValue, state.initialLoaded, debouncedFetch]);
134
- const handleChange = useCallback(
135
- (event, newValue) => {
136
- dispatch({ type: "SET_SELECTED_OPTIONS", payload: newValue });
137
- field.onChange(newValue.map((option) => option.value));
138
- },
139
- [field]
140
- );
141
- const handleInputChange = useCallback(
142
- (event, newInputValue) => {
143
- dispatch({ type: "SET_INPUT_VALUE", payload: newInputValue });
144
- },
145
- []
146
- );
147
- const isOptionEqualToValue = useCallback(
148
- (option, value) => option.value === value.value,
149
- []
150
- );
151
- const getOptionLabel = useCallback((option) => option.label, []);
152
- const defaultRenderInput = useCallback(
153
- (params) => /* @__PURE__ */ jsx(
154
- TextField,
155
- {
156
- ...params,
157
- label,
158
- placeholder,
159
- variant,
160
- error: !!error,
161
- helperText: error?.message,
162
- slotProps: {
163
- input: {
164
- ...params.InputProps,
165
- endAdornment: /* @__PURE__ */ jsxs(Fragment, { children: [
166
- state.loading && /* @__PURE__ */ jsx(CircularProgress, { color: "inherit", size: 20 }),
167
- params.InputProps.endAdornment
168
- ] })
169
- }
170
- }
171
- }
172
- ),
173
- [
174
- label,
175
- placeholder,
176
- variant,
177
- error,
178
- state.loading
179
- ]
180
- );
181
- return /* @__PURE__ */ jsx(
182
- Autocomplete,
183
- {
184
- multiple: true,
185
- options: state.options,
186
- value: state.selectedOptions,
187
- loading: state.loading,
188
- disabled,
189
- isOptionEqualToValue,
190
- getOptionLabel,
191
- filterSelectedOptions: true,
192
- onChange: handleChange,
193
- onInputChange: handleInputChange,
194
- loadingText,
195
- noOptionsText,
196
- renderInput: renderInput || defaultRenderInput,
197
- ...rest
198
- }
199
- );
200
- };
201
- var AsyncMultiSelect2 = ({
202
- gridProps = {},
203
- ...props
204
- }) => {
205
- return /* @__PURE__ */ jsx(Grid, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx(AsyncMultiSelect2Component, { ...props }) });
206
- };
207
- AsyncMultiSelect2.displayName = "AsyncMultiSelect2";
208
-
209
- // src/wrappers/CheckboxElement/CheckboxElement.tsx
210
- import {
211
- Checkbox,
212
- FormControl,
213
- FormControlLabel,
214
- FormGroup,
215
- FormHelperText,
216
- Grid as Grid2
217
- } from "@mui/material";
218
- import { useController as useController2 } from "react-hook-form";
219
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
220
- var Component = function CheckboxElement(props) {
221
- const {
222
- name,
223
- control,
224
- label,
225
- labelKey,
226
- namespace,
227
- labelProps,
228
- helperText,
229
- parseError,
230
- transform,
231
- disabled,
232
- onChange: customOnChange,
233
- ...rest
234
- } = props;
235
- const { resolveLabel } = useFormI18n();
236
- const resolvedLabel = resolveLabel(label, labelKey, namespace);
237
- const {
238
- field,
239
- fieldState: { error }
240
- } = useController2({
241
- name,
242
- control,
243
- disabled
244
- });
245
- if (field.value == null || field.value == void 0) {
246
- field.onChange(false);
247
- }
248
- const customOutputTransform = transform?.output;
249
- const { value, onChange } = useTransform({
250
- value: field.value,
251
- onChange: field.onChange,
252
- transform: {
253
- input: typeof transform?.input === "function" ? transform.input : (value2) => !!value2,
254
- output: typeof customOutputTransform === "function" ? (eventOrValue, _value) => {
255
- const event = eventOrValue;
256
- const checked = _value;
257
- return customOutputTransform(event, checked);
258
- } : (eventOrValue, _value) => {
259
- const checked = _value;
260
- return checked;
261
- }
262
- }
263
- });
264
- const handleChange = (event, checked) => {
265
- onChange(event, checked);
266
- if (typeof customOnChange === "function") {
267
- customOnChange(event, checked);
268
- }
269
- };
270
- const displayError = error ? typeof parseError === "function" ? parseError(error) : error.message : null;
271
- return /* @__PURE__ */ jsxs2(FormControl, { error: !!error, disabled, children: [
272
- /* @__PURE__ */ jsx2(FormGroup, { row: true, children: /* @__PURE__ */ jsx2(
273
- FormControlLabel,
274
- {
275
- label: resolvedLabel || "",
276
- ...labelProps,
277
- disabled,
278
- control: /* @__PURE__ */ jsx2(
279
- Checkbox,
280
- {
281
- ...rest,
282
- color: rest.color || "primary",
283
- checked: value,
284
- disabled,
285
- onChange: handleChange,
286
- ref: field.ref
287
- }
288
- )
289
- }
290
- ) }),
291
- (displayError || helperText) && /* @__PURE__ */ jsx2(FormHelperText, { error: !!error, children: displayError || helperText })
292
- ] });
293
- };
294
- var CheckboxElement2 = ({
295
- gridProps = {},
296
- ...props
297
- }) => {
298
- return /* @__PURE__ */ jsx2(Grid2, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx2(Component, { ...props }) });
299
- };
300
-
301
- // src/wrappers/CheckboxGroup/CheckboxGroup.tsx
302
- import {
303
- Checkbox as Checkbox2,
304
- FormControl as FormControl2,
305
- FormControlLabel as FormControlLabel2,
306
- FormGroup as FormGroup2,
307
- FormHelperText as FormHelperText2,
308
- Grid as Grid3
309
- } from "@mui/material";
310
- import { useCallback as useCallback2, useEffect as useEffect2, useState } from "react";
311
- import { useController as useController3 } from "react-hook-form";
312
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
313
- var Component2 = function CheckboxGroup(props) {
314
- const { name, control, labelProps, options, ...rest } = props;
315
- const {
316
- field,
317
- fieldState: { error }
318
- } = useController3({
319
- name,
320
- control,
321
- disabled: rest.disabled
322
- });
323
- const [selectedValues, setSelectedValues] = useState(
324
- options.filter((c) => field.value?.includes(c.Value)).map((c) => c.Value) || []
325
- );
326
- useEffect2(() => {
327
- field.onChange(selectedValues ? [...selectedValues] : []);
328
- }, [selectedValues, field]);
329
- const handleChange = useCallback2((event) => {
330
- const value = Number.parseInt(event.target.value, 10);
331
- if (Number.isNaN(value)) {
332
- return;
333
- }
334
- if (event.target.checked) {
335
- setSelectedValues((prev) => [...prev, value]);
336
- } else {
337
- setSelectedValues((prev) => prev.filter((item) => item !== value));
338
- }
339
- }, []);
340
- return /* @__PURE__ */ jsxs3(FormControl2, { error: !!error, children: [
341
- /* @__PURE__ */ jsx3(FormGroup2, { row: true, children: options.map((option) => /* @__PURE__ */ jsx3(
342
- FormControlLabel2,
343
- {
344
- label: option.Label,
345
- ...labelProps,
346
- control: /* @__PURE__ */ jsx3(
347
- Checkbox2,
348
- {
349
- ...rest,
350
- color: rest.color || "primary",
351
- value: option.Value,
352
- checked: selectedValues.includes(option.Value),
353
- onChange: handleChange
354
- }
355
- )
356
- },
357
- `${option.Value}`
358
- )) }),
359
- error && /* @__PURE__ */ jsx3(FormHelperText2, { error: !!error, children: error.message })
360
- ] });
361
- };
362
- var CheckboxGroup2 = ({
363
- gridProps = {},
364
- ...props
365
- }) => {
366
- return /* @__PURE__ */ jsx3(Grid3, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx3(Component2, { ...props }) });
367
- };
368
- CheckboxGroup2.displayName = "CheckboxGroup";
369
-
370
- // src/wrappers/DatePickerElement/DatePickerElement.tsx
371
- import { Grid as Grid4 } from "@mui/material";
372
- import { forwardRef as forwardRef2 } from "react";
373
-
374
- // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
375
- import { useForkRef } from "@mui/material";
376
- import { DatePicker } from "@mui/x-date-pickers";
377
- import { forwardRef, useCallback as useCallback4, useMemo as useMemo5 } from "react";
378
- import { useController as useController4 } from "react-hook-form";
379
-
380
- // src/wrappers/DatePickerElement/hooks/useDatePickerValue.ts
381
- import { useLocalizationContext } from "@mui/x-date-pickers/internals";
382
- import { useCallback as useCallback3, useMemo as useMemo2 } from "react";
383
- function readDatePickerValueAsDate(adapter, value) {
384
- if (value === null || value === void 0) {
385
- return null;
386
- }
387
- if (typeof value === "string") {
388
- if (value === "") {
389
- return null;
390
- }
391
- const parsedDate = adapter.utils.date(value);
392
- return parsedDate;
393
- }
394
- return value;
395
- }
396
- function useDatePickerValue(options) {
397
- const { field, transform } = options;
398
- const adapter = useLocalizationContext();
399
- const value = useMemo2(() => {
400
- if (typeof transform?.input === "function") {
401
- return transform.input(field.value);
402
- }
403
- return readDatePickerValueAsDate(adapter, field.value);
404
- }, [field.value, transform?.input, adapter]);
405
- const onChange = useCallback3(
406
- (newValue, context) => {
407
- if (typeof transform?.output === "function") {
408
- const transformedValue = transform.output(newValue, context);
409
- field.onChange(transformedValue);
410
- } else {
411
- field.onChange(newValue);
412
- }
413
- },
414
- // eslint-disable-next-line react-hooks/exhaustive-deps
415
- [field.onChange, transform?.output]
416
- );
417
- return {
418
- value,
419
- onChange
420
- };
421
- }
422
-
423
- // src/wrappers/DatePickerElement/hooks/useDatePickerValidation.ts
424
- import { useMemo as useMemo3 } from "react";
425
- var DEFAULT_ERROR_MESSAGES = {
426
- invalidDate: "Please enter a valid date",
427
- minDate: "Date must be after the minimum allowed date",
428
- maxDate: "Date must be before the maximum allowed date",
429
- disabledDate: "This date is not allowed",
430
- required: "This field is required"
431
- };
432
- function useDatePickerValidation(options) {
433
- const { fieldState, validation, parseError, value } = options;
434
- const validationResult = useMemo3(() => {
435
- const { error: fieldError, invalid } = fieldState;
436
- let currentError = fieldError;
437
- if (!fieldError && value && validation) {
438
- const { minDate, maxDate, shouldDisableDate, errorMessages } = validation;
439
- if (minDate && value < minDate) {
440
- currentError = {
441
- type: "minDate",
442
- message: errorMessages?.minDate || DEFAULT_ERROR_MESSAGES.minDate
443
- };
444
- } else if (maxDate && value > maxDate) {
445
- currentError = {
446
- type: "maxDate",
447
- message: errorMessages?.maxDate || DEFAULT_ERROR_MESSAGES.maxDate
448
- };
449
- } else if (shouldDisableDate && shouldDisableDate(value)) {
450
- currentError = {
451
- type: "disabledDate",
452
- message: errorMessages?.disabledDate || DEFAULT_ERROR_MESSAGES.disabledDate
453
- };
454
- }
455
- }
456
- const hasError = Boolean(currentError);
457
- return {
458
- hasError,
459
- error: currentError,
460
- invalid: invalid || hasError
461
- };
462
- }, [fieldState, validation, value]);
463
- const errorMessage = useMemo3(() => {
464
- if (!validationResult.error) {
465
- return null;
466
- }
467
- if (parseError) {
468
- return parseError(validationResult.error);
469
- }
470
- if (typeof validationResult.error === "string") {
471
- return validationResult.error;
472
- }
473
- if ("message" in validationResult.error && validationResult.error.message) {
474
- return validationResult.error.message;
475
- }
476
- if ("type" in validationResult.error) {
477
- const errorType = validationResult.error.type;
478
- switch (errorType) {
479
- case "required":
480
- return DEFAULT_ERROR_MESSAGES.required;
481
- case "minDate":
482
- return DEFAULT_ERROR_MESSAGES.minDate;
483
- case "maxDate":
484
- return DEFAULT_ERROR_MESSAGES.maxDate;
485
- case "disabledDate":
486
- return DEFAULT_ERROR_MESSAGES.disabledDate;
487
- case "invalidDate":
488
- default:
489
- return DEFAULT_ERROR_MESSAGES.invalidDate;
490
- }
491
- }
492
- return DEFAULT_ERROR_MESSAGES.invalidDate;
493
- }, [validationResult.error, parseError]);
494
- return {
495
- ...validationResult,
496
- errorMessage
497
- };
498
- }
499
-
500
- // src/wrappers/DatePickerElement/hooks/useDatePickerStyles.ts
501
- import { useTheme } from "@mui/material";
502
- import { useMemo as useMemo4 } from "react";
503
- function useDatePickerStyles(options = {}) {
504
- const { disabled, hasError, loading, textReadOnly, sx: customSx } = options;
505
- const theme = useTheme();
506
- const computedSx = useMemo4(() => {
507
- const baseStyles = {
508
- // Input field styling
509
- "& .MuiOutlinedInput-root": {
510
- backgroundColor: disabled ? theme.palette.action.disabledBackground : "transparent",
511
- // Transition for smooth state changes
512
- transition: theme.transitions.create([
513
- "background-color",
514
- "border-color",
515
- "color"
516
- ], {
517
- duration: theme.transitions.duration.short
518
- }),
519
- // Error state styling
520
- ...hasError && {
521
- borderColor: theme.palette.error.main,
522
- "&:hover": {
523
- borderColor: theme.palette.error.main
524
- },
525
- "&.Mui-focused": {
526
- borderColor: theme.palette.error.main,
527
- boxShadow: `0 0 0 2px ${theme.palette.error.main}25`
528
- // 25 is 15% opacity in hex
529
- }
530
- },
531
- // Loading state styling
532
- ...loading && {
533
- opacity: 0.7,
534
- pointerEvents: "none"
535
- }
536
- },
537
- // Input element styling
538
- "& .MuiInputBase-input": {
539
- cursor: disabled ? "not-allowed" : textReadOnly ? "pointer" : "text",
540
- // Read-only specific styling
541
- ...textReadOnly && !disabled && {
542
- cursor: "pointer",
543
- userSelect: "none",
544
- caretColor: "transparent"
545
- // Hide text cursor in read-only mode
546
- },
547
- // Loading state
548
- ...loading && {
549
- cursor: "wait"
550
- }
551
- },
552
- // Required field asterisk styling
553
- "& .MuiInputLabel-asterisk": {
554
- color: theme.palette.error.main,
555
- fontSize: "1.2em"
556
- },
557
- // Label styling with better contrast
558
- "& .MuiInputLabel-root": {
559
- color: hasError ? theme.palette.error.main : theme.palette.text.secondary,
560
- // Ensure proper contrast for disabled state
561
- ...disabled && {
562
- color: theme.palette.text.disabled
563
- }
564
- },
565
- // Helper text styling
566
- "& .MuiFormHelperText-root": {
567
- marginLeft: theme.spacing(1),
568
- marginRight: theme.spacing(1),
569
- // Error state
570
- ...hasError && {
571
- color: theme.palette.error.main
572
- }
573
- },
574
- // Calendar icon styling
575
- "& .MuiInputAdornment-root": {
576
- color: disabled ? theme.palette.action.disabled : hasError ? theme.palette.error.main : theme.palette.action.active
577
- },
578
- // Focus ring for accessibility
579
- "& .MuiOutlinedInput-root.Mui-focused": {
580
- outline: `2px solid ${theme.palette.primary.main}50`,
581
- // 50 is 31% opacity
582
- outlineOffset: "2px"
583
- },
584
- // Enhanced contrast for dark themes
585
- ...theme.palette.mode === "dark" && {
586
- "& .MuiOutlinedInput-root": {
587
- borderWidth: 2
588
- }
589
- }
590
- };
591
- return customSx ? [baseStyles, customSx] : baseStyles;
592
- }, [
593
- theme,
594
- disabled,
595
- hasError,
596
- loading,
597
- textReadOnly,
598
- customSx
599
- ]);
600
- const className = useMemo4(() => {
601
- const classes = [];
602
- if (disabled) classes.push("DatePickerElement--disabled");
603
- if (hasError) classes.push("DatePickerElement--error");
604
- if (loading) classes.push("DatePickerElement--loading");
605
- if (textReadOnly) classes.push("DatePickerElement--readOnly");
606
- return classes.length > 0 ? classes.join(" ") : void 0;
607
- }, [disabled, hasError, loading, textReadOnly]);
608
- return {
609
- sx: computedSx,
610
- className
611
- };
612
- }
613
-
614
- // src/wrappers/DatePickerElement/DatePickerElementCore.tsx
615
- import { jsx as jsx4 } from "react/jsx-runtime";
616
- var DatePickerElementCore = forwardRef(
617
- (props, ref) => {
618
- const {
619
- name,
620
- required = false,
621
- control,
622
- parseError,
623
- transform,
624
- validation,
625
- label,
626
- labelKey,
627
- placeholder,
628
- placeholderKey,
629
- namespace,
630
- textReadOnly = false,
631
- helperText,
632
- inputProps = {},
633
- slotProps = {},
634
- datePickerProps = {},
635
- variant = "outlined",
636
- loading = false,
637
- LoadingComponent,
638
- ...restProps
639
- } = props;
640
- const {
641
- disabled,
642
- inputRef: externalInputRef,
643
- onClose,
644
- ...restDatePickerProps
645
- } = datePickerProps;
646
- const { field, fieldState } = useController4({
647
- name,
648
- control,
649
- defaultValue: null
650
- // Let react-hook-form handle the default value typing
651
- });
652
- const { value, onChange: onValueChange } = useDatePickerValue({
653
- field,
654
- transform
655
- });
656
- const { hasError, errorMessage, invalid } = useDatePickerValidation({
657
- fieldState,
658
- validation,
659
- parseError,
660
- value
661
- });
662
- const { className } = useDatePickerStyles({
663
- disabled,
664
- hasError,
665
- loading,
666
- textReadOnly
667
- });
668
- const { resolveLabel } = useFormI18n();
669
- const resolvedLabel = resolveLabel(label, labelKey, namespace);
670
- const resolvedPlaceholder = resolveLabel(placeholder, placeholderKey, namespace);
671
- const handleInputRef = useForkRef(field.ref, externalInputRef);
672
- const handleChange = useCallback4(
673
- (newValue, context) => {
674
- onValueChange(newValue, context);
675
- },
676
- [onValueChange]
677
- );
678
- const handleClose = useCallback4(
679
- (...args) => {
680
- field.onBlur();
681
- if (onClose) {
682
- onClose(...args);
683
- }
684
- },
685
- // eslint-disable-next-line react-hooks/exhaustive-deps
686
- [field.onBlur, onClose]
687
- );
688
- const handleTextFieldBlur = useCallback4(
689
- (event) => {
690
- field.onBlur();
691
- if (typeof inputProps.onBlur === "function") {
692
- inputProps.onBlur(event);
693
- }
694
- },
695
- // eslint-disable-next-line react-hooks/exhaustive-deps
696
- [field.onBlur, inputProps.onBlur]
697
- );
698
- const memoizedSlotProps = useMemo5(
699
- () => ({
700
- ...slotProps,
701
- actionBar: {
702
- actions: ["clear", "today", "cancel", "accept"],
703
- ...slotProps.actionBar
704
- },
705
- textField: {
706
- ...inputProps,
707
- required,
708
- placeholder,
709
- fullWidth: true,
710
- variant,
711
- onBlur: handleTextFieldBlur,
712
- error: hasError,
713
- helperText: hasError ? errorMessage : helperText,
714
- inputProps: {
715
- readOnly: textReadOnly,
716
- "aria-invalid": invalid,
717
- "aria-describedby": hasError ? `${name}-error` : void 0,
718
- ...inputProps.inputProps
719
- },
720
- // Add loading indicator if provided
721
- ...loading && LoadingComponent && {
722
- InputProps: {
723
- endAdornment: /* @__PURE__ */ jsx4(LoadingComponent, {}),
724
- ...inputProps.InputProps
725
- }
726
- },
727
- ...slotProps.textField
728
- }
729
- }),
730
- [
731
- slotProps,
732
- inputProps,
733
- required,
734
- placeholder,
735
- variant,
736
- handleTextFieldBlur,
737
- hasError,
738
- errorMessage,
739
- helperText,
740
- textReadOnly,
741
- invalid,
742
- name,
743
- loading,
744
- LoadingComponent
745
- ]
746
- );
747
- return /* @__PURE__ */ jsx4(
748
- DatePicker,
749
- {
750
- ...restProps,
751
- ...restDatePickerProps,
752
- ref,
753
- name,
754
- value,
755
- onChange: handleChange,
756
- onClose: handleClose,
757
- inputRef: handleInputRef,
758
- label: resolvedLabel,
759
- disabled,
760
- className,
761
- slotProps: memoizedSlotProps,
762
- "aria-invalid": invalid,
763
- "aria-describedby": hasError ? `${name}-error` : void 0
764
- }
765
- );
766
- }
767
- );
768
- DatePickerElementCore.displayName = "DatePickerElementCore";
769
-
770
- // src/wrappers/DatePickerElement/DatePickerElement.tsx
771
- import { jsx as jsx5 } from "react/jsx-runtime";
772
- var DatePickerElement = forwardRef2((props, ref) => {
773
- const {
774
- gridProps = { size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 } },
775
- ...coreProps
776
- } = props;
777
- if (gridProps === false) {
778
- return /* @__PURE__ */ jsx5(
779
- DatePickerElementCore,
780
- {
781
- ref,
782
- ...coreProps
783
- }
784
- );
785
- }
786
- return /* @__PURE__ */ jsx5(
787
- Grid4,
788
- {
789
- ref,
790
- ...gridProps,
791
- children: /* @__PURE__ */ jsx5(
792
- DatePickerElementCore,
793
- {
794
- ...coreProps
795
- }
796
- )
797
- }
798
- );
799
- });
800
- DatePickerElement.displayName = "DatePickerElement";
801
-
802
- // src/wrappers/DatePickerElement/utils.ts
803
- function isValidDate(value) {
804
- if (value === null || value === void 0) {
805
- return false;
806
- }
807
- if (value instanceof Date) {
808
- return !isNaN(value.getTime());
809
- }
810
- if (typeof value === "object" && value !== null) {
811
- if ("isValid" in value && typeof value.isValid === "function") {
812
- return value.isValid();
813
- }
814
- if ("isValid" in value && typeof value.isValid === "boolean") {
815
- return value.isValid;
816
- }
817
- }
818
- return false;
819
- }
820
- function isParsableDateString(value) {
821
- if (typeof value !== "string" || value === "") {
822
- return false;
823
- }
824
- const isoDateRegex = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d{3})?(?:Z|[+-]\d{2}:\d{2})?)?$/;
825
- if (isoDateRegex.test(value)) {
826
- return true;
827
- }
828
- const parsed = new Date(value);
829
- return !isNaN(parsed.getTime());
830
- }
831
- function createDateInputTransform(adapter) {
832
- return (value) => {
833
- if (value === null || value === void 0) {
834
- return null;
835
- }
836
- if (typeof value === "string") {
837
- if (value === "") {
838
- return null;
839
- }
840
- try {
841
- const parsed = adapter.utils.date(value);
842
- return isValidDate(parsed) ? parsed : null;
843
- } catch {
844
- return null;
845
- }
846
- }
847
- if (isValidDate(value)) {
848
- return value;
849
- }
850
- return null;
851
- };
852
- }
853
- function createDateOutputTransform(format) {
854
- return (value) => {
855
- if (value === null || value === void 0) {
856
- return null;
857
- }
858
- if (!isValidDate(value)) {
859
- return null;
860
- }
861
- if (!format) {
862
- return value;
863
- }
864
- try {
865
- if (value instanceof Date) {
866
- if (format === "iso") {
867
- return value.toISOString();
868
- }
869
- if (format === "date-only") {
870
- return value.toISOString().split("T")[0];
871
- }
872
- }
873
- if (typeof value.format === "function") {
874
- return value.format(format);
875
- }
876
- if (typeof value.format === "function") {
877
- return value.format(format);
878
- }
879
- if (typeof value.toFormat === "function") {
880
- return value.toFormat(format);
881
- }
882
- return value;
883
- } catch {
884
- return null;
885
- }
886
- };
887
- }
888
- function createDefaultDatePickerConfig() {
889
- return {
890
- // Default slot props for consistent behavior
891
- slotProps: {
892
- actionBar: {
893
- actions: ["clear", "today", "cancel", "accept"]
894
- },
895
- textField: {
896
- fullWidth: true,
897
- variant: "outlined"
898
- }
899
- },
900
- // Default grid props for layout consistency
901
- gridProps: {
902
- size: { xs: 12, sm: 12, md: 12, lg: 12, xl: 12 }
903
- },
904
- // Default validation configuration
905
- validation: {
906
- errorMessages: {
907
- invalidDate: "Please enter a valid date",
908
- minDate: "Date must be after the minimum allowed date",
909
- maxDate: "Date must be before the maximum allowed date",
910
- disabledDate: "This date is not allowed"
911
- }
912
- }
913
- };
914
- }
915
- function extractErrorMessage(error) {
916
- if (error === null || error === void 0) {
917
- return "";
918
- }
919
- if (typeof error === "string") {
920
- return error;
921
- }
922
- if (typeof error === "object" && error !== null) {
923
- if ("message" in error && typeof error.message === "string") {
924
- return error.message;
925
- }
926
- if ("type" in error && typeof error.type === "string") {
927
- const errorType = error.type;
928
- switch (errorType) {
929
- case "invalidDate":
930
- return "Please enter a valid date";
931
- case "minDate":
932
- return "Date is too early";
933
- case "maxDate":
934
- return "Date is too late";
935
- case "disabledDate":
936
- return "This date is not available";
937
- default:
938
- return "Invalid date selection";
939
- }
940
- }
941
- }
942
- return "Invalid input";
943
- }
944
- function createStableKey(config) {
945
- try {
946
- return JSON.stringify(config, (key, value) => {
947
- if (typeof value === "object" && value !== null && !Array.isArray(value)) {
948
- const sorted = {};
949
- Object.keys(value).sort().forEach((k) => {
950
- sorted[k] = value[k];
951
- });
952
- return sorted;
953
- }
954
- return value;
955
- });
956
- } catch {
957
- return Object.keys(config).sort().join("-");
958
- }
959
- }
960
-
961
- // src/wrappers/PasswordElement/PasswordElement.tsx
962
- import Visibility from "@mui/icons-material/Visibility";
963
- import VisibilityOff from "@mui/icons-material/VisibilityOff";
964
- import {
965
- IconButton,
966
- InputAdornment,
967
- TextField as TextField2,
968
- useForkRef as useForkRef2,
969
- Grid as Grid5
970
- } from "@mui/material";
971
- import { useState as useState2 } from "react";
972
- import { useController as useController5 } from "react-hook-form";
973
- import { jsx as jsx6 } from "react/jsx-runtime";
974
- var Component3 = function PasswordEl(props) {
975
- const {
976
- iconColor,
977
- renderIcon = (password2) => password2 ? /* @__PURE__ */ jsx6(Visibility, {}) : /* @__PURE__ */ jsx6(VisibilityOff, {}),
978
- slotProps,
979
- name,
980
- control,
981
- inputRef,
982
- onBlur,
983
- label,
984
- labelKey,
985
- placeholder,
986
- placeholderKey,
987
- namespace,
988
- ...rest
989
- } = props;
990
- const [password, setPassword] = useState2(true);
991
- const { resolveLabel } = useFormI18n();
992
- const resolvedLabel = resolveLabel(label, labelKey, namespace);
993
- const resolvedPlaceholder = resolveLabel(placeholder, placeholderKey, namespace);
994
- const endAdornment = /* @__PURE__ */ jsx6(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx6(
995
- IconButton,
996
- {
997
- onMouseDown: (e) => e.preventDefault(),
998
- onClick: () => setPassword(!password),
999
- tabIndex: -1,
1000
- color: iconColor ?? "default",
1001
- children: renderIcon(password)
1002
- }
1003
- ) });
1004
- const {
1005
- field,
1006
- fieldState: { error }
1007
- } = useController5({
1008
- name,
1009
- control
1010
- });
1011
- const handleInputRef = useForkRef2(field.ref, inputRef);
1012
- return /* @__PURE__ */ jsx6(
1013
- TextField2,
1014
- {
1015
- ...rest,
1016
- label: resolvedLabel,
1017
- placeholder: resolvedPlaceholder,
1018
- inputRef: handleInputRef,
1019
- type: password ? "password" : "text",
1020
- value: field.value ?? "",
1021
- fullWidth: true,
1022
- variant: rest.variant ?? "outlined",
1023
- onChange: (event) => {
1024
- field.onChange(event);
1025
- if (typeof rest.onChange === "function") {
1026
- rest.onChange(event);
1027
- }
1028
- },
1029
- onBlur: (event) => {
1030
- field.onBlur();
1031
- if (typeof onBlur === "function") {
1032
- onBlur(event);
1033
- }
1034
- },
1035
- ...typeof slotProps === "undefined" ? {
1036
- InputProps: {
1037
- endAdornment
1038
- }
1039
- } : {
1040
- slotProps: {
1041
- ...slotProps,
1042
- input: {
1043
- endAdornment,
1044
- ...slotProps?.input
1045
- }
1046
- }
1047
- },
1048
- error: !!error,
1049
- helperText: error ? error.message : ""
1050
- }
1051
- );
1052
- };
1053
- var PasswordElement = ({
1054
- gridProps = {},
1055
- ...props
1056
- }) => {
1057
- return /* @__PURE__ */ jsx6(Grid5, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx6(Component3, { ...props }) });
1058
- };
1059
-
1060
- // src/wrappers/RadioButtonGroup/RadioButtonGroup.tsx
1061
- import {
1062
- FormControl as FormControl3,
1063
- FormControlLabel as FormControlLabel3,
1064
- FormHelperText as FormHelperText3,
1065
- FormLabel,
1066
- Radio,
1067
- RadioGroup,
1068
- Grid as Grid6
1069
- } from "@mui/material";
1070
- import { useController as useController6 } from "react-hook-form";
1071
- import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
1072
- var Component4 = function RadioButtonGroup(props) {
1073
- const {
1074
- options,
1075
- label,
1076
- labelKey,
1077
- namespace,
1078
- name,
1079
- labelField = "label",
1080
- valueField = "id",
1081
- disabledKey = "disabled",
1082
- required,
1083
- emptyOptionLabel,
1084
- returnObject,
1085
- row = true,
1086
- control,
1087
- type,
1088
- labelProps,
1089
- disabled,
1090
- formLabelProps,
1091
- radioProps,
1092
- transform,
1093
- ...rest
1094
- } = props;
1095
- const { resolveLabel } = useFormI18n();
1096
- const resolvedLabel = resolveLabel(label, labelKey, namespace);
1097
- const {
1098
- field,
1099
- fieldState: { error }
1100
- } = useController6({
1101
- name,
1102
- disabled,
1103
- control
1104
- });
1105
- const { value, onChange } = useTransform({
1106
- value: field.value,
1107
- onChange: field.onChange,
1108
- transform: {
1109
- input: typeof transform?.input === "function" ? transform.input : (value2) => {
1110
- return value2 || "";
1111
- },
1112
- output: typeof transform?.output === "function" ? transform?.output : (_event, value2) => {
1113
- if (value2 && type === "number") {
1114
- return Number(value2);
1115
- }
1116
- if (value2 && type === "boolean") {
1117
- return Boolean(value2);
1118
- }
1119
- return value2;
1120
- }
1121
- }
1122
- });
1123
- const onRadioChange = (event, radioValue) => {
1124
- const returnValue = returnObject ? options.find((option) => option[valueField] === radioValue) : radioValue;
1125
- onChange(event, returnValue);
1126
- if (typeof rest.onChange === "function") {
1127
- rest.onChange(returnValue);
1128
- }
1129
- };
1130
- return /* @__PURE__ */ jsxs4(FormControl3, { error: !!error, children: [
1131
- label && /* @__PURE__ */ jsx7(FormLabel, { ...formLabelProps, required, error: !!error, children: label }),
1132
- /* @__PURE__ */ jsxs4(RadioGroup, { onChange: onRadioChange, name, row, value, children: [
1133
- emptyOptionLabel && /* @__PURE__ */ jsx7(
1134
- FormControlLabel3,
1135
- {
1136
- ...labelProps,
1137
- control: /* @__PURE__ */ jsx7(
1138
- Radio,
1139
- {
1140
- ...radioProps,
1141
- checked: !value
1142
- }
1143
- ),
1144
- label: emptyOptionLabel,
1145
- value: ""
1146
- }
1147
- ),
1148
- options.map((option) => {
1149
- const optionKey = option[valueField];
1150
- const optionDisabled = option[disabledKey] || false;
1151
- let val = returnObject ? value?.[valueField] : value;
1152
- if (type === "number" && val !== void 0) {
1153
- val = Number(val);
1154
- } else if (type === "boolean" && val !== void 0) {
1155
- val = Boolean(val);
1156
- }
1157
- const isChecked = val === optionKey;
1158
- return /* @__PURE__ */ jsx7(
1159
- FormControlLabel3,
1160
- {
1161
- ...labelProps,
1162
- control: /* @__PURE__ */ jsx7(
1163
- Radio,
1164
- {
1165
- ...radioProps,
1166
- disabled: disabled || optionDisabled,
1167
- checked: isChecked
1168
- }
1169
- ),
1170
- value: optionKey,
1171
- label: option[labelField]
1172
- },
1173
- String(optionKey)
1174
- );
1175
- })
1176
- ] }),
1177
- error && /* @__PURE__ */ jsx7(FormHelperText3, { children: error.message })
1178
- ] });
1179
- };
1180
- var RadioButtonGroup2 = ({
1181
- gridProps = {},
1182
- ...props
1183
- }) => {
1184
- return /* @__PURE__ */ jsx7(Grid6, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx7(
1185
- Component4,
1186
- {
1187
- ...props
1188
- }
1189
- ) });
1190
- };
1191
- RadioButtonGroup2.displayName = "RadioButtonGroup";
1192
-
1193
- // src/wrappers/SelectCascadeElement/SelectCascadeElement.tsx
1194
- import { Grid as Grid7, TextField as TextField3, Autocomplete as Autocomplete2 } from "@mui/material";
1195
- import { useRef, useEffect as useEffect3, useCallback as useCallback5, useMemo as useMemo6 } from "react";
1196
- import { useController as useController7 } from "react-hook-form";
1197
- import { jsx as jsx8 } from "react/jsx-runtime";
1198
- var Component5 = function SelectCascadeElement(props) {
1199
- const {
1200
- labelField = "Label",
1201
- valueField = "Value",
1202
- name,
1203
- onBlur,
1204
- onChange,
1205
- disabled,
1206
- options: optionsInput,
1207
- control,
1208
- loading = false,
1209
- placeholder,
1210
- label,
1211
- dependsOn,
1212
- textFieldProps = {},
1213
- variant,
1214
- isEdit = false,
1215
- ...rest
1216
- } = props;
1217
- const { required, ...restTextProps } = textFieldProps;
1218
- const options = useMemo6(() => optionsInput || [], [optionsInput]);
1219
- const getOptionKey = useCallback5(
1220
- (option) => {
1221
- if (typeof option === "string" || typeof option === "number")
1222
- return option;
1223
- const key = option ? option[valueField] : void 0;
1224
- return key !== void 0 && key !== null ? String(key) : "";
1225
- },
1226
- [valueField]
1227
- );
1228
- const getOptionLabel = useCallback5(
1229
- (option) => {
1230
- if (typeof option === "string") return option;
1231
- return option ? String(option[labelField]) : "";
1232
- },
1233
- [labelField]
1234
- );
1235
- const isOptionEqualToValue = (option, value) => getOptionKey(option) === getOptionKey(value);
1236
- const {
1237
- field,
1238
- fieldState: { error }
1239
- } = useController7({
1240
- name,
1241
- control
1242
- });
1243
- const { field: dependentField } = useController7({
1244
- name: dependsOn,
1245
- control
1246
- });
1247
- const parentValueRef = useRef(dependentField.value ?? null);
1248
- const hasAutoSelected = useRef(false);
1249
- useEffect3(() => {
1250
- if (parentValueRef?.current !== dependentField.value) {
1251
- hasAutoSelected.current = false;
1252
- }
1253
- if (!!field.value && parentValueRef?.current !== dependentField.value) {
1254
- field.onChange(null);
1255
- }
1256
- }, [dependentField.value]);
1257
- useEffect3(() => {
1258
- if (!isEdit && !disabled && options.length === 1 && !!dependentField.value && !hasAutoSelected.current && field.value == null) {
1259
- field.onChange(getOptionKey(options[0]));
1260
- hasAutoSelected.current = true;
1261
- }
1262
- console.log(
1263
- !isEdit,
1264
- !disabled,
1265
- options.length === 1,
1266
- !!dependentField.value,
1267
- !hasAutoSelected,
1268
- field.value
1269
- );
1270
- }, [
1271
- options,
1272
- field.value,
1273
- field.onChange,
1274
- hasAutoSelected,
1275
- isEdit,
1276
- disabled,
1277
- field,
1278
- getOptionKey,
1279
- dependentField.onChange
1280
- ]);
1281
- return /* @__PURE__ */ jsx8(
1282
- Autocomplete2,
1283
- {
1284
- ...rest,
1285
- value: options.map((option) => getOptionKey(option) === field.value ? option : null).find(Boolean) || null,
1286
- loading,
1287
- options,
1288
- getOptionKey,
1289
- getOptionLabel,
1290
- isOptionEqualToValue,
1291
- ref: field.ref,
1292
- disabled: dependentField.value == null || disabled,
1293
- onChange: (event, newValue, reason) => {
1294
- field.onChange(newValue ? getOptionKey(newValue) : null);
1295
- if (onChange && typeof onChange === "function") {
1296
- onChange(event, newValue, reason);
1297
- }
1298
- },
1299
- onBlur: (event) => {
1300
- field.onBlur();
1301
- if (typeof onBlur === "function") {
1302
- onBlur(event);
1303
- }
1304
- },
1305
- fullWidth: true,
1306
- renderInput: (params) => /* @__PURE__ */ jsx8(
1307
- TextField3,
1308
- {
1309
- ...params,
1310
- ...restTextProps,
1311
- fullWidth: true,
1312
- error: !!error,
1313
- required: required || options.length == 0,
1314
- helperText: error ? error.message : "",
1315
- placeholder,
1316
- label,
1317
- variant: variant ? variant : "outlined"
1318
- }
1319
- )
1320
- }
1321
- );
1322
- };
1323
- var SelectCascadeElement2 = ({
1324
- gridProps = {},
1325
- ...props
1326
- }) => {
1327
- return /* @__PURE__ */ jsx8(Grid7, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx8(Component5, { ...props }) });
1328
- };
1329
- SelectCascadeElement2.displayName = "SelectCascadeElement";
1330
-
1331
- // src/wrappers/SelectElement/SelectElement.tsx
1332
- import { Grid as Grid8, TextField as TextField4, Autocomplete as Autocomplete3 } from "@mui/material";
1333
- import {
1334
- useMemo as useMemo7,
1335
- useEffect as useEffect4,
1336
- useCallback as useCallback6,
1337
- useRef as useRef2
1338
- } from "react";
1339
- import { useController as useController8 } from "react-hook-form";
1340
- import { jsx as jsx9 } from "react/jsx-runtime";
1341
- var Component6 = function SelectElement(props) {
1342
- const {
1343
- name,
1344
- control,
1345
- onChange,
1346
- isEdit,
1347
- options: optionsInput,
1348
- label,
1349
- labelKey,
1350
- placeholder,
1351
- placeholderKey,
1352
- namespace,
1353
- variant,
1354
- disabled,
1355
- labelField = "Label",
1356
- valueField = "Value",
1357
- textFieldProps = {},
1358
- ...rest
1359
- } = props;
1360
- const { required, ...restTextProps } = textFieldProps;
1361
- const options = useMemo7(() => optionsInput || [], [optionsInput]);
1362
- const ignoreAutoSelectRef = useRef2(null);
1363
- const {
1364
- field,
1365
- fieldState: { error }
1366
- } = useController8({
1367
- name,
1368
- control
1369
- });
1370
- const { resolveLabel } = useFormI18n();
1371
- const resolvedLabel = resolveLabel(label, labelKey, namespace);
1372
- const resolvedPlaceholder = resolveLabel(
1373
- placeholder,
1374
- placeholderKey,
1375
- namespace
1376
- );
1377
- const getOptionValue = useCallback6(
1378
- (option) => {
1379
- if (typeof option === "string") return option;
1380
- return option ? option[valueField] : null;
1381
- },
1382
- [valueField]
1383
- );
1384
- const getOptionLabel = useCallback6(
1385
- (option) => {
1386
- if (typeof option === "string") return option;
1387
- return option ? String(option[labelField]) : "";
1388
- },
1389
- [labelField]
1390
- );
1391
- const handleChange = (event, newValue, reason) => {
1392
- const option = newValue;
1393
- if (reason === "clear" && options.length === 1) {
1394
- ignoreAutoSelectRef.current = getOptionValue(options[0]);
1395
- } else {
1396
- ignoreAutoSelectRef.current = null;
1397
- }
1398
- field.onChange(option ? getOptionValue(option) : null);
1399
- onChange?.(event, newValue, reason);
1400
- };
1401
- useEffect4(() => {
1402
- if (!isEdit && options.length === 1 && (field.value == null || field.value == void 0 || field.value === "")) {
1403
- const defaultOption = options[0];
1404
- const defaultValue = getOptionValue(defaultOption);
1405
- if (ignoreAutoSelectRef.current !== defaultValue) {
1406
- field.onChange(defaultValue);
1407
- }
1408
- }
1409
- }, [options]);
1410
- const autocompleteValue = useMemo7(
1411
- () => options.find((option) => getOptionValue(option) === field.value) ?? null,
1412
- [field.value, options, getOptionValue]
1413
- );
1414
- return /* @__PURE__ */ jsx9(
1415
- Autocomplete3,
1416
- {
1417
- ...rest,
1418
- filterSelectedOptions: false,
1419
- options,
1420
- value: autocompleteValue,
1421
- onChange: handleChange,
1422
- disabled: disabled || options.length == 0,
1423
- getOptionLabel: (option) => getOptionLabel(option),
1424
- ref: field.ref,
1425
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1426
- renderInput: (params) => /* @__PURE__ */ jsx9(
1427
- TextField4,
1428
- {
1429
- ...params,
1430
- ...restTextProps,
1431
- fullWidth: true,
1432
- required,
1433
- error: !!error,
1434
- helperText: error ? error.message : "",
1435
- label: resolvedLabel,
1436
- placeholder: resolvedPlaceholder,
1437
- variant: variant ? variant : "outlined"
1438
- }
1439
- )
1440
- }
1441
- );
1442
- };
1443
- var SelectElement2 = ({
1444
- gridProps = {},
1445
- ...props
1446
- }) => {
1447
- return /* @__PURE__ */ jsx9(Grid8, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx9(Component6, { ...props }) });
1448
- };
1449
- SelectElement2.displayName = "SelectElement";
1450
-
1451
- // src/wrappers/SelectMultiElement/SelectMultiElement.tsx
1452
- import CheckBoxIcon from "@mui/icons-material/CheckBox";
1453
- import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank";
1454
- import {
1455
- Grid as Grid9,
1456
- Checkbox as Checkbox3,
1457
- TextField as TextField5,
1458
- Autocomplete as Autocomplete4,
1459
- CircularProgress as CircularProgress2
1460
- } from "@mui/material";
1461
- import { Fragment as Fragment2, useMemo as useMemo8 } from "react";
1462
- import { useController as useController9 } from "react-hook-form";
1463
- import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
1464
- var Component7 = function SelectMultiElement(props) {
1465
- const {
1466
- name,
1467
- control,
1468
- onBlur,
1469
- disabled,
1470
- options: optionsInput,
1471
- loading = false,
1472
- placeholder,
1473
- label,
1474
- variant,
1475
- labelField = "Label",
1476
- valueField = "Value",
1477
- ...rest
1478
- } = props;
1479
- const options = useMemo8(() => optionsInput || [], [optionsInput]);
1480
- const {
1481
- field,
1482
- fieldState: { error }
1483
- } = useController9({
1484
- name,
1485
- control
1486
- });
1487
- const getOptionValue = (option) => {
1488
- if (typeof option === "string") return option;
1489
- return option ? option[valueField] : null;
1490
- };
1491
- const getOptionLabel = (option) => {
1492
- if (typeof option === "string") return option;
1493
- return option ? option[labelField] : "";
1494
- };
1495
- const selectedValue = field.value && Array.isArray(field.value) ? options.filter((option) => field.value.includes(getOptionValue(option))) : [];
1496
- const handleChange = (_, selectedOptions, reason) => {
1497
- if (reason === "clear") {
1498
- field.onChange([]);
1499
- } else if (reason === "selectOption" || reason === "removeOption") {
1500
- const newValues = selectedOptions.map((option) => getOptionValue(option));
1501
- field.onChange(newValues);
1502
- }
1503
- };
1504
- const icon = /* @__PURE__ */ jsx10(CheckBoxOutlineBlankIcon, { fontSize: "small" });
1505
- const checkedIcon = /* @__PURE__ */ jsx10(CheckBoxIcon, { fontSize: "small" });
1506
- return /* @__PURE__ */ jsx10(
1507
- Autocomplete4,
1508
- {
1509
- multiple: true,
1510
- value: selectedValue,
1511
- loading,
1512
- options,
1513
- getOptionLabel,
1514
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
1515
- filterSelectedOptions: true,
1516
- disableCloseOnSelect: true,
1517
- ref: field.ref,
1518
- disabled: disabled ?? field.disabled ?? options.length == 0,
1519
- onChange: handleChange,
1520
- onBlur: (event) => {
1521
- field.onBlur();
1522
- if (typeof onBlur === "function") {
1523
- onBlur(event);
1524
- }
1525
- },
1526
- fullWidth: true,
1527
- renderOption: (props1, option, { selected }) => {
1528
- const { key, ...optionProps } = props1;
1529
- return /* @__PURE__ */ jsxs5("li", { ...optionProps, children: [
1530
- /* @__PURE__ */ jsx10(
1531
- Checkbox3,
1532
- {
1533
- icon,
1534
- checkedIcon,
1535
- checked: selected
1536
- }
1537
- ),
1538
- getOptionLabel(option)
1539
- ] }, key);
1540
- },
1541
- renderInput: (params) => /* @__PURE__ */ jsx10(
1542
- TextField5,
1543
- {
1544
- ...params,
1545
- label,
1546
- error: !!error,
1547
- helperText: error ? error.message : "",
1548
- placeholder,
1549
- slotProps: {
1550
- input: {
1551
- ...params.InputProps,
1552
- endAdornment: /* @__PURE__ */ jsxs5(Fragment2, { children: [
1553
- loading ? /* @__PURE__ */ jsx10(CircularProgress2, { color: "inherit", size: 20 }) : null,
1554
- params.InputProps.endAdornment
1555
- ] })
1556
- }
1557
- },
1558
- variant: variant ? variant : "outlined"
1559
- }
1560
- ),
1561
- ...rest
1562
- }
1563
- );
1564
- };
1565
- var SelectMultiElement2 = ({
1566
- gridProps = {},
1567
- ...props
1568
- }) => {
1569
- return /* @__PURE__ */ jsx10(Grid9, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx10(Component7, { ...props }) });
1570
- };
1571
- SelectMultiElement2.displayName = "SelectMultiElement";
1572
-
1573
- // src/wrappers/TextFieldElement/TextFieldElement.tsx
1574
- import { Grid as Grid10, TextField as TextField6, useForkRef as useForkRef3 } from "@mui/material";
1575
- import { useController as useController10 } from "react-hook-form";
1576
- import { jsx as jsx11 } from "react/jsx-runtime";
1577
- var Component8 = function TextFieldElement(props) {
1578
- const {
1579
- parseError,
1580
- name,
1581
- control,
1582
- component: TextFieldComponent = TextField6,
1583
- transform,
1584
- fieldType = "text",
1585
- // Default to text type
1586
- defaultValue,
1587
- label,
1588
- labelKey,
1589
- placeholder,
1590
- placeholderKey,
1591
- namespace,
1592
- textFieldProps = {},
1593
- variant,
1594
- onChange: customOnChange,
1595
- enableWarnings = process.env.NODE_ENV === "development",
1596
- ...rest
1597
- } = props;
1598
- const { resolveLabel } = useFormI18n();
1599
- const resolvedLabel = resolveLabel(label, labelKey, namespace);
1600
- const resolvedPlaceholder = resolveLabel(placeholder, placeholderKey, namespace);
1601
- const {
1602
- type,
1603
- required,
1604
- helperText,
1605
- inputRef,
1606
- onInput,
1607
- onBlur,
1608
- disabled,
1609
- ...restTextProps
1610
- } = textFieldProps;
1611
- const {
1612
- field,
1613
- fieldState: { error }
1614
- } = useController10({
1615
- name,
1616
- control
1617
- });
1618
- const { value, onChange } = useEnhancedTransform(
1619
- {
1620
- value: field.value,
1621
- onChange: field.onChange,
1622
- transform: transform ? {
1623
- input: transform.input,
1624
- output: transform.output
1625
- } : void 0,
1626
- fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
1627
- // Auto-detect number type
1628
- defaultValue,
1629
- enableWarnings
1630
- }
1631
- );
1632
- const handleInputRef = useForkRef3(field.ref, inputRef);
1633
- return /* @__PURE__ */ jsx11(
1634
- TextFieldComponent,
1635
- {
1636
- ...rest,
1637
- ...restTextProps,
1638
- name: field.name,
1639
- value,
1640
- onChange: (event) => {
1641
- const input = event.target.value;
1642
- if (input === "") {
1643
- field.onChange(null);
1644
- } else {
1645
- onChange(event);
1646
- }
1647
- if (typeof customOnChange === "function") {
1648
- customOnChange(event);
1649
- }
1650
- return;
1651
- },
1652
- onBlur: (event) => {
1653
- field.onBlur();
1654
- if (typeof onBlur === "function") {
1655
- onBlur(event);
1656
- }
1657
- },
1658
- onInput: (event) => {
1659
- if (typeof onInput === "function") {
1660
- onInput(event);
1661
- }
1662
- },
1663
- disabled,
1664
- label: resolvedLabel,
1665
- placeholder: resolvedPlaceholder,
1666
- fullWidth: true,
1667
- required,
1668
- type,
1669
- error: !!error,
1670
- helperText: error ? parseError ? parseError(error) : error.message : helperText,
1671
- inputRef: handleInputRef,
1672
- variant: variant ? variant : "outlined"
1673
- }
1674
- );
1675
- };
1676
- var TextFieldElement2 = ({
1677
- gridProps = {},
1678
- ...props
1679
- }) => {
1680
- return /* @__PURE__ */ jsx11(Grid10, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx11(Component8, { ...props }) });
1681
- };
1682
-
1683
- // src/wrappers/TimePickerElement/TimePickerElement.tsx
1684
- import { Grid as Grid11, useForkRef as useForkRef4 } from "@mui/material";
1685
- import { TimePicker } from "@mui/x-date-pickers";
1686
- import { useLocalizationContext as useLocalizationContext2 } from "@mui/x-date-pickers/internals";
1687
- import { useController as useController11 } from "react-hook-form";
1688
- import { jsx as jsx12 } from "react/jsx-runtime";
1689
- var Component9 = function TimePickerElement(props) {
1690
- const {
1691
- name,
1692
- required,
1693
- inputProps,
1694
- control,
1695
- textReadOnly,
1696
- label,
1697
- labelKey,
1698
- placeholder,
1699
- placeholderKey,
1700
- namespace,
1701
- slotProps,
1702
- timePickerProps = {},
1703
- transform,
1704
- ...rest
1705
- } = props;
1706
- const adapter = useLocalizationContext2();
1707
- const { resolveLabel } = useFormI18n();
1708
- const resolvedLabel = resolveLabel(label, labelKey, namespace);
1709
- const resolvedPlaceholder = resolveLabel(placeholder, placeholderKey, namespace);
1710
- const { disabled, inputRef, onClose, ...restTimePickerProps } = timePickerProps;
1711
- const {
1712
- field,
1713
- fieldState: { error }
1714
- } = useController11({
1715
- name,
1716
- control,
1717
- defaultValue: null
1718
- });
1719
- const { value, onChange } = useTransform({
1720
- value: field.value,
1721
- onChange: field.onChange,
1722
- transform: {
1723
- input: typeof transform?.input === "function" ? transform.input : (newValue) => readValueAsDate(adapter, newValue),
1724
- output: (eventOrValue, value2) => {
1725
- const actualValue = value2 !== void 0 ? value2 : eventOrValue;
1726
- if (actualValue === null) return null;
1727
- return actualValue;
1728
- }
1729
- }
1730
- });
1731
- const handleInputRef = useForkRef4(field.ref, inputRef);
1732
- return /* @__PURE__ */ jsx12(
1733
- TimePicker,
1734
- {
1735
- ...rest,
1736
- ...restTimePickerProps,
1737
- ...field,
1738
- value,
1739
- label: resolvedLabel,
1740
- disabled,
1741
- ...timePickerProps,
1742
- inputRef: handleInputRef,
1743
- onClose: (...args) => {
1744
- field.onBlur();
1745
- if (onClose) {
1746
- onClose(...args);
1747
- }
1748
- },
1749
- onChange: (newValue, context) => {
1750
- onChange(newValue, context);
1751
- if (typeof timePickerProps.onChange === "function") {
1752
- timePickerProps.onChange(newValue, context);
1753
- }
1754
- },
1755
- slotProps: {
1756
- ...slotProps,
1757
- actionBar: {
1758
- actions: ["clear", "cancel", "accept"]
1759
- },
1760
- textField: {
1761
- ...inputProps,
1762
- required,
1763
- placeholder: resolvedPlaceholder,
1764
- fullWidth: true,
1765
- onBlur: (event) => {
1766
- field.onBlur();
1767
- if (typeof inputProps?.onBlur === "function") {
1768
- inputProps.onBlur(event);
1769
- }
1770
- },
1771
- error: !!error,
1772
- helperText: error ? error.message : inputProps?.helperText || rest.helperText,
1773
- inputProps: {
1774
- readOnly: !!textReadOnly,
1775
- ...inputProps?.inputProps
1776
- }
1777
- }
1778
- }
1779
- }
1780
- );
1781
- };
1782
- var TimePickerElement2 = ({
1783
- gridProps = {},
1784
- ...props
1785
- }) => {
1786
- return /* @__PURE__ */ jsx12(Grid11, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx12(Component9, { ...props }) });
1787
- };
1788
- TimePickerElement2.displayName = "TimePickerElement";
1789
-
1790
- // src/wrappers/OTPInputElement/OTPInputElement.tsx
1791
- import { Box, Grid as Grid12, inputBaseClasses } from "@mui/material";
1792
- import {
1793
- MuiOtpInput
1794
- } from "mui-one-time-password-input";
1795
- import { Controller } from "react-hook-form";
1796
-
1797
- // src/wrappers/OTPInputElement/HelperText.tsx
1798
- import FormHelperText4 from "@mui/material/FormHelperText";
1799
- import { jsx as jsx13 } from "react/jsx-runtime";
1800
- function HelperText({
1801
- sx,
1802
- helperText,
1803
- errorMessage,
1804
- disableGutters,
1805
- ...other
1806
- }) {
1807
- if (errorMessage || helperText) {
1808
- return /* @__PURE__ */ jsx13(
1809
- FormHelperText4,
1810
- {
1811
- error: !!errorMessage,
1812
- sx: [
1813
- {
1814
- mx: disableGutters ? 0 : 1.75
1815
- },
1816
- ...Array.isArray(sx) ? sx : [sx]
1817
- ],
1818
- ...other,
1819
- children: errorMessage || helperText
1820
- }
1821
- );
1822
- }
1823
- return null;
1824
- }
1825
-
1826
- // src/wrappers/OTPInputElement/OTPInputElement.tsx
1827
- import { jsx as jsx14, jsxs as jsxs6 } from "react/jsx-runtime";
1828
- var Component10 = function OTPInputElement(props) {
1829
- const {
1830
- // parseError,
1831
- name,
1832
- control,
1833
- slotProps,
1834
- helperText,
1835
- maxSize = 56,
1836
- placeholder = "-",
1837
- ...rest
1838
- } = props;
1839
- return /* @__PURE__ */ jsx14(
1840
- Controller,
1841
- {
1842
- name,
1843
- control,
1844
- render: ({ field, fieldState: { error } }) => /* @__PURE__ */ jsxs6(
1845
- Box,
1846
- {
1847
- ...slotProps?.wrapper,
1848
- sx: [
1849
- {
1850
- display: "flex",
1851
- justifyContent: "center",
1852
- [`& .${inputBaseClasses.input}`]: {
1853
- p: 0,
1854
- height: "auto",
1855
- aspectRatio: "1/1",
1856
- maxWidth: maxSize
1857
- }
1858
- },
1859
- ...Array.isArray(slotProps?.wrapper?.sx) ? slotProps?.wrapper?.sx ?? [] : [slotProps?.wrapper?.sx]
1860
- ],
1861
- children: [
1862
- /* @__PURE__ */ jsx14(
1863
- MuiOtpInput,
1864
- {
1865
- ...field,
1866
- autoFocus: true,
1867
- gap: 1.5,
1868
- length: 4,
1869
- TextFieldsProps: {
1870
- placeholder,
1871
- error: !!error,
1872
- ...slotProps?.textfield
1873
- },
1874
- ...rest
1875
- }
1876
- ),
1877
- /* @__PURE__ */ jsx14(
1878
- HelperText,
1879
- {
1880
- ...slotProps?.helperText,
1881
- errorMessage: error?.message,
1882
- helperText
1883
- }
1884
- )
1885
- ]
1886
- }
1887
- )
1888
- }
1889
- );
1890
- };
1891
- var OTPInputElement2 = ({
1892
- gridProps = {},
1893
- ...props
1894
- }) => {
1895
- return /* @__PURE__ */ jsx14(Grid12, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx14(Component10, { ...props }) });
1896
- };
1897
-
1898
- // src/wrappers/AsyncSelect/index.tsx
1899
- import {
1900
- Autocomplete as Autocomplete5,
1901
- CircularProgress as CircularProgress3,
1902
- Grid as Grid13,
1903
- TextField as TextField7
1904
- } from "@mui/material";
1905
- import { debounce as debounce2 } from "@mui/material/utils";
1906
- import * as React4 from "react";
1907
- import {
1908
- Fragment as Fragment3,
1909
- useCallback as useCallback7,
1910
- useEffect as useEffect6,
1911
- useMemo as useMemo9,
1912
- useRef as useRef3,
1913
- useState as useState4
1914
- } from "react";
1915
- import {
1916
- useController as useController12
1917
- } from "react-hook-form";
1918
- import { jsx as jsx15, jsxs as jsxs7 } from "react/jsx-runtime";
1919
- var Component11 = function AsyncSelectElement(props) {
1920
- const {
1921
- name,
1922
- disabled,
1923
- control,
1924
- placeholder,
1925
- initialValue,
1926
- label,
1927
- queryFn,
1928
- variant,
1929
- labelField = "Label",
1930
- valueField = "Value",
1931
- ...rest
1932
- } = props;
1933
- const {
1934
- field,
1935
- fieldState: { error }
1936
- } = useController12({
1937
- name,
1938
- control
1939
- });
1940
- const [loading, setLoading] = useState4(false);
1941
- const [selectedOption, setSelectedOption] = useState4(null);
1942
- const [inputValue, setInputValue] = useState4("");
1943
- const inputValue2 = useMemo9(() => inputValue, [inputValue]);
1944
- const setInputValue2 = useCallback7(
1945
- (newValue) => setInputValue(newValue),
1946
- []
1947
- );
1948
- const [options, setOptions] = useState4([]);
1949
- const initialValueLoaded = useRef3(
1950
- !initialValue ? true : !(initialValue != null)
1951
- );
1952
- const fieldValue = useRef3(field.value);
1953
- const fetchData = useMemo9(
1954
- () => debounce2(
1955
- (payload, callback) => {
1956
- queryFn(payload).then((c) => callback(c));
1957
- },
1958
- 400
1959
- ),
1960
- [queryFn]
1961
- );
1962
- const fillOptions = useCallback7(
1963
- (results) => {
1964
- let newOptions = [];
1965
- if (selectedOption) {
1966
- newOptions = [selectedOption];
1967
- }
1968
- if (results) {
1969
- newOptions = [...newOptions, ...results];
1970
- }
1971
- setOptions(newOptions);
1972
- setLoading(false);
1973
- },
1974
- [selectedOption]
1975
- );
1976
- useEffect6(() => {
1977
- if (initialValueLoaded.current) return void 0;
1978
- let active = true;
1979
- const payload = {
1980
- query: null,
1981
- initialValue
1982
- };
1983
- setLoading(true);
1984
- fetchData(payload, (results) => {
1985
- if (active) {
1986
- if (!!results && results.length > 0) {
1987
- fillOptions(results?.filter((c) => c[valueField] == initialValue));
1988
- setSelectedOption(results[0]);
1989
- field.onChange(results[0][valueField]);
1990
- fieldValue.current = results[0][valueField];
1991
- }
1992
- initialValueLoaded.current = true;
1993
- setLoading(false);
1994
- }
1995
- });
1996
- return () => {
1997
- active = false;
1998
- };
1999
- }, [initialValue, fetchData, field, fillOptions, valueField]);
2000
- React4.useEffect(() => {
2001
- let active = true;
2002
- if (inputValue2 === "" || initialValueLoaded.current === false) {
2003
- setOptions(selectedOption ? [selectedOption] : []);
2004
- setLoading(false);
2005
- return void 0;
2006
- }
2007
- if (fieldValue.current) {
2008
- if (field.value === fieldValue.current) {
2009
- return void 0;
2010
- }
2011
- }
2012
- setLoading(true);
2013
- const payload = {
2014
- query: inputValue2,
2015
- initialValue: null
2016
- };
2017
- fetchData(payload, (results) => {
2018
- if (active) {
2019
- fillOptions(results);
2020
- }
2021
- });
2022
- return () => {
2023
- active = false;
2024
- };
2025
- }, [
2026
- initialValue,
2027
- inputValue2,
2028
- fetchData,
2029
- field.value,
2030
- fillOptions,
2031
- selectedOption
2032
- ]);
2033
- const selectRef = useRef3(null);
2034
- const handleChange = (_, newSelectedOption, reason) => {
2035
- if (reason === "clear") {
2036
- setSelectedOption(null);
2037
- field.onChange(null);
2038
- setLoading(false);
2039
- } else if (reason === "selectOption" || reason === "removeOption") {
2040
- if (newSelectedOption) {
2041
- setSelectedOption(newSelectedOption);
2042
- field.onChange(newSelectedOption[valueField]);
2043
- fieldValue.current = newSelectedOption[valueField];
2044
- setLoading(false);
2045
- }
2046
- }
2047
- setOptions([]);
2048
- setLoading(false);
2049
- };
2050
- useEffect6(() => {
2051
- if (!field.value) {
2052
- setInputValue("");
2053
- setSelectedOption(null);
2054
- setLoading(false);
2055
- }
2056
- }, [field.value]);
2057
- const getOptionValue = (option) => {
2058
- return option ? String(option[valueField]) : "";
2059
- };
2060
- const getOptionLabel = (option) => {
2061
- return option ? String(option[labelField]) : "";
2062
- };
2063
- return /* @__PURE__ */ jsx15(
2064
- Autocomplete5,
2065
- {
2066
- ...rest,
2067
- ref: selectRef,
2068
- fullWidth: true,
2069
- loading,
2070
- getOptionLabel,
2071
- getOptionKey: getOptionValue,
2072
- isOptionEqualToValue: (option, value) => getOptionValue(option) === getOptionValue(value),
2073
- autoComplete: true,
2074
- disabled,
2075
- includeInputInList: true,
2076
- options,
2077
- filterOptions: (x) => x,
2078
- value: selectedOption,
2079
- filterSelectedOptions: true,
2080
- onChange: handleChange,
2081
- onInputChange: (_, newInputValue) => {
2082
- setInputValue2(newInputValue);
2083
- },
2084
- noOptionsText: "Type Something...",
2085
- renderInput: (params) => /* @__PURE__ */ jsx15(
2086
- TextField7,
2087
- {
2088
- ...params,
2089
- label,
2090
- error: !!error,
2091
- helperText: error ? error.message : "",
2092
- placeholder,
2093
- slotProps: {
2094
- input: {
2095
- ...params.InputProps,
2096
- endAdornment: /* @__PURE__ */ jsxs7(Fragment3, { children: [
2097
- loading ? /* @__PURE__ */ jsx15(CircularProgress3, { color: "inherit", size: 20 }) : null,
2098
- params.InputProps.endAdornment
2099
- ] })
2100
- }
2101
- },
2102
- variant: variant ? variant : "outlined"
2103
- }
2104
- ),
2105
- renderOption: (renderProps, option) => {
2106
- const { key, ...optionProps } = renderProps;
2107
- return /* @__PURE__ */ jsx15("li", { ...optionProps, children: option[labelField] }, key);
2108
- }
2109
- }
2110
- );
2111
- };
2112
- var AsyncSelectElement2 = ({
2113
- gridProps = {},
2114
- ...props
2115
- }) => {
2116
- return /* @__PURE__ */ jsx15(Grid13, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx15(
2117
- Component11,
2118
- {
2119
- ...props
2120
- }
2121
- ) });
2122
- };
2123
- AsyncSelectElement2.displayName = "AsyncSelectElement";
2124
-
2125
- // src/wrappers/NumberFieldElement/NumberFieldElement.tsx
2126
- import { Grid as Grid14, TextField as TextField8, useForkRef as useForkRef5 } from "@mui/material";
2127
- import { useController as useController13 } from "react-hook-form";
2128
- import { jsx as jsx16 } from "react/jsx-runtime";
2129
- var Component12 = function NumberFieldElement(props) {
2130
- const {
2131
- parseError,
2132
- name,
2133
- control,
2134
- component: TextFieldComponent = TextField8,
2135
- transform,
2136
- fieldType = "text",
2137
- // Default to text type
2138
- defaultValue,
2139
- label,
2140
- placeholder,
2141
- textFieldProps = {},
2142
- variant,
2143
- onChange: customOnChange,
2144
- enableWarnings = process.env.NODE_ENV === "development",
2145
- ...rest
2146
- } = props;
2147
- const {
2148
- type = "number",
2149
- required,
2150
- helperText,
2151
- inputRef,
2152
- onInput,
2153
- onBlur,
2154
- disabled,
2155
- ...restTextProps
2156
- } = textFieldProps;
2157
- const {
2158
- field,
2159
- fieldState: { error }
2160
- } = useController13({
2161
- name,
2162
- control
2163
- });
2164
- const { value, onChange } = useEnhancedTransform(
2165
- {
2166
- value: field.value,
2167
- onChange: field.onChange,
2168
- transform: transform ? {
2169
- input: transform.input,
2170
- output: transform.output
2171
- } : void 0,
2172
- fieldType: !transform ? type === "number" ? "number" : fieldType : void 0,
2173
- // Auto-detect number type
2174
- defaultValue,
2175
- enableWarnings
2176
- }
2177
- );
2178
- const handleInputRef = useForkRef5(field.ref, inputRef);
2179
- return /* @__PURE__ */ jsx16(
2180
- TextFieldComponent,
2181
- {
2182
- ...rest,
2183
- ...restTextProps,
2184
- name: field.name,
2185
- value,
2186
- onChange: (event) => {
2187
- const input = event.target.value;
2188
- if (input === "") {
2189
- field.onChange(null);
2190
- }
2191
- onChange(event);
2192
- if (typeof customOnChange === "function") {
2193
- customOnChange(event);
2194
- }
2195
- },
2196
- onBlur: (event) => {
2197
- field.onBlur();
2198
- if (typeof onBlur === "function") {
2199
- onBlur(event);
2200
- }
2201
- },
2202
- onInput: (event) => {
2203
- if (typeof onInput === "function") {
2204
- onInput(event);
2205
- }
2206
- },
2207
- onWheel: (e) => {
2208
- e.target.blur();
2209
- },
2210
- onKeyDown: (e) => {
2211
- if (["e", "E", "ArrowDown", "ArrowUp"].includes(e.key)) {
2212
- e.preventDefault();
2213
- }
2214
- },
2215
- disabled,
2216
- label,
2217
- placeholder,
2218
- fullWidth: true,
2219
- required,
2220
- type,
2221
- error: !!error,
2222
- helperText: error ? parseError ? parseError(error) : error.message : helperText,
2223
- inputRef: handleInputRef,
2224
- variant: variant ? variant : "outlined"
2225
- }
2226
- );
2227
- };
2228
- var NumberFieldElement2 = ({
2229
- gridProps = {},
2230
- ...props
2231
- }) => {
2232
- return /* @__PURE__ */ jsx16(Grid14, { size: 12, ...gridProps, children: /* @__PURE__ */ jsx16(Component12, { ...props }) });
2233
- };
2234
-
2235
- // src/wrappers/Field/index.ts
2236
- var Field = {
2237
- Text: TextFieldElement2,
2238
- Number: NumberFieldElement2,
2239
- Checkbox: CheckboxElement2,
2240
- Date: DatePickerElement,
2241
- RadioGroup: RadioButtonGroup2,
2242
- Password: PasswordElement,
2243
- Time: TimePickerElement2,
2244
- Select: SelectElement2,
2245
- SelectMulti: SelectMultiElement2,
2246
- SelectCascade: SelectCascadeElement2,
2247
- AsyncSelect: AsyncSelectElement2,
2248
- AsyncMultiSelect: AsyncMultiSelect2,
2249
- CheckboxGroup: CheckboxGroup2,
2250
- OTPInput: OTPInputElement2
2251
- };
2252
-
2253
- export {
2254
- isValidOption,
2255
- normalizeOptions,
2256
- AsyncMultiSelect2,
2257
- CheckboxElement2 as CheckboxElement,
2258
- CheckboxGroup2 as CheckboxGroup,
2259
- readDatePickerValueAsDate,
2260
- useDatePickerValue,
2261
- useDatePickerValidation,
2262
- useDatePickerStyles,
2263
- DatePickerElementCore,
2264
- DatePickerElement,
2265
- isValidDate,
2266
- isParsableDateString,
2267
- createDateInputTransform,
2268
- createDateOutputTransform,
2269
- createDefaultDatePickerConfig,
2270
- extractErrorMessage,
2271
- createStableKey,
2272
- PasswordElement,
2273
- RadioButtonGroup2 as RadioButtonGroup,
2274
- SelectCascadeElement2 as SelectCascadeElement,
2275
- SelectElement2 as SelectElement,
2276
- SelectMultiElement2 as SelectMultiElement,
2277
- TextFieldElement2 as TextFieldElement,
2278
- TimePickerElement2 as TimePickerElement,
2279
- Field
2280
- };
2281
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3dyYXBwZXJzL3R5cGVzL2NvbW1vbi50cyIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNNdWx0aVNlbGVjdDIvQXN5bmNNdWx0aVNlbGVjdDIudHN4IiwgIi4uL3NyYy93cmFwcGVycy9DaGVja2JveEVsZW1lbnQvQ2hlY2tib3hFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQ2hlY2tib3hHcm91cC9DaGVja2JveEdyb3VwLnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRGF0ZVBpY2tlckVsZW1lbnQvRGF0ZVBpY2tlckVsZW1lbnQudHN4IiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9EYXRlUGlja2VyRWxlbWVudENvcmUudHN4IiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyVmFsdWUudHMiLCAiLi4vc3JjL3dyYXBwZXJzL0RhdGVQaWNrZXJFbGVtZW50L2hvb2tzL3VzZURhdGVQaWNrZXJWYWxpZGF0aW9uLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC9ob29rcy91c2VEYXRlUGlja2VyU3R5bGVzLnRzIiwgIi4uL3NyYy93cmFwcGVycy9EYXRlUGlja2VyRWxlbWVudC91dGlscy50cyIsICIuLi9zcmMvd3JhcHBlcnMvUGFzc3dvcmRFbGVtZW50L1Bhc3N3b3JkRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1JhZGlvQnV0dG9uR3JvdXAvUmFkaW9CdXR0b25Hcm91cC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1NlbGVjdENhc2NhZGVFbGVtZW50L1NlbGVjdENhc2NhZGVFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvU2VsZWN0RWxlbWVudC9TZWxlY3RFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvU2VsZWN0TXVsdGlFbGVtZW50L1NlbGVjdE11bHRpRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1RleHRGaWVsZEVsZW1lbnQvVGV4dEZpZWxkRWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL1RpbWVQaWNrZXJFbGVtZW50L1RpbWVQaWNrZXJFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvT1RQSW5wdXRFbGVtZW50L09UUElucHV0RWxlbWVudC50c3giLCAiLi4vc3JjL3dyYXBwZXJzL09UUElucHV0RWxlbWVudC9IZWxwZXJUZXh0LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvQXN5bmNTZWxlY3QvaW5kZXgudHN4IiwgIi4uL3NyYy93cmFwcGVycy9OdW1iZXJGaWVsZEVsZW1lbnQvTnVtYmVyRmllbGRFbGVtZW50LnRzeCIsICIuLi9zcmMvd3JhcHBlcnMvRmllbGQvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29tbW9uIHR5cGUgZGVmaW5pdGlvbnMgZm9yIHdyYXBwZXIgY29tcG9uZW50c1xuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8qKlxuICogQmFzZSBvcHRpb24gdHlwZSBmb3Igc2VsZWN0LWJhc2VkIGNvbXBvbmVudHNcbiAqXG4gKiBAdGVtcGxhdGUgViAtIFRoZSB2YWx1ZSB0eXBlIChzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlT3B0aW9uPFYgPSBzdHJpbmcgfCBudW1iZXI+IHtcbiAgLyoqXG4gICAqIERpc3BsYXkgbGFiZWwgZm9yIHRoZSBvcHRpb25cbiAgICovXG4gIExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uXG4gICAqL1xuICBWYWx1ZTogVjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3B0aW9uIGlzIGRpc2FibGVkXG4gICAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRmxleGlibGUgb3B0aW9uIHR5cGUgdGhhdCBleHRlbmRzIGJhc2Ugb3B0aW9uIHdpdGggYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG4gKlxuICogQHRlbXBsYXRlIFQgLSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgb2JqZWN0XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBGbGV4aWJsZU9wdGlvbjxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4+ID0gVCAmIEJhc2VPcHRpb247XG5cbi8qKlxuICogT3B0aW9uIHR5cGUgd2l0aCBjdXN0b21pemFibGUga2V5IG5hbWVzXG4gKiBVc2VmdWwgZm9yIGNvbXBvbmVudHMgdGhhdCBhY2NlcHQgY3VzdG9tIGxhYmVsRmllbGQvdmFsdWVGaWVsZCBwcm9wc1xuICpcbiAqIEB0ZW1wbGF0ZSBUVmFsdWVLZXkgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3IgdmFsdWVcbiAqIEB0ZW1wbGF0ZSBUTGFiZWxLZXkgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3IgbGFiZWxcbiAqIEB0ZW1wbGF0ZSBURGlzYWJsZWRLZXkgLSBUaGUgcHJvcGVydHkgbmFtZSBmb3IgZGlzYWJsZWQgZmxhZ1xuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgQ3VzdG9tS2V5T3B0aW9uPFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IFJlY29yZDxUVmFsdWVLZXksIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+ICZcbiAgUmVjb3JkPFRMYWJlbEtleSwgc3RyaW5nPiAmXG4gIFBhcnRpYWw8UmVjb3JkPFREaXNhYmxlZEtleSwgYm9vbGVhbj4+ICZcbiAgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICogTGVnYWN5IG9wdGlvbiB0eXBlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICogVXNlcyBWYWx1ZS9MYWJlbCBuYW1pbmcgY29udmVudGlvblxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBCYXNlT3B0aW9uIG9yIEZsZXhpYmxlT3B0aW9uIGluc3RlYWRcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMZWdhY3lPcHRpb24ge1xuICAvKipcbiAgICogRGlzcGxheSBsYWJlbCBmb3IgdGhlIG9wdGlvbiAoY2FwaXRhbGl6ZWQga2V5IG5hbWUpXG4gICAqL1xuICBMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIG9wdGlvbiAoY2FwaXRhbGl6ZWQga2V5IG5hbWUpXG4gICAqL1xuICBWYWx1ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvcHRpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIERpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpcyBhIHZhbGlkIG9wdGlvblxuICpcbiAqIEBwYXJhbSBWYWx1ZSAtIFZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkT3B0aW9uKFZhbHVlOiB1bmtub3duKTogVmFsdWUgaXMgQmFzZU9wdGlvbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIFZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIFZhbHVlICE9PSBudWxsICYmXG4gICAgJ2xhYmVsJyBpbiBWYWx1ZSAmJlxuICAgICd2YWx1ZScgaW4gVmFsdWUgJiZcbiAgICB0eXBlb2YgKFZhbHVlIGFzIEJhc2VPcHRpb24pLkxhYmVsID09PSAnc3RyaW5nJyAmJlxuICAgICh0eXBlb2YgKFZhbHVlIGFzIEJhc2VPcHRpb24pLlZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgdHlwZW9mIChWYWx1ZSBhcyBCYXNlT3B0aW9uKS5WYWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICAgIHR5cGVvZiAoVmFsdWUgYXMgQmFzZU9wdGlvbikuVmFsdWUgPT09ICdib29sZWFuJylcbiAgKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gbm9ybWFsaXplIG9wdGlvbnMgdG8gQmFzZU9wdGlvbiBmb3JtYXRcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgYXJyYXkgdG8gbm9ybWFsaXplXG4gKiBAcGFyYW0gbGFiZWxGaWVsZCAtIEN1c3RvbSBsYWJlbCBmaWVsZCBuYW1lIGluIG9wdGlvbiBvYmplY3RzXG4gKiBAcGFyYW0gdmFsdWVGaWVsZCAtIEN1c3RvbSB2YWx1ZSBmaWVsZCBuYW1lIGluIG9wdGlvbiBvYmplY3RzXG4gKiBAcmV0dXJucyBOb3JtYWxpemVkIG9wdGlvbnMgYXJyYXlcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPcHRpb25zPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIG9wdGlvbnM6IFRbXSxcbiAgbGFiZWxGaWVsZCA9ICdsYWJlbCcsXG4gIHZhbHVlRmllbGQgPSAndmFsdWUnXG4pOiBCYXNlT3B0aW9uW10ge1xuICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgbGFiZWw6IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZF0gPz8gJycpLFxuICAgIHZhbHVlOiBvcHRpb25bdmFsdWVGaWVsZF0gYXMgc3RyaW5nIHwgbnVtYmVyLFxuICAgIGRpc2FibGVkOiBCb29sZWFuKG9wdGlvbi5kaXNhYmxlZCksXG4gIH0pKTtcbn1cbiIsICJpbXBvcnQge1xuICBBdXRvY29tcGxldGUsXG4gIENpcmN1bGFyUHJvZ3Jlc3MsXG4gIEdyaWQsXG4gIFRleHRGaWVsZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlUmVkdWNlciwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUge1xuICBBc3luY011bHRpU2VsZWN0MlByb3BzLFxuICBBc3luY1NlbGVjdDJQYXlsb2FkLFxuICBPcHRpb24ySXRlbSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmludGVyZmFjZSBDb21wb25lbnRTdGF0ZSB7XG4gIG9wdGlvbnM6IE9wdGlvbjJJdGVtW107XG4gIHNlbGVjdGVkT3B0aW9uczogT3B0aW9uMkl0ZW1bXTtcbiAgaW5wdXRWYWx1ZTogc3RyaW5nO1xuICBsb2FkaW5nOiBib29sZWFuO1xuICBpbml0aWFsTG9hZGVkOiBib29sZWFuO1xufVxuXG50eXBlIENvbXBvbmVudEFjdGlvbiA9XG4gIHwgeyB0eXBlOiAnU0VUX09QVElPTlMnOyBwYXlsb2FkOiBPcHRpb24ySXRlbVtdIH1cbiAgfCB7IHR5cGU6ICdTRVRfU0VMRUNURURfT1BUSU9OUyc7IHBheWxvYWQ6IE9wdGlvbjJJdGVtW10gfVxuICB8IHsgdHlwZTogJ1NFVF9JTlBVVF9WQUxVRSc7IHBheWxvYWQ6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnU0VUX0xPQURJTkcnOyBwYXlsb2FkOiBib29sZWFuIH1cbiAgfCB7IHR5cGU6ICdTRVRfSU5JVElBTF9MT0FERUQnOyBwYXlsb2FkOiBib29sZWFuIH1cbiAgfCB7IHR5cGU6ICdSRVNFVF9PUFRJT05TJyB9O1xuXG5jb25zdCBpbml0aWFsU3RhdGU6IENvbXBvbmVudFN0YXRlID0ge1xuICBvcHRpb25zOiBbXSxcbiAgc2VsZWN0ZWRPcHRpb25zOiBbXSxcbiAgaW5wdXRWYWx1ZTogJycsXG4gIGxvYWRpbmc6IGZhbHNlLFxuICBpbml0aWFsTG9hZGVkOiBmYWxzZSxcbn07XG5cbmZ1bmN0aW9uIGNvbXBvbmVudFJlZHVjZXIoXG4gIHN0YXRlOiBDb21wb25lbnRTdGF0ZSxcbiAgYWN0aW9uOiBDb21wb25lbnRBY3Rpb25cbik6IENvbXBvbmVudFN0YXRlIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgJ1NFVF9PUFRJT05TJzpcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCBvcHRpb25zOiBhY3Rpb24ucGF5bG9hZCwgbG9hZGluZzogZmFsc2UgfTtcbiAgICBjYXNlICdTRVRfU0VMRUNURURfT1BUSU9OUyc6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgc2VsZWN0ZWRPcHRpb25zOiBhY3Rpb24ucGF5bG9hZCB9O1xuICAgIGNhc2UgJ1NFVF9JTlBVVF9WQUxVRSc6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgaW5wdXRWYWx1ZTogYWN0aW9uLnBheWxvYWQgfTtcbiAgICBjYXNlICdTRVRfTE9BRElORyc6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgbG9hZGluZzogYWN0aW9uLnBheWxvYWQgfTtcbiAgICBjYXNlICdTRVRfSU5JVElBTF9MT0FERUQnOlxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGluaXRpYWxMb2FkZWQ6IGFjdGlvbi5wYXlsb2FkIH07XG4gICAgY2FzZSAnUkVTRVRfT1BUSU9OUyc6XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgb3B0aW9uczogc3RhdGUuc2VsZWN0ZWRPcHRpb25zIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuXG5jb25zdCBBc3luY011bHRpU2VsZWN0MkNvbXBvbmVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIG5hbWUsXG4gIGNvbnRyb2wsXG4gIHBsYWNlaG9sZGVyLFxuICBpbml0aWFsVmFsdWVzLFxuICBsYWJlbCxcbiAgcXVlcnlGbixcbiAgdmFyaWFudCA9ICdvdXRsaW5lZCcsXG4gIGRpc2FibGVkID0gZmFsc2UsXG4gIGRlYm91bmNlTXMgPSA0MDAsXG4gIGxvYWRpbmdUZXh0ID0gJ0xvYWRpbmcuLi4nLFxuICBub09wdGlvbnNUZXh0ID0gJ05vIG9wdGlvbnMnLFxuICByZW5kZXJJbnB1dCxcbiAgLi4ucmVzdFxufTogQXN5bmNNdWx0aVNlbGVjdDJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuICBjb25zdCBbc3RhdGUsIGRpc3BhdGNoXSA9IHVzZVJlZHVjZXIoY29tcG9uZW50UmVkdWNlciwgaW5pdGlhbFN0YXRlKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBkZWJvdW5jZWRGZXRjaCA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGRlYm91bmNlKGFzeW5jIChwYXlsb2FkOiBBc3luY1NlbGVjdDJQYXlsb2FkKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5Rm4ocGF5bG9hZCk7XG5cbiAgICAgICAgICAvLyBNZXJnZSBzZWxlY3RlZCBvcHRpb25zIHdpdGggc2VhcmNoIHJlc3VsdHMsIGF2b2lkaW5nIGR1cGxpY2F0ZXNcbiAgICAgICAgICBjb25zdCBtZXJnZWRPcHRpb25zID0gW1xuICAgICAgICAgICAgLi4uc3RhdGUuc2VsZWN0ZWRPcHRpb25zLFxuICAgICAgICAgICAgLi4ucmVzdWx0cy5maWx0ZXIoXG4gICAgICAgICAgICAgIG9wdGlvbiA9PlxuICAgICAgICAgICAgICAgICFzdGF0ZS5zZWxlY3RlZE9wdGlvbnMuc29tZShcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0+IHNlbGVjdGVkLnZhbHVlID09PSBvcHRpb24udmFsdWVcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICBkaXNwYXRjaCh7IHR5cGU6ICdTRVRfT1BUSU9OUycsIHBheWxvYWQ6IG1lcmdlZE9wdGlvbnMgfSk7XG4gICAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogJ1NFVF9MT0FESU5HJywgcGF5bG9hZDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sIGRlYm91bmNlTXMpLFxuICAgIFtxdWVyeUZuLCBzdGF0ZS5zZWxlY3RlZE9wdGlvbnMsIGRlYm91bmNlTXNdXG4gICk7XG5cbiAgLy8gTG9hZCBpbml0aWFsIHZhbHVlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaW5pdGlhbFZhbHVlcz8ubGVuZ3RoIHx8IHN0YXRlLmluaXRpYWxMb2FkZWQpIHJldHVybjtcblxuICAgIGRpc3BhdGNoKHsgdHlwZTogJ1NFVF9MT0FESU5HJywgcGF5bG9hZDogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jU2VsZWN0MlBheWxvYWQgPSB7XG4gICAgICBxdWVyeTogbnVsbCxcbiAgICAgIGluaXRpYWxWYWx1ZXMsXG4gICAgfTtcblxuICAgIHF1ZXJ5Rm4ocGF5bG9hZClcbiAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAocmVzdWx0cykge1xuICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogJ1NFVF9TRUxFQ1RFRF9PUFRJT05TJywgcGF5bG9hZDogcmVzdWx0cyB9KTtcbiAgICAgICAgICBkaXNwYXRjaCh7IHR5cGU6ICdTRVRfT1BUSU9OUycsIHBheWxvYWQ6IHJlc3VsdHMgfSk7XG4gICAgICAgICAgZGlzcGF0Y2goeyB0eXBlOiAnU0VUX0lOSVRJQUxfTE9BREVEJywgcGF5bG9hZDogdHJ1ZSB9KTtcbiAgICAgICAgICBmaWVsZC5vbkNoYW5nZShyZXN1bHRzLm1hcChvcHRpb24gPT4gb3B0aW9uLnZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBkaXNwYXRjaCh7IHR5cGU6ICdTRVRfTE9BRElORycsIHBheWxvYWQ6IGZhbHNlIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChfZXJyb3IgPT4ge1xuICAgICAgICBkaXNwYXRjaCh7IHR5cGU6ICdTRVRfTE9BRElORycsIHBheWxvYWQ6IGZhbHNlIH0pO1xuICAgICAgfSk7XG4gIH0sIFtpbml0aWFsVmFsdWVzLCBzdGF0ZS5pbml0aWFsTG9hZGVkLCBxdWVyeUZuLCBmaWVsZF0pO1xuXG4gIC8vIEhhbmRsZSBzZWFyY2ggaW5wdXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc3RhdGUuaW5pdGlhbExvYWRlZCkgcmV0dXJuO1xuXG4gICAgaWYgKHN0YXRlLmlucHV0VmFsdWUgPT09ICcnKSB7XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6ICdSRVNFVF9PUFRJT05TJyB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKHsgdHlwZTogJ1NFVF9MT0FESU5HJywgcGF5bG9hZDogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHBheWxvYWQ6IEFzeW5jU2VsZWN0MlBheWxvYWQgPSB7XG4gICAgICBxdWVyeTogc3RhdGUuaW5wdXRWYWx1ZSxcbiAgICAgIGluaXRpYWxWYWx1ZXM6IG51bGwsXG4gICAgfTtcblxuICAgIGRlYm91bmNlZEZldGNoKHBheWxvYWQpO1xuICB9LCBbc3RhdGUuaW5wdXRWYWx1ZSwgc3RhdGUuaW5pdGlhbExvYWRlZCwgZGVib3VuY2VkRmV0Y2hdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0LlN5bnRoZXRpY0V2ZW50LCBuZXdWYWx1ZTogT3B0aW9uMkl0ZW1bXSkgPT4ge1xuICAgICAgZGlzcGF0Y2goeyB0eXBlOiAnU0VUX1NFTEVDVEVEX09QVElPTlMnLCBwYXlsb2FkOiBuZXdWYWx1ZSB9KTtcbiAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlLm1hcChvcHRpb24gPT4gb3B0aW9uLnZhbHVlKSk7XG4gICAgfSxcbiAgICBbZmllbGRdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IFJlYWN0LlN5bnRoZXRpY0V2ZW50LCBuZXdJbnB1dFZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogJ1NFVF9JTlBVVF9WQUxVRScsIHBheWxvYWQ6IG5ld0lucHV0VmFsdWUgfSk7XG4gICAgfSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IGlzT3B0aW9uRXF1YWxUb1ZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogT3B0aW9uMkl0ZW0sIHZhbHVlOiBPcHRpb24ySXRlbSkgPT4gb3B0aW9uLnZhbHVlID09PSB2YWx1ZS52YWx1ZSxcbiAgICBbXVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gdXNlQ2FsbGJhY2soKG9wdGlvbjogT3B0aW9uMkl0ZW0pID0+IG9wdGlvbi5sYWJlbCwgW10pO1xuXG4gIGNvbnN0IGRlZmF1bHRSZW5kZXJJbnB1dCA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIHBhcmFtczogUGFyYW1ldGVyczxSZXF1aXJlZDxBc3luY011bHRpU2VsZWN0MlByb3BzPlsncmVuZGVySW5wdXQnXT5bMF1cbiAgICApID0+IChcbiAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnR9XG4gICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICBoZWxwZXJUZXh0PXtlcnJvcj8ubWVzc2FnZX1cbiAgICAgICAgc2xvdFByb3BzPXt7XG4gICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgIC4uLnBhcmFtcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgZW5kQWRvcm5tZW50OiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAge3N0YXRlLmxvYWRpbmcgJiYgKFxuICAgICAgICAgICAgICAgICAgPENpcmN1bGFyUHJvZ3Jlc3MgY29sb3I9XCJpbmhlcml0XCIgc2l6ZT17MjB9IC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICB7cGFyYW1zLklucHV0UHJvcHMuZW5kQWRvcm5tZW50fVxuICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgfX1cbiAgICAgIC8+XG4gICAgKSxcbiAgICBbXG4gICAgICBsYWJlbCxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgdmFyaWFudCxcbiAgICAgIGVycm9yLFxuICAgICAgc3RhdGUubG9hZGluZyxcbiAgICBdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICBtdWx0aXBsZVxuICAgICAgb3B0aW9ucz17c3RhdGUub3B0aW9uc31cbiAgICAgIHZhbHVlPXtzdGF0ZS5zZWxlY3RlZE9wdGlvbnN9XG4gICAgICBsb2FkaW5nPXtzdGF0ZS5sb2FkaW5nfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgaXNPcHRpb25FcXVhbFRvVmFsdWU9e2lzT3B0aW9uRXF1YWxUb1ZhbHVlfVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgb25JbnB1dENoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICBsb2FkaW5nVGV4dD17bG9hZGluZ1RleHR9XG4gICAgICBub09wdGlvbnNUZXh0PXtub09wdGlvbnNUZXh0fVxuICAgICAgcmVuZGVySW5wdXQ9e3JlbmRlcklucHV0IHx8IGRlZmF1bHRSZW5kZXJJbnB1dH1cbiAgICAgIHsuLi5yZXN0fVxuICAgIC8+XG4gICk7XG59O1xuXG5jb25zdCBBc3luY011bHRpU2VsZWN0MiA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogQXN5bmNNdWx0aVNlbGVjdDJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxBc3luY011bHRpU2VsZWN0MkNvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuQXN5bmNNdWx0aVNlbGVjdDIuZGlzcGxheU5hbWUgPSAnQXN5bmNNdWx0aVNlbGVjdDInO1xuXG5leHBvcnQgeyBBc3luY011bHRpU2VsZWN0MiB9O1xuIiwgImltcG9ydCB7XG4gIENoZWNrYm94LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xMYWJlbCxcbiAgRm9ybUdyb3VwLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgR3JpZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgRmllbGRQYXRoLCBGaWVsZFZhbHVlcywgUGF0aFZhbHVlIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyB1c2VUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0nO1xuaW1wb3J0IHsgdXNlRm9ybUkxOG4gfSBmcm9tICcuLi8uLi9pMThuJztcblxuaW1wb3J0IHR5cGUgeyBDaGVja2JveEVsZW1lbnRQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBDaGVja2JveEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4ocHJvcHM6IENoZWNrYm94RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgbGFiZWwsXG4gICAgbGFiZWxLZXksXG4gICAgbmFtZXNwYWNlLFxuICAgIGxhYmVsUHJvcHMsXG4gICAgaGVscGVyVGV4dCxcbiAgICBwYXJzZUVycm9yLFxuICAgIHRyYW5zZm9ybSxcbiAgICBkaXNhYmxlZCxcbiAgICBvbkNoYW5nZTogY3VzdG9tT25DaGFuZ2UsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgLy8gaTE4biBob29rIGZvciByZXNvbHZpbmcgdHJhbnNsYXRpb24ga2V5cyAobmFtZXNwYWNlIGZyb20gY29udGV4dCBpZiBub3Qgc3BlY2lmaWVkKVxuICBjb25zdCB7IHJlc29sdmVMYWJlbCB9ID0gdXNlRm9ybUkxOG4oKTtcbiAgY29uc3QgcmVzb2x2ZWRMYWJlbCA9IHJlc29sdmVMYWJlbChsYWJlbCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsIGxhYmVsS2V5LCBuYW1lc3BhY2UpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgZGlzYWJsZWQsXG4gIH0pO1xuXG4gIGlmIChmaWVsZC52YWx1ZSA9PSBudWxsIHx8IGZpZWxkLnZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgIGZpZWxkLm9uQ2hhbmdlKGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGN1c3RvbU91dHB1dFRyYW5zZm9ybSA9IHRyYW5zZm9ybT8ub3V0cHV0O1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgYm9vbGVhbj4oe1xuICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICBvbkNoYW5nZTogZmllbGQub25DaGFuZ2UsXG4gICAgdHJhbnNmb3JtOiB7XG4gICAgICBpbnB1dDpcbiAgICAgICAgdHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IHRyYW5zZm9ybS5pbnB1dFxuICAgICAgICAgIDogdmFsdWUgPT4gISF2YWx1ZSxcbiAgICAgIG91dHB1dDpcbiAgICAgICAgdHlwZW9mIGN1c3RvbU91dHB1dFRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gKGV2ZW50T3JWYWx1ZSwgX3ZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIC8vIEFkYXB0ZXI6IEV4dHJhY3QgZXZlbnQgYW5kIGNoZWNrZWQgZnJvbSB0aGUgY2hlY2tib3ggb25DaGFuZ2Ugc2lnbmF0dXJlXG4gICAgICAgICAgICAgIC8vIENoZWNrYm94RWxlbWVudCBwYXNzZXMgKGV2ZW50LCBjaGVja2VkKSwgYnV0IHVzZVRyYW5zZm9ybSBleHBlY3RzIChldmVudE9yVmFsdWUsIHZhbHVlKVxuICAgICAgICAgICAgICBjb25zdCBldmVudCA9IGV2ZW50T3JWYWx1ZSBhcyBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PjtcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IF92YWx1ZSBhcyB1bmtub3duIGFzIGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbU91dHB1dFRyYW5zZm9ybShldmVudCwgY2hlY2tlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiAoZXZlbnRPclZhbHVlLCBfdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgLy8gRGVmYXVsdDogZXh0cmFjdCBjaGVja2VkIHN0YXRlIGZyb20gdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IF92YWx1ZSBhcyB1bmtub3duIGFzIGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrZWQgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+LFxuICAgIGNoZWNrZWQ6IGJvb2xlYW5cbiAgKSA9PiB7XG4gICAgb25DaGFuZ2UoZXZlbnQsIGNoZWNrZWQpO1xuICAgIGlmICh0eXBlb2YgY3VzdG9tT25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1c3RvbU9uQ2hhbmdlKGV2ZW50LCBjaGVja2VkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZGlzcGxheUVycm9yOiBSZWFjdE5vZGUgPSBlcnJvclxuICAgID8gdHlwZW9mIHBhcnNlRXJyb3IgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcGFyc2VFcnJvcihlcnJvcilcbiAgICAgIDogZXJyb3IubWVzc2FnZVxuICAgIDogbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxGb3JtQ29udHJvbCBlcnJvcj17ISFlcnJvcn0gZGlzYWJsZWQ9e2Rpc2FibGVkfT5cbiAgICAgIDxGb3JtR3JvdXAgcm93PlxuICAgICAgICA8Rm9ybUNvbnRyb2xMYWJlbFxuICAgICAgICAgIGxhYmVsPXtyZXNvbHZlZExhYmVsIHx8ICcnfVxuICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAgICAgY29sb3I9e3Jlc3QuY29sb3IgfHwgJ3ByaW1hcnknfVxuICAgICAgICAgICAgICBjaGVja2VkPXt2YWx1ZX1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICByZWY9e2ZpZWxkLnJlZn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICB7KGRpc3BsYXlFcnJvciB8fCBoZWxwZXJUZXh0KSAmJiAoXG4gICAgICAgIDxGb3JtSGVscGVyVGV4dCBlcnJvcj17ISFlcnJvcn0+XG4gICAgICAgICAge2Rpc3BsYXlFcnJvciB8fCBoZWxwZXJUZXh0fVxuICAgICAgICA8L0Zvcm1IZWxwZXJUZXh0PlxuICAgICAgKX1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIENoZWNrYm94IGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uIGFuZCBncmlkIGxheW91dC5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGZ1bGx5IGludGVncmF0ZWQgY2hlY2tib3ggaW5wdXQgdGhhdCB3b3JrcyBzZWFtbGVzc2x5IHdpdGggcmVhY3QtaG9vay1mb3JtLFxuICogaW5jbHVkaW5nIGF1dG9tYXRpYyB2YWxpZGF0aW9uLCBlcnJvciBoYW5kbGluZywgdmFsdWUgdHJhbnNmb3JtYXRpb24sIGFuZCBvcHRpb25hbCBHcmlkIHdyYXBwZXIgZm9yIHJlc3BvbnNpdmUgbGF5b3V0cy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb24gd2l0aCB1c2VDb250cm9sbGVyXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5IHdpdGggY3VzdG9tIHBhcnNpbmcgc3VwcG9ydFxuICogLSBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiB3aXRoIHVzZVRyYW5zZm9ybSBob29rIGZvciBib29sZWFuIHZhbHVlc1xuICogLSBDdXN0b21pemFibGUgbGFiZWwgYW5kIHBvc2l0aW9uaW5nXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXIgd2l0aCByZXNwb25zaXZlIGRlc2lnblxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5IHdpdGggZ2VuZXJpYyBjb25zdHJhaW50c1xuICogLSBEaXNhYmxlZCBzdGF0ZSBzdXBwb3J0IHdpdGggcHJvcGVyIHRoZW1pbmdcbiAqIC0gSGVscGVyIHRleHQgc3VwcG9ydCBmb3IgYWRkaXRpb25hbCBjb250ZXh0XG4gKiAtIEN1c3RvbSBlcnJvciBwYXJzaW5nIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvblxuICogLSBTaW1wbGUgYm9vbGVhbiB2YWx1ZSBoYW5kbGluZyB3aXRoIG9wdGlvbmFsIGN1c3RvbSB0cmFuc2Zvcm1zXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJhY2NlcHRUZXJtc1wiXG4gKiAgIGxhYmVsPVwiSSBhZ3JlZSB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnNcIlxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHZhbGlkYXRpb24gYW5kIGhlbHBlciB0ZXh0OlxuICogYGBgdHN4XG4gKiA8Q2hlY2tib3hFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJuZXdzbGV0dGVyXCJcbiAqICAgbGFiZWw9XCJTdWJzY3JpYmUgdG8gbmV3c2xldHRlclwiXG4gKiAgIGhlbHBlclRleHQ9XCJZb3UgY2FuIHVuc3Vic2NyaWJlIGF0IGFueSB0aW1lXCJcbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdQbGVhc2UgYWNjZXB0IHRvIGNvbnRpbnVlJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gZ3JpZCBsYXlvdXQgYW5kIHN0eWxpbmc6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImlzUHVibGljXCJcbiAqICAgbGFiZWw9XCJNYWtlIHRoaXMgcHVibGljXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIGxhYmVsUHJvcHM9e3sgc3g6IHsgZm9udFdlaWdodDogJ2JvbGQnIH0gfX1cbiAqICAgc3g9e3sgY29sb3I6ICdwcmltYXJ5Lm1haW4nIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggdmFsdWUgdHJhbnNmb3JtYXRpb24gKHN0cmluZyB0byBib29sZWFuKTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwic3RhdHVzXCJcbiAqICAgbGFiZWw9XCJBY3RpdmVcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKHZhbHVlKSA9PiB2YWx1ZSA9PT0gJ2FjdGl2ZScsXG4gKiAgICAgb3V0cHV0OiAoY2hlY2tlZCkgPT4gY2hlY2tlZCA/ICdhY3RpdmUnIDogJ2luYWN0aXZlJ1xuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBTaW1wbGUgYm9vbGVhbiBmaWVsZDpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiaXNFbmFibGVkXCJcbiAqICAgbGFiZWw9XCJFbmFibGUgZmVhdHVyZVwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSBlcnJvciBwYXJzaW5nIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbjpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94RWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwidGVybXNcIlxuICogICBsYWJlbD1cIkFjY2VwdCBUZXJtc1wiXG4gKiAgIHBhcnNlRXJyb3I9eyhlcnJvcikgPT4gdChgdmFsaWRhdGlvbi4ke2Vycm9yLnR5cGV9YCwgeyBmaWVsZDogJ1Rlcm1zJyB9KX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHNcbiAqIEByZXR1cm5zIFJlYWN0IGVsZW1lbnQgd2l0aCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IENoZWNrYm94RWxlbWVudCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogQ2hlY2tib3hFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50PFRGaWVsZFZhbHVlcywgVE5hbWU+IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5leHBvcnQgeyBDaGVja2JveEVsZW1lbnQgfTtcblxuZXhwb3J0IHR5cGUgeyBDaGVja2JveEVsZW1lbnRQcm9wcyB9IGZyb20gJy4vdHlwZXMnO1xuIiwgImltcG9ydCB0eXBlIHtcbiAgQ2hlY2tib3hQcm9wcyxcbiAgRm9ybUNvbnRyb2xMYWJlbFByb3BzLFxuICBHcmlkUHJvcHMsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHtcbiAgQ2hlY2tib3gsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1IZWxwZXJUZXh0LFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgQ29udHJvbCwgRmllbGRQYXRoLCBGaWVsZFZhbHVlcyB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBMZWdhY3lPcHRpb24gfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBDaGVja2JveEdyb3VwIGNvbXBvbmVudFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB2YWx1ZSBhcnJheSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBDaGVja2JveEdyb3VwUHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4gPSBPbWl0PENoZWNrYm94UHJvcHMsICduYW1lJz4gJiB7XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG5cbiAgLyoqXG4gICAqIExhYmVsIGZvciB0aGUgY2hlY2tib3ggZ3JvdXBcbiAgICovXG4gIGxhYmVsPzogRm9ybUNvbnRyb2xMYWJlbFByb3BzWydsYWJlbCddO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciBGb3JtQ29udHJvbExhYmVsXG4gICAqL1xuICBsYWJlbFByb3BzPzogT21pdDxGb3JtQ29udHJvbExhYmVsUHJvcHMsICdsYWJlbCcgfCAnY29udHJvbCc+O1xuXG4gIC8qKlxuICAgKiBHcmlkIGxheW91dCBwcm9wcyBmb3IgdGhlIHdyYXBwZXJcbiAgICogQGRlZmF1bHRWYWx1ZSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9XG4gICAqL1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIG9wdGlvbnMgZm9yIHRoZSBjaGVja2JveCBncm91cFxuICAgKiBAZGVwcmVjYXRlZCBVc2Ugb3B0aW9ucyB3aXRoIGxvd2VyY2FzZSBrZXlzIChsYWJlbCwgdmFsdWUpIGluc3RlYWRcbiAgICovXG4gIG9wdGlvbnM6IExlZ2FjeU9wdGlvbltdO1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gQ2hlY2tib3hHcm91cDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogQ2hlY2tib3hHcm91cFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHsgbmFtZSwgY29udHJvbCwgbGFiZWxQcm9wcywgb3B0aW9ucywgLi4ucmVzdCB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBkaXNhYmxlZDogcmVzdC5kaXNhYmxlZCxcbiAgfSk7XG5cbiAgY29uc3QgW3NlbGVjdGVkVmFsdWVzLCBzZXRTZWxlY3RlZFZhbHVlc10gPSB1c2VTdGF0ZTxudW1iZXJbXT4oXG4gICAgb3B0aW9ucy5maWx0ZXIoYyA9PiBmaWVsZC52YWx1ZT8uaW5jbHVkZXMoYy5WYWx1ZSkpLm1hcChjID0+IGMuVmFsdWUpIHx8IFtdXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBmaWVsZC5vbkNoYW5nZShzZWxlY3RlZFZhbHVlcyA/IFsuLi5zZWxlY3RlZFZhbHVlc10gOiBbXSk7XG4gIH0sIFtzZWxlY3RlZFZhbHVlcywgZmllbGRdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBOdW1iZXIucGFyc2VJbnQoZXZlbnQudGFyZ2V0LnZhbHVlLCAxMCk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IHBhcnNpbmcgd2FzIHN1Y2Nlc3NmdWxcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgc2V0U2VsZWN0ZWRWYWx1ZXMocHJldiA9PiBbLi4ucHJldiwgdmFsdWVdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0U2VsZWN0ZWRWYWx1ZXMocHJldiA9PiBwcmV2LmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IHZhbHVlKSk7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUNvbnRyb2wgZXJyb3I9eyEhZXJyb3J9PlxuICAgICAgPEZvcm1Hcm91cCByb3c+XG4gICAgICAgIHtvcHRpb25zLm1hcChvcHRpb24gPT4gKFxuICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICBrZXk9e2Ake29wdGlvbi5WYWx1ZX1gfVxuICAgICAgICAgICAgbGFiZWw9e29wdGlvbi5MYWJlbH1cbiAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgY29udHJvbD17XG4gICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgICAgICAgIGNvbG9yPXtyZXN0LmNvbG9yIHx8ICdwcmltYXJ5J31cbiAgICAgICAgICAgICAgICB2YWx1ZT17b3B0aW9uLlZhbHVlfVxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3NlbGVjdGVkVmFsdWVzLmluY2x1ZGVzKG9wdGlvbi5WYWx1ZSl9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAge2Vycm9yICYmIChcbiAgICAgICAgPEZvcm1IZWxwZXJUZXh0IGVycm9yPXshIWVycm9yfT57ZXJyb3IubWVzc2FnZX08L0Zvcm1IZWxwZXJUZXh0PlxuICAgICAgKX1cbiAgICA8L0Zvcm1Db250cm9sPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIENoZWNrYm94R3JvdXAgY29tcG9uZW50IGZvciBtdWx0aXBsZSBjaGVja2JveCBzZWxlY3Rpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBncm91cCBvZiBjaGVja2JveGVzIHRoYXQgd29yayBzZWFtbGVzc2x5IHdpdGggcmVhY3QtaG9vay1mb3JtLFxuICogbWFuYWdpbmcgYW4gYXJyYXkgb2Ygc2VsZWN0ZWQgdmFsdWVzIHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24gYW5kIGVycm9yIGhhbmRsaW5nLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBGdWxsIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGlvblxuICogLSBNdWx0aXBsZSBjaGVja2JveCBzZWxlY3Rpb24gd2l0aCBhcnJheSB2YWx1ZSBtYW5hZ2VtZW50XG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBEaXNhYmxlZCBzdGF0ZSBzdXBwb3J0XG4gKiAtIE5hTiB2YWxpZGF0aW9uIGZvciBudW1lcmljIHZhbHVlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPENoZWNrYm94R3JvdXBcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInNlbGVjdGVkQ2F0ZWdvcmllc1wiXG4gKiAgIG9wdGlvbnM9e1tcbiAqICAgICB7IFZhbHVlOiAxLCBMYWJlbDogJ0NhdGVnb3J5IDEnIH0sXG4gKiAgICAgeyBWYWx1ZTogMiwgTGFiZWw6ICdDYXRlZ29yeSAyJyB9LFxuICogICAgIHsgVmFsdWU6IDMsIExhYmVsOiAnQ2F0ZWdvcnkgMycgfSxcbiAqICAgXX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gZ3JpZCBsYXlvdXQ6XG4gKiBgYGB0c3hcbiAqIDxDaGVja2JveEdyb3VwXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwZXJtaXNzaW9uc1wiXG4gKiAgIG9wdGlvbnM9e3Blcm1pc3Npb25PcHRpb25zfVxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA2IH0gfX1cbiAqICAgZGlzYWJsZWQ9eyFoYXNFZGl0UGVybWlzc2lvbn1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdmFsdWUgYXJyYXkgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgQ2hlY2tib3hHcm91cCA9IDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogQ2hlY2tib3hHcm91cFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuQ2hlY2tib3hHcm91cC5kaXNwbGF5TmFtZSA9ICdDaGVja2JveEdyb3VwJztcblxuZXhwb3J0IHsgQ2hlY2tib3hHcm91cCB9O1xuIiwgImltcG9ydCB7IEdyaWQgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB7IERhdGVQaWNrZXJFbGVtZW50Q29yZSB9IGZyb20gXCIuL0RhdGVQaWNrZXJFbGVtZW50Q29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRlUGlja2VyRWxlbWVudFByb3BzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBBIGZ1bGx5LWZlYXR1cmVkLCB0eXBlLXNhZmUgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IGZvciByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgY29tYmluZXMgdGhlIGNvcmUgZGF0ZSBwaWNrZXIgZnVuY3Rpb25hbGl0eSB3aXRoIG9wdGlvbmFsIEdyaWQgbGF5b3V0IHdyYXBwaW5nLFxuICogcHJvdmlkaW5nIGEgY29tcGxldGUgc29sdXRpb24gZm9yIGZvcm0tYmFzZWQgZGF0ZSBzZWxlY3Rpb24gd2l0aCBjb21wcmVoZW5zaXZlIFR5cGVTY3JpcHQgc3VwcG9ydC5cbiAqXG4gKiBLZXkgRmVhdHVyZXM6XG4gKiAtIFx1RDgzQ1x1REZBRiAqKlR5cGUgU2FmZXR5Kio6IEZ1bGwgVHlwZVNjcmlwdCBpbmZlcmVuY2UgZm9yIGZvcm0gZmllbGQgdHlwZXMgYW5kIGRhdGUgdmFsdWVzXG4gKiAtIFx1RDgzRFx1REQyNyAqKlJlYWN0IEhvb2sgRm9ybSBJbnRlZ3JhdGlvbioqOiBTZWFtbGVzcyBpbnRlZ3JhdGlvbiB3aXRoIHJlYWN0LWhvb2stZm9ybSB2YWxpZGF0aW9uXG4gKiAtIFx1RDgzQ1x1REZBOCAqKlRoZW1pbmcqKjogQXV0b21hdGljIGFkYXB0YXRpb24gdG8gTVVJIHRoZW1lIHdpdGggY3VzdG9taXphYmxlIHN0eWxlc1xuICogLSBcdTI2N0YgKipBY2Nlc3NpYmlsaXR5Kio6IFdDQUctY29tcGxpYW50IHdpdGggcHJvcGVyIEFSSUEgYXR0cmlidXRlcyBhbmQga2V5Ym9hcmQgbmF2aWdhdGlvblxuICogLSBcdUQ4M0RcdURFODAgKipQZXJmb3JtYW5jZSoqOiBPcHRpbWl6ZWQgd2l0aCBtZW1vaXphdGlvbiBhbmQgZWZmaWNpZW50IHJlLXJlbmRlcmluZ1xuICogLSBcdUQ4M0RcdURDRjEgKipSZXNwb25zaXZlKio6IEJ1aWx0LWluIEdyaWQgbGF5b3V0IHdpdGggY29uZmlndXJhYmxlIGJyZWFrcG9pbnRzXG4gKiAtIFx1RDgzRFx1REVFMVx1RkUwRiAqKlZhbGlkYXRpb24qKjogQ29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VzXG4gKiAtIFx1RDgzRFx1REQwNCAqKlRyYW5zZm9ybWF0aW9uKio6IEZsZXhpYmxlIHZhbHVlIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gZm9ybSBhbmQgcGlja2VyIGZvcm1hdHNcbiAqIC0gXHVEODNEXHVEQ0RBICoqRGV2ZWxvcGVyIEV4cGVyaWVuY2UqKjogUmljaCBUeXBlU2NyaXB0IEludGVsbGlTZW5zZSBhbmQgY29tcHJlaGVuc2l2ZSBkb2N1bWVudGF0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggYXV0b21hdGljIEdyaWQgd3JhcHBlcjpcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlRm9ybSB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG4gKiBpbXBvcnQgeyBEYXRlUGlja2VyRWxlbWVudCB9IGZyb20gJ0BnbndlYnNvZnQvdWkvd3JhcHBlcnMnO1xuICpcbiAqIGZ1bmN0aW9uIE15Rm9ybSgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPHsgYmlydGhEYXRlOiBzdHJpbmcgfT4oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICBuYW1lPVwiYmlydGhEYXRlXCJcbiAqICAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgICAgICBsYWJlbD1cIkRhdGUgb2YgQmlydGhcIlxuICogICAgICAgcmVxdWlyZWRcbiAqICAgICAvPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIHRyYW5zZm9ybWF0aW9uIGFuZCB2YWxpZGF0aW9uOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBBZHZhbmNlZEZvcm0oKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTx7IHN0YXJ0RGF0ZTogRGF0ZSB9PigpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJzdGFydERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiUHJvamVjdCBTdGFydCBEYXRlXCJcbiAqICAgICAgIHRyYW5zZm9ybT17e1xuICogICAgICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgICAgIG91dHB1dDogKGRhdGUpID0+IGRhdGUgPyBkYXRlLnRvSVNPU3RyaW5nKCkgOiBudWxsXG4gKiAgICAgICB9fVxuICogICAgICAgdmFsaWRhdGlvbj17e1xuICogICAgICAgICBtaW5EYXRlOiBuZXcgRGF0ZSgpLFxuICogICAgICAgICBtYXhEYXRlOiBhZGRZZWFycyhuZXcgRGF0ZSgpLCAyKSxcbiAqICAgICAgICAgZXJyb3JNZXNzYWdlczoge1xuICogICAgICAgICAgIG1pbkRhdGU6ICdTdGFydCBkYXRlIG11c3QgYmUgdG9kYXkgb3IgbGF0ZXInLFxuICogICAgICAgICAgIG1heERhdGU6ICdTdGFydCBkYXRlIGNhbm5vdCBiZSBtb3JlIHRoYW4gMiB5ZWFycyBpbiB0aGUgZnV0dXJlJ1xuICogICAgICAgICB9XG4gKiAgICAgICB9fVxuICogICAgICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgICAgICBzeD17e1xuICogICAgICAgICAnJiAuTXVpSW5wdXRMYWJlbC1yb290Jzoge1xuICogICAgICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkJ1xuICogICAgICAgICB9XG4gKiAgICAgICB9fVxuICogICAgIC8+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aG91dCBHcmlkIHdyYXBwZXIgZm9yIGN1c3RvbSBsYXlvdXRzOlxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBDdXN0b21MYXlvdXQoKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTx7IGV2ZW50RGF0ZTogc3RyaW5nIH0+KCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxCb3ggZGlzcGxheT1cImZsZXhcIiBnYXA9ezJ9PlxuICogICAgICAgPERhdGVQaWNrZXJFbGVtZW50XG4gKiAgICAgICAgIG5hbWU9XCJldmVudERhdGVcIlxuICogICAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgICBsYWJlbD1cIkV2ZW50IERhdGVcIlxuICogICAgICAgICBncmlkUHJvcHM9e2ZhbHNlfSAvLyBEaXNhYmxlcyBHcmlkIHdyYXBwZXJcbiAqICAgICAgIC8+XG4gKiAgICAgICA8QnV0dG9uIHR5cGU9XCJzdWJtaXRcIj5TdWJtaXQ8L0J1dHRvbj5cbiAqICAgICA8L0JveD5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGxvYWRpbmcgc3RhdGUgYW5kIGN1c3RvbSBlcnJvciBoYW5kbGluZzpcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gTG9hZGluZ0Zvcm0oKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybSgpO1xuICogICBjb25zdCBbaXNWYWxpZGF0aW5nLCBzZXRJc1ZhbGlkYXRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8RGF0ZVBpY2tlckVsZW1lbnRcbiAqICAgICAgIG5hbWU9XCJhcHBvaW50bWVudERhdGVcIlxuICogICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgIGxhYmVsPVwiQXBwb2ludG1lbnQgRGF0ZVwiXG4gKiAgICAgICBsb2FkaW5nPXtpc1ZhbGlkYXRpbmd9XG4gKiAgICAgICBMb2FkaW5nQ29tcG9uZW50PXsoKSA9PiA8Q2lyY3VsYXJQcm9ncmVzcyBzaXplPXsyMH0gLz59XG4gKiAgICAgICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IHtcbiAqICAgICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3I/LnR5cGUgPT09ICdjdXN0b20nKSB7XG4gKiAgICAgICAgICAgcmV0dXJuICdUaGlzIGRhdGUgY29uZmxpY3RzIHdpdGggYW5vdGhlciBhcHBvaW50bWVudCc7XG4gKiAgICAgICAgIH1cbiAqICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgfHwgJ1BsZWFzZSBzZWxlY3QgYSB2YWxpZCBkYXRlJztcbiAqICAgICAgIH19XG4gKiAgICAgLz5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZSAoaW5mZXJyZWQgZnJvbSBjb250cm9sKVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZSAoaW5mZXJyZWQgZnJvbSBuYW1lIHByb3ApXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGUgKGluZmVycmVkIGZyb20gdHJhbnNmb3JtIGZ1bmN0aW9ucylcbiAqIEB0ZW1wbGF0ZSBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlIC0gV2hldGhlciBhY2Nlc3NpYmxlIGZpZWxkIERPTSBzdHJ1Y3R1cmUgaXMgZW5hYmxlZFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyB3aXRoIGZ1bGwgVHlwZVNjcmlwdCBpbmZlcmVuY2VcbiAqIEBwYXJhbSByZWYgLSBGb3J3YXJkIHJlZiBmb3IgdGhlIHJvb3QgZWxlbWVudCAoR3JpZCBvciBEYXRlUGlja2VyIGNvbnRhaW5lcilcbiAqIEByZXR1cm5zIFJlbmRlcmVkIERhdGVQaWNrZXJFbGVtZW50IGNvbXBvbmVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICovXG5jb25zdCBEYXRlUGlja2VyRWxlbWVudCA9IGZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBEYXRlUGlja2VyRWxlbWVudFByb3BzPGFueSwgYW55LCBhbnksIGFueT5cbj4oPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIHByb3BzOiBEYXRlUGlja2VyRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZSwgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZT4sXG4gIHJlZjogUmVhY3QuUmVmPEhUTUxEaXZFbGVtZW50PlxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBncmlkUHJvcHMgPSB7IHNpemU6IHsgeHM6IDEyLCBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfSB9LFxuICAgIC4uLmNvcmVQcm9wc1xuICB9ID0gcHJvcHM7XG5cbiAgLy8gSWYgZ3JpZFByb3BzIGlzIGV4cGxpY2l0bHkgZmFsc2UsIHJlbmRlciB3aXRob3V0IEdyaWQgd3JhcHBlclxuICBpZiAoZ3JpZFByb3BzID09PSBmYWxzZSkge1xuICAgIHJldHVybiAoXG4gICAgICA8RGF0ZVBpY2tlckVsZW1lbnRDb3JlXG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICB7Li4uY29yZVByb3BzfVxuICAgICAgLz5cbiAgICApO1xuICB9XG5cbiAgLy8gUmVuZGVyIHdpdGggR3JpZCB3cmFwcGVyIGZvciByZXNwb25zaXZlIGxheW91dFxuICByZXR1cm4gKFxuICAgIDxHcmlkXG4gICAgICByZWY9e3JlZn1cbiAgICAgIHsuLi5ncmlkUHJvcHN9XG4gICAgPlxuICAgICAgPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICAgICAgICB7Li4uY29yZVByb3BzfVxuICAgICAgLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59KTtcblxuLy8gU2V0IGRpc3BsYXkgbmFtZSBmb3IgUmVhY3QgRGV2ZWxvcGVyIFRvb2xzXG5EYXRlUGlja2VyRWxlbWVudC5kaXNwbGF5TmFtZSA9IFwiRGF0ZVBpY2tlckVsZW1lbnRcIjtcblxuZXhwb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnQgfTtcblxuZXhwb3J0IGRlZmF1bHQgRGF0ZVBpY2tlckVsZW1lbnQ7XG4iLCAiaW1wb3J0IHsgdXNlRm9ya1JlZiB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlciB9IGZyb20gJ0BtdWkveC1kYXRlLXBpY2tlcnMnO1xuaW1wb3J0IHR5cGUge1xuICBEYXRlVmFsaWRhdGlvbkVycm9yLFxuICBQaWNrZXJDaGFuZ2VIYW5kbGVyQ29udGV4dCxcbiAgUGlja2VyVmFsaWREYXRlLFxufSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzJztcbmltcG9ydCBSZWFjdCwgeyBmb3J3YXJkUmVmLCB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFZhbHVlcywgRmllbGRQYXRoIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgdXNlRm9ybUkxOG4gfSBmcm9tICcuLi8uLi9pMThuJztcblxuaW1wb3J0IHtcbiAgdXNlRGF0ZVBpY2tlclZhbHVlLFxuICB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbixcbiAgdXNlRGF0ZVBpY2tlclN0eWxlcyxcbn0gZnJvbSAnLi9ob29rcyc7XG5pbXBvcnQgdHlwZSB7IERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGNvcmUgRGF0ZVBpY2tlckVsZW1lbnQgY29tcG9uZW50IHdpdGhvdXQgR3JpZCB3cmFwcGVyLlxuICpcbiAqIFRoaXMgaXMgYSBsaWdodHdlaWdodCwgcGVyZm9ybWFudCBkYXRlIHBpY2tlciBjb21wb25lbnQgdGhhdCBpbnRlZ3JhdGVzIHNlYW1sZXNzbHlcbiAqIHdpdGggcmVhY3QtaG9vay1mb3JtIHdoaWxlIHByb3ZpZGluZyBjb21wcmVoZW5zaXZlIFR5cGVTY3JpcHQgc3VwcG9ydCBhbmRcbiAqIGFjY2Vzc2liaWxpdHkgZmVhdHVyZXMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgVHlwZVNjcmlwdCBpbmZlcmVuY2UgZm9yIGZvcm0gZmllbGQgdHlwZXNcbiAqIC0gQXV0b21hdGljIHZhbHVlIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gZm9ybSBhbmQgcGlja2VyIGZvcm1hdHNcbiAqIC0gQ29tcHJlaGVuc2l2ZSB2YWxpZGF0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VzXG4gKiAtIFRoZW1lLWF3YXJlIHN0eWxpbmcgd2l0aCBhY2Nlc3NpYmlsaXR5IHN1cHBvcnRcbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemVkIHdpdGggcHJvcGVyIG1lbW9pemF0aW9uXG4gKiAtIEZvcndhcmQgcmVmIHN1cHBvcnQgZm9yIGFkdmFuY2VkIHVzZSBjYXNlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPERhdGVQaWNrZXJFbGVtZW50Q29yZVxuICogICBuYW1lPVwiYmlydGhEYXRlXCJcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbGFiZWw9XCJEYXRlIG9mIEJpcnRoXCJcbiAqICAgcmVxdWlyZWRcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gdHJhbnNmb3JtYXRpb246XG4gKiBgYGB0c3hcbiAqIDxEYXRlUGlja2VyRWxlbWVudENvcmVcbiAqICAgbmFtZT1cInN0YXJ0RGF0ZVwiXG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIGxhYmVsPVwiU3RhcnQgRGF0ZVwiXG4gKiAgIHRyYW5zZm9ybT17e1xuICogICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IG5ldyBEYXRlKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS50b0lTT1N0cmluZygpIDogbnVsbFxuICogICB9fVxuICogICB2YWxpZGF0aW9uPXt7XG4gKiAgICAgbWluRGF0ZTogbmV3IERhdGUoKSxcbiAqICAgICBlcnJvck1lc3NhZ2VzOiB7XG4gKiAgICAgICBtaW5EYXRlOiAnU3RhcnQgZGF0ZSBtdXN0IGJlIHRvZGF5IG9yIGxhdGVyJ1xuICogICAgIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICogQHRlbXBsYXRlIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgLSBXaGV0aGVyIGFjY2Vzc2libGUgZmllbGQgRE9NIHN0cnVjdHVyZSBpcyBlbmFibGVkXG4gKi9cbmNvbnN0IERhdGVQaWNrZXJFbGVtZW50Q29yZSA9IGZvcndhcmRSZWY8XG4gIEhUTUxEaXZFbGVtZW50LFxuICBEYXRlUGlja2VyRWxlbWVudENvcmVQcm9wczxhbnksIGFueSwgYW55LCBhbnk+XG4+KFxuICA8XG4gICAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gICAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuICAgIFRFbmFibGVBY2Nlc3NpYmxlRmllbGRET01TdHJ1Y3R1cmUgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4gID4oXG4gICAgcHJvcHM6IERhdGVQaWNrZXJFbGVtZW50Q29yZVByb3BzPFxuICAgICAgVEZpZWxkVmFsdWVzLFxuICAgICAgVE5hbWUsXG4gICAgICBUVmFsdWUsXG4gICAgICBURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlXG4gICAgPixcbiAgICByZWY6IFJlYWN0LlJlZjxIVE1MRGl2RWxlbWVudD5cbiAgKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHJlcXVpcmVkID0gZmFsc2UsXG4gICAgICBjb250cm9sLFxuICAgICAgcGFyc2VFcnJvcixcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIHZhbGlkYXRpb24sXG4gICAgICBsYWJlbCxcbiAgICAgIGxhYmVsS2V5LFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICBwbGFjZWhvbGRlcktleSxcbiAgICAgIG5hbWVzcGFjZSxcbiAgICAgIHRleHRSZWFkT25seSA9IGZhbHNlLFxuICAgICAgaGVscGVyVGV4dCxcbiAgICAgIGlucHV0UHJvcHMgPSB7fSxcbiAgICAgIHNsb3RQcm9wcyA9IHt9LFxuICAgICAgZGF0ZVBpY2tlclByb3BzID0ge30sXG4gICAgICB2YXJpYW50ID0gJ291dGxpbmVkJyxcbiAgICAgIGxvYWRpbmcgPSBmYWxzZSxcbiAgICAgIExvYWRpbmdDb21wb25lbnQsXG4gICAgICAuLi5yZXN0UHJvcHNcbiAgICB9ID0gcHJvcHM7XG5cbiAgICAvLyBFeHRyYWN0IERhdGVQaWNrZXItc3BlY2lmaWMgcHJvcHNcbiAgICBjb25zdCB7XG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGlucHV0UmVmOiBleHRlcm5hbElucHV0UmVmLFxuICAgICAgb25DbG9zZSxcbiAgICAgIC4uLnJlc3REYXRlUGlja2VyUHJvcHNcbiAgICB9ID0gZGF0ZVBpY2tlclByb3BzO1xuXG4gICAgLy8gU2V0IHVwIGZvcm0gY29udHJvbGxlclxuICAgIGNvbnN0IHsgZmllbGQsIGZpZWxkU3RhdGUgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgICAgbmFtZSxcbiAgICAgIGNvbnRyb2wsXG4gICAgICBkZWZhdWx0VmFsdWU6IG51bGwgYXMgYW55LCAvLyBMZXQgcmVhY3QtaG9vay1mb3JtIGhhbmRsZSB0aGUgZGVmYXVsdCB2YWx1ZSB0eXBpbmdcbiAgICB9KTtcblxuICAgIC8vIFZhbHVlIHRyYW5zZm9ybWF0aW9uIGhvb2tcbiAgICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZTogb25WYWx1ZUNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAgICAgIGZpZWxkLFxuICAgICAgdHJhbnNmb3JtLFxuICAgIH0pO1xuXG4gICAgLy8gVmFsaWRhdGlvbiBob29rXG4gICAgY29uc3QgeyBoYXNFcnJvciwgZXJyb3JNZXNzYWdlLCBpbnZhbGlkIH0gPSB1c2VEYXRlUGlja2VyVmFsaWRhdGlvbih7XG4gICAgICBmaWVsZFN0YXRlLFxuICAgICAgdmFsaWRhdGlvbixcbiAgICAgIHBhcnNlRXJyb3IsXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcblxuICAgIC8vIFN0eWxpbmcgaG9va1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lIH0gPSB1c2VEYXRlUGlja2VyU3R5bGVzKHtcbiAgICAgIGRpc2FibGVkLFxuICAgICAgaGFzRXJyb3IsXG4gICAgICBsb2FkaW5nLFxuICAgICAgdGV4dFJlYWRPbmx5LFxuICAgIH0pO1xuXG4gICAgLy8gaTE4biBob29rIGZvciByZXNvbHZpbmcgdHJhbnNsYXRpb24ga2V5cyAobmFtZXNwYWNlIGZyb20gY29udGV4dCBpZiBub3Qgc3BlY2lmaWVkKVxuICAgIGNvbnN0IHsgcmVzb2x2ZUxhYmVsIH0gPSB1c2VGb3JtSTE4bigpO1xuICAgIGNvbnN0IHJlc29sdmVkTGFiZWwgPSByZXNvbHZlTGFiZWwobGFiZWwgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLCBsYWJlbEtleSwgbmFtZXNwYWNlKTtcbiAgICBjb25zdCByZXNvbHZlZFBsYWNlaG9sZGVyID0gcmVzb2x2ZUxhYmVsKHBsYWNlaG9sZGVyLCBwbGFjZWhvbGRlcktleSwgbmFtZXNwYWNlKTtcblxuICAgIC8vIE1lcmdlIGlucHV0IHJlZnNcbiAgICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBleHRlcm5hbElucHV0UmVmKTtcblxuICAgIC8vIE1lbW9pemVkIGNoYW5nZSBoYW5kbGVyIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgKFxuICAgICAgICBuZXdWYWx1ZTogVFZhbHVlIHwgbnVsbCxcbiAgICAgICAgY29udGV4dDogUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQ8RGF0ZVZhbGlkYXRpb25FcnJvcj5cbiAgICAgICkgPT4ge1xuICAgICAgICBvblZhbHVlQ2hhbmdlKG5ld1ZhbHVlLCBjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICBbb25WYWx1ZUNoYW5nZV1cbiAgICApO1xuXG4gICAgLy8gTWVtb2l6ZWQgY2xvc2UgaGFuZGxlclxuICAgIGNvbnN0IGhhbmRsZUNsb3NlID0gdXNlQ2FsbGJhY2soXG4gICAgICAoLi4uYXJnczogUGFyYW1ldGVyczxOb25OdWxsYWJsZTx0eXBlb2Ygb25DbG9zZT4+KSA9PiB7XG4gICAgICAgIC8vIFRyaWdnZXIgZm9ybSBmaWVsZCBibHVyIGZvciB2YWxpZGF0aW9uXG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuXG4gICAgICAgIC8vIENhbGwgZXh0ZXJuYWwgb25DbG9zZSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAob25DbG9zZSkge1xuICAgICAgICAgIG9uQ2xvc2UoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgICBbZmllbGQub25CbHVyLCBvbkNsb3NlXVxuICAgICk7XG5cbiAgICAvLyBNZW1vaXplZCBibHVyIGhhbmRsZXIgZm9yIHRleHQgZmllbGRcbiAgICBjb25zdCBoYW5kbGVUZXh0RmllbGRCbHVyID0gdXNlQ2FsbGJhY2soXG4gICAgICAoZXZlbnQ6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBleHRlcm5hbCBvbkJsdXIgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFByb3BzLm9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGlucHV0UHJvcHMub25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICAgIFtmaWVsZC5vbkJsdXIsIGlucHV0UHJvcHMub25CbHVyXVxuICAgICk7XG5cbiAgICAvLyBNZW1vaXplZCBzbG90IHByb3BzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICAgIGNvbnN0IG1lbW9pemVkU2xvdFByb3BzID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgYWN0aW9uQmFyOiB7XG4gICAgICAgICAgYWN0aW9uczogWydjbGVhcicsICd0b2RheScsICdjYW5jZWwnLCAnYWNjZXB0J10gYXMgQXJyYXk8XG4gICAgICAgICAgICAnYWNjZXB0JyB8ICdjYW5jZWwnIHwgJ2NsZWFyJyB8ICduZXh0JyB8ICduZXh0T3JBY2NlcHQnIHwgJ3RvZGF5J1xuICAgICAgICAgID4sXG4gICAgICAgICAgLi4uc2xvdFByb3BzLmFjdGlvbkJhcixcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICBmdWxsV2lkdGg6IHRydWUsXG4gICAgICAgICAgdmFyaWFudCxcbiAgICAgICAgICBvbkJsdXI6IGhhbmRsZVRleHRGaWVsZEJsdXIsXG4gICAgICAgICAgZXJyb3I6IGhhc0Vycm9yLFxuICAgICAgICAgIGhlbHBlclRleHQ6IGhhc0Vycm9yID8gZXJyb3JNZXNzYWdlIDogaGVscGVyVGV4dCxcbiAgICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICByZWFkT25seTogdGV4dFJlYWRPbmx5LFxuICAgICAgICAgICAgJ2FyaWEtaW52YWxpZCc6IGludmFsaWQsXG4gICAgICAgICAgICAnYXJpYS1kZXNjcmliZWRieSc6IGhhc0Vycm9yID8gYCR7bmFtZX0tZXJyb3JgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgLi4uaW5wdXRQcm9wcy5pbnB1dFByb3BzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gQWRkIGxvYWRpbmcgaW5kaWNhdG9yIGlmIHByb3ZpZGVkXG4gICAgICAgICAgLi4uKGxvYWRpbmcgJiZcbiAgICAgICAgICAgIExvYWRpbmdDb21wb25lbnQgJiYge1xuICAgICAgICAgICAgICBJbnB1dFByb3BzOiB7XG4gICAgICAgICAgICAgICAgZW5kQWRvcm5tZW50OiA8TG9hZGluZ0NvbXBvbmVudCAvPixcbiAgICAgICAgICAgICAgICAuLi5pbnB1dFByb3BzLklucHV0UHJvcHMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi5zbG90UHJvcHMudGV4dEZpZWxkLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBbXG4gICAgICAgIHNsb3RQcm9wcyxcbiAgICAgICAgaW5wdXRQcm9wcyxcbiAgICAgICAgcmVxdWlyZWQsXG4gICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICBoYW5kbGVUZXh0RmllbGRCbHVyLFxuICAgICAgICBoYXNFcnJvcixcbiAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICBoZWxwZXJUZXh0LFxuICAgICAgICB0ZXh0UmVhZE9ubHksXG4gICAgICAgIGludmFsaWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIExvYWRpbmdDb21wb25lbnQsXG4gICAgICBdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8RGF0ZVBpY2tlclxuICAgICAgICAvLyBTcHJlYWQgcmVzdCBwcm9wcyBmaXJzdCBzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuXG4gICAgICAgIHsuLi5yZXN0UHJvcHN9XG4gICAgICAgIHsuLi5yZXN0RGF0ZVBpY2tlclByb3BzfVxuICAgICAgICAvLyBDb3JlIHByb3BzXG4gICAgICAgIHJlZj17cmVmfVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgIG9uQ2xvc2U9e2hhbmRsZUNsb3NlfVxuICAgICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICAgIC8vIFVJIHByb3BzXG4gICAgICAgIGxhYmVsPXtyZXNvbHZlZExhYmVsfVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICAvLyBTbG90IHByb3BzXG4gICAgICAgIHNsb3RQcm9wcz17bWVtb2l6ZWRTbG90UHJvcHN9XG4gICAgICAgIC8vIEFjY2Vzc2liaWxpdHkgcHJvcHNcbiAgICAgICAgYXJpYS1pbnZhbGlkPXtpbnZhbGlkfVxuICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PXtoYXNFcnJvciA/IGAke25hbWV9LWVycm9yYCA6IHVuZGVmaW5lZH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuKTtcblxuLy8gU2V0IGRpc3BsYXkgbmFtZSBmb3IgZGVidWdnaW5nXG5EYXRlUGlja2VyRWxlbWVudENvcmUuZGlzcGxheU5hbWUgPSAnRGF0ZVBpY2tlckVsZW1lbnRDb3JlJztcblxuZXhwb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnRDb3JlIH07XG5cbmV4cG9ydCBkZWZhdWx0IERhdGVQaWNrZXJFbGVtZW50Q29yZTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgRGF0ZVZhbGlkYXRpb25FcnJvcixcbiAgUGlja2VyQ2hhbmdlSGFuZGxlckNvbnRleHQsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VMb2NhbGl6YXRpb25Db250ZXh0IH0gZnJvbSBcIkBtdWkveC1kYXRlLXBpY2tlcnMvaW50ZXJuYWxzXCI7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIFVzZUNvbnRyb2xsZXJSZXR1cm4sXG59IGZyb20gXCJyZWFjdC1ob29rLWZvcm1cIjtcblxuaW1wb3J0IHR5cGUgeyBEYXRlVHJhbnNmb3JtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogVHlwZS1zYWZlIGRhdGUgdmFsdWUgcmVhZGVyIHRoYXQgaGFuZGxlcyBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIGZyb20gdGhlIGRhdGUgYWRhcHRlclxuICogQHBhcmFtIGFkYXB0ZXIgLSBUaGUgbG9jYWxpemF0aW9uIGNvbnRleHQgZnJvbSBNVUkgZGF0ZSBwaWNrZXJzXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY29udmVydCAoc3RyaW5nLCBkYXRlLCBvciBudWxsKVxuICogQHJldHVybnMgUHJvcGVybHkgdHlwZWQgZGF0ZSB2YWx1ZSBvciBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRGF0ZVBpY2tlclZhbHVlQXNEYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlPihcbiAgYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4sXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgVERhdGUgfCB1bmRlZmluZWRcbik6IFREYXRlIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIGFkYXB0ZXIgdG8gcGFyc2UgdGhlIHN0cmluZyBpbnRvIGEgZGF0ZVxuICAgIGNvbnN0IHBhcnNlZERhdGUgPSBhZGFwdGVyLnV0aWxzLmRhdGUodmFsdWUpO1xuXG4gICAgcmV0dXJuIHBhcnNlZERhdGUgYXMgVERhdGU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZURhdGVQaWNrZXJWYWx1ZU9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgY29udHJvbGxlciBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICBmaWVsZDogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdO1xuICAvKiogT3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zICovXG4gIHRyYW5zZm9ybT86IERhdGVUcmFuc2Zvcm08VEZpZWxkVmFsdWVzLCBUTmFtZSwgVFZhbHVlPjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWx1ZSBob29rXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlPiB7XG4gIC8qKiBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgZm9yIGRpc3BsYXkgaW4gdGhlIHBpY2tlciAqL1xuICB2YWx1ZTogVFZhbHVlIHwgbnVsbDtcbiAgLyoqIENoYW5nZSBoYW5kbGVyIGZvciBwaWNrZXIgdmFsdWUgdXBkYXRlcyAqL1xuICBvbkNoYW5nZTogKFxuICAgIHZhbHVlOiBUVmFsdWUgfCBudWxsLFxuICAgIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+XG4gICkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWx1ZSB0cmFuc2Zvcm1hdGlvbnMgd2l0aCB0eXBlIHNhZmV0eVxuICogXG4gKiBUaGlzIGhvb2sgaGFuZGxlcyB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIGZvcm0gZmllbGQgdmFsdWVzIGFuZCBkYXRlIHBpY2tlciB2YWx1ZXMsXG4gKiBhcHBseWluZyBjdXN0b20gdHJhbnNmb3JtYXRpb25zIHdoaWxlIG1haW50YWluaW5nIHN0cmljdCBUeXBlU2NyaXB0IHR5cGluZy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggc3RyaW5nIHRvIGRhdGUgY29udmVyc2lvbjpcbiAqIGBgYHRzeFxuICogY29uc3QgeyB2YWx1ZSwgb25DaGFuZ2UgfSA9IHVzZURhdGVQaWNrZXJWYWx1ZSh7XG4gKiAgIGZpZWxkLFxuICogICB0cmFuc2Zvcm06IHtcbiAqICAgICBpbnB1dDogKGRhdGVTdHJpbmcpID0+IGRhdGVTdHJpbmcgPyBuZXcgRGF0ZShkYXRlU3RyaW5nKSA6IG51bGwsXG4gKiAgICAgb3V0cHV0OiAoZGF0ZSkgPT4gZGF0ZSA/IGRhdGUudG9JU09TdHJpbmcoKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFVzYWdlIHdpdGggRGF5LmpzIGRhdGVzOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRGF0ZVBpY2tlclZhbHVlKHtcbiAqICAgZmllbGQsXG4gKiAgIHRyYW5zZm9ybToge1xuICogICAgIGlucHV0OiAoZGF0ZVN0cmluZykgPT4gZGF0ZVN0cmluZyA/IGRheWpzKGRhdGVTdHJpbmcpIDogbnVsbCxcbiAqICAgICBvdXRwdXQ6IChkYXRlKSA9PiBkYXRlID8gZGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6IG51bGxcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqIFxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB2YWx1ZSB0cmFuc2Zvcm1hdGlvblxuICogQHJldHVybnMgT2JqZWN0IHdpdGggdHJhbnNmb3JtZWQgdmFsdWUgYW5kIGNoYW5nZSBoYW5kbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyVmFsdWU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPihcbiAgb3B0aW9uczogVXNlRGF0ZVBpY2tlclZhbHVlT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsdWVSZXR1cm48VFZhbHVlPiB7XG4gIGNvbnN0IHsgZmllbGQsIHRyYW5zZm9ybSB9ID0gb3B0aW9ucztcbiAgY29uc3QgYWRhcHRlciA9IHVzZUxvY2FsaXphdGlvbkNvbnRleHQoKTtcblxuICAvLyBUcmFuc2Zvcm0gdGhlIGZpZWxkIHZhbHVlIGZvciBkaXNwbGF5IGluIHRoZSBwaWNrZXJcbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKCgpOiBUVmFsdWUgfCBudWxsID0+IHtcbiAgICBpZiAodHlwZW9mIHRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybS5pbnB1dChmaWVsZC52YWx1ZSk7XG4gICAgfVxuICAgIFxuICAgIC8vIERlZmF1bHQgdHJhbnNmb3JtYXRpb246IGhhbmRsZSBzdHJpbmcgdG8gZGF0ZSBjb252ZXJzaW9uXG4gICAgcmV0dXJuIHJlYWREYXRlUGlja2VyVmFsdWVBc0RhdGUoYWRhcHRlciwgZmllbGQudmFsdWUpIGFzIFRWYWx1ZSB8IG51bGw7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZmllbGQudmFsdWUsIHRyYW5zZm9ybT8uaW5wdXQsIGFkYXB0ZXJdKTtcblxuICAvLyBDcmVhdGUgYSBzdGFibGUgY2hhbmdlIGhhbmRsZXJcbiAgY29uc3Qgb25DaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobmV3VmFsdWU6IFRWYWx1ZSB8IG51bGwsIGNvbnRleHQ6IFBpY2tlckNoYW5nZUhhbmRsZXJDb250ZXh0PERhdGVWYWxpZGF0aW9uRXJyb3I+KSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybT8ub3V0cHV0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRyYW5zZm9ybS5vdXRwdXQobmV3VmFsdWUsIGNvbnRleHQpO1xuXG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKHRyYW5zZm9ybWVkVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0cmFuc2Zvcm1hdGlvbjogc3RvcmUgdGhlIGRhdGUgYXMtaXNcbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbZmllbGQub25DaGFuZ2UsIHRyYW5zZm9ybT8ub3V0cHV0XVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgb25DaGFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJWYWx1ZTsiLCAiaW1wb3J0IHR5cGUge1xuICBQaWNrZXJWYWxpZERhdGUsXG4gIERhdGVWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUge1xuICBGaWVsZEVycm9yLFxuICBGaWVsZFZhbHVlcyxcbiAgRmllbGRQYXRoLFxuICBVc2VDb250cm9sbGVyUmV0dXJuLFxufSBmcm9tIFwicmVhY3QtaG9vay1mb3JtXCI7XG5cbmltcG9ydCB0eXBlIHsgRGF0ZVBpY2tlclZhbGlkYXRpb25Db25maWcgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24gaG9va1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvbk9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPiB7XG4gIC8qKiBUaGUgZmllbGQgc3RhdGUgZnJvbSByZWFjdC1ob29rLWZvcm0gY29udHJvbGxlciAqL1xuICBmaWVsZFN0YXRlOiBVc2VDb250cm9sbGVyUmV0dXJuPFRGaWVsZFZhbHVlcywgVE5hbWU+W1wiZmllbGRTdGF0ZVwiXTtcbiAgLyoqIFZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGRhdGUgcGlja2VyICovXG4gIHZhbGlkYXRpb24/OiBEYXRlUGlja2VyVmFsaWRhdGlvbkNvbmZpZzxUVmFsdWU+O1xuICAvKiogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IgfCBEYXRlVmFsaWRhdGlvbkVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKiBUaGUgY3VycmVudCBkYXRlIHZhbHVlIGZvciB2YWxpZGF0aW9uICovXG4gIHZhbHVlPzogVFZhbHVlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uIGhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIC8qKiBXaGV0aGVyIHRoZSBmaWVsZCBoYXMgYW55IHZhbGlkYXRpb24gZXJyb3JzICovXG4gIGhhc0Vycm9yOiBib29sZWFuO1xuICAvKiogVGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBlcnJvciAoZm9ybSBvciBkYXRlLXNwZWNpZmljKSAqL1xuICBlcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQ7XG4gIC8qKiBGb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZSBmb3IgZGlzcGxheSAqL1xuICBlcnJvck1lc3NhZ2U6IFJlYWN0Tm9kZTtcbiAgLyoqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGluIGFuIGludmFsaWQgc3RhdGUgKi9cbiAgaW52YWxpZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGVycm9yIG1lc3NhZ2VzIGZvciBjb21tb24gZGF0ZSB2YWxpZGF0aW9uIHNjZW5hcmlvc1xuICovXG5jb25zdCBERUZBVUxUX0VSUk9SX01FU1NBR0VTID0ge1xuICBpbnZhbGlkRGF0ZTogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlXCIsXG4gIG1pbkRhdGU6IFwiRGF0ZSBtdXN0IGJlIGFmdGVyIHRoZSBtaW5pbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICBtYXhEYXRlOiBcIkRhdGUgbXVzdCBiZSBiZWZvcmUgdGhlIG1heGltdW0gYWxsb3dlZCBkYXRlXCIsXG4gIGRpc2FibGVkRGF0ZTogXCJUaGlzIGRhdGUgaXMgbm90IGFsbG93ZWRcIixcbiAgcmVxdWlyZWQ6IFwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBIb29rIGZvciBtYW5hZ2luZyBkYXRlIHBpY2tlciB2YWxpZGF0aW9uIHdpdGggY29tcHJlaGVuc2l2ZSBlcnJvciBoYW5kbGluZ1xuICogXG4gKiBUaGlzIGhvb2sgY2VudHJhbGl6ZXMgdmFsaWRhdGlvbiBsb2dpYyBmb3IgZGF0ZSBwaWNrZXJzLCBoYW5kbGluZyBib3RoXG4gKiByZWFjdC1ob29rLWZvcm0gdmFsaWRhdGlvbiBlcnJvcnMgYW5kIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbiBlcnJvcnNcbiAqIGZyb20gTVVJIGRhdGUgcGlja2Vycy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggZm9ybSB2YWxpZGF0aW9uOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IGhhc0Vycm9yLCBlcnJvck1lc3NhZ2UsIGludmFsaWQgfSA9IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uKHtcbiAqICAgZmllbGRTdGF0ZSxcbiAqICAgdmFsaWRhdGlvbjoge1xuICogICAgIG1pbkRhdGU6IGRheWpzKCkuc3VidHJhY3QoMSwgJ3llYXInKSxcbiAqICAgICBtYXhEYXRlOiBkYXlqcygpLmFkZCgxLCAneWVhcicpLFxuICogICAgIGVycm9yTWVzc2FnZXM6IHtcbiAqICAgICAgIG1pbkRhdGU6ICdEYXRlIG11c3QgYmUgd2l0aGluIHRoZSBsYXN0IHllYXInLFxuICogICAgICAgbWF4RGF0ZTogJ0RhdGUgY2Fubm90IGJlIG1vcmUgdGhhbiAxIHllYXIgaW4gdGhlIGZ1dHVyZSdcbiAqICAgICB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBVc2FnZSB3aXRoIGN1c3RvbSBlcnJvciBwYXJzZXI6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgaGFzRXJyb3IsIGVycm9yTWVzc2FnZSB9ID0gdXNlRGF0ZVBpY2tlclZhbGlkYXRpb24oe1xuICogICBmaWVsZFN0YXRlLFxuICogICBwYXJzZUVycm9yOiAoZXJyb3IpID0+IHtcbiAqICAgICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICogICAgICAgcmV0dXJuIGBEYXRlIEVycm9yOiAke2Vycm9yfWA7XG4gKiAgICAgfVxuICogICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdJbnZhbGlkIGRhdGUnO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICogXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICogQHBhcmFtIG9wdGlvbnMgLSBWYWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgVmFsaWRhdGlvbiBzdGF0ZSBhbmQgZXJyb3IgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oXG4gIG9wdGlvbnM6IFVzZURhdGVQaWNrZXJWYWxpZGF0aW9uT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBVc2VEYXRlUGlja2VyVmFsaWRhdGlvblJldHVybiB7XG4gIGNvbnN0IHsgZmllbGRTdGF0ZSwgdmFsaWRhdGlvbiwgcGFyc2VFcnJvciwgdmFsdWUgfSA9IG9wdGlvbnM7XG5cbiAgLy8gTWVtb2l6ZSB2YWxpZGF0aW9uIHJlc3VsdHMgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB7IGVycm9yOiBmaWVsZEVycm9yLCBpbnZhbGlkIH0gPSBmaWVsZFN0YXRlO1xuICAgIFxuICAgIC8vIFN0YXJ0IHdpdGggZm9ybSB2YWxpZGF0aW9uIGVycm9yXG4gICAgbGV0IGN1cnJlbnRFcnJvcjogRmllbGRFcnJvciB8IERhdGVWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQgPSBmaWVsZEVycm9yO1xuICAgIFxuICAgIC8vIENoZWNrIGRhdGUtc3BlY2lmaWMgdmFsaWRhdGlvbnMgaWYgbm8gZm9ybSBlcnJvciBhbmQgd2UgaGF2ZSBhIHZhbHVlXG4gICAgaWYgKCFmaWVsZEVycm9yICYmIHZhbHVlICYmIHZhbGlkYXRpb24pIHtcbiAgICAgIGNvbnN0IHsgbWluRGF0ZSwgbWF4RGF0ZSwgc2hvdWxkRGlzYWJsZURhdGUsIGVycm9yTWVzc2FnZXMgfSA9IHZhbGlkYXRpb247XG4gICAgICBcbiAgICAgIC8vIENoZWNrIG1pbmltdW0gZGF0ZVxuICAgICAgaWYgKG1pbkRhdGUgJiYgdmFsdWUgPCBtaW5EYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWluRGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWluRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1pbkRhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBtYXhpbXVtIGRhdGVcbiAgICAgIGVsc2UgaWYgKG1heERhdGUgJiYgdmFsdWUgPiBtYXhEYXRlKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvciA9IHtcbiAgICAgICAgICB0eXBlOiAnbWF4RGF0ZScsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlcz8ubWF4RGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLm1heERhdGUsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBEYXRlVmFsaWRhdGlvbkVycm9yO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBkaXNhYmxlZCBkYXRlXG4gICAgICBlbHNlIGlmIChzaG91bGREaXNhYmxlRGF0ZSAmJiBzaG91bGREaXNhYmxlRGF0ZSh2YWx1ZSkpIHtcbiAgICAgICAgY3VycmVudEVycm9yID0ge1xuICAgICAgICAgIHR5cGU6ICdkaXNhYmxlZERhdGUnLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZXM/LmRpc2FibGVkRGF0ZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZSxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIERhdGVWYWxpZGF0aW9uRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGhhc0Vycm9yID0gQm9vbGVhbihjdXJyZW50RXJyb3IpO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBoYXNFcnJvcixcbiAgICAgIGVycm9yOiBjdXJyZW50RXJyb3IsXG4gICAgICBpbnZhbGlkOiBpbnZhbGlkIHx8IGhhc0Vycm9yLFxuICAgIH07XG4gIH0sIFtmaWVsZFN0YXRlLCB2YWxpZGF0aW9uLCB2YWx1ZV0pO1xuXG4gIC8vIE1lbW9pemUgZXJyb3IgbWVzc2FnZSBmb3JtYXR0aW5nXG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IHVzZU1lbW8oKCk6IFJlYWN0Tm9kZSA9PiB7XG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBVc2UgY3VzdG9tIGVycm9yIHBhcnNlciBpZiBwcm92aWRlZFxuICAgIGlmIChwYXJzZUVycm9yKSB7XG4gICAgICByZXR1cm4gcGFyc2VFcnJvcih2YWxpZGF0aW9uUmVzdWx0LmVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGVycm9yIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICBpZiAodHlwZW9mIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoJ21lc3NhZ2UnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IgJiYgdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvci5tZXNzYWdlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGVycm9yIG1lc3NhZ2VzIGJhc2VkIG9uIGVycm9yIHR5cGVcbiAgICBpZiAoJ3R5cGUnIGluIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IHZhbGlkYXRpb25SZXN1bHQuZXJyb3IudHlwZTtcblxuICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgY2FzZSAncmVxdWlyZWQnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLnJlcXVpcmVkO1xuICAgICAgICBjYXNlICdtaW5EYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5taW5EYXRlO1xuICAgICAgICBjYXNlICdtYXhEYXRlJzpcbiAgICAgICAgICByZXR1cm4gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5tYXhEYXRlO1xuICAgICAgICBjYXNlICdkaXNhYmxlZERhdGUnOlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmRpc2FibGVkRGF0ZTtcbiAgICAgICAgY2FzZSAnaW52YWxpZERhdGUnOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLmludmFsaWREYXRlO1xuICB9LCBbdmFsaWRhdGlvblJlc3VsdC5lcnJvciwgcGFyc2VFcnJvcl0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4udmFsaWRhdGlvblJlc3VsdCxcbiAgICBlcnJvck1lc3NhZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURhdGVQaWNrZXJWYWxpZGF0aW9uOyIsICJpbXBvcnQgdHlwZSB7IFN4UHJvcHMsIFRoZW1lIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IHVzZVRoZW1lIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlRGF0ZVBpY2tlclN0eWxlcyBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclN0eWxlc09wdGlvbnMge1xuICAvKiogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBoYXMgYSB2YWxpZGF0aW9uIGVycm9yICovXG4gIGhhc0Vycm9yPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBpbiBsb2FkaW5nIHN0YXRlICovXG4gIGxvYWRpbmc/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgdGV4dCBpbnB1dCBpcyByZWFkLW9ubHkgKi9cbiAgdGV4dFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgLyoqIEN1c3RvbSBzdHlsZXMgdG8gbWVyZ2Ugd2l0aCBkZWZhdWx0cyAqL1xuICBzeD86IFN4UHJvcHM8VGhlbWU+O1xufVxuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgdXNlRGF0ZVBpY2tlclN0eWxlcyBob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlRGF0ZVBpY2tlclN0eWxlc1JldHVybiB7XG4gIC8qKiBDb21wdXRlZCBzdHlsZXMgZm9yIHRoZSBkYXRlIHBpY2tlciBjb21wb25lbnQgKi9cbiAgc3g6IFN4UHJvcHM8VGhlbWU+O1xuICAvKiogQWRkaXRpb25hbCBjbGFzcyBuYW1lcyBmb3Igc3R5bGluZyAqL1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSG9vayBmb3IgbWFuYWdpbmcgdGhlbWUtYXdhcmUgZGF0ZSBwaWNrZXIgc3R5bGVzIHdpdGggY29uc2lzdGVudCBkZXNpZ24gc3lzdGVtIGludGVncmF0aW9uXG4gKiBcbiAqIFRoaXMgaG9vayBwcm92aWRlcyBvcHRpbWl6ZWQsIG1lbW9pemVkIHN0eWxlcyBmb3IgZGF0ZSBwaWNrZXIgY29tcG9uZW50cyB0aGF0IGF1dG9tYXRpY2FsbHlcbiAqIGFkYXB0IHRvIHRoZSBjdXJyZW50IE1VSSB0aGVtZSBhbmQgY29tcG9uZW50IHN0YXRlIChkaXNhYmxlZCwgZXJyb3IsIGxvYWRpbmcsIGV0Yy4pLlxuICogSXQgZW5zdXJlcyBjb25zaXN0ZW50IHN0eWxpbmcgYWNyb3NzIGFsbCBkYXRlIHBpY2tlciBpbnN0YW5jZXMgd2hpbGUgYWxsb3dpbmcgY3VzdG9taXphdGlvbi5cbiAqIFxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHN4IH0gPSB1c2VEYXRlUGlja2VyU3R5bGVzKHtcbiAqICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsXG4gKiAgIGhhc0Vycm9yOiAhIWVycm9yLFxuICogICBsb2FkaW5nOiBpc0xvYWRpbmdcbiAqIH0pO1xuICogXG4gKiByZXR1cm4gPERhdGVQaWNrZXIgc3g9e3N4fSAuLi4gLz47XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIHN0eWxlczpcbiAqIGBgYHRzeFxuICogY29uc3QgeyBzeCB9ID0gdXNlRGF0ZVBpY2tlclN0eWxlcyh7XG4gKiAgIGhhc0Vycm9yOiAhIWVycm9yLFxuICogICBzeDoge1xuICogICAgICcmIC5NdWlJbnB1dExhYmVsLXJvb3QnOiB7XG4gKiAgICAgICBjb2xvcjogJ3ByaW1hcnkubWFpbidcbiAqICAgICB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKiBcbiAqIEBwYXJhbSBvcHRpb25zIC0gU3R5bGUgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBDb21wdXRlZCBzdHlsZXMgYW5kIGNsYXNzIG5hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEYXRlUGlja2VyU3R5bGVzKFxuICBvcHRpb25zOiBVc2VEYXRlUGlja2VyU3R5bGVzT3B0aW9ucyA9IHt9XG4pOiBVc2VEYXRlUGlja2VyU3R5bGVzUmV0dXJuIHtcbiAgY29uc3QgeyBkaXNhYmxlZCwgaGFzRXJyb3IsIGxvYWRpbmcsIHRleHRSZWFkT25seSwgc3g6IGN1c3RvbVN4IH0gPSBvcHRpb25zO1xuICBjb25zdCB0aGVtZSA9IHVzZVRoZW1lKCk7XG5cbiAgLy8gTWVtb2l6ZSBjb21wdXRlZCBzdHlsZXMgZm9yIHBlcmZvcm1hbmNlXG4gIGNvbnN0IGNvbXB1dGVkU3ggPSB1c2VNZW1vKCgpOiBTeFByb3BzPFRoZW1lPiA9PiB7XG4gICAgY29uc3QgYmFzZVN0eWxlczogU3hQcm9wczxUaGVtZT4gPSB7XG4gICAgICAvLyBJbnB1dCBmaWVsZCBzdHlsaW5nXG4gICAgICBcIiYgLk11aU91dGxpbmVkSW5wdXQtcm9vdFwiOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmQgXG4gICAgICAgICAgOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgIFxuICAgICAgICAvLyBUcmFuc2l0aW9uIGZvciBzbW9vdGggc3RhdGUgY2hhbmdlc1xuICAgICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoW1xuICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJyxcbiAgICAgICAgICAnYm9yZGVyLWNvbG9yJyxcbiAgICAgICAgICAnY29sb3InXG4gICAgICAgIF0sIHtcbiAgICAgICAgICBkdXJhdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuZHVyYXRpb24uc2hvcnQsXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIEVycm9yIHN0YXRlIHN0eWxpbmdcbiAgICAgICAgLi4uKGhhc0Vycm9yICYmIHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICB9LFxuICAgICAgICAgICcmLk11aS1mb2N1c2VkJzoge1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgICAgIGJveFNoYWRvdzogYDAgMCAwIDJweCAke3RoZW1lLnBhbGV0dGUuZXJyb3IubWFpbn0yNWAsIC8vIDI1IGlzIDE1JSBvcGFjaXR5IGluIGhleFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIExvYWRpbmcgc3RhdGUgc3R5bGluZ1xuICAgICAgICAuLi4obG9hZGluZyAmJiB7XG4gICAgICAgICAgb3BhY2l0eTogMC43LFxuICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgfSksXG4gICAgICB9LFxuXG4gICAgICAvLyBJbnB1dCBlbGVtZW50IHN0eWxpbmdcbiAgICAgIFwiJiAuTXVpSW5wdXRCYXNlLWlucHV0XCI6IHtcbiAgICAgICAgY3Vyc29yOiBkaXNhYmxlZCBcbiAgICAgICAgICA/IFwibm90LWFsbG93ZWRcIiBcbiAgICAgICAgICA6IHRleHRSZWFkT25seSBcbiAgICAgICAgICAgID8gXCJwb2ludGVyXCIgXG4gICAgICAgICAgICA6IFwidGV4dFwiLFxuICAgICAgICBcbiAgICAgICAgLy8gUmVhZC1vbmx5IHNwZWNpZmljIHN0eWxpbmdcbiAgICAgICAgLi4uKHRleHRSZWFkT25seSAmJiAhZGlzYWJsZWQgJiYge1xuICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCIsXG4gICAgICAgICAgdXNlclNlbGVjdDogXCJub25lXCIsXG4gICAgICAgICAgY2FyZXRDb2xvcjogXCJ0cmFuc3BhcmVudFwiLCAvLyBIaWRlIHRleHQgY3Vyc29yIGluIHJlYWQtb25seSBtb2RlXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8vIExvYWRpbmcgc3RhdGVcbiAgICAgICAgLi4uKGxvYWRpbmcgJiYge1xuICAgICAgICAgIGN1cnNvcjogXCJ3YWl0XCIsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gUmVxdWlyZWQgZmllbGQgYXN0ZXJpc2sgc3R5bGluZ1xuICAgICAgXCImIC5NdWlJbnB1dExhYmVsLWFzdGVyaXNrXCI6IHsgXG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgIGZvbnRTaXplOiBcIjEuMmVtXCIsXG4gICAgICB9LFxuXG4gICAgICAvLyBMYWJlbCBzdHlsaW5nIHdpdGggYmV0dGVyIGNvbnRyYXN0XG4gICAgICBcIiYgLk11aUlucHV0TGFiZWwtcm9vdFwiOiB7XG4gICAgICAgIGNvbG9yOiBoYXNFcnJvciBcbiAgICAgICAgICA/IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbiBcbiAgICAgICAgICA6IHRoZW1lLnBhbGV0dGUudGV4dC5zZWNvbmRhcnksXG4gICAgICAgIFxuICAgICAgICAvLyBFbnN1cmUgcHJvcGVyIGNvbnRyYXN0IGZvciBkaXNhYmxlZCBzdGF0ZVxuICAgICAgICAuLi4oZGlzYWJsZWQgJiYge1xuICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnRleHQuZGlzYWJsZWQsXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gSGVscGVyIHRleHQgc3R5bGluZ1xuICAgICAgXCImIC5NdWlGb3JtSGVscGVyVGV4dC1yb290XCI6IHtcbiAgICAgICAgbWFyZ2luTGVmdDogdGhlbWUuc3BhY2luZygxKSxcbiAgICAgICAgbWFyZ2luUmlnaHQ6IHRoZW1lLnNwYWNpbmcoMSksXG4gICAgICAgIFxuICAgICAgICAvLyBFcnJvciBzdGF0ZVxuICAgICAgICAuLi4oaGFzRXJyb3IgJiYge1xuICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4sXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAgLy8gQ2FsZW5kYXIgaWNvbiBzdHlsaW5nXG4gICAgICBcIiYgLk11aUlucHV0QWRvcm5tZW50LXJvb3RcIjoge1xuICAgICAgICBjb2xvcjogZGlzYWJsZWQgXG4gICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZCBcbiAgICAgICAgICA6IGhhc0Vycm9yIFxuICAgICAgICAgICAgPyB0aGVtZS5wYWxldHRlLmVycm9yLm1haW4gXG4gICAgICAgICAgICA6IHRoZW1lLnBhbGV0dGUuYWN0aW9uLmFjdGl2ZSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIEZvY3VzIHJpbmcgZm9yIGFjY2Vzc2liaWxpdHlcbiAgICAgIFwiJiAuTXVpT3V0bGluZWRJbnB1dC1yb290Lk11aS1mb2N1c2VkXCI6IHtcbiAgICAgICAgb3V0bGluZTogYDJweCBzb2xpZCAke3RoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWlufTUwYCwgLy8gNTAgaXMgMzElIG9wYWNpdHlcbiAgICAgICAgb3V0bGluZU9mZnNldDogXCIycHhcIixcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuaGFuY2VkIGNvbnRyYXN0IGZvciBkYXJrIHRoZW1lc1xuICAgICAgLi4uKHRoZW1lLnBhbGV0dGUubW9kZSA9PT0gJ2RhcmsnICYmIHtcbiAgICAgICAgXCImIC5NdWlPdXRsaW5lZElucHV0LXJvb3RcIjoge1xuICAgICAgICAgIGJvcmRlcldpZHRoOiAyLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIC8vIE1lcmdlIHdpdGggY3VzdG9tIHN0eWxlc1xuICAgIHJldHVybiBjdXN0b21TeCA/IFtiYXNlU3R5bGVzLCBjdXN0b21TeF0gYXMgU3hQcm9wczxUaGVtZT4gOiBiYXNlU3R5bGVzO1xuICB9LCBbXG4gICAgdGhlbWUsXG4gICAgZGlzYWJsZWQsXG4gICAgaGFzRXJyb3IsXG4gICAgbG9hZGluZyxcbiAgICB0ZXh0UmVhZE9ubHksXG4gICAgY3VzdG9tU3gsXG4gIF0pO1xuXG4gIC8vIEdlbmVyYXRlIGFkZGl0aW9uYWwgY2xhc3MgbmFtZXMgZm9yIGV4dGVybmFsIHN0eWxpbmcgaG9va3NcbiAgY29uc3QgY2xhc3NOYW1lID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICBpZiAoZGlzYWJsZWQpIGNsYXNzZXMucHVzaCgnRGF0ZVBpY2tlckVsZW1lbnQtLWRpc2FibGVkJyk7XG4gICAgaWYgKGhhc0Vycm9yKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1lcnJvcicpO1xuICAgIGlmIChsb2FkaW5nKSBjbGFzc2VzLnB1c2goJ0RhdGVQaWNrZXJFbGVtZW50LS1sb2FkaW5nJyk7XG4gICAgaWYgKHRleHRSZWFkT25seSkgY2xhc3Nlcy5wdXNoKCdEYXRlUGlja2VyRWxlbWVudC0tcmVhZE9ubHknKTtcbiAgICBcbiAgICByZXR1cm4gY2xhc3Nlcy5sZW5ndGggPiAwID8gY2xhc3Nlcy5qb2luKCcgJykgOiB1bmRlZmluZWQ7XG4gIH0sIFtkaXNhYmxlZCwgaGFzRXJyb3IsIGxvYWRpbmcsIHRleHRSZWFkT25seV0pO1xuXG4gIHJldHVybiB7XG4gICAgc3g6IGNvbXB1dGVkU3gsXG4gICAgY2xhc3NOYW1lLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VEYXRlUGlja2VyU3R5bGVzOyIsICJpbXBvcnQgdHlwZSB7IFBpY2tlclZhbGlkRGF0ZSB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgdHlwZSB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcbmltcG9ydCB0eXBlIHsgRmllbGRWYWx1ZXMsIEZpZWxkUGF0aCwgUGF0aFZhbHVlIH0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSBmb3IgY3JlYXRpbmcgYnJhbmRlZCBkYXRlIHR5cGVzIHRvIHByZXZlbnQgbWl4aW5nIGRpZmZlcmVudCBkYXRlIGZvcm1hdHNcbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBiYXNlIGRhdGUgdHlwZVxuICogQHRlbXBsYXRlIFRCcmFuZCAtIFRoZSBicmFuZCBzdHJpbmcgZm9yIHR5cGUgc2FmZXR5XG4gKi9cbmV4cG9ydCB0eXBlIEJyYW5kZWREYXRlPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlLCBUQnJhbmQgZXh0ZW5kcyBzdHJpbmc+ID0gXG4gIFREYXRlICYgeyByZWFkb25seSBfX2JyYW5kOiBUQnJhbmQgfTtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBkYXRlXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgdmFsaWQgZGF0ZS1saWtlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERhdGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQaWNrZXJWYWxpZERhdGUge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBEYXRlIG9iamVjdFxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGRhdGUtbGlrZSBvYmplY3RzIHdpdGggY29tbW9uIGRhdGUgbGlicmFyeSBtZXRob2RzXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgLy8gRGF5LmpzLCBNb21lbnQuanMsIG9yIHNpbWlsYXJcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5pc1ZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuaXNWYWxpZCgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBMdXhvbiBEYXRlVGltZVxuICAgIGlmICgnaXNWYWxpZCcgaW4gdmFsdWUgJiYgdHlwZW9mICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLmlzVmFsaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSBwYXJzZWQgYXMgYSBkYXRlXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgcGFyc2VhYmxlIGRhdGUgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhcnNhYmxlRGF0ZVN0cmluZyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEJhc2ljIElTTyBkYXRlIGZvcm1hdCBjaGVja1xuICBjb25zdCBpc29EYXRlUmVnZXggPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9KD86VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezN9KT8oPzpafFsrLV1cXGR7Mn06XFxkezJ9KT8pPyQvO1xuXG4gIGlmIChpc29EYXRlUmVnZXgudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIERhdGUgY29uc3RydWN0b3IgY2FuIHBhcnNlIGl0XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBEYXRlKHZhbHVlKTtcblxuICByZXR1cm4gIWlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlLXNhZmUgZGF0ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGZvcm0gdmFsdWVzIHRvIGRhdGUgcGlja2VyIHZhbHVlc1xuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVERhdGUgLSBUaGUgZGF0ZSB0eXBlIHVzZWQgYnkgdGhlIHBpY2tlclxuICogQHBhcmFtIGFkYXB0ZXIgLSBUaGUgZGF0ZSBhZGFwdGVyIGZyb20gTVVJIGxvY2FsaXphdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBBIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgc2FmZWx5IGNvbnZlcnRzIGZvcm0gdmFsdWVzIHRvIGRhdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEYXRlSW5wdXRUcmFuc2Zvcm08XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4pIHtcbiAgcmV0dXJuICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KTogVERhdGUgfCBudWxsID0+IHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGFkYXB0ZXIudXRpbHMuZGF0ZSh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGlzVmFsaWREYXRlKHBhcnNlZCkgPyAocGFyc2VkIGFzIFREYXRlKSA6IG51bGw7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVmFsaWREYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIFREYXRlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlLXNhZmUgZGF0ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGRhdGUgcGlja2VyIHZhbHVlcyBiYWNrIHRvIGZvcm0gdmFsdWVzXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBkYXRlIHR5cGUgdXNlZCBieSB0aGUgcGlja2VyXG4gKiBAcGFyYW0gZm9ybWF0IC0gVGhlIGZvcm1hdCB0byB1c2UgZm9yIHN0cmluZyBjb252ZXJzaW9uIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEEgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gdGhhdCBzYWZlbHkgY29udmVydHMgZGF0ZXMgdG8gZm9ybSB2YWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhdGVPdXRwdXRUcmFuc2Zvcm08XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBURGF0ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbj4oZm9ybWF0Pzogc3RyaW5nKSB7XG4gIHJldHVybiAodmFsdWU6IFREYXRlIHwgbnVsbCk6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPiA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9XG5cbiAgICBpZiAoIWlzVmFsaWREYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cblxuICAgIC8vIElmIG5vIGZvcm1hdCBzcGVjaWZpZWQsIHJldHVybiB0aGUgZGF0ZSBhcy1pc1xuICAgIGlmICghZm9ybWF0KSB7XG4gICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGRhdGUgbGlicmFyeSBmb3JtYXRzXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdpc28nKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RhdGUtb25seScpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEYXkuanMgZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuZm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBNb21lbnQuanMgZm9ybWF0XG4gICAgICBpZiAodHlwZW9mICh2YWx1ZSBhcyBhbnkpLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHZhbHVlIGFzIGFueSkuZm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBMdXhvbiBmb3JtYXRcbiAgICAgIGlmICh0eXBlb2YgKHZhbHVlIGFzIGFueSkudG9Gb3JtYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLnRvRm9ybWF0KGZvcm1hdCkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgfVxuXG4gICAgICAvLyBGYWxsYmFjazogcmV0dXJuIGFzLWlzXG4gICAgICByZXR1cm4gdmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBkZWZhdWx0IGRhdGUgcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAqIEB0ZW1wbGF0ZSBURGF0ZSAtIFRoZSBkYXRlIHR5cGVcbiAqIEByZXR1cm5zIERlZmF1bHQgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHREYXRlUGlja2VyQ29uZmlnPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlPigpIHtcbiAgcmV0dXJuIHtcbiAgICAvLyBEZWZhdWx0IHNsb3QgcHJvcHMgZm9yIGNvbnNpc3RlbnQgYmVoYXZpb3JcbiAgICBzbG90UHJvcHM6IHtcbiAgICAgIGFjdGlvbkJhcjoge1xuICAgICAgICBhY3Rpb25zOiBbJ2NsZWFyJywgJ3RvZGF5JywgJ2NhbmNlbCcsICdhY2NlcHQnXSBhcyBjb25zdCxcbiAgICAgIH0sXG4gICAgICB0ZXh0RmllbGQ6IHtcbiAgICAgICAgZnVsbFdpZHRoOiB0cnVlLFxuICAgICAgICB2YXJpYW50OiAnb3V0bGluZWQnIGFzIGNvbnN0LFxuICAgICAgfSxcbiAgICB9LFxuICAgIFxuICAgIC8vIERlZmF1bHQgZ3JpZCBwcm9wcyBmb3IgbGF5b3V0IGNvbnNpc3RlbmN5XG4gICAgZ3JpZFByb3BzOiB7XG4gICAgICBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gYXMgY29uc3QsXG4gICAgfSxcbiAgICBcbiAgICAvLyBEZWZhdWx0IHZhbGlkYXRpb24gY29uZmlndXJhdGlvblxuICAgIHZhbGlkYXRpb246IHtcbiAgICAgIGVycm9yTWVzc2FnZXM6IHtcbiAgICAgICAgaW52YWxpZERhdGU6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZVwiLFxuICAgICAgICBtaW5EYXRlOiBcIkRhdGUgbXVzdCBiZSBhZnRlciB0aGUgbWluaW11bSBhbGxvd2VkIGRhdGVcIixcbiAgICAgICAgbWF4RGF0ZTogXCJEYXRlIG11c3QgYmUgYmVmb3JlIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGF0ZVwiLFxuICAgICAgICBkaXNhYmxlZERhdGU6IFwiVGhpcyBkYXRlIGlzIG5vdCBhbGxvd2VkXCIsXG4gICAgICB9LFxuICAgIH0sXG4gIH0gYXMgY29uc3Q7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byBzYWZlbHkgZXh0cmFjdCBlcnJvciBtZXNzYWdlIGZyb20gdmFyaW91cyBlcnJvciB0eXBlc1xuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIG9iamVjdCAoY291bGQgYmUgZnJvbSByZWFjdC1ob29rLWZvcm0gb3IgTVVJIGRhdGUgcGlja2VyKVxuICogQHJldHVybnMgQSB1c2VyLWZyaWVuZGx5IGVycm9yIG1lc3NhZ2Ugc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsKSB7XG4gICAgLy8gUmVhY3QgSG9vayBGb3JtIEZpZWxkRXJyb3JcbiAgICBpZiAoJ21lc3NhZ2UnIGluIGVycm9yICYmIHR5cGVvZiAoZXJyb3IgYXMgYW55KS5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIChlcnJvciBhcyBhbnkpLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLy8gTVVJIERhdGVWYWxpZGF0aW9uRXJyb3JcbiAgICBpZiAoJ3R5cGUnIGluIGVycm9yICYmIHR5cGVvZiAoZXJyb3IgYXMgYW55KS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgZXJyb3JUeXBlID0gKGVycm9yIGFzIGFueSkudHlwZTtcblxuICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHtcbiAgICAgICAgY2FzZSAnaW52YWxpZERhdGUnOlxuICAgICAgICAgIHJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZSc7XG4gICAgICAgIGNhc2UgJ21pbkRhdGUnOlxuICAgICAgICAgIHJldHVybiAnRGF0ZSBpcyB0b28gZWFybHknO1xuICAgICAgICBjYXNlICdtYXhEYXRlJzpcbiAgICAgICAgICByZXR1cm4gJ0RhdGUgaXMgdG9vIGxhdGUnO1xuICAgICAgICBjYXNlICdkaXNhYmxlZERhdGUnOlxuICAgICAgICAgIHJldHVybiAnVGhpcyBkYXRlIGlzIG5vdCBhdmFpbGFibGUnO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAnSW52YWxpZCBkYXRlIHNlbGVjdGlvbic7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICdJbnZhbGlkIGlucHV0Jztcbn1cblxuLyoqXG4gKiBQZXJmb3JtYW5jZSB1dGlsaXR5IHRvIGNyZWF0ZSBzdGFibGUgcmVmZXJlbmNlcyBmb3IgY29tcGxleCBwcm9wc1xuICogVGhpcyBoZWxwcyBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlLXJlbmRlcnMgd2hlbiB1c2luZyBjb21wbGV4IGNvbmZpZ3VyYXRpb24gb2JqZWN0c1xuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIEEgSlNPTiBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGRlcGVuZGVuY3kgaW4gdXNlTWVtby91c2VDYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RhYmxlS2V5PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oY29uZmlnOiBUKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY29uZmlnLCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgLy8gU29ydCBvYmplY3Qga2V5cyBmb3IgY29uc2lzdGVudCBzZXJpYWxpemF0aW9uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qgc29ydGVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICBzb3J0ZWRba10gPSAodmFsdWUgYXMgYW55KVtrXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNvcnRlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsYmFjayBmb3Igbm9uLXNlcmlhbGl6YWJsZSBvYmplY3RzXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykuc29ydCgpLmpvaW4oJy0nKTtcbiAgfVxufSIsICJpbXBvcnQgVmlzaWJpbGl0eSBmcm9tICdAbXVpL2ljb25zLW1hdGVyaWFsL1Zpc2liaWxpdHknO1xuaW1wb3J0IFZpc2liaWxpdHlPZmYgZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9WaXNpYmlsaXR5T2ZmJztcbmltcG9ydCB0eXBlIHsgSWNvbkJ1dHRvblByb3BzLCBUZXh0RmllbGRQcm9wcywgR3JpZFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBJY29uQnV0dG9uLFxuICBJbnB1dEFkb3JubWVudCxcbiAgVGV4dEZpZWxkLFxuICB1c2VGb3JrUmVmLFxuICBHcmlkLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgTW91c2VFdmVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2wsIEZpZWxkUGF0aCwgRmllbGRWYWx1ZXMgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IHVzZUZvcm1JMThuIH0gZnJvbSAnLi4vLi4vaTE4bic7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBQYXNzd29yZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgUGFzc3dvcmRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4gPSBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZScgfCAnc2l6ZSc+ICYge1xuICAvKipcbiAgICogVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGZvcm1cbiAgICogQGV4YW1wbGUgXCJwYXNzd29yZFwiIHwgXCJ1c2VyLmN1cnJlbnRQYXNzd29yZFwiXG4gICAqL1xuICBuYW1lOiBUTmFtZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDb2xvciBvZiB0aGUgdmlzaWJpbGl0eSB0b2dnbGUgaWNvbiBidXR0b25cbiAgICogQGRlZmF1bHRWYWx1ZSBcImRlZmF1bHRcIlxuICAgKi9cbiAgaWNvbkNvbG9yPzogSWNvbkJ1dHRvblByb3BzWydjb2xvciddO1xuICAvKipcbiAgICogQ3VzdG9tIHJlbmRlciBmdW5jdGlvbiBmb3IgdGhlIHZpc2liaWxpdHkgdG9nZ2xlIGljb25cbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gV2hldGhlciBwYXNzd29yZCBpcyBjdXJyZW50bHkgaGlkZGVuXG4gICAqIEByZXR1cm5zIFJlYWN0Tm9kZSB0byByZW5kZXIgYXMgdGhlIGljb25cbiAgICogQGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZpc2liaWxpdHkvdmlzaWJpbGl0eS1vZmYgaWNvbnNcbiAgICovXG4gIHJlbmRlckljb24/OiAocGFzc3dvcmQ6IGJvb2xlYW4pID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFRyYW5zbGF0aW9uIGtleSBmb3IgdGhlIGxhYmVsIChyZXNvbHZlZCB2aWEgSTE4bkNvbnRleHQpXG4gICAqIEBleGFtcGxlIFwiRm9ybS5QYXNzd29yZC5MYWJlbFwiXG4gICAqL1xuICBsYWJlbEtleT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRyYW5zbGF0aW9uIGtleSBmb3IgdGhlIHBsYWNlaG9sZGVyIChyZXNvbHZlZCB2aWEgSTE4bkNvbnRleHQpXG4gICAqIEBleGFtcGxlIFwiRm9ybS5QYXNzd29yZC5QbGFjZWhvbGRlclwiXG4gICAqL1xuICBwbGFjZWhvbGRlcktleT86IHN0cmluZztcbiAgLyoqXG4gICAqIE5hbWVzcGFjZSBmb3IgdHJhbnNsYXRpb24ga2V5c1xuICAgKiBAZXhhbXBsZSBcIkF1dGguTG9naW5cIlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xufTtcblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gUGFzc3dvcmRFbDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPihwcm9wczogUGFzc3dvcmRFbGVtZW50UHJvcHM8VEZpZWxkVmFsdWVzLCBUTmFtZT4pIHtcbiAgY29uc3Qge1xuICAgIGljb25Db2xvcixcbiAgICByZW5kZXJJY29uID0gcGFzc3dvcmQgPT4gKHBhc3N3b3JkID8gPFZpc2liaWxpdHkgLz4gOiA8VmlzaWJpbGl0eU9mZiAvPiksXG4gICAgc2xvdFByb3BzLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBpbnB1dFJlZixcbiAgICBvbkJsdXIsXG4gICAgbGFiZWwsXG4gICAgbGFiZWxLZXksXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgcGxhY2Vob2xkZXJLZXksXG4gICAgbmFtZXNwYWNlLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIGNvbnN0IFtwYXNzd29yZCwgc2V0UGFzc3dvcmRdID0gdXNlU3RhdGU8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgLy8gaTE4biBob29rIGZvciByZXNvbHZpbmcgdHJhbnNsYXRpb24ga2V5cyAobmFtZXNwYWNlIGZyb20gY29udGV4dCBpZiBub3Qgc3BlY2lmaWVkKVxuICBjb25zdCB7IHJlc29sdmVMYWJlbCB9ID0gdXNlRm9ybUkxOG4oKTtcbiAgY29uc3QgcmVzb2x2ZWRMYWJlbCA9IHJlc29sdmVMYWJlbChsYWJlbCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsIGxhYmVsS2V5LCBuYW1lc3BhY2UpO1xuICBjb25zdCByZXNvbHZlZFBsYWNlaG9sZGVyID0gcmVzb2x2ZUxhYmVsKHBsYWNlaG9sZGVyIGFzIHN0cmluZyB8IHVuZGVmaW5lZCwgcGxhY2Vob2xkZXJLZXksIG5hbWVzcGFjZSk7XG5cbiAgY29uc3QgZW5kQWRvcm5tZW50ID0gKFxuICAgIDxJbnB1dEFkb3JubWVudCBwb3NpdGlvbj17J2VuZCd9PlxuICAgICAgPEljb25CdXR0b25cbiAgICAgICAgb25Nb3VzZURvd249eyhlOiBNb3VzZUV2ZW50PEhUTUxCdXR0b25FbGVtZW50PikgPT4gZS5wcmV2ZW50RGVmYXVsdCgpfVxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRQYXNzd29yZCghcGFzc3dvcmQpfVxuICAgICAgICB0YWJJbmRleD17LTF9XG4gICAgICAgIGNvbG9yPXtpY29uQ29sb3IgPz8gJ2RlZmF1bHQnfVxuICAgICAgPlxuICAgICAgICB7cmVuZGVySWNvbihwYXNzd29yZCl9XG4gICAgICA8L0ljb25CdXR0b24+XG4gICAgPC9JbnB1dEFkb3JubWVudD5cbiAgKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoZmllbGQucmVmLCBpbnB1dFJlZik7XG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dEZpZWxkXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIGxhYmVsPXtyZXNvbHZlZExhYmVsfVxuICAgICAgcGxhY2Vob2xkZXI9e3Jlc29sdmVkUGxhY2Vob2xkZXJ9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICB0eXBlPXtwYXNzd29yZCA/ICdwYXNzd29yZCcgOiAndGV4dCd9XG4gICAgICB2YWx1ZT17ZmllbGQudmFsdWUgPz8gJyd9XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHZhcmlhbnQ9e3Jlc3QudmFyaWFudCA/PyAnb3V0bGluZWQnfVxuICAgICAgb25DaGFuZ2U9e2V2ZW50ID0+IHtcbiAgICAgICAgZmllbGQub25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3Qub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXN0Lm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQmx1cj17ZXZlbnQgPT4ge1xuICAgICAgICBmaWVsZC5vbkJsdXIoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgey4uLih0eXBlb2Ygc2xvdFByb3BzID09PSAndW5kZWZpbmVkJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIElucHV0UHJvcHM6IHtcbiAgICAgICAgICAgICAgZW5kQWRvcm5tZW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgc2xvdFByb3BzOiB7XG4gICAgICAgICAgICAgIC4uLnNsb3RQcm9wcyxcbiAgICAgICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQsXG4gICAgICAgICAgICAgICAgLi4uc2xvdFByb3BzPy5pbnB1dCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0gYXMgVGV4dEZpZWxkUHJvcHNbJ3Nsb3RQcm9wcyddLFxuICAgICAgICAgIH0pfVxuICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAvPlxuICApO1xufTtcblxuLyoqXG4gKiBBIHJlYWN0LWhvb2stZm9ybSBpbnRlZ3JhdGVkIHBhc3N3b3JkIFRleHRGaWVsZCB3aXRoIHNob3cvaGlkZSBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZnVsbHkgaW50ZWdyYXRlZCBwYXNzd29yZCBpbnB1dCB0aGF0IHdvcmtzIHNlYW1sZXNzbHkgd2l0aCByZWFjdC1ob29rLWZvcm0sXG4gKiBpbmNsdWRpbmcgYXV0b21hdGljIHZhbGlkYXRpb24sIGVycm9yIGhhbmRsaW5nLCBhbmQgYSBidWlsdC1pbiB2aXNpYmlsaXR5IHRvZ2dsZSBidXR0b24uIFRoZSBwYXNzd29yZFxuICogY2FuIGJlIHNob3duIG9yIGhpZGRlbiBieSBjbGlja2luZyB0aGUgZXllIGljb24gaW4gdGhlIGlucHV0J3MgZW5kIGFkb3JubWVudC5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gUGFzc3dvcmQgdmlzaWJpbGl0eSB0b2dnbGVcbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXlcbiAqIC0gQ3VzdG9taXphYmxlIHZpc2liaWxpdHkgaWNvbnNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIERpc2FibGVkIHN0YXRlIHN1cHBvcnRcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxQYXNzd29yZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInBhc3N3b3JkXCJcbiAqICAgbGFiZWw9XCJQYXNzd29yZFwiXG4gKiAgIHJ1bGVzPXt7XG4gKiAgICAgcmVxdWlyZWQ6ICdQYXNzd29yZCBpcyByZXF1aXJlZCcsXG4gKiAgICAgbWluTGVuZ3RoOiB7IHZhbHVlOiA4LCBtZXNzYWdlOiAnTWluaW11bSA4IGNoYXJhY3RlcnMnIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gaWNvbiBjb2xvcjpcbiAqIGBgYHRzeFxuICogPFBhc3N3b3JkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiY29uZmlybVBhc3N3b3JkXCJcbiAqICAgbGFiZWw9XCJDb25maXJtIFBhc3N3b3JkXCJcbiAqICAgaWNvbkNvbG9yPVwicHJpbWFyeVwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiUmUtZW50ZXIgeW91ciBwYXNzd29yZFwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEN1c3RvbSBncmlkIGxheW91dDpcbiAqIGBgYHRzeFxuICogPFBhc3N3b3JkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwibmV3UGFzc3dvcmRcIlxuICogICBsYWJlbD1cIk5ldyBQYXNzd29yZFwiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICByZW5kZXJJY29uPXsoaGlkZGVuKSA9PiBoaWRkZW4gPyA8Q3VzdG9tSGlkZUljb24gLz4gOiA8Q3VzdG9tU2hvd0ljb24gLz59XG4gKiAvPlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBQYXNzd29yZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFBhc3N3b3JkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG5cbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5leHBvcnQgeyBQYXNzd29yZEVsZW1lbnQgfTtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIEZvcm1Db250cm9sTGFiZWxQcm9wcyxcbiAgRm9ybUxhYmVsUHJvcHMsXG4gIFJhZGlvR3JvdXBQcm9wcyxcbiAgUmFkaW9Qcm9wcyxcbiAgR3JpZFByb3BzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIEZvcm1Db250cm9sLFxuICBGb3JtQ29udHJvbExhYmVsLFxuICBGb3JtSGVscGVyVGV4dCxcbiAgRm9ybUxhYmVsLFxuICBSYWRpbyxcbiAgUmFkaW9Hcm91cCxcbiAgR3JpZCxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRFcnJvcixcbiAgRmllbGRQYXRoLFxuICBGaWVsZFZhbHVlcyxcbiAgUGF0aFZhbHVlLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybSc7XG5pbXBvcnQgeyB1c2VGb3JtSTE4biB9IGZyb20gJy4uLy4uL2kxOG4nO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcy9ldmVudHMnO1xuXG4vLyBUeXBlIGZvciBwcmltaXRpdmUgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgYXMgcmFkaW8gYnV0dG9uIHZhbHVlc1xudHlwZSBQcmltaXRpdmVWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbi8vIENvbnN0cmFpbnQgdG8gZW5zdXJlIG9wdGlvbiBvYmplY3RzIGhhdmUgdGhlIHJlcXVpcmVkIGtleXNcbnR5cGUgT3B0aW9uT2JqZWN0PFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IFJlY29yZDxUVmFsdWVLZXksIFByaW1pdGl2ZVZhbHVlPiAmXG4gIFJlY29yZDxUTGFiZWxLZXksIHN0cmluZz4gJlxuICBQYXJ0aWFsPFJlY29yZDxURGlzYWJsZWRLZXksIGJvb2xlYW4+PiA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFkaW9CdXR0b25Hcm91cFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdpZCcsXG4gIFRMYWJlbEtleSBleHRlbmRzICBzdHJpbmcgPSAnbGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4ge1xuICBvcHRpb25zOiBUT3B0aW9uW107XG4gIGhlbHBlclRleHQ/OiBSZWFjdE5vZGU7XG4gIG5hbWU6IFROYW1lO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIGxhYmVsRmllbGQ/OiBUTGFiZWxLZXk7XG4gIHZhbHVlRmllbGQ/OiBUVmFsdWVLZXk7XG4gIGRpc2FibGVkS2V5PzogVERpc2FibGVkS2V5O1xuICB0eXBlPzogJ251bWJlcicgfCAnc3RyaW5nJyB8ICdib29sZWFuJztcbiAgZW1wdHlPcHRpb25MYWJlbD86IHN0cmluZztcbiAgb25DaGFuZ2U/OiAodmFsdWU6IFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb24gfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gIHJldHVybk9iamVjdD86IGJvb2xlYW47XG4gIHJvdz86IGJvb2xlYW47XG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIGxhYmVsUHJvcHM/OiBPbWl0PEZvcm1Db250cm9sTGFiZWxQcm9wcywgJ2xhYmVsJyB8ICdjb250cm9sJyB8ICd2YWx1ZSc+O1xuICBmb3JtTGFiZWxQcm9wcz86IE9taXQ8Rm9ybUxhYmVsUHJvcHMsICdyZXF1aXJlZCcgfCAnZXJyb3InPjtcbiAgcmFkaW9Qcm9wcz86IFJhZGlvUHJvcHM7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgdHJhbnNmb3JtPzoge1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRPcHRpb25bVFZhbHVlS2V5XTtcbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudE9yVmFsdWU6IEV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBSYWRpb0J1dHRvbkdyb3VwPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2lkJyxcbiAgVExhYmVsS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2xhYmVsJyxcbiAgVERpc2FibGVkS2V5IGV4dGVuZHMgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4oXG4gIHByb3BzOiBSYWRpb0J1dHRvbkdyb3VwUHJvcHM8XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb24sXG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPlxuKSB7XG4gIGNvbnN0IHtcbiAgICBvcHRpb25zLFxuICAgIGxhYmVsLFxuICAgIGxhYmVsS2V5LFxuICAgIG5hbWVzcGFjZSxcbiAgICBuYW1lLFxuICAgIGxhYmVsRmllbGQgPSAnbGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUZpZWxkID0gJ2lkJyBhcyBUVmFsdWVLZXksXG4gICAgZGlzYWJsZWRLZXkgPSAnZGlzYWJsZWQnIGFzIFREaXNhYmxlZEtleSxcbiAgICByZXF1aXJlZCxcbiAgICBlbXB0eU9wdGlvbkxhYmVsLFxuICAgIHJldHVybk9iamVjdCxcbiAgICByb3cgPSB0cnVlLFxuICAgIGNvbnRyb2wsXG4gICAgdHlwZSxcbiAgICBsYWJlbFByb3BzLFxuICAgIGRpc2FibGVkLFxuICAgIGZvcm1MYWJlbFByb3BzLFxuICAgIHJhZGlvUHJvcHMsXG4gICAgdHJhbnNmb3JtLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIC8vIGkxOG4gaG9vayBmb3IgcmVzb2x2aW5nIHRyYW5zbGF0aW9uIGtleXMgKG5hbWVzcGFjZSBmcm9tIGNvbnRleHQgaWYgbm90IHNwZWNpZmllZClcbiAgY29uc3QgeyByZXNvbHZlTGFiZWwgfSA9IHVzZUZvcm1JMThuKCk7XG4gIGNvbnN0IHJlc29sdmVkTGFiZWwgPSByZXNvbHZlTGFiZWwobGFiZWwsIGxhYmVsS2V5LCBuYW1lc3BhY2UpO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGRpc2FibGVkLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm08XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRPcHRpb25bVFZhbHVlS2V5XSB8IFRPcHRpb25cbiAgPih7XG4gICAgdmFsdWU6IGZpZWxkLnZhbHVlLFxuICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICB0cmFuc2Zvcm06IHtcbiAgICAgIGlucHV0OlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtPy5pbnB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gdHJhbnNmb3JtLmlucHV0XG4gICAgICAgICAgOiB2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZSB8fCAoJycgYXMgVE9wdGlvbltUVmFsdWVLZXldKTtcbiAgICAgICAgICAgIH0sXG4gICAgICBvdXRwdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/Lm91dHB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gdHJhbnNmb3JtPy5vdXRwdXRcbiAgICAgICAgICA6IChfZXZlbnQsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbih2YWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICAgICAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3Qgb25SYWRpb0NoYW5nZTogUmFkaW9Hcm91cFByb3BzWydvbkNoYW5nZSddID0gKGV2ZW50LCByYWRpb1ZhbHVlKSA9PiB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSByZXR1cm5PYmplY3RcbiAgICAgID8gKG9wdGlvbnMgYXMgVE9wdGlvbltdKS5maW5kKG9wdGlvbiA9PiBvcHRpb25bdmFsdWVGaWVsZF0gPT09IHJhZGlvVmFsdWUpXG4gICAgICA6IChyYWRpb1ZhbHVlIGFzIFRPcHRpb25bVFZhbHVlS2V5XSk7XG5cbiAgICBvbkNoYW5nZShldmVudCwgcmV0dXJuVmFsdWUpO1xuICAgIGlmICh0eXBlb2YgcmVzdC5vbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVzdC5vbkNoYW5nZShyZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEZvcm1Db250cm9sIGVycm9yPXshIWVycm9yfT5cbiAgICAgIHtsYWJlbCAmJiAoXG4gICAgICAgIDxGb3JtTGFiZWwgey4uLmZvcm1MYWJlbFByb3BzfSByZXF1aXJlZD17cmVxdWlyZWR9IGVycm9yPXshIWVycm9yfT5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvRm9ybUxhYmVsPlxuICAgICAgKX1cbiAgICAgIDxSYWRpb0dyb3VwIG9uQ2hhbmdlPXtvblJhZGlvQ2hhbmdlfSBuYW1lPXtuYW1lfSByb3c9e3Jvd30gdmFsdWU9e3ZhbHVlfT5cbiAgICAgICAge2VtcHR5T3B0aW9uTGFiZWwgJiYgKFxuICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICB7Li4ubGFiZWxQcm9wc31cbiAgICAgICAgICAgIGNvbnRyb2w9e1xuICAgICAgICAgICAgICA8UmFkaW9cbiAgICAgICAgICAgICAgICB7Li4ucmFkaW9Qcm9wc31cbiAgICAgICAgICAgICAgICBjaGVja2VkPXshdmFsdWV9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYWJlbD17ZW1wdHlPcHRpb25MYWJlbH1cbiAgICAgICAgICAgIHZhbHVlPVwiXCJcbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgICB7b3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgICAgICBjb25zdCBvcHRpb25LZXkgPSBvcHRpb25bdmFsdWVGaWVsZF07XG4gICAgICAgICAgY29uc3Qgb3B0aW9uRGlzYWJsZWQgPSBvcHRpb25bZGlzYWJsZWRLZXldIHx8IGZhbHNlO1xuICAgICAgICAgIGxldCB2YWw6IFRPcHRpb25bVFZhbHVlS2V5XSB8IHVuZGVmaW5lZCA9IHJldHVybk9iamVjdFxuICAgICAgICAgICAgPyAodmFsdWUgYXMgVE9wdGlvbik/Llt2YWx1ZUZpZWxkXVxuICAgICAgICAgICAgOiAodmFsdWUgYXMgVE9wdGlvbltUVmFsdWVLZXldKTtcblxuICAgICAgICAgIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsID0gTnVtYmVyKHZhbCkgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWwgPSBCb29sZWFuKHZhbCkgYXMgVE9wdGlvbltUVmFsdWVLZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IHZhbCA9PT0gb3B0aW9uS2V5O1xuXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxGb3JtQ29udHJvbExhYmVsXG4gICAgICAgICAgICAgIGtleT17U3RyaW5nKG9wdGlvbktleSl9XG4gICAgICAgICAgICAgIHsuLi5sYWJlbFByb3BzfVxuICAgICAgICAgICAgICBjb250cm9sPXtcbiAgICAgICAgICAgICAgICA8UmFkaW9cbiAgICAgICAgICAgICAgICAgIHsuLi5yYWRpb1Byb3BzfVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkIHx8IG9wdGlvbkRpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgY2hlY2tlZD17aXNDaGVja2VkfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWU9e29wdGlvbktleX1cbiAgICAgICAgICAgICAgbGFiZWw9e29wdGlvbltsYWJlbEZpZWxkXX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSl9XG4gICAgICA8L1JhZGlvR3JvdXA+XG4gICAgICB7ZXJyb3IgJiYgPEZvcm1IZWxwZXJUZXh0PntlcnJvci5tZXNzYWdlfTwvRm9ybUhlbHBlclRleHQ+fVxuICAgIDwvRm9ybUNvbnRyb2w+XG4gICk7XG59O1xuXG5jb25zdCBSYWRpb0J1dHRvbkdyb3VwID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8XG4gICAgVFZhbHVlS2V5LFxuICAgIFRMYWJlbEtleSxcbiAgICBURGlzYWJsZWRLZXlcbiAgPiA9IE9wdGlvbk9iamVjdCxcbiAgVFZhbHVlS2V5IGV4dGVuZHMgIHN0cmluZyA9ICdpZCcsXG4gIFRMYWJlbEtleSBleHRlbmRzICBzdHJpbmcgPSAnbGFiZWwnLFxuICBURGlzYWJsZWRLZXkgZXh0ZW5kcyAgc3RyaW5nID0gJ2Rpc2FibGVkJyxcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFJhZGlvQnV0dG9uR3JvdXBQcm9wczxcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgVE9wdGlvbixcbiAgVFZhbHVlS2V5LFxuICBUTGFiZWxLZXksXG4gIFREaXNhYmxlZEtleVxuPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQ8XG4gICAgICAgIFRGaWVsZFZhbHVlcyxcbiAgICAgICAgVE5hbWUsXG4gICAgICAgIFRPcHRpb24sXG4gICAgICAgIFRWYWx1ZUtleSxcbiAgICAgICAgVExhYmVsS2V5LFxuICAgICAgICBURGlzYWJsZWRLZXlcbiAgICAgID5cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5SYWRpb0J1dHRvbkdyb3VwLmRpc3BsYXlOYW1lID0gJ1JhZGlvQnV0dG9uR3JvdXAnO1xuXG5leHBvcnQgeyBSYWRpb0J1dHRvbkdyb3VwIH07XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBUZXh0RmllbGRQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZVByb3BzLFxufSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7IEdyaWQsIFRleHRGaWVsZCwgQXV0b2NvbXBsZXRlIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5leHBvcnQgdHlwZSBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4gPSBPbWl0PFxuICBBdXRvY29tcGxldGVQcm9wczxcbiAgICBUT3B0aW9uLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+LFxuICB8ICduYW1lJ1xuICB8ICdyZW5kZXJJbnB1dCdcbiAgfCAnaXNPcHRpb25FcXVhbFRvVmFsdWUnXG4gIHwgJ2dldE9wdGlvbkxhYmVsJ1xuICB8ICdkaXNhYmxlZCdcbj4gJiB7XG4gIG5hbWU6IFROYW1lO1xuICBkZXBlbmRzT246IFROYW1lO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBncmlkUHJvcHM/OiBHcmlkUHJvcHM7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGlzRWRpdD86IGJvb2xlYW47XG4gIGxhYmVsRmllbGQ/OiBrZXlvZiBUT3B0aW9uO1xuICB2YWx1ZUZpZWxkPzoga2V5b2YgVE9wdGlvbjtcbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xuICBvcHRpb25zPzogcmVhZG9ubHkgVE9wdGlvbltdIHwgbnVsbDtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFNlbGVjdENhc2NhZGVFbGVtZW50PFxuICBUT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBTZWxlY3RDYXNjYWRlRWxlbWVudFByb3BzPFRPcHRpb24sIFRGaWVsZFZhbHVlcywgVE5hbWU+KSB7XG4gIGNvbnN0IHtcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyxcbiAgICBuYW1lLFxuICAgIG9uQmx1cixcbiAgICBvbkNoYW5nZSxcbiAgICBkaXNhYmxlZCxcbiAgICBvcHRpb25zOiBvcHRpb25zSW5wdXQsXG4gICAgY29udHJvbCxcbiAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgZGVwZW5kc09uLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgdmFyaWFudCxcbiAgICBpc0VkaXQgPSBmYWxzZSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCB7IHJlcXVpcmVkLCAuLi5yZXN0VGV4dFByb3BzIH0gPSB0ZXh0RmllbGRQcm9wcztcbiAgY29uc3Qgb3B0aW9ucyA9IHVzZU1lbW8oKCkgPT4gb3B0aW9uc0lucHV0IHx8IFtdLCBbb3B0aW9uc0lucHV0XSk7XG5cbiAgY29uc3QgZ2V0T3B0aW9uS2V5ID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyB8IG51bWJlciA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9wdGlvbiA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiBvcHRpb247XG4gICAgICBjb25zdCBrZXkgPSBvcHRpb24gPyBvcHRpb25bdmFsdWVGaWVsZCBhcyBrZXlvZiBUT3B0aW9uXSA6IHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIGtleSAhPT0gdW5kZWZpbmVkICYmIGtleSAhPT0gbnVsbCA/IFN0cmluZyhrZXkpIDogJyc7XG4gICAgfSxcbiAgICBbdmFsdWVGaWVsZF1cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24pID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZCBhcyBrZXlvZiBUT3B0aW9uXSkgOiAnJztcbiAgICB9LFxuICAgIFtsYWJlbEZpZWxkXVxuICApO1xuXG4gIGNvbnN0IGlzT3B0aW9uRXF1YWxUb1ZhbHVlID0gKG9wdGlvbjogVE9wdGlvbiwgdmFsdWU6IFRPcHRpb24pID0+XG4gICAgZ2V0T3B0aW9uS2V5KG9wdGlvbikgPT09IGdldE9wdGlvbktleSh2YWx1ZSk7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgeyBmaWVsZDogZGVwZW5kZW50RmllbGQgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWU6IGRlcGVuZHNPbixcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBwYXJlbnRWYWx1ZVJlZiA9IHVzZVJlZjxUT3B0aW9uPihkZXBlbmRlbnRGaWVsZC52YWx1ZSA/PyBudWxsKTtcbiAgY29uc3QgaGFzQXV0b1NlbGVjdGVkID0gdXNlUmVmPGJvb2xlYW4+KGZhbHNlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChwYXJlbnRWYWx1ZVJlZj8uY3VycmVudCAhPT0gZGVwZW5kZW50RmllbGQudmFsdWUpIHtcbiAgICAgIGhhc0F1dG9TZWxlY3RlZC5jdXJyZW50ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghIWZpZWxkLnZhbHVlICYmIHBhcmVudFZhbHVlUmVmPy5jdXJyZW50ICE9PSBkZXBlbmRlbnRGaWVsZC52YWx1ZSkge1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgfVxuICB9LCBbZGVwZW5kZW50RmllbGQudmFsdWVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgICFpc0VkaXQgJiZcbiAgICAgICFkaXNhYmxlZCAmJlxuICAgICAgb3B0aW9ucy5sZW5ndGggPT09IDEgJiZcbiAgICAgICEhZGVwZW5kZW50RmllbGQudmFsdWUgJiZcbiAgICAgICFoYXNBdXRvU2VsZWN0ZWQuY3VycmVudCAmJlxuICAgICAgZmllbGQudmFsdWUgPT0gbnVsbFxuICAgICkge1xuICAgICAgZmllbGQub25DaGFuZ2UoZ2V0T3B0aW9uS2V5KG9wdGlvbnNbMF0pKTtcbiAgICAgIGhhc0F1dG9TZWxlY3RlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXG4gICAgICAhaXNFZGl0LFxuICAgICAgIWRpc2FibGVkLFxuICAgICAgb3B0aW9ucy5sZW5ndGggPT09IDEsXG4gICAgICAhIWRlcGVuZGVudEZpZWxkLnZhbHVlLFxuICAgICAgIWhhc0F1dG9TZWxlY3RlZCxcbiAgICAgIGZpZWxkLnZhbHVlXG4gICAgKTtcbiAgfSwgW1xuICAgIG9wdGlvbnMsXG4gICAgZmllbGQudmFsdWUsXG4gICAgZmllbGQub25DaGFuZ2UsXG4gICAgaGFzQXV0b1NlbGVjdGVkLFxuICAgIGlzRWRpdCxcbiAgICBkaXNhYmxlZCxcbiAgICBmaWVsZCxcbiAgICBnZXRPcHRpb25LZXksXG4gICAgZGVwZW5kZW50RmllbGQub25DaGFuZ2UsXG4gIF0pO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgey4uLnJlc3R9XG4gICAgICB2YWx1ZT17XG4gICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAubWFwKG9wdGlvbiA9PiAoZ2V0T3B0aW9uS2V5KG9wdGlvbikgPT09IGZpZWxkLnZhbHVlID8gb3B0aW9uIDogbnVsbCkpXG4gICAgICAgICAgLmZpbmQoQm9vbGVhbikgfHwgbnVsbFxuICAgICAgfVxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICBnZXRPcHRpb25LZXk9e2dldE9wdGlvbktleX1cbiAgICAgIGdldE9wdGlvbkxhYmVsPXtnZXRPcHRpb25MYWJlbH1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXtpc09wdGlvbkVxdWFsVG9WYWx1ZX1cbiAgICAgIHJlZj17ZmllbGQucmVmfVxuICAgICAgZGlzYWJsZWQ9e2RlcGVuZGVudEZpZWxkLnZhbHVlID09IG51bGwgfHwgZGlzYWJsZWR9XG4gICAgICBvbkNoYW5nZT17KGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKSA9PiB7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKG5ld1ZhbHVlID8gZ2V0T3B0aW9uS2V5KG5ld1ZhbHVlKSA6IG51bGwpO1xuICAgICAgICBpZiAob25DaGFuZ2UgJiYgdHlwZW9mIG9uQ2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25DaGFuZ2UoZXZlbnQsIG5ld1ZhbHVlLCByZWFzb24pO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBmdWxsV2lkdGhcbiAgICAgIHJlbmRlcklucHV0PXtwYXJhbXMgPT4gKFxuICAgICAgICA8VGV4dEZpZWxkXG4gICAgICAgICAgey4uLnBhcmFtc31cbiAgICAgICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgICAgICBmdWxsV2lkdGhcbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICByZXF1aXJlZD17cmVxdWlyZWQgfHwgb3B0aW9ucy5sZW5ndGggPT0gMH1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIHZhcmlhbnQ9e3ZhcmlhbnQgPyB2YXJpYW50IDogJ291dGxpbmVkJ31cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RDYXNjYWRlRWxlbWVudCA9IDxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogU2VsZWN0Q2FzY2FkZUVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZVxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuU2VsZWN0Q2FzY2FkZUVsZW1lbnQuZGlzcGxheU5hbWUgPSAnU2VsZWN0Q2FzY2FkZUVsZW1lbnQnO1xuIiwgImltcG9ydCB0eXBlIHtcbiAgR3JpZFByb3BzLFxuICBDaGlwVHlwZU1hcCxcbiAgVGV4dEZpZWxkUHJvcHMsXG4gIEF1dG9jb21wbGV0ZVByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbiAgQXV0b2NvbXBsZXRlVmFsdWUsXG4gIEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvbixcbiAgQXV0b2NvbXBsZXRlRnJlZVNvbG9WYWx1ZU1hcHBpbmcsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgR3JpZCwgVGV4dEZpZWxkLCBBdXRvY29tcGxldGUgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIHVzZU1lbW8sXG4gIHVzZUVmZmVjdCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHR5cGUgU3ludGhldGljRXZlbnQsXG4gIHVzZVJlZixcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgeyB1c2VGb3JtSTE4biB9IGZyb20gJy4uLy4uL2kxOG4nO1xuaW1wb3J0IHR5cGUgeyBGbGV4aWJsZU9wdGlvbiB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFNlbGVjdEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBUT3B0aW9uIC0gVGhlIG9wdGlvbiBvYmplY3QgdHlwZVxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgTXVsdGlwbGUgLSBXaGV0aGVyIG11bHRpcGxlIHNlbGVjdGlvbiBpcyBlbmFibGVkXG4gKiBAdGVtcGxhdGUgRGlzYWJsZUNsZWFyYWJsZSAtIFdoZXRoZXIgdGhlIGNsZWFyIGJ1dHRvbiBpcyBkaXNhYmxlZFxuICogQHRlbXBsYXRlIEZyZWVTb2xvIC0gV2hldGhlciBmcmVlIHRleHQgaW5wdXQgaXMgYWxsb3dlZFxuICogQHRlbXBsYXRlIENoaXBDb21wb25lbnQgLSBUaGUgY2hpcCBjb21wb25lbnQgdHlwZSBmb3IgbXVsdGlwbGUgc2VsZWN0aW9uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBTZWxlY3RFbGVtZW50UHJvcHM8XG4gIFRPcHRpb24sXG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IE9taXQ8XG4gIEF1dG9jb21wbGV0ZVByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgTXVsdGlwbGUsXG4gICAgRGlzYWJsZUNsZWFyYWJsZSxcbiAgICBGcmVlU29sbyxcbiAgICBDaGlwQ29tcG9uZW50XG4gID4sXG4gIHwgJ25hbWUnXG4gIHwgJ3JlbmRlcklucHV0J1xuICB8ICdpc09wdGlvbkVxdWFsVG9WYWx1ZSdcbiAgfCAnZ2V0T3B0aW9uTGFiZWwnXG4gIHwgJ2Rpc2FibGVkJ1xuICB8ICdvcHRpb25zJ1xuPiAmIHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiY2F0ZWdvcnlcIiB8IFwidXNlci5kZXBhcnRtZW50XCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogVGhlIGZvcm0gY29udHJvbCBpbnN0YW5jZSBmcm9tIHJlYWN0LWhvb2stZm9ybVxuICAgKi9cbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBzZWxlY3QgaW5wdXQgKHRha2VzIHByZWNlZGVuY2Ugb3ZlciBwbGFjZWhvbGRlcktleSlcbiAgICogQGV4YW1wbGUgXCJDaG9vc2UgYW4gb3B0aW9uLi4uXCJcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogVHJhbnNsYXRpb24ga2V5IGZvciB0aGUgcGxhY2Vob2xkZXIuIFVzZWQgd2hlbiBJMThuUHJvdmlkZXIgaXMgYXZhaWxhYmxlLlxuICAgKiBAZXhhbXBsZSBcIk1hc3Rlci5Db3VudHJ5LkNvdW50cnlOYW1lLlBsYWNlaG9sZGVyXCJcbiAgICovXG4gIHBsYWNlaG9sZGVyS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGlucHV0IGxhYmVsIHRleHQgKHRha2VzIHByZWNlZGVuY2Ugb3ZlciBsYWJlbEtleSlcbiAgICogQGV4YW1wbGUgXCJDYXRlZ29yeVwiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRyYW5zbGF0aW9uIGtleSBmb3IgdGhlIGxhYmVsLiBVc2VkIHdoZW4gSTE4blByb3ZpZGVyIGlzIGF2YWlsYWJsZS5cbiAgICogQGV4YW1wbGUgXCJNYXN0ZXIuQ291bnRyeS5Db3VudHJ5TmFtZS5MYWJlbFwiXG4gICAqL1xuICBsYWJlbEtleT86IHN0cmluZztcbiAgLyoqXG4gICAqIE5hbWVzcGFjZSB0byBwcmVmaXggdHJhbnNsYXRpb24ga2V5cy4gQWxsb3dzIHNob3J0ZXIga2V5cyBpbiBjb21wb25lbnRzLlxuICAgKiBAZXhhbXBsZSBcIk1hc3Rlci5Db3VudHJ5XCIgLSB0aGVuIGxhYmVsS2V5PVwiQ291bnRyeU5hbWUuTGFiZWxcIiBiZWNvbWVzIFwiTWFzdGVyLkNvdW50cnkuQ291bnRyeU5hbWUuTGFiZWxcIlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFRleHRGaWVsZCB2YXJpYW50XG4gICAqIEBkZWZhdWx0VmFsdWUgXCJvdXRsaW5lZFwiXG4gICAqL1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgaW4gZWRpdCBtb2RlIChhZmZlY3RzIGF1dG8tc2VsZWN0aW9uIGJlaGF2aW9yKVxuICAgKiBXaGVuIGZhbHNlIGFuZCBvbmx5IG9uZSBvcHRpb24gZXhpc3RzLCB0aGF0IG9wdGlvbiBpcyBhdXRvLXNlbGVjdGVkXG4gICAqIEBkZWZhdWx0VmFsdWUgZmFsc2VcbiAgICovXG4gIGlzRWRpdD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzZWxlY3QgaXMgZGlzYWJsZWRcbiAgICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBuYW1lIGluIG9wdGlvbiBvYmplY3RzIHRvIHVzZSBhcyBkaXNwbGF5IGxhYmVsXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJMYWJlbFwiXG4gICAqIEBleGFtcGxlIFwibmFtZVwiIHwgXCJ0aXRsZVwiXG4gICAqL1xuICBsYWJlbEZpZWxkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHByb3BlcnR5IG5hbWUgaW4gb3B0aW9uIG9iamVjdHMgdG8gdXNlIGFzIHRoZSB2YWx1ZVxuICAgKiBAZGVmYXVsdFZhbHVlIFwiVmFsdWVcIlxuICAgKiBAZXhhbXBsZSBcImlkXCIgfCBcImNvZGVcIlxuICAgKi9cbiAgdmFsdWVGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHByb3BzIGZvciB0aGUgdW5kZXJseWluZyBUZXh0RmllbGQgY29tcG9uZW50XG4gICAqL1xuICB0ZXh0RmllbGRQcm9wcz86IE9taXQ8VGV4dEZpZWxkUHJvcHMsICduYW1lJz47XG5cbiAgb3B0aW9ucz86IHJlYWRvbmx5IFRPcHRpb25bXSB8IG51bGw7XG59O1xuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBTZWxlY3RFbGVtZW50PFxuICBUT3B0aW9uIGV4dGVuZHMgRmxleGlibGVPcHRpb24gPSBGbGV4aWJsZU9wdGlvbixcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBNdWx0aXBsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRGlzYWJsZUNsZWFyYWJsZSBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIENoaXBDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5FbGVtZW50VHlwZSA9IENoaXBUeXBlTWFwWydkZWZhdWx0Q29tcG9uZW50J10sXG4+KFxuICBwcm9wczogU2VsZWN0RWxlbWVudFByb3BzPFxuICAgIFRPcHRpb24sXG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIE11bHRpcGxlLFxuICAgIERpc2FibGVDbGVhcmFibGUsXG4gICAgRnJlZVNvbG8sXG4gICAgQ2hpcENvbXBvbmVudFxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBvbkNoYW5nZSxcbiAgICBpc0VkaXQsXG4gICAgb3B0aW9uczogb3B0aW9uc0lucHV0LFxuICAgIGxhYmVsLFxuICAgIGxhYmVsS2V5LFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHBsYWNlaG9sZGVyS2V5LFxuICAgIG5hbWVzcGFjZSxcbiAgICB2YXJpYW50LFxuICAgIGRpc2FibGVkLFxuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnLFxuICAgIHZhbHVlRmllbGQgPSAnVmFsdWUnLFxuICAgIHRleHRGaWVsZFByb3BzID0ge30sXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3QgeyByZXF1aXJlZCwgLi4ucmVzdFRleHRQcm9wcyB9ID0gdGV4dEZpZWxkUHJvcHM7XG4gIGNvbnN0IG9wdGlvbnMgPSB1c2VNZW1vKCgpID0+IG9wdGlvbnNJbnB1dCB8fCBbXSwgW29wdGlvbnNJbnB1dF0pO1xuICBjb25zdCBpZ25vcmVBdXRvU2VsZWN0UmVmID0gdXNlUmVmPHVua25vd24+KG51bGwpO1xuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICAvLyBHZXQgdHJhbnNsYXRpb24gZnVuY3Rpb24gZnJvbSBjb250ZXh0IChuYW1lc3BhY2UgZnJvbSBjb250ZXh0IGlmIG5vdCBzcGVjaWZpZWQpXG4gIGNvbnN0IHsgcmVzb2x2ZUxhYmVsIH0gPSB1c2VGb3JtSTE4bigpO1xuXG4gIC8vIFJlc29sdmUgbGFiZWwgYW5kIHBsYWNlaG9sZGVyIGZyb20ga2V5cyBvciBkaXJlY3QgdmFsdWVzXG4gIGNvbnN0IHJlc29sdmVkTGFiZWwgPSByZXNvbHZlTGFiZWwobGFiZWwsIGxhYmVsS2V5LCBuYW1lc3BhY2UpO1xuICBjb25zdCByZXNvbHZlZFBsYWNlaG9sZGVyID0gcmVzb2x2ZUxhYmVsKFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHBsYWNlaG9sZGVyS2V5LFxuICAgIG5hbWVzcGFjZVxuICApO1xuXG4gIGNvbnN0IGdldE9wdGlvblZhbHVlID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gb3B0aW9uO1xuXG4gICAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW3ZhbHVlRmllbGRdIDogbnVsbDsgLy8gUmV0dXJuIG51bGwgZm9yIGNvbnNpc3RlbmN5XG4gICAgfSxcbiAgICBbdmFsdWVGaWVsZF1cbiAgKTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRpb246IFRPcHRpb24gfCBBdXRvY29tcGxldGVGcmVlU29sb1ZhbHVlTWFwcGluZzxGcmVlU29sbz4pID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG9wdGlvbjtcblxuICAgICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZF0pIDogJyc7XG4gICAgfSxcbiAgICBbbGFiZWxGaWVsZF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgZXZlbnQ6IFN5bnRoZXRpY0V2ZW50LFxuICAgIG5ld1ZhbHVlOiBBdXRvY29tcGxldGVWYWx1ZTxUT3B0aW9uLCBNdWx0aXBsZSwgRGlzYWJsZUNsZWFyYWJsZSwgRnJlZVNvbG8+LFxuICAgIHJlYXNvbjogQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uXG4gICkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbiA9IG5ld1ZhbHVlIGFzIFRPcHRpb24gfCBudWxsO1xuXG4gICAgaWYgKHJlYXNvbiA9PT0gJ2NsZWFyJyAmJiBvcHRpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWdub3JlQXV0b1NlbGVjdFJlZi5jdXJyZW50ID0gZ2V0T3B0aW9uVmFsdWUob3B0aW9uc1swXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IGlmIHRoZXkgc2VsZWN0IHNvbWV0aGluZyBlbHNlIG9yIHRoZSBzdGF0ZSBjaGFuZ2VzXG4gICAgICBpZ25vcmVBdXRvU2VsZWN0UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cblxuICAgIGZpZWxkLm9uQ2hhbmdlKG9wdGlvbiA/IGdldE9wdGlvblZhbHVlKG9wdGlvbikgOiBudWxsKTtcbiAgICBvbkNoYW5nZT8uKGV2ZW50LCBuZXdWYWx1ZSwgcmVhc29uKTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgICFpc0VkaXQgJiZcbiAgICAgIG9wdGlvbnMubGVuZ3RoID09PSAxICYmXG4gICAgICAoZmllbGQudmFsdWUgPT0gbnVsbCB8fCBmaWVsZC52YWx1ZSA9PSB1bmRlZmluZWQgfHwgZmllbGQudmFsdWUgPT09ICcnKVxuICAgICkge1xuICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbiA9IG9wdGlvbnNbMF07XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBnZXRPcHRpb25WYWx1ZShkZWZhdWx0T3B0aW9uKTtcblxuICAgICAgaWYgKGlnbm9yZUF1dG9TZWxlY3RSZWYuY3VycmVudCAhPT0gZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGZpZWxkLm9uQ2hhbmdlKGRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbb3B0aW9uc10pO1xuXG4gIGNvbnN0IGF1dG9jb21wbGV0ZVZhbHVlID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgb3B0aW9ucy5maW5kKG9wdGlvbiA9PiBnZXRPcHRpb25WYWx1ZShvcHRpb24pID09PSBmaWVsZC52YWx1ZSkgPz8gbnVsbCxcbiAgICBbZmllbGQudmFsdWUsIG9wdGlvbnMsIGdldE9wdGlvblZhbHVlXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgey4uLnJlc3R9XG4gICAgICBmaWx0ZXJTZWxlY3RlZE9wdGlvbnM9e2ZhbHNlfVxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIHZhbHVlPXtcbiAgICAgICAgYXV0b2NvbXBsZXRlVmFsdWUgYXMgQXV0b2NvbXBsZXRlVmFsdWU8XG4gICAgICAgICAgVE9wdGlvbixcbiAgICAgICAgICBNdWx0aXBsZSxcbiAgICAgICAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgICAgICAgIEZyZWVTb2xvXG4gICAgICAgID5cbiAgICAgIH1cbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgb3B0aW9ucy5sZW5ndGggPT0gMH1cbiAgICAgIGdldE9wdGlvbkxhYmVsPXsoXG4gICAgICAgIG9wdGlvbjogVE9wdGlvbiB8IEF1dG9jb21wbGV0ZUZyZWVTb2xvVmFsdWVNYXBwaW5nPEZyZWVTb2xvPlxuICAgICAgKSA9PiBnZXRPcHRpb25MYWJlbChvcHRpb24pfVxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgcmVuZGVySW5wdXQ9e3BhcmFtcyA9PiAoXG4gICAgICAgIDxUZXh0RmllbGRcbiAgICAgICAgICB7Li4ucGFyYW1zfVxuICAgICAgICAgIHsuLi5yZXN0VGV4dFByb3BzfVxuICAgICAgICAgIGZ1bGxXaWR0aFxuICAgICAgICAgIHJlcXVpcmVkPXtyZXF1aXJlZH1cbiAgICAgICAgICBlcnJvcj17ISFlcnJvcn1cbiAgICAgICAgICBoZWxwZXJUZXh0PXtlcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnJ31cbiAgICAgICAgICBsYWJlbD17cmVzb2x2ZWRMYWJlbH1cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cmVzb2x2ZWRQbGFjZWhvbGRlcn1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgQXV0b2NvbXBsZXRlIGNvbXBvbmVudCBmb3Igc2VsZWN0aW5nIGZyb20gcHJlZGVmaW5lZCBvcHRpb25zLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZnVsbHkgaW50ZWdyYXRlZCBzZWxlY3QvYXV0b2NvbXBsZXRlIGlucHV0IHRoYXQgd29ya3Mgc2VhbWxlc3NseVxuICogd2l0aCByZWFjdC1ob29rLWZvcm0sIGluY2x1ZGluZyBhdXRvbWF0aWMgdmFsaWRhdGlvbiwgZXJyb3IgaGFuZGxpbmcsIGFuZCBvcHRpb25hbCBHcmlkIHdyYXBwZXJcbiAqIGZvciByZXNwb25zaXZlIGxheW91dHMuIEl0IHN1cHBvcnRzIGJvdGggc2luZ2xlIGFuZCBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZXMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIEF1dG9jb21wbGV0ZSB3aXRoIGZpbHRlcmluZ1xuICogLSBTaW5nbGUgYW5kIG11bHRpcGxlIHNlbGVjdGlvbiBzdXBwb3J0XG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5XG4gKiAtIEN1c3RvbWl6YWJsZSBvcHRpb24gZGlzcGxheSAobGFiZWxGaWVsZC92YWx1ZUZpZWxkKVxuICogLSBBdXRvLXNlbGVjdGlvbiB3aGVuIG9ubHkgb25lIG9wdGlvbiBleGlzdHNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJjYXRlZ29yeVwiXG4gKiAgIGxhYmVsPVwiQ2F0ZWdvcnlcIlxuICogICBvcHRpb25zPXtbXG4gKiAgICAgeyBMYWJlbDogJ1RlY2hub2xvZ3knLCBWYWx1ZTogJ3RlY2gnIH0sXG4gKiAgICAgeyBMYWJlbDogJ0ZpbmFuY2UnLCBWYWx1ZTogJ2ZpbmFuY2UnIH1cbiAqICAgXX1cbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdQbGVhc2Ugc2VsZWN0IGEgY2F0ZWdvcnknIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGtleXM6XG4gKiBgYGB0c3hcbiAqIDxTZWxlY3RFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ1c2VySWRcIlxuICogICBsYWJlbD1cIkFzc2lnbiB0byBVc2VyXCJcbiAqICAgb3B0aW9ucz17dXNlcnN9XG4gKiAgIGxhYmVsRmllbGQ9XCJmdWxsTmFtZVwiXG4gKiAgIHZhbHVlRmllbGQ9XCJpZFwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIGEgdXNlci4uLlwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIE11bHRpcGxlIHNlbGVjdGlvbjpcbiAqIGBgYHRzeFxuICogPFNlbGVjdEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInRhZ3NcIlxuICogICBsYWJlbD1cIlRhZ3NcIlxuICogICBvcHRpb25zPXthdmFpbGFibGVUYWdzfVxuICogICBtdWx0aXBsZVxuICogICBncmlkUHJvcHM9e3sgc2l6ZTogeyB4czogMTIsIG1kOiA4IH0gfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVE9wdGlvbiAtIFRoZSBvcHRpb24gb2JqZWN0IHR5cGVcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIE11bHRpcGxlIC0gV2hldGhlciBtdWx0aXBsZSBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICogQHRlbXBsYXRlIERpc2FibGVDbGVhcmFibGUgLSBXaGV0aGVyIHRoZSBjbGVhciBidXR0b24gaXMgZGlzYWJsZWRcbiAqIEB0ZW1wbGF0ZSBGcmVlU29sbyAtIFdoZXRoZXIgZnJlZSB0ZXh0IGlucHV0IGlzIGFsbG93ZWRcbiAqIEB0ZW1wbGF0ZSBDaGlwQ29tcG9uZW50IC0gVGhlIGNoaXAgY29tcG9uZW50IHR5cGUgZm9yIG11bHRpcGxlIHNlbGVjdGlvblxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbGVjdEVsZW1lbnQgPSA8XG4gIFRPcHRpb24gZXh0ZW5kcyBGbGV4aWJsZU9wdGlvbiA9IEZsZXhpYmxlT3B0aW9uLFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBGcmVlU29sbyBleHRlbmRzIGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcbiAgQ2hpcENvbXBvbmVudCBleHRlbmRzIFJlYWN0LkVsZW1lbnRUeXBlID0gQ2hpcFR5cGVNYXBbJ2RlZmF1bHRDb21wb25lbnQnXSxcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IFNlbGVjdEVsZW1lbnRQcm9wczxcbiAgVE9wdGlvbixcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgTXVsdGlwbGUsXG4gIERpc2FibGVDbGVhcmFibGUsXG4gIEZyZWVTb2xvLFxuICBDaGlwQ29tcG9uZW50XG4+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5TZWxlY3RFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdEVsZW1lbnQnO1xuIiwgImltcG9ydCBDaGVja0JveEljb24gZnJvbSAnQG11aS9pY29ucy1tYXRlcmlhbC9DaGVja0JveCc7XG5pbXBvcnQgQ2hlY2tCb3hPdXRsaW5lQmxhbmtJY29uIGZyb20gJ0BtdWkvaWNvbnMtbWF0ZXJpYWwvQ2hlY2tCb3hPdXRsaW5lQmxhbmsnO1xuaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIENoaXBUeXBlTWFwLFxuICBBdXRvY29tcGxldGVQcm9wcyxcbiAgVGV4dEZpZWxkVmFyaWFudHMsXG4gIEF1dG9jb21wbGV0ZUNoYW5nZVJlYXNvbixcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQge1xuICBHcmlkLFxuICBDaGVja2JveCxcbiAgVGV4dEZpZWxkLFxuICBBdXRvY29tcGxldGUsXG4gIENpcmN1bGFyUHJvZ3Jlc3MsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBTeW50aGV0aWNFdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEZyYWdtZW50LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDb250cm9sLCBGaWVsZFBhdGgsIEZpZWxkVmFsdWVzIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcbmltcG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgdHlwZSB7IEZsZXhpYmxlT3B0aW9uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG50eXBlIEJhc2VBdXRvY29tcGxldGVQcm9wczxcbiAgVE9wdGlvbixcbiAgTXVsdGlwbGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBEaXNhYmxlQ2xlYXJhYmxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgRnJlZVNvbG8gZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUsXG4+ID0gT21pdDxcbiAgQXV0b2NvbXBsZXRlUHJvcHM8XG4gICAgVE9wdGlvbixcbiAgICBNdWx0aXBsZSxcbiAgICBEaXNhYmxlQ2xlYXJhYmxlLFxuICAgIEZyZWVTb2xvLFxuICAgIENoaXBDb21wb25lbnRcbiAgPixcbiAgJ25hbWUnIHwgJ3JlbmRlcklucHV0JyB8ICdtdWx0aXBsZScgfCAnb25DaGFuZ2UnIHwgJ3ZhbHVlJ1xuPjtcblxuZXhwb3J0IHR5cGUgU2VsZWN0TXVsdGlFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIEZsZXhpYmxlT3B0aW9uID0gRmxleGlibGVPcHRpb24sXG4gIE11bHRpcGxlIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWUsXG4gIERpc2FibGVDbGVhcmFibGUgZXh0ZW5kcyBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG4gIEZyZWVTb2xvIGV4dGVuZHMgYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlLFxuICBDaGlwQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuRWxlbWVudFR5cGUgPSBDaGlwVHlwZU1hcFsnZGVmYXVsdENvbXBvbmVudCddLFxuPiA9IEJhc2VBdXRvY29tcGxldGVQcm9wczxcbiAgVE9wdGlvbixcbiAgTXVsdGlwbGUsXG4gIERpc2FibGVDbGVhcmFibGUsXG4gIEZyZWVTb2xvLFxuICBDaGlwQ29tcG9uZW50XG4+ICYge1xuICBuYW1lOiBUTmFtZTtcbiAgY29udHJvbD86IENvbnRyb2w8VEZpZWxkVmFsdWVzPjtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHZhcmlhbnQ/OiBUZXh0RmllbGRWYXJpYW50cztcbiAgbGFiZWxGaWVsZD86IGtleW9mIFRPcHRpb247XG4gIHZhbHVlRmllbGQ/OiBrZXlvZiBUT3B0aW9uO1xuICBvcHRpb25zPzogcmVhZG9ubHkgVE9wdGlvbltdIHwgbnVsbDtcbn07XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFNlbGVjdE11bHRpRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUT3B0aW9uIGV4dGVuZHMgRmxleGlibGVPcHRpb24gPSBGbGV4aWJsZU9wdGlvbixcbj4ocHJvcHM6IFNlbGVjdE11bHRpRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRPcHRpb24+KSB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgb25CbHVyLFxuICAgIGRpc2FibGVkLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNJbnB1dCxcbiAgICBsb2FkaW5nID0gZmFsc2UsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgbGFiZWwsXG4gICAgdmFyaWFudCxcbiAgICBsYWJlbEZpZWxkID0gJ0xhYmVsJyxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCBvcHRpb25zID0gdXNlTWVtbygoKSA9PiBvcHRpb25zSW5wdXQgfHwgW10sIFtvcHRpb25zSW5wdXRdKTtcblxuICBjb25zdCB7XG4gICAgZmllbGQsXG4gICAgZmllbGRTdGF0ZTogeyBlcnJvciB9LFxuICB9ID0gdXNlQ29udHJvbGxlcih7XG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICB9KTtcblxuICBjb25zdCBnZXRPcHRpb25WYWx1ZSA9IChvcHRpb246IFRPcHRpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW3ZhbHVlRmllbGRdIDogbnVsbDtcbiAgfTtcblxuICBjb25zdCBnZXRPcHRpb25MYWJlbCA9IChvcHRpb246IFRPcHRpb24pID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpIHJldHVybiBvcHRpb247XG5cbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW2xhYmVsRmllbGRdIDogJyc7XG4gIH07XG5cbiAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9XG4gICAgZmllbGQudmFsdWUgJiYgQXJyYXkuaXNBcnJheShmaWVsZC52YWx1ZSlcbiAgICAgID8gb3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IGZpZWxkLnZhbHVlLmluY2x1ZGVzKGdldE9wdGlvblZhbHVlKG9wdGlvbikpKVxuICAgICAgOiBbXTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgXzogU3ludGhldGljRXZlbnQsXG4gICAgc2VsZWN0ZWRPcHRpb25zOiBUT3B0aW9uW10sXG4gICAgcmVhc29uOiBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb25cbiAgKSA9PiB7XG4gICAgaWYgKHJlYXNvbiA9PT0gJ2NsZWFyJykge1xuICAgICAgZmllbGQub25DaGFuZ2UoW10pO1xuICAgIH0gZWxzZSBpZiAocmVhc29uID09PSAnc2VsZWN0T3B0aW9uJyB8fCByZWFzb24gPT09ICdyZW1vdmVPcHRpb24nKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZXMgPSBzZWxlY3RlZE9wdGlvbnMubWFwKG9wdGlvbiA9PiBnZXRPcHRpb25WYWx1ZShvcHRpb24pKTtcblxuICAgICAgZmllbGQub25DaGFuZ2UobmV3VmFsdWVzKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaWNvbiA9IDxDaGVja0JveE91dGxpbmVCbGFua0ljb24gZm9udFNpemU9XCJzbWFsbFwiIC8+O1xuICBjb25zdCBjaGVja2VkSWNvbiA9IDxDaGVja0JveEljb24gZm9udFNpemU9XCJzbWFsbFwiIC8+O1xuXG4gIHJldHVybiAoXG4gICAgPEF1dG9jb21wbGV0ZVxuICAgICAgbXVsdGlwbGVcbiAgICAgIHZhbHVlPXtzZWxlY3RlZFZhbHVlfVxuICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgIG9wdGlvbnM9e29wdGlvbnN9XG4gICAgICBnZXRPcHRpb25MYWJlbD17Z2V0T3B0aW9uTGFiZWx9XG4gICAgICBpc09wdGlvbkVxdWFsVG9WYWx1ZT17KG9wdGlvbiwgdmFsdWUpID0+XG4gICAgICAgIGdldE9wdGlvblZhbHVlKG9wdGlvbikgPT09IGdldE9wdGlvblZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgICAgZmlsdGVyU2VsZWN0ZWRPcHRpb25zXG4gICAgICBkaXNhYmxlQ2xvc2VPblNlbGVjdFxuICAgICAgcmVmPXtmaWVsZC5yZWZ9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgPz8gZmllbGQuZGlzYWJsZWQgPz8gb3B0aW9ucy5sZW5ndGggPT0gMH1cbiAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICBvbkJsdXI9e2V2ZW50ID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVuZGVyT3B0aW9uPXsocHJvcHMxLCBvcHRpb24sIHsgc2VsZWN0ZWQgfSkgPT4ge1xuICAgICAgICBjb25zdCB7IGtleSwgLi4ub3B0aW9uUHJvcHMgfSA9IHByb3BzMTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxsaSBrZXk9e2tleX0gey4uLm9wdGlvblByb3BzfT5cbiAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICBpY29uPXtpY29ufVxuICAgICAgICAgICAgICBjaGVja2VkSWNvbj17Y2hlY2tlZEljb259XG4gICAgICAgICAgICAgIGNoZWNrZWQ9e3NlbGVjdGVkfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHtnZXRPcHRpb25MYWJlbChvcHRpb24gYXMgVE9wdGlvbil9XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICAgIH19XG4gICAgICByZW5kZXJJbnB1dD17cGFyYW1zID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICBzbG90UHJvcHM9e3tcbiAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgIC4uLnBhcmFtcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQ6IChcbiAgICAgICAgICAgICAgICA8RnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgICAgICAgICAgPENpcmN1bGFyUHJvZ3Jlc3MgY29sb3I9XCJpbmhlcml0XCIgc2l6ZT17MjB9IC8+XG4gICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgIHtwYXJhbXMuSW5wdXRQcm9wcy5lbmRBZG9ybm1lbnR9XG4gICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgey4uLnJlc3R9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RNdWx0aUVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVE9wdGlvbiBleHRlbmRzIEZsZXhpYmxlT3B0aW9uID0gRmxleGlibGVPcHRpb24sXG4+KHtcbiAgZ3JpZFByb3BzID0ge30sXG4gIC4uLnByb3BzXG59OiBTZWxlY3RNdWx0aUVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzLFxuICBUTmFtZSxcbiAgVE9wdGlvblxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG4gICAgPC9HcmlkPlxuICApO1xufTtcblxuU2VsZWN0TXVsdGlFbGVtZW50LmRpc3BsYXlOYW1lID0gJ1NlbGVjdE11bHRpRWxlbWVudCc7XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUZXh0RmllbGQsIHVzZUZvcmtSZWYgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQsIFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBQYXRoVmFsdWUsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBGaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWQnO1xuaW1wb3J0IHsgdXNlRW5oYW5jZWRUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWQnO1xuaW1wb3J0IHsgdXNlRm9ybUkxOG4gfSBmcm9tICcuLi8uLi9pMThuJztcbmltcG9ydCB0eXBlIHsgRXZlbnRPclZhbHVlIH0gZnJvbSAnLi4vLi4vdHlwZXMvZXZlbnRzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFRleHRGaWVsZEVsZW1lbnQgY29tcG9uZW50LlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRleHRGaWVsZEVsZW1lbnRQcm9wczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+IHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiZmlyc3ROYW1lXCIgfCBcInVzZXIuZW1haWxcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGZpZWxkIGVycm9yIG9iamVjdFxuICAgKiBAcmV0dXJucyBDdXN0b20gZXJyb3IgbWVzc2FnZSBvciBjb21wb25lbnRcbiAgICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG4gIC8qKlxuICAgKiBDdXN0b20gVGV4dEZpZWxkIGNvbXBvbmVudCB0byB1c2UgaW5zdGVhZCBvZiBkZWZhdWx0IE1VSSBUZXh0RmllbGRcbiAgICovXG4gIGNvbXBvbmVudD86IHR5cGVvZiBUZXh0RmllbGQ7XG4gIC8qKlxuICAgKiBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgZm9yIGlucHV0L291dHB1dFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZmllbGRUeXBlIGZvciBjb21tb24gcGF0dGVybnMgb3IgY3VzdG9tIHRyYW5zZm9ybXMgZm9yIGNvbXBsZXggY2FzZXNcbiAgICovXG4gIHRyYW5zZm9ybT86IHtcbiAgICAvKiogVHJhbnNmb3JtIHZhbHVlIGJlZm9yZSBkaXNwbGF5aW5nIGluIGlucHV0ICovXG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlO1xuICAgIC8qKiBUcmFuc2Zvcm0gaW5wdXQgZXZlbnQgdG8gZm9ybSB2YWx1ZSAqL1xuICAgIG91dHB1dD86IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICB9O1xuICAvKipcbiAgICogQnVpbHQtaW4gZmllbGQgdHlwZSBmb3IgYXV0b21hdGljIHRyYW5zZm9ybWF0aW9uXG4gICAqIEBleGFtcGxlICd0ZXh0JyB8ICdudW1iZXInIHwgJ2RhdGUnIHwgJ3RpbWUnIHwgJ3NlbGVjdCdcbiAgICovXG4gIGZpZWxkVHlwZT86IEZpZWxkVHlwZTtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWUgdG8gZGlzcGxheSB3aGVuIGZpZWxkIHZhbHVlIGlzIG51bGwvdW5kZWZpbmVkXG4gICAqIEBleGFtcGxlIFwiXCJcbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IFRWYWx1ZTtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBsYWJlbCB0ZXh0ICh0YWtlcyBwcmVjZWRlbmNlIG92ZXIgbGFiZWxLZXkpXG4gICAqIEBleGFtcGxlIFwiRW1haWwgQWRkcmVzc1wiXG4gICAqL1xuICBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRyYW5zbGF0aW9uIGtleSBmb3IgdGhlIGxhYmVsLiBVc2VkIHdoZW4gSTE4blByb3ZpZGVyIGlzIGF2YWlsYWJsZS5cbiAgICogQGV4YW1wbGUgXCJNYXN0ZXIuQ291bnRyeS5Db3VudHJ5TmFtZS5MYWJlbFwiIG9yIFwiQ291bnRyeU5hbWUuTGFiZWxcIiB3aXRoIG5hbWVzcGFjZVxuICAgKi9cbiAgbGFiZWxLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgaW5wdXQgKHRha2VzIHByZWNlZGVuY2Ugb3ZlciBwbGFjZWhvbGRlcktleSlcbiAgICogQGV4YW1wbGUgXCJFbnRlciB5b3VyIGVtYWlsXCJcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogVHJhbnNsYXRpb24ga2V5IGZvciB0aGUgcGxhY2Vob2xkZXIuIFVzZWQgd2hlbiBJMThuUHJvdmlkZXIgaXMgYXZhaWxhYmxlLlxuICAgKiBAZXhhbXBsZSBcIk1hc3Rlci5Db3VudHJ5LkNvdW50cnlOYW1lLlBsYWNlaG9sZGVyXCIgb3IgXCJDb3VudHJ5TmFtZS5QbGFjZWhvbGRlclwiIHdpdGggbmFtZXNwYWNlXG4gICAqL1xuICBwbGFjZWhvbGRlcktleT86IHN0cmluZztcbiAgLyoqXG4gICAqIE5hbWVzcGFjZSB0byBwcmVmaXggdHJhbnNsYXRpb24ga2V5cy4gQWxsb3dzIHNob3J0ZXIga2V5cyBpbiBjb21wb25lbnRzLlxuICAgKiBAZXhhbXBsZSBcIk1hc3Rlci5Db3VudHJ5XCIgLSB0aGVuIGxhYmVsS2V5PVwiQ291bnRyeU5hbWUuTGFiZWxcIiBiZWNvbWVzIFwiTWFzdGVyLkNvdW50cnkuQ291bnRyeU5hbWUuTGFiZWxcIlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgdGhlIHVuZGVybHlpbmcgVGV4dEZpZWxkIGNvbXBvbmVudFxuICAgKi9cbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZSc+O1xuICAvKipcbiAgICogR3JpZCBsYXlvdXQgcHJvcHMgZm9yIHRoZSB3cmFwcGVyIEdyaWQgY29tcG9uZW50XG4gICAqIEBkZWZhdWx0VmFsdWUgeyBzaXplOiB7IHhzOiAxMiwgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0gfVxuICAgKi9cbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICAvKipcbiAgICogVGhlIFRleHRGaWVsZCB2YXJpYW50XG4gICAqIEBkZWZhdWx0VmFsdWUgXCJvdXRsaW5lZFwiXG4gICAqL1xuICB2YXJpYW50PzogVGV4dEZpZWxkVmFyaWFudHM7XG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGZvciB0aGUgVGV4dEZpZWxkXG4gICAqL1xuICAvKipcbiAgICogQ3VzdG9tIG9uQ2hhbmdlIGhhbmRsZXIgY2FsbGVkIGFmdGVyIHRyYW5zZm9ybWF0aW9uXG4gICAqL1xuICBvbkNoYW5nZT86IChcbiAgICBldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZSBkZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nIHRyYW5zZm9ybWF0aW9uIGlzc3Vlc1xuICAgKiBAZGVmYXVsdFZhbHVlIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnXG4gICAqL1xuICBlbmFibGVXYXJuaW5ncz86IGJvb2xlYW47XG59XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIFRleHRGaWVsZEVsZW1lbnQ8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPihwcm9wczogVGV4dEZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3Qge1xuICAgIHBhcnNlRXJyb3IsXG4gICAgbmFtZSxcbiAgICBjb250cm9sLFxuICAgIGNvbXBvbmVudDogVGV4dEZpZWxkQ29tcG9uZW50ID0gVGV4dEZpZWxkLFxuICAgIHRyYW5zZm9ybSxcbiAgICBmaWVsZFR5cGUgPSAndGV4dCcsIC8vIERlZmF1bHQgdG8gdGV4dCB0eXBlXG4gICAgZGVmYXVsdFZhbHVlLFxuICAgIGxhYmVsLFxuICAgIGxhYmVsS2V5LFxuICAgIHBsYWNlaG9sZGVyLFxuICAgIHBsYWNlaG9sZGVyS2V5LFxuICAgIG5hbWVzcGFjZSxcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIGVuYWJsZVdhcm5pbmdzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgLy8gR2V0IHRyYW5zbGF0aW9uIGZ1bmN0aW9uIGFuZCBuYW1lc3BhY2UgZnJvbSBjb250ZXh0XG4gIGNvbnN0IHsgcmVzb2x2ZUxhYmVsIH0gPSB1c2VGb3JtSTE4bigpO1xuXG4gIC8vIFJlc29sdmUgbGFiZWwgYW5kIHBsYWNlaG9sZGVyIGZyb20ga2V5cyBvciBkaXJlY3QgdmFsdWVzIChuYW1lc3BhY2UgZnJvbSBjb250ZXh0IGlmIG5vdCBzcGVjaWZpZWQpXG4gIGNvbnN0IHJlc29sdmVkTGFiZWwgPSByZXNvbHZlTGFiZWwobGFiZWwsIGxhYmVsS2V5LCBuYW1lc3BhY2UpO1xuICBjb25zdCByZXNvbHZlZFBsYWNlaG9sZGVyID0gcmVzb2x2ZUxhYmVsKHBsYWNlaG9sZGVyLCBwbGFjZWhvbGRlcktleSwgbmFtZXNwYWNlKTtcblxuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICByZXF1aXJlZCxcbiAgICBoZWxwZXJUZXh0LFxuICAgIGlucHV0UmVmLFxuICAgIG9uSW5wdXQsXG4gICAgb25CbHVyLFxuICAgIGRpc2FibGVkLFxuICAgIC4uLnJlc3RUZXh0UHJvcHNcbiAgfSA9IHRleHRGaWVsZFByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIC8vIFVzZSB0aGUgZW5oYW5jZWQgdHJhbnNmb3JtIGhvb2sgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VFbmhhbmNlZFRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KFxuICAgIHtcbiAgICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaW5wdXQ6IHRyYW5zZm9ybS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogdHJhbnNmb3JtLm91dHB1dCxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZmllbGRUeXBlOiAhdHJhbnNmb3JtXG4gICAgICAgID8gdHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/ICdudW1iZXInXG4gICAgICAgICAgOiBmaWVsZFR5cGVcbiAgICAgICAgOiB1bmRlZmluZWQsIC8vIEF1dG8tZGV0ZWN0IG51bWJlciB0eXBlXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICBlbmFibGVXYXJuaW5ncyxcbiAgICB9XG4gICk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRleHRGaWVsZENvbXBvbmVudFxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgIG5hbWU9e2ZpZWxkLm5hbWV9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBvbkNoYW5nZT17ZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcblxuICAgICAgICBpZiAoaW5wdXQgPT09ICcnKSB7XG4gICAgICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21PbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGN1c3RvbU9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9fVxuICAgICAgb25CbHVyPXtldmVudCA9PiB7XG4gICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQmx1ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uQmx1cihldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbklucHV0PXsoZXZlbnQ6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygb25JbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uSW5wdXQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgbGFiZWw9e3Jlc29sdmVkTGFiZWx9XG4gICAgICBwbGFjZWhvbGRlcj17cmVzb2x2ZWRQbGFjZWhvbGRlcn1cbiAgICAgIGZ1bGxXaWR0aFxuICAgICAgcmVxdWlyZWQ9e3JlcXVpcmVkfVxuICAgICAgdHlwZT17dHlwZX1cbiAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgaGVscGVyVGV4dD17XG4gICAgICAgIGVycm9yID8gKHBhcnNlRXJyb3IgPyBwYXJzZUVycm9yKGVycm9yKSA6IGVycm9yLm1lc3NhZ2UpIDogaGVscGVyVGV4dFxuICAgICAgfVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgdmFyaWFudD17dmFyaWFudCA/IHZhcmlhbnQgOiAnb3V0bGluZWQnfVxuICAgIC8+XG4gICk7XG59O1xuXG4vKipcbiAqIEEgcmVhY3QtaG9vay1mb3JtIGludGVncmF0ZWQgVGV4dEZpZWxkIGNvbXBvbmVudCB3aXRoIGF1dG9tYXRpYyB2YWxpZGF0aW9uLFxuICogcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucywgYW5kIGJ1aWx0LWluIGZpZWxkIHR5cGUgaGFuZGxpbmcuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEZ1bGwgcmVhY3QtaG9vay1mb3JtIGludGVncmF0aW9uXG4gKiAtIEF1dG9tYXRpYyBlcnJvciBkaXNwbGF5IHdpdGggY3VzdG9tIHBhcnNpbmdcbiAqIC0gVmFsdWUgdHJhbnNmb3JtYXRpb24gc3VwcG9ydFxuICogLSBCdWlsdC1pbiBmaWVsZCB0eXBlcyBmb3IgY29tbW9uIHBhdHRlcm5zXG4gKiAtIEdyaWQgbGF5b3V0IHdyYXBwZXJcbiAqIC0gVHlwZVNjcmlwdCB0eXBlIHNhZmV0eVxuICogLSBPcHRpbWl6ZWQgbnVtYmVyIGlucHV0IGhhbmRsaW5nXG4gKiAtIERpc2FibGVkIHN0YXRlIHN0eWxpbmdcbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyB3aXRoIG1lbW9pemVkIHRyYW5zZm9ybWF0aW9uc1xuICogLSBEZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nXG4gKiAtIFN0YWJsZSByZWZlcmVuY2VzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZSB3aXRoIGJ1aWx0LWluIG51bWJlciBoYW5kbGluZzpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImFnZVwiXG4gKiAgIGxhYmVsPVwiQWdlXCJcbiAqICAgZmllbGRUeXBlPVwibnVtYmVyXCJcbiAqICAgcnVsZXM9e3sgcmVxdWlyZWQ6ICdBZ2UgaXMgcmVxdWlyZWQnLCBtaW46IHsgdmFsdWU6IDAsIG1lc3NhZ2U6ICdBZ2UgbXVzdCBiZSBwb3NpdGl2ZScgfSB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBBZHZhbmNlZCB1c2FnZSB3aXRoIGN1c3RvbSBncmlkIGxheW91dDpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cImVtYWlsXCJcbiAqICAgbGFiZWw9XCJFbWFpbFwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgZW1haWwgYWRkcmVzc1wiXG4gKiAgIGdyaWRQcm9wcz17eyBzaXplOiB7IHhzOiAxMiwgbWQ6IDYgfSB9fVxuICogICBydWxlcz17e1xuICogICAgIHJlcXVpcmVkOiAnRW1haWwgaXMgcmVxdWlyZWQnLFxuICogICAgIHBhdHRlcm46IHsgdmFsdWU6IC9cXFMrQFxcUytcXC5cXFMrLywgbWVzc2FnZTogJ0ludmFsaWQgZW1haWwnIH1cbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIHRyYW5zZm9ybWF0aW9uOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwicHJpY2VcIlxuICogICBsYWJlbD1cIlByaWNlXCJcbiAqICAgdHJhbnNmb3JtPXt7XG4gKiAgICAgaW5wdXQ6ICh2YWx1ZSkgPT4gdmFsdWUgPyBgJCR7dmFsdWV9YCA6ICcnLFxuICogICAgIG91dHB1dDogKGV2ZW50KSA9PiBwYXJzZUZsb2F0KGV2ZW50LnRhcmdldC52YWx1ZS5yZXBsYWNlKCckJywgJycpKSB8fCBudWxsXG4gKiAgIH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggY3VzdG9tIGVycm9yIHBhcnNpbmc6XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJ1c2VybmFtZVwiXG4gKiAgIGxhYmVsPVwiVXNlcm5hbWVcIlxuICogICBmaWVsZFR5cGU9XCJ0ZXh0XCJcbiAqICAgcGFyc2VFcnJvcj17KGVycm9yKSA9PiAoXG4gKiAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICdyZWQnIH19PlxuICogICAgICAgXHUyNkEwXHVGRTBGIHtlcnJvci5tZXNzYWdlfVxuICogICAgIDwvc3Bhbj5cbiAqICAgKX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMgUmVhY3QgZWxlbWVudCB3aXRoIG9wdGlvbmFsIEdyaWQgd3JhcHBlclxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFRleHRGaWVsZEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogVGV4dEZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCB1c2VGb3JrUmVmIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgdHlwZSB7XG4gIFBpY2tlclZhbGlkRGF0ZSxcbiAgVGltZVBpY2tlclByb3BzLFxuICBUaW1lUGlja2VyU2xvdFByb3BzLFxuICBUaW1lVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzJztcbmltcG9ydCB7IFRpbWVQaWNrZXIgfSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzJztcbmltcG9ydCB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tICdAbXVpL3gtZGF0ZS1waWNrZXJzL2ludGVybmFscyc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29udHJvbCxcbiAgRmllbGRQYXRoLFxuICBQYXRoVmFsdWUsXG4gIEZpZWxkRXJyb3IsXG4gIEZpZWxkVmFsdWVzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IHVzZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRyYW5zZm9ybSc7XG5pbXBvcnQgeyB1c2VGb3JtSTE4biB9IGZyb20gJy4uLy4uL2kxOG4nO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcy9ldmVudHMnO1xuaW1wb3J0IHsgcmVhZFZhbHVlQXNEYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVhZFZhbHVlQXNEYXRlJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lUGlja2VyRWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSBleHRlbmRzIFBpY2tlclZhbGlkRGF0ZSA9IFBpY2tlclZhbGlkRGF0ZSxcbiAgVEVuYWJsZUFjY2Vzc2libGVGaWVsZERPTVN0cnVjdHVyZSBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4ge1xuICBuYW1lOiBUTmFtZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBpc0RhdGU/OiBib29sZWFuO1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yIHwgVGltZVZhbGlkYXRpb25FcnJvcikgPT4gUmVhY3ROb2RlO1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICBpbnB1dFByb3BzPzogT21pdDxUZXh0RmllbGRQcm9wcywgJ25hbWUnPjtcbiAgaGVscGVyVGV4dD86IFRleHRGaWVsZFByb3BzWydoZWxwZXJUZXh0J107XG4gIGxhYmVsPzogUmVhY3ROb2RlO1xuICBsYWJlbEtleT86IHN0cmluZztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIHBsYWNlaG9sZGVyS2V5Pzogc3RyaW5nO1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIHRleHRSZWFkT25seT86IGJvb2xlYW47XG4gIHNsb3RQcm9wcz86IE9taXQ8XG4gICAgVGltZVBpY2tlclNsb3RQcm9wczxURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlPixcbiAgICAndGV4dEZpZWxkJ1xuICA+O1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgaW5wdXQ/OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4gVFZhbHVlIHwgbnVsbDtcbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudE9yVmFsdWU6IEV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgZ3JpZFByb3BzPzogR3JpZFByb3BzO1xuICB0aW1lUGlja2VyUHJvcHM/OiBPbWl0PFxuICAgIFRpbWVQaWNrZXJQcm9wczxURW5hYmxlQWNjZXNzaWJsZUZpZWxkRE9NU3RydWN0dXJlPixcbiAgICAndmFsdWUnIHwgJ3Nsb3RQcm9wcydcbiAgPjtcbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xufVxuXG5jb25zdCBDb21wb25lbnQgPSBmdW5jdGlvbiBUaW1lUGlja2VyRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgZXh0ZW5kcyBQaWNrZXJWYWxpZERhdGUgPSBQaWNrZXJWYWxpZERhdGUsXG4+KHByb3BzOiBUaW1lUGlja2VyRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgcmVxdWlyZWQsXG4gICAgaW5wdXRQcm9wcyxcbiAgICBjb250cm9sLFxuICAgIHRleHRSZWFkT25seSxcbiAgICBsYWJlbCxcbiAgICBsYWJlbEtleSxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBwbGFjZWhvbGRlcktleSxcbiAgICBuYW1lc3BhY2UsXG4gICAgc2xvdFByb3BzLFxuICAgIHRpbWVQaWNrZXJQcm9wcyA9IHt9LFxuICAgIHRyYW5zZm9ybSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wcztcblxuICBjb25zdCBhZGFwdGVyID0gdXNlTG9jYWxpemF0aW9uQ29udGV4dCgpO1xuXG4gIC8vIGkxOG4gaG9vayBmb3IgcmVzb2x2aW5nIHRyYW5zbGF0aW9uIGtleXMgKG5hbWVzcGFjZSBmcm9tIGNvbnRleHQgaWYgbm90IHNwZWNpZmllZClcbiAgY29uc3QgeyByZXNvbHZlTGFiZWwgfSA9IHVzZUZvcm1JMThuKCk7XG4gIGNvbnN0IHJlc29sdmVkTGFiZWwgPSByZXNvbHZlTGFiZWwobGFiZWwgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLCBsYWJlbEtleSwgbmFtZXNwYWNlKTtcbiAgY29uc3QgcmVzb2x2ZWRQbGFjZWhvbGRlciA9IHJlc29sdmVMYWJlbChwbGFjZWhvbGRlciwgcGxhY2Vob2xkZXJLZXksIG5hbWVzcGFjZSk7XG5cblxuICBjb25zdCB7IGRpc2FibGVkLCBpbnB1dFJlZiwgb25DbG9zZSwgLi4ucmVzdFRpbWVQaWNrZXJQcm9wcyB9ID1cbiAgICB0aW1lUGlja2VyUHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuICB9KTtcblxuICBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZSB8IG51bGw+KHtcbiAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICAgIHRyYW5zZm9ybToge1xuICAgICAgaW5wdXQ6XG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0/LmlucHV0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyB0cmFuc2Zvcm0uaW5wdXRcbiAgICAgICAgICA6IG5ld1ZhbHVlID0+IHJlYWRWYWx1ZUFzRGF0ZShhZGFwdGVyLCBuZXdWYWx1ZSksXG4gICAgICBvdXRwdXQ6IChldmVudE9yVmFsdWUsIHZhbHVlKSA9PiB7XG4gICAgICAgIC8vIE1VSSBEYXRlUGlja2VyIHBhc3NlcyAodmFsdWUsIGNvbnRleHQpLCBzbyB3ZSBjaGVjayB0aGUgc2Vjb25kIHBhcmFtXG4gICAgICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogZXZlbnRPclZhbHVlO1xuXG4gICAgICAgIGlmIChhY3R1YWxWYWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuXG4gICAgICAgIHJldHVybiBhY3R1YWxWYWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0UmVmID0gdXNlRm9ya1JlZihmaWVsZC5yZWYsIGlucHV0UmVmKTtcblxuICByZXR1cm4gKFxuICAgIDxUaW1lUGlja2VyXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHsuLi5yZXN0VGltZVBpY2tlclByb3BzfVxuICAgICAgey4uLmZpZWxkfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgbGFiZWw9e3Jlc29sdmVkTGFiZWx9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICB7Li4udGltZVBpY2tlclByb3BzfVxuICAgICAgaW5wdXRSZWY9e2hhbmRsZUlucHV0UmVmfVxuICAgICAgb25DbG9zZT17KC4uLmFyZ3MpID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgICAgb25DbG9zZSguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uQ2hhbmdlPXsobmV3VmFsdWUsIGNvbnRleHQpID0+IHtcbiAgICAgICAgb25DaGFuZ2UobmV3VmFsdWUsIGNvbnRleHQpO1xuICAgICAgICBpZiAodHlwZW9mIHRpbWVQaWNrZXJQcm9wcy5vbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRpbWVQaWNrZXJQcm9wcy5vbkNoYW5nZShuZXdWYWx1ZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBzbG90UHJvcHM9e3tcbiAgICAgICAgLi4uc2xvdFByb3BzLFxuICAgICAgICBhY3Rpb25CYXI6IHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ2NsZWFyJywgJ2NhbmNlbCcsICdhY2NlcHQnXSxcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dEZpZWxkOiB7XG4gICAgICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgICAgICByZXF1aXJlZCxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogcmVzb2x2ZWRQbGFjZWhvbGRlcixcbiAgICAgICAgICBmdWxsV2lkdGg6IHRydWUsXG4gICAgICAgICAgb25CbHVyOiAoXG4gICAgICAgICAgICBldmVudDogUmVhY3QuRm9jdXNFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD5cbiAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIGZpZWxkLm9uQmx1cigpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFByb3BzPy5vbkJsdXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgaW5wdXRQcm9wcy5vbkJsdXIoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICEhZXJyb3IsXG4gICAgICAgICAgaGVscGVyVGV4dDogZXJyb3JcbiAgICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgOiBpbnB1dFByb3BzPy5oZWxwZXJUZXh0IHx8IHJlc3QuaGVscGVyVGV4dCxcbiAgICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICByZWFkT25seTogISF0ZXh0UmVhZE9ubHksXG4gICAgICAgICAgICAuLi5pbnB1dFByb3BzPy5pbnB1dFByb3BzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgVGltZVBpY2tlckVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlID0gUGlja2VyVmFsaWREYXRlLFxuPih7XG4gIGdyaWRQcm9wcyA9IHt9LFxuICAuLi5wcm9wc1xufTogVGltZVBpY2tlckVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5UaW1lUGlja2VyRWxlbWVudC5kaXNwbGF5TmFtZSA9ICdUaW1lUGlja2VyRWxlbWVudCc7XG4iLCAiaW1wb3J0IHR5cGUgeyBCb3hQcm9wcywgRm9ybUhlbHBlclRleHRQcm9wcywgR3JpZFByb3BzIH0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBCb3gsIEdyaWQsIGlucHV0QmFzZUNsYXNzZXMgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB7XG4gIE11aU90cElucHV0LFxuICB0eXBlIE11aU90cElucHV0UHJvcHMsXG59IGZyb20gJ211aS1vbmUtdGltZS1wYXNzd29yZC1pbnB1dCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuaW1wb3J0IHsgQ29udHJvbGxlciB9IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5cbmltcG9ydCB7IEhlbHBlclRleHQgfSBmcm9tICcuL0hlbHBlclRleHQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9UUElucHV0RWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+IHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIGluIHRoZSBmb3JtXG4gICAqIEBleGFtcGxlIFwiZmlyc3ROYW1lXCIgfCBcInVzZXIuZW1haWxcIlxuICAgKi9cbiAgbmFtZTogVE5hbWU7XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgbWVzc2FnZSBwYXJzZXJcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGZpZWxkIGVycm9yIG9iamVjdFxuICAgKiBAcmV0dXJucyBDdXN0b20gZXJyb3IgbWVzc2FnZSBvciBjb21wb25lbnRcbiAgICovXG4gIHBhcnNlRXJyb3I/OiAoZXJyb3I6IEZpZWxkRXJyb3IpID0+IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFRoZSBmb3JtIGNvbnRyb2wgaW5zdGFuY2UgZnJvbSByZWFjdC1ob29rLWZvcm1cbiAgICovXG4gIGNvbnRyb2w/OiBDb250cm9sPFRGaWVsZFZhbHVlcz47XG5cbiAgbWF4U2l6ZT86IG51bWJlcjtcblxuICBwbGFjZWhvbGRlcj86IHN0cmluZztcblxuICBoZWxwZXJUZXh0PzogUmVhY3QuUmVhY3ROb2RlO1xuXG4gIHNsb3RQcm9wcz86IHtcbiAgICB3cmFwcGVyPzogQm94UHJvcHM7XG4gICAgaGVscGVyVGV4dD86IEZvcm1IZWxwZXJUZXh0UHJvcHM7XG4gICAgdGV4dGZpZWxkPzogTXVpT3RwSW5wdXRQcm9wc1snVGV4dEZpZWxkc1Byb3BzJ107XG4gIH07XG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbn1cblxuY29uc3QgQ29tcG9uZW50ID0gZnVuY3Rpb24gT1RQSW5wdXRFbGVtZW50PFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHByb3BzOiBPVFBJbnB1dEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikge1xuICBjb25zdCB7XG4gICAgLy8gcGFyc2VFcnJvcixcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gICAgc2xvdFByb3BzLFxuICAgIGhlbHBlclRleHQsXG4gICAgbWF4U2l6ZSA9IDU2LFxuICAgIHBsYWNlaG9sZGVyID0gJy0nLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3BzO1xuXG4gIC8vIGNvbnN0IHtcbiAgLy8gICBmaWVsZCxcbiAgLy8gICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIC8vIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgLy8gICBuYW1lLFxuICAvLyAgIGNvbnRyb2wsXG4gIC8vIH0pO1xuXG4gIHJldHVybiAoXG4gICAgPENvbnRyb2xsZXJcbiAgICAgIG5hbWU9e25hbWV9XG4gICAgICBjb250cm9sPXtjb250cm9sfVxuICAgICAgcmVuZGVyPXsoeyBmaWVsZCwgZmllbGRTdGF0ZTogeyBlcnJvciB9IH0pID0+IChcbiAgICAgICAgPEJveFxuICAgICAgICAgIHsuLi5zbG90UHJvcHM/LndyYXBwZXJ9XG4gICAgICAgICAgc3g9e1tcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICAgIFtgJiAuJHtpbnB1dEJhc2VDbGFzc2VzLmlucHV0fWBdOiB7XG4gICAgICAgICAgICAgICAgcDogMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBhc3BlY3RSYXRpbzogJzEvMScsXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6IG1heFNpemUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoc2xvdFByb3BzPy53cmFwcGVyPy5zeClcbiAgICAgICAgICAgICAgPyAoc2xvdFByb3BzPy53cmFwcGVyPy5zeCA/PyBbXSlcbiAgICAgICAgICAgICAgOiBbc2xvdFByb3BzPy53cmFwcGVyPy5zeF0pLFxuICAgICAgICAgIF19XG4gICAgICAgID5cbiAgICAgICAgICA8TXVpT3RwSW5wdXRcbiAgICAgICAgICAgIHsuLi5maWVsZH1cbiAgICAgICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICAgICAgZ2FwPXsxLjV9XG4gICAgICAgICAgICBsZW5ndGg9ezR9XG4gICAgICAgICAgICBUZXh0RmllbGRzUHJvcHM9e3tcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgIGVycm9yOiAhIWVycm9yLFxuICAgICAgICAgICAgICAuLi5zbG90UHJvcHM/LnRleHRmaWVsZCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPEhlbHBlclRleHRcbiAgICAgICAgICAgIHsuLi5zbG90UHJvcHM/LmhlbHBlclRleHR9XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U9e2Vycm9yPy5tZXNzYWdlfVxuICAgICAgICAgICAgaGVscGVyVGV4dD17aGVscGVyVGV4dH1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0JveD5cbiAgICAgICl9XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBPVFBJbnB1dEVsZW1lbnQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IE9UUElucHV0RWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KTogUmVhY3RFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICA8R3JpZCBzaXplPXsxMn0gey4uLmdyaWRQcm9wc30+XG4gICAgICA8Q29tcG9uZW50IHsuLi5wcm9wc30gLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuIiwgImltcG9ydCB0eXBlIHsgRm9ybUhlbHBlclRleHRQcm9wcyB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvRm9ybUhlbHBlclRleHQnO1xuaW1wb3J0IEZvcm1IZWxwZXJUZXh0IGZyb20gJ0BtdWkvbWF0ZXJpYWwvRm9ybUhlbHBlclRleHQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIEhlbHBlclRleHRQcm9wcyA9IEZvcm1IZWxwZXJUZXh0UHJvcHMgJiB7XG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgZGlzYWJsZUd1dHRlcnM/OiBib29sZWFuO1xuICBoZWxwZXJUZXh0PzogUmVhY3QuUmVhY3ROb2RlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIEhlbHBlclRleHQoe1xuICBzeCxcbiAgaGVscGVyVGV4dCxcbiAgZXJyb3JNZXNzYWdlLFxuICBkaXNhYmxlR3V0dGVycyxcbiAgLi4ub3RoZXJcbn06IEhlbHBlclRleHRQcm9wcykge1xuICBpZiAoZXJyb3JNZXNzYWdlIHx8IGhlbHBlclRleHQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEZvcm1IZWxwZXJUZXh0XG4gICAgICAgIGVycm9yPXshIWVycm9yTWVzc2FnZX1cbiAgICAgICAgc3g9e1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICBteDogZGlzYWJsZUd1dHRlcnMgPyAwIDogMS43NSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KHN4KSA/IHN4IDogW3N4XSksXG4gICAgICAgIF19XG4gICAgICAgIHsuLi5vdGhlcn1cbiAgICAgID5cbiAgICAgICAge2Vycm9yTWVzc2FnZSB8fCBoZWxwZXJUZXh0fVxuICAgICAgPC9Gb3JtSGVscGVyVGV4dD5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCAiaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlLFxuICBDaXJjdWxhclByb2dyZXNzLFxuICBHcmlkLFxuICBUZXh0RmllbGQsXG59IGZyb20gJ0BtdWkvbWF0ZXJpYWwnO1xuaW1wb3J0IHR5cGUgeyBBdXRvY29tcGxldGVDaGFuZ2VSZWFzb24gfSBmcm9tICdAbXVpL21hdGVyaWFsL0F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwvdXRpbHMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgRnJhZ21lbnQsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7XG4gIHVzZUNvbnRyb2xsZXIsXG4gIHR5cGUgRmllbGRQYXRoLFxuICB0eXBlIEZpZWxkVmFsdWVzLFxufSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jU2VsZWN0UGF5bG9hZCB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuaW1wb3J0IHR5cGUgeyBBc3luY1NlbGVjdEVsZW1lbnRQcm9wcywgT3B0aW9uT2JqZWN0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIEFzeW5jU2VsZWN0RWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWVLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnVmFsdWUnLFxuICBUTGFiZWxLZXkgZXh0ZW5kcyBzdHJpbmcgPSAnTGFiZWwnLFxuICBUT3B0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0PFRWYWx1ZUtleSwgVExhYmVsS2V5PiA9IE9wdGlvbk9iamVjdDxcbiAgICBUVmFsdWVLZXksXG4gICAgVExhYmVsS2V5XG4gID4sXG4+KFxuICBwcm9wczogQXN5bmNTZWxlY3RFbGVtZW50UHJvcHM8XG4gICAgVEZpZWxkVmFsdWVzLFxuICAgIFROYW1lLFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXksXG4gICAgVE9wdGlvblxuICA+XG4pIHtcbiAgY29uc3Qge1xuICAgIG5hbWUsXG4gICAgZGlzYWJsZWQsXG4gICAgY29udHJvbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICBpbml0aWFsVmFsdWUsXG4gICAgbGFiZWwsXG4gICAgcXVlcnlGbixcbiAgICB2YXJpYW50LFxuICAgIGxhYmVsRmllbGQgPSAnTGFiZWwnIGFzIFRMYWJlbEtleSxcbiAgICB2YWx1ZUZpZWxkID0gJ1ZhbHVlJyBhcyBUVmFsdWVLZXksXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIGZpZWxkLFxuICAgIGZpZWxkU3RhdGU6IHsgZXJyb3IgfSxcbiAgfSA9IHVzZUNvbnRyb2xsZXIoe1xuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgfSk7XG5cbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbc2VsZWN0ZWRPcHRpb24sIHNldFNlbGVjdGVkT3B0aW9uXSA9IHVzZVN0YXRlPFRPcHRpb24gfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2lucHV0VmFsdWUsIHNldElucHV0VmFsdWVdID0gdXNlU3RhdGUoJycpO1xuICBjb25zdCBpbnB1dFZhbHVlMjogc3RyaW5nID0gdXNlTWVtbygoKSA9PiBpbnB1dFZhbHVlLCBbaW5wdXRWYWx1ZV0pO1xuICBjb25zdCBzZXRJbnB1dFZhbHVlMiA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXdWYWx1ZTogc3RyaW5nKSA9PiBzZXRJbnB1dFZhbHVlKG5ld1ZhbHVlKSxcbiAgICBbXVxuICApO1xuICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZTxyZWFkb25seSBUT3B0aW9uW10+KFtdKTtcblxuICBjb25zdCBpbml0aWFsVmFsdWVMb2FkZWQgPSB1c2VSZWY8Ym9vbGVhbj4oXG4gICAgIWluaXRpYWxWYWx1ZSA/IHRydWUgOiAhKGluaXRpYWxWYWx1ZSAhPSBudWxsKVxuICApO1xuXG4gIGNvbnN0IGZpZWxkVmFsdWUgPSB1c2VSZWY8VE9wdGlvbltUVmFsdWVLZXldIHwgbnVsbD4oZmllbGQudmFsdWUpO1xuXG4gIGNvbnN0IGZldGNoRGF0YSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGRlYm91bmNlKFxuICAgICAgICAoXG4gICAgICAgICAgcGF5bG9hZDogQXN5bmNTZWxlY3RQYXlsb2FkLFxuICAgICAgICAgIGNhbGxiYWNrOiAocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4gdm9pZFxuICAgICAgICApID0+IHtcbiAgICAgICAgICBxdWVyeUZuKHBheWxvYWQpLnRoZW4oYyA9PiBjYWxsYmFjayhjKSk7XG4gICAgICAgIH0sXG4gICAgICAgIDQwMFxuICAgICAgKSxcbiAgICBbcXVlcnlGbl1cbiAgKTtcblxuICBjb25zdCBmaWxsT3B0aW9ucyA9IHVzZUNhbGxiYWNrKFxuICAgIChyZXN1bHRzPzogcmVhZG9ubHkgVE9wdGlvbltdKSA9PiB7XG4gICAgICBsZXQgbmV3T3B0aW9uczogcmVhZG9ubHkgVE9wdGlvbltdID0gW107XG5cbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICBuZXdPcHRpb25zID0gW3NlbGVjdGVkT3B0aW9uXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdHMpIHtcbiAgICAgICAgbmV3T3B0aW9ucyA9IFsuLi5uZXdPcHRpb25zLCAuLi5yZXN1bHRzXTtcbiAgICAgIH1cblxuICAgICAgc2V0T3B0aW9ucyhuZXdPcHRpb25zKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIH0sXG4gICAgW3NlbGVjdGVkT3B0aW9uXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluaXRpYWxWYWx1ZUxvYWRlZC5jdXJyZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgbGV0IGFjdGl2ZSA9IHRydWU7XG5cbiAgICBjb25zdCBwYXlsb2FkOiBBc3luY1NlbGVjdFBheWxvYWQgPSB7XG4gICAgICBxdWVyeTogbnVsbCxcbiAgICAgIGluaXRpYWxWYWx1ZSxcbiAgICB9O1xuXG4gICAgc2V0TG9hZGluZyh0cnVlKTtcblxuICAgIGZldGNoRGF0YShwYXlsb2FkLCAocmVzdWx0cz86IHJlYWRvbmx5IFRPcHRpb25bXSkgPT4ge1xuICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICBpZiAoISFyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZpbGxPcHRpb25zKHJlc3VsdHM/LmZpbHRlcihjID0+IGNbdmFsdWVGaWVsZF0gPT0gaW5pdGlhbFZhbHVlKSk7XG4gICAgICAgICAgc2V0U2VsZWN0ZWRPcHRpb24ocmVzdWx0c1swXSk7XG4gICAgICAgICAgZmllbGQub25DaGFuZ2UocmVzdWx0c1swXVt2YWx1ZUZpZWxkXSk7XG4gICAgICAgICAgZmllbGRWYWx1ZS5jdXJyZW50ID0gcmVzdWx0c1swXVt2YWx1ZUZpZWxkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluaXRpYWxWYWx1ZUxvYWRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW2luaXRpYWxWYWx1ZSwgZmV0Y2hEYXRhLCBmaWVsZCwgZmlsbE9wdGlvbnMsIHZhbHVlRmllbGRdKTtcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBhY3RpdmUgPSB0cnVlO1xuXG4gICAgaWYgKGlucHV0VmFsdWUyID09PSAnJyB8fCBpbml0aWFsVmFsdWVMb2FkZWQuY3VycmVudCA9PT0gZmFsc2UpIHtcbiAgICAgIHNldE9wdGlvbnMoc2VsZWN0ZWRPcHRpb24gPyBbc2VsZWN0ZWRPcHRpb25dIDogW10pO1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkVmFsdWUuY3VycmVudCkge1xuICAgICAgaWYgKGZpZWxkLnZhbHVlID09PSBmaWVsZFZhbHVlLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRMb2FkaW5nKHRydWUpO1xuXG4gICAgY29uc3QgcGF5bG9hZDogQXN5bmNTZWxlY3RQYXlsb2FkID0ge1xuICAgICAgcXVlcnk6IGlucHV0VmFsdWUyLFxuICAgICAgaW5pdGlhbFZhbHVlOiBudWxsLFxuICAgIH07XG5cbiAgICBmZXRjaERhdGEocGF5bG9hZCwgKHJlc3VsdHM/OiByZWFkb25seSBUT3B0aW9uW10pID0+IHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgZmlsbE9wdGlvbnMocmVzdWx0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW1xuICAgIGluaXRpYWxWYWx1ZSxcbiAgICBpbnB1dFZhbHVlMixcbiAgICBmZXRjaERhdGEsXG4gICAgZmllbGQudmFsdWUsXG4gICAgZmlsbE9wdGlvbnMsXG4gICAgc2VsZWN0ZWRPcHRpb24sXG4gIF0pO1xuXG4gIGNvbnN0IHNlbGVjdFJlZiA9IHVzZVJlZihudWxsKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgXzogUmVhY3QuU3ludGhldGljRXZlbnQsXG4gICAgbmV3U2VsZWN0ZWRPcHRpb246IFRPcHRpb24gfCBudWxsLFxuICAgIHJlYXNvbjogQXV0b2NvbXBsZXRlQ2hhbmdlUmVhc29uXG4gICkgPT4ge1xuICAgIGlmIChyZWFzb24gPT09ICdjbGVhcicpIHtcbiAgICAgIHNldFNlbGVjdGVkT3B0aW9uKG51bGwpO1xuICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKHJlYXNvbiA9PT0gJ3NlbGVjdE9wdGlvbicgfHwgcmVhc29uID09PSAncmVtb3ZlT3B0aW9uJykge1xuICAgICAgaWYgKG5ld1NlbGVjdGVkT3B0aW9uKSB7XG4gICAgICAgIHNldFNlbGVjdGVkT3B0aW9uKG5ld1NlbGVjdGVkT3B0aW9uKTtcbiAgICAgICAgZmllbGQub25DaGFuZ2UobmV3U2VsZWN0ZWRPcHRpb25bdmFsdWVGaWVsZF0pO1xuICAgICAgICBmaWVsZFZhbHVlLmN1cnJlbnQgPSBuZXdTZWxlY3RlZE9wdGlvblt2YWx1ZUZpZWxkXTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0T3B0aW9ucyhbXSk7XG4gICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWZpZWxkLnZhbHVlKSB7XG4gICAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICAgIHNldFNlbGVjdGVkT3B0aW9uKG51bGwpO1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgfVxuICB9LCBbZmllbGQudmFsdWVdKTtcblxuICBjb25zdCBnZXRPcHRpb25WYWx1ZSA9IChvcHRpb246IFRPcHRpb24pOiBzdHJpbmcgfCBudW1iZXIgPT4ge1xuICAgIHJldHVybiBvcHRpb24gPyBTdHJpbmcob3B0aW9uW3ZhbHVlRmllbGRdKSA6ICcnO1xuICB9O1xuXG4gIGNvbnN0IGdldE9wdGlvbkxhYmVsID0gKG9wdGlvbjogVE9wdGlvbik6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIG9wdGlvbiA/IFN0cmluZyhvcHRpb25bbGFiZWxGaWVsZF0pIDogJyc7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b2NvbXBsZXRlXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHJlZj17c2VsZWN0UmVmfVxuICAgICAgZnVsbFdpZHRoXG4gICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgZ2V0T3B0aW9uTGFiZWw9e2dldE9wdGlvbkxhYmVsfVxuICAgICAgZ2V0T3B0aW9uS2V5PXtnZXRPcHRpb25WYWx1ZX1cbiAgICAgIGlzT3B0aW9uRXF1YWxUb1ZhbHVlPXsob3B0aW9uLCB2YWx1ZSkgPT5cbiAgICAgICAgZ2V0T3B0aW9uVmFsdWUob3B0aW9uKSA9PT0gZ2V0T3B0aW9uVmFsdWUodmFsdWUpXG4gICAgICB9XG4gICAgICBhdXRvQ29tcGxldGVcbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgIGluY2x1ZGVJbnB1dEluTGlzdFxuICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgIGZpbHRlck9wdGlvbnM9e3ggPT4geH1cbiAgICAgIHZhbHVlPXtzZWxlY3RlZE9wdGlvbn1cbiAgICAgIGZpbHRlclNlbGVjdGVkT3B0aW9uc1xuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZX1cbiAgICAgIG9uSW5wdXRDaGFuZ2U9eyhfLCBuZXdJbnB1dFZhbHVlKSA9PiB7XG4gICAgICAgIHNldElucHV0VmFsdWUyKG5ld0lucHV0VmFsdWUpO1xuICAgICAgfX1cbiAgICAgIG5vT3B0aW9uc1RleHQ9XCJUeXBlIFNvbWV0aGluZy4uLlwiXG4gICAgICByZW5kZXJJbnB1dD17cGFyYW1zID0+IChcbiAgICAgICAgPFRleHRGaWVsZFxuICAgICAgICAgIHsuLi5wYXJhbXN9XG4gICAgICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgICAgIGVycm9yPXshIWVycm9yfVxuICAgICAgICAgIGhlbHBlclRleHQ9e2Vycm9yID8gZXJyb3IubWVzc2FnZSA6ICcnfVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlcn1cbiAgICAgICAgICBzbG90UHJvcHM9e3tcbiAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgIC4uLnBhcmFtcy5JbnB1dFByb3BzLFxuICAgICAgICAgICAgICBlbmRBZG9ybm1lbnQ6IChcbiAgICAgICAgICAgICAgICA8RnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgICAgICAgICAgPENpcmN1bGFyUHJvZ3Jlc3MgY29sb3I9XCJpbmhlcml0XCIgc2l6ZT17MjB9IC8+XG4gICAgICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgICAgIHtwYXJhbXMuSW5wdXRQcm9wcy5lbmRBZG9ybm1lbnR9XG4gICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfX1cbiAgICAgICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgcmVuZGVyT3B0aW9uPXsocmVuZGVyUHJvcHMsIG9wdGlvbikgPT4ge1xuICAgICAgICBjb25zdCB7IGtleSwgLi4ub3B0aW9uUHJvcHMgfSA9IHJlbmRlclByb3BzO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGxpIGtleT17a2V5fSB7Li4ub3B0aW9uUHJvcHN9PlxuICAgICAgICAgICAge29wdGlvbltsYWJlbEZpZWxkXX1cbiAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgICAgfX1cbiAgICAvPlxuICApO1xufTtcblxuY29uc3QgQXN5bmNTZWxlY3RFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZUtleSBleHRlbmRzIHN0cmluZyA9ICdWYWx1ZScsXG4gIFRMYWJlbEtleSBleHRlbmRzIHN0cmluZyA9ICdMYWJlbCcsXG4gIFRPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3Q8VFZhbHVlS2V5LCBUTGFiZWxLZXk+ID0gT3B0aW9uT2JqZWN0PFxuICAgIFRWYWx1ZUtleSxcbiAgICBUTGFiZWxLZXlcbiAgPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IEFzeW5jU2VsZWN0RWxlbWVudFByb3BzPFxuICBURmllbGRWYWx1ZXMsXG4gIFROYW1lLFxuICBUVmFsdWVLZXksXG4gIFRMYWJlbEtleSxcbiAgVE9wdGlvblxuPik6IFJlYWN0LlJlYWN0RWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgPEdyaWQgc2l6ZT17MTJ9IHsuLi5ncmlkUHJvcHN9PlxuICAgICAgPENvbXBvbmVudDxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWVLZXksIFRMYWJlbEtleSwgVE9wdGlvbj5cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgLz5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5Bc3luY1NlbGVjdEVsZW1lbnQuZGlzcGxheU5hbWUgPSAnQXN5bmNTZWxlY3RFbGVtZW50JztcblxuZXhwb3J0IHsgQXN5bmNTZWxlY3RFbGVtZW50IH07XG4iLCAiaW1wb3J0IHR5cGUge1xuICBHcmlkUHJvcHMsXG4gIFRleHRGaWVsZFByb3BzLFxuICBUZXh0RmllbGRWYXJpYW50cyxcbn0gZnJvbSAnQG11aS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBHcmlkLCBUZXh0RmllbGQsIHVzZUZvcmtSZWYgfSBmcm9tICdAbXVpL21hdGVyaWFsJztcbmltcG9ydCB0eXBlIHsgQ2hhbmdlRXZlbnQsIFJlYWN0RWxlbWVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge1xuICBDb250cm9sLFxuICBGaWVsZEVycm9yLFxuICBGaWVsZFBhdGgsXG4gIEZpZWxkVmFsdWVzLFxuICBQYXRoVmFsdWUsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSc7XG5pbXBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHR5cGUgeyBGaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWQnO1xuaW1wb3J0IHsgdXNlRW5oYW5jZWRUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi9ob29rcy91c2VUcmFuc2Zvcm0vZW5oYW5jZWQnO1xuaW1wb3J0IHR5cGUgeyBFdmVudE9yVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcy9ldmVudHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgVGV4dEZpZWxkRWxlbWVudCBjb21wb25lbnQuXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyRmllbGRFbGVtZW50UHJvcHM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPiB7XG4gIC8qKlxuICAgKiBUaGUgZmllbGQgbmFtZSBpbiB0aGUgZm9ybVxuICAgKiBAZXhhbXBsZSBcImZpcnN0TmFtZVwiIHwgXCJ1c2VyLmVtYWlsXCJcbiAgICovXG4gIG5hbWU6IFROYW1lO1xuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIG1lc3NhZ2UgcGFyc2VyXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBmaWVsZCBlcnJvciBvYmplY3RcbiAgICogQHJldHVybnMgQ3VzdG9tIGVycm9yIG1lc3NhZ2Ugb3IgY29tcG9uZW50XG4gICAqL1xuICBwYXJzZUVycm9yPzogKGVycm9yOiBGaWVsZEVycm9yKSA9PiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGluc3RhbmNlIGZyb20gcmVhY3QtaG9vay1mb3JtXG4gICAqL1xuICBjb250cm9sPzogQ29udHJvbDxURmllbGRWYWx1ZXM+O1xuICAvKipcbiAgICogQ3VzdG9tIFRleHRGaWVsZCBjb21wb25lbnQgdG8gdXNlIGluc3RlYWQgb2YgZGVmYXVsdCBNVUkgVGV4dEZpZWxkXG4gICAqL1xuICBjb21wb25lbnQ/OiB0eXBlb2YgVGV4dEZpZWxkO1xuICAvKipcbiAgICogVmFsdWUgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIGZvciBpbnB1dC9vdXRwdXRcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGZpZWxkVHlwZSBmb3IgY29tbW9uIHBhdHRlcm5zIG9yIGN1c3RvbSB0cmFuc2Zvcm1zIGZvciBjb21wbGV4IGNhc2VzXG4gICAqL1xuICB0cmFuc2Zvcm0/OiB7XG4gICAgLyoqIFRyYW5zZm9ybSB2YWx1ZSBiZWZvcmUgZGlzcGxheWluZyBpbiBpbnB1dCAqL1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZTtcbiAgICAvKiogVHJhbnNmb3JtIGlucHV0IGV2ZW50IHRvIGZvcm0gdmFsdWUgKi9cbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudE9yVmFsdWU6IEV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbiAgLyoqXG4gICAqIEJ1aWx0LWluIGZpZWxkIHR5cGUgZm9yIGF1dG9tYXRpYyB0cmFuc2Zvcm1hdGlvblxuICAgKiBAZXhhbXBsZSAndGV4dCcgfCAnbnVtYmVyJyB8ICdkYXRlJyB8ICd0aW1lJyB8ICdzZWxlY3QnXG4gICAqL1xuICBmaWVsZFR5cGU/OiBGaWVsZFR5cGU7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlIHRvIGRpc3BsYXkgd2hlbiBmaWVsZCB2YWx1ZSBpcyBudWxsL3VuZGVmaW5lZFxuICAgKiBAZXhhbXBsZSBcIlwiXG4gICAqL1xuICBkZWZhdWx0VmFsdWU/OiBUVmFsdWU7XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgbGFiZWwgdGV4dFxuICAgKiBAZXhhbXBsZSBcIkVtYWlsIEFkZHJlc3NcIlxuICAgKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgaW5wdXRcbiAgICogQGV4YW1wbGUgXCJFbnRlciB5b3VyIGVtYWlsXCJcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9wcyBmb3IgdGhlIHVuZGVybHlpbmcgVGV4dEZpZWxkIGNvbXBvbmVudFxuICAgKi9cbiAgdGV4dEZpZWxkUHJvcHM/OiBPbWl0PFRleHRGaWVsZFByb3BzLCAnbmFtZScgPjtcbiAgLyoqXG4gICAqIEdyaWQgbGF5b3V0IHByb3BzIGZvciB0aGUgd3JhcHBlciBHcmlkIGNvbXBvbmVudFxuICAgKiBAZGVmYXVsdFZhbHVlIHsgc2l6ZTogeyB4czogMTIsIHNtOiAxMiwgbWQ6IDEyLCBsZzogMTIsIHhsOiAxMiB9IH1cbiAgICovXG4gIGdyaWRQcm9wcz86IEdyaWRQcm9wcztcbiAgLyoqXG4gICAqIFRoZSBUZXh0RmllbGQgdmFyaWFudFxuICAgKiBAZGVmYXVsdFZhbHVlIFwib3V0bGluZWRcIlxuICAgKi9cbiAgdmFyaWFudD86IFRleHRGaWVsZFZhcmlhbnRzO1xuICAvKipcbiAgICogQ3VzdG9tIG9uQ2hhbmdlIGhhbmRsZXIgY2FsbGVkIGFmdGVyIHRyYW5zZm9ybWF0aW9uXG4gICAqL1xuICBvbkNoYW5nZT86IChcbiAgICBldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEVuYWJsZSBkZXZlbG9wbWVudCB3YXJuaW5ncyBmb3IgZGVidWdnaW5nIHRyYW5zZm9ybWF0aW9uIGlzc3Vlc1xuICAgKiBAZGVmYXVsdFZhbHVlIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnXG4gICAqL1xuICBlbmFibGVXYXJuaW5ncz86IGJvb2xlYW47XG59XG5cbmNvbnN0IENvbXBvbmVudCA9IGZ1bmN0aW9uIE51bWJlckZpZWxkRWxlbWVudDxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+KHByb3BzOiBOdW1iZXJGaWVsZEVsZW1lbnRQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KSB7XG4gIGNvbnN0IHtcbiAgICBwYXJzZUVycm9yLFxuICAgIG5hbWUsXG4gICAgY29udHJvbCxcbiAgICBjb21wb25lbnQ6IFRleHRGaWVsZENvbXBvbmVudCA9IFRleHRGaWVsZCxcbiAgICB0cmFuc2Zvcm0sXG4gICAgZmllbGRUeXBlID0gJ3RleHQnLCAvLyBEZWZhdWx0IHRvIHRleHQgdHlwZVxuICAgIGRlZmF1bHRWYWx1ZSxcbiAgICBsYWJlbCxcbiAgICBwbGFjZWhvbGRlcixcbiAgICB0ZXh0RmllbGRQcm9wcyA9IHt9LFxuICAgIHZhcmlhbnQsXG4gICAgb25DaGFuZ2U6IGN1c3RvbU9uQ2hhbmdlLFxuICAgIGVuYWJsZVdhcm5pbmdzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcsXG4gICAgLi4ucmVzdFxuICB9ID0gcHJvcHM7XG5cbiAgY29uc3Qge1xuICAgIHR5cGUgPSAnbnVtYmVyJyxcbiAgICByZXF1aXJlZCxcbiAgICBoZWxwZXJUZXh0LFxuICAgIGlucHV0UmVmLFxuICAgIG9uSW5wdXQsXG4gICAgb25CbHVyLFxuICAgIGRpc2FibGVkLFxuICAgIC4uLnJlc3RUZXh0UHJvcHNcbiAgfSA9IHRleHRGaWVsZFByb3BzO1xuXG4gIGNvbnN0IHtcbiAgICBmaWVsZCxcbiAgICBmaWVsZFN0YXRlOiB7IGVycm9yIH0sXG4gIH0gPSB1c2VDb250cm9sbGVyKHtcbiAgICBuYW1lLFxuICAgIGNvbnRyb2wsXG4gIH0pO1xuXG4gIC8vIFVzZSB0aGUgZW5oYW5jZWQgdHJhbnNmb3JtIGhvb2sgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VFbmhhbmNlZFRyYW5zZm9ybTxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+KFxuICAgIHtcbiAgICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtXG4gICAgICAgID8ge1xuICAgICAgICAgICAgaW5wdXQ6IHRyYW5zZm9ybS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogdHJhbnNmb3JtLm91dHB1dCxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZmllbGRUeXBlOiAhdHJhbnNmb3JtXG4gICAgICAgID8gdHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/ICdudW1iZXInXG4gICAgICAgICAgOiBmaWVsZFR5cGVcbiAgICAgICAgOiB1bmRlZmluZWQsIC8vIEF1dG8tZGV0ZWN0IG51bWJlciB0eXBlXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICBlbmFibGVXYXJuaW5ncyxcbiAgICB9XG4gICk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRSZWYgPSB1c2VGb3JrUmVmKGZpZWxkLnJlZiwgaW5wdXRSZWYpO1xuXG4gIHJldHVybiAoXG4gICAgPFRleHRGaWVsZENvbXBvbmVudFxuICAgICAgey4uLnJlc3R9XG4gICAgICB7Li4ucmVzdFRleHRQcm9wc31cbiAgICAgIG5hbWU9e2ZpZWxkLm5hbWV9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBvbkNoYW5nZT17ZXZlbnQgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcblxuICAgICAgICBpZiAoaW5wdXQgPT09ICcnKSB7XG4gICAgICAgICAgZmllbGQub25DaGFuZ2UobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBvbkNoYW5nZShldmVudCk7XG4gICAgICAgIGlmICh0eXBlb2YgY3VzdG9tT25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjdXN0b21PbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbkJsdXI9e2V2ZW50ID0+IHtcbiAgICAgICAgZmllbGQub25CbHVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CbHVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CbHVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfX1cbiAgICAgIG9uSW5wdXQ9eyhldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvbklucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25JbnB1dChldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH19XG4gICAgICBvbldoZWVsPXtlID0+IHtcbiAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5ibHVyKCk7XG4gICAgICB9fVxuICAgICAgb25LZXlEb3duPXtlID0+IHtcbiAgICAgICAgaWYgKFsnZScsICdFJywgJ0Fycm93RG93bicsICdBcnJvd1VwJ10uaW5jbHVkZXMoZS5rZXkpKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9fVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgbGFiZWw9e2xhYmVsfVxuICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgZnVsbFdpZHRoXG4gICAgICByZXF1aXJlZD17cmVxdWlyZWR9XG4gICAgICB0eXBlPXt0eXBlfVxuICAgICAgZXJyb3I9eyEhZXJyb3J9XG4gICAgICBoZWxwZXJUZXh0PXtcbiAgICAgICAgZXJyb3IgPyAocGFyc2VFcnJvciA/IHBhcnNlRXJyb3IoZXJyb3IpIDogZXJyb3IubWVzc2FnZSkgOiBoZWxwZXJUZXh0XG4gICAgICB9XG4gICAgICBpbnB1dFJlZj17aGFuZGxlSW5wdXRSZWZ9XG4gICAgICB2YXJpYW50PXt2YXJpYW50ID8gdmFyaWFudCA6ICdvdXRsaW5lZCd9XG4gICAgLz5cbiAgKTtcbn07XG5cbi8qKlxuICogQSByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRlZCBUZXh0RmllbGQgY29tcG9uZW50IHdpdGggYXV0b21hdGljIHZhbGlkYXRpb24sXG4gKiBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zLCBhbmQgYnVpbHQtaW4gZmllbGQgdHlwZSBoYW5kbGluZy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCByZWFjdC1ob29rLWZvcm0gaW50ZWdyYXRpb25cbiAqIC0gQXV0b21hdGljIGVycm9yIGRpc3BsYXkgd2l0aCBjdXN0b20gcGFyc2luZ1xuICogLSBWYWx1ZSB0cmFuc2Zvcm1hdGlvbiBzdXBwb3J0XG4gKiAtIEJ1aWx0LWluIGZpZWxkIHR5cGVzIGZvciBjb21tb24gcGF0dGVybnNcbiAqIC0gR3JpZCBsYXlvdXQgd3JhcHBlclxuICogLSBUeXBlU2NyaXB0IHR5cGUgc2FmZXR5XG4gKiAtIE9wdGltaXplZCBudW1iZXIgaW5wdXQgaGFuZGxpbmdcbiAqIC0gRGlzYWJsZWQgc3RhdGUgc3R5bGluZ1xuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIHdpdGggbWVtb2l6ZWQgdHJhbnNmb3JtYXRpb25zXG4gKiAtIERldmVsb3BtZW50IHdhcm5pbmdzIGZvciBkZWJ1Z2dpbmdcbiAqIC0gU3RhYmxlIHJlZmVyZW5jZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggYnVpbHQtaW4gbnVtYmVyIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiYWdlXCJcbiAqICAgbGFiZWw9XCJBZ2VcIlxuICogICBmaWVsZFR5cGU9XCJudW1iZXJcIlxuICogICBydWxlcz17eyByZXF1aXJlZDogJ0FnZSBpcyByZXF1aXJlZCcsIG1pbjogeyB2YWx1ZTogMCwgbWVzc2FnZTogJ0FnZSBtdXN0IGJlIHBvc2l0aXZlJyB9IH19XG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEFkdmFuY2VkIHVzYWdlIHdpdGggY3VzdG9tIGdyaWQgbGF5b3V0OlxuICogYGBgdHN4XG4gKiA8VGV4dEZpZWxkRWxlbWVudFxuICogICBjb250cm9sPXtjb250cm9sfVxuICogICBuYW1lPVwiZW1haWxcIlxuICogICBsYWJlbD1cIkVtYWlsXCJcbiAqICAgZmllbGRUeXBlPVwidGV4dFwiXG4gKiAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBlbWFpbCBhZGRyZXNzXCJcbiAqICAgZ3JpZFByb3BzPXt7IHNpemU6IHsgeHM6IDEyLCBtZDogNiB9IH19XG4gKiAgIHJ1bGVzPXt7XG4gKiAgICAgcmVxdWlyZWQ6ICdFbWFpbCBpcyByZXF1aXJlZCcsXG4gKiAgICAgcGF0dGVybjogeyB2YWx1ZTogL1xcUytAXFxTK1xcLlxcUysvLCBtZXNzYWdlOiAnSW52YWxpZCBlbWFpbCcgfVxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gdHJhbnNmb3JtYXRpb246XG4gKiBgYGB0c3hcbiAqIDxUZXh0RmllbGRFbGVtZW50XG4gKiAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gKiAgIG5hbWU9XCJwcmljZVwiXG4gKiAgIGxhYmVsPVwiUHJpY2VcIlxuICogICB0cmFuc2Zvcm09e3tcbiAqICAgICBpbnB1dDogKHZhbHVlKSA9PiB2YWx1ZSA/IGAkJHt2YWx1ZX1gIDogJycsXG4gKiAgICAgb3V0cHV0OiAoZXZlbnQpID0+IHBhcnNlRmxvYXQoZXZlbnQudGFyZ2V0LnZhbHVlLnJlcGxhY2UoJyQnLCAnJykpIHx8IG51bGxcbiAqICAgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gZXJyb3IgcGFyc2luZzpcbiAqIGBgYHRzeFxuICogPFRleHRGaWVsZEVsZW1lbnRcbiAqICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgbmFtZT1cInVzZXJuYW1lXCJcbiAqICAgbGFiZWw9XCJVc2VybmFtZVwiXG4gKiAgIGZpZWxkVHlwZT1cInRleHRcIlxuICogICBwYXJzZUVycm9yPXsoZXJyb3IpID0+IChcbiAqICAgICA8c3BhbiBzdHlsZT17eyBjb2xvcjogJ3JlZCcgfX0+XG4gKiAgICAgICBcdTI2QTBcdUZFMEYge2Vycm9yLm1lc3NhZ2V9XG4gKiAgICAgPC9zcGFuPlxuICogICApfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzXG4gKiBAcmV0dXJucyBSZWFjdCBlbGVtZW50IHdpdGggb3B0aW9uYWwgR3JpZCB3cmFwcGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgTnVtYmVyRmllbGRFbGVtZW50ID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4oe1xuICBncmlkUHJvcHMgPSB7fSxcbiAgLi4ucHJvcHNcbn06IE51bWJlckZpZWxkRWxlbWVudFByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT4pOiBSZWFjdEVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIDxHcmlkIHNpemU9ezEyfSB7Li4uZ3JpZFByb3BzfT5cbiAgICAgIDxDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgIDwvR3JpZD5cbiAgKTtcbn07XG4iLCAiaW1wb3J0IHsgT1RQSW5wdXRFbGVtZW50IH0gZnJvbSBcIi4uL09UUElucHV0RWxlbWVudC9PVFBJbnB1dEVsZW1lbnRcIjtcbmltcG9ydCB7IEFzeW5jTXVsdGlTZWxlY3QyIH0gZnJvbSBcIi4uL0FzeW5jTXVsdGlTZWxlY3QyXCI7XG5pbXBvcnQgeyBBc3luY1NlbGVjdEVsZW1lbnQgfSBmcm9tIFwiLi4vQXN5bmNTZWxlY3RcIjtcbmltcG9ydCB7IENoZWNrYm94RWxlbWVudCB9IGZyb20gXCIuLi9DaGVja2JveEVsZW1lbnRcIjtcbmltcG9ydCB7IENoZWNrYm94R3JvdXAgfSBmcm9tIFwiLi4vQ2hlY2tib3hHcm91cFwiO1xuaW1wb3J0IHsgRGF0ZVBpY2tlckVsZW1lbnQgfSBmcm9tIFwiLi4vRGF0ZVBpY2tlckVsZW1lbnRcIjtcbmltcG9ydCB7IE51bWJlckZpZWxkRWxlbWVudCB9IGZyb20gXCIuLi9OdW1iZXJGaWVsZEVsZW1lbnRcIjtcbmltcG9ydCB7IFBhc3N3b3JkRWxlbWVudCB9IGZyb20gXCIuLi9QYXNzd29yZEVsZW1lbnRcIjtcbmltcG9ydCB7IFJhZGlvQnV0dG9uR3JvdXAgfSBmcm9tIFwiLi4vUmFkaW9CdXR0b25Hcm91cFwiO1xuaW1wb3J0IHsgU2VsZWN0Q2FzY2FkZUVsZW1lbnQgfSBmcm9tIFwiLi4vU2VsZWN0Q2FzY2FkZUVsZW1lbnRcIjtcbmltcG9ydCB7IFNlbGVjdEVsZW1lbnQgfSBmcm9tIFwiLi4vU2VsZWN0RWxlbWVudFwiO1xuaW1wb3J0IHsgU2VsZWN0TXVsdGlFbGVtZW50IH0gZnJvbSBcIi4uL1NlbGVjdE11bHRpRWxlbWVudFwiO1xuaW1wb3J0IHsgVGV4dEZpZWxkRWxlbWVudCB9IGZyb20gXCIuLi9UZXh0RmllbGRFbGVtZW50XCI7XG5pbXBvcnQgeyBUaW1lUGlja2VyRWxlbWVudCB9IGZyb20gXCIuLi9UaW1lUGlja2VyRWxlbWVudFwiO1xuXG5jb25zdCBGaWVsZCA9IHtcbiAgVGV4dDogVGV4dEZpZWxkRWxlbWVudCxcbiAgTnVtYmVyOiBOdW1iZXJGaWVsZEVsZW1lbnQsXG4gIENoZWNrYm94OiBDaGVja2JveEVsZW1lbnQsXG4gIERhdGU6IERhdGVQaWNrZXJFbGVtZW50LFxuICBSYWRpb0dyb3VwOiBSYWRpb0J1dHRvbkdyb3VwLFxuICBQYXNzd29yZDogUGFzc3dvcmRFbGVtZW50LFxuICBUaW1lOiBUaW1lUGlja2VyRWxlbWVudCxcbiAgU2VsZWN0OiBTZWxlY3RFbGVtZW50LFxuICBTZWxlY3RNdWx0aTogU2VsZWN0TXVsdGlFbGVtZW50LFxuICBTZWxlY3RDYXNjYWRlOiBTZWxlY3RDYXNjYWRlRWxlbWVudCxcbiAgQXN5bmNTZWxlY3Q6IEFzeW5jU2VsZWN0RWxlbWVudCxcbiAgQXN5bmNNdWx0aVNlbGVjdDogQXN5bmNNdWx0aVNlbGVjdDIsXG4gIENoZWNrYm94R3JvdXAsXG4gIE9UUElucHV0OiBPVFBJbnB1dEVsZW1lbnRcbn07XG5cbmV4cG9ydCB7IEZpZWxkIH07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7QUE0Rk8sU0FBUyxjQUFjLE9BQXFDO0FBQ2pFLFNBQ0UsT0FBTyxVQUFVLFlBQ2pCLFVBQVUsUUFDVixXQUFXLFNBQ1gsV0FBVyxTQUNYLE9BQVEsTUFBcUIsVUFBVSxhQUN0QyxPQUFRLE1BQXFCLFVBQVUsWUFDdEMsT0FBUSxNQUFxQixVQUFVLFlBQ3ZDLE9BQVEsTUFBcUIsVUFBVTtBQUU3QztBQVlPLFNBQVMsaUJBQ2QsU0FDQSxhQUFhLFNBQ2IsYUFBYSxTQUNDO0FBQ2QsU0FBTyxRQUFRLElBQUksYUFBVztBQUFBLElBQzVCLE9BQU8sT0FBTyxPQUFPLFVBQVUsS0FBSyxFQUFFO0FBQUEsSUFDdEMsT0FBTyxPQUFPLFVBQVU7QUFBQSxJQUN4QixVQUFVLFFBQVEsT0FBTyxRQUFRO0FBQUEsRUFDbkMsRUFBRTtBQUNKOzs7QUM3SEE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQWdCLGFBQWEsV0FBVyxZQUFZLGVBQWU7QUFDbkUsU0FBUyxxQkFBcUI7QUFnTWhCLG1CQUVJLEtBRko7QUF2S2QsSUFBTSxlQUErQjtBQUFBLEVBQ25DLFNBQVMsQ0FBQztBQUFBLEVBQ1YsaUJBQWlCLENBQUM7QUFBQSxFQUNsQixZQUFZO0FBQUEsRUFDWixTQUFTO0FBQUEsRUFDVCxlQUFlO0FBQ2pCO0FBRUEsU0FBUyxpQkFDUCxPQUNBLFFBQ2dCO0FBQ2hCLFVBQVEsT0FBTyxNQUFNO0FBQUEs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ZCIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJqc3hzIiwgInVzZUNvbnRyb2xsZXIiLCAidmFsdWUiLCAiQ2hlY2tib3hFbGVtZW50IiwgIkdyaWQiLCAiQ2hlY2tib3giLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtR3JvdXAiLCAiRm9ybUhlbHBlclRleHQiLCAiR3JpZCIsICJ1c2VDYWxsYmFjayIsICJ1c2VFZmZlY3QiLCAidXNlQ29udHJvbGxlciIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiQ2hlY2tib3hHcm91cCIsICJHcmlkIiwgImZvcndhcmRSZWYiLCAidXNlQ2FsbGJhY2siLCAidXNlTWVtbyIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAidXNlTWVtbyIsICJ1c2VNZW1vIiwgImpzeCIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZU1lbW8iLCAianN4IiwgImZvcndhcmRSZWYiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAidXNlRm9ya1JlZiIsICJHcmlkIiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJwYXNzd29yZCIsICJ1c2VTdGF0ZSIsICJ1c2VDb250cm9sbGVyIiwgInVzZUZvcmtSZWYiLCAiVGV4dEZpZWxkIiwgIkdyaWQiLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtSGVscGVyVGV4dCIsICJHcmlkIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgInVzZUNvbnRyb2xsZXIiLCAidmFsdWUiLCAiRm9ybUNvbnRyb2wiLCAiRm9ybUNvbnRyb2xMYWJlbCIsICJGb3JtSGVscGVyVGV4dCIsICJSYWRpb0J1dHRvbkdyb3VwIiwgIkdyaWQiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAiQXV0b2NvbXBsZXRlIiwgInVzZUVmZmVjdCIsICJ1c2VDYWxsYmFjayIsICJ1c2VNZW1vIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJTZWxlY3RDYXNjYWRlRWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAidXNlTWVtbyIsICJ1c2VFZmZlY3QiLCAidXNlQ2FsbGJhY2siLCAidXNlUmVmIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJ1c2VNZW1vIiwgInVzZVJlZiIsICJ1c2VDb250cm9sbGVyIiwgInVzZUNhbGxiYWNrIiwgInVzZUVmZmVjdCIsICJBdXRvY29tcGxldGUiLCAiVGV4dEZpZWxkIiwgIlNlbGVjdEVsZW1lbnQiLCAiR3JpZCIsICJHcmlkIiwgIkNoZWNrYm94IiwgIlRleHRGaWVsZCIsICJBdXRvY29tcGxldGUiLCAiQ2lyY3VsYXJQcm9ncmVzcyIsICJGcmFnbWVudCIsICJ1c2VNZW1vIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIlNlbGVjdE11bHRpRWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VGb3JrUmVmIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJUZXh0RmllbGQiLCAidXNlQ29udHJvbGxlciIsICJ1c2VGb3JrUmVmIiwgIlRleHRGaWVsZEVsZW1lbnQiLCAiR3JpZCIsICJHcmlkIiwgInVzZUZvcmtSZWYiLCAidXNlTG9jYWxpemF0aW9uQ29udGV4dCIsICJ1c2VDb250cm9sbGVyIiwgImpzeCIsICJDb21wb25lbnQiLCAidXNlTG9jYWxpemF0aW9uQ29udGV4dCIsICJ1c2VDb250cm9sbGVyIiwgInZhbHVlIiwgInVzZUZvcmtSZWYiLCAiVGltZVBpY2tlckVsZW1lbnQiLCAiR3JpZCIsICJHcmlkIiwgIkZvcm1IZWxwZXJUZXh0IiwgImpzeCIsICJqc3giLCAianN4cyIsICJDb21wb25lbnQiLCAiT1RQSW5wdXRFbGVtZW50IiwgIkdyaWQiLCAiQXV0b2NvbXBsZXRlIiwgIkNpcmN1bGFyUHJvZ3Jlc3MiLCAiR3JpZCIsICJUZXh0RmllbGQiLCAiZGVib3VuY2UiLCAiUmVhY3QiLCAiRnJhZ21lbnQiLCAidXNlQ2FsbGJhY2siLCAidXNlRWZmZWN0IiwgInVzZU1lbW8iLCAidXNlUmVmIiwgInVzZVN0YXRlIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgImpzeHMiLCAiQ29tcG9uZW50IiwgIkFzeW5jU2VsZWN0RWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZCIsICJ1c2VGb3JrUmVmIiwgInVzZUNvbnRyb2xsZXIiLCAianN4IiwgIkNvbXBvbmVudCIsICJUZXh0RmllbGQiLCAidXNlQ29udHJvbGxlciIsICJ1c2VGb3JrUmVmIiwgIk51bWJlckZpZWxkRWxlbWVudCIsICJHcmlkIiwgIlRleHRGaWVsZEVsZW1lbnQiLCAiTnVtYmVyRmllbGRFbGVtZW50IiwgIkNoZWNrYm94RWxlbWVudCIsICJSYWRpb0J1dHRvbkdyb3VwIiwgIlRpbWVQaWNrZXJFbGVtZW50IiwgIlNlbGVjdEVsZW1lbnQiLCAiU2VsZWN0TXVsdGlFbGVtZW50IiwgIlNlbGVjdENhc2NhZGVFbGVtZW50IiwgIkFzeW5jU2VsZWN0RWxlbWVudCIsICJDaGVja2JveEdyb3VwIiwgIk9UUElucHV0RWxlbWVudCJdCn0K