@yuuvis/client-framework 2.0.0-beta.0 → 2.0.0-beta.3

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 (389) hide show
  1. package/actions/lib/actions/delete-action/delete/delete.component.d.ts +3 -3
  2. package/actions/lib/actions/delete-action/delete-action.d.ts +1 -1
  3. package/actions/lib/actions.service.d.ts +7 -3
  4. package/actions/lib/components/contextmenu/contextmenu.component.d.ts +3 -1
  5. package/autocomplete/README.md +3 -0
  6. package/autocomplete/index.d.ts +3 -0
  7. package/autocomplete/lib/autocomplete.component.d.ts +72 -0
  8. package/autocomplete/lib/autocomplete.interface.d.ts +4 -0
  9. package/autocomplete/lib/autocomplete.module.d.ts +7 -0
  10. package/common/index.d.ts +4 -4
  11. package/common/lib/common.module.d.ts +19 -0
  12. package/common/lib/common.utils.d.ts +2 -0
  13. package/common/lib/components/confirm/confirm.component.d.ts +7 -0
  14. package/common/lib/components/confirm/confirm.interface.d.ts +7 -0
  15. package/common/lib/components/confirm/confirm.service.d.ts +9 -0
  16. package/common/lib/components/dialog/dialog.component.d.ts +6 -0
  17. package/common/lib/components/dialog/dialog.options.d.ts +7 -0
  18. package/common/lib/components/index.d.ts +5 -0
  19. package/common/lib/directives/autofocus-child.directive.d.ts +13 -0
  20. package/common/lib/directives/autofocus-delayed.directive.d.ts +18 -0
  21. package/common/lib/directives/drag-scroll.directive.d.ts +20 -0
  22. package/common/lib/directives/index.d.ts +8 -4
  23. package/common/lib/directives/noop-value-accessor.directive.d.ts +2 -2
  24. package/common/lib/mat-form-field.abstract.d.ts +41 -0
  25. package/common/lib/services/index.d.ts +1 -1
  26. package/common/lib/services/layout-settings/layout-settings.service.d.ts +18 -0
  27. package/datepicker/README.md +3 -0
  28. package/datepicker/index.d.ts +5 -0
  29. package/datepicker/lib/calendar/calendar.component.d.ts +72 -0
  30. package/datepicker/lib/date-input/date-input-element/date-input-element.component.d.ts +43 -0
  31. package/datepicker/lib/date-input/date-input-hour-element/date-input-hour-element.component.d.ts +11 -0
  32. package/datepicker/lib/date-input/date-input.component.d.ts +61 -0
  33. package/datepicker/lib/datepicker-calendar/datepicker-calendar-trigger.component.d.ts +7 -0
  34. package/datepicker/lib/datepicker-calendar/datepicker-calendar.component.d.ts +12 -0
  35. package/datepicker/lib/datepicker.component.d.ts +80 -0
  36. package/datepicker/lib/datepicker.interface.d.ts +34 -0
  37. package/datepicker/lib/datepicker.module.d.ts +9 -0
  38. package/datepicker/lib/datepicker.service.d.ts +46 -0
  39. package/datepicker/lib/datepicker.utils.d.ts +23 -0
  40. package/datepicker/lib/time-input/time-input.component.d.ts +36 -0
  41. package/datepicker/lib/time-input/time-input.interface.d.ts +6 -0
  42. package/fesm2022/yuuvis-client-framework-actions.mjs +147 -105
  43. package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -1
  44. package/fesm2022/yuuvis-client-framework-app-bar.mjs +7 -8
  45. package/fesm2022/yuuvis-client-framework-app-bar.mjs.map +1 -1
  46. package/fesm2022/yuuvis-client-framework-autocomplete.mjs +210 -0
  47. package/fesm2022/yuuvis-client-framework-autocomplete.mjs.map +1 -0
  48. package/fesm2022/yuuvis-client-framework-clipboard.mjs +9 -9
  49. package/fesm2022/yuuvis-client-framework-clipboard.mjs.map +1 -1
  50. package/fesm2022/yuuvis-client-framework-common.mjs +853 -780
  51. package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -1
  52. package/fesm2022/yuuvis-client-framework-datepicker.mjs +1688 -0
  53. package/fesm2022/yuuvis-client-framework-datepicker.mjs.map +1 -0
  54. package/fesm2022/yuuvis-client-framework-forms.mjs +945 -1157
  55. package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
  56. package/fesm2022/yuuvis-client-framework-icons.mjs +85 -12
  57. package/fesm2022/yuuvis-client-framework-icons.mjs.map +1 -1
  58. package/fesm2022/yuuvis-client-framework-list.mjs +81 -45
  59. package/fesm2022/yuuvis-client-framework-list.mjs.map +1 -1
  60. package/fesm2022/yuuvis-client-framework-master-details.mjs +112 -0
  61. package/fesm2022/yuuvis-client-framework-master-details.mjs.map +1 -0
  62. package/fesm2022/yuuvis-client-framework-metadata-form-defaults.mjs +60 -0
  63. package/fesm2022/yuuvis-client-framework-metadata-form-defaults.mjs.map +1 -0
  64. package/fesm2022/yuuvis-client-framework-metadata-form.mjs +125 -100
  65. package/fesm2022/yuuvis-client-framework-metadata-form.mjs.map +1 -1
  66. package/fesm2022/yuuvis-client-framework-object-details.mjs +49 -59
  67. package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -1
  68. package/fesm2022/yuuvis-client-framework-object-flavor.mjs +188 -77
  69. package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -1
  70. package/fesm2022/yuuvis-client-framework-object-form.mjs +99 -184
  71. package/fesm2022/yuuvis-client-framework-object-form.mjs.map +1 -1
  72. package/fesm2022/yuuvis-client-framework-object-preview.mjs +11 -11
  73. package/fesm2022/yuuvis-client-framework-object-preview.mjs.map +1 -1
  74. package/fesm2022/yuuvis-client-framework-object-summary.mjs +46 -42
  75. package/fesm2022/yuuvis-client-framework-object-summary.mjs.map +1 -1
  76. package/fesm2022/yuuvis-client-framework-overflow-menu.mjs +126 -0
  77. package/fesm2022/yuuvis-client-framework-overflow-menu.mjs.map +1 -0
  78. package/fesm2022/yuuvis-client-framework-pagination.mjs +7 -9
  79. package/fesm2022/yuuvis-client-framework-pagination.mjs.map +1 -1
  80. package/fesm2022/yuuvis-client-framework-panel.mjs +8 -7
  81. package/fesm2022/yuuvis-client-framework-panel.mjs.map +1 -1
  82. package/fesm2022/yuuvis-client-framework-popout.mjs +212 -0
  83. package/fesm2022/yuuvis-client-framework-popout.mjs.map +1 -0
  84. package/fesm2022/yuuvis-client-framework-renderer.mjs +99 -72
  85. package/fesm2022/yuuvis-client-framework-renderer.mjs.map +1 -1
  86. package/fesm2022/yuuvis-client-framework-sequence-list.mjs +29 -112
  87. package/fesm2022/yuuvis-client-framework-sequence-list.mjs.map +1 -1
  88. package/fesm2022/yuuvis-client-framework-simple-search.mjs +40 -21
  89. package/fesm2022/yuuvis-client-framework-simple-search.mjs.map +1 -1
  90. package/fesm2022/yuuvis-client-framework-split-view.mjs +188 -0
  91. package/fesm2022/yuuvis-client-framework-split-view.mjs.map +1 -0
  92. package/fesm2022/yuuvis-client-framework-tile-list.mjs +100 -93
  93. package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
  94. package/fesm2022/yuuvis-client-framework-tree.mjs +15 -15
  95. package/fesm2022/yuuvis-client-framework-tree.mjs.map +1 -1
  96. package/fesm2022/yuuvis-client-framework-upload-progress.mjs +16 -21
  97. package/fesm2022/yuuvis-client-framework-upload-progress.mjs.map +1 -1
  98. package/fesm2022/yuuvis-client-framework.mjs +4 -4
  99. package/fesm2022/yuuvis-client-framework.mjs.map +1 -1
  100. package/forms/index.d.ts +7 -1
  101. package/forms/lib/elements/catalog/catalog.component.d.ts +17 -56
  102. package/forms/lib/elements/data-grid/edit-table-data/edit-data.component.d.ts +5 -4
  103. package/forms/lib/elements/datetime/datetime.component.d.ts +19 -10
  104. package/forms/lib/elements/datetime-range/datetime-range.component.d.ts +12 -27
  105. package/forms/lib/elements/index.d.ts +0 -1
  106. package/forms/lib/elements/number/number.component.d.ts +21 -30
  107. package/forms/lib/elements/number-range/number-range.component.d.ts +12 -7
  108. package/forms/lib/elements/organization/organization.component.d.ts +23 -51
  109. package/forms/lib/elements/range-select-date/range-select-date.component.d.ts +12 -7
  110. package/forms/lib/elements/range-select-filesize/range-select-filesize.component.d.ts +12 -7
  111. package/forms/lib/elements/string/string.component.d.ts +15 -20
  112. package/forms/lib/forms.module.d.ts +8 -11
  113. package/icons/index.d.ts +1 -0
  114. package/icons/lib/icon.component.d.ts +20 -0
  115. package/lib/assets/i18n/de.json +7 -23
  116. package/lib/assets/i18n/en.json +10 -26
  117. package/list/index.d.ts +1 -0
  118. package/list/lib/list-item.directive.d.ts +5 -4
  119. package/list/lib/list.component.d.ts +6 -3
  120. package/list/lib/list.module.d.ts +8 -0
  121. package/master-details/README.md +3 -0
  122. package/master-details/index.d.ts +2 -0
  123. package/master-details/lib/master-details.component.d.ts +58 -0
  124. package/master-details/lib/master-details.interface.d.ts +7 -0
  125. package/master-details/lib/master-details.module.d.ts +7 -0
  126. package/metadata-form/index.d.ts +4 -1
  127. package/metadata-form/lib/metadata-form-field/metadata-form-field.component.d.ts +4 -17
  128. package/metadata-form/lib/metadata-form-field/metadata-form-field.interface.d.ts +11 -0
  129. package/metadata-form/lib/object-metadata-element-error.directive.d.ts +13 -0
  130. package/metadata-form/lib/object-metadata-element-label.directive.d.ts +10 -0
  131. package/metadata-form/lib/object-metadata-element-template.directive.d.ts +3 -3
  132. package/metadata-form-defaults/README.md +3 -0
  133. package/metadata-form-defaults/index.d.ts +2 -0
  134. package/metadata-form-defaults/lib/metadata-form-defaults.module.d.ts +7 -0
  135. package/object-details/lib/object-audit/object-audit.component.d.ts +3 -9
  136. package/object-details/lib/object-details.component.d.ts +0 -2
  137. package/object-details/lib/object-metadata/object-metadata.component.d.ts +4 -3
  138. package/object-details/lib/retention-badge/retention-badge.component.d.ts +0 -3
  139. package/object-flavor/index.d.ts +1 -0
  140. package/object-flavor/lib/abstract-apply-create-flavor/abstract-apply-create-flavor.component.d.ts +1 -2
  141. package/object-flavor/lib/abstract-apply-object-flavor/abstract-apply-object-flavor.component.d.ts +3 -2
  142. package/object-flavor/lib/default-apply-flavor/default-apply-flavor.component.d.ts +19 -0
  143. package/object-flavor/lib/flavor-chip/flavor-chip.component.d.ts +1 -1
  144. package/object-flavor/lib/object-flavor/object-flavor.component.d.ts +3 -6
  145. package/object-flavor/lib/object-flavor-picker/object-flavor-picker.component.d.ts +0 -1
  146. package/object-form/index.d.ts +1 -1
  147. package/object-form/lib/object-form-element/object-form-element.component.d.ts +2 -2
  148. package/object-form/lib/object-form-group/object-form-group.component.d.ts +1 -3
  149. package/object-form/lib/object-form.component.d.ts +2 -2
  150. package/object-form/lib/object-form.interface.d.ts +0 -44
  151. package/object-form/lib/object-form.module.d.ts +7 -0
  152. package/object-form/lib/object-form.service.d.ts +1 -2
  153. package/object-form/lib/object-form.utils.d.ts +1 -1
  154. package/object-summary/lib/object-summary/object-summary.component.d.ts +13 -15
  155. package/overflow-menu/README.md +3 -0
  156. package/overflow-menu/index.d.ts +3 -0
  157. package/overflow-menu/lib/overflow-menu.component.d.ts +31 -0
  158. package/overflow-menu/lib/overflow-menu.interface.d.ts +9 -0
  159. package/overflow-menu/lib/overflow-menu.module.d.ts +7 -0
  160. package/package.json +43 -69
  161. package/popout/README.md +3 -0
  162. package/popout/index.d.ts +3 -0
  163. package/popout/lib/popout.component.d.ts +58 -0
  164. package/popout/lib/popout.interface.d.ts +17 -0
  165. package/popout/lib/popout.module.d.ts +7 -0
  166. package/renderer/lib/property-renderer/abstract.renderer.d.ts +4 -4
  167. package/renderer/lib/property-renderer/icon.renderer.component.d.ts +2 -0
  168. package/renderer/lib/renderer.directive.d.ts +4 -3
  169. package/sequence-list/index.d.ts +0 -1
  170. package/sequence-list/lib/sequence-list.component.d.ts +0 -4
  171. package/simple-search/index.d.ts +0 -1
  172. package/simple-search/lib/simple-search/simple-search.component.d.ts +6 -10
  173. package/split-view/README.md +3 -0
  174. package/split-view/index.d.ts +4 -0
  175. package/split-view/lib/split-area.directive.d.ts +16 -0
  176. package/split-view/lib/split-view.component.d.ts +76 -0
  177. package/split-view/lib/split-view.interface.d.ts +10 -0
  178. package/split-view/lib/split-view.module.d.ts +8 -0
  179. package/styles/client-framework.scss +21 -67
  180. package/tile-list/lib/tile/tile.component.d.ts +1 -2
  181. package/tile-list/lib/tile-config/property-select/property-select.component.d.ts +0 -1
  182. package/tile-list/lib/tile-config/tile-config-trigger/tile-config-trigger.component.d.ts +1 -2
  183. package/tile-list/lib/tile-config/tile-config.component.d.ts +0 -3
  184. package/tile-list/lib/tile-list/tile-list.component.d.ts +5 -5
  185. package/upload-progress/lib/upload-progress/upload-progress-overlay/upload-progress-overlay.component.d.ts +0 -5
  186. package/upload-progress/lib/upload-progress/upload-progress.component.d.ts +0 -4
  187. package/common/lib/components/focus-indicator/focus-indicator.component.d.ts +0 -7
  188. package/common/lib/components/token-input/token-input.component.d.ts +0 -55
  189. package/common/lib/components/token-input/token-input.interface.d.ts +0 -8
  190. package/common/lib/services/error-messages/error-messages.service.d.ts +0 -7
  191. package/esm2022/actions/index.mjs +0 -7
  192. package/esm2022/actions/lib/actions/copy-action/copy-action.mjs +0 -31
  193. package/esm2022/actions/lib/actions/cut-action/cut-action.mjs +0 -30
  194. package/esm2022/actions/lib/actions/delete-action/delete/delete.component.mjs +0 -67
  195. package/esm2022/actions/lib/actions/delete-action/delete-action.mjs +0 -38
  196. package/esm2022/actions/lib/actions/download-action/download-action.mjs +0 -33
  197. package/esm2022/actions/lib/actions.icon.mjs +0 -8
  198. package/esm2022/actions/lib/actions.interface.mjs +0 -19
  199. package/esm2022/actions/lib/actions.module.mjs +0 -16
  200. package/esm2022/actions/lib/actions.service.mjs +0 -89
  201. package/esm2022/actions/lib/components/contextmenu/contextmenu.component.mjs +0 -27
  202. package/esm2022/actions/yuuvis-client-framework-actions.mjs +0 -5
  203. package/esm2022/app-bar/index.mjs +0 -2
  204. package/esm2022/app-bar/lib/app-bar.component.mjs +0 -89
  205. package/esm2022/app-bar/yuuvis-client-framework-app-bar.mjs +0 -5
  206. package/esm2022/clipboard/index.mjs +0 -2
  207. package/esm2022/clipboard/lib/clipboard.component.mjs +0 -48
  208. package/esm2022/clipboard/yuuvis-client-framework-clipboard.mjs +0 -5
  209. package/esm2022/common/index.mjs +0 -7
  210. package/esm2022/common/lib/components/focus-indicator/focus-indicator.component.mjs +0 -41
  211. package/esm2022/common/lib/components/token-input/token-input.component.mjs +0 -324
  212. package/esm2022/common/lib/components/token-input/token-input.interface.mjs +0 -2
  213. package/esm2022/common/lib/directives/busy-overlay.directive.mjs +0 -88
  214. package/esm2022/common/lib/directives/click-double.directive.mjs +0 -61
  215. package/esm2022/common/lib/directives/container-size.directive.mjs +0 -56
  216. package/esm2022/common/lib/directives/drag-select.directive.mjs +0 -114
  217. package/esm2022/common/lib/directives/file-drop-zone/file-drop-zone.directive.mjs +0 -153
  218. package/esm2022/common/lib/directives/file-drop-zone/file-drop-zone.interface.mjs +0 -2
  219. package/esm2022/common/lib/directives/focus-within.directive.mjs +0 -81
  220. package/esm2022/common/lib/directives/index.mjs +0 -9
  221. package/esm2022/common/lib/directives/light-dismiss.directive.mjs +0 -44
  222. package/esm2022/common/lib/directives/longpress.directive.mjs +0 -36
  223. package/esm2022/common/lib/directives/noop-value-accessor.directive.mjs +0 -42
  224. package/esm2022/common/lib/services/error-messages/error-messages.service.mjs +0 -68
  225. package/esm2022/common/lib/services/index.mjs +0 -2
  226. package/esm2022/common/yuuvis-client-framework-common.mjs +0 -5
  227. package/esm2022/forms/index.mjs +0 -24
  228. package/esm2022/forms/lib/elements/catalog/catalog.component.mjs +0 -118
  229. package/esm2022/forms/lib/elements/data-grid/data-grid/data-grid.component.mjs +0 -172
  230. package/esm2022/forms/lib/elements/data-grid/edit-table-data/edit-data.component.mjs +0 -95
  231. package/esm2022/forms/lib/elements/data-grid/model/data-grid.interface.mjs +0 -9
  232. package/esm2022/forms/lib/elements/datetime/datetime.component.mjs +0 -82
  233. package/esm2022/forms/lib/elements/datetime-range/datetime-range.component.mjs +0 -166
  234. package/esm2022/forms/lib/elements/index.mjs +0 -11
  235. package/esm2022/forms/lib/elements/number/number.component.mjs +0 -195
  236. package/esm2022/forms/lib/elements/number-range/number-range.component.mjs +0 -176
  237. package/esm2022/forms/lib/elements/organization/organization.component.mjs +0 -286
  238. package/esm2022/forms/lib/elements/range-select-date/date-range-picker/date-range-picker.component.mjs +0 -38
  239. package/esm2022/forms/lib/elements/range-select-date/range-select-date.component.mjs +0 -181
  240. package/esm2022/forms/lib/elements/range-select-date/range-select-date.interface.mjs +0 -2
  241. package/esm2022/forms/lib/elements/range-select-filesize/range-select-filesize.component.mjs +0 -98
  242. package/esm2022/forms/lib/elements/range-select-filesize/range-select-filesize.interface.mjs +0 -2
  243. package/esm2022/forms/lib/elements/string/string.component.mjs +0 -261
  244. package/esm2022/forms/lib/form-input/form-input.component.mjs +0 -88
  245. package/esm2022/forms/lib/forms.module.mjs +0 -58
  246. package/esm2022/forms/yuuvis-client-framework-forms.mjs +0 -5
  247. package/esm2022/icons/index.mjs +0 -4
  248. package/esm2022/icons/lib/icon.service.mjs +0 -59
  249. package/esm2022/icons/lib/icons.mjs +0 -32
  250. package/esm2022/icons/lib/object-type-icon/object-type-icon.component.mjs +0 -29
  251. package/esm2022/icons/yuuvis-client-framework-icons.mjs +0 -5
  252. package/esm2022/index.mjs +0 -2
  253. package/esm2022/lib/yuuvis-client-framework.module.mjs +0 -15
  254. package/esm2022/list/index.mjs +0 -3
  255. package/esm2022/list/lib/list-item.directive.mjs +0 -72
  256. package/esm2022/list/lib/list.component.mjs +0 -135
  257. package/esm2022/list/yuuvis-client-framework-list.mjs +0 -5
  258. package/esm2022/metadata-form/index.mjs +0 -4
  259. package/esm2022/metadata-form/lib/metadata-default-templates/metadata-default-templates.component.mjs +0 -32
  260. package/esm2022/metadata-form/lib/metadata-form-element-registry.service.mjs +0 -99
  261. package/esm2022/metadata-form/lib/metadata-form-field/metadata-form-field.component.mjs +0 -83
  262. package/esm2022/metadata-form/lib/object-metadata-element-template.directive.mjs +0 -52
  263. package/esm2022/metadata-form/yuuvis-client-framework-metadata-form.mjs +0 -5
  264. package/esm2022/object-details/index.mjs +0 -8
  265. package/esm2022/object-details/lib/object-audit/object-audit.component.mjs +0 -195
  266. package/esm2022/object-details/lib/object-details-shell/object-details-shell.component.mjs +0 -127
  267. package/esm2022/object-details/lib/object-details.component.mjs +0 -61
  268. package/esm2022/object-details/lib/object-metadata/form-section-group.pipe.mjs +0 -17
  269. package/esm2022/object-details/lib/object-metadata/object-metadata.component.mjs +0 -202
  270. package/esm2022/object-details/lib/object-metadata/object-metadata.interface.mjs +0 -2
  271. package/esm2022/object-details/lib/retention-badge/retention-badge.component.mjs +0 -27
  272. package/esm2022/object-details/yuuvis-client-framework-object-details.mjs +0 -5
  273. package/esm2022/object-flavor/index.mjs +0 -6
  274. package/esm2022/object-flavor/lib/abstract-apply-create-flavor/abstract-apply-create-flavor.component.mjs +0 -25
  275. package/esm2022/object-flavor/lib/abstract-apply-object-flavor/abstract-apply-object-flavor.component.mjs +0 -21
  276. package/esm2022/object-flavor/lib/flavor-chip/flavor-chip.component.mjs +0 -35
  277. package/esm2022/object-flavor/lib/object-flavor/object-flavor.component.mjs +0 -93
  278. package/esm2022/object-flavor/lib/object-flavor-picker/object-flavor-picker.component.mjs +0 -43
  279. package/esm2022/object-flavor/yuuvis-client-framework-object-flavor.mjs +0 -5
  280. package/esm2022/object-form/index.mjs +0 -5
  281. package/esm2022/object-form/lib/form-scripting.api.interface.mjs +0 -2
  282. package/esm2022/object-form/lib/form-scripting.service.mjs +0 -160
  283. package/esm2022/object-form/lib/object-form-element/object-form-element.component.mjs +0 -87
  284. package/esm2022/object-form/lib/object-form-extension.interface.mjs +0 -36
  285. package/esm2022/object-form/lib/object-form-group/object-form-group.component.mjs +0 -85
  286. package/esm2022/object-form/lib/object-form-script/form-scripting-element-extension/form-scripting-element-extension.component.mjs +0 -23
  287. package/esm2022/object-form/lib/object-form-script/object-form-script.service.mjs +0 -115
  288. package/esm2022/object-form/lib/object-form-script/object-form-scripting-scope.mjs +0 -251
  289. package/esm2022/object-form/lib/object-form-translate.service.mjs +0 -73
  290. package/esm2022/object-form/lib/object-form.component.mjs +0 -628
  291. package/esm2022/object-form/lib/object-form.interface.mjs +0 -9
  292. package/esm2022/object-form/lib/object-form.model.mjs +0 -20
  293. package/esm2022/object-form/lib/object-form.service.mjs +0 -130
  294. package/esm2022/object-form/lib/object-form.utils.mjs +0 -55
  295. package/esm2022/object-form/lib/object-form.validation.mjs +0 -48
  296. package/esm2022/object-form/yuuvis-client-framework-object-form.mjs +0 -5
  297. package/esm2022/object-preview/index.mjs +0 -3
  298. package/esm2022/object-preview/lib/components/index.mjs +0 -3
  299. package/esm2022/object-preview/lib/components/object-email-preview/object-email-preview.component.mjs +0 -45
  300. package/esm2022/object-preview/lib/components/object-preview/object-preview.component.mjs +0 -78
  301. package/esm2022/object-preview/lib/services/object-preview.service.mjs +0 -119
  302. package/esm2022/object-preview/yuuvis-client-framework-object-preview.mjs +0 -5
  303. package/esm2022/object-summary/index.mjs +0 -5
  304. package/esm2022/object-summary/lib/multi-object-summary/multi-object-summary.component.mjs +0 -33
  305. package/esm2022/object-summary/lib/object-summary/object-summary.component.mjs +0 -275
  306. package/esm2022/object-summary/lib/object-summary-data/object-summary-data.component.mjs +0 -80
  307. package/esm2022/object-summary/lib/object-summary.module.mjs +0 -15
  308. package/esm2022/object-summary/yuuvis-client-framework-object-summary.mjs +0 -5
  309. package/esm2022/pagination/index.mjs +0 -3
  310. package/esm2022/pagination/lib/pagination.component.mjs +0 -46
  311. package/esm2022/pagination/lib/pagination.interface.mjs +0 -2
  312. package/esm2022/pagination/yuuvis-client-framework-pagination.mjs +0 -5
  313. package/esm2022/panel/index.mjs +0 -2
  314. package/esm2022/panel/lib/panel.component.mjs +0 -20
  315. package/esm2022/panel/yuuvis-client-framework-panel.mjs +0 -5
  316. package/esm2022/renderer/index.mjs +0 -11
  317. package/esm2022/renderer/lib/property-renderer/abstract.renderer.mjs +0 -29
  318. package/esm2022/renderer/lib/property-renderer/datetime.renderer.mjs +0 -13
  319. package/esm2022/renderer/lib/property-renderer/decimal.renderer.component.mjs +0 -12
  320. package/esm2022/renderer/lib/property-renderer/filesize.renderer.component.mjs +0 -28
  321. package/esm2022/renderer/lib/property-renderer/icon.renderer.component.mjs +0 -23
  322. package/esm2022/renderer/lib/property-renderer/integer.renderer.component.mjs +0 -12
  323. package/esm2022/renderer/lib/property-renderer/organization.renderer.mjs +0 -19
  324. package/esm2022/renderer/lib/property-renderer/string.renderer.component.mjs +0 -12
  325. package/esm2022/renderer/lib/property-renderer/unknown.renderer.mjs +0 -12
  326. package/esm2022/renderer/lib/renderer.directive.mjs +0 -51
  327. package/esm2022/renderer/lib/services/renderer/renderer.interface.mjs +0 -2
  328. package/esm2022/renderer/lib/services/renderer/renderer.service.mjs +0 -84
  329. package/esm2022/renderer/yuuvis-client-framework-renderer.mjs +0 -5
  330. package/esm2022/sequence-list/index.mjs +0 -4
  331. package/esm2022/sequence-list/lib/due-date-picker/due-date-picker.component.mjs +0 -99
  332. package/esm2022/sequence-list/lib/sequence-list.component.mjs +0 -141
  333. package/esm2022/sequence-list/lib/sequence-list.interface.mjs +0 -2
  334. package/esm2022/sequence-list/yuuvis-client-framework-sequence-list.mjs +0 -5
  335. package/esm2022/simple-search/index.mjs +0 -3
  336. package/esm2022/simple-search/lib/simple-search/simple-search.component.mjs +0 -111
  337. package/esm2022/simple-search/lib/simple-search/simple-search.interface.mjs +0 -2
  338. package/esm2022/simple-search/yuuvis-client-framework-simple-search.mjs +0 -5
  339. package/esm2022/tile-list/index.mjs +0 -11
  340. package/esm2022/tile-list/lib/tile/tile.component.mjs +0 -53
  341. package/esm2022/tile-list/lib/tile-config/action-select/action-select.component.mjs +0 -25
  342. package/esm2022/tile-list/lib/tile-config/icon-select/icon-select.component.mjs +0 -33
  343. package/esm2022/tile-list/lib/tile-config/property-select/property-select.component.mjs +0 -91
  344. package/esm2022/tile-list/lib/tile-config/tile-config-tile/tile-config-tile.component.mjs +0 -66
  345. package/esm2022/tile-list/lib/tile-config/tile-config-trigger/tile-config-trigger.component.mjs +0 -46
  346. package/esm2022/tile-list/lib/tile-config/tile-config.component.mjs +0 -156
  347. package/esm2022/tile-list/lib/tile-extension/directive/tile-extension.directive.mjs +0 -37
  348. package/esm2022/tile-list/lib/tile-extension/extensions/email.extension.mjs +0 -42
  349. package/esm2022/tile-list/lib/tile-extension/tile-extension.service.mjs +0 -35
  350. package/esm2022/tile-list/lib/tile-list/tile-list.component.mjs +0 -510
  351. package/esm2022/tile-list/lib/tile-list/tile-list.interface.mjs +0 -2
  352. package/esm2022/tile-list/yuuvis-client-framework-tile-list.mjs +0 -5
  353. package/esm2022/token-search/index.mjs +0 -3
  354. package/esm2022/token-search/token-search.component.mjs +0 -78
  355. package/esm2022/token-search/token-search.interface.mjs +0 -2
  356. package/esm2022/token-search/yuuvis-client-framework-token-search.mjs +0 -5
  357. package/esm2022/tree/index.mjs +0 -3
  358. package/esm2022/tree/lib/tree-node/tree-node.component.mjs +0 -65
  359. package/esm2022/tree/lib/tree.component.mjs +0 -148
  360. package/esm2022/tree/lib/tree.interface.mjs +0 -2
  361. package/esm2022/tree/lib/tree.service.mjs +0 -95
  362. package/esm2022/tree/yuuvis-client-framework-tree.mjs +0 -5
  363. package/esm2022/upload-progress/index.mjs +0 -2
  364. package/esm2022/upload-progress/lib/upload-progress/upload-progress-overlay/upload-progress-overlay.component.mjs +0 -49
  365. package/esm2022/upload-progress/lib/upload-progress/upload-progress.component.mjs +0 -37
  366. package/esm2022/upload-progress/yuuvis-client-framework-upload-progress.mjs +0 -5
  367. package/esm2022/user-avatar/index.mjs +0 -3
  368. package/esm2022/user-avatar/lib/user-avatar.component.mjs +0 -69
  369. package/esm2022/user-avatar/lib/user-avatar.module.mjs +0 -24
  370. package/esm2022/user-avatar/yuuvis-client-framework-user-avatar.mjs +0 -5
  371. package/esm2022/yuuvis-client-framework.mjs +0 -5
  372. package/fesm2022/yuuvis-client-framework-token-search.mjs +0 -85
  373. package/fesm2022/yuuvis-client-framework-token-search.mjs.map +0 -1
  374. package/fesm2022/yuuvis-client-framework-user-avatar.mjs +0 -96
  375. package/fesm2022/yuuvis-client-framework-user-avatar.mjs.map +0 -1
  376. package/forms/lib/form-input/form-input.component.d.ts +0 -48
  377. package/object-form/lib/object-form-translate.service.d.ts +0 -15
  378. package/object-form/lib/object-form.model.d.ts +0 -18
  379. package/sequence-list/lib/due-date-picker/due-date-picker.component.d.ts +0 -28
  380. package/simple-search/lib/simple-search/simple-search.interface.d.ts +0 -4
  381. package/token-search/README.md +0 -3
  382. package/token-search/index.d.ts +0 -2
  383. package/token-search/token-search.component.d.ts +0 -22
  384. package/token-search/token-search.interface.d.ts +0 -4
  385. package/user-avatar/README.md +0 -3
  386. package/user-avatar/index.d.ts +0 -2
  387. package/user-avatar/lib/user-avatar.component.d.ts +0 -44
  388. package/user-avatar/lib/user-avatar.module.d.ts +0 -8
  389. /package/{metadata-form → metadata-form-defaults}/lib/metadata-default-templates/metadata-default-templates.component.d.ts +0 -0
@@ -1,628 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { ChangeDetectorRef, Component, effect, ElementRef, inject, input, output, ViewEncapsulation } from '@angular/core';
3
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
- import { ReactiveFormsModule, Validators } from '@angular/forms';
5
- import { Situation, SystemService, UserService, Utils } from '@yuuvis/client-core';
6
- import { debounceTime, of } from 'rxjs';
7
- import { FormScriptingApiService } from './form-scripting.service';
8
- import { ObjectFormGroupComponent } from './object-form-group/object-form-group.component';
9
- import { ObjectFormScriptService } from './object-form-script/object-form-script.service';
10
- import { ObjectFormScriptingScope } from './object-form-script/object-form-scripting-scope';
11
- import { ObjectFormControlWrapper } from './object-form.interface';
12
- import { ObjectFormControl, ObjectFormGroup } from './object-form.model';
13
- import { ObjectFormService } from './object-form.service';
14
- import { ObjectFormUtils } from './object-form.utils';
15
- import { FormValidation } from './object-form.validation';
16
- import * as i0 from "@angular/core";
17
- import * as i1 from "@angular/forms";
18
- export class ObjectFormComponent {
19
- #elementRef;
20
- #systemService;
21
- #formScriptService;
22
- #formHelperService;
23
- #userService;
24
- #cdRef;
25
- #formScriptingApiService;
26
- #skipTranslationsFor;
27
- #namePrefix;
28
- #formOptionsEffect;
29
- #elementExtensionsEffect;
30
- #scriptModel;
31
- #scriptingScope;
32
- #subscriptions;
33
- // local store for all the form control references
34
- #formControls;
35
- #initialValidators;
36
- constructor() {
37
- this.#elementRef = inject(ElementRef);
38
- this.#systemService = inject(SystemService);
39
- this.#formScriptService = inject(ObjectFormScriptService);
40
- this.#formHelperService = inject(ObjectFormService);
41
- this.#userService = inject(UserService);
42
- this.#cdRef = inject(ChangeDetectorRef);
43
- this.#formScriptingApiService = inject(FormScriptingApiService);
44
- this.#skipTranslationsFor = ['core', 'data'];
45
- this.#namePrefix = 'fg_';
46
- this.gCount = 0;
47
- this.id = Utils.uuid();
48
- this.formOptions = input();
49
- this.#formOptionsEffect = effect(() => {
50
- this.#init(this.formOptions());
51
- });
52
- this.inert = input();
53
- this.elementExtensions = input([]);
54
- this.#elementExtensionsEffect = effect(() => {
55
- this.#formHelperService.setElementExtensions(this.elementExtensions());
56
- });
57
- /**
58
- * There are special scenarios where forms are within a form themselves.
59
- * Setting this property to true, will handle the current form in a
60
- * slightly different way when it comes to form scripting.
61
- */
62
- this.isInnerTableForm = input();
63
- /**
64
- * triggered when the forms state has been changed
65
- */
66
- this.statusChanged = output();
67
- /**
68
- * handler to be executed after the form has been set up
69
- */
70
- this.onFormReady = output();
71
- this.#scriptModel = {};
72
- this.#subscriptions = [];
73
- // local store for all the form control references
74
- this.#formControls = {};
75
- this.#initialValidators = {};
76
- /**
77
- * This method will be called each time the script changes its internal model.
78
- * It is used to transfer the script changes to the actual form model.
79
- *
80
- * To ensure the right context, we define an instance method as callback for the scripting scope
81
- * @see: https://blog.johnnyreilly.com/2014/04/typescript-instance-methods.html
82
- *
83
- * @param formControlName
84
- * @param change
85
- */
86
- this.#onScriptingModelChanged = (formControlName, change, formId) => {
87
- if (!this.form || (formId && this.id !== formId))
88
- return;
89
- // find the target control
90
- const fc = this.#formControls[formControlName];
91
- if (fc) {
92
- // change only allowed properties
93
- switch (change.name) {
94
- case 'value': {
95
- if (Array.isArray(change.newValue)) {
96
- this.#processArrayValueChange(fc, change);
97
- }
98
- else {
99
- fc._eoFormElement.value = change.newValue;
100
- if (fc.value !== change.newValue) {
101
- fc.patchValue(change.newValue);
102
- fc.updateValueAndValidity();
103
- fc.markAsDirty();
104
- }
105
- }
106
- this.form.markAsDirty();
107
- break;
108
- }
109
- case 'required': {
110
- fc._eoFormElement.required = change.newValue;
111
- // apply new validators
112
- // @see: https://scotch.io/tutorials/how-to-implement-conditional-validation-in-angular-2-model-driven-forms
113
- fc.setValidators(Validators.compose(this.#getValidators(fc._eoFormElement).concat([this.#initialValidators[fc._eoFormElement.name]])));
114
- // need to mark form control as touched because otherwise form validation will not show
115
- // error messages
116
- fc.markAsTouched();
117
- fc.updateValueAndValidity();
118
- break;
119
- }
120
- case 'readonly': {
121
- fc._eoFormElement.readonly = change.newValue;
122
- if (change.newValue === true) {
123
- fc.disable();
124
- }
125
- else {
126
- fc.enable();
127
- }
128
- break;
129
- }
130
- case 'error': {
131
- fc._eoFormElement.error = change.newValue;
132
- fc.markAsTouched();
133
- fc.updateValueAndValidity();
134
- break;
135
- }
136
- // new onrowedit function was applied by the script
137
- case 'onrowedit': {
138
- fc._eoFormElement.onrowedit = change.newValue;
139
- break;
140
- }
141
- // new onchange function was applied by the script
142
- case 'onchange': {
143
- fc._eoFormElement.onchange = change.newValue;
144
- break;
145
- }
146
- }
147
- this.#cdRef.detectChanges();
148
- }
149
- };
150
- this.#formScriptingApiService.formId = this.id;
151
- this.#formScriptingApiService.api.events
152
- .on(FormScriptingApiService.EVENT_MODEL_CHANGED)
153
- .pipe(takeUntilDestroyed())
154
- .subscribe((event) => event.data && this.#onScriptingModelChanged(event.data.formControlName, event.data.change, event.data.formId));
155
- this.#formScriptingApiService.formId = this.id;
156
- }
157
- // initialize the form based on the provided form options
158
- #init(fo) {
159
- this.form = undefined;
160
- if (!fo)
161
- return;
162
- setTimeout(() => {
163
- this.#initialValidators = {};
164
- this.unsubscribeAll();
165
- this.#buildReactiveForm(fo);
166
- }, 0);
167
- }
168
- #initScriptingScope(formOptions, dataFormModel) {
169
- const { data, actions, objects, context } = (formOptions || {});
170
- if (this.#scriptingScope) {
171
- this.#scriptingScope.setModel(this.#scriptModel);
172
- /** provide access to actions (used inside of BPM-Forms) */
173
- this.#scriptingScope.actions = actions;
174
- /** provide access to additional objects (used for example in BPM-Start-Forms to
175
- * add data of DMS-Objects to start the process for)
176
- */
177
- this.#scriptingScope.objects = objects || [];
178
- this.#scriptingScope.context = context || { id: '', title: '', objectTypeId: '' };
179
- /** provide readonly access to initial form data (which may also contain values that
180
- * are not rendered as form elements (invisible values))
181
- */
182
- this.#scriptingScope.data = data;
183
- /** by default, scripting scopes are applied to forms. But table elements create their own scope
184
- * for editing rows. Being one of those inner forms should not run the form script again, but
185
- * instead just provide the observing abilities of the scripting scope.
186
- */
187
- if (!this.isInnerTableForm() && dataFormModel) {
188
- const scriptName = dataFormModel.name + '_' + dataFormModel.situation;
189
- console.debug('executing form script ' + scriptName);
190
- this.#formScriptService.runFormScript(this.#scriptingScope, dataFormModel.script, scriptName);
191
- }
192
- }
193
- }
194
- focusForm() {
195
- this.#elementRef.nativeElement.querySelector('input').focus();
196
- }
197
- getGroup(id) {
198
- return this.form?.get(id);
199
- }
200
- setFormData(data) {
201
- const fo = this.formOptions();
202
- if (!fo)
203
- return;
204
- fo.data = data;
205
- setTimeout(() => this.#init(fo), 0);
206
- }
207
- patchValue(data) {
208
- Object.keys(data).forEach((key) => {
209
- this.#onScriptingModelChanged(key, {
210
- name: 'value',
211
- newValue: data[key]
212
- });
213
- });
214
- }
215
- /**
216
- * Extracts the values from the form model. Each form value is represented by one
217
- * property on the result object holding the fields value. The keys (properties) are the `name`
218
- * properties of the form element.
219
- *
220
- * How values are extracted is influenced by the forms situation.
221
- *
222
- * @return object of key value pairs
223
- */
224
- getFormData() {
225
- return this.#formToData();
226
- }
227
- getFormElements() {
228
- const formElements = {};
229
- Object.keys(this.#formControls).forEach((k) => {
230
- formElements[k] = this.#formControls[k].__eoFormElement;
231
- });
232
- return formElements;
233
- }
234
- setFormPristine() {
235
- if (!this.form)
236
- return;
237
- this.form.markAsPristine();
238
- }
239
- // reset the form to its initial state
240
- resetForm() {
241
- const fo = this.formOptions();
242
- if (!fo)
243
- return;
244
- this.setFormData(fo.data);
245
- this.#emitFormChangedEvent();
246
- }
247
- /**
248
- * Returns the observed model that was passed to the current form script running. If there is
249
- * no form script, this method will return NULL.
250
- * @returns
251
- */
252
- getObservedScriptModel() {
253
- return this.#scriptingScope ? this.#scriptingScope.getModel() : null;
254
- }
255
- // Create a reactive form from the enaio form model
256
- #buildReactiveForm(formOptions) {
257
- this.#scriptingScope = undefined;
258
- this.#scriptModel = {};
259
- this.#formControls = {};
260
- const formModel = this.#dataToForm(formOptions.formModel, formOptions.data);
261
- if (!formModel) {
262
- return;
263
- }
264
- // if a script is available, we'll init the form scripting for the
265
- // current form
266
- if (this.isInnerTableForm() || (formModel.script && formModel.script.length > 0)) {
267
- console.debug('adding form scripting scope');
268
- this.#scriptingScope = new ObjectFormScriptingScope(formModel.situation, this.#onScriptingModelChanged, this.#formScriptingApiService.getApi(), this.isInnerTableForm());
269
- this.#scriptingScope.objectId = this.formOptions().objectId;
270
- }
271
- const form = new ObjectFormGroup({});
272
- if (formModel?.elements[0]?.elements) {
273
- this.#addFormControl(form, formModel.elements[0], 'core');
274
- }
275
- if (formModel?.elements[1]?.elements) {
276
- this.#addFormControl(form, formModel.elements[1], 'data');
277
- }
278
- this.form = form;
279
- this.#formScriptingApiService.registerActiveForm(this);
280
- console.log('form', form);
281
- setTimeout(() => {
282
- if (!this.form)
283
- return;
284
- this.initValidators(this.form);
285
- this.#subscriptions.push(this.form.valueChanges.pipe(debounceTime(500)).subscribe(() => this.#emitFormChangedEvent()));
286
- this.#initScriptingScope(formOptions, formModel);
287
- this.onFormReady.emit();
288
- this.#emitFormChangedEvent(false);
289
- }, 300);
290
- }
291
- initValidators(form) {
292
- if (this.form) {
293
- for (const key of Object.keys(form.controls)) {
294
- const control = form.controls[key];
295
- if (control.controls) {
296
- this.initValidators(control);
297
- }
298
- else {
299
- this.#initialValidators[control._eoFormElement.name] = control.validator;
300
- control.setValidators(Validators.compose(this.#getValidators(control._eoFormElement).concat([this.#initialValidators[control._eoFormElement.name]])));
301
- control.updateValueAndValidity();
302
- }
303
- }
304
- }
305
- }
306
- #emitFormChangedEvent(compare = true) {
307
- // check if indexdata has been changed
308
- const currentFormData = this.getFormData();
309
- const idxChange = compare ? JSON.stringify(this.formData) !== JSON.stringify(currentFormData) : false;
310
- this.formData = currentFormData;
311
- if (this.form) {
312
- this.statusChanged.emit({
313
- invalid: this.form.invalid,
314
- dirty: this.form.dirty,
315
- data: this.formData,
316
- indexdataChanged: idxChange
317
- });
318
- }
319
- }
320
- /**
321
- * This method will be called each time the script changes its internal model.
322
- * It is used to transfer the script changes to the actual form model.
323
- *
324
- * To ensure the right context, we define an instance method as callback for the scripting scope
325
- * @see: https://blog.johnnyreilly.com/2014/04/typescript-instance-methods.html
326
- *
327
- * @param formControlName
328
- * @param change
329
- */
330
- #onScriptingModelChanged;
331
- #processArrayValueChange(fc, change) {
332
- const newVal = change.newValue;
333
- const targetType = fc._eoFormElement.type;
334
- // for some types we have to ensure that meta data are provided as well
335
- switch (targetType) {
336
- case 'ORGANIZATION': {
337
- this.#getDataMeta(fc._eoFormElement, newVal).subscribe((m) => {
338
- fc._eoFormElement.dataMeta = m;
339
- });
340
- break;
341
- }
342
- case 'TABLE': {
343
- const dataToBeProcessed = {};
344
- fc._eoFormElement.elements.forEach((e) => {
345
- if (e.type === 'ORGANIZATION' || e.type === 'CODESYSTEM') {
346
- dataToBeProcessed[e.name] = e;
347
- }
348
- });
349
- if (Object.keys(dataToBeProcessed).length) {
350
- newVal.forEach((rowData) => {
351
- Object.keys(rowData).forEach((key) => {
352
- if (dataToBeProcessed[key]) {
353
- this.#getDataMeta(dataToBeProcessed[key], rowData[key]).subscribe((m) => {
354
- if (m) {
355
- rowData[key + '_meta'] = m;
356
- }
357
- else {
358
- delete rowData[key + '_meta'];
359
- }
360
- this.#updateArrayValue(fc, newVal);
361
- });
362
- }
363
- });
364
- });
365
- }
366
- break;
367
- }
368
- }
369
- this.#updateArrayValue(fc, newVal);
370
- }
371
- #updateArrayValue(fc, newValue) {
372
- fc._eoFormElement.value = [].concat(newValue);
373
- fc.patchValue([].concat(newValue));
374
- fc.updateValueAndValidity();
375
- fc.markAsDirty();
376
- }
377
- #getDataMeta(formElement, newValue) {
378
- if (newValue) {
379
- switch (formElement.type) {
380
- case 'ORGANIZATION': {
381
- return this.#userService.getUserById(newValue);
382
- }
383
- }
384
- }
385
- return of(null);
386
- }
387
- #patchFormValue(formValue) {
388
- let value;
389
- if (Array.isArray(formValue)) {
390
- value = [];
391
- // copy by value for arrays of objects (e.g. table data)
392
- formValue.forEach((o) => value.push(JSON.parse(JSON.stringify(o))));
393
- }
394
- else {
395
- value = formValue;
396
- }
397
- return value;
398
- }
399
- /**
400
- * Recursive method adding a new FormControl (group or control) to a parent form group
401
- *
402
- * @param parentGroup - the parent group to add the control to
403
- * @param formElement - the enaio form model element to create the child control from
404
- * @param [useName] - use this name instead of the one from the model
405
- */
406
- #addFormControl(parentGroup, formElement, useName) {
407
- const fo = this.formOptions();
408
- if (!fo)
409
- return;
410
- let ctrl;
411
- let name;
412
- // add a form group
413
- if (formElement.type === 'o2mGroup' || formElement.type === 'o2mGroupStack') {
414
- // do not add groups that are empty
415
- const isRootGroup = formElement.name && (formElement.name !== 'data' || formElement.name !== 'core');
416
- if (!isRootGroup && (!formElement.elements || formElement.elements.length === 0)) {
417
- console.error('Found empty form group', formElement);
418
- return;
419
- }
420
- ctrl = new ObjectFormGroup({});
421
- ctrl._eoFormGroup = {
422
- layout: formElement.layout,
423
- type: formElement.type
424
- };
425
- if (formElement.name) {
426
- if (this.#skipTranslationsFor.includes(formElement.name)) {
427
- ctrl._eoFormGroup.label = formElement.name;
428
- }
429
- else if (!formElement.label) {
430
- // no label, so try to translate the technical name
431
- ctrl._eoFormGroup.label = this.#systemService.getLocalizedResource(`${formElement.name}_label`) || formElement.name;
432
- }
433
- else {
434
- // there is a label so we take this one
435
- ctrl._eoFormGroup.label = formElement.label;
436
- }
437
- }
438
- if (useName === 'core' || useName === 'data') {
439
- ctrl._eoFormGroup.label = useName;
440
- }
441
- for (const e of formElement.elements) {
442
- this.#addFormControl(ctrl, e);
443
- }
444
- name = useName || 'fg' + this.gCount++;
445
- }
446
- else {
447
- // add form control
448
- // To be able to integrate recursive form controls into the main form,
449
- // we have to wrap them in a form group
450
- ctrl = new ObjectFormControlWrapper({});
451
- ctrl._eoFormControlWrapper = {
452
- // the name of the wrapped FormControl
453
- controlName: formElement.name,
454
- situation: fo.formModel.situation
455
- };
456
- // do not set a reference as the form controls value
457
- // otherwise we could not reset the form
458
- const value = formElement?.value
459
- ? this.#patchFormValue(formElement?.value)
460
- : !Utils.isEmpty(formElement?.defaultvalue) && fo.formModel.situation === Situation.CREATE
461
- ? this.#patchFormValue(formElement?.defaultvalue)
462
- : formElement?.value;
463
- // create the actual form control
464
- const controlDisabled = fo.disabled || !!formElement.readonly;
465
- const formControl = new ObjectFormControl({
466
- value,
467
- disabled: controlDisabled
468
- });
469
- // if form element has a 'label' property it will be shown as is ...
470
- if (!formElement.label) {
471
- // ... if there is no label but a 'labelKey' property we are going to localize that key ...
472
- if (formElement.labelkey) {
473
- formElement.label = this.#systemService.getLocalizedResource(`${formElement.labelkey}_label`) || formElement.labelkey;
474
- formElement.description = this.#systemService.getLocalizedResource(`${formElement.labelkey}_description`);
475
- }
476
- else {
477
- // ... no 'label' and also no 'labelKey' means that we are showing technical name instead
478
- formElement.label = formElement.name;
479
- }
480
- }
481
- formElement.readonly = controlDisabled;
482
- // we are using an internal type to distinguish between the components
483
- // to be used to render certain form elements
484
- formElement._internalType = this.#systemService.getInternalFormElementType(formElement.type, formElement.classifications);
485
- formControl._eoFormElement = formElement;
486
- this.#formControls[formElement.name] = formControl;
487
- if (formElement.type === 'TABLE') {
488
- // Add 'onrowedit' property even if it's not set.
489
- // This is required because otherwise mobX-Observer would not recognize
490
- // changes to this property applied by the form script
491
- if (!Object.keys(formControl._eoFormElement).includes('onrowedit')) {
492
- formControl._eoFormElement.onrowedit = null;
493
- }
494
- if (this.#scriptingScope && formControl._eoFormElement.value) {
495
- // having a scripting scope and table rows means that we need to set empty
496
- // columns to NULL, because otherwise mobX won't be able to track those values
497
- const valueFields = formControl._eoFormElement.elements.map((e) => e.name);
498
- formControl._eoFormElement.value.forEach((rowValue) => {
499
- valueFields.forEach((valueField) => {
500
- if (!Object.keys(rowValue).includes(valueField)) {
501
- rowValue[valueField] = null;
502
- }
503
- });
504
- });
505
- // update form controls value as well to reflect the observed value
506
- formControl.patchValue(formControl._eoFormElement.value, {
507
- onlySelf: true,
508
- emitEvent: false,
509
- emitModelToViewChange: false,
510
- emitViewToModelChange: false
511
- });
512
- }
513
- }
514
- if (formElement._internalType === 'string:organization') {
515
- formControl._eoFormElement.setFilter = (filterObject) => {
516
- formControl._eoFormElement.filter = filterObject;
517
- };
518
- }
519
- ObjectFormUtils.updateFormElement(formElement);
520
- // remove empty descriptions
521
- const desc = formControl._eoFormElement.description;
522
- if (desc && desc.trim().length === 0) {
523
- formControl._eoFormElement.description = null;
524
- }
525
- // add the form element to the script model that will be injected into
526
- // the forms scripting scope later on
527
- this.#scriptModel[formElement.name] = formControl._eoFormElement;
528
- // apply change listener to the form control, that will trigger
529
- // the form elements onChange listener
530
- const controlWatch = ctrl.valueChanges.pipe(debounceTime(500));
531
- this.#subscriptions.push(controlWatch.subscribe((v) => {
532
- if (this.#scriptingScope) {
533
- this.#scriptingScope.modelChanged(v);
534
- }
535
- }));
536
- ctrl.addControl(formElement.name, formControl);
537
- name = this.#namePrefix + formElement.name;
538
- }
539
- parentGroup.addControl(name, ctrl);
540
- }
541
- /**
542
- * Build validators for the given form element to be attached to
543
- * a reactive formControl.
544
- *
545
- * @param formElement - form element object
546
- */
547
- #getValidators(formElement) {
548
- const fo = this.formOptions();
549
- const elmValidators = FormValidation.getValidators(formElement, fo?.formModel.situation);
550
- // add custom validator for script enabled forms
551
- if (this.#scriptingScope) {
552
- elmValidators.push(FormValidation.customScriptingValidation);
553
- }
554
- return elmValidators;
555
- }
556
- /**
557
- * Extract the values from the form
558
- */
559
- #formToData() {
560
- const fo = this.formOptions();
561
- return fo && this.form ? this.#formHelperService.extractFormData(this.form, fo.formModel.situation, fo.data, this.isInnerTableForm()) : {};
562
- }
563
- /**
564
- * Merge data into a form model.
565
- *
566
- * @param model - form model
567
- * @param data - data object or array of SearchFilter objects in case of a search form
568
- */
569
- #dataToForm(model, data) {
570
- if (model && data) {
571
- this.#setElementValues(model.elements, data);
572
- }
573
- return model;
574
- }
575
- // recursive method for adding values to model elements
576
- #setElementValues(elements, data) {
577
- elements?.forEach((element) => {
578
- if (this.#hasValue(data, element)) {
579
- element.value = this.#getValue(data, element);
580
- }
581
- else {
582
- delete element.value;
583
- }
584
- if (element.type !== 'TABLE' && element.elements && element.elements.length > 0) {
585
- this.#setElementValues(element.elements, data);
586
- }
587
- });
588
- }
589
- #hasValue(data, element) {
590
- // differ between array of SearchFilters and a form data object
591
- if (Array.isArray(data)) {
592
- return !!data.find((filter) => filter.property === element.id);
593
- }
594
- else {
595
- return Object.keys(data).includes(element.name);
596
- }
597
- }
598
- #getValue(data, element) {
599
- return data[element.name];
600
- }
601
- ngOnDestroy() {
602
- this.unsubscribeAll();
603
- this.#formScriptingApiService.unregisterActiveForm(this);
604
- }
605
- ngAfterViewInit() {
606
- this.#cdRef.detectChanges();
607
- }
608
- // unsubscribe from all value change listeners for the current form
609
- // to avoid memory leaks. This method will also be called every time
610
- // a new form is rendered to get rid of the old form element subscriptions
611
- unsubscribeAll() {
612
- if (this.#subscriptions.length) {
613
- console.debug('unsubscribed from ' + this.#subscriptions.length + ' value change listeners.');
614
- this.#subscriptions.forEach((s) => s.unsubscribe());
615
- this.#subscriptions = [];
616
- }
617
- }
618
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ObjectFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
619
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ObjectFormComponent, isStandalone: true, selector: "yuv-object-form", inputs: { formOptions: { classPropertyName: "formOptions", publicName: "formOptions", isSignal: true, isRequired: false, transformFunction: null }, inert: { classPropertyName: "inert", publicName: "inert", isSignal: true, isRequired: false, transformFunction: null }, elementExtensions: { classPropertyName: "elementExtensions", publicName: "elementExtensions", isSignal: true, isRequired: false, transformFunction: null }, isInnerTableForm: { classPropertyName: "isInnerTableForm", publicName: "isInnerTableForm", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { statusChanged: "statusChanged", onFormReady: "onFormReady" }, host: { properties: { "attr.inert": "inert() ? true : null" }, classAttribute: "yuv-object-form" }, providers: [ObjectFormService, ObjectFormScriptService, FormScriptingApiService], ngImport: i0, template: "@let fo = formOptions();\n@if (fo && form) {\n <div class=\"yuv-object-form\" [formGroup]=\"form\">\n <div class=\"form-element-wrap core\">\n <yuv-object-form-group [group]=\"getGroup('core')\" [situation]=\"fo.formModel.situation\"></yuv-object-form-group>\n </div>\n <div class=\"form-element-wrap data\">\n <yuv-object-form-group [group]=\"getGroup('data')\" [situation]=\"fo.formModel.situation\"></yuv-object-form-group>\n </div>\n </div>\n}\n", styles: [".yuv-object-form>.core{padding:calc(var(--app-pane-padding) / 2)}.yuv-object-form>.data>yuv-object-form-group>.form-element.o2mGroupStack{background:transparent;border:0}.yuv-object-form>.data>yuv-object-form-group>.form-element.o2mGroupStack>yuv-object-form-group>.o2mGroup{background-color:var(--panel-background-lightgrey);border-top:1px solid rgba(0,0,0,.1);padding:var(--app-pane-padding)}.yuv-object-form>.data>yuv-object-form-group>.form-element.o2mGroupStack>p-tabview>.p-tabview>.p-tabview-panels{background-color:var(--panel-background-lightgrey)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: ObjectFormGroupComponent, selector: "yuv-object-form-group", inputs: ["situation", "group", "noGroupLabels"] }], encapsulation: i0.ViewEncapsulation.None }); }
620
- }
621
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ObjectFormComponent, decorators: [{
622
- type: Component,
623
- args: [{ selector: 'yuv-object-form', standalone: true, imports: [CommonModule, ReactiveFormsModule, ObjectFormGroupComponent], providers: [ObjectFormService, ObjectFormScriptService, FormScriptingApiService], encapsulation: ViewEncapsulation.None, host: {
624
- class: 'yuv-object-form',
625
- '[attr.inert]': 'inert() ? true : null'
626
- }, template: "@let fo = formOptions();\n@if (fo && form) {\n <div class=\"yuv-object-form\" [formGroup]=\"form\">\n <div class=\"form-element-wrap core\">\n <yuv-object-form-group [group]=\"getGroup('core')\" [situation]=\"fo.formModel.situation\"></yuv-object-form-group>\n </div>\n <div class=\"form-element-wrap data\">\n <yuv-object-form-group [group]=\"getGroup('data')\" [situation]=\"fo.formModel.situation\"></yuv-object-form-group>\n </div>\n </div>\n}\n", styles: [".yuv-object-form>.core{padding:calc(var(--app-pane-padding) / 2)}.yuv-object-form>.data>yuv-object-form-group>.form-element.o2mGroupStack{background:transparent;border:0}.yuv-object-form>.data>yuv-object-form-group>.form-element.o2mGroupStack>yuv-object-form-group>.o2mGroup{background-color:var(--panel-background-lightgrey);border-top:1px solid rgba(0,0,0,.1);padding:var(--app-pane-padding)}.yuv-object-form>.data>yuv-object-form-group>.form-element.o2mGroupStack>p-tabview>.p-tabview>.p-tabview-panels{background-color:var(--panel-background-lightgrey)}\n"] }]
627
- }], ctorParameters: () => [] });
628
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWZyYW1ld29yay9vYmplY3QtZm9ybS9zcmMvbGliL29iamVjdC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvb2JqZWN0LWZvcm0vc3JjL2xpYi9vYmplY3QtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxZQUFZLEVBQWMsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUMzRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUMxRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM1RixPQUFPLEVBQTBCLHdCQUF3QixFQUE0QyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JJLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7QUFlMUQsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixXQUFXLENBQXNCO0lBQ2pDLGNBQWMsQ0FBeUI7SUFDdkMsa0JBQWtCLENBQW1DO0lBQ3JELGtCQUFrQixDQUE2QjtJQUMvQyxZQUFZLENBQXVCO0lBQ25DLE1BQU0sQ0FBNkI7SUFDbkMsd0JBQXdCLENBQW1DO0lBRTNELG9CQUFvQixDQUFvQjtJQUN4QyxXQUFXLENBQVM7SUFPcEIsa0JBQWtCLENBRWY7SUFJSCx3QkFBd0IsQ0FFckI7SUF5QkgsWUFBWSxDQUFXO0lBQ3ZCLGVBQWUsQ0FBNEI7SUFDM0MsY0FBYyxDQUFzQjtJQUVwQyxrREFBa0Q7SUFDbEQsYUFBYSxDQUFXO0lBQ3hCLGtCQUFrQixDQUFXO0lBRTdCO1FBekRBLGdCQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pDLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZDLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3JELHVCQUFrQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9DLGlCQUFZLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25DLFdBQU0sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNuQyw2QkFBd0IsR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUUzRCx5QkFBb0IsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4QyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRVgsT0FBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUdsQixnQkFBVyxHQUFHLEtBQUssRUFBcUIsQ0FBQztRQUN6Qyx1QkFBa0IsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7UUFFSCxVQUFLLEdBQUcsS0FBSyxFQUFXLENBQUM7UUFDekIsc0JBQWlCLEdBQUcsS0FBSyxDQUFnQyxFQUFFLENBQUMsQ0FBQztRQUM3RCw2QkFBd0IsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO1FBRUg7Ozs7V0FJRztRQUNILHFCQUFnQixHQUFHLEtBQUssRUFBVyxDQUFDO1FBRXBDOztXQUVHO1FBQ0gsa0JBQWEsR0FBRyxNQUFNLEVBQTBCLENBQUM7UUFFakQ7O1dBRUc7UUFDSCxnQkFBVyxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBUXZCLGlCQUFZLEdBQVEsRUFBRSxDQUFDO1FBRXZCLG1CQUFjLEdBQW1CLEVBQUUsQ0FBQztRQUVwQyxrREFBa0Q7UUFDbEQsa0JBQWEsR0FBUSxFQUFFLENBQUM7UUFDeEIsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBa003Qjs7Ozs7Ozs7O1dBU0c7UUFDSCw2QkFBd0IsR0FBRyxDQUFDLGVBQXVCLEVBQUUsTUFBNkIsRUFBRSxNQUFlLEVBQUUsRUFBRTtZQUNyRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQztnQkFBRSxPQUFPO1lBQ3pELDBCQUEwQjtZQUMxQixNQUFNLEVBQUUsR0FBc0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQXNCLENBQUM7WUFDdkYsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDUCxpQ0FBaUM7Z0JBQ2pDLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNwQixLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQ2IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDOzRCQUNuQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO3dCQUM1QyxDQUFDOzZCQUFNLENBQUM7NEJBQ04sRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs0QkFDMUMsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQ0FDakMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0NBQy9CLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dDQUM1QixFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7NEJBQ25CLENBQUM7d0JBQ0gsQ0FBQzt3QkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUN4QixNQUFNO29CQUNSLENBQUM7b0JBQ0QsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO3dCQUNoQixFQUFFLENBQUMsY0FBYyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO3dCQUM3Qyx1QkFBdUI7d0JBQ3ZCLDRHQUE0Rzt3QkFDNUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3ZJLHVGQUF1Rjt3QkFDdkYsaUJBQWlCO3dCQUNqQixFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ25CLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO3dCQUM1QixNQUFNO29CQUNSLENBQUM7b0JBQ0QsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO3dCQUNoQixFQUFFLENBQUMsY0FBYyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO3dCQUM3QyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7NEJBQzdCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDZixDQUFDOzZCQUFNLENBQUM7NEJBQ04sRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUNkLENBQUM7d0JBQ0QsTUFBTTtvQkFDUixDQUFDO29CQUNELEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQzt3QkFDYixFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO3dCQUMxQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ25CLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO3dCQUM1QixNQUFNO29CQUNSLENBQUM7b0JBQ0QsbURBQW1EO29CQUNuRCxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7d0JBQ2pCLEVBQUUsQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7d0JBQzlDLE1BQU07b0JBQ1IsQ0FBQztvQkFDRCxrREFBa0Q7b0JBQ2xELEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQzt3QkFDaEIsRUFBRSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzt3QkFDN0MsTUFBTTtvQkFDUixDQUFDO2dCQUNILENBQUM7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBclFBLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLE1BQU07YUFDckMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDO2FBQy9DLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2FBQzFCLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXZJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQseURBQXlEO0lBQ3pELEtBQUssQ0FBQyxFQUFpQztRQUNyQyxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUN0QixJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU87UUFDaEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQsbUJBQW1CLENBQUMsV0FBOEIsRUFBRSxhQUFrQjtRQUNwRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFzQixDQUFDO1FBRXJGLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRCwyREFBMkQ7WUFDM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3ZDOztlQUVHO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBQ2xGOztlQUVHO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBRWpDOzs7ZUFHRztZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDOUMsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztnQkFDdEUsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxVQUFVLENBQUMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDaEcsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoRSxDQUFDO0lBRUQsUUFBUSxDQUFDLEVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQW9CLENBQUM7SUFDL0MsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUE2QjtRQUN2QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPO1FBQ2hCLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2YsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUE2QjtRQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pDLElBQUksRUFBRSxPQUFPO2dCQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDO2FBQ3BCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxZQUFZLEdBQVEsRUFBRSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzVDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsU0FBUztRQUNQLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU87UUFDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxzQkFBc0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdkUsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxrQkFBa0IsQ0FBQyxXQUE4QjtRQUMvQyxJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU87UUFDVCxDQUFDO1FBQ0Qsa0VBQWtFO1FBQ2xFLGVBQWU7UUFDZixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pGLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksd0JBQXdCLENBQ2pELFNBQVMsQ0FBQyxTQUFTLEVBQ25CLElBQUksQ0FBQyx3QkFBd0IsRUFDN0IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxFQUN0QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FDeEIsQ0FBQztZQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUcsQ0FBQyxRQUFRLENBQUM7UUFDL0QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLElBQUksU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxJQUFJLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTztZQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUV2SCxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRWpELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBUztRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNkLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9CLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO29CQUN6RSxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdEosT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQ25DLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxPQUFPLEdBQUcsSUFBSTtRQUNsQyxzQ0FBc0M7UUFDdEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzNDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3RHLElBQUksQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQ3RCLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87Z0JBQzFCLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7Z0JBQ3RCLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDbkIsZ0JBQWdCLEVBQUUsU0FBUzthQUM1QixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILHdCQUF3QixDQTREdEI7SUFFRix3QkFBd0IsQ0FBQyxFQUFPLEVBQUUsTUFBVztRQUMzQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQy9CLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1FBQzFDLHVFQUF1RTtRQUN2RSxRQUFRLFVBQVUsRUFBRSxDQUFDO1lBQ25CLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUMzRCxFQUFFLENBQUMsY0FBYyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLENBQUMsQ0FBQyxDQUFDO2dCQUNILE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNiLE1BQU0saUJBQWlCLEdBQTRCLEVBQUUsQ0FBQztnQkFDdEQsRUFBRSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7b0JBQzVDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxjQUFjLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQzt3QkFDekQsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDaEMsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDMUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO3dCQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFOzRCQUNuQyxJQUFJLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0NBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0NBQ3RFLElBQUksQ0FBQyxFQUFFLENBQUM7d0NBQ04sT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7b0NBQzdCLENBQUM7eUNBQU0sQ0FBQzt3Q0FDTixPQUFPLE9BQU8sQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7b0NBQ2hDLENBQUM7b0NBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztnQ0FDckMsQ0FBQyxDQUFDLENBQUM7NEJBQ0wsQ0FBQzt3QkFDSCxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQU8sRUFBRSxRQUFhO1FBQ3RDLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbkMsRUFBRSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDNUIsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxZQUFZLENBQUMsV0FBZ0IsRUFBRSxRQUFhO1FBQzFDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDekIsS0FBSyxjQUFjLENBQUMsQ0FBQyxDQUFDO29CQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsZUFBZSxDQUFDLFNBQTRCO1FBQzFDLElBQUksS0FBVSxDQUFDO1FBQ2YsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDN0IsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNYLHdEQUF3RDtZQUN4RCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RSxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDcEIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGVBQWUsQ0FBQyxXQUE0QixFQUFFLFdBQWdCLEVBQUUsT0FBZ0I7UUFDOUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUVoQixJQUFJLElBQUksQ0FBQztRQUNULElBQUksSUFBSSxDQUFDO1FBRVQsbUJBQW1CO1FBQ25CLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxlQUFlLEVBQUUsQ0FBQztZQUM1RSxtQ0FBbUM7WUFDbkMsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUM7WUFDckcsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNqRixPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUNyRCxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHO2dCQUNsQixNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU07Z0JBQzFCLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTthQUN2QixDQUFDO1lBRUYsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDekQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDN0MsQ0FBQztxQkFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUM5QixtREFBbUQ7b0JBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsR0FBRyxXQUFXLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUN0SCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sdUNBQXVDO29CQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO2dCQUM5QyxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksT0FBTyxLQUFLLE1BQU0sSUFBSSxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztZQUNwQyxDQUFDO1lBRUQsS0FBSyxNQUFNLENBQUMsSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7WUFDRCxJQUFJLEdBQUcsT0FBTyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekMsQ0FBQzthQUFNLENBQUM7WUFDTixtQkFBbUI7WUFDbkIsc0VBQXNFO1lBQ3RFLHVDQUF1QztZQUN2QyxJQUFJLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMscUJBQXFCLEdBQUc7Z0JBQzNCLHNDQUFzQztnQkFDdEMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxJQUFJO2dCQUM3QixTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTO2FBQ2xDLENBQUM7WUFFRixvREFBb0Q7WUFDcEQsd0NBQXdDO1lBQ3hDLE1BQU0sS0FBSyxHQUFHLFdBQVcsRUFBRSxLQUFLO2dCQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDO2dCQUMxQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsTUFBTTtvQkFDeEYsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQztvQkFDakQsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUM7WUFFekIsaUNBQWlDO1lBQ2pDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7WUFDOUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQztnQkFDeEMsS0FBSztnQkFDTCxRQUFRLEVBQUUsZUFBZTthQUMxQixDQUFDLENBQUM7WUFFSCxvRUFBb0U7WUFDcEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdkIsMkZBQTJGO2dCQUMzRixJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDekIsV0FBVyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsV0FBVyxDQUFDLFFBQVEsUUFBUSxDQUFDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQztvQkFDdEgsV0FBVyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsV0FBVyxDQUFDLFFBQVEsY0FBYyxDQUFDLENBQUM7Z0JBQzVHLENBQUM7cUJBQU0sQ0FBQztvQkFDTix5RkFBeUY7b0JBQ3pGLFdBQVcsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDdkMsQ0FBQztZQUNILENBQUM7WUFDRCxXQUFXLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQztZQUN2QyxzRUFBc0U7WUFDdEUsNkNBQTZDO1lBQzdDLFdBQVcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUUxSCxXQUFXLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQztZQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUM7WUFFbkQsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNqQyxpREFBaUQ7Z0JBQ2pELHVFQUF1RTtnQkFDdkUsc0RBQXNEO2dCQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7b0JBQ25FLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDOUMsQ0FBQztnQkFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDN0QsMEVBQTBFO29CQUMxRSw4RUFBOEU7b0JBQzlFLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoRixXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTt3QkFDekQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQWtCLEVBQUUsRUFBRTs0QkFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0NBQ2hELFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7NEJBQzlCLENBQUM7d0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsbUVBQW1FO29CQUNuRSxXQUFXLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFO3dCQUN2RCxRQUFRLEVBQUUsSUFBSTt3QkFDZCxTQUFTLEVBQUUsS0FBSzt3QkFDaEIscUJBQXFCLEVBQUUsS0FBSzt3QkFDNUIscUJBQXFCLEVBQUUsS0FBSztxQkFDN0IsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxXQUFXLENBQUMsYUFBYSxLQUFLLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3hELFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLENBQUMsWUFBaUIsRUFBRSxFQUFFO29CQUMzRCxXQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUM7Z0JBQ25ELENBQUMsQ0FBQztZQUNKLENBQUM7WUFFRCxlQUFlLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFL0MsNEJBQTRCO1lBQzVCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQ3BELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLFdBQVcsQ0FBQyxjQUFjLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUNoRCxDQUFDO1lBRUQsc0VBQXNFO1lBQ3RFLHFDQUFxQztZQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDO1lBRWpFLCtEQUErRDtZQUMvRCxzQ0FBc0M7WUFDdEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3RCLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDM0IsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUVGLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztZQUMvQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQzdDLENBQUM7UUFDRCxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxjQUFjLENBQUMsV0FBZ0I7UUFDN0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFekYsZ0RBQWdEO1FBQ2hELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUIsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzdJLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFdBQVcsQ0FBQyxLQUFVLEVBQUUsSUFBUztRQUMvQixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsdURBQXVEO0lBQ3ZELGlCQUFpQixDQUFDLFFBQWUsRUFBRSxJQUE2QjtRQUM5RCxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDdkIsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUE2QixFQUFFLE9BQVk7UUFDbkQsK0RBQStEO1FBQy9ELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTLENBQUMsSUFBNkIsRUFBRSxPQUFZO1FBQ25ELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsb0VBQW9FO0lBQ3BFLDBFQUEwRTtJQUNsRSxjQUFjO1FBQ3BCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLDBCQUEwQixDQUFDLENBQUM7WUFDOUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDOytHQTFuQlUsbUJBQW1CO21HQUFuQixtQkFBbUIsOHlCQVRuQixDQUFDLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLHVCQUF1QixDQUFDLDBCQ3RCbEYsMmRBV0Esd21CRFVZLFlBQVksOEJBQUUsbUJBQW1CLDRVQUFFLHdCQUF3Qjs7NEZBVTFELG1CQUFtQjtrQkFiL0IsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsd0JBQXdCLENBQUMsYUFDM0QsQ0FBQyxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsQ0FBQyxpQkFHakUsaUJBQWlCLENBQUMsSUFBSSxRQUMvQjt3QkFDSixLQUFLLEVBQUUsaUJBQWlCO3dCQUN4QixjQUFjLEVBQUUsdUJBQXVCO3FCQUN4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0BueC9kZXZraXQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgT25EZXN0cm95LCBvdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNpdHVhdGlvbiwgU3lzdGVtU2VydmljZSwgVXNlclNlcnZpY2UsIFV0aWxzIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZvcm1TY3JpcHRpbmdBcGlTZXJ2aWNlIH0gZnJvbSAnLi9mb3JtLXNjcmlwdGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IElPYmplY3RGb3JtRWxlbWVudEV4dGVuc2lvbiB9IGZyb20gJy4vb2JqZWN0LWZvcm0tZXh0ZW5zaW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPYmplY3RGb3JtR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL29iamVjdC1mb3JtLWdyb3VwL29iamVjdC1mb3JtLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPYmplY3RGb3JtU2NyaXB0U2VydmljZSB9IGZyb20gJy4vb2JqZWN0LWZvcm0tc2NyaXB0L29iamVjdC1mb3JtLXNjcmlwdC5zZXJ2aWNlJztcbmltcG9ydCB7IE9iamVjdEZvcm1TY3JpcHRpbmdTY29wZSB9IGZyb20gJy4vb2JqZWN0LWZvcm0tc2NyaXB0L29iamVjdC1mb3JtLXNjcmlwdGluZy1zY29wZSc7XG5pbXBvcnQgeyBGb3JtU3RhdHVzQ2hhbmdlZEV2ZW50LCBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIsIE9iamVjdEZvcm1Nb2RlbENoYW5nZSwgT2JqZWN0Rm9ybU9wdGlvbnMgfSBmcm9tICcuL29iamVjdC1mb3JtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPYmplY3RGb3JtQ29udHJvbCwgT2JqZWN0Rm9ybUdyb3VwIH0gZnJvbSAnLi9vYmplY3QtZm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBPYmplY3RGb3JtU2VydmljZSB9IGZyb20gJy4vb2JqZWN0LWZvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBPYmplY3RGb3JtVXRpbHMgfSBmcm9tICcuL29iamVjdC1mb3JtLnV0aWxzJztcbmltcG9ydCB7IEZvcm1WYWxpZGF0aW9uIH0gZnJvbSAnLi9vYmplY3QtZm9ybS52YWxpZGF0aW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXV2LW9iamVjdC1mb3JtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgT2JqZWN0Rm9ybUdyb3VwQ29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbT2JqZWN0Rm9ybVNlcnZpY2UsIE9iamVjdEZvcm1TY3JpcHRTZXJ2aWNlLCBGb3JtU2NyaXB0aW5nQXBpU2VydmljZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9vYmplY3QtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9vYmplY3QtZm9ybS5jb21wb25lbnQuc2NzcycsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ3l1di1vYmplY3QtZm9ybScsXG4gICAgJ1thdHRyLmluZXJ0XSc6ICdpbmVydCgpID8gdHJ1ZSA6IG51bGwnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgT2JqZWN0Rm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gICNlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAjc3lzdGVtU2VydmljZSA9IGluamVjdChTeXN0ZW1TZXJ2aWNlKTtcbiAgI2Zvcm1TY3JpcHRTZXJ2aWNlID0gaW5qZWN0KE9iamVjdEZvcm1TY3JpcHRTZXJ2aWNlKTtcbiAgI2Zvcm1IZWxwZXJTZXJ2aWNlID0gaW5qZWN0KE9iamVjdEZvcm1TZXJ2aWNlKTtcbiAgI3VzZXJTZXJ2aWNlID0gaW5qZWN0KFVzZXJTZXJ2aWNlKTtcbiAgI2NkUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgI2Zvcm1TY3JpcHRpbmdBcGlTZXJ2aWNlID0gaW5qZWN0KEZvcm1TY3JpcHRpbmdBcGlTZXJ2aWNlKTtcblxuICAjc2tpcFRyYW5zbGF0aW9uc0ZvciA9IFsnY29yZScsICdkYXRhJ107XG4gICNuYW1lUHJlZml4ID0gJ2ZnXyc7XG4gIGdDb3VudCA9IDA7XG5cbiAgaWQgPSBVdGlscy51dWlkKCk7XG5cbiAgZm8/OiBPYmplY3RGb3JtT3B0aW9ucztcbiAgZm9ybU9wdGlvbnMgPSBpbnB1dDxPYmplY3RGb3JtT3B0aW9ucz4oKTtcbiAgI2Zvcm1PcHRpb25zRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICB0aGlzLiNpbml0KHRoaXMuZm9ybU9wdGlvbnMoKSk7XG4gIH0pO1xuXG4gIGluZXJ0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgZWxlbWVudEV4dGVuc2lvbnMgPSBpbnB1dDxJT2JqZWN0Rm9ybUVsZW1lbnRFeHRlbnNpb25bXT4oW10pO1xuICAjZWxlbWVudEV4dGVuc2lvbnNFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgIHRoaXMuI2Zvcm1IZWxwZXJTZXJ2aWNlLnNldEVsZW1lbnRFeHRlbnNpb25zKHRoaXMuZWxlbWVudEV4dGVuc2lvbnMoKSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBUaGVyZSBhcmUgc3BlY2lhbCBzY2VuYXJpb3Mgd2hlcmUgZm9ybXMgYXJlIHdpdGhpbiBhIGZvcm0gdGhlbXNlbHZlcy5cbiAgICogU2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHdpbGwgaGFuZGxlIHRoZSBjdXJyZW50IGZvcm0gaW4gYVxuICAgKiBzbGlnaHRseSBkaWZmZXJlbnQgd2F5IHdoZW4gaXQgY29tZXMgdG8gZm9ybSBzY3JpcHRpbmcuXG4gICAqL1xuICBpc0lubmVyVGFibGVGb3JtID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gdGhlIGZvcm1zIHN0YXRlIGhhcyBiZWVuIGNoYW5nZWRcbiAgICovXG4gIHN0YXR1c0NoYW5nZWQgPSBvdXRwdXQ8Rm9ybVN0YXR1c0NoYW5nZWRFdmVudD4oKTtcblxuICAvKipcbiAgICogaGFuZGxlciB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgZm9ybSBoYXMgYmVlbiBzZXQgdXBcbiAgICovXG4gIG9uRm9ybVJlYWR5ID0gb3V0cHV0KCk7XG5cbiAgLy8gdGhlIGFjdHVhbCBmb3JtIGluc3RhbmNlXG4gIGZvcm0/OiBPYmplY3RGb3JtR3JvdXA7XG4gIC8vIHByb3BlcnR5IGZvciBob2xkaW5nIHRoZSBmb3JtcyBkYXRhIHVzZWQgZm9yIGNvbXBhcmlzb24gd2hlbiBhIGZvcm0tY2hhbmdlZC1ldmVudFxuICAvLyBpcyBmZXRjaGVkIHRvIGluZGljYXRlIHdoZXIgb3Igbm90IHRoZSBpbmRleGRhdGEgd2VyZSBjaGFuZ2VkIG9yIGp1c3QgdGhlIHByb3BlcnRpZXNcbiAgLy8gb2YgdGhlIGZvcm0gZWxlbWVudHMgKGVnLiBmb3JtIHNjcmlwdCBzZXR0aW5nIGZpZWxkcyB0byByZWFkb25seSlcbiAgZm9ybURhdGE6IGFueTtcbiAgI3NjcmlwdE1vZGVsOiBhbnkgPSB7fTtcbiAgI3NjcmlwdGluZ1Njb3BlPzogT2JqZWN0Rm9ybVNjcmlwdGluZ1Njb3BlO1xuICAjc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAvLyBsb2NhbCBzdG9yZSBmb3IgYWxsIHRoZSBmb3JtIGNvbnRyb2wgcmVmZXJlbmNlc1xuICAjZm9ybUNvbnRyb2xzOiBhbnkgPSB7fTtcbiAgI2luaXRpYWxWYWxpZGF0b3JzOiBhbnkgPSB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLiNmb3JtU2NyaXB0aW5nQXBpU2VydmljZS5mb3JtSWQgPSB0aGlzLmlkO1xuICAgIHRoaXMuI2Zvcm1TY3JpcHRpbmdBcGlTZXJ2aWNlLmFwaS5ldmVudHNcbiAgICAgIC5vbihGb3JtU2NyaXB0aW5nQXBpU2VydmljZS5FVkVOVF9NT0RFTF9DSEFOR0VEKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4gZXZlbnQuZGF0YSAmJiB0aGlzLiNvblNjcmlwdGluZ01vZGVsQ2hhbmdlZChldmVudC5kYXRhLmZvcm1Db250cm9sTmFtZSwgZXZlbnQuZGF0YS5jaGFuZ2UsIGV2ZW50LmRhdGEuZm9ybUlkKSk7XG5cbiAgICB0aGlzLiNmb3JtU2NyaXB0aW5nQXBpU2VydmljZS5mb3JtSWQgPSB0aGlzLmlkO1xuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZm9ybSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZm9ybSBvcHRpb25zXG4gICNpbml0KGZvOiBPYmplY3RGb3JtT3B0aW9ucyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuZm9ybSA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIWZvKSByZXR1cm47XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLiNpbml0aWFsVmFsaWRhdG9ycyA9IHt9O1xuICAgICAgdGhpcy51bnN1YnNjcmliZUFsbCgpO1xuICAgICAgdGhpcy4jYnVpbGRSZWFjdGl2ZUZvcm0oZm8pO1xuICAgIH0sIDApO1xuICB9XG5cbiAgI2luaXRTY3JpcHRpbmdTY29wZShmb3JtT3B0aW9uczogT2JqZWN0Rm9ybU9wdGlvbnMsIGRhdGFGb3JtTW9kZWw6IGFueSkge1xuICAgIGNvbnN0IHsgZGF0YSwgYWN0aW9ucywgb2JqZWN0cywgY29udGV4dCB9ID0gKGZvcm1PcHRpb25zIHx8IHt9KSBhcyBPYmplY3RGb3JtT3B0aW9ucztcblxuICAgIGlmICh0aGlzLiNzY3JpcHRpbmdTY29wZSkge1xuICAgICAgdGhpcy4jc2NyaXB0aW5nU2NvcGUuc2V0TW9kZWwodGhpcy4jc2NyaXB0TW9kZWwpO1xuICAgICAgLyoqIHByb3ZpZGUgYWNjZXNzIHRvIGFjdGlvbnMgKHVzZWQgaW5zaWRlIG9mIEJQTS1Gb3JtcykgKi9cbiAgICAgIHRoaXMuI3NjcmlwdGluZ1Njb3BlLmFjdGlvbnMgPSBhY3Rpb25zO1xuICAgICAgLyoqIHByb3ZpZGUgYWNjZXNzIHRvIGFkZGl0aW9uYWwgb2JqZWN0cyAodXNlZCBmb3IgZXhhbXBsZSBpbiBCUE0tU3RhcnQtRm9ybXMgdG9cbiAgICAgICAqIGFkZCBkYXRhIG9mIERNUy1PYmplY3RzIHRvIHN0YXJ0IHRoZSBwcm9jZXNzIGZvcilcbiAgICAgICAqL1xuICAgICAgdGhpcy4jc2NyaXB0aW5nU2NvcGUub2JqZWN0cyA9IG9iamVjdHMgfHwgW107XG4gICAgICB0aGlzLiNzY3JpcHRpbmdTY29wZS5jb250ZXh0ID0gY29udGV4dCB8fCB7IGlkOiAnJywgdGl0bGU6ICcnLCBvYmplY3RUeXBlSWQ6ICcnIH07XG4gICAgICAvKiogcHJvdmlkZSByZWFkb25seSBhY2Nlc3MgdG8gaW5pdGlhbCBmb3JtIGRhdGEgKHdoaWNoIG1heSBhbHNvIGNvbnRhaW4gdmFsdWVzIHRoYXRcbiAgICAgICAqIGFyZSBub3QgcmVuZGVyZWQgYXMgZm9ybSBlbGVtZW50cyAoaW52aXNpYmxlIHZhbHVlcykpXG4gICAgICAgKi9cbiAgICAgIHRoaXMuI3NjcmlwdGluZ1Njb3BlLmRhdGEgPSBkYXRhO1xuXG4gICAgICAvKiogYnkgZGVmYXVsdCwgc2NyaXB0aW5nIHNjb3BlcyBhcmUgYXBwbGllZCB0byBmb3Jtcy4gQnV0IHRhYmxlIGVsZW1lbnRzIGNyZWF0ZSB0aGVpciBvd24gc2NvcGVcbiAgICAgICAqIGZvciBlZGl0aW5nIHJvd3MuIEJlaW5nIG9uZSBvZiB0aG9zZSBpbm5lciBmb3JtcyBzaG91bGQgbm90IHJ1biB0aGUgZm9ybSBzY3JpcHQgYWdhaW4sIGJ1dFxuICAgICAgICogaW5zdGVhZCBqdXN0IHByb3ZpZGUgdGhlIG9ic2VydmluZyBhYmlsaXRpZXMgb2YgdGhlIHNjcmlwdGluZyBzY29wZS5cbiAgICAgICAqL1xuICAgICAgaWYgKCF0aGlzLmlzSW5uZXJUYWJsZUZvcm0oKSAmJiBkYXRhRm9ybU1vZGVsKSB7XG4gICAgICAgIGNvbnN0IHNjcmlwdE5hbWUgPSBkYXRhRm9ybU1vZGVsLm5hbWUgKyAnXycgKyBkYXRhRm9ybU1vZGVsLnNpdHVhdGlvbjtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnZXhlY3V0aW5nIGZvcm0gc2NyaXB0ICcgKyBzY3JpcHROYW1lKTtcbiAgICAgICAgdGhpcy4jZm9ybVNjcmlwdFNlcnZpY2UucnVuRm9ybVNjcmlwdCh0aGlzLiNzY3JpcHRpbmdTY29wZSwgZGF0YUZvcm1Nb2RlbC5zY3JpcHQsIHNjcmlwdE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvY3VzRm9ybSgpIHtcbiAgICB0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKS5mb2N1cygpO1xuICB9XG5cbiAgZ2V0R3JvdXAoaWQ6IHN0cmluZyk6IE9iamVjdEZvcm1Hcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybT8uZ2V0KGlkKSBhcyBPYmplY3RGb3JtR3JvdXA7XG4gIH1cblxuICBzZXRGb3JtRGF0YShkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGNvbnN0IGZvID0gdGhpcy5mb3JtT3B0aW9ucygpO1xuICAgIGlmICghZm8pIHJldHVybjtcbiAgICBmby5kYXRhID0gZGF0YTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuI2luaXQoZm8pLCAwKTtcbiAgfVxuXG4gIHBhdGNoVmFsdWUoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHRoaXMuI29uU2NyaXB0aW5nTW9kZWxDaGFuZ2VkKGtleSwge1xuICAgICAgICBuYW1lOiAndmFsdWUnLFxuICAgICAgICBuZXdWYWx1ZTogZGF0YVtrZXldXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgdmFsdWVzIGZyb20gdGhlIGZvcm0gbW9kZWwuIEVhY2ggZm9ybSB2YWx1ZSBpcyByZXByZXNlbnRlZCBieSBvbmVcbiAgICogcHJvcGVydHkgb24gdGhlIHJlc3VsdCBvYmplY3QgaG9sZGluZyB0aGUgZmllbGRzIHZhbHVlLiBUaGUga2V5cyAocHJvcGVydGllcykgYXJlIHRoZSBgbmFtZWBcbiAgICogcHJvcGVydGllcyBvZiB0aGUgZm9ybSBlbGVtZW50LlxuICAgKlxuICAgKiBIb3cgdmFsdWVzIGFyZSBleHRyYWN0ZWQgaXMgaW5mbHVlbmNlZCBieSB0aGUgZm9ybXMgc2l0dWF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIG9iamVjdCBvZiBrZXkgdmFsdWUgcGFpcnNcbiAgICovXG4gIGdldEZvcm1EYXRhKCkge1xuICAgIHJldHVybiB0aGlzLiNmb3JtVG9EYXRhKCk7XG4gIH1cblxuICBnZXRGb3JtRWxlbWVudHMoKSB7XG4gICAgY29uc3QgZm9ybUVsZW1lbnRzOiBhbnkgPSB7fTtcbiAgICBPYmplY3Qua2V5cyh0aGlzLiNmb3JtQ29udHJvbHMpLmZvckVhY2goKGspID0+IHtcbiAgICAgIGZvcm1FbGVtZW50c1trXSA9IHRoaXMuI2Zvcm1Db250cm9sc1trXS5fX2VvRm9ybUVsZW1lbnQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZvcm1FbGVtZW50cztcbiAgfVxuXG4gIHNldEZvcm1QcmlzdGluZSgpIHtcbiAgICBpZiAoIXRoaXMuZm9ybSkgcmV0dXJuO1xuICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICB9XG5cbiAgLy8gcmVzZXQgdGhlIGZvcm0gdG8gaXRzIGluaXRpYWwgc3RhdGVcbiAgcmVzZXRGb3JtKCkge1xuICAgIGNvbnN0IGZvID0gdGhpcy5mb3JtT3B0aW9ucygpO1xuICAgIGlmICghZm8pIHJldHVybjtcbiAgICB0aGlzLnNldEZvcm1EYXRhKGZvLmRhdGEpO1xuICAgIHRoaXMuI2VtaXRGb3JtQ2hhbmdlZEV2ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2JzZXJ2ZWQgbW9kZWwgdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSBjdXJyZW50IGZvcm0gc2NyaXB0IHJ1bm5pbmcuIElmIHRoZXJlIGlzXG4gICAqIG5vIGZvcm0gc2NyaXB0LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBOVUxMLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0T2JzZXJ2ZWRTY3JpcHRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy4jc2NyaXB0aW5nU2NvcGUgPyB0aGlzLiNzY3JpcHRpbmdTY29wZS5nZXRNb2RlbCgpIDogbnVsbDtcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIHJlYWN0aXZlIGZvcm0gZnJvbSB0aGUgZW5haW8gZm9ybSBtb2RlbFxuICAjYnVpbGRSZWFjdGl2ZUZvcm0oZm9ybU9wdGlvbnM6IE9iamVjdEZvcm1PcHRpb25zKSB7XG4gICAgdGhpcy4jc2NyaXB0aW5nU2NvcGUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy4jc2NyaXB0TW9kZWwgPSB7fTtcbiAgICB0aGlzLiNmb3JtQ29udHJvbHMgPSB7fTtcbiAgICBjb25zdCBmb3JtTW9kZWwgPSB0aGlzLiNkYXRhVG9Gb3JtKGZvcm1PcHRpb25zLmZvcm1Nb2RlbCwgZm9ybU9wdGlvbnMuZGF0YSk7XG5cbiAgICBpZiAoIWZvcm1Nb2RlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBpZiBhIHNjcmlwdCBpcyBhdmFpbGFibGUsIHdlJ2xsIGluaXQgdGhlIGZvcm0gc2NyaXB0aW5nIGZvciB0aGVcbiAgICAvLyBjdXJyZW50IGZvcm1cbiAgICBpZiAodGhpcy5pc0lubmVyVGFibGVGb3JtKCkgfHwgKGZvcm1Nb2RlbC5zY3JpcHQgJiYgZm9ybU1vZGVsLnNjcmlwdC5sZW5ndGggPiAwKSkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnYWRkaW5nIGZvcm0gc2NyaXB0aW5nIHNjb3BlJyk7XG4gICAgICB0aGlzLiNzY3JpcHRpbmdTY29wZSA9IG5ldyBPYmplY3RGb3JtU2NyaXB0aW5nU2NvcGUoXG4gICAgICAgIGZvcm1Nb2RlbC5zaXR1YXRpb24sXG4gICAgICAgIHRoaXMuI29uU2NyaXB0aW5nTW9kZWxDaGFuZ2VkLFxuICAgICAgICB0aGlzLiNmb3JtU2NyaXB0aW5nQXBpU2VydmljZS5nZXRBcGkoKSxcbiAgICAgICAgdGhpcy5pc0lubmVyVGFibGVGb3JtKClcbiAgICAgICk7XG4gICAgICB0aGlzLiNzY3JpcHRpbmdTY29wZS5vYmplY3RJZCA9IHRoaXMuZm9ybU9wdGlvbnMoKSEub2JqZWN0SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybSA9IG5ldyBPYmplY3RGb3JtR3JvdXAoe30pO1xuICAgIGlmIChmb3JtTW9kZWw/LmVsZW1lbnRzWzBdPy5lbGVtZW50cykge1xuICAgICAgdGhpcy4jYWRkRm9ybUNvbnRyb2woZm9ybSwgZm9ybU1vZGVsLmVsZW1lbnRzWzBdLCAnY29yZScpO1xuICAgIH1cbiAgICBpZiAoZm9ybU1vZGVsPy5lbGVtZW50c1sxXT8uZWxlbWVudHMpIHtcbiAgICAgIHRoaXMuI2FkZEZvcm1Db250cm9sKGZvcm0sIGZvcm1Nb2RlbC5lbGVtZW50c1sxXSwgJ2RhdGEnKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtID0gZm9ybTtcbiAgICB0aGlzLiNmb3JtU2NyaXB0aW5nQXBpU2VydmljZS5yZWdpc3RlckFjdGl2ZUZvcm0odGhpcyk7XG4gICAgY29uc29sZS5sb2coJ2Zvcm0nLCBmb3JtKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb3JtKSByZXR1cm47XG4gICAgICB0aGlzLmluaXRWYWxpZGF0b3JzKHRoaXMuZm9ybSk7XG4gICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLnB1c2godGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSg1MDApKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy4jZW1pdEZvcm1DaGFuZ2VkRXZlbnQoKSkpO1xuXG4gICAgICB0aGlzLiNpbml0U2NyaXB0aW5nU2NvcGUoZm9ybU9wdGlvbnMsIGZvcm1Nb2RlbCk7XG5cbiAgICAgIHRoaXMub25Gb3JtUmVhZHkuZW1pdCgpO1xuICAgICAgdGhpcy4jZW1pdEZvcm1DaGFuZ2VkRXZlbnQoZmFsc2UpO1xuICAgIH0sIDMwMCk7XG4gIH1cblxuICBpbml0VmFsaWRhdG9ycyhmb3JtOiBhbnkpIHtcbiAgICBpZiAodGhpcy5mb3JtKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKSkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybS5jb250cm9sc1trZXldO1xuICAgICAgICBpZiAoY29udHJvbC5jb250cm9scykge1xuICAgICAgICAgIHRoaXMuaW5pdFZhbGlkYXRvcnMoY29udHJvbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4jaW5pdGlhbFZhbGlkYXRvcnNbY29udHJvbC5fZW9Gb3JtRWxlbWVudC5uYW1lXSA9IGNvbnRyb2wudmFsaWRhdG9yO1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLmNvbXBvc2UodGhpcy4jZ2V0VmFsaWRhdG9ycyhjb250cm9sLl9lb0Zvcm1FbGVtZW50KS5jb25jYXQoW3RoaXMuI2luaXRpYWxWYWxpZGF0b3JzW2NvbnRyb2wuX2VvRm9ybUVsZW1lbnQubmFtZV1dKSkpO1xuICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2VtaXRGb3JtQ2hhbmdlZEV2ZW50KGNvbXBhcmUgPSB0cnVlKSB7XG4gICAgLy8gY2hlY2sgaWYgaW5kZXhkYXRhIGhhcyBiZWVuIGNoYW5nZWRcbiAgICBjb25zdCBjdXJyZW50Rm9ybURhdGEgPSB0aGlzLmdldEZvcm1EYXRhKCk7XG4gICAgY29uc3QgaWR4Q2hhbmdlID0gY29tcGFyZSA/IEpTT04uc3RyaW5naWZ5KHRoaXMuZm9ybURhdGEpICE9PSBKU09OLnN0cmluZ2lmeShjdXJyZW50Rm9ybURhdGEpIDogZmFsc2U7XG4gICAgdGhpcy5mb3JtRGF0YSA9IGN1cnJlbnRGb3JtRGF0YTtcbiAgICBpZiAodGhpcy5mb3JtKSB7XG4gICAgICB0aGlzLnN0YXR1c0NoYW5nZWQuZW1pdCh7XG4gICAgICAgIGludmFsaWQ6IHRoaXMuZm9ybS5pbnZhbGlkLFxuICAgICAgICBkaXJ0eTogdGhpcy5mb3JtLmRpcnR5LFxuICAgICAgICBkYXRhOiB0aGlzLmZvcm1EYXRhLFxuICAgICAgICBpbmRleGRhdGFDaGFuZ2VkOiBpZHhDaGFuZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgdGhlIHNjcmlwdCBjaGFuZ2VzIGl0cyBpbnRlcm5hbCBtb2RlbC5cbiAgICogSXQgaXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgc2NyaXB0IGNoYW5nZXMgdG8gdGhlIGFjdHVhbCBmb3JtIG1vZGVsLlxuICAgKlxuICAgKiBUbyBlbnN1cmUgdGhlIHJpZ2h0IGNvbnRleHQsIHdlIGRlZmluZSBhbiBpbnN0YW5jZSBtZXRob2QgYXMgY2FsbGJhY2sgZm9yIHRoZSBzY3JpcHRpbmcgc2NvcGVcbiAgICogQHNlZTogaHR0cHM6Ly9ibG9nLmpvaG5ueXJlaWxseS5jb20vMjAxNC8wNC90eXBlc2NyaXB0LWluc3RhbmNlLW1ldGhvZHMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gZm9ybUNvbnRyb2xOYW1lXG4gICAqIEBwYXJhbSBjaGFuZ2VcbiAgICovXG4gICNvblNjcmlwdGluZ01vZGVsQ2hhbmdlZCA9IChmb3JtQ29udHJvbE5hbWU6IHN0cmluZywgY2hhbmdlOiBPYmplY3RGb3JtTW9kZWxDaGFuZ2UsIGZvcm1JZD86IHN0cmluZykgPT4ge1xuICAgIGlmICghdGhpcy5mb3JtIHx8IChmb3JtSWQgJiYgdGhpcy5pZCAhPT0gZm9ybUlkKSkgcmV0dXJuO1xuICAgIC8vIGZpbmQgdGhlIHRhcmdldCBjb250cm9sXG4gICAgY29uc3QgZmM6IE9iamVjdEZvcm1Db250cm9sID0gdGhpcy4jZm9ybUNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0gYXMgT2JqZWN0Rm9ybUNvbnRyb2w7XG4gICAgaWYgKGZjKSB7XG4gICAgICAvLyBjaGFuZ2Ugb25seSBhbGxvd2VkIHByb3BlcnRpZXNcbiAgICAgIHN3aXRjaCAoY2hhbmdlLm5hbWUpIHtcbiAgICAgICAgY2FzZSAndmFsdWUnOiB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hhbmdlLm5ld1ZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy4jcHJvY2Vzc0FycmF5VmFsdWVDaGFuZ2UoZmMsIGNoYW5nZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LnZhbHVlID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgICAgaWYgKGZjLnZhbHVlICE9PSBjaGFuZ2UubmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgZmMucGF0Y2hWYWx1ZShjaGFuZ2UubmV3VmFsdWUpO1xuICAgICAgICAgICAgICBmYy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICAgIGZjLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZm9ybS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3JlcXVpcmVkJzoge1xuICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LnJlcXVpcmVkID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgIC8vIGFwcGx5IG5ldyB2YWxpZGF0b3JzXG4gICAgICAgICAgLy8gQHNlZTogaHR0cHM6Ly9zY290Y2guaW8vdHV0b3JpYWxzL2hvdy10by1pbXBsZW1lbnQtY29uZGl0aW9uYWwtdmFsaWRhdGlvbi1pbi1hbmd1bGFyLTItbW9kZWwtZHJpdmVuLWZvcm1zXG4gICAgICAgICAgZmMuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLmNvbXBvc2UodGhpcy4jZ2V0VmFsaWRhdG9ycyhmYy5fZW9Gb3JtRWxlbWVudCkuY29uY2F0KFt0aGlzLiNpbml0aWFsVmFsaWRhdG9yc1tmYy5fZW9Gb3JtRWxlbWVudC5uYW1lXV0pKSk7XG4gICAgICAgICAgLy8gbmVlZCB0byBtYXJrIGZvcm0gY29udHJvbCBhcyB0b3VjaGVkIGJlY2F1c2Ugb3RoZXJ3aXNlIGZvcm0gdmFsaWRhdGlvbiB3aWxsIG5vdCBzaG93XG4gICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgICBmYy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgZmMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3JlYWRvbmx5Jzoge1xuICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LnJlYWRvbmx5ID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgIGlmIChjaGFuZ2UubmV3VmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGZjLmRpc2FibGUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmMuZW5hYmxlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LmVycm9yID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgICAgICAgIGZjLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICBmYy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmV3IG9ucm93ZWRpdCBmdW5jdGlvbiB3YXMgYXBwbGllZCBieSB0aGUgc2NyaXB0XG4gICAgICAgIGNhc2UgJ29ucm93ZWRpdCc6IHtcbiAgICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5vbnJvd2VkaXQgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmV3IG9uY2hhbmdlIGZ1bmN0aW9uIHdhcyBhcHBsaWVkIGJ5IHRoZSBzY3JpcHRcbiAgICAgICAgY2FzZSAnb25jaGFuZ2UnOiB7XG4gICAgICAgICAgZmMuX2VvRm9ybUVsZW1lbnQub25jaGFuZ2UgPSBjaGFuZ2UubmV3VmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuI2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH07XG5cbiAgI3Byb2Nlc3NBcnJheVZhbHVlQ2hhbmdlKGZjOiBhbnksIGNoYW5nZTogYW55KSB7XG4gICAgY29uc3QgbmV3VmFsID0gY2hhbmdlLm5ld1ZhbHVlO1xuICAgIGNvbnN0IHRhcmdldFR5cGUgPSBmYy5fZW9Gb3JtRWxlbWVudC50eXBlO1xuICAgIC8vIGZvciBzb21lIHR5cGVzIHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgbWV0YSBkYXRhIGFyZSBwcm92aWRlZCBhcyB3ZWxsXG4gICAgc3dpdGNoICh0YXJnZXRUeXBlKSB7XG4gICAgICBjYXNlICdPUkdBTklaQVRJT04nOiB7XG4gICAgICAgIHRoaXMuI2dldERhdGFNZXRhKGZjLl9lb0Zvcm1FbGVtZW50LCBuZXdWYWwpLnN1YnNjcmliZSgobSkgPT4ge1xuICAgICAgICAgIGZjLl9lb0Zvcm1FbGVtZW50LmRhdGFNZXRhID0gbTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnVEFCTEUnOiB7XG4gICAgICAgIGNvbnN0IGRhdGFUb0JlUHJvY2Vzc2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICBmYy5fZW9Gb3JtRWxlbWVudC5lbGVtZW50cy5mb3JFYWNoKChlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZS50eXBlID09PSAnT1JHQU5JWkFUSU9OJyB8fCBlLnR5cGUgPT09ICdDT0RFU1lTVEVNJykge1xuICAgICAgICAgICAgZGF0YVRvQmVQcm9jZXNzZWRbZS5uYW1lXSA9IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGFUb0JlUHJvY2Vzc2VkKS5sZW5ndGgpIHtcbiAgICAgICAgICBuZXdWYWwuZm9yRWFjaCgocm93RGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhyb3dEYXRhKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGRhdGFUb0JlUHJvY2Vzc2VkW2tleV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNnZXREYXRhTWV0YShkYXRhVG9CZVByb2Nlc3NlZFtrZXldLCByb3dEYXRhW2tleV0pLnN1YnNjcmliZSgobSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YVtrZXkgKyAnX21ldGEnXSA9IG07XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm93RGF0YVtrZXkgKyAnX21ldGEnXTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMuI3VwZGF0ZUFycmF5VmFsdWUoZmMsIG5ld1ZhbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiN1cGRhdGVBcnJheVZhbHVlKGZjLCBuZXdWYWwpO1xuICB9XG5cbiAgI3VwZGF0ZUFycmF5VmFsdWUoZmM6IGFueSwgbmV3VmFsdWU6IGFueSkge1xuICAgIGZjLl9lb0Zvcm1FbGVtZW50LnZhbHVlID0gW10uY29uY2F0KG5ld1ZhbHVlKTtcbiAgICBmYy5wYXRjaFZhbHVlKFtdLmNvbmNhdChuZXdWYWx1ZSkpO1xuICAgIGZjLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICBmYy5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgI2dldERhdGFNZXRhKGZvcm1FbGVtZW50OiBhbnksIG5ld1ZhbHVlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmIChuZXdWYWx1ZSkge1xuICAgICAgc3dpdGNoIChmb3JtRWxlbWVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ09SR0FOSVpBVElPTic6IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy4jdXNlclNlcnZpY2UuZ2V0VXNlckJ5SWQobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZihudWxsKTtcbiAgfVxuXG4gICNwYXRjaEZvcm1WYWx1ZShmb3JtVmFsdWU6IHN0cmluZ1tdIHwgc3RyaW5nKSB7XG4gICAgbGV0IHZhbHVlOiBhbnk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZm9ybVZhbHVlKSkge1xuICAgICAgdmFsdWUgPSBbXTtcbiAgICAgIC8vIGNvcHkgYnkgdmFsdWUgZm9yIGFycmF5cyBvZiBvYmplY3RzIChlLmcuIHRhYmxlIGRhdGEpXG4gICAgICBmb3JtVmFsdWUuZm9yRWFjaCgobykgPT4gdmFsdWUucHVzaChKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG8pKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IGZvcm1WYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZSBtZXRob2QgYWRkaW5nIGEgbmV3IEZvcm1Db250cm9sIChncm91cCBvciBjb250cm9sKSB0byBhIHBhcmVudCBmb3JtIGdyb3VwXG4gICAqXG4gICAqIEBwYXJhbSBwYXJlbnRHcm91cCAtIHRoZSBwYXJlbnQgZ3JvdXAgdG8gYWRkIHRoZSBjb250cm9sIHRvXG4gICAqIEBwYXJhbSBmb3JtRWxlbWVudCAtIHRoZSBlbmFpbyBmb3JtIG1vZGVsIGVsZW1lbnQgdG8gY3JlYXRlIHRoZSBjaGlsZCBjb250cm9sIGZyb21cbiAgICogQHBhcmFtIFt1c2VOYW1lXSAtIHVzZSB0aGlzIG5hbWUgaW5zdGVhZCBvZiB0aGUgb25lIGZyb20gdGhlIG1vZGVsXG4gICAqL1xuICAjYWRkRm9ybUNvbnRyb2wocGFyZW50R3JvdXA6IE9iamVjdEZvcm1Hcm91cCwgZm9ybUVsZW1lbnQ6IGFueSwgdXNlTmFtZT86IHN0cmluZykge1xuICAgIGNvbnN0IGZvID0gdGhpcy5mb3JtT3B0aW9ucygpO1xuICAgIGlmICghZm8pIHJldHVybjtcblxuICAgIGxldCBjdHJsO1xuICAgIGxldCBuYW1lO1xuXG4gICAgLy8gYWRkIGEgZm9ybSBncm91cFxuICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnbzJtR3JvdXAnIHx8IGZvcm1FbGVtZW50LnR5cGUgPT09ICdvMm1Hcm91cFN0YWNrJykge1xuICAgICAgLy8gZG8gbm90IGFkZCBncm91cHMgdGhhdCBhcmUgZW1wdHlcbiAgICAgIGNvbnN0IGlzUm9vdEdyb3VwID0gZm9ybUVsZW1lbnQubmFtZSAmJiAoZm9ybUVsZW1lbnQubmFtZSAhPT0gJ2RhdGEnIHx8IGZvcm1FbGVtZW50Lm5hbWUgIT09ICdjb3JlJyk7XG4gICAgICBpZiAoIWlzUm9vdEdyb3VwICYmICghZm9ybUVsZW1lbnQuZWxlbWVudHMgfHwgZm9ybUVsZW1lbnQuZWxlbWVudHMubGVuZ3RoID09PSAwKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGb3VuZCBlbXB0eSBmb3JtIGdyb3VwJywgZm9ybUVsZW1lbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGN0cmwgPSBuZXcgT2JqZWN0Rm9ybUdyb3VwKHt9KTtcbiAgICAgIGN0cmwuX2VvRm9ybUdyb3VwID0ge1xuICAgICAgICBsYXlvdXQ6IGZvcm1FbGVtZW50LmxheW91dCxcbiAgICAgICAgdHlwZTogZm9ybUVsZW1lbnQudHlwZVxuICAgICAgfTtcblxuICAgICAgaWYgKGZvcm1FbGVtZW50Lm5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuI3NraXBUcmFuc2xhdGlvbnNGb3IuaW5jbHVkZXMoZm9ybUVsZW1lbnQubmFtZSkpIHtcbiAgICAgICAgICBjdHJsLl9lb0Zvcm1Hcm91cC5sYWJlbCA9IGZvcm1FbGVtZW50Lm5hbWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIWZvcm1FbGVtZW50LmxhYmVsKSB7XG4gICAgICAgICAgLy8gbm8gbGFiZWwsIHNvIHRyeSB0byB0cmFuc2xhdGUgdGhlIHRlY2huaWNhbCBuYW1lXG4gICAgICAgICAgY3RybC5fZW9Gb3JtR3JvdXAubGFiZWwgPSB0aGlzLiNzeXN0ZW1TZXJ2aWNlLmdldExvY2FsaXplZFJlc291cmNlKGAke2Zvcm1FbGVtZW50Lm5hbWV9X2xhYmVsYCkgfHwgZm9ybUVsZW1lbnQubmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGVyZSBpcyBhIGxhYmVsIHNvIHdlIHRha2UgdGhpcyBvbmVcbiAgICAgICAgICBjdHJsLl9lb0Zvcm1Hcm91cC5sYWJlbCA9IGZvcm1FbGVtZW50LmxhYmVsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh1c2VOYW1lID09PSAnY29yZScgfHwgdXNlTmFtZSA9PT0gJ2RhdGEnKSB7XG4gICAgICAgIGN0cmwuX2VvRm9ybUdyb3VwLmxhYmVsID0gdXNlTmFtZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBlIG9mIGZvcm1FbGVtZW50LmVsZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuI2FkZEZvcm1Db250cm9sKGN0cmwsIGUpO1xuICAgICAgfVxuICAgICAgbmFtZSA9IHVzZU5hbWUgfHwgJ2ZnJyArIHRoaXMuZ0NvdW50Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFkZCBmb3JtIGNvbnRyb2xcbiAgICAgIC8vIFRvIGJlIGFibGUgdG8gaW50ZWdyYXRlIHJlY3Vyc2l2ZSBmb3JtIGNvbnRyb2xzIGludG8gdGhlIG1haW4gZm9ybSxcbiAgICAgIC8vIHdlIGhhdmUgdG8gd3JhcCB0aGVtIGluIGEgZm9ybSBncm91cFxuICAgICAgY3RybCA9IG5ldyBPYmplY3RGb3JtQ29udHJvbFdyYXBwZXIoe30pO1xuICAgICAgY3RybC5fZW9Gb3JtQ29udHJvbFdyYXBwZXIgPSB7XG4gICAgICAgIC8vIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVkIEZvcm1Db250cm9sXG4gICAgICAgIGNvbnRyb2xOYW1lOiBmb3JtRWxlbWVudC5uYW1lLFxuICAgICAgICBzaXR1YXRpb246IGZvLmZvcm1Nb2RlbC5zaXR1YXRpb25cbiAgICAgIH07XG5cbiAgICAgIC8vIGRvIG5vdCBzZXQgYSByZWZlcmVuY2UgYXMgdGhlIGZvcm0gY29udHJvbHMgdmFsdWVcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBjb3VsZCBub3QgcmVzZXQgdGhlIGZvcm1cbiAgICAgIGNvbnN0IHZhbHVlID0gZm9ybUVsZW1lbnQ/LnZhbHVlXG4gICAgICAgID8gdGhpcy4jcGF0Y2hGb3JtVmFsdWUoZm9ybUVsZW1lbnQ/LnZhbHVlKVxuICAgICAgICA6ICFVdGlscy5pc0VtcHR5KGZvcm1FbGVtZW50Py5kZWZhdWx0dmFsdWUpICYmIGZvLmZvcm1Nb2RlbC5zaXR1YXRpb24gPT09IFNpdHVhdGlvbi5DUkVBVEVcbiAgICAgICAgICA/IHRoaXMuI3BhdGNoRm9ybVZhbHVlKGZvcm1FbGVtZW50Py5kZWZhdWx0dmFsdWUpXG4gICAgICAgICAgOiBmb3JtRWxlbWVudD8udmFsdWU7XG5cbiAgICAgIC8vIGNyZWF0ZSB0aGUgYWN0dWFsIGZvcm0gY29udHJvbFxuICAgICAgY29uc3QgY29udHJvbERpc2FibGVkID0gZm8uZGlzYWJsZWQgfHwgISFmb3JtRWxlbWVudC5yZWFkb25seTtcbiAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gbmV3IE9iamVjdEZvcm1Db250cm9sKHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGRpc2FibGVkOiBjb250cm9sRGlzYWJsZWRcbiAgICAgIH0pO1xuXG4gICAgICAvLyBpZiBmb3JtIGVsZW1lbnQgaGFzIGEgJ2xhYmVsJyBwcm9wZXJ0eSBpdCB3aWxsIGJlIHNob3duIGFzIGlzIC4uLlxuICAgICAgaWYgKCFmb3JtRWxlbWVudC5sYWJlbCkge1xuICAgICAgICAvLyAuLi4gaWYgdGhlcmUgaXMgbm8gbGFiZWwgYnV0IGEgJ2xhYmVsS2V5JyBwcm9wZXJ0eSB3ZSBhcmUgZ29pbmcgdG8gbG9jYWxpemUgdGhhdCBrZXkgLi4uXG4gICAgICAgIGlmIChmb3JtRWxlbWVudC5sYWJlbGtleSkge1xuICAgICAgICAgIGZvcm1FbGVtZW50LmxhYmVsID0gdGhpcy4jc3lzdGVtU2VydmljZS5nZXRMb2NhbGl6ZWRSZXNvdXJjZShgJHtmb3JtRWxlbWVudC5sYWJlbGtleX1fbGFiZWxgKSB8fCBmb3JtRWxlbWVudC5sYWJlbGtleTtcbiAgICAgICAgICBmb3JtRWxlbWVudC5kZXNjcmlwdGlvbiA9IHRoaXMuI3N5c3RlbVNlcnZpY2UuZ2V0TG9jYWxpemVkUmVzb3VyY2UoYCR7Zm9ybUVsZW1lbnQubGFiZWxrZXl9X2Rlc2NyaXB0aW9uYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gLi4uIG5vICdsYWJlbCcgYW5kIGFsc28gbm8gJ2xhYmVsS2V5JyBtZWFucyB0aGF0IHdlIGFyZSBzaG93aW5nIHRlY2huaWNhbCBuYW1lIGluc3RlYWRcbiAgICAgICAgICBmb3JtRWxlbWVudC5sYWJlbCA9IGZvcm1FbGVtZW50Lm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvcm1FbGVtZW50LnJlYWRvbmx5ID0gY29udHJvbERpc2FibGVkO1xuICAgICAgLy8gd2UgYXJlIHVzaW5nIGFuIGludGVybmFsIHR5cGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgY29tcG9uZW50c1xuICAgICAgLy8gdG8gYmUgdXNlZCB0byByZW5kZXIgY2VydGFpbiBmb3JtIGVsZW1lbnRzXG4gICAgICBmb3JtRWxlbWVudC5faW50ZXJuYWxUeXBlID0gdGhpcy4jc3lzdGVtU2VydmljZS5nZXRJbnRlcm5hbEZvcm1FbGVtZW50VHlwZShmb3JtRWxlbWVudC50eXBlLCBmb3JtRWxlbWVudC5jbGFzc2lmaWNhdGlvbnMpO1xuXG4gICAgICBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudCA9IGZvcm1FbGVtZW50O1xuICAgICAgdGhpcy4jZm9ybUNvbnRyb2xzW2Zvcm1FbGVtZW50Lm5hbWVdID0gZm9ybUNvbnRyb2w7XG5cbiAgICAgIGlmIChmb3JtRWxlbWVudC50eXBlID09PSAnVEFCTEUnKSB7XG4gICAgICAgIC8vIEFkZCAnb25yb3dlZGl0JyBwcm9wZXJ0eSBldmVuIGlmIGl0J3Mgbm90IHNldC5cbiAgICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIG90aGVyd2lzZSBtb2JYLU9ic2VydmVyIHdvdWxkIG5vdCByZWNvZ25pemVcbiAgICAgICAgLy8gY2hhbmdlcyB0byB0aGlzIHByb3BlcnR5IGFwcGxpZWQgYnkgdGhlIGZvcm0gc2NyaXB0XG4gICAgICAgIGlmICghT2JqZWN0LmtleXMoZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQpLmluY2x1ZGVzKCdvbnJvd2VkaXQnKSkge1xuICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50Lm9ucm93ZWRpdCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy4jc2NyaXB0aW5nU2NvcGUgJiYgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQudmFsdWUpIHtcbiAgICAgICAgICAvLyBoYXZpbmcgYSBzY3JpcHRpbmcgc2NvcGUgYW5kIHRhYmxlIHJvd3MgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHNldCBlbXB0eVxuICAgICAgICAgIC8vIGNvbHVtbnMgdG8gTlVMTCwgYmVjYXVzZSBvdGhlcndpc2UgbW9iWCB3b24ndCBiZSBhYmxlIHRvIHRyYWNrIHRob3NlIHZhbHVlc1xuICAgICAgICAgIGNvbnN0IHZhbHVlRmllbGRzID0gZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQuZWxlbWVudHMubWFwKChlOiBhbnkpID0+IGUubmFtZSk7XG4gICAgICAgICAgZm9ybUNvbnRyb2wuX2VvRm9ybUVsZW1lbnQudmFsdWUuZm9yRWFjaCgocm93VmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdmFsdWVGaWVsZHMuZm9yRWFjaCgodmFsdWVGaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXMocm93VmFsdWUpLmluY2x1ZGVzKHZhbHVlRmllbGQpKSB7XG4gICAgICAgICAgICAgICAgcm93VmFsdWVbdmFsdWVGaWVsZF0gPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyB1cGRhdGUgZm9ybSBjb250cm9scyB2YWx1ZSBhcyB3ZWxsIHRvIHJlZmxlY3QgdGhlIG9ic2VydmVkIHZhbHVlXG4gICAgICAgICAgZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudC52YWx1ZSwge1xuICAgICAgICAgICAgb25seVNlbGY6IHRydWUsXG4gICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGVtaXRWaWV3VG9Nb2RlbENoYW5nZTogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybUVsZW1lbnQuX2ludGVybmFsVHlwZSA9PT0gJ3N0cmluZzpvcmdhbml6YXRpb24nKSB7XG4gICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LnNldEZpbHRlciA9IChmaWx0ZXJPYmplY3Q6IGFueSkgPT4ge1xuICAgICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmZpbHRlciA9IGZpbHRlck9iamVjdDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0Rm9ybVV0aWxzLnVwZGF0ZUZvcm1FbGVtZW50KGZvcm1FbGVtZW50KTtcblxuICAgICAgLy8gcmVtb3ZlIGVtcHR5IGRlc2NyaXB0aW9uc1xuICAgICAgY29uc3QgZGVzYyA9IGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmRlc2NyaXB0aW9uO1xuICAgICAgaWYgKGRlc2MgJiYgZGVzYy50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGZvcm1Db250cm9sLl9lb0Zvcm1FbGVtZW50LmRlc2NyaXB0aW9uID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSBmb3JtIGVsZW1lbnQgdG8gdGhlIHNjcmlwdCBtb2RlbCB0aGF0IHdpbGwgYmUgaW5qZWN0ZWQgaW50b1xuICAgICAgLy8gdGhlIGZvcm1zIHNjcmlwdGluZyBzY29wZSBsYXRlciBvblxuICAgICAgdGhpcy4jc2NyaXB0TW9kZWxbZm9ybUVsZW1lbnQubmFtZV0gPSBmb3JtQ29udHJvbC5fZW9Gb3JtRWxlbWVudDtcblxuICAgICAgLy8gYXBwbHkgY2hhbmdlIGxpc3RlbmVyIHRvIHRoZSBmb3JtIGNvbnRyb2wsIHRoYXQgd2lsbCB0cmlnZ2VyXG4gICAgICAvLyB0aGUgZm9ybSBlbGVtZW50cyBvbkNoYW5nZSBsaXN0ZW5lclxuICAgICAgY29uc3QgY29udHJvbFdhdGNoID0gY3RybC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoNTAwKSk7XG4gICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgIGNvbnRyb2xXYXRjaC5zdWJzY3JpYmUoKHYpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy4jc2NyaXB0aW5nU2NvcGUpIHtcbiAgICAgICAgICAgIHRoaXMuI3NjcmlwdGluZ1Njb3BlLm1vZGVsQ2hhbmdlZCh2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjdHJsLmFkZENvbnRyb2woZm9ybUVsZW1lbnQubmFtZSwgZm9ybUNvbnRyb2wpO1xuICAgICAgbmFtZSA9IHRoaXMuI25hbWVQcmVmaXggKyBmb3JtRWxlbWVudC5uYW1lO1xuICAgIH1cbiAgICBwYXJlbnRHcm91cC5hZGRDb250cm9sKG5hbWUsIGN0cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHZhbGlkYXRvcnMgZm9yIHRoZSBnaXZlbiBmb3JtIGVsZW1lbnQgdG8gYmUgYXR0YWNoZWQgdG9cbiAgICogYSByZWFjdGl2ZSBmb3JtQ29udHJvbC5cbiAgICpcbiAgICogQHBhcmFtIGZvcm1FbGVtZW50IC0gZm9ybSBlbGVtZW50IG9iamVjdFxuICAgKi9cbiAgI2dldFZhbGlkYXRvcnMoZm9ybUVsZW1lbnQ6IGFueSk6IFZhbGlkYXRvckZuW10ge1xuICAgIGNvbnN0IGZvID0gdGhpcy5mb3JtT3B0aW9ucygpO1xuICAgIGNvbnN0IGVsbVZhbGlkYXRvcnMgPSBGb3JtVmFsaWRhdGlvbi5nZXRWYWxpZGF0b3JzKGZvcm1FbGVtZW50LCBmbz8uZm9ybU1vZGVsLnNpdHVhdGlvbik7XG5cbiAgICAvLyBhZGQgY3VzdG9tIHZhbGlkYXRvciBmb3Igc2NyaXB0IGVuYWJsZWQgZm9ybXNcbiAgICBpZiAodGhpcy4jc2NyaXB0aW5nU2NvcGUpIHtcbiAgICAgIGVsbVZhbGlkYXRvcnMucHVzaChGb3JtVmFsaWRhdGlvbi5jdXN0b21TY3JpcHRpbmdWYWxpZGF0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxtVmFsaWRhdG9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IHRoZSB2YWx1ZXMgZnJvbSB0aGUgZm9ybVxuICAgKi9cbiAgI2Zvcm1Ub0RhdGEoKSB7XG4gICAgY29uc3QgZm8gPSB0aGlzLmZvcm1PcHRpb25zKCk7XG4gICAgcmV0dXJuIGZvICYmIHRoaXMuZm9ybSA/IHRoaXMuI2Zvcm1IZWxwZXJTZXJ2aWNlLmV4dHJhY3RGb3JtRGF0YSh0aGlzLmZvcm0sIGZvLmZvcm1Nb2RlbC5zaXR1YXRpb24sIGZvLmRhdGEsIHRoaXMuaXNJbm5lclRhYmxlRm9ybSgpKSA6IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIGRhdGEgaW50byBhIGZvcm0gbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RlbCAtIGZvcm0gbW9kZWxcbiAgICogQHBhcmFtIGRhdGEgLSBkYXRhIG9iamVjdCBvciBhcnJheSBvZiBTZWFyY2hGaWx0ZXIgb2JqZWN0cyBpbiBjYXNlIG9mIGEgc2VhcmNoIGZvcm1cbiAgICovXG4gICNkYXRhVG9Gb3JtKG1vZGVsOiBhbnksIGRhdGE6IGFueSkge1xuICAgIGlmIChtb2RlbCAmJiBkYXRhKSB7XG4gICAgICB0aGlzLiNzZXRFbGVtZW50VmFsdWVzKG1vZGVsLmVsZW1lbnRzLCBkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLy8gcmVjdXJzaXZlIG1ldGhvZCBmb3IgYWRkaW5nIHZhbHVlcyB0byBtb2RlbCBlbGVtZW50c1xuICAjc2V0RWxlbWVudFZhbHVlcyhlbGVtZW50czogYW55W10sIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgZWxlbWVudHM/LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLiNoYXNWYWx1ZShkYXRhLCBlbGVtZW50KSkge1xuICAgICAgICBlbGVtZW50LnZhbHVlID0gdGhpcy4jZ2V0VmFsdWUoZGF0YSwgZWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgZWxlbWVudC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChlbGVtZW50LnR5cGUgIT09ICdUQUJMRScgJiYgZWxlbWVudC5lbGVtZW50cyAmJiBlbGVtZW50LmVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy4jc2V0RWxlbWVudFZhbHVlcyhlbGVtZW50LmVsZW1lbnRzLCBkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gICNoYXNWYWx1ZShkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZWxlbWVudDogYW55KSB7XG4gICAgLy8gZGlmZmVyIGJldHdlZW4gYXJyYXkgb2YgU2VhcmNoRmlsdGVycyBhbmQgYSBmb3JtIGRhdGEgb2JqZWN0XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybiAhIWRhdGEuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIucHJvcGVydHkgPT09IGVsZW1lbnQuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoZGF0YSkuaW5jbHVkZXMoZWxlbWVudC5uYW1lKTtcbiAgICB9XG4gIH1cblxuICAjZ2V0VmFsdWUoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGVsZW1lbnQ6IGFueSkge1xuICAgIHJldHVybiBkYXRhW2VsZW1lbnQubmFtZV07XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQWxsKCk7XG4gICAgdGhpcy4jZm9ybVNjcmlwdGluZ0FwaVNlcnZpY2UudW5yZWdpc3RlckFjdGl2ZUZvcm0odGhpcyk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy4jY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLy8gdW5zdWJzY3JpYmUgZnJvbSBhbGwgdmFsdWUgY2hhbmdlIGxpc3RlbmVycyBmb3IgdGhlIGN1cnJlbnQgZm9ybVxuICAvLyB0byBhdm9pZCBtZW1vcnkgbGVha3MuIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBiZSBjYWxsZWQgZXZlcnkgdGltZVxuICAvLyBhIG5ldyBmb3JtIGlzIHJlbmRlcmVkIHRvIGdldCByaWQgb2YgdGhlIG9sZCBmb3JtIGVsZW1lbnQgc3Vic2NyaXB0aW9uc1xuICBwcml2YXRlIHVuc3Vic2NyaWJlQWxsKCkge1xuICAgIGlmICh0aGlzLiNzdWJzY3JpcHRpb25zLmxlbmd0aCkge1xuICAgICAgY29uc29sZS5kZWJ1ZygndW5zdWJzY3JpYmVkIGZyb20gJyArIHRoaXMuI3N1YnNjcmlwdGlvbnMubGVuZ3RoICsgJyB2YWx1ZSBjaGFuZ2UgbGlzdGVuZXJzLicpO1xuICAgICAgdGhpcy4jc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgdGhpcy4jc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIH1cbiAgfVxufVxuIiwiQGxldCBmbyA9IGZvcm1PcHRpb25zKCk7XG5AaWYgKGZvICYmIGZvcm0pIHtcbiAgPGRpdiBjbGFzcz1cInl1di1vYmplY3QtZm9ybVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWVsZW1lbnQtd3JhcCBjb3JlXCI+XG4gICAgICA8eXV2LW9iamVjdC1mb3JtLWdyb3VwIFtncm91cF09XCJnZXRHcm91cCgnY29yZScpXCIgW3NpdHVhdGlvbl09XCJmby5mb3JtTW9kZWwuc2l0dWF0aW9uXCI+PC95dXYtb2JqZWN0LWZvcm0tZ3JvdXA+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZWxlbWVudC13cmFwIGRhdGFcIj5cbiAgICAgIDx5dXYtb2JqZWN0LWZvcm0tZ3JvdXAgW2dyb3VwXT1cImdldEdyb3VwKCdkYXRhJylcIiBbc2l0dWF0aW9uXT1cImZvLmZvcm1Nb2RlbC5zaXR1YXRpb25cIj48L3l1di1vYmplY3QtZm9ybS1ncm91cD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG59XG4iXX0=