@colijnit/homedecorator 255.1.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 (986) hide show
  1. package/_variables.scss +1 -0
  2. package/app/app.component.scss +30 -0
  3. package/app/app.version.d.ts +5 -0
  4. package/app/bundle/threedselector-bundle/threedselector-bundle.component.scss +24 -0
  5. package/app/bundle/threedselector-bundle/threedselector-selections-bundle.component.scss +4 -0
  6. package/app/core/components/debug/debug.component.d.ts +17 -0
  7. package/app/core/components/debug/debug.component.scss +27 -0
  8. package/app/core/components/error/error-message.component.d.ts +14 -0
  9. package/app/core/components/error/error-message.component.scss +18 -0
  10. package/app/core/components/tooltip/tooltip.component.d.ts +17 -0
  11. package/app/core/components/tooltip/tooltip.component.scss +34 -0
  12. package/app/core/const/dimensioning.d.ts +24 -0
  13. package/app/core/core.module.d.ts +27 -0
  14. package/app/core/directive/autofocus.directive.d.ts +11 -0
  15. package/app/core/directive/tooltip.directive.d.ts +21 -0
  16. package/app/core/directive/visibility-observer-master.directive.d.ts +12 -0
  17. package/app/core/directive/visibility-observer.directive.d.ts +16 -0
  18. package/app/core/enum/configuration-key.enum.d.ts +35 -0
  19. package/app/core/enum/export-type.enum.d.ts +5 -0
  20. package/app/core/enum/google-tag-manager-event.enum.d.ts +12 -0
  21. package/app/core/enum/icon-name.enum.d.ts +15 -0
  22. package/app/core/enum/icon.enum.d.ts +33 -0
  23. package/app/core/enum/light.enum.d.ts +7 -0
  24. package/app/core/enum/message-type.enum.d.ts +69 -0
  25. package/app/core/enum/model-type.enum.d.ts +6 -0
  26. package/app/core/enum/output-encoding.enum.d.ts +4 -0
  27. package/app/core/enum/shadow-map-type.enum.d.ts +6 -0
  28. package/app/core/enum/user-role-type.enum.d.ts +18 -0
  29. package/app/core/enum/view-mode.enum.d.ts +9 -0
  30. package/app/core/enum/xr-mode.enum.d.ts +4 -0
  31. package/app/core/interface/adjustable-element.interface.d.ts +5 -0
  32. package/app/core/interface/category.interface.d.ts +9 -0
  33. package/app/core/interface/changes.interface.d.ts +9 -0
  34. package/app/core/interface/child-params.interface.d.ts +3 -0
  35. package/app/core/interface/configuration-data.interface.d.ts +36 -0
  36. package/app/core/interface/external-settings.interface.d.ts +6 -0
  37. package/app/core/interface/info-dialog-data.interface.d.ts +4 -0
  38. package/app/core/interface/light-preset.interface.d.ts +18 -0
  39. package/app/core/interface/loading-overlay-data.interface.d.ts +4 -0
  40. package/app/core/interface/media-resource.interface.d.ts +6 -0
  41. package/app/core/interface/message-with-payload.interface.d.ts +81 -0
  42. package/app/core/interface/message-without-payload.interface.d.ts +35 -0
  43. package/app/core/interface/preset.interface.d.ts +8 -0
  44. package/app/core/interface/selected-floor-event.interface.d.ts +5 -0
  45. package/app/core/interface/selected-wall-event.interface.d.ts +6 -0
  46. package/app/core/interface/texture.interface.d.ts +37 -0
  47. package/app/core/interface/toolbar-icon.interface.d.ts +8 -0
  48. package/app/core/model/ar-position-indicator.d.ts +4 -0
  49. package/app/core/model/camera-settings.d.ts +12 -0
  50. package/app/core/model/category.d.ts +12 -0
  51. package/app/core/model/custom-button.d.ts +10 -0
  52. package/app/core/model/error-message.d.ts +8 -0
  53. package/app/core/model/export-object.d.ts +5 -0
  54. package/app/core/model/from-intersection-observer.d.ts +7 -0
  55. package/app/core/model/homedecorator-settings-options.d.ts +46 -0
  56. package/app/core/model/homedecorator-settings.d.ts +54 -0
  57. package/app/core/model/icon.d.ts +4 -0
  58. package/app/core/model/light-preset.d.ts +27 -0
  59. package/app/core/model/light-properties.d.ts +25 -0
  60. package/app/core/model/media-resource.d.ts +7 -0
  61. package/app/core/model/preset.d.ts +10 -0
  62. package/app/core/model/ral-color.d.ts +19 -0
  63. package/app/core/model/shadow-properties.d.ts +7 -0
  64. package/app/core/model/texture-type.d.ts +6 -0
  65. package/app/core/model/texture.d.ts +43 -0
  66. package/app/core/model/three-object.d.ts +1 -0
  67. package/app/core/model/toast-type.d.ts +5 -0
  68. package/app/core/model/toast.d.ts +5 -0
  69. package/app/core/model/xr-reticle.d.ts +17 -0
  70. package/app/core/pipe/append.pipe.d.ts +7 -0
  71. package/app/core/pipe/cm-to-measure.pipe.d.ts +10 -0
  72. package/app/core/pipe/filter.pipe.d.ts +7 -0
  73. package/app/core/pipe/keys.pipe.d.ts +7 -0
  74. package/app/core/pipe/localize.pipe.d.ts +10 -0
  75. package/app/core/pipe/m-to-measure.pipe.d.ts +10 -0
  76. package/app/core/pipe/prepend.pipe.d.ts +7 -0
  77. package/app/core/pipe/scm-to-measure.pipe.d.ts +10 -0
  78. package/app/core/pipe/sm-to-measure.pipe.d.ts +10 -0
  79. package/app/core/pipe/strip-html.pipe.d.ts +7 -0
  80. package/app/core/service/3dm-api.d.ts +65 -0
  81. package/app/core/service/app-state.service.d.ts +49 -0
  82. package/app/core/service/configuration.service.d.ts +15 -0
  83. package/app/core/service/debug.service.d.ts +16 -0
  84. package/app/core/service/dimensioning.service.d.ts +14 -0
  85. package/app/core/service/dynamic-camera.service.d.ts +23 -0
  86. package/app/core/service/environment.service.d.ts +8 -0
  87. package/app/core/service/error.service.d.ts +11 -0
  88. package/app/core/service/export.service.d.ts +18 -0
  89. package/app/core/service/file.service.d.ts +9 -0
  90. package/app/core/service/homedecorator-app-event.service.d.ts +23 -0
  91. package/app/core/service/homedecorator-app.service.d.ts +58 -0
  92. package/app/core/service/homedecorator-connector-adapter.service.d.ts +90 -0
  93. package/app/core/service/homedecorator-connector.service.d.ts +127 -0
  94. package/app/core/service/homedecorator-dictionary.service.d.ts +15 -0
  95. package/app/core/service/homedecorator-icon-cache.service.d.ts +21 -0
  96. package/app/core/service/homedecorator-settings.service.d.ts +23 -0
  97. package/app/core/service/homedecorator.service.d.ts +14 -0
  98. package/app/core/service/integration.service.d.ts +16 -0
  99. package/app/core/service/item-serialization.service.d.ts +78 -0
  100. package/app/core/service/json-utils.service.d.ts +7 -0
  101. package/app/core/service/message-bus.service.d.ts +21 -0
  102. package/app/core/service/permanent-store.service.d.ts +37 -0
  103. package/app/core/service/presets.service.d.ts +50 -0
  104. package/app/core/service/progress.service.d.ts +17 -0
  105. package/app/core/service/ral.service.d.ts +17 -0
  106. package/app/core/service/skip-button-info.service.d.ts +19 -0
  107. package/app/core/service/toast.service.d.ts +12 -0
  108. package/app/core/service/utils.service.d.ts +68 -0
  109. package/app/core/service/view-mode.service.d.ts +27 -0
  110. package/app/core/service/web-worker.service.d.ts +18 -0
  111. package/app/core/utils/clone-utils.d.ts +5 -0
  112. package/app/core/utils/color.utils.d.ts +7 -0
  113. package/app/core/utils/file.utils.d.ts +36 -0
  114. package/app/core/utils/function/is-empty.function.d.ts +1 -0
  115. package/app/core/utils/function/is-nill.function.d.ts +1 -0
  116. package/app/core/utils/material.utils.d.ts +33 -0
  117. package/app/core/utils/object.utils.d.ts +14 -0
  118. package/app/core/utils/relative-position.utils.d.ts +12 -0
  119. package/app/core/utils/variation-utils.d.ts +12 -0
  120. package/app/core/workers/enum/web-worker-message.enum.d.ts +4 -0
  121. package/app/core/workers/enum/web-worker-type.enum.d.ts +3 -0
  122. package/app/development/components/selected-child-material-texture.component.d.ts +58 -0
  123. package/app/development/components/selected-child-material-texture.component.scss +122 -0
  124. package/app/development/components/selected-child-material.component.d.ts +73 -0
  125. package/app/development/components/selected-child-material.component.scss +45 -0
  126. package/app/development/components/selected-child.component.d.ts +8 -0
  127. package/app/development/components/selected-child.component.scss +40 -0
  128. package/app/development/components/selected-object-base.d.ts +32 -0
  129. package/app/development/components/selected-object.component.d.ts +20 -0
  130. package/app/development/components/selected-object.component.scss +13 -0
  131. package/app/development/development.module.d.ts +19 -0
  132. package/app/development/directive/development.directive.d.ts +19 -0
  133. package/app/development/service/development.service.d.ts +49 -0
  134. package/app/homedecorator.component.d.ts +42 -0
  135. package/app/homedecorator.component.scss +34 -0
  136. package/app/homedecorator.module.d.ts +18 -0
  137. package/app/plugins/core3d/collision-manager/collision-manager.service.d.ts +23 -0
  138. package/app/plugins/core3d/collision-manager/floorplan-collision-detection.d.ts +9 -0
  139. package/app/plugins/core3d/collision-manager/snapping-collision.service.d.ts +47 -0
  140. package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-buttons/ar-gui-buttons.component.d.ts +17 -0
  141. package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-buttons/ar-gui-buttons.component.scss +30 -0
  142. package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-configurator/ar-gui-configurator.component.d.ts +25 -0
  143. package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-configurator/ar-gui-configurator.component.scss +13 -0
  144. package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-context-menu/ar-gui-context-menu.component.d.ts +21 -0
  145. package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-context-menu/ar-gui-context-menu.component.scss +6 -0
  146. package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-notifications/ar-gui-notifications.component.d.ts +11 -0
  147. package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-notifications/ar-gui-notifications.component.scss +19 -0
  148. package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-root.component.d.ts +16 -0
  149. package/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-root.component.scss +23 -0
  150. package/app/plugins/core3d/components/lightplan/edit-light/edit-light.component.d.ts +46 -0
  151. package/app/plugins/core3d/components/lightplan/edit-light/edit-light.component.scss +93 -0
  152. package/app/plugins/core3d/components/lightplan/edit-lightplan/edit-lightplan.component.d.ts +24 -0
  153. package/app/plugins/core3d/components/lightplan/edit-lightplan/edit-lightplan.component.scss +93 -0
  154. package/app/plugins/core3d/components/lightplan/lightplan.component.d.ts +60 -0
  155. package/app/plugins/core3d/components/lightplan/lightplan.component.scss +102 -0
  156. package/app/plugins/core3d/components/scene-options/scene-options.component.d.ts +17 -0
  157. package/app/plugins/core3d/components/scene-options/scene-options.component.scss +54 -0
  158. package/app/plugins/core3d/core/angles.d.ts +8 -0
  159. package/app/plugins/core3d/core/corner-utils.d.ts +8 -0
  160. package/app/plugins/core3d/core/dimensioning.d.ts +19 -0
  161. package/app/plugins/core3d/core/utils.d.ts +147 -0
  162. package/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.d.ts +49 -0
  163. package/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.scss +3 -0
  164. package/app/plugins/core3d/core3d/core3d.component.d.ts +76 -0
  165. package/app/plugins/core3d/core3d/core3d.component.scss +27 -0
  166. package/app/plugins/core3d/core3d.module.d.ts +38 -0
  167. package/app/plugins/core3d/directive/scene.directive.d.ts +26 -0
  168. package/app/plugins/core3d/enum/ar-feature.enum.d.ts +12 -0
  169. package/app/plugins/core3d/enum/direction.enum.d.ts +8 -0
  170. package/app/plugins/core3d/enum/result-type.enum.d.ts +19 -0
  171. package/app/plugins/core3d/hud/bounding-measurement-box/bounding-box-measurement.d.ts +28 -0
  172. package/app/plugins/core3d/hud/bounding-measurement-box/box-measurement.d.ts +17 -0
  173. package/app/plugins/core3d/hud/bounding-measurement-box/door-or-window-box-measurement.d.ts +29 -0
  174. package/app/plugins/core3d/hud/bounding-measurement-box/measurable.d.ts +8 -0
  175. package/app/plugins/core3d/hud/bounding-measurement-box/measurement-utils.d.ts +9 -0
  176. package/app/plugins/core3d/hud/custom-shape-name-label.d.ts +15 -0
  177. package/app/plugins/core3d/hud/floor-indicator.d.ts +20 -0
  178. package/app/plugins/core3d/hud/furniture-measurements.d.ts +12 -0
  179. package/app/plugins/core3d/hud/indicator-factory.d.ts +7 -0
  180. package/app/plugins/core3d/hud/measurements.d.ts +46 -0
  181. package/app/plugins/core3d/hud/on-wall-measurements.d.ts +18 -0
  182. package/app/plugins/core3d/hud/opening-symbol.d.ts +11 -0
  183. package/app/plugins/core3d/hud/rotation-helper.d.ts +44 -0
  184. package/app/plugins/core3d/hud/utils.d.ts +3 -0
  185. package/app/plugins/core3d/interface/dragged-data.interface.d.ts +10 -0
  186. package/app/plugins/core3d/interface/edge-visibility-changes.d.ts +5 -0
  187. package/app/plugins/core3d/interface/model.interface.d.ts +42 -0
  188. package/app/plugins/core3d/interface/opening.interface.d.ts +6 -0
  189. package/app/plugins/core3d/interface/scene-option-button.interface.d.ts +17 -0
  190. package/app/plugins/core3d/interface/scene-update.interface.d.ts +5 -0
  191. package/app/plugins/core3d/items/base-item.d.ts +97 -0
  192. package/app/plugins/core3d/items/custom-cylinder-floor-item.d.ts +12 -0
  193. package/app/plugins/core3d/items/custom-cylinder-wall-item.d.ts +13 -0
  194. package/app/plugins/core3d/items/custom-floor-item.d.ts +9 -0
  195. package/app/plugins/core3d/items/custom-objects.d.ts +55 -0
  196. package/app/plugins/core3d/items/custom-shape-floor-item.d.ts +9 -0
  197. package/app/plugins/core3d/items/custom-shape-wall-item.d.ts +10 -0
  198. package/app/plugins/core3d/items/custom-wall-floor-item.d.ts +19 -0
  199. package/app/plugins/core3d/items/custom-wall-item.d.ts +9 -0
  200. package/app/plugins/core3d/items/factory.d.ts +24 -0
  201. package/app/plugins/core3d/items/floor-item.d.ts +13 -0
  202. package/app/plugins/core3d/items/floor-pin.d.ts +11 -0
  203. package/app/plugins/core3d/items/floor-plane-item.d.ts +30 -0
  204. package/app/plugins/core3d/items/furniture.d.ts +3 -0
  205. package/app/plugins/core3d/items/in-wall-floor-item.d.ts +9 -0
  206. package/app/plugins/core3d/items/item-group.d.ts +51 -0
  207. package/app/plugins/core3d/items/item-type.d.ts +21 -0
  208. package/app/plugins/core3d/items/item.d.ts +84 -0
  209. package/app/plugins/core3d/items/metadata.d.ts +74 -0
  210. package/app/plugins/core3d/items/on-floor-item.d.ts +8 -0
  211. package/app/plugins/core3d/items/pin.d.ts +5 -0
  212. package/app/plugins/core3d/items/three-mesh.d.ts +8 -0
  213. package/app/plugins/core3d/items/wall-floor-item.d.ts +8 -0
  214. package/app/plugins/core3d/items/wall-objects.d.ts +512 -0
  215. package/app/plugins/core3d/items/wall-pin.d.ts +8 -0
  216. package/app/plugins/core3d/model/ar-parameters.d.ts +9 -0
  217. package/app/plugins/core3d/model/box-skin-default.d.ts +5 -0
  218. package/app/plugins/core3d/model/collision-info.d.ts +6 -0
  219. package/app/plugins/core3d/model/custom-floor-group-result.d.ts +18 -0
  220. package/app/plugins/core3d/model/cylinder-skin-default.d.ts +4 -0
  221. package/app/plugins/core3d/model/dragged-status.d.ts +18 -0
  222. package/app/plugins/core3d/model/face.d.ts +11 -0
  223. package/app/plugins/core3d/model/geometry.d.ts +11 -0
  224. package/app/plugins/core3d/model/scene-event.enum.d.ts +10 -0
  225. package/app/plugins/core3d/model/skin.d.ts +15 -0
  226. package/app/plugins/core3d/model/threed-model.d.ts +47 -0
  227. package/app/plugins/core3d/service/ar.service.d.ts +121 -0
  228. package/app/plugins/core3d/service/camera.service.d.ts +70 -0
  229. package/app/plugins/core3d/service/ceiling.service.d.ts +25 -0
  230. package/app/plugins/core3d/service/controls.d.ts +11 -0
  231. package/app/plugins/core3d/service/drag-and-drop.service.d.ts +73 -0
  232. package/app/plugins/core3d/service/error-glow.service.d.ts +18 -0
  233. package/app/plugins/core3d/service/floor.service.d.ts +43 -0
  234. package/app/plugins/core3d/service/font.service.d.ts +10 -0
  235. package/app/plugins/core3d/service/hud.service.d.ts +79 -0
  236. package/app/plugins/core3d/service/intersection.service.d.ts +10 -0
  237. package/app/plugins/core3d/service/item-group.service.d.ts +33 -0
  238. package/app/plugins/core3d/service/item.service.d.ts +37 -0
  239. package/app/plugins/core3d/service/light-presets.service.d.ts +46 -0
  240. package/app/plugins/core3d/service/lights.service.d.ts +38 -0
  241. package/app/plugins/core3d/service/message-board.service.d.ts +18 -0
  242. package/app/plugins/core3d/service/models.service.d.ts +37 -0
  243. package/app/plugins/core3d/service/outline.service.d.ts +40 -0
  244. package/app/plugins/core3d/service/rotation.service.d.ts +57 -0
  245. package/app/plugins/core3d/service/scene-event.service.d.ts +131 -0
  246. package/app/plugins/core3d/service/scene-options.service.d.ts +11 -0
  247. package/app/plugins/core3d/service/scene.service.d.ts +74 -0
  248. package/app/plugins/core3d/service/vr.service.d.ts +44 -0
  249. package/app/plugins/core3d/service/wall-measurements.service.d.ts +23 -0
  250. package/app/plugins/core3d/service/xr.service.d.ts +56 -0
  251. package/app/plugins/core3d/textures/DepthDataTexture.d.ts +5 -0
  252. package/app/plugins/core3d/walkthrough-camera-controls/walkthrough-camera-controls.component.d.ts +19 -0
  253. package/app/plugins/core3d/walkthrough-camera-controls/walkthrough-camera-controls.component.scss +7 -0
  254. package/app/plugins/furniture-manager/furniture-library/furniture-library.component.d.ts +27 -0
  255. package/app/plugins/furniture-manager/furniture-library/furniture-library.component.scss +20 -0
  256. package/app/plugins/furniture-manager/furniture-manager/furniture-manager.component.d.ts +91 -0
  257. package/app/plugins/furniture-manager/furniture-manager/furniture-manager.component.scss +57 -0
  258. package/app/plugins/furniture-manager/furniture-manager.module.d.ts +23 -0
  259. package/app/plugins/help/help/help.component.d.ts +21 -0
  260. package/app/plugins/help/help/help.component.scss +0 -0
  261. package/app/plugins/help/help-dialog/help-dialog.component.d.ts +20 -0
  262. package/app/plugins/help/help-dialog/help-dialog.component.scss +28 -0
  263. package/app/plugins/help/help.module.d.ts +12 -0
  264. package/app/plugins/lite-selector/lite-selector/component/animation/animation.component.d.ts +19 -0
  265. package/app/plugins/lite-selector/lite-selector/component/animation/animation.component.scss +0 -0
  266. package/app/plugins/lite-selector/lite-selector/component/answer-card/answer-card.component.d.ts +41 -0
  267. package/app/plugins/lite-selector/lite-selector/component/answer-card/answer-card.component.scss +25 -0
  268. package/app/plugins/lite-selector/lite-selector/component/answers-slideout/answers-slideout.component.d.ts +72 -0
  269. package/app/plugins/lite-selector/lite-selector/component/answers-slideout/answers-slideout.component.scss +146 -0
  270. package/app/plugins/lite-selector/lite-selector/component/color-filter/color-filter.component.d.ts +19 -0
  271. package/app/plugins/lite-selector/lite-selector/component/color-filter/color-filter.component.scss +37 -0
  272. package/app/plugins/lite-selector/lite-selector/component/customizer/customizer.component.d.ts +28 -0
  273. package/app/plugins/lite-selector/lite-selector/component/customizer/customizer.component.scss +127 -0
  274. package/app/plugins/lite-selector/lite-selector/component/image-zoom/image-zoom.component.d.ts +9 -0
  275. package/app/plugins/lite-selector/lite-selector/component/image-zoom/image-zoom.component.scss +47 -0
  276. package/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary-line.component.d.ts +31 -0
  277. package/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary-line.component.scss +11 -0
  278. package/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary.component.d.ts +38 -0
  279. package/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary.component.scss +80 -0
  280. package/app/plugins/lite-selector/lite-selector/component/tag-filter/tag-filter.component.d.ts +8 -0
  281. package/app/plugins/lite-selector/lite-selector/component/tag-filter/tag-filter.component.scss +10 -0
  282. package/app/plugins/lite-selector/lite-selector/lite-selector.component.d.ts +40 -0
  283. package/app/plugins/lite-selector/lite-selector/lite-selector.component.scss +10 -0
  284. package/app/plugins/lite-selector/lite-selector/service/customizer.service.d.ts +44 -0
  285. package/app/plugins/lite-selector/lite-selector.module.d.ts +22 -0
  286. package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +57 -0
  287. package/app/plugins/model-uploader/model-previewer/model-preview.component.scss +75 -0
  288. package/app/plugins/model-uploader/model-uploader/model-upload.component.scss +34 -0
  289. package/app/plugins/model-uploader/model-uploader/model-uploader.component.d.ts +23 -0
  290. package/app/plugins/model-uploader/model-uploader.module.d.ts +16 -0
  291. package/app/plugins/plugin-interface.d.ts +5 -0
  292. package/app/plugins/plugins.module.d.ts +15 -0
  293. package/app/plugins/presets/presets/presets.component.d.ts +22 -0
  294. package/app/plugins/presets/presets/presets.component.scss +0 -0
  295. package/app/plugins/presets/presets.module.d.ts +10 -0
  296. package/app/plugins/product-catalog/own-collection-catalog/product-own-collection.component.d.ts +19 -0
  297. package/app/plugins/product-catalog/own-collection-catalog/product-own-collection.component.scss +4 -0
  298. package/app/plugins/product-catalog/own-collection-catalog/product-own-collection.module.d.ts +10 -0
  299. package/app/plugins/product-catalog/product-catalog/product-catalog.component.d.ts +70 -0
  300. package/app/plugins/product-catalog/product-catalog/product-catalog.component.scss +128 -0
  301. package/app/plugins/product-catalog/product-catalog.module.d.ts +16 -0
  302. package/app/plugins/render/enum/connection-status.d.ts +6 -0
  303. package/app/plugins/render/enum/render-modes.d.ts +5 -0
  304. package/app/plugins/render/enum/render-status.d.ts +7 -0
  305. package/app/plugins/render/model/camera-position.d.ts +7 -0
  306. package/app/plugins/render/model/image-size.d.ts +6 -0
  307. package/app/plugins/render/model/lightning.d.ts +5 -0
  308. package/app/plugins/render/model/render-data.d.ts +15 -0
  309. package/app/plugins/render/model/render-environment.d.ts +6 -0
  310. package/app/plugins/render/model/render-parameters.d.ts +15 -0
  311. package/app/plugins/render/model/render-queue-item.d.ts +14 -0
  312. package/app/plugins/render/model/render-settings.d.ts +9 -0
  313. package/app/plugins/render/model/render.d.ts +14 -0
  314. package/app/plugins/render/render-controls/render-controls.component.d.ts +27 -0
  315. package/app/plugins/render/render-controls/render-controls.component.scss +51 -0
  316. package/app/plugins/render/render-dialog/render-dialog.component.d.ts +59 -0
  317. package/app/plugins/render/render-dialog/render-dialog.component.scss +320 -0
  318. package/app/plugins/render/render.module.d.ts +20 -0
  319. package/app/plugins/render/service/new-render.service.d.ts +65 -0
  320. package/app/plugins/render/service/render.service.d.ts +104 -0
  321. package/app/plugins/room-planner/components/appearance-section/appearance-section.component.d.ts +43 -0
  322. package/app/plugins/room-planner/components/appearance-section/appearance-section.component.scss +14 -0
  323. package/app/plugins/room-planner/components/color-picker/color-picker.component.d.ts +11 -0
  324. package/app/plugins/room-planner/components/color-picker/color-picker.component.scss +0 -0
  325. package/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.d.ts +49 -0
  326. package/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.scss +19 -0
  327. package/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.d.ts +49 -0
  328. package/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.scss +24 -0
  329. package/app/plugins/room-planner/components/dimension-input/dimension-input.component.d.ts +22 -0
  330. package/app/plugins/room-planner/components/dimension-input/dimension-input.component.scss +14 -0
  331. package/app/plugins/room-planner/components/edit-apply/edit-apply.component.d.ts +19 -0
  332. package/app/plugins/room-planner/components/edit-apply/edit-apply.component.scss +0 -0
  333. package/app/plugins/room-planner/components/edit-parameter/edit-parameter.component.d.ts +28 -0
  334. package/app/plugins/room-planner/components/edit-parameter/edit-parameter.component.scss +23 -0
  335. package/app/plugins/room-planner/components/file-drop/file-drop.component.d.ts +21 -0
  336. package/app/plugins/room-planner/components/file-drop/file-drop.component.scss +31 -0
  337. package/app/plugins/room-planner/components/floorplanner/const/defaults.d.ts +48 -0
  338. package/app/plugins/room-planner/components/floorplanner/floorplanner-mode.d.ts +9 -0
  339. package/app/plugins/room-planner/components/floorplanner/floorplanner.component.d.ts +172 -0
  340. package/app/plugins/room-planner/components/floorplanner/floorplanner.component.scss +48 -0
  341. package/app/plugins/room-planner/components/floorplanner/service/floorplan.service.d.ts +103 -0
  342. package/app/plugins/room-planner/components/floorplanner/service/room.service.d.ts +75 -0
  343. package/app/plugins/room-planner/components/floorplanner/snap-indicator-mode.d.ts +5 -0
  344. package/app/plugins/room-planner/components/floorplanner/utils/context.utils.d.ts +5 -0
  345. package/app/plugins/room-planner/components/object-library/object-library.component.d.ts +23 -0
  346. package/app/plugins/room-planner/components/object-library/object-library.component.scss +43 -0
  347. package/app/plugins/room-planner/components/ral-color-picker/ral-color-picker.component.d.ts +22 -0
  348. package/app/plugins/room-planner/components/ral-color-picker/ral-color-picker.component.scss +55 -0
  349. package/app/plugins/room-planner/components/rgb-color-picker/rgb-color-picker.component.d.ts +11 -0
  350. package/app/plugins/room-planner/components/rgb-color-picker/rgb-color-picker.component.scss +10 -0
  351. package/app/plugins/room-planner/components/selected-floor/selected-floor.component.d.ts +16 -0
  352. package/app/plugins/room-planner/components/selected-floor/selected-floor.component.scss +16 -0
  353. package/app/plugins/room-planner/components/selected-object/selected-object.component.d.ts +44 -0
  354. package/app/plugins/room-planner/components/selected-object/selected-object.component.scss +21 -0
  355. package/app/plugins/room-planner/components/selected-threed-object/selected-threed-object.component.d.ts +57 -0
  356. package/app/plugins/room-planner/components/selected-threed-object/selected-threed-object.component.scss +35 -0
  357. package/app/plugins/room-planner/components/selected-wall/selected-wall.component.d.ts +45 -0
  358. package/app/plugins/room-planner/components/selected-wall/selected-wall.component.scss +31 -0
  359. package/app/plugins/room-planner/components/settings/settings-options.component.d.ts +18 -0
  360. package/app/plugins/room-planner/components/settings/settings-options.component.scss +46 -0
  361. package/app/plugins/room-planner/components/settings/settings.component.d.ts +63 -0
  362. package/app/plugins/room-planner/components/settings/settings.component.scss +42 -0
  363. package/app/plugins/room-planner/components/texture-editor/texture-editor.component.d.ts +125 -0
  364. package/app/plugins/room-planner/components/texture-editor/texture-editor.component.scss +38 -0
  365. package/app/plugins/room-planner/components/texture-picker/texture-picker.component.d.ts +25 -0
  366. package/app/plugins/room-planner/components/texture-picker/texture-picker.component.scss +49 -0
  367. package/app/plugins/room-planner/components/wall-length-input/wall-length-input.component.d.ts +16 -0
  368. package/app/plugins/room-planner/components/wall-length-input/wall-length-input.component.scss +5 -0
  369. package/app/plugins/room-planner/const/key.d.ts +10 -0
  370. package/app/plugins/room-planner/room-planner/room-planner.component.d.ts +236 -0
  371. package/app/plugins/room-planner/room-planner/room-planner.component.scss +167 -0
  372. package/app/plugins/room-planner/room-planner.module.d.ts +59 -0
  373. package/app/plugins/threed-in-photo/components/threed-in-photo-scene/threed-in-photo-scene.component.d.ts +18 -0
  374. package/app/plugins/threed-in-photo/components/threed-in-photo-scene/threed-in-photo-scene.component.scss +7 -0
  375. package/app/plugins/threed-in-photo/components/upload-image/upload-image.component.d.ts +18 -0
  376. package/app/plugins/threed-in-photo/components/upload-image/upload-image.component.scss +7 -0
  377. package/app/plugins/threed-in-photo/components/view-control/view-control.component.d.ts +30 -0
  378. package/app/plugins/threed-in-photo/components/view-control/view-control.component.scss +40 -0
  379. package/app/plugins/threed-in-photo/models/model-output.d.ts +14 -0
  380. package/app/plugins/threed-in-photo/services/threed-in-photo-build.service.d.ts +37 -0
  381. package/app/plugins/threed-in-photo/services/threed-in-photo-connection.service.d.ts +8 -0
  382. package/app/plugins/threed-in-photo/services/threed-in-photo-control.service.d.ts +14 -0
  383. package/app/plugins/threed-in-photo/services/threed-in-photo-event-listeners.service.d.ts +15 -0
  384. package/app/plugins/threed-in-photo/services/threed-in-photo-event.service.d.ts +9 -0
  385. package/app/plugins/threed-in-photo/services/threed-in-photo-initializer.service.d.ts +27 -0
  386. package/app/plugins/threed-in-photo/services/threed-in-photo-render.service.d.ts +20 -0
  387. package/app/plugins/threed-in-photo/services/threed-in-photo-scene.service.d.ts +12 -0
  388. package/app/plugins/threed-in-photo/services/threed-in-photo-view.service.d.ts +8 -0
  389. package/app/plugins/threed-in-photo/threed-in-photo.module.d.ts +17 -0
  390. package/app/plugins/threed-in-photo/utils/utils.d.ts +6 -0
  391. package/app/plugins/threedselector/element-buttons/element-buttons.component.d.ts +31 -0
  392. package/app/plugins/threedselector/element-buttons/element-buttons.component.scss +61 -0
  393. package/app/plugins/threedselector/element-slider/element-slider.component.d.ts +14 -0
  394. package/app/plugins/threedselector/element-slider/element-slider.component.scss +47 -0
  395. package/app/plugins/threedselector/element-toolbar/element-toolbar.component.d.ts +26 -0
  396. package/app/plugins/threedselector/element-toolbar/element-toolbar.component.scss +142 -0
  397. package/app/plugins/threedselector/threedselector/model/furniture-connected-part-integration.d.ts +7 -0
  398. package/app/plugins/threedselector/threedselector/model/furniture-integration.d.ts +12 -0
  399. package/app/plugins/threedselector/threedselector/model/furniture-part-integration.d.ts +14 -0
  400. package/app/plugins/threedselector/threedselector/model/furniture-part-variation.d.ts +7 -0
  401. package/app/plugins/threedselector/threedselector/model/material.d.ts +41 -0
  402. package/app/plugins/threedselector/threedselector/model/variation-settings.d.ts +53 -0
  403. package/app/plugins/threedselector/threedselector/model/variation.d.ts +11 -0
  404. package/app/plugins/threedselector/threedselector/service/animation.service.d.ts +22 -0
  405. package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +186 -0
  406. package/app/plugins/threedselector/threedselector/service/dimensions.service.d.ts +33 -0
  407. package/app/plugins/threedselector/threedselector/service/element.service.d.ts +45 -0
  408. package/app/plugins/threedselector/threedselector/service/light-creation.service.d.ts +9 -0
  409. package/app/plugins/threedselector/threedselector/service/load-furniture.service.d.ts +74 -0
  410. package/app/plugins/threedselector/threedselector/service/resize.service.d.ts +13 -0
  411. package/app/plugins/threedselector/threedselector/service/third-party-model.service.d.ts +66 -0
  412. package/app/plugins/threedselector/threedselector/service/threedselector.service.d.ts +22 -0
  413. package/app/plugins/threedselector/threedselector/service/variation-cache.service.d.ts +23 -0
  414. package/app/plugins/threedselector/threedselector/service/variation.service.d.ts +23 -0
  415. package/app/plugins/threedselector/threedselector/threedselector.component.d.ts +188 -0
  416. package/app/plugins/threedselector/threedselector/threedselector.component.scss +82 -0
  417. package/app/plugins/threedselector/threedselector/utils/asset.utils.d.ts +19 -0
  418. package/app/plugins/threedselector/threedselector/utils/image.utils.d.ts +6 -0
  419. package/app/plugins/threedselector/threedselector/utils/json-parser.utils.d.ts +9 -0
  420. package/app/plugins/threedselector/threedselector/utils/scene-3d.utils.d.ts +10 -0
  421. package/app/plugins/threedselector/threedselector.module.d.ts +31 -0
  422. package/app/plugins/toolbar/download-dialog/download-dialog.component.d.ts +14 -0
  423. package/app/plugins/toolbar/download-dialog/download-dialog.component.scss +22 -0
  424. package/app/plugins/toolbar/draw-dialog/draw-dialog.component.d.ts +66 -0
  425. package/app/plugins/toolbar/draw-dialog/draw-dialog.component.scss +97 -0
  426. package/app/plugins/toolbar/edit-preset-dialog/edit-preset-dialog.component.d.ts +8 -0
  427. package/app/plugins/toolbar/edit-preset-dialog/edit-preset-dialog.component.scss +0 -0
  428. package/app/plugins/toolbar/landing-screen-modal/landing-screen-modal.component.d.ts +36 -0
  429. package/app/plugins/toolbar/landing-screen-modal/landing-screen-modal.component.scss +71 -0
  430. package/app/plugins/toolbar/load-from-cloud-dialog/load-from-cloud-dialog.component.d.ts +36 -0
  431. package/app/plugins/toolbar/load-from-cloud-dialog/load-from-cloud-dialog.component.scss +3 -0
  432. package/app/plugins/toolbar/open-dialog/open-dialog.component.d.ts +23 -0
  433. package/app/plugins/toolbar/open-dialog/open-dialog.component.scss +0 -0
  434. package/app/plugins/toolbar/pdf-crop-dialog/pdf-crop-dialog.component.d.ts +34 -0
  435. package/app/plugins/toolbar/pdf-crop-dialog/pdf-crop-dialog.component.scss +17 -0
  436. package/app/plugins/toolbar/save-dialog/save-dialog.component.d.ts +38 -0
  437. package/app/plugins/toolbar/save-dialog/save-dialog.component.scss +33 -0
  438. package/app/plugins/toolbar/saved-dialog/saved-dialog.component.d.ts +24 -0
  439. package/app/plugins/toolbar/saved-dialog/saved-dialog.component.scss +7 -0
  440. package/app/plugins/toolbar/toolbar/limited-mode-message-component/limited-mode-message.component.d.ts +9 -0
  441. package/app/plugins/toolbar/toolbar/limited-mode-message-component/limited-mode-message.component.scss +10 -0
  442. package/app/plugins/toolbar/toolbar/toolbar.component.d.ts +101 -0
  443. package/app/plugins/toolbar/toolbar/toolbar.component.scss +251 -0
  444. package/app/plugins/toolbar/toolbar.module.d.ts +44 -0
  445. package/app/root/root.component.scss +0 -0
  446. package/app/service/dynamic-script.service.d.ts +8 -0
  447. package/app/service/google-tag-manager.service.d.ts +19 -0
  448. package/app/service/local-storage.service.d.ts +18 -0
  449. package/app/service/service-locator.service.d.ts +4 -0
  450. package/app/shared/base64-images.d.ts +4 -0
  451. package/app/shared/button-elevation/button-elevation.component.d.ts +40 -0
  452. package/app/shared/button-elevation/button-elevation.component.scss +109 -0
  453. package/app/shared/button-elevation/button-elevation.module.d.ts +16 -0
  454. package/app/shared/camera-settings-dialog/camera-settings-dialog.component.d.ts +24 -0
  455. package/app/shared/camera-settings-dialog/camera-settings-dialog.component.scss +30 -0
  456. package/app/shared/camera-settings-dialog/camera-settings-dialog.module.d.ts +16 -0
  457. package/app/shared/category-library/category-library.component.d.ts +10 -0
  458. package/app/shared/category-library/category-library.component.scss +16 -0
  459. package/app/shared/category-library/category-library.module.d.ts +11 -0
  460. package/app/shared/context-menu/context-menu.component.d.ts +12 -0
  461. package/app/shared/context-menu/context-menu.component.scss +25 -0
  462. package/app/shared/context-menu/context-menu.module.d.ts +14 -0
  463. package/app/shared/context-menu/item-context-menu/item-context-menu.component.d.ts +30 -0
  464. package/app/shared/context-menu/item-context-menu/item-context-menu.component.scss +32 -0
  465. package/app/shared/dialog/dialog.component.d.ts +26 -0
  466. package/app/shared/dialog/dialog.component.scss +25 -0
  467. package/app/shared/dialog/dialog.module.d.ts +12 -0
  468. package/app/shared/dialog/enum/dialog-type.enum.d.ts +6 -0
  469. package/app/shared/dialog/interface/dialog-config.interface.d.ts +7 -0
  470. package/app/shared/dialog/service/dialog.service.d.ts +11 -0
  471. package/app/shared/error-dialog/error-dialog.component.d.ts +11 -0
  472. package/app/shared/error-dialog/error-dialog.component.scss +0 -0
  473. package/app/shared/error-dialog/error-dialog.module.d.ts +10 -0
  474. package/app/shared/export-dialog/export-dialog.component.d.ts +11 -0
  475. package/app/shared/export-dialog/export-dialog.component.scss +19 -0
  476. package/app/shared/export-dialog/export-dialog.module.d.ts +11 -0
  477. package/app/shared/info-dialog/info-dialog.component.d.ts +9 -0
  478. package/app/shared/info-dialog/info-dialog.component.scss +15 -0
  479. package/app/shared/info-dialog/info-dialog.module.d.ts +12 -0
  480. package/app/shared/loader/hd-loader.component.d.ts +6 -0
  481. package/app/shared/loader/hd-loader.component.scss +44 -0
  482. package/app/shared/loader/hd-loader.module.d.ts +9 -0
  483. package/app/shared/loader/loader.component.scss +42 -0
  484. package/app/shared/loading-overlay/dialog/loading-overlay-dialog.component.d.ts +8 -0
  485. package/app/shared/loading-overlay/dialog/loading-overlay-dialog.component.scss +3 -0
  486. package/app/shared/loading-overlay/loading-overlay.component.d.ts +19 -0
  487. package/app/shared/loading-overlay/loading-overlay.component.scss +9 -0
  488. package/app/shared/loading-overlay/loading-overlay.module.d.ts +11 -0
  489. package/app/shared/model-dialog/model-dialog-furniture-list.component.d.ts +35 -0
  490. package/app/shared/model-dialog/model-dialog-furniture-list.component.scss +221 -0
  491. package/app/shared/model-dialog/model-dialog.component.d.ts +31 -0
  492. package/app/shared/model-dialog/model-dialog.component.scss +22 -0
  493. package/app/shared/model-dialog/model-dialog.module.d.ts +16 -0
  494. package/app/shared/progress-bar/progress-bar.component.d.ts +9 -0
  495. package/app/shared/progress-bar/progress-bar.component.scss +11 -0
  496. package/app/shared/progress-bar/progress-bar.module.d.ts +9 -0
  497. package/app/shared/register-dialog/register-dialog.component.d.ts +26 -0
  498. package/app/shared/register-dialog/register-dialog.component.scss +21 -0
  499. package/app/shared/screen-size-analysis/device-size-type.d.ts +5 -0
  500. package/app/shared/screen-size-analysis/navigator-type.enum.d.ts +4 -0
  501. package/app/shared/screen-size-analysis/screen-size-analysis.service.d.ts +27 -0
  502. package/app/shared/screen-size-analysis/screen-size-config.d.ts +5 -0
  503. package/app/shared/screen-size-analysis/screen-size-info.d.ts +10 -0
  504. package/app/shared/slider-input/slider-input.component.d.ts +13 -0
  505. package/app/shared/slider-input/slider-input.component.scss +12 -0
  506. package/app/shared/slider-input/slider-input.module.d.ts +13 -0
  507. package/app/shared/toolbar-icon/toolbar-icon.component.d.ts +12 -0
  508. package/app/shared/toolbar-icon/toolbar-icon.component.scss +8 -0
  509. package/app/shared/toolbar-icon/toolbar-icon.module.d.ts +11 -0
  510. package/app/shared/zoom-controls/zoom-controls.component.d.ts +16 -0
  511. package/app/shared/zoom-controls/zoom-controls.component.scss +0 -0
  512. package/app/shared/zoom-controls/zoom-controls.module.d.ts +10 -0
  513. package/assets/.gitkeep +0 -0
  514. package/assets/3d-models/pin.mtl +12 -0
  515. package/assets/3d-models/pin.obj +1083 -0
  516. package/assets/colors/ral.json +2345 -0
  517. package/assets/cursors/pencil.png +0 -0
  518. package/assets/cursors/pencil.svg +1 -0
  519. package/assets/fonts/helvetiker_regular.ttf +0 -0
  520. package/assets/fonts/helvetiker_regular.typeface.json +1 -0
  521. package/assets/fonts/helvetiker_regular.woff +0 -0
  522. package/assets/fonts/optimer_regular.typeface.json +1 -0
  523. package/assets/hdri/TSStudio3Point.hdr +135 -0
  524. package/assets/hdri/ground_MASK.jpg +0 -0
  525. package/assets/hdri/std_env_v2_A.hdr +0 -0
  526. package/assets/hdri/std_env_v2_B.hdr +0 -0
  527. package/assets/hdri/std_env_v2_C.hdr +0 -0
  528. package/assets/hdri/std_env_v2_D.hdr +0 -0
  529. package/assets/hdri/std_env_v2_E.hdr +46 -0
  530. package/assets/icons/add-button.svg +10 -0
  531. package/assets/icons/ar_circle.svg +7 -0
  532. package/assets/icons/arrow_point_down.svg +6 -0
  533. package/assets/icons/brush.svg +1 -0
  534. package/assets/icons/cart-shopping-regular.svg +1 -0
  535. package/assets/icons/check.svg +6 -0
  536. package/assets/icons/cit_powered_white.svg +92 -0
  537. package/assets/icons/conf_frame.svg +1 -0
  538. package/assets/icons/conf_plane.svg +1 -0
  539. package/assets/icons/cross.svg +1 -0
  540. package/assets/icons/cube-outline.svg +1 -0
  541. package/assets/icons/cube-unfolded.svg +1 -0
  542. package/assets/icons/delete-button.svg +16 -0
  543. package/assets/icons/download.svg +4 -0
  544. package/assets/icons/edit-button.svg +18 -0
  545. package/assets/icons/google-cardboard-orange.svg +1 -0
  546. package/assets/icons/google-cardboard.svg +1 -0
  547. package/assets/icons/hand-pointer.svg +1 -0
  548. package/assets/icons/height_adjust.svg +1 -0
  549. package/assets/icons/magic-wand.svg +57 -0
  550. package/assets/icons/magnifier.svg +12 -0
  551. package/assets/icons/measurements.svg +1 -0
  552. package/assets/icons/move-phone-ar.svg +4 -0
  553. package/assets/icons/qrcode.svg +1 -0
  554. package/assets/icons/street-view-orange.svg +5 -0
  555. package/assets/icons/street-view.svg +6 -0
  556. package/assets/icons/swap-button.svg +12 -0
  557. package/assets/icons/tilt-phone.svg +29 -0
  558. package/assets/icons/triangle_down.svg +1 -0
  559. package/assets/icons/triangle_up.svg +1 -0
  560. package/assets/images/colijn-logo.webp +0 -0
  561. package/assets/images/favicon.ico +0 -0
  562. package/assets/images/favicon.png +0 -0
  563. package/assets/images/ione360-logo.webp +0 -0
  564. package/assets/images/logo.svg +35 -0
  565. package/assets/workers/indexedDB-web-worker.js +74 -0
  566. package/bundle-styles.scss +267 -0
  567. package/bundles/colijnit-homedecorator.umd.js +47374 -0
  568. package/bundles/colijnit-homedecorator.umd.js.map +1 -0
  569. package/colijnit-homedecorator.d.ts +5 -0
  570. package/environments/environment.d.ts +11 -0
  571. package/esm2015/app/app.version.js +9 -0
  572. package/esm2015/app/core/components/debug/debug.component.js +57 -0
  573. package/esm2015/app/core/components/error/error-message.component.js +55 -0
  574. package/esm2015/app/core/components/tooltip/tooltip.component.js +73 -0
  575. package/esm2015/app/core/const/dimensioning.js +28 -0
  576. package/esm2015/app/core/core.module.js +159 -0
  577. package/esm2015/app/core/directive/autofocus.directive.js +26 -0
  578. package/esm2015/app/core/directive/tooltip.directive.js +64 -0
  579. package/esm2015/app/core/directive/visibility-observer-master.directive.js +53 -0
  580. package/esm2015/app/core/directive/visibility-observer.directive.js +54 -0
  581. package/esm2015/app/core/enum/configuration-key.enum.js +37 -0
  582. package/esm2015/app/core/enum/export-type.enum.js +7 -0
  583. package/esm2015/app/core/enum/google-tag-manager-event.enum.js +14 -0
  584. package/esm2015/app/core/enum/icon-name.enum.js +17 -0
  585. package/esm2015/app/core/enum/icon.enum.js +35 -0
  586. package/esm2015/app/core/enum/light.enum.js +9 -0
  587. package/esm2015/app/core/enum/message-type.enum.js +71 -0
  588. package/esm2015/app/core/enum/model-type.enum.js +8 -0
  589. package/esm2015/app/core/enum/output-encoding.enum.js +6 -0
  590. package/esm2015/app/core/enum/shadow-map-type.enum.js +8 -0
  591. package/esm2015/app/core/enum/user-role-type.enum.js +22 -0
  592. package/esm2015/app/core/enum/view-mode.enum.js +11 -0
  593. package/esm2015/app/core/enum/xr-mode.enum.js +6 -0
  594. package/esm2015/app/core/interface/adjustable-element.interface.js +2 -0
  595. package/esm2015/app/core/interface/category.interface.js +2 -0
  596. package/esm2015/app/core/interface/changes.interface.js +2 -0
  597. package/esm2015/app/core/interface/child-params.interface.js +2 -0
  598. package/esm2015/app/core/interface/configuration-data.interface.js +2 -0
  599. package/esm2015/app/core/interface/external-settings.interface.js +2 -0
  600. package/esm2015/app/core/interface/info-dialog-data.interface.js +2 -0
  601. package/esm2015/app/core/interface/light-preset.interface.js +2 -0
  602. package/esm2015/app/core/interface/loading-overlay-data.interface.js +2 -0
  603. package/esm2015/app/core/interface/media-resource.interface.js +2 -0
  604. package/esm2015/app/core/interface/message-with-payload.interface.js +2 -0
  605. package/esm2015/app/core/interface/message-without-payload.interface.js +2 -0
  606. package/esm2015/app/core/interface/preset.interface.js +2 -0
  607. package/esm2015/app/core/interface/selected-floor-event.interface.js +2 -0
  608. package/esm2015/app/core/interface/selected-wall-event.interface.js +2 -0
  609. package/esm2015/app/core/interface/texture.interface.js +2 -0
  610. package/esm2015/app/core/interface/toolbar-icon.interface.js +2 -0
  611. package/esm2015/app/core/model/ar-position-indicator.js +21 -0
  612. package/esm2015/app/core/model/camera-settings.js +14 -0
  613. package/esm2015/app/core/model/category.js +15 -0
  614. package/esm2015/app/core/model/custom-button.js +16 -0
  615. package/esm2015/app/core/model/error-message.js +9 -0
  616. package/esm2015/app/core/model/export-object.js +3 -0
  617. package/esm2015/app/core/model/from-intersection-observer.js +64 -0
  618. package/esm2015/app/core/model/homedecorator-settings-options.js +49 -0
  619. package/esm2015/app/core/model/homedecorator-settings.js +22 -0
  620. package/esm2015/app/core/model/icon.js +34 -0
  621. package/esm2015/app/core/model/light-preset.js +59 -0
  622. package/esm2015/app/core/model/light-properties.js +45 -0
  623. package/esm2015/app/core/model/media-resource.js +10 -0
  624. package/esm2015/app/core/model/preset.js +15 -0
  625. package/esm2015/app/core/model/ral-color.js +2 -0
  626. package/esm2015/app/core/model/shadow-properties.js +10 -0
  627. package/esm2015/app/core/model/texture-type.js +8 -0
  628. package/esm2015/app/core/model/texture.js +58 -0
  629. package/esm2015/app/core/model/three-object.js +2 -0
  630. package/esm2015/app/core/model/toast-type.js +7 -0
  631. package/esm2015/app/core/model/toast.js +7 -0
  632. package/esm2015/app/core/model/xr-reticle.js +87 -0
  633. package/esm2015/app/core/pipe/append.pipe.js +21 -0
  634. package/esm2015/app/core/pipe/cm-to-measure.pipe.js +20 -0
  635. package/esm2015/app/core/pipe/filter.pipe.js +20 -0
  636. package/esm2015/app/core/pipe/keys.pipe.js +22 -0
  637. package/esm2015/app/core/pipe/localize.pipe.js +28 -0
  638. package/esm2015/app/core/pipe/m-to-measure.pipe.js +20 -0
  639. package/esm2015/app/core/pipe/prepend.pipe.js +21 -0
  640. package/esm2015/app/core/pipe/scm-to-measure.pipe.js +20 -0
  641. package/esm2015/app/core/pipe/sm-to-measure.pipe.js +20 -0
  642. package/esm2015/app/core/pipe/strip-html.pipe.js +17 -0
  643. package/esm2015/app/core/service/3dm-api.js +246 -0
  644. package/esm2015/app/core/service/app-state.service.js +128 -0
  645. package/esm2015/app/core/service/configuration.service.js +72 -0
  646. package/esm2015/app/core/service/debug.service.js +45 -0
  647. package/esm2015/app/core/service/dimensioning.service.js +45 -0
  648. package/esm2015/app/core/service/dynamic-camera.service.js +107 -0
  649. package/esm2015/app/core/service/environment.service.js +17 -0
  650. package/esm2015/app/core/service/error.service.js +30 -0
  651. package/esm2015/app/core/service/export.service.js +97 -0
  652. package/esm2015/app/core/service/file.service.js +44 -0
  653. package/esm2015/app/core/service/homedecorator-app-event.service.js +27 -0
  654. package/esm2015/app/core/service/homedecorator-app.service.js +201 -0
  655. package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +455 -0
  656. package/esm2015/app/core/service/homedecorator-connector.service.js +604 -0
  657. package/esm2015/app/core/service/homedecorator-dictionary.service.js +73 -0
  658. package/esm2015/app/core/service/homedecorator-icon-cache.service.js +43 -0
  659. package/esm2015/app/core/service/homedecorator-settings.service.js +146 -0
  660. package/esm2015/app/core/service/homedecorator.service.js +37 -0
  661. package/esm2015/app/core/service/integration.service.js +56 -0
  662. package/esm2015/app/core/service/item-serialization.service.js +188 -0
  663. package/esm2015/app/core/service/json-utils.service.js +56 -0
  664. package/esm2015/app/core/service/message-bus.service.js +28 -0
  665. package/esm2015/app/core/service/permanent-store.service.js +135 -0
  666. package/esm2015/app/core/service/presets.service.js +297 -0
  667. package/esm2015/app/core/service/progress.service.js +74 -0
  668. package/esm2015/app/core/service/ral.service.js +98 -0
  669. package/esm2015/app/core/service/skip-button-info.service.js +60 -0
  670. package/esm2015/app/core/service/toast.service.js +23 -0
  671. package/esm2015/app/core/service/utils.service.js +566 -0
  672. package/esm2015/app/core/service/view-mode.service.js +61 -0
  673. package/esm2015/app/core/service/web-worker.service.js +44 -0
  674. package/esm2015/app/core/utils/clone-utils.js +41 -0
  675. package/esm2015/app/core/utils/color.utils.js +20 -0
  676. package/esm2015/app/core/utils/file.utils.js +234 -0
  677. package/esm2015/app/core/utils/function/is-empty.function.js +5 -0
  678. package/esm2015/app/core/utils/function/is-nill.function.js +5 -0
  679. package/esm2015/app/core/utils/material.utils.js +407 -0
  680. package/esm2015/app/core/utils/object.utils.js +191 -0
  681. package/esm2015/app/core/utils/relative-position.utils.js +74 -0
  682. package/esm2015/app/core/utils/variation-utils.js +314 -0
  683. package/esm2015/app/core/workers/enum/web-worker-message.enum.js +6 -0
  684. package/esm2015/app/core/workers/enum/web-worker-type.enum.js +5 -0
  685. package/esm2015/app/development/components/selected-child-material-texture.component.js +467 -0
  686. package/esm2015/app/development/components/selected-child-material.component.js +863 -0
  687. package/esm2015/app/development/components/selected-child.component.js +64 -0
  688. package/esm2015/app/development/components/selected-object-base.js +127 -0
  689. package/esm2015/app/development/components/selected-object.component.js +98 -0
  690. package/esm2015/app/development/development.module.js +74 -0
  691. package/esm2015/app/development/directive/development.directive.js +92 -0
  692. package/esm2015/app/development/service/development.service.js +212 -0
  693. package/esm2015/app/homedecorator.component.js +285 -0
  694. package/esm2015/app/homedecorator.module.js +60 -0
  695. package/esm2015/app/plugins/core3d/collision-manager/collision-manager.service.js +119 -0
  696. package/esm2015/app/plugins/core3d/collision-manager/floorplan-collision-detection.js +158 -0
  697. package/esm2015/app/plugins/core3d/collision-manager/snapping-collision.service.js +234 -0
  698. package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-buttons/ar-gui-buttons.component.js +36 -0
  699. package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-configurator/ar-gui-configurator.component.js +49 -0
  700. package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-context-menu/ar-gui-context-menu.component.js +77 -0
  701. package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-elements/ar-gui-notifications/ar-gui-notifications.component.js +26 -0
  702. package/esm2015/app/plugins/core3d/components/ar-gui/ar-gui-root/ar-gui-root.component.js +46 -0
  703. package/esm2015/app/plugins/core3d/components/lightplan/edit-light/edit-light.component.js +197 -0
  704. package/esm2015/app/plugins/core3d/components/lightplan/edit-lightplan/edit-lightplan.component.js +197 -0
  705. package/esm2015/app/plugins/core3d/components/lightplan/lightplan.component.js +512 -0
  706. package/esm2015/app/plugins/core3d/components/scene-options/scene-options.component.js +88 -0
  707. package/esm2015/app/plugins/core3d/core/angles.js +19 -0
  708. package/esm2015/app/plugins/core3d/core/corner-utils.js +9 -0
  709. package/esm2015/app/plugins/core3d/core/dimensioning.js +79 -0
  710. package/esm2015/app/plugins/core3d/core/utils.js +606 -0
  711. package/esm2015/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.js +289 -0
  712. package/esm2015/app/plugins/core3d/core3d/core3d.component.js +243 -0
  713. package/esm2015/app/plugins/core3d/core3d.module.js +201 -0
  714. package/esm2015/app/plugins/core3d/directive/scene.directive.js +41 -0
  715. package/esm2015/app/plugins/core3d/enum/ar-feature.enum.js +14 -0
  716. package/esm2015/app/plugins/core3d/enum/direction.enum.js +10 -0
  717. package/esm2015/app/plugins/core3d/enum/result-type.enum.js +21 -0
  718. package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/bounding-box-measurement.js +99 -0
  719. package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/box-measurement.js +35 -0
  720. package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/door-or-window-box-measurement.js +95 -0
  721. package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/measurable.js +2 -0
  722. package/esm2015/app/plugins/core3d/hud/bounding-measurement-box/measurement-utils.js +22 -0
  723. package/esm2015/app/plugins/core3d/hud/custom-shape-name-label.js +31 -0
  724. package/esm2015/app/plugins/core3d/hud/floor-indicator.js +80 -0
  725. package/esm2015/app/plugins/core3d/hud/furniture-measurements.js +44 -0
  726. package/esm2015/app/plugins/core3d/hud/indicator-factory.js +49 -0
  727. package/esm2015/app/plugins/core3d/hud/measurements.js +165 -0
  728. package/esm2015/app/plugins/core3d/hud/on-wall-measurements.js +80 -0
  729. package/esm2015/app/plugins/core3d/hud/opening-symbol.js +74 -0
  730. package/esm2015/app/plugins/core3d/hud/rotation-helper.js +263 -0
  731. package/esm2015/app/plugins/core3d/hud/utils.js +30 -0
  732. package/esm2015/app/plugins/core3d/interface/dragged-data.interface.js +2 -0
  733. package/esm2015/app/plugins/core3d/interface/edge-visibility-changes.js +2 -0
  734. package/esm2015/app/plugins/core3d/interface/model.interface.js +2 -0
  735. package/esm2015/app/plugins/core3d/interface/opening.interface.js +2 -0
  736. package/esm2015/app/plugins/core3d/interface/scene-option-button.interface.js +6 -0
  737. package/esm2015/app/plugins/core3d/interface/scene-update.interface.js +2 -0
  738. package/esm2015/app/plugins/core3d/items/base-item.js +233 -0
  739. package/esm2015/app/plugins/core3d/items/custom-cylinder-floor-item.js +41 -0
  740. package/esm2015/app/plugins/core3d/items/custom-cylinder-wall-item.js +45 -0
  741. package/esm2015/app/plugins/core3d/items/custom-floor-item.js +11 -0
  742. package/esm2015/app/plugins/core3d/items/custom-objects.js +295 -0
  743. package/esm2015/app/plugins/core3d/items/custom-shape-floor-item.js +45 -0
  744. package/esm2015/app/plugins/core3d/items/custom-shape-wall-item.js +37 -0
  745. package/esm2015/app/plugins/core3d/items/custom-wall-floor-item.js +84 -0
  746. package/esm2015/app/plugins/core3d/items/custom-wall-item.js +11 -0
  747. package/esm2015/app/plugins/core3d/items/factory.js +130 -0
  748. package/esm2015/app/plugins/core3d/items/floor-item.js +29 -0
  749. package/esm2015/app/plugins/core3d/items/floor-pin.js +31 -0
  750. package/esm2015/app/plugins/core3d/items/floor-plane-item.js +95 -0
  751. package/esm2015/app/plugins/core3d/items/furniture.js +2 -0
  752. package/esm2015/app/plugins/core3d/items/in-wall-floor-item.js +14 -0
  753. package/esm2015/app/plugins/core3d/items/item-group.js +160 -0
  754. package/esm2015/app/plugins/core3d/items/item-type.js +23 -0
  755. package/esm2015/app/plugins/core3d/items/item.js +388 -0
  756. package/esm2015/app/plugins/core3d/items/metadata.js +2 -0
  757. package/esm2015/app/plugins/core3d/items/on-floor-item.js +10 -0
  758. package/esm2015/app/plugins/core3d/items/pin.js +2 -0
  759. package/esm2015/app/plugins/core3d/items/three-mesh.js +17 -0
  760. package/esm2015/app/plugins/core3d/items/wall-floor-item.js +9 -0
  761. package/esm2015/app/plugins/core3d/items/wall-objects.js +2381 -0
  762. package/esm2015/app/plugins/core3d/items/wall-pin.js +25 -0
  763. package/esm2015/app/plugins/core3d/model/ar-parameters.js +12 -0
  764. package/esm2015/app/plugins/core3d/model/box-skin-default.js +17 -0
  765. package/esm2015/app/plugins/core3d/model/collision-info.js +2 -0
  766. package/esm2015/app/plugins/core3d/model/custom-floor-group-result.js +13 -0
  767. package/esm2015/app/plugins/core3d/model/cylinder-skin-default.js +14 -0
  768. package/esm2015/app/plugins/core3d/model/dragged-status.js +51 -0
  769. package/esm2015/app/plugins/core3d/model/face.js +18 -0
  770. package/esm2015/app/plugins/core3d/model/geometry.js +52 -0
  771. package/esm2015/app/plugins/core3d/model/scene-event.enum.js +12 -0
  772. package/esm2015/app/plugins/core3d/model/skin.js +2 -0
  773. package/esm2015/app/plugins/core3d/model/threed-model.js +49 -0
  774. package/esm2015/app/plugins/core3d/service/ar.service.js +844 -0
  775. package/esm2015/app/plugins/core3d/service/camera.service.js +340 -0
  776. package/esm2015/app/plugins/core3d/service/ceiling.service.js +104 -0
  777. package/esm2015/app/plugins/core3d/service/controls.js +763 -0
  778. package/esm2015/app/plugins/core3d/service/drag-and-drop.service.js +369 -0
  779. package/esm2015/app/plugins/core3d/service/error-glow.service.js +131 -0
  780. package/esm2015/app/plugins/core3d/service/floor.service.js +229 -0
  781. package/esm2015/app/plugins/core3d/service/font.service.js +27 -0
  782. package/esm2015/app/plugins/core3d/service/hud.service.js +404 -0
  783. package/esm2015/app/plugins/core3d/service/intersection.service.js +55 -0
  784. package/esm2015/app/plugins/core3d/service/item-group.service.js +117 -0
  785. package/esm2015/app/plugins/core3d/service/item.service.js +205 -0
  786. package/esm2015/app/plugins/core3d/service/light-presets.service.js +296 -0
  787. package/esm2015/app/plugins/core3d/service/lights.service.js +190 -0
  788. package/esm2015/app/plugins/core3d/service/message-board.service.js +60 -0
  789. package/esm2015/app/plugins/core3d/service/models.service.js +146 -0
  790. package/esm2015/app/plugins/core3d/service/outline.service.js +150 -0
  791. package/esm2015/app/plugins/core3d/service/rotation.service.js +183 -0
  792. package/esm2015/app/plugins/core3d/service/scene-event.service.js +1000 -0
  793. package/esm2015/app/plugins/core3d/service/scene-options.service.js +24 -0
  794. package/esm2015/app/plugins/core3d/service/scene.service.js +351 -0
  795. package/esm2015/app/plugins/core3d/service/vr.service.js +198 -0
  796. package/esm2015/app/plugins/core3d/service/wall-measurements.service.js +79 -0
  797. package/esm2015/app/plugins/core3d/service/xr.service.js +397 -0
  798. package/esm2015/app/plugins/core3d/textures/DepthDataTexture.js +17 -0
  799. package/esm2015/app/plugins/core3d/walkthrough-camera-controls/walkthrough-camera-controls.component.js +54 -0
  800. package/esm2015/app/plugins/furniture-manager/furniture-library/furniture-library.component.js +92 -0
  801. package/esm2015/app/plugins/furniture-manager/furniture-manager/furniture-manager.component.js +458 -0
  802. package/esm2015/app/plugins/furniture-manager/furniture-manager.module.js +100 -0
  803. package/esm2015/app/plugins/help/help/help.component.js +71 -0
  804. package/esm2015/app/plugins/help/help-dialog/help-dialog.component.js +83 -0
  805. package/esm2015/app/plugins/help/help.module.js +35 -0
  806. package/esm2015/app/plugins/lite-selector/lite-selector/component/animation/animation.component.js +36 -0
  807. package/esm2015/app/plugins/lite-selector/lite-selector/component/answer-card/answer-card.component.js +187 -0
  808. package/esm2015/app/plugins/lite-selector/lite-selector/component/answers-slideout/answers-slideout.component.js +417 -0
  809. package/esm2015/app/plugins/lite-selector/lite-selector/component/color-filter/color-filter.component.js +44 -0
  810. package/esm2015/app/plugins/lite-selector/lite-selector/component/customizer/customizer.component.js +82 -0
  811. package/esm2015/app/plugins/lite-selector/lite-selector/component/image-zoom/image-zoom.component.js +27 -0
  812. package/esm2015/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary-line.component.js +148 -0
  813. package/esm2015/app/plugins/lite-selector/lite-selector/component/selections-summary/selections-summary.component.js +167 -0
  814. package/esm2015/app/plugins/lite-selector/lite-selector/component/tag-filter/tag-filter.component.js +25 -0
  815. package/esm2015/app/plugins/lite-selector/lite-selector/lite-selector.component.js +150 -0
  816. package/esm2015/app/plugins/lite-selector/lite-selector/service/customizer.service.js +222 -0
  817. package/esm2015/app/plugins/lite-selector/lite-selector.module.js +108 -0
  818. package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +470 -0
  819. package/esm2015/app/plugins/model-uploader/model-uploader/model-uploader.component.js +132 -0
  820. package/esm2015/app/plugins/model-uploader/model-uploader.module.js +60 -0
  821. package/esm2015/app/plugins/plugin-interface.js +2 -0
  822. package/esm2015/app/plugins/plugins.module.js +80 -0
  823. package/esm2015/app/plugins/presets/presets/presets.component.js +72 -0
  824. package/esm2015/app/plugins/presets/presets.module.js +33 -0
  825. package/esm2015/app/plugins/product-catalog/own-collection-catalog/product-own-collection.component.js +57 -0
  826. package/esm2015/app/plugins/product-catalog/own-collection-catalog/product-own-collection.module.js +34 -0
  827. package/esm2015/app/plugins/product-catalog/product-catalog/product-catalog.component.js +428 -0
  828. package/esm2015/app/plugins/product-catalog/product-catalog.module.js +61 -0
  829. package/esm2015/app/plugins/render/enum/connection-status.js +8 -0
  830. package/esm2015/app/plugins/render/enum/render-modes.js +7 -0
  831. package/esm2015/app/plugins/render/enum/render-status.js +9 -0
  832. package/esm2015/app/plugins/render/model/camera-position.js +6 -0
  833. package/esm2015/app/plugins/render/model/image-size.js +3 -0
  834. package/esm2015/app/plugins/render/model/lightning.js +3 -0
  835. package/esm2015/app/plugins/render/model/render-data.js +6 -0
  836. package/esm2015/app/plugins/render/model/render-environment.js +3 -0
  837. package/esm2015/app/plugins/render/model/render-parameters.js +15 -0
  838. package/esm2015/app/plugins/render/model/render-queue-item.js +11 -0
  839. package/esm2015/app/plugins/render/model/render-settings.js +12 -0
  840. package/esm2015/app/plugins/render/model/render.js +10 -0
  841. package/esm2015/app/plugins/render/render-controls/render-controls.component.js +89 -0
  842. package/esm2015/app/plugins/render/render-dialog/render-dialog.component.js +318 -0
  843. package/esm2015/app/plugins/render/render.module.js +85 -0
  844. package/esm2015/app/plugins/render/service/new-render.service.js +302 -0
  845. package/esm2015/app/plugins/render/service/render.service.js +650 -0
  846. package/esm2015/app/plugins/room-planner/components/appearance-section/appearance-section.component.js +190 -0
  847. package/esm2015/app/plugins/room-planner/components/color-picker/color-picker.component.js +32 -0
  848. package/esm2015/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.js +219 -0
  849. package/esm2015/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.js +257 -0
  850. package/esm2015/app/plugins/room-planner/components/dimension-input/dimension-input.component.js +66 -0
  851. package/esm2015/app/plugins/room-planner/components/edit-apply/edit-apply.component.js +57 -0
  852. package/esm2015/app/plugins/room-planner/components/edit-parameter/edit-parameter.component.js +79 -0
  853. package/esm2015/app/plugins/room-planner/components/file-drop/file-drop.component.js +107 -0
  854. package/esm2015/app/plugins/room-planner/components/floorplanner/const/defaults.js +57 -0
  855. package/esm2015/app/plugins/room-planner/components/floorplanner/floorplanner-mode.js +11 -0
  856. package/esm2015/app/plugins/room-planner/components/floorplanner/floorplanner.component.js +1303 -0
  857. package/esm2015/app/plugins/room-planner/components/floorplanner/service/floorplan.service.js +536 -0
  858. package/esm2015/app/plugins/room-planner/components/floorplanner/service/room.service.js +330 -0
  859. package/esm2015/app/plugins/room-planner/components/floorplanner/snap-indicator-mode.js +7 -0
  860. package/esm2015/app/plugins/room-planner/components/floorplanner/utils/context.utils.js +53 -0
  861. package/esm2015/app/plugins/room-planner/components/object-library/object-library.component.js +63 -0
  862. package/esm2015/app/plugins/room-planner/components/ral-color-picker/ral-color-picker.component.js +128 -0
  863. package/esm2015/app/plugins/room-planner/components/rgb-color-picker/rgb-color-picker.component.js +37 -0
  864. package/esm2015/app/plugins/room-planner/components/selected-floor/selected-floor.component.js +36 -0
  865. package/esm2015/app/plugins/room-planner/components/selected-object/selected-object.component.js +203 -0
  866. package/esm2015/app/plugins/room-planner/components/selected-threed-object/selected-threed-object.component.js +139 -0
  867. package/esm2015/app/plugins/room-planner/components/selected-wall/selected-wall.component.js +102 -0
  868. package/esm2015/app/plugins/room-planner/components/settings/settings-options.component.js +152 -0
  869. package/esm2015/app/plugins/room-planner/components/settings/settings.component.js +188 -0
  870. package/esm2015/app/plugins/room-planner/components/texture-editor/texture-editor.component.js +617 -0
  871. package/esm2015/app/plugins/room-planner/components/texture-picker/texture-picker.component.js +74 -0
  872. package/esm2015/app/plugins/room-planner/components/wall-length-input/wall-length-input.component.js +48 -0
  873. package/esm2015/app/plugins/room-planner/const/key.js +12 -0
  874. package/esm2015/app/plugins/room-planner/room-planner/room-planner.component.js +1681 -0
  875. package/esm2015/app/plugins/room-planner/room-planner.module.js +233 -0
  876. package/esm2015/app/plugins/threed-in-photo/components/threed-in-photo-scene/threed-in-photo-scene.component.js +43 -0
  877. package/esm2015/app/plugins/threed-in-photo/components/upload-image/upload-image.component.js +61 -0
  878. package/esm2015/app/plugins/threed-in-photo/components/view-control/view-control.component.js +164 -0
  879. package/esm2015/app/plugins/threed-in-photo/models/model-output.js +18 -0
  880. package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-build.service.js +243 -0
  881. package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-connection.service.js +50 -0
  882. package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-control.service.js +33 -0
  883. package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-event-listeners.service.js +36 -0
  884. package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-event.service.js +19 -0
  885. package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-initializer.service.js +53 -0
  886. package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-render.service.js +61 -0
  887. package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-scene.service.js +37 -0
  888. package/esm2015/app/plugins/threed-in-photo/services/threed-in-photo-view.service.js +21 -0
  889. package/esm2015/app/plugins/threed-in-photo/threed-in-photo.module.js +67 -0
  890. package/esm2015/app/plugins/threed-in-photo/utils/utils.js +21 -0
  891. package/esm2015/app/plugins/threedselector/element-buttons/element-buttons.component.js +95 -0
  892. package/esm2015/app/plugins/threedselector/element-slider/element-slider.component.js +28 -0
  893. package/esm2015/app/plugins/threedselector/element-toolbar/element-toolbar.component.js +80 -0
  894. package/esm2015/app/plugins/threedselector/threedselector/model/furniture-connected-part-integration.js +3 -0
  895. package/esm2015/app/plugins/threedselector/threedselector/model/furniture-integration.js +13 -0
  896. package/esm2015/app/plugins/threedselector/threedselector/model/furniture-part-integration.js +6 -0
  897. package/esm2015/app/plugins/threedselector/threedselector/model/furniture-part-variation.js +3 -0
  898. package/esm2015/app/plugins/threedselector/threedselector/model/material.js +11 -0
  899. package/esm2015/app/plugins/threedselector/threedselector/model/variation-settings.js +11 -0
  900. package/esm2015/app/plugins/threedselector/threedselector/model/variation.js +3 -0
  901. package/esm2015/app/plugins/threedselector/threedselector/service/animation.service.js +65 -0
  902. package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +1343 -0
  903. package/esm2015/app/plugins/threedselector/threedselector/service/dimensions.service.js +183 -0
  904. package/esm2015/app/plugins/threedselector/threedselector/service/element.service.js +373 -0
  905. package/esm2015/app/plugins/threedselector/threedselector/service/light-creation.service.js +35 -0
  906. package/esm2015/app/plugins/threedselector/threedselector/service/load-furniture.service.js +291 -0
  907. package/esm2015/app/plugins/threedselector/threedselector/service/resize.service.js +70 -0
  908. package/esm2015/app/plugins/threedselector/threedselector/service/third-party-model.service.js +156 -0
  909. package/esm2015/app/plugins/threedselector/threedselector/service/threedselector.service.js +101 -0
  910. package/esm2015/app/plugins/threedselector/threedselector/service/variation-cache.service.js +133 -0
  911. package/esm2015/app/plugins/threedselector/threedselector/service/variation.service.js +436 -0
  912. package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +1116 -0
  913. package/esm2015/app/plugins/threedselector/threedselector/utils/asset.utils.js +128 -0
  914. package/esm2015/app/plugins/threedselector/threedselector/utils/image.utils.js +33 -0
  915. package/esm2015/app/plugins/threedselector/threedselector/utils/json-parser.utils.js +188 -0
  916. package/esm2015/app/plugins/threedselector/threedselector/utils/scene-3d.utils.js +159 -0
  917. package/esm2015/app/plugins/threedselector/threedselector.module.js +129 -0
  918. package/esm2015/app/plugins/toolbar/download-dialog/download-dialog.component.js +33 -0
  919. package/esm2015/app/plugins/toolbar/draw-dialog/draw-dialog.component.js +279 -0
  920. package/esm2015/app/plugins/toolbar/edit-preset-dialog/edit-preset-dialog.component.js +22 -0
  921. package/esm2015/app/plugins/toolbar/landing-screen-modal/landing-screen-modal.component.js +123 -0
  922. package/esm2015/app/plugins/toolbar/load-from-cloud-dialog/load-from-cloud-dialog.component.js +140 -0
  923. package/esm2015/app/plugins/toolbar/open-dialog/open-dialog.component.js +83 -0
  924. package/esm2015/app/plugins/toolbar/pdf-crop-dialog/pdf-crop-dialog.component.js +92 -0
  925. package/esm2015/app/plugins/toolbar/save-dialog/save-dialog.component.js +146 -0
  926. package/esm2015/app/plugins/toolbar/saved-dialog/saved-dialog.component.js +66 -0
  927. package/esm2015/app/plugins/toolbar/toolbar/limited-mode-message-component/limited-mode-message.component.js +26 -0
  928. package/esm2015/app/plugins/toolbar/toolbar/toolbar.component.js +676 -0
  929. package/esm2015/app/plugins/toolbar/toolbar.module.js +177 -0
  930. package/esm2015/app/service/dynamic-script.service.js +56 -0
  931. package/esm2015/app/service/google-tag-manager.service.js +89 -0
  932. package/esm2015/app/service/local-storage.service.js +93 -0
  933. package/esm2015/app/service/service-locator.service.js +4 -0
  934. package/esm2015/app/shared/base64-images.js +6 -0
  935. package/esm2015/app/shared/button-elevation/button-elevation.component.js +279 -0
  936. package/esm2015/app/shared/button-elevation/button-elevation.module.js +60 -0
  937. package/esm2015/app/shared/camera-settings-dialog/camera-settings-dialog.component.js +197 -0
  938. package/esm2015/app/shared/camera-settings-dialog/camera-settings-dialog.module.js +58 -0
  939. package/esm2015/app/shared/category-library/category-library.component.js +27 -0
  940. package/esm2015/app/shared/category-library/category-library.module.js +39 -0
  941. package/esm2015/app/shared/context-menu/context-menu.component.js +35 -0
  942. package/esm2015/app/shared/context-menu/context-menu.module.js +49 -0
  943. package/esm2015/app/shared/context-menu/item-context-menu/item-context-menu.component.js +93 -0
  944. package/esm2015/app/shared/dialog/dialog.component.js +119 -0
  945. package/esm2015/app/shared/dialog/dialog.module.js +45 -0
  946. package/esm2015/app/shared/dialog/enum/dialog-type.enum.js +8 -0
  947. package/esm2015/app/shared/dialog/interface/dialog-config.interface.js +2 -0
  948. package/esm2015/app/shared/dialog/service/dialog.service.js +21 -0
  949. package/esm2015/app/shared/error-dialog/error-dialog.component.js +24 -0
  950. package/esm2015/app/shared/error-dialog/error-dialog.module.js +30 -0
  951. package/esm2015/app/shared/export-dialog/export-dialog.component.js +68 -0
  952. package/esm2015/app/shared/export-dialog/export-dialog.module.js +35 -0
  953. package/esm2015/app/shared/info-dialog/info-dialog.component.js +54 -0
  954. package/esm2015/app/shared/info-dialog/info-dialog.module.js +37 -0
  955. package/esm2015/app/shared/loader/hd-loader.component.js +24 -0
  956. package/esm2015/app/shared/loader/hd-loader.module.js +33 -0
  957. package/esm2015/app/shared/loading-overlay/dialog/loading-overlay-dialog.component.js +26 -0
  958. package/esm2015/app/shared/loading-overlay/loading-overlay.component.js +55 -0
  959. package/esm2015/app/shared/loading-overlay/loading-overlay.module.js +42 -0
  960. package/esm2015/app/shared/model-dialog/model-dialog-furniture-list.component.js +325 -0
  961. package/esm2015/app/shared/model-dialog/model-dialog.component.js +104 -0
  962. package/esm2015/app/shared/model-dialog/model-dialog.module.js +64 -0
  963. package/esm2015/app/shared/progress-bar/progress-bar.component.js +39 -0
  964. package/esm2015/app/shared/progress-bar/progress-bar.module.js +33 -0
  965. package/esm2015/app/shared/register-dialog/register-dialog.component.js +112 -0
  966. package/esm2015/app/shared/screen-size-analysis/device-size-type.js +7 -0
  967. package/esm2015/app/shared/screen-size-analysis/navigator-type.enum.js +6 -0
  968. package/esm2015/app/shared/screen-size-analysis/screen-size-analysis.service.js +93 -0
  969. package/esm2015/app/shared/screen-size-analysis/screen-size-config.js +7 -0
  970. package/esm2015/app/shared/screen-size-analysis/screen-size-info.js +2 -0
  971. package/esm2015/app/shared/slider-input/slider-input.component.js +35 -0
  972. package/esm2015/app/shared/slider-input/slider-input.module.js +46 -0
  973. package/esm2015/app/shared/toolbar-icon/toolbar-icon.component.js +95 -0
  974. package/esm2015/app/shared/toolbar-icon/toolbar-icon.module.js +38 -0
  975. package/esm2015/app/shared/zoom-controls/zoom-controls.component.js +47 -0
  976. package/esm2015/app/shared/zoom-controls/zoom-controls.module.js +34 -0
  977. package/esm2015/colijnit-homedecorator.js +5 -0
  978. package/esm2015/environments/environment.js +17 -0
  979. package/esm2015/public_api.js +4 -0
  980. package/fesm2015/colijnit-homedecorator.js +45086 -0
  981. package/fesm2015/colijnit-homedecorator.js.map +1 -0
  982. package/homedecorator-globals.scss +361 -0
  983. package/package.json +48 -0
  984. package/palette.scss +32 -0
  985. package/public_api.d.ts +3 -0
  986. package/styles.scss +377 -0
@@ -0,0 +1,1000 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { Injectable } from '@angular/core';
11
+ import { Item } from '../items/item';
12
+ import { Vector2, Vector3 } from 'three';
13
+ import { SceneEventState } from '../model/scene-event.enum';
14
+ import { Subject } from 'rxjs';
15
+ import { fromEvent } from 'rxjs/internal/observable/fromEvent';
16
+ import { debounceTime, delay, filter, takeUntil } from 'rxjs/operators';
17
+ import { of } from 'rxjs/internal/observable/of';
18
+ import { MessageType } from '../../../core/enum/message-type.enum';
19
+ import { ViewMode } from '../../../core/enum/view-mode.enum';
20
+ import { RelativePositionUtils } from '../../../core/utils/relative-position.utils';
21
+ import { CustomWallFloorItem } from '../items/custom-wall-floor-item';
22
+ import { ItemGroup } from '../items/item-group';
23
+ import { isFloorDecoration, isFloorType, isFurnitureType, isInWallType, isOnFloorType, isWallFloorType, isWallType } from '../items/factory';
24
+ import { InWallItem, WallItem } from '../items/wall-objects';
25
+ import * as i0 from "@angular/core";
26
+ import * as i1 from "./hud.service";
27
+ import * as i2 from "../../../core/service/message-bus.service";
28
+ import * as i3 from "./scene.service";
29
+ import * as i4 from "./drag-and-drop.service";
30
+ import * as i5 from "./rotation.service";
31
+ import * as i6 from "./camera.service";
32
+ import * as i7 from "../../room-planner/components/floorplanner/service/room.service";
33
+ import * as i8 from "./floor.service";
34
+ import * as i9 from "./intersection.service";
35
+ import * as i10 from "../../../core/service/view-mode.service";
36
+ import * as i11 from "./item-group.service";
37
+ import * as i12 from "./item.service";
38
+ import * as i13 from "../../../core/service/homedecorator-app.service";
39
+ import * as i14 from "../../../core/service/homedecorator-app-event.service";
40
+ export class SceneEventService {
41
+ constructor(_hudService, _messageBusService, _sceneService, _dragAndDropService, _rotationService, _cameraService, _roomService, _floorService, _intersectionService, _viewModeService, _itemGroupService, _itemService, _appService, _eventService) {
42
+ this._hudService = _hudService;
43
+ this._messageBusService = _messageBusService;
44
+ this._sceneService = _sceneService;
45
+ this._dragAndDropService = _dragAndDropService;
46
+ this._rotationService = _rotationService;
47
+ this._cameraService = _cameraService;
48
+ this._roomService = _roomService;
49
+ this._floorService = _floorService;
50
+ this._intersectionService = _intersectionService;
51
+ this._viewModeService = _viewModeService;
52
+ this._itemGroupService = _itemGroupService;
53
+ this._itemService = _itemService;
54
+ this._appService = _appService;
55
+ this._eventService = _eventService;
56
+ this.intersectOffsetForWalls = 20;
57
+ this.longTouchDuration = 600;
58
+ this.rotateNoDrag = false;
59
+ this._mousePosition = new Vector2();
60
+ this._oldMousePosition = new Vector2();
61
+ this._rotationStartPoint = null;
62
+ this._defaultCursorStyle = 'pointer';
63
+ this._explorePressed = false;
64
+ this._inDragOver = false;
65
+ this._mouseDown = false;
66
+ this._mouseMoved = false; // has mouse moved since down click
67
+ this._rotateMouseOver = false;
68
+ this._groupingMode = false;
69
+ this._state = SceneEventState.UNSELECTED;
70
+ this._subs = [];
71
+ this._debouncedSaveState = new Subject();
72
+ }
73
+ ngOnDestroy() {
74
+ this._subs.forEach(s => s.unsubscribe());
75
+ this._element = undefined;
76
+ }
77
+ init(element) {
78
+ this._element = element;
79
+ this._controls = this._cameraService.controls;
80
+ this._camera = this._cameraService.camera;
81
+ this._touchStart = fromEvent(element, 'touchstart');
82
+ this._touchEnd = fromEvent(element, 'touchend');
83
+ this._touchCancel = fromEvent(element, 'touchcancel');
84
+ this._touchMove = fromEvent(element, 'touchmove');
85
+ fromEvent(element, 'mousedown')
86
+ .pipe(filter((event) => event.button === 0))
87
+ .subscribe(event => this._leftMouseDownEvent(event));
88
+ fromEvent(element, 'mouseup').subscribe((event) => this._mouseUpEvent(event));
89
+ fromEvent(element, 'mousemove').subscribe((event) => this._mouseMoveEvent(event));
90
+ this._touchStart.subscribe((event) => this._touchStartEvent(event));
91
+ this._touchEnd.subscribe((event) => this._touchEndEvent(event));
92
+ this._touchCancel.subscribe((event) => this._touchEndEvent(event));
93
+ this._touchMove.subscribe((event) => this._touchMoveEvent(event));
94
+ fromEvent(window, 'keydown').subscribe((event) => this._keyDownEvent(event));
95
+ fromEvent(element, 'dragenter').subscribe((event) => this._dragEnterEvent(event));
96
+ fromEvent(element, 'dragexit').subscribe((event) => this._dragExitEvent(event));
97
+ fromEvent(element, 'dragover').subscribe((event) => this._dragOverEvent(event));
98
+ fromEvent(element, 'drop').subscribe(event => this._onDrop(event));
99
+ this._subs.push(this._messageBusService.subscribe(MessageType.SetDrag, (data) => {
100
+ if (data instanceof Item) {
101
+ this._dragAndDropService.draggedData = {
102
+ name: data.name,
103
+ type: data.metadata.itemType
104
+ };
105
+ this._dragAndDropService.draggedItem = data;
106
+ }
107
+ else {
108
+ this._dragAndDropService.draggedData = data;
109
+ }
110
+ }), this._messageBusService.subscribe(MessageType.StartDrag, ({ x, y, z }) => this.startDragging(x, y, z)), this._messageBusService.subscribe(MessageType.ExitDrag, () => this._dragExitEvent(event)), this._messageBusService.subscribe(MessageType.PlaceOnTouch, () => this._initPlaceOnTouchRequest()), this._debouncedSaveState.pipe(debounceTime(800)).subscribe((action) => {
111
+ this._messageBusService.emit(MessageType.SaveState, { action: `3D ${action}` });
112
+ }), this._debouncedSaveState.pipe(debounceTime(200)).subscribe(() => {
113
+ this._hudService.updateLabelMeasurements();
114
+ }), this._viewModeService.viewModeChanged.subscribe(mode => this.setExploreMode(mode === ViewMode.WalkThrough)), this._itemGroupService.objectAdded.subscribe((object) => this.setSelectedObject(object)), this._itemGroupService.grouped.subscribe((object) => this.setSelectedObject(object)), this._itemGroupService.ungrouped.subscribe(() => this.setSelectedObject(null)), this._messageBusService.subscribe(MessageType.ItemRemoved, () => this.setSelectedObject(null)), this._messageBusService.subscribe(MessageType.StartGroupObject, () => this._setGroupingMode(true)));
115
+ }
116
+ setExploreMode(on = true) {
117
+ if (on) {
118
+ this._switchState(SceneEventState.EXPLORE);
119
+ }
120
+ else {
121
+ this._switchState(SceneEventState.UNSELECTED);
122
+ }
123
+ }
124
+ setSelectedObject(object, mesh) {
125
+ if (this._state === SceneEventState.UNSELECTED && object) {
126
+ this._switchState(SceneEventState.SELECTED);
127
+ }
128
+ if (this._selectedObject != null && this._selectedObject !== object) {
129
+ this._selectedObject.setUnselected();
130
+ }
131
+ if (object) {
132
+ if (object instanceof ItemGroup) {
133
+ this._setSelectObject(object);
134
+ this._itemGroupService.selectedGroup = object;
135
+ }
136
+ else if (object.parent instanceof ItemGroup) {
137
+ this._setSelectObject(object.parent);
138
+ this._itemGroupService.selectedGroup = object.parent;
139
+ }
140
+ else {
141
+ this._setSelectObject(object, mesh);
142
+ }
143
+ }
144
+ else {
145
+ if (this._selectedObject) {
146
+ this._selectedObject.setUnselected();
147
+ this._messageBusService.emit(MessageType.ItemUnselected, this._selectedObject);
148
+ this._selectedObject = null;
149
+ }
150
+ this._prevSelectedObject = null;
151
+ }
152
+ this._markSceneToUpdate();
153
+ }
154
+ startDragging(x, y, z) {
155
+ const draggedData = this._getDraggedData();
156
+ if (!this._dragAndDropService.draggedStatus.allowedNew || !draggedData) {
157
+ return;
158
+ }
159
+ this._switchState(SceneEventState.DND);
160
+ this._dragAndDropService.draggedStatus.dragEnter();
161
+ const vec3 = z ? new Vector3(x, y, z) : this.intersectingVec3(new Vector2(x, y));
162
+ if (this._dragAndDropService.draggedItem) {
163
+ this._dragAndDropService.draggedStatus.objectLoaded();
164
+ this._dragAndDropService.updateDraggedPosition(vec3);
165
+ }
166
+ else if (isFurnitureType(draggedData.type) || isWallType(draggedData.type)) {
167
+ this._dragAndDropService.dragModel(vec3, this._floorIntersection(this._sceneService.positionInSceneToScreen(vec3)));
168
+ }
169
+ else if (isFloorDecoration(draggedData.type)) {
170
+ this._dragAndDropService.dragFloorDecoration(this._floorIntersection(this._sceneService.positionInSceneToScreen(vec3)));
171
+ }
172
+ }
173
+ intersectingVec3(vec2, intersection) {
174
+ if (!intersection) {
175
+ const gIntersections = this._groundIntersections(vec2);
176
+ return gIntersections && gIntersections[0] && gIntersections[0].point;
177
+ }
178
+ else {
179
+ return intersection.point;
180
+ }
181
+ }
182
+ _isRotating() {
183
+ return this._state === SceneEventState.ROTATING && (!this._appService.sku || this._viewModeService.viewMode === ViewMode.InPhotoView);
184
+ }
185
+ _keyDownEvent(event) {
186
+ if (event.key === 'Escape') {
187
+ this._cancelDragDrop();
188
+ }
189
+ }
190
+ _dragEnterEvent(event) {
191
+ event.preventDefault();
192
+ const mousePos = RelativePositionUtils.GetClientMousePosition(event);
193
+ this.startDragging(mousePos.x, mousePos.y);
194
+ }
195
+ _dragExitEvent(event) {
196
+ if (event) {
197
+ event.preventDefault();
198
+ }
199
+ const draggedData = this._getDraggedData();
200
+ if (draggedData) {
201
+ this._dragAndDropService.finishDragging();
202
+ this._switchState(SceneEventState.UNSELECTED);
203
+ }
204
+ }
205
+ _dragOverEvent(event) {
206
+ event.preventDefault();
207
+ if (this._state !== SceneEventState.DND || this._inDragOver) {
208
+ return;
209
+ }
210
+ this._inDragOver = true;
211
+ this._dragAndDropService.draggedStatus.dragOver();
212
+ const canvas = event.currentTarget;
213
+ const mousePos = RelativePositionUtils.GetClientMousePosition(event);
214
+ this._mousePosition.set(mousePos.x - (canvas ? canvas.offsetLeft : 0), mousePos.y - (canvas ? canvas.offsetTop : 0));
215
+ const draggedData = this._dragAndDropService.draggedData;
216
+ let intersection = this._wallIntersection(this._mousePosition);
217
+ const intersectedFloor = this._floorIntersection(this._mousePosition);
218
+ this._dragAndDropService.intersectedWall = intersection;
219
+ this._dragAndDropService.intersectedFloor = intersectedFloor;
220
+ this._intersectedWall = undefined;
221
+ this._intersectedFloor = undefined;
222
+ if (isWallType(draggedData.type) || (isWallFloorType(draggedData.type) && intersection)) {
223
+ if (intersection) {
224
+ this._intersectedWall = intersection;
225
+ }
226
+ if (intersection && !isFurnitureType(draggedData.type)) {
227
+ this._acceptDrop(event);
228
+ }
229
+ }
230
+ else if (isFloorType(draggedData.type) || isFloorDecoration(draggedData.type) || (isWallFloorType(draggedData.type) && intersectedFloor)) {
231
+ this._intersectedFloor = intersection = this._floorIntersection(this._mousePosition);
232
+ }
233
+ else {
234
+ if (event.dataTransfer) {
235
+ event.dataTransfer.dropEffect = 'move';
236
+ }
237
+ }
238
+ const intersectedPoint = this.intersectingVec3(this._mousePosition, intersection);
239
+ if (intersectedPoint) {
240
+ this._dragAndDropService.updateDraggedPosition(intersectedPoint);
241
+ this._acceptDrop(event);
242
+ this._markSceneToUpdate();
243
+ }
244
+ this._inDragOver = false;
245
+ }
246
+ _onDrop(event) {
247
+ return __awaiter(this, void 0, void 0, function* () {
248
+ event.preventDefault();
249
+ if (this._state !== SceneEventState.DND) {
250
+ return;
251
+ }
252
+ const canvas = event.currentTarget;
253
+ const mousePos = RelativePositionUtils.GetClientMousePosition(event);
254
+ this._mousePosition.set(mousePos.x - (canvas ? canvas.offsetLeft : 0), mousePos.y - (canvas ? canvas.offsetTop : 0));
255
+ const draggedData = this._dragAndDropService.draggedData;
256
+ let position = null;
257
+ let intersection = null;
258
+ if (isWallType(draggedData.type) || (isWallFloorType(draggedData.type) && this._intersectedWall)) {
259
+ position = this._intersectedWall && this._intersectedWall.point;
260
+ intersection = this._intersectedWall;
261
+ }
262
+ else if (isFloorType(draggedData.type) || isFloorDecoration(draggedData.type) || (isWallFloorType(draggedData.type) && this._intersectedFloor)) {
263
+ position = this._intersectedFloor && this._intersectedFloor.point;
264
+ intersection = this._intersectedFloor;
265
+ }
266
+ if (position) {
267
+ const intersectedPoint = this.intersectingVec3(this._mousePosition, intersection);
268
+ this._dragAndDropService.draggedPlaced(intersectedPoint, intersection);
269
+ this._messageBusService.emit(MessageType.SaveState, { action: 'item added' });
270
+ }
271
+ else {
272
+ this._cancelDragDrop();
273
+ }
274
+ if (!this._dragAndDropService.draggedStatus.isObjectLoaded) {
275
+ this._dragAndDropService.draggedStatus.markToCleanUp();
276
+ this._releaseState(draggedData);
277
+ }
278
+ else {
279
+ this._releaseState(draggedData);
280
+ this._dragAndDropService.finishDragging();
281
+ }
282
+ });
283
+ }
284
+ _cancelDragDrop() {
285
+ this._dragAndDropService.draggedStatus.dragCanceled();
286
+ this._dragAndDropService.finishDragging();
287
+ this._switchState(SceneEventState.SELECTED);
288
+ this._messageBusService.emit(MessageType.FinishedIOneFurnitureBuild);
289
+ }
290
+ _mouseUpEvent(event) {
291
+ return __awaiter(this, void 0, void 0, function* () {
292
+ this._mouseDown = false;
293
+ if (this._state === SceneEventState.DND) {
294
+ return this._onDrop(event);
295
+ }
296
+ switch (this._state) {
297
+ case SceneEventState.DRAGGING:
298
+ case SceneEventState.DRAGGINGCONNECTOR:
299
+ this._switchState(SceneEventState.SELECTED);
300
+ if (this._selectedObject) {
301
+ this._dragAndDropService.clickReleased();
302
+ if (this._selectedObject instanceof Item) {
303
+ this._selectedObject.endDrag();
304
+ }
305
+ }
306
+ break;
307
+ case SceneEventState.ROTATING:
308
+ if (this._selectedObject) {
309
+ this._dragAndDropService.clickReleased();
310
+ this._messageBusService.emit(MessageType.SaveState, { action: 'item rotated' });
311
+ }
312
+ this._switchState(SceneEventState.SELECTED);
313
+ break;
314
+ case SceneEventState.UNSELECTED:
315
+ if (!this._selectedObject && !this._mouseMoved) {
316
+ this._checkWallsAndFloors(event);
317
+ }
318
+ break;
319
+ case SceneEventState.SELECTED:
320
+ if (!this._selectedObject && !this._mouseMoved) {
321
+ this._checkWallsAndFloors(event);
322
+ }
323
+ if (this._intersectedObject == null && !this._mouseMoved) {
324
+ this._switchState(SceneEventState.UNSELECTED);
325
+ }
326
+ break;
327
+ case SceneEventState.EXPLORE:
328
+ yield this._navigateExplore();
329
+ break;
330
+ }
331
+ });
332
+ }
333
+ _navigateExplore() {
334
+ return __awaiter(this, void 0, void 0, function* () {
335
+ this._overrideDefaultCursorStyle('pointer');
336
+ const point = this._pointOnFloor(this._mousePosition);
337
+ if (point) {
338
+ const distance = this._camera.position.distanceTo(point);
339
+ this._hudService.exploreFloorHover(this._mousePosition, point, distance);
340
+ if (!this._mouseMoved) {
341
+ yield this._hudService.confirmExplore();
342
+ yield this._cameraService.controls.animateMoveTo(point);
343
+ this._updateExplorePoint();
344
+ }
345
+ }
346
+ });
347
+ }
348
+ _initPlaceOnTouchRequest() {
349
+ if (this._dragAndDropService.draggedStatus.allowedNew && this._getDraggedData()) {
350
+ this._switchState(SceneEventState.DND);
351
+ }
352
+ }
353
+ _touchEndEvent(event) {
354
+ return __awaiter(this, void 0, void 0, function* () {
355
+ if (this._isMouseEventAllowed(event)) {
356
+ this._mouseDown = false;
357
+ switch (this._state) {
358
+ case SceneEventState.SELECTED:
359
+ case SceneEventState.UNSELECTED:
360
+ if (!this._mouseMoved) {
361
+ this._updateIntersections();
362
+ if (this._intersectedObject) {
363
+ this._itemGroupService.resetObjectsToGroup();
364
+ this.setSelectedObject(this._intersectedObject, this._intersectedMesh);
365
+ this._addToItemGroup(this._intersectedObject);
366
+ }
367
+ }
368
+ break;
369
+ case SceneEventState.DRAGGING:
370
+ if (this._selectedObject) {
371
+ this._dragAndDropService.clickReleased();
372
+ }
373
+ this._switchState(SceneEventState.SELECTED);
374
+ break;
375
+ case SceneEventState.ROTATING:
376
+ this._switchState(SceneEventState.SELECTED);
377
+ if (this._selectedObject) {
378
+ this._dragAndDropService.clickReleased();
379
+ this._messageBusService.emit(MessageType.SaveState, { action: 'item rotated' });
380
+ }
381
+ break;
382
+ case SceneEventState.EXPLORE:
383
+ if (!this._mouseMoved) {
384
+ yield this._navigateExplore();
385
+ }
386
+ break;
387
+ }
388
+ }
389
+ });
390
+ }
391
+ _touchMoveEvent(event) {
392
+ if (this._state === SceneEventState.DND) {
393
+ return this._dragOverEvent.bind(this)(event);
394
+ }
395
+ if (this._isMouseEventAllowed(event)) {
396
+ this._setMousePositionFromTouchEvent(event);
397
+ this._mouseMoved = true;
398
+ if (!this._mouseDown) {
399
+ this._updateIntersections();
400
+ }
401
+ switch (this._state) {
402
+ case SceneEventState.UNSELECTED:
403
+ this._updateMouseover();
404
+ break;
405
+ case SceneEventState.SELECTED:
406
+ this._updateMouseover();
407
+ this._hudService.cameraRotation();
408
+ break;
409
+ case SceneEventState.DRAGGING:
410
+ case SceneEventState.ROTATING:
411
+ this._clickDragged();
412
+ this._markSceneToUpdate();
413
+ break;
414
+ }
415
+ }
416
+ }
417
+ _clearIntersectedObject() {
418
+ this._intersectedMesh = null;
419
+ this._intersectedObject = null;
420
+ }
421
+ _toggleRotationHudIntersection(on) {
422
+ if (this._hudService.isMouseOver() !== on) {
423
+ this._rotateMouseOver = on;
424
+ this._hudService.setMouseOver(on);
425
+ }
426
+ }
427
+ _updateIntersections() {
428
+ const intersects = this._getIntersections(this._mousePosition, this._itemService.getObjectPlanes(), { onlyVisible: true, includeFloors: false });
429
+ const wallIntersect = this._wallIntersection(this._mousePosition);
430
+ // object intersection is prioritized
431
+ if (intersects.length > 0 &&
432
+ ((wallIntersect && wallIntersect.distance + this.intersectOffsetForWalls > intersects[0].distance) || !wallIntersect)) {
433
+ this._toggleRotationHudIntersection(false);
434
+ this._setIntersectedObject(intersects[0].object);
435
+ }
436
+ else {
437
+ this._clearIntersectedObject();
438
+ const snapperArea = this._hudService.getRotationSnapperArea();
439
+ if (snapperArea === null) {
440
+ // check if intersects with configurable floor
441
+ const floorIntersects = this._getIntersections(this._mousePosition, this._itemService.getObjectPlanes(), { onlyVisible: true, includeFloor: true, onlyConfigurableFloors: true });
442
+ if (floorIntersects.length > 0) {
443
+ this._toggleRotationHudIntersection(false);
444
+ this._setIntersectedObject(floorIntersects[0].object);
445
+ }
446
+ else {
447
+ return;
448
+ }
449
+ }
450
+ const hudIntersects = this._getIntersections(this._mousePosition, [snapperArea], { recursive: true });
451
+ if (hudIntersects.length > 0) {
452
+ this._toggleRotationHudIntersection(true);
453
+ }
454
+ else {
455
+ this._toggleRotationHudIntersection(false);
456
+ }
457
+ }
458
+ }
459
+ // returns the first intersection object
460
+ _itemIntersection(vec2, item) {
461
+ let intersections = null;
462
+ if (!item.metadata) {
463
+ intersections = this._getIntersections(vec2, [item], { filterByNormals: true });
464
+ }
465
+ else if (isWallFloorType(item.metadata.itemType)) {
466
+ intersections = this._getIntersections(vec2, this._roomService.wallEdgePlanes(), { filterByNormals: true });
467
+ if (!intersections || intersections.length === 0) {
468
+ intersections = this._getIntersections(vec2, [this._floorService.groundPlane], {});
469
+ }
470
+ }
471
+ else if (isWallType(item.metadata.itemType)) {
472
+ intersections = this._getIntersections(vec2, this._roomService.wallEdgePlanes(), { filterByNormals: true });
473
+ }
474
+ else {
475
+ intersections = this._getIntersections(vec2, [this._floorService.groundPlane], {});
476
+ }
477
+ if (intersections && intersections.length > 0) {
478
+ return intersections[0];
479
+ }
480
+ else {
481
+ return null;
482
+ }
483
+ }
484
+ // filter by normals will only return objects facing the camera
485
+ _getIntersections(mousePos, objects, options) {
486
+ const mouseVector = this._mouseToVec3(mousePos);
487
+ return this._intersectionService.getIntersections(mouseVector, objects, options);
488
+ }
489
+ _setMousePositionFromTouchEvent(event) {
490
+ const touch = event.touches[0];
491
+ if (touch) {
492
+ const canvas = event.target;
493
+ this._mousePosition.set(touch.pageX - (canvas ? canvas.offsetLeft : 0), touch.pageY - (canvas ? canvas.offsetTop : 0));
494
+ }
495
+ }
496
+ _touchStartEvent(event) {
497
+ if (this._isMouseEventAllowed(event)) {
498
+ const longTouch = of(1)
499
+ .pipe(delay(this.longTouchDuration))
500
+ .pipe(takeUntil(this._touchStart))
501
+ .pipe(takeUntil(this._touchEnd))
502
+ .pipe(takeUntil(this._touchCancel));
503
+ longTouch.subscribe(() => {
504
+ this._updateIntersections();
505
+ if (this._intersectedObject && !this._mouseMoved) {
506
+ this._addToItemGroup(this._intersectedObject, this._prevSelectedObject);
507
+ }
508
+ });
509
+ this._mouseMoved = false;
510
+ this._mouseDown = true;
511
+ this._setMousePositionFromTouchEvent(event);
512
+ switch (this._state) {
513
+ case SceneEventState.SELECTED:
514
+ this._updateIntersections();
515
+ if (this._rotateMouseOver || this.rotateNoDrag) {
516
+ this._switchState(SceneEventState.ROTATING);
517
+ const itemIntersection = this._itemIntersection(this._mousePosition, this._selectedObject);
518
+ if (itemIntersection) {
519
+ this._rotationStartPoint = itemIntersection.point;
520
+ }
521
+ }
522
+ else if (this._intersectedObject) {
523
+ this._prevSelectedObject = this._selectedObject;
524
+ if (!this._intersectedObject.fixed) {
525
+ this._switchState(SceneEventState.DRAGGING);
526
+ }
527
+ }
528
+ break;
529
+ case SceneEventState.DND:
530
+ this._onDrop(event);
531
+ break;
532
+ }
533
+ }
534
+ }
535
+ _leftMouseDownEvent(event) {
536
+ if (this._isMouseEventAllowed(event)) {
537
+ if (event) {
538
+ event.preventDefault();
539
+ }
540
+ const canvas = event.currentTarget;
541
+ const mousePos = RelativePositionUtils.GetClientMousePosition(event);
542
+ this._oldMousePosition.set(mousePos.x - (canvas ? canvas.offsetLeft : 0), mousePos.y - (canvas ? canvas.offsetTop : 0));
543
+ this._mouseMoved = false;
544
+ this._mouseDown = true;
545
+ switch (this._state) {
546
+ case SceneEventState.SELECTED:
547
+ if (this._rotateMouseOver) {
548
+ if (this._selectedObject) {
549
+ this._switchState(SceneEventState.ROTATING);
550
+ const itemIntersection = this._itemIntersection(this._mousePosition, this._selectedObject);
551
+ if (itemIntersection) {
552
+ this._rotationStartPoint = itemIntersection.point;
553
+ }
554
+ }
555
+ }
556
+ else if (this._intersectedObject) {
557
+ if (this._intersectedMesh && this._intersectedMesh.name && this._intersectedMesh.name.toLowerCase().startsWith('c_')) {
558
+ this._switchState(SceneEventState.DRAGGINGCONNECTOR);
559
+ }
560
+ else {
561
+ if (!event.ctrlKey) {
562
+ if (this._groupingMode) {
563
+ this._addToItemGroup(this._intersectedObject, this._selectedObject);
564
+ }
565
+ else {
566
+ this._itemGroupService.resetObjectsToGroup();
567
+ this.setSelectedObject(this._intersectedObject, this._intersectedMesh);
568
+ }
569
+ }
570
+ else {
571
+ this._addToItemGroup(this._intersectedObject, this._selectedObject);
572
+ }
573
+ if (!this._intersectedObject.fixed && !this.rotateNoDrag) {
574
+ this._switchState(SceneEventState.DRAGGING);
575
+ }
576
+ }
577
+ }
578
+ break;
579
+ case SceneEventState.UNSELECTED:
580
+ const floor = this._floorIntersection(this._mousePosition);
581
+ if (floor) {
582
+ if (floor.object.parent && floor.object.parent instanceof Item && floor.object.parent.configurable) {
583
+ this._setIntersectedObject(floor.object);
584
+ }
585
+ }
586
+ if (this._intersectedObject) {
587
+ this._itemGroupService.resetObjectsToGroup();
588
+ this.setSelectedObject(this._intersectedObject, this._intersectedMesh);
589
+ if (!this._intersectedObject.fixed) {
590
+ if (this.rotateNoDrag) {
591
+ const itemIntersection = this._itemIntersection(this._mousePosition, this._selectedObject);
592
+ if (itemIntersection) {
593
+ this._rotationStartPoint = itemIntersection.point;
594
+ }
595
+ this._switchState(SceneEventState.ROTATING);
596
+ }
597
+ else {
598
+ this._switchState(SceneEventState.DRAGGING);
599
+ }
600
+ }
601
+ }
602
+ break;
603
+ }
604
+ }
605
+ }
606
+ _overrideDefaultCursorStyle(style) {
607
+ this._defaultCursorStyle = style;
608
+ this._setCursorStyle(this._defaultCursorStyle);
609
+ }
610
+ _setGroupingMode(enableGrouping) {
611
+ this._groupingMode = enableGrouping;
612
+ this._addToItemGroup(this._intersectedObject, this._prevSelectedObject);
613
+ }
614
+ _getDraggedData() {
615
+ return this._dragAndDropService.draggedData;
616
+ }
617
+ _clickPressed(vec2) {
618
+ const vec = vec2 || this._mousePosition;
619
+ if (this._selectedObject) {
620
+ const intersection = this._itemIntersection(vec, this._selectedObject);
621
+ if (intersection) {
622
+ this._dragAndDropService.draggedItem = this._selectedObject;
623
+ this._dragAndDropService.setDragOffset(intersection.point);
624
+ }
625
+ }
626
+ }
627
+ _clickConnectorPressed(vec2) {
628
+ const vec = vec2 || this._mousePosition;
629
+ if (this._intersectedMesh) {
630
+ const intersections = this._getIntersections(vec, [this._intersectedMesh, this._floorService.groundPlane]);
631
+ if (intersections && intersections.length > 1 && intersections.find(i => i.object.name === this._intersectedMesh.name)) {
632
+ const groundPlane = intersections.find(i => i.object.name === 'ground-plane');
633
+ if (groundPlane) {
634
+ this._dragAndDropService.setDragOffset(groundPlane.point, false);
635
+ }
636
+ }
637
+ }
638
+ }
639
+ _clickDragged() {
640
+ if (this._selectedObject && !this._selectedObject.locked) {
641
+ const intersection = this._itemIntersection(this._mousePosition, this._selectedObject);
642
+ if (intersection) {
643
+ if (this._isRotating()) {
644
+ this._rotationStartPoint =
645
+ this._rotationService.rotate(this._selectedObject, this._rotationStartPoint, intersection.point, !this.rotateNoDrag);
646
+ }
647
+ else {
648
+ this._dragAndDropService.clickDragged(intersection);
649
+ this._messageBusService.emit(MessageType.ClickDragged);
650
+ this._debouncedSaveState.next('item dragged');
651
+ }
652
+ this._hudService.update();
653
+ }
654
+ }
655
+ }
656
+ _dragConnector() {
657
+ if (this._selectedObject && !this._selectedObject.locked) {
658
+ // const intersections = this._getIntersections(this._mousePosition, [this._floorService.groundPlane], {});
659
+ // if (intersections && intersections.length === 1) {
660
+ // this._dragAndDropService.dragConnector(this._intersectedMesh, intersections[0].point);
661
+ // }
662
+ this._dragAndDropService.dragConnector(this._intersectedMesh, this._mouseToVec3(this._mousePosition));
663
+ }
664
+ }
665
+ _checkWallsAndFloors(event) {
666
+ if (this._state === SceneEventState.UNSELECTED && this._mouseoverObject == null) {
667
+ const wall = this._wallIntersection(this._mousePosition);
668
+ if (wall) {
669
+ const edge = wall.object.userData.edge;
670
+ this._roomService.selectWall(event, edge.wall, edge);
671
+ return;
672
+ }
673
+ const floor = this._floorIntersection(this._mousePosition);
674
+ if (floor) {
675
+ const room = floor.object.userData.room;
676
+ this._roomService.selectFloor(event, room);
677
+ return;
678
+ }
679
+ }
680
+ }
681
+ _wallIntersection(vec2) {
682
+ const intersections = this._wallIntersections(vec2);
683
+ if (intersections && intersections.length > 0) {
684
+ return intersections[0];
685
+ }
686
+ else {
687
+ return null;
688
+ }
689
+ }
690
+ _wallIntersections(vec2) {
691
+ const wallEdgePlanes = this._roomService.wallEdgePlanes();
692
+ return this._getIntersections(vec2, wallEdgePlanes, { filterByNormals: true });
693
+ }
694
+ _edgeIntersections(vec2) {
695
+ const edges = this._roomService.floorPlanes();
696
+ return this._getIntersections(vec2, edges, { filterByNormals: true });
697
+ }
698
+ _groundIntersections(vec2) {
699
+ return this._getIntersections(vec2, [this._floorService.groundPlane], { filterByNormals: true });
700
+ }
701
+ _wallEdgeIntersected(intersectedWalls, intersectedEdges) {
702
+ const walls = intersectedEdges.map((i) => i.object.userData.wall);
703
+ const filteredWalls = intersectedWalls.filter((intersectedWall) => {
704
+ const wall = intersectedWall.object.userData.edge && intersectedWall.object.userData.edge.wall;
705
+ return walls.indexOf(wall) !== -1;
706
+ });
707
+ return filteredWalls.length > 0;
708
+ }
709
+ _floorIntersection(vec2) {
710
+ const floorPlanes = this._roomService.floorPlanes();
711
+ const floorIntersects = this._getIntersections(vec2, floorPlanes, { filterByNormals: false, includeFloors: true });
712
+ if (floorIntersects.length > 0) {
713
+ return floorIntersects[0];
714
+ }
715
+ else {
716
+ return null;
717
+ }
718
+ }
719
+ _pointOnFloor(vec2) {
720
+ if (this._intersectedObject &&
721
+ !(isOnFloorType(this._intersectedObject.userData.itemType) || isInWallType(this._intersectedObject.userData.itemType))) {
722
+ return null;
723
+ }
724
+ const intersectedFloor = this._floorIntersection(vec2);
725
+ if (!intersectedFloor) {
726
+ return null;
727
+ }
728
+ const intersectedWalls = this._wallIntersections(vec2);
729
+ if (!intersectedWalls.length) {
730
+ return intersectedFloor.point;
731
+ }
732
+ const intersectedEdges = this._edgeIntersections(vec2);
733
+ if (this._wallEdgeIntersected(intersectedWalls, intersectedEdges)) {
734
+ return null;
735
+ }
736
+ return intersectedFloor.point;
737
+ }
738
+ _isMouseEventAllowed(event) {
739
+ return event ? (event.target && event.target.nodeName === 'CANVAS') : true;
740
+ }
741
+ _mouseMoveEvent(event) {
742
+ if (this._state === SceneEventState.DND) {
743
+ return this._dragOverEvent.bind(this)(event);
744
+ }
745
+ if (this._isMouseEventAllowed(event)) {
746
+ const mousePos = event ? RelativePositionUtils.GetClientMousePosition(event) : this._mousePosition;
747
+ let canvas;
748
+ if (event) {
749
+ event.preventDefault();
750
+ canvas = event.currentTarget;
751
+ }
752
+ this._mousePosition.set(mousePos.x - (canvas ? canvas.offsetLeft : 0), mousePos.y - (canvas ? canvas.offsetTop : 0));
753
+ if (this._oldMousePosition.x !== mousePos.x && this._oldMousePosition.y !== mousePos.y) {
754
+ this._mouseMoved = true;
755
+ }
756
+ if (!this._mouseDown) {
757
+ this._updateIntersections();
758
+ }
759
+ else {
760
+ this._dragAndDropService.intersectedWall = this._wallIntersection(this._mousePosition);
761
+ this._dragAndDropService.intersectedFloor = this._floorIntersection(this._mousePosition);
762
+ }
763
+ if (this.rotateNoDrag) {
764
+ this._controls.enabled = true;
765
+ return;
766
+ }
767
+ switch (this._state) {
768
+ case SceneEventState.UNSELECTED:
769
+ this._updateMouseover();
770
+ break;
771
+ case SceneEventState.SELECTED:
772
+ if (this._mouseDown && this._mouseMoved) {
773
+ this._hudService.cameraRotation();
774
+ }
775
+ this._updateMouseover();
776
+ break;
777
+ case SceneEventState.EXPLORE:
778
+ this._hudService.stopExplore();
779
+ if (this._mouseDown) {
780
+ this._setCursorStyle('move');
781
+ }
782
+ else {
783
+ this._explorePressed = false;
784
+ if (!this._mouseoverObject) {
785
+ this._updateExplorePoint();
786
+ }
787
+ }
788
+ break;
789
+ case SceneEventState.DRAGGING:
790
+ case SceneEventState.ROTATING:
791
+ this._clickDragged();
792
+ this._markSceneToUpdate();
793
+ this._eventService.objectMovingOrRotating.next();
794
+ break;
795
+ case SceneEventState.DRAGGINGCONNECTOR:
796
+ this._dragConnector();
797
+ break;
798
+ }
799
+ }
800
+ }
801
+ _updateExplorePoint() {
802
+ const point = this._pointOnFloor(this._mousePosition);
803
+ if (point) {
804
+ this._setCursorStyle('pointer');
805
+ const distance = this._camera.position.distanceTo(point);
806
+ this._hudService.exploreFloorHover(this._mousePosition, point, distance);
807
+ }
808
+ else {
809
+ this._setCursorStyle('crosshair');
810
+ this._hudService.stopExplore();
811
+ }
812
+ }
813
+ _updateExploreIndicator() {
814
+ this._hudService.stopExplore();
815
+ const point = this._pointOnFloor(this._mousePosition);
816
+ if (point) {
817
+ this._setCursorStyle('pointer');
818
+ }
819
+ else {
820
+ this._setCursorStyle('crosshair');
821
+ }
822
+ }
823
+ _acceptDrop(event) {
824
+ if (event.dataTransfer && event.dataTransfer.dropEffect) {
825
+ event.dataTransfer.dropEffect = 'copy';
826
+ }
827
+ }
828
+ _releaseState(draggedData) {
829
+ if (draggedData && draggedData.isCopy) {
830
+ this._switchState(SceneEventState.SELECTED);
831
+ }
832
+ else {
833
+ this._switchState(SceneEventState.UNSELECTED);
834
+ }
835
+ }
836
+ _addToItemGroup(object, prevSelectedObject) {
837
+ const isIntersectWithGroupMember = object instanceof ItemGroup || object.parent instanceof ItemGroup;
838
+ if (!isIntersectWithGroupMember && !object.configuring && this._canGroupItems(object, prevSelectedObject)) {
839
+ if (prevSelectedObject) {
840
+ this._itemGroupService.addIfNotExist(prevSelectedObject);
841
+ }
842
+ this._itemGroupService.addOrRemoveIfExist(object);
843
+ }
844
+ }
845
+ _canGroupFloorItem(item) {
846
+ return !(item instanceof WallItem) || (item instanceof CustomWallFloorItem && !item.currentWall);
847
+ }
848
+ _canGroupWallItem(item) {
849
+ return ((item instanceof WallItem && !(item instanceof InWallItem)) ||
850
+ (item instanceof CustomWallFloorItem && item.currentWall !== undefined));
851
+ }
852
+ _canGroupItems(newItem, previousItem) {
853
+ return this._canGroupWallItem(newItem) && this._canGroupWallItem(previousItem) &&
854
+ newItem.currentWall === previousItem.currentWall ||
855
+ this._canGroupFloorItem(newItem) && this._canGroupFloorItem(previousItem);
856
+ }
857
+ _switchState(newState) {
858
+ if (newState !== this._state) {
859
+ this._onExit(this._state);
860
+ this._onEntry(newState);
861
+ }
862
+ this._state = newState;
863
+ this._hudService.setRotating(this._isRotating());
864
+ }
865
+ _onEntry(onState) {
866
+ switch (onState) {
867
+ case SceneEventState.UNSELECTED:
868
+ this.setSelectedObject(null);
869
+ this._controls.enabled = true;
870
+ break;
871
+ case SceneEventState.SELECTED:
872
+ this._controls.enabled = true;
873
+ break;
874
+ case SceneEventState.ROTATING:
875
+ this._controls.enabled = this._appService.sku;
876
+ break;
877
+ case SceneEventState.DRAGGING:
878
+ this._setCursorStyle('move');
879
+ this._clickPressed();
880
+ this._controls.enabled = false;
881
+ break;
882
+ case SceneEventState.DRAGGINGCONNECTOR:
883
+ this._clickConnectorPressed();
884
+ this._controls.enabled = false;
885
+ break;
886
+ case SceneEventState.EXPLORE:
887
+ this._overrideDefaultCursorStyle('pointer');
888
+ this.setSelectedObject(null);
889
+ this._cameraMoveSub = this._cameraService.cameraMovementChanged.subscribe(() => this._updateExploreIndicator());
890
+ break;
891
+ }
892
+ }
893
+ _onExit(onState) {
894
+ switch (onState) {
895
+ case SceneEventState.UNSELECTED:
896
+ case SceneEventState.SELECTED:
897
+ break;
898
+ case SceneEventState.DRAGGING:
899
+ this._setCursorStyle(this._defaultCursorStyle);
900
+ break;
901
+ case SceneEventState.ROTATING:
902
+ break;
903
+ case SceneEventState.EXPLORE:
904
+ this._overrideDefaultCursorStyle('auto');
905
+ this._hudService.stopExplore();
906
+ if (this._cameraMoveSub) {
907
+ this._cameraMoveSub.unsubscribe();
908
+ }
909
+ break;
910
+ }
911
+ }
912
+ _setIntersectedObject(mesh) {
913
+ this._intersectedMesh = mesh;
914
+ if (typeof mesh['getRoot'] === 'function') {
915
+ this._intersectedObject = mesh.getRoot();
916
+ }
917
+ else if (mesh.parent) {
918
+ this._setIntersectedObject(mesh.parent);
919
+ }
920
+ }
921
+ // Reverted changes from IONE-31399
922
+ _mouseToVec3(vec2) {
923
+ const rendererElement = this._element;
924
+ const mPosition = new Vector2((vec2.x / rendererElement.clientWidth) * 2 - 1, -(vec2.y / rendererElement.clientHeight) * 2 + 1);
925
+ const vector = new Vector3(mPosition.x, mPosition.y, 0.5);
926
+ vector.unproject(this._camera);
927
+ return vector;
928
+ // const rendererElement = this._element;
929
+ // const mPosition = new Vector2(
930
+ // (vec2.x / rendererElement.clientWidth) * 2 - 1,
931
+ // -(vec2.y / rendererElement.clientHeight) * 2 + 1
932
+ // );
933
+ // const vector = new Vector3(mPosition.x, mPosition.y, 0.5);
934
+ // vector.unproject(this._camera);
935
+ // return vector;
936
+ }
937
+ _setSelectObject(object, mesh) {
938
+ object.setSelected(mesh, this._mouseToVec3(this._mousePosition));
939
+ this._selectedObject = object;
940
+ this._messageBusService.emit(MessageType.ItemSelected, object);
941
+ }
942
+ _updateMouseover() {
943
+ if (this._intersectedObject != null) {
944
+ if (this._mouseoverObject != null) {
945
+ if (this._mouseoverObject !== this._intersectedObject) {
946
+ this._setObjectMouseOff(this._mouseoverObject);
947
+ this._mouseoverObject = this._intersectedObject;
948
+ this._setObjectMouseOver(this._mouseoverObject, this._intersectedMesh);
949
+ this._markSceneToUpdate();
950
+ }
951
+ else {
952
+ // do nothing, mouseover already set
953
+ }
954
+ }
955
+ else {
956
+ this._mouseoverObject = this._intersectedObject;
957
+ this._setObjectMouseOver(this._mouseoverObject, this._intersectedMesh);
958
+ this._setCursorStyle('pointer');
959
+ this._markSceneToUpdate();
960
+ }
961
+ }
962
+ else if (this._mouseoverObject != null) {
963
+ this._setObjectMouseOff(this._mouseoverObject);
964
+ this._setCursorStyle(this._defaultCursorStyle);
965
+ this._mouseoverObject = null;
966
+ this._markSceneToUpdate();
967
+ }
968
+ }
969
+ _setObjectMouseOver(object, mesh) {
970
+ if (object.parent && object.parent instanceof ItemGroup) {
971
+ object.parent.mouseOver();
972
+ }
973
+ else {
974
+ object.mouseOver(mesh);
975
+ }
976
+ }
977
+ _setObjectMouseOff(object) {
978
+ if (object.parent && object.parent instanceof ItemGroup) {
979
+ object.parent.mouseOff();
980
+ }
981
+ else {
982
+ object.mouseOff();
983
+ }
984
+ }
985
+ _markSceneToUpdate() {
986
+ this._sceneService.needsRender = true;
987
+ }
988
+ _setCursorStyle(style) {
989
+ this._element.style.cursor = style;
990
+ }
991
+ }
992
+ SceneEventService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SceneEventService, deps: [{ token: i1.HudService }, { token: i2.MessageBusService }, { token: i3.SceneService }, { token: i4.DragAndDropService }, { token: i5.RotationService }, { token: i6.CameraService }, { token: i7.RoomService }, { token: i8.FloorService }, { token: i9.IntersectionService }, { token: i10.ViewModeService }, { token: i11.ItemGroupService }, { token: i12.ItemService }, { token: i13.HomedecoratorAppService }, { token: i14.HomedecoratorAppEventService }], target: i0.ɵɵFactoryTarget.Injectable });
993
+ SceneEventService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SceneEventService, providedIn: 'root' });
994
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: SceneEventService, decorators: [{
995
+ type: Injectable,
996
+ args: [{
997
+ providedIn: 'root'
998
+ }]
999
+ }], ctorParameters: function () { return [{ type: i1.HudService }, { type: i2.MessageBusService }, { type: i3.SceneService }, { type: i4.DragAndDropService }, { type: i5.RotationService }, { type: i6.CameraService }, { type: i7.RoomService }, { type: i8.FloorService }, { type: i9.IntersectionService }, { type: i10.ViewModeService }, { type: i11.ItemGroupService }, { type: i12.ItemService }, { type: i13.HomedecoratorAppService }, { type: i14.HomedecoratorAppEventService }]; } });
1000
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtZXZlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL3BsdWdpbnMvY29yZTNkL3NlcnZpY2Uvc2NlbmUtZXZlbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUF1QyxPQUFPLEVBQUUsT0FBTyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzdFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUkxRCxPQUFPLEVBQWEsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUM3RCxPQUFPLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEUsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBVy9DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDM0QsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFDbEYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzNJLE9BQU8s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LElBQVU7UUFDOUQsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLFlBQVksU0FBUyxFQUFFO1lBQ3ZELE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDM0I7YUFBTTtZQUNMLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsTUFBd0I7UUFDakQsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLFlBQVksU0FBUyxFQUFFO1lBQ3ZELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDMUI7YUFBTTtZQUNMLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ3hDLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBYTtRQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLENBQUM7OytHQWhpQ1UsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGaEIsTUFBTTs0RkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0l0ZW19IGZyb20gJy4uL2l0ZW1zL2l0ZW0nO1xyXG5pbXBvcnQge0NhbWVyYSwgSW50ZXJzZWN0aW9uLCBNZXNoLCBPYmplY3QzRCwgVmVjdG9yMiwgVmVjdG9yM30gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1NjZW5lRXZlbnRTdGF0ZX0gZnJvbSAnLi4vbW9kZWwvc2NlbmUtZXZlbnQuZW51bSc7XHJcbmltcG9ydCB7SHVkU2VydmljZX0gZnJvbSAnLi9odWQuc2VydmljZSc7XHJcbmltcG9ydCB7RHJhZ0FuZERyb3BTZXJ2aWNlfSBmcm9tICcuL2RyYWctYW5kLWRyb3Auc2VydmljZSc7XHJcbmltcG9ydCB7Q2FtZXJhU2VydmljZX0gZnJvbSAnLi9jYW1lcmEuc2VydmljZSc7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtmcm9tRXZlbnR9IGZyb20gJ3J4anMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tRXZlbnQnO1xyXG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGVsYXksIGZpbHRlciwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7b2Z9IGZyb20gJ3J4anMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9vZic7XHJcbmltcG9ydCB7TWVzc2FnZUJ1c1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9tZXNzYWdlLWJ1cy5zZXJ2aWNlJztcclxuaW1wb3J0IHtTY2VuZVNlcnZpY2V9IGZyb20gJy4vc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7Um90YXRpb25TZXJ2aWNlfSBmcm9tICcuL3JvdGF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge1Jvb21TZXJ2aWNlfSBmcm9tICcuLi8uLi9yb29tLXBsYW5uZXIvY29tcG9uZW50cy9mbG9vcnBsYW5uZXIvc2VydmljZS9yb29tLnNlcnZpY2UnO1xyXG5pbXBvcnQge0Zsb29yU2VydmljZX0gZnJvbSAnLi9mbG9vci5zZXJ2aWNlJztcclxuaW1wb3J0IHtJbnRlcnNlY3Rpb25TZXJ2aWNlfSBmcm9tICcuL2ludGVyc2VjdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtWaWV3TW9kZVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS92aWV3LW1vZGUuc2VydmljZSc7XHJcbmltcG9ydCB7SXRlbUdyb3VwU2VydmljZX0gZnJvbSAnLi9pdGVtLWdyb3VwLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJ2aWNlfSBmcm9tICcuL2l0ZW0uc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckFwcFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWFwcC5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlVHlwZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtL21lc3NhZ2UtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtWaWV3TW9kZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtL3ZpZXctbW9kZS5lbnVtJztcclxuaW1wb3J0IHtSZWxhdGl2ZVBvc2l0aW9uVXRpbHN9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbHMvcmVsYXRpdmUtcG9zaXRpb24udXRpbHMnO1xyXG5pbXBvcnQge0N1c3RvbVdhbGxGbG9vckl0ZW19IGZyb20gJy4uL2l0ZW1zL2N1c3RvbS13YWxsLWZsb29yLWl0ZW0nO1xyXG5pbXBvcnQge0l0ZW1Hcm91cH0gZnJvbSAnLi4vaXRlbXMvaXRlbS1ncm91cCc7XHJcbmltcG9ydCB7aXNGbG9vckRlY29yYXRpb24sIGlzRmxvb3JUeXBlLCBpc0Z1cm5pdHVyZVR5cGUsIGlzSW5XYWxsVHlwZSwgaXNPbkZsb29yVHlwZSwgaXNXYWxsRmxvb3JUeXBlLCBpc1dhbGxUeXBlfSBmcm9tICcuLi9pdGVtcy9mYWN0b3J5JztcclxuaW1wb3J0IHtJbldhbGxJdGVtLCBXYWxsSXRlbX0gZnJvbSAnLi4vaXRlbXMvd2FsbC1vYmplY3RzJztcclxuaW1wb3J0IHtDdXN0b21NZXNofSBmcm9tICcuLi9pdGVtcy9jdXN0b20tb2JqZWN0cyc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckFwcEV2ZW50U2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItYXBwLWV2ZW50LnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2NlbmVFdmVudFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcnNlY3RPZmZzZXRGb3JXYWxscyA9IDIwO1xyXG4gIHB1YmxpYyByZWFkb25seSBsb25nVG91Y2hEdXJhdGlvbiA9IDYwMDtcclxuXHJcbiAgcHVibGljIHJvdGF0ZU5vRHJhZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIF9jb250cm9sczogYW55O1xyXG4gIHByaXZhdGUgX2NhbWVyYTogQ2FtZXJhO1xyXG5cclxuICBwcml2YXRlIF9tb3VzZVBvc2l0aW9uOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoKTtcclxuICBwcml2YXRlIF9vbGRNb3VzZVBvc2l0aW9uOiBWZWN0b3IyID0gbmV3IFZlY3RvcjIoKTtcclxuXHJcbiAgcHJpdmF0ZSBfcm90YXRpb25TdGFydFBvaW50OiBWZWN0b3IzID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfaW50ZXJzZWN0ZWRPYmplY3Q6IEl0ZW07XHJcbiAgcHJpdmF0ZSBfaW50ZXJzZWN0ZWRNZXNoOiBDdXN0b21NZXNoIHwgTWVzaDtcclxuICBwcml2YXRlIF9tb3VzZW92ZXJPYmplY3Q6IEl0ZW07XHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRPYmplY3Q6IGFueTtcclxuICBwcml2YXRlIF9wcmV2U2VsZWN0ZWRPYmplY3Q6IGFueTtcclxuICBwcml2YXRlIF9kZWZhdWx0Q3Vyc29yU3R5bGUgPSAncG9pbnRlcic7XHJcbiAgcHJpdmF0ZSBfZXhwbG9yZVByZXNzZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pbkRyYWdPdmVyID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX21vdXNlRG93biA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX21vdXNlTW92ZWQgPSBmYWxzZTsgLy8gaGFzIG1vdXNlIG1vdmVkIHNpbmNlIGRvd24gY2xpY2tcclxuXHJcbiAgcHJpdmF0ZSBfcm90YXRlTW91c2VPdmVyID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZ3JvdXBpbmdNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX3N0YXRlID0gU2NlbmVFdmVudFN0YXRlLlVOU0VMRUNURUQ7XHJcblxyXG4gIHByaXZhdGUgX2ludGVyc2VjdGVkV2FsbDogSW50ZXJzZWN0aW9uO1xyXG4gIHByaXZhdGUgX2ludGVyc2VjdGVkRmxvb3I6IEludGVyc2VjdGlvbjtcclxuXHJcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICBwcml2YXRlIF9jYW1lcmFNb3ZlU3ViOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIHByaXZhdGUgX2RlYm91bmNlZFNhdmVTdGF0ZTogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3QoKTtcclxuICBwcml2YXRlIF90b3VjaFN0YXJ0OiBPYnNlcnZhYmxlPEV2ZW50PjtcclxuICBwcml2YXRlIF90b3VjaEVuZDogT2JzZXJ2YWJsZTxFdmVudD47XHJcbiAgcHJpdmF0ZSBfdG91Y2hDYW5jZWw6IE9ic2VydmFibGU8RXZlbnQ+O1xyXG4gIHByaXZhdGUgX3RvdWNoTW92ZTogT2JzZXJ2YWJsZTxFdmVudD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfaHVkU2VydmljZTogSHVkU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VCdXNTZXJ2aWNlOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NjZW5lU2VydmljZTogU2NlbmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZHJhZ0FuZERyb3BTZXJ2aWNlOiBEcmFnQW5kRHJvcFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9yb3RhdGlvblNlcnZpY2U6IFJvdGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX2NhbWVyYVNlcnZpY2U6IENhbWVyYVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9yb29tU2VydmljZTogUm9vbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9mbG9vclNlcnZpY2U6IEZsb29yU2VydmljZSxcclxuICAgIHByaXZhdGUgX2ludGVyc2VjdGlvblNlcnZpY2U6IEludGVyc2VjdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF92aWV3TW9kZVNlcnZpY2U6IFZpZXdNb2RlU2VydmljZSxcclxuICAgIHByaXZhdGUgX2l0ZW1Hcm91cFNlcnZpY2U6IEl0ZW1Hcm91cFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pdGVtU2VydmljZTogSXRlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hcHBTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQXBwU2VydmljZSxcclxuICAgIHByaXZhdGUgX2V2ZW50U2VydmljZTogSG9tZWRlY29yYXRvckFwcEV2ZW50U2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgdGhpcy5fZWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcclxuICAgIHRoaXMuX2NvbnRyb2xzID0gdGhpcy5fY2FtZXJhU2VydmljZS5jb250cm9scztcclxuICAgIHRoaXMuX2NhbWVyYSA9IHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhO1xyXG5cclxuICAgIHRoaXMuX3RvdWNoU3RhcnQgPSBmcm9tRXZlbnQoZWxlbWVudCwgJ3RvdWNoc3RhcnQnKTtcclxuICAgIHRoaXMuX3RvdWNoRW5kID0gZnJvbUV2ZW50KGVsZW1lbnQsICd0b3VjaGVuZCcpO1xyXG4gICAgdGhpcy5fdG91Y2hDYW5jZWwgPSBmcm9tRXZlbnQoZWxlbWVudCwgJ3RvdWNoY2FuY2VsJyk7XHJcbiAgICB0aGlzLl90b3VjaE1vdmUgPSBmcm9tRXZlbnQoZWxlbWVudCwgJ3RvdWNobW92ZScpO1xyXG5cclxuICAgIGZyb21FdmVudChlbGVtZW50LCAnbW91c2Vkb3duJylcclxuICAgICAgLnBpcGUoZmlsdGVyKChldmVudDogTW91c2VFdmVudCkgPT4gZXZlbnQuYnV0dG9uID09PSAwKSlcclxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB0aGlzLl9sZWZ0TW91c2VEb3duRXZlbnQoZXZlbnQpKTtcclxuICAgIGZyb21FdmVudChlbGVtZW50LCAnbW91c2V1cCcpLnN1YnNjcmliZSgoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHRoaXMuX21vdXNlVXBFdmVudChldmVudCkpO1xyXG4gICAgZnJvbUV2ZW50KGVsZW1lbnQsICdtb3VzZW1vdmUnKS5zdWJzY3JpYmUoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB0aGlzLl9tb3VzZU1vdmVFdmVudChldmVudCkpO1xyXG4gICAgdGhpcy5fdG91Y2hTdGFydC5zdWJzY3JpYmUoKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB0aGlzLl90b3VjaFN0YXJ0RXZlbnQoZXZlbnQpKTtcclxuICAgIHRoaXMuX3RvdWNoRW5kLnN1YnNjcmliZSgoZXZlbnQ6IFRvdWNoRXZlbnQpID0+IHRoaXMuX3RvdWNoRW5kRXZlbnQoZXZlbnQpKTtcclxuICAgIHRoaXMuX3RvdWNoQ2FuY2VsLnN1YnNjcmliZSgoZXZlbnQ6IFRvdWNoRXZlbnQpID0+IHRoaXMuX3RvdWNoRW5kRXZlbnQoZXZlbnQpKTtcclxuICAgIHRoaXMuX3RvdWNoTW92ZS5zdWJzY3JpYmUoKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB0aGlzLl90b3VjaE1vdmVFdmVudChldmVudCkpO1xyXG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ2tleWRvd24nKS5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLl9rZXlEb3duRXZlbnQoZXZlbnQpKTtcclxuICAgIGZyb21FdmVudChlbGVtZW50LCAnZHJhZ2VudGVyJykuc3Vic2NyaWJlKChldmVudDogRHJhZ0V2ZW50KSA9PiB0aGlzLl9kcmFnRW50ZXJFdmVudChldmVudCkpO1xyXG4gICAgZnJvbUV2ZW50KGVsZW1lbnQsICdkcmFnZXhpdCcpLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdFdmVudCkgPT4gdGhpcy5fZHJhZ0V4aXRFdmVudChldmVudCkpO1xyXG4gICAgZnJvbUV2ZW50KGVsZW1lbnQsICdkcmFnb3ZlcicpLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdFdmVudCkgPT4gdGhpcy5fZHJhZ092ZXJFdmVudChldmVudCkpO1xyXG4gICAgZnJvbUV2ZW50KGVsZW1lbnQsICdkcm9wJykuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuX29uRHJvcChldmVudCkpO1xyXG5cclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlNldERyYWcsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBJdGVtKSB7XHJcbiAgICAgICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZERhdGEgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSxcclxuICAgICAgICAgICAgdHlwZTogZGF0YS5tZXRhZGF0YS5pdGVtVHlwZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkSXRlbSA9IGRhdGE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkRGF0YSA9IGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlN0YXJ0RHJhZywgKHt4LCB5LCB6fSkgPT5cclxuICAgICAgICB0aGlzLnN0YXJ0RHJhZ2dpbmcoeCwgeSwgeikpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuRXhpdERyYWcsICgpID0+IHRoaXMuX2RyYWdFeGl0RXZlbnQoZXZlbnQpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlBsYWNlT25Ub3VjaCwgKCkgPT4gdGhpcy5faW5pdFBsYWNlT25Ub3VjaFJlcXVlc3QoKSksXHJcbiAgICAgIHRoaXMuX2RlYm91bmNlZFNhdmVTdGF0ZS5waXBlKGRlYm91bmNlVGltZSg4MDApKS5zdWJzY3JpYmUoKGFjdGlvbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246IGAzRCAke2FjdGlvbn1gfSk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLl9kZWJvdW5jZWRTYXZlU3RhdGUucGlwZShkZWJvdW5jZVRpbWUoMjAwKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLl9odWRTZXJ2aWNlLnVwZGF0ZUxhYmVsTWVhc3VyZW1lbnRzKCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLl92aWV3TW9kZVNlcnZpY2Uudmlld01vZGVDaGFuZ2VkLnN1YnNjcmliZShtb2RlID0+IHRoaXMuc2V0RXhwbG9yZU1vZGUobW9kZSA9PT0gVmlld01vZGUuV2Fsa1Rocm91Z2gpKSxcclxuICAgICAgdGhpcy5faXRlbUdyb3VwU2VydmljZS5vYmplY3RBZGRlZC5zdWJzY3JpYmUoKG9iamVjdCkgPT4gdGhpcy5zZXRTZWxlY3RlZE9iamVjdChvYmplY3QpKSxcclxuICAgICAgdGhpcy5faXRlbUdyb3VwU2VydmljZS5ncm91cGVkLnN1YnNjcmliZSgob2JqZWN0KSA9PiB0aGlzLnNldFNlbGVjdGVkT2JqZWN0KG9iamVjdCkpLFxyXG4gICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLnVuZ3JvdXBlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZXRTZWxlY3RlZE9iamVjdChudWxsKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXNTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5JdGVtUmVtb3ZlZCwgKCkgPT4gdGhpcy5zZXRTZWxlY3RlZE9iamVjdChudWxsKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXNTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5TdGFydEdyb3VwT2JqZWN0LCAoKSA9PiB0aGlzLl9zZXRHcm91cGluZ01vZGUodHJ1ZSkpXHJcbiAgICApO1xyXG5cclxuICB9XHJcbiAgcHVibGljIHNldEV4cGxvcmVNb2RlKG9uID0gdHJ1ZSkge1xyXG4gICAgaWYgKG9uKSB7XHJcbiAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5FWFBMT1JFKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5VTlNFTEVDVEVEKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTZWxlY3RlZE9iamVjdChvYmplY3Q6IEl0ZW0gfCBJdGVtR3JvdXAsIG1lc2g/OiBNZXNoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IFNjZW5lRXZlbnRTdGF0ZS5VTlNFTEVDVEVEICYmIG9iamVjdCkge1xyXG4gICAgICB0aGlzLl9zd2l0Y2hTdGF0ZShTY2VuZUV2ZW50U3RhdGUuU0VMRUNURUQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9zZWxlY3RlZE9iamVjdCAhPSBudWxsICYmIHRoaXMuX3NlbGVjdGVkT2JqZWN0ICE9PSBvYmplY3QpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRPYmplY3Quc2V0VW5zZWxlY3RlZCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKG9iamVjdCkge1xyXG4gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSXRlbUdyb3VwKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0U2VsZWN0T2JqZWN0KG9iamVjdCk7XHJcbiAgICAgICAgdGhpcy5faXRlbUdyb3VwU2VydmljZS5zZWxlY3RlZEdyb3VwID0gb2JqZWN0O1xyXG4gICAgICB9IGVsc2UgaWYgKG9iamVjdC5wYXJlbnQgaW5zdGFuY2VvZiBJdGVtR3JvdXApIHtcclxuICAgICAgICB0aGlzLl9zZXRTZWxlY3RPYmplY3Qob2JqZWN0LnBhcmVudCk7XHJcbiAgICAgICAgdGhpcy5faXRlbUdyb3VwU2VydmljZS5zZWxlY3RlZEdyb3VwID0gb2JqZWN0LnBhcmVudDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9zZXRTZWxlY3RPYmplY3Qob2JqZWN0LCBtZXNoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkT2JqZWN0KSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRPYmplY3Quc2V0VW5zZWxlY3RlZCgpO1xyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VCdXNTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSXRlbVVuc2VsZWN0ZWQsIHRoaXMuX3NlbGVjdGVkT2JqZWN0KTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZE9iamVjdCA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcHJldlNlbGVjdGVkT2JqZWN0ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9tYXJrU2NlbmVUb1VwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0RHJhZ2dpbmcoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo/OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGRyYWdnZWREYXRhID0gdGhpcy5fZ2V0RHJhZ2dlZERhdGEoKTtcclxuICAgIGlmICghdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmRyYWdnZWRTdGF0dXMuYWxsb3dlZE5ldyB8fCAhZHJhZ2dlZERhdGEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc3dpdGNoU3RhdGUoU2NlbmVFdmVudFN0YXRlLkRORCk7XHJcbiAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZFN0YXR1cy5kcmFnRW50ZXIoKTtcclxuICAgIGNvbnN0IHZlYzM6IFZlY3RvcjMgPSB6ID8gbmV3IFZlY3RvcjMoeCwgeSwgeikgOiB0aGlzLmludGVyc2VjdGluZ1ZlYzMobmV3IFZlY3RvcjIoeCwgeSkpO1xyXG4gICAgaWYgKHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkSXRlbSkge1xyXG4gICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZFN0YXR1cy5vYmplY3RMb2FkZWQoKTtcclxuICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLnVwZGF0ZURyYWdnZWRQb3NpdGlvbih2ZWMzKTtcclxuICAgIH0gZWxzZSBpZiAoaXNGdXJuaXR1cmVUeXBlKGRyYWdnZWREYXRhLnR5cGUpIHx8IGlzV2FsbFR5cGUoZHJhZ2dlZERhdGEudHlwZSkpIHtcclxuICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmRyYWdNb2RlbCh2ZWMzLCB0aGlzLl9mbG9vckludGVyc2VjdGlvbih0aGlzLl9zY2VuZVNlcnZpY2UucG9zaXRpb25JblNjZW5lVG9TY3JlZW4odmVjMykpKTtcclxuICAgIH0gZWxzZSBpZiAoaXNGbG9vckRlY29yYXRpb24oZHJhZ2dlZERhdGEudHlwZSkpIHtcclxuICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmRyYWdGbG9vckRlY29yYXRpb24odGhpcy5fZmxvb3JJbnRlcnNlY3Rpb24odGhpcy5fc2NlbmVTZXJ2aWNlLnBvc2l0aW9uSW5TY2VuZVRvU2NyZWVuKHZlYzMpKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW50ZXJzZWN0aW5nVmVjMyh2ZWMyOiBWZWN0b3IyLCBpbnRlcnNlY3Rpb24/OiBJbnRlcnNlY3Rpb24pOiBWZWN0b3IzIHtcclxuICAgIGlmICghaW50ZXJzZWN0aW9uKSB7XHJcbiAgICAgIGNvbnN0IGdJbnRlcnNlY3Rpb25zID0gdGhpcy5fZ3JvdW5kSW50ZXJzZWN0aW9ucyh2ZWMyKTtcclxuICAgICAgcmV0dXJuIGdJbnRlcnNlY3Rpb25zICYmIGdJbnRlcnNlY3Rpb25zWzBdICYmIGdJbnRlcnNlY3Rpb25zWzBdLnBvaW50O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGludGVyc2VjdGlvbi5wb2ludDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzUm90YXRpbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09IFNjZW5lRXZlbnRTdGF0ZS5ST1RBVElORyAmJiAoIXRoaXMuX2FwcFNlcnZpY2Uuc2t1IHx8IHRoaXMuX3ZpZXdNb2RlU2VydmljZS52aWV3TW9kZSA9PT0gVmlld01vZGUuSW5QaG90b1ZpZXcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfa2V5RG93bkV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICB0aGlzLl9jYW5jZWxEcmFnRHJvcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZHJhZ0VudGVyRXZlbnQoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGNvbnN0IG1vdXNlUG9zOiBWZWN0b3IyID0gUmVsYXRpdmVQb3NpdGlvblV0aWxzLkdldENsaWVudE1vdXNlUG9zaXRpb24oZXZlbnQpO1xyXG4gICAgdGhpcy5zdGFydERyYWdnaW5nKG1vdXNlUG9zLngsIG1vdXNlUG9zLnkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZHJhZ0V4aXRFdmVudChldmVudCkge1xyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkcmFnZ2VkRGF0YSA9IHRoaXMuX2dldERyYWdnZWREYXRhKCk7XHJcbiAgICBpZiAoZHJhZ2dlZERhdGEpIHtcclxuICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmZpbmlzaERyYWdnaW5nKCk7XHJcbiAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5VTlNFTEVDVEVEKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2RyYWdPdmVyRXZlbnQoZXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBpZiAodGhpcy5fc3RhdGUgIT09IFNjZW5lRXZlbnRTdGF0ZS5ETkQgfHwgdGhpcy5faW5EcmFnT3Zlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5faW5EcmFnT3ZlciA9IHRydWU7XHJcbiAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZFN0YXR1cy5kcmFnT3ZlcigpO1xyXG4gICAgY29uc3QgY2FudmFzOiBIVE1MRWxlbWVudCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XHJcbiAgICBjb25zdCBtb3VzZVBvczogVmVjdG9yMiA9IFJlbGF0aXZlUG9zaXRpb25VdGlscy5HZXRDbGllbnRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcclxuICAgIHRoaXMuX21vdXNlUG9zaXRpb24uc2V0KG1vdXNlUG9zLnggLSAoY2FudmFzID8gY2FudmFzLm9mZnNldExlZnQgOiAwKSwgbW91c2VQb3MueSAtIChjYW52YXMgPyBjYW52YXMub2Zmc2V0VG9wIDogMCkpO1xyXG5cclxuICAgIGNvbnN0IGRyYWdnZWREYXRhID0gdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmRyYWdnZWREYXRhO1xyXG5cclxuICAgIGxldCBpbnRlcnNlY3Rpb246IEludGVyc2VjdGlvbiA9IHRoaXMuX3dhbGxJbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbik7XHJcbiAgICBjb25zdCBpbnRlcnNlY3RlZEZsb29yOiBJbnRlcnNlY3Rpb24gPSB0aGlzLl9mbG9vckludGVyc2VjdGlvbih0aGlzLl9tb3VzZVBvc2l0aW9uKTtcclxuXHJcbiAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuaW50ZXJzZWN0ZWRXYWxsID0gaW50ZXJzZWN0aW9uO1xyXG4gICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmludGVyc2VjdGVkRmxvb3IgPSBpbnRlcnNlY3RlZEZsb29yO1xyXG4gICAgdGhpcy5faW50ZXJzZWN0ZWRXYWxsID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5faW50ZXJzZWN0ZWRGbG9vciA9IHVuZGVmaW5lZDtcclxuICAgIGlmIChpc1dhbGxUeXBlKGRyYWdnZWREYXRhLnR5cGUpIHx8IChpc1dhbGxGbG9vclR5cGUoZHJhZ2dlZERhdGEudHlwZSkgJiYgaW50ZXJzZWN0aW9uKSkge1xyXG4gICAgICBpZiAoaW50ZXJzZWN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5faW50ZXJzZWN0ZWRXYWxsID0gaW50ZXJzZWN0aW9uO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpbnRlcnNlY3Rpb24gJiYgIWlzRnVybml0dXJlVHlwZShkcmFnZ2VkRGF0YS50eXBlKSkge1xyXG4gICAgICAgIHRoaXMuX2FjY2VwdERyb3AoZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGlzRmxvb3JUeXBlKGRyYWdnZWREYXRhLnR5cGUpIHx8IGlzRmxvb3JEZWNvcmF0aW9uKGRyYWdnZWREYXRhLnR5cGUpIHx8IChpc1dhbGxGbG9vclR5cGUoZHJhZ2dlZERhdGEudHlwZSkgJiYgaW50ZXJzZWN0ZWRGbG9vcikpIHtcclxuICAgICAgdGhpcy5faW50ZXJzZWN0ZWRGbG9vciA9IGludGVyc2VjdGlvbiA9IHRoaXMuX2Zsb29ySW50ZXJzZWN0aW9uKHRoaXMuX21vdXNlUG9zaXRpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xyXG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW50ZXJzZWN0ZWRQb2ludDogVmVjdG9yMyA9IHRoaXMuaW50ZXJzZWN0aW5nVmVjMyh0aGlzLl9tb3VzZVBvc2l0aW9uLCBpbnRlcnNlY3Rpb24pO1xyXG5cclxuICAgIGlmIChpbnRlcnNlY3RlZFBvaW50KSB7XHJcbiAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS51cGRhdGVEcmFnZ2VkUG9zaXRpb24oaW50ZXJzZWN0ZWRQb2ludCk7XHJcbiAgICAgIHRoaXMuX2FjY2VwdERyb3AoZXZlbnQpO1xyXG4gICAgICB0aGlzLl9tYXJrU2NlbmVUb1VwZGF0ZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faW5EcmFnT3ZlciA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfb25Ecm9wKGV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgaWYgKHRoaXMuX3N0YXRlICE9PSBTY2VuZUV2ZW50U3RhdGUuRE5EKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGNhbnZhczogSFRNTEVsZW1lbnQgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xyXG4gICAgY29uc3QgbW91c2VQb3M6IFZlY3RvcjIgPSBSZWxhdGl2ZVBvc2l0aW9uVXRpbHMuR2V0Q2xpZW50TW91c2VQb3NpdGlvbihldmVudCk7XHJcbiAgICB0aGlzLl9tb3VzZVBvc2l0aW9uLnNldChtb3VzZVBvcy54IC0gKGNhbnZhcyA/IGNhbnZhcy5vZmZzZXRMZWZ0IDogMCksIG1vdXNlUG9zLnkgLSAoY2FudmFzID8gY2FudmFzLm9mZnNldFRvcCA6IDApKTtcclxuXHJcbiAgICBjb25zdCBkcmFnZ2VkRGF0YSA9IHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkRGF0YTtcclxuICAgIGxldCBwb3NpdGlvbjogVmVjdG9yMyA9IG51bGw7XHJcbiAgICBsZXQgaW50ZXJzZWN0aW9uOiBJbnRlcnNlY3Rpb24gPSBudWxsO1xyXG5cclxuICAgIGlmIChpc1dhbGxUeXBlKGRyYWdnZWREYXRhLnR5cGUpIHx8IChpc1dhbGxGbG9vclR5cGUoZHJhZ2dlZERhdGEudHlwZSkgJiYgdGhpcy5faW50ZXJzZWN0ZWRXYWxsKSkge1xyXG4gICAgICBwb3NpdGlvbiA9IHRoaXMuX2ludGVyc2VjdGVkV2FsbCAmJiB0aGlzLl9pbnRlcnNlY3RlZFdhbGwucG9pbnQ7XHJcbiAgICAgIGludGVyc2VjdGlvbiA9IHRoaXMuX2ludGVyc2VjdGVkV2FsbDtcclxuICAgIH0gZWxzZSBpZiAoaXNGbG9vclR5cGUoZHJhZ2dlZERhdGEudHlwZSkgfHwgaXNGbG9vckRlY29yYXRpb24oZHJhZ2dlZERhdGEudHlwZSkgfHwgKGlzV2FsbEZsb29yVHlwZShkcmFnZ2VkRGF0YS50eXBlKSAmJiB0aGlzLl9pbnRlcnNlY3RlZEZsb29yKSkge1xyXG4gICAgICBwb3NpdGlvbiA9IHRoaXMuX2ludGVyc2VjdGVkRmxvb3IgJiYgdGhpcy5faW50ZXJzZWN0ZWRGbG9vci5wb2ludDtcclxuICAgICAgaW50ZXJzZWN0aW9uID0gdGhpcy5faW50ZXJzZWN0ZWRGbG9vcjtcclxuICAgIH1cclxuICAgIGlmIChwb3NpdGlvbikge1xyXG4gICAgICBjb25zdCBpbnRlcnNlY3RlZFBvaW50OiBWZWN0b3IzID0gdGhpcy5pbnRlcnNlY3RpbmdWZWMzKHRoaXMuX21vdXNlUG9zaXRpb24sIGludGVyc2VjdGlvbik7XHJcbiAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkUGxhY2VkKGludGVyc2VjdGVkUG9pbnQsIGludGVyc2VjdGlvbik7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXNTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAnaXRlbSBhZGRlZCd9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2NhbmNlbERyYWdEcm9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZFN0YXR1cy5pc09iamVjdExvYWRlZCkge1xyXG4gICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZFN0YXR1cy5tYXJrVG9DbGVhblVwKCk7XHJcbiAgICAgIHRoaXMuX3JlbGVhc2VTdGF0ZShkcmFnZ2VkRGF0YSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9yZWxlYXNlU3RhdGUoZHJhZ2dlZERhdGEpO1xyXG4gICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZmluaXNoRHJhZ2dpbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NhbmNlbERyYWdEcm9wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmRyYWdnZWRTdGF0dXMuZHJhZ0NhbmNlbGVkKCk7XHJcbiAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZmluaXNoRHJhZ2dpbmcoKTtcclxuICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5TRUxFQ1RFRCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlQnVzU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkZpbmlzaGVkSU9uZUZ1cm5pdHVyZUJ1aWxkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX21vdXNlVXBFdmVudChldmVudD86IE1vdXNlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX21vdXNlRG93biA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gU2NlbmVFdmVudFN0YXRlLkRORCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fb25Ecm9wKGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMuX3N0YXRlKSB7XHJcbiAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLkRSQUdHSU5HOlxyXG4gICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5EUkFHR0lOR0NPTk5FQ1RPUjpcclxuICAgICAgICB0aGlzLl9zd2l0Y2hTdGF0ZShTY2VuZUV2ZW50U3RhdGUuU0VMRUNURUQpO1xyXG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZE9iamVjdCkge1xyXG4gICAgICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmNsaWNrUmVsZWFzZWQoKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRPYmplY3QuZW5kRHJhZygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuUk9UQVRJTkc6XHJcbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkT2JqZWN0KSB7XHJcbiAgICAgICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuY2xpY2tSZWxlYXNlZCgpO1xyXG4gICAgICAgICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICdpdGVtIHJvdGF0ZWQnfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5TRUxFQ1RFRCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlVOU0VMRUNURUQ6XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3RlZE9iamVjdCAmJiAhdGhpcy5fbW91c2VNb3ZlZCkge1xyXG4gICAgICAgICAgdGhpcy5fY2hlY2tXYWxsc0FuZEZsb29ycyhldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5TRUxFQ1RFRDpcclxuICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdGVkT2JqZWN0ICYmICF0aGlzLl9tb3VzZU1vdmVkKSB7XHJcbiAgICAgICAgICB0aGlzLl9jaGVja1dhbGxzQW5kRmxvb3JzKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0ID09IG51bGwgJiYgIXRoaXMuX21vdXNlTW92ZWQpIHtcclxuICAgICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5VTlNFTEVDVEVEKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLkVYUExPUkU6XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fbmF2aWdhdGVFeHBsb3JlKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9uYXZpZ2F0ZUV4cGxvcmUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9vdmVycmlkZURlZmF1bHRDdXJzb3JTdHlsZSgncG9pbnRlcicpO1xyXG4gICAgY29uc3QgcG9pbnQgPSB0aGlzLl9wb2ludE9uRmxvb3IodGhpcy5fbW91c2VQb3NpdGlvbik7XHJcbiAgICBpZiAocG9pbnQpIHtcclxuICAgICAgY29uc3QgZGlzdGFuY2UgPSB0aGlzLl9jYW1lcmEucG9zaXRpb24uZGlzdGFuY2VUbyhwb2ludCk7XHJcbiAgICAgIHRoaXMuX2h1ZFNlcnZpY2UuZXhwbG9yZUZsb29ySG92ZXIodGhpcy5fbW91c2VQb3NpdGlvbiwgcG9pbnQsIGRpc3RhbmNlKTtcclxuICAgICAgaWYgKCF0aGlzLl9tb3VzZU1vdmVkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faHVkU2VydmljZS5jb25maXJtRXhwbG9yZSgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2NhbWVyYVNlcnZpY2UuY29udHJvbHMuYW5pbWF0ZU1vdmVUbyhwb2ludCk7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlRXhwbG9yZVBvaW50KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRQbGFjZU9uVG91Y2hSZXF1ZXN0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkU3RhdHVzLmFsbG93ZWROZXcgJiYgdGhpcy5fZ2V0RHJhZ2dlZERhdGEoKSkge1xyXG4gICAgICB0aGlzLl9zd2l0Y2hTdGF0ZShTY2VuZUV2ZW50U3RhdGUuRE5EKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3RvdWNoRW5kRXZlbnQoZXZlbnQ6IFRvdWNoRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLl9pc01vdXNlRXZlbnRBbGxvd2VkKGV2ZW50KSkge1xyXG4gICAgICB0aGlzLl9tb3VzZURvd24gPSBmYWxzZTtcclxuICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xyXG4gICAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlNFTEVDVEVEOlxyXG4gICAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlVOU0VMRUNURUQ6XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX21vdXNlTW92ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlSW50ZXJzZWN0aW9ucygpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLnJlc2V0T2JqZWN0c1RvR3JvdXAoKTtcclxuICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkT2JqZWN0KHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0LCB0aGlzLl9pbnRlcnNlY3RlZE1lc2gpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2FkZFRvSXRlbUdyb3VwKHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuRFJBR0dJTkc6XHJcbiAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRPYmplY3QpIHtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmNsaWNrUmVsZWFzZWQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5TRUxFQ1RFRCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5ST1RBVElORzpcclxuICAgICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5TRUxFQ1RFRCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRPYmplY3QpIHtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmNsaWNrUmVsZWFzZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICdpdGVtIHJvdGF0ZWQnfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5FWFBMT1JFOlxyXG4gICAgICAgICAgaWYgKCF0aGlzLl9tb3VzZU1vdmVkKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX25hdmlnYXRlRXhwbG9yZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RvdWNoTW92ZUV2ZW50KGV2ZW50OiBUb3VjaEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IFNjZW5lRXZlbnRTdGF0ZS5ETkQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2RyYWdPdmVyRXZlbnQuYmluZCh0aGlzKShldmVudCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5faXNNb3VzZUV2ZW50QWxsb3dlZChldmVudCkpIHtcclxuICAgICAgdGhpcy5fc2V0TW91c2VQb3NpdGlvbkZyb21Ub3VjaEV2ZW50KGV2ZW50KTtcclxuXHJcbiAgICAgIHRoaXMuX21vdXNlTW92ZWQgPSB0cnVlO1xyXG4gICAgICBpZiAoIXRoaXMuX21vdXNlRG93bikge1xyXG4gICAgICAgIHRoaXMuX3VwZGF0ZUludGVyc2VjdGlvbnMoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xyXG4gICAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlVOU0VMRUNURUQ6XHJcbiAgICAgICAgICB0aGlzLl91cGRhdGVNb3VzZW92ZXIoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlNFTEVDVEVEOlxyXG4gICAgICAgICAgdGhpcy5fdXBkYXRlTW91c2VvdmVyKCk7XHJcbiAgICAgICAgICB0aGlzLl9odWRTZXJ2aWNlLmNhbWVyYVJvdGF0aW9uKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5EUkFHR0lORzpcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5ST1RBVElORzpcclxuICAgICAgICAgIHRoaXMuX2NsaWNrRHJhZ2dlZCgpO1xyXG4gICAgICAgICAgdGhpcy5fbWFya1NjZW5lVG9VcGRhdGUoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jbGVhckludGVyc2VjdGVkT2JqZWN0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5faW50ZXJzZWN0ZWRNZXNoID0gbnVsbDtcclxuICAgIHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RvZ2dsZVJvdGF0aW9uSHVkSW50ZXJzZWN0aW9uKG9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faHVkU2VydmljZS5pc01vdXNlT3ZlcigpICE9PSBvbikge1xyXG4gICAgICB0aGlzLl9yb3RhdGVNb3VzZU92ZXIgPSBvbjtcclxuICAgICAgdGhpcy5faHVkU2VydmljZS5zZXRNb3VzZU92ZXIob24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXBkYXRlSW50ZXJzZWN0aW9ucygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLl9nZXRJbnRlcnNlY3Rpb25zKFxyXG4gICAgICB0aGlzLl9tb3VzZVBvc2l0aW9uLFxyXG4gICAgICB0aGlzLl9pdGVtU2VydmljZS5nZXRPYmplY3RQbGFuZXMoKSxcclxuICAgICAge29ubHlWaXNpYmxlOiB0cnVlLCBpbmNsdWRlRmxvb3JzOiBmYWxzZX1cclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgd2FsbEludGVyc2VjdCA9IHRoaXMuX3dhbGxJbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbik7XHJcblxyXG4gICAgLy8gb2JqZWN0IGludGVyc2VjdGlvbiBpcyBwcmlvcml0aXplZFxyXG4gICAgaWYgKGludGVyc2VjdHMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAoKHdhbGxJbnRlcnNlY3QgJiYgd2FsbEludGVyc2VjdC5kaXN0YW5jZSArIHRoaXMuaW50ZXJzZWN0T2Zmc2V0Rm9yV2FsbHMgPiBpbnRlcnNlY3RzWzBdLmRpc3RhbmNlKSB8fCAhd2FsbEludGVyc2VjdCkpIHtcclxuICAgICAgdGhpcy5fdG9nZ2xlUm90YXRpb25IdWRJbnRlcnNlY3Rpb24oZmFsc2UpO1xyXG4gICAgICB0aGlzLl9zZXRJbnRlcnNlY3RlZE9iamVjdChpbnRlcnNlY3RzWzBdLm9iamVjdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9jbGVhckludGVyc2VjdGVkT2JqZWN0KCk7XHJcbiAgICAgIGNvbnN0IHNuYXBwZXJBcmVhID0gdGhpcy5faHVkU2VydmljZS5nZXRSb3RhdGlvblNuYXBwZXJBcmVhKCk7XHJcbiAgICAgIGlmIChzbmFwcGVyQXJlYSA9PT0gbnVsbCkge1xyXG4gICAgICAgIC8vIGNoZWNrIGlmIGludGVyc2VjdHMgd2l0aCBjb25maWd1cmFibGUgZmxvb3JcclxuICAgICAgICBjb25zdCBmbG9vckludGVyc2VjdHMgPSB0aGlzLl9nZXRJbnRlcnNlY3Rpb25zKFxyXG4gICAgICAgICAgdGhpcy5fbW91c2VQb3NpdGlvbixcclxuICAgICAgICAgIHRoaXMuX2l0ZW1TZXJ2aWNlLmdldE9iamVjdFBsYW5lcygpLFxyXG4gICAgICAgICAge29ubHlWaXNpYmxlOiB0cnVlLCBpbmNsdWRlRmxvb3I6IHRydWUsIG9ubHlDb25maWd1cmFibGVGbG9vcnM6IHRydWV9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoZmxvb3JJbnRlcnNlY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuX3RvZ2dsZVJvdGF0aW9uSHVkSW50ZXJzZWN0aW9uKGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuX3NldEludGVyc2VjdGVkT2JqZWN0KGZsb29ySW50ZXJzZWN0c1swXS5vYmplY3QpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBodWRJbnRlcnNlY3RzID0gdGhpcy5fZ2V0SW50ZXJzZWN0aW9ucyhcclxuICAgICAgICB0aGlzLl9tb3VzZVBvc2l0aW9uLFxyXG4gICAgICAgIFtzbmFwcGVyQXJlYV0sXHJcbiAgICAgICAge3JlY3Vyc2l2ZTogdHJ1ZX1cclxuICAgICAgKTtcclxuICAgICAgaWYgKGh1ZEludGVyc2VjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuX3RvZ2dsZVJvdGF0aW9uSHVkSW50ZXJzZWN0aW9uKHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3RvZ2dsZVJvdGF0aW9uSHVkSW50ZXJzZWN0aW9uKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gcmV0dXJucyB0aGUgZmlyc3QgaW50ZXJzZWN0aW9uIG9iamVjdFxyXG4gIHByaXZhdGUgX2l0ZW1JbnRlcnNlY3Rpb24odmVjMiwgaXRlbSk6IGFueSB7XHJcbiAgICBsZXQgaW50ZXJzZWN0aW9ucyA9IG51bGw7XHJcbiAgICBpZiAoIWl0ZW0ubWV0YWRhdGEpIHtcclxuICAgICAgaW50ZXJzZWN0aW9ucyA9IHRoaXMuX2dldEludGVyc2VjdGlvbnModmVjMiwgW2l0ZW1dLCB7ZmlsdGVyQnlOb3JtYWxzOiB0cnVlfSk7XHJcbiAgICB9IGVsc2UgaWYgKGlzV2FsbEZsb29yVHlwZShpdGVtLm1ldGFkYXRhLml0ZW1UeXBlKSkge1xyXG4gICAgICBpbnRlcnNlY3Rpb25zID0gdGhpcy5fZ2V0SW50ZXJzZWN0aW9ucyh2ZWMyLCB0aGlzLl9yb29tU2VydmljZS53YWxsRWRnZVBsYW5lcygpLCB7ZmlsdGVyQnlOb3JtYWxzOiB0cnVlfSk7XHJcbiAgICAgIGlmICghaW50ZXJzZWN0aW9ucyB8fCBpbnRlcnNlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIGludGVyc2VjdGlvbnMgPSB0aGlzLl9nZXRJbnRlcnNlY3Rpb25zKHZlYzIsIFt0aGlzLl9mbG9vclNlcnZpY2UuZ3JvdW5kUGxhbmVdLCB7fSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoaXNXYWxsVHlwZShpdGVtLm1ldGFkYXRhLml0ZW1UeXBlKSkge1xyXG4gICAgICBpbnRlcnNlY3Rpb25zID0gdGhpcy5fZ2V0SW50ZXJzZWN0aW9ucyh2ZWMyLCB0aGlzLl9yb29tU2VydmljZS53YWxsRWRnZVBsYW5lcygpLCB7ZmlsdGVyQnlOb3JtYWxzOiB0cnVlfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpbnRlcnNlY3Rpb25zID0gdGhpcy5fZ2V0SW50ZXJzZWN0aW9ucyh2ZWMyLCBbdGhpcy5fZmxvb3JTZXJ2aWNlLmdyb3VuZFBsYW5lXSwge30pO1xyXG4gICAgfVxyXG4gICAgaWYgKGludGVyc2VjdGlvbnMgJiYgaW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBpbnRlcnNlY3Rpb25zWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBmaWx0ZXIgYnkgbm9ybWFscyB3aWxsIG9ubHkgcmV0dXJuIG9iamVjdHMgZmFjaW5nIHRoZSBjYW1lcmFcclxuICBwcml2YXRlIF9nZXRJbnRlcnNlY3Rpb25zKG1vdXNlUG9zOiBWZWN0b3IyLCBvYmplY3RzOiBPYmplY3QzRFtdLCBvcHRpb25zPyk6IEludGVyc2VjdGlvbltdIHtcclxuICAgIGNvbnN0IG1vdXNlVmVjdG9yID0gdGhpcy5fbW91c2VUb1ZlYzMobW91c2VQb3MpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2ludGVyc2VjdGlvblNlcnZpY2UuZ2V0SW50ZXJzZWN0aW9ucyhtb3VzZVZlY3Rvciwgb2JqZWN0cywgb3B0aW9ucyk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3NldE1vdXNlUG9zaXRpb25Gcm9tVG91Y2hFdmVudChldmVudDogVG91Y2hFdmVudCkge1xyXG4gICAgY29uc3QgdG91Y2ggPSBldmVudC50b3VjaGVzWzBdO1xyXG4gICAgaWYgKHRvdWNoKSB7XHJcbiAgICAgIGNvbnN0IGNhbnZhczogYW55ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgICB0aGlzLl9tb3VzZVBvc2l0aW9uLnNldCh0b3VjaC5wYWdlWCAtIChjYW52YXMgPyBjYW52YXMub2Zmc2V0TGVmdCA6IDApLCB0b3VjaC5wYWdlWSAtIChjYW52YXMgPyBjYW52YXMub2Zmc2V0VG9wIDogMCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdG91Y2hTdGFydEV2ZW50KGV2ZW50OiBUb3VjaEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNNb3VzZUV2ZW50QWxsb3dlZChldmVudCkpIHtcclxuXHJcbiAgICAgIGNvbnN0IGxvbmdUb3VjaCA9IG9mKDEpXHJcbiAgICAgICAgLnBpcGUoZGVsYXkodGhpcy5sb25nVG91Y2hEdXJhdGlvbikpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3RvdWNoU3RhcnQpKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl90b3VjaEVuZCkpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3RvdWNoQ2FuY2VsKSk7XHJcbiAgICAgIGxvbmdUb3VjaC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX3VwZGF0ZUludGVyc2VjdGlvbnMoKTtcclxuICAgICAgICBpZiAodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QgJiYgIXRoaXMuX21vdXNlTW92ZWQpIHtcclxuICAgICAgICAgIHRoaXMuX2FkZFRvSXRlbUdyb3VwKHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0LCB0aGlzLl9wcmV2U2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLl9tb3VzZU1vdmVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX21vdXNlRG93biA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLl9zZXRNb3VzZVBvc2l0aW9uRnJvbVRvdWNoRXZlbnQoZXZlbnQpO1xyXG4gICAgICBzd2l0Y2ggKHRoaXMuX3N0YXRlKSB7XHJcbiAgICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuU0VMRUNURUQ6XHJcbiAgICAgICAgICB0aGlzLl91cGRhdGVJbnRlcnNlY3Rpb25zKCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fcm90YXRlTW91c2VPdmVyIHx8IHRoaXMucm90YXRlTm9EcmFnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5ST1RBVElORyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1JbnRlcnNlY3Rpb246IGFueSA9IHRoaXMuX2l0ZW1JbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbiwgdGhpcy5fc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICAgICAgICBpZiAoaXRlbUludGVyc2VjdGlvbikge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3JvdGF0aW9uU3RhcnRQb2ludCA9IGl0ZW1JbnRlcnNlY3Rpb24ucG9pbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QpIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldlNlbGVjdGVkT2JqZWN0ID0gdGhpcy5fc2VsZWN0ZWRPYmplY3Q7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5faW50ZXJzZWN0ZWRPYmplY3QuZml4ZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9zd2l0Y2hTdGF0ZShTY2VuZUV2ZW50U3RhdGUuRFJBR0dJTkcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5ETkQ6XHJcbiAgICAgICAgICB0aGlzLl9vbkRyb3AoZXZlbnQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xlZnRNb3VzZURvd25FdmVudChldmVudD8pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9pc01vdXNlRXZlbnRBbGxvd2VkKGV2ZW50KSkge1xyXG4gICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBjYW52YXM6IEhUTUxFbGVtZW50ID0gZXZlbnQuY3VycmVudFRhcmdldDtcclxuICAgICAgY29uc3QgbW91c2VQb3M6IFZlY3RvcjIgPSBSZWxhdGl2ZVBvc2l0aW9uVXRpbHMuR2V0Q2xpZW50TW91c2VQb3NpdGlvbihldmVudCk7XHJcbiAgICAgIHRoaXMuX29sZE1vdXNlUG9zaXRpb24uc2V0KG1vdXNlUG9zLnggLSAoY2FudmFzID8gY2FudmFzLm9mZnNldExlZnQgOiAwKSwgbW91c2VQb3MueSAtIChjYW52YXMgPyBjYW52YXMub2Zmc2V0VG9wIDogMCkpO1xyXG5cclxuICAgICAgdGhpcy5fbW91c2VNb3ZlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9tb3VzZURvd24gPSB0cnVlO1xyXG5cclxuICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xyXG4gICAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlNFTEVDVEVEOlxyXG4gICAgICAgICAgaWYgKHRoaXMuX3JvdGF0ZU1vdXNlT3Zlcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRPYmplY3QpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9zd2l0Y2hTdGF0ZShTY2VuZUV2ZW50U3RhdGUuUk9UQVRJTkcpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1JbnRlcnNlY3Rpb246IGFueSA9IHRoaXMuX2l0ZW1JbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbiwgdGhpcy5fc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICAgICAgICAgIGlmIChpdGVtSW50ZXJzZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yb3RhdGlvblN0YXJ0UG9pbnQgPSBpdGVtSW50ZXJzZWN0aW9uLnBvaW50O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9pbnRlcnNlY3RlZE9iamVjdCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faW50ZXJzZWN0ZWRNZXNoICYmIHRoaXMuX2ludGVyc2VjdGVkTWVzaC5uYW1lICYmIHRoaXMuX2ludGVyc2VjdGVkTWVzaC5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnY18nKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5EUkFHR0lOR0NPTk5FQ1RPUik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ3JvdXBpbmdNb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFRvSXRlbUdyb3VwKHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0LCB0aGlzLl9zZWxlY3RlZE9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLnJlc2V0T2JqZWN0c1RvR3JvdXAoKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZE9iamVjdCh0aGlzLl9pbnRlcnNlY3RlZE9iamVjdCwgdGhpcy5faW50ZXJzZWN0ZWRNZXNoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkVG9JdGVtR3JvdXAodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QsIHRoaXMuX3NlbGVjdGVkT2JqZWN0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pbnRlcnNlY3RlZE9iamVjdC5maXhlZCAmJiAhdGhpcy5yb3RhdGVOb0RyYWcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5EUkFHR0lORyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5VTlNFTEVDVEVEOlxyXG4gICAgICAgICAgY29uc3QgZmxvb3IgPSB0aGlzLl9mbG9vckludGVyc2VjdGlvbih0aGlzLl9tb3VzZVBvc2l0aW9uKTtcclxuICAgICAgICAgIGlmIChmbG9vcikge1xyXG4gICAgICAgICAgICBpZiAoZmxvb3Iub2JqZWN0LnBhcmVudCAmJiBmbG9vci5vYmplY3QucGFyZW50IGluc3RhbmNlb2YgSXRlbSAmJiBmbG9vci5vYmplY3QucGFyZW50LmNvbmZpZ3VyYWJsZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3NldEludGVyc2VjdGVkT2JqZWN0KGZsb29yLm9iamVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLl9pbnRlcnNlY3RlZE9iamVjdCkge1xyXG4gICAgICAgICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLnJlc2V0T2JqZWN0c1RvR3JvdXAoKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZE9iamVjdCh0aGlzLl9pbnRlcnNlY3RlZE9iamVjdCwgdGhpcy5faW50ZXJzZWN0ZWRNZXNoKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pbnRlcnNlY3RlZE9iamVjdC5maXhlZCkge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLnJvdGF0ZU5vRHJhZykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUludGVyc2VjdGlvbjogYW55ID0gdGhpcy5faXRlbUludGVyc2VjdGlvbih0aGlzLl9tb3VzZVBvc2l0aW9uLCB0aGlzLl9zZWxlY3RlZE9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbUludGVyc2VjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9yb3RhdGlvblN0YXJ0UG9pbnQgPSBpdGVtSW50ZXJzZWN0aW9uLnBvaW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3dpdGNoU3RhdGUoU2NlbmVFdmVudFN0YXRlLlJPVEFUSU5HKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3dpdGNoU3RhdGUoU2NlbmVFdmVudFN0YXRlLkRSQUdHSU5HKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vdmVycmlkZURlZmF1bHRDdXJzb3JTdHlsZShzdHlsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZWZhdWx0Q3Vyc29yU3R5bGUgPSBzdHlsZTtcclxuICAgIHRoaXMuX3NldEN1cnNvclN0eWxlKHRoaXMuX2RlZmF1bHRDdXJzb3JTdHlsZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRHcm91cGluZ01vZGUoZW5hYmxlR3JvdXBpbmc6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2dyb3VwaW5nTW9kZSA9IGVuYWJsZUdyb3VwaW5nO1xyXG4gICAgdGhpcy5fYWRkVG9JdGVtR3JvdXAodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QsIHRoaXMuX3ByZXZTZWxlY3RlZE9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXREcmFnZ2VkRGF0YSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5kcmFnZ2VkRGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsaWNrUHJlc3NlZCh2ZWMyPzogVmVjdG9yMik6IHZvaWQge1xyXG4gICAgY29uc3QgdmVjID0gdmVjMiB8fCB0aGlzLl9tb3VzZVBvc2l0aW9uO1xyXG4gICAgaWYgKHRoaXMuX3NlbGVjdGVkT2JqZWN0KSB7XHJcbiAgICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IHRoaXMuX2l0ZW1JbnRlcnNlY3Rpb24odmVjLCB0aGlzLl9zZWxlY3RlZE9iamVjdCk7XHJcbiAgICAgIGlmIChpbnRlcnNlY3Rpb24pIHtcclxuICAgICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ2dlZEl0ZW0gPSB0aGlzLl9zZWxlY3RlZE9iamVjdDtcclxuICAgICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2Uuc2V0RHJhZ09mZnNldChpbnRlcnNlY3Rpb24ucG9pbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jbGlja0Nvbm5lY3RvclByZXNzZWQodmVjMj86IFZlY3RvcjIpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZlYyA9IHZlYzIgfHwgdGhpcy5fbW91c2VQb3NpdGlvbjtcclxuICAgIGlmICh0aGlzLl9pbnRlcnNlY3RlZE1lc2gpIHtcclxuICAgICAgY29uc3QgaW50ZXJzZWN0aW9ucyA9IHRoaXMuX2dldEludGVyc2VjdGlvbnModmVjLCBbdGhpcy5faW50ZXJzZWN0ZWRNZXNoLCB0aGlzLl9mbG9vclNlcnZpY2UuZ3JvdW5kUGxhbmVdKTtcclxuICAgICAgaWYgKGludGVyc2VjdGlvbnMgJiYgaW50ZXJzZWN0aW9ucy5sZW5ndGggPiAxICYmIGludGVyc2VjdGlvbnMuZmluZChpID0+IGkub2JqZWN0Lm5hbWUgPT09IHRoaXMuX2ludGVyc2VjdGVkTWVzaC5uYW1lKSkge1xyXG4gICAgICAgIGNvbnN0IGdyb3VuZFBsYW5lID0gaW50ZXJzZWN0aW9ucy5maW5kKGkgPT4gaS5vYmplY3QubmFtZSA9PT0gJ2dyb3VuZC1wbGFuZScpO1xyXG4gICAgICAgIGlmIChncm91bmRQbGFuZSkge1xyXG4gICAgICAgICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLnNldERyYWdPZmZzZXQoZ3JvdW5kUGxhbmUucG9pbnQsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsaWNrRHJhZ2dlZCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZWxlY3RlZE9iamVjdCAmJiAhdGhpcy5fc2VsZWN0ZWRPYmplY3QubG9ja2VkKSB7XHJcbiAgICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IHRoaXMuX2l0ZW1JbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbiwgdGhpcy5fc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICBpZiAoaW50ZXJzZWN0aW9uKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzUm90YXRpbmcoKSkge1xyXG4gICAgICAgICAgdGhpcy5fcm90YXRpb25TdGFydFBvaW50ID1cclxuICAgICAgICAgICAgdGhpcy5fcm90YXRpb25TZXJ2aWNlLnJvdGF0ZSh0aGlzLl9zZWxlY3RlZE9iamVjdCwgdGhpcy5fcm90YXRpb25TdGFydFBvaW50LCBpbnRlcnNlY3Rpb24ucG9pbnQsICF0aGlzLnJvdGF0ZU5vRHJhZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5jbGlja0RyYWdnZWQoaW50ZXJzZWN0aW9uKTtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VCdXNTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuQ2xpY2tEcmFnZ2VkKTtcclxuICAgICAgICAgIHRoaXMuX2RlYm91bmNlZFNhdmVTdGF0ZS5uZXh0KCdpdGVtIGRyYWdnZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faHVkU2VydmljZS51cGRhdGUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZHJhZ0Nvbm5lY3RvcigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZWxlY3RlZE9iamVjdCAmJiAhdGhpcy5fc2VsZWN0ZWRPYmplY3QubG9ja2VkKSB7XHJcbiAgICAgIC8vIGNvbnN0IGludGVyc2VjdGlvbnMgPSB0aGlzLl9nZXRJbnRlcnNlY3Rpb25zKHRoaXMuX21vdXNlUG9zaXRpb24sIFt0aGlzLl9mbG9vclNlcnZpY2UuZ3JvdW5kUGxhbmVdLCB7fSk7XHJcbiAgICAgIC8vIGlmIChpbnRlcnNlY3Rpb25zICYmIGludGVyc2VjdGlvbnMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIC8vICAgdGhpcy5fZHJhZ0FuZERyb3BTZXJ2aWNlLmRyYWdDb25uZWN0b3IodGhpcy5faW50ZXJzZWN0ZWRNZXNoLCBpbnRlcnNlY3Rpb25zWzBdLnBvaW50KTtcclxuICAgICAgLy8gfVxyXG4gICAgICB0aGlzLl9kcmFnQW5kRHJvcFNlcnZpY2UuZHJhZ0Nvbm5lY3Rvcih0aGlzLl9pbnRlcnNlY3RlZE1lc2gsIHRoaXMuX21vdXNlVG9WZWMzKHRoaXMuX21vdXNlUG9zaXRpb24pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NoZWNrV2FsbHNBbmRGbG9vcnMoZXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gU2NlbmVFdmVudFN0YXRlLlVOU0VMRUNURUQgJiYgdGhpcy5fbW91c2VvdmVyT2JqZWN0ID09IG51bGwpIHtcclxuICAgICAgY29uc3Qgd2FsbCA9IHRoaXMuX3dhbGxJbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbik7XHJcbiAgICAgIGlmICh3YWxsKSB7XHJcbiAgICAgICAgY29uc3QgZWRnZSA9IHdhbGwub2JqZWN0LnVzZXJEYXRhLmVkZ2U7XHJcbiAgICAgICAgdGhpcy5fcm9vbVNlcnZpY2Uuc2VsZWN0V2FsbChldmVudCwgZWRnZS53YWxsLCBlZGdlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGZsb29yID0gdGhpcy5fZmxvb3JJbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbik7XHJcbiAgICAgIGlmIChmbG9vcikge1xyXG4gICAgICAgIGNvbnN0IHJvb20gPSBmbG9vci5vYmplY3QudXNlckRhdGEucm9vbTtcclxuICAgICAgICB0aGlzLl9yb29tU2VydmljZS5zZWxlY3RGbG9vcihldmVudCwgcm9vbSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF93YWxsSW50ZXJzZWN0aW9uKHZlYzI6IFZlY3RvcjIpOiBJbnRlcnNlY3Rpb24ge1xyXG4gICAgY29uc3QgaW50ZXJzZWN0aW9ucyA9IHRoaXMuX3dhbGxJbnRlcnNlY3Rpb25zKHZlYzIpO1xyXG4gICAgaWYgKGludGVyc2VjdGlvbnMgJiYgaW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBpbnRlcnNlY3Rpb25zWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF93YWxsSW50ZXJzZWN0aW9ucyh2ZWMyOiBWZWN0b3IyKTogSW50ZXJzZWN0aW9uW10ge1xyXG4gICAgY29uc3Qgd2FsbEVkZ2VQbGFuZXMgPSB0aGlzLl9yb29tU2VydmljZS53YWxsRWRnZVBsYW5lcygpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2dldEludGVyc2VjdGlvbnMoXHJcbiAgICAgIHZlYzIsIHdhbGxFZGdlUGxhbmVzLCB7ZmlsdGVyQnlOb3JtYWxzOiB0cnVlfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9lZGdlSW50ZXJzZWN0aW9ucyh2ZWMyOiBWZWN0b3IyKTogSW50ZXJzZWN0aW9uW10ge1xyXG4gICAgY29uc3QgZWRnZXMgPSB0aGlzLl9yb29tU2VydmljZS5mbG9vclBsYW5lcygpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2dldEludGVyc2VjdGlvbnMoXHJcbiAgICAgIHZlYzIsIGVkZ2VzLCB7ZmlsdGVyQnlOb3JtYWxzOiB0cnVlfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9ncm91bmRJbnRlcnNlY3Rpb25zKHZlYzI6IFZlY3RvcjIpOiBJbnRlcnNlY3Rpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZ2V0SW50ZXJzZWN0aW9ucyh2ZWMyLCBbdGhpcy5fZmxvb3JTZXJ2aWNlLmdyb3VuZFBsYW5lXSwge2ZpbHRlckJ5Tm9ybWFsczogdHJ1ZX0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfd2FsbEVkZ2VJbnRlcnNlY3RlZChpbnRlcnNlY3RlZFdhbGxzOiBJbnRlcnNlY3Rpb25bXSwgaW50ZXJzZWN0ZWRFZGdlczogSW50ZXJzZWN0aW9uW10pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHdhbGxzID0gaW50ZXJzZWN0ZWRFZGdlcy5tYXAoKGk6IEludGVyc2VjdGlvbikgPT4gaS5vYmplY3QudXNlckRhdGEud2FsbCk7XHJcbiAgICBjb25zdCBmaWx0ZXJlZFdhbGxzID0gaW50ZXJzZWN0ZWRXYWxscy5maWx0ZXIoKGludGVyc2VjdGVkV2FsbDogSW50ZXJzZWN0aW9uKSA9PiB7XHJcbiAgICAgIGNvbnN0IHdhbGwgPSBpbnRlcnNlY3RlZFdhbGwub2JqZWN0LnVzZXJEYXRhLmVkZ2UgJiYgaW50ZXJzZWN0ZWRXYWxsLm9iamVjdC51c2VyRGF0YS5lZGdlLndhbGw7XHJcbiAgICAgIHJldHVybiB3YWxscy5pbmRleE9mKHdhbGwpICE9PSAtMTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZpbHRlcmVkV2FsbHMubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Zsb29ySW50ZXJzZWN0aW9uKHZlYzI6IFZlY3RvcjIpOiBJbnRlcnNlY3Rpb24ge1xyXG4gICAgY29uc3QgZmxvb3JQbGFuZXMgPSB0aGlzLl9yb29tU2VydmljZS5mbG9vclBsYW5lcygpO1xyXG4gICAgY29uc3QgZmxvb3JJbnRlcnNlY3RzID0gdGhpcy5fZ2V0SW50ZXJzZWN0aW9ucyhcclxuICAgICAgdmVjMiwgZmxvb3JQbGFuZXMsIHtmaWx0ZXJCeU5vcm1hbHM6IGZhbHNlLCBpbmNsdWRlRmxvb3JzOiB0cnVlfSk7XHJcbiAgICBpZiAoZmxvb3JJbnRlcnNlY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIGZsb29ySW50ZXJzZWN0c1swXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcG9pbnRPbkZsb29yKHZlYzI6IFZlY3RvcjIpOiBWZWN0b3IzIHtcclxuICAgIGlmICh0aGlzLl9pbnRlcnNlY3RlZE9iamVjdCAmJlxyXG4gICAgICAhKGlzT25GbG9vclR5cGUodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QudXNlckRhdGEuaXRlbVR5cGUpIHx8IGlzSW5XYWxsVHlwZSh0aGlzLl9pbnRlcnNlY3RlZE9iamVjdC51c2VyRGF0YS5pdGVtVHlwZSkpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaW50ZXJzZWN0ZWRGbG9vciA9IHRoaXMuX2Zsb29ySW50ZXJzZWN0aW9uKHZlYzIpO1xyXG4gICAgaWYgKCFpbnRlcnNlY3RlZEZsb29yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGludGVyc2VjdGVkV2FsbHMgPSB0aGlzLl93YWxsSW50ZXJzZWN0aW9ucyh2ZWMyKTtcclxuICAgIGlmICghaW50ZXJzZWN0ZWRXYWxscy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGludGVyc2VjdGVkRmxvb3IucG9pbnQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpbnRlcnNlY3RlZEVkZ2VzID0gdGhpcy5fZWRnZUludGVyc2VjdGlvbnModmVjMik7XHJcbiAgICBpZiAodGhpcy5fd2FsbEVkZ2VJbnRlcnNlY3RlZChpbnRlcnNlY3RlZFdhbGxzLCBpbnRlcnNlY3RlZEVkZ2VzKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBpbnRlcnNlY3RlZEZsb29yLnBvaW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNNb3VzZUV2ZW50QWxsb3dlZChldmVudD86IEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZXZlbnQgPyAoZXZlbnQudGFyZ2V0ICYmIChldmVudC50YXJnZXQgYXMgRWxlbWVudCkubm9kZU5hbWUgPT09ICdDQU5WQVMnKSA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9tb3VzZU1vdmVFdmVudChldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gU2NlbmVFdmVudFN0YXRlLkRORCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fZHJhZ092ZXJFdmVudC5iaW5kKHRoaXMpKGV2ZW50KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9pc01vdXNlRXZlbnRBbGxvd2VkKGV2ZW50KSkge1xyXG4gICAgICBjb25zdCBtb3VzZVBvczogVmVjdG9yMiA9IGV2ZW50ID8gUmVsYXRpdmVQb3NpdGlvblV0aWxzLkdldENsaWVudE1vdXNlUG9zaXRpb24oZXZlbnQpIDogdGhpcy5fbW91c2VQb3NpdGlvbjtcclxuICAgICAgbGV0IGNhbnZhczogSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY2FudmFzID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9tb3VzZVBvc2l0aW9uLnNldChtb3VzZVBvcy54IC0gKGNhbnZhcyA/IGNhbnZhcy5vZmZzZXRMZWZ0IDogMCksIG1vdXNlUG9zLnkgLSAoY2FudmFzID8gY2FudmFzLm9mZnNldFRvcCA6IDApKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9vbGRNb3VzZVBvc2l0aW9uLnggIT09IG1vdXNlUG9zLnggJiYgdGhpcy5fb2xkTW91c2VQb3NpdGlvbi55ICE9PSBtb3VzZVBvcy55KSB7XHJcbiAgICAgICAgdGhpcy5fbW91c2VNb3ZlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5fbW91c2VEb3duKSB7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlSW50ZXJzZWN0aW9ucygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5pbnRlcnNlY3RlZFdhbGwgPSB0aGlzLl93YWxsSW50ZXJzZWN0aW9uKHRoaXMuX21vdXNlUG9zaXRpb24pO1xyXG4gICAgICAgIHRoaXMuX2RyYWdBbmREcm9wU2VydmljZS5pbnRlcnNlY3RlZEZsb29yID0gdGhpcy5fZmxvb3JJbnRlcnNlY3Rpb24odGhpcy5fbW91c2VQb3NpdGlvbik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnJvdGF0ZU5vRHJhZykge1xyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xzLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBzd2l0Y2ggKHRoaXMuX3N0YXRlKSB7XHJcbiAgICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuVU5TRUxFQ1RFRDpcclxuICAgICAgICAgIHRoaXMuX3VwZGF0ZU1vdXNlb3ZlcigpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuU0VMRUNURUQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5fbW91c2VEb3duICYmIHRoaXMuX21vdXNlTW92ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5faHVkU2VydmljZS5jYW1lcmFSb3RhdGlvbigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fdXBkYXRlTW91c2VvdmVyKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5FWFBMT1JFOlxyXG4gICAgICAgICAgdGhpcy5faHVkU2VydmljZS5zdG9wRXhwbG9yZSgpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX21vdXNlRG93bikge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXRDdXJzb3JTdHlsZSgnbW92ZScpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZXhwbG9yZVByZXNzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9tb3VzZW92ZXJPYmplY3QpIHtcclxuICAgICAgICAgICAgICB0aGlzLl91cGRhdGVFeHBsb3JlUG9pbnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuRFJBR0dJTkc6XHJcbiAgICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuUk9UQVRJTkc6XHJcbiAgICAgICAgICB0aGlzLl9jbGlja0RyYWdnZWQoKTtcclxuICAgICAgICAgIHRoaXMuX21hcmtTY2VuZVRvVXBkYXRlKCk7XHJcbiAgICAgICAgICB0aGlzLl9ldmVudFNlcnZpY2Uub2JqZWN0TW92aW5nT3JSb3RhdGluZy5uZXh0KCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5EUkFHR0lOR0NPTk5FQ1RPUjpcclxuICAgICAgICAgIHRoaXMuX2RyYWdDb25uZWN0b3IoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVFeHBsb3JlUG9pbnQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwb2ludCA9IHRoaXMuX3BvaW50T25GbG9vcih0aGlzLl9tb3VzZVBvc2l0aW9uKTtcclxuICAgIGlmIChwb2ludCkge1xyXG4gICAgICB0aGlzLl9zZXRDdXJzb3JTdHlsZSgncG9pbnRlcicpO1xyXG4gICAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMuX2NhbWVyYS5wb3NpdGlvbi5kaXN0YW5jZVRvKHBvaW50KTtcclxuICAgICAgdGhpcy5faHVkU2VydmljZS5leHBsb3JlRmxvb3JIb3Zlcih0aGlzLl9tb3VzZVBvc2l0aW9uLCBwb2ludCwgZGlzdGFuY2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc2V0Q3Vyc29yU3R5bGUoJ2Nyb3NzaGFpcicpO1xyXG4gICAgICB0aGlzLl9odWRTZXJ2aWNlLnN0b3BFeHBsb3JlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVFeHBsb3JlSW5kaWNhdG9yKCk6IHZvaWQge1xyXG4gICAgdGhpcy5faHVkU2VydmljZS5zdG9wRXhwbG9yZSgpO1xyXG4gICAgY29uc3QgcG9pbnQgPSB0aGlzLl9wb2ludE9uRmxvb3IodGhpcy5fbW91c2VQb3NpdGlvbik7XHJcbiAgICBpZiAocG9pbnQpIHtcclxuICAgICAgdGhpcy5fc2V0Q3Vyc29yU3R5bGUoJ3BvaW50ZXInKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3NldEN1cnNvclN0eWxlKCdjcm9zc2hhaXInKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FjY2VwdERyb3AoZXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIgJiYgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QpIHtcclxuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZWxlYXNlU3RhdGUoZHJhZ2dlZERhdGEpOiB2b2lkIHtcclxuICAgIGlmIChkcmFnZ2VkRGF0YSAmJiBkcmFnZ2VkRGF0YS5pc0NvcHkpIHtcclxuICAgICAgdGhpcy5fc3dpdGNoU3RhdGUoU2NlbmVFdmVudFN0YXRlLlNFTEVDVEVEKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3N3aXRjaFN0YXRlKFNjZW5lRXZlbnRTdGF0ZS5VTlNFTEVDVEVEKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2FkZFRvSXRlbUdyb3VwKG9iamVjdDogSXRlbSwgcHJldlNlbGVjdGVkT2JqZWN0PzogYW55KSB7XHJcbiAgICBjb25zdCBpc0ludGVyc2VjdFdpdGhHcm91cE1lbWJlciA9IG9iamVjdCBpbnN0YW5jZW9mIEl0ZW1Hcm91cCB8fCBvYmplY3QucGFyZW50IGluc3RhbmNlb2YgSXRlbUdyb3VwO1xyXG4gICAgaWYgKCFpc0ludGVyc2VjdFdpdGhHcm91cE1lbWJlciAmJiAhb2JqZWN0LmNvbmZpZ3VyaW5nICYmIHRoaXMuX2Nhbkdyb3VwSXRlbXMob2JqZWN0LCBwcmV2U2VsZWN0ZWRPYmplY3QpKSB7XHJcbiAgICAgIGlmIChwcmV2U2VsZWN0ZWRPYmplY3QpIHtcclxuICAgICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLmFkZElmTm90RXhpc3QocHJldlNlbGVjdGVkT2JqZWN0KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLmFkZE9yUmVtb3ZlSWZFeGlzdChvYmplY3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FuR3JvdXBGbG9vckl0ZW0oaXRlbTogSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEoaXRlbSBpbnN0YW5jZW9mIFdhbGxJdGVtKSB8fCAoaXRlbSBpbnN0YW5jZW9mIEN1c3RvbVdhbGxGbG9vckl0ZW0gJiYgIShpdGVtIGFzIEN1c3RvbVdhbGxGbG9vckl0ZW0pLmN1cnJlbnRXYWxsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Nhbkdyb3VwV2FsbEl0ZW0oaXRlbTogSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgoaXRlbSBpbnN0YW5jZW9mIFdhbGxJdGVtICYmICEoaXRlbSBpbnN0YW5jZW9mIEluV2FsbEl0ZW0pKSB8fFxyXG4gICAgICAoaXRlbSBpbnN0YW5jZW9mIEN1c3RvbVdhbGxGbG9vckl0ZW0gJiYgKGl0ZW0gYXMgQ3VzdG9tV2FsbEZsb29ySXRlbSkuY3VycmVudFdhbGwgIT09IHVuZGVmaW5lZCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FuR3JvdXBJdGVtcyhuZXdJdGVtOiBJdGVtLCBwcmV2aW91c0l0ZW06IEl0ZW0pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jYW5Hcm91cFdhbGxJdGVtKG5ld0l0ZW0pICYmIHRoaXMuX2Nhbkdyb3VwV2FsbEl0ZW0ocHJldmlvdXNJdGVtKSAmJlxyXG4gICAgICAobmV3SXRlbSBhcyBXYWxsSXRlbSkuY3VycmVudFdhbGwgPT09IChwcmV2aW91c0l0ZW0gYXMgV2FsbEl0ZW0pLmN1cnJlbnRXYWxsIHx8XHJcbiAgICAgIHRoaXMuX2Nhbkdyb3VwRmxvb3JJdGVtKG5ld0l0ZW0pICYmIHRoaXMuX2Nhbkdyb3VwRmxvb3JJdGVtKHByZXZpb3VzSXRlbSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zd2l0Y2hTdGF0ZShuZXdTdGF0ZTogU2NlbmVFdmVudFN0YXRlKTogdm9pZCB7XHJcbiAgICBpZiAobmV3U3RhdGUgIT09IHRoaXMuX3N0YXRlKSB7XHJcbiAgICAgIHRoaXMuX29uRXhpdCh0aGlzLl9zdGF0ZSk7XHJcbiAgICAgIHRoaXMuX29uRW50cnkobmV3U3RhdGUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc3RhdGUgPSBuZXdTdGF0ZTtcclxuICAgIHRoaXMuX2h1ZFNlcnZpY2Uuc2V0Um90YXRpbmcodGhpcy5faXNSb3RhdGluZygpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uRW50cnkob25TdGF0ZTogU2NlbmVFdmVudFN0YXRlKTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKG9uU3RhdGUpIHtcclxuICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuVU5TRUxFQ1RFRDpcclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkT2JqZWN0KG51bGwpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xzLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5TRUxFQ1RFRDpcclxuICAgICAgICB0aGlzLl9jb250cm9scy5lbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuUk9UQVRJTkc6XHJcbiAgICAgICAgdGhpcy5fY29udHJvbHMuZW5hYmxlZCA9IHRoaXMuX2FwcFNlcnZpY2Uuc2t1O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5EUkFHR0lORzpcclxuICAgICAgICB0aGlzLl9zZXRDdXJzb3JTdHlsZSgnbW92ZScpO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrUHJlc3NlZCgpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRyb2xzLmVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuRFJBR0dJTkdDT05ORUNUT1I6XHJcbiAgICAgICAgdGhpcy5fY2xpY2tDb25uZWN0b3JQcmVzc2VkKCk7XHJcbiAgICAgICAgdGhpcy5fY29udHJvbHMuZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5FWFBMT1JFOlxyXG4gICAgICAgIHRoaXMuX292ZXJyaWRlRGVmYXVsdEN1cnNvclN0eWxlKCdwb2ludGVyJyk7XHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZE9iamVjdChudWxsKTtcclxuICAgICAgICB0aGlzLl9jYW1lcmFNb3ZlU3ViID0gdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmFNb3ZlbWVudENoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3VwZGF0ZUV4cGxvcmVJbmRpY2F0b3IoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vbkV4aXQob25TdGF0ZTogU2NlbmVFdmVudFN0YXRlKTogdm9pZCB7XHJcbiAgICBzd2l0Y2ggKG9uU3RhdGUpIHtcclxuICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuVU5TRUxFQ1RFRDpcclxuICAgICAgY2FzZSBTY2VuZUV2ZW50U3RhdGUuU0VMRUNURUQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLkRSQUdHSU5HOlxyXG4gICAgICAgIHRoaXMuX3NldEN1cnNvclN0eWxlKHRoaXMuX2RlZmF1bHRDdXJzb3JTdHlsZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgU2NlbmVFdmVudFN0YXRlLlJPVEFUSU5HOlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFNjZW5lRXZlbnRTdGF0ZS5FWFBMT1JFOlxyXG4gICAgICAgIHRoaXMuX292ZXJyaWRlRGVmYXVsdEN1cnNvclN0eWxlKCdhdXRvJyk7XHJcbiAgICAgICAgdGhpcy5faHVkU2VydmljZS5zdG9wRXhwbG9yZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9jYW1lcmFNb3ZlU3ViKSB7XHJcbiAgICAgICAgICB0aGlzLl9jYW1lcmFNb3ZlU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0SW50ZXJzZWN0ZWRPYmplY3QobWVzaDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbnRlcnNlY3RlZE1lc2ggPSBtZXNoO1xyXG4gICAgaWYgKHR5cGVvZiBtZXNoWydnZXRSb290J10gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgdGhpcy5faW50ZXJzZWN0ZWRPYmplY3QgPSBtZXNoLmdldFJvb3QoKTtcclxuICAgIH0gZWxzZSBpZiAobWVzaC5wYXJlbnQpIHtcclxuICAgICAgdGhpcy5fc2V0SW50ZXJzZWN0ZWRPYmplY3QobWVzaC5wYXJlbnQgYXMgSXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSZXZlcnRlZCBjaGFuZ2VzIGZyb20gSU9ORS0zMTM5OVxyXG4gIHByaXZhdGUgX21vdXNlVG9WZWMzKHZlYzI6IFZlY3RvcjIpOiBWZWN0b3IzIHtcclxuICAgIGNvbnN0IHJlbmRlcmVyRWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XHJcbiAgICBjb25zdCBtUG9zaXRpb24gPSBuZXcgVmVjdG9yMihcclxuICAgICAgKHZlYzIueCAvIHJlbmRlcmVyRWxlbWVudC5jbGllbnRXaWR0aCkgKiAyIC0gMSxcclxuICAgICAgLSh2ZWMyLnkgLyByZW5kZXJlckVsZW1lbnQuY2xpZW50SGVpZ2h0KSAqIDIgKyAxXHJcbiAgICApO1xyXG4gICAgY29uc3QgdmVjdG9yID0gbmV3IFZlY3RvcjMobVBvc2l0aW9uLngsIG1Qb3NpdGlvbi55LCAwLjUpO1xyXG4gICAgdmVjdG9yLnVucHJvamVjdCh0aGlzLl9jYW1lcmEpO1xyXG4gICAgcmV0dXJuIHZlY3RvcjtcclxuXHJcbiAgICAvLyBjb25zdCByZW5kZXJlckVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xyXG4gICAgLy8gY29uc3QgbVBvc2l0aW9uID0gbmV3IFZlY3RvcjIoXHJcbiAgICAvLyAgICh2ZWMyLnggLyByZW5kZXJlckVsZW1lbnQuY2xpZW50V2lkdGgpICogMiAtIDEsXHJcbiAgICAvLyAgIC0odmVjMi55IC8gcmVuZGVyZXJFbGVtZW50LmNsaWVudEhlaWdodCkgKiAyICsgMVxyXG4gICAgLy8gKTtcclxuICAgIC8vIGNvbnN0IHZlY3RvciA9IG5ldyBWZWN0b3IzKG1Qb3NpdGlvbi54LCBtUG9zaXRpb24ueSwgMC41KTtcclxuICAgIC8vIHZlY3Rvci51bnByb2plY3QodGhpcy5fY2FtZXJhKTtcclxuICAgIC8vIHJldHVybiB2ZWN0b3I7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRTZWxlY3RPYmplY3Qob2JqZWN0OiBJdGVtIHwgSXRlbUdyb3VwLCBtZXNoPzogTWVzaCk6IHZvaWQge1xyXG4gICAgb2JqZWN0LnNldFNlbGVjdGVkKG1lc2gsIHRoaXMuX21vdXNlVG9WZWMzKHRoaXMuX21vdXNlUG9zaXRpb24pKTtcclxuICAgIHRoaXMuX3NlbGVjdGVkT2JqZWN0ID0gb2JqZWN0O1xyXG4gICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5JdGVtU2VsZWN0ZWQsIG9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVNb3VzZW92ZXIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faW50ZXJzZWN0ZWRPYmplY3QgIT0gbnVsbCkge1xyXG4gICAgICBpZiAodGhpcy5fbW91c2VvdmVyT2JqZWN0ICE9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5fbW91c2VvdmVyT2JqZWN0ICE9PSB0aGlzLl9pbnRlcnNlY3RlZE9iamVjdCkge1xyXG4gICAgICAgICAgdGhpcy5fc2V0T2JqZWN0TW91c2VPZmYodGhpcy5fbW91c2VvdmVyT2JqZWN0KTtcclxuICAgICAgICAgIHRoaXMuX21vdXNlb3Zlck9iamVjdCA9IHRoaXMuX2ludGVyc2VjdGVkT2JqZWN0O1xyXG4gICAgICAgICAgdGhpcy5fc2V0T2JqZWN0TW91c2VPdmVyKHRoaXMuX21vdXNlb3Zlck9iamVjdCwgdGhpcy5faW50ZXJzZWN0ZWRNZXNoKTtcclxuICAgICAgICAgIHRoaXMuX21hcmtTY2VuZVRvVXBkYXRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGRvIG5vdGhpbmcsIG1vdXNlb3ZlciBhbHJlYWR5IHNldFxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9tb3VzZW92ZXJPYmplY3QgPSB0aGlzLl9pbnRlcnNlY3RlZE9iamVjdDtcclxuICAgICAgICB0aGlzLl9zZXRPYmplY3RNb3VzZU92ZXIodGhpcy5fbW91c2VvdmVyT2JqZWN0LCB0aGlzLl9pbnRlcnNlY3RlZE1lc2gpO1xyXG4gICAgICAgIHRoaXMuX3NldEN1cnNvclN0eWxlKCdwb2ludGVyJyk7XHJcbiAgICAgICAgdGhpcy5fbWFya1NjZW5lVG9VcGRhdGUoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9tb3VzZW92ZXJPYmplY3QgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zZXRPYmplY3RNb3VzZU9mZih0aGlzLl9tb3VzZW92ZXJPYmplY3QpO1xyXG4gICAgICB0aGlzLl9zZXRDdXJzb3JTdHlsZSh0aGlzLl9kZWZhdWx0Q3Vyc29yU3R5bGUpO1xyXG4gICAgICB0aGlzLl9tb3VzZW92ZXJPYmplY3QgPSBudWxsO1xyXG4gICAgICB0aGlzLl9tYXJrU2NlbmVUb1VwZGF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0T2JqZWN0TW91c2VPdmVyKG9iamVjdDogSXRlbUdyb3VwIHwgSXRlbSwgbWVzaDogTWVzaCk6IHZvaWQge1xyXG4gICAgaWYgKG9iamVjdC5wYXJlbnQgJiYgb2JqZWN0LnBhcmVudCBpbnN0YW5jZW9mIEl0ZW1Hcm91cCkge1xyXG4gICAgICBvYmplY3QucGFyZW50Lm1vdXNlT3ZlcigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb2JqZWN0Lm1vdXNlT3ZlcihtZXNoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldE9iamVjdE1vdXNlT2ZmKG9iamVjdDogSXRlbUdyb3VwIHwgSXRlbSk6IHZvaWQge1xyXG4gICAgaWYgKG9iamVjdC5wYXJlbnQgJiYgb2JqZWN0LnBhcmVudCBpbnN0YW5jZW9mIEl0ZW1Hcm91cCkge1xyXG4gICAgICBvYmplY3QucGFyZW50Lm1vdXNlT2ZmKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvYmplY3QubW91c2VPZmYoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX21hcmtTY2VuZVRvVXBkYXRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2NlbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldEN1cnNvclN0eWxlKHN0eWxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuY3Vyc29yID0gc3R5bGU7XHJcbiAgfVxyXG59XHJcbiJdfQ==