@bnsights/bbsf-controls 1.0.87 → 1.0.88

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 (219) hide show
  1. package/README.md +2 -3
  2. package/bnsights-bbsf-controls-1.0.88.tgz +0 -0
  3. package/bnsights-bbsf-controls.d.ts +1 -1
  4. package/bnsights-bbsf-controls.metadata.json +1 -0
  5. package/bundles/bnsights-bbsf-controls.umd.js +9434 -0
  6. package/bundles/bnsights-bbsf-controls.umd.js.map +1 -0
  7. package/esm2015/bnsights-bbsf-controls.js +6 -0
  8. package/esm2015/lib/Shared/Directives/template-name.directive.js +18 -0
  9. package/{esm2020/lib/Shared/Models/datePickerOptions.mjs → esm2015/lib/Shared/Models/datePickerOptions.js} +1 -1
  10. package/esm2015/lib/Shared/Pipes/bbsf-date-time.pipe.js +20 -0
  11. package/esm2015/lib/Shared/Pipes/bbsf-date.pipe.js +20 -0
  12. package/esm2015/lib/Shared/components/app-base-component.js +202 -0
  13. package/esm2015/lib/Shared/components/ng-tag-input.js +323 -0
  14. package/esm2015/lib/Shared/default_intl.js +29 -0
  15. package/esm2015/lib/Shared/services/ControlUtility.js +164 -0
  16. package/esm2015/lib/Shared/services/GlobalSettings.service.js +28 -0
  17. package/esm2015/lib/Shared/services/OnPagingFiltersChange.service.js +22 -0
  18. package/esm2015/lib/Shared/services/render-component-service.service.js +30 -0
  19. package/esm2015/lib/Shared/services/validationErrorMassage.service.js +137 -0
  20. package/esm2015/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.js +248 -0
  21. package/esm2015/lib/controls/Calendar/Calendar.component.js +176 -0
  22. package/esm2015/lib/controls/CheckBox/CheckBox.component.js +114 -0
  23. package/esm2015/lib/controls/ConfirmationModal/ConfirmationModal.component.js +139 -0
  24. package/esm2015/lib/controls/DateTimePicker/DateTimePicker.component.js +215 -0
  25. package/esm2015/lib/controls/DropdownList/DropdownList.component.js +178 -0
  26. package/esm2015/lib/controls/FileUplaod/FileUplaod.component.js +451 -0
  27. package/esm2015/lib/controls/Form/Form.component.js +106 -0
  28. package/esm2015/lib/controls/HtmlEditor/HtmlEditor.component.js +222 -0
  29. package/esm2015/lib/controls/ImageUpload/ImageUpload.component.js +347 -0
  30. package/esm2015/lib/controls/MapAutoComplete/MapAutoComplete.component.js +325 -0
  31. package/esm2015/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.js +429 -0
  32. package/esm2015/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.js +430 -0
  33. package/esm2015/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.js +429 -0
  34. package/esm2015/lib/controls/Paging/JwPagination.component.js +129 -0
  35. package/esm2015/lib/controls/Paging/Paging.component.js +312 -0
  36. package/esm2015/lib/controls/Phone/Phone.component.js +119 -0
  37. package/esm2015/lib/controls/ProfileImageUploader/ProfileImageUploader.component.js +349 -0
  38. package/esm2015/lib/controls/RadioButton/RadioButton.component.js +108 -0
  39. package/esm2015/lib/controls/Recaptcha/Recaptcha.component.js +131 -0
  40. package/esm2015/lib/controls/Repeater/repeater/repeater.component.js +117 -0
  41. package/esm2015/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.js +748 -0
  42. package/esm2015/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.js +19 -0
  43. package/esm2015/lib/controls/Repeater/repeater-table/repeater-table.component.js +108 -0
  44. package/esm2015/lib/controls/TagsInput/TagsInput.component.js +268 -0
  45. package/esm2015/lib/controls/TextArea/TextArea.component.js +191 -0
  46. package/esm2015/lib/controls/TextBox/TextBox.component.js +262 -0
  47. package/esm2015/lib/controls/Toggleslide/toggleslide.component.js +83 -0
  48. package/esm2015/lib/controls/bbsf-controls.module.js +243 -0
  49. package/esm2015/lib/controls/page-header-component/page-header-component.component.js +32 -0
  50. package/fesm2015/{bnsights-bbsf-controls.mjs → bnsights-bbsf-controls.js} +1506 -1645
  51. package/fesm2015/bnsights-bbsf-controls.js.map +1 -0
  52. package/lib/Shared/Directives/template-name.directive.d.ts +0 -3
  53. package/lib/Shared/Models/datePickerOptions.d.ts +1 -1
  54. package/lib/Shared/Pipes/bbsf-date-time.pipe.d.ts +0 -3
  55. package/lib/Shared/Pipes/bbsf-date.pipe.d.ts +0 -3
  56. package/lib/Shared/components/app-base-component.d.ts +1 -3
  57. package/lib/Shared/components/ng-tag-input.d.ts +0 -3
  58. package/lib/Shared/default_intl.d.ts +0 -3
  59. package/lib/Shared/services/ControlUtility.d.ts +0 -3
  60. package/lib/Shared/services/GlobalSettings.service.d.ts +0 -3
  61. package/lib/Shared/services/OnPagingFiltersChange.service.d.ts +0 -3
  62. package/lib/Shared/services/render-component-service.service.d.ts +0 -3
  63. package/lib/Shared/services/validationErrorMassage.service.d.ts +0 -3
  64. package/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.d.ts +0 -4
  65. package/lib/controls/Calendar/Calendar.component.d.ts +0 -3
  66. package/lib/controls/CheckBox/CheckBox.component.d.ts +0 -4
  67. package/lib/controls/ConfirmationModal/ConfirmationModal.component.d.ts +0 -3
  68. package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +2 -8
  69. package/lib/controls/DropdownList/DropdownList.component.d.ts +0 -4
  70. package/lib/controls/FileUplaod/FileUplaod.component.d.ts +0 -3
  71. package/lib/controls/Form/Form.component.d.ts +0 -3
  72. package/lib/controls/HtmlEditor/HtmlEditor.component.d.ts +0 -4
  73. package/lib/controls/ImageUpload/ImageUpload.component.d.ts +0 -3
  74. package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +0 -3
  75. package/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.d.ts +0 -3
  76. package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +0 -3
  77. package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +0 -3
  78. package/lib/controls/Paging/JwPagination.component.d.ts +0 -3
  79. package/lib/controls/Paging/Paging.component.d.ts +0 -3
  80. package/lib/controls/Phone/Phone.component.d.ts +1 -7
  81. package/lib/controls/ProfileImageUploader/ProfileImageUploader.component.d.ts +0 -3
  82. package/lib/controls/RadioButton/RadioButton.component.d.ts +0 -3
  83. package/lib/controls/Recaptcha/Recaptcha.component.d.ts +0 -4
  84. package/lib/controls/Repeater/repeater/repeater.component.d.ts +0 -3
  85. package/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.d.ts +0 -3
  86. package/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.d.ts +0 -3
  87. package/lib/controls/Repeater/repeater-table/repeater-table.component.d.ts +0 -3
  88. package/lib/controls/TagsInput/TagsInput.component.d.ts +0 -4
  89. package/lib/controls/TextArea/TextArea.component.d.ts +0 -4
  90. package/lib/controls/TextBox/TextBox.component.d.ts +0 -4
  91. package/lib/controls/Toggleslide/toggleslide.component.d.ts +0 -4
  92. package/lib/controls/bbsf-controls.module.d.ts +0 -74
  93. package/lib/controls/page-header-component/page-header-component.component.d.ts +0 -3
  94. package/package.json +8 -20
  95. package/bnsights-bbsf-controls-1.0.87.tgz +0 -0
  96. package/esm2020/bnsights-bbsf-controls.mjs +0 -5
  97. package/esm2020/lib/Shared/Directives/template-name.directive.mjs +0 -18
  98. package/esm2020/lib/Shared/Pipes/bbsf-date-time.pipe.mjs +0 -21
  99. package/esm2020/lib/Shared/Pipes/bbsf-date.pipe.mjs +0 -21
  100. package/esm2020/lib/Shared/components/app-base-component.mjs +0 -198
  101. package/esm2020/lib/Shared/components/ng-tag-input.mjs +0 -336
  102. package/esm2020/lib/Shared/default_intl.mjs +0 -29
  103. package/esm2020/lib/Shared/services/ControlUtility.mjs +0 -162
  104. package/esm2020/lib/Shared/services/GlobalSettings.service.mjs +0 -30
  105. package/esm2020/lib/Shared/services/OnPagingFiltersChange.service.mjs +0 -24
  106. package/esm2020/lib/Shared/services/render-component-service.service.mjs +0 -30
  107. package/esm2020/lib/Shared/services/validationErrorMassage.service.mjs +0 -137
  108. package/esm2020/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +0 -245
  109. package/esm2020/lib/controls/Calendar/Calendar.component.mjs +0 -172
  110. package/esm2020/lib/controls/CheckBox/CheckBox.component.mjs +0 -114
  111. package/esm2020/lib/controls/ConfirmationModal/ConfirmationModal.component.mjs +0 -136
  112. package/esm2020/lib/controls/DateTimePicker/DateTimePicker.component.mjs +0 -217
  113. package/esm2020/lib/controls/DropdownList/DropdownList.component.mjs +0 -179
  114. package/esm2020/lib/controls/FileUplaod/FileUplaod.component.mjs +0 -453
  115. package/esm2020/lib/controls/Form/Form.component.mjs +0 -101
  116. package/esm2020/lib/controls/HtmlEditor/HtmlEditor.component.mjs +0 -223
  117. package/esm2020/lib/controls/ImageUpload/ImageUpload.component.mjs +0 -350
  118. package/esm2020/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +0 -325
  119. package/esm2020/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +0 -427
  120. package/esm2020/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +0 -427
  121. package/esm2020/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +0 -426
  122. package/esm2020/lib/controls/Paging/JwPagination.component.mjs +0 -156
  123. package/esm2020/lib/controls/Paging/Paging.component.mjs +0 -312
  124. package/esm2020/lib/controls/Phone/Phone.component.mjs +0 -124
  125. package/esm2020/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +0 -354
  126. package/esm2020/lib/controls/RadioButton/RadioButton.component.mjs +0 -106
  127. package/esm2020/lib/controls/Recaptcha/Recaptcha.component.mjs +0 -132
  128. package/esm2020/lib/controls/Repeater/repeater/repeater.component.mjs +0 -125
  129. package/esm2020/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.mjs +0 -750
  130. package/esm2020/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.mjs +0 -21
  131. package/esm2020/lib/controls/Repeater/repeater-table/repeater-table.component.mjs +0 -108
  132. package/esm2020/lib/controls/TagsInput/TagsInput.component.mjs +0 -268
  133. package/esm2020/lib/controls/TextArea/TextArea.component.mjs +0 -192
  134. package/esm2020/lib/controls/TextBox/TextBox.component.mjs +0 -266
  135. package/esm2020/lib/controls/Toggleslide/toggleslide.component.mjs +0 -84
  136. package/esm2020/lib/controls/bbsf-controls.module.mjs +0 -401
  137. package/esm2020/lib/controls/page-header-component/page-header-component.component.mjs +0 -37
  138. package/fesm2015/bnsights-bbsf-controls.mjs.map +0 -1
  139. package/fesm2020/bnsights-bbsf-controls.mjs +0 -8938
  140. package/fesm2020/bnsights-bbsf-controls.mjs.map +0 -1
  141. /package/{esm2020/lib/Shared/Enums/CalendarView.mjs → esm2015/lib/Shared/Enums/CalendarView.js} +0 -0
  142. /package/{esm2020/lib/Shared/Enums/ControlLayout.mjs → esm2015/lib/Shared/Enums/ControlLayout.js} +0 -0
  143. /package/{esm2020/lib/Shared/Enums/Countries.mjs → esm2015/lib/Shared/Enums/Countries.js} +0 -0
  144. /package/{esm2020/lib/Shared/Enums/Enums.mjs → esm2015/lib/Shared/Enums/Enums.js} +0 -0
  145. /package/{esm2020/lib/Shared/Enums/FileType.mjs → esm2015/lib/Shared/Enums/FileType.js} +0 -0
  146. /package/{esm2020/lib/Shared/Enums/FilterType.mjs → esm2015/lib/Shared/Enums/FilterType.js} +0 -0
  147. /package/{esm2020/lib/Shared/Enums/FontSize.mjs → esm2015/lib/Shared/Enums/FontSize.js} +0 -0
  148. /package/{esm2020/lib/Shared/Enums/ForceDirection.mjs → esm2015/lib/Shared/Enums/ForceDirection.js} +0 -0
  149. /package/{esm2020/lib/Shared/Enums/IconPosition.mjs → esm2015/lib/Shared/Enums/IconPosition.js} +0 -0
  150. /package/{esm2020/lib/Shared/Enums/ImageType.mjs → esm2015/lib/Shared/Enums/ImageType.js} +0 -0
  151. /package/{esm2020/lib/Shared/Enums/InputType.mjs → esm2015/lib/Shared/Enums/InputType.js} +0 -0
  152. /package/{esm2020/lib/Shared/Enums/Insert.mjs → esm2015/lib/Shared/Enums/Insert.js} +0 -0
  153. /package/{esm2020/lib/Shared/Enums/LanguageMode.mjs → esm2015/lib/Shared/Enums/LanguageMode.js} +0 -0
  154. /package/{esm2020/lib/Shared/Enums/LanguageValidation.mjs → esm2015/lib/Shared/Enums/LanguageValidation.js} +0 -0
  155. /package/{esm2020/lib/Shared/Enums/Misc.mjs → esm2015/lib/Shared/Enums/Misc.js} +0 -0
  156. /package/{esm2020/lib/Shared/Enums/PagingActionMode.mjs → esm2015/lib/Shared/Enums/PagingActionMode.js} +0 -0
  157. /package/{esm2020/lib/Shared/Enums/Para.mjs → esm2015/lib/Shared/Enums/Para.js} +0 -0
  158. /package/{esm2020/lib/Shared/Enums/PickerType.mjs → esm2015/lib/Shared/Enums/PickerType.js} +0 -0
  159. /package/{esm2020/lib/Shared/Enums/SelectMode.mjs → esm2015/lib/Shared/Enums/SelectMode.js} +0 -0
  160. /package/{esm2020/lib/Shared/Enums/StartView.mjs → esm2015/lib/Shared/Enums/StartView.js} +0 -0
  161. /package/{esm2020/lib/Shared/Enums/Style.mjs → esm2015/lib/Shared/Enums/Style.js} +0 -0
  162. /package/{esm2020/lib/Shared/Enums/StyleConfirmationMode.mjs → esm2015/lib/Shared/Enums/StyleConfirmationMode.js} +0 -0
  163. /package/{esm2020/lib/Shared/Enums/TagInputView.mjs → esm2015/lib/Shared/Enums/TagInputView.js} +0 -0
  164. /package/{esm2020/lib/Shared/Enums/menu-list-enum.mjs → esm2015/lib/Shared/Enums/menu-list-enum.js} +0 -0
  165. /package/{esm2020/lib/Shared/Models/Attribute.mjs → esm2015/lib/Shared/Models/Attribute.js} +0 -0
  166. /package/{esm2020/lib/Shared/Models/AutocompleteDTO.mjs → esm2015/lib/Shared/Models/AutocompleteDTO.js} +0 -0
  167. /package/{esm2020/lib/Shared/Models/AutocompleteOptions.mjs → esm2015/lib/Shared/Models/AutocompleteOptions.js} +0 -0
  168. /package/{esm2020/lib/Shared/Models/CalendarEventDTO.mjs → esm2015/lib/Shared/Models/CalendarEventDTO.js} +0 -0
  169. /package/{esm2020/lib/Shared/Models/CalendarOptions.mjs → esm2015/lib/Shared/Models/CalendarOptions.js} +0 -0
  170. /package/{esm2020/lib/Shared/Models/CancelDTO.mjs → esm2015/lib/Shared/Models/CancelDTO.js} +0 -0
  171. /package/{esm2020/lib/Shared/Models/CaptchaStyle.mjs → esm2015/lib/Shared/Models/CaptchaStyle.js} +0 -0
  172. /package/{esm2020/lib/Shared/Models/CheckBoxOptions.mjs → esm2015/lib/Shared/Models/CheckBoxOptions.js} +0 -0
  173. /package/{esm2020/lib/Shared/Models/ConfirmationModalOptions.mjs → esm2015/lib/Shared/Models/ConfirmationModalOptions.js} +0 -0
  174. /package/{esm2020/lib/Shared/Models/ControlOptionsBase.mjs → esm2015/lib/Shared/Models/ControlOptionsBase.js} +0 -0
  175. /package/{esm2020/lib/Shared/Models/CustomValidation.mjs → esm2015/lib/Shared/Models/CustomValidation.js} +0 -0
  176. /package/{esm2020/lib/Shared/Models/DropdownListItem.mjs → esm2015/lib/Shared/Models/DropdownListItem.js} +0 -0
  177. /package/{esm2020/lib/Shared/Models/DropdownOptions.mjs → esm2015/lib/Shared/Models/DropdownOptions.js} +0 -0
  178. /package/{esm2020/lib/Shared/Models/EditPersonalImage.mjs → esm2015/lib/Shared/Models/EditPersonalImage.js} +0 -0
  179. /package/{esm2020/lib/Shared/Models/EnglishArabicDTO.mjs → esm2015/lib/Shared/Models/EnglishArabicDTO.js} +0 -0
  180. /package/{esm2020/lib/Shared/Models/FileDTO.mjs → esm2015/lib/Shared/Models/FileDTO.js} +0 -0
  181. /package/{esm2020/lib/Shared/Models/FileUploadModel.mjs → esm2015/lib/Shared/Models/FileUploadModel.js} +0 -0
  182. /package/{esm2020/lib/Shared/Models/FileUploadOptions.mjs → esm2015/lib/Shared/Models/FileUploadOptions.js} +0 -0
  183. /package/{esm2020/lib/Shared/Models/FilterItem.mjs → esm2015/lib/Shared/Models/FilterItem.js} +0 -0
  184. /package/{esm2020/lib/Shared/Models/FormOptions.mjs → esm2015/lib/Shared/Models/FormOptions.js} +0 -0
  185. /package/{esm2020/lib/Shared/Models/HtmlEditorOptions.mjs → esm2015/lib/Shared/Models/HtmlEditorOptions.js} +0 -0
  186. /package/{esm2020/lib/Shared/Models/ImageUploadOptions.mjs → esm2015/lib/Shared/Models/ImageUploadOptions.js} +0 -0
  187. /package/{esm2020/lib/Shared/Models/MapAutoCompleteOptions.mjs → esm2015/lib/Shared/Models/MapAutoCompleteOptions.js} +0 -0
  188. /package/{esm2020/lib/Shared/Models/MapAutocompleteDTO.mjs → esm2015/lib/Shared/Models/MapAutocompleteDTO.js} +0 -0
  189. /package/{esm2020/lib/Shared/Models/MultiLingualHtmlEditorOptions.mjs → esm2015/lib/Shared/Models/MultiLingualHtmlEditorOptions.js} +0 -0
  190. /package/{esm2020/lib/Shared/Models/MultiLingualTextAreaOptions.mjs → esm2015/lib/Shared/Models/MultiLingualTextAreaOptions.js} +0 -0
  191. /package/{esm2020/lib/Shared/Models/MultilingualControlOptionsBase.mjs → esm2015/lib/Shared/Models/MultilingualControlOptionsBase.js} +0 -0
  192. /package/{esm2020/lib/Shared/Models/MultilingualTextBoxOptions.mjs → esm2015/lib/Shared/Models/MultilingualTextBoxOptions.js} +0 -0
  193. /package/{esm2020/lib/Shared/Models/MultipleFileUploadModel.mjs → esm2015/lib/Shared/Models/MultipleFileUploadModel.js} +0 -0
  194. /package/{esm2020/lib/Shared/Models/PagingDTO.mjs → esm2015/lib/Shared/Models/PagingDTO.js} +0 -0
  195. /package/{esm2020/lib/Shared/Models/PagingOptions.mjs → esm2015/lib/Shared/Models/PagingOptions.js} +0 -0
  196. /package/{esm2020/lib/Shared/Models/PagingPayload.mjs → esm2015/lib/Shared/Models/PagingPayload.js} +0 -0
  197. /package/{esm2020/lib/Shared/Models/PhoneOptions.mjs → esm2015/lib/Shared/Models/PhoneOptions.js} +0 -0
  198. /package/{esm2020/lib/Shared/Models/ProfileImageUploadOptions.mjs → esm2015/lib/Shared/Models/ProfileImageUploadOptions.js} +0 -0
  199. /package/{esm2020/lib/Shared/Models/ProfilePictureDTO.mjs → esm2015/lib/Shared/Models/ProfilePictureDTO.js} +0 -0
  200. /package/{esm2020/lib/Shared/Models/RadioButtonItem.mjs → esm2015/lib/Shared/Models/RadioButtonItem.js} +0 -0
  201. /package/{esm2020/lib/Shared/Models/RadioButtonOptions.mjs → esm2015/lib/Shared/Models/RadioButtonOptions.js} +0 -0
  202. /package/{esm2020/lib/Shared/Models/RangeNumber.mjs → esm2015/lib/Shared/Models/RangeNumber.js} +0 -0
  203. /package/{esm2020/lib/Shared/Models/Recaptcha.mjs → esm2015/lib/Shared/Models/Recaptcha.js} +0 -0
  204. /package/{esm2020/lib/Shared/Models/RecaptchaOptions.mjs → esm2015/lib/Shared/Models/RecaptchaOptions.js} +0 -0
  205. /package/{esm2020/lib/Shared/Models/RepeaterField.mjs → esm2015/lib/Shared/Models/RepeaterField.js} +0 -0
  206. /package/{esm2020/lib/Shared/Models/RepeaterOptions.mjs → esm2015/lib/Shared/Models/RepeaterOptions.js} +0 -0
  207. /package/{esm2020/lib/Shared/Models/SaveDTO.mjs → esm2015/lib/Shared/Models/SaveDTO.js} +0 -0
  208. /package/{esm2020/lib/Shared/Models/TagsInputDTO.mjs → esm2015/lib/Shared/Models/TagsInputDTO.js} +0 -0
  209. /package/{esm2020/lib/Shared/Models/TagsInputOptions.mjs → esm2015/lib/Shared/Models/TagsInputOptions.js} +0 -0
  210. /package/{esm2020/lib/Shared/Models/TextAreaOptions.mjs → esm2015/lib/Shared/Models/TextAreaOptions.js} +0 -0
  211. /package/{esm2020/lib/Shared/Models/TextBoxOptions.mjs → esm2015/lib/Shared/Models/TextBoxOptions.js} +0 -0
  212. /package/{esm2020/lib/Shared/Models/ToggleslideOptions.mjs → esm2015/lib/Shared/Models/ToggleslideOptions.js} +0 -0
  213. /package/{esm2020/lib/Shared/Models/UploadPersonalImage.mjs → esm2015/lib/Shared/Models/UploadPersonalImage.js} +0 -0
  214. /package/{esm2020/lib/Shared/Models/bread-crumb.mjs → esm2015/lib/Shared/Models/bread-crumb.js} +0 -0
  215. /package/{esm2020/lib/Shared/Models/control-filter-Item.mjs → esm2015/lib/Shared/Models/control-filter-Item.js} +0 -0
  216. /package/{esm2020/lib/Shared/Models/filter-options.mjs → esm2015/lib/Shared/Models/filter-options.js} +0 -0
  217. /package/{esm2020/lib/Shared/Models/page-header-options.mjs → esm2015/lib/Shared/Models/page-header-options.js} +0 -0
  218. /package/{esm2020/lib/Shared/config/environment.mjs → esm2015/lib/Shared/config/environment.js} +0 -0
  219. /package/{esm2020/public-api.mjs → esm2015/public-api.js} +0 -0
@@ -0,0 +1,129 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ export class JwPaginationComponent {
3
+ constructor() {
4
+ this.changePage = new EventEmitter();
5
+ this.initialPage = 1;
6
+ this.pageSize = 10;
7
+ this.maxPages = 10;
8
+ this.ShowFirstAndLast = false;
9
+ this.pager = {};
10
+ }
11
+ ngOnInit() {
12
+ // set page if items array isn't empty
13
+ if (this.items && this.items.length) {
14
+ this.setPage(this.initialPage);
15
+ }
16
+ }
17
+ ngOnChanges(changes) {
18
+ if (changes.items.firstChange)
19
+ return;
20
+ // reset page if items array has changed
21
+ if (changes.items.currentValue !== changes.items.previousValue) {
22
+ this.setPage(this.initialPage);
23
+ }
24
+ }
25
+ setPage(page) {
26
+ // get new pager object for specified page
27
+ this.pager = this.paginate(this.items.length, page, this.pageSize, this.maxPages);
28
+ // get new page of items from items array
29
+ var pageOfItems = this.items.slice(this.pager.startIndex, this.pager.endIndex + 1);
30
+ // call change page function in parent component
31
+ this.changePage.emit(this.pager.currentPage);
32
+ }
33
+ paginate(totalItems, currentPage, pageSize, maxPages) {
34
+ if (currentPage === void 0) {
35
+ currentPage = 1;
36
+ }
37
+ if (pageSize === void 0) {
38
+ pageSize = 10;
39
+ }
40
+ if (maxPages === void 0) {
41
+ maxPages = 10;
42
+ }
43
+ // calculate total pages
44
+ var totalPages = Math.ceil(totalItems / pageSize);
45
+ // ensure current page isn't out of range
46
+ if (currentPage < 1) {
47
+ currentPage = 1;
48
+ }
49
+ else if (currentPage > totalPages) {
50
+ currentPage = totalPages;
51
+ }
52
+ var startPage, endPage;
53
+ if (totalPages <= maxPages) {
54
+ // total pages less than max so show all pages
55
+ startPage = 1;
56
+ endPage = totalPages;
57
+ }
58
+ else {
59
+ // total pages more than max so calculate start and end pages
60
+ var maxPagesBeforeCurrentPage = Math.floor(maxPages / 2);
61
+ var maxPagesAfterCurrentPage = Math.ceil(maxPages / 2) - 1;
62
+ if (currentPage <= maxPagesBeforeCurrentPage) {
63
+ // current page near the start
64
+ startPage = 1;
65
+ endPage = maxPages;
66
+ }
67
+ else if (currentPage + maxPagesAfterCurrentPage >= totalPages) {
68
+ // current page near the end
69
+ startPage = totalPages - maxPages + 1;
70
+ endPage = totalPages;
71
+ }
72
+ else {
73
+ // current page somewhere in the middle
74
+ startPage = currentPage - maxPagesBeforeCurrentPage;
75
+ endPage = currentPage + maxPagesAfterCurrentPage;
76
+ }
77
+ }
78
+ // calculate start and end item indexes
79
+ var startIndex = (currentPage - 1) * pageSize;
80
+ var endIndex = Math.min(startIndex + pageSize - 1, totalItems - 1);
81
+ // create an array of pages to ng-repeat in the pager control
82
+ var pages = Array.from(Array((endPage + 1) - startPage).keys()).map(function (i) { return startPage + i; });
83
+ // return object with all pager properties required by the view
84
+ return {
85
+ totalItems: totalItems,
86
+ currentPage: currentPage,
87
+ pageSize: pageSize,
88
+ totalPages: totalPages,
89
+ startPage: startPage,
90
+ endPage: endPage,
91
+ startIndex: startIndex,
92
+ endIndex: endIndex,
93
+ pages: pages
94
+ };
95
+ }
96
+ }
97
+ JwPaginationComponent.decorators = [
98
+ { type: Component, args: [{
99
+ selector: 'jw-pagination',
100
+ template: `
101
+ <ul *ngIf="pager.pages && pager.pages.length" class="pagination">
102
+ <li *ngIf="ShowFirstAndLast" [ngClass]="{disabled:pager.currentPage === 1}" class="page-item first-item">
103
+ <a (click)="setPage(1)" class="page-link">❮❮</a>
104
+ </li>
105
+ <li [ngClass]="{disabled:pager.currentPage === 1}" class="page-item previous-item">
106
+ <a (click)="setPage(pager.currentPage - 1)" class="page-link">❮</a>
107
+ </li>
108
+ <li *ngFor="let page of pager.pages" [ngClass]="{active:pager.currentPage === page}" class="page-item number-item">
109
+ <a (click)="setPage(page)" class="page-link">{{page}}</a>
110
+ </li>
111
+ <li [ngClass]="{disabled:pager.currentPage === pager.totalPages}" class="page-item next-item">
112
+ <a (click)="setPage(pager.currentPage + 1)" class="page-link">❯</a>
113
+ </li>
114
+ <li *ngIf="ShowFirstAndLast" [ngClass]="{disabled:pager.currentPage === pager.totalPages}" class="page-item last-item">
115
+ <a (click)="setPage(pager.totalPages)" class="page-link">❯❯</a>
116
+ </li>
117
+ </ul>
118
+ `
119
+ },] }
120
+ ];
121
+ JwPaginationComponent.propDecorators = {
122
+ items: [{ type: Input }],
123
+ changePage: [{ type: Output }],
124
+ initialPage: [{ type: Input }],
125
+ pageSize: [{ type: Input }],
126
+ maxPages: [{ type: Input }],
127
+ ShowFirstAndLast: [{ type: Input }]
128
+ };
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSndQYWdpbmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9QYWdpbmcvSndQYWdpbmF0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQXlCekcsTUFBTSxPQUFPLHFCQUFxQjtJQXZCbEM7UUF5QmMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakMsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFHbEMsVUFBSyxHQUFRLEVBQUUsQ0FBQztJQXVGcEIsQ0FBQztJQXJGRyxRQUFRO1FBQ0osc0NBQXNDO1FBQ3RDLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNsQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVc7WUFDekIsT0FBTTtRQUNWLHdDQUF3QztRQUN4QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQzVELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ2xDO0lBQ0wsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFZO1FBQ2hCLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsS0FBSyxHQUFH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QUMsQ0FBQyxDQUFDLENBQUM7UUFDNUcsK0RBQStEO1FBQy9ELE9BQU87WUFDSCxVQUFVLEVBQUUsVUFBVTtZQUN0QixXQUFXLEVBQUUsV0FBVztZQUN4QixRQUFRLEVBQUUsUUFBUTtZQUNsQixVQUFVLEVBQUUsVUFBVTtZQUN0QixTQUFTLEVBQUUsU0FBUztZQUNwQixPQUFPLEVBQUUsT0FBTztZQUNoQixVQUFVLEVBQUUsVUFBVTtZQUN0QixRQUFRLEVBQUUsUUFBUTtZQUNsQixLQUFLLEVBQUUsS0FBSztTQUNmLENBQUM7SUFDTixDQUFDOzs7WUFySEosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxlQUFlO2dCQUN6QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWtCYjthQUNBOzs7b0JBR0ksS0FBSzt5QkFDTCxNQUFNOzBCQUNOLEtBQUs7dUJBQ0wsS0FBSzt1QkFDTCxLQUFLOytCQUNMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdqdy1wYWdpbmF0aW9uJyxcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgPHVsICpuZ0lmPVwicGFnZXIucGFnZXMgJiYgcGFnZXIucGFnZXMubGVuZ3RoXCIgY2xhc3M9XCJwYWdpbmF0aW9uXCI+XHJcbiAgPGxpICpuZ0lmPVwiU2hvd0ZpcnN0QW5kTGFzdFwiIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDpwYWdlci5jdXJyZW50UGFnZSA9PT0gMX1cIiBjbGFzcz1cInBhZ2UtaXRlbSBmaXJzdC1pdGVtXCI+XHJcbiAgICAgIDxhIChjbGljayk9XCJzZXRQYWdlKDEpXCIgY2xhc3M9XCJwYWdlLWxpbmtcIj7ina7ina48L2E+XHJcbiAgPC9saT5cclxuICA8bGkgW25nQ2xhc3NdPVwie2Rpc2FibGVkOnBhZ2VyLmN1cnJlbnRQYWdlID09PSAxfVwiIGNsYXNzPVwicGFnZS1pdGVtIHByZXZpb3VzLWl0ZW1cIj5cclxuICAgICAgPGEgKGNsaWNrKT1cInNldFBhZ2UocGFnZXIuY3VycmVudFBhZ2UgLSAxKVwiIGNsYXNzPVwicGFnZS1saW5rXCI+4p2uPC9hPlxyXG4gIDwvbGk+XHJcbiAgPGxpICpuZ0Zvcj1cImxldCBwYWdlIG9mIHBhZ2VyLnBhZ2VzXCIgW25nQ2xhc3NdPVwie2FjdGl2ZTpwYWdlci5jdXJyZW50UGFnZSA9PT0gcGFnZX1cIiBjbGFzcz1cInBhZ2UtaXRlbSBudW1iZXItaXRlbVwiPlxyXG4gICAgICA8YSAoY2xpY2spPVwic2V0UGFnZShwYWdlKVwiIGNsYXNzPVwicGFnZS1saW5rXCI+e3twYWdlfX08L2E+XHJcbiAgPC9saT5cclxuICA8bGkgW25nQ2xhc3NdPVwie2Rpc2FibGVkOnBhZ2VyLmN1cnJlbnRQYWdlID09PSBwYWdlci50b3RhbFBhZ2VzfVwiIGNsYXNzPVwicGFnZS1pdGVtIG5leHQtaXRlbVwiPlxyXG4gICAgICA8YSAoY2xpY2spPVwic2V0UGFnZShwYWdlci5jdXJyZW50UGFnZSArIDEpXCIgY2xhc3M9XCJwYWdlLWxpbmtcIj7ina88L2E+XHJcbiAgPC9saT5cclxuICA8bGkgICpuZ0lmPVwiU2hvd0ZpcnN0QW5kTGFzdFwiIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDpwYWdlci5jdXJyZW50UGFnZSA9PT0gcGFnZXIudG90YWxQYWdlc31cIiBjbGFzcz1cInBhZ2UtaXRlbSBsYXN0LWl0ZW1cIj5cclxuICAgICAgPGEgKGNsaWNrKT1cInNldFBhZ2UocGFnZXIudG90YWxQYWdlcylcIiBjbGFzcz1cInBhZ2UtbGlua1wiPuKdr+KdrzwvYT5cclxuICA8L2xpPlxyXG48L3VsPlxyXG5gXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgSndQYWdpbmF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gICAgQElucHV0KCkgaXRlbXM6IEFycmF5PGFueT47XHJcbiAgICBAT3V0cHV0KCkgY2hhbmdlUGFnZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBJbnB1dCgpIGluaXRpYWxQYWdlID0gMTtcclxuICAgIEBJbnB1dCgpIHBhZ2VTaXplID0gMTA7XHJcbiAgICBASW5wdXQoKSBtYXhQYWdlcyA9IDEwO1xyXG4gICAgQElucHV0KCkgU2hvd0ZpcnN0QW5kTGFzdCA9IGZhbHNlO1xyXG5cclxuXHJcbiAgICBwYWdlcjogYW55ID0ge307XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgLy8gc2V0IHBhZ2UgaWYgaXRlbXMgYXJyYXkgaXNuJ3QgZW1wdHlcclxuICAgICAgICBpZiAodGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFBhZ2UodGhpcy5pbml0aWFsUGFnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBpZiAoY2hhbmdlcy5pdGVtcy5maXJzdENoYW5nZSlcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgLy8gcmVzZXQgcGFnZSBpZiBpdGVtcyBhcnJheSBoYXMgY2hhbmdlZFxyXG4gICAgICAgIGlmIChjaGFuZ2VzLml0ZW1zLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5pdGVtcy5wcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UGFnZSh0aGlzLmluaXRpYWxQYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UGFnZShwYWdlOiBudW1iZXIpIHtcclxuICAgICAgICAvLyBnZXQgbmV3IHBhZ2VyIG9iamVjdCBmb3Igc3BlY2lmaWVkIHBhZ2VcclxuICAgICAgICB0aGlzLnBhZ2VyID0gdGhpcy5wYWdpbmF0ZSh0aGlzLml0ZW1zLmxlbmd0aCwgcGFnZSwgdGhpcy5wYWdlU2l6ZSwgdGhpcy5tYXhQYWdlcyk7XHJcblxyXG4gICAgICAgIC8vIGdldCBuZXcgcGFnZSBvZiBpdGVtcyBmcm9tIGl0ZW1zIGFycmF5XHJcbiAgICAgICAgdmFyIHBhZ2VPZkl0ZW1zID0gdGhpcy5pdGVtcy5zbGljZSh0aGlzLnBhZ2VyLnN0YXJ0SW5kZXgsIHRoaXMucGFnZXIuZW5kSW5kZXggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gY2FsbCBjaGFuZ2UgcGFnZSBmdW5jdGlvbiBpbiBwYXJlbnQgY29tcG9uZW50XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VQYWdlLmVtaXQodGhpcy5wYWdlci5jdXJyZW50UGFnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcGFnaW5hdGUodG90YWxJdGVtcywgY3VycmVudFBhZ2UsIHBhZ2VTaXplLCBtYXhQYWdlcykge1xyXG4gICAgICAgIGlmIChjdXJyZW50UGFnZSA9PT0gdm9pZCAwKSB7IGN1cnJlbnRQYWdlID0gMTsgfVxyXG4gICAgICAgIGlmIChwYWdlU2l6ZSA9PT0gdm9pZCAwKSB7IHBhZ2VTaXplID0gMTA7IH1cclxuICAgICAgICBpZiAobWF4UGFnZXMgPT09IHZvaWQgMCkgeyBtYXhQYWdlcyA9IDEwOyB9XHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRvdGFsIHBhZ2VzXHJcbiAgICAgICAgdmFyIHRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodG90YWxJdGVtcyAvIHBhZ2VTaXplKTtcclxuICAgICAgICAvLyBlbnN1cmUgY3VycmVudCBwYWdlIGlzbid0IG91dCBvZiByYW5nZVxyXG4gICAgICAgIGlmIChjdXJyZW50UGFnZSA8IDEpIHtcclxuICAgICAgICAgICAgY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjdXJyZW50UGFnZSA+IHRvdGFsUGFnZXMpIHtcclxuICAgICAgICAgICAgY3VycmVudFBhZ2UgPSB0b3RhbFBhZ2VzO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc3RhcnRQYWdlLCBlbmRQYWdlO1xyXG4gICAgICAgIGlmICh0b3RhbFBhZ2VzIDw9IG1heFBhZ2VzKSB7XHJcbiAgICAgICAgICAgIC8vIHRvdGFsIHBhZ2VzIGxlc3MgdGhhbiBtYXggc28gc2hvdyBhbGwgcGFnZXNcclxuICAgICAgICAgICAgc3RhcnRQYWdlID0gMTtcclxuICAgICAgICAgICAgZW5kUGFnZSA9IHRvdGFsUGFnZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyB0b3RhbCBwYWdlcyBtb3JlIHRoYW4gbWF4IHNvIGNhbGN1bGF0ZSBzdGFydCBhbmQgZW5kIHBhZ2VzXHJcbiAgICAgICAgICAgIHZhciBtYXhQYWdlc0JlZm9yZUN1cnJlbnRQYWdlID0gTWF0aC5mbG9vcihtYXhQYWdlcyAvIDIpO1xyXG4gICAgICAgICAgICB2YXIgbWF4UGFnZXNBZnRlckN1cnJlbnRQYWdlID0gTWF0aC5jZWlsKG1heFBhZ2VzIC8gMikgLSAxO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFBhZ2UgPD0gbWF4UGFnZXNCZWZvcmVDdXJyZW50UGFnZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudCBwYWdlIG5lYXIgdGhlIHN0YXJ0XHJcbiAgICAgICAgICAgICAgICBzdGFydFBhZ2UgPSAxO1xyXG4gICAgICAgICAgICAgICAgZW5kUGFnZSA9IG1heFBhZ2VzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRQYWdlICsgbWF4UGFnZXNBZnRlckN1cnJlbnRQYWdlID49IHRvdGFsUGFnZXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcGFnZSBuZWFyIHRoZSBlbmRcclxuICAgICAgICAgICAgICAgIHN0YXJ0UGFnZSA9IHRvdGFsUGFnZXMgLSBtYXhQYWdlcyArIDE7XHJcbiAgICAgICAgICAgICAgICBlbmRQYWdlID0gdG90YWxQYWdlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcGFnZSBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZVxyXG4gICAgICAgICAgICAgICAgc3RhcnRQYWdlID0gY3VycmVudFBhZ2UgLSBtYXhQYWdlc0JlZm9yZUN1cnJlbnRQYWdlO1xyXG4gICAgICAgICAgICAgICAgZW5kUGFnZSA9IGN1cnJlbnRQYWdlICsgbWF4UGFnZXNBZnRlckN1cnJlbnRQYWdlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBzdGFydCBhbmQgZW5kIGl0ZW0gaW5kZXhlc1xyXG4gICAgICAgIHZhciBzdGFydEluZGV4ID0gKGN1cnJlbnRQYWdlIC0gMSkgKiBwYWdlU2l6ZTtcclxuICAgICAgICB2YXIgZW5kSW5kZXggPSBNYXRoLm1pbihzdGFydEluZGV4ICsgcGFnZVNpemUgLSAxLCB0b3RhbEl0ZW1zIC0gMSk7XHJcbiAgICAgICAgLy8gY3JlYXRlIGFuIGFycmF5IG9mIHBhZ2VzIHRvIG5nLXJlcGVhdCBpbiB0aGUgcGFnZXIgY29udHJvbFxyXG4gICAgICAgIHZhciBwYWdlcyA9IEFycmF5LmZyb20oQXJyYXkoKGVuZFBhZ2UgKyAxKSAtIHN0YXJ0UGFnZSkua2V5cygpKS5tYXAoZnVuY3Rpb24gKGkpIHsgcmV0dXJuIHN0YXJ0UGFnZSArIGk7IH0pO1xyXG4gICAgICAgIC8vIHJldHVybiBvYmplY3Qgd2l0aCBhbGwgcGFnZXIgcHJvcGVydGllcyByZXF1aXJlZCBieSB0aGUgdmlld1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRvdGFsSXRlbXM6IHRvdGFsSXRlbXMsXHJcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlOiBjdXJyZW50UGFnZSxcclxuICAgICAgICAgICAgcGFnZVNpemU6IHBhZ2VTaXplLFxyXG4gICAgICAgICAgICB0b3RhbFBhZ2VzOiB0b3RhbFBhZ2VzLFxyXG4gICAgICAgICAgICBzdGFydFBhZ2U6IHN0YXJ0UGFnZSxcclxuICAgICAgICAgICAgZW5kUGFnZTogZW5kUGFnZSxcclxuICAgICAgICAgICAgc3RhcnRJbmRleDogc3RhcnRJbmRleCxcclxuICAgICAgICAgICAgZW5kSW5kZXg6IGVuZEluZGV4LFxyXG4gICAgICAgICAgICBwYWdlczogcGFnZXNcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufSJdfQ==
@@ -0,0 +1,312 @@
1
+ import { Component, Output, EventEmitter, Input } from '@angular/core';
2
+ import { Router } from '@angular/router';
3
+ import { HttpClient } from '@angular/common/http';
4
+ import { PagingDTO } from '../../Shared/Models/PagingDTO';
5
+ import { Subscription } from 'rxjs';
6
+ import { OnPagingFiltersChangeService } from '../../Shared/services/OnPagingFiltersChange.service';
7
+ import { FilterType } from '../../Shared/Enums/FilterType';
8
+ import { RequestHandlerService, RequestOptionsModel, UtilityService } from '@bnsights/bbsf-utilities';
9
+ import { plainToClass } from 'class-transformer';
10
+ // tslint:disable-next-line: no-conflicting-lifecycle
11
+ export class PagingComponent {
12
+ constructor(utilityService, http, router, onChangeService, requestHandlerService) {
13
+ this.utilityService = utilityService;
14
+ this.http = http;
15
+ this.router = router;
16
+ this.onChangeService = onChangeService;
17
+ this.requestHandlerService = requestHandlerService;
18
+ this.items = [];
19
+ this.result = [];
20
+ this.pagerConfig = null;
21
+ this.totalRow = 0;
22
+ this.pageSize = 10;
23
+ this.Pages = 0;
24
+ this.CurrentPage = 1;
25
+ this.ShowPageSizeOption = true;
26
+ this.ShowFirstAndLast = true;
27
+ this.hidePaginationWhenPageSizeEqualOne = true;
28
+ this.Sum = 0;
29
+ this.Throttle = 300;
30
+ this.ScrollDistance = 1;
31
+ this.ScrollUpDistance = 2;
32
+ this.direction = '';
33
+ this.IsFirstCall = true;
34
+ this.Items = new EventEmitter();
35
+ this.subscriptions = new Subscription();
36
+ this.ReinitializePaging = () => {
37
+ this.IsFirstCall = true;
38
+ this.getItemList(1, true);
39
+ };
40
+ this.UpdatePaging = () => {
41
+ //this.IsFirstCall=true;
42
+ this.getItemList(this.CurrentPage);
43
+ };
44
+ }
45
+ ngOnDestroy() {
46
+ this.subscriptions.unsubscribe();
47
+ }
48
+ ngOnInit() {
49
+ if (this.options.IsLoadMoreControl)
50
+ this.Sum = this.options.PageSize;
51
+ if (this.options.DropdownFiltersControlNames != null && this.options.DropdownFiltersControlNames.length > 0) {
52
+ const DropdownFiltersControlNames = this.options.DropdownFiltersControlNames;
53
+ this.subscriptions.add(this.onChangeService.GetValue().subscribe((value) => {
54
+ let result = this.options.DropdownFiltersControlNames.filter((item) => item == value);
55
+ if (result.length > 0) {
56
+ this.IsFirstCall = true;
57
+ this.CurrentPage = 1;
58
+ this.getItemList(this.CurrentPage, true);
59
+ }
60
+ }));
61
+ }
62
+ if (this.options.BootstrapDatePickersFiltersControlNames != null && this.options.BootstrapDatePickersFiltersControlNames.length > 0) {
63
+ const BootstrapDatePickersFiltersControlNames = this.options.BootstrapDatePickersFiltersControlNames;
64
+ this.subscriptions.add(this.onChangeService.GetValue().subscribe((value) => {
65
+ let result = this.options.BootstrapDatePickersFiltersControlNames.filter((item) => item == value);
66
+ if (result.length > 0) {
67
+ this.IsFirstCall = true;
68
+ this.CurrentPage = 1;
69
+ this.getItemList(this.CurrentPage, true);
70
+ }
71
+ }));
72
+ }
73
+ this.IsFirstCall = true;
74
+ this.getItemList(this.CurrentPage, true);
75
+ }
76
+ ngAfterViewInit() {
77
+ if (this.options.OnClickFiltersControlNames != null && this.options.OnClickFiltersControlNames.length > 0) {
78
+ const OnClickFiltersControlNames = this.options.OnClickFiltersControlNames;
79
+ for (let index = 0; index < OnClickFiltersControlNames.length; index++) {
80
+ const OnClickFiltersControlName = OnClickFiltersControlNames[index];
81
+ document.getElementById(OnClickFiltersControlName).addEventListener("click", () => {
82
+ this.CurrentPage = 1;
83
+ this.IsFirstCall = true;
84
+ this.getItemList(this.CurrentPage, true);
85
+ }, false);
86
+ }
87
+ }
88
+ if (this.options.OnKeyPressFiltersControlNames != null && this.options.OnKeyPressFiltersControlNames.length > 0) {
89
+ const OnKeyPressFiltersControlNames = this.options.OnKeyPressFiltersControlNames;
90
+ for (let index = 0; index < OnKeyPressFiltersControlNames.length; index++) {
91
+ const OnKeyPressFiltersControlName = OnKeyPressFiltersControlNames[index];
92
+ let element = this.group.get(OnKeyPressFiltersControlName).nativeElement;
93
+ element.addEventListener("keypress", (e) => {
94
+ if (e.key == "Enter") {
95
+ this.CurrentPage = 1;
96
+ this.IsFirstCall = true;
97
+ this.getItemList(this.CurrentPage, true);
98
+ }
99
+ }, false);
100
+ }
101
+ }
102
+ //Add click event on Reset Filter button
103
+ if (this.options.ResetFilterButtonName != null) {
104
+ const button = document.getElementsByName(this.options.ResetFilterButtonName)[0];
105
+ if (button != undefined) {
106
+ let element = button;
107
+ element.addEventListener("click", (e) => {
108
+ this.clearFilters();
109
+ }, false);
110
+ }
111
+ }
112
+ if (this.options.TypeaheadSearchControlNames != null && this.options.TypeaheadSearchControlNames.length > 0) {
113
+ const TypeaheadSearchControlNames = this.options.TypeaheadSearchControlNames;
114
+ for (let index = 0; index < TypeaheadSearchControlNames.length; index++) {
115
+ const TypeaheadSearchControlName = TypeaheadSearchControlNames[index];
116
+ document.getElementById(TypeaheadSearchControlName).addEventListener("keypress", (e) => {
117
+ if (e.key == "Enter") {
118
+ this.CurrentPage = 1;
119
+ this.IsFirstCall = true;
120
+ this.getItemList(this.CurrentPage, true);
121
+ }
122
+ }, false);
123
+ }
124
+ }
125
+ }
126
+ onDropDownChange(result) {
127
+ if (result) {
128
+ this.CurrentPage = 1;
129
+ this.IsFirstCall = true;
130
+ this.getItemList(this.CurrentPage, true);
131
+ }
132
+ }
133
+ onChangePage(Page) {
134
+ if (Page == 0)
135
+ return;
136
+ if (Page > 0) {
137
+ if (this.IsFirstCall) {
138
+ this.IsFirstCall = false;
139
+ return;
140
+ }
141
+ this.CurrentPage = Page;
142
+ this.getItemList(Page);
143
+ }
144
+ }
145
+ changePageSize(e) {
146
+ this.options.PageSize = e.target.value;
147
+ this.CurrentPage = 1;
148
+ this.IsFirstCall = true;
149
+ this.getItemList(this.CurrentPage, true);
150
+ }
151
+ onScrollDown() {
152
+ this.Sum += this.options.PageSize;
153
+ this.CurrentPage = 1;
154
+ this.IsFirstCall = true;
155
+ this.direction = 'down';
156
+ this.getItemList(this.CurrentPage, true);
157
+ }
158
+ getItemList(page, IsFilterUpdated = false) {
159
+ if (this.options.StartPagingCallback)
160
+ this.options.StartPagingCallback.call(null);
161
+ let pagingDTO = new PagingDTO();
162
+ let size = Number.parseInt(this.options.PageSize.toString());
163
+ if (this.options.IsLoadMoreControl)
164
+ pagingDTO.PageCount = this.Sum;
165
+ else
166
+ pagingDTO.PageCount = size;
167
+ pagingDTO.CurrentPageNumber = page;
168
+ pagingDTO.TotalCount = this.totalRow;
169
+ pagingDTO.IsFilterUpdated = IsFilterUpdated;
170
+ let filters = {};
171
+ filters = this.getFiltersValue();
172
+ //Set Filters object that sent to action URL
173
+ let filtersDTO = {
174
+ PagingDTO: pagingDTO,
175
+ Filters: filters
176
+ };
177
+ let requestOptions = new RequestOptionsModel();
178
+ requestOptions.disableBlockUI = this.options.DisableBlockUI;
179
+ this.requestHandlerService.post(this.options.ActionPostURL, this.options.Filters && this.options.Filters.length > 0 ? filtersDTO : pagingDTO, null, null, requestOptions)
180
+ .subscribe((responseData) => {
181
+ this.result = responseData.items; //this.castItems(responseData.items);
182
+ let castedResult = plainToClass(this.options.TypeOfResponse, this.result, { excludeExtraneousValues: true });
183
+ this.Items.emit(castedResult);
184
+ this.totalRow = responseData.totalCount;
185
+ if (IsFilterUpdated) {
186
+ this.items = [];
187
+ this.Pages = Math.ceil((this.totalRow / this.options.PageSize));
188
+ this.items = Array(this.totalRow);
189
+ this.setText(this.Pages, this.totalRow);
190
+ }
191
+ }, (error) => {
192
+ if (error.status == 401)
193
+ this.router.navigate(["/Admin/account/login"]);
194
+ });
195
+ }
196
+ castItems(objectArr) {
197
+ let originalArray = [];
198
+ for (let index = 0; index < objectArr.length; index++) {
199
+ const element = objectArr[index];
200
+ let key, keys = Object.keys(element);
201
+ let n = keys.length;
202
+ let newObject = {};
203
+ while (n--) {
204
+ key = keys[n];
205
+ let Okey = key;
206
+ newObject[key.charAt(0).toUpperCase() + Okey.slice(1)] = element[key];
207
+ }
208
+ let finalObject = newObject;
209
+ originalArray.push(finalObject);
210
+ }
211
+ return originalArray;
212
+ }
213
+ setText(pagesNumber, itemsNumber) {
214
+ if (this.utilityService.isCurrentLanguageArabic()) {
215
+ //Set pages text
216
+ if (pagesNumber < 3 || pagesNumber > 10)
217
+ this.pagesText = this.utilityService.getResourceValue("Page");
218
+ else
219
+ this.pagesText = this.utilityService.getResourceValue("Pages");
220
+ //Set items text
221
+ if (itemsNumber < 3 || itemsNumber > 10)
222
+ this.itemsText = this.utilityService.getResourceValue("Item");
223
+ else
224
+ this.itemsText = this.utilityService.getResourceValue("Items");
225
+ }
226
+ else {
227
+ //Set pages text
228
+ if (pagesNumber > 1)
229
+ this.pagesText = this.utilityService.getResourceValue("Pages");
230
+ else
231
+ this.pagesText = this.utilityService.getResourceValue("Page");
232
+ //Set items text
233
+ if (itemsNumber > 1)
234
+ this.itemsText = this.utilityService.getResourceValue("Items");
235
+ else
236
+ this.itemsText = this.utilityService.getResourceValue("Item");
237
+ }
238
+ }
239
+ clearFilters() {
240
+ if (this.options.Filters != null && this.options.Filters != []) {
241
+ for (let index = 0; index < this.options.Filters.length; index++) {
242
+ if (this.options.Filters[index].FormControlName != null && this.options.Filters[index].FormControlName != "") {
243
+ const FormControlName = this.options.Filters[index].FormControlName;
244
+ this.group.controls[FormControlName].setValue(null);
245
+ }
246
+ }
247
+ this.ReinitializePaging();
248
+ }
249
+ }
250
+ getFiltersValue() {
251
+ let filters = {};
252
+ if (this.options.Filters != null && this.options.Filters != []) {
253
+ for (let index = 0; index < this.options.Filters.length; index++) {
254
+ if (this.options.Filters[index].FormControlName != null && this.options.Filters[index].FormControlName != "") {
255
+ const FormControlName = this.options.Filters[index].FormControlName;
256
+ let ControlValue = this.group.controls[FormControlName].value;
257
+ if (ControlValue != undefined && ControlValue != null && ControlValue != "") {
258
+ if (this.options.Filters[index].FilterType == FilterType.DatePicker) {
259
+ //if (Array.isArray(ControlValue)) {
260
+ // for (let element = 0; element < ControlValue.length; element++) {
261
+ // const value = ControlValue[element];
262
+ // filters[this.options.Filters[index].ActionParameterName] = value;
263
+ // }
264
+ //}
265
+ //else {
266
+ filters[this.options.Filters[index].ActionParameterName] = ControlValue;
267
+ //}
268
+ }
269
+ else {
270
+ if (this.options.Filters[index].FilterType == FilterType.AutocompleteTextBox)
271
+ ControlValue = ControlValue;
272
+ if (this.options.Filters[index].FilterType == FilterType.TagInput)
273
+ ControlValue = ControlValue;
274
+ filters[this.options.Filters[index].ActionParameterName] = ControlValue;
275
+ }
276
+ }
277
+ else {
278
+ filters[this.options.Filters[index].ActionParameterName] = null;
279
+ }
280
+ }
281
+ else {
282
+ const ElementjQuerySelector = this.options.Filters[index].jQuerySelector;
283
+ let ElementValue = document.querySelector(ElementjQuerySelector).value;
284
+ if (ElementValue != undefined && ElementValue != null)
285
+ filters[this.options.Filters[index].ActionParameterName] = ElementValue;
286
+ else
287
+ filters[this.options.Filters[index].ActionParameterName] = null;
288
+ }
289
+ }
290
+ }
291
+ return filters;
292
+ }
293
+ }
294
+ PagingComponent.decorators = [
295
+ { type: Component, args: [{
296
+ selector: 'BBSF-Paging',
297
+ template: "<div class=\"form-group bbsf-control bbsf-paging\" *ngIf=\"(result.length > 0)\">\r\n <!--paging container-->\r\n <div class=\"bbsf-paging-container\" *ngIf=\"!options.IsLoadMoreControl\">\r\n <!--items-->\r\n <div class=\"bbsf-pagination\">\r\n <jw-pagination [items]=\"items\" *ngIf=\"!((Pages==1)&&options.HidePaginationWhenPageSizeEqualOne)\"\r\n (changePage)=\"onChangePage($event)\" [pageSize]=\"options.PageSize\" [ShowFirstAndLast]=\"options.ShowFirstAndLast\"\r\n [initialPage]=\"1\" [maxPages]=\"10\"></jw-pagination>\r\n </div>\r\n <!--page count-->\r\n <div class=\"bbsf-pages\" *ngIf=\"!((Pages==1)&&options.HidePaginationWhenPageSizeEqualOne)\">\r\n <select (change)=\"changePageSize($event)\" *ngIf=\"options.ShowPageSizeOption\">\r\n <option>10</option>\r\n <option>20</option>\r\n <option>50</option>\r\n <option>100</option>\r\n <option>200</option>\r\n </select>\r\n <div class=\"bssf-items\">\r\n <strong>{{totalRow}}</strong> {{itemsText}} {{utilityService.getResourceValue(\"In\")}} <strong> {{Pages}}</strong> {{pagesText}}\r\n </div>\r\n </div>\r\n </div>\r\n <!--load more-->\r\n <div class=\"bbsf-loadmore\" *ngIf=\"options.IsLoadMoreControl\">\r\n <div class=\"search-results\" infinite-scroll [infiniteScrollDistance]=\"ScrollDistance\"\r\n [infiniteScrollUpDistance]=\"ScrollUpDistance\" [infiniteScrollThrottle]=\"Throttle\" (scrolled)=\"options.IsInfiniteScroll==true?onScrollDown():null\"\r\n [scrollWindow]=\"options.ScrollWindow\" [infiniteScrollContainer]=\"options.InfiniteScrollContainer\">\r\n </div>\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"onScrollDown()\" *ngIf=\"!(result.length==totalRow)\">{{utilityService.getResourceValue(\"LoadMore\")}}</button>\r\n </div>\r\n</div>\r\n\r\n\r\n"
298
+ },] }
299
+ ];
300
+ PagingComponent.ctorParameters = () => [
301
+ { type: UtilityService },
302
+ { type: HttpClient },
303
+ { type: Router },
304
+ { type: OnPagingFiltersChangeService },
305
+ { type: RequestHandlerService }
306
+ ];
307
+ PagingComponent.propDecorators = {
308
+ Items: [{ type: Output }],
309
+ options: [{ type: Input }],
310
+ group: [{ type: Input }]
311
+ };
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFnaW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9QYWdpbmcvUGFnaW5nLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUF3QyxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBOEMsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHMUQsT0FBTyxFQUF1QixZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFekQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDbkcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHakQscURBQXFEO0FBS3JELE1BQU0sT0FBTyxlQUFlO0lBMkIxQixZQUFtQixjQUE4QixFQUFVLElBQWdCLEVBQVUsTUFBYyxFQUFVLGVBQTZDLEVBQVUscUJBQTRDO1FBQTdMLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQVk7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVUsb0JBQWUsR0FBZixlQUFlLENBQThCO1FBQVUsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQXpCaE4sVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUVYLFdBQU0sR0FBUSxFQUFF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QyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsbUJBQW1CLENBQUMsR0FBRyxJQUFJLENBQUM7aUJBQ25FO2FBQ0Y7U0FDRjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7OztZQS9URixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLG0zREFBc0M7YUFDdkM7OztZQVJvRCxjQUFjO1lBUjFELFVBQVU7WUFEVixNQUFNO1lBT04sNEJBQTRCO1lBRTVCLHFCQUFxQjs7O29CQStCM0IsTUFBTTtzQkFDTixLQUFLO29CQUNMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIElucHV0LCBTaW1wbGVDaGFuZ2VzLCBFbGVtZW50UmVmLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBQYWdpbmdEVE8gfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL1BhZ2luZ0RUTyc7XHJcbmltcG9ydCB7IFBhZ2luZ09wdGlvbnMgfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL1BhZ2luZ09wdGlvbnMnO1xyXG5pbXBvcnQgeyBSZXF1ZXN0T3B0aW9ucywgUmVzcG9uc2VDb250ZW50VHlwZSwgSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPblBhZ2luZ0ZpbHRlcnNDaGFuZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL09uUGFnaW5nRmlsdGVyc0NoYW5nZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmlsdGVyVHlwZSB9IGZyb20gJy4uLy4uL1NoYXJlZC9FbnVtcy9GaWx0ZXJUeXBlJztcclxuaW1wb3J0IHsgUmVxdWVzdEhhbmRsZXJTZXJ2aWNlLCBSZXF1ZXN0T3B0aW9uc01vZGVsLCBVdGlsaXR5U2VydmljZSB9IGZyb20gJ0BibnNpZ2h0cy9iYnNmLXV0aWxpdGllcyc7XHJcbmltcG9ydCB7IHBsYWluVG9DbGFzcyB9IGZyb20gJ2NsYXNzLXRyYW5zZm9ybWVyJztcclxuaW1wb3J0IHsgUGFnaW5nUGF5bG9hZCB9IGZyb20gJy4uLy4uL1NoYXJlZC9Nb2RlbHMvUGFnaW5nUGF5bG9hZCc7XHJcblxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbmZsaWN0aW5nLWxpZmVjeWNsZVxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ0JCU0YtUGFnaW5nJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vUGFnaW5nLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUGFnaW5nQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBpdGVtcyA9IFtdO1xyXG4gIHBhZ2VPZkl0ZW1zOiBBcnJheTxhbnk+O1xyXG4gIHJlc3VsdDogVFtdID0gW107XHJcbiAgcGFnZXJDb25maWc6IGFueSA9IG51bGw7XHJcbiAgdG90YWxSb3c6IGFueSA9IDA7XHJcbiAgcGFnZVNpemU6IGFueSA9IDEwXHJcbiAgUGFnZXM6IGFueSA9IDBcclxuICBwYWdlc1RleHQ6IHN0cmluZztcclxuICBpdGVtc1RleHQ6IHN0cmluZztcclxuICBDdXJyZW50UGFnZTogYW55ID0gMVxyXG4gIFNob3dQYWdlU2l6ZU9wdGlvbiA9IHRydWU7XHJcbiAgU2hvd0ZpcnN0QW5kTGFzdCA9IHRydWU7XHJcbiAgaGlkZVBhZ2luYXRpb25XaGVuUGFnZVNpemVFcXVhbE9uZSA9IHRydWVcclxuICBTdW0gPSAwO1xyXG4gIFRocm90dGxlID0gMzAwO1xyXG4gIFNjcm9sbERpc3RhbmNlID0gMTtcclxuICBTY3JvbGxVcERpc3RhbmNlID0gMjtcclxuICBkaXJlY3Rpb24gPSAnJztcclxuICBIZWFkZXJzOiBIdHRwSGVhZGVycztcclxuICBJc0ZpcnN0Q2FsbDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQE91dHB1dCgpIEl0ZW1zOiBFdmVudEVtaXR0ZXI8VFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8VFtdPigpO1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IFBhZ2luZ09wdGlvbnM7XHJcbiAgQElucHV0KCkgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdXRpbGl0eVNlcnZpY2U6IFV0aWxpdHlTZXJ2aWNlLCBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsIHByaXZhdGUgb25DaGFuZ2VTZXJ2aWNlOiBPblBhZ2luZ0ZpbHRlcnNDaGFuZ2VTZXJ2aWNlLCBwcml2YXRlIHJlcXVlc3RIYW5kbGVyU2VydmljZTogUmVxdWVzdEhhbmRsZXJTZXJ2aWNlKSB7XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKClcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Jc0xvYWRNb3JlQ29udHJvbClcclxuICAgICAgdGhpcy5TdW0gPSB0aGlzLm9wdGlvbnMuUGFnZVNpemU7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Ecm9wZG93bkZpbHRlcnNDb250cm9sTmFtZXMgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMuRHJvcGRvd25GaWx0ZXJzQ29udHJvbE5hbWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgRHJvcGRvd25GaWx0ZXJzQ29udHJvbE5hbWVzID0gdGhpcy5vcHRpb25zLkRyb3Bkb3duRmlsdGVyc0NvbnRyb2xOYW1lcztcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlU2VydmljZS5HZXRWYWx1ZSgpLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm9wdGlvbnMuRHJvcGRvd25GaWx0ZXJzQ29udHJvbE5hbWVzLmZpbHRlcigoaXRlbSkgPT4gaXRlbSA9PSB2YWx1ZSlcclxuICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLklzRmlyc3RDYWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5DdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0SXRlbUxpc3QodGhpcy5DdXJyZW50UGFnZSwgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Cb290c3RyYXBEYXRlUGlja2Vyc0ZpbHRlcnNDb250cm9sTmFtZXMgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMuQm9vdHN0cmFwRGF0ZVBpY2tlcnNGaWx0ZXJzQ29udHJvbE5hbWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgQm9vdHN0cmFwRGF0ZVBpY2tlcnNGaWx0ZXJzQ29udHJvbE5hbWVzID0gdGhpcy5vcHRpb25zLkJvb3RzdHJhcERhdGVQaWNrZXJzRmlsdGVyc0NvbnRyb2xOYW1lcztcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLm9uQ2hhbmdlU2VydmljZS5HZXRWYWx1ZSgpLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5vcHRpb25zLkJvb3RzdHJhcERhdGVQaWNrZXJzRmlsdGVyc0NvbnRyb2xOYW1lcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gPT0gdmFsdWUpXHJcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLklzRmlyc3RDYWxsID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuQ3VycmVudFBhZ2UgPSAxO1xyXG4gICAgICAgICAgdGhpcy5nZXRJdGVtTGlzdCh0aGlzLkN1cnJlbnRQYWdlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pKVxyXG4gICAgfVxyXG4gICAgdGhpcy5Jc0ZpcnN0Q2FsbCA9IHRydWU7XHJcbiAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuQ3VycmVudFBhZ2UsIHRydWUpO1xyXG4gIH1cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5PbkNsaWNrRmlsdGVyc0NvbnRyb2xOYW1lcyAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5PbkNsaWNrRmlsdGVyc0NvbnRyb2xOYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IE9uQ2xpY2tGaWx0ZXJzQ29udHJvbE5hbWVzID0gdGhpcy5vcHRpb25zLk9uQ2xpY2tGaWx0ZXJzQ29udHJvbE5hbWVzO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgT25DbGlja0ZpbHRlcnNDb250cm9sTmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgT25DbGlja0ZpbHRlcnNDb250cm9sTmFtZSA9IE9uQ2xpY2tGaWx0ZXJzQ29udHJvbE5hbWVzW2luZGV4XTtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChPbkNsaWNrRmlsdGVyc0NvbnRyb2xOYW1lKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5DdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgICAgICB0aGlzLklzRmlyc3RDYWxsID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZ2V0SXRlbUxpc3QodGhpcy5DdXJyZW50UGFnZSwgdHJ1ZSk7XHJcbiAgICAgICAgfSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLk9uS2V5UHJlc3NGaWx0ZXJzQ29udHJvbE5hbWVzICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLk9uS2V5UHJlc3NGaWx0ZXJzQ29udHJvbE5hbWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgT25LZXlQcmVzc0ZpbHRlcnNDb250cm9sTmFtZXMgPSB0aGlzLm9wdGlvbnMuT25LZXlQcmVzc0ZpbHRlcnNDb250cm9sTmFtZXM7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBPbktleVByZXNzRmlsdGVyc0NvbnRyb2xOYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBPbktleVByZXNzRmlsdGVyc0NvbnRyb2xOYW1lID0gT25LZXlQcmVzc0ZpbHRlcnNDb250cm9sTmFtZXNbaW5kZXhdO1xyXG4gICAgICAgIGxldCBlbGVtZW50ID0gKDxhbnk+dGhpcy5ncm91cC5nZXQoT25LZXlQcmVzc0ZpbHRlcnNDb250cm9sTmFtZSkpLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmtleSA9PSBcIkVudGVyXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5DdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgICAgICAgIHRoaXMuSXNGaXJzdENhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuQ3VycmVudFBhZ2UsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9BZGQgY2xpY2sgZXZlbnQgb24gUmVzZXQgRmlsdGVyIGJ1dHRvblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5SZXNldEZpbHRlckJ1dHRvbk5hbWUgIT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSh0aGlzLm9wdGlvbnMuUmVzZXRGaWx0ZXJCdXR0b25OYW1lKVswXTtcclxuICAgICAgaWYgKGJ1dHRvbiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBsZXQgZWxlbWVudCA9IGJ1dHRvbiBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jbGVhckZpbHRlcnMoKTtcclxuICAgICAgICB9LCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuVHlwZWFoZWFkU2VhcmNoQ29udHJvbE5hbWVzICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLlR5cGVhaGVhZFNlYXJjaENvbnRyb2xOYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IFR5cGVhaGVhZFNlYXJjaENvbnRyb2xOYW1lcyA9IHRoaXMub3B0aW9ucy5UeXBlYWhlYWRTZWFyY2hDb250cm9sTmFtZXM7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBUeXBlYWhlYWRTZWFyY2hDb250cm9sTmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgVHlwZWFoZWFkU2VhcmNoQ29udHJvbE5hbWUgPSBUeXBlYWhlYWRTZWFyY2hDb250cm9sTmFtZXNbaW5kZXhdO1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFR5cGVhaGVhZFNlYXJjaENvbnRyb2xOYW1lKS5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmtleSA9PSBcIkVudGVyXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5DdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgICAgICAgIHRoaXMuSXNGaXJzdENhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuQ3VycmVudFBhZ2UsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIGZhbHNlKTtcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBvbkRyb3BEb3duQ2hhbmdlKHJlc3VsdCkge1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICB0aGlzLkN1cnJlbnRQYWdlID0gMTtcclxuICAgICAgdGhpcy5Jc0ZpcnN0Q2FsbCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZ2V0SXRlbUxpc3QodGhpcy5DdXJyZW50UGFnZSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZVBhZ2UoUGFnZSkge1xyXG4gICAgaWYgKFBhZ2UgPT0gMClcclxuICAgICAgcmV0dXJuO1xyXG4gICAgaWYgKFBhZ2UgPiAwKSB7XHJcbiAgICAgIGlmICh0aGlzLklzRmlyc3RDYWxsKSB7XHJcbiAgICAgICAgdGhpcy5Jc0ZpcnN0Q2FsbCA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLkN1cnJlbnRQYWdlID0gUGFnZTtcclxuICAgICAgdGhpcy5nZXRJdGVtTGlzdChQYWdlKTtcclxuICAgIH1cclxuICB9XHJcbiAgY2hhbmdlUGFnZVNpemUoZSkge1xyXG4gICAgdGhpcy5vcHRpb25zLlBhZ2VTaXplID0gZS50YXJnZXQudmFsdWU7XHJcbiAgICB0aGlzLkN1cnJlbnRQYWdlID0gMTtcclxuICAgIHRoaXMuSXNGaXJzdENhbGwgPSB0cnVlO1xyXG4gICAgdGhpcy5nZXRJdGVtTGlzdCh0aGlzLkN1cnJlbnRQYWdlLCB0cnVlKTtcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG4gIG9uU2Nyb2xsRG93bigpIHtcclxuICAgIHRoaXMuU3VtICs9IHRoaXMub3B0aW9ucy5QYWdlU2l6ZVxyXG4gICAgdGhpcy5DdXJyZW50UGFnZSA9IDFcclxuICAgIHRoaXMuSXNGaXJzdENhbGwgPSB0cnVlO1xyXG4gICAgdGhpcy5kaXJlY3Rpb24gPSAnZG93bic7XHJcbiAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuQ3VycmVudFBhZ2UsIHRydWUpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBnZXRJdGVtTGlzdChwYWdlLCBJc0ZpbHRlclVwZGF0ZWQgPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5TdGFydFBhZ2luZ0NhbGxiYWNrKVxyXG4gICAgICB0aGlzLm9wdGlvbnMuU3RhcnRQYWdpbmdDYWxsYmFjay5jYWxsKG51bGwpO1xyXG5cclxuICAgIGxldCBwYWdpbmdEVE8gPSBuZXcgUGFnaW5nRFRPKCk7XHJcbiAgICBsZXQgc2l6ZSA9IE51bWJlci5wYXJzZUludCh0aGlzLm9wdGlvbnMuUGFnZVNpemUudG9TdHJpbmcoKSk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLklzTG9hZE1vcmVDb250cm9sKVxyXG4gICAgICBwYWdpbmdEVE8uUGFnZUNvdW50ID0gdGhpcy5TdW07XHJcbiAgICBlbHNlXHJcbiAgICAgIHBhZ2luZ0RUTy5QYWdlQ291bnQgPSBzaXplO1xyXG5cclxuICAgIHBhZ2luZ0RUTy5DdXJyZW50UGFnZU51bWJlciA9IHBhZ2U7XHJcbiAgICBwYWdpbmdEVE8uVG90YWxDb3VudCA9IHRoaXMudG90YWxSb3c7XHJcbiAgICBwYWdpbmdEVE8uSXNGaWx0ZXJVcGRhdGVkID0gSXNGaWx0ZXJVcGRhdGVkO1xyXG4gICAgbGV0IGZpbHRlcnMgPSB7fTtcclxuICAgIGZpbHRlcnMgPSB0aGlzLmdldEZpbHRlcnNWYWx1ZSgpO1xyXG5cclxuICAgIC8vU2V0IEZpbHRlcnMgb2JqZWN0IHRoYXQgc2VudCB0byBhY3Rpb24gVVJMXHJcbiAgICBsZXQgZmlsdGVyc0RUTzogUGFnaW5nUGF5bG9hZCA9IHtcclxuICAgICAgUGFnaW5nRFRPOiBwYWdpbmdEVE8sXHJcbiAgICAgIEZpbHRlcnM6IGZpbHRlcnNcclxuICAgIH07XHJcblxyXG4gICAgbGV0IHJlcXVlc3RPcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zTW9kZWwoKTtcclxuICAgIHJlcXVlc3RPcHRpb25zLmRpc2FibGVCbG9ja1VJID0gdGhpcy5vcHRpb25zLkRpc2FibGVCbG9ja1VJO1xyXG4gICAgdGhpcy5yZXF1ZXN0SGFuZGxlclNlcnZpY2UucG9zdCh0aGlzLm9wdGlvbnMuQWN0aW9uUG9zdFVSTCwgdGhpcy5vcHRpb25zLkZpbHRlcnMgJiYgdGhpcy5vcHRpb25zLkZpbHRlcnMubGVuZ3RoID4gMCA/IGZpbHRlcnNEVE8gOiBwYWdpbmdEVE8sIG51bGwsIG51bGwsIHJlcXVlc3RPcHRpb25zKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZURhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVzdWx0ID0gcmVzcG9uc2VEYXRhLml0ZW1zIC8vdGhpcy5jYXN0SXRlbXMocmVzcG9uc2VEYXRhLml0ZW1zKTtcclxuICAgICAgICBsZXQgY2FzdGVkUmVzdWx0ID0gcGxhaW5Ub0NsYXNzKHRoaXMub3B0aW9ucy5UeXBlT2ZSZXNwb25zZSwgdGhpcy5yZXN1bHQsIHsgZXhjbHVkZUV4dHJhbmVvdXNWYWx1ZXM6IHRydWUgfSlcclxuICAgICAgICB0aGlzLkl0ZW1zLmVtaXQoY2FzdGVkUmVzdWx0KTtcclxuICAgICAgICB0aGlzLnRvdGFsUm93ID0gcmVzcG9uc2VEYXRhLnRvdGFsQ291bnQ7XHJcblxyXG4gICAgICAgIGlmIChJc0ZpbHRlclVwZGF0ZWQpIHtcclxuICAgICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcclxuICAgICAgICAgIHRoaXMuUGFnZXMgPSBNYXRoLmNlaWwoKHRoaXMudG90YWxSb3cgLyB0aGlzLm9wdGlvbnMuUGFnZVNpemUpKTtcclxuICAgICAgICAgIHRoaXMuaXRlbXMgPSBBcnJheSh0aGlzLnRvdGFsUm93KTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNldFRleHQodGhpcy5QYWdlcywgdGhpcy50b3RhbFJvdyk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfSwgKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDAxKVxyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiL0FkbWluL2FjY291bnQvbG9naW5cIl0pXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgUmVpbml0aWFsaXplUGFnaW5nID0gKCkgPT4ge1xyXG4gICAgdGhpcy5Jc0ZpcnN0Q2FsbCA9IHRydWU7XHJcbiAgICB0aGlzLmdldEl0ZW1MaXN0KDEsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgVXBkYXRlUGFnaW5nID0gKCkgPT4ge1xyXG4gICAgLy90aGlzLklzRmlyc3RDYWxsPXRydWU7XHJcbiAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuQ3VycmVudFBhZ2UpO1xyXG4gIH1cclxuXHJcbiAgY2FzdEl0ZW1zKG9iamVjdEFycjogYW55W10pOiBUW10ge1xyXG4gICAgbGV0IG9yaWdpbmFsQXJyYXk6IFRbXSA9IFtdXHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2JqZWN0QXJyLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gb2JqZWN0QXJyW2luZGV4XTtcclxuICAgICAgbGV0IGtleSwga2V5cyA9IE9iamVjdC5rZXlzKGVsZW1lbnQpO1xyXG4gICAgICBsZXQgbiA9IGtleXMubGVuZ3RoO1xyXG4gICAgICBsZXQgbmV3T2JqZWN0ID0ge31cclxuICAgICAgd2hpbGUgKG4tLSkge1xyXG4gICAgICAgIGtleSA9IGtleXNbbl07XHJcbiAgICAgICAgbGV0IE9rZXkgPSBrZXlcclxuICAgICAgICBuZXdPYmplY3Rba2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgT2tleS5zbGljZSgxKV0gPSBlbGVtZW50W2tleV07XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGZpbmFsT2JqZWN0ID0gbmV3T2JqZWN0IGFzIFRcclxuICAgICAgb3JpZ2luYWxBcnJheS5wdXNoKGZpbmFsT2JqZWN0KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvcmlnaW5hbEFycmF5O1xyXG4gIH1cclxuXHJcbiAgc2V0VGV4dChwYWdlc051bWJlcjogbnVtYmVyLCBpdGVtc051bWJlcjogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy51dGlsaXR5U2VydmljZS5pc0N1cnJlbnRMYW5ndWFnZUFyYWJpYygpKSB7XHJcbiAgICAgIC8vU2V0IHBhZ2VzIHRleHRcclxuICAgICAgaWYgKHBhZ2VzTnVtYmVyIDwgMyB8fCBwYWdlc051bWJlciA+IDEwKVxyXG4gICAgICAgIHRoaXMucGFnZXNUZXh0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUGFnZVwiKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMucGFnZXNUZXh0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUGFnZXNcIik7XHJcbiAgICAgIC8vU2V0IGl0ZW1zIHRleHRcclxuICAgICAgaWYgKGl0ZW1zTnVtYmVyIDwgMyB8fCBpdGVtc051bWJlciA+IDEwKVxyXG4gICAgICAgIHRoaXMuaXRlbXNUZXh0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSXRlbVwiKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuaXRlbXNUZXh0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSXRlbXNcIik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy9TZXQgcGFnZXMgdGV4dFxyXG4gICAgICBpZiAocGFnZXNOdW1iZXIgPiAxKVxyXG4gICAgICAgIHRoaXMucGFnZXNUZXh0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUGFnZXNcIik7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnBhZ2VzVGV4dCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlBhZ2VcIik7XHJcbiAgICAgIC8vU2V0IGl0ZW1zIHRleHRcclxuICAgICAgaWYgKGl0ZW1zTnVtYmVyID4gMSlcclxuICAgICAgICB0aGlzLml0ZW1zVGV4dCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkl0ZW1zXCIpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5pdGVtc1RleHQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJJdGVtXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJGaWx0ZXJzKCkge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5GaWx0ZXJzICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLkZpbHRlcnMgIT0gW10pIHtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMub3B0aW9ucy5GaWx0ZXJzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuRmlsdGVyc1tpbmRleF0uRm9ybUNvbnRyb2xOYW1lICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLkZpbHRlcnNbaW5kZXhdLkZvcm1Db250cm9sTmFtZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICBjb25zdCBGb3JtQ29udHJvbE5hbWUgPSB0aGlzLm9wdGlvbnMuRmlsdGVyc1tpbmRleF0uRm9ybUNvbnRyb2xOYW1lO1xyXG4gICAgICAgICAgdGhpcy5ncm91cC5jb250cm9sc1tGb3JtQ29udHJvbE5hbWVdLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLlJlaW5pdGlhbGl6ZVBhZ2luZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyc1ZhbHVlKCkge1xyXG4gICAgbGV0IGZpbHRlcnMgPSB7fTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuRmlsdGVycyAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5GaWx0ZXJzICE9IFtdKSB7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm9wdGlvbnMuRmlsdGVycy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLkZpbHRlcnNbaW5kZXhdLkZvcm1Db250cm9sTmFtZSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5GaWx0ZXJzW2luZGV4XS5Gb3JtQ29udHJvbE5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgY29uc3QgRm9ybUNvbnRyb2xOYW1lID0gdGhpcy5vcHRpb25zLkZpbHRlcnNbaW5kZXhdLkZvcm1Db250cm9sTmFtZTtcclxuICAgICAgICAgIGxldCBDb250cm9sVmFsdWUgPSB0aGlzLmdyb3VwLmNvbnRyb2xzW0Zvcm1Db250cm9sTmFtZV0udmFsdWU7XHJcbiAgICAgICAgICBpZiAoQ29udHJvbFZhbHVlICE9IHVuZGVmaW5lZCAmJiBDb250cm9sVmFsdWUgIT0gbnVsbCAmJiBDb250cm9sVmFsdWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLkZpbHRlcnNbaW5kZXhdLkZpbHRlclR5cGUgPT0gRmlsdGVyVHlwZS5EYXRlUGlja2VyKSB7XHJcbiAgICAgICAgICAgICAgLy9pZiAoQXJyYXkuaXNBcnJheShDb250cm9sVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgLy8gIGZvciAobGV0IGVsZW1lbnQgPSAwOyBlbGVtZW50IDwgQ29udHJvbFZhbHVlLmxlbmd0aDsgZWxlbWVudCsrKSB7XHJcbiAgICAgICAgICAgICAgLy8gICAgY29uc3QgdmFsdWUgPSBDb250cm9sVmFsdWVbZWxlbWVudF07XHJcbiAgICAgICAgICAgICAgLy8gICAgZmlsdGVyc1t0aGlzLm9wdGlvbnMuRmlsdGVyc1tpbmRleF0uQWN0aW9uUGFyYW1ldGVyTmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAvLyAgfVxyXG4gICAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgICAgZmlsdGVyc1t0aGlzLm9wdGlvbnMuRmlsdGVyc1tpbmRleF0uQWN0aW9uUGFyYW1ldGVyTmFtZV0gPSBDb250cm9sVmFsdWU7XHJcbiAgICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5GaWx0ZXJzW2luZGV4XS5GaWx0ZXJUeXBlID09IEZpbHRlclR5cGUuQXV0b2NvbXBsZXRlVGV4dEJveClcclxuICAgICAgICAgICAgICAgIENvbnRyb2xWYWx1ZSA9IENvbnRyb2xWYWx1ZTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLkZpbHRlcnNbaW5kZXhdLkZpbHRlclR5cGUgPT0gRmlsdGVyVHlwZS5UYWdJbnB1dClcclxuICAgICAgICAgICAgICAgIENvbnRyb2xWYWx1ZSA9IENvbnRyb2xWYWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgZmlsdGVyc1t0aGlzLm9wdGlvbnMuRmlsdGVyc1tpbmRleF0uQWN0aW9uUGFyYW1ldGVyTmFtZV0gPSBDb250cm9sVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmaWx0ZXJzW3RoaXMub3B0aW9ucy5GaWx0ZXJzW2luZGV4XS5BY3Rpb25QYXJhbWV0ZXJOYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgRWxlbWVudGpRdWVyeVNlbGVjdG9yID0gdGhpcy5vcHRpb25zLkZpbHRlcnNbaW5kZXhdLmpRdWVyeVNlbGVjdG9yO1xyXG4gICAgICAgICAgbGV0IEVsZW1lbnRWYWx1ZSA9IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKEVsZW1lbnRqUXVlcnlTZWxlY3RvcikgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XHJcbiAgICAgICAgICBpZiAoRWxlbWVudFZhbHVlICE9IHVuZGVmaW5lZCAmJiBFbGVtZW50VmFsdWUgIT0gbnVsbClcclxuICAgICAgICAgICAgZmlsdGVyc1t0aGlzLm9wdGlvbnMuRmlsdGVyc1tpbmRleF0uQWN0aW9uUGFyYW1ldGVyTmFtZV0gPSBFbGVtZW50VmFsdWU7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGZpbHRlcnNbdGhpcy5vcHRpb25zLkZpbHRlcnNbaW5kZXhdLkFjdGlvblBhcmFtZXRlck5hbWVdID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmaWx0ZXJzO1xyXG4gIH1cclxufVxyXG4iXX0=