@openmrs/ngx-formentry 3.0.1-pre.8

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 (344) hide show
  1. package/abstract-controls-extension/afe-control-type.d.ts +6 -0
  2. package/abstract-controls-extension/afe-form-array.d.ts +43 -0
  3. package/abstract-controls-extension/afe-form-control.d.ts +46 -0
  4. package/abstract-controls-extension/afe-form-group.d.ts +38 -0
  5. package/abstract-controls-extension/control-extensions.d.ts +4 -0
  6. package/abstract-controls-extension/index.d.ts +4 -0
  7. package/abstract-controls-extension/value-change.listener.d.ts +4 -0
  8. package/bundles/openmrs-ngx-formentry.umd.js +15020 -0
  9. package/bundles/openmrs-ngx-formentry.umd.js.map +1 -0
  10. package/bundles/openmrs-ngx-formentry.umd.min.js +2 -0
  11. package/bundles/openmrs-ngx-formentry.umd.min.js.map +1 -0
  12. package/change-tracking/control-relation.d.ts +12 -0
  13. package/change-tracking/control-relations.d.ts +12 -0
  14. package/components/afe-ng-select.component.d.ts +26 -0
  15. package/components/appointments-overview/appointments-overview.component.d.ts +15 -0
  16. package/components/check-box/checkbox.component.d.ts +16 -0
  17. package/components/check-box/checkbox.module.d.ts +2 -0
  18. package/components/custom-component-wrapper/custom-component-wrapper..module.d.ts +2 -0
  19. package/components/custom-component-wrapper/custom-component-wrapper.component.d.ts +11 -0
  20. package/components/custom-control-wrapper/custom-control-wrapper..module.d.ts +2 -0
  21. package/components/custom-control-wrapper/custom-control-wrapper.component.d.ts +25 -0
  22. package/components/date-time-picker/date-picker/date-picker.component.d.ts +42 -0
  23. package/components/date-time-picker/date-time-picker.component.d.ts +26 -0
  24. package/components/date-time-picker/date-time-picker.module.d.ts +5 -0
  25. package/components/date-time-picker/picker-modal/modal.component.d.ts +10 -0
  26. package/components/date-time-picker/pipes/moment.pipe.d.ts +8 -0
  27. package/components/date-time-picker/time-picker/time-picker.component.d.ts +29 -0
  28. package/components/file-upload/file-upload.component.d.ts +26 -0
  29. package/components/file-upload/file-upload.module.d.ts +2 -0
  30. package/components/file-upload/secure.pipe.d.ts +23 -0
  31. package/components/input/input.directive.d.ts +28 -0
  32. package/components/input/input.module.d.ts +2 -0
  33. package/components/input/label.component.d.ts +87 -0
  34. package/components/input/text-area.directive.d.ts +21 -0
  35. package/components/ngx-datetime-picker/ngx-datetime-picker.component.d.ts +17 -0
  36. package/components/ngx-datetime-picker/ngx-datetime-picker.module.d.ts +5 -0
  37. package/components/ngx-pick-datetime/lib/date-time/adapter/date-time-adapter.class.d.ts +189 -0
  38. package/components/ngx-pick-datetime/lib/date-time/adapter/date-time-format.class.d.ts +15 -0
  39. package/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-adapter.class.d.ts +73 -0
  40. package/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-format.class.d.ts +5 -0
  41. package/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time.module.d.ts +7 -0
  42. package/components/ngx-pick-datetime/lib/date-time/calendar-body.component.d.ts +77 -0
  43. package/components/ngx-pick-datetime/lib/date-time/calendar-month-view.component.d.ts +139 -0
  44. package/components/ngx-pick-datetime/lib/date-time/calendar-multi-year-view.component.d.ts +109 -0
  45. package/components/ngx-pick-datetime/lib/date-time/calendar-year-view.component.d.ts +120 -0
  46. package/components/ngx-pick-datetime/lib/date-time/calendar.component.d.ts +141 -0
  47. package/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.d.ts +90 -0
  48. package/components/ngx-pick-datetime/lib/date-time/date-time-picker-container.component.d.ts +122 -0
  49. package/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.d.ts +152 -0
  50. package/components/ngx-pick-datetime/lib/date-time/date-time-picker-intl.service.d.ts +51 -0
  51. package/components/ngx-pick-datetime/lib/date-time/date-time-picker-trigger.directive.d.ts +21 -0
  52. package/components/ngx-pick-datetime/lib/date-time/date-time-picker.animations.d.ts +8 -0
  53. package/components/ngx-pick-datetime/lib/date-time/date-time-picker.component.d.ts +157 -0
  54. package/components/ngx-pick-datetime/lib/date-time/date-time.class.d.ts +86 -0
  55. package/components/ngx-pick-datetime/lib/date-time/date-time.module.d.ts +5 -0
  56. package/components/ngx-pick-datetime/lib/date-time/numberedFixLen.pipe.d.ts +7 -0
  57. package/components/ngx-pick-datetime/lib/date-time/timer-box.component.d.ts +35 -0
  58. package/components/ngx-pick-datetime/lib/date-time/timer.component.d.ts +129 -0
  59. package/components/ngx-pick-datetime/lib/dialog/dialog-config.class.d.ts +93 -0
  60. package/components/ngx-pick-datetime/lib/dialog/dialog-container.component.d.ts +56 -0
  61. package/components/ngx-pick-datetime/lib/dialog/dialog-ref.class.d.ts +49 -0
  62. package/components/ngx-pick-datetime/lib/dialog/dialog.module.d.ts +5 -0
  63. package/components/ngx-pick-datetime/lib/dialog/dialog.service.d.ts +70 -0
  64. package/components/ngx-pick-datetime/lib/utils/index.d.ts +4 -0
  65. package/components/ngx-pick-datetime/lib/utils/object.utils.d.ts +11 -0
  66. package/components/ngx-remote-select/ngx-remote-select.component.d.ts +37 -0
  67. package/components/ngx-remote-select/ngx-remote-select.module.d.ts +2 -0
  68. package/components/ngx-tabset/components/tab-set.d.ts +16 -0
  69. package/components/ngx-tabset/components/tab.d.ts +10 -0
  70. package/components/ngx-tabset/directives/hover-class.directive.d.ts +8 -0
  71. package/components/ngx-tabset/modules/ngx-tabset.module.d.ts +11 -0
  72. package/components/number-input/number-input.component.d.ts +148 -0
  73. package/components/number-input/number-input.module.d.ts +2 -0
  74. package/components/select/optgroup.directive.d.ts +3 -0
  75. package/components/select/option.directive.d.ts +3 -0
  76. package/components/select/select.component.d.ts +112 -0
  77. package/components/select/select.module.d.ts +2 -0
  78. package/esm2015/abstract-controls-extension/afe-control-type.js +8 -0
  79. package/esm2015/abstract-controls-extension/afe-form-array.js +85 -0
  80. package/esm2015/abstract-controls-extension/afe-form-control.js +88 -0
  81. package/esm2015/abstract-controls-extension/afe-form-group.js +61 -0
  82. package/esm2015/abstract-controls-extension/control-extensions.js +5 -0
  83. package/esm2015/abstract-controls-extension/index.js +5 -0
  84. package/esm2015/abstract-controls-extension/value-change.listener.js +2 -0
  85. package/esm2015/change-tracking/control-relation.js +44 -0
  86. package/esm2015/change-tracking/control-relations.js +32 -0
  87. package/esm2015/components/afe-ng-select.component.js +87 -0
  88. package/esm2015/components/appointments-overview/appointments-overview.component.js +119 -0
  89. package/esm2015/components/check-box/checkbox.component.js +77 -0
  90. package/esm2015/components/check-box/checkbox.module.js +14 -0
  91. package/esm2015/components/custom-component-wrapper/custom-component-wrapper..module.js +16 -0
  92. package/esm2015/components/custom-component-wrapper/custom-component-wrapper.component.js +18 -0
  93. package/esm2015/components/custom-control-wrapper/custom-control-wrapper..module.js +17 -0
  94. package/esm2015/components/custom-control-wrapper/custom-control-wrapper.component.js +63 -0
  95. package/esm2015/components/date-time-picker/date-picker/date-picker.component.js +182 -0
  96. package/esm2015/components/date-time-picker/date-time-picker.component.js +104 -0
  97. package/esm2015/components/date-time-picker/date-time-picker.module.js +34 -0
  98. package/esm2015/components/date-time-picker/picker-modal/modal.component.js +30 -0
  99. package/esm2015/components/date-time-picker/pipes/moment.pipe.js +13 -0
  100. package/esm2015/components/date-time-picker/time-picker/time-picker.component.js +114 -0
  101. package/esm2015/components/file-upload/file-upload.component.js +110 -0
  102. package/esm2015/components/file-upload/file-upload.module.js +24 -0
  103. package/esm2015/components/file-upload/secure.pipe.js +102 -0
  104. package/esm2015/components/input/input.directive.js +55 -0
  105. package/esm2015/components/input/input.module.js +18 -0
  106. package/esm2015/components/input/label.component.js +177 -0
  107. package/esm2015/components/input/text-area.directive.js +40 -0
  108. package/esm2015/components/ngx-datetime-picker/ngx-datetime-picker.component.js +60 -0
  109. package/esm2015/components/ngx-datetime-picker/ngx-datetime-picker.module.js +26 -0
  110. package/esm2015/components/ngx-pick-datetime/lib/date-time/adapter/date-time-adapter.class.js +114 -0
  111. package/esm2015/components/ngx-pick-datetime/lib/date-time/adapter/date-time-format.class.js +7 -0
  112. package/esm2015/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-adapter.class.js +344 -0
  113. package/esm2015/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-format.class.js +16 -0
  114. package/esm2015/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time.module.js +30 -0
  115. package/esm2015/components/ngx-pick-datetime/lib/date-time/calendar-body.component.js +149 -0
  116. package/esm2015/components/ngx-pick-datetime/lib/date-time/calendar-month-view.component.js +429 -0
  117. package/esm2015/components/ngx-pick-datetime/lib/date-time/calendar-multi-year-view.component.js +367 -0
  118. package/esm2015/components/ngx-pick-datetime/lib/date-time/calendar-year-view.component.js +359 -0
  119. package/esm2015/components/ngx-pick-datetime/lib/date-time/calendar.component.js +334 -0
  120. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.js +251 -0
  121. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-picker-container.component.js +380 -0
  122. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.js +590 -0
  123. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-picker-intl.service.js +60 -0
  124. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-picker-trigger.directive.js +71 -0
  125. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-picker.animations.js +21 -0
  126. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time-picker.component.js +512 -0
  127. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time.class.js +153 -0
  128. package/esm2015/components/ngx-pick-datetime/lib/date-time/date-time.module.js +58 -0
  129. package/esm2015/components/ngx-pick-datetime/lib/date-time/numberedFixLen.pipe.js +24 -0
  130. package/esm2015/components/ngx-pick-datetime/lib/date-time/timer-box.component.js +85 -0
  131. package/esm2015/components/ngx-pick-datetime/lib/date-time/timer.component.js +292 -0
  132. package/esm2015/components/ngx-pick-datetime/lib/dialog/dialog-config.class.js +56 -0
  133. package/esm2015/components/ngx-pick-datetime/lib/dialog/dialog-container.component.js +208 -0
  134. package/esm2015/components/ngx-pick-datetime/lib/dialog/dialog-ref.class.js +119 -0
  135. package/esm2015/components/ngx-pick-datetime/lib/dialog/dialog.module.js +22 -0
  136. package/esm2015/components/ngx-pick-datetime/lib/dialog/dialog.service.js +222 -0
  137. package/esm2015/components/ngx-pick-datetime/lib/utils/index.js +5 -0
  138. package/esm2015/components/ngx-pick-datetime/lib/utils/object.utils.js +26 -0
  139. package/esm2015/components/ngx-remote-select/ngx-remote-select.component.js +121 -0
  140. package/esm2015/components/ngx-remote-select/ngx-remote-select.module.js +16 -0
  141. package/esm2015/components/ngx-tabset/components/tab-set.js +67 -0
  142. package/esm2015/components/ngx-tabset/components/tab.js +35 -0
  143. package/esm2015/components/ngx-tabset/directives/hover-class.directive.js +26 -0
  144. package/esm2015/components/ngx-tabset/modules/ngx-tabset.module.js +33 -0
  145. package/esm2015/components/number-input/number-input.component.js +203 -0
  146. package/esm2015/components/number-input/number-input.module.js +15 -0
  147. package/esm2015/components/select/optgroup.directive.js +17 -0
  148. package/esm2015/components/select/option.directive.js +17 -0
  149. package/esm2015/components/select/select.component.js +293 -0
  150. package/esm2015/components/select/select.module.js +18 -0
  151. package/esm2015/form-entry/control-alerts/alert-helpers.js +40 -0
  152. package/esm2015/form-entry/control-alerts/can-generate-alert.js +2 -0
  153. package/esm2015/form-entry/control-calculators/can-calculate.js +2 -0
  154. package/esm2015/form-entry/control-hiders-disablers/can-disable.js +2 -0
  155. package/esm2015/form-entry/control-hiders-disablers/can-hide.js +2 -0
  156. package/esm2015/form-entry/control-hiders-disablers/disabler-helper.js +33 -0
  157. package/esm2015/form-entry/control-hiders-disablers/hider-helpers.js +40 -0
  158. package/esm2015/form-entry/data-sources/data-sources.js +30 -0
  159. package/esm2015/form-entry/data-sources/dummy-data-source.js +104 -0
  160. package/esm2015/form-entry/directives/collapse-animations.js +11 -0
  161. package/esm2015/form-entry/directives/collapse.directive.js +157 -0
  162. package/esm2015/form-entry/directives/historical-value-directive.js +66 -0
  163. package/esm2015/form-entry/error-renderer/error-renderer.component.js +55 -0
  164. package/esm2015/form-entry/expression-runner/expression-runner.js +168 -0
  165. package/esm2015/form-entry/form-entry.module.js +107 -0
  166. package/esm2015/form-entry/form-factory/control-relations.factory.js +236 -0
  167. package/esm2015/form-entry/form-factory/form-control.service.js +118 -0
  168. package/esm2015/form-entry/form-factory/form-node.js +81 -0
  169. package/esm2015/form-entry/form-factory/form.factory.js +132 -0
  170. package/esm2015/form-entry/form-factory/form.js +193 -0
  171. package/esm2015/form-entry/form-factory/hiders-disablers.factory.js +66 -0
  172. package/esm2015/form-entry/form-factory/question.factory.js +864 -0
  173. package/esm2015/form-entry/form-factory/show-messages.factory.js +30 -0
  174. package/esm2015/form-entry/form-factory/validation.factory.js +145 -0
  175. package/esm2015/form-entry/form-renderer/form-renderer.component.css.js +179 -0
  176. package/esm2015/form-entry/form-renderer/form-renderer.component.js +231 -0
  177. package/esm2015/form-entry/helpers/historical-expression-helper-service.js +38 -0
  178. package/esm2015/form-entry/helpers/historical-field-helper-service.js +36 -0
  179. package/esm2015/form-entry/helpers/js-expression-helper.js +238 -0
  180. package/esm2015/form-entry/pipes/time-ago.pipe.js +107 -0
  181. package/esm2015/form-entry/question-models/checkbox.model.js +11 -0
  182. package/esm2015/form-entry/question-models/conditional-validation.model.js +9 -0
  183. package/esm2015/form-entry/question-models/custom-control-question.model.js +10 -0
  184. package/esm2015/form-entry/question-models/date-question.js +12 -0
  185. package/esm2015/form-entry/question-models/date-validation.model.js +10 -0
  186. package/esm2015/form-entry/question-models/file-upload-question.js +13 -0
  187. package/esm2015/form-entry/question-models/group-question.js +12 -0
  188. package/esm2015/form-entry/question-models/interfaces/base-options.js +2 -0
  189. package/esm2015/form-entry/question-models/interfaces/checkbox-options.js +2 -0
  190. package/esm2015/form-entry/question-models/interfaces/data-source.js +2 -0
  191. package/esm2015/form-entry/question-models/interfaces/date-question-options.js +2 -0
  192. package/esm2015/form-entry/question-models/interfaces/file-upload-question-options.js +2 -0
  193. package/esm2015/form-entry/question-models/interfaces/group-question-options.js +2 -0
  194. package/esm2015/form-entry/question-models/interfaces/multi-select-options.js +2 -0
  195. package/esm2015/form-entry/question-models/interfaces/nested-questions.js +7 -0
  196. package/esm2015/form-entry/question-models/interfaces/repeating-question-options.js +2 -0
  197. package/esm2015/form-entry/question-models/interfaces/select-option.js +2 -0
  198. package/esm2015/form-entry/question-models/interfaces/select-question-options.js +2 -0
  199. package/esm2015/form-entry/question-models/interfaces/test-order-question-options.js +2 -0
  200. package/esm2015/form-entry/question-models/interfaces/text-area-question-options.js +2 -0
  201. package/esm2015/form-entry/question-models/interfaces/text-question-options.js +2 -0
  202. package/esm2015/form-entry/question-models/interfaces/ui-select-question-options.js +2 -0
  203. package/esm2015/form-entry/question-models/js-expression-validation.model.js +8 -0
  204. package/esm2015/form-entry/question-models/max-validation.model.js +9 -0
  205. package/esm2015/form-entry/question-models/min-validation.model.js +9 -0
  206. package/esm2015/form-entry/question-models/models.js +12 -0
  207. package/esm2015/form-entry/question-models/multi-select-question.js +11 -0
  208. package/esm2015/form-entry/question-models/pair.model.js +7 -0
  209. package/esm2015/form-entry/question-models/question-base.js +25 -0
  210. package/esm2015/form-entry/question-models/rendering-type.js +9 -0
  211. package/esm2015/form-entry/question-models/repeating-question.js +11 -0
  212. package/esm2015/form-entry/question-models/select-option.js +7 -0
  213. package/esm2015/form-entry/question-models/select-question.js +12 -0
  214. package/esm2015/form-entry/question-models/test-order-question.js +15 -0
  215. package/esm2015/form-entry/question-models/text-area-input-question.js +13 -0
  216. package/esm2015/form-entry/question-models/text-input-question.js +10 -0
  217. package/esm2015/form-entry/question-models/ui-select-question.js +11 -0
  218. package/esm2015/form-entry/question-models/validation.model.js +7 -0
  219. package/esm2015/form-entry/services/debug-mode.service.js +22 -0
  220. package/esm2015/form-entry/services/form-errors.service.js +18 -0
  221. package/esm2015/form-entry/services/form-schema-compiler.service.js +246 -0
  222. package/esm2015/form-entry/services/historical-encounter-data.service.js +170 -0
  223. package/esm2015/form-entry/utils/messages.js +12 -0
  224. package/esm2015/form-entry/validators/conditional-answered.validator.js +46 -0
  225. package/esm2015/form-entry/validators/conditional-required.validator.js +40 -0
  226. package/esm2015/form-entry/validators/date.validator.js +18 -0
  227. package/esm2015/form-entry/validators/future-date-restriction.validator.js +21 -0
  228. package/esm2015/form-entry/validators/js-expression.validator.js +26 -0
  229. package/esm2015/form-entry/validators/max-date.validator.js +23 -0
  230. package/esm2015/form-entry/validators/max.validator.js +17 -0
  231. package/esm2015/form-entry/validators/min-date.validator.js +23 -0
  232. package/esm2015/form-entry/validators/min.validator.js +17 -0
  233. package/esm2015/form-entry/validators/required.validator.js +11 -0
  234. package/esm2015/form-entry/validators/validations.js +5 -0
  235. package/esm2015/form-entry/value-adapters/encounter.adapter.js +172 -0
  236. package/esm2015/form-entry/value-adapters/obs-adapter-helper.js +496 -0
  237. package/esm2015/form-entry/value-adapters/obs.adapter.js +545 -0
  238. package/esm2015/form-entry/value-adapters/order.adapter.js +186 -0
  239. package/esm2015/form-entry/value-adapters/person-attribute.adapter.js +87 -0
  240. package/esm2015/form-entry/value-adapters/value.adapter.js +2 -0
  241. package/esm2015/lib/index.js +49 -0
  242. package/esm2015/openmrs-ngx-formentry.js +76 -0
  243. package/esm2015/public_api.js +2 -0
  244. package/esm2015/shared.module.js +15 -0
  245. package/fesm2015/openmrs-ngx-formentry.js +13458 -0
  246. package/fesm2015/openmrs-ngx-formentry.js.map +1 -0
  247. package/form-entry/control-alerts/alert-helpers.d.ts +9 -0
  248. package/form-entry/control-alerts/can-generate-alert.d.ts +18 -0
  249. package/form-entry/control-calculators/can-calculate.d.ts +5 -0
  250. package/form-entry/control-hiders-disablers/can-disable.d.ts +19 -0
  251. package/form-entry/control-hiders-disablers/can-hide.d.ts +20 -0
  252. package/form-entry/control-hiders-disablers/disabler-helper.d.ts +7 -0
  253. package/form-entry/control-hiders-disablers/hider-helpers.d.ts +9 -0
  254. package/form-entry/data-sources/data-sources.d.ts +7 -0
  255. package/form-entry/data-sources/dummy-data-source.d.ts +18 -0
  256. package/form-entry/directives/collapse-animations.d.ts +4 -0
  257. package/form-entry/directives/collapse.directive.d.ts +42 -0
  258. package/form-entry/directives/historical-value-directive.d.ts +13 -0
  259. package/form-entry/error-renderer/error-renderer.component.d.ts +17 -0
  260. package/form-entry/expression-runner/expression-runner.d.ts +15 -0
  261. package/form-entry/form-entry.module.d.ts +2 -0
  262. package/form-entry/form-factory/control-relations.factory.d.ts +15 -0
  263. package/form-entry/form-factory/form-control.service.d.ts +22 -0
  264. package/form-entry/form-factory/form-node.d.ts +51 -0
  265. package/form-entry/form-factory/form.d.ts +28 -0
  266. package/form-entry/form-factory/form.factory.d.ts +23 -0
  267. package/form-entry/form-factory/hiders-disablers.factory.d.ts +17 -0
  268. package/form-entry/form-factory/question.factory.d.ts +56 -0
  269. package/form-entry/form-factory/show-messages.factory.d.ts +12 -0
  270. package/form-entry/form-factory/validation.factory.d.ts +22 -0
  271. package/form-entry/form-renderer/form-renderer.component.css.d.ts +1 -0
  272. package/form-entry/form-renderer/form-renderer.component.d.ts +52 -0
  273. package/form-entry/helpers/historical-expression-helper-service.d.ts +5 -0
  274. package/form-entry/helpers/historical-field-helper-service.d.ts +4 -0
  275. package/form-entry/helpers/js-expression-helper.d.ts +22 -0
  276. package/form-entry/pipes/time-ago.pipe.d.ts +11 -0
  277. package/form-entry/question-models/checkbox.model.d.ts +9 -0
  278. package/form-entry/question-models/conditional-validation.model.d.ts +6 -0
  279. package/form-entry/question-models/custom-control-question.model.d.ts +6 -0
  280. package/form-entry/question-models/date-question.d.ts +7 -0
  281. package/form-entry/question-models/date-validation.model.d.ts +5 -0
  282. package/form-entry/question-models/file-upload-question.d.ts +8 -0
  283. package/form-entry/question-models/group-question.d.ts +8 -0
  284. package/form-entry/question-models/interfaces/base-options.d.ts +28 -0
  285. package/form-entry/question-models/interfaces/checkbox-options.d.ts +7 -0
  286. package/form-entry/question-models/interfaces/data-source.d.ts +10 -0
  287. package/form-entry/question-models/interfaces/date-question-options.d.ts +3 -0
  288. package/form-entry/question-models/interfaces/file-upload-question-options.d.ts +5 -0
  289. package/form-entry/question-models/interfaces/group-question-options.d.ts +5 -0
  290. package/form-entry/question-models/interfaces/multi-select-options.d.ts +4 -0
  291. package/form-entry/question-models/interfaces/nested-questions.d.ts +6 -0
  292. package/form-entry/question-models/interfaces/repeating-question-options.d.ts +5 -0
  293. package/form-entry/question-models/interfaces/select-option.d.ts +4 -0
  294. package/form-entry/question-models/interfaces/select-question-options.d.ts +9 -0
  295. package/form-entry/question-models/interfaces/test-order-question-options.d.ts +14 -0
  296. package/form-entry/question-models/interfaces/text-area-question-options.d.ts +5 -0
  297. package/form-entry/question-models/interfaces/text-question-options.d.ts +4 -0
  298. package/form-entry/question-models/interfaces/ui-select-question-options.d.ts +9 -0
  299. package/form-entry/question-models/js-expression-validation.model.d.ts +5 -0
  300. package/form-entry/question-models/max-validation.model.d.ts +5 -0
  301. package/form-entry/question-models/min-validation.model.d.ts +5 -0
  302. package/form-entry/question-models/models.d.ts +15 -0
  303. package/form-entry/question-models/multi-select-question.d.ts +9 -0
  304. package/form-entry/question-models/pair.model.d.ts +5 -0
  305. package/form-entry/question-models/question-base.d.ts +40 -0
  306. package/form-entry/question-models/rendering-type.d.ts +7 -0
  307. package/form-entry/question-models/repeating-question.d.ts +7 -0
  308. package/form-entry/question-models/select-option.d.ts +6 -0
  309. package/form-entry/question-models/select-question.d.ts +10 -0
  310. package/form-entry/question-models/test-order-question.d.ts +13 -0
  311. package/form-entry/question-models/text-area-input-question.d.ts +7 -0
  312. package/form-entry/question-models/text-input-question.d.ts +6 -0
  313. package/form-entry/question-models/ui-select-question.d.ts +11 -0
  314. package/form-entry/question-models/validation.model.d.ts +5 -0
  315. package/form-entry/services/debug-mode.service.d.ts +5 -0
  316. package/form-entry/services/form-errors.service.d.ts +10 -0
  317. package/form-entry/services/form-schema-compiler.service.d.ts +20 -0
  318. package/form-entry/services/historical-encounter-data.service.d.ts +12 -0
  319. package/form-entry/utils/messages.d.ts +11 -0
  320. package/form-entry/validators/conditional-answered.validator.d.ts +8 -0
  321. package/form-entry/validators/conditional-required.validator.d.ts +8 -0
  322. package/form-entry/validators/date.validator.d.ts +7 -0
  323. package/form-entry/validators/future-date-restriction.validator.d.ts +7 -0
  324. package/form-entry/validators/js-expression.validator.d.ts +8 -0
  325. package/form-entry/validators/max-date.validator.d.ts +6 -0
  326. package/form-entry/validators/max.validator.d.ts +6 -0
  327. package/form-entry/validators/min-date.validator.d.ts +6 -0
  328. package/form-entry/validators/min.validator.d.ts +6 -0
  329. package/form-entry/validators/required.validator.d.ts +6 -0
  330. package/form-entry/validators/validations.d.ts +4 -0
  331. package/form-entry/value-adapters/encounter.adapter.d.ts +23 -0
  332. package/form-entry/value-adapters/obs-adapter-helper.d.ts +27 -0
  333. package/form-entry/value-adapters/obs.adapter.d.ts +35 -0
  334. package/form-entry/value-adapters/order.adapter.d.ts +17 -0
  335. package/form-entry/value-adapters/person-attribute.adapter.d.ts +12 -0
  336. package/form-entry/value-adapters/value.adapter.d.ts +5 -0
  337. package/lib/index.d.ts +49 -0
  338. package/openmrs-ngx-formentry.d.ts +85 -0
  339. package/openmrs-ngx-formentry.metadata.json +1 -0
  340. package/package.json +35 -0
  341. package/public_api.d.ts +1 -0
  342. package/shared.module.d.ts +2 -0
  343. package/styles/ngx-formentry.css +374 -0
  344. package/styles/picker.min.css +770 -0
@@ -0,0 +1,380 @@
1
+ /* eslint-disable @angular-eslint/no-host-metadata-property */
2
+ /**
3
+ * date-time-picker-container.component
4
+ */
5
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Optional, ViewChild } from '@angular/core';
6
+ import { OwlDateTimeIntl } from './date-time-picker-intl.service';
7
+ import { OwlCalendarComponent } from './calendar.component';
8
+ import { OwlTimerComponent } from './timer.component';
9
+ import { DateTimeAdapter } from './adapter/date-time-adapter.class';
10
+ import { Subject } from 'rxjs';
11
+ import { owlDateTimePickerAnimations } from './date-time-picker.animations';
12
+ import { DOWN_ARROW, LEFT_ARROW, RIGHT_ARROW, SPACE, UP_ARROW } from '@angular/cdk/keycodes';
13
+ export class OwlDateTimeContainerComponent {
14
+ constructor(cdRef, elmRef, pickerIntl, dateTimeAdapter) {
15
+ this.cdRef = cdRef;
16
+ this.elmRef = elmRef;
17
+ this.pickerIntl = pickerIntl;
18
+ this.dateTimeAdapter = dateTimeAdapter;
19
+ this.activeSelectedIndex = 0; // The current active SelectedIndex in range select mode (0: 'from', 1: 'to')
20
+ /**
21
+ * Stream emits when try to hide picker
22
+ * */
23
+ this.hidePicker$ = new Subject();
24
+ /**
25
+ * Stream emits when try to confirm the selected value
26
+ * */
27
+ this.confirmSelected$ = new Subject();
28
+ this.pickerOpened$ = new Subject();
29
+ }
30
+ get hidePickerStream() {
31
+ return this.hidePicker$.asObservable();
32
+ }
33
+ get confirmSelectedStream() {
34
+ return this.confirmSelected$.asObservable();
35
+ }
36
+ get pickerOpenedStream() {
37
+ return this.pickerOpened$.asObservable();
38
+ }
39
+ get pickerMoment() {
40
+ return this._clamPickerMoment;
41
+ }
42
+ set pickerMoment(value) {
43
+ if (value) {
44
+ this._clamPickerMoment = this.dateTimeAdapter.clampDate(value, this.picker.minDateTime, this.picker.maxDateTime);
45
+ }
46
+ this.cdRef.markForCheck();
47
+ }
48
+ get pickerType() {
49
+ return this.picker.pickerType;
50
+ }
51
+ get cancelLabel() {
52
+ return this.pickerIntl.cancelBtnLabel;
53
+ }
54
+ get setLabel() {
55
+ return this.pickerIntl.setBtnLabel;
56
+ }
57
+ /**
58
+ * The range 'from' label
59
+ * */
60
+ get fromLabel() {
61
+ return this.pickerIntl.rangeFromLabel;
62
+ }
63
+ /**
64
+ * The range 'to' label
65
+ * */
66
+ get toLabel() {
67
+ return this.pickerIntl.rangeToLabel;
68
+ }
69
+ /**
70
+ * The range 'from' formatted value
71
+ * */
72
+ get fromFormattedValue() {
73
+ const value = this.picker.selecteds[0];
74
+ return value
75
+ ? this.dateTimeAdapter.format(value, this.picker.formatString)
76
+ : '';
77
+ }
78
+ /**
79
+ * The range 'to' formatted value
80
+ * */
81
+ get toFormattedValue() {
82
+ const value = this.picker.selecteds[1];
83
+ return value
84
+ ? this.dateTimeAdapter.format(value, this.picker.formatString)
85
+ : '';
86
+ }
87
+ /**
88
+ * Cases in which the control buttons show in the picker
89
+ * 1) picker mode is 'dialog'
90
+ * 2) picker type is NOT 'calendar' and the picker mode is NOT 'inline'
91
+ * */
92
+ get showControlButtons() {
93
+ return (this.picker.pickerMode === 'dialog' ||
94
+ (this.picker.pickerType !== 'calendar' &&
95
+ this.picker.pickerMode !== 'inline'));
96
+ }
97
+ get containerElm() {
98
+ return this.elmRef.nativeElement;
99
+ }
100
+ get owlDTContainerClass() {
101
+ return true;
102
+ }
103
+ get owlDTPopupContainerClass() {
104
+ return this.picker.pickerMode === 'popup';
105
+ }
106
+ get owlDTDialogContainerClass() {
107
+ return this.picker.pickerMode === 'dialog';
108
+ }
109
+ get owlDTInlineContainerClass() {
110
+ return this.picker.pickerMode === 'inline';
111
+ }
112
+ get owlDTContainerDisabledClass() {
113
+ return this.picker.disabled;
114
+ }
115
+ get owlDTContainerId() {
116
+ return this.picker.id;
117
+ }
118
+ get owlDTContainerAnimation() {
119
+ return this.picker.pickerMode === 'inline' ? '' : 'enter';
120
+ }
121
+ ngOnInit() { }
122
+ ngAfterContentInit() {
123
+ this.initPicker();
124
+ }
125
+ ngAfterViewInit() {
126
+ this.focusPicker();
127
+ }
128
+ handleContainerAnimationDone(event) {
129
+ const toState = event.toState;
130
+ if (toState === 'enter') {
131
+ this.pickerOpened$.next();
132
+ }
133
+ }
134
+ dateSelected(date) {
135
+ let result;
136
+ if (this.picker.isInSingleMode) {
137
+ result = this.dateSelectedInSingleMode(date);
138
+ if (result) {
139
+ this.pickerMoment = result;
140
+ this.picker.select(result);
141
+ }
142
+ else {
143
+ // we close the picker when result is null and pickerType is calendar.
144
+ if (this.pickerType === 'calendar') {
145
+ this.hidePicker$.next(null);
146
+ }
147
+ }
148
+ return;
149
+ }
150
+ if (this.picker.isInRangeMode) {
151
+ result = this.dateSelectedInRangeMode(date);
152
+ if (result) {
153
+ this.pickerMoment = result[this.activeSelectedIndex];
154
+ this.picker.select(result);
155
+ }
156
+ }
157
+ }
158
+ timeSelected(time) {
159
+ this.pickerMoment = this.dateTimeAdapter.clone(time);
160
+ if (!this.picker.dateTimeChecker(this.pickerMoment)) {
161
+ return;
162
+ }
163
+ if (this.picker.isInSingleMode) {
164
+ this.picker.select(this.pickerMoment);
165
+ return;
166
+ }
167
+ if (this.picker.isInRangeMode) {
168
+ const selecteds = [...this.picker.selecteds];
169
+ // check if the 'from' is after 'to' or 'to'is before 'from'
170
+ // In this case, we set both the 'from' and 'to' the same value
171
+ if ((this.activeSelectedIndex === 0 &&
172
+ selecteds[1] &&
173
+ this.dateTimeAdapter.compare(this.pickerMoment, selecteds[1]) ===
174
+ 1) ||
175
+ (this.activeSelectedIndex === 1 &&
176
+ selecteds[0] &&
177
+ this.dateTimeAdapter.compare(this.pickerMoment, selecteds[0]) === -1)) {
178
+ selecteds[0] = this.pickerMoment;
179
+ selecteds[1] = this.pickerMoment;
180
+ }
181
+ else {
182
+ selecteds[this.activeSelectedIndex] = this.pickerMoment;
183
+ }
184
+ this.picker.select(selecteds);
185
+ }
186
+ }
187
+ /**
188
+ * Handle click on cancel button
189
+ */
190
+ onCancelClicked(event) {
191
+ this.hidePicker$.next(null);
192
+ event.preventDefault();
193
+ return;
194
+ }
195
+ /**
196
+ * Handle click on set button
197
+ */
198
+ onSetClicked(event) {
199
+ if (!this.picker.dateTimeChecker(this.pickerMoment)) {
200
+ this.hidePicker$.next(null);
201
+ event.preventDefault();
202
+ return;
203
+ }
204
+ this.confirmSelected$.next(event);
205
+ event.preventDefault();
206
+ return;
207
+ }
208
+ /**
209
+ * Handle click on inform radio group
210
+ */
211
+ handleClickOnInfoGroup(event, index) {
212
+ this.setActiveSelectedIndex(index);
213
+ event.preventDefault();
214
+ event.stopPropagation();
215
+ }
216
+ /**
217
+ * Handle click on inform radio group
218
+ */
219
+ handleKeydownOnInfoGroup(event, next, index) {
220
+ switch (event.keyCode) {
221
+ case DOWN_ARROW:
222
+ case RIGHT_ARROW:
223
+ case UP_ARROW:
224
+ case LEFT_ARROW:
225
+ next.focus();
226
+ this.setActiveSelectedIndex(index === 0 ? 1 : 0);
227
+ event.preventDefault();
228
+ event.stopPropagation();
229
+ break;
230
+ case SPACE:
231
+ this.setActiveSelectedIndex(index);
232
+ event.preventDefault();
233
+ event.stopPropagation();
234
+ break;
235
+ default:
236
+ return;
237
+ }
238
+ }
239
+ /**
240
+ * Set the value of activeSelectedIndex
241
+ */
242
+ setActiveSelectedIndex(index) {
243
+ if (this.picker.selectMode === 'range' &&
244
+ this.activeSelectedIndex !== index) {
245
+ this.activeSelectedIndex = index;
246
+ const selected = this.picker.selecteds[this.activeSelectedIndex];
247
+ if (this.picker.selecteds && selected) {
248
+ this.pickerMoment = this.dateTimeAdapter.clone(selected);
249
+ }
250
+ }
251
+ return;
252
+ }
253
+ initPicker() {
254
+ this.pickerMoment = this.picker.startAt || this.dateTimeAdapter.now();
255
+ this.activeSelectedIndex = this.picker.selectMode === 'rangeTo' ? 1 : 0;
256
+ }
257
+ /**
258
+ * Select calendar date in single mode,
259
+ * it returns null when date is not selected.
260
+ */
261
+ dateSelectedInSingleMode(date) {
262
+ if (this.dateTimeAdapter.isSameDay(date, this.picker.selected)) {
263
+ return null;
264
+ }
265
+ return this.updateAndCheckCalendarDate(date);
266
+ }
267
+ /**
268
+ * Select dates in range Mode
269
+ */
270
+ dateSelectedInRangeMode(date) {
271
+ let from = this.picker.selecteds[0];
272
+ let to = this.picker.selecteds[1];
273
+ const result = this.updateAndCheckCalendarDate(date);
274
+ if (!result) {
275
+ return null;
276
+ }
277
+ // if the given calendar day is after or equal to 'from',
278
+ // set ths given date as 'to'
279
+ // otherwise, set it as 'from' and set 'to' to null
280
+ if (this.picker.selectMode === 'range') {
281
+ if (this.picker.selecteds &&
282
+ this.picker.selecteds.length &&
283
+ !to &&
284
+ from &&
285
+ this.dateTimeAdapter.differenceInCalendarDays(result, from) >= 0) {
286
+ to = result;
287
+ this.activeSelectedIndex = 1;
288
+ }
289
+ else {
290
+ from = result;
291
+ to = null;
292
+ this.activeSelectedIndex = 0;
293
+ }
294
+ }
295
+ else if (this.picker.selectMode === 'rangeFrom') {
296
+ from = result;
297
+ // if the from value is after the to value, set the to value as null
298
+ if (to && this.dateTimeAdapter.compare(from, to) > 0) {
299
+ to = null;
300
+ }
301
+ }
302
+ else if (this.picker.selectMode === 'rangeTo') {
303
+ to = result;
304
+ // if the from value is after the to value, set the from value as null
305
+ if (from && this.dateTimeAdapter.compare(from, to) > 0) {
306
+ from = null;
307
+ }
308
+ }
309
+ return [from, to];
310
+ }
311
+ /**
312
+ * Update the given calendar date's time and check if it is valid
313
+ * Because the calendar date has 00:00:00 as default time, if the picker type is 'both',
314
+ * we need to update the given calendar date's time before selecting it.
315
+ * if it is valid, return the updated dateTime
316
+ * if it is not valid, return null
317
+ */
318
+ updateAndCheckCalendarDate(date) {
319
+ let result;
320
+ // if the picker is 'both', update the calendar date's time value
321
+ if (this.picker.pickerType === 'both') {
322
+ result = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(date), this.dateTimeAdapter.getMonth(date), this.dateTimeAdapter.getDate(date), this.dateTimeAdapter.getHours(this.pickerMoment), this.dateTimeAdapter.getMinutes(this.pickerMoment), this.dateTimeAdapter.getSeconds(this.pickerMoment));
323
+ result = this.dateTimeAdapter.clampDate(result, this.picker.minDateTime, this.picker.maxDateTime);
324
+ }
325
+ else {
326
+ result = this.dateTimeAdapter.clone(date);
327
+ }
328
+ // check the updated dateTime
329
+ return this.picker.dateTimeChecker(result) ? result : null;
330
+ }
331
+ /**
332
+ * Focus to the picker
333
+ * */
334
+ focusPicker() {
335
+ if (this.picker.pickerMode === 'inline') {
336
+ return;
337
+ }
338
+ if (this.calendar) {
339
+ this.calendar.focusActiveCell();
340
+ }
341
+ else if (this.timer) {
342
+ this.timer.focus();
343
+ }
344
+ }
345
+ }
346
+ OwlDateTimeContainerComponent.decorators = [
347
+ { type: Component, args: [{
348
+ exportAs: 'owlDateTimeContainer',
349
+ selector: 'owl-date-time-container',
350
+ template: "<div [cdkTrapFocus]=\"picker.pickerMode !== 'inline'\"\n [@fadeInPicker]=\"picker.pickerMode === 'inline'? '' : 'enter'\"\n class=\"owl-dt-container-inner\">\n\n <owl-date-time-calendar\n *ngIf=\"pickerType === 'both' || pickerType === 'calendar'\"\n class=\"owl-dt-container-row\"\n [firstDayOfWeek]=\"picker.firstDayOfWeek\"\n [(pickerMoment)]=\"pickerMoment\"\n [selected]=\"picker.selected\"\n [selecteds]=\"picker.selecteds\"\n [selectMode]=\"picker.selectMode\"\n [minDate]=\"picker.minDateTime\"\n [maxDate]=\"picker.maxDateTime\"\n [dateFilter]=\"picker.dateTimeFilter\"\n [startView]=\"picker.startView\"\n [hideOtherMonths]=\"picker.hideOtherMonths\"\n (yearSelected)=\"picker.selectYear($event)\"\n (monthSelected)=\"picker.selectMonth($event)\"\n (selectedChange)=\"dateSelected($event)\"></owl-date-time-calendar>\n\n <owl-date-time-timer\n *ngIf=\"pickerType === 'both' || pickerType === 'timer'\"\n class=\"owl-dt-container-row\"\n [pickerMoment]=\"pickerMoment\"\n [minDateTime]=\"picker.minDateTime\"\n [maxDateTime]=\"picker.maxDateTime\"\n [showSecondsTimer]=\"picker.showSecondsTimer\"\n [hour12Timer]=\"picker.hour12Timer\"\n [stepHour]=\"picker.stepHour\"\n [stepMinute]=\"picker.stepMinute\"\n [stepSecond]=\"picker.stepSecond\"\n (selectedChange)=\"timeSelected($event)\"></owl-date-time-timer>\n\n <div *ngIf=\"picker.isInRangeMode\"\n role=\"radiogroup\"\n class=\"owl-dt-container-info owl-dt-container-row\">\n <div role=\"radio\" [tabindex]=\"activeSelectedIndex === 0 ? 0 : -1\"\n [attr.aria-checked]=\"activeSelectedIndex === 0\"\n class=\"owl-dt-control owl-dt-container-range owl-dt-container-from\"\n [ngClass]=\"{'owl-dt-container-info-active': activeSelectedIndex === 0}\"\n (click)=\"handleClickOnInfoGroup($event, 0)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, to, 0)\" #from>\n <span class=\"owl-dt-control-content owl-dt-container-range-content\" tabindex=\"-1\">\n <span class=\"owl-dt-container-info-label\">{{fromLabel}}:</span>\n <span class=\"owl-dt-container-info-value\">{{fromFormattedValue}}</span>\n </span>\n </div>\n <div role=\"radio\" [tabindex]=\"activeSelectedIndex === 1 ? 0 : -1\"\n [attr.aria-checked]=\"activeSelectedIndex === 1\"\n class=\"owl-dt-control owl-dt-container-range owl-dt-container-to\"\n [ngClass]=\"{'owl-dt-container-info-active': activeSelectedIndex === 1}\"\n (click)=\"handleClickOnInfoGroup($event, 1)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, from, 1)\" #to>\n <span class=\"owl-dt-control-content owl-dt-container-range-content\" tabindex=\"-1\">\n <span class=\"owl-dt-container-info-label\">{{toLabel}}:</span>\n <span class=\"owl-dt-container-info-value\">{{toFormattedValue}}</span>\n </span>\n </div>\n </div>\n\n <div *ngIf=\"showControlButtons\" class=\"owl-dt-container-buttons owl-dt-container-row\">\n <button class=\"owl-dt-control owl-dt-control-button owl-dt-container-control-button\"\n type=\"button\" tabindex=\"0\"\n (click)=\"onCancelClicked($event)\">\n <span class=\"owl-dt-control-content owl-dt-control-button-content\" tabindex=\"-1\">\n {{cancelLabel}}\n </span>\n </button>\n <button class=\"owl-dt-control owl-dt-control-button owl-dt-container-control-button\"\n type=\"button\" tabindex=\"0\"\n (click)=\"onSetClicked($event)\">\n <span class=\"owl-dt-control-content owl-dt-control-button-content\" tabindex=\"-1\">\n {{setLabel}}\n </span>\n </button>\n </div>\n</div>\n",
351
+ changeDetection: ChangeDetectionStrategy.OnPush,
352
+ preserveWhitespaces: false,
353
+ animations: [
354
+ owlDateTimePickerAnimations.transformPicker,
355
+ owlDateTimePickerAnimations.fadeInPicker
356
+ ],
357
+ host: {
358
+ '(@transformPicker.done)': 'handleContainerAnimationDone($event)',
359
+ '[class.owl-dt-container]': 'owlDTContainerClass',
360
+ '[class.owl-dt-popup-container]': 'owlDTPopupContainerClass',
361
+ '[class.owl-dt-dialog-container]': 'owlDTDialogContainerClass',
362
+ '[class.owl-dt-inline-container]': 'owlDTInlineContainerClass',
363
+ '[class.owl-dt-container-disabled]': 'owlDTContainerDisabledClass',
364
+ '[attr.id]': 'owlDTContainerId',
365
+ '[@transformPicker]': 'owlDTContainerAnimation'
366
+ },
367
+ styles: [""]
368
+ },] }
369
+ ];
370
+ OwlDateTimeContainerComponent.ctorParameters = () => [
371
+ { type: ChangeDetectorRef },
372
+ { type: ElementRef },
373
+ { type: OwlDateTimeIntl },
374
+ { type: DateTimeAdapter, decorators: [{ type: Optional }] }
375
+ ];
376
+ OwlDateTimeContainerComponent.propDecorators = {
377
+ calendar: [{ type: ViewChild, args: [OwlCalendarComponent, { static: false },] }],
378
+ timer: [{ type: ViewChild, args: [OwlTimerComponent, { static: false },] }]
379
+ };
380
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWZvcm1lbnRyeS9zcmMvY29tcG9uZW50cy9uZ3gtcGljay1kYXRldGltZS9saWIvZGF0ZS10aW1lL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4REFBOEQ7QUFDOUQ7O0dBRUc7QUFFSCxPQUFPLEVBR0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUVWLFFBQVEsRUFDUixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVFLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxLQUFLLEVBQ0wsUUFBUSxFQUNULE1BQU0sdUJBQXVCLENBQUM7QUF3Qi9CLE1BQU0sT0FBTyw2QkFBNkI7SUFrSnhDLFlBQ1UsS0FBd0IsRUFDeEIsTUFBa0IsRUFDbEIsVUFBMkIsRUFDZixlQUFtQztRQUgvQyxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixXQUFNLEdBQU4sTUFBTSxDQUFZO1FBQ2xCLGVBQVUsR0FBVixVQUFVLENBQWlCO1FBQ2Ysb0JBQWUsR0FBZixlQUFlLENBQW9CO1FBOUls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U0FBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvbm8taG9zdC1tZXRhZGF0YS1wcm9wZXJ0eSAqL1xuLyoqXG4gKiBkYXRlLXRpbWUtcGlja2VyLWNvbnRhaW5lci5jb21wb25lbnRcbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQW5pbWF0aW9uRXZlbnQgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IE93bERhdGVUaW1lSW50bCB9IGZyb20gJy4vZGF0ZS10aW1lLXBpY2tlci1pbnRsLnNlcnZpY2UnO1xuaW1wb3J0IHsgT3dsQ2FsZW5kYXJDb21wb25lbnQgfSBmcm9tICcuL2NhbGVuZGFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPd2xUaW1lckNvbXBvbmVudCB9IGZyb20gJy4vdGltZXIuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVUaW1lQWRhcHRlciB9IGZyb20gJy4vYWRhcHRlci9kYXRlLXRpbWUtYWRhcHRlci5jbGFzcyc7XG5pbXBvcnQgeyBPd2xEYXRlVGltZSwgUGlja2VyVHlwZSB9IGZyb20gJy4vZGF0ZS10aW1lLmNsYXNzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG93bERhdGVUaW1lUGlja2VyQW5pbWF0aW9ucyB9IGZyb20gJy4vZGF0ZS10aW1lLXBpY2tlci5hbmltYXRpb25zJztcbmltcG9ydCB7XG4gIERPV05fQVJST1csXG4gIExFRlRfQVJST1csXG4gIFJJR0hUX0FSUk9XLFxuICBTUEFDRSxcbiAgVVBfQVJST1dcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcblxuQENvbXBvbmVudCh7XG4gIGV4cG9ydEFzOiAnb3dsRGF0ZVRpbWVDb250YWluZXInLFxuICBzZWxlY3RvcjogJ293bC1kYXRlLXRpbWUtY29udGFpbmVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBhbmltYXRpb25zOiBbXG4gICAgb3dsRGF0ZVRpbWVQaWNrZXJBbmltYXRpb25zLnRyYW5zZm9ybVBpY2tlcixcbiAgICBvd2xEYXRlVGltZVBpY2tlckFuaW1hdGlvbnMuZmFkZUluUGlja2VyXG4gIF0sXG4gIGhvc3Q6IHtcbiAgICAnKEB0cmFuc2Zvcm1QaWNrZXIuZG9uZSknOiAnaGFuZGxlQ29udGFpbmVyQW5pbWF0aW9uRG9uZSgkZXZlbnQpJyxcbiAgICAnW2NsYXNzLm93bC1kdC1jb250YWluZXJdJzogJ293bERUQ29udGFpbmVyQ2xhc3MnLFxuICAgICdbY2xhc3Mub3dsLWR0LXBvcHVwLWNvbnRhaW5lcl0nOiAnb3dsRFRQb3B1cENvbnRhaW5lckNsYXNzJyxcbiAgICAnW2NsYXNzLm93bC1kdC1kaWFsb2ctY29udGFpbmVyXSc6ICdvd2xEVERpYWxvZ0NvbnRhaW5lckNsYXNzJyxcbiAgICAnW2NsYXNzLm93bC1kdC1pbmxpbmUtY29udGFpbmVyXSc6ICdvd2xEVElubGluZUNvbnRhaW5lckNsYXNzJyxcbiAgICAnW2NsYXNzLm93bC1kdC1jb250YWluZXItZGlzYWJsZWRdJzogJ293bERUQ29udGFpbmVyRGlzYWJsZWRDbGFzcycsXG4gICAgJ1thdHRyLmlkXSc6ICdvd2xEVENvbnRhaW5lcklkJyxcbiAgICAnW0B0cmFuc2Zvcm1QaWNrZXJdJzogJ293bERUQ29udGFpbmVyQW5pbWF0aW9uJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE93bERhdGVUaW1lQ29udGFpbmVyQ29tcG9uZW50PFQ+XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0IHtcbiAgQFZpZXdDaGlsZChPd2xDYWxlbmRhckNvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGNhbGVuZGFyOiBPd2xDYWxlbmRhckNvbXBvbmVudDxUPjtcbiAgQFZpZXdDaGlsZChPd2xUaW1lckNvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRpbWVyOiBPd2xUaW1lckNvbXBvbmVudDxUPjtcblxuICBwdWJsaWMgcGlja2VyOiBPd2xEYXRlVGltZTxUPjtcbiAgcHVibGljIGFjdGl2ZVNlbGVjdGVkSW5kZXggPSAwOyAvLyBUaGUgY3VycmVudCBhY3RpdmUgU2VsZWN0ZWRJbmRleCBpbiByYW5nZSBzZWxlY3QgbW9kZSAoMDogJ2Zyb20nLCAxOiAndG8nKVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gZW1pdHMgd2hlbiB0cnkgdG8gaGlkZSBwaWNrZXJcbiAgICogKi9cbiAgcHJpdmF0ZSBoaWRlUGlja2VyJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICBnZXQgaGlkZVBpY2tlclN0cmVhbSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmhpZGVQaWNrZXIkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBlbWl0cyB3aGVuIHRyeSB0byBjb25maXJtIHRoZSBzZWxlY3RlZCB2YWx1ZVxuICAgKiAqL1xuICBwcml2YXRlIGNvbmZpcm1TZWxlY3RlZCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgZ2V0IGNvbmZpcm1TZWxlY3RlZFN0cmVhbSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpcm1TZWxlY3RlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHBpY2tlck9wZW5lZCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgZ2V0IHBpY2tlck9wZW5lZFN0cmVhbSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBpY2tlck9wZW5lZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcGlja2VyIG1vbWVudC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIHRpbWUgcGVyaW9kIGlzIHNob3duIGFuZCB3aGljaCBkYXRlIGlzXG4gICAqIGhpZ2hsaWdodGVkIHdoZW4gdXNpbmcga2V5Ym9hcmQgbmF2aWdhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgX2NsYW1QaWNrZXJNb21lbnQ6IFQ7XG5cbiAgZ2V0IHBpY2tlck1vbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xhbVBpY2tlck1vbWVudDtcbiAgfVxuXG4gIHNldCBwaWNrZXJNb21lbnQodmFsdWU6IFQpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX2NsYW1QaWNrZXJNb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbGFtcERhdGUoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0aGlzLnBpY2tlci5taW5EYXRlVGltZSxcbiAgICAgICAgdGhpcy5waWNrZXIubWF4RGF0ZVRpbWVcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgcGlja2VyVHlwZSgpOiBQaWNrZXJUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5waWNrZXIucGlja2VyVHlwZTtcbiAgfVxuXG4gIGdldCBjYW5jZWxMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBpY2tlckludGwuY2FuY2VsQnRuTGFiZWw7XG4gIH1cblxuICBnZXQgc2V0TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5waWNrZXJJbnRsLnNldEJ0bkxhYmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByYW5nZSAnZnJvbScgbGFiZWxcbiAgICogKi9cbiAgZ2V0IGZyb21MYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBpY2tlckludGwucmFuZ2VGcm9tTGFiZWw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJhbmdlICd0bycgbGFiZWxcbiAgICogKi9cbiAgZ2V0IHRvTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5waWNrZXJJbnRsLnJhbmdlVG9MYWJlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmFuZ2UgJ2Zyb20nIGZvcm1hdHRlZCB2YWx1ZVxuICAgKiAqL1xuICBnZXQgZnJvbUZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnBpY2tlci5zZWxlY3RlZHNbMF07XG4gICAgcmV0dXJuIHZhbHVlXG4gICAgICA/IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmZvcm1hdCh2YWx1ZSwgdGhpcy5waWNrZXIuZm9ybWF0U3RyaW5nKVxuICAgICAgOiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmFuZ2UgJ3RvJyBmb3JtYXR0ZWQgdmFsdWVcbiAgICogKi9cbiAgZ2V0IHRvRm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucGlja2VyLnNlbGVjdGVkc1sxXTtcbiAgICByZXR1cm4gdmFsdWVcbiAgICAgID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aGlzLnBpY2tlci5mb3JtYXRTdHJpbmcpXG4gICAgICA6ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc2VzIGluIHdoaWNoIHRoZSBjb250cm9sIGJ1dHRvbnMgc2hvdyBpbiB0aGUgcGlja2VyXG4gICAqIDEpIHBpY2tlciBtb2RlIGlzICdkaWFsb2cnXG4gICAqIDIpIHBpY2tlciB0eXBlIGlzIE5PVCAnY2FsZW5kYXInIGFuZCB0aGUgcGlja2VyIG1vZGUgaXMgTk9UICdpbmxpbmUnXG4gICAqICovXG4gIGdldCBzaG93Q29udHJvbEJ1dHRvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucGlja2VyLnBpY2tlck1vZGUgPT09ICdkaWFsb2cnIHx8XG4gICAgICAodGhpcy5waWNrZXIucGlja2VyVHlwZSAhPT0gJ2NhbGVuZGFyJyAmJlxuICAgICAgICB0aGlzLnBpY2tlci5waWNrZXJNb2RlICE9PSAnaW5saW5lJylcbiAgICApO1xuICB9XG5cbiAgZ2V0IGNvbnRhaW5lckVsbSgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWxtUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBnZXQgb3dsRFRDb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldCBvd2xEVFBvcHVwQ29udGFpbmVyQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VyLnBpY2tlck1vZGUgPT09ICdwb3B1cCc7XG4gIH1cblxuICBnZXQgb3dsRFREaWFsb2dDb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5waWNrZXIucGlja2VyTW9kZSA9PT0gJ2RpYWxvZyc7XG4gIH1cblxuICBnZXQgb3dsRFRJbmxpbmVDb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5waWNrZXIucGlja2VyTW9kZSA9PT0gJ2lubGluZSc7XG4gIH1cblxuICBnZXQgb3dsRFRDb250YWluZXJEaXNhYmxlZENsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBpY2tlci5kaXNhYmxlZDtcbiAgfVxuXG4gIGdldCBvd2xEVENvbnRhaW5lcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VyLmlkO1xuICB9XG5cbiAgZ2V0IG93bERUQ29udGFpbmVyQW5pbWF0aW9uKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucGlja2VyLnBpY2tlck1vZGUgPT09ICdpbmxpbmUnID8gJycgOiAnZW50ZXInO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBlbG1SZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBwaWNrZXJJbnRsOiBPd2xEYXRlVGltZUludGwsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkYXRlVGltZUFkYXB0ZXI6IERhdGVUaW1lQWRhcHRlcjxUPlxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCkge31cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdFBpY2tlcigpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzUGlja2VyKCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ29udGFpbmVyQW5pbWF0aW9uRG9uZShldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0b1N0YXRlID0gZXZlbnQudG9TdGF0ZTtcbiAgICBpZiAodG9TdGF0ZSA9PT0gJ2VudGVyJykge1xuICAgICAgdGhpcy5waWNrZXJPcGVuZWQkLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGF0ZVNlbGVjdGVkKGRhdGU6IFQpOiB2b2lkIHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgaWYgKHRoaXMucGlja2VyLmlzSW5TaW5nbGVNb2RlKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmRhdGVTZWxlY3RlZEluU2luZ2xlTW9kZShkYXRlKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5waWNrZXJNb21lbnQgPSByZXN1bHQ7XG4gICAgICAgIHRoaXMucGlja2VyLnNlbGVjdChyZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gd2UgY2xvc2UgdGhlIHBpY2tlciB3aGVuIHJlc3VsdCBpcyBudWxsIGFuZCBwaWNrZXJUeXBlIGlzIGNhbGVuZGFyLlxuICAgICAgICBpZiAodGhpcy5waWNrZXJUeXBlID09PSAnY2FsZW5kYXInKSB7XG4gICAgICAgICAgdGhpcy5oaWRlUGlja2VyJC5uZXh0KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGlja2VyLmlzSW5SYW5nZU1vZGUpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuZGF0ZVNlbGVjdGVkSW5SYW5nZU1vZGUoZGF0ZSk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMucGlja2VyTW9tZW50ID0gcmVzdWx0W3RoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleF07XG4gICAgICAgIHRoaXMucGlja2VyLnNlbGVjdChyZXN1bHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0aW1lU2VsZWN0ZWQodGltZTogVCk6IHZvaWQge1xuICAgIHRoaXMucGlja2VyTW9tZW50ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY2xvbmUodGltZSk7XG5cbiAgICBpZiAoIXRoaXMucGlja2VyLmRhdGVUaW1lQ2hlY2tlcih0aGlzLnBpY2tlck1vbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waWNrZXIuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgIHRoaXMucGlja2VyLnNlbGVjdCh0aGlzLnBpY2tlck1vbWVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGlja2VyLmlzSW5SYW5nZU1vZGUpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkcyA9IFsuLi50aGlzLnBpY2tlci5zZWxlY3RlZHNdO1xuXG4gICAgICAvLyBjaGVjayBpZiB0aGUgJ2Zyb20nIGlzIGFmdGVyICd0bycgb3IgJ3RvJ2lzIGJlZm9yZSAnZnJvbSdcbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2Ugc2V0IGJvdGggdGhlICdmcm9tJyBhbmQgJ3RvJyB0aGUgc2FtZSB2YWx1ZVxuICAgICAgaWYgKFxuICAgICAgICAodGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ID09PSAwICYmXG4gICAgICAgICAgc2VsZWN0ZWRzWzFdICYmXG4gICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZSh0aGlzLnBpY2tlck1vbWVudCwgc2VsZWN0ZWRzWzFdKSA9PT1cbiAgICAgICAgICAgIDEpIHx8XG4gICAgICAgICh0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDEgJiZcbiAgICAgICAgICBzZWxlY3RlZHNbMF0gJiZcbiAgICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKHRoaXMucGlja2VyTW9tZW50LCBzZWxlY3RlZHNbMF0pID09PSAtMSlcbiAgICAgICkge1xuICAgICAgICBzZWxlY3RlZHNbMF0gPSB0aGlzLnBpY2tlck1vbWVudDtcbiAgICAgICAgc2VsZWN0ZWRzWzFdID0gdGhpcy5waWNrZXJNb21lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZHNbdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4XSA9IHRoaXMucGlja2VyTW9tZW50O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBpY2tlci5zZWxlY3Qoc2VsZWN0ZWRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNsaWNrIG9uIGNhbmNlbCBidXR0b25cbiAgICovXG4gIHB1YmxpYyBvbkNhbmNlbENsaWNrZWQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuaGlkZVBpY2tlciQubmV4dChudWxsKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2xpY2sgb24gc2V0IGJ1dHRvblxuICAgKi9cbiAgcHVibGljIG9uU2V0Q2xpY2tlZChldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBpY2tlci5kYXRlVGltZUNoZWNrZXIodGhpcy5waWNrZXJNb21lbnQpKSB7XG4gICAgICB0aGlzLmhpZGVQaWNrZXIkLm5leHQobnVsbCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlybVNlbGVjdGVkJC5uZXh0KGV2ZW50KTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2xpY2sgb24gaW5mb3JtIHJhZGlvIGdyb3VwXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlQ2xpY2tPbkluZm9Hcm91cChldmVudDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZEluZGV4KGluZGV4KTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjbGljayBvbiBpbmZvcm0gcmFkaW8gZ3JvdXBcbiAgICovXG4gIHB1YmxpYyBoYW5kbGVLZXlkb3duT25JbmZvR3JvdXAoZXZlbnQ6IGFueSwgbmV4dDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICBjYXNlIERPV05fQVJST1c6XG4gICAgICBjYXNlIFJJR0hUX0FSUk9XOlxuICAgICAgY2FzZSBVUF9BUlJPVzpcbiAgICAgIGNhc2UgTEVGVF9BUlJPVzpcbiAgICAgICAgbmV4dC5mb2N1cygpO1xuICAgICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkSW5kZXgoaW5kZXggPT09IDAgPyAxIDogMCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTUEFDRTpcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZEluZGV4KGluZGV4KTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmFsdWUgb2YgYWN0aXZlU2VsZWN0ZWRJbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBzZXRBY3RpdmVTZWxlY3RlZEluZGV4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnBpY2tlci5zZWxlY3RNb2RlID09PSAncmFuZ2UnICYmXG4gICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggIT09IGluZGV4XG4gICAgKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggPSBpbmRleDtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnBpY2tlci5zZWxlY3RlZHNbdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4XTtcbiAgICAgIGlmICh0aGlzLnBpY2tlci5zZWxlY3RlZHMgJiYgc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5waWNrZXJNb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbG9uZShzZWxlY3RlZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFBpY2tlcigpOiB2b2lkIHtcbiAgICB0aGlzLnBpY2tlck1vbWVudCA9IHRoaXMucGlja2VyLnN0YXJ0QXQgfHwgdGhpcy5kYXRlVGltZUFkYXB0ZXIubm93KCk7XG4gICAgdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ID0gdGhpcy5waWNrZXIuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nID8gMSA6IDA7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IGNhbGVuZGFyIGRhdGUgaW4gc2luZ2xlIG1vZGUsXG4gICAqIGl0IHJldHVybnMgbnVsbCB3aGVuIGRhdGUgaXMgbm90IHNlbGVjdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBkYXRlU2VsZWN0ZWRJblNpbmdsZU1vZGUoZGF0ZTogVCk6IFQgfCBudWxsIHtcbiAgICBpZiAodGhpcy5kYXRlVGltZUFkYXB0ZXIuaXNTYW1lRGF5KGRhdGUsIHRoaXMucGlja2VyLnNlbGVjdGVkKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQW5kQ2hlY2tDYWxlbmRhckRhdGUoZGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IGRhdGVzIGluIHJhbmdlIE1vZGVcbiAgICovXG4gIHByaXZhdGUgZGF0ZVNlbGVjdGVkSW5SYW5nZU1vZGUoZGF0ZTogVCk6IFRbXSB8IG51bGwge1xuICAgIGxldCBmcm9tID0gdGhpcy5waWNrZXIuc2VsZWN0ZWRzWzBdO1xuICAgIGxldCB0byA9IHRoaXMucGlja2VyLnNlbGVjdGVkc1sxXTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudXBkYXRlQW5kQ2hlY2tDYWxlbmRhckRhdGUoZGF0ZSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGdpdmVuIGNhbGVuZGFyIGRheSBpcyBhZnRlciBvciBlcXVhbCB0byAnZnJvbScsXG4gICAgLy8gc2V0IHRocyBnaXZlbiBkYXRlIGFzICd0bydcbiAgICAvLyBvdGhlcndpc2UsIHNldCBpdCBhcyAnZnJvbScgYW5kIHNldCAndG8nIHRvIG51bGxcbiAgICBpZiAodGhpcy5waWNrZXIuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJykge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnBpY2tlci5zZWxlY3RlZHMgJiZcbiAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0ZWRzLmxlbmd0aCAmJlxuICAgICAgICAhdG8gJiZcbiAgICAgICAgZnJvbSAmJlxuICAgICAgICB0aGlzLmRhdGVUaW1lQWRhcHRlci5kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMocmVzdWx0LCBmcm9tKSA+PSAwXG4gICAgICApIHtcbiAgICAgICAgdG8gPSByZXN1bHQ7XG4gICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcm9tID0gcmVzdWx0O1xuICAgICAgICB0byA9IG51bGw7XG4gICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlci5zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJykge1xuICAgICAgZnJvbSA9IHJlc3VsdDtcblxuICAgICAgLy8gaWYgdGhlIGZyb20gdmFsdWUgaXMgYWZ0ZXIgdGhlIHRvIHZhbHVlLCBzZXQgdGhlIHRvIHZhbHVlIGFzIG51bGxcbiAgICAgIGlmICh0byAmJiB0aGlzLmRhdGVUaW1lQWRhcHRlci5jb21wYXJlKGZyb20sIHRvKSA+IDApIHtcbiAgICAgICAgdG8gPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5waWNrZXIuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nKSB7XG4gICAgICB0byA9IHJlc3VsdDtcblxuICAgICAgLy8gaWYgdGhlIGZyb20gdmFsdWUgaXMgYWZ0ZXIgdGhlIHRvIHZhbHVlLCBzZXQgdGhlIGZyb20gdmFsdWUgYXMgbnVsbFxuICAgICAgaWYgKGZyb20gJiYgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShmcm9tLCB0bykgPiAwKSB7XG4gICAgICAgIGZyb20gPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbZnJvbSwgdG9dO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgZ2l2ZW4gY2FsZW5kYXIgZGF0ZSdzIHRpbWUgYW5kIGNoZWNrIGlmIGl0IGlzIHZhbGlkXG4gICAqIEJlY2F1c2UgdGhlIGNhbGVuZGFyIGRhdGUgaGFzIDAwOjAwOjAwIGFzIGRlZmF1bHQgdGltZSwgaWYgdGhlIHBpY2tlciB0eXBlIGlzICdib3RoJyxcbiAgICogd2UgbmVlZCB0byB1cGRhdGUgdGhlIGdpdmVuIGNhbGVuZGFyIGRhdGUncyB0aW1lIGJlZm9yZSBzZWxlY3RpbmcgaXQuXG4gICAqIGlmIGl0IGlzIHZhbGlkLCByZXR1cm4gdGhlIHVwZGF0ZWQgZGF0ZVRpbWVcbiAgICogaWYgaXQgaXMgbm90IHZhbGlkLCByZXR1cm4gbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVBbmRDaGVja0NhbGVuZGFyRGF0ZShkYXRlOiBUKTogVCB7XG4gICAgbGV0IHJlc3VsdDtcblxuICAgIC8vIGlmIHRoZSBwaWNrZXIgaXMgJ2JvdGgnLCB1cGRhdGUgdGhlIGNhbGVuZGFyIGRhdGUncyB0aW1lIHZhbHVlXG4gICAgaWYgKHRoaXMucGlja2VyLnBpY2tlclR5cGUgPT09ICdib3RoJykge1xuICAgICAgcmVzdWx0ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZShcbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKSxcbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSksXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldERhdGUoZGF0ZSksXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldEhvdXJzKHRoaXMucGlja2VyTW9tZW50KSxcbiAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0TWludXRlcyh0aGlzLnBpY2tlck1vbWVudCksXG4gICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldFNlY29uZHModGhpcy5waWNrZXJNb21lbnQpXG4gICAgICApO1xuICAgICAgcmVzdWx0ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY2xhbXBEYXRlKFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHRoaXMucGlja2VyLm1pbkRhdGVUaW1lLFxuICAgICAgICB0aGlzLnBpY2tlci5tYXhEYXRlVGltZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY2xvbmUoZGF0ZSk7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgdGhlIHVwZGF0ZWQgZGF0ZVRpbWVcbiAgICByZXR1cm4gdGhpcy5waWNrZXIuZGF0ZVRpbWVDaGVja2VyKHJlc3VsdCkgPyByZXN1bHQgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvY3VzIHRvIHRoZSBwaWNrZXJcbiAgICogKi9cbiAgcHJpdmF0ZSBmb2N1c1BpY2tlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5waWNrZXIucGlja2VyTW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYWxlbmRhcikge1xuICAgICAgdGhpcy5jYWxlbmRhci5mb2N1c0FjdGl2ZUNlbGwoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudGltZXIpIHtcbiAgICAgIHRoaXMudGltZXIuZm9jdXMoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==