@tsi-developpement/tsi-shared-ui 0.0.1

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 (558) hide show
  1. package/esm2022/lib/consts/app-providers.mjs +11 -0
  2. package/esm2022/lib/consts/html-template.const.mjs +40 -0
  3. package/esm2022/lib/consts/index.mjs +8 -0
  4. package/esm2022/lib/consts/localization-key.mjs +12 -0
  5. package/esm2022/lib/consts/locals.const.mjs +8 -0
  6. package/esm2022/lib/consts/queryParamNames.const.mjs +11 -0
  7. package/esm2022/lib/consts/themes.mjs +5 -0
  8. package/esm2022/lib/consts/tsi-consts.mjs +45 -0
  9. package/esm2022/lib/end-points/authorization-endpoints.mjs +35 -0
  10. package/esm2022/lib/end-points/baseuri.mjs +11 -0
  11. package/esm2022/lib/end-points/endpoints.mjs +208 -0
  12. package/esm2022/lib/end-points/import-export-endpoint.mjs +35 -0
  13. package/esm2022/lib/end-points/index.mjs +7 -0
  14. package/esm2022/lib/end-points/presentation-settings-endpoints.mjs +13 -0
  15. package/esm2022/lib/end-points/reporting-endpoints.mjs +55 -0
  16. package/esm2022/lib/end-points/shared-endpoint.mjs +12 -0
  17. package/esm2022/lib/end-points/user-identity-endpoints.mjs +61 -0
  18. package/esm2022/lib/enums/Language.mjs +9 -0
  19. package/esm2022/lib/enums/auto-complete.mjs +6 -0
  20. package/esm2022/lib/enums/button-type.enum.mjs +6 -0
  21. package/esm2022/lib/enums/claim-types.mjs +15 -0
  22. package/esm2022/lib/enums/code-format.mjs +6 -0
  23. package/esm2022/lib/enums/component-use-modes-enum.mjs +19 -0
  24. package/esm2022/lib/enums/css-units.mjs +10 -0
  25. package/esm2022/lib/enums/decimal-format.mjs +8 -0
  26. package/esm2022/lib/enums/display-types.mjs +35 -0
  27. package/esm2022/lib/enums/filter-operator-type.mjs +34 -0
  28. package/esm2022/lib/enums/form-validation-error.mjs +7 -0
  29. package/esm2022/lib/enums/grid-selection-mode.mjs +7 -0
  30. package/esm2022/lib/enums/grid-sort-mode.mjs +7 -0
  31. package/esm2022/lib/enums/http-method-types.mjs +6 -0
  32. package/esm2022/lib/enums/index.mjs +25 -0
  33. package/esm2022/lib/enums/input-types.mjs +20 -0
  34. package/esm2022/lib/enums/layout-orientation.mjs +6 -0
  35. package/esm2022/lib/enums/logout-reason-enum.mjs +8 -0
  36. package/esm2022/lib/enums/modal-size-enum.mjs +10 -0
  37. package/esm2022/lib/enums/report-type.mjs +9 -0
  38. package/esm2022/lib/enums/status.mjs +9 -0
  39. package/esm2022/lib/enums/text-box-type.mjs +7 -0
  40. package/esm2022/lib/enums/tooltipPosition.enum.mjs +8 -0
  41. package/esm2022/lib/enums/tsi-component-enum.mjs +40 -0
  42. package/esm2022/lib/enums/type-import.mjs +6 -0
  43. package/esm2022/lib/functions/array.functions.mjs +8 -0
  44. package/esm2022/lib/functions/index.mjs +3 -0
  45. package/esm2022/lib/functions/modal-open.function.mjs +69 -0
  46. package/esm2022/lib/guards/admin.guard.mjs +37 -0
  47. package/esm2022/lib/guards/auth.guard.mjs +30 -0
  48. package/esm2022/lib/guards/index.mjs +4 -0
  49. package/esm2022/lib/guards/permission.guard.mjs +32 -0
  50. package/esm2022/lib/interfaces/configuration/configuration.mjs +2 -0
  51. package/esm2022/lib/interfaces/generic-form/generic-form.mjs +118 -0
  52. package/esm2022/lib/interfaces/generic-types/dictionary.mjs +2 -0
  53. package/esm2022/lib/interfaces/grid/grid-configuration.mjs +2 -0
  54. package/esm2022/lib/interfaces/index.mjs +12 -0
  55. package/esm2022/lib/interfaces/modal/dynamic.component.mjs +7 -0
  56. package/esm2022/lib/interfaces/modal/modal-size.mjs +2 -0
  57. package/esm2022/lib/interfaces/pagination/pagination-base.mjs +2 -0
  58. package/esm2022/lib/interfaces/select-list/combo-status-model.mjs +10 -0
  59. package/esm2022/lib/interfaces/settings/app-settings.mjs +2 -0
  60. package/esm2022/lib/interfaces/styles/css-size-property.mjs +17 -0
  61. package/esm2022/lib/interfaces/translation/translation.mjs +2 -0
  62. package/esm2022/lib/models/Notes/Note.mjs +7 -0
  63. package/esm2022/lib/models/application/configuration/endpoint-infos.mjs +3 -0
  64. package/esm2022/lib/models/application/configuration/entity-delete-behavior.mjs +2 -0
  65. package/esm2022/lib/models/authorization/authorization-token-mapper.mjs +24 -0
  66. package/esm2022/lib/models/authorization/authorization-token.mjs +2 -0
  67. package/esm2022/lib/models/common/component-descriminator.mjs +2 -0
  68. package/esm2022/lib/models/common/entity-properties.mjs +2 -0
  69. package/esm2022/lib/models/common/entity-validations.mjs +2 -0
  70. package/esm2022/lib/models/common/event-schema.mjs +2 -0
  71. package/esm2022/lib/models/common/key-value-pair.mjs +2 -0
  72. package/esm2022/lib/models/entity-info/entity-info.mjs +29 -0
  73. package/esm2022/lib/models/filter/filter-by-existing-values.mjs +7 -0
  74. package/esm2022/lib/models/filter/paged-result-request-base.mjs +13 -0
  75. package/esm2022/lib/models/filter/search-field.mjs +2 -0
  76. package/esm2022/lib/models/import-export/import-export.mjs +15 -0
  77. package/esm2022/lib/models/index.mjs +38 -0
  78. package/esm2022/lib/models/journalisation-application/journalisation-application.mjs +10 -0
  79. package/esm2022/lib/models/journalisation-application/status-history.mjs +3 -0
  80. package/esm2022/lib/models/layout/layout-config.mjs +2 -0
  81. package/esm2022/lib/models/modal/bs-modal.mjs +6 -0
  82. package/esm2022/lib/models/presentation-settings/presentation-settings.mjs +8 -0
  83. package/esm2022/lib/models/progress-bar/progress-bar-create-request.mjs +2 -0
  84. package/esm2022/lib/models/progress-bar/progress-bar-response.mjs +8 -0
  85. package/esm2022/lib/models/progress-bar/progress-bar-update-request.mjs +3 -0
  86. package/esm2022/lib/models/remote-services-utility/subscription-result.mjs +17 -0
  87. package/esm2022/lib/models/reporting/json-data-connection.mjs +2 -0
  88. package/esm2022/lib/models/reporting/optional-endpoints.mjs +2 -0
  89. package/esm2022/lib/models/reporting/report-template-response.mjs +2 -0
  90. package/esm2022/lib/models/reporting/report-to-edit-template.mjs +2 -0
  91. package/esm2022/lib/models/reporting/report-to-print.mjs +2 -0
  92. package/esm2022/lib/models/reporting/report-to-template.mjs +2 -0
  93. package/esm2022/lib/models/settings/devise.mjs +3 -0
  94. package/esm2022/lib/models/settings/fichier.mjs +6 -0
  95. package/esm2022/lib/models/settings/type-fichier.mjs +3 -0
  96. package/esm2022/lib/models/tsi-card/tsi-card.mjs +3 -0
  97. package/esm2022/lib/models/user-identity/login-response.mjs +7 -0
  98. package/esm2022/lib/models/user-identity/tenant.mjs +3 -0
  99. package/esm2022/lib/models/user-identity/user-identity.mjs +3 -0
  100. package/esm2022/lib/models/workflow/workflow.mjs +14 -0
  101. package/esm2022/lib/package-initializer.mjs +7 -0
  102. package/esm2022/lib/pipes/cut-label.pipe.mjs +23 -0
  103. package/esm2022/lib/pipes/index.mjs +8 -0
  104. package/esm2022/lib/pipes/localize.pipe.mjs +51 -0
  105. package/esm2022/lib/pipes/modal-label.pipe.mjs +37 -0
  106. package/esm2022/lib/pipes/shorten.pipe.mjs +20 -0
  107. package/esm2022/lib/pipes/to-number.pipe.mjs +20 -0
  108. package/esm2022/lib/pipes/tsi-currency.pipe.mjs +29 -0
  109. package/esm2022/lib/pipes/tsi-decimal.pipe.mjs +21 -0
  110. package/esm2022/lib/providers/index.mjs +2 -0
  111. package/esm2022/lib/providers/shared-ui-tsi.provider.mjs +15 -0
  112. package/esm2022/lib/routes/admin.routes.mjs +5 -0
  113. package/esm2022/lib/routes/app.routes.mjs +7 -0
  114. package/esm2022/lib/routes/identity.routes.mjs +4 -0
  115. package/esm2022/lib/routes/index.mjs +5 -0
  116. package/esm2022/lib/routes/manage-reporting.routes.mjs +5 -0
  117. package/esm2022/lib/services/Component-Finder/tsi-component-finder.service.mjs +22 -0
  118. package/esm2022/lib/services/Import-Export/modele-import.service.mjs +59 -0
  119. package/esm2022/lib/services/Note/Note.service.mjs +35 -0
  120. package/esm2022/lib/services/UserIdentity/identity-platform-authentication.service.mjs +29 -0
  121. package/esm2022/lib/services/UserIdentity/user-identity.service.mjs +40 -0
  122. package/esm2022/lib/services/application/api-explorer.service.mjs +24 -0
  123. package/esm2022/lib/services/application/app.layout.service.mjs +97 -0
  124. package/esm2022/lib/services/application/parametres-application-parambase.service.mjs +20 -0
  125. package/esm2022/lib/services/authorization/authorization.service.mjs +124 -0
  126. package/esm2022/lib/services/authorization/identity-manager.service.mjs +97 -0
  127. package/esm2022/lib/services/base/crud-base.service.mjs +38 -0
  128. package/esm2022/lib/services/configuration/entity-configuration.service.mjs +49 -0
  129. package/esm2022/lib/services/currentUser/currentUser.service.mjs +49 -0
  130. package/esm2022/lib/services/date-helper.service.mjs +133 -0
  131. package/esm2022/lib/services/dialog-data.service.mjs +32 -0
  132. package/esm2022/lib/services/fichier/fichier-upload.service.mjs +44 -0
  133. package/esm2022/lib/services/fichier/fichier.service.mjs +20 -0
  134. package/esm2022/lib/services/formula.service.mjs +20 -0
  135. package/esm2022/lib/services/generator/html-template-generator.service.mjs +196 -0
  136. package/esm2022/lib/services/index.mjs +41 -0
  137. package/esm2022/lib/services/journalisation/journalisation-application.service.mjs +23 -0
  138. package/esm2022/lib/services/journalisation/status-history.service.mjs +23 -0
  139. package/esm2022/lib/services/layout/layout-helper.service.mjs +72 -0
  140. package/esm2022/lib/services/modal/tsi-bs-modal.service.mjs +37 -0
  141. package/esm2022/lib/services/modal/tsi-modal.service.mjs +21 -0
  142. package/esm2022/lib/services/module-code/module-code.service.mjs +31 -0
  143. package/esm2022/lib/services/module-main-parameter.service.mjs +31 -0
  144. package/esm2022/lib/services/notification/error-response-manager.service.mjs +57 -0
  145. package/esm2022/lib/services/notification/tsi-confirmation.service.mjs +37 -0
  146. package/esm2022/lib/services/notification/tsi-message.service.mjs +54 -0
  147. package/esm2022/lib/services/notification/tsi-notification.service.mjs +47 -0
  148. package/esm2022/lib/services/presentation-setting/presentation-designer-base.service.mjs +26 -0
  149. package/esm2022/lib/services/presentation-setting/presentation-designer.service.mjs +58 -0
  150. package/esm2022/lib/services/presentation-setting/presentation-setting.service.mjs +39 -0
  151. package/esm2022/lib/services/progress-bar/progress-bar-helper.service.mjs +39 -0
  152. package/esm2022/lib/services/progress-bar/progress-bar.service.mjs +30 -0
  153. package/esm2022/lib/services/record-info-popup.service.mjs +21 -0
  154. package/esm2022/lib/services/reporting/dashboard-module.service.mjs +24 -0
  155. package/esm2022/lib/services/reporting/reporting.service.mjs +111 -0
  156. package/esm2022/lib/services/settings/app-settings.service.mjs +47 -0
  157. package/esm2022/lib/services/settings/keyboard-shortcut.service.mjs +30 -0
  158. package/esm2022/lib/services/status/entityStatus.service.mjs +21 -0
  159. package/esm2022/lib/services/translation/translation.service.mjs +71 -0
  160. package/esm2022/lib/services/validation/entity-validations.service.mjs +21 -0
  161. package/esm2022/lib/services/validation/generic-validation-state.service.mjs +30 -0
  162. package/esm2022/lib/services/validation/input-registry.service.mjs +25 -0
  163. package/esm2022/lib/services/workflow/workflow-configuration.service.mjs +80 -0
  164. package/esm2022/lib/shared.module.mjs +643 -0
  165. package/esm2022/lib/tsi-base/components/app-base/app-base.component.mjs +101 -0
  166. package/esm2022/lib/tsi-base/components/tsi-base/tsi-base.component.mjs +25 -0
  167. package/esm2022/lib/tsi-base/components/tsi-form-base/tsi-form-base.component.mjs +645 -0
  168. package/esm2022/lib/tsi-base/components/tsi-list-base/tsi-list-base.component.mjs +514 -0
  169. package/esm2022/lib/tsi-base/index.mjs +6 -0
  170. package/esm2022/lib/tsi-base/tsi-input-base/tsi-input-base.component.mjs +141 -0
  171. package/esm2022/lib/tsi-components/alert-import-message/alert-import-message.component.mjs +19 -0
  172. package/esm2022/lib/tsi-components/button-components/Tsi-Submit-Button/tsi-submit-button.component.mjs +40 -0
  173. package/esm2022/lib/tsi-components/button-components/tsi-button/tsi-button.component.mjs +75 -0
  174. package/esm2022/lib/tsi-components/create-or-edit-entity-informations/create-or-edit-entity-informations.component.mjs +173 -0
  175. package/esm2022/lib/tsi-components/create-or-edit-modele-import/create-or-edit-modele-import.component.mjs +201 -0
  176. package/esm2022/lib/tsi-components/index.mjs +80 -0
  177. package/esm2022/lib/tsi-components/input-components/editable-grid/editable-grid.component.mjs +643 -0
  178. package/esm2022/lib/tsi-components/input-components/tsi-checkbox/tsi-checkbox.component.mjs +120 -0
  179. package/esm2022/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.mjs +53 -0
  180. package/esm2022/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.mjs +62 -0
  181. package/esm2022/lib/tsi-components/input-components/tsi-date-picker/tsi-date-picker.component.mjs +116 -0
  182. package/esm2022/lib/tsi-components/input-components/tsi-decimal-input/tsi-decimal-input.component.mjs +51 -0
  183. package/esm2022/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.mjs +195 -0
  184. package/esm2022/lib/tsi-components/input-components/tsi-formula-box/tsi-formula-box.component.mjs +54 -0
  185. package/esm2022/lib/tsi-components/input-components/tsi-integer/tsi-integer.component.mjs +55 -0
  186. package/esm2022/lib/tsi-components/input-components/tsi-radio-button/tsi-radio-button.component.mjs +43 -0
  187. package/esm2022/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.mjs +56 -0
  188. package/esm2022/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.mjs +649 -0
  189. package/esm2022/lib/tsi-components/input-components/tsi-text-area/tsi-text-area.component.mjs +44 -0
  190. package/esm2022/lib/tsi-components/input-components/tsi-text-box/tsi-text-box.component.mjs +50 -0
  191. package/esm2022/lib/tsi-components/input-components/tsi-time-picker/tsi-time-picker.component.mjs +65 -0
  192. package/esm2022/lib/tsi-components/logout-popup/logout-popup.component.mjs +12 -0
  193. package/esm2022/lib/tsi-components/manage-import-export/manage-import-export.component.mjs +435 -0
  194. package/esm2022/lib/tsi-components/manage-reporting/add-report-popup/add-report-popup.component.mjs +148 -0
  195. package/esm2022/lib/tsi-components/manage-reporting/manage-reporting.component.mjs +1075 -0
  196. package/esm2022/lib/tsi-components/message-components/tsi-error-message/tsi-error-message.component.mjs +31 -0
  197. package/esm2022/lib/tsi-components/message-components/tsi-info-message/tsi-info-message.component.mjs +24 -0
  198. package/esm2022/lib/tsi-components/message-components/tsi-redirection-message/tsi-redirection-message.component.mjs +19 -0
  199. package/esm2022/lib/tsi-components/message-components/tsi-success-message/tsi-success-message.component.mjs +22 -0
  200. package/esm2022/lib/tsi-components/modal-component/modal.component.mjs +138 -0
  201. package/esm2022/lib/tsi-components/modal-loader/modal-loader.component.mjs +58 -0
  202. package/esm2022/lib/tsi-components/output-components/display-nested-prop/display-nested-prop.component.mjs +32 -0
  203. package/esm2022/lib/tsi-components/output-components/tsi-checkbox-display/tsi-checkbox-display.component.mjs +18 -0
  204. package/esm2022/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.mjs +17 -0
  205. package/esm2022/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.mjs +57 -0
  206. package/esm2022/lib/tsi-components/output-components/tsi-date-display/tsi-date-display.component.mjs +27 -0
  207. package/esm2022/lib/tsi-components/output-components/tsi-decimal-display/tsi-decimal-display.component.mjs +25 -0
  208. package/esm2022/lib/tsi-components/output-components/tsi-display-grid/tsi-display-grid.component.mjs +139 -0
  209. package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +1509 -0
  210. package/esm2022/lib/tsi-components/output-components/tsi-image-display/tsi-image-display.component.mjs +144 -0
  211. package/esm2022/lib/tsi-components/output-components/tsi-integer-display/tsi-integer-display.component.mjs +13 -0
  212. package/esm2022/lib/tsi-components/output-components/tsi-label/tsi-label.component.mjs +24 -0
  213. package/esm2022/lib/tsi-components/output-components/tsi-label-legend/tsi-label-legend.component.mjs +18 -0
  214. package/esm2022/lib/tsi-components/output-components/tsi-legend/tsi-legend.component.mjs +20 -0
  215. package/esm2022/lib/tsi-components/output-components/tsi-paragraph/tsi-paragraph.component.mjs +17 -0
  216. package/esm2022/lib/tsi-components/output-components/tsi-rate-display/tsi-rate-display.component.mjs +30 -0
  217. package/esm2022/lib/tsi-components/output-components/tsi-time-display/tsi-time-display.component.mjs +17 -0
  218. package/esm2022/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.mjs +427 -0
  219. package/esm2022/lib/tsi-components/reporting/reporting.component.mjs +667 -0
  220. package/esm2022/lib/tsi-components/spinner/spinner.component.mjs +15 -0
  221. package/esm2022/lib/tsi-components/tsi-bubble-info/tsi-bubble-info.component.mjs +21 -0
  222. package/esm2022/lib/tsi-components/tsi-calender/context-menu/context-menu.component.mjs +46 -0
  223. package/esm2022/lib/tsi-components/tsi-calender/tsi-calender.component.mjs +297 -0
  224. package/esm2022/lib/tsi-components/tsi-card/tsi-card.component.mjs +64 -0
  225. package/esm2022/lib/tsi-components/tsi-card-list/tsi-card-list.component.mjs +112 -0
  226. package/esm2022/lib/tsi-components/tsi-change-password/tsi-change-password.component.mjs +39 -0
  227. package/esm2022/lib/tsi-components/tsi-code-generator/tsi-code-generator.component.mjs +83 -0
  228. package/esm2022/lib/tsi-components/tsi-divider/tsi-divider.component.mjs +18 -0
  229. package/esm2022/lib/tsi-components/tsi-form/tsi-form.component.mjs +305 -0
  230. package/esm2022/lib/tsi-components/tsi-form-modal-footer/tsi-form-modal-footer.component.mjs +15 -0
  231. package/esm2022/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.mjs +883 -0
  232. package/esm2022/lib/tsi-components/tsi-generic-form/tsi-generic-form.component.mjs +149 -0
  233. package/esm2022/lib/tsi-components/tsi-kanban/tsi-kanban.component.mjs +231 -0
  234. package/esm2022/lib/tsi-components/tsi-log-event-history/tsi-log-event-history.component.mjs +119 -0
  235. package/esm2022/lib/tsi-components/tsi-modal/tsi-modal.component.mjs +25 -0
  236. package/esm2022/lib/tsi-components/tsi-modal-footer/tsi-modal-footer.component.mjs +119 -0
  237. package/esm2022/lib/tsi-components/tsi-modal-header/tsi-modal-header.component.mjs +54 -0
  238. package/esm2022/lib/tsi-components/tsi-notes-avertir/tsi-notes-avertir.component.mjs +27 -0
  239. package/esm2022/lib/tsi-components/tsi-notes-createoredit/tsi-notes.component.mjs +123 -0
  240. package/esm2022/lib/tsi-components/tsi-notes-grid/tsi-notes-grid.component.mjs +41 -0
  241. package/esm2022/lib/tsi-components/tsi-popup-text-viewer/tsi-popup-text-viewer.component.mjs +187 -0
  242. package/esm2022/lib/tsi-components/tsi-progress-bar/tsi-progress-bar.component.mjs +170 -0
  243. package/esm2022/lib/tsi-components/tsi-search-box/tsi-search-box.component.mjs +142 -0
  244. package/esm2022/lib/tsi-components/tsi-send-mail/tsi-send-mail.component.mjs +37 -0
  245. package/esm2022/lib/tsi-components/tsi-tab-panel/tsi-tab-panel.component.mjs +52 -0
  246. package/esm2022/lib/tsi-components/tsi-tab-view/tsi-tab-view.component.mjs +46 -0
  247. package/esm2022/lib/tsi-components/tsi-tenants/tsi-tenants.component.mjs +122 -0
  248. package/esm2022/lib/tsi-components/tsi-tooltip/tsi-tooltip.component.mjs +21 -0
  249. package/esm2022/lib/tsi-components/tsi-upload-fiche/tsi-upload-fiche.component.mjs +186 -0
  250. package/esm2022/lib/tsi-components/tsi-upload-grid/tsi-upload-grid.component.mjs +54 -0
  251. package/esm2022/lib/tsi-directives/auto-select.directive.mjs +33 -0
  252. package/esm2022/lib/tsi-directives/busy.directive.mjs +32 -0
  253. package/esm2022/lib/tsi-directives/dynamic-component-loader/ad.directive.mjs +16 -0
  254. package/esm2022/lib/tsi-directives/index.mjs +8 -0
  255. package/esm2022/lib/tsi-directives/module-main-parameter.directive.mjs +16 -0
  256. package/esm2022/lib/tsi-directives/presentation-designer-base.directive.mjs +238 -0
  257. package/esm2022/lib/tsi-directives/presentation-designer.directive.mjs +205 -0
  258. package/esm2022/lib/tsi-directives/validation.directive.mjs +85 -0
  259. package/esm2022/lib/tsi-helpers/compoent-reference.helper.mjs +7 -0
  260. package/esm2022/lib/tsi-helpers/date-helper.mjs +21 -0
  261. package/esm2022/lib/tsi-helpers/export-excel.helper.mjs +40 -0
  262. package/esm2022/lib/tsi-helpers/filter-helper.mjs +126 -0
  263. package/esm2022/lib/tsi-helpers/grid-col-style.helper.mjs +7 -0
  264. package/esm2022/lib/tsi-helpers/guid.helper.mjs +19 -0
  265. package/esm2022/lib/tsi-helpers/helpers.mjs +9 -0
  266. package/esm2022/lib/tsi-helpers/index.mjs +13 -0
  267. package/esm2022/lib/tsi-helpers/mapping-helper.mjs +10 -0
  268. package/esm2022/lib/tsi-helpers/object.helper.mjs +6 -0
  269. package/esm2022/lib/tsi-helpers/primeng-translate-config.mjs +55 -0
  270. package/esm2022/lib/tsi-helpers/storage-manager.mjs +33 -0
  271. package/esm2022/lib/tsi-helpers/type-registry.helper.mjs +49 -0
  272. package/esm2022/lib/types/enum-description.type.mjs +2 -0
  273. package/esm2022/lib/types/index.mjs +3 -0
  274. package/esm2022/lib/types/time-only.mjs +42 -0
  275. package/esm2022/public-api.mjs +21 -0
  276. package/esm2022/tsi-developpement-tsi-shared-ui.mjs +5 -0
  277. package/esm2022/tsi-tsi-shared-ui.mjs +5 -0
  278. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +17486 -0
  279. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -0
  280. package/fesm2022/tsi-tsi-shared-ui.mjs +17486 -0
  281. package/fesm2022/tsi-tsi-shared-ui.mjs.map +1 -0
  282. package/index.d.ts +5 -0
  283. package/lib/consts/app-providers.d.ts +4 -0
  284. package/lib/consts/html-template.const.d.ts +12 -0
  285. package/lib/consts/index.d.ts +7 -0
  286. package/lib/consts/localization-key.d.ts +11 -0
  287. package/lib/consts/locals.const.d.ts +7 -0
  288. package/lib/consts/queryParamNames.const.d.ts +10 -0
  289. package/lib/consts/themes.d.ts +4 -0
  290. package/lib/consts/tsi-consts.d.ts +40 -0
  291. package/lib/end-points/authorization-endpoints.d.ts +31 -0
  292. package/lib/end-points/baseuri.d.ts +10 -0
  293. package/lib/end-points/endpoints.d.ts +205 -0
  294. package/lib/end-points/import-export-endpoint.d.ts +33 -0
  295. package/lib/end-points/index.d.ts +6 -0
  296. package/lib/end-points/presentation-settings-endpoints.d.ts +11 -0
  297. package/lib/end-points/reporting-endpoints.d.ts +53 -0
  298. package/lib/end-points/shared-endpoint.d.ts +9 -0
  299. package/lib/end-points/user-identity-endpoints.d.ts +59 -0
  300. package/lib/enums/Language.d.ts +9 -0
  301. package/lib/enums/auto-complete.d.ts +4 -0
  302. package/lib/enums/button-type.enum.d.ts +4 -0
  303. package/lib/enums/claim-types.d.ts +13 -0
  304. package/lib/enums/code-format.d.ts +4 -0
  305. package/lib/enums/component-use-modes-enum.d.ts +17 -0
  306. package/lib/enums/css-units.d.ts +8 -0
  307. package/lib/enums/decimal-format.d.ts +6 -0
  308. package/lib/enums/display-types.d.ts +17 -0
  309. package/lib/enums/filter-operator-type.d.ts +18 -0
  310. package/lib/enums/form-validation-error.d.ts +11 -0
  311. package/lib/enums/grid-selection-mode.d.ts +5 -0
  312. package/lib/enums/grid-sort-mode.d.ts +5 -0
  313. package/lib/enums/http-method-types.d.ts +4 -0
  314. package/lib/enums/index.d.ts +24 -0
  315. package/lib/enums/input-types.d.ts +18 -0
  316. package/lib/enums/layout-orientation.d.ts +4 -0
  317. package/lib/enums/logout-reason-enum.d.ts +6 -0
  318. package/lib/enums/modal-size-enum.d.ts +10 -0
  319. package/lib/enums/report-type.d.ts +7 -0
  320. package/lib/enums/status.d.ts +7 -0
  321. package/lib/enums/text-box-type.d.ts +5 -0
  322. package/lib/enums/tooltipPosition.enum.d.ts +6 -0
  323. package/lib/enums/tsi-component-enum.d.ts +37 -0
  324. package/lib/enums/type-import.d.ts +4 -0
  325. package/lib/functions/array.functions.d.ts +1 -0
  326. package/lib/functions/index.d.ts +1 -0
  327. package/lib/functions/modal-open.function.d.ts +9 -0
  328. package/lib/guards/admin.guard.d.ts +14 -0
  329. package/lib/guards/auth.guard.d.ts +12 -0
  330. package/lib/guards/index.d.ts +3 -0
  331. package/lib/guards/permission.guard.d.ts +2 -0
  332. package/lib/interfaces/configuration/configuration.d.ts +10 -0
  333. package/lib/interfaces/generic-form/generic-form.d.ts +45 -0
  334. package/lib/interfaces/generic-types/dictionary.d.ts +3 -0
  335. package/lib/interfaces/grid/grid-configuration.d.ts +116 -0
  336. package/lib/interfaces/index.d.ts +11 -0
  337. package/lib/interfaces/modal/dynamic.component.d.ts +18 -0
  338. package/lib/interfaces/modal/modal-size.d.ts +4 -0
  339. package/lib/interfaces/pagination/pagination-base.d.ts +46 -0
  340. package/lib/interfaces/select-list/combo-status-model.d.ts +8 -0
  341. package/lib/interfaces/settings/app-settings.d.ts +4 -0
  342. package/lib/interfaces/styles/css-size-property.d.ts +10 -0
  343. package/lib/interfaces/translation/translation.d.ts +10 -0
  344. package/lib/models/Notes/Note.d.ts +25 -0
  345. package/lib/models/application/configuration/endpoint-infos.d.ts +6 -0
  346. package/lib/models/application/configuration/entity-delete-behavior.d.ts +6 -0
  347. package/lib/models/authorization/authorization-token-mapper.d.ts +4 -0
  348. package/lib/models/authorization/authorization-token.d.ts +16 -0
  349. package/lib/models/common/component-descriminator.d.ts +4 -0
  350. package/lib/models/common/entity-properties.d.ts +5 -0
  351. package/lib/models/common/entity-validations.d.ts +7 -0
  352. package/lib/models/common/event-schema.d.ts +6 -0
  353. package/lib/models/common/key-value-pair.d.ts +4 -0
  354. package/lib/models/entity-info/entity-info.d.ts +37 -0
  355. package/lib/models/filter/filter-by-existing-values.d.ts +6 -0
  356. package/lib/models/filter/paged-result-request-base.d.ts +16 -0
  357. package/lib/models/filter/search-field.d.ts +35 -0
  358. package/lib/models/import-export/import-export.d.ts +28 -0
  359. package/lib/models/index.d.ts +37 -0
  360. package/lib/models/journalisation-application/journalisation-application.d.ts +39 -0
  361. package/lib/models/journalisation-application/status-history.d.ts +12 -0
  362. package/lib/models/layout/layout-config.d.ts +3 -0
  363. package/lib/models/modal/bs-modal.d.ts +5 -0
  364. package/lib/models/presentation-settings/presentation-settings.d.ts +14 -0
  365. package/lib/models/progress-bar/progress-bar-create-request.d.ts +8 -0
  366. package/lib/models/progress-bar/progress-bar-response.d.ts +10 -0
  367. package/lib/models/progress-bar/progress-bar-update-request.d.ts +9 -0
  368. package/lib/models/remote-services-utility/subscription-result.d.ts +15 -0
  369. package/lib/models/reporting/json-data-connection.d.ts +6 -0
  370. package/lib/models/reporting/optional-endpoints.d.ts +8 -0
  371. package/lib/models/reporting/report-template-response.d.ts +13 -0
  372. package/lib/models/reporting/report-to-edit-template.d.ts +29 -0
  373. package/lib/models/reporting/report-to-print.d.ts +18 -0
  374. package/lib/models/reporting/report-to-template.d.ts +19 -0
  375. package/lib/models/settings/devise.d.ts +9 -0
  376. package/lib/models/settings/fichier.d.ts +14 -0
  377. package/lib/models/settings/type-fichier.d.ts +4 -0
  378. package/lib/models/tsi-card/tsi-card.d.ts +9 -0
  379. package/lib/models/user-identity/login-response.d.ts +8 -0
  380. package/lib/models/user-identity/tenant.d.ts +5 -0
  381. package/lib/models/user-identity/user-identity.d.ts +5 -0
  382. package/lib/models/workflow/workflow.d.ts +36 -0
  383. package/lib/package-initializer.d.ts +1 -0
  384. package/lib/pipes/cut-label.pipe.d.ts +7 -0
  385. package/lib/pipes/index.d.ts +7 -0
  386. package/lib/pipes/localize.pipe.d.ts +11 -0
  387. package/lib/pipes/modal-label.pipe.d.ts +10 -0
  388. package/lib/pipes/shorten.pipe.d.ts +7 -0
  389. package/lib/pipes/to-number.pipe.d.ts +7 -0
  390. package/lib/pipes/tsi-currency.pipe.d.ts +10 -0
  391. package/lib/pipes/tsi-decimal.pipe.d.ts +7 -0
  392. package/lib/providers/index.d.ts +1 -0
  393. package/lib/providers/shared-ui-tsi.provider.d.ts +8 -0
  394. package/lib/routes/admin.routes.d.ts +4 -0
  395. package/lib/routes/app.routes.d.ts +6 -0
  396. package/lib/routes/identity.routes.d.ts +3 -0
  397. package/lib/routes/index.d.ts +4 -0
  398. package/lib/routes/manage-reporting.routes.d.ts +4 -0
  399. package/lib/services/Component-Finder/tsi-component-finder.service.d.ts +10 -0
  400. package/lib/services/Import-Export/modele-import.service.d.ts +21 -0
  401. package/lib/services/Note/Note.service.d.ts +15 -0
  402. package/lib/services/UserIdentity/identity-platform-authentication.service.d.ts +13 -0
  403. package/lib/services/UserIdentity/user-identity.service.d.ts +15 -0
  404. package/lib/services/application/api-explorer.service.d.ts +13 -0
  405. package/lib/services/application/app.layout.service.d.ts +47 -0
  406. package/lib/services/application/parametres-application-parambase.service.d.ts +10 -0
  407. package/lib/services/authorization/authorization.service.d.ts +46 -0
  408. package/lib/services/authorization/identity-manager.service.d.ts +23 -0
  409. package/lib/services/base/crud-base.service.d.ts +20 -0
  410. package/lib/services/configuration/entity-configuration.service.d.ts +22 -0
  411. package/lib/services/currentUser/currentUser.service.d.ts +26 -0
  412. package/lib/services/date-helper.service.d.ts +32 -0
  413. package/lib/services/dialog-data.service.d.ts +12 -0
  414. package/lib/services/fichier/fichier-upload.service.d.ts +15 -0
  415. package/lib/services/fichier/fichier.service.d.ts +10 -0
  416. package/lib/services/formula.service.d.ts +10 -0
  417. package/lib/services/generator/html-template-generator.service.d.ts +28 -0
  418. package/lib/services/index.d.ts +40 -0
  419. package/lib/services/journalisation/journalisation-application.service.d.ts +12 -0
  420. package/lib/services/journalisation/status-history.service.d.ts +12 -0
  421. package/lib/services/layout/layout-helper.service.d.ts +25 -0
  422. package/lib/services/modal/tsi-bs-modal.service.d.ts +16 -0
  423. package/lib/services/modal/tsi-modal.service.d.ts +9 -0
  424. package/lib/services/module-code/module-code.service.d.ts +18 -0
  425. package/lib/services/module-main-parameter.service.d.ts +12 -0
  426. package/lib/services/notification/error-response-manager.service.d.ts +13 -0
  427. package/lib/services/notification/tsi-confirmation.service.d.ts +11 -0
  428. package/lib/services/notification/tsi-message.service.d.ts +13 -0
  429. package/lib/services/notification/tsi-notification.service.d.ts +18 -0
  430. package/lib/services/presentation-setting/presentation-designer-base.service.d.ts +14 -0
  431. package/lib/services/presentation-setting/presentation-designer.service.d.ts +19 -0
  432. package/lib/services/presentation-setting/presentation-setting.service.d.ts +16 -0
  433. package/lib/services/progress-bar/progress-bar-helper.service.d.ts +19 -0
  434. package/lib/services/progress-bar/progress-bar.service.d.ts +16 -0
  435. package/lib/services/record-info-popup.service.d.ts +10 -0
  436. package/lib/services/reporting/dashboard-module.service.d.ts +11 -0
  437. package/lib/services/reporting/reporting.service.d.ts +32 -0
  438. package/lib/services/settings/app-settings.service.d.ts +13 -0
  439. package/lib/services/settings/keyboard-shortcut.service.d.ts +9 -0
  440. package/lib/services/status/entityStatus.service.d.ts +11 -0
  441. package/lib/services/translation/translation.service.d.ts +20 -0
  442. package/lib/services/validation/entity-validations.service.d.ts +10 -0
  443. package/lib/services/validation/generic-validation-state.service.d.ts +15 -0
  444. package/lib/services/validation/input-registry.service.d.ts +11 -0
  445. package/lib/services/workflow/workflow-configuration.service.d.ts +28 -0
  446. package/lib/shared.module.d.ts +141 -0
  447. package/lib/tsi-base/components/app-base/app-base.component.d.ts +28 -0
  448. package/lib/tsi-base/components/tsi-base/tsi-base.component.d.ts +11 -0
  449. package/lib/tsi-base/components/tsi-form-base/tsi-form-base.component.d.ts +118 -0
  450. package/lib/tsi-base/components/tsi-list-base/tsi-list-base.component.d.ts +85 -0
  451. package/lib/tsi-base/index.d.ts +5 -0
  452. package/lib/tsi-base/tsi-input-base/tsi-input-base.component.d.ts +34 -0
  453. package/lib/tsi-components/alert-import-message/alert-import-message.component.d.ts +10 -0
  454. package/lib/tsi-components/button-components/Tsi-Submit-Button/tsi-submit-button.component.d.ts +16 -0
  455. package/lib/tsi-components/button-components/tsi-button/tsi-button.component.d.ts +26 -0
  456. package/lib/tsi-components/create-or-edit-entity-informations/create-or-edit-entity-informations.component.d.ts +31 -0
  457. package/lib/tsi-components/create-or-edit-modele-import/create-or-edit-modele-import.component.d.ts +52 -0
  458. package/lib/tsi-components/index.d.ts +79 -0
  459. package/lib/tsi-components/input-components/editable-grid/editable-grid.component.d.ts +127 -0
  460. package/lib/tsi-components/input-components/tsi-checkbox/tsi-checkbox.component.d.ts +30 -0
  461. package/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.d.ts +18 -0
  462. package/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.d.ts +21 -0
  463. package/lib/tsi-components/input-components/tsi-date-picker/tsi-date-picker.component.d.ts +38 -0
  464. package/lib/tsi-components/input-components/tsi-decimal-input/tsi-decimal-input.component.d.ts +14 -0
  465. package/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.d.ts +45 -0
  466. package/lib/tsi-components/input-components/tsi-formula-box/tsi-formula-box.component.d.ts +17 -0
  467. package/lib/tsi-components/input-components/tsi-integer/tsi-integer.component.d.ts +19 -0
  468. package/lib/tsi-components/input-components/tsi-radio-button/tsi-radio-button.component.d.ts +16 -0
  469. package/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.d.ts +16 -0
  470. package/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.d.ts +92 -0
  471. package/lib/tsi-components/input-components/tsi-text-area/tsi-text-area.component.d.ts +17 -0
  472. package/lib/tsi-components/input-components/tsi-text-box/tsi-text-box.component.d.ts +21 -0
  473. package/lib/tsi-components/input-components/tsi-time-picker/tsi-time-picker.component.d.ts +23 -0
  474. package/lib/tsi-components/logout-popup/logout-popup.component.d.ts +5 -0
  475. package/lib/tsi-components/manage-import-export/manage-import-export.component.d.ts +64 -0
  476. package/lib/tsi-components/manage-reporting/add-report-popup/add-report-popup.component.d.ts +151 -0
  477. package/lib/tsi-components/manage-reporting/manage-reporting.component.d.ts +109 -0
  478. package/lib/tsi-components/message-components/tsi-error-message/tsi-error-message.component.d.ts +15 -0
  479. package/lib/tsi-components/message-components/tsi-info-message/tsi-info-message.component.d.ts +13 -0
  480. package/lib/tsi-components/message-components/tsi-redirection-message/tsi-redirection-message.component.d.ts +9 -0
  481. package/lib/tsi-components/message-components/tsi-success-message/tsi-success-message.component.d.ts +13 -0
  482. package/lib/tsi-components/modal-component/modal.component.d.ts +25 -0
  483. package/lib/tsi-components/modal-loader/modal-loader.component.d.ts +27 -0
  484. package/lib/tsi-components/output-components/display-nested-prop/display-nested-prop.component.d.ts +14 -0
  485. package/lib/tsi-components/output-components/tsi-checkbox-display/tsi-checkbox-display.component.d.ts +6 -0
  486. package/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.d.ts +7 -0
  487. package/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.d.ts +19 -0
  488. package/lib/tsi-components/output-components/tsi-date-display/tsi-date-display.component.d.ts +10 -0
  489. package/lib/tsi-components/output-components/tsi-decimal-display/tsi-decimal-display.component.d.ts +9 -0
  490. package/lib/tsi-components/output-components/tsi-display-grid/tsi-display-grid.component.d.ts +41 -0
  491. package/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.d.ts +231 -0
  492. package/lib/tsi-components/output-components/tsi-image-display/tsi-image-display.component.d.ts +46 -0
  493. package/lib/tsi-components/output-components/tsi-integer-display/tsi-integer-display.component.d.ts +6 -0
  494. package/lib/tsi-components/output-components/tsi-label/tsi-label.component.d.ts +8 -0
  495. package/lib/tsi-components/output-components/tsi-label-legend/tsi-label-legend.component.d.ts +6 -0
  496. package/lib/tsi-components/output-components/tsi-legend/tsi-legend.component.d.ts +9 -0
  497. package/lib/tsi-components/output-components/tsi-paragraph/tsi-paragraph.component.d.ts +6 -0
  498. package/lib/tsi-components/output-components/tsi-rate-display/tsi-rate-display.component.d.ts +10 -0
  499. package/lib/tsi-components/output-components/tsi-time-display/tsi-time-display.component.d.ts +7 -0
  500. package/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.d.ts +97 -0
  501. package/lib/tsi-components/reporting/reporting.component.d.ts +103 -0
  502. package/lib/tsi-components/spinner/spinner.component.d.ts +8 -0
  503. package/lib/tsi-components/tsi-bubble-info/tsi-bubble-info.component.d.ts +9 -0
  504. package/lib/tsi-components/tsi-calender/context-menu/context-menu.component.d.ts +25 -0
  505. package/lib/tsi-components/tsi-calender/tsi-calender.component.d.ts +50 -0
  506. package/lib/tsi-components/tsi-card/tsi-card.component.d.ts +25 -0
  507. package/lib/tsi-components/tsi-card-list/tsi-card-list.component.d.ts +35 -0
  508. package/lib/tsi-components/tsi-change-password/tsi-change-password.component.d.ts +21 -0
  509. package/lib/tsi-components/tsi-code-generator/tsi-code-generator.component.d.ts +23 -0
  510. package/lib/tsi-components/tsi-divider/tsi-divider.component.d.ts +6 -0
  511. package/lib/tsi-components/tsi-form/tsi-form.component.d.ts +91 -0
  512. package/lib/tsi-components/tsi-form-modal-footer/tsi-form-modal-footer.component.d.ts +8 -0
  513. package/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.d.ts +156 -0
  514. package/lib/tsi-components/tsi-generic-form/tsi-generic-form.component.d.ts +28 -0
  515. package/lib/tsi-components/tsi-kanban/tsi-kanban.component.d.ts +68 -0
  516. package/lib/tsi-components/tsi-log-event-history/tsi-log-event-history.component.d.ts +35 -0
  517. package/lib/tsi-components/tsi-modal/tsi-modal.component.d.ts +10 -0
  518. package/lib/tsi-components/tsi-modal-footer/tsi-modal-footer.component.d.ts +38 -0
  519. package/lib/tsi-components/tsi-modal-header/tsi-modal-header.component.d.ts +19 -0
  520. package/lib/tsi-components/tsi-notes-avertir/tsi-notes-avertir.component.d.ts +13 -0
  521. package/lib/tsi-components/tsi-notes-createoredit/tsi-notes.component.d.ts +21 -0
  522. package/lib/tsi-components/tsi-notes-grid/tsi-notes-grid.component.d.ts +12 -0
  523. package/lib/tsi-components/tsi-popup-text-viewer/tsi-popup-text-viewer.component.d.ts +41 -0
  524. package/lib/tsi-components/tsi-progress-bar/tsi-progress-bar.component.d.ts +38 -0
  525. package/lib/tsi-components/tsi-search-box/tsi-search-box.component.d.ts +44 -0
  526. package/lib/tsi-components/tsi-send-mail/tsi-send-mail.component.d.ts +21 -0
  527. package/lib/tsi-components/tsi-tab-panel/tsi-tab-panel.component.d.ts +18 -0
  528. package/lib/tsi-components/tsi-tab-view/tsi-tab-view.component.d.ts +17 -0
  529. package/lib/tsi-components/tsi-tenants/tsi-tenants.component.d.ts +39 -0
  530. package/lib/tsi-components/tsi-tooltip/tsi-tooltip.component.d.ts +9 -0
  531. package/lib/tsi-components/tsi-upload-fiche/tsi-upload-fiche.component.d.ts +35 -0
  532. package/lib/tsi-components/tsi-upload-grid/tsi-upload-grid.component.d.ts +13 -0
  533. package/lib/tsi-directives/auto-select.directive.d.ts +9 -0
  534. package/lib/tsi-directives/busy.directive.d.ts +11 -0
  535. package/lib/tsi-directives/dynamic-component-loader/ad.directive.d.ts +8 -0
  536. package/lib/tsi-directives/index.d.ts +7 -0
  537. package/lib/tsi-directives/module-main-parameter.directive.d.ts +8 -0
  538. package/lib/tsi-directives/presentation-designer-base.directive.d.ts +41 -0
  539. package/lib/tsi-directives/presentation-designer.directive.d.ts +37 -0
  540. package/lib/tsi-directives/validation.directive.d.ts +18 -0
  541. package/lib/tsi-helpers/compoent-reference.helper.d.ts +5 -0
  542. package/lib/tsi-helpers/date-helper.d.ts +6 -0
  543. package/lib/tsi-helpers/export-excel.helper.d.ts +5 -0
  544. package/lib/tsi-helpers/filter-helper.d.ts +12 -0
  545. package/lib/tsi-helpers/grid-col-style.helper.d.ts +5 -0
  546. package/lib/tsi-helpers/guid.helper.d.ts +6 -0
  547. package/lib/tsi-helpers/helpers.d.ts +4 -0
  548. package/lib/tsi-helpers/index.d.ts +12 -0
  549. package/lib/tsi-helpers/mapping-helper.d.ts +5 -0
  550. package/lib/tsi-helpers/object.helper.d.ts +3 -0
  551. package/lib/tsi-helpers/primeng-translate-config.d.ts +54 -0
  552. package/lib/tsi-helpers/storage-manager.d.ts +8 -0
  553. package/lib/tsi-helpers/type-registry.helper.d.ts +34 -0
  554. package/lib/types/enum-description.type.d.ts +3 -0
  555. package/lib/types/index.d.ts +2 -0
  556. package/lib/types/time-only.d.ts +17 -0
  557. package/package.json +24 -0
  558. package/public-api.d.ts +17 -0
@@ -0,0 +1,1509 @@
1
+ import { animate, state, style, transition, trigger } from '@angular/animations';
2
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
3
+ import { FilterMatchMode } from 'primeng/api';
4
+ import { BehaviorSubject } from 'rxjs';
5
+ import { DisplayTypeColors, DisplayTypes, FilterOperatorType, GridSelectionMode, GridSortMode, InputTypes, ModalSizeEnum, NumericDisplayTypes, TooltipPosition } from '../../../enums';
6
+ import { DefaultSocieteDevise } from '../../../consts/tsi-consts';
7
+ import { rtlModeKeys } from '../../../consts/locals.const';
8
+ import * as FileSaver from 'file-saver';
9
+ import { FilterHelper } from '../../../tsi-helpers/filter-helper';
10
+ import { primengLocaleAr } from '../../../tsi-helpers/primeng-translate-config';
11
+ import { ExportExcelHelper } from '../../../tsi-helpers/export-excel.helper';
12
+ import { openTsiPopupTextViewerComponent } from '../../../functions/modal-open.function';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "../../../services/generator/html-template-generator.service";
15
+ import * as i2 from "@angular/common";
16
+ import * as i3 from "../../../services/notification/tsi-notification.service";
17
+ import * as i4 from "../../../pipes/localize.pipe";
18
+ import * as i5 from "../../../services/layout/layout-helper.service";
19
+ import * as i6 from "../../../services/application/app.layout.service";
20
+ import * as i7 from "primeng/api";
21
+ import * as i8 from "../../../services/settings/app-settings.service";
22
+ import * as i9 from "../../../services/notification/error-response-manager.service";
23
+ import * as i10 from "primeng/dynamicdialog";
24
+ import * as i11 from "@angular/forms";
25
+ import * as i12 from "primeng/table";
26
+ import * as i13 from "primeng/tooltip";
27
+ import * as i14 from "primeng/multiselect";
28
+ import * as i15 from "../tsi-checkbox-display/tsi-checkbox-display.component";
29
+ import * as i16 from "../tsi-currency-other-display/tsi-currency-other-display.component";
30
+ import * as i17 from "../tsi-currency-societe-display/tsi-currency-societe-display.component";
31
+ import * as i18 from "../tsi-date-display/tsi-date-display.component";
32
+ import * as i19 from "../tsi-decimal-display/tsi-decimal-display.component";
33
+ import * as i20 from "../tsi-integer-display/tsi-integer-display.component";
34
+ import * as i21 from "../tsi-rate-display/tsi-rate-display.component";
35
+ import * as i22 from "../../button-components/tsi-button/tsi-button.component";
36
+ import * as i23 from "../../tsi-search-box/tsi-search-box.component";
37
+ import * as i24 from "../../tsi-card-list/tsi-card-list.component";
38
+ import * as i25 from "../tsi-image-display/tsi-image-display.component";
39
+ import * as i26 from "../../tsi-kanban/tsi-kanban.component";
40
+ import * as i27 from "../../tsi-calender/tsi-calender.component";
41
+ import * as i28 from "../../../tsi-directives/presentation-designer-base.directive";
42
+ import * as i29 from "../display-nested-prop/display-nested-prop.component";
43
+ export class TsiGenericGridComponent {
44
+ async eyeClicked(text) {
45
+ let modalSize = ModalSizeEnum.ExtraLarge;
46
+ let conf = {
47
+ data: text,
48
+ maximizable: true,
49
+ width: modalSize.width,
50
+ height: modalSize.height
51
+ };
52
+ this._dialogRef = await openTsiPopupTextViewerComponent(this._injector, conf);
53
+ this._dialogRef.onClose.subscribe((val) => this._closeModal(val));
54
+ }
55
+ _closeModal(val) {
56
+ if (val === true) {
57
+ this._dialogRef?.destroy();
58
+ }
59
+ else {
60
+ this._dialogRef?.destroy();
61
+ }
62
+ }
63
+ truncateString(value, limit = 50) {
64
+ if (!value) {
65
+ return '';
66
+ }
67
+ return value.length > limit ? value.substr(0, limit) + '...' : value;
68
+ }
69
+ set columns(value) {
70
+ if (value && Array.isArray(value)) {
71
+ this._columns = value;
72
+ this.initialColumnsProcess();
73
+ }
74
+ }
75
+ get columns() {
76
+ return this._columns;
77
+ }
78
+ set isSearchButtonDisabled(value) {
79
+ this._isSearchButtonDisabled = value;
80
+ }
81
+ get isSearchButtonDisabled() {
82
+ return this._isSearchButtonDisabled;
83
+ }
84
+ set searchFields(value) {
85
+ if (value) {
86
+ //reset
87
+ this._searchFields = [];
88
+ //init using value
89
+ this._searchFields = FilterHelper.initSearchFields(value);
90
+ this.initSearchOnInit();
91
+ }
92
+ }
93
+ get searchFields() {
94
+ return this._searchFields;
95
+ }
96
+ set selectionMode(value) {
97
+ if (this.config?.data?.isAdvancedSearch && this.config?.data?.selectionMode) {
98
+ this._selectionMode = this.config?.data?.selectionMode;
99
+ }
100
+ else {
101
+ this._selectionMode = value;
102
+ }
103
+ }
104
+ get selectionMode() {
105
+ return this._selectionMode;
106
+ }
107
+ set searchOnInit(value) {
108
+ if (value == undefined || value == null) {
109
+ this._searchOnInit = true;
110
+ }
111
+ else {
112
+ this._searchOnInit = value;
113
+ }
114
+ }
115
+ get searchOnInit() {
116
+ this.initSearchOnInit();
117
+ return this._searchOnInit;
118
+ }
119
+ set showCalenderView(value) {
120
+ this._showCalenderView = value;
121
+ if (this._showCalenderView === false) {
122
+ let start = this.searchFields?.find(x => x.field === this.calenderSchema?.start);
123
+ let end = this.searchFields?.find(x => x.field === this.calenderSchema?.end);
124
+ if (start && end) {
125
+ start.disabled = false;
126
+ end.disabled = false;
127
+ }
128
+ }
129
+ }
130
+ set showCardView(value) {
131
+ this._showCardView = value;
132
+ }
133
+ set showKanbanView(value) {
134
+ this._showKanbanView = value;
135
+ }
136
+ set selectAll(value) {
137
+ this._selectAll = value;
138
+ const syntheticEvent = new Event('selectAllChange');
139
+ const event = {
140
+ checked: value,
141
+ originalEvent: syntheticEvent,
142
+ };
143
+ this.onSelectAllChange(event);
144
+ }
145
+ get selectAll() { return this._selectAll; }
146
+ constructor(_htmlTemplateGeneratorService, datePipe, _messageService, localize, layoutHelperService, _layoutService, _primengConfig, appSettingsService, _errorResponseManagerService, _injector, config, _ref) {
147
+ this._htmlTemplateGeneratorService = _htmlTemplateGeneratorService;
148
+ this.datePipe = datePipe;
149
+ this._messageService = _messageService;
150
+ this.localize = localize;
151
+ this.layoutHelperService = layoutHelperService;
152
+ this._layoutService = _layoutService;
153
+ this._primengConfig = _primengConfig;
154
+ this.appSettingsService = appSettingsService;
155
+ this._errorResponseManagerService = _errorResponseManagerService;
156
+ this._injector = _injector;
157
+ this.config = config;
158
+ this._ref = _ref;
159
+ this.filterMatchMode = FilterMatchMode;
160
+ this.tooltipPosition = TooltipPosition;
161
+ this.isAr = false;
162
+ this.first = 0;
163
+ this.rows = 1;
164
+ this.displayTypes = DisplayTypes;
165
+ this.summaries = {};
166
+ this.isRtlMode = false;
167
+ this._searchBoxFilters = [];
168
+ this._gridHeaderFilters = [];
169
+ this._sort = [];
170
+ this.sortMetas = [];
171
+ this.selectedFullItems = [];
172
+ this.multipleGridSelectionMode = GridSelectionMode.Multiple;
173
+ this.page = {
174
+ items: [],
175
+ totalCount: 0,
176
+ summaries: [],
177
+ totalPages: 0,
178
+ pageNumber: 1,
179
+ pageSize: 10,
180
+ loading: false
181
+ };
182
+ // (newPage: IPage<any>){
183
+ // if(newPage){
184
+ // this._page = newPage;
185
+ // this._extractSummaries();
186
+ // }
187
+ // }
188
+ // get page(){
189
+ // return this._page;
190
+ // }
191
+ this.key = 'uid';
192
+ /**
193
+ *
194
+ */
195
+ this._tempColumns = [];
196
+ this.tempSearchFields = [];
197
+ this._columns = [];
198
+ this._isSearchButtonDisabled = false;
199
+ this.filteredColumns = [];
200
+ this.showSearchBox = true;
201
+ this.showActionColumn = true;
202
+ this.showHeaderFilters = false;
203
+ this.showFilterButton = true;
204
+ this.isGridDataPagedInApi = true;
205
+ this.header = '';
206
+ this.ShowFilterColumns = true;
207
+ this.showImportExportButton = false;
208
+ this.sortMode = GridSortMode.Multiple;
209
+ this.selectKeyOnly = true;
210
+ this._selectionMode = GridSelectionMode.None;
211
+ this.selectedItems = [];
212
+ this.showGlobalSearch = true;
213
+ this.showExportButton = true;
214
+ this.showSearchField = true;
215
+ this._showCalenderView = false;
216
+ this._showCardView = false;
217
+ this._showKanbanView = false;
218
+ this.page$ = new BehaviorSubject(null);
219
+ this.checkedByField = '';
220
+ this._selectAll = false;
221
+ //#endregion
222
+ //#region Outputs
223
+ this.editRow = new EventEmitter();
224
+ this.deleteRow = new EventEmitter();
225
+ this.load = new EventEmitter();
226
+ this.buttonColumnClicked = new EventEmitter();
227
+ this.filtersHtmlTemplateChange = new EventEmitter();
228
+ this.selectedItemsChange = new EventEmitter();
229
+ this.searchFieldsValueChanged = new EventEmitter();
230
+ this.calendarEventClick = new EventEmitter();
231
+ this.statusFilterChanged = new EventEmitter();
232
+ /**
233
+ *
234
+ */
235
+ //#endregion
236
+ // ngOnChanges(changes: SimpleChanges): void {
237
+ // if(changes['page']){
238
+ // this._extractSummaries();
239
+ // }
240
+ // }
241
+ this.filterIcon = "pi pi-filter";
242
+ this.filterTooltip = "show_filter";
243
+ this.requiredLocalizationKey = "shared_search_field_required";
244
+ this.filterModeIcon = "pi pi-filter";
245
+ this.filterModeTooltip = "menu_mode";
246
+ this.changeHeaderFiltersMode = "menu";
247
+ this._searchOnInit = true;
248
+ this.selectedColumns = [];
249
+ this.importantColumns = ['consult', 'edit', 'delete', 'upload', 'download', 'info', 'notes', 'duplicate'];
250
+ this.isFirstLoadOfPage = true;
251
+ this.titleCache = new Map();
252
+ }
253
+ ngAfterViewInit() {
254
+ let filterModeTooltipFromLocalStorage = localStorage.getItem(`${this.formName}-filterMode`);
255
+ if (filterModeTooltipFromLocalStorage != undefined && filterModeTooltipFromLocalStorage != null
256
+ && filterModeTooltipFromLocalStorage != "") {
257
+ this.filterModeTooltip = filterModeTooltipFromLocalStorage;
258
+ this.showHeaderFilters = true;
259
+ this.filterIcon = "pi pi-filter-slash";
260
+ this.filterTooltip = "hide_filter";
261
+ if (this.filterModeTooltip === "menu_mode") {
262
+ this.filterModeIcon = "pi pi-check";
263
+ this.filterModeTooltip = "row_mode";
264
+ this.changeHeaderFiltersMode = "menu";
265
+ }
266
+ else {
267
+ this.changeHeaderFiltersMode = "row";
268
+ this.filterModeIcon = "pi pi-ellipsis-v";
269
+ this.filterModeTooltip = "menu_mode";
270
+ }
271
+ }
272
+ else {
273
+ this.showHeaderFilters = false;
274
+ this.filterIcon = "pi pi-filter";
275
+ this.filterTooltip = "show_filter";
276
+ }
277
+ //commented by @MedAli - Bug from primeng component.
278
+ // if(this.tableHeaderCheckbox){
279
+ // this.tableHeaderCheckbox.checked = this.selection?.length == this.page.pageSize
280
+ // this.tableHeaderCheckbox.cd.detectChanges()
281
+ // }
282
+ }
283
+ ngOnInit() {
284
+ // this.isTableLoading = true
285
+ // setTimeout(() => {
286
+ // this.search();
287
+ // this.isTableLoading = false
288
+ // }, 2000);
289
+ let langue = localStorage.getItem(rtlModeKeys.rtlModeEnabled);
290
+ if (langue && JSON.parse(langue)) {
291
+ this.isAr = true;
292
+ }
293
+ else {
294
+ this.isAr = false;
295
+ }
296
+ this.columns.map(column => column.translatedHeader = this.localize.transform(column.header));
297
+ this._tempColumns = this.columns;
298
+ this.tempSearchFields = this._searchFields ?? [];
299
+ this.filteredColumns = this.columns.filter(column => !this.importantColumns.includes(column.field));
300
+ //this.selectedColumns = this.columns
301
+ if (!this.selectedColumns || this.selectedColumns.length == 0) {
302
+ this.selectedColumns = this.columns;
303
+ }
304
+ this.selectedColumns.forEach((column, index) => {
305
+ column.order = index;
306
+ });
307
+ this.isRtlModeEnabled();
308
+ this._rtlModeSubscribe();
309
+ this.processStickyColumns();
310
+ }
311
+ // #region grid state
312
+ getState() {
313
+ let state = {};
314
+ if (!this.dt) {
315
+ return;
316
+ }
317
+ if (this.dt.resizableColumns) {
318
+ this.dt.saveColumnWidths(state);
319
+ }
320
+ this.dt.saveColumnOrder(state);
321
+ return state;
322
+ }
323
+ restoreState(configuration) {
324
+ let state = JSON.parse(configuration);
325
+ if (this.dt) {
326
+ this.dt.columnWidthsState = state.columnWidths;
327
+ this.dt.tableWidthState = state.tableWidth;
328
+ let columnOrder = state.columnOrder;
329
+ if (columnOrder) {
330
+ let reorderedColumns = this.getReorderedColumns(columnOrder);
331
+ this.selectedColumns = reorderedColumns;
332
+ this.columns = reorderedColumns;
333
+ this.sortColumns();
334
+ }
335
+ }
336
+ }
337
+ onSelectedColumnsChange() {
338
+ this.sortColumns();
339
+ }
340
+ sortColumns() {
341
+ this.selectedColumns.sort((a, b) => {
342
+ const indexA = this.importantColumns.indexOf(a.field);
343
+ const indexB = this.importantColumns.indexOf(b.field);
344
+ if (indexA === -1 && indexB === -1) {
345
+ return 0;
346
+ }
347
+ if (indexA === -1) {
348
+ return 1;
349
+ }
350
+ if (indexB === -1) {
351
+ return -1;
352
+ }
353
+ return indexA - indexB;
354
+ });
355
+ this.selectedColumns = [
356
+ ...this.selectedColumns
357
+ .filter(col => col.order !== undefined)
358
+ .sort((a, b) => a.order - b.order),
359
+ ...this.selectedColumns.filter(col => col.order === undefined),
360
+ ];
361
+ }
362
+ getReorderedColumns(columnOrder) {
363
+ let reorderedColumns = [];
364
+ columnOrder.map((key) => {
365
+ let col = this.findColumnByKey(key);
366
+ if (col) {
367
+ reorderedColumns.push(col);
368
+ }
369
+ });
370
+ return reorderedColumns;
371
+ }
372
+ findColumnByKey(key) {
373
+ if (this._tempColumns) {
374
+ for (let col of this._tempColumns) {
375
+ if (col.header === key || col.field === key)
376
+ return col;
377
+ else
378
+ continue;
379
+ }
380
+ }
381
+ return null;
382
+ }
383
+ resetSelectedColumns(configuration) {
384
+ let state = JSON.parse(configuration);
385
+ if (this.dt) {
386
+ this.dt.columnWidthsState = state.columnWidths;
387
+ this.dt.tableWidthState = state.tableWidth;
388
+ let columnOrder = state.columnOrder;
389
+ if (columnOrder) {
390
+ let reorderedColumns = this.getReorderedColumns(columnOrder);
391
+ this.selectedColumns = reorderedColumns;
392
+ this._columns = this._tempColumns;
393
+ this.sortColumns();
394
+ }
395
+ }
396
+ }
397
+ // #end region
398
+ notInSpecifiedColumn(columnName) {
399
+ return !this.importantColumns.includes(columnName);
400
+ }
401
+ processStickyColumns() {
402
+ this._columns.forEach((col) => {
403
+ if (col.isFrozen) {
404
+ col.ngStyle = this.getTheStyle(col);
405
+ col.headerColumnStyle = { ...col.ngStyle, zIndex: 1000 };
406
+ }
407
+ });
408
+ }
409
+ getCheckboxStyle() {
410
+ if (this.isRtlMode) {
411
+ return {
412
+ right: `0px`,
413
+ position: 'sticky',
414
+ backgroundColor: 'white',
415
+ "width": '2.5rem !important',
416
+ "min-width": '2.5rem !important',
417
+ };
418
+ }
419
+ else {
420
+ return {
421
+ left: `0px`,
422
+ position: 'sticky',
423
+ backgroundColor: 'white',
424
+ "width": '2.5rem !important',
425
+ "min-width": '2.5rem !important',
426
+ };
427
+ }
428
+ }
429
+ getTheStyle(column) {
430
+ if (!column.isFrozen) {
431
+ return {};
432
+ }
433
+ if (column.isFrozen == true) {
434
+ let elementPosition = 0;
435
+ if (this.selectionMode == this.multipleGridSelectionMode) {
436
+ elementPosition = 30 + elementPosition + (column.order ?? 0) * 60;
437
+ }
438
+ else {
439
+ elementPosition = elementPosition + ((column.order ?? 0) * 1.85) * 20;
440
+ }
441
+ if (this.isRtlMode) {
442
+ return {
443
+ right: `${elementPosition}px`,
444
+ position: 'sticky',
445
+ backgroundColor: 'white',
446
+ "width": '2.5rem !important',
447
+ "min-width": '2.5rem !important',
448
+ };
449
+ }
450
+ else {
451
+ return {
452
+ left: `${elementPosition}px`,
453
+ position: 'sticky',
454
+ backgroundColor: 'white',
455
+ "width": '2.5rem !important',
456
+ "min-width": '2.5rem !important',
457
+ };
458
+ }
459
+ }
460
+ return {};
461
+ }
462
+ isRtlModeEnabled() {
463
+ if (this._layoutService.isRtlModeEnabled()) {
464
+ this.isRtlMode = true;
465
+ this.updatePrimeNGTableFilters();
466
+ }
467
+ }
468
+ updatePrimeNGTableFilters() {
469
+ this._primengConfig.setTranslation(primengLocaleAr);
470
+ }
471
+ _rtlModeSubscribe() {
472
+ this._layoutService.enableRtlModeSubject$.subscribe({
473
+ next: (data) => {
474
+ if (data && data == true) {
475
+ this.isRtlMode = true;
476
+ }
477
+ }
478
+ });
479
+ }
480
+ searchFieldsValueChanges(searchFieldValues) {
481
+ this.searchFieldsValueChanged.emit(searchFieldValues);
482
+ }
483
+ isLastPage() {
484
+ return this.page ? this.page.pageNumber === (this.page.totalCount - this.page.pageSize) : true;
485
+ }
486
+ isFirstPage() {
487
+ return this.page ? this.page.pageNumber === 0 : true;
488
+ }
489
+ edit(item) {
490
+ this.editRow.emit(item[this.key]);
491
+ }
492
+ delete(item) {
493
+ this.deleteRow.emit(item[this.key]);
494
+ }
495
+ lazyLoad(event) {
496
+ if (this.pagedRequest == null && this.pagedRequest == undefined) {
497
+ this.pagedRequest = {};
498
+ }
499
+ this.pagedRequest.skipCount = event.first == 1 ? 0 : event.first;
500
+ this.pagedRequest.maxResultCount = event.rows;
501
+ if (this.formName && this.isFirstLoadOfPage) {
502
+ this.isFirstLoadOfPage = false;
503
+ const storedValue = localStorage.getItem(this.formName);
504
+ if (storedValue) {
505
+ const sessionData = JSON.parse(storedValue);
506
+ const columnOrder = sessionData.columnOrder;
507
+ const columnWidths = sessionData.columnWidths.split(',');
508
+ const updatedSelectedColumns = [];
509
+ columnOrder.forEach((field, index) => {
510
+ const columnWidth = columnWidths[index];
511
+ const existingColumnIndex = this.selectedColumns.findIndex(column => column.field === field);
512
+ if (existingColumnIndex !== -1) {
513
+ this.selectedColumns[existingColumnIndex].width = columnWidth;
514
+ updatedSelectedColumns.push(this.selectedColumns[existingColumnIndex]);
515
+ }
516
+ });
517
+ this.selectedColumns = updatedSelectedColumns;
518
+ if ((sessionData.multiSortMeta && sessionData.multiSortMeta.length > 0) || (sessionData.filters)) {
519
+ if (sessionData.multiSortMeta && sessionData.multiSortMeta.length > 0) {
520
+ sessionData.multiSortMeta.forEach((meta) => {
521
+ let sortMeta = {
522
+ field: meta.field,
523
+ order: meta.order
524
+ };
525
+ event.sortField = meta.field;
526
+ event.sortOrder = meta.order;
527
+ event.multiSortMeta?.push(sortMeta);
528
+ });
529
+ }
530
+ if (sessionData.filters) {
531
+ let filters = {};
532
+ Object.entries(sessionData.filters).forEach(([fieldName, filterMetadata]) => {
533
+ const filterMetadataValue = filterMetadata;
534
+ if (filterMetadataValue[0] != null) {
535
+ filters[fieldName] = filterMetadataValue[0];
536
+ }
537
+ });
538
+ // Assign the filters to the event
539
+ event.filters = filters;
540
+ // event.filters = Object.entries(sessionData.filters).reduce((filters: { [s: string]: FilterMetadata }, [fieldName, filterMetadata ] ) => {
541
+ // var filterMetadataValue = filterMetadata as FilterMetadata;
542
+ // if (filterMetadataValue.value != undefined) {
543
+ // filters[fieldName] = filterMetadata as FilterMetadata;
544
+ // }
545
+ // console.log('all filters', filters)
546
+ // return filters;
547
+ // }, {});
548
+ // this.searchFields =[];
549
+ // const filtersArray: [string, { value: string | null; matchMode: string,operator : string }[]][] = Object.entries(data.filters);
550
+ // filtersArray.forEach(([fieldName, fieldValue]) => {
551
+ // fieldValue.forEach(filter =>
552
+ // {
553
+ // if(filter.value){
554
+ // let searchField : SearchField ={
555
+ // field :fieldName,
556
+ // labelValue : filter.value,
557
+ // value:filter.value,
558
+ // type : this.inferInputType(fieldName),
559
+ // operator : this.getOperatorNumber(filter.matchMode)
560
+ // };
561
+ // console.log('searchField',searchField);
562
+ // if (this.searchFields) {
563
+ // this.searchFields.push(searchField);
564
+ // }
565
+ // }
566
+ // });
567
+ // });
568
+ }
569
+ }
570
+ }
571
+ else {
572
+ console.log("No session data found in localStorage");
573
+ }
574
+ }
575
+ this._gridHeaderFilters = this._extractFilters(event.filters);
576
+ this._extractSortCriterias(event);
577
+ this.search();
578
+ }
579
+ fields() {
580
+ let fields = [];
581
+ if (this.columns != null && this.columns != undefined) {
582
+ this.columns.forEach((col) => {
583
+ fields.push(col.field);
584
+ });
585
+ }
586
+ return fields;
587
+ }
588
+ buttonClicked(item, field) {
589
+ if (this.selectKeyOnly) {
590
+ this.buttonColumnClicked.emit({ field: field, key: item[this.key], selectKeyOnly: this.selectKeyOnly });
591
+ }
592
+ else {
593
+ this.buttonColumnClicked.emit({ field: field, key: item, selectKeyOnly: this.selectKeyOnly });
594
+ }
595
+ }
596
+ keywordValueChanged(keyword) {
597
+ this.keyword = keyword;
598
+ }
599
+ isAllRequiredSearchFieldsHaveValues() {
600
+ let invalidSearchFields = this.searchFields
601
+ ?.filter(x => x.required == true && (x.value == undefined || x.value == '' || x.value == null));
602
+ if (invalidSearchFields == undefined || invalidSearchFields.length == 0) {
603
+ return true;
604
+ }
605
+ let messages = [];
606
+ invalidSearchFields.forEach(searchField => {
607
+ messages.push(`${this.localize.transform(searchField.labelValue)} ${this.localize.transform(this.requiredLocalizationKey)}`);
608
+ });
609
+ this._errorResponseManagerService.showErrorMessagesFromArrayString(messages);
610
+ return false;
611
+ }
612
+ initSearchOnInit() {
613
+ let invalidSearchFields = this.searchFields
614
+ ?.filter(x => x.required == true && (x.value == undefined || x.value == '' || x.value == null)) ?? [];
615
+ if (this._searchOnInit) {
616
+ this._searchOnInit = invalidSearchFields.length == 0;
617
+ }
618
+ }
619
+ ccomboBoxLabelChanged(event) {
620
+ this._extractSearchBoxFilters();
621
+ this._generateFiltersHtmlTemplate();
622
+ }
623
+ search(evt = null) {
624
+ console.log("search>>>", this.searchFields);
625
+ //set global filter value
626
+ this._extractOnlyVisibleSearchFields();
627
+ if (this.pagedRequest && this.isAllRequiredSearchFieldsHaveValues()) {
628
+ this.pagedRequest.summaries = this._extractHaveSummaryProperties();
629
+ this.pagedRequest.sorting = this._sort;
630
+ this.pagedRequest.keyword = this.keyword;
631
+ //add search box filters
632
+ this._extractSearchBoxFilters();
633
+ //generate filters html template
634
+ this._generateFiltersHtmlTemplate();
635
+ //clone
636
+ let newRequest = this._clonePagedRequest(this.pagedRequest);
637
+ //concat filters
638
+ newRequest.filters = [...this._gridHeaderFilters, ...this._searchBoxFilters];
639
+ //exclude useless filters
640
+ newRequest = this._excludeUselessFilters(newRequest);
641
+ // test if filters value has changed
642
+ if ((this.latestFilters ? JSON.stringify(this.latestFilters) : null)
643
+ !== (newRequest.filters ? JSON.stringify(newRequest.filters) : null)) {
644
+ newRequest.skipCount = 0;
645
+ if (this.dt) {
646
+ this.dt.first = 1;
647
+ }
648
+ }
649
+ // save latest filters
650
+ this.latestFilters = newRequest.filters;
651
+ this.load.emit({ request: newRequest, isForCalendar: this._showCalenderView });
652
+ this.filtersHtmlTemplateChange.emit(this.filtersHtmlTemplate);
653
+ }
654
+ }
655
+ getFirstElementIndex() {
656
+ if (!this.dt)
657
+ return 0;
658
+ if (this.page.items.length === 0) {
659
+ return 0;
660
+ }
661
+ return this.dt.first === 0 ? 1 : (this.dt?.first ?? 0);
662
+ }
663
+ getSummary(field) {
664
+ let summaryRow = this.page.summaries
665
+ .find(s => s.proprety.toUpperCase() == field.toUpperCase());
666
+ if (summaryRow) {
667
+ return summaryRow.summary;
668
+ }
669
+ return undefined;
670
+ }
671
+ onSelectedItemsChanged() {
672
+ let selection = [];
673
+ if (this.selectionMode == GridSelectionMode.Multiple) {
674
+ if (this.selection) {
675
+ if (this.selectKeyOnly) {
676
+ let keys = [];
677
+ this.selection.forEach((v) => { keys.push(v[this.key]); });
678
+ selection = keys;
679
+ }
680
+ else {
681
+ selection = this.selection;
682
+ }
683
+ }
684
+ else {
685
+ selection = [];
686
+ }
687
+ }
688
+ else if (this.selectionMode == GridSelectionMode.Single) {
689
+ if (this.selectKeyOnly) {
690
+ selection = this.selection ? [this.selection[this.key]] : [];
691
+ }
692
+ else {
693
+ selection = this.selection ? [this.selection] : [];
694
+ }
695
+ }
696
+ if (this.selectionMode != GridSelectionMode.None) {
697
+ this.selectedItemsChange.emit(selection);
698
+ }
699
+ if (this.config?.data?.isAdvancedSearch && selection.length > 0) {
700
+ this.selectedItemsChange.emit(selection);
701
+ this._ref?.close(selection[0]);
702
+ }
703
+ }
704
+ onSelectAllChange(event) {
705
+ if (this.selectionMode == GridSelectionMode.Multiple) {
706
+ this._selectAll = event.checked;
707
+ if (this._selectAll) {
708
+ if (this.checkedByField && this.checkedByField.trim() !== '') {
709
+ this.selection = this.page.items.filter(item => item[this.checkedByField] === true);
710
+ }
711
+ else {
712
+ this.selection = this.page.items;
713
+ }
714
+ }
715
+ else {
716
+ this.selection = [];
717
+ }
718
+ this.onSelectedItemsChanged();
719
+ }
720
+ }
721
+ // onSelectedColumnsChange() {
722
+ // if (this.formName) {
723
+ // const storedValue = localStorage.getItem(this.formName);
724
+ // if (storedValue) {
725
+ // const sessionData = JSON.parse(storedValue);
726
+ // let columnOrder: string[] = [];
727
+ // let columnWidths: string[] = [];
728
+ // this.columns.forEach(item => {
729
+ // if (item.field === 'upload') {
730
+ // if (!this.selectedColumns.includes(item)) {
731
+ // this.selectedColumns.push(item);
732
+ // }
733
+ // }
734
+ // else if (item.field === 'download') {
735
+ // if (!this.selectedColumns.includes(item)) {
736
+ // this.selectedColumns.push(item);
737
+ // }
738
+ // }
739
+ // else if (item.field === 'consult') {
740
+ // if (!this.selectedColumns.includes(item)) {
741
+ // this.selectedColumns.push(item);
742
+ // }
743
+ // }
744
+ // else if (item.field === 'delete') {
745
+ // if (!this.selectedColumns.includes(item)) {
746
+ // this.selectedColumns.push(item);
747
+ // }
748
+ // }
749
+ // else if (item.field === 'edit') {
750
+ // if (!this.selectedColumns.includes(item)) {
751
+ // this.selectedColumns.push(item);
752
+ // }
753
+ // }
754
+ // });
755
+ // this.selectedColumns.sort((a, b) => {
756
+ // if (a.order !== undefined && b.order !== undefined) {
757
+ // return a.order - b.order;
758
+ // }
759
+ // return 0;
760
+ // });
761
+ // this.selectedColumns.forEach(selectedColumn => {
762
+ // columnOrder.push(selectedColumn.field);
763
+ // const selectedWidth = selectedColumn.minWidth;
764
+ // if (selectedWidth) {
765
+ // columnWidths.push(selectedWidth.toString());
766
+ // } else {
767
+ // //columnWidths.push('90');
768
+ // }
769
+ // });
770
+ // sessionData.columnOrder = columnOrder;
771
+ // sessionData.columnWidths = columnWidths.join(',');
772
+ // //localStorage.setItem(this.formName, JSON.stringify(sessionData));
773
+ // } else {
774
+ // //const result = this.generateTableConfigJSON();
775
+ // //localStorage.setItem(this.formName, result);
776
+ // }
777
+ // }
778
+ // }
779
+ // generateTableConfigJSON(): string {
780
+ // const tableConfig = JSON.parse(this.jsonStringLayout);
781
+ // tableConfig.columnOrder = this.selectedColumns.map(column => column.field);
782
+ // //tableConfig.columnWidths = this.selectedColumns.map(() => '90').join(',');
783
+ // return JSON.stringify(tableConfig);
784
+ // }
785
+ onStateRestore(tableState) {
786
+ if (tableState.selection) {
787
+ this.selection = tableState.selection;
788
+ this.onSelectedItemsChanged();
789
+ }
790
+ // if (this.formName) {
791
+ // const storedValue = localStorage.getItem(this.formName);
792
+ // if (storedValue) {
793
+ // const sessionData = JSON.parse(storedValue);
794
+ // const columnOrder: string[] = sessionData.columnOrder;
795
+ // const columnWidths: string[] = sessionData.columnWidths.split(',');
796
+ // // Update selectedColumns based on columnOrder and columnWidths
797
+ // const updatedSelectedColumns: GridColumn[] = [];
798
+ // columnOrder.forEach((field, index) => {
799
+ // const columnWidth = columnWidths[index];
800
+ // // Find the corresponding column in selectedColumns
801
+ // const existingColumnIndex = this.selectedColumns.findIndex(column => column.field === field);
802
+ // if (existingColumnIndex !== -1) {
803
+ // // If the column exists in selectedColumns, update its width
804
+ // this.selectedColumns[existingColumnIndex].width = columnWidth;
805
+ // updatedSelectedColumns.push(this.selectedColumns[existingColumnIndex]);
806
+ // }
807
+ // });
808
+ // // Update selectedColumns with the restored data
809
+ // this.selectedColumns = updatedSelectedColumns;
810
+ // if(storedValue){
811
+ // const data = JSON.parse(storedValue);
812
+ // if ((data.multiSortMeta && data.multiSortMeta.length > 0) || (data.filters && data.multiSortMeta.filters > 0)) {
813
+ // if (data.multiSortMeta && data.multiSortMeta.length > 0) {
814
+ // data.multiSortMeta.forEach((meta: { field: any; order: any; }) => {
815
+ // let sort = {
816
+ // property: meta.field,
817
+ // order: meta.order == 1 ? 'ASC' : 'DESC'
818
+ // }
819
+ // this._sort = [sort];
820
+ // });
821
+ // }
822
+ // if (data.filters) {
823
+ // this.searchFields =[];
824
+ // const filtersArray: [string, { value: string | null; matchMode: string,operator : string }[]][] = Object.entries(data.filters);
825
+ // filtersArray.forEach(([fieldName, fieldValue]) => {
826
+ // fieldValue.forEach(filter =>
827
+ // {
828
+ // if(filter.value){
829
+ // let searchField : SearchField ={
830
+ // field :fieldName,
831
+ // labelValue : filter.value,
832
+ // value:filter.value,
833
+ // type : this.inferInputType(fieldName),
834
+ // operator : this.getOperatorNumber(filter.matchMode)
835
+ // };
836
+ // console.log('searchField',searchField);
837
+ // if (this.searchFields) {
838
+ // this.searchFields.push(searchField);
839
+ // }
840
+ // }
841
+ // });
842
+ // });
843
+ // }
844
+ // this.search();
845
+ // }
846
+ // }
847
+ // } else {
848
+ // console.log("No session data found in localStorage");
849
+ // }
850
+ // }
851
+ }
852
+ onClearFilters() {
853
+ this.dt?.clear();
854
+ localStorage.removeItem(`${this.formName}-filterMode`);
855
+ }
856
+ getOperatorNumber(operator) {
857
+ return FilterOperatorType[operator.toUpperCase()] ?? -1;
858
+ }
859
+ inferInputType(value) {
860
+ if (typeof value === 'string') {
861
+ if (/^\d+$/.test(value)) {
862
+ return InputTypes.INTEGER;
863
+ }
864
+ else if (/^\d+\.\d+$/.test(value)) {
865
+ return InputTypes.DECIMAL_INPUT;
866
+ }
867
+ else if (/^\d{4}-\d{2}-\d{2}$/.test(value)) {
868
+ return InputTypes.DATE;
869
+ }
870
+ else {
871
+ return InputTypes.TEXT_BOX;
872
+ }
873
+ }
874
+ else {
875
+ return InputTypes.TEXT_BOX;
876
+ }
877
+ }
878
+ loadInitialState() {
879
+ return localStorage['get']('table-state');
880
+ }
881
+ //#region private methods
882
+ _extractFilters(event) {
883
+ let filters = [];
884
+ if (event != null
885
+ &&
886
+ event != undefined) {
887
+ this.columns.forEach((col) => {
888
+ let currency = col.currencyOtherCode;
889
+ if (col.type == this.displayTypes.CURRENCY_SOCIETE_DISPLAY) {
890
+ currency = this.appSettingsService.appSettings.deviseSociete.codeDevise;
891
+ }
892
+ if (event != null
893
+ &&
894
+ event != undefined) {
895
+ let filter = event[col.field];
896
+ if (this._notNullOrUndefined(filter)) {
897
+ if (Array.isArray(filter)) {
898
+ for (const item of filter) {
899
+ if (this._notNullOrUndefined(item.value)) {
900
+ if (item.value instanceof Date) {
901
+ item.value = this.datePipe.transform(item.value, 'yyyy-MM-dd');
902
+ }
903
+ filters.push({
904
+ operator: FilterHelper.ToOperatorType(item.matchMode),
905
+ filterValue: item.value,
906
+ propretyName: col.field,
907
+ header: col.header,
908
+ type: FilterHelper.ToInputType(col.type),
909
+ currency: currency,
910
+ numOfDecimal: col.numOfDecimal,
911
+ isFraction: col.isFraction,
912
+ comboboxLabel: col.comboLabel
913
+ });
914
+ }
915
+ }
916
+ }
917
+ else {
918
+ if (filter != null) {
919
+ if (filter.value instanceof Date) {
920
+ filter.value = this.datePipe.transform(filter.value, 'yyyy-MM-dd');
921
+ }
922
+ filters.push({
923
+ operator: FilterHelper.ToOperatorType(filter.matchMode),
924
+ filterValue: filter.value,
925
+ propretyName: col.field,
926
+ header: col.header,
927
+ type: FilterHelper.ToInputType(col.type),
928
+ currency: currency,
929
+ numOfDecimal: col.numOfDecimal,
930
+ isFraction: col.isFraction,
931
+ comboboxLabel: col.comboLabel
932
+ });
933
+ }
934
+ }
935
+ }
936
+ }
937
+ });
938
+ }
939
+ return filters;
940
+ }
941
+ _extractSortCriterias(lazyLoadEvent) {
942
+ let sortMeta = this._toSortMeta(lazyLoadEvent);
943
+ if (sortMeta) {
944
+ if (this.sortMode === GridSortMode.Single) {
945
+ this._extractSingleSortCriteria(sortMeta);
946
+ }
947
+ else if (this.sortMode === GridSortMode.Multiple) {
948
+ this._extractMultipleSortCriterias(sortMeta);
949
+ }
950
+ }
951
+ }
952
+ _extractSingleSortCriteria(sorMeta) {
953
+ if (this.sortMode === GridSortMode.Single) {
954
+ if (sorMeta.field) {
955
+ // create new sort element
956
+ let sort = {
957
+ property: sorMeta.field,
958
+ order: sorMeta.order == 1 ? 'ASC' : 'DESC'
959
+ };
960
+ this._sort = [sort];
961
+ }
962
+ }
963
+ else {
964
+ throw new Error('Can\'t process \'SingleSort\' when [sortMode] is \'multiple\'');
965
+ }
966
+ }
967
+ _extractMultipleSortCriterias(sortMetas) {
968
+ if (this.sortMode === GridSortMode.Multiple) {
969
+ if (sortMetas && Array.isArray(sortMetas)) {
970
+ // create new sort element
971
+ this._sort = [];
972
+ this.sortMetas = sortMetas;
973
+ //console.log('meta ', sortMetas)
974
+ sortMetas.forEach(sm => {
975
+ if (sm.field) {
976
+ // create new sort element
977
+ let sort = {
978
+ property: sm.field,
979
+ order: sm.order == 1 ? 'ASC' : 'DESC'
980
+ };
981
+ //add the new element to _sort
982
+ this._sort.push(sort);
983
+ }
984
+ });
985
+ }
986
+ }
987
+ else {
988
+ throw new Error('Can\'t process \'MultipleSort\' when [sortMode] is \'single\'');
989
+ }
990
+ }
991
+ _notNullOrUndefined(obj) {
992
+ if (obj != null
993
+ && obj != undefined) {
994
+ return true;
995
+ }
996
+ return false;
997
+ }
998
+ _extractOnlyVisibleSearchFields() {
999
+ if (this.presentationSettings
1000
+ && this.presentationSettings.presentationSettingDetails.length > 0
1001
+ && this.tempSearchFields) {
1002
+ this.searchFields = this.tempSearchFields.filter(sf => this.presentationSettings?.presentationSettingDetails
1003
+ .some(p => p.blockName == sf.field && (p.isBlockVisible == true || p.isBlockVisible == undefined)));
1004
+ }
1005
+ }
1006
+ _extractSearchBoxFilters() {
1007
+ this._searchBoxFilters = [];
1008
+ if (this.searchFields) {
1009
+ this._extractOnlyVisibleSearchFields();
1010
+ this.searchFields.forEach((sf) => {
1011
+ //if (sf.value != undefined && sf.value != null) {
1012
+ if (sf.operator != null && sf.operator != undefined && sf.value != undefined && sf.value !== "") {
1013
+ let filterByProperty = {
1014
+ operator: sf.operator,
1015
+ filterValue: sf.value,
1016
+ propretyName: sf.field,
1017
+ header: sf.labelValue,
1018
+ type: sf.type,
1019
+ comboboxLabel: sf.comboboxLabel,
1020
+ currency: sf.currency,
1021
+ isFraction: sf.isFraction,
1022
+ numOfDecimal: sf.numOfDecimal
1023
+ };
1024
+ this._searchBoxFilters.push(filterByProperty);
1025
+ }
1026
+ else if (sf.operator == undefined || sf.operator == null) {
1027
+ throw new Error(`the search field with [field : ${sf.field}] have no operators`);
1028
+ }
1029
+ //}
1030
+ });
1031
+ }
1032
+ }
1033
+ _clonePagedRequest(request) {
1034
+ let clone = {
1035
+ maxResultCount: request.maxResultCount,
1036
+ skipCount: request.skipCount,
1037
+ sorting: request.sorting,
1038
+ keyword: request.keyword,
1039
+ filters: request.filters,
1040
+ getAllData: request.getAllData,
1041
+ summaries: request.summaries
1042
+ };
1043
+ return clone;
1044
+ }
1045
+ _extractHaveSummaryProperties() {
1046
+ let properties = [];
1047
+ let haveSummaryColumns = this.columns.filter(c => c.haveSummary === true);
1048
+ if (haveSummaryColumns && haveSummaryColumns.length > 0) {
1049
+ properties = haveSummaryColumns.map(c => c.field);
1050
+ }
1051
+ return properties;
1052
+ }
1053
+ _extractSummaries() {
1054
+ if (this.page.summaries) {
1055
+ this.page.summaries.forEach(s => {
1056
+ this.summaries[s.proprety] = s.summary;
1057
+ });
1058
+ }
1059
+ }
1060
+ _extractMultiSortMetaItems() {
1061
+ this._sort = [];
1062
+ if (this.sortMetas) {
1063
+ this.sortMetas.forEach((s) => {
1064
+ let sort = {
1065
+ property: s.field,
1066
+ order: s.order == 1 ? 'ASC' : 'DESC'
1067
+ };
1068
+ let sortItem = this._sort.find(s => s.property == sort.property);
1069
+ if (sortItem) {
1070
+ if (sortItem.order != sort.order) {
1071
+ sortItem.order = sort.order;
1072
+ }
1073
+ }
1074
+ else {
1075
+ this._sort.push(sort);
1076
+ }
1077
+ });
1078
+ }
1079
+ }
1080
+ _toSortMeta(tableLazyLoadEvent) {
1081
+ if (this.sortMode === GridSortMode.Single) {
1082
+ if (tableLazyLoadEvent.sortField && tableLazyLoadEvent.sortOrder) {
1083
+ let sortMeta = {
1084
+ field: tableLazyLoadEvent.sortField,
1085
+ order: tableLazyLoadEvent.sortOrder
1086
+ };
1087
+ return sortMeta;
1088
+ }
1089
+ }
1090
+ else if (this.sortMode === GridSortMode.Multiple) {
1091
+ if (tableLazyLoadEvent.multiSortMeta) {
1092
+ return tableLazyLoadEvent.multiSortMeta;
1093
+ }
1094
+ }
1095
+ else {
1096
+ throw new Error('No [sortMode] have been set');
1097
+ }
1098
+ }
1099
+ _generateFiltersHtmlTemplate() {
1100
+ this.filtersHtmlTemplate = "";
1101
+ //exclude useless Grid filter
1102
+ this._gridHeaderFilters = this._excludeUselessGridFilter(this._gridHeaderFilters);
1103
+ //add search Box filters html
1104
+ if (this._searchBoxFilters) {
1105
+ this.filtersHtmlTemplate = this._htmlTemplateGeneratorService
1106
+ .generateGridFiltersTemplate(this._searchBoxFilters);
1107
+ }
1108
+ console.log("this._gridHeaderFilters ==> ", this._gridHeaderFilters);
1109
+ //add grid header filters html
1110
+ if (this._gridHeaderFilters) {
1111
+ this.filtersHtmlTemplate += this._htmlTemplateGeneratorService
1112
+ .generateGridFiltersTemplate(this._gridHeaderFilters, false);
1113
+ }
1114
+ this.filtersHtmlTemplateChange.emit(this.filtersHtmlTemplate);
1115
+ }
1116
+ _excludeUselessGridFilter(filters) {
1117
+ return filters.filter(x => x.filterValue !== null && x.filterValue !== undefined && x.filterValue !== "" && x.operator !== undefined);
1118
+ }
1119
+ _excludeUselessFilters(pagedRequest) {
1120
+ if (pagedRequest && pagedRequest.filters) {
1121
+ pagedRequest.filters = pagedRequest.filters.filter(f => f.filterValue != undefined && f.filterValue != null);
1122
+ }
1123
+ return pagedRequest;
1124
+ }
1125
+ exportExcel() {
1126
+ this.pagedRequest.getAllData = true;
1127
+ if (this.crudService != null && this.crudService != undefined && this.isGridDataPagedInApi) {
1128
+ this.crudService.getAllPaged(this.pagedRequest).subscribe({
1129
+ next: (value) => {
1130
+ if (value) {
1131
+ const formattedItems = ExportExcelHelper.preprocessDateForExcel(value.items);
1132
+ value.items = formattedItems;
1133
+ this.exportDataFromApiToExcelSheet(value);
1134
+ }
1135
+ this.page.loading = false;
1136
+ },
1137
+ error: (error) => {
1138
+ this._messageService.error(error.message);
1139
+ this.page.loading = false;
1140
+ },
1141
+ });
1142
+ }
1143
+ else {
1144
+ let filteredData = this.page.items.filter((col) => !col.isButton);
1145
+ filteredData = ExportExcelHelper.preprocessDateForExcel(filteredData);
1146
+ this.page.items = filteredData;
1147
+ this.exportDataFromApiToExcelSheet(this.page);
1148
+ }
1149
+ }
1150
+ exportDataFromApiToExcelSheet(value) {
1151
+ import("xlsx").then(xlsx => {
1152
+ const workbook = xlsx.utils.book_new();
1153
+ if (this.pagedRequest.filters?.length != 0) {
1154
+ const mappedFilters = this.pagedRequest.filters?.map(filter => ({
1155
+ property: filter.propretyName,
1156
+ operatorName: this.getFilterOperatorName(filter.operator),
1157
+ value: filter.filterValue
1158
+ }));
1159
+ const filters = xlsx.utils.json_to_sheet(mappedFilters);
1160
+ xlsx.utils.book_append_sheet(workbook, filters, 'Filters');
1161
+ }
1162
+ let selectedColumnsFields = this.selectedColumns.filter(x => !x.isButton).map(column => column.translatedHeader);
1163
+ selectedColumnsFields = selectedColumnsFields.filter(item => item !== '');
1164
+ const worksheetData = value.items.map((item) => {
1165
+ const rowData = {};
1166
+ this.columns.forEach(col => {
1167
+ rowData[col.translatedHeader] = item[col.field];
1168
+ });
1169
+ return rowData;
1170
+ });
1171
+ const filteredWorksheetData = this.removeNonExistingColumns(worksheetData, selectedColumnsFields);
1172
+ const worksheet = xlsx.utils.json_to_sheet(filteredWorksheetData);
1173
+ xlsx.utils.book_append_sheet(workbook, worksheet, 'Data');
1174
+ const excelBuffer = xlsx.write(workbook, { bookType: 'xlsx', type: 'array' });
1175
+ this.saveAsExcelFile(excelBuffer, "excel");
1176
+ });
1177
+ }
1178
+ saveAsExcelFile(buffer, fileName) {
1179
+ let EXCEL_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8';
1180
+ let EXCEL_EXTENSION = '.xlsx';
1181
+ const data = new Blob([buffer], {
1182
+ type: EXCEL_TYPE
1183
+ });
1184
+ FileSaver.saveAs(data, fileName + '_export_' + new Date().getTime() + EXCEL_EXTENSION);
1185
+ }
1186
+ getFilterOperatorName(operator) {
1187
+ switch (operator) {
1188
+ case FilterOperatorType.EQUAL: return 'EQUAL';
1189
+ case FilterOperatorType.LESSOREQUAL: return 'LESS OR EQUAL';
1190
+ case FilterOperatorType.GREATEROREQUAL: return 'GREATER OR EQUAL';
1191
+ case FilterOperatorType.LESS: return 'LESS';
1192
+ case FilterOperatorType.GREATER: return 'GREATER';
1193
+ case FilterOperatorType.NOTEQUAL: return 'NOT EQUAL';
1194
+ case FilterOperatorType.CONTAINS: return 'CONTAINS';
1195
+ default: return 'UNKNOWN_OPERATOR';
1196
+ }
1197
+ }
1198
+ removeNonExistingColumns(worksheetData, selectedColumnsFields) {
1199
+ return worksheetData.map(row => {
1200
+ const newRow = {};
1201
+ for (const col of selectedColumnsFields) {
1202
+ if (row.hasOwnProperty(col)) {
1203
+ newRow[col] = row[col];
1204
+ }
1205
+ }
1206
+ return newRow;
1207
+ });
1208
+ }
1209
+ toggleHeaderFilters() {
1210
+ if (this.showHeaderFilters === true) {
1211
+ this.showHeaderFilters = false;
1212
+ this.filterIcon = "pi pi-filter";
1213
+ this.filterTooltip = "show_filter";
1214
+ localStorage.removeItem(`${this.formName}-filterMode`);
1215
+ }
1216
+ else { //this.showHeaderFilters === false
1217
+ this.showHeaderFilters = true;
1218
+ this.filterIcon = "pi pi-filter-slash";
1219
+ this.filterTooltip = "hide_filter";
1220
+ }
1221
+ }
1222
+ toggleHeaderFiltersMode() {
1223
+ if (this.dt) {
1224
+ this.dt.clear();
1225
+ localStorage.setItem(`${this.formName}-filterMode`, this.filterModeTooltip);
1226
+ if (this.filterModeTooltip === "menu_mode") {
1227
+ this.changeHeaderFiltersMode = "menu";
1228
+ this.filterModeIcon = "pi pi-check";
1229
+ this.filterModeTooltip = "row_mode";
1230
+ for (const col of this.selectedColumns) {
1231
+ this.dt.filters[col.field] = [{ value: null, matchMode: undefined }];
1232
+ }
1233
+ this.dt._filter();
1234
+ }
1235
+ else {
1236
+ this.changeHeaderFiltersMode = "row";
1237
+ this.filterModeIcon = "pi pi-ellipsis-v";
1238
+ this.filterModeTooltip = "menu_mode";
1239
+ for (const col of this.selectedColumns) {
1240
+ this.dt.filters[col.field] = { value: null, matchMode: undefined };
1241
+ }
1242
+ this.dt._filter();
1243
+ }
1244
+ }
1245
+ }
1246
+ getHeaderClassColor(columnType) {
1247
+ let colorful = this.layoutHelperService.layoutConfiguration.isColorfulModeEnabled;
1248
+ if (colorful === true) {
1249
+ let colorForIntegerDisplay = DisplayTypeColors[columnType] || 'white-grid';
1250
+ //alert(columnType+colorForIntegerDisplay)
1251
+ return colorForIntegerDisplay;
1252
+ }
1253
+ else
1254
+ return 'white-grid';
1255
+ }
1256
+ get colorful() {
1257
+ return this.layoutHelperService.layoutConfiguration.isColorfulModeEnabled;
1258
+ }
1259
+ //#endregion
1260
+ initialColumnsProcess() {
1261
+ const deviseSocieteNumOfDecimal = this.appSettingsService.appSettings.deviseSociete.nombreDecimales ?? DefaultSocieteDevise.nombreDecimales;
1262
+ this._columns.forEach((col) => {
1263
+ // set isNumeric
1264
+ col.isNumeric = col.type != undefined && col.type != null && (NumericDisplayTypes.indexOf(col.type) >= 0);
1265
+ // set filterInputType
1266
+ switch (col.type) {
1267
+ case DisplayTypes.DATE_DISPLAY: {
1268
+ col.filterInputType = 'date';
1269
+ break;
1270
+ }
1271
+ case DisplayTypes.DATETIME_DISPLAY: {
1272
+ col.filterInputType = 'date';
1273
+ break;
1274
+ }
1275
+ case DisplayTypes.INTEGER_DISPLAY:
1276
+ case DisplayTypes.RATE_DISPLAY:
1277
+ case DisplayTypes.CURRENCY_SOCIETE_DISPLAY:
1278
+ case DisplayTypes.CURRENCY_OTHER_DISPLAY:
1279
+ case DisplayTypes.DECIMAL_DISPLAY: {
1280
+ col.filterInputType = 'numeric';
1281
+ break;
1282
+ }
1283
+ case DisplayTypes.CHECKBOX_DISPLAY: {
1284
+ col.filterInputType = 'boolean';
1285
+ break;
1286
+ }
1287
+ default: {
1288
+ col.filterInputType = 'text';
1289
+ break;
1290
+ }
1291
+ }
1292
+ // set numOfDecimal
1293
+ if (col.numOfDecimal)
1294
+ return;
1295
+ if (!col.type) {
1296
+ col.numOfDecimal = 0;
1297
+ return;
1298
+ }
1299
+ if (!col.isNumeric) {
1300
+ col.numOfDecimal = 0;
1301
+ return;
1302
+ }
1303
+ if (col.type === DisplayTypes.CURRENCY_SOCIETE_DISPLAY) {
1304
+ col.numOfDecimal = deviseSocieteNumOfDecimal;
1305
+ return;
1306
+ }
1307
+ if (col.type === DisplayTypes.INTEGER_DISPLAY) {
1308
+ col.numOfDecimal = 0;
1309
+ return;
1310
+ }
1311
+ });
1312
+ }
1313
+ handleCalendarEventClick(item) {
1314
+ if (item.mode === "SEARCH") {
1315
+ this.search();
1316
+ }
1317
+ else {
1318
+ this.calendarEventClick.emit(item);
1319
+ }
1320
+ }
1321
+ handleDateRangeChange(event) {
1322
+ let start = this.searchFields?.find(x => x.field === this.calenderSchema?.start);
1323
+ let end = this.searchFields?.find(x => x.field === this.calenderSchema?.end);
1324
+ if (start && end) {
1325
+ start.value = event.start;
1326
+ end.value = event.end;
1327
+ start.disabled = true;
1328
+ end.disabled = true;
1329
+ this.search();
1330
+ }
1331
+ }
1332
+ callSearchHandler(event) {
1333
+ if (this.pagedRequest) {
1334
+ this.pagedRequest.maxResultCount = event.maxResultCount;
1335
+ this.pagedRequest.skipCount = event.skipCount;
1336
+ this.search();
1337
+ this.page$.next({ ...this.page });
1338
+ }
1339
+ }
1340
+ getHeaderTitles(titles, item) {
1341
+ if (!titles || !item)
1342
+ return [];
1343
+ const key = item.uid;
1344
+ if (this.titleCache.has(key)) {
1345
+ return this.titleCache.get(key) || [];
1346
+ }
1347
+ const res = titles.map(t => item[t]).filter(v => !!v);
1348
+ this.titleCache.set(key, res);
1349
+ return res;
1350
+ }
1351
+ onStatusFilterChanged(evt) {
1352
+ this.status = evt;
1353
+ console.log(this.status);
1354
+ this.searchFields = this.searchFields?.filter(sf => sf.field !== this.entityInfo?.statusColumnName);
1355
+ this.searchFields?.push({
1356
+ field: this.entityInfo?.statusColumnName ?? "",
1357
+ value: evt,
1358
+ labelValue: '',
1359
+ type: InputTypes.COMBOBOX,
1360
+ operator: 6,
1361
+ styleClass: "hidden"
1362
+ });
1363
+ }
1364
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiGenericGridComponent, deps: [{ token: i1.HtmlTemplateGeneratorService }, { token: i2.DatePipe }, { token: i3.TsiNotificationService }, { token: i4.LocalizePipe }, { token: i5.LayoutHelperService }, { token: i6.LayoutService }, { token: i7.PrimeNGConfig }, { token: i8.AppSettingsService }, { token: i9.ErrorResponseManagerService }, { token: i0.EnvironmentInjector }, { token: i10.DynamicDialogConfig }, { token: i10.DynamicDialogRef }], target: i0.ɵɵFactoryTarget.Component }); }
1365
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiGenericGridComponent, selector: "Tsi-Generic-Grid", inputs: { cudComponent: "cudComponent", modalSize: "modalSize", entityInfo: "entityInfo", formName: "formName", id: "id", pagedRequest: "pagedRequest", configuration: "configuration", page: "page", key: "key", columns: "columns", isSearchButtonDisabled: "isSearchButtonDisabled", filteredColumns: "filteredColumns", gridData: "gridData", isTableLoading: "isTableLoading", parent: "parent", showSearchBox: "showSearchBox", showActionColumn: "showActionColumn", showHeaderFilters: "showHeaderFilters", showFilterButton: "showFilterButton", isGridDataPagedInApi: "isGridDataPagedInApi", header: "header", ShowFilterColumns: "ShowFilterColumns", showImportExportButton: "showImportExportButton", crudService: "crudService", searchFields: "searchFields", sortMode: "sortMode", filtersHtmlTemplate: "filtersHtmlTemplate", presentationSettings: "presentationSettings", selectKeyOnly: "selectKeyOnly", selectionMode: "selectionMode", selectedItems: "selectedItems", searchOnInit: "searchOnInit", showGlobalSearch: "showGlobalSearch", showExportButton: "showExportButton", showSearchField: "showSearchField", showCalenderView: "showCalenderView", calenderSchema: "calenderSchema", showCardView: "showCardView", showKanbanView: "showKanbanView", businessClass: "businessClass", page$: "page$", checkedByField: "checkedByField", selectAll: "selectAll" }, outputs: { editRow: "editRow", deleteRow: "deleteRow", load: "load", buttonColumnClicked: "buttonColumnClicked", filtersHtmlTemplateChange: "filtersHtmlTemplateChange", selectedItemsChange: "selectedItemsChange", searchFieldsValueChanged: "searchFieldsValueChanged", calendarEventClick: "calendarEventClick", statusFilterChanged: "statusFilterChanged" }, viewQueries: [{ propertyName: "dt", first: true, predicate: ["dt"], descendants: true }, { propertyName: "tableHeaderCheckbox", first: true, predicate: ["tableHeaderCheckbox"], descendants: true }], ngImport: i0, template: "<div class=\"grid\">\r\n\r\n <div class=\"col-12\" [@slideInOut]=\"showSearchField ? 'in' : 'out'\" *ngIf=\"showGlobalSearch\">\r\n <!-- SearchBox// If exist -->\r\n <tsi-search-box \r\n [isRtlMode]=\"isRtlMode\" \r\n [(searchFields)]=\"searchFields\" \r\n [businessClass]=\"businessClass\"\r\n [entityInfo]=\"entityInfo\"\r\n (searchFieldsChange)=\"searchFieldsValueChanges($event)\" \r\n (keywordValueChanged)=\"keywordValueChanged($event)\"\r\n (searchFieldsApplied)=\"search($event)\"\r\n (statusFilterChanged)=\"onStatusFilterChanged($event)\"\r\n (comboBoxLabelChanged)=\"ccomboBoxLabelChanged($event)\">\r\n </tsi-search-box>\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === false && _showCardView === false && _showKanbanView === false\" class=\"col-12\">\r\n <p-table #dt [lazy]=\"isGridDataPagedInApi\" [lazyLoadOnInit]=\"searchOnInit\" (onLazyLoad)=\"lazyLoad($event)\"\r\n dataKey=\"{{ key }}\" [totalRecords]=\"page.totalCount\" [loading]=\"page.loading\" [reorderableColumns]=\"true\"\r\n [resizableColumns]=\"true\" columnResizeMode=\"expand\" [columns]=\"selectedColumns\" [value]=\"page.items\"\r\n [paginator]=\"true\" [scrollable]=\"true\" scrollHeight=\"600px\" [(rows)]=\"page.pageSize\"\r\n [showCurrentPageReport]=\"true\" [globalFilterFields]=\"fields()\" [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {{getFirstElementIndex()}} {{\r\n 'to' | localize\r\n }} {last} {{ 'of' | localize }} \r\n {totalRecords} {{ 'entries' | localize }}\" [rowsPerPageOptions]=\"[1, 10, 25, 50]\" [sortMode]=\"sortMode\"\r\n [multiSortMeta]=\"sortMetas\" styleClass=\"p-datatable-gridlines\" [selectAll]=\"selectAll\"\r\n [selectionMode]=\"selectionMode\" [(selection)]=\"selection\" (onRowUnselect)=\"onSelectedItemsChanged()\"\r\n (selectAllChange)=\"onSelectAllChange($event)\" (onRowSelect)=\"onSelectedItemsChanged()\">\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex justify-content-between align-items-center\">\r\n <div class=\"ml-2\">\r\n {{ header | localize }}\r\n </div>\r\n\r\n <div class=\"p-1 flex align-items-center\">\r\n <div *ngIf=\"showFilterButton\" presentationDesignerBase=\"grid_toggle_header_filters\">\r\n <Tsi-Button [icon]=\"filterIcon\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"filterTooltip\"\r\n styleClass=\"p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"toggleHeaderFilters()\"></Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showHeaderFilters\" presentationDesignerBase=\"grid_toggle_header_filter_mode\">\r\n <Tsi-Button [icon]=\"filterModeIcon\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n [tooltipText]=\"filterModeTooltip\" [styleClass]=\"'ml-1 p-button-primary p-button-icon-only'\"\r\n (click)=\"toggleHeaderFiltersMode()\"></Tsi-Button>\r\n </div>\r\n\r\n <div presentationDesignerBase=\"grid_clear_filter_button\">\r\n <Tsi-Button [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"'icon-clear-filter'\"\r\n styleClass=\"ml-1 p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"onClearFilters()\" [iconSrc]=\"'assets/layout/images/icon/icon-clear-filter.svg'\">\r\n </Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showExportButton\" presentationDesignerBase=\"grid_export_button\">\r\n <Tsi-Button icon=\"p-button-icon pi pi-file-excel\" (onClick)=\"exportExcel()\"\r\n styleClass=\"p-element p-button-success hover:shadow-6 ml-2 p-1 p-button p-component p-button-icon-only\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"XLS\"></Tsi-Button>\r\n </div>\r\n\r\n <p-multiSelect class=\"ml-1\" [options]=\"columns\" [(ngModel)]=\"selectedColumns\" optionLabel=\"translatedHeader\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" [style]=\"{ 'min-width': '180px' }\"\r\n placeholder=\"{{ 'choose_columns' | localize }}\" (onChange)=\"onSelectedColumnsChange()\">\r\n </p-multiSelect>\r\n </div>\r\n\r\n <!-- <div> -->\r\n <!-- <button *ngIf=\"showGlobalSearch\" type=\"button\" pButton pRipple icon=\"pi pi-search\" (click)=\"search()\"></button> -->\r\n <!-- </div> -->\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : 'z-index-checkbox'\" *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"padding: .3rem !important; width: 3rem;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n <!-- <th scope=\"col\" style=\"width:3rem\"></th>\r\n <th scope=\"col\" style=\"width:3rem\"></th> -->\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th scope=\"col\" [style]=\"col.style\" pTooltip=\"{{ col.toolTipText | localize }}\" tooltipPosition=\"top\"\r\n [pSortableColumn]=\"!col.isButton ? col.field : null\"\r\n [pResizableColumnDisabled]=\"col.isButton || col.type === displayTypes.IMAGE_DISPLAY\"\r\n [tooltipDisabled]=\"col.isButton\" [pReorderableColumnDisabled]=\"col.isButton\" pReorderableColumn\r\n pResizableColumn [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\"\r\n [class.disabled-column]=\"col.isButton\" [ngClass]=\"[\r\n getHeaderClassColor(col.type),\r\n page.loading ? 'no-z-index' : '',\r\n col.isButton ? 'w-1rem' : '',\r\n (col.isButton || col.type === displayTypes.IMAGE_DISPLAY) ? 'non-resizable-column' : ''\r\n ]\" [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\">\r\n <span>\r\n <table class=\"p-0 m-0\">\r\n <tr>\r\n <td class=\"col p-0 m-0\" \r\n [ngClass]=\"{'w-1rem': col.isButton}\">\r\n <ng-container *ngIf=\"notInSpecifiedColumn(col.field)\">\r\n {{ col.header | localize }}\r\n </ng-container>\r\n </td>\r\n <td class=\"col-fixed p-0 m-0\" style=\"width: 1rem\">\r\n <p-sortIcon class=\"w-1rem m-0 p-0\" *ngIf=\"notInSpecifiedColumn(col.field)\"\r\n field=\"{{ col.field }}\"></p-sortIcon>\r\n </td>\r\n </tr>\r\n </table>\r\n </span>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n <tr *ngIf=\"showHeaderFilters\">\r\n <!-- <th scope=\"col\" style=\"width:3rem\"></th>\r\n <th scope=\"col\" style=\"width:3rem\"></th> -->\r\n <th [ngClass]=\"page.loading ? 'no-z-index' : ''\" *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"width: 4rem\"></th>\r\n <th style=\"overflow: inherit\" scope=\"col\" *ngFor=\"let col of columns\">\r\n <p-columnFilter [type]=\"col.filterInputType\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [minFractionDigits]=\"col.numOfDecimal\" [maxFractionDigits]=\"col.numOfDecimal\" [showButtons]=\"false\"\r\n [matchMode]=\"filterMatchMode.EQUALS\">\r\n </p-columnFilter>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\" let-index=\"rowIndex\">\r\n <!-- CASE : multiple selection -->\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\" *ngIf=\"\r\n selectionMode == multipleGridSelectionMode;\r\n else notMultipleSelectionModeBlock\r\n \">\r\n <td [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\" style=\"padding: .3rem !important;\">\r\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\r\n </td>\r\n <!-- <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-text\"\r\n (click)=\"edit(item)\"></button>\r\n </div>\r\n </td>\r\n <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-trash\"\r\n class=\"p-button-rounded p-button-text p-button-danger\" (click)=\"delete(item)\"></button>\r\n </div>\r\n </td> -->\r\n <td [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n style=\"height: min-content; margin-left: -.5rem;\" *ngFor=\"let col of columns\">\r\n <!-- Tsi-Currency-Societe-Input -->\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayButtonBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayTextEyeBlock\">\r\n <div class=\"align-items-center frozen-column-rtl-mode justify-content-center p-2\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\" icon=\"{{ col.buttonIcon }}\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n [text]=\"col.buttonLabel ? col.buttonLabel : item[col.field]\"\r\n (click)=\"buttonClicked(item, col.field)\"></Tsi-Button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else defaultTextOutputBlock\r\n \">\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n </tr>\r\n <!-- CASE : single or none selection -->\r\n <ng-template #notMultipleSelectionModeBlock>\r\n <ng-container>\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\"\r\n [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"index\">\r\n <!-- <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-text\"\r\n (click)=\"edit(item)\"></button>\r\n </div>\r\n </td>\r\n <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-trash\"\r\n class=\"p-button-rounded p-button-text p-button-danger\" (click)=\"delete(item)\"></button>\r\n </div>\r\n </td> -->\r\n <td [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" style=\"height: min-content;\"\r\n [ngClass]=\"{\r\n 'no-z-index': page.loading,\r\n 'w-1rem': col.isButton\r\n }\" *ngFor=\"let col of columns\">\r\n <!-- [ngClass]=\"page.loading ? 'no-z-index' : ''\" -->\r\n <!-- Tsi-Currency-Societe-Input -->\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayButtonBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\">\r\n <div [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n class=\"flex align-items-center frozen-column-rtl-mode justify-content-center p-0\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\" icon=\"{{ col.buttonIcon }}\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n (click)=\"buttonClicked(item, col.field)\"\r\n [text]=\"col.buttonLabel ? col.buttonLabel : item[col.field]\"></Tsi-Button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayTextEyeBlock\">\r\n <div class=\"h-3rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else defaultTextOutputBlock\r\n \">\r\n <span>\r\n <span class=\"cursor-pointer pi pi-eye\" (click)=\"eyeClicked(item[col.field])\"></span>\r\n {{ truncateString(item[col.field], 50) }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template pTemplate=\"footer\">\r\n <tr>\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"></td>\r\n <td class=\"pr-0\" *ngFor=\"let col of selectedColumns\">\r\n <div *ngIf=\"col.showSummary\">\r\n <!-- CURRENCY_SOCIETE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- INTEGER_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.INTEGER_DISPLAY\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Integer-Display>\r\n </div>\r\n\r\n <!-- RATE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.RATE_DISPLAY\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction ?? false\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Rate-Display>\r\n </div>\r\n\r\n <!-- DECIMAL_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.DECIMAL_DISPLAY\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col.field)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </div>\r\n\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Other-Display>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"summary\">\r\n {{ page.totalCount }} {{ \"records_label\" | localize }}\r\n <span *ngIf=\"colorful\">\r\n <span>View Grid</span>\r\n <span class=\"pl-2\">| SearchOnInit : {{ searchOnInit }}</span>\r\n <span class=\"pl-2\">| Pagination In Api : {{ isGridDataPagedInApi }}</span>\r\n </span>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === true\" class=\"col-12\">\r\n <tsi-calender [schema]=\"calenderSchema\" [eventsData]=\"page.items\" [crudService]=\"crudService\"\r\n (dateRangeChange)=\"handleDateRangeChange($event)\" (eventClick)=\"handleCalendarEventClick($event)\"></tsi-calender>\r\n </div>\r\n\r\n <div *ngIf=\"_showCardView === true\" class=\"col-12\">\r\n <Tsi-card-list [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-card-list>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true\" class=\"col-12\">\r\n <Tsi-kanban [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\" [crudService]=\"crudService\">\r\n </Tsi-kanban>\r\n </div>\r\n</div>", styles: [".p-button.p-button-icon-only.p-button-rounded{border-radius:50%;height:1rem}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.p-inputgroup.rtl-mode .p-inputgroup-addon:last-child,.p-inputgroup.rtl-mode button:last-child,.p-inputgroup.rtl-mode input:last-child,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:6px 0 0 6px/6px 0px 0px 6px!important}.p-inputgroup.ltr-mode .p-inputgroup-addon:last-child,.p-inputgroup.ltr-mode button:last-child,.p-inputgroup.ltr-mode input:last-child,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:0 6px 6px 0/0px 6px 6px 0px!important}.p-paginator .p-dropdown{height:auto;border:none;border-bottom:1px solid}.p-datatable .frozen-column{position:sticky;left:0;z-index:1;background:#fff}.frozen-column-ltr-mode{min-width:2rem;position:sticky;left:0;background-color:#fff}.no-z-index{z-index:0!important}.z-index-checkbox{z-index:100!important}.frozen-column-rtl-mode{min-width:2rem;position:sticky;right:0;background-color:#fff}.disabled-column{background-color:#f5f5f5;color:#d3d3d3;pointer-events:none}td span,td div{padding:0 .5rem}.custom-button{display:flex;align-items:center;justify-content:center;padding:0;border:none;background:none;cursor:pointer}.button-icon{width:1.5rem;height:1.5rem}.custom-button:hover{background-color:#f0f0f0}table{width:100%!important}.right-to-left{text-align:start}th{left:0!important}::ng-deep th.non-resizable-column .p-column-resizer{display:none!important;pointer-events:none!important}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i12.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i12.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i12.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i12.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i12.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i12.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i12.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i12.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i12.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons", "ariaLabel"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i13.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i14.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i15.TsiCheckboxDisplayComponent, selector: "Tsi-Checkbox-Display", inputs: ["inputData"] }, { kind: "component", type: i16.TsiCurrencyOtherDisplayComponent, selector: "Tsi-Currency-Other-Display", inputs: ["inputData", "currency"] }, { kind: "component", type: i17.TsiCurrencySocieteDisplayComponent, selector: "Tsi-Currency-Societe-Display", inputs: ["inputData"] }, { kind: "component", type: i18.TsiDateDisplayComponent, selector: "Tsi-Date-Display", inputs: ["inputData", "showTime"] }, { kind: "component", type: i19.TsiDecimalDisplayComponent, selector: "Tsi-Decimal-Display", inputs: ["inputData", "formatDecimal", "numOfDecimal"] }, { kind: "component", type: i20.TsiIntegerDisplayComponent, selector: "Tsi-Integer-Display", inputs: ["inputData"] }, { kind: "component", type: i21.TsiRateDisplayComponent, selector: "Tsi-Rate-Display", inputs: ["isFraction", "inputData", "numOfDecimal"] }, { kind: "component", type: i22.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i23.TsiSearchBoxComponent, selector: "tsi-search-box", inputs: ["searchFields", "businessClass", "isRtlMode", "isSearchButtonDisabled", "entityInfo"], outputs: ["searchFieldsChange", "searchFieldsApplied", "keywordValueChanged", "statusFilterChanged", "comboBoxLabelChanged"] }, { kind: "component", type: i24.TsiCardListComponent, selector: "Tsi-card-list", inputs: ["cardBusinessClass", "header", "id", "page", "page$"], outputs: ["buttonClicked", "callSearch"] }, { kind: "component", type: i25.TsiImageDisplayComponent, selector: "tsi-image-display", inputs: ["src", "alt", "width", "height", "isRounded", "headerTitles"] }, { kind: "component", type: i26.TsiKanbanComponent, selector: "Tsi-kanban", inputs: ["cardBusinessClass", "header", "id", "page$", "crudService", "page"], outputs: ["buttonClicked", "callSearch"] }, { kind: "component", type: i27.TsiCalenderComponent, selector: "tsi-calender", inputs: ["crudService", "schema", "eventsData"], outputs: ["eventClick", "dateRangeChange"] }, { kind: "directive", type: i28.PresentationDesignerDirectiveBase, selector: "[presentationDesignerBase]", inputs: ["presentationDesigner", "presentationDesignerBase"] }, { kind: "component", type: i29.DisplayNestedPropComponent, selector: "Tsi-Display-Nested-Prop", inputs: ["id", "displayValue", "sourceUrl"] }, { kind: "pipe", type: i4.LocalizePipe, name: "localize" }], animations: [
1366
+ trigger('slideInOut', [
1367
+ state('in', style({
1368
+ height: '*',
1369
+ opacity: 1,
1370
+ transform: 'translateY(0)'
1371
+ })),
1372
+ state('out', style({
1373
+ height: '0px',
1374
+ opacity: 0,
1375
+ transform: 'translateY(-20px)'
1376
+ })),
1377
+ transition('in <=> out', animate('600ms cubic-bezier(0.25, 0.8, 0.25, 1)'))
1378
+ ])
1379
+ ] }); }
1380
+ }
1381
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiGenericGridComponent, decorators: [{
1382
+ type: Component,
1383
+ args: [{ selector: 'Tsi-Generic-Grid', animations: [
1384
+ trigger('slideInOut', [
1385
+ state('in', style({
1386
+ height: '*',
1387
+ opacity: 1,
1388
+ transform: 'translateY(0)'
1389
+ })),
1390
+ state('out', style({
1391
+ height: '0px',
1392
+ opacity: 0,
1393
+ transform: 'translateY(-20px)'
1394
+ })),
1395
+ transition('in <=> out', animate('600ms cubic-bezier(0.25, 0.8, 0.25, 1)'))
1396
+ ])
1397
+ ], template: "<div class=\"grid\">\r\n\r\n <div class=\"col-12\" [@slideInOut]=\"showSearchField ? 'in' : 'out'\" *ngIf=\"showGlobalSearch\">\r\n <!-- SearchBox// If exist -->\r\n <tsi-search-box \r\n [isRtlMode]=\"isRtlMode\" \r\n [(searchFields)]=\"searchFields\" \r\n [businessClass]=\"businessClass\"\r\n [entityInfo]=\"entityInfo\"\r\n (searchFieldsChange)=\"searchFieldsValueChanges($event)\" \r\n (keywordValueChanged)=\"keywordValueChanged($event)\"\r\n (searchFieldsApplied)=\"search($event)\"\r\n (statusFilterChanged)=\"onStatusFilterChanged($event)\"\r\n (comboBoxLabelChanged)=\"ccomboBoxLabelChanged($event)\">\r\n </tsi-search-box>\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === false && _showCardView === false && _showKanbanView === false\" class=\"col-12\">\r\n <p-table #dt [lazy]=\"isGridDataPagedInApi\" [lazyLoadOnInit]=\"searchOnInit\" (onLazyLoad)=\"lazyLoad($event)\"\r\n dataKey=\"{{ key }}\" [totalRecords]=\"page.totalCount\" [loading]=\"page.loading\" [reorderableColumns]=\"true\"\r\n [resizableColumns]=\"true\" columnResizeMode=\"expand\" [columns]=\"selectedColumns\" [value]=\"page.items\"\r\n [paginator]=\"true\" [scrollable]=\"true\" scrollHeight=\"600px\" [(rows)]=\"page.pageSize\"\r\n [showCurrentPageReport]=\"true\" [globalFilterFields]=\"fields()\" [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {{getFirstElementIndex()}} {{\r\n 'to' | localize\r\n }} {last} {{ 'of' | localize }} \r\n {totalRecords} {{ 'entries' | localize }}\" [rowsPerPageOptions]=\"[1, 10, 25, 50]\" [sortMode]=\"sortMode\"\r\n [multiSortMeta]=\"sortMetas\" styleClass=\"p-datatable-gridlines\" [selectAll]=\"selectAll\"\r\n [selectionMode]=\"selectionMode\" [(selection)]=\"selection\" (onRowUnselect)=\"onSelectedItemsChanged()\"\r\n (selectAllChange)=\"onSelectAllChange($event)\" (onRowSelect)=\"onSelectedItemsChanged()\">\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex justify-content-between align-items-center\">\r\n <div class=\"ml-2\">\r\n {{ header | localize }}\r\n </div>\r\n\r\n <div class=\"p-1 flex align-items-center\">\r\n <div *ngIf=\"showFilterButton\" presentationDesignerBase=\"grid_toggle_header_filters\">\r\n <Tsi-Button [icon]=\"filterIcon\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"filterTooltip\"\r\n styleClass=\"p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"toggleHeaderFilters()\"></Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showHeaderFilters\" presentationDesignerBase=\"grid_toggle_header_filter_mode\">\r\n <Tsi-Button [icon]=\"filterModeIcon\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n [tooltipText]=\"filterModeTooltip\" [styleClass]=\"'ml-1 p-button-primary p-button-icon-only'\"\r\n (click)=\"toggleHeaderFiltersMode()\"></Tsi-Button>\r\n </div>\r\n\r\n <div presentationDesignerBase=\"grid_clear_filter_button\">\r\n <Tsi-Button [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"'icon-clear-filter'\"\r\n styleClass=\"ml-1 p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"onClearFilters()\" [iconSrc]=\"'assets/layout/images/icon/icon-clear-filter.svg'\">\r\n </Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showExportButton\" presentationDesignerBase=\"grid_export_button\">\r\n <Tsi-Button icon=\"p-button-icon pi pi-file-excel\" (onClick)=\"exportExcel()\"\r\n styleClass=\"p-element p-button-success hover:shadow-6 ml-2 p-1 p-button p-component p-button-icon-only\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"XLS\"></Tsi-Button>\r\n </div>\r\n\r\n <p-multiSelect class=\"ml-1\" [options]=\"columns\" [(ngModel)]=\"selectedColumns\" optionLabel=\"translatedHeader\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" [style]=\"{ 'min-width': '180px' }\"\r\n placeholder=\"{{ 'choose_columns' | localize }}\" (onChange)=\"onSelectedColumnsChange()\">\r\n </p-multiSelect>\r\n </div>\r\n\r\n <!-- <div> -->\r\n <!-- <button *ngIf=\"showGlobalSearch\" type=\"button\" pButton pRipple icon=\"pi pi-search\" (click)=\"search()\"></button> -->\r\n <!-- </div> -->\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : 'z-index-checkbox'\" *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"padding: .3rem !important; width: 3rem;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n <!-- <th scope=\"col\" style=\"width:3rem\"></th>\r\n <th scope=\"col\" style=\"width:3rem\"></th> -->\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th scope=\"col\" [style]=\"col.style\" pTooltip=\"{{ col.toolTipText | localize }}\" tooltipPosition=\"top\"\r\n [pSortableColumn]=\"!col.isButton ? col.field : null\"\r\n [pResizableColumnDisabled]=\"col.isButton || col.type === displayTypes.IMAGE_DISPLAY\"\r\n [tooltipDisabled]=\"col.isButton\" [pReorderableColumnDisabled]=\"col.isButton\" pReorderableColumn\r\n pResizableColumn [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\"\r\n [class.disabled-column]=\"col.isButton\" [ngClass]=\"[\r\n getHeaderClassColor(col.type),\r\n page.loading ? 'no-z-index' : '',\r\n col.isButton ? 'w-1rem' : '',\r\n (col.isButton || col.type === displayTypes.IMAGE_DISPLAY) ? 'non-resizable-column' : ''\r\n ]\" [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\">\r\n <span>\r\n <table class=\"p-0 m-0\">\r\n <tr>\r\n <td class=\"col p-0 m-0\" \r\n [ngClass]=\"{'w-1rem': col.isButton}\">\r\n <ng-container *ngIf=\"notInSpecifiedColumn(col.field)\">\r\n {{ col.header | localize }}\r\n </ng-container>\r\n </td>\r\n <td class=\"col-fixed p-0 m-0\" style=\"width: 1rem\">\r\n <p-sortIcon class=\"w-1rem m-0 p-0\" *ngIf=\"notInSpecifiedColumn(col.field)\"\r\n field=\"{{ col.field }}\"></p-sortIcon>\r\n </td>\r\n </tr>\r\n </table>\r\n </span>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n <tr *ngIf=\"showHeaderFilters\">\r\n <!-- <th scope=\"col\" style=\"width:3rem\"></th>\r\n <th scope=\"col\" style=\"width:3rem\"></th> -->\r\n <th [ngClass]=\"page.loading ? 'no-z-index' : ''\" *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"width: 4rem\"></th>\r\n <th style=\"overflow: inherit\" scope=\"col\" *ngFor=\"let col of columns\">\r\n <p-columnFilter [type]=\"col.filterInputType\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [minFractionDigits]=\"col.numOfDecimal\" [maxFractionDigits]=\"col.numOfDecimal\" [showButtons]=\"false\"\r\n [matchMode]=\"filterMatchMode.EQUALS\">\r\n </p-columnFilter>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\" let-index=\"rowIndex\">\r\n <!-- CASE : multiple selection -->\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\" *ngIf=\"\r\n selectionMode == multipleGridSelectionMode;\r\n else notMultipleSelectionModeBlock\r\n \">\r\n <td [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\" style=\"padding: .3rem !important;\">\r\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\r\n </td>\r\n <!-- <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-text\"\r\n (click)=\"edit(item)\"></button>\r\n </div>\r\n </td>\r\n <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-trash\"\r\n class=\"p-button-rounded p-button-text p-button-danger\" (click)=\"delete(item)\"></button>\r\n </div>\r\n </td> -->\r\n <td [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n style=\"height: min-content; margin-left: -.5rem;\" *ngFor=\"let col of columns\">\r\n <!-- Tsi-Currency-Societe-Input -->\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayButtonBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayTextEyeBlock\">\r\n <div class=\"align-items-center frozen-column-rtl-mode justify-content-center p-2\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\" icon=\"{{ col.buttonIcon }}\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n [text]=\"col.buttonLabel ? col.buttonLabel : item[col.field]\"\r\n (click)=\"buttonClicked(item, col.field)\"></Tsi-Button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else defaultTextOutputBlock\r\n \">\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n </tr>\r\n <!-- CASE : single or none selection -->\r\n <ng-template #notMultipleSelectionModeBlock>\r\n <ng-container>\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\"\r\n [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"index\">\r\n <!-- <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-text\"\r\n (click)=\"edit(item)\"></button>\r\n </div>\r\n </td>\r\n <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-trash\"\r\n class=\"p-button-rounded p-button-text p-button-danger\" (click)=\"delete(item)\"></button>\r\n </div>\r\n </td> -->\r\n <td [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" style=\"height: min-content;\"\r\n [ngClass]=\"{\r\n 'no-z-index': page.loading,\r\n 'w-1rem': col.isButton\r\n }\" *ngFor=\"let col of columns\">\r\n <!-- [ngClass]=\"page.loading ? 'no-z-index' : ''\" -->\r\n <!-- Tsi-Currency-Societe-Input -->\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayButtonBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\">\r\n <div [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n class=\"flex align-items-center frozen-column-rtl-mode justify-content-center p-0\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\" icon=\"{{ col.buttonIcon }}\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n (click)=\"buttonClicked(item, col.field)\"\r\n [text]=\"col.buttonLabel ? col.buttonLabel : item[col.field]\"></Tsi-Button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayTextEyeBlock\">\r\n <div class=\"h-3rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else defaultTextOutputBlock\r\n \">\r\n <span>\r\n <span class=\"cursor-pointer pi pi-eye\" (click)=\"eyeClicked(item[col.field])\"></span>\r\n {{ truncateString(item[col.field], 50) }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n <ng-template pTemplate=\"footer\">\r\n <tr>\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"></td>\r\n <td class=\"pr-0\" *ngFor=\"let col of selectedColumns\">\r\n <div *ngIf=\"col.showSummary\">\r\n <!-- CURRENCY_SOCIETE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- INTEGER_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.INTEGER_DISPLAY\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Integer-Display>\r\n </div>\r\n\r\n <!-- RATE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.RATE_DISPLAY\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction ?? false\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Rate-Display>\r\n </div>\r\n\r\n <!-- DECIMAL_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.DECIMAL_DISPLAY\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col.field)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </div>\r\n\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Other-Display>\r\n </div>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"summary\">\r\n {{ page.totalCount }} {{ \"records_label\" | localize }}\r\n <span *ngIf=\"colorful\">\r\n <span>View Grid</span>\r\n <span class=\"pl-2\">| SearchOnInit : {{ searchOnInit }}</span>\r\n <span class=\"pl-2\">| Pagination In Api : {{ isGridDataPagedInApi }}</span>\r\n </span>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === true\" class=\"col-12\">\r\n <tsi-calender [schema]=\"calenderSchema\" [eventsData]=\"page.items\" [crudService]=\"crudService\"\r\n (dateRangeChange)=\"handleDateRangeChange($event)\" (eventClick)=\"handleCalendarEventClick($event)\"></tsi-calender>\r\n </div>\r\n\r\n <div *ngIf=\"_showCardView === true\" class=\"col-12\">\r\n <Tsi-card-list [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-card-list>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true\" class=\"col-12\">\r\n <Tsi-kanban [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\" [crudService]=\"crudService\">\r\n </Tsi-kanban>\r\n </div>\r\n</div>", styles: [".p-button.p-button-icon-only.p-button-rounded{border-radius:50%;height:1rem}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.p-inputgroup.rtl-mode .p-inputgroup-addon:last-child,.p-inputgroup.rtl-mode button:last-child,.p-inputgroup.rtl-mode input:last-child,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:6px 0 0 6px/6px 0px 0px 6px!important}.p-inputgroup.ltr-mode .p-inputgroup-addon:last-child,.p-inputgroup.ltr-mode button:last-child,.p-inputgroup.ltr-mode input:last-child,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:0 6px 6px 0/0px 6px 6px 0px!important}.p-paginator .p-dropdown{height:auto;border:none;border-bottom:1px solid}.p-datatable .frozen-column{position:sticky;left:0;z-index:1;background:#fff}.frozen-column-ltr-mode{min-width:2rem;position:sticky;left:0;background-color:#fff}.no-z-index{z-index:0!important}.z-index-checkbox{z-index:100!important}.frozen-column-rtl-mode{min-width:2rem;position:sticky;right:0;background-color:#fff}.disabled-column{background-color:#f5f5f5;color:#d3d3d3;pointer-events:none}td span,td div{padding:0 .5rem}.custom-button{display:flex;align-items:center;justify-content:center;padding:0;border:none;background:none;cursor:pointer}.button-icon{width:1.5rem;height:1.5rem}.custom-button:hover{background-color:#f0f0f0}table{width:100%!important}.right-to-left{text-align:start}th{left:0!important}::ng-deep th.non-resizable-column .p-column-resizer{display:none!important;pointer-events:none!important}\n"] }]
1398
+ }], ctorParameters: () => [{ type: i1.HtmlTemplateGeneratorService }, { type: i2.DatePipe }, { type: i3.TsiNotificationService }, { type: i4.LocalizePipe }, { type: i5.LayoutHelperService }, { type: i6.LayoutService }, { type: i7.PrimeNGConfig }, { type: i8.AppSettingsService }, { type: i9.ErrorResponseManagerService }, { type: i0.EnvironmentInjector }, { type: i10.DynamicDialogConfig }, { type: i10.DynamicDialogRef }], propDecorators: { cudComponent: [{
1399
+ type: Input
1400
+ }], modalSize: [{
1401
+ type: Input
1402
+ }], entityInfo: [{
1403
+ type: Input
1404
+ }], dt: [{
1405
+ type: ViewChild,
1406
+ args: ["dt", { static: false }]
1407
+ }], tableHeaderCheckbox: [{
1408
+ type: ViewChild,
1409
+ args: ["tableHeaderCheckbox"]
1410
+ }], formName: [{
1411
+ type: Input
1412
+ }], id: [{
1413
+ type: Input
1414
+ }], pagedRequest: [{
1415
+ type: Input
1416
+ }], configuration: [{
1417
+ type: Input
1418
+ }], page: [{
1419
+ type: Input
1420
+ }], key: [{
1421
+ type: Input
1422
+ }], columns: [{
1423
+ type: Input
1424
+ }], isSearchButtonDisabled: [{
1425
+ type: Input
1426
+ }], filteredColumns: [{
1427
+ type: Input
1428
+ }], gridData: [{
1429
+ type: Input
1430
+ }], isTableLoading: [{
1431
+ type: Input
1432
+ }], parent: [{
1433
+ type: Input
1434
+ }], showSearchBox: [{
1435
+ type: Input
1436
+ }], showActionColumn: [{
1437
+ type: Input
1438
+ }], showHeaderFilters: [{
1439
+ type: Input
1440
+ }], showFilterButton: [{
1441
+ type: Input
1442
+ }], isGridDataPagedInApi: [{
1443
+ type: Input
1444
+ }], header: [{
1445
+ type: Input
1446
+ }], ShowFilterColumns: [{
1447
+ type: Input
1448
+ }], showImportExportButton: [{
1449
+ type: Input
1450
+ }], crudService: [{
1451
+ type: Input
1452
+ }], searchFields: [{
1453
+ type: Input
1454
+ }], sortMode: [{
1455
+ type: Input
1456
+ }], filtersHtmlTemplate: [{
1457
+ type: Input
1458
+ }], presentationSettings: [{
1459
+ type: Input
1460
+ }], selectKeyOnly: [{
1461
+ type: Input
1462
+ }], selectionMode: [{
1463
+ type: Input
1464
+ }], selectedItems: [{
1465
+ type: Input
1466
+ }], searchOnInit: [{
1467
+ type: Input
1468
+ }], showGlobalSearch: [{
1469
+ type: Input
1470
+ }], showExportButton: [{
1471
+ type: Input
1472
+ }], showSearchField: [{
1473
+ type: Input
1474
+ }], showCalenderView: [{
1475
+ type: Input
1476
+ }], calenderSchema: [{
1477
+ type: Input
1478
+ }], showCardView: [{
1479
+ type: Input
1480
+ }], showKanbanView: [{
1481
+ type: Input
1482
+ }], businessClass: [{
1483
+ type: Input
1484
+ }], page$: [{
1485
+ type: Input
1486
+ }], checkedByField: [{
1487
+ type: Input
1488
+ }], selectAll: [{
1489
+ type: Input
1490
+ }], editRow: [{
1491
+ type: Output
1492
+ }], deleteRow: [{
1493
+ type: Output
1494
+ }], load: [{
1495
+ type: Output
1496
+ }], buttonColumnClicked: [{
1497
+ type: Output
1498
+ }], filtersHtmlTemplateChange: [{
1499
+ type: Output
1500
+ }], selectedItemsChange: [{
1501
+ type: Output
1502
+ }], searchFieldsValueChanged: [{
1503
+ type: Output
1504
+ }], calendarEventClick: [{
1505
+ type: Output
1506
+ }], statusFilterChanged: [{
1507
+ type: Output
1508
+ }] } });
1509
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWdlbmVyaWMtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvb3V0cHV0LWNvbXBvbmVudHMvdHNpLWdlbmVyaWMtZ3JpZC90c2ktZ2VuZXJpYy1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy9vdXRwdXQtY29tcG9uZW50cy90c2ktZ2VuZXJpYy1ncmlkL3RzaS1nZW5lcmljLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdqRixPQUFPLEVBQWlCLFNBQVMsRUFBdUIsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlILE9BQU8sRUFBRSxlQUFlLEVBQXVELE1BQU0sYUFBYSxDQUFDO0FBRW5HLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2TCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUlsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFReEMsT0FBTyxFQUFFLFlBQVksRUFB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QWlCO3NCQUF6QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBY0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR08sYUFBYTtzQkFBekIsS0FBSztnQkFhRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBWUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVPLGdCQUFnQjtzQkFBNUIsS0FBSztnQkFXRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBS08sY0FBYztzQkFBMUIsS0FBSztnQkFJRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlGLFNBQVM7c0JBRFosS0FBSztnQkFtQkksT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0cseUJBQXlCO3NCQUFsQyxNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVudmlyb25tZW50SW5qZWN0b3IsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRmlsdGVyTWF0Y2hNb2RlLCBGaWx0ZXJNZXRhZGF0YSwgUHJpbWVOR0NvbmZpZywgU29ydE1ldGEsIFRhYmxlU3RhdGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFRhYmxlLCBUYWJsZUhlYWRlckNoZWNrYm94LCBUYWJsZUxhenlMb2FkRXZlbnQsIFRhYmxlU2VsZWN0QWxsQ2hhbmdlRXZlbnQgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGVudGl0eUluZm8gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZW50aXR5LWluZm8vZW50aXR5LWluZm8nO1xyXG5pbXBvcnQgeyBEaXNwbGF5VHlwZUNvbG9ycywgRGlzcGxheVR5cGVzLCBGaWx0ZXJPcGVyYXRvclR5cGUsIEdyaWRTZWxlY3Rpb25Nb2RlLCBHcmlkU29ydE1vZGUsIElucHV0VHlwZXMsIE1vZGFsU2l6ZUVudW0sIE51bWVyaWNEaXNwbGF5VHlwZXMsIFRvb2x0aXBQb3NpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgRGVmYXVsdFNvY2lldGVEZXZpc2UgfSBmcm9tICcuLi8uLi8uLi9jb25zdHMvdHNpLWNvbnN0cyc7XHJcbmltcG9ydCB7IElGaWx0ZXJlZFJlcXVlc3QsIElTb3J0QnlQcm9wcmV0eSwgSVBhZ2VkUmVxdWVzdCwgSUdyaWRDb25maWd1cmF0aW9uLCBJUGFnZSwgR3JpZENvbHVtbiwgQnV0dG9uQ2xpY2tSZXN1bHQsIElTb3J0TWV0YSwgSVBhZ2VkUmVzcG9uc2UsIERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgU2VhcmNoRmllbGQsIFByZXNlbnRhdGlvblNldHRpbmcsIEV2ZW50U2NoZW1hfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBMYXlvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXBwbGljYXRpb24vYXBwLmxheW91dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgcnRsTW9kZUtleXMgfSBmcm9tICcuLi8uLi8uLi9jb25zdHMvbG9jYWxzLmNvbnN0JztcclxuaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5pbXBvcnQgeyBMb2NhbGl6ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9sb2NhbGl6ZS5waXBlJztcclxuaW1wb3J0IHsgQ3J1ZEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYmFzZS9jcnVkLWJhc2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEh0bWxUZW1wbGF0ZUdlbmVyYXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9nZW5lcmF0b3IvaHRtbC10ZW1wbGF0ZS1nZW5lcmF0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IFRzaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vdHNpLW5vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGF5b3V0SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2xheW91dC9sYXlvdXQtaGVscGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcHBTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zZXR0aW5ncy9hcHAtc2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7IEVycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi9lcnJvci1yZXNwb25zZS1tYW5hZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWx0ZXJIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi90c2ktaGVscGVycy9maWx0ZXItaGVscGVyJztcclxuaW1wb3J0IHsgcHJpbWVuZ0xvY2FsZUFyIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWhlbHBlcnMvcHJpbWVuZy10cmFuc2xhdGUtY29uZmlnJztcclxuaW1wb3J0IHsgRXhwb3J0RXhjZWxIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi90c2ktaGVscGVycy9leHBvcnQtZXhjZWwuaGVscGVyJztcclxuaW1wb3J0IHsgRHluYW1pY0RpYWxvZ0NvbmZpZywgRHluYW1pY0RpYWxvZ1JlZiB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XHJcbmltcG9ydCB7IG9wZW5Uc2lQb3B1cFRleHRWaWV3ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9mdW5jdGlvbnMvbW9kYWwtb3Blbi5mdW5jdGlvbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1RzaS1HZW5lcmljLUdyaWQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90c2ktZ2VuZXJpYy1ncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90c2ktZ2VuZXJpYy1ncmlkLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignc2xpZGVJbk91dCcsIFtcclxuICAgICAgc3RhdGUoJ2luJywgc3R5bGUoe1xyXG4gICAgICAgIGhlaWdodDogJyonLFxyXG4gICAgICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwKSdcclxuICAgICAgfSkpLFxyXG4gICAgICBzdGF0ZSgnb3V0Jywgc3R5bGUoe1xyXG4gICAgICAgIGhlaWdodDogJzBweCcsXHJcbiAgICAgICAgb3BhY2l0eTogMCxcclxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0yMHB4KSdcclxuICAgICAgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdpbiA8PT4gb3V0JywgYW5pbWF0ZSgnNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSknKSlcclxuICAgIF0pXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHNpR2VuZXJpY0dyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG5cclxuICBASW5wdXQoKSBjdWRDb21wb25lbnQ6IGFueTtcclxuICBASW5wdXQoKSBtb2RhbFNpemU6IGFueTtcclxuICBASW5wdXQoKSBlbnRpdHlJbmZvOiBlbnRpdHlJbmZvIHwgdW5kZWZpbmVkO1xyXG5cclxuXHJcbiAgZmlsdGVyTWF0Y2hNb2RlID0gRmlsdGVyTWF0Y2hNb2RlO1xyXG4gIHRvb2x0aXBQb3NpdGlvbiA9IFRvb2x0aXBQb3NpdGlvbjtcclxuXHJcbiAgaXNBcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBhc3luYyBleWVDbGlja2VkKHRleHQ6IGFueSkge1xyXG5cclxuICAgIGxldCBtb2RhbFNpemUgPSBNb2RhbFNpemVFbnVtLkV4dHJhTGFyZ2U7XHJcbiAgICBsZXQgY29uZjogRHluYW1pY0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgZGF0YTogdGV4dCxcclxuICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAgIHdpZHRoOiBtb2RhbFNpemUud2lkdGgsXHJcbiAgICAgIGhlaWdodDogbW9kYWxTaXplLmhlaWdodFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLl9kaWFsb2dSZWYgPSBhd2FpdCBvcGVuVHNpUG9wdXBUZXh0Vmlld2VyQ29tcG9uZW50KHRoaXMuX2luamVjdG9yLCBjb25mKTtcclxuXHJcbiAgICB0aGlzLl9kaWFsb2dSZWYub25DbG9zZS5zdWJzY3JpYmUoKHZhbD86IGFueSkgPT4gdGhpcy5fY2xvc2VNb2RhbCh2YWwpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Nsb3NlTW9kYWwodmFsPzogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodmFsID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuX2RpYWxvZ1JlZj8uZGVzdHJveSgpXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fZGlhbG9nUmVmPy5kZXN0cm95KClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRydW5jYXRlU3RyaW5nKHZhbHVlOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIgPSA1MCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBsaW1pdCA/IHZhbHVlLnN1YnN0cigwLCBsaW1pdCkgKyAnLi4uJyA6IHZhbHVlO1xyXG4gIH1cclxuICAvLyNyZWdpb24gbG9jYWwgdmFyc1xyXG4gIEBWaWV3Q2hpbGQoXCJkdFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgcHVibGljIGR0OiBUYWJsZSB8IHVuZGVmaW5lZDtcclxuICBAVmlld0NoaWxkKFwidGFibGVIZWFkZXJDaGVja2JveFwiKSB0YWJsZUhlYWRlckNoZWNrYm94OiBUYWJsZUhlYWRlckNoZWNrYm94IHwgdW5kZWZpbmVkXHJcbiAgZmlyc3Q6IG51bWJlciA9IDA7XHJcbiAgcm93cyA9IDE7XHJcbiAgZGlzcGxheVR5cGVzID0gRGlzcGxheVR5cGVzO1xyXG4gIGtleXdvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBzdW1tYXJpZXM6IERpY3Rpb25hcnk8c3RyaW5nLCBudW1iZXI+ID0ge307XHJcbiAgaXNSdGxNb2RlOiBib29sZWFuID0gZmFsc2VcclxuICAvLyBwcml2YXRlIF9zZWFyY2hCb3hGaWx0ZXJzOiBBcnJheTxGaWx0ZXJCeVByb3ByZXR5PiA9IFtdO1xyXG4gIC8vIHByaXZhdGUgX2dyaWRIZWFkZXJGaWx0ZXJzOiBBcnJheTxGaWx0ZXJCeVByb3ByZXR5PiA9IFtdO1xyXG4gIHByaXZhdGUgX3NlYXJjaEZpZWxkczogQXJyYXk8U2VhcmNoRmllbGQ+IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX3NlYXJjaEJveEZpbHRlcnM6IEFycmF5PElGaWx0ZXJlZFJlcXVlc3Q+ID0gW107XHJcbiAgcHJpdmF0ZSBfZ3JpZEhlYWRlckZpbHRlcnM6IEFycmF5PElGaWx0ZXJlZFJlcXVlc3Q+ID0gW107XHJcbiAgcHJpdmF0ZSBfc29ydDogQXJyYXk8SVNvcnRCeVByb3ByZXR5PiA9IFtdO1xyXG4gIHNvcnRNZXRhczogU29ydE1ldGFbXSA9IFtdO1xyXG4gIHNlbGVjdGVkRnVsbEl0ZW1zPzogQXJyYXk8YW55PiA9IFtdO1xyXG4gIHNlbGVjdGlvbjogYW55O1xyXG4gIG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGUgPSBHcmlkU2VsZWN0aW9uTW9kZS5NdWx0aXBsZTtcclxuICBwcml2YXRlIF9kaWFsb2dSZWY/OiBEeW5hbWljRGlhbG9nUmVmO1xyXG4gIC8vanNvblN0cmluZ0xheW91dDogc3RyaW5nID0gJ3tcImZpcnN0XCI6MCxcInJvd3NcIjoxMCxcIm11bHRpU29ydE1ldGFcIjpbXSxcImNvbHVtbldpZHRoc1wiOlwiXCIsXCJ0YWJsZVdpZHRoXCI6XCIxMTg4cHhcIixcImNvbHVtbk9yZGVyXCI6W1wiXCJdfSc7XHJcbiAgbGF0ZXN0RmlsdGVycz86IElGaWx0ZXJlZFJlcXVlc3RbXTtcclxuXHJcbiAgLy8gcHJpdmF0ZSBfcGFnZSA6IElQYWdlPGFueT4gPSB7XHJcbiAgLy8gICBpdGVtczogW10sXHJcbiAgLy8gICB0b3RhbENvdW50OiAwLFxyXG4gIC8vICAgc3VtbWFyaWVzOiBbXSxcclxuICAvLyAgIHRvdGFsUGFnZXM6IDAsXHJcbiAgLy8gICBwYWdlTnVtYmVyOiAxLFxyXG4gIC8vICAgcGFnZVNpemU6IDEwLFxyXG4gIC8vICAgbG9hZGluZzogZmFsc2VcclxuICAvLyB9O1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gSW5wdXRzXHJcbiAgQElucHV0KCkgZm9ybU5hbWU/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaWQ/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGFnZWRSZXF1ZXN0PzogSVBhZ2VkUmVxdWVzdDtcclxuICBASW5wdXQoKSBjb25maWd1cmF0aW9uPzogSUdyaWRDb25maWd1cmF0aW9uO1xyXG4gIEBJbnB1dCgpIC8qc2V0Ki8gcGFnZTogSVBhZ2U8YW55PiA9IHtcclxuICAgIGl0ZW1zOiBbXSxcclxuICAgIHRvdGFsQ291bnQ6IDAsXHJcbiAgICBzdW1tYXJpZXM6IFtdLFxyXG4gICAgdG90YWxQYWdlczogMCxcclxuICAgIHBhZ2VOdW1iZXI6IDEsXHJcbiAgICBwYWdlU2l6ZTogMTAsXHJcbiAgICBsb2FkaW5nOiBmYWxzZVxyXG4gIH07XHJcbiAgLy8gKG5ld1BhZ2U6IElQYWdlPGFueT4pe1xyXG4gIC8vICAgaWYobmV3UGFnZSl7XHJcbiAgLy8gICAgIHRoaXMuX3BhZ2UgPSBuZXdQYWdlO1xyXG4gIC8vICAgICB0aGlzLl9leHRyYWN0U3VtbWFyaWVzKCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG4gIC8vIGdldCBwYWdlKCl7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5fcGFnZTtcclxuICAvLyB9XHJcbiAgQElucHV0KCkga2V5OiBzdHJpbmcgPSAndWlkJztcclxuICAvKipcclxuICAgKlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3RlbXBDb2x1bW5zOiBBcnJheTxHcmlkQ29sdW1uPiA9IFtdO1xyXG4gIHRlbXBTZWFyY2hGaWVsZHM6IEFycmF5PFNlYXJjaEZpZWxkPiA9IFtdO1xyXG4gIHByaXZhdGUgX2NvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcbiAgQElucHV0KCkgcHVibGljIHNldCBjb2x1bW5zKHZhbHVlOiBBcnJheTxHcmlkQ29sdW1uPiB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuX2NvbHVtbnMgPSB2YWx1ZTtcclxuICAgICAgdGhpcy5pbml0aWFsQ29sdW1uc1Byb2Nlc3MoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIGdldCBjb2x1bW5zKCk6IEFycmF5PEdyaWRDb2x1bW4+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNTZWFyY2hCdXR0b25EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgQElucHV0KCkgcHVibGljIHNldCBpc1NlYXJjaEJ1dHRvbkRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pc1NlYXJjaEJ1dHRvbkRpc2FibGVkID0gdmFsdWVcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNTZWFyY2hCdXR0b25EaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1NlYXJjaEJ1dHRvbkRpc2FibGVkXHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBmaWx0ZXJlZENvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcblxyXG4gIEBJbnB1dCgpIGdyaWREYXRhPzogQXJyYXk8YW55PjtcclxuXHJcbiAgQElucHV0KCkgaXNUYWJsZUxvYWRpbmc/OiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBwYXJlbnQ6IGFueTtcclxuXHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEJveDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25Db2x1bW46IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBzaG93SGVhZGVyRmlsdGVyczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNob3dGaWx0ZXJCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGlzR3JpZERhdGFQYWdlZEluQXBpOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBoZWFkZXI6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIFNob3dGaWx0ZXJDb2x1bW5zOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzaG93SW1wb3J0RXhwb3J0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY3J1ZFNlcnZpY2U/OiBDcnVkQmFzZVNlcnZpY2U8YW55LCBhbnksIGFueSwgYW55PjtcclxuICBASW5wdXQoKSBzZXQgc2VhcmNoRmllbGRzKHZhbHVlOiBBcnJheTxTZWFyY2hGaWVsZD4gfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAvL3Jlc2V0XHJcbiAgICAgIHRoaXMuX3NlYXJjaEZpZWxkcyA9IFtdO1xyXG5cclxuICAgICAgLy9pbml0IHVzaW5nIHZhbHVlXHJcbiAgICAgIHRoaXMuX3NlYXJjaEZpZWxkcyA9IEZpbHRlckhlbHBlci5pbml0U2VhcmNoRmllbGRzKHZhbHVlKTtcclxuICAgICAgdGhpcy5pbml0U2VhcmNoT25Jbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzZWFyY2hGaWVsZHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoRmllbGRzO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc29ydE1vZGU6IEdyaWRTb3J0TW9kZSB8IGFueSA9IEdyaWRTb3J0TW9kZS5NdWx0aXBsZTtcclxuICBASW5wdXQoKSBmaWx0ZXJzSHRtbFRlbXBsYXRlPzogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKSBwcmVzZW50YXRpb25TZXR0aW5ncz86IFByZXNlbnRhdGlvblNldHRpbmdcclxuXHJcbiAgQElucHV0KCkgc2VsZWN0S2V5T25seTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUgfCBhbnkgPSBHcmlkU2VsZWN0aW9uTW9kZS5Ob25lO1xyXG5cclxuICBASW5wdXQoKSBzZXQgc2VsZWN0aW9uTW9kZSh2YWx1ZTogR3JpZFNlbGVjdGlvbk1vZGUgfCBhbnkpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZz8uZGF0YT8uaXNBZHZhbmNlZFNlYXJjaCAmJiB0aGlzLmNvbmZpZz8uZGF0YT8uc2VsZWN0aW9uTW9kZSkge1xyXG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlID0gdGhpcy5jb25maWc/LmRhdGE/LnNlbGVjdGlvbk1vZGU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZSA9IHZhbHVlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0aW9uTW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIEBJbnB1dCgpIHNldCBzZWFyY2hPbkluaXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQgfHwgdmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zZWFyY2hPbkluaXQgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zZWFyY2hPbkluaXQgPSB2YWx1ZVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgc2VhcmNoT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0U2VhcmNoT25Jbml0KClcclxuICAgIHJldHVybiB0aGlzLl9zZWFyY2hPbkluaXRcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNob3dHbG9iYWxTZWFyY2g6IGJvb2xlYW4gPSB0cnVlXHJcbiAgQElucHV0KCkgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IHRydWVcclxuICBASW5wdXQoKSBzaG93U2VhcmNoRmllbGQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByb3RlY3RlZCBfc2hvd0NhbGVuZGVyVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNldCBzaG93Q2FsZW5kZXJWaWV3KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zaG93Q2FsZW5kZXJWaWV3ID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5fc2hvd0NhbGVuZGVyVmlldyA9PT0gZmFsc2UpIHtcclxuICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zZWFyY2hGaWVsZHM/LmZpbmQoeCA9PiB4LmZpZWxkID09PSB0aGlzLmNhbGVuZGVyU2NoZW1hPy5zdGFydClcclxuICAgICAgbGV0IGVuZCA9IHRoaXMuc2VhcmNoRmllbGRzPy5maW5kKHggPT4geC5maWVsZCA9PT0gdGhpcy5jYWxlbmRlclNjaGVtYT8uZW5kKVxyXG4gICAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XHJcbiAgICAgICAgc3RhcnQuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICBlbmQuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBASW5wdXQoKSBjYWxlbmRlclNjaGVtYTogRXZlbnRTY2hlbWEgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBfc2hvd0NhcmRWaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IHNob3dDYXJkVmlldyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc2hvd0NhcmRWaWV3ID0gdmFsdWU7XHJcbiAgfVxyXG4gIFxyXG4gIHByb3RlY3RlZCBfc2hvd0thbmJhblZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzZXQgc2hvd0thbmJhblZpZXcodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3Nob3dLYW5iYW5WaWV3ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBidXNpbmVzc0NsYXNzPzogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKSBwYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcclxuXHJcbiAgQElucHV0KCkgY2hlY2tlZEJ5RmllbGQ6IHN0cmluZyA9ICcnO1xyXG4gIHByaXZhdGUgX3NlbGVjdEFsbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBzZWxlY3RBbGwodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3NlbGVjdEFsbCA9IHZhbHVlO1xyXG5cclxuICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50ID0gbmV3IEV2ZW50KCdzZWxlY3RBbGxDaGFuZ2UnKTtcclxuICAgIGNvbnN0IGV2ZW50OiBUYWJsZVNlbGVjdEFsbENoYW5nZUV2ZW50ID0ge1xyXG4gICAgICBjaGVja2VkOiB2YWx1ZSxcclxuICAgICAgb3JpZ2luYWxFdmVudDogc3ludGhldGljRXZlbnQsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMub25TZWxlY3RBbGxDaGFuZ2UoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzZWxlY3RBbGwoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9zZWxlY3RBbGw7IH1cclxuXHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gT3V0cHV0c1xyXG4gIEBPdXRwdXQoKSBlZGl0Um93OiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBPdXRwdXQoKSBkZWxldGVSb3c6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIGxvYWQ6IEV2ZW50RW1pdHRlcjx7IHJlcXVlc3Q6IElQYWdlZFJlcXVlc3QsIGlzRm9yQ2FsZW5kYXI6IGJvb2xlYW4gfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgcmVxdWVzdDogSVBhZ2VkUmVxdWVzdCwgaXNGb3JDYWxlbmRhcjogYm9vbGVhbiB9PigpO1xyXG4gIEBPdXRwdXQoKSBidXR0b25Db2x1bW5DbGlja2VkOiBFdmVudEVtaXR0ZXI8QnV0dG9uQ2xpY2tSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxCdXR0b25DbGlja1Jlc3VsdD4oKTtcclxuICBAT3V0cHV0KCkgZmlsdGVyc0h0bWxUZW1wbGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRJdGVtc0NoYW5nZTogRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxhbnk+PigpO1xyXG4gIEBPdXRwdXQoKSBzZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxBcnJheTxTZWFyY2hGaWVsZD4+ID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxTZWFyY2hGaWVsZD4+KCk7XHJcbiAgQE91dHB1dCgpIGNhbGVuZGFyRXZlbnRDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc3RhdHVzRmlsdGVyQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqL1xyXG5cclxuICAvLyNlbmRyZWdpb25cclxuICAvLyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgLy8gICBpZihjaGFuZ2VzWydwYWdlJ10pe1xyXG4gIC8vICAgICB0aGlzLl9leHRyYWN0U3VtbWFyaWVzKCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG4gIHByb3RlY3RlZCBmaWx0ZXJJY29uID0gXCJwaSBwaS1maWx0ZXJcIjtcclxuICBwcm90ZWN0ZWQgZmlsdGVyVG9vbHRpcCA9IFwic2hvd19maWx0ZXJcIjtcclxuICBwcm90ZWN0ZWQgcmVxdWlyZWRMb2NhbGl6YXRpb25LZXkgPSBcInNoYXJlZF9zZWFyY2hfZmllbGRfcmVxdWlyZWRcIjtcclxuXHJcbiAgZmlsdGVyTW9kZUljb24gPSBcInBpIHBpLWZpbHRlclwiO1xyXG4gIGZpbHRlck1vZGVUb29sdGlwID0gXCJtZW51X21vZGVcIjtcclxuICBjaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZTogc3RyaW5nID0gXCJtZW51XCI7XHJcblxyXG4gIGl0ZW1zPzogYW55W107XHJcbiAgX3NlYXJjaE9uSW5pdDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHNlbGVjdGVkQ29sdW1uczogR3JpZENvbHVtbltdID0gW107XHJcbiAgaW1wb3J0YW50Q29sdW1ucyA9IFsnY29uc3VsdCcsICdlZGl0JywgJ2RlbGV0ZScsICd1cGxvYWQnLCAnZG93bmxvYWQnLCAnaW5mbycsICdub3RlcycsICdkdXBsaWNhdGUnXTtcclxuICBpc0ZpcnN0TG9hZE9mUGFnZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgdGl0bGVDYWNoZSA9IG5ldyBNYXA8YW55LCBzdHJpbmdbXT4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9odG1sVGVtcGxhdGVHZW5lcmF0b3JTZXJ2aWNlOiBIdG1sVGVtcGxhdGVHZW5lcmF0b3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogVHNpTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgbG9jYWxpemU6IExvY2FsaXplUGlwZSxcclxuICAgIHByaXZhdGUgbGF5b3V0SGVscGVyU2VydmljZTogTGF5b3V0SGVscGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgX2xheW91dFNlcnZpY2U6IExheW91dFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wcmltZW5nQ29uZmlnOiBQcmltZU5HQ29uZmlnLFxyXG4gICAgcHJpdmF0ZSBhcHBTZXR0aW5nc1NlcnZpY2U6IEFwcFNldHRpbmdzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZTogRXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IsXHJcbiAgICBwdWJsaWMgY29uZmlnPzogRHluYW1pY0RpYWxvZ0NvbmZpZyxcclxuICAgIHByaXZhdGUgX3JlZj86IER5bmFtaWNEaWFsb2dSZWYsXHJcbiAgKSB7XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGxldCBmaWx0ZXJNb2RlVG9vbHRpcEZyb21Mb2NhbFN0b3JhZ2UgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgJHt0aGlzLmZvcm1OYW1lfS1maWx0ZXJNb2RlYClcclxuICAgIGlmIChmaWx0ZXJNb2RlVG9vbHRpcEZyb21Mb2NhbFN0b3JhZ2UgIT0gdW5kZWZpbmVkICYmIGZpbHRlck1vZGVUb29sdGlwRnJvbUxvY2FsU3RvcmFnZSAhPSBudWxsXHJcbiAgICAgICYmIGZpbHRlck1vZGVUb29sdGlwRnJvbUxvY2FsU3RvcmFnZSAhPSBcIlwiKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyTW9kZVRvb2x0aXAgPSBmaWx0ZXJNb2RlVG9vbHRpcEZyb21Mb2NhbFN0b3JhZ2VcclxuICAgICAgdGhpcy5zaG93SGVhZGVyRmlsdGVycyA9IHRydWVcclxuICAgICAgdGhpcy5maWx0ZXJJY29uID0gXCJwaSBwaS1maWx0ZXItc2xhc2hcIjtcclxuICAgICAgdGhpcy5maWx0ZXJUb29sdGlwID0gXCJoaWRlX2ZpbHRlclwiO1xyXG4gICAgICBpZiAodGhpcy5maWx0ZXJNb2RlVG9vbHRpcCA9PT0gXCJtZW51X21vZGVcIikge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kZUljb24gPSBcInBpIHBpLWNoZWNrXCI7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RlVG9vbHRpcCA9IFwicm93X21vZGVcIjtcclxuICAgICAgICB0aGlzLmNoYW5nZUhlYWRlckZpbHRlcnNNb2RlID0gXCJtZW51XCJcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmNoYW5nZUhlYWRlckZpbHRlcnNNb2RlID0gXCJyb3dcIjtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVJY29uID0gXCJwaSBwaS1lbGxpcHNpcy12XCI7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RlVG9vbHRpcCA9IFwibWVudV9tb2RlXCI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3dIZWFkZXJGaWx0ZXJzID0gZmFsc2VcclxuICAgICAgdGhpcy5maWx0ZXJJY29uID0gXCJwaSBwaS1maWx0ZXJcIjtcclxuICAgICAgdGhpcy5maWx0ZXJUb29sdGlwID0gXCJzaG93X2ZpbHRlclwiO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL2NvbW1lbnRlZCBieSBATWVkQWxpIC0gQnVnIGZyb20gcHJpbWVuZyBjb21wb25lbnQuXHJcbiAgICAvLyBpZih0aGlzLnRhYmxlSGVhZGVyQ2hlY2tib3gpe1xyXG4gICAgLy8gICB0aGlzLnRhYmxlSGVhZGVyQ2hlY2tib3guY2hlY2tlZCA9IHRoaXMuc2VsZWN0aW9uPy5sZW5ndGggPT0gdGhpcy5wYWdlLnBhZ2VTaXplXHJcbiAgICAvLyAgIHRoaXMudGFibGVIZWFkZXJDaGVja2JveC5jZC5kZXRlY3RDaGFuZ2VzKClcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gdGhpcy5pc1RhYmxlTG9hZGluZyA9IHRydWVcclxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgLy8gICB0aGlzLnNlYXJjaCgpO1xyXG4gICAgLy8gICB0aGlzLmlzVGFibGVMb2FkaW5nID0gZmFsc2VcclxuICAgIC8vIH0sIDIwMDApO1xyXG5cclxuXHJcblxyXG4gICAgbGV0IGxhbmd1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHJ0bE1vZGVLZXlzLnJ0bE1vZGVFbmFibGVkKTtcclxuICAgIGlmIChsYW5ndWUgJiYgSlNPTi5wYXJzZShsYW5ndWUpKSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IHRydWVcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmlzQXIgPSBmYWxzZVxyXG4gICAgfVxyXG4gICAgdGhpcy5jb2x1bW5zLm1hcChjb2x1bW4gPT4gY29sdW1uLnRyYW5zbGF0ZWRIZWFkZXIgPSB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybShjb2x1bW4uaGVhZGVyISEpKVxyXG5cclxuICAgIHRoaXMuX3RlbXBDb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xyXG5cclxuICAgIHRoaXMudGVtcFNlYXJjaEZpZWxkcyA9IHRoaXMuX3NlYXJjaEZpZWxkcyA/PyBbXTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcmVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+XHJcbiAgICAgICF0aGlzLmltcG9ydGFudENvbHVtbnMuaW5jbHVkZXMoY29sdW1uLmZpZWxkKSk7XHJcbiAgICAvL3RoaXMuc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zXHJcblxyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1ucyB8fCB0aGlzLnNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPT0gMCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuY29sdW1uc1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuICAgICAgY29sdW1uLm9yZGVyID0gaW5kZXg7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmlzUnRsTW9kZUVuYWJsZWQoKVxyXG4gICAgdGhpcy5fcnRsTW9kZVN1YnNjcmliZSgpXHJcbiAgICB0aGlzLnByb2Nlc3NTdGlja3lDb2x1bW5zKClcclxuICB9XHJcblxyXG4gIC8vICNyZWdpb24gZ3JpZCBzdGF0ZSBcclxuICBnZXRTdGF0ZSgpIHtcclxuICAgIGxldCBzdGF0ZTogVGFibGVTdGF0ZSA9IHt9O1xyXG5cclxuICAgIGlmICghdGhpcy5kdCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kdC5yZXNpemFibGVDb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuZHQuc2F2ZUNvbHVtbldpZHRocyhzdGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kdC5zYXZlQ29sdW1uT3JkZXIoc3RhdGUpO1xyXG5cclxuICAgIHJldHVybiBzdGF0ZVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc3RvcmVTdGF0ZShjb25maWd1cmF0aW9uOiBzdHJpbmcpIHtcclxuICAgIGxldCBzdGF0ZTogVGFibGVTdGF0ZSA9IEpTT04ucGFyc2UoY29uZmlndXJhdGlvbilcclxuICAgIGlmICh0aGlzLmR0KSB7XHJcblxyXG4gICAgICB0aGlzLmR0LmNvbHVtbldpZHRoc1N0YXRlID0gc3RhdGUuY29sdW1uV2lkdGhzO1xyXG4gICAgICB0aGlzLmR0LnRhYmxlV2lkdGhTdGF0ZSA9IHN0YXRlLnRhYmxlV2lkdGg7XHJcblxyXG4gICAgICBsZXQgY29sdW1uT3JkZXIgPSBzdGF0ZS5jb2x1bW5PcmRlcjtcclxuXHJcbiAgICAgIGlmIChjb2x1bW5PcmRlcikge1xyXG4gICAgICAgIGxldCByZW9yZGVyZWRDb2x1bW5zID0gdGhpcy5nZXRSZW9yZGVyZWRDb2x1bW5zKGNvbHVtbk9yZGVyKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHJlb3JkZXJlZENvbHVtbnM7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gcmVvcmRlcmVkQ29sdW1ucztcclxuICAgICAgICB0aGlzLnNvcnRDb2x1bW5zKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIG9uU2VsZWN0ZWRDb2x1bW5zQ2hhbmdlKCkge1xyXG4gICAgdGhpcy5zb3J0Q29sdW1ucygpXHJcbiAgfVxyXG5cclxuICBzb3J0Q29sdW1ucygpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgY29uc3QgaW5kZXhBID0gdGhpcy5pbXBvcnRhbnRDb2x1bW5zLmluZGV4T2YoYS5maWVsZCk7XHJcbiAgICAgIGNvbnN0IGluZGV4QiA9IHRoaXMuaW1wb3J0YW50Q29sdW1ucy5pbmRleE9mKGIuZmllbGQpO1xyXG5cclxuICAgICAgaWYgKGluZGV4QSA9PT0gLTEgJiYgaW5kZXhCID09PSAtMSkge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpbmRleEEgPT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGluZGV4QiA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGluZGV4QSAtIGluZGV4QjtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gW1xyXG4gICAgICAuLi50aGlzLnNlbGVjdGVkQ29sdW1uc1xyXG4gICAgICAgIC5maWx0ZXIoY29sID0+IGNvbC5vcmRlciAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyISAtIGIub3JkZXIhKSxcclxuICAgICAgLi4udGhpcy5zZWxlY3RlZENvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wub3JkZXIgPT09IHVuZGVmaW5lZCksXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVvcmRlcmVkQ29sdW1ucyhjb2x1bW5PcmRlcjogc3RyaW5nW10pOiBhbnlbXSB7XHJcbiAgICBsZXQgcmVvcmRlcmVkQ29sdW1uczogYW55W10gPSBbXTtcclxuXHJcbiAgICBjb2x1bW5PcmRlci5tYXAoKGtleSkgPT4ge1xyXG4gICAgICBsZXQgY29sID0gdGhpcy5maW5kQ29sdW1uQnlLZXkoa2V5KTtcclxuICAgICAgaWYgKGNvbCkge1xyXG4gICAgICAgIHJlb3JkZXJlZENvbHVtbnMucHVzaChjb2wpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVvcmRlcmVkQ29sdW1ucztcclxuICB9XHJcblxyXG4gIGZpbmRDb2x1bW5CeUtleShrZXk6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuX3RlbXBDb2x1bW5zKSB7XHJcbiAgICAgIGZvciAobGV0IGNvbCBvZiB0aGlzLl90ZW1wQ29sdW1ucykge1xyXG4gICAgICAgIGlmIChjb2wuaGVhZGVyID09PSBrZXkgfHwgY29sLmZpZWxkID09PSBrZXkpIHJldHVybiBjb2w7XHJcbiAgICAgICAgZWxzZSBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcblxyXG4gIHJlc2V0U2VsZWN0ZWRDb2x1bW5zKGNvbmZpZ3VyYXRpb246IHN0cmluZykge1xyXG4gICAgbGV0IHN0YXRlOiBUYWJsZVN0YXRlID0gSlNPTi5wYXJzZShjb25maWd1cmF0aW9uKVxyXG4gICAgaWYgKHRoaXMuZHQpIHtcclxuXHJcbiAgICAgIHRoaXMuZHQuY29sdW1uV2lkdGhzU3RhdGUgPSBzdGF0ZS5jb2x1bW5XaWR0aHM7XHJcbiAgICAgIHRoaXMuZHQudGFibGVXaWR0aFN0YXRlID0gc3RhdGUudGFibGVXaWR0aDtcclxuXHJcbiAgICAgIGxldCBjb2x1bW5PcmRlciA9IHN0YXRlLmNvbHVtbk9yZGVyO1xyXG5cclxuICAgICAgaWYgKGNvbHVtbk9yZGVyKSB7XHJcbiAgICAgICAgbGV0IHJlb3JkZXJlZENvbHVtbnMgPSB0aGlzLmdldFJlb3JkZXJlZENvbHVtbnMoY29sdW1uT3JkZXIpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gcmVvcmRlcmVkQ29sdW1ucztcclxuICAgICAgICB0aGlzLl9jb2x1bW5zID0gdGhpcy5fdGVtcENvbHVtbnM7XHJcbiAgICAgICAgdGhpcy5zb3J0Q29sdW1ucygpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vICNlbmQgcmVnaW9uXHJcblxyXG4gIG5vdEluU3BlY2lmaWVkQ29sdW1uKGNvbHVtbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLmltcG9ydGFudENvbHVtbnMuaW5jbHVkZXMoY29sdW1uTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzU3RpY2t5Q29sdW1ucygpIHtcclxuICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaCgoY29sOiBHcmlkQ29sdW1uKSA9PiB7XHJcbiAgICAgIGlmIChjb2wuaXNGcm96ZW4pIHtcclxuICAgICAgICBjb2wubmdTdHlsZSA9IHRoaXMuZ2V0VGhlU3R5bGUoY29sKVxyXG4gICAgICAgIGNvbC5oZWFkZXJDb2x1bW5TdHlsZSA9IHsgLi4uY29sLm5nU3R5bGUsIHpJbmRleDogMTAwMCB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXRDaGVja2JveFN0eWxlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNSdGxNb2RlKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgcmlnaHQ6IGAwcHhgLFxyXG4gICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZScsXHJcbiAgICAgICAgXCJ3aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgIFwibWluLXdpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxlZnQ6IGAwcHhgLFxyXG4gICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZScsXHJcbiAgICAgICAgXCJ3aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgIFwibWluLXdpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0VGhlU3R5bGUoY29sdW1uOiBHcmlkQ29sdW1uKTogYW55IHtcclxuXHJcbiAgICBpZiAoIWNvbHVtbi5pc0Zyb3plbikge1xyXG4gICAgICByZXR1cm4ge31cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sdW1uLmlzRnJvemVuID09IHRydWUpIHtcclxuICAgICAgbGV0IGVsZW1lbnRQb3NpdGlvbiA9IDA7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gdGhpcy5tdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlKSB7XHJcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uID0gMzAgKyBlbGVtZW50UG9zaXRpb24gKyAoY29sdW1uLm9yZGVyID8/IDApICogNjA7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgZWxlbWVudFBvc2l0aW9uID0gZWxlbWVudFBvc2l0aW9uICsgKChjb2x1bW4ub3JkZXIgPz8gMCkgKiAxLjg1KSAqIDIwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmlzUnRsTW9kZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICByaWdodDogYCR7ZWxlbWVudFBvc2l0aW9ufXB4YCxcclxuICAgICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcclxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3doaXRlJyxcclxuICAgICAgICAgIFwid2lkdGhcIjogJzIuNXJlbSAhaW1wb3J0YW50JyxcclxuICAgICAgICAgIFwibWluLXdpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbGVmdDogYCR7ZWxlbWVudFBvc2l0aW9ufXB4YCxcclxuICAgICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcclxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3doaXRlJyxcclxuICAgICAgICAgIFwid2lkdGhcIjogJzIuNXJlbSAhaW1wb3J0YW50JyxcclxuICAgICAgICAgIFwibWluLXdpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgaXNSdGxNb2RlRW5hYmxlZCgpIHtcclxuICAgIGlmICh0aGlzLl9sYXlvdXRTZXJ2aWNlLmlzUnRsTW9kZUVuYWJsZWQoKSkge1xyXG4gICAgICB0aGlzLmlzUnRsTW9kZSA9IHRydWVcclxuICAgICAgdGhpcy51cGRhdGVQcmltZU5HVGFibGVGaWx0ZXJzKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlUHJpbWVOR1RhYmxlRmlsdGVycygpIHtcclxuICAgIHRoaXMuX3ByaW1lbmdDb25maWcuc2V0VHJhbnNsYXRpb24ocHJpbWVuZ0xvY2FsZUFyKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcnRsTW9kZVN1YnNjcmliZSgpIHtcclxuICAgIHRoaXMuX2xheW91dFNlcnZpY2UuZW5hYmxlUnRsTW9kZVN1YmplY3QkLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICB0aGlzLmlzUnRsTW9kZSA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBzZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZXMoc2VhcmNoRmllbGRWYWx1ZXM6IEFycmF5PFNlYXJjaEZpZWxkPikge1xyXG4gICAgdGhpcy5zZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZWQuZW1pdChzZWFyY2hGaWVsZFZhbHVlcylcclxuICB9XHJcblxyXG4gIGlzTGFzdFBhZ2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlID8gdGhpcy5wYWdlLnBhZ2VOdW1iZXIgPT09ICh0aGlzLnBhZ2UudG90YWxDb3VudCAtIHRoaXMucGFnZS5wYWdlU2l6ZSkgOiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgaXNGaXJzdFBhZ2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlID8gdGhpcy5wYWdlLnBhZ2VOdW1iZXIgPT09IDAgOiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZWRpdChpdGVtOiBhbnkpIHtcclxuICAgIHRoaXMuZWRpdFJvdy5lbWl0KGl0ZW1bdGhpcy5rZXldKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZShpdGVtOiBhbnkpIHtcclxuICAgIHRoaXMuZGVsZXRlUm93LmVtaXQoaXRlbVt0aGlzLmtleV0pO1xyXG4gIH1cclxuXHJcbiAgbGF6eUxvYWQoZXZlbnQ6IFRhYmxlTGF6eUxvYWRFdmVudCkge1xyXG4gICAgaWYgKHRoaXMucGFnZWRSZXF1ZXN0ID09IG51bGwgJiYgdGhpcy5wYWdlZFJlcXVlc3QgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMucGFnZWRSZXF1ZXN0ID0ge307XHJcbiAgICB9XHJcbiAgICB0aGlzLnBhZ2VkUmVxdWVzdC5za2lwQ291bnQgPSBldmVudC5maXJzdCA9PSAxID8gMCA6IGV2ZW50LmZpcnN0O1xyXG4gICAgdGhpcy5wYWdlZFJlcXVlc3QubWF4UmVzdWx0Q291bnQgPSBldmVudC5yb3dzO1xyXG4gICAgaWYgKHRoaXMuZm9ybU5hbWUgJiYgdGhpcy5pc0ZpcnN0TG9hZE9mUGFnZSkge1xyXG4gICAgICB0aGlzLmlzRmlyc3RMb2FkT2ZQYWdlID0gZmFsc2VcclxuICAgICAgY29uc3Qgc3RvcmVkVmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmZvcm1OYW1lKTtcclxuICAgICAgaWYgKHN0b3JlZFZhbHVlKSB7XHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSBKU09OLnBhcnNlKHN0b3JlZFZhbHVlKTtcclxuICAgICAgICBjb25zdCBjb2x1bW5PcmRlcjogc3RyaW5nW10gPSBzZXNzaW9uRGF0YS5jb2x1bW5PcmRlcjtcclxuICAgICAgICBjb25zdCBjb2x1bW5XaWR0aHM6IHN0cmluZ1tdID0gc2Vzc2lvbkRhdGEuY29sdW1uV2lkdGhzLnNwbGl0KCcsJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRTZWxlY3RlZENvbHVtbnM6IEdyaWRDb2x1bW5bXSA9IFtdO1xyXG4gICAgICAgIGNvbHVtbk9yZGVyLmZvckVhY2goKGZpZWxkLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY29sdW1uV2lkdGggPSBjb2x1bW5XaWR0aHNbaW5kZXhdO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ29sdW1uSW5kZXggPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5maW5kSW5kZXgoY29sdW1uID0+IGNvbHVtbi5maWVsZCA9PT0gZmllbGQpO1xyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nQ29sdW1uSW5kZXggIT09IC0xKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uc1tleGlzdGluZ0NvbHVtbkluZGV4XS53aWR0aCA9IGNvbHVtbldpZHRoO1xyXG4gICAgICAgICAgICB1cGRhdGVkU2VsZWN0ZWRDb2x1bW5zLnB1c2godGhpcy5zZWxlY3RlZENvbHVtbnNbZXhpc3RpbmdDb2x1bW5JbmRleF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSB1cGRhdGVkU2VsZWN0ZWRDb2x1bW5zO1xyXG5cclxuXHJcblxyXG5cclxuICAgICAgICBpZiAoKHNlc3Npb25EYXRhLm11bHRpU29ydE1ldGEgJiYgc2Vzc2lvbkRhdGEubXVsdGlTb3J0TWV0YS5sZW5ndGggPiAwKSB8fCAoc2Vzc2lvbkRhdGEuZmlsdGVycykpIHtcclxuICAgICAgICAgIGlmIChzZXNzaW9uRGF0YS5tdWx0aVNvcnRNZXRhICYmIHNlc3Npb25EYXRhLm11bHRpU29ydE1ldGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBzZXNzaW9uRGF0YS5tdWx0aVNvcnRNZXRhLmZvckVhY2goKG1ldGE6IHsgZmllbGQ6IGFueTsgb3JkZXI6IGFueTsgfSkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBzb3J0TWV0YTogU29ydE1ldGEgPSB7XHJcbiAgICAgICAgICAgICAgICBmaWVsZDogbWV0YS5maWVsZCxcclxuICAgICAgICAgICAgICAgIG9yZGVyOiBtZXRhLm9yZGVyXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGV2ZW50LnNvcnRGaWVsZCA9IG1ldGEuZmllbGQ7XHJcbiAgICAgICAgICAgICAgZXZlbnQuc29ydE9yZGVyID0gbWV0YS5vcmRlcjtcclxuICAgICAgICAgICAgICBldmVudC5tdWx0aVNvcnRNZXRhPy5wdXNoKHNvcnRNZXRhKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoc2Vzc2lvbkRhdGEuZmlsdGVycykge1xyXG4gICAgICAgICAgICBsZXQgZmlsdGVyczogeyBbczogc3RyaW5nXTogRmlsdGVyTWV0YWRhdGEgfSA9IHt9O1xyXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhzZXNzaW9uRGF0YS5maWx0ZXJzKS5mb3JFYWNoKChbZmllbGROYW1lLCBmaWx0ZXJNZXRhZGF0YV0pID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJNZXRhZGF0YVZhbHVlID0gZmlsdGVyTWV0YWRhdGEgYXMgW0ZpbHRlck1ldGFkYXRhXTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGZpbHRlck1ldGFkYXRhVmFsdWVbMF0gIT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGZpbHRlcnNbZmllbGROYW1lXSA9IGZpbHRlck1ldGFkYXRhVmFsdWVbMF07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICAvLyBBc3NpZ24gdGhlIGZpbHRlcnMgdG8gdGhlIGV2ZW50XHJcbiAgICAgICAgICAgIGV2ZW50LmZpbHRlcnMgPSBmaWx0ZXJzO1xyXG4gICAgICAgICAgICAvLyBldmVudC5maWx0ZXJzID0gT2JqZWN0LmVudHJpZXMoc2Vzc2lvbkRhdGEuZmlsdGVycykucmVkdWNlKChmaWx0ZXJzOiB7IFtzOiBzdHJpbmddOiBGaWx0ZXJNZXRhZGF0YSB9LCBbZmllbGROYW1lLCBmaWx0ZXJNZXRhZGF0YSBdICkgPT4ge1xyXG4gICAgICAgICAgICAvLyAgIHZhciBmaWx0ZXJNZXRhZGF0YVZhbHVlID0gZmlsdGVyTWV0YWRhdGEgYXMgRmlsdGVyTWV0YWRhdGE7XHJcbiAgICAgICAgICAgIC8vICAgaWYgKGZpbHRlck1ldGFkYXRhVmFsdWUudmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vICAgICBmaWx0ZXJzW2ZpZWxkTmFtZV0gPSBmaWx0ZXJNZXRhZGF0YSBhcyBGaWx0ZXJNZXRhZGF0YTtcclxuICAgICAgICAgICAgLy8gICB9XHJcblxyXG4gICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKCdhbGwgZmlsdGVycycsIGZpbHRlcnMpXHJcbiAgICAgICAgICAgIC8vICAgcmV0dXJuIGZpbHRlcnM7XHJcbiAgICAgICAgICAgIC8vIH0sIHt9KTtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZWFyY2hGaWVsZHMgPVtdO1xyXG4gICAgICAgICAgICAvLyBjb25zdCBmaWx0ZXJzQXJyYXk6IFtzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB8IG51bGw7IG1hdGNoTW9kZTogc3RyaW5nLG9wZXJhdG9yIDogc3RyaW5nIH1bXV1bXSA9IE9iamVjdC5lbnRyaWVzKGRhdGEuZmlsdGVycyk7XHJcblxyXG4gICAgICAgICAgICAvLyBmaWx0ZXJzQXJyYXkuZm9yRWFjaCgoW2ZpZWxkTmFtZSwgZmllbGRWYWx1ZV0pID0+IHtcclxuXHJcbiAgICAgICAgICAgIC8vICAgZmllbGRWYWx1ZS5mb3JFYWNoKGZpbHRlciA9PlxyXG4gICAgICAgICAgICAvLyAgICAge1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIGlmKGZpbHRlci52YWx1ZSl7XHJcbiAgICAgICAgICAgIC8vICAgICAgIGxldCBzZWFyY2hGaWVsZCA6IFNlYXJjaEZpZWxkID17XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgZmllbGQgOmZpZWxkTmFtZSxcclxuICAgICAgICAgICAgLy8gICAgICAgICBsYWJlbFZhbHVlIDogZmlsdGVyLnZhbHVlLFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHZhbHVlOmZpbHRlci52YWx1ZSxcclxuICAgICAgICAgICAgLy8gICAgICAgICB0eXBlIDogdGhpcy5pbmZlcklucHV0VHlwZShmaWVsZE5hbWUpLFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9wZXJhdG9yIDogdGhpcy5nZXRPcGVyYXRvck51bWJlcihmaWx0ZXIubWF0Y2hNb2RlKVxyXG4gICAgICAgICAgICAvLyAgICAgICB9O1xyXG4gICAgICAgICAgICAvLyAgICAgICBjb25zb2xlLmxvZygnc2VhcmNoRmllbGQnLHNlYXJjaEZpZWxkKTtcclxuICAgICAgICAgICAgLy8gICAgICAgaWYgKHRoaXMuc2VhcmNoRmllbGRzKSB7XHJcblxyXG4gICAgICAgICAgICAvLyAgICAgICB0aGlzLnNlYXJjaEZpZWxkcy5wdXNoKHNlYXJjaEZpZWxkKTtcclxuICAgICAgICAgICAgLy8gICAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJObyBzZXNzaW9uIGRhdGEgZm91bmQgaW4gbG9jYWxTdG9yYWdlXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9ncmlkSGVhZGVyRmlsdGVycyA9IHRoaXMuX2V4dHJhY3RGaWx0ZXJzKGV2ZW50LmZpbHRlcnMpO1xyXG4gICAgdGhpcy5fZXh0cmFjdFNvcnRDcml0ZXJpYXMoZXZlbnQpO1xyXG4gICAgdGhpcy5zZWFyY2goKTtcclxuICB9XHJcblxyXG4gIGZpZWxkcygpOiBzdHJpbmdbXSB7XHJcbiAgICBsZXQgZmllbGRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuY29sdW1ucyAhPSBudWxsICYmIHRoaXMuY29sdW1ucyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbDogR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICAgIGZpZWxkcy5wdXNoKGNvbC5maWVsZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpZWxkcztcclxuICB9XHJcblxyXG5cclxuICBidXR0b25DbGlja2VkKGl0ZW06IGFueSwgZmllbGQ6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgdGhpcy5idXR0b25Db2x1bW5DbGlja2VkLmVtaXQoeyBmaWVsZDogZmllbGQsIGtleTogaXRlbVt0aGlzLmtleV0sIHNlbGVjdEtleU9ubHk6IHRoaXMuc2VsZWN0S2V5T25seSB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmJ1dHRvbkNvbHVtbkNsaWNrZWQuZW1pdCh7IGZpZWxkOiBmaWVsZCwga2V5OiBpdGVtLCBzZWxlY3RLZXlPbmx5OiB0aGlzLnNlbGVjdEtleU9ubHkgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBrZXl3b3JkVmFsdWVDaGFuZ2VkKGtleXdvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5rZXl3b3JkID0ga2V5d29yZFxyXG4gIH1cclxuXHJcbiAgaXNBbGxSZXF1aXJlZFNlYXJjaEZpZWxkc0hhdmVWYWx1ZXMoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaW52YWxpZFNlYXJjaEZpZWxkcyA9IHRoaXMuc2VhcmNoRmllbGRzXHJcbiAgICAgID8uZmlsdGVyKHggPT4geC5yZXF1aXJlZCA9PSB0cnVlICYmICh4LnZhbHVlID09IHVuZGVmaW5lZCB8fCB4LnZhbHVlID09ICcnIHx8IHgudmFsdWUgPT0gbnVsbCkpXHJcblxyXG4gICAgaWYgKGludmFsaWRTZWFyY2hGaWVsZHMgPT0gdW5kZWZpbmVkIHx8IGludmFsaWRTZWFyY2hGaWVsZHMubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWVzc2FnZXM6IHN0cmluZ1tdID0gW11cclxuICAgIGludmFsaWRTZWFyY2hGaWVsZHMuZm9yRWFjaChzZWFyY2hGaWVsZCA9PiB7XHJcbiAgICAgIG1lc3NhZ2VzLnB1c2goYCR7dGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oc2VhcmNoRmllbGQubGFiZWxWYWx1ZSl9ICR7dGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0odGhpcy5yZXF1aXJlZExvY2FsaXphdGlvbktleSl9YClcclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5fZXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLnNob3dFcnJvck1lc3NhZ2VzRnJvbUFycmF5U3RyaW5nKG1lc3NhZ2VzKTtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgaW5pdFNlYXJjaE9uSW5pdCgpIHtcclxuICAgIGxldCBpbnZhbGlkU2VhcmNoRmllbGRzID0gdGhpcy5zZWFyY2hGaWVsZHNcclxuICAgICAgPy5maWx0ZXIoeCA9PiB4LnJlcXVpcmVkID09IHRydWUgJiYgKHgudmFsdWUgPT0gdW5kZWZpbmVkIHx8IHgudmFsdWUgPT0gJycgfHwgeC52YWx1ZSA9PSBudWxsKSkgPz8gW11cclxuXHJcbiAgICBpZiAodGhpcy5fc2VhcmNoT25Jbml0KSB7XHJcbiAgICAgIHRoaXMuX3NlYXJjaE9uSW5pdCA9IGludmFsaWRTZWFyY2hGaWVsZHMubGVuZ3RoID09IDBcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNjb21ib0JveExhYmVsQ2hhbmdlZChldmVudD86IEFycmF5PFNlYXJjaEZpZWxkPikge1xyXG4gICAgdGhpcy5fZXh0cmFjdFNlYXJjaEJveEZpbHRlcnMoKTtcclxuICAgIHRoaXMuX2dlbmVyYXRlRmlsdGVyc0h0bWxUZW1wbGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoKGV2dDogYW55ID0gbnVsbCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coXCJzZWFyY2g+Pj5cIiwgdGhpcy5zZWFyY2hGaWVsZHMpXHJcbiAgICAvL3NldCBnbG9iYWwgZmlsdGVyIHZhbHVlXHJcblxyXG4gICAgdGhpcy5fZXh0cmFjdE9ubHlWaXNpYmxlU2VhcmNoRmllbGRzKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucGFnZWRSZXF1ZXN0ICYmIHRoaXMuaXNBbGxSZXF1aXJlZFNlYXJjaEZpZWxkc0hhdmVWYWx1ZXMoKSkge1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdC5zdW1tYXJpZXMgPSB0aGlzLl9leHRyYWN0SGF2ZVN1bW1hcnlQcm9wZXJ0aWVzKCk7XHJcbiAgICAgIHRoaXMucGFnZWRSZXF1ZXN0LnNvcnRpbmcgPSB0aGlzLl9zb3J0O1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdC5rZXl3b3JkID0gdGhpcy5rZXl3b3JkO1xyXG5cclxuICAgICAgLy9hZGQgc2VhcmNoIGJveCBmaWx0ZXJzXHJcbiAgICAgIHRoaXMuX2V4dHJhY3RTZWFyY2hCb3hGaWx0ZXJzKCk7XHJcblxyXG4gICAgICAvL2dlbmVyYXRlIGZpbHRlcnMgaHRtbCB0ZW1wbGF0ZVxyXG4gICAgICB0aGlzLl9nZW5lcmF0ZUZpbHRlcnNIdG1sVGVtcGxhdGUoKTtcclxuICAgICAgLy9jbG9uZVxyXG5cclxuICAgICAgbGV0IG5ld1JlcXVlc3Q6IElQYWdlZFJlcXVlc3QgPSB0aGlzLl9jbG9uZVBhZ2VkUmVxdWVzdCh0aGlzLnBhZ2VkUmVxdWVzdCk7XHJcblxyXG4gICAgICAvL2NvbmNhdCBmaWx0ZXJzXHJcbiAgICAgIG5ld1JlcXVlc3QuZmlsdGVycyA9IFsuLi50aGlzLl9ncmlkSGVhZGVyRmlsdGVycywgLi4udGhpcy5fc2VhcmNoQm94RmlsdGVyc107XHJcblxyXG4gICAgICAvL2V4Y2x1ZGUgdXNlbGVzcyBmaWx0ZXJzXHJcbiAgICAgIG5ld1JlcXVlc3QgPSB0aGlzLl9leGNsdWRlVXNlbGVzc0ZpbHRlcnMobmV3UmVxdWVzdCk7XHJcblxyXG4gICAgICAvLyB0ZXN0IGlmIGZpbHRlcnMgdmFsdWUgaGFzIGNoYW5nZWRcclxuICAgICAgaWYgKCh0aGlzLmxhdGVzdEZpbHRlcnMgPyBKU09OLnN0cmluZ2lmeSh0aGlzLmxhdGVzdEZpbHRlcnMpIDogbnVsbClcclxuICAgICAgICAhPT0gKG5ld1JlcXVlc3QuZmlsdGVycyA/IEpTT04uc3RyaW5naWZ5KG5ld1JlcXVlc3QuZmlsdGVycykgOiBudWxsKSkge1xyXG4gICAgICAgIG5ld1JlcXVlc3Quc2tpcENvdW50ID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHQpIHtcclxuICAgICAgICAgIHRoaXMuZHQuZmlyc3QgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2F2ZSBsYXRlc3QgZmlsdGVyc1xyXG4gICAgICB0aGlzLmxhdGVzdEZpbHRlcnMgPSBuZXdSZXF1ZXN0LmZpbHRlcnM7XHJcblxyXG4gICAgICB0aGlzLmxvYWQuZW1pdCh7IHJlcXVlc3Q6IG5ld1JlcXVlc3QsIGlzRm9yQ2FsZW5kYXI6IHRoaXMuX3Nob3dDYWxlbmRlclZpZXcgfSk7XHJcblxyXG4gICAgICB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGVDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Rmlyc3RFbGVtZW50SW5kZXgoKTogbnVtYmVyIHtcclxuICAgIGlmICghdGhpcy5kdCkgcmV0dXJuIDA7XHJcblxyXG4gICAgaWYgKHRoaXMucGFnZS5pdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZHQuZmlyc3QgPT09IDAgPyAxIDogKHRoaXMuZHQ/LmZpcnN0ID8/IDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3VtbWFyeShmaWVsZDogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIGxldCBzdW1tYXJ5Um93ID0gdGhpcy5wYWdlLnN1bW1hcmllc1xyXG4gICAgICAuZmluZChzID0+IHMucHJvcHJldHkudG9VcHBlckNhc2UoKSA9PSBmaWVsZC50b1VwcGVyQ2FzZSgpKTtcclxuICAgIGlmIChzdW1tYXJ5Um93KSB7XHJcbiAgICAgIHJldHVybiBzdW1tYXJ5Um93LnN1bW1hcnk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpIHtcclxuICAgIGxldCBzZWxlY3Rpb246IGFueVtdID0gW107XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgICAgIGxldCBrZXlzOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb3JFYWNoKCh2OiBhbnkpID0+IHsga2V5cy5wdXNoKHZbdGhpcy5rZXldKSB9KTtcclxuICAgICAgICAgIHNlbGVjdGlvbiA9IGtleXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gR3JpZFNlbGVjdGlvbk1vZGUuU2luZ2xlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbiA/IFt0aGlzLnNlbGVjdGlvblt0aGlzLmtleV1dIDogW107XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24gPyBbdGhpcy5zZWxlY3Rpb25dIDogW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgIT0gR3JpZFNlbGVjdGlvbk1vZGUuTm9uZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdChzZWxlY3Rpb24pXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnPy5kYXRhPy5pc0FkdmFuY2VkU2VhcmNoICYmIHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KHNlbGVjdGlvbilcclxuICAgICAgdGhpcy5fcmVmPy5jbG9zZShzZWxlY3Rpb25bMF0pXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RBbGxDaGFuZ2UoZXZlbnQ6IFRhYmxlU2VsZWN0QWxsQ2hhbmdlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gR3JpZFNlbGVjdGlvbk1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0QWxsID0gZXZlbnQuY2hlY2tlZDtcclxuICAgICAgaWYgKHRoaXMuX3NlbGVjdEFsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWRCeUZpZWxkICYmIHRoaXMuY2hlY2tlZEJ5RmllbGQudHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSB0aGlzLnBhZ2UuaXRlbXMuZmlsdGVyKFxyXG4gICAgICAgICAgICBpdGVtID0+IGl0ZW1bdGhpcy5jaGVja2VkQnlGaWVsZF0gPT09IHRydWVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5wYWdlLml0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMub25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vIG9uU2VsZWN0ZWRDb2x1bW5zQ2hhbmdlKCkge1xyXG4gIC8vICAgaWYgKHRoaXMuZm9ybU5hbWUpIHtcclxuICAvLyAgICAgY29uc3Qgc3RvcmVkVmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmZvcm1OYW1lKTtcclxuXHJcbiAgLy8gICAgIGlmIChzdG9yZWRWYWx1ZSkge1xyXG4gIC8vICAgICAgIGNvbnN0IHNlc3Npb25EYXRhID0gSlNPTi5wYXJzZShzdG9yZWRWYWx1ZSk7XHJcbiAgLy8gICAgICAgbGV0IGNvbHVtbk9yZGVyOiBzdHJpbmdbXSA9IFtdO1xyXG4gIC8vICAgICAgIGxldCBjb2x1bW5XaWR0aHM6IHN0cmluZ1tdID0gW107XHJcbiAgLy8gICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAoaXRlbS5maWVsZCA9PT0gJ3VwbG9hZCcpIHtcclxuICAvLyAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1ucy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnB1c2goaXRlbSk7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGVsc2UgaWYgKGl0ZW0uZmllbGQgPT09ICdkb3dubG9hZCcpIHtcclxuICAvLyAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1ucy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnB1c2goaXRlbSk7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGVsc2UgaWYgKGl0ZW0uZmllbGQgPT09ICdjb25zdWx0Jykge1xyXG4gIC8vICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMucHVzaChpdGVtKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgZWxzZSBpZiAoaXRlbS5maWVsZCA9PT0gJ2RlbGV0ZScpIHtcclxuICAvLyAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1ucy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnB1c2goaXRlbSk7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGVsc2UgaWYgKGl0ZW0uZmllbGQgPT09ICdlZGl0Jykge1xyXG4gIC8vICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMucHVzaChpdGVtKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnNvcnQoKGEsIGIpID0+IHtcclxuICAvLyAgICAgICAgIGlmIChhLm9yZGVyICE9PSB1bmRlZmluZWQgJiYgYi5vcmRlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgLy8gICAgICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIHJldHVybiAwO1xyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goc2VsZWN0ZWRDb2x1bW4gPT4ge1xyXG4gIC8vICAgICAgICAgY29sdW1uT3JkZXIucHVzaChzZWxlY3RlZENvbHVtbi5maWVsZCk7XHJcbiAgLy8gICAgICAgICBjb25zdCBzZWxlY3RlZFdpZHRoID0gc2VsZWN0ZWRDb2x1bW4ubWluV2lkdGg7XHJcbiAgLy8gICAgICAgICBpZiAoc2VsZWN0ZWRXaWR0aCkge1xyXG4gIC8vICAgICAgICAgICBjb2x1bW5XaWR0aHMucHVzaChzZWxlY3RlZFdpZHRoLnRvU3RyaW5nKCkpO1xyXG4gIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgICAgLy9jb2x1bW5XaWR0aHMucHVzaCgnOTAnKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KTtcclxuXHJcblxyXG5cclxuICAvLyAgICAgICBzZXNzaW9uRGF0YS5jb2x1bW5PcmRlciA9IGNvbHVtbk9yZGVyO1xyXG4gIC8vICAgICAgIHNlc3Npb25EYXRhLmNvbHVtbldpZHRocyA9IGNvbHVtbldpZHRocy5qb2luKCcsJyk7XHJcblxyXG4gIC8vICAgICAgIC8vbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5mb3JtTmFtZSwgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbkRhdGEpKTtcclxuICAvLyAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAvL2NvbnN0IHJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUYWJsZUNvbmZpZ0pTT04oKTtcclxuICAvLyAgICAgICAvL2xvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZm9ybU5hbWUsIHJlc3VsdCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGdlbmVyYXRlVGFibGVDb25maWdKU09OKCk6IHN0cmluZyB7XHJcbiAgLy8gICBjb25zdCB0YWJsZUNvbmZpZyA9IEpTT04ucGFyc2UodGhpcy5qc29uU3RyaW5nTGF5b3V0KTtcclxuICAvLyAgIHRhYmxlQ29uZmlnLmNvbHVtbk9yZGVyID0gdGhpcy5zZWxlY3RlZENvbHVtbnMubWFwKGNvbHVtbiA9PiBjb2x1bW4uZmllbGQpO1xyXG4gIC8vICAgLy90YWJsZUNvbmZpZy5jb2x1bW5XaWR0aHMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5tYXAoKCkgPT4gJzkwJykuam9pbignLCcpO1xyXG4gIC8vICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRhYmxlQ29uZmlnKTtcclxuICAvLyB9XHJcblxyXG5cclxuXHJcbiAgb25TdGF0ZVJlc3RvcmUodGFibGVTdGF0ZTogVGFibGVTdGF0ZSkge1xyXG4gICAgaWYgKHRhYmxlU3RhdGUuc2VsZWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGFibGVTdGF0ZS5zZWxlY3Rpb25cclxuICAgICAgdGhpcy5vblNlbGVjdGVkSXRlbXNDaGFuZ2VkKClcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAodGhpcy5mb3JtTmFtZSkge1xyXG4gICAgLy8gICBjb25zdCBzdG9yZWRWYWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZm9ybU5hbWUpO1xyXG4gICAgLy8gICBpZiAoc3RvcmVkVmFsdWUpIHtcclxuICAgIC8vICAgICBjb25zdCBzZXNzaW9uRGF0YSA9IEpTT04ucGFyc2Uoc3RvcmVkVmFsdWUpO1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbHVtbk9yZGVyOiBzdHJpbmdbXSA9IHNlc3Npb25EYXRhLmNvbHVtbk9yZGVyO1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbHVtbldpZHRoczogc3RyaW5nW10gPSBzZXNzaW9uRGF0YS5jb2x1bW5XaWR0aHMuc3BsaXQoJywnKTtcclxuXHJcbiAgICAvLyAgICAgLy8gVXBkYXRlIHNlbGVjdGVkQ29sdW1ucyBiYXNlZCBvbiBjb2x1bW5PcmRlciBhbmQgY29sdW1uV2lkdGhzXHJcbiAgICAvLyAgICAgY29uc3QgdXBkYXRlZFNlbGVjdGVkQ29sdW1uczogR3JpZENvbHVtbltdID0gW107XHJcbiAgICAvLyAgICAgY29sdW1uT3JkZXIuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XHJcbiAgICAvLyAgICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IGNvbHVtbldpZHRoc1tpbmRleF07XHJcbiAgICAvLyAgICAgICAvLyBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIGNvbHVtbiBpbiBzZWxlY3RlZENvbHVtbnNcclxuICAgIC8vICAgICAgIGNvbnN0IGV4aXN0aW5nQ29sdW1uSW5kZXggPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5maW5kSW5kZXgoY29sdW1uID0+IGNvbHVtbi5maWVsZCA9PT0gZmllbGQpO1xyXG4gICAgLy8gICAgICAgaWYgKGV4aXN0aW5nQ29sdW1uSW5kZXggIT09IC0xKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIElmIHRoZSBjb2x1bW4gZXhpc3RzIGluIHNlbGVjdGVkQ29sdW1ucywgdXBkYXRlIGl0cyB3aWR0aFxyXG4gICAgLy8gICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uc1tleGlzdGluZ0NvbHVtbkluZGV4XS53aWR0aCA9IGNvbHVtbldpZHRoO1xyXG4gICAgLy8gICAgICAgICB1cGRhdGVkU2VsZWN0ZWRDb2x1bW5zLnB1c2godGhpcy5zZWxlY3RlZENvbHVtbnNbZXhpc3RpbmdDb2x1bW5JbmRleF0pO1xyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH0pO1xyXG5cclxuICAgIC8vICAgICAvLyBVcGRhdGUgc2VsZWN0ZWRDb2x1bW5zIHdpdGggdGhlIHJlc3RvcmVkIGRhdGFcclxuICAgIC8vICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHVwZGF0ZWRTZWxlY3RlZENvbHVtbnM7XHJcblxyXG5cclxuICAgIC8vICAgICAgIGlmKHN0b3JlZFZhbHVlKXtcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHN0b3JlZFZhbHVlKTtcclxuICAgIC8vICAgICAgICAgaWYgKChkYXRhLm11bHRpU29ydE1ldGEgJiYgZGF0YS5tdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHx8IChkYXRhLmZpbHRlcnMgJiYgZGF0YS5tdWx0aVNvcnRNZXRhLmZpbHRlcnMgPiAwKSkge1xyXG4gICAgLy8gICAgICAgICAgIGlmIChkYXRhLm11bHRpU29ydE1ldGEgJiYgZGF0YS5tdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgICAgIGRhdGEubXVsdGlTb3J0TWV0YS5mb3JFYWNoKChtZXRhOiB7IGZpZWxkOiBhbnk7IG9yZGVyOiBhbnk7IH0pID0+IHsgXHJcblxyXG4gICAgLy8gICAgICAgICAgICAgICBsZXQgc29ydCA9IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogbWV0YS5maWVsZCxcclxuICAgIC8vICAgICAgICAgICAgICAgICBvcmRlcjogbWV0YS5vcmRlciA9PSAxID8gJ0FTQycgOiAnREVTQydcclxuICAgIC8vICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICB0aGlzLl9zb3J0ID0gW3NvcnRdO1xyXG4gICAgLy8gICAgICAgICAgICAgfSk7ICBcclxuICAgIC8vICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgaWYgKGRhdGEuZmlsdGVycykge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zZWFyY2hGaWVsZHMgPVtdO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgZmlsdGVyc0FycmF5OiBbc3RyaW5nLCB7IHZhbHVlOiBzdHJpbmcgfCBudWxsOyBtYXRjaE1vZGU6IHN0cmluZyxvcGVyYXRvciA6IHN0cmluZyB9W11dW10gPSBPYmplY3QuZW50cmllcyhkYXRhLmZpbHRlcnMpO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgIGZpbHRlcnNBcnJheS5mb3JFYWNoKChbZmllbGROYW1lLCBmaWVsZFZhbHVlXSkgPT4ge1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgZmllbGRWYWx1ZS5mb3JFYWNoKGZpbHRlciA9PlxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYoZmlsdGVyLnZhbHVlKXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hGaWVsZCA6IFNlYXJjaEZpZWxkID17XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGZpZWxkIDpmaWVsZE5hbWUsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxhYmVsVmFsdWUgOiBmaWx0ZXIudmFsdWUsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHZhbHVlOmZpbHRlci52YWx1ZSxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IHRoaXMuaW5mZXJJbnB1dFR5cGUoZmllbGROYW1lKSxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgOiB0aGlzLmdldE9wZXJhdG9yTnVtYmVyKGZpbHRlci5tYXRjaE1vZGUpXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlYXJjaEZpZWxkJyxzZWFyY2hGaWVsZCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hGaWVsZHMpIHtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaEZpZWxkcy5wdXNoKHNlYXJjaEZpZWxkKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgIH0pO1xyXG4gICAgLy8gICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgIHRoaXMuc2VhcmNoKCk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICB9XHJcblxyXG4gICAgLy8gICB9IGVsc2Uge1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwiTm8gc2Vzc2lvbiBkYXRhIGZvdW5kIGluIGxvY2FsU3RvcmFnZVwiKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgb25DbGVhckZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmR0Py5jbGVhcigpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYCR7dGhpcy5mb3JtTmFtZX0tZmlsdGVyTW9kZWApXHJcbiAgfVxyXG5cclxuICBnZXRPcGVyYXRvck51bWJlcihvcGVyYXRvcjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBGaWx0ZXJPcGVyYXRvclR5cGVbb3BlcmF0b3IudG9VcHBlckNhc2UoKSBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyT3BlcmF0b3JUeXBlXSA/PyAtMTtcclxuICB9XHJcbiAgaW5mZXJJbnB1dFR5cGUodmFsdWU6IGFueSk6IElucHV0VHlwZXMge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgaWYgKC9eXFxkKyQvLnRlc3QodmFsdWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIElucHV0VHlwZXMuSU5URUdFUjtcclxuICAgICAgfSBlbHNlIGlmICgvXlxcZCtcXC5cXGQrJC8udGVzdCh2YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gSW5wdXRUeXBlcy5ERUNJTUFMX0lOUFVUO1xyXG4gICAgICB9IGVsc2UgaWYgKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiBJbnB1dFR5cGVzLkRBVEU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIElucHV0VHlwZXMuVEVYVF9CT1g7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBJbnB1dFR5cGVzLlRFWFRfQk9YO1xyXG4gICAgfVxyXG4gIH1cclxuICBsb2FkSW5pdGlhbFN0YXRlKCkge1xyXG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZVsnZ2V0J10oJ3RhYmxlLXN0YXRlJyk7XHJcbiAgfVxyXG4gIC8vI3JlZ2lvbiBwcml2YXRlIG1ldGhvZHNcclxuICBwcml2YXRlIF9leHRyYWN0RmlsdGVycyhldmVudDogRmlsdGVyTWV0YWRhdGFbXSB8IGFueSk6IElGaWx0ZXJlZFJlcXVlc3RbXSB7XHJcbiAgICBsZXQgZmlsdGVyczogSUZpbHRlcmVkUmVxdWVzdFtdID0gW107XHJcbiAgICBpZiAoZXZlbnQgIT0gbnVsbFxyXG4gICAgICAmJlxyXG4gICAgICBldmVudCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbDogR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICAgIGxldCBjdXJyZW5jeTogc3RyaW5nIHwgdW5kZWZpbmVkID0gY29sLmN1cnJlbmN5T3RoZXJDb2RlO1xyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSB0aGlzLmRpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVkpIHtcclxuICAgICAgICAgIGN1cnJlbmN5ID0gdGhpcy5hcHBTZXR0aW5nc1NlcnZpY2UuYXBwU2V0dGluZ3MuZGV2aXNlU29jaWV0ZS5jb2RlRGV2aXNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbFxyXG4gICAgICAgICAgJiZcclxuICAgICAgICAgIGV2ZW50ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgbGV0IGZpbHRlciA9IGV2ZW50W2NvbC5maWVsZF07XHJcbiAgICAgICAgICBpZiAodGhpcy5fbm90TnVsbE9yVW5kZWZpbmVkKGZpbHRlcikpIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBmaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ub3ROdWxsT3JVbmRlZmluZWQoaXRlbS52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGl0ZW0udmFsdWUsICd5eXl5LU1NLWRkJyk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogRmlsdGVySGVscGVyLlRvT3BlcmF0b3JUeXBlKGl0ZW0ubWF0Y2hNb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgICwgZmlsdGVyVmFsdWU6IGl0ZW0udmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAsIHByb3ByZXR5TmFtZTogY29sLmZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgLCBoZWFkZXI6IGNvbC5oZWFkZXJcclxuICAgICAgICAgICAgICAgICAgICAsIHR5cGU6IEZpbHRlckhlbHBlci5Ub0lucHV0VHlwZShjb2wudHlwZSlcclxuICAgICAgICAgICAgICAgICAgICAsIGN1cnJlbmN5OiBjdXJyZW5jeVxyXG4gICAgICAgICAgICAgICAgICAgICwgbnVtT2ZEZWNpbWFsOiBjb2wubnVtT2ZEZWNpbWFsXHJcbiAgICAgICAgICAgICAgICAgICAgLCBpc0ZyYWN0aW9uOiBjb2wuaXNGcmFjdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICwgY29tYm9ib3hMYWJlbDogY29sLmNvbWJvTGFiZWxcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlci52YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgZmlsdGVyLnZhbHVlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZmlsdGVyLnZhbHVlLCAneXl5eS1NTS1kZCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IEZpbHRlckhlbHBlci5Ub09wZXJhdG9yVHlwZShmaWx0ZXIubWF0Y2hNb2RlKVxyXG4gICAgICAgICAgICAgICAgICAsIGZpbHRlclZhbHVlOiBmaWx0ZXIudmFsdWVcclxuICAgICAgICAgICAgICAgICAgLCBwcm9wcmV0eU5hbWU6IGNvbC5maWVsZFxyXG4gICAgICAgICAgICAgICAgICAsIGhlYWRlcjogY29sLmhlYWRlclxyXG4gICAgICAgICAgICAgICAgICAsIHR5cGU6IEZpbHRlckhlbHBlci5Ub0lucHV0VHlwZShjb2wudHlwZSlcclxuICAgICAgICAgICAgICAgICAgLCBjdXJyZW5jeTogY3VycmVuY3lcclxuICAgICAgICAgICAgICAgICAgLCBudW1PZkRlY2ltYWw6IGNvbC5udW1PZkRlY2ltYWxcclxuICAgICAgICAgICAgICAgICAgLCBpc0ZyYWN0aW9uOiBjb2wuaXNGcmFjdGlvblxyXG4gICAgICAgICAgICAgICAgICAsIGNvbWJvYm94TGFiZWw6IGNvbC5jb21ib0xhYmVsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leHRyYWN0U29ydENyaXRlcmlhcyhsYXp5TG9hZEV2ZW50OiBUYWJsZUxhenlMb2FkRXZlbnQpOiB2b2lkIHtcclxuICAgIGxldCBzb3J0TWV0YSA9IHRoaXMuX3RvU29ydE1ldGEobGF6eUxvYWRFdmVudCk7XHJcbiAgICBpZiAoc29ydE1ldGEpIHtcclxuICAgICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IEdyaWRTb3J0TW9kZS5TaW5nbGUpIHtcclxuICAgICAgICB0aGlzLl9leHRyYWN0U2luZ2xlU29ydENyaXRlcmlhKHNvcnRNZXRhKVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuc29ydE1vZGUgPT09IEdyaWRTb3J0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICAgIHRoaXMuX2V4dHJhY3RNdWx0aXBsZVNvcnRDcml0ZXJpYXMoc29ydE1ldGEpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RTaW5nbGVTb3J0Q3JpdGVyaWEoc29yTWV0YTogU29ydE1ldGEpIHtcclxuICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSBHcmlkU29ydE1vZGUuU2luZ2xlKSB7XHJcbiAgICAgIGlmIChzb3JNZXRhLmZpZWxkKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIG5ldyBzb3J0IGVsZW1lbnRcclxuICAgICAgICBsZXQgc29ydDogSVNvcnRCeVByb3ByZXR5ID0ge1xyXG4gICAgICAgICAgcHJvcGVydHk6IHNvck1ldGEuZmllbGQsXHJcbiAgICAgICAgICBvcmRlcjogc29yTWV0YS5vcmRlciA9PSAxID8gJ0FTQycgOiAnREVTQydcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc29ydCA9IFtzb3J0XVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IHByb2Nlc3MgXFwnU2luZ2xlU29ydFxcJyB3aGVuIFtzb3J0TW9kZV0gaXMgXFwnbXVsdGlwbGVcXCcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RNdWx0aXBsZVNvcnRDcml0ZXJpYXMoc29ydE1ldGFzOiBTb3J0TWV0YVtdKSB7XHJcbiAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gR3JpZFNvcnRNb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgIGlmIChzb3J0TWV0YXMgJiYgQXJyYXkuaXNBcnJheShzb3J0TWV0YXMpKSB7XHJcbiAgICAgICAgLy8gY3JlYXRlIG5ldyBzb3J0IGVsZW1lbnRcclxuICAgICAgICB0aGlzLl9zb3J0ID0gW107XHJcbiAgICAgICAgdGhpcy5zb3J0TWV0YXMgPSBzb3J0TWV0YXM7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZygnbWV0YSAnLCBzb3J0TWV0YXMpXHJcbiAgICAgICAgc29ydE1ldGFzLmZvckVhY2goc20gPT4ge1xyXG4gICAgICAgICAgaWYgKHNtLmZpZWxkKSB7XHJcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgc29ydCBlbGVtZW50XHJcbiAgICAgICAgICAgIGxldCBzb3J0OiBJU29ydEJ5UHJvcHJldHkgPSB7XHJcbiAgICAgICAgICAgICAgcHJvcGVydHk6IHNtLmZpZWxkLFxyXG4gICAgICAgICAgICAgIG9yZGVyOiBzbS5vcmRlciA9PSAxID8gJ0FTQycgOiAnREVTQydcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9hZGQgdGhlIG5ldyBlbGVtZW50IHRvIF9zb3J0XHJcbiAgICAgICAgICAgIHRoaXMuX3NvcnQucHVzaChzb3J0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBwcm9jZXNzIFxcJ011bHRpcGxlU29ydFxcJyB3aGVuIFtzb3J0TW9kZV0gaXMgXFwnc2luZ2xlXFwnJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9ub3ROdWxsT3JVbmRlZmluZWQob2JqOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmIChvYmogIT0gbnVsbFxyXG4gICAgICAmJiBvYmogIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdE9ubHlWaXNpYmxlU2VhcmNoRmllbGRzKCk6IHZvaWQge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnByZXNlbnRhdGlvblNldHRpbmdzXHJcbiAgICAgICYmIHRoaXMucHJlc2VudGF0aW9uU2V0dGluZ3MucHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHMubGVuZ3RoID4gMFxyXG4gICAgICAmJiB0aGlzLnRlbXBTZWFyY2hGaWVsZHMpIHtcclxuICAgICAgdGhpcy5zZWFyY2hGaWVsZHMgPSB0aGlzLnRlbXBTZWFyY2hGaWVsZHMuZmlsdGVyKHNmID0+IHRoaXMucHJlc2VudGF0aW9uU2V0dGluZ3M/LnByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzXHJcbiAgICAgICAgLnNvbWUocCA9PiBwLmJsb2NrTmFtZSA9PSBzZi5maWVsZCAmJiAocC5pc0Jsb2NrVmlzaWJsZSA9PSB0cnVlIHx8IHAuaXNCbG9ja1Zpc2libGUgPT0gdW5kZWZpbmVkKSlcclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdFNlYXJjaEJveEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZWFyY2hCb3hGaWx0ZXJzID0gW107XHJcbiAgICBpZiAodGhpcy5zZWFyY2hGaWVsZHMpIHtcclxuXHJcbiAgICAgIHRoaXMuX2V4dHJhY3RPbmx5VmlzaWJsZVNlYXJjaEZpZWxkcygpO1xyXG5cclxuICAgICAgdGhpcy5zZWFyY2hGaWVsZHMuZm9yRWFjaCgoc2Y6IFNlYXJjaEZpZWxkKSA9PiB7XHJcbiAgICAgICAgLy9pZiAoc2YudmFsdWUgIT0gdW5kZWZpbmVkICYmIHNmLnZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoc2Yub3BlcmF0b3IgIT0gbnVsbCAmJiBzZi5vcGVyYXRvciAhPSB1bmRlZmluZWQgJiYgc2YudmFsdWUgIT0gdW5kZWZpbmVkICYmIHNmLnZhbHVlICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICBsZXQgZmlsdGVyQnlQcm9wZXJ0eTogSUZpbHRlcmVkUmVxdWVzdCA9IHtcclxuICAgICAgICAgICAgb3BlcmF0b3I6IHNmLm9wZXJhdG9yXHJcbiAgICAgICAgICAgICwgZmlsdGVyVmFsdWU6IHNmLnZhbHVlXHJcbiAgICAgICAgICAgICwgcHJvcHJldHlOYW1lOiBzZi5maWVsZFxyXG4gICAgICAgICAgICAsIGhlYWRlcjogc2YubGFiZWxWYWx1ZVxyXG4gICAgICAgICAgICAsIHR5cGU6IHNmLnR5cGVcclxuICAgICAgICAgICAgLCBjb21ib2JveExhYmVsOiBzZi5jb21ib2JveExhYmVsXHJcbiAgICAgICAgICAgICwgY3VycmVuY3k6IHNmLmN1cnJlbmN5XHJcbiAgICAgICAgICAgICwgaXNGcmFjdGlvbjogc2YuaXNGcmFjdGlvblxyXG4gICAgICAgICAgICAsIG51bU9mRGVjaW1hbDogc2YubnVtT2ZEZWNpbWFsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5fc2VhcmNoQm94RmlsdGVycy5wdXNoKGZpbHRlckJ5UHJvcGVydHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChzZi5vcGVyYXRvciA9PSB1bmRlZmluZWQgfHwgc2Yub3BlcmF0b3IgPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0aGUgc2VhcmNoIGZpZWxkIHdpdGggW2ZpZWxkIDogJHtzZi5maWVsZH1dIGhhdmUgbm8gb3BlcmF0b3JzYClcclxuICAgICAgICB9XHJcbiAgICAgICAgLy99XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xvbmVQYWdlZFJlcXVlc3QocmVxdWVzdDogSVBhZ2VkUmVxdWVzdCk6IElQYWdlZFJlcXVlc3Qge1xyXG4gICAgbGV0IGNsb25lOiBJUGFnZWRSZXF1ZXN0ID0ge1xyXG4gICAgICBtYXhSZXN1bHRDb3VudDogcmVxdWVzdC5tYXhSZXN1bHRDb3VudCxcclxuICAgICAgc2tpcENvdW50OiByZXF1ZXN0LnNraXBDb3VudCxcclxuICAgICAgc29ydGluZzogcmVxdWVzdC5zb3J0aW5nLFxyXG4gICAgICBrZXl3b3JkOiByZXF1ZXN0LmtleXdvcmQsXHJcbiAgICAgIGZpbHRlcnM6IHJlcXVlc3QuZmlsdGVycyxcclxuICAgICAgZ2V0QWxsRGF0YTogcmVxdWVzdC5nZXRBbGxEYXRhLFxyXG4gICAgICBzdW1tYXJpZXM6IHJlcXVlc3Quc3VtbWFyaWVzXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGNsb25lO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdEhhdmVTdW1tYXJ5UHJvcGVydGllcygpOiBBcnJheTxzdHJpbmc+IHtcclxuICAgIGxldCBwcm9wZXJ0aWVzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICBsZXQgaGF2ZVN1bW1hcnlDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMuaGF2ZVN1bW1hcnkgPT09IHRydWUpO1xyXG4gICAgaWYgKGhhdmVTdW1tYXJ5Q29sdW1ucyAmJiBoYXZlU3VtbWFyeUNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBwcm9wZXJ0aWVzID0gaGF2ZVN1bW1hcnlDb2x1bW5zLm1hcChjID0+IGMuZmllbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwcm9wZXJ0aWVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdFN1bW1hcmllcygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBhZ2Uuc3VtbWFyaWVzKSB7XHJcbiAgICAgIHRoaXMucGFnZS5zdW1tYXJpZXMuZm9yRWFjaChzID0+IHtcclxuICAgICAgICB0aGlzLnN1bW1hcmllc1tzLnByb3ByZXR5XSA9IHMuc3VtbWFyeTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leHRyYWN0TXVsdGlTb3J0TWV0YUl0ZW1zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc29ydCA9IFtdO1xyXG4gICAgaWYgKHRoaXMuc29ydE1ldGFzKSB7XHJcbiAgICAgIHRoaXMuc29ydE1ldGFzLmZvckVhY2goKHM6IFNvcnRNZXRhKSA9PiB7XHJcbiAgICAgICAgbGV0IHNvcnQ6IElTb3J0QnlQcm9wcmV0eSA9IHtcclxuICAgICAgICAgIHByb3BlcnR5OiBzLmZpZWxkLFxyXG4gICAgICAgICAgb3JkZXI6IHMub3JkZXIgPT0gMSA/ICdBU0MnIDogJ0RFU0MnXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc29ydEl0ZW0gPSB0aGlzLl9zb3J0LmZpbmQocyA9PiBzLnByb3BlcnR5ID09IHNvcnQucHJvcGVydHkpO1xyXG5cclxuICAgICAgICBpZiAoc29ydEl0ZW0pIHtcclxuICAgICAgICAgIGlmIChzb3J0SXRlbS5vcmRlciAhPSBzb3J0Lm9yZGVyKSB7XHJcbiAgICAgICAgICAgIHNvcnRJdGVtLm9yZGVyID0gc29ydC5vcmRlcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zb3J0LnB1c2goc29ydCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RvU29ydE1ldGEodGFibGVMYXp5TG9hZEV2ZW50OiBUYWJsZUxhenlMb2FkRXZlbnQpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IEdyaWRTb3J0TW9kZS5TaW5nbGUpIHtcclxuICAgICAgaWYgKHRhYmxlTGF6eUxvYWRFdmVudC5zb3J0RmllbGQgJiYgdGFibGVMYXp5TG9hZEV2ZW50LnNvcnRPcmRlcikge1xyXG4gICAgICAgIGxldCBzb3J0TWV0YTogSVNvcnRNZXRhID0ge1xyXG4gICAgICAgICAgZmllbGQ6IHRhYmxlTGF6eUxvYWRFdmVudC5zb3J0RmllbGQsXHJcbiAgICAgICAgICBvcmRlcjogdGFibGVMYXp5TG9hZEV2ZW50LnNvcnRPcmRlclxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc29ydE1ldGE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc29ydE1vZGUgPT09IEdyaWRTb3J0TW9kZS5NdWx0aXBsZSkge1xyXG4gICAgICBpZiAodGFibGVMYXp5TG9hZEV2ZW50Lm11bHRpU29ydE1ldGEpIHtcclxuICAgICAgICByZXR1cm4gdGFibGVMYXp5TG9hZEV2ZW50Lm11bHRpU29ydE1ldGE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFtzb3J0TW9kZV0gaGF2ZSBiZWVuIHNldCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2VuZXJhdGVGaWx0ZXJzSHRtbFRlbXBsYXRlKCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZmlsdGVyc0h0bWxUZW1wbGF0ZSA9IFwiXCJcclxuICAgIC8vZXhjbHVkZSB1c2VsZXNzIEdyaWQgZmlsdGVyIFxyXG4gICAgdGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMgPSB0aGlzLl9leGNsdWRlVXNlbGVzc0dyaWRGaWx0ZXIodGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMpXHJcblxyXG4gICAgLy9hZGQgc2VhcmNoIEJveCBmaWx0ZXJzIGh0bWxcclxuICAgIGlmICh0aGlzLl9zZWFyY2hCb3hGaWx0ZXJzKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyc0h0bWxUZW1wbGF0ZSA9IHRoaXMuX2h0bWxUZW1wbGF0ZUdlbmVyYXRvclNlcnZpY2VcclxuICAgICAgICAuZ2VuZXJhdGVHcmlkRmlsdGVyc1RlbXBsYXRlKHRoaXMuX3NlYXJjaEJveEZpbHRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUubG9nKFwidGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMgPT0+IFwiLCB0aGlzLl9ncmlkSGVhZGVyRmlsdGVycylcclxuXHJcbiAgICAvL2FkZCBncmlkIGhlYWRlciBmaWx0ZXJzIGh0bWxcclxuICAgIGlmICh0aGlzLl9ncmlkSGVhZGVyRmlsdGVycykge1xyXG4gICAgICB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUgKz0gdGhpcy5faHRtbFRlbXBsYXRlR2VuZXJhdG9yU2VydmljZVxyXG4gICAgICAgIC5nZW5lcmF0ZUdyaWRGaWx0ZXJzVGVtcGxhdGUodGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGVDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUpO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4Y2x1ZGVVc2VsZXNzR3JpZEZpbHRlcihmaWx0ZXJzOiBJRmlsdGVyZWRSZXF1ZXN0W10pIHtcclxuICAgIHJldHVybiBmaWx0ZXJzLmZpbHRlcih4ID0+XHJcbiAgICAgIHguZmlsdGVyVmFsdWUgIT09IG51bGwgJiYgeC5maWx0ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHguZmlsdGVyVmFsdWUgIT09IFwiXCIgJiYgeC5vcGVyYXRvciAhPT0gdW5kZWZpbmVkXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXhjbHVkZVVzZWxlc3NGaWx0ZXJzKHBhZ2VkUmVxdWVzdDogSVBhZ2VkUmVxdWVzdCk6IElQYWdlZFJlcXVlc3Qge1xyXG4gICAgaWYgKHBhZ2VkUmVxdWVzdCAmJiBwYWdlZFJlcXVlc3QuZmlsdGVycykge1xyXG4gICAgICBwYWdlZFJlcXVlc3QuZmlsdGVycyA9IHBhZ2VkUmVxdWVzdC5maWx0ZXJzLmZpbHRlcihmID0+IGYuZmlsdGVyVmFsdWUgIT0gdW5kZWZpbmVkICYmIGYuZmlsdGVyVmFsdWUgIT0gbnVsbClcclxuICAgIH1cclxuICAgIHJldHVybiBwYWdlZFJlcXVlc3Q7XHJcbiAgfVxyXG5cclxuICBleHBvcnRFeGNlbCgpIHtcclxuICAgIHRoaXMucGFnZWRSZXF1ZXN0ISEuZ2V0QWxsRGF0YSA9IHRydWVcclxuICAgIGlmICh0aGlzLmNydWRTZXJ2aWNlICE9IG51bGwgJiYgdGhpcy5jcnVkU2VydmljZSAhPSB1bmRlZmluZWQgJiYgdGhpcy5pc0dyaWREYXRhUGFnZWRJbkFwaSkge1xyXG4gICAgICB0aGlzLmNydWRTZXJ2aWNlLmdldEFsbFBhZ2VkKHRoaXMucGFnZWRSZXF1ZXN0ISEpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHZhbHVlOiBJUGFnZWRSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgICBpZiAodmFsdWUpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEl0ZW1zID0gRXhwb3J0RXhjZWxIZWxwZXIucHJlcHJvY2Vzc0RhdGVGb3JFeGNlbCh2YWx1ZS5pdGVtcyk7XHJcbiAgICAgICAgICAgIHZhbHVlLml0ZW1zID0gZm9ybWF0dGVkSXRlbXM7XHJcbiAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YUZyb21BcGlUb0V4Y2VsU2hlZXQodmFsdWUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnBhZ2UubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgdGhpcy5wYWdlLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgZmlsdGVyZWREYXRhID0gdGhpcy5wYWdlLml0ZW1zLmZpbHRlcigoY29sOiBhbnkpID0+ICFjb2wuaXNCdXR0b24pO1xyXG4gICAgICBmaWx0ZXJlZERhdGEgPSBFeHBvcnRFeGNlbEhlbHBlci5wcmVwcm9jZXNzRGF0ZUZvckV4Y2VsKGZpbHRlcmVkRGF0YSk7XHJcbiAgICAgIHRoaXMucGFnZS5pdGVtcyA9IGZpbHRlcmVkRGF0YVxyXG4gICAgICB0aGlzLmV4cG9ydERhdGFGcm9tQXBpVG9FeGNlbFNoZWV0KHRoaXMucGFnZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydERhdGFGcm9tQXBpVG9FeGNlbFNoZWV0KHZhbHVlOiBhbnkpIHtcclxuICAgIGltcG9ydChcInhsc3hcIikudGhlbih4bHN4ID0+IHtcclxuICAgICAgY29uc3Qgd29ya2Jvb2sgPSB4bHN4LnV0aWxzLmJvb2tfbmV3KCk7XHJcbiAgICAgIGlmICh0aGlzLnBhZ2VkUmVxdWVzdCEuZmlsdGVycz8ubGVuZ3RoICE9IDApIHtcclxuICAgICAgICBjb25zdCBtYXBwZWRGaWx0ZXJzID0gdGhpcy5wYWdlZFJlcXVlc3QhLmZpbHRlcnM/Lm1hcChmaWx0ZXIgPT4gKHtcclxuICAgICAgICAgIHByb3BlcnR5OiBmaWx0ZXIucHJvcHJldHlOYW1lLFxyXG4gICAgICAgICAgb3BlcmF0b3JOYW1lOiB0aGlzLmdldEZpbHRlck9wZXJhdG9yTmFtZShmaWx0ZXIub3BlcmF0b3IpLFxyXG4gICAgICAgICAgdmFsdWU6IGZpbHRlci5maWx0ZXJWYWx1ZVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICBjb25zdCBmaWx0ZXJzID0geGxzeC51dGlscy5qc29uX3RvX3NoZWV0KDxhbnlbXT5tYXBwZWRGaWx0ZXJzKVxyXG4gICAgICAgIHhsc3gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQod29ya2Jvb2ssIGZpbHRlcnMsICdGaWx0ZXJzJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzZWxlY3RlZENvbHVtbnNGaWVsZHMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5maWx0ZXIoeCA9PiAheC5pc0J1dHRvbikubWFwKGNvbHVtbiA9PiBjb2x1bW4udHJhbnNsYXRlZEhlYWRlciEhKVxyXG4gICAgICBzZWxlY3RlZENvbHVtbnNGaWVsZHMgPSBzZWxlY3RlZENvbHVtbnNGaWVsZHMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gJycpXHJcbiAgICAgIGNvbnN0IHdvcmtzaGVldERhdGEgPSB2YWx1ZS5pdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvd0RhdGE6IHsgW2hlYWRlcjogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgcm93RGF0YVtjb2wudHJhbnNsYXRlZEhlYWRlciEhXSA9IGl0ZW1bY29sLmZpZWxkXTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcm93RGF0YTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IGZpbHRlcmVkV29ya3NoZWV0RGF0YSA9IHRoaXMucmVtb3ZlTm9uRXhpc3RpbmdDb2x1bW5zKHdvcmtzaGVldERhdGEsIHNlbGVjdGVkQ29sdW1uc0ZpZWxkcylcclxuICAgICAgY29uc3Qgd29ya3NoZWV0ID0geGxzeC51dGlscy5qc29uX3RvX3NoZWV0KGZpbHRlcmVkV29ya3NoZWV0RGF0YSk7XHJcbiAgICAgIHhsc3gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQod29ya2Jvb2ssIHdvcmtzaGVldCwgJ0RhdGEnKTtcclxuICAgICAgY29uc3QgZXhjZWxCdWZmZXI6IGFueSA9IHhsc3gud3JpdGUod29ya2Jvb2ssIHsgYm9va1R5cGU6ICd4bHN4JywgdHlwZTogJ2FycmF5JyB9KTtcclxuICAgICAgdGhpcy5zYXZlQXNFeGNlbEZpbGUoZXhjZWxCdWZmZXIsIFwiZXhjZWxcIik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNhdmVBc0V4Y2VsRmlsZShidWZmZXI6IGFueSwgZmlsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IEVYQ0VMX1RZUEUgPSAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICBsZXQgRVhDRUxfRVhURU5TSU9OID0gJy54bHN4JztcclxuICAgIGNvbnN0IGRhdGE6IEJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge1xyXG4gICAgICB0eXBlOiBFWENFTF9UWVBFXHJcbiAgICB9KTtcclxuICAgIEZpbGVTYXZlci5zYXZlQXMoZGF0YSwgZmlsZU5hbWUgKyAnX2V4cG9ydF8nICsgbmV3IERhdGUoKS5nZXRUaW1lKCkgKyBFWENFTF9FWFRFTlNJT04pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyT3BlcmF0b3JOYW1lKG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvclR5cGUpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5FUVVBTDogcmV0dXJuICdFUVVBTCc7XHJcbiAgICAgIGNhc2UgRmlsdGVyT3BlcmF0b3JUeXBlLkxFU1NPUkVRVUFMOiByZXR1cm4gJ0xFU1MgT1IgRVFVQUwnO1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5HUkVBVEVST1JFUVVBTDogcmV0dXJuICdHUkVBVEVSIE9SIEVRVUFMJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuTEVTUzogcmV0dXJuICdMRVNTJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuR1JFQVRFUjogcmV0dXJuICdHUkVBVEVSJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuTk9URVFVQUw6IHJldHVybiAnTk9UIEVRVUFMJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuQ09OVEFJTlM6IHJldHVybiAnQ09OVEFJTlMnO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ1VOS05PV05fT1BFUkFUT1InO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTm9uRXhpc3RpbmdDb2x1bW5zKHdvcmtzaGVldERhdGE6IGFueVtdLCBzZWxlY3RlZENvbHVtbnNGaWVsZHM6IHN0cmluZ1tdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHdvcmtzaGVldERhdGEubWFwKHJvdyA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld1JvdzogYW55ID0ge307XHJcbiAgICAgIGZvciAoY29uc3QgY29sIG9mIHNlbGVjdGVkQ29sdW1uc0ZpZWxkcykge1xyXG4gICAgICAgIGlmIChyb3cuaGFzT3duUHJvcGVydHkoY29sKSkge1xyXG4gICAgICAgICAgbmV3Um93W2NvbF0gPSByb3dbY29sXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5ld1JvdztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlSGVhZGVyRmlsdGVycygpIHtcclxuICAgIGlmICh0aGlzLnNob3dIZWFkZXJGaWx0ZXJzID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0hlYWRlckZpbHRlcnMgPSBmYWxzZTtcclxuICAgICAgdGhpcy5maWx0ZXJJY29uID0gXCJwaSBwaS1maWx0ZXJcIjtcclxuICAgICAgdGhpcy5maWx0ZXJUb29sdGlwID0gXCJzaG93X2ZpbHRlclwiO1xyXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgJHt0aGlzLmZvcm1OYW1lfS1maWx0ZXJNb2RlYClcclxuICAgIH1cclxuICAgIGVsc2UgeyAvL3RoaXMuc2hvd0hlYWRlckZpbHRlcnMgPT09IGZhbHNlXHJcbiAgICAgIHRoaXMuc2hvd0hlYWRlckZpbHRlcnMgPSB0cnVlO1xyXG4gICAgICB0aGlzLmZpbHRlckljb24gPSBcInBpIHBpLWZpbHRlci1zbGFzaFwiO1xyXG4gICAgICB0aGlzLmZpbHRlclRvb2x0aXAgPSBcImhpZGVfZmlsdGVyXCI7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlSGVhZGVyRmlsdGVyc01vZGUoKSB7XHJcbiAgICBpZiAodGhpcy5kdCkge1xyXG4gICAgICB0aGlzLmR0LmNsZWFyKClcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYCR7dGhpcy5mb3JtTmFtZX0tZmlsdGVyTW9kZWAsIHRoaXMuZmlsdGVyTW9kZVRvb2x0aXApXHJcbiAgICAgIGlmICh0aGlzLmZpbHRlck1vZGVUb29sdGlwID09PSBcIm1lbnVfbW9kZVwiKSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZSA9IFwibWVudVwiO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kZUljb24gPSBcInBpIHBpLWNoZWNrXCI7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RlVG9vbHRpcCA9IFwicm93X21vZGVcIjtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5zZWxlY3RlZENvbHVtbnMpIHtcclxuICAgICAgICAgIHRoaXMuZHQuZmlsdGVyc1tjb2wuZmllbGRdID0gW3sgdmFsdWU6IG51bGwsIG1hdGNoTW9kZTogdW5kZWZpbmVkIH1dO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmR0Ll9maWx0ZXIoKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlSGVhZGVyRmlsdGVyc01vZGUgPSBcInJvd1wiO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kZUljb24gPSBcInBpIHBpLWVsbGlwc2lzLXZcIjtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVUb29sdGlwID0gXCJtZW51X21vZGVcIjtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5zZWxlY3RlZENvbHVtbnMpIHtcclxuICAgICAgICAgIHRoaXMuZHQuZmlsdGVyc1tjb2wuZmllbGRdID0geyB2YWx1ZTogbnVsbCwgbWF0Y2hNb2RlOiB1bmRlZmluZWQgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kdC5fZmlsdGVyKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SGVhZGVyQ2xhc3NDb2xvcihjb2x1bW5UeXBlOiBEaXNwbGF5VHlwZXMpOiBzdHJpbmcge1xyXG4gICAgbGV0IGNvbG9yZnVsID0gdGhpcy5sYXlvdXRIZWxwZXJTZXJ2aWNlLmxheW91dENvbmZpZ3VyYXRpb24uaXNDb2xvcmZ1bE1vZGVFbmFibGVkO1xyXG4gICAgaWYgKGNvbG9yZnVsID09PSB0cnVlKSB7XHJcbiAgICAgIGxldCBjb2xvckZvckludGVnZXJEaXNwbGF5ID0gRGlzcGxheVR5cGVDb2xvcnNbY29sdW1uVHlwZV0gfHwgJ3doaXRlLWdyaWQnO1xyXG4gICAgICAvL2FsZXJ0KGNvbHVtblR5cGUrY29sb3JGb3JJbnRlZ2VyRGlzcGxheSlcclxuICAgICAgcmV0dXJuIGNvbG9yRm9ySW50ZWdlckRpc3BsYXk7XHJcbiAgICB9IGVsc2UgcmV0dXJuICd3aGl0ZS1ncmlkJ1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbG9yZnVsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubGF5b3V0SGVscGVyU2VydmljZS5sYXlvdXRDb25maWd1cmF0aW9uLmlzQ29sb3JmdWxNb2RlRW5hYmxlZDtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbENvbHVtbnNQcm9jZXNzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZGV2aXNlU29jaWV0ZU51bU9mRGVjaW1hbDogbnVtYmVyID0gdGhpcy5hcHBTZXR0aW5nc1NlcnZpY2UuYXBwU2V0dGluZ3MuZGV2aXNlU29jaWV0ZS5ub21icmVEZWNpbWFsZXMgPz8gRGVmYXVsdFNvY2lldGVEZXZpc2Uubm9tYnJlRGVjaW1hbGVzO1xyXG5cclxuICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaCgoY29sOiBHcmlkQ29sdW1uKSA9PiB7XHJcbiAgICAgIC8vIHNldCBpc051bWVyaWNcclxuICAgICAgY29sLmlzTnVtZXJpYyA9IGNvbC50eXBlICE9IHVuZGVmaW5lZCAmJiBjb2wudHlwZSAhPSBudWxsICYmIChOdW1lcmljRGlzcGxheVR5cGVzLmluZGV4T2YoY29sLnR5cGUpID49IDApO1xyXG5cclxuICAgICAgLy8gc2V0IGZpbHRlcklucHV0VHlwZVxyXG4gICAgICBzd2l0Y2ggKGNvbC50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuREFURV9ESVNQTEFZOiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ2RhdGUnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlIERpc3BsYXlUeXBlcy5EQVRFVElNRV9ESVNQTEFZOiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ2RhdGUnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgRGlzcGxheVR5cGVzLklOVEVHRVJfRElTUExBWTpcclxuICAgICAgICBjYXNlIERpc3BsYXlUeXBlcy5SQVRFX0RJU1BMQVk6XHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9ESVNQTEFZOlxyXG4gICAgICAgIGNhc2UgRGlzcGxheVR5cGVzLkNVUlJFTkNZX09USEVSX0RJU1BMQVk6XHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuREVDSU1BTF9ESVNQTEFZOiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ251bWVyaWMnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlIERpc3BsYXlUeXBlcy5DSEVDS0JPWF9ESVNQTEFZOiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ2Jvb2xlYW4nO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICBjb2wuZmlsdGVySW5wdXRUeXBlID0gJ3RleHQnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IG51bU9mRGVjaW1hbFxyXG4gICAgICBpZiAoY29sLm51bU9mRGVjaW1hbCkgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKCFjb2wudHlwZSkge1xyXG4gICAgICAgIGNvbC5udW1PZkRlY2ltYWwgPSAwO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFjb2wuaXNOdW1lcmljKSB7XHJcbiAgICAgICAgY29sLm51bU9mRGVjaW1hbCA9IDA7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29sLnR5cGUgPT09IERpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVkpIHtcclxuICAgICAgICBjb2wubnVtT2ZEZWNpbWFsID0gZGV2aXNlU29jaWV0ZU51bU9mRGVjaW1hbDtcclxuXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29sLnR5cGUgPT09IERpc3BsYXlUeXBlcy5JTlRFR0VSX0RJU1BMQVkpIHtcclxuICAgICAgICBjb2wubnVtT2ZEZWNpbWFsID0gMDtcclxuXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcblxyXG5cclxuICB9XHJcbiAgaGFuZGxlQ2FsZW5kYXJFdmVudENsaWNrKGl0ZW06IGFueSkge1xyXG4gICAgaWYgKGl0ZW0ubW9kZSA9PT0gXCJTRUFSQ0hcIikge1xyXG4gICAgICB0aGlzLnNlYXJjaCgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FsZW5kYXJFdmVudENsaWNrLmVtaXQoaXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVEYXRlUmFuZ2VDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgbGV0IHN0YXJ0ID0gdGhpcy5zZWFyY2hGaWVsZHM/LmZpbmQoeCA9PiB4LmZpZWxkID09PSB0aGlzLmNhbGVuZGVyU2NoZW1hPy5zdGFydClcclxuICAgIGxldCBlbmQgPSB0aGlzLnNlYXJjaEZpZWxkcz8uZmluZCh4ID0+IHguZmllbGQgPT09IHRoaXMuY2FsZW5kZXJTY2hlbWE/LmVuZClcclxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcclxuICAgICAgc3RhcnQudmFsdWUgPSBldmVudC5zdGFydDtcclxuICAgICAgZW5kLnZhbHVlID0gZXZlbnQuZW5kO1xyXG4gICAgICBzdGFydC5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgIGVuZC5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VhcmNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYWxsU2VhcmNoSGFuZGxlcihldmVudDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5wYWdlZFJlcXVlc3QpIHtcclxuICAgICAgdGhpcy5wYWdlZFJlcXVlc3QubWF4UmVzdWx0Q291bnQgPSBldmVudC5tYXhSZXN1bHRDb3VudDtcclxuICAgICAgdGhpcy5wYWdlZFJlcXVlc3Quc2tpcENvdW50ID0gZXZlbnQuc2tpcENvdW50O1xyXG4gICAgICB0aGlzLnNlYXJjaCgpO1xyXG4gICAgICB0aGlzLnBhZ2UkLm5leHQoeyAuLi50aGlzLnBhZ2UgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRIZWFkZXJUaXRsZXModGl0bGVzOiBzdHJpbmdbXSwgaXRlbTogYW55KTogc3RyaW5nW10ge1xyXG4gICAgaWYgKCF0aXRsZXMgfHwgIWl0ZW0pXHJcbiAgICAgIHJldHVybiBbXTtcclxuXHJcbiAgICBjb25zdCBrZXkgPSBpdGVtLnVpZDtcclxuICAgIGlmICh0aGlzLnRpdGxlQ2FjaGUuaGFzKGtleSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMudGl0bGVDYWNoZS5nZXQoa2V5KSB8fCBbXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXMgPSB0aXRsZXMubWFwKHQgPT4gaXRlbVt0XSkuZmlsdGVyKHYgPT4gISF2KTtcclxuICAgIHRoaXMudGl0bGVDYWNoZS5zZXQoa2V5LCByZXMpO1xyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHN0YXR1czogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIG9uU3RhdHVzRmlsdGVyQ2hhbmdlZChldnQ6YW55KXtcclxuICAgIHRoaXMuc3RhdHVzID0gZXZ0O1xyXG4gICAgY29uc29sZS5sb2codGhpcy5zdGF0dXMpXHJcbiAgICB0aGlzLnNlYXJjaEZpZWxkcyA9IHRoaXMuc2VhcmNoRmllbGRzPy5maWx0ZXIoc2YgPT4gc2YuZmllbGQgIT09IHRoaXMuZW50aXR5SW5mbz8uc3RhdHVzQ29sdW1uTmFtZSk7XHJcbiAgICB0aGlzLnNlYXJjaEZpZWxkcz8ucHVzaCh7XHJcbiAgICAgIGZpZWxkOiB0aGlzLmVudGl0eUluZm8/LnN0YXR1c0NvbHVtbk5hbWUgPz8gXCJcIixcclxuICAgICAgdmFsdWU6IGV2dCxcclxuICAgICAgbGFiZWxWYWx1ZTogJycsXHJcbiAgICAgIHR5cGU6IElucHV0VHlwZXMuQ09NQk9CT1gsXHJcbiAgICAgIG9wZXJhdG9yIDogNixcclxuICAgICAgc3R5bGVDbGFzczogXCJoaWRkZW5cIlxyXG4gICAgfSk7ICAgIFxyXG4gIH0gXHJcblxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiY29sLTEyXCIgW0BzbGlkZUluT3V0XT1cInNob3dTZWFyY2hGaWVsZCA/ICdpbicgOiAnb3V0J1wiICpuZ0lmPVwic2hvd0dsb2JhbFNlYXJjaFwiPlxyXG4gICAgPCEtLSBTZWFyY2hCb3gvLyBJZiBleGlzdCAtLT5cclxuICAgIDx0c2ktc2VhcmNoLWJveCBcclxuICAgICAgW2lzUnRsTW9kZV09XCJpc1J0bE1vZGVcIiBcclxuICAgICAgWyhzZWFyY2hGaWVsZHMpXT1cInNlYXJjaEZpZWxkc1wiIFxyXG4gICAgICBbYnVzaW5lc3NDbGFzc109XCJidXNpbmVzc0NsYXNzXCJcclxuICAgICAgW2VudGl0eUluZm9dPVwiZW50aXR5SW5mb1wiXHJcbiAgICAgIChzZWFyY2hGaWVsZHNDaGFuZ2UpPVwic2VhcmNoRmllbGRzVmFsdWVDaGFuZ2VzKCRldmVudClcIiBcclxuICAgICAgKGtleXdvcmRWYWx1ZUNoYW5nZWQpPVwia2V5d29yZFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgKHNlYXJjaEZpZWxkc0FwcGxpZWQpPVwic2VhcmNoKCRldmVudClcIlxyXG4gICAgICAoc3RhdHVzRmlsdGVyQ2hhbmdlZCk9XCJvblN0YXR1c0ZpbHRlckNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgIChjb21ib0JveExhYmVsQ2hhbmdlZCk9XCJjY29tYm9Cb3hMYWJlbENoYW5nZWQoJGV2ZW50KVwiPlxyXG4gICAgPC90c2ktc2VhcmNoLWJveD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cIl9zaG93Q2FsZW5kZXJWaWV3ID09PSBmYWxzZSAmJiBfc2hvd0NhcmRWaWV3ID09PSBmYWxzZSAmJiBfc2hvd0thbmJhblZpZXcgPT09IGZhbHNlXCIgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIDxwLXRhYmxlICNkdCBbbGF6eV09XCJpc0dyaWREYXRhUGFnZWRJbkFwaVwiIFtsYXp5TG9hZE9uSW5pdF09XCJzZWFyY2hPbkluaXRcIiAob25MYXp5TG9hZCk9XCJsYXp5TG9hZCgkZXZlbnQpXCJcclxuICAgICAgZGF0YUtleT1cInt7IGtleSB9fVwiIFt0b3RhbFJlY29yZHNdPVwicGFnZS50b3RhbENvdW50XCIgW2xvYWRpbmddPVwicGFnZS5sb2FkaW5nXCIgW3Jlb3JkZXJhYmxlQ29sdW1uc109XCJ0cnVlXCJcclxuICAgICAgW3Jlc2l6YWJsZUNvbHVtbnNdPVwidHJ1ZVwiIGNvbHVtblJlc2l6ZU1vZGU9XCJleHBhbmRcIiBbY29sdW1uc109XCJzZWxlY3RlZENvbHVtbnNcIiBbdmFsdWVdPVwicGFnZS5pdGVtc1wiXHJcbiAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiIFtzY3JvbGxhYmxlXT1cInRydWVcIiBzY3JvbGxIZWlnaHQ9XCI2MDBweFwiIFsocm93cyldPVwicGFnZS5wYWdlU2l6ZVwiXHJcbiAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiIFtnbG9iYWxGaWx0ZXJGaWVsZHNdPVwiZmllbGRzKClcIiBbdGFibGVTdHlsZV09XCJ7ICdtaW4td2lkdGgnOiAnNTByZW0nIH1cIlxyXG4gICAgICBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie3sgJ1Nob3dpbmcnIHwgbG9jYWxpemUgfX0ge3tnZXRGaXJzdEVsZW1lbnRJbmRleCgpfX0ge3tcclxuICAgICAgICAndG8nIHwgbG9jYWxpemVcclxuICAgICAgfX0ge2xhc3R9IHt7ICdvZicgfCBsb2NhbGl6ZSB9fSBcclxuICAgICAge3RvdGFsUmVjb3Jkc30ge3sgJ2VudHJpZXMnIHwgbG9jYWxpemUgfX1cIiBbcm93c1BlclBhZ2VPcHRpb25zXT1cIlsxLCAxMCwgMjUsIDUwXVwiIFtzb3J0TW9kZV09XCJzb3J0TW9kZVwiXHJcbiAgICAgIFttdWx0aVNvcnRNZXRhXT1cInNvcnRNZXRhc1wiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1ncmlkbGluZXNcIiBbc2VsZWN0QWxsXT1cInNlbGVjdEFsbFwiXHJcbiAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cInNlbGVjdGlvbk1vZGVcIiBbKHNlbGVjdGlvbildPVwic2VsZWN0aW9uXCIgKG9uUm93VW5zZWxlY3QpPVwib25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpXCJcclxuICAgICAgKHNlbGVjdEFsbENoYW5nZSk9XCJvblNlbGVjdEFsbENoYW5nZSgkZXZlbnQpXCIgKG9uUm93U2VsZWN0KT1cIm9uU2VsZWN0ZWRJdGVtc0NoYW5nZWQoKVwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTJcIj5cclxuICAgICAgICAgICAge3sgaGVhZGVyIHwgbG9jYWxpemUgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTEgZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dGaWx0ZXJCdXR0b25cIiBwcmVzZW50YXRpb25EZXNpZ25lckJhc2U9XCJncmlkX3RvZ2dsZV9oZWFkZXJfZmlsdGVyc1wiPlxyXG4gICAgICAgICAgICAgIDxUc2ktQnV0dG9uIFtpY29uXT1cImZpbHRlckljb25cIiBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiBbdG9vbHRpcFRleHRdPVwiZmlsdGVyVG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1lbGVtZW50IGhvdmVyOnNoYWRvdy02IHAtYnV0dG9uLXByaW1hcnkgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVIZWFkZXJGaWx0ZXJzKClcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dIZWFkZXJGaWx0ZXJzXCIgcHJlc2VudGF0aW9uRGVzaWduZXJCYXNlPVwiZ3JpZF90b2dnbGVfaGVhZGVyX2ZpbHRlcl9tb2RlXCI+XHJcbiAgICAgICAgICAgICAgPFRzaS1CdXR0b24gW2ljb25dPVwiZmlsdGVyTW9kZUljb25cIiBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIlxyXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBUZXh0XT1cImZpbHRlck1vZGVUb29sdGlwXCIgW3N0eWxlQ2xhc3NdPVwiJ21sLTEgcC1idXR0b24tcHJpbWFyeSBwLWJ1dHRvbi1pY29uLW9ubHknXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVIZWFkZXJGaWx0ZXJzTW9kZSgpXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgcHJlc2VudGF0aW9uRGVzaWduZXJCYXNlPVwiZ3JpZF9jbGVhcl9maWx0ZXJfYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgPFRzaS1CdXR0b24gW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCIgW3Rvb2x0aXBUZXh0XT1cIidpY29uLWNsZWFyLWZpbHRlcidcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cIm1sLTEgcC1lbGVtZW50IGhvdmVyOnNoYWRvdy02IHAtYnV0dG9uLXByaW1hcnkgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsZWFyRmlsdGVycygpXCIgW2ljb25TcmNdPVwiJ2Fzc2V0cy9sYXlvdXQvaW1hZ2VzL2ljb24vaWNvbi1jbGVhci1maWx0ZXIuc3ZnJ1wiPlxyXG4gICAgICAgICAgICAgIDwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0V4cG9ydEJ1dHRvblwiIHByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZT1cImdyaWRfZXhwb3J0X2J1dHRvblwiPlxyXG4gICAgICAgICAgICAgIDxUc2ktQnV0dG9uIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLWZpbGUtZXhjZWxcIiAob25DbGljayk9XCJleHBvcnRFeGNlbCgpXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWVsZW1lbnQgcC1idXR0b24tc3VjY2VzcyBob3ZlcjpzaGFkb3ctNiBtbC0yIHAtMSBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCIgdG9vbHRpcFRleHQ9XCJYTFNcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgY2xhc3M9XCJtbC0xXCIgW29wdGlvbnNdPVwiY29sdW1uc1wiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb2x1bW5zXCIgb3B0aW9uTGFiZWw9XCJ0cmFuc2xhdGVkSGVhZGVyXCJcclxuICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zTGFiZWw9XCJ7MH0ge3sgJ2NvbHVtbnNfc2VsZWN0ZWQnIHwgbG9jYWxpemUgfX1cIiBbc3R5bGVdPVwieyAnbWluLXdpZHRoJzogJzE4MHB4JyB9XCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdjaG9vc2VfY29sdW1ucycgfCBsb2NhbGl6ZSB9fVwiIChvbkNoYW5nZSk9XCJvblNlbGVjdGVkQ29sdW1uc0NoYW5nZSgpXCI+XHJcbiAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gPGRpdj4gLS0+XHJcbiAgICAgICAgICA8IS0tIDxidXR0b24gKm5nSWY9XCJzaG93R2xvYmFsU2VhcmNoXCIgdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZSBpY29uPVwicGkgcGktc2VhcmNoXCIgKGNsaWNrKT1cInNlYXJjaCgpXCI+PC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgPCEtLSA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICA8dGggW25nU3R5bGVdPVwicGFnZS5pdGVtcy5sZW5ndGggPiAwID8gZ2V0Q2hlY2tib3hTdHlsZSgpIDoge31cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJwYWdlLmxvYWRpbmcgPyAnbm8tei1pbmRleCcgOiAnei1pbmRleC1jaGVja2JveCdcIiAqbmdJZj1cInNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZVwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogLjNyZW0gIWltcG9ydGFudDsgd2lkdGg6IDNyZW07XCI+XHJcbiAgICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveCAjdGFibGVIZWFkZXJDaGVja2JveD48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8IS0tIDx0aCBzY29wZT1cImNvbFwiIHN0eWxlPVwid2lkdGg6M3JlbVwiPjwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiBzdHlsZT1cIndpZHRoOjNyZW1cIj48L3RoPiAtLT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIFtzdHlsZV09XCJjb2wuc3R5bGVcIiBwVG9vbHRpcD1cInt7IGNvbC50b29sVGlwVGV4dCB8IGxvY2FsaXplIH19XCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uXT1cIiFjb2wuaXNCdXR0b24gPyBjb2wuZmllbGQgOiBudWxsXCJcclxuICAgICAgICAgICAgICBbcFJlc2l6YWJsZUNvbHVtbkRpc2FibGVkXT1cImNvbC5pc0J1dHRvbiB8fCBjb2wudHlwZSA9PT0gZGlzcGxheVR5cGVzLklNQUdFX0RJU1BMQVlcIlxyXG4gICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiY29sLmlzQnV0dG9uXCIgW3BSZW9yZGVyYWJsZUNvbHVtbkRpc2FibGVkXT1cImNvbC5pc0J1dHRvblwiIHBSZW9yZGVyYWJsZUNvbHVtblxyXG4gICAgICAgICAgICAgIHBSZXNpemFibGVDb2x1bW4gW25nU3R5bGVdPVwicGFnZS5pdGVtcy5sZW5ndGggPiAwID8gY29sLmhlYWRlckNvbHVtblN0eWxlIDoge31cIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jb2x1bW5dPVwiY29sLmlzQnV0dG9uXCIgW25nQ2xhc3NdPVwiW1xyXG4gICAgICAgICAgICAgICAgZ2V0SGVhZGVyQ2xhc3NDb2xvcihjb2wudHlwZSksXHJcbiAgICAgICAgICAgICAgICBwYWdlLmxvYWRpbmcgPyAnbm8tei1pbmRleCcgOiAnJyxcclxuICAgICAgICAgICAgICAgIGNvbC5pc0J1dHRvbiA/ICd3LTFyZW0nIDogJycsXHJcbiAgICAgICAgICAgICAgICAoY29sLmlzQnV0dG9uIHx8IGNvbC50eXBlID09PSBkaXNwbGF5VHlwZXMuSU1BR0VfRElTUExBWSkgPyAnbm9uLXJlc2l6YWJsZS1jb2x1bW4nIDogJydcclxuICAgICAgICAgICAgICBdXCIgW25nU3R5bGVdPVwicGFnZS5pdGVtcy5sZW5ndGggPiAwID8gY29sLmhlYWRlckNvbHVtblN0eWxlIDoge31cIj5cclxuICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInAtMCBtLTBcIj5cclxuICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNvbCBwLTAgbS0wXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3ctMXJlbSc6IGNvbC5pc0J1dHRvbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub3RJblNwZWNpZmllZENvbHVtbihjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbC5oZWFkZXIgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjb2wtZml4ZWQgcC0wIG0tMFwiIHN0eWxlPVwid2lkdGg6IDFyZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uIGNsYXNzPVwidy0xcmVtIG0tMCBwLTBcIiAqbmdJZj1cIm5vdEluU3BlY2lmaWVkQ29sdW1uKGNvbC5maWVsZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZD1cInt7IGNvbC5maWVsZCB9fVwiPjwvcC1zb3J0SWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICAgIDx0ciAqbmdJZj1cInNob3dIZWFkZXJGaWx0ZXJzXCI+XHJcbiAgICAgICAgICA8IS0tIDx0aCBzY29wZT1cImNvbFwiIHN0eWxlPVwid2lkdGg6M3JlbVwiPjwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiBzdHlsZT1cIndpZHRoOjNyZW1cIj48L3RoPiAtLT5cclxuICAgICAgICAgIDx0aCBbbmdDbGFzc109XCJwYWdlLmxvYWRpbmcgPyAnbm8tei1pbmRleCcgOiAnJ1wiICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlXCJcclxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNHJlbVwiPjwvdGg+XHJcbiAgICAgICAgICA8dGggc3R5bGU9XCJvdmVyZmxvdzogaW5oZXJpdFwiIHNjb3BlPVwiY29sXCIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlciBbdHlwZV09XCJjb2wuZmlsdGVySW5wdXRUeXBlXCIgW2ZpZWxkXT1cImNvbC5maWVsZFwiIFtkaXNwbGF5XT1cImNoYW5nZUhlYWRlckZpbHRlcnNNb2RlXCJcclxuICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwiY29sLm51bU9mRGVjaW1hbFwiIFttYXhGcmFjdGlvbkRpZ2l0c109XCJjb2wubnVtT2ZEZWNpbWFsXCIgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICBbbWF0Y2hNb2RlXT1cImZpbHRlck1hdGNoTW9kZS5FUVVBTFNcIj5cclxuICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtaXRlbSBsZXQtY29sdW1ucz1cImNvbHVtbnNcIiBsZXQtaW5kZXg9XCJyb3dJbmRleFwiPlxyXG4gICAgICAgIDwhLS0gQ0FTRSA6IG11bHRpcGxlIHNlbGVjdGlvbiAtLT5cclxuICAgICAgICA8dHIgW25nU3R5bGVdPVwiaXRlbS5jb2xvciAmJiBpdGVtLmNvbG9yICE9PSAnJyA/IHsnYmFja2dyb3VuZC1jb2xvcic6IGl0ZW0uY29sb3J9IDoge31cIiAqbmdJZj1cIlxyXG4gICAgICAgICAgICBzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGU7XHJcbiAgICAgICAgICAgIGVsc2Ugbm90TXVsdGlwbGVTZWxlY3Rpb25Nb2RlQmxvY2tcclxuICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgPHRkIFtuZ1N0eWxlXT1cInBhZ2UuaXRlbXMubGVuZ3RoID4gMCA/IGdldENoZWNrYm94U3R5bGUoKSA6IHt9XCIgc3R5bGU9XCJwYWRkaW5nOiAuM3JlbSAhaW1wb3J0YW50O1wiPlxyXG4gICAgICAgICAgICA8cC10YWJsZUNoZWNrYm94IFt2YWx1ZV09XCJpdGVtXCI+PC9wLXRhYmxlQ2hlY2tib3g+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPCEtLSA8dGQgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1wZW5jaWxcIiBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdChpdGVtKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXRyYXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlclwiIChjbGljayk9XCJkZWxldGUoaXRlbSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+IC0tPlxyXG4gICAgICAgICAgPHRkIFtuZ1N0eWxlXT1cInBhZ2UuaXRlbXMubGVuZ3RoID4gMCA/IGNvbC5uZ1N0eWxlIDoge31cIiBbbmdDbGFzc109XCJwYWdlLmxvYWRpbmcgPyAnbm8tei1pbmRleCcgOiAnJ1wiXHJcbiAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiBtaW4tY29udGVudDsgbWFyZ2luLWxlZnQ6IC0uNXJlbTtcIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktU29jaWV0ZS1JbnB1dCAtLT5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGN1cnJlbmN5T3RoZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LU90aGVyLUlucHV0IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5T3RoZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9PVEhFUl9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlIGRhdGVQaWNrZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeUNvZGVcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RhdGVQaWNrZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5EQVRFX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2UgY2hlY2tCb3hPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLURhdGUtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktRGF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktQ2hlY2tCb3ggLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tCb3hPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DSEVDS0JPWF9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlIGRlY2ltYWxPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUNoZWNrYm94LURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUNoZWNrYm94LURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1EZWNpbWFsLUlucHV0IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlY2ltYWxPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5ERUNJTUFMX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2UgaW50ZWdlck91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktRGVjaW1hbC1EaXNwbGF5IFtmb3JtYXREZWNpbWFsXT1cImNvbC5mb3JtYXREZWNpbWFsXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLURlY2ltYWwtRGlzcGxheT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLUludGVnZXIgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLklOVEVHRVJfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgZWxzZSByYXRlT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1JbnRlZ2VyLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLVJhdGUtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmF0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLlJBVEVfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgZWxzZSBkaXNwbGF5TmVzdGVkUHJvcE91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLVJhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gZGlzcGxheS1uZXN0ZWQtcHJvcCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5TmVzdGVkUHJvcE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLk5FU1RFRF9QUk9QX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2UgZGlzcGxheUJ1dHRvbkJsb2NrXHJcbiAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktRGlzcGxheS1OZXN0ZWQtUHJvcCBbc291cmNlVXJsXT1cImNvbC5kaXNwbGF5TmVzdGVkUHJvcGVydHlTb3VyY2VVcmxcIiBbaWRdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlWYWx1ZV09XCJjb2wuZGlzcGxheU5lc3RlZFByb3BlcnR5bGFiZWxGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktRGlzcGxheS1OZXN0ZWQtUHJvcD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gZGlzcGxheS1uZXN0ZWQtcHJvcCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5QnV0dG9uQmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5pc0J1dHRvbjsgZWxzZSBkaXNwbGF5VGV4dEV5ZUJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24taXRlbXMtY2VudGVyIGZyb3plbi1jb2x1bW4tcnRsLW1vZGUganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1CdXR0b24gW3N0eWxlQ2xhc3NdPVwiY29sLnN0eWxlQ2xhc3NcIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInt7IGNvbC5idXR0b25JY29uIH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiBbdG9vbHRpcFRleHRdPVwiY29sLnRvb2xUaXBUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJjb2wuYnV0dG9uTGFiZWwgPyBjb2wuYnV0dG9uTGFiZWwgOiBpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJidXR0b25DbGlja2VkKGl0ZW0sIGNvbC5maWVsZClcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gZGlzcGxheS10ZXh0LWV5ZSAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5VGV4dEV5ZUJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLlRFWFRfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgZWxzZSBkZWZhdWx0VGV4dE91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLVRleHQtQm94IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZXh0T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgICA8IS0tIENBU0UgOiBzaW5nbGUgb3Igbm9uZSBzZWxlY3Rpb24gLS0+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub3RNdWx0aXBsZVNlbGVjdGlvbk1vZGVCbG9jaz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDx0ciBbbmdTdHlsZV09XCJpdGVtLmNvbG9yICYmIGl0ZW0uY29sb3IgIT09ICcnID8geydiYWNrZ3JvdW5kLWNvbG9yJzogaXRlbS5jb2xvcn0gOiB7fVwiXHJcbiAgICAgICAgICAgICAgW3BTZWxlY3RhYmxlUm93XT1cIml0ZW1cIiBbcFNlbGVjdGFibGVSb3dJbmRleF09XCJpbmRleFwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gPHRkIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktcGVuY2lsXCIgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXQoaXRlbSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS10cmFzaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXJcIiAoY2xpY2spPVwiZGVsZXRlKGl0ZW0pXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3RkPiAtLT5cclxuICAgICAgICAgICAgICA8dGQgW25nU3R5bGVdPVwicGFnZS5pdGVtcy5sZW5ndGggPiAwID8gY29sLm5nU3R5bGUgOiB7fVwiIHN0eWxlPVwiaGVpZ2h0OiBtaW4tY29udGVudDtcIlxyXG4gICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgJ25vLXotaW5kZXgnOiBwYWdlLmxvYWRpbmcsXHJcbiAgICAgICAgICAgICAgICAgICd3LTFyZW0nOiBjb2wuaXNCdXR0b25cclxuICAgICAgICAgICAgICAgIH1cIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gW25nQ2xhc3NdPVwicGFnZS5sb2FkaW5nID8gJ25vLXotaW5kZXgnIDogJydcIiAtLT5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQgLS0+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LU90aGVyLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9PVEhFUl9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSBkYXRlUGlja2VyT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeUNvZGVcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1EYXRlLVBpY2tlciAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuREFURV9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSBkYXRlVGltZVBpY2tlck91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EYXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1EYXRlLVBpY2tlciAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVRpbWVQaWNrZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkRBVEVUSU1FX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIGNoZWNrQm94T3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiIFtzaG93VGltZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktRGF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUNoZWNrQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja0JveE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuQ0hFQ0tCT1hfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGVjaW1hbE91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DaGVja2JveC1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ2hlY2tib3gtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLURlY2ltYWwtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlY2ltYWxPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkRFQ0lNQUxfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaW50ZWdlck91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLURpc3BsYXkgW2Zvcm1hdERlY2ltYWxdPVwiY29sLmZvcm1hdERlY2ltYWxcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpbnRlZ2VyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5JTlRFR0VSX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJhdGVPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlci1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktSW50ZWdlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktUmF0ZS1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmF0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuUkFURV9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSBkaXNwbGF5TmVzdGVkUHJvcE91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1SYXRlLURpc3BsYXkgW2lzRnJhY3Rpb25dPVwiY29sLmlzRnJhY3Rpb25cIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLVJhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gZGlzcGxheS1uZXN0ZWQtcHJvcCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheU5lc3RlZFByb3BPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLk5FU1RFRF9QUk9QX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRpc3BsYXlCdXR0b25CbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktRGlzcGxheS1OZXN0ZWQtUHJvcCBbc291cmNlVXJsXT1cImNvbC5kaXNwbGF5TmVzdGVkUHJvcGVydHlTb3VyY2VVcmxcIiBbaWRdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5VmFsdWVdPVwiY29sLmRpc3BsYXlOZXN0ZWRQcm9wZXJ0eWxhYmVsRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EaXNwbGF5LU5lc3RlZC1Qcm9wPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5LW5lc3RlZC1wcm9wIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5QnV0dG9uQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNCdXR0b247IGVsc2UgZGlzcGxheUltYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJwYWdlLml0ZW1zLmxlbmd0aCA+IDAgPyBjb2wubmdTdHlsZSA6IHt9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInBhZ2UubG9hZGluZyA/ICduby16LWluZGV4JyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZnJvemVuLWNvbHVtbi1ydGwtbW9kZSBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFRzaS1CdXR0b24gW3N0eWxlQ2xhc3NdPVwiY29sLnN0eWxlQ2xhc3NcIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInt7IGNvbC5idXR0b25JY29uIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCIgW3Rvb2x0aXBUZXh0XT1cImNvbC50b29sVGlwVGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJidXR0b25DbGlja2VkKGl0ZW0sIGNvbC5maWVsZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJjb2wuYnV0dG9uTGFiZWwgPyBjb2wuYnV0dG9uTGFiZWwgOiBpdGVtW2NvbC5maWVsZF1cIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktaW1hZ2UgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlJbWFnZT5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5JTUFHRV9ESVNQTEFZOyBlbHNlIGRpc3BsYXlUZXh0RXllQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC0zcmVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dHNpLWltYWdlLWRpc3BsYXkgW2hlYWRlclRpdGxlc109XCJnZXRIZWFkZXJUaXRsZXMoY29sLmhlYWRlclRpdGxlcywgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNSb3VuZGVkXT1cImNvbC5pc1JvdW5kZWRcIiBbc3JjXT1cIml0ZW1bY29sLmZpZWxkXVwiIFthbHRdPVwiY29sLmhlYWRlciB8fCAnaW1hZ2UnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzEwMCUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RzaS1pbWFnZS1kaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5LXRleHQtZXllIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5VGV4dEV5ZUJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuVEVYVF9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWZhdWx0VGV4dE91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHBpIHBpLWV5ZVwiIChjbGljayk9XCJleWVDbGlja2VkKGl0ZW1bY29sLmZpZWxkXSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyB0cnVuY2F0ZVN0cmluZyhpdGVtW2NvbC5maWVsZF0sIDUwKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRleHQtQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgaXRlbVtjb2wuZmllbGRdIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIj48L3RkPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwicHItMFwiICpuZ0Zvcj1cImxldCBjb2wgb2Ygc2VsZWN0ZWRDb2x1bW5zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuc2hvd1N1bW1hcnlcIj5cclxuICAgICAgICAgICAgICA8IS0tIENVUlJFTkNZX1NPQ0lFVEVfRElTUExBWSAtLT5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBJTlRFR0VSX0RJU1BMQVkgLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5JTlRFR0VSX0RJU1BMQVlcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlci1EaXNwbGF5IFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1JbnRlZ2VyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gUkFURV9ESVNQTEFZIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuUkFURV9ESVNQTEFZXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLVJhdGUtRGlzcGxheSBbaXNGcmFjdGlvbl09XCJjb2wuaXNGcmFjdGlvbiA/PyBmYWxzZVwiIFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gREVDSU1BTF9ESVNQTEFZIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuREVDSU1BTF9ESVNQTEFZXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtRGlzcGxheSBbZm9ybWF0RGVjaW1hbF09XCJjb2wuZm9ybWF0RGVjaW1hbFwiIFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wuZmllbGQpXCJcclxuICAgICAgICAgICAgICAgICAgW251bU9mRGVjaW1hbF09XCJjb2wubnVtT2ZEZWNpbWFsXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfT1RIRVJfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5IFtjdXJyZW5jeV09XCJjb2wuY3VycmVuY3lPdGhlckNvZGVcIiBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sLmZpZWxkKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJzdW1tYXJ5XCI+XHJcbiAgICAgICAge3sgcGFnZS50b3RhbENvdW50IH19IHt7IFwicmVjb3Jkc19sYWJlbFwiIHwgbG9jYWxpemUgfX1cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImNvbG9yZnVsXCI+XHJcbiAgICAgICAgICA8c3Bhbj5WaWV3IEdyaWQ8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj58IFNlYXJjaE9uSW5pdCA6IHt7IHNlYXJjaE9uSW5pdCB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPnwgUGFnaW5hdGlvbiBJbiBBcGkgOiB7eyBpc0dyaWREYXRhUGFnZWRJbkFwaSB9fTwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L3AtdGFibGU+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJfc2hvd0NhbGVuZGVyVmlldyA9PT0gdHJ1ZVwiIGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICA8dHNpLWNhbGVuZGVyIFtzY2hlbWFdPVwiY2FsZW5kZXJTY2hlbWFcIiBbZXZlbnRzRGF0YV09XCJwYWdlLml0ZW1zXCIgW2NydWRTZXJ2aWNlXT1cImNydWRTZXJ2aWNlXCJcclxuICAgICAgKGRhdGVSYW5nZUNoYW5nZSk9XCJoYW5kbGVEYXRlUmFuZ2VDaGFuZ2UoJGV2ZW50KVwiIChldmVudENsaWNrKT1cImhhbmRsZUNhbGVuZGFyRXZlbnRDbGljaygkZXZlbnQpXCI+PC90c2ktY2FsZW5kZXI+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJfc2hvd0NhcmRWaWV3ID09PSB0cnVlXCIgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIDxUc2ktY2FyZC1saXN0IFtjYXJkQnVzaW5lc3NDbGFzc109XCJidXNpbmVzc0NsYXNzXCIgW2lkXT1cImlkXCIgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ29sdW1uQ2xpY2tlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICBbcGFnZSRdPVwicGFnZSRcIiBbcGFnZV09XCJwYWdlXCIgKGNhbGxTZWFyY2gpPVwiY2FsbFNlYXJjaEhhbmRsZXIoJGV2ZW50KVwiPlxyXG4gICAgPC9Uc2ktY2FyZC1saXN0PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwiX3Nob3dLYW5iYW5WaWV3ID09PSB0cnVlXCIgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIDxUc2kta2FuYmFuIFtjYXJkQnVzaW5lc3NDbGFzc109XCJidXNpbmVzc0NsYXNzXCIgW2lkXT1cImlkXCIgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ29sdW1uQ2xpY2tlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICBbcGFnZSRdPVwicGFnZSRcIiBbcGFnZV09XCJwYWdlXCIgKGNhbGxTZWFyY2gpPVwiY2FsbFNlYXJjaEhhbmRsZXIoJGV2ZW50KVwiIFtjcnVkU2VydmljZV09XCJjcnVkU2VydmljZVwiPlxyXG4gICAgPC9Uc2kta2FuYmFuPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=