@fundamental-ngx/platform 0.47.4 → 0.48.0-rc.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 (457) hide show
  1. package/README.md +0 -28
  2. package/esm2022/approval-flow/approval-flow-add-node/approval-flow-add-node.component.mjs +6 -11
  3. package/esm2022/approval-flow/approval-flow-approver-details/approval-flow-approver-details.component.mjs +6 -8
  4. package/esm2022/approval-flow/approval-flow-messages/approval-flow-messages.component.mjs +5 -6
  5. package/esm2022/approval-flow/approval-flow-node/approval-flow-drop-zone.directive.mjs +5 -5
  6. package/esm2022/approval-flow/approval-flow-node/approval-flow-node.component.mjs +8 -11
  7. package/esm2022/approval-flow/approval-flow-select-type/approval-flow-select-type.component.mjs +6 -8
  8. package/esm2022/approval-flow/approval-flow-team-list/approval-flow-team-list.component.mjs +5 -7
  9. package/esm2022/approval-flow/approval-flow-toolbar-actions/approval-flow-toolbar-actions.component.mjs +5 -6
  10. package/esm2022/approval-flow/approval-flow-user-details/approval-flow-user-details.component.mjs +6 -6
  11. package/esm2022/approval-flow/approval-flow-user-list/approval-flow-user-list.component.mjs +6 -7
  12. package/esm2022/approval-flow/approval-flow.component.mjs +8 -10
  13. package/esm2022/approval-flow/approval-flow.module.mjs +4 -4
  14. package/esm2022/approval-flow/services/approval-flow-add-node-view.service.mjs +3 -3
  15. package/esm2022/button/button.component.mjs +5 -5
  16. package/esm2022/button/button.module.mjs +4 -4
  17. package/esm2022/dynamic-page/directives/dynamic-page-header-subtitle.directive.mjs +3 -3
  18. package/esm2022/dynamic-page/directives/dynamic-page-header-title.directive.mjs +3 -3
  19. package/esm2022/dynamic-page/dynamic-page-content/dynamic-page-content-host.component.mjs +5 -5
  20. package/esm2022/dynamic-page/dynamic-page-content/dynamic-page-content.component.mjs +5 -5
  21. package/esm2022/dynamic-page/dynamic-page-footer/dynamic-page-footer.component.mjs +3 -3
  22. package/esm2022/dynamic-page/dynamic-page-header/actions/global-actions/dynamic-page-global-actions.component.mjs +3 -3
  23. package/esm2022/dynamic-page/dynamic-page-header/actions/layout-actions/dynamic-page-layout-actions.component.mjs +3 -3
  24. package/esm2022/dynamic-page/dynamic-page-header/header/dynamic-page-header.component.mjs +4 -4
  25. package/esm2022/dynamic-page/dynamic-page-header/key-info/dynamic-page-key-info.component.mjs +3 -3
  26. package/esm2022/dynamic-page/dynamic-page-header/title/dynamic-page-title-image.component.mjs +3 -3
  27. package/esm2022/dynamic-page/dynamic-page-header/title/dynamic-page-title.component.mjs +3 -3
  28. package/esm2022/dynamic-page/dynamic-page.component.mjs +8 -10
  29. package/esm2022/dynamic-page/dynamic-page.config.mjs +4 -4
  30. package/esm2022/dynamic-page/dynamic-page.module.mjs +4 -4
  31. package/esm2022/dynamic-page/dynamic-page.service.mjs +3 -3
  32. package/esm2022/feed-input/feed-input.component.mjs +6 -7
  33. package/esm2022/feed-input/feed-input.module.mjs +4 -4
  34. package/esm2022/form/auto-complete/auto-complete.directive.mjs +5 -5
  35. package/esm2022/form/auto-complete/auto-complete.module.mjs +4 -4
  36. package/esm2022/form/checkbox/checkbox.component.mjs +6 -6
  37. package/esm2022/form/checkbox/checkbox.module.mjs +4 -4
  38. package/esm2022/form/checkbox-group/checkbox-group.component.mjs +8 -8
  39. package/esm2022/form/checkbox-group/checkbox-group.module.mjs +4 -4
  40. package/esm2022/form/combobox/combobox/combobox.component.mjs +9 -11
  41. package/esm2022/form/combobox/combobox-mobile/combobox/combobox-mobile.component.mjs +13 -15
  42. package/esm2022/form/combobox/combobox-mobile/combobox-mobile.module.mjs +4 -4
  43. package/esm2022/form/combobox/combobox.config.mjs +4 -4
  44. package/esm2022/form/combobox/combobox.module.mjs +4 -4
  45. package/esm2022/form/combobox/commons/base-combobox.mjs +8 -6
  46. package/esm2022/form/combobox/directives/combobox-item.directive.mjs +15 -15
  47. package/esm2022/form/date-picker/date-picker.component.mjs +6 -6
  48. package/esm2022/form/date-picker/date-picker.module.mjs +4 -4
  49. package/esm2022/form/datetime-picker/datetime-picker.component.mjs +6 -6
  50. package/esm2022/form/datetime-picker/datetime-picker.module.mjs +4 -4
  51. package/esm2022/form/form-generator/base-dynamic-form-generator-control.mjs +3 -3
  52. package/esm2022/form/form-generator/controls/dynamic-form-generator-checkbox/dynamic-form-generator-checkbox.component.mjs +4 -4
  53. package/esm2022/form/form-generator/controls/dynamic-form-generator-datepicker/dynamic-form-generator-datepicker.component.mjs +4 -4
  54. package/esm2022/form/form-generator/controls/dynamic-form-generator-editor/dynamic-form-generator-editor.component.mjs +4 -4
  55. package/esm2022/form/form-generator/controls/dynamic-form-generator-input/dynamic-form-generator-input.component.mjs +6 -7
  56. package/esm2022/form/form-generator/controls/dynamic-form-generator-multi-input/dynamic-form-generator-multi-input.component.mjs +4 -4
  57. package/esm2022/form/form-generator/controls/dynamic-form-generator-object-status/dynamic-form-generator-object-status.component.mjs +3 -3
  58. package/esm2022/form/form-generator/controls/dynamic-form-generator-radio/dynamic-form-generator-radio.component.mjs +4 -4
  59. package/esm2022/form/form-generator/controls/dynamic-form-generator-select/dynamic-form-generator-select.component.mjs +4 -4
  60. package/esm2022/form/form-generator/controls/dynamic-form-generator-switch/dynamic-form-generator-switch.component.mjs +4 -4
  61. package/esm2022/form/form-generator/dynamic-form-control-field.directive.mjs +5 -5
  62. package/esm2022/form/form-generator/dynamic-form-control.directive.mjs +6 -6
  63. package/esm2022/form/form-generator/fdp-form-generator.module.mjs +4 -4
  64. package/esm2022/form/form-generator/form-generator/form-generator.component.mjs +9 -11
  65. package/esm2022/form/form-generator/form-generator-components-accessor.service.mjs +3 -3
  66. package/esm2022/form/form-generator/form-generator-field/form-generator-field.component.mjs +7 -8
  67. package/esm2022/form/form-generator/form-generator.service.mjs +5 -5
  68. package/esm2022/form/form-generator/pipes/get-hint-options.pipe.mjs +5 -5
  69. package/esm2022/form/form-generator/pipes/get-ordered-form-controls.pipe.mjs +3 -3
  70. package/esm2022/form/form-group/fdp-form.module.mjs +4 -4
  71. package/esm2022/form/form-group/form-field/form-field.component.mjs +10 -10
  72. package/esm2022/form/form-group/form-field-error/form-field-error-description.directive.mjs +6 -6
  73. package/esm2022/form/form-group/form-field-error/form-field-error-heading.directive.mjs +6 -6
  74. package/esm2022/form/form-group/form-field-error/form-field-error.directive.mjs +5 -5
  75. package/esm2022/form/form-group/form-field-extras/form-field-extras.component.mjs +3 -3
  76. package/esm2022/form/form-group/form-field-group/form-field-group.component.mjs +6 -6
  77. package/esm2022/form/form-group/form-group-header/form-group-header.component.mjs +6 -6
  78. package/esm2022/form/form-group/form-group.component.mjs +8 -10
  79. package/esm2022/form/form-group/pipes/field-group-row-value.pipe.mjs +3 -3
  80. package/esm2022/form/form-group/services/form-field-layout.service.mjs +5 -5
  81. package/esm2022/form/index.mjs +1 -3
  82. package/esm2022/form/input/fdp-input.module.mjs +4 -4
  83. package/esm2022/form/input/input.component.mjs +6 -6
  84. package/esm2022/form/input-group/addon-body.component.mjs +5 -5
  85. package/esm2022/form/input-group/addon.component.mjs +5 -5
  86. package/esm2022/form/input-group/input-group.component.mjs +12 -12
  87. package/esm2022/form/input-group/input-group.config.mjs +4 -4
  88. package/esm2022/form/input-group/input-group.module.mjs +4 -4
  89. package/esm2022/form/input-group/input.component.mjs +3 -3
  90. package/esm2022/form/input-message-group-with-template/input-message-group-with-template.component.mjs +7 -7
  91. package/esm2022/form/multi-combobox/commons/base-multi-combobox.mjs +6 -6
  92. package/esm2022/form/multi-combobox/multi-combobox/multi-combobox.component.mjs +10 -12
  93. package/esm2022/form/multi-combobox/multi-combobox-mobile/multi-combobox/multi-combobox-mobile.component.mjs +8 -9
  94. package/esm2022/form/multi-combobox/multi-combobox-mobile/multi-combobox-mobile.module.mjs +4 -4
  95. package/esm2022/form/multi-combobox/multi-combobox.config.mjs +4 -4
  96. package/esm2022/form/multi-combobox/multi-combobox.module.mjs +4 -4
  97. package/esm2022/form/multi-input/base-multi-input.mjs +6 -6
  98. package/esm2022/form/multi-input/multi-input-mobile/multi-input-mobile.component.mjs +12 -12
  99. package/esm2022/form/multi-input/multi-input-mobile/multi-input-mobile.module.mjs +4 -4
  100. package/esm2022/form/multi-input/multi-input.component.mjs +9 -11
  101. package/esm2022/form/multi-input/multi-input.config.mjs +4 -4
  102. package/esm2022/form/multi-input/multi-input.module.mjs +4 -4
  103. package/esm2022/form/radio-group/radio/radio.component.mjs +8 -8
  104. package/esm2022/form/radio-group/radio-group.component.mjs +8 -8
  105. package/esm2022/form/radio-group/radio-group.module.mjs +4 -4
  106. package/esm2022/form/select/commons/base-select.mjs +6 -6
  107. package/esm2022/form/select/select/select.component.mjs +8 -8
  108. package/esm2022/form/select/select.config.mjs +4 -4
  109. package/esm2022/form/select/select.module.mjs +4 -4
  110. package/esm2022/form/step-input/base.step-input.mjs +5 -5
  111. package/esm2022/form/step-input/number/number-step-input.component.mjs +9 -10
  112. package/esm2022/form/step-input/step-input-action-button.mjs +3 -3
  113. package/esm2022/form/step-input/step-input-control.directive.mjs +6 -6
  114. package/esm2022/form/step-input/step-input-decrement.directive.mjs +5 -5
  115. package/esm2022/form/step-input/step-input-increment.directive.mjs +5 -5
  116. package/esm2022/form/step-input/step-input.config.mjs +3 -3
  117. package/esm2022/form/step-input/step-input.module.mjs +4 -4
  118. package/esm2022/form/switch/switch/switch.component.mjs +6 -6
  119. package/esm2022/form/switch/switch/switch.config.mjs +3 -3
  120. package/esm2022/form/switch/switch.module.mjs +4 -4
  121. package/esm2022/form/text-area/text-area.component.mjs +8 -9
  122. package/esm2022/form/text-area/text-area.config.mjs +3 -3
  123. package/esm2022/form/text-area/text-area.module.mjs +4 -4
  124. package/esm2022/form/time-picker/time-picker.component.mjs +6 -6
  125. package/esm2022/form/time-picker/time-picker.module.mjs +4 -4
  126. package/esm2022/fundamental-ngx.module.mjs +14 -33
  127. package/esm2022/icon-tab-bar/components/closable-icon-tab-bar.class.mjs +3 -3
  128. package/esm2022/icon-tab-bar/components/icon-tab-bar-base.class.mjs +5 -9
  129. package/esm2022/icon-tab-bar/components/icon-tab-bar-filter-type/icon-tab-bar-filter-type.component.mjs +6 -8
  130. package/esm2022/icon-tab-bar/components/icon-tab-bar-icon-type/icon-tab-bar-icon-type.component.mjs +6 -8
  131. package/esm2022/icon-tab-bar/components/icon-tab-bar-process-type/icon-tab-bar-process-type.component.mjs +5 -8
  132. package/esm2022/icon-tab-bar/components/icon-tab-bar-text-type/icon-tab-bar-text-type.component.mjs +7 -9
  133. package/esm2022/icon-tab-bar/components/popovers/icon-tab-bar-popover/icon-tab-bar-popover.component.mjs +6 -15
  134. package/esm2022/icon-tab-bar/components/popovers/icon-tab-bar-popover-base.class.mjs +5 -9
  135. package/esm2022/icon-tab-bar/components/popovers/text-type-popover/text-type-popover.component.mjs +6 -8
  136. package/esm2022/icon-tab-bar/directives/dnd/icon-bar-dnd-container.directive.mjs +5 -5
  137. package/esm2022/icon-tab-bar/directives/dnd/icon-bar-dnd-item.directive.mjs +5 -5
  138. package/esm2022/icon-tab-bar/directives/dnd/icon-bar-dnd-list.directive.mjs +5 -5
  139. package/esm2022/icon-tab-bar/icon-tab-bar.component.mjs +8 -9
  140. package/esm2022/icon-tab-bar/icon-tab-bar.module.mjs +4 -4
  141. package/esm2022/index.mjs +8 -12
  142. package/esm2022/info-label/info-label.component.mjs +5 -5
  143. package/esm2022/info-label/info-label.module.mjs +4 -4
  144. package/esm2022/link/link.component.mjs +5 -5
  145. package/esm2022/link/link.module.mjs +4 -4
  146. package/esm2022/list/action-list-item/action-list-item.component.mjs +3 -3
  147. package/esm2022/list/action-list-item/action-list-item.module.mjs +4 -4
  148. package/esm2022/list/base-list-item.mjs +11 -11
  149. package/esm2022/list/display-list-item/display-list-item.component.mjs +6 -7
  150. package/esm2022/list/display-list-item/display-list-item.module.mjs +4 -4
  151. package/esm2022/list/free-content-list-item/free-content-list-item.component.mjs +4 -4
  152. package/esm2022/list/list-group-footer.component.mjs +3 -3
  153. package/esm2022/list/list-group-header.component.mjs +3 -3
  154. package/esm2022/list/list.component.mjs +9 -11
  155. package/esm2022/list/list.config.mjs +3 -3
  156. package/esm2022/list/list.module.mjs +4 -4
  157. package/esm2022/list/load-more-content.directive.mjs +4 -4
  158. package/esm2022/list/object-list-item/object-list-item-row.component.mjs +4 -4
  159. package/esm2022/list/object-list-item/object-list-item.component.mjs +6 -7
  160. package/esm2022/list/object-list-item/object-list-item.module.mjs +4 -4
  161. package/esm2022/list/standard-list-item/standard-list-item.component.mjs +6 -7
  162. package/esm2022/list/standard-list-item/standard-list-item.module.mjs +4 -4
  163. package/esm2022/menu/menu-item.component.mjs +7 -7
  164. package/esm2022/menu/menu-trigger.directive.mjs +6 -6
  165. package/esm2022/menu/menu.component.mjs +6 -6
  166. package/esm2022/menu/menu.module.mjs +4 -4
  167. package/esm2022/menu-button/menu-button.component.mjs +5 -5
  168. package/esm2022/menu-button/menu-button.module.mjs +4 -4
  169. package/esm2022/message-popover/components/message-popover-form-wrapper/message-popover-form-wrapper.component.mjs +6 -6
  170. package/esm2022/message-popover/components/message-view/message-view.component.mjs +8 -10
  171. package/esm2022/message-popover/directives/message-popover-form-item.directive.mjs +6 -6
  172. package/esm2022/message-popover/message-popover.component.mjs +7 -9
  173. package/esm2022/message-popover/platform-message-popover.module.mjs +4 -4
  174. package/esm2022/object-marker/object-marker.component.mjs +6 -7
  175. package/esm2022/object-marker/object-marker.module.mjs +4 -4
  176. package/esm2022/object-status/object-status.component.mjs +8 -8
  177. package/esm2022/object-status/object-status.module.mjs +4 -4
  178. package/esm2022/page-footer/page-footer.component.mjs +6 -6
  179. package/esm2022/page-footer/page-footer.module.mjs +4 -4
  180. package/esm2022/panel/panel-actions.component.mjs +3 -3
  181. package/esm2022/panel/panel-content/panel-content.component.mjs +4 -4
  182. package/esm2022/panel/panel.component.mjs +5 -5
  183. package/esm2022/panel/panel.config.mjs +4 -4
  184. package/esm2022/panel/panel.module.mjs +4 -4
  185. package/esm2022/search-field/search-field-mobile/search-field/search-field-mobile.component.mjs +8 -9
  186. package/esm2022/search-field/search-field-mobile/search-field-mobile.module.mjs +4 -4
  187. package/esm2022/search-field/search-field.component.mjs +16 -18
  188. package/esm2022/search-field/search-field.module.mjs +4 -4
  189. package/esm2022/settings-generator/controls/theme-selector-list/theme-selector-list.component.mjs +9 -16
  190. package/esm2022/settings-generator/layouts/base-settings-generator-layout.mjs +3 -3
  191. package/esm2022/settings-generator/layouts/settings-generator-sidebar-layout/settings-generator-sidebar-icon/settings-generator-sidebar-icon.component.mjs +5 -6
  192. package/esm2022/settings-generator/layouts/settings-generator-sidebar-layout/settings-generator-sidebar-layout.component.mjs +6 -9
  193. package/esm2022/settings-generator/settings-generator-content/settings-generator-content.component.mjs +6 -8
  194. package/esm2022/settings-generator/settings-generator-content/settings-generator-section/settings-generator-section.component.mjs +7 -7
  195. package/esm2022/settings-generator/settings-generator-layout-accessor.service.mjs +3 -3
  196. package/esm2022/settings-generator/settings-generator.component.mjs +9 -9
  197. package/esm2022/settings-generator/settings-generator.module.mjs +4 -4
  198. package/esm2022/settings-generator/settings-generator.service.mjs +4 -4
  199. package/esm2022/shared/base.mjs +5 -5
  200. package/esm2022/shared/form/base.input.mjs +6 -6
  201. package/esm2022/shared/form/collection-base.input.mjs +6 -6
  202. package/esm2022/shared/form/inline-layout-collection-base.input.mjs +13 -13
  203. package/esm2022/shared/pipes/convert-bytes/convert-bytes.pipe.mjs +3 -3
  204. package/esm2022/shared/pipes/pipe.module.mjs +4 -4
  205. package/esm2022/shared/platform.config.mjs +3 -3
  206. package/esm2022/slider/slider.component.mjs +6 -6
  207. package/esm2022/slider/slider.module.mjs +4 -4
  208. package/esm2022/smart-filter-bar/components/smart-filter-bar-condition-field/base-smart-filter-bar-condition-field.mjs +4 -4
  209. package/esm2022/smart-filter-bar/components/smart-filter-bar-condition-field/smart-filter-bar-condition-field.component.mjs +4 -4
  210. package/esm2022/smart-filter-bar/components/smart-filter-bar-conditions-dialog/smart-filter-bar-conditions-dialog.component.mjs +6 -9
  211. package/esm2022/smart-filter-bar/components/smart-filter-bar-settings-dialog/smart-filter-bar-settings-dialog.component.mjs +7 -9
  212. package/esm2022/smart-filter-bar/directives/smart-filter-bar-field-definition.directive.mjs +3 -3
  213. package/esm2022/smart-filter-bar/directives/smart-filter-bar-subject.directive.mjs +5 -5
  214. package/esm2022/smart-filter-bar/directives/smart-filter-bar-toolbar-item.directive.mjs +4 -4
  215. package/esm2022/smart-filter-bar/smart-filter-bar.class.mjs +3 -3
  216. package/esm2022/smart-filter-bar/smart-filter-bar.component.mjs +8 -10
  217. package/esm2022/smart-filter-bar/smart-filter-bar.module.mjs +4 -4
  218. package/esm2022/smart-filter-bar/smart-filter-bar.service.mjs +4 -4
  219. package/esm2022/split-menu-button/split-menu-button.component.mjs +6 -6
  220. package/esm2022/split-menu-button/split-menu-button.module.mjs +4 -4
  221. package/esm2022/table/components/no-data-wrapper/no-data-wrapper.component.mjs +3 -3
  222. package/esm2022/table/components/reset-button/reset-button.component.mjs +5 -5
  223. package/esm2022/table/components/table-cell-header-popover/table-cell-header-popover.component.mjs +6 -8
  224. package/esm2022/table/components/table-column/table-column.component.mjs +6 -6
  225. package/esm2022/table/components/table-column-resizer/table-column-resizer.component.mjs +6 -6
  226. package/esm2022/table/components/table-editable-cell/table-editable-cell.component.mjs +5 -15
  227. package/esm2022/table/components/table-group-row/table-group-row.component.mjs +7 -7
  228. package/esm2022/table/components/table-header-cell-content/table-header-cell-content.component.mjs +6 -6
  229. package/esm2022/table/components/table-header-row/table-header-row.component.mjs +11 -13
  230. package/esm2022/table/components/table-p13-dialog/columns/columns.component.mjs +7 -9
  231. package/esm2022/table/components/table-p13-dialog/filtering/filter-rule.component.mjs +9 -11
  232. package/esm2022/table/components/table-p13-dialog/filtering/filtering.component.mjs +6 -9
  233. package/esm2022/table/components/table-p13-dialog/grouping/grouping.component.mjs +6 -8
  234. package/esm2022/table/components/table-p13-dialog/sorting/sorting.component.mjs +9 -11
  235. package/esm2022/table/components/table-p13-dialog/table-p13-columns.component.mjs +3 -3
  236. package/esm2022/table/components/table-p13-dialog/table-p13-dialog.component.mjs +5 -5
  237. package/esm2022/table/components/table-p13-dialog/table-p13-filter.component.mjs +3 -3
  238. package/esm2022/table/components/table-p13-dialog/table-p13-group.component.mjs +3 -3
  239. package/esm2022/table/components/table-p13-dialog/table-p13-sort.component.mjs +3 -3
  240. package/esm2022/table/components/table-popping-row/table-popping-row.component.mjs +7 -9
  241. package/esm2022/table/components/table-row/table-row.component.mjs +8 -12
  242. package/esm2022/table/components/table-toolbar/table-toolbar-actions.component.mjs +3 -3
  243. package/esm2022/table/components/table-toolbar/table-toolbar-left-actions.component.mjs +3 -3
  244. package/esm2022/table/components/table-toolbar/table-toolbar.component.mjs +7 -8
  245. package/esm2022/table/components/table-view-settings-dialog/filtering/filter-custom.component.mjs +6 -6
  246. package/esm2022/table/components/table-view-settings-dialog/filtering/filter-multi-select.component.mjs +5 -6
  247. package/esm2022/table/components/table-view-settings-dialog/filtering/filter-single-select.component.mjs +5 -14
  248. package/esm2022/table/components/table-view-settings-dialog/filtering/filter-step.component.mjs +5 -8
  249. package/esm2022/table/components/table-view-settings-dialog/filtering/filters-list-step.component.mjs +5 -7
  250. package/esm2022/table/components/table-view-settings-dialog/filtering/filters.component.mjs +7 -10
  251. package/esm2022/table/components/table-view-settings-dialog/grouping/grouping.component.mjs +6 -8
  252. package/esm2022/table/components/table-view-settings-dialog/sorting/sorting.component.mjs +6 -9
  253. package/esm2022/table/components/table-view-settings-dialog/table-view-settings-dialog.component.mjs +5 -5
  254. package/esm2022/table/components/table-view-settings-dialog/table-view-settings-filter.component.mjs +3 -3
  255. package/esm2022/table/table.component.mjs +9 -14
  256. package/esm2022/table/table.module.mjs +4 -4
  257. package/esm2022/table-helpers/directives/platform-table-column-responsive.directive.mjs +6 -6
  258. package/esm2022/table-helpers/directives/table-cell-header-popover.directive.mjs +4 -4
  259. package/esm2022/table-helpers/directives/table-cell-resizable.directive.mjs +5 -5
  260. package/esm2022/table-helpers/directives/table-cell-selectable.directive.mjs +3 -3
  261. package/esm2022/table-helpers/directives/table-cell.directive.mjs +16 -16
  262. package/esm2022/table-helpers/directives/table-data-source.directive.mjs +3 -3
  263. package/esm2022/table-helpers/directives/table-draggable.directive.mjs +3 -3
  264. package/esm2022/table-helpers/directives/table-header-resizer.directive.mjs +3 -3
  265. package/esm2022/table-helpers/directives/table-header.directive.mjs +7 -7
  266. package/esm2022/table-helpers/directives/table-initial-state.directive.mjs +3 -3
  267. package/esm2022/table-helpers/directives/table-scrollable.directive.mjs +4 -4
  268. package/esm2022/table-helpers/directives/table-view-settings-filter-custom.directive.mjs +4 -4
  269. package/esm2022/table-helpers/directives/table-virtual-scroll.directive.mjs +3 -3
  270. package/esm2022/table-helpers/enums/collection-filter.enum.mjs +16 -1
  271. package/esm2022/table-helpers/pipes/cell-styles.pipe.mjs +3 -3
  272. package/esm2022/table-helpers/pipes/column-resizable-side.pipe.mjs +3 -3
  273. package/esm2022/table-helpers/pipes/column-sorting-direction.pipe.mjs +3 -3
  274. package/esm2022/table-helpers/pipes/row-classes.pipe.mjs +3 -3
  275. package/esm2022/table-helpers/pipes/selection-cell-styles.pipe.mjs +3 -3
  276. package/esm2022/table-helpers/services/table-column-resize.service.mjs +5 -5
  277. package/esm2022/table-helpers/services/table-responsive.service.mjs +5 -5
  278. package/esm2022/table-helpers/services/table-row.service.mjs +3 -3
  279. package/esm2022/table-helpers/services/table-scroll-dispatcher.service.mjs +3 -3
  280. package/esm2022/table-helpers/services/table.service.mjs +3 -3
  281. package/esm2022/table-helpers/table-helpers.module.mjs +4 -4
  282. package/esm2022/value-help-dialog/components/base-tab/vhd-base-tab.component.mjs +5 -5
  283. package/esm2022/value-help-dialog/components/define-tab/define-tab.component.mjs +6 -10
  284. package/esm2022/value-help-dialog/components/select-tab/select-tab.component.mjs +13 -15
  285. package/esm2022/value-help-dialog/components/value-help-dialog-filter/value-help-dialog-filter.component.mjs +3 -3
  286. package/esm2022/value-help-dialog/directives/condition-count-message.directive.mjs +5 -5
  287. package/esm2022/value-help-dialog/value-help-dialog/value-help-dialog.component.mjs +12 -17
  288. package/esm2022/value-help-dialog/value-help-dialog.module.mjs +4 -4
  289. package/esm2022/variant-management/components/manage-variant-item/manage-variant-item.component.mjs +5 -5
  290. package/esm2022/variant-management/components/manage-variants-dialog/manage-variants-dialog.component.mjs +6 -8
  291. package/esm2022/variant-management/components/variant-management-wrapper/variant-management-wrapper.component.mjs +3 -3
  292. package/esm2022/variant-management/directives/variant-management-dirty-label.directive.mjs +4 -4
  293. package/esm2022/variant-management/variant-management.component.mjs +8 -10
  294. package/esm2022/variant-management/variant-management.module.mjs +4 -4
  295. package/esm2022/wizard-generator/base-wizard-generator.mjs +5 -5
  296. package/esm2022/wizard-generator/components/dialog-wizard-generator/dialog-wizard-generator.component.mjs +7 -8
  297. package/esm2022/wizard-generator/components/wizard-body/wizard-body.component.mjs +7 -9
  298. package/esm2022/wizard-generator/components/wizard-generator/wizard-generator.component.mjs +6 -7
  299. package/esm2022/wizard-generator/components/wizard-generator-step/wizard-generator-step.component.mjs +6 -7
  300. package/esm2022/wizard-generator/components/wizard-summary-step/wizard-summary-section/wizard-summary-section.component.mjs +5 -6
  301. package/esm2022/wizard-generator/components/wizard-summary-step/wizard-summary-step.component.mjs +7 -7
  302. package/esm2022/wizard-generator/directives/wizard-generator-finish-button.directive.mjs +3 -3
  303. package/esm2022/wizard-generator/directives/wizard-generator-go-next-button.directive.mjs +3 -3
  304. package/esm2022/wizard-generator/directives/wizard-generator-review-button.directive.mjs +3 -3
  305. package/esm2022/wizard-generator/directives/wizard-generator-summary-step.directive.mjs +3 -3
  306. package/esm2022/wizard-generator/wizard-dialog-generator.service.mjs +4 -4
  307. package/esm2022/wizard-generator/wizard-generator.module.mjs +4 -4
  308. package/esm2022/wizard-generator/wizard-generator.service.mjs +4 -4
  309. package/fesm2022/fundamental-ngx-platform-approval-flow.mjs +62 -74
  310. package/fesm2022/fundamental-ngx-platform-approval-flow.mjs.map +1 -1
  311. package/fesm2022/fundamental-ngx-platform-button.mjs +8 -8
  312. package/fesm2022/fundamental-ngx-platform-button.mjs.map +1 -1
  313. package/fesm2022/fundamental-ngx-platform-dynamic-page.mjs +54 -56
  314. package/fesm2022/fundamental-ngx-platform-dynamic-page.mjs.map +1 -1
  315. package/fesm2022/fundamental-ngx-platform-feed-input.mjs +9 -10
  316. package/fesm2022/fundamental-ngx-platform-feed-input.mjs.map +1 -1
  317. package/fesm2022/fundamental-ngx-platform-form.mjs +444 -602
  318. package/fesm2022/fundamental-ngx-platform-form.mjs.map +1 -1
  319. package/fesm2022/fundamental-ngx-platform-icon-tab-bar.mjs +59 -87
  320. package/fesm2022/fundamental-ngx-platform-icon-tab-bar.mjs.map +1 -1
  321. package/fesm2022/fundamental-ngx-platform-info-label.mjs +8 -8
  322. package/fesm2022/fundamental-ngx-platform-info-label.mjs.map +1 -1
  323. package/fesm2022/fundamental-ngx-platform-link.mjs +8 -8
  324. package/fesm2022/fundamental-ngx-platform-link.mjs.map +1 -1
  325. package/fesm2022/fundamental-ngx-platform-list.mjs +73 -78
  326. package/fesm2022/fundamental-ngx-platform-list.mjs.map +1 -1
  327. package/fesm2022/fundamental-ngx-platform-menu-button.mjs +8 -8
  328. package/fesm2022/fundamental-ngx-platform-menu-button.mjs.map +1 -1
  329. package/fesm2022/fundamental-ngx-platform-menu.mjs +20 -20
  330. package/fesm2022/fundamental-ngx-platform-menu.mjs.map +1 -1
  331. package/fesm2022/fundamental-ngx-platform-message-popover.mjs +29 -33
  332. package/fesm2022/fundamental-ngx-platform-message-popover.mjs.map +1 -1
  333. package/fesm2022/fundamental-ngx-platform-object-marker.mjs +9 -10
  334. package/fesm2022/fundamental-ngx-platform-object-marker.mjs.map +1 -1
  335. package/fesm2022/fundamental-ngx-platform-object-status.mjs +12 -12
  336. package/fesm2022/fundamental-ngx-platform-object-status.mjs.map +1 -1
  337. package/fesm2022/fundamental-ngx-platform-page-footer.mjs +9 -9
  338. package/fesm2022/fundamental-ngx-platform-page-footer.mjs.map +1 -1
  339. package/fesm2022/fundamental-ngx-platform-panel.mjs +19 -19
  340. package/fesm2022/fundamental-ngx-platform-panel.mjs.map +1 -1
  341. package/fesm2022/fundamental-ngx-platform-search-field.mjs +29 -32
  342. package/fesm2022/fundamental-ngx-platform-search-field.mjs.map +1 -1
  343. package/fesm2022/fundamental-ngx-platform-settings-generator.mjs +45 -56
  344. package/fesm2022/fundamental-ngx-platform-settings-generator.mjs.map +1 -1
  345. package/fesm2022/fundamental-ngx-platform-shared.mjs +36 -36
  346. package/fesm2022/fundamental-ngx-platform-shared.mjs.map +1 -1
  347. package/fesm2022/fundamental-ngx-platform-slider.mjs +9 -9
  348. package/fesm2022/fundamental-ngx-platform-slider.mjs.map +1 -1
  349. package/fesm2022/fundamental-ngx-platform-smart-filter-bar.mjs +48 -53
  350. package/fesm2022/fundamental-ngx-platform-smart-filter-bar.mjs.map +1 -1
  351. package/fesm2022/fundamental-ngx-platform-split-menu-button.mjs +9 -9
  352. package/fesm2022/fundamental-ngx-platform-split-menu-button.mjs.map +1 -1
  353. package/fesm2022/fundamental-ngx-platform-table-helpers.mjs +115 -100
  354. package/fesm2022/fundamental-ngx-platform-table-helpers.mjs.map +1 -1
  355. package/fesm2022/fundamental-ngx-platform-table.mjs +168 -218
  356. package/fesm2022/fundamental-ngx-platform-table.mjs.map +1 -1
  357. package/fesm2022/fundamental-ngx-platform-value-help-dialog.mjs +41 -52
  358. package/fesm2022/fundamental-ngx-platform-value-help-dialog.mjs.map +1 -1
  359. package/fesm2022/fundamental-ngx-platform-variant-management.mjs +28 -31
  360. package/fesm2022/fundamental-ngx-platform-variant-management.mjs.map +1 -1
  361. package/fesm2022/fundamental-ngx-platform-wizard-generator.mjs +58 -61
  362. package/fesm2022/fundamental-ngx-platform-wizard-generator.mjs.map +1 -1
  363. package/fesm2022/fundamental-ngx-platform.mjs +19 -42
  364. package/fesm2022/fundamental-ngx-platform.mjs.map +1 -1
  365. package/form/combobox/combobox-mobile/combobox/combobox-mobile.component.d.ts +2 -2
  366. package/form/form-group/form-group.component.d.ts +1 -1
  367. package/form/index.d.ts +0 -2
  368. package/form/input-group/input-group.component.d.ts +2 -2
  369. package/form/multi-combobox/multi-combobox/multi-combobox.component.d.ts +1 -1
  370. package/form/multi-input/multi-input-mobile/multi-input-mobile.component.d.ts +2 -2
  371. package/fundamental-ngx-platform-v0.48.0-rc.1.tgz +0 -0
  372. package/fundamental-ngx.module.d.ts +27 -31
  373. package/icon-tab-bar/components/icon-tab-bar-base.class.d.ts +0 -2
  374. package/icon-tab-bar/components/popovers/icon-tab-bar-popover-base.class.d.ts +0 -2
  375. package/index.d.ts +7 -11
  376. package/list/list.component.d.ts +1 -1
  377. package/package.json +4 -28
  378. package/page-footer/page-footer.component.d.ts +1 -1
  379. package/schematics/ng-add/index.js +1 -1
  380. package/settings-generator/settings-generator-content/settings-generator-section/settings-generator-section.component.d.ts +1 -1
  381. package/settings-generator/settings-generator.component.d.ts +2 -2
  382. package/table/components/table-p13-dialog/filtering/filter-rule.component.d.ts +2 -0
  383. package/table/table.component.d.ts +1 -1
  384. package/table-helpers/enums/collection-filter.enum.d.ts +2 -0
  385. package/value-help-dialog/components/select-tab/select-tab.component.d.ts +1 -1
  386. package/value-help-dialog/value-help-dialog/value-help-dialog.component.d.ts +1 -1
  387. package/wizard-generator/components/wizard-generator-step/wizard-generator-step.component.d.ts +2 -2
  388. package/wizard-generator/components/wizard-summary-step/wizard-summary-step.component.d.ts +2 -2
  389. package/action-bar/README.md +0 -25
  390. package/action-bar/action-bar.component.d.ts +0 -36
  391. package/action-bar/action-bar.module.d.ts +0 -8
  392. package/action-bar/index.d.ts +0 -2
  393. package/action-button-group/README.md +0 -25
  394. package/action-button-group/action-button-group.component.d.ts +0 -11
  395. package/action-button-group/action-button-group.module.d.ts +0 -7
  396. package/action-button-group/index.d.ts +0 -2
  397. package/esm2022/action-bar/action-bar.component.mjs +0 -64
  398. package/esm2022/action-bar/action-bar.module.mjs +0 -17
  399. package/esm2022/action-bar/fundamental-ngx-platform-action-bar.mjs +0 -5
  400. package/esm2022/action-bar/index.mjs +0 -3
  401. package/esm2022/action-button-group/action-button-group.component.mjs +0 -21
  402. package/esm2022/action-button-group/action-button-group.module.mjs +0 -16
  403. package/esm2022/action-button-group/fundamental-ngx-platform-action-button-group.mjs +0 -5
  404. package/esm2022/action-button-group/index.mjs +0 -3
  405. package/esm2022/form/platform-file-uploader/platform-file-uploader.component.mjs +0 -143
  406. package/esm2022/form/platform-file-uploader/platform-file-uploader.module.mjs +0 -16
  407. package/esm2022/thumbnail/fundamental-ngx-platform-thumbnail.mjs +0 -5
  408. package/esm2022/thumbnail/index.mjs +0 -6
  409. package/esm2022/thumbnail/thumbnail-details/thumbnail-details.component.mjs +0 -166
  410. package/esm2022/thumbnail/thumbnail-image/thumbnail-image.component.mjs +0 -100
  411. package/esm2022/thumbnail/thumbnail.component.mjs +0 -148
  412. package/esm2022/thumbnail/thumbnail.interfaces.mjs +0 -2
  413. package/esm2022/thumbnail/thumbnail.module.mjs +0 -19
  414. package/esm2022/upload-collection/dialogs/move-to/move-to.component.mjs +0 -148
  415. package/esm2022/upload-collection/dialogs/new-folder/new-folder.component.mjs +0 -69
  416. package/esm2022/upload-collection/directives/upload-collection-dragndrop.directive.mjs +0 -138
  417. package/esm2022/upload-collection/domain/upload-collection-data-provider.mjs +0 -106
  418. package/esm2022/upload-collection/domain/upload-collection-data-source.mjs +0 -95
  419. package/esm2022/upload-collection/fundamental-ngx-platform-upload-collection.mjs +0 -5
  420. package/esm2022/upload-collection/helpers/generate-message-stripe-data.mjs +0 -20
  421. package/esm2022/upload-collection/index.mjs +0 -12
  422. package/esm2022/upload-collection/models/upload-collection.models.mjs +0 -58
  423. package/esm2022/upload-collection/services/files-validator.service.mjs +0 -68
  424. package/esm2022/upload-collection/upload-collection/upload-collection-data-provider-test.mjs +0 -280
  425. package/esm2022/upload-collection/upload-collection/upload-collection.component.mjs +0 -926
  426. package/esm2022/upload-collection/upload-collection.module.mjs +0 -33
  427. package/fesm2022/fundamental-ngx-platform-action-bar.mjs +0 -85
  428. package/fesm2022/fundamental-ngx-platform-action-bar.mjs.map +0 -1
  429. package/fesm2022/fundamental-ngx-platform-action-button-group.mjs +0 -41
  430. package/fesm2022/fundamental-ngx-platform-action-button-group.mjs.map +0 -1
  431. package/fesm2022/fundamental-ngx-platform-thumbnail.mjs +0 -418
  432. package/fesm2022/fundamental-ngx-platform-thumbnail.mjs.map +0 -1
  433. package/fesm2022/fundamental-ngx-platform-upload-collection.mjs +0 -1893
  434. package/fesm2022/fundamental-ngx-platform-upload-collection.mjs.map +0 -1
  435. package/form/platform-file-uploader/platform-file-uploader.component.d.ts +0 -69
  436. package/form/platform-file-uploader/platform-file-uploader.module.d.ts +0 -7
  437. package/fundamental-ngx-platform-v0.47.4.tgz +0 -0
  438. package/thumbnail/README.md +0 -25
  439. package/thumbnail/index.d.ts +0 -5
  440. package/thumbnail/thumbnail-details/thumbnail-details.component.d.ts +0 -57
  441. package/thumbnail/thumbnail-image/thumbnail-image.component.d.ts +0 -48
  442. package/thumbnail/thumbnail.component.d.ts +0 -73
  443. package/thumbnail/thumbnail.interfaces.d.ts +0 -12
  444. package/thumbnail/thumbnail.module.d.ts +0 -9
  445. package/upload-collection/README.md +0 -25
  446. package/upload-collection/dialogs/move-to/move-to.component.d.ts +0 -57
  447. package/upload-collection/dialogs/new-folder/new-folder.component.d.ts +0 -26
  448. package/upload-collection/directives/upload-collection-dragndrop.directive.d.ts +0 -64
  449. package/upload-collection/domain/upload-collection-data-provider.d.ts +0 -46
  450. package/upload-collection/domain/upload-collection-data-source.d.ts +0 -49
  451. package/upload-collection/helpers/generate-message-stripe-data.d.ts +0 -3
  452. package/upload-collection/index.d.ts +0 -11
  453. package/upload-collection/models/upload-collection.models.d.ts +0 -225
  454. package/upload-collection/services/files-validator.service.d.ts +0 -18
  455. package/upload-collection/upload-collection/upload-collection-data-provider-test.d.ts +0 -36
  456. package/upload-collection/upload-collection/upload-collection.component.d.ts +0 -259
  457. package/upload-collection/upload-collection.module.d.ts +0 -11
@@ -1,926 +0,0 @@
1
- import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Injector, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
2
- import { BehaviorSubject, Subject } from 'rxjs';
3
- import { take, tap } from 'rxjs/operators';
4
- import { DatePipe, NgFor, NgIf, NgSwitch, NgSwitchCase, NgTemplateOutlet } from '@angular/common';
5
- import { FormsModule } from '@angular/forms';
6
- import { BreadcrumbComponent, BreadcrumbItemComponent } from '@fundamental-ngx/core/breadcrumb';
7
- import { BusyIndicatorComponent } from '@fundamental-ngx/core/busy-indicator';
8
- import { ButtonComponent } from '@fundamental-ngx/core/button';
9
- import { DialogService } from '@fundamental-ngx/core/dialog';
10
- import { FileUploaderSelectDirective } from '@fundamental-ngx/core/file-uploader';
11
- import { FormControlComponent, FormInputMessageGroupComponent, FormItemComponent, FormMessageComponent } from '@fundamental-ngx/core/form';
12
- import { IconComponent } from '@fundamental-ngx/core/icon';
13
- import { InputGroupComponent } from '@fundamental-ngx/core/input-group';
14
- import { LinkComponent } from '@fundamental-ngx/core/link';
15
- import { MessageStripComponent } from '@fundamental-ngx/core/message-strip';
16
- import { ObjectStatusComponent } from '@fundamental-ngx/core/object-status';
17
- import { PaginationComponent } from '@fundamental-ngx/core/pagination';
18
- import { ToolbarComponent, ToolbarItemDirective, ToolbarSpacerDirective } from '@fundamental-ngx/core/toolbar';
19
- import { uuidv4, warnOnce } from '@fundamental-ngx/core/utils';
20
- import { FdTranslatePipe } from '@fundamental-ngx/i18n';
21
- import { MenuComponent, MenuItemComponent, MenuTriggerDirective } from '@fundamental-ngx/platform/menu';
22
- import { MenuButtonComponent } from '@fundamental-ngx/platform/menu-button';
23
- import { ConvertBytesPipe, isDataSource } from '@fundamental-ngx/platform/shared';
24
- import { ColumnAlign, SelectionMode, TableColumnComponent, TableComponent } from '@fundamental-ngx/platform/table';
25
- import { FdpCellDef, FdpHeaderCellDef, FdpTableCell, FdpTableHeader, TableDataSourceDirective, TableHeaderResizerDirective, TableInitialStateDirective } from '@fundamental-ngx/platform/table-helpers';
26
- import { MoveToComponent } from '../dialogs/move-to/move-to.component';
27
- import { NewFolderComponent } from '../dialogs/new-folder/new-folder.component';
28
- import { UploadCollectionDragnDropDirective } from '../directives/upload-collection-dragndrop.directive';
29
- import { generateMessageStripeData } from '../helpers/generate-message-stripe-data';
30
- import { FileSizeExceedEvent, FilenameLengthExceedEvent, MessageStripType, MessageType, TypeMismatchEvent, UploadCollectionItemStatus } from '../models/upload-collection.models';
31
- import { FilesValidatorService } from '../services/files-validator.service';
32
- import * as i0 from "@angular/core";
33
- import * as i1 from "@fundamental-ngx/core/dialog";
34
- import * as i2 from "../services/files-validator.service";
35
- import * as i3 from "@angular/forms";
36
- let randomId = 0;
37
- /**
38
- * @deprecated
39
- * UploadCollection component is deprecated since version 0.40.0
40
- */
41
- export class UploadCollectionComponent {
42
- /** Defines the number of items on the page */
43
- set itemsPerPage(value) {
44
- if (typeof value === 'number') {
45
- this._itemsPerPage = value;
46
- this._match();
47
- return;
48
- }
49
- const defaultValue = value.find((item) => item.default);
50
- this._itemsPerPageOptions = value;
51
- if (defaultValue) {
52
- this._itemsPerPage = defaultValue.label;
53
- this._match();
54
- return;
55
- }
56
- this._itemsPerPage = value[Math.round(value.length / 2)].label;
57
- this._match();
58
- }
59
- get itemsPerPage() {
60
- return this._itemsPerPage;
61
- }
62
- /** List of items */
63
- set dataSource(value) {
64
- if (value) {
65
- this._initializeDS(value);
66
- }
67
- }
68
- get dataSource() {
69
- return this._dataSource;
70
- }
71
- /** @hidden */
72
- constructor(_dialogService, _filesValidatorService, _cdr, _injector) {
73
- this._dialogService = _dialogService;
74
- this._filesValidatorService = _filesValidatorService;
75
- this._cdr = _cdr;
76
- this._injector = _injector;
77
- /** ID of the upload collection element. If none is provided, one will be generated. */
78
- this.id = `fdp-upload-collection-id-${randomId++}`;
79
- /**
80
- * Defines the allowed file types for the upload.
81
- * The chosen files will be checked against an array of file types.
82
- * If at least one file does not fit the file type requirements,
83
- * the upload is prevented. Example: ["jpg", "png", "bmp"].
84
- */
85
- this.fileTypes = [];
86
- /**
87
- * Defines the allowed MIME types of files to be uploaded.
88
- * The chosen files will be checked against an array of MIME types.
89
- * If at least one file does not fit the MIME type requirements, the upload is prevented.
90
- * Example: mimeTypes ["image/png", "image/jpeg"].
91
- */
92
- this.mimeTypes = [];
93
- /** All action buttons will be disabled */
94
- this.disabled = false;
95
- /** All action buttons will be invisible */
96
- this.readonly = false;
97
- /** Allows to support hierarchy */
98
- this.hierarchy = true;
99
- /** Allows to show/hide pagination */
100
- this.enablePagination = true;
101
- /**
102
- * If true, the button that is used to terminate the instant file upload gets visible.
103
- * The button normally appears when a file is being uploaded.
104
- */
105
- this.terminationEnabled = true;
106
- /** Gives to select multiple files from the same folder and then upload them. */
107
- this.multiple = true;
108
- /** Allows to show/hide search */
109
- this.showSearch = true;
110
- /**
111
- * Allows to use the same name for a file when editing the file name.
112
- * 'Same name' refers to an already existing file name in the list.
113
- * */
114
- this.sameFileNameAllowed = false;
115
- /**
116
- * The event is triggered when the file type or the MIME type don't match the permitted types
117
- * (only if the fileTypes property or the mimeTypes property are provided by the application).
118
- */
119
- this.typeMismatch = new EventEmitter();
120
- /**
121
- * The event is triggered when the name of a chosen file is longer than the value specified
122
- * with the maxFilenameLength property (only if provided by the application).
123
- */
124
- this.filenameLengthExceed = new EventEmitter();
125
- /**
126
- * The event is triggered when the file size of an uploaded file is exceeded
127
- * (only if the maxFileSize property was provided by the application).
128
- */
129
- this.fileSizeExceed = new EventEmitter();
130
- /** @hidden */
131
- this._uploadCollectionItemStatus = UploadCollectionItemStatus;
132
- /** @hidden */
133
- this._breadcrumbList = [];
134
- /** @hidden */
135
- this._currentPage = 1;
136
- /** @hidden */
137
- this._itemsPerPage = 10;
138
- /** @hidden */
139
- this._itemsPerPageOptions = [];
140
- /** @hidden */
141
- this._totalItems = 0;
142
- /** @hidden */
143
- this._countShowedItems = 0;
144
- /** @hidden */
145
- this._countNotShowedItems = 0;
146
- /** @hidden
147
- * List of currently displayed items
148
- */
149
- this._visibleList$ = new BehaviorSubject([]);
150
- /** @hidden */
151
- this.selectedItems = [];
152
- /** @hidden */
153
- this._searchText = '';
154
- /** @hidden */
155
- this._showDragDropArea = false;
156
- /** @hidden */
157
- this._onDragDropArea = false;
158
- /** @hidden */
159
- this._messageType = MessageType;
160
- /** @hidden */
161
- this._messageStripType = MessageStripType;
162
- /** @hidden */
163
- this._columnAlign = ColumnAlign;
164
- /** @hidden */
165
- this._selectionMode = SelectionMode;
166
- /** @hidden */
167
- /** @hidden */
168
- this._contentDensityManuallySet = false;
169
- /** @hidden */
170
- this._imageExtensions = [
171
- '.apng',
172
- '.bmp',
173
- '.gif',
174
- '.ico',
175
- '.cur',
176
- '.jpg',
177
- '.jpeg',
178
- '.jfif',
179
- '.pjpeg',
180
- '.pjp',
181
- '.png',
182
- '.svg',
183
- '.tif',
184
- '.tiff',
185
- '.webp',
186
- '.flif',
187
- '.cr2',
188
- '.jxr',
189
- '.psd',
190
- '.bpg',
191
- '.jp2',
192
- '.jpm',
193
- '.jpx',
194
- '.heic',
195
- '.dcm'
196
- ];
197
- /** @hidden */
198
- this._onDestroy$ = new Subject();
199
- warnOnce('The Upload Collection component is deprecated and will be removed in next release.');
200
- }
201
- /** @hidden */
202
- ngOnChanges(changes) {
203
- if (changes.contentDensity) {
204
- this._contentDensityManuallySet = true;
205
- }
206
- }
207
- /** @hidden */
208
- ngOnDestroy() {
209
- this._onDestroy$.next();
210
- this._onDestroy$.complete();
211
- this._dsSubscription?.unsubscribe();
212
- this.dataSource.close();
213
- }
214
- /** Show meessage for types NEW FOLDER CREATE, REMOVE, MOVE TO, UPDATE_VERSION, FILE_RENAMED */
215
- showMessage(type, options) {
216
- this._message = generateMessageStripeData(type, options);
217
- }
218
- /**
219
- * @hidden
220
- * Opens the file selector.
221
- */
222
- _fileNameChange(e, currentItem) {
223
- const input = e.target;
224
- const itemName = input.value.trim();
225
- const newName = currentItem.type === 'file' ? `${itemName}.${currentItem.name.split('.').pop()}` : itemName;
226
- if (currentItem.name === newName) {
227
- return;
228
- }
229
- if (this.maxFilenameLength && itemName.length > this.maxFilenameLength) {
230
- const renamedItem = {
231
- ...currentItem,
232
- name: newName
233
- };
234
- const payload = {
235
- items: [renamedItem]
236
- };
237
- const filenameLengthEvent = new FilenameLengthExceedEvent(this, payload);
238
- this.showMessage(MessageType.FILE_NAME_LENGTH, { payload, type: MessageStripType.ERROR });
239
- this.filenameLengthExceed.emit(filenameLengthEvent);
240
- return;
241
- }
242
- if (currentItem.sameFilenameState) {
243
- return;
244
- }
245
- const data = {
246
- parentFolderId: this._getCurrentFolderId(),
247
- fileName: newName,
248
- item: { ...currentItem }
249
- };
250
- this.dataSource
251
- .fileRenamed(data)
252
- .pipe(tap(() => {
253
- this.selectedItems = [];
254
- this._match();
255
- }))
256
- .subscribe({
257
- next: () => {
258
- this.showMessage(MessageType.FILE_RENAME, {
259
- payload: data,
260
- type: MessageStripType.SUCCESS
261
- });
262
- },
263
- error: () => {
264
- this.showMessage(MessageType.FILE_RENAME, {
265
- payload: data,
266
- type: MessageStripType.ERROR
267
- });
268
- }
269
- });
270
- }
271
- /** @hidden */
272
- _checkName(e, currentItem) {
273
- const input = e.target;
274
- const itemName = input.value.trim();
275
- const newName = currentItem.type === 'file' ? `${itemName}.${currentItem.name.split('.').pop()}` : itemName;
276
- const nameAlreadyExists = this._getList().some((item) => currentItem.documentId !== item.documentId && item.name === newName);
277
- if (!this.sameFileNameAllowed && nameAlreadyExists) {
278
- currentItem.sameFilenameState = 'error';
279
- return;
280
- }
281
- delete currentItem.sameFilenameState;
282
- }
283
- /** @hidden
284
- * Opens the file selector.
285
- */
286
- _openUploadFiles() {
287
- const input = this._uploadFilesRef.nativeElement;
288
- if (input) {
289
- input.click();
290
- }
291
- }
292
- /** @hidden
293
- * Opens the update file version selector.
294
- */
295
- _openUpdateFileVersion() {
296
- if (this.disabled) {
297
- return;
298
- }
299
- const input = this._updateVersionRef.nativeElement;
300
- if (input) {
301
- this._currentUpdateFileVersion = this._activeItem;
302
- input.click();
303
- }
304
- }
305
- /** @hidden */
306
- _selectHandler(files) {
307
- this._validateFiles(files);
308
- this._propagateFiles();
309
- }
310
- /** @hidden */
311
- _handleDrop(output) {
312
- this._validatedFiles = output;
313
- this._propagateFiles();
314
- }
315
- /** @hidden */
316
- _openNewFolderDialog() {
317
- const dialogRef = this._dialogService.open(NewFolderComponent, {
318
- responsivePadding: true,
319
- backdropClickCloseable: false,
320
- height: '320px',
321
- data: {
322
- currentFolder: this._getCurrentFolder(),
323
- maxFilenameLength: this.maxFilenameLength
324
- }
325
- });
326
- dialogRef.afterClosed.pipe(take(1)).subscribe((folderName) => {
327
- const folder = this._generateTemporaryNewFolder(folderName);
328
- const parentFolderId = this._getCurrentFolderId();
329
- const data = {
330
- parentFolderId,
331
- folder: { ...folder }
332
- };
333
- this._findParentFolderAndAddTemporaryFiles(parentFolderId, [folder]);
334
- this.dataSource
335
- .newFolder(data)
336
- .pipe(tap(() => this._match()))
337
- .subscribe({
338
- next: () => {
339
- this.showMessage(MessageType.CREATE, {
340
- payload: data,
341
- type: MessageStripType.SUCCESS
342
- });
343
- },
344
- error: () => {
345
- this.showMessage(MessageType.CREATE, {
346
- payload: data,
347
- type: MessageStripType.ERROR
348
- });
349
- }
350
- });
351
- });
352
- }
353
- /** @hidden */
354
- _moveToClicked(multiple) {
355
- if (this.disabled) {
356
- return;
357
- }
358
- const _activeItem = this._activeItem;
359
- const currentFolder = this._getCurrentFolder();
360
- const movableItems = multiple ? this.selectedItems : _activeItem ? [_activeItem] : [];
361
- const dialogRef = this._dialogService.open(MoveToComponent, {
362
- responsivePadding: true,
363
- verticalPadding: false,
364
- backdropClickCloseable: false,
365
- height: '350px',
366
- data: {
367
- items: this.dataSource.dataProvider.items,
368
- currentFolder,
369
- movableFolders: movableItems.filter((item) => item?.type === 'folder'),
370
- maxFilenameLength: this.maxFilenameLength
371
- }
372
- }, this._injector);
373
- dialogRef.afterClosed.pipe(take(1)).subscribe(({ selectedFolder, parentFolderId, folderName }) => {
374
- const payload = {
375
- from: currentFolder,
376
- to: selectedFolder,
377
- items: movableItems
378
- };
379
- if (folderName) {
380
- payload.newFolder = {
381
- parentFolderId,
382
- folderName
383
- };
384
- }
385
- this.dataSource
386
- .moveTo(payload)
387
- .pipe(tap(() => {
388
- this.selectedItems = [];
389
- this._match();
390
- }))
391
- .subscribe({
392
- next: () => {
393
- this.showMessage(MessageType.MOVE, {
394
- payload,
395
- type: MessageStripType.SUCCESS
396
- });
397
- },
398
- error: () => {
399
- this.showMessage(MessageType.MOVE, {
400
- payload,
401
- type: MessageStripType.ERROR
402
- });
403
- }
404
- });
405
- }, (error) => {
406
- console.error(error);
407
- });
408
- }
409
- /** @hidden */
410
- _downloadClicked(multiple) {
411
- if (this.disabled) {
412
- return;
413
- }
414
- const _activeItem = { ...this._activeItem };
415
- const items = (multiple ? this.selectedItems : [_activeItem]);
416
- this.dataSource.download({ items }).subscribe();
417
- }
418
- /** @hidden */
419
- _remove(multiple) {
420
- if (this.disabled) {
421
- return;
422
- }
423
- const _activeItem = { ...this._activeItem };
424
- const items = multiple ? this.selectedItems : [_activeItem];
425
- const data = { parentFolderId: this._getCurrentFolderId(), items };
426
- this.dataSource
427
- .delete(data)
428
- .pipe(tap(() => {
429
- this.selectedItems = [];
430
- this._match();
431
- }))
432
- .subscribe({
433
- next: () => {
434
- this.showMessage(MessageType.REMOVE, {
435
- payload: data,
436
- type: MessageStripType.SUCCESS
437
- });
438
- },
439
- error: () => {
440
- this.showMessage(MessageType.REMOVE, {
441
- payload: data,
442
- type: MessageStripType.ERROR
443
- });
444
- }
445
- });
446
- }
447
- /** @hidden */
448
- _runUploadNewFileAfterFail(item) {
449
- this.dataSource
450
- .runAfterFail({ parentFolderId: this._getCurrentFolderId(), items: [item] })
451
- .pipe(tap(() => this._match()))
452
- .subscribe();
453
- }
454
- /** @hidden */
455
- _cancelUploadNewFile(file) {
456
- this.dataSource
457
- .cancelUploadNewFile({ parentFolderId: this._getCurrentFolderId(), item: file })
458
- .pipe(tap(() => this._match()))
459
- .subscribe();
460
- }
461
- /** @hidden */
462
- _messageStripDismiss() {
463
- this._message = undefined;
464
- }
465
- /** @hidden */
466
- _openFolder(item) {
467
- if (item.type === 'file' || !item.documentId) {
468
- return;
469
- }
470
- if (this._breadcrumbList.length > 0) {
471
- this._breadcrumbList[this._breadcrumbList.length - 1].clikable = true;
472
- }
473
- this._breadcrumbList.push({
474
- clikable: false,
475
- folderId: item.documentId,
476
- folderName: item.name
477
- });
478
- this._match();
479
- }
480
- /** @hidden */
481
- _actionButton(item) {
482
- this._activeItem = item;
483
- }
484
- /** @hidden */
485
- _onDropzone(event) {
486
- this._showDragDropArea = true;
487
- this._onDragDropArea = event;
488
- }
489
- /** @hidden */
490
- _dragDropCancel() {
491
- this._showDragDropArea = false;
492
- }
493
- /** @hidden */
494
- _breadcrumbGoTo(event, index) {
495
- event.preventDefault();
496
- event.stopPropagation();
497
- if (!Number.isInteger(index)) {
498
- this._breadcrumbList = [];
499
- this._match();
500
- return;
501
- }
502
- this._breadcrumbList = this._breadcrumbList.slice(0, index + 1);
503
- this._breadcrumbList[this._breadcrumbList.length - 1].clikable = false;
504
- this._match();
505
- }
506
- /** @hidden */
507
- _pageChanged(pageNumber) {
508
- if (!this.enablePagination || this._currentPage === pageNumber) {
509
- return;
510
- }
511
- this.selectedItems = [];
512
- this._currentPage = pageNumber;
513
- this._match();
514
- }
515
- /** @hidden */
516
- _itemsPerPageChange(value) {
517
- if (value === this._itemsPerPage) {
518
- return;
519
- }
520
- this._itemsPerPage = value;
521
- if (this._currentPage * this._itemsPerPage > this._totalItems) {
522
- this._currentPage = Math.ceil(this._totalItems / this._itemsPerPage);
523
- }
524
- this._match();
525
- }
526
- /** @hidden */
527
- _searchInputChanged() {
528
- this._match();
529
- }
530
- /** @hidden */
531
- _onRowSelectionChange(data) {
532
- if (!this.sameFileNameAllowed) {
533
- const removedItem = data.removed[0];
534
- this._clearItemSameFilenameState(removedItem);
535
- }
536
- this.selectedItems = data.selection;
537
- }
538
- /** @hidden */
539
- _getItemName(item) {
540
- if (item.type === 'folder') {
541
- return item.name;
542
- }
543
- return item.name.split('.').slice(0, -1).join('.');
544
- }
545
- /** @hidden */
546
- _getItemExtension(item) {
547
- if (item.type === 'folder') {
548
- return '';
549
- }
550
- return `.${item.name.split('.').pop()}`;
551
- }
552
- /** @hidden */
553
- _getIconByType(file) {
554
- const type = `.${file.name.split('.').pop()}`;
555
- return this._imageExtensions.includes(type) ? 'background' : 'document';
556
- }
557
- /** @hidden */
558
- _showIfSelectedOnlyFiles() {
559
- return !this.selectedItems.some((item) => item.type === 'folder');
560
- }
561
- /** @hidden */
562
- _isSelectedItem(item) {
563
- return this.selectedItems.some((selectedItem) => selectedItem.documentId === item.documentId);
564
- }
565
- /** @hidden */
566
- _getList() {
567
- return this.dataSource.dataProvider.list;
568
- }
569
- /** @hidden */
570
- _trackByDocumentId(index, item) {
571
- return item.documentId;
572
- }
573
- /** @hidden */
574
- _getAllowedTypes() {
575
- return `${this.fileTypes?.join(', ')}${this.fileTypes?.length && this.mimeTypes?.length ? ', ' : ''}${this.mimeTypes?.join(', ')}`;
576
- }
577
- /** @hidden */
578
- _validateFiles(files) {
579
- this._validatedFiles = this._filesValidatorService.validation(files, {
580
- maxFileSize: this.maxFileSize,
581
- maxFileNameLength: this.maxFilenameLength,
582
- fileTypes: this.fileTypes,
583
- mimeTypes: this.mimeTypes
584
- });
585
- }
586
- /** @hidden */
587
- _propagateFiles() {
588
- const { validFiles, typeMismatch, filenameLengthExceed, fileSizeExceed } = this._validatedFiles;
589
- if (validFiles) {
590
- if (this._currentUpdateFileVersion) {
591
- this._updateFileVersion(validFiles[0]);
592
- }
593
- else {
594
- this._uploadNewFiles(validFiles);
595
- }
596
- }
597
- if (typeMismatch) {
598
- const payload = { items: typeMismatch };
599
- const event = new TypeMismatchEvent(this, payload);
600
- this.showMessage(MessageType.TYPE_MISMATCH, { payload, type: MessageStripType.ERROR });
601
- this.typeMismatch.emit(event);
602
- }
603
- if (filenameLengthExceed) {
604
- const payload = { items: filenameLengthExceed };
605
- const event = new FilenameLengthExceedEvent(this, payload);
606
- this.showMessage(MessageType.FILE_NAME_LENGTH, { payload, type: MessageStripType.ERROR });
607
- this.filenameLengthExceed.emit(event);
608
- }
609
- if (fileSizeExceed) {
610
- const payload = { items: fileSizeExceed };
611
- const event = new FileSizeExceedEvent(this, payload);
612
- this.showMessage(MessageType.FILE_SIZE, { payload, type: MessageStripType.ERROR });
613
- this.fileSizeExceed.emit(event);
614
- }
615
- }
616
- /** @hidden */
617
- _updateFileVersion(newItem) {
618
- const currentFolderId = this._getCurrentFolderId();
619
- const currentItem = {
620
- ...this._currentUpdateFileVersion,
621
- status: UploadCollectionItemStatus.LOADING
622
- };
623
- const data = {
624
- parentFolderId: this._getCurrentFolderId(),
625
- item: this._currentUpdateFileVersion,
626
- newItem
627
- };
628
- this._findParentFolderAndUpdateItem(currentFolderId, currentItem);
629
- this.dataSource
630
- .updateVersion(data)
631
- .pipe(tap(() => this._match()))
632
- .subscribe({
633
- next: () => {
634
- this.showMessage(MessageType.UPDATE_VERSION, {
635
- payload: data,
636
- type: MessageStripType.SUCCESS
637
- });
638
- this._currentUpdateFileVersion = undefined;
639
- },
640
- error: () => {
641
- this.showMessage(MessageType.UPDATE_VERSION, {
642
- payload: data,
643
- type: MessageStripType.ERROR
644
- });
645
- }
646
- });
647
- }
648
- /** @hidden */
649
- _uploadNewFiles(files) {
650
- const currentFolderId = this._getCurrentFolderId();
651
- const newItems = this._generateTemporaryNewFiles(files);
652
- this._findParentFolderAndAddTemporaryFiles(currentFolderId, newItems);
653
- this.dataSource
654
- .upload({
655
- parentFolderId: currentFolderId,
656
- items: newItems.map((item) => ({ ...item }))
657
- })
658
- .pipe(tap(() => this._match()))
659
- .subscribe();
660
- }
661
- /** @hidden */
662
- _getCurrentFolder() {
663
- const currentFolderId = this._getCurrentFolderId();
664
- return !currentFolderId ? undefined : this._findFolderById(currentFolderId);
665
- }
666
- /** @hidden */
667
- _getCurrentFolderId() {
668
- return this._breadcrumbList.length === 0
669
- ? undefined
670
- : this._breadcrumbList[this._breadcrumbList.length - 1].folderId;
671
- }
672
- /** @hidden */
673
- _findFolderById(folderId, items = this.dataSource.dataProvider.items) {
674
- let foundObj;
675
- JSON.stringify(items, (_, nestedValue) => {
676
- if (nestedValue && nestedValue.documentId === folderId) {
677
- foundObj = nestedValue;
678
- }
679
- return nestedValue;
680
- });
681
- return foundObj;
682
- }
683
- /** @hidden */
684
- _findParentFolderAndUpdateItem(parentFolderId, updatedItem, items = this.dataSource.dataProvider.items) {
685
- if (!parentFolderId) {
686
- const index = items.findIndex((item) => item.documentId === updatedItem.documentId);
687
- if (index !== -1) {
688
- items[index] = updatedItem;
689
- }
690
- this._match();
691
- return;
692
- }
693
- for (let i = 0; i < items.length; i++) {
694
- const currentItem = items[i];
695
- if (currentItem.type !== 'folder') {
696
- continue;
697
- }
698
- if (currentItem.documentId === parentFolderId) {
699
- const index = currentItem.files.findIndex((item) => item.documentId === updatedItem.documentId);
700
- if (index !== -1) {
701
- currentItem.files[i] = updatedItem;
702
- this._match();
703
- break;
704
- }
705
- }
706
- else {
707
- this._findParentFolderAndUpdateItem(parentFolderId, updatedItem, currentItem.files);
708
- }
709
- }
710
- }
711
- /** @hidden */
712
- _findParentFolderAndAddTemporaryFiles(parentFolderId, newItems, items = this.dataSource.dataProvider.items) {
713
- if (!parentFolderId) {
714
- items.push(...newItems);
715
- this._match();
716
- return;
717
- }
718
- for (let i = 0; i < items.length; i++) {
719
- const currentItem = items[i];
720
- if (currentItem.type !== 'folder') {
721
- continue;
722
- }
723
- if (currentItem.documentId === parentFolderId) {
724
- currentItem.files.push(...newItems);
725
- this._match();
726
- break;
727
- }
728
- else {
729
- this._findParentFolderAndAddTemporaryFiles(parentFolderId, newItems, currentItem.files);
730
- }
731
- }
732
- }
733
- /** @hidden */
734
- _generateTemporaryNewFiles(files) {
735
- return files.map((file) => ({
736
- documentId: uuidv4(),
737
- type: 'file',
738
- name: file.name,
739
- uploadedBy: {
740
- id: uuidv4(),
741
- name: `You`
742
- },
743
- uploadedOn: new Date(),
744
- fileSize: file.size,
745
- version: 1,
746
- url: '',
747
- status: UploadCollectionItemStatus.LOADING,
748
- file
749
- }));
750
- }
751
- /** @hidden */
752
- _generateTemporaryNewFolder(folderName) {
753
- return {
754
- documentId: uuidv4(),
755
- type: 'folder',
756
- name: folderName,
757
- uploadedBy: {
758
- id: Date.now(),
759
- name: 'You'
760
- },
761
- uploadedOn: new Date(),
762
- files: [],
763
- status: UploadCollectionItemStatus.LOADING
764
- };
765
- }
766
- /** @hidden */
767
- _initializeDS(ds) {
768
- this._visibleList$.next([]);
769
- if (isDataSource(this.dataSource)) {
770
- this.dataSource.close();
771
- if (this._dsSubscription) {
772
- this._dsSubscription.unsubscribe();
773
- this._dsSubscription = undefined;
774
- }
775
- }
776
- this._dataSource = this._openDataStream(ds);
777
- // initial data fetch
778
- this._match();
779
- }
780
- /** @hidden */
781
- _openDataStream(ds) {
782
- const initDataSource = this._toDataStream(ds);
783
- if (initDataSource === undefined) {
784
- throw new Error(`[dataSource] source did not match an array, Observable, or DataSource`);
785
- }
786
- /**
787
- * This is single point of data entry to the component. We dont want to set data on different
788
- * places. If any new data comes in either you do a search and you want to pass initial data
789
- * its here.
790
- */
791
- this._dsSubscription = initDataSource.open().subscribe((data) => {
792
- this._visibleList$.next(data);
793
- this._totalItems = initDataSource.dataProvider.totalItems;
794
- this._countUnvisibleItems();
795
- this._cdr.detectChanges();
796
- });
797
- return initDataSource;
798
- }
799
- /** @hidden */
800
- _toDataStream(ds) {
801
- if (isDataSource(ds)) {
802
- return ds;
803
- }
804
- return undefined;
805
- }
806
- /** @hidden */
807
- _match() {
808
- const query = new Map();
809
- query.set('folderId', this._getCurrentFolderId());
810
- query.set('page', this._currentPage);
811
- query.set('searchText', this._searchText || '*');
812
- if (this.enablePagination) {
813
- query.set('limit', this._itemsPerPage);
814
- }
815
- this.dataSource.match(query);
816
- }
817
- /** @hidden */
818
- _countUnvisibleItems() {
819
- const itemsPerPage = this._itemsPerPage;
820
- this._countShowedItems = this._currentPage * itemsPerPage - itemsPerPage + 1;
821
- this._countNotShowedItems = this._countShowedItems + this._visibleList$.value.length - 1;
822
- }
823
- /** @hidden */
824
- _clearItemSameFilenameState(currentItem) {
825
- if (!currentItem) {
826
- return;
827
- }
828
- for (const item of this._getList()) {
829
- if (item.documentId === currentItem.documentId) {
830
- delete item.sameFilenameState;
831
- break;
832
- }
833
- }
834
- }
835
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: UploadCollectionComponent, deps: [{ token: i1.DialogService }, { token: i2.FilesValidatorService }, { token: i0.ChangeDetectorRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
836
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: UploadCollectionComponent, isStandalone: true, selector: "fdp-upload-collection", inputs: { id: "id", itemsPerPage: "itemsPerPage", dataSource: "dataSource", fileTypes: "fileTypes", maxFileSize: "maxFileSize", maxFilenameLength: "maxFilenameLength", mimeTypes: "mimeTypes", disabled: "disabled", readonly: "readonly", hierarchy: "hierarchy", enablePagination: "enablePagination", terminationEnabled: "terminationEnabled", multiple: "multiple", showSearch: "showSearch", sameFileNameAllowed: "sameFileNameAllowed" }, outputs: { typeMismatch: "typeMismatch", filenameLengthExceed: "filenameLengthExceed", fileSizeExceed: "fileSizeExceed" }, viewQueries: [{ propertyName: "_uploadFilesRef", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "_updateVersionRef", first: true, predicate: ["updateVersionInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [id]=\"id\" class=\"fdp-upload-collection\">\n <!-- Message strip -->\n <fd-message-strip *ngIf=\"_message\" [type]=\"_message.messageStripType\" (onDismiss)=\"_messageStripDismiss()\">\n <ng-container\n [ngTemplateOutlet]=\"message\"\n [ngTemplateOutletContext]=\"{\n messageType: _message.messageType,\n payload: _message.payload,\n messageStripType: _message.messageStripType,\n count: _message.count\n }\"\n ></ng-container>\n </fd-message-strip>\n\n <!-- Toolbar -->\n <fd-toolbar class=\"fdp-upload-collection__toolbar\">\n <div [style.flex]=\"'1 auto'\">\n <fd-breadcrumb [id]=\"id + '-breadcrumb'\">\n <fd-breadcrumb-item>\n <ng-template #multipleBreadcrumbs>\n <a href=\"#\" fd-link (click)=\"_breadcrumbGoTo($event)\">\n {{ 'platformUploadCollection.breadcrumbLabelAllFiles' | fdTranslate }}\n </a>\n </ng-template>\n <ng-template #singleBreadcrumb>\n <span>\n {{\n 'platformUploadCollection.breadcrumbLabelAllFilesWithTotal'\n | fdTranslate : { total: _totalItems }\n }}\n </span>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"_breadcrumbList.length > 0 ? multipleBreadcrumbs : singleBreadcrumb\"\n ></ng-container>\n </fd-breadcrumb-item>\n <fd-breadcrumb-item *ngFor=\"let item of _breadcrumbList; let i = index\">\n <ng-template #clickableBreadcrumb>\n <a href=\"#\" fd-link (click)=\"_breadcrumbGoTo($event, i)\">{{ item.folderName }}</a>\n </ng-template>\n <ng-template #textBreadcrumb>\n <span>{{ item.folderName }} ({{ _totalItems }})</span>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"item.clikable ? clickableBreadcrumb : textBreadcrumb\"\n ></ng-container>\n </fd-breadcrumb-item>\n </fd-breadcrumb>\n </div>\n\n <fd-toolbar-spacer [style.max-width.rem]=\"3\"></fd-toolbar-spacer>\n <ng-container *ngIf=\"readonly || selectedItems.length === 0\">\n <fd-input-group\n *ngIf=\"showSearch\"\n [(ngModel)]=\"_searchText\"\n (ngModelChange)=\"_searchInputChanged()\"\n glyph=\"search\"\n [ariaLabelledBy]=\"id + '-breadcrumb'\"\n [placeholder]=\"'platformUploadCollection.searchPlaceholder' | fdTranslate\"\n ></fd-input-group>\n\n <ng-container *ngIf=\"!readonly\">\n <button\n fd-toolbar-item\n fd-button\n (click)=\"_openUploadFiles()\"\n fdType=\"ghost\"\n [disabled]=\"disabled\"\n [label]=\"'platformUploadCollection.addBtnLabel' | fdTranslate\"\n [title]=\"'platformUploadCollection.addBtnLabel' | fdTranslate\"\n ></button>\n\n <button\n fd-toolbar-item\n fd-button\n (click)=\"_openNewFolderDialog()\"\n *ngIf=\"hierarchy\"\n [disabled]=\"disabled\"\n fdType=\"transparent\"\n [label]=\"'platformUploadCollection.newFolderBtnLabel' | fdTranslate\"\n [title]=\"'platformUploadCollection.newFolderBtnLabel' | fdTranslate\"\n ></button>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!readonly && selectedItems.length > 0\">\n <button\n fd-toolbar-item\n fd-button\n (click)=\"_moveToClicked(true)\"\n fdType=\"ghost\"\n [disabled]=\"disabled\"\n [label]=\"'platformUploadCollection.moveToBtnLabel' | fdTranslate\"\n [title]=\"'platformUploadCollection.moveToBtnLabel' | fdTranslate\"\n ></button>\n <button\n fd-toolbar-item\n fd-button\n (click)=\"_downloadClicked(true)\"\n fdType=\"ghost\"\n [disabled]=\"disabled\"\n *ngIf=\"_showIfSelectedOnlyFiles()\"\n [label]=\"'platformUploadCollection.downloadBtnLabel' | fdTranslate\"\n [title]=\"'platformUploadCollection.downloadBtnLabel' | fdTranslate\"\n ></button>\n <button\n fd-toolbar-item\n fd-button\n (click)=\"_remove(true)\"\n fdType=\"ghost\"\n [disabled]=\"disabled\"\n [label]=\"'platformUploadCollection.removeBtnLabel' | fdTranslate\"\n [title]=\"'platformUploadCollection.removeBtnLabel' | fdTranslate\"\n ></button>\n </ng-container>\n </fd-toolbar>\n\n <div class=\"fdp-upload-collection__table--wrapper\">\n <div\n class=\"fdp-upload-collection__table\"\n fdpUploadCollectionDragnDrop\n [fileTypes]=\"fileTypes\"\n [maxFilenameLength]=\"maxFilenameLength\"\n [maxFileSize]=\"maxFileSize\"\n [mimeTypes]=\"mimeTypes\"\n [dragndrop]=\"!readonly\"\n [disabled]=\"disabled\"\n [multiple]=\"multiple\"\n (fileChanged)=\"_handleDrop($event)\"\n (cancel)=\"_dragDropCancel()\"\n (onDropzone)=\"_onDropzone($event)\"\n >\n <!-- Table -->\n <fdp-table\n *ngIf=\"_visibleList$.value.length > 0\"\n [dataSource]=\"_visibleList$\"\n [loading]=\"dataSource.isDataLoading\"\n selectionMode=\"multiple\"\n emptyTableMessage=\"\"\n [noHorizontalBorders]=\"true\"\n [trackBy]=\"_trackByDocumentId\"\n (rowSelectionChange)=\"_onRowSelectionChange($event)\"\n >\n <fdp-column name=\"name\" label=\"Name\" width=\"8rem\">\n <fdp-table-cell *fdpCellDef=\"let item\">\n <div class=\"fdp-upload-collection__vertical-align-center\">\n <fd-icon\n class=\"fdp-upload-collection__fd-icon\"\n *ngIf=\"item.type === 'folder'\"\n glyph=\"folder-blank\"\n [title]=\"'platformUploadCollection.folderIconTitle' | fdTranslate\"\n ></fd-icon>\n <fd-icon\n class=\"fdp-upload-collection__fd-icon\"\n *ngIf=\"item.type === 'file'\"\n [glyph]=\"_getIconByType(item)\"\n [title]=\"'platformUploadCollection.fileIconTitle' | fdTranslate\"\n ></fd-icon>\n\n <ng-container *ngIf=\"disabled || readonly || !_isSelectedItem(item); else editMode\">\n <span\n [class.fdp-upload-collection__cursor]=\"item.type === 'folder'\"\n (click)=\"_openFolder(item)\"\n >{{ item.name }}</span\n >\n </ng-container>\n </div>\n\n <ng-template #editMode>\n <div fd-form-item>\n <fd-form-input-message-group [triggers]=\"[]\" [isOpen]=\"!!item.sameFilenameState\">\n <div class=\"fdp-upload-collection__vertical-align-center\">\n <input\n fd-form-control\n [value]=\"_getItemName(item)\"\n (blur)=\"_fileNameChange($event, item)\"\n (input)=\"_checkName($event, item)\"\n type=\"text\"\n [placeholder]=\"\n 'platformUploadCollection.editFileNameInputPlaceholder' | fdTranslate\n \"\n [state]=\"item.sameFilenameState\"\n />\n <span class=\"fdp-upload-collection__item_extension\">{{\n _getItemExtension(item)\n }}</span>\n </div>\n\n <fd-form-message [type]=\"item.sameFilenameState\">\n {{\n (item.type === 'file'\n ? 'platformUploadCollection.editFileNameFileAlreadyExistsError'\n : 'platformUploadCollection.editFileNameFolderAlreadyExistsError'\n ) | fdTranslate\n }}\n </fd-form-message>\n </fd-form-input-message-group>\n </div>\n </ng-template>\n </fdp-table-cell>\n </fdp-column>\n\n <fdp-column name=\"uploadedBy\" label=\"Uploaded by\" width=\"5rem\">\n <fdp-table-cell *fdpCellDef=\"let item\">{{ item.uploadedBy.name }}</fdp-table-cell>\n </fdp-column>\n\n <fdp-column name=\"uploadedOn\" label=\"Uploaded on\" width=\"5rem\">\n <fdp-table-cell *fdpCellDef=\"let item\">{{ item.uploadedOn | date : 'shortDate' }}</fdp-table-cell>\n </fdp-column>\n\n <fdp-column name=\"size\" label=\"File size\" width=\"5rem\">\n <fdp-table-cell *fdpCellDef=\"let item\">{{ item.fileSize | convertBytes }}</fdp-table-cell>\n </fdp-column>\n\n <fdp-column name=\"version\" label=\"Version\" width=\"5rem\">\n <fdp-table-cell *fdpCellDef=\"let item\">{{ item.version || '' }}</fdp-table-cell>\n </fdp-column>\n\n <fdp-column name=\"status\" label=\"Status\" width=\"5rem\">\n <fdp-table-cell *fdpCellDef=\"let item\">\n <fd-busy-indicator\n *ngIf=\"item.status === _uploadCollectionItemStatus.LOADING\"\n [loading]=\"true\"\n ariaLabel=\"Status: Loading\"\n ariaLive=\"polite\"\n size=\"s\"\n ></fd-busy-indicator>\n <span\n *ngIf=\"item.status === _uploadCollectionItemStatus.SUCCESSFUL\"\n fd-object-status\n status=\"positive\"\n >\n {{ 'platformUploadCollection.itemStatusSuccessful' | fdTranslate }}\n </span>\n <span\n *ngIf=\"item.status === _uploadCollectionItemStatus.UNSUCCESSFUL\"\n fd-object-status\n status=\"negative\"\n >\n {{ 'platformUploadCollection.itemStatusUnsuccessful' | fdTranslate }}\n </span>\n </fdp-table-cell>\n </fdp-column>\n\n <fdp-column name=\"action\" *ngIf=\"!readonly\" width=\"5rem\" align=\"end\">\n <fdp-table-header *fdpHeaderCellDef>Action</fdp-table-header>\n <fdp-table-cell *fdpCellDef=\"let item\">\n <div class=\"fdp-upload-collection__actions\">\n <div class=\"fdp-upload-collection__actions--status\">\n <button\n fd-button\n [label]=\"'platformUploadCollection.uploadNewFileAfterFailAction' | fdTranslate\"\n [title]=\"'platformUploadCollection.uploadNewFileAfterFailAction' | fdTranslate\"\n (click)=\"_runUploadNewFileAfterFail(item)\"\n fdType=\"ghost\"\n [disabled]=\"disabled\"\n *ngIf=\"item.status === _uploadCollectionItemStatus.UNSUCCESSFUL\"\n ></button>\n\n <button\n fd-button\n [label]=\"'platformUploadCollection.cancelUploadNewFileAction' | fdTranslate\"\n [title]=\"'platformUploadCollection.cancelUploadNewFileAction' | fdTranslate\"\n fdType=\"ghost\"\n [disabled]=\"disabled\"\n (click)=\"_cancelUploadNewFile(item)\"\n *ngIf=\"terminationEnabled && item.status === _uploadCollectionItemStatus.LOADING\"\n ></button>\n </div>\n\n <fdp-menu-button\n icon=\"overflow\"\n [disabled]=\"disabled\"\n type=\"transparent\"\n [title]=\"'platformUploadCollection.itemMenuBtnTitle' | fdTranslate\"\n [fdpMenuTriggerFor]=\"menuActions\"\n (buttonClicked)=\"_actionButton(item)\"\n >\n </fdp-menu-button>\n </div>\n </fdp-table-cell>\n </fdp-column>\n </fdp-table>\n\n <!-- Dragdrop area -->\n <div\n class=\"fdp-upload-collection__dragdrop-area\"\n *ngIf=\"_showDragDropArea\"\n [class.active]=\"_onDragDropArea\"\n >\n <fd-icon class=\"fdp-upload-collection__dragdrop-area--icon\" glyph=\"upload-to-cloud\"></fd-icon>\n <p class=\"fdp-upload-collection__dragdrop-area--text\">\n {{ 'platformUploadCollection.dragDropAreaText' | fdTranslate }}\n </p>\n </div>\n\n <!-- No data -->\n <div\n class=\"fdp-upload-collection__no-data\"\n *ngIf=\"_visibleList$.value.length === 0\"\n [class.invisible]=\"_showDragDropArea\"\n >\n <fd-icon glyph=\"document\"></fd-icon>\n <h3>{{ 'platformUploadCollection.noDataText' | fdTranslate }}</h3>\n <p>{{ 'platformUploadCollection.noDataDescription' | fdTranslate }}</p>\n </div>\n </div>\n\n <!-- Table footer -->\n <div class=\"fdp-upload-collection__table-footer\" *ngIf=\"enablePagination && _totalItems\">\n <!-- Pagination -->\n <div class=\"fdp-upload-collection__pagination\">\n <span [id]=\"id + '-pagination'\" class=\"fdp-upload-collection__pagination--total\">\n {{\n 'platformUploadCollection.paginationTotal'\n | fdTranslate : { from: _countShowedItems, to: _countNotShowedItems, total: _totalItems }\n }}\n </span>\n <fd-pagination\n [totalItems]=\"_totalItems\"\n [displayTotalItems]=\"false\"\n (pageChangeStart)=\"_pageChanged($event)\"\n [itemsPerPage]=\"_itemsPerPage\"\n [currentPage]=\"_currentPage\"\n [attr.aria-labelledby]=\"id + '-pagination'\"\n ></fd-pagination>\n </div>\n\n <!-- Results per page -->\n <div class=\"fdp-upload-collection__results\">\n <span class=\"fdp-upload-collection__results--title\">\n <span [id]=\"id + '-results'\">\n {{ 'platformUploadCollection.resultsPerPage' | fdTranslate }}\n </span>\n <span *ngIf=\"_itemsPerPageOptions.length === 0\">{{ _itemsPerPage }}</span>\n </span>\n <fdp-menu-button\n *ngIf=\"_itemsPerPageOptions.length > 0\"\n type=\"ghost\"\n [ariaLabelledBy]=\"id + '-results'\"\n [fdpMenuTriggerFor]=\"itemsPerPageMenu\"\n [label]=\"_itemsPerPage + ''\"\n >\n </fdp-menu-button>\n </div>\n </div>\n </div>\n</div>\n\n<fdp-menu #itemsPerPageMenu xPosition=\"before\">\n <fdp-menu-item\n *ngFor=\"let value of _itemsPerPageOptions\"\n (itemSelect)=\"_itemsPerPageChange(value.label)\"\n [attr.title]=\"'Results per page: ' + value.label\"\n >\n <span>{{ value.label }}</span>\n </fdp-menu-item>\n</fdp-menu>\n\n<fdp-menu #menuActions xPosition=\"before\">\n <fdp-menu-item (itemSelect)=\"_moveToClicked()\">\n <fd-icon\n class=\"fdp-upload-collection__fd-icon\"\n glyph=\"folder-blank\"\n [title]=\"'platformUploadCollection.moveToBtnLabel' | fdTranslate\"\n ></fd-icon>\n <span>\n {{ 'platformUploadCollection.moveToBtnLabel' | fdTranslate }}\n </span>\n </fdp-menu-item>\n <ng-container *ngIf=\"_activeItem?.type === 'file'\">\n <fdp-menu-item (itemSelect)=\"_downloadClicked()\">\n <fd-icon\n class=\"fdp-upload-collection__fd-icon\"\n glyph=\"download\"\n [title]=\"'platformUploadCollection.downloadBtnLabel' | fdTranslate\"\n ></fd-icon>\n <span>\n {{ 'platformUploadCollection.downloadBtnLabel' | fdTranslate }}\n </span>\n </fdp-menu-item>\n <fdp-menu-item (itemSelect)=\"_openUpdateFileVersion()\">\n <fd-icon\n class=\"fdp-upload-collection__fd-icon\"\n glyph=\"drill-up\"\n [title]=\"'platformUploadCollection.updateVersionBtnLabel' | fdTranslate\"\n ></fd-icon>\n <span>\n {{ 'platformUploadCollection.updateVersionBtnLabel' | fdTranslate }}\n </span>\n </fdp-menu-item>\n </ng-container>\n <fdp-menu-item (itemSelect)=\"_remove()\">\n <fd-icon\n class=\"fdp-upload-collection__fd-icon\"\n glyph=\"delete\"\n [title]=\"'platformUploadCollection.removeBtnLabel' | fdTranslate\"\n ></fd-icon>\n <span>\n {{ 'platformUploadCollection.removeBtnLabel' | fdTranslate }}\n </span>\n </fdp-menu-item>\n</fdp-menu>\n\n<input\n #fileInput\n class=\"fdp-upload-collection__hidden\"\n type=\"file\"\n (fileSelected)=\"_selectHandler($event)\"\n [multiple]=\"multiple\"\n [disabled]=\"disabled\"\n fdFileSelect\n/>\n\n<input\n #updateVersionInput\n class=\"fdp-upload-collection__hidden\"\n type=\"file\"\n (fileSelected)=\"_selectHandler($event)\"\n [disabled]=\"disabled\"\n [multiple]=\"false\"\n fdFileSelect\n/>\n\n<ng-template\n let-messageType=\"messageType\"\n let-payload=\"payload\"\n let-messageStripType=\"messageStripType\"\n let-count=\"count\"\n #message\n>\n <ng-container *ngIf=\"_message\" [ngSwitch]=\"messageType\">\n <ng-container\n *ngSwitchCase=\"_messageType.CREATE\"\n [ngTemplateOutlet]=\"messageNewFolder\"\n [ngTemplateOutletContext]=\"{\n messageStripType: _message.messageStripType,\n payload: _message.payload\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.UPDATE_VERSION\"\n [ngTemplateOutlet]=\"messageUpdateVersion\"\n [ngTemplateOutletContext]=\"{\n messageStripType: _message.messageStripType,\n payload: _message.payload\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.FILE_RENAME\"\n [ngTemplateOutlet]=\"messageFileRename\"\n [ngTemplateOutletContext]=\"{\n messageStripType: _message.messageStripType,\n payload: _message.payload\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.REMOVE\"\n [ngTemplateOutlet]=\"messageRemove\"\n [ngTemplateOutletContext]=\"{\n payload: _message.payload,\n messageStripType: _message.messageStripType,\n count: _message.count\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.MOVE\"\n [ngTemplateOutlet]=\"messageMove\"\n [ngTemplateOutletContext]=\"{\n payload: _message.payload,\n messageStripType: _message.messageStripType,\n count: _message.count\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.TYPE_MISMATCH\"\n [ngTemplateOutlet]=\"messageTypeMismatch\"\n [ngTemplateOutletContext]=\"{\n payload: _message.payload,\n messageStripType: _message.messageStripType,\n count: _message.count\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.FILE_SIZE\"\n [ngTemplateOutlet]=\"messageFileSize\"\n [ngTemplateOutletContext]=\"{\n payload: _message.payload,\n messageStripType: _message.messageStripType,\n count: _message.count\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.FILE_NAME_LENGTH\"\n [ngTemplateOutlet]=\"messageFilenameLength\"\n [ngTemplateOutletContext]=\"{\n payload: _message.payload,\n messageStripType: _message.messageStripType,\n count: _message.count\n }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #messageNewFolder let-payload=\"payload\" let-messageStripType=\"messageStripType\">\n <ng-container *ngIf=\"messageStripType === 'error'; else foldersCreated\">\n {{ 'platformUploadCollection.messageCreateFailed' | fdTranslate : { folderName: payload.folder.name } }}\n </ng-container>\n <ng-template #foldersCreated>\n {{ 'platformUploadCollection.messageCreateSuccess' | fdTranslate : { folderName: payload.folder.name } }}\n </ng-template>\n</ng-template>\n\n<ng-template #messageUpdateVersion let-payload=\"payload\" let-messageStripType=\"messageStripType\">\n <ng-container *ngIf=\"messageStripType === 'error'; else versionUpdated\">\n {{ 'platformUploadCollection.messageUpdateVersionFailed' | fdTranslate : { folderName: payload.item.name } }}\n </ng-container>\n <ng-template #versionUpdated>\n {{ 'platformUploadCollection.messageUpdateVersionSuccess' | fdTranslate : { folderName: payload.item.name } }}\n </ng-template>\n</ng-template>\n\n<ng-template #messageFileRename let-payload=\"payload\" let-messageStripType=\"messageStripType\">\n <ng-container *ngIf=\"messageStripType === 'error'; else fileRenamed\">\n {{\n 'platformUploadCollection.messageFileRenameFailed'\n | fdTranslate : { from: payload.item.name, to: payload.fileName }\n }}\n </ng-container>\n <ng-template #fileRenamed>\n {{\n 'platformUploadCollection.messageFileRenameSuccess'\n | fdTranslate : { from: payload.item.name, to: payload.fileName }\n }}\n </ng-template>\n</ng-template>\n\n<ng-template #messageRemove let-payload=\"payload\" let-messageStripType=\"messageStripType\" let-count=\"count\">\n <ng-container *ngIf=\"payload.items.length > 1 && count.folder && count.file\">\n <ng-container *ngIf=\"messageStripType === 'error'; else foldersAndFilesRemoved\">\n {{\n 'platformUploadCollection.messageRemoveFoldersAndFilesFailed'\n | fdTranslate : { foldersCount: count.folder, filesCount: count.file }\n }}\n </ng-container>\n <ng-template #foldersAndFilesRemoved>\n {{\n 'platformUploadCollection.messageRemoveFoldersAndFilesSuccess'\n | fdTranslate : { foldersCount: count.folder, filesCount: count.file }\n }}\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length > 1 && count.folder && !count.file\">\n <ng-container *ngIf=\"messageStripType === 'error'; else foldersRemoved\">\n {{ 'platformUploadCollection.messageRemoveFoldersFailed' | fdTranslate : { foldersCount: count.folder } }}\n </ng-container>\n <ng-template #foldersRemoved>\n {{ 'platformUploadCollection.messageRemoveFoldersSuccess' | fdTranslate : { foldersCount: count.folder } }}\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length > 1 && count.file && !count.folder\">\n <ng-container *ngIf=\"messageStripType === 'error'; else filesRemoved\">\n {{ 'platformUploadCollection.messageRemoveFilesFailed' | fdTranslate : { filesCount: count.file } }}\n </ng-container>\n <ng-template #filesRemoved>\n {{ 'platformUploadCollection.messageRemoveFilesSuccess' | fdTranslate : { filesCount: count.file } }}\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length === 1\">\n <ng-container *ngIf=\"messageStripType === 'error'; else oneItemRemoved\">\n {{\n 'platformUploadCollection.messageRemoveFileOrFolderFailed'\n | fdTranslate : { name: payload.items[0].name }\n }}\n </ng-container>\n <ng-template #oneItemRemoved>\n {{\n 'platformUploadCollection.messageRemoveFileOrFolderSuccess'\n | fdTranslate : { name: payload.items[0].name }\n }}\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #messageMove let-payload=\"payload\" let-messageStripType=\"messageStripType\" let-count=\"count\">\n <ng-container *ngIf=\"payload.items.length > 1 && count.folder && count.file\">\n <ng-container *ngIf=\"messageStripType === 'error'; else filesAndFoldersMovedTo\">\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFoldersAndFilesFailed'\n : 'platformUploadCollection.messageMoveRootFoldersAndFilesFailed'\n ) | fdTranslate : { foldersCount: count.folder, filesCount: count.file, to: payload.to?.name }\n }}\n </ng-container>\n <ng-template #filesAndFoldersMovedTo>\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFoldersAndFilesSuccess'\n : 'platformUploadCollection.messageMoveRootFoldersAndFilesSuccess'\n ) | fdTranslate : { foldersCount: count.folder, filesCount: count.file, to: payload.to?.name }\n }}\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length > 1 && count.folder && !count.file\">\n <ng-container *ngIf=\"messageStripType === 'error'; else foldersMovedTo\">\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFoldersFailed'\n : 'platformUploadCollection.messageMoveRootFoldersFailed'\n ) | fdTranslate : { foldersCount: count.folder, to: payload.to?.name }\n }}\n </ng-container>\n <ng-template #foldersMovedTo>\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFoldersSuccess'\n : 'platformUploadCollection.messageMoveRootFoldersSuccess'\n ) | fdTranslate : { foldersCount: count.folder, to: payload.to?.name }\n }}\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length > 1 && count.file && !count.folder\">\n <ng-container *ngIf=\"messageStripType === 'error'; else filesMovedTo\">\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFilesFailed'\n : 'platformUploadCollection.messageMoveRootFilesFailed'\n ) | fdTranslate : { filesCount: count.file, to: payload.to?.name }\n }}\n </ng-container>\n <ng-template #filesMovedTo>\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFilesSuccess'\n : 'platformUploadCollection.messageMoveRootFilesSuccess'\n ) | fdTranslate : { filesCount: count.file, to: payload.to?.name }\n }}\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length === 1\">\n <ng-container *ngIf=\"messageStripType === 'error'; else oneItemMovedTo\">\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFileOrFolderFailed'\n : 'platformUploadCollection.messageMoveRootFileOrFolderFailed'\n ) | fdTranslate : { name: payload.items[0].name, to: payload.to?.name }\n }}\n </ng-container>\n <ng-template #oneItemMovedTo>\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFileOrFolderSuccess'\n : 'platformUploadCollection.messageMoveRootFileOrFolderSuccess'\n ) | fdTranslate : { name: payload.items[0].name, to: payload.to?.name }\n }}\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #messageTypeMismatch let-payload=\"payload\" let-messageStripType=\"messageStripType\" let-count=\"count\">\n <ng-container *ngIf=\"payload.items.length > 1\">\n {{\n 'platformUploadCollection.messageFileTypeMismatchPlural'\n | fdTranslate : { filesCount: payload.items.length, allowedTypes: _getAllowedTypes() }\n }}\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length === 1\">\n {{\n 'platformUploadCollection.messageFileTypeMismatchSingular'\n | fdTranslate : { fileName: payload.items[0].name, allowedTypes: _getAllowedTypes() }\n }}\n </ng-container>\n</ng-template>\n\n<ng-template #messageFileSize let-payload=\"payload\" let-messageStripType=\"messageStripType\" let-count=\"count\">\n <ng-container *ngIf=\"payload.items.length > 1\">\n {{\n 'platformUploadCollection.messageFileSizeExceededPlural'\n | fdTranslate : { filesCount: payload.items.length, maxFileSize: maxFileSize || 0 }\n }}\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length === 1\">\n {{\n 'platformUploadCollection.messageFileSizeExceededSingular'\n | fdTranslate : { fileName: payload.items[0].name, maxFileSize: maxFileSize || 0 }\n }}\n </ng-container>\n</ng-template>\n\n<ng-template #messageFilenameLength let-payload=\"payload\" let-messageStripType=\"messageStripType\" let-count=\"count\">\n <ng-container *ngIf=\"payload.items.length > 1\">\n {{\n 'platformUploadCollection.messageFileNameLengthExceededPlural'\n | fdTranslate : { filesCount: payload.items.length, maxFilenameLength: maxFilenameLength || 0 }\n }}\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length === 1\">\n {{\n 'platformUploadCollection.messageFileNameLengthExceededSingular'\n | fdTranslate : { fileName: payload.items[0].name, maxFilenameLength: maxFilenameLength || 0 }\n }}\n </ng-container>\n</ng-template>\n", styles: [".fdp-upload-collection__fd-icon{color:#0854a0!important;color:var(--sapHighlightColor)!important;margin-right:.625rem!important;font-size:1rem!important}.fdp-upload-collection fd-message-strip{margin-bottom:.625rem}.fdp-upload-collection__toolbar .fd-toolbar{margin-bottom:.625rem;border:0}.fdp-upload-collection__toolbar .fd-toolbar fd-input-group .sap-icon--search{color:#0854a0;color:var(--sapHighlightColor)}.fdp-upload-collection__no-data{text-align:center;min-height:230px;display:flex;align-items:center;flex-direction:column;justify-content:center}.fdp-upload-collection__no-data fd-icon{font-size:3rem;line-height:3rem;margin:0;color:#6a6d70;color:var(--sapContent_LabelColor)}.fdp-upload-collection__no-data h3{font-size:1.125rem;font-size:var(--sapFontHeader4Size);line-height:1rem;margin:8px 0}.fdp-upload-collection__no-data p{font-size:.875rem;font-size:var(--sapFontSize);line-height:1rem;color:#6a6d70;color:var(--sapContent_LabelColor);margin:0}.fdp-upload-collection__no-data.invisible{opacity:0}.fdp-upload-collection__table{position:relative}.fdp-upload-collection__table-footer{display:flex;justify-content:space-between;align-items:center;margin-top:.625rem}.fdp-upload-collection__table-footer .fdp-upload-collection__results--title,.fdp-upload-collection__table-footer .fdp-upload-collection__pagination--total{line-height:1.4;line-height:var(--sapContent_LineHeight);color:#32363a;color:var(--sapTextColor);font-family:\"72\",\"72full\",Arial,Helvetica,sans-serif;font-family:var(--sapFontFamily);font-weight:400;-webkit-font-smoothing:antialiased;box-sizing:border-box;padding:0;margin:0;border:0;font-size:.875rem;font-size:var(--sapFontSize);color:#6a6d70;color:var(--sapContent_LabelColor);margin-right:.5rem}.fdp-upload-collection__table-footer .fdp-upload-collection__results--title:before,.fdp-upload-collection__table-footer .fdp-upload-collection__results--title:after,.fdp-upload-collection__table-footer .fdp-upload-collection__pagination--total:before,.fdp-upload-collection__table-footer .fdp-upload-collection__pagination--total:after{box-sizing:inherit;font-size:inherit}[dir=rtl] .fdp-upload-collection__table-footer .fdp-upload-collection__results--title,.fdp-upload-collection__table-footer .fdp-upload-collection__results--title[dir=rtl],[dir=rtl] .fdp-upload-collection__table-footer .fdp-upload-collection__pagination--total,.fdp-upload-collection__table-footer .fdp-upload-collection__pagination--total[dir=rtl]{margin-right:0;margin-left:.5rem}.fdp-upload-collection__table-footer .fdp-upload-collection__pagination--total{width:100%;align-self:center}.fdp-upload-collection__table-footer .fdp-upload-collection__pagination{font-size:.875rem;font-size:var(--sapFontSize);line-height:1.4;line-height:var(--sapContent_LineHeight);color:#32363a;color:var(--sapTextColor);font-family:\"72\",\"72full\",Arial,Helvetica,sans-serif;font-family:var(--sapFontFamily);font-weight:400;-webkit-font-smoothing:antialiased;box-sizing:border-box;padding:0;margin:0;border:0;display:flex}.fdp-upload-collection__table-footer .fdp-upload-collection__pagination:before,.fdp-upload-collection__table-footer .fdp-upload-collection__pagination:after{box-sizing:inherit;font-size:inherit}.fdp-upload-collection__hidden{display:none}.fdp-upload-collection__vertical-align-center{display:flex;align-items:center}.fdp-upload-collection__cursor{cursor:pointer}.fdp-upload-collection__item_extension{white-space:nowrap}.fdp-upload-collection__actions{display:flex;justify-content:space-between;align-items:center}.fdp-upload-collection__actions .sap-icon--slim-arrow-down{display:none}.fdp-upload-collection__dragdrop-area{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column;background:rgba(255,255,255,.5);outline:2px dashed transparent;outline-color:#89919a;outline-color:var(--sapField_BorderColor);outline-offset:-4px;box-sizing:border-box}.fdp-upload-collection__dragdrop-area fd-icon{font-size:3rem;line-height:3rem;margin-bottom:1rem;color:#6a6d70;color:var(--sapContent_LabelColor)}.fdp-upload-collection__dragdrop-area p{font-size:1rem;line-height:1.125rem;color:#6a6d70;color:var(--sapContent_LabelColor)}.fdp-upload-collection__dragdrop-area.active{outline-color:#0854a0;outline-color:var(--sapContent_DragAndDropActiveColor);background:rgba(8,84,160,.08)}.fdp-upload-collection__dragdrop-area.active fd-icon,.fdp-upload-collection__dragdrop-area.active p{color:#0854a0;color:var(--sapContent_DragAndDropActiveColor)}.fdp-upload-collection .fd-form-item{align-items:center;flex-direction:row}.fdp-upload-collection-dialig-no-bg{background-color:transparent!important}[dir=rtl] .fdp-upload-collection fd-icon{margin-right:0;margin-left:.625rem}.fd-menu__list .disabled{background-color:#fff!important;background-color:var(--sapList_Background)!important;cursor:not-allowed}.fd-menu__list .disabled .fd-menu__title{color:#32363a!important;color:var(--sapList_TextColor)!important}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MessageStripComponent, selector: "fd-message-strip", inputs: ["class", "dismissible", "noIcon", "type", "id", "ariaLabelledBy", "ariaLabel", "width", "minWidth", "marginBottom", "indicationColor"], outputs: ["onDismiss"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ToolbarComponent, selector: "fd-toolbar", inputs: ["titleId", "class", "shouldOverflow", "fdType", "title", "active", "clearBorder", "forceOverflow", "tabindex", "ariaLabel", "ariaLabelledBy"] }, { kind: "component", type: BreadcrumbComponent, selector: "fd-breadcrumb", inputs: ["reverse", "tabIndex"], outputs: ["visibleItemsCount", "hiddenItemsCount"] }, { kind: "component", type: BreadcrumbItemComponent, selector: "fd-breadcrumb-item" }, { kind: "component", type: LinkComponent, selector: "[fdLink], [fd-link]", inputs: ["class", "emphasized", "disabled", "inverted", "subtle", "undecorated"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: ToolbarSpacerDirective, selector: "fd-toolbar-spacer", inputs: ["width", "class", "fixed"] }, { kind: "component", type: InputGroupComponent, selector: "fd-input-group", inputs: ["placement", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "addonButtonAriaHidden", "iconTitle", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "directive", type: ToolbarItemDirective, selector: "[fd-toolbar-item], [fdOverflowGroup], [fdOverflowPriority]", inputs: ["fdOverflowPriority", "fdOverflowGroup"] }, { kind: "directive", type: UploadCollectionDragnDropDirective, selector: "[fdpUploadCollectionDragnDrop]", inputs: ["multiple", "fileTypes", "maxFileSize", "maxFilenameLength", "mimeTypes", "disabled", "dragndrop"], outputs: ["fileChanged", "cancel", "onDropzone"] }, { kind: "component", type: TableComponent, selector: "fdp-table", inputs: ["name", "id", "enableDragResize", "fixed", "freezeColumnsTo", "freezeEndColumnsTo", "pageScrolling", "pageSize", "pageScrollingThreshold", "bodyHeight", "emptyTableMessage", "noVisibleColumnsMessage", "noHorizontalBorders", "noVerticalBorders", "noBorders", "noBodyBorders", "noOuterBorders", "noBorderX", "noBorderY", "relationKey", "expandedStateKey", "hasChildrenKey", "rowNavigatable", "highlightNavigatedRow", "rowsActivable", "selectedKey", "selectableKey", "trackBy", "rowComparator", "rowsClass", "editableRowSkeleton", "expandOnInit", "rowHeight", "loadPagesBefore", "selectionMode", "enableTristateMode", "semanticHighlighting", "forceCheckedAllState", "ariaLabelledBy", "loading"], outputs: ["presetChanged", "rowSelectionChange", "sortChange", "filterChange", "groupChange", "columnsChange", "pageChange", "columnFreeze", "rowToggleOpenState", "rowActivate", "rowNavigate", "emptyRowAdded", "save", "cancel", "tableScrolled", "tableRowsSet", "allRowsExpanded", "allRowsCollapsed", "cellFocused"] }, { kind: "directive", type: TableInitialStateDirective, selector: "[fdpTableInitialState], fdp-table", inputs: ["initialVisibleColumns", "initialSortBy", "initialFilterBy", "initialGroupBy", "initialPage", "state"] }, { kind: "component", type: TableColumnComponent, selector: "fdp-column", inputs: ["name", "key", "label", "align", "sortable", "filterable", "visible", "dataType", "groupable", "freezable", "endFreezable", "width", "noWrap", "applyText", "role"] }, { kind: "directive", type: FdpCellDef, selector: "[fdpCellDef]", inputs: ["fdpCellDefAs"] }, { kind: "directive", type: FdpTableCell, selector: "fdp-table-cell" }, { kind: "component", type: IconComponent, selector: "fd-icon", inputs: ["glyph", "font", "color", "background", "class", "ariaLabel", "ariaHidden"] }, { kind: "component", type: FormItemComponent, selector: "[fd-form-item]", inputs: ["isInline", "horizontal"] }, { kind: "component", type: FormInputMessageGroupComponent, selector: "fd-form-input-message-group", inputs: ["triggers", "closeOnOutsideClick", "fillControlMode", "noArrow", "closeOnEscapeKey", "placement", "placementContainer", "isOpen"], outputs: ["isOpenChange"] }, { kind: "component", type: FormControlComponent, selector: "input[fd-form-control], textarea[fd-form-control]", inputs: ["state", "type", "class", "ariaLabel", "ariaLabelledBy"] }, { kind: "component", type: FormMessageComponent, selector: "fd-form-message", inputs: ["type", "static", "embedded", "class"] }, { kind: "component", type: BusyIndicatorComponent, selector: "fd-busy-indicator", inputs: ["loading", "size", "block", "ariaLabel", "title", "label", "ariaLive"] }, { kind: "component", type: ObjectStatusComponent, selector: "[fd-object-status]", inputs: ["class", "status", "glyph", "label", "glyphAriaLabel", "indicationColor", "clickable", "inverted", "large", "secondaryIndication", "textTemplate"] }, { kind: "directive", type: FdpHeaderCellDef, selector: "[fdpHeaderCellDef]" }, { kind: "directive", type: FdpTableHeader, selector: "fdp-table-header" }, { kind: "component", type: MenuButtonComponent, selector: "fdp-menu-button", inputs: ["label", "title", "icon", "type"], outputs: ["buttonClicked"] }, { kind: "directive", type: MenuTriggerDirective, selector: "[fdpMenuTriggerFor]", inputs: ["fdpMenuTriggerFor"] }, { kind: "component", type: PaginationComponent, selector: "fd-pagination", inputs: ["id", "mobile", "totalItems", "currentPage", "itemsPerPage", "itemsPerPageTemplate", "itemsPerPageOptions", "displayTotalItems", "displayTextTemplate"], outputs: ["pageChangeStart", "itemsPerPageChange"] }, { kind: "component", type: MenuComponent, selector: "fdp-menu", inputs: ["id", "openByArrowKeys", "xPosition"], outputs: ["close"] }, { kind: "component", type: MenuItemComponent, selector: "fdp-menu-item", inputs: ["disabled", "cascadeDirection"], outputs: ["itemSelect"] }, { kind: "directive", type: FileUploaderSelectDirective, selector: "[fdFileSelect]", inputs: ["multiple"], outputs: ["fileSelected"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: FdTranslatePipe, name: "fdTranslate" }, { kind: "pipe", type: ConvertBytesPipe, name: "convertBytes" }], encapsulation: i0.ViewEncapsulation.None }); }
837
- }
838
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: UploadCollectionComponent, decorators: [{
839
- type: Component,
840
- args: [{ selector: 'fdp-upload-collection', encapsulation: ViewEncapsulation.None, standalone: true, imports: [
841
- NgIf,
842
- MessageStripComponent,
843
- NgTemplateOutlet,
844
- ToolbarComponent,
845
- BreadcrumbComponent,
846
- BreadcrumbItemComponent,
847
- LinkComponent,
848
- NgFor,
849
- ToolbarSpacerDirective,
850
- InputGroupComponent,
851
- FormsModule,
852
- ButtonComponent,
853
- ToolbarItemDirective,
854
- UploadCollectionDragnDropDirective,
855
- TableDataSourceDirective,
856
- TableHeaderResizerDirective,
857
- TableComponent,
858
- TableInitialStateDirective,
859
- TableColumnComponent,
860
- FdpCellDef,
861
- FdpTableCell,
862
- IconComponent,
863
- FormItemComponent,
864
- FormInputMessageGroupComponent,
865
- FormControlComponent,
866
- FormMessageComponent,
867
- BusyIndicatorComponent,
868
- ObjectStatusComponent,
869
- FdpHeaderCellDef,
870
- FdpTableHeader,
871
- MenuButtonComponent,
872
- MenuTriggerDirective,
873
- PaginationComponent,
874
- MenuComponent,
875
- MenuItemComponent,
876
- FileUploaderSelectDirective,
877
- NgSwitch,
878
- NgSwitchCase,
879
- DatePipe,
880
- FdTranslatePipe,
881
- ConvertBytesPipe
882
- ], template: "<div [id]=\"id\" class=\"fdp-upload-collection\">\n <!-- Message strip -->\n <fd-message-strip *ngIf=\"_message\" [type]=\"_message.messageStripType\" (onDismiss)=\"_messageStripDismiss()\">\n <ng-container\n [ngTemplateOutlet]=\"message\"\n [ngTemplateOutletContext]=\"{\n messageType: _message.messageType,\n payload: _message.payload,\n messageStripType: _message.messageStripType,\n count: _message.count\n }\"\n ></ng-container>\n </fd-message-strip>\n\n <!-- Toolbar -->\n <fd-toolbar class=\"fdp-upload-collection__toolbar\">\n <div [style.flex]=\"'1 auto'\">\n <fd-breadcrumb [id]=\"id + '-breadcrumb'\">\n <fd-breadcrumb-item>\n <ng-template #multipleBreadcrumbs>\n <a href=\"#\" fd-link (click)=\"_breadcrumbGoTo($event)\">\n {{ 'platformUploadCollection.breadcrumbLabelAllFiles' | fdTranslate }}\n </a>\n </ng-template>\n <ng-template #singleBreadcrumb>\n <span>\n {{\n 'platformUploadCollection.breadcrumbLabelAllFilesWithTotal'\n | fdTranslate : { total: _totalItems }\n }}\n </span>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"_breadcrumbList.length > 0 ? multipleBreadcrumbs : singleBreadcrumb\"\n ></ng-container>\n </fd-breadcrumb-item>\n <fd-breadcrumb-item *ngFor=\"let item of _breadcrumbList; let i = index\">\n <ng-template #clickableBreadcrumb>\n <a href=\"#\" fd-link (click)=\"_breadcrumbGoTo($event, i)\">{{ item.folderName }}</a>\n </ng-template>\n <ng-template #textBreadcrumb>\n <span>{{ item.folderName }} ({{ _totalItems }})</span>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"item.clikable ? clickableBreadcrumb : textBreadcrumb\"\n ></ng-container>\n </fd-breadcrumb-item>\n </fd-breadcrumb>\n </div>\n\n <fd-toolbar-spacer [style.max-width.rem]=\"3\"></fd-toolbar-spacer>\n <ng-container *ngIf=\"readonly || selectedItems.length === 0\">\n <fd-input-group\n *ngIf=\"showSearch\"\n [(ngModel)]=\"_searchText\"\n (ngModelChange)=\"_searchInputChanged()\"\n glyph=\"search\"\n [ariaLabelledBy]=\"id + '-breadcrumb'\"\n [placeholder]=\"'platformUploadCollection.searchPlaceholder' | fdTranslate\"\n ></fd-input-group>\n\n <ng-container *ngIf=\"!readonly\">\n <button\n fd-toolbar-item\n fd-button\n (click)=\"_openUploadFiles()\"\n fdType=\"ghost\"\n [disabled]=\"disabled\"\n [label]=\"'platformUploadCollection.addBtnLabel' | fdTranslate\"\n [title]=\"'platformUploadCollection.addBtnLabel' | fdTranslate\"\n ></button>\n\n <button\n fd-toolbar-item\n fd-button\n (click)=\"_openNewFolderDialog()\"\n *ngIf=\"hierarchy\"\n [disabled]=\"disabled\"\n fdType=\"transparent\"\n [label]=\"'platformUploadCollection.newFolderBtnLabel' | fdTranslate\"\n [title]=\"'platformUploadCollection.newFolderBtnLabel' | fdTranslate\"\n ></button>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!readonly && selectedItems.length > 0\">\n <button\n fd-toolbar-item\n fd-button\n (click)=\"_moveToClicked(true)\"\n fdType=\"ghost\"\n [disabled]=\"disabled\"\n [label]=\"'platformUploadCollection.moveToBtnLabel' | fdTranslate\"\n [title]=\"'platformUploadCollection.moveToBtnLabel' | fdTranslate\"\n ></button>\n <button\n fd-toolbar-item\n fd-button\n (click)=\"_downloadClicked(true)\"\n fdType=\"ghost\"\n [disabled]=\"disabled\"\n *ngIf=\"_showIfSelectedOnlyFiles()\"\n [label]=\"'platformUploadCollection.downloadBtnLabel' | fdTranslate\"\n [title]=\"'platformUploadCollection.downloadBtnLabel' | fdTranslate\"\n ></button>\n <button\n fd-toolbar-item\n fd-button\n (click)=\"_remove(true)\"\n fdType=\"ghost\"\n [disabled]=\"disabled\"\n [label]=\"'platformUploadCollection.removeBtnLabel' | fdTranslate\"\n [title]=\"'platformUploadCollection.removeBtnLabel' | fdTranslate\"\n ></button>\n </ng-container>\n </fd-toolbar>\n\n <div class=\"fdp-upload-collection__table--wrapper\">\n <div\n class=\"fdp-upload-collection__table\"\n fdpUploadCollectionDragnDrop\n [fileTypes]=\"fileTypes\"\n [maxFilenameLength]=\"maxFilenameLength\"\n [maxFileSize]=\"maxFileSize\"\n [mimeTypes]=\"mimeTypes\"\n [dragndrop]=\"!readonly\"\n [disabled]=\"disabled\"\n [multiple]=\"multiple\"\n (fileChanged)=\"_handleDrop($event)\"\n (cancel)=\"_dragDropCancel()\"\n (onDropzone)=\"_onDropzone($event)\"\n >\n <!-- Table -->\n <fdp-table\n *ngIf=\"_visibleList$.value.length > 0\"\n [dataSource]=\"_visibleList$\"\n [loading]=\"dataSource.isDataLoading\"\n selectionMode=\"multiple\"\n emptyTableMessage=\"\"\n [noHorizontalBorders]=\"true\"\n [trackBy]=\"_trackByDocumentId\"\n (rowSelectionChange)=\"_onRowSelectionChange($event)\"\n >\n <fdp-column name=\"name\" label=\"Name\" width=\"8rem\">\n <fdp-table-cell *fdpCellDef=\"let item\">\n <div class=\"fdp-upload-collection__vertical-align-center\">\n <fd-icon\n class=\"fdp-upload-collection__fd-icon\"\n *ngIf=\"item.type === 'folder'\"\n glyph=\"folder-blank\"\n [title]=\"'platformUploadCollection.folderIconTitle' | fdTranslate\"\n ></fd-icon>\n <fd-icon\n class=\"fdp-upload-collection__fd-icon\"\n *ngIf=\"item.type === 'file'\"\n [glyph]=\"_getIconByType(item)\"\n [title]=\"'platformUploadCollection.fileIconTitle' | fdTranslate\"\n ></fd-icon>\n\n <ng-container *ngIf=\"disabled || readonly || !_isSelectedItem(item); else editMode\">\n <span\n [class.fdp-upload-collection__cursor]=\"item.type === 'folder'\"\n (click)=\"_openFolder(item)\"\n >{{ item.name }}</span\n >\n </ng-container>\n </div>\n\n <ng-template #editMode>\n <div fd-form-item>\n <fd-form-input-message-group [triggers]=\"[]\" [isOpen]=\"!!item.sameFilenameState\">\n <div class=\"fdp-upload-collection__vertical-align-center\">\n <input\n fd-form-control\n [value]=\"_getItemName(item)\"\n (blur)=\"_fileNameChange($event, item)\"\n (input)=\"_checkName($event, item)\"\n type=\"text\"\n [placeholder]=\"\n 'platformUploadCollection.editFileNameInputPlaceholder' | fdTranslate\n \"\n [state]=\"item.sameFilenameState\"\n />\n <span class=\"fdp-upload-collection__item_extension\">{{\n _getItemExtension(item)\n }}</span>\n </div>\n\n <fd-form-message [type]=\"item.sameFilenameState\">\n {{\n (item.type === 'file'\n ? 'platformUploadCollection.editFileNameFileAlreadyExistsError'\n : 'platformUploadCollection.editFileNameFolderAlreadyExistsError'\n ) | fdTranslate\n }}\n </fd-form-message>\n </fd-form-input-message-group>\n </div>\n </ng-template>\n </fdp-table-cell>\n </fdp-column>\n\n <fdp-column name=\"uploadedBy\" label=\"Uploaded by\" width=\"5rem\">\n <fdp-table-cell *fdpCellDef=\"let item\">{{ item.uploadedBy.name }}</fdp-table-cell>\n </fdp-column>\n\n <fdp-column name=\"uploadedOn\" label=\"Uploaded on\" width=\"5rem\">\n <fdp-table-cell *fdpCellDef=\"let item\">{{ item.uploadedOn | date : 'shortDate' }}</fdp-table-cell>\n </fdp-column>\n\n <fdp-column name=\"size\" label=\"File size\" width=\"5rem\">\n <fdp-table-cell *fdpCellDef=\"let item\">{{ item.fileSize | convertBytes }}</fdp-table-cell>\n </fdp-column>\n\n <fdp-column name=\"version\" label=\"Version\" width=\"5rem\">\n <fdp-table-cell *fdpCellDef=\"let item\">{{ item.version || '' }}</fdp-table-cell>\n </fdp-column>\n\n <fdp-column name=\"status\" label=\"Status\" width=\"5rem\">\n <fdp-table-cell *fdpCellDef=\"let item\">\n <fd-busy-indicator\n *ngIf=\"item.status === _uploadCollectionItemStatus.LOADING\"\n [loading]=\"true\"\n ariaLabel=\"Status: Loading\"\n ariaLive=\"polite\"\n size=\"s\"\n ></fd-busy-indicator>\n <span\n *ngIf=\"item.status === _uploadCollectionItemStatus.SUCCESSFUL\"\n fd-object-status\n status=\"positive\"\n >\n {{ 'platformUploadCollection.itemStatusSuccessful' | fdTranslate }}\n </span>\n <span\n *ngIf=\"item.status === _uploadCollectionItemStatus.UNSUCCESSFUL\"\n fd-object-status\n status=\"negative\"\n >\n {{ 'platformUploadCollection.itemStatusUnsuccessful' | fdTranslate }}\n </span>\n </fdp-table-cell>\n </fdp-column>\n\n <fdp-column name=\"action\" *ngIf=\"!readonly\" width=\"5rem\" align=\"end\">\n <fdp-table-header *fdpHeaderCellDef>Action</fdp-table-header>\n <fdp-table-cell *fdpCellDef=\"let item\">\n <div class=\"fdp-upload-collection__actions\">\n <div class=\"fdp-upload-collection__actions--status\">\n <button\n fd-button\n [label]=\"'platformUploadCollection.uploadNewFileAfterFailAction' | fdTranslate\"\n [title]=\"'platformUploadCollection.uploadNewFileAfterFailAction' | fdTranslate\"\n (click)=\"_runUploadNewFileAfterFail(item)\"\n fdType=\"ghost\"\n [disabled]=\"disabled\"\n *ngIf=\"item.status === _uploadCollectionItemStatus.UNSUCCESSFUL\"\n ></button>\n\n <button\n fd-button\n [label]=\"'platformUploadCollection.cancelUploadNewFileAction' | fdTranslate\"\n [title]=\"'platformUploadCollection.cancelUploadNewFileAction' | fdTranslate\"\n fdType=\"ghost\"\n [disabled]=\"disabled\"\n (click)=\"_cancelUploadNewFile(item)\"\n *ngIf=\"terminationEnabled && item.status === _uploadCollectionItemStatus.LOADING\"\n ></button>\n </div>\n\n <fdp-menu-button\n icon=\"overflow\"\n [disabled]=\"disabled\"\n type=\"transparent\"\n [title]=\"'platformUploadCollection.itemMenuBtnTitle' | fdTranslate\"\n [fdpMenuTriggerFor]=\"menuActions\"\n (buttonClicked)=\"_actionButton(item)\"\n >\n </fdp-menu-button>\n </div>\n </fdp-table-cell>\n </fdp-column>\n </fdp-table>\n\n <!-- Dragdrop area -->\n <div\n class=\"fdp-upload-collection__dragdrop-area\"\n *ngIf=\"_showDragDropArea\"\n [class.active]=\"_onDragDropArea\"\n >\n <fd-icon class=\"fdp-upload-collection__dragdrop-area--icon\" glyph=\"upload-to-cloud\"></fd-icon>\n <p class=\"fdp-upload-collection__dragdrop-area--text\">\n {{ 'platformUploadCollection.dragDropAreaText' | fdTranslate }}\n </p>\n </div>\n\n <!-- No data -->\n <div\n class=\"fdp-upload-collection__no-data\"\n *ngIf=\"_visibleList$.value.length === 0\"\n [class.invisible]=\"_showDragDropArea\"\n >\n <fd-icon glyph=\"document\"></fd-icon>\n <h3>{{ 'platformUploadCollection.noDataText' | fdTranslate }}</h3>\n <p>{{ 'platformUploadCollection.noDataDescription' | fdTranslate }}</p>\n </div>\n </div>\n\n <!-- Table footer -->\n <div class=\"fdp-upload-collection__table-footer\" *ngIf=\"enablePagination && _totalItems\">\n <!-- Pagination -->\n <div class=\"fdp-upload-collection__pagination\">\n <span [id]=\"id + '-pagination'\" class=\"fdp-upload-collection__pagination--total\">\n {{\n 'platformUploadCollection.paginationTotal'\n | fdTranslate : { from: _countShowedItems, to: _countNotShowedItems, total: _totalItems }\n }}\n </span>\n <fd-pagination\n [totalItems]=\"_totalItems\"\n [displayTotalItems]=\"false\"\n (pageChangeStart)=\"_pageChanged($event)\"\n [itemsPerPage]=\"_itemsPerPage\"\n [currentPage]=\"_currentPage\"\n [attr.aria-labelledby]=\"id + '-pagination'\"\n ></fd-pagination>\n </div>\n\n <!-- Results per page -->\n <div class=\"fdp-upload-collection__results\">\n <span class=\"fdp-upload-collection__results--title\">\n <span [id]=\"id + '-results'\">\n {{ 'platformUploadCollection.resultsPerPage' | fdTranslate }}\n </span>\n <span *ngIf=\"_itemsPerPageOptions.length === 0\">{{ _itemsPerPage }}</span>\n </span>\n <fdp-menu-button\n *ngIf=\"_itemsPerPageOptions.length > 0\"\n type=\"ghost\"\n [ariaLabelledBy]=\"id + '-results'\"\n [fdpMenuTriggerFor]=\"itemsPerPageMenu\"\n [label]=\"_itemsPerPage + ''\"\n >\n </fdp-menu-button>\n </div>\n </div>\n </div>\n</div>\n\n<fdp-menu #itemsPerPageMenu xPosition=\"before\">\n <fdp-menu-item\n *ngFor=\"let value of _itemsPerPageOptions\"\n (itemSelect)=\"_itemsPerPageChange(value.label)\"\n [attr.title]=\"'Results per page: ' + value.label\"\n >\n <span>{{ value.label }}</span>\n </fdp-menu-item>\n</fdp-menu>\n\n<fdp-menu #menuActions xPosition=\"before\">\n <fdp-menu-item (itemSelect)=\"_moveToClicked()\">\n <fd-icon\n class=\"fdp-upload-collection__fd-icon\"\n glyph=\"folder-blank\"\n [title]=\"'platformUploadCollection.moveToBtnLabel' | fdTranslate\"\n ></fd-icon>\n <span>\n {{ 'platformUploadCollection.moveToBtnLabel' | fdTranslate }}\n </span>\n </fdp-menu-item>\n <ng-container *ngIf=\"_activeItem?.type === 'file'\">\n <fdp-menu-item (itemSelect)=\"_downloadClicked()\">\n <fd-icon\n class=\"fdp-upload-collection__fd-icon\"\n glyph=\"download\"\n [title]=\"'platformUploadCollection.downloadBtnLabel' | fdTranslate\"\n ></fd-icon>\n <span>\n {{ 'platformUploadCollection.downloadBtnLabel' | fdTranslate }}\n </span>\n </fdp-menu-item>\n <fdp-menu-item (itemSelect)=\"_openUpdateFileVersion()\">\n <fd-icon\n class=\"fdp-upload-collection__fd-icon\"\n glyph=\"drill-up\"\n [title]=\"'platformUploadCollection.updateVersionBtnLabel' | fdTranslate\"\n ></fd-icon>\n <span>\n {{ 'platformUploadCollection.updateVersionBtnLabel' | fdTranslate }}\n </span>\n </fdp-menu-item>\n </ng-container>\n <fdp-menu-item (itemSelect)=\"_remove()\">\n <fd-icon\n class=\"fdp-upload-collection__fd-icon\"\n glyph=\"delete\"\n [title]=\"'platformUploadCollection.removeBtnLabel' | fdTranslate\"\n ></fd-icon>\n <span>\n {{ 'platformUploadCollection.removeBtnLabel' | fdTranslate }}\n </span>\n </fdp-menu-item>\n</fdp-menu>\n\n<input\n #fileInput\n class=\"fdp-upload-collection__hidden\"\n type=\"file\"\n (fileSelected)=\"_selectHandler($event)\"\n [multiple]=\"multiple\"\n [disabled]=\"disabled\"\n fdFileSelect\n/>\n\n<input\n #updateVersionInput\n class=\"fdp-upload-collection__hidden\"\n type=\"file\"\n (fileSelected)=\"_selectHandler($event)\"\n [disabled]=\"disabled\"\n [multiple]=\"false\"\n fdFileSelect\n/>\n\n<ng-template\n let-messageType=\"messageType\"\n let-payload=\"payload\"\n let-messageStripType=\"messageStripType\"\n let-count=\"count\"\n #message\n>\n <ng-container *ngIf=\"_message\" [ngSwitch]=\"messageType\">\n <ng-container\n *ngSwitchCase=\"_messageType.CREATE\"\n [ngTemplateOutlet]=\"messageNewFolder\"\n [ngTemplateOutletContext]=\"{\n messageStripType: _message.messageStripType,\n payload: _message.payload\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.UPDATE_VERSION\"\n [ngTemplateOutlet]=\"messageUpdateVersion\"\n [ngTemplateOutletContext]=\"{\n messageStripType: _message.messageStripType,\n payload: _message.payload\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.FILE_RENAME\"\n [ngTemplateOutlet]=\"messageFileRename\"\n [ngTemplateOutletContext]=\"{\n messageStripType: _message.messageStripType,\n payload: _message.payload\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.REMOVE\"\n [ngTemplateOutlet]=\"messageRemove\"\n [ngTemplateOutletContext]=\"{\n payload: _message.payload,\n messageStripType: _message.messageStripType,\n count: _message.count\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.MOVE\"\n [ngTemplateOutlet]=\"messageMove\"\n [ngTemplateOutletContext]=\"{\n payload: _message.payload,\n messageStripType: _message.messageStripType,\n count: _message.count\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.TYPE_MISMATCH\"\n [ngTemplateOutlet]=\"messageTypeMismatch\"\n [ngTemplateOutletContext]=\"{\n payload: _message.payload,\n messageStripType: _message.messageStripType,\n count: _message.count\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.FILE_SIZE\"\n [ngTemplateOutlet]=\"messageFileSize\"\n [ngTemplateOutletContext]=\"{\n payload: _message.payload,\n messageStripType: _message.messageStripType,\n count: _message.count\n }\"\n ></ng-container>\n\n <ng-container\n *ngSwitchCase=\"_messageType.FILE_NAME_LENGTH\"\n [ngTemplateOutlet]=\"messageFilenameLength\"\n [ngTemplateOutletContext]=\"{\n payload: _message.payload,\n messageStripType: _message.messageStripType,\n count: _message.count\n }\"\n ></ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #messageNewFolder let-payload=\"payload\" let-messageStripType=\"messageStripType\">\n <ng-container *ngIf=\"messageStripType === 'error'; else foldersCreated\">\n {{ 'platformUploadCollection.messageCreateFailed' | fdTranslate : { folderName: payload.folder.name } }}\n </ng-container>\n <ng-template #foldersCreated>\n {{ 'platformUploadCollection.messageCreateSuccess' | fdTranslate : { folderName: payload.folder.name } }}\n </ng-template>\n</ng-template>\n\n<ng-template #messageUpdateVersion let-payload=\"payload\" let-messageStripType=\"messageStripType\">\n <ng-container *ngIf=\"messageStripType === 'error'; else versionUpdated\">\n {{ 'platformUploadCollection.messageUpdateVersionFailed' | fdTranslate : { folderName: payload.item.name } }}\n </ng-container>\n <ng-template #versionUpdated>\n {{ 'platformUploadCollection.messageUpdateVersionSuccess' | fdTranslate : { folderName: payload.item.name } }}\n </ng-template>\n</ng-template>\n\n<ng-template #messageFileRename let-payload=\"payload\" let-messageStripType=\"messageStripType\">\n <ng-container *ngIf=\"messageStripType === 'error'; else fileRenamed\">\n {{\n 'platformUploadCollection.messageFileRenameFailed'\n | fdTranslate : { from: payload.item.name, to: payload.fileName }\n }}\n </ng-container>\n <ng-template #fileRenamed>\n {{\n 'platformUploadCollection.messageFileRenameSuccess'\n | fdTranslate : { from: payload.item.name, to: payload.fileName }\n }}\n </ng-template>\n</ng-template>\n\n<ng-template #messageRemove let-payload=\"payload\" let-messageStripType=\"messageStripType\" let-count=\"count\">\n <ng-container *ngIf=\"payload.items.length > 1 && count.folder && count.file\">\n <ng-container *ngIf=\"messageStripType === 'error'; else foldersAndFilesRemoved\">\n {{\n 'platformUploadCollection.messageRemoveFoldersAndFilesFailed'\n | fdTranslate : { foldersCount: count.folder, filesCount: count.file }\n }}\n </ng-container>\n <ng-template #foldersAndFilesRemoved>\n {{\n 'platformUploadCollection.messageRemoveFoldersAndFilesSuccess'\n | fdTranslate : { foldersCount: count.folder, filesCount: count.file }\n }}\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length > 1 && count.folder && !count.file\">\n <ng-container *ngIf=\"messageStripType === 'error'; else foldersRemoved\">\n {{ 'platformUploadCollection.messageRemoveFoldersFailed' | fdTranslate : { foldersCount: count.folder } }}\n </ng-container>\n <ng-template #foldersRemoved>\n {{ 'platformUploadCollection.messageRemoveFoldersSuccess' | fdTranslate : { foldersCount: count.folder } }}\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length > 1 && count.file && !count.folder\">\n <ng-container *ngIf=\"messageStripType === 'error'; else filesRemoved\">\n {{ 'platformUploadCollection.messageRemoveFilesFailed' | fdTranslate : { filesCount: count.file } }}\n </ng-container>\n <ng-template #filesRemoved>\n {{ 'platformUploadCollection.messageRemoveFilesSuccess' | fdTranslate : { filesCount: count.file } }}\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length === 1\">\n <ng-container *ngIf=\"messageStripType === 'error'; else oneItemRemoved\">\n {{\n 'platformUploadCollection.messageRemoveFileOrFolderFailed'\n | fdTranslate : { name: payload.items[0].name }\n }}\n </ng-container>\n <ng-template #oneItemRemoved>\n {{\n 'platformUploadCollection.messageRemoveFileOrFolderSuccess'\n | fdTranslate : { name: payload.items[0].name }\n }}\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #messageMove let-payload=\"payload\" let-messageStripType=\"messageStripType\" let-count=\"count\">\n <ng-container *ngIf=\"payload.items.length > 1 && count.folder && count.file\">\n <ng-container *ngIf=\"messageStripType === 'error'; else filesAndFoldersMovedTo\">\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFoldersAndFilesFailed'\n : 'platformUploadCollection.messageMoveRootFoldersAndFilesFailed'\n ) | fdTranslate : { foldersCount: count.folder, filesCount: count.file, to: payload.to?.name }\n }}\n </ng-container>\n <ng-template #filesAndFoldersMovedTo>\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFoldersAndFilesSuccess'\n : 'platformUploadCollection.messageMoveRootFoldersAndFilesSuccess'\n ) | fdTranslate : { foldersCount: count.folder, filesCount: count.file, to: payload.to?.name }\n }}\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length > 1 && count.folder && !count.file\">\n <ng-container *ngIf=\"messageStripType === 'error'; else foldersMovedTo\">\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFoldersFailed'\n : 'platformUploadCollection.messageMoveRootFoldersFailed'\n ) | fdTranslate : { foldersCount: count.folder, to: payload.to?.name }\n }}\n </ng-container>\n <ng-template #foldersMovedTo>\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFoldersSuccess'\n : 'platformUploadCollection.messageMoveRootFoldersSuccess'\n ) | fdTranslate : { foldersCount: count.folder, to: payload.to?.name }\n }}\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length > 1 && count.file && !count.folder\">\n <ng-container *ngIf=\"messageStripType === 'error'; else filesMovedTo\">\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFilesFailed'\n : 'platformUploadCollection.messageMoveRootFilesFailed'\n ) | fdTranslate : { filesCount: count.file, to: payload.to?.name }\n }}\n </ng-container>\n <ng-template #filesMovedTo>\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFilesSuccess'\n : 'platformUploadCollection.messageMoveRootFilesSuccess'\n ) | fdTranslate : { filesCount: count.file, to: payload.to?.name }\n }}\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length === 1\">\n <ng-container *ngIf=\"messageStripType === 'error'; else oneItemMovedTo\">\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFileOrFolderFailed'\n : 'platformUploadCollection.messageMoveRootFileOrFolderFailed'\n ) | fdTranslate : { name: payload.items[0].name, to: payload.to?.name }\n }}\n </ng-container>\n <ng-template #oneItemMovedTo>\n {{\n (payload.to\n ? 'platformUploadCollection.messageMoveFileOrFolderSuccess'\n : 'platformUploadCollection.messageMoveRootFileOrFolderSuccess'\n ) | fdTranslate : { name: payload.items[0].name, to: payload.to?.name }\n }}\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #messageTypeMismatch let-payload=\"payload\" let-messageStripType=\"messageStripType\" let-count=\"count\">\n <ng-container *ngIf=\"payload.items.length > 1\">\n {{\n 'platformUploadCollection.messageFileTypeMismatchPlural'\n | fdTranslate : { filesCount: payload.items.length, allowedTypes: _getAllowedTypes() }\n }}\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length === 1\">\n {{\n 'platformUploadCollection.messageFileTypeMismatchSingular'\n | fdTranslate : { fileName: payload.items[0].name, allowedTypes: _getAllowedTypes() }\n }}\n </ng-container>\n</ng-template>\n\n<ng-template #messageFileSize let-payload=\"payload\" let-messageStripType=\"messageStripType\" let-count=\"count\">\n <ng-container *ngIf=\"payload.items.length > 1\">\n {{\n 'platformUploadCollection.messageFileSizeExceededPlural'\n | fdTranslate : { filesCount: payload.items.length, maxFileSize: maxFileSize || 0 }\n }}\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length === 1\">\n {{\n 'platformUploadCollection.messageFileSizeExceededSingular'\n | fdTranslate : { fileName: payload.items[0].name, maxFileSize: maxFileSize || 0 }\n }}\n </ng-container>\n</ng-template>\n\n<ng-template #messageFilenameLength let-payload=\"payload\" let-messageStripType=\"messageStripType\" let-count=\"count\">\n <ng-container *ngIf=\"payload.items.length > 1\">\n {{\n 'platformUploadCollection.messageFileNameLengthExceededPlural'\n | fdTranslate : { filesCount: payload.items.length, maxFilenameLength: maxFilenameLength || 0 }\n }}\n </ng-container>\n\n <ng-container *ngIf=\"payload.items.length === 1\">\n {{\n 'platformUploadCollection.messageFileNameLengthExceededSingular'\n | fdTranslate : { fileName: payload.items[0].name, maxFilenameLength: maxFilenameLength || 0 }\n }}\n </ng-container>\n</ng-template>\n", styles: [".fdp-upload-collection__fd-icon{color:#0854a0!important;color:var(--sapHighlightColor)!important;margin-right:.625rem!important;font-size:1rem!important}.fdp-upload-collection fd-message-strip{margin-bottom:.625rem}.fdp-upload-collection__toolbar .fd-toolbar{margin-bottom:.625rem;border:0}.fdp-upload-collection__toolbar .fd-toolbar fd-input-group .sap-icon--search{color:#0854a0;color:var(--sapHighlightColor)}.fdp-upload-collection__no-data{text-align:center;min-height:230px;display:flex;align-items:center;flex-direction:column;justify-content:center}.fdp-upload-collection__no-data fd-icon{font-size:3rem;line-height:3rem;margin:0;color:#6a6d70;color:var(--sapContent_LabelColor)}.fdp-upload-collection__no-data h3{font-size:1.125rem;font-size:var(--sapFontHeader4Size);line-height:1rem;margin:8px 0}.fdp-upload-collection__no-data p{font-size:.875rem;font-size:var(--sapFontSize);line-height:1rem;color:#6a6d70;color:var(--sapContent_LabelColor);margin:0}.fdp-upload-collection__no-data.invisible{opacity:0}.fdp-upload-collection__table{position:relative}.fdp-upload-collection__table-footer{display:flex;justify-content:space-between;align-items:center;margin-top:.625rem}.fdp-upload-collection__table-footer .fdp-upload-collection__results--title,.fdp-upload-collection__table-footer .fdp-upload-collection__pagination--total{line-height:1.4;line-height:var(--sapContent_LineHeight);color:#32363a;color:var(--sapTextColor);font-family:\"72\",\"72full\",Arial,Helvetica,sans-serif;font-family:var(--sapFontFamily);font-weight:400;-webkit-font-smoothing:antialiased;box-sizing:border-box;padding:0;margin:0;border:0;font-size:.875rem;font-size:var(--sapFontSize);color:#6a6d70;color:var(--sapContent_LabelColor);margin-right:.5rem}.fdp-upload-collection__table-footer .fdp-upload-collection__results--title:before,.fdp-upload-collection__table-footer .fdp-upload-collection__results--title:after,.fdp-upload-collection__table-footer .fdp-upload-collection__pagination--total:before,.fdp-upload-collection__table-footer .fdp-upload-collection__pagination--total:after{box-sizing:inherit;font-size:inherit}[dir=rtl] .fdp-upload-collection__table-footer .fdp-upload-collection__results--title,.fdp-upload-collection__table-footer .fdp-upload-collection__results--title[dir=rtl],[dir=rtl] .fdp-upload-collection__table-footer .fdp-upload-collection__pagination--total,.fdp-upload-collection__table-footer .fdp-upload-collection__pagination--total[dir=rtl]{margin-right:0;margin-left:.5rem}.fdp-upload-collection__table-footer .fdp-upload-collection__pagination--total{width:100%;align-self:center}.fdp-upload-collection__table-footer .fdp-upload-collection__pagination{font-size:.875rem;font-size:var(--sapFontSize);line-height:1.4;line-height:var(--sapContent_LineHeight);color:#32363a;color:var(--sapTextColor);font-family:\"72\",\"72full\",Arial,Helvetica,sans-serif;font-family:var(--sapFontFamily);font-weight:400;-webkit-font-smoothing:antialiased;box-sizing:border-box;padding:0;margin:0;border:0;display:flex}.fdp-upload-collection__table-footer .fdp-upload-collection__pagination:before,.fdp-upload-collection__table-footer .fdp-upload-collection__pagination:after{box-sizing:inherit;font-size:inherit}.fdp-upload-collection__hidden{display:none}.fdp-upload-collection__vertical-align-center{display:flex;align-items:center}.fdp-upload-collection__cursor{cursor:pointer}.fdp-upload-collection__item_extension{white-space:nowrap}.fdp-upload-collection__actions{display:flex;justify-content:space-between;align-items:center}.fdp-upload-collection__actions .sap-icon--slim-arrow-down{display:none}.fdp-upload-collection__dragdrop-area{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center;flex-direction:column;background:rgba(255,255,255,.5);outline:2px dashed transparent;outline-color:#89919a;outline-color:var(--sapField_BorderColor);outline-offset:-4px;box-sizing:border-box}.fdp-upload-collection__dragdrop-area fd-icon{font-size:3rem;line-height:3rem;margin-bottom:1rem;color:#6a6d70;color:var(--sapContent_LabelColor)}.fdp-upload-collection__dragdrop-area p{font-size:1rem;line-height:1.125rem;color:#6a6d70;color:var(--sapContent_LabelColor)}.fdp-upload-collection__dragdrop-area.active{outline-color:#0854a0;outline-color:var(--sapContent_DragAndDropActiveColor);background:rgba(8,84,160,.08)}.fdp-upload-collection__dragdrop-area.active fd-icon,.fdp-upload-collection__dragdrop-area.active p{color:#0854a0;color:var(--sapContent_DragAndDropActiveColor)}.fdp-upload-collection .fd-form-item{align-items:center;flex-direction:row}.fdp-upload-collection-dialig-no-bg{background-color:transparent!important}[dir=rtl] .fdp-upload-collection fd-icon{margin-right:0;margin-left:.625rem}.fd-menu__list .disabled{background-color:#fff!important;background-color:var(--sapList_Background)!important;cursor:not-allowed}.fd-menu__list .disabled .fd-menu__title{color:#32363a!important;color:var(--sapList_TextColor)!important}\n"] }]
883
- }], ctorParameters: function () { return [{ type: i1.DialogService }, { type: i2.FilesValidatorService }, { type: i0.ChangeDetectorRef }, { type: i0.Injector }]; }, propDecorators: { id: [{
884
- type: Input
885
- }], itemsPerPage: [{
886
- type: Input
887
- }], dataSource: [{
888
- type: Input
889
- }], fileTypes: [{
890
- type: Input
891
- }], maxFileSize: [{
892
- type: Input
893
- }], maxFilenameLength: [{
894
- type: Input
895
- }], mimeTypes: [{
896
- type: Input
897
- }], disabled: [{
898
- type: Input
899
- }], readonly: [{
900
- type: Input
901
- }], hierarchy: [{
902
- type: Input
903
- }], enablePagination: [{
904
- type: Input
905
- }], terminationEnabled: [{
906
- type: Input
907
- }], multiple: [{
908
- type: Input
909
- }], showSearch: [{
910
- type: Input
911
- }], sameFileNameAllowed: [{
912
- type: Input
913
- }], typeMismatch: [{
914
- type: Output
915
- }], filenameLengthExceed: [{
916
- type: Output
917
- }], fileSizeExceed: [{
918
- type: Output
919
- }], _uploadFilesRef: [{
920
- type: ViewChild,
921
- args: ['fileInput']
922
- }], _updateVersionRef: [{
923
- type: ViewChild,
924
- args: ['updateVersionInput']
925
- }] } });
926
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWNvbGxlY3Rpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9zcmMvbGliL3VwbG9hZC1jb2xsZWN0aW9uL3VwbG9hZC1jb2xsZWN0aW9uL3VwbG9hZC1jb2xsZWN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vc3JjL2xpYi91cGxvYWQtY29sbGVjdGlvbi91cGxvYWQtY29sbGVjdGlvbi91cGxvYWQtY29sbGVjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxpQkFBaUIsRUFDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzlELE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDaEcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBZ0IsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0UsT0FBTyxFQUFFLDJC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LGFBQWE7d0JBQ2IsaUJBQWlCO3dCQUNqQiw4QkFBOEI7d0JBQzlCLG9CQUFvQjt3QkFDcEIsb0JBQW9CO3dCQUNwQixzQkFBc0I7d0JBQ3RCLHFCQUFxQjt3QkFDckIsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsb0JBQW9CO3dCQUNwQixtQkFBbUI7d0JBQ25CLGFBQWE7d0JBQ2IsaUJBQWlCO3dCQUNqQiwyQkFBMkI7d0JBQzNCLFFBQVE7d0JBQ1IsWUFBWTt3QkFDWixRQUFRO3dCQUNSLGVBQWU7d0JBQ2YsZ0JBQWdCO3FCQUNuQjsrTEFPRCxFQUFFO3NCQURELEtBQUs7Z0JBS0YsWUFBWTtzQkFEZixLQUFLO2dCQTZCRixVQUFVO3NCQURiLEtBQUs7Z0JBaUJOLFNBQVM7c0JBRFIsS0FBSztnQkFRTixXQUFXO3NCQURWLEtBQUs7Z0JBU04saUJBQWlCO3NCQURoQixLQUFLO2dCQVVOLFNBQVM7c0JBRFIsS0FBSztnQkFLTixRQUFRO3NCQURQLEtBQUs7Z0JBS04sUUFBUTtzQkFEUCxLQUFLO2dCQUtOLFNBQVM7c0JBRFIsS0FBSztnQkFLTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFRTixrQkFBa0I7c0JBRGpCLEtBQUs7Z0JBS04sUUFBUTtzQkFEUCxLQUFLO2dCQUtOLFVBQVU7c0JBRFQsS0FBSztnQkFRTixtQkFBbUI7c0JBRGxCLEtBQUs7Z0JBUU4sWUFBWTtzQkFEWCxNQUFNO2dCQVFQLG9CQUFvQjtzQkFEbkIsTUFBTTtnQkFRUCxjQUFjO3NCQURiLE1BQU07Z0JBbUVVLGVBQWU7c0JBRC9CLFNBQVM7dUJBQUMsV0FBVztnQkFLTCxpQkFBaUI7c0JBRGpDLFNBQVM7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBEYXRlUGlwZSwgTmdGb3IsIE5nSWYsIE5nU3dpdGNoLCBOZ1N3aXRjaENhc2UsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCcmVhZGNydW1iQ29tcG9uZW50LCBCcmVhZGNydW1iSXRlbUNvbXBvbmVudCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9icmVhZGNydW1iJztcbmltcG9ydCB7IEJ1c3lJbmRpY2F0b3JDb21wb25lbnQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvYnVzeS1pbmRpY2F0b3InO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2J1dHRvbic7XG5pbXBvcnQgeyBEaWFsb2dDb25maWcsIERpYWxvZ1NlcnZpY2UgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvZGlhbG9nJztcbmltcG9ydCB7IEZpbGVVcGxvYWRlclNlbGVjdERpcmVjdGl2ZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9maWxlLXVwbG9hZGVyJztcbmltcG9ydCB7XG4gICAgRm9ybUNvbnRyb2xDb21wb25lbnQsXG4gICAgRm9ybUlucHV0TWVzc2FnZUdyb3VwQ29tcG9uZW50LFxuICAgIEZvcm1JdGVtQ29tcG9uZW50LFxuICAgIEZvcm1NZXNzYWdlQ29tcG9uZW50XG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9mb3JtJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvaWNvbic7XG5pbXBvcnQgeyBJbnB1dEdyb3VwQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2lucHV0LWdyb3VwJztcbmltcG9ydCB7IExpbmtDb21wb25lbnQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvbGluayc7XG5pbXBvcnQgeyBNZXNzYWdlU3RyaXBDb21wb25lbnQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvbWVzc2FnZS1zdHJpcCc7XG5pbXBvcnQgeyBPYmplY3RTdGF0dXNDb21wb25lbnQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvb2JqZWN0LXN0YXR1cyc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3BhZ2luYXRpb24nO1xuaW1wb3J0IHsgVG9vbGJhckNvbXBvbmVudCwgVG9vbGJhckl0ZW1EaXJlY3RpdmUsIFRvb2xiYXJTcGFjZXJEaXJlY3RpdmUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvdG9vbGJhcic7XG5pbXBvcnQgeyB1dWlkdjQsIHdhcm5PbmNlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3V0aWxzJztcbmltcG9ydCB7IEZkVHJhbnNsYXRlUGlwZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvaTE4bic7XG5pbXBvcnQgeyBNZW51Q29tcG9uZW50LCBNZW51SXRlbUNvbXBvbmVudCwgTWVudVRyaWdnZXJEaXJlY3RpdmUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L3BsYXRmb3JtL21lbnUnO1xuaW1wb3J0IHsgTWVudUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvcGxhdGZvcm0vbWVudS1idXR0b24nO1xuaW1wb3J0IHsgQ29udmVydEJ5dGVzUGlwZSwgaXNEYXRhU291cmNlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9wbGF0Zm9ybS9zaGFyZWQnO1xuaW1wb3J0IHtcbiAgICBDb2x1bW5BbGlnbixcbiAgICBTZWxlY3Rpb25Nb2RlLFxuICAgIFRhYmxlQ29sdW1uQ29tcG9uZW50LFxuICAgIFRhYmxlQ29tcG9uZW50LFxuICAgIFRhYmxlUm93U2VsZWN0aW9uQ2hhbmdlRXZlbnRcbn0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9wbGF0Zm9ybS90YWJsZSc7XG5pbXBvcnQge1xuICAgIEZkcENlbGxEZWYsXG4gICAgRmRwSGVhZGVyQ2VsbERlZixcbiAgICBGZHBUYWJsZUNlbGwsXG4gICAgRmRwVGFibGVIZWFkZXIsXG4gICAgVGFibGVEYXRhU291cmNlRGlyZWN0aXZlLFxuICAgIFRhYmxlSGVhZGVyUmVzaXplckRpcmVjdGl2ZSxcbiAgICBUYWJsZUluaXRpYWxTdGF0ZURpcmVjdGl2ZVxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L3BsYXRmb3JtL3RhYmxlLWhlbHBlcnMnO1xuaW1wb3J0IHsgTW92ZVRvQ29tcG9uZW50LCBNb3ZlVG9Db21wb25lbnREaWFsb2dEYXRhIH0gZnJvbSAnLi4vZGlhbG9ncy9tb3ZlLXRvL21vdmUtdG8uY29tcG9uZW50JztcbmltcG9ydCB7IE5ld0ZvbGRlckNvbXBvbmVudCB9IGZyb20gJy4uL2RpYWxvZ3MvbmV3LWZvbGRlci9uZXctZm9sZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBVcGxvYWRDb2xsZWN0aW9uRHJhZ25Ecm9wRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy91cGxvYWQtY29sbGVjdGlvbi1kcmFnbmRyb3AuZGlyZWN0aXZlJztcbmltcG9ydCB7IFVwbG9hZENvbGxlY3Rpb25EYXRhU291cmNlIH0gZnJvbSAnLi4vZG9tYWluL3VwbG9hZC1jb2xsZWN0aW9uLWRhdGEtc291cmNlJztcbmltcG9ydCB7IGdlbmVyYXRlTWVzc2FnZVN0cmlwZURhdGEgfSBmcm9tICcuLi9oZWxwZXJzL2dlbmVyYXRlLW1lc3NhZ2Utc3RyaXBlLWRhdGEnO1xuaW1wb3J0IHtcbiAgICBCcmVhZGNydW1iTGlzdCxcbiAgICBGaWxlU2l6ZUV4Y2VlZEV2ZW50LFxuICAgIEZpbGVuYW1lTGVuZ3RoRXhjZWVkRXZlbnQsXG4gICAgRmlsZXNWYWxpZGF0b3JPdXRwdXQsXG4gICAgSXRlbVBlclBhZ2UsXG4gICAgTWVzc2FnZSxcbiAgICBNZXNzYWdlT3B0aW9ucyxcbiAgICBNZXNzYWdlU3RyaXBUeXBlLFxuICAgIE1lc3NhZ2VUeXBlLFxuICAgIE1vdmVUb0V2ZW50LFxuICAgIFR5cGVNaXNtYXRjaEV2ZW50LFxuICAgIFVwZGF0ZVZlcnNpb25FdmVudCxcbiAgICBVcGxvYWRDb2xsZWN0aW9uQ21wLFxuICAgIFVwbG9hZENvbGxlY3Rpb25GaWxlLFxuICAgIFVwbG9hZENvbGxlY3Rpb25Gb2xkZXIsXG4gICAgVXBsb2FkQ29sbGVjdGlvbkl0ZW0sXG4gICAgVXBsb2FkQ29sbGVjdGlvbkl0ZW1TdGF0dXNcbn0gZnJvbSAnLi4vbW9kZWxzL3VwbG9hZC1jb2xsZWN0aW9uLm1vZGVscyc7XG5pbXBvcnQgeyBGaWxlc1ZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9maWxlcy12YWxpZGF0b3Iuc2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIEZkcFVwbG9hZENvbGxlY3Rpb25EYXRhU291cmNlID0gVXBsb2FkQ29sbGVjdGlvbkRhdGFTb3VyY2U7XG5cbmxldCByYW5kb21JZCA9IDA7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFVwbG9hZENvbGxlY3Rpb24gY29tcG9uZW50IGlzIGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAwLjQwLjBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZHAtdXBsb2FkLWNvbGxlY3Rpb24nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQtY29sbGVjdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdXBsb2FkLWNvbGxlY3Rpb24uY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBNZXNzYWdlU3RyaXBDb21wb25lbnQsXG4gICAgICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgICAgIFRvb2xiYXJDb21wb25lbnQsXG4gICAgICAgIEJyZWFkY3J1bWJDb21wb25lbnQsXG4gICAgICAgIEJyZWFkY3J1bWJJdGVtQ29tcG9uZW50LFxuICAgICAgICBMaW5rQ29tcG9uZW50LFxuICAgICAgICBOZ0ZvcixcbiAgICAgICAgVG9vbGJhclNwYWNlckRpcmVjdGl2ZSxcbiAgICAgICAgSW5wdXRHcm91cENvbXBvbmVudCxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIEJ1dHRvbkNvbXBvbmVudCxcbiAgICAgICAgVG9vbGJhckl0ZW1EaXJlY3RpdmUsXG4gICAgICAgIFVwbG9hZENvbGxlY3Rpb25EcmFnbkRyb3BEaXJlY3RpdmUsXG4gICAgICAgIFRhYmxlRGF0YVNvdXJjZURpcmVjdGl2ZSxcbiAgICAgICAgVGFibGVIZWFkZXJSZXNpemVyRGlyZWN0aXZlLFxuICAgICAgICBUYWJsZUNvbXBvbmVudCxcbiAgICAgICAgVGFibGVJbml0aWFsU3RhdGVEaXJlY3RpdmUsXG4gICAgICAgIFRhYmxlQ29sdW1uQ29tcG9uZW50LFxuICAgICAgICBGZHBDZWxsRGVmLFxuICAgICAgICBGZHBUYWJsZUNlbGwsXG4gICAgICAgIEljb25Db21wb25lbnQsXG4gICAgICAgIEZvcm1JdGVtQ29tcG9uZW50LFxuICAgICAgICBGb3JtSW5wdXRNZXNzYWdlR3JvdXBDb21wb25lbnQsXG4gICAgICAgIEZvcm1Db250cm9sQ29tcG9uZW50LFxuICAgICAgICBGb3JtTWVzc2FnZUNvbXBvbmVudCxcbiAgICAgICAgQnVzeUluZGljYXRvckNvbXBvbmVudCxcbiAgICAgICAgT2JqZWN0U3RhdHVzQ29tcG9uZW50LFxuICAgICAgICBGZHBIZWFkZXJDZWxsRGVmLFxuICAgICAgICBGZHBUYWJsZUhlYWRlcixcbiAgICAgICAgTWVudUJ1dHRvbkNvbXBvbmVudCxcbiAgICAgICAgTWVudVRyaWdnZXJEaXJlY3RpdmUsXG4gICAgICAgIFBhZ2luYXRpb25Db21wb25lbnQsXG4gICAgICAgIE1lbnVDb21wb25lbnQsXG4gICAgICAgIE1lbnVJdGVtQ29tcG9uZW50LFxuICAgICAgICBGaWxlVXBsb2FkZXJTZWxlY3REaXJlY3RpdmUsXG4gICAgICAgIE5nU3dpdGNoLFxuICAgICAgICBOZ1N3aXRjaENhc2UsXG4gICAgICAgIERhdGVQaXBlLFxuICAgICAgICBGZFRyYW5zbGF0ZVBpcGUsXG4gICAgICAgIENvbnZlcnRCeXRlc1BpcGVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZENvbGxlY3Rpb25Db21wb25lbnRcbiAgICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBVcGxvYWRDb2xsZWN0aW9uQ21wPEZkcFVwbG9hZENvbGxlY3Rpb25EYXRhU291cmNlPlxue1xuICAgIC8qKiBJRCBvZiB0aGUgdXBsb2FkIGNvbGxlY3Rpb24gZWxlbWVudC4gSWYgbm9uZSBpcyBwcm92aWRlZCwgb25lIHdpbGwgYmUgZ2VuZXJhdGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaWQgPSBgZmRwLXVwbG9hZC1jb2xsZWN0aW9uLWlkLSR7cmFuZG9tSWQrK31gO1xuXG4gICAgLyoqIERlZmluZXMgdGhlIG51bWJlciBvZiBpdGVtcyBvbiB0aGUgcGFnZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGl0ZW1zUGVyUGFnZSh2YWx1ZTogbnVtYmVyIHwgSXRlbVBlclBhZ2VbXSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5faXRlbXNQZXJQYWdlID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9tYXRjaCgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB2YWx1ZS5maW5kKChpdGVtKSA9PiBpdGVtLmRlZmF1bHQpO1xuICAgICAgICB0aGlzLl9pdGVtc1BlclBhZ2VPcHRpb25zID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5faXRlbXNQZXJQYWdlID0gZGVmYXVsdFZhbHVlLmxhYmVsO1xuICAgICAgICAgICAgdGhpcy5fbWF0Y2goKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faXRlbXNQZXJQYWdlID0gdmFsdWVbTWF0aC5yb3VuZCh2YWx1ZS5sZW5ndGggLyAyKV0ubGFiZWw7XG5cbiAgICAgICAgdGhpcy5fbWF0Y2goKTtcbiAgICB9XG4gICAgZ2V0IGl0ZW1zUGVyUGFnZSgpOiBudW1iZXIgfCBJdGVtUGVyUGFnZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zUGVyUGFnZTtcbiAgICB9XG5cbiAgICAvKiogTGlzdCBvZiBpdGVtcyAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGRhdGFTb3VyY2UodmFsdWU6IEZkcFVwbG9hZENvbGxlY3Rpb25EYXRhU291cmNlKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZURTKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZGF0YVNvdXJjZSgpOiBGZHBVcGxvYWRDb2xsZWN0aW9uRGF0YVNvdXJjZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIGFsbG93ZWQgZmlsZSB0eXBlcyBmb3IgdGhlIHVwbG9hZC5cbiAgICAgKiBUaGUgY2hvc2VuIGZpbGVzIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFuIGFycmF5IG9mIGZpbGUgdHlwZXMuXG4gICAgICogSWYgYXQgbGVhc3Qgb25lIGZpbGUgZG9lcyBub3QgZml0IHRoZSBmaWxlIHR5cGUgcmVxdWlyZW1lbnRzLFxuICAgICAqIHRoZSB1cGxvYWQgaXMgcHJldmVudGVkLiBFeGFtcGxlOiBbXCJqcGdcIiwgXCJwbmdcIiwgXCJibXBcIl0uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBmaWxlVHlwZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgYSBmaWxlIHNpemUgbGltaXQgaW4gbWVnYWJ5dGVzIHRoYXQgcHJldmVudHMgdGhlIHVwbG9hZFxuICAgICAqIGlmIGF0IGxlYXN0IG9uZSBmaWxlIGV4Y2VlZHMgdGhlIGxpbWl0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWF4RmlsZVNpemU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgZmlsZSBuYW1lLlxuICAgICAqIElmIHRoZSBtYXhpbXVtIGZpbGUgbmFtZSBsZW5ndGggaXMgZXhjZWVkZWQsXG4gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQgJ2ZpbGVuYW1lTGVuZ3RoRXhjZWVkJyBpcyB0cmlnZ2VyZWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBtYXhGaWxlbmFtZUxlbmd0aD86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIGFsbG93ZWQgTUlNRSB0eXBlcyBvZiBmaWxlcyB0byBiZSB1cGxvYWRlZC5cbiAgICAgKiBUaGUgY2hvc2VuIGZpbGVzIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IGFuIGFycmF5IG9mIE1JTUUgdHlwZXMuXG4gICAgICogSWYgYXQgbGVhc3Qgb25lIGZpbGUgZG9lcyBub3QgZml0IHRoZSBNSU1FIHR5cGUgcmVxdWlyZW1lbnRzLCB0aGUgdXBsb2FkIGlzIHByZXZlbnRlZC5cbiAgICAgKiBFeGFtcGxlOiBtaW1lVHlwZXMgW1wiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvanBlZ1wiXS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIG1pbWVUeXBlczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8qKiBBbGwgYWN0aW9uIGJ1dHRvbnMgd2lsbCBiZSBkaXNhYmxlZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKiBBbGwgYWN0aW9uIGJ1dHRvbnMgd2lsbCBiZSBpbnZpc2libGUgKi9cbiAgICBASW5wdXQoKVxuICAgIHJlYWRvbmx5ID0gZmFsc2U7XG5cbiAgICAvKiogQWxsb3dzIHRvIHN1cHBvcnQgaGllcmFyY2h5ICovXG4gICAgQElucHV0KClcbiAgICBoaWVyYXJjaHkgPSB0cnVlO1xuXG4gICAgLyoqIEFsbG93cyB0byBzaG93L2hpZGUgcGFnaW5hdGlvbiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZW5hYmxlUGFnaW5hdGlvbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBJZiB0cnVlLCB0aGUgYnV0dG9uIHRoYXQgaXMgdXNlZCB0byB0ZXJtaW5hdGUgdGhlIGluc3RhbnQgZmlsZSB1cGxvYWQgZ2V0cyB2aXNpYmxlLlxuICAgICAqIFRoZSBidXR0b24gbm9ybWFsbHkgYXBwZWFycyB3aGVuIGEgZmlsZSBpcyBiZWluZyB1cGxvYWRlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHRlcm1pbmF0aW9uRW5hYmxlZCA9IHRydWU7XG5cbiAgICAvKiogR2l2ZXMgdG8gc2VsZWN0IG11bHRpcGxlIGZpbGVzIGZyb20gdGhlIHNhbWUgZm9sZGVyIGFuZCB0aGVuIHVwbG9hZCB0aGVtLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbXVsdGlwbGUgPSB0cnVlO1xuXG4gICAgLyoqIEFsbG93cyB0byBzaG93L2hpZGUgc2VhcmNoICovXG4gICAgQElucHV0KClcbiAgICBzaG93U2VhcmNoID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEFsbG93cyB0byB1c2UgdGhlIHNhbWUgbmFtZSBmb3IgYSBmaWxlIHdoZW4gZWRpdGluZyB0aGUgZmlsZSBuYW1lLlxuICAgICAqICdTYW1lIG5hbWUnIHJlZmVycyB0byBhbiBhbHJlYWR5IGV4aXN0aW5nIGZpbGUgbmFtZSBpbiB0aGUgbGlzdC5cbiAgICAgKiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2FtZUZpbGVOYW1lQWxsb3dlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBmaWxlIHR5cGUgb3IgdGhlIE1JTUUgdHlwZSBkb24ndCBtYXRjaCB0aGUgcGVybWl0dGVkIHR5cGVzXG4gICAgICogKG9ubHkgaWYgdGhlIGZpbGVUeXBlcyBwcm9wZXJ0eSBvciB0aGUgbWltZVR5cGVzIHByb3BlcnR5IGFyZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24pLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHR5cGVNaXNtYXRjaCA9IG5ldyBFdmVudEVtaXR0ZXI8VHlwZU1pc21hdGNoRXZlbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIG5hbWUgb2YgYSBjaG9zZW4gZmlsZSBpcyBsb25nZXIgdGhhbiB0aGUgdmFsdWUgc3BlY2lmaWVkXG4gICAgICogd2l0aCB0aGUgbWF4RmlsZW5hbWVMZW5ndGggcHJvcGVydHkgKG9ubHkgaWYgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uKS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBmaWxlbmFtZUxlbmd0aEV4Y2VlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZW5hbWVMZW5ndGhFeGNlZWRFdmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgZmlsZSBzaXplIG9mIGFuIHVwbG9hZGVkIGZpbGUgaXMgZXhjZWVkZWRcbiAgICAgKiAob25seSBpZiB0aGUgbWF4RmlsZVNpemUgcHJvcGVydHkgd2FzIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbikuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgZmlsZVNpemVFeGNlZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVTaXplRXhjZWVkRXZlbnQ+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF91cGxvYWRDb2xsZWN0aW9uSXRlbVN0YXR1cyA9IFVwbG9hZENvbGxlY3Rpb25JdGVtU3RhdHVzO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfYnJlYWRjcnVtYkxpc3Q6IEJyZWFkY3J1bWJMaXN0W10gPSBbXTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2N1cnJlbnRQYWdlID0gMTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2l0ZW1zUGVyUGFnZSA9IDEwO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfaXRlbXNQZXJQYWdlT3B0aW9uczogSXRlbVBlclBhZ2VbXSA9IFtdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfdG90YWxJdGVtcyA9IDA7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9jb3VudFNob3dlZEl0ZW1zID0gMDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2NvdW50Tm90U2hvd2VkSXRlbXMgPSAwO1xuXG4gICAgLyoqIEBoaWRkZW5cbiAgICAgKiBMaXN0IG9mIGN1cnJlbnRseSBkaXNwbGF5ZWQgaXRlbXNcbiAgICAgKi9cbiAgICBfdmlzaWJsZUxpc3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVcGxvYWRDb2xsZWN0aW9uSXRlbVtdPihbXSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHNlbGVjdGVkSXRlbXM6IFVwbG9hZENvbGxlY3Rpb25JdGVtW10gPSBbXTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3NlYXJjaFRleHQgPSAnJztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3Nob3dEcmFnRHJvcEFyZWEgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX29uRHJhZ0Ryb3BBcmVhID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9hY3RpdmVJdGVtPzogVXBsb2FkQ29sbGVjdGlvbkl0ZW07XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9jdXJyZW50VXBkYXRlRmlsZVZlcnNpb24/OiBVcGxvYWRDb2xsZWN0aW9uRmlsZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX21lc3NhZ2U/OiBNZXNzYWdlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfbWVzc2FnZVR5cGUgPSBNZXNzYWdlVHlwZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX21lc3NhZ2VTdHJpcFR5cGUgPSBNZXNzYWdlU3RyaXBUeXBlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfY29sdW1uQWxpZ24gPSBDb2x1bW5BbGlnbjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3NlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2RlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3VwbG9hZEZpbGVzUmVmOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCd1cGRhdGVWZXJzaW9uSW5wdXQnKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3VwZGF0ZVZlcnNpb25SZWY6IEVsZW1lbnRSZWY7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2RhdGFTb3VyY2U6IFVwbG9hZENvbGxlY3Rpb25EYXRhU291cmNlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2NvbnRlbnREZW5zaXR5TWFudWFsbHlTZXQgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW1hZ2VFeHRlbnNpb25zOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJy5hcG5nJyxcbiAgICAgICAgJy5ibXAnLFxuICAgICAgICAnLmdpZicsXG4gICAgICAgICcuaWNvJyxcbiAgICAgICAgJy5jdXInLFxuICAgICAgICAnLmpwZycsXG4gICAgICAgICcuanBlZycsXG4gICAgICAgICcuamZpZicsXG4gICAgICAgICcucGpwZWcnLFxuICAgICAgICAnLnBqcCcsXG4gICAgICAgICcucG5nJyxcbiAgICAgICAgJy5zdmcnLFxuICAgICAgICAnLnRpZicsXG4gICAgICAgICcudGlmZicsXG4gICAgICAgICcud2VicCcsXG4gICAgICAgICcuZmxpZicsXG4gICAgICAgICcuY3IyJyxcbiAgICAgICAgJy5qeHInLFxuICAgICAgICAnLnBzZCcsXG4gICAgICAgICcuYnBnJyxcbiAgICAgICAgJy5qcDInLFxuICAgICAgICAnLmpwbScsXG4gICAgICAgICcuanB4JyxcbiAgICAgICAgJy5oZWljJyxcbiAgICAgICAgJy5kY20nXG4gICAgXTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGVkRmlsZXM6IEZpbGVzVmFsaWRhdG9yT3V0cHV0O1xuXG4gICAgLyoqIEBoaWRkZW4gZm9yIGRhdGEgc291cmNlIGhhbmRsaW5nICovXG4gICAgcHJpdmF0ZSBfZHNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uRGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZmlsZXNWYWxpZGF0b3JTZXJ2aWNlOiBGaWxlc1ZhbGlkYXRvclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvclxuICAgICkge1xuICAgICAgICB3YXJuT25jZSgnVGhlIFVwbG9hZCBDb2xsZWN0aW9uIGNvbXBvbmVudCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gbmV4dCByZWxlYXNlLicpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlcy5jb250ZW50RGVuc2l0eSkge1xuICAgICAgICAgICAgdGhpcy5fY29udGVudERlbnNpdHlNYW51YWxseVNldCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fb25EZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9kc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgLyoqIFNob3cgbWVlc3NhZ2UgZm9yIHR5cGVzIE5FVyBGT0xERVIgQ1JFQVRFLCBSRU1PVkUsIE1PVkUgVE8sIFVQREFURV9WRVJTSU9OLCBGSUxFX1JFTkFNRUQgKi9cbiAgICBzaG93TWVzc2FnZSh0eXBlOiBNZXNzYWdlVHlwZSwgb3B0aW9uczogTWVzc2FnZU9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZSA9IGdlbmVyYXRlTWVzc2FnZVN0cmlwZURhdGEodHlwZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE9wZW5zIHRoZSBmaWxlIHNlbGVjdG9yLlxuICAgICAqL1xuICAgIF9maWxlTmFtZUNoYW5nZShlOiBGb2N1c0V2ZW50LCBjdXJyZW50SXRlbTogVXBsb2FkQ29sbGVjdGlvbkl0ZW0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCBpdGVtTmFtZSA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICAgICAgY29uc3QgbmV3TmFtZSA9IGN1cnJlbnRJdGVtLnR5cGUgPT09ICdmaWxlJyA/IGAke2l0ZW1OYW1lfS4ke2N1cnJlbnRJdGVtLm5hbWUuc3BsaXQoJy4nKS5wb3AoKX1gIDogaXRlbU5hbWU7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRJdGVtLm5hbWUgPT09IG5ld05hbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1heEZpbGVuYW1lTGVuZ3RoICYmIGl0ZW1OYW1lLmxlbmd0aCA+IHRoaXMubWF4RmlsZW5hbWVMZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbmFtZWRJdGVtID0ge1xuICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRJdGVtLFxuICAgICAgICAgICAgICAgIG5hbWU6IG5ld05hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgIGl0ZW1zOiBbcmVuYW1lZEl0ZW1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWVMZW5ndGhFdmVudCA9IG5ldyBGaWxlbmFtZUxlbmd0aEV4Y2VlZEV2ZW50KHRoaXMsIHBheWxvYWQpO1xuXG4gICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKE1lc3NhZ2VUeXBlLkZJTEVfTkFNRV9MRU5HVEgsIHsgcGF5bG9hZCwgdHlwZTogTWVzc2FnZVN0cmlwVHlwZS5FUlJPUiB9KTtcblxuICAgICAgICAgICAgdGhpcy5maWxlbmFtZUxlbmd0aEV4Y2VlZC5lbWl0KGZpbGVuYW1lTGVuZ3RoRXZlbnQpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudEl0ZW0uc2FtZUZpbGVuYW1lU3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICBwYXJlbnRGb2xkZXJJZDogdGhpcy5fZ2V0Q3VycmVudEZvbGRlcklkKCksXG4gICAgICAgICAgICBmaWxlTmFtZTogbmV3TmFtZSxcbiAgICAgICAgICAgIGl0ZW06IHsgLi4uY3VycmVudEl0ZW0gfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZVxuICAgICAgICAgICAgLmZpbGVSZW5hbWVkKGRhdGEpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXRjaCgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoTWVzc2FnZVR5cGUuRklMRV9SRU5BTUUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXNzYWdlU3RyaXBUeXBlLlNVQ0NFU1NcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKE1lc3NhZ2VUeXBlLkZJTEVfUkVOQU1FLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTWVzc2FnZVN0cmlwVHlwZS5FUlJPUlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9jaGVja05hbWUoZTogRXZlbnQsIGN1cnJlbnRJdGVtOiBVcGxvYWRDb2xsZWN0aW9uSXRlbSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGl0ZW1OYW1lID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICAgICAgICBjb25zdCBuZXdOYW1lID0gY3VycmVudEl0ZW0udHlwZSA9PT0gJ2ZpbGUnID8gYCR7aXRlbU5hbWV9LiR7Y3VycmVudEl0ZW0ubmFtZS5zcGxpdCgnLicpLnBvcCgpfWAgOiBpdGVtTmFtZTtcbiAgICAgICAgY29uc3QgbmFtZUFscmVhZHlFeGlzdHMgPSB0aGlzLl9nZXRMaXN0KCkuc29tZShcbiAgICAgICAgICAgIChpdGVtKSA9PiBjdXJyZW50SXRlbS5kb2N1bWVudElkICE9PSBpdGVtLmRvY3VtZW50SWQgJiYgaXRlbS5uYW1lID09PSBuZXdOYW1lXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNhbWVGaWxlTmFtZUFsbG93ZWQgJiYgbmFtZUFscmVhZHlFeGlzdHMpIHtcbiAgICAgICAgICAgIGN1cnJlbnRJdGVtLnNhbWVGaWxlbmFtZVN0YXRlID0gJ2Vycm9yJztcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIGN1cnJlbnRJdGVtLnNhbWVGaWxlbmFtZVN0YXRlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuXG4gICAgICogT3BlbnMgdGhlIGZpbGUgc2VsZWN0b3IuXG4gICAgICovXG4gICAgX29wZW5VcGxvYWRGaWxlcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLl91cGxvYWRGaWxlc1JlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgIGlucHV0LmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlblxuICAgICAqIE9wZW5zIHRoZSB1cGRhdGUgZmlsZSB2ZXJzaW9uIHNlbGVjdG9yLlxuICAgICAqL1xuICAgIF9vcGVuVXBkYXRlRmlsZVZlcnNpb24oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuX3VwZGF0ZVZlcnNpb25SZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VXBkYXRlRmlsZVZlcnNpb24gPSB0aGlzLl9hY3RpdmVJdGVtIGFzIFVwbG9hZENvbGxlY3Rpb25GaWxlO1xuICAgICAgICAgICAgaW5wdXQuY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3NlbGVjdEhhbmRsZXIoZmlsZXM6IEZpbGVbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLl92YWxpZGF0ZUZpbGVzKGZpbGVzKTtcbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlRmlsZXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9oYW5kbGVEcm9wKG91dHB1dDogRmlsZXNWYWxpZGF0b3JPdXRwdXQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVkRmlsZXMgPSBvdXRwdXQ7XG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUZpbGVzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb3Blbk5ld0ZvbGRlckRpYWxvZygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nU2VydmljZS5vcGVuKE5ld0ZvbGRlckNvbXBvbmVudCwge1xuICAgICAgICAgICAgcmVzcG9uc2l2ZVBhZGRpbmc6IHRydWUsXG4gICAgICAgICAgICBiYWNrZHJvcENsaWNrQ2xvc2VhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGhlaWdodDogJzMyMHB4JyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Rm9sZGVyOiB0aGlzLl9nZXRDdXJyZW50Rm9sZGVyKCksXG4gICAgICAgICAgICAgICAgbWF4RmlsZW5hbWVMZW5ndGg6IHRoaXMubWF4RmlsZW5hbWVMZW5ndGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBEaWFsb2dDb25maWcpO1xuXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoZm9sZGVyTmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9sZGVyID0gdGhpcy5fZ2VuZXJhdGVUZW1wb3JhcnlOZXdGb2xkZXIoZm9sZGVyTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRGb2xkZXJJZCA9IHRoaXMuX2dldEN1cnJlbnRGb2xkZXJJZCgpO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICBwYXJlbnRGb2xkZXJJZCxcbiAgICAgICAgICAgICAgICBmb2xkZXI6IHsgLi4uZm9sZGVyIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpbmRQYXJlbnRGb2xkZXJBbmRBZGRUZW1wb3JhcnlGaWxlcyhwYXJlbnRGb2xkZXJJZCwgW2ZvbGRlcl0pO1xuXG4gICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2VcbiAgICAgICAgICAgICAgICAubmV3Rm9sZGVyKGRhdGEpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFwKCgpID0+IHRoaXMuX21hdGNoKCkpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKE1lc3NhZ2VUeXBlLkNSRUFURSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTWVzc2FnZVN0cmlwVHlwZS5TVUNDRVNTXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoTWVzc2FnZVR5cGUuQ1JFQVRFLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXNzYWdlU3RyaXBUeXBlLkVSUk9SXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9tb3ZlVG9DbGlja2VkKG11bHRpcGxlPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgX2FjdGl2ZUl0ZW0gPSB0aGlzLl9hY3RpdmVJdGVtO1xuICAgICAgICBjb25zdCBjdXJyZW50Rm9sZGVyID0gdGhpcy5fZ2V0Q3VycmVudEZvbGRlcigpO1xuICAgICAgICBjb25zdCBtb3ZhYmxlSXRlbXMgPSBtdWx0aXBsZSA/IHRoaXMuc2VsZWN0ZWRJdGVtcyA6IF9hY3RpdmVJdGVtID8gW19hY3RpdmVJdGVtXSA6IFtdO1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLl9kaWFsb2dTZXJ2aWNlLm9wZW4oXG4gICAgICAgICAgICBNb3ZlVG9Db21wb25lbnQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2l2ZVBhZGRpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgdmVydGljYWxQYWRkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBiYWNrZHJvcENsaWNrQ2xvc2VhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICczNTBweCcsXG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBpdGVtczogdGhpcy5kYXRhU291cmNlLmRhdGFQcm92aWRlci5pdGVtcyxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEZvbGRlcixcbiAgICAgICAgICAgICAgICAgICAgbW92YWJsZUZvbGRlcnM6IG1vdmFibGVJdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0/LnR5cGUgPT09ICdmb2xkZXInKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4RmlsZW5hbWVMZW5ndGg6IHRoaXMubWF4RmlsZW5hbWVMZW5ndGhcbiAgICAgICAgICAgICAgICB9IGFzIE1vdmVUb0NvbXBvbmVudERpYWxvZ0RhdGFcbiAgICAgICAgICAgIH0gYXMgRGlhbG9nQ29uZmlnLFxuICAgICAgICAgICAgdGhpcy5faW5qZWN0b3JcbiAgICAgICAgKTtcblxuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoeyBzZWxlY3RlZEZvbGRlciwgcGFyZW50Rm9sZGVySWQsIGZvbGRlck5hbWUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQ6IE1vdmVUb0V2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBmcm9tOiBjdXJyZW50Rm9sZGVyLFxuICAgICAgICAgICAgICAgICAgICB0bzogc2VsZWN0ZWRGb2xkZXIsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBtb3ZhYmxlSXRlbXNcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGZvbGRlck5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5uZXdGb2xkZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRGb2xkZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlck5hbWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgLm1vdmVUbyhwYXlsb2FkKVxuICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXRjaCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKE1lc3NhZ2VUeXBlLk1PVkUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTWVzc2FnZVN0cmlwVHlwZS5TVUNDRVNTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKE1lc3NhZ2VUeXBlLk1PVkUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTWVzc2FnZVN0cmlwVHlwZS5FUlJPUlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9kb3dubG9hZENsaWNrZWQobXVsdGlwbGU/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBfYWN0aXZlSXRlbSA9IHsgLi4udGhpcy5fYWN0aXZlSXRlbSB9O1xuICAgICAgICBjb25zdCBpdGVtcyA9IChtdWx0aXBsZSA/IHRoaXMuc2VsZWN0ZWRJdGVtcyA6IFtfYWN0aXZlSXRlbV0pIGFzIFVwbG9hZENvbGxlY3Rpb25GaWxlW107XG5cbiAgICAgICAgdGhpcy5kYXRhU291cmNlLmRvd25sb2FkKHsgaXRlbXMgfSkuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfcmVtb3ZlKG11bHRpcGxlPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgX2FjdGl2ZUl0ZW0gPSB7IC4uLnRoaXMuX2FjdGl2ZUl0ZW0gfSBhcyBVcGxvYWRDb2xsZWN0aW9uSXRlbTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBtdWx0aXBsZSA/IHRoaXMuc2VsZWN0ZWRJdGVtcyA6IFtfYWN0aXZlSXRlbV07XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IHBhcmVudEZvbGRlcklkOiB0aGlzLl9nZXRDdXJyZW50Rm9sZGVySWQoKSwgaXRlbXMgfTtcblxuICAgICAgICB0aGlzLmRhdGFTb3VyY2VcbiAgICAgICAgICAgIC5kZWxldGUoZGF0YSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hdGNoKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShNZXNzYWdlVHlwZS5SRU1PVkUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXNzYWdlU3RyaXBUeXBlLlNVQ0NFU1NcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKE1lc3NhZ2VUeXBlLlJFTU9WRSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE1lc3NhZ2VTdHJpcFR5cGUuRVJST1JcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfcnVuVXBsb2FkTmV3RmlsZUFmdGVyRmFpbChpdGVtOiBVcGxvYWRDb2xsZWN0aW9uRmlsZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2VcbiAgICAgICAgICAgIC5ydW5BZnRlckZhaWwoeyBwYXJlbnRGb2xkZXJJZDogdGhpcy5fZ2V0Q3VycmVudEZvbGRlcklkKCksIGl0ZW1zOiBbaXRlbV0gfSlcbiAgICAgICAgICAgIC5waXBlKHRhcCgoKSA9PiB0aGlzLl9tYXRjaCgpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9jYW5jZWxVcGxvYWROZXdGaWxlKGZpbGU6IFVwbG9hZENvbGxlY3Rpb25GaWxlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZVxuICAgICAgICAgICAgLmNhbmNlbFVwbG9hZE5ld0ZpbGUoeyBwYXJlbnRGb2xkZXJJZDogdGhpcy5fZ2V0Q3VycmVudEZvbGRlcklkKCksIGl0ZW06IGZpbGUgfSlcbiAgICAgICAgICAgIC5waXBlKHRhcCgoKSA9PiB0aGlzLl9tYXRjaCgpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9tZXNzYWdlU3RyaXBEaXNtaXNzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9tZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX29wZW5Gb2xkZXIoaXRlbTogVXBsb2FkQ29sbGVjdGlvbkl0ZW0pOiB2b2lkIHtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2ZpbGUnIHx8ICFpdGVtLmRvY3VtZW50SWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9icmVhZGNydW1iTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9icmVhZGNydW1iTGlzdFt0aGlzLl9icmVhZGNydW1iTGlzdC5sZW5ndGggLSAxXS5jbGlrYWJsZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9icmVhZGNydW1iTGlzdC5wdXNoKHtcbiAgICAgICAgICAgIGNsaWthYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGZvbGRlcklkOiBpdGVtLmRvY3VtZW50SWQsXG4gICAgICAgICAgICBmb2xkZXJOYW1lOiBpdGVtLm5hbWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fbWF0Y2goKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9hY3Rpb25CdXR0b24oaXRlbTogVXBsb2FkQ29sbGVjdGlvbkl0ZW0pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlSXRlbSA9IGl0ZW07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25Ecm9wem9uZShldmVudDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9zaG93RHJhZ0Ryb3BBcmVhID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fb25EcmFnRHJvcEFyZWEgPSBldmVudDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9kcmFnRHJvcENhbmNlbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2hvd0RyYWdEcm9wQXJlYSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2JyZWFkY3J1bWJHb1RvKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoaW5kZXgpKSB7XG4gICAgICAgICAgICB0aGlzLl9icmVhZGNydW1iTGlzdCA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWF0Y2goKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYnJlYWRjcnVtYkxpc3QgPSB0aGlzLl9icmVhZGNydW1iTGlzdC5zbGljZSgwLCBpbmRleCEgKyAxKTtcbiAgICAgICAgdGhpcy5fYnJlYWRjcnVtYkxpc3RbdGhpcy5fYnJlYWRjcnVtYkxpc3QubGVuZ3RoIC0gMV0uY2xpa2FibGUgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9tYXRjaCgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3BhZ2VDaGFuZ2VkKHBhZ2VOdW1iZXI6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlUGFnaW5hdGlvbiB8fCB0aGlzLl9jdXJyZW50UGFnZSA9PT0gcGFnZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgICAgIHRoaXMuX2N1cnJlbnRQYWdlID0gcGFnZU51bWJlcjtcblxuICAgICAgICB0aGlzLl9tYXRjaCgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2l0ZW1zUGVyUGFnZUNoYW5nZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5faXRlbXNQZXJQYWdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pdGVtc1BlclBhZ2UgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRQYWdlICogdGhpcy5faXRlbXNQZXJQYWdlID4gdGhpcy5fdG90YWxJdGVtcykge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFBhZ2UgPSBNYXRoLmNlaWwodGhpcy5fdG90YWxJdGVtcyAvIHRoaXMuX2l0ZW1zUGVyUGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tYXRjaCgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3NlYXJjaElucHV0Q2hhbmdlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbWF0Y2goKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9vblJvd1NlbGVjdGlvbkNoYW5nZShkYXRhOiBUYWJsZVJvd1NlbGVjdGlvbkNoYW5nZUV2ZW50PFVwbG9hZENvbGxlY3Rpb25JdGVtPik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc2FtZUZpbGVOYW1lQWxsb3dlZCkge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZEl0ZW0gPSBkYXRhLnJlbW92ZWRbMF07XG4gICAgICAgICAgICB0aGlzLl9jbGVhckl0ZW1TYW1lRmlsZW5hbWVTdGF0ZShyZW1vdmVkSXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBkYXRhLnNlbGVjdGlvbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9nZXRJdGVtTmFtZShpdGVtOiBVcGxvYWRDb2xsZWN0aW9uSXRlbSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdmb2xkZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbS5uYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZS5zcGxpdCgnLicpLnNsaWNlKDAsIC0xKS5qb2luKCcuJyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfZ2V0SXRlbUV4dGVuc2lvbihpdGVtOiBVcGxvYWRDb2xsZWN0aW9uSXRlbSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT09ICdmb2xkZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYC4ke2l0ZW0ubmFtZS5zcGxpdCgnLicpLnBvcCgpfWA7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfZ2V0SWNvbkJ5VHlwZShmaWxlOiBVcGxvYWRDb2xsZWN0aW9uRmlsZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBgLiR7ZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCl9YDtcblxuICAgICAgICByZXR1cm4gdGhpcy5faW1hZ2VFeHRlbnNpb25zLmluY2x1ZGVzKHR5cGUpID8gJ2JhY2tncm91bmQnIDogJ2RvY3VtZW50JztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9zaG93SWZTZWxlY3RlZE9ubHlGaWxlcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnNlbGVjdGVkSXRlbXMuc29tZSgoaXRlbSkgPT4gaXRlbS50eXBlID09PSAnZm9sZGVyJyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfaXNTZWxlY3RlZEl0ZW0oaXRlbTogVXBsb2FkQ29sbGVjdGlvbkl0ZW0pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcy5zb21lKChzZWxlY3RlZEl0ZW0pID0+IHNlbGVjdGVkSXRlbS5kb2N1bWVudElkID09PSBpdGVtLmRvY3VtZW50SWQpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2dldExpc3QoKTogVXBsb2FkQ29sbGVjdGlvbkl0ZW1bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZGF0YVByb3ZpZGVyLmxpc3Q7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfdHJhY2tCeURvY3VtZW50SWQoaW5kZXg6IG51bWJlciwgaXRlbTogVXBsb2FkQ29sbGVjdGlvbkl0ZW0pOiBVcGxvYWRDb2xsZWN0aW9uSXRlbVsnZG9jdW1lbnRJZCddIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uZG9jdW1lbnRJZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9nZXRBbGxvd2VkVHlwZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZmlsZVR5cGVzPy5qb2luKCcsICcpfSR7XG4gICAgICAgICAgICB0aGlzLmZpbGVUeXBlcz8ubGVuZ3RoICYmIHRoaXMubWltZVR5cGVzPy5sZW5ndGggPyAnLCAnIDogJydcbiAgICAgICAgfSR7dGhpcy5taW1lVHlwZXM/LmpvaW4oJywgJyl9YDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3ZhbGlkYXRlRmlsZXMoZmlsZXM6IEZpbGVbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLl92YWxpZGF0ZWRGaWxlcyA9IHRoaXMuX2ZpbGVzVmFsaWRhdG9yU2VydmljZS52YWxpZGF0aW9uKGZpbGVzLCB7XG4gICAgICAgICAgICBtYXhGaWxlU2l6ZTogdGhpcy5tYXhGaWxlU2l6ZSxcbiAgICAgICAgICAgIG1heEZpbGVOYW1lTGVuZ3RoOiB0aGlzLm1heEZpbGVuYW1lTGVuZ3RoLFxuICAgICAgICAgICAgZmlsZVR5cGVzOiB0aGlzLmZpbGVUeXBlcyxcbiAgICAgICAgICAgIG1pbWVUeXBlczogdGhpcy5taW1lVHlwZXNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9wcm9wYWdhdGVGaWxlcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyB2YWxpZEZpbGVzLCB0eXBlTWlzbWF0Y2gsIGZpbGVuYW1lTGVuZ3RoRXhjZWVkLCBmaWxlU2l6ZUV4Y2VlZCB9ID0gdGhpcy5fdmFsaWRhdGVkRmlsZXM7XG5cbiAgICAgICAgaWYgKHZhbGlkRmlsZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VXBkYXRlRmlsZVZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVGaWxlVmVyc2lvbih2YWxpZEZpbGVzWzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBsb2FkTmV3RmlsZXModmFsaWRGaWxlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZU1pc21hdGNoKSB7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0geyBpdGVtczogdHlwZU1pc21hdGNoIH07XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBUeXBlTWlzbWF0Y2hFdmVudCh0aGlzLCBwYXlsb2FkKTtcblxuICAgICAgICAgICAgdGhpcy5zaG93TWVzc2FnZShNZXNzYWdlVHlwZS5UWVBFX01JU01BVENILCB7IHBheWxvYWQsIHR5cGU6IE1lc3NhZ2VTdHJpcFR5cGUuRVJST1IgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudHlwZU1pc21hdGNoLmVtaXQoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGVuYW1lTGVuZ3RoRXhjZWVkKSB7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0geyBpdGVtczogZmlsZW5hbWVMZW5ndGhFeGNlZWQgfTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEZpbGVuYW1lTGVuZ3RoRXhjZWVkRXZlbnQodGhpcywgcGF5bG9hZCk7XG5cbiAgICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoTWVzc2FnZVR5cGUuRklMRV9OQU1FX0xFTkdUSCwgeyBwYXlsb2FkLCB0eXBlOiBNZXNzYWdlU3RyaXBUeXBlLkVSUk9SIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmZpbGVuYW1lTGVuZ3RoRXhjZWVkLmVtaXQoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGVTaXplRXhjZWVkKSB7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0geyBpdGVtczogZmlsZVNpemVFeGNlZWQgfTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEZpbGVTaXplRXhjZWVkRXZlbnQodGhpcywgcGF5bG9hZCk7XG5cbiAgICAgICAgICAgIHRoaXMuc2hvd01lc3NhZ2UoTWVzc2FnZVR5cGUuRklMRV9TSVpFLCB7IHBheWxvYWQsIHR5cGU6IE1lc3NhZ2VTdHJpcFR5cGUuRVJST1IgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZmlsZVNpemVFeGNlZWQuZW1pdChldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3VwZGF0ZUZpbGVWZXJzaW9uKG5ld0l0ZW06IEZpbGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudEZvbGRlcklkID0gdGhpcy5fZ2V0Q3VycmVudEZvbGRlcklkKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0ge1xuICAgICAgICAgICAgLi4udGhpcy5fY3VycmVudFVwZGF0ZUZpbGVWZXJzaW9uLFxuICAgICAgICAgICAgc3RhdHVzOiBVcGxvYWRDb2xsZWN0aW9uSXRlbVN0YXR1cy5MT0FESU5HXG4gICAgICAgIH0gYXMgVXBsb2FkQ29sbGVjdGlvbkl0ZW07XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIHBhcmVudEZvbGRlcklkOiB0aGlzLl9nZXRDdXJyZW50Rm9sZGVySWQoKSxcbiAgICAgICAgICAgIGl0ZW06IHRoaXMuX2N1cnJlbnRVcGRhdGVGaWxlVmVyc2lvbixcbiAgICAgICAgICAgIG5ld0l0ZW1cbiAgICAgICAgfSBhcyBVcGRhdGVWZXJzaW9uRXZlbnQ7XG5cbiAgICAgICAgdGhpcy5fZmluZFBhcmVudEZvbGRlckFuZFVwZGF0ZUl0ZW0oY3VycmVudEZvbGRlcklkLCBjdXJyZW50SXRlbSk7XG5cbiAgICAgICAgdGhpcy5kYXRhU291cmNlXG4gICAgICAgICAgICAudXBkYXRlVmVyc2lvbihkYXRhKVxuICAgICAgICAgICAgLnBpcGUodGFwKCgpID0+IHRoaXMuX21hdGNoKCkpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKE1lc3NhZ2VUeXBlLlVQREFURV9WRVJTSU9OLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTWVzc2FnZVN0cmlwVHlwZS5TVUNDRVNTXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VXBkYXRlRmlsZVZlcnNpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dNZXNzYWdlKE1lc3NhZ2VUeXBlLlVQREFURV9WRVJTSU9OLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTWVzc2FnZVN0cmlwVHlwZS5FUlJPUlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3VwbG9hZE5ld0ZpbGVzKGZpbGVzOiBGaWxlW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudEZvbGRlcklkID0gdGhpcy5fZ2V0Q3VycmVudEZvbGRlcklkKCk7XG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zID0gdGhpcy5fZ2VuZXJhdGVUZW1wb3JhcnlOZXdGaWxlcyhmaWxlcyk7XG5cbiAgICAgICAgdGhpcy5fZmluZFBhcmVudEZvbGRlckFuZEFkZFRlbXBvcmFyeUZpbGVzKGN1cnJlbnRGb2xkZXJJZCwgbmV3SXRlbXMpO1xuXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZVxuICAgICAgICAgICAgLnVwbG9hZCh7XG4gICAgICAgICAgICAgICAgcGFyZW50Rm9sZGVySWQ6IGN1cnJlbnRGb2xkZXJJZCxcbiAgICAgICAgICAgICAgICBpdGVtczogbmV3SXRlbXMubWFwKChpdGVtKSA9PiAoeyAuLi5pdGVtIH0pKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKHRhcCgoKSA9PiB0aGlzLl9tYXRjaCgpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dldEN1cnJlbnRGb2xkZXIoKTogVXBsb2FkQ29sbGVjdGlvbkZvbGRlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGb2xkZXJJZCA9IHRoaXMuX2dldEN1cnJlbnRGb2xkZXJJZCgpO1xuXG4gICAgICAgIHJldHVybiAhY3VycmVudEZvbGRlcklkID8gdW5kZWZpbmVkIDogdGhpcy5fZmluZEZvbGRlckJ5SWQoY3VycmVudEZvbGRlcklkKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dldEN1cnJlbnRGb2xkZXJJZCgpOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnJlYWRjcnVtYkxpc3QubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiB0aGlzLl9icmVhZGNydW1iTGlzdFt0aGlzLl9icmVhZGNydW1iTGlzdC5sZW5ndGggLSAxXS5mb2xkZXJJZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2ZpbmRGb2xkZXJCeUlkKFxuICAgICAgICBmb2xkZXJJZDogbnVtYmVyIHwgc3RyaW5nLFxuICAgICAgICBpdGVtczogVXBsb2FkQ29sbGVjdGlvbkl0ZW1bXSA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhUHJvdmlkZXIuaXRlbXNcbiAgICApOiBVcGxvYWRDb2xsZWN0aW9uRm9sZGVyIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGZvdW5kT2JqOiBVcGxvYWRDb2xsZWN0aW9uRm9sZGVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGl0ZW1zLCAoXywgbmVzdGVkVmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmIChuZXN0ZWRWYWx1ZSAmJiBuZXN0ZWRWYWx1ZS5kb2N1bWVudElkID09PSBmb2xkZXJJZCkge1xuICAgICAgICAgICAgICAgIGZvdW5kT2JqID0gbmVzdGVkVmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXN0ZWRWYWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZvdW5kT2JqO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZmluZFBhcmVudEZvbGRlckFuZFVwZGF0ZUl0ZW0oXG4gICAgICAgIHBhcmVudEZvbGRlcklkOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgICAgIHVwZGF0ZWRJdGVtOiBVcGxvYWRDb2xsZWN0aW9uSXRlbSxcbiAgICAgICAgaXRlbXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YVByb3ZpZGVyLml0ZW1zXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICghcGFyZW50Rm9sZGVySWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmRvY3VtZW50SWQgPT09IHVwZGF0ZWRJdGVtLmRvY3VtZW50SWQpO1xuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGl0ZW1zW2luZGV4XSA9IHVwZGF0ZWRJdGVtO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9tYXRjaCgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IGl0ZW1zW2ldO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEl0ZW0udHlwZSAhPT0gJ2ZvbGRlcicpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRJdGVtLmRvY3VtZW50SWQgPT09IHBhcmVudEZvbGRlcklkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50SXRlbS5maWxlcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uZG9jdW1lbnRJZCA9PT0gdXBkYXRlZEl0ZW0uZG9jdW1lbnRJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50SXRlbS5maWxlc1tpXSA9IHVwZGF0ZWRJdGVtO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXRjaCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmluZFBhcmVudEZvbGRlckFuZFVwZGF0ZUl0ZW0ocGFyZW50Rm9sZGVySWQsIHVwZGF0ZWRJdGVtLCBjdXJyZW50SXRlbS5maWxlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2ZpbmRQYXJlbnRGb2xkZXJBbmRBZGRUZW1wb3JhcnlGaWxlcyhcbiAgICAgICAgcGFyZW50Rm9sZGVySWQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgbmV3SXRlbXM6IFVwbG9hZENvbGxlY3Rpb25JdGVtW10sXG4gICAgICAgIGl0ZW1zID0gdGhpcy5kYXRhU291cmNlLmRhdGFQcm92aWRlci5pdGVtc1xuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAoIXBhcmVudEZvbGRlcklkKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKC4uLm5ld0l0ZW1zKTtcbiAgICAgICAgICAgIHRoaXMuX21hdGNoKCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gaXRlbXNbaV07XG4gICAgICAgICAgICBpZiAoY3VycmVudEl0ZW0udHlwZSAhPT0gJ2ZvbGRlcicpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRJdGVtLmRvY3VtZW50SWQgPT09IHBhcmVudEZvbGRlcklkKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEl0ZW0uZmlsZXMucHVzaCguLi5uZXdJdGVtcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF0Y2goKTtcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maW5kUGFyZW50Rm9sZGVyQW5kQWRkVGVtcG9yYXJ5RmlsZXMocGFyZW50Rm9sZGVySWQsIG5ld0l0ZW1zLCBjdXJyZW50SXRlbS5maWxlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dlbmVyYXRlVGVtcG9yYXJ5TmV3RmlsZXMoZmlsZXM6IEZpbGVbXSk6IFVwbG9hZENvbGxlY3Rpb25GaWxlW10ge1xuICAgICAgICByZXR1cm4gZmlsZXMubWFwKChmaWxlKSA9PiAoe1xuICAgICAgICAgICAgZG9jdW1lbnRJZDogdXVpZHY0KCksXG4gICAgICAgICAgICB0eXBlOiAnZmlsZScsXG4gICAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICB1cGxvYWRlZEJ5OiB7XG4gICAgICAgICAgICAgICAgaWQ6IHV1aWR2NCgpLFxuICAgICAgICAgICAgICAgIG5hbWU6IGBZb3VgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBsb2FkZWRPbjogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIGZpbGVTaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgICB2ZXJzaW9uOiAxLFxuICAgICAgICAgICAgdXJsOiAnJyxcbiAgICAgICAgICAgIHN0YXR1czogVXBsb2FkQ29sbGVjdGlvbkl0ZW1TdGF0dXMuTE9BRElORyxcbiAgICAgICAgICAgIGZpbGVcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2VuZXJhdGVUZW1wb3JhcnlOZXdGb2xkZXIoZm9sZGVyTmFtZTogc3RyaW5nKTogVXBsb2FkQ29sbGVjdGlvbkZvbGRlciB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkb2N1bWVudElkOiB1dWlkdjQoKSxcbiAgICAgICAgICAgIHR5cGU6ICdmb2xkZXInLFxuICAgICAgICAgICAgbmFtZTogZm9sZGVyTmFtZSxcbiAgICAgICAgICAgIHVwbG9hZGVkQnk6IHtcbiAgICAgICAgICAgICAgICBpZDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnWW91J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwbG9hZGVkT246IG5ldyBEYXRlKCksXG4gICAgICAgICAgICBmaWxlczogW10sXG4gICAgICAgICAgICBzdGF0dXM6IFVwbG9hZENvbGxlY3Rpb25JdGVtU3RhdHVzLkxPQURJTkdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2luaXRpYWxpemVEUyhkczogRmRwVXBsb2FkQ29sbGVjdGlvbkRhdGFTb3VyY2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdmlzaWJsZUxpc3QkLm5leHQoW10pO1xuICAgICAgICBpZiAoaXNEYXRhU291cmNlKHRoaXMuZGF0YVNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5jbG9zZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2RzU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZHNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kc1N1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UgPSB0aGlzLl9vcGVuRGF0YVN0cmVhbShkcyk7XG5cbiAgICAgICAgLy8gaW5pdGlhbCBkYXRhIGZldGNoXG4gICAgICAgIHRoaXMuX21hdGNoKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9vcGVuRGF0YVN0cmVhbShkczogRmRwVXBsb2FkQ29sbGVjdGlvbkRhdGFTb3VyY2UpOiBVcGxvYWRDb2xsZWN0aW9uRGF0YVNvdXJjZSB7XG4gICAgICAgIGNvbnN0IGluaXREYXRhU291cmNlID0gdGhpcy5fdG9EYXRhU3RyZWFtKGRzKTtcbiAgICAgICAgaWYgKGluaXREYXRhU291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW2RhdGFTb3VyY2VdIHNvdXJjZSBkaWQgbm90IG1hdGNoIGFuIGFycmF5LCBPYnNlcnZhYmxlLCBvciBEYXRhU291cmNlYCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgaXMgc2luZ2xlIHBvaW50IG9mIGRhdGEgZW50cnkgdG8gdGhlIGNvbXBvbmVudC4gV2UgZG9udCB3YW50IHRvIHNldCBkYXRhIG9uIGRpZmZlcmVudFxuICAgICAgICAgKiBwbGFjZXMuIElmIGFueSBuZXcgZGF0YSBjb21lcyBpbiBlaXRoZXIgeW91IGRvIGEgc2VhcmNoIGFuZCB5b3Ugd2FudCB0byBwYXNzIGluaXRpYWwgZGF0YVxuICAgICAgICAgKiBpdHMgaGVyZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2RzU3Vic2NyaXB0aW9uID0gaW5pdERhdGFTb3VyY2Uub3BlbigpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdmlzaWJsZUxpc3QkLm5leHQoZGF0YSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3RvdGFsSXRlbXMgPSBpbml0RGF0YVNvdXJjZS5kYXRhUHJvdmlkZXIudG90YWxJdGVtcztcblxuICAgICAgICAgICAgdGhpcy5fY291bnRVbnZpc2libGVJdGVtcygpO1xuICAgICAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGluaXREYXRhU291cmNlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfdG9EYXRhU3RyZWFtKGRzOiBGZHBVcGxvYWRDb2xsZWN0aW9uRGF0YVNvdXJjZSk6IFVwbG9hZENvbGxlY3Rpb25EYXRhU291cmNlIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGlzRGF0YVNvdXJjZShkcykpIHtcbiAgICAgICAgICAgIHJldHVybiBkcyBhcyBVcGxvYWRDb2xsZWN0aW9uRGF0YVNvdXJjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9tYXRjaCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgcXVlcnkuc2V0KCdmb2xkZXJJZCcsIHRoaXMuX2dldEN1cnJlbnRGb2xkZXJJZCgpKTtcbiAgICAgICAgcXVlcnkuc2V0KCdwYWdlJywgdGhpcy5fY3VycmVudFBhZ2UpO1xuICAgICAgICBxdWVyeS5zZXQoJ3NlYXJjaFRleHQnLCB0aGlzLl9zZWFyY2hUZXh0IHx8ICcqJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlUGFnaW5hdGlvbikge1xuICAgICAgICAgICAgcXVlcnkuc2V0KCdsaW1pdCcsIHRoaXMuX2l0ZW1zUGVyUGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UubWF0Y2gocXVlcnkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY291bnRVbnZpc2libGVJdGVtcygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbXNQZXJQYWdlID0gdGhpcy5faXRlbXNQZXJQYWdlIGFzIG51bWJlcjtcbiAgICAgICAgdGhpcy5fY291bnRTaG93ZWRJdGVtcyA9IHRoaXMuX2N1cnJlbnRQYWdlICogaXRlbXNQZXJQYWdlIC0gaXRlbXNQZXJQYWdlICsgMTtcbiAgICAgICAgdGhpcy5fY291bnROb3RTaG93ZWRJdGVtcyA9IHRoaXMuX2NvdW50U2hvd2VkSXRlbXMgKyB0aGlzLl92aXNpYmxlTGlzdCQudmFsdWUubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2NsZWFySXRlbVNhbWVGaWxlbmFtZVN0YXRlKGN1cnJlbnRJdGVtOiBVcGxvYWRDb2xsZWN0aW9uSXRlbSk6IHZvaWQge1xuICAgICAgICBpZiAoIWN1cnJlbnRJdGVtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5fZ2V0TGlzdCgpKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS5kb2N1bWVudElkID09PSBjdXJyZW50SXRlbS5kb2N1bWVudElkKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGl0ZW0uc2FtZUZpbGVuYW1lU3RhdGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IFtpZF09XCJpZFwiIGNsYXNzPVwiZmRwLXVwbG9hZC1jb2xsZWN0aW9uXCI+XG4gICAgPCEtLSBNZXNzYWdlIHN0cmlwIC0tPlxuICAgIDxmZC1tZXNzYWdlLXN0cmlwICpuZ0lmPVwiX21lc3NhZ2VcIiBbdHlwZV09XCJfbWVzc2FnZS5tZXNzYWdlU3RyaXBUeXBlXCIgKG9uRGlzbWlzcyk9XCJfbWVzc2FnZVN0cmlwRGlzbWlzcygpXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm1lc3NhZ2VcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZTogX21lc3NhZ2UubWVzc2FnZVR5cGUsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogX21lc3NhZ2UucGF5bG9hZCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyaXBUeXBlOiBfbWVzc2FnZS5tZXNzYWdlU3RyaXBUeXBlLFxuICAgICAgICAgICAgICAgIGNvdW50OiBfbWVzc2FnZS5jb3VudFxuICAgICAgICAgICAgfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L2ZkLW1lc3NhZ2Utc3RyaXA+XG5cbiAgICA8IS0tIFRvb2xiYXIgLS0+XG4gICAgPGZkLXRvb2xiYXIgY2xhc3M9XCJmZHAtdXBsb2FkLWNvbGxlY3Rpb25fX3Rvb2xiYXJcIj5cbiAgICAgICAgPGRpdiBbc3R5bGUuZmxleF09XCInMSBhdXRvJ1wiPlxuICAgICAgICAgICAgPGZkLWJyZWFkY3J1bWIgW2lkXT1cImlkICsgJy1icmVhZGNydW1iJ1wiPlxuICAgICAgICAgICAgICAgIDxmZC1icmVhZGNydW1iLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbXVsdGlwbGVCcmVhZGNydW1icz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgZmQtbGluayAoY2xpY2spPVwiX2JyZWFkY3J1bWJHb1RvKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLmJyZWFkY3J1bWJMYWJlbEFsbEZpbGVzJyB8IGZkVHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlQnJlYWRjcnVtYj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24uYnJlYWRjcnVtYkxhYmVsQWxsRmlsZXNXaXRoVG90YWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZkVHJhbnNsYXRlIDogeyB0b3RhbDogX3RvdGFsSXRlbXMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiX2JyZWFkY3J1bWJMaXN0Lmxlbmd0aCA+IDAgPyBtdWx0aXBsZUJyZWFkY3J1bWJzIDogc2luZ2xlQnJlYWRjcnVtYlwiXG4gICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2ZkLWJyZWFkY3J1bWItaXRlbT5cbiAgICAgICAgICAgICAgICA8ZmQtYnJlYWRjcnVtYi1pdGVtICpuZ0Zvcj1cImxldCBpdGVtIG9mIF9icmVhZGNydW1iTGlzdDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NsaWNrYWJsZUJyZWFkY3J1bWI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGZkLWxpbmsgKGNsaWNrKT1cIl9icmVhZGNydW1iR29UbygkZXZlbnQsIGkpXCI+e3sgaXRlbS5mb2xkZXJOYW1lIH19PC9hPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RleHRCcmVhZGNydW1iPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS5mb2xkZXJOYW1lIH19ICh7eyBfdG90YWxJdGVtcyB9fSk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbS5jbGlrYWJsZSA/IGNsaWNrYWJsZUJyZWFkY3J1bWIgOiB0ZXh0QnJlYWRjcnVtYlwiXG4gICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2ZkLWJyZWFkY3J1bWItaXRlbT5cbiAgICAgICAgICAgIDwvZmQtYnJlYWRjcnVtYj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGZkLXRvb2xiYXItc3BhY2VyIFtzdHlsZS5tYXgtd2lkdGgucmVtXT1cIjNcIj48L2ZkLXRvb2xiYXItc3BhY2VyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVhZG9ubHkgfHwgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgIDxmZC1pbnB1dC1ncm91cFxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1NlYXJjaFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJfc2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiX3NlYXJjaElucHV0Q2hhbmdlZCgpXCJcbiAgICAgICAgICAgICAgICBnbHlwaD1cInNlYXJjaFwiXG4gICAgICAgICAgICAgICAgW2FyaWFMYWJlbGxlZEJ5XT1cImlkICsgJy1icmVhZGNydW1iJ1wiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24uc2VhcmNoUGxhY2Vob2xkZXInIHwgZmRUcmFuc2xhdGVcIlxuICAgICAgICAgICAgPjwvZmQtaW5wdXQtZ3JvdXA+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVhZG9ubHlcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGZkLXRvb2xiYXItaXRlbVxuICAgICAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9vcGVuVXBsb2FkRmlsZXMoKVwiXG4gICAgICAgICAgICAgICAgICAgIGZkVHlwZT1cImdob3N0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24uYWRkQnRuTGFiZWwnIHwgZmRUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5hZGRCdG5MYWJlbCcgfCBmZFRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfb3Blbk5ld0ZvbGRlckRpYWxvZygpXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoaWVyYXJjaHlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBmZFR5cGU9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLm5ld0ZvbGRlckJ0bkxhYmVsJyB8IGZkVHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubmV3Rm9sZGVyQnRuTGFiZWwnIHwgZmRUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXJlYWRvbmx5ICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGZkLXRvb2xiYXItaXRlbVxuICAgICAgICAgICAgICAgIGZkLWJ1dHRvblxuICAgICAgICAgICAgICAgIChjbGljayk9XCJfbW92ZVRvQ2xpY2tlZCh0cnVlKVwiXG4gICAgICAgICAgICAgICAgZmRUeXBlPVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubW92ZVRvQnRuTGFiZWwnIHwgZmRUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLm1vdmVUb0J0bkxhYmVsJyB8IGZkVHJhbnNsYXRlXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiX2Rvd25sb2FkQ2xpY2tlZCh0cnVlKVwiXG4gICAgICAgICAgICAgICAgZmRUeXBlPVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJfc2hvd0lmU2VsZWN0ZWRPbmx5RmlsZXMoKVwiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24uZG93bmxvYWRCdG5MYWJlbCcgfCBmZFRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIidwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24uZG93bmxvYWRCdG5MYWJlbCcgfCBmZFRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgZmQtdG9vbGJhci1pdGVtXG4gICAgICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9yZW1vdmUodHJ1ZSlcIlxuICAgICAgICAgICAgICAgIGZkVHlwZT1cImdob3N0XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLnJlbW92ZUJ0bkxhYmVsJyB8IGZkVHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5yZW1vdmVCdG5MYWJlbCcgfCBmZFRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZmQtdG9vbGJhcj5cblxuICAgIDxkaXYgY2xhc3M9XCJmZHAtdXBsb2FkLWNvbGxlY3Rpb25fX3RhYmxlLS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZmRwLXVwbG9hZC1jb2xsZWN0aW9uX190YWJsZVwiXG4gICAgICAgICAgICBmZHBVcGxvYWRDb2xsZWN0aW9uRHJhZ25Ecm9wXG4gICAgICAgICAgICBbZmlsZVR5cGVzXT1cImZpbGVUeXBlc1wiXG4gICAgICAgICAgICBbbWF4RmlsZW5hbWVMZW5ndGhdPVwibWF4RmlsZW5hbWVMZW5ndGhcIlxuICAgICAgICAgICAgW21heEZpbGVTaXplXT1cIm1heEZpbGVTaXplXCJcbiAgICAgICAgICAgIFttaW1lVHlwZXNdPVwibWltZVR5cGVzXCJcbiAgICAgICAgICAgIFtkcmFnbmRyb3BdPVwiIXJlYWRvbmx5XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgKGZpbGVDaGFuZ2VkKT1cIl9oYW5kbGVEcm9wKCRldmVudClcIlxuICAgICAgICAgICAgKGNhbmNlbCk9XCJfZHJhZ0Ryb3BDYW5jZWwoKVwiXG4gICAgICAgICAgICAob25Ecm9wem9uZSk9XCJfb25Ecm9wem9uZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPCEtLSBUYWJsZSAtLT5cbiAgICAgICAgICAgIDxmZHAtdGFibGVcbiAgICAgICAgICAgICAgICAqbmdJZj1cIl92aXNpYmxlTGlzdCQudmFsdWUubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwiX3Zpc2libGVMaXN0JFwiXG4gICAgICAgICAgICAgICAgW2xvYWRpbmddPVwiZGF0YVNvdXJjZS5pc0RhdGFMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Nb2RlPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgIGVtcHR5VGFibGVNZXNzYWdlPVwiXCJcbiAgICAgICAgICAgICAgICBbbm9Ib3Jpem9udGFsQm9yZGVyc109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbdHJhY2tCeV09XCJfdHJhY2tCeURvY3VtZW50SWRcIlxuICAgICAgICAgICAgICAgIChyb3dTZWxlY3Rpb25DaGFuZ2UpPVwiX29uUm93U2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmZHAtY29sdW1uIG5hbWU9XCJuYW1lXCIgbGFiZWw9XCJOYW1lXCIgd2lkdGg9XCI4cmVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmZHAtdGFibGUtY2VsbCAqZmRwQ2VsbERlZj1cImxldCBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmRwLXVwbG9hZC1jb2xsZWN0aW9uX192ZXJ0aWNhbC1hbGlnbi1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmQtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZkcC11cGxvYWQtY29sbGVjdGlvbl9fZmQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAnZm9sZGVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoPVwiZm9sZGVyLWJsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24uZm9sZGVySWNvblRpdGxlJyB8IGZkVHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9mZC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmRwLXVwbG9hZC1jb2xsZWN0aW9uX19mZC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdmaWxlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtnbHlwaF09XCJfZ2V0SWNvbkJ5VHlwZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCIncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLmZpbGVJY29uVGl0bGUnIHwgZmRUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2ZkLWljb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzYWJsZWQgfHwgcmVhZG9ubHkgfHwgIV9pc1NlbGVjdGVkSXRlbShpdGVtKTsgZWxzZSBlZGl0TW9kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZkcC11cGxvYWQtY29sbGVjdGlvbl9fY3Vyc29yXT1cIml0ZW0udHlwZSA9PT0gJ2ZvbGRlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9vcGVuRm9sZGVyKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID57eyBpdGVtLm5hbWUgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWRpdE1vZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmZC1mb3JtLWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZC1mb3JtLWlucHV0LW1lc3NhZ2UtZ3JvdXAgW3RyaWdnZXJzXT1cIltdXCIgW2lzT3Blbl09XCIhIWl0ZW0uc2FtZUZpbGVuYW1lU3RhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZHAtdXBsb2FkLWNvbGxlY3Rpb25fX3ZlcnRpY2FsLWFsaWduLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC1mb3JtLWNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIl9nZXRJdGVtTmFtZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cIl9maWxlTmFtZUNoYW5nZSgkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIl9jaGVja05hbWUoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5lZGl0RmlsZU5hbWVJbnB1dFBsYWNlaG9sZGVyJyB8IGZkVHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGF0ZV09XCJpdGVtLnNhbWVGaWxlbmFtZVN0YXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmRwLXVwbG9hZC1jb2xsZWN0aW9uX19pdGVtX2V4dGVuc2lvblwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9nZXRJdGVtRXh0ZW5zaW9uKGl0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZkLWZvcm0tbWVzc2FnZSBbdHlwZV09XCJpdGVtLnNhbWVGaWxlbmFtZVN0YXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0udHlwZSA9PT0gJ2ZpbGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24uZWRpdEZpbGVOYW1lRmlsZUFscmVhZHlFeGlzdHNFcnJvcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5lZGl0RmlsZU5hbWVGb2xkZXJBbHJlYWR5RXhpc3RzRXJyb3InXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgfCBmZFRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZkLWZvcm0tbWVzc2FnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mZC1mb3JtLWlucHV0LW1lc3NhZ2UtZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L2ZkcC10YWJsZS1jZWxsPlxuICAgICAgICAgICAgICAgIDwvZmRwLWNvbHVtbj5cblxuICAgICAgICAgICAgICAgIDxmZHAtY29sdW1uIG5hbWU9XCJ1cGxvYWRlZEJ5XCIgbGFiZWw9XCJVcGxvYWRlZCBieVwiIHdpZHRoPVwiNXJlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZmRwLXRhYmxlLWNlbGwgKmZkcENlbGxEZWY9XCJsZXQgaXRlbVwiPnt7IGl0ZW0udXBsb2FkZWRCeS5uYW1lIH19PC9mZHAtdGFibGUtY2VsbD5cbiAgICAgICAgICAgICAgICA8L2ZkcC1jb2x1bW4+XG5cbiAgICAgICAgICAgICAgICA8ZmRwLWNvbHVtbiBuYW1lPVwidXBsb2FkZWRPblwiIGxhYmVsPVwiVXBsb2FkZWQgb25cIiB3aWR0aD1cIjVyZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGZkcC10YWJsZS1jZWxsICpmZHBDZWxsRGVmPVwibGV0IGl0ZW1cIj57eyBpdGVtLnVwbG9hZGVkT24gfCBkYXRlIDogJ3Nob3J0RGF0ZScgfX08L2ZkcC10YWJsZS1jZWxsPlxuICAgICAgICAgICAgICAgIDwvZmRwLWNvbHVtbj5cblxuICAgICAgICAgICAgICAgIDxmZHAtY29sdW1uIG5hbWU9XCJzaXplXCIgbGFiZWw9XCJGaWxlIHNpemVcIiB3aWR0aD1cIjVyZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGZkcC10YWJsZS1jZWxsICpmZHBDZWxsRGVmPVwibGV0IGl0ZW1cIj57eyBpdGVtLmZpbGVTaXplIHwgY29udmVydEJ5dGVzIH19PC9mZHAtdGFibGUtY2VsbD5cbiAgICAgICAgICAgICAgICA8L2ZkcC1jb2x1bW4+XG5cbiAgICAgICAgICAgICAgICA8ZmRwLWNvbHVtbiBuYW1lPVwidmVyc2lvblwiIGxhYmVsPVwiVmVyc2lvblwiIHdpZHRoPVwiNXJlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZmRwLXRhYmxlLWNlbGwgKmZkcENlbGxEZWY9XCJsZXQgaXRlbVwiPnt7IGl0ZW0udmVyc2lvbiB8fCAnJyB9fTwvZmRwLXRhYmxlLWNlbGw+XG4gICAgICAgICAgICAgICAgPC9mZHAtY29sdW1uPlxuXG4gICAgICAgICAgICAgICAgPGZkcC1jb2x1bW4gbmFtZT1cInN0YXR1c1wiIGxhYmVsPVwiU3RhdHVzXCIgd2lkdGg9XCI1cmVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxmZHAtdGFibGUtY2VsbCAqZmRwQ2VsbERlZj1cImxldCBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZmQtYnVzeS1pbmRpY2F0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uc3RhdHVzID09PSBfdXBsb2FkQ29sbGVjdGlvbkl0ZW1TdGF0dXMuTE9BRElOR1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiU3RhdHVzOiBMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhTGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvZmQtYnVzeS1pbmRpY2F0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5zdGF0dXMgPT09IF91cGxvYWRDb2xsZWN0aW9uSXRlbVN0YXR1cy5TVUNDRVNTRlVMXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC1vYmplY3Qtc3RhdHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzPVwicG9zaXRpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24uaXRlbVN0YXR1c1N1Y2Nlc3NmdWwnIHwgZmRUcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PT0gX3VwbG9hZENvbGxlY3Rpb25JdGVtU3RhdHVzLlVOU1VDQ0VTU0ZVTFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQtb2JqZWN0LXN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cz1cIm5lZ2F0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLml0ZW1TdGF0dXNVbnN1Y2Nlc3NmdWwnIHwgZmRUcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9mZHAtdGFibGUtY2VsbD5cbiAgICAgICAgICAgICAgICA8L2ZkcC1jb2x1bW4+XG5cbiAgICAgICAgICAgICAgICA8ZmRwLWNvbHVtbiBuYW1lPVwiYWN0aW9uXCIgKm5nSWY9XCIhcmVhZG9ubHlcIiB3aWR0aD1cIjVyZW1cIiBhbGlnbj1cImVuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZmRwLXRhYmxlLWhlYWRlciAqZmRwSGVhZGVyQ2VsbERlZj5BY3Rpb248L2ZkcC10YWJsZS1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxmZHAtdGFibGUtY2VsbCAqZmRwQ2VsbERlZj1cImxldCBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmRwLXVwbG9hZC1jb2xsZWN0aW9uX19hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZkcC11cGxvYWQtY29sbGVjdGlvbl9fYWN0aW9ucy0tc3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24udXBsb2FkTmV3RmlsZUFmdGVyRmFpbEFjdGlvbicgfCBmZFRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi51cGxvYWROZXdGaWxlQWZ0ZXJGYWlsQWN0aW9uJyB8IGZkVHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfcnVuVXBsb2FkTmV3RmlsZUFmdGVyRmFpbChpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZFR5cGU9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnN0YXR1cyA9PT0gX3VwbG9hZENvbGxlY3Rpb25JdGVtU3RhdHVzLlVOU1VDQ0VTU0ZVTFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLmNhbmNlbFVwbG9hZE5ld0ZpbGVBY3Rpb24nIHwgZmRUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24uY2FuY2VsVXBsb2FkTmV3RmlsZUFjdGlvbicgfCBmZFRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZFR5cGU9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9jYW5jZWxVcGxvYWROZXdGaWxlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGVybWluYXRpb25FbmFibGVkICYmIGl0ZW0uc3RhdHVzID09PSBfdXBsb2FkQ29sbGVjdGlvbkl0ZW1TdGF0dXMuTE9BRElOR1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmZHAtbWVudS1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cIm92ZXJmbG93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24uaXRlbU1lbnVCdG5UaXRsZScgfCBmZFRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmZHBNZW51VHJpZ2dlckZvcl09XCJtZW51QWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidXR0b25DbGlja2VkKT1cIl9hY3Rpb25CdXR0b24oaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZkcC1tZW51LWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2ZkcC10YWJsZS1jZWxsPlxuICAgICAgICAgICAgICAgIDwvZmRwLWNvbHVtbj5cbiAgICAgICAgICAgIDwvZmRwLXRhYmxlPlxuXG4gICAgICAgICAgICA8IS0tIERyYWdkcm9wIGFyZWEgLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZHAtdXBsb2FkLWNvbGxlY3Rpb25fX2RyYWdkcm9wLWFyZWFcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiX3Nob3dEcmFnRHJvcEFyZWFcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiX29uRHJhZ0Ryb3BBcmVhXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmQtaWNvbiBjbGFzcz1cImZkcC11cGxvYWQtY29sbGVjdGlvbl9fZHJhZ2Ryb3AtYXJlYS0taWNvblwiIGdseXBoPVwidXBsb2FkLXRvLWNsb3VkXCI+PC9mZC1pY29uPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZmRwLXVwbG9hZC1jb2xsZWN0aW9uX19kcmFnZHJvcC1hcmVhLS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24uZHJhZ0Ryb3BBcmVhVGV4dCcgfCBmZFRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIE5vIGRhdGEgLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZHAtdXBsb2FkLWNvbGxlY3Rpb25fX25vLWRhdGFcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiX3Zpc2libGVMaXN0JC52YWx1ZS5sZW5ndGggPT09IDBcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pbnZpc2libGVdPVwiX3Nob3dEcmFnRHJvcEFyZWFcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmZC1pY29uIGdseXBoPVwiZG9jdW1lbnRcIj48L2ZkLWljb24+XG4gICAgICAgICAgICAgICAgPGgzPnt7ICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubm9EYXRhVGV4dCcgfCBmZFRyYW5zbGF0ZSB9fTwvaDM+XG4gICAgICAgICAgICAgICAgPHA+e3sgJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5ub0RhdGFEZXNjcmlwdGlvbicgfCBmZFRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFRhYmxlIGZvb3RlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZkcC11cGxvYWQtY29sbGVjdGlvbl9fdGFibGUtZm9vdGVyXCIgKm5nSWY9XCJlbmFibGVQYWdpbmF0aW9uICYmIF90b3RhbEl0ZW1zXCI+XG4gICAgICAgICAgICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmRwLXVwbG9hZC1jb2xsZWN0aW9uX19wYWdpbmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2lkXT1cImlkICsgJy1wYWdpbmF0aW9uJ1wiIGNsYXNzPVwiZmRwLXVwbG9hZC1jb2xsZWN0aW9uX19wYWdpbmF0aW9uLS10b3RhbFwiPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5wYWdpbmF0aW9uVG90YWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmZFRyYW5zbGF0ZSA6IHsgZnJvbTogX2NvdW50U2hvd2VkSXRlbXMsIHRvOiBfY291bnROb3RTaG93ZWRJdGVtcywgdG90YWw6IF90b3RhbEl0ZW1zIH1cbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGZkLXBhZ2luYXRpb25cbiAgICAgICAgICAgICAgICAgICAgW3RvdGFsSXRlbXNdPVwiX3RvdGFsSXRlbXNcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVRvdGFsSXRlbXNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAocGFnZUNoYW5nZVN0YXJ0KT1cIl9wYWdlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1zUGVyUGFnZV09XCJfaXRlbXNQZXJQYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRQYWdlXT1cIl9jdXJyZW50UGFnZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpZCArICctcGFnaW5hdGlvbidcIlxuICAgICAgICAgICAgICAgID48L2ZkLXBhZ2luYXRpb24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBSZXN1bHRzIHBlciBwYWdlIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZkcC11cGxvYWQtY29sbGVjdGlvbl9fcmVzdWx0c1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmRwLXVwbG9hZC1jb2xsZWN0aW9uX19yZXN1bHRzLS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaWRdPVwiaWQgKyAnLXJlc3VsdHMnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLnJlc3VsdHNQZXJQYWdlJyB8IGZkVHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJfaXRlbXNQZXJQYWdlT3B0aW9ucy5sZW5ndGggPT09IDBcIj57eyBfaXRlbXNQZXJQYWdlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZmRwLW1lbnUtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiX2l0ZW1zUGVyUGFnZU9wdGlvbnMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxsZWRCeV09XCJpZCArICctcmVzdWx0cydcIlxuICAgICAgICAgICAgICAgICAgICBbZmRwTWVudVRyaWdnZXJGb3JdPVwiaXRlbXNQZXJQYWdlTWVudVwiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJfaXRlbXNQZXJQYWdlICsgJydcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2ZkcC1tZW51LWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48ZmRwLW1lbnUgI2l0ZW1zUGVyUGFnZU1lbnUgeFBvc2l0aW9uPVwiYmVmb3JlXCI+XG4gICAgPGZkcC1tZW51LWl0ZW1cbiAgICAgICAgKm5nRm9yPVwibGV0IHZhbHVlIG9mIF9pdGVtc1BlclBhZ2VPcHRpb25zXCJcbiAgICAgICAgKGl0ZW1TZWxlY3QpPVwiX2l0ZW1zUGVyUGFnZUNoYW5nZSh2YWx1ZS5sYWJlbClcIlxuICAgICAgICBbYXR0ci50aXRsZV09XCInUmVzdWx0cyBwZXIgcGFnZTogJyArIHZhbHVlLmxhYmVsXCJcbiAgICA+XG4gICAgICAgIDxzcGFuPnt7IHZhbHVlLmxhYmVsIH19PC9zcGFuPlxuICAgIDwvZmRwLW1lbnUtaXRlbT5cbjwvZmRwLW1lbnU+XG5cbjxmZHAtbWVudSAjbWVudUFjdGlvbnMgeFBvc2l0aW9uPVwiYmVmb3JlXCI+XG4gICAgPGZkcC1tZW51LWl0ZW0gKGl0ZW1TZWxlY3QpPVwiX21vdmVUb0NsaWNrZWQoKVwiPlxuICAgICAgICA8ZmQtaWNvblxuICAgICAgICAgICAgY2xhc3M9XCJmZHAtdXBsb2FkLWNvbGxlY3Rpb25fX2ZkLWljb25cIlxuICAgICAgICAgICAgZ2x5cGg9XCJmb2xkZXItYmxhbmtcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIidwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubW92ZVRvQnRuTGFiZWwnIHwgZmRUcmFuc2xhdGVcIlxuICAgICAgICA+PC9mZC1pY29uPlxuICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIHt7ICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubW92ZVRvQnRuTGFiZWwnIHwgZmRUcmFuc2xhdGUgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvZmRwLW1lbnUtaXRlbT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiX2FjdGl2ZUl0ZW0/LnR5cGUgPT09ICdmaWxlJ1wiPlxuICAgICAgICA8ZmRwLW1lbnUtaXRlbSAoaXRlbVNlbGVjdCk9XCJfZG93bmxvYWRDbGlja2VkKClcIj5cbiAgICAgICAgICAgIDxmZC1pY29uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZHAtdXBsb2FkLWNvbGxlY3Rpb25fX2ZkLWljb25cIlxuICAgICAgICAgICAgICAgIGdseXBoPVwiZG93bmxvYWRcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLmRvd25sb2FkQnRuTGFiZWwnIHwgZmRUcmFuc2xhdGVcIlxuICAgICAgICAgICAgPjwvZmQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24uZG93bmxvYWRCdG5MYWJlbCcgfCBmZFRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2ZkcC1tZW51LWl0ZW0+XG4gICAgICAgIDxmZHAtbWVudS1pdGVtIChpdGVtU2VsZWN0KT1cIl9vcGVuVXBkYXRlRmlsZVZlcnNpb24oKVwiPlxuICAgICAgICAgICAgPGZkLWljb25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkcC11cGxvYWQtY29sbGVjdGlvbl9fZmQtaWNvblwiXG4gICAgICAgICAgICAgICAgZ2x5cGg9XCJkcmlsbC11cFwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIidwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24udXBkYXRlVmVyc2lvbkJ0bkxhYmVsJyB8IGZkVHJhbnNsYXRlXCJcbiAgICAgICAgICAgID48L2ZkLWljb24+XG4gICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLnVwZGF0ZVZlcnNpb25CdG5MYWJlbCcgfCBmZFRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2ZkcC1tZW51LWl0ZW0+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGZkcC1tZW51LWl0ZW0gKGl0ZW1TZWxlY3QpPVwiX3JlbW92ZSgpXCI+XG4gICAgICAgIDxmZC1pY29uXG4gICAgICAgICAgICBjbGFzcz1cImZkcC11cGxvYWQtY29sbGVjdGlvbl9fZmQtaWNvblwiXG4gICAgICAgICAgICBnbHlwaD1cImRlbGV0ZVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5yZW1vdmVCdG5MYWJlbCcgfCBmZFRyYW5zbGF0ZVwiXG4gICAgICAgID48L2ZkLWljb24+XG4gICAgICAgIDxzcGFuPlxuICAgICAgICAgICAge3sgJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5yZW1vdmVCdG5MYWJlbCcgfCBmZFRyYW5zbGF0ZSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgPC9mZHAtbWVudS1pdGVtPlxuPC9mZHAtbWVudT5cblxuPGlucHV0XG4gICAgI2ZpbGVJbnB1dFxuICAgIGNsYXNzPVwiZmRwLXVwbG9hZC1jb2xsZWN0aW9uX19oaWRkZW5cIlxuICAgIHR5cGU9XCJmaWxlXCJcbiAgICAoZmlsZVNlbGVjdGVkKT1cIl9zZWxlY3RIYW5kbGVyKCRldmVudClcIlxuICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBmZEZpbGVTZWxlY3Rcbi8+XG5cbjxpbnB1dFxuICAgICN1cGRhdGVWZXJzaW9uSW5wdXRcbiAgICBjbGFzcz1cImZkcC11cGxvYWQtY29sbGVjdGlvbl9faGlkZGVuXCJcbiAgICB0eXBlPVwiZmlsZVwiXG4gICAgKGZpbGVTZWxlY3RlZCk9XCJfc2VsZWN0SGFuZGxlcigkZXZlbnQpXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFttdWx0aXBsZV09XCJmYWxzZVwiXG4gICAgZmRGaWxlU2VsZWN0XG4vPlxuXG48bmctdGVtcGxhdGVcbiAgICBsZXQtbWVzc2FnZVR5cGU9XCJtZXNzYWdlVHlwZVwiXG4gICAgbGV0LXBheWxvYWQ9XCJwYXlsb2FkXCJcbiAgICBsZXQtbWVzc2FnZVN0cmlwVHlwZT1cIm1lc3NhZ2VTdHJpcFR5cGVcIlxuICAgIGxldC1jb3VudD1cImNvdW50XCJcbiAgICAjbWVzc2FnZVxuPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJfbWVzc2FnZVwiIFtuZ1N3aXRjaF09XCJtZXNzYWdlVHlwZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiX21lc3NhZ2VUeXBlLkNSRUFURVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJtZXNzYWdlTmV3Rm9sZGVyXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVN0cmlwVHlwZTogX21lc3NhZ2UubWVzc2FnZVN0cmlwVHlwZSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBfbWVzc2FnZS5wYXlsb2FkXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJfbWVzc2FnZVR5cGUuVVBEQVRFX1ZFUlNJT05cIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibWVzc2FnZVVwZGF0ZVZlcnNpb25cIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyaXBUeXBlOiBfbWVzc2FnZS5tZXNzYWdlU3RyaXBUeXBlLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IF9tZXNzYWdlLnBheWxvYWRcbiAgICAgICAgICAgIH1cIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIl9tZXNzYWdlVHlwZS5GSUxFX1JFTkFNRVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJtZXNzYWdlRmlsZVJlbmFtZVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VTdHJpcFR5cGU6IF9tZXNzYWdlLm1lc3NhZ2VTdHJpcFR5cGUsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogX21lc3NhZ2UucGF5bG9hZFxuICAgICAgICAgICAgfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiX21lc3NhZ2VUeXBlLlJFTU9WRVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJtZXNzYWdlUmVtb3ZlXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgcGF5bG9hZDogX21lc3NhZ2UucGF5bG9hZCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyaXBUeXBlOiBfbWVzc2FnZS5tZXNzYWdlU3RyaXBUeXBlLFxuICAgICAgICAgICAgICAgIGNvdW50OiBfbWVzc2FnZS5jb3VudFxuICAgICAgICAgICAgfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiX21lc3NhZ2VUeXBlLk1PVkVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibWVzc2FnZU1vdmVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBfbWVzc2FnZS5wYXlsb2FkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VTdHJpcFR5cGU6IF9tZXNzYWdlLm1lc3NhZ2VTdHJpcFR5cGUsXG4gICAgICAgICAgICAgICAgY291bnQ6IF9tZXNzYWdlLmNvdW50XG4gICAgICAgICAgICB9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJfbWVzc2FnZVR5cGUuVFlQRV9NSVNNQVRDSFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJtZXNzYWdlVHlwZU1pc21hdGNoXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgcGF5bG9hZDogX21lc3NhZ2UucGF5bG9hZCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyaXBUeXBlOiBfbWVzc2FnZS5tZXNzYWdlU3RyaXBUeXBlLFxuICAgICAgICAgICAgICAgIGNvdW50OiBfbWVzc2FnZS5jb3VudFxuICAgICAgICAgICAgfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiX21lc3NhZ2VUeXBlLkZJTEVfU0laRVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJtZXNzYWdlRmlsZVNpemVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBfbWVzc2FnZS5wYXlsb2FkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VTdHJpcFR5cGU6IF9tZXNzYWdlLm1lc3NhZ2VTdHJpcFR5cGUsXG4gICAgICAgICAgICAgICAgY291bnQ6IF9tZXNzYWdlLmNvdW50XG4gICAgICAgICAgICB9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJfbWVzc2FnZVR5cGUuRklMRV9OQU1FX0xFTkdUSFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJtZXNzYWdlRmlsZW5hbWVMZW5ndGhcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBfbWVzc2FnZS5wYXlsb2FkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VTdHJpcFR5cGU6IF9tZXNzYWdlLm1lc3NhZ2VTdHJpcFR5cGUsXG4gICAgICAgICAgICAgICAgY291bnQ6IF9tZXNzYWdlLmNvdW50XG4gICAgICAgICAgICB9XCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtZXNzYWdlTmV3Rm9sZGVyIGxldC1wYXlsb2FkPVwicGF5bG9hZFwiIGxldC1tZXNzYWdlU3RyaXBUeXBlPVwibWVzc2FnZVN0cmlwVHlwZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlU3RyaXBUeXBlID09PSAnZXJyb3InOyBlbHNlIGZvbGRlcnNDcmVhdGVkXCI+XG4gICAgICAgIHt7ICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubWVzc2FnZUNyZWF0ZUZhaWxlZCcgfCBmZFRyYW5zbGF0ZSA6IHsgZm9sZGVyTmFtZTogcGF5bG9hZC5mb2xkZXIubmFtZSB9IH19XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNmb2xkZXJzQ3JlYXRlZD5cbiAgICAgICAge3sgJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5tZXNzYWdlQ3JlYXRlU3VjY2VzcycgfCBmZFRyYW5zbGF0ZSA6IHsgZm9sZGVyTmFtZTogcGF5bG9hZC5mb2xkZXIubmFtZSB9IH19XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZVVwZGF0ZVZlcnNpb24gbGV0LXBheWxvYWQ9XCJwYXlsb2FkXCIgbGV0LW1lc3NhZ2VTdHJpcFR5cGU9XCJtZXNzYWdlU3RyaXBUeXBlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lc3NhZ2VTdHJpcFR5cGUgPT09ICdlcnJvcic7IGVsc2UgdmVyc2lvblVwZGF0ZWRcIj5cbiAgICAgICAge3sgJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5tZXNzYWdlVXBkYXRlVmVyc2lvbkZhaWxlZCcgfCBmZFRyYW5zbGF0ZSA6IHsgZm9sZGVyTmFtZTogcGF5bG9hZC5pdGVtLm5hbWUgfSB9fVxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjdmVyc2lvblVwZGF0ZWQ+XG4gICAgICAgIHt7ICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubWVzc2FnZVVwZGF0ZVZlcnNpb25TdWNjZXNzJyB8IGZkVHJhbnNsYXRlIDogeyBmb2xkZXJOYW1lOiBwYXlsb2FkLml0ZW0ubmFtZSB9IH19XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZUZpbGVSZW5hbWUgbGV0LXBheWxvYWQ9XCJwYXlsb2FkXCIgbGV0LW1lc3NhZ2VTdHJpcFR5cGU9XCJtZXNzYWdlU3RyaXBUeXBlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lc3NhZ2VTdHJpcFR5cGUgPT09ICdlcnJvcic7IGVsc2UgZmlsZVJlbmFtZWRcIj5cbiAgICAgICAge3tcbiAgICAgICAgICAgICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubWVzc2FnZUZpbGVSZW5hbWVGYWlsZWQnXG4gICAgICAgICAgICAgICAgfCBmZFRyYW5zbGF0ZSA6IHsgZnJvbTogcGF5bG9hZC5pdGVtLm5hbWUsIHRvOiBwYXlsb2FkLmZpbGVOYW1lIH1cbiAgICAgICAgfX1cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2ZpbGVSZW5hbWVkPlxuICAgICAgICB7e1xuICAgICAgICAgICAgJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5tZXNzYWdlRmlsZVJlbmFtZVN1Y2Nlc3MnXG4gICAgICAgICAgICAgICAgfCBmZFRyYW5zbGF0ZSA6IHsgZnJvbTogcGF5bG9hZC5pdGVtLm5hbWUsIHRvOiBwYXlsb2FkLmZpbGVOYW1lIH1cbiAgICAgICAgfX1cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtZXNzYWdlUmVtb3ZlIGxldC1wYXlsb2FkPVwicGF5bG9hZFwiIGxldC1tZXNzYWdlU3RyaXBUeXBlPVwibWVzc2FnZVN0cmlwVHlwZVwiIGxldC1jb3VudD1cImNvdW50XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBheWxvYWQuaXRlbXMubGVuZ3RoID4gMSAmJiBjb3VudC5mb2xkZXIgJiYgY291bnQuZmlsZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZVN0cmlwVHlwZSA9PT0gJ2Vycm9yJzsgZWxzZSBmb2xkZXJzQW5kRmlsZXNSZW1vdmVkXCI+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubWVzc2FnZVJlbW92ZUZvbGRlcnNBbmRGaWxlc0ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgfCBmZFRyYW5zbGF0ZSA6IHsgZm9sZGVyc0NvdW50OiBjb3VudC5mb2xkZXIsIGZpbGVzQ291bnQ6IGNvdW50LmZpbGUgfVxuICAgICAgICAgICAgfX1cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZm9sZGVyc0FuZEZpbGVzUmVtb3ZlZD5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5tZXNzYWdlUmVtb3ZlRm9sZGVyc0FuZEZpbGVzU3VjY2VzcydcbiAgICAgICAgICAgICAgICAgICAgfCBmZFRyYW5zbGF0ZSA6IHsgZm9sZGVyc0NvdW50OiBjb3VudC5mb2xkZXIsIGZpbGVzQ291bnQ6IGNvdW50LmZpbGUgfVxuICAgICAgICAgICAgfX1cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXlsb2FkLml0ZW1zLmxlbmd0aCA+IDEgJiYgY291bnQuZm9sZGVyICYmICFjb3VudC5maWxlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlU3RyaXBUeXBlID09PSAnZXJyb3InOyBlbHNlIGZvbGRlcnNSZW1vdmVkXCI+XG4gICAgICAgICAgICB7eyAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLm1lc3NhZ2VSZW1vdmVGb2xkZXJzRmFpbGVkJyB8IGZkVHJhbnNsYXRlIDogeyBmb2xkZXJzQ291bnQ6IGNvdW50LmZvbGRlciB9IH19XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2ZvbGRlcnNSZW1vdmVkPlxuICAgICAgICAgICAge3sgJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5tZXNzYWdlUmVtb3ZlRm9sZGVyc1N1Y2Nlc3MnIHwgZmRUcmFuc2xhdGUgOiB7IGZvbGRlcnNDb3VudDogY291bnQuZm9sZGVyIH0gfX1cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXlsb2FkLml0ZW1zLmxlbmd0aCA+IDEgJiYgY291bnQuZmlsZSAmJiAhY291bnQuZm9sZGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlU3RyaXBUeXBlID09PSAnZXJyb3InOyBlbHNlIGZpbGVzUmVtb3ZlZFwiPlxuICAgICAgICAgICAge3sgJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5tZXNzYWdlUmVtb3ZlRmlsZXNGYWlsZWQnIHwgZmRUcmFuc2xhdGUgOiB7IGZpbGVzQ291bnQ6IGNvdW50LmZpbGUgfSB9fVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNmaWxlc1JlbW92ZWQ+XG4gICAgICAgICAgICB7eyAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLm1lc3NhZ2VSZW1vdmVGaWxlc1N1Y2Nlc3MnIHwgZmRUcmFuc2xhdGUgOiB7IGZpbGVzQ291bnQ6IGNvdW50LmZpbGUgfSB9fVxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBheWxvYWQuaXRlbXMubGVuZ3RoID09PSAxXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlU3RyaXBUeXBlID09PSAnZXJyb3InOyBlbHNlIG9uZUl0ZW1SZW1vdmVkXCI+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubWVzc2FnZVJlbW92ZUZpbGVPckZvbGRlckZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgfCBmZFRyYW5zbGF0ZSA6IHsgbmFtZTogcGF5bG9hZC5pdGVtc1swXS5uYW1lIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI29uZUl0ZW1SZW1vdmVkPlxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLm1lc3NhZ2VSZW1vdmVGaWxlT3JGb2xkZXJTdWNjZXNzJ1xuICAgICAgICAgICAgICAgICAgICB8IGZkVHJhbnNsYXRlIDogeyBuYW1lOiBwYXlsb2FkLml0ZW1zWzBdLm5hbWUgfVxuICAgICAgICAgICAgfX1cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZU1vdmUgbGV0LXBheWxvYWQ9XCJwYXlsb2FkXCIgbGV0LW1lc3NhZ2VTdHJpcFR5cGU9XCJtZXNzYWdlU3RyaXBUeXBlXCIgbGV0LWNvdW50PVwiY291bnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGF5bG9hZC5pdGVtcy5sZW5ndGggPiAxICYmIGNvdW50LmZvbGRlciAmJiBjb3VudC5maWxlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlU3RyaXBUeXBlID09PSAnZXJyb3InOyBlbHNlIGZpbGVzQW5kRm9sZGVyc01vdmVkVG9cIj5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgKHBheWxvYWQudG9cbiAgICAgICAgICAgICAgICAgICAgPyAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLm1lc3NhZ2VNb3ZlRm9sZGVyc0FuZEZpbGVzRmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICA6ICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubWVzc2FnZU1vdmVSb290Rm9sZGVyc0FuZEZpbGVzRmFpbGVkJ1xuICAgICAgICAgICAgICAgICkgfCBmZFRyYW5zbGF0ZSA6IHsgZm9sZGVyc0NvdW50OiBjb3VudC5mb2xkZXIsIGZpbGVzQ291bnQ6IGNvdW50LmZpbGUsIHRvOiBwYXlsb2FkLnRvPy5uYW1lIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2ZpbGVzQW5kRm9sZGVyc01vdmVkVG8+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgIChwYXlsb2FkLnRvXG4gICAgICAgICAgICAgICAgICAgID8gJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5tZXNzYWdlTW92ZUZvbGRlcnNBbmRGaWxlc1N1Y2Nlc3MnXG4gICAgICAgICAgICAgICAgICAgIDogJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5tZXNzYWdlTW92ZVJvb3RGb2xkZXJzQW5kRmlsZXNTdWNjZXNzJ1xuICAgICAgICAgICAgICAgICkgfCBmZFRyYW5zbGF0ZSA6IHsgZm9sZGVyc0NvdW50OiBjb3VudC5mb2xkZXIsIGZpbGVzQ291bnQ6IGNvdW50LmZpbGUsIHRvOiBwYXlsb2FkLnRvPy5uYW1lIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGF5bG9hZC5pdGVtcy5sZW5ndGggPiAxICYmIGNvdW50LmZvbGRlciAmJiAhY291bnQuZmlsZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZVN0cmlwVHlwZSA9PT0gJ2Vycm9yJzsgZWxzZSBmb2xkZXJzTW92ZWRUb1wiPlxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAocGF5bG9hZC50b1xuICAgICAgICAgICAgICAgICAgICA/ICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubWVzc2FnZU1vdmVGb2xkZXJzRmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICA6ICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubWVzc2FnZU1vdmVSb290Rm9sZGVyc0ZhaWxlZCdcbiAgICAgICAgICAgICAgICApIHwgZmRUcmFuc2xhdGUgOiB7IGZvbGRlcnNDb3VudDogY291bnQuZm9sZGVyLCB0bzogcGF5bG9hZC50bz8ubmFtZSB9XG4gICAgICAgICAgICB9fVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNmb2xkZXJzTW92ZWRUbz5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgKHBheWxvYWQudG9cbiAgICAgICAgICAgICAgICAgICAgPyAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLm1lc3NhZ2VNb3ZlRm9sZGVyc1N1Y2Nlc3MnXG4gICAgICAgICAgICAgICAgICAgIDogJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5tZXNzYWdlTW92ZVJvb3RGb2xkZXJzU3VjY2VzcydcbiAgICAgICAgICAgICAgICApIHwgZmRUcmFuc2xhdGUgOiB7IGZvbGRlcnNDb3VudDogY291bnQuZm9sZGVyLCB0bzogcGF5bG9hZC50bz8ubmFtZSB9XG4gICAgICAgICAgICB9fVxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBheWxvYWQuaXRlbXMubGVuZ3RoID4gMSAmJiBjb3VudC5maWxlICYmICFjb3VudC5mb2xkZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lc3NhZ2VTdHJpcFR5cGUgPT09ICdlcnJvcic7IGVsc2UgZmlsZXNNb3ZlZFRvXCI+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgIChwYXlsb2FkLnRvXG4gICAgICAgICAgICAgICAgICAgID8gJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5tZXNzYWdlTW92ZUZpbGVzRmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICA6ICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubWVzc2FnZU1vdmVSb290RmlsZXNGYWlsZWQnXG4gICAgICAgICAgICAgICAgKSB8IGZkVHJhbnNsYXRlIDogeyBmaWxlc0NvdW50OiBjb3VudC5maWxlLCB0bzogcGF5bG9hZC50bz8ubmFtZSB9XG4gICAgICAgICAgICB9fVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNmaWxlc01vdmVkVG8+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgIChwYXlsb2FkLnRvXG4gICAgICAgICAgICAgICAgICAgID8gJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5tZXNzYWdlTW92ZUZpbGVzU3VjY2VzcydcbiAgICAgICAgICAgICAgICAgICAgOiAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLm1lc3NhZ2VNb3ZlUm9vdEZpbGVzU3VjY2VzcydcbiAgICAgICAgICAgICAgICApIHwgZmRUcmFuc2xhdGUgOiB7IGZpbGVzQ291bnQ6IGNvdW50LmZpbGUsIHRvOiBwYXlsb2FkLnRvPy5uYW1lIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGF5bG9hZC5pdGVtcy5sZW5ndGggPT09IDFcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lc3NhZ2VTdHJpcFR5cGUgPT09ICdlcnJvcic7IGVsc2Ugb25lSXRlbU1vdmVkVG9cIj5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgKHBheWxvYWQudG9cbiAgICAgICAgICAgICAgICAgICAgPyAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLm1lc3NhZ2VNb3ZlRmlsZU9yRm9sZGVyRmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICA6ICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubWVzc2FnZU1vdmVSb290RmlsZU9yRm9sZGVyRmFpbGVkJ1xuICAgICAgICAgICAgICAgICkgfCBmZFRyYW5zbGF0ZSA6IHsgbmFtZTogcGF5bG9hZC5pdGVtc1swXS5uYW1lLCB0bzogcGF5bG9hZC50bz8ubmFtZSB9XG4gICAgICAgICAgICB9fVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNvbmVJdGVtTW92ZWRUbz5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgKHBheWxvYWQudG9cbiAgICAgICAgICAgICAgICAgICAgPyAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLm1lc3NhZ2VNb3ZlRmlsZU9yRm9sZGVyU3VjY2VzcydcbiAgICAgICAgICAgICAgICAgICAgOiAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLm1lc3NhZ2VNb3ZlUm9vdEZpbGVPckZvbGRlclN1Y2Nlc3MnXG4gICAgICAgICAgICAgICAgKSB8IGZkVHJhbnNsYXRlIDogeyBuYW1lOiBwYXlsb2FkLml0ZW1zWzBdLm5hbWUsIHRvOiBwYXlsb2FkLnRvPy5uYW1lIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21lc3NhZ2VUeXBlTWlzbWF0Y2ggbGV0LXBheWxvYWQ9XCJwYXlsb2FkXCIgbGV0LW1lc3NhZ2VTdHJpcFR5cGU9XCJtZXNzYWdlU3RyaXBUeXBlXCIgbGV0LWNvdW50PVwiY291bnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGF5bG9hZC5pdGVtcy5sZW5ndGggPiAxXCI+XG4gICAgICAgIHt7XG4gICAgICAgICAgICAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLm1lc3NhZ2VGaWxlVHlwZU1pc21hdGNoUGx1cmFsJ1xuICAgICAgICAgICAgICAgIHwgZmRUcmFuc2xhdGUgOiB7IGZpbGVzQ291bnQ6IHBheWxvYWQuaXRlbXMubGVuZ3RoLCBhbGxvd2VkVHlwZXM6IF9nZXRBbGxvd2VkVHlwZXMoKSB9XG4gICAgICAgIH19XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGF5bG9hZC5pdGVtcy5sZW5ndGggPT09IDFcIj5cbiAgICAgICAge3tcbiAgICAgICAgICAgICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubWVzc2FnZUZpbGVUeXBlTWlzbWF0Y2hTaW5ndWxhcidcbiAgICAgICAgICAgICAgICB8IGZkVHJhbnNsYXRlIDogeyBmaWxlTmFtZTogcGF5bG9hZC5pdGVtc1swXS5uYW1lLCBhbGxvd2VkVHlwZXM6IF9nZXRBbGxvd2VkVHlwZXMoKSB9XG4gICAgICAgIH19XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21lc3NhZ2VGaWxlU2l6ZSBsZXQtcGF5bG9hZD1cInBheWxvYWRcIiBsZXQtbWVzc2FnZVN0cmlwVHlwZT1cIm1lc3NhZ2VTdHJpcFR5cGVcIiBsZXQtY291bnQ9XCJjb3VudFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXlsb2FkLml0ZW1zLmxlbmd0aCA+IDFcIj5cbiAgICAgICAge3tcbiAgICAgICAgICAgICdwbGF0Zm9ybVVwbG9hZENvbGxlY3Rpb24ubWVzc2FnZUZpbGVTaXplRXhjZWVkZWRQbHVyYWwnXG4gICAgICAgICAgICAgICAgfCBmZFRyYW5zbGF0ZSA6IHsgZmlsZXNDb3VudDogcGF5bG9hZC5pdGVtcy5sZW5ndGgsIG1heEZpbGVTaXplOiBtYXhGaWxlU2l6ZSB8fCAwIH1cbiAgICAgICAgfX1cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXlsb2FkLml0ZW1zLmxlbmd0aCA9PT0gMVwiPlxuICAgICAgICB7e1xuICAgICAgICAgICAgJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5tZXNzYWdlRmlsZVNpemVFeGNlZWRlZFNpbmd1bGFyJ1xuICAgICAgICAgICAgICAgIHwgZmRUcmFuc2xhdGUgOiB7IGZpbGVOYW1lOiBwYXlsb2FkLml0ZW1zWzBdLm5hbWUsIG1heEZpbGVTaXplOiBtYXhGaWxlU2l6ZSB8fCAwIH1cbiAgICAgICAgfX1cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZUZpbGVuYW1lTGVuZ3RoIGxldC1wYXlsb2FkPVwicGF5bG9hZFwiIGxldC1tZXNzYWdlU3RyaXBUeXBlPVwibWVzc2FnZVN0cmlwVHlwZVwiIGxldC1jb3VudD1cImNvdW50XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBheWxvYWQuaXRlbXMubGVuZ3RoID4gMVwiPlxuICAgICAgICB7e1xuICAgICAgICAgICAgJ3BsYXRmb3JtVXBsb2FkQ29sbGVjdGlvbi5tZXNzYWdlRmlsZU5hbWVMZW5ndGhFeGNlZWRlZFBsdXJhbCdcbiAgICAgICAgICAgICAgICB8IGZkVHJhbnNsYXRlIDogeyBmaWxlc0NvdW50OiBwYXlsb2FkLml0ZW1zLmxlbmd0aCwgbWF4RmlsZW5hbWVMZW5ndGg6IG1heEZpbGVuYW1lTGVuZ3RoIHx8IDAgfVxuICAgICAgICB9fVxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBheWxvYWQuaXRlbXMubGVuZ3RoID09PSAxXCI+XG4gICAgICAgIHt7XG4gICAgICAgICAgICAncGxhdGZvcm1VcGxvYWRDb2xsZWN0aW9uLm1lc3NhZ2VGaWxlTmFtZUxlbmd0aEV4Y2VlZGVkU2luZ3VsYXInXG4gICAgICAgICAgICAgICAgfCBmZFRyYW5zbGF0ZSA6IHsgZmlsZU5hbWU6IHBheWxvYWQuaXRlbXNbMF0ubmFtZSwgbWF4RmlsZW5hbWVMZW5ndGg6IG1heEZpbGVuYW1lTGVuZ3RoIHx8IDAgfVxuICAgICAgICB9fVxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==