@colijnit/sharedcomponents 1.0.61 → 1.0.63

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 (486) hide show
  1. package/3rdpartylicenses.txt +1200 -0
  2. package/README.md +24 -24
  3. package/bundles/colijnit-sharedcomponents.umd.js +9887 -9851
  4. package/bundles/colijnit-sharedcomponents.umd.js.map +1 -1
  5. package/colijnit-sharedcomponents.d.ts +91 -91
  6. package/colijnit-sharedcomponents.metadata.json +1 -1
  7. package/esm2015/colijnit-sharedcomponents.js +91 -91
  8. package/esm2015/lib/assets/dictionary/text.properties.js +11 -11
  9. package/esm2015/lib/businessobject/build-images-and-documentation-result.js +2 -2
  10. package/esm2015/lib/businessobject/co-document-right.bo.js +3 -3
  11. package/esm2015/lib/businessobject/drag-drop-container-element.js +2 -2
  12. package/esm2015/lib/businessobject/drag-drop-container.js +7 -7
  13. package/esm2015/lib/components/activity-list/activity-list.component.js +130 -130
  14. package/esm2015/lib/components/activity-list/activity-list.module.js +24 -24
  15. package/esm2015/lib/components/app-file-dropzone/app-file-dropzone.component.js +47 -47
  16. package/esm2015/lib/components/app-file-dropzone/app-file-dropzone.module.js +20 -20
  17. package/esm2015/lib/components/date-planning/component/agenda/agenda-base-view.component.js +61 -61
  18. package/esm2015/lib/components/date-planning/component/agenda/agenda-day-view.component.js +36 -36
  19. package/esm2015/lib/components/date-planning/component/agenda/agenda-event.component.js +56 -56
  20. package/esm2015/lib/components/date-planning/component/agenda/agenda-events.component.js +47 -47
  21. package/esm2015/lib/components/date-planning/component/agenda/agenda-half-hour-cell.component.js +68 -68
  22. package/esm2015/lib/components/date-planning/component/agenda/agenda-header.component.js +243 -243
  23. package/esm2015/lib/components/date-planning/component/agenda/agenda-hour-cell.component.js +36 -36
  24. package/esm2015/lib/components/date-planning/component/agenda/agenda-hour-view-labels.component.js +50 -50
  25. package/esm2015/lib/components/date-planning/component/agenda/agenda-hour-view.component.js +46 -46
  26. package/esm2015/lib/components/date-planning/component/agenda/agenda-month-view.component.js +61 -61
  27. package/esm2015/lib/components/date-planning/component/agenda/agenda-select-event.component.js +39 -39
  28. package/esm2015/lib/components/date-planning/component/agenda/agenda-view.component.js +35 -35
  29. package/esm2015/lib/components/date-planning/component/agenda/agenda-week-select-view.component.js +64 -64
  30. package/esm2015/lib/components/date-planning/component/agenda/agenda-week-view.component.js +48 -48
  31. package/esm2015/lib/components/date-planning/component/agenda/view-select.component.js +42 -42
  32. package/esm2015/lib/components/date-planning/component/calendar/calendar-all-months.component.js +34 -34
  33. package/esm2015/lib/components/date-planning/component/calendar/calendar-all-years.component.js +48 -48
  34. package/esm2015/lib/components/date-planning/component/calendar/calendar-header.component.js +107 -107
  35. package/esm2015/lib/components/date-planning/component/calendar/calendar-view.component.js +178 -178
  36. package/esm2015/lib/components/date-planning/component/calendar/calendar.component.js +34 -34
  37. package/esm2015/lib/components/date-planning/date-planning.component.js +113 -113
  38. package/esm2015/lib/components/date-planning/date-planning.module.js +63 -63
  39. package/esm2015/lib/components/docsign/component/signature/signature.component.js +75 -75
  40. package/esm2015/lib/components/docsign/component/signatures/signatures.component.js +44 -44
  41. package/esm2015/lib/components/docsign/docsign.component.js +242 -242
  42. package/esm2015/lib/components/docsign/docsign.module.js +23 -23
  43. package/esm2015/lib/components/file-upload/file-upload.component.js +189 -189
  44. package/esm2015/lib/components/file-upload/file-upload.module.js +25 -25
  45. package/esm2015/lib/components/file-upload-popup/file-upload-popup.component.js +397 -397
  46. package/esm2015/lib/components/file-upload-popup/file-upload-popup.module.js +30 -30
  47. package/esm2015/lib/components/files-upload/components/base-file-upload.component.js +469 -469
  48. package/esm2015/lib/components/files-upload/components/drag-drop-container.component.js +115 -115
  49. package/esm2015/lib/components/files-upload/files-upload.component.js +131 -131
  50. package/esm2015/lib/components/files-upload/files-upload.module.js +47 -47
  51. package/esm2015/lib/components/image-display/image-display.component.js +36 -36
  52. package/esm2015/lib/components/image-display/image-display.module.js +23 -23
  53. package/esm2015/lib/components/key-pad/key-pad.component.js +200 -200
  54. package/esm2015/lib/components/key-pad/key-pad.module.js +22 -22
  55. package/esm2015/lib/components/layout-switcher/layout-switcher.component.js +74 -74
  56. package/esm2015/lib/components/layout-switcher/layout-switcher.module.js +21 -21
  57. package/esm2015/lib/components/linear-gauge/co-linear-gauge.component.js +59 -59
  58. package/esm2015/lib/components/linear-gauge/co-linear-gauge.module.js +19 -19
  59. package/esm2015/lib/components/multi-property-toggler/multiple-property-toggler.component.js +89 -89
  60. package/esm2015/lib/components/multi-property-toggler/multiple-property-toggler.module.js +21 -21
  61. package/esm2015/lib/components/send-method-dialog/components/layout-selection/layout-selection.component.js +79 -79
  62. package/esm2015/lib/components/send-method-dialog/components/layout-selection/layout-selection.module.js +21 -21
  63. package/esm2015/lib/components/send-method-dialog/components/printer-selection/printer-selection.component.js +85 -85
  64. package/esm2015/lib/components/send-method-dialog/components/printer-selection/printer-selection.module.js +21 -21
  65. package/esm2015/lib/components/send-method-dialog/components/send-method-email/send-method-email.component.js +64 -64
  66. package/esm2015/lib/components/send-method-dialog/components/send-method-email/send-method-email.module.js +26 -26
  67. package/esm2015/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.component.js +40 -40
  68. package/esm2015/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.module.js +23 -23
  69. package/esm2015/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.component.js +61 -61
  70. package/esm2015/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.module.js +28 -28
  71. package/esm2015/lib/components/send-method-dialog/components/signature-button/signature-button.component.js +38 -38
  72. package/esm2015/lib/components/send-method-dialog/components/signature-button/signature-button.module.js +21 -21
  73. package/esm2015/lib/components/send-method-dialog/model/email-address-viewmodel.js +7 -7
  74. package/esm2015/lib/components/send-method-dialog/send-method-dialog.component.js +258 -258
  75. package/esm2015/lib/components/send-method-dialog/send-method-dialog.module.js +35 -35
  76. package/esm2015/lib/components/send-method-dialog/send-method-params.interface.js +2 -2
  77. package/esm2015/lib/components/send-method-dialog/service/send-method.service.js +59 -59
  78. package/esm2015/lib/components/simple-tags/simple-tags.component.js +229 -229
  79. package/esm2015/lib/components/simple-tags/simple-tags.module.js +26 -26
  80. package/esm2015/lib/components/statusbar/statusbar-popup.component.js +97 -97
  81. package/esm2015/lib/components/statusbar/statusbar.component.js +81 -81
  82. package/esm2015/lib/components/statusbar/statusbar.module.js +27 -27
  83. package/esm2015/lib/components/stock/components/allocation-stock-history/allocation-stock-history.component.js +47 -47
  84. package/esm2015/lib/components/stock/components/order-commission-stock-history/order-commission-stock-history.component.js +47 -47
  85. package/esm2015/lib/components/stock/components/order-stock-history/order-stock-history.component.js +47 -47
  86. package/esm2015/lib/components/stock/components/order-stock-tab/order-stock-tab.component.js +47 -47
  87. package/esm2015/lib/components/stock/components/order-supply-stock-history/order-supply-stock-history.component.js +47 -47
  88. package/esm2015/lib/components/stock/components/order-tab/order-tab.component.js +67 -67
  89. package/esm2015/lib/components/stock/components/stock-history/stock-history.component.js +53 -53
  90. package/esm2015/lib/components/stock/components/stock-location/stock-location.component.js +251 -240
  91. package/esm2015/lib/components/stock/components/stock-prognose/stock-prognose.component.js +52 -52
  92. package/esm2015/lib/components/stock/components/stock-tab/stock-tab.component.js +39 -41
  93. package/esm2015/lib/components/stock/localization/translation.js +70 -63
  94. package/esm2015/lib/components/stock/stock-history-tabs/stock-history-tabs.component.js +33 -33
  95. package/esm2015/lib/components/stock/stock-information/stock-information.component.js +49 -48
  96. package/esm2015/lib/components/stock/stock-information-grid/stock-information-grid.component.js +457 -457
  97. package/esm2015/lib/components/stock/stock-tabs/stock-tabs.component.js +243 -241
  98. package/esm2015/lib/components/stock/stock-transfer/co-drop-down-list-fields.interface.js +2 -2
  99. package/esm2015/lib/components/stock/stock-transfer/stock-change-amount.component.js +72 -72
  100. package/esm2015/lib/components/stock/stock-transfer/stock-transfer.component.js +160 -149
  101. package/esm2015/lib/components/stock/stock.component.js +238 -193
  102. package/esm2015/lib/components/stock/stock.module.js +80 -80
  103. package/esm2015/lib/components/stock-statusbar/stock-statusbar.component.js +23 -23
  104. package/esm2015/lib/components/stock-statusbar/stock-statusbar.module.js +19 -19
  105. package/esm2015/lib/components/tab-bar/tab-bar.component.js +90 -88
  106. package/esm2015/lib/components/tab-bar/tab-bar.module.js +21 -21
  107. package/esm2015/lib/components/tab-bar/tab.interface.js +2 -2
  108. package/esm2015/lib/components/tile-renderer/tile-render.component.js +80 -80
  109. package/esm2015/lib/components/tile-renderer/tile-render.module.js +26 -26
  110. package/esm2015/lib/decorator/input-boolean.decorator.js +34 -34
  111. package/esm2015/lib/enum/calendar-view.enum.js +9 -9
  112. package/esm2015/lib/enum/document-email-report.enum.js +18 -18
  113. package/esm2015/lib/enum/domain-multiple-name.enum.js +13 -13
  114. package/esm2015/lib/enum/file-type.js +14 -14
  115. package/esm2015/lib/enum/files-upload-config-objects.js +3 -3
  116. package/esm2015/lib/enum/gauge-color.enum.js +10 -10
  117. package/esm2015/lib/enum/icon.enum.js +48 -44
  118. package/esm2015/lib/enum/internal-param.enum.js +38 -38
  119. package/esm2015/lib/enum/keyboard-code.enum.js +32 -32
  120. package/esm2015/lib/enum/language-code.enum.js +8 -8
  121. package/esm2015/lib/enum/month.enum.js +17 -17
  122. package/esm2015/lib/enum/read-write-access-config-names.enum.js +2 -2
  123. package/esm2015/lib/enum/table-name.enum.js +86 -86
  124. package/esm2015/lib/enum/tag-category.enum.js +22 -22
  125. package/esm2015/lib/enum/tags-component-config-names.js +2 -2
  126. package/esm2015/lib/enum/thumb-three-way-state.js +19 -19
  127. package/esm2015/lib/enum/tile-size-type.js +7 -7
  128. package/esm2015/lib/enum/time-period.enum.js +11 -11
  129. package/esm2015/lib/event/co-drag-event.js +2 -2
  130. package/esm2015/lib/event/co-drop-event.js +2 -2
  131. package/esm2015/lib/interface/key-value-pair.js +2 -2
  132. package/esm2015/lib/interface/operation-callback-simple-function.js +4 -4
  133. package/esm2015/lib/localization/localization.module.js +19 -19
  134. package/esm2015/lib/localization/localize.pipe.js +26 -26
  135. package/esm2015/lib/localization/localize.service.js +30 -30
  136. package/esm2015/lib/localization/translation.js +3 -3
  137. package/esm2015/lib/model/agenda-event-per-day.model.js +6 -6
  138. package/esm2015/lib/model/agenda-event.model.js +8 -8
  139. package/esm2015/lib/model/agenda-null-objects.js +11 -11
  140. package/esm2015/lib/model/constant/all-months.js +17 -17
  141. package/esm2015/lib/model/date-range.js +5 -5
  142. package/esm2015/lib/model/day.model.js +7 -7
  143. package/esm2015/lib/model/icon-svg.js +47 -43
  144. package/esm2015/lib/model/month.model.js +11 -11
  145. package/esm2015/lib/model/send-method.js +8 -8
  146. package/esm2015/lib/model/settings.js +4 -4
  147. package/esm2015/lib/model/tag-tree-item.bo.js +16 -16
  148. package/esm2015/lib/model/time-window.bo.js +26 -26
  149. package/esm2015/lib/model/tree-object.js +15 -15
  150. package/esm2015/lib/model/week.model.js +6 -6
  151. package/esm2015/lib/model/weekday.model.js +10 -10
  152. package/esm2015/lib/pipe/array-number.pipe.js +15 -15
  153. package/esm2015/lib/pipe/file-type-image.pipe.js +51 -51
  154. package/esm2015/lib/pipe/master-pipes.js +9 -9
  155. package/esm2015/lib/pipe/ucfirst.pipe.js +16 -16
  156. package/esm2015/lib/service/dictionary.service.js +76 -76
  157. package/esm2015/lib/service/drag-drop.service.js +365 -365
  158. package/esm2015/lib/service/icon-cache.service.js +51 -51
  159. package/esm2015/lib/service/options.service.js +48 -48
  160. package/esm2015/lib/service/shared-connector.service.js +433 -433
  161. package/esm2015/lib/service/shared.service.js +60 -60
  162. package/esm2015/lib/service/stock.service.js +110 -110
  163. package/esm2015/lib/utils/array-utils.js +202 -202
  164. package/esm2015/lib/utils/calendar.utils.js +68 -68
  165. package/esm2015/lib/utils/check-precision-and-scale-result.js +2 -2
  166. package/esm2015/lib/utils/check-within-stepped-bounds-result.js +2 -2
  167. package/esm2015/lib/utils/co-document-shared-field-logic.js +50 -50
  168. package/esm2015/lib/utils/date-utils.js +264 -264
  169. package/esm2015/lib/utils/enum-utils.js +128 -128
  170. package/esm2015/lib/utils/function/not-nill.function.js +5 -5
  171. package/esm2015/lib/utils/is-nill.function.js +5 -5
  172. package/esm2015/lib/utils/map-utils.js +41 -41
  173. package/esm2015/lib/utils/number-utils.js +390 -390
  174. package/esm2015/lib/utils/object-utils.js +278 -278
  175. package/esm2015/lib/utils/ref-code-utils.js +49 -49
  176. package/esm2015/lib/utils/string-utils.js +93 -93
  177. package/esm2015/public-api.js +31 -31
  178. package/favicon.ico +0 -0
  179. package/fesm2015/colijnit-sharedcomponents.js +10410 -10328
  180. package/fesm2015/colijnit-sharedcomponents.js.map +1 -1
  181. package/index.html +12 -0
  182. package/lib/assets/dictionary/text.properties.d.ts +3 -3
  183. package/lib/businessobject/build-images-and-documentation-result.d.ts +5 -5
  184. package/lib/businessobject/co-document-right.bo.d.ts +6 -6
  185. package/lib/businessobject/drag-drop-container-element.d.ts +6 -6
  186. package/lib/businessobject/drag-drop-container.d.ts +6 -6
  187. package/lib/components/access/read-write-access.scss +25 -25
  188. package/lib/components/access/style/_layout.scss +23 -23
  189. package/lib/components/access/style/_material-definition.scss +12 -12
  190. package/lib/components/access/style/_theme.scss +4 -4
  191. package/lib/components/access/style/material.scss +4 -4
  192. package/lib/components/activity-list/activity-list.component.d.ts +33 -33
  193. package/lib/components/activity-list/activity-list.module.d.ts +2 -2
  194. package/lib/components/activity-list/style/_layout.scss +68 -68
  195. package/lib/components/activity-list/style/_theme.scss +4 -4
  196. package/lib/components/activity-list/style/material.scss +4 -4
  197. package/lib/components/app-file-dropzone/app-file-dropzone.component.d.ts +14 -14
  198. package/lib/components/app-file-dropzone/app-file-dropzone.module.d.ts +2 -2
  199. package/lib/components/app-file-dropzone/style/_layout.scss +61 -61
  200. package/lib/components/app-file-dropzone/style/_theme.scss +4 -4
  201. package/lib/components/app-file-dropzone/style/material.scss +4 -4
  202. package/lib/components/date-planning/component/agenda/agenda-base-view.component.d.ts +21 -21
  203. package/lib/components/date-planning/component/agenda/agenda-day-view.component.d.ts +7 -7
  204. package/lib/components/date-planning/component/agenda/agenda-event.component.d.ts +18 -18
  205. package/lib/components/date-planning/component/agenda/agenda-events.component.d.ts +13 -13
  206. package/lib/components/date-planning/component/agenda/agenda-half-hour-cell.component.d.ts +18 -18
  207. package/lib/components/date-planning/component/agenda/agenda-header.component.d.ts +48 -48
  208. package/lib/components/date-planning/component/agenda/agenda-hour-cell.component.d.ts +9 -9
  209. package/lib/components/date-planning/component/agenda/agenda-hour-view-labels.component.d.ts +8 -8
  210. package/lib/components/date-planning/component/agenda/agenda-hour-view.component.d.ts +7 -7
  211. package/lib/components/date-planning/component/agenda/agenda-month-view.component.d.ts +10 -10
  212. package/lib/components/date-planning/component/agenda/agenda-select-event.component.d.ts +12 -12
  213. package/lib/components/date-planning/component/agenda/agenda-view.component.d.ts +12 -12
  214. package/lib/components/date-planning/component/agenda/agenda-week-select-view.component.d.ts +10 -10
  215. package/lib/components/date-planning/component/agenda/agenda-week-view.component.d.ts +9 -9
  216. package/lib/components/date-planning/component/agenda/style/_layout.scss +443 -443
  217. package/lib/components/date-planning/component/agenda/style/_material-definition.scss +12 -12
  218. package/lib/components/date-planning/component/agenda/style/_theme.scss +7 -7
  219. package/lib/components/date-planning/component/agenda/style/material.scss +5 -5
  220. package/lib/components/date-planning/component/agenda/view-select.component.d.ts +11 -11
  221. package/lib/components/date-planning/component/calendar/calendar-all-months.component.d.ts +9 -9
  222. package/lib/components/date-planning/component/calendar/calendar-all-years.component.d.ts +9 -9
  223. package/lib/components/date-planning/component/calendar/calendar-header.component.d.ts +23 -23
  224. package/lib/components/date-planning/component/calendar/calendar-view.component.d.ts +31 -31
  225. package/lib/components/date-planning/component/calendar/calendar.component.d.ts +10 -10
  226. package/lib/components/date-planning/component/calendar/style/_layout.scss +167 -167
  227. package/lib/components/date-planning/component/calendar/style/_material-definition.scss +7 -7
  228. package/lib/components/date-planning/component/calendar/style/_theme.scss +7 -7
  229. package/lib/components/date-planning/component/calendar/style/material.scss +5 -5
  230. package/lib/components/date-planning/date-planning.component.d.ts +28 -28
  231. package/lib/components/date-planning/date-planning.module.d.ts +2 -2
  232. package/lib/components/date-planning/style/_layout.scss +45 -45
  233. package/lib/components/date-planning/style/_theme.scss +5 -5
  234. package/lib/components/date-planning/style/material.scss +7 -7
  235. package/lib/components/docsign/component/signature/signature.component.d.ts +16 -16
  236. package/lib/components/docsign/component/signature/style/_layout.scss +40 -40
  237. package/lib/components/docsign/component/signature/style/_material-definition.scss +11 -11
  238. package/lib/components/docsign/component/signature/style/_theme.scss +13 -13
  239. package/lib/components/docsign/component/signature/style/material.scss +4 -4
  240. package/lib/components/docsign/component/signatures/signatures.component.d.ts +12 -12
  241. package/lib/components/docsign/component/signatures/style/_layout.scss +13 -13
  242. package/lib/components/docsign/component/signatures/style/_material-definition.scss +1 -1
  243. package/lib/components/docsign/component/signatures/style/_theme.scss +4 -4
  244. package/lib/components/docsign/component/signatures/style/material.scss +5 -5
  245. package/lib/components/docsign/docsign.component.d.ts +94 -94
  246. package/lib/components/docsign/docsign.module.d.ts +2 -2
  247. package/lib/components/docsign/style/_layout.scss +40 -40
  248. package/lib/components/docsign/style/_material-definition.scss +12 -12
  249. package/lib/components/docsign/style/_theme.scss +12 -12
  250. package/lib/components/docsign/style/material.scss +15 -15
  251. package/lib/components/file-upload/file-upload.component.d.ts +42 -42
  252. package/lib/components/file-upload/file-upload.module.d.ts +2 -2
  253. package/lib/components/file-upload/style/_layout.scss +59 -59
  254. package/lib/components/file-upload/style/_material-definition.scss +2 -2
  255. package/lib/components/file-upload/style/_theme.scss +4 -4
  256. package/lib/components/file-upload/style/material.scss +4 -4
  257. package/lib/components/file-upload-popup/file-upload-popup.component.d.ts +75 -75
  258. package/lib/components/file-upload-popup/file-upload-popup.module.d.ts +2 -2
  259. package/lib/components/file-upload-popup/style/_layout.scss +48 -48
  260. package/lib/components/file-upload-popup/style/_material-definition.scss +2 -2
  261. package/lib/components/file-upload-popup/style/_theme.scss +5 -5
  262. package/lib/components/file-upload-popup/style/material.scss +4 -4
  263. package/lib/components/files-upload/components/base-file-upload.component.d.ts +98 -98
  264. package/lib/components/files-upload/components/drag-drop-container.component.d.ts +34 -34
  265. package/lib/components/files-upload/files-upload.component.d.ts +32 -32
  266. package/lib/components/files-upload/files-upload.module.d.ts +2 -2
  267. package/lib/components/files-upload/style/_layout.scss +49 -49
  268. package/lib/components/files-upload/style/_theme.scss +5 -5
  269. package/lib/components/files-upload/style/material.scss +4 -4
  270. package/lib/components/image-display/image-display.component.d.ts +14 -14
  271. package/lib/components/image-display/image-display.module.d.ts +2 -2
  272. package/lib/components/image-display/style/_layout.scss +56 -56
  273. package/lib/components/image-display/style/_material-definition.scss +4 -4
  274. package/lib/components/image-display/style/_theme.scss +6 -6
  275. package/lib/components/image-display/style/material.scss +3 -3
  276. package/lib/components/key-pad/key-pad.component.d.ts +38 -38
  277. package/lib/components/key-pad/key-pad.module.d.ts +2 -2
  278. package/lib/components/key-pad/style/_layout.scss +160 -160
  279. package/lib/components/key-pad/style/_material-definition.scss +19 -19
  280. package/lib/components/key-pad/style/_theme.scss +35 -35
  281. package/lib/components/key-pad/style/material.scss +4 -4
  282. package/lib/components/layout-switcher/layout-switcher.component.d.ts +16 -16
  283. package/lib/components/layout-switcher/layout-switcher.module.d.ts +2 -2
  284. package/lib/components/layout-switcher/style/_layout.scss +94 -94
  285. package/lib/components/layout-switcher/style/_material-definition.scss +16 -16
  286. package/lib/components/layout-switcher/style/_theme.scss +4 -4
  287. package/lib/components/layout-switcher/style/material.scss +6 -6
  288. package/lib/components/linear-gauge/co-linear-gauge.component.d.ts +11 -11
  289. package/lib/components/linear-gauge/co-linear-gauge.module.d.ts +2 -2
  290. package/lib/components/linear-gauge/style/_layout.scss +20 -20
  291. package/lib/components/linear-gauge/style/_material-definition.scss +8 -8
  292. package/lib/components/linear-gauge/style/_theme.scss +4 -4
  293. package/lib/components/linear-gauge/style/material.scss +6 -6
  294. package/lib/components/login/style/_layout.scss +57 -57
  295. package/lib/components/login/style/_material-definition.scss +23 -23
  296. package/lib/components/login/style/_theme.scss +7 -7
  297. package/lib/components/login/style/material.scss +4 -4
  298. package/lib/components/multi-property-toggler/multiple-property-toggler.component.d.ts +27 -27
  299. package/lib/components/multi-property-toggler/multiple-property-toggler.module.d.ts +2 -2
  300. package/lib/components/multi-property-toggler/style/_layout.scss +24 -24
  301. package/lib/components/multi-property-toggler/style/_theme.scss +4 -4
  302. package/lib/components/multi-property-toggler/style/material.scss +4 -4
  303. package/lib/components/screen-config-generator/style/_layout.scss +95 -95
  304. package/lib/components/screen-config-generator/style/_theme.scss +4 -4
  305. package/lib/components/screen-config-generator/style/material.scss +4 -4
  306. package/lib/components/send-method-dialog/components/layout-selection/layout-selection.component.d.ts +19 -19
  307. package/lib/components/send-method-dialog/components/layout-selection/layout-selection.module.d.ts +2 -2
  308. package/lib/components/send-method-dialog/components/layout-selection/style/_layout.scss +44 -44
  309. package/lib/components/send-method-dialog/components/layout-selection/style/_material-definition.scss +19 -19
  310. package/lib/components/send-method-dialog/components/layout-selection/style/_theme.scss +17 -17
  311. package/lib/components/send-method-dialog/components/layout-selection/style/material.scss +4 -4
  312. package/lib/components/send-method-dialog/components/printer-selection/printer-selection.component.d.ts +19 -19
  313. package/lib/components/send-method-dialog/components/printer-selection/printer-selection.module.d.ts +2 -2
  314. package/lib/components/send-method-dialog/components/printer-selection/style/_layout.scss +69 -69
  315. package/lib/components/send-method-dialog/components/printer-selection/style/_material-definition.scss +37 -37
  316. package/lib/components/send-method-dialog/components/printer-selection/style/_theme.scss +23 -23
  317. package/lib/components/send-method-dialog/components/printer-selection/style/material.scss +4 -4
  318. package/lib/components/send-method-dialog/components/send-method-email/send-method-email.component.d.ts +14 -14
  319. package/lib/components/send-method-dialog/components/send-method-email/send-method-email.module.d.ts +2 -2
  320. package/lib/components/send-method-dialog/components/send-method-email/style/_layout.scss +29 -29
  321. package/lib/components/send-method-dialog/components/send-method-email/style/_material-definition.scss +8 -8
  322. package/lib/components/send-method-dialog/components/send-method-email/style/_theme.scss +5 -5
  323. package/lib/components/send-method-dialog/components/send-method-email/style/material.scss +4 -4
  324. package/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.component.d.ts +8 -8
  325. package/lib/components/send-method-dialog/components/send-method-pdf/send-method-pdf.module.d.ts +2 -2
  326. package/lib/components/send-method-dialog/components/send-method-pdf/style/_layout.scss +25 -25
  327. package/lib/components/send-method-dialog/components/send-method-pdf/style/_material-definition.scss +5 -5
  328. package/lib/components/send-method-dialog/components/send-method-pdf/style/_theme.scss +5 -5
  329. package/lib/components/send-method-dialog/components/send-method-pdf/style/material.scss +4 -4
  330. package/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.component.d.ts +13 -13
  331. package/lib/components/send-method-dialog/components/send-method-printer/send-method-printer.module.d.ts +2 -2
  332. package/lib/components/send-method-dialog/components/send-method-printer/style/_layout.scss +30 -30
  333. package/lib/components/send-method-dialog/components/send-method-printer/style/_material-definition.scss +5 -5
  334. package/lib/components/send-method-dialog/components/send-method-printer/style/_theme.scss +5 -5
  335. package/lib/components/send-method-dialog/components/send-method-printer/style/material.scss +4 -4
  336. package/lib/components/send-method-dialog/components/signature-button/signature-button.component.d.ts +12 -12
  337. package/lib/components/send-method-dialog/components/signature-button/signature-button.module.d.ts +2 -2
  338. package/lib/components/send-method-dialog/components/signature-button/style/_layout.scss +28 -28
  339. package/lib/components/send-method-dialog/components/signature-button/style/_material-definition.scss +8 -8
  340. package/lib/components/send-method-dialog/components/signature-button/style/_theme.scss +4 -4
  341. package/lib/components/send-method-dialog/components/signature-button/style/material.scss +4 -4
  342. package/lib/components/send-method-dialog/model/email-address-viewmodel.d.ts +5 -5
  343. package/lib/components/send-method-dialog/send-method-dialog.component.d.ts +71 -71
  344. package/lib/components/send-method-dialog/send-method-dialog.module.d.ts +2 -2
  345. package/lib/components/send-method-dialog/send-method-params.interface.d.ts +13 -13
  346. package/lib/components/send-method-dialog/service/send-method.service.d.ts +23 -23
  347. package/lib/components/send-method-dialog/style/_layout.scss +165 -165
  348. package/lib/components/send-method-dialog/style/_material-definition.scss +48 -48
  349. package/lib/components/send-method-dialog/style/_theme.scss +33 -33
  350. package/lib/components/send-method-dialog/style/material.scss +10 -10
  351. package/lib/components/simple-tags/simple-tags.component.d.ts +31 -31
  352. package/lib/components/simple-tags/simple-tags.module.d.ts +2 -2
  353. package/lib/components/simple-tags/style/_layout.scss +272 -272
  354. package/lib/components/simple-tags/style/_material-definition.scss +39 -39
  355. package/lib/components/simple-tags/style/_theme.scss +4 -4
  356. package/lib/components/simple-tags/style/material.scss +4 -4
  357. package/lib/components/statusbar/statusbar-popup.component.d.ts +21 -21
  358. package/lib/components/statusbar/statusbar.component.d.ts +26 -26
  359. package/lib/components/statusbar/statusbar.module.d.ts +2 -2
  360. package/lib/components/statusbar/style/_layout.scss +70 -70
  361. package/lib/components/statusbar/style/_material-definition.scss +23 -23
  362. package/lib/components/statusbar/style/_theme.scss +13 -13
  363. package/lib/components/statusbar/style/material.scss +5 -5
  364. package/lib/components/stock/components/allocation-stock-history/allocation-stock-history.component.d.ts +9 -9
  365. package/lib/components/stock/components/order-commission-stock-history/order-commission-stock-history.component.d.ts +9 -9
  366. package/lib/components/stock/components/order-stock-history/order-stock-history.component.d.ts +9 -9
  367. package/lib/components/stock/components/order-stock-tab/order-stock-tab.component.d.ts +11 -11
  368. package/lib/components/stock/components/order-supply-stock-history/order-supply-stock-history.component.d.ts +9 -9
  369. package/lib/components/stock/components/order-tab/order-tab.component.d.ts +20 -20
  370. package/lib/components/stock/components/stock-history/stock-history.component.d.ts +13 -13
  371. package/lib/components/stock/components/stock-location/stock-location.component.d.ts +52 -50
  372. package/lib/components/stock/components/stock-prognose/stock-prognose.component.d.ts +11 -11
  373. package/lib/components/stock/components/stock-tab/stock-tab.component.d.ts +7 -9
  374. package/lib/components/stock/localization/translation.d.ts +67 -60
  375. package/lib/components/stock/stock-history-tabs/stock-history-tabs.component.d.ts +7 -7
  376. package/lib/components/stock/stock-information/stock-information.component.d.ts +9 -8
  377. package/lib/components/stock/stock-information-grid/stock-information-grid.component.d.ts +75 -75
  378. package/lib/components/stock/stock-tabs/stock-tabs.component.d.ts +56 -56
  379. package/lib/components/stock/stock-transfer/co-drop-down-list-fields.interface.d.ts +4 -4
  380. package/lib/components/stock/stock-transfer/stock-change-amount.component.d.ts +18 -18
  381. package/lib/components/stock/stock-transfer/stock-transfer.component.d.ts +38 -42
  382. package/lib/components/stock/stock.component.d.ts +64 -57
  383. package/lib/components/stock/stock.module.d.ts +2 -2
  384. package/lib/components/stock/style/_layout.scss +421 -286
  385. package/lib/components/stock/style/_material-definition.scss +25 -25
  386. package/lib/components/stock/style/_theme.scss +5 -5
  387. package/lib/components/stock/style/material.scss +4 -4
  388. package/lib/components/stock-statusbar/stock-statusbar.component.d.ts +4 -4
  389. package/lib/components/stock-statusbar/stock-statusbar.module.d.ts +2 -2
  390. package/lib/components/stock-statusbar/style/_layout.scss +24 -24
  391. package/lib/components/stock-statusbar/style/material.scss +4 -4
  392. package/lib/components/tab-bar/style/_layout.scss +78 -78
  393. package/lib/components/tab-bar/style/_material-definition.scss +6 -6
  394. package/lib/components/tab-bar/style/material.scss +4 -4
  395. package/lib/components/tab-bar/tab-bar.component.d.ts +21 -21
  396. package/lib/components/tab-bar/tab-bar.module.d.ts +2 -2
  397. package/lib/components/tab-bar/tab.interface.d.ts +5 -5
  398. package/lib/components/tags/component/style/_layout.scss +67 -67
  399. package/lib/components/tags/component/style/_material-definition.scss +1 -1
  400. package/lib/components/tags/component/style/_theme.scss +8 -8
  401. package/lib/components/tags/component/style/material.scss +3 -3
  402. package/lib/components/tags/component/tag-join-label/style/_layout.scss +97 -97
  403. package/lib/components/tags/component/tag-join-label/style/_material-definition.scss +4 -4
  404. package/lib/components/tags/component/tag-join-label/style/_theme.scss +8 -8
  405. package/lib/components/tags/component/tag-join-label/style/material.scss +3 -3
  406. package/lib/components/tile-renderer/style/_layout.scss +90 -90
  407. package/lib/components/tile-renderer/style/_theme.scss +4 -4
  408. package/lib/components/tile-renderer/style/material.scss +4 -4
  409. package/lib/components/tile-renderer/tile-render.component.d.ts +31 -31
  410. package/lib/components/tile-renderer/tile-render.module.d.ts +2 -2
  411. package/lib/decorator/input-boolean.decorator.d.ts +8 -8
  412. package/lib/enum/calendar-view.enum.d.ts +7 -7
  413. package/lib/enum/document-email-report.enum.d.ts +15 -15
  414. package/lib/enum/domain-multiple-name.enum.d.ts +10 -10
  415. package/lib/enum/file-type.d.ts +7 -7
  416. package/lib/enum/files-upload-config-objects.d.ts +22 -22
  417. package/lib/enum/gauge-color.enum.d.ts +8 -8
  418. package/lib/enum/icon.enum.d.ts +46 -42
  419. package/lib/enum/internal-param.enum.d.ts +34 -34
  420. package/lib/enum/keyboard-code.enum.d.ts +30 -30
  421. package/lib/enum/language-code.enum.d.ts +6 -6
  422. package/lib/enum/month.enum.d.ts +14 -14
  423. package/lib/enum/read-write-access-config-names.enum.d.ts +4 -4
  424. package/lib/enum/table-name.enum.d.ts +84 -84
  425. package/lib/enum/tag-category.enum.d.ts +19 -19
  426. package/lib/enum/tags-component-config-names.d.ts +4 -4
  427. package/lib/enum/thumb-three-way-state.d.ts +6 -6
  428. package/lib/enum/tile-size-type.d.ts +4 -4
  429. package/lib/enum/time-period.enum.d.ts +8 -8
  430. package/lib/event/co-drag-event.d.ts +5 -5
  431. package/lib/event/co-drop-event.d.ts +8 -8
  432. package/lib/interface/key-value-pair.d.ts +4 -4
  433. package/lib/interface/operation-callback-simple-function.d.ts +4 -4
  434. package/lib/localization/localization.module.d.ts +2 -2
  435. package/lib/localization/localize.pipe.d.ts +7 -7
  436. package/lib/localization/localize.service.d.ts +7 -7
  437. package/lib/localization/translation.d.ts +2 -2
  438. package/lib/model/agenda-event-per-day.model.d.ts +5 -5
  439. package/lib/model/agenda-event.model.d.ts +17 -17
  440. package/lib/model/agenda-null-objects.d.ts +10 -10
  441. package/lib/model/constant/all-months.d.ts +2 -2
  442. package/lib/model/date-range.d.ts +7 -7
  443. package/lib/model/day.model.d.ts +8 -8
  444. package/lib/model/icon-svg.d.ts +4 -4
  445. package/lib/model/month.model.d.ts +5 -5
  446. package/lib/model/send-method.d.ts +7 -7
  447. package/lib/model/settings.d.ts +3 -3
  448. package/lib/model/tag-tree-item.bo.d.ts +18 -18
  449. package/lib/model/time-window.bo.d.ts +13 -13
  450. package/lib/model/tree-object.d.ts +8 -8
  451. package/lib/model/week.model.d.ts +4 -4
  452. package/lib/model/weekday.model.d.ts +16 -16
  453. package/lib/pipe/array-number.pipe.d.ts +4 -4
  454. package/lib/pipe/file-type-image.pipe.d.ts +12 -12
  455. package/lib/pipe/master-pipes.d.ts +1 -1
  456. package/lib/pipe/ucfirst.pipe.d.ts +4 -4
  457. package/lib/service/dictionary.service.d.ts +21 -21
  458. package/lib/service/drag-drop.service.d.ts +86 -86
  459. package/lib/service/icon-cache.service.d.ts +18 -18
  460. package/lib/service/options.service.d.ts +13 -13
  461. package/lib/service/shared-connector.service.d.ts +55 -55
  462. package/lib/service/shared.service.d.ts +18 -18
  463. package/lib/service/stock.service.d.ts +41 -41
  464. package/lib/style/_mixin.scss +14 -14
  465. package/lib/style/_variables.scss +21 -21
  466. package/lib/style/sharedcomponents-globals.scss +10 -10
  467. package/lib/utils/array-utils.d.ts +63 -63
  468. package/lib/utils/calendar.utils.d.ts +10 -10
  469. package/lib/utils/check-precision-and-scale-result.d.ts +4 -4
  470. package/lib/utils/check-within-stepped-bounds-result.d.ts +8 -8
  471. package/lib/utils/co-document-shared-field-logic.d.ts +7 -7
  472. package/lib/utils/date-utils.d.ts +44 -44
  473. package/lib/utils/enum-utils.d.ts +31 -31
  474. package/lib/utils/function/not-nill.function.d.ts +1 -1
  475. package/lib/utils/is-nill.function.d.ts +1 -1
  476. package/lib/utils/map-utils.d.ts +16 -16
  477. package/lib/utils/number-utils.d.ts +125 -125
  478. package/lib/utils/object-utils.d.ts +40 -40
  479. package/lib/utils/ref-code-utils.d.ts +10 -10
  480. package/lib/utils/string-utils.d.ts +38 -38
  481. package/main.b63cf8c6791cb3e37f3c.js +1 -0
  482. package/package.json +1 -1
  483. package/polyfills.907fe9d1887c5de17993.js +1 -0
  484. package/public-api.d.ts +27 -27
  485. package/runtime.8aac21847ed3d3829cca.js +1 -0
  486. package/styles.6807e7b997183dacbe3b.css +1 -0
@@ -1,202 +1,202 @@
1
- import { ObjectUtils } from "./object-utils";
2
- import { NumberUtils } from "./number-utils";
3
- import { isNill } from "./is-nill.function";
4
- import { notNill } from "./function/not-nill.function";
5
- export class ArrayUtils {
6
- /**
7
- * Returns whether at least one element in given array could be found by given finder function.
8
- *
9
- * @param {T[]} array
10
- * @param {(element: T) => boolean} finder A finder function that takes an element of the array and returns a boolean that represents
11
- * the 'found status' for that element; whether it should have been found or not.
12
- */
13
- static ContainsAnElementFoundBy(array, finder) {
14
- if (!array || !finder) {
15
- return false;
16
- }
17
- return notNill(this.Find(array, finder));
18
- }
19
- /**
20
- * Cross-browser Array.find() function. Returns the first item in given array for which the foundBy function returns true. Returns
21
- * undefined when none was found.
22
- *
23
- * Example usage:
24
- * const foundItem: BusinessObject = ArrayUtils.Find<BusinessObject>(modelArray, (modelItem: BusinessObject) => <br>
25
- * (return modelItem.getId() === '1')
26
- * * });
27
- *
28
- * @param array The array with items to search in.
29
- * @param foundBy The finder function applied on each items of the array, when that returns true, the item is considered found.
30
- */
31
- static Find(array, foundBy) {
32
- if (!array || !foundBy) {
33
- return undefined;
34
- }
35
- for (let i = 0, len = array.length; i < len; i++) {
36
- const itemCur = array[i];
37
- if (foundBy(itemCur)) {
38
- return itemCur;
39
- }
40
- }
41
- return undefined;
42
- }
43
- // @returns empty array when nothing found, otherwise array with found items
44
- static FindAll(array, foundBy) {
45
- const answer = [];
46
- if (!array || !foundBy) {
47
- return answer;
48
- }
49
- for (let i = 0, len = array.length; i < len; i++) {
50
- const itemCur = array[i];
51
- if (foundBy(itemCur)) {
52
- answer.push(itemCur);
53
- }
54
- }
55
- return answer;
56
- }
57
- // returns a simple clone of given array, using array.slice(0)
58
- static CloneArray(array) {
59
- let answer = [];
60
- if (array) {
61
- answer = array.slice(0);
62
- }
63
- return answer;
64
- }
65
- /**
66
- * Returns a 'semi deep clone' of given array. Its first-level members are object-shallow-cloned (optionally with a strongly typed constructor),
67
- * or just as plain object (see param arrayItemsClass).
68
- * @param array
69
- * @param arrayItemsClass If provided, the cloned array's first-level items will be strongly typed to / constructed as this class. Otherwise
70
- * it'll be a plain object.
71
- * @param deepClone Set to true if array items contain FUNCTIONS that need to be cloned..
72
- * @returns {Array} semi-deep clone of given array
73
- */
74
- static CloneArrayAndItsItems(array, arrayItemsClass, deepClone = false) {
75
- const cloneArray = [];
76
- if (array) {
77
- for (let i = 0, len = array.length; i < len; i++) {
78
- if (deepClone) {
79
- cloneArray.push(ObjectUtils.GetDeepClone(array[i]));
80
- }
81
- else {
82
- cloneArray.push(ObjectUtils.GetShallowClone(array[i], arrayItemsClass));
83
- }
84
- }
85
- }
86
- else {
87
- return [];
88
- }
89
- return cloneArray;
90
- }
91
- /**
92
- * Removes element at given index from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really
93
- * removes the element using splice().
94
- *
95
- * @param {number} index
96
- * @param {any[]} array in-out
97
- * @returns {boolean} True if and only if the element on given index is succesfully removed from given array.
98
- */
99
- static RemoveElementAtIndex(index, array) {
100
- if (NumberUtils.IsNaN(index) || index < 0 || !Array.isArray(array) || array.length === 0) {
101
- return false;
102
- }
103
- if (index in array) {
104
- array.splice(index, 1);
105
- return true;
106
- }
107
- else {
108
- return false;
109
- }
110
- }
111
- /**
112
- * Removes given element from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really removes the
113
- * element using splice(). Also works on associative arrays.
114
- *
115
- * @param {T} element The element to remove.
116
- * @param {T[]} array The array to remove the element from.
117
- * @returns {boolean} True iff given element was truly successfully removed from given array.
118
- */
119
- static RemoveElement(element, array) {
120
- if (!Array.isArray(array)) {
121
- return false;
122
- }
123
- const index = array.indexOf(element);
124
- return ArrayUtils.RemoveElementAtIndex(index, array);
125
- }
126
- // Checks if given array is defined, and is an array, and has length > 0, and, optionally checks that the first element is of type given clazz.
127
- static IsArrayWithElements(arrayToCheck, classItemsMustBeInstanceOf) {
128
- if (isNill(arrayToCheck)) {
129
- return false;
130
- }
131
- if (Array.isArray(arrayToCheck) && arrayToCheck.length > 0) {
132
- if (classItemsMustBeInstanceOf) {
133
- return arrayToCheck[0] instanceof classItemsMustBeInstanceOf;
134
- }
135
- else {
136
- return true;
137
- }
138
- }
139
- else {
140
- return false;
141
- }
142
- }
143
- // Removes all elements from given array for which given filter function holds true. Returns true if at least one removed, else false.
144
- static RemoveElementsByFilter(array, filterFunction) {
145
- if (!ArrayUtils.IsArrayWithElements(array) || !filterFunction) {
146
- return false;
147
- }
148
- let atLeastOneRemoved = false;
149
- const len = array.length;
150
- for (let i = len - 1; i >= 0; i--) {
151
- const item = array[i];
152
- if (filterFunction.call(this, item) === true) {
153
- array.splice(i, 1);
154
- atLeastOneRemoved = true;
155
- }
156
- }
157
- return atLeastOneRemoved;
158
- }
159
- static MoveElement(element, toIndex, array) {
160
- if (!Array.isArray(array) || isNill(toIndex)) {
161
- return false;
162
- }
163
- const fromIndex = array.indexOf(element);
164
- const toIndexCorrected = NumberUtils.GetNearestNumberWithinBounds(toIndex, 0, array.length - 1);
165
- if (fromIndex === -1 || array[toIndexCorrected] === element) {
166
- // element did not exist in given array, or already existed on given toIndex
167
- return false;
168
- }
169
- array.splice(toIndexCorrected, 0, array.splice(fromIndex, 1)[0]);
170
- return true;
171
- }
172
- // PRE: elements exists in given array. POST: given elementToPlace has a lower index than given afterThisElement. Array is in-out manipulated.
173
- static PlaceElementAfterOther(array, elementToPlace, afterThisElement) {
174
- if (array) {
175
- const afterThisElIdx = array.indexOf(afterThisElement);
176
- const elToPlaceIdx = array.indexOf(elementToPlace);
177
- if (afterThisElIdx >= elToPlaceIdx) {
178
- ArrayUtils.MoveElement(elementToPlace, afterThisElIdx + 1, array);
179
- }
180
- }
181
- }
182
- /**
183
- * Returns max value from all resulting values from applying given itemValueFunction to all items of given array.
184
- * @param array
185
- * @param itemValueFunction The function applied to each array item that gives it a numerical value. The max num val found is returned.
186
- */
187
- static GetMaxCalculatedValue(array, itemValueFunction) {
188
- if (!array || !itemValueFunction) {
189
- return NaN;
190
- }
191
- let max = undefined;
192
- const len = array.length;
193
- for (let i = 0; i < len; i++) {
194
- const valueCur = itemValueFunction.call(this);
195
- if (valueCur > max) {
196
- max = valueCur;
197
- }
198
- }
199
- return max;
200
- }
201
- }
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWRjb21wb25lbnRzL3NyYy9saWIvdXRpbHMvYXJyYXktdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRXJELE1BQU0sT0FBTyxVQUFVO0lBQ25COzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBSSxLQUFVLEVBQUUsTUFBK0I7UUFDakYsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUksS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBSSxLQUFVLEVBQUUsT0FBNkI7UUFDM0QsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNwQixPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUVELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLEdBQUcsR0FBVyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUQsTUFBTSxPQUFPLEdBQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFHO2dCQUNuQixPQUFPLE9BQU8sQ0FBQzthQUNsQjtT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LEtBQVUsRUFBRSxpQkFBc0M7UUFDdkYsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ2hDLE9BQU8sR0FBRyxDQUFDO1NBQ1o7UUFFRCxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUM7UUFFNUIsTUFBTSxHQUFHLEdBQVcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sUUFBUSxHQUFXLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RCxJQUFJLFFBQVEsR0FBRyxHQUFHLEVBQUU7Z0JBQ2xCLEdBQUcsR0FBRyxRQUFRLENBQUM7YUFDaEI7U0FDRjtRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4vb2JqZWN0LXV0aWxzXCI7XG5pbXBvcnQge051bWJlclV0aWxzfSBmcm9tIFwiLi9udW1iZXItdXRpbHNcIjtcbmltcG9ydCB7aXNOaWxsfSBmcm9tIFwiLi9pcy1uaWxsLmZ1bmN0aW9uXCI7XG5pbXBvcnQge25vdE5pbGx9IGZyb20gXCIuL2Z1bmN0aW9uL25vdC1uaWxsLmZ1bmN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBBcnJheVV0aWxzIHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gZ2l2ZW4gYXJyYXkgY291bGQgYmUgZm91bmQgYnkgZ2l2ZW4gZmluZGVyIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUW119IGFycmF5XG4gICAgICogQHBhcmFtIHsoZWxlbWVudDogVCkgPT4gYm9vbGVhbn0gZmluZGVyIEEgZmluZGVyIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gZWxlbWVudCBvZiB0aGUgYXJyYXkgYW5kIHJldHVybnMgYSBib29sZWFuIHRoYXQgcmVwcmVzZW50c1xuICAgICAqIHRoZSAnZm91bmQgc3RhdHVzJyBmb3IgdGhhdCBlbGVtZW50OyB3aGV0aGVyIGl0IHNob3VsZCBoYXZlIGJlZW4gZm91bmQgb3Igbm90LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgQ29udGFpbnNBbkVsZW1lbnRGb3VuZEJ5PFQ+KGFycmF5OiBUW10sIGZpbmRlcjogKGVsZW1lbnQ6IFQpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFhcnJheSB8fCAhZmluZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm90TmlsbCh0aGlzLkZpbmQ8VD4oYXJyYXksIGZpbmRlcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyb3NzLWJyb3dzZXIgQXJyYXkuZmluZCgpIGZ1bmN0aW9uLiBSZXR1cm5zIHRoZSBmaXJzdCBpdGVtIGluIGdpdmVuIGFycmF5IGZvciB3aGljaCB0aGUgZm91bmRCeSBmdW5jdGlvbiByZXR1cm5zIHRydWUuIFJldHVybnNcbiAgICAgKiB1bmRlZmluZWQgd2hlbiBub25lIHdhcyBmb3VuZC5cbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNhZ2U6XG4gICAgICogY29uc3QgZm91bmRJdGVtOiBCdXNpbmVzc09iamVjdCA9IEFycmF5VXRpbHMuRmluZDxCdXNpbmVzc09iamVjdD4obW9kZWxBcnJheSwgKG1vZGVsSXRlbTogQnVzaW5lc3NPYmplY3QpID0+IDxicj5cbiAgICAgKiAgICAgKHJldHVybiBtb2RlbEl0ZW0uZ2V0SWQoKSA9PT0gJzEnKVxuICAgICAqICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgd2l0aCBpdGVtcyB0byBzZWFyY2ggaW4uXG4gICAgICogQHBhcmFtIGZvdW5kQnkgVGhlIGZpbmRlciBmdW5jdGlvbiBhcHBsaWVkIG9uIGVhY2ggaXRlbXMgb2YgdGhlIGFycmF5LCB3aGVuIHRoYXQgcmV0dXJucyB0cnVlLCB0aGUgaXRlbSBpcyBjb25zaWRlcmVkIGZvdW5kLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgRmluZDxUPihhcnJheTogVFtdLCBmb3VuZEJ5OiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFQge1xuICAgICAgICBpZiAoIWFycmF5IHx8ICFmb3VuZEJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMCwgbGVuOiBudW1iZXIgPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUN1cjogVCA9IGFycmF5W2ldO1xuICAgICAgICAgICAgaWYgKGZvdW5kQnkoaXRlbUN1cikgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1DdXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBAcmV0dXJucyBlbXB0eSBhcnJheSB3aGVuIG5vdGhpbmcgZm91bmQsIG90aGVyd2lzZSBhcnJheSB3aXRoIGZvdW5kIGl0ZW1zXG4gICAgcHVibGljIHN0YXRpYyBGaW5kQWxsPFQ+KGFycmF5OiBUW10sIGZvdW5kQnk6IChpdGVtOiBUKSA9PiBib29sZWFuKTogVFtdIHtcbiAgICAgICAgY29uc3QgYW5zd2VyOiBUW10gPSBbXTtcbiAgICAgICAgaWYgKCFhcnJheSB8fCAhZm91bmRCeSkge1xuICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1DdXI6IFQgPSBhcnJheVtpXTtcbiAgICAgICAgICAgIGlmIChmb3VuZEJ5KGl0ZW1DdXIpKSB7XG4gICAgICAgICAgICAgICAgYW5zd2VyLnB1c2goaXRlbUN1cik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFuc3dlcjtcbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIGEgc2ltcGxlIGNsb25lIG9mIGdpdmVuIGFycmF5LCB1c2luZyBhcnJheS5zbGljZSgwKVxuICAgIHB1YmxpYyBzdGF0aWMgQ2xvbmVBcnJheTxUPihhcnJheTogVFtdKTogVFtdIHtcbiAgICAgICAgbGV0IGFuc3dlcjogVFtdID0gW107XG5cbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgICBhbnN3ZXIgPSBhcnJheS5zbGljZSgwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbnN3ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhICdzZW1pIGRlZXAgY2xvbmUnIG9mIGdpdmVuIGFycmF5LiBJdHMgZmlyc3QtbGV2ZWwgbWVtYmVycyBhcmUgb2JqZWN0LXNoYWxsb3ctY2xvbmVkIChvcHRpb25hbGx5IHdpdGggYSBzdHJvbmdseSB0eXBlZCBjb25zdHJ1Y3RvciksXG4gICAgICogb3IganVzdCBhcyBwbGFpbiBvYmplY3QgKHNlZSBwYXJhbSBhcnJheUl0ZW1zQ2xhc3MpLlxuICAgICAqIEBwYXJhbSBhcnJheVxuICAgICAqIEBwYXJhbSBhcnJheUl0ZW1zQ2xhc3MgSWYgcHJvdmlkZWQsIHRoZSBjbG9uZWQgYXJyYXkncyBmaXJzdC1sZXZlbCBpdGVtcyB3aWxsIGJlIHN0cm9uZ2x5IHR5cGVkIHRvIC8gY29uc3RydWN0ZWQgYXMgdGhpcyBjbGFzcy4gT3RoZXJ3aXNlXG4gICAgICogaXQnbGwgYmUgYSBwbGFpbiBvYmplY3QuXG4gICAgICogQHBhcmFtIGRlZXBDbG9uZSBTZXQgdG8gdHJ1ZSBpZiBhcnJheSBpdGVtcyBjb250YWluIEZVTkNUSU9OUyB0aGF0IG5lZWQgdG8gYmUgY2xvbmVkLi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHNlbWktZGVlcCBjbG9uZSBvZiBnaXZlbiBhcnJheVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgQ2xvbmVBcnJheUFuZEl0c0l0ZW1zPFQ+KGFycmF5OiBUW10sIGFycmF5SXRlbXNDbGFzcz86IGFueSwgZGVlcENsb25lOiBib29sZWFuID0gZmFsc2UpOiBUW10ge1xuICAgICAgICBjb25zdCBjbG9uZUFycmF5OiBUW10gPSBbXTtcblxuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVlcENsb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb25lQXJyYXkucHVzaChPYmplY3RVdGlscy5HZXREZWVwQ2xvbmUoYXJyYXlbaV0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjbG9uZUFycmF5LnB1c2goT2JqZWN0VXRpbHMuR2V0U2hhbGxvd0Nsb25lKGFycmF5W2ldLCBhcnJheUl0ZW1zQ2xhc3MpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2xvbmVBcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnQgYXQgZ2l2ZW4gaW5kZXggZnJvbSBnaXZlbiBhcnJheS4gRG9lc24ndCBqdXN0IHNldCBpdCB0byBudWxsIGxpa2UgSmF2YVNjcmlwdHMgc3RhbmRhcmQgJ2RlbGV0ZScgZG9lcywgYnV0IHJlYWxseVxuICAgICAqIHJlbW92ZXMgdGhlIGVsZW1lbnQgdXNpbmcgc3BsaWNlKCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBhcnJheSBpbi1vdXRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZWxlbWVudCBvbiBnaXZlbiBpbmRleCBpcyBzdWNjZXNmdWxseSByZW1vdmVkIGZyb20gZ2l2ZW4gYXJyYXkuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBSZW1vdmVFbGVtZW50QXRJbmRleChpbmRleDogbnVtYmVyLCBhcnJheTogYW55W10pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKE51bWJlclV0aWxzLklzTmFOKGluZGV4KSB8fCBpbmRleCA8IDAgfHwgIUFycmF5LmlzQXJyYXkoYXJyYXkpIHx8IGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4IGluIGFycmF5KSB7XG4gICAgICAgICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGdpdmVuIGVsZW1lbnQgZnJvbSBnaXZlbiBhcnJheS4gRG9lc24ndCBqdXN0IHNldCBpdCB0byBudWxsIGxpa2UgSmF2YVNjcmlwdHMgc3RhbmRhcmQgJ2RlbGV0ZScgZG9lcywgYnV0IHJlYWxseSByZW1vdmVzIHRoZVxuICAgICAqIGVsZW1lbnQgdXNpbmcgc3BsaWNlKCkuIEFsc28gd29ya3Mgb24gYXNzb2NpYXRpdmUgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUfSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge1RbXX0gYXJyYXkgVGhlIGFycmF5IHRvIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmZiBnaXZlbiBlbGVtZW50IHdhcyB0cnVseSBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tIGdpdmVuIGFycmF5LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgUmVtb3ZlRWxlbWVudDxUPihlbGVtZW50OiBULCBhcnJheTogVFtdKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBhcnJheS5pbmRleE9mKGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gQXJyYXlVdGlscy5SZW1vdmVFbGVtZW50QXRJbmRleChpbmRleCwgYXJyYXkpO1xuICAgIH1cblxuICAgIC8vIENoZWNrcyBpZiBnaXZlbiBhcnJheSBpcyBkZWZpbmVkLCBhbmQgaXMgYW4gYXJyYXksIGFuZCBoYXMgbGVuZ3RoID4gMCwgYW5kLCBvcHRpb25hbGx5IGNoZWNrcyB0aGF0IHRoZSBmaXJzdCBlbGVtZW50IGlzIG9mIHR5cGUgZ2l2ZW4gY2xhenouXG4gICAgcHVibGljIHN0YXRpYyBJc0FycmF5V2l0aEVsZW1lbnRzPFQ+KGFycmF5VG9DaGVjazogVFtdLCBjbGFzc0l0ZW1zTXVzdEJlSW5zdGFuY2VPZj86IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaXNOaWxsKGFycmF5VG9DaGVjaykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5VG9DaGVjaykgJiYgYXJyYXlUb0NoZWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChjbGFzc0l0ZW1zTXVzdEJlSW5zdGFuY2VPZikge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvQ2hlY2tbMF0gaW5zdGFuY2VvZiBjbGFzc0l0ZW1zTXVzdEJlSW5zdGFuY2VPZjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGdpdmVuIGFycmF5IGZvciB3aGljaCBnaXZlbiBmaWx0ZXIgZnVuY3Rpb24gaG9sZHMgdHJ1ZS4gUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSByZW1vdmVkLCBlbHNlIGZhbHNlLlxuICAgIHB1YmxpYyBzdGF0aWMgUmVtb3ZlRWxlbWVudHNCeUZpbHRlcihhcnJheTogYW55W10sIGZpbHRlckZ1bmN0aW9uOiAoaXRlbTogYW55KSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghQXJyYXlVdGlscy5Jc0FycmF5V2l0aEVsZW1lbnRzKGFycmF5KSB8fCAhZmlsdGVyRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhdExlYXN0T25lUmVtb3ZlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgaXRlbTogYW55ID0gYXJyYXlbaV07XG4gICAgICAgICAgICBpZiAoZmlsdGVyRnVuY3Rpb24uY2FsbCh0aGlzLCBpdGVtKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICBhdExlYXN0T25lUmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXRMZWFzdE9uZVJlbW92ZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBNb3ZlRWxlbWVudDxUPihlbGVtZW50OiBULCB0b0luZGV4OiBudW1iZXIsIGFycmF5OiBUW10pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBpc05pbGwodG9JbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZyb21JbmRleDogbnVtYmVyID0gYXJyYXkuaW5kZXhPZihlbGVtZW50KTtcbiAgICAgICAgY29uc3QgdG9JbmRleENvcnJlY3RlZDogbnVtYmVyID0gTnVtYmVyVXRpbHMuR2V0TmVhcmVzdE51bWJlcldpdGhpbkJvdW5kcyh0b0luZGV4LCAwLCBhcnJheS5sZW5ndGggLSAxKTtcbiAgICAgICAgaWYgKGZyb21JbmRleCA9PT0gLTEgfHwgYXJyYXlbdG9JbmRleENvcnJlY3RlZF0gPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgZGlkIG5vdCBleGlzdCBpbiBnaXZlbiBhcnJheSwgb3IgYWxyZWFkeSBleGlzdGVkIG9uIGdpdmVuIHRvSW5kZXhcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBhcnJheS5zcGxpY2UodG9JbmRleENvcnJlY3RlZCwgMCwgYXJyYXkuc3BsaWNlKGZyb21JbmRleCwgMSlbMF0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBQUkU6IGVsZW1lbnRzIGV4aXN0cyBpbiBnaXZlbiBhcnJheS4gUE9TVDogZ2l2ZW4gZWxlbWVudFRvUGxhY2UgaGFzIGEgbG93ZXIgaW5kZXggdGhhbiBnaXZlbiBhZnRlclRoaXNFbGVtZW50LiBBcnJheSBpcyBpbi1vdXQgbWFuaXB1bGF0ZWQuXG4gICAgcHVibGljIHN0YXRpYyBQbGFjZUVsZW1lbnRBZnRlck90aGVyKGFycmF5OiBhbnlbXSwgZWxlbWVudFRvUGxhY2U6IGFueSwgYWZ0ZXJUaGlzRWxlbWVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgICAgY29uc3QgYWZ0ZXJUaGlzRWxJZHg6IG51bWJlciA9IGFycmF5LmluZGV4T2YoYWZ0ZXJUaGlzRWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBlbFRvUGxhY2VJZHg6IG51bWJlciA9IGFycmF5LmluZGV4T2YoZWxlbWVudFRvUGxhY2UpO1xuICAgICAgICAgICAgaWYgKGFmdGVyVGhpc0VsSWR4ID49IGVsVG9QbGFjZUlkeCkge1xuICAgICAgICAgICAgICAgIEFycmF5VXRpbHMuTW92ZUVsZW1lbnQoZWxlbWVudFRvUGxhY2UsIGFmdGVyVGhpc0VsSWR4ICsgMSwgYXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1heCB2YWx1ZSBmcm9tIGFsbCByZXN1bHRpbmcgdmFsdWVzIGZyb20gYXBwbHlpbmcgZ2l2ZW4gaXRlbVZhbHVlRnVuY3Rpb24gdG8gYWxsIGl0ZW1zIG9mIGdpdmVuIGFycmF5LlxuICAgKiBAcGFyYW0gYXJyYXlcbiAgICogQHBhcmFtIGl0ZW1WYWx1ZUZ1bmN0aW9uIFRoZSBmdW5jdGlvbiBhcHBsaWVkIHRvIGVhY2ggYXJyYXkgaXRlbSB0aGF0IGdpdmVzIGl0IGEgbnVtZXJpY2FsIHZhbHVlLiBUaGUgbWF4IG51bSB2YWwgZm91bmQgaXMgcmV0dXJuZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIEdldE1heENhbGN1bGF0ZWRWYWx1ZTxUPihhcnJheTogVFtdLCBpdGVtVmFsdWVGdW5jdGlvbjogKGl0ZW06IFQpID0+IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCFhcnJheSB8fCAhaXRlbVZhbHVlRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuXG4gICAgbGV0IG1heDogbnVtYmVyID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSBhcnJheS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCB2YWx1ZUN1cjogbnVtYmVyID0gaXRlbVZhbHVlRnVuY3Rpb24uY2FsbCh0aGlzKTtcbiAgICAgIGlmICh2YWx1ZUN1ciA+IG1heCkge1xuICAgICAgICBtYXggPSB2YWx1ZUN1cjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF4O1xuICB9XG59XG4iXX0=
1
+ import { ObjectUtils } from "./object-utils";
2
+ import { NumberUtils } from "./number-utils";
3
+ import { isNill } from "./is-nill.function";
4
+ import { notNill } from "./function/not-nill.function";
5
+ export class ArrayUtils {
6
+ /**
7
+ * Returns whether at least one element in given array could be found by given finder function.
8
+ *
9
+ * @param {T[]} array
10
+ * @param {(element: T) => boolean} finder A finder function that takes an element of the array and returns a boolean that represents
11
+ * the 'found status' for that element; whether it should have been found or not.
12
+ */
13
+ static ContainsAnElementFoundBy(array, finder) {
14
+ if (!array || !finder) {
15
+ return false;
16
+ }
17
+ return notNill(this.Find(array, finder));
18
+ }
19
+ /**
20
+ * Cross-browser Array.find() function. Returns the first item in given array for which the foundBy function returns true. Returns
21
+ * undefined when none was found.
22
+ *
23
+ * Example usage:
24
+ * const foundItem: BusinessObject = ArrayUtils.Find<BusinessObject>(modelArray, (modelItem: BusinessObject) => <br>
25
+ * (return modelItem.getId() === '1')
26
+ * * });
27
+ *
28
+ * @param array The array with items to search in.
29
+ * @param foundBy The finder function applied on each items of the array, when that returns true, the item is considered found.
30
+ */
31
+ static Find(array, foundBy) {
32
+ if (!array || !foundBy) {
33
+ return undefined;
34
+ }
35
+ for (let i = 0, len = array.length; i < len; i++) {
36
+ const itemCur = array[i];
37
+ if (foundBy(itemCur)) {
38
+ return itemCur;
39
+ }
40
+ }
41
+ return undefined;
42
+ }
43
+ // @returns empty array when nothing found, otherwise array with found items
44
+ static FindAll(array, foundBy) {
45
+ const answer = [];
46
+ if (!array || !foundBy) {
47
+ return answer;
48
+ }
49
+ for (let i = 0, len = array.length; i < len; i++) {
50
+ const itemCur = array[i];
51
+ if (foundBy(itemCur)) {
52
+ answer.push(itemCur);
53
+ }
54
+ }
55
+ return answer;
56
+ }
57
+ // returns a simple clone of given array, using array.slice(0)
58
+ static CloneArray(array) {
59
+ let answer = [];
60
+ if (array) {
61
+ answer = array.slice(0);
62
+ }
63
+ return answer;
64
+ }
65
+ /**
66
+ * Returns a 'semi deep clone' of given array. Its first-level members are object-shallow-cloned (optionally with a strongly typed constructor),
67
+ * or just as plain object (see param arrayItemsClass).
68
+ * @param array
69
+ * @param arrayItemsClass If provided, the cloned array's first-level items will be strongly typed to / constructed as this class. Otherwise
70
+ * it'll be a plain object.
71
+ * @param deepClone Set to true if array items contain FUNCTIONS that need to be cloned..
72
+ * @returns {Array} semi-deep clone of given array
73
+ */
74
+ static CloneArrayAndItsItems(array, arrayItemsClass, deepClone = false) {
75
+ const cloneArray = [];
76
+ if (array) {
77
+ for (let i = 0, len = array.length; i < len; i++) {
78
+ if (deepClone) {
79
+ cloneArray.push(ObjectUtils.GetDeepClone(array[i]));
80
+ }
81
+ else {
82
+ cloneArray.push(ObjectUtils.GetShallowClone(array[i], arrayItemsClass));
83
+ }
84
+ }
85
+ }
86
+ else {
87
+ return [];
88
+ }
89
+ return cloneArray;
90
+ }
91
+ /**
92
+ * Removes element at given index from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really
93
+ * removes the element using splice().
94
+ *
95
+ * @param {number} index
96
+ * @param {any[]} array in-out
97
+ * @returns {boolean} True if and only if the element on given index is succesfully removed from given array.
98
+ */
99
+ static RemoveElementAtIndex(index, array) {
100
+ if (NumberUtils.IsNaN(index) || index < 0 || !Array.isArray(array) || array.length === 0) {
101
+ return false;
102
+ }
103
+ if (index in array) {
104
+ array.splice(index, 1);
105
+ return true;
106
+ }
107
+ else {
108
+ return false;
109
+ }
110
+ }
111
+ /**
112
+ * Removes given element from given array. Doesn't just set it to null like JavaScripts standard 'delete' does, but really removes the
113
+ * element using splice(). Also works on associative arrays.
114
+ *
115
+ * @param {T} element The element to remove.
116
+ * @param {T[]} array The array to remove the element from.
117
+ * @returns {boolean} True iff given element was truly successfully removed from given array.
118
+ */
119
+ static RemoveElement(element, array) {
120
+ if (!Array.isArray(array)) {
121
+ return false;
122
+ }
123
+ const index = array.indexOf(element);
124
+ return ArrayUtils.RemoveElementAtIndex(index, array);
125
+ }
126
+ // Checks if given array is defined, and is an array, and has length > 0, and, optionally checks that the first element is of type given clazz.
127
+ static IsArrayWithElements(arrayToCheck, classItemsMustBeInstanceOf) {
128
+ if (isNill(arrayToCheck)) {
129
+ return false;
130
+ }
131
+ if (Array.isArray(arrayToCheck) && arrayToCheck.length > 0) {
132
+ if (classItemsMustBeInstanceOf) {
133
+ return arrayToCheck[0] instanceof classItemsMustBeInstanceOf;
134
+ }
135
+ else {
136
+ return true;
137
+ }
138
+ }
139
+ else {
140
+ return false;
141
+ }
142
+ }
143
+ // Removes all elements from given array for which given filter function holds true. Returns true if at least one removed, else false.
144
+ static RemoveElementsByFilter(array, filterFunction) {
145
+ if (!ArrayUtils.IsArrayWithElements(array) || !filterFunction) {
146
+ return false;
147
+ }
148
+ let atLeastOneRemoved = false;
149
+ const len = array.length;
150
+ for (let i = len - 1; i >= 0; i--) {
151
+ const item = array[i];
152
+ if (filterFunction.call(this, item) === true) {
153
+ array.splice(i, 1);
154
+ atLeastOneRemoved = true;
155
+ }
156
+ }
157
+ return atLeastOneRemoved;
158
+ }
159
+ static MoveElement(element, toIndex, array) {
160
+ if (!Array.isArray(array) || isNill(toIndex)) {
161
+ return false;
162
+ }
163
+ const fromIndex = array.indexOf(element);
164
+ const toIndexCorrected = NumberUtils.GetNearestNumberWithinBounds(toIndex, 0, array.length - 1);
165
+ if (fromIndex === -1 || array[toIndexCorrected] === element) {
166
+ // element did not exist in given array, or already existed on given toIndex
167
+ return false;
168
+ }
169
+ array.splice(toIndexCorrected, 0, array.splice(fromIndex, 1)[0]);
170
+ return true;
171
+ }
172
+ // PRE: elements exists in given array. POST: given elementToPlace has a lower index than given afterThisElement. Array is in-out manipulated.
173
+ static PlaceElementAfterOther(array, elementToPlace, afterThisElement) {
174
+ if (array) {
175
+ const afterThisElIdx = array.indexOf(afterThisElement);
176
+ const elToPlaceIdx = array.indexOf(elementToPlace);
177
+ if (afterThisElIdx >= elToPlaceIdx) {
178
+ ArrayUtils.MoveElement(elementToPlace, afterThisElIdx + 1, array);
179
+ }
180
+ }
181
+ }
182
+ /**
183
+ * Returns max value from all resulting values from applying given itemValueFunction to all items of given array.
184
+ * @param array
185
+ * @param itemValueFunction The function applied to each array item that gives it a numerical value. The max num val found is returned.
186
+ */
187
+ static GetMaxCalculatedValue(array, itemValueFunction) {
188
+ if (!array || !itemValueFunction) {
189
+ return NaN;
190
+ }
191
+ let max = undefined;
192
+ const len = array.length;
193
+ for (let i = 0; i < len; i++) {
194
+ const valueCur = itemValueFunction.call(this);
195
+ if (valueCur > max) {
196
+ max = valueCur;
197
+ }
198
+ }
199
+ return max;
200
+ }
201
+ }
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWRjb21wb25lbnRzL3NyYy9saWIvdXRpbHMvYXJyYXktdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRXJELE1BQU0sT0FBTyxVQUFVO0lBQ25COzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBSSxLQUFVLEVBQUUsTUFBK0I7UUFDakYsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUksS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBSSxLQUFVLEVBQUUsT0FBNkI7UUFDM0QsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNwQixPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUVELEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLEdBQUcsR0FBVyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUQsTUFBTSxPQUFPLEdBQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFHO2dCQUNuQixPQUFPLE9BQU8sQ0FBQzthQUNsQjtT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LEtBQVUsRUFBRSxpQkFBc0M7UUFDdkYsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ2hDLE9BQU8sR0FBRyxDQUFDO1NBQ1o7UUFFRCxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUM7UUFFNUIsTUFBTSxHQUFHLEdBQVcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sUUFBUSxHQUFXLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RCxJQUFJLFFBQVEsR0FBRyxHQUFHLEVBQUU7Z0JBQ2xCLEdBQUcsR0FBRyxRQUFRLENBQUM7YUFDaEI7U0FDRjtRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4vb2JqZWN0LXV0aWxzXCI7XHJcbmltcG9ydCB7TnVtYmVyVXRpbHN9IGZyb20gXCIuL251bWJlci11dGlsc1wiO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSBcIi4vaXMtbmlsbC5mdW5jdGlvblwiO1xyXG5pbXBvcnQge25vdE5pbGx9IGZyb20gXCIuL2Z1bmN0aW9uL25vdC1uaWxsLmZ1bmN0aW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQXJyYXlVdGlscyB7XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgd2hldGhlciBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiBnaXZlbiBhcnJheSBjb3VsZCBiZSBmb3VuZCBieSBnaXZlbiBmaW5kZXIgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtUW119IGFycmF5XHJcbiAgICAgKiBAcGFyYW0geyhlbGVtZW50OiBUKSA9PiBib29sZWFufSBmaW5kZXIgQSBmaW5kZXIgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBlbGVtZW50IG9mIHRoZSBhcnJheSBhbmQgcmV0dXJucyBhIGJvb2xlYW4gdGhhdCByZXByZXNlbnRzXHJcbiAgICAgKiB0aGUgJ2ZvdW5kIHN0YXR1cycgZm9yIHRoYXQgZWxlbWVudDsgd2hldGhlciBpdCBzaG91bGQgaGF2ZSBiZWVuIGZvdW5kIG9yIG5vdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBDb250YWluc0FuRWxlbWVudEZvdW5kQnk8VD4oYXJyYXk6IFRbXSwgZmluZGVyOiAoZWxlbWVudDogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghYXJyYXkgfHwgIWZpbmRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbm90TmlsbCh0aGlzLkZpbmQ8VD4oYXJyYXksIGZpbmRlcikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3Jvc3MtYnJvd3NlciBBcnJheS5maW5kKCkgZnVuY3Rpb24uIFJldHVybnMgdGhlIGZpcnN0IGl0ZW0gaW4gZ2l2ZW4gYXJyYXkgZm9yIHdoaWNoIHRoZSBmb3VuZEJ5IGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4gUmV0dXJuc1xyXG4gICAgICogdW5kZWZpbmVkIHdoZW4gbm9uZSB3YXMgZm91bmQuXHJcbiAgICAgKlxyXG4gICAgICogRXhhbXBsZSB1c2FnZTpcclxuICAgICAqIGNvbnN0IGZvdW5kSXRlbTogQnVzaW5lc3NPYmplY3QgPSBBcnJheVV0aWxzLkZpbmQ8QnVzaW5lc3NPYmplY3Q+KG1vZGVsQXJyYXksIChtb2RlbEl0ZW06IEJ1c2luZXNzT2JqZWN0KSA9PiA8YnI+XHJcbiAgICAgKiAgICAgKHJldHVybiBtb2RlbEl0ZW0uZ2V0SWQoKSA9PT0gJzEnKVxyXG4gICAgICogICAqIH0pO1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgd2l0aCBpdGVtcyB0byBzZWFyY2ggaW4uXHJcbiAgICAgKiBAcGFyYW0gZm91bmRCeSBUaGUgZmluZGVyIGZ1bmN0aW9uIGFwcGxpZWQgb24gZWFjaCBpdGVtcyBvZiB0aGUgYXJyYXksIHdoZW4gdGhhdCByZXR1cm5zIHRydWUsIHRoZSBpdGVtIGlzIGNvbnNpZGVyZWQgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgRmluZDxUPihhcnJheTogVFtdLCBmb3VuZEJ5OiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFQge1xyXG4gICAgICAgIGlmICghYXJyYXkgfHwgIWZvdW5kQnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUN1cjogVCA9IGFycmF5W2ldO1xyXG4gICAgICAgICAgICBpZiAoZm91bmRCeShpdGVtQ3VyKSApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtQ3VyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQHJldHVybnMgZW1wdHkgYXJyYXkgd2hlbiBub3RoaW5nIGZvdW5kLCBvdGhlcndpc2UgYXJyYXkgd2l0aCBmb3VuZCBpdGVtc1xyXG4gICAgcHVibGljIHN0YXRpYyBGaW5kQWxsPFQ+KGFycmF5OiBUW10sIGZvdW5kQnk6IChpdGVtOiBUKSA9PiBib29sZWFuKTogVFtdIHtcclxuICAgICAgICBjb25zdCBhbnN3ZXI6IFRbXSA9IFtdO1xyXG4gICAgICAgIGlmICghYXJyYXkgfHwgIWZvdW5kQnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUN1cjogVCA9IGFycmF5W2ldO1xyXG4gICAgICAgICAgICBpZiAoZm91bmRCeShpdGVtQ3VyKSkge1xyXG4gICAgICAgICAgICAgICAgYW5zd2VyLnB1c2goaXRlbUN1cik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFuc3dlcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXR1cm5zIGEgc2ltcGxlIGNsb25lIG9mIGdpdmVuIGFycmF5LCB1c2luZyBhcnJheS5zbGljZSgwKVxyXG4gICAgcHVibGljIHN0YXRpYyBDbG9uZUFycmF5PFQ+KGFycmF5OiBUW10pOiBUW10ge1xyXG4gICAgICAgIGxldCBhbnN3ZXI6IFRbXSA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoYXJyYXkpIHtcclxuICAgICAgICAgICAgYW5zd2VyID0gYXJyYXkuc2xpY2UoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYW5zd2VyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhICdzZW1pIGRlZXAgY2xvbmUnIG9mIGdpdmVuIGFycmF5LiBJdHMgZmlyc3QtbGV2ZWwgbWVtYmVycyBhcmUgb2JqZWN0LXNoYWxsb3ctY2xvbmVkIChvcHRpb25hbGx5IHdpdGggYSBzdHJvbmdseSB0eXBlZCBjb25zdHJ1Y3RvciksXHJcbiAgICAgKiBvciBqdXN0IGFzIHBsYWluIG9iamVjdCAoc2VlIHBhcmFtIGFycmF5SXRlbXNDbGFzcykuXHJcbiAgICAgKiBAcGFyYW0gYXJyYXlcclxuICAgICAqIEBwYXJhbSBhcnJheUl0ZW1zQ2xhc3MgSWYgcHJvdmlkZWQsIHRoZSBjbG9uZWQgYXJyYXkncyBmaXJzdC1sZXZlbCBpdGVtcyB3aWxsIGJlIHN0cm9uZ2x5IHR5cGVkIHRvIC8gY29uc3RydWN0ZWQgYXMgdGhpcyBjbGFzcy4gT3RoZXJ3aXNlXHJcbiAgICAgKiBpdCdsbCBiZSBhIHBsYWluIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBkZWVwQ2xvbmUgU2V0IHRvIHRydWUgaWYgYXJyYXkgaXRlbXMgY29udGFpbiBGVU5DVElPTlMgdGhhdCBuZWVkIHRvIGJlIGNsb25lZC4uXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IHNlbWktZGVlcCBjbG9uZSBvZiBnaXZlbiBhcnJheVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENsb25lQXJyYXlBbmRJdHNJdGVtczxUPihhcnJheTogVFtdLCBhcnJheUl0ZW1zQ2xhc3M/OiBhbnksIGRlZXBDbG9uZTogYm9vbGVhbiA9IGZhbHNlKTogVFtdIHtcclxuICAgICAgICBjb25zdCBjbG9uZUFycmF5OiBUW10gPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKGFycmF5KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDAsIGxlbjogbnVtYmVyID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChkZWVwQ2xvbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbG9uZUFycmF5LnB1c2goT2JqZWN0VXRpbHMuR2V0RGVlcENsb25lKGFycmF5W2ldKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb25lQXJyYXkucHVzaChPYmplY3RVdGlscy5HZXRTaGFsbG93Q2xvbmUoYXJyYXlbaV0sIGFycmF5SXRlbXNDbGFzcykpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNsb25lQXJyYXk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGVsZW1lbnQgYXQgZ2l2ZW4gaW5kZXggZnJvbSBnaXZlbiBhcnJheS4gRG9lc24ndCBqdXN0IHNldCBpdCB0byBudWxsIGxpa2UgSmF2YVNjcmlwdHMgc3RhbmRhcmQgJ2RlbGV0ZScgZG9lcywgYnV0IHJlYWxseVxyXG4gICAgICogcmVtb3ZlcyB0aGUgZWxlbWVudCB1c2luZyBzcGxpY2UoKS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcclxuICAgICAqIEBwYXJhbSB7YW55W119IGFycmF5IGluLW91dFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGVsZW1lbnQgb24gZ2l2ZW4gaW5kZXggaXMgc3VjY2VzZnVsbHkgcmVtb3ZlZCBmcm9tIGdpdmVuIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFJlbW92ZUVsZW1lbnRBdEluZGV4KGluZGV4OiBudW1iZXIsIGFycmF5OiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChOdW1iZXJVdGlscy5Jc05hTihpbmRleCkgfHwgaW5kZXggPCAwIHx8ICFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluZGV4IGluIGFycmF5KSB7XHJcbiAgICAgICAgICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGdpdmVuIGVsZW1lbnQgZnJvbSBnaXZlbiBhcnJheS4gRG9lc24ndCBqdXN0IHNldCBpdCB0byBudWxsIGxpa2UgSmF2YVNjcmlwdHMgc3RhbmRhcmQgJ2RlbGV0ZScgZG9lcywgYnV0IHJlYWxseSByZW1vdmVzIHRoZVxyXG4gICAgICogZWxlbWVudCB1c2luZyBzcGxpY2UoKS4gQWxzbyB3b3JrcyBvbiBhc3NvY2lhdGl2ZSBhcnJheXMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtUfSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHJlbW92ZS5cclxuICAgICAqIEBwYXJhbSB7VFtdfSBhcnJheSBUaGUgYXJyYXkgdG8gcmVtb3ZlIHRoZSBlbGVtZW50IGZyb20uXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZmYgZ2l2ZW4gZWxlbWVudCB3YXMgdHJ1bHkgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbSBnaXZlbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBSZW1vdmVFbGVtZW50PFQ+KGVsZW1lbnQ6IFQsIGFycmF5OiBUW10pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBhcnJheS5pbmRleE9mKGVsZW1lbnQpO1xyXG4gICAgICAgIHJldHVybiBBcnJheVV0aWxzLlJlbW92ZUVsZW1lbnRBdEluZGV4KGluZGV4LCBhcnJheSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2tzIGlmIGdpdmVuIGFycmF5IGlzIGRlZmluZWQsIGFuZCBpcyBhbiBhcnJheSwgYW5kIGhhcyBsZW5ndGggPiAwLCBhbmQsIG9wdGlvbmFsbHkgY2hlY2tzIHRoYXQgdGhlIGZpcnN0IGVsZW1lbnQgaXMgb2YgdHlwZSBnaXZlbiBjbGF6ei5cclxuICAgIHB1YmxpYyBzdGF0aWMgSXNBcnJheVdpdGhFbGVtZW50czxUPihhcnJheVRvQ2hlY2s6IFRbXSwgY2xhc3NJdGVtc011c3RCZUluc3RhbmNlT2Y/OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoaXNOaWxsKGFycmF5VG9DaGVjaykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXlUb0NoZWNrKSAmJiBhcnJheVRvQ2hlY2subGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoY2xhc3NJdGVtc011c3RCZUluc3RhbmNlT2YpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvQ2hlY2tbMF0gaW5zdGFuY2VvZiBjbGFzc0l0ZW1zTXVzdEJlSW5zdGFuY2VPZjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGdpdmVuIGFycmF5IGZvciB3aGljaCBnaXZlbiBmaWx0ZXIgZnVuY3Rpb24gaG9sZHMgdHJ1ZS4gUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSByZW1vdmVkLCBlbHNlIGZhbHNlLlxyXG4gICAgcHVibGljIHN0YXRpYyBSZW1vdmVFbGVtZW50c0J5RmlsdGVyKGFycmF5OiBhbnlbXSwgZmlsdGVyRnVuY3Rpb246IChpdGVtOiBhbnkpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIUFycmF5VXRpbHMuSXNBcnJheVdpdGhFbGVtZW50cyhhcnJheSkgfHwgIWZpbHRlckZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBhdExlYXN0T25lUmVtb3ZlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCBsZW46IG51bWJlciA9IGFycmF5Lmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtOiBhbnkgPSBhcnJheVtpXTtcclxuICAgICAgICAgICAgaWYgKGZpbHRlckZ1bmN0aW9uLmNhbGwodGhpcywgaXRlbSkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIGF0TGVhc3RPbmVSZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGF0TGVhc3RPbmVSZW1vdmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgTW92ZUVsZW1lbnQ8VD4oZWxlbWVudDogVCwgdG9JbmRleDogbnVtYmVyLCBhcnJheTogVFtdKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBpc05pbGwodG9JbmRleCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZnJvbUluZGV4OiBudW1iZXIgPSBhcnJheS5pbmRleE9mKGVsZW1lbnQpO1xyXG4gICAgICAgIGNvbnN0IHRvSW5kZXhDb3JyZWN0ZWQ6IG51bWJlciA9IE51bWJlclV0aWxzLkdldE5lYXJlc3ROdW1iZXJXaXRoaW5Cb3VuZHModG9JbmRleCwgMCwgYXJyYXkubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgaWYgKGZyb21JbmRleCA9PT0gLTEgfHwgYXJyYXlbdG9JbmRleENvcnJlY3RlZF0gPT09IGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gZWxlbWVudCBkaWQgbm90IGV4aXN0IGluIGdpdmVuIGFycmF5LCBvciBhbHJlYWR5IGV4aXN0ZWQgb24gZ2l2ZW4gdG9JbmRleFxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFycmF5LnNwbGljZSh0b0luZGV4Q29ycmVjdGVkLCAwLCBhcnJheS5zcGxpY2UoZnJvbUluZGV4LCAxKVswXSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUFJFOiBlbGVtZW50cyBleGlzdHMgaW4gZ2l2ZW4gYXJyYXkuIFBPU1Q6IGdpdmVuIGVsZW1lbnRUb1BsYWNlIGhhcyBhIGxvd2VyIGluZGV4IHRoYW4gZ2l2ZW4gYWZ0ZXJUaGlzRWxlbWVudC4gQXJyYXkgaXMgaW4tb3V0IG1hbmlwdWxhdGVkLlxyXG4gICAgcHVibGljIHN0YXRpYyBQbGFjZUVsZW1lbnRBZnRlck90aGVyKGFycmF5OiBhbnlbXSwgZWxlbWVudFRvUGxhY2U6IGFueSwgYWZ0ZXJUaGlzRWxlbWVudDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGFycmF5KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFmdGVyVGhpc0VsSWR4OiBudW1iZXIgPSBhcnJheS5pbmRleE9mKGFmdGVyVGhpc0VsZW1lbnQpO1xyXG4gICAgICAgICAgICBjb25zdCBlbFRvUGxhY2VJZHg6IG51bWJlciA9IGFycmF5LmluZGV4T2YoZWxlbWVudFRvUGxhY2UpO1xyXG4gICAgICAgICAgICBpZiAoYWZ0ZXJUaGlzRWxJZHggPj0gZWxUb1BsYWNlSWR4KSB7XHJcbiAgICAgICAgICAgICAgICBBcnJheVV0aWxzLk1vdmVFbGVtZW50KGVsZW1lbnRUb1BsYWNlLCBhZnRlclRoaXNFbElkeCArIDEsIGFycmF5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBtYXggdmFsdWUgZnJvbSBhbGwgcmVzdWx0aW5nIHZhbHVlcyBmcm9tIGFwcGx5aW5nIGdpdmVuIGl0ZW1WYWx1ZUZ1bmN0aW9uIHRvIGFsbCBpdGVtcyBvZiBnaXZlbiBhcnJheS5cclxuICAgKiBAcGFyYW0gYXJyYXlcclxuICAgKiBAcGFyYW0gaXRlbVZhbHVlRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIGFwcGxpZWQgdG8gZWFjaCBhcnJheSBpdGVtIHRoYXQgZ2l2ZXMgaXQgYSBudW1lcmljYWwgdmFsdWUuIFRoZSBtYXggbnVtIHZhbCBmb3VuZCBpcyByZXR1cm5lZC5cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIEdldE1heENhbGN1bGF0ZWRWYWx1ZTxUPihhcnJheTogVFtdLCBpdGVtVmFsdWVGdW5jdGlvbjogKGl0ZW06IFQpID0+IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAoIWFycmF5IHx8ICFpdGVtVmFsdWVGdW5jdGlvbikge1xyXG4gICAgICByZXR1cm4gTmFOO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtYXg6IG51bWJlciA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdCBsZW46IG51bWJlciA9IGFycmF5Lmxlbmd0aDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBjb25zdCB2YWx1ZUN1cjogbnVtYmVyID0gaXRlbVZhbHVlRnVuY3Rpb24uY2FsbCh0aGlzKTtcclxuICAgICAgaWYgKHZhbHVlQ3VyID4gbWF4KSB7XHJcbiAgICAgICAgbWF4ID0gdmFsdWVDdXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWF4O1xyXG4gIH1cclxufVxyXG4iXX0=