@colijnit/corecomponents_v12 261.1.0 → 261.20.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 (468) hide show
  1. package/{fesm2015/colijnit-corecomponents_v12.js → fesm2022/colijnit-corecomponents_v12.mjs} +20158 -15262
  2. package/fesm2022/colijnit-corecomponents_v12.mjs.map +1 -0
  3. package/index.d.ts +3971 -0
  4. package/lib/components/list-of-values/style/_layout.scss +34 -2
  5. package/lib/components/list-of-values/style/_material-definition.scss +1 -1
  6. package/lib/components/popup/popup-message-display.component.scss +0 -2
  7. package/lib/components/scroll-container/style/_layout.scss +68 -0
  8. package/lib/components/scroll-container/style/_material-definition.scss +0 -0
  9. package/lib/components/scroll-container/style/_theme.scss +4 -0
  10. package/lib/components/scroll-container/style/material.scss +4 -0
  11. package/lib/style/_variables.scss +1 -1
  12. package/package.json +17 -13
  13. package/bundles/colijnit-corecomponents_v12.umd.js +0 -16021
  14. package/bundles/colijnit-corecomponents_v12.umd.js.map +0 -1
  15. package/colijnit-corecomponents_v12.d.ts +0 -45
  16. package/colijnit-corecomponents_v12.metadata.json +0 -1
  17. package/esm2015/colijnit-corecomponents_v12.js +0 -46
  18. package/esm2015/lib/components/article-tile/article-tile.component.js +0 -81
  19. package/esm2015/lib/components/article-tile/article-tile.module.js +0 -35
  20. package/esm2015/lib/components/base/base-input.component.js +0 -849
  21. package/esm2015/lib/components/base/base.module.js +0 -22
  22. package/esm2015/lib/components/base/commit-buttons/commit-buttons.component.js +0 -103
  23. package/esm2015/lib/components/base/commit-buttons/commit-buttons.module.js +0 -21
  24. package/esm2015/lib/components/base/dialog-base.component.js +0 -6
  25. package/esm2015/lib/components/base-input-date-picker/base-input-date-picker.directive.js +0 -25
  26. package/esm2015/lib/components/base-input-time/base-input-time-directive.js +0 -25
  27. package/esm2015/lib/components/button/button.component.js +0 -79
  28. package/esm2015/lib/components/button/button.module.js +0 -19
  29. package/esm2015/lib/components/calendar/calendar-template.component.js +0 -404
  30. package/esm2015/lib/components/calendar/calendar.component.js +0 -46
  31. package/esm2015/lib/components/calendar/calendar.module.js +0 -30
  32. package/esm2015/lib/components/card/card.component.js +0 -72
  33. package/esm2015/lib/components/card/card.module.js +0 -35
  34. package/esm2015/lib/components/carousel/carousel.component.js +0 -130
  35. package/esm2015/lib/components/carousel/carousel.module.js +0 -32
  36. package/esm2015/lib/components/carousel-3d/carousel-3d.component.js +0 -315
  37. package/esm2015/lib/components/carousel-3d/carousel-3d.module.js +0 -19
  38. package/esm2015/lib/components/carousel-3d/carouselItem.js +0 -54
  39. package/esm2015/lib/components/checkmark-overlay/checkmark-overlay.component.js +0 -87
  40. package/esm2015/lib/components/checkmark-overlay/checkmark-overlay.module.js +0 -19
  41. package/esm2015/lib/components/co-dialog/co-dialog.component.js +0 -113
  42. package/esm2015/lib/components/co-dialog/co-dialog.module.js +0 -19
  43. package/esm2015/lib/components/co-dialog-wizard/co-dialog-wizard.component.js +0 -51
  44. package/esm2015/lib/components/co-dialog-wizard/co-dialog-wizard.module.js +0 -17
  45. package/esm2015/lib/components/collapsible/collapsible.component.js +0 -92
  46. package/esm2015/lib/components/collapsible/collapsible.module.js +0 -19
  47. package/esm2015/lib/components/color-picker/color-picker.component.js +0 -41
  48. package/esm2015/lib/components/color-picker/color-picker.module.js +0 -21
  49. package/esm2015/lib/components/core-dialog/confirmation-dialog/confirmation-dialog.component.js +0 -79
  50. package/esm2015/lib/components/core-dialog/core-dialog.module.js +0 -39
  51. package/esm2015/lib/components/core-dialog/core-dialog.service.js +0 -67
  52. package/esm2015/lib/components/core-dialog/core-dynamic-component.service.js +0 -93
  53. package/esm2015/lib/components/double-calendar/double-calendar.component.js +0 -112
  54. package/esm2015/lib/components/double-calendar/double-calendar.module.js +0 -25
  55. package/esm2015/lib/components/filter-item/filter-item-viewmodel.js +0 -13
  56. package/esm2015/lib/components/filter-item/filter-item.component.js +0 -1019
  57. package/esm2015/lib/components/filter-item/filter-item.module.js +0 -43
  58. package/esm2015/lib/components/filter-item/filter-viewmodel.js +0 -11
  59. package/esm2015/lib/components/form/form.component.js +0 -184
  60. package/esm2015/lib/components/form/form.module.js +0 -23
  61. package/esm2015/lib/components/grid-toolbar/grid-toolbar.component.js +0 -57
  62. package/esm2015/lib/components/grid-toolbar/grid-toolbar.module.js +0 -23
  63. package/esm2015/lib/components/grid-toolbar-button/grid-toolbar-button.component.js +0 -28
  64. package/esm2015/lib/components/grid-toolbar-button/grid-toolbar-button.module.js +0 -19
  65. package/esm2015/lib/components/hour-scheduling/components/hour-scheduling-test-object/hour-scheduling-test-object.component.js +0 -22
  66. package/esm2015/lib/components/hour-scheduling/hour-scheduling.component.js +0 -276
  67. package/esm2015/lib/components/hour-scheduling/hour-scheduling.module.js +0 -23
  68. package/esm2015/lib/components/hour-scheduling/model/enum/scheduling-object.interface.js +0 -2
  69. package/esm2015/lib/components/hour-scheduling-expandable/components/hour-scheduling-expandable-template/hour-scheduling-expandable-template.component.js +0 -111
  70. package/esm2015/lib/components/hour-scheduling-expandable/components/hour-scheduling-expandable-template/hour-scheduling-expandable-template.module.js +0 -20
  71. package/esm2015/lib/components/hour-scheduling-expandable/hour-scheduling-expandable.component.js +0 -337
  72. package/esm2015/lib/components/hour-scheduling-expandable/hour-scheduling-expandable.module.js +0 -24
  73. package/esm2015/lib/components/icon/icon-cache.service.js +0 -52
  74. package/esm2015/lib/components/icon/icon.component.js +0 -48
  75. package/esm2015/lib/components/icon/icon.module.js +0 -25
  76. package/esm2015/lib/components/icon-collapse-handle/icon-collapse-handle.component.js +0 -64
  77. package/esm2015/lib/components/icon-collapse-handle/icon-collapse-handle.module.js +0 -23
  78. package/esm2015/lib/components/image/image.component.js +0 -42
  79. package/esm2015/lib/components/image/image.module.js +0 -14
  80. package/esm2015/lib/components/input-checkbox/input-checkbox.component.js +0 -79
  81. package/esm2015/lib/components/input-checkbox/input-checkbox.module.js +0 -19
  82. package/esm2015/lib/components/input-date-picker/input-date-picker.component.js +0 -145
  83. package/esm2015/lib/components/input-date-picker/input-date-picker.module.js +0 -28
  84. package/esm2015/lib/components/input-date-range-picker/input-date-range-picker.component.js +0 -178
  85. package/esm2015/lib/components/input-date-range-picker/input-date-range-picker.module.js +0 -27
  86. package/esm2015/lib/components/input-number-picker/input-number-picker.component.js +0 -320
  87. package/esm2015/lib/components/input-number-picker/input-number-picker.module.js +0 -23
  88. package/esm2015/lib/components/input-radio-button/input-radio-button.component.js +0 -84
  89. package/esm2015/lib/components/input-radio-button/input-radio-button.module.js +0 -19
  90. package/esm2015/lib/components/input-scanner/bar-code-scanner.js +0 -36
  91. package/esm2015/lib/components/input-scanner/input-scanner.component.js +0 -94
  92. package/esm2015/lib/components/input-scanner/input-scanner.module.js +0 -21
  93. package/esm2015/lib/components/input-scanner/scanner.service.js +0 -28
  94. package/esm2015/lib/components/input-search/input-search.component.js +0 -92
  95. package/esm2015/lib/components/input-search/input-search.module.js +0 -21
  96. package/esm2015/lib/components/input-text/input-text.component.js +0 -383
  97. package/esm2015/lib/components/input-text/input-text.module.js +0 -33
  98. package/esm2015/lib/components/input-textarea/input-textarea.component.js +0 -78
  99. package/esm2015/lib/components/input-textarea/input-textarea.module.js +0 -27
  100. package/esm2015/lib/components/input-time/input-time.component.js +0 -74
  101. package/esm2015/lib/components/input-time/input-time.module.js +0 -24
  102. package/esm2015/lib/components/level-indicator/level-indicator-level.enum.js +0 -7
  103. package/esm2015/lib/components/level-indicator/level-indicator.component.js +0 -36
  104. package/esm2015/lib/components/level-indicator/level-indicator.module.js +0 -15
  105. package/esm2015/lib/components/list-of-icons/list-of-icons.component.js +0 -98
  106. package/esm2015/lib/components/list-of-icons/list-of-icons.module.js +0 -27
  107. package/esm2015/lib/components/list-of-values/list-of-values-multiselect-popup.component.js +0 -112
  108. package/esm2015/lib/components/list-of-values/list-of-values-popup.component.js +0 -295
  109. package/esm2015/lib/components/list-of-values/list-of-values.component.js +0 -336
  110. package/esm2015/lib/components/list-of-values/list-of-values.module.js +0 -39
  111. package/esm2015/lib/components/loader/loader.component.js +0 -84
  112. package/esm2015/lib/components/loader/loader.module.js +0 -19
  113. package/esm2015/lib/components/pagination/paginate.pipe.js +0 -99
  114. package/esm2015/lib/components/pagination/pagination-instance.js +0 -2
  115. package/esm2015/lib/components/pagination/pagination.component.js +0 -126
  116. package/esm2015/lib/components/pagination/pagination.module.js +0 -28
  117. package/esm2015/lib/components/pagination/pagination.service.js +0 -88
  118. package/esm2015/lib/components/pagination-bar/pagination-bar.component.js +0 -151
  119. package/esm2015/lib/components/pagination-bar/pagination-bar.module.js +0 -19
  120. package/esm2015/lib/components/popup/const/popup-window-token.js +0 -3
  121. package/esm2015/lib/components/popup/interface/popup-button.js +0 -8
  122. package/esm2015/lib/components/popup/interface/popup-close-event.js +0 -2
  123. package/esm2015/lib/components/popup/interface/popup-settings.js +0 -42
  124. package/esm2015/lib/components/popup/interface/popup.js +0 -2
  125. package/esm2015/lib/components/popup/model/popup-button-globals.js +0 -11
  126. package/esm2015/lib/components/popup/model/popup-window.js +0 -38
  127. package/esm2015/lib/components/popup/popup-buttons.component.js +0 -53
  128. package/esm2015/lib/components/popup/popup-message-display.component.js +0 -48
  129. package/esm2015/lib/components/popup/popup-window-shell.component.js +0 -159
  130. package/esm2015/lib/components/popup/popup.module.js +0 -49
  131. package/esm2015/lib/components/popup/service/popup-shower.service.js +0 -90
  132. package/esm2015/lib/components/popup/service/prompt.service.js +0 -127
  133. package/esm2015/lib/components/popup/text-input-popup.component.js +0 -36
  134. package/esm2015/lib/components/responsive-text/responsive-text.component.js +0 -24
  135. package/esm2015/lib/components/responsive-text/responsive-text.module.js +0 -19
  136. package/esm2015/lib/components/simple-grid/base-simple-grid.component.js +0 -193
  137. package/esm2015/lib/components/simple-grid/simple-grid-cell.component.js +0 -172
  138. package/esm2015/lib/components/simple-grid/simple-grid-column.directive.js +0 -113
  139. package/esm2015/lib/components/simple-grid/simple-grid.component.js +0 -765
  140. package/esm2015/lib/components/simple-grid/simple-grid.module.js +0 -47
  141. package/esm2015/lib/components/tile/tile.component.js +0 -73
  142. package/esm2015/lib/components/tile/tile.module.js +0 -23
  143. package/esm2015/lib/components/tile-select/tile-select.component.js +0 -36
  144. package/esm2015/lib/components/tile-select/tile-select.module.js +0 -21
  145. package/esm2015/lib/components/tooltip/tooltip.component.js +0 -95
  146. package/esm2015/lib/components/tooltip/tooltip.module.js +0 -19
  147. package/esm2015/lib/components/validation-error/validation-error.component.js +0 -38
  148. package/esm2015/lib/components/validation-error/validation-error.module.js +0 -25
  149. package/esm2015/lib/components/view-mode-buttons/content-view-mode.enum.js +0 -11
  150. package/esm2015/lib/components/view-mode-buttons/view-mode-buttons.component.js +0 -64
  151. package/esm2015/lib/components/view-mode-buttons/view-mode-buttons.module.js +0 -21
  152. package/esm2015/lib/core/constant/default-upper-bound-for-range-components.js +0 -4
  153. package/esm2015/lib/core/constant/java-max-int.js +0 -2
  154. package/esm2015/lib/core/constant/number-inputs-key-down-white-list.js +0 -45
  155. package/esm2015/lib/core/decorator/input-boolean.decorator.js +0 -34
  156. package/esm2015/lib/core/enum/co-direction.js +0 -9
  157. package/esm2015/lib/core/enum/co-document-type.enum.js +0 -11
  158. package/esm2015/lib/core/enum/co-orientation.js +0 -17
  159. package/esm2015/lib/core/enum/core-components-icon.enum.js +0 -307
  160. package/esm2015/lib/core/enum/file-type-internal.enum.js +0 -17
  161. package/esm2015/lib/core/enum/file-type.enum.js +0 -11
  162. package/esm2015/lib/core/enum/filterItem-mode.enum.js +0 -49
  163. package/esm2015/lib/core/enum/input-number-picker-show-mode.enum.js +0 -8
  164. package/esm2015/lib/core/enum/keyboard-code.enum.js +0 -74
  165. package/esm2015/lib/core/enum/keyboard-key.enum.js +0 -76
  166. package/esm2015/lib/core/enum/popup-button-type.enum.js +0 -12
  167. package/esm2015/lib/core/enum/popup-type.enum.js +0 -11
  168. package/esm2015/lib/core/function/any-nill.function.js +0 -6
  169. package/esm2015/lib/core/function/is-nill.function.js +0 -5
  170. package/esm2015/lib/core/function/none-nill.function.js +0 -17
  171. package/esm2015/lib/core/function/not-nill.function.js +0 -5
  172. package/esm2015/lib/core/model/bounds-constrained-number-value.js +0 -171
  173. package/esm2015/lib/core/model/check-precision-and-scale-result.js +0 -2
  174. package/esm2015/lib/core/model/check-within-stepped-bounds-result.js +0 -2
  175. package/esm2015/lib/core/model/core-components-icon-svg.js +0 -306
  176. package/esm2015/lib/core/model/element-position.js +0 -10
  177. package/esm2015/lib/core/model/event/string-prompt-result-event.js +0 -8
  178. package/esm2015/lib/core/service/form-input-user-change-listener.service.js +0 -25
  179. package/esm2015/lib/core/service/form-master.service.js +0 -102
  180. package/esm2015/lib/core/service/ng-zone-wrapper.service.js +0 -20
  181. package/esm2015/lib/core/utils/array-utils.js +0 -264
  182. package/esm2015/lib/core/utils/browser-utils.js +0 -100
  183. package/esm2015/lib/core/utils/direction-enum-utils.js +0 -14
  184. package/esm2015/lib/core/utils/event-utils.js +0 -53
  185. package/esm2015/lib/core/utils/file-utils.js +0 -267
  186. package/esm2015/lib/core/utils/number-utils.js +0 -309
  187. package/esm2015/lib/core/utils/object-utils.js +0 -186
  188. package/esm2015/lib/core/utils/string-utils.js +0 -94
  189. package/esm2015/lib/core/validator/email.validator.js +0 -6
  190. package/esm2015/lib/core/validator/equal.validator.js +0 -11
  191. package/esm2015/lib/core/validator/max-string-length.validator.js +0 -10
  192. package/esm2015/lib/core/validator/password.validator.js +0 -31
  193. package/esm2015/lib/core/validator/precision-scale.validator.js +0 -11
  194. package/esm2015/lib/core/validator/required.validator.js +0 -5
  195. package/esm2015/lib/directives/clickoutside/click-outside-master.service.js +0 -57
  196. package/esm2015/lib/directives/clickoutside/click-outside.directive.js +0 -71
  197. package/esm2015/lib/directives/clickoutside/clickoutside.module.js +0 -19
  198. package/esm2015/lib/directives/observe-visibility/observe-visibility.directive.js +0 -53
  199. package/esm2015/lib/directives/observe-visibility/observe-visibility.module.js +0 -15
  200. package/esm2015/lib/directives/overlay/overlay-parent.directive.js +0 -19
  201. package/esm2015/lib/directives/overlay/overlay.directive.js +0 -161
  202. package/esm2015/lib/directives/overlay/overlay.module.js +0 -18
  203. package/esm2015/lib/directives/ripple/ripple-ref.js +0 -26
  204. package/esm2015/lib/directives/ripple/ripple-renderer.js +0 -160
  205. package/esm2015/lib/directives/ripple/ripple.directive.js +0 -80
  206. package/esm2015/lib/directives/ripple/ripple.module.js +0 -24
  207. package/esm2015/lib/directives/ripple/scroll-dispatcher.service.js +0 -108
  208. package/esm2015/lib/directives/ripple/scrollable.directive.js +0 -40
  209. package/esm2015/lib/directives/ripple/viewport-ruler.service.js +0 -73
  210. package/esm2015/lib/directives/screen-configuration/screen-configuration.directive.js +0 -159
  211. package/esm2015/lib/directives/screen-configuration/screen-configuration.module.js +0 -19
  212. package/esm2015/lib/directives/stopclick/stop-click.directive.js +0 -38
  213. package/esm2015/lib/directives/stopclick/stop-click.module.js +0 -15
  214. package/esm2015/lib/directives/template-wrapper/template-wrapper.directive.js +0 -68
  215. package/esm2015/lib/directives/template-wrapper/template-wrapper.module.js +0 -15
  216. package/esm2015/lib/directives/tooltip/tooltip-directive.module.js +0 -19
  217. package/esm2015/lib/directives/tooltip/tooltip.directive.js +0 -78
  218. package/esm2015/lib/interfaces/dialog-response.interface.js +0 -2
  219. package/esm2015/lib/interfaces/scanner-input.interface.js +0 -2
  220. package/esm2015/lib/interfaces/screen-config-adapter-component-interface-name.js +0 -4
  221. package/esm2015/lib/interfaces/screen-config-adapter.component.interface.js +0 -2
  222. package/esm2015/lib/model/enum/app-button-type.enum.js +0 -11
  223. package/esm2015/lib/model/enum/app-popup-type.enum.js +0 -8
  224. package/esm2015/lib/model/icon-list-item.js +0 -2
  225. package/esm2015/lib/pipes/append.pipe.js +0 -17
  226. package/esm2015/lib/pipes/append.pipe.module.js +0 -15
  227. package/esm2015/lib/pipes/filter.pipe.js +0 -16
  228. package/esm2015/lib/pipes/filter.pipe.module.js +0 -15
  229. package/esm2015/lib/pipes/prepend.pipe.js +0 -17
  230. package/esm2015/lib/pipes/prepend.pipe.module.js +0 -15
  231. package/esm2015/lib/pipes/price-display-pipe.module.js +0 -15
  232. package/esm2015/lib/pipes/price-display.pipe.js +0 -20
  233. package/esm2015/lib/service/base-module-screen-config.service.js +0 -205
  234. package/esm2015/lib/service/base-module.service.js +0 -42
  235. package/esm2015/lib/service/color-sequence.service.js +0 -49
  236. package/esm2015/lib/service/excel-export.service.js +0 -128
  237. package/esm2015/lib/service/overlay.service.js +0 -75
  238. package/esm2015/lib/translation/core-components-translation.module.js +0 -26
  239. package/esm2015/lib/translation/core-components-translation.service.js +0 -17
  240. package/esm2015/lib/translation/core-dictionary.service.js +0 -29
  241. package/esm2015/lib/translation/core-localize.pipe.js +0 -26
  242. package/esm2015/public-api.js +0 -142
  243. package/fesm2015/colijnit-corecomponents_v12.js.map +0 -1
  244. package/lib/components/article-tile/article-tile.component.d.ts +0 -22
  245. package/lib/components/article-tile/article-tile.module.d.ts +0 -2
  246. package/lib/components/base/base-input.component.d.ts +0 -189
  247. package/lib/components/base/base.module.d.ts +0 -2
  248. package/lib/components/base/commit-buttons/commit-buttons.component.d.ts +0 -21
  249. package/lib/components/base/commit-buttons/commit-buttons.module.d.ts +0 -2
  250. package/lib/components/base/dialog-base.component.d.ts +0 -4
  251. package/lib/components/base-input-date-picker/base-input-date-picker.directive.d.ts +0 -15
  252. package/lib/components/base-input-time/base-input-time-directive.d.ts +0 -14
  253. package/lib/components/button/button.component.d.ts +0 -31
  254. package/lib/components/button/button.module.d.ts +0 -2
  255. package/lib/components/calendar/calendar-template.component.d.ts +0 -70
  256. package/lib/components/calendar/calendar.component.d.ts +0 -13
  257. package/lib/components/calendar/calendar.module.d.ts +0 -2
  258. package/lib/components/card/card.component.d.ts +0 -23
  259. package/lib/components/card/card.module.d.ts +0 -2
  260. package/lib/components/carousel/carousel.component.d.ts +0 -23
  261. package/lib/components/carousel/carousel.module.d.ts +0 -6
  262. package/lib/components/carousel-3d/carousel-3d.component.d.ts +0 -55
  263. package/lib/components/carousel-3d/carousel-3d.module.d.ts +0 -2
  264. package/lib/components/carousel-3d/carouselItem.d.ts +0 -13
  265. package/lib/components/checkmark-overlay/checkmark-overlay.component.d.ts +0 -17
  266. package/lib/components/checkmark-overlay/checkmark-overlay.module.d.ts +0 -2
  267. package/lib/components/co-dialog/co-dialog.component.d.ts +0 -23
  268. package/lib/components/co-dialog/co-dialog.module.d.ts +0 -2
  269. package/lib/components/co-dialog-wizard/co-dialog-wizard.component.d.ts +0 -9
  270. package/lib/components/co-dialog-wizard/co-dialog-wizard.module.d.ts +0 -2
  271. package/lib/components/collapsible/collapsible.component.d.ts +0 -22
  272. package/lib/components/collapsible/collapsible.module.d.ts +0 -2
  273. package/lib/components/color-picker/color-picker.component.d.ts +0 -6
  274. package/lib/components/color-picker/color-picker.module.d.ts +0 -2
  275. package/lib/components/core-dialog/confirmation-dialog/confirmation-dialog.component.d.ts +0 -20
  276. package/lib/components/core-dialog/core-dialog.module.d.ts +0 -4
  277. package/lib/components/core-dialog/core-dialog.service.d.ts +0 -15
  278. package/lib/components/core-dialog/core-dynamic-component.service.d.ts +0 -12
  279. package/lib/components/double-calendar/double-calendar.component.d.ts +0 -20
  280. package/lib/components/double-calendar/double-calendar.module.d.ts +0 -2
  281. package/lib/components/filter-item/filter-item-viewmodel.d.ts +0 -9
  282. package/lib/components/filter-item/filter-item.component.d.ts +0 -126
  283. package/lib/components/filter-item/filter-item.module.d.ts +0 -2
  284. package/lib/components/filter-item/filter-viewmodel.d.ts +0 -8
  285. package/lib/components/form/form.component.d.ts +0 -39
  286. package/lib/components/form/form.module.d.ts +0 -2
  287. package/lib/components/grid-toolbar/grid-toolbar.component.d.ts +0 -19
  288. package/lib/components/grid-toolbar/grid-toolbar.module.d.ts +0 -2
  289. package/lib/components/grid-toolbar-button/grid-toolbar-button.component.d.ts +0 -8
  290. package/lib/components/grid-toolbar-button/grid-toolbar-button.module.d.ts +0 -2
  291. package/lib/components/hour-scheduling/components/hour-scheduling-test-object/hour-scheduling-test-object.component.d.ts +0 -5
  292. package/lib/components/hour-scheduling/hour-scheduling.component.d.ts +0 -48
  293. package/lib/components/hour-scheduling/hour-scheduling.module.d.ts +0 -2
  294. package/lib/components/hour-scheduling/model/enum/scheduling-object.interface.d.ts +0 -10
  295. package/lib/components/hour-scheduling-expandable/components/hour-scheduling-expandable-template/hour-scheduling-expandable-template.component.d.ts +0 -23
  296. package/lib/components/hour-scheduling-expandable/components/hour-scheduling-expandable-template/hour-scheduling-expandable-template.module.d.ts +0 -2
  297. package/lib/components/hour-scheduling-expandable/hour-scheduling-expandable.component.d.ts +0 -78
  298. package/lib/components/hour-scheduling-expandable/hour-scheduling-expandable.module.d.ts +0 -2
  299. package/lib/components/icon/icon-cache.service.d.ts +0 -20
  300. package/lib/components/icon/icon.component.d.ts +0 -17
  301. package/lib/components/icon/icon.module.d.ts +0 -2
  302. package/lib/components/icon-collapse-handle/icon-collapse-handle.component.d.ts +0 -21
  303. package/lib/components/icon-collapse-handle/icon-collapse-handle.module.d.ts +0 -2
  304. package/lib/components/image/image.component.d.ts +0 -20
  305. package/lib/components/image/image.module.d.ts +0 -2
  306. package/lib/components/input-checkbox/input-checkbox.component.d.ts +0 -24
  307. package/lib/components/input-checkbox/input-checkbox.module.d.ts +0 -2
  308. package/lib/components/input-date-picker/input-date-picker.component.d.ts +0 -30
  309. package/lib/components/input-date-picker/input-date-picker.module.d.ts +0 -2
  310. package/lib/components/input-date-range-picker/input-date-range-picker.component.d.ts +0 -27
  311. package/lib/components/input-date-range-picker/input-date-range-picker.module.d.ts +0 -2
  312. package/lib/components/input-number-picker/input-number-picker.component.d.ts +0 -74
  313. package/lib/components/input-number-picker/input-number-picker.module.d.ts +0 -2
  314. package/lib/components/input-radio-button/input-radio-button.component.d.ts +0 -19
  315. package/lib/components/input-radio-button/input-radio-button.module.d.ts +0 -2
  316. package/lib/components/input-scanner/bar-code-scanner.d.ts +0 -10
  317. package/lib/components/input-scanner/input-scanner.component.d.ts +0 -29
  318. package/lib/components/input-scanner/input-scanner.module.d.ts +0 -2
  319. package/lib/components/input-scanner/scanner.service.d.ts +0 -11
  320. package/lib/components/input-search/input-search.component.d.ts +0 -22
  321. package/lib/components/input-search/input-search.module.d.ts +0 -2
  322. package/lib/components/input-text/input-text.component.d.ts +0 -78
  323. package/lib/components/input-text/input-text.module.d.ts +0 -2
  324. package/lib/components/input-textarea/input-textarea.component.d.ts +0 -19
  325. package/lib/components/input-textarea/input-textarea.module.d.ts +0 -2
  326. package/lib/components/input-time/input-time.component.d.ts +0 -8
  327. package/lib/components/input-time/input-time.module.d.ts +0 -2
  328. package/lib/components/level-indicator/level-indicator-level.enum.d.ts +0 -5
  329. package/lib/components/level-indicator/level-indicator.component.d.ts +0 -10
  330. package/lib/components/level-indicator/level-indicator.module.d.ts +0 -2
  331. package/lib/components/list-of-icons/list-of-icons.component.d.ts +0 -22
  332. package/lib/components/list-of-icons/list-of-icons.module.d.ts +0 -2
  333. package/lib/components/list-of-values/list-of-values-multiselect-popup.component.d.ts +0 -25
  334. package/lib/components/list-of-values/list-of-values-popup.component.d.ts +0 -54
  335. package/lib/components/list-of-values/list-of-values.component.d.ts +0 -63
  336. package/lib/components/list-of-values/list-of-values.module.d.ts +0 -2
  337. package/lib/components/loader/loader.component.d.ts +0 -3
  338. package/lib/components/loader/loader.module.d.ts +0 -2
  339. package/lib/components/pagination/paginate.pipe.d.ts +0 -15
  340. package/lib/components/pagination/pagination-instance.d.ts +0 -14
  341. package/lib/components/pagination/pagination.component.d.ts +0 -38
  342. package/lib/components/pagination/pagination.module.d.ts +0 -2
  343. package/lib/components/pagination/pagination.service.d.ts +0 -24
  344. package/lib/components/pagination-bar/pagination-bar.component.d.ts +0 -33
  345. package/lib/components/pagination-bar/pagination-bar.module.d.ts +0 -2
  346. package/lib/components/popup/const/popup-window-token.d.ts +0 -3
  347. package/lib/components/popup/interface/popup-button.d.ts +0 -8
  348. package/lib/components/popup/interface/popup-close-event.d.ts +0 -5
  349. package/lib/components/popup/interface/popup-settings.d.ts +0 -21
  350. package/lib/components/popup/interface/popup.d.ts +0 -9
  351. package/lib/components/popup/model/popup-button-globals.d.ts +0 -9
  352. package/lib/components/popup/model/popup-window.d.ts +0 -21
  353. package/lib/components/popup/popup-buttons.component.d.ts +0 -13
  354. package/lib/components/popup/popup-message-display.component.d.ts +0 -12
  355. package/lib/components/popup/popup-window-shell.component.d.ts +0 -42
  356. package/lib/components/popup/popup.module.d.ts +0 -4
  357. package/lib/components/popup/service/popup-shower.service.d.ts +0 -17
  358. package/lib/components/popup/service/prompt.service.d.ts +0 -17
  359. package/lib/components/popup/text-input-popup.component.d.ts +0 -12
  360. package/lib/components/responsive-text/responsive-text.component.d.ts +0 -4
  361. package/lib/components/responsive-text/responsive-text.module.d.ts +0 -2
  362. package/lib/components/simple-grid/base-simple-grid.component.d.ts +0 -59
  363. package/lib/components/simple-grid/simple-grid-cell.component.d.ts +0 -30
  364. package/lib/components/simple-grid/simple-grid-column.directive.d.ts +0 -43
  365. package/lib/components/simple-grid/simple-grid.component.d.ts +0 -87
  366. package/lib/components/simple-grid/simple-grid.module.d.ts +0 -2
  367. package/lib/components/tile/tile.component.d.ts +0 -16
  368. package/lib/components/tile/tile.module.d.ts +0 -2
  369. package/lib/components/tile-select/tile-select.component.d.ts +0 -8
  370. package/lib/components/tile-select/tile-select.module.d.ts +0 -2
  371. package/lib/components/tooltip/tooltip.component.d.ts +0 -23
  372. package/lib/components/tooltip/tooltip.module.d.ts +0 -2
  373. package/lib/components/validation-error/validation-error.component.d.ts +0 -12
  374. package/lib/components/validation-error/validation-error.module.d.ts +0 -2
  375. package/lib/components/view-mode-buttons/content-view-mode.enum.d.ts +0 -8
  376. package/lib/components/view-mode-buttons/view-mode-buttons.component.d.ts +0 -17
  377. package/lib/components/view-mode-buttons/view-mode-buttons.module.d.ts +0 -2
  378. package/lib/core/constant/default-upper-bound-for-range-components.d.ts +0 -2
  379. package/lib/core/constant/java-max-int.d.ts +0 -1
  380. package/lib/core/constant/number-inputs-key-down-white-list.d.ts +0 -2
  381. package/lib/core/decorator/input-boolean.decorator.d.ts +0 -8
  382. package/lib/core/enum/co-direction.d.ts +0 -6
  383. package/lib/core/enum/co-document-type.enum.d.ts +0 -5
  384. package/lib/core/enum/co-orientation.d.ts +0 -6
  385. package/lib/core/enum/core-components-icon.enum.d.ts +0 -305
  386. package/lib/core/enum/file-type-internal.enum.d.ts +0 -15
  387. package/lib/core/enum/file-type.enum.d.ts +0 -5
  388. package/lib/core/enum/filterItem-mode.enum.d.ts +0 -17
  389. package/lib/core/enum/input-number-picker-show-mode.enum.d.ts +0 -5
  390. package/lib/core/enum/keyboard-code.enum.d.ts +0 -71
  391. package/lib/core/enum/keyboard-key.enum.d.ts +0 -70
  392. package/lib/core/enum/popup-button-type.enum.d.ts +0 -9
  393. package/lib/core/enum/popup-type.enum.d.ts +0 -9
  394. package/lib/core/function/any-nill.function.d.ts +0 -1
  395. package/lib/core/function/is-nill.function.d.ts +0 -1
  396. package/lib/core/function/none-nill.function.d.ts +0 -1
  397. package/lib/core/function/not-nill.function.d.ts +0 -1
  398. package/lib/core/model/bounds-constrained-number-value.d.ts +0 -46
  399. package/lib/core/model/check-precision-and-scale-result.d.ts +0 -4
  400. package/lib/core/model/check-within-stepped-bounds-result.d.ts +0 -8
  401. package/lib/core/model/core-components-icon-svg.d.ts +0 -4
  402. package/lib/core/model/element-position.d.ts +0 -7
  403. package/lib/core/model/event/string-prompt-result-event.d.ts +0 -6
  404. package/lib/core/service/form-input-user-change-listener.service.d.ts +0 -10
  405. package/lib/core/service/form-master.service.d.ts +0 -26
  406. package/lib/core/service/ng-zone-wrapper.service.d.ts +0 -6
  407. package/lib/core/utils/array-utils.d.ts +0 -85
  408. package/lib/core/utils/browser-utils.d.ts +0 -15
  409. package/lib/core/utils/direction-enum-utils.d.ts +0 -5
  410. package/lib/core/utils/event-utils.d.ts +0 -12
  411. package/lib/core/utils/file-utils.d.ts +0 -29
  412. package/lib/core/utils/number-utils.d.ts +0 -89
  413. package/lib/core/utils/object-utils.d.ts +0 -31
  414. package/lib/core/utils/string-utils.d.ts +0 -25
  415. package/lib/core/validator/email.validator.d.ts +0 -2
  416. package/lib/core/validator/equal.validator.d.ts +0 -2
  417. package/lib/core/validator/max-string-length.validator.d.ts +0 -2
  418. package/lib/core/validator/password.validator.d.ts +0 -3
  419. package/lib/core/validator/precision-scale.validator.d.ts +0 -2
  420. package/lib/core/validator/required.validator.d.ts +0 -2
  421. package/lib/directives/clickoutside/click-outside-master.service.d.ts +0 -15
  422. package/lib/directives/clickoutside/click-outside.directive.d.ts +0 -18
  423. package/lib/directives/clickoutside/clickoutside.module.d.ts +0 -2
  424. package/lib/directives/observe-visibility/observe-visibility.directive.d.ts +0 -14
  425. package/lib/directives/observe-visibility/observe-visibility.module.d.ts +0 -2
  426. package/lib/directives/overlay/overlay-parent.directive.d.ts +0 -6
  427. package/lib/directives/overlay/overlay.directive.d.ts +0 -25
  428. package/lib/directives/overlay/overlay.module.d.ts +0 -2
  429. package/lib/directives/ripple/ripple-ref.d.ts +0 -21
  430. package/lib/directives/ripple/ripple-renderer.d.ts +0 -56
  431. package/lib/directives/ripple/ripple.directive.d.ts +0 -56
  432. package/lib/directives/ripple/ripple.module.d.ts +0 -2
  433. package/lib/directives/ripple/scroll-dispatcher.service.d.ts +0 -51
  434. package/lib/directives/ripple/scrollable.directive.d.ts +0 -20
  435. package/lib/directives/ripple/viewport-ruler.service.d.ts +0 -29
  436. package/lib/directives/screen-configuration/screen-configuration.directive.d.ts +0 -32
  437. package/lib/directives/screen-configuration/screen-configuration.module.d.ts +0 -2
  438. package/lib/directives/stopclick/stop-click.directive.d.ts +0 -10
  439. package/lib/directives/stopclick/stop-click.module.d.ts +0 -2
  440. package/lib/directives/template-wrapper/template-wrapper.directive.d.ts +0 -13
  441. package/lib/directives/template-wrapper/template-wrapper.module.d.ts +0 -2
  442. package/lib/directives/tooltip/tooltip-directive.module.d.ts +0 -2
  443. package/lib/directives/tooltip/tooltip.directive.d.ts +0 -20
  444. package/lib/interfaces/dialog-response.interface.d.ts +0 -6
  445. package/lib/interfaces/scanner-input.interface.d.ts +0 -3
  446. package/lib/interfaces/screen-config-adapter-component-interface-name.d.ts +0 -3
  447. package/lib/interfaces/screen-config-adapter.component.interface.d.ts +0 -14
  448. package/lib/model/enum/app-button-type.enum.d.ts +0 -9
  449. package/lib/model/enum/app-popup-type.enum.d.ts +0 -6
  450. package/lib/model/icon-list-item.d.ts +0 -7
  451. package/lib/pipes/append.pipe.d.ts +0 -4
  452. package/lib/pipes/append.pipe.module.d.ts +0 -2
  453. package/lib/pipes/filter.pipe.d.ts +0 -4
  454. package/lib/pipes/filter.pipe.module.d.ts +0 -2
  455. package/lib/pipes/prepend.pipe.d.ts +0 -4
  456. package/lib/pipes/prepend.pipe.module.d.ts +0 -2
  457. package/lib/pipes/price-display-pipe.module.d.ts +0 -2
  458. package/lib/pipes/price-display.pipe.d.ts +0 -4
  459. package/lib/service/base-module-screen-config.service.d.ts +0 -47
  460. package/lib/service/base-module.service.d.ts +0 -22
  461. package/lib/service/color-sequence.service.d.ts +0 -7
  462. package/lib/service/excel-export.service.d.ts +0 -45
  463. package/lib/service/overlay.service.d.ts +0 -13
  464. package/lib/translation/core-components-translation.module.d.ts +0 -4
  465. package/lib/translation/core-components-translation.service.d.ts +0 -6
  466. package/lib/translation/core-dictionary.service.d.ts +0 -12
  467. package/lib/translation/core-localize.pipe.d.ts +0 -7
  468. package/public-api.d.ts +0 -138
@@ -1,765 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostBinding, HostListener, Input, ViewChildren, ViewEncapsulation } from '@angular/core';
3
- import { FormMasterService } from '../../core/service/form-master.service';
4
- import { BaseSimpleGridComponent } from './base-simple-grid.component';
5
- import { ColumnAlign } from './simple-grid-column.directive';
6
- import { CoreComponentsIcon } from '../../core/enum/core-components-icon.enum';
7
- import { IconCacheService } from '../icon/icon-cache.service';
8
- export class SimpleGridComponent extends BaseSimpleGridComponent {
9
- constructor(icons, changeDetection, _formMaster) {
10
- super(changeDetection);
11
- this.icons = icons;
12
- this.changeDetection = changeDetection;
13
- this._formMaster = _formMaster;
14
- this.defaultTextAlign = ColumnAlign.Left;
15
- this.showAdd = false;
16
- this.showDelete = false;
17
- this.deselectAllowed = false;
18
- this.editOnCellClick = true;
19
- this.rightToolbar = false;
20
- this.showGridSettings = false;
21
- this.rowsPerPage = 50;
22
- this.showColumnSort = false;
23
- this.showRowButtons = false;
24
- this.editing = false;
25
- this.isSettingsMenuOpen = false;
26
- this.editRowIndex = -1;
27
- this.editCellIndex = -1;
28
- this.selectedRowIndex = -1;
29
- this.currentPage = 1;
30
- this.sortDirection = 'asc';
31
- this.hoveredRowIndex = -1;
32
- this.Icons = CoreComponentsIcon;
33
- this._doubleClicked = false;
34
- this._newRow = false;
35
- this.IconCacheService = IconCacheService;
36
- this.CoreComponentsIcon = CoreComponentsIcon;
37
- this.dataChanged.subscribe(() => {
38
- this.currentPage = 1;
39
- });
40
- }
41
- set headerCells(cells) {
42
- const headerElements = cells.toArray();
43
- for (let i = 0; i < headerElements.length; i++) {
44
- this.columns[i].elementRef = headerElements[i];
45
- }
46
- }
47
- showClass() {
48
- return true;
49
- }
50
- handleKeyDown(event) {
51
- if (!this.inlineEdit) {
52
- return;
53
- }
54
- if (event.code === 'Tab') {
55
- event.preventDefault();
56
- this._nextAvailableCellToEdit(!event.shiftKey, this.editCellIndex)
57
- .then((index) => {
58
- this.editCellIndex = index;
59
- this.changeDetection.markForCheck();
60
- });
61
- this._detectChanges();
62
- }
63
- if (event.code === 'Escape') {
64
- this.cancelEditRow();
65
- }
66
- if (event.code === 'Enter') {
67
- this.validateAndSave();
68
- }
69
- }
70
- handleClickOutsideRow() {
71
- this.validateAndSave();
72
- }
73
- getIsRowDisabled(idx) {
74
- return this.disabledRows.indexOf(idx) > -1;
75
- }
76
- isRowDisabled(row, index) {
77
- return __awaiter(this, void 0, void 0, function* () {
78
- if (this.rowDisabledFn && (typeof this.rowDisabledFn === 'function')) {
79
- const disabled = yield this.rowDisabledFn.call(this, row);
80
- const idxRow = this.disabledRows.indexOf(index);
81
- if (disabled) {
82
- if (idxRow < 0) {
83
- this.disabledRows.push(index);
84
- }
85
- }
86
- else {
87
- if (idxRow > -1) {
88
- this.disabledRows.splice(idxRow, 1);
89
- }
90
- }
91
- return disabled;
92
- }
93
- else {
94
- return false;
95
- }
96
- });
97
- }
98
- addNewRow() {
99
- return __awaiter(this, void 0, void 0, function* () {
100
- if (this.inlineEdit) {
101
- const valid = this.validateAndSave();
102
- if (valid) {
103
- this._newRowReference = {};
104
- this.data.push(this._newRowReference);
105
- this._detectChanges();
106
- this._newRow = true;
107
- this.editing = true;
108
- if (this.rowsPerPage && this.data.length > this.rowsPerPage) {
109
- // navigate to last page
110
- this.currentPage = Math.ceil(this.data.length / this.rowsPerPage);
111
- const relativeIndex = (this.data.length - 1) % this.rowsPerPage;
112
- this.selectedRowIndex = relativeIndex;
113
- this.editRowIndex = relativeIndex;
114
- // store reference
115
- this.rowToEdit = this._newRowReference;
116
- this.editCellIndex = yield this._nextAvailableCellToEdit(true);
117
- setTimeout(() => {
118
- var _a, _b;
119
- const el = (_b = (_a = this.rowElements) === null || _a === void 0 ? void 0 : _a.last) === null || _b === void 0 ? void 0 : _b.nativeElement;
120
- if (el) {
121
- el.scrollIntoView({ behavior: 'smooth', block: 'center' });
122
- }
123
- }, 200);
124
- // reset reference to the new row after editCellIndex
125
- this.rowToEdit = this._newRowReference;
126
- }
127
- else {
128
- this.editRowIndex = this.data.length - 1;
129
- this.rowToEdit = this._newRowReference;
130
- this.editCellIndex = yield this._nextAvailableCellToEdit(true);
131
- }
132
- this.addRow.next();
133
- this._detectChanges();
134
- }
135
- }
136
- else {
137
- this.addRow.next();
138
- }
139
- });
140
- }
141
- validateAndSave(stopediting = true) {
142
- if (!this.editing) {
143
- return true;
144
- }
145
- const valid = this._formMaster.submitSlaves();
146
- this._detectChanges();
147
- if (valid) {
148
- this._saveRow(stopediting);
149
- return true;
150
- }
151
- return false;
152
- }
153
- cancelEditRow() {
154
- if (!this.editing) {
155
- return;
156
- }
157
- if (this._newRow) {
158
- this.data.splice(this.data.length - 1, 1);
159
- }
160
- else {
161
- this.data[this.editRowIndex] = this.rowToEdit;
162
- }
163
- this._resetEdit();
164
- this._detectChanges();
165
- }
166
- removeRow(row) {
167
- this.deleteRow.next(row);
168
- if (this.currentPage !== 1) {
169
- this.currentPage = 1;
170
- this.selectedRowIndex = -1;
171
- window.scrollTo({ top: 0, behavior: 'smooth' });
172
- }
173
- this._detectChanges();
174
- }
175
- removeSelectedRow() {
176
- let absoluteIndex = this.selectedRowIndex;
177
- if (this.rowsPerPage) {
178
- absoluteIndex = (this.currentPage - 1) * this.rowsPerPage + this.selectedRowIndex;
179
- }
180
- this.deleteRow.next(this.data[absoluteIndex]);
181
- if (this.currentPage !== 1) {
182
- this.currentPage = 1;
183
- this.selectedRowIndex = -1;
184
- window.scrollTo({ top: 0, behavior: 'smooth' });
185
- }
186
- this._detectChanges();
187
- }
188
- handleClickRow(event, index) {
189
- if (this.inlineEdit && this.showRowButtons && !this.editing) {
190
- this.editing = false;
191
- }
192
- else {
193
- setTimeout(() => {
194
- if (this._doubleClicked) {
195
- return;
196
- }
197
- this.selectTheRow(index);
198
- if (this.inlineEdit && !this.showRowButtons) {
199
- this.editRow(event, true, index);
200
- }
201
- }, 200);
202
- }
203
- }
204
- selectTheRow(index, emit = true) {
205
- if (this.selectedRowIndex === -1 || (this.selectedRowIndex !== index && ((this.editing && this.validateAndSave()) || !this.editing))) {
206
- this.selectedRowIndex = index;
207
- const absoluteIndex = this.rowsPerPage ? (this.currentPage - 1) * this.rowsPerPage + index : index;
208
- if (emit) {
209
- this.selectRow.next(this.data[absoluteIndex]);
210
- }
211
- }
212
- else if (this.selectedRowIndex === index && this.deselectAllowed && ((this.editing && this.validateAndSave()) || !this.editing)) {
213
- this.selectedRowIndex = -1;
214
- if (emit) {
215
- this.deselectRow.next();
216
- }
217
- }
218
- this._detectChanges();
219
- }
220
- handleDblClickRow(event, index, row) {
221
- return __awaiter(this, void 0, void 0, function* () {
222
- if (yield this.isRowDisabled(row, index)) {
223
- this.selectedRowIndex = -1;
224
- return;
225
- }
226
- let canEdit = true;
227
- if (this.canRowBeEdittedFn && typeof this.canRowBeEdittedFn === 'function') {
228
- canEdit = yield this.canRowBeEdittedFn.call(this, row);
229
- }
230
- if (canEdit) {
231
- this._doubleClicked = true;
232
- this.dblClickRow.next(this.data[index]);
233
- this.selectTheRow(index, false);
234
- if (this.inlineEdit && !this.showRowButtons) {
235
- this.editRow(event);
236
- }
237
- }
238
- this._resetDblClick();
239
- });
240
- }
241
- editRow(event, selectCell = true, rowIndex) {
242
- return __awaiter(this, void 0, void 0, function* () {
243
- if (rowIndex !== undefined) {
244
- this.selectTheRow(rowIndex);
245
- }
246
- this.editing = true;
247
- this.editRowIndex = this.selectedRowIndex;
248
- this.rowToEdit = this.data[this.editRowIndex];
249
- if (this.showRowButtons && this.inlineEdit && selectCell) {
250
- this.editCellIndex = yield this._nextAvailableCellToEdit(true);
251
- }
252
- this._detectChanges();
253
- });
254
- }
255
- handleCellClick(event, row, rowIndex, cellIndex) {
256
- return __awaiter(this, void 0, void 0, function* () {
257
- if (this.editOnCellClick) {
258
- if (yield this.isRowDisabled(row, rowIndex)) {
259
- this.selectedRowIndex = -1;
260
- return;
261
- }
262
- if (this.inlineEdit) {
263
- this.editRowIndex = rowIndex;
264
- this.editCellIndex = cellIndex;
265
- this.editing = true;
266
- }
267
- }
268
- else {
269
- this.editCellIndex = cellIndex;
270
- }
271
- this._detectChanges();
272
- });
273
- }
274
- toggleSettingsMenu() {
275
- this.headerColumnsCopy.forEach(i => i.isSelected = false);
276
- this.isSettingsMenuOpen = !this.isSettingsMenuOpen;
277
- }
278
- toggleColumnMenu(col) {
279
- if (!this.showGridSettings) {
280
- return;
281
- }
282
- this.isSettingsMenuOpen = false;
283
- if (col.isSelected) {
284
- col.isSelected = false;
285
- }
286
- else {
287
- this.headerColumnsCopy.forEach(i => i.isSelected = false);
288
- col.isSelected = true;
289
- }
290
- }
291
- hideColumn(col) {
292
- col.isSelected = false;
293
- this.headerColumnsCopy = this.headerColumnsCopy.filter((obj) => {
294
- return obj !== col;
295
- });
296
- }
297
- sortColumn(col, columnValue) {
298
- col.isSelected = false;
299
- if (this.sortColumnValue === columnValue) {
300
- this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';
301
- }
302
- else {
303
- this.sortColumnValue = columnValue;
304
- this.sortDirection = 'asc';
305
- }
306
- const direction = this.sortDirection === 'asc' ? 1 : -1;
307
- const sorted = [...this.data].sort((a, b) => {
308
- let valA = a[columnValue];
309
- let valB = b[columnValue];
310
- if (valA == null && valB == null) {
311
- return 0;
312
- }
313
- if (valA == null) {
314
- return -1 * direction;
315
- }
316
- if (valB == null) {
317
- return 1 * direction;
318
- }
319
- // Handle ISO date string
320
- const isDateA = typeof valA === 'string' && /^\d{4}-\d{2}-\d{2}T/.test(valA);
321
- const isDateB = typeof valB === 'string' && /^\d{4}-\d{2}-\d{2}T/.test(valB);
322
- if (isDateA && isDateB) {
323
- const timeA = new Date(valA).getTime();
324
- const timeB = new Date(valB).getTime();
325
- return (timeA - timeB) * direction;
326
- }
327
- // Fallback for numbers/strings
328
- if (typeof valA === 'string' && typeof valB === 'string') {
329
- return valA.localeCompare(valB) * direction;
330
- }
331
- return (valA > valB ? 1 : valA < valB ? -1 : 0) * direction;
332
- });
333
- this.data = sorted;
334
- this._detectChanges();
335
- }
336
- showAllColumns() {
337
- this.isSettingsMenuOpen = false;
338
- this.headerColumnsCopy = this.headerColumns;
339
- }
340
- exportToExcel() {
341
- this.isSettingsMenuOpen = false;
342
- const exportData = this.exportData.length > 0 ? this._filterSelectedOrReturnAll(this.exportData) : this._filterSelectedOrReturnAll(this.data);
343
- const columns = this.headerColumnsCopy.map(column => {
344
- return ({
345
- key: column.field,
346
- header: column.headerText
347
- });
348
- });
349
- const headers = columns.map(col => col.header);
350
- const rows = exportData.map(row => columns.map(col => {
351
- const value = row[col.key];
352
- if (value instanceof Date) {
353
- const formattedDate = value.toISOString().split('T')[0];
354
- const [year, month, day] = formattedDate.split('-');
355
- return `${day}-${month}-${year}`;
356
- }
357
- else if (typeof value === 'number') {
358
- const hasDecimal = (num) => !Number.isInteger(num);
359
- return hasDecimal(value) ? value.toFixed(2) : value.toFixed(0);
360
- }
361
- else if (Array.isArray(value)) {
362
- return value.join(', ');
363
- }
364
- else if (typeof value === 'object' && value !== null) {
365
- return JSON.stringify(value);
366
- }
367
- else if (typeof value === 'boolean') {
368
- return String(value);
369
- }
370
- else {
371
- if (!value)
372
- return '';
373
- if (typeof value === 'string' && value.includes('T00:00:00')) {
374
- const [year, month, day] = value.replace('T00:00:00', '').split('-');
375
- return `${day}-${month}-${year}`;
376
- }
377
- return String(value);
378
- }
379
- }));
380
- // const csvContent = [headers, ...rows].map(row =>
381
- // row.map(cell => `"${cell.replace(/"/g, '""')}"`).join(',')
382
- // ).join('\r\n');
383
- const csvContent = [headers, ...rows].map(row => row.map((cell) => `"${String(cell).replace(/"/g, '""')}"`).join(',')).join('\r\n');
384
- const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
385
- const link = document.createElement('a');
386
- const url = URL.createObjectURL(blob);
387
- link.href = url;
388
- link.setAttribute('download', 'ExcelSheet');
389
- document.body.appendChild(link);
390
- link.click();
391
- document.body.removeChild(link);
392
- // this.excelExportService.exportToExcel(
393
- // this.data,
394
- // columns,
395
- // 'ExcelSheet',
396
- // 'Sheet1'
397
- // );
398
- }
399
- goToPreviousPage() {
400
- this.currentPage -= 1;
401
- }
402
- goToNextPage() {
403
- this.currentPage += 1;
404
- }
405
- setCurrentPage(page) {
406
- this.currentPage = page;
407
- }
408
- get isNewRow() {
409
- return this._newRow;
410
- }
411
- _filterSelectedOrReturnAll(items) {
412
- const hasSelectedTrue = items.some(item => item.selected === true);
413
- return hasSelectedTrue ? items.filter(item => item.selected === true) : items;
414
- }
415
- prepareDataRow(row, index) {
416
- return __awaiter(this, void 0, void 0, function* () {
417
- yield this.isRowDisabled(row, index);
418
- });
419
- }
420
- _resetDblClick() {
421
- setTimeout(() => {
422
- this._doubleClicked = false;
423
- }, 500);
424
- }
425
- /**
426
- *
427
- * @param next; Move to next or previous cell
428
- * @param start; Start from cellindex
429
- * @private
430
- */
431
- _nextAvailableCellToEdit(next, start = -1) {
432
- return new Promise((resolve, reject) => {
433
- const numEditableColumns = this.columns.filter(c => !c.readonly).length;
434
- const wantedIndex = start + (next ? 1 : -1);
435
- if (wantedIndex >= numEditableColumns) {
436
- this._getNextEditRowIndex()
437
- .then((index) => {
438
- this.editRowIndex = index;
439
- resolve(this._getNextEditCellIndex(0));
440
- })
441
- .catch((e) => {
442
- reject();
443
- });
444
- }
445
- else if (wantedIndex < 0) {
446
- this._getPreviousEditRowIndex()
447
- .then((index) => {
448
- this.editRowIndex = index;
449
- resolve(this._getPreviousEditCellIndex(this.columns.length - 1));
450
- })
451
- .catch((e) => {
452
- reject();
453
- });
454
- }
455
- else {
456
- resolve(next ? this._getNextEditCellIndex(start + 1) : this._getPreviousEditCellIndex(start - 1));
457
- }
458
- });
459
- }
460
- _getNextEditCellIndex(start) {
461
- for (let i = start; i < this.columns.length; i++) {
462
- if (!this.columns[i].readonly) {
463
- return i;
464
- }
465
- }
466
- }
467
- _getPreviousEditCellIndex(start) {
468
- for (let i = start; i >= 0; i--) {
469
- if (!this.columns[i].readonly) {
470
- return i;
471
- }
472
- }
473
- }
474
- _getNextEditRowIndex() {
475
- return new Promise((resolve, reject) => {
476
- let newRowIndex = 0;
477
- if (this.editRowIndex + 1 >= this.data.length) {
478
- if (this.autoAddRow) {
479
- this.addNewRow();
480
- newRowIndex = this.editRowIndex;
481
- }
482
- else {
483
- newRowIndex = 0;
484
- }
485
- }
486
- else {
487
- newRowIndex = this.editRowIndex + 1;
488
- }
489
- if (newRowIndex !== this.editRowIndex) { // go to different row validate current one first
490
- if (this.validateAndSave(false)) {
491
- this.rowToEdit = this.data[newRowIndex];
492
- resolve(newRowIndex);
493
- }
494
- else {
495
- reject();
496
- }
497
- }
498
- else {
499
- resolve(newRowIndex);
500
- }
501
- });
502
- }
503
- _getPreviousEditRowIndex() {
504
- return new Promise((resolve, reject) => {
505
- let newRowIndex = 0;
506
- if (this.editRowIndex - 1 < 0) {
507
- newRowIndex = this.data.length - 1;
508
- }
509
- else {
510
- newRowIndex = this.editRowIndex - 1;
511
- }
512
- if (newRowIndex !== this.editRowIndex) { // go to different row validate current one first
513
- if (this.validateAndSave(false)) {
514
- this.rowToEdit = this.data[newRowIndex];
515
- resolve(newRowIndex);
516
- }
517
- else {
518
- reject();
519
- }
520
- }
521
- else {
522
- resolve(newRowIndex);
523
- }
524
- });
525
- }
526
- _saveRow(stopediting = true) {
527
- if (this._newRow) {
528
- this.saveRow.next(this._newRowReference);
529
- this._newRowReference = null; // clear
530
- window.scrollTo({ top: 0, behavior: 'smooth' });
531
- }
532
- else {
533
- let index = -1; // existing row
534
- if (index >= 0 && index < this.data.length) {
535
- this.saveRow.next(this.data[this.editRowIndex]);
536
- }
537
- }
538
- this._newRow = false;
539
- if (stopediting) {
540
- this._resetEdit();
541
- }
542
- this._detectChanges();
543
- }
544
- _detectChanges() {
545
- this.changeDetection.detectChanges();
546
- }
547
- _resetEdit() {
548
- this._newRow = false;
549
- this.selectedRowIndex = -1;
550
- this.editRowIndex = -1;
551
- this.editCellIndex = -1;
552
- this.editing = false;
553
- this.rowToEdit = undefined;
554
- }
555
- }
556
- SimpleGridComponent.decorators = [
557
- { type: Component, args: [{
558
- selector: 'co-simple-grid',
559
- template: `
560
- <co-grid-toolbar
561
- *ngIf="showToolbar" [class.right]="rightToolbar"
562
- [showEdit]="showEdit"
563
- [showAdd]="showAdd"
564
- [showDelete]="showDelete"
565
- [deleteEnabled]="selectedRowIndex > -1"
566
- (addClick)="addNewRow()"
567
- (editClick)="editRow($event)"
568
- (saveClick)="validateAndSave()"
569
- (cancelClick)="cancelEditRow()"
570
- (deleteClick)="removeSelectedRow()">
571
- </co-grid-toolbar>
572
-
573
- <table
574
- id="simple-grid-table"
575
- class="simple-grid-table"
576
- [clickOutside]="editing"
577
- (clickOutside)="handleClickOutsideRow()">
578
- <colgroup>
579
- <col
580
- *ngFor="let column of headerColumnsCopy; let index = index"
581
- [class.simple-grid-column-auto-fit]="column.autoFit"
582
- [style.width.px]="column.width"
583
- [style.min-width.px]="MIN_COLUMN_WIDTH">
584
- <col
585
- *ngIf="showRowButtons"
586
- [class.simple-grid-column-auto-fit]="true"
587
- [style.min-width.px]="MIN_COLUMN_WIDTH">
588
- >
589
- </colgroup>
590
- <thead>
591
- <tr>
592
- <th
593
- scope="col"
594
- #headerCell
595
- class="simple-grid-column-header"
596
- *ngFor="let column of headerColumnsCopy; let index = index">
597
- <div
598
- class="simple-grid-column-header-wrapper"
599
- [class.resizable]="resizable"
600
- [class.selected]="column.isSelected"
601
- [ngClass]="column.textAlign ? column.textAlign : defaultTextAlign">
602
- <ng-container *ngIf="column.headerTemplate; else noHeaderTemplate">
603
- <ng-container [ngTemplateOutlet]="column.headerTemplate"></ng-container>
604
- </ng-container>
605
- <ng-template #noHeaderTemplate>
606
- <div
607
- class="simple-grid-column-header-label"
608
- [ngClass]="column.textAlign ? column.textAlign : defaultTextAlign"
609
- [class.with-menu]="showGridSettings"
610
- [class.with-sort]="showColumnSort"
611
- [textContent]="column.headerText || '&nbsp;'" [title]="column.headerText"
612
- (click)="showColumnSort ? sortColumn(column, column.field) : toggleColumnMenu(column)">
613
- </div>
614
-
615
- <div class="sort-column" *ngIf="showColumnSort">
616
- <co-button
617
- (click)="sortColumn(column, column?.field)"
618
- [iconData]="icons.getIcon(Icons.ArrowUpArrowDown)">
619
- </co-button>
620
- </div>
621
-
622
- <div class="column-menu" *ngIf="column.isSelected">
623
- <h3 [textContent]="'COLUMN_OPTIONS' | coreLocalize"></h3>
624
- <ul>
625
- <li (click)="hideColumn(column)">Hide Column</li>
626
- <li (click)="sortColumn(column, column.field)">Sort Column</li>
627
- </ul>
628
- </div>
629
- </ng-template>
630
- <div
631
- *ngIf="resizable && column.resizable"
632
- class="simple-grid-column-sizer"
633
- (mousedown)="handleSizerMouseDown($event, column)">
634
- </div>
635
- </div>
636
- </th>
637
- </tr>
638
-
639
- <div *ngIf="showGridSettings" class="grid-settings">
640
- <co-button
641
- [class.selected]="isSettingsMenuOpen"
642
- [iconData]="icons.getIcon(Icons.CogWheels)"
643
- (click)="toggleSettingsMenu()">
644
- </co-button>
645
-
646
- <div class="settings-menu" *ngIf="isSettingsMenuOpen">
647
- <h3 [textContent]="'GRID_OPTIONS' | coreLocalize"></h3>
648
- <ul>
649
- <li (click)="exportToExcel()">Export to Excel</li>
650
- <li *ngIf="headerColumnsCopy.length !== headerColumns.length" (click)="showAllColumns()">
651
- Show All Columns
652
- </li>
653
- </ul>
654
- </div>
655
- </div>
656
- </thead>
657
- <tbody
658
- #dropList cdkDropList cdkDropListOrientation="vertical"
659
- class="simple-grid-drag-drop-list"
660
- [cdkDropListDisabled]="!dragDropEnabled || editing"
661
- [cdkDropListData]="data"
662
- [cdkDropListEnterPredicate]="handleCanDragDrop"
663
- (cdkDropListDropped)="handleDrop($event)">
664
- <co-form class="simple-grid-row-form">
665
- <tr
666
- #rowElement
667
- class="simple-grid-row"
668
- [class.selected]="rowIndex === selectedRowIndex && !editing" observeVisibility
669
- [class.disabled]="getIsRowDisabled(rowIndex)"
670
- [class.editing]="rowIndex === editRowIndex"
671
- *ngFor="let row of (!!rowsPerPage ? (data | paginate: {itemsPerPage: rowsPerPage, currentPage: currentPage}) : data); last as last; let rowIndex = index"
672
- cdkDrag
673
- (click)="handleClickRow($event, rowIndex)" (dblclick)="handleDblClickRow($event, rowIndex, row)"
674
- (visibilityChange)="rowVisible.next(row)"
675
- (mouseenter)="hoveredRowIndex = rowIndex"
676
- (mouseleave)="hoveredRowIndex = -1"
677
- >
678
- <ng-container *ngIf="isSingleColumnRow(row)">
679
- <td class="simple-grid-single-column-cell" [attr.colspan]="headerColumnsCopy.length">
680
- <co-simple-grid-cell
681
- [column]="columns[singleColumnIndex(row)]"
682
- [row]="row"
683
- [editMode]="false">
684
- </co-simple-grid-cell>
685
- </td>
686
- </ng-container>
687
- <ng-container *ngIf="!isSingleColumnRow(row)">
688
- <ng-container *ngFor="let column of headerColumnsCopy; let columnIndex = index">
689
- <td class="simple-grid-column-cell" *ngIf="columnIndex !== singleColumnIndex(row)">
690
- <co-simple-grid-cell
691
- [column]="column"
692
- [row]="row"
693
- [editMode]="inlineEdit && editing && rowIndex === editRowIndex"
694
- [fieldEditMode]="editCellIndex === columnIndex && rowIndex === editRowIndex"
695
- (cellClick)="handleCellClick($event, row, rowIndex, columnIndex)">
696
- </co-simple-grid-cell>
697
- <div *ngIf="column.resizable" class="simple-grid-column-sizer-placeholder"></div>
698
- </td>
699
- </ng-container>
700
- <ng-container *ngIf="showRowButtons">
701
- <td class="icons-container" [class.show-content]="selectedRowIndex === rowIndex || hoveredRowIndex === rowIndex">
702
- <ng-container>
703
- <co-icon class="icon-item icon-edit"
704
- *ngIf="editRowIndex !== rowIndex && inlineEdit"
705
- [iconData]="icons.getIcon(Icons.PenToSquareSolid)"
706
- (click)="editRow($event, true, rowIndex); $event.stopPropagation()"></co-icon>
707
- <co-icon class="icon-item icon-delete"
708
- [iconData]="icons.getIcon(Icons.TrashBin)"
709
- *ngIf="(editRowIndex !== rowIndex && showDelete)"
710
- (click)="removeRow(data[rowIndex])"></co-icon>
711
- </ng-container>
712
- <ng-container *ngIf="editing && inlineEdit && (selectedRowIndex === rowIndex || isNewRow) && editRowIndex === rowIndex">
713
- <co-button class="save-button"
714
- [iconData]="icons.getIcon(Icons.CheckDuotone)"
715
- (click)="validateAndSave(); $event.stopPropagation()"></co-button>
716
- <co-button class="close-button"
717
- [iconData]="icons.getIcon(Icons.CrossSkinny)"
718
- (click)="cancelEditRow(); $event.stopPropagation() "></co-button>
719
- </ng-container>
720
- </td>
721
- </ng-container>
722
- </ng-container>
723
- </tr>
724
- </co-form>
725
- </tbody>
726
- </table>
727
- <co-pagination-bar
728
- *ngIf="data?.length > rowsPerPage" class="pagination-bar"
729
- [itemsPerPage]="rowsPerPage"
730
- [currentPage]="currentPage"
731
- [totalItems]="data.length"
732
- [autoHide]="true"
733
- (previousClick)="goToPreviousPage()"
734
- (nextClick)="goToNextPage()"
735
- (pageClick)="setCurrentPage($event)">
736
- </co-pagination-bar>
737
- `,
738
- providers: [FormMasterService],
739
- changeDetection: ChangeDetectionStrategy.OnPush,
740
- encapsulation: ViewEncapsulation.None
741
- },] }
742
- ];
743
- SimpleGridComponent.ctorParameters = () => [
744
- { type: IconCacheService },
745
- { type: ChangeDetectorRef },
746
- { type: FormMasterService }
747
- ];
748
- SimpleGridComponent.propDecorators = {
749
- headerCells: [{ type: ViewChildren, args: ['headerCell',] }],
750
- rowElements: [{ type: ViewChildren, args: ['rowElement',] }],
751
- showAdd: [{ type: Input }],
752
- showDelete: [{ type: Input }],
753
- deselectAllowed: [{ type: Input }],
754
- editOnCellClick: [{ type: Input }],
755
- rightToolbar: [{ type: Input }],
756
- showGridSettings: [{ type: Input }],
757
- rowsPerPage: [{ type: Input }],
758
- rowDisabledFn: [{ type: Input }],
759
- showColumnSort: [{ type: Input }],
760
- showRowButtons: [{ type: Input }],
761
- canRowBeEdittedFn: [{ type: Input }],
762
- showClass: [{ type: HostBinding, args: ['class.co-simple-grid',] }],
763
- handleKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }]
764
- };
765
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3NpbXBsZS1ncmlkL3NpbXBsZS1ncmlkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFlBQVksRUFDWixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFDekUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBNEw1RCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsdUJBQXVCO0lBaUc5RCxZQUNTLEtBQXVCLEVBQ3BCLGVBQWtDLEVBQ3BDLFdBQThCO1FBRXRDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUpoQixVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUNwQixvQkFBZSxHQUFmLGVBQWUsQ0FBbUI7UUFDcEMsZ0JBQVcsR0FBWCxXQUFXLENBQW1CO1FBbkd4QixxQkFBZ0IsR0FBZ0IsV0FBVyxDQUFDLElBQUksQ0FBQztRQVkxRCxZQUFPLEdBQVksS0FBSyxDQUFDO1FBR3pCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFHNUIsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFHakMsb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFHaEMsaUJBQVksR0FBWSxLQUFL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QUFXLFNBQUMsc0JBQXNCOzRCQUtsQyxZQUFZLFNBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsIEVsZW1lbnRSZWYsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LCBRdWVyeUxpc3QsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7Rm9ybU1hc3RlclNlcnZpY2V9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZS9mb3JtLW1hc3Rlci5zZXJ2aWNlJztcclxuaW1wb3J0IHtCYXNlU2ltcGxlR3JpZENvbXBvbmVudH0gZnJvbSAnLi9iYXNlLXNpbXBsZS1ncmlkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7Q29sdW1uQWxpZ259IGZyb20gJy4vc2ltcGxlLWdyaWQtY29sdW1uLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7Q29yZUNvbXBvbmVudHNJY29ufSBmcm9tICcuLi8uLi9jb3JlL2VudW0vY29yZS1jb21wb25lbnRzLWljb24uZW51bSc7XHJcbmltcG9ydCB7SWNvbkNhY2hlU2VydmljZX0gZnJvbSAnLi4vaWNvbi9pY29uLWNhY2hlLnNlcnZpY2UnO1xyXG5pbXBvcnQge0V4cG9ydENvbHVtbn0gZnJvbSAnLi4vLi4vc2VydmljZS9leGNlbC1leHBvcnQuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NvLXNpbXBsZS1ncmlkJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGNvLWdyaWQtdG9vbGJhclxyXG4gICAgICAqbmdJZj1cInNob3dUb29sYmFyXCIgW2NsYXNzLnJpZ2h0XT1cInJpZ2h0VG9vbGJhclwiXHJcbiAgICAgIFtzaG93RWRpdF09XCJzaG93RWRpdFwiXHJcbiAgICAgIFtzaG93QWRkXT1cInNob3dBZGRcIlxyXG4gICAgICBbc2hvd0RlbGV0ZV09XCJzaG93RGVsZXRlXCJcclxuICAgICAgW2RlbGV0ZUVuYWJsZWRdPVwic2VsZWN0ZWRSb3dJbmRleCA+IC0xXCJcclxuICAgICAgKGFkZENsaWNrKT1cImFkZE5ld1JvdygpXCJcclxuICAgICAgKGVkaXRDbGljayk9XCJlZGl0Um93KCRldmVudClcIlxyXG4gICAgICAoc2F2ZUNsaWNrKT1cInZhbGlkYXRlQW5kU2F2ZSgpXCJcclxuICAgICAgKGNhbmNlbENsaWNrKT1cImNhbmNlbEVkaXRSb3coKVwiXHJcbiAgICAgIChkZWxldGVDbGljayk9XCJyZW1vdmVTZWxlY3RlZFJvdygpXCI+XHJcbiAgICA8L2NvLWdyaWQtdG9vbGJhcj5cclxuXHJcbiAgICA8dGFibGVcclxuICAgICAgaWQ9XCJzaW1wbGUtZ3JpZC10YWJsZVwiXHJcbiAgICAgIGNsYXNzPVwic2ltcGxlLWdyaWQtdGFibGVcIlxyXG4gICAgICBbY2xpY2tPdXRzaWRlXT1cImVkaXRpbmdcIlxyXG4gICAgICAoY2xpY2tPdXRzaWRlKT1cImhhbmRsZUNsaWNrT3V0c2lkZVJvdygpXCI+XHJcbiAgICAgIDxjb2xncm91cD5cclxuICAgICAgICA8Y29sXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGhlYWRlckNvbHVtbnNDb3B5OyBsZXQgaW5kZXggPSBpbmRleFwiXHJcbiAgICAgICAgICBbY2xhc3Muc2ltcGxlLWdyaWQtY29sdW1uLWF1dG8tZml0XT1cImNvbHVtbi5hdXRvRml0XCJcclxuICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2x1bW4ud2lkdGhcIlxyXG4gICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJNSU5fQ09MVU1OX1dJRFRIXCI+XHJcbiAgICAgICAgPGNvbFxyXG4gICAgICAgICAgKm5nSWY9XCJzaG93Um93QnV0dG9uc1wiXHJcbiAgICAgICAgICBbY2xhc3Muc2ltcGxlLWdyaWQtY29sdW1uLWF1dG8tZml0XT1cInRydWVcIlxyXG4gICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJNSU5fQ09MVU1OX1dJRFRIXCI+XHJcbiAgICAgICAgPlxyXG4gICAgICA8L2NvbGdyb3VwPlxyXG4gICAgICA8dGhlYWQ+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGhcclxuICAgICAgICAgIHNjb3BlPVwiY29sXCJcclxuICAgICAgICAgICNoZWFkZXJDZWxsXHJcbiAgICAgICAgICBjbGFzcz1cInNpbXBsZS1ncmlkLWNvbHVtbi1oZWFkZXJcIlxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBoZWFkZXJDb2x1bW5zQ29weTsgbGV0IGluZGV4ID0gaW5kZXhcIj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJzaW1wbGUtZ3JpZC1jb2x1bW4taGVhZGVyLXdyYXBwZXJcIlxyXG4gICAgICAgICAgICBbY2xhc3MucmVzaXphYmxlXT1cInJlc2l6YWJsZVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJjb2x1bW4uaXNTZWxlY3RlZFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbi50ZXh0QWxpZ24gPyBjb2x1bW4udGV4dEFsaWduIDogZGVmYXVsdFRleHRBbGlnblwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmhlYWRlclRlbXBsYXRlOyBlbHNlIG5vSGVhZGVyVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5oZWFkZXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0hlYWRlclRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2ltcGxlLWdyaWQtY29sdW1uLWhlYWRlci1sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4udGV4dEFsaWduID8gY29sdW1uLnRleHRBbGlnbiA6IGRlZmF1bHRUZXh0QWxpZ25cIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLndpdGgtbWVudV09XCJzaG93R3JpZFNldHRpbmdzXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy53aXRoLXNvcnRdPVwic2hvd0NvbHVtblNvcnRcIlxyXG4gICAgICAgICAgICAgICAgW3RleHRDb250ZW50XT1cImNvbHVtbi5oZWFkZXJUZXh0IHx8ICcmbmJzcDsnXCIgW3RpdGxlXT1cImNvbHVtbi5oZWFkZXJUZXh0XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93Q29sdW1uU29ydCA/IHNvcnRDb2x1bW4oY29sdW1uLCBjb2x1bW4uZmllbGQpIDogdG9nZ2xlQ29sdW1uTWVudShjb2x1bW4pXCI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb3J0LWNvbHVtblwiICpuZ0lmPVwic2hvd0NvbHVtblNvcnRcIj5cclxuICAgICAgICAgICAgICAgIDxjby1idXR0b25cclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRDb2x1bW4oY29sdW1uLCBjb2x1bW4/LmZpZWxkKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtpY29uRGF0YV09XCJpY29ucy5nZXRJY29uKEljb25zLkFycm93VXBBcnJvd0Rvd24pXCI+XHJcbiAgICAgICAgICAgICAgICA8L2NvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1tZW51XCIgKm5nSWY9XCJjb2x1bW4uaXNTZWxlY3RlZFwiPlxyXG4gICAgICAgICAgICAgICAgPGgzIFt0ZXh0Q29udGVudF09XCInQ09MVU1OX09QVElPTlMnIHwgY29yZUxvY2FsaXplXCI+PC9oMz5cclxuICAgICAgICAgICAgICAgIDx1bD5cclxuICAgICAgICAgICAgICAgICAgPGxpIChjbGljayk9XCJoaWRlQ29sdW1uKGNvbHVtbilcIj5IaWRlIENvbHVtbjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwic29ydENvbHVtbihjb2x1bW4sIGNvbHVtbi5maWVsZClcIj5Tb3J0IENvbHVtbjwvbGk+XHJcbiAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJyZXNpemFibGUgJiYgY29sdW1uLnJlc2l6YWJsZVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzaW1wbGUtZ3JpZC1jb2x1bW4tc2l6ZXJcIlxyXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwiaGFuZGxlU2l6ZXJNb3VzZURvd24oJGV2ZW50LCBjb2x1bW4pXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgPC90cj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93R3JpZFNldHRpbmdzXCIgY2xhc3M9XCJncmlkLXNldHRpbmdzXCI+XHJcbiAgICAgICAgPGNvLWJ1dHRvblxyXG4gICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImlzU2V0dGluZ3NNZW51T3BlblwiXHJcbiAgICAgICAgICBbaWNvbkRhdGFdPVwiaWNvbnMuZ2V0SWNvbihJY29ucy5Db2dXaGVlbHMpXCJcclxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZXR0aW5nc01lbnUoKVwiPlxyXG4gICAgICAgIDwvY28tYnV0dG9uPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2V0dGluZ3MtbWVudVwiICpuZ0lmPVwiaXNTZXR0aW5nc01lbnVPcGVuXCI+XHJcbiAgICAgICAgICA8aDMgW3RleHRDb250ZW50XT1cIidHUklEX09QVElPTlMnIHwgY29yZUxvY2FsaXplXCI+PC9oMz5cclxuICAgICAgICAgIDx1bD5cclxuICAgICAgICAgICAgPGxpIChjbGljayk9XCJleHBvcnRUb0V4Y2VsKClcIj5FeHBvcnQgdG8gRXhjZWw8L2xpPlxyXG4gICAgICAgICAgICA8bGkgKm5nSWY9XCJoZWFkZXJDb2x1bW5zQ29weS5sZW5ndGggIT09IGhlYWRlckNvbHVtbnMubGVuZ3RoXCIgKGNsaWNrKT1cInNob3dBbGxDb2x1bW5zKClcIj5cclxuICAgICAgICAgICAgICBTaG93IEFsbCBDb2x1bW5zXHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICA8L3VsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPC90aGVhZD5cclxuICAgICAgPHRib2R5XHJcbiAgICAgICAgI2Ryb3BMaXN0IGNka0Ryb3BMaXN0IGNka0Ryb3BMaXN0T3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiXHJcbiAgICAgICAgY2xhc3M9XCJzaW1wbGUtZ3JpZC1kcmFnLWRyb3AtbGlzdFwiXHJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGlzYWJsZWRdPVwiIWRyYWdEcm9wRW5hYmxlZCB8fCBlZGl0aW5nXCJcclxuICAgICAgICBbY2RrRHJvcExpc3REYXRhXT1cImRhdGFcIlxyXG4gICAgICAgIFtjZGtEcm9wTGlzdEVudGVyUHJlZGljYXRlXT1cImhhbmRsZUNhbkRyYWdEcm9wXCJcclxuICAgICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cImhhbmRsZURyb3AoJGV2ZW50KVwiPlxyXG4gICAgICA8Y28tZm9ybSBjbGFzcz1cInNpbXBsZS1ncmlkLXJvdy1mb3JtXCI+XHJcbiAgICAgICAgPHRyXHJcbiAgICAgICAgICAjcm93RWxlbWVudFxyXG4gICAgICAgICAgY2xhc3M9XCJzaW1wbGUtZ3JpZC1yb3dcIlxyXG4gICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInJvd0luZGV4ID09PSBzZWxlY3RlZFJvd0luZGV4ICYmICFlZGl0aW5nXCIgb2JzZXJ2ZVZpc2liaWxpdHlcclxuICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJnZXRJc1Jvd0Rpc2FibGVkKHJvd0luZGV4KVwiXHJcbiAgICAgICAgICBbY2xhc3MuZWRpdGluZ109XCJyb3dJbmRleCA9PT0gZWRpdFJvd0luZGV4XCJcclxuICAgICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2YgKCEhcm93c1BlclBhZ2UgPyAoZGF0YSB8IHBhZ2luYXRlOiB7aXRlbXNQZXJQYWdlOiByb3dzUGVyUGFnZSwgY3VycmVudFBhZ2U6IGN1cnJlbnRQYWdlfSkgOiBkYXRhKTsgbGFzdCBhcyBsYXN0OyBsZXQgcm93SW5kZXggPSBpbmRleFwiXHJcbiAgICAgICAgICBjZGtEcmFnXHJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2tSb3coJGV2ZW50LCByb3dJbmRleClcIiAoZGJsY2xpY2spPVwiaGFuZGxlRGJsQ2xpY2tSb3coJGV2ZW50LCByb3dJbmRleCwgcm93KVwiXHJcbiAgICAgICAgICAodmlzaWJpbGl0eUNoYW5nZSk9XCJyb3dWaXNpYmxlLm5leHQocm93KVwiXHJcbiAgICAgICAgICAobW91c2VlbnRlcik9XCJob3ZlcmVkUm93SW5kZXggPSByb3dJbmRleFwiXHJcbiAgICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkUm93SW5kZXggPSAtMVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU2luZ2xlQ29sdW1uUm93KHJvdylcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwic2ltcGxlLWdyaWQtc2luZ2xlLWNvbHVtbi1jZWxsXCIgW2F0dHIuY29sc3Bhbl09XCJoZWFkZXJDb2x1bW5zQ29weS5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICA8Y28tc2ltcGxlLWdyaWQtY2VsbFxyXG4gICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5zW3NpbmdsZUNvbHVtbkluZGV4KHJvdyldXCJcclxuICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcclxuICAgICAgICAgICAgICAgIFtlZGl0TW9kZV09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgIDwvY28tc2ltcGxlLWdyaWQtY2VsbD5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1NpbmdsZUNvbHVtblJvdyhyb3cpXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBoZWFkZXJDb2x1bW5zQ29weTsgbGV0IGNvbHVtbkluZGV4ID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJzaW1wbGUtZ3JpZC1jb2x1bW4tY2VsbFwiICpuZ0lmPVwiY29sdW1uSW5kZXggIT09IHNpbmdsZUNvbHVtbkluZGV4KHJvdylcIj5cclxuICAgICAgICAgICAgICAgIDxjby1zaW1wbGUtZ3JpZC1jZWxsXHJcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcclxuICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxyXG4gICAgICAgICAgICAgICAgICBbZWRpdE1vZGVdPVwiaW5saW5lRWRpdCAmJiBlZGl0aW5nICYmIHJvd0luZGV4ID09PSBlZGl0Um93SW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICBbZmllbGRFZGl0TW9kZV09XCJlZGl0Q2VsbEluZGV4ID09PSBjb2x1bW5JbmRleCAmJiByb3dJbmRleCA9PT0gZWRpdFJvd0luZGV4XCJcclxuICAgICAgICAgICAgICAgICAgKGNlbGxDbGljayk9XCJoYW5kbGVDZWxsQ2xpY2soJGV2ZW50LCByb3csIHJvd0luZGV4LCBjb2x1bW5JbmRleClcIj5cclxuICAgICAgICAgICAgICAgIDwvY28tc2ltcGxlLWdyaWQtY2VsbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2x1bW4ucmVzaXphYmxlXCIgY2xhc3M9XCJzaW1wbGUtZ3JpZC1jb2x1bW4tc2l6ZXItcGxhY2Vob2xkZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dSb3dCdXR0b25zXCI+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaWNvbnMtY29udGFpbmVyXCIgW2NsYXNzLnNob3ctY29udGVudF09XCJzZWxlY3RlZFJvd0luZGV4ID09PSByb3dJbmRleCB8fCBob3ZlcmVkUm93SW5kZXggPT09IHJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8Y28taWNvbiBjbGFzcz1cImljb24taXRlbSBpY29uLWVkaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImVkaXRSb3dJbmRleCAhPT0gcm93SW5kZXggJiYgaW5saW5lRWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uRGF0YV09XCJpY29ucy5nZXRJY29uKEljb25zLlBlblRvU3F1YXJlU29saWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRSb3coJGV2ZW50LCB0cnVlLCByb3dJbmRleCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPjwvY28taWNvbj5cclxuICAgICAgICAgICAgICAgICAgPGNvLWljb24gY2xhc3M9XCJpY29uLWl0ZW0gaWNvbi1kZWxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbkRhdGFdPVwiaWNvbnMuZ2V0SWNvbihJY29ucy5UcmFzaEJpbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihlZGl0Um93SW5kZXggIT09IHJvd0luZGV4ICYmIHNob3dEZWxldGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVJvdyhkYXRhW3Jvd0luZGV4XSlcIj48L2NvLWljb24+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0aW5nICYmIGlubGluZUVkaXQgJiYgKHNlbGVjdGVkUm93SW5kZXggPT09IHJvd0luZGV4IHx8IGlzTmV3Um93KSAmJiBlZGl0Um93SW5kZXggPT09IHJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxjby1idXR0b24gY2xhc3M9XCJzYXZlLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25EYXRhXT1cImljb25zLmdldEljb24oSWNvbnMuQ2hlY2tEdW90b25lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInZhbGlkYXRlQW5kU2F2ZSgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj48L2NvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGNvLWJ1dHRvbiBjbGFzcz1cImNsb3NlLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25EYXRhXT1cImljb25zLmdldEljb24oSWNvbnMuQ3Jvc3NTa2lubnkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsRWRpdFJvdygpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgXCI+PC9jby1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvY28tZm9ybT5cclxuICAgICAgPC90Ym9keT5cclxuICAgIDwvdGFibGU+XHJcbiAgICA8Y28tcGFnaW5hdGlvbi1iYXJcclxuICAgICAgKm5nSWY9XCJkYXRhPy5sZW5ndGggPiByb3dzUGVyUGFnZVwiIGNsYXNzPVwicGFnaW5hdGlvbi1iYXJcIlxyXG4gICAgICBbaXRlbXNQZXJQYWdlXT1cInJvd3NQZXJQYWdlXCJcclxuICAgICAgW2N1cnJlbnRQYWdlXT1cImN1cnJlbnRQYWdlXCJcclxuICAgICAgW3RvdGFsSXRlbXNdPVwiZGF0YS5sZW5ndGhcIlxyXG4gICAgICBbYXV0b0hpZGVdPVwidHJ1ZVwiXHJcbiAgICAgIChwcmV2aW91c0NsaWNrKT1cImdvVG9QcmV2aW91c1BhZ2UoKVwiXHJcbiAgICAgIChuZXh0Q2xpY2spPVwiZ29Ub05leHRQYWdlKClcIlxyXG4gICAgICAocGFnZUNsaWNrKT1cInNldEN1cnJlbnRQYWdlKCRldmVudClcIj5cclxuICAgIDwvY28tcGFnaW5hdGlvbi1iYXI+XHJcbiAgYCxcclxuICBwcm92aWRlcnM6IFtGb3JtTWFzdGVyU2VydmljZV0sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNpbXBsZUdyaWRDb21wb25lbnQgZXh0ZW5kcyBCYXNlU2ltcGxlR3JpZENvbXBvbmVudCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRUZXh0QWxpZ246IENvbHVtbkFsaWduID0gQ29sdW1uQWxpZ24uTGVmdDtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbignaGVhZGVyQ2VsbCcpIHNldCBoZWFkZXJDZWxscyhjZWxscykge1xyXG4gICAgY29uc3QgaGVhZGVyRWxlbWVudHMgPSBjZWxscy50b0FycmF5KCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlckVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuY29sdW1uc1tpXS5lbGVtZW50UmVmID0gaGVhZGVyRWxlbWVudHNbaV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkcmVuKCdyb3dFbGVtZW50Jykgcm93RWxlbWVudHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd0FkZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzaG93RGVsZXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlc2VsZWN0QWxsb3dlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBlZGl0T25DZWxsQ2xpY2s6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyByaWdodFRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd0dyaWRTZXR0aW5nczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyByb3dzUGVyUGFnZTogbnVtYmVyID0gNTA7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHJvd0Rpc2FibGVkRm46IEZ1bmN0aW9uO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzaG93Q29sdW1uU29ydDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzaG93Um93QnV0dG9uczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBQcm9taXNlIGZ1bmN0aW9uLCBpZiBwcm92aWRlZCBzaG91bGQgcmV0dXJuIGJvb2xlYW5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBjYW5Sb3dCZUVkaXR0ZWRGbjogRnVuY3Rpb247XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuY28tc2ltcGxlLWdyaWQnKVxyXG4gIHB1YmxpYyBzaG93Q2xhc3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxyXG4gIHB1YmxpYyBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaW5saW5lRWRpdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2ZW50LmNvZGUgPT09ICdUYWInKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMuX25leHRBdmFpbGFibGVDZWxsVG9FZGl0KCFldmVudC5zaGlmdEtleSwgdGhpcy5lZGl0Q2VsbEluZGV4KVxyXG4gICAgICAgIC50aGVuKChpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmVkaXRDZWxsSW5kZXggPSBpbmRleDtcclxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0aW9uLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnKSB7XHJcbiAgICAgIHRoaXMuY2FuY2VsRWRpdFJvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChldmVudC5jb2RlID09PSAnRW50ZXInKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGVBbmRTYXZlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZWRpdGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpc1NldHRpbmdzTWVudU9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZWRpdFJvd0luZGV4OiBudW1iZXIgPSAtMTtcclxuICBwdWJsaWMgZWRpdENlbGxJbmRleDogbnVtYmVyID0gLTE7XHJcbiAgcHVibGljIHNlbGVjdGVkUm93SW5kZXg6IG51bWJlciA9IC0xO1xyXG4gIHB1YmxpYyByb3dUb0VkaXQ6IGFueTtcclxuICBwdWJsaWMgY3VycmVudFBhZ2U6IG51bWJlciA9IDE7XHJcbiAgcHVibGljIHNvcnRDb2x1bW5WYWx1ZTogc3RyaW5nO1xyXG4gIHB1YmxpYyBzb3J0RGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG4gIHB1YmxpYyBob3ZlcmVkUm93SW5kZXg6IG51bWJlciA9IC0xO1xyXG4gIHB1YmxpYyByZWFkb25seSBJY29ucyA9IENvcmVDb21wb25lbnRzSWNvbjtcclxuXHJcbiAgcHJpdmF0ZSBfZG91YmxlQ2xpY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX25ld1JvdzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX25ld1Jvd1JlZmVyZW5jZTogYW55O1xyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgSWNvbkNhY2hlU2VydmljZSA9IEljb25DYWNoZVNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IENvcmVDb21wb25lbnRzSWNvbiA9IENvcmVDb21wb25lbnRzSWNvbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgaWNvbnM6IEljb25DYWNoZVNlcnZpY2UsXHJcbiAgICBwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgX2Zvcm1NYXN0ZXI6IEZvcm1NYXN0ZXJTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihjaGFuZ2VEZXRlY3Rpb24pO1xyXG4gICAgdGhpcy5kYXRhQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZUNsaWNrT3V0c2lkZVJvdygpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsaWRhdGVBbmRTYXZlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SXNSb3dEaXNhYmxlZChpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZWRSb3dzLmluZGV4T2YoaWR4KSA+IC0xO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGlzUm93RGlzYWJsZWQocm93OiBhbnksIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLnJvd0Rpc2FibGVkRm4gJiYgKHR5cGVvZiB0aGlzLnJvd0Rpc2FibGVkRm4gPT09ICdmdW5jdGlvbicpKSB7XHJcbiAgICAgIGNvbnN0IGRpc2FibGVkID0gYXdhaXQgdGhpcy5yb3dEaXNhYmxlZEZuLmNhbGwodGhpcywgcm93KTtcclxuICAgICAgY29uc3QgaWR4Um93OiBudW1iZXIgPSB0aGlzLmRpc2FibGVkUm93cy5pbmRleE9mKGluZGV4KTtcclxuICAgICAgaWYgKGRpc2FibGVkKSB7XHJcbiAgICAgICAgaWYgKGlkeFJvdyA8IDApIHtcclxuICAgICAgICAgIHRoaXMuZGlzYWJsZWRSb3dzLnB1c2goaW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoaWR4Um93ID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMuZGlzYWJsZWRSb3dzLnNwbGljZShpZHhSb3csIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZGlzYWJsZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYWRkTmV3Um93KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuaW5saW5lRWRpdCkge1xyXG4gICAgICBjb25zdCB2YWxpZDogYm9vbGVhbiA9IHRoaXMudmFsaWRhdGVBbmRTYXZlKCk7XHJcbiAgICAgIGlmICh2YWxpZCkge1xyXG4gICAgICAgIHRoaXMuX25ld1Jvd1JlZmVyZW5jZSA9IHt9O1xyXG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKHRoaXMuX25ld1Jvd1JlZmVyZW5jZSk7XHJcbiAgICAgICAgdGhpcy5fZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHRoaXMuX25ld1JvdyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucm93c1BlclBhZ2UgJiYgdGhpcy5kYXRhLmxlbmd0aCA+IHRoaXMucm93c1BlclBhZ2UpIHtcclxuICAgICAgICAgIC8vIG5hdmlnYXRlIHRvIGxhc3QgcGFnZVxyXG4gICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IE1hdGguY2VpbCh0aGlzLmRhdGEubGVuZ3RoIC8gdGhpcy5yb3dzUGVyUGFnZSk7XHJcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZUluZGV4OiBudW1iZXIgPSAodGhpcy5kYXRhLmxlbmd0aCAtIDEpICUgdGhpcy5yb3dzUGVyUGFnZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJbmRleCA9IHJlbGF0aXZlSW5kZXg7XHJcbiAgICAgICAgICB0aGlzLmVkaXRSb3dJbmRleCA9IHJlbGF0aXZlSW5kZXg7XHJcblxyXG4gICAgICAgICAgLy8gc3RvcmUgcmVmZXJlbmNlXHJcbiAgICAgICAgICB0aGlzLnJvd1RvRWRpdCA9IHRoaXMuX25ld1Jvd1JlZmVyZW5jZTtcclxuICAgICAgICAgIHRoaXMuZWRpdENlbGxJbmRleCA9IGF3YWl0IHRoaXMuX25leHRBdmFpbGFibGVDZWxsVG9FZGl0KHRydWUpO1xyXG5cclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMucm93RWxlbWVudHM/Lmxhc3Q/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgIGVsLnNjcm9sbEludG9WaWV3KHtiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJ30pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LCAyMDApO1xyXG5cclxuICAgICAgICAgIC8vIHJlc2V0IHJlZmVyZW5jZSB0byB0aGUgbmV3IHJvdyBhZnRlciBlZGl0Q2VsbEluZGV4XHJcbiAgICAgICAgICB0aGlzLnJvd1RvRWRpdCA9IHRoaXMuX25ld1Jvd1JlZmVyZW5jZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5lZGl0Um93SW5kZXggPSB0aGlzLmRhdGEubGVuZ3RoIC0gMTtcclxuICAgICAgICAgIHRoaXMucm93VG9FZGl0ID0gdGhpcy5fbmV3Um93UmVmZXJlbmNlO1xyXG4gICAgICAgICAgdGhpcy5lZGl0Q2VsbEluZGV4ID0gYXdhaXQgdGhpcy5fbmV4dEF2YWlsYWJsZUNlbGxUb0VkaXQodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkUm93Lm5leHQoKTtcclxuICAgICAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWRkUm93Lm5leHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB2YWxpZGF0ZUFuZFNhdmUoc3RvcGVkaXRpbmc6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuZWRpdGluZykge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHZhbGlkOiBib29sZWFuID0gdGhpcy5fZm9ybU1hc3Rlci5zdWJtaXRTbGF2ZXMoKTtcclxuICAgIHRoaXMuX2RldGVjdENoYW5nZXMoKTtcclxuICAgIGlmICh2YWxpZCkge1xyXG4gICAgICB0aGlzLl9zYXZlUm93KHN0b3BlZGl0aW5nKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuY2VsRWRpdFJvdygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5lZGl0aW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9uZXdSb3cpIHtcclxuICAgICAgdGhpcy5kYXRhLnNwbGljZSh0aGlzLmRhdGEubGVuZ3RoIC0gMSwgMSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRhdGFbdGhpcy5lZGl0Um93SW5kZXhdID0gdGhpcy5yb3dUb0VkaXQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZXNldEVkaXQoKTtcclxuICAgIHRoaXMuX2RldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVSb3cocm93OmFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5kZWxldGVSb3cubmV4dChyb3cpO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgIT09IDEpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJbmRleCA9IC0xO1xyXG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oe3RvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlU2VsZWN0ZWRSb3coKTogdm9pZCB7XHJcbiAgICBsZXQgYWJzb2x1dGVJbmRleDogbnVtYmVyID0gdGhpcy5zZWxlY3RlZFJvd0luZGV4O1xyXG4gICAgaWYgKHRoaXMucm93c1BlclBhZ2UpIHtcclxuICAgICAgYWJzb2x1dGVJbmRleCA9ICh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnJvd3NQZXJQYWdlICsgdGhpcy5zZWxlY3RlZFJvd0luZGV4O1xyXG4gICAgfVxyXG4gICAgdGhpcy5kZWxldGVSb3cubmV4dCh0aGlzLmRhdGFbYWJzb2x1dGVJbmRleF0pO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgIT09IDEpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dJbmRleCA9IC0xO1xyXG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oe3RvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlQ2xpY2tSb3coZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlubGluZUVkaXQgJiYgdGhpcy5zaG93Um93QnV0dG9ucyAmJiAhdGhpcy5lZGl0aW5nKSB7XHJcbiAgICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RvdWJsZUNsaWNrZWQpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RUaGVSb3coaW5kZXgpO1xyXG4gICAgICAgIGlmICh0aGlzLmlubGluZUVkaXQgJiYgIXRoaXMuc2hvd1Jvd0J1dHRvbnMpIHtcclxuICAgICAgICAgIHRoaXMuZWRpdFJvdyhldmVudCwgdHJ1ZSwgaW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMjAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RUaGVSb3coaW5kZXg6IG51bWJlciwgZW1pdDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkUm93SW5kZXggPT09IC0xIHx8ICh0aGlzLnNlbGVjdGVkUm93SW5kZXggIT09IGluZGV4ICYmICgodGhpcy5lZGl0aW5nICYmIHRoaXMudmFsaWRhdGVBbmRTYXZlKCkpIHx8ICF0aGlzLmVkaXRpbmcpKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUm93SW5kZXggPSBpbmRleDtcclxuICAgICAgY29uc3QgYWJzb2x1dGVJbmRleDogbnVtYmVyID0gdGhpcy5yb3dzUGVyUGFnZSA/ICh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnJvd3NQZXJQYWdlICsgaW5kZXggOiBpbmRleDtcclxuICAgICAgaWYgKGVtaXQpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdFJvdy5uZXh0KHRoaXMuZGF0YVthYnNvbHV0ZUluZGV4XSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFJvd0luZGV4ID09PSBpbmRleCAmJiB0aGlzLmRlc2VsZWN0QWxsb3dlZCAmJiAoKHRoaXMuZWRpdGluZyAmJiB0aGlzLnZhbGlkYXRlQW5kU2F2ZSgpKSB8fCAhdGhpcy5lZGl0aW5nKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUm93SW5kZXggPSAtMTtcclxuICAgICAgaWYgKGVtaXQpIHtcclxuICAgICAgICB0aGlzLmRlc2VsZWN0Um93Lm5leHQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGhhbmRsZURibENsaWNrUm93KGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyLCByb3c6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGF3YWl0IHRoaXMuaXNSb3dEaXNhYmxlZChyb3csIGluZGV4KSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUm93SW5kZXggPSAtMTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGNhbkVkaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuY2FuUm93QmVFZGl0dGVkRm4gJiYgdHlwZW9mIHRoaXMuY2FuUm93QmVFZGl0dGVkRm4gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY2FuRWRpdCA9IGF3YWl0IHRoaXMuY2FuUm93QmVFZGl0dGVkRm4uY2FsbCh0aGlzLCByb3cpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNhbkVkaXQpIHtcclxuICAgICAgdGhpcy5fZG91YmxlQ2xpY2tlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZGJsQ2xpY2tSb3cubmV4dCh0aGlzLmRhdGFbaW5kZXhdKTtcclxuICAgICAgdGhpcy5zZWxlY3RUaGVSb3coaW5kZXgsIGZhbHNlKTtcclxuICAgICAgaWYgKHRoaXMuaW5saW5lRWRpdCAmJiAhdGhpcy5zaG93Um93QnV0dG9ucykge1xyXG4gICAgICAgIHRoaXMuZWRpdFJvdyhldmVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX3Jlc2V0RGJsQ2xpY2soKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBlZGl0Um93KGV2ZW50OiBNb3VzZUV2ZW50LCBzZWxlY3RDZWxsOiBib29sZWFuID0gdHJ1ZSwgcm93SW5kZXg/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChyb3dJbmRleCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0VGhlUm93KHJvd0luZGV4KTtcclxuICAgIH1cclxuICAgIHRoaXMuZWRpdGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmVkaXRSb3dJbmRleCA9IHRoaXMuc2VsZWN0ZWRSb3dJbmRleDtcclxuICAgIHRoaXMucm93VG9FZGl0ID0gdGhpcy5kYXRhW3RoaXMuZWRpdFJvd0luZGV4XTtcclxuXHJcbiAgICBpZiAodGhpcy5zaG93Um93QnV0dG9ucyAmJiB0aGlzLmlubGluZUVkaXQgJiYgc2VsZWN0Q2VsbCkge1xyXG4gICAgICB0aGlzLmVkaXRDZWxsSW5kZXggPSBhd2FpdCB0aGlzLl9uZXh0QXZhaWxhYmxlQ2VsbFRvRWRpdCh0cnVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2RldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBoYW5kbGVDZWxsQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogYW55LCByb3dJbmRleDogbnVtYmVyLCBjZWxsSW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuZWRpdE9uQ2VsbENsaWNrKSB7XHJcbiAgICAgIGlmIChhd2FpdCB0aGlzLmlzUm93RGlzYWJsZWQocm93LCByb3dJbmRleCkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUm93SW5kZXggPSAtMTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuaW5saW5lRWRpdCkge1xyXG4gICAgICAgIHRoaXMuZWRpdFJvd0luZGV4ID0gcm93SW5kZXg7XHJcbiAgICAgICAgdGhpcy5lZGl0Q2VsbEluZGV4ID0gY2VsbEluZGV4O1xyXG4gICAgICAgIHRoaXMuZWRpdGluZyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZWRpdENlbGxJbmRleCA9IGNlbGxJbmRleDtcclxuICAgIH1cclxuICAgIHRoaXMuX2RldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVTZXR0aW5nc01lbnUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmhlYWRlckNvbHVtbnNDb3B5LmZvckVhY2goaSA9PiBpLmlzU2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICB0aGlzLmlzU2V0dGluZ3NNZW51T3BlbiA9ICF0aGlzLmlzU2V0dGluZ3NNZW51T3BlbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVDb2x1bW5NZW51KGNvbDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0dyaWRTZXR0aW5ncykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc1NldHRpbmdzTWVudU9wZW4gPSBmYWxzZTtcclxuICAgIGlmIChjb2wuaXNTZWxlY3RlZCkge1xyXG4gICAgICBjb2wuaXNTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5oZWFkZXJDb2x1bW5zQ29weS5mb3JFYWNoKGkgPT4gaS5pc1NlbGVjdGVkID0gZmFsc2UpO1xyXG4gICAgICBjb2wuaXNTZWxlY3RlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGlkZUNvbHVtbihjb2w6IGFueSk6IHZvaWQge1xyXG4gICAgY29sLmlzU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuaGVhZGVyQ29sdW1uc0NvcHkgPSB0aGlzLmhlYWRlckNvbHVtbnNDb3B5LmZpbHRlcigob2JqKSA9PiB7XHJcbiAgICAgIHJldHVybiBvYmogIT09IGNvbDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNvcnRDb2x1bW4oY29sOiBhbnksIGNvbHVtblZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbC5pc1NlbGVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuc29ydENvbHVtblZhbHVlID09PSBjb2x1bW5WYWx1ZSkge1xyXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSB0aGlzLnNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNvcnRDb2x1bW5WYWx1ZSA9IGNvbHVtblZhbHVlO1xyXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSAnYXNjJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLnNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xyXG5cclxuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLmRhdGFdLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgbGV0IHZhbEEgPSBhW2NvbHVtblZhbHVlXTtcclxuICAgICAgbGV0IHZhbEIgPSBiW2NvbHVtblZhbHVlXTtcclxuXHJcbiAgICAgIGlmICh2YWxBID09IG51bGwgJiYgdmFsQiA9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZhbEEgPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiAtMSAqIGRpcmVjdGlvbjtcclxuICAgICAgfVxyXG4gICAgICBpZiAodmFsQiA9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIDEgKiBkaXJlY3Rpb247XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEhhbmRsZSBJU08gZGF0ZSBzdHJpbmdcclxuICAgICAgY29uc3QgaXNEYXRlQSA9IHR5cGVvZiB2YWxBID09PSAnc3RyaW5nJyAmJiAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VC8udGVzdCh2YWxBKTtcclxuICAgICAgY29uc3QgaXNEYXRlQiA9IHR5cGVvZiB2YWxCID09PSAnc3RyaW5nJyAmJiAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VC8udGVzdCh2YWxCKTtcclxuXHJcbiAgICAgIGlmIChpc0RhdGVBICYmIGlzRGF0ZUIpIHtcclxuICAgICAgICBjb25zdCB0aW1lQSA9IG5ldyBEYXRlKHZhbEEpLmdldFRpbWUoKTtcclxuICAgICAgICBjb25zdCB0aW1lQiA9IG5ldyBEYXRlKHZhbEIpLmdldFRpbWUoKTtcclxuICAgICAgICByZXR1cm4gKHRpbWVBIC0gdGltZUIpICogZGlyZWN0aW9uO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBGYWxsYmFjayBmb3IgbnVtYmVycy9zdHJpbmdzXHJcbiAgICAgIGlmICh0eXBlb2YgdmFsQSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbEIgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbEEubG9jYWxlQ29tcGFyZSh2YWxCKSAqIGRpcmVjdGlvbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuICh2YWxBID4gdmFsQiA/IDEgOiB2YWxBIDwgdmFsQiA/IC0xIDogMCkgKiBkaXJlY3Rpb247XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRhdGEgPSBzb3J0ZWQ7XHJcbiAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd0FsbENvbHVtbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzU2V0dGluZ3NNZW51T3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5oZWFkZXJDb2x1bW5zQ29weSA9IHRoaXMuaGVhZGVyQ29sdW1ucztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBleHBvcnRUb0V4Y2VsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc1NldHRpbmdzTWVudU9wZW4gPSBmYWxzZTtcclxuICAgIGNvbnN0IGV4cG9ydERhdGE6IE9iamVjdFtdID0gdGhpcy5leHBvcnREYXRhLmxlbmd0aCA+IDAgPyB0aGlzLl9maWx0ZXJTZWxlY3RlZE9yUmV0dXJuQWxsKHRoaXMuZXhwb3J0RGF0YSkgOiB0aGlzLl9maWx0ZXJTZWxlY3RlZE9yUmV0dXJuQWxsKHRoaXMuZGF0YSk7XHJcbiAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW5bXSA9IHRoaXMuaGVhZGVyQ29sdW1uc0NvcHkubWFwKGNvbHVtbiA9PiB7XHJcbiAgICAgIHJldHVybiAoe1xyXG4gICAgICAgIGtleTogY29sdW1uLmZpZWxkLFxyXG4gICAgICAgIGhlYWRlcjogY29sdW1uLmhlYWRlclRleHRcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBoZWFkZXJzID0gY29sdW1ucy5tYXAoY29sID0+IGNvbC5oZWFkZXIpO1xyXG4gICAgY29uc3Qgcm93cyA9IGV4cG9ydERhdGEubWFwKHJvdyA9PlxyXG4gICAgICBjb2x1bW5zLm1hcChjb2wgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93W2NvbC5rZXldO1xyXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB2YWx1ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07XHJcbiAgICAgICAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBmb3JtYXR0ZWREYXRlLnNwbGl0KCctJyk7XHJcbiAgICAgICAgICByZXR1cm4gYCR7ZGF5fS0ke21vbnRofS0ke3llYXJ9YDtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIGNvbnN0IGhhc0RlY2ltYWwgPSAobnVtKSA9PiAhTnVtYmVyLmlzSW50ZWdlcihudW0pO1xyXG4gICAgICAgICAgcmV0dXJuIGhhc0RlY2ltYWwodmFsdWUpID8gdmFsdWUudG9GaXhlZCgyKSA6IHZhbHVlLnRvRml4ZWQoMCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHZhbHVlLmpvaW4oJywgJyk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gJyc7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5pbmNsdWRlcygnVDAwOjAwOjAwJykpIHtcclxuICAgICAgICAgICAgY29uc3QgW3llYXIsIG1vbnRoLCBkYXldID0gdmFsdWUucmVwbGFjZSgnVDAwOjAwOjAwJywgJycpLnNwbGl0KCctJyk7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHtkYXl9LSR7bW9udGh9LSR7eWVhcn1gO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBjb25zdCBjc3ZDb250ZW50ID0gW2hlYWRlcnMsIC4uLnJvd3NdLm1hcChyb3cgPT5cclxuICAgIC8vICAgcm93Lm1hcChjZWxsID0+IGBcIiR7Y2VsbC5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYCkuam9pbignLCcpXHJcbiAgICAvLyApLmpvaW4oJ1xcclxcbicpO1xyXG5cclxuICAgIGNvbnN0IGNzdkNvbnRlbnQ6IHN0cmluZyA9IFtoZWFkZXJzLCAuLi5yb3dzXS5tYXAocm93ID0+XHJcbiAgICAgIHJvdy5tYXAoKGNlbGw6IHN0cmluZykgPT4gYFwiJHtTdHJpbmcoY2VsbCkucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImApLmpvaW4oJywnKVxyXG4gICAgKS5qb2luKCdcXHJcXG4nKTtcclxuXHJcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NzdkNvbnRlbnRdLCB7dHlwZTogJ3RleHQvY3N2O2NoYXJzZXQ9dXRmLTg7J30pO1xyXG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcblxyXG4gICAgbGluay5ocmVmID0gdXJsO1xyXG4gICAgbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgJ0V4Y2VsU2hlZXQnKTtcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xyXG5cclxuICAgIC8vIHRoaXMuZXhjZWxFeHBvcnRTZXJ2aWNlLmV4cG9ydFRvRXhjZWwoXHJcbiAgICAvLyAgIHRoaXMuZGF0YSxcclxuICAgIC8vICAgY29sdW1ucyxcclxuICAgIC8vICAgJ0V4Y2VsU2hlZXQnLFxyXG4gICAgLy8gICAnU2hlZXQxJ1xyXG4gICAgLy8gKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnb1RvUHJldmlvdXNQYWdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSAtPSAxO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdvVG9OZXh0UGFnZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgKz0gMTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRDdXJyZW50UGFnZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpc05ld1JvdygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9uZXdSb3c7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9maWx0ZXJTZWxlY3RlZE9yUmV0dXJuQWxsKGl0ZW1zOiBhbnkpIHtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGVkVHJ1ZTogYm9vbGVhbiA9IGl0ZW1zLnNvbWUoaXRlbSA9PiBpdGVtLnNlbGVjdGVkID09PSB0cnVlKTtcclxuICAgIHJldHVybiBoYXNTZWxlY3RlZFRydWUgPyBpdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLnNlbGVjdGVkID09PSB0cnVlKSA6IGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHByZXBhcmVEYXRhUm93KHJvdzogYW55LCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmlzUm93RGlzYWJsZWQocm93LCBpbmRleCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZXNldERibENsaWNrKCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2RvdWJsZUNsaWNrZWQgPSBmYWxzZTtcclxuICAgIH0sIDUwMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSBuZXh0OyBNb3ZlIHRvIG5leHQgb3IgcHJldmlvdXMgY2VsbFxyXG4gICAqIEBwYXJhbSBzdGFydDsgU3RhcnQgZnJvbSBjZWxsaW5kZXhcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX25leHRBdmFpbGFibGVDZWxsVG9FZGl0KG5leHQ6IGJvb2xlYW4sIHN0YXJ0OiBudW1iZXIgPSAtMSk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IG51bUVkaXRhYmxlQ29sdW1uczogbnVtYmVyID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+ICFjLnJlYWRvbmx5KS5sZW5ndGg7XHJcbiAgICAgIGNvbnN0IHdhbnRlZEluZGV4ID0gc3RhcnQgKyAobmV4dCA/IDEgOiAtMSk7XHJcbiAgICAgIGlmICh3YW50ZWRJbmRleCA+PSBudW1FZGl0YWJsZUNvbHVtbnMpIHtcclxuICAgICAgICB0aGlzLl9nZXROZXh0RWRpdFJvd0luZGV4KClcclxuICAgICAgICAgIC50aGVuKChpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdFJvd0luZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICAgIHJlc29sdmUodGhpcy5fZ2V0TmV4dEVkaXRDZWxsSW5kZXgoMCkpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKHdhbnRlZEluZGV4IDwgMCkge1xyXG4gICAgICAgIHRoaXMuX2dldFByZXZpb3VzRWRpdFJvd0luZGV4KClcclxuICAgICAgICAgIC50aGVuKChpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdFJvd0luZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICAgIHJlc29sdmUodGhpcy5fZ2V0UHJldmlvdXNFZGl0Q2VsbEluZGV4KHRoaXMuY29sdW1ucy5sZW5ndGggLSAxKSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdCgpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZShuZXh0ID8gdGhpcy5fZ2V0TmV4dEVkaXRDZWxsSW5kZXgoc3RhcnQgKyAxKSA6IHRoaXMuX2dldFByZXZpb3VzRWRpdENlbGxJbmRleChzdGFydCAtIDEpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXROZXh0RWRpdENlbGxJbmRleChzdGFydDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IHN0YXJ0OyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICghdGhpcy5jb2x1bW5zW2ldLnJlYWRvbmx5KSB7XHJcbiAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFByZXZpb3VzRWRpdENlbGxJbmRleChzdGFydDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IHN0YXJ0OyBpID49IDA7IGktLSkge1xyXG4gICAgICBpZiAoIXRoaXMuY29sdW1uc1tpXS5yZWFkb25seSkge1xyXG4gICAgICAgIHJldHVybiBpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXROZXh0RWRpdFJvd0luZGV4KCk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgIGxldCBuZXdSb3dJbmRleDogbnVtYmVyID0gMDtcclxuICAgICAgaWYgKHRoaXMuZWRpdFJvd0luZGV4ICsgMSA+PSB0aGlzLmRhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b0FkZFJvdykge1xyXG4gICAgICAgICAgdGhpcy5hZGROZXdSb3coKTtcclxuICAgICAgICAgIG5ld1Jvd0luZGV4ID0gdGhpcy5lZGl0Um93SW5kZXg7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ld1Jvd0luZGV4ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmV3Um93SW5kZXggPSB0aGlzLmVkaXRSb3dJbmRleCArIDE7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5ld1Jvd0luZGV4ICE9PSB0aGlzLmVkaXRSb3dJbmRleCkgeyAvLyBnbyB0byBkaWZmZXJlbnQgcm93IHZhbGlkYXRlIGN1cnJlbnQgb25lIGZpcnN0XHJcbiAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVBbmRTYXZlKGZhbHNlKSkge1xyXG4gICAgICAgICAgdGhpcy5yb3dUb0VkaXQgPSB0aGlzLmRhdGFbbmV3Um93SW5kZXhdO1xyXG4gICAgICAgICAgcmVzb2x2ZShuZXdSb3dJbmRleCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlamVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKG5ld1Jvd0luZGV4KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRQcmV2aW91c0VkaXRSb3dJbmRleCgpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICBsZXQgbmV3Um93SW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICAgIGlmICh0aGlzLmVkaXRSb3dJbmRleCAtIDEgPCAwKSB7XHJcbiAgICAgICAgbmV3Um93SW5kZXggPSB0aGlzLmRhdGEubGVuZ3RoIC0gMTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXdSb3dJbmRleCA9IHRoaXMuZWRpdFJvd0luZGV4IC0gMTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobmV3Um93SW5kZXggIT09IHRoaXMuZWRpdFJvd0luZGV4KSB7IC8vIGdvIHRvIGRpZmZlcmVudCByb3cgdmFsaWRhdGUgY3VycmVudCBvbmUgZmlyc3RcclxuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZUFuZFNhdmUoZmFsc2UpKSB7XHJcbiAgICAgICAgICB0aGlzLnJvd1RvRWRpdCA9IHRoaXMuZGF0YVtuZXdSb3dJbmRleF07XHJcbiAgICAgICAgICByZXNvbHZlKG5ld1Jvd0luZGV4KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUobmV3Um93SW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NhdmVSb3coc3RvcGVkaXRpbmc6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fbmV3Um93KSB7XHJcbiAgICAgIHRoaXMuc2F2ZVJvdy5uZXh0KHRoaXMuX25ld1Jvd1JlZmVyZW5jZSk7XHJcbiAgICAgIHRoaXMuX25ld1Jvd1JlZmVyZW5jZSA9IG51bGw7IC8vIGNsZWFyXHJcbiAgICAgIHdpbmRvdy5zY3JvbGxUbyh7dG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCd9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBpbmRleDogbnVtYmVyID0gLTE7IC8vIGV4aXN0aW5nIHJvd1xyXG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuZGF0YS5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnNhdmVSb3cubmV4dCh0aGlzLmRhdGFbdGhpcy5lZGl0Um93SW5kZXhdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fbmV3Um93ID0gZmFsc2U7XHJcbiAgICBpZiAoc3RvcGVkaXRpbmcpIHtcclxuICAgICAgdGhpcy5fcmVzZXRFZGl0KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kZXRlY3RDaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rpb24uZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVzZXRFZGl0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbmV3Um93ID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlbGVjdGVkUm93SW5kZXggPSAtMTtcclxuICAgIHRoaXMuZWRpdFJvd0luZGV4ID0gLTE7XHJcbiAgICB0aGlzLmVkaXRDZWxsSW5kZXggPSAtMTtcclxuICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5yb3dUb0VkaXQgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==