@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,763 @@
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 * as TWEEN from '@tweenjs/tween.js';
11
+ import * as THREE from 'three';
12
+ import { EventDispatcher } from 'three';
13
+ import { RelativePositionUtils } from '../../../core/utils/relative-position.utils';
14
+ /**
15
+ This file is a modified version of THREE.OrbitControls
16
+ Contributors:
17
+ * @author qiao / https://github.com/qiao
18
+ * @author mrdoob / http://mrdoob.com
19
+ * @author alteredq / http://alteredqualia.com/
20
+ * @author WestLangley / http://github.com/WestLangley
21
+ * @author erich666 / http://erichaines.com
22
+ */
23
+ let Controls;
24
+ Controls = function (camera, domElement) {
25
+ this.camera = camera;
26
+ this.domElement = (domElement !== undefined) ? domElement : document;
27
+ // Set to false to disable this control
28
+ this.enabled = true;
29
+ // Use to handle long touch behaviour
30
+ this.longTouchDuration = 600;
31
+ this.longTouchTimer = null;
32
+ // "target" sets the location of focus, where the control orbits around
33
+ // and where it pans with respect to.
34
+ this.target = new THREE.Vector3();
35
+ // center is old, deprecated; use "target" instead
36
+ this.center = this.target;
37
+ // This option actually enables dollying in and out; left as "zoom" for
38
+ // backwards compatibility
39
+ this.noZoom = false;
40
+ this.zoomSpeed = 1.0;
41
+ // Limits to how far you can dolly in and out
42
+ this.minDistance = 0;
43
+ this.maxDistance = 1500; // Infinity;
44
+ // Set to true to disable this control
45
+ this.noRotate = false;
46
+ this.noRotateHorizontal = false;
47
+ this.noRotateVertical = false;
48
+ this.exploreRotateSpeed = Math.PI / 12;
49
+ this.rotateSpeed = Math.PI / 3;
50
+ this.exploreMode = false;
51
+ this.birdsEyeMode = false;
52
+ this.vrMode = false;
53
+ this.lookAroundMode = false;
54
+ this.useGyroscope = false;
55
+ this.rotateBy = Math.PI / 32;
56
+ this.moveBy = .3;
57
+ // Set to true to disable this control
58
+ this.noPan = false;
59
+ this.keyPanSpeed = 40.0; // pixels moved per arrow key push
60
+ // Set to true to automatically rotate around the target
61
+ this.autoRotate = false;
62
+ this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60
63
+ // How far you can orbit vertically, upper and lower limits.
64
+ // Range is 0 to Math.PI radians.
65
+ this.minPolarAngle = 0; // radians
66
+ this.maxPolarAngle = Math.PI / 2; // radians
67
+ // How far you can orbit horizontally, upper and lower limits.
68
+ // Range is 0 to Math.PI radians.
69
+ this.minAzimuthAngle = -Infinity; // radians
70
+ this.maxAzimuthAngle = Infinity; // radians
71
+ // Set to true to disable use of the keys
72
+ this.noKeys = false;
73
+ // The four arrow keys
74
+ this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };
75
+ // internals
76
+ const scope = this;
77
+ const changeEvent = { type: 'change' };
78
+ const EPS = 0.000001;
79
+ const rotateStart = new THREE.Vector2();
80
+ const rotateEnd = new THREE.Vector2();
81
+ const rotateDelta = new THREE.Vector2();
82
+ const panStart = new THREE.Vector2();
83
+ const panEnd = new THREE.Vector2();
84
+ const panDelta = new THREE.Vector2();
85
+ const dollyStart = new THREE.Vector2();
86
+ const dollyEnd = new THREE.Vector2();
87
+ const dollyDelta = new THREE.Vector2();
88
+ let phiDelta = 0;
89
+ let thetaDelta = 0;
90
+ let scale = 1;
91
+ let pan = new THREE.Vector3();
92
+ // rotation -PI/2 around the x-axis, used to make up for the difference in three.js coordinates and real world
93
+ // when using gyroscope to rotate the camera
94
+ // without it the 'down' direction in the real world would be the same direction as 'forward' in three.js scene
95
+ const worldTransform = new THREE.Quaternion(-Math.sqrt(0.5), 0, 0, Math.sqrt(0.5));
96
+ const twoPI = 2 * Math.PI;
97
+ let worldRotationY = 0;
98
+ const STATE = {
99
+ NONE: -1,
100
+ ROTATE: 0,
101
+ DOLLY: 1,
102
+ PAN: 2,
103
+ TOUCH_ROTATE: 3,
104
+ TOUCH_DOLLY: 4,
105
+ TOUCH_PAN: 5,
106
+ EXPLORE: 7,
107
+ EXPLORE_DRAG: 8,
108
+ BIRDS_EYE: 9,
109
+ BIRDS_EYE_DOLLY: 10,
110
+ BIRDS_EYE_PAN: 11
111
+ };
112
+ let state = STATE.NONE;
113
+ this.controlsActive = function () {
114
+ return (state === STATE.NONE);
115
+ };
116
+ this.setPan = function (vec3) {
117
+ pan = vec3;
118
+ scope.dispatchEvent(changeEvent);
119
+ };
120
+ this.getPan = function () {
121
+ return pan;
122
+ };
123
+ this.panTo = function (vec3) {
124
+ const newTarget = new THREE.Vector3(vec3.x, scope.target.y, vec3.z);
125
+ const delta = scope.target.clone().sub(newTarget);
126
+ pan.sub(delta);
127
+ scope.update();
128
+ };
129
+ this.rotateLeft = function (angle) {
130
+ if (angle === undefined) {
131
+ angle = getAutoRotationAngle();
132
+ }
133
+ if (this.noRotateHorizontal) {
134
+ thetaDelta = 0;
135
+ }
136
+ else {
137
+ thetaDelta -= angle;
138
+ }
139
+ };
140
+ this.rotateUp = function (angle) {
141
+ if (angle === undefined) {
142
+ angle = getAutoRotationAngle();
143
+ }
144
+ if (this.noRotateVertical) {
145
+ phiDelta = 0;
146
+ }
147
+ else {
148
+ phiDelta -= angle;
149
+ }
150
+ };
151
+ // pass in distance in world space to move left
152
+ this.panLeft = function (distance) {
153
+ const panOffset = new THREE.Vector3();
154
+ const te = this.camera.matrix.elements;
155
+ // get X column of matrix
156
+ panOffset.set(te[0], 0, te[2]);
157
+ panOffset.normalize();
158
+ panOffset.multiplyScalar(-distance);
159
+ pan.add(panOffset);
160
+ };
161
+ // pass in distance in world space to move up
162
+ this.panUp = function (distance) {
163
+ const panOffset = new THREE.Vector3();
164
+ const te = this.camera.matrix.elements;
165
+ // get Y column of matrix
166
+ panOffset.set(te[4], 0, te[6]);
167
+ panOffset.normalize();
168
+ panOffset.multiplyScalar(distance);
169
+ pan.add(panOffset);
170
+ };
171
+ // main entry point; pass in Vector2 of change desired in pixel space,
172
+ // right and down are positive
173
+ this.pan = function (delta) {
174
+ const element = scope.domElement === document ? scope.domElement.body : scope.domElement;
175
+ if (scope.camera.fov !== undefined) {
176
+ // perspective
177
+ const position = scope.camera.position;
178
+ const offset = position.clone().sub(scope.target);
179
+ let targetDistance = offset.length();
180
+ // half of the fov is center to top of screen
181
+ targetDistance *= Math.tan((scope.camera.fov / 2) * Math.PI / 180.0);
182
+ // we actually don't use screenWidth, since perspective camera is fixed to screen height
183
+ scope.panLeft(2 * delta.x * targetDistance / element.clientHeight);
184
+ scope.panUp(2 * delta.y * targetDistance / element.clientHeight);
185
+ }
186
+ else if (scope.camera.top !== undefined) {
187
+ // orthographic
188
+ scope.panLeft(delta.x * (scope.camera.right - scope.camera.left) / element.clientWidth);
189
+ scope.panUp(delta.y * (scope.camera.top - scope.camera.bottom) / element.clientHeight);
190
+ }
191
+ else {
192
+ // camera neither orthographic or perspective - warn user
193
+ console.warn('WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.');
194
+ }
195
+ scope.update();
196
+ };
197
+ this.setCamera = function (newCamera) {
198
+ scope.camera = newCamera;
199
+ };
200
+ this.panXY = function (x, y) {
201
+ scope.pan(new THREE.Vector2(x, y));
202
+ };
203
+ this.animateCamera = function (type, change) {
204
+ return __awaiter(this, void 0, void 0, function* () {
205
+ const changing = new THREE.Vector2();
206
+ const tween = new TWEEN.Tween(changing).to(new THREE.Vector2(change, 0), 200);
207
+ tween.easing(TWEEN.Easing.Quadratic.In);
208
+ tween.onUpdate(() => {
209
+ this.updatePositionTarget(this.camera.position, this.target, { [type]: changing.x });
210
+ });
211
+ return new Promise(resolve => tween.onComplete(resolve).start());
212
+ });
213
+ };
214
+ this.animateCameraMovement = function (endPosition, endTarget, endDuration) {
215
+ return __awaiter(this, void 0, void 0, function* () {
216
+ if (!isFinite(endPosition.x) || !isFinite(endPosition.y) || !isFinite(endPosition.z)) {
217
+ return;
218
+ }
219
+ const duration = endDuration !== undefined ? endDuration : .66 * camera.position.distanceTo(endPosition);
220
+ const position = camera.position.clone();
221
+ const target = this.target.clone();
222
+ const targetTween = new TWEEN.Tween(target)
223
+ .to(endTarget, duration)
224
+ .easing(TWEEN.Easing.Quadratic.InOut)
225
+ .onUpdate(() => {
226
+ this.target = target;
227
+ this.update();
228
+ this.dispatchEvent(changeEvent);
229
+ });
230
+ const positionTween = new TWEEN.Tween(position)
231
+ .to(endPosition, duration)
232
+ .easing(TWEEN.Easing.Quadratic.In)
233
+ .onUpdate(() => {
234
+ this.camera.position.copy(position);
235
+ this.update();
236
+ this.dispatchEvent(changeEvent);
237
+ });
238
+ const targetPromise = new Promise(resolve => {
239
+ targetTween
240
+ .onComplete(() => {
241
+ this.update();
242
+ this.dispatchEvent(changeEvent);
243
+ resolve(targetTween);
244
+ })
245
+ .start();
246
+ });
247
+ const positionPromise = new Promise(resolve => {
248
+ positionTween
249
+ .onComplete(() => {
250
+ this.update();
251
+ this.dispatchEvent(changeEvent);
252
+ resolve(positionTween);
253
+ })
254
+ .start();
255
+ });
256
+ return Promise.all([targetPromise, positionPromise]);
257
+ });
258
+ };
259
+ this.cameraLeft = function () {
260
+ return this.animateCamera('rotate', +this.rotateBy);
261
+ };
262
+ this.cameraRight = function () {
263
+ return this.animateCamera('rotate', -this.rotateBy);
264
+ };
265
+ this.cameraForward = function () {
266
+ return this.animateCamera('move', -this.moveBy);
267
+ };
268
+ this.cameraBackward = function () {
269
+ return this.animateCamera('move', +this.moveBy);
270
+ };
271
+ this.dollyIn = function (dollyScale) {
272
+ if (dollyScale === undefined) {
273
+ dollyScale = getZoomScale();
274
+ }
275
+ scale /= dollyScale;
276
+ };
277
+ this.dollyOut = function (dollyScale) {
278
+ if (dollyScale === undefined) {
279
+ dollyScale = getZoomScale();
280
+ }
281
+ scale *= dollyScale;
282
+ };
283
+ this.update = function () {
284
+ this.updatePositionTarget(this.camera.position, this.target);
285
+ };
286
+ this.animateMoveTo = function (target) {
287
+ return __awaiter(this, void 0, void 0, function* () {
288
+ const position = scope.target.clone();
289
+ const distance = target.distanceTo(position);
290
+ const tween = new TWEEN.Tween(position).to(target, distance);
291
+ tween.easing(TWEEN.Easing.Quadratic.Out);
292
+ tween.onUpdate(scope.moveTo.bind(scope, position));
293
+ return new Promise(resolve => tween.onComplete(resolve).start());
294
+ });
295
+ };
296
+ this.moveTo = function (vec3) {
297
+ vec3.setY(scope.target.y);
298
+ const diff = vec3.clone().sub(scope.target);
299
+ const offset = scope.camera.position.clone().sub(scope.target);
300
+ scope.target.add(pan).add(diff);
301
+ scope.camera.position.copy(scope.target).add(offset);
302
+ this.update();
303
+ };
304
+ this.updatePositionTarget = function (position, target, options) {
305
+ const { rotate: thetaDiff = thetaDelta, move: moveDiff = 0 } = options || {};
306
+ // added this line to be able to zoom in further
307
+ // target.y = this.minDistance;
308
+ const offset = position.clone().sub(target);
309
+ // angle from z-axis around y-axis
310
+ let theta = Math.atan2(offset.x, offset.z);
311
+ // angle from y-axis
312
+ let phi = Math.atan2(Math.sqrt(offset.x * offset.x + offset.z * offset.z), offset.y);
313
+ theta += thetaDiff;
314
+ phi += phiDelta;
315
+ let min = this.minAzimuthAngle;
316
+ let max = this.maxAzimuthAngle;
317
+ if (isFinite(min) && isFinite(max)) {
318
+ if (min < -Math.PI) {
319
+ min += twoPI;
320
+ }
321
+ else if (min > Math.PI) {
322
+ min -= twoPI;
323
+ }
324
+ if (max < -Math.PI) {
325
+ max += twoPI;
326
+ }
327
+ else if (max > Math.PI) {
328
+ max -= twoPI;
329
+ }
330
+ if (min <= max) {
331
+ theta = Math.max(min, Math.min(max, theta));
332
+ }
333
+ else {
334
+ theta = theta > (min + max) / 2 ? Math.max(min, theta) : Math.min(max, theta);
335
+ }
336
+ }
337
+ // restrict phi to be between desired limits
338
+ phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, phi));
339
+ // restrict phi to be betwee EPS and PI-EPS
340
+ phi = Math.max(EPS, Math.min(Math.PI - EPS, phi));
341
+ let radius = offset.length() * (moveDiff ? Math.abs(moveDiff) : 1) * scale;
342
+ // restrict radius to be between desired limits
343
+ radius = Math.max(this.minDistance, Math.min(this.maxDistance, radius));
344
+ this.target.add(pan);
345
+ // move target to panned location
346
+ offset.x = radius * Math.sin(phi) * Math.sin(theta);
347
+ offset.y = moveDiff ? 0 : radius * Math.cos(phi);
348
+ offset.z = radius * Math.sin(phi) * Math.cos(theta);
349
+ if (!moveDiff) {
350
+ position.copy(this.target).add(offset);
351
+ }
352
+ else {
353
+ if (moveDiff < 0) {
354
+ this.target.sub(offset);
355
+ position.sub(offset);
356
+ }
357
+ else {
358
+ this.target.add(offset);
359
+ position.add(offset);
360
+ }
361
+ }
362
+ if (this.exploreMode && this.useGyroscope && !this.lookAroundMode) {
363
+ const lookVector = new THREE.Vector3(this.target.x, camera.position.y, this.target.z).sub(camera.position);
364
+ worldRotationY = Math.atan2(lookVector.x, lookVector.z);
365
+ }
366
+ else {
367
+ this.camera.lookAt(this.target);
368
+ }
369
+ thetaDelta = 0;
370
+ phiDelta = 0;
371
+ scale = 1;
372
+ pan.set(0, 0, 0);
373
+ scope.dispatchEvent(changeEvent);
374
+ };
375
+ this.setExploreMode = function (on = true) {
376
+ this.exploreMode = on;
377
+ state = on ? STATE.EXPLORE : STATE.NONE;
378
+ };
379
+ this.setExploreDragMode = function (on = true) {
380
+ state = on ? STATE.EXPLORE_DRAG : STATE.EXPLORE;
381
+ };
382
+ this.setBirdsEyeMode = function (on = true) {
383
+ this.birdsEyeMode = on;
384
+ state = on ? STATE.BIRDS_EYE : STATE.NONE;
385
+ };
386
+ this.setVrMode = function (on = true) {
387
+ this.vrMode = on;
388
+ };
389
+ function calculateCameraQuaternion(alpha, beta, gamma) {
390
+ // get device rotation in euler angles from gyroscope
391
+ // https://developers.google.com/web/fundamentals/native-hardware/device-orientation/
392
+ const deviceEuler = new THREE.Euler(beta, alpha + worldRotationY, -gamma, 'YXZ');
393
+ // create result quaternion from euler angles
394
+ const result = new THREE.Quaternion();
395
+ result.setFromEuler(deviceEuler);
396
+ // calculate necessary rotation to make up for different screen orientation
397
+ // window.orientation is 0 in portrait mode, 90 or -90 in respective landscape modes
398
+ const minusHalfAngle = -THREE.MathUtils.degToRad(Number(window.orientation)) / 2;
399
+ const screenTransform = new THREE.Quaternion(0, Math.sin(minusHalfAngle), 0, Math.cos(minusHalfAngle));
400
+ result.multiply(screenTransform);
401
+ // rotate result quaternion to make up difference in world coordinates
402
+ result.multiply(worldTransform);
403
+ return result;
404
+ }
405
+ function getAutoRotationAngle() {
406
+ return 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;
407
+ }
408
+ function getZoomScale() {
409
+ return Math.pow(0.95, scope.zoomSpeed);
410
+ }
411
+ function onMouseDown(event) {
412
+ if (!isMouseEventAllowed(event)) {
413
+ return;
414
+ }
415
+ event.preventDefault();
416
+ const mousePos = RelativePositionUtils.GetClientMousePosition(event);
417
+ if (state === STATE.BIRDS_EYE ||
418
+ state === STATE.BIRDS_EYE_DOLLY ||
419
+ state === STATE.BIRDS_EYE_PAN) {
420
+ state = STATE.BIRDS_EYE_PAN;
421
+ panStart.set(mousePos.x, mousePos.y);
422
+ scope.domElement.addEventListener('mousemove', onMouseMove, false);
423
+ scope.domElement.addEventListener('mouseup', onMouseUp, false);
424
+ return;
425
+ }
426
+ if (event.button === 0) {
427
+ if (scope.noRotate === true) {
428
+ return;
429
+ }
430
+ if (state !== STATE.EXPLORE && state !== STATE.EXPLORE_DRAG) {
431
+ state = STATE.ROTATE;
432
+ }
433
+ rotateStart.set(mousePos.x, mousePos.y);
434
+ }
435
+ else if (event.button === 1) {
436
+ if (scope.noZoom === true) {
437
+ return;
438
+ }
439
+ state = STATE.DOLLY;
440
+ dollyStart.set(mousePos.x, mousePos.y);
441
+ }
442
+ else if (event.button === 2) {
443
+ if (scope.noPan === true) {
444
+ return;
445
+ }
446
+ state = STATE.PAN;
447
+ panStart.set(mousePos.x, mousePos.y);
448
+ }
449
+ // Greggman fix: https://github.com/greggman/three.js/commit/fde9f9917d6d8381f06bf22cdff766029d1761be
450
+ scope.domElement.addEventListener('mousemove', onMouseMove, false);
451
+ scope.domElement.addEventListener('mouseup', onMouseUp, false);
452
+ }
453
+ function setRotationParameters(endPoint, direction, speed) {
454
+ const element = scope.domElement === document ? scope.domElement.body : scope.domElement;
455
+ rotateEnd.copy(endPoint);
456
+ rotateDelta.subVectors(rotateEnd, rotateStart);
457
+ // rotating across whole screen goes 360 degrees around
458
+ scope.rotateLeft(2 * Math.PI * direction * rotateDelta.x / element.clientWidth * speed);
459
+ // rotating up and down along whole screen attempts to go 360, but limited to 180
460
+ scope.rotateUp(2 * Math.PI * direction * rotateDelta.y / element.clientHeight * speed);
461
+ rotateStart.copy(rotateEnd);
462
+ }
463
+ function isMouseEventAllowed(event) {
464
+ const isCanvas = event ? (event.target && event.target.nodeName === 'CANVAS') : true;
465
+ return isCanvas && scope.enabled;
466
+ }
467
+ function originateOnCanvas(event) {
468
+ return event && event.target && event.target === document.body;
469
+ }
470
+ function onMouseMove(event) {
471
+ return __awaiter(this, void 0, void 0, function* () {
472
+ if (!isMouseEventAllowed(event)) {
473
+ return;
474
+ }
475
+ event.preventDefault();
476
+ const mousePos = RelativePositionUtils.GetClientMousePosition(event);
477
+ if (state === STATE.ROTATE) {
478
+ if (scope.noRotate === true) {
479
+ return;
480
+ }
481
+ setRotationParameters(new THREE.Vector2(mousePos.x, mousePos.y), 1, scope.rotateSpeed);
482
+ scope.update();
483
+ }
484
+ else if (state === STATE.EXPLORE) {
485
+ if (scope.noRotate === true) {
486
+ return;
487
+ }
488
+ setRotationParameters(new THREE.Vector2(mousePos.x, mousePos.y), -1, scope.exploreRotateSpeed);
489
+ scope.update();
490
+ }
491
+ else if (state === STATE.EXPLORE_DRAG) {
492
+ scope.update();
493
+ return;
494
+ }
495
+ else if (state === STATE.DOLLY || state === STATE.BIRDS_EYE_DOLLY) {
496
+ if (scope.noZoom === true) {
497
+ return;
498
+ }
499
+ dollyEnd.set(mousePos.x, mousePos.y);
500
+ dollyDelta.subVectors(dollyEnd, dollyStart);
501
+ if (dollyDelta.y > 0) {
502
+ scope.dollyIn();
503
+ }
504
+ else {
505
+ scope.dollyOut();
506
+ }
507
+ dollyStart.copy(dollyEnd);
508
+ scope.update();
509
+ }
510
+ else if (state === STATE.PAN || state === STATE.BIRDS_EYE_PAN) {
511
+ if (scope.noPan === true) {
512
+ return;
513
+ }
514
+ panEnd.set(mousePos.x, mousePos.y);
515
+ panDelta.subVectors(panEnd, panStart);
516
+ scope.pan(panDelta);
517
+ panStart.copy(panEnd);
518
+ scope.update();
519
+ }
520
+ });
521
+ }
522
+ function onMouseUp(event) {
523
+ if (!scope.enabled) {
524
+ return;
525
+ }
526
+ // Greggman fix: https://github.com/greggman/three.js/commit/fde9f9917d6d8381f06bf22cdff766029d1761be
527
+ scope.domElement.removeEventListener('mousemove', onMouseMove, false);
528
+ scope.domElement.removeEventListener('mouseup', onMouseUp, false);
529
+ if (state === STATE.EXPLORE) {
530
+ return;
531
+ }
532
+ if (state === STATE.EXPLORE_DRAG) {
533
+ state = STATE.EXPLORE;
534
+ return;
535
+ }
536
+ if (state === STATE.BIRDS_EYE || state === STATE.BIRDS_EYE_PAN || state === STATE.BIRDS_EYE_DOLLY) {
537
+ state = STATE.BIRDS_EYE;
538
+ return;
539
+ }
540
+ state = STATE.NONE;
541
+ }
542
+ function onMouseWheel(event) {
543
+ if (!scope.enabled || scope.noZoom === true) {
544
+ return;
545
+ }
546
+ event.preventDefault();
547
+ event.stopPropagation();
548
+ if (event.deltaY < 0) {
549
+ scope.dollyOut();
550
+ }
551
+ else {
552
+ scope.dollyIn();
553
+ }
554
+ scope.update();
555
+ }
556
+ function onKeyDown(event) {
557
+ if (scope.enabled === false) {
558
+ return;
559
+ }
560
+ if (scope.noKeys === true) {
561
+ return;
562
+ }
563
+ if (scope.noPan === true) {
564
+ return;
565
+ }
566
+ if (!originateOnCanvas(event)) {
567
+ return;
568
+ }
569
+ switch (event.keyCode) {
570
+ case scope.keys.UP:
571
+ if (scope.exploreMode) {
572
+ scope.cameraForward();
573
+ }
574
+ else {
575
+ scope.pan(new THREE.Vector2(0, scope.keyPanSpeed));
576
+ }
577
+ break;
578
+ case scope.keys.BOTTOM:
579
+ if (scope.exploreMode) {
580
+ scope.cameraBackward();
581
+ }
582
+ else {
583
+ scope.pan(new THREE.Vector2(0, -scope.keyPanSpeed));
584
+ }
585
+ break;
586
+ case scope.keys.LEFT:
587
+ if (scope.exploreMode) {
588
+ scope.cameraLeft();
589
+ }
590
+ else {
591
+ scope.pan(new THREE.Vector2(scope.keyPanSpeed, 0));
592
+ }
593
+ break;
594
+ case scope.keys.RIGHT:
595
+ if (scope.exploreMode) {
596
+ scope.cameraRight();
597
+ }
598
+ else {
599
+ scope.pan(new THREE.Vector2(-scope.keyPanSpeed, 0));
600
+ }
601
+ break;
602
+ }
603
+ }
604
+ function touchstart(event) {
605
+ if (!isMouseEventAllowed(event)) {
606
+ return;
607
+ }
608
+ if (state === STATE.BIRDS_EYE ||
609
+ state === STATE.BIRDS_EYE_DOLLY ||
610
+ state === STATE.BIRDS_EYE_PAN) {
611
+ if (event.touches.length === 1 || event.touches.length === 3) {
612
+ state = STATE.BIRDS_EYE_PAN;
613
+ panStart.set(event.touches[0].pageX, event.touches[0].pageY);
614
+ }
615
+ else if (event.touches.length === 2) {
616
+ state = STATE.BIRDS_EYE_DOLLY;
617
+ const dx = event.touches[0].pageX - event.touches[1].pageX;
618
+ const dy = event.touches[0].pageY - event.touches[1].pageY;
619
+ const distance = Math.sqrt(dx * dx + dy * dy);
620
+ dollyStart.set(0, distance);
621
+ }
622
+ return;
623
+ }
624
+ switch (event.touches.length) {
625
+ case 1: // one-fingered touch: rotate
626
+ if (scope.noRotate === true) {
627
+ return;
628
+ }
629
+ scope.longTouchTimer = setTimeout(() => {
630
+ scope.lookAroundMode = true;
631
+ }, scope.longTouchDuration);
632
+ state = STATE.TOUCH_ROTATE;
633
+ rotateStart.set(event.touches[0].pageX, event.touches[0].pageY);
634
+ break;
635
+ case 2: // two-fingered touch: dolly
636
+ if (scope.noZoom === true) {
637
+ return;
638
+ }
639
+ state = STATE.TOUCH_DOLLY;
640
+ const dx = event.touches[0].pageX - event.touches[1].pageX;
641
+ const dy = event.touches[0].pageY - event.touches[1].pageY;
642
+ const distance = Math.sqrt(dx * dx + dy * dy);
643
+ dollyStart.set(0, distance);
644
+ break;
645
+ case 3: // three-fingered touch: pan
646
+ if (scope.noPan === true) {
647
+ return;
648
+ }
649
+ state = STATE.TOUCH_PAN;
650
+ panStart.set(event.touches[0].pageX, event.touches[0].pageY);
651
+ break;
652
+ default:
653
+ state = STATE.NONE;
654
+ }
655
+ }
656
+ function touchmove(event) {
657
+ if (!isMouseEventAllowed(event)) {
658
+ return;
659
+ }
660
+ clearTimeout(scope.longTouchTimer);
661
+ event.preventDefault();
662
+ event.stopPropagation();
663
+ const element = scope.domElement === document ? scope.domElement.body : scope.domElement;
664
+ // disable use of two or three finger touch gestures in explore mode
665
+ const touchCountToProcess = scope.exploreMode ? 1 :
666
+ state === STATE.BIRDS_EYE_PAN && event.touches.length === 1 ? 3 :
667
+ event.touches.length;
668
+ switch (touchCountToProcess) {
669
+ case 1: // one-fingered touch: rotate
670
+ if (scope.noRotate === true) {
671
+ return;
672
+ }
673
+ if (state !== STATE.TOUCH_ROTATE) {
674
+ return;
675
+ }
676
+ rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);
677
+ rotateDelta.subVectors(rotateEnd, rotateStart);
678
+ const rotationSpeed = scope.exploreMode
679
+ ? scope.exploreRotateSpeed
680
+ : scope.rotateSpeed;
681
+ // rotating across whole screen goes 360 degrees around
682
+ scope.rotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * rotationSpeed);
683
+ // rotating up and down along whole screen attempts to go 360, but limited to 180
684
+ scope.rotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * rotationSpeed);
685
+ rotateStart.copy(rotateEnd);
686
+ break;
687
+ case 2: // two-fingered touch: dolly
688
+ if (scope.noZoom === true) {
689
+ return;
690
+ }
691
+ if (state !== STATE.TOUCH_DOLLY && state !== STATE.BIRDS_EYE_DOLLY) {
692
+ return;
693
+ }
694
+ const dx = event.touches[0].pageX - event.touches[1].pageX;
695
+ const dy = event.touches[0].pageY - event.touches[1].pageY;
696
+ const distance = Math.sqrt(dx * dx + dy * dy);
697
+ dollyEnd.set(0, distance);
698
+ dollyDelta.subVectors(dollyEnd, dollyStart);
699
+ if (dollyDelta.y > 0) {
700
+ scope.dollyOut();
701
+ }
702
+ else {
703
+ scope.dollyIn();
704
+ }
705
+ dollyStart.copy(dollyEnd);
706
+ break;
707
+ case 3: // three-fingered touch: pan
708
+ if (scope.noPan === true) {
709
+ return;
710
+ }
711
+ if (state !== STATE.TOUCH_PAN && state !== STATE.BIRDS_EYE_PAN) {
712
+ return;
713
+ }
714
+ panEnd.set(event.touches[0].pageX, event.touches[0].pageY);
715
+ panDelta.subVectors(panEnd, panStart);
716
+ scope.pan(panDelta);
717
+ panStart.copy(panEnd);
718
+ break;
719
+ default:
720
+ state = STATE.NONE;
721
+ }
722
+ scope.update();
723
+ }
724
+ function touchend(event) {
725
+ if (!scope.enabled) {
726
+ return;
727
+ }
728
+ clearTimeout(scope.longTouchTimer);
729
+ scope.lookAroundMode = false;
730
+ if (state === STATE.BIRDS_EYE || state === STATE.BIRDS_EYE_PAN || state === STATE.BIRDS_EYE_DOLLY) {
731
+ state = STATE.BIRDS_EYE;
732
+ return;
733
+ }
734
+ state = STATE.NONE;
735
+ }
736
+ function onDeviceMove(event) {
737
+ if (!scope.exploreMode || scope.vrMode || scope.lookAroundMode) {
738
+ return;
739
+ }
740
+ const alpha = THREE.MathUtils.degToRad(event.alpha || 0);
741
+ const beta = THREE.MathUtils.degToRad(event.beta || 0);
742
+ const gamma = THREE.MathUtils.degToRad(event.gamma || 0);
743
+ if (alpha !== 0 && beta !== 0 && gamma !== 0) {
744
+ scope.useGyroscope = true;
745
+ const cameraQuaternion = calculateCameraQuaternion(alpha, beta, gamma);
746
+ camera.quaternion.slerp(cameraQuaternion, 0.5); // smooth using spherical linear interpolation
747
+ scope.dispatchEvent(changeEvent);
748
+ }
749
+ }
750
+ this.domElement.addEventListener('contextmenu', function (event) {
751
+ event.preventDefault();
752
+ }, false);
753
+ this.domElement.addEventListener('mousedown', onMouseDown, false);
754
+ this.domElement.addEventListener('wheel', onMouseWheel, false);
755
+ this.domElement.addEventListener('touchstart', touchstart, false);
756
+ this.domElement.addEventListener('touchend', touchend, false);
757
+ this.domElement.addEventListener('touchmove', touchmove, false);
758
+ window.addEventListener('deviceorientation', onDeviceMove, false);
759
+ window.addEventListener('keydown', onKeyDown, false);
760
+ };
761
+ Controls.prototype = Object.create(EventDispatcher.prototype);
762
+ export { Controls };
763
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2xpZW50L2FwcC9wbHVnaW5zL2NvcmUzZC9zZXJ2aWNlL2NvbnRyb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxLQUFLLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUN0QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSw2Q0FBNkMsQ0FBQztBQUVsRjs7Ozs7Ozs7R0FRRztBQUNILElBQUksUUFBc0MsQ0FBQztBQUMzQyxRQUFRLEdBQUcsVUFBVSxNQUFNLEVBQUUsVUFBVTtJQUVyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUVyRSx1Q0FBdUM7SUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFFcEIscUNBQXFDO0lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUM7SUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFFM0IsdUVBQXVFO0lBQ3ZFLHFDQUFxQztJQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xDLGtEQUFrRDtJQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFFMUIsdUVBQXVFO0lBQ3ZFLDBCQUEwQjtJQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEdB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LENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFDRixRQUFRLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBRTlELE9BQU8sRUFBQyxRQUFRLEVBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRXRUVOIGZyb20gJ0B0d2VlbmpzL3R3ZWVuLmpzJztcclxuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0V2ZW50RGlzcGF0Y2hlcn0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1JlbGF0aXZlUG9zaXRpb25VdGlsc30gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlscy9yZWxhdGl2ZS1wb3NpdGlvbi51dGlscyc7XHJcblxyXG4vKipcclxuIFRoaXMgZmlsZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgVEhSRUUuT3JiaXRDb250cm9sc1xyXG4gQ29udHJpYnV0b3JzOlxyXG4gKiBAYXV0aG9yIHFpYW8gLyBodHRwczovL2dpdGh1Yi5jb20vcWlhb1xyXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tXHJcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXHJcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxyXG4gKiBAYXV0aG9yIGVyaWNoNjY2IC8gaHR0cDovL2VyaWNoYWluZXMuY29tXHJcbiAqL1xyXG5sZXQgQ29udHJvbHM6IChjYW1lcmEsIGRvbUVsZW1lbnQpID0+IHZvaWQ7XHJcbkNvbnRyb2xzID0gZnVuY3Rpb24gKGNhbWVyYSwgZG9tRWxlbWVudCkge1xyXG5cclxuICB0aGlzLmNhbWVyYSA9IGNhbWVyYTtcclxuICB0aGlzLmRvbUVsZW1lbnQgPSAoZG9tRWxlbWVudCAhPT0gdW5kZWZpbmVkKSA/IGRvbUVsZW1lbnQgOiBkb2N1bWVudDtcclxuXHJcbiAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgdGhpcyBjb250cm9sXHJcbiAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcclxuXHJcbiAgLy8gVXNlIHRvIGhhbmRsZSBsb25nIHRvdWNoIGJlaGF2aW91clxyXG4gIHRoaXMubG9uZ1RvdWNoRHVyYXRpb24gPSA2MDA7XHJcbiAgdGhpcy5sb25nVG91Y2hUaW1lciA9IG51bGw7XHJcblxyXG4gIC8vIFwidGFyZ2V0XCIgc2V0cyB0aGUgbG9jYXRpb24gb2YgZm9jdXMsIHdoZXJlIHRoZSBjb250cm9sIG9yYml0cyBhcm91bmRcclxuICAvLyBhbmQgd2hlcmUgaXQgcGFucyB3aXRoIHJlc3BlY3QgdG8uXHJcbiAgdGhpcy50YXJnZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gIC8vIGNlbnRlciBpcyBvbGQsIGRlcHJlY2F0ZWQ7IHVzZSBcInRhcmdldFwiIGluc3RlYWRcclxuICB0aGlzLmNlbnRlciA9IHRoaXMudGFyZ2V0O1xyXG5cclxuICAvLyBUaGlzIG9wdGlvbiBhY3R1YWxseSBlbmFibGVzIGRvbGx5aW5nIGluIGFuZCBvdXQ7IGxlZnQgYXMgXCJ6b29tXCIgZm9yXHJcbiAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICB0aGlzLm5vWm9vbSA9IGZhbHNlO1xyXG4gIHRoaXMuem9vbVNwZWVkID0gMS4wO1xyXG4gIC8vIExpbWl0cyB0byBob3cgZmFyIHlvdSBjYW4gZG9sbHkgaW4gYW5kIG91dFxyXG4gIHRoaXMubWluRGlzdGFuY2UgPSAwO1xyXG4gIHRoaXMubWF4RGlzdGFuY2UgPSAxNTAwOyAvLyBJbmZpbml0eTtcclxuXHJcbiAgLy8gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSB0aGlzIGNvbnRyb2xcclxuICB0aGlzLm5vUm90YXRlID0gZmFsc2U7XHJcbiAgdGhpcy5ub1JvdGF0ZUhvcml6b250YWwgPSBmYWxzZTtcclxuICB0aGlzLm5vUm90YXRlVmVydGljYWwgPSBmYWxzZTtcclxuICB0aGlzLmV4cGxvcmVSb3RhdGVTcGVlZCA9IE1hdGguUEkgLyAxMjtcclxuICB0aGlzLnJvdGF0ZVNwZWVkID0gTWF0aC5QSSAvIDM7XHJcblxyXG4gIHRoaXMuZXhwbG9yZU1vZGUgPSBmYWxzZTtcclxuICB0aGlzLmJpcmRzRXllTW9kZSA9IGZhbHNlO1xyXG4gIHRoaXMudnJNb2RlID0gZmFsc2U7XHJcbiAgdGhpcy5sb29rQXJvdW5kTW9kZSA9IGZhbHNlO1xyXG5cclxuICB0aGlzLnVzZUd5cm9zY29wZSA9IGZhbHNlO1xyXG4gIHRoaXMucm90YXRlQnkgPSBNYXRoLlBJIC8gMzI7XHJcbiAgdGhpcy5tb3ZlQnkgPSAuMztcclxuXHJcbiAgLy8gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSB0aGlzIGNvbnRyb2xcclxuICB0aGlzLm5vUGFuID0gZmFsc2U7XHJcbiAgdGhpcy5rZXlQYW5TcGVlZCA9IDQwLjA7XHQvLyBwaXhlbHMgbW92ZWQgcGVyIGFycm93IGtleSBwdXNoXHJcblxyXG4gIC8vIFNldCB0byB0cnVlIHRvIGF1dG9tYXRpY2FsbHkgcm90YXRlIGFyb3VuZCB0aGUgdGFyZ2V0XHJcbiAgdGhpcy5hdXRvUm90YXRlID0gZmFsc2U7XHJcbiAgdGhpcy5hdXRvUm90YXRlU3BlZWQgPSAyLjA7IC8vIDMwIHNlY29uZHMgcGVyIHJvdW5kIHdoZW4gZnBzIGlzIDYwXHJcblxyXG4gIC8vIEhvdyBmYXIgeW91IGNhbiBvcmJpdCB2ZXJ0aWNhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLlxyXG4gIC8vIFJhbmdlIGlzIDAgdG8gTWF0aC5QSSByYWRpYW5zLlxyXG4gIHRoaXMubWluUG9sYXJBbmdsZSA9IDA7IC8vIHJhZGlhbnNcclxuICB0aGlzLm1heFBvbGFyQW5nbGUgPSBNYXRoLlBJIC8gMjsgLy8gcmFkaWFuc1xyXG5cclxuICAvLyBIb3cgZmFyIHlvdSBjYW4gb3JiaXQgaG9yaXpvbnRhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLlxyXG4gIC8vIFJhbmdlIGlzIDAgdG8gTWF0aC5QSSByYWRpYW5zLlxyXG4gIHRoaXMubWluQXppbXV0aEFuZ2xlID0gLSBJbmZpbml0eTsgLy8gcmFkaWFuc1xyXG4gIHRoaXMubWF4QXppbXV0aEFuZ2xlID0gSW5maW5pdHk7IC8vIHJhZGlhbnNcclxuXHJcbiAgLy8gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSB1c2Ugb2YgdGhlIGtleXNcclxuICB0aGlzLm5vS2V5cyA9IGZhbHNlO1xyXG4gIC8vIFRoZSBmb3VyIGFycm93IGtleXNcclxuICB0aGlzLmtleXMgPSB7TEVGVDogMzcsIFVQOiAzOCwgUklHSFQ6IDM5LCBCT1RUT006IDQwfTtcclxuXHJcbiAgLy8gaW50ZXJuYWxzXHJcblxyXG4gIGNvbnN0IHNjb3BlID0gdGhpcztcclxuXHJcbiAgY29uc3QgY2hhbmdlRXZlbnQgPSB7dHlwZTogJ2NoYW5nZSd9O1xyXG5cclxuICBjb25zdCBFUFMgPSAwLjAwMDAwMTtcclxuXHJcbiAgY29uc3Qgcm90YXRlU3RhcnQgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG4gIGNvbnN0IHJvdGF0ZUVuZCA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XHJcbiAgY29uc3Qgcm90YXRlRGVsdGEgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG5cclxuICBjb25zdCBwYW5TdGFydCA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XHJcbiAgY29uc3QgcGFuRW5kID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICBjb25zdCBwYW5EZWx0YSA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XHJcblxyXG4gIGNvbnN0IGRvbGx5U3RhcnQgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG4gIGNvbnN0IGRvbGx5RW5kID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICBjb25zdCBkb2xseURlbHRhID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuXHJcbiAgbGV0IHBoaURlbHRhID0gMDtcclxuICBsZXQgdGhldGFEZWx0YSA9IDA7XHJcbiAgbGV0IHNjYWxlID0gMTtcclxuICBsZXQgcGFuID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuXHJcbiAgLy8gcm90YXRpb24gLVBJLzIgYXJvdW5kIHRoZSB4LWF4aXMsIHVzZWQgdG8gbWFrZSB1cCBmb3IgdGhlIGRpZmZlcmVuY2UgaW4gdGhyZWUuanMgY29vcmRpbmF0ZXMgYW5kIHJlYWwgd29ybGRcclxuICAvLyB3aGVuIHVzaW5nIGd5cm9zY29wZSB0byByb3RhdGUgdGhlIGNhbWVyYVxyXG4gIC8vIHdpdGhvdXQgaXQgdGhlICdkb3duJyBkaXJlY3Rpb24gaW4gdGhlIHJlYWwgd29ybGQgd291bGQgYmUgdGhlIHNhbWUgZGlyZWN0aW9uIGFzICdmb3J3YXJkJyBpbiB0aHJlZS5qcyBzY2VuZVxyXG4gIGNvbnN0IHdvcmxkVHJhbnNmb3JtID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oLU1hdGguc3FydCgwLjUpLCAwLCAwLCBNYXRoLnNxcnQoMC41KSk7XHJcbiAgY29uc3QgdHdvUEkgPSAyICogTWF0aC5QSTtcclxuICBsZXQgd29ybGRSb3RhdGlvblkgPSAwO1xyXG5cclxuICBjb25zdCBTVEFURSA9IHtcclxuICAgIE5PTkU6IC0xLFxyXG4gICAgUk9UQVRFOiAwLFxyXG4gICAgRE9MTFk6IDEsXHJcbiAgICBQQU46IDIsXHJcbiAgICBUT1VDSF9ST1RBVEU6IDMsXHJcbiAgICBUT1VDSF9ET0xMWTogNCxcclxuICAgIFRPVUNIX1BBTjogNSxcclxuICAgIEVYUExPUkU6IDcsXHJcbiAgICBFWFBMT1JFX0RSQUc6IDgsXHJcbiAgICBCSVJEU19FWUU6IDksXHJcbiAgICBCSVJEU19FWUVfRE9MTFk6IDEwLFxyXG4gICAgQklSRFNfRVlFX1BBTjogMTFcclxuICB9O1xyXG5cclxuICBsZXQgc3RhdGUgPSBTVEFURS5OT05FO1xyXG5cclxuICB0aGlzLmNvbnRyb2xzQWN0aXZlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIChzdGF0ZSA9PT0gU1RBVEUuTk9ORSk7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5zZXRQYW4gPSBmdW5jdGlvbiAodmVjMzogVEhSRUUuVmVjdG9yMykge1xyXG4gICAgcGFuID0gdmVjMztcclxuICAgIHNjb3BlLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xyXG4gIH07XHJcblxyXG4gIHRoaXMuZ2V0UGFuID0gZnVuY3Rpb24gKCk6IFRIUkVFLlZlY3RvcjMge1xyXG4gICAgcmV0dXJuIHBhbjtcclxuICB9O1xyXG5cclxuICB0aGlzLnBhblRvID0gZnVuY3Rpb24gKHZlYzMpIHtcclxuICAgIGNvbnN0IG5ld1RhcmdldCA9IG5ldyBUSFJFRS5WZWN0b3IzKHZlYzMueCwgc2NvcGUudGFyZ2V0LnksIHZlYzMueik7XHJcbiAgICBjb25zdCBkZWx0YSA9IHNjb3BlLnRhcmdldC5jbG9uZSgpLnN1YihuZXdUYXJnZXQpO1xyXG4gICAgcGFuLnN1YihkZWx0YSk7XHJcbiAgICBzY29wZS51cGRhdGUoKTtcclxuICB9O1xyXG5cclxuICB0aGlzLnJvdGF0ZUxlZnQgPSBmdW5jdGlvbiAoYW5nbGUpIHtcclxuICAgIGlmIChhbmdsZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGFuZ2xlID0gZ2V0QXV0b1JvdGF0aW9uQW5nbGUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm5vUm90YXRlSG9yaXpvbnRhbCkge1xyXG4gICAgICB0aGV0YURlbHRhID0gMDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoZXRhRGVsdGEgLT0gYW5nbGU7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5yb3RhdGVVcCA9IGZ1bmN0aW9uIChhbmdsZSkge1xyXG4gICAgaWYgKGFuZ2xlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgYW5nbGUgPSBnZXRBdXRvUm90YXRpb25BbmdsZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubm9Sb3RhdGVWZXJ0aWNhbCkge1xyXG4gICAgICBwaGlEZWx0YSA9IDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwaGlEZWx0YSAtPSBhbmdsZTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvLyBwYXNzIGluIGRpc3RhbmNlIGluIHdvcmxkIHNwYWNlIHRvIG1vdmUgbGVmdFxyXG4gIHRoaXMucGFuTGVmdCA9IGZ1bmN0aW9uIChkaXN0YW5jZSkge1xyXG5cclxuICAgIGNvbnN0IHBhbk9mZnNldCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICBjb25zdCB0ZSA9IHRoaXMuY2FtZXJhLm1hdHJpeC5lbGVtZW50cztcclxuICAgIC8vIGdldCBYIGNvbHVtbiBvZiBtYXRyaXhcclxuICAgIHBhbk9mZnNldC5zZXQodGVbMF0sIDAsIHRlWzJdKTtcclxuICAgIHBhbk9mZnNldC5ub3JtYWxpemUoKTtcclxuXHJcbiAgICBwYW5PZmZzZXQubXVsdGlwbHlTY2FsYXIoLWRpc3RhbmNlKTtcclxuXHJcbiAgICBwYW4uYWRkKHBhbk9mZnNldCk7XHJcblxyXG4gIH07XHJcblxyXG4gIC8vIHBhc3MgaW4gZGlzdGFuY2UgaW4gd29ybGQgc3BhY2UgdG8gbW92ZSB1cFxyXG4gIHRoaXMucGFuVXAgPSBmdW5jdGlvbiAoZGlzdGFuY2UpIHtcclxuXHJcbiAgICBjb25zdCBwYW5PZmZzZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgY29uc3QgdGUgPSB0aGlzLmNhbWVyYS5tYXRyaXguZWxlbWVudHM7XHJcbiAgICAvLyBnZXQgWSBjb2x1bW4gb2YgbWF0cml4XHJcbiAgICBwYW5PZmZzZXQuc2V0KHRlWzRdLCAwLCB0ZVs2XSk7XHJcbiAgICBwYW5PZmZzZXQubm9ybWFsaXplKCk7XHJcbiAgICBwYW5PZmZzZXQubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpO1xyXG5cclxuICAgIHBhbi5hZGQocGFuT2Zmc2V0KTtcclxuICB9O1xyXG5cclxuICAvLyBtYWluIGVudHJ5IHBvaW50OyBwYXNzIGluIFZlY3RvcjIgb2YgY2hhbmdlIGRlc2lyZWQgaW4gcGl4ZWwgc3BhY2UsXHJcbiAgLy8gcmlnaHQgYW5kIGRvd24gYXJlIHBvc2l0aXZlXHJcbiAgdGhpcy5wYW4gPSBmdW5jdGlvbiAoZGVsdGEpIHtcclxuXHJcbiAgICBjb25zdCBlbGVtZW50ID0gc2NvcGUuZG9tRWxlbWVudCA9PT0gZG9jdW1lbnQgPyBzY29wZS5kb21FbGVtZW50LmJvZHkgOiBzY29wZS5kb21FbGVtZW50O1xyXG5cclxuICAgIGlmIChzY29wZS5jYW1lcmEuZm92ICE9PSB1bmRlZmluZWQpIHtcclxuXHJcbiAgICAgIC8vIHBlcnNwZWN0aXZlXHJcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gc2NvcGUuY2FtZXJhLnBvc2l0aW9uO1xyXG4gICAgICBjb25zdCBvZmZzZXQgPSBwb3NpdGlvbi5jbG9uZSgpLnN1YihzY29wZS50YXJnZXQpO1xyXG4gICAgICBsZXQgdGFyZ2V0RGlzdGFuY2UgPSBvZmZzZXQubGVuZ3RoKCk7XHJcblxyXG4gICAgICAvLyBoYWxmIG9mIHRoZSBmb3YgaXMgY2VudGVyIHRvIHRvcCBvZiBzY3JlZW5cclxuICAgICAgdGFyZ2V0RGlzdGFuY2UgKj0gTWF0aC50YW4oKHNjb3BlLmNhbWVyYS5mb3YgLyAyKSAqIE1hdGguUEkgLyAxODAuMCk7XHJcbiAgICAgIC8vIHdlIGFjdHVhbGx5IGRvbid0IHVzZSBzY3JlZW5XaWR0aCwgc2luY2UgcGVyc3BlY3RpdmUgY2FtZXJhIGlzIGZpeGVkIHRvIHNjcmVlbiBoZWlnaHRcclxuICAgICAgc2NvcGUucGFuTGVmdCgyICogZGVsdGEueCAqIHRhcmdldERpc3RhbmNlIC8gZWxlbWVudC5jbGllbnRIZWlnaHQpO1xyXG4gICAgICBzY29wZS5wYW5VcCgyICogZGVsdGEueSAqIHRhcmdldERpc3RhbmNlIC8gZWxlbWVudC5jbGllbnRIZWlnaHQpO1xyXG4gICAgfSBlbHNlIGlmIChzY29wZS5jYW1lcmEudG9wICE9PSB1bmRlZmluZWQpIHtcclxuXHJcbiAgICAgIC8vIG9ydGhvZ3JhcGhpY1xyXG4gICAgICBzY29wZS5wYW5MZWZ0KGRlbHRhLnggKiAoc2NvcGUuY2FtZXJhLnJpZ2h0IC0gc2NvcGUuY2FtZXJhLmxlZnQpIC8gZWxlbWVudC5jbGllbnRXaWR0aCk7XHJcbiAgICAgIHNjb3BlLnBhblVwKGRlbHRhLnkgKiAoc2NvcGUuY2FtZXJhLnRvcCAtIHNjb3BlLmNhbWVyYS5ib3R0b20pIC8gZWxlbWVudC5jbGllbnRIZWlnaHQpO1xyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIC8vIGNhbWVyYSBuZWl0aGVyIG9ydGhvZ3JhcGhpYyBvciBwZXJzcGVjdGl2ZSAtIHdhcm4gdXNlclxyXG4gICAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIHBhbiBkaXNhYmxlZC4nKTtcclxuICAgIH1cclxuXHJcbiAgICBzY29wZS51cGRhdGUoKTtcclxuICB9O1xyXG5cclxuICB0aGlzLnNldENhbWVyYSA9IGZ1bmN0aW9uIChuZXdDYW1lcmE6IFRIUkVFLkNhbWVyYSkge1xyXG4gICAgc2NvcGUuY2FtZXJhID0gbmV3Q2FtZXJhO1xyXG4gIH07XHJcblxyXG4gIHRoaXMucGFuWFkgPSBmdW5jdGlvbiAoeCwgeSkge1xyXG4gICAgc2NvcGUucGFuKG5ldyBUSFJFRS5WZWN0b3IyKHgsIHkpKTtcclxuICB9O1xyXG5cclxuICB0aGlzLmFuaW1hdGVDYW1lcmEgPSBhc3luYyBmdW5jdGlvbiAodHlwZTogc3RyaW5nLCBjaGFuZ2U6IG51bWJlcik6IFByb21pc2U8VFdFRU4uVHdlZW4+IHtcclxuICAgIGNvbnN0IGNoYW5naW5nID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICAgIGNvbnN0IHR3ZWVuID0gbmV3IFRXRUVOLlR3ZWVuKGNoYW5naW5nKS50byhuZXcgVEhSRUUuVmVjdG9yMihjaGFuZ2UsIDApLCAyMDApO1xyXG4gICAgdHdlZW4uZWFzaW5nKFRXRUVOLkVhc2luZy5RdWFkcmF0aWMuSW4pO1xyXG4gICAgdHdlZW4ub25VcGRhdGUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uVGFyZ2V0KHRoaXMuY2FtZXJhLnBvc2l0aW9uLCB0aGlzLnRhcmdldCwge1t0eXBlXTogY2hhbmdpbmcueH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB0d2Vlbi5vbkNvbXBsZXRlKHJlc29sdmUpLnN0YXJ0KCkpO1xyXG4gIH07XHJcblxyXG4gIHRoaXMuYW5pbWF0ZUNhbWVyYU1vdmVtZW50ID0gYXN5bmMgZnVuY3Rpb24gKGVuZFBvc2l0aW9uOiBUSFJFRS5WZWN0b3IzLCBlbmRUYXJnZXQ6IFRIUkVFLlZlY3RvcjMsIGVuZER1cmF0aW9uPzogbnVtYmVyKTogUHJvbWlzZTxUV0VFTi5Ud2VlbltdPiB7XHJcbiAgICBpZiAoIWlzRmluaXRlKGVuZFBvc2l0aW9uLngpIHx8ICFpc0Zpbml0ZShlbmRQb3NpdGlvbi55KSB8fCAhaXNGaW5pdGUoZW5kUG9zaXRpb24ueikpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGR1cmF0aW9uID0gZW5kRHVyYXRpb24gIT09IHVuZGVmaW5lZCA/IGVuZER1cmF0aW9uIDogLjY2ICogY2FtZXJhLnBvc2l0aW9uLmRpc3RhbmNlVG8oZW5kUG9zaXRpb24pO1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSBjYW1lcmEucG9zaXRpb24uY2xvbmUoKTtcclxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMudGFyZ2V0LmNsb25lKCk7XHJcbiAgICBjb25zdCB0YXJnZXRUd2VlbiA9IG5ldyBUV0VFTi5Ud2Vlbih0YXJnZXQpXHJcbiAgICAgIC50byhlbmRUYXJnZXQsIGR1cmF0aW9uKVxyXG4gICAgICAuZWFzaW5nKFRXRUVOLkVhc2luZy5RdWFkcmF0aWMuSW5PdXQpXHJcbiAgICAgIC5vblVwZGF0ZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xyXG4gICAgICB9KTtcclxuICAgIGNvbnN0IHBvc2l0aW9uVHdlZW4gPSBuZXcgVFdFRU4uVHdlZW4ocG9zaXRpb24pXHJcbiAgICAgIC50byhlbmRQb3NpdGlvbiwgZHVyYXRpb24pXHJcbiAgICAgIC5lYXNpbmcoVFdFRU4uRWFzaW5nLlF1YWRyYXRpYy5JbilcclxuICAgICAgLm9uVXBkYXRlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5jb3B5KHBvc2l0aW9uKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChjaGFuZ2VFdmVudCk7XHJcbiAgICAgIH0pO1xyXG4gICAgY29uc3QgdGFyZ2V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPFRXRUVOLlR3ZWVuPihyZXNvbHZlID0+IHtcclxuICAgICAgdGFyZ2V0VHdlZW5cclxuICAgICAgICAub25Db21wbGV0ZSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGNoYW5nZUV2ZW50KTtcclxuICAgICAgICAgIHJlc29sdmUodGFyZ2V0VHdlZW4pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnN0YXJ0KCk7XHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHBvc2l0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPFRXRUVOLlR3ZWVuPihyZXNvbHZlID0+IHtcclxuICAgICAgcG9zaXRpb25Ud2VlblxyXG4gICAgICAgIC5vbkNvbXBsZXRlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xyXG4gICAgICAgICAgcmVzb2x2ZShwb3NpdGlvblR3ZWVuKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5zdGFydCgpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3RhcmdldFByb21pc2UsIHBvc2l0aW9uUHJvbWlzZV0pO1xyXG4gIH07XHJcblxyXG4gIHRoaXMuY2FtZXJhTGVmdCA9IGZ1bmN0aW9uICgpOiBQcm9taXNlPFRXRUVOLlR3ZWVuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hbmltYXRlQ2FtZXJhKCdyb3RhdGUnLCArdGhpcy5yb3RhdGVCeSk7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5jYW1lcmFSaWdodCA9IGZ1bmN0aW9uICgpOiBQcm9taXNlPFRXRUVOLlR3ZWVuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hbmltYXRlQ2FtZXJhKCdyb3RhdGUnLCAtdGhpcy5yb3RhdGVCeSk7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5jYW1lcmFGb3J3YXJkID0gZnVuY3Rpb24gKCk6IFByb21pc2U8VFdFRU4uVHdlZW4+IHtcclxuICAgIHJldHVybiB0aGlzLmFuaW1hdGVDYW1lcmEoJ21vdmUnLCAtdGhpcy5tb3ZlQnkpO1xyXG4gIH07XHJcblxyXG4gIHRoaXMuY2FtZXJhQmFja3dhcmQgPSBmdW5jdGlvbiAoKTogUHJvbWlzZTxUV0VFTi5Ud2Vlbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYW5pbWF0ZUNhbWVyYSgnbW92ZScsICt0aGlzLm1vdmVCeSk7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5kb2xseUluID0gZnVuY3Rpb24gKGRvbGx5U2NhbGUpIHtcclxuICAgIGlmIChkb2xseVNjYWxlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZG9sbHlTY2FsZSA9IGdldFpvb21TY2FsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNjYWxlIC89IGRvbGx5U2NhbGU7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5kb2xseU91dCA9IGZ1bmN0aW9uIChkb2xseVNjYWxlKSB7XHJcbiAgICBpZiAoZG9sbHlTY2FsZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGRvbGx5U2NhbGUgPSBnZXRab29tU2NhbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzY2FsZSAqPSBkb2xseVNjYWxlO1xyXG4gIH07XHJcblxyXG4gIHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy51cGRhdGVQb3NpdGlvblRhcmdldCh0aGlzLmNhbWVyYS5wb3NpdGlvbiwgdGhpcy50YXJnZXQpO1xyXG4gIH07XHJcblxyXG4gIHRoaXMuYW5pbWF0ZU1vdmVUbyA9IGFzeW5jIGZ1bmN0aW9uICh0YXJnZXQ6IFRIUkVFLlZlY3RvcjMpOiBQcm9taXNlPFRXRUVOLlR3ZWVuPiB7XHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IHNjb3BlLnRhcmdldC5jbG9uZSgpO1xyXG4gICAgY29uc3QgZGlzdGFuY2UgPSB0YXJnZXQuZGlzdGFuY2VUbyhwb3NpdGlvbik7XHJcbiAgICBjb25zdCB0d2VlbiA9IG5ldyBUV0VFTi5Ud2Vlbihwb3NpdGlvbikudG8odGFyZ2V0LCBkaXN0YW5jZSk7XHJcbiAgICB0d2Vlbi5lYXNpbmcoVFdFRU4uRWFzaW5nLlF1YWRyYXRpYy5PdXQpO1xyXG4gICAgdHdlZW4ub25VcGRhdGUoc2NvcGUubW92ZVRvLmJpbmQoc2NvcGUsIHBvc2l0aW9uKSk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB0d2Vlbi5vbkNvbXBsZXRlKHJlc29sdmUpLnN0YXJ0KCkpO1xyXG4gIH07XHJcblxyXG4gIHRoaXMubW92ZVRvID0gZnVuY3Rpb24gKHZlYzMpIHtcclxuICAgIHZlYzMuc2V0WShzY29wZS50YXJnZXQueSk7XHJcbiAgICBjb25zdCBkaWZmID0gdmVjMy5jbG9uZSgpLnN1YihzY29wZS50YXJnZXQpO1xyXG4gICAgY29uc3Qgb2Zmc2V0ID0gc2NvcGUuY2FtZXJhLnBvc2l0aW9uLmNsb25lKCkuc3ViKHNjb3BlLnRhcmdldCk7XHJcbiAgICBzY29wZS50YXJnZXQuYWRkKHBhbikuYWRkKGRpZmYpO1xyXG4gICAgc2NvcGUuY2FtZXJhLnBvc2l0aW9uLmNvcHkoc2NvcGUudGFyZ2V0KS5hZGQob2Zmc2V0KTtcclxuICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy51cGRhdGVQb3NpdGlvblRhcmdldCA9IGZ1bmN0aW9uIChwb3NpdGlvbiwgdGFyZ2V0LCBvcHRpb25zKSB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIHJvdGF0ZTogdGhldGFEaWZmID0gdGhldGFEZWx0YSxcclxuICAgICAgbW92ZTogbW92ZURpZmYgPSAwXHJcbiAgICB9ID0gb3B0aW9ucyB8fCB7fTtcclxuXHJcbiAgICAvLyBhZGRlZCB0aGlzIGxpbmUgdG8gYmUgYWJsZSB0byB6b29tIGluIGZ1cnRoZXJcclxuICAgIC8vIHRhcmdldC55ID0gdGhpcy5taW5EaXN0YW5jZTtcclxuXHJcbiAgICBjb25zdCBvZmZzZXQgPSBwb3NpdGlvbi5jbG9uZSgpLnN1Yih0YXJnZXQpO1xyXG5cclxuICAgIC8vIGFuZ2xlIGZyb20gei1heGlzIGFyb3VuZCB5LWF4aXNcclxuICAgIGxldCB0aGV0YSA9IE1hdGguYXRhbjIob2Zmc2V0LngsIG9mZnNldC56KTtcclxuXHJcbiAgICAvLyBhbmdsZSBmcm9tIHktYXhpc1xyXG4gICAgbGV0IHBoaSA9IE1hdGguYXRhbjIoTWF0aC5zcXJ0KG9mZnNldC54ICogb2Zmc2V0LnggKyBvZmZzZXQueiAqIG9mZnNldC56KSwgb2Zmc2V0LnkpO1xyXG5cclxuXHJcbiAgICB0aGV0YSArPSB0aGV0YURpZmY7XHJcbiAgICBwaGkgKz0gcGhpRGVsdGE7XHJcblxyXG4gICAgbGV0IG1pbiA9IHRoaXMubWluQXppbXV0aEFuZ2xlO1xyXG4gICAgbGV0IG1heCA9IHRoaXMubWF4QXppbXV0aEFuZ2xlO1xyXG5cclxuICAgIGlmICggaXNGaW5pdGUoIG1pbiApICYmIGlzRmluaXRlKCBtYXggKSApIHtcclxuICAgICAgaWYgKCBtaW4gPCAtIE1hdGguUEkgKSB7IG1pbiArPSB0d29QSTsgfSBlbHNlIGlmICggbWluID4gTWF0aC5QSSApIHsgbWluIC09IHR3b1BJOyB9XHJcbiAgICAgIGlmICggbWF4IDwgLSBNYXRoLlBJICkgeyBtYXggKz0gdHdvUEk7IH0gZWxzZSBpZiAoIG1heCA+IE1hdGguUEkgKSB7IG1heCAtPSB0d29QSTsgfVxyXG4gICAgICBpZiAoIG1pbiA8PSBtYXggKSB7XHJcbiAgICAgICAgdGhldGEgPSBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCB0aGV0YSApICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhldGEgPSB0aGV0YSA+ICggbWluICsgbWF4ICkgLyAyID8gTWF0aC5tYXgoIG1pbiwgdGhldGEgKSA6IE1hdGgubWluKCBtYXgsIHRoZXRhICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyByZXN0cmljdCBwaGkgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0c1xyXG4gICAgcGhpID0gTWF0aC5tYXgodGhpcy5taW5Qb2xhckFuZ2xlLCBNYXRoLm1pbih0aGlzLm1heFBvbGFyQW5nbGUsIHBoaSkpO1xyXG5cclxuICAgIC8vIHJlc3RyaWN0IHBoaSB0byBiZSBiZXR3ZWUgRVBTIGFuZCBQSS1FUFNcclxuICAgIHBoaSA9IE1hdGgubWF4KEVQUywgTWF0aC5taW4oTWF0aC5QSSAtIEVQUywgcGhpKSk7XHJcblxyXG4gICAgbGV0IHJhZGl1cyA9IG9mZnNldC5sZW5ndGgoKSAqIChtb3ZlRGlmZiA/IE1hdGguYWJzKG1vdmVEaWZmKSA6IDEpICogc2NhbGU7XHJcblxyXG4gICAgLy8gcmVzdHJpY3QgcmFkaXVzIHRvIGJlIGJldHdlZW4gZGVzaXJlZCBsaW1pdHNcclxuICAgIHJhZGl1cyA9IE1hdGgubWF4KHRoaXMubWluRGlzdGFuY2UsIE1hdGgubWluKHRoaXMubWF4RGlzdGFuY2UsIHJhZGl1cykpO1xyXG4gICAgdGhpcy50YXJnZXQuYWRkKHBhbik7XHJcblxyXG4gICAgLy8gbW92ZSB0YXJnZXQgdG8gcGFubmVkIGxvY2F0aW9uXHJcblxyXG4gICAgb2Zmc2V0LnggPSByYWRpdXMgKiBNYXRoLnNpbihwaGkpICogTWF0aC5zaW4odGhldGEpO1xyXG4gICAgb2Zmc2V0LnkgPSBtb3ZlRGlmZiA/IDAgOiByYWRpdXMgKiBNYXRoLmNvcyhwaGkpO1xyXG4gICAgb2Zmc2V0LnogPSByYWRpdXMgKiBNYXRoLnNpbihwaGkpICogTWF0aC5jb3ModGhldGEpO1xyXG5cclxuICAgIGlmICghbW92ZURpZmYpIHtcclxuICAgICAgcG9zaXRpb24uY29weSh0aGlzLnRhcmdldCkuYWRkKG9mZnNldCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAobW92ZURpZmYgPCAwKSB7XHJcbiAgICAgICAgdGhpcy50YXJnZXQuc3ViKG9mZnNldCk7XHJcbiAgICAgICAgcG9zaXRpb24uc3ViKG9mZnNldCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50YXJnZXQuYWRkKG9mZnNldCk7XHJcbiAgICAgICAgcG9zaXRpb24uYWRkKG9mZnNldCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmV4cGxvcmVNb2RlICYmIHRoaXMudXNlR3lyb3Njb3BlICYmICF0aGlzLmxvb2tBcm91bmRNb2RlKSB7XHJcbiAgICAgIGNvbnN0IGxvb2tWZWN0b3IgPSBuZXcgVEhSRUUuVmVjdG9yMyh0aGlzLnRhcmdldC54LCBjYW1lcmEucG9zaXRpb24ueSwgdGhpcy50YXJnZXQueikuc3ViKGNhbWVyYS5wb3NpdGlvbik7XHJcbiAgICAgIHdvcmxkUm90YXRpb25ZID0gTWF0aC5hdGFuMihsb29rVmVjdG9yLngsIGxvb2tWZWN0b3Iueik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbWVyYS5sb29rQXQodGhpcy50YXJnZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoZXRhRGVsdGEgPSAwO1xyXG4gICAgcGhpRGVsdGEgPSAwO1xyXG4gICAgc2NhbGUgPSAxO1xyXG4gICAgcGFuLnNldCgwLCAwLCAwKTtcclxuICAgIHNjb3BlLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xyXG4gIH07XHJcblxyXG4gIHRoaXMuc2V0RXhwbG9yZU1vZGUgPSBmdW5jdGlvbiAob24gPSB0cnVlKSB7XHJcbiAgICB0aGlzLmV4cGxvcmVNb2RlID0gb247XHJcbiAgICBzdGF0ZSA9IG9uID8gU1RBVEUuRVhQTE9SRSA6IFNUQVRFLk5PTkU7XHJcbiAgfTtcclxuXHJcbiAgdGhpcy5zZXRFeHBsb3JlRHJhZ01vZGUgPSBmdW5jdGlvbiAob24gPSB0cnVlKSB7XHJcbiAgICBzdGF0ZSA9IG9uID8gU1RBVEUuRVhQTE9SRV9EUkFHIDogU1RBVEUuRVhQTE9SRTtcclxuICB9O1xyXG5cclxuICB0aGlzLnNldEJpcmRzRXllTW9kZSA9IGZ1bmN0aW9uIChvbiA9IHRydWUpIHtcclxuICAgIHRoaXMuYmlyZHNFeWVNb2RlID0gb247XHJcbiAgICBzdGF0ZSA9IG9uID8gU1RBVEUuQklSRFNfRVlFIDogU1RBVEUuTk9ORTtcclxuICB9O1xyXG5cclxuICB0aGlzLnNldFZyTW9kZSA9IGZ1bmN0aW9uIChvbiA9IHRydWUpIHtcclxuICAgIHRoaXMudnJNb2RlID0gb247XHJcbiAgfTtcclxuXHJcbiAgZnVuY3Rpb24gY2FsY3VsYXRlQ2FtZXJhUXVhdGVybmlvbihhbHBoYTogbnVtYmVyLCBiZXRhOiBudW1iZXIsIGdhbW1hOiBudW1iZXIpOiBUSFJFRS5RdWF0ZXJuaW9uIHtcclxuICAgIC8vIGdldCBkZXZpY2Ugcm90YXRpb24gaW4gZXVsZXIgYW5nbGVzIGZyb20gZ3lyb3Njb3BlXHJcbiAgICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvZnVuZGFtZW50YWxzL25hdGl2ZS1oYXJkd2FyZS9kZXZpY2Utb3JpZW50YXRpb24vXHJcbiAgICBjb25zdCBkZXZpY2VFdWxlciA9IG5ldyBUSFJFRS5FdWxlcihiZXRhLCBhbHBoYSArIHdvcmxkUm90YXRpb25ZLCAtZ2FtbWEsICdZWFonKTtcclxuXHJcbiAgICAvLyBjcmVhdGUgcmVzdWx0IHF1YXRlcm5pb24gZnJvbSBldWxlciBhbmdsZXNcclxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgICByZXN1bHQuc2V0RnJvbUV1bGVyKGRldmljZUV1bGVyKTtcclxuXHJcbiAgICAvLyBjYWxjdWxhdGUgbmVjZXNzYXJ5IHJvdGF0aW9uIHRvIG1ha2UgdXAgZm9yIGRpZmZlcmVudCBzY3JlZW4gb3JpZW50YXRpb25cclxuICAgIC8vIHdpbmRvdy5vcmllbnRhdGlvbiBpcyAwIGluIHBvcnRyYWl0IG1vZGUsIDkwIG9yIC05MCBpbiByZXNwZWN0aXZlIGxhbmRzY2FwZSBtb2Rlc1xyXG4gICAgY29uc3QgbWludXNIYWxmQW5nbGUgPSAtVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKE51bWJlcih3aW5kb3cub3JpZW50YXRpb24pKSAvIDI7XHJcbiAgICBjb25zdCBzY3JlZW5UcmFuc2Zvcm0gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigwLCBNYXRoLnNpbihtaW51c0hhbGZBbmdsZSksIDAsIE1hdGguY29zKG1pbnVzSGFsZkFuZ2xlKSk7XHJcbiAgICByZXN1bHQubXVsdGlwbHkoc2NyZWVuVHJhbnNmb3JtKTtcclxuXHJcbiAgICAvLyByb3RhdGUgcmVzdWx0IHF1YXRlcm5pb24gdG8gbWFrZSB1cCBkaWZmZXJlbmNlIGluIHdvcmxkIGNvb3JkaW5hdGVzXHJcbiAgICByZXN1bHQubXVsdGlwbHkod29ybGRUcmFuc2Zvcm0pO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRBdXRvUm90YXRpb25BbmdsZSgpIHtcclxuICAgIHJldHVybiAyICogTWF0aC5QSSAvIDYwIC8gNjAgKiBzY29wZS5hdXRvUm90YXRlU3BlZWQ7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRab29tU2NhbGUoKSB7XHJcbiAgICByZXR1cm4gTWF0aC5wb3coMC45NSwgc2NvcGUuem9vbVNwZWVkKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50KSB7XHJcblxyXG4gICAgaWYgKCFpc01vdXNlRXZlbnRBbGxvd2VkKGV2ZW50KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgY29uc3QgbW91c2VQb3M6IFRIUkVFLlZlY3RvcjIgPSBSZWxhdGl2ZVBvc2l0aW9uVXRpbHMuR2V0Q2xpZW50TW91c2VQb3NpdGlvbihldmVudCk7XHJcblxyXG4gICAgaWYgKHN0YXRlID09PSBTVEFURS5CSVJEU19FWUUgfHxcclxuICAgICAgc3RhdGUgPT09IFNUQVRFLkJJUkRTX0VZRV9ET0xMWSB8fFxyXG4gICAgICBzdGF0ZSA9PT0gU1RBVEUuQklSRFNfRVlFX1BBTikge1xyXG5cclxuICAgICAgc3RhdGUgPSBTVEFURS5CSVJEU19FWUVfUEFOO1xyXG4gICAgICBwYW5TdGFydC5zZXQobW91c2VQb3MueCwgbW91c2VQb3MueSk7XHJcbiAgICAgIHNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcclxuICAgICAgc2NvcGUuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChldmVudC5idXR0b24gPT09IDApIHtcclxuICAgICAgaWYgKHNjb3BlLm5vUm90YXRlID09PSB0cnVlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLkVYUExPUkUgJiYgc3RhdGUgIT09IFNUQVRFLkVYUExPUkVfRFJBRykge1xyXG4gICAgICAgIHN0YXRlID0gU1RBVEUuUk9UQVRFO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByb3RhdGVTdGFydC5zZXQobW91c2VQb3MueCwgbW91c2VQb3MueSk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChldmVudC5idXR0b24gPT09IDEpIHtcclxuICAgICAgaWYgKHNjb3BlLm5vWm9vbSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3RhdGUgPSBTVEFURS5ET0xMWTtcclxuXHJcbiAgICAgIGRvbGx5U3RhcnQuc2V0KG1vdXNlUG9zLngsIG1vdXNlUG9zLnkpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoZXZlbnQuYnV0dG9uID09PSAyKSB7XHJcbiAgICAgIGlmIChzY29wZS5ub1BhbiA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3RhdGUgPSBTVEFURS5QQU47XHJcblxyXG4gICAgICBwYW5TdGFydC5zZXQobW91c2VQb3MueCwgbW91c2VQb3MueSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR3JlZ2dtYW4gZml4OiBodHRwczovL2dpdGh1Yi5jb20vZ3JlZ2dtYW4vdGhyZWUuanMvY29tbWl0L2ZkZTlmOTkxN2Q2ZDgzODFmMDZiZjIyY2RmZjc2NjAyOWQxNzYxYmVcclxuICAgIHNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcclxuICAgIHNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UpO1xyXG5cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHNldFJvdGF0aW9uUGFyYW1ldGVycyhlbmRQb2ludDogVEhSRUUuVmVjdG9yMiwgZGlyZWN0aW9uOiBudW1iZXIsIHNwZWVkOiBudW1iZXIpIHtcclxuXHJcbiAgICBjb25zdCBlbGVtZW50ID0gc2NvcGUuZG9tRWxlbWVudCA9PT0gZG9jdW1lbnQgPyBzY29wZS5kb21FbGVtZW50LmJvZHkgOiBzY29wZS5kb21FbGVtZW50O1xyXG5cclxuICAgIHJvdGF0ZUVuZC5jb3B5KGVuZFBvaW50KTtcclxuICAgIHJvdGF0ZURlbHRhLnN1YlZlY3RvcnMocm90YXRlRW5kLCByb3RhdGVTdGFydCk7XHJcblxyXG4gICAgLy8gcm90YXRpbmcgYWNyb3NzIHdob2xlIHNjcmVlbiBnb2VzIDM2MCBkZWdyZWVzIGFyb3VuZFxyXG4gICAgc2NvcGUucm90YXRlTGVmdCgyICogTWF0aC5QSSAqIGRpcmVjdGlvbiAqIHJvdGF0ZURlbHRhLnggLyBlbGVtZW50LmNsaWVudFdpZHRoICogc3BlZWQpO1xyXG4gICAgLy8gcm90YXRpbmcgdXAgYW5kIGRvd24gYWxvbmcgd2hvbGUgc2NyZWVuIGF0dGVtcHRzIHRvIGdvIDM2MCwgYnV0IGxpbWl0ZWQgdG8gMTgwXHJcbiAgICBzY29wZS5yb3RhdGVVcCgyICogTWF0aC5QSSAqIGRpcmVjdGlvbiAqIHJvdGF0ZURlbHRhLnkgLyBlbGVtZW50LmNsaWVudEhlaWdodCAqIHNwZWVkKTtcclxuICAgIHJvdGF0ZVN0YXJ0LmNvcHkocm90YXRlRW5kKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGlzTW91c2VFdmVudEFsbG93ZWQoZXZlbnQ/OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaXNDYW52YXMgPSBldmVudCA/IChldmVudC50YXJnZXQgJiYgKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS5ub2RlTmFtZSA9PT0gJ0NBTlZBUycpIDogdHJ1ZTtcclxuICAgIHJldHVybiBpc0NhbnZhcyAmJiBzY29wZS5lbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gb3JpZ2luYXRlT25DYW52YXMoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldCA9PT0gZG9jdW1lbnQuYm9keTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7XHJcblxyXG4gICAgaWYgKCFpc01vdXNlRXZlbnRBbGxvd2VkKGV2ZW50KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGNvbnN0IG1vdXNlUG9zOiBUSFJFRS5WZWN0b3IyID0gUmVsYXRpdmVQb3NpdGlvblV0aWxzLkdldENsaWVudE1vdXNlUG9zaXRpb24oZXZlbnQpO1xyXG5cclxuICAgIGlmIChzdGF0ZSA9PT0gU1RBVEUuUk9UQVRFKSB7XHJcblxyXG4gICAgICBpZiAoc2NvcGUubm9Sb3RhdGUgPT09IHRydWUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgc2V0Um90YXRpb25QYXJhbWV0ZXJzKFxyXG4gICAgICAgIG5ldyBUSFJFRS5WZWN0b3IyKG1vdXNlUG9zLngsIG1vdXNlUG9zLnkpLFxyXG4gICAgICAgIDEsXHJcbiAgICAgICAgc2NvcGUucm90YXRlU3BlZWRcclxuICAgICAgKTtcclxuICAgICAgc2NvcGUudXBkYXRlKCk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU1RBVEUuRVhQTE9SRSkge1xyXG5cclxuICAgICAgaWYgKHNjb3BlLm5vUm90YXRlID09PSB0cnVlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHNldFJvdGF0aW9uUGFyYW1ldGVycyhcclxuICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMihtb3VzZVBvcy54LCBtb3VzZVBvcy55KSxcclxuICAgICAgICAtMSxcclxuICAgICAgICBzY29wZS5leHBsb3JlUm90YXRlU3BlZWRcclxuICAgICAgKTtcclxuICAgICAgc2NvcGUudXBkYXRlKCk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU1RBVEUuRVhQTE9SRV9EUkFHKSB7XHJcblxyXG4gICAgICBzY29wZS51cGRhdGUoKTtcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNUQVRFLkRPTExZIHx8IHN0YXRlID09PSBTVEFURS5CSVJEU19FWUVfRE9MTFkpIHtcclxuXHJcbiAgICAgIGlmIChzY29wZS5ub1pvb20gPT09IHRydWUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGRvbGx5RW5kLnNldChtb3VzZVBvcy54LCBtb3VzZVBvcy55KTtcclxuICAgICAgZG9sbHlEZWx0YS5zdWJWZWN0b3JzKGRvbGx5RW5kLCBkb2xseVN0YXJ0KTtcclxuXHJcbiAgICAgIGlmIChkb2xseURlbHRhLnkgPiAwKSB7XHJcblxyXG4gICAgICAgIHNjb3BlLmRvbGx5SW4oKTtcclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgIHNjb3BlLmRvbGx5T3V0KCk7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICBkb2xseVN0YXJ0LmNvcHkoZG9sbHlFbmQpO1xyXG4gICAgICBzY29wZS51cGRhdGUoKTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTVEFURS5QQU4gfHwgc3RhdGUgPT09IFNUQVRFLkJJUkRTX0VZRV9QQU4pIHtcclxuXHJcbiAgICAgIGlmIChzY29wZS5ub1BhbiA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgcGFuRW5kLnNldChtb3VzZVBvcy54LCBtb3VzZVBvcy55KTtcclxuICAgICAgcGFuRGVsdGEuc3ViVmVjdG9ycyhwYW5FbmQsIHBhblN0YXJ0KTtcclxuXHJcbiAgICAgIHNjb3BlLnBhbihwYW5EZWx0YSk7XHJcblxyXG4gICAgICBwYW5TdGFydC5jb3B5KHBhbkVuZCk7XHJcbiAgICAgIHNjb3BlLnVwZGF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gb25Nb3VzZVVwKGV2ZW50KSB7XHJcbiAgICBpZiAoIXNjb3BlLmVuYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdyZWdnbWFuIGZpeDogaHR0cHM6Ly9naXRodWIuY29tL2dyZWdnbWFuL3RocmVlLmpzL2NvbW1pdC9mZGU5Zjk5MTdkNmQ4MzgxZjA2YmYyMmNkZmY3NjYwMjlkMTc2MWJlXHJcbiAgICBzY29wZS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlLCBmYWxzZSk7XHJcbiAgICBzY29wZS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXAsIGZhbHNlKTtcclxuXHJcbiAgICBpZiAoc3RhdGUgPT09IFNUQVRFLkVYUExPUkUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHN0YXRlID09PSBTVEFURS5FWFBMT1JFX0RSQUcpIHtcclxuICAgICAgc3RhdGUgPSBTVEFURS5FWFBMT1JFO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoc3RhdGUgPT09IFNUQVRFLkJJUkRTX0VZRSB8fCBzdGF0ZSA9PT0gU1RBVEUuQklSRFNfRVlFX1BBTiB8fCBzdGF0ZSA9PT0gU1RBVEUuQklSRFNfRVlFX0RPTExZKSB7XHJcbiAgICAgIHN0YXRlID0gU1RBVEUuQklSRFNfRVlFO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XHJcbiAgfVxyXG5cclxuXHJcbiAgZnVuY3Rpb24gb25Nb3VzZVdoZWVsKGV2ZW50KSB7XHJcbiAgICBpZiAoIXNjb3BlLmVuYWJsZWQgfHwgc2NvcGUubm9ab29tID09PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcclxuICAgICAgc2NvcGUuZG9sbHlPdXQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNjb3BlLmRvbGx5SW4oKTtcclxuICAgIH1cclxuICAgIHNjb3BlLnVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XHJcblxyXG4gICAgaWYgKHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChzY29wZS5ub0tleXMgPT09IHRydWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHNjb3BlLm5vUGFuID09PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghb3JpZ2luYXRlT25DYW52YXMoZXZlbnQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcclxuXHJcbiAgICAgIGNhc2Ugc2NvcGUua2V5cy5VUDpcclxuICAgICAgICBpZiAoc2NvcGUuZXhwbG9yZU1vZGUpIHtcclxuICAgICAgICAgIHNjb3BlLmNhbWVyYUZvcndhcmQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2NvcGUucGFuKG5ldyBUSFJFRS5WZWN0b3IyKDAsIHNjb3BlLmtleVBhblNwZWVkKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIHNjb3BlLmtleXMuQk9UVE9NOlxyXG4gICAgICAgIGlmIChzY29wZS5leHBsb3JlTW9kZSkge1xyXG4gICAgICAgICAgc2NvcGUuY2FtZXJhQmFja3dhcmQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2NvcGUucGFuKG5ldyBUSFJFRS5WZWN0b3IyKDAsIC1zY29wZS5rZXlQYW5TcGVlZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBzY29wZS5rZXlzLkxFRlQ6XHJcbiAgICAgICAgaWYgKHNjb3BlLmV4cGxvcmVNb2RlKSB7XHJcbiAgICAgICAgICBzY29wZS5jYW1lcmFMZWZ0KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNjb3BlLnBhbihuZXcgVEhSRUUuVmVjdG9yMihzY29wZS5rZXlQYW5TcGVlZCwgMCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBzY29wZS5rZXlzLlJJR0hUOlxyXG4gICAgICAgIGlmIChzY29wZS5leHBsb3JlTW9kZSkge1xyXG4gICAgICAgICAgc2NvcGUuY2FtZXJhUmlnaHQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2NvcGUucGFuKG5ldyBUSFJFRS5WZWN0b3IyKC1zY29wZS5rZXlQYW5TcGVlZCwgMCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiB0b3VjaHN0YXJ0KGV2ZW50KSB7XHJcbiAgICBpZiAoIWlzTW91c2VFdmVudEFsbG93ZWQoZXZlbnQpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RhdGUgPT09IFNUQVRFLkJJUkRTX0VZRSB8fFxyXG4gICAgICBzdGF0ZSA9PT0gU1RBVEUuQklSRFNfRVlFX0RPTExZIHx8XHJcbiAgICAgIHN0YXRlID09PSBTVEFURS5CSVJEU19FWUVfUEFOKSB7XHJcbiAgICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMSB8fCBldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMykge1xyXG4gICAgICAgIHN0YXRlID0gU1RBVEUuQklSRFNfRVlFX1BBTjtcclxuICAgICAgICBwYW5TdGFydC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICBzdGF0ZSA9IFNUQVRFLkJJUkRTX0VZRV9ET0xMWTtcclxuICAgICAgICBjb25zdCBkeCA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVggLSBldmVudC50b3VjaGVzWzFdLnBhZ2VYO1xyXG4gICAgICAgIGNvbnN0IGR5ID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWSAtIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVk7XHJcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xyXG4gICAgICAgIGRvbGx5U3RhcnQuc2V0KDAsIGRpc3RhbmNlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChldmVudC50b3VjaGVzLmxlbmd0aCkge1xyXG5cclxuICAgICAgY2FzZSAxOlx0Ly8gb25lLWZpbmdlcmVkIHRvdWNoOiByb3RhdGVcclxuICAgICAgICBpZiAoc2NvcGUubm9Sb3RhdGUgPT09IHRydWUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjb3BlLmxvbmdUb3VjaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBzY29wZS5sb29rQXJvdW5kTW9kZSA9IHRydWU7XHJcbiAgICAgICAgfSwgc2NvcGUubG9uZ1RvdWNoRHVyYXRpb24pO1xyXG5cclxuICAgICAgICBzdGF0ZSA9IFNUQVRFLlRPVUNIX1JPVEFURTtcclxuICAgICAgICByb3RhdGVTdGFydC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIDI6XHQvLyB0d28tZmluZ2VyZWQgdG91Y2g6IGRvbGx5XHJcbiAgICAgICAgaWYgKHNjb3BlLm5vWm9vbSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RhdGUgPSBTVEFURS5UT1VDSF9ET0xMWTtcclxuXHJcbiAgICAgICAgY29uc3QgZHggPSBldmVudC50b3VjaGVzWzBdLnBhZ2VYIC0gZXZlbnQudG91Y2hlc1sxXS5wYWdlWDtcclxuICAgICAgICBjb25zdCBkeSA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkgLSBldmVudC50b3VjaGVzWzFdLnBhZ2VZO1xyXG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcclxuICAgICAgICBkb2xseVN0YXJ0LnNldCgwLCBkaXN0YW5jZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIDM6IC8vIHRocmVlLWZpbmdlcmVkIHRvdWNoOiBwYW5cclxuICAgICAgICBpZiAoc2NvcGUubm9QYW4gPT09IHRydWUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0YXRlID0gU1RBVEUuVE9VQ0hfUEFOO1xyXG5cclxuICAgICAgICBwYW5TdGFydC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiB0b3VjaG1vdmUoZXZlbnQpIHtcclxuICAgIGlmICghaXNNb3VzZUV2ZW50QWxsb3dlZChldmVudCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyVGltZW91dChzY29wZS5sb25nVG91Y2hUaW1lcik7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgZWxlbWVudCA9IHNjb3BlLmRvbUVsZW1lbnQgPT09IGRvY3VtZW50ID8gc2NvcGUuZG9tRWxlbWVudC5ib2R5IDogc2NvcGUuZG9tRWxlbWVudDtcclxuXHJcbiAgICAvLyBkaXNhYmxlIHVzZSBvZiB0d28gb3IgdGhyZWUgZmluZ2VyIHRvdWNoIGdlc3R1cmVzIGluIGV4cGxvcmUgbW9kZVxyXG4gICAgY29uc3QgdG91Y2hDb3VudFRvUHJvY2VzcyA9IHNjb3BlLmV4cGxvcmVNb2RlID8gMSA6XHJcbiAgICAgIHN0YXRlID09PSBTVEFURS5CSVJEU19FWUVfUEFOICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAxID8gMyA6XHJcbiAgICAgICAgZXZlbnQudG91Y2hlcy5sZW5ndGg7XHJcbiAgICBzd2l0Y2ggKHRvdWNoQ291bnRUb1Byb2Nlc3MpIHtcclxuXHJcbiAgICAgIGNhc2UgMTogLy8gb25lLWZpbmdlcmVkIHRvdWNoOiByb3RhdGVcclxuICAgICAgICBpZiAoc2NvcGUubm9Sb3RhdGUgPT09IHRydWUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5UT1VDSF9ST1RBVEUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJvdGF0ZUVuZC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XHJcbiAgICAgICAgcm90YXRlRGVsdGEuc3ViVmVjdG9ycyhyb3RhdGVFbmQsIHJvdGF0ZVN0YXJ0KTtcclxuXHJcbiAgICAgICAgY29uc3Qgcm90YXRpb25TcGVlZCA9IHNjb3BlLmV4cGxvcmVNb2RlXHJcbiAgICAgICAgICA/IHNjb3BlLmV4cGxvcmVSb3RhdGVTcGVlZFxyXG4gICAgICAgICAgOiBzY29wZS5yb3RhdGVTcGVlZDtcclxuXHJcbiAgICAgICAgLy8gcm90YXRpbmcgYWNyb3NzIHdob2xlIHNjcmVlbiBnb2VzIDM2MCBkZWdyZWVzIGFyb3VuZFxyXG4gICAgICAgIHNjb3BlLnJvdGF0ZUxlZnQoMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS54IC8gZWxlbWVudC5jbGllbnRXaWR0aCAqIHJvdGF0aW9uU3BlZWQpO1xyXG4gICAgICAgIC8vIHJvdGF0aW5nIHVwIGFuZCBkb3duIGFsb25nIHdob2xlIHNjcmVlbiBhdHRlbXB0cyB0byBnbyAzNjAsIGJ1dCBsaW1pdGVkIHRvIDE4MFxyXG4gICAgICAgIHNjb3BlLnJvdGF0ZVVwKDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0ICogcm90YXRpb25TcGVlZCk7XHJcblxyXG4gICAgICAgIHJvdGF0ZVN0YXJ0LmNvcHkocm90YXRlRW5kKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgMjogLy8gdHdvLWZpbmdlcmVkIHRvdWNoOiBkb2xseVxyXG4gICAgICAgIGlmIChzY29wZS5ub1pvb20gPT09IHRydWUpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5UT1VDSF9ET0xMWSAmJiBzdGF0ZSAhPT0gU1RBVEUuQklSRFNfRVlFX0RPTExZKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkeCA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVggLSBldmVudC50b3VjaGVzWzFdLnBhZ2VYO1xyXG4gICAgICAgIGNvbnN0IGR5ID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWSAtIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVk7XHJcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xyXG5cclxuICAgICAgICBkb2xseUVuZC5zZXQoMCwgZGlzdGFuY2UpO1xyXG4gICAgICAgIGRvbGx5RGVsdGEuc3ViVmVjdG9ycyhkb2xseUVuZCwgZG9sbHlTdGFydCk7XHJcblxyXG4gICAgICAgIGlmIChkb2xseURlbHRhLnkgPiAwKSB7XHJcbiAgICAgICAgICBzY29wZS5kb2xseU91dCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzY29wZS5kb2xseUluKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkb2xseVN0YXJ0LmNvcHkoZG9sbHlFbmQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAzOiAvLyB0aHJlZS1maW5nZXJlZCB0b3VjaDogcGFuXHJcbiAgICAgICAgaWYgKHNjb3BlLm5vUGFuID09PSB0cnVlKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuVE9VQ0hfUEFOICYmIHN0YXRlICE9PSBTVEFURS5CSVJEU19FWUVfUEFOKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwYW5FbmQuc2V0KGV2ZW50LnRvdWNoZXNbMF0ucGFnZVgsIGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkpO1xyXG4gICAgICAgIHBhbkRlbHRhLnN1YlZlY3RvcnMocGFuRW5kLCBwYW5TdGFydCk7XHJcblxyXG4gICAgICAgIHNjb3BlLnBhbihwYW5EZWx0YSk7XHJcblxyXG4gICAgICAgIHBhblN0YXJ0LmNvcHkocGFuRW5kKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgc3RhdGUgPSBTVEFURS5OT05FO1xyXG4gICAgfVxyXG4gICAgc2NvcGUudXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiB0b3VjaGVuZChldmVudD8pIHtcclxuICAgIGlmICghc2NvcGUuZW5hYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJUaW1lb3V0KHNjb3BlLmxvbmdUb3VjaFRpbWVyKTtcclxuICAgIHNjb3BlLmxvb2tBcm91bmRNb2RlID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHN0YXRlID09PSBTVEFURS5CSVJEU19FWUUgfHwgc3RhdGUgPT09IFNUQVRFLkJJUkRTX0VZRV9QQU4gfHwgc3RhdGUgPT09IFNUQVRFLkJJUkRTX0VZRV9ET0xMWSkge1xyXG4gICAgICBzdGF0ZSA9IFNUQVRFLkJJUkRTX0VZRTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgc3RhdGUgPSBTVEFURS5OT05FO1xyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gb25EZXZpY2VNb3ZlKGV2ZW50OiBEZXZpY2VPcmllbnRhdGlvbkV2ZW50KSB7XHJcbiAgICBpZiAoIXNjb3BlLmV4cGxvcmVNb2RlIHx8IHNjb3BlLnZyTW9kZSB8fCBzY29wZS5sb29rQXJvdW5kTW9kZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBhbHBoYSA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZChldmVudC5hbHBoYSB8fCAwKTtcclxuICAgIGNvbnN0IGJldGEgPSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQoZXZlbnQuYmV0YSB8fCAwKTtcclxuICAgIGNvbnN0IGdhbW1hID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKGV2ZW50LmdhbW1hIHx8IDApO1xyXG5cclxuICAgIGlmIChhbHBoYSAhPT0gMCAmJiBiZXRhICE9PSAwICYmIGdhbW1hICE9PSAwKSB7XHJcbiAgICAgIHNjb3BlLnVzZUd5cm9zY29wZSA9IHRydWU7XHJcbiAgICAgIGNvbnN0IGNhbWVyYVF1YXRlcm5pb24gPSBjYWxjdWxhdGVDYW1lcmFRdWF0ZXJuaW9uKGFscGhhLCBiZXRhLCBnYW1tYSk7XHJcblxyXG4gICAgICBjYW1lcmEucXVhdGVybmlvbi5zbGVycChjYW1lcmFRdWF0ZXJuaW9uLCAwLjUpOyAvLyBzbW9vdGggdXNpbmcgc3BoZXJpY2FsIGxpbmVhciBpbnRlcnBvbGF0aW9uXHJcbiAgICAgIHNjb3BlLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhpcy5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIH0sIGZhbHNlKTtcclxuICB0aGlzLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd24sIGZhbHNlKTtcclxuICB0aGlzLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbk1vdXNlV2hlZWwsIGZhbHNlKTtcclxuICB0aGlzLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRvdWNoc3RhcnQsIGZhbHNlKTtcclxuICB0aGlzLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0b3VjaGVuZCwgZmFsc2UpO1xyXG4gIHRoaXMuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0b3VjaG1vdmUsIGZhbHNlKTtcclxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlb3JpZW50YXRpb24nLCBvbkRldmljZU1vdmUsIGZhbHNlKTtcclxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgZmFsc2UpO1xyXG59O1xyXG5Db250cm9scy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUpO1xyXG5cclxuZXhwb3J0IHtDb250cm9sc307XHJcbiJdfQ==