@talrace/ngx-noder 0.0.18 → 0.0.19

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 (288) hide show
  1. package/fesm2022/talrace-ngx-noder.mjs +181 -181
  2. package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
  3. package/lib/apart-components/editor-toolbar/components/base-toolbar.component.d.ts +1 -1
  4. package/lib/editor/components/external-element/external.component.d.ts +1 -1
  5. package/lib/editor/components/shared/abstract/base.component.d.ts +1 -1
  6. package/lib/editor/components/shared/abstract/destroy.component.d.ts +1 -1
  7. package/package.json +1 -3
  8. package/src/lib/apart-components/add-link-dialog/_add-link-dialog.theme.scss +3 -6
  9. package/src/lib/apart-components/add-link-mobile/_add-link-mobile.theme.scss +4 -7
  10. package/src/lib/apart-components/confirm-dialog/_theme.scss +6 -9
  11. package/src/lib/apart-components/editor-title/_editor-title.theme.scss +6 -9
  12. package/src/lib/apart-components/editor-title-mobile/_editor-title-mobile.theme.scss +9 -12
  13. package/src/lib/apart-components/editor-toolbar/_editor-toolbar.theme.scss +5 -8
  14. package/src/lib/apart-components/editor-toolbar/components/buttons/color-picker/_color-picker.theme.scss +1 -3
  15. package/src/lib/apart-components/editor-toolbar/components/buttons/font/_font.theme.scss +1 -3
  16. package/src/lib/apart-components/editor-toolbar/components/buttons/font-size/_font-size.theme.scss +2 -5
  17. package/src/lib/apart-components/editor-toolbar/components/buttons/font-style/_font-style.theme.scss +3 -6
  18. package/src/lib/apart-components/editor-toolbar/components/buttons/format/_format.theme.scss +3 -6
  19. package/src/lib/apart-components/editor-toolbar/components/buttons/numbering/_numbering.theme.scss +15 -18
  20. package/src/lib/apart-components/editor-toolbar/components/buttons/undo-redo/_undo-redo.theme.scss +2 -4
  21. package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns/_menu-dropdowns.theme.scss +5 -8
  22. package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/_menu-dropdowns-mobile.theme.scss +6 -9
  23. package/src/lib/apart-components/editor-toolbar/components/toolbar-actions/_toolbar-actions.theme.scss +3 -6
  24. package/src/lib/apart-components/insert-table/_insert-table.theme.scss +6 -9
  25. package/src/lib/apart-components/insert-table-mobile/_insert-table-mobile.theme.scss +12 -15
  26. package/src/lib/apart-components/text-format-mobile/_text-format-mobile.theme.scss +22 -25
  27. package/src/lib/editor/components/_editor.theme.scss +25 -28
  28. package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +0 -73
  29. package/esm2022/lib/apart-components/add-link-dialog/validation.helper.mjs +0 -7
  30. package/esm2022/lib/apart-components/add-link-mobile/add-link-mobile.component.mjs +0 -49
  31. package/esm2022/lib/apart-components/confirm-dialog/confirm-dialog.component.mjs +0 -34
  32. package/esm2022/lib/apart-components/editor-search/editor-search-dialog.component.mjs +0 -75
  33. package/esm2022/lib/apart-components/editor-title/editor-title.component.mjs +0 -95
  34. package/esm2022/lib/apart-components/editor-title-mobile/editor-title-mobile.component.mjs +0 -24
  35. package/esm2022/lib/apart-components/editor-toolbar/components/base-toolbar.component.mjs +0 -117
  36. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/color-picker/color-picker.component.mjs +0 -37
  37. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +0 -49
  38. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-size/font-size.component.mjs +0 -90
  39. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-style/font-style.component.mjs +0 -81
  40. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/format/format.component.mjs +0 -28
  41. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/numbering/numbering.component.mjs +0 -53
  42. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/print/print.component.mjs +0 -18
  43. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/undo-redo/undo-redo.component.mjs +0 -27
  44. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/zoom/zoom.component.mjs +0 -71
  45. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.mjs +0 -107
  46. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.mjs +0 -25
  47. package/esm2022/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.mjs +0 -65
  48. package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +0 -86
  49. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.mjs +0 -90
  50. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar.module.mjs +0 -122
  51. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.mjs +0 -8
  52. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/numbering-templates.const.mjs +0 -1148
  53. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/svg-icons.const.mjs +0 -157
  54. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/alignment.enum.mjs +0 -8
  55. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.mjs +0 -11
  56. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-template-type.enum.mjs +0 -16
  57. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-type.enum.mjs +0 -6
  58. package/esm2022/lib/apart-components/editor-toolbar/shared/services/custom-icon.service.mjs +0 -34
  59. package/esm2022/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.mjs +0 -26
  60. package/esm2022/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.mjs +0 -60
  61. package/esm2022/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.mjs +0 -48
  62. package/esm2022/lib/apart-components/insert-table/insert-table.component.mjs +0 -54
  63. package/esm2022/lib/apart-components/insert-table-mobile/insert-table-mobile.component.mjs +0 -86
  64. package/esm2022/lib/apart-components/text-format-mobile/text-format-mobile.component.mjs +0 -134
  65. package/esm2022/lib/editor/components/edges/edge-element.model.mjs +0 -38
  66. package/esm2022/lib/editor/components/edges/edge-type.enum.mjs +0 -6
  67. package/esm2022/lib/editor/components/edges/edge.component.mjs +0 -141
  68. package/esm2022/lib/editor/components/edges/edges.mjs +0 -120
  69. package/esm2022/lib/editor/components/edges/page-type.enum.mjs +0 -7
  70. package/esm2022/lib/editor/components/editor.component.mjs +0 -112
  71. package/esm2022/lib/editor/components/external-element/external-element.service.mjs +0 -6
  72. package/esm2022/lib/editor/components/external-element/external-elements.const.mjs +0 -4
  73. package/esm2022/lib/editor/components/external-element/external-sidenav.interface.mjs +0 -2
  74. package/esm2022/lib/editor/components/external-element/external.component.mjs +0 -41
  75. package/esm2022/lib/editor/components/external-element/models/element-data.model.mjs +0 -9
  76. package/esm2022/lib/editor/components/external-element/models/external-element.model.mjs +0 -11
  77. package/esm2022/lib/editor/components/external-element/models/external-sidenav.model.mjs +0 -15
  78. package/esm2022/lib/editor/components/image/components/image.component.mjs +0 -88
  79. package/esm2022/lib/editor/components/image/image-api.service.mjs +0 -36
  80. package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +0 -46
  81. package/esm2022/lib/editor/components/image/resizer/coordinate.mjs +0 -2
  82. package/esm2022/lib/editor/components/image/resizer/direction-wrapper.mjs +0 -19
  83. package/esm2022/lib/editor/components/image/resizer/direction.enum.mjs +0 -12
  84. package/esm2022/lib/editor/components/image/resizer/resizer.component.mjs +0 -106
  85. package/esm2022/lib/editor/components/image/resizer/size-delta.mjs +0 -2
  86. package/esm2022/lib/editor/components/image/resizer/size-wrapper.mjs +0 -52
  87. package/esm2022/lib/editor/components/image/size.mjs +0 -2
  88. package/esm2022/lib/editor/components/shared/abstract/base.component.mjs +0 -60
  89. package/esm2022/lib/editor/components/shared/abstract/destroy.component.mjs +0 -18
  90. package/esm2022/lib/editor/components/shared/custom-component.hepler.mjs +0 -43
  91. package/esm2022/lib/editor/components/shared/custom-components.interface.mjs +0 -2
  92. package/esm2022/lib/editor/components/shared/custom-content-markers.const.mjs +0 -3
  93. package/esm2022/lib/editor/components/shared/custom-content.mjs +0 -2
  94. package/esm2022/lib/editor/components/shared/services/component.service.mjs +0 -52
  95. package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +0 -123
  96. package/esm2022/lib/editor/components/shared/services/overlay.service.mjs +0 -55
  97. package/esm2022/lib/editor/components/tab/tab.component.mjs +0 -44
  98. package/esm2022/lib/editor/components/tab/tab.helper.mjs +0 -6
  99. package/esm2022/lib/editor/components/table/cell-resizer/cell-resizer.mjs +0 -118
  100. package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +0 -99
  101. package/esm2022/lib/editor/components/table/components/table.component.mjs +0 -412
  102. package/esm2022/lib/editor/components/table/enums/hrule.enum.mjs +0 -7
  103. package/esm2022/lib/editor/components/table/enums/reisizer-side.enum.mjs +0 -8
  104. package/esm2022/lib/editor/components/table/enums/vertical-merge.enum.mjs +0 -6
  105. package/esm2022/lib/editor/components/table/models/cell-data.model.mjs +0 -17
  106. package/esm2022/lib/editor/components/table/models/cell-resizer-parameters.model.mjs +0 -9
  107. package/esm2022/lib/editor/components/table/models/row-data.model.mjs +0 -8
  108. package/esm2022/lib/editor/components/table/models/selection-range.model.mjs +0 -7
  109. package/esm2022/lib/editor/components/table/overlay-menu/overlay-menu.component.mjs +0 -84
  110. package/esm2022/lib/editor/components/table/selection/table-selection.mjs +0 -383
  111. package/esm2022/lib/editor/content/constants/display-values.const.mjs +0 -8
  112. package/esm2022/lib/editor/content/constants/document-info.const.mjs +0 -13
  113. package/esm2022/lib/editor/content/constants/editor.const.mjs +0 -70
  114. package/esm2022/lib/editor/content/contents.interface.mjs +0 -2
  115. package/esm2022/lib/editor/content/display-data/display-data.mjs +0 -839
  116. package/esm2022/lib/editor/content/display-data/display-token.model.mjs +0 -12
  117. package/esm2022/lib/editor/content/display-data/format-ext.model.mjs +0 -10
  118. package/esm2022/lib/editor/content/display-data/general-properties.model.mjs +0 -11
  119. package/esm2022/lib/editor/content/display-data/indent.model.mjs +0 -9
  120. package/esm2022/lib/editor/content/display-data/line-info.model.mjs +0 -9
  121. package/esm2022/lib/editor/content/display-data/lines.mjs +0 -96
  122. package/esm2022/lib/editor/content/display-data/models/paragraph-info.model.mjs +0 -8
  123. package/esm2022/lib/editor/content/display-data/paragraph-info.interface.mjs +0 -2
  124. package/esm2022/lib/editor/content/display-data/paragraph.mjs +0 -56
  125. package/esm2022/lib/editor/content/display-data/text-line-info.mjs +0 -35
  126. package/esm2022/lib/editor/content/display-data/toolbar-styles.interface.mjs +0 -2
  127. package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +0 -78
  128. package/esm2022/lib/editor/content/helpers/display-token.helper.mjs +0 -62
  129. package/esm2022/lib/editor/content/helpers/format.helper.mjs +0 -23
  130. package/esm2022/lib/editor/content/helpers/indexed-element.helper.mjs +0 -6
  131. package/esm2022/lib/editor/content/helpers/link.helper.mjs +0 -42
  132. package/esm2022/lib/editor/content/helpers/scaling.helper.mjs +0 -9
  133. package/esm2022/lib/editor/content/margin.model.mjs +0 -16
  134. package/esm2022/lib/editor/content/page-vertical-data.model.mjs +0 -9
  135. package/esm2022/lib/editor/content/vertical-alignment.enum.mjs +0 -11
  136. package/esm2022/lib/editor/core/event-emitting.mjs +0 -56
  137. package/esm2022/lib/editor/display/cell.interface.mjs +0 -2
  138. package/esm2022/lib/editor/display/event.helper.mjs +0 -18
  139. package/esm2022/lib/editor/display/layers/cursor.layer.mjs +0 -102
  140. package/esm2022/lib/editor/display/layers/layer.config.mjs +0 -2
  141. package/esm2022/lib/editor/display/layers/pages.layer.mjs +0 -109
  142. package/esm2022/lib/editor/display/layers/print.pages.layer.mjs +0 -7
  143. package/esm2022/lib/editor/display/layers/print.text.layer.mjs +0 -7
  144. package/esm2022/lib/editor/display/layers/selection.layer.mjs +0 -119
  145. package/esm2022/lib/editor/display/layers/text.layer.mjs +0 -226
  146. package/esm2022/lib/editor/display/print/print.helper.mjs +0 -40
  147. package/esm2022/lib/editor/display/print/print.renderer.mjs +0 -67
  148. package/esm2022/lib/editor/display/print/print.rendering.helper.mjs +0 -7
  149. package/esm2022/lib/editor/display/render-changes.interface.mjs +0 -2
  150. package/esm2022/lib/editor/display/render-changes.model.mjs +0 -25
  151. package/esm2022/lib/editor/display/renderer.mjs +0 -204
  152. package/esm2022/lib/editor/display/rendering.helper.mjs +0 -185
  153. package/esm2022/lib/editor/display/renderloop.mjs +0 -26
  154. package/esm2022/lib/editor/display/virtual.renderer.mjs +0 -284
  155. package/esm2022/lib/editor/display/visible-range.interface.mjs +0 -2
  156. package/esm2022/lib/editor/editor.module.mjs +0 -91
  157. package/esm2022/lib/editor/execution/distance.model.mjs +0 -10
  158. package/esm2022/lib/editor/execution/edit.session.mjs +0 -602
  159. package/esm2022/lib/editor/execution/editor.mjs +0 -1368
  160. package/esm2022/lib/editor/execution/helpers/dom.helper.mjs +0 -42
  161. package/esm2022/lib/editor/execution/helpers/format-style.helper.mjs +0 -73
  162. package/esm2022/lib/editor/execution/helpers/image.helpet.mjs +0 -12
  163. package/esm2022/lib/editor/execution/helpers/page.helper.mjs +0 -12
  164. package/esm2022/lib/editor/execution/helpers/paragraph-style.helper.mjs +0 -41
  165. package/esm2022/lib/editor/execution/helpers/paragraph.helper.mjs +0 -177
  166. package/esm2022/lib/editor/execution/regulator.service.mjs +0 -212
  167. package/esm2022/lib/editor/execution/targeting/cell-session-source.model.mjs +0 -18
  168. package/esm2022/lib/editor/execution/targeting/edge-session-source.model.mjs +0 -14
  169. package/esm2022/lib/editor/execution/targeting/main-session-source.model.mjs +0 -8
  170. package/esm2022/lib/editor/execution/targeting/session-source.model.mjs +0 -3
  171. package/esm2022/lib/editor/execution/targeting/session.model.mjs +0 -10
  172. package/esm2022/lib/editor/gadgets/font-metrics/editor-version.const.mjs +0 -2
  173. package/esm2022/lib/editor/gadgets/font-metrics/font-metric-size.interface.mjs +0 -2
  174. package/esm2022/lib/editor/gadgets/font-metrics/font-metrics.helper.mjs +0 -88
  175. package/esm2022/lib/editor/gadgets/history/operation-history.mjs +0 -208
  176. package/esm2022/lib/editor/gadgets/history/operation.type.mjs +0 -2
  177. package/esm2022/lib/editor/gadgets/history/operations-history-info.model.mjs +0 -7
  178. package/esm2022/lib/editor/gadgets/numbering/numbering-data.model.mjs +0 -9
  179. package/esm2022/lib/editor/gadgets/numbering/numbering-marker-type.enum.mjs +0 -12
  180. package/esm2022/lib/editor/gadgets/numbering/numbering-paragraph-style.model.mjs +0 -13
  181. package/esm2022/lib/editor/gadgets/numbering/numbering.helper.mjs +0 -149
  182. package/esm2022/lib/editor/gadgets/page-break/break-types.enum.mjs +0 -7
  183. package/esm2022/lib/editor/gadgets/page-break/break.helper.mjs +0 -18
  184. package/esm2022/lib/editor/gadgets/scrollbar.mjs +0 -86
  185. package/esm2022/lib/editor/gadgets/search/replace.interface.mjs +0 -2
  186. package/esm2022/lib/editor/gadgets/search/search-iteration.interface.mjs +0 -2
  187. package/esm2022/lib/editor/gadgets/search/search.mjs +0 -231
  188. package/esm2022/lib/editor/gadgets/unicode/unicode-chars.const.mjs +0 -5
  189. package/esm2022/lib/editor/gadgets/unicode/unicode.helper.mjs +0 -20
  190. package/esm2022/lib/editor/interaction/base.handler.mjs +0 -19
  191. package/esm2022/lib/editor/interaction/document.handler.mjs +0 -27
  192. package/esm2022/lib/editor/interaction/editor.service.mjs +0 -386
  193. package/esm2022/lib/editor/interaction/input.handler.mjs +0 -152
  194. package/esm2022/lib/editor/interaction/mode.enum.mjs +0 -7
  195. package/esm2022/lib/editor/interaction/mouse-button.enum.mjs +0 -7
  196. package/esm2022/lib/editor/interaction/mouse.handler.mjs +0 -50
  197. package/esm2022/lib/editor/interaction/text-input.mjs +0 -53
  198. package/esm2022/lib/editor/operations/commands.service.mjs +0 -20
  199. package/esm2022/lib/editor/operations/enums/command-type.enum.mjs +0 -32
  200. package/esm2022/lib/editor/operations/enums/target-type.enum.mjs +0 -7
  201. package/esm2022/lib/editor/operations/helpers/break-operations.helper.mjs +0 -9
  202. package/esm2022/lib/editor/operations/helpers/content-operations.helper.mjs +0 -15
  203. package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +0 -85
  204. package/esm2022/lib/editor/operations/helpers/image-operations.helper.mjs +0 -19
  205. package/esm2022/lib/editor/operations/helpers/indexed-element-operations.helper.mjs +0 -43
  206. package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +0 -136
  207. package/esm2022/lib/editor/operations/helpers/numbering-operations.helper.mjs +0 -55
  208. package/esm2022/lib/editor/operations/helpers/paragraph-operations.helper.mjs +0 -114
  209. package/esm2022/lib/editor/operations/helpers/tab-operations.helper.mjs +0 -16
  210. package/esm2022/lib/editor/operations/helpers/table-operations.helper.mjs +0 -374
  211. package/esm2022/lib/editor/operations/operations-helper.helper.mjs +0 -438
  212. package/esm2022/lib/editor/operations/save-commands.helper.mjs +0 -128
  213. package/esm2022/lib/editor/operations/target-operations.helper.mjs +0 -23
  214. package/esm2022/lib/editor/positioning/alignments.const.mjs +0 -8
  215. package/esm2022/lib/editor/positioning/content.helper.mjs +0 -45
  216. package/esm2022/lib/editor/positioning/cursor-paragraph.mjs +0 -13
  217. package/esm2022/lib/editor/positioning/cursor-position.interface.mjs +0 -2
  218. package/esm2022/lib/editor/positioning/insert-index.interface.mjs +0 -2
  219. package/esm2022/lib/editor/positioning/line-width.helper.mjs +0 -13
  220. package/esm2022/lib/editor/positioning/position.helper.mjs +0 -210
  221. package/esm2022/lib/editor/positioning/range.mjs +0 -94
  222. package/esm2022/lib/editor/positioning/selection.mjs +0 -351
  223. package/esm2022/lib/editor/revision.helper.mjs +0 -94
  224. package/esm2022/lib/models/generated/add-numbering.model.mjs +0 -8
  225. package/esm2022/lib/models/generated/apply-element-style.model.mjs +0 -8
  226. package/esm2022/lib/models/generated/apply-image-style.model.mjs +0 -8
  227. package/esm2022/lib/models/generated/apply-paragraph-style.model.mjs +0 -12
  228. package/esm2022/lib/models/generated/apply-text-style.model.mjs +0 -12
  229. package/esm2022/lib/models/generated/borders-style.model.mjs +0 -8
  230. package/esm2022/lib/models/generated/break.model.mjs +0 -8
  231. package/esm2022/lib/models/generated/cell.model.mjs +0 -12
  232. package/esm2022/lib/models/generated/column-section.model.mjs +0 -8
  233. package/esm2022/lib/models/generated/column.model.mjs +0 -8
  234. package/esm2022/lib/models/generated/command.model.mjs +0 -120
  235. package/esm2022/lib/models/generated/delete.model.mjs +0 -8
  236. package/esm2022/lib/models/generated/document-name.model.mjs +0 -8
  237. package/esm2022/lib/models/generated/document.model.mjs +0 -8
  238. package/esm2022/lib/models/generated/docx.model.mjs +0 -12
  239. package/esm2022/lib/models/generated/edge-target.model.mjs +0 -8
  240. package/esm2022/lib/models/generated/edge.model.mjs +0 -8
  241. package/esm2022/lib/models/generated/element.model.mjs +0 -8
  242. package/esm2022/lib/models/generated/file-source.model.mjs +0 -8
  243. package/esm2022/lib/models/generated/format.model.mjs +0 -12
  244. package/esm2022/lib/models/generated/heading.model.mjs +0 -16
  245. package/esm2022/lib/models/generated/image-data.model.mjs +0 -8
  246. package/esm2022/lib/models/generated/image.model.mjs +0 -12
  247. package/esm2022/lib/models/generated/insert-break.model.mjs +0 -8
  248. package/esm2022/lib/models/generated/insert-element.model.mjs +0 -12
  249. package/esm2022/lib/models/generated/insert-image.model.mjs +0 -12
  250. package/esm2022/lib/models/generated/insert-link.model.mjs +0 -12
  251. package/esm2022/lib/models/generated/insert-paragraph.model.mjs +0 -20
  252. package/esm2022/lib/models/generated/insert-styled-text.model.mjs +0 -12
  253. package/esm2022/lib/models/generated/insert-tab.model.mjs +0 -8
  254. package/esm2022/lib/models/generated/insert-table-columns.model.mjs +0 -8
  255. package/esm2022/lib/models/generated/insert-table-rows.model.mjs +0 -8
  256. package/esm2022/lib/models/generated/insert-table.model.mjs +0 -8
  257. package/esm2022/lib/models/generated/insert-text.model.mjs +0 -8
  258. package/esm2022/lib/models/generated/last-document-revision.model.mjs +0 -12
  259. package/esm2022/lib/models/generated/link-data.model.mjs +0 -8
  260. package/esm2022/lib/models/generated/link.model.mjs +0 -8
  261. package/esm2022/lib/models/generated/margins.model.mjs +0 -8
  262. package/esm2022/lib/models/generated/numbering-level.model.mjs +0 -12
  263. package/esm2022/lib/models/generated/numbering.model.mjs +0 -8
  264. package/esm2022/lib/models/generated/operation.model.mjs +0 -12
  265. package/esm2022/lib/models/generated/page-numbers.model.mjs +0 -8
  266. package/esm2022/lib/models/generated/paragraph-style.model.mjs +0 -8
  267. package/esm2022/lib/models/generated/paragraph.model.mjs +0 -12
  268. package/esm2022/lib/models/generated/remove-numberings.model.mjs +0 -8
  269. package/esm2022/lib/models/generated/remove-table-columns.model.mjs +0 -8
  270. package/esm2022/lib/models/generated/remove-table-rows.model.mjs +0 -8
  271. package/esm2022/lib/models/generated/replace-by-text.model.mjs +0 -8
  272. package/esm2022/lib/models/generated/replace.model.mjs +0 -44
  273. package/esm2022/lib/models/generated/resize-table-columns.model.mjs +0 -8
  274. package/esm2022/lib/models/generated/restore-numberings.model.mjs +0 -8
  275. package/esm2022/lib/models/generated/restore-paragraph-styles.model.mjs +0 -8
  276. package/esm2022/lib/models/generated/restore-table.model.mjs +0 -12
  277. package/esm2022/lib/models/generated/restore-text-styles.model.mjs +0 -8
  278. package/esm2022/lib/models/generated/restore.model.mjs +0 -8
  279. package/esm2022/lib/models/generated/revision.model.mjs +0 -12
  280. package/esm2022/lib/models/generated/row.model.mjs +0 -8
  281. package/esm2022/lib/models/generated/tab.model.mjs +0 -8
  282. package/esm2022/lib/models/generated/table-cell.model.mjs +0 -8
  283. package/esm2022/lib/models/generated/table.model.mjs +0 -12
  284. package/esm2022/lib/models/generated/target.model.mjs +0 -16
  285. package/esm2022/lib/models/generated/text-style.model.mjs +0 -8
  286. package/esm2022/lib/translate/noder-translate.loader.mjs +0 -22
  287. package/esm2022/public-api.mjs +0 -54
  288. package/esm2022/talrace-ngx-noder.mjs +0 -5
@@ -1,1368 +0,0 @@
1
- import { AddNumberingModel } from '../../models/generated/add-numbering.model';
2
- import { ApplyElementStyleModel } from '../../models/generated/apply-element-style.model';
3
- import { ApplyImageStyleModel } from '../../models/generated/apply-image-style.model';
4
- import { ApplyParagraphStyleModel } from '../../models/generated/apply-paragraph-style.model';
5
- import { ApplyTextStyleModel } from '../../models/generated/apply-text-style.model';
6
- import { BreakHelper } from '../gadgets/page-break/break.helper';
7
- import { BreakModel } from '../../models/generated/break.model';
8
- import { BreakTypes } from '../gadgets/page-break/break-types.enum';
9
- import { ContentHelper } from '../positioning/content.helper';
10
- import { ContentStyleHelper } from '../content/helpers/content-style.helper';
11
- import { CursorParagraph } from '../positioning/cursor-paragraph';
12
- import { CUSTOM_ELEMENT_MARKER, TABLE_MARKER } from '../components/shared/custom-content-markers.const';
13
- import { DeleteModel } from '../../models/generated/delete.model';
14
- import { DocumentHandler } from '../interaction/document.handler';
15
- import { ElementModel } from '../../models/generated/element.model';
16
- import { FormatHelper } from '../content/helpers/format.helper';
17
- import { ImageHelper } from './helpers/image.helpet';
18
- import { ImageModel } from '../../models/generated/image.model';
19
- import { IndexedElementHelper } from '../content/helpers/indexed-element.helper';
20
- import { InputHandler } from '../interaction/input.handler';
21
- import { InsertBreakModel } from '../../models/generated/insert-break.model';
22
- import { InsertElementModel } from '../../models/generated/insert-element.model';
23
- import { InsertImageModel } from '../../models/generated/insert-image.model';
24
- import { InsertLinkModel } from '../../models/generated/insert-link.model';
25
- import { InsertParagraphModel } from '../../models/generated/insert-paragraph.model';
26
- import { InsertStyledTextModel } from '../../models/generated/insert-styled-text.model';
27
- import { InsertTableColumnsModel } from '../../models/generated/insert-table-columns.model';
28
- import { InsertTableModel } from '../../models/generated/insert-table.model';
29
- import { InsertTableRowsModel } from '../../models/generated/insert-table-rows.model';
30
- import { InsertTabModel } from '../../models/generated/insert-tab.model';
31
- import { InsertTextModel } from '../../models/generated/insert-text.model';
32
- import { LinkDataModel } from '../../models/generated/link-data.model';
33
- import { LinkHelper } from '../content/helpers/link.helper';
34
- import { LinkModel } from '../../models/generated/link.model';
35
- import { MouseHandler } from '../interaction/mouse.handler';
36
- import { NEW_LINE_MARKUP } from '../content/constants/editor.const';
37
- import { OperationHistory } from '../gadgets/history/operation-history';
38
- import { ParagraphModel } from '../../models/generated/paragraph.model';
39
- import { ParagraphStyleModel } from '../../models/generated/paragraph-style.model';
40
- import { PositionHelper } from '../positioning/position.helper';
41
- import { PrintHelper } from '../display/print/print.helper';
42
- import { Range } from '../positioning/range';
43
- import { RemoveNumberingsModel } from '../../models/generated/remove-numberings.model';
44
- import { RemoveTableColumnsModel } from '../../models/generated/remove-table-columns.model';
45
- import { RemoveTableRowsModel } from '../../models/generated/remove-table-rows.model';
46
- import { ReplaceModel } from '../../models/generated/replace.model';
47
- import { ResizeTableColumnsModel } from '../../models/generated/resize-table-columns.model';
48
- import { RestoreModel } from '../../models/generated/restore.model';
49
- import { RestoreNumberingsModel } from '../../models/generated/restore-numberings.model';
50
- import { RestoreParagraphStylesModel } from '../../models/generated/restore-paragraph-styles.model';
51
- import { RestoreTableModel } from '../../models/generated/restore-table.model';
52
- import { RestoreTextStylesModel } from '../../models/generated/restore-text-styles.model';
53
- import { SaveCommandsHelper } from '../operations/save-commands.helper';
54
- import { ScalingHelper } from '../content/helpers/scaling.helper';
55
- import { Search } from '../gadgets/search/search';
56
- import { Selection } from '../positioning/selection';
57
- import { TableModel } from '../../models/generated/table.model';
58
- import { TabModel } from '../../models/generated/tab.model';
59
- import { TextInput } from '../interaction/text-input';
60
- import { TextStyleModel } from '../../models/generated/text-style.model';
61
- export class Editor {
62
- get mainSession() {
63
- return this.regulatorService.mainSession.session;
64
- }
65
- get mainRenderer() {
66
- return this.regulatorService.mainSession.renderer;
67
- }
68
- get session() {
69
- return this.regulatorService.currentSession.session;
70
- }
71
- get renderer() {
72
- return this.regulatorService.currentSession.renderer;
73
- }
74
- get isViewOnly() {
75
- return this.editorService.isViewOnly;
76
- }
77
- get targets() {
78
- return this.regulatorService.getCurrentSessionTargets();
79
- }
80
- constructor(model, container, editorService, regulatorService, commandsService, clipboard, externalElementTagNames, customPageWidth) {
81
- this.model = model;
82
- this.container = container;
83
- this.editorService = editorService;
84
- this.regulatorService = regulatorService;
85
- this.commandsService = commandsService;
86
- this.clipboard = clipboard;
87
- this.externalElementTagNames = externalElementTagNames;
88
- this.customPageWidth = customPageWidth;
89
- this.MAX_COUNT = 999;
90
- this.parentTagName = 'APP-NOD-EDITOR';
91
- this.tableCellTagName = 'APP-NOD-TABLE-CELL';
92
- this.edgeElementTagName = 'APP-NOD-EDGE';
93
- this.imageTagName = 'APP-NOD-IMAGE';
94
- this.subscriptions = [];
95
- this.rerenderResize = () => {
96
- this.mainRenderer.onResize(true);
97
- };
98
- this.onDocumentChange = (range) => {
99
- let lastRow = range.start.row === range.end.row ? range.end.row : Infinity;
100
- this.renderer.updateLines(range.start.row, lastRow);
101
- // Update cursor because tab characters can influence the cursor position.
102
- this.renderer.updateCursor();
103
- };
104
- this.subscriptions.push(this.receiveTextStyleSubscription());
105
- this.customElementTagNames = [...this.externalElementTagNames, this.imageTagName, this.tableCellTagName, this.edgeElementTagName];
106
- this.history = new OperationHistory(editorService, regulatorService);
107
- this.selection = new Selection();
108
- this.regulatorService.setSelection(this.selection);
109
- this.initMainSession();
110
- this.textInput = new TextInput(this.mainRenderer.container);
111
- this.mainRenderer.textarea = this.textInput.input;
112
- this.mouseHandler = new MouseHandler(this.mainRenderer.container, this);
113
- this.inputHandler = new InputHandler(this.textInput.input, this);
114
- this.documentHandler = new DocumentHandler(this);
115
- this.initResizeListener();
116
- this.focus();
117
- this.session.applyToolbarStyles();
118
- this.search = new Search();
119
- this.search.set({ wrap: true });
120
- this.subscriptions.push(this.changedEdgeSizeSubscription(), this.changedEdgeSubscription(), this.changedTableSizeSubscription(), this.changeElementStyleSubscription(), this.clipboardDataSubscription(), this.copySelectedSubscription(), this.createCustomComponentSubscription(), this.cutSelectedSubscription(), this.disableSelectionSubscription(), this.endMousePressSubscription(), this.imageLoadedSubscription(), this.insertBreakSubscription(), this.insertImageSubscription(), this.insertLinkSubscription(), this.insertTableColumnsSubscription(), this.insertTableRowsSubscription(), this.insertTableSubscription(), this.insertTextSubscription(), this.pasteFromClipboardSubscription(), this.printSubscription(), this.redoSubscription(), this.removeLeftSubscription(), this.removeNumberingsSubscription(), this.removeRightSubscription(), this.removeSelectedSubscription(), this.removeTableColumnsSubscription(), this.removeTableRowsSubscription(), this.replaceSubscription(), this.resizeTableColumnsSubscription(), this.searchOptionSubscription(), this.selectAllSubscription(), this.setImageStyleSubscription(), this.setNumberingTemplateTypeSubscription(), this.setParagraphStylesSubscription(), this.setTextStylesSubscription(), this.undoSubscription(), this.updateEdgeSubscription());
121
- }
122
- destroy() {
123
- this.subscriptions.forEach(s => s?.unsubscribe());
124
- this.destroyResizeListener();
125
- this.mouseHandler.destroy();
126
- this.inputHandler.destroy();
127
- this.documentHandler.destroy();
128
- this.selection.blur();
129
- }
130
- selectPageDown() {
131
- const config = this.mainRenderer.layerConfig;
132
- const line = config.visibleRange.endScreenLine;
133
- const position = PositionHelper.screenToDocument(this.mainSession, line, 0);
134
- this.selection.moveSelection(position);
135
- this.mainRenderer.scrollBy(config.height);
136
- this.scrollCursorIntoMainView(0.5);
137
- this.onSelectionChange();
138
- }
139
- selectPageUp() {
140
- const config = this.mainRenderer.layerConfig;
141
- const line = config.visibleRange.startScreenLine;
142
- const position = PositionHelper.screenToDocument(this.mainSession, line, 0);
143
- this.selection.moveSelection(position);
144
- this.mainRenderer.scrollBy(-config.height);
145
- this.scrollCursorIntoMainView(0.5);
146
- this.onSelectionChange();
147
- }
148
- gotoPageDown() {
149
- const config = this.mainRenderer.layerConfig;
150
- const line = config.visibleRange.endScreenLine;
151
- const position = PositionHelper.screenToDocument(this.mainSession, line, 0);
152
- this.selection.placeCursor(position);
153
- this.mainRenderer.scrollBy(config.height);
154
- this.scrollCursorIntoMainView(0.5);
155
- this.onSelectionChange();
156
- }
157
- gotoPageUp() {
158
- const config = this.mainRenderer.layerConfig;
159
- const line = config.visibleRange.startScreenLine;
160
- const position = PositionHelper.screenToDocument(this.mainSession, line, 0);
161
- this.selection.placeCursor(position);
162
- this.mainRenderer.scrollBy(-config.height);
163
- this.scrollCursorIntoMainView(0.5);
164
- this.onSelectionChange();
165
- }
166
- cut() {
167
- this.removeSelected();
168
- }
169
- insert(text) {
170
- if (this.selection.isEmpty) {
171
- const textStyle = ContentStyleHelper.combineTextStyles(null, this.editorService.styles);
172
- this.insertText(text, textStyle);
173
- }
174
- else {
175
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
176
- const insertText = new InsertTextModel({ insertIndex, text });
177
- this.replaceBy(new ReplaceModel({ insertText }));
178
- }
179
- }
180
- insertText(text, textStyle) {
181
- const position = this.selection.cursor;
182
- if (textStyle) {
183
- this.saveInsertStyledTextToHistory(position.row, position.column, text, textStyle);
184
- }
185
- else {
186
- this.saveInsertTextToHistory(position.row, position.column, text);
187
- }
188
- this.session.insertText(position, text, textStyle);
189
- this.onSelectionChange();
190
- }
191
- removeLeft() {
192
- if (this.selection.isEmpty) {
193
- this.selection.selectLeft(this.session);
194
- }
195
- this.removeSelected();
196
- }
197
- removeRight() {
198
- if (this.selection.isEmpty) {
199
- this.selection.selectRight(this.session);
200
- }
201
- this.removeSelected();
202
- }
203
- insertBreak(breakType) {
204
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
205
- const insertBreak = new InsertBreakModel({ insertIndex, breakType });
206
- if (!this.selection.isEmpty) {
207
- this.replaceBy(new ReplaceModel({ insertBreak }));
208
- return;
209
- }
210
- if (breakType === BreakTypes.Column) {
211
- return;
212
- }
213
- this.saveInsertBreakToHistory(insertBreak);
214
- const endPoint = this.session.insertBreak(this.selection.cursor, breakType);
215
- let lastRow = this.selection.cursor.row === endPoint.row ? endPoint.row : Infinity;
216
- this.renderer.updateLines(this.selection.cursor.row, lastRow);
217
- this.renderer.updateCursor();
218
- this.rerenderMarker();
219
- this.scrollCursorIntoMainView(0.1);
220
- }
221
- insertTab() {
222
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
223
- const insertTab = new InsertTabModel({ insertIndex });
224
- if (!this.selection.isEmpty) {
225
- this.replaceBy(new ReplaceModel({ insertTab }));
226
- return;
227
- }
228
- this.saveInsertTabToHistory(insertTab);
229
- const endPoint = this.session.insertTab(this.selection.cursor);
230
- this.onDocumentChange(new Range(this.selection.cursor, endPoint));
231
- this.onSelectionChange();
232
- }
233
- insertImage(imageData) {
234
- const adjustedImage = ImageHelper.getImageWithAllowedSize(imageData, this.session.displayData.contentWidth);
235
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
236
- const insertImage = new InsertImageModel({ insertIndex, imageData: adjustedImage });
237
- if (!this.selection.isEmpty) {
238
- this.replaceBy(new ReplaceModel({ insertImage }));
239
- return;
240
- }
241
- this.saveInsertImageToHistory(insertImage);
242
- const endPoint = this.session.insertImage(this.selection.cursor, adjustedImage);
243
- let lastRow = this.selection.cursor.row === endPoint.row ? endPoint.row : Infinity;
244
- this.renderer.updateLines(this.selection.cursor.row, lastRow);
245
- this.renderer.updateCursor();
246
- this.rerenderMarker();
247
- }
248
- insertLink(linkDataModel) {
249
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
250
- const insertLink = new InsertLinkModel({ insertIndex, endIndex: insertIndex + linkDataModel.text.length, linkDataModel });
251
- if (!this.selection.isEmpty) {
252
- this.replaceBy(new ReplaceModel({ insertLink }));
253
- return;
254
- }
255
- this.saveInsertLinkToHistory(insertLink);
256
- this.session.insertLink(this.selection.cursor, linkDataModel);
257
- this.renderer.updateCursor();
258
- this.rerenderMarker();
259
- }
260
- insertTable(tableData) {
261
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
262
- const insertTable = new InsertTableModel({
263
- insertIndex,
264
- insertTableIndex: insertIndex,
265
- rowsCount: tableData.rows,
266
- columnsCount: tableData.columns,
267
- content: TABLE_MARKER
268
- });
269
- if (this.session.displayData.paragraphs[this.selection.range.start.row].paragraphSettings.numberingData.numberingId ||
270
- !this.session.displayData.paragraphs.some(x => x.startIndex === insertIndex) ||
271
- !this.session.displayData.isNewLineSymbol(insertIndex)) {
272
- this.insertTableInNewParagraph(insertTable, insertIndex);
273
- }
274
- else {
275
- this.insertTableInCurrentParagraph(insertTable);
276
- }
277
- }
278
- insertTableInNewParagraph(insertTable, insertIndex) {
279
- const insertParagraph = new InsertParagraphModel({ insertIndex, insertTable });
280
- if (!this.selection.isEmpty) {
281
- this.replaceBy(new ReplaceModel({ insertParagraph }));
282
- return;
283
- }
284
- this.saveInsertParagraphToHistory(insertTable.content, insertParagraph);
285
- const endPoint = this.session.insertParagraph(this.selection.cursor, insertParagraph);
286
- let lastRow = this.selection.cursor.row === endPoint.row ? endPoint.row : Infinity;
287
- this.renderer.updateLines(this.selection.cursor.row, lastRow);
288
- this.renderer.updateCursor();
289
- this.rerenderMarker();
290
- }
291
- insertTableInCurrentParagraph(insertTable) {
292
- if (!this.selection.isEmpty) {
293
- this.replaceBy(new ReplaceModel({ insertTable }));
294
- return;
295
- }
296
- this.saveInsertTableToHistory(insertTable);
297
- const endPoint = this.session.insertTable(this.selection.cursor, insertTable);
298
- let lastRow = this.selection.cursor.row === endPoint.row ? endPoint.row : Infinity;
299
- this.renderer.updateLines(this.selection.cursor.row, lastRow);
300
- this.renderer.updateCursor();
301
- this.rerenderMarker();
302
- }
303
- replaceBy(model) {
304
- const partIndexes = ContentHelper.getSelectedPartDocumentIndexes(this.session.displayData.paragraphs, this.selection.range);
305
- model.delete = new DeleteModel({ startIndex: partIndexes.startIndex, count: partIndexes.endIndex - partIndexes.startIndex + 1 });
306
- this.saveReplaceToHistory(this.selection.range, model);
307
- this.removeCustomElementsData();
308
- const endPosition = this.session.replace(model);
309
- this.onDocumentChange(new Range(this.selection.cursor, endPosition));
310
- this.onSelectionChange();
311
- }
312
- removeToLineStart() {
313
- if (this.selection.isEmpty) {
314
- this.selection.selectLineStart(this.session);
315
- }
316
- this.removeSelected();
317
- }
318
- removeToLineEnd() {
319
- if (this.selection.isEmpty) {
320
- this.selection.selectLineEnd(this.session);
321
- }
322
- this.removeSelected();
323
- }
324
- removeWordLeft() {
325
- if (this.selection.isEmpty) {
326
- this.selection.selectWordLeft(this.session);
327
- }
328
- this.removeSelected();
329
- }
330
- removeWordRight() {
331
- if (this.selection.isEmpty) {
332
- this.selection.selectWordRight(this.session);
333
- }
334
- this.removeSelected();
335
- }
336
- applyTextStyleBold() {
337
- this.applyTextStyles(new TextStyleModel({ bold: !this.session.editorService.styles.bold }));
338
- }
339
- applyTextStyleItalic() {
340
- this.applyTextStyles(new TextStyleModel({ italic: !this.session.editorService.styles.italic }));
341
- }
342
- applyTextStyleUnderline() {
343
- this.applyTextStyles(new TextStyleModel({ underline: !this.session.editorService.styles.underline }));
344
- }
345
- applyTextStyles(textStyle) {
346
- if (!this.selection.isEmpty) {
347
- const partIndexes = ContentHelper.getSelectedPartDocumentIndexes(this.session.displayData.paragraphs, this.selection.range);
348
- this.saveApplyTextStyleToHistory(partIndexes.startIndex, partIndexes.endIndex, textStyle);
349
- this.session.applyTextStyle(partIndexes.startIndex, partIndexes.endIndex, textStyle);
350
- }
351
- else {
352
- this.setTextStyle(textStyle);
353
- }
354
- }
355
- setTextStyle(textStyle) {
356
- const index = ContentHelper.paragraphPositionToDocumentIndex(this.session.displayData.paragraphs, this.selection.cursor);
357
- const isParagraph = this.session.model.contentLength === index || this.session.model.content[index] === NEW_LINE_MARKUP;
358
- if (isParagraph) {
359
- this.saveApplyTextStyleToHistory(index, index, textStyle);
360
- this.session.applyTextStyle(index, index, textStyle);
361
- }
362
- else {
363
- this.session.setTextStyle(textStyle);
364
- }
365
- this.renderer.updateCursor();
366
- }
367
- applyParagraphStyles(paragraphStyle) {
368
- const range = this.selection.range;
369
- const startIndex = this.session.model.paragraphs[range.start.row].insertIndex;
370
- const endIndex = this.session.model.paragraphs[range.end.row].insertIndex;
371
- this.saveApplyParagraphStyleToHistory(startIndex, endIndex, paragraphStyle);
372
- this.session.applyParagraphStyle(startIndex, endIndex, paragraphStyle);
373
- }
374
- applyElementStyle(current) {
375
- this.saveApplyElementStyleToHistory(current);
376
- this.session.applyElementStyle(new ApplyElementStyleModel(current));
377
- }
378
- setNumberingTemplate(templateLevels) {
379
- const range = this.selection.range;
380
- const startIndex = this.session.model.paragraphs[range.start.row].insertIndex;
381
- const endIndex = this.session.model.paragraphs[range.end.row].insertIndex;
382
- this.saveAddNumberingToHistory(templateLevels, startIndex, endIndex);
383
- this.session.addNumbering(templateLevels, startIndex, endIndex);
384
- this.renderer.updateCursor();
385
- }
386
- removeNumberingsFromParagraphs() {
387
- const range = this.selection.range;
388
- const startIndex = this.session.model.paragraphs[range.start.row].insertIndex;
389
- const endIndex = this.session.model.paragraphs[range.end.row].insertIndex;
390
- this.saveRemoveNumberingToHistory(startIndex, endIndex);
391
- this.session.removeNumberings(startIndex, endIndex);
392
- this.renderer.updateCursor();
393
- }
394
- applyImageStyles(image) {
395
- this.saveApplyImageStyleToHistory(image);
396
- const imageStyle = new ApplyImageStyleModel({ insertIndex: image.insertIndex, height: image.height, width: image.width });
397
- this.session.applyImageStyle(imageStyle);
398
- this.renderer.updateCursor();
399
- }
400
- focus() {
401
- if (!this.textInput.isFocused && !this.selection.isFocused) {
402
- this.textInput.input.focus();
403
- }
404
- }
405
- openSearch() {
406
- this.editorService.openSearchDialog = true;
407
- }
408
- find(options) {
409
- let range = this.selection.range;
410
- if (options.term == null) {
411
- let term = this.session.displayData.getTextRange(range) || this.search.options.term;
412
- if (!term) {
413
- range = this.session.getWordRange(range.start.row, range.start.column);
414
- term = this.session.displayData.getTextRange(range);
415
- }
416
- options.term = term;
417
- }
418
- if (!options.start) {
419
- options.start = range;
420
- }
421
- this.search.set(options);
422
- const newRange = this.search.find(this.session);
423
- if (newRange) {
424
- this.selection.placeSelection(range.start, range.end);
425
- this.onSelectionChange();
426
- if (this.session === this.mainSession) {
427
- this.mainRenderer.scrollSelectionIntoView(range.start, range.end, 0.5);
428
- }
429
- return newRange;
430
- }
431
- range.end = range.start;
432
- this.selection.placeCursor(range.start);
433
- this.onSelectionChange();
434
- return null;
435
- }
436
- updateCounter() {
437
- const regex = this.search.options.regex;
438
- let all = 0;
439
- let current = 0;
440
- if (!regex) {
441
- return { current: 0, total: 0 };
442
- }
443
- const value = this.session.displayData.getAllParagraphsContent().join('\n');
444
- let offset = this.session.displayData.positionToIndex(this.selection.range.start);
445
- regex.lastIndex = 0;
446
- let regexResult;
447
- while ((regexResult = regex.exec(value))) {
448
- all++;
449
- let last = regexResult.index;
450
- if (last <= offset) {
451
- current++;
452
- }
453
- if (all > this.MAX_COUNT) {
454
- break;
455
- }
456
- }
457
- return { current: current, total: all > this.MAX_COUNT ? this.MAX_COUNT : all };
458
- }
459
- replace(search, replace) {
460
- if (this.selection.isEmpty) {
461
- return;
462
- }
463
- if (search !== replace) {
464
- if (replace) {
465
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
466
- const insertText = new InsertTextModel({ insertIndex, text: replace });
467
- this.replaceBy(new ReplaceModel({ insertText }));
468
- }
469
- else {
470
- this.removeSelected();
471
- }
472
- }
473
- this.find({ term: search, skipCurrent: true, backwards: false });
474
- }
475
- undo() {
476
- const undo = this.history.popUndoOperation();
477
- if (!undo) {
478
- return;
479
- }
480
- this.regulatorService.setTargetedSessionAsCurrent(undo.targets);
481
- this.applyOperation(undo.operation);
482
- this.selection.placeSelection(undo.cursor, undo.anchor);
483
- this.onSelectionChange();
484
- }
485
- redo() {
486
- const redo = this.history.popRedoOperation();
487
- if (!redo) {
488
- return;
489
- }
490
- this.regulatorService.setTargetedSessionAsCurrent(redo.targets);
491
- this.selection.placeSelection(redo.cursor, redo.anchor);
492
- this.applyOperation(redo.operation);
493
- this.onSelectionChange();
494
- }
495
- applyOperation(operation) {
496
- let command = null;
497
- if (operation instanceof InsertTextModel) {
498
- this.session.insertTextByDocumentIndex(operation.insertIndex, operation.text, null);
499
- const { text, insertIndex } = operation;
500
- command = SaveCommandsHelper.getInsertTextCommand(text, insertIndex, this.targets);
501
- }
502
- else if (operation instanceof InsertParagraphModel) {
503
- this.session.insertParagraphByDocumentIndex(operation);
504
- command = SaveCommandsHelper.getInsertParagraphCommand(operation, this.targets);
505
- }
506
- else if (operation instanceof DeleteModel) {
507
- this.session.removeByDocumentIndexes(operation.startIndex, operation.startIndex + operation.count);
508
- command = SaveCommandsHelper.getDeleteCommand(operation.startIndex, operation.count, this.targets);
509
- }
510
- else if (operation instanceof InsertStyledTextModel) {
511
- this.session.insertTextByDocumentIndex(operation.insertIndex, operation.text, new TextStyleModel(operation.textStyle));
512
- const { text, insertIndex, textStyle } = operation;
513
- command = SaveCommandsHelper.getInsertStyledTextCommand(text, insertIndex, textStyle, this.targets);
514
- }
515
- else if (operation instanceof RestoreModel) {
516
- const deepCopy = structuredClone(operation);
517
- this.session.restore(deepCopy);
518
- command = SaveCommandsHelper.getRestoreCommand(deepCopy, this.targets);
519
- }
520
- else if (operation instanceof ApplyTextStyleModel) {
521
- this.session.applyTextStyle(operation.startIndex, operation.endIndex, new TextStyleModel(operation.textStyle));
522
- const { startIndex, endIndex, textStyle } = operation;
523
- command = SaveCommandsHelper.getApplyTextStyleCommand(startIndex, endIndex, textStyle, this.targets);
524
- }
525
- else if (operation instanceof ApplyParagraphStyleModel) {
526
- const copy = new ParagraphStyleModel(operation.paragraphStyle);
527
- this.session.applyParagraphStyle(operation.startIndex, operation.endIndex, copy);
528
- const { startIndex, endIndex, paragraphStyle } = operation;
529
- command = SaveCommandsHelper.getApplyParagraphStyleCommand(startIndex, endIndex, paragraphStyle, this.targets);
530
- }
531
- else if (operation instanceof RestoreTextStylesModel) {
532
- const deepCopy = structuredClone(operation);
533
- this.session.restoreTextStyles(deepCopy.formats, deepCopy.linkFormats);
534
- command = SaveCommandsHelper.getRestoreTextStylesCommand(deepCopy.formats, this.targets);
535
- }
536
- else if (operation instanceof RestoreParagraphStylesModel) {
537
- const deepCopy = structuredClone(operation);
538
- this.session.restoreParagraphStyles(deepCopy.paragraphs);
539
- command = SaveCommandsHelper.getRestoreParagraphStylesCommand(deepCopy.paragraphs, this.targets);
540
- }
541
- else if (operation instanceof InsertElementModel) {
542
- this.session.insertElementByDocumentIndex(operation);
543
- command = SaveCommandsHelper.getInsertElementCommand(operation, this.targets);
544
- }
545
- else if (operation instanceof InsertBreakModel) {
546
- this.session.insertBreakByDocumentIndex(operation);
547
- command = SaveCommandsHelper.getInsertBreakCommand(operation, this.targets);
548
- }
549
- else if (operation instanceof ApplyElementStyleModel) {
550
- this.session.applyElementStyle(operation);
551
- command = SaveCommandsHelper.getApplyElementStyleCommand(operation, this.targets);
552
- }
553
- else if (operation instanceof InsertTabModel) {
554
- this.session.insertTabByDocumentIndex(operation);
555
- command = SaveCommandsHelper.getInsertTabCommand(operation, this.targets);
556
- }
557
- else if (operation instanceof InsertImageModel) {
558
- this.session.insertImageByDocumentIndex(operation);
559
- command = SaveCommandsHelper.getInsertImageCommand(operation, this.targets);
560
- }
561
- else if (operation instanceof InsertLinkModel) {
562
- this.session.insertLinkByDocumentIndex(operation);
563
- command = SaveCommandsHelper.getInsertLinkOperation(operation, this.targets);
564
- }
565
- else if (operation instanceof ApplyImageStyleModel) {
566
- this.session.applyImageStyle(operation);
567
- const { height, width, insertIndex } = operation;
568
- command = SaveCommandsHelper.getApplyImageStyleCommand(height, width, insertIndex, this.targets);
569
- }
570
- else if (operation instanceof AddNumberingModel) {
571
- this.session.addNumbering(operation.levels, operation.startIndex, operation.endIndex);
572
- const { startIndex, endIndex, levels } = operation;
573
- command = SaveCommandsHelper.getAddNumberingCommand(startIndex, endIndex, levels, this.targets);
574
- }
575
- else if (operation instanceof RestoreNumberingsModel) {
576
- this.session.restoreNumberings(operation.paragraphs, operation.numberings);
577
- command = SaveCommandsHelper.getRestoreNumberingsCommand(operation, this.targets);
578
- }
579
- else if (operation instanceof InsertTableColumnsModel) {
580
- this.session.insertTableColumns(operation.insertIndex, operation.columnsCount, operation.targetIndex, operation.inheritIndex);
581
- this.changedTableSize(operation.insertIndex, this.session.sessionId);
582
- const { columnsCount, inheritIndex, insertIndex, targetIndex } = operation;
583
- command = SaveCommandsHelper.getInsertTableColumnsCommand(columnsCount, inheritIndex, insertIndex, targetIndex, this.targets);
584
- }
585
- else if (operation instanceof InsertTableRowsModel) {
586
- this.session.insertTableRows(operation.insertIndex, operation.rowsCount, operation.targetIndex, operation.inheritIndex);
587
- this.changedTableSize(operation.insertIndex, this.session.sessionId);
588
- const { insertIndex, rowsCount, targetIndex, inheritIndex } = operation;
589
- command = SaveCommandsHelper.getInsertTableRowsCommand(insertIndex, rowsCount, targetIndex, inheritIndex, this.targets);
590
- }
591
- else if (operation instanceof RemoveTableColumnsModel) {
592
- this.session.removeTableColumns(operation.insertIndex, operation.startIndex, operation.endIndex);
593
- this.changedTableSize(operation.insertIndex, this.session.sessionId);
594
- const { insertIndex, startIndex, endIndex } = operation;
595
- command = SaveCommandsHelper.getRemoveTableColumnsCommand(insertIndex, startIndex, endIndex, this.targets);
596
- }
597
- else if (operation instanceof RemoveTableRowsModel) {
598
- this.session.removeTableRows(operation.insertIndex, operation.startIndex, operation.endIndex);
599
- this.changedTableSize(operation.insertIndex, this.session.sessionId);
600
- const { insertIndex, startIndex, endIndex } = operation;
601
- command = SaveCommandsHelper.getRemoveTableRowsCommand(insertIndex, startIndex, endIndex, this.targets);
602
- }
603
- else if (operation instanceof ResizeTableColumnsModel) {
604
- this.session.resizeTableColumns(operation);
605
- this.changedTableSize(operation.insertIndex, this.session.sessionId);
606
- command = SaveCommandsHelper.getResizeTableColumnsCommand(operation, this.targets);
607
- }
608
- else if (operation instanceof RestoreTableModel) {
609
- this.session.restoreTable(operation.insertIndex, operation.oldTable);
610
- this.changedTableSize(operation.insertIndex, this.session.sessionId);
611
- command = SaveCommandsHelper.getRestoreTableCommand(operation, this.targets);
612
- }
613
- else if (operation instanceof InsertTableModel) {
614
- this.session.insertTableByDocumentIndex(operation);
615
- command = SaveCommandsHelper.getInsertTableCommand(operation, this.targets);
616
- }
617
- else if (operation instanceof RemoveNumberingsModel) {
618
- this.session.removeNumberings(operation.startIndex, operation.endIndex);
619
- const { startIndex, endIndex } = operation;
620
- command = SaveCommandsHelper.getRemoveNumberingsCommand(startIndex, endIndex, this.targets);
621
- }
622
- else if (operation instanceof ReplaceModel) {
623
- this.session.replace(operation);
624
- command = SaveCommandsHelper.getReplaceCommand(operation, this.targets);
625
- }
626
- else {
627
- throw new Error('Undo/redo is not implemented for the Operation');
628
- }
629
- this.commandsService.createCommand(command);
630
- this.renderer.updateCursor();
631
- }
632
- saveRemoveToHistory(range) {
633
- const restoreModel = this.createRestoreFromSlice(range.start.row, range.start.column, range.end.row, range.end.column);
634
- const count = restoreModel.endIndex - restoreModel.startIndex + 1;
635
- restoreModel.endIndex = restoreModel.startIndex; // this is to restore in position without deleting/replacing anything in range
636
- this.history.pushDelete(restoreModel);
637
- this.commandsService.createCommand(SaveCommandsHelper.getDeleteCommand(restoreModel.startIndex, count, this.targets));
638
- }
639
- saveInsertTextToHistory(paragraph, indexInParagraph, text) {
640
- const index = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, paragraph, indexInParagraph);
641
- this.history.pushInsertText(index, text);
642
- this.commandsService.createCommand(SaveCommandsHelper.getInsertTextCommand(text, index, this.targets));
643
- }
644
- saveInsertParagraphToHistory(content, model) {
645
- this.history.pushInsertParagraph(content, model, this.session.model.paragraphs);
646
- this.commandsService.createCommand(SaveCommandsHelper.getInsertParagraphCommand(model, this.targets));
647
- }
648
- saveInsertStyledTextToHistory(paragraph, indexInParagraph, text, style) {
649
- const index = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, paragraph, indexInParagraph);
650
- this.history.pushInsertStyledText(index, text, style);
651
- this.commandsService.createCommand(SaveCommandsHelper.getInsertStyledTextCommand(text, index, style, this.targets));
652
- }
653
- saveInsertElementToHistory(model) {
654
- this.history.pushInsertElement(model);
655
- this.commandsService.createCommand(SaveCommandsHelper.getInsertElementCommand(model, this.targets));
656
- }
657
- saveInsertBreakToHistory(model) {
658
- model.isOnNewParagraph =
659
- model.breakType === BreakTypes.Page &&
660
- BreakHelper.getBreakType(this.session.model, CUSTOM_ELEMENT_MARKER, model.insertIndex - 1) !== BreakTypes.Page;
661
- const count = model.isOnNewParagraph ? NEW_LINE_MARKUP.length + 1 : 1;
662
- this.history.pushInsertBreak(model, count);
663
- this.commandsService.createCommand(SaveCommandsHelper.getInsertBreakCommand(model, this.targets));
664
- }
665
- saveInsertTabToHistory(model) {
666
- this.history.pushInsertTab(model);
667
- this.commandsService.createCommand(SaveCommandsHelper.getInsertTabCommand(model, this.targets));
668
- }
669
- saveInsertImageToHistory(model) {
670
- this.history.pushInsertImage(model);
671
- this.commandsService.createCommand(SaveCommandsHelper.getInsertImageCommand(model, this.targets));
672
- }
673
- saveInsertLinkToHistory(model) {
674
- this.history.pushInsertLink(model);
675
- this.commandsService.createCommand(SaveCommandsHelper.getInsertLinkOperation(model, this.targets));
676
- }
677
- saveInsertTableToHistory(model) {
678
- this.history.pushInsertTable(model);
679
- this.commandsService.createCommand(SaveCommandsHelper.getInsertTableCommand(model, this.targets));
680
- }
681
- saveApplyTextStyleToHistory(startIndex, endIndex, textStyle) {
682
- const formats = FormatHelper.sliceSection(this.session.model.formats, startIndex, endIndex);
683
- const linkFormats = LinkHelper.sliceFormats(this.session.model.links, startIndex, endIndex);
684
- this.history.pushApplyTextStyle(startIndex, endIndex, textStyle, formats, linkFormats);
685
- this.commandsService.createCommand(SaveCommandsHelper.getApplyTextStyleCommand(startIndex, endIndex, textStyle, this.targets));
686
- }
687
- saveApplyParagraphStyleToHistory(startIndex, endIndex, paragraphStyle) {
688
- const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex);
689
- const paragraphsDeepCopy = paragraphs.map(x => new ParagraphModel({ insertIndex: x.insertIndex, paragraphStyle: new ParagraphStyleModel({ ...x.paragraphStyle }) }));
690
- this.history.pushApplyParagraphStyle(startIndex, endIndex, paragraphStyle, paragraphsDeepCopy);
691
- this.commandsService.createCommand(SaveCommandsHelper.getApplyParagraphStyleCommand(startIndex, endIndex, paragraphStyle, this.targets));
692
- }
693
- saveApplyElementStyleToHistory(current) {
694
- const previous = this.session.model.elements.find(x => x.insertIndex === current.insertIndex);
695
- this.history.pushApplyElementStyle(previous, current);
696
- this.commandsService.createCommand(SaveCommandsHelper.getApplyElementStyleCommand(current, this.targets));
697
- }
698
- saveAddNumberingToHistory(templateLevels, startIndex, endIndex) {
699
- const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex);
700
- const paragraphsDeepCopy = paragraphs.map(x => new ParagraphModel({ insertIndex: x.insertIndex, paragraphStyle: new ParagraphStyleModel({ ...x.paragraphStyle }) }));
701
- const removedNumberingIds = [...new Set(paragraphs.map(x => x.paragraphStyle.numberingId))];
702
- const numberings = this.session.generalProperties.numberings.filter(x => removedNumberingIds.includes(x.numberingId));
703
- this.history.pushAddNumbering(startIndex, endIndex, templateLevels, paragraphsDeepCopy, numberings);
704
- this.commandsService.createCommand(SaveCommandsHelper.getAddNumberingCommand(startIndex, endIndex, templateLevels, this.targets));
705
- }
706
- saveRemoveNumberingToHistory(startIndex, endIndex) {
707
- const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex);
708
- const paragraphsDeepCopy = paragraphs.map(x => new ParagraphModel({ insertIndex: x.insertIndex, paragraphStyle: new ParagraphStyleModel({ ...x.paragraphStyle }) }));
709
- const removedNumberingIds = [...new Set(paragraphs.map(x => x.paragraphStyle.numberingId))];
710
- const numberings = this.session.generalProperties.numberings.filter(x => removedNumberingIds.includes(x.numberingId));
711
- this.history.pushRemoveNumberings(startIndex, endIndex, numberings, paragraphsDeepCopy);
712
- this.commandsService.createCommand(SaveCommandsHelper.getRemoveNumberingsCommand(startIndex, endIndex, this.targets));
713
- }
714
- saveApplyImageStyleToHistory(image) {
715
- const previous = this.session.model.images.find(x => x.insertIndex === image.insertIndex);
716
- this.history.pushApplyImageStyle(previous, image);
717
- this.commandsService.createCommand(SaveCommandsHelper.getApplyImageStyleCommand(image.height, image.width, image.insertIndex, this.targets));
718
- }
719
- saveReplaceToHistory(range, model) {
720
- const restoreModel = this.createRestoreFromSlice(range.start.row, range.start.column, range.end.row, range.end.column);
721
- if (model.insertParagraph) {
722
- const { startIndex, count } = this.history.getDeleteDataForInsertParagraphs(ContentHelper.getContentFromInsertParagraph(model.insertParagraph), model.insertParagraph, this.session.model.paragraphs);
723
- restoreModel.startIndex = startIndex;
724
- restoreModel.endIndex = startIndex + count - 1;
725
- }
726
- else {
727
- restoreModel.endIndex = restoreModel.startIndex + (model.insertText?.text.length ?? 1); // this is to restore in range with deleting/replacing content within
728
- }
729
- this.history.pushReplace(restoreModel, model);
730
- this.commandsService.createCommand(SaveCommandsHelper.getReplaceCommand(model, this.targets));
731
- }
732
- createRestoreFromSlice(paragraphStart, indexInStart, paragraphEnd, indexInEnd) {
733
- const startIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, paragraphStart, indexInStart);
734
- const endIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, paragraphEnd, indexInEnd) - 1;
735
- const text = this.session.model.content.slice(startIndex, endIndex + 1);
736
- const formats = FormatHelper.sliceSection(this.session.model.formats, startIndex, endIndex);
737
- const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex).map(x => new ParagraphModel(x));
738
- const images = IndexedElementHelper.sliceSection(this.session.model.images, startIndex, endIndex).map(x => new ImageModel(x));
739
- const tables = IndexedElementHelper.sliceSection(this.session.model.tables, startIndex, endIndex).map(x => new TableModel(x));
740
- const elements = IndexedElementHelper.sliceSection(this.session.model.elements, startIndex, endIndex).map(x => new ElementModel({ ...x, id: 0, guid: '' }));
741
- const breaks = IndexedElementHelper.sliceSection(this.session.model.breaks, startIndex, endIndex).map(x => new BreakModel(x));
742
- const tabs = IndexedElementHelper.sliceSection(this.session.model.tabs, startIndex, endIndex).map(x => new TabModel(x));
743
- const links = LinkHelper.sliceSection(this.session.model.links, startIndex, endIndex).map(x => new LinkModel(x));
744
- return new RestoreModel({ startIndex, endIndex, text, formats, paragraphs, images, tables, elements, breaks, tabs, links });
745
- }
746
- createCustomElement(data) {
747
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
748
- const insertElement = new InsertElementModel({ element: new ElementModel({ ...data, insertIndex }) });
749
- if (!this.selection.isEmpty) {
750
- this.replaceBy(new ReplaceModel({ insertElement }));
751
- return;
752
- }
753
- this.saveInsertElementToHistory(insertElement);
754
- const endPoint = this.session.insertElement(this.selection.cursor, data);
755
- this.onDocumentChange(new Range(this.selection.cursor, endPoint));
756
- this.onSelectionChange();
757
- }
758
- removeSelected() {
759
- if (this.selection.isEmpty) {
760
- return;
761
- }
762
- this.saveRemoveToHistory(this.selection.range);
763
- this.removeCustomElementsData();
764
- this.session.remove(this.selection.range);
765
- this.onSelectionChange();
766
- this.focus();
767
- }
768
- removeCustomElementsData() {
769
- const startIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
770
- const endIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.end.row, this.selection.range.end.column) - 1;
771
- const elements = IndexedElementHelper.sliceSection(this.session.model.elements, startIndex, endIndex).slice();
772
- if (elements.length) {
773
- this.editorService.removeCustomElementsData(elements);
774
- }
775
- }
776
- onInput() {
777
- const text = this.textInput.getInsertText();
778
- if (!text) {
779
- return;
780
- }
781
- const isEmptyNumberingParagraph = this.isEmptyNumberingParagraph(this.selection.cursor.row);
782
- if (text === NEW_LINE_MARKUP && this.selection.isEmpty && isEmptyNumberingParagraph) {
783
- this.removeNumberingsFromParagraphs();
784
- }
785
- else {
786
- this.insert(text);
787
- this.scrollCursorIntoMainView();
788
- }
789
- }
790
- onCut(event) {
791
- event.preventDefault();
792
- const data = this.getSelectedText();
793
- if (!data) {
794
- return;
795
- }
796
- this.editorService.setClipboardData(data);
797
- this.clipboard.copy(data);
798
- this.cut();
799
- this.scrollCursorIntoMainView();
800
- }
801
- onCopy(event) {
802
- event.preventDefault();
803
- const data = this.getSelectedText();
804
- if (!data) {
805
- return;
806
- }
807
- this.editorService.setClipboardData(data);
808
- this.clipboard.copy(data);
809
- }
810
- onPaste(event) {
811
- event.preventDefault();
812
- const data = this.textInput.getClipboardData(event);
813
- this.pasteData(data);
814
- }
815
- initResizeListener() {
816
- window.addEventListener('resize', this.rerenderResize);
817
- }
818
- destroyResizeListener() {
819
- window.removeEventListener('resize', this.rerenderResize);
820
- }
821
- rerenderMarker() {
822
- this.renderer.loop.schedule({ marker: true });
823
- }
824
- onBlur() {
825
- if (!this.textInput.isFocused) {
826
- return;
827
- }
828
- this.textInput.isFocused = false;
829
- this.renderer.hideCursor();
830
- }
831
- onFocus() {
832
- if (this.textInput.isFocused) {
833
- return;
834
- }
835
- this.selection.blur();
836
- this.textInput.isFocused = true;
837
- this.renderer.showCursor();
838
- }
839
- onMouseClick(event) {
840
- const customElement = this.setCurrentSession(event.target);
841
- if (customElement && customElement.tagName !== this.tableCellTagName && customElement.tagName !== this.edgeElementTagName) {
842
- this.focusCustomComponent(customElement);
843
- }
844
- else {
845
- this.selection.blur();
846
- }
847
- }
848
- onLeftClick(event) {
849
- const customElement = this.setCurrentSession(event.target);
850
- if (customElement && customElement.tagName !== this.tableCellTagName && customElement.tagName !== this.edgeElementTagName) {
851
- this.focusCustomComponent(customElement);
852
- return;
853
- }
854
- const position = this.renderer.screenToTextCoordinatesUsingMidpoint(event.clientX, event.clientY);
855
- if (event.shiftKey) {
856
- this.selection.moveSelection(position);
857
- }
858
- else {
859
- this.selection.placeCursor(position);
860
- }
861
- this.focus();
862
- this.onSelectionChange();
863
- event.preventDefault();
864
- if (event.ctrlKey) {
865
- const link = this.getLinkModel(event);
866
- if (link) {
867
- window.open(link.link);
868
- event.preventDefault();
869
- return;
870
- }
871
- }
872
- this.mouseHandler.startMousePress(this);
873
- }
874
- onDoubleClick(event) {
875
- const isEdgeEdit = this.mainSession.customComponents.edges.isEdit;
876
- const customElement = this.getCustomElement(event.target);
877
- if (customElement) {
878
- const elementSessionId = +customElement.attributes.getNamedItem('data-session-id').value;
879
- this.regulatorService.setCustomSessionAsCurrent(elementSessionId);
880
- }
881
- else {
882
- this.regulatorService.setMainSessionAsCurrent();
883
- }
884
- if (customElement && customElement.tagName !== this.tableCellTagName && customElement.tagName !== this.edgeElementTagName) {
885
- this.focusCustomComponent(customElement);
886
- return;
887
- }
888
- event.preventDefault();
889
- const position = this.renderer.screenToTextCoordinatesUsingMidpoint(event.clientX, event.clientY);
890
- if (!isEdgeEdit && this.mainSession.customComponents.edges.isEdit) {
891
- this.selection.placeCursor(position);
892
- }
893
- else {
894
- const range = this.session.getWordRange(position.row, position.column);
895
- this.selection.placeSelection(range.start, range.end);
896
- }
897
- this.onSelectionChange();
898
- }
899
- onTripleClick(event) {
900
- const customElement = this.setCurrentSession(event.target);
901
- if (customElement && customElement.tagName !== this.tableCellTagName && customElement.tagName !== this.edgeElementTagName) {
902
- this.focusCustomComponent(customElement);
903
- return;
904
- }
905
- event.preventDefault();
906
- const position = this.renderer.screenToTextCoordinatesUsingMidpoint(event.clientX, event.clientY);
907
- const start = new CursorParagraph(position.row, 0);
908
- const end = new CursorParagraph(position.row, this.session.displayData.getParagraphContent(position.row).length);
909
- this.selection.placeSelection(start, end);
910
- this.onSelectionChange();
911
- }
912
- onQuadClick(event) {
913
- const customElement = this.setCurrentSession(event.target);
914
- if (customElement && customElement.tagName !== this.tableCellTagName && customElement.tagName !== this.edgeElementTagName) {
915
- this.focusCustomComponent(customElement);
916
- return;
917
- }
918
- event.preventDefault();
919
- this.selection.selectAll(this.session.model);
920
- this.onSelectionChange();
921
- }
922
- onMouseWheel(event) {
923
- if (event.ctrlKey) {
924
- return;
925
- }
926
- const factor = 0.35;
927
- const scrollSpeed = 4;
928
- const deltaY = event.deltaY * factor * scrollSpeed;
929
- this.mainRenderer.scrollBy(deltaY);
930
- event.stopPropagation();
931
- event.preventDefault();
932
- }
933
- getLinkModel(event) {
934
- const isInsideEdge = this.isInsideEdge(event.target);
935
- const isEdgeEdit = this.mainSession.customComponents.edges.isEdit;
936
- if (!isInsideEdge || isEdgeEdit) {
937
- const position = this.renderer.screenToTextCoordinatesUsingBoundary(event.clientX, event.clientY);
938
- return this.session.getLinkModel(position);
939
- }
940
- const customElement = this.getCustomElement(event.target);
941
- const sessionId = +customElement.attributes.getNamedItem('data-session-id').value;
942
- const session = this.regulatorService.getSessionModel(sessionId);
943
- const position = session.renderer.screenToTextCoordinatesUsingBoundary(event.clientX, event.clientY, customElement.getBoundingClientRect());
944
- return session.session.getLinkModel(position);
945
- }
946
- setCurrentSession(element) {
947
- const customElement = this.getCustomElement(element);
948
- const isInsideEdge = this.isInsideEdge(customElement);
949
- const isEdgeEdit = this.mainSession.customComponents.edges.isEdit;
950
- if (!customElement || (!isEdgeEdit && isInsideEdge)) {
951
- this.regulatorService.setMainSessionAsCurrent();
952
- return this.customElementTagNames.includes(customElement?.tagName) ? customElement : null;
953
- }
954
- const elementSessionId = +customElement.attributes.getNamedItem('data-session-id').value;
955
- this.regulatorService.setCustomSessionAsCurrent(elementSessionId);
956
- return customElement.tagName !== this.edgeElementTagName ? customElement : null;
957
- }
958
- getCustomElement(element) {
959
- if (!element || element.tagName === this.parentTagName) {
960
- return null;
961
- }
962
- else if (this.customElementTagNames.includes(element.tagName)) {
963
- return element;
964
- }
965
- else {
966
- return this.getCustomElement(element.parentElement);
967
- }
968
- }
969
- isInsideEdge(element) {
970
- return !!this.getParentEdge(element);
971
- }
972
- getParentEdge(element) {
973
- if (!element || element.tagName === this.parentTagName) {
974
- return null;
975
- }
976
- else if (element.tagName === this.edgeElementTagName) {
977
- return element;
978
- }
979
- else {
980
- return this.getParentEdge(element.parentElement);
981
- }
982
- }
983
- /**
984
- * Returns the string of text currently highlighted.
985
- */
986
- getSelectedText() {
987
- const selectionRange = this.selection.selectedRange;
988
- if (selectionRange.isEmpty) {
989
- return '';
990
- }
991
- const startIndex = ContentHelper.paragraphPositionToDocumentIndex(this.session.displayData.paragraphs, selectionRange.start);
992
- const endIndex = ContentHelper.paragraphPositionToDocumentIndex(this.session.displayData.paragraphs, selectionRange.end);
993
- let elementIndexes = [];
994
- ContentHelper.setIndexesElementsInInterval(this.session.model.breaks, elementIndexes, startIndex, endIndex);
995
- ContentHelper.setIndexesElementsInInterval(this.session.model.tables, elementIndexes, startIndex, endIndex);
996
- ContentHelper.setIndexesElementsInInterval(this.session.model.images, elementIndexes, startIndex, endIndex);
997
- ContentHelper.setIndexesElementsInInterval(this.session.model.elements, elementIndexes, startIndex, endIndex);
998
- ContentHelper.setIndexesElementsInInterval(this.session.model.tabs, elementIndexes, startIndex, endIndex);
999
- elementIndexes.sort((a, b) => b - a);
1000
- let textInterval = this.session.displayData.getTextRange(selectionRange);
1001
- elementIndexes.forEach(x => {
1002
- textInterval = textInterval.slice(0, x) + textInterval.slice(x + 1);
1003
- });
1004
- return textInterval;
1005
- }
1006
- initMainSession() {
1007
- const pageWidth = this.customPageWidth ?? this.model.pageWidth;
1008
- this.container.nativeElement.style.maxWidth = `${pageWidth}px`;
1009
- const scalingRatio = this.customPageWidth ? ScalingHelper.getRatio(this.customPageWidth, this.model.pageWidth) : 1;
1010
- this.regulatorService.addMainSession(this.model, pageWidth, scalingRatio, this.container);
1011
- }
1012
- onSelectionChange() {
1013
- this.session.applyToolbarStyles();
1014
- this.renderer.updateSelection(this.selection.selectedRange);
1015
- if (this.selection.isEmpty) {
1016
- this.renderer.updateCursor();
1017
- }
1018
- this.editorService.setHasSelection(!this.selection.isEmpty);
1019
- this.rerenderMarker();
1020
- }
1021
- enableSelection() {
1022
- if (!this.selection.isDisabled) {
1023
- return;
1024
- }
1025
- const customElement = this.container.nativeElement.querySelector(`[data-session-id="${this.session.sessionId}"]`);
1026
- if (customElement.tagName === this.tableCellTagName) {
1027
- const tableSession = this.regulatorService.getSession(this.regulatorService.currentSession.parentSessionId);
1028
- const table = tableSession.customComponents.tables.find(x => x.instance.sessionId === this.regulatorService.currentSession.parentSessionId);
1029
- table.instance.tableSelection.clearSelection();
1030
- }
1031
- this.selection.enableSelection();
1032
- this.renderer.cursorLayer.showCursor();
1033
- }
1034
- onHotKeyDown(event) {
1035
- this.editorService.keyDown(event);
1036
- }
1037
- onPrint() {
1038
- PrintHelper.printDocument(this.mainSession);
1039
- }
1040
- focusCustomComponent(element) {
1041
- const index = +element.attributes.getNamedItem('data-insert-index').value;
1042
- const component = this.session.customComponents.images.find(x => x.instance.insertIndex === index) ??
1043
- this.session.customComponents.tables.find(x => x.instance.insertIndex === index) ??
1044
- this.session.customComponents.customElements.find(x => x.instance.insertIndex === index);
1045
- if (!component) {
1046
- return;
1047
- }
1048
- const position = this.session.displayData.indexToPosition(index, 0);
1049
- this.selection.focus(component, position);
1050
- this.onSelectionChange();
1051
- }
1052
- isEmptyNumberingParagraph(paragraphIndex) {
1053
- const currentLine = this.session.displayData.getParagraphContent(paragraphIndex);
1054
- return currentLine.length === 0 && this.session.model.paragraphs[paragraphIndex].paragraphStyle.numberingId !== null;
1055
- }
1056
- scrollCursorIntoMainView(offset) {
1057
- if (this.session !== this.mainSession) {
1058
- return;
1059
- }
1060
- this.mainRenderer.scrollCursorIntoView(null, offset);
1061
- }
1062
- changedTableSize(insertIndex, sessionId) {
1063
- const session = this.regulatorService.getSession(sessionId);
1064
- const paragraph = ContentHelper.documentIndexToParagraphIndex(session.displayData.paragraphs, insertIndex).row;
1065
- session.displayData.resetAllNumberingInfo(paragraph);
1066
- session.displayData.updateNextLineIndexes(paragraph, paragraph);
1067
- session.displayData.updateNumberingsDataOnChange(paragraph + 1);
1068
- this.focus();
1069
- }
1070
- insertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex, sessionId) {
1071
- this.regulatorService.setCustomSessionAsCurrent(sessionId);
1072
- const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.displayData.paragraphs, insertIndex);
1073
- this.selection.placeCursor(beforeTable);
1074
- const table = this.session.model.tables.find(x => x.insertIndex === insertIndex);
1075
- this.history.pushInsertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex, table);
1076
- this.commandsService.createCommand(SaveCommandsHelper.getInsertTableRowsCommand(rowsCount, inheritIndex, insertIndex, targetIndex, this.targets));
1077
- this.session.insertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex);
1078
- this.changedTableSize(insertIndex, sessionId);
1079
- }
1080
- insertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex, sessionId) {
1081
- this.regulatorService.setCustomSessionAsCurrent(sessionId);
1082
- const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.displayData.paragraphs, insertIndex);
1083
- this.selection.placeCursor(beforeTable);
1084
- const table = this.session.model.tables.find(x => x.insertIndex === insertIndex);
1085
- this.history.pushInsertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex, table);
1086
- this.commandsService.createCommand(SaveCommandsHelper.getInsertTableColumnsCommand(columnsCount, inheritIndex, insertIndex, targetIndex, this.targets));
1087
- this.session.insertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex);
1088
- this.changedTableSize(insertIndex, sessionId);
1089
- }
1090
- removeTableRows(insertIndex, startIndex, endIndex, sessionId) {
1091
- this.regulatorService.setCustomSessionAsCurrent(sessionId);
1092
- const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.displayData.paragraphs, insertIndex);
1093
- this.selection.placeCursor(beforeTable);
1094
- const table = this.session.model.tables.find(x => x.insertIndex === insertIndex);
1095
- this.history.pushRemoveTableRows(insertIndex, startIndex, endIndex, table);
1096
- this.commandsService.createCommand(SaveCommandsHelper.getRemoveTableRowsCommand(startIndex, endIndex, insertIndex, this.targets));
1097
- this.session.removeTableRows(insertIndex, startIndex, endIndex);
1098
- this.changedTableSize(insertIndex, sessionId);
1099
- }
1100
- removeTableColumns(insertIndex, startIndex, endIndex, sessionId) {
1101
- this.regulatorService.setCustomSessionAsCurrent(sessionId);
1102
- const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.displayData.paragraphs, insertIndex);
1103
- this.selection.placeCursor(beforeTable);
1104
- const table = this.session.model.tables.find(x => x.insertIndex === insertIndex);
1105
- this.history.pushRemoveTableColumns(insertIndex, startIndex, endIndex, table);
1106
- this.commandsService.createCommand(SaveCommandsHelper.getRemoveTableColumnsCommand(startIndex, endIndex, insertIndex, this.targets));
1107
- this.session.removeTableColumns(insertIndex, startIndex, endIndex);
1108
- this.changedTableSize(insertIndex, sessionId);
1109
- }
1110
- resizeTableColumns(resizeTableColumns, sessionId) {
1111
- this.regulatorService.setCustomSessionAsCurrent(sessionId);
1112
- const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.displayData.paragraphs, resizeTableColumns.insertIndex);
1113
- this.selection.placeCursor(beforeTable);
1114
- this.history.pushResizeTableColumns(resizeTableColumns);
1115
- this.commandsService.createCommand(SaveCommandsHelper.getResizeTableColumnsCommand(resizeTableColumns, this.targets));
1116
- this.session.resizeTableColumns(resizeTableColumns);
1117
- this.changedTableSize(resizeTableColumns.insertIndex, sessionId);
1118
- }
1119
- onMousePressedMove(event) {
1120
- const position = this.renderer.screenToTextCoordinatesUsingMidpoint(event.clientX, event.clientY);
1121
- const cursor = this.selection.cursor;
1122
- this.selection.moveSelection(position);
1123
- if (cursor.column !== this.selection.cursor.column || cursor.row !== this.selection.cursor.row) {
1124
- this.onSelectionChange();
1125
- }
1126
- this.scrollCursorIntoMainView();
1127
- }
1128
- provideTextStyle(component) {
1129
- const session = this.regulatorService.getSession(component.sessionId);
1130
- const format = session.model.formats.find(x => x.startIndex <= component.insertIndex && x.endIndex >= component.insertIndex);
1131
- component.receiveStyle(format.textStyle);
1132
- }
1133
- receiveTextStyleSubscription() {
1134
- return this.editorService.receiveTextStyle$.subscribe(x => this.provideTextStyle(x));
1135
- }
1136
- searchOptionSubscription() {
1137
- return this.editorService.searchOptions$.subscribe(searchOptions => {
1138
- this.find(searchOptions);
1139
- this.editorService.searchIteration = this.updateCounter();
1140
- });
1141
- }
1142
- replaceSubscription() {
1143
- return this.editorService.replace$.subscribe(replace => {
1144
- this.replace(replace.searchValue, replace.replaceValue);
1145
- this.editorService.searchIteration = this.updateCounter();
1146
- });
1147
- }
1148
- setTextStylesSubscription() {
1149
- return this.editorService.setTextStyles$.subscribe(textStyles => {
1150
- this.applyTextStyles(textStyles);
1151
- this.focus();
1152
- });
1153
- }
1154
- setParagraphStylesSubscription() {
1155
- return this.editorService.setParagraphStyles$.subscribe(paragraphStyles => {
1156
- this.applyParagraphStyles(paragraphStyles);
1157
- this.focus();
1158
- });
1159
- }
1160
- setNumberingTemplateTypeSubscription() {
1161
- return this.editorService.setNumberingTemplateType$.subscribe(numberingTemplateType => {
1162
- this.setNumberingTemplate(numberingTemplateType);
1163
- this.focus();
1164
- });
1165
- }
1166
- removeNumberingsSubscription() {
1167
- return this.editorService.removeNumberings$.subscribe(() => {
1168
- this.removeNumberingsFromParagraphs();
1169
- this.focus();
1170
- });
1171
- }
1172
- setImageStyleSubscription() {
1173
- return this.editorService.setImageStyle$.subscribe(image => this.applyImageStyles(image));
1174
- }
1175
- changeElementStyleSubscription() {
1176
- return this.editorService.changeElementStyle$.subscribe(x => this.applyElementStyle(x));
1177
- }
1178
- createCustomComponentSubscription() {
1179
- return this.editorService.createCustomComponent$.subscribe(model => {
1180
- this.createCustomElement(model);
1181
- this.focus();
1182
- });
1183
- }
1184
- insertBreakSubscription() {
1185
- return this.editorService.insertBreak$.subscribe(breakType => {
1186
- this.insertBreak(breakType);
1187
- this.focus();
1188
- });
1189
- }
1190
- insertImageSubscription() {
1191
- return this.editorService.insertImage$.subscribe(imageData => {
1192
- this.insertImage(imageData);
1193
- this.focus();
1194
- });
1195
- }
1196
- insertLinkSubscription() {
1197
- return this.editorService.insertLink$.subscribe(linkData => {
1198
- this.insertLink(new LinkDataModel({ link: linkData.link, text: linkData.text }));
1199
- this.focus();
1200
- });
1201
- }
1202
- endMousePressSubscription() {
1203
- return this.editorService.endMousePress$.subscribe(() => {
1204
- this.mouseHandler.endMousePress();
1205
- });
1206
- }
1207
- disableSelectionSubscription() {
1208
- return this.editorService.disableSelection$.subscribe(() => {
1209
- this.selection.disableSelection();
1210
- this.onSelectionChange();
1211
- this.renderer.cursorLayer.hideCursor();
1212
- });
1213
- }
1214
- changedTableSizeSubscription() {
1215
- return this.editorService.changedTableSize$.subscribe(data => {
1216
- this.changedTableSize(data.insertIndex, data.sessionId);
1217
- });
1218
- }
1219
- changedEdgeSizeSubscription() {
1220
- return this.editorService.changedEdgeSize$.subscribe(({ edgeType, pageType }) => this.mainSession.displayData.updatePageVerticalData(edgeType, pageType));
1221
- }
1222
- imageLoadedSubscription() {
1223
- return this.editorService.imageLoaded$.subscribe(sessionId => this.regulatorService.getSession(sessionId).onRendered());
1224
- }
1225
- changedEdgeSubscription() {
1226
- return this.editorService.changedEdge$.subscribe(sessionId => this.regulatorService.arrangeEdgeChange(sessionId));
1227
- }
1228
- insertTableRowsSubscription() {
1229
- return this.editorService.insertTableRows$.subscribe(data => {
1230
- this.insertTableRows(data.insertIndex, data.rowsCount, data.targetIndex, data.inheritIndex, data.sessionId);
1231
- });
1232
- }
1233
- insertTableColumnsSubscription() {
1234
- return this.editorService.insertTableColumns$.subscribe(data => {
1235
- this.insertTableColumns(data.insertIndex, data.columnsCount, data.targetIndex, data.inheritIndex, data.sessionId);
1236
- });
1237
- }
1238
- removeTableRowsSubscription() {
1239
- return this.editorService.removeTableRows$.subscribe(data => {
1240
- this.removeTableRows(data.insertIndex, data.startIndex, data.endIndex, data.sessionId);
1241
- });
1242
- }
1243
- removeTableColumnsSubscription() {
1244
- return this.editorService.removeTableColumns$.subscribe(data => {
1245
- this.removeTableColumns(data.insertIndex, data.startIndex, data.endIndex, data.sessionId);
1246
- });
1247
- }
1248
- removeRightSubscription() {
1249
- return this.editorService.removeRight$.subscribe(() => this.removeRight());
1250
- }
1251
- resizeTableColumnsSubscription() {
1252
- return this.editorService.resizeTableColumns$.subscribe(data => {
1253
- this.resizeTableColumns(data.resizeTableColumns, data.sessionId);
1254
- });
1255
- }
1256
- insertTableSubscription() {
1257
- return this.editorService.insertTable$.subscribe(data => {
1258
- this.insertTable(data);
1259
- });
1260
- }
1261
- insertTextSubscription() {
1262
- return this.editorService.insertText$.subscribe(x => {
1263
- this.insert(x);
1264
- this.focus();
1265
- });
1266
- }
1267
- undoSubscription() {
1268
- return this.editorService.undo$.subscribe(() => {
1269
- this.undo();
1270
- this.focus();
1271
- this.scrollCursorIntoMainView();
1272
- });
1273
- }
1274
- redoSubscription() {
1275
- return this.editorService.redo$.subscribe(() => {
1276
- this.redo();
1277
- this.focus();
1278
- this.scrollCursorIntoMainView();
1279
- });
1280
- }
1281
- removeLeftSubscription() {
1282
- return this.editorService.removeLeft$.subscribe(() => this.removeLeft());
1283
- }
1284
- printSubscription() {
1285
- return this.editorService.print$.subscribe(() => this.onPrint());
1286
- }
1287
- cutSelectedSubscription() {
1288
- return this.editorService.cutSelected$.subscribe(() => {
1289
- this.onCut(new ClipboardEvent('cut'));
1290
- });
1291
- }
1292
- copySelectedSubscription() {
1293
- return this.editorService.copySelected$.subscribe(() => {
1294
- this.onCopy(new ClipboardEvent('copy'));
1295
- });
1296
- }
1297
- pasteFromClipboardSubscription() {
1298
- return this.editorService.pasteFromClipboard$.subscribe(() => {
1299
- this.readClipboard()
1300
- .then(data => this.pasteData(data))
1301
- .catch(() => {
1302
- // continue regardless error
1303
- });
1304
- });
1305
- }
1306
- async readClipboard() {
1307
- const read = await navigator.permissions.query({ name: 'clipboard-read' });
1308
- return new Promise(resolve => {
1309
- if (navigator.clipboard && read.state != 'denied') {
1310
- navigator.clipboard
1311
- .readText()
1312
- .then(data => {
1313
- resolve(data);
1314
- })
1315
- .catch(() => {
1316
- // continue regardless error
1317
- });
1318
- }
1319
- else {
1320
- resolve(this.clipboardData);
1321
- }
1322
- });
1323
- }
1324
- pasteData(data) {
1325
- if (!data) {
1326
- return;
1327
- }
1328
- const text = data.replace(/\r\n/g, '\n').replace(/\t/g, ' ');
1329
- this.insert(text);
1330
- this.scrollCursorIntoMainView();
1331
- }
1332
- selectAllSubscription() {
1333
- return this.editorService.selectAll$.subscribe(() => {
1334
- this.selection.selectAll(this.session.model);
1335
- this.onSelectionChange();
1336
- });
1337
- }
1338
- removeSelectedSubscription() {
1339
- return this.editorService.removeSelected$.subscribe(() => {
1340
- this.removeSelected();
1341
- });
1342
- }
1343
- clipboardDataSubscription() {
1344
- return this.editorService.clipboardData$.subscribe(data => {
1345
- this.clipboardData = data;
1346
- });
1347
- }
1348
- updateEdgeSubscription() {
1349
- return this.editorService.updateEdges$.subscribe(sessionId => {
1350
- let footers = this.mainSession.customComponents.edges.footersComponents;
1351
- let existed = this.mainSession.customComponents.edges.headersComponents.findIndex(x => x.instance.sessionId === sessionId);
1352
- if (existed !== -1) {
1353
- const headers = this.mainSession.customComponents.edges.headersComponents.slice(existed + 1);
1354
- headers.forEach(x => {
1355
- x.instance.session.displayData.updateNextLineIndexes(0, x.instance.session.displayData.paragraphs.length - 1);
1356
- });
1357
- }
1358
- else {
1359
- existed = this.mainSession.customComponents.edges.footersComponents.findIndex(x => x.instance.sessionId === sessionId);
1360
- footers = this.mainSession.customComponents.edges.footersComponents.slice(existed + 1);
1361
- }
1362
- footers.forEach(x => {
1363
- x.instance.session.displayData.updateNextLineIndexes(0, x.instance.session.displayData.paragraphs.length - 1);
1364
- });
1365
- });
1366
- }
1367
- }
1368
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvZWRpdG9yL2V4ZWN1dGlvbi9lZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDMUYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDOUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFcEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFHcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDeEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUtsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRWhFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3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QyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xILENBQUMsQ0FBQyxDQUFDO2FBQ047aUJBQU07Z0JBQ0gsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDO2dCQUN2SCxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMxRjtZQUNELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbEgsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsaXBib2FyZCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jbGlwYm9hcmQnO1xuaW1wb3J0IHsgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFkZE51bWJlcmluZ01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9hZGQtbnVtYmVyaW5nLm1vZGVsJztcbmltcG9ydCB7IEFwcGx5RWxlbWVudFN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2FwcGx5LWVsZW1lbnQtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgQXBwbHlJbWFnZVN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2FwcGx5LWltYWdlLXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IEFwcGx5UGFyYWdyYXBoU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktcGFyYWdyYXBoLXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IEFwcGx5VGV4dFN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2FwcGx5LXRleHQtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgQmFzZU5vZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvYWJzdHJhY3QvYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnJlYWtIZWxwZXIgfSBmcm9tICcuLi9nYWRnZXRzL3BhZ2UtYnJlYWsvYnJlYWsuaGVscGVyJztcbmltcG9ydCB7IEJyZWFrTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2JyZWFrLm1vZGVsJztcbmltcG9ydCB7IEJyZWFrVHlwZXMgfSBmcm9tICcuLi9nYWRnZXRzL3BhZ2UtYnJlYWsvYnJlYWstdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBDb21tYW5kTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2NvbW1hbmQubW9kZWwnO1xuaW1wb3J0IHsgQ29tbWFuZHNTZXJ2aWNlIH0gZnJvbSAnLi4vb3BlcmF0aW9ucy9jb21tYW5kcy5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnRlbnRIZWxwZXIgfSBmcm9tICcuLi9wb3NpdGlvbmluZy9jb250ZW50LmhlbHBlcic7XG5pbXBvcnQgeyBDb250ZW50U3R5bGVIZWxwZXIgfSBmcm9tICcuLi9jb250ZW50L2hlbHBlcnMvY29udGVudC1zdHlsZS5oZWxwZXInO1xuaW1wb3J0IHsgQ3Vyc29yUGFyYWdyYXBoIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvY3Vyc29yLXBhcmFncmFwaCc7XG5pbXBvcnQgeyBDVVNUT01fRUxFTUVOVF9NQVJLRVIsIFRBQkxFX01BUktFUiB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2hhcmVkL2N1c3RvbS1jb250ZW50LW1hcmtlcnMuY29uc3QnO1xuaW1wb3J0IHsgRGVsZXRlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2RlbGV0ZS5tb2RlbCc7XG5pbXBvcnQgeyBEb2N1bWVudEhhbmRsZXIgfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9kb2N1bWVudC5oYW5kbGVyJztcbmltcG9ydCB7IERvY3hNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvZG9jeC5tb2RlbCc7XG5pbXBvcnQgeyBFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdFNlc3Npb24gfSBmcm9tICcuL2VkaXQuc2Vzc2lvbic7XG5pbXBvcnQgeyBFbGVtZW50RGF0YU1vZGVsIH0gZnJvbSAnLi4vY29tcG9uZW50cy9leHRlcm5hbC1lbGVtZW50L21vZGVscy9lbGVtZW50LWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgRWxlbWVudE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9lbGVtZW50Lm1vZGVsJztcbmltcG9ydCB7IEZvcm1hdEhlbHBlciB9IGZyb20gJy4uL2NvbnRlbnQvaGVscGVycy9mb3JtYXQuaGVscGVyJztcbmltcG9ydCB7IEltYWdlRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbWFnZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IEltYWdlSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL2ltYWdlLmhlbHBldCc7XG5pbXBvcnQgeyBJbWFnZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbWFnZS5tb2RlbCc7XG5pbXBvcnQgeyBJbmRleGVkRWxlbWVudEhlbHBlciB9IGZyb20gJy4uL2NvbnRlbnQvaGVscGVycy9pbmRleGVkLWVsZW1lbnQuaGVscGVyJztcbmltcG9ydCB7IElucHV0SGFuZGxlciB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2lucHV0LmhhbmRsZXInO1xuaW1wb3J0IHsgSW5zZXJ0QnJlYWtNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWJyZWFrLm1vZGVsJztcbmltcG9ydCB7IEluc2VydEVsZW1lbnRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWVsZW1lbnQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0SW1hZ2VNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWltYWdlLm1vZGVsJztcbmltcG9ydCB7IEluc2VydExpbmtNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWxpbmsubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0UGFyYWdyYXBoTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC1wYXJhZ3JhcGgubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0U3R5bGVkVGV4dE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtc3R5bGVkLXRleHQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0VGFibGVDb2x1bW5zTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWJsZS1jb2x1bW5zLm1vZGVsJztcbmltcG9ydCB7IEluc2VydFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRUYWJsZVJvd3NNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LXRhYmxlLXJvd3MubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0VGFiTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWIubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0VGV4dE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtdGV4dC5tb2RlbCc7XG5pbXBvcnQgeyBMaW5rRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9saW5rLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgTGlua0hlbHBlciB9IGZyb20gJy4uL2NvbnRlbnQvaGVscGVycy9saW5rLmhlbHBlcic7XG5pbXBvcnQgeyBMaW5rTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2xpbmsubW9kZWwnO1xuaW1wb3J0IHsgTW91c2VIYW5kbGVyIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vbW91c2UuaGFuZGxlcic7XG5pbXBvcnQgeyBORVdfTElORV9NQVJLVVAgfSBmcm9tICcuLi9jb250ZW50L2NvbnN0YW50cy9lZGl0b3IuY29uc3QnO1xuaW1wb3J0IHsgTnVtYmVyaW5nTGV2ZWxNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvbnVtYmVyaW5nLWxldmVsLm1vZGVsJztcbmltcG9ydCB7IE9wZXJhdGlvbiB9IGZyb20gJy4uL2dhZGdldHMvaGlzdG9yeS9vcGVyYXRpb24udHlwZSc7XG5pbXBvcnQgeyBPcGVyYXRpb25IaXN0b3J5IH0gZnJvbSAnLi4vZ2FkZ2V0cy9oaXN0b3J5L29wZXJhdGlvbi1oaXN0b3J5JztcbmltcG9ydCB7IFBhcmFncmFwaE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9wYXJhZ3JhcGgubW9kZWwnO1xuaW1wb3J0IHsgUGFyYWdyYXBoU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcGFyYWdyYXBoLXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IFBvc2l0aW9uSGVscGVyIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvcG9zaXRpb24uaGVscGVyJztcbmltcG9ydCB7IFByaW50SGVscGVyIH0gZnJvbSAnLi4vZGlzcGxheS9wcmludC9wcmludC5oZWxwZXInO1xuaW1wb3J0IHsgUmFuZ2UgfSBmcm9tICcuLi9wb3NpdGlvbmluZy9yYW5nZSc7XG5pbXBvcnQgeyBSZWd1bGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi9yZWd1bGF0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBSZW1vdmVOdW1iZXJpbmdzTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3JlbW92ZS1udW1iZXJpbmdzLm1vZGVsJztcbmltcG9ydCB7IFJlbW92ZVRhYmxlQ29sdW1uc01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZW1vdmUtdGFibGUtY29sdW1ucy5tb2RlbCc7XG5pbXBvcnQgeyBSZW1vdmVUYWJsZVJvd3NNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVtb3ZlLXRhYmxlLXJvd3MubW9kZWwnO1xuaW1wb3J0IHsgUmVuZGVyZXIgfSBmcm9tICcuLi9kaXNwbGF5L3JlbmRlcmVyJztcbmltcG9ydCB7IFJlcGxhY2VNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVwbGFjZS5tb2RlbCc7XG5pbXBvcnQgeyBSZXNpemVUYWJsZUNvbHVtbnNNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVzaXplLXRhYmxlLWNvbHVtbnMubW9kZWwnO1xuaW1wb3J0IHsgUmVzdG9yZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXN0b3JlLm1vZGVsJztcbmltcG9ydCB7IFJlc3RvcmVOdW1iZXJpbmdzTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3Jlc3RvcmUtbnVtYmVyaW5ncy5tb2RlbCc7XG5pbXBvcnQgeyBSZXN0b3JlUGFyYWdyYXBoU3R5bGVzTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3Jlc3RvcmUtcGFyYWdyYXBoLXN0eWxlcy5tb2RlbCc7XG5pbXBvcnQgeyBSZXN0b3JlVGFibGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVzdG9yZS10YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBSZXN0b3JlVGV4dFN0eWxlc01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXN0b3JlLXRleHQtc3R5bGVzLm1vZGVsJztcbmltcG9ydCB7IFNhdmVDb21tYW5kc0hlbHBlciB9IGZyb20gJy4uL29wZXJhdGlvbnMvc2F2ZS1jb21tYW5kcy5oZWxwZXInO1xuaW1wb3J0IHsgU2NhbGluZ0hlbHBlciB9IGZyb20gJy4uL2NvbnRlbnQvaGVscGVycy9zY2FsaW5nLmhlbHBlcic7XG5pbXBvcnQgeyBTZWFyY2gsIFNlYXJjaE9wdGlvbnMgfSBmcm9tICcuLi9nYWRnZXRzL3NlYXJjaC9zZWFyY2gnO1xuaW1wb3J0IHsgU2VhcmNoSXRlcmF0aW9uIH0gZnJvbSAnLi4vZ2FkZ2V0cy9zZWFyY2gvc2VhcmNoLWl0ZXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvc2VsZWN0aW9uJztcbmltcG9ydCB7IFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3RhYmxlLm1vZGVsJztcbmltcG9ydCB7IFRhYk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC90YWIubW9kZWwnO1xuaW1wb3J0IHsgVGFyZ2V0TW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3RhcmdldC5tb2RlbCc7XG5pbXBvcnQgeyBUZXh0SW5wdXQgfSBmcm9tICcuLi9pbnRlcmFjdGlvbi90ZXh0LWlucHV0JztcbmltcG9ydCB7IFRleHRTdHlsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC90ZXh0LXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IFZpcnR1YWxSZW5kZXJlciB9IGZyb20gJy4uL2Rpc3BsYXkvdmlydHVhbC5yZW5kZXJlcic7XG5cbmV4cG9ydCBjbGFzcyBFZGl0b3Ige1xuICAgIHJlYWRvbmx5IE1BWF9DT1VOVCA9IDk5OTtcblxuICAgIHJlYWRvbmx5IHBhcmVudFRhZ05hbWUgPSAnQVBQLU5PRC1FRElUT1InO1xuXG4gICAgcmVhZG9ubHkgdGFibGVDZWxsVGFnTmFtZSA9ICdBUFAtTk9ELVRBQkxFLUNFTEwnO1xuXG4gICAgcmVhZG9ubHkgZWRnZUVsZW1lbnRUYWdOYW1lID0gJ0FQUC1OT0QtRURHRSc7XG5cbiAgICByZWFkb25seSBpbWFnZVRhZ05hbWUgPSAnQVBQLU5PRC1JTUFHRSc7XG5cbiAgICByZWFkb25seSBjdXN0b21FbGVtZW50VGFnTmFtZXM6IHN0cmluZ1tdO1xuXG4gICAgcmVhZG9ubHkgaGlzdG9yeTogT3BlcmF0aW9uSGlzdG9yeTtcblxuICAgIGdldCBtYWluU2Vzc2lvbigpOiBFZGl0U2Vzc2lvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ3VsYXRvclNlcnZpY2UubWFpblNlc3Npb24uc2Vzc2lvbjtcbiAgICB9XG5cbiAgICBnZXQgbWFpblJlbmRlcmVyKCk6IFZpcnR1YWxSZW5kZXJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ3VsYXRvclNlcnZpY2UubWFpblNlc3Npb24ucmVuZGVyZXIgYXMgVmlydHVhbFJlbmRlcmVyO1xuICAgIH1cblxuICAgIGdldCBzZXNzaW9uKCk6IEVkaXRTZXNzaW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVndWxhdG9yU2VydmljZS5jdXJyZW50U2Vzc2lvbi5zZXNzaW9uO1xuICAgIH1cblxuICAgIGdldCByZW5kZXJlcigpOiBSZW5kZXJlciB8IFZpcnR1YWxSZW5kZXJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ3VsYXRvclNlcnZpY2UuY3VycmVudFNlc3Npb24ucmVuZGVyZXI7XG4gICAgfVxuXG4gICAgZ2V0IGlzVmlld09ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuaXNWaWV3T25seTtcbiAgICB9XG5cbiAgICBnZXQgdGFyZ2V0cygpOiBUYXJnZXRNb2RlbFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVndWxhdG9yU2VydmljZS5nZXRDdXJyZW50U2Vzc2lvblRhcmdldHMoKTtcbiAgICB9XG5cbiAgICBzZWxlY3Rpb246IFNlbGVjdGlvbjtcblxuICAgIG1vdXNlSGFuZGxlcjogTW91c2VIYW5kbGVyO1xuXG4gICAgaW5wdXRIYW5kbGVyOiBJbnB1dEhhbmRsZXI7XG5cbiAgICBkb2N1bWVudEhhbmRsZXI6IERvY3VtZW50SGFuZGxlcjtcblxuICAgIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgICBwcml2YXRlIHNlYXJjaDogU2VhcmNoO1xuXG4gICAgcHJpdmF0ZSB0ZXh0SW5wdXQ6IFRleHRJbnB1dDtcblxuICAgIHByaXZhdGUgY2xpcGJvYXJkRGF0YTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgbW9kZWw6IERvY3hNb2RlbCxcbiAgICAgICAgcHJpdmF0ZSBjb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwcml2YXRlIGVkaXRvclNlcnZpY2U6IEVkaXRvclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVndWxhdG9yU2VydmljZTogUmVndWxhdG9yU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjb21tYW5kc1NlcnZpY2U6IENvbW1hbmRzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjbGlwYm9hcmQ6IENsaXBib2FyZCxcbiAgICAgICAgcHJpdmF0ZSBleHRlcm5hbEVsZW1lbnRUYWdOYW1lczogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgY3VzdG9tUGFnZVdpZHRoPzogbnVtYmVyXG4gICAgKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMucmVjZWl2ZVRleHRTdHlsZVN1YnNjcmlwdGlvbigpKTtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50VGFnTmFtZXMgPSBbLi4udGhpcy5leHRlcm5hbEVsZW1lbnRUYWdOYW1lcywgdGhpcy5pbWFnZVRhZ05hbWUsIHRoaXMudGFibGVDZWxsVGFnTmFtZSwgdGhpcy5lZGdlRWxlbWVudFRhZ05hbWVdO1xuICAgICAgICB0aGlzLmhpc3RvcnkgPSBuZXcgT3BlcmF0aW9uSGlzdG9yeShlZGl0b3JTZXJ2aWNlLCByZWd1bGF0b3JTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRTZWxlY3Rpb24odGhpcy5zZWxlY3Rpb24pO1xuICAgICAgICB0aGlzLmluaXRNYWluU2Vzc2lvbigpO1xuICAgICAgICB0aGlzLnRleHRJbnB1dCA9IG5ldyBUZXh0SW5wdXQodGhpcy5tYWluUmVuZGVyZXIuY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5tYWluUmVuZGVyZXIudGV4dGFyZWEgPSB0aGlzLnRleHRJbnB1dC5pbnB1dDtcbiAgICAgICAgdGhpcy5tb3VzZUhhbmRsZXIgPSBuZXcgTW91c2VIYW5kbGVyKHRoaXMubWFpblJlbmRlcmVyLmNvbnRhaW5lciwgdGhpcyk7XG4gICAgICAgIHRoaXMuaW5wdXRIYW5kbGVyID0gbmV3IElucHV0SGFuZGxlcih0aGlzLnRleHRJbnB1dC5pbnB1dCwgdGhpcyk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRIYW5kbGVyID0gbmV3IERvY3VtZW50SGFuZGxlcih0aGlzKTtcbiAgICAgICAgdGhpcy5pbml0UmVzaXplTGlzdGVuZXIoKTtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlUb29sYmFyU3R5bGVzKCk7XG5cbiAgICAgICAgdGhpcy5zZWFyY2ggPSBuZXcgU2VhcmNoKCk7XG4gICAgICAgIHRoaXMuc2VhcmNoLnNldCh7IHdyYXA6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkRWRnZVNpemVTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZEVkZ2VTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZVN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VFbGVtZW50U3R5bGVTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkRGF0YVN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5jb3B5U2VsZWN0ZWRTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ3VzdG9tQ29tcG9uZW50U3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmN1dFNlbGVjdGVkU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVTZWxlY3Rpb25TdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuZW5kTW91c2VQcmVzc1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5pbWFnZUxvYWRlZFN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5pbnNlcnRCcmVha1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5pbnNlcnRJbWFnZVN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5pbnNlcnRMaW5rU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmluc2VydFRhYmxlQ29sdW1uc1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5pbnNlcnRUYWJsZVJvd3NTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGFibGVTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGV4dFN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5wYXN0ZUZyb21DbGlwYm9hcmRTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMucHJpbnRTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMucmVkb1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5yZW1vdmVMZWZ0U3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnJlbW92ZU51bWJlcmluZ3NTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlUmlnaHRTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGFibGVDb2x1bW5zU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRhYmxlUm93c1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVRhYmxlQ29sdW1uc1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5zZWFyY2hPcHRpb25TdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnNldEltYWdlU3R5bGVTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuc2V0TnVtYmVyaW5nVGVtcGxhdGVUeXBlU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFncmFwaFN0eWxlc1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5zZXRUZXh0U3R5bGVzU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnVuZG9TdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRWRnZVN1YnNjcmlwdGlvbigpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzPy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5kZXN0cm95UmVzaXplTGlzdGVuZXIoKTtcbiAgICAgICAgdGhpcy5tb3VzZUhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmlucHV0SGFuZGxlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRIYW5kbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uYmx1cigpO1xuICAgIH1cblxuICAgIHNlbGVjdFBhZ2VEb3duKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLm1haW5SZW5kZXJlci5sYXllckNvbmZpZztcbiAgICAgICAgY29uc3QgbGluZSA9IGNvbmZpZy52aXNpYmxlUmFuZ2UuZW5kU2NyZWVuTGluZTtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBQb3NpdGlvbkhlbHBlci5zY3JlZW5Ub0RvY3VtZW50KHRoaXMubWFpblNlc3Npb24sIGxpbmUsIDApO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlU2VsZWN0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5tYWluUmVuZGVyZXIuc2Nyb2xsQnkoY29uZmlnLmhlaWdodCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KDAuNSk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RQYWdlVXAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMubWFpblJlbmRlcmVyLmxheWVyQ29uZmlnO1xuICAgICAgICBjb25zdCBsaW5lID0gY29uZmlnLnZpc2libGVSYW5nZS5zdGFydFNjcmVlbkxpbmU7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gUG9zaXRpb25IZWxwZXIuc2NyZWVuVG9Eb2N1bWVudCh0aGlzLm1haW5TZXNzaW9uLCBsaW5lLCAwKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZVNlbGVjdGlvbihwb3NpdGlvbik7XG4gICAgICAgIHRoaXMubWFpblJlbmRlcmVyLnNjcm9sbEJ5KC1jb25maWcuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5zY3JvbGxDdXJzb3JJbnRvTWFpblZpZXcoMC41KTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIGdvdG9QYWdlRG93bigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5tYWluUmVuZGVyZXIubGF5ZXJDb25maWc7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBjb25maWcudmlzaWJsZVJhbmdlLmVuZFNjcmVlbkxpbmU7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gUG9zaXRpb25IZWxwZXIuc2NyZWVuVG9Eb2N1bWVudCh0aGlzLm1haW5TZXNzaW9uLCBsaW5lLCAwKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocG9zaXRpb24pO1xuICAgICAgICB0aGlzLm1haW5SZW5kZXJlci5zY3JvbGxCeShjb25maWcuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5zY3JvbGxDdXJzb3JJbnRvTWFpblZpZXcoMC41KTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIGdvdG9QYWdlVXAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMubWFpblJlbmRlcmVyLmxheWVyQ29uZmlnO1xuICAgICAgICBjb25zdCBsaW5lID0gY29uZmlnLnZpc2libGVSYW5nZS5zdGFydFNjcmVlbkxpbmU7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gUG9zaXRpb25IZWxwZXIuc2NyZWVuVG9Eb2N1bWVudCh0aGlzLm1haW5TZXNzaW9uLCBsaW5lLCAwKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocG9zaXRpb24pO1xuICAgICAgICB0aGlzLm1haW5SZW5kZXJlci5zY3JvbGxCeSgtY29uZmlnLmhlaWdodCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KDAuNSk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBjdXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICB9XG5cbiAgICBpbnNlcnQodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0U3R5bGUgPSBDb250ZW50U3R5bGVIZWxwZXIuY29tYmluZVRleHRTdHlsZXMobnVsbCwgdGhpcy5lZGl0b3JTZXJ2aWNlLnN0eWxlcyBhcyBUZXh0U3R5bGVNb2RlbCk7XG4gICAgICAgICAgICB0aGlzLmluc2VydFRleHQodGV4dCwgdGV4dFN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhUb0RvY3VtZW50SW5kZXgoXG4gICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQucm93LFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LmNvbHVtblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydFRleHQgPSBuZXcgSW5zZXJ0VGV4dE1vZGVsKHsgaW5zZXJ0SW5kZXgsIHRleHQgfSk7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0VGV4dCB9KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbnNlcnRUZXh0KHRleHQ6IHN0cmluZywgdGV4dFN0eWxlOiBUZXh0U3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuc2VsZWN0aW9uLmN1cnNvcjtcbiAgICAgICAgaWYgKHRleHRTdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlSW5zZXJ0U3R5bGVkVGV4dFRvSGlzdG9yeShwb3NpdGlvbi5yb3csIHBvc2l0aW9uLmNvbHVtbiwgdGV4dCwgdGV4dFN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUluc2VydFRleHRUb0hpc3RvcnkocG9zaXRpb24ucm93LCBwb3NpdGlvbi5jb2x1bW4sIHRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0ZXh0LCB0ZXh0U3R5bGUpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTGVmdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdExlZnQodGhpcy5zZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlUmlnaHQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RSaWdodCh0aGlzLnNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICB9XG5cbiAgICBpbnNlcnRCcmVhayhicmVha1R5cGU6IEJyZWFrVHlwZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFRvRG9jdW1lbnRJbmRleChcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQucm93LFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQuY29sdW1uXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGluc2VydEJyZWFrID0gbmV3IEluc2VydEJyZWFrTW9kZWwoeyBpbnNlcnRJbmRleCwgYnJlYWtUeXBlIH0pO1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZUJ5KG5ldyBSZXBsYWNlTW9kZWwoeyBpbnNlcnRCcmVhayB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnJlYWtUeXBlID09PSBCcmVha1R5cGVzLkNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zYXZlSW5zZXJ0QnJlYWtUb0hpc3RvcnkoaW5zZXJ0QnJlYWspO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuc2Vzc2lvbi5pbnNlcnRCcmVhayh0aGlzLnNlbGVjdGlvbi5jdXJzb3IsIGJyZWFrVHlwZSk7XG4gICAgICAgIGxldCBsYXN0Um93ID0gdGhpcy5zZWxlY3Rpb24uY3Vyc29yLnJvdyA9PT0gZW5kUG9pbnQucm93ID8gZW5kUG9pbnQucm93IDogSW5maW5pdHk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlTGluZXModGhpcy5zZWxlY3Rpb24uY3Vyc29yLnJvdywgbGFzdFJvdyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCk7XG4gICAgICAgIHRoaXMucmVyZW5kZXJNYXJrZXIoKTtcbiAgICAgICAgdGhpcy5zY3JvbGxDdXJzb3JJbnRvTWFpblZpZXcoMC4xKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWIoKSB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhUb0RvY3VtZW50SW5kZXgoXG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uZGlzcGxheURhdGEucGFyYWdyYXBocyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LnJvdyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LmNvbHVtblxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbnNlcnRUYWIgPSBuZXcgSW5zZXJ0VGFiTW9kZWwoeyBpbnNlcnRJbmRleCB9KTtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0VGFiIH0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZUluc2VydFRhYlRvSGlzdG9yeShpbnNlcnRUYWIpO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuc2Vzc2lvbi5pbnNlcnRUYWIodGhpcy5zZWxlY3Rpb24uY3Vyc29yKTtcbiAgICAgICAgdGhpcy5vbkRvY3VtZW50Q2hhbmdlKG5ldyBSYW5nZSh0aGlzLnNlbGVjdGlvbi5jdXJzb3IsIGVuZFBvaW50KSk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBpbnNlcnRJbWFnZShpbWFnZURhdGE6IEltYWdlRGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkSW1hZ2UgPSBJbWFnZUhlbHBlci5nZXRJbWFnZVdpdGhBbGxvd2VkU2l6ZShpbWFnZURhdGEsIHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydC5yb3csXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydC5jb2x1bW5cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW1hZ2UgPSBuZXcgSW5zZXJ0SW1hZ2VNb2RlbCh7IGluc2VydEluZGV4LCBpbWFnZURhdGE6IGFkanVzdGVkSW1hZ2UgfSk7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSkge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlQnkobmV3IFJlcGxhY2VNb2RlbCh7IGluc2VydEltYWdlIH0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZUluc2VydEltYWdlVG9IaXN0b3J5KGluc2VydEltYWdlKTtcbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzLnNlc3Npb24uaW5zZXJ0SW1hZ2UodGhpcy5zZWxlY3Rpb24uY3Vyc29yLCBhZGp1c3RlZEltYWdlKTtcbiAgICAgICAgbGV0IGxhc3RSb3cgPSB0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93ID09PSBlbmRQb2ludC5yb3cgPyBlbmRQb2ludC5yb3cgOiBJbmZpbml0eTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyh0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93LCBsYXN0Um93KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKTtcbiAgICAgICAgdGhpcy5yZXJlbmRlck1hcmtlcigpO1xuICAgIH1cblxuICAgIGluc2VydExpbmsobGlua0RhdGFNb2RlbDogTGlua0RhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydC5yb3csXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydC5jb2x1bW5cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaW5zZXJ0TGluayA9IG5ldyBJbnNlcnRMaW5rTW9kZWwoeyBpbnNlcnRJbmRleCwgZW5kSW5kZXg6IGluc2VydEluZGV4ICsgbGlua0RhdGFNb2RlbC50ZXh0Lmxlbmd0aCwgbGlua0RhdGFNb2RlbCB9KTtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0TGluayB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNhdmVJbnNlcnRMaW5rVG9IaXN0b3J5KGluc2VydExpbmspO1xuICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0TGluayh0aGlzLnNlbGVjdGlvbi5jdXJzb3IsIGxpbmtEYXRhTW9kZWwpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpO1xuICAgICAgICB0aGlzLnJlcmVuZGVyTWFya2VyKCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGUodGFibGVEYXRhOiB7IHJvd3M6IG51bWJlcjsgY29sdW1uczogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFRvRG9jdW1lbnRJbmRleChcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQucm93LFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQuY29sdW1uXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaW5zZXJ0VGFibGUgPSBuZXcgSW5zZXJ0VGFibGVNb2RlbCh7XG4gICAgICAgICAgICBpbnNlcnRJbmRleCxcbiAgICAgICAgICAgIGluc2VydFRhYmxlSW5kZXg6IGluc2VydEluZGV4LFxuICAgICAgICAgICAgcm93c0NvdW50OiB0YWJsZURhdGEucm93cyxcbiAgICAgICAgICAgIGNvbHVtbnNDb3VudDogdGFibGVEYXRhLmNvbHVtbnMsXG4gICAgICAgICAgICBjb250ZW50OiBUQUJMRV9NQVJLRVJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHNbdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQucm93XS5wYXJhZ3JhcGhTZXR0aW5ncy5udW1iZXJpbmdEYXRhLm51bWJlcmluZ0lkIHx8XG4gICAgICAgICAgICAhdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMuc29tZSh4ID0+IHguc3RhcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpIHx8XG4gICAgICAgICAgICAhdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLmlzTmV3TGluZVN5bWJvbChpbnNlcnRJbmRleClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmluc2VydFRhYmxlSW5OZXdQYXJhZ3JhcGgoaW5zZXJ0VGFibGUsIGluc2VydEluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGFibGVJbkN1cnJlbnRQYXJhZ3JhcGgoaW5zZXJ0VGFibGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVJbk5ld1BhcmFncmFwaChpbnNlcnRUYWJsZTogSW5zZXJ0VGFibGVNb2RlbCwgaW5zZXJ0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRQYXJhZ3JhcGggPSBuZXcgSW5zZXJ0UGFyYWdyYXBoTW9kZWwoeyBpbnNlcnRJbmRleCwgaW5zZXJ0VGFibGUgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0UGFyYWdyYXBoIH0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZUluc2VydFBhcmFncmFwaFRvSGlzdG9yeShpbnNlcnRUYWJsZS5jb250ZW50LCBpbnNlcnRQYXJhZ3JhcGgpO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuc2Vzc2lvbi5pbnNlcnRQYXJhZ3JhcGgodGhpcy5zZWxlY3Rpb24uY3Vyc29yLCBpbnNlcnRQYXJhZ3JhcGgpO1xuICAgICAgICBsZXQgbGFzdFJvdyA9IHRoaXMuc2VsZWN0aW9uLmN1cnNvci5yb3cgPT09IGVuZFBvaW50LnJvdyA/IGVuZFBvaW50LnJvdyA6IEluZmluaXR5O1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUxpbmVzKHRoaXMuc2VsZWN0aW9uLmN1cnNvci5yb3csIGxhc3RSb3cpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpO1xuICAgICAgICB0aGlzLnJlcmVuZGVyTWFya2VyKCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVJbkN1cnJlbnRQYXJhZ3JhcGgoaW5zZXJ0VGFibGU6IEluc2VydFRhYmxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0VGFibGUgfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zYXZlSW5zZXJ0VGFibGVUb0hpc3RvcnkoaW5zZXJ0VGFibGUpO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuc2Vzc2lvbi5pbnNlcnRUYWJsZSh0aGlzLnNlbGVjdGlvbi5jdXJzb3IsIGluc2VydFRhYmxlKTtcbiAgICAgICAgbGV0IGxhc3RSb3cgPSB0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93ID09PSBlbmRQb2ludC5yb3cgPyBlbmRQb2ludC5yb3cgOiBJbmZpbml0eTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyh0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93LCBsYXN0Um93KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKTtcbiAgICAgICAgdGhpcy5yZXJlbmRlck1hcmtlcigpO1xuICAgIH1cblxuICAgIHJlcGxhY2VCeShtb2RlbDogUmVwbGFjZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhcnRJbmRleGVzID0gQ29udGVudEhlbHBlci5nZXRTZWxlY3RlZFBhcnREb2N1bWVudEluZGV4ZXModGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHRoaXMuc2VsZWN0aW9uLnJhbmdlKTtcbiAgICAgICAgbW9kZWwuZGVsZXRlID0gbmV3IERlbGV0ZU1vZGVsKHsgc3RhcnRJbmRleDogcGFydEluZGV4ZXMuc3RhcnRJbmRleCwgY291bnQ6IHBhcnRJbmRleGVzLmVuZEluZGV4IC0gcGFydEluZGV4ZXMuc3RhcnRJbmRleCArIDEgfSk7XG4gICAgICAgIHRoaXMuc2F2ZVJlcGxhY2VUb0hpc3RvcnkodGhpcy5zZWxlY3Rpb24ucmFuZ2UsIG1vZGVsKTtcbiAgICAgICAgdGhpcy5yZW1vdmVDdXN0b21FbGVtZW50c0RhdGEoKTtcbiAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSB0aGlzLnNlc3Npb24ucmVwbGFjZShtb2RlbCk7XG4gICAgICAgIHRoaXMub25Eb2N1bWVudENoYW5nZShuZXcgUmFuZ2UodGhpcy5zZWxlY3Rpb24uY3Vyc29yLCBlbmRQb3NpdGlvbikpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlVG9MaW5lU3RhcnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RMaW5lU3RhcnQodGhpcy5zZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlVG9MaW5lRW5kKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0TGluZUVuZCh0aGlzLnNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICB9XG5cbiAgICByZW1vdmVXb3JkTGVmdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmRMZWZ0KHRoaXMuc2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZCgpO1xuICAgIH1cblxuICAgIHJlbW92ZVdvcmRSaWdodCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmRSaWdodCh0aGlzLnNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICB9XG5cbiAgICBhcHBseVRleHRTdHlsZUJvbGQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYXBwbHlUZXh0U3R5bGVzKG5ldyBUZXh0U3R5bGVNb2RlbCh7IGJvbGQ6ICF0aGlzLnNlc3Npb24uZWRpdG9yU2VydmljZS5zdHlsZXMuYm9sZCB9KSk7XG4gICAgfVxuXG4gICAgYXBwbHlUZXh0U3R5bGVJdGFsaWMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYXBwbHlUZXh0U3R5bGVzKG5ldyBUZXh0U3R5bGVNb2RlbCh7IGl0YWxpYzogIXRoaXMuc2Vzc2lvbi5lZGl0b3JTZXJ2aWNlLnN0eWxlcy5pdGFsaWMgfSkpO1xuICAgIH1cblxuICAgIGFwcGx5VGV4dFN0eWxlVW5kZXJsaW5lKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFwcGx5VGV4dFN0eWxlcyhuZXcgVGV4dFN0eWxlTW9kZWwoeyB1bmRlcmxpbmU6ICF0aGlzLnNlc3Npb24uZWRpdG9yU2VydmljZS5zdHlsZXMudW5kZXJsaW5lIH0pKTtcbiAgICB9XG5cbiAgICBhcHBseVRleHRTdHlsZXModGV4dFN0eWxlOiBUZXh0U3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRJbmRleGVzID0gQ29udGVudEhlbHBlci5nZXRTZWxlY3RlZFBhcnREb2N1bWVudEluZGV4ZXModGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHRoaXMuc2VsZWN0aW9uLnJhbmdlKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUFwcGx5VGV4dFN0eWxlVG9IaXN0b3J5KHBhcnRJbmRleGVzLnN0YXJ0SW5kZXgsIHBhcnRJbmRleGVzLmVuZEluZGV4LCB0ZXh0U3R5bGUpO1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmFwcGx5VGV4dFN0eWxlKHBhcnRJbmRleGVzLnN0YXJ0SW5kZXgsIHBhcnRJbmRleGVzLmVuZEluZGV4LCB0ZXh0U3R5bGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRUZXh0U3R5bGUodGV4dFN0eWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFRleHRTdHlsZSh0ZXh0U3R5bGU6IFRleHRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLnNlc3Npb24uZGlzcGxheURhdGEucGFyYWdyYXBocywgdGhpcy5zZWxlY3Rpb24uY3Vyc29yKTtcbiAgICAgICAgY29uc3QgaXNQYXJhZ3JhcGggPSB0aGlzLnNlc3Npb24ubW9kZWwuY29udGVudExlbmd0aCA9PT0gaW5kZXggfHwgdGhpcy5zZXNzaW9uLm1vZGVsLmNvbnRlbnRbaW5kZXhdID09PSBORVdfTElORV9NQVJLVVA7XG4gICAgICAgIGlmIChpc1BhcmFncmFwaCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlQXBwbHlUZXh0U3R5bGVUb0hpc3RvcnkoaW5kZXgsIGluZGV4LCB0ZXh0U3R5bGUpO1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmFwcGx5VGV4dFN0eWxlKGluZGV4LCBpbmRleCwgdGV4dFN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRUZXh0U3R5bGUodGV4dFN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpO1xuICAgIH1cblxuICAgIGFwcGx5UGFyYWdyYXBoU3R5bGVzKHBhcmFncmFwaFN0eWxlOiBQYXJhZ3JhcGhTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5zZWxlY3Rpb24ucmFuZ2U7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLnNlc3Npb24ubW9kZWwucGFyYWdyYXBoc1tyYW5nZS5zdGFydC5yb3ddLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHRoaXMuc2Vzc2lvbi5tb2RlbC5wYXJhZ3JhcGhzW3JhbmdlLmVuZC5yb3ddLmluc2VydEluZGV4O1xuICAgICAgICB0aGlzLnNhdmVBcHBseVBhcmFncmFwaFN0eWxlVG9IaXN0b3J5KHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBwYXJhZ3JhcGhTdHlsZSk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5hcHBseVBhcmFncmFwaFN0eWxlKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBwYXJhZ3JhcGhTdHlsZSk7XG4gICAgfVxuXG4gICAgYXBwbHlFbGVtZW50U3R5bGUoY3VycmVudDogRWxlbWVudE1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2F2ZUFwcGx5RWxlbWVudFN0eWxlVG9IaXN0b3J5KGN1cnJlbnQpO1xuICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlFbGVtZW50U3R5bGUobmV3IEFwcGx5RWxlbWVudFN0eWxlTW9kZWwoY3VycmVudCkpO1xuICAgIH1cblxuICAgIHNldE51bWJlcmluZ1RlbXBsYXRlKHRlbXBsYXRlTGV2ZWxzOiBOdW1iZXJpbmdMZXZlbE1vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnNlbGVjdGlvbi5yYW5nZTtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMuc2Vzc2lvbi5tb2RlbC5wYXJhZ3JhcGhzW3JhbmdlLnN0YXJ0LnJvd10uaW5zZXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gdGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHNbcmFuZ2UuZW5kLnJvd10uaW5zZXJ0SW5kZXg7XG4gICAgICAgIHRoaXMuc2F2ZUFkZE51bWJlcmluZ1RvSGlzdG9yeSh0ZW1wbGF0ZUxldmVscywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnNlc3Npb24uYWRkTnVtYmVyaW5nKHRlbXBsYXRlTGV2ZWxzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnVtYmVyaW5nc0Zyb21QYXJhZ3JhcGhzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuc2VsZWN0aW9uLnJhbmdlO1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHNbcmFuZ2Uuc3RhcnQucm93XS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLnNlc3Npb24ubW9kZWwucGFyYWdyYXBoc1tyYW5nZS5lbmQucm93XS5pbnNlcnRJbmRleDtcbiAgICAgICAgdGhpcy5zYXZlUmVtb3ZlTnVtYmVyaW5nVG9IaXN0b3J5KHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZU51bWJlcmluZ3Moc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpO1xuICAgIH1cblxuICAgIGFwcGx5SW1hZ2VTdHlsZXMoaW1hZ2U6IEltYWdlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zYXZlQXBwbHlJbWFnZVN0eWxlVG9IaXN0b3J5KGltYWdlKTtcbiAgICAgICAgY29uc3QgaW1hZ2VTdHlsZSA9IG5ldyBBcHBseUltYWdlU3R5bGVNb2RlbCh7IGluc2VydEluZGV4OiBpbWFnZS5pbnNlcnRJbmRleCwgaGVpZ2h0OiBpbWFnZS5oZWlnaHQsIHdpZHRoOiBpbWFnZS53aWR0aCB9KTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLmFwcGx5SW1hZ2VTdHlsZShpbWFnZVN0eWxlKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKTtcbiAgICB9XG5cbiAgICBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQgJiYgIXRoaXMuc2VsZWN0aW9uLmlzRm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0SW5wdXQuaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9wZW5TZWFyY2goKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5vcGVuU2VhcmNoRGlhbG9nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmaW5kKG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMpOiBSYW5nZSB7XG4gICAgICAgIGxldCByYW5nZSA9IHRoaXMuc2VsZWN0aW9uLnJhbmdlO1xuICAgICAgICBpZiAob3B0aW9ucy50ZXJtID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZXJtID0gdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLmdldFRleHRSYW5nZShyYW5nZSkgfHwgdGhpcy5zZWFyY2gub3B0aW9ucy50ZXJtO1xuICAgICAgICAgICAgaWYgKCF0ZXJtKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLnNlc3Npb24uZ2V0V29yZFJhbmdlKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uKTtcbiAgICAgICAgICAgICAgICB0ZXJtID0gdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLmdldFRleHRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRpb25zLnRlcm0gPSB0ZXJtO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLnN0YXJ0KSB7XG4gICAgICAgICAgICBvcHRpb25zLnN0YXJ0ID0gcmFuZ2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlYXJjaC5zZXQob3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSB0aGlzLnNlYXJjaC5maW5kKHRoaXMuc2Vzc2lvbik7XG4gICAgICAgIGlmIChuZXdSYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VTZWxlY3Rpb24ocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zZXNzaW9uID09PSB0aGlzLm1haW5TZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWluUmVuZGVyZXIuc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXcocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCwgMC41KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXdSYW5nZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJhbmdlLmVuZCA9IHJhbmdlLnN0YXJ0O1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihyYW5nZS5zdGFydCk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdXBkYXRlQ291bnRlcigpOiBTZWFyY2hJdGVyYXRpb24ge1xuICAgICAgICBjb25zdCByZWdleCA9IHRoaXMuc2VhcmNoLm9wdGlvbnMucmVnZXggYXMgUmVnRXhwO1xuICAgICAgICBsZXQgYWxsID0gMDtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSAwO1xuICAgICAgICBpZiAoIXJlZ2V4KSB7XG4gICAgICAgICAgICByZXR1cm4geyBjdXJyZW50OiAwLCB0b3RhbDogMCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlc3Npb24uZGlzcGxheURhdGEuZ2V0QWxsUGFyYWdyYXBoc0NvbnRlbnQoKS5qb2luKCdcXG4nKTtcblxuICAgICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBvc2l0aW9uVG9JbmRleCh0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydCk7XG5cbiAgICAgICAgcmVnZXgubGFzdEluZGV4ID0gMDtcbiAgICAgICAgbGV0IHJlZ2V4UmVzdWx0O1xuICAgICAgICB3aGlsZSAoKHJlZ2V4UmVzdWx0ID0gcmVnZXguZXhlYyh2YWx1ZSkpKSB7XG4gICAgICAgICAgICBhbGwrKztcbiAgICAgICAgICAgIGxldCBsYXN0ID0gcmVnZXhSZXN1bHQuaW5kZXg7XG4gICAgICAgICAgICBpZiAobGFzdCA8PSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWxsID4gdGhpcy5NQVhfQ09VTlQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGN1cnJlbnQ6IGN1cnJlbnQsIHRvdGFsOiBhbGwgPiB0aGlzLk1BWF9DT1VOVCA/IHRoaXMuTUFYX0NPVU5UIDogYWxsIH07XG4gICAgfVxuXG4gICAgcmVwbGFjZShzZWFyY2g6IHN0cmluZywgcmVwbGFjZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VhcmNoICE9PSByZXBsYWNlKSB7XG4gICAgICAgICAgICBpZiAocmVwbGFjZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhUb0RvY3VtZW50SW5kZXgoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydC5yb3csXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LmNvbHVtblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zZXJ0VGV4dCA9IG5ldyBJbnNlcnRUZXh0TW9kZWwoeyBpbnNlcnRJbmRleCwgdGV4dDogcmVwbGFjZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0VGV4dCB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmluZCh7IHRlcm06IHNlYXJjaCwgc2tpcEN1cnJlbnQ6IHRydWUsIGJhY2t3YXJkczogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgdW5kbygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdW5kbyA9IHRoaXMuaGlzdG9yeS5wb3BVbmRvT3BlcmF0aW9uKCk7XG4gICAgICAgIGlmICghdW5kbykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRUYXJnZXRlZFNlc3Npb25Bc0N1cnJlbnQodW5kby50YXJnZXRzKTtcbiAgICAgICAgdGhpcy5hcHBseU9wZXJhdGlvbih1bmRvLm9wZXJhdGlvbik7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlU2VsZWN0aW9uKHVuZG8uY3Vyc29yLCB1bmRvLmFuY2hvcik7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICByZWRvKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZWRvID0gdGhpcy5oaXN0b3J5LnBvcFJlZG9PcGVyYXRpb24oKTtcbiAgICAgICAgaWYgKCFyZWRvKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldFRhcmdldGVkU2Vzc2lvbkFzQ3VycmVudChyZWRvLnRhcmdldHMpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZVNlbGVjdGlvbihyZWRvLmN1cnNvciwgcmVkby5hbmNob3IpO1xuICAgICAgICB0aGlzLmFwcGx5T3BlcmF0aW9uKHJlZG8ub3BlcmF0aW9uKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIGFwcGx5T3BlcmF0aW9uKG9wZXJhdGlvbjogT3BlcmF0aW9uKTogdm9pZCB7XG4gICAgICAgIGxldCBjb21tYW5kOiBDb21tYW5kTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgICAgICAgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc2VydFRleHRNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmluc2VydFRleHRCeURvY3VtZW50SW5kZXgob3BlcmF0aW9uLmluc2VydEluZGV4LCBvcGVyYXRpb24udGV4dCwgbnVsbCk7XG4gICAgICAgICAgICBjb25zdCB7IHRleHQsIGluc2VydEluZGV4IH0gPSBvcGVyYXRpb247XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFRleHRDb21tYW5kKHRleHQsIGluc2VydEluZGV4LCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc2VydFBhcmFncmFwaE1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0UGFyYWdyYXBoQnlEb2N1bWVudEluZGV4KG9wZXJhdGlvbik7XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFBhcmFncmFwaENvbW1hbmQob3BlcmF0aW9uLCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIERlbGV0ZU1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMob3BlcmF0aW9uLnN0YXJ0SW5kZXgsIG9wZXJhdGlvbi5zdGFydEluZGV4ICsgb3BlcmF0aW9uLmNvdW50KTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0RGVsZXRlQ29tbWFuZChvcGVyYXRpb24uc3RhcnRJbmRleCwgb3BlcmF0aW9uLmNvdW50LCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc2VydFN0eWxlZFRleHRNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmluc2VydFRleHRCeURvY3VtZW50SW5kZXgob3BlcmF0aW9uLmluc2VydEluZGV4LCBvcGVyYXRpb24udGV4dCwgbmV3IFRleHRTdHlsZU1vZGVsKG9wZXJhdGlvbi50ZXh0U3R5bGUpKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdGV4dCwgaW5zZXJ0SW5kZXgsIHRleHRTdHlsZSB9ID0gb3BlcmF0aW9uO1xuICAgICAgICAgICAgY29tbWFuZCA9IFNhdmVDb21tYW5kc0hlbHBlci5nZXRJbnNlcnRTdHlsZWRUZXh0Q29tbWFuZCh0ZXh0LCBpbnNlcnRJbmRleCwgdGV4dFN0eWxlLCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIFJlc3RvcmVNb2RlbCkge1xuICAgICAgICAgICAgY29uc3QgZGVlcENvcHkgPSBzdHJ1Y3R1cmVkQ2xvbmUob3BlcmF0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZXN0b3JlKGRlZXBDb3B5KTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVzdG9yZUNvbW1hbmQoZGVlcENvcHksIHRoaXMudGFyZ2V0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgQXBwbHlUZXh0U3R5bGVNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmFwcGx5VGV4dFN0eWxlKG9wZXJhdGlvbi5zdGFydEluZGV4LCBvcGVyYXRpb24uZW5kSW5kZXgsIG5ldyBUZXh0U3R5bGVNb2RlbChvcGVyYXRpb24udGV4dFN0eWxlKSk7XG4gICAgICAgICAgICBjb25zdCB7IHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0ZXh0U3R5bGUgfSA9IG9wZXJhdGlvbjtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0QXBwbHlUZXh0U3R5bGVDb21tYW5kKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0ZXh0U3R5bGUsIHRoaXMudGFyZ2V0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgQXBwbHlQYXJhZ3JhcGhTdHlsZU1vZGVsKSB7XG4gICAgICAgICAgICBjb25zdCBjb3B5ID0gbmV3IFBhcmFncmFwaFN0eWxlTW9kZWwob3BlcmF0aW9uLnBhcmFncmFwaFN0eWxlKTtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5hcHBseVBhcmFncmFwaFN0eWxlKG9wZXJhdGlvbi5zdGFydEluZGV4LCBvcGVyYXRpb24uZW5kSW5kZXgsIGNvcHkpO1xuICAgICAgICAgICAgY29uc3QgeyBzdGFydEluZGV4LCBlbmRJbmRleCwgcGFyYWdyYXBoU3R5bGUgfSA9IG9wZXJhdGlvbjtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0QXBwbHlQYXJhZ3JhcGhTdHlsZUNvbW1hbmQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHBhcmFncmFwaFN0eWxlLCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIFJlc3RvcmVUZXh0U3R5bGVzTW9kZWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZXBDb3B5ID0gc3RydWN0dXJlZENsb25lKG9wZXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVzdG9yZVRleHRTdHlsZXMoZGVlcENvcHkuZm9ybWF0cywgZGVlcENvcHkubGlua0Zvcm1hdHMpO1xuICAgICAgICAgICAgY29tbWFuZCA9IFNhdmVDb21tYW5kc0hlbHBlci5nZXRSZXN0b3JlVGV4dFN0eWxlc0NvbW1hbmQoZGVlcENvcHkuZm9ybWF0cywgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBSZXN0b3JlUGFyYWdyYXBoU3R5bGVzTW9kZWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZXBDb3B5ID0gc3RydWN0dXJlZENsb25lKG9wZXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVzdG9yZVBhcmFncmFwaFN0eWxlcyhkZWVwQ29weS5wYXJhZ3JhcGhzKTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVzdG9yZVBhcmFncmFwaFN0eWxlc0NvbW1hbmQoZGVlcENvcHkucGFyYWdyYXBocywgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRFbGVtZW50TW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5pbnNlcnRFbGVtZW50QnlEb2N1bWVudEluZGV4KG9wZXJhdGlvbik7XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydEVsZW1lbnRDb21tYW5kKG9wZXJhdGlvbiwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRCcmVha01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0QnJlYWtCeURvY3VtZW50SW5kZXgob3BlcmF0aW9uKTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0QnJlYWtDb21tYW5kKG9wZXJhdGlvbiwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBBcHBseUVsZW1lbnRTdHlsZU1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlFbGVtZW50U3R5bGUob3BlcmF0aW9uKTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0QXBwbHlFbGVtZW50U3R5bGVDb21tYW5kKG9wZXJhdGlvbiwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRUYWJNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmluc2VydFRhYkJ5RG9jdW1lbnRJbmRleChvcGVyYXRpb24pO1xuICAgICAgICAgICAgY29tbWFuZCA9IFNhdmVDb21tYW5kc0hlbHBlci5nZXRJbnNlcnRUYWJDb21tYW5kKG9wZXJhdGlvbiwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRJbWFnZU1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0SW1hZ2VCeURvY3VtZW50SW5kZXgob3BlcmF0aW9uKTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0SW1hZ2VDb21tYW5kKG9wZXJhdGlvbiwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRMaW5rTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5pbnNlcnRMaW5rQnlEb2N1bWVudEluZGV4KG9wZXJhdGlvbik7XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydExpbmtPcGVyYXRpb24ob3BlcmF0aW9uLCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEFwcGx5SW1hZ2VTdHlsZU1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlJbWFnZVN0eWxlKG9wZXJhdGlvbik7XG4gICAgICAgICAgICBjb25zdCB7IGhlaWdodCwgd2lkdGgsIGluc2VydEluZGV4IH0gPSBvcGVyYXRpb247XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldEFwcGx5SW1hZ2VTdHlsZUNvbW1hbmQoaGVpZ2h0LCB3aWR0aCwgaW5zZXJ0SW5kZXgsIHRoaXMudGFyZ2V0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgQWRkTnVtYmVyaW5nTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5hZGROdW1iZXJpbmcob3BlcmF0aW9uLmxldmVscywgb3BlcmF0aW9uLnN0YXJ0SW5kZXgsIG9wZXJhdGlvbi5lbmRJbmRleCk7XG4gICAgICAgICAgICBjb25zdCB7IHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBsZXZlbHMgfSA9IG9wZXJhdGlvbjtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0QWRkTnVtYmVyaW5nQ29tbWFuZChzdGFydEluZGV4LCBlbmRJbmRleCwgbGV2ZWxzLCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIFJlc3RvcmVOdW1iZXJpbmdzTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZXN0b3JlTnVtYmVyaW5ncyhvcGVyYXRpb24ucGFyYWdyYXBocywgb3BlcmF0aW9uLm51bWJlcmluZ3MpO1xuICAgICAgICAgICAgY29tbWFuZCA9IFNhdmVDb21tYW5kc0hlbHBlci5nZXRSZXN0b3JlTnVtYmVyaW5nc0NvbW1hbmQob3BlcmF0aW9uLCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc2VydFRhYmxlQ29sdW1uc01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0VGFibGVDb2x1bW5zKG9wZXJhdGlvbi5pbnNlcnRJbmRleCwgb3BlcmF0aW9uLmNvbHVtbnNDb3VudCwgb3BlcmF0aW9uLnRhcmdldEluZGV4LCBvcGVyYXRpb24uaW5oZXJpdEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZShvcGVyYXRpb24uaW5zZXJ0SW5kZXgsIHRoaXMuc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgY29uc3QgeyBjb2x1bW5zQ291bnQsIGluaGVyaXRJbmRleCwgaW5zZXJ0SW5kZXgsIHRhcmdldEluZGV4IH0gPSBvcGVyYXRpb247XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFRhYmxlQ29sdW1uc0NvbW1hbmQoY29sdW1uc0NvdW50LCBpbmhlcml0SW5kZXgsIGluc2VydEluZGV4LCB0YXJnZXRJbmRleCwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRUYWJsZVJvd3NNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmluc2VydFRhYmxlUm93cyhvcGVyYXRpb24uaW5zZXJ0SW5kZXgsIG9wZXJhdGlvbi5yb3dzQ291bnQsIG9wZXJhdGlvbi50YXJnZXRJbmRleCwgb3BlcmF0aW9uLmluaGVyaXRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUob3BlcmF0aW9uLmluc2VydEluZGV4LCB0aGlzLnNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGNvbnN0IHsgaW5zZXJ0SW5kZXgsIHJvd3NDb3VudCwgdGFyZ2V0SW5kZXgsIGluaGVyaXRJbmRleCB9ID0gb3BlcmF0aW9uO1xuICAgICAgICAgICAgY29tbWFuZCA9IFNhdmVDb21tYW5kc0hlbHBlci5nZXRJbnNlcnRUYWJsZVJvd3NDb21tYW5kKGluc2VydEluZGV4LCByb3dzQ291bnQsIHRhcmdldEluZGV4LCBpbmhlcml0SW5kZXgsIHRoaXMudGFyZ2V0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgUmVtb3ZlVGFibGVDb2x1bW5zTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVUYWJsZUNvbHVtbnMob3BlcmF0aW9uLmluc2VydEluZGV4LCBvcGVyYXRpb24uc3RhcnRJbmRleCwgb3BlcmF0aW9uLmVuZEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZShvcGVyYXRpb24uaW5zZXJ0SW5kZXgsIHRoaXMuc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgY29uc3QgeyBpbnNlcnRJbmRleCwgc3RhcnRJbmRleCwgZW5kSW5kZXggfSA9IG9wZXJhdGlvbjtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVtb3ZlVGFibGVDb2x1bW5zQ29tbWFuZChpbnNlcnRJbmRleCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRoaXMudGFyZ2V0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgUmVtb3ZlVGFibGVSb3dzTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVUYWJsZVJvd3Mob3BlcmF0aW9uLmluc2VydEluZGV4LCBvcGVyYXRpb24uc3RhcnRJbmRleCwgb3BlcmF0aW9uLmVuZEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZShvcGVyYXRpb24uaW5zZXJ0SW5kZXgsIHRoaXMuc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgY29uc3QgeyBpbnNlcnRJbmRleCwgc3RhcnRJbmRleCwgZW5kSW5kZXggfSA9IG9wZXJhdGlvbjtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVtb3ZlVGFibGVSb3dzQ29tbWFuZChpbnNlcnRJbmRleCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRoaXMudGFyZ2V0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgUmVzaXplVGFibGVDb2x1bW5zTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZXNpemVUYWJsZUNvbHVtbnMob3BlcmF0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZShvcGVyYXRpb24uaW5zZXJ0SW5kZXgsIHRoaXMuc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgY29tbWFuZCA9IFNhdmVDb21tYW5kc0hlbHBlci5nZXRSZXNpemVUYWJsZUNvbHVtbnNDb21tYW5kKG9wZXJhdGlvbiwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBSZXN0b3JlVGFibGVNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlc3RvcmVUYWJsZShvcGVyYXRpb24uaW5zZXJ0SW5kZXgsIG9wZXJhdGlvbi5vbGRUYWJsZSk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUob3BlcmF0aW9uLmluc2VydEluZGV4LCB0aGlzLnNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVzdG9yZVRhYmxlQ29tbWFuZChvcGVyYXRpb24sIHRoaXMudGFyZ2V0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgSW5zZXJ0VGFibGVNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmluc2VydFRhYmxlQnlEb2N1bWVudEluZGV4KG9wZXJhdGlvbik7XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFRhYmxlQ29tbWFuZChvcGVyYXRpb24sIHRoaXMudGFyZ2V0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgUmVtb3ZlTnVtYmVyaW5nc01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlTnVtYmVyaW5ncyhvcGVyYXRpb24uc3RhcnRJbmRleCwgb3BlcmF0aW9uLmVuZEluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IHsgc3RhcnRJbmRleCwgZW5kSW5kZXggfSA9IG9wZXJhdGlvbjtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVtb3ZlTnVtYmVyaW5nc0NvbW1hbmQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRoaXMudGFyZ2V0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgUmVwbGFjZU1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVwbGFjZShvcGVyYXRpb24pO1xuICAgICAgICAgICAgY29tbWFuZCA9IFNhdmVDb21tYW5kc0hlbHBlci5nZXRSZXBsYWNlQ29tbWFuZChvcGVyYXRpb24sIHRoaXMudGFyZ2V0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZG8vcmVkbyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoZSBPcGVyYXRpb24nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKGNvbW1hbmQpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpO1xuICAgIH1cblxuICAgIHNhdmVSZW1vdmVUb0hpc3RvcnkocmFuZ2U6IFJhbmdlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlc3RvcmVNb2RlbCA9IHRoaXMuY3JlYXRlUmVzdG9yZUZyb21TbGljZShyYW5nZS5zdGFydC5yb3csIHJhbmdlLnN0YXJ0LmNvbHVtbiwgcmFuZ2UuZW5kLnJvdywgcmFuZ2UuZW5kLmNvbHVtbik7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVzdG9yZU1vZGVsLmVuZEluZGV4IC0gcmVzdG9yZU1vZGVsLnN0YXJ0SW5kZXggKyAxO1xuICAgICAgICByZXN0b3JlTW9kZWwuZW5kSW5kZXggPSByZXN0b3JlTW9kZWwuc3RhcnRJbmRleDsgLy8gdGhpcyBpcyB0byByZXN0b3JlIGluIHBvc2l0aW9uIHdpdGhvdXQgZGVsZXRpbmcvcmVwbGFjaW5nIGFueXRoaW5nIGluIHJhbmdlXG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoRGVsZXRlKHJlc3RvcmVNb2RlbCk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldERlbGV0ZUNvbW1hbmQocmVzdG9yZU1vZGVsLnN0YXJ0SW5kZXgsIGNvdW50LCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0VGV4dFRvSGlzdG9yeShwYXJhZ3JhcGg6IG51bWJlciwgaW5kZXhJblBhcmFncmFwaDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFRvRG9jdW1lbnRJbmRleCh0aGlzLnNlc3Npb24uZGlzcGxheURhdGEucGFyYWdyYXBocywgcGFyYWdyYXBoLCBpbmRleEluUGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hJbnNlcnRUZXh0KGluZGV4LCB0ZXh0KTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0VGV4dENvbW1hbmQodGV4dCwgaW5kZXgsIHRoaXMudGFyZ2V0cykpO1xuICAgIH1cblxuICAgIHNhdmVJbnNlcnRQYXJhZ3JhcGhUb0hpc3RvcnkoY29udGVudDogc3RyaW5nLCBtb2RlbDogSW5zZXJ0UGFyYWdyYXBoTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hJbnNlcnRQYXJhZ3JhcGgoY29udGVudCwgbW9kZWwsIHRoaXMuc2Vzc2lvbi5tb2RlbC5wYXJhZ3JhcGhzKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0UGFyYWdyYXBoQ29tbWFuZChtb2RlbCwgdGhpcy50YXJnZXRzKSk7XG4gICAgfVxuXG4gICAgc2F2ZUluc2VydFN0eWxlZFRleHRUb0hpc3RvcnkocGFyYWdyYXBoOiBudW1iZXIsIGluZGV4SW5QYXJhZ3JhcGg6IG51bWJlciwgdGV4dDogc3RyaW5nLCBzdHlsZTogVGV4dFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFRvRG9jdW1lbnRJbmRleCh0aGlzLnNlc3Npb24uZGlzcGxheURhdGEucGFyYWdyYXBocywgcGFyYWdyYXBoLCBpbmRleEluUGFyYWdyYXBoKTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hJbnNlcnRTdHlsZWRUZXh0KGluZGV4LCB0ZXh0LCBzdHlsZSk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFN0eWxlZFRleHRDb21tYW5kKHRleHQsIGluZGV4LCBzdHlsZSwgdGhpcy50YXJnZXRzKSk7XG4gICAgfVxuXG4gICAgc2F2ZUluc2VydEVsZW1lbnRUb0hpc3RvcnkobW9kZWw6IEluc2VydEVsZW1lbnRNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydEVsZW1lbnQobW9kZWwpO1xuICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFNhdmVDb21tYW5kc0hlbHBlci5nZXRJbnNlcnRFbGVtZW50Q29tbWFuZChtb2RlbCwgdGhpcy50YXJnZXRzKSk7XG4gICAgfVxuXG4gICAgc2F2ZUluc2VydEJyZWFrVG9IaXN0b3J5KG1vZGVsOiBJbnNlcnRCcmVha01vZGVsKTogdm9pZCB7XG4gICAgICAgIG1vZGVsLmlzT25OZXdQYXJhZ3JhcGggPVxuICAgICAgICAgICAgbW9kZWwuYnJlYWtUeXBlID09PSBCcmVha1R5cGVzLlBhZ2UgJiZcbiAgICAgICAgICAgIEJyZWFrSGVscGVyLmdldEJyZWFrVHlwZSh0aGlzLnNlc3Npb24ubW9kZWwsIENVU1RPTV9FTEVNRU5UX01BUktFUiwgbW9kZWwuaW5zZXJ0SW5kZXggLSAxKSAhPT0gQnJlYWtUeXBlcy5QYWdlO1xuICAgICAgICBjb25zdCBjb3VudCA9IG1vZGVsLmlzT25OZXdQYXJhZ3JhcGggPyBORVdfTElORV9NQVJLVVAubGVuZ3RoICsgMSA6IDE7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoSW5zZXJ0QnJlYWsobW9kZWwsIGNvdW50KTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0QnJlYWtDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0VGFiVG9IaXN0b3J5KG1vZGVsOiBJbnNlcnRUYWJNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydFRhYihtb2RlbCk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFRhYkNvbW1hbmQobW9kZWwsIHRoaXMudGFyZ2V0cykpO1xuICAgIH1cblxuICAgIHNhdmVJbnNlcnRJbWFnZVRvSGlzdG9yeShtb2RlbDogSW5zZXJ0SW1hZ2VNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydEltYWdlKG1vZGVsKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0SW1hZ2VDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0TGlua1RvSGlzdG9yeShtb2RlbDogSW5zZXJ0TGlua01vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoSW5zZXJ0TGluayhtb2RlbCk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydExpbmtPcGVyYXRpb24obW9kZWwsIHRoaXMudGFyZ2V0cykpO1xuICAgIH1cblxuICAgIHNhdmVJbnNlcnRUYWJsZVRvSGlzdG9yeShtb2RlbDogSW5zZXJ0VGFibGVNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydFRhYmxlKG1vZGVsKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0VGFibGVDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlQXBwbHlUZXh0U3R5bGVUb0hpc3Rvcnkoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCB0ZXh0U3R5bGU6IFRleHRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSBGb3JtYXRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIGNvbnN0IGxpbmtGb3JtYXRzID0gTGlua0hlbHBlci5zbGljZUZvcm1hdHModGhpcy5zZXNzaW9uLm1vZGVsLmxpbmtzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoQXBwbHlUZXh0U3R5bGUoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRleHRTdHlsZSwgZm9ybWF0cywgbGlua0Zvcm1hdHMpO1xuICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFNhdmVDb21tYW5kc0hlbHBlci5nZXRBcHBseVRleHRTdHlsZUNvbW1hbmQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRleHRTdHlsZSwgdGhpcy50YXJnZXRzKSk7XG4gICAgfVxuXG4gICAgc2F2ZUFwcGx5UGFyYWdyYXBoU3R5bGVUb0hpc3Rvcnkoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCBwYXJhZ3JhcGhTdHlsZTogUGFyYWdyYXBoU3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhzID0gSW5kZXhlZEVsZW1lbnRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC5wYXJhZ3JhcGhzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaHNEZWVwQ29weSA9IHBhcmFncmFwaHMubWFwKFxuICAgICAgICAgICAgeCA9PiBuZXcgUGFyYWdyYXBoTW9kZWwoeyBpbnNlcnRJbmRleDogeC5pbnNlcnRJbmRleCwgcGFyYWdyYXBoU3R5bGU6IG5ldyBQYXJhZ3JhcGhTdHlsZU1vZGVsKHsgLi4ueC5wYXJhZ3JhcGhTdHlsZSB9KSB9KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEFwcGx5UGFyYWdyYXBoU3R5bGUoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHBhcmFncmFwaFN0eWxlLCBwYXJhZ3JhcGhzRGVlcENvcHkpO1xuICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFxuICAgICAgICAgICAgU2F2ZUNvbW1hbmRzSGVscGVyLmdldEFwcGx5UGFyYWdyYXBoU3R5bGVDb21tYW5kKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBwYXJhZ3JhcGhTdHlsZSwgdGhpcy50YXJnZXRzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNhdmVBcHBseUVsZW1lbnRTdHlsZVRvSGlzdG9yeShjdXJyZW50OiBFbGVtZW50TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLnNlc3Npb24ubW9kZWwuZWxlbWVudHMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGN1cnJlbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEFwcGx5RWxlbWVudFN0eWxlKHByZXZpb3VzLCBjdXJyZW50KTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0QXBwbHlFbGVtZW50U3R5bGVDb21tYW5kKGN1cnJlbnQsIHRoaXMudGFyZ2V0cykpO1xuICAgIH1cblxuICAgIHNhdmVBZGROdW1iZXJpbmdUb0hpc3RvcnkodGVtcGxhdGVMZXZlbHM6IE51bWJlcmluZ0xldmVsTW9kZWxbXSwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaHMgPSBJbmRleGVkRWxlbWVudEhlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoc0RlZXBDb3B5ID0gcGFyYWdyYXBocy5tYXAoXG4gICAgICAgICAgICB4ID0+IG5ldyBQYXJhZ3JhcGhNb2RlbCh7IGluc2VydEluZGV4OiB4Lmluc2VydEluZGV4LCBwYXJhZ3JhcGhTdHlsZTogbmV3IFBhcmFncmFwaFN0eWxlTW9kZWwoeyAuLi54LnBhcmFncmFwaFN0eWxlIH0pIH0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWROdW1iZXJpbmdJZHMgPSBbLi4ubmV3IFNldChwYXJhZ3JhcGhzLm1hcCh4ID0+IHgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQpKV07XG4gICAgICAgIGNvbnN0IG51bWJlcmluZ3MgPSB0aGlzLnNlc3Npb24uZ2VuZXJhbFByb3BlcnRpZXMubnVtYmVyaW5ncy5maWx0ZXIoeCA9PiByZW1vdmVkTnVtYmVyaW5nSWRzLmluY2x1ZGVzKHgubnVtYmVyaW5nSWQpKTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hBZGROdW1iZXJpbmcoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRlbXBsYXRlTGV2ZWxzLCBwYXJhZ3JhcGhzRGVlcENvcHksIG51bWJlcmluZ3MpO1xuICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFNhdmVDb21tYW5kc0hlbHBlci5nZXRBZGROdW1iZXJpbmdDb21tYW5kKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0ZW1wbGF0ZUxldmVscywgdGhpcy50YXJnZXRzKSk7XG4gICAgfVxuXG4gICAgc2F2ZVJlbW92ZU51bWJlcmluZ1RvSGlzdG9yeShzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBocyA9IEluZGV4ZWRFbGVtZW50SGVscGVyLnNsaWNlU2VjdGlvbih0aGlzLnNlc3Npb24ubW9kZWwucGFyYWdyYXBocywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhzRGVlcENvcHkgPSBwYXJhZ3JhcGhzLm1hcChcbiAgICAgICAgICAgIHggPT4gbmV3IFBhcmFncmFwaE1vZGVsKHsgaW5zZXJ0SW5kZXg6IHguaW5zZXJ0SW5kZXgsIHBhcmFncmFwaFN0eWxlOiBuZXcgUGFyYWdyYXBoU3R5bGVNb2RlbCh7IC4uLngucGFyYWdyYXBoU3R5bGUgfSkgfSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZE51bWJlcmluZ0lkcyA9IFsuLi5uZXcgU2V0KHBhcmFncmFwaHMubWFwKHggPT4geC5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZCkpXTtcbiAgICAgICAgY29uc3QgbnVtYmVyaW5ncyA9IHRoaXMuc2Vzc2lvbi5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzLmZpbHRlcih4ID0+IHJlbW92ZWROdW1iZXJpbmdJZHMuaW5jbHVkZXMoeC5udW1iZXJpbmdJZCkpO1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaFJlbW92ZU51bWJlcmluZ3Moc3RhcnRJbmRleCwgZW5kSW5kZXgsIG51bWJlcmluZ3MsIHBhcmFncmFwaHNEZWVwQ29weSk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlbW92ZU51bWJlcmluZ3NDb21tYW5kKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNhdmVBcHBseUltYWdlU3R5bGVUb0hpc3RvcnkoaW1hZ2U6IEltYWdlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLnNlc3Npb24ubW9kZWwuaW1hZ2VzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbWFnZS5pbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoQXBwbHlJbWFnZVN0eWxlKHByZXZpb3VzLCBpbWFnZSk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoXG4gICAgICAgICAgICBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0QXBwbHlJbWFnZVN0eWxlQ29tbWFuZChpbWFnZS5oZWlnaHQsIGltYWdlLndpZHRoLCBpbWFnZS5pbnNlcnRJbmRleCwgdGhpcy50YXJnZXRzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZVJlcGxhY2VUb0hpc3RvcnkocmFuZ2U6IFJhbmdlLCBtb2RlbDogUmVwbGFjZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlc3RvcmVNb2RlbCA9IHRoaXMuY3JlYXRlUmVzdG9yZUZyb21TbGljZShyYW5nZS5zdGFydC5yb3csIHJhbmdlLnN0YXJ0LmNvbHVtbiwgcmFuZ2UuZW5kLnJvdywgcmFuZ2UuZW5kLmNvbHVtbik7XG4gICAgICAgIGlmIChtb2RlbC5pbnNlcnRQYXJhZ3JhcGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3RhcnRJbmRleCwgY291bnQgfSA9IHRoaXMuaGlzdG9yeS5nZXREZWxldGVEYXRhRm9ySW5zZXJ0UGFyYWdyYXBocyhcbiAgICAgICAgICAgICAgICBDb250ZW50SGVscGVyLmdldENvbnRlbnRGcm9tSW5zZXJ0UGFyYWdyYXBoKG1vZGVsLmluc2VydFBhcmFncmFwaCksXG4gICAgICAgICAgICAgICAgbW9kZWwuaW5zZXJ0UGFyYWdyYXBoLFxuICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5tb2RlbC5wYXJhZ3JhcGhzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzdG9yZU1vZGVsLnN0YXJ0SW5kZXggPSBzdGFydEluZGV4O1xuICAgICAgICAgICAgcmVzdG9yZU1vZGVsLmVuZEluZGV4ID0gc3RhcnRJbmRleCArIGNvdW50IC0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3RvcmVNb2RlbC5lbmRJbmRleCA9IHJlc3RvcmVNb2RlbC5zdGFydEluZGV4ICsgKG1vZGVsLmluc2VydFRleHQ/LnRleHQubGVuZ3RoID8/IDEpOyAvLyB0aGlzIGlzIHRvIHJlc3RvcmUgaW4gcmFuZ2Ugd2l0aCBkZWxldGluZy9yZXBsYWNpbmcgY29udGVudCB3aXRoaW5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaFJlcGxhY2UocmVzdG9yZU1vZGVsLCBtb2RlbCk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlcGxhY2VDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVJlc3RvcmVGcm9tU2xpY2UocGFyYWdyYXBoU3RhcnQ6IG51bWJlciwgaW5kZXhJblN0YXJ0OiBudW1iZXIsIHBhcmFncmFwaEVuZDogbnVtYmVyLCBpbmRleEluRW5kOiBudW1iZXIpOiBSZXN0b3JlTW9kZWwge1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhUb0RvY3VtZW50SW5kZXgodGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBhcmFncmFwaFN0YXJ0LCBpbmRleEluU3RhcnQpO1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwYXJhZ3JhcGhFbmQsIGluZGV4SW5FbmQpIC0gMTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuc2Vzc2lvbi5tb2RlbC5jb250ZW50LnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4ICsgMSk7XG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSBGb3JtYXRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaHMgPSBJbmRleGVkRWxlbWVudEhlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KS5tYXAoXG4gICAgICAgICAgICB4ID0+IG5ldyBQYXJhZ3JhcGhNb2RlbCh4KVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbWFnZXMgPSBJbmRleGVkRWxlbWVudEhlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLmltYWdlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IG5ldyBJbWFnZU1vZGVsKHgpKTtcbiAgICAgICAgY29uc3QgdGFibGVzID0gSW5kZXhlZEVsZW1lbnRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC50YWJsZXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KS5tYXAoeCA9PiBuZXcgVGFibGVNb2RlbCh4KSk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gSW5kZXhlZEVsZW1lbnRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC5lbGVtZW50cywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcChcbiAgICAgICAgICAgIHggPT4gbmV3IEVsZW1lbnRNb2RlbCh7IC4uLngsIGlkOiAwLCBndWlkOiAnJyB9KVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBicmVha3MgPSBJbmRleGVkRWxlbWVudEhlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLmJyZWFrcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IG5ldyBCcmVha01vZGVsKHgpKTtcbiAgICAgICAgY29uc3QgdGFicyA9IEluZGV4ZWRFbGVtZW50SGVscGVyLnNsaWNlU2VjdGlvbih0aGlzLnNlc3Npb24ubW9kZWwudGFicywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IG5ldyBUYWJNb2RlbCh4KSk7XG4gICAgICAgIGNvbnN0IGxpbmtzID0gTGlua0hlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLmxpbmtzLCBzdGFydEluZGV4LCBlbmRJbmRleCkubWFwKHggPT4gbmV3IExpbmtNb2RlbCh4KSk7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdG9yZU1vZGVsKHsgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRleHQsIGZvcm1hdHMsIHBhcmFncmFwaHMsIGltYWdlcywgdGFibGVzLCBlbGVtZW50cywgYnJlYWtzLCB0YWJzLCBsaW5rcyB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVDdXN0b21FbGVtZW50KGRhdGE6IEVsZW1lbnREYXRhTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFRvRG9jdW1lbnRJbmRleChcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQucm93LFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQuY29sdW1uXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGluc2VydEVsZW1lbnQgPSBuZXcgSW5zZXJ0RWxlbWVudE1vZGVsKHsgZWxlbWVudDogbmV3IEVsZW1lbnRNb2RlbCh7IC4uLmRhdGEsIGluc2VydEluZGV4IH0pIH0pO1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZUJ5KG5ldyBSZXBsYWNlTW9kZWwoeyBpbnNlcnRFbGVtZW50IH0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZUluc2VydEVsZW1lbnRUb0hpc3RvcnkoaW5zZXJ0RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5zZXNzaW9uLmluc2VydEVsZW1lbnQodGhpcy5zZWxlY3Rpb24uY3Vyc29yLCBkYXRhKTtcbiAgICAgICAgdGhpcy5vbkRvY3VtZW50Q2hhbmdlKG5ldyBSYW5nZSh0aGlzLnNlbGVjdGlvbi5jdXJzb3IsIGVuZFBvaW50KSk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICByZW1vdmVTZWxlY3RlZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZVJlbW92ZVRvSGlzdG9yeSh0aGlzLnNlbGVjdGlvbi5yYW5nZSk7XG4gICAgICAgIHRoaXMucmVtb3ZlQ3VzdG9tRWxlbWVudHNEYXRhKCk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5zZWxlY3Rpb24ucmFuZ2UpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG5cbiAgICByZW1vdmVDdXN0b21FbGVtZW50c0RhdGEoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFRvRG9jdW1lbnRJbmRleChcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQucm93LFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQuY29sdW1uXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID1cbiAgICAgICAgICAgIENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KFxuICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLmVuZC5yb3csXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2UuZW5kLmNvbHVtblxuICAgICAgICAgICAgKSAtIDE7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gSW5kZXhlZEVsZW1lbnRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC5lbGVtZW50cywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLnNsaWNlKCk7XG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5yZW1vdmVDdXN0b21FbGVtZW50c0RhdGEoZWxlbWVudHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25JbnB1dCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMudGV4dElucHV0LmdldEluc2VydFRleHQoKTtcbiAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0VtcHR5TnVtYmVyaW5nUGFyYWdyYXBoID0gdGhpcy5pc0VtcHR5TnVtYmVyaW5nUGFyYWdyYXBoKHRoaXMuc2VsZWN0aW9uLmN1cnNvci5yb3cpO1xuICAgICAgICBpZiAodGV4dCA9PT0gTkVXX0xJTkVfTUFSS1VQICYmIHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkgJiYgaXNFbXB0eU51bWJlcmluZ1BhcmFncmFwaCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVOdW1iZXJpbmdzRnJvbVBhcmFncmFwaHMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0KHRleHQpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxDdXJzb3JJbnRvTWFpblZpZXcoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ3V0KGV2ZW50OiBDbGlwYm9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRTZWxlY3RlZFRleHQoKTtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnNldENsaXBib2FyZERhdGEoZGF0YSk7XG4gICAgICAgIHRoaXMuY2xpcGJvYXJkLmNvcHkoZGF0YSk7XG4gICAgICAgIHRoaXMuY3V0KCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KCk7XG4gICAgfVxuXG4gICAgb25Db3B5KGV2ZW50OiBDbGlwYm9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRTZWxlY3RlZFRleHQoKTtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnNldENsaXBib2FyZERhdGEoZGF0YSk7XG4gICAgICAgIHRoaXMuY2xpcGJvYXJkLmNvcHkoZGF0YSk7XG4gICAgfVxuXG4gICAgb25QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMudGV4dElucHV0LmdldENsaXBib2FyZERhdGEoZXZlbnQpO1xuICAgICAgICB0aGlzLnBhc3RlRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRSZXNpemVMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVyZW5kZXJSZXNpemUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveVJlc2l6ZUxpc3RlbmVyKCk6IHZvaWQge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXJlbmRlclJlc2l6ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXJlbmRlck1hcmtlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5sb29wLnNjaGVkdWxlKHsgbWFya2VyOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVyZW5kZXJSZXNpemUgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMubWFpblJlbmRlcmVyLm9uUmVzaXplKHRydWUpO1xuICAgIH07XG5cbiAgICBvbkJsdXIoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy50ZXh0SW5wdXQuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5oaWRlQ3Vyc29yKCk7XG4gICAgfVxuXG4gICAgb25Gb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudGV4dElucHV0LmlzRm9jdXNlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uYmx1cigpO1xuICAgICAgICB0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNob3dDdXJzb3IoKTtcbiAgICB9XG5cbiAgICBvbk1vdXNlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuc2V0Q3VycmVudFNlc3Npb24oZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnQgJiYgY3VzdG9tRWxlbWVudC50YWdOYW1lICE9PSB0aGlzLnRhYmxlQ2VsbFRhZ05hbWUgJiYgY3VzdG9tRWxlbWVudC50YWdOYW1lICE9PSB0aGlzLmVkZ2VFbGVtZW50VGFnTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0N1c3RvbUNvbXBvbmVudChjdXN0b21FbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmJsdXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTGVmdENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnQgPSB0aGlzLnNldEN1cnJlbnRTZXNzaW9uKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIGlmIChjdXN0b21FbGVtZW50ICYmIGN1c3RvbUVsZW1lbnQudGFnTmFtZSAhPT0gdGhpcy50YWJsZUNlbGxUYWdOYW1lICYmIGN1c3RvbUVsZW1lbnQudGFnTmFtZSAhPT0gdGhpcy5lZGdlRWxlbWVudFRhZ05hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNDdXN0b21Db21wb25lbnQoY3VzdG9tRWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXNVc2luZ01pZHBvaW50KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVTZWxlY3Rpb24ocG9zaXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5KSB7XG4gICAgICAgICAgICBjb25zdCBsaW5rID0gdGhpcy5nZXRMaW5rTW9kZWwoZXZlbnQpO1xuICAgICAgICAgICAgaWYgKGxpbmspIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihsaW5rLmxpbmspO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb3VzZUhhbmRsZXIuc3RhcnRNb3VzZVByZXNzKHRoaXMpO1xuICAgIH1cblxuICAgIG9uRG91YmxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXNFZGdlRWRpdCA9IHRoaXMubWFpblNlc3Npb24uY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5pc0VkaXQ7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnQgPSB0aGlzLmdldEN1c3RvbUVsZW1lbnQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRTZXNzaW9uSWQgPSArY3VzdG9tRWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnZGF0YS1zZXNzaW9uLWlkJykudmFsdWU7XG4gICAgICAgICAgICB0aGlzLnJlZ3VsYXRvclNlcnZpY2Uuc2V0Q3VzdG9tU2Vzc2lvbkFzQ3VycmVudChlbGVtZW50U2Vzc2lvbklkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRNYWluU2Vzc2lvbkFzQ3VycmVudCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnQgJiYgY3VzdG9tRWxlbWVudC50YWdOYW1lICE9PSB0aGlzLnRhYmxlQ2VsbFRhZ05hbWUgJiYgY3VzdG9tRWxlbWVudC50YWdOYW1lICE9PSB0aGlzLmVkZ2VFbGVtZW50VGFnTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0N1c3RvbUNvbXBvbmVudChjdXN0b21FbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlc1VzaW5nTWlkcG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICAgIGlmICghaXNFZGdlRWRpdCAmJiB0aGlzLm1haW5TZXNzaW9uLmN1c3RvbUNvbXBvbmVudHMuZWRnZXMuaXNFZGl0KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihwb3NpdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuc2Vzc2lvbi5nZXRXb3JkUmFuZ2UocG9zaXRpb24ucm93LCBwb3NpdGlvbi5jb2x1bW4pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VTZWxlY3Rpb24ocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIG9uVHJpcGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuc2V0Q3VycmVudFNlc3Npb24oZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnQgJiYgY3VzdG9tRWxlbWVudC50YWdOYW1lICE9PSB0aGlzLnRhYmxlQ2VsbFRhZ05hbWUgJiYgY3VzdG9tRWxlbWVudC50YWdOYW1lICE9PSB0aGlzLmVkZ2VFbGVtZW50VGFnTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0N1c3RvbUNvbXBvbmVudChjdXN0b21FbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlc1VzaW5nTWlkcG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IEN1cnNvclBhcmFncmFwaChwb3NpdGlvbi5yb3csIDApO1xuICAgICAgICBjb25zdCBlbmQgPSBuZXcgQ3Vyc29yUGFyYWdyYXBoKHBvc2l0aW9uLnJvdywgdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLmdldFBhcmFncmFwaENvbnRlbnQocG9zaXRpb24ucm93KS5sZW5ndGgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZVNlbGVjdGlvbihzdGFydCwgZW5kKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIG9uUXVhZENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnQgPSB0aGlzLnNldEN1cnJlbnRTZXNzaW9uKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIGlmIChjdXN0b21FbGVtZW50ICYmIGN1c3RvbUVsZW1lbnQudGFnTmFtZSAhPT0gdGhpcy50YWJsZUNlbGxUYWdOYW1lICYmIGN1c3RvbUVsZW1lbnQudGFnTmFtZSAhPT0gdGhpcy5lZGdlRWxlbWVudFRhZ05hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNDdXN0b21Db21wb25lbnQoY3VzdG9tRWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RBbGwodGhpcy5zZXNzaW9uLm1vZGVsKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIG9uTW91c2VXaGVlbChldmVudDogV2hlZWxFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmFjdG9yID0gMC4zNTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsU3BlZWQgPSA0O1xuICAgICAgICBjb25zdCBkZWx0YVkgPSBldmVudC5kZWx0YVkgKiBmYWN0b3IgKiBzY3JvbGxTcGVlZDtcbiAgICAgICAgdGhpcy5tYWluUmVuZGVyZXIuc2Nyb2xsQnkoZGVsdGFZKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgZ2V0TGlua01vZGVsKGV2ZW50OiBNb3VzZUV2ZW50KTogTGlua01vZGVsIHtcbiAgICAgICAgY29uc3QgaXNJbnNpZGVFZGdlID0gdGhpcy5pc0luc2lkZUVkZ2UoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgY29uc3QgaXNFZGdlRWRpdCA9IHRoaXMubWFpblNlc3Npb24uY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5pc0VkaXQ7XG4gICAgICAgIGlmICghaXNJbnNpZGVFZGdlIHx8IGlzRWRnZUVkaXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlc1VzaW5nQm91bmRhcnkoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmdldExpbmtNb2RlbChwb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuZ2V0Q3VzdG9tRWxlbWVudChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSArY3VzdG9tRWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnZGF0YS1zZXNzaW9uLWlkJykudmFsdWU7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnJlZ3VsYXRvclNlcnZpY2UuZ2V0U2Vzc2lvbk1vZGVsKHNlc3Npb25JZCk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gc2Vzc2lvbi5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlc1VzaW5nQm91bmRhcnkoXG4gICAgICAgICAgICBldmVudC5jbGllbnRYLFxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WSxcbiAgICAgICAgICAgIGN1c3RvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHNlc3Npb24uc2Vzc2lvbi5nZXRMaW5rTW9kZWwocG9zaXRpb24pO1xuICAgIH1cblxuICAgIHNldEN1cnJlbnRTZXNzaW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuZ2V0Q3VzdG9tRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgY29uc3QgaXNJbnNpZGVFZGdlID0gdGhpcy5pc0luc2lkZUVkZ2UoY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGlzRWRnZUVkaXQgPSB0aGlzLm1haW5TZXNzaW9uLmN1c3RvbUNvbXBvbmVudHMuZWRnZXMuaXNFZGl0O1xuICAgICAgICBpZiAoIWN1c3RvbUVsZW1lbnQgfHwgKCFpc0VkZ2VFZGl0ICYmIGlzSW5zaWRlRWRnZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRNYWluU2Vzc2lvbkFzQ3VycmVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tRWxlbWVudFRhZ05hbWVzLmluY2x1ZGVzKGN1c3RvbUVsZW1lbnQ/LnRhZ05hbWUpID8gY3VzdG9tRWxlbWVudCA6IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGVtZW50U2Vzc2lvbklkID0gK2N1c3RvbUVsZW1lbnQuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ2RhdGEtc2Vzc2lvbi1pZCcpLnZhbHVlO1xuICAgICAgICB0aGlzLnJlZ3VsYXRvclNlcnZpY2Uuc2V0Q3VzdG9tU2Vzc2lvbkFzQ3VycmVudChlbGVtZW50U2Vzc2lvbklkKTtcbiAgICAgICAgcmV0dXJuIGN1c3RvbUVsZW1lbnQudGFnTmFtZSAhPT0gdGhpcy5lZGdlRWxlbWVudFRhZ05hbWUgPyBjdXN0b21FbGVtZW50IDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXRDdXN0b21FbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gdGhpcy5wYXJlbnRUYWdOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1c3RvbUVsZW1lbnRUYWdOYW1lcy5pbmNsdWRlcyhlbGVtZW50LnRhZ05hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1c3RvbUVsZW1lbnQoZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzSW5zaWRlRWRnZShlbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRQYXJlbnRFZGdlKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIGdldFBhcmVudEVkZ2UoZWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gdGhpcy5wYXJlbnRUYWdOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnRhZ05hbWUgPT09IHRoaXMuZWRnZUVsZW1lbnRUYWdOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFBhcmVudEVkZ2UoZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBvZiB0ZXh0IGN1cnJlbnRseSBoaWdobGlnaHRlZC5cbiAgICAgKi9cbiAgICBnZXRTZWxlY3RlZFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uUmFuZ2UgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZFJhbmdlO1xuICAgICAgICBpZiAoc2VsZWN0aW9uUmFuZ2UuaXNFbXB0eSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHNlbGVjdGlvblJhbmdlLnN0YXJ0KTtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBzZWxlY3Rpb25SYW5nZS5lbmQpO1xuICAgICAgICBsZXQgZWxlbWVudEluZGV4ZXM6IG51bWJlcltdID0gW107XG4gICAgICAgIENvbnRlbnRIZWxwZXIuc2V0SW5kZXhlc0VsZW1lbnRzSW5JbnRlcnZhbCh0aGlzLnNlc3Npb24ubW9kZWwuYnJlYWtzLCBlbGVtZW50SW5kZXhlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBDb250ZW50SGVscGVyLnNldEluZGV4ZXNFbGVtZW50c0luSW50ZXJ2YWwodGhpcy5zZXNzaW9uLm1vZGVsLnRhYmxlcywgZWxlbWVudEluZGV4ZXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgQ29udGVudEhlbHBlci5zZXRJbmRleGVzRWxlbWVudHNJbkludGVydmFsKHRoaXMuc2Vzc2lvbi5tb2RlbC5pbWFnZXMsIGVsZW1lbnRJbmRleGVzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIENvbnRlbnRIZWxwZXIuc2V0SW5kZXhlc0VsZW1lbnRzSW5JbnRlcnZhbCh0aGlzLnNlc3Npb24ubW9kZWwuZWxlbWVudHMsIGVsZW1lbnRJbmRleGVzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIENvbnRlbnRIZWxwZXIuc2V0SW5kZXhlc0VsZW1lbnRzSW5JbnRlcnZhbCh0aGlzLnNlc3Npb24ubW9kZWwudGFicywgZWxlbWVudEluZGV4ZXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgZWxlbWVudEluZGV4ZXMuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuICAgICAgICBsZXQgdGV4dEludGVydmFsID0gdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLmdldFRleHRSYW5nZShzZWxlY3Rpb25SYW5nZSk7XG4gICAgICAgIGVsZW1lbnRJbmRleGVzLmZvckVhY2goeCA9PiB7XG4gICAgICAgICAgICB0ZXh0SW50ZXJ2YWwgPSB0ZXh0SW50ZXJ2YWwuc2xpY2UoMCwgeCkgKyB0ZXh0SW50ZXJ2YWwuc2xpY2UoeCArIDEpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGV4dEludGVydmFsO1xuICAgIH1cblxuICAgIGluaXRNYWluU2Vzc2lvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFnZVdpZHRoID0gdGhpcy5jdXN0b21QYWdlV2lkdGggPz8gdGhpcy5tb2RlbC5wYWdlV2lkdGg7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSBgJHtwYWdlV2lkdGh9cHhgO1xuICAgICAgICBjb25zdCBzY2FsaW5nUmF0aW8gPSB0aGlzLmN1c3RvbVBhZ2VXaWR0aCA/IFNjYWxpbmdIZWxwZXIuZ2V0UmF0aW8odGhpcy5jdXN0b21QYWdlV2lkdGgsIHRoaXMubW9kZWwucGFnZVdpZHRoKSA6IDE7XG4gICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5hZGRNYWluU2Vzc2lvbih0aGlzLm1vZGVsLCBwYWdlV2lkdGgsIHNjYWxpbmdSYXRpbywgdGhpcy5jb250YWluZXIpO1xuICAgIH1cblxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlUb29sYmFyU3R5bGVzKCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlU2VsZWN0aW9uKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkUmFuZ2UpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0SGFzU2VsZWN0aW9uKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KTtcbiAgICAgICAgdGhpcy5yZXJlbmRlck1hcmtlcigpO1xuICAgIH1cblxuICAgIGVuYWJsZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtc2Vzc2lvbi1pZD1cIiR7dGhpcy5zZXNzaW9uLnNlc3Npb25JZH1cIl1gKTtcbiAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnQudGFnTmFtZSA9PT0gdGhpcy50YWJsZUNlbGxUYWdOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVNlc3Npb24gPSB0aGlzLnJlZ3VsYXRvclNlcnZpY2UuZ2V0U2Vzc2lvbih0aGlzLnJlZ3VsYXRvclNlcnZpY2UuY3VycmVudFNlc3Npb24ucGFyZW50U2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVTZXNzaW9uLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoXG4gICAgICAgICAgICAgICAgeCA9PiB4Lmluc3RhbmNlLnNlc3Npb25JZCA9PT0gdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLmN1cnJlbnRTZXNzaW9uLnBhcmVudFNlc3Npb25JZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRhYmxlLmluc3RhbmNlLnRhYmxlU2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uZW5hYmxlU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuY3Vyc29yTGF5ZXIuc2hvd0N1cnNvcigpO1xuICAgIH1cblxuICAgIG9uSG90S2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2Uua2V5RG93bihldmVudCk7XG4gICAgfVxuXG4gICAgb25QcmludCgpOiB2b2lkIHtcbiAgICAgICAgUHJpbnRIZWxwZXIucHJpbnREb2N1bWVudCh0aGlzLm1haW5TZXNzaW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRG9jdW1lbnRDaGFuZ2UgPSAocmFuZ2U6IFJhbmdlKTogdm9pZCA9PiB7XG4gICAgICAgIGxldCBsYXN0Um93ID0gcmFuZ2Uuc3RhcnQucm93ID09PSByYW5nZS5lbmQucm93ID8gcmFuZ2UuZW5kLnJvdyA6IEluZmluaXR5O1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUxpbmVzKHJhbmdlLnN0YXJ0LnJvdywgbGFzdFJvdyk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGN1cnNvciBiZWNhdXNlIHRhYiBjaGFyYWN0ZXJzIGNhbiBpbmZsdWVuY2UgdGhlIGN1cnNvciBwb3NpdGlvbi5cbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBmb2N1c0N1c3RvbUNvbXBvbmVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleCA9ICtlbGVtZW50LmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdkYXRhLWluc2VydC1pbmRleCcpLnZhbHVlO1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPVxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmN1c3RvbUNvbXBvbmVudHMuaW1hZ2VzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbmRleCkgPz9cbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5jdXN0b21Db21wb25lbnRzLnRhYmxlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5kZXgpID8/XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uY3VzdG9tQ29tcG9uZW50cy5jdXN0b21FbGVtZW50cy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5kZXgpO1xuICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnNlc3Npb24uZGlzcGxheURhdGEuaW5kZXhUb1Bvc2l0aW9uKGluZGV4LCAwKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uZm9jdXMoY29tcG9uZW50LCBwb3NpdGlvbik7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRW1wdHlOdW1iZXJpbmdQYXJhZ3JhcGgocGFyYWdyYXBoSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjdXJyZW50TGluZSA9IHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5nZXRQYXJhZ3JhcGhDb250ZW50KHBhcmFncmFwaEluZGV4KTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRMaW5lLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnNlc3Npb24ubW9kZWwucGFyYWdyYXBoc1twYXJhZ3JhcGhJbmRleF0ucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQgIT09IG51bGw7XG4gICAgfVxuXG4gICAgc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KG9mZnNldD86IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZXNzaW9uICE9PSB0aGlzLm1haW5TZXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYWluUmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcobnVsbCwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjaGFuZ2VkVGFibGVTaXplKGluc2VydEluZGV4OiBudW1iZXIsIHNlc3Npb25JZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnJlZ3VsYXRvclNlcnZpY2UuZ2V0U2Vzc2lvbihzZXNzaW9uSWQpO1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGggPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHNlc3Npb24uZGlzcGxheURhdGEucGFyYWdyYXBocywgaW5zZXJ0SW5kZXgpLnJvdztcbiAgICAgICAgc2Vzc2lvbi5kaXNwbGF5RGF0YS5yZXNldEFsbE51bWJlcmluZ0luZm8ocGFyYWdyYXBoKTtcbiAgICAgICAgc2Vzc2lvbi5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMocGFyYWdyYXBoLCBwYXJhZ3JhcGgpO1xuICAgICAgICBzZXNzaW9uLmRpc3BsYXlEYXRhLnVwZGF0ZU51bWJlcmluZ3NEYXRhT25DaGFuZ2UocGFyYWdyYXBoICsgMSk7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJsZVJvd3MoaW5zZXJ0SW5kZXg6IG51bWJlciwgcm93c0NvdW50OiBudW1iZXIsIHRhcmdldEluZGV4OiBudW1iZXIsIGluaGVyaXRJbmRleDogbnVtYmVyLCBzZXNzaW9uSWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ3VsYXRvclNlcnZpY2Uuc2V0Q3VzdG9tU2Vzc2lvbkFzQ3VycmVudChzZXNzaW9uSWQpO1xuICAgICAgICBjb25zdCBiZWZvcmVUYWJsZSA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoYmVmb3JlVGFibGUpO1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuc2Vzc2lvbi5tb2RlbC50YWJsZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hJbnNlcnRUYWJsZVJvd3MoaW5zZXJ0SW5kZXgsIHJvd3NDb3VudCwgdGFyZ2V0SW5kZXgsIGluaGVyaXRJbmRleCwgdGFibGUpO1xuICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFxuICAgICAgICAgICAgU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFRhYmxlUm93c0NvbW1hbmQocm93c0NvdW50LCBpbmhlcml0SW5kZXgsIGluc2VydEluZGV4LCB0YXJnZXRJbmRleCwgdGhpcy50YXJnZXRzKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0VGFibGVSb3dzKGluc2VydEluZGV4LCByb3dzQ291bnQsIHRhcmdldEluZGV4LCBpbmhlcml0SW5kZXgpO1xuICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUoaW5zZXJ0SW5kZXgsIHNlc3Npb25JZCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVDb2x1bW5zKGluc2VydEluZGV4OiBudW1iZXIsIGNvbHVtbnNDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlciwgc2Vzc2lvbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldEN1c3RvbVNlc3Npb25Bc0N1cnJlbnQoc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgYmVmb3JlVGFibGUgPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGJlZm9yZVRhYmxlKTtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLnNlc3Npb24ubW9kZWwudGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoSW5zZXJ0VGFibGVDb2x1bW5zKGluc2VydEluZGV4LCBjb2x1bW5zQ291bnQsIHRhcmdldEluZGV4LCBpbmhlcml0SW5kZXgsIHRhYmxlKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChcbiAgICAgICAgICAgIFNhdmVDb21tYW5kc0hlbHBlci5nZXRJbnNlcnRUYWJsZUNvbHVtbnNDb21tYW5kKGNvbHVtbnNDb3VudCwgaW5oZXJpdEluZGV4LCBpbnNlcnRJbmRleCwgdGFyZ2V0SW5kZXgsIHRoaXMudGFyZ2V0cylcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLmluc2VydFRhYmxlQ29sdW1ucyhpbnNlcnRJbmRleCwgY29sdW1uc0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4KTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkVGFibGVTaXplKGluc2VydEluZGV4LCBzZXNzaW9uSWQpO1xuICAgIH1cblxuICAgIHJlbW92ZVRhYmxlUm93cyhpbnNlcnRJbmRleDogbnVtYmVyLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIsIHNlc3Npb25JZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRDdXN0b21TZXNzaW9uQXNDdXJyZW50KHNlc3Npb25JZCk7XG4gICAgICAgIGNvbnN0IGJlZm9yZVRhYmxlID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLnNlc3Npb24uZGlzcGxheURhdGEucGFyYWdyYXBocywgaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihiZWZvcmVUYWJsZSk7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5zZXNzaW9uLm1vZGVsLnRhYmxlcy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaFJlbW92ZVRhYmxlUm93cyhpbnNlcnRJbmRleCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRhYmxlKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVtb3ZlVGFibGVSb3dzQ29tbWFuZChzdGFydEluZGV4LCBlbmRJbmRleCwgaW5zZXJ0SW5kZXgsIHRoaXMudGFyZ2V0cykpO1xuICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlVGFibGVSb3dzKGluc2VydEluZGV4LCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZShpbnNlcnRJbmRleCwgc2Vzc2lvbklkKTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZUNvbHVtbnMoaW5zZXJ0SW5kZXg6IG51bWJlciwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCBzZXNzaW9uSWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ3VsYXRvclNlcnZpY2Uuc2V0Q3VzdG9tU2Vzc2lvbkFzQ3VycmVudChzZXNzaW9uSWQpO1xuICAgICAgICBjb25zdCBiZWZvcmVUYWJsZSA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoYmVmb3JlVGFibGUpO1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuc2Vzc2lvbi5tb2RlbC50YWJsZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hSZW1vdmVUYWJsZUNvbHVtbnMoaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0YWJsZSk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoXG4gICAgICAgICAgICBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVtb3ZlVGFibGVDb2x1bW5zQ29tbWFuZChzdGFydEluZGV4LCBlbmRJbmRleCwgaW5zZXJ0SW5kZXgsIHRoaXMudGFyZ2V0cylcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZVRhYmxlQ29sdW1ucyhpbnNlcnRJbmRleCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUoaW5zZXJ0SW5kZXgsIHNlc3Npb25JZCk7XG4gICAgfVxuXG4gICAgcmVzaXplVGFibGVDb2x1bW5zKHJlc2l6ZVRhYmxlQ29sdW1uczogUmVzaXplVGFibGVDb2x1bW5zTW9kZWwsIHNlc3Npb25JZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRDdXN0b21TZXNzaW9uQXNDdXJyZW50KHNlc3Npb25JZCk7XG4gICAgICAgIGNvbnN0IGJlZm9yZVRhYmxlID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleChcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgcmVzaXplVGFibGVDb2x1bW5zLmluc2VydEluZGV4XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGJlZm9yZVRhYmxlKTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hSZXNpemVUYWJsZUNvbHVtbnMocmVzaXplVGFibGVDb2x1bW5zKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVzaXplVGFibGVDb2x1bW5zQ29tbWFuZChyZXNpemVUYWJsZUNvbHVtbnMsIHRoaXMudGFyZ2V0cykpO1xuICAgICAgICB0aGlzLnNlc3Npb24ucmVzaXplVGFibGVDb2x1bW5zKHJlc2l6ZVRhYmxlQ29sdW1ucyk7XG4gICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZShyZXNpemVUYWJsZUNvbHVtbnMuaW5zZXJ0SW5kZXgsIHNlc3Npb25JZCk7XG4gICAgfVxuXG4gICAgb25Nb3VzZVByZXNzZWRNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlc1VzaW5nTWlkcG9pbnQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICAgIGNvbnN0IGN1cnNvciA9IHRoaXMuc2VsZWN0aW9uLmN1cnNvcjtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZVNlbGVjdGlvbihwb3NpdGlvbik7XG4gICAgICAgIGlmIChjdXJzb3IuY29sdW1uICE9PSB0aGlzLnNlbGVjdGlvbi5jdXJzb3IuY29sdW1uIHx8IGN1cnNvci5yb3cgIT09IHRoaXMuc2VsZWN0aW9uLmN1cnNvci5yb3cpIHtcbiAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjcm9sbEN1cnNvckludG9NYWluVmlldygpO1xuICAgIH1cblxuICAgIHByb3ZpZGVUZXh0U3R5bGUoY29tcG9uZW50OiBCYXNlTm9kZXJDb21wb25lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMucmVndWxhdG9yU2VydmljZS5nZXRTZXNzaW9uKGNvbXBvbmVudC5zZXNzaW9uSWQpO1xuICAgICAgICBjb25zdCBmb3JtYXQgPSBzZXNzaW9uLm1vZGVsLmZvcm1hdHMuZmluZCh4ID0+IHguc3RhcnRJbmRleCA8PSBjb21wb25lbnQuaW5zZXJ0SW5kZXggJiYgeC5lbmRJbmRleCA+PSBjb21wb25lbnQuaW5zZXJ0SW5kZXgpO1xuICAgICAgICBjb21wb25lbnQucmVjZWl2ZVN0eWxlKGZvcm1hdC50ZXh0U3R5bGUpO1xuICAgIH1cblxuICAgIHJlY2VpdmVUZXh0U3R5bGVTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5yZWNlaXZlVGV4dFN0eWxlJC5zdWJzY3JpYmUoeCA9PiB0aGlzLnByb3ZpZGVUZXh0U3R5bGUoeCkpO1xuICAgIH1cblxuICAgIHNlYXJjaE9wdGlvblN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnNlYXJjaE9wdGlvbnMkLnN1YnNjcmliZShzZWFyY2hPcHRpb25zID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmluZChzZWFyY2hPcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZWFyY2hJdGVyYXRpb24gPSB0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVwbGFjZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnJlcGxhY2UkLnN1YnNjcmliZShyZXBsYWNlID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZShyZXBsYWNlLnNlYXJjaFZhbHVlLCByZXBsYWNlLnJlcGxhY2VWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc2VhcmNoSXRlcmF0aW9uID0gdGhpcy51cGRhdGVDb3VudGVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFRleHRTdHlsZXNTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5zZXRUZXh0U3R5bGVzJC5zdWJzY3JpYmUodGV4dFN0eWxlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5VGV4dFN0eWxlcyh0ZXh0U3R5bGVzKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0UGFyYWdyYXBoU3R5bGVzU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0UGFyYWdyYXBoU3R5bGVzJC5zdWJzY3JpYmUocGFyYWdyYXBoU3R5bGVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlQYXJhZ3JhcGhTdHlsZXMocGFyYWdyYXBoU3R5bGVzKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0TnVtYmVyaW5nVGVtcGxhdGVUeXBlU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0TnVtYmVyaW5nVGVtcGxhdGVUeXBlJC5zdWJzY3JpYmUobnVtYmVyaW5nVGVtcGxhdGVUeXBlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0TnVtYmVyaW5nVGVtcGxhdGUobnVtYmVyaW5nVGVtcGxhdGVUeXBlKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnVtYmVyaW5nc1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnJlbW92ZU51bWJlcmluZ3MkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZU51bWJlcmluZ3NGcm9tUGFyYWdyYXBocygpO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRJbWFnZVN0eWxlU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0SW1hZ2VTdHlsZSQuc3Vic2NyaWJlKGltYWdlID0+IHRoaXMuYXBwbHlJbWFnZVN0eWxlcyhpbWFnZSkpO1xuICAgIH1cblxuICAgIGNoYW5nZUVsZW1lbnRTdHlsZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmNoYW5nZUVsZW1lbnRTdHlsZSQuc3Vic2NyaWJlKHggPT4gdGhpcy5hcHBseUVsZW1lbnRTdHlsZSh4KSk7XG4gICAgfVxuXG4gICAgY3JlYXRlQ3VzdG9tQ29tcG9uZW50U3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuY3JlYXRlQ3VzdG9tQ29tcG9uZW50JC5zdWJzY3JpYmUobW9kZWwgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVDdXN0b21FbGVtZW50KG1vZGVsKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5zZXJ0QnJlYWtTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5pbnNlcnRCcmVhayQuc3Vic2NyaWJlKGJyZWFrVHlwZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmluc2VydEJyZWFrKGJyZWFrVHlwZSk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydEltYWdlU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuaW5zZXJ0SW1hZ2UkLnN1YnNjcmliZShpbWFnZURhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRJbWFnZShpbWFnZURhdGEpO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpbnNlcnRMaW5rU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuaW5zZXJ0TGluayQuc3Vic2NyaWJlKGxpbmtEYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGluayhuZXcgTGlua0RhdGFNb2RlbCh7IGxpbms6IGxpbmtEYXRhLmxpbmssIHRleHQ6IGxpbmtEYXRhLnRleHQgfSkpO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBlbmRNb3VzZVByZXNzU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuZW5kTW91c2VQcmVzcyQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubW91c2VIYW5kbGVyLmVuZE1vdXNlUHJlc3MoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGlzYWJsZVNlbGVjdGlvblN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmRpc2FibGVTZWxlY3Rpb24kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5kaXNhYmxlU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmN1cnNvckxheWVyLmhpZGVDdXJzb3IoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2hhbmdlZFRhYmxlU2l6ZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmNoYW5nZWRUYWJsZVNpemUkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZShkYXRhLmluc2VydEluZGV4LCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoYW5nZWRFZGdlU2l6ZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmNoYW5nZWRFZGdlU2l6ZSQuc3Vic2NyaWJlKCh7IGVkZ2VUeXBlLCBwYWdlVHlwZSB9KSA9PlxuICAgICAgICAgICAgdGhpcy5tYWluU2Vzc2lvbi5kaXNwbGF5RGF0YS51cGRhdGVQYWdlVmVydGljYWxEYXRhKGVkZ2VUeXBlLCBwYWdlVHlwZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpbWFnZUxvYWRlZFN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmltYWdlTG9hZGVkJC5zdWJzY3JpYmUoc2Vzc2lvbklkID0+IHRoaXMucmVndWxhdG9yU2VydmljZS5nZXRTZXNzaW9uKHNlc3Npb25JZCkub25SZW5kZXJlZCgpKTtcbiAgICB9XG5cbiAgICBjaGFuZ2VkRWRnZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmNoYW5nZWRFZGdlJC5zdWJzY3JpYmUoc2Vzc2lvbklkID0+IHRoaXMucmVndWxhdG9yU2VydmljZS5hcnJhbmdlRWRnZUNoYW5nZShzZXNzaW9uSWQpKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJsZVJvd3NTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5pbnNlcnRUYWJsZVJvd3MkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGFibGVSb3dzKGRhdGEuaW5zZXJ0SW5kZXgsIGRhdGEucm93c0NvdW50LCBkYXRhLnRhcmdldEluZGV4LCBkYXRhLmluaGVyaXRJbmRleCwgZGF0YS5zZXNzaW9uSWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJsZUNvbHVtbnNTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5pbnNlcnRUYWJsZUNvbHVtbnMkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGFibGVDb2x1bW5zKGRhdGEuaW5zZXJ0SW5kZXgsIGRhdGEuY29sdW1uc0NvdW50LCBkYXRhLnRhcmdldEluZGV4LCBkYXRhLmluaGVyaXRJbmRleCwgZGF0YS5zZXNzaW9uSWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZVJvd3NTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5yZW1vdmVUYWJsZVJvd3MkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGFibGVSb3dzKGRhdGEuaW5zZXJ0SW5kZXgsIGRhdGEuc3RhcnRJbmRleCwgZGF0YS5lbmRJbmRleCwgZGF0YS5zZXNzaW9uSWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZUNvbHVtbnNTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5yZW1vdmVUYWJsZUNvbHVtbnMkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGFibGVDb2x1bW5zKGRhdGEuaW5zZXJ0SW5kZXgsIGRhdGEuc3RhcnRJbmRleCwgZGF0YS5lbmRJbmRleCwgZGF0YS5zZXNzaW9uSWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW1vdmVSaWdodFN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnJlbW92ZVJpZ2h0JC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZW1vdmVSaWdodCgpKTtcbiAgICB9XG5cbiAgICByZXNpemVUYWJsZUNvbHVtbnNTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5yZXNpemVUYWJsZUNvbHVtbnMkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplVGFibGVDb2x1bW5zKGRhdGEucmVzaXplVGFibGVDb2x1bW5zLCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuaW5zZXJ0VGFibGUkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGFibGUoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydFRleHRTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5pbnNlcnRUZXh0JC5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICAgICAgICB0aGlzLmluc2VydCh4KTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdW5kb1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnVuZG8kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVuZG8oKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlZG9TdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5yZWRvJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWRvKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEN1cnNvckludG9NYWluVmlldygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW1vdmVMZWZ0U3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UucmVtb3ZlTGVmdCQuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVtb3ZlTGVmdCgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByaW50U3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UucHJpbnQkLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uUHJpbnQoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjdXRTZWxlY3RlZFN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmN1dFNlbGVjdGVkJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkN1dChuZXcgQ2xpcGJvYXJkRXZlbnQoJ2N1dCcpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb3B5U2VsZWN0ZWRTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5jb3B5U2VsZWN0ZWQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQ29weShuZXcgQ2xpcGJvYXJkRXZlbnQoJ2NvcHknKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFzdGVGcm9tQ2xpcGJvYXJkU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UucGFzdGVGcm9tQ2xpcGJvYXJkJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWFkQ2xpcGJvYXJkKClcbiAgICAgICAgICAgICAgICAudGhlbihkYXRhID0+IHRoaXMucGFzdGVEYXRhKGRhdGEpKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3MgZXJyb3JcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkQ2xpcGJvYXJkKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlYWQgPSBhd2FpdCBuYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkoeyBuYW1lOiAnY2xpcGJvYXJkLXJlYWQnIGFzIFBlcm1pc3Npb25OYW1lIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiByZWFkLnN0YXRlICE9ICdkZW5pZWQnKSB7XG4gICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZFxuICAgICAgICAgICAgICAgICAgICAucmVhZFRleHQoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIGVycm9yXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuY2xpcGJvYXJkRGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFzdGVEYXRhKGRhdGE6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0ID0gZGF0YS5yZXBsYWNlKC9cXHJcXG4vZywgJ1xcbicpLnJlcGxhY2UoL1xcdC9nLCAnICcpO1xuICAgICAgICB0aGlzLmluc2VydCh0ZXh0KTtcbiAgICAgICAgdGhpcy5zY3JvbGxDdXJzb3JJbnRvTWFpblZpZXcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdEFsbFN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnNlbGVjdEFsbCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdEFsbCh0aGlzLnNlc3Npb24ubW9kZWwpO1xuICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZVNlbGVjdGVkU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UucmVtb3ZlU2VsZWN0ZWQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xpcGJvYXJkRGF0YVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmNsaXBib2FyZERhdGEkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkRGF0YSA9IGRhdGE7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZUVkZ2VTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS51cGRhdGVFZGdlcyQuc3Vic2NyaWJlKHNlc3Npb25JZCA9PiB7XG4gICAgICAgICAgICBsZXQgZm9vdGVycyA9IHRoaXMubWFpblNlc3Npb24uY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5mb290ZXJzQ29tcG9uZW50cztcbiAgICAgICAgICAgIGxldCBleGlzdGVkID0gdGhpcy5tYWluU2Vzc2lvbi5jdXN0b21Db21wb25lbnRzLmVkZ2VzLmhlYWRlcnNDb21wb25lbnRzLmZpbmRJbmRleCh4ID0+IHguaW5zdGFuY2Uuc2Vzc2lvbklkID09PSBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgaWYgKGV4aXN0ZWQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMubWFpblNlc3Npb24uY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5oZWFkZXJzQ29tcG9uZW50cy5zbGljZShleGlzdGVkICsgMSk7XG4gICAgICAgICAgICAgICAgaGVhZGVycy5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgICAgICAgICB4Lmluc3RhbmNlLnNlc3Npb24uZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKDAsIHguaW5zdGFuY2Uuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBleGlzdGVkID0gdGhpcy5tYWluU2Vzc2lvbi5jdXN0b21Db21wb25lbnRzLmVkZ2VzLmZvb3RlcnNDb21wb25lbnRzLmZpbmRJbmRleCh4ID0+IHguaW5zdGFuY2Uuc2Vzc2lvbklkID09PSBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIGZvb3RlcnMgPSB0aGlzLm1haW5TZXNzaW9uLmN1c3RvbUNvbXBvbmVudHMuZWRnZXMuZm9vdGVyc0NvbXBvbmVudHMuc2xpY2UoZXhpc3RlZCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9vdGVycy5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgICAgIHguaW5zdGFuY2Uuc2Vzc2lvbi5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMoMCwgeC5pbnN0YW5jZS5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19