@colijnit/configurator 261.1.1 → 261.20.0

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 (399) hide show
  1. package/{fesm2015/colijnit-configurator.js → fesm2022/colijnit-configurator.mjs} +19092 -18478
  2. package/fesm2022/colijnit-configurator.mjs.map +1 -0
  3. package/index.d.ts +3301 -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/package.json +17 -13
  7. package/bundles/colijnit-configurator.umd.js +0 -20167
  8. package/bundles/colijnit-configurator.umd.js.map +0 -1
  9. package/colijnit-configurator.d.ts +0 -5
  10. package/esm2015/colijnit-configurator.js +0 -5
  11. package/esm2015/lib/builder.js +0 -795
  12. package/esm2015/lib/components/answer-card/answer-card.component.js +0 -313
  13. package/esm2015/lib/components/answer-card/answer-card.module.js +0 -50
  14. package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.component.js +0 -182
  15. package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.module.js +0 -34
  16. package/esm2015/lib/components/answers-slideout/answers-slideout.component.js +0 -490
  17. package/esm2015/lib/components/answers-slideout/answers-slideout.module.js +0 -61
  18. package/esm2015/lib/components/color-filter/color-filter.component.js +0 -59
  19. package/esm2015/lib/components/color-filter/color-filter.module.js +0 -26
  20. package/esm2015/lib/components/configurator/configurator.component.js +0 -133
  21. package/esm2015/lib/components/configurator/configurator.module.js +0 -42
  22. package/esm2015/lib/components/configurator-dialog/configurator-camera-settings.component.js +0 -222
  23. package/esm2015/lib/components/configurator-dialog/configurator-dialog.module.js +0 -48
  24. package/esm2015/lib/components/configurator-dialog/configurator-error-dialog.component.js +0 -82
  25. package/esm2015/lib/components/configurator-dialog/configurator-export-dialog.component.js +0 -163
  26. package/esm2015/lib/components/configurator-loader/configurator-loader.component.js +0 -49
  27. package/esm2015/lib/components/configurator-loader/configurator-loader.module.js +0 -33
  28. package/esm2015/lib/components/configurator-scene/configurator-scene.component.js +0 -60
  29. package/esm2015/lib/components/configurator-scene/configurator-scene.module.js +0 -17
  30. package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.component.js +0 -46
  31. package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.module.js +0 -26
  32. package/esm2015/lib/components/element-buttons/element-buttons.component.js +0 -168
  33. package/esm2015/lib/components/element-buttons/element-buttons.module.js +0 -30
  34. package/esm2015/lib/components/element-toolbar/element-toolbar.component.js +0 -186
  35. package/esm2015/lib/components/element-toolbar/element-toolbar.module.js +0 -34
  36. package/esm2015/lib/components/image-zoom/image-zoom.component.js +0 -61
  37. package/esm2015/lib/components/image-zoom/image-zoom.module.js +0 -30
  38. package/esm2015/lib/components/lite-selector/lite-selector.component.js +0 -206
  39. package/esm2015/lib/components/lite-selector/lite-selector.module.js +0 -34
  40. package/esm2015/lib/components/product-configurator/product-configurator.component.js +0 -184
  41. package/esm2015/lib/components/product-configurator/product-configurator.module.js +0 -72
  42. package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.component.js +0 -237
  43. package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.module.js +0 -38
  44. package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.js +0 -284
  45. package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.js +0 -42
  46. package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.js +0 -72
  47. package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.js +0 -34
  48. package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.js +0 -82
  49. package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.js +0 -30
  50. package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.js +0 -80
  51. package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.js +0 -34
  52. package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.js +0 -93
  53. package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.js +0 -34
  54. package/esm2015/lib/components/progress-bar/progress-bar.component.js +0 -55
  55. package/esm2015/lib/components/progress-bar/progress-bar.module.js +0 -29
  56. package/esm2015/lib/components/scene-options/scene-options.component.js +0 -164
  57. package/esm2015/lib/components/scene-options/scene-options.module.js +0 -38
  58. package/esm2015/lib/components/selections-summary/selections-summary.component.js +0 -163
  59. package/esm2015/lib/components/selections-summary/selections-summary.module.js +0 -45
  60. package/esm2015/lib/components/selections-summary-line/selections-summary-line.component.js +0 -171
  61. package/esm2015/lib/components/selections-summary-line/selections-summary-line.module.js +0 -34
  62. package/esm2015/lib/components/slideout/slideout.component.js +0 -83
  63. package/esm2015/lib/components/slideout/slideout.module.js +0 -17
  64. package/esm2015/lib/components/summary-line/summary-line.component.js +0 -273
  65. package/esm2015/lib/components/summary-line/summary-line.module.js +0 -44
  66. package/esm2015/lib/components/tag-filter/tag-filter.component.js +0 -39
  67. package/esm2015/lib/components/tag-filter/tag-filter.module.js +0 -21
  68. package/esm2015/lib/components/threedselector/threedselector.component.js +0 -155
  69. package/esm2015/lib/components/threedselector/threedselector.module.js +0 -34
  70. package/esm2015/lib/core/helper/variation-helper.js +0 -553
  71. package/esm2015/lib/core/shader/floor-fade.shader.js +0 -33
  72. package/esm2015/lib/core/textures/depth-data-texture.js +0 -19
  73. package/esm2015/lib/directives/directives.module.js +0 -26
  74. package/esm2015/lib/directives/visibility-observer-master.directive.js +0 -53
  75. package/esm2015/lib/directives/visibility-observer.directive.js +0 -54
  76. package/esm2015/lib/enum/ar-feature.enum.js +0 -14
  77. package/esm2015/lib/enum/configuration-key.enum.js +0 -41
  78. package/esm2015/lib/enum/configuration-template.enum.js +0 -6
  79. package/esm2015/lib/enum/device-size-type.js +0 -7
  80. package/esm2015/lib/enum/device-tier.enum.js +0 -7
  81. package/esm2015/lib/enum/icon.enum.js +0 -113
  82. package/esm2015/lib/enum/item-type.enum.js +0 -23
  83. package/esm2015/lib/enum/light.enum.js +0 -9
  84. package/esm2015/lib/enum/navigator-type.enum.js +0 -6
  85. package/esm2015/lib/enum/output-encoding.enum.js +0 -9
  86. package/esm2015/lib/enum/result-type.enum.js +0 -21
  87. package/esm2015/lib/enum/scene-event.enum.js +0 -12
  88. package/esm2015/lib/enum/shadow-map-type.enum.js +0 -8
  89. package/esm2015/lib/enum/texture-type.js +0 -9
  90. package/esm2015/lib/enum/tone-mapping-local.enum.js +0 -12
  91. package/esm2015/lib/enum/view-mode.enum.js +0 -7
  92. package/esm2015/lib/enum/xr-mode.enum.js +0 -6
  93. package/esm2015/lib/environments/environment.js +0 -8
  94. package/esm2015/lib/interfaces/aa-options.interface.js +0 -2
  95. package/esm2015/lib/interfaces/adjustable-element.interface.js +0 -2
  96. package/esm2015/lib/interfaces/ao-options.interface.js +0 -2
  97. package/esm2015/lib/interfaces/changes.interface.js +0 -2
  98. package/esm2015/lib/interfaces/configuration-data.interface.js +0 -2
  99. package/esm2015/lib/interfaces/light-preset.interface.js +0 -2
  100. package/esm2015/lib/interfaces/post-processing-setting.interface.js +0 -2
  101. package/esm2015/lib/interfaces/scene-option-button.interface.js +0 -6
  102. package/esm2015/lib/interfaces/screen-size-info.js +0 -2
  103. package/esm2015/lib/interfaces/setting.interface.js +0 -2
  104. package/esm2015/lib/interfaces/texture.interface.js +0 -2
  105. package/esm2015/lib/interfaces/vignette-options.interface.js +0 -2
  106. package/esm2015/lib/model/ar-position-indicator.js +0 -18
  107. package/esm2015/lib/model/camera-settings.js +0 -14
  108. package/esm2015/lib/model/configuration-result-object.js +0 -6
  109. package/esm2015/lib/model/configurator-error-message.js +0 -9
  110. package/esm2015/lib/model/configurator-settings.js +0 -25
  111. package/esm2015/lib/model/custom-button.js +0 -16
  112. package/esm2015/lib/model/factory.js +0 -28
  113. package/esm2015/lib/model/icon.js +0 -112
  114. package/esm2015/lib/model/intersected-objects.js +0 -7
  115. package/esm2015/lib/model/light-preset.js +0 -73
  116. package/esm2015/lib/model/light-properties.js +0 -45
  117. package/esm2015/lib/model/material.js +0 -11
  118. package/esm2015/lib/model/metadata.js +0 -2
  119. package/esm2015/lib/model/render-parameters.js +0 -16
  120. package/esm2015/lib/model/setting-options.js +0 -71
  121. package/esm2015/lib/model/settings.js +0 -16
  122. package/esm2015/lib/model/shadow-properties.js +0 -10
  123. package/esm2015/lib/model/skin.js +0 -3
  124. package/esm2015/lib/model/texture.js +0 -76
  125. package/esm2015/lib/model/variation-settings.js +0 -54
  126. package/esm2015/lib/model/variation.js +0 -3
  127. package/esm2015/lib/model/xr-reticle.js +0 -79
  128. package/esm2015/lib/modules/render/enum/scene-type.enum.js +0 -6
  129. package/esm2015/lib/modules/render/model/ar-parameters.js +0 -12
  130. package/esm2015/lib/modules/render/model/scene-setting.js +0 -6
  131. package/esm2015/lib/modules/render/model/scene-settings.js +0 -3
  132. package/esm2015/lib/pipes/append.pipe.js +0 -21
  133. package/esm2015/lib/pipes/google-translate.pipe.js +0 -21
  134. package/esm2015/lib/pipes/localize.pipe.js +0 -28
  135. package/esm2015/lib/pipes/pipes.module.js +0 -41
  136. package/esm2015/lib/pipes/prepend.pipe.js +0 -21
  137. package/esm2015/lib/pipes/strip-html.pipe.js +0 -17
  138. package/esm2015/lib/services/app-event.service.js +0 -36
  139. package/esm2015/lib/services/app-initializer.service.js +0 -27
  140. package/esm2015/lib/services/ar.service.js +0 -844
  141. package/esm2015/lib/services/build-furniture-base.service.js +0 -1181
  142. package/esm2015/lib/services/build-furniture-without-scene.service.js +0 -86
  143. package/esm2015/lib/services/build-furniture.service.js +0 -169
  144. package/esm2015/lib/services/bundle-initialzer.service.js +0 -113
  145. package/esm2015/lib/services/camera.service.js +0 -123
  146. package/esm2015/lib/services/configuration.service.js +0 -79
  147. package/esm2015/lib/services/configurator-connector.service.js +0 -830
  148. package/esm2015/lib/services/configurator.service.js +0 -285
  149. package/esm2015/lib/services/configuring.service.js +0 -119
  150. package/esm2015/lib/services/controls.js +0 -799
  151. package/esm2015/lib/services/debug.service.js +0 -43
  152. package/esm2015/lib/services/dictionary.service.js +0 -65
  153. package/esm2015/lib/services/dynamic-camera.service.js +0 -96
  154. package/esm2015/lib/services/floor-plane.service.js +0 -252
  155. package/esm2015/lib/services/font.service.js +0 -27
  156. package/esm2015/lib/services/google-translate.service.js +0 -79
  157. package/esm2015/lib/services/icon-cache.service.js +0 -44
  158. package/esm2015/lib/services/intersection.service.js +0 -47
  159. package/esm2015/lib/services/item.service.js +0 -75
  160. package/esm2015/lib/services/json-utils.service.js +0 -48
  161. package/esm2015/lib/services/light-creation.service.js +0 -35
  162. package/esm2015/lib/services/light-presets.service.js +0 -157
  163. package/esm2015/lib/services/lights.service.js +0 -146
  164. package/esm2015/lib/services/load-furniture-base.service.js +0 -164
  165. package/esm2015/lib/services/load-furniture-without-scene.service.js +0 -45
  166. package/esm2015/lib/services/load-furniture.service.js +0 -72
  167. package/esm2015/lib/services/loader.service.js +0 -32
  168. package/esm2015/lib/services/locator.service.js +0 -11
  169. package/esm2015/lib/services/message-board.service.js +0 -50
  170. package/esm2015/lib/services/post-processing.service.js +0 -378
  171. package/esm2015/lib/services/product-configurator.service.js +0 -16
  172. package/esm2015/lib/services/progress.service.js +0 -20
  173. package/esm2015/lib/services/scene-event.service.js +0 -246
  174. package/esm2015/lib/services/scene-options.service.js +0 -24
  175. package/esm2015/lib/services/scene.service.js +0 -313
  176. package/esm2015/lib/services/screen-size-analysis.service.js +0 -97
  177. package/esm2015/lib/services/settings.service.js +0 -142
  178. package/esm2015/lib/services/switch-build-furniture.service.js +0 -37
  179. package/esm2015/lib/services/switch-load-furniture.service.js +0 -35
  180. package/esm2015/lib/services/threedselector.service.js +0 -72
  181. package/esm2015/lib/services/utils.service.js +0 -207
  182. package/esm2015/lib/services/variation-cache.service.js +0 -143
  183. package/esm2015/lib/services/variation.service.js +0 -490
  184. package/esm2015/lib/services/view-mode.service.js +0 -37
  185. package/esm2015/lib/services/vr.service.js +0 -191
  186. package/esm2015/lib/services/xr.service.js +0 -294
  187. package/esm2015/lib/utils/asset.utils.js +0 -120
  188. package/esm2015/lib/utils/base-utils.js +0 -9
  189. package/esm2015/lib/utils/color.utils.js +0 -30
  190. package/esm2015/lib/utils/debug.utils.js +0 -9
  191. package/esm2015/lib/utils/device.utils.js +0 -25
  192. package/esm2015/lib/utils/file.utils.js +0 -167
  193. package/esm2015/lib/utils/image.utils.js +0 -61
  194. package/esm2015/lib/utils/json-parser.utils.js +0 -180
  195. package/esm2015/lib/utils/material.utils.js +0 -433
  196. package/esm2015/lib/utils/object.utils.js +0 -360
  197. package/esm2015/lib/utils/relative-position.utils.js +0 -75
  198. package/esm2015/lib/utils/rotation-helper.utils.js +0 -15
  199. package/esm2015/lib/utils/scene-3d.utils.js +0 -213
  200. package/esm2015/lib/utils/scene-utils.js +0 -191
  201. package/esm2015/lib/utils/text-utils.js +0 -68
  202. package/esm2015/lib/utils/threed.utils.js +0 -281
  203. package/esm2015/lib/utils/variation-utils.js +0 -459
  204. package/esm2015/public-api.js +0 -65
  205. package/fesm2015/colijnit-configurator.js.map +0 -1
  206. package/lib/builder.d.ts +0 -83
  207. package/lib/components/answer-card/answer-card.component.d.ts +0 -58
  208. package/lib/components/answer-card/answer-card.module.d.ts +0 -11
  209. package/lib/components/answer-info-dialog/answer-info-dialog.component.d.ts +0 -38
  210. package/lib/components/answer-info-dialog/answer-info-dialog.module.d.ts +0 -10
  211. package/lib/components/answers-slideout/answers-slideout.component.d.ts +0 -86
  212. package/lib/components/answers-slideout/answers-slideout.module.d.ts +0 -16
  213. package/lib/components/color-filter/color-filter.component.d.ts +0 -20
  214. package/lib/components/color-filter/color-filter.module.d.ts +0 -8
  215. package/lib/components/configurator/configurator.component.d.ts +0 -37
  216. package/lib/components/configurator/configurator.module.d.ts +0 -12
  217. package/lib/components/configurator-dialog/configurator-camera-settings.component.d.ts +0 -30
  218. package/lib/components/configurator-dialog/configurator-dialog.module.d.ts +0 -13
  219. package/lib/components/configurator-dialog/configurator-error-dialog.component.d.ts +0 -16
  220. package/lib/components/configurator-dialog/configurator-export-dialog.component.d.ts +0 -26
  221. package/lib/components/configurator-loader/configurator-loader.component.d.ts +0 -7
  222. package/lib/components/configurator-loader/configurator-loader.module.d.ts +0 -9
  223. package/lib/components/configurator-scene/configurator-scene.component.d.ts +0 -24
  224. package/lib/components/configurator-scene/configurator-scene.module.d.ts +0 -7
  225. package/lib/components/configurator-scene-loader/configurator-scene-loader.component.d.ts +0 -7
  226. package/lib/components/configurator-scene-loader/configurator-scene-loader.module.d.ts +0 -8
  227. package/lib/components/element-buttons/element-buttons.component.d.ts +0 -32
  228. package/lib/components/element-buttons/element-buttons.module.d.ts +0 -9
  229. package/lib/components/element-toolbar/element-toolbar.component.d.ts +0 -27
  230. package/lib/components/element-toolbar/element-toolbar.module.d.ts +0 -10
  231. package/lib/components/image-zoom/image-zoom.component.d.ts +0 -15
  232. package/lib/components/image-zoom/image-zoom.module.d.ts +0 -9
  233. package/lib/components/lite-selector/lite-selector.component.d.ts +0 -40
  234. package/lib/components/lite-selector/lite-selector.module.d.ts +0 -10
  235. package/lib/components/product-configurator/product-configurator.component.d.ts +0 -50
  236. package/lib/components/product-configurator/product-configurator.module.d.ts +0 -15
  237. package/lib/components/product-configurator-selector/product-configurator-selector.component.d.ts +0 -35
  238. package/lib/components/product-configurator-selector/product-configurator-selector.module.d.ts +0 -11
  239. package/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.d.ts +0 -31
  240. package/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.d.ts +0 -13
  241. package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.d.ts +0 -20
  242. package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.d.ts +0 -10
  243. package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.d.ts +0 -20
  244. package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.d.ts +0 -10
  245. package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.d.ts +0 -21
  246. package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.d.ts +0 -10
  247. package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.d.ts +0 -21
  248. package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.d.ts +0 -10
  249. package/lib/components/progress-bar/progress-bar.component.d.ts +0 -10
  250. package/lib/components/progress-bar/progress-bar.module.d.ts +0 -8
  251. package/lib/components/scene-options/scene-options.component.d.ts +0 -24
  252. package/lib/components/scene-options/scene-options.module.d.ts +0 -11
  253. package/lib/components/selections-summary/selections-summary.component.d.ts +0 -38
  254. package/lib/components/selections-summary/selections-summary.module.d.ts +0 -12
  255. package/lib/components/selections-summary-line/selections-summary-line.component.d.ts +0 -27
  256. package/lib/components/selections-summary-line/selections-summary-line.module.d.ts +0 -10
  257. package/lib/components/slideout/slideout.component.d.ts +0 -22
  258. package/lib/components/slideout/slideout.module.d.ts +0 -7
  259. package/lib/components/summary-line/summary-line.component.d.ts +0 -50
  260. package/lib/components/summary-line/summary-line.module.d.ts +0 -11
  261. package/lib/components/tag-filter/tag-filter.component.d.ts +0 -9
  262. package/lib/components/tag-filter/tag-filter.module.d.ts +0 -7
  263. package/lib/components/threedselector/threedselector.component.d.ts +0 -38
  264. package/lib/components/threedselector/threedselector.module.d.ts +0 -10
  265. package/lib/core/helper/variation-helper.d.ts +0 -25
  266. package/lib/core/shader/floor-fade.shader.d.ts +0 -5
  267. package/lib/core/textures/depth-data-texture.d.ts +0 -5
  268. package/lib/directives/directives.module.d.ts +0 -8
  269. package/lib/directives/visibility-observer-master.directive.d.ts +0 -12
  270. package/lib/directives/visibility-observer.directive.d.ts +0 -16
  271. package/lib/enum/ar-feature.enum.d.ts +0 -12
  272. package/lib/enum/configuration-key.enum.d.ts +0 -39
  273. package/lib/enum/configuration-template.enum.d.ts +0 -4
  274. package/lib/enum/device-size-type.d.ts +0 -5
  275. package/lib/enum/device-tier.enum.d.ts +0 -5
  276. package/lib/enum/icon.enum.d.ts +0 -111
  277. package/lib/enum/item-type.enum.d.ts +0 -21
  278. package/lib/enum/light.enum.d.ts +0 -7
  279. package/lib/enum/navigator-type.enum.d.ts +0 -4
  280. package/lib/enum/output-encoding.enum.d.ts +0 -7
  281. package/lib/enum/result-type.enum.d.ts +0 -19
  282. package/lib/enum/scene-event.enum.d.ts +0 -10
  283. package/lib/enum/shadow-map-type.enum.d.ts +0 -6
  284. package/lib/enum/texture-type.d.ts +0 -7
  285. package/lib/enum/tone-mapping-local.enum.d.ts +0 -10
  286. package/lib/enum/view-mode.enum.d.ts +0 -5
  287. package/lib/enum/xr-mode.enum.d.ts +0 -4
  288. package/lib/environments/environment.d.ts +0 -4
  289. package/lib/interfaces/aa-options.interface.d.ts +0 -4
  290. package/lib/interfaces/adjustable-element.interface.d.ts +0 -5
  291. package/lib/interfaces/ao-options.interface.d.ts +0 -18
  292. package/lib/interfaces/changes.interface.d.ts +0 -9
  293. package/lib/interfaces/configuration-data.interface.d.ts +0 -40
  294. package/lib/interfaces/light-preset.interface.d.ts +0 -22
  295. package/lib/interfaces/post-processing-setting.interface.d.ts +0 -11
  296. package/lib/interfaces/scene-option-button.interface.d.ts +0 -19
  297. package/lib/interfaces/screen-size-info.d.ts +0 -10
  298. package/lib/interfaces/setting.interface.d.ts +0 -8
  299. package/lib/interfaces/texture.interface.d.ts +0 -44
  300. package/lib/interfaces/vignette-options.interface.d.ts +0 -4
  301. package/lib/model/ar-position-indicator.d.ts +0 -4
  302. package/lib/model/camera-settings.d.ts +0 -12
  303. package/lib/model/configuration-result-object.d.ts +0 -30
  304. package/lib/model/configurator-error-message.d.ts +0 -8
  305. package/lib/model/configurator-settings.d.ts +0 -62
  306. package/lib/model/custom-button.d.ts +0 -10
  307. package/lib/model/factory.d.ts +0 -5
  308. package/lib/model/icon.d.ts +0 -4
  309. package/lib/model/intersected-objects.d.ts +0 -6
  310. package/lib/model/light-preset.d.ts +0 -33
  311. package/lib/model/light-properties.d.ts +0 -25
  312. package/lib/model/material.d.ts +0 -41
  313. package/lib/model/metadata.d.ts +0 -78
  314. package/lib/model/render-parameters.d.ts +0 -12
  315. package/lib/model/setting-options.d.ts +0 -67
  316. package/lib/model/settings.d.ts +0 -10
  317. package/lib/model/shadow-properties.d.ts +0 -7
  318. package/lib/model/skin.d.ts +0 -15
  319. package/lib/model/texture.d.ts +0 -52
  320. package/lib/model/variation-settings.d.ts +0 -55
  321. package/lib/model/variation.d.ts +0 -11
  322. package/lib/model/xr-reticle.d.ts +0 -17
  323. package/lib/modules/render/enum/scene-type.enum.d.ts +0 -4
  324. package/lib/modules/render/model/ar-parameters.d.ts +0 -9
  325. package/lib/modules/render/model/scene-setting.d.ts +0 -13
  326. package/lib/modules/render/model/scene-settings.d.ts +0 -4
  327. package/lib/pipes/append.pipe.d.ts +0 -7
  328. package/lib/pipes/google-translate.pipe.d.ts +0 -11
  329. package/lib/pipes/localize.pipe.d.ts +0 -10
  330. package/lib/pipes/pipes.module.d.ts +0 -11
  331. package/lib/pipes/prepend.pipe.d.ts +0 -7
  332. package/lib/pipes/strip-html.pipe.d.ts +0 -7
  333. package/lib/services/app-event.service.d.ts +0 -32
  334. package/lib/services/app-initializer.service.d.ts +0 -14
  335. package/lib/services/ar.service.d.ts +0 -120
  336. package/lib/services/build-furniture-base.service.d.ts +0 -117
  337. package/lib/services/build-furniture-without-scene.service.d.ts +0 -14
  338. package/lib/services/build-furniture.service.d.ts +0 -14
  339. package/lib/services/bundle-initialzer.service.d.ts +0 -45
  340. package/lib/services/camera.service.d.ts +0 -44
  341. package/lib/services/configuration.service.d.ts +0 -18
  342. package/lib/services/configurator-connector.service.d.ts +0 -140
  343. package/lib/services/configurator.service.d.ts +0 -62
  344. package/lib/services/configuring.service.d.ts +0 -46
  345. package/lib/services/controls.d.ts +0 -11
  346. package/lib/services/debug.service.d.ts +0 -16
  347. package/lib/services/dictionary.service.d.ts +0 -15
  348. package/lib/services/dynamic-camera.service.d.ts +0 -21
  349. package/lib/services/floor-plane.service.d.ts +0 -47
  350. package/lib/services/font.service.d.ts +0 -10
  351. package/lib/services/google-translate.service.d.ts +0 -26
  352. package/lib/services/icon-cache.service.d.ts +0 -21
  353. package/lib/services/intersection.service.d.ts +0 -11
  354. package/lib/services/item.service.d.ts +0 -18
  355. package/lib/services/json-utils.service.d.ts +0 -7
  356. package/lib/services/light-creation.service.d.ts +0 -9
  357. package/lib/services/light-presets.service.d.ts +0 -34
  358. package/lib/services/lights.service.d.ts +0 -34
  359. package/lib/services/load-furniture-base.service.d.ts +0 -37
  360. package/lib/services/load-furniture-without-scene.service.d.ts +0 -9
  361. package/lib/services/load-furniture.service.d.ts +0 -9
  362. package/lib/services/loader.service.d.ts +0 -11
  363. package/lib/services/locator.service.d.ts +0 -7
  364. package/lib/services/message-board.service.d.ts +0 -18
  365. package/lib/services/post-processing.service.d.ts +0 -74
  366. package/lib/services/product-configurator.service.d.ts +0 -11
  367. package/lib/services/progress.service.d.ts +0 -9
  368. package/lib/services/scene-event.service.d.ts +0 -72
  369. package/lib/services/scene-options.service.d.ts +0 -11
  370. package/lib/services/scene.service.d.ts +0 -71
  371. package/lib/services/screen-size-analysis.service.d.ts +0 -32
  372. package/lib/services/settings.service.d.ts +0 -24
  373. package/lib/services/switch-build-furniture.service.d.ts +0 -21
  374. package/lib/services/switch-load-furniture.service.d.ts +0 -21
  375. package/lib/services/threedselector.service.d.ts +0 -17
  376. package/lib/services/utils.service.d.ts +0 -24
  377. package/lib/services/variation-cache.service.d.ts +0 -23
  378. package/lib/services/variation.service.d.ts +0 -26
  379. package/lib/services/view-mode.service.d.ts +0 -17
  380. package/lib/services/vr.service.d.ts +0 -42
  381. package/lib/services/xr.service.d.ts +0 -56
  382. package/lib/utils/asset.utils.d.ts +0 -19
  383. package/lib/utils/base-utils.d.ts +0 -4
  384. package/lib/utils/color.utils.d.ts +0 -8
  385. package/lib/utils/debug.utils.d.ts +0 -3
  386. package/lib/utils/device.utils.d.ts +0 -7
  387. package/lib/utils/file.utils.d.ts +0 -30
  388. package/lib/utils/image.utils.d.ts +0 -9
  389. package/lib/utils/json-parser.utils.d.ts +0 -9
  390. package/lib/utils/material.utils.d.ts +0 -34
  391. package/lib/utils/object.utils.d.ts +0 -32
  392. package/lib/utils/relative-position.utils.d.ts +0 -12
  393. package/lib/utils/rotation-helper.utils.d.ts +0 -6
  394. package/lib/utils/scene-3d.utils.d.ts +0 -8
  395. package/lib/utils/scene-utils.d.ts +0 -7
  396. package/lib/utils/text-utils.d.ts +0 -4
  397. package/lib/utils/threed.utils.d.ts +0 -20
  398. package/lib/utils/variation-utils.d.ts +0 -18
  399. package/public-api.d.ts +0 -60
@@ -1,213 +0,0 @@
1
- import { Box3, Euler, Mesh, Object3D, Quaternion, Vector2, Vector3 } from 'three';
2
- import { Selection } from '@colijnit/configuratorapi/build/model/selection';
3
- import { HdecoPositioning } from '@colijnit/configuratorapi/build/enum/hdeco-positioning.enum';
4
- export class Scene3DUtil {
5
- static updatePivot(obj) {
6
- const boundingBox = new Box3().setFromObject(obj);
7
- const bbCenterPivot = new Vector3();
8
- boundingBox.getCenter(bbCenterPivot);
9
- const delta = new Vector3().sub(bbCenterPivot).setY(Math.abs(Math.min(boundingBox.min.y, 0)));
10
- obj.children.forEach((child) => {
11
- child.position.add(delta);
12
- });
13
- obj.updateWorldMatrix(false, true);
14
- }
15
- static TrySelectorConnection(scene, parent, part1, part2, isFirstElement, createAddableFn) {
16
- let addable;
17
- if (createAddableFn) {
18
- addable = part2;
19
- part2 = createAddableFn(addable);
20
- }
21
- if (part1 && part2) {
22
- let con1;
23
- let con2;
24
- // if part2 is an addable and decoConnection is present, then no need to iterate through connectors
25
- if (addable && addable instanceof Selection && addable.decoConnection && addable.hdecoPositioning === HdecoPositioning.Variable) {
26
- con1 = part1.children.find(c => c.name === addable.decoConnection);
27
- if (!con1) {
28
- return false;
29
- }
30
- for (let ii = 0; ii < part2.children.length; ii++) {
31
- con2 = part2.children[ii];
32
- // if these connectors can connect connect them
33
- if (!con1.userData.connected && !con2.userData.connected && this.CanSelectorConnect(part1.children, con1, con2, isFirstElement)) {
34
- // if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(part1.children, con1, con2, isFirstElement)) {
35
- // if addable, continue this loop with a new addable
36
- if (addable) {
37
- const newPart2 = createAddableFn(addable, part2, part1);
38
- // reference of part2 changed, so refresh con2
39
- this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
40
- }
41
- else {
42
- return this.SelectorConnect(scene, parent, con1, con2);
43
- }
44
- }
45
- }
46
- }
47
- else {
48
- for (let i = 0; i < part1.children.length; i++) {
49
- for (let ii = 0; ii < part2.children.length; ii++) {
50
- con1 = part1.children[i];
51
- con2 = part2.children[ii];
52
- let con1Connected = false;
53
- if (con1 && con1.userData) {
54
- con1Connected = con1.userData.connected;
55
- }
56
- let con2Connected = false;
57
- if (con2 && con2.userData) {
58
- con2Connected = con2.userData.connected;
59
- }
60
- // if these connectors can connect connect them
61
- if (!con1Connected && !con2Connected && this.CanSelectorConnect(part1.children, con1, con2, isFirstElement)) {
62
- // if addable, continue this loop with a new addable
63
- if (addable) {
64
- const newPart2 = createAddableFn(addable, part2, part1);
65
- // reference of part2 changed, so refresh con2
66
- this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
67
- }
68
- else {
69
- return this.SelectorConnect(scene, parent, con1, con2);
70
- }
71
- }
72
- }
73
- }
74
- }
75
- }
76
- return false;
77
- }
78
- // public static TrySelectorConnection(scene: Scene, parent: Object3D,
79
- // part1: any, part2: any, createAddableFn?: Function): boolean {
80
- // let addable: any;
81
- // if (createAddableFn) {
82
- // addable = part2;
83
- // part2 = createAddableFn(addable);
84
- // }
85
- // for (let i = 0; i < part1.children.length; i++) {
86
- // for (let ii = 0; ii < part2.children.length; ii++) {
87
- // const con1: Object3D = part1.children[i];
88
- // const con2: Object3D = part2.children[ii];
89
- // // if these connectors can connect connect them
90
- // if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(con1, con2)) {
91
- // // if addable, continue this loop with a new addable
92
- // if (addable) {
93
- // const newPart2: Object3D = createAddableFn(addable, part2, part1);
94
- // // reference of part2 changed, so refresh con2
95
- // this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
96
- // } else {
97
- // return this.SelectorConnect(scene, parent, con1, con2);
98
- // }
99
- // }
100
- // }
101
- // }
102
- // return false;
103
- // }
104
- static Convert3DPointToScreenPoint(point, camera, width, height) {
105
- if (!point) {
106
- return new Vector2();
107
- }
108
- const vector = point.clone().project(camera);
109
- vector.x = (vector.x + 1) / 2 * width;
110
- vector.y = -(vector.y - 1) / 2 * height;
111
- return new Vector2(vector.x, vector.y);
112
- }
113
- static CanSelectorConnect(consPart1, con1, con2, startWithMale) {
114
- const con1Name = (con1 instanceof Object3D || con1 instanceof Mesh) ? con1.name : con1.connector;
115
- const con2Name = (con2 instanceof Object3D || con2 instanceof Mesh) ? con2.name : con2.connector;
116
- const sameParent = (con1 instanceof Object3D || con1 instanceof Mesh) &&
117
- (con2 instanceof Object3D || con2 instanceof Mesh) ? con1.parent === con2.parent : false;
118
- if (!con1Name || !con2Name) {
119
- return false;
120
- }
121
- const parts1 = con1Name.toUpperCase().split('_'), parts2 = con2Name.toUpperCase().split('_');
122
- if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
123
- const connectable = parts1[0] === 'C' && parts2[0] === 'C' &&
124
- parts1[1] === parts2[1] && parts1[2] !== parts2[2];
125
- return connectable;
126
- }
127
- return false;
128
- }
129
- // public static CanSelectorConnect(con1: Object3D | any, con2: Object3D | any): boolean {
130
- // const con1Name: string = con1 instanceof Object3D ? con1.name : con1.connector;
131
- // const con2Name: string = con2 instanceof Object3D ? con2.name : con2.connector;
132
- // const sameParent: boolean = con1 instanceof Object3D && con2 instanceof Object3D ? con1.parent === con2.parent : false;
133
- // const parts1: string[] = con1Name.toUpperCase().split('_'),
134
- // parts2: string[] = con2Name.toUpperCase().split('_');
135
- // if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
136
- // const connectable: boolean = parts1[0] === 'C' && parts2[0] === 'C' &&
137
- // parts1[1] === parts2[1] && parts1[2] !== parts2[2];
138
- // return connectable;
139
- // }
140
- // return false;
141
- // }
142
- static SelectorConnect(scene, parent, con1, con2) {
143
- if (!scene || !parent) {
144
- return false;
145
- }
146
- con1['connectedTo'] = con2 && con2.parent ? con2.parent.name : '';
147
- con2['connectedTo'] = con1 && con1.parent ? con1.parent.name : '';
148
- con1.userData.connectedTo = con2 && con2.parent ? con2.parent.name : '';
149
- con1.userData.connected = false;
150
- con2.userData.connectedTo = con1 && con1.parent ? con1.parent.name : '';
151
- con2.userData.connected = false;
152
- const motherRotation = new Euler(0, 0, 0);
153
- const motherPosition = new Vector3(0, 0, 0);
154
- parent.updateMatrixWorld();
155
- motherRotation.copy(parent.rotation);
156
- parent.getWorldPosition(motherPosition);
157
- parent.rotation.set(0, 0, 0);
158
- parent.position.set(0, 0, 0);
159
- scene.updateMatrixWorld(true);
160
- const con1Quat = new Quaternion();
161
- if (con1) {
162
- con1.getWorldQuaternion(con1Quat);
163
- }
164
- const con2Quat = new Quaternion();
165
- if (con2) {
166
- con2.getWorldQuaternion(con2Quat);
167
- }
168
- const con1QuatParent = new Quaternion();
169
- if (con1 && con1.parent) {
170
- con1.parent.getWorldQuaternion(con1QuatParent);
171
- }
172
- const con2QuatParent = new Quaternion();
173
- if (con2 && con2.parent) {
174
- con2.parent.getWorldQuaternion(con2QuatParent);
175
- }
176
- const rotation = new Quaternion().multiplyQuaternions(con1Quat.invert(), con2Quat).multiply(new Quaternion().multiplyQuaternions(con1QuatParent, con1QuatParent));
177
- if (con2 && con2.parent) {
178
- con2.parent.quaternion.copy(rotation);
179
- }
180
- // Update because the matrix has been tempered with
181
- scene.updateMatrixWorld(true);
182
- // Move the connectors towards eachother
183
- const con1Pos = new Vector3();
184
- if (con1) {
185
- con1.getWorldPosition(con1Pos);
186
- }
187
- const con2Pos = new Vector3();
188
- if (con2) {
189
- con2.getWorldPosition(con2Pos);
190
- }
191
- const move = con1Pos.sub(con2Pos);
192
- if (con2 && con2.parent) {
193
- con2.parent.position.x += move.x;
194
- con2.parent.position.y += move.y;
195
- con2.parent.position.z += move.z;
196
- }
197
- // reset parent's objects rotation and position
198
- parent.rotation.copy(motherRotation);
199
- parent.position.copy(motherPosition);
200
- scene.updateMatrixWorld(true);
201
- // Set the connected flag
202
- if (con1) {
203
- // con1['connected'] = true;
204
- con1.userData.connected = true;
205
- }
206
- if (con2) {
207
- // con2['connected'] = true;
208
- con2.userData.connected = true;
209
- }
210
- return true;
211
- }
212
- }
213
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtM2QudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25maWd1cmF0b3Ivc3JjL2xpYi91dGlscy9zY2VuZS0zZC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsSUFBSSxFQUFVLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQy9GLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUMxRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw2REFBNkQsQ0FBQztBQUU3RixNQUFNLE9BQU8sV0FBVztJQUVmLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBYTtRQUNyQyxNQUFNLFdBQVcsR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4RCxNQUFNLGFBQWEsR0FBWSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdDLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckMsTUFBTSxLQUFLLEdBQVksSUFBSSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNsQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztRQUNILEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7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ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0JveDMsIENhbWVyYSwgRXVsZXIsIE1lc2gsIE9iamVjdDNELCBRdWF0ZXJuaW9uLCBTY2VuZSwgVmVjdG9yMiwgVmVjdG9yM30gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9zZWxlY3Rpb24nO1xyXG5pbXBvcnQge0hkZWNvUG9zaXRpb25pbmd9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9oZGVjby1wb3NpdGlvbmluZy5lbnVtJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTY2VuZTNEVXRpbCB7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlUGl2b3Qob2JqOiBPYmplY3QzRCkge1xyXG4gICAgY29uc3QgYm91bmRpbmdCb3g6IEJveDMgPSBuZXcgQm94MygpLnNldEZyb21PYmplY3Qob2JqKTtcclxuICAgIGNvbnN0IGJiQ2VudGVyUGl2b3Q6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygpO1xyXG4gICAgYm91bmRpbmdCb3guZ2V0Q2VudGVyKGJiQ2VudGVyUGl2b3QpO1xyXG4gICAgY29uc3QgZGVsdGE6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygpLnN1YihiYkNlbnRlclBpdm90KS5zZXRZKE1hdGguYWJzKE1hdGgubWluKGJvdW5kaW5nQm94Lm1pbi55LCAwKSkpO1xyXG5cclxuICAgIG9iai5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XHJcbiAgICAgIGNoaWxkLnBvc2l0aW9uLmFkZChkZWx0YSk7XHJcbiAgICB9KTtcclxuICAgIG9iai51cGRhdGVXb3JsZE1hdHJpeChmYWxzZSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIFRyeVNlbGVjdG9yQ29ubmVjdGlvbihcclxuICAgIHNjZW5lOiBTY2VuZSxcclxuICAgIHBhcmVudDogT2JqZWN0M0QsXHJcbiAgICBwYXJ0MTogYW55LFxyXG4gICAgcGFydDI6IGFueSxcclxuICAgIGlzRmlyc3RFbGVtZW50OiBib29sZWFuLFxyXG4gICAgY3JlYXRlQWRkYWJsZUZuPzogRnVuY3Rpb25cclxuICApOiBib29sZWFuIHtcclxuICAgIGxldCBhZGRhYmxlOiBhbnk7XHJcbiAgICBpZiAoY3JlYXRlQWRkYWJsZUZuKSB7XHJcbiAgICAgIGFkZGFibGUgPSBwYXJ0MjtcclxuICAgICAgcGFydDIgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSk7XHJcbiAgICB9XHJcbiAgICBpZiAocGFydDEgJiYgcGFydDIpIHtcclxuICAgICAgbGV0IGNvbjE6IE9iamVjdDNEO1xyXG4gICAgICBsZXQgY29uMjogT2JqZWN0M0Q7XHJcbiAgICAgIC8vIGlmIHBhcnQyIGlzIGFuIGFkZGFibGUgYW5kIGRlY29Db25uZWN0aW9uIGlzIHByZXNlbnQsIHRoZW4gbm8gbmVlZCB0byBpdGVyYXRlIHRocm91Z2ggY29ubmVjdG9yc1xyXG4gICAgICBpZiAoYWRkYWJsZSAmJiBhZGRhYmxlIGluc3RhbmNlb2YgU2VsZWN0aW9uICYmIGFkZGFibGUuZGVjb0Nvbm5lY3Rpb24gJiYgYWRkYWJsZS5oZGVjb1Bvc2l0aW9uaW5nID09PSBIZGVjb1Bvc2l0aW9uaW5nLlZhcmlhYmxlKSB7XHJcbiAgICAgICAgY29uMSA9IHBhcnQxLmNoaWxkcmVuLmZpbmQoYyA9PiBjLm5hbWUgPT09IGFkZGFibGUuZGVjb0Nvbm5lY3Rpb24pO1xyXG4gICAgICAgIGlmICghY29uMSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgcGFydDIuY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7XHJcbiAgICAgICAgICBjb24yID0gcGFydDIuY2hpbGRyZW5baWldO1xyXG4gICAgICAgICAgLy8gaWYgdGhlc2UgY29ubmVjdG9ycyBjYW4gY29ubmVjdCBjb25uZWN0IHRoZW1cclxuICAgICAgICAgIGlmICghY29uMS51c2VyRGF0YS5jb25uZWN0ZWQgJiYgIWNvbjIudXNlckRhdGEuY29ubmVjdGVkICYmIHRoaXMuQ2FuU2VsZWN0b3JDb25uZWN0KHBhcnQxLmNoaWxkcmVuLCBjb24xLCBjb24yLCBpc0ZpcnN0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgLy8gaWYgKCFjb24xWydjb25uZWN0ZWQnXSAmJiAhY29uMlsnY29ubmVjdGVkJ10gJiYgdGhpcy5DYW5TZWxlY3RvckNvbm5lY3QocGFydDEuY2hpbGRyZW4sIGNvbjEsIGNvbjIsIGlzRmlyc3RFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAvLyBpZiBhZGRhYmxlLCBjb250aW51ZSB0aGlzIGxvb3Agd2l0aCBhIG5ldyBhZGRhYmxlXHJcbiAgICAgICAgICAgIGlmIChhZGRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgbmV3UGFydDI6IGFueSA9IGNyZWF0ZUFkZGFibGVGbihhZGRhYmxlLCBwYXJ0MiwgcGFydDEpO1xyXG4gICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBvZiBwYXJ0MiBjaGFuZ2VkLCBzbyByZWZyZXNoIGNvbjJcclxuICAgICAgICAgICAgICB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBuZXdQYXJ0Mi5jaGlsZHJlbltpaV0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBjb24yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnQxLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgcGFydDIuY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbjEgPSBwYXJ0MS5jaGlsZHJlbltpXTtcclxuICAgICAgICAgICAgY29uMiA9IHBhcnQyLmNoaWxkcmVuW2lpXTtcclxuXHJcbiAgICAgICAgICAgIGxldCBjb24xQ29ubmVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChjb24xICYmIGNvbjEudXNlckRhdGEpIHtcclxuICAgICAgICAgICAgICBjb24xQ29ubmVjdGVkID0gY29uMS51c2VyRGF0YS5jb25uZWN0ZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGNvbjJDb25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKGNvbjIgJiYgY29uMi51c2VyRGF0YSkge1xyXG4gICAgICAgICAgICAgIGNvbjJDb25uZWN0ZWQgPSBjb24yLnVzZXJEYXRhLmNvbm5lY3RlZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiB0aGVzZSBjb25uZWN0b3JzIGNhbiBjb25uZWN0IGNvbm5lY3QgdGhlbVxyXG4gICAgICAgICAgICBpZiAoIWNvbjFDb25uZWN0ZWQgJiYgIWNvbjJDb25uZWN0ZWQgJiYgdGhpcy5DYW5TZWxlY3RvckNvbm5lY3QocGFydDEuY2hpbGRyZW4sIGNvbjEsIGNvbjIsIGlzRmlyc3RFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgIC8vIGlmIGFkZGFibGUsIGNvbnRpbnVlIHRoaXMgbG9vcCB3aXRoIGEgbmV3IGFkZGFibGVcclxuICAgICAgICAgICAgICBpZiAoYWRkYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UGFydDI6IGFueSA9IGNyZWF0ZUFkZGFibGVGbihhZGRhYmxlLCBwYXJ0MiwgcGFydDEpO1xyXG4gICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIG9mIHBhcnQyIGNoYW5nZWQsIHNvIHJlZnJlc2ggY29uMlxyXG4gICAgICAgICAgICAgICAgdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgbmV3UGFydDIuY2hpbGRyZW5baWldKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuU2VsZWN0b3JDb25uZWN0KHNjZW5lLCBwYXJlbnQsIGNvbjEsIGNvbjIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIHN0YXRpYyBUcnlTZWxlY3RvckNvbm5lY3Rpb24oc2NlbmU6IFNjZW5lLCBwYXJlbnQ6IE9iamVjdDNELFxyXG4gIC8vICAgICBwYXJ0MTogYW55LCBwYXJ0MjogYW55LCBjcmVhdGVBZGRhYmxlRm4/OiBGdW5jdGlvbik6IGJvb2xlYW4ge1xyXG4gIC8vICAgICBsZXQgYWRkYWJsZTogYW55O1xyXG4gIC8vICAgICBpZiAoY3JlYXRlQWRkYWJsZUZuKSB7XHJcbiAgLy8gICAgICAgICBhZGRhYmxlID0gcGFydDI7XHJcbiAgLy8gICAgICAgICBwYXJ0MiA9IGNyZWF0ZUFkZGFibGVGbihhZGRhYmxlKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnQxLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgcGFydDIuY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgY29uMTogT2JqZWN0M0QgPSBwYXJ0MS5jaGlsZHJlbltpXTtcclxuICAvLyAgICAgICAgICAgICBjb25zdCBjb24yOiBPYmplY3QzRCA9IHBhcnQyLmNoaWxkcmVuW2lpXTtcclxuICAvLyAgICAgICAgICAgICAvLyBpZiB0aGVzZSBjb25uZWN0b3JzIGNhbiBjb25uZWN0IGNvbm5lY3QgdGhlbVxyXG4gIC8vICAgICAgICAgICAgIGlmICghY29uMVsnY29ubmVjdGVkJ10gJiYgIWNvbjJbJ2Nvbm5lY3RlZCddICYmIHRoaXMuQ2FuU2VsZWN0b3JDb25uZWN0KGNvbjEsIGNvbjIpKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgIC8vIGlmIGFkZGFibGUsIGNvbnRpbnVlIHRoaXMgbG9vcCB3aXRoIGEgbmV3IGFkZGFibGVcclxuICAvLyAgICAgICAgICAgICAgICAgaWYgKGFkZGFibGUpIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhcnQyOiBPYmplY3QzRCA9IGNyZWF0ZUFkZGFibGVGbihhZGRhYmxlLCBwYXJ0MiwgcGFydDEpO1xyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIG9mIHBhcnQyIGNoYW5nZWQsIHNvIHJlZnJlc2ggY29uMlxyXG4gIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgbmV3UGFydDIuY2hpbGRyZW5baWldKTtcclxuICAvLyAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBjb24yKTtcclxuICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgICByZXR1cm4gZmFsc2U7XHJcbiAgLy8gfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIENvbnZlcnQzRFBvaW50VG9TY3JlZW5Qb2ludChwb2ludDogVmVjdG9yMywgY2FtZXJhOiBDYW1lcmEsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogVmVjdG9yMiB7XHJcbiAgICBpZiAoIXBvaW50KSB7XHJcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMigpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdmVjdG9yOiBWZWN0b3IzID0gcG9pbnQuY2xvbmUoKS5wcm9qZWN0KGNhbWVyYSk7XHJcbiAgICB2ZWN0b3IueCA9ICh2ZWN0b3IueCArIDEpIC8gMiAqIHdpZHRoO1xyXG4gICAgdmVjdG9yLnkgPSAtKHZlY3Rvci55IC0gMSkgLyAyICogaGVpZ2h0O1xyXG4gICAgcmV0dXJuIG5ldyBWZWN0b3IyKHZlY3Rvci54LCB2ZWN0b3IueSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIENhblNlbGVjdG9yQ29ubmVjdChcclxuICAgIGNvbnNQYXJ0MTogT2JqZWN0M0RbXSxcclxuICAgIGNvbjE6IE9iamVjdDNEIHwgYW55LFxyXG4gICAgY29uMjogT2JqZWN0M0QgfCBhbnksXHJcbiAgICBzdGFydFdpdGhNYWxlPzogYm9vbGVhblxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgY29uMU5hbWU6IHN0cmluZyA9IChjb24xIGluc3RhbmNlb2YgT2JqZWN0M0QgfHwgY29uMSBpbnN0YW5jZW9mIE1lc2gpID8gY29uMS5uYW1lIDogY29uMS5jb25uZWN0b3I7XHJcbiAgICBjb25zdCBjb24yTmFtZTogc3RyaW5nID0gKGNvbjIgaW5zdGFuY2VvZiBPYmplY3QzRCB8fCBjb24yIGluc3RhbmNlb2YgTWVzaCkgPyBjb24yLm5hbWUgOiBjb24yLmNvbm5lY3RvcjtcclxuICAgIGNvbnN0IHNhbWVQYXJlbnQ6IGJvb2xlYW4gPSAoY29uMSBpbnN0YW5jZW9mIE9iamVjdDNEIHx8IGNvbjEgaW5zdGFuY2VvZiBNZXNoKSAmJlxyXG4gICAgKGNvbjIgaW5zdGFuY2VvZiBPYmplY3QzRCB8fCBjb24yIGluc3RhbmNlb2YgTWVzaCkgPyBjb24xLnBhcmVudCA9PT0gY29uMi5wYXJlbnQgOiBmYWxzZTtcclxuXHJcbiAgICBpZiAoIWNvbjFOYW1lIHx8ICFjb24yTmFtZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJ0czE6IHN0cmluZ1tdID0gY29uMU5hbWUudG9VcHBlckNhc2UoKS5zcGxpdCgnXycpLFxyXG4gICAgICBwYXJ0czI6IHN0cmluZ1tdID0gY29uMk5hbWUudG9VcHBlckNhc2UoKS5zcGxpdCgnXycpO1xyXG5cclxuICAgIGlmIChwYXJ0czEubGVuZ3RoID49IDMgJiYgcGFydHMyLmxlbmd0aCA+PSAzICYmICFzYW1lUGFyZW50KSB7XHJcbiAgICAgIGNvbnN0IGNvbm5lY3RhYmxlOiBib29sZWFuID0gcGFydHMxWzBdID09PSAnQycgJiYgcGFydHMyWzBdID09PSAnQycgJiZcclxuICAgICAgICBwYXJ0czFbMV0gPT09IHBhcnRzMlsxXSAmJiBwYXJ0czFbMl0gIT09IHBhcnRzMlsyXTtcclxuICAgICAgcmV0dXJuIGNvbm5lY3RhYmxlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIHN0YXRpYyBDYW5TZWxlY3RvckNvbm5lY3QoY29uMTogT2JqZWN0M0QgfCBhbnksIGNvbjI6IE9iamVjdDNEIHwgYW55KTogYm9vbGVhbiB7XHJcbiAgLy8gICAgIGNvbnN0IGNvbjFOYW1lOiBzdHJpbmcgPSBjb24xIGluc3RhbmNlb2YgT2JqZWN0M0QgPyBjb24xLm5hbWUgOiBjb24xLmNvbm5lY3RvcjtcclxuICAvLyAgICAgY29uc3QgY29uMk5hbWU6IHN0cmluZyA9IGNvbjIgaW5zdGFuY2VvZiBPYmplY3QzRCA/IGNvbjIubmFtZSA6IGNvbjIuY29ubmVjdG9yO1xyXG4gIC8vICAgICBjb25zdCBzYW1lUGFyZW50OiBib29sZWFuID0gY29uMSBpbnN0YW5jZW9mIE9iamVjdDNEICYmIGNvbjIgaW5zdGFuY2VvZiBPYmplY3QzRCA/IGNvbjEucGFyZW50ID09PSBjb24yLnBhcmVudCA6IGZhbHNlO1xyXG4gIC8vICAgICBjb25zdCBwYXJ0czE6IHN0cmluZ1tdID0gY29uMU5hbWUudG9VcHBlckNhc2UoKS5zcGxpdCgnXycpLFxyXG4gIC8vICAgICAgICAgcGFydHMyOiBzdHJpbmdbXSA9IGNvbjJOYW1lLnRvVXBwZXJDYXNlKCkuc3BsaXQoJ18nKTtcclxuICAvLyAgICAgaWYgKHBhcnRzMS5sZW5ndGggPj0gMyAmJiBwYXJ0czIubGVuZ3RoID49IDMgJiYgIXNhbWVQYXJlbnQpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IGNvbm5lY3RhYmxlOiBib29sZWFuID0gcGFydHMxWzBdID09PSAnQycgJiYgcGFydHMyWzBdID09PSAnQycgJiZcclxuICAvLyAgICAgICAgICAgICBwYXJ0czFbMV0gPT09IHBhcnRzMlsxXSAmJiBwYXJ0czFbMl0gIT09IHBhcnRzMlsyXTtcclxuICAvLyAgICAgICAgIHJldHVybiBjb25uZWN0YWJsZTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICByZXR1cm4gZmFsc2U7XHJcbiAgLy8gfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBTZWxlY3RvckNvbm5lY3Qoc2NlbmU6IFNjZW5lLCBwYXJlbnQ6IE9iamVjdDNELCBjb24xOiBPYmplY3QzRCwgY29uMjogT2JqZWN0M0QpOiBib29sZWFuIHtcclxuICAgIGlmICghc2NlbmUgfHwgIXBhcmVudCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb24xWydjb25uZWN0ZWRUbyddID0gY29uMiAmJiBjb24yLnBhcmVudCA/IGNvbjIucGFyZW50Lm5hbWUgOiAnJztcclxuICAgIGNvbjJbJ2Nvbm5lY3RlZFRvJ10gPSBjb24xICYmIGNvbjEucGFyZW50ID8gY29uMS5wYXJlbnQubmFtZSA6ICcnO1xyXG5cclxuICAgIGNvbjEudXNlckRhdGEuY29ubmVjdGVkVG8gPSBjb24yICYmIGNvbjIucGFyZW50ID8gY29uMi5wYXJlbnQubmFtZSA6ICcnO1xyXG4gICAgY29uMS51c2VyRGF0YS5jb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgIGNvbjIudXNlckRhdGEuY29ubmVjdGVkVG8gPSBjb24xICYmIGNvbjEucGFyZW50ID8gY29uMS5wYXJlbnQubmFtZSA6ICcnO1xyXG4gICAgY29uMi51c2VyRGF0YS5jb25uZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBtb3RoZXJSb3RhdGlvbjogRXVsZXIgPSBuZXcgRXVsZXIoMCwgMCwgMCk7XHJcbiAgICBjb25zdCBtb3RoZXJQb3NpdGlvbjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKDAsIDAsIDApO1xyXG5cclxuICAgIHBhcmVudC51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG4gICAgbW90aGVyUm90YXRpb24uY29weShwYXJlbnQucm90YXRpb24pO1xyXG4gICAgcGFyZW50LmdldFdvcmxkUG9zaXRpb24obW90aGVyUG9zaXRpb24pO1xyXG5cclxuICAgIHBhcmVudC5yb3RhdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICBwYXJlbnQucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG5cclxuICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG5cclxuICAgIGNvbnN0IGNvbjFRdWF0OiBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcclxuICAgIGlmIChjb24xKSB7XHJcbiAgICAgIGNvbjEuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjFRdWF0KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbjJRdWF0OiBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcclxuICAgIGlmIChjb24yKSB7XHJcbiAgICAgIGNvbjIuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjJRdWF0KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbjFRdWF0UGFyZW50OiBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcclxuICAgIGlmIChjb24xICYmIGNvbjEucGFyZW50KSB7XHJcbiAgICAgIGNvbjEucGFyZW50LmdldFdvcmxkUXVhdGVybmlvbihjb24xUXVhdFBhcmVudCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb24yUXVhdFBhcmVudDogUXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XHJcbiAgICBpZiAoY29uMiAmJiBjb24yLnBhcmVudCkge1xyXG4gICAgICBjb24yLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXRQYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvdGF0aW9uOiBRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gICAgICBjb24xUXVhdC5pbnZlcnQoKSxcclxuICAgICAgY29uMlF1YXRcclxuICAgICkubXVsdGlwbHkoXHJcbiAgICAgIG5ldyBRdWF0ZXJuaW9uKCkubXVsdGlwbHlRdWF0ZXJuaW9ucyhcclxuICAgICAgICBjb24xUXVhdFBhcmVudCxcclxuICAgICAgICBjb24xUXVhdFBhcmVudFxyXG4gICAgICApXHJcbiAgICApO1xyXG4gICAgaWYgKGNvbjIgJiYgY29uMi5wYXJlbnQpIHtcclxuICAgICAgY29uMi5wYXJlbnQucXVhdGVybmlvbi5jb3B5KHJvdGF0aW9uKTtcclxuICAgIH1cclxuICAgIC8vIFVwZGF0ZSBiZWNhdXNlIHRoZSBtYXRyaXggaGFzIGJlZW4gdGVtcGVyZWQgd2l0aFxyXG4gICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgLy8gTW92ZSB0aGUgY29ubmVjdG9ycyB0b3dhcmRzIGVhY2hvdGhlclxyXG4gICAgY29uc3QgY29uMVBvczogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICBpZiAoY29uMSkge1xyXG4gICAgICBjb24xLmdldFdvcmxkUG9zaXRpb24oY29uMVBvcyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb24yUG9zOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcclxuICAgIGlmIChjb24yKSB7XHJcbiAgICAgIGNvbjIuZ2V0V29ybGRQb3NpdGlvbihjb24yUG9zKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtb3ZlOiBWZWN0b3IzID0gY29uMVBvcy5zdWIoY29uMlBvcyk7XHJcbiAgICBpZiAoY29uMiAmJiBjb24yLnBhcmVudCkge1xyXG4gICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi54ICs9IG1vdmUueDtcclxuICAgICAgY29uMi5wYXJlbnQucG9zaXRpb24ueSArPSBtb3ZlLnk7XHJcbiAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnogKz0gbW92ZS56O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlc2V0IHBhcmVudCdzIG9iamVjdHMgcm90YXRpb24gYW5kIHBvc2l0aW9uXHJcbiAgICBwYXJlbnQucm90YXRpb24uY29weShtb3RoZXJSb3RhdGlvbik7XHJcbiAgICBwYXJlbnQucG9zaXRpb24uY29weShtb3RoZXJQb3NpdGlvbik7XHJcblxyXG4gICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgLy8gU2V0IHRoZSBjb25uZWN0ZWQgZmxhZ1xyXG4gICAgaWYgKGNvbjEpIHtcclxuICAgICAgLy8gY29uMVsnY29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICBjb24xLnVzZXJEYXRhLmNvbm5lY3RlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoY29uMikge1xyXG4gICAgICAvLyBjb24yWydjb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAgIGNvbjIudXNlckRhdGEuY29ubmVjdGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxufVxyXG5cclxuIl19
@@ -1,191 +0,0 @@
1
- import * as THREE from 'three';
2
- import { Selection } from '@colijnit/configuratorapi/build/model/selection';
3
- export class SceneUtils {
4
- static TrySelectorConnection(scene, parent, part1, part2, isFirstElement, createAddableFn) {
5
- let addable;
6
- if (createAddableFn) {
7
- addable = part2;
8
- part2 = createAddableFn(addable);
9
- }
10
- if (part1 && part2) {
11
- let con1;
12
- let con2;
13
- // if part2 is an addable and decoConnection is present, then no need to iterate through connectors
14
- if (addable && addable instanceof Selection && addable.decoConnection) {
15
- con1 = part1.children.find(c => c.name === addable.decoConnection);
16
- if (!con1) {
17
- return false;
18
- }
19
- for (let ii = 0; ii < part2.children.length; ii++) {
20
- con2 = part2.children[ii];
21
- // if these connectors can connect connect them
22
- if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(part1.children, con1, con2, isFirstElement)) {
23
- // if addable, continue this loop with a new addable
24
- if (addable) {
25
- const newPart2 = createAddableFn(addable, part2, part1);
26
- // reference of part2 changed, so refresh con2
27
- this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
28
- }
29
- else {
30
- return this.SelectorConnect(scene, parent, con1, con2);
31
- }
32
- }
33
- }
34
- }
35
- else {
36
- for (let i = 0; i < part1.children.length; i++) {
37
- for (let ii = 0; ii < part2.children.length; ii++) {
38
- con1 = part1.children[i];
39
- con2 = part2.children[ii];
40
- // if these connectors can connect connect them
41
- if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(part1.children, con1, con2, isFirstElement)) {
42
- // if addable, continue this loop with a new addable
43
- if (addable) {
44
- const newPart2 = createAddableFn(addable, part2, part1);
45
- // reference of part2 changed, so refresh con2
46
- this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
47
- }
48
- else {
49
- return this.SelectorConnect(scene, parent, con1, con2);
50
- }
51
- }
52
- }
53
- }
54
- }
55
- }
56
- return false;
57
- }
58
- // public static TrySelectorConnection(scene: THREE.Scene, parent: THREE.Object3D,
59
- // part1: any, part2: any, createAddableFn?: Function): boolean {
60
- // let addable: any;
61
- // if (createAddableFn) {
62
- // addable = part2;
63
- // part2 = createAddableFn(addable);
64
- // }
65
- // for (let i = 0; i < part1.children.length; i++) {
66
- // for (let ii = 0; ii < part2.children.length; ii++) {
67
- // const con1: THREE.Object3D = part1.children[i];
68
- // const con2: THREE.Object3D = part2.children[ii];
69
- // // if these connectors can connect connect them
70
- // if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(con1, con2)) {
71
- // // if addable, continue this loop with a new addable
72
- // if (addable) {
73
- // const newPart2: THREE.Object3D = createAddableFn(addable, part2, part1);
74
- // // reference of part2 changed, so refresh con2
75
- // this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
76
- // } else {
77
- // return this.SelectorConnect(scene, parent, con1, con2);
78
- // }
79
- // }
80
- // }
81
- // }
82
- // return false;
83
- // }
84
- static Convert3DPointToScreenPoint(point, camera, width, height) {
85
- if (!point) {
86
- return new THREE.Vector2();
87
- }
88
- const vector = point.clone().project(camera);
89
- vector.x = (vector.x + 1) / 2 * width;
90
- vector.y = -(vector.y - 1) / 2 * height;
91
- return new THREE.Vector2(vector.x, vector.y);
92
- }
93
- static CanSelectorConnect(consPart1, con1, con2, startWithMale) {
94
- // const con1Name: string = (con1.constructor.name === 'Mesh' || con1.constructor.name === 'Object3D') ? con1.name : con1.connector;
95
- const con1Name = (con1 instanceof THREE.Object3D || con1 instanceof THREE.Mesh) ? con1.name : con1.connector;
96
- // const con2Name: string = (con2.constructor.name === 'Mesh' || con2.constructor.name === 'Object3D') ? con2.name : con2.connector;
97
- const con2Name = (con2 instanceof THREE.Object3D || con2 instanceof THREE.Mesh) ? con2.name : con2.connector;
98
- // const sameParent: boolean = (con1.constructor.name === 'Mesh' || con1.constructor.name === 'Object3D') &&
99
- // (con2.constructor.name === 'Mesh' || con2.constructor.name === 'Object3D') ? con1.parent === con2.parent : false;
100
- const sameParent = (con1 instanceof THREE.Object3D || con1 instanceof THREE.Mesh) &&
101
- (con2 instanceof THREE.Object3D || con2 instanceof THREE.Mesh) ? con1.parent === con2.parent : false;
102
- if (!con1Name || !con2Name) {
103
- return false;
104
- }
105
- const parts1 = con1Name.toUpperCase().split('_'), parts2 = con2Name.toUpperCase().split('_');
106
- if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
107
- const connectable = parts1[0] === 'C' && parts2[0] === 'C' &&
108
- parts1[1] === parts2[1] && parts1[2] !== parts2[2];
109
- return connectable;
110
- }
111
- return false;
112
- }
113
- // public static CanSelectorConnect(con1: THREE.Object3D | any, con2: THREE.Object3D | any): boolean {
114
- // const con1Name: string = con1 instanceof THREE.Object3D ? con1.name : con1.connector;
115
- // const con2Name: string = con2 instanceof THREE.Object3D ? con2.name : con2.connector;
116
- // const sameParent: boolean = con1 instanceof THREE.Object3D && con2 instanceof THREE.Object3D ? con1.parent === con2.parent : false;
117
- // const parts1: string[] = con1Name.toUpperCase().split('_'),
118
- // parts2: string[] = con2Name.toUpperCase().split('_');
119
- // if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
120
- // const connectable: boolean = parts1[0] === 'C' && parts2[0] === 'C' &&
121
- // parts1[1] === parts2[1] && parts1[2] !== parts2[2];
122
- // return connectable;
123
- // }
124
- // return false;
125
- // }
126
- static SelectorConnect(scene, parent, con1, con2) {
127
- if (!scene || !parent) {
128
- return false;
129
- }
130
- con1['connectedTo'] = con2 && con2.parent ? con2.parent.name : '';
131
- con2['connectedTo'] = con1 && con1.parent ? con1.parent.name : '';
132
- const motherRotation = new THREE.Euler(0, 0, 0);
133
- const motherPosition = new THREE.Vector3(0, 0, 0);
134
- parent.updateMatrixWorld();
135
- motherRotation.copy(parent.rotation);
136
- parent.getWorldPosition(motherPosition);
137
- parent.rotation.set(0, 0, 0);
138
- parent.position.set(0, 0, 0);
139
- scene.updateMatrixWorld(true);
140
- const con1Quat = new THREE.Quaternion();
141
- if (con1) {
142
- con1.getWorldQuaternion(con1Quat);
143
- }
144
- const con2Quat = new THREE.Quaternion();
145
- if (con2) {
146
- con2.getWorldQuaternion(con2Quat);
147
- }
148
- const con1QuatParent = new THREE.Quaternion();
149
- if (con1 && con1.parent) {
150
- con1.parent.getWorldQuaternion(con1QuatParent);
151
- }
152
- const con2QuatParent = new THREE.Quaternion();
153
- if (con2 && con2.parent) {
154
- con2.parent.getWorldQuaternion(con2QuatParent);
155
- }
156
- const rotation = new THREE.Quaternion().multiplyQuaternions(con1Quat.invert(), con2Quat).multiply(new THREE.Quaternion().multiplyQuaternions(con1QuatParent, con1QuatParent));
157
- if (con2 && con2.parent) {
158
- con2.parent.quaternion.copy(rotation);
159
- }
160
- // Update because the matrix has been tempered with
161
- scene.updateMatrixWorld(true);
162
- // Move the connectors towards eachother
163
- const con1Pos = new THREE.Vector3();
164
- if (con1) {
165
- con1.getWorldPosition(con1Pos);
166
- }
167
- const con2Pos = new THREE.Vector3();
168
- if (con2) {
169
- con2.getWorldPosition(con2Pos);
170
- }
171
- const move = con1Pos.sub(con2Pos);
172
- if (con2 && con2.parent) {
173
- con2.parent.position.x += move.x;
174
- con2.parent.position.y += move.y;
175
- con2.parent.position.z += move.z;
176
- }
177
- // reset parent's objects rotation and position
178
- parent.rotation.copy(motherRotation);
179
- parent.position.copy(motherPosition);
180
- scene.updateMatrixWorld(true);
181
- // Set the connected flag
182
- if (con1) {
183
- con1['connected'] = true;
184
- }
185
- if (con2) {
186
- con2['connected'] = true;
187
- }
188
- return true;
189
- }
190
- }
191
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25maWd1cmF0b3Ivc3JjL2xpYi91dGlscy9zY2VuZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saURBQWlELENBQUM7QUFFMUUsTUFBTSxPQUFPLFVBQVU7SUFFZCxNQUFNLENBQUMscUJBQXFCLENBQ2pDLEtBQWtCLEVBQ2xCLE1BQXNCLEVBQ3RCLEtBQVUsRUFDVixLQUFVLEVBQ1YsY0FBdUIsRUFDdkIsZUFBMEI7UUFFMUIsSUFBSSxPQUFZLENBQUM7UUFDakIsSUFBSSxlQUFlLEVBQUU7WUFDbkIsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFO1lBQ2xCLElBQUksSUFBb0IsQ0FBQztZQUN6QixJQUFJLElBQW9CLENBQUM7WUFDekIsbUdBQW1HO1lBQ25HLElBQUksT0FBTyxJQUFJLE9BQU8sWUFBWSxTQUFTLElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRTtnQkFDckUsSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ1QsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFO29CQUNqRCxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FB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RSxDQUFDO1FBQ25ELElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsTUFBTSxJQUFJLEdBQWtCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNsQztRQUVELCtDQUErQztRQUMvQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVyQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFOUIseUJBQXlCO1FBQ3pCLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUMxQjtRQUNELElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUMxQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQWlFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0aW9uJztcclxuXHJcbmV4cG9ydCBjbGFzcyBTY2VuZVV0aWxzIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBUcnlTZWxlY3RvckNvbm5lY3Rpb24oXHJcbiAgICBzY2VuZTogVEhSRUUuU2NlbmUsXHJcbiAgICBwYXJlbnQ6IFRIUkVFLk9iamVjdDNELFxyXG4gICAgcGFydDE6IGFueSxcclxuICAgIHBhcnQyOiBhbnksXHJcbiAgICBpc0ZpcnN0RWxlbWVudDogYm9vbGVhbixcclxuICAgIGNyZWF0ZUFkZGFibGVGbj86IEZ1bmN0aW9uXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYWRkYWJsZTogYW55O1xyXG4gICAgaWYgKGNyZWF0ZUFkZGFibGVGbikge1xyXG4gICAgICBhZGRhYmxlID0gcGFydDI7XHJcbiAgICAgIHBhcnQyID0gY3JlYXRlQWRkYWJsZUZuKGFkZGFibGUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHBhcnQxICYmIHBhcnQyKSB7XHJcbiAgICAgIGxldCBjb24xOiBUSFJFRS5PYmplY3QzRDtcclxuICAgICAgbGV0IGNvbjI6IFRIUkVFLk9iamVjdDNEO1xyXG4gICAgICAvLyBpZiBwYXJ0MiBpcyBhbiBhZGRhYmxlIGFuZCBkZWNvQ29ubmVjdGlvbiBpcyBwcmVzZW50LCB0aGVuIG5vIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGNvbm5lY3RvcnNcclxuICAgICAgaWYgKGFkZGFibGUgJiYgYWRkYWJsZSBpbnN0YW5jZW9mIFNlbGVjdGlvbiAmJiBhZGRhYmxlLmRlY29Db25uZWN0aW9uKSB7XHJcbiAgICAgICAgY29uMSA9IHBhcnQxLmNoaWxkcmVuLmZpbmQoYyA9PiBjLm5hbWUgPT09IGFkZGFibGUuZGVjb0Nvbm5lY3Rpb24pO1xyXG4gICAgICAgIGlmICghY29uMSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgcGFydDIuY2hpbGRyZW4ubGVuZ3RoOyBpaSsrKSB7XHJcbiAgICAgICAgICBjb24yID0gcGFydDIuY2hpbGRyZW5baWldO1xyXG4gICAgICAgICAgLy8gaWYgdGhlc2UgY29ubmVjdG9ycyBjYW4gY29ubmVjdCBjb25uZWN0IHRoZW1cclxuICAgICAgICAgIGlmICghY29uMVsnY29ubmVjdGVkJ10gJiYgIWNvbjJbJ2Nvbm5lY3RlZCddICYmIHRoaXMuQ2FuU2VsZWN0b3JDb25uZWN0KHBhcnQxLmNoaWxkcmVuLCBjb24xLCBjb24yLCBpc0ZpcnN0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgLy8gaWYgYWRkYWJsZSwgY29udGludWUgdGhpcyBsb29wIHdpdGggYSBuZXcgYWRkYWJsZVxyXG4gICAgICAgICAgICBpZiAoYWRkYWJsZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5ld1BhcnQyOiBhbnkgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSwgcGFydDIsIHBhcnQxKTtcclxuICAgICAgICAgICAgICAvLyByZWZlcmVuY2Ugb2YgcGFydDIgY2hhbmdlZCwgc28gcmVmcmVzaCBjb24yXHJcbiAgICAgICAgICAgICAgdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgbmV3UGFydDIuY2hpbGRyZW5baWldKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgY29uMik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0MS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IHBhcnQyLmNoaWxkcmVuLmxlbmd0aDsgaWkrKykge1xyXG4gICAgICAgICAgICBjb24xID0gcGFydDEuY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgIGNvbjIgPSBwYXJ0Mi5jaGlsZHJlbltpaV07XHJcbiAgICAgICAgICAgIC8vIGlmIHRoZXNlIGNvbm5lY3RvcnMgY2FuIGNvbm5lY3QgY29ubmVjdCB0aGVtXHJcbiAgICAgICAgICAgIGlmICghY29uMVsnY29ubmVjdGVkJ10gJiYgIWNvbjJbJ2Nvbm5lY3RlZCddICYmIHRoaXMuQ2FuU2VsZWN0b3JDb25uZWN0KHBhcnQxLmNoaWxkcmVuLCBjb24xLCBjb24yLCBpc0ZpcnN0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAvLyBpZiBhZGRhYmxlLCBjb250aW51ZSB0aGlzIGxvb3Agd2l0aCBhIG5ldyBhZGRhYmxlXHJcbiAgICAgICAgICAgICAgaWYgKGFkZGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhcnQyOiBhbnkgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSwgcGFydDIsIHBhcnQxKTtcclxuICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBvZiBwYXJ0MiBjaGFuZ2VkLCBzbyByZWZyZXNoIGNvbjJcclxuICAgICAgICAgICAgICAgIHRoaXMuU2VsZWN0b3JDb25uZWN0KHNjZW5lLCBwYXJlbnQsIGNvbjEsIG5ld1BhcnQyLmNoaWxkcmVuW2lpXSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBjb24yKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBzdGF0aWMgVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHNjZW5lOiBUSFJFRS5TY2VuZSwgcGFyZW50OiBUSFJFRS5PYmplY3QzRCxcclxuICAvLyAgICAgcGFydDE6IGFueSwgcGFydDI6IGFueSwgY3JlYXRlQWRkYWJsZUZuPzogRnVuY3Rpb24pOiBib29sZWFuIHtcclxuICAvLyAgICAgbGV0IGFkZGFibGU6IGFueTtcclxuICAvLyAgICAgaWYgKGNyZWF0ZUFkZGFibGVGbikge1xyXG4gIC8vICAgICAgICAgYWRkYWJsZSA9IHBhcnQyO1xyXG4gIC8vICAgICAgICAgcGFydDIgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0MS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IHBhcnQyLmNoaWxkcmVuLmxlbmd0aDsgaWkrKykge1xyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IGNvbjE6IFRIUkVFLk9iamVjdDNEID0gcGFydDEuY2hpbGRyZW5baV07XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgY29uMjogVEhSRUUuT2JqZWN0M0QgPSBwYXJ0Mi5jaGlsZHJlbltpaV07XHJcbiAgLy8gICAgICAgICAgICAgLy8gaWYgdGhlc2UgY29ubmVjdG9ycyBjYW4gY29ubmVjdCBjb25uZWN0IHRoZW1cclxuICAvLyAgICAgICAgICAgICBpZiAoIWNvbjFbJ2Nvbm5lY3RlZCddICYmICFjb24yWydjb25uZWN0ZWQnXSAmJiB0aGlzLkNhblNlbGVjdG9yQ29ubmVjdChjb24xLCBjb24yKSkge1xyXG4gIC8vICAgICAgICAgICAgICAgICAvLyBpZiBhZGRhYmxlLCBjb250aW51ZSB0aGlzIGxvb3Agd2l0aCBhIG5ldyBhZGRhYmxlXHJcbiAgLy8gICAgICAgICAgICAgICAgIGlmIChhZGRhYmxlKSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQYXJ0MjogVEhSRUUuT2JqZWN0M0QgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSwgcGFydDIsIHBhcnQxKTtcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBvZiBwYXJ0MiBjaGFuZ2VkLCBzbyByZWZyZXNoIGNvbjJcclxuICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2VsZWN0b3JDb25uZWN0KHNjZW5lLCBwYXJlbnQsIGNvbjEsIG5ld1BhcnQyLmNoaWxkcmVuW2lpXSk7XHJcbiAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgY29uMik7XHJcbiAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBDb252ZXJ0M0RQb2ludFRvU2NyZWVuUG9pbnQocG9pbnQ6IFRIUkVFLlZlY3RvcjMsIGNhbWVyYTogVEhSRUUuQ2FtZXJhLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFRIUkVFLlZlY3RvcjIge1xyXG4gICAgaWYgKCFwb2ludCkge1xyXG4gICAgICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHZlY3RvcjogVEhSRUUuVmVjdG9yMyA9IHBvaW50LmNsb25lKCkucHJvamVjdChjYW1lcmEpO1xyXG4gICAgdmVjdG9yLnggPSAodmVjdG9yLnggKyAxKSAvIDIgKiB3aWR0aDtcclxuICAgIHZlY3Rvci55ID0gLSh2ZWN0b3IueSAtIDEpIC8gMiAqIGhlaWdodDtcclxuICAgIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMih2ZWN0b3IueCwgdmVjdG9yLnkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBDYW5TZWxlY3RvckNvbm5lY3QoXHJcbiAgICBjb25zUGFydDE6IFRIUkVFLk9iamVjdDNEW10sIGNvbjE6IFRIUkVFLk9iamVjdDNEIHwgYW55LCBjb24yOiBUSFJFRS5PYmplY3QzRCB8IGFueSwgc3RhcnRXaXRoTWFsZT86IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIC8vIGNvbnN0IGNvbjFOYW1lOiBzdHJpbmcgPSAoY29uMS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcgfHwgY29uMS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnT2JqZWN0M0QnKSA/IGNvbjEubmFtZSA6IGNvbjEuY29ubmVjdG9yO1xyXG4gICAgY29uc3QgY29uMU5hbWU6IHN0cmluZyA9IChjb24xIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgfHwgY29uMSBpbnN0YW5jZW9mIFRIUkVFLk1lc2gpID8gY29uMS5uYW1lIDogY29uMS5jb25uZWN0b3I7XHJcbiAgICAvLyBjb25zdCBjb24yTmFtZTogc3RyaW5nID0gKGNvbjIuY29uc3RydWN0b3IubmFtZSA9PT0gJ01lc2gnIHx8IGNvbjIuY29uc3RydWN0b3IubmFtZSA9PT0gJ09iamVjdDNEJykgPyBjb24yLm5hbWUgOiBjb24yLmNvbm5lY3RvcjtcclxuICAgIGNvbnN0IGNvbjJOYW1lOiBzdHJpbmcgPSAoY29uMiBpbnN0YW5jZW9mIFRIUkVFLk9iamVjdDNEIHx8IGNvbjIgaW5zdGFuY2VvZiBUSFJFRS5NZXNoKSA/IGNvbjIubmFtZSA6IGNvbjIuY29ubmVjdG9yO1xyXG4gICAgLy8gY29uc3Qgc2FtZVBhcmVudDogYm9vbGVhbiA9IChjb24xLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdNZXNoJyB8fCBjb24xLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPYmplY3QzRCcpICYmXHJcbiAgICAvLyAoY29uMi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcgfHwgY29uMi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnT2JqZWN0M0QnKSA/IGNvbjEucGFyZW50ID09PSBjb24yLnBhcmVudCA6IGZhbHNlO1xyXG4gICAgY29uc3Qgc2FtZVBhcmVudDogYm9vbGVhbiA9IChjb24xIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgfHwgY29uMSBpbnN0YW5jZW9mIFRIUkVFLk1lc2gpICYmXHJcbiAgICAoY29uMiBpbnN0YW5jZW9mIFRIUkVFLk9iamVjdDNEIHx8IGNvbjIgaW5zdGFuY2VvZiBUSFJFRS5NZXNoKSA/IGNvbjEucGFyZW50ID09PSBjb24yLnBhcmVudCA6IGZhbHNlO1xyXG5cclxuICAgIGlmICghY29uMU5hbWUgfHwgIWNvbjJOYW1lKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBhcnRzMTogc3RyaW5nW10gPSBjb24xTmFtZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCdfJyksXHJcbiAgICAgIHBhcnRzMjogc3RyaW5nW10gPSBjb24yTmFtZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCdfJyk7XHJcbiAgICBpZiAocGFydHMxLmxlbmd0aCA+PSAzICYmIHBhcnRzMi5sZW5ndGggPj0gMyAmJiAhc2FtZVBhcmVudCkge1xyXG4gICAgICBjb25zdCBjb25uZWN0YWJsZTogYm9vbGVhbiA9IHBhcnRzMVswXSA9PT0gJ0MnICYmIHBhcnRzMlswXSA9PT0gJ0MnICYmXHJcbiAgICAgICAgcGFydHMxWzFdID09PSBwYXJ0czJbMV0gJiYgcGFydHMxWzJdICE9PSBwYXJ0czJbMl07XHJcbiAgICAgIHJldHVybiBjb25uZWN0YWJsZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBzdGF0aWMgQ2FuU2VsZWN0b3JDb25uZWN0KGNvbjE6IFRIUkVFLk9iamVjdDNEIHwgYW55LCBjb24yOiBUSFJFRS5PYmplY3QzRCB8IGFueSk6IGJvb2xlYW4ge1xyXG4gIC8vICAgICBjb25zdCBjb24xTmFtZTogc3RyaW5nID0gY29uMSBpbnN0YW5jZW9mIFRIUkVFLk9iamVjdDNEID8gY29uMS5uYW1lIDogY29uMS5jb25uZWN0b3I7XHJcbiAgLy8gICAgIGNvbnN0IGNvbjJOYW1lOiBzdHJpbmcgPSBjb24yIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgPyBjb24yLm5hbWUgOiBjb24yLmNvbm5lY3RvcjtcclxuICAvLyAgICAgY29uc3Qgc2FtZVBhcmVudDogYm9vbGVhbiA9IGNvbjEgaW5zdGFuY2VvZiBUSFJFRS5PYmplY3QzRCAmJiBjb24yIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgPyBjb24xLnBhcmVudCA9PT0gY29uMi5wYXJlbnQgOiBmYWxzZTtcclxuICAvLyAgICAgY29uc3QgcGFydHMxOiBzdHJpbmdbXSA9IGNvbjFOYW1lLnRvVXBwZXJDYXNlKCkuc3BsaXQoJ18nKSxcclxuICAvLyAgICAgICAgIHBhcnRzMjogc3RyaW5nW10gPSBjb24yTmFtZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCdfJyk7XHJcbiAgLy8gICAgIGlmIChwYXJ0czEubGVuZ3RoID49IDMgJiYgcGFydHMyLmxlbmd0aCA+PSAzICYmICFzYW1lUGFyZW50KSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBjb25uZWN0YWJsZTogYm9vbGVhbiA9IHBhcnRzMVswXSA9PT0gJ0MnICYmIHBhcnRzMlswXSA9PT0gJ0MnICYmXHJcbiAgLy8gICAgICAgICAgICAgcGFydHMxWzFdID09PSBwYXJ0czJbMV0gJiYgcGFydHMxWzJdICE9PSBwYXJ0czJbMl07XHJcbiAgLy8gICAgICAgICByZXR1cm4gY29ubmVjdGFibGU7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgU2VsZWN0b3JDb25uZWN0KHNjZW5lOiBUSFJFRS5TY2VuZSwgcGFyZW50OiBUSFJFRS5PYmplY3QzRCwgY29uMTogVEhSRUUuT2JqZWN0M0QsIGNvbjI6IFRIUkVFLk9iamVjdDNEKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXNjZW5lIHx8ICFwYXJlbnQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uMVsnY29ubmVjdGVkVG8nXSA9IGNvbjIgJiYgY29uMi5wYXJlbnQgPyBjb24yLnBhcmVudC5uYW1lIDogJyc7XHJcbiAgICBjb24yWydjb25uZWN0ZWRUbyddID0gY29uMSAmJiBjb24xLnBhcmVudCA/IGNvbjEucGFyZW50Lm5hbWUgOiAnJztcclxuXHJcbiAgICBjb25zdCBtb3RoZXJSb3RhdGlvbjogVEhSRUUuRXVsZXIgPSBuZXcgVEhSRUUuRXVsZXIoMCwgMCwgMCk7XHJcbiAgICBjb25zdCBtb3RoZXJQb3NpdGlvbjogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIDApO1xyXG5cclxuICAgIHBhcmVudC51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG4gICAgbW90aGVyUm90YXRpb24uY29weShwYXJlbnQucm90YXRpb24pO1xyXG4gICAgcGFyZW50LmdldFdvcmxkUG9zaXRpb24obW90aGVyUG9zaXRpb24pO1xyXG5cclxuICAgIHBhcmVudC5yb3RhdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICBwYXJlbnQucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG5cclxuICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG5cclxuICAgIGNvbnN0IGNvbjFRdWF0OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgIGlmIChjb24xKSB7XHJcbiAgICAgIGNvbjEuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjFRdWF0KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbjJRdWF0OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgIGlmIChjb24yKSB7XHJcbiAgICAgIGNvbjIuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjJRdWF0KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbjFRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgIGlmIChjb24xICYmIGNvbjEucGFyZW50KSB7XHJcbiAgICAgIGNvbjEucGFyZW50LmdldFdvcmxkUXVhdGVybmlvbihjb24xUXVhdFBhcmVudCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb24yUXVhdFBhcmVudDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgICBpZiAoY29uMiAmJiBjb24yLnBhcmVudCkge1xyXG4gICAgICBjb24yLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXRQYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvdGF0aW9uOiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gICAgICBjb24xUXVhdC5pbnZlcnQoKSxcclxuICAgICAgY29uMlF1YXRcclxuICAgICkubXVsdGlwbHkoXHJcbiAgICAgIG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkubXVsdGlwbHlRdWF0ZXJuaW9ucyhcclxuICAgICAgICBjb24xUXVhdFBhcmVudCxcclxuICAgICAgICBjb24xUXVhdFBhcmVudFxyXG4gICAgICApXHJcbiAgICApO1xyXG4gICAgaWYgKGNvbjIgJiYgY29uMi5wYXJlbnQpIHtcclxuICAgICAgY29uMi5wYXJlbnQucXVhdGVybmlvbi5jb3B5KHJvdGF0aW9uKTtcclxuICAgIH1cclxuICAgIC8vIFVwZGF0ZSBiZWNhdXNlIHRoZSBtYXRyaXggaGFzIGJlZW4gdGVtcGVyZWQgd2l0aFxyXG4gICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgLy8gTW92ZSB0aGUgY29ubmVjdG9ycyB0b3dhcmRzIGVhY2hvdGhlclxyXG4gICAgY29uc3QgY29uMVBvczogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICBpZiAoY29uMSkge1xyXG4gICAgICBjb24xLmdldFdvcmxkUG9zaXRpb24oY29uMVBvcyk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb24yUG9zOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGlmIChjb24yKSB7XHJcbiAgICAgIGNvbjIuZ2V0V29ybGRQb3NpdGlvbihjb24yUG9zKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtb3ZlOiBUSFJFRS5WZWN0b3IzID0gY29uMVBvcy5zdWIoY29uMlBvcyk7XHJcbiAgICBpZiAoY29uMiAmJiBjb24yLnBhcmVudCkge1xyXG4gICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi54ICs9IG1vdmUueDtcclxuICAgICAgY29uMi5wYXJlbnQucG9zaXRpb24ueSArPSBtb3ZlLnk7XHJcbiAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnogKz0gbW92ZS56O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlc2V0IHBhcmVudCdzIG9iamVjdHMgcm90YXRpb24gYW5kIHBvc2l0aW9uXHJcbiAgICBwYXJlbnQucm90YXRpb24uY29weShtb3RoZXJSb3RhdGlvbik7XHJcbiAgICBwYXJlbnQucG9zaXRpb24uY29weShtb3RoZXJQb3NpdGlvbik7XHJcblxyXG4gICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgLy8gU2V0IHRoZSBjb25uZWN0ZWQgZmxhZ1xyXG4gICAgaWYgKGNvbjEpIHtcclxuICAgICAgY29uMVsnY29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbjIpIHtcclxuICAgICAgY29uMlsnY29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLyBwcml2YXRlIHN0YXRpYyBTZWxlY3RvckNvbm5lY3Qoc2NlbmU6IFRIUkVFLlNjZW5lLCBwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBjb24xOiBUSFJFRS5PYmplY3QzRCwgY29uMjogVEhSRUUuT2JqZWN0M0QpOiBib29sZWFuIHtcclxuICAvLyAgICAgaWYgKCFzY2VuZSB8fCAhcGFyZW50KSB7XHJcbiAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgY29uMVsnY29ubmVjdGVkVG8nXSA9IGNvbjIucGFyZW50Lm5hbWU7XHJcbiAgLy8gICAgIGNvbjJbJ2Nvbm5lY3RlZFRvJ10gPSBjb24xLnBhcmVudC5uYW1lO1xyXG4gIC8vXHJcbiAgLy8gICAgIGNvbnN0IG1vdGhlclJvdGF0aW9uOiBUSFJFRS5FdWxlciA9IG5ldyBUSFJFRS5FdWxlcigwLCAwLCAwKTtcclxuICAvLyAgICAgY29uc3QgbW90aGVyUG9zaXRpb246IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygwLCAwLCAwKTtcclxuICAvL1xyXG4gIC8vICAgICBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAvLyAgICAgbW90aGVyUm90YXRpb24uY29weShwYXJlbnQucm90YXRpb24pO1xyXG4gIC8vICAgICBwYXJlbnQuZ2V0V29ybGRQb3NpdGlvbihtb3RoZXJQb3NpdGlvbik7XHJcbiAgLy9cclxuICAvLyAgICAgcGFyZW50LnJvdGF0aW9uLnNldCgwLCAwLCAwKTtcclxuICAvLyAgICAgcGFyZW50LnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAvL1xyXG4gIC8vICAgICBjb25zdCBjb24xUXVhdDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgLy8gICAgIGNvbjEuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjFRdWF0KTtcclxuICAvLyAgICAgY29uc3QgY29uMlF1YXQ6IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gIC8vICAgICBjb24yLmdldFdvcmxkUXVhdGVybmlvbihjb24yUXVhdCk7XHJcbiAgLy8gICAgIGNvbnN0IGNvbjFRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAvLyAgICAgY29uMS5wYXJlbnQuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjFRdWF0UGFyZW50KTtcclxuICAvLyAgICAgY29uc3QgY29uMlF1YXRQYXJlbnQ6IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gIC8vICAgICBjb24yLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXRQYXJlbnQpO1xyXG4gIC8vXHJcbiAgLy8gICAgIGNvbnN0IHJvdGF0aW9uOiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gIC8vICAgICAgICAgY29uMVF1YXQuaW52ZXJ0KCksXHJcbiAgLy8gICAgICAgICBjb24yUXVhdFxyXG4gIC8vICAgICApLm11bHRpcGx5KFxyXG4gIC8vICAgICAgICAgbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gIC8vICAgICAgICAgICAgIGNvbjFRdWF0UGFyZW50LFxyXG4gIC8vICAgICAgICAgICAgIGNvbjFRdWF0UGFyZW50XHJcbiAgLy8gICAgICAgICApXHJcbiAgLy8gICAgICk7XHJcbiAgLy9cclxuICAvLyAgICAgY29uMi5wYXJlbnQucXVhdGVybmlvbi5jb3B5KHJvdGF0aW9uKTtcclxuICAvLyAgICAgLy8gVXBkYXRlIGJlY2F1c2UgdGhlIG1hdHJpeCBoYXMgYmVlbiB0ZW1wZXJlZCB3aXRoXHJcbiAgLy8gICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG4gIC8vXHJcbiAgLy8gICAgIC8vIE1vdmUgdGhlIGNvbm5lY3RvcnMgdG93YXJkcyBlYWNob3RoZXJcclxuICAvLyAgICAgY29uc3QgY29uMVBvczogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgLy8gICAgIGNvbjEuZ2V0V29ybGRQb3NpdGlvbihjb24xUG9zKTtcclxuICAvLyAgICAgY29uc3QgY29uMlBvczogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgLy8gICAgIGNvbjIuZ2V0V29ybGRQb3NpdGlvbihjb24yUG9zKTtcclxuICAvL1xyXG4gIC8vICAgICBjb25zdCBtb3ZlOiBUSFJFRS5WZWN0b3IzID0gY29uMVBvcy5zdWIoY29uMlBvcyk7XHJcbiAgLy8gICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnggKz0gbW92ZS54O1xyXG4gIC8vICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi55ICs9IG1vdmUueTtcclxuICAvLyAgICAgY29uMi5wYXJlbnQucG9zaXRpb24ueiArPSBtb3ZlLno7XHJcbiAgLy9cclxuICAvLyAgICAgLy8gcmVzZXQgcGFyZW50J3Mgb2JqZWN0cyByb3RhdGlvbiBhbmQgcG9zaXRpb25cclxuICAvLyAgICAgcGFyZW50LnJvdGF0aW9uLmNvcHkobW90aGVyUm90YXRpb24pO1xyXG4gIC8vICAgICBwYXJlbnQucG9zaXRpb24uY29weShtb3RoZXJQb3NpdGlvbik7XHJcbiAgLy9cclxuICAvLyAgICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcbiAgLy9cclxuICAvLyAgICAgLy8gU2V0IHRoZSBjb25uZWN0ZWQgZmxhZ1xyXG4gIC8vICAgICBjb24xWydjb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgLy8gICAgIGNvbjJbJ2Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAvLyAgICAgcmV0dXJuIHRydWU7XHJcbiAgLy8gfVxyXG5cclxufVxyXG4iXX0=
@@ -1,68 +0,0 @@
1
- import * as THREE from 'three';
2
- import { Mesh, MeshBasicMaterial, PlaneGeometry } from 'three';
3
- import { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry';
4
- import { FontService } from '../services/font.service';
5
- import { ServiceLocator } from '../services/locator.service';
6
- const textHeight = 0.01;
7
- export function makeTextMesh(text, font, color = 0xFF00FF, size = 0.08, beveled = false, depthTest = true, label) {
8
- if (!font) {
9
- const fontService = ServiceLocator.injector.get(FontService);
10
- font = fontService.monospaceFont;
11
- }
12
- if (label) {
13
- label = label + ': ';
14
- }
15
- if (!label) {
16
- label = '';
17
- }
18
- const textGeo = new TextGeometry(label + text, {
19
- font: font,
20
- size: size,
21
- depth: textHeight,
22
- curveSegments: 4,
23
- bevelEnabled: beveled,
24
- bevelThickness: 0.01,
25
- bevelSize: 0.01
26
- });
27
- textGeo.computeBoundingBox();
28
- textGeo.computeVertexNormals();
29
- const materials = [
30
- new THREE.MeshBasicMaterial({ color: color, depthTest: depthTest })
31
- ];
32
- if (beveled) {
33
- materials.push(new THREE.MeshBasicMaterial({ color: 0xffffff, depthTest: depthTest }));
34
- }
35
- return new THREE.Mesh(textGeo, materials);
36
- }
37
- export function createTextWithBackground(text, font, fontSize = 0.08, textColor = 0xFF00FF, backgroundColor = 0xFFFFFF, backgroundOpacity = 0.7, padding = 1.2, label) {
38
- if (label) {
39
- label = label + ': ';
40
- }
41
- if (!label) {
42
- label = '';
43
- }
44
- const textGeometry = new TextGeometry(label + text, {
45
- font: font,
46
- size: fontSize,
47
- depth: textHeight
48
- });
49
- textGeometry.computeBoundingBox();
50
- const textWidthBlock = textGeometry.boundingBox.max.x - textGeometry.boundingBox.min.x;
51
- const textHeightBlock = textGeometry.boundingBox.max.y - textGeometry.boundingBox.min.y;
52
- textGeometry.translate(-0.5 * textWidthBlock, -2 * textHeight, 0);
53
- const textMaterial = new MeshBasicMaterial({ color: textColor });
54
- const textMesh = new Mesh(textGeometry, textMaterial);
55
- const backgroundGeometry = new PlaneGeometry(textWidthBlock + padding * fontSize, textHeightBlock + padding * fontSize);
56
- const backgroundMaterial = new MeshBasicMaterial({
57
- color: backgroundColor,
58
- transparent: true,
59
- opacity: backgroundOpacity
60
- });
61
- const backgroundMesh = new Mesh(backgroundGeometry, backgroundMaterial);
62
- backgroundMesh.position.z = -0.01; // prevent z-fighting
63
- const mesh = new Mesh();
64
- mesh.add(backgroundMesh);
65
- mesh.add(textMesh);
66
- return mesh;
67
- }
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmZpZ3VyYXRvci9zcmMvbGliL3V0aWxzL3RleHQtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFN0QsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFM0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBRXhCLE1BQU0sVUFBVSxZQUFZLENBQzFCLElBQVksRUFDWixJQUFXLEVBQ1gsUUFBYSxRQUFRLEVBQ3JCLE9BQWUsSUFBSSxFQUNuQixVQUFtQixLQUFLLEVBQ3hCLFlBQXFCLElBQUksRUFDekIsS0FBYztJQUVkLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDVCxNQUFNLFdBQVcsR0FBZ0IsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUUsSUFBSSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7S0FDbEM7SUFDRCxJQUFJLEtBQUssRUFBRTtRQUNULEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO0tBQ3RCO0lBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUNWLEtBQUssR0FBRyxFQUFFLENBQUM7S0FDWjtJQUVELE1BQU0sT0FBTyxHQUFRLElBQUksWUFBWSxDQUFDLEtBQUssR0FBRyxJQUFJLEVBQUU7UUFDbEQsSUFBSSxFQUFFLElBQUk7UUFDVixJQUFJLEVBQUUsSUFBSTtRQUNWLEtBQUssRUFBRSxVQUFVO1FBQ2pCLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLFlBQVksRUFBRSxPQUFPO1FBQ3JCLGNBQWMsRUFBRSxJQUFJO1FBQ3BCLFNBQVMsRUFBRSxJQUFJO0tBQ2hCLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzdCLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBRS9CLE1BQU0sU0FBUyxHQUE4QjtRQUMzQyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxDQUFDO0tBQ2xFLENBQUM7SUFDRixJQUFJLE9BQU8sRUFBRTtRQUNYLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdEY7SUFDRCxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsSUFBWSxFQUNaLElBQVUsRUFDVixXQUFtQixJQUFJLEVBQ3ZCLFlBQWlCLFFBQVEsRUFDekIsa0JBQXVCLFFBQVEsRUFDL0Isb0JBQTRCLEdBQUcsRUFDL0IsVUFBa0IsR0FBRyxFQUNyQixLQUFjO0lBR2QsSUFBSSxLQUFLLEVBQUU7UUFDVCxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQztLQUN0QjtJQUNELElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDVixLQUFLLEdBQUcsRUFBRSxDQUFDO0tBQ1o7SUFFRCxNQUFNLFlBQVksR0FBaUIsSUFBSSxZQUFZLENBQUMsS0FBSyxHQUFHLElBQUksRUFBRTtRQUNoRSxJQUFJLEVBQUUsSUFBSTtRQUNWLElBQUksRUFBRSxRQUFRO1FBQ2QsS0FBSyxFQUFFLFVBQVU7S0FDbEIsQ0FBQyxDQUFDO0lBRUgsWUFBWSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDbEMsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2RixNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEdBQUcsY0FBYyxFQUFFLENBQUMsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVsRSxNQUFNLFlBQVksR0FBc0IsSUFBSSxpQkFBaUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sUUFBUSxHQUFTLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUU1RCxNQUFNLGtCQUFrQixHQUFrQixJQUFJLGFBQWEsQ0FBQyxjQUFjLEdBQUcsT0FBTyxHQUFHLFFBQVEsRUFBRSxlQUFlLEdBQUcsT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZJLE1BQU0sa0JBQWtCLEdBQXNCLElBQUksaUJBQWlCLENBQUM7UUFDbEUsS0FBSyxFQUFFLGVBQWU7UUFDdEIsV0FBVyxFQUFFLElBQUk7UUFDakIsT0FBTyxFQUFFLGlCQUFpQjtLQUMzQixDQUFDLENBQUM7SUFDSCxNQUFNLGNBQWMsR0FBUyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBRTlFLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMscUJBQXFCO0lBRXhELE1BQU0sSUFBSSxHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7SUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25CLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtNZXNoLCBNZXNoQmFzaWNNYXRlcmlhbCwgUGxhbmVHZW9tZXRyeX0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0ZvbnR9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0ZvbnRMb2FkZXInO1xyXG5pbXBvcnQge1RleHRHZW9tZXRyeX0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2dlb21ldHJpZXMvVGV4dEdlb21ldHJ5JztcclxuaW1wb3J0IHtGb250U2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvZm9udC5zZXJ2aWNlJztcclxuaW1wb3J0IHtTZXJ2aWNlTG9jYXRvcn0gZnJvbSAnLi4vc2VydmljZXMvbG9jYXRvci5zZXJ2aWNlJztcclxuXHJcbmNvbnN0IHRleHRIZWlnaHQgPSAwLjAxO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VUZXh0TWVzaChcclxuICB0ZXh0OiBzdHJpbmcsXHJcbiAgZm9udD86IEZvbnQsXHJcbiAgY29sb3I6IGFueSA9IDB4RkYwMEZGLFxyXG4gIHNpemU6IG51bWJlciA9IDAuMDgsXHJcbiAgYmV2ZWxlZDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gIGRlcHRoVGVzdDogYm9vbGVhbiA9IHRydWUsXHJcbiAgbGFiZWw/OiBzdHJpbmdcclxuKTogTWVzaCB7XHJcbiAgaWYgKCFmb250KSB7XHJcbiAgICBjb25zdCBmb250U2VydmljZTogRm9udFNlcnZpY2UgPSBTZXJ2aWNlTG9jYXRvci5pbmplY3Rvci5nZXQoRm9udFNlcnZpY2UpO1xyXG4gICAgZm9udCA9IGZvbnRTZXJ2aWNlLm1vbm9zcGFjZUZvbnQ7XHJcbiAgfVxyXG4gIGlmIChsYWJlbCkge1xyXG4gICAgbGFiZWwgPSBsYWJlbCArICc6ICc7XHJcbiAgfVxyXG4gIGlmICghbGFiZWwpIHtcclxuICAgIGxhYmVsID0gJyc7XHJcbiAgfVxyXG5cclxuICBjb25zdCB0ZXh0R2VvOiBhbnkgPSBuZXcgVGV4dEdlb21ldHJ5KGxhYmVsICsgdGV4dCwge1xyXG4gICAgZm9udDogZm9udCxcclxuICAgIHNpemU6IHNpemUsXHJcbiAgICBkZXB0aDogdGV4dEhlaWdodCxcclxuICAgIGN1cnZlU2VnbWVudHM6IDQsXHJcbiAgICBiZXZlbEVuYWJsZWQ6IGJldmVsZWQsXHJcbiAgICBiZXZlbFRoaWNrbmVzczogMC4wMSxcclxuICAgIGJldmVsU2l6ZTogMC4wMVxyXG4gIH0pO1xyXG4gIHRleHRHZW8uY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcbiAgdGV4dEdlby5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xyXG5cclxuICBjb25zdCBtYXRlcmlhbHM6IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsW10gPSBbXHJcbiAgICBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe2NvbG9yOiBjb2xvciwgZGVwdGhUZXN0OiBkZXB0aFRlc3R9KVxyXG4gIF07XHJcbiAgaWYgKGJldmVsZWQpIHtcclxuICAgIG1hdGVyaWFscy5wdXNoKG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7Y29sb3I6IDB4ZmZmZmZmLCBkZXB0aFRlc3Q6IGRlcHRoVGVzdH0pKTtcclxuICB9XHJcbiAgcmV0dXJuIG5ldyBUSFJFRS5NZXNoKHRleHRHZW8sIG1hdGVyaWFscyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZXh0V2l0aEJhY2tncm91bmQoXHJcbiAgdGV4dDogc3RyaW5nLFxyXG4gIGZvbnQ6IEZvbnQsXHJcbiAgZm9udFNpemU6IG51bWJlciA9IDAuMDgsXHJcbiAgdGV4dENvbG9yOiBhbnkgPSAweEZGMDBGRixcclxuICBiYWNrZ3JvdW5kQ29sb3I6IGFueSA9IDB4RkZGRkZGLFxyXG4gIGJhY2tncm91bmRPcGFjaXR5OiBudW1iZXIgPSAwLjcsXHJcbiAgcGFkZGluZzogbnVtYmVyID0gMS4yLFxyXG4gIGxhYmVsPzogc3RyaW5nXHJcbik6IE1lc2gge1xyXG5cclxuICBpZiAobGFiZWwpIHtcclxuICAgIGxhYmVsID0gbGFiZWwgKyAnOiAnO1xyXG4gIH1cclxuICBpZiAoIWxhYmVsKSB7XHJcbiAgICBsYWJlbCA9ICcnO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdGV4dEdlb21ldHJ5OiBUZXh0R2VvbWV0cnkgPSBuZXcgVGV4dEdlb21ldHJ5KGxhYmVsICsgdGV4dCwge1xyXG4gICAgZm9udDogZm9udCxcclxuICAgIHNpemU6IGZvbnRTaXplLFxyXG4gICAgZGVwdGg6IHRleHRIZWlnaHRcclxuICB9KTtcclxuXHJcbiAgdGV4dEdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xyXG4gIGNvbnN0IHRleHRXaWR0aEJsb2NrID0gdGV4dEdlb21ldHJ5LmJvdW5kaW5nQm94Lm1heC54IC0gdGV4dEdlb21ldHJ5LmJvdW5kaW5nQm94Lm1pbi54O1xyXG4gIGNvbnN0IHRleHRIZWlnaHRCbG9jayA9IHRleHRHZW9tZXRyeS5ib3VuZGluZ0JveC5tYXgueSAtIHRleHRHZW9tZXRyeS5ib3VuZGluZ0JveC5taW4ueTtcclxuICB0ZXh0R2VvbWV0cnkudHJhbnNsYXRlKC0wLjUgKiB0ZXh0V2lkdGhCbG9jaywgLTIgKiB0ZXh0SGVpZ2h0LCAwKTtcclxuXHJcbiAgY29uc3QgdGV4dE1hdGVyaWFsOiBNZXNoQmFzaWNNYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7Y29sb3I6IHRleHRDb2xvcn0pO1xyXG4gIGNvbnN0IHRleHRNZXNoOiBNZXNoID0gbmV3IE1lc2godGV4dEdlb21ldHJ5LCB0ZXh0TWF0ZXJpYWwpO1xyXG5cclxuICBjb25zdCBiYWNrZ3JvdW5kR2VvbWV0cnk6IFBsYW5lR2VvbWV0cnkgPSBuZXcgUGxhbmVHZW9tZXRyeSh0ZXh0V2lkdGhCbG9jayArIHBhZGRpbmcgKiBmb250U2l6ZSwgdGV4dEhlaWdodEJsb2NrICsgcGFkZGluZyAqIGZvbnRTaXplKTtcclxuICBjb25zdCBiYWNrZ3JvdW5kTWF0ZXJpYWw6IE1lc2hCYXNpY01hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKHtcclxuICAgIGNvbG9yOiBiYWNrZ3JvdW5kQ29sb3IsXHJcbiAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgIG9wYWNpdHk6IGJhY2tncm91bmRPcGFjaXR5XHJcbiAgfSk7XHJcbiAgY29uc3QgYmFja2dyb3VuZE1lc2g6IE1lc2ggPSBuZXcgTWVzaChiYWNrZ3JvdW5kR2VvbWV0cnksIGJhY2tncm91bmRNYXRlcmlhbCk7XHJcblxyXG4gIGJhY2tncm91bmRNZXNoLnBvc2l0aW9uLnogPSAtMC4wMTsgLy8gcHJldmVudCB6LWZpZ2h0aW5nXHJcblxyXG4gIGNvbnN0IG1lc2g6IE1lc2ggPSBuZXcgTWVzaCgpO1xyXG4gIG1lc2guYWRkKGJhY2tncm91bmRNZXNoKTtcclxuICBtZXNoLmFkZCh0ZXh0TWVzaCk7XHJcbiAgcmV0dXJuIG1lc2g7XHJcbn1cclxuIl19