@simpleangularcontrols/sac-common 10.0.0-rc.3 → 10.0.0-rc.30

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 (563) hide show
  1. package/README.md +16 -16
  2. package/bundles/simpleangularcontrols-sac-common.umd.js +13451 -11757
  3. package/bundles/simpleangularcontrols-sac-common.umd.js.map +1 -1
  4. package/bundles/simpleangularcontrols-sac-common.umd.min.js +1 -1
  5. package/bundles/simpleangularcontrols-sac-common.umd.min.js.map +1 -1
  6. package/common/basedatetimecontrol.d.ts +200 -83
  7. package/common/basedatetimecontrol.ngfactory.d.ts +1 -1
  8. package/common/baseinputcontrol.d.ts +40 -42
  9. package/common/baseinputcontrol.ngfactory.d.ts +1 -1
  10. package/common/baselistcontrol.d.ts +43 -43
  11. package/common/baselistcontrol.ngfactory.d.ts +1 -1
  12. package/common/basemodelcontrol.d.ts +300 -252
  13. package/common/basemodelcontrol.ngfactory.d.ts +1 -1
  14. package/common/baseselectcontrol.d.ts +14 -14
  15. package/common/baseselectcontrol.ngfactory.d.ts +1 -1
  16. package/common/baseuploadcontrol.d.ts +324 -284
  17. package/common/baseuploadcontrol.ngfactory.d.ts +1 -1
  18. package/components/browser/browser.d.ts +264 -267
  19. package/components/browser/browser.ngfactory.d.ts +1 -1
  20. package/components/browser/models/browserfile.d.ts +17 -17
  21. package/components/browser/models/browserfile.ngfactory.d.ts +1 -1
  22. package/components/browser/models/browserfiledeleterequest.d.ts +18 -18
  23. package/components/browser/models/browserfiledeleterequest.ngfactory.d.ts +1 -1
  24. package/components/browser/models/browserfilerenamerequest.d.ts +22 -22
  25. package/components/browser/models/browserfilerenamerequest.ngfactory.d.ts +1 -1
  26. package/components/browser/models/browserfileresponse.d.ts +10 -10
  27. package/components/browser/models/browserfileresponse.ngfactory.d.ts +1 -1
  28. package/components/browser/models/browserfilesaverequest.d.ts +22 -22
  29. package/components/browser/models/browserfilesaverequest.ngfactory.d.ts +1 -1
  30. package/components/browser/models/browsernode.d.ts +34 -34
  31. package/components/browser/models/browsernode.ngfactory.d.ts +1 -1
  32. package/components/browser/models/browsernodedeleterequest.d.ts +14 -14
  33. package/components/browser/models/browsernodedeleterequest.ngfactory.d.ts +1 -1
  34. package/components/browser/models/browsernodenewrequest.d.ts +18 -18
  35. package/components/browser/models/browsernodenewrequest.ngfactory.d.ts +1 -1
  36. package/components/browser/models/browsernoderenamerequest.d.ts +18 -18
  37. package/components/browser/models/browsernoderenamerequest.ngfactory.d.ts +1 -1
  38. package/components/browser/models/browsernoderequest.d.ts +18 -18
  39. package/components/browser/models/browsernoderequest.ngfactory.d.ts +1 -1
  40. package/components/browser/models/browsernoderesponse.d.ts +10 -10
  41. package/components/browser/models/browsernoderesponse.ngfactory.d.ts +1 -1
  42. package/controls/buttons/button.d.ts +80 -70
  43. package/controls/buttons/button.ngfactory.d.ts +1 -1
  44. package/controls/checkbox/checkbox.d.ts +32 -23
  45. package/controls/checkbox/checkbox.ngfactory.d.ts +1 -1
  46. package/controls/checkbox/radiobutton.d.ts +120 -79
  47. package/controls/checkbox/radiobutton.ngfactory.d.ts +1 -1
  48. package/controls/checkbox/radiobuttons.d.ts +63 -60
  49. package/controls/checkbox/radiobuttons.ngfactory.d.ts +1 -1
  50. package/controls/confirm/confirm.button.d.ts +25 -25
  51. package/controls/confirm/confirm.button.ngfactory.d.ts +1 -1
  52. package/controls/confirm/confirm.d.ts +50 -49
  53. package/controls/confirm/confirm.ngfactory.d.ts +1 -1
  54. package/controls/confirm/confirm.service.d.ts +63 -63
  55. package/controls/confirm/confirm.service.ngfactory.d.ts +1 -1
  56. package/controls/contextmenu/contextmenu.d.ts +134 -113
  57. package/controls/contextmenu/contextmenu.interface.d.ts +9 -0
  58. package/{utilities/positioning.ngfactory.d.ts → controls/contextmenu/contextmenu.interface.ngfactory.d.ts} +1 -1
  59. package/controls/contextmenu/contextmenu.ngfactory.d.ts +1 -1
  60. package/controls/contextmenu/contextmenuanchor.d.ts +15 -15
  61. package/controls/contextmenu/contextmenuanchor.ngfactory.d.ts +1 -1
  62. package/controls/contextmenu/contextmenucontainer.d.ts +15 -15
  63. package/controls/contextmenu/contextmenucontainer.ngfactory.d.ts +1 -1
  64. package/controls/contextmenu/contextmenuitem.d.ts +10 -5
  65. package/controls/contextmenu/contextmenuitem.ngfactory.d.ts +1 -1
  66. package/controls/contextmenu/contextmenuitembutton.d.ts +67 -66
  67. package/controls/contextmenu/contextmenuitembutton.ngfactory.d.ts +1 -1
  68. package/controls/datetime/date.d.ts +117 -120
  69. package/controls/datetime/date.ngfactory.d.ts +1 -1
  70. package/controls/datetime/dateselector.d.ts +176 -161
  71. package/controls/datetime/dateselector.ngfactory.d.ts +1 -1
  72. package/controls/datetime/datetime.d.ts +129 -135
  73. package/controls/datetime/datetime.ngfactory.d.ts +1 -1
  74. package/controls/datetime/time.d.ts +121 -115
  75. package/controls/datetime/time.ngfactory.d.ts +1 -1
  76. package/controls/dialog/dialog.d.ts +103 -105
  77. package/controls/dialog/dialog.ngfactory.d.ts +1 -1
  78. package/controls/form/form.d.ts +52 -47
  79. package/controls/form/form.ngfactory.d.ts +1 -1
  80. package/controls/grid/grid.d.ts +132 -125
  81. package/controls/grid/grid.ngfactory.d.ts +1 -1
  82. package/controls/grid/gridbutton.d.ts +53 -33
  83. package/controls/grid/gridbutton.ngfactory.d.ts +1 -1
  84. package/controls/grid/gridcolumn.d.ts +32 -28
  85. package/controls/grid/gridcolumn.ngfactory.d.ts +1 -1
  86. package/controls/grid/gridcolumnaction.d.ts +15 -15
  87. package/controls/grid/gridcolumnaction.ngfactory.d.ts +1 -1
  88. package/controls/grid/gridcolumnbase.d.ts +115 -86
  89. package/controls/grid/gridcolumnbase.ngfactory.d.ts +1 -1
  90. package/controls/grid/gridimage.d.ts +9 -9
  91. package/controls/grid/gridimage.ngfactory.d.ts +1 -1
  92. package/controls/grid/model.d.ts +95 -83
  93. package/controls/grid/model.ngfactory.d.ts +1 -1
  94. package/controls/grid/paging.d.ts +148 -147
  95. package/controls/grid/paging.ngfactory.d.ts +1 -1
  96. package/controls/input/input.d.ts +35 -35
  97. package/controls/input/input.ngfactory.d.ts +1 -1
  98. package/controls/input/inputarea.d.ts +28 -26
  99. package/controls/input/inputarea.ngfactory.d.ts +1 -1
  100. package/controls/input/inputcurrency.d.ts +14 -11
  101. package/controls/input/inputcurrency.ngfactory.d.ts +1 -1
  102. package/controls/input/inputdecimal.d.ts +59 -59
  103. package/controls/input/inputdecimal.ngfactory.d.ts +1 -1
  104. package/controls/input/inputemail.d.ts +19 -19
  105. package/controls/input/inputemail.ngfactory.d.ts +1 -1
  106. package/controls/input/inputinteger.d.ts +59 -59
  107. package/controls/input/inputinteger.ngfactory.d.ts +1 -1
  108. package/controls/input/inputpassword.d.ts +43 -23
  109. package/controls/input/inputpassword.ngfactory.d.ts +1 -1
  110. package/controls/input/inputsearch.d.ts +35 -23
  111. package/controls/input/inputsearch.ngfactory.d.ts +1 -1
  112. package/controls/layout/formlayout.d.ts +65 -46
  113. package/controls/layout/formlayout.ngfactory.d.ts +1 -1
  114. package/controls/list/buildvaluestring.d.ts +6 -0
  115. package/controls/{treeview/ngtreeitemaction.ngfactory.d.ts → list/buildvaluestring.ngfactory.d.ts} +1 -1
  116. package/controls/list/dropdown.d.ts +97 -138
  117. package/controls/list/dropdown.ngfactory.d.ts +1 -1
  118. package/controls/list/dropdownoptions.d.ts +38 -0
  119. package/{validation/minlength.validator.ngfactory.d.ts → controls/list/dropdownoptions.ngfactory.d.ts} +1 -1
  120. package/controls/list/list.module.d.ts +2 -2
  121. package/controls/list/list.module.ngfactory.d.ts +3 -3
  122. package/controls/list/listbox.d.ts +88 -86
  123. package/controls/list/listbox.ngfactory.d.ts +1 -1
  124. package/controls/multilanguage/multilanguageinput.d.ts +102 -102
  125. package/controls/multilanguage/multilanguageinput.ngfactory.d.ts +1 -1
  126. package/controls/multilanguage/multilanguageinputarea.d.ts +107 -107
  127. package/controls/multilanguage/multilanguageinputarea.ngfactory.d.ts +1 -1
  128. package/controls/static/formcontainer.d.ts +35 -31
  129. package/controls/static/formcontainer.ngfactory.d.ts +1 -1
  130. package/controls/static/staticlabel.d.ts +18 -18
  131. package/controls/static/staticlabel.ngfactory.d.ts +1 -1
  132. package/controls/tabs/tab.d.ts +49 -45
  133. package/controls/tabs/tab.ngfactory.d.ts +1 -1
  134. package/controls/tabs/tabitem.d.ts +30 -30
  135. package/controls/tabs/tabitem.ngfactory.d.ts +1 -1
  136. package/controls/tinymce/tinymce.d.ts +153 -149
  137. package/controls/tinymce/tinymce.ngfactory.d.ts +1 -1
  138. package/controls/tinymce/tinymcedialogsettings.d.ts +27 -27
  139. package/controls/tinymce/tinymcedialogsettings.ngfactory.d.ts +1 -1
  140. package/controls/tinymce/tinymcedialogsettingsmeta.d.ts +9 -9
  141. package/controls/tinymce/tinymcedialogsettingsmeta.ngfactory.d.ts +1 -1
  142. package/controls/tinymce/tinymceinstance.d.ts +10 -10
  143. package/controls/tinymce/tinymceinstance.ngfactory.d.ts +1 -1
  144. package/controls/tooltip/tooltip.d.ts +158 -138
  145. package/controls/tooltip/tooltip.ngfactory.d.ts +1 -1
  146. package/controls/treeview/treeview.d.ts +230 -185
  147. package/controls/treeview/treeview.ngfactory.d.ts +1 -1
  148. package/controls/upload/dropzonemultiple.d.ts +74 -70
  149. package/controls/upload/dropzonemultiple.ngfactory.d.ts +1 -1
  150. package/controls/upload/dropzonesingle.d.ts +51 -47
  151. package/controls/upload/dropzonesingle.ngfactory.d.ts +1 -1
  152. package/controls/upload/uploadmultiple.d.ts +54 -50
  153. package/controls/upload/uploadmultiple.ngfactory.d.ts +1 -1
  154. package/controls/upload/uploadsingle.d.ts +31 -27
  155. package/controls/upload/uploadsingle.ngfactory.d.ts +1 -1
  156. package/controls/validation/validationsummary.d.ts +65 -60
  157. package/controls/validation/validationsummary.ngfactory.d.ts +1 -1
  158. package/controls/wizard/wizard.d.ts +80 -73
  159. package/controls/wizard/wizard.ngfactory.d.ts +1 -1
  160. package/controls/wizard/wizarditem.d.ts +25 -25
  161. package/controls/wizard/wizarditem.ngfactory.d.ts +1 -1
  162. package/enums/ButtonRoleType.d.ts +26 -1
  163. package/enums/ButtonRoleType.ngfactory.d.ts +1 -1
  164. package/enums/ControlHeight.d.ts +17 -17
  165. package/enums/ControlHeight.ngfactory.d.ts +1 -1
  166. package/enums/IconType.d.ts +7 -7
  167. package/enums/IconType.ngfactory.d.ts +1 -1
  168. package/esm2015/common/basedatetimecontrol.js +364 -164
  169. package/esm2015/common/basedatetimecontrol.ngfactory.js +7 -7
  170. package/esm2015/common/baseinputcontrol.js +75 -78
  171. package/esm2015/common/baseinputcontrol.ngfactory.js +7 -7
  172. package/esm2015/common/baselistcontrol.js +59 -55
  173. package/esm2015/common/baselistcontrol.ngfactory.js +7 -7
  174. package/esm2015/common/basemodelcontrol.js +563 -483
  175. package/esm2015/common/basemodelcontrol.ngfactory.js +7 -7
  176. package/esm2015/common/baseselectcontrol.js +28 -26
  177. package/esm2015/common/baseselectcontrol.ngfactory.js +7 -7
  178. package/esm2015/common/baseuploadcontrol.js +523 -457
  179. package/esm2015/common/baseuploadcontrol.ngfactory.js +7 -7
  180. package/esm2015/components/browser/browser.js +533 -545
  181. package/esm2015/components/browser/browser.ngfactory.js +7 -7
  182. package/esm2015/components/browser/models/browserfile.js +1 -1
  183. package/esm2015/components/browser/models/browserfile.ngfactory.js +7 -7
  184. package/esm2015/components/browser/models/browserfiledeleterequest.js +15 -13
  185. package/esm2015/components/browser/models/browserfiledeleterequest.ngfactory.js +7 -7
  186. package/esm2015/components/browser/models/browserfilerenamerequest.js +15 -13
  187. package/esm2015/components/browser/models/browserfilerenamerequest.ngfactory.js +7 -7
  188. package/esm2015/components/browser/models/browserfileresponse.js +1 -1
  189. package/esm2015/components/browser/models/browserfileresponse.ngfactory.js +7 -7
  190. package/esm2015/components/browser/models/browserfilesaverequest.js +15 -13
  191. package/esm2015/components/browser/models/browserfilesaverequest.ngfactory.js +7 -7
  192. package/esm2015/components/browser/models/browsernode.js +1 -1
  193. package/esm2015/components/browser/models/browsernode.ngfactory.js +7 -7
  194. package/esm2015/components/browser/models/browsernodedeleterequest.js +15 -13
  195. package/esm2015/components/browser/models/browsernodedeleterequest.ngfactory.js +7 -7
  196. package/esm2015/components/browser/models/browsernodenewrequest.js +15 -13
  197. package/esm2015/components/browser/models/browsernodenewrequest.ngfactory.js +7 -7
  198. package/esm2015/components/browser/models/browsernoderenamerequest.js +15 -13
  199. package/esm2015/components/browser/models/browsernoderenamerequest.ngfactory.js +7 -7
  200. package/esm2015/components/browser/models/browsernoderequest.js +15 -13
  201. package/esm2015/components/browser/models/browsernoderequest.ngfactory.js +7 -7
  202. package/esm2015/components/browser/models/browsernoderesponse.js +1 -1
  203. package/esm2015/components/browser/models/browsernoderesponse.ngfactory.js +7 -7
  204. package/esm2015/controls/buttons/button.js +152 -141
  205. package/esm2015/controls/buttons/button.ngfactory.js +7 -7
  206. package/esm2015/controls/checkbox/checkbox.js +56 -33
  207. package/esm2015/controls/checkbox/checkbox.ngfactory.js +7 -7
  208. package/esm2015/controls/checkbox/radiobutton.js +173 -115
  209. package/esm2015/controls/checkbox/radiobutton.ngfactory.js +7 -7
  210. package/esm2015/controls/checkbox/radiobuttons.js +116 -113
  211. package/esm2015/controls/checkbox/radiobuttons.ngfactory.js +7 -7
  212. package/esm2015/controls/confirm/confirm.button.js +32 -32
  213. package/esm2015/controls/confirm/confirm.button.ngfactory.js +7 -7
  214. package/esm2015/controls/confirm/confirm.js +74 -75
  215. package/esm2015/controls/confirm/confirm.ngfactory.js +7 -7
  216. package/esm2015/controls/confirm/confirm.service.js +87 -87
  217. package/esm2015/controls/confirm/confirm.service.ngfactory.js +7 -7
  218. package/esm2015/controls/contextmenu/contextmenu.interface.js +1 -0
  219. package/esm2015/controls/contextmenu/contextmenu.interface.ngfactory.js +7 -0
  220. package/esm2015/controls/contextmenu/contextmenu.js +210 -194
  221. package/esm2015/controls/contextmenu/contextmenu.ngfactory.js +7 -7
  222. package/esm2015/controls/contextmenu/contextmenuanchor.js +22 -22
  223. package/esm2015/controls/contextmenu/contextmenuanchor.ngfactory.js +7 -7
  224. package/esm2015/controls/contextmenu/contextmenucontainer.js +22 -22
  225. package/esm2015/controls/contextmenu/contextmenucontainer.ngfactory.js +7 -7
  226. package/esm2015/controls/contextmenu/contextmenuitem.js +21 -10
  227. package/esm2015/controls/contextmenu/contextmenuitem.ngfactory.js +7 -7
  228. package/esm2015/controls/contextmenu/contextmenuitembutton.js +106 -97
  229. package/esm2015/controls/contextmenu/contextmenuitembutton.ngfactory.js +7 -7
  230. package/esm2015/controls/datetime/date.js +213 -212
  231. package/esm2015/controls/datetime/date.ngfactory.js +7 -7
  232. package/esm2015/controls/datetime/dateselector.js +481 -458
  233. package/esm2015/controls/datetime/dateselector.ngfactory.js +7 -7
  234. package/esm2015/controls/datetime/datetime.js +227 -229
  235. package/esm2015/controls/datetime/datetime.ngfactory.js +7 -7
  236. package/esm2015/controls/datetime/time.js +222 -212
  237. package/esm2015/controls/datetime/time.ngfactory.js +7 -7
  238. package/esm2015/controls/dialog/dialog.js +182 -207
  239. package/esm2015/controls/dialog/dialog.ngfactory.js +7 -7
  240. package/esm2015/controls/form/form.js +114 -110
  241. package/esm2015/controls/form/form.ngfactory.js +7 -7
  242. package/esm2015/controls/grid/grid.js +155 -144
  243. package/esm2015/controls/grid/grid.ngfactory.js +7 -7
  244. package/esm2015/controls/grid/gridbutton.js +102 -54
  245. package/esm2015/controls/grid/gridbutton.ngfactory.js +7 -7
  246. package/esm2015/controls/grid/gridcolumn.js +60 -49
  247. package/esm2015/controls/grid/gridcolumn.ngfactory.js +7 -7
  248. package/esm2015/controls/grid/gridcolumnaction.js +27 -26
  249. package/esm2015/controls/grid/gridcolumnaction.ngfactory.js +7 -7
  250. package/esm2015/controls/grid/gridcolumnbase.js +159 -126
  251. package/esm2015/controls/grid/gridcolumnbase.ngfactory.js +7 -7
  252. package/esm2015/controls/grid/gridimage.js +13 -13
  253. package/esm2015/controls/grid/gridimage.ngfactory.js +7 -7
  254. package/esm2015/controls/grid/model.js +103 -79
  255. package/esm2015/controls/grid/model.ngfactory.js +7 -7
  256. package/esm2015/controls/grid/paging.js +261 -254
  257. package/esm2015/controls/grid/paging.ngfactory.js +7 -7
  258. package/esm2015/controls/input/input.js +64 -66
  259. package/esm2015/controls/input/input.ngfactory.js +7 -7
  260. package/esm2015/controls/input/inputarea.js +63 -54
  261. package/esm2015/controls/input/inputarea.ngfactory.js +7 -7
  262. package/esm2015/controls/input/inputcurrency.js +34 -31
  263. package/esm2015/controls/input/inputcurrency.ngfactory.js +7 -7
  264. package/esm2015/controls/input/inputdecimal.js +140 -146
  265. package/esm2015/controls/input/inputdecimal.ngfactory.js +7 -7
  266. package/esm2015/controls/input/inputemail.js +41 -41
  267. package/esm2015/controls/input/inputemail.ngfactory.js +7 -7
  268. package/esm2015/controls/input/inputinteger.js +126 -130
  269. package/esm2015/controls/input/inputinteger.ngfactory.js +7 -7
  270. package/esm2015/controls/input/inputpassword.js +78 -46
  271. package/esm2015/controls/input/inputpassword.ngfactory.js +7 -7
  272. package/esm2015/controls/input/inputsearch.js +69 -37
  273. package/esm2015/controls/input/inputsearch.ngfactory.js +7 -7
  274. package/esm2015/controls/layout/formlayout.js +89 -70
  275. package/esm2015/controls/layout/formlayout.ngfactory.js +7 -7
  276. package/esm2015/controls/list/buildvaluestring.js +20 -0
  277. package/esm2015/controls/list/buildvaluestring.ngfactory.js +7 -0
  278. package/esm2015/controls/list/dropdown.js +182 -270
  279. package/esm2015/controls/list/dropdown.ngfactory.js +7 -7
  280. package/esm2015/controls/list/dropdownoptions.js +79 -0
  281. package/esm2015/controls/list/dropdownoptions.ngfactory.js +7 -0
  282. package/esm2015/controls/list/list.module.js +11 -11
  283. package/esm2015/controls/list/list.module.ngfactory.js +7 -7
  284. package/esm2015/controls/list/listbox.js +189 -187
  285. package/esm2015/controls/list/listbox.ngfactory.js +7 -7
  286. package/esm2015/controls/multilanguage/multilanguageinput.js +224 -230
  287. package/esm2015/controls/multilanguage/multilanguageinput.ngfactory.js +7 -7
  288. package/esm2015/controls/multilanguage/multilanguageinputarea.js +225 -231
  289. package/esm2015/controls/multilanguage/multilanguageinputarea.ngfactory.js +7 -7
  290. package/esm2015/controls/static/formcontainer.js +61 -50
  291. package/esm2015/controls/static/formcontainer.ngfactory.js +7 -7
  292. package/esm2015/controls/static/staticlabel.js +35 -31
  293. package/esm2015/controls/static/staticlabel.ngfactory.js +7 -7
  294. package/esm2015/controls/tabs/tab.js +82 -72
  295. package/esm2015/controls/tabs/tab.ngfactory.js +7 -7
  296. package/esm2015/controls/tabs/tabitem.js +34 -32
  297. package/esm2015/controls/tabs/tabitem.ngfactory.js +7 -7
  298. package/esm2015/controls/tinymce/tinymce.js +239 -238
  299. package/esm2015/controls/tinymce/tinymce.ngfactory.js +7 -7
  300. package/esm2015/controls/tinymce/tinymcedialogsettings.js +15 -13
  301. package/esm2015/controls/tinymce/tinymcedialogsettings.ngfactory.js +7 -7
  302. package/esm2015/controls/tinymce/tinymcedialogsettingsmeta.js +1 -4
  303. package/esm2015/controls/tinymce/tinymcedialogsettingsmeta.ngfactory.js +7 -7
  304. package/esm2015/controls/tinymce/tinymceinstance.js +1 -1
  305. package/esm2015/controls/tinymce/tinymceinstance.ngfactory.js +7 -7
  306. package/esm2015/controls/tooltip/tooltip.js +258 -361
  307. package/esm2015/controls/tooltip/tooltip.ngfactory.js +7 -7
  308. package/esm2015/controls/treeview/treeview.js +412 -322
  309. package/esm2015/controls/treeview/treeview.ngfactory.js +7 -7
  310. package/esm2015/controls/upload/dropzonemultiple.js +169 -163
  311. package/esm2015/controls/upload/dropzonemultiple.ngfactory.js +7 -7
  312. package/esm2015/controls/upload/dropzonesingle.js +116 -108
  313. package/esm2015/controls/upload/dropzonesingle.ngfactory.js +7 -7
  314. package/esm2015/controls/upload/uploadmultiple.js +129 -121
  315. package/esm2015/controls/upload/uploadmultiple.ngfactory.js +7 -7
  316. package/esm2015/controls/upload/uploadsingle.js +67 -55
  317. package/esm2015/controls/upload/uploadsingle.ngfactory.js +7 -7
  318. package/esm2015/controls/validation/validationsummary.js +140 -133
  319. package/esm2015/controls/validation/validationsummary.ngfactory.js +7 -7
  320. package/esm2015/controls/wizard/wizard.js +152 -139
  321. package/esm2015/controls/wizard/wizard.ngfactory.js +7 -7
  322. package/esm2015/controls/wizard/wizarditem.js +29 -27
  323. package/esm2015/controls/wizard/wizarditem.ngfactory.js +7 -7
  324. package/esm2015/enums/ButtonRoleType.js +1 -1
  325. package/esm2015/enums/ButtonRoleType.ngfactory.js +7 -7
  326. package/esm2015/enums/ControlHeight.js +19 -19
  327. package/esm2015/enums/ControlHeight.ngfactory.js +7 -7
  328. package/esm2015/enums/IconType.js +9 -9
  329. package/esm2015/enums/IconType.ngfactory.js +7 -7
  330. package/esm2015/interfaces/ISacConfigurationService.js +1 -1
  331. package/esm2015/interfaces/ISacConfigurationService.ngfactory.js +7 -7
  332. package/esm2015/interfaces/ISacFileBrowserService.js +1 -1
  333. package/esm2015/interfaces/ISacFileBrowserService.ngfactory.js +7 -7
  334. package/esm2015/interfaces/ISacIconService.js +1 -1
  335. package/esm2015/interfaces/ISacIconService.ngfactory.js +7 -7
  336. package/esm2015/interfaces/ISacLabelSizes.js +1 -1
  337. package/esm2015/interfaces/ISacLabelSizes.ngfactory.js +7 -7
  338. package/esm2015/interfaces/ISacLanguageService.js +1 -1
  339. package/esm2015/interfaces/ISacLanguageService.ngfactory.js +7 -7
  340. package/esm2015/interfaces/ISacLocalisationService.js +1 -1
  341. package/esm2015/interfaces/ISacLocalisationService.ngfactory.js +7 -7
  342. package/esm2015/interfaces/ISacUploadEventCompleteState.js +1 -0
  343. package/esm2015/interfaces/ISacUploadEventCompleteState.ngfactory.js +7 -0
  344. package/esm2015/interfaces/ISacValidationKeyService.js +1 -1
  345. package/esm2015/interfaces/ISacValidationKeyService.ngfactory.js +7 -7
  346. package/esm2015/interfaces/iabstractcontrollabel.js +1 -1
  347. package/esm2015/interfaces/iabstractcontrollabel.ngfactory.js +7 -7
  348. package/esm2015/interfaces/iconfirmcomponent.js +1 -1
  349. package/esm2015/interfaces/iconfirmcomponent.ngfactory.js +7 -7
  350. package/esm2015/interfaces/idatetimecontrol.js +1 -1
  351. package/esm2015/interfaces/idatetimecontrol.ngfactory.js +7 -7
  352. package/esm2015/interfaces/iuploadcontrol.js +1 -1
  353. package/esm2015/interfaces/iuploadcontrol.ngfactory.js +7 -7
  354. package/esm2015/interfaces/treeviewaction.interface.js +1 -0
  355. package/esm2015/interfaces/treeviewaction.interface.ngfactory.js +7 -0
  356. package/esm2015/models/languagemodel.js +15 -13
  357. package/esm2015/models/languagemodel.ngfactory.js +7 -7
  358. package/esm2015/public_api.js +112 -101
  359. package/esm2015/public_api.ngfactory.js +7 -7
  360. package/esm2015/services/index.js +7 -7
  361. package/esm2015/services/index.ngfactory.js +7 -7
  362. package/esm2015/services/sac-configuration.service.js +119 -77
  363. package/esm2015/services/sac-configuration.service.ngfactory.js +7 -7
  364. package/esm2015/services/sac-filebrowser.service.js +217 -203
  365. package/esm2015/services/sac-filebrowser.service.ngfactory.js +7 -7
  366. package/esm2015/services/sac-icon.service.js +233 -155
  367. package/esm2015/services/sac-icon.service.ngfactory.js +7 -7
  368. package/esm2015/services/sac-language.service.js +47 -43
  369. package/esm2015/services/sac-language.service.ngfactory.js +7 -7
  370. package/esm2015/services/sac-localisation.service.js +353 -460
  371. package/esm2015/services/sac-localisation.service.ngfactory.js +7 -7
  372. package/esm2015/services/sac-validationkey.service.js +306 -156
  373. package/esm2015/services/sac-validationkey.service.ngfactory.js +7 -7
  374. package/esm2015/simpleangularcontrols-sac-common.js +5 -11
  375. package/esm2015/simpleangularcontrols-sac-common.ngfactory.js +7 -7
  376. package/esm2015/utilities/convertion.js +34 -32
  377. package/esm2015/utilities/convertion.ngfactory.js +7 -7
  378. package/esm2015/utilities/datatypes.js +11 -9
  379. package/esm2015/utilities/datatypes.ngfactory.js +7 -7
  380. package/esm2015/utilities/enums.js +21 -16
  381. package/esm2015/utilities/enums.ngfactory.js +7 -7
  382. package/esm2015/utilities/guid.js +18 -16
  383. package/esm2015/utilities/guid.ngfactory.js +7 -7
  384. package/esm2015/utilities/interpolation.js +57 -50
  385. package/esm2015/utilities/interpolation.ngfactory.js +7 -7
  386. package/esm2015/utilities/popuphelper.js +380 -0
  387. package/esm2015/utilities/popuphelper.ngfactory.js +7 -0
  388. package/esm2015/utilities/positioncalculator.js +209 -0
  389. package/esm2015/utilities/positioncalculator.ngfactory.js +7 -0
  390. package/esm2015/utilities/positionelements.js +108 -0
  391. package/esm2015/utilities/positionelements.ngfactory.js +7 -0
  392. package/esm2015/utilities/testingattribute.pipe.js +54 -0
  393. package/esm2015/utilities/testingattribute.pipe.ngfactory.js +7 -0
  394. package/esm2015/utilities/utilities.module.js +12 -0
  395. package/esm2015/utilities/utilities.module.ngfactory.js +7 -0
  396. package/esm2015/validation/email.validator.js +22 -13
  397. package/esm2015/validation/email.validator.ngfactory.js +7 -7
  398. package/esm2015/validation/equals.validator.js +24 -0
  399. package/esm2015/validation/equals.validator.ngfactory.js +7 -0
  400. package/esm2015/validation/index.js +3 -3
  401. package/esm2015/validation/index.ngfactory.js +7 -7
  402. package/esm2015/validation/invaliddate.validator.js +23 -14
  403. package/esm2015/validation/invaliddate.validator.ngfactory.js +7 -7
  404. package/esm2015/validation/isDateValid.js +24 -15
  405. package/esm2015/validation/isDateValid.ngfactory.js +7 -7
  406. package/esm2015/validation/maxdate.validator.js +31 -21
  407. package/esm2015/validation/maxdate.validator.ngfactory.js +7 -7
  408. package/esm2015/validation/maxtime.validator.js +31 -21
  409. package/esm2015/validation/maxtime.validator.ngfactory.js +7 -7
  410. package/esm2015/validation/maxvalue.validator.js +26 -16
  411. package/esm2015/validation/maxvalue.validator.ngfactory.js +7 -7
  412. package/esm2015/validation/mindate.validator.js +31 -21
  413. package/esm2015/validation/mindate.validator.ngfactory.js +7 -7
  414. package/esm2015/validation/minfiles.validator.js +29 -19
  415. package/esm2015/validation/minfiles.validator.ngfactory.js +7 -7
  416. package/esm2015/validation/mintextlength.validator.js +31 -0
  417. package/esm2015/validation/mintextlength.validator.ngfactory.js +7 -0
  418. package/esm2015/validation/mintime.validator.js +31 -21
  419. package/esm2015/validation/mintime.validator.ngfactory.js +7 -7
  420. package/esm2015/validation/minvalue.validator.js +26 -16
  421. package/esm2015/validation/minvalue.validator.ngfactory.js +7 -7
  422. package/esm2015/validation/multilanguagerequired.validator.js +32 -22
  423. package/esm2015/validation/multilanguagerequired.validator.ngfactory.js +7 -7
  424. package/esm2015/validation/multilanguagerequiredany.validator.js +32 -22
  425. package/esm2015/validation/multilanguagerequiredany.validator.ngfactory.js +7 -7
  426. package/esm2015/validation/notequals.validator.js +24 -0
  427. package/esm2015/validation/notequals.validator.ngfactory.js +7 -0
  428. package/esm2015/validation/pattern.validator.js +26 -16
  429. package/esm2015/validation/pattern.validator.ngfactory.js +7 -7
  430. package/esm2015/validation/required.validator.js +22 -13
  431. package/esm2015/validation/required.validator.ngfactory.js +7 -7
  432. package/esm2015/validation/validation.class.js +201 -189
  433. package/esm2015/validation/validation.class.ngfactory.js +7 -7
  434. package/esm2015/validation/validationerrorcreator.js +22 -11
  435. package/esm2015/validation/validationerrorcreator.ngfactory.js +7 -7
  436. package/esm2015/validation/validationerroritem.js +29 -27
  437. package/esm2015/validation/validationerroritem.ngfactory.js +7 -7
  438. package/fesm2015/simpleangularcontrols-sac-common.js +11670 -10109
  439. package/fesm2015/simpleangularcontrols-sac-common.js.map +1 -1
  440. package/interfaces/ISacConfigurationService.d.ts +70 -38
  441. package/interfaces/ISacConfigurationService.ngfactory.d.ts +1 -1
  442. package/interfaces/ISacFileBrowserService.d.ts +65 -65
  443. package/interfaces/ISacFileBrowserService.ngfactory.d.ts +1 -1
  444. package/interfaces/ISacIconService.d.ts +141 -89
  445. package/interfaces/ISacIconService.ngfactory.d.ts +1 -1
  446. package/interfaces/ISacLabelSizes.d.ts +29 -26
  447. package/interfaces/ISacLabelSizes.ngfactory.d.ts +1 -1
  448. package/interfaces/ISacLanguageService.d.ts +12 -12
  449. package/interfaces/ISacLanguageService.ngfactory.d.ts +1 -1
  450. package/interfaces/ISacLocalisationService.d.ts +10 -10
  451. package/interfaces/ISacLocalisationService.ngfactory.d.ts +1 -1
  452. package/interfaces/ISacUploadEventCompleteState.d.ts +11 -0
  453. package/{controls/treeview/treeviewchild.ngfactory.d.ts → interfaces/ISacUploadEventCompleteState.ngfactory.d.ts} +1 -1
  454. package/interfaces/ISacValidationKeyService.d.ts +52 -52
  455. package/interfaces/ISacValidationKeyService.ngfactory.d.ts +1 -1
  456. package/interfaces/iabstractcontrollabel.d.ts +9 -6
  457. package/interfaces/iabstractcontrollabel.ngfactory.d.ts +1 -1
  458. package/interfaces/iconfirmcomponent.d.ts +18 -18
  459. package/interfaces/iconfirmcomponent.ngfactory.d.ts +1 -1
  460. package/interfaces/idatetimecontrol.d.ts +16 -7
  461. package/interfaces/idatetimecontrol.ngfactory.d.ts +1 -1
  462. package/interfaces/iuploadcontrol.d.ts +9 -9
  463. package/interfaces/iuploadcontrol.ngfactory.d.ts +1 -1
  464. package/interfaces/treeviewaction.interface.d.ts +13 -0
  465. package/interfaces/treeviewaction.interface.ngfactory.d.ts +1 -0
  466. package/models/languagemodel.d.ts +22 -22
  467. package/models/languagemodel.ngfactory.d.ts +1 -1
  468. package/package.json +1 -1
  469. package/public_api.d.ts +89 -79
  470. package/public_api.ngfactory.d.ts +1 -1
  471. package/services/index.d.ts +6 -6
  472. package/services/index.ngfactory.d.ts +1 -1
  473. package/services/sac-configuration.service.d.ts +137 -81
  474. package/services/sac-configuration.service.ngfactory.d.ts +1 -1
  475. package/services/sac-filebrowser.service.d.ts +148 -140
  476. package/services/sac-filebrowser.service.ngfactory.d.ts +1 -1
  477. package/services/sac-icon.service.d.ts +288 -184
  478. package/services/sac-icon.service.ngfactory.d.ts +1 -1
  479. package/services/sac-language.service.d.ts +26 -26
  480. package/services/sac-language.service.ngfactory.d.ts +1 -1
  481. package/services/sac-localisation.service.d.ts +141 -137
  482. package/services/sac-localisation.service.ngfactory.d.ts +1 -1
  483. package/services/sac-validationkey.service.d.ts +202 -55
  484. package/services/sac-validationkey.service.ngfactory.d.ts +1 -1
  485. package/simpleangularcontrols-sac-common-10.0.0-rc.30.tgz +0 -0
  486. package/simpleangularcontrols-sac-common.d.ts +4 -10
  487. package/simpleangularcontrols-sac-common.metadata.json +1 -1
  488. package/simpleangularcontrols-sac-common.ngfactory.d.ts +1 -1
  489. package/utilities/convertion.d.ts +15 -15
  490. package/utilities/convertion.ngfactory.d.ts +1 -1
  491. package/utilities/datatypes.d.ts +6 -6
  492. package/utilities/datatypes.ngfactory.d.ts +1 -1
  493. package/utilities/enums.d.ts +19 -10
  494. package/utilities/enums.ngfactory.d.ts +1 -1
  495. package/utilities/guid.d.ts +4 -4
  496. package/utilities/guid.ngfactory.d.ts +1 -1
  497. package/utilities/interpolation.d.ts +22 -21
  498. package/utilities/interpolation.ngfactory.d.ts +1 -1
  499. package/utilities/popuphelper.d.ts +120 -0
  500. package/utilities/popuphelper.ngfactory.d.ts +1 -0
  501. package/utilities/positioncalculator.d.ts +82 -0
  502. package/utilities/positioncalculator.ngfactory.d.ts +1 -0
  503. package/utilities/positionelements.d.ts +30 -0
  504. package/utilities/positionelements.ngfactory.d.ts +1 -0
  505. package/utilities/testingattribute.pipe.d.ts +27 -0
  506. package/utilities/testingattribute.pipe.ngfactory.d.ts +1 -0
  507. package/utilities/utilities.module.d.ts +2 -0
  508. package/utilities/utilities.module.ngfactory.d.ts +3 -0
  509. package/validation/email.validator.d.ts +9 -2
  510. package/validation/email.validator.ngfactory.d.ts +1 -1
  511. package/validation/equals.validator.d.ts +10 -0
  512. package/validation/equals.validator.ngfactory.d.ts +1 -0
  513. package/validation/index.d.ts +2 -2
  514. package/validation/index.ngfactory.d.ts +1 -1
  515. package/validation/invaliddate.validator.d.ts +9 -2
  516. package/validation/invaliddate.validator.ngfactory.d.ts +1 -1
  517. package/validation/isDateValid.d.ts +8 -5
  518. package/validation/isDateValid.ngfactory.d.ts +1 -1
  519. package/validation/maxdate.validator.d.ts +10 -2
  520. package/validation/maxdate.validator.ngfactory.d.ts +1 -1
  521. package/validation/maxtime.validator.d.ts +10 -2
  522. package/validation/maxtime.validator.ngfactory.d.ts +1 -1
  523. package/validation/maxvalue.validator.d.ts +10 -2
  524. package/validation/maxvalue.validator.ngfactory.d.ts +1 -1
  525. package/validation/mindate.validator.d.ts +10 -2
  526. package/validation/mindate.validator.ngfactory.d.ts +1 -1
  527. package/validation/minfiles.validator.d.ts +10 -2
  528. package/validation/minfiles.validator.ngfactory.d.ts +1 -1
  529. package/validation/mintextlength.validator.d.ts +10 -0
  530. package/validation/mintextlength.validator.ngfactory.d.ts +1 -0
  531. package/validation/mintime.validator.d.ts +10 -2
  532. package/validation/mintime.validator.ngfactory.d.ts +1 -1
  533. package/validation/minvalue.validator.d.ts +10 -2
  534. package/validation/minvalue.validator.ngfactory.d.ts +1 -1
  535. package/validation/multilanguagerequired.validator.d.ts +11 -3
  536. package/validation/multilanguagerequired.validator.ngfactory.d.ts +1 -1
  537. package/validation/multilanguagerequiredany.validator.d.ts +11 -3
  538. package/validation/multilanguagerequiredany.validator.ngfactory.d.ts +1 -1
  539. package/validation/notequals.validator.d.ts +10 -0
  540. package/validation/notequals.validator.ngfactory.d.ts +1 -0
  541. package/validation/pattern.validator.d.ts +10 -2
  542. package/validation/pattern.validator.ngfactory.d.ts +1 -1
  543. package/validation/required.validator.d.ts +9 -2
  544. package/validation/required.validator.ngfactory.d.ts +1 -1
  545. package/validation/validation.class.d.ts +141 -139
  546. package/validation/validation.class.ngfactory.d.ts +1 -1
  547. package/validation/validationerrorcreator.d.ts +10 -1
  548. package/validation/validationerrorcreator.ngfactory.d.ts +1 -1
  549. package/validation/validationerroritem.d.ts +33 -33
  550. package/validation/validationerroritem.ngfactory.d.ts +1 -1
  551. package/controls/treeview/ngtreeitemaction.d.ts +0 -40
  552. package/controls/treeview/treeviewchild.d.ts +0 -12
  553. package/esm2015/controls/treeview/ngtreeitemaction.js +0 -60
  554. package/esm2015/controls/treeview/ngtreeitemaction.ngfactory.js +0 -7
  555. package/esm2015/controls/treeview/treeviewchild.js +0 -18
  556. package/esm2015/controls/treeview/treeviewchild.ngfactory.js +0 -7
  557. package/esm2015/utilities/positioning.js +0 -301
  558. package/esm2015/utilities/positioning.ngfactory.js +0 -7
  559. package/esm2015/validation/minlength.validator.js +0 -21
  560. package/esm2015/validation/minlength.validator.ngfactory.js +0 -7
  561. package/simpleangularcontrols-sac-common-10.0.0-rc.3.tgz +0 -0
  562. package/utilities/positioning.d.ts +0 -82
  563. package/validation/minlength.validator.d.ts +0 -2
@@ -1,457 +1,523 @@
1
- import { Directive, ElementRef, EventEmitter, Injector, Input, NgZone, Output, Renderer2, ViewChild, } from '@angular/core';
2
- import { UploadxService } from 'ngx-uploadx';
3
- import { of } from 'rxjs';
4
- import { SacFormLayoutCommon } from '../controls/layout/formlayout';
5
- import { SACICON_SERVICE, SACVALIDATIONKEY_SERVICE, SacDefaultIconService, SacDefaultValidationKeyService, } from '../services';
6
- import { SACLOCALISATION_SERVICE, SacDefaultLocalisationService, } from '../services/sac-localisation.service';
7
- import { Validation } from '../validation';
8
- import { SacBaseModelControl } from './basemodelcontrol';
9
- // #region Classes
10
- /**
11
- * Base Klasse für Uploader Control
12
- */
13
- export class SacUploadBase extends SacBaseModelControl {
14
- // #endregion Properties
15
- // #region Constructors
16
- /**
17
- * Constructor
18
- * @param formlayout SacFormLayoutCommon to define scoped layout settings
19
- * @param injector Injector for injecting services
20
- * @param renderer angular rendering engine
21
- * @param ngZone ngzone for handling external scripts
22
- */
23
- constructor(formlayout, injector, renderer, ngZone) {
24
- super(formlayout, injector);
25
- this.renderer = renderer;
26
- this.ngZone = ngZone;
27
- /**
28
- * Erlaubte Dateitypen
29
- */
30
- this._allowedtypes = '*';
31
- /**
32
- * Files automatisch hochladen
33
- */
34
- this._autoupload = false;
35
- /**
36
- * Pausieren von Uploads erlauben
37
- */
38
- this._enablepause = true;
39
- /**
40
- * API Endpoint
41
- */
42
- this._endpoint = null;
43
- /**
44
- * Upload Settings
45
- */
46
- this.options = {};
47
- /**
48
- * Definiert das Control als Required
49
- */
50
- this.isrequired = false;
51
- /**
52
- * Max. Dateigrösse für Files die hochgeladen werden können. 0 deaktiviert den Filter
53
- */
54
- this.maxfilesize = 0;
55
- /**
56
- * Resource Key für Validation Message Required bei Control
57
- */
58
- this.validationmessagerequired = this.validationKeyService.ValidationErrorRequired;
59
- /**
60
- * Resource Key für Validation Message Required in Validation Summary
61
- */
62
- this.validationmessagesummaryrequired = this.validationKeyService.ValidationErrorSummaryRequired;
63
- /**
64
- * Event wenn ein Error in der Komponente ausgelöst wird.
65
- */
66
- this.onfileerror = new EventEmitter();
67
- /**
68
- * Handling von neuen Files im Input Control
69
- */
70
- this.fileListener = () => {
71
- if (this.uploadInput.nativeElement.files) {
72
- this.uploadService.handleFileList(this.uploadInput.nativeElement.files);
73
- }
74
- };
75
- this.validationKeyService = injector.get(SACVALIDATIONKEY_SERVICE, new SacDefaultValidationKeyService());
76
- this.lngResourceService = injector.get(SACLOCALISATION_SERVICE, new SacDefaultLocalisationService(this.validationKeyService));
77
- this.iconService = injector.get(SACICON_SERVICE, new SacDefaultIconService());
78
- this.uploads = [];
79
- this.options.allowedTypes = '*';
80
- this.options.concurrency = 1;
81
- this.options.token = 'sometoken';
82
- this.options.autoUpload = this._autoupload;
83
- this.options.withCredentials = true;
84
- this.options.chunkSize = 1024 * 16 * 8;
85
- this.options.headers = (f) => ({
86
- 'Content-Disposition': `filename=${encodeURI(f.name)}`,
87
- });
88
- // Init new Service Instance
89
- this.uploadService = new UploadxService(this.ngZone);
90
- this.uploadService.init(this.options);
91
- // Subscripe Event for State changes
92
- this.uploadService.events.subscribe((ufile) => this.onUpload(ufile));
93
- }
94
- // #endregion Constructors
95
- // #region Public Getters And Setters
96
- /**
97
- * Erlaubte Dateitypen für den Upload. Format: ".xxx,.yyy,.zzz"
98
- */
99
- set allowedtypes(types) {
100
- this._allowedtypes = types;
101
- this.setAllowedTypes(types);
102
- }
103
- /**
104
- * Files nach der Auswahl automatisch hochladen
105
- */
106
- set autoupload(v) {
107
- this._autoupload = v;
108
- this.options.autoUpload = v;
109
- this.uploadService.connect(this.options);
110
- }
111
- /**
112
- * Uploads können unterbrochen werden
113
- */
114
- set enablepause(v) {
115
- this._enablepause = v;
116
- }
117
- /**
118
- * Definiert den Registration Endpoint für Uploads.
119
- */
120
- set endpoint(v) {
121
- this._endpoint = v;
122
- this.setEndpoint(v);
123
- }
124
- /**
125
- * Icon for browse button
126
- */
127
- get IconBrowse() {
128
- return this.iconService.UploadComponentBrowseIcon;
129
- }
130
- /**
131
- * icon for continous buttons
132
- */
133
- get IconContinue() {
134
- return this.iconService.UploadComponentContinueIcon;
135
- }
136
- /**
137
- * icon for delete buttons
138
- */
139
- get IconDelete() {
140
- return this.iconService.UploadComponentDeleteIcon;
141
- }
142
- /**
143
- * icon for pause buttons
144
- */
145
- get IconPause() {
146
- return this.iconService.UploadComponentPauseIcon;
147
- }
148
- /**
149
- * icon for upload button
150
- */
151
- get IconUpload() {
152
- return this.iconService.UploadComponentUploadIcon;
153
- }
154
- get allowedtypes() {
155
- return this._allowedtypes;
156
- }
157
- get autoupload() {
158
- return this._autoupload;
159
- }
160
- get enablepause() {
161
- return this._enablepause;
162
- }
163
- get endpoint() {
164
- return this._endpoint;
165
- }
166
- // #endregion Public Getters And Setters
167
- // #region Public Methods
168
- /**
169
- * Name der Datei die Hochgeladen wird
170
- * @returns Observable des Dateinamens.
171
- */
172
- Filename() {
173
- if (this.uploads.length > 0) {
174
- return of(this.uploads[0].name);
175
- }
176
- else {
177
- return this.lngResourceService.GetString(this.validationKeyService.UploadNoFilesSelected);
178
- }
179
- }
180
- /**
181
- * Gibt an ob Queue Elemente beinhaltet
182
- * @returns Elemente in der Queue
183
- */
184
- HasQueueItem() {
185
- return this.uploads.length > 0;
186
- }
187
- /**
188
- * Gibt an ob ein Upload abgeschlossen ist
189
- * @returns Upload erfolgreich
190
- */
191
- HasSuccessUpload() {
192
- if (this.uploads.length > 0) {
193
- return (this.uploads.filter((itm) => itm.status !== 'complete').length === 0);
194
- }
195
- else {
196
- return false;
197
- }
198
- }
199
- /**
200
- * Prüft ob ein Upload pausiert
201
- * @returns Pausierter Upload ist vorhanden
202
- */
203
- IsPaused() {
204
- return this.uploads.filter((itm) => itm.status === 'paused').length > 0;
205
- }
206
- /**
207
- * Prüft ob in der Queue Elemente die zum Upload bereit sind vorhanden sind.
208
- * @returns Elemente für Upload vorhanden
209
- */
210
- IsStateToUpload() {
211
- return (this.uploads.filter((itm) => itm.status === 'added' || itm.status === 'paused').length > 0);
212
- }
213
- /**
214
- * Prüft ob ein Upload eines Files am laufen ist
215
- * @returns Upload ist am laufen
216
- */
217
- IsUploading() {
218
- return this.uploads.filter((itm) => itm.status === 'uploading').length > 0;
219
- }
220
- /**
221
- * Gibt den Uploadfortschritt zurück
222
- * @returns Upload Fortschritt. Wert von 0-100
223
- */
224
- Progress() {
225
- if (this.uploads.length > 0) {
226
- return this.uploads[0].progress;
227
- }
228
- else {
229
- return 0;
230
- }
231
- }
232
- /**
233
- * Cancel single upload
234
- * @param uploadId ID of File to cancel
235
- */
236
- cancel(uploadId) {
237
- this.uploadService.control({ action: 'cancel', uploadId: uploadId });
238
- }
239
- /**
240
- * Cancel all Uploaded files
241
- */
242
- cancelAll() {
243
- if (this.HasQueueItem() === true) {
244
- this.uploadService.control({ action: 'cancel' });
245
- }
246
- }
247
- /**
248
- * Destroy des Controls
249
- */
250
- ngOnDestroy() {
251
- if (this.listenerFn) {
252
- this.listenerFn();
253
- }
254
- }
255
- /**
256
- * Initialisiert das Control
257
- */
258
- ngOnInit() {
259
- super.ngOnInit();
260
- // Init Event Listener for Input File Control and Handling Files
261
- this.listenerFn = this.renderer.listen(this.uploadInput.nativeElement, 'change', this.fileListener);
262
- this.setAllowedTypes(this._allowedtypes);
263
- this.setEndpoint(this._endpoint);
264
- if (this._endpoint === null) {
265
- throw new Error('endpoint is not defined!');
266
- }
267
- this.uploadService.connect(this.options);
268
- }
269
- /**
270
- * Upload Event
271
- *
272
- * @param uploadsOutStream Upload Item
273
- */
274
- onUpload(ufile) {
275
- const index = this.uploads.findIndex((f) => f.uploadId === ufile.uploadId);
276
- if (ufile.status === 'added' || (ufile.status === 'queue' && index < 0)) {
277
- if (this.isExtensionValid(ufile.name) &&
278
- this.isFileSizeValid(ufile.size) &&
279
- this.CustomAddValidation(ufile)) {
280
- this.uploads.push(new SacUploadFile(ufile));
281
- }
282
- else {
283
- this.cancel(ufile.uploadId);
284
- if (!this.isExtensionValid(ufile.name)) {
285
- this.onfileerror.emit('INVALID_EXTENSION');
286
- }
287
- else if (!this.isFileSizeValid(ufile.size)) {
288
- this.onfileerror.emit('INVALID_FILESIZE');
289
- }
290
- }
291
- }
292
- else if (ufile.status === 'cancelled') {
293
- if (index >= 0) {
294
- this.uploads.splice(index, 1);
295
- }
296
- this.SetUploadValue(null);
297
- }
298
- else if (ufile.status === 'complete') {
299
- this.uploads[index].progress = ufile.progress;
300
- this.uploads[index].status = ufile.status;
301
- this.SetUploadValue(ufile);
302
- }
303
- else {
304
- if (index >= 0) {
305
- this.uploads[index].progress = ufile.progress;
306
- this.uploads[index].status = ufile.status;
307
- }
308
- }
309
- this.UpdateFileCount();
310
- }
311
- /**
312
- * Cancel Single File
313
- * @param uploadId ID of File to Cancel
314
- */
315
- pause(uploadId) {
316
- this.uploadService.control({ action: 'pause', uploadId });
317
- }
318
- /**
319
- * Pause all Uploads
320
- */
321
- pauseAll() {
322
- if (this.IsUploading() === true) {
323
- this.uploadService.control({ action: 'pause' });
324
- }
325
- }
326
- /**
327
- * Upload Single File
328
- *
329
- * @param uploadId ID of File to Upload
330
- */
331
- upload(uploadId) {
332
- this.uploadService.control({ action: 'upload', uploadId });
333
- }
334
- /**
335
- * Upload all queued Files
336
- */
337
- uploadAll() {
338
- if (this.IsStateToUpload() === true) {
339
- this.uploadService.control({ action: 'upload' });
340
- }
341
- }
342
- /**
343
- * Validiert das Upload Control
344
- * @param c Control das validiert werden soll
345
- */
346
- validateData(c) {
347
- let error = null;
348
- if (this.isrequired) {
349
- error = Validation.required(this.validationmessagerequired, this.validationmessagesummaryrequired)(c);
350
- }
351
- return error;
352
- }
353
- // #endregion Public Abstract Methods
354
- // #region Private Methods
355
- UpdateFileCount() {
356
- // HACK: Add addition property to FormControl. Can be fixed if solution for ticket: https://github.com/angular/angular/issues/19686
357
- if (this.ngControl) {
358
- this.ngControl.uploadedfilecount =
359
- this.UploadedFileCount();
360
- }
361
- }
362
- /**
363
- * Returns the number of uploaded files
364
- */
365
- UploadedFileCount() {
366
- return this.uploads.filter((itm) => itm.status === 'complete').length;
367
- }
368
- /**
369
- * Prüft ob die Dateierweiterung gültig ist
370
- *
371
- * @param filename Dateiname
372
- */
373
- isExtensionValid(filename) {
374
- if (this._allowedtypes === '*') {
375
- return true;
376
- }
377
- let isValid = false;
378
- const extensions = this._allowedtypes.split(',');
379
- extensions.forEach((itm) => {
380
- if (filename.toLowerCase().endsWith(itm.toLowerCase())) {
381
- isValid = true;
382
- }
383
- });
384
- return isValid;
385
- }
386
- /**
387
- * Prüft ob das File nicht zu gross ist.
388
- *
389
- * @param filesize Max File Size in Bytes
390
- */
391
- isFileSizeValid(filesize) {
392
- if (this.maxfilesize === 0) {
393
- return true;
394
- }
395
- return this.maxfilesize >= filesize;
396
- }
397
- /**
398
- * Setzt die erlaubten Datentypen für den Upload
399
- *
400
- * @param types Erlaubte File Extensions
401
- */
402
- setAllowedTypes(types) {
403
- // Prüfen UploadInput bereits geladen, ist NULL wenn Extension im Markup nach NgModel gesetzt wird.
404
- if (this.uploadInput && this.uploadInput.nativeElement) {
405
- this.renderer.setAttribute(this.uploadInput.nativeElement, 'accept', types);
406
- }
407
- this.options.allowedTypes = types;
408
- }
409
- /**
410
- * Setzt den Upload Endpoit
411
- * @param url Register URI
412
- */
413
- setEndpoint(url) {
414
- this.options.endpoint = url;
415
- }
416
- }
417
- SacUploadBase.decorators = [
418
- { type: Directive }
419
- ];
420
- SacUploadBase.ctorParameters = () => [
421
- { type: SacFormLayoutCommon },
422
- { type: Injector },
423
- { type: Renderer2 },
424
- { type: NgZone }
425
- ];
426
- SacUploadBase.propDecorators = {
427
- uploadInput: [{ type: ViewChild, args: ['files', { static: true },] }],
428
- isrequired: [{ type: Input }],
429
- maxfilesize: [{ type: Input }],
430
- validationmessagerequired: [{ type: Input }],
431
- validationmessagesummaryrequired: [{ type: Input }],
432
- onfileerror: [{ type: Output }],
433
- allowedtypes: [{ type: Input }],
434
- autoupload: [{ type: Input }],
435
- enablepause: [{ type: Input }],
436
- endpoint: [{ type: Input }]
437
- };
438
- /**
439
- * Klasse für den Upload einer Datei in der Upload Component
440
- */
441
- export class SacUploadFile {
442
- // #endregion Properties
443
- // #region Constructors
444
- /**
445
- * Konstruktor
446
- * @param ufile Upload Status
447
- */
448
- constructor(ufile) {
449
- this.uploadId = ufile.uploadId;
450
- this.name = ufile.name;
451
- this.progress = ufile.progress;
452
- this.status = ufile.status;
453
- this.documentid = null;
454
- }
455
- }
456
- // #endregion Classes
457
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZXVwbG9hZGNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiQzovRGF0ZW4vak5ldHdvcmsvY2guam5ldHdvcmsuYW5ndWxhcmNvbnRyb2xzLW5nMTAvY2guam5ldHdvcmsuc2FjLWNvbnRyb2xzL3Byb2plY3RzL3NhYy1jb21tb24vc3JjLyIsInNvdXJjZXMiOlsiY29tbW9uL2Jhc2V1cGxvYWRjb250cm9sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFHTixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQStCLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxRSxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBSXBFLE9BQU8sRUFDTCxlQUFlLEVBQ2Ysd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQiw4QkFBOEIsR0FDL0IsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLHVCQUF1QixFQUN2Qiw2QkFBNkIsR0FDOUIsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXpELGtCQUFrQjtBQUVsQjs7R0FFRztBQUVILE1BQU0sT0FBZ0IsYUFDcEIsU0FBUSxtQkFBMEI7SUFzRmxDLHdCQUF3QjtJQUV4Qix1QkFBdUI7SUFFdkI7Ozs7OztPQU1HO0lBQ0gsWUFDRSxVQUErQixFQUMvQixRQUFrQixFQUNWLFFBQW1CLEVBQ25CLE1BQWM7UUFFdEIsS0FBSyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUhwQixhQUFR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QUFFRCxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbmplY3RvcixcclxuICBJbnB1dCxcclxuICBOZ1pvbmUsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBVcGxvYWRTdGF0ZSwgVXBsb2FkeE9wdGlvbnMsIFVwbG9hZHhTZXJ2aWNlIH0gZnJvbSAnbmd4LXVwbG9hZHgnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTYWNGb3JtTGF5b3V0Q29tbW9uIH0gZnJvbSAnLi4vY29udHJvbHMvbGF5b3V0L2Zvcm1sYXlvdXQnO1xyXG5pbXBvcnQgeyBJU2FjSWNvblNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lTYWNJY29uU2VydmljZSc7XHJcbmltcG9ydCB7IElTYWNMb2NhbGlzYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JU2FjTG9jYWxpc2F0aW9uU2VydmljZSc7XHJcbmltcG9ydCB7IElVcGxvYWRDb250cm9sIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pdXBsb2FkY29udHJvbCc7XHJcbmltcG9ydCB7XHJcbiAgU0FDSUNPTl9TRVJWSUNFLFxyXG4gIFNBQ1ZBTElEQVRJT05LRVlfU0VSVklDRSxcclxuICBTYWNEZWZhdWx0SWNvblNlcnZpY2UsXHJcbiAgU2FjRGVmYXVsdFZhbGlkYXRpb25LZXlTZXJ2aWNlLFxyXG59IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHtcclxuICBTQUNMT0NBTElTQVRJT05fU0VSVklDRSxcclxuICBTYWNEZWZhdWx0TG9jYWxpc2F0aW9uU2VydmljZSxcclxufSBmcm9tICcuLi9zZXJ2aWNlcy9zYWMtbG9jYWxpc2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uIH0gZnJvbSAnLi4vdmFsaWRhdGlvbic7XHJcbmltcG9ydCB7IFNhY0Jhc2VNb2RlbENvbnRyb2wgfSBmcm9tICcuL2Jhc2Vtb2RlbGNvbnRyb2wnO1xyXG5cclxuLy8gI3JlZ2lvbiBDbGFzc2VzXHJcblxyXG4vKipcclxuICogQmFzZSBLbGFzc2UgZsO8ciBVcGxvYWRlciBDb250cm9sXHJcbiAqL1xyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNhY1VwbG9hZEJhc2U8VkFMVUU+XHJcbiAgZXh0ZW5kcyBTYWNCYXNlTW9kZWxDb250cm9sPFZBTFVFPlxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3lcclxue1xyXG4gIC8vICNyZWdpb24gUHJvcGVydGllc1xyXG5cclxuICAvKipcclxuICAgKiBGaWxlIElucHV0IENvbnRyb2xcclxuICAgKi9cclxuICBAVmlld0NoaWxkKCdmaWxlcycsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgcHJpdmF0ZSB1cGxvYWRJbnB1dDogRWxlbWVudFJlZjtcclxuXHJcbiAgLyoqXHJcbiAgICogRXJsYXVidGUgRGF0ZWl0eXBlblxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2FsbG93ZWR0eXBlczogc3RyaW5nID0gJyonO1xyXG4gIC8qKlxyXG4gICAqIEZpbGVzIGF1dG9tYXRpc2NoIGhvY2hsYWRlblxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2F1dG91cGxvYWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBQYXVzaWVyZW4gdm9uIFVwbG9hZHMgZXJsYXViZW5cclxuICAgKi9cclxuICBwcml2YXRlIF9lbmFibGVwYXVzZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgLyoqXHJcbiAgICogQVBJIEVuZHBvaW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZW5kcG9pbnQ6IHN0cmluZyA9IG51bGw7XHJcbiAgLyoqXHJcbiAgICogVXBsb2FkIFNldHRpbmdzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBvcHRpb25zOiBVcGxvYWR4T3B0aW9ucyA9IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBpY29uIHNlcnZpY2UgdG8gcmVjZWl2ZSBpY29ucyBmb3IgdXBsb2FkZXJcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgaWNvblNlcnZpY2U6IElTYWNJY29uU2VydmljZTtcclxuICAvKipcclxuICAgKiBVcGxvYWQgU2VydmljZVxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCB1cGxvYWRTZXJ2aWNlOiBVcGxvYWR4U2VydmljZTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5pZXJ0IGRhcyBDb250cm9sIGFscyBSZXF1aXJlZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBpc3JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICogTWF4LiBEYXRlaWdyw7Zzc2UgZsO8ciBGaWxlcyBkaWUgaG9jaGdlbGFkZW4gd2VyZGVuIGvDtm5uZW4uIDAgZGVha3RpdmllcnQgZGVuIEZpbHRlclxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBtYXhmaWxlc2l6ZTogbnVtYmVyID0gMDtcclxuICAvKipcclxuICAgKiBSZXNvdXJjZSBLZXkgZsO8ciBWYWxpZGF0aW9uIE1lc3NhZ2UgUmVxdWlyZWQgYmVpIENvbnRyb2xcclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgdmFsaWRhdGlvbm1lc3NhZ2VyZXF1aXJlZDogc3RyaW5nID1cclxuICAgIHRoaXMudmFsaWRhdGlvbktleVNlcnZpY2UuVmFsaWRhdGlvbkVycm9yUmVxdWlyZWQ7XHJcbiAgLyoqXHJcbiAgICogUmVzb3VyY2UgS2V5IGbDvHIgVmFsaWRhdGlvbiBNZXNzYWdlIFJlcXVpcmVkIGluIFZhbGlkYXRpb24gU3VtbWFyeVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHZhbGlkYXRpb25tZXNzYWdlc3VtbWFyeXJlcXVpcmVkOiBzdHJpbmcgPVxyXG4gICAgdGhpcy52YWxpZGF0aW9uS2V5U2VydmljZS5WYWxpZGF0aW9uRXJyb3JTdW1tYXJ5UmVxdWlyZWQ7XHJcbiAgLyoqXHJcbiAgICogRXZlbnQgd2VubiBlaW4gRXJyb3IgaW4gZGVyIEtvbXBvbmVudGUgYXVzZ2Vsw7ZzdCB3aXJkLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgb25maWxlZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxpbmcgdm9uIG5ldWVuIEZpbGVzIGltIElucHV0IENvbnRyb2xcclxuICAgKi9cclxuICBwdWJsaWMgZmlsZUxpc3RlbmVyID0gKCkgPT4ge1xyXG4gICAgaWYgKHRoaXMudXBsb2FkSW5wdXQubmF0aXZlRWxlbWVudC5maWxlcykge1xyXG4gICAgICB0aGlzLnVwbG9hZFNlcnZpY2UuaGFuZGxlRmlsZUxpc3QodGhpcy51cGxvYWRJbnB1dC5uYXRpdmVFbGVtZW50LmZpbGVzKTtcclxuICAgIH1cclxuICB9O1xyXG4gIC8qKlxyXG4gICAqIExpc3RlbmVyIGbDvHIgRmlsZXNcclxuICAgKi9cclxuICBwdWJsaWMgbGlzdGVuZXJGbjogKCkgPT4gdm9pZDtcclxuICAvKipcclxuICAgKiBTZXJ2aWNlIGbDvHIgRXJyb3IgTG9jYWxpc2F0aW9uXHJcbiAgICovXHJcbiAgcHVibGljIGxuZ1Jlc291cmNlU2VydmljZTogSVNhY0xvY2FsaXNhdGlvblNlcnZpY2U7XHJcbiAgLyoqXHJcbiAgICogQXJyYXkgdm9uIFVwbG9hZHNcclxuICAgKi9cclxuICBwdWJsaWMgdXBsb2FkczogU2FjVXBsb2FkRmlsZVtdO1xyXG5cclxuICAvLyAjZW5kcmVnaW9uIFByb3BlcnRpZXNcclxuXHJcbiAgLy8gI3JlZ2lvbiBDb25zdHJ1Y3RvcnNcclxuXHJcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0b3JcclxuICAgKiBAcGFyYW0gZm9ybWxheW91dCBTYWNGb3JtTGF5b3V0Q29tbW9uIHRvIGRlZmluZSBzY29wZWQgbGF5b3V0IHNldHRpbmdzXHJcbiAgICogQHBhcmFtIGluamVjdG9yIEluamVjdG9yIGZvciBpbmplY3Rpbmcgc2VydmljZXNcclxuICAgKiBAcGFyYW0gcmVuZGVyZXIgYW5ndWxhciByZW5kZXJpbmcgZW5naW5lXHJcbiAgICogQHBhcmFtIG5nWm9uZSBuZ3pvbmUgZm9yIGhhbmRsaW5nIGV4dGVybmFsIHNjcmlwdHNcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGZvcm1sYXlvdXQ6IFNhY0Zvcm1MYXlvdXRDb21tb24sXHJcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXHJcbiAgKSB7XHJcbiAgICBzdXBlcihmb3JtbGF5b3V0LCBpbmplY3Rvcik7XHJcblxyXG4gICAgdGhpcy52YWxpZGF0aW9uS2V5U2VydmljZSA9IGluamVjdG9yLmdldChcclxuICAgICAgU0FDVkFMSURBVElPTktFWV9TRVJWSUNFLFxyXG4gICAgICBuZXcgU2FjRGVmYXVsdFZhbGlkYXRpb25LZXlTZXJ2aWNlKClcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5sbmdSZXNvdXJjZVNlcnZpY2UgPSBpbmplY3Rvci5nZXQoXHJcbiAgICAgIFNBQ0xPQ0FMSVNBVElPTl9TRVJWSUNFLFxyXG4gICAgICBuZXcgU2FjRGVmYXVsdExvY2FsaXNhdGlvblNlcnZpY2UodGhpcy52YWxpZGF0aW9uS2V5U2VydmljZSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5pY29uU2VydmljZSA9IGluamVjdG9yLmdldChcclxuICAgICAgU0FDSUNPTl9TRVJWSUNFLFxyXG4gICAgICBuZXcgU2FjRGVmYXVsdEljb25TZXJ2aWNlKClcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy51cGxvYWRzID0gW107XHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmFsbG93ZWRUeXBlcyA9ICcqJztcclxuICAgIHRoaXMub3B0aW9ucy5jb25jdXJyZW5jeSA9IDE7XHJcbiAgICB0aGlzLm9wdGlvbnMudG9rZW4gPSAnc29tZXRva2VuJztcclxuICAgIHRoaXMub3B0aW9ucy5hdXRvVXBsb2FkID0gdGhpcy5fYXV0b3VwbG9hZDtcclxuICAgIHRoaXMub3B0aW9ucy53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xyXG4gICAgdGhpcy5vcHRpb25zLmNodW5rU2l6ZSA9IDEwMjQgKiAxNiAqIDg7XHJcbiAgICB0aGlzLm9wdGlvbnMuaGVhZGVycyA9IChmOiBGaWxlKSA9PiAoe1xyXG4gICAgICAnQ29udGVudC1EaXNwb3NpdGlvbic6IGBmaWxlbmFtZT0ke2VuY29kZVVSSShmLm5hbWUpfWAsXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBJbml0IG5ldyBTZXJ2aWNlIEluc3RhbmNlXHJcbiAgICB0aGlzLnVwbG9hZFNlcnZpY2UgPSBuZXcgVXBsb2FkeFNlcnZpY2UodGhpcy5uZ1pvbmUpO1xyXG4gICAgdGhpcy51cGxvYWRTZXJ2aWNlLmluaXQodGhpcy5vcHRpb25zKTtcclxuXHJcbiAgICAvLyBTdWJzY3JpcGUgRXZlbnQgZm9yIFN0YXRlIGNoYW5nZXNcclxuICAgIHRoaXMudXBsb2FkU2VydmljZS5ldmVudHMuc3Vic2NyaWJlKCh1ZmlsZTogVXBsb2FkU3RhdGUpID0+XHJcbiAgICAgIHRoaXMub25VcGxvYWQodWZpbGUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnNcclxuXHJcbiAgLy8gI3JlZ2lvbiBQdWJsaWMgR2V0dGVycyBBbmQgU2V0dGVyc1xyXG5cclxuICAvKipcclxuICAgKiBFcmxhdWJ0ZSBEYXRlaXR5cGVuIGbDvHIgZGVuIFVwbG9hZC4gRm9ybWF0OiBcIi54eHgsLnl5eSwuenp6XCJcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgYWxsb3dlZHR5cGVzKHR5cGVzOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2FsbG93ZWR0eXBlcyA9IHR5cGVzO1xyXG4gICAgdGhpcy5zZXRBbGxvd2VkVHlwZXModHlwZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmlsZXMgbmFjaCBkZXIgQXVzd2FobCBhdXRvbWF0aXNjaCBob2NobGFkZW5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgYXV0b3VwbG9hZCh2OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9hdXRvdXBsb2FkID0gdjtcclxuICAgIHRoaXMub3B0aW9ucy5hdXRvVXBsb2FkID0gdjtcclxuICAgIHRoaXMudXBsb2FkU2VydmljZS5jb25uZWN0KHRoaXMub3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGxvYWRzIGvDtm5uZW4gdW50ZXJicm9jaGVuIHdlcmRlblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBlbmFibGVwYXVzZSh2OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9lbmFibGVwYXVzZSA9IHY7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmllcnQgZGVuIFJlZ2lzdHJhdGlvbiBFbmRwb2ludCBmw7xyIFVwbG9hZHMuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGVuZHBvaW50KHY6IHN0cmluZykge1xyXG4gICAgdGhpcy5fZW5kcG9pbnQgPSB2O1xyXG4gICAgdGhpcy5zZXRFbmRwb2ludCh2KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEljb24gZm9yIGJyb3dzZSBidXR0b25cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IEljb25Ccm93c2UoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLlVwbG9hZENvbXBvbmVudEJyb3dzZUljb247XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBpY29uIGZvciBjb250aW5vdXMgYnV0dG9uc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgSWNvbkNvbnRpbnVlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5VcGxvYWRDb21wb25lbnRDb250aW51ZUljb247XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBpY29uIGZvciBkZWxldGUgYnV0dG9uc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgSWNvbkRlbGV0ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuaWNvblNlcnZpY2UuVXBsb2FkQ29tcG9uZW50RGVsZXRlSWNvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGljb24gZm9yIHBhdXNlIGJ1dHRvbnNcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0IEljb25QYXVzZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuaWNvblNlcnZpY2UuVXBsb2FkQ29tcG9uZW50UGF1c2VJY29uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogaWNvbiBmb3IgdXBsb2FkIGJ1dHRvblxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXQgSWNvblVwbG9hZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuaWNvblNlcnZpY2UuVXBsb2FkQ29tcG9uZW50VXBsb2FkSWNvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgYWxsb3dlZHR5cGVzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dlZHR5cGVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhdXRvdXBsb2FkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1dG91cGxvYWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGVuYWJsZXBhdXNlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZXBhdXNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBlbmRwb2ludCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZHBvaW50O1xyXG4gIH1cclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiBQdWJsaWMgR2V0dGVycyBBbmQgU2V0dGVyc1xyXG5cclxuICAvLyAjcmVnaW9uIFB1YmxpYyBNZXRob2RzXHJcblxyXG4gIC8qKlxyXG4gICAqIE5hbWUgZGVyIERhdGVpIGRpZSBIb2NoZ2VsYWRlbiB3aXJkXHJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBkZXMgRGF0ZWluYW1lbnMuXHJcbiAgICovXHJcbiAgcHVibGljIEZpbGVuYW1lKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICBpZiAodGhpcy51cGxvYWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIG9mKHRoaXMudXBsb2Fkc1swXS5uYW1lKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxuZ1Jlc291cmNlU2VydmljZS5HZXRTdHJpbmcoXHJcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uS2V5U2VydmljZS5VcGxvYWROb0ZpbGVzU2VsZWN0ZWRcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdpYnQgYW4gb2IgUXVldWUgRWxlbWVudGUgYmVpbmhhbHRldFxyXG4gICAqIEByZXR1cm5zIEVsZW1lbnRlIGluIGRlciBRdWV1ZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBIYXNRdWV1ZUl0ZW0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy51cGxvYWRzLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHaWJ0IGFuIG9iIGVpbiBVcGxvYWQgYWJnZXNjaGxvc3NlbiBpc3RcclxuICAgKiBAcmV0dXJucyBVcGxvYWQgZXJmb2xncmVpY2hcclxuICAgKi9cclxuICBwdWJsaWMgSGFzU3VjY2Vzc1VwbG9hZCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLnVwbG9hZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHRoaXMudXBsb2Fkcy5maWx0ZXIoKGl0bSkgPT4gaXRtLnN0YXR1cyAhPT0gJ2NvbXBsZXRlJykubGVuZ3RoID09PSAwXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcsO8ZnQgb2IgZWluIFVwbG9hZCBwYXVzaWVydFxyXG4gICAqIEByZXR1cm5zIFBhdXNpZXJ0ZXIgVXBsb2FkIGlzdCB2b3JoYW5kZW5cclxuICAgKi9cclxuICBwdWJsaWMgSXNQYXVzZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy51cGxvYWRzLmZpbHRlcigoaXRtKSA9PiBpdG0uc3RhdHVzID09PSAncGF1c2VkJykubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByw7xmdCBvYiBpbiBkZXIgUXVldWUgRWxlbWVudGUgZGllIHp1bSBVcGxvYWQgYmVyZWl0IHNpbmQgdm9yaGFuZGVuIHNpbmQuXHJcbiAgICogQHJldHVybnMgRWxlbWVudGUgZsO8ciBVcGxvYWQgdm9yaGFuZGVuXHJcbiAgICovXHJcbiAgcHVibGljIElzU3RhdGVUb1VwbG9hZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMudXBsb2Fkcy5maWx0ZXIoXHJcbiAgICAgICAgKGl0bSkgPT4gaXRtLnN0YXR1cyA9PT0gJ2FkZGVkJyB8fCBpdG0uc3RhdHVzID09PSAncGF1c2VkJ1xyXG4gICAgICApLmxlbmd0aCA+IDBcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQcsO8ZnQgb2IgZWluIFVwbG9hZCBlaW5lcyBGaWxlcyBhbSBsYXVmZW4gaXN0XHJcbiAgICogQHJldHVybnMgVXBsb2FkIGlzdCBhbSBsYXVmZW5cclxuICAgKi9cclxuICBwdWJsaWMgSXNVcGxvYWRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy51cGxvYWRzLmZpbHRlcigoaXRtKSA9PiBpdG0uc3RhdHVzID09PSAndXBsb2FkaW5nJykubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdpYnQgZGVuIFVwbG9hZGZvcnRzY2hyaXR0IHp1csO8Y2tcclxuICAgKiBAcmV0dXJucyBVcGxvYWQgRm9ydHNjaHJpdHQuIFdlcnQgdm9uIDAtMTAwXHJcbiAgICovXHJcbiAgcHVibGljIFByb2dyZXNzKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy51cGxvYWRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIHRoaXMudXBsb2Fkc1swXS5wcm9ncmVzcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FuY2VsIHNpbmdsZSB1cGxvYWRcclxuICAgKiBAcGFyYW0gdXBsb2FkSWQgSUQgb2YgRmlsZSB0byBjYW5jZWxcclxuICAgKi9cclxuICBwdWJsaWMgY2FuY2VsKHVwbG9hZElkKSB7XHJcbiAgICB0aGlzLnVwbG9hZFNlcnZpY2UuY29udHJvbCh7IGFjdGlvbjogJ2NhbmNlbCcsIHVwbG9hZElkOiB1cGxvYWRJZCB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbmNlbCBhbGwgVXBsb2FkZWQgZmlsZXNcclxuICAgKi9cclxuICBwdWJsaWMgY2FuY2VsQWxsKCkge1xyXG4gICAgaWYgKHRoaXMuSGFzUXVldWVJdGVtKCkgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmNvbnRyb2woeyBhY3Rpb246ICdjYW5jZWwnIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVzdHJveSBkZXMgQ29udHJvbHNcclxuICAgKi9cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5saXN0ZW5lckZuKSB7XHJcbiAgICAgIHRoaXMubGlzdGVuZXJGbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGlzaWVydCBkYXMgQ29udHJvbFxyXG4gICAqL1xyXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICAvLyBJbml0IEV2ZW50IExpc3RlbmVyIGZvciBJbnB1dCBGaWxlIENvbnRyb2wgYW5kIEhhbmRsaW5nIEZpbGVzXHJcbiAgICB0aGlzLmxpc3RlbmVyRm4gPSB0aGlzLnJlbmRlcmVyLmxpc3RlbihcclxuICAgICAgdGhpcy51cGxvYWRJbnB1dC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAnY2hhbmdlJyxcclxuICAgICAgdGhpcy5maWxlTGlzdGVuZXJcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5zZXRBbGxvd2VkVHlwZXModGhpcy5fYWxsb3dlZHR5cGVzKTtcclxuICAgIHRoaXMuc2V0RW5kcG9pbnQodGhpcy5fZW5kcG9pbnQpO1xyXG5cclxuICAgIGlmICh0aGlzLl9lbmRwb2ludCA9PT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuZHBvaW50IGlzIG5vdCBkZWZpbmVkIScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBsb2FkU2VydmljZS5jb25uZWN0KHRoaXMub3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGxvYWQgRXZlbnRcclxuICAgKlxyXG4gICAqIEBwYXJhbSB1cGxvYWRzT3V0U3RyZWFtIFVwbG9hZCBJdGVtXHJcbiAgICovXHJcbiAgcHVibGljIG9uVXBsb2FkKHVmaWxlOiBVcGxvYWRTdGF0ZSkge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnVwbG9hZHMuZmluZEluZGV4KChmKSA9PiBmLnVwbG9hZElkID09PSB1ZmlsZS51cGxvYWRJZCk7XHJcblxyXG4gICAgaWYgKHVmaWxlLnN0YXR1cyA9PT0gJ2FkZGVkJyB8fCAodWZpbGUuc3RhdHVzID09PSAncXVldWUnICYmIGluZGV4IDwgMCkpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuaXNFeHRlbnNpb25WYWxpZCh1ZmlsZS5uYW1lKSAmJlxyXG4gICAgICAgIHRoaXMuaXNGaWxlU2l6ZVZhbGlkKHVmaWxlLnNpemUpICYmXHJcbiAgICAgICAgdGhpcy5DdXN0b21BZGRWYWxpZGF0aW9uKHVmaWxlKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnVwbG9hZHMucHVzaChuZXcgU2FjVXBsb2FkRmlsZSh1ZmlsZSkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY2FuY2VsKHVmaWxlLnVwbG9hZElkKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzRXh0ZW5zaW9uVmFsaWQodWZpbGUubmFtZSkpIHtcclxuICAgICAgICAgIHRoaXMub25maWxlZXJyb3IuZW1pdCgnSU5WQUxJRF9FWFRFTlNJT04nKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzRmlsZVNpemVWYWxpZCh1ZmlsZS5zaXplKSkge1xyXG4gICAgICAgICAgdGhpcy5vbmZpbGVlcnJvci5lbWl0KCdJTlZBTElEX0ZJTEVTSVpFJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHVmaWxlLnN0YXR1cyA9PT0gJ2NhbmNlbGxlZCcpIHtcclxuICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICB0aGlzLnVwbG9hZHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5TZXRVcGxvYWRWYWx1ZShudWxsKTtcclxuICAgIH0gZWxzZSBpZiAodWZpbGUuc3RhdHVzID09PSAnY29tcGxldGUnKSB7XHJcbiAgICAgIHRoaXMudXBsb2Fkc1tpbmRleF0ucHJvZ3Jlc3MgPSB1ZmlsZS5wcm9ncmVzcztcclxuICAgICAgdGhpcy51cGxvYWRzW2luZGV4XS5zdGF0dXMgPSB1ZmlsZS5zdGF0dXM7XHJcbiAgICAgIHRoaXMuU2V0VXBsb2FkVmFsdWUodWZpbGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICB0aGlzLnVwbG9hZHNbaW5kZXhdLnByb2dyZXNzID0gdWZpbGUucHJvZ3Jlc3M7XHJcbiAgICAgICAgdGhpcy51cGxvYWRzW2luZGV4XS5zdGF0dXMgPSB1ZmlsZS5zdGF0dXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLlVwZGF0ZUZpbGVDb3VudCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FuY2VsIFNpbmdsZSBGaWxlXHJcbiAgICogQHBhcmFtIHVwbG9hZElkIElEIG9mIEZpbGUgdG8gQ2FuY2VsXHJcbiAgICovXHJcbiAgcHVibGljIHBhdXNlKHVwbG9hZElkKSB7XHJcbiAgICB0aGlzLnVwbG9hZFNlcnZpY2UuY29udHJvbCh7IGFjdGlvbjogJ3BhdXNlJywgdXBsb2FkSWQgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXVzZSBhbGwgVXBsb2Fkc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBwYXVzZUFsbCgpIHtcclxuICAgIGlmICh0aGlzLklzVXBsb2FkaW5nKCkgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmNvbnRyb2woeyBhY3Rpb246ICdwYXVzZScgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGxvYWQgU2luZ2xlIEZpbGVcclxuICAgKlxyXG4gICAqIEBwYXJhbSB1cGxvYWRJZCBJRCBvZiBGaWxlIHRvIFVwbG9hZFxyXG4gICAqL1xyXG4gIHB1YmxpYyB1cGxvYWQodXBsb2FkSWQpIHtcclxuICAgIHRoaXMudXBsb2FkU2VydmljZS5jb250cm9sKHsgYWN0aW9uOiAndXBsb2FkJywgdXBsb2FkSWQgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGxvYWQgYWxsIHF1ZXVlZCBGaWxlc1xyXG4gICAqL1xyXG4gIHB1YmxpYyB1cGxvYWRBbGwoKSB7XHJcbiAgICBpZiAodGhpcy5Jc1N0YXRlVG9VcGxvYWQoKSA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLnVwbG9hZFNlcnZpY2UuY29udHJvbCh7IGFjdGlvbjogJ3VwbG9hZCcgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGllcnQgZGFzIFVwbG9hZCBDb250cm9sXHJcbiAgICogQHBhcmFtIGMgQ29udHJvbCBkYXMgdmFsaWRpZXJ0IHdlcmRlbiBzb2xsXHJcbiAgICovXHJcbiAgcHVibGljIHZhbGlkYXRlRGF0YShjOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XHJcbiAgICBsZXQgZXJyb3I6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5pc3JlcXVpcmVkKSB7XHJcbiAgICAgIGVycm9yID0gVmFsaWRhdGlvbi5yZXF1aXJlZChcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25tZXNzYWdlcmVxdWlyZWQsXHJcbiAgICAgICAgdGhpcy52YWxpZGF0aW9ubWVzc2FnZXN1bW1hcnlyZXF1aXJlZFxyXG4gICAgICApKGMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBlcnJvcjtcclxuICB9XHJcblxyXG4gIC8vICNlbmRyZWdpb24gUHVibGljIE1ldGhvZHNcclxuXHJcbiAgLy8gI3JlZ2lvbiBQdWJsaWMgQWJzdHJhY3QgTWV0aG9kc1xyXG5cclxuICAvKipcclxuICAgKiBNZXRob2RlIGthbm4gZsO8ciBDb250cm9scyB2ZXJ3ZW5kZXQgd2VyZGVuLCB6dXPDpHR6bGljaGUgVmFsaWRpZXJ1bmdlbiBiZWkgaGluenVmw7xnZW4gZGVyIEZpbGVzIHp1IG1hY2hlblxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZpbGUgRmlsZSBkYXMgaGluenVnZWbDvGd0IHd1cmRlLlxyXG4gICAqIEByZXR1cm5zIFZhbGRpZXJ1bmcgaXN0IGVyZm9sZ3JlaWNoXHJcbiAgICovXHJcbiAgcHVibGljIGFic3RyYWN0IEN1c3RvbUFkZFZhbGlkYXRpb24oZmlsZTogVXBsb2FkU3RhdGUpOiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIE1ldGhvZGUgd2VsY2hlIGRpZSBVcGxvYWQgSUQncyBpbiBkYXMgTW9kZWwgc2V0enQgb2RlciBsw7ZzY2h0XHJcbiAgICpcclxuICAgKiBAcGFyYW0gZmlsZSBUeXBlIHZvbiBGaWxlIElEJ3NcclxuICAgKi9cclxuICBwdWJsaWMgYWJzdHJhY3QgU2V0VXBsb2FkVmFsdWUoZmlsZTogVXBsb2FkU3RhdGUpOiB2b2lkO1xyXG5cclxuICAvLyAjZW5kcmVnaW9uIFB1YmxpYyBBYnN0cmFjdCBNZXRob2RzXHJcblxyXG4gIC8vICNyZWdpb24gUHJpdmF0ZSBNZXRob2RzXHJcblxyXG4gIHByaXZhdGUgVXBkYXRlRmlsZUNvdW50KCk6IHZvaWQge1xyXG4gICAgLy8gSEFDSzogQWRkIGFkZGl0aW9uIHByb3BlcnR5IHRvIEZvcm1Db250cm9sLiBDYW4gYmUgZml4ZWQgaWYgc29sdXRpb24gZm9yIHRpY2tldDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTk2ODZcclxuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xyXG4gICAgICAodGhpcy5uZ0NvbnRyb2wgYXMgdW5rbm93biBhcyBJVXBsb2FkQ29udHJvbCkudXBsb2FkZWRmaWxlY291bnQgPVxyXG4gICAgICAgIHRoaXMuVXBsb2FkZWRGaWxlQ291bnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB1cGxvYWRlZCBmaWxlc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgVXBsb2FkZWRGaWxlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnVwbG9hZHMuZmlsdGVyKChpdG0pID0+IGl0bS5zdGF0dXMgPT09ICdjb21wbGV0ZScpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByw7xmdCBvYiBkaWUgRGF0ZWllcndlaXRlcnVuZyBnw7xsdGlnIGlzdFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZpbGVuYW1lIERhdGVpbmFtZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNFeHRlbnNpb25WYWxpZChmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5fYWxsb3dlZHR5cGVzID09PSAnKicpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGlzVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0IGV4dGVuc2lvbnM6IHN0cmluZ1tdID0gdGhpcy5fYWxsb3dlZHR5cGVzLnNwbGl0KCcsJyk7XHJcblxyXG4gICAgZXh0ZW5zaW9ucy5mb3JFYWNoKChpdG0pID0+IHtcclxuICAgICAgaWYgKGZpbGVuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoaXRtLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgaXNWYWxpZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBpc1ZhbGlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHLDvGZ0IG9iIGRhcyBGaWxlIG5pY2h0IHp1IGdyb3NzIGlzdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBmaWxlc2l6ZSBNYXggRmlsZSBTaXplIGluIEJ5dGVzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0ZpbGVTaXplVmFsaWQoZmlsZXNpemU6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMubWF4ZmlsZXNpemUgPT09IDApIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubWF4ZmlsZXNpemUgPj0gZmlsZXNpemU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR6dCBkaWUgZXJsYXVidGVuIERhdGVudHlwZW4gZsO8ciBkZW4gVXBsb2FkXHJcbiAgICpcclxuICAgKiBAcGFyYW0gdHlwZXMgRXJsYXVidGUgRmlsZSBFeHRlbnNpb25zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRBbGxvd2VkVHlwZXModHlwZXM6IHN0cmluZykge1xyXG4gICAgLy8gUHLDvGZlbiBVcGxvYWRJbnB1dCBiZXJlaXRzIGdlbGFkZW4sIGlzdCBOVUxMIHdlbm4gRXh0ZW5zaW9uIGltIE1hcmt1cCBuYWNoIE5nTW9kZWwgZ2VzZXR6dCB3aXJkLlxyXG4gICAgaWYgKHRoaXMudXBsb2FkSW5wdXQgJiYgdGhpcy51cGxvYWRJbnB1dC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKFxyXG4gICAgICAgIHRoaXMudXBsb2FkSW5wdXQubmF0aXZlRWxlbWVudCxcclxuICAgICAgICAnYWNjZXB0JyxcclxuICAgICAgICB0eXBlc1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucy5hbGxvd2VkVHlwZXMgPSB0eXBlcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHp0IGRlbiBVcGxvYWQgRW5kcG9pdFxyXG4gICAqIEBwYXJhbSB1cmwgUmVnaXN0ZXIgVVJJXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRFbmRwb2ludCh1cmw6IHN0cmluZykge1xyXG4gICAgdGhpcy5vcHRpb25zLmVuZHBvaW50ID0gdXJsO1xyXG4gIH1cclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiBQcml2YXRlIE1ldGhvZHNcclxufVxyXG5cclxuLyoqXHJcbiAqIEtsYXNzZSBmw7xyIGRlbiBVcGxvYWQgZWluZXIgRGF0ZWkgaW4gZGVyIFVwbG9hZCBDb21wb25lbnRcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTYWNVcGxvYWRGaWxlIHtcclxuICAvLyAjcmVnaW9uIFByb3BlcnRpZXNcclxuXHJcbiAgLyoqXHJcbiAgICogRG9jdW1lbnQgSURcclxuICAgKi9cclxuICBwdWJsaWMgZG9jdW1lbnRpZDogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIERhdGVpbmFtZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogVXBsb2FkIEZvcnRzY2hyaXR0XHJcbiAgICovXHJcbiAgcHVibGljIHByb2dyZXNzOiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogVXBsb2FkIFN0YXR1c1xyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0dXM6IHN0cmluZztcclxuICAvKipcclxuICAgKiBVcGxvYWQgSURcclxuICAgKi9cclxuICBwdWJsaWMgdXBsb2FkSWQ6IHN0cmluZztcclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiBQcm9wZXJ0aWVzXHJcblxyXG4gIC8vICNyZWdpb24gQ29uc3RydWN0b3JzXHJcblxyXG4gIC8qKlxyXG4gICAqIEtvbnN0cnVrdG9yXHJcbiAgICogQHBhcmFtIHVmaWxlIFVwbG9hZCBTdGF0dXNcclxuICAgKi9cclxuICBjb25zdHJ1Y3Rvcih1ZmlsZTogVXBsb2FkU3RhdGUpIHtcclxuICAgIHRoaXMudXBsb2FkSWQgPSB1ZmlsZS51cGxvYWRJZDtcclxuICAgIHRoaXMubmFtZSA9IHVmaWxlLm5hbWU7XHJcbiAgICB0aGlzLnByb2dyZXNzID0gdWZpbGUucHJvZ3Jlc3M7XHJcbiAgICB0aGlzLnN0YXR1cyA9IHVmaWxlLnN0YXR1cztcclxuICAgIHRoaXMuZG9jdW1lbnRpZCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyAjZW5kcmVnaW9uIENvbnN0cnVjdG9yc1xyXG59XHJcblxyXG4vLyAjZW5kcmVnaW9uIENsYXNzZXNcclxuIl19
1
+ import { SacFormLayoutCommon } from '../controls/layout/formlayout';
2
+ import { SACVALIDATIONKEY_SERVICE, SacDefaultValidationKeyService } from '../services';
3
+ import { SACLOCALISATION_SERVICE, SacDefaultLocalisationService } from '../services/sac-localisation.service';
4
+ import { Validation } from '../validation';
5
+ import { SacBaseModelControl } from './basemodelcontrol';
6
+ import { Directive, ElementRef, EventEmitter, Injector, Input, NgZone, Output, Renderer2, ViewChild, } from '@angular/core';
7
+ import { UploadxService } from 'ngx-uploadx';
8
+ import { of } from 'rxjs';
9
+ // #region Exported Classes
10
+ /**
11
+ * Base class for uploader control
12
+ */
13
+ export class SacUploadBase extends SacBaseModelControl {
14
+ // #endregion Properties
15
+ // #region Constructors
16
+ /**
17
+ * Constructor
18
+ * @param formlayout SacFormLayoutCommon to define scoped layout settings
19
+ * @param injector Injector for injecting services
20
+ * @param renderer angular rendering engine
21
+ * @param ngZone ngzone for handling external scripts
22
+ */
23
+ constructor(formlayout, injector, renderer, ngZone) {
24
+ super(formlayout, injector);
25
+ this.renderer = renderer;
26
+ this.ngZone = ngZone;
27
+ // #region Properties
28
+ /**
29
+ * Allowed file types
30
+ */
31
+ this._allowedtypes = '*';
32
+ /**
33
+ * Automatically uploads files
34
+ */
35
+ this._autoupload = false;
36
+ /**
37
+ * Allow pausing of uploads
38
+ */
39
+ this._enablepause = true;
40
+ /**
41
+ * API Endpoint
42
+ */
43
+ this._endpoint = null;
44
+ /**
45
+ * Token for Bearer Authentication
46
+ */
47
+ this._token = null;
48
+ /**
49
+ * Upload Settings
50
+ */
51
+ this.options = {};
52
+ /**
53
+ * Handling of new files in the input control
54
+ */
55
+ this.fileListener = () => {
56
+ // exit if files is null or undefined
57
+ if (!this.uploadInput.nativeElement.files) {
58
+ return;
59
+ }
60
+ if (this.GetMaxFiles() > 0) {
61
+ const maxFiles = this.GetMaxFiles() + this.UploadedFileCount();
62
+ const possibleFiles = maxFiles - this.uploadInput.nativeElement.files.length;
63
+ if (possibleFiles < 0) {
64
+ const dataTransfer = new DataTransfer();
65
+ const files = Array.from(this.uploadInput.nativeElement.files).splice(0, this.uploadInput.nativeElement.files.length + possibleFiles);
66
+ // clone files
67
+ files.forEach((file) => dataTransfer.items.add(file));
68
+ this.uploadInput.nativeElement.files = dataTransfer.files;
69
+ }
70
+ }
71
+ this.uploadService.handleFileList(this.uploadInput.nativeElement.files);
72
+ };
73
+ /**
74
+ * Defines the control as required
75
+ */
76
+ this.isrequired = false;
77
+ /**
78
+ * Max. file size for files that can be uploaded. 0 disables the filter
79
+ */
80
+ this.maxfilesize = 0;
81
+ /**
82
+ * Event when an error is triggered in the component.
83
+ */
84
+ this.onfileerror = new EventEmitter();
85
+ /**
86
+ * Event when a file has been uploaded. The event is triggered for multiple uploads per file.
87
+ */
88
+ this.onuploadcomplete = new EventEmitter();
89
+ /**
90
+ * Resource key for validation message 'required' at control
91
+ */
92
+ this.validationmessagerequired = this.validationKeyService.ValidationErrorRequired;
93
+ /**
94
+ * Resource key for validation message 'required' in validation summary
95
+ */
96
+ this.validationmessagesummaryrequired = this.validationKeyService.ValidationErrorSummaryRequired;
97
+ this.validationKeyService = injector.get(SACVALIDATIONKEY_SERVICE, new SacDefaultValidationKeyService());
98
+ this.lngResourceService = injector.get(SACLOCALISATION_SERVICE, new SacDefaultLocalisationService(this.validationKeyService));
99
+ this.uploads = [];
100
+ this.options.allowedTypes = '*';
101
+ this.options.concurrency = 1;
102
+ this.options.token = 'sometoken';
103
+ this.options.autoUpload = this._autoupload;
104
+ this.options.withCredentials = true;
105
+ this.options.chunkSize = 1024 * 16 * 8;
106
+ this.options.headers = (f) => ({
107
+ 'Content-Disposition': `filename=${encodeURI(f.name)}`,
108
+ });
109
+ // Init new Service Instance
110
+ this.uploadService = new UploadxService(this.ngZone);
111
+ this.uploadService.init(this.options);
112
+ // Subscripe Event for State changes
113
+ this.uploadService.events.subscribe((ufile) => this.onUpload(ufile));
114
+ }
115
+ // #endregion Constructors
116
+ // #region Public Getters And Setters
117
+ /**
118
+ * Icon for browse button
119
+ */
120
+ get IconBrowse() {
121
+ return this.iconService.UploadComponentBrowseIcon;
122
+ }
123
+ /**
124
+ * icon for continous buttons
125
+ */
126
+ get IconContinue() {
127
+ return this.iconService.UploadComponentContinueIcon;
128
+ }
129
+ /**
130
+ * icon for delete buttons
131
+ */
132
+ get IconDelete() {
133
+ return this.iconService.UploadComponentDeleteIcon;
134
+ }
135
+ /**
136
+ * icon for pause buttons
137
+ */
138
+ get IconPause() {
139
+ return this.iconService.UploadComponentPauseIcon;
140
+ }
141
+ /**
142
+ * icon for upload button
143
+ */
144
+ get IconUpload() {
145
+ return this.iconService.UploadComponentUploadIcon;
146
+ }
147
+ get allowedtypes() {
148
+ return this._allowedtypes;
149
+ }
150
+ /**
151
+ * Allowed file types for upload. Format: ".xxx,.yyy,.zzz"
152
+ */
153
+ set allowedtypes(types) {
154
+ this._allowedtypes = types;
155
+ this.setAllowedTypes(types);
156
+ }
157
+ /**
158
+ * Indicates whether files should be uploaded automatically after selection.
159
+ * @returns true when auto-upload is enabled.
160
+ */
161
+ get autoupload() {
162
+ return this._autoupload;
163
+ }
164
+ /**
165
+ * Automatically uploads files after selection.
166
+ * @param v true to enable automatic upload.
167
+ */
168
+ set autoupload(v) {
169
+ this._autoupload = v;
170
+ this.options.autoUpload = v;
171
+ this.uploadService.connect(this.options);
172
+ }
173
+ /**
174
+ * Indicates whether upload pause is allowed.
175
+ * @returns true when pause support is active.
176
+ */
177
+ get enablepause() {
178
+ return this._enablepause;
179
+ }
180
+ /**
181
+ * Uploads can be paused.
182
+ * @param v true to allow pausing uploads.
183
+ */
184
+ set enablepause(v) {
185
+ this._enablepause = v;
186
+ }
187
+ /**
188
+ * API endpoint for upload registration.
189
+ * @returns configured endpoint URL.
190
+ */
191
+ get endpoint() {
192
+ return this._endpoint;
193
+ }
194
+ /**
195
+ * Defines the registration endpoint for uploads.
196
+ * @param v upload endpoint URL.
197
+ */
198
+ set endpoint(v) {
199
+ this._endpoint = v;
200
+ this.setEndpoint(v);
201
+ }
202
+ /**
203
+ * Bearer authentication token used by upload service.
204
+ * @returns current auth token or null.
205
+ */
206
+ get token() {
207
+ return this._token;
208
+ }
209
+ /**
210
+ * Sets Bearer authentication token for service requests.
211
+ * @param v token string or null to clear token.
212
+ */
213
+ set token(v) {
214
+ this._token = v;
215
+ this.setToken(v);
216
+ }
217
+ /**
218
+ * Name of the file being uploaded
219
+ * @returns Observable of the file name.
220
+ */
221
+ Filename() {
222
+ if (this.uploads.length > 0) {
223
+ return of(this.uploads[0].name);
224
+ }
225
+ else {
226
+ return this.lngResourceService.GetString(this.validationKeyService.UploadNoFilesSelected);
227
+ }
228
+ }
229
+ /**
230
+ * Indicates whether the queue contains elements
231
+ * @returns Elements in the queue
232
+ */
233
+ HasQueueItem() {
234
+ return this.uploads.length > 0;
235
+ }
236
+ /**
237
+ * Indicates whether an upload is complete
238
+ * @returns Upload successful
239
+ */
240
+ HasSuccessUpload() {
241
+ if (this.uploads.length > 0) {
242
+ return this.uploads.filter((itm) => itm.status !== 'complete').length === 0;
243
+ }
244
+ else {
245
+ return false;
246
+ }
247
+ }
248
+ /**
249
+ * Checks if an upload is paused
250
+ * @returns Paused upload is present
251
+ */
252
+ IsPaused() {
253
+ return this.uploads.filter((itm) => itm.status === 'paused').length > 0;
254
+ }
255
+ /**
256
+ * Checks if there are elements in the queue ready for upload.
257
+ * @returns Elements available for upload
258
+ */
259
+ IsStateToUpload() {
260
+ return this.uploads.filter((itm) => itm.status === 'added' || itm.status === 'paused').length > 0;
261
+ }
262
+ /**
263
+ * Checks if a file upload is in progress
264
+ * @returns Upload is in progress
265
+ */
266
+ IsUploading() {
267
+ return this.uploads.filter((itm) => itm.status === 'uploading').length > 0;
268
+ }
269
+ /**
270
+ * Returns the upload progress
271
+ * @returns Upload progress. Value from 0-100
272
+ */
273
+ Progress() {
274
+ if (this.uploads.length > 0) {
275
+ return this.uploads[0].progress;
276
+ }
277
+ else {
278
+ return 0;
279
+ }
280
+ }
281
+ /**
282
+ * Cancel single upload
283
+ * @param uploadId ID of File to cancel
284
+ */
285
+ cancel(uploadId) {
286
+ this.uploadService.control({ action: 'cancel', uploadId: uploadId });
287
+ }
288
+ /**
289
+ * Cancel all Uploaded files
290
+ */
291
+ cancelAll() {
292
+ if (this.HasQueueItem() === true) {
293
+ this.uploadService.control({ action: 'cancel' });
294
+ }
295
+ }
296
+ /**
297
+ * Destroy the control
298
+ */
299
+ ngOnDestroy() {
300
+ if (this.listenerFn) {
301
+ this.listenerFn();
302
+ }
303
+ }
304
+ /**
305
+ * Initializes the control
306
+ */
307
+ ngOnInit() {
308
+ super.ngOnInit();
309
+ // Init Event Listener for Input File Control and Handling Files
310
+ this.listenerFn = this.renderer.listen(this.uploadInput.nativeElement, 'change', this.fileListener);
311
+ this.setAllowedTypes(this._allowedtypes);
312
+ this.setEndpoint(this._endpoint);
313
+ this.setToken(this._token);
314
+ if (this._endpoint === null) {
315
+ throw new Error('endpoint is not defined!');
316
+ }
317
+ this.uploadService.connect(this.options);
318
+ }
319
+ /**
320
+ * Upload event
321
+ *
322
+ * @param uploadsOutStream Upload item
323
+ */
324
+ onUpload(ufile) {
325
+ const index = this.uploads.findIndex((f) => f.uploadId === ufile.uploadId);
326
+ if (ufile.status === 'added' || (ufile.status === 'queue' && index < 0)) {
327
+ if (this.isExtensionValid(ufile.name) &&
328
+ this.isFileSizeValid(ufile.size) &&
329
+ this.CustomAddValidation(ufile)) {
330
+ this.uploads.push(new SacUploadFile(ufile));
331
+ }
332
+ else {
333
+ this.cancel(ufile.uploadId);
334
+ if (!this.isExtensionValid(ufile.name)) {
335
+ this.onfileerror.emit('INVALID_EXTENSION');
336
+ }
337
+ else if (!this.isFileSizeValid(ufile.size)) {
338
+ this.onfileerror.emit('INVALID_FILESIZE');
339
+ }
340
+ }
341
+ }
342
+ else if (ufile.status === 'cancelled') {
343
+ if (index >= 0) {
344
+ this.uploads.splice(index, 1);
345
+ }
346
+ this.SetUploadValue(null);
347
+ }
348
+ else if (ufile.status === 'complete') {
349
+ this.uploads[index].progress = ufile.progress;
350
+ this.uploads[index].status = ufile.status;
351
+ this.SetUploadValue(ufile);
352
+ const uploadState = {
353
+ name: ufile.name,
354
+ size: ufile.size,
355
+ uploadid: this.uploads[index].uploadId,
356
+ };
357
+ this.onuploadcomplete.emit(uploadState);
358
+ }
359
+ else {
360
+ if (index >= 0) {
361
+ this.uploads[index].progress = ufile.progress;
362
+ this.uploads[index].status = ufile.status;
363
+ }
364
+ }
365
+ this.UpdateFileCount();
366
+ }
367
+ /**
368
+ * Cancel single file
369
+ * @param uploadId ID of file to cancel
370
+ */
371
+ pause(uploadId) {
372
+ this.uploadService.control({ action: 'pause', uploadId });
373
+ }
374
+ /**
375
+ * Pause all uploads
376
+ */
377
+ pauseAll() {
378
+ if (this.IsUploading() === true) {
379
+ this.uploadService.control({ action: 'pause' });
380
+ }
381
+ }
382
+ /**
383
+ * Sets the bearer token in the upload service
384
+ */
385
+ setToken(value) {
386
+ this.options.token = value;
387
+ }
388
+ /**
389
+ * Upload Single File
390
+ *
391
+ * @param uploadId ID of File to Upload
392
+ */
393
+ upload(uploadId) {
394
+ this.uploadService.control({ action: 'upload', uploadId });
395
+ }
396
+ /**
397
+ * Upload all queued Files
398
+ */
399
+ uploadAll() {
400
+ if (this.IsStateToUpload() === true) {
401
+ this.uploadService.control({ action: 'upload' });
402
+ }
403
+ }
404
+ /**
405
+ * Validates the upload control
406
+ * @param c Control to be validated
407
+ */
408
+ validateData(c) {
409
+ let error = null;
410
+ if (this.isrequired) {
411
+ error = Validation.required(this.validationmessagerequired, this.validationmessagesummaryrequired)(c);
412
+ }
413
+ return error;
414
+ }
415
+ // #endregion Protected Methods
416
+ // #region Private Methods
417
+ /**
418
+ * Updates the file count on the form control
419
+ */
420
+ UpdateFileCount() {
421
+ // HACK: Add addition property to FormControl. Can be fixed if solution for ticket: https://github.com/angular/angular/issues/19686
422
+ if (this.ngControl) {
423
+ this.ngControl.uploadedfilecount = this.UploadedFileCount();
424
+ }
425
+ }
426
+ /**
427
+ * Returns the number of uploaded files
428
+ */
429
+ UploadedFileCount() {
430
+ return this.uploads.filter((itm) => itm.status === 'complete').length;
431
+ }
432
+ /**
433
+ * Checks whether the file extension is valid
434
+ *
435
+ * @param filename File name
436
+ */
437
+ isExtensionValid(filename) {
438
+ if (this._allowedtypes === '*') {
439
+ return true;
440
+ }
441
+ let isValid = false;
442
+ const extensions = this._allowedtypes.split(',');
443
+ extensions.forEach((itm) => {
444
+ if (filename.toLowerCase().endsWith(itm.toLowerCase())) {
445
+ isValid = true;
446
+ }
447
+ });
448
+ return isValid;
449
+ }
450
+ /**
451
+ * Checks if the file is not too large.
452
+ *
453
+ * @param filesize Max file size in bytes
454
+ */
455
+ isFileSizeValid(filesize) {
456
+ if (this.maxfilesize === 0) {
457
+ return true;
458
+ }
459
+ return this.maxfilesize >= filesize;
460
+ }
461
+ /**
462
+ * Sets the allowed data types for upload
463
+ *
464
+ * @param types Allowed file extensions
465
+ */
466
+ setAllowedTypes(types) {
467
+ // Check if uploadInput is already loaded; is NULL when the directive is set after NgModel in the markup.
468
+ if (this.uploadInput && this.uploadInput.nativeElement) {
469
+ this.renderer.setAttribute(this.uploadInput.nativeElement, 'accept', types);
470
+ }
471
+ this.options.allowedTypes = types;
472
+ }
473
+ /**
474
+ * Sets the upload endpoint
475
+ * @param url Register URI
476
+ */
477
+ setEndpoint(url) {
478
+ this.options.endpoint = url;
479
+ }
480
+ }
481
+ SacUploadBase.decorators = [
482
+ { type: Directive }
483
+ ];
484
+ SacUploadBase.ctorParameters = () => [
485
+ { type: SacFormLayoutCommon },
486
+ { type: Injector },
487
+ { type: Renderer2 },
488
+ { type: NgZone }
489
+ ];
490
+ SacUploadBase.propDecorators = {
491
+ uploadInput: [{ type: ViewChild, args: ['files', { static: true },] }],
492
+ isrequired: [{ type: Input }],
493
+ maxfilesize: [{ type: Input }],
494
+ onfileerror: [{ type: Output }],
495
+ onuploadcomplete: [{ type: Output }],
496
+ validationmessagerequired: [{ type: Input }],
497
+ validationmessagesummaryrequired: [{ type: Input }],
498
+ allowedtypes: [{ type: Input }],
499
+ autoupload: [{ type: Input }],
500
+ enablepause: [{ type: Input }],
501
+ endpoint: [{ type: Input }],
502
+ token: [{ type: Input }]
503
+ };
504
+ /**
505
+ * Class for uploading a file in the upload component
506
+ */
507
+ export class SacUploadFile {
508
+ // #endregion Properties
509
+ // #region Constructors
510
+ /**
511
+ * Constructor
512
+ * @param ufile Upload state
513
+ */
514
+ constructor(ufile) {
515
+ this.uploadId = ufile.uploadId;
516
+ this.name = ufile.name;
517
+ this.progress = ufile.progress;
518
+ this.status = ufile.status;
519
+ this.documentid = null;
520
+ }
521
+ }
522
+ // #endregion Exported Classes
523
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZXVwbG9hZGNvbnRyb2wuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvc2ltcGxlYW5ndWxhcmNvbnRyb2xzL3NpbXBsZWFuZ3VsYXJjb250cm9scy9jaC5qbmV0d29yay5zYWMtY29udHJvbHMvcHJvamVjdHMvc2FjLWNvbW1vbi9zcmMvIiwic291cmNlcyI6WyJjb21tb24vYmFzZXVwbG9hZGNvbnRyb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJcEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLDhCQUE4QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzlHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBQ0wsTUFBTSxFQUdOLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBK0IsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFFLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEMsMkJBQTJCO0FBRTNCOztHQUVHO0FBRUgsTUFBTSxPQUFnQixhQUFxQixTQUFRLG1CQUEwQjtJQThIekUsd0JBQXdCO0lBRXhCLHVCQUF1QjtJQUV2Qjs7Ozs7O09BTUc7SUFDSCxZQUNJLFVBQStCLEVBQy9CLFFBQWtCLEVBQ1YsUUFBbUIsRUFDbkIsTUFBYztRQUV0QixLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBSHBCLGFBQVEsR0FBUixRQUFRLENBQVc7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VlY7O0dBRUc7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQTRCdEIsd0JBQXdCO0lBRXhCLHVCQUF1QjtJQUV2Qjs7O09BR0c7SUFDSCxZQUFZLEtBQWtCO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO0NBR0o7QUFFRCw4QkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTYWNGb3JtTGF5b3V0Q29tbW9uIH0gZnJvbSAnLi4vY29udHJvbHMvbGF5b3V0L2Zvcm1sYXlvdXQnO1xuaW1wb3J0IHsgSVNhY0xvY2FsaXNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lTYWNMb2NhbGlzYXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IElTYWNVcGxvYWRFdmVudENvbXBsZXRlU3RhdGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lTYWNVcGxvYWRFdmVudENvbXBsZXRlU3RhdGUnO1xuaW1wb3J0IHsgSVVwbG9hZENvbnRyb2wgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2l1cGxvYWRjb250cm9sJztcbmltcG9ydCB7IFNBQ1ZBTElEQVRJT05LRVlfU0VSVklDRSwgU2FjRGVmYXVsdFZhbGlkYXRpb25LZXlTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgU0FDTE9DQUxJU0FUSU9OX1NFUlZJQ0UsIFNhY0RlZmF1bHRMb2NhbGlzYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc2FjLWxvY2FsaXNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tICcuLi92YWxpZGF0aW9uJztcbmltcG9ydCB7IFNhY0Jhc2VNb2RlbENvbnRyb2wgfSBmcm9tICcuL2Jhc2Vtb2RlbGNvbnRyb2wnO1xuaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVXBsb2FkU3RhdGUsIFVwbG9hZHhPcHRpb25zLCBVcGxvYWR4U2VydmljZSB9IGZyb20gJ25neC11cGxvYWR4JztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5cbi8vICNyZWdpb24gRXhwb3J0ZWQgQ2xhc3Nlc1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIHVwbG9hZGVyIGNvbnRyb2xcbiAqL1xuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2FjVXBsb2FkQmFzZTxWQUxVRT4gZXh0ZW5kcyBTYWNCYXNlTW9kZWxDb250cm9sPFZBTFVFPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICAvLyAjcmVnaW9uIFByb3BlcnRpZXNcblxuICAgIC8qKlxuICAgICAqIEFsbG93ZWQgZmlsZSB0eXBlc1xuICAgICAqL1xuICAgIHByaXZhdGUgX2FsbG93ZWR0eXBlcyA9ICcqJztcblxuICAgIC8qKlxuICAgICAqIEF1dG9tYXRpY2FsbHkgdXBsb2FkcyBmaWxlc1xuICAgICAqL1xuICAgIHByaXZhdGUgX2F1dG91cGxvYWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFsbG93IHBhdXNpbmcgb2YgdXBsb2Fkc1xuICAgICAqL1xuICAgIHByaXZhdGUgX2VuYWJsZXBhdXNlID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEFQSSBFbmRwb2ludFxuICAgICAqL1xuICAgIHByaXZhdGUgX2VuZHBvaW50OiBzdHJpbmcgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVG9rZW4gZm9yIEJlYXJlciBBdXRoZW50aWNhdGlvblxuICAgICAqL1xuICAgIHByaXZhdGUgX3Rva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCBTZXR0aW5nc1xuICAgICAqL1xuICAgIHByaXZhdGUgb3B0aW9uczogVXBsb2FkeE9wdGlvbnMgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEZpbGUgSW5wdXQgQ29udHJvbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2ZpbGVzJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwcml2YXRlIHVwbG9hZElucHV0OiBFbGVtZW50UmVmO1xuXG4gICAgLyoqXG4gICAgICogVXBsb2FkIFNlcnZpY2VcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBsb2FkU2VydmljZTogVXBsb2FkeFNlcnZpY2U7XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGluZyBvZiBuZXcgZmlsZXMgaW4gdGhlIGlucHV0IGNvbnRyb2xcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAvLyBleGl0IGlmIGZpbGVzIGlzIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgIGlmICghdGhpcy51cGxvYWRJbnB1dC5uYXRpdmVFbGVtZW50LmZpbGVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5HZXRNYXhGaWxlcygpID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbWF4RmlsZXMgPSB0aGlzLkdldE1heEZpbGVzKCkgKyB0aGlzLlVwbG9hZGVkRmlsZUNvdW50KCk7XG4gICAgICAgICAgICBjb25zdCBwb3NzaWJsZUZpbGVzID0gbWF4RmlsZXMgLSB0aGlzLnVwbG9hZElucHV0Lm5hdGl2ZUVsZW1lbnQuZmlsZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAocG9zc2libGVGaWxlcyA8IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhVHJhbnNmZXIgPSBuZXcgRGF0YVRyYW5zZmVyKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20odGhpcy51cGxvYWRJbnB1dC5uYXRpdmVFbGVtZW50LmZpbGVzKS5zcGxpY2UoXG4gICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkSW5wdXQubmF0aXZlRWxlbWVudC5maWxlcy5sZW5ndGggKyBwb3NzaWJsZUZpbGVzXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIGNsb25lIGZpbGVzXG4gICAgICAgICAgICAgICAgZmlsZXMuZm9yRWFjaCgoZmlsZTogRmlsZSkgPT4gZGF0YVRyYW5zZmVyLml0ZW1zLmFkZChmaWxlKSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZElucHV0Lm5hdGl2ZUVsZW1lbnQuZmlsZXMgPSBkYXRhVHJhbnNmZXIuZmlsZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwbG9hZFNlcnZpY2UuaGFuZGxlRmlsZUxpc3QodGhpcy51cGxvYWRJbnB1dC5uYXRpdmVFbGVtZW50LmZpbGVzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgY29udHJvbCBhcyByZXF1aXJlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlzcmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIExpc3RlbmVyIGZvciBmaWxlc1xuICAgICAqL1xuICAgIHB1YmxpYyBsaXN0ZW5lckZuOiAoKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogU2VydmljZSBmw7xyIEVycm9yIExvY2FsaXNhdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBsbmdSZXNvdXJjZVNlcnZpY2U6IElTYWNMb2NhbGlzYXRpb25TZXJ2aWNlO1xuXG4gICAgLyoqXG4gICAgICogTWF4LiBmaWxlIHNpemUgZm9yIGZpbGVzIHRoYXQgY2FuIGJlIHVwbG9hZGVkLiAwIGRpc2FibGVzIHRoZSBmaWx0ZXJcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtYXhmaWxlc2l6ZSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGVuIGFuIGVycm9yIGlzIHRyaWdnZXJlZCBpbiB0aGUgY29tcG9uZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbmZpbGVlcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbiBhIGZpbGUgaGFzIGJlZW4gdXBsb2FkZWQuIFRoZSBldmVudCBpcyB0cmlnZ2VyZWQgZm9yIG11bHRpcGxlIHVwbG9hZHMgcGVyIGZpbGUuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9udXBsb2FkY29tcGxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPElTYWNVcGxvYWRFdmVudENvbXBsZXRlU3RhdGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiB1cGxvYWRzXG4gICAgICovXG4gICAgcHVibGljIHVwbG9hZHM6IFNhY1VwbG9hZEZpbGVbXTtcblxuICAgIC8qKlxuICAgICAqIFJlc291cmNlIGtleSBmb3IgdmFsaWRhdGlvbiBtZXNzYWdlICdyZXF1aXJlZCcgYXQgY29udHJvbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHZhbGlkYXRpb25tZXNzYWdlcmVxdWlyZWQ6IHN0cmluZyA9IHRoaXMudmFsaWRhdGlvbktleVNlcnZpY2UuVmFsaWRhdGlvbkVycm9yUmVxdWlyZWQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXNvdXJjZSBrZXkgZm9yIHZhbGlkYXRpb24gbWVzc2FnZSAncmVxdWlyZWQnIGluIHZhbGlkYXRpb24gc3VtbWFyeVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHZhbGlkYXRpb25tZXNzYWdlc3VtbWFyeXJlcXVpcmVkOiBzdHJpbmcgPSB0aGlzLnZhbGlkYXRpb25LZXlTZXJ2aWNlLlZhbGlkYXRpb25FcnJvclN1bW1hcnlSZXF1aXJlZDtcblxuICAgIC8vICNlbmRyZWdpb24gUHJvcGVydGllc1xuXG4gICAgLy8gI3JlZ2lvbiBDb25zdHJ1Y3RvcnNcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIGZvcm1sYXlvdXQgU2FjRm9ybUxheW91dENvbW1vbiB0byBkZWZpbmUgc2NvcGVkIGxheW91dCBzZXR0aW5nc1xuICAgICAqIEBwYXJhbSBpbmplY3RvciBJbmplY3RvciBmb3IgaW5qZWN0aW5nIHNlcnZpY2VzXG4gICAgICogQHBhcmFtIHJlbmRlcmVyIGFuZ3VsYXIgcmVuZGVyaW5nIGVuZ2luZVxuICAgICAqIEBwYXJhbSBuZ1pvbmUgbmd6b25lIGZvciBoYW5kbGluZyBleHRlcm5hbCBzY3JpcHRzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGZvcm1sYXlvdXQ6IFNhY0Zvcm1MYXlvdXRDb21tb24sXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGZvcm1sYXlvdXQsIGluamVjdG9yKTtcblxuICAgICAgICB0aGlzLnZhbGlkYXRpb25LZXlTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KFNBQ1ZBTElEQVRJT05LRVlfU0VSVklDRSwgbmV3IFNhY0RlZmF1bHRWYWxpZGF0aW9uS2V5U2VydmljZSgpKTtcblxuICAgICAgICB0aGlzLmxuZ1Jlc291cmNlU2VydmljZSA9IGluamVjdG9yLmdldChcbiAgICAgICAgICAgIFNBQ0xPQ0FMSVNBVElPTl9TRVJWSUNFLFxuICAgICAgICAgICAgbmV3IFNhY0RlZmF1bHRMb2NhbGlzYXRpb25TZXJ2aWNlKHRoaXMudmFsaWRhdGlvbktleVNlcnZpY2UpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy51cGxvYWRzID0gW107XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLmFsbG93ZWRUeXBlcyA9ICcqJztcbiAgICAgICAgdGhpcy5vcHRpb25zLmNvbmN1cnJlbmN5ID0gMTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuID0gJ3NvbWV0b2tlbic7XG4gICAgICAgIHRoaXMub3B0aW9ucy5hdXRvVXBsb2FkID0gdGhpcy5fYXV0b3VwbG9hZDtcbiAgICAgICAgdGhpcy5vcHRpb25zLndpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gICAgICAgIHRoaXMub3B0aW9ucy5jaHVua1NpemUgPSAxMDI0ICogMTYgKiA4O1xuICAgICAgICB0aGlzLm9wdGlvbnMuaGVhZGVycyA9IChmOiBGaWxlKSA9PiAoe1xuICAgICAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb24nOiBgZmlsZW5hbWU9JHtlbmNvZGVVUkkoZi5uYW1lKX1gLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJbml0IG5ldyBTZXJ2aWNlIEluc3RhbmNlXG4gICAgICAgIHRoaXMudXBsb2FkU2VydmljZSA9IG5ldyBVcGxvYWR4U2VydmljZSh0aGlzLm5nWm9uZSk7XG4gICAgICAgIHRoaXMudXBsb2FkU2VydmljZS5pbml0KHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgLy8gU3Vic2NyaXBlIEV2ZW50IGZvciBTdGF0ZSBjaGFuZ2VzXG4gICAgICAgIHRoaXMudXBsb2FkU2VydmljZS5ldmVudHMuc3Vic2NyaWJlKCh1ZmlsZTogVXBsb2FkU3RhdGUpID0+IHRoaXMub25VcGxvYWQodWZpbGUpKTtcbiAgICB9XG5cbiAgICAvLyAjZW5kcmVnaW9uIENvbnN0cnVjdG9yc1xuXG4gICAgLy8gI3JlZ2lvbiBQdWJsaWMgR2V0dGVycyBBbmQgU2V0dGVyc1xuXG4gICAgLyoqXG4gICAgICogSWNvbiBmb3IgYnJvd3NlIGJ1dHRvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgSWNvbkJyb3dzZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5VcGxvYWRDb21wb25lbnRCcm93c2VJY29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGljb24gZm9yIGNvbnRpbm91cyBidXR0b25zXG4gICAgICovXG4gICAgcHVibGljIGdldCBJY29uQ29udGludWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWNvblNlcnZpY2UuVXBsb2FkQ29tcG9uZW50Q29udGludWVJY29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGljb24gZm9yIGRlbGV0ZSBidXR0b25zXG4gICAgICovXG4gICAgcHVibGljIGdldCBJY29uRGVsZXRlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLlVwbG9hZENvbXBvbmVudERlbGV0ZUljb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaWNvbiBmb3IgcGF1c2UgYnV0dG9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgSWNvblBhdXNlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLlVwbG9hZENvbXBvbmVudFBhdXNlSWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBpY29uIGZvciB1cGxvYWQgYnV0dG9uXG4gICAgICovXG4gICAgcHVibGljIGdldCBJY29uVXBsb2FkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLlVwbG9hZENvbXBvbmVudFVwbG9hZEljb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhbGxvd2VkdHlwZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbG93ZWR0eXBlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd2VkIGZpbGUgdHlwZXMgZm9yIHVwbG9hZC4gRm9ybWF0OiBcIi54eHgsLnl5eSwuenp6XCJcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgYWxsb3dlZHR5cGVzKHR5cGVzOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fYWxsb3dlZHR5cGVzID0gdHlwZXM7XG4gICAgICAgIHRoaXMuc2V0QWxsb3dlZFR5cGVzKHR5cGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBmaWxlcyBzaG91bGQgYmUgdXBsb2FkZWQgYXV0b21hdGljYWxseSBhZnRlciBzZWxlY3Rpb24uXG4gICAgICogQHJldHVybnMgdHJ1ZSB3aGVuIGF1dG8tdXBsb2FkIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCBhdXRvdXBsb2FkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0b3VwbG9hZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdXRvbWF0aWNhbGx5IHVwbG9hZHMgZmlsZXMgYWZ0ZXIgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB2IHRydWUgdG8gZW5hYmxlIGF1dG9tYXRpYyB1cGxvYWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGF1dG91cGxvYWQodjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9hdXRvdXBsb2FkID0gdjtcbiAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9VcGxvYWQgPSB2O1xuICAgICAgICB0aGlzLnVwbG9hZFNlcnZpY2UuY29ubmVjdCh0aGlzLm9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHVwbG9hZCBwYXVzZSBpcyBhbGxvd2VkLlxuICAgICAqIEByZXR1cm5zIHRydWUgd2hlbiBwYXVzZSBzdXBwb3J0IGlzIGFjdGl2ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVuYWJsZXBhdXNlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlcGF1c2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBsb2FkcyBjYW4gYmUgcGF1c2VkLlxuICAgICAqIEBwYXJhbSB2IHRydWUgdG8gYWxsb3cgcGF1c2luZyB1cGxvYWRzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBlbmFibGVwYXVzZSh2OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZXBhdXNlID0gdjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBUEkgZW5kcG9pbnQgZm9yIHVwbG9hZCByZWdpc3RyYXRpb24uXG4gICAgICogQHJldHVybnMgY29uZmlndXJlZCBlbmRwb2ludCBVUkwuXG4gICAgICovXG4gICAgcHVibGljIGdldCBlbmRwb2ludCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5kcG9pbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgcmVnaXN0cmF0aW9uIGVuZHBvaW50IGZvciB1cGxvYWRzLlxuICAgICAqIEBwYXJhbSB2IHVwbG9hZCBlbmRwb2ludCBVUkwuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGVuZHBvaW50KHY6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9lbmRwb2ludCA9IHY7XG4gICAgICAgIHRoaXMuc2V0RW5kcG9pbnQodik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmVhcmVyIGF1dGhlbnRpY2F0aW9uIHRva2VuIHVzZWQgYnkgdXBsb2FkIHNlcnZpY2UuXG4gICAgICogQHJldHVybnMgY3VycmVudCBhdXRoIHRva2VuIG9yIG51bGwuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0b2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rva2VuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgQmVhcmVyIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZvciBzZXJ2aWNlIHJlcXVlc3RzLlxuICAgICAqIEBwYXJhbSB2IHRva2VuIHN0cmluZyBvciBudWxsIHRvIGNsZWFyIHRva2VuLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCB0b2tlbih2OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX3Rva2VuID0gdjtcbiAgICAgICAgdGhpcy5zZXRUb2tlbih2KTtcbiAgICB9XG5cbiAgICAvLyAjZW5kcmVnaW9uIFB1YmxpYyBHZXR0ZXJzIEFuZCBTZXR0ZXJzXG5cbiAgICAvLyAjcmVnaW9uIFB1YmxpYyBNZXRob2RzXG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgY2FuIGJlIHVzZWQgZm9yIGNvbnRyb2xzIHRvIHBlcmZvcm0gYWRkaXRpb25hbCB2YWxpZGF0aW9ucyB3aGVuIGFkZGluZyBmaWxlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGZpbGUgRmlsZSB0aGF0IHdhcyBhZGRlZC5cbiAgICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIGlzIHN1Y2Nlc3NmdWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgQ3VzdG9tQWRkVmFsaWRhdGlvbihmaWxlOiBVcGxvYWRTdGF0ZSk6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBmaWxlIGJlaW5nIHVwbG9hZGVkXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiB0aGUgZmlsZSBuYW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyBGaWxlbmFtZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICBpZiAodGhpcy51cGxvYWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBvZih0aGlzLnVwbG9hZHNbMF0ubmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sbmdSZXNvdXJjZVNlcnZpY2UuR2V0U3RyaW5nKHRoaXMudmFsaWRhdGlvbktleVNlcnZpY2UuVXBsb2FkTm9GaWxlc1NlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBxdWV1ZSBjb250YWlucyBlbGVtZW50c1xuICAgICAqIEByZXR1cm5zIEVsZW1lbnRzIGluIHRoZSBxdWV1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBIYXNRdWV1ZUl0ZW0oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnVwbG9hZHMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhbiB1cGxvYWQgaXMgY29tcGxldGVcbiAgICAgKiBAcmV0dXJucyBVcGxvYWQgc3VjY2Vzc2Z1bFxuICAgICAqL1xuICAgIHB1YmxpYyBIYXNTdWNjZXNzVXBsb2FkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy51cGxvYWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwbG9hZHMuZmlsdGVyKChpdG0pID0+IGl0bS5zdGF0dXMgIT09ICdjb21wbGV0ZScpLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiB1cGxvYWQgaXMgcGF1c2VkXG4gICAgICogQHJldHVybnMgUGF1c2VkIHVwbG9hZCBpcyBwcmVzZW50XG4gICAgICovXG4gICAgcHVibGljIElzUGF1c2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRzLmZpbHRlcigoaXRtKSA9PiBpdG0uc3RhdHVzID09PSAncGF1c2VkJykubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlcmUgYXJlIGVsZW1lbnRzIGluIHRoZSBxdWV1ZSByZWFkeSBmb3IgdXBsb2FkLlxuICAgICAqIEByZXR1cm5zIEVsZW1lbnRzIGF2YWlsYWJsZSBmb3IgdXBsb2FkXG4gICAgICovXG4gICAgcHVibGljIElzU3RhdGVUb1VwbG9hZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBsb2Fkcy5maWx0ZXIoKGl0bSkgPT4gaXRtLnN0YXR1cyA9PT0gJ2FkZGVkJyB8fCBpdG0uc3RhdHVzID09PSAncGF1c2VkJykubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBmaWxlIHVwbG9hZCBpcyBpbiBwcm9ncmVzc1xuICAgICAqIEByZXR1cm5zIFVwbG9hZCBpcyBpbiBwcm9ncmVzc1xuICAgICAqL1xuICAgIHB1YmxpYyBJc1VwbG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBsb2Fkcy5maWx0ZXIoKGl0bSkgPT4gaXRtLnN0YXR1cyA9PT0gJ3VwbG9hZGluZycpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdXBsb2FkIHByb2dyZXNzXG4gICAgICogQHJldHVybnMgVXBsb2FkIHByb2dyZXNzLiBWYWx1ZSBmcm9tIDAtMTAwXG4gICAgICovXG4gICAgcHVibGljIFByb2dyZXNzKCk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLnVwbG9hZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBsb2Fkc1swXS5wcm9ncmVzcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIHRoYXQgc2V0cyBvciBkZWxldGVzIHRoZSB1cGxvYWQgSURzIGluIHRoZSBtb2RlbFxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbGUgVHlwZSBvZiBmaWxlIElEc1xuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBTZXRVcGxvYWRWYWx1ZShmaWxlOiBVcGxvYWRTdGF0ZSk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgc2luZ2xlIHVwbG9hZFxuICAgICAqIEBwYXJhbSB1cGxvYWRJZCBJRCBvZiBGaWxlIHRvIGNhbmNlbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYW5jZWwodXBsb2FkSWQpIHtcbiAgICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmNvbnRyb2woeyBhY3Rpb246ICdjYW5jZWwnLCB1cGxvYWRJZDogdXBsb2FkSWQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VsIGFsbCBVcGxvYWRlZCBmaWxlc1xuICAgICAqL1xuICAgIHB1YmxpYyBjYW5jZWxBbGwoKSB7XG4gICAgICAgIGlmICh0aGlzLkhhc1F1ZXVlSXRlbSgpID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZFNlcnZpY2UuY29udHJvbCh7IGFjdGlvbjogJ2NhbmNlbCcgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSBjb250cm9sXG4gICAgICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5lckZuKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyRm4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHRoZSBjb250cm9sXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICAvLyBJbml0IEV2ZW50IExpc3RlbmVyIGZvciBJbnB1dCBGaWxlIENvbnRyb2wgYW5kIEhhbmRsaW5nIEZpbGVzXG4gICAgICAgIHRoaXMubGlzdGVuZXJGbiA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMudXBsb2FkSW5wdXQubmF0aXZlRWxlbWVudCwgJ2NoYW5nZScsIHRoaXMuZmlsZUxpc3RlbmVyKTtcblxuICAgICAgICB0aGlzLnNldEFsbG93ZWRUeXBlcyh0aGlzLl9hbGxvd2VkdHlwZXMpO1xuICAgICAgICB0aGlzLnNldEVuZHBvaW50KHRoaXMuX2VuZHBvaW50KTtcbiAgICAgICAgdGhpcy5zZXRUb2tlbih0aGlzLl90b2tlbik7XG5cbiAgICAgICAgaWYgKHRoaXMuX2VuZHBvaW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuZHBvaW50IGlzIG5vdCBkZWZpbmVkIScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmNvbm5lY3QodGhpcy5vcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWQgZXZlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cGxvYWRzT3V0U3RyZWFtIFVwbG9hZCBpdGVtXG4gICAgICovXG4gICAgcHVibGljIG9uVXBsb2FkKHVmaWxlOiBVcGxvYWRTdGF0ZSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudXBsb2Fkcy5maW5kSW5kZXgoKGYpID0+IGYudXBsb2FkSWQgPT09IHVmaWxlLnVwbG9hZElkKTtcblxuICAgICAgICBpZiAodWZpbGUuc3RhdHVzID09PSAnYWRkZWQnIHx8ICh1ZmlsZS5zdGF0dXMgPT09ICdxdWV1ZScgJiYgaW5kZXggPCAwKSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuaXNFeHRlbnNpb25WYWxpZCh1ZmlsZS5uYW1lKSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaXNGaWxlU2l6ZVZhbGlkKHVmaWxlLnNpemUpICYmXG4gICAgICAgICAgICAgICAgdGhpcy5DdXN0b21BZGRWYWxpZGF0aW9uKHVmaWxlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWRzLnB1c2gobmV3IFNhY1VwbG9hZEZpbGUodWZpbGUpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWwodWZpbGUudXBsb2FkSWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRXh0ZW5zaW9uVmFsaWQodWZpbGUubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmZpbGVlcnJvci5lbWl0KCdJTlZBTElEX0VYVEVOU0lPTicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNGaWxlU2l6ZVZhbGlkKHVmaWxlLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25maWxlZXJyb3IuZW1pdCgnSU5WQUxJRF9GSUxFU0laRScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh1ZmlsZS5zdGF0dXMgPT09ICdjYW5jZWxsZWQnKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBsb2Fkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLlNldFVwbG9hZFZhbHVlKG51bGwpO1xuICAgICAgICB9IGVsc2UgaWYgKHVmaWxlLnN0YXR1cyA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRzW2luZGV4XS5wcm9ncmVzcyA9IHVmaWxlLnByb2dyZXNzO1xuICAgICAgICAgICAgdGhpcy51cGxvYWRzW2luZGV4XS5zdGF0dXMgPSB1ZmlsZS5zdGF0dXM7XG4gICAgICAgICAgICB0aGlzLlNldFVwbG9hZFZhbHVlKHVmaWxlKTtcblxuICAgICAgICAgICAgY29uc3QgdXBsb2FkU3RhdGU6IElTYWNVcGxvYWRFdmVudENvbXBsZXRlU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogdWZpbGUubmFtZSxcbiAgICAgICAgICAgICAgICBzaXplOiB1ZmlsZS5zaXplLFxuICAgICAgICAgICAgICAgIHVwbG9hZGlkOiB0aGlzLnVwbG9hZHNbaW5kZXhdLnVwbG9hZElkLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5vbnVwbG9hZGNvbXBsZXRlLmVtaXQodXBsb2FkU3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZHNbaW5kZXhdLnByb2dyZXNzID0gdWZpbGUucHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWRzW2luZGV4XS5zdGF0dXMgPSB1ZmlsZS5zdGF0dXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLlVwZGF0ZUZpbGVDb3VudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbmNlbCBzaW5nbGUgZmlsZVxuICAgICAqIEBwYXJhbSB1cGxvYWRJZCBJRCBvZiBmaWxlIHRvIGNhbmNlbFxuICAgICAqL1xuICAgIHB1YmxpYyBwYXVzZSh1cGxvYWRJZCkge1xuICAgICAgICB0aGlzLnVwbG9hZFNlcnZpY2UuY29udHJvbCh7IGFjdGlvbjogJ3BhdXNlJywgdXBsb2FkSWQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2UgYWxsIHVwbG9hZHNcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF1c2VBbGwoKSB7XG4gICAgICAgIGlmICh0aGlzLklzVXBsb2FkaW5nKCkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkU2VydmljZS5jb250cm9sKHsgYWN0aW9uOiAncGF1c2UnIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYmVhcmVyIHRva2VuIGluIHRoZSB1cGxvYWQgc2VydmljZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRUb2tlbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50b2tlbiA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCBTaW5nbGUgRmlsZVxuICAgICAqXG4gICAgICogQHBhcmFtIHVwbG9hZElkIElEIG9mIEZpbGUgdG8gVXBsb2FkXG4gICAgICovXG4gICAgcHVibGljIHVwbG9hZCh1cGxvYWRJZCkge1xuICAgICAgICB0aGlzLnVwbG9hZFNlcnZpY2UuY29udHJvbCh7IGFjdGlvbjogJ3VwbG9hZCcsIHVwbG9hZElkIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCBhbGwgcXVldWVkIEZpbGVzXG4gICAgICovXG4gICAgcHVibGljIHVwbG9hZEFsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuSXNTdGF0ZVRvVXBsb2FkKCkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkU2VydmljZS5jb250cm9sKHsgYWN0aW9uOiAndXBsb2FkJyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlcyB0aGUgdXBsb2FkIGNvbnRyb2xcbiAgICAgKiBAcGFyYW0gYyBDb250cm9sIHRvIGJlIHZhbGlkYXRlZFxuICAgICAqL1xuICAgIHB1YmxpYyB2YWxpZGF0ZURhdGEoYzogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgICAgICBsZXQgZXJyb3I6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5pc3JlcXVpcmVkKSB7XG4gICAgICAgICAgICBlcnJvciA9IFZhbGlkYXRpb24ucmVxdWlyZWQodGhpcy52YWxpZGF0aW9ubWVzc2FnZXJlcXVpcmVkLCB0aGlzLnZhbGlkYXRpb25tZXNzYWdlc3VtbWFyeXJlcXVpcmVkKShjKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9XG5cbiAgICAvLyAjZW5kcmVnaW9uIFB1YmxpYyBNZXRob2RzXG5cbiAgICAvLyAjcmVnaW9uIFByb3RlY3RlZCBNZXRob2RzXG5cbiAgICAvKipcbiAgICAgKiBnZXQgbWF4LiBmaWxlcyB0aGF0IGNhbiBiZSB1cGxvYWRlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBHZXRNYXhGaWxlcygpOiBudW1iZXI7XG5cbiAgICAvLyAjZW5kcmVnaW9uIFByb3RlY3RlZCBNZXRob2RzXG5cbiAgICAvLyAjcmVnaW9uIFByaXZhdGUgTWV0aG9kc1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgZmlsZSBjb3VudCBvbiB0aGUgZm9ybSBjb250cm9sXG4gICAgICovXG4gICAgcHJpdmF0ZSBVcGRhdGVGaWxlQ291bnQoKTogdm9pZCB7XG4gICAgICAgIC8vIEhBQ0s6IEFkZCBhZGRpdGlvbiBwcm9wZXJ0eSB0byBGb3JtQ29udHJvbC4gQ2FuIGJlIGZpeGVkIGlmIHNvbHV0aW9uIGZvciB0aWNrZXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE5Njg2XG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgKHRoaXMubmdDb250cm9sIGFzIHVua25vd24gYXMgSVVwbG9hZENvbnRyb2wpLnVwbG9hZGVkZmlsZWNvdW50ID0gdGhpcy5VcGxvYWRlZEZpbGVDb3VudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHVwbG9hZGVkIGZpbGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBVcGxvYWRlZEZpbGVDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRzLmZpbHRlcigoaXRtKSA9PiBpdG0uc3RhdHVzID09PSAnY29tcGxldGUnKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGZpbGUgZXh0ZW5zaW9uIGlzIHZhbGlkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsZW5hbWUgRmlsZSBuYW1lXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0V4dGVuc2lvblZhbGlkKGZpbGVuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX2FsbG93ZWR0eXBlcyA9PT0gJyonKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbnM6IHN0cmluZ1tdID0gdGhpcy5fYWxsb3dlZHR5cGVzLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgZXh0ZW5zaW9ucy5mb3JFYWNoKChpdG0pID0+IHtcbiAgICAgICAgICAgIGlmIChmaWxlbmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGl0bS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGZpbGUgaXMgbm90IHRvbyBsYXJnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlc2l6ZSBNYXggZmlsZSBzaXplIGluIGJ5dGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0ZpbGVTaXplVmFsaWQoZmlsZXNpemU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5tYXhmaWxlc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5tYXhmaWxlc2l6ZSA+PSBmaWxlc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhbGxvd2VkIGRhdGEgdHlwZXMgZm9yIHVwbG9hZFxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGVzIEFsbG93ZWQgZmlsZSBleHRlbnNpb25zXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRBbGxvd2VkVHlwZXModHlwZXM6IHN0cmluZykge1xuICAgICAgICAvLyBDaGVjayBpZiB1cGxvYWRJbnB1dCBpcyBhbHJlYWR5IGxvYWRlZDsgaXMgTlVMTCB3aGVuIHRoZSBkaXJlY3RpdmUgaXMgc2V0IGFmdGVyIE5nTW9kZWwgaW4gdGhlIG1hcmt1cC5cbiAgICAgICAgaWYgKHRoaXMudXBsb2FkSW5wdXQgJiYgdGhpcy51cGxvYWRJbnB1dC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLnVwbG9hZElucHV0Lm5hdGl2ZUVsZW1lbnQsICdhY2NlcHQnLCB0eXBlcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wdGlvbnMuYWxsb3dlZFR5cGVzID0gdHlwZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdXBsb2FkIGVuZHBvaW50XG4gICAgICogQHBhcmFtIHVybCBSZWdpc3RlciBVUklcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldEVuZHBvaW50KHVybDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5lbmRwb2ludCA9IHVybDtcbiAgICB9XG5cbiAgICAvLyAjZW5kcmVnaW9uIFByaXZhdGUgTWV0aG9kc1xufVxuXG4vKipcbiAqIENsYXNzIGZvciB1cGxvYWRpbmcgYSBmaWxlIGluIHRoZSB1cGxvYWQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBTYWNVcGxvYWRGaWxlIHtcbiAgICAvLyAjcmVnaW9uIFByb3BlcnRpZXNcblxuICAgIC8qKlxuICAgICAqIERvY3VtZW50IElEXG4gICAgICovXG4gICAgcHVibGljIGRvY3VtZW50aWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEZpbGUgbmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWQgcHJvZ3Jlc3NcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvZ3Jlc3M6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCBzdGF0dXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdHVzOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWQgSURcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBsb2FkSWQ6IHN0cmluZztcblxuICAgIC8vICNlbmRyZWdpb24gUHJvcGVydGllc1xuXG4gICAgLy8gI3JlZ2lvbiBDb25zdHJ1Y3RvcnNcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHVmaWxlIFVwbG9hZCBzdGF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVmaWxlOiBVcGxvYWRTdGF0ZSkge1xuICAgICAgICB0aGlzLnVwbG9hZElkID0gdWZpbGUudXBsb2FkSWQ7XG4gICAgICAgIHRoaXMubmFtZSA9IHVmaWxlLm5hbWU7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSB1ZmlsZS5wcm9ncmVzcztcbiAgICAgICAgdGhpcy5zdGF0dXMgPSB1ZmlsZS5zdGF0dXM7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRpZCA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnNcbn1cblxuLy8gI2VuZHJlZ2lvbiBFeHBvcnRlZCBDbGFzc2VzXG4iXX0=