@dereekb/dbx-form 9.25.16 → 10.0.0

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 (364) hide show
  1. package/_index.scss +1 -0
  2. package/calendar/lib/calendar.module.d.ts +1 -1
  3. package/calendar/lib/calendar.schedule.selection.cell.component.d.ts +1 -1
  4. package/calendar/lib/calendar.schedule.selection.component.d.ts +4 -4
  5. package/calendar/lib/calendar.schedule.selection.d.ts +1 -1
  6. package/calendar/lib/calendar.schedule.selection.days.component.d.ts +1 -1
  7. package/calendar/lib/calendar.schedule.selection.days.form.component.d.ts +2 -2
  8. package/calendar/lib/calendar.schedule.selection.dialog.button.component.d.ts +1 -6
  9. package/calendar/lib/calendar.schedule.selection.dialog.component.d.ts +1 -11
  10. package/calendar/lib/calendar.schedule.selection.popover.button.component.d.ts +2 -2
  11. package/calendar/lib/calendar.schedule.selection.popover.component.d.ts +1 -1
  12. package/calendar/lib/calendar.schedule.selection.popover.content.component.d.ts +1 -1
  13. package/calendar/lib/calendar.schedule.selection.range.component.d.ts +1 -1
  14. package/calendar/lib/calendar.schedule.selection.store.d.ts +4 -32
  15. package/calendar/lib/calendar.schedule.selection.store.provide.d.ts +1 -1
  16. package/calendar/lib/calendar.schedule.selection.toggle.button.component.d.ts +1 -1
  17. package/calendar/lib/field/schedule/calendar.schedule.field.component.d.ts +2 -8
  18. package/esm2022/calendar/lib/calendar.module.mjs +155 -0
  19. package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.cell.component.mjs +10 -10
  20. package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.component.mjs +6 -6
  21. package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.days.component.mjs +6 -6
  22. package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.days.form.component.mjs +6 -6
  23. package/esm2022/calendar/lib/calendar.schedule.selection.dialog.button.component.mjs +36 -0
  24. package/esm2022/calendar/lib/calendar.schedule.selection.dialog.component.mjs +56 -0
  25. package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.mjs +1 -1
  26. package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.popover.button.component.mjs +6 -6
  27. package/esm2022/calendar/lib/calendar.schedule.selection.popover.component.mjs +38 -0
  28. package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.popover.content.component.mjs +6 -6
  29. package/esm2022/calendar/lib/calendar.schedule.selection.range.component.mjs +188 -0
  30. package/esm2022/calendar/lib/calendar.schedule.selection.store.mjs +785 -0
  31. package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.store.provide.mjs +7 -7
  32. package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.toggle.button.component.mjs +6 -6
  33. package/esm2022/calendar/lib/field/schedule/calendar.schedule.field.component.mjs +158 -0
  34. package/esm2022/calendar/lib/field/schedule/calendar.schedule.field.mjs +28 -0
  35. package/esm2022/calendar/lib/field/schedule/calendar.schedule.module.mjs +58 -0
  36. package/{esm2020 → esm2022}/lib/form/action/form.action.directive.mjs +4 -4
  37. package/{esm2020 → esm2022}/lib/form/action/form.action.module.mjs +5 -5
  38. package/{esm2020 → esm2022}/lib/form/action/transition/form.action.transition.module.mjs +5 -5
  39. package/{esm2020 → esm2022}/lib/form/action/transition/form.action.transition.safety.directive.mjs +4 -4
  40. package/{esm2020 → esm2022}/lib/form/form.module.mjs +5 -5
  41. package/{esm2020 → esm2022}/lib/form/io/form.changes.directive.mjs +4 -4
  42. package/{esm2020 → esm2022}/lib/form/io/form.input.directive.mjs +4 -4
  43. package/{esm2020 → esm2022}/lib/form/io/form.io.module.mjs +5 -5
  44. package/{esm2020 → esm2022}/lib/form/io/form.loading.directive.mjs +4 -4
  45. package/{esm2020 → esm2022}/lib/form.module.mjs +5 -5
  46. package/{esm2020 → esm2022}/lib/formly/field/checklist/checklist.item.field.component.mjs +9 -9
  47. package/{esm2020 → esm2022}/lib/formly/field/checklist/checklist.item.field.content.default.component.mjs +6 -6
  48. package/esm2022/lib/formly/field/checklist/checklist.item.field.module.mjs +67 -0
  49. package/{esm2020 → esm2022}/lib/formly/field/component/component.field.component.mjs +6 -6
  50. package/esm2022/lib/formly/field/component/component.field.module.mjs +32 -0
  51. package/esm2022/lib/formly/field/field.mjs +97 -0
  52. package/{esm2020 → esm2022}/lib/formly/field/form.field.module.mjs +5 -5
  53. package/{esm2020 → esm2022}/lib/formly/field/selection/list/list.field.component.mjs +4 -4
  54. package/esm2022/lib/formly/field/selection/list/list.field.module.mjs +76 -0
  55. package/esm2022/lib/formly/field/selection/pickable/pickable.chip.field.component.mjs +33 -0
  56. package/{esm2020 → esm2022}/lib/formly/field/selection/pickable/pickable.field.directive.mjs +4 -4
  57. package/esm2022/lib/formly/field/selection/pickable/pickable.field.module.mjs +93 -0
  58. package/esm2022/lib/formly/field/selection/pickable/pickable.list.field.component.mjs +116 -0
  59. package/{esm2020 → esm2022}/lib/formly/field/selection/pickable/pickable.mjs +1 -1
  60. package/esm2022/lib/formly/field/selection/searchable/searchable.chip.field.component.mjs +68 -0
  61. package/esm2022/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.mjs +95 -0
  62. package/esm2022/lib/formly/field/selection/searchable/searchable.field.directive.mjs +278 -0
  63. package/esm2022/lib/formly/field/selection/searchable/searchable.field.module.mjs +91 -0
  64. package/{esm2020 → esm2022}/lib/formly/field/selection/searchable/searchable.text.field.component.mjs +4 -4
  65. package/esm2022/lib/formly/field/selection/selection.field.mjs +39 -0
  66. package/{esm2020 → esm2022}/lib/formly/field/selection/selection.mjs +1 -1
  67. package/{esm2020 → esm2022}/lib/formly/field/selection/selection.module.mjs +5 -5
  68. package/{esm2020 → esm2022}/lib/formly/field/selection/sourceselect/sourceselect.field.component.mjs +4 -4
  69. package/esm2022/lib/formly/field/selection/sourceselect/sourceselect.field.module.mjs +93 -0
  70. package/{esm2020 → esm2022}/lib/formly/field/texteditor/texteditor.field.component.mjs +6 -6
  71. package/esm2022/lib/formly/field/texteditor/texteditor.field.module.mjs +51 -0
  72. package/{esm2020 → esm2022}/lib/formly/field/value/array/array.field.component.mjs +8 -8
  73. package/esm2022/lib/formly/field/value/array/array.field.module.mjs +62 -0
  74. package/esm2022/lib/formly/field/value/boolean/boolean.field.mjs +47 -0
  75. package/{esm2020 → esm2022}/lib/formly/field/value/boolean/boolean.field.module.mjs +5 -5
  76. package/esm2022/lib/formly/field/value/date/date.field.module.mjs +96 -0
  77. package/esm2022/lib/formly/field/value/date/datetime.field.component.mjs +488 -0
  78. package/esm2022/lib/formly/field/value/date/datetime.field.mjs +141 -0
  79. package/{esm2020 → esm2022}/lib/formly/field/value/date/datetime.field.service.mjs +9 -9
  80. package/esm2022/lib/formly/field/value/date/fixeddaterange.field.component.mjs +506 -0
  81. package/{esm2020 → esm2022}/lib/formly/field/value/number/number.field.module.mjs +5 -5
  82. package/esm2022/lib/formly/field/value/phone/phone.field.component.mjs +100 -0
  83. package/esm2022/lib/formly/field/value/phone/phone.field.module.mjs +66 -0
  84. package/{esm2020 → esm2022}/lib/formly/field/value/text/text.field.module.mjs +5 -5
  85. package/{esm2020 → esm2022}/lib/formly/field/value/value.module.mjs +5 -5
  86. package/{esm2020 → esm2022}/lib/formly/field/wrapper/autotouch.wrapper.component.mjs +6 -6
  87. package/{esm2020 → esm2022}/lib/formly/field/wrapper/expandable.wrapper.component.mjs +6 -6
  88. package/{esm2020 → esm2022}/lib/formly/field/wrapper/expandable.wrapper.delegate.mjs +4 -4
  89. package/{esm2020 → esm2022}/lib/formly/field/wrapper/flex.wrapper.component.mjs +6 -6
  90. package/esm2022/lib/formly/field/wrapper/form.wrapper.module.mjs +86 -0
  91. package/{esm2020 → esm2022}/lib/formly/field/wrapper/info.wrapper.component.mjs +7 -7
  92. package/esm2022/lib/formly/field/wrapper/section.wrapper.component.mjs +27 -0
  93. package/{esm2020 → esm2022}/lib/formly/field/wrapper/style.wrapper.component.mjs +7 -7
  94. package/esm2022/lib/formly/field/wrapper/subsection.wrapper.component.mjs +27 -0
  95. package/{esm2020 → esm2022}/lib/formly/field/wrapper/toggle.wrapper.component.mjs +6 -6
  96. package/{esm2020 → esm2022}/lib/formly/field/wrapper/working.wrapper.component.mjs +6 -6
  97. package/esm2022/lib/formly/field/wrapper/wrapper.mjs +73 -0
  98. package/{esm2020 → esm2022}/lib/formly/form/form.form.module.mjs +5 -5
  99. package/{esm2020 → esm2022}/lib/formly/form/search.form.component.mjs +6 -6
  100. package/{esm2020 → esm2022}/lib/formly/formly.context.directive.mjs +4 -4
  101. package/esm2022/lib/formly/formly.context.mjs +100 -0
  102. package/{esm2020 → esm2022}/lib/formly/formly.directive.mjs +16 -16
  103. package/{esm2020 → esm2022}/lib/formly/formly.form.component.mjs +6 -6
  104. package/{esm2020 → esm2022}/lib/formly/formly.module.mjs +16 -16
  105. package/{esm2020 → esm2022}/lib/layout/form.layout.module.mjs +5 -5
  106. package/{esm2020 → esm2022}/lib/layout/form.spacer.component.mjs +6 -6
  107. package/{esm2020 → esm2022}/mapbox/lib/field/latlng/latlng.field.component.mjs +10 -10
  108. package/{esm2020 → esm2022}/mapbox/lib/field/latlng/latlng.field.marker.component.mjs +6 -6
  109. package/esm2022/mapbox/lib/field/latlng/latlng.field.mjs +35 -0
  110. package/esm2022/mapbox/lib/field/latlng/latlng.module.mjs +59 -0
  111. package/{mapbox/esm2020 → esm2022/mapbox}/lib/field/zoom/zoom.field.component.mjs +10 -10
  112. package/esm2022/mapbox/lib/field/zoom/zoom.field.mjs +23 -0
  113. package/esm2022/mapbox/lib/field/zoom/zoom.module.mjs +57 -0
  114. package/{mapbox/esm2020 → esm2022/mapbox}/lib/mapbox.module.mjs +5 -5
  115. package/{fesm2020 → fesm2022}/dereekb-dbx-form-calendar.mjs +188 -228
  116. package/fesm2022/dereekb-dbx-form-calendar.mjs.map +1 -0
  117. package/{mapbox/fesm2020 → fesm2022}/dereekb-dbx-form-mapbox.mjs +76 -76
  118. package/fesm2022/dereekb-dbx-form-mapbox.mjs.map +1 -0
  119. package/{fesm2020 → fesm2022}/dereekb-dbx-form.mjs +820 -831
  120. package/fesm2022/dereekb-dbx-form.mjs.map +1 -0
  121. package/lib/extension/_extension.scss +11 -6
  122. package/lib/extension/calendar/_calendar.scss +7 -5
  123. package/lib/form/_form.scss +3 -2
  124. package/lib/form/action/form.action.directive.d.ts +2 -2
  125. package/lib/form/action/transition/form.action.transition.safety.directive.d.ts +1 -1
  126. package/lib/form/form.angular.util.d.ts +1 -1
  127. package/lib/form/form.d.ts +1 -1
  128. package/lib/form/io/form.changes.directive.d.ts +1 -1
  129. package/lib/form/io/form.input.directive.d.ts +2 -2
  130. package/lib/form/io/form.loading.directive.d.ts +1 -1
  131. package/lib/formly/_formly.scss +7 -9
  132. package/lib/formly/field/_field.scss +7 -7
  133. package/lib/formly/field/checklist/_checklist.scss +3 -2
  134. package/lib/formly/field/checklist/checklist.field.d.ts +4 -4
  135. package/lib/formly/field/checklist/checklist.item.d.ts +1 -1
  136. package/lib/formly/field/checklist/checklist.item.field.component.d.ts +2 -2
  137. package/lib/formly/field/checklist/checklist.item.field.content.default.component.d.ts +4 -4
  138. package/lib/formly/field/checklist/checklist.item.field.d.ts +1 -1
  139. package/lib/formly/field/component/_component.scss +3 -2
  140. package/lib/formly/field/component/component.field.component.d.ts +2 -2
  141. package/lib/formly/field/component/component.field.d.ts +1 -1
  142. package/lib/formly/field/field.d.ts +5 -11
  143. package/lib/formly/field/selection/_selection.scss +5 -5
  144. package/lib/formly/field/selection/list/_list.scss +3 -2
  145. package/lib/formly/field/selection/list/list.field.component.d.ts +1 -1
  146. package/lib/formly/field/selection/pickable/_pickable.scss +3 -9
  147. package/lib/formly/field/selection/pickable/pickable.chip.field.component.d.ts +1 -1
  148. package/lib/formly/field/selection/pickable/pickable.d.ts +6 -22
  149. package/lib/formly/field/selection/pickable/pickable.field.directive.d.ts +3 -3
  150. package/lib/formly/field/selection/pickable/pickable.list.field.component.d.ts +4 -4
  151. package/lib/formly/field/selection/pickable/pickable.util.d.ts +2 -2
  152. package/lib/formly/field/selection/searchable/_searchable.scss +5 -5
  153. package/lib/formly/field/selection/searchable/searchable.chip.field.component.d.ts +1 -1
  154. package/lib/formly/field/selection/searchable/searchable.d.ts +4 -4
  155. package/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.d.ts +3 -3
  156. package/lib/formly/field/selection/searchable/searchable.field.d.ts +1 -1
  157. package/lib/formly/field/selection/searchable/searchable.field.directive.d.ts +1 -1
  158. package/lib/formly/field/selection/searchable/searchable.text.field.component.d.ts +1 -1
  159. package/lib/formly/field/selection/selection.d.ts +1 -5
  160. package/lib/formly/field/selection/selection.field.d.ts +1 -1
  161. package/lib/formly/field/selection/sourceselect/_sourceselect.scss +6 -15
  162. package/lib/formly/field/selection/sourceselect/sourceselect.d.ts +6 -6
  163. package/lib/formly/field/selection/sourceselect/sourceselect.field.component.d.ts +1 -1
  164. package/lib/formly/field/selection/sourceselect/sourceselect.field.module.d.ts +1 -1
  165. package/lib/formly/field/texteditor/_texteditor.scss +3 -2
  166. package/lib/formly/field/texteditor/texteditor.field.component.d.ts +2 -2
  167. package/lib/formly/field/value/_value.scss +10 -6
  168. package/lib/formly/field/value/array/_array.scss +7 -2
  169. package/lib/formly/field/value/array/array.field.component.d.ts +2 -2
  170. package/lib/formly/field/value/boolean/_boolean.scss +5 -4
  171. package/lib/formly/field/value/date/_date.scss +20 -37
  172. package/lib/formly/field/value/date/date.field.module.d.ts +1 -1
  173. package/lib/formly/field/value/date/datetime.field.component.d.ts +3 -13
  174. package/lib/formly/field/value/date/datetime.field.d.ts +5 -5
  175. package/lib/formly/field/value/date/fixeddaterange.field.component.d.ts +7 -7
  176. package/lib/formly/field/value/hidden.field.d.ts +1 -1
  177. package/lib/formly/field/value/number/_number.scss +35 -0
  178. package/lib/formly/field/value/number/number.field.d.ts +3 -3
  179. package/lib/formly/field/value/phone/_phone.scss +4 -3
  180. package/lib/formly/field/value/phone/phone.field.component.d.ts +1 -1
  181. package/lib/formly/field/value/phone/phone.field.module.d.ts +1 -1
  182. package/lib/formly/field/value/text/_text.scss +3 -2
  183. package/lib/formly/field/value/text/text.additional.field.d.ts +3 -3
  184. package/lib/formly/field/value/text/text.field.d.ts +2 -2
  185. package/lib/formly/field/wrapper/_wrapper.scss +5 -4
  186. package/lib/formly/field/wrapper/autotouch.wrapper.component.d.ts +1 -1
  187. package/lib/formly/field/wrapper/expandable.wrapper.component.d.ts +2 -2
  188. package/lib/formly/field/wrapper/expandable.wrapper.delegate.d.ts +1 -1
  189. package/lib/formly/field/wrapper/flex.wrapper.component.d.ts +1 -1
  190. package/lib/formly/field/wrapper/form.wrapper.module.d.ts +1 -1
  191. package/lib/formly/field/wrapper/info.wrapper.component.d.ts +1 -1
  192. package/lib/formly/field/wrapper/section.wrapper.component.d.ts +2 -2
  193. package/lib/formly/field/wrapper/style.wrapper.component.d.ts +2 -2
  194. package/lib/formly/field/wrapper/subsection.wrapper.component.d.ts +2 -2
  195. package/lib/formly/field/wrapper/toggle.wrapper.component.d.ts +1 -1
  196. package/lib/formly/field/wrapper/working.wrapper.component.d.ts +2 -2
  197. package/lib/formly/field/wrapper/wrapper.d.ts +1 -1
  198. package/lib/formly/form/_form.scss +17 -4
  199. package/lib/formly/form/search.form.component.d.ts +1 -1
  200. package/lib/formly/formly.context.directive.d.ts +1 -1
  201. package/lib/formly/formly.directive.d.ts +4 -4
  202. package/lib/formly/formly.form.component.d.ts +1 -1
  203. package/lib/formly/template/login.d.ts +1 -1
  204. package/lib/formly/template/timezone.d.ts +1 -1
  205. package/lib/layout/_layout.scss +3 -2
  206. package/lib/layout/form.spacer.component.d.ts +1 -1
  207. package/lib/style/_all-typography.scss +11 -3
  208. package/lib/style/_core.scss +1 -2
  209. package/lib/style/_mixin.scss +10 -0
  210. package/lib/style/_theming.scss +1 -1
  211. package/lib/validator/available.d.ts +1 -1
  212. package/mapbox/{esm2020 → esm2022}/lib/field/latlng/latlng.field.component.mjs +10 -10
  213. package/mapbox/{esm2020 → esm2022}/lib/field/latlng/latlng.field.marker.component.mjs +6 -6
  214. package/mapbox/esm2022/lib/field/latlng/latlng.field.mjs +35 -0
  215. package/mapbox/esm2022/lib/field/latlng/latlng.module.mjs +59 -0
  216. package/{esm2020/mapbox → mapbox/esm2022}/lib/field/zoom/zoom.field.component.mjs +10 -10
  217. package/mapbox/esm2022/lib/field/zoom/zoom.field.mjs +23 -0
  218. package/mapbox/esm2022/lib/field/zoom/zoom.module.mjs +57 -0
  219. package/{esm2020/mapbox → mapbox/esm2022}/lib/mapbox.module.mjs +5 -5
  220. package/{fesm2020 → mapbox/fesm2022}/dereekb-dbx-form-mapbox.mjs +76 -76
  221. package/mapbox/fesm2022/dereekb-dbx-form-mapbox.mjs.map +1 -0
  222. package/mapbox/lib/field/latlng/latlng.field.component.d.ts +1 -1
  223. package/mapbox/lib/field/latlng/latlng.field.marker.component.d.ts +1 -1
  224. package/mapbox/lib/field/zoom/zoom.field.component.d.ts +1 -1
  225. package/mapbox/package.json +10 -28
  226. package/package.json +31 -31
  227. package/esm2020/calendar/lib/calendar.module.mjs +0 -155
  228. package/esm2020/calendar/lib/calendar.schedule.selection.dialog.button.component.mjs +0 -38
  229. package/esm2020/calendar/lib/calendar.schedule.selection.dialog.component.mjs +0 -65
  230. package/esm2020/calendar/lib/calendar.schedule.selection.popover.component.mjs +0 -37
  231. package/esm2020/calendar/lib/calendar.schedule.selection.range.component.mjs +0 -188
  232. package/esm2020/calendar/lib/calendar.schedule.selection.store.mjs +0 -814
  233. package/esm2020/calendar/lib/field/schedule/calendar.schedule.field.component.mjs +0 -158
  234. package/esm2020/calendar/lib/field/schedule/calendar.schedule.field.mjs +0 -29
  235. package/esm2020/calendar/lib/field/schedule/calendar.schedule.module.mjs +0 -58
  236. package/esm2020/lib/formly/field/checklist/checklist.item.field.module.mjs +0 -67
  237. package/esm2020/lib/formly/field/component/component.field.module.mjs +0 -32
  238. package/esm2020/lib/formly/field/field.mjs +0 -103
  239. package/esm2020/lib/formly/field/selection/list/list.field.module.mjs +0 -76
  240. package/esm2020/lib/formly/field/selection/pickable/pickable.chip.field.component.mjs +0 -33
  241. package/esm2020/lib/formly/field/selection/pickable/pickable.field.module.mjs +0 -93
  242. package/esm2020/lib/formly/field/selection/pickable/pickable.list.field.component.mjs +0 -116
  243. package/esm2020/lib/formly/field/selection/searchable/searchable.chip.field.component.mjs +0 -68
  244. package/esm2020/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.mjs +0 -95
  245. package/esm2020/lib/formly/field/selection/searchable/searchable.field.directive.mjs +0 -278
  246. package/esm2020/lib/formly/field/selection/searchable/searchable.field.module.mjs +0 -91
  247. package/esm2020/lib/formly/field/selection/selection.field.mjs +0 -39
  248. package/esm2020/lib/formly/field/selection/sourceselect/sourceselect.field.module.mjs +0 -93
  249. package/esm2020/lib/formly/field/texteditor/texteditor.field.module.mjs +0 -51
  250. package/esm2020/lib/formly/field/value/array/array.field.module.mjs +0 -62
  251. package/esm2020/lib/formly/field/value/boolean/boolean.field.mjs +0 -47
  252. package/esm2020/lib/formly/field/value/date/date.field.module.mjs +0 -96
  253. package/esm2020/lib/formly/field/value/date/datetime.field.component.mjs +0 -488
  254. package/esm2020/lib/formly/field/value/date/datetime.field.mjs +0 -143
  255. package/esm2020/lib/formly/field/value/date/fixeddaterange.field.component.mjs +0 -506
  256. package/esm2020/lib/formly/field/value/phone/phone.field.component.mjs +0 -100
  257. package/esm2020/lib/formly/field/value/phone/phone.field.module.mjs +0 -66
  258. package/esm2020/lib/formly/field/wrapper/form.wrapper.module.mjs +0 -86
  259. package/esm2020/lib/formly/field/wrapper/section.wrapper.component.mjs +0 -26
  260. package/esm2020/lib/formly/field/wrapper/subsection.wrapper.component.mjs +0 -26
  261. package/esm2020/lib/formly/field/wrapper/wrapper.mjs +0 -78
  262. package/esm2020/lib/formly/formly.context.mjs +0 -100
  263. package/esm2020/mapbox/lib/field/latlng/latlng.field.mjs +0 -35
  264. package/esm2020/mapbox/lib/field/latlng/latlng.module.mjs +0 -59
  265. package/esm2020/mapbox/lib/field/zoom/zoom.field.mjs +0 -23
  266. package/esm2020/mapbox/lib/field/zoom/zoom.module.mjs +0 -57
  267. package/fesm2015/dereekb-dbx-form-calendar.mjs +0 -1955
  268. package/fesm2015/dereekb-dbx-form-calendar.mjs.map +0 -1
  269. package/fesm2015/dereekb-dbx-form-mapbox.mjs +0 -585
  270. package/fesm2015/dereekb-dbx-form-mapbox.mjs.map +0 -1
  271. package/fesm2015/dereekb-dbx-form.mjs +0 -6205
  272. package/fesm2015/dereekb-dbx-form.mjs.map +0 -1
  273. package/fesm2020/dereekb-dbx-form-calendar.mjs.map +0 -1
  274. package/fesm2020/dereekb-dbx-form-mapbox.mjs.map +0 -1
  275. package/fesm2020/dereekb-dbx-form.mjs.map +0 -1
  276. package/mapbox/esm2020/lib/field/latlng/latlng.field.mjs +0 -35
  277. package/mapbox/esm2020/lib/field/latlng/latlng.module.mjs +0 -59
  278. package/mapbox/esm2020/lib/field/zoom/zoom.field.mjs +0 -23
  279. package/mapbox/esm2020/lib/field/zoom/zoom.module.mjs +0 -57
  280. package/mapbox/fesm2015/dereekb-dbx-form-mapbox.mjs +0 -585
  281. package/mapbox/fesm2015/dereekb-dbx-form-mapbox.mjs.map +0 -1
  282. package/mapbox/fesm2020/dereekb-dbx-form-mapbox.mjs.map +0 -1
  283. /package/{esm2020 → esm2022}/calendar/dereekb-dbx-form-calendar.mjs +0 -0
  284. /package/{esm2020 → esm2022}/calendar/index.mjs +0 -0
  285. /package/{esm2020 → esm2022}/calendar/lib/calendar.schedule.selection.form.mjs +0 -0
  286. /package/{esm2020 → esm2022}/calendar/lib/field/index.mjs +0 -0
  287. /package/{esm2020 → esm2022}/calendar/lib/field/schedule/index.mjs +0 -0
  288. /package/{esm2020 → esm2022}/calendar/lib/index.mjs +0 -0
  289. /package/{esm2020 → esm2022}/dereekb-dbx-form.mjs +0 -0
  290. /package/{esm2020 → esm2022}/index.mjs +0 -0
  291. /package/{esm2020 → esm2022}/lib/form/action/index.mjs +0 -0
  292. /package/{esm2020 → esm2022}/lib/form/action/transition/index.mjs +0 -0
  293. /package/{esm2020 → esm2022}/lib/form/form.angular.util.mjs +0 -0
  294. /package/{esm2020 → esm2022}/lib/form/form.mjs +0 -0
  295. /package/{esm2020 → esm2022}/lib/form/index.mjs +0 -0
  296. /package/{esm2020 → esm2022}/lib/form/io/index.mjs +0 -0
  297. /package/{esm2020 → esm2022}/lib/formly/config/index.mjs +0 -0
  298. /package/{esm2020 → esm2022}/lib/formly/config/validation.mjs +0 -0
  299. /package/{esm2020 → esm2022}/lib/formly/field/checklist/checklist.field.mjs +0 -0
  300. /package/{esm2020 → esm2022}/lib/formly/field/checklist/checklist.item.field.mjs +0 -0
  301. /package/{esm2020 → esm2022}/lib/formly/field/checklist/checklist.item.mjs +0 -0
  302. /package/{esm2020 → esm2022}/lib/formly/field/checklist/index.mjs +0 -0
  303. /package/{esm2020 → esm2022}/lib/formly/field/component/component.field.mjs +0 -0
  304. /package/{esm2020 → esm2022}/lib/formly/field/component/index.mjs +0 -0
  305. /package/{esm2020 → esm2022}/lib/formly/field/index.mjs +0 -0
  306. /package/{esm2020 → esm2022}/lib/formly/field/selection/index.mjs +0 -0
  307. /package/{esm2020 → esm2022}/lib/formly/field/selection/list/index.mjs +0 -0
  308. /package/{esm2020 → esm2022}/lib/formly/field/selection/list/list.field.mjs +0 -0
  309. /package/{esm2020 → esm2022}/lib/formly/field/selection/pickable/index.mjs +0 -0
  310. /package/{esm2020 → esm2022}/lib/formly/field/selection/pickable/pickable.field.mjs +0 -0
  311. /package/{esm2020 → esm2022}/lib/formly/field/selection/pickable/pickable.util.mjs +0 -0
  312. /package/{esm2020 → esm2022}/lib/formly/field/selection/searchable/index.mjs +0 -0
  313. /package/{esm2020 → esm2022}/lib/formly/field/selection/searchable/searchable.field.mjs +0 -0
  314. /package/{esm2020 → esm2022}/lib/formly/field/selection/searchable/searchable.mjs +0 -0
  315. /package/{esm2020 → esm2022}/lib/formly/field/selection/searchable/text.chip.field.mjs +0 -0
  316. /package/{esm2020 → esm2022}/lib/formly/field/selection/sourceselect/index.mjs +0 -0
  317. /package/{esm2020 → esm2022}/lib/formly/field/selection/sourceselect/sourceselect.field.mjs +0 -0
  318. /package/{esm2020 → esm2022}/lib/formly/field/selection/sourceselect/sourceselect.mjs +0 -0
  319. /package/{esm2020 → esm2022}/lib/formly/field/texteditor/index.mjs +0 -0
  320. /package/{esm2020 → esm2022}/lib/formly/field/texteditor/texteditor.field.mjs +0 -0
  321. /package/{esm2020 → esm2022}/lib/formly/field/value/array/array.field.mjs +0 -0
  322. /package/{esm2020 → esm2022}/lib/formly/field/value/array/index.mjs +0 -0
  323. /package/{esm2020 → esm2022}/lib/formly/field/value/boolean/index.mjs +0 -0
  324. /package/{esm2020 → esm2022}/lib/formly/field/value/date/date.value.mjs +0 -0
  325. /package/{esm2020 → esm2022}/lib/formly/field/value/date/datetime.mjs +0 -0
  326. /package/{esm2020 → esm2022}/lib/formly/field/value/date/datetime.preset.mjs +0 -0
  327. /package/{esm2020 → esm2022}/lib/formly/field/value/date/index.mjs +0 -0
  328. /package/{esm2020 → esm2022}/lib/formly/field/value/hidden.field.mjs +0 -0
  329. /package/{esm2020 → esm2022}/lib/formly/field/value/index.mjs +0 -0
  330. /package/{esm2020 → esm2022}/lib/formly/field/value/number/index.mjs +0 -0
  331. /package/{esm2020 → esm2022}/lib/formly/field/value/number/number.field.mjs +0 -0
  332. /package/{esm2020 → esm2022}/lib/formly/field/value/phone/index.mjs +0 -0
  333. /package/{esm2020 → esm2022}/lib/formly/field/value/phone/phone.field.mjs +0 -0
  334. /package/{esm2020 → esm2022}/lib/formly/field/value/text/index.mjs +0 -0
  335. /package/{esm2020 → esm2022}/lib/formly/field/value/text/text.additional.field.mjs +0 -0
  336. /package/{esm2020 → esm2022}/lib/formly/field/value/text/text.address.field.mjs +0 -0
  337. /package/{esm2020 → esm2022}/lib/formly/field/value/text/text.field.mjs +0 -0
  338. /package/{esm2020 → esm2022}/lib/formly/field/wrapper/index.mjs +0 -0
  339. /package/{esm2020 → esm2022}/lib/formly/form/form.form.mjs +0 -0
  340. /package/{esm2020 → esm2022}/lib/formly/form/index.mjs +0 -0
  341. /package/{esm2020 → esm2022}/lib/formly/index.mjs +0 -0
  342. /package/{esm2020 → esm2022}/lib/formly/template/available.mjs +0 -0
  343. /package/{esm2020 → esm2022}/lib/formly/template/index.mjs +0 -0
  344. /package/{esm2020 → esm2022}/lib/formly/template/login.mjs +0 -0
  345. /package/{esm2020 → esm2022}/lib/formly/template/timezone.mjs +0 -0
  346. /package/{esm2020 → esm2022}/lib/index.mjs +0 -0
  347. /package/{esm2020 → esm2022}/lib/layout/index.mjs +0 -0
  348. /package/{esm2020 → esm2022}/lib/validator/available.mjs +0 -0
  349. /package/{esm2020 → esm2022}/lib/validator/boolean.mjs +0 -0
  350. /package/{esm2020 → esm2022}/lib/validator/email.mjs +0 -0
  351. /package/{esm2020 → esm2022}/lib/validator/field.mjs +0 -0
  352. /package/{esm2020 → esm2022}/lib/validator/index.mjs +0 -0
  353. /package/{esm2020 → esm2022}/lib/validator/number.mjs +0 -0
  354. /package/{esm2020 → esm2022}/lib/validator/phone.mjs +0 -0
  355. /package/{esm2020 → esm2022}/mapbox/dereekb-dbx-form-mapbox.mjs +0 -0
  356. /package/{esm2020 → esm2022}/mapbox/index.mjs +0 -0
  357. /package/{esm2020 → esm2022}/mapbox/lib/field/index.mjs +0 -0
  358. /package/{esm2020 → esm2022}/mapbox/lib/field/latlng/index.mjs +0 -0
  359. /package/{esm2020 → esm2022}/mapbox/lib/field/zoom/index.mjs +0 -0
  360. /package/mapbox/{esm2020 → esm2022}/dereekb-dbx-form-mapbox.mjs +0 -0
  361. /package/mapbox/{esm2020 → esm2022}/index.mjs +0 -0
  362. /package/mapbox/{esm2020 → esm2022}/lib/field/index.mjs +0 -0
  363. /package/mapbox/{esm2020 → esm2022}/lib/field/latlng/index.mjs +0 -0
  364. /package/mapbox/{esm2020 → esm2022}/lib/field/zoom/index.mjs +0 -0
@@ -1,506 +0,0 @@
1
- import { isMonthDaySlashDate, MS_IN_MINUTE } from '@dereekb/util';
2
- import { guessCurrentTimezone, dateTimeMinuteDecisionFunction, dateTimezoneUtcNormal, isSameDateDayRange, dateRange, isDateInDateRange, clampDateRangeToDateRange, isSameDateRange, isSameDateDay, limitDateTimeInstance } from '@dereekb/date';
3
- import { switchMap, shareReplay, map, startWith, distinctUntilChanged, debounceTime, throttleTime, BehaviorSubject, Subject, of, combineLatestWith, filter, combineLatest, scan, first, timer } from 'rxjs';
4
- import { Component, ElementRef, Injectable, ViewChild, forwardRef } from '@angular/core';
5
- import { FormControl, FormGroup } from '@angular/forms';
6
- import { FieldType } from '@ngx-formly/material';
7
- import { MAT_DATE_RANGE_SELECTION_STRATEGY, DateRange as DatePickerDateRange, MatCalendar } from '@angular/material/datepicker';
8
- import { asObservableFromGetter, filterMaybe, skipFirstMaybe, SubscriptionObject, switchMapMaybeDefault } from '@dereekb/rxjs';
9
- import { DbxDateTimeValueMode, dbxDateRangeIsSameDateRangeFieldValue, dbxDateTimeInputValueParseFactory, dbxDateTimeOutputValueFactory } from './date.value';
10
- import { DbxDateTimeFieldMenuPresetsService } from './datetime.field.service';
11
- import { DateAdapter } from '@angular/material/core';
12
- import { isAfter } from 'date-fns';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "./datetime.field.service";
15
- import * as i2 from "@angular/common";
16
- import * as i3 from "@angular/forms";
17
- import * as i4 from "@angular/material/form-field";
18
- import * as i5 from "@angular/material/datepicker";
19
- import * as i6 from "@angular/flex-layout/extended";
20
- import * as i7 from "@angular/material/core";
21
- function dbxFixedDateRangeInputValueFactory(mode, timezoneInstance) {
22
- const dateInputTransformer = dbxDateTimeInputValueParseFactory(mode, timezoneInstance);
23
- return (y) => {
24
- let result;
25
- if (y) {
26
- result = {
27
- start: dateInputTransformer(y.start),
28
- end: dateInputTransformer(y.end)
29
- };
30
- }
31
- return result;
32
- };
33
- }
34
- function dbxFixedDateRangeOutputValueFactory(mode, timezoneInstance) {
35
- const dateOutputTransformer = dbxDateTimeOutputValueFactory(mode, timezoneInstance);
36
- return (y) => {
37
- let result;
38
- if (y) {
39
- result = {
40
- start: dateOutputTransformer(y.start),
41
- end: dateOutputTransformer(y.end)
42
- };
43
- }
44
- return result;
45
- };
46
- }
47
- const TIME_OUTPUT_THROTTLE_TIME = 10;
48
- export class DbxFixedDateRangeFieldComponent extends FieldType {
49
- constructor(dbxDateTimeFieldConfigService) {
50
- super();
51
- this.dbxDateTimeFieldConfigService = dbxDateTimeFieldConfigService;
52
- this._sub = new SubscriptionObject();
53
- this._inputRangeFormSub = new SubscriptionObject();
54
- this._inputRangeFormValueSub = new SubscriptionObject();
55
- this._dateRangeInputSub = new SubscriptionObject();
56
- this._currentSelectionModeSub = new SubscriptionObject();
57
- this._latestBoundarySub = new SubscriptionObject();
58
- this._disableEndSub = new SubscriptionObject();
59
- this._activeDateSub = new SubscriptionObject();
60
- this._currentDateRangeInput = {};
61
- this._currentSelectionMode = 'single';
62
- this._latestBoundary = null;
63
- this._config = new BehaviorSubject(undefined);
64
- this._selectionMode = new BehaviorSubject(undefined);
65
- this._dateRangeInput = new BehaviorSubject(undefined);
66
- this._timezone = new BehaviorSubject(undefined);
67
- this._presets = new BehaviorSubject(of([]));
68
- this._selectionEvent = new Subject();
69
- this.selectedDateRange$ = this._selectionEvent.pipe(map((x) => x.range));
70
- this._formControlObs = new BehaviorSubject(undefined);
71
- this.formControl$ = this._formControlObs.pipe(filterMaybe());
72
- this.config$ = this._config.pipe(filterMaybe(), switchMap((x) => x), distinctUntilChanged(), shareReplay(1));
73
- this.limitDateTimeInstance$ = this.config$.pipe(map(limitDateTimeInstance), shareReplay(1));
74
- this.selectionMode$ = this._selectionMode.pipe(switchMapMaybeDefault('single'), map((x) => x ?? 'single'), distinctUntilChanged(), shareReplay(1));
75
- this.dateRangeInput$ = this._dateRangeInput.pipe(switchMapMaybeDefault(), shareReplay(1));
76
- this.timezone$ = this._timezone.pipe(switchMapMaybeDefault(), distinctUntilChanged()).pipe(map((defaultTimezone) => {
77
- return defaultTimezone ?? guessCurrentTimezone();
78
- }), distinctUntilChanged(), shareReplay(1));
79
- this.timezoneInstance$ = this.timezone$.pipe(map((timezone) => (timezone ? dateTimezoneUtcNormal({ timezone }) : undefined)), shareReplay(1));
80
- this.valueInSystemTimezone$ = this.formControl$.pipe(map((control) => control.valueChanges.pipe(startWith(control.value), shareReplay(1))), combineLatestWith(this.timezoneInstance$), switchMap(([x, timezoneInstance]) => {
81
- return x.pipe(map(dbxFixedDateRangeInputValueFactory(this.valueMode, timezoneInstance)));
82
- }), throttleTime(20, undefined, { leading: false, trailing: true }), // throttle incoming values and timezone changes
83
- distinctUntilChanged(isSameDateDayRange), shareReplay(1));
84
- this.fullBoundary$ = this.dateRangeSelectionForMode('single').pipe(shareReplay(1));
85
- this.latestBoundary$ = this.selectionMode$.pipe(switchMap((mode) => {
86
- if (mode === 'arbitrary_quick') {
87
- // in arbitrary_quick mode, the latest value is the boundary, since we always set the value immediately.
88
- return this.valueInSystemTimezone$;
89
- }
90
- else {
91
- return this.fullBoundary$;
92
- }
93
- }));
94
- /**
95
- * Focuses on the date any time the selection event from the picker occured, otherwise use the system value
96
- */
97
- this.calendarFocusDate$ = this._selectionEvent.pipe(startWith(null)).pipe(switchMap((selectionEvent) => {
98
- if (selectionEvent && selectionEvent.type === 'calendar' && selectionEvent.range?.start) {
99
- return of(selectionEvent.range.start);
100
- }
101
- else {
102
- return this.fullBoundary$.pipe(first(), map((fullBoundary) => {
103
- return fullBoundary?.start ?? selectionEvent?.range?.start;
104
- }));
105
- }
106
- }), filterMaybe(), shareReplay(1));
107
- this.dateRangeSelection$ = this.selectionMode$.pipe(switchMap((mode) => this.dateRangeSelectionForMode(mode)));
108
- this.calendarSelection$ = this.valueInSystemTimezone$.pipe(map((x) => (x ? new DatePickerDateRange(x.start, x.end) : null)), shareReplay(1));
109
- this.endDisabled$ = this.selectionMode$.pipe(map((x) => x === 'single'), distinctUntilChanged(), shareReplay(1));
110
- this.inputRangeForm = new FormGroup({
111
- start: new FormControl(null),
112
- end: new FormControl(null)
113
- });
114
- this.minMaxRange$ = this.limitDateTimeInstance$.pipe(combineLatestWith(timer(MS_IN_MINUTE)), // refresh every minute
115
- map(([x]) => x.dateRange()), distinctUntilChanged(isSameDateDayRange), shareReplay(1));
116
- this.min$ = this.minMaxRange$.pipe(map((x) => x?.start ?? null), distinctUntilChanged(), shareReplay(1));
117
- this.max$ = this.minMaxRange$.pipe(map((x) => x?.end ?? null), distinctUntilChanged(), shareReplay(1));
118
- this.pickerFilter$ = this.config$.pipe(distinctUntilChanged(), map((x) => {
119
- if (x) {
120
- const filter = dateTimeMinuteDecisionFunction(x);
121
- return (x) => (x != null ? filter(x) : true);
122
- }
123
- else {
124
- return () => true;
125
- }
126
- }), shareReplay(1));
127
- this.defaultPickerFilter = () => true;
128
- }
129
- get currentDateRangeInput() {
130
- return this._currentDateRangeInput;
131
- }
132
- get currentSelectionMode() {
133
- return this._currentSelectionMode;
134
- }
135
- get latestBoundary() {
136
- return this._latestBoundary;
137
- }
138
- dateRangeSelectionForMode(mode) {
139
- const result = combineLatest([this.dateRangeInput$, this.limitDateTimeInstance$]).pipe(switchMap(([dateRangeInput, limitInstance]) => {
140
- const hasDateRangeConfiguration = Boolean(dateRangeInput);
141
- const minMaxClamp = (dateRange) => limitInstance.clampDateRange(dateRange);
142
- if (mode === 'single') {
143
- // only use the start date.
144
- return this.selectedDateRange$.pipe(distinctUntilChanged(isSameDateDayRange), map((inputDateRange) => {
145
- const date = inputDateRange?.start;
146
- return date ? minMaxClamp(dateRange({ ...dateRangeInput, date })) : null;
147
- }));
148
- }
149
- else {
150
- // take the first date, then wait unless the date is outside of the range.
151
- return this.selectedDateRange$.pipe(scan((acc, nextDateRange) => {
152
- let result;
153
- let pickType = 'start';
154
- if (nextDateRange && nextDateRange.start != null) {
155
- const { start: startOrNextDate, end } = nextDateRange;
156
- const potentialBoundary = dateRange({ ...dateRangeInput, date: startOrNextDate });
157
- // only comes through when passed by the text inputs
158
- if (startOrNextDate && end) {
159
- const range = clampDateRangeToDateRange(nextDateRange, potentialBoundary);
160
- result = {
161
- lastDateRange: nextDateRange,
162
- boundary: range,
163
- range
164
- };
165
- }
166
- else {
167
- let range = undefined;
168
- let boundary = potentialBoundary;
169
- if (mode === 'normal') {
170
- if (!hasDateRangeConfiguration) {
171
- // if there is no configured range/boundary, then just set the pick type based on the last type
172
- boundary = undefined;
173
- pickType = acc.lastPickType === 'start' ? 'end' : 'start';
174
- }
175
- else {
176
- // if the pick is outside the boundary, then consider it a start pick type.
177
- pickType = acc.lastPickType === 'start' && acc.boundary && isDateInDateRange(startOrNextDate, acc.boundary) ? 'end' : 'start';
178
- }
179
- // assert the start exists from the previous click, otherwise clear it.
180
- if (pickType === 'end') {
181
- const lastStart = acc.lastDateRange?.start;
182
- if (!lastStart || !isAfter(startOrNextDate, lastStart)) {
183
- pickType = 'start';
184
- }
185
- }
186
- // react based on how this
187
- switch (pickType) {
188
- case 'end':
189
- // if we're picking the end then set the range.
190
- range = {
191
- start: acc.lastDateRange?.start,
192
- end: startOrNextDate
193
- };
194
- boundary = range;
195
- break;
196
- case 'start':
197
- // retain the boundary as potential boundary, and set our new range from the single date.
198
- range = {
199
- start: startOrNextDate,
200
- end: startOrNextDate
201
- };
202
- break;
203
- }
204
- }
205
- else if (acc.boundary && isDateInDateRange(startOrNextDate, acc.boundary)) {
206
- // if in the date range, uses the pick as the last date.
207
- range = {
208
- start: acc.boundary.start,
209
- end: startOrNextDate
210
- };
211
- if (mode === 'arbitrary_quick') {
212
- // modify boundary to match range
213
- if (isSameDateRange(acc.range, range) && isSameDateDay(range.end, startOrNextDate)) {
214
- // if we clicked on the end range, then expand the boundary again to the full range.
215
- range = dateRange({ ...dateRangeInput, date: range.start });
216
- boundary = range;
217
- }
218
- else {
219
- boundary = range;
220
- }
221
- }
222
- else {
223
- // retain same boundary
224
- boundary = acc.boundary;
225
- }
226
- }
227
- else if (mode === 'arbitrary_quick') {
228
- range = potentialBoundary;
229
- }
230
- result = {
231
- lastDateRange: nextDateRange,
232
- boundary,
233
- range
234
- };
235
- }
236
- }
237
- else {
238
- result = {
239
- lastDateRange: nextDateRange
240
- };
241
- }
242
- if (result) {
243
- result = {
244
- lastPickType: pickType,
245
- lastDateRange: result.lastDateRange,
246
- boundary: result.boundary ? minMaxClamp(result.boundary) : undefined,
247
- range: result.range ? minMaxClamp(result.range) : undefined
248
- };
249
- }
250
- return result;
251
- }, {}), filter((x) => !x.lastDateRange || x.range != null), // pass through null/date clearings or ranges
252
- map((x) => x.range ?? null) // return the range
253
- );
254
- }
255
- }));
256
- return result;
257
- }
258
- get fixedDateRangeField() {
259
- return this.field.props;
260
- }
261
- get selectionMode() {
262
- return this.field.props.selectionMode;
263
- }
264
- get valueMode() {
265
- return this.field.props.valueMode ?? DbxDateTimeValueMode.DATE;
266
- }
267
- get description() {
268
- return this.field.props.description;
269
- }
270
- get timezone() {
271
- return this.field.props.timezone;
272
- }
273
- get showTimezone() {
274
- return this.field.props.showTimezone ?? true;
275
- }
276
- get presets() {
277
- return this.field.props.presets;
278
- }
279
- get showRangeInput() {
280
- return this.field.props.showRangeInput ?? true;
281
- }
282
- ngOnInit() {
283
- this._formControlObs.next(this.formControl);
284
- const dateRangeSelection = this.dateRangeSelection$.pipe(shareReplay(1));
285
- const setInputFormValue = (value) => {
286
- if (!isSameDateDayRange(value, this.inputRangeForm.value)) {
287
- this.inputRangeForm.setValue({
288
- start: value?.start ?? null,
289
- end: value?.end ?? null
290
- });
291
- }
292
- };
293
- this._sub.subscription = this.valueInSystemTimezone$
294
- .pipe(combineLatestWith(this.timezoneInstance$.pipe(map((timezoneInstance) => dbxFixedDateRangeOutputValueFactory(this.valueMode, timezoneInstance)))), throttleTime(TIME_OUTPUT_THROTTLE_TIME, undefined, { leading: false, trailing: true }), switchMap(([currentValue, valueFactory]) => {
295
- return dateRangeSelection.pipe(skipFirstMaybe(), distinctUntilChanged(isSameDateDayRange), map((x) => [x, currentValue, valueFactory]));
296
- }))
297
- .subscribe(([rawValue, currentValue, valueFactory]) => {
298
- const value = rawValue ? valueFactory(rawValue) : null;
299
- const isSameRange = dbxDateRangeIsSameDateRangeFieldValue(value, currentValue);
300
- if (!isSameRange) {
301
- this.formControl.setValue(value);
302
- this.formControl.markAsDirty();
303
- this.formControl.markAsTouched();
304
- }
305
- else if (rawValue != null) {
306
- // update the input text again
307
- setInputFormValue(rawValue);
308
- }
309
- });
310
- if (this.selectionMode) {
311
- this._selectionMode.next(asObservableFromGetter(this.selectionMode));
312
- }
313
- this._currentSelectionModeSub.subscription = this.selectionMode$.subscribe((x) => (this._currentSelectionMode = x));
314
- this._dateRangeInputSub.subscription = this.dateRangeInput$.subscribe((x) => (this._currentDateRangeInput = x));
315
- this._inputRangeFormSub.subscription = this.valueInSystemTimezone$.subscribe((x) => {
316
- setInputFormValue(x);
317
- });
318
- if (this.showRangeInput) {
319
- this._inputRangeFormValueSub.subscription = this.valueInSystemTimezone$
320
- .pipe(throttleTime(100), // throttle to prevent the value from changing too fast
321
- switchMap(() => {
322
- return this.inputRangeForm.valueChanges.pipe(debounceTime(500), filter(() => {
323
- const startString = this.startDateInputElement.nativeElement?.value;
324
- let valid = isMonthDaySlashDate(startString);
325
- if (valid && this._currentSelectionMode !== 'single') {
326
- const endString = this.endDateInputElement.nativeElement?.value;
327
- valid = isMonthDaySlashDate(endString);
328
- }
329
- return valid; // must be a valid text input
330
- }), map((x) => x));
331
- }), distinctUntilChanged(isSameDateRange))
332
- .subscribe((x) => {
333
- if (this._currentSelectionMode === 'single') {
334
- this.setDateRange(x?.start ? { start: x.start } : null, 'input');
335
- }
336
- else {
337
- let rangeToSet = x;
338
- if (this._currentSelectionMode === 'arbitrary_quick' && this._latestBoundary && x?.start && x?.end) {
339
- if (!isDateInDateRange(x.start, this._latestBoundary)) {
340
- // if the end date it outside of the current range (i.e. a range was typed in only to the start date) then set the end to the boundary end
341
- const boundary = dateRange({ ...this._currentDateRangeInput, date: x.start });
342
- rangeToSet = { start: x.start, end: boundary.end };
343
- }
344
- }
345
- this.setDateRange(rangeToSet, 'input');
346
- }
347
- });
348
- }
349
- this._latestBoundarySub.subscription = this.latestBoundary$.subscribe((x) => (this._latestBoundary = x));
350
- this._dateRangeInput.next(asObservableFromGetter(this.fixedDateRangeField.dateRangeInput));
351
- this._disableEndSub.subscription = this.endDisabled$.subscribe((disabled) => {
352
- const end = this.inputRangeForm.get('end');
353
- if (end) {
354
- if (disabled) {
355
- end.disable();
356
- }
357
- else {
358
- end.enable();
359
- }
360
- }
361
- });
362
- const inputPickerConfig = this.fixedDateRangeField.pickerConfig;
363
- this._config.next(inputPickerConfig ? asObservableFromGetter(inputPickerConfig) : undefined);
364
- // Set default timezone if provided.
365
- if (this.timezone && !this.fixedDateRangeField.fullDayInUTC) {
366
- this._timezone.next(asObservableFromGetter(this.timezone));
367
- }
368
- // Watch for disabled changes so we can propogate them properly.
369
- this.formControl.registerOnDisabledChange((disabled) => {
370
- if (disabled) {
371
- this.inputRangeForm.disable();
372
- }
373
- else {
374
- this.inputRangeForm.enable();
375
- this.endDisabled$.pipe(first()).subscribe((disabled) => {
376
- const end = this.inputRangeForm.get('end');
377
- if (end) {
378
- if (disabled) {
379
- end.disable();
380
- }
381
- else {
382
- end.enable();
383
- }
384
- }
385
- });
386
- }
387
- });
388
- if (this.presets != null) {
389
- this._presets.next(asObservableFromGetter(this.presets));
390
- }
391
- else {
392
- this._presets.next(this.dbxDateTimeFieldConfigService.configurations$);
393
- }
394
- this._activeDateSub.subscription = this.calendarFocusDate$.subscribe((x) => {
395
- this.calendar.activeDate = x;
396
- });
397
- }
398
- ngOnDestroy() {
399
- super.ngOnDestroy();
400
- this._sub.destroy();
401
- this._inputRangeFormSub.destroy();
402
- this._inputRangeFormValueSub.destroy();
403
- this._dateRangeInputSub.destroy();
404
- this._currentSelectionModeSub.destroy();
405
- this._latestBoundarySub.destroy();
406
- this._disableEndSub.destroy();
407
- this._activeDateSub.destroy();
408
- this._config.complete();
409
- this._selectionMode.complete();
410
- this._dateRangeInput.complete();
411
- this._timezone.complete();
412
- this._presets.complete();
413
- this._selectionEvent.complete();
414
- this._formControlObs.complete();
415
- }
416
- selectedChange(date) {
417
- this.setDateRange(date ? { start: date } : null, 'calendar');
418
- }
419
- setDateRange(range, type) {
420
- this._selectionEvent.next({ type, range });
421
- }
422
- _createDateRange(date) {
423
- return date ? dateRange({ ...this._currentDateRangeInput, date }) : undefined;
424
- }
425
- }
426
- DbxFixedDateRangeFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxFixedDateRangeFieldComponent, deps: [{ token: i1.DbxDateTimeFieldMenuPresetsService }], target: i0.ɵɵFactoryTarget.Component });
427
- DbxFixedDateRangeFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: DbxFixedDateRangeFieldComponent, selector: "ng-component", providers: [
428
- {
429
- provide: MAT_DATE_RANGE_SELECTION_STRATEGY,
430
- useClass: forwardRef(() => DbxFixedDateRangeFieldSelectionStrategy)
431
- }
432
- ], viewQueries: [{ propertyName: "calendar", first: true, predicate: MatCalendar, descendants: true }, { propertyName: "startDateInputElement", first: true, predicate: ["startDateInput"], descendants: true, read: ElementRef }, { propertyName: "endDateInputElement", first: true, predicate: ["endDateInput"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"dbx-fixeddaterange-field\">\n <mat-calendar #calendarView [selected]=\"calendarSelection$ | async\" [dateFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" [minDate]=\"min$ | async\" [maxDate]=\"max$ | async\" (selectedChange)=\"selectedChange($event)\"></mat-calendar>\n <mat-form-field class=\"dbx-fixeddaterange-field-input\" appearance=\"fill\">\n <mat-date-range-input *ngIf=\"showRangeInput\" [formGroup]=\"inputRangeForm\">\n <input #startDateInput matStartDate formControlName=\"start\" placeholder=\"Start date\" />\n <input #endDateInput [ngClass]=\"(endDisabled$ | async) ? 'dbx-fixeddaterange-field-input-end' : ''\" [attr.tabindex]=\"(endDisabled$ | async) ? -1 : 0\" matEndDate formControlName=\"end\" placeholder=\"End date\" />\n </mat-date-range-input>\n </mat-form-field>\n <mat-error *ngIf=\"formControl.hasError('required')\">Date range is required</mat-error>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i5.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection"], exportAs: ["matCalendar"] }, { kind: "component", type: i5.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i5.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i5.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i6.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] });
433
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxFixedDateRangeFieldComponent, decorators: [{
434
- type: Component,
435
- args: [{ providers: [
436
- {
437
- provide: MAT_DATE_RANGE_SELECTION_STRATEGY,
438
- useClass: forwardRef(() => DbxFixedDateRangeFieldSelectionStrategy)
439
- }
440
- ], template: "<div class=\"dbx-fixeddaterange-field\">\n <mat-calendar #calendarView [selected]=\"calendarSelection$ | async\" [dateFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" [minDate]=\"min$ | async\" [maxDate]=\"max$ | async\" (selectedChange)=\"selectedChange($event)\"></mat-calendar>\n <mat-form-field class=\"dbx-fixeddaterange-field-input\" appearance=\"fill\">\n <mat-date-range-input *ngIf=\"showRangeInput\" [formGroup]=\"inputRangeForm\">\n <input #startDateInput matStartDate formControlName=\"start\" placeholder=\"Start date\" />\n <input #endDateInput [ngClass]=\"(endDisabled$ | async) ? 'dbx-fixeddaterange-field-input-end' : ''\" [attr.tabindex]=\"(endDisabled$ | async) ? -1 : 0\" matEndDate formControlName=\"end\" placeholder=\"End date\" />\n </mat-date-range-input>\n </mat-form-field>\n <mat-error *ngIf=\"formControl.hasError('required')\">Date range is required</mat-error>\n</div>\n" }]
441
- }], ctorParameters: function () { return [{ type: i1.DbxDateTimeFieldMenuPresetsService }]; }, propDecorators: { calendar: [{
442
- type: ViewChild,
443
- args: [MatCalendar]
444
- }], startDateInputElement: [{
445
- type: ViewChild,
446
- args: ['startDateInput', { read: ElementRef }]
447
- }], endDateInputElement: [{
448
- type: ViewChild,
449
- args: ['endDateInput', { read: ElementRef }]
450
- }] } });
451
- export class DbxFixedDateRangeFieldSelectionStrategy {
452
- constructor(_dateAdapter, dbxFixedDateRangeFieldComponent) {
453
- this._dateAdapter = _dateAdapter;
454
- this.dbxFixedDateRangeFieldComponent = dbxFixedDateRangeFieldComponent;
455
- }
456
- selectionFinished(date, currentRange, event) {
457
- // unused
458
- return currentRange;
459
- }
460
- createPreview(activeDate, currentRange, event) {
461
- const { currentSelectionMode } = this.dbxFixedDateRangeFieldComponent;
462
- if (activeDate != null && currentSelectionMode !== 'single') {
463
- const latestBoundary = this.dbxFixedDateRangeFieldComponent.latestBoundary;
464
- const date = this.dateFromAdapterDate(activeDate);
465
- if (latestBoundary && (currentSelectionMode === 'normal' || isDateInDateRange(date, latestBoundary))) {
466
- const exampleDateRange = this._createDateRange(latestBoundary);
467
- return exampleDateRange;
468
- }
469
- }
470
- return this._createDateRangeWithDate(activeDate);
471
- }
472
- _createDateRangeWithDate(input) {
473
- let dateRange;
474
- if (input) {
475
- const date = this.dateFromAdapterDate(input);
476
- dateRange = this.dbxFixedDateRangeFieldComponent._createDateRange(date);
477
- }
478
- return this._createDateRange(dateRange);
479
- }
480
- _createDateRange(input) {
481
- if (input) {
482
- return new DatePickerDateRange(this.adapterDateFromDate(input.start), this.adapterDateFromDate(input.end));
483
- }
484
- else {
485
- return new DatePickerDateRange(null, null);
486
- }
487
- }
488
- dateFromAdapterDate(input) {
489
- const day = this._dateAdapter.getDate(input);
490
- const monthIndex = this._dateAdapter.getMonth(input);
491
- const year = this._dateAdapter.getYear(input);
492
- return new Date(year, monthIndex, day);
493
- }
494
- adapterDateFromDate(date) {
495
- const day = date.getDate();
496
- const monthIndex = date.getMonth();
497
- const year = date.getFullYear();
498
- return this._dateAdapter.createDate(year, monthIndex, day);
499
- }
500
- }
501
- DbxFixedDateRangeFieldSelectionStrategy.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxFixedDateRangeFieldSelectionStrategy, deps: [{ token: i7.DateAdapter }, { token: DbxFixedDateRangeFieldComponent }], target: i0.ɵɵFactoryTarget.Injectable });
502
- DbxFixedDateRangeFieldSelectionStrategy.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxFixedDateRangeFieldSelectionStrategy });
503
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxFixedDateRangeFieldSelectionStrategy, decorators: [{
504
- type: Injectable
505
- }], ctorParameters: function () { return [{ type: i7.DateAdapter }, { type: DbxFixedDateRangeFieldComponent }]; } });
506
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4ZWRkYXRlcmFuZ2UuZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vc3JjL2xpYi9mb3JtbHkvZmllbGQvdmFsdWUvZGF0ZS9maXhlZGRhdGVyYW5nZS5maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZm9ybS9zcmMvbGliL2Zvcm1seS9maWVsZC92YWx1ZS9kYXRlL2ZpeGVkZGF0ZXJhbmdlLmZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBNEYsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVKLE9BQU8sRUFBRSxvQkFBb0IsRUFBaUMsOEJBQThCLEVBQUUscUJBQXFCLEVBQTZCLGtCQUFrQixFQUF3RCxTQUFTLEVBQUUsaUJBQWlCLEVBQUUseUJBQXlCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoVyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4TixPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQXFCLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFtQixXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNC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TSxHQUFHLEdBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sVUFBVSxHQUFjLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QyxNQUFNLElBQUksR0FBZSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFNUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdELENBQUM7O3FJQXZEVSx1Q0FBdUM7eUlBQXZDLHVDQUF1Qzs0RkFBdkMsdUNBQXVDO2tCQURuRCxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWF5YmUsIERlY2lzaW9uRnVuY3Rpb24sIE1pbGxpc2Vjb25kcywgVGltZXpvbmVTdHJpbmcsIERhdGVNb250aCwgRGF5T2ZNb250aCwgWWVhck51bWJlciwgaXNNb250aERheVNsYXNoRGF0ZSwgTVNfSU5fTUlOVVRFIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBndWVzc0N1cnJlbnRUaW1lem9uZSwgRGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2UsIGRhdGVUaW1lTWludXRlRGVjaXNpb25GdW5jdGlvbiwgZGF0ZVRpbWV6b25lVXRjTm9ybWFsLCBEYXRlUmFuZ2VJbnB1dCwgRGF0ZVJhbmdlLCBpc1NhbWVEYXRlRGF5UmFuZ2UsIERhdGVSYW5nZVdpdGhEYXRlT3JTdHJpbmdWYWx1ZSwgRGF0ZVRpbWVNaW51dGVDb25maWcsIGRhdGVSYW5nZSwgaXNEYXRlSW5EYXRlUmFuZ2UsIGNsYW1wRGF0ZVJhbmdlVG9EYXRlUmFuZ2UsIGlzU2FtZURhdGVSYW5nZSwgaXNTYW1lRGF0ZURheSwgbGltaXREYXRlVGltZUluc3RhbmNlIH0gZnJvbSAnQGRlcmVla2IvZGF0ZSc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHNoYXJlUmVwbGF5LCBtYXAsIHN0YXJ0V2l0aCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGRlYm91bmNlVGltZSwgdGhyb3R0bGVUaW1lLCBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIG9mLCBjb21iaW5lTGF0ZXN0V2l0aCwgZmlsdGVyLCBjb21iaW5lTGF0ZXN0LCBzY2FuLCBmaXJzdCwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmllbGRUeXBlIH0gZnJvbSAnQG5neC1mb3JtbHkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgRmllbGRUeXBlQ29uZmlnLCBGb3JtbHlGaWVsZFByb3BzIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBNYXREYXRlUmFuZ2VTZWxlY3Rpb25TdHJhdGVneSwgTUFUX0RBVEVfUkFOR0VfU0VMRUNUSU9OX1NUUkFURUdZLCBEYXRlUmFuZ2UgYXMgRGF0ZVBpY2tlckRhdGVSYW5nZSwgTWF0Q2FsZW5kYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIsIGZpbHRlck1heWJlLCBPYnNlcnZhYmxlT3JWYWx1ZUdldHRlciwgc2tpcEZpcnN0TWF5YmUsIFN1YnNjcmlwdGlvbk9iamVjdCwgc3dpdGNoTWFwTWF5YmVEZWZhdWx0IH0gZnJvbSAnQGRlcmVla2Ivcnhqcyc7XG5pbXBvcnQgeyBEYnhEYXRlVGltZVZhbHVlTW9kZSwgZGJ4RGF0ZVJhbmdlSXNTYW1lRGF0ZVJhbmdlRmllbGRWYWx1ZSwgZGJ4RGF0ZVRpbWVJbnB1dFZhbHVlUGFyc2VGYWN0b3J5LCBkYnhEYXRlVGltZU91dHB1dFZhbHVlRmFjdG9yeSB9IGZyb20gJy4vZGF0ZS52YWx1ZSc7XG5pbXBvcnQgeyBEYXRlVGltZVByZXNldENvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2RhdGV0aW1lJztcbmltcG9ydCB7IERieERhdGVUaW1lRmllbGRNZW51UHJlc2V0c1NlcnZpY2UgfSBmcm9tICcuL2RhdGV0aW1lLmZpZWxkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IGlzQWZ0ZXIsIGlzQmVmb3JlIH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5leHBvcnQgdHlwZSBEYnhGaXhlZERhdGVSYW5nZURhdGVSYW5nZUlucHV0ID0gT21pdDxEYXRlUmFuZ2VJbnB1dCwgJ2RhdGUnPjtcblxuZXhwb3J0IHR5cGUgRGJ4Rml4ZWREYXRlUmFuZ2VQaWNrZXJDb25maWd1cmF0aW9uID0gT21pdDxEYXRlVGltZU1pbnV0ZUNvbmZpZywgJ2RhdGUnPjtcblxuZXhwb3J0IHR5cGUgRGJ4Rml4ZWREYXRlUmFuZ2VTZWxlY3Rpb25Nb2RlID0gJ3NpbmdsZScgfCAnbm9ybWFsJyB8ICdhcmJpdHJhcnknIHwgJ2FyYml0cmFyeV9xdWljayc7XG5leHBvcnQgdHlwZSBEYnhGaXhlZERhdGVSYW5nZVBpY2tpbmcgPSAnc3RhcnQnIHwgJ2VuZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZFByb3BzIGV4dGVuZHMgRm9ybWx5RmllbGRQcm9wcyB7XG4gIC8qKlxuICAgKiBEYXRlIHJhbmdlIGlucHV0IHRvIGJ1aWxkIHRoZSBkYXRlIHJhbmdlLlxuICAgKi9cbiAgZGF0ZVJhbmdlSW5wdXQ6IE9ic2VydmFibGVPclZhbHVlR2V0dGVyPERieEZpeGVkRGF0ZVJhbmdlRGF0ZVJhbmdlSW5wdXQ+O1xuXG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gbW9kZSB0byB1c2Ugd2hlbiBwaWNraW5nIGRhdGVzIG9uIHRoZSBjYWxlbmRhci5cbiAgICovXG4gIHNlbGVjdGlvbk1vZGU/OiBNYXliZTxPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxEYnhGaXhlZERhdGVSYW5nZVNlbGVjdGlvbk1vZGU+PjtcblxuICAvKipcbiAgICogVmFsdWUgbW9kZSBmb3IgdGhlIGRhdGVzIGluIHRoZSBvdXRwdXQgRGF0ZVJhbmdlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBEQVRFXG4gICAqL1xuICB2YWx1ZU1vZGU/OiBEYnhEYXRlVGltZVZhbHVlTW9kZTtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gcGFzcyB0aGUgZGF0ZSB2YWx1ZSBhcyBhIFVUQyBkYXRlLCBvciBhIGRhdGUgaW4gdGhlIGN1cnJlbnQgdGltZXpvbmUuXG4gICAqL1xuICBmdWxsRGF5SW5VVEM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHBpY2tlckNvbmZpZz86IE9ic2VydmFibGVPclZhbHVlR2V0dGVyPERieEZpeGVkRGF0ZVJhbmdlUGlja2VyQ29uZmlndXJhdGlvbj47XG5cbiAgLyoqXG4gICAqIChPcHRpb25hbCkgVGhlIGlucHV0IHRpbWV6b25lIHRvIGRlZmF1bHQgdG8uXG4gICAqXG4gICAqIElnbm9yZWQgaWYgZnVsbERheUluVVRDIGlzIHRydWUuXG4gICAqL1xuICB0aW1lem9uZT86IE1heWJlPE9ic2VydmFibGVPclZhbHVlR2V0dGVyPE1heWJlPFRpbWV6b25lU3RyaW5nPj4+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IHRoZSB0aW1lem9uZS4gVHJ1ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgc2hvd1RpbWV6b25lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3VzdG9tIHByZXNldHMgdG8gc2hvdyBpbiB0aGUgZHJvcGRvd24uXG4gICAqL1xuICBwcmVzZXRzPzogT2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8RGF0ZVRpbWVQcmVzZXRDb25maWd1cmF0aW9uW10+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzaG93IHRoZSByYW5nZSBpbnB1dC4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICovXG4gIHNob3dSYW5nZUlucHV0PzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gZGJ4Rml4ZWREYXRlUmFuZ2VJbnB1dFZhbHVlRmFjdG9yeShtb2RlOiBEYnhEYXRlVGltZVZhbHVlTW9kZSwgdGltZXpvbmVJbnN0YW5jZTogTWF5YmU8RGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2U+KTogKGlucHV0OiBNYXliZTxEYXRlUmFuZ2VXaXRoRGF0ZU9yU3RyaW5nVmFsdWU+KSA9PiBNYXliZTxEYXRlUmFuZ2U+IHtcbiAgY29uc3QgZGF0ZUlucHV0VHJhbnNmb3JtZXIgPSBkYnhEYXRlVGltZUlucHV0VmFsdWVQYXJzZUZhY3RvcnkobW9kZSwgdGltZXpvbmVJbnN0YW5jZSk7XG5cbiAgcmV0dXJuICh5KSA9PiB7XG4gICAgbGV0IHJlc3VsdDogTWF5YmU8RGF0ZVJhbmdlPjtcblxuICAgIGlmICh5KSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIHN0YXJ0OiBkYXRlSW5wdXRUcmFuc2Zvcm1lcih5LnN0YXJ0KSBhcyBEYXRlLFxuICAgICAgICBlbmQ6IGRhdGVJbnB1dFRyYW5zZm9ybWVyKHkuZW5kKSBhcyBEYXRlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRieEZpeGVkRGF0ZVJhbmdlT3V0cHV0VmFsdWVGYWN0b3J5KG1vZGU6IERieERhdGVUaW1lVmFsdWVNb2RlLCB0aW1lem9uZUluc3RhbmNlOiBNYXliZTxEYXRlVGltZXpvbmVVdGNOb3JtYWxJbnN0YW5jZT4pOiAoZGF0ZTogTWF5YmU8RGF0ZVJhbmdlPikgPT4gTWF5YmU8RGF0ZVJhbmdlV2l0aERhdGVPclN0cmluZ1ZhbHVlPiB7XG4gIGNvbnN0IGRhdGVPdXRwdXRUcmFuc2Zvcm1lciA9IGRieERhdGVUaW1lT3V0cHV0VmFsdWVGYWN0b3J5KG1vZGUsIHRpbWV6b25lSW5zdGFuY2UpO1xuXG4gIHJldHVybiAoeSkgPT4ge1xuICAgIGxldCByZXN1bHQ6IE1heWJlPERhdGVSYW5nZT47XG5cbiAgICBpZiAoeSkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBzdGFydDogZGF0ZU91dHB1dFRyYW5zZm9ybWVyKHkuc3RhcnQpIGFzIERhdGUsXG4gICAgICAgIGVuZDogZGF0ZU91dHB1dFRyYW5zZm9ybWVyKHkuZW5kKSBhcyBEYXRlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmNvbnN0IFRJTUVfT1VUUFVUX1RIUk9UVExFX1RJTUU6IE1pbGxpc2Vjb25kcyA9IDEwO1xuXG5leHBvcnQgdHlwZSBGaXhlZERhdGVSYW5nZVNjYW5UeXBlID0gJ3N0YXJ0JyB8ICdlbmQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpeGVkRGF0ZVJhbmdlU2NhbiB7XG4gIC8qKlxuICAgKiBQaWNrZWQgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgcmFuZ2Ugb24gdGhlIGxhc3QgcGljay5cbiAgICovXG4gIGxhc3RQaWNrVHlwZT86IE1heWJlPEZpeGVkRGF0ZVJhbmdlU2NhblR5cGU+O1xuICAvKipcbiAgICogVGhlIGxhdGVzdCBkYXRlIHBhc3NlZCwgaWYgYXBwbGljYWJsZS5cbiAgICovXG4gIGxhc3REYXRlUmFuZ2U/OiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+O1xuICAvKipcbiAgICogVGhlIGdlbmVyYXRlZCBib3VuZGFyeSByYW5nZS5cbiAgICovXG4gIGJvdW5kYXJ5PzogRGF0ZVJhbmdlO1xuICAvKipcbiAgICogTmV3IERhdGUgUmFuZ2VcbiAgICovXG4gIHJhbmdlPzogRGF0ZVJhbmdlO1xufVxuXG50eXBlIFNlbGVjdGVkRGF0ZUV2ZW50VHlwZSA9ICdjYWxlbmRhcicgfCAnaW5wdXQnO1xuXG5pbnRlcmZhY2UgU2VsZWN0ZWREYXRlRXZlbnQge1xuICB0eXBlOiBTZWxlY3RlZERhdGVFdmVudFR5cGU7XG4gIHJhbmdlPzogTWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+Pjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnZml4ZWRkYXRlcmFuZ2UuZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBNQVRfREFURV9SQU5HRV9TRUxFQ1RJT05fU1RSQVRFR1ksXG4gICAgICB1c2VDbGFzczogZm9yd2FyZFJlZigoKSA9PiBEYnhGaXhlZERhdGVSYW5nZUZpZWxkU2VsZWN0aW9uU3RyYXRlZ3kpXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIERieEZpeGVkRGF0ZVJhbmdlRmllbGRDb21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGU8RmllbGRUeXBlQ29uZmlnPERieEZpeGVkRGF0ZVJhbmdlRmllbGRQcm9wcz4+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9zdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgcHJpdmF0ZSBfaW5wdXRSYW5nZUZvcm1TdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX2lucHV0UmFuZ2VGb3JtVmFsdWVTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgcHJpdmF0ZSBfZGF0ZVJhbmdlSW5wdXRTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX2N1cnJlbnRTZWxlY3Rpb25Nb2RlU3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuICBwcml2YXRlIF9sYXRlc3RCb3VuZGFyeVN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSBfZGlzYWJsZUVuZFN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSBfYWN0aXZlRGF0ZVN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcblxuICBwcml2YXRlIF9jdXJyZW50RGF0ZVJhbmdlSW5wdXQ6IE1heWJlPERieEZpeGVkRGF0ZVJhbmdlRGF0ZVJhbmdlSW5wdXQ+ID0ge307XG4gIHByaXZhdGUgX2N1cnJlbnRTZWxlY3Rpb25Nb2RlOiBEYnhGaXhlZERhdGVSYW5nZVNlbGVjdGlvbk1vZGUgPSAnc2luZ2xlJztcbiAgcHJpdmF0ZSBfbGF0ZXN0Qm91bmRhcnk6IE1heWJlPERhdGVSYW5nZT4gPSBudWxsO1xuXG4gIHByaXZhdGUgX2NvbmZpZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxEYnhGaXhlZERhdGVSYW5nZVBpY2tlckNvbmZpZ3VyYXRpb24+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uTW9kZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxEYnhGaXhlZERhdGVSYW5nZVNlbGVjdGlvbk1vZGU+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfZGF0ZVJhbmdlSW5wdXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPE9ic2VydmFibGU8RGJ4Rml4ZWREYXRlUmFuZ2VEYXRlUmFuZ2VJbnB1dD4+Pih1bmRlZmluZWQpO1xuXG4gIHByaXZhdGUgX3RpbWV6b25lID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPE1heWJlPFRpbWV6b25lU3RyaW5nPj4+Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIF9wcmVzZXRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPYnNlcnZhYmxlPERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdPj4ob2YoW10pKTtcblxuICBwcml2YXRlIF9zZWxlY3Rpb25FdmVudCA9IG5ldyBTdWJqZWN0PFNlbGVjdGVkRGF0ZUV2ZW50PigpO1xuICByZWFkb25seSBzZWxlY3RlZERhdGVSYW5nZSQ6IE9ic2VydmFibGU8TWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+Pj4gPSB0aGlzLl9zZWxlY3Rpb25FdmVudC5waXBlKG1hcCgoeCkgPT4geC5yYW5nZSkpO1xuXG4gIHByaXZhdGUgX2Zvcm1Db250cm9sT2JzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxBYnN0cmFjdENvbnRyb2w8TWF5YmU8RGF0ZVJhbmdlPj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBmb3JtQ29udHJvbCQgPSB0aGlzLl9mb3JtQ29udHJvbE9icy5waXBlKGZpbHRlck1heWJlKCkpO1xuXG4gIEBWaWV3Q2hpbGQoTWF0Q2FsZW5kYXIpXG4gIGNhbGVuZGFyITogTWF0Q2FsZW5kYXI8RGF0ZT47XG5cbiAgQFZpZXdDaGlsZCgnc3RhcnREYXRlSW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgc3RhcnREYXRlSW5wdXRFbGVtZW50ITogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCdlbmREYXRlSW5wdXQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgZW5kRGF0ZUlucHV0RWxlbWVudCE6IEVsZW1lbnRSZWY7XG5cbiAgZ2V0IGN1cnJlbnREYXRlUmFuZ2VJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudERhdGVSYW5nZUlucHV0O1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRTZWxlY3Rpb25Nb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2VsZWN0aW9uTW9kZTtcbiAgfVxuXG4gIGdldCBsYXRlc3RCb3VuZGFyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGF0ZXN0Qm91bmRhcnk7XG4gIH1cblxuICByZWFkb25seSBjb25maWckOiBPYnNlcnZhYmxlPERieEZpeGVkRGF0ZVJhbmdlUGlja2VyQ29uZmlndXJhdGlvbj4gPSB0aGlzLl9jb25maWcucGlwZShcbiAgICBmaWx0ZXJNYXliZSgpLFxuICAgIHN3aXRjaE1hcCgoeCkgPT4geCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGxpbWl0RGF0ZVRpbWVJbnN0YW5jZSQgPSB0aGlzLmNvbmZpZyQucGlwZShtYXAobGltaXREYXRlVGltZUluc3RhbmNlKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvbk1vZGUkOiBPYnNlcnZhYmxlPERieEZpeGVkRGF0ZVJhbmdlU2VsZWN0aW9uTW9kZT4gPSB0aGlzLl9zZWxlY3Rpb25Nb2RlLnBpcGUoXG4gICAgc3dpdGNoTWFwTWF5YmVEZWZhdWx0PERieEZpeGVkRGF0ZVJhbmdlU2VsZWN0aW9uTW9kZT4oJ3NpbmdsZScpLFxuICAgIG1hcCgoeCkgPT4geCA/PyAnc2luZ2xlJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVSYW5nZUlucHV0JCA9IHRoaXMuX2RhdGVSYW5nZUlucHV0LnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSB0aW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMuX3RpbWV6b25lLnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnBpcGUoXG4gICAgbWFwKChkZWZhdWx0VGltZXpvbmUpID0+IHtcbiAgICAgIHJldHVybiBkZWZhdWx0VGltZXpvbmUgPz8gZ3Vlc3NDdXJyZW50VGltZXpvbmUoKTtcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgdGltZXpvbmVJbnN0YW5jZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2U+PiA9IHRoaXMudGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh0aW1lem9uZSkgPT4gKHRpbWV6b25lID8gZGF0ZVRpbWV6b25lVXRjTm9ybWFsKHsgdGltZXpvbmUgfSkgOiB1bmRlZmluZWQpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHZhbHVlSW5TeXN0ZW1UaW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVJhbmdlPj4gPSB0aGlzLmZvcm1Db250cm9sJC5waXBlKFxuICAgIG1hcCgoY29udHJvbCkgPT4gY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGg8TWF5YmU8RGF0ZVJhbmdlV2l0aERhdGVPclN0cmluZ1ZhbHVlPj4oY29udHJvbC52YWx1ZSksIHNoYXJlUmVwbGF5KDEpKSksXG4gICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy50aW1lem9uZUluc3RhbmNlJCksXG4gICAgc3dpdGNoTWFwKChbeCwgdGltZXpvbmVJbnN0YW5jZV0pID0+IHtcbiAgICAgIHJldHVybiB4LnBpcGUobWFwKGRieEZpeGVkRGF0ZVJhbmdlSW5wdXRWYWx1ZUZhY3RvcnkodGhpcy52YWx1ZU1vZGUsIHRpbWV6b25lSW5zdGFuY2UpKSk7XG4gICAgfSksXG4gICAgdGhyb3R0bGVUaW1lKDIwLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLCAvLyB0aHJvdHRsZSBpbmNvbWluZyB2YWx1ZXMgYW5kIHRpbWV6b25lIGNoYW5nZXNcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZDxNYXliZTxEYXRlUmFuZ2U+Pihpc1NhbWVEYXRlRGF5UmFuZ2UpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgZGF0ZVJhbmdlU2VsZWN0aW9uRm9yTW9kZShtb2RlOiBEYnhGaXhlZERhdGVSYW5nZVNlbGVjdGlvbk1vZGUpIHtcbiAgICBjb25zdCByZXN1bHQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVJhbmdlPj4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRhdGVSYW5nZUlucHV0JCwgdGhpcy5saW1pdERhdGVUaW1lSW5zdGFuY2UkXSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoW2RhdGVSYW5nZUlucHV0LCBsaW1pdEluc3RhbmNlXSkgPT4ge1xuICAgICAgICBjb25zdCBoYXNEYXRlUmFuZ2VDb25maWd1cmF0aW9uID0gQm9vbGVhbihkYXRlUmFuZ2VJbnB1dCk7XG4gICAgICAgIGNvbnN0IG1pbk1heENsYW1wID0gKGRhdGVSYW5nZTogRGF0ZVJhbmdlKSA9PiBsaW1pdEluc3RhbmNlLmNsYW1wRGF0ZVJhbmdlKGRhdGVSYW5nZSk7XG5cbiAgICAgICAgaWYgKG1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgLy8gb25seSB1c2UgdGhlIHN0YXJ0IGRhdGUuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UkLnBpcGUoXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlRGF5UmFuZ2UpLFxuICAgICAgICAgICAgbWFwKChpbnB1dERhdGVSYW5nZSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkYXRlID0gaW5wdXREYXRlUmFuZ2U/LnN0YXJ0O1xuICAgICAgICAgICAgICByZXR1cm4gZGF0ZSA/IChtaW5NYXhDbGFtcChkYXRlUmFuZ2UoeyAuLi5kYXRlUmFuZ2VJbnB1dCwgZGF0ZSB9IGFzIERhdGVSYW5nZUlucHV0KSkgYXMgRGF0ZVJhbmdlKSA6IG51bGw7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGFrZSB0aGUgZmlyc3QgZGF0ZSwgdGhlbiB3YWl0IHVubGVzcyB0aGUgZGF0ZSBpcyBvdXRzaWRlIG9mIHRoZSByYW5nZS5cbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERhdGVSYW5nZSQucGlwZShcbiAgICAgICAgICAgIHNjYW4oKGFjYzogRml4ZWREYXRlUmFuZ2VTY2FuLCBuZXh0RGF0ZVJhbmdlOiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+KSA9PiB7XG4gICAgICAgICAgICAgIGxldCByZXN1bHQ6IEZpeGVkRGF0ZVJhbmdlU2NhbjtcbiAgICAgICAgICAgICAgbGV0IHBpY2tUeXBlOiBNYXliZTxGaXhlZERhdGVSYW5nZVNjYW5UeXBlPiA9ICdzdGFydCc7XG5cbiAgICAgICAgICAgICAgaWYgKG5leHREYXRlUmFuZ2UgJiYgbmV4dERhdGVSYW5nZS5zdGFydCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzdGFydDogc3RhcnRPck5leHREYXRlLCBlbmQgfSA9IG5leHREYXRlUmFuZ2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcG90ZW50aWFsQm91bmRhcnkgPSBkYXRlUmFuZ2UoeyAuLi5kYXRlUmFuZ2VJbnB1dCwgZGF0ZTogc3RhcnRPck5leHREYXRlIH0gYXMgRGF0ZVJhbmdlSW5wdXQpO1xuXG4gICAgICAgICAgICAgICAgLy8gb25seSBjb21lcyB0aHJvdWdoIHdoZW4gcGFzc2VkIGJ5IHRoZSB0ZXh0IGlucHV0c1xuICAgICAgICAgICAgICAgIGlmIChzdGFydE9yTmV4dERhdGUgJiYgZW5kKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IGNsYW1wRGF0ZVJhbmdlVG9EYXRlUmFuZ2UobmV4dERhdGVSYW5nZSwgcG90ZW50aWFsQm91bmRhcnkpIGFzIERhdGVSYW5nZTtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdERhdGVSYW5nZTogbmV4dERhdGVSYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgYm91bmRhcnk6IHJhbmdlLFxuICAgICAgICAgICAgICAgICAgICByYW5nZVxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlOiBNYXliZTxEYXRlUmFuZ2U+ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgbGV0IGJvdW5kYXJ5OiBNYXliZTxEYXRlUmFuZ2U+ID0gcG90ZW50aWFsQm91bmRhcnk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnbm9ybWFsJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0RhdGVSYW5nZUNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBjb25maWd1cmVkIHJhbmdlL2JvdW5kYXJ5LCB0aGVuIGp1c3Qgc2V0IHRoZSBwaWNrIHR5cGUgYmFzZWQgb24gdGhlIGxhc3QgdHlwZVxuICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIHBpY2tUeXBlID0gYWNjLmxhc3RQaWNrVHlwZSA9PT0gJ3N0YXJ0JyA/ICdlbmQnIDogJ3N0YXJ0JztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGljayBpcyBvdXRzaWRlIHRoZSBib3VuZGFyeSwgdGhlbiBjb25zaWRlciBpdCBhIHN0YXJ0IHBpY2sgdHlwZS5cbiAgICAgICAgICAgICAgICAgICAgICBwaWNrVHlwZSA9IGFjYy5sYXN0UGlja1R5cGUgPT09ICdzdGFydCcgJiYgYWNjLmJvdW5kYXJ5ICYmIGlzRGF0ZUluRGF0ZVJhbmdlKHN0YXJ0T3JOZXh0RGF0ZSwgYWNjLmJvdW5kYXJ5KSA/ICdlbmQnIDogJ3N0YXJ0JztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFzc2VydCB0aGUgc3RhcnQgZXhpc3RzIGZyb20gdGhlIHByZXZpb3VzIGNsaWNrLCBvdGhlcndpc2UgY2xlYXIgaXQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwaWNrVHlwZSA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0U3RhcnQgPSBhY2MubGFzdERhdGVSYW5nZT8uc3RhcnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3RTdGFydCB8fCAhaXNBZnRlcihzdGFydE9yTmV4dERhdGUsIGxhc3RTdGFydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tUeXBlID0gJ3N0YXJ0JztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyByZWFjdCBiYXNlZCBvbiBob3cgdGhpc1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBpY2tUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHBpY2tpbmcgdGhlIGVuZCB0aGVuIHNldCB0aGUgcmFuZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGFjYy5sYXN0RGF0ZVJhbmdlPy5zdGFydCBhcyBEYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHN0YXJ0T3JOZXh0RGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gcmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdGFydCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRhaW4gdGhlIGJvdW5kYXJ5IGFzIHBvdGVudGlhbCBib3VuZGFyeSwgYW5kIHNldCBvdXIgbmV3IHJhbmdlIGZyb20gdGhlIHNpbmdsZSBkYXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydE9yTmV4dERhdGUgYXMgRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBzdGFydE9yTmV4dERhdGUgYXMgRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjYy5ib3VuZGFyeSAmJiBpc0RhdGVJbkRhdGVSYW5nZShzdGFydE9yTmV4dERhdGUsIGFjYy5ib3VuZGFyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgaW4gdGhlIGRhdGUgcmFuZ2UsIHVzZXMgdGhlIHBpY2sgYXMgdGhlIGxhc3QgZGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGFjYy5ib3VuZGFyeS5zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHN0YXJ0T3JOZXh0RGF0ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnYXJiaXRyYXJ5X3F1aWNrJykge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGlmeSBib3VuZGFyeSB0byBtYXRjaCByYW5nZVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1NhbWVEYXRlUmFuZ2UoYWNjLnJhbmdlLCByYW5nZSkgJiYgaXNTYW1lRGF0ZURheShyYW5nZS5lbmQsIHN0YXJ0T3JOZXh0RGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNsaWNrZWQgb24gdGhlIGVuZCByYW5nZSwgdGhlbiBleHBhbmQgdGhlIGJvdW5kYXJ5IGFnYWluIHRvIHRoZSBmdWxsIHJhbmdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBkYXRlUmFuZ2UoeyAuLi5kYXRlUmFuZ2VJbnB1dCwgZGF0ZTogcmFuZ2Uuc3RhcnQgfSBhcyBEYXRlUmFuZ2VJbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHJhbmdlO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSA9IHJhbmdlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXRhaW4gc2FtZSBib3VuZGFyeVxuICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gYWNjLmJvdW5kYXJ5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdhcmJpdHJhcnlfcXVpY2snKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gcG90ZW50aWFsQm91bmRhcnk7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdERhdGVSYW5nZTogbmV4dERhdGVSYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgYm91bmRhcnksXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICBsYXN0RGF0ZVJhbmdlOiBuZXh0RGF0ZVJhbmdlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICBsYXN0UGlja1R5cGU6IHBpY2tUeXBlLFxuICAgICAgICAgICAgICAgICAgbGFzdERhdGVSYW5nZTogcmVzdWx0Lmxhc3REYXRlUmFuZ2UsXG4gICAgICAgICAgICAgICAgICBib3VuZGFyeTogcmVzdWx0LmJvdW5kYXJ5ID8gKG1pbk1heENsYW1wKHJlc3VsdC5ib3VuZGFyeSkgYXMgRGF0ZVJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHJhbmdlOiByZXN1bHQucmFuZ2UgPyAobWluTWF4Q2xhbXAocmVzdWx0LnJhbmdlKSBhcyBEYXRlUmFuZ2UpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LCB7fSksXG4gICAgICAgICAgICBmaWx0ZXIoKHgpID0+ICF4Lmxhc3REYXRlUmFuZ2UgfHwgeC5yYW5nZSAhPSBudWxsKSwgLy8gcGFzcyB0aHJvdWdoIG51bGwvZGF0ZSBjbGVhcmluZ3Mgb3IgcmFuZ2VzXG4gICAgICAgICAgICBtYXAoKHgpID0+IHgucmFuZ2UgPz8gbnVsbCkgLy8gcmV0dXJuIHRoZSByYW5nZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZWFkb25seSBmdWxsQm91bmRhcnkkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5kYXRlUmFuZ2VTZWxlY3Rpb25Gb3JNb2RlKCdzaW5nbGUnKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgcmVhZG9ubHkgbGF0ZXN0Qm91bmRhcnkkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5zZWxlY3Rpb25Nb2RlJC5waXBlKFxuICAgIHN3aXRjaE1hcCgobW9kZSkgPT4ge1xuICAgICAgaWYgKG1vZGUgPT09ICdhcmJpdHJhcnlfcXVpY2snKSB7XG4gICAgICAgIC8vIGluIGFyYml0cmFyeV9xdWljayBtb2RlLCB0aGUgbGF0ZXN0IHZhbHVlIGlzIHRoZSBib3VuZGFyeSwgc2luY2Ugd2UgYWx3YXlzIHNldCB0aGUgdmFsdWUgaW1tZWRpYXRlbHkuXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5mdWxsQm91bmRhcnkkO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG5cbiAgLyoqXG4gICAqIEZvY3VzZXMgb24gdGhlIGRhdGUgYW55IHRpbWUgdGhlIHNlbGVjdGlvbiBldmVudCBmcm9tIHRoZSBwaWNrZXIgb2NjdXJlZCwgb3RoZXJ3aXNlIHVzZSB0aGUgc3lzdGVtIHZhbHVlXG4gICAqL1xuICByZWFkb25seSBjYWxlbmRhckZvY3VzRGF0ZSQ6IE9ic2VydmFibGU8RGF0ZT4gPSB0aGlzLl9zZWxlY3Rpb25FdmVudC5waXBlKHN0YXJ0V2l0aChudWxsKSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKHNlbGVjdGlvbkV2ZW50KSA9PiB7XG4gICAgICBpZiAoc2VsZWN0aW9uRXZlbnQgJiYgc2VsZWN0aW9uRXZlbnQudHlwZSA9PT0gJ2NhbGVuZGFyJyAmJiBzZWxlY3Rpb25FdmVudC5yYW5nZT8uc3RhcnQpIHtcbiAgICAgICAgcmV0dXJuIG9mKHNlbGVjdGlvbkV2ZW50LnJhbmdlLnN0YXJ0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bGxCb3VuZGFyeSQucGlwZShcbiAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgIG1hcCgoZnVsbEJvdW5kYXJ5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnVsbEJvdW5kYXJ5Py5zdGFydCA/PyBzZWxlY3Rpb25FdmVudD8ucmFuZ2U/LnN0YXJ0O1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSksXG4gICAgZmlsdGVyTWF5YmUoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVSYW5nZVNlbGVjdGlvbiQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVJhbmdlPj4gPSB0aGlzLnNlbGVjdGlvbk1vZGUkLnBpcGUoc3dpdGNoTWFwKChtb2RlKSA9PiB0aGlzLmRhdGVSYW5nZVNlbGVjdGlvbkZvck1vZGUobW9kZSkpKTtcblxuICByZWFkb25seSBjYWxlbmRhclNlbGVjdGlvbiQ6IE9ic2VydmFibGU8RGF0ZVBpY2tlckRhdGVSYW5nZTxEYXRlPiB8IG51bGw+ID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeCA/IG5ldyBEYXRlUGlja2VyRGF0ZVJhbmdlPERhdGU+KHguc3RhcnQsIHguZW5kKSA6IG51bGwpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGVuZERpc2FibGVkJCA9IHRoaXMuc2VsZWN0aW9uTW9kZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHggPT09ICdzaW5nbGUnKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRSYW5nZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBzdGFydDogbmV3IEZvcm1Db250cm9sPE1heWJlPERhdGU+PihudWxsKSxcbiAgICBlbmQ6IG5ldyBGb3JtQ29udHJvbDxNYXliZTxEYXRlPj4obnVsbClcbiAgfSk7XG5cbiAgZ2V0IGZpeGVkRGF0ZVJhbmdlRmllbGQoKTogRGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZFByb3BzIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcztcbiAgfVxuXG4gIGdldCBzZWxlY3Rpb25Nb2RlKCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnNlbGVjdGlvbk1vZGU7XG4gIH1cblxuICBnZXQgdmFsdWVNb2RlKCk6IERieERhdGVUaW1lVmFsdWVNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy52YWx1ZU1vZGUgPz8gRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUuREFURTtcbiAgfVxuXG4gIGdldCBkZXNjcmlwdGlvbigpOiBNYXliZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIGdldCB0aW1lem9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy50aW1lem9uZTtcbiAgfVxuXG4gIGdldCBzaG93VGltZXpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuc2hvd1RpbWV6b25lID8/IHRydWU7XG4gIH1cblxuICBnZXQgcHJlc2V0cygpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5wcmVzZXRzO1xuICB9XG5cbiAgZ2V0IHNob3dSYW5nZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLnNob3dSYW5nZUlucHV0ID8/IHRydWU7XG4gIH1cblxuICByZWFkb25seSBtaW5NYXhSYW5nZSQgPSB0aGlzLmxpbWl0RGF0ZVRpbWVJbnN0YW5jZSQucGlwZShcbiAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aW1lcihNU19JTl9NSU5VVEUpKSwgLy8gcmVmcmVzaCBldmVyeSBtaW51dGVcbiAgICBtYXAoKFt4XSkgPT4geC5kYXRlUmFuZ2UoKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZURheVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG1pbiQgPSB0aGlzLm1pbk1heFJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uc3RhcnQgPz8gbnVsbCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG1heCQgPSB0aGlzLm1pbk1heFJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZW5kID8/IG51bGwpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBwaWNrZXJGaWx0ZXIkOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZSB8IG51bGw+PiA9IHRoaXMuY29uZmlnJC5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgbWFwKCh4KSA9PiB7XG4gICAgICBpZiAoeCkge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBkYXRlVGltZU1pbnV0ZURlY2lzaW9uRnVuY3Rpb24oeCk7XG4gICAgICAgIHJldHVybiAoeDogRGF0ZSB8IG51bGwpID0+ICh4ICE9IG51bGwgPyBmaWx0ZXIoeCkgOiB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoKSA9PiB0cnVlO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGVmYXVsdFBpY2tlckZpbHRlcjogRGVjaXNpb25GdW5jdGlvbjxEYXRlIHwgbnVsbD4gPSAoKSA9PiB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGJ4RGF0ZVRpbWVGaWVsZENvbmZpZ1NlcnZpY2U6IERieERhdGVUaW1lRmllbGRNZW51UHJlc2V0c1NlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2xPYnMubmV4dCh0aGlzLmZvcm1Db250cm9sKTtcblxuICAgIGNvbnN0IGRhdGVSYW5nZVNlbGVjdGlvbiA9IHRoaXMuZGF0ZVJhbmdlU2VsZWN0aW9uJC5waXBlKHNoYXJlUmVwbGF5KDEpKTtcblxuICAgIGNvbnN0IHNldElucHV0Rm9ybVZhbHVlID0gKHZhbHVlOiBNYXliZTxEYXRlUmFuZ2U+KSA9PiB7XG4gICAgICBpZiAoIWlzU2FtZURhdGVEYXlSYW5nZSh2YWx1ZSwgdGhpcy5pbnB1dFJhbmdlRm9ybS52YWx1ZSBhcyBQYXJ0aWFsPERhdGVSYW5nZT4pKSB7XG4gICAgICAgIHRoaXMuaW5wdXRSYW5nZUZvcm0uc2V0VmFsdWUoe1xuICAgICAgICAgIHN0YXJ0OiB2YWx1ZT8uc3RhcnQgPz8gbnVsbCxcbiAgICAgICAgICBlbmQ6IHZhbHVlPy5lbmQgPz8gbnVsbFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5fc3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGNvbWJpbmVMYXRlc3RXaXRoKHRoaXMudGltZXpvbmVJbnN0YW5jZSQucGlwZShtYXAoKHRpbWV6b25lSW5zdGFuY2UpID0+IGRieEZpeGVkRGF0ZVJhbmdlT3V0cHV0VmFsdWVGYWN0b3J5KHRoaXMudmFsdWVNb2RlLCB0aW1lem9uZUluc3RhbmNlKSkpKSxcbiAgICAgICAgdGhyb3R0bGVUaW1lKFRJTUVfT1VUUFVUX1RIUk9UVExFX1RJTUUsIHVuZGVmaW5lZCwgeyBsZWFkaW5nOiBmYWxzZSwgdHJhaWxpbmc6IHRydWUgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoW2N1cnJlbnRWYWx1ZSwgdmFsdWVGYWN0b3J5XSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRlUmFuZ2VTZWxlY3Rpb24ucGlwZShcbiAgICAgICAgICAgIHNraXBGaXJzdE1heWJlKCksXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZDxNYXliZTxEYXRlUmFuZ2U+Pihpc1NhbWVEYXRlRGF5UmFuZ2UpLFxuICAgICAgICAgICAgbWFwKCh4KSA9PiBbeCwgY3VycmVudFZhbHVlLCB2YWx1ZUZhY3RvcnldIGFzIFt0eXBlb2YgeCwgdHlwZW9mIGN1cnJlbnRWYWx1ZSwgdHlwZW9mIHZhbHVlRmFjdG9yeV0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKFtyYXdWYWx1ZSwgY3VycmVudFZhbHVlLCB2YWx1ZUZhY3RvcnldKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmF3VmFsdWUgPyB2YWx1ZUZhY3RvcnkocmF3VmFsdWUpIDogbnVsbDtcbiAgICAgICAgY29uc3QgaXNTYW1lUmFuZ2UgPSBkYnhEYXRlUmFuZ2VJc1NhbWVEYXRlUmFuZ2VGaWVsZFZhbHVlKHZhbHVlLCBjdXJyZW50VmFsdWUpO1xuXG4gICAgICAgIGlmICghaXNTYW1lUmFuZ2UpIHtcbiAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmF3VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgaW5wdXQgdGV4dCBhZ2FpblxuICAgICAgICAgIHNldElucHV0Rm9ybVZhbHVlKHJhd1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlLm5leHQoYXNPYnNlcnZhYmxlRnJvbUdldHRlcih0aGlzLnNlbGVjdGlvbk1vZGUpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jdXJyZW50U2VsZWN0aW9uTW9kZVN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnNlbGVjdGlvbk1vZGUkLnN1YnNjcmliZSgoeCkgPT4gKHRoaXMuX2N1cnJlbnRTZWxlY3Rpb25Nb2RlID0geCkpO1xuICAgIHRoaXMuX2RhdGVSYW5nZUlucHV0U3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0ZVJhbmdlSW5wdXQkLnN1YnNjcmliZSgoeCkgPT4gKHRoaXMuX2N1cnJlbnREYXRlUmFuZ2VJbnB1dCA9IHgpKTtcblxuICAgIHRoaXMuX2lucHV0UmFuZ2VGb3JtU3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMudmFsdWVJblN5c3RlbVRpbWV6b25lJC5zdWJzY3JpYmUoKHg6IE1heWJlPERhdGVSYW5nZT4pID0+IHtcbiAgICAgIHNldElucHV0Rm9ybVZhbHVlKHgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc2hvd1JhbmdlSW5wdXQpIHtcbiAgICAgIHRoaXMuX2lucHV0UmFuZ2VGb3JtVmFsdWVTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRocm90dGxlVGltZSgxMDApLCAvLyB0aHJvdHRsZSB0byBwcmV2ZW50IHRoZSB2YWx1ZSBmcm9tIGNoYW5naW5nIHRvbyBmYXN0XG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0UmFuZ2VGb3JtLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoNTAwKSxcbiAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFN0cmluZyA9IHRoaXMuc3RhcnREYXRlSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ/LnZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCB2YWxpZCA9IGlzTW9udGhEYXlTbGFzaERhdGUoc3RhcnRTdHJpbmcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkICYmIHRoaXMuX2N1cnJlbnRTZWxlY3Rpb25Nb2RlICE9PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZW5kU3RyaW5nID0gdGhpcy5lbmREYXRlSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ/LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgdmFsaWQgPSBpc01vbnRoRGF5U2xhc2hEYXRlKGVuZFN0cmluZyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkOyAvLyBtdXN0IGJlIGEgdmFsaWQgdGV4dCBpbnB1dFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgbWFwKCh4KSA9PiB4IGFzIE1heWJlPFBhcnRpYWw8RGF0ZVJhbmdlPj4pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVSYW5nZSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh4OiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTZWxlY3Rpb25Nb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2UoeD8uc3RhcnQgPyB7IHN0YXJ0OiB4LnN0YXJ0IH0gOiBudWxsLCAnaW5wdXQnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJhbmdlVG9TZXQ6IE1heWJlPFBhcnRpYWw8RGF0ZVJhbmdlPj4gPSB4O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFNlbGVjdGlvbk1vZGUgPT09ICdhcmJpdHJhcnlfcXVpY2snICYmIHRoaXMuX2xhdGVzdEJvdW5kYXJ5ICYmIHg/LnN0YXJ0ICYmIHg/LmVuZCkge1xuICAgICAgICAgICAgICBpZiAoIWlzRGF0ZUluRGF0ZVJhbmdlKHguc3RhcnQsIHRoaXMuX2xhdGVzdEJvdW5kYXJ5KSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlbmQgZGF0ZSBpdCBvdXRzaWRlIG9mIHRoZSBjdXJyZW50IHJhbmdlIChpLmUuIGEgcmFuZ2Ugd2FzIHR5cGVkIGluIG9ubHkgdG8gdGhlIHN0YXJ0IGRhdGUpIHRoZW4gc2V0IHRoZSBlbmQgdG8gdGhlIGJvdW5kYXJ5IGVuZFxuICAgICAgICAgICAgICAgIGNvbnN0IGJvdW5kYXJ5ID0gZGF0ZVJhbmdlKHsgLi4udGhpcy5fY3VycmVudERhdGVSYW5nZUlucHV0LCBkYXRlOiB4LnN0YXJ0IH0gYXMgRGF0ZVJhbmdlSW5wdXQpO1xuICAgICAgICAgICAgICAgIHJhbmdlVG9TZXQgPSB7IHN0YXJ0OiB4LnN0YXJ0LCBlbmQ6IGJvdW5kYXJ5LmVuZCB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlKHJhbmdlVG9TZXQsICdpbnB1dCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGF0ZXN0Qm91bmRhcnlTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy5sYXRlc3RCb3VuZGFyeSQuc3Vic2NyaWJlKCh4KSA9PiAodGhpcy5fbGF0ZXN0Qm91bmRhcnkgPSB4KSk7XG4gICAgdGhpcy5fZGF0ZVJhbmdlSW5wdXQubmV4dChhc09ic2VydmFibGVGcm9tR2V0dGVyKHRoaXMuZml4ZWREYXRlUmFuZ2VGaWVsZC5kYXRlUmFuZ2VJbnB1dCkpO1xuXG4gICAgdGhpcy5fZGlzYWJsZUVuZFN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLmVuZERpc2FibGVkJC5zdWJzY3JpYmUoKGRpc2FibGVkKSA9PiB7XG4gICAgICBjb25zdCBlbmQgPSB0aGlzLmlucHV0UmFuZ2VGb3JtLmdldCgnZW5kJyk7XG5cbiAgICAgIGlmIChlbmQpIHtcbiAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgZW5kLmRpc2FibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbmQuZW5hYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGlucHV0UGlja2VyQ29uZmlnID0gdGhpcy5maXhlZERhdGVSYW5nZUZpZWxkLnBpY2tlckNvbmZpZztcbiAgICB0aGlzLl9jb25maWcubmV4dChpbnB1dFBpY2tlckNvbmZpZyA/IGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIoaW5wdXRQaWNrZXJDb25maWcpIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIFNldCBkZWZhdWx0IHRpbWV6b25lIGlmIHByb3ZpZGVkLlxuICAgIGlmICh0aGlzLnRpbWV6b25lICYmICF0aGlzLmZpeGVkRGF0ZVJhbmdlRmllbGQuZnVsbERheUluVVRDKSB7XG4gICAgICB0aGlzLl90aW1lem9uZS5uZXh0KGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIodGhpcy50aW1lem9uZSkpO1xuICAgIH1cblxuICAgIC8vIFdhdGNoIGZvciBkaXNhYmxlZCBjaGFuZ2VzIHNvIHdlIGNhbiBwcm9wb2dhdGUgdGhlbSBwcm9wZXJseS5cbiAgICB0aGlzLmZvcm1Db250cm9sLnJlZ2lzdGVyT25EaXNhYmxlZENoYW5nZSgoZGlzYWJsZWQpID0+IHtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmlucHV0UmFuZ2VGb3JtLmRpc2FibGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5wdXRSYW5nZUZvcm0uZW5hYmxlKCk7XG5cbiAgICAgICAgdGhpcy5lbmREaXNhYmxlZCQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKGRpc2FibGVkKSA9PiB7XG4gICAgICAgICAgY29uc3QgZW5kID0gdGhpcy5pbnB1dFJhbmdlRm9ybS5nZXQoJ2VuZCcpO1xuXG4gICAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgICAgIGVuZC5kaXNhYmxlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbmQuZW5hYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnByZXNldHMgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fcHJlc2V0cy5uZXh0KGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIodGhpcy5wcmVzZXRzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ByZXNldHMubmV4dCh0aGlzLmRieERhdGVUaW1lRmllbGRDb25maWdTZXJ2aWNlLmNvbmZpZ3VyYXRpb25zJCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aXZlRGF0ZVN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLmNhbGVuZGFyRm9jdXNEYXRlJC5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuYWN0aXZlRGF0ZSA9IHg7XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuX3N1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5faW5wdXRSYW5nZUZvcm1TdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2lucHV0UmFuZ2VGb3JtVmFsdWVTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2RhdGVSYW5nZUlucHV0U3ViLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9jdXJyZW50U2VsZWN0aW9uTW9kZVN1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fbGF0ZXN0Qm91bmRhcnlTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2Rpc2FibGVFbmRTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2FjdGl2ZURhdGVTdWIuZGVzdHJveSgpO1xuICAgIHRoaXMuX2NvbmZpZy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGUuY29tcGxldGUoKTtcbiAgICB0aGlzLl9kYXRlUmFuZ2VJbnB1dC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3RpbWV6b25lLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fcHJlc2V0cy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3NlbGVjdGlvbkV2ZW50LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2xPYnMuY29tcGxldGUoKTtcbiAgfVxuXG4gIHNlbGVjdGVkQ2hhbmdlKGRhdGU6IE1heWJlPERhdGU+KTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlUmFuZ2UoZGF0ZSA/IHsgc3RhcnQ6IGRhdGUgfSA6IG51bGwsICdjYWxlbmRhcicpO1xuICB9XG5cbiAgc2V0RGF0ZVJhbmdlKHJhbmdlOiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+LCB0eXBlOiBTZWxlY3RlZERhdGVFdmVudFR5cGUpIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25FdmVudC5uZXh0KHsgdHlwZSwgcmFuZ2UgfSk7XG4gIH1cblxuICBfY3JlYXRlRGF0ZVJhbmdlKGRhdGU6IE1heWJlPERhdGU+KTogTWF5YmU8RGF0ZVJhbmdlPiB7XG4gICAgcmV0dXJuIGRhdGUgPyBkYXRlUmFuZ2UoeyAuLi50aGlzLl9jdXJyZW50RGF0ZVJhbmdlSW5wdXQsIGRhdGUgfSBhcyBEYXRlUmFuZ2VJbnB1dCkgOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERieEZpeGVkRGF0ZVJhbmdlRmllbGRTZWxlY3Rpb25TdHJhdGVneTxEPiBpbXBsZW1lbnRzIE1hdERhdGVSYW5nZVNlbGVjdGlvblN0cmF0ZWd5PEQ+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPEQ+LCByZWFkb25seSBkYnhGaXhlZERhdGVSYW5nZUZpZWxkQ29tcG9uZW50OiBEYnhGaXhlZERhdGVSYW5nZUZpZWxkQ29tcG9uZW50KSB7fVxuXG4gIHNlbGVjdGlvbkZpbmlzaGVkKGRhdGU6IEQgfCBudWxsLCBjdXJyZW50UmFuZ2U6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4sIGV2ZW50OiBFdmVudCk6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4ge1xuICAgIC8vIHVudXNlZFxuICAgIHJldHVybiBjdXJyZW50UmFuZ2U7XG4gIH1cblxuICBjcmVhdGVQcmV2aWV3KGFjdGl2ZURhdGU6IEQgfCBudWxsLCBjdXJyZW50UmFuZ2U6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4sIGV2ZW50OiBFdmVudCk6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4ge1xuICAgIGNvbnN0IHsgY3VycmVudFNlbGVjdGlvbk1vZGUgfSA9IHRoaXMuZGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZENvbXBvbmVudDtcbiAgICBpZiAoYWN0aXZlRGF0ZSAhPSBudWxsICYmIGN1cnJlbnRTZWxlY3Rpb25Nb2RlICE9PSAnc2luZ2xlJykge1xuICAgICAgY29uc3QgbGF0ZXN0Qm91bmRhcnkgPSB0aGlzLmRieEZpeGVkRGF0ZVJhbmdlRmllbGRDb21wb25lbnQubGF0ZXN0Qm91bmRhcnk7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlRnJvbUFkYXB0ZXJEYXRlKGFjdGl2ZURhdGUpO1xuXG4gICAgICBpZiAobGF0ZXN0Qm91bmRhcnkgJiYgKGN1cnJlbnRTZWxlY3Rpb25Nb2RlID09PSAnbm9ybWFsJyB8fCBpc0RhdGVJbkRhdGVSYW5nZShkYXRlLCBsYXRlc3RCb3VuZGFyeSkpKSB7XG4gICAgICAgIGNvbnN0IGV4YW1wbGVEYXRlUmFuZ2UgPSB0aGlzLl9jcmVhdGVEYXRlUmFuZ2UobGF0ZXN0Qm91bmRhcnkpO1xuICAgICAgICByZXR1cm4gZXhhbXBsZURhdGVSYW5nZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRGF0ZVJhbmdlV2l0aERhdGUoYWN0aXZlRGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEYXRlUmFuZ2VXaXRoRGF0ZShpbnB1dDogRCB8IG51bGwpOiBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+IHtcbiAgICBsZXQgZGF0ZVJhbmdlOiBNYXliZTxEYXRlUmFuZ2U+O1xuXG4gICAgaWYgKGlucHV0KSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlRnJvbUFkYXB0ZXJEYXRlKGlucHV0KTtcbiAgICAgIGRhdGVSYW5nZSA9IHRoaXMuZGJ4Rml4ZWREYXRlUmFuZ2VGaWVsZENvbXBvbmVudC5fY3JlYXRlRGF0ZVJhbmdlKGRhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jcmVhdGVEYXRlUmFuZ2UoZGF0ZVJhbmdlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZURhdGVSYW5nZShpbnB1dDogTWF5YmU8RGF0ZVJhbmdlPik6IERhdGVQaWNrZXJEYXRlUmFuZ2U8RD4ge1xuICAgIGlmIChpbnB1dCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+KHRoaXMuYWRhcHRlckRhdGVGcm9tRGF0ZShpbnB1dC5zdGFydCksIHRoaXMuYWRhcHRlckRhdGVGcm9tRGF0ZShpbnB1dC5lbmQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlUGlja2VyRGF0ZVJhbmdlPEQ+KG51bGwsIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGRhdGVGcm9tQWRhcHRlckRhdGUoaW5wdXQ6IEQpIHtcbiAgICBjb25zdCBkYXk6IERheU9mTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKGlucHV0KTtcbiAgICBjb25zdCBtb250aEluZGV4OiBEYXRlTW9udGggPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChpbnB1dCk7XG4gICAgY29uc3QgeWVhcjogWWVhck51bWJlciA9IHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoaW5wdXQpO1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aEluZGV4LCBkYXkpO1xuICB9XG5cbiAgYWRhcHRlckRhdGVGcm9tRGF0ZShkYXRlOiBEYXRlKTogRCB7XG4gICAgY29uc3QgZGF5OiBEYXlPZk1vbnRoID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhJbmRleDogRGF0ZU1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIGNvbnN0IHllYXI6IFllYXJOdW1iZXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aEluZGV4LCBkYXkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGJ4LWZpeGVkZGF0ZXJhbmdlLWZpZWxkXCI+XG4gIDxtYXQtY2FsZW5kYXIgI2NhbGVuZGFyVmlldyBbc2VsZWN0ZWRdPVwiY2FsZW5kYXJTZWxlY3Rpb24kIHwgYXN5bmNcIiBbZGF0ZUZpbHRlcl09XCIocGlja2VyRmlsdGVyJCB8IGFzeW5jKSB8fCBkZWZhdWx0UGlja2VyRmlsdGVyXCIgW21pbkRhdGVdPVwibWluJCB8IGFzeW5jXCIgW21heERhdGVdPVwibWF4JCB8IGFzeW5jXCIgKHNlbGVjdGVkQ2hhbmdlKT1cInNlbGVjdGVkQ2hhbmdlKCRldmVudClcIj48L21hdC1jYWxlbmRhcj5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGJ4LWZpeGVkZGF0ZXJhbmdlLWZpZWxkLWlucHV0XCIgYXBwZWFyYW5jZT1cImZpbGxcIj5cbiAgICA8bWF0LWRhdGUtcmFuZ2UtaW5wdXQgKm5nSWY9XCJzaG93UmFuZ2VJbnB1dFwiIFtmb3JtR3JvdXBdPVwiaW5wdXRSYW5nZUZvcm1cIj5cbiAgICAgIDxpbnB1dCAjc3RhcnREYXRlSW5wdXQgbWF0U3RhcnREYXRlIGZvcm1Db250cm9sTmFtZT1cInN0YXJ0XCIgcGxhY2Vob2xkZXI9XCJTdGFydCBkYXRlXCIgLz5cbiAgICAgIDxpbnB1dCAjZW5kRGF0ZUlucHV0IFtuZ0NsYXNzXT1cIihlbmREaXNhYmxlZCQgfCBhc3luYykgPyAnZGJ4LWZpeGVkZGF0ZXJhbmdlLWZpZWxkLWlucHV0LWVuZCcgOiAnJ1wiIFthdHRyLnRhYmluZGV4XT1cIihlbmREaXNhYmxlZCQgfCBhc3luYykgPyAtMSA6IDBcIiBtYXRFbmREYXRlIGZvcm1Db250cm9sTmFtZT1cImVuZFwiIHBsYWNlaG9sZGVyPVwiRW5kIGRhdGVcIiAvPlxuICAgIDwvbWF0LWRhdGUtcmFuZ2UtaW5wdXQ+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKVwiPkRhdGUgcmFuZ2UgaXMgcmVxdWlyZWQ8L21hdC1lcnJvcj5cbjwvZGl2PlxuIl19