@colijnit/configurator 261.1.1 → 261.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. package/{fesm2015/colijnit-configurator.js → fesm2022/colijnit-configurator.mjs} +19087 -18481
  2. package/fesm2022/colijnit-configurator.mjs.map +1 -0
  3. package/index.d.ts +3299 -0
  4. package/lib/components/answer-card/style/_layout.scss +3 -3
  5. package/lib/components/answers-slideout/style/_layout.scss +1 -0
  6. package/lib/style/configurator-globals.scss +1 -21
  7. package/package.json +24 -19
  8. package/bundles/colijnit-configurator.umd.js +0 -20167
  9. package/bundles/colijnit-configurator.umd.js.map +0 -1
  10. package/colijnit-configurator.d.ts +0 -5
  11. package/esm2015/colijnit-configurator.js +0 -5
  12. package/esm2015/lib/builder.js +0 -795
  13. package/esm2015/lib/components/answer-card/answer-card.component.js +0 -313
  14. package/esm2015/lib/components/answer-card/answer-card.module.js +0 -50
  15. package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.component.js +0 -182
  16. package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.module.js +0 -34
  17. package/esm2015/lib/components/answers-slideout/answers-slideout.component.js +0 -490
  18. package/esm2015/lib/components/answers-slideout/answers-slideout.module.js +0 -61
  19. package/esm2015/lib/components/color-filter/color-filter.component.js +0 -59
  20. package/esm2015/lib/components/color-filter/color-filter.module.js +0 -26
  21. package/esm2015/lib/components/configurator/configurator.component.js +0 -133
  22. package/esm2015/lib/components/configurator/configurator.module.js +0 -42
  23. package/esm2015/lib/components/configurator-dialog/configurator-camera-settings.component.js +0 -222
  24. package/esm2015/lib/components/configurator-dialog/configurator-dialog.module.js +0 -48
  25. package/esm2015/lib/components/configurator-dialog/configurator-error-dialog.component.js +0 -82
  26. package/esm2015/lib/components/configurator-dialog/configurator-export-dialog.component.js +0 -163
  27. package/esm2015/lib/components/configurator-loader/configurator-loader.component.js +0 -49
  28. package/esm2015/lib/components/configurator-loader/configurator-loader.module.js +0 -33
  29. package/esm2015/lib/components/configurator-scene/configurator-scene.component.js +0 -60
  30. package/esm2015/lib/components/configurator-scene/configurator-scene.module.js +0 -17
  31. package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.component.js +0 -46
  32. package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.module.js +0 -26
  33. package/esm2015/lib/components/element-buttons/element-buttons.component.js +0 -168
  34. package/esm2015/lib/components/element-buttons/element-buttons.module.js +0 -30
  35. package/esm2015/lib/components/element-toolbar/element-toolbar.component.js +0 -186
  36. package/esm2015/lib/components/element-toolbar/element-toolbar.module.js +0 -34
  37. package/esm2015/lib/components/image-zoom/image-zoom.component.js +0 -61
  38. package/esm2015/lib/components/image-zoom/image-zoom.module.js +0 -30
  39. package/esm2015/lib/components/lite-selector/lite-selector.component.js +0 -206
  40. package/esm2015/lib/components/lite-selector/lite-selector.module.js +0 -34
  41. package/esm2015/lib/components/product-configurator/product-configurator.component.js +0 -184
  42. package/esm2015/lib/components/product-configurator/product-configurator.module.js +0 -72
  43. package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.component.js +0 -237
  44. package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.module.js +0 -38
  45. package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.js +0 -284
  46. package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.js +0 -42
  47. package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.js +0 -72
  48. package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.js +0 -34
  49. package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.js +0 -82
  50. package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.js +0 -30
  51. package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.js +0 -80
  52. package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.js +0 -34
  53. package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.js +0 -93
  54. package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.js +0 -34
  55. package/esm2015/lib/components/progress-bar/progress-bar.component.js +0 -55
  56. package/esm2015/lib/components/progress-bar/progress-bar.module.js +0 -29
  57. package/esm2015/lib/components/scene-options/scene-options.component.js +0 -164
  58. package/esm2015/lib/components/scene-options/scene-options.module.js +0 -38
  59. package/esm2015/lib/components/selections-summary/selections-summary.component.js +0 -163
  60. package/esm2015/lib/components/selections-summary/selections-summary.module.js +0 -45
  61. package/esm2015/lib/components/selections-summary-line/selections-summary-line.component.js +0 -171
  62. package/esm2015/lib/components/selections-summary-line/selections-summary-line.module.js +0 -34
  63. package/esm2015/lib/components/slideout/slideout.component.js +0 -83
  64. package/esm2015/lib/components/slideout/slideout.module.js +0 -17
  65. package/esm2015/lib/components/summary-line/summary-line.component.js +0 -273
  66. package/esm2015/lib/components/summary-line/summary-line.module.js +0 -44
  67. package/esm2015/lib/components/tag-filter/tag-filter.component.js +0 -39
  68. package/esm2015/lib/components/tag-filter/tag-filter.module.js +0 -21
  69. package/esm2015/lib/components/threedselector/threedselector.component.js +0 -155
  70. package/esm2015/lib/components/threedselector/threedselector.module.js +0 -34
  71. package/esm2015/lib/core/helper/variation-helper.js +0 -553
  72. package/esm2015/lib/core/shader/floor-fade.shader.js +0 -33
  73. package/esm2015/lib/core/textures/depth-data-texture.js +0 -19
  74. package/esm2015/lib/directives/directives.module.js +0 -26
  75. package/esm2015/lib/directives/visibility-observer-master.directive.js +0 -53
  76. package/esm2015/lib/directives/visibility-observer.directive.js +0 -54
  77. package/esm2015/lib/enum/ar-feature.enum.js +0 -14
  78. package/esm2015/lib/enum/configuration-key.enum.js +0 -41
  79. package/esm2015/lib/enum/configuration-template.enum.js +0 -6
  80. package/esm2015/lib/enum/device-size-type.js +0 -7
  81. package/esm2015/lib/enum/device-tier.enum.js +0 -7
  82. package/esm2015/lib/enum/icon.enum.js +0 -113
  83. package/esm2015/lib/enum/item-type.enum.js +0 -23
  84. package/esm2015/lib/enum/light.enum.js +0 -9
  85. package/esm2015/lib/enum/navigator-type.enum.js +0 -6
  86. package/esm2015/lib/enum/output-encoding.enum.js +0 -9
  87. package/esm2015/lib/enum/result-type.enum.js +0 -21
  88. package/esm2015/lib/enum/scene-event.enum.js +0 -12
  89. package/esm2015/lib/enum/shadow-map-type.enum.js +0 -8
  90. package/esm2015/lib/enum/texture-type.js +0 -9
  91. package/esm2015/lib/enum/tone-mapping-local.enum.js +0 -12
  92. package/esm2015/lib/enum/view-mode.enum.js +0 -7
  93. package/esm2015/lib/enum/xr-mode.enum.js +0 -6
  94. package/esm2015/lib/environments/environment.js +0 -8
  95. package/esm2015/lib/interfaces/aa-options.interface.js +0 -2
  96. package/esm2015/lib/interfaces/adjustable-element.interface.js +0 -2
  97. package/esm2015/lib/interfaces/ao-options.interface.js +0 -2
  98. package/esm2015/lib/interfaces/changes.interface.js +0 -2
  99. package/esm2015/lib/interfaces/configuration-data.interface.js +0 -2
  100. package/esm2015/lib/interfaces/light-preset.interface.js +0 -2
  101. package/esm2015/lib/interfaces/post-processing-setting.interface.js +0 -2
  102. package/esm2015/lib/interfaces/scene-option-button.interface.js +0 -6
  103. package/esm2015/lib/interfaces/screen-size-info.js +0 -2
  104. package/esm2015/lib/interfaces/setting.interface.js +0 -2
  105. package/esm2015/lib/interfaces/texture.interface.js +0 -2
  106. package/esm2015/lib/interfaces/vignette-options.interface.js +0 -2
  107. package/esm2015/lib/model/ar-position-indicator.js +0 -18
  108. package/esm2015/lib/model/camera-settings.js +0 -14
  109. package/esm2015/lib/model/configuration-result-object.js +0 -6
  110. package/esm2015/lib/model/configurator-error-message.js +0 -9
  111. package/esm2015/lib/model/configurator-settings.js +0 -25
  112. package/esm2015/lib/model/custom-button.js +0 -16
  113. package/esm2015/lib/model/factory.js +0 -28
  114. package/esm2015/lib/model/icon.js +0 -112
  115. package/esm2015/lib/model/intersected-objects.js +0 -7
  116. package/esm2015/lib/model/light-preset.js +0 -73
  117. package/esm2015/lib/model/light-properties.js +0 -45
  118. package/esm2015/lib/model/material.js +0 -11
  119. package/esm2015/lib/model/metadata.js +0 -2
  120. package/esm2015/lib/model/render-parameters.js +0 -16
  121. package/esm2015/lib/model/setting-options.js +0 -71
  122. package/esm2015/lib/model/settings.js +0 -16
  123. package/esm2015/lib/model/shadow-properties.js +0 -10
  124. package/esm2015/lib/model/skin.js +0 -3
  125. package/esm2015/lib/model/texture.js +0 -76
  126. package/esm2015/lib/model/variation-settings.js +0 -54
  127. package/esm2015/lib/model/variation.js +0 -3
  128. package/esm2015/lib/model/xr-reticle.js +0 -79
  129. package/esm2015/lib/modules/render/enum/scene-type.enum.js +0 -6
  130. package/esm2015/lib/modules/render/model/ar-parameters.js +0 -12
  131. package/esm2015/lib/modules/render/model/scene-setting.js +0 -6
  132. package/esm2015/lib/modules/render/model/scene-settings.js +0 -3
  133. package/esm2015/lib/pipes/append.pipe.js +0 -21
  134. package/esm2015/lib/pipes/google-translate.pipe.js +0 -21
  135. package/esm2015/lib/pipes/localize.pipe.js +0 -28
  136. package/esm2015/lib/pipes/pipes.module.js +0 -41
  137. package/esm2015/lib/pipes/prepend.pipe.js +0 -21
  138. package/esm2015/lib/pipes/strip-html.pipe.js +0 -17
  139. package/esm2015/lib/services/app-event.service.js +0 -36
  140. package/esm2015/lib/services/app-initializer.service.js +0 -27
  141. package/esm2015/lib/services/ar.service.js +0 -844
  142. package/esm2015/lib/services/build-furniture-base.service.js +0 -1181
  143. package/esm2015/lib/services/build-furniture-without-scene.service.js +0 -86
  144. package/esm2015/lib/services/build-furniture.service.js +0 -169
  145. package/esm2015/lib/services/bundle-initialzer.service.js +0 -113
  146. package/esm2015/lib/services/camera.service.js +0 -123
  147. package/esm2015/lib/services/configuration.service.js +0 -79
  148. package/esm2015/lib/services/configurator-connector.service.js +0 -830
  149. package/esm2015/lib/services/configurator.service.js +0 -285
  150. package/esm2015/lib/services/configuring.service.js +0 -119
  151. package/esm2015/lib/services/controls.js +0 -799
  152. package/esm2015/lib/services/debug.service.js +0 -43
  153. package/esm2015/lib/services/dictionary.service.js +0 -65
  154. package/esm2015/lib/services/dynamic-camera.service.js +0 -96
  155. package/esm2015/lib/services/floor-plane.service.js +0 -252
  156. package/esm2015/lib/services/font.service.js +0 -27
  157. package/esm2015/lib/services/google-translate.service.js +0 -79
  158. package/esm2015/lib/services/icon-cache.service.js +0 -44
  159. package/esm2015/lib/services/intersection.service.js +0 -47
  160. package/esm2015/lib/services/item.service.js +0 -75
  161. package/esm2015/lib/services/json-utils.service.js +0 -48
  162. package/esm2015/lib/services/light-creation.service.js +0 -35
  163. package/esm2015/lib/services/light-presets.service.js +0 -157
  164. package/esm2015/lib/services/lights.service.js +0 -146
  165. package/esm2015/lib/services/load-furniture-base.service.js +0 -164
  166. package/esm2015/lib/services/load-furniture-without-scene.service.js +0 -45
  167. package/esm2015/lib/services/load-furniture.service.js +0 -72
  168. package/esm2015/lib/services/loader.service.js +0 -32
  169. package/esm2015/lib/services/locator.service.js +0 -11
  170. package/esm2015/lib/services/message-board.service.js +0 -50
  171. package/esm2015/lib/services/post-processing.service.js +0 -378
  172. package/esm2015/lib/services/product-configurator.service.js +0 -16
  173. package/esm2015/lib/services/progress.service.js +0 -20
  174. package/esm2015/lib/services/scene-event.service.js +0 -246
  175. package/esm2015/lib/services/scene-options.service.js +0 -24
  176. package/esm2015/lib/services/scene.service.js +0 -313
  177. package/esm2015/lib/services/screen-size-analysis.service.js +0 -97
  178. package/esm2015/lib/services/settings.service.js +0 -142
  179. package/esm2015/lib/services/switch-build-furniture.service.js +0 -37
  180. package/esm2015/lib/services/switch-load-furniture.service.js +0 -35
  181. package/esm2015/lib/services/threedselector.service.js +0 -72
  182. package/esm2015/lib/services/utils.service.js +0 -207
  183. package/esm2015/lib/services/variation-cache.service.js +0 -143
  184. package/esm2015/lib/services/variation.service.js +0 -490
  185. package/esm2015/lib/services/view-mode.service.js +0 -37
  186. package/esm2015/lib/services/vr.service.js +0 -191
  187. package/esm2015/lib/services/xr.service.js +0 -294
  188. package/esm2015/lib/utils/asset.utils.js +0 -120
  189. package/esm2015/lib/utils/base-utils.js +0 -9
  190. package/esm2015/lib/utils/color.utils.js +0 -30
  191. package/esm2015/lib/utils/debug.utils.js +0 -9
  192. package/esm2015/lib/utils/device.utils.js +0 -25
  193. package/esm2015/lib/utils/file.utils.js +0 -167
  194. package/esm2015/lib/utils/image.utils.js +0 -61
  195. package/esm2015/lib/utils/json-parser.utils.js +0 -180
  196. package/esm2015/lib/utils/material.utils.js +0 -433
  197. package/esm2015/lib/utils/object.utils.js +0 -360
  198. package/esm2015/lib/utils/relative-position.utils.js +0 -75
  199. package/esm2015/lib/utils/rotation-helper.utils.js +0 -15
  200. package/esm2015/lib/utils/scene-3d.utils.js +0 -213
  201. package/esm2015/lib/utils/scene-utils.js +0 -191
  202. package/esm2015/lib/utils/text-utils.js +0 -68
  203. package/esm2015/lib/utils/threed.utils.js +0 -281
  204. package/esm2015/lib/utils/variation-utils.js +0 -459
  205. package/esm2015/public-api.js +0 -65
  206. package/fesm2015/colijnit-configurator.js.map +0 -1
  207. package/lib/builder.d.ts +0 -83
  208. package/lib/components/answer-card/answer-card.component.d.ts +0 -58
  209. package/lib/components/answer-card/answer-card.module.d.ts +0 -11
  210. package/lib/components/answer-info-dialog/answer-info-dialog.component.d.ts +0 -38
  211. package/lib/components/answer-info-dialog/answer-info-dialog.module.d.ts +0 -10
  212. package/lib/components/answers-slideout/answers-slideout.component.d.ts +0 -86
  213. package/lib/components/answers-slideout/answers-slideout.module.d.ts +0 -16
  214. package/lib/components/color-filter/color-filter.component.d.ts +0 -20
  215. package/lib/components/color-filter/color-filter.module.d.ts +0 -8
  216. package/lib/components/configurator/configurator.component.d.ts +0 -37
  217. package/lib/components/configurator/configurator.module.d.ts +0 -12
  218. package/lib/components/configurator-dialog/configurator-camera-settings.component.d.ts +0 -30
  219. package/lib/components/configurator-dialog/configurator-dialog.module.d.ts +0 -13
  220. package/lib/components/configurator-dialog/configurator-error-dialog.component.d.ts +0 -16
  221. package/lib/components/configurator-dialog/configurator-export-dialog.component.d.ts +0 -26
  222. package/lib/components/configurator-loader/configurator-loader.component.d.ts +0 -7
  223. package/lib/components/configurator-loader/configurator-loader.module.d.ts +0 -9
  224. package/lib/components/configurator-scene/configurator-scene.component.d.ts +0 -24
  225. package/lib/components/configurator-scene/configurator-scene.module.d.ts +0 -7
  226. package/lib/components/configurator-scene-loader/configurator-scene-loader.component.d.ts +0 -7
  227. package/lib/components/configurator-scene-loader/configurator-scene-loader.module.d.ts +0 -8
  228. package/lib/components/element-buttons/element-buttons.component.d.ts +0 -32
  229. package/lib/components/element-buttons/element-buttons.module.d.ts +0 -9
  230. package/lib/components/element-toolbar/element-toolbar.component.d.ts +0 -27
  231. package/lib/components/element-toolbar/element-toolbar.module.d.ts +0 -10
  232. package/lib/components/image-zoom/image-zoom.component.d.ts +0 -15
  233. package/lib/components/image-zoom/image-zoom.module.d.ts +0 -9
  234. package/lib/components/lite-selector/lite-selector.component.d.ts +0 -40
  235. package/lib/components/lite-selector/lite-selector.module.d.ts +0 -10
  236. package/lib/components/product-configurator/product-configurator.component.d.ts +0 -50
  237. package/lib/components/product-configurator/product-configurator.module.d.ts +0 -15
  238. package/lib/components/product-configurator-selector/product-configurator-selector.component.d.ts +0 -35
  239. package/lib/components/product-configurator-selector/product-configurator-selector.module.d.ts +0 -11
  240. package/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.d.ts +0 -31
  241. package/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.d.ts +0 -13
  242. package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.d.ts +0 -20
  243. package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.d.ts +0 -10
  244. package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.d.ts +0 -20
  245. package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.d.ts +0 -10
  246. package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.d.ts +0 -21
  247. package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.d.ts +0 -10
  248. package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.d.ts +0 -21
  249. package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.d.ts +0 -10
  250. package/lib/components/progress-bar/progress-bar.component.d.ts +0 -10
  251. package/lib/components/progress-bar/progress-bar.module.d.ts +0 -8
  252. package/lib/components/scene-options/scene-options.component.d.ts +0 -24
  253. package/lib/components/scene-options/scene-options.module.d.ts +0 -11
  254. package/lib/components/selections-summary/selections-summary.component.d.ts +0 -38
  255. package/lib/components/selections-summary/selections-summary.module.d.ts +0 -12
  256. package/lib/components/selections-summary-line/selections-summary-line.component.d.ts +0 -27
  257. package/lib/components/selections-summary-line/selections-summary-line.module.d.ts +0 -10
  258. package/lib/components/slideout/slideout.component.d.ts +0 -22
  259. package/lib/components/slideout/slideout.module.d.ts +0 -7
  260. package/lib/components/summary-line/summary-line.component.d.ts +0 -50
  261. package/lib/components/summary-line/summary-line.module.d.ts +0 -11
  262. package/lib/components/tag-filter/tag-filter.component.d.ts +0 -9
  263. package/lib/components/tag-filter/tag-filter.module.d.ts +0 -7
  264. package/lib/components/threedselector/threedselector.component.d.ts +0 -38
  265. package/lib/components/threedselector/threedselector.module.d.ts +0 -10
  266. package/lib/core/helper/variation-helper.d.ts +0 -25
  267. package/lib/core/shader/floor-fade.shader.d.ts +0 -5
  268. package/lib/core/textures/depth-data-texture.d.ts +0 -5
  269. package/lib/directives/directives.module.d.ts +0 -8
  270. package/lib/directives/visibility-observer-master.directive.d.ts +0 -12
  271. package/lib/directives/visibility-observer.directive.d.ts +0 -16
  272. package/lib/enum/ar-feature.enum.d.ts +0 -12
  273. package/lib/enum/configuration-key.enum.d.ts +0 -39
  274. package/lib/enum/configuration-template.enum.d.ts +0 -4
  275. package/lib/enum/device-size-type.d.ts +0 -5
  276. package/lib/enum/device-tier.enum.d.ts +0 -5
  277. package/lib/enum/icon.enum.d.ts +0 -111
  278. package/lib/enum/item-type.enum.d.ts +0 -21
  279. package/lib/enum/light.enum.d.ts +0 -7
  280. package/lib/enum/navigator-type.enum.d.ts +0 -4
  281. package/lib/enum/output-encoding.enum.d.ts +0 -7
  282. package/lib/enum/result-type.enum.d.ts +0 -19
  283. package/lib/enum/scene-event.enum.d.ts +0 -10
  284. package/lib/enum/shadow-map-type.enum.d.ts +0 -6
  285. package/lib/enum/texture-type.d.ts +0 -7
  286. package/lib/enum/tone-mapping-local.enum.d.ts +0 -10
  287. package/lib/enum/view-mode.enum.d.ts +0 -5
  288. package/lib/enum/xr-mode.enum.d.ts +0 -4
  289. package/lib/environments/environment.d.ts +0 -4
  290. package/lib/interfaces/aa-options.interface.d.ts +0 -4
  291. package/lib/interfaces/adjustable-element.interface.d.ts +0 -5
  292. package/lib/interfaces/ao-options.interface.d.ts +0 -18
  293. package/lib/interfaces/changes.interface.d.ts +0 -9
  294. package/lib/interfaces/configuration-data.interface.d.ts +0 -40
  295. package/lib/interfaces/light-preset.interface.d.ts +0 -22
  296. package/lib/interfaces/post-processing-setting.interface.d.ts +0 -11
  297. package/lib/interfaces/scene-option-button.interface.d.ts +0 -19
  298. package/lib/interfaces/screen-size-info.d.ts +0 -10
  299. package/lib/interfaces/setting.interface.d.ts +0 -8
  300. package/lib/interfaces/texture.interface.d.ts +0 -44
  301. package/lib/interfaces/vignette-options.interface.d.ts +0 -4
  302. package/lib/model/ar-position-indicator.d.ts +0 -4
  303. package/lib/model/camera-settings.d.ts +0 -12
  304. package/lib/model/configuration-result-object.d.ts +0 -30
  305. package/lib/model/configurator-error-message.d.ts +0 -8
  306. package/lib/model/configurator-settings.d.ts +0 -62
  307. package/lib/model/custom-button.d.ts +0 -10
  308. package/lib/model/factory.d.ts +0 -5
  309. package/lib/model/icon.d.ts +0 -4
  310. package/lib/model/intersected-objects.d.ts +0 -6
  311. package/lib/model/light-preset.d.ts +0 -33
  312. package/lib/model/light-properties.d.ts +0 -25
  313. package/lib/model/material.d.ts +0 -41
  314. package/lib/model/metadata.d.ts +0 -78
  315. package/lib/model/render-parameters.d.ts +0 -12
  316. package/lib/model/setting-options.d.ts +0 -67
  317. package/lib/model/settings.d.ts +0 -10
  318. package/lib/model/shadow-properties.d.ts +0 -7
  319. package/lib/model/skin.d.ts +0 -15
  320. package/lib/model/texture.d.ts +0 -52
  321. package/lib/model/variation-settings.d.ts +0 -55
  322. package/lib/model/variation.d.ts +0 -11
  323. package/lib/model/xr-reticle.d.ts +0 -17
  324. package/lib/modules/render/enum/scene-type.enum.d.ts +0 -4
  325. package/lib/modules/render/model/ar-parameters.d.ts +0 -9
  326. package/lib/modules/render/model/scene-setting.d.ts +0 -13
  327. package/lib/modules/render/model/scene-settings.d.ts +0 -4
  328. package/lib/pipes/append.pipe.d.ts +0 -7
  329. package/lib/pipes/google-translate.pipe.d.ts +0 -11
  330. package/lib/pipes/localize.pipe.d.ts +0 -10
  331. package/lib/pipes/pipes.module.d.ts +0 -11
  332. package/lib/pipes/prepend.pipe.d.ts +0 -7
  333. package/lib/pipes/strip-html.pipe.d.ts +0 -7
  334. package/lib/services/app-event.service.d.ts +0 -32
  335. package/lib/services/app-initializer.service.d.ts +0 -14
  336. package/lib/services/ar.service.d.ts +0 -120
  337. package/lib/services/build-furniture-base.service.d.ts +0 -117
  338. package/lib/services/build-furniture-without-scene.service.d.ts +0 -14
  339. package/lib/services/build-furniture.service.d.ts +0 -14
  340. package/lib/services/bundle-initialzer.service.d.ts +0 -45
  341. package/lib/services/camera.service.d.ts +0 -44
  342. package/lib/services/configuration.service.d.ts +0 -18
  343. package/lib/services/configurator-connector.service.d.ts +0 -140
  344. package/lib/services/configurator.service.d.ts +0 -62
  345. package/lib/services/configuring.service.d.ts +0 -46
  346. package/lib/services/controls.d.ts +0 -11
  347. package/lib/services/debug.service.d.ts +0 -16
  348. package/lib/services/dictionary.service.d.ts +0 -15
  349. package/lib/services/dynamic-camera.service.d.ts +0 -21
  350. package/lib/services/floor-plane.service.d.ts +0 -47
  351. package/lib/services/font.service.d.ts +0 -10
  352. package/lib/services/google-translate.service.d.ts +0 -26
  353. package/lib/services/icon-cache.service.d.ts +0 -21
  354. package/lib/services/intersection.service.d.ts +0 -11
  355. package/lib/services/item.service.d.ts +0 -18
  356. package/lib/services/json-utils.service.d.ts +0 -7
  357. package/lib/services/light-creation.service.d.ts +0 -9
  358. package/lib/services/light-presets.service.d.ts +0 -34
  359. package/lib/services/lights.service.d.ts +0 -34
  360. package/lib/services/load-furniture-base.service.d.ts +0 -37
  361. package/lib/services/load-furniture-without-scene.service.d.ts +0 -9
  362. package/lib/services/load-furniture.service.d.ts +0 -9
  363. package/lib/services/loader.service.d.ts +0 -11
  364. package/lib/services/locator.service.d.ts +0 -7
  365. package/lib/services/message-board.service.d.ts +0 -18
  366. package/lib/services/post-processing.service.d.ts +0 -74
  367. package/lib/services/product-configurator.service.d.ts +0 -11
  368. package/lib/services/progress.service.d.ts +0 -9
  369. package/lib/services/scene-event.service.d.ts +0 -72
  370. package/lib/services/scene-options.service.d.ts +0 -11
  371. package/lib/services/scene.service.d.ts +0 -71
  372. package/lib/services/screen-size-analysis.service.d.ts +0 -32
  373. package/lib/services/settings.service.d.ts +0 -24
  374. package/lib/services/switch-build-furniture.service.d.ts +0 -21
  375. package/lib/services/switch-load-furniture.service.d.ts +0 -21
  376. package/lib/services/threedselector.service.d.ts +0 -17
  377. package/lib/services/utils.service.d.ts +0 -24
  378. package/lib/services/variation-cache.service.d.ts +0 -23
  379. package/lib/services/variation.service.d.ts +0 -26
  380. package/lib/services/view-mode.service.d.ts +0 -17
  381. package/lib/services/vr.service.d.ts +0 -42
  382. package/lib/services/xr.service.d.ts +0 -56
  383. package/lib/utils/asset.utils.d.ts +0 -19
  384. package/lib/utils/base-utils.d.ts +0 -4
  385. package/lib/utils/color.utils.d.ts +0 -8
  386. package/lib/utils/debug.utils.d.ts +0 -3
  387. package/lib/utils/device.utils.d.ts +0 -7
  388. package/lib/utils/file.utils.d.ts +0 -30
  389. package/lib/utils/image.utils.d.ts +0 -9
  390. package/lib/utils/json-parser.utils.d.ts +0 -9
  391. package/lib/utils/material.utils.d.ts +0 -34
  392. package/lib/utils/object.utils.d.ts +0 -32
  393. package/lib/utils/relative-position.utils.d.ts +0 -12
  394. package/lib/utils/rotation-helper.utils.d.ts +0 -6
  395. package/lib/utils/scene-3d.utils.d.ts +0 -8
  396. package/lib/utils/scene-utils.d.ts +0 -7
  397. package/lib/utils/text-utils.d.ts +0 -4
  398. package/lib/utils/threed.utils.d.ts +0 -20
  399. package/lib/utils/variation-utils.d.ts +0 -18
  400. package/public-api.d.ts +0 -60
  401. /package/lib/style/{template_variables.scss → _variables.scss} +0 -0
@@ -1,1181 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { DecoNode } from '@colijnit/configuratorapi/build/model/deco-node';
3
- import { DecoNodeType } from '@colijnit/configuratorapi/build/enum/deco-node-type.enum';
4
- import { DecoNodeKind } from '@colijnit/configuratorapi/build/enum/deco-node-kind.enum';
5
- import { Injectable } from '@angular/core';
6
- import { Euler, Object3D, Vector3 } from 'three';
7
- import { NodeType } from '@colijnit/configuratorapi/build/enum/node-type.enum';
8
- import { HdecoPositioning } from '@colijnit/configuratorapi/build/enum/hdeco-positioning.enum';
9
- import { Subject } from 'rxjs';
10
- import { ObjectUtils } from '../utils/object.utils';
11
- import { MaterialUtils } from '../utils/material.utils';
12
- import { ResultType } from '../enum/result-type.enum';
13
- import { ConfiguratorErrorMessage } from '../model/configurator-error-message';
14
- import { Scene3DUtil } from '../utils/scene-3d.utils';
15
- import { DebugUtils } from '../utils/debug.utils';
16
- import * as i0 from "@angular/core";
17
- import * as i1 from "./configurator-connector.service";
18
- import * as i2 from "./dictionary.service";
19
- import * as i3 from "./app-event.service";
20
- import * as i4 from "./settings.service";
21
- import * as i5 from "./variation.service";
22
- import * as i6 from "./variation-cache.service";
23
- import * as i7 from "./utils.service";
24
- import * as i8 from "./item.service";
25
- export class BuildFurnitureBaseService {
26
- constructor(configuratorConnectorService, dictionaryService, appEventService, settingsService, variationService, variationCacheService, utilsService, itemService) {
27
- this.configuratorConnectorService = configuratorConnectorService;
28
- this.dictionaryService = dictionaryService;
29
- this.appEventService = appEventService;
30
- this.settingsService = settingsService;
31
- this.variationService = variationService;
32
- this.variationCacheService = variationCacheService;
33
- this.utilsService = utilsService;
34
- this.itemService = itemService;
35
- this.defaultPosition = new Vector3(4, 0, 1);
36
- this.defaultRotation = new Euler(0, Math.PI, 0);
37
- this.isMouseOverObject = false;
38
- this.answerSelected = new Subject();
39
- this.arPlacementUpdate = new Subject();
40
- this.showElementToolbar = false;
41
- this._useNodeIdToLink = true;
42
- this._placedAddables = [];
43
- this._adjustables = [];
44
- this._addables = [];
45
- this._genericSelection = false;
46
- this._answerSelected = [];
47
- this._selectionsSelected = [];
48
- this.subs = [];
49
- this.placedAdjustables = [];
50
- }
51
- get useNodeIdToLink() {
52
- return this._useNodeIdToLink;
53
- }
54
- get currentCustomFloorGroup() {
55
- return this._currentCustomFloorGroup;
56
- }
57
- set currentCustomFloorGroup(item) {
58
- this._currentCustomFloorGroup = item;
59
- }
60
- get selections() {
61
- return this.configuratorConnectorService.selections;
62
- }
63
- set scene(scene) {
64
- this._scene = scene;
65
- }
66
- get scene() {
67
- return this._scene;
68
- }
69
- ngOnDestroy() {
70
- this.subs.forEach(s => s.unsubscribe());
71
- this.cleanup();
72
- }
73
- emptyAnswerSelected() {
74
- this._answerSelected.length = 0;
75
- }
76
- emptySelectionsSelected() {
77
- this._selectionsSelected.length = 0;
78
- }
79
- getOptionsFromSelection(baseSelection) {
80
- const selections = [];
81
- let nodeLevel = -1;
82
- const len = this.selections.length;
83
- for (let i = 0; i < len; i++) {
84
- const selection = this.selections[i];
85
- const level = selection.presentationLevel;
86
- if (nodeLevel !== -1) {
87
- if (nodeLevel < level && this.canConnectSelections(baseSelection, selection) && this.selectionPublished(selection)) {
88
- selections.push(selection);
89
- }
90
- if (nodeLevel >= level) {
91
- break;
92
- }
93
- }
94
- if (selection.id === baseSelection.id && selection.node === baseSelection.node) {
95
- nodeLevel = level;
96
- }
97
- }
98
- return selections;
99
- }
100
- cancelConfiguringCurrentInstance() {
101
- if (this._currentCustomFloorGroup) {
102
- // TODO check what we should do with this this._currentCustomFloorGroup.configuring = false;
103
- }
104
- }
105
- cancelAnswer(data, rebuild = true, getAnswers = false) {
106
- return __awaiter(this, void 0, void 0, function* () {
107
- yield this.configuratorConnectorService.cancelAnswer();
108
- if (rebuild) {
109
- this.startToBuildFromConfigurator(data);
110
- }
111
- else if (getAnswers) { // if not rebuild then check if we need to get answers
112
- yield this.configuratorConnectorService.getQuestionAndAnswersAsync(); // see if there is user input needed
113
- }
114
- });
115
- }
116
- selectSelection(selection, data, forceBackToNode, after, connector) {
117
- return __awaiter(this, void 0, void 0, function* () {
118
- yield this.configuratorConnectorService.selectSelection(selection, forceBackToNode, after, connector);
119
- this._genericSelection = selection.generic;
120
- yield this.startToBuildFromConfigurator(data);
121
- });
122
- }
123
- deleteSelection(selection, data) {
124
- return __awaiter(this, void 0, void 0, function* () {
125
- yield this.configuratorConnectorService.deleteSelection(selection);
126
- yield this.startToBuildFromConfigurator(data);
127
- });
128
- }
129
- replaceSelection(selection, data) {
130
- return __awaiter(this, void 0, void 0, function* () {
131
- yield this.configuratorConnectorService.replaceSelection(selection);
132
- yield this.startToBuildFromConfigurator(data);
133
- });
134
- }
135
- selectAnswer(answer, input, data) {
136
- return __awaiter(this, void 0, void 0, function* () {
137
- this.preloadMaterial(answer);
138
- yield this.configuratorConnectorService.selectAnswer(answer, input);
139
- this.handleAnswerSelected(answer);
140
- const result = yield this.startToBuildFromConfigurator(data);
141
- this.answerSelected.next(result);
142
- });
143
- }
144
- selectSelectionAsAnswer(chosenOption, data) {
145
- return __awaiter(this, void 0, void 0, function* () {
146
- this.preloadMaterialBySelection(chosenOption);
147
- this.handleSelectionSelected(chosenOption);
148
- const result = yield this.startToBuildFromConfigurator(data);
149
- this.answerSelected.next(result);
150
- });
151
- }
152
- linkSelectionsAndDecos() {
153
- const len = this.selections.length;
154
- for (let i = 0; i < len; i++) {
155
- // const id: string = this.selections[i].artNodeIdDeco;
156
- let deco = this.configuratorConnectorService.decoNodes.find(d => d.nodeId === this.selections[i].node);
157
- if (!deco) {
158
- deco = new DecoNode();
159
- }
160
- if (deco.type !== DecoNodeType.Variation) {
161
- const variation = this.getVariations().find(v => v.parentId === this.selections[i].artNodeIdDeco);
162
- if (variation) {
163
- deco.variation = variation;
164
- }
165
- }
166
- this.selections[i].decoNode = deco;
167
- }
168
- this.appEventService.selectionsAndDecosLinked.next();
169
- }
170
- prepareTheSelections(instanceId) {
171
- const selections = this.selections.slice();
172
- const selectionOfArticle = selections.find(s => s.nodeType === NodeType.Article);
173
- const adjustableSelections = selections.filter(s => s.addAdjust === '2');
174
- const isArticleWithMaterial = adjustableSelections.length === 0 &&
175
- selectionOfArticle.gameObject &&
176
- selectionOfArticle.gameObject.length > 0;
177
- // get generic variations
178
- const globalVariations = selections
179
- .filter(s => (s.generic || adjustableSelections.length === 1) && s.decoNode.variation && (!s.elementType || s.elementType === 'variation'))
180
- .map((value, index, array) => {
181
- // find selection of variation
182
- const sel = selections.find(s => s.artNodeIdDeco === value.decoNode.variation.parentId);
183
- if (sel) {
184
- value.decoNode.variation.supplierArticleNr = sel.supplierArticleNr;
185
- }
186
- value.decoNode.variation.materialId = this.getMaterialIdFromParent(value.node);
187
- return value.decoNode.variation;
188
- });
189
- let globalVariationsRewrite = true;
190
- const len = selections.length;
191
- let lastAdded;
192
- let lastAdjustable;
193
- let newPart = false;
194
- let previousPresLevel = -1;
195
- let positioning;
196
- let optionText;
197
- for (let i = 0; i < len; i++) {
198
- const selection = selections[i];
199
- if (selection.presentationLevel === 1) {
200
- positioning = selection.hdecoPositioning;
201
- optionText = selection.question;
202
- }
203
- if (selection.presentationLevel > previousPresLevel) {
204
- selection.hdecoPositioning = selection.hdecoPositioning || positioning;
205
- }
206
- if (selection.decoNode) {
207
- if (selection.decoNode.type === DecoNodeType.Variation) {
208
- const decoNode = selection.decoNode;
209
- decoNode.optionText = optionText;
210
- // find selection of variation and set materialId in case of multimaterial
211
- if (!decoNode.materialId) {
212
- decoNode.materialId = this.getMaterialIdFromParent(decoNode.nodeId);
213
- }
214
- if (lastAdded) {
215
- if (newPart) {
216
- if (decoNode.materialId) {
217
- lastAdded.variations.push(decoNode);
218
- }
219
- else {
220
- lastAdded.variations = [decoNode];
221
- }
222
- }
223
- else {
224
- lastAdded.variations.push(decoNode);
225
- }
226
- newPart = false;
227
- }
228
- else {
229
- globalVariations.push(decoNode);
230
- }
231
- // else {
232
- // if (globalVariationsRewrite) {
233
- // globalVariations.length = 0;
234
- // globalVariationsRewrite = false;
235
- // }
236
- // globalVariations.push(decoNode);
237
- // }
238
- // const variation: FurniturePartVariation = new FurniturePartVariation();
239
- // variation.BrandId = selection.decoNode.brandId;
240
- // variation.Description = selection.decoNode.gameObjectName;
241
- // variation.MaterialId = (selection.decoNode as any).materialId;
242
- // variation.SupplierArticleNr = (selection.decoNode as any).supplierArticleNr;
243
- // usedVariations.push(variation);
244
- }
245
- else if ((selection.decoNode.type === DecoNodeType.Part &&
246
- typeof selection.decoNode.gameObjectName === 'string' &&
247
- selection.decoNode.gameObjectName.length) || (isArticleWithMaterial)) {
248
- if (selection.decoNode.kind === DecoNodeKind.Adjustable || (isArticleWithMaterial)) {
249
- selection.variations = globalVariations.slice();
250
- this._adjustables.push(selection);
251
- if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
252
- newPart = true;
253
- }
254
- lastAdded = selection;
255
- lastAdjustable = selection;
256
- }
257
- else if (selection.decoNode.kind === DecoNodeKind.Addable) {
258
- selection.variations = lastAdjustable ? lastAdjustable.variations : globalVariations.slice();
259
- if (lastAdjustable) {
260
- lastAdjustable.addables.push(selection);
261
- }
262
- this._addables.push(selection);
263
- if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
264
- newPart = true;
265
- }
266
- lastAdded = selection;
267
- }
268
- }
269
- }
270
- previousPresLevel = selection.presentationLevel;
271
- }
272
- // this._upsertFurniture(this.activeInstance,
273
- // {Variations: usedVariations});
274
- }
275
- preloadMaterials(schema) {
276
- this.variationCacheService.preloadVariations(schema, this.configuratorConnectorService.decoNodes
277
- .filter(d => (d.gameObjectName || d.materialUrl) && d.type === DecoNodeType.Variation)
278
- .map(d => d), this.articleAssetPath);
279
- }
280
- prepareInstanceForBuild(shouldCopyInstance, loadFromProject, looseOriginalConfiguration, result) {
281
- return __awaiter(this, void 0, void 0, function* () {
282
- if (shouldCopyInstance && !loadFromProject) {
283
- const originalInstanceId = result.instanceId;
284
- result.originalItemId = originalInstanceId;
285
- if (looseOriginalConfiguration) {
286
- result.instanceId = yield this.configuratorConnectorService.copyInstanceAndLoseOriginalConfiguration(originalInstanceId, result)
287
- .catch((e) => {
288
- return originalInstanceId;
289
- });
290
- }
291
- else {
292
- result.instanceId = yield this.configuratorConnectorService.copyInstanceAndSaveOriginalConfiguration(originalInstanceId, result)
293
- .catch((e) => {
294
- return originalInstanceId;
295
- });
296
- }
297
- }
298
- if (result.resultType !== ResultType.ArticleNotFound && !loadFromProject) {
299
- yield this.setInstanceToConfigure(result).catch((e) => {
300
- Promise.reject(e);
301
- return e;
302
- });
303
- }
304
- return result;
305
- });
306
- }
307
- getSelectionsAndDecos() {
308
- return __awaiter(this, void 0, void 0, function* () {
309
- try {
310
- const selectionsAndDecoPromise = [];
311
- selectionsAndDecoPromise.push(this.configuratorConnectorService.getSelectionsAsync(), this.configuratorConnectorService.getDecosAsync());
312
- yield Promise.all(selectionsAndDecoPromise);
313
- }
314
- catch (e) {
315
- DebugUtils.log(`Error getting selections and decos: ${e}`);
316
- }
317
- });
318
- }
319
- handlePrepareSelectionsDecos(result) {
320
- return __awaiter(this, void 0, void 0, function* () {
321
- if (this.configuratorConnectorService.selections.length < 2) { // no selections, only selection of type 'ART'
322
- try {
323
- if (result.resultType !== ResultType.ArticleNotFound && !result.originalItemId) { // article found, so init that first
324
- result.originalItemId = result.instanceId;
325
- result.instanceId = null;
326
- yield this.setInstanceToConfigure(result);
327
- result.resultType = ResultType.NoSelections;
328
- return this.startToBuild(result); // 'restart' the build
329
- }
330
- this.getSelectionsAndDecosFromMetadata(result);
331
- }
332
- catch (e) {
333
- DebugUtils.log(`Error preparing selections and decos: ${e}`);
334
- return Promise.reject(e);
335
- }
336
- }
337
- this.configuratorConnectorService.selections.forEach(s => {
338
- s.schema = result.schema;
339
- s.instanceId = result.instanceId;
340
- }); // add schema for material creation
341
- // TODO add this function, it's used for GTM this.handleSelectionsReceived(result.metaData);
342
- this.linkSelectionsAndDecos();
343
- this.prepareTheSelections(result.instanceId);
344
- });
345
- }
346
- // TODO check if we need this function for Habufa
347
- // protected handleIntegrationConnections(id: string, object: Item): void {
348
- // const parts: FurniturePartIntegration[] = [];
349
- // const childParts: Object3D[] = object.configurable ? object.children : [object];
350
- // const len: number = childParts.length;
351
- // for (let i = 0; i < len; i++) {
352
- // const child: any = <CustomObject3D>childParts[i];
353
- // const connection: FurniturePartIntegration = new FurniturePartIntegration();
354
- // const variations: FurniturePartVariation[] = [];
355
- // if (child.userData && child.userData.selection && child.userData.selection.decoNode) {
356
- // connection.Id = childParts.findIndex(c => c === child).toString();
357
- // connection.SupplierArticleNr = child.userData.selection.supplierArticleNr;
358
- // connection.BrandIdentifier = child.userData.selection.decoNode.brandId;
359
- // connection.BrandDescription = child.userData.selection.decoNode.gameObjectName;
360
- // connection.Position = child.position;
361
- // connection.Rotation = child.rotation;
362
- // if (child.userData.selection.variations) {
363
- // if (child.userData.selection.variations.length === 1) {
364
- // const variation: any = child.userData.selection.variations[0];
365
- // connection.Variation = variation.brandId;
366
- // connection.VariationDescription = variation.gameObjectName;
367
- // } else {
368
- // for (let j = 0; j < child.userData.selection.variations.length; j++) {
369
- // const variation: any = child.userData.selection.variations[j];
370
- // const variationPart: FurniturePartVariation = new FurniturePartVariation();
371
- // variationPart.Variation = variation.brandId;
372
- // variationPart.VariationDescription = variation.gameObjectName;
373
- // variationPart.MaterialId = variation.materialId;
374
- // variationPart.SupplierArticleNr = variation.supplierArticleNr;
375
- // variationPart.Option = variation.optionText;
376
- // variations.push(variationPart);
377
- // }
378
- // connection.Variations = variations;
379
- // }
380
- // }
381
- // } else { // a-artikel
382
- // connection.Id = childParts.findIndex(c => c === child).toString();
383
- // connection.BrandIdentifier = child.metadata.itemIdentifier;
384
- // connection.BrandDescription = child.metadata.itemName;
385
- // connection.Position = child.position;
386
- // connection.Rotation = child.rotation;
387
- // }
388
- // const connectors: FurnitureConnectedPartIntegration[] = [];
389
- // const clen: number = child.children.length;
390
- // for (let j = 0; j < clen; j++) {
391
- // const connector: any = child.children[j];
392
- // if ((connector instanceof CustomObject3D || connector instanceof CustomMesh) && (connector as any).connectedTo) {
393
- // const conn: FurnitureConnectedPartIntegration = new FurnitureConnectedPartIntegration();
394
- // conn.ConnectionLabel = connector.name;
395
- // const foreignPartIdx: number =
396
- // this._currentCustomFloorGroup.children.findIndex(c => c.name === (connector as any).connectedTo);
397
- // conn.ForeignConnectionLabel = this._currentCustomFloorGroup.children[foreignPartIdx].userData.selection.decoNode.gameObjectName;
398
- // conn.ForeignPartId = foreignPartIdx.toString();
399
- // conn.Position = connector.position;
400
- // conn.Rotation = connector.rotation;
401
- // connectors.push(conn);
402
- // }
403
- // }
404
- // connection.ConnectedParts = connectors;
405
- // parts.push(connection);
406
- // }
407
- // this.upsertFurniture(id, {Parts: parts}, object);
408
- // }
409
- //
410
- // protected upsertFurniture(id: string, object: any, item: Item): void {
411
- // if (this._integrationEnabled && !item.metadata.obsolete) {
412
- // const idx: number = this._furnitureConfigurations.findIndex(f => f.Id === id);
413
- // let furniture: FurnitureIntegration;
414
- // if (idx < 0) {
415
- // // empty entry for mrp code, re-use that one
416
- // if (this._furnitureConfigurations.length === 1 && !this._furnitureConfigurations[0].Id) {
417
- // furniture = this._furnitureConfigurations[0];
418
- // } else {
419
- // furniture = new FurnitureIntegration();
420
- // this._furnitureConfigurations.push(furniture);
421
- // }
422
- // furniture.Id = id;
423
- // } else {
424
- // furniture = this._furnitureConfigurations[idx];
425
- // }
426
- // furniture.MrpCode = this.permanentStoreService.code;
427
- // for (const key in object) {
428
- // if (furniture.hasOwnProperty(key) && object.hasOwnProperty(key)) {
429
- // furniture[key] = object[key];
430
- // }
431
- // }
432
- // }
433
- // }
434
- // protected generateLayingPattern(floor: FloorPlaneItem, floorPattern: FloorPattern): void {
435
- // const floorPatternInfo: FloorPatternInfo = this.generateFloorPatternInfo(floor, floorPattern);
436
- // floor.restoreFloorObject();
437
- // const meshLeft =
438
- // this.full3DObjectToUse.children.find(m => m.name === floorPatternInfo.meshIdLeft) as Mesh;
439
- // this.normalizeMesh(meshLeft);
440
- //
441
- // let meshRight: Mesh = null;
442
- // if (floorPatternInfo.meshIdRight !== null) {
443
- // meshRight = this.full3DObjectToUse.children.find(m => m.name === floorPatternInfo.meshIdRight) as Mesh;
444
- // this.normalizeMesh(meshRight);
445
- // }
446
- //
447
- // const floorSize: Vector3 = floor.size;
448
- // const plankSize: Vector3 = new Vector3();
449
- //
450
- // meshLeft.geometry.boundingBox.getSize(plankSize);
451
- //
452
- // const items: FloorPatternTransform[] = this.floorPatternService.generatePattern(
453
- // floorPatternInfo.floorPattern,
454
- // plankSize,
455
- // floorSize,
456
- // floorPatternInfo.floorPatternDirection,
457
- // floorPatternInfo.heartLine
458
- // );
459
- //
460
- // // Debugging option
461
- // // this._floorTileIntersectionService.toggleDebug();
462
- // const floorCountResult: FloorCountResult = this.floorTileIntersectionService.countTiles(
463
- // floor.floorMesh,
464
- // items,
465
- // meshLeft.geometry,
466
- // (meshRight) ? meshRight.geometry : null,
467
- // true
468
- // );
469
- //
470
- // floor.metadata.floorCountResult = floorCountResult;
471
- //
472
- // const leftItems: FloorPatternTransform[] = new Array<FloorPatternTransform>();
473
- // const rightItems: FloorPatternTransform[] = new Array<FloorPatternTransform>();
474
- //
475
- // for (const item of floorCountResult.filtered) {
476
- // if (item.isLeft) {
477
- // leftItems.push(item);
478
- // } else {
479
- // rightItems.push(item);
480
- // }
481
- // }
482
- //
483
- // const selection: Selection[] = this.selections;
484
- // let variationGameObject: string;
485
- // for (const selectionKey of selection) {
486
- // if (selectionKey.elementType === 'variation') {
487
- // variationGameObject = selectionKey.gameObject;
488
- // break;
489
- // }
490
- // }
491
- //
492
- // let floorVariationMaterial: any;
493
- // if (variationGameObject !== null) {
494
- // this.variationService.loadVariationForMaterial(this.articleAssetPath, variationGameObject, floor.metadata.schema).then(result => {
495
- // floorVariationMaterial = result;
496
- // const texture: Texture = floorVariationMaterial.map;
497
- // if (floorPatternInfo.floorPatternDirection === FloorPatternDirection.LYING) {
498
- // texture.rotation = Math.PI / 2;
499
- // } else {
500
- // texture.rotation = 0;
501
- // }
502
- // const meshLeftMaterial: Material | Material[] = meshLeft.material;
503
- // const plankMaterial = new MeshStandardMaterial({
504
- // color: 0xFF0000,
505
- // transparent: true,
506
- // opacity: 0.8
507
- // });
508
- //
509
- // const planksLeft =
510
- // this.instancedMeshFromFloorPatternTransform(meshLeft.geometry, leftItems, plankMaterial);
511
- // let planksRight: InstancedMesh;
512
- // if (meshRight) {
513
- // const meshRightMaterial: Material | Material[] = meshRight.material;
514
- // planksRight = this.instancedMeshFromFloorPatternTransform(meshRight.geometry, rightItems, plankMaterial);
515
- // }
516
- // const customFloorWrapper = new Object3D();
517
- // customFloorWrapper.add(planksLeft);
518
- // if (planksRight) {
519
- // customFloorWrapper.add(planksRight);
520
- // }
521
- // floor.floorObject = customFloorWrapper;
522
- // this.floorService.configurableFloor = customFloorWrapper;
523
- //
524
- // // Now we update the default floorplane with the mesh
525
- // floor.floorMaterial = floorVariationMaterial;
526
- // this.sceneService.needsRender = true;
527
- // // Emit update toggleFloorFrame event.
528
- // this.messageBus.emit(MessageType.FloorRebuild);
529
- // });
530
- // }
531
- // }
532
- // protected instancedMeshFromFloorPatternTransform(
533
- // geom: BufferGeometry,
534
- // pattern: Array<FloorPatternTransform>,
535
- // material: Material | Material[]
536
- // ) {
537
- // if (pattern.length <= 0) {
538
- // return null;
539
- // }
540
- // const targetPlankMesh = new InstancedMesh(geom, material, pattern.length);
541
- // const dummy = new Object3D();
542
- // for (let i: number = 0; i < pattern.length; i++) {
543
- // const item: FloorPatternTransform = pattern[i];
544
- // const position: Vector3 = item.position;
545
- // position.y = 0.02;
546
- // const rotation: Vector3 = item.rotation;
547
- // dummy.position.set(position.x, position.y, position.z);
548
- // dummy.rotation.set(rotation.x, rotation.y, rotation.z);
549
- // dummy.updateMatrix();
550
- //
551
- // targetPlankMesh.setMatrixAt(i, dummy.matrix);
552
- // }
553
- // return targetPlankMesh;
554
- // }
555
- // protected generateFloorPatternInfo(item: Item, floorPattern: FloorPattern): FloorPatternInfo {
556
- // this.generateSelectedInMetadata(item);
557
- // const info: FloorPatternInfo = {
558
- // meshIdLeft: null,
559
- // meshIdRight: null,
560
- // floorPattern: FloorPattern.NORMAL,
561
- // floorPatternDirection: FloorPatternDirection.LYING,
562
- // heartLine: 0
563
- // };
564
- //
565
- // let floorGameObject: string;
566
- // for (const selectionKey of this.selections) {
567
- // if (selectionKey.nodeType === 'ART') {
568
- // floorGameObject = selectionKey.gameObject;
569
- // break;
570
- // }
571
- // }
572
- //
573
- // info.heartLine = Number(this.floorService.floorCenterLineXAxis);
574
- // // TODO convert floorPatternDirection to type number to let the user use custom rotation, for now there are only 2 options based on enum
575
- // if (this.floorService.floorRotation === 0) {
576
- // info.floorPatternDirection = FloorPatternDirection.LYING;
577
- // } else {
578
- // info.floorPatternDirection = FloorPatternDirection.STANDING;
579
- // }
580
- // info.floorPattern = floorPattern;
581
- // info.meshIdLeft = floorGameObject;
582
- // if (info.floorPattern === FloorPattern.HON45 || info.floorPattern === FloorPattern.HON60) {
583
- // info.meshIdRight = `r_${floorGameObject}`;
584
- // }
585
- // if (info.floorPattern === FloorPattern.HERRINGBONE) {
586
- // info.meshIdRight = info.meshIdLeft;
587
- // }
588
- // const afmeting = selected.find(s => s.question.toLowerCase() === 'plank afmeting');
589
- // let afmetingString: string = afmeting.answer.toLowerCase();
590
- // afmetingString = afmetingString.substr(afmetingString.lastIndexOf(' ') + 1);
591
- // const legPatroonAnswer = selected.find(s => s.question.toLowerCase() === 'leg patroon').answer.toLowerCase();
592
- // let legPatroonString = '';
593
- // const hartlineType = selected.find(s => s.question.toLowerCase() === 'hartlijn');
594
- //
595
- // if (hartlineType && hartlineType.answer.toLowerCase() === 'aangepast') {
596
- // const hartlineValue = selected.find(s => s.question.toLowerCase() === 'hartlijn_aangepast');
597
- // if (hartlineValue && hartlineValue.userInputValue !== undefined) {
598
- // info.heartLine = Number(hartlineValue.userInputValue);
599
- // }
600
- // }
601
- //
602
- //
603
- // switch (true) {
604
- // case legPatroonAnswer.indexOf('recht') !== -1:
605
- // legPatroonString = '90';
606
- // info.floorPattern = FloorPattern.NORMAL;
607
- // break;
608
- // case legPatroonAnswer.indexOf('graat') !== -1:
609
- // legPatroonString = '90';
610
- // info.floorPattern = FloorPattern.HERRINGBONE;
611
- // break;
612
- // case legPatroonAnswer.indexOf('60') !== -1:
613
- // legPatroonString = '60';
614
- // info.floorPattern = FloorPattern.HON60;
615
- // break;
616
- // case legPatroonAnswer.indexOf('45') !== -1:
617
- // legPatroonString = '45';
618
- // info.floorPattern = FloorPattern.HON45;
619
- // break;
620
- // }
621
- //
622
- // info.meshIdLeft = `${afmetingString}_${legPatroonString}`;
623
- // if ( info.floorPattern === FloorPattern.HON45 || info.floorPattern === FloorPattern.HON60) {
624
- // info.meshIdRight = `r_${afmetingString}_${legPatroonString}`;
625
- // }
626
- //
627
- // if (info.floorPattern === FloorPattern.HERRINGBONE) {
628
- // info.meshIdRight = info.meshIdLeft;
629
- // }
630
- //
631
- // const legRichtingAnswer = selected.find(s => s.question.toLowerCase() === 'leg richting').answer.toLowerCase();
632
- // info.floorPatternDirection =
633
- // (legRichtingAnswer.indexOf('verticaal') !== -1) ? FloorPatternDirection.STANDING : FloorPatternDirection.LYING;
634
- // return info;
635
- // }
636
- // protected generateSelectedInMetadata(item: Item): void {
637
- // const cloneSelections = JSON.parse(JSON.stringify(this.selections));
638
- // cloneSelections.forEach(s => {
639
- // s.imageData = undefined;
640
- // s.imageDataLastAnswer = undefined;
641
- // if (s.addables) {
642
- // s.addables.forEach(a => {
643
- // a.imageData = undefined;
644
- // });
645
- // }
646
- // });
647
- // item.metadata.decos = Array.from(this.configuratorConnectorService.decoNodes);
648
- // item.metadata.selections = cloneSelections;
649
- // }
650
- normalizeMesh(mesh) {
651
- const meshSize = new Vector3();
652
- mesh.geometry.computeBoundingBox();
653
- mesh.geometry.boundingBox.getSize(meshSize);
654
- if (meshSize.z > meshSize.x) {
655
- mesh.geometry.rotateY(Math.PI / 2);
656
- }
657
- mesh.geometry.center();
658
- mesh.geometry.computeBoundingBox();
659
- const center = new Vector3();
660
- mesh.geometry.boundingBox.getCenter(center);
661
- mesh.position.copy(center);
662
- }
663
- setInstanceToConfigure(result) {
664
- return __awaiter(this, void 0, void 0, function* () {
665
- if (result.resultType !== ResultType.Timeout) {
666
- if (result.instanceId) {
667
- yield this.configuratorConnectorService.setInstance(result.instanceId)
668
- .catch((e) => {
669
- result.errorMessages.push(new ConfiguratorErrorMessage(e));
670
- Promise.reject(result);
671
- });
672
- }
673
- else {
674
- const response = yield this.configuratorConnectorService.initNodeInstance(result.goodId, true)
675
- .catch((e) => {
676
- result.errorMessages.push(new ConfiguratorErrorMessage(e));
677
- Promise.reject(result);
678
- });
679
- if (response && response.validationResult && response.validationResult.success) {
680
- result.instanceId = response.resultObject;
681
- }
682
- else {
683
- // timeout / unable to set instanceid
684
- result.errorMessages.push(new ConfiguratorErrorMessage('ERROR_SETTING_INSTANCE_ID'));
685
- Promise.reject(result);
686
- }
687
- yield this.configuratorConnectorService.setInstance(result.instanceId)
688
- .catch((e) => {
689
- result.errorMessages.push(new ConfiguratorErrorMessage(e));
690
- Promise.reject(result);
691
- });
692
- }
693
- return result;
694
- }
695
- else {
696
- return Promise.reject();
697
- }
698
- });
699
- }
700
- getSelectionsAndDecosFromMetadata(result) {
701
- if (result.selections && result.decos) {
702
- this.configuratorConnectorService.setSelections(result.selections);
703
- this.configuratorConnectorService.setDecoNodes(Array.from(result.decos.values()));
704
- result.obsolete = true;
705
- if (result.resultType !== ResultType.ConfigurationNotFixed) {
706
- result.resultType = ResultType.Obsolete;
707
- }
708
- }
709
- else {
710
- if (this.configuratorConnectorService.selections.length < 2 || this.configuratorConnectorService.decoNodes.length === 0) {
711
- result.errorMessages.push(new ConfiguratorErrorMessage('NO_SELECTIONS_OR_DECOS', 'NO_SELECTIONS_OR_DECOS_INFO'));
712
- }
713
- throw result;
714
- }
715
- }
716
- selectionPublished(selection) {
717
- return ((selection.hierarchicalPublicationCode === null) || ((selection.hierarchicalPublicationCode & 2) > 0)) &&
718
- ((selection.nodeType === NodeType.Question &&
719
- (((selection.questionPublicationCode & 2) > 0) ||
720
- selection.questionPublicationCode === null || selection.questionPublicationCode === undefined)) ||
721
- (selection.nodeType === NodeType.Answer &&
722
- (((selection.answerPublicationCode & 2) > 0) ||
723
- selection.answerPublicationCode === null || selection.answerPublicationCode === undefined)));
724
- }
725
- cleanupBeforePresetLoad() {
726
- MaterialUtils.ClearCaches();
727
- }
728
- /*
729
- * Clear variables to let objects being disposed properly
730
- */
731
- handleAfterPresetLoad() {
732
- // make sure nothing is keeping a lock
733
- this.configuratorConnectorService.setInstance(null);
734
- // clean
735
- this.cleanup();
736
- }
737
- cleanup() {
738
- ObjectUtils.DisposeObject(this.full3DObjectToUse);
739
- this.full3DObjectToUse = undefined;
740
- this._currentCustomFloorGroup = undefined;
741
- ObjectUtils.DisposeObject(this._activeChildElement);
742
- this._activeChildElement = undefined;
743
- this.placedAdjustables.length = 0;
744
- this._placedAddables.length = 0;
745
- this._adjustables.length = 0;
746
- this._addables.length = 0;
747
- }
748
- canConnectSelections(sel1, sel2) {
749
- if (!sel1.decoNode || !sel2.decoNode) {
750
- return false;
751
- }
752
- let canConnect = sel2.decoNode.type !== DecoNodeType.Part;
753
- if (!canConnect) {
754
- const len = sel1.decoNode.connectors.length;
755
- for (let i = 0; i < len; i++) {
756
- const leni = sel2.decoNode.connectors.length;
757
- for (let ii = 0; ii < leni; ii++) {
758
- canConnect = Scene3DUtil.CanSelectorConnect(sel1.decoNode.connectors, sel1.decoNode.connectors[i], sel2.decoNode.connectors[ii]);
759
- if (canConnect) {
760
- return true;
761
- }
762
- }
763
- }
764
- return false;
765
- }
766
- return canConnect;
767
- }
768
- handleAnswerSelected(answer) {
769
- this._answerSelected.push(answer);
770
- }
771
- handleSelectionSelected(chosenOption) {
772
- this._selectionsSelected.push(chosenOption.opvTreeNodeHierarchy);
773
- }
774
- createConfigurableItem(itemName) {
775
- const item = new Object3D();
776
- item.name = itemName + '_clone';
777
- item.visible = true;
778
- return item;
779
- }
780
- // @ts-ignore
781
- // protected createPositionAnimation(object: Object3D, from: Vector3, to: Vector3, easing: TWEEN.Easing): Promise<void> {
782
- // const tweenFrom: Vector3 = new Vector3().copy(from);
783
- // const tween = new TWEEN.Tween(tweenFrom)
784
- // .to(to, 1000)
785
- // .easing(easing)
786
- // .onUpdate(() => {
787
- // object.position.copy(tweenFrom);
788
- // this.sceneService.needsRender = true;
789
- // });
790
- // // @ts-ignore
791
- // return new Promise((resolve: Function, reject: Function) => tween.onComplete(resolve.bind(this, tween)).onStop(reject).start());
792
- // }
793
- // protected async animateChanges(furniture: Item, changes: ChangesInterface[]): Promise<void[]> {
794
- // // it's christmasss
795
- // const animations: Promise<void>[] = [];
796
- // if (furniture instanceof CustomFloorItem) {
797
- // for (let i = 0; i < changes.length; i++) {
798
- // // @ts-ignore
799
- // const easing: TWEEN.Easing = !changes[i].oldPosition ? TWEEN.Easing.Exponential.Out :
800
- // (!changes[i].newPosition ? TWEEN.Easing.Exponential.Out : TWEEN.Easing.Exponential.InOut);
801
- // const from: Vector3 =
802
- // // tslint:disable-next-line:max-line-length
803
- // changes[i].oldPosition ? new Vector3().copy(changes[i].oldPosition) : new Vector3().copy(changes[i].newPosition).setY(10);
804
- // const to: Vector3 =
805
- // // tslint:disable-next-line:max-line-length
806
- // changes[i].newPosition ? new Vector3().copy(changes[i].newPosition) : new Vector3().copy(changes[i].oldPosition).setY(10);
807
- // const obj: Object3D = furniture.getObjectByName(changes[i].name);
808
- // if (!from.equals(to)) {
809
- // animations.push(
810
- // this.createPositionAnimation(obj, from, to, easing)
811
- // );
812
- // }
813
- // }
814
- // }
815
- // return await Promise.all(animations);
816
- // }
817
- cloneSelections() {
818
- const cloneSelections = JSON.parse(JSON.stringify(this.selections));
819
- cloneSelections.forEach(s => {
820
- s.imageData = undefined;
821
- s.imageDataLastAnswer = undefined;
822
- if (s.addables) {
823
- s.addables.forEach(a => {
824
- a.imageData = undefined;
825
- });
826
- }
827
- });
828
- return cloneSelections;
829
- }
830
- updateBuildObject(newItem, resultObject) {
831
- return __awaiter(this, void 0, void 0, function* () {
832
- const cloneSelections = this.cloneSelections();
833
- newItem.visible = true;
834
- newItem.name = resultObject.articleName;
835
- newItem.userData.rootObject = true;
836
- if (resultObject.position) {
837
- newItem.position.copy(resultObject.position);
838
- }
839
- // TODO ask why it could also be an number
840
- if (resultObject.rotation && resultObject.rotation instanceof Euler) {
841
- newItem.rotation.copy(resultObject.rotation);
842
- }
843
- else if (resultObject.default180 && !resultObject.rotation) {
844
- newItem.rotation.set(this.defaultRotation.x, this.defaultRotation.y, this.defaultRotation.z);
845
- newItem.updateMatrixWorld(true);
846
- }
847
- resultObject.object = newItem;
848
- resultObject.selections = cloneSelections;
849
- resultObject.decos = Array.from(this.configuratorConnectorService.decoNodes);
850
- return resultObject;
851
- });
852
- }
853
- isMoveableObject(obj) {
854
- return obj.userData && obj.userData.selection && obj.userData.selection.hdecoPositioning === HdecoPositioning.Variable;
855
- }
856
- addElementOnConnector(currentItem, element, connector, connectedNodeId) {
857
- return __awaiter(this, void 0, void 0, function* () {
858
- // TODO this should do something, but not sure what
859
- // const connectorFromElement = currentItem.connectorFromElement(element.userData.selection);
860
- // const idFromBaseElement: number = connectedNodeId ? connectedNodeId : connectorFromElement.connectedNodeId;
861
- // const baseElement: Object3D[] = currentItem.getObjectsByUserDataProp('selection', 'nodeId', idFromBaseElement);
862
- //
863
- // const item: Item = ObjectUtils.GetParentItem(element);
864
- // if (item) {
865
- // const conn: string =
866
- // await this.elementService.placeElementOnConnector(
867
- // item.metadata.itemId,
868
- // element,
869
- // baseElement.length > 0 ? baseElement[0] : null,
870
- // false,
871
- // connector,
872
- // false
873
- // );
874
- // this.saveElementConnector(element, conn);
875
- // }
876
- });
877
- }
878
- saveElementConnector(element, connector) {
879
- // if (element && element.userData && element.userData.selection) {
880
- // this._currentCustomFloorGroup.updateElementConnector(element.userData.selection, connector, this.baseElementNodeId);
881
- // }
882
- }
883
- getIdentifierFromSelection(selection) {
884
- return `${selection.decoNode ? selection.decoNode.nodeId + '_' : ''}${selection.nodeId}`;
885
- }
886
- reset() {
887
- this.placedAdjustables.length = 0;
888
- this._placedAddables.length = 0;
889
- this._adjustables.length = 0;
890
- this._addables.length = 0;
891
- // this._prepareTheSelections();
892
- // todo: check this
893
- // this._elementService.removeElement(this.activeInstance);
894
- }
895
- /**
896
- * Returns the materialId of the parent up the tree until presentionlevel 1 is reached
897
- * @param id
898
- * @private
899
- */
900
- getMaterialIdFromParent(id) {
901
- const idx = this.selections.findIndex(s => s.node === id);
902
- let currentLevel = 999;
903
- if (idx > -1) {
904
- for (let i = idx; i > 0; i--) {
905
- const selection = this.selections[i];
906
- if (selection.presentationLevel >= currentLevel) {
907
- break;
908
- }
909
- currentLevel = selection.presentationLevel;
910
- if (selection.hdecoGameObject) {
911
- return selection.hdecoGameObject;
912
- }
913
- }
914
- }
915
- return undefined;
916
- }
917
- getAdjustables(checkGameObject = true, checkType = true) {
918
- return this.selections.filter(s => {
919
- const node = s.decoNode;
920
- // tslint:disable-next-line:max-line-length
921
- return node && (checkGameObject ? node.gameObjectName : true) && (checkType ? node.type === DecoNodeType.Part : true) && node.kind === DecoNodeKind.Adjustable;
922
- });
923
- }
924
- getVariations() {
925
- if (this.configuratorConnectorService.decoNodes.length === 0) {
926
- return [];
927
- }
928
- return this.configuratorConnectorService.decoNodes.filter((deco) => {
929
- return deco.type === DecoNodeType.Variation;
930
- });
931
- }
932
- createAdjustable(item, adj) {
933
- // tslint:disable-next-line:max-line-length
934
- let obj = this.full3DObjectToUse ? this.full3DObjectToUse.getObjectByName(adj.decoNode.gameObjectName || adj.gameObject) : null;
935
- if (!obj) {
936
- // in case of glb files, the importer removes dots from names
937
- const name = adj.decoNode.gameObjectName.replace(/[.]/g, '');
938
- obj = this.full3DObjectToUse ? this.full3DObjectToUse.getObjectByName(name) : null;
939
- if (!obj) {
940
- DebugUtils.log(`No object with name ${adj.decoNode.gameObjectName} found!`);
941
- return null;
942
- }
943
- }
944
- let adjustable = obj.clone();
945
- adjustable.name = this.createUniqueName(item, obj);
946
- adjustable.userData.selection = adj;
947
- adjustable.position.set(0, 0, 0);
948
- adjustable.traverse(c => {
949
- c.visible = !c.name.toLowerCase().startsWith('c_');
950
- });
951
- item.add(adjustable);
952
- adjustable = item.getObjectByName(adjustable.name);
953
- this.placedAdjustables.push(adjustable);
954
- return adjustable;
955
- }
956
- createAddable(item, add, part2, part1) {
957
- const obj = this.full3DObjectToUse.getObjectByName(add.decoNode.gameObjectName);
958
- if (!obj) {
959
- return null;
960
- }
961
- // const selection: Selection = this._getSelectionFromId(adj.artNodeIdDeco);
962
- const addable = obj.clone();
963
- addable.name = this.createUniqueName(item, obj);
964
- addable.userData.selection = add;
965
- addable.position.set(0, 0, 0);
966
- addable.visible = true;
967
- if (part1 && part2) {
968
- return this.placeAddable(item, addable);
969
- }
970
- return addable;
971
- }
972
- placeAddable(item, add) {
973
- item.add(add);
974
- const addable = item.getObjectByName(add.name);
975
- this._placedAddables.push(addable);
976
- return addable;
977
- }
978
- createUniqueName(item, obj) {
979
- let iteration = 0;
980
- let name = `${item.name}_${obj.name}`;
981
- let existingObj = item.getObjectByName(name);
982
- while (existingObj) {
983
- iteration++;
984
- name = `${item.name}_${obj.name}` + (iteration !== 0 ? ('_' + iteration) : '');
985
- existingObj = item.getObjectByName(name);
986
- }
987
- return name;
988
- }
989
- placeAddables(item) {
990
- const len = this.placedAdjustables.length;
991
- for (let i = 0; i < len; i++) {
992
- if (this.placedAdjustables[i].userData.hasOwnProperty('selection') && this.placedAdjustables[i].userData.selection) {
993
- const adjustableSelection = this.placedAdjustables[i].userData.selection;
994
- if (adjustableSelection) {
995
- const lena = adjustableSelection.addables.length;
996
- let conAddable;
997
- for (let ia = 0; ia < lena; ia++) {
998
- Scene3DUtil.TrySelectorConnection(this.scene, item, this.placedAdjustables[i], adjustableSelection.addables[ia], false, (add, part2, part1) => this.createAddable(item, add, part2, part1));
999
- if (conAddable) {
1000
- Scene3DUtil.TrySelectorConnection(this.scene, item, conAddable, adjustableSelection.addables[ia], false, (add, part2, part1) => this.createAddable(item, add, part2, part1));
1001
- }
1002
- conAddable = this._placedAddables[this._placedAddables.length - 1];
1003
- }
1004
- }
1005
- }
1006
- }
1007
- }
1008
- loadVariations(item, instanceId) {
1009
- return __awaiter(this, void 0, void 0, function* () {
1010
- if (this.settingsService.settings.options.useVariationOnPart) {
1011
- yield this.variationService.loadPart(this.articleAssetPath, this._adjustables, instanceId, item, true);
1012
- }
1013
- yield this.variationService.loadVariation(this.articleAssetPath, this._adjustables, instanceId, item, true);
1014
- yield this.variationService.loadVariation(this.articleAssetPath, this._addables, instanceId, item, true);
1015
- this.variationService.clearCache();
1016
- });
1017
- }
1018
- preloadMaterial(answer) {
1019
- if (answer.elementType === DecoNodeType.Variation && (answer.gameObject || answer.materialUrl)) {
1020
- const variations = this.getVariations();
1021
- const variationDecoNode = variations.find(v => ((v.parentId && answer.parentArticleDecoId && v.parentId.toString() === answer.parentArticleDecoId.toString()) ||
1022
- // @ts-ignore
1023
- (v.parentId && answer.parentNodeId && v.parentId.toString() === answer.parentNodeId.toString())));
1024
- if (!variationDecoNode || !this.currentCustomFloorGroup) {
1025
- return;
1026
- }
1027
- let affectedSelections = [];
1028
- if (this._genericSelection) {
1029
- affectedSelections = this._adjustables;
1030
- }
1031
- else {
1032
- const currentSelection = ObjectUtils.GetSelectionFromSelectedObject(this._activeChildElement);
1033
- if (currentSelection) {
1034
- affectedSelections = [this._adjustables.find((selection) => selection.nodeId === currentSelection.nodeId)];
1035
- }
1036
- }
1037
- // tslint:disable-next-line:max-line-length
1038
- const adjustablesClone = affectedSelections && affectedSelections.length > 0 ? affectedSelections.map(s => Object.assign({}, s)) : [];
1039
- if (adjustablesClone.length === 0) {
1040
- return;
1041
- }
1042
- adjustablesClone.forEach((selection) => {
1043
- const variation = selection.variations.find(v => (
1044
- // tslint:disable-next-line:max-line-length
1045
- v).decoId.toString() === variationDecoNode.id.toString() && v.node.toString() === variationDecoNode.nodeId.toString());
1046
- if (variation) {
1047
- if (variation.materialUrl) {
1048
- variation.materialUrl = answer.materialUrl;
1049
- }
1050
- else {
1051
- variation.gameObjectName = answer.gameObject;
1052
- }
1053
- }
1054
- });
1055
- this.variationCacheService.preloadVariationsAsync(adjustablesClone[0].schema, [answer], this.articleAssetPath)
1056
- .then(() => {
1057
- this.variationService.loadVariation(this.articleAssetPath, adjustablesClone, '', this.currentCustomFloorGroup, true);
1058
- });
1059
- }
1060
- }
1061
- preloadMaterialBySelection(answer) {
1062
- if (answer.elementType === DecoNodeType.Variation && answer.gameObject) {
1063
- const variationDecoNode = new DecoNode();
1064
- variationDecoNode.gameObjectName = answer.gameObject;
1065
- const adjustablesClone = this._adjustables.map(s => Object.assign({}, s));
1066
- if (this._genericSelection) {
1067
- if (this.currentCustomFloorGroup) {
1068
- adjustablesClone.forEach((selection) => selection.variations = [variationDecoNode]);
1069
- // tslint:disable-next-line:max-line-length
1070
- this.variationCacheService.preloadVariationsAsync(adjustablesClone[0].schema, [variationDecoNode], this.articleAssetPath)
1071
- .then(() => {
1072
- this.variationService.loadVariation(this.articleAssetPath, adjustablesClone, '', this.currentCustomFloorGroup, true);
1073
- });
1074
- }
1075
- else {
1076
- this._adjustables.forEach((selection) => selection.variations = [variationDecoNode]);
1077
- }
1078
- }
1079
- else {
1080
- const currentSelection = ObjectUtils.GetSelectionFromSelectedObject(this._activeChildElement);
1081
- if (currentSelection) {
1082
- if (this.currentCustomFloorGroup) {
1083
- const selectionFromAdjustables = adjustablesClone
1084
- .find((selection) => selection.nodeId === currentSelection.nodeId);
1085
- if (selectionFromAdjustables) {
1086
- selectionFromAdjustables.variations = [variationDecoNode];
1087
- this.variationCacheService.preloadVariationsAsync(adjustablesClone[0].schema, [variationDecoNode], this.articleAssetPath)
1088
- .then(() => {
1089
- this.variationService.loadVariation(this.articleAssetPath, adjustablesClone, '', this.currentCustomFloorGroup, true).then();
1090
- });
1091
- }
1092
- }
1093
- else {
1094
- const selectionFromAdjustables = this._adjustables
1095
- .find((selection) => selection.nodeId === currentSelection.nodeId);
1096
- selectionFromAdjustables.variations = [variationDecoNode];
1097
- }
1098
- }
1099
- }
1100
- }
1101
- }
1102
- buildFloor(result) {
1103
- return __awaiter(this, void 0, void 0, function* () {
1104
- // let floorWithoutPlankCounter: boolean = true;
1105
- // let floorPattern: FloorPattern;
1106
- // const articleFullObject: ArticleFullObject = await this.connectorAdapterService.getArticleFullObject(+result.metaData.goodId);
1107
- // if (articleFullObject.tags !== null && articleFullObject.tags.length > 0) {
1108
- // for (const tag of articleFullObject.tags) {
1109
- // if (tag.description === 'NORMAL') {
1110
- // floorPattern = FloorPattern.NORMAL;
1111
- // } else if (tag.description === 'HERRINGBONE') {
1112
- // floorPattern = FloorPattern.HERRINGBONE;
1113
- // } else if (tag.description === 'HON60') {
1114
- // floorPattern = FloorPattern.HON60;
1115
- // } else if (tag.description === 'HON45') {
1116
- // floorPattern = FloorPattern.HON45;
1117
- // } else {
1118
- // floorPattern = FloorPattern.NORMAL;
1119
- // }
1120
- // }
1121
- // floorWithoutPlankCounter = false;
1122
- // }
1123
- //
1124
- // const item: FloorPlaneItem = this.floorService.floorToConfigure;
1125
- // item.metadata = result.metaData;
1126
- // item.metadata.selections = this.cloneSelections();
1127
- // item.metadata.decos = Array.from(this.configuratorConnectorService.decoNodes);
1128
- // this.handleCreateFloor(item);
1129
- //
1130
- // if (floorWithoutPlankCounter) {
1131
- // const floorRotation: number = this.floorService.floorRotation;
1132
- // item.children[0].userData.selection = this.selections[0];
1133
- // await this.loadVariations(item, result.metaData.itemId);
1134
- //
1135
- // item.metadata.textureAssetName = this.variationService.loadedAsset;
1136
- // this.floorService.unHighLightFloors();
1137
- // this.sceneService.needsRender = true;
1138
- // this.currentCustomFloorGroup = item;
1139
- // result.furniture = this.currentCustomFloorGroup;
1140
- // result.instanceId = result.metaData.itemId;
1141
- //
1142
- // } else {
1143
- // this.floorService.unHighLightFloors();
1144
- // this.sceneService.needsRender = true;
1145
- // this.currentCustomFloorGroup = item;
1146
- // result.furniture = this.currentCustomFloorGroup;
1147
- // result.instanceId = result.metaData.itemId;
1148
- // // this._generateLayingPattern(item, floorPattern);
1149
- // }
1150
- //
1151
- // this.handleIntegration(result.metaData.itemId, this.currentCustomFloorGroup);
1152
- // if (this.currentCustomFloorGroup.itemGroup) {
1153
- // this.itemGroupService.reattachToItemGroup(
1154
- // this.currentCustomFloorGroup,
1155
- // this.currentCustomFloorGroup.itemGroup,
1156
- // this.currentCustomFloorGroup.position);
1157
- // }
1158
- // this.emptyAnswerSelected();
1159
- //
1160
- // if (result.resultType === ResultType.NoSelections) {
1161
- // result.resultType = ResultType.ConfigurationFixed;
1162
- // } else if (result.resultType !== ResultType.Obsolete && result.resultType !== ResultType.ConfigurationFixed) { // don't override these
1163
- // result.resultType = ResultType.Loaded;
1164
- // }
1165
- // this.floorService.floorResultObject = result;
1166
- // this.buildFinished.next(result);
1167
- // return result;
1168
- });
1169
- }
1170
- downloadUDSZforARIOS() {
1171
- const objects = this.itemService.sceneItems;
1172
- const objectToExport = objects.values().next().value;
1173
- this.utilsService.downloadUSDZforARIOS(objectToExport);
1174
- }
1175
- }
1176
- BuildFurnitureBaseService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureBaseService, deps: [{ token: i1.ConfiguratorConnectorService }, { token: i2.DictionaryService }, { token: i3.AppEventService }, { token: i4.SettingsService }, { token: i5.VariationService }, { token: i6.VariationCacheService }, { token: i7.UtilsService }, { token: i8.ItemService }], target: i0.ɵɵFactoryTarget.Injectable });
1177
- BuildFurnitureBaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureBaseService });
1178
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureBaseService, decorators: [{
1179
- type: Injectable
1180
- }], ctorParameters: function () { return [{ type: i1.ConfiguratorConnectorService }, { type: i2.DictionaryService }, { type: i3.AppEventService }, { type: i4.SettingsService }, { type: i5.VariationService }, { type: i6.VariationCacheService }, { type: i7.UtilsService }, { type: i8.ItemService }]; } });
1181
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtZnVybml0dXJlLWJhc2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmZpZ3VyYXRvci9zcmMvbGliL3NlcnZpY2VzL2J1aWxkLWZ1cm5pdHVyZS1iYXNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUN6RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDdEYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBRXRGLE9BQU8sRUFBQyxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFFcEQsT0FBTyxFQUFDLEtBQUssRUFBUSxRQUFRLEVBQVMsT0FBTyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzVELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxREFBcUQsQ0FBQztBQUM3RSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw2REFBNkQsQ0FBQztBQUk3RixPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFJdEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBSzdFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7QUFHaEQsTUFBTSxPQUFnQix5QkFBeUI7SUF1RDdDLFlBQ1ksNEJBQTBELEVBQzFELGlCQUFvQyxFQUNwQyxlQUFnQyxFQUNoQyxlQUFn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QXVEO1lBQ3ZELHVEQUF1RDtZQUN2RCx5SUFBeUk7WUFDekksMkNBQTJDO1lBQzNDLElBQUk7WUFDSixnREFBZ0Q7WUFDaEQsbUNBQW1DO1lBQ25DLGlCQUFpQjtRQUNuQixDQUFDO0tBQUE7SUFFTSxvQkFBb0I7UUFDekIsTUFBTSxPQUFPLEdBQWUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDeEQsTUFBTSxjQUFjLEdBQWEsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztRQUMvRCxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7O3VIQXZ0Q21CLHlCQUF5QjsySEFBekIseUJBQXlCOzRGQUF6Qix5QkFBeUI7a0JBRDlDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RlY29Ob2RlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RlY28tbm9kZSc7XHJcbmltcG9ydCB7RGVjb05vZGVUeXBlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vZGVjby1ub2RlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7RGVjb05vZGVLaW5kfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vZGVjby1ub2RlLWtpbmQuZW51bSc7XHJcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3NlbGVjdGlvbic7XHJcbmltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyJztcclxuaW1wb3J0IHtFdWxlciwgTWVzaCwgT2JqZWN0M0QsIFNjZW5lLCBWZWN0b3IzfSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7Tm9kZVR5cGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9ub2RlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7SGRlY29Qb3NpdGlvbmluZ30gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9lbnVtL2hkZWNvLXBvc2l0aW9uaW5nLmVudW0nO1xyXG5pbXBvcnQge1ZhcmlhdGlvblNlcnZpY2V9IGZyb20gJy4vdmFyaWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZhcmlhdGlvbkNhY2hlU2VydmljZX0gZnJvbSAnLi92YXJpYXRpb24tY2FjaGUuc2VydmljZSc7XHJcbmltcG9ydCB7U2VsZWN0b3JTdHJ1Y3R1cmV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0b3Itc3RydWN0dXJlLmJvJztcclxuaW1wb3J0IHtTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2V9IGZyb20gJy4vY29uZmlndXJhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSAnLi4vdXRpbHMvb2JqZWN0LnV0aWxzJztcclxuaW1wb3J0IHtNYXRlcmlhbFV0aWxzfSBmcm9tICcuLi91dGlscy9tYXRlcmlhbC51dGlscyc7XHJcbmltcG9ydCB7U2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuL3NldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0RpY3Rpb25hcnlTZXJ2aWNlfSBmcm9tICcuL2RpY3Rpb25hcnkuc2VydmljZSc7XHJcbmltcG9ydCB7QXBwRXZlbnRTZXJ2aWNlfSBmcm9tICcuL2FwcC1ldmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHtSZXN1bHRUeXBlfSBmcm9tICcuLi9lbnVtL3Jlc3VsdC10eXBlLmVudW0nO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRvckVycm9yTWVzc2FnZX0gZnJvbSAnLi4vbW9kZWwvY29uZmlndXJhdG9yLWVycm9yLW1lc3NhZ2UnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3R9IGZyb20gJy4uL21vZGVsL2NvbmZpZ3VyYXRpb24tcmVzdWx0LW9iamVjdCc7XHJcbmltcG9ydCB7VmFyaWF0aW9ufSBmcm9tICcuLi9tb2RlbC92YXJpYXRpb24nO1xyXG5pbXBvcnQge1V0aWxzU2VydmljZX0gZnJvbSAnLi91dGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHtJdGVtU2VydmljZX0gZnJvbSAnLi9pdGVtLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lM0RVdGlsfSBmcm9tICcuLi91dGlscy9zY2VuZS0zZC51dGlscyc7XHJcbmltcG9ydCB7RGVidWdVdGlsc30gZnJvbSAnLi4vdXRpbHMvZGVidWcudXRpbHMnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnVpbGRGdXJuaXR1cmVCYXNlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBnZXQgdXNlTm9kZUlkVG9MaW5rKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VzZU5vZGVJZFRvTGluaztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudEN1c3RvbUZsb29yR3JvdXAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGN1cnJlbnRDdXN0b21GbG9vckdyb3VwKGl0ZW06IE9iamVjdDNEKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCA9IGl0ZW07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbnMoKTogU2VsZWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBzY2VuZShzY2VuZTogU2NlbmUpIHtcclxuICAgIHRoaXMuX3NjZW5lID0gc2NlbmU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNjZW5lKCk6IFNjZW5lIHtcclxuICAgIHJldHVybiB0aGlzLl9zY2VuZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWZhdWx0UG9zaXRpb24gPSBuZXcgVmVjdG9yMyg0LCAwLCAxKTtcclxuICBwdWJsaWMgZGVmYXVsdFJvdGF0aW9uID0gbmV3IEV1bGVyKDAsIE1hdGguUEksIDApO1xyXG5cclxuICBwdWJsaWMgYmFzZUVsZW1lbnROb2RlSWQ6IG51bWJlcjtcclxuICBwdWJsaWMgYXJ0aWNsZUFzc2V0UGF0aDogc3RyaW5nO1xyXG4gIHB1YmxpYyBzdGFydFBvc2l0aW9uOiBWZWN0b3IzO1xyXG4gIHB1YmxpYyBmdWxsM0RPYmplY3RUb1VzZTogT2JqZWN0M0Q7XHJcbiAgcHVibGljIGlzTW91c2VPdmVyT2JqZWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgLy8gdXNlZCBmb3IgZWxlbWVudHMsIHRvIHBsYWNlIG9iamVjdHMgb25cclxuICBwdWJsaWMgYWN0aXZlQ29ubmVjdG9yOiBhbnk7XHJcblxyXG4gIHB1YmxpYyBhbnN3ZXJTZWxlY3RlZDogU3ViamVjdDxDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0PiA9IG5ldyBTdWJqZWN0PENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+KCk7XHJcbiAgcHVibGljIGFyUGxhY2VtZW50VXBkYXRlOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBwdWJsaWMgc2hvd0VsZW1lbnRUb29sYmFyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfdXNlTm9kZUlkVG9MaW5rOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9hY3RpdmVDaGlsZEVsZW1lbnQ6IE1lc2g7XHJcbiAgcHJpdmF0ZSBfcGxhY2VkQWRkYWJsZXM6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfYWRqdXN0YWJsZXM6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfYWRkYWJsZXM6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfY3VycmVudEN1c3RvbUZsb29yR3JvdXA6IE9iamVjdDNEO1xyXG4gIHByaXZhdGUgX2dlbmVyaWNTZWxlY3Rpb24gPSBmYWxzZTtcclxuICBwcml2YXRlIF9hbnN3ZXJTZWxlY3RlZDogQW5zd2VyW10gPSBbXTtcclxuICBwcml2YXRlIF9zZWxlY3Rpb25zU2VsZWN0ZWQ6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHByaXZhdGUgX3NjZW5lOiBTY2VuZTtcclxuXHJcbiAgcHJvdGVjdGVkIHN1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgcHJvdGVjdGVkIHBsYWNlZEFkanVzdGFibGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCBjb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlOiBDb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGRpY3Rpb25hcnlTZXJ2aWNlOiBEaWN0aW9uYXJ5U2VydmljZSxcclxuICAgIHByb3RlY3RlZCBhcHBFdmVudFNlcnZpY2U6IEFwcEV2ZW50U2VydmljZSxcclxuICAgIHByb3RlY3RlZCBzZXR0aW5nc1NlcnZpY2U6IFNldHRpbmdzU2VydmljZSxcclxuICAgIHByb3RlY3RlZCB2YXJpYXRpb25TZXJ2aWNlOiBWYXJpYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIHZhcmlhdGlvbkNhY2hlU2VydmljZTogVmFyaWF0aW9uQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIHV0aWxzU2VydmljZTogVXRpbHNTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGl0ZW1TZXJ2aWNlOiBJdGVtU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XHJcbiAgICB0aGlzLmNsZWFudXAoKTtcclxuICB9XHJcblxyXG4gIGFic3RyYWN0IGJ1aWxkKHJlc3VsdDogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IFByb21pc2U8Q29uZmlndXJhdGlvblJlc3VsdE9iamVjdD47XHJcblxyXG4gIGFic3RyYWN0IGNyZWF0ZVNpbXBsZTNETW9kZWwocmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdDtcclxuXHJcbiAgYWJzdHJhY3Qgc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihkYXRhOiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogUHJvbWlzZTxDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0PjtcclxuXHJcbiAgYWJzdHJhY3QgcHJlcGFyZVNlbGVjdGlvbnNBbmREZWNvcyhyZXN1bHQ6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QpOiBQcm9taXNlPENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+O1xyXG5cclxuICBhYnN0cmFjdCBjcmVhdGVOb25Db25maWd1cmFibGVGbG9vcihyZXN1bHQ6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QpOiBQcm9taXNlPENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+O1xyXG5cclxuICBhYnN0cmFjdCBzdGFydFRvQnVpbGQoXHJcbiAgICByZXN1bHQ/OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0LFxyXG4gICAgc2hvdWxkQ29weUluc3RhbmNlPzogYm9vbGVhbixcclxuICAgIGxvb3NlT3JpZ2luYWxDb25maWd1cmF0aW9uPzogYm9vbGVhbixcclxuICAgIHN0YW5kQWxvbmU/OiBib29sZWFuLFxyXG4gICAgZmlyc3RCdWlsZD86IGJvb2xlYW4sXHJcbiAgICBmcm9tUHJlc2V0PzogYm9vbGVhbixcclxuICAgIGxvYWRGcm9tUHJvamVjdD86IGJvb2xlYW5cclxuICApOiBQcm9taXNlPENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+O1xyXG5cclxuICBwdWJsaWMgZW1wdHlBbnN3ZXJTZWxlY3RlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Fuc3dlclNlbGVjdGVkLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW1wdHlTZWxlY3Rpb25zU2VsZWN0ZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb25zU2VsZWN0ZWQubGVuZ3RoID0gMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRPcHRpb25zRnJvbVNlbGVjdGlvbihiYXNlU2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBTZWxlY3Rpb25bXSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgbGV0IG5vZGVMZXZlbCA9IC0xO1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLnNlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uc1tpXTtcclxuICAgICAgY29uc3QgbGV2ZWw6IG51bWJlciA9IHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbDtcclxuICAgICAgaWYgKG5vZGVMZXZlbCAhPT0gLTEpIHtcclxuICAgICAgICBpZiAobm9kZUxldmVsIDwgbGV2ZWwgJiYgdGhpcy5jYW5Db25uZWN0U2VsZWN0aW9ucyhiYXNlU2VsZWN0aW9uLCBzZWxlY3Rpb24pICYmIHRoaXMuc2VsZWN0aW9uUHVibGlzaGVkKHNlbGVjdGlvbikpIHtcclxuICAgICAgICAgIHNlbGVjdGlvbnMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobm9kZUxldmVsID49IGxldmVsKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNlbGVjdGlvbi5pZCA9PT0gYmFzZVNlbGVjdGlvbi5pZCAmJiBzZWxlY3Rpb24ubm9kZSA9PT0gYmFzZVNlbGVjdGlvbi5ub2RlKSB7XHJcbiAgICAgICAgbm9kZUxldmVsID0gbGV2ZWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzZWxlY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbmNlbENvbmZpZ3VyaW5nQ3VycmVudEluc3RhbmNlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwKSB7XHJcbiAgICAgIC8vIFRPRE8gY2hlY2sgd2hhdCB3ZSBzaG91bGQgZG8gd2l0aCB0aGlzIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmNvbmZpZ3VyaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY2FuY2VsQW5zd2VyKGRhdGE6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QsIHJlYnVpbGQ6IGJvb2xlYW4gPSB0cnVlLCBnZXRBbnN3ZXJzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5jYW5jZWxBbnN3ZXIoKTtcclxuICAgIGlmIChyZWJ1aWxkKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihkYXRhKTtcclxuICAgIH0gZWxzZSBpZiAoZ2V0QW5zd2VycykgeyAvLyBpZiBub3QgcmVidWlsZCB0aGVuIGNoZWNrIGlmIHdlIG5lZWQgdG8gZ2V0IGFuc3dlcnNcclxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmdldFF1ZXN0aW9uQW5kQW5zd2Vyc0FzeW5jKCk7IC8vIHNlZSBpZiB0aGVyZSBpcyB1c2VyIGlucHV0IG5lZWRlZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNlbGVjdFNlbGVjdGlvbihcclxuICAgIHNlbGVjdGlvbjogU2VsZWN0aW9uLCBkYXRhOiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0LCBmb3JjZUJhY2tUb05vZGU/OiBib29sZWFuLCBhZnRlcj86IGJvb2xlYW4sIGNvbm5lY3Rvcj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLnNlbGVjdFNlbGVjdGlvbihzZWxlY3Rpb24sIGZvcmNlQmFja1RvTm9kZSwgYWZ0ZXIsIGNvbm5lY3Rvcik7XHJcbiAgICB0aGlzLl9nZW5lcmljU2VsZWN0aW9uID0gc2VsZWN0aW9uLmdlbmVyaWM7XHJcbiAgICBhd2FpdCB0aGlzLnN0YXJ0VG9CdWlsZEZyb21Db25maWd1cmF0b3IoZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBkYXRhOiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICBhd2FpdCB0aGlzLnN0YXJ0VG9CdWlsZEZyb21Db25maWd1cmF0b3IoZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVwbGFjZVNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbiwgZGF0YTogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLnJlcGxhY2VTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIGF3YWl0IHRoaXMuc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihkYXRhKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZWxlY3RBbnN3ZXIoYW5zd2VyOiBBbnN3ZXIsIGlucHV0OiBzdHJpbmcsIGRhdGE6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMucHJlbG9hZE1hdGVyaWFsKGFuc3dlcik7XHJcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2Uuc2VsZWN0QW5zd2VyKGFuc3dlciwgaW5wdXQpO1xyXG4gICAgdGhpcy5oYW5kbGVBbnN3ZXJTZWxlY3RlZChhbnN3ZXIpO1xyXG4gICAgY29uc3QgcmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0ID0gYXdhaXQgdGhpcy5zdGFydFRvQnVpbGRGcm9tQ29uZmlndXJhdG9yKGRhdGEpO1xyXG4gICAgdGhpcy5hbnN3ZXJTZWxlY3RlZC5uZXh0KHJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2VsZWN0U2VsZWN0aW9uQXNBbnN3ZXIoY2hvc2VuT3B0aW9uOiBTZWxlY3RvclN0cnVjdHVyZSwgZGF0YTogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5wcmVsb2FkTWF0ZXJpYWxCeVNlbGVjdGlvbihjaG9zZW5PcHRpb24pO1xyXG4gICAgdGhpcy5oYW5kbGVTZWxlY3Rpb25TZWxlY3RlZChjaG9zZW5PcHRpb24pO1xyXG4gICAgY29uc3QgcmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0ID0gYXdhaXQgdGhpcy5zdGFydFRvQnVpbGRGcm9tQ29uZmlndXJhdG9yKGRhdGEpO1xyXG4gICAgdGhpcy5hbnN3ZXJTZWxlY3RlZC5uZXh0KHJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbGlua1NlbGVjdGlvbnNBbmREZWNvcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxlbjogbnVtYmVyID0gdGhpcy5zZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgLy8gY29uc3QgaWQ6IHN0cmluZyA9IHRoaXMuc2VsZWN0aW9uc1tpXS5hcnROb2RlSWREZWNvO1xyXG4gICAgICBsZXQgZGVjbzogYW55ID0gdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmRlY29Ob2Rlcy5maW5kKGQgPT4gZC5ub2RlSWQgPT09IHRoaXMuc2VsZWN0aW9uc1tpXS5ub2RlKTtcclxuICAgICAgaWYgKCFkZWNvKSB7XHJcbiAgICAgICAgZGVjbyA9IG5ldyBEZWNvTm9kZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChkZWNvLnR5cGUgIT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb24pIHtcclxuICAgICAgICBjb25zdCB2YXJpYXRpb246IGFueSA9IHRoaXMuZ2V0VmFyaWF0aW9ucygpLmZpbmQodiA9PiB2LnBhcmVudElkID09PSB0aGlzLnNlbGVjdGlvbnNbaV0uYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICAgICAgaWYgKHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgZGVjby52YXJpYXRpb24gPSB2YXJpYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uc1tpXS5kZWNvTm9kZSA9IGRlY287XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcEV2ZW50U2VydmljZS5zZWxlY3Rpb25zQW5kRGVjb3NMaW5rZWQubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHByZXBhcmVUaGVTZWxlY3Rpb25zKGluc3RhbmNlSWQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnNlbGVjdGlvbnMuc2xpY2UoKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbk9mQXJ0aWNsZTogU2VsZWN0aW9uID0gc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuQXJ0aWNsZSk7XHJcbiAgICBjb25zdCBhZGp1c3RhYmxlU2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSBzZWxlY3Rpb25zLmZpbHRlcihzID0+IHMuYWRkQWRqdXN0ID09PSAnMicpO1xyXG4gICAgY29uc3QgaXNBcnRpY2xlV2l0aE1hdGVyaWFsOiBib29sZWFuID1cclxuICAgICAgYWRqdXN0YWJsZVNlbGVjdGlvbnMubGVuZ3RoID09PSAwICYmXHJcbiAgICAgIHNlbGVjdGlvbk9mQXJ0aWNsZS5nYW1lT2JqZWN0ICYmXHJcbiAgICAgIHNlbGVjdGlvbk9mQXJ0aWNsZS5nYW1lT2JqZWN0Lmxlbmd0aCA+IDA7XHJcbiAgICAvLyBnZXQgZ2VuZXJpYyB2YXJpYXRpb25zXHJcbiAgICBjb25zdCBnbG9iYWxWYXJpYXRpb25zOiBEZWNvTm9kZVtdID0gc2VsZWN0aW9uc1xyXG4gICAgICAuZmlsdGVyKHMgPT4gKHMuZ2VuZXJpYyB8fCBhZGp1c3RhYmxlU2VsZWN0aW9ucy5sZW5ndGggPT09IDEpICYmIChzLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uICYmICghcy5lbGVtZW50VHlwZSB8fCBzLmVsZW1lbnRUeXBlID09PSAndmFyaWF0aW9uJykpXHJcbiAgICAgIC5tYXAoKHZhbHVlOiBTZWxlY3Rpb24sIGluZGV4OiBudW1iZXIsIGFycmF5OiBTZWxlY3Rpb25bXSkgPT4ge1xyXG4gICAgICAgIC8vIGZpbmQgc2VsZWN0aW9uIG9mIHZhcmlhdGlvblxyXG4gICAgICAgIGNvbnN0IHNlbDogU2VsZWN0aW9uID0gc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5hcnROb2RlSWREZWNvID09PSAodmFsdWUuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24ucGFyZW50SWQpO1xyXG4gICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOciA9IHNlbC5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uLm1hdGVyaWFsSWQgPSB0aGlzLmdldE1hdGVyaWFsSWRGcm9tUGFyZW50KHZhbHVlLm5vZGUpO1xyXG4gICAgICAgIHJldHVybiAodmFsdWUuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb247XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGxldCBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSBzZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgIGxldCBsYXN0QWRkZWQ6IFNlbGVjdGlvbjtcclxuICAgIGxldCBsYXN0QWRqdXN0YWJsZTogU2VsZWN0aW9uO1xyXG4gICAgbGV0IG5ld1BhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBwcmV2aW91c1ByZXNMZXZlbDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgcG9zaXRpb25pbmc6IGFueTtcclxuICAgIGxldCBvcHRpb25UZXh0OiBzdHJpbmc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gc2VsZWN0aW9uc1tpXTtcclxuICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSkge1xyXG4gICAgICAgIHBvc2l0aW9uaW5nID0gc2VsZWN0aW9uLmhkZWNvUG9zaXRpb25pbmc7XHJcbiAgICAgICAgb3B0aW9uVGV4dCA9IHNlbGVjdGlvbi5xdWVzdGlvbjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID4gcHJldmlvdXNQcmVzTGV2ZWwpIHtcclxuICAgICAgICBzZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZyA9IHNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nIHx8IHBvc2l0aW9uaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb24pIHtcclxuICAgICAgICAgIGNvbnN0IGRlY29Ob2RlID0gc2VsZWN0aW9uLmRlY29Ob2RlO1xyXG4gICAgICAgICAgKGRlY29Ob2RlIGFzIGFueSkub3B0aW9uVGV4dCA9IG9wdGlvblRleHQ7XHJcbiAgICAgICAgICAvLyBmaW5kIHNlbGVjdGlvbiBvZiB2YXJpYXRpb24gYW5kIHNldCBtYXRlcmlhbElkIGluIGNhc2Ugb2YgbXVsdGltYXRlcmlhbFxyXG4gICAgICAgICAgaWYgKCEoZGVjb05vZGUgYXMgYW55KS5tYXRlcmlhbElkKSB7XHJcbiAgICAgICAgICAgIChkZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQgPSB0aGlzLmdldE1hdGVyaWFsSWRGcm9tUGFyZW50KGRlY29Ob2RlLm5vZGVJZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobGFzdEFkZGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChuZXdQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKChkZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQpIHtcclxuICAgICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsYXN0QWRkZWQudmFyaWF0aW9ucyA9IFtkZWNvTm9kZV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5ld1BhcnQgPSBmYWxzZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbFZhcmlhdGlvbnMucHVzaChkZWNvTm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgIC8vICAgaWYgKGdsb2JhbFZhcmlhdGlvbnNSZXdyaXRlKSB7XHJcbiAgICAgICAgICAvLyAgICAgZ2xvYmFsVmFyaWF0aW9ucy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgLy8gICAgIGdsb2JhbFZhcmlhdGlvbnNSZXdyaXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAvLyAgIH1cclxuICAgICAgICAgIC8vICAgZ2xvYmFsVmFyaWF0aW9ucy5wdXNoKGRlY29Ob2RlKTtcclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIC8vIGNvbnN0IHZhcmlhdGlvbjogRnVybml0dXJlUGFydFZhcmlhdGlvbiA9IG5ldyBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uKCk7XHJcbiAgICAgICAgICAvLyB2YXJpYXRpb24uQnJhbmRJZCA9IHNlbGVjdGlvbi5kZWNvTm9kZS5icmFuZElkO1xyXG4gICAgICAgICAgLy8gdmFyaWF0aW9uLkRlc2NyaXB0aW9uID0gc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lO1xyXG4gICAgICAgICAgLy8gdmFyaWF0aW9uLk1hdGVyaWFsSWQgPSAoc2VsZWN0aW9uLmRlY29Ob2RlIGFzIGFueSkubWF0ZXJpYWxJZDtcclxuICAgICAgICAgIC8vIHZhcmlhdGlvbi5TdXBwbGllckFydGljbGVOciA9IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICAgIC8vIHVzZWRWYXJpYXRpb25zLnB1c2godmFyaWF0aW9uKTtcclxuICAgICAgICB9IGVsc2UgaWYgKChzZWxlY3Rpb24uZGVjb05vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlBhcnQgJiZcclxuICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUgPT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgICBzZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUubGVuZ3RoKSB8fCAoaXNBcnRpY2xlV2l0aE1hdGVyaWFsKSkge1xyXG4gICAgICAgICAgaWYgKHNlbGVjdGlvbi5kZWNvTm9kZS5raW5kID09PSBEZWNvTm9kZUtpbmQuQWRqdXN0YWJsZSB8fCAoaXNBcnRpY2xlV2l0aE1hdGVyaWFsKSkge1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24udmFyaWF0aW9ucyA9IGdsb2JhbFZhcmlhdGlvbnMuc2xpY2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fYWRqdXN0YWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCAobGFzdEFkZGVkLm5vZGVJZCAhPT0gc2VsZWN0aW9uLm5vZGVJZCB8fCBsYXN0QWRkZWQubm9kZSAhPT0gc2VsZWN0aW9uLm5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgbmV3UGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFzdEFkZGVkID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICBsYXN0QWRqdXN0YWJsZSA9IHNlbGVjdGlvbjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGRhYmxlKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi52YXJpYXRpb25zID0gbGFzdEFkanVzdGFibGUgPyBsYXN0QWRqdXN0YWJsZS52YXJpYXRpb25zIDogZ2xvYmFsVmFyaWF0aW9ucy5zbGljZSgpO1xyXG4gICAgICAgICAgICBpZiAobGFzdEFkanVzdGFibGUpIHtcclxuICAgICAgICAgICAgICBsYXN0QWRqdXN0YWJsZS5hZGRhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fYWRkYWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCAobGFzdEFkZGVkLm5vZGVJZCAhPT0gc2VsZWN0aW9uLm5vZGVJZCB8fCBsYXN0QWRkZWQubm9kZSAhPT0gc2VsZWN0aW9uLm5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgbmV3UGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFzdEFkZGVkID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBwcmV2aW91c1ByZXNMZXZlbCA9IHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbDtcclxuICAgIH1cclxuICAgIC8vIHRoaXMuX3Vwc2VydEZ1cm5pdHVyZSh0aGlzLmFjdGl2ZUluc3RhbmNlLFxyXG4gICAgLy8gICB7VmFyaWF0aW9uczogdXNlZFZhcmlhdGlvbnN9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBwcmVsb2FkTWF0ZXJpYWxzKHNjaGVtYTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhcmlhdGlvbkNhY2hlU2VydmljZS5wcmVsb2FkVmFyaWF0aW9ucyhcclxuICAgICAgc2NoZW1hLCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZGVjb05vZGVzXHJcbiAgICAgICAgLmZpbHRlcihkID0+IChkLmdhbWVPYmplY3ROYW1lIHx8IGQubWF0ZXJpYWxVcmwpICYmIGQudHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbilcclxuICAgICAgICAubWFwKGQgPT4gZCksIHRoaXMuYXJ0aWNsZUFzc2V0UGF0aCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgcHJlcGFyZUluc3RhbmNlRm9yQnVpbGQoXHJcbiAgICBzaG91bGRDb3B5SW5zdGFuY2U6IGJvb2xlYW4sXHJcbiAgICBsb2FkRnJvbVByb2plY3Q6IGJvb2xlYW4sXHJcbiAgICBsb29zZU9yaWdpbmFsQ29uZmlndXJhdGlvbjogYm9vbGVhbixcclxuICAgIHJlc3VsdDogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdFxyXG4gICk6IFByb21pc2U8Q29uZmlndXJhdGlvblJlc3VsdE9iamVjdD4ge1xyXG4gICAgaWYgKHNob3VsZENvcHlJbnN0YW5jZSAmJiAhbG9hZEZyb21Qcm9qZWN0KSB7XHJcbiAgICAgIGNvbnN0IG9yaWdpbmFsSW5zdGFuY2VJZDogc3RyaW5nID0gcmVzdWx0Lmluc3RhbmNlSWQ7XHJcbiAgICAgIHJlc3VsdC5vcmlnaW5hbEl0ZW1JZCA9IG9yaWdpbmFsSW5zdGFuY2VJZDtcclxuICAgICAgaWYgKGxvb3NlT3JpZ2luYWxDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgcmVzdWx0Lmluc3RhbmNlSWQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuY29weUluc3RhbmNlQW5kTG9zZU9yaWdpbmFsQ29uZmlndXJhdGlvbihvcmlnaW5hbEluc3RhbmNlSWQsIHJlc3VsdClcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxJbnN0YW5jZUlkO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0Lmluc3RhbmNlSWQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuY29weUluc3RhbmNlQW5kU2F2ZU9yaWdpbmFsQ29uZmlndXJhdGlvbihvcmlnaW5hbEluc3RhbmNlSWQsIHJlc3VsdClcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxJbnN0YW5jZUlkO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChyZXN1bHQucmVzdWx0VHlwZSAhPT0gUmVzdWx0VHlwZS5BcnRpY2xlTm90Rm91bmQgJiYgIWxvYWRGcm9tUHJvamVjdCkge1xyXG4gICAgICBhd2FpdCB0aGlzLnNldEluc3RhbmNlVG9Db25maWd1cmUocmVzdWx0KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIHJldHVybiBlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIGdldFNlbGVjdGlvbnNBbmREZWNvcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbnNBbmREZWNvUHJvbWlzZTogUHJvbWlzZTxhbnk+W10gPSBbXTtcclxuICAgICAgc2VsZWN0aW9uc0FuZERlY29Qcm9taXNlLnB1c2godGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmdldFNlbGVjdGlvbnNBc3luYygpLCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZ2V0RGVjb3NBc3luYygpKTtcclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoc2VsZWN0aW9uc0FuZERlY29Qcm9taXNlKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgRGVidWdVdGlscy5sb2coYEVycm9yIGdldHRpbmcgc2VsZWN0aW9ucyBhbmQgZGVjb3M6ICR7ZX1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVQcmVwYXJlU2VsZWN0aW9uc0RlY29zKHJlc3VsdDogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IFByb21pc2U8Q29uZmlndXJhdGlvblJlc3VsdE9iamVjdD4ge1xyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zLmxlbmd0aCA8IDIpIHsgLy8gbm8gc2VsZWN0aW9ucywgb25seSBzZWxlY3Rpb24gb2YgdHlwZSAnQVJUJ1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChyZXN1bHQucmVzdWx0VHlwZSAhPT0gUmVzdWx0VHlwZS5BcnRpY2xlTm90Rm91bmQgJiYgIXJlc3VsdC5vcmlnaW5hbEl0ZW1JZCkgeyAvLyBhcnRpY2xlIGZvdW5kLCBzbyBpbml0IHRoYXQgZmlyc3RcclxuICAgICAgICAgIHJlc3VsdC5vcmlnaW5hbEl0ZW1JZCA9IHJlc3VsdC5pbnN0YW5jZUlkO1xyXG4gICAgICAgICAgcmVzdWx0Lmluc3RhbmNlSWQgPSBudWxsO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRJbnN0YW5jZVRvQ29uZmlndXJlKHJlc3VsdCk7XHJcbiAgICAgICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuTm9TZWxlY3Rpb25zO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRUb0J1aWxkKHJlc3VsdCk7IC8vICdyZXN0YXJ0JyB0aGUgYnVpbGRcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXRTZWxlY3Rpb25zQW5kRGVjb3NGcm9tTWV0YWRhdGEocmVzdWx0KTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIERlYnVnVXRpbHMubG9nKGBFcnJvciBwcmVwYXJpbmcgc2VsZWN0aW9ucyBhbmQgZGVjb3M6ICR7ZX1gKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zLmZvckVhY2gocyA9PiB7XHJcbiAgICAgIHMuc2NoZW1hID0gcmVzdWx0LnNjaGVtYTtcclxuICAgICAgcy5pbnN0YW5jZUlkID0gcmVzdWx0Lmluc3RhbmNlSWQ7XHJcbiAgICB9KTsgLy8gYWRkIHNjaGVtYSBmb3IgbWF0ZXJpYWwgY3JlYXRpb25cclxuXHJcbiAgICAvLyBUT0RPIGFkZCB0aGlzIGZ1bmN0aW9uLCBpdCdzIHVzZWQgZm9yIEdUTSB0aGlzLmhhbmRsZVNlbGVjdGlvbnNSZWNlaXZlZChyZXN1bHQubWV0YURhdGEpO1xyXG4gICAgdGhpcy5saW5rU2VsZWN0aW9uc0FuZERlY29zKCk7XHJcbiAgICB0aGlzLnByZXBhcmVUaGVTZWxlY3Rpb25zKHJlc3VsdC5pbnN0YW5jZUlkKTtcclxuICB9XHJcblxyXG4gIC8vIFRPRE8gY2hlY2sgaWYgd2UgbmVlZCB0aGlzIGZ1bmN0aW9uIGZvciBIYWJ1ZmFcclxuICAvLyBwcm90ZWN0ZWQgaGFuZGxlSW50ZWdyYXRpb25Db25uZWN0aW9ucyhpZDogc3RyaW5nLCBvYmplY3Q6IEl0ZW0pOiB2b2lkIHtcclxuICAvLyAgIGNvbnN0IHBhcnRzOiBGdXJuaXR1cmVQYXJ0SW50ZWdyYXRpb25bXSA9IFtdO1xyXG4gIC8vICAgY29uc3QgY2hpbGRQYXJ0czogT2JqZWN0M0RbXSA9IG9iamVjdC5jb25maWd1cmFibGUgPyBvYmplY3QuY2hpbGRyZW4gOiBbb2JqZWN0XTtcclxuICAvLyAgIGNvbnN0IGxlbjogbnVtYmVyID0gY2hpbGRQYXJ0cy5sZW5ndGg7XHJcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgLy8gICAgIGNvbnN0IGNoaWxkOiBhbnkgPSA8Q3VzdG9tT2JqZWN0M0Q+Y2hpbGRQYXJ0c1tpXTtcclxuICAvLyAgICAgY29uc3QgY29ubmVjdGlvbjogRnVybml0dXJlUGFydEludGVncmF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRJbnRlZ3JhdGlvbigpO1xyXG4gIC8vICAgICBjb25zdCB2YXJpYXRpb25zOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uW10gPSBbXTtcclxuICAvLyAgICAgaWYgKGNoaWxkLnVzZXJEYXRhICYmIGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbiAmJiBjaGlsZC51c2VyRGF0YS5zZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLklkID0gY2hpbGRQYXJ0cy5maW5kSW5kZXgoYyA9PiBjID09PSBjaGlsZCkudG9TdHJpbmcoKTtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLlN1cHBsaWVyQXJ0aWNsZU5yID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnN1cHBsaWVyQXJ0aWNsZU5yO1xyXG4gIC8vICAgICAgIGNvbm5lY3Rpb24uQnJhbmRJZGVudGlmaWVyID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLmRlY29Ob2RlLmJyYW5kSWQ7XHJcbiAgLy8gICAgICAgY29ubmVjdGlvbi5CcmFuZERlc2NyaXB0aW9uID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lO1xyXG4gIC8vICAgICAgIGNvbm5lY3Rpb24uUG9zaXRpb24gPSBjaGlsZC5wb3NpdGlvbjtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLlJvdGF0aW9uID0gY2hpbGQucm90YXRpb247XHJcbiAgLy8gICAgICAgaWYgKGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbi52YXJpYXRpb25zKSB7XHJcbiAgLy8gICAgICAgICBpZiAoY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnZhcmlhdGlvbnMubGVuZ3RoID09PSAxKSB7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IHZhcmlhdGlvbjogYW55ID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnZhcmlhdGlvbnNbMF07XHJcbiAgLy8gICAgICAgICAgIGNvbm5lY3Rpb24uVmFyaWF0aW9uID0gdmFyaWF0aW9uLmJyYW5kSWQ7XHJcbiAgLy8gICAgICAgICAgIGNvbm5lY3Rpb24uVmFyaWF0aW9uRGVzY3JpcHRpb24gPSB2YXJpYXRpb24uZ2FtZU9iamVjdE5hbWU7XHJcbiAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbi52YXJpYXRpb25zLmxlbmd0aDsgaisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgdmFyaWF0aW9uOiBhbnkgPSBjaGlsZC51c2VyRGF0YS5zZWxlY3Rpb24udmFyaWF0aW9uc1tqXTtcclxuICAvLyAgICAgICAgICAgICBjb25zdCB2YXJpYXRpb25QYXJ0OiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24oKTtcclxuICAvLyAgICAgICAgICAgICB2YXJpYXRpb25QYXJ0LlZhcmlhdGlvbiA9IHZhcmlhdGlvbi5icmFuZElkO1xyXG4gIC8vICAgICAgICAgICAgIHZhcmlhdGlvblBhcnQuVmFyaWF0aW9uRGVzY3JpcHRpb24gPSB2YXJpYXRpb24uZ2FtZU9iamVjdE5hbWU7XHJcbiAgLy8gICAgICAgICAgICAgdmFyaWF0aW9uUGFydC5NYXRlcmlhbElkID0gdmFyaWF0aW9uLm1hdGVyaWFsSWQ7XHJcbiAgLy8gICAgICAgICAgICAgdmFyaWF0aW9uUGFydC5TdXBwbGllckFydGljbGVOciA9IHZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOcjtcclxuICAvLyAgICAgICAgICAgICB2YXJpYXRpb25QYXJ0Lk9wdGlvbiA9IHZhcmlhdGlvbi5vcHRpb25UZXh0O1xyXG4gIC8vICAgICAgICAgICAgIHZhcmlhdGlvbnMucHVzaCh2YXJpYXRpb25QYXJ0KTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBjb25uZWN0aW9uLlZhcmlhdGlvbnMgPSB2YXJpYXRpb25zO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSBlbHNlIHsgLy8gYS1hcnRpa2VsXHJcbiAgLy8gICAgICAgY29ubmVjdGlvbi5JZCA9IGNoaWxkUGFydHMuZmluZEluZGV4KGMgPT4gYyA9PT0gY2hpbGQpLnRvU3RyaW5nKCk7XHJcbiAgLy8gICAgICAgY29ubmVjdGlvbi5CcmFuZElkZW50aWZpZXIgPSBjaGlsZC5tZXRhZGF0YS5pdGVtSWRlbnRpZmllcjtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLkJyYW5kRGVzY3JpcHRpb24gPSBjaGlsZC5tZXRhZGF0YS5pdGVtTmFtZTtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLlBvc2l0aW9uID0gY2hpbGQucG9zaXRpb247XHJcbiAgLy8gICAgICAgY29ubmVjdGlvbi5Sb3RhdGlvbiA9IGNoaWxkLnJvdGF0aW9uO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGNvbnN0IGNvbm5lY3RvcnM6IEZ1cm5pdHVyZUNvbm5lY3RlZFBhcnRJbnRlZ3JhdGlvbltdID0gW107XHJcbiAgLy8gICAgIGNvbnN0IGNsZW46IG51bWJlciA9IGNoaWxkLmNoaWxkcmVuLmxlbmd0aDtcclxuICAvLyAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjbGVuOyBqKyspIHtcclxuICAvLyAgICAgICBjb25zdCBjb25uZWN0b3I6IGFueSA9IGNoaWxkLmNoaWxkcmVuW2pdO1xyXG4gIC8vICAgICAgIGlmICgoY29ubmVjdG9yIGluc3RhbmNlb2YgQ3VzdG9tT2JqZWN0M0QgfHwgY29ubmVjdG9yIGluc3RhbmNlb2YgQ3VzdG9tTWVzaCkgJiYgKGNvbm5lY3RvciBhcyBhbnkpLmNvbm5lY3RlZFRvKSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBjb25uOiBGdXJuaXR1cmVDb25uZWN0ZWRQYXJ0SW50ZWdyYXRpb24gPSBuZXcgRnVybml0dXJlQ29ubmVjdGVkUGFydEludGVncmF0aW9uKCk7XHJcbiAgLy8gICAgICAgICBjb25uLkNvbm5lY3Rpb25MYWJlbCA9IGNvbm5lY3Rvci5uYW1lO1xyXG4gIC8vICAgICAgICAgY29uc3QgZm9yZWlnblBhcnRJZHg6IG51bWJlciA9XHJcbiAgLy8gICAgICAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmNoaWxkcmVuLmZpbmRJbmRleChjID0+IGMubmFtZSA9PT0gKGNvbm5lY3RvciBhcyBhbnkpLmNvbm5lY3RlZFRvKTtcclxuICAvLyAgICAgICAgIGNvbm4uRm9yZWlnbkNvbm5lY3Rpb25MYWJlbCA9IHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmNoaWxkcmVuW2ZvcmVpZ25QYXJ0SWR4XS51c2VyRGF0YS5zZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWU7XHJcbiAgLy8gICAgICAgICBjb25uLkZvcmVpZ25QYXJ0SWQgPSBmb3JlaWduUGFydElkeC50b1N0cmluZygpO1xyXG4gIC8vICAgICAgICAgY29ubi5Qb3NpdGlvbiA9IGNvbm5lY3Rvci5wb3NpdGlvbjtcclxuICAvLyAgICAgICAgIGNvbm4uUm90YXRpb24gPSBjb25uZWN0b3Iucm90YXRpb247XHJcbiAgLy8gICAgICAgICBjb25uZWN0b3JzLnB1c2goY29ubik7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGNvbm5lY3Rpb24uQ29ubmVjdGVkUGFydHMgPSBjb25uZWN0b3JzO1xyXG4gIC8vICAgICBwYXJ0cy5wdXNoKGNvbm5lY3Rpb24pO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy51cHNlcnRGdXJuaXR1cmUoaWQsIHtQYXJ0czogcGFydHN9LCBvYmplY3QpO1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIHByb3RlY3RlZCB1cHNlcnRGdXJuaXR1cmUoaWQ6IHN0cmluZywgb2JqZWN0OiBhbnksIGl0ZW06IEl0ZW0pOiB2b2lkIHtcclxuICAvLyAgIGlmICh0aGlzLl9pbnRlZ3JhdGlvbkVuYWJsZWQgJiYgIWl0ZW0ubWV0YWRhdGEub2Jzb2xldGUpIHtcclxuICAvLyAgICAgY29uc3QgaWR4OiBudW1iZXIgPSB0aGlzLl9mdXJuaXR1cmVDb25maWd1cmF0aW9ucy5maW5kSW5kZXgoZiA9PiBmLklkID09PSBpZCk7XHJcbiAgLy8gICAgIGxldCBmdXJuaXR1cmU6IEZ1cm5pdHVyZUludGVncmF0aW9uO1xyXG4gIC8vICAgICBpZiAoaWR4IDwgMCkge1xyXG4gIC8vICAgICAgIC8vIGVtcHR5IGVudHJ5IGZvciBtcnAgY29kZSwgcmUtdXNlIHRoYXQgb25lXHJcbiAgLy8gICAgICAgaWYgKHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnNbMF0uSWQpIHtcclxuICAvLyAgICAgICAgIGZ1cm5pdHVyZSA9IHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zWzBdO1xyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICBmdXJuaXR1cmUgPSBuZXcgRnVybml0dXJlSW50ZWdyYXRpb24oKTtcclxuICAvLyAgICAgICAgIHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLnB1c2goZnVybml0dXJlKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgZnVybml0dXJlLklkID0gaWQ7XHJcbiAgLy8gICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgZnVybml0dXJlID0gdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnNbaWR4XTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBmdXJuaXR1cmUuTXJwQ29kZSA9IHRoaXMucGVybWFuZW50U3RvcmVTZXJ2aWNlLmNvZGU7XHJcbiAgLy8gICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xyXG4gIC8vICAgICAgIGlmIChmdXJuaXR1cmUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBvYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gIC8vICAgICAgICAgZnVybml0dXJlW2tleV0gPSBvYmplY3Rba2V5XTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIHByb3RlY3RlZCBnZW5lcmF0ZUxheWluZ1BhdHRlcm4oZmxvb3I6IEZsb29yUGxhbmVJdGVtLCBmbG9vclBhdHRlcm46IEZsb29yUGF0dGVybik6IHZvaWQge1xyXG4gIC8vICAgY29uc3QgZmxvb3JQYXR0ZXJuSW5mbzogRmxvb3JQYXR0ZXJuSW5mbyA9IHRoaXMuZ2VuZXJhdGVGbG9vclBhdHRlcm5JbmZvKGZsb29yLCBmbG9vclBhdHRlcm4pO1xyXG4gIC8vICAgZmxvb3IucmVzdG9yZUZsb29yT2JqZWN0KCk7XHJcbiAgLy8gICBjb25zdCBtZXNoTGVmdCA9XHJcbiAgLy8gICAgIHRoaXMuZnVsbDNET2JqZWN0VG9Vc2UuY2hpbGRyZW4uZmluZChtID0+IG0ubmFtZSA9PT0gZmxvb3JQYXR0ZXJuSW5mby5tZXNoSWRMZWZ0KSBhcyBNZXNoO1xyXG4gIC8vICAgdGhpcy5ub3JtYWxpemVNZXNoKG1lc2hMZWZ0KTtcclxuICAvL1xyXG4gIC8vICAgbGV0IG1lc2hSaWdodDogTWVzaCA9IG51bGw7XHJcbiAgLy8gICBpZiAoZmxvb3JQYXR0ZXJuSW5mby5tZXNoSWRSaWdodCAhPT0gbnVsbCkge1xyXG4gIC8vICAgICBtZXNoUmlnaHQgPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlLmNoaWxkcmVuLmZpbmQobSA9PiBtLm5hbWUgPT09IGZsb29yUGF0dGVybkluZm8ubWVzaElkUmlnaHQpIGFzIE1lc2g7XHJcbiAgLy8gICAgIHRoaXMubm9ybWFsaXplTWVzaChtZXNoUmlnaHQpO1xyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICBjb25zdCBmbG9vclNpemU6IFZlY3RvcjMgPSBmbG9vci5zaXplO1xyXG4gIC8vICAgY29uc3QgcGxhbmtTaXplOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcclxuICAvL1xyXG4gIC8vICAgbWVzaExlZnQuZ2VvbWV0cnkuYm91bmRpbmdCb3guZ2V0U2l6ZShwbGFua1NpemUpO1xyXG4gIC8vXHJcbiAgLy8gICBjb25zdCBpdGVtczogRmxvb3JQYXR0ZXJuVHJhbnNmb3JtW10gPSB0aGlzLmZsb29yUGF0dGVyblNlcnZpY2UuZ2VuZXJhdGVQYXR0ZXJuKFxyXG4gIC8vICAgICBmbG9vclBhdHRlcm5JbmZvLmZsb29yUGF0dGVybixcclxuICAvLyAgICAgcGxhbmtTaXplLFxyXG4gIC8vICAgICBmbG9vclNpemUsXHJcbiAgLy8gICAgIGZsb29yUGF0dGVybkluZm8uZmxvb3JQYXR0ZXJuRGlyZWN0aW9uLFxyXG4gIC8vICAgICBmbG9vclBhdHRlcm5JbmZvLmhlYXJ0TGluZVxyXG4gIC8vICAgKTtcclxuICAvL1xyXG4gIC8vICAgLy8gRGVidWdnaW5nIG9wdGlvblxyXG4gIC8vICAgLy8gdGhpcy5fZmxvb3JUaWxlSW50ZXJzZWN0aW9uU2VydmljZS50b2dnbGVEZWJ1ZygpO1xyXG4gIC8vICAgY29uc3QgZmxvb3JDb3VudFJlc3VsdDogRmxvb3JDb3VudFJlc3VsdCA9IHRoaXMuZmxvb3JUaWxlSW50ZXJzZWN0aW9uU2VydmljZS5jb3VudFRpbGVzKFxyXG4gIC8vICAgICBmbG9vci5mbG9vck1lc2gsXHJcbiAgLy8gICAgIGl0ZW1zLFxyXG4gIC8vICAgICBtZXNoTGVmdC5nZW9tZXRyeSxcclxuICAvLyAgICAgKG1lc2hSaWdodCkgPyBtZXNoUmlnaHQuZ2VvbWV0cnkgOiBudWxsLFxyXG4gIC8vICAgICB0cnVlXHJcbiAgLy8gICApO1xyXG4gIC8vXHJcbiAgLy8gICBmbG9vci5tZXRhZGF0YS5mbG9vckNvdW50UmVzdWx0ID0gZmxvb3JDb3VudFJlc3VsdDtcclxuICAvL1xyXG4gIC8vICAgY29uc3QgbGVmdEl0ZW1zOiBGbG9vclBhdHRlcm5UcmFuc2Zvcm1bXSA9IG5ldyBBcnJheTxGbG9vclBhdHRlcm5UcmFuc2Zvcm0+KCk7XHJcbiAgLy8gICBjb25zdCByaWdodEl0ZW1zOiBGbG9vclBhdHRlcm5UcmFuc2Zvcm1bXSA9IG5ldyBBcnJheTxGbG9vclBhdHRlcm5UcmFuc2Zvcm0+KCk7XHJcbiAgLy9cclxuICAvLyAgIGZvciAoY29uc3QgaXRlbSBvZiBmbG9vckNvdW50UmVzdWx0LmZpbHRlcmVkKSB7XHJcbiAgLy8gICAgIGlmIChpdGVtLmlzTGVmdCkge1xyXG4gIC8vICAgICAgIGxlZnRJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIHJpZ2h0SXRlbXMucHVzaChpdGVtKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbltdID0gdGhpcy5zZWxlY3Rpb25zO1xyXG4gIC8vICAgbGV0IHZhcmlhdGlvbkdhbWVPYmplY3Q6IHN0cmluZztcclxuICAvLyAgIGZvciAoY29uc3Qgc2VsZWN0aW9uS2V5IG9mIHNlbGVjdGlvbikge1xyXG4gIC8vICAgICBpZiAoc2VsZWN0aW9uS2V5LmVsZW1lbnRUeXBlID09PSAndmFyaWF0aW9uJykge1xyXG4gIC8vICAgICAgIHZhcmlhdGlvbkdhbWVPYmplY3QgPSBzZWxlY3Rpb25LZXkuZ2FtZU9iamVjdDtcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICBsZXQgZmxvb3JWYXJpYXRpb25NYXRlcmlhbDogYW55O1xyXG4gIC8vICAgaWYgKHZhcmlhdGlvbkdhbWVPYmplY3QgIT09IG51bGwpIHtcclxuICAvLyAgICAgdGhpcy52YXJpYXRpb25TZXJ2aWNlLmxvYWRWYXJpYXRpb25Gb3JNYXRlcmlhbCh0aGlzLmFydGljbGVBc3NldFBhdGgsIHZhcmlhdGlvbkdhbWVPYmplY3QsIGZsb29yLm1ldGFkYXRhLnNjaGVtYSkudGhlbihyZXN1bHQgPT4ge1xyXG4gIC8vICAgICAgIGZsb29yVmFyaWF0aW9uTWF0ZXJpYWwgPSByZXN1bHQ7XHJcbiAgLy8gICAgICAgY29uc3QgdGV4dHVyZTogVGV4dHVyZSA9IGZsb29yVmFyaWF0aW9uTWF0ZXJpYWwubWFwO1xyXG4gIC8vICAgICAgIGlmIChmbG9vclBhdHRlcm5JbmZvLmZsb29yUGF0dGVybkRpcmVjdGlvbiA9PT0gRmxvb3JQYXR0ZXJuRGlyZWN0aW9uLkxZSU5HKSB7XHJcbiAgLy8gICAgICAgICB0ZXh0dXJlLnJvdGF0aW9uID0gTWF0aC5QSSAvIDI7XHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHRleHR1cmUucm90YXRpb24gPSAwO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBjb25zdCBtZXNoTGVmdE1hdGVyaWFsOiBNYXRlcmlhbCB8IE1hdGVyaWFsW10gPSBtZXNoTGVmdC5tYXRlcmlhbDtcclxuICAvLyAgICAgICBjb25zdCBwbGFua01hdGVyaWFsID0gbmV3IE1lc2hTdGFuZGFyZE1hdGVyaWFsKHtcclxuICAvLyAgICAgICAgIGNvbG9yOiAweEZGMDAwMCxcclxuICAvLyAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gIC8vICAgICAgICAgb3BhY2l0eTogMC44XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy9cclxuICAvLyAgICAgICBjb25zdCBwbGFua3NMZWZ0ID1cclxuICAvLyAgICAgICAgIHRoaXMuaW5zdGFuY2VkTWVzaEZyb21GbG9vclBhdHRlcm5UcmFuc2Zvcm0obWVzaExlZnQuZ2VvbWV0cnksIGxlZnRJdGVtcywgcGxhbmtNYXRlcmlhbCk7XHJcbiAgLy8gICAgICAgbGV0IHBsYW5rc1JpZ2h0OiBJbnN0YW5jZWRNZXNoO1xyXG4gIC8vICAgICAgIGlmIChtZXNoUmlnaHQpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IG1lc2hSaWdodE1hdGVyaWFsOiBNYXRlcmlhbCB8IE1hdGVyaWFsW10gPSBtZXNoUmlnaHQubWF0ZXJpYWw7XHJcbiAgLy8gICAgICAgICBwbGFua3NSaWdodCA9IHRoaXMuaW5zdGFuY2VkTWVzaEZyb21GbG9vclBhdHRlcm5UcmFuc2Zvcm0obWVzaFJpZ2h0Lmdlb21ldHJ5LCByaWdodEl0ZW1zLCBwbGFua01hdGVyaWFsKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgY29uc3QgY3VzdG9tRmxvb3JXcmFwcGVyID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgLy8gICAgICAgY3VzdG9tRmxvb3JXcmFwcGVyLmFkZChwbGFua3NMZWZ0KTtcclxuICAvLyAgICAgICBpZiAocGxhbmtzUmlnaHQpIHtcclxuICAvLyAgICAgICAgIGN1c3RvbUZsb29yV3JhcHBlci5hZGQocGxhbmtzUmlnaHQpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBmbG9vci5mbG9vck9iamVjdCA9IGN1c3RvbUZsb29yV3JhcHBlcjtcclxuICAvLyAgICAgICB0aGlzLmZsb29yU2VydmljZS5jb25maWd1cmFibGVGbG9vciA9IGN1c3RvbUZsb29yV3JhcHBlcjtcclxuICAvL1xyXG4gIC8vICAgICAgIC8vIE5vdyB3ZSB1cGRhdGUgdGhlIGRlZmF1bHQgZmxvb3JwbGFuZSB3aXRoIHRoZSBtZXNoXHJcbiAgLy8gICAgICAgZmxvb3IuZmxvb3JNYXRlcmlhbCA9IGZsb29yVmFyaWF0aW9uTWF0ZXJpYWw7XHJcbiAgLy8gICAgICAgdGhpcy5zY2VuZVNlcnZpY2UubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gIC8vICAgICAgIC8vIEVtaXQgdXBkYXRlIHRvZ2dsZUZsb29yRnJhbWUgZXZlbnQuXHJcbiAgLy8gICAgICAgdGhpcy5tZXNzYWdlQnVzLmVtaXQoTWVzc2FnZVR5cGUuRmxvb3JSZWJ1aWxkKTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBwcm90ZWN0ZWQgaW5zdGFuY2VkTWVzaEZyb21GbG9vclBhdHRlcm5UcmFuc2Zvcm0oXHJcbiAgLy8gICBnZW9tOiBCdWZmZXJHZW9tZXRyeSxcclxuICAvLyAgIHBhdHRlcm46IEFycmF5PEZsb29yUGF0dGVyblRyYW5zZm9ybT4sXHJcbiAgLy8gICBtYXRlcmlhbDogTWF0ZXJpYWwgfCBNYXRlcmlhbFtdXHJcbiAgLy8gKSB7XHJcbiAgLy8gICBpZiAocGF0dGVybi5sZW5ndGggPD0gMCkge1xyXG4gIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IHRhcmdldFBsYW5rTWVzaCA9IG5ldyBJbnN0YW5jZWRNZXNoKGdlb20sIG1hdGVyaWFsLCBwYXR0ZXJuLmxlbmd0aCk7XHJcbiAgLy8gICBjb25zdCBkdW1teSA9IG5ldyBPYmplY3QzRCgpO1xyXG4gIC8vICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgY29uc3QgaXRlbTogRmxvb3JQYXR0ZXJuVHJhbnNmb3JtID0gcGF0dGVybltpXTtcclxuICAvLyAgICAgY29uc3QgcG9zaXRpb246IFZlY3RvcjMgPSBpdGVtLnBvc2l0aW9uO1xyXG4gIC8vICAgICBwb3NpdGlvbi55ID0gMC4wMjtcclxuICAvLyAgICAgY29uc3Qgcm90YXRpb246IFZlY3RvcjMgPSBpdGVtLnJvdGF0aW9uO1xyXG4gIC8vICAgICBkdW1teS5wb3NpdGlvbi5zZXQocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueik7XHJcbiAgLy8gICAgIGR1bW15LnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcclxuICAvLyAgICAgZHVtbXkudXBkYXRlTWF0cml4KCk7XHJcbiAgLy9cclxuICAvLyAgICAgdGFyZ2V0UGxhbmtNZXNoLnNldE1hdHJpeEF0KGksIGR1bW15Lm1hdHJpeCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gdGFyZ2V0UGxhbmtNZXNoO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHJvdGVjdGVkIGdlbmVyYXRlRmxvb3JQYXR0ZXJuSW5mbyhpdGVtOiBJdGVtLCBmbG9vclBhdHRlcm46IEZsb29yUGF0dGVybik6IEZsb29yUGF0dGVybkluZm8ge1xyXG4gIC8vICAgdGhpcy5nZW5lcmF0ZVNlbGVjdGVkSW5NZXRhZGF0YShpdGVtKTtcclxuICAvLyAgIGNvbnN0IGluZm86IEZsb29yUGF0dGVybkluZm8gPSB7XHJcbiAgLy8gICAgIG1lc2hJZExlZnQ6IG51bGwsXHJcbiAgLy8gICAgIG1lc2hJZFJpZ2h0OiBudWxsLFxyXG4gIC8vICAgICBmbG9vclBhdHRlcm46IEZsb29yUGF0dGVybi5OT1JNQUwsXHJcbiAgLy8gICAgIGZsb29yUGF0dGVybkRpcmVjdGlvbjogRmxvb3JQYXR0ZXJuRGlyZWN0aW9uLkxZSU5HLFxyXG4gIC8vICAgICBoZWFydExpbmU6IDBcclxuICAvLyAgIH07XHJcbiAgLy9cclxuICAvLyAgIGxldCBmbG9vckdhbWVPYmplY3Q6IHN0cmluZztcclxuICAvLyAgIGZvciAoY29uc3Qgc2VsZWN0aW9uS2V5IG9mIHRoaXMuc2VsZWN0aW9ucykge1xyXG4gIC8vICAgICBpZiAoc2VsZWN0aW9uS2V5Lm5vZGVUeXBlID09PSAnQVJUJykge1xyXG4gIC8vICAgICAgIGZsb29yR2FtZU9iamVjdCA9IHNlbGVjdGlvbktleS5nYW1lT2JqZWN0O1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy9cclxuICAvLyAgIGluZm8uaGVhcnRMaW5lID0gTnVtYmVyKHRoaXMuZmxvb3JTZXJ2aWNlLmZsb29yQ2VudGVyTGluZVhBeGlzKTtcclxuICAvLyAgIC8vIFRPRE8gY29udmVydCBmbG9vclBhdHRlcm5EaXJlY3Rpb24gdG8gdHlwZSBudW1iZXIgdG8gbGV0IHRoZSB1c2VyIHVzZSBjdXN0b20gcm90YXRpb24sIGZvciBub3cgdGhlcmUgYXJlIG9ubHkgMiBvcHRpb25zIGJhc2VkIG9uIGVudW1cclxuICAvLyAgIGlmICh0aGlzLmZsb29yU2VydmljZS5mbG9vclJvdGF0aW9uID09PSAwKSB7XHJcbiAgLy8gICAgIGluZm8uZmxvb3JQYXR0ZXJuRGlyZWN0aW9uID0gRmxvb3JQYXR0ZXJuRGlyZWN0aW9uLkxZSU5HO1xyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgaW5mby5mbG9vclBhdHRlcm5EaXJlY3Rpb24gPSBGbG9vclBhdHRlcm5EaXJlY3Rpb24uU1RBTkRJTkc7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBpbmZvLmZsb29yUGF0dGVybiA9IGZsb29yUGF0dGVybjtcclxuICAvLyAgIGluZm8ubWVzaElkTGVmdCA9IGZsb29yR2FtZU9iamVjdDtcclxuICAvLyAgIGlmIChpbmZvLmZsb29yUGF0dGVybiA9PT0gRmxvb3JQYXR0ZXJuLkhPTjQ1IHx8IGluZm8uZmxvb3JQYXR0ZXJuID09PSBGbG9vclBhdHRlcm4uSE9ONjApIHtcclxuICAvLyAgICAgaW5mby5tZXNoSWRSaWdodCA9IGByXyR7Zmxvb3JHYW1lT2JqZWN0fWA7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBpZiAoaW5mby5mbG9vclBhdHRlcm4gPT09IEZsb29yUGF0dGVybi5IRVJSSU5HQk9ORSkge1xyXG4gIC8vICAgICBpbmZvLm1lc2hJZFJpZ2h0ID0gaW5mby5tZXNoSWRMZWZ0O1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyBjb25zdCBhZm1ldGluZyA9IHNlbGVjdGVkLmZpbmQocyA9PiBzLnF1ZXN0aW9uLnRvTG93ZXJDYXNlKCkgPT09ICdwbGFuayBhZm1ldGluZycpO1xyXG4gIC8vIGxldCBhZm1ldGluZ1N0cmluZzogc3RyaW5nID0gYWZtZXRpbmcuYW5zd2VyLnRvTG93ZXJDYXNlKCk7XHJcbiAgLy8gYWZtZXRpbmdTdHJpbmcgPSBhZm1ldGluZ1N0cmluZy5zdWJzdHIoYWZtZXRpbmdTdHJpbmcubGFzdEluZGV4T2YoJyAnKSArIDEpO1xyXG4gIC8vIGNvbnN0IGxlZ1BhdHJvb25BbnN3ZXIgPSBzZWxlY3RlZC5maW5kKHMgPT4gcy5xdWVzdGlvbi50b0xvd2VyQ2FzZSgpID09PSAnbGVnIHBhdHJvb24nKS5hbnN3ZXIudG9Mb3dlckNhc2UoKTtcclxuICAvLyBsZXQgbGVnUGF0cm9vblN0cmluZyA9ICcnO1xyXG4gIC8vIGNvbnN0IGhhcnRsaW5lVHlwZSA9IHNlbGVjdGVkLmZpbmQocyA9PiBzLnF1ZXN0aW9uLnRvTG93ZXJDYXNlKCkgPT09ICdoYXJ0bGlqbicpO1xyXG4gIC8vXHJcbiAgLy8gaWYgKGhhcnRsaW5lVHlwZSAmJiBoYXJ0bGluZVR5cGUuYW5zd2VyLnRvTG93ZXJDYXNlKCkgPT09ICdhYW5nZXBhc3QnKSB7XHJcbiAgLy8gICBjb25zdCBoYXJ0bGluZVZhbHVlID0gc2VsZWN0ZWQuZmluZChzID0+IHMucXVlc3Rpb24udG9Mb3dlckNhc2UoKSA9PT0gJ2hhcnRsaWpuX2FhbmdlcGFzdCcpO1xyXG4gIC8vICAgaWYgKGhhcnRsaW5lVmFsdWUgJiYgaGFydGxpbmVWYWx1ZS51c2VySW5wdXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgLy8gICAgIGluZm8uaGVhcnRMaW5lID0gTnVtYmVyKGhhcnRsaW5lVmFsdWUudXNlcklucHV0VmFsdWUpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vXHJcbiAgLy8gc3dpdGNoICh0cnVlKSB7XHJcbiAgLy8gICBjYXNlIGxlZ1BhdHJvb25BbnN3ZXIuaW5kZXhPZigncmVjaHQnKSAhPT0gLTE6XHJcbiAgLy8gICAgIGxlZ1BhdHJvb25TdHJpbmcgPSAnOTAnO1xyXG4gIC8vICAgICBpbmZvLmZsb29yUGF0dGVybiA9IEZsb29yUGF0dGVybi5OT1JNQUw7XHJcbiAgLy8gICAgIGJyZWFrO1xyXG4gIC8vICAgY2FzZSBsZWdQYXRyb29uQW5zd2VyLmluZGV4T2YoJ2dyYWF0JykgIT09IC0xOlxyXG4gIC8vICAgICBsZWdQYXRyb29uU3RyaW5nID0gJzkwJztcclxuICAvLyAgICAgaW5mby5mbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uSEVSUklOR0JPTkU7XHJcbiAgLy8gICAgIGJyZWFrO1xyXG4gIC8vICAgY2FzZSBsZWdQYXRyb29uQW5zd2VyLmluZGV4T2YoJzYwJykgIT09IC0xOlxyXG4gIC8vICAgICBsZWdQYXRyb29uU3RyaW5nID0gJzYwJztcclxuICAvLyAgICAgaW5mby5mbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uSE9ONjA7XHJcbiAgLy8gICAgIGJyZWFrO1xyXG4gIC8vICAgY2FzZSBsZWdQYXRyb29uQW5zd2VyLmluZGV4T2YoJzQ1JykgIT09IC0xOlxyXG4gIC8vICAgICBsZWdQYXRyb29uU3RyaW5nID0gJzQ1JztcclxuICAvLyAgICAgaW5mby5mbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uSE9ONDU7XHJcbiAgLy8gICAgIGJyZWFrO1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIGluZm8ubWVzaElkTGVmdCA9IGAke2FmbWV0aW5nU3RyaW5nfV8ke2xlZ1BhdHJvb25TdHJpbmd9YDtcclxuICAvLyBpZiAoIGluZm8uZmxvb3JQYXR0ZXJuID09PSBGbG9vclBhdHRlcm4uSE9ONDUgfHwgaW5mby5mbG9vclBhdHRlcm4gPT09IEZsb29yUGF0dGVybi5IT042MCkge1xyXG4gIC8vICAgaW5mby5tZXNoSWRSaWdodCA9IGByXyR7YWZtZXRpbmdTdHJpbmd9XyR7bGVnUGF0cm9vblN0cmluZ31gO1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIGlmIChpbmZvLmZsb29yUGF0dGVybiA9PT0gRmxvb3JQYXR0ZXJuLkhFUlJJTkdCT05FKSB7XHJcbiAgLy8gICBpbmZvLm1lc2hJZFJpZ2h0ID0gaW5mby5tZXNoSWRMZWZ0O1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIGNvbnN0IGxlZ1JpY2h0aW5nQW5zd2VyID0gc2VsZWN0ZWQuZmluZChzID0+IHMucXVlc3Rpb24udG9Mb3dlckNhc2UoKSA9PT0gJ2xlZyByaWNodGluZycpLmFuc3dlci50b0xvd2VyQ2FzZSgpO1xyXG4gIC8vIGluZm8uZmxvb3JQYXR0ZXJuRGlyZWN0aW9uID1cclxuICAvLyAobGVnUmljaHRpbmdBbnN3ZXIuaW5kZXhPZigndmVydGljYWFsJykgIT09IC0xKSA/IEZsb29yUGF0dGVybkRpcmVjdGlvbi5TVEFORElORyA6IEZsb29yUGF0dGVybkRpcmVjdGlvbi5MWUlORztcclxuXHJcbiAgLy8gICByZXR1cm4gaW5mbztcclxuICAvLyB9XHJcblxyXG4gIC8vIHByb3RlY3RlZCBnZW5lcmF0ZVNlbGVjdGVkSW5NZXRhZGF0YShpdGVtOiBJdGVtKTogdm9pZCB7XHJcbiAgLy8gICBjb25zdCBjbG9uZVNlbGVjdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0aW9ucykpO1xyXG4gIC8vICAgY2xvbmVTZWxlY3Rpb25zLmZvckVhY2gocyA9PiB7XHJcbiAgLy8gICAgIHMuaW1hZ2VEYXRhID0gdW5kZWZpbmVkO1xyXG4gIC8vICAgICBzLmltYWdlRGF0YUxhc3RBbnN3ZXIgPSB1bmRlZmluZWQ7XHJcbiAgLy8gICAgIGlmIChzLmFkZGFibGVzKSB7XHJcbiAgLy8gICAgICAgcy5hZGRhYmxlcy5mb3JFYWNoKGEgPT4ge1xyXG4gIC8vICAgICAgICAgYS5pbWFnZURhdGEgPSB1bmRlZmluZWQ7XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIC8vICAgaXRlbS5tZXRhZGF0YS5kZWNvcyA9IEFycmF5LmZyb20odGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmRlY29Ob2Rlcyk7XHJcbiAgLy8gICBpdGVtLm1ldGFkYXRhLnNlbGVjdGlvbnMgPSBjbG9uZVNlbGVjdGlvbnM7XHJcbiAgLy8gfVxyXG5cclxuICBwcm90ZWN0ZWQgbm9ybWFsaXplTWVzaChtZXNoOiBNZXNoKSB7XHJcbiAgICBjb25zdCBtZXNoU2l6ZSA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICBtZXNoLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xyXG4gICAgbWVzaC5nZW9tZXRyeS5ib3VuZGluZ0JveC5nZXRTaXplKG1lc2hTaXplKTtcclxuICAgIGlmIChtZXNoU2l6ZS56ID4gbWVzaFNpemUueCkge1xyXG4gICAgICBtZXNoLmdlb21ldHJ5LnJvdGF0ZVkoTWF0aC5QSSAvIDIpO1xyXG4gICAgfVxyXG4gICAgbWVzaC5nZW9tZXRyeS5jZW50ZXIoKTtcclxuICAgIG1lc2guZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcbiAgICBjb25zdCBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xyXG4gICAgbWVzaC5nZW9tZXRyeS5ib3VuZGluZ0JveC5nZXRDZW50ZXIoY2VudGVyKTtcclxuICAgIG1lc2gucG9zaXRpb24uY29weShjZW50ZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHNldEluc3RhbmNlVG9Db25maWd1cmUocmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogUHJvbWlzZTxDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0PiB7XHJcbiAgICBpZiAocmVzdWx0LnJlc3VsdFR5cGUgIT09IFJlc3VsdFR5cGUuVGltZW91dCkge1xyXG4gICAgICBpZiAocmVzdWx0Lmluc3RhbmNlSWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2Uuc2V0SW5zdGFuY2UocmVzdWx0Lmluc3RhbmNlSWQpXHJcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZXMucHVzaChuZXcgQ29uZmlndXJhdG9yRXJyb3JNZXNzYWdlKGUpKTtcclxuICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QocmVzdWx0KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmluaXROb2RlSW5zdGFuY2UocmVzdWx0Lmdvb2RJZCwgdHJ1ZSlcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlcy5wdXNoKG5ldyBDb25maWd1cmF0b3JFcnJvck1lc3NhZ2UoZSkpO1xyXG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdChyZXN1bHQpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICByZXN1bHQuaW5zdGFuY2VJZCA9IHJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gdGltZW91dCAvIHVuYWJsZSB0byBzZXQgaW5zdGFuY2VpZFxyXG4gICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZXMucHVzaChuZXcgQ29uZmlndXJhdG9yRXJyb3JNZXNzYWdlKCdFUlJPUl9TRVRUSU5HX0lOU1RBTkNFX0lEJykpO1xyXG4gICAgICAgICAgUHJvbWlzZS5yZWplY3QocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLnNldEluc3RhbmNlKHJlc3VsdC5pbnN0YW5jZUlkKVxyXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2VzLnB1c2gobmV3IENvbmZpZ3VyYXRvckVycm9yTWVzc2FnZShlKSk7XHJcbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KHJlc3VsdCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0U2VsZWN0aW9uc0FuZERlY29zRnJvbU1ldGFkYXRhKHJlc3VsdDogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IHZvaWQge1xyXG4gICAgaWYgKHJlc3VsdC5zZWxlY3Rpb25zICYmIHJlc3VsdC5kZWNvcykge1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2Uuc2V0U2VsZWN0aW9ucyhyZXN1bHQuc2VsZWN0aW9ucyk7XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZXREZWNvTm9kZXMoQXJyYXkuZnJvbShyZXN1bHQuZGVjb3MudmFsdWVzKCkpKTtcclxuICAgICAgcmVzdWx0Lm9ic29sZXRlID0gdHJ1ZTtcclxuICAgICAgaWYgKHJlc3VsdC5yZXN1bHRUeXBlICE9PSBSZXN1bHRUeXBlLkNvbmZpZ3VyYXRpb25Ob3RGaXhlZCkge1xyXG4gICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5PYnNvbGV0ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zLmxlbmd0aCA8IDIgfHwgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmRlY29Ob2Rlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlcy5wdXNoKG5ldyBDb25maWd1cmF0b3JFcnJvck1lc3NhZ2UoJ05PX1NFTEVDVElPTlNfT1JfREVDT1MnLCAnTk9fU0VMRUNUSU9OU19PUl9ERUNPU19JTkZPJykpO1xyXG4gICAgICB9XHJcbiAgICAgIHRocm93IHJlc3VsdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzZWxlY3Rpb25QdWJsaXNoZWQoc2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoKHNlbGVjdGlvbi5oaWVyYXJjaGljYWxQdWJsaWNhdGlvbkNvZGUgPT09IG51bGwpIHx8ICgoc2VsZWN0aW9uLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSAmIDIpID4gMCkpICYmXHJcbiAgICAgIChcclxuICAgICAgICAoc2VsZWN0aW9uLm5vZGVUeXBlID09PSBOb2RlVHlwZS5RdWVzdGlvbiAmJlxyXG4gICAgICAgICAgKCgoc2VsZWN0aW9uLnF1ZXN0aW9uUHVibGljYXRpb25Db2RlICYgMikgPiAwKSB8fFxyXG4gICAgICAgICAgICBzZWxlY3Rpb24ucXVlc3Rpb25QdWJsaWNhdGlvbkNvZGUgPT09IG51bGwgfHwgc2VsZWN0aW9uLnF1ZXN0aW9uUHVibGljYXRpb25Db2RlID09PSB1bmRlZmluZWQpKSB8fFxyXG4gICAgICAgIChzZWxlY3Rpb24ubm9kZVR5cGUgPT09IE5vZGVUeXBlLkFuc3dlciAmJlxyXG4gICAgICAgICAgKCgoc2VsZWN0aW9uLmFuc3dlclB1YmxpY2F0aW9uQ29kZSAmIDIpID4gMCkgfHxcclxuICAgICAgICAgICAgc2VsZWN0aW9uLmFuc3dlclB1YmxpY2F0aW9uQ29kZSA9PT0gbnVsbCB8fCBzZWxlY3Rpb24uYW5zd2VyUHVibGljYXRpb25Db2RlID09PSB1bmRlZmluZWQpKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNsZWFudXBCZWZvcmVQcmVzZXRMb2FkKCk6IHZvaWQge1xyXG4gICAgTWF0ZXJpYWxVdGlscy5DbGVhckNhY2hlcygpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAqIENsZWFyIHZhcmlhYmxlcyB0byBsZXQgb2JqZWN0cyBiZWluZyBkaXNwb3NlZCBwcm9wZXJseVxyXG4gICovXHJcbiAgcHJvdGVjdGVkIGhhbmRsZUFmdGVyUHJlc2V0TG9hZCgpOiB2b2lkIHtcclxuICAgIC8vIG1ha2Ugc3VyZSBub3RoaW5nIGlzIGtlZXBpbmcgYSBsb2NrXHJcbiAgICB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2Uuc2V0SW5zdGFuY2UobnVsbCk7XHJcbiAgICAvLyBjbGVhblxyXG4gICAgdGhpcy5jbGVhbnVwKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xlYW51cCgpOiB2b2lkIHtcclxuICAgIE9iamVjdFV0aWxzLkRpc3Bvc2VPYmplY3QodGhpcy5mdWxsM0RPYmplY3RUb1VzZSk7XHJcbiAgICB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAgPSB1bmRlZmluZWQ7XHJcbiAgICBPYmplY3RVdGlscy5EaXNwb3NlT2JqZWN0KHRoaXMuX2FjdGl2ZUNoaWxkRWxlbWVudCk7XHJcbiAgICB0aGlzLl9hY3RpdmVDaGlsZEVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnBsYWNlZEFkanVzdGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9wbGFjZWRBZGRhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fYWRqdXN0YWJsZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2FkZGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2FuQ29ubmVjdFNlbGVjdGlvbnMoc2VsMTogU2VsZWN0aW9uLCBzZWwyOiBTZWxlY3Rpb24pOiBib29sZWFuIHtcclxuICAgIGlmICghc2VsMS5kZWNvTm9kZSB8fCAhc2VsMi5kZWNvTm9kZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBsZXQgY2FuQ29ubmVjdDogYm9vbGVhbiA9IHNlbDIuZGVjb05vZGUudHlwZSAhPT0gRGVjb05vZGVUeXBlLlBhcnQ7XHJcbiAgICBpZiAoIWNhbkNvbm5lY3QpIHtcclxuICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSBzZWwxLmRlY29Ob2RlLmNvbm5lY3RvcnMubGVuZ3RoO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbGVuaTogbnVtYmVyID0gc2VsMi5kZWNvTm9kZS5jb25uZWN0b3JzLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgbGVuaTsgaWkrKykge1xyXG4gICAgICAgICAgY2FuQ29ubmVjdCA9IFNjZW5lM0RVdGlsLkNhblNlbGVjdG9yQ29ubmVjdChzZWwxLmRlY29Ob2RlLmNvbm5lY3RvcnMsIHNlbDEuZGVjb05vZGUuY29ubmVjdG9yc1tpXSwgc2VsMi5kZWNvTm9kZS5jb25uZWN0b3JzW2lpXSk7XHJcbiAgICAgICAgICBpZiAoY2FuQ29ubmVjdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNhbkNvbm5lY3Q7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlQW5zd2VyU2VsZWN0ZWQoYW5zd2VyOiBBbnN3ZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Fuc3dlclNlbGVjdGVkLnB1c2goYW5zd2VyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBoYW5kbGVTZWxlY3Rpb25TZWxlY3RlZChjaG9zZW5PcHRpb246IFNlbGVjdG9yU3RydWN0dXJlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb25zU2VsZWN0ZWQucHVzaChjaG9zZW5PcHRpb24ub3B2VHJlZU5vZGVIaWVyYXJjaHkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbmZpZ3VyYWJsZUl0ZW0oaXRlbU5hbWU6IHN0cmluZyk6IE9iamVjdDNEIHtcclxuICAgIGNvbnN0IGl0ZW06IE9iamVjdDNEID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgICBpdGVtLm5hbWUgPSBpdGVtTmFtZSArICdfY2xvbmUnO1xyXG4gICAgaXRlbS52aXNpYmxlID0gdHJ1ZTtcclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgLy8gQHRzLWlnbm9yZVxyXG4gIC8vIHByb3RlY3RlZCBjcmVhdGVQb3NpdGlvbkFuaW1hdGlvbihvYmplY3Q6IE9iamVjdDNELCBmcm9tOiBWZWN0b3IzLCB0bzogVmVjdG9yMywgZWFzaW5nOiBUV0VFTi5FYXNpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAvLyAgIGNvbnN0IHR3ZWVuRnJvbTogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCkuY29weShmcm9tKTtcclxuICAvLyAgIGNvbnN0IHR3ZWVuID0gbmV3IFRXRUVOLlR3ZWVuKHR3ZWVuRnJvbSlcclxuICAvLyAgICAgLnRvKHRvLCAxMDAwKVxyXG4gIC8vICAgICAuZWFzaW5nKGVhc2luZylcclxuICAvLyAgICAgLm9uVXBkYXRlKCgpID0+IHtcclxuICAvLyAgICAgICBvYmplY3QucG9zaXRpb24uY29weSh0d2VlbkZyb20pO1xyXG4gIC8vICAgICAgIHRoaXMuc2NlbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICAvLyBAdHMtaWdub3JlXHJcbiAgLy8gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB0d2Vlbi5vbkNvbXBsZXRlKHJlc29sdmUuYmluZCh0aGlzLCB0d2VlbikpLm9uU3RvcChyZWplY3QpLnN0YXJ0KCkpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHJvdGVjdGVkIGFzeW5jIGFuaW1hdGVDaGFuZ2VzKGZ1cm5pdHVyZTogSXRlbSwgY2hhbmdlczogQ2hhbmdlc0ludGVyZmFjZVtdKTogUHJvbWlzZTx2b2lkW10+IHtcclxuICAvLyAgIC8vIGl0J3MgY2hyaXN0bWFzc3NcclxuICAvLyAgIGNvbnN0IGFuaW1hdGlvbnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xyXG4gIC8vICAgaWYgKGZ1cm5pdHVyZSBpbnN0YW5jZW9mIEN1c3RvbUZsb29ySXRlbSkge1xyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgLy8gICAgICAgY29uc3QgZWFzaW5nOiBUV0VFTi5FYXNpbmcgPSAhY2hhbmdlc1tpXS5vbGRQb3NpdGlvbiA/IFRXRUVOLkVhc2luZy5FeHBvbmVudGlhbC5PdXQgOlxyXG4gIC8vICAgICAgICAgKCFjaGFuZ2VzW2ldLm5ld1Bvc2l0aW9uID8gVFdFRU4uRWFzaW5nLkV4cG9uZW50aWFsLk91dCA6IFRXRUVOLkVhc2luZy5FeHBvbmVudGlhbC5Jbk91dCk7XHJcbiAgLy8gICAgICAgY29uc3QgZnJvbTogVmVjdG9yMyA9XHJcbiAgLy8gICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgLy8gICAgICAgICBjaGFuZ2VzW2ldLm9sZFBvc2l0aW9uID8gbmV3IFZlY3RvcjMoKS5jb3B5KGNoYW5nZXNbaV0ub2xkUG9zaXRpb24pIDogbmV3IFZlY3RvcjMoKS5jb3B5KGNoYW5nZXNbaV0ubmV3UG9zaXRpb24pLnNldFkoMTApO1xyXG4gIC8vICAgICAgIGNvbnN0IHRvOiBWZWN0b3IzID1cclxuICAvLyAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAvLyAgICAgICAgIGNoYW5nZXNbaV0ubmV3UG9zaXRpb24gPyBuZXcgVmVjdG9yMygpLmNvcHkoY2hhbmdlc1tpXS5uZXdQb3NpdGlvbikgOiBuZXcgVmVjdG9yMygpLmNvcHkoY2hhbmdlc1tpXS5vbGRQb3NpdGlvbikuc2V0WSgxMCk7XHJcbiAgLy8gICAgICAgY29uc3Qgb2JqOiBPYmplY3QzRCA9IGZ1cm5pdHVyZS5nZXRPYmplY3RCeU5hbWUoY2hhbmdlc1tpXS5uYW1lKTtcclxuICAvLyAgICAgICBpZiAoIWZyb20uZXF1YWxzKHRvKSkge1xyXG4gIC8vICAgICAgICAgYW5pbWF0aW9ucy5wdXNoKFxyXG4gIC8vICAgICAgICAgICB0aGlzLmNyZWF0ZVBvc2l0aW9uQW5pbWF0aW9uKG9iaiwgZnJvbSwgdG8sIGVhc2luZylcclxuICAvLyAgICAgICAgICk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoYW5pbWF0aW9ucyk7XHJcbiAgLy8gfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xvbmVTZWxlY3Rpb25zKCk6IFNlbGVjdGlvbltdIHtcclxuICAgIGNvbnN0IGNsb25lU2VsZWN0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3Rpb25zKSk7XHJcbiAgICBjbG9uZVNlbGVjdGlvbnMuZm9yRWFjaChzID0+IHtcclxuICAgICAgcy5pbWFnZURhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHMuaW1hZ2VEYXRhTGFzdEFuc3dlciA9IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKHMuYWRkYWJsZXMpIHtcclxuICAgICAgICBzLmFkZGFibGVzLmZvckVhY2goYSA9PiB7XHJcbiAgICAgICAgICBhLmltYWdlRGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY2xvbmVTZWxlY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZUJ1aWxkT2JqZWN0KG5ld0l0ZW06IE9iamVjdDNELCByZXN1bHRPYmplY3Q6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QpOiBQcm9taXNlPENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+IHtcclxuICAgIGNvbnN0IGNsb25lU2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSB0aGlzLmNsb25lU2VsZWN0aW9ucygpO1xyXG4gICAgbmV3SXRlbS52aXNpYmxlID0gdHJ1ZTtcclxuICAgIG5ld0l0ZW0ubmFtZSA9IHJlc3VsdE9iamVjdC5hcnRpY2xlTmFtZTtcclxuICAgIG5ld0l0ZW0udXNlckRhdGEucm9vdE9iamVjdCA9IHRydWU7XHJcblxyXG4gICAgaWYgKHJlc3VsdE9iamVjdC5wb3NpdGlvbikge1xyXG4gICAgICBuZXdJdGVtLnBvc2l0aW9uLmNvcHkocmVzdWx0T2JqZWN0LnBvc2l0aW9uKTtcclxuICAgIH1cclxuICAgIC8vIFRPRE8gYXNrIHdoeSBpdCBjb3VsZCBhbHNvIGJlIGFuIG51bWJlclxyXG4gICAgaWYgKHJlc3VsdE9iamVjdC5yb3RhdGlvbiAmJiByZXN1bHRPYmplY3Qucm90YXRpb24gaW5zdGFuY2VvZiBFdWxlcikge1xyXG4gICAgICBuZXdJdGVtLnJvdGF0aW9uLmNvcHkocmVzdWx0T2JqZWN0LnJvdGF0aW9uKTtcclxuICAgIH0gZWxzZSBpZiAocmVzdWx0T2JqZWN0LmRlZmF1bHQxODAgJiYgIXJlc3VsdE9iamVjdC5yb3RhdGlvbikge1xyXG4gICAgICBuZXdJdGVtLnJvdGF0aW9uLnNldCh0aGlzLmRlZmF1bHRSb3RhdGlvbi54LCB0aGlzLmRlZmF1bHRSb3RhdGlvbi55LCB0aGlzLmRlZmF1bHRSb3RhdGlvbi56KTtcclxuICAgICAgbmV3SXRlbS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXN1bHRPYmplY3Qub2JqZWN0ID0gbmV3SXRlbTtcclxuICAgIHJlc3VsdE9iamVjdC5zZWxlY3Rpb25zID0gY2xvbmVTZWxlY3Rpb25zO1xyXG4gICAgcmVzdWx0T2JqZWN0LmRlY29zID0gQXJyYXkuZnJvbSh0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZGVjb05vZGVzKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0T2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzTW92ZWFibGVPYmplY3Qob2JqOiBPYmplY3QzRCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG9iai51c2VyRGF0YSAmJiBvYmoudXNlckRhdGEuc2VsZWN0aW9uICYmIG9iai51c2VyRGF0YS5zZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZyA9PT0gSGRlY29Qb3NpdGlvbmluZy5WYXJpYWJsZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBhZGRFbGVtZW50T25Db25uZWN0b3IoY3VycmVudEl0ZW06IE9iamVjdDNELCBlbGVtZW50OiBPYmplY3QzRCwgY29ubmVjdG9yOiBzdHJpbmcsIGNvbm5lY3RlZE5vZGVJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBUT0RPIHRoaXMgc2hvdWxkIGRvIHNvbWV0aGluZywgYnV0IG5vdCBzdXJlIHdoYXRcclxuXHJcbiAgICAvLyBjb25zdCBjb25uZWN0b3JGcm9tRWxlbWVudCA9IGN1cnJlbnRJdGVtLmNvbm5lY3RvckZyb21FbGVtZW50KGVsZW1lbnQudXNlckRhdGEuc2VsZWN0aW9uKTtcclxuICAgIC8vIGNvbnN0IGlkRnJvbUJhc2VFbGVtZW50OiBudW1iZXIgPSBjb25uZWN0ZWROb2RlSWQgPyBjb25uZWN0ZWROb2RlSWQgOiBjb25uZWN0b3JGcm9tRWxlbWVudC5jb25uZWN0ZWROb2RlSWQ7XHJcbiAgICAvLyBjb25zdCBiYXNlRWxlbWVudDogT2JqZWN0M0RbXSA9IGN1cnJlbnRJdGVtLmdldE9iamVjdHNCeVVzZXJEYXRhUHJvcCgnc2VsZWN0aW9uJywgJ25vZGVJZCcsIGlkRnJvbUJhc2VFbGVtZW50KTtcclxuICAgIC8vXHJcbiAgICAvLyBjb25zdCBpdGVtOiBJdGVtID0gT2JqZWN0VXRpbHMuR2V0UGFyZW50SXRlbShlbGVtZW50KTtcclxuICAgIC8vIGlmIChpdGVtKSB7XHJcbiAgICAvLyAgIGNvbnN0IGNvbm46IHN0cmluZyA9XHJcbiAgICAvLyAgICAgYXdhaXQgdGhpcy5lbGVtZW50U2VydmljZS5wbGFjZUVsZW1lbnRPbkNvbm5lY3RvcihcclxuICAgIC8vICAgICAgIGl0ZW0ubWV0YWRhdGEuaXRlbUlkLFxyXG4gICAgLy8gICAgICAgZWxlbWVudCxcclxuICAgIC8vICAgICAgIGJhc2VFbGVtZW50Lmxlbmd0aCA+IDAgPyBiYXNlRWxlbWVudFswXSA6IG51bGwsXHJcbiAgICAvLyAgICAgICBmYWxzZSxcclxuICAgIC8vICAgICAgIGNvbm5lY3RvcixcclxuICAgIC8vICAgICAgIGZhbHNlXHJcbiAgICAvLyAgICAgKTtcclxuICAgIC8vICAgdGhpcy5zYXZlRWxlbWVudENvbm5lY3RvcihlbGVtZW50LCBjb25uKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzYXZlRWxlbWVudENvbm5lY3RvcihlbGVtZW50OiBPYmplY3QzRCwgY29ubmVjdG9yOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIGlmIChlbGVtZW50ICYmIGVsZW1lbnQudXNlckRhdGEgJiYgZWxlbWVudC51c2VyRGF0YS5zZWxlY3Rpb24pIHtcclxuICAgIC8vICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAudXBkYXRlRWxlbWVudENvbm5lY3RvcihlbGVtZW50LnVzZXJEYXRhLnNlbGVjdGlvbiwgY29ubmVjdG9yLCB0aGlzLmJhc2VFbGVtZW50Tm9kZUlkKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRJZGVudGlmaWVyRnJvbVNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7c2VsZWN0aW9uLmRlY29Ob2RlID8gc2VsZWN0aW9uLmRlY29Ob2RlLm5vZGVJZCArICdfJyA6ICcnfSR7c2VsZWN0aW9uLm5vZGVJZH1gO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5wbGFjZWRBZGp1c3RhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fcGxhY2VkQWRkYWJsZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2FkanVzdGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9hZGRhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgLy8gdGhpcy5fcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTtcclxuICAgIC8vIHRvZG86IGNoZWNrIHRoaXNcclxuICAgIC8vIHRoaXMuX2VsZW1lbnRTZXJ2aWNlLnJlbW92ZUVsZW1lbnQodGhpcy5hY3RpdmVJbnN0YW5jZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBtYXRlcmlhbElkIG9mIHRoZSBwYXJlbnQgdXAgdGhlIHRyZWUgdW50aWwgcHJlc2VudGlvbmxldmVsIDEgaXMgcmVhY2hlZFxyXG4gICAqIEBwYXJhbSBpZFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGdldE1hdGVyaWFsSWRGcm9tUGFyZW50KGlkOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaWR4OiBudW1iZXIgPSB0aGlzLnNlbGVjdGlvbnMuZmluZEluZGV4KHMgPT4gcy5ub2RlID09PSBpZCk7XHJcbiAgICBsZXQgY3VycmVudExldmVsOiBudW1iZXIgPSA5OTk7XHJcbiAgICBpZiAoaWR4ID4gLTEpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IGlkeDsgaSA+IDA7IGktLSkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uc1tpXTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID49IGN1cnJlbnRMZXZlbCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN1cnJlbnRMZXZlbCA9IHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbDtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLmhkZWNvR2FtZU9iamVjdCkge1xyXG4gICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5oZGVjb0dhbWVPYmplY3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFkanVzdGFibGVzKGNoZWNrR2FtZU9iamVjdDogYm9vbGVhbiA9IHRydWUsIGNoZWNrVHlwZTogYm9vbGVhbiA9IHRydWUpOiBTZWxlY3Rpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25zLmZpbHRlcihzID0+IHtcclxuICAgICAgY29uc3Qgbm9kZTogRGVjb05vZGUgPSBzLmRlY29Ob2RlO1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIHJldHVybiBub2RlICYmIChjaGVja0dhbWVPYmplY3QgPyBub2RlLmdhbWVPYmplY3ROYW1lIDogdHJ1ZSkgJiYgKGNoZWNrVHlwZSA/IG5vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlBhcnQgOiB0cnVlKSAmJiBub2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGp1c3RhYmxlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0VmFyaWF0aW9ucygpOiBhbnlbXSB7XHJcbiAgICBpZiAodGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmRlY29Ob2Rlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5kZWNvTm9kZXMuZmlsdGVyKChkZWNvOiBEZWNvTm9kZSkgPT4ge1xyXG4gICAgICByZXR1cm4gZGVjby50eXBlID09PSBEZWNvTm9kZVR5cGUuVmFyaWF0aW9uO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlQWRqdXN0YWJsZShpdGVtOiBPYmplY3QzRCwgYWRqOiBTZWxlY3Rpb24pOiBPYmplY3QzRCB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlID8gdGhpcy5mdWxsM0RPYmplY3RUb1VzZS5nZXRPYmplY3RCeU5hbWUoYWRqLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lIHx8IGFkai5nYW1lT2JqZWN0KSA6IG51bGw7XHJcbiAgICBpZiAoIW9iaikge1xyXG4gICAgICAvLyBpbiBjYXNlIG9mIGdsYiBmaWxlcywgdGhlIGltcG9ydGVyIHJlbW92ZXMgZG90cyBmcm9tIG5hbWVzXHJcbiAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGFkai5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZS5yZXBsYWNlKC9bLl0vZywgJycpO1xyXG4gICAgICBvYmogPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlID8gdGhpcy5mdWxsM0RPYmplY3RUb1VzZS5nZXRPYmplY3RCeU5hbWUobmFtZSkgOiBudWxsO1xyXG4gICAgICBpZiAoIW9iaikge1xyXG4gICAgICAgIERlYnVnVXRpbHMubG9nKGBObyBvYmplY3Qgd2l0aCBuYW1lICR7YWRqLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lfSBmb3VuZCFgKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGFkanVzdGFibGU6IGFueSA9IG9iai5jbG9uZSgpO1xyXG4gICAgYWRqdXN0YWJsZS5uYW1lID0gdGhpcy5jcmVhdGVVbmlxdWVOYW1lKGl0ZW0sIG9iaik7XHJcbiAgICBhZGp1c3RhYmxlLnVzZXJEYXRhLnNlbGVjdGlvbiA9IGFkajtcclxuICAgIGFkanVzdGFibGUucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgYWRqdXN0YWJsZS50cmF2ZXJzZShjID0+IHtcclxuICAgICAgYy52aXNpYmxlID0gIWMubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2NfJyk7XHJcbiAgICB9KTtcclxuICAgIGl0ZW0uYWRkKGFkanVzdGFibGUpO1xyXG4gICAgYWRqdXN0YWJsZSA9IGl0ZW0uZ2V0T2JqZWN0QnlOYW1lKGFkanVzdGFibGUubmFtZSk7XHJcbiAgICB0aGlzLnBsYWNlZEFkanVzdGFibGVzLnB1c2goYWRqdXN0YWJsZSk7XHJcbiAgICByZXR1cm4gYWRqdXN0YWJsZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVBZGRhYmxlKGl0ZW06IE9iamVjdDNELCBhZGQ6IFNlbGVjdGlvbiwgcGFydDI/OiBhbnksIHBhcnQxPzogYW55KTogT2JqZWN0M0Qge1xyXG4gICAgY29uc3Qgb2JqOiBhbnkgPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlLmdldE9iamVjdEJ5TmFtZShhZGQuZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUpO1xyXG4gICAgaWYgKCFvYmopIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvLyBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbkZyb21JZChhZGouYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICBjb25zdCBhZGRhYmxlOiBhbnkgPSBvYmouY2xvbmUoKTtcclxuICAgIGFkZGFibGUubmFtZSA9IHRoaXMuY3JlYXRlVW5pcXVlTmFtZShpdGVtLCBvYmopO1xyXG4gICAgYWRkYWJsZS51c2VyRGF0YS5zZWxlY3Rpb24gPSBhZGQ7XHJcbiAgICBhZGRhYmxlLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgIGFkZGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICBpZiAocGFydDEgJiYgcGFydDIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGxhY2VBZGRhYmxlKGl0ZW0sIGFkZGFibGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFkZGFibGU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcGxhY2VBZGRhYmxlKGl0ZW06IE9iamVjdDNELCBhZGQ6IGFueSk6IE9iamVjdDNEIHtcclxuICAgIGl0ZW0uYWRkKGFkZCk7XHJcbiAgICBjb25zdCBhZGRhYmxlOiBPYmplY3QzRCA9IGl0ZW0uZ2V0T2JqZWN0QnlOYW1lKGFkZC5uYW1lKSBhcyBPYmplY3QzRDtcclxuICAgIHRoaXMuX3BsYWNlZEFkZGFibGVzLnB1c2goYWRkYWJsZSk7XHJcbiAgICByZXR1cm4gYWRkYWJsZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVVbmlxdWVOYW1lKGl0ZW06IE9iamVjdDNELCBvYmo6IE9iamVjdDNEKTogc3RyaW5nIHtcclxuICAgIGxldCBpdGVyYXRpb24gPSAwO1xyXG4gICAgbGV0IG5hbWUgPSBgJHtpdGVtLm5hbWV9XyR7b2JqLm5hbWV9YDtcclxuICAgIGxldCBleGlzdGluZ09iaiA9IGl0ZW0uZ2V0T2JqZWN0QnlOYW1lKG5hbWUpO1xyXG4gICAgd2hpbGUgKGV4aXN0aW5nT2JqKSB7XHJcbiAgICAgIGl0ZXJhdGlvbisrO1xyXG4gICAgICBuYW1lID0gYCR7aXRlbS5uYW1lfV8ke29iai5uYW1lfWAgKyAoaXRlcmF0aW9uICE9PSAwID8gKCdfJyArIGl0ZXJhdGlvbikgOiAnJyk7XHJcbiAgICAgIGV4aXN0aW5nT2JqID0gaXRlbS5nZXRPYmplY3RCeU5hbWUobmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBwbGFjZUFkZGFibGVzKGl0ZW06IE9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMucGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5oYXNPd25Qcm9wZXJ0eSgnc2VsZWN0aW9uJykgJiYgdGhpcy5wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5zZWxlY3Rpb24pIHtcclxuICAgICAgICBjb25zdCBhZGp1c3RhYmxlU2VsZWN0aW9uOiBTZWxlY3Rpb24gPSB0aGlzLnBsYWNlZEFkanVzdGFibGVzW2ldLnVzZXJEYXRhLnNlbGVjdGlvbjtcclxuICAgICAgICBpZiAoYWRqdXN0YWJsZVNlbGVjdGlvbikge1xyXG4gICAgICAgICAgY29uc3QgbGVuYTogbnVtYmVyID0gYWRqdXN0YWJsZVNlbGVjdGlvbi5hZGRhYmxlcy5sZW5ndGg7XHJcbiAgICAgICAgICBsZXQgY29uQWRkYWJsZTogYW55O1xyXG4gICAgICAgICAgZm9yIChsZXQgaWEgPSAwOyBpYSA8IGxlbmE7IGlhKyspIHtcclxuICAgICAgICAgICAgU2NlbmUzRFV0aWwuVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHRoaXMuc2NlbmUsXHJcbiAgICAgICAgICAgICAgaXRlbSwgdGhpcy5wbGFjZWRBZGp1c3RhYmxlc1tpXSwgYWRqdXN0YWJsZVNlbGVjdGlvbi5hZGRhYmxlc1tpYV0sIGZhbHNlLFxyXG4gICAgICAgICAgICAgIChhZGQsIHBhcnQyPywgcGFydDE/KSA9PiB0aGlzLmNyZWF0ZUFkZGFibGUoaXRlbSwgYWRkLCBwYXJ0MiwgcGFydDEpKTtcclxuICAgICAgICAgICAgaWYgKGNvbkFkZGFibGUpIHtcclxuICAgICAgICAgICAgICBTY2VuZTNEVXRpbC5UcnlTZWxlY3RvckNvbm5lY3Rpb24odGhpcy5zY2VuZSxcclxuICAgICAgICAgICAgICAgIGl0ZW0sIGNvbkFkZGFibGUsIGFkanVzdGFibGVTZWxlY3Rpb24uYWRkYWJsZXNbaWFdLCBmYWxzZSxcclxuICAgICAgICAgICAgICAgIChhZGQsIHBhcnQyPywgcGFydDE/KSA9PiB0aGlzLmNyZWF0ZUFkZGFibGUoaXRlbSwgYWRkLCBwYXJ0MiwgcGFydDEpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25BZGRhYmxlID0gdGhpcy5fcGxhY2VkQWRkYWJsZXNbdGhpcy5fcGxhY2VkQWRkYWJsZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFZhcmlhdGlvbnMoaXRlbTogT2JqZWN0M0QsIGluc3RhbmNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMudXNlVmFyaWF0aW9uT25QYXJ0KSB7XHJcbiAgICAgIGF3YWl0IHRoaXMudmFyaWF0aW9uU2VydmljZS5sb2FkUGFydCh0aGlzLmFydGljbGVBc3NldFBhdGgsIHRoaXMuX2FkanVzdGFibGVzLCBpbnN0YW5jZUlkLCBpdGVtLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMudmFyaWF0aW9uU2VydmljZS5sb2FkVmFyaWF0aW9uKHRoaXMuYXJ0aWNsZUFzc2V0UGF0aCwgdGhpcy5fYWRqdXN0YWJsZXMsIGluc3RhbmNlSWQsIGl0ZW0sIHRydWUpO1xyXG4gICAgYXdhaXQgdGhpcy52YXJpYXRpb25TZXJ2aWNlLmxvYWRWYXJpYXRpb24odGhpcy5hcnRpY2xlQXNzZXRQYXRoLCB0aGlzLl9hZGRhYmxlcywgaW5zdGFuY2VJZCwgaXRlbSwgdHJ1ZSk7XHJcbiAgICB0aGlzLnZhcmlhdGlvblNlcnZpY2UuY2xlYXJDYWNoZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHByZWxvYWRNYXRlcmlhbChhbnN3ZXI6IEFuc3dlcik6IHZvaWQge1xyXG4gICAgaWYgKGFuc3dlci5lbGVtZW50VHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbiAmJiAoYW5zd2VyLmdhbWVPYmplY3QgfHwgYW5zd2VyLm1hdGVyaWFsVXJsKSkge1xyXG4gICAgICBjb25zdCB2YXJpYXRpb25zOiBEZWNvTm9kZVtdID0gdGhpcy5nZXRWYXJpYXRpb25zKCk7XHJcbiAgICAgIGNvbnN0IHZhcmlhdGlvbkRlY29Ob2RlOiBEZWNvTm9kZSA9IHZhcmlhdGlvbnMuZmluZCh2ID0+XHJcbiAgICAgICAgKCh2LnBhcmVudElkICYmIGFuc3dlci5wYXJlbnRBcnRpY2xlRGVjb0lkICYmIHYucGFyZW50SWQudG9TdHJpbmcoKSA9PT0gYW5zd2VyLnBhcmVudEFydGljbGVEZWNvSWQudG9TdHJpbmcoKSkgfHxcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICh2LnBhcmVudElkICYmIGFuc3dlci5wYXJlbnROb2RlSWQgJiYgdi5wYXJlbnRJZC50b1N0cmluZygpID09PSBhbnN3ZXIucGFyZW50Tm9kZUlkLnRvU3RyaW5nKCkpKSk7XHJcbiAgICAgIGlmICghdmFyaWF0aW9uRGVjb05vZGUgfHwgIXRoaXMuY3VycmVudEN1c3RvbUZsb29yR3JvdXApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGFmZmVjdGVkU2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSBbXTtcclxuICAgICAgaWYgKHRoaXMuX2dlbmVyaWNTZWxlY3Rpb24pIHtcclxuICAgICAgICBhZmZlY3RlZFNlbGVjdGlvbnMgPSB0aGlzLl9hZGp1c3RhYmxlcztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uOiBTZWxlY3Rpb24gPSBPYmplY3RVdGlscy5HZXRTZWxlY3Rpb25Gcm9tU2VsZWN0ZWRPYmplY3QodGhpcy5fYWN0aXZlQ2hpbGRFbGVtZW50KTtcclxuICAgICAgICBpZiAoY3VycmVudFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgYWZmZWN0ZWRTZWxlY3Rpb25zID0gW3RoaXMuX2FkanVzdGFibGVzLmZpbmQoKHNlbGVjdGlvbjogU2VsZWN0aW9uKSA9PiBzZWxlY3Rpb24ubm9kZUlkID09PSBjdXJyZW50U2VsZWN0aW9uLm5vZGVJZCldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIGNvbnN0IGFkanVzdGFibGVzQ2xvbmU6IFNlbGVjdGlvbltdID0gYWZmZWN0ZWRTZWxlY3Rpb25zICYmIGFmZmVjdGVkU2VsZWN0aW9ucy5sZW5ndGggPiAwID8gYWZmZWN0ZWRTZWxlY3Rpb25zLm1hcChzID0+IE9iamVjdC5hc3NpZ24oe30sIHMpKSA6IFtdO1xyXG4gICAgICBpZiAoYWRqdXN0YWJsZXNDbG9uZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgYWRqdXN0YWJsZXNDbG9uZS5mb3JFYWNoKChzZWxlY3Rpb246IFNlbGVjdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhcmlhdGlvbiA9IHNlbGVjdGlvbi52YXJpYXRpb25zLmZpbmQodiA9PiAoXHJcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICAgICB2IGFzIHVua25vd24gYXMgVmFyaWF0aW9uKS5kZWNvSWQudG9TdHJpbmcoKSA9PT0gdmFyaWF0aW9uRGVjb05vZGUuaWQudG9TdHJpbmcoKSAmJiAodiBhcyB1bmtub3duIGFzIFZhcmlhdGlvbikubm9kZS50b1N0cmluZygpID09PSB2YXJpYXRpb25EZWNvTm9kZS5ub2RlSWQudG9TdHJpbmcoKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgaWYgKHZhcmlhdGlvbi5tYXRlcmlhbFVybCkge1xyXG4gICAgICAgICAgICB2YXJpYXRpb24ubWF0ZXJpYWxVcmwgPSBhbnN3ZXIubWF0ZXJpYWxVcmw7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXJpYXRpb24uZ2FtZU9iamVjdE5hbWUgPSBhbnN3ZXIuZ2FtZU9iamVjdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnZhcmlhdGlvbkNhY2hlU2VydmljZS5wcmVsb2FkVmFyaWF0aW9uc0FzeW5jKGFkanVzdGFibGVzQ2xvbmVbMF0uc2NoZW1hLCBbYW5zd2VyXSwgdGhpcy5hcnRpY2xlQXNzZXRQYXRoKVxyXG4gICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudmFyaWF0aW9uU2VydmljZS5sb2FkVmFyaWF0aW9uKHRoaXMuYXJ0aWNsZUFzc2V0UGF0aCwgYWRqdXN0YWJsZXNDbG9uZSwgJycsIHRoaXMuY3VycmVudEN1c3RvbUZsb29yR3JvdXAsIHRydWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHByZWxvYWRNYXRlcmlhbEJ5U2VsZWN0aW9uKGFuc3dlcjogU2VsZWN0b3JTdHJ1Y3R1cmUpOiB2b2lkIHtcclxuICAgIGlmIChhbnN3ZXIuZWxlbWVudFR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb24gJiYgYW5zd2VyLmdhbWVPYmplY3QpIHtcclxuICAgICAgY29uc3QgdmFyaWF0aW9uRGVjb05vZGU6IERlY29Ob2RlID0gbmV3IERlY29Ob2RlKCk7XHJcbiAgICAgIHZhcmlhdGlvbkRlY29Ob2RlLmdhbWVPYmplY3ROYW1lID0gYW5zd2VyLmdhbWVPYmplY3Q7XHJcbiAgICAgIGNvbnN0IGFkanVzdGFibGVzQ2xvbmU6IFNlbGVjdGlvbltdID0gdGhpcy5fYWRqdXN0YWJsZXMubWFwKHMgPT4gT2JqZWN0LmFzc2lnbih7fSwgcykpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2dlbmVyaWNTZWxlY3Rpb24pIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCkge1xyXG4gICAgICAgICAgYWRqdXN0YWJsZXNDbG9uZS5mb3JFYWNoKChzZWxlY3Rpb246IFNlbGVjdGlvbikgPT4gc2VsZWN0aW9uLnZhcmlhdGlvbnMgPSBbdmFyaWF0aW9uRGVjb05vZGVdKTtcclxuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgICAgIHRoaXMudmFyaWF0aW9uQ2FjaGVTZXJ2aWNlLnByZWxvYWRWYXJpYXRpb25zQXN5bmMoYWRqdXN0YWJsZXNDbG9uZVswXS5zY2hlbWEsIFt2YXJpYXRpb25EZWNvTm9kZV0sIHRoaXMuYXJ0aWNsZUFzc2V0UGF0aClcclxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMudmFyaWF0aW9uU2VydmljZS5sb2FkVmFyaWF0aW9uKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5hcnRpY2xlQXNzZXRQYXRoLFxyXG4gICAgICAgICAgICAgICAgYWRqdXN0YWJsZXNDbG9uZSxcclxuICAgICAgICAgICAgICAgICcnLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCxcclxuICAgICAgICAgICAgICAgIHRydWVcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fYWRqdXN0YWJsZXMuZm9yRWFjaCgoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHNlbGVjdGlvbi52YXJpYXRpb25zID0gW3ZhcmlhdGlvbkRlY29Ob2RlXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3Rpb246IFNlbGVjdGlvbiA9IE9iamVjdFV0aWxzLkdldFNlbGVjdGlvbkZyb21TZWxlY3RlZE9iamVjdCh0aGlzLl9hY3RpdmVDaGlsZEVsZW1lbnQpO1xyXG4gICAgICAgIGlmIChjdXJyZW50U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Gcm9tQWRqdXN0YWJsZXM6IFNlbGVjdGlvbiA9IGFkanVzdGFibGVzQ2xvbmVcclxuICAgICAgICAgICAgICAuZmluZCgoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHNlbGVjdGlvbi5ub2RlSWQgPT09IGN1cnJlbnRTZWxlY3Rpb24ubm9kZUlkKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkZyb21BZGp1c3RhYmxlcykge1xyXG4gICAgICAgICAgICAgIHNlbGVjdGlvbkZyb21BZGp1c3RhYmxlcy52YXJpYXRpb25zID0gW3ZhcmlhdGlvbkRlY29Ob2RlXTtcclxuICAgICAgICAgICAgICB0aGlzLnZhcmlhdGlvbkNhY2hlU2VydmljZS5wcmVsb2FkVmFyaWF0aW9uc0FzeW5jKFxyXG4gICAgICAgICAgICAgICAgYWRqdXN0YWJsZXNDbG9uZVswXS5zY2hlbWEsIFt2YXJpYXRpb25EZWNvTm9kZV0sIHRoaXMuYXJ0aWNsZUFzc2V0UGF0aClcclxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy52YXJpYXRpb25TZXJ2aWNlLmxvYWRWYXJpYXRpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcnRpY2xlQXNzZXRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGFkanVzdGFibGVzQ2xvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCxcclxuICAgICAgICAgICAgICAgICAgICB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICkudGhlbigpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkZyb21BZGp1c3RhYmxlczogU2VsZWN0aW9uID0gdGhpcy5fYWRqdXN0YWJsZXNcclxuICAgICAgICAgICAgICAuZmluZCgoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHNlbGVjdGlvbi5ub2RlSWQgPT09IGN1cnJlbnRTZWxlY3Rpb24ubm9kZUlkKTtcclxuICAgICAgICAgICAgc2VsZWN0aW9uRnJvbUFkanVzdGFibGVzLnZhcmlhdGlvbnMgPSBbdmFyaWF0aW9uRGVjb05vZGVdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkRmxvb3IocmVzdWx0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGxldCBmbG9vcldpdGhvdXRQbGFua0NvdW50ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gbGV0IGZsb29yUGF0dGVybjogRmxvb3JQYXR0ZXJuO1xyXG4gICAgLy8gY29uc3QgYXJ0aWNsZUZ1bGxPYmplY3Q6IEFydGljbGVGdWxsT2JqZWN0ID0gYXdhaXQgdGhpcy5jb25uZWN0b3JBZGFwdGVyU2VydmljZS5nZXRBcnRpY2xlRnVsbE9iamVjdCgrcmVzdWx0Lm1ldGFEYXRhLmdvb2RJZCk7XHJcbiAgICAvLyBpZiAoYXJ0aWNsZUZ1bGxPYmplY3QudGFncyAhPT0gbnVsbCAmJiBhcnRpY2xlRnVsbE9iamVjdC50YWdzLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgZm9yIChjb25zdCB0YWcgb2YgYXJ0aWNsZUZ1bGxPYmplY3QudGFncykge1xyXG4gICAgLy8gICAgIGlmICh0YWcuZGVzY3JpcHRpb24gPT09ICdOT1JNQUwnKSB7XHJcbiAgICAvLyAgICAgICBmbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uTk9STUFMO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAodGFnLmRlc2NyaXB0aW9uID09PSAnSEVSUklOR0JPTkUnKSB7XHJcbiAgICAvLyAgICAgICBmbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uSEVSUklOR0JPTkU7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmICh0YWcuZGVzY3JpcHRpb24gPT09ICdIT042MCcpIHtcclxuICAgIC8vICAgICAgIGZsb29yUGF0dGVybiA9IEZsb29yUGF0dGVybi5IT042MDtcclxuICAgIC8vICAgICB9IGVsc2UgaWYgKHRhZy5kZXNjcmlwdGlvbiA9PT0gJ0hPTjQ1Jykge1xyXG4gICAgLy8gICAgICAgZmxvb3JQYXR0ZXJuID0gRmxvb3JQYXR0ZXJuLkhPTjQ1O1xyXG4gICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICBmbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uTk9STUFMO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfVxyXG4gICAgLy8gICBmbG9vcldpdGhvdXRQbGFua0NvdW50ZXIgPSBmYWxzZTtcclxuICAgIC8vIH1cclxuICAgIC8vXHJcbiAgICAvLyBjb25zdCBpdGVtOiBGbG9vclBsYW5lSXRlbSA9IHRoaXMuZmxvb3JTZXJ2aWNlLmZsb29yVG9Db25maWd1cmU7XHJcbiAgICAvLyBpdGVtLm1ldGFkYXRhID0gcmVzdWx0Lm1ldGFEYXRhO1xyXG4gICAgLy8gaXRlbS5tZXRhZGF0YS5zZWxlY3Rpb25zID0gdGhpcy5jbG9uZVNlbGVjdGlvbnMoKTtcclxuICAgIC8vIGl0ZW0ubWV0YWRhdGEuZGVjb3MgPSBBcnJheS5mcm9tKHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5kZWNvTm9kZXMpO1xyXG4gICAgLy8gdGhpcy5oYW5kbGVDcmVhdGVGbG9vcihpdGVtKTtcclxuICAgIC8vXHJcbiAgICAvLyBpZiAoZmxvb3JXaXRob3V0UGxhbmtDb3VudGVyKSB7XHJcbiAgICAvLyAgIGNvbnN0IGZsb29yUm90YXRpb246IG51bWJlciA9IHRoaXMuZmxvb3JTZXJ2aWNlLmZsb29yUm90YXRpb247XHJcbiAgICAvLyAgIGl0ZW0uY2hpbGRyZW5bMF0udXNlckRhdGEuc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25zWzBdO1xyXG4gICAgLy8gICBhd2FpdCB0aGlzLmxvYWRWYXJpYXRpb25zKGl0ZW0sIHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQpO1xyXG4gICAgLy9cclxuICAgIC8vICAgaXRlbS5tZXRhZGF0YS50ZXh0dXJlQXNzZXROYW1lID0gdGhpcy52YXJpYXRpb25TZXJ2aWNlLmxvYWRlZEFzc2V0O1xyXG4gICAgLy8gICB0aGlzLmZsb29yU2VydmljZS51bkhpZ2hMaWdodEZsb29ycygpO1xyXG4gICAgLy8gICB0aGlzLnNjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICAvLyAgIHRoaXMuY3VycmVudEN1c3RvbUZsb29yR3JvdXAgPSBpdGVtO1xyXG4gICAgLy8gICByZXN1bHQuZnVybml0dXJlID0gdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cDtcclxuICAgIC8vICAgcmVzdWx0Lmluc3RhbmNlSWQgPSByZXN1bHQubWV0YURhdGEuaXRlbUlkO1xyXG4gICAgLy9cclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgIHRoaXMuZmxvb3JTZXJ2aWNlLnVuSGlnaExpZ2h0Rmxvb3JzKCk7XHJcbiAgICAvLyAgIHRoaXMuc2NlbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICAgIC8vICAgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCA9IGl0ZW07XHJcbiAgICAvLyAgIHJlc3VsdC5mdXJuaXR1cmUgPSB0aGlzLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwO1xyXG4gICAgLy8gICByZXN1bHQuaW5zdGFuY2VJZCA9IHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQ7XHJcbiAgICAvLyAgIC8vIHRoaXMuX2dlbmVyYXRlTGF5aW5nUGF0dGVybihpdGVtLCBmbG9vclBhdHRlcm4pO1xyXG4gICAgLy8gfVxyXG4gICAgLy9cclxuICAgIC8vIHRoaXMuaGFuZGxlSW50ZWdyYXRpb24ocmVzdWx0Lm1ldGFEYXRhLml0ZW1JZCwgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCk7XHJcbiAgICAvLyBpZiAodGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5pdGVtR3JvdXApIHtcclxuICAgIC8vICAgdGhpcy5pdGVtR3JvdXBTZXJ2aWNlLnJlYXR0YWNoVG9JdGVtR3JvdXAoXHJcbiAgICAvLyAgICAgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCxcclxuICAgIC8vICAgICB0aGlzLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLml0ZW1Hcm91cCxcclxuICAgIC8vICAgICB0aGlzLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLnBvc2l0aW9uKTtcclxuICAgIC8vIH1cclxuICAgIC8vIHRoaXMuZW1wdHlBbnN3ZXJTZWxlY3RlZCgpO1xyXG4gICAgLy9cclxuICAgIC8vIGlmIChyZXN1bHQucmVzdWx0VHlwZSA9PT0gUmVzdWx0VHlwZS5Ob1NlbGVjdGlvbnMpIHtcclxuICAgIC8vICAgcmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLkNvbmZpZ3VyYXRpb25GaXhlZDtcclxuICAgIC8vIH0gZWxzZSBpZiAocmVzdWx0LnJlc3VsdFR5cGUgIT09IFJlc3VsdFR5cGUuT2Jzb2xldGUgJiYgcmVzdWx0LnJlc3VsdFR5cGUgIT09IFJlc3VsdFR5cGUuQ29uZmlndXJhdGlvbkZpeGVkKSB7IC8vIGRvbid0IG92ZXJyaWRlIHRoZXNlXHJcbiAgICAvLyAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Mb2FkZWQ7XHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLmZsb29yU2VydmljZS5mbG9vclJlc3VsdE9iamVjdCA9IHJlc3VsdDtcclxuICAgIC8vIHRoaXMuYnVpbGRGaW5pc2hlZC5uZXh0KHJlc3VsdCk7XHJcbiAgICAvLyByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRvd25sb2FkVURTWmZvckFSSU9TKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb2JqZWN0czogT2JqZWN0M0RbXSA9IHRoaXMuaXRlbVNlcnZpY2Uuc2NlbmVJdGVtcztcclxuICAgIGNvbnN0IG9iamVjdFRvRXhwb3J0OiBPYmplY3QzRCA9IG9iamVjdHMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xyXG4gICAgdGhpcy51dGlsc1NlcnZpY2UuZG93bmxvYWRVU0RaZm9yQVJJT1Mob2JqZWN0VG9FeHBvcnQpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19