@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,1343 @@
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 { DecoNode } from '@colijnit/configuratorapi/build/model/deco-node';
11
+ import { DecoNodeType } from '@colijnit/configuratorapi/build/enum/deco-node-type.enum';
12
+ import { DecoNodeKind } from '@colijnit/configuratorapi/build/enum/deco-node-kind.enum';
13
+ import { Injectable } from '@angular/core';
14
+ import { Subject } from 'rxjs';
15
+ import { Euler, Vector3 } from 'three';
16
+ import { NodeType } from '@colijnit/configuratorapi/build/enum/node-type.enum';
17
+ import { HdecoPositioning } from '@colijnit/configuratorapi/build/enum/hdeco-positioning.enum';
18
+ import { environment } from '../../../../../environments/environment';
19
+ import * as TWEEN from '@tweenjs/tween.js';
20
+ import { Factory } from '../../../core3d/items/factory';
21
+ import { CustomFloorItem } from '../../../core3d/items/custom-floor-item';
22
+ import { Item } from '../../../core3d/items/item';
23
+ import { ItemType } from '../../../core3d/items/item-type';
24
+ import { CustomFloorGroupResult } from '../../../core3d/model/custom-floor-group-result';
25
+ import { FurnitureIntegration } from '../model/furniture-integration';
26
+ import { MessageType } from '../../../../core/enum/message-type.enum';
27
+ import { Scene3DUtil } from '../utils/scene-3d.utils';
28
+ import { ErrorMessage } from '../../../../core/model/error-message';
29
+ import { ViewMode } from '../../../../core/enum/view-mode.enum';
30
+ import { ResultType } from '../../../core3d/enum/result-type.enum';
31
+ import { isNill } from '../../../../core/utils/function/is-nill.function';
32
+ import { Utils } from '../../../core3d/core/utils';
33
+ import { MaterialUtils } from '../../../../core/utils/material.utils';
34
+ import { FloorPin } from '../../../core3d/items/floor-pin';
35
+ import { WallPin } from '../../../core3d/items/wall-pin';
36
+ import { FurniturePartIntegration } from '../model/furniture-part-integration';
37
+ import { CustomMesh, CustomObject3D } from '../../../core3d/items/custom-objects';
38
+ import { FurniturePartVariation } from '../model/furniture-part-variation';
39
+ import { FurnitureConnectedPartIntegration } from '../model/furniture-connected-part-integration';
40
+ import { GoogleTagManagerEvent } from '../../../../core/enum/google-tag-manager-event.enum';
41
+ import { CustomWallFloorItem } from '../../../core3d/items/custom-wall-floor-item';
42
+ import { ObjectUtils } from '../../../../core/utils/object.utils';
43
+ import { InfoDialogComponent } from '../../../../shared/info-dialog/info-dialog.component';
44
+ import * as i0 from "@angular/core";
45
+ import * as i1 from "@angular/material/dialog";
46
+ import * as i2 from "../../../../core/service/homedecorator-connector.service";
47
+ import * as i3 from "./threedselector.service";
48
+ import * as i4 from "../../../core3d/collision-manager/collision-manager.service";
49
+ import * as i5 from "../../../../core/service/message-bus.service";
50
+ import * as i6 from "../../../../core/service/homedecorator-dictionary.service";
51
+ import * as i7 from "../../../core3d/service/hud.service";
52
+ import * as i8 from "../../../core3d/service/scene.service";
53
+ import * as i9 from "../../../core3d/service/camera.service";
54
+ import * as i10 from "../../../core3d/service/scene-event.service";
55
+ import * as i11 from "../../../../core/service/homedecorator-app-event.service";
56
+ import * as i12 from "../../../../core/service/presets.service";
57
+ import * as i13 from "../../../core3d/service/item.service";
58
+ import * as i14 from "./element.service";
59
+ import * as i15 from "../../../../core/service/permanent-store.service";
60
+ import * as i16 from "../../../../service/google-tag-manager.service";
61
+ import * as i17 from "../../../../core/service/homedecorator-settings.service";
62
+ import * as i18 from "../../../../core/service/utils.service";
63
+ import * as i19 from "./variation.service";
64
+ import * as i20 from "../../../../core/service/app-state.service";
65
+ import * as i21 from "../../../../core/service/error.service";
66
+ import * as i22 from "../../../core3d/service/item-group.service";
67
+ import * as i23 from "./variation-cache.service";
68
+ import * as i24 from "./resize.service";
69
+ import * as i25 from "../../../../core/service/view-mode.service";
70
+ import * as i26 from "../../../core3d/service/floor.service";
71
+ const defaultPosition = new Vector3(4, 0, 1);
72
+ const defaultRotation = new Euler(0, Math.PI, 0);
73
+ export class BuildFurnitureService {
74
+ constructor(_dialog, _iOne, _threedSelectorService, _collisionManager, _messageBus, _dictionaryService, _hudService, _sceneService, _cameraService, _sceneEventService, _appEventService, _presetService, _itemService, _elementService, _permanentStoreService, _googleTagManager, _settingsService, _utilsService, _variationService, _appStateService, _errorService, _itemGroupService, _variationCacheService, _resizeService, _viewModeService, _floorService) {
75
+ this._dialog = _dialog;
76
+ this._iOne = _iOne;
77
+ this._threedSelectorService = _threedSelectorService;
78
+ this._collisionManager = _collisionManager;
79
+ this._messageBus = _messageBus;
80
+ this._dictionaryService = _dictionaryService;
81
+ this._hudService = _hudService;
82
+ this._sceneService = _sceneService;
83
+ this._cameraService = _cameraService;
84
+ this._sceneEventService = _sceneEventService;
85
+ this._appEventService = _appEventService;
86
+ this._presetService = _presetService;
87
+ this._itemService = _itemService;
88
+ this._elementService = _elementService;
89
+ this._permanentStoreService = _permanentStoreService;
90
+ this._googleTagManager = _googleTagManager;
91
+ this._settingsService = _settingsService;
92
+ this._utilsService = _utilsService;
93
+ this._variationService = _variationService;
94
+ this._appStateService = _appStateService;
95
+ this._errorService = _errorService;
96
+ this._itemGroupService = _itemGroupService;
97
+ this._variationCacheService = _variationCacheService;
98
+ this._resizeService = _resizeService;
99
+ this._viewModeService = _viewModeService;
100
+ this._floorService = _floorService;
101
+ this.toggleSelectedElement = new Subject();
102
+ this.configureModeChanged = new Subject();
103
+ this.buildFinished = new Subject();
104
+ this.answerSelected = new Subject();
105
+ this.arPlacementUpdate = new Subject();
106
+ this.showElementToolbar = false;
107
+ this.isMouseOverObject = false;
108
+ this.activeAnswers = [];
109
+ this.standAloneFirstBuildReady = false;
110
+ this._useNodeIdToLink = true;
111
+ this._standAlone = false;
112
+ this._originalElementPosition = new Vector3();
113
+ this._integrationEnabled = false;
114
+ this._placedAdjustables = [];
115
+ this._placedAddables = [];
116
+ this._adjustables = [];
117
+ this._addables = [];
118
+ this._genericSelection = false;
119
+ this._subs = [];
120
+ this._answerSelected = [];
121
+ this._furnitureConfigurations = [];
122
+ this.mouseOver = () => {
123
+ this.isMouseOverObject = true;
124
+ };
125
+ this.mouseOff = () => {
126
+ this.isMouseOverObject = false;
127
+ };
128
+ this.selectItem = (mesh) => {
129
+ // this.activeInstance = mesh.userData.itemId;
130
+ };
131
+ this.unSelectItem = () => {
132
+ // this.showLiteSelector = false;
133
+ // this.showSelections = false;
134
+ };
135
+ this.selectElement = (element, mousePos) => {
136
+ this._activeChildElement = element;
137
+ if (element.parent instanceof CustomObject3D) {
138
+ this._originalElementPosition.copy(element.parent.position);
139
+ // if (this._currentCustomFloorGroup.adjustable) {
140
+ if (this._isMoveableObject(element.parent)) {
141
+ const connector = element.parent.children.find(c => c.name.toLowerCase().indexOf('c_') > -1);
142
+ if (connector.connectedTo) {
143
+ const baseElement = this._currentCustomFloorGroup.getObjectByName(connector.connectedTo);
144
+ this.baseElementNodeId = baseElement.userData && baseElement.userData.selection ? baseElement.userData.selection.nodeId : 0;
145
+ }
146
+ }
147
+ }
148
+ this.toggleSelectedElement.next(element);
149
+ };
150
+ this.unSelectElement = () => {
151
+ this._activeChildElement = undefined;
152
+ this.toggleSelectedElement.next(undefined);
153
+ };
154
+ this.moveChildElement = (element, pos) => {
155
+ const worldToLocalPos = this._currentCustomFloorGroup.worldToLocal(pos.clone());
156
+ this._moveChildElementToPosition(element, worldToLocalPos);
157
+ };
158
+ this.placeChildElement = (element) => __awaiter(this, void 0, void 0, function* () {
159
+ if (this._isMoveableObject(element) && element.moved) {
160
+ const baseElement = this._currentCustomFloorGroup.getObjectsByUserDataProp('selection', 'nodeId', this.baseElementNodeId);
161
+ // use instanceId from parent
162
+ const item = ObjectUtils.GetParentItem(element);
163
+ if (item) {
164
+ const connector = yield this._elementService.placeElementOnConnector(item.metadata.itemId, element, baseElement.length > 0 ? baseElement[0] : null);
165
+ this._saveElementConnector(element, connector);
166
+ }
167
+ }
168
+ });
169
+ this.changeConfigureMode = (metadata, configuring) => __awaiter(this, void 0, void 0, function* () {
170
+ this.configureModeChanged.next({ metadata: metadata, configuring: configuring });
171
+ });
172
+ this.dragConnector = (connector, pos) => __awaiter(this, void 0, void 0, function* () {
173
+ this._resizeService.dragConnectorToNewPosition(connector, pos);
174
+ });
175
+ this._subs.push(this._iOne.connectionReset.subscribe(() => this._handleConnectionReset()), this._messageBus.subscribe(MessageType.ItemRemoved, (result) => this._handleItemRemovedFromScene(result)), this._messageBus.subscribe(MessageType.Undo, () => this._startWithNew(false)), this._messageBus.subscribe(MessageType.Redo, () => this._startWithNew(false)), this._messageBus.subscribe(MessageType.StartWithEmptyRoom, () => this._startWithNew()), this._messageBus.subscribe(MessageType.StartWithPreset, () => this._startWithNew()), this._messageBus.subscribe(MessageType.LoadRoomFromPreset, () => this._startWithNew()), this._messageBus.subscribe(MessageType.LoadRoomFromCloud, () => this._startWithNew()), this._messageBus.subscribe(MessageType.NewRoom, () => this._startWithNew()), this._messageBus.subscribe(MessageType.ResetRoomplan, () => this._startWithNew()), this._messageBus.subscribe(MessageType.LoadScaledDiagram, () => this._startWithNew()), this._appEventService.enableIntegration.subscribe((enabled) => {
176
+ if (enabled) {
177
+ this._enableIntegration();
178
+ }
179
+ }), this._presetService.beforeLoad.subscribe(() => {
180
+ this._cleanupBeforePresetLoad();
181
+ this._startWithNew();
182
+ }), this._presetService.afterLoad.subscribe(() => this._handleAfterPresetLoad()), this._permanentStoreService.codeSet.subscribe((code) => {
183
+ if (code) {
184
+ this._setCodeOnFurnitureConfiguration();
185
+ }
186
+ }));
187
+ }
188
+ get useNodeIdToLink() {
189
+ return this._useNodeIdToLink;
190
+ }
191
+ get currentCustomFloorGroup() {
192
+ return this._currentCustomFloorGroup;
193
+ }
194
+ get standAlone() {
195
+ return this._standAlone;
196
+ }
197
+ set standAlone(value) {
198
+ this._standAlone = value;
199
+ if (this._standAlone) {
200
+ this._prepareStandAlone();
201
+ }
202
+ }
203
+ get selections() {
204
+ return this._iOne.selections;
205
+ }
206
+ get scene() {
207
+ return this._sceneService.getScene();
208
+ }
209
+ ngOnDestroy() {
210
+ this._subs.forEach(s => s.unsubscribe());
211
+ this._cleanup();
212
+ }
213
+ build(result) {
214
+ return __awaiter(this, void 0, void 0, function* () {
215
+ this._elementService.removeElement(result.instanceId);
216
+ if (result && result.metaData && result.metaData.itemType === ItemType.FloorDecoration) {
217
+ return this._buildFloor(result);
218
+ }
219
+ if (!this.full3DObjectToUse) { // there's no 3d model so get out
220
+ return result;
221
+ }
222
+ const adjustables = this._getAdjustables();
223
+ if (adjustables && adjustables.length === 0) { // check if article has a gameObject
224
+ if (this.selections[0].nodeType === NodeType.Article && this.selections[0].gameObject) {
225
+ adjustables.push(this.selections[0]);
226
+ }
227
+ }
228
+ // this._currentCustomFloorGroup = this._createConfigurableItem(result.instanceId, result.metaData);
229
+ const item = this._createConfigurableItem(result.instanceId, result.metaData);
230
+ if (adjustables && adjustables.length > 0) {
231
+ let connected = false;
232
+ for (let i = 0, len = adjustables.length; i < len; i++) {
233
+ const adjustable = this._createAdjustable(item, adjustables[i]);
234
+ if (adjustable) {
235
+ for (let ii = this._placedAdjustables.length - 1; ii >= 0; ii--) {
236
+ if (this._isMoveableObject(adjustable)) { // vrije verplaatsing mogelijk, connecten aan opgeslagen connector
237
+ const selection = adjustable.userData.selection;
238
+ this._addElementOnConnector(item, adjustable, selection.decoConnection ? selection.decoConnection : this.activeConnector, this.baseElementNodeId);
239
+ adjustable.visible = true;
240
+ connected = true;
241
+ break;
242
+ }
243
+ else {
244
+ if (Scene3DUtil.TrySelectorConnection(this.scene, item, this._placedAdjustables[ii], adjustable, i === 1)) {
245
+ adjustable.visible = true;
246
+ connected = true;
247
+ break;
248
+ }
249
+ }
250
+ connected = false;
251
+ }
252
+ }
253
+ if (!connected && this._placedAdjustables.length > 1 && !environment.production) {
254
+ result.errorMessages.push(new ErrorMessage(`No connection found for: ${adjustable ? adjustable.name : adjustables[i].decoNode.gameObjectName}`));
255
+ }
256
+ }
257
+ this._placeAddables(item);
258
+ yield this._loadVariations(item, result.metaData.itemId);
259
+ this._currentCustomFloorGroup = yield this._replaceCurrentItem(item, result.metaData, true);
260
+ if (this._viewModeService.viewMode !== ViewMode.InPhotoView) {
261
+ this._currentCustomFloorGroup.updatePivot();
262
+ }
263
+ result.furniture = this._currentCustomFloorGroup;
264
+ result.instanceId = result.metaData.itemId;
265
+ this.arPlacementUpdate.next(true);
266
+ this._handleIntegration(result.metaData.itemId, this._currentCustomFloorGroup);
267
+ if (this._currentCustomFloorGroup.itemGroup) {
268
+ this._itemGroupService.reattachToItemGroup(this._currentCustomFloorGroup, this._currentCustomFloorGroup.itemGroup, this._currentCustomFloorGroup.position);
269
+ }
270
+ this._answerSelected.length = 0;
271
+ if (this._currentCustomFloorGroup.children.length === 0) {
272
+ result.resultType = ResultType.GameobjectNameMismatchInSource;
273
+ return Promise.reject(result);
274
+ }
275
+ this._hudService.updateSelectedItemHud();
276
+ this.buildFinished.next(result);
277
+ }
278
+ else {
279
+ result.errorMessages.push(new ErrorMessage('NO_ADJUSTABLES', 'NO_ADJUSTABLES_INFO'));
280
+ result.resultType = ResultType.NoAdjustables;
281
+ return Promise.reject(result);
282
+ }
283
+ if (result.resultType === ResultType.NoSelections) {
284
+ result.resultType = ResultType.ConfigurationFixed;
285
+ }
286
+ else if (result.resultType !== ResultType.Obsolete && result.resultType !== ResultType.ConfigurationFixed) { // don't override these
287
+ result.resultType = ResultType.Loaded;
288
+ }
289
+ this._appEventService.readyToRender.next(this.standAloneFirstBuildReady);
290
+ this._sceneService.updatePathTracer();
291
+ return result;
292
+ });
293
+ }
294
+ startToBuild(result, metadata, shouldCopyInstance = false, looseOriginalConfiguration = true, standAlone, firstBuild = false) {
295
+ return __awaiter(this, void 0, void 0, function* () {
296
+ if (!isNill(standAlone)) {
297
+ this.standAlone = standAlone;
298
+ }
299
+ if (isNill(result)) {
300
+ result = new CustomFloorGroupResult(metadata ? metadata.itemIdentifier : '', metadata ? metadata.itemName : 'unknown');
301
+ result.metaData = metadata;
302
+ }
303
+ if (shouldCopyInstance) {
304
+ const originalInstanceId = result.metaData.itemId;
305
+ if (looseOriginalConfiguration) {
306
+ result.metaData.itemId = yield this._iOne.copyInstanceAndLoseOriginalConfiguration(originalInstanceId, result)
307
+ .catch((e) => {
308
+ return originalInstanceId;
309
+ });
310
+ }
311
+ else {
312
+ result.metaData.itemId = yield this._iOne.copyInstanceAndSaveOriginalConfiguration(originalInstanceId, result)
313
+ .catch((e) => {
314
+ return originalInstanceId;
315
+ });
316
+ }
317
+ }
318
+ if (result.resultType !== ResultType.ArticleNotFound) {
319
+ yield this._setInstanceToConfigure(result)
320
+ .catch((e) => Promise.reject(result));
321
+ }
322
+ result.instanceId = result.metaData.itemId;
323
+ this.startPosition = result.metaData.position ? result.metaData.position.clone() : new Vector3();
324
+ const questionAndAnswers = yield this._iOne.getQuestionAndAnswersAsync(); // see if there is user input needed
325
+ if (questionAndAnswers.question && !questionAndAnswers.question.grouped) {
326
+ this._iOne.handleAnswersReceived(questionAndAnswers.answers);
327
+ }
328
+ this._appEventService.answerCountReceived.next(questionAndAnswers.answers.length);
329
+ if (questionAndAnswers.answers.length === 0) {
330
+ this.activeAnswers = [];
331
+ this.activeQuestion = undefined;
332
+ yield this._prepareSelectionsAndDecos(result)
333
+ .catch((e) => Promise.reject(e));
334
+ return this.build(result);
335
+ }
336
+ else {
337
+ this.activeQuestion = questionAndAnswers.question;
338
+ this.activeAnswers = questionAndAnswers.answers;
339
+ if (firstBuild) {
340
+ yield this._prepareSelectionsAndDecos(result)
341
+ .catch((e) => Promise.reject(e));
342
+ if (this._iOne.selections.length < 1) {
343
+ result.resultType = ResultType.NeedsUserInput;
344
+ }
345
+ else if (this._iOne.selections.length < 2) {
346
+ result.resultType = ResultType.BuildFromScratch;
347
+ }
348
+ else if (this._iOne.selections.length > 1) {
349
+ result.resultType = ResultType.NeedsUserInput;
350
+ }
351
+ return result;
352
+ }
353
+ }
354
+ });
355
+ }
356
+ getOptionsFromSelection(baseSelection) {
357
+ const selections = [];
358
+ let nodeLevel = -1;
359
+ const len = this.selections.length;
360
+ for (let i = 0; i < len; i++) {
361
+ const selection = this.selections[i];
362
+ const level = selection.presentationLevel;
363
+ if (nodeLevel !== -1) {
364
+ if (nodeLevel < level && this._canConnectSelections(baseSelection, selection) && this._selectionPublished(selection)) {
365
+ selections.push(selection);
366
+ }
367
+ if (nodeLevel >= level) {
368
+ break;
369
+ }
370
+ }
371
+ if (selection.id === baseSelection.id && selection.node === baseSelection.node) {
372
+ nodeLevel = level;
373
+ }
374
+ }
375
+ return selections;
376
+ }
377
+ downloadCurrentCustomFloorgroup() {
378
+ const objectToExport = this._currentCustomFloorGroup ? this._currentCustomFloorGroup : this._itemService.items[0];
379
+ this._utilsService.showExportDialog(objectToExport);
380
+ }
381
+ downloadScene() {
382
+ const assetPath = this._settingsService.settings.assetPath;
383
+ // The ground plane looks odd in renders.
384
+ // The hud-ring and hud-circle are the walkthrough mode marker,
385
+ // which is not supposed to be rendered.
386
+ const elementsToRemove = ['ground-plane', 'hud-ring', 'hud-circle'];
387
+ let scene;
388
+ scene = this._sceneService.scene.clone();
389
+ elementsToRemove.forEach(elementName => {
390
+ const selectedObject = scene.getObjectByName(elementName);
391
+ scene.remove(selectedObject);
392
+ });
393
+ scene.add(this._cameraService.camera.clone());
394
+ this._utilsService.showExportDialog(scene);
395
+ }
396
+ createSimple3DModel(result, standAlone) {
397
+ if (!isNill(standAlone)) {
398
+ this.standAlone = standAlone;
399
+ }
400
+ if (!this.full3DObjectToUse) { // there's no 3d model so get out
401
+ return result;
402
+ }
403
+ // there are no selections or decos for simple articles, so empty lists for integration purposes
404
+ this._iOne.emptySelections();
405
+ this.full3DObjectToUse.children.forEach(c => c.visible = true);
406
+ if (!result.metaData.position) {
407
+ result.metaData.position = this.startPosition || defaultPosition;
408
+ }
409
+ if (!result.metaData.rotation) {
410
+ result.metaData.rotation = result.metaData.default180 ? defaultRotation : new Euler();
411
+ }
412
+ const itemConstructor = Factory.getClass(this.standAlone ? ItemType.FloorGroup : result.metaData.itemType);
413
+ const item = new itemConstructor(result.metaData, this.full3DObjectToUse);
414
+ result.metaData.objectUUID = item.uuid;
415
+ item.allowRotate = !this.standAlone;
416
+ item.highLightDisabled = !this._settingsService.settings.options.useStandaloneHighLight;
417
+ this._itemService.addItem(item);
418
+ if (item.itemGroup) {
419
+ this._itemGroupService.reattachToItemGroup(item, item.itemGroup, item.position);
420
+ }
421
+ // For simple articles we use object uuid, because they don't have an instanceId
422
+ this._upsertFurniture(item.uuid, { BrandIdentifier: result.metaData.itemIdentifier }, item);
423
+ this._handleIntegration(item.uuid, item);
424
+ result.furniture = item;
425
+ this._sceneService.updatePathTracer();
426
+ return result;
427
+ }
428
+ _buildFloor(result) {
429
+ return __awaiter(this, void 0, void 0, function* () {
430
+ const item = this._floorService.floorToConfigure;
431
+ item.metadata = result.metaData;
432
+ item.children[0].userData.selection = this.selections[0];
433
+ item.configuringChangeHandler = this.changeConfigureMode;
434
+ item.selectedHandler = this.selectItem;
435
+ item.unselectedHandler = this.unSelectItem;
436
+ yield this._loadVariations(item, result.metaData.itemId);
437
+ this._floorService.unHighLightFloors();
438
+ this._sceneService.needsRender = true;
439
+ this._currentCustomFloorGroup = item;
440
+ result.furniture = this._currentCustomFloorGroup;
441
+ result.instanceId = result.metaData.itemId;
442
+ this._handleIntegration(result.metaData.itemId, this._currentCustomFloorGroup);
443
+ if (this._currentCustomFloorGroup.itemGroup) {
444
+ this._itemGroupService.reattachToItemGroup(this._currentCustomFloorGroup, this._currentCustomFloorGroup.itemGroup, this._currentCustomFloorGroup.position);
445
+ }
446
+ this._answerSelected.length = 0;
447
+ this._hudService.updateSelectedItemHud();
448
+ this.buildFinished.next(result);
449
+ if (result.resultType === ResultType.NoSelections) {
450
+ result.resultType = ResultType.ConfigurationFixed;
451
+ }
452
+ else if (result.resultType !== ResultType.Obsolete && result.resultType !== ResultType.ConfigurationFixed) { // don't override these
453
+ result.resultType = ResultType.Loaded;
454
+ }
455
+ return result;
456
+ });
457
+ }
458
+ _startToBuildFromConfigurator(metadata) {
459
+ return this.startToBuild(null, metadata);
460
+ }
461
+ _setInstanceToConfigure(result) {
462
+ return __awaiter(this, void 0, void 0, function* () {
463
+ if (result.resultType !== ResultType.Timeout) {
464
+ if (result.metaData.itemId) {
465
+ yield this._iOne.setInstance(result.metaData.itemId)
466
+ .catch((e) => {
467
+ result.errorMessages.push(new ErrorMessage(e));
468
+ Promise.reject(result);
469
+ });
470
+ }
471
+ else {
472
+ const response = yield this._iOne.initNodeInstance(result.metaData.itemIdentifier)
473
+ .catch((e) => {
474
+ result.errorMessages.push(new ErrorMessage(e));
475
+ Promise.reject(result);
476
+ });
477
+ if (response && response.validationResult && response.validationResult.success) {
478
+ result.metaData.itemId = response.resultObject;
479
+ }
480
+ else {
481
+ Promise.reject(result);
482
+ }
483
+ yield this._iOne.setInstance(result.metaData.itemId)
484
+ .catch((e) => {
485
+ result.errorMessages.push(new ErrorMessage(e));
486
+ Promise.reject(result);
487
+ });
488
+ }
489
+ return result;
490
+ }
491
+ else {
492
+ return Promise.reject();
493
+ }
494
+ });
495
+ }
496
+ _prepareSelectionsAndDecos(result) {
497
+ return __awaiter(this, void 0, void 0, function* () {
498
+ this._reset();
499
+ try {
500
+ const selectionsAndDecoPromise = [];
501
+ selectionsAndDecoPromise.push(this._iOne.getSelectionsAsync(), this._iOne.getDecosAsync());
502
+ yield Promise.all(selectionsAndDecoPromise);
503
+ this._preloadMaterials(result.metaData.schema);
504
+ }
505
+ catch (e) {
506
+ }
507
+ if (this._iOne.selections.length < 2) { // no selections, only selection of type 'ART'
508
+ try {
509
+ if (result.resultType !== ResultType.ArticleNotFound && !result.metaData.originalItemId) { // article found, so init that first
510
+ result.metaData.originalItemId = result.metaData.itemId;
511
+ result.metaData.itemId = null;
512
+ yield this._setInstanceToConfigure(result);
513
+ result.resultType = ResultType.NoSelections;
514
+ return this.startToBuild(result); // 'restart' the build
515
+ }
516
+ this._getSelectionsAndDecosFromMetadata(result);
517
+ }
518
+ catch (e) {
519
+ return Promise.reject(e);
520
+ }
521
+ }
522
+ this._iOne.selections.forEach(s => {
523
+ s.schema = result.metaData.schema;
524
+ s.instanceId = result.metaData.itemId;
525
+ }); // add schema for material creation
526
+ this._handleSelectionsReceived(result.metaData);
527
+ this._linkSelectionsAndDecos();
528
+ this._prepareTheSelections(result.metaData.itemId);
529
+ });
530
+ }
531
+ _preloadMaterials(schema) {
532
+ this._variationCacheService.preloadVariations(schema, this._iOne.decoNodes.map(d => d.gameObjectName), this.articleAssetPath);
533
+ }
534
+ _getSelectionsAndDecosFromMetadata(result) {
535
+ if (result.metaData.selections && result.metaData.decos) {
536
+ this._iOne.setSelections(result.metaData.selections);
537
+ this._iOne.setDecoNodes(Array.from(result.metaData.decos.values()));
538
+ result.metaData.obsolete = true;
539
+ if (result.resultType !== ResultType.ConfigurationNotFixed) {
540
+ result.resultType = ResultType.Obsolete;
541
+ }
542
+ }
543
+ else {
544
+ if (this._iOne.selections.length < 2 || this._iOne.decoNodes.length === 0) {
545
+ result.errorMessages.push(new ErrorMessage('NO_SELECTIONS_OR_DECOS', 'NO_SELECTIONS_OR_DECOS_INFO'));
546
+ }
547
+ throw result;
548
+ }
549
+ }
550
+ _selectionPublished(selection) {
551
+ return ((selection.hierarchicalPublicationCode === null) || ((selection.hierarchicalPublicationCode & 2) > 0)) &&
552
+ ((selection.nodeType === NodeType.Question &&
553
+ (((selection.questionPublicationCode & 2) > 0) ||
554
+ selection.questionPublicationCode === null || selection.questionPublicationCode === undefined)) ||
555
+ (selection.nodeType === NodeType.Answer &&
556
+ (((selection.answerPublicationCode & 2) > 0) ||
557
+ selection.answerPublicationCode === null || selection.answerPublicationCode === undefined)));
558
+ }
559
+ _handleIntegration(instanceId, object) {
560
+ if (this._integrationEnabled && !object.metadata.obsolete) {
561
+ const genericVariationSelections = this._iOne.selections.filter(s => s.decoNode && s.generic &&
562
+ s.decoNode.variation && s.decoNode.variation.type === DecoNodeType.Variation);
563
+ if (genericVariationSelections && genericVariationSelections.length > 0) {
564
+ this._upsertFurniture(instanceId, {
565
+ Variation: genericVariationSelections[0].decoNode.variation.brandId,
566
+ VariationDescription: genericVariationSelections[0].decoNode.variation.gameObjectName,
567
+ SupplierArticleNr: genericVariationSelections[0].decoNode.variation.supplierArticleNr
568
+ }, object);
569
+ }
570
+ this._handleIntegrationConnections(instanceId, object);
571
+ this._upsertFurniture(instanceId, { Position: object.position, Rotation: object.rotation }, object);
572
+ this._messageBus.emit(MessageType.ConfigurationChanged, this._furnitureConfigurations);
573
+ // console.log(this._furnitureConfigurations);
574
+ }
575
+ }
576
+ _startWithNew(cleanup = true) {
577
+ this._furnitureConfigurations.length = 0;
578
+ if (cleanup) {
579
+ this._placedAdjustables.forEach(a => Utils.DisposeObject(a));
580
+ this._placedAddables.forEach(a => Utils.DisposeObject(a));
581
+ this._cleanup();
582
+ }
583
+ }
584
+ _cleanupBeforePresetLoad() {
585
+ MaterialUtils.ClearCaches();
586
+ }
587
+ /*
588
+ * Clear variables to let objects being disposed properly
589
+ */
590
+ _handleAfterPresetLoad() {
591
+ // make sure nothing is keeping a lock
592
+ this._iOne.setInstance(null);
593
+ // clean
594
+ this._cleanup();
595
+ }
596
+ _cleanup() {
597
+ Utils.DisposeObject(this.full3DObjectToUse);
598
+ this.full3DObjectToUse = undefined;
599
+ this._currentCustomFloorGroup = undefined;
600
+ Utils.DisposeObject(this._activeChildElement);
601
+ this._activeChildElement = undefined;
602
+ this._placedAdjustables.length = 0;
603
+ this._placedAddables.length = 0;
604
+ this._adjustables.length = 0;
605
+ this._addables.length = 0;
606
+ }
607
+ _enableIntegration() {
608
+ this._integrationEnabled = true;
609
+ }
610
+ _handleItemRemovedFromScene(result) {
611
+ if (result.addedToGroup) {
612
+ return;
613
+ }
614
+ if (result.item instanceof Item && !(result.item instanceof FloorPin || result.item instanceof WallPin)) {
615
+ if (this._integrationEnabled && result.item.userData) {
616
+ const id = result.item.userData.itemId ? result.item.userData.itemId : result.item.uuid;
617
+ this._furnitureConfigurations.splice(this._furnitureConfigurations.findIndex(f => f.Id === id), 1);
618
+ this._messageBus.emit(MessageType.ConfigurationChanged, this._furnitureConfigurations);
619
+ // console.log(this._furnitureConfigurations);
620
+ }
621
+ this._clearElements(result.item);
622
+ this._cleanup();
623
+ }
624
+ }
625
+ _clearElements(item) {
626
+ if (item instanceof CustomFloorItem && item.userData && item.userData.itemId) {
627
+ this.baseElementNodeId = undefined;
628
+ this._originalElementPosition.set(0, 0, 0);
629
+ this._elementService.removeElement(item.userData.itemId);
630
+ }
631
+ }
632
+ _handleIntegrationConnections(id, object) {
633
+ const parts = [];
634
+ const childParts = object.configurable ? object.children : [object];
635
+ const len = childParts.length;
636
+ for (let i = 0; i < len; i++) {
637
+ const child = childParts[i];
638
+ const connection = new FurniturePartIntegration();
639
+ const variations = [];
640
+ if (child.userData && child.userData.selection && child.userData.selection.decoNode) {
641
+ connection.Id = childParts.findIndex(c => c === child).toString();
642
+ connection.SupplierArticleNr = child.userData.selection.supplierArticleNr;
643
+ connection.BrandIdentifier = child.userData.selection.decoNode.brandId;
644
+ connection.BrandDescription = child.userData.selection.decoNode.gameObjectName;
645
+ connection.Position = child.position;
646
+ connection.Rotation = child.rotation;
647
+ if (child.userData.selection.variations) {
648
+ if (child.userData.selection.variations.length === 1) {
649
+ const variation = child.userData.selection.variations[0];
650
+ connection.Variation = variation.brandId;
651
+ connection.VariationDescription = variation.gameObjectName;
652
+ }
653
+ else {
654
+ for (let j = 0; j < child.userData.selection.variations.length; j++) {
655
+ const variation = child.userData.selection.variations[j];
656
+ const variationPart = new FurniturePartVariation();
657
+ variationPart.Variation = variation.brandId;
658
+ variationPart.VariationDescription = variation.gameObjectName;
659
+ variationPart.MaterialId = variation.materialId;
660
+ variationPart.SupplierArticleNr = variation.supplierArticleNr;
661
+ variationPart.Option = variation.optionText;
662
+ variations.push(variationPart);
663
+ }
664
+ connection.Variations = variations;
665
+ }
666
+ }
667
+ }
668
+ else { // a-artikel
669
+ connection.Id = childParts.findIndex(c => c === child).toString();
670
+ connection.BrandIdentifier = child.metadata.itemIdentifier;
671
+ connection.BrandDescription = child.metadata.itemName;
672
+ connection.Position = child.position;
673
+ connection.Rotation = child.rotation;
674
+ }
675
+ const connectors = [];
676
+ const clen = child.children.length;
677
+ for (let j = 0; j < clen; j++) {
678
+ const connector = child.children[j];
679
+ if ((connector instanceof CustomObject3D || connector instanceof CustomMesh) && connector.connectedTo) {
680
+ const conn = new FurnitureConnectedPartIntegration();
681
+ conn.ConnectionLabel = connector.name;
682
+ const foreignPartIdx = this._currentCustomFloorGroup.children.findIndex(c => c.name === connector.connectedTo);
683
+ conn.ForeignConnectionLabel = this._currentCustomFloorGroup.children[foreignPartIdx].userData.selection.decoNode.gameObjectName;
684
+ conn.ForeignPartId = foreignPartIdx.toString();
685
+ conn.Position = connector.position;
686
+ conn.Rotation = connector.rotation;
687
+ connectors.push(conn);
688
+ }
689
+ }
690
+ connection.ConnectedParts = connectors;
691
+ parts.push(connection);
692
+ }
693
+ this._upsertFurniture(id, { Parts: parts }, object);
694
+ }
695
+ _upsertFurniture(id, object, item) {
696
+ if (this._integrationEnabled && !item.metadata.obsolete) {
697
+ const idx = this._furnitureConfigurations.findIndex(f => f.Id === id);
698
+ let furniture;
699
+ if (idx < 0) {
700
+ if (this._furnitureConfigurations.length === 1 && !this._furnitureConfigurations[0].Id) { // empty entry for mrp code, re-use that one
701
+ furniture = this._furnitureConfigurations[0];
702
+ }
703
+ else {
704
+ furniture = new FurnitureIntegration();
705
+ this._furnitureConfigurations.push(furniture);
706
+ }
707
+ furniture.Id = id;
708
+ }
709
+ else {
710
+ furniture = this._furnitureConfigurations[idx];
711
+ }
712
+ furniture.MrpCode = this._permanentStoreService.code;
713
+ for (const key in object) {
714
+ if (furniture.hasOwnProperty(key) && object.hasOwnProperty(key)) {
715
+ furniture[key] = object[key];
716
+ }
717
+ }
718
+ }
719
+ }
720
+ _setCodeOnFurnitureConfiguration() {
721
+ if (this._integrationEnabled) {
722
+ if (this._furnitureConfigurations.length < 1) {
723
+ const furniture = new FurnitureIntegration();
724
+ furniture.MrpCode = this._permanentStoreService.code;
725
+ this._furnitureConfigurations.push(furniture);
726
+ }
727
+ else {
728
+ this._furnitureConfigurations.forEach(f => f.MrpCode = this._permanentStoreService.code);
729
+ }
730
+ this._messageBus.emit(MessageType.ConfigurationChanged, this._furnitureConfigurations);
731
+ }
732
+ }
733
+ _canConnectSelections(sel1, sel2) {
734
+ if (!sel1.decoNode || !sel2.decoNode) {
735
+ return false;
736
+ }
737
+ let canConnect = sel2.decoNode.type !== DecoNodeType.Part;
738
+ if (!canConnect) {
739
+ const len = sel1.decoNode.connectors.length;
740
+ for (let i = 0; i < len; i++) {
741
+ const leni = sel2.decoNode.connectors.length;
742
+ for (let ii = 0; ii < leni; ii++) {
743
+ canConnect = Scene3DUtil.CanSelectorConnect(sel1.decoNode.connectors, sel1.decoNode.connectors[i], sel2.decoNode.connectors[ii]);
744
+ if (canConnect) {
745
+ return true;
746
+ }
747
+ }
748
+ }
749
+ return false;
750
+ }
751
+ return canConnect;
752
+ }
753
+ _handleSelectionsReceived(metadata) {
754
+ if (this._answerSelected.length > 0) {
755
+ const selection = this.selections.find(s => s.nodeId === this._answerSelected[this._answerSelected.length - 1].nodeId);
756
+ if (selection) {
757
+ let itemName = '';
758
+ if (metadata.itemName === '') {
759
+ if (metadata.itemDescription !== '') {
760
+ itemName = metadata.itemDescription;
761
+ }
762
+ else {
763
+ itemName = metadata.itemIdentifier;
764
+ }
765
+ }
766
+ else {
767
+ itemName = metadata.itemName;
768
+ }
769
+ this._googleTagManager.sendEvent(GoogleTagManagerEvent.AnswerChosen, {
770
+ 'articleNr': metadata.itemIdentifier,
771
+ 'product': itemName,
772
+ 'optionDescription': selection.commercialAnswer ? selection.commercialAnswer : selection.answer,
773
+ 'optionPath': selection.selection
774
+ });
775
+ }
776
+ }
777
+ }
778
+ _handleConnectionReset() {
779
+ if (this._currentCustomFloorGroup) {
780
+ this._currentCustomFloorGroup.setUnselected();
781
+ this._messageBus.emit(MessageType.ItemUnselected, undefined);
782
+ this._showWarning({ title: 'WARNING', message: 'REFRESH_DUE_TO_INACTIVITY' });
783
+ }
784
+ }
785
+ _handleAnswerSelected(answer) {
786
+ this._answerSelected.push(answer);
787
+ }
788
+ cancelAnswer(metadata, rebuild = true, getAnswers = false) {
789
+ return __awaiter(this, void 0, void 0, function* () {
790
+ yield this._iOne.cancelAnswer();
791
+ if (rebuild) {
792
+ this._startToBuildFromConfigurator(metadata);
793
+ }
794
+ else if (getAnswers) { // if not rebuild then check if we need to get answers
795
+ const questionAndAnswers = yield this._iOne.getQuestionAndAnswersAsync(); // see if there is user input needed
796
+ this._iOne.handleAnswersReceived(questionAndAnswers.answers);
797
+ this._appEventService.answerCountReceived.next(questionAndAnswers.answers.length);
798
+ }
799
+ });
800
+ }
801
+ selectSelection(selection, metadata, forceBackToNode, after, connector) {
802
+ return __awaiter(this, void 0, void 0, function* () {
803
+ yield this._iOne.selectSelection(selection, forceBackToNode, after, connector);
804
+ this._genericSelection = selection.generic;
805
+ this._startToBuildFromConfigurator(metadata);
806
+ });
807
+ }
808
+ deleteSelection(selection, metadata) {
809
+ return __awaiter(this, void 0, void 0, function* () {
810
+ this._elementService.removeElement(selection.instanceId, selection.node);
811
+ yield this._iOne.deleteSelection(selection);
812
+ this._startToBuildFromConfigurator(metadata);
813
+ });
814
+ }
815
+ replaceSelection(selection, metadata) {
816
+ return __awaiter(this, void 0, void 0, function* () {
817
+ yield this._iOne.replaceSelection(selection);
818
+ this._startToBuildFromConfigurator(metadata);
819
+ });
820
+ }
821
+ selectAnswer(answer, input, metadata) {
822
+ return __awaiter(this, void 0, void 0, function* () {
823
+ this._preloadMaterial(answer);
824
+ yield this._iOne.selectAnswer(answer, input);
825
+ this._handleAnswerSelected(answer);
826
+ const result = yield this._startToBuildFromConfigurator(metadata);
827
+ this.answerSelected.next(result);
828
+ });
829
+ }
830
+ _getActiveFurniture(instanceId) {
831
+ const configurables = this._itemService.getConfigurables();
832
+ const len = configurables.length;
833
+ for (let i = 0; i < len; i++) {
834
+ if (configurables[i].metadata && configurables[i].metadata.itemId === instanceId && !configurables[i].tempObject) {
835
+ return configurables[i];
836
+ }
837
+ }
838
+ }
839
+ _linkSelectionsAndDecos() {
840
+ const len = this.selections.length;
841
+ for (let i = 0; i < len; i++) {
842
+ // const id: string = this.selections[i].artNodeIdDeco;
843
+ let deco = this._iOne.decoNodes.find(d => d.id === this.selections[i].artNodeIdDeco);
844
+ if (!deco) {
845
+ deco = new DecoNode();
846
+ }
847
+ if (deco.type !== DecoNodeType.Variation) {
848
+ const variation = this._getVariations().find(v => v.parentId === this.selections[i].artNodeIdDeco);
849
+ if (variation) {
850
+ deco.variation = variation;
851
+ }
852
+ }
853
+ this.selections[i].decoNode = deco;
854
+ }
855
+ this._iOne.selectionsAndDecosLinked.next();
856
+ }
857
+ _createConfigurableItem(instanceId, metadata) {
858
+ // const furniture: Item = this._getActiveFurniture(instanceId);
859
+ // const cloneSelections = JSON.parse(JSON.stringify(this.selections));
860
+ // cloneSelections.forEach(s => {
861
+ // s.imageData = undefined;
862
+ // s.imageDataLastAnswer = undefined;
863
+ // });
864
+ // if (furniture) {
865
+ // furniture.metadata.decos = Array.from(this._iOne.decoNodes);
866
+ // furniture.metadata.selections = cloneSelections;
867
+ // furniture.markForDeletionChildren();
868
+ // return furniture;
869
+ // }
870
+ if (!metadata.position) {
871
+ metadata.position = this.startPosition || defaultPosition;
872
+ }
873
+ if (!metadata.rotation) {
874
+ metadata.rotation = metadata.default180 ? defaultRotation : new Euler();
875
+ }
876
+ // If itemType is different in article compared to saved value in the .json, the itemType in article is applied
877
+ // metadata.itemType = this.itemType && this.itemType !== metadata.itemType ? this.itemType : metadata.itemType;
878
+ const itemConstructor = Factory.getClass(this.standAlone ? ItemType.CustomFloorGroup : metadata.itemType);
879
+ const item = new itemConstructor(metadata, undefined, // base on empty object
880
+ {
881
+ mouseOver: this.mouseOver,
882
+ mouseOff: this.mouseOff,
883
+ itemSelected: this.selectItem,
884
+ itemUnselected: this.unSelectItem,
885
+ elementSelected: this.selectElement,
886
+ elementUnselected: this.unSelectElement,
887
+ configuringChanged: this.changeConfigureMode,
888
+ childElementPositionChangedHandler: this.moveChildElement,
889
+ childElementPlaceHandler: this.placeChildElement
890
+ /*
891
+ childElementPositionChangedHandler: adjustable ? this.moveChildElement : undefined,
892
+ childElementPlaceHandler: adjustable ? this.placeChildElement : undefined
893
+ */
894
+ });
895
+ item.canDelete = !this.standAlone;
896
+ item.canCopy = !this.standAlone;
897
+ item.allwaysConfigureMode = this.standAlone;
898
+ item.highLightDisabled = !this._settingsService.settings.options.useStandaloneHighLight;
899
+ item.tempObject = true;
900
+ item.name = metadata.itemName + '_clone';
901
+ item.visible = false;
902
+ this._itemService.addItem(item);
903
+ // this._upsertFurniture(metadata.itemId, {BrandIdentifier: metadata.itemIdentifier}, item);
904
+ return item;
905
+ }
906
+ _createPositionAnimation(object, from, to, easing) {
907
+ const tweenFrom = new Vector3().copy(from);
908
+ const tween = new TWEEN.Tween(tweenFrom)
909
+ .to(to, 1000)
910
+ .easing(easing)
911
+ .onUpdate(() => {
912
+ object.position.copy(tweenFrom);
913
+ this._sceneService.needsRender = true;
914
+ });
915
+ return new Promise((resolve, reject) => tween.onComplete(resolve.bind(this, tween)).onStop(reject).start());
916
+ }
917
+ _animateChanges(furniture, changes) {
918
+ return __awaiter(this, void 0, void 0, function* () {
919
+ // it's christmasss
920
+ const animations = [];
921
+ if (furniture instanceof CustomFloorItem) {
922
+ for (let i = 0; i < changes.length; i++) {
923
+ const easing = !changes[i].oldPosition ? TWEEN.Easing.Exponential.Out :
924
+ (!changes[i].newPosition ? TWEEN.Easing.Exponential.Out : TWEEN.Easing.Exponential.InOut);
925
+ const from = changes[i].oldPosition ? new Vector3().copy(changes[i].oldPosition) : new Vector3().copy(changes[i].newPosition).setY(10);
926
+ const to = changes[i].newPosition ? new Vector3().copy(changes[i].newPosition) : new Vector3().copy(changes[i].oldPosition).setY(10);
927
+ const obj = furniture.getObjectByName(changes[i].name);
928
+ if (!from.equals(to)) {
929
+ animations.push(this._createPositionAnimation(obj, from, to, easing));
930
+ }
931
+ }
932
+ }
933
+ return yield Promise.all(animations);
934
+ });
935
+ }
936
+ _replaceCurrentItem(newItem, metadata, animate = false) {
937
+ return __awaiter(this, void 0, void 0, function* () {
938
+ const furniture = this._getActiveFurniture(metadata.itemId);
939
+ const cloneSelections = JSON.parse(JSON.stringify(this.selections));
940
+ cloneSelections.forEach(s => {
941
+ s.imageData = undefined;
942
+ s.imageDataLastAnswer = undefined;
943
+ if (s.addables) {
944
+ s.addables.forEach(a => {
945
+ a.imageData = undefined;
946
+ });
947
+ }
948
+ });
949
+ if (furniture) {
950
+ furniture.metadata.decos = Array.from(this._iOne.decoNodes);
951
+ furniture.metadata.selections = cloneSelections;
952
+ if (furniture instanceof CustomWallFloorItem) {
953
+ newItem.currentWall = furniture.currentWall;
954
+ }
955
+ newItem.updatePivot();
956
+ const changes = furniture instanceof CustomFloorItem ? ObjectUtils.GetChanges(furniture.children, newItem.children) : [];
957
+ // animate removed items
958
+ const removedChanges = changes.filter(c => !c.newPosition);
959
+ if (animate && removedChanges && removedChanges.length > 0) { // animate changes to the model
960
+ yield this._animateChanges(furniture, removedChanges);
961
+ }
962
+ // remove children from furniture
963
+ furniture.clearChildren();
964
+ // add new children to furniture
965
+ newItem.children.map(c => furniture.addChild(c));
966
+ this._itemService.removeItem(newItem, false, false);
967
+ // animate (new) items
968
+ const otherChanges = changes.filter(c => c.newPosition);
969
+ if (animate && otherChanges && otherChanges.length > 0) { // animate changes to the model
970
+ yield this._animateChanges(furniture, otherChanges);
971
+ }
972
+ return furniture;
973
+ }
974
+ else {
975
+ newItem.visible = true;
976
+ newItem.tempObject = false;
977
+ newItem.name = metadata.itemName;
978
+ this._upsertFurniture(metadata.itemId, { BrandIdentifier: metadata.itemIdentifier }, newItem);
979
+ return newItem;
980
+ }
981
+ });
982
+ }
983
+ cancelConfiguringCurrentInstance() {
984
+ if (this._currentCustomFloorGroup) {
985
+ this._currentCustomFloorGroup.configuring = false;
986
+ }
987
+ }
988
+ _isMoveableObject(obj) {
989
+ return obj.userData && obj.userData.selection && obj.userData.selection.hdecoPositioning === HdecoPositioning.Variable;
990
+ }
991
+ _addElementOnConnector(currentItem, element, connector, connectedNodeId) {
992
+ return __awaiter(this, void 0, void 0, function* () {
993
+ // const con: Object3D = this._currentCustomFloorGroup.getObjectByName(connector.connector);
994
+ // if (con) {e
995
+ // const pos: Vector3 = new Vector3().copy(con.position);
996
+ // con.localToWorld(pos);
997
+ const connectorFromElement = currentItem.connectorFromElement(element.userData.selection);
998
+ const idFromBaseElement = connectedNodeId ? connectedNodeId : connectorFromElement.connectedNodeId;
999
+ const baseElement = currentItem.getObjectsByUserDataProp('selection', 'nodeId', idFromBaseElement);
1000
+ const item = ObjectUtils.GetParentItem(element);
1001
+ if (item) {
1002
+ const conn = yield this._elementService.placeElementOnConnector(item.metadata.itemId, element, baseElement.length > 0 ? baseElement[0] : null, false, connector, false);
1003
+ this._saveElementConnector(element, conn);
1004
+ }
1005
+ // }
1006
+ });
1007
+ }
1008
+ _saveElementConnector(element, connector) {
1009
+ if (element && element.userData && element.userData.selection) {
1010
+ this._currentCustomFloorGroup.updateElementConnector(element.userData.selection, connector, this.baseElementNodeId);
1011
+ }
1012
+ }
1013
+ /**
1014
+ * @param element The element to move
1015
+ * @param pos The local position
1016
+ * @private
1017
+ */
1018
+ _moveChildElementToPosition(element, pos) {
1019
+ if (this._isMoveableObject(element)) {
1020
+ const worldToLocalPos = new Vector3().copy(pos).add(this._originalElementPosition);
1021
+ const baseElement = this._currentCustomFloorGroup.getObjectsByUserDataProp('selection', 'nodeId', this.baseElementNodeId);
1022
+ const item = ObjectUtils.GetParentItem(element);
1023
+ if (item) {
1024
+ this._elementService.moveElementToNewPosition(item.metadata.itemId, element, worldToLocalPos, baseElement.length > 0 ? baseElement[0] : null);
1025
+ // this._saveElementConnector(element, pos);
1026
+ }
1027
+ }
1028
+ }
1029
+ _reset() {
1030
+ this._placedAdjustables.length = 0;
1031
+ this._placedAddables.length = 0;
1032
+ this._adjustables.length = 0;
1033
+ this._addables.length = 0;
1034
+ // this._prepareTheSelections();
1035
+ // todo: check this
1036
+ // this._elementService.removeElement(this.activeInstance);
1037
+ }
1038
+ /**
1039
+ * Returns the materialId of the parent up the tree until presentionlevel 1 is reached
1040
+ * @param id
1041
+ * @private
1042
+ */
1043
+ _getMaterialIdFromParent(id) {
1044
+ const idx = this.selections.findIndex(s => s.node === id);
1045
+ let currentLevel = 999;
1046
+ if (idx > -1) {
1047
+ for (let i = idx; i > 0; i--) {
1048
+ const selection = this.selections[i];
1049
+ if (selection.presentationLevel >= currentLevel) {
1050
+ break;
1051
+ }
1052
+ currentLevel = selection.presentationLevel;
1053
+ if (selection.hdecoGameObject) {
1054
+ return selection.hdecoGameObject;
1055
+ }
1056
+ }
1057
+ }
1058
+ return undefined;
1059
+ }
1060
+ _prepareTheSelections(instanceId) {
1061
+ const selections = this.selections.slice();
1062
+ const selectionOfArticle = selections.find(s => s.nodeType === NodeType.Article);
1063
+ const adjustableSelections = selections.filter(s => s.addAdjust === '2');
1064
+ const isArticleWithMaterial = adjustableSelections.length === 0 &&
1065
+ selectionOfArticle.gameObject &&
1066
+ selectionOfArticle.gameObject.length > 0;
1067
+ // get generic variations
1068
+ const globalVariations = this.selections
1069
+ .filter(s => (s.generic || adjustableSelections.length === 1) && s.decoNode.variation && !s.decoNode.type)
1070
+ .map((value, index, array) => {
1071
+ // find selection of variation
1072
+ const sel = this.selections.find(s => s.artNodeIdDeco === value.decoNode.variation.parentId);
1073
+ if (sel) {
1074
+ value.decoNode.variation.supplierArticleNr = sel.supplierArticleNr;
1075
+ }
1076
+ value.decoNode.variation.materialId = this._getMaterialIdFromParent(value.node);
1077
+ return value.decoNode.variation;
1078
+ });
1079
+ // commented out for the moment
1080
+ // globalVariations.forEach(g => {
1081
+ // const parentIdx = selections.findIndex(s => s.decoNode && s.decoNode.id === g.parentId);
1082
+ // if (parentIdx) { // remove parent selection
1083
+ // selections.splice(parentIdx, 1);
1084
+ // }
1085
+ // const idx = selections.findIndex(s => s.decoNode && s.decoNode.id === g.id);
1086
+ // if (idx) { // move generic variations to top
1087
+ // const selection = selections[idx];
1088
+ // selections.splice(idx, 1);
1089
+ // selections.unshift(selection);
1090
+ // }
1091
+ // });
1092
+ const usedVariations = [];
1093
+ let globalVariationsRewrite = true;
1094
+ const len = selections.length;
1095
+ let lastAdded;
1096
+ let lastAdjustable;
1097
+ let newPart = false;
1098
+ let previousPresLevel = -1;
1099
+ let positioning;
1100
+ let optionText;
1101
+ for (let i = 0; i < len; i++) {
1102
+ const selection = selections[i];
1103
+ if (selection.presentationLevel === 1) {
1104
+ positioning = selection.hdecoPositioning;
1105
+ optionText = selection.question;
1106
+ }
1107
+ if (selection.presentationLevel > previousPresLevel) {
1108
+ selection.hdecoPositioning = selection.hdecoPositioning || positioning;
1109
+ }
1110
+ if (selection.decoNode) {
1111
+ if (selection.decoNode.type === DecoNodeType.Variation) {
1112
+ const decoNode = selection.decoNode;
1113
+ decoNode.optionText = optionText;
1114
+ // find selection of variation and set materialId in case of multimaterial
1115
+ decoNode.materialId = this._getMaterialIdFromParent(decoNode.nodeId);
1116
+ if (lastAdded) {
1117
+ if (newPart) {
1118
+ if (decoNode.materialId) {
1119
+ lastAdded.variations.push(decoNode);
1120
+ }
1121
+ else {
1122
+ lastAdded.variations = [decoNode];
1123
+ }
1124
+ }
1125
+ else {
1126
+ lastAdded.variations.push(decoNode);
1127
+ }
1128
+ newPart = false;
1129
+ }
1130
+ else {
1131
+ if (globalVariationsRewrite) {
1132
+ globalVariations.length = 0;
1133
+ globalVariationsRewrite = false;
1134
+ }
1135
+ globalVariations.push(decoNode);
1136
+ }
1137
+ // const variation: FurniturePartVariation = new FurniturePartVariation();
1138
+ // variation.BrandId = selection.decoNode.brandId;
1139
+ // variation.Description = selection.decoNode.gameObjectName;
1140
+ // variation.MaterialId = (selection.decoNode as any).materialId;
1141
+ // variation.SupplierArticleNr = (selection.decoNode as any).supplierArticleNr;
1142
+ // usedVariations.push(variation);
1143
+ }
1144
+ else if ((selection.decoNode.type === DecoNodeType.Part &&
1145
+ typeof selection.decoNode.gameObjectName === 'string' &&
1146
+ selection.decoNode.gameObjectName.length) || (isArticleWithMaterial)) {
1147
+ if (selection.decoNode.kind === DecoNodeKind.Adjustable || (isArticleWithMaterial)) {
1148
+ selection.variations = globalVariations;
1149
+ this._adjustables.push(selection);
1150
+ if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
1151
+ newPart = true;
1152
+ }
1153
+ lastAdded = selection;
1154
+ lastAdjustable = selection;
1155
+ }
1156
+ else if (selection.decoNode.kind === DecoNodeKind.Addable) {
1157
+ selection.variations = lastAdjustable ? lastAdjustable.variations : globalVariations;
1158
+ if (lastAdjustable) {
1159
+ lastAdjustable.addables.push(selection);
1160
+ }
1161
+ this._addables.push(selection);
1162
+ if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
1163
+ newPart = true;
1164
+ }
1165
+ lastAdded = selection;
1166
+ }
1167
+ }
1168
+ }
1169
+ previousPresLevel = selection.presentationLevel;
1170
+ }
1171
+ // this._upsertFurniture(this.activeInstance,
1172
+ // {Variations: usedVariations});
1173
+ }
1174
+ _getAdjustables(checkGameObject = true, checkType = true) {
1175
+ return this.selections.filter(s => {
1176
+ const node = s.decoNode;
1177
+ return node && (checkGameObject ? node.gameObjectName : true) && (checkType ? node.type === DecoNodeType.Part : true) && node.kind === DecoNodeKind.Adjustable;
1178
+ });
1179
+ }
1180
+ _getVariations() {
1181
+ if (this._iOne.decoNodes.length === 0) {
1182
+ return [];
1183
+ }
1184
+ return this._iOne.decoNodes.filter((deco) => {
1185
+ return deco.type === DecoNodeType.Variation;
1186
+ });
1187
+ }
1188
+ _createAdjustable(item, adj) {
1189
+ let obj = this.full3DObjectToUse ? this.full3DObjectToUse.getObjectByName(adj.decoNode.gameObjectName || adj.gameObject) : null;
1190
+ if (!obj) {
1191
+ // in case of glb files, the importer removes dots from names
1192
+ const name = adj.decoNode.gameObjectName.replace(/[.]/g, '');
1193
+ obj = this.full3DObjectToUse ? this.full3DObjectToUse.getObjectByName(name) : null;
1194
+ if (!obj) {
1195
+ console.warn(`No object with name ${adj.decoNode.gameObjectName} found!`);
1196
+ return null;
1197
+ }
1198
+ }
1199
+ let adjustable = obj.clone();
1200
+ adjustable.name = this._createUniqueName(item, obj);
1201
+ adjustable.userData.selection = adj;
1202
+ adjustable.position.set(0, 0, 0);
1203
+ adjustable.traverse(c => {
1204
+ c.visible = !c.name.toLowerCase().startsWith('c_');
1205
+ });
1206
+ item.addChild(adjustable);
1207
+ // the object being added to the customFloorGroup is being recreated so we loose the reference
1208
+ // therefor we need to retrieve the created object again
1209
+ adjustable = item.getObjectByName(adjustable.name);
1210
+ this._placedAdjustables.push(adjustable);
1211
+ return adjustable;
1212
+ }
1213
+ _createAddable(item, add, part2, part1) {
1214
+ const obj = this.full3DObjectToUse.getObjectByName(add.decoNode.gameObjectName);
1215
+ if (!obj) {
1216
+ return null;
1217
+ }
1218
+ // const selection: Selection = this._getSelectionFromId(adj.artNodeIdDeco);
1219
+ const addable = obj.clone();
1220
+ addable.name = this._createUniqueName(item, obj);
1221
+ addable.userData.selection = add;
1222
+ addable.position.set(0, 0, 0);
1223
+ addable.visible = true;
1224
+ if (part1 && part2) {
1225
+ return this._placeAddable(item, addable);
1226
+ }
1227
+ return addable;
1228
+ }
1229
+ _placeAddable(item, add) {
1230
+ item.addChild(add);
1231
+ const addable = item.getObjectByName(add.name);
1232
+ this._placedAddables.push(addable);
1233
+ return addable;
1234
+ }
1235
+ _createUniqueName(item, obj) {
1236
+ let iteration = 0;
1237
+ let name = `${item.name}_${obj.name}`;
1238
+ let existingObj = item.getObjectByName(name);
1239
+ while (existingObj) {
1240
+ iteration++;
1241
+ name = `${item.name}_${obj.name}` + (iteration !== 0 ? ('_' + iteration) : '');
1242
+ existingObj = item.getObjectByName(name);
1243
+ }
1244
+ return name;
1245
+ }
1246
+ _placeAddables(item) {
1247
+ const len = this._placedAdjustables.length;
1248
+ for (let i = 0; i < len; i++) {
1249
+ if (this._placedAdjustables[i].userData.hasOwnProperty('selection') && this._placedAdjustables[i].userData.selection) {
1250
+ const adjustableSelection = this._placedAdjustables[i].userData.selection;
1251
+ if (adjustableSelection) {
1252
+ const lena = adjustableSelection.addables.length;
1253
+ let conAddable;
1254
+ for (let ia = 0; ia < lena; ia++) {
1255
+ Scene3DUtil.TrySelectorConnection(this.scene, item, this._placedAdjustables[i], adjustableSelection.addables[ia], false, (add, part2, part1) => this._createAddable(item, add, part2, part1));
1256
+ if (conAddable) {
1257
+ Scene3DUtil.TrySelectorConnection(this.scene, item, conAddable, adjustableSelection.addables[ia], false, (add, part2, part1) => this._createAddable(item, add, part2, part1));
1258
+ }
1259
+ conAddable = this._placedAddables[this._placedAddables.length - 1];
1260
+ }
1261
+ }
1262
+ }
1263
+ }
1264
+ }
1265
+ _loadVariations(item, instanceId) {
1266
+ return __awaiter(this, void 0, void 0, function* () {
1267
+ if (this._settingsService.settings.options.useVariationOnPart) {
1268
+ yield this._variationService.loadPart(this._adjustables, instanceId, item, true);
1269
+ }
1270
+ yield this._variationService.loadVariation(this._adjustables, instanceId, item, true);
1271
+ yield this._variationService.loadVariation(this._addables, instanceId, item, true);
1272
+ this._variationService.clearCache();
1273
+ });
1274
+ }
1275
+ _showWarning(data) {
1276
+ const dialogData = {
1277
+ title: this._dictionaryService.get(data.title), message: this._dictionaryService.get(data.message)
1278
+ };
1279
+ this._dialog.open(InfoDialogComponent, { data: dialogData });
1280
+ }
1281
+ _prepareStandAlone() {
1282
+ this._collisionManager.checkCollisions = false;
1283
+ if (this._settingsService.settings.options.cameraPositionFixed) {
1284
+ this._cameraService.lockCamera();
1285
+ this._cameraService.disableRotateHorizontal();
1286
+ // this._cameraService.disableRotateVertical();
1287
+ this._cameraService.disablePan();
1288
+ this._cameraService.controls.target = new Vector3(0, 50, 0);
1289
+ }
1290
+ this._sceneEventService.rotateNoDrag = true;
1291
+ }
1292
+ _preloadMaterial(answer) {
1293
+ if (answer.elementType === DecoNodeType.Variation && answer.gameObject) {
1294
+ const variationDecoNode = new DecoNode();
1295
+ variationDecoNode.gameObjectName = answer.gameObject;
1296
+ const adjustablesClone = this._adjustables.map(s => Object.assign({}, s));
1297
+ if (this._genericSelection) {
1298
+ if (this.currentCustomFloorGroup) {
1299
+ adjustablesClone.forEach((selection) => selection.variations = [variationDecoNode]);
1300
+ this._variationCacheService.preloadVariationsAsync(adjustablesClone[0].schema, [variationDecoNode.gameObjectName], this.articleAssetPath)
1301
+ .then(() => {
1302
+ this._variationService.loadVariation(adjustablesClone, '', this.currentCustomFloorGroup, true)
1303
+ .then(() => this._sceneService.needsRender = true);
1304
+ });
1305
+ }
1306
+ else {
1307
+ this._adjustables.forEach((selection) => selection.variations = [variationDecoNode]);
1308
+ }
1309
+ }
1310
+ else {
1311
+ const currentSelection = ObjectUtils.GetSelectionFromSelectedObject(this._activeChildElement);
1312
+ if (currentSelection) {
1313
+ if (this.currentCustomFloorGroup) {
1314
+ const selectionFromAdjustables = adjustablesClone
1315
+ .find((selection) => selection.nodeId === currentSelection.nodeId);
1316
+ if (selectionFromAdjustables) {
1317
+ selectionFromAdjustables.variations = [variationDecoNode];
1318
+ this._variationCacheService.preloadVariationsAsync(adjustablesClone[0].schema, [variationDecoNode.gameObjectName], this.articleAssetPath)
1319
+ .then(() => {
1320
+ this._variationService.loadVariation(adjustablesClone, '', this.currentCustomFloorGroup, true)
1321
+ .then(() => this._sceneService.needsRender = true);
1322
+ });
1323
+ }
1324
+ }
1325
+ else {
1326
+ const selectionFromAdjustables = this._adjustables
1327
+ .find((selection) => selection.nodeId === currentSelection.nodeId);
1328
+ selectionFromAdjustables.variations = [variationDecoNode];
1329
+ }
1330
+ }
1331
+ }
1332
+ }
1333
+ }
1334
+ }
1335
+ BuildFurnitureService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureService, deps: [{ token: i1.MatDialog }, { token: i2.HomedecoratorConnectorService }, { token: i3.ThreedselectorService }, { token: i4.CollisionManagerService }, { token: i5.MessageBusService }, { token: i6.HomedecoratorDictionaryService }, { token: i7.HudService }, { token: i8.SceneService }, { token: i9.CameraService }, { token: i10.SceneEventService }, { token: i11.HomedecoratorAppEventService }, { token: i12.PresetsService }, { token: i13.ItemService }, { token: i14.ElementService }, { token: i15.PermanentStoreService }, { token: i16.GoogleTagManagerService }, { token: i17.HomedecoratorSettingsService }, { token: i18.UtilsService }, { token: i19.VariationService }, { token: i20.AppStateService }, { token: i21.ErrorService }, { token: i22.ItemGroupService }, { token: i23.VariationCacheService }, { token: i24.ResizeService }, { token: i25.ViewModeService }, { token: i26.FloorService }], target: i0.ɵɵFactoryTarget.Injectable });
1336
+ BuildFurnitureService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureService, providedIn: 'root' });
1337
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureService, decorators: [{
1338
+ type: Injectable,
1339
+ args: [{
1340
+ providedIn: 'root'
1341
+ }]
1342
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.HomedecoratorConnectorService }, { type: i3.ThreedselectorService }, { type: i4.CollisionManagerService }, { type: i5.MessageBusService }, { type: i6.HomedecoratorDictionaryService }, { type: i7.HudService }, { type: i8.SceneService }, { type: i9.CameraService }, { type: i10.SceneEventService }, { type: i11.HomedecoratorAppEventService }, { type: i12.PresetsService }, { type: i13.ItemService }, { type: i14.ElementService }, { type: i15.PermanentStoreService }, { type: i16.GoogleTagManagerService }, { type: i17.HomedecoratorSettingsService }, { type: i18.UtilsService }, { type: i19.VariationService }, { type: i20.AppStateService }, { type: i21.ErrorService }, { type: i22.ItemGroupService }, { type: i23.VariationCacheService }, { type: i24.ResizeService }, { type: i25.ViewModeService }, { type: i26.FloorService }]; } });
1343
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtZnVybml0dXJlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2xpZW50L2FwcC9wbHVnaW5zL3RocmVlZHNlbGVjdG9yL3RocmVlZHNlbGVjdG9yL3NlcnZpY2UvYnVpbGQtZnVybml0dXJlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUN0RixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFFdEYsT0FBTyxFQUFDLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBQyxLQUFLLEVBQXlCLE9BQU8sRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUU1RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0scURBQXFELENBQUM7QUFDN0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNkRBQTZELENBQUM7QUFHN0YsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQ3BFLE9BQU8sS0FBSyxLQUFLLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQztBQUN4RSxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDaEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBRXpELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxN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Q2hGLElBQUksd0JBQXdCLEVBQUU7NEJBQzVCLHdCQUF3QixDQUFDLFVBQVUsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7NEJBQzFELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUM7aUNBQ3RJLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0NBQ1QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQztxQ0FDM0YsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDOzRCQUN2RCxDQUFDLENBQUMsQ0FBQzt5QkFDTjtxQkFDRjt5QkFBTTt3QkFDTCxNQUFNLHdCQUF3QixHQUFjLElBQUksQ0FBQyxZQUFZOzZCQUMxRCxJQUFJLENBQUMsQ0FBQyxTQUFvQixFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNoRix3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3FCQUMzRDtpQkFDRjthQUNGO1NBQ0Y7SUFDSCxDQUFDOzttSEFoMkNVLHFCQUFxQjt1SEFBckIscUJBQXFCLGNBRnBCLE1BQU07NEZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGVjb05vZGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvZGVjby1ub2RlJztcclxuaW1wb3J0IHtEZWNvTm9kZVR5cGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9kZWNvLW5vZGUtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtEZWNvTm9kZUtpbmR9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9kZWNvLW5vZGUta2luZC5lbnVtJztcclxuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0aW9uJztcclxuaW1wb3J0IHtJbmplY3RhYmxlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1N1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7QW5zd2VyfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2Fuc3dlcic7XHJcbmltcG9ydCB7RXVsZXIsIE1lc2gsIE9iamVjdDNELCBTY2VuZSwgVmVjdG9yM30gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHtOb2RlVHlwZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9lbnVtL25vZGUtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtIZGVjb1Bvc2l0aW9uaW5nfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vaGRlY28tcG9zaXRpb25pbmcuZW51bSc7XHJcbmltcG9ydCB7UXVlc3Rpb25BbmRBbnN3ZXJzfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3F1ZXN0aW9uLWFuZC1hbnN3ZXJzJztcclxuaW1wb3J0IHtRdWVzdGlvbn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9xdWVzdGlvbic7XHJcbmltcG9ydCB7ZW52aXJvbm1lbnR9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XHJcbmltcG9ydCAqIGFzIFRXRUVOIGZyb20gJ0B0d2VlbmpzL3R3ZWVuLmpzJztcclxuaW1wb3J0IHtGYWN0b3J5fSBmcm9tICcuLi8uLi8uLi9jb3JlM2QvaXRlbXMvZmFjdG9yeSc7XHJcbmltcG9ydCB7Q3VzdG9tRmxvb3JJdGVtfSBmcm9tICcuLi8uLi8uLi9jb3JlM2QvaXRlbXMvY3VzdG9tLWZsb29yLWl0ZW0nO1xyXG5pbXBvcnQge0l0ZW19IGZyb20gJy4uLy4uLy4uL2NvcmUzZC9pdGVtcy9pdGVtJztcclxuaW1wb3J0IHtJdGVtVHlwZX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL2l0ZW1zL2l0ZW0tdHlwZSc7XHJcbmltcG9ydCB7TWV0YWRhdGF9IGZyb20gJy4uLy4uLy4uL2NvcmUzZC9pdGVtcy9tZXRhZGF0YSc7XHJcbmltcG9ydCB7Q3VzdG9tRmxvb3JHcm91cFJlc3VsdH0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL21vZGVsL2N1c3RvbS1mbG9vci1ncm91cC1yZXN1bHQnO1xyXG5pbXBvcnQge0Z1cm5pdHVyZUludGVncmF0aW9ufSBmcm9tICcuLi9tb2RlbC9mdXJuaXR1cmUtaW50ZWdyYXRpb24nO1xyXG5pbXBvcnQge1RocmVlZHNlbGVjdG9yU2VydmljZX0gZnJvbSAnLi90aHJlZWRzZWxlY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtDb2xsaXNpb25NYW5hZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL2NvbGxpc2lvbi1tYW5hZ2VyL2NvbGxpc2lvbi1tYW5hZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQge01lc3NhZ2VCdXNTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2UvbWVzc2FnZS1idXMuc2VydmljZSc7XHJcbmltcG9ydCB7SHVkU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL3NlcnZpY2UvaHVkLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7Q2FtZXJhU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL3NlcnZpY2UvY2FtZXJhLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlM2Qvc2VydmljZS9zY2VuZS1ldmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHtQcmVzZXRzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3ByZXNldHMuc2VydmljZSc7XHJcbmltcG9ydCB7SXRlbVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUzZC9zZXJ2aWNlL2l0ZW0uc2VydmljZSc7XHJcbmltcG9ydCB7RWxlbWVudFNlcnZpY2V9IGZyb20gJy4vZWxlbWVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHtQZXJtYW5lbnRTdG9yZVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljZS9wZXJtYW5lbnQtc3RvcmUuc2VydmljZSc7XHJcbmltcG9ydCB7R29vZ2xlVGFnTWFuYWdlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2UvZ29vZ2xlLXRhZy1tYW5hZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1V0aWxzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3V0aWxzLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZhcmlhdGlvblNlcnZpY2V9IGZyb20gJy4vdmFyaWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge0FwcFN0YXRlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2FwcC1zdGF0ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtFcnJvclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvc2VydmljZS9lcnJvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtJdGVtR3JvdXBTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlM2Qvc2VydmljZS9pdGVtLWdyb3VwLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZhcmlhdGlvbkNhY2hlU2VydmljZX0gZnJvbSAnLi92YXJpYXRpb24tY2FjaGUuc2VydmljZSc7XHJcbmltcG9ydCB7UmVzaXplU2VydmljZX0gZnJvbSAnLi9yZXNpemUuc2VydmljZSc7XHJcbmltcG9ydCB7Vmlld01vZGVTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2Uvdmlldy1tb2RlLnNlcnZpY2UnO1xyXG5pbXBvcnQge01lc3NhZ2VUeXBlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL2VudW0vbWVzc2FnZS10eXBlLmVudW0nO1xyXG5pbXBvcnQge1NjZW5lM0RVdGlsfSBmcm9tICcuLi91dGlscy9zY2VuZS0zZC51dGlscyc7XHJcbmltcG9ydCB7RXJyb3JNZXNzYWdlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVsL2Vycm9yLW1lc3NhZ2UnO1xyXG5pbXBvcnQge1ZpZXdNb2RlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL2VudW0vdmlldy1tb2RlLmVudW0nO1xyXG5pbXBvcnQge1Jlc3VsdFR5cGV9IGZyb20gJy4uLy4uLy4uL2NvcmUzZC9lbnVtL3Jlc3VsdC10eXBlLmVudW0nO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS91dGlscy9mdW5jdGlvbi9pcy1uaWxsLmZ1bmN0aW9uJztcclxuaW1wb3J0IHtVdGlsc30gZnJvbSAnLi4vLi4vLi4vY29yZTNkL2NvcmUvdXRpbHMnO1xyXG5pbXBvcnQge01hdGVyaWFsVXRpbHN9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdXRpbHMvbWF0ZXJpYWwudXRpbHMnO1xyXG5pbXBvcnQge0Zsb29yUGlufSBmcm9tICcuLi8uLi8uLi9jb3JlM2QvaXRlbXMvZmxvb3ItcGluJztcclxuaW1wb3J0IHtXYWxsUGlufSBmcm9tICcuLi8uLi8uLi9jb3JlM2QvaXRlbXMvd2FsbC1waW4nO1xyXG5pbXBvcnQge0Z1cm5pdHVyZVBhcnRJbnRlZ3JhdGlvbn0gZnJvbSAnLi4vbW9kZWwvZnVybml0dXJlLXBhcnQtaW50ZWdyYXRpb24nO1xyXG5pbXBvcnQge0N1c3RvbU1lc2gsIEN1c3RvbU9iamVjdDNEfSBmcm9tICcuLi8uLi8uLi9jb3JlM2QvaXRlbXMvY3VzdG9tLW9iamVjdHMnO1xyXG5pbXBvcnQge0Z1cm5pdHVyZVBhcnRWYXJpYXRpb259IGZyb20gJy4uL21vZGVsL2Z1cm5pdHVyZS1wYXJ0LXZhcmlhdGlvbic7XHJcbmltcG9ydCB7RnVybml0dXJlQ29ubmVjdGVkUGFydEludGVncmF0aW9ufSBmcm9tICcuLi9tb2RlbC9mdXJuaXR1cmUtY29ubmVjdGVkLXBhcnQtaW50ZWdyYXRpb24nO1xyXG5pbXBvcnQge0dvb2dsZVRhZ01hbmFnZXJFdmVudH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9lbnVtL2dvb2dsZS10YWctbWFuYWdlci1ldmVudC5lbnVtJztcclxuaW1wb3J0IHtDaGFuZ2VzSW50ZXJmYWNlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL2ludGVyZmFjZS9jaGFuZ2VzLmludGVyZmFjZSc7XHJcbmltcG9ydCB7Q3VzdG9tV2FsbEZsb29ySXRlbX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL2l0ZW1zL2N1c3RvbS13YWxsLWZsb29yLWl0ZW0nO1xyXG5pbXBvcnQge09iamVjdFV0aWxzfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3V0aWxzL29iamVjdC51dGlscyc7XHJcbmltcG9ydCB7SW5mb0RpYWxvZ0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL2luZm8tZGlhbG9nL2luZm8tZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7SW5mb0RpYWxvZ0RhdGF9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvaW50ZXJmYWNlL2luZm8tZGlhbG9nLWRhdGEuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQ29ubmVjdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItY29ubmVjdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JEaWN0aW9uYXJ5U2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3ItZGljdGlvbmFyeS5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQXBwRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1hcHAtZXZlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3Itc2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7Rmxvb3JTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlM2Qvc2VydmljZS9mbG9vci5zZXJ2aWNlJztcclxuaW1wb3J0IHtGbG9vclBsYW5lSXRlbX0gZnJvbSAnLi4vLi4vLi4vY29yZTNkL2l0ZW1zL2Zsb29yLXBsYW5lLWl0ZW0nO1xyXG5cclxuY29uc3QgZGVmYXVsdFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoNCwgMCwgMSk7XHJcbmNvbnN0IGRlZmF1bHRSb3RhdGlvbiA9IG5ldyBFdWxlcigwLCBNYXRoLlBJLCAwKTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlndXJpbmdNb2RlQ2hhbmdlSW50ZXJmYWNlIHtcclxuICBtZXRhZGF0YTogTWV0YWRhdGE7XHJcbiAgY29uZmlndXJpbmc6IGJvb2xlYW47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEJ1aWxkRnVybml0dXJlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgLy8gcHVibGljIGdldCBkZWNvcygpOiBNYXA8c3RyaW5nLCBEZWNvTm9kZT4ge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuX2dldERlY29zRnJvbUluc3RhbmNlKCk7XHJcbiAgLy8gfVxyXG4gIHB1YmxpYyBiYXNlRWxlbWVudE5vZGVJZDogbnVtYmVyO1xyXG5cclxuICBwdWJsaWMgYXJ0aWNsZUFzc2V0UGF0aDogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgdG9nZ2xlU2VsZWN0ZWRFbGVtZW50OiBTdWJqZWN0PE1lc2g+ID0gbmV3IFN1YmplY3Q8TWVzaD4oKTtcclxuICBwdWJsaWMgY29uZmlndXJlTW9kZUNoYW5nZWQ6IFN1YmplY3Q8Q29uZmlndXJpbmdNb2RlQ2hhbmdlSW50ZXJmYWNlPiA9IG5ldyBTdWJqZWN0PHsgbWV0YWRhdGE6IHt9LCBjb25maWd1cmluZzogZmFsc2UgfT4oKTtcclxuICBwdWJsaWMgYnVpbGRGaW5pc2hlZDogU3ViamVjdDxDdXN0b21GbG9vckdyb3VwUmVzdWx0PiA9IG5ldyBTdWJqZWN0PEN1c3RvbUZsb29yR3JvdXBSZXN1bHQ+KCk7XHJcbiAgcHVibGljIGFuc3dlclNlbGVjdGVkOiBTdWJqZWN0PEN1c3RvbUZsb29yR3JvdXBSZXN1bHQ+ID0gbmV3IFN1YmplY3Q8Q3VzdG9tRmxvb3JHcm91cFJlc3VsdD4oKTtcclxuICBwdWJsaWMgYXJQbGFjZW1lbnRVcGRhdGU6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIHB1YmxpYyBzaG93RWxlbWVudFRvb2xiYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIHN0YXJ0UG9zaXRpb246IFZlY3RvcjM7XHJcbiAgcHVibGljIGZ1bGwzRE9iamVjdFRvVXNlOiBPYmplY3QzRDtcclxuXHJcbiAgcHVibGljIGlzTW91c2VPdmVyT2JqZWN0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIHVzZWQgZm9yIGVsZW1lbnRzLCB0byBwbGFjZSBvYmplY3RzIG9uXHJcbiAgcHVibGljIGFjdGl2ZUNvbm5lY3RvcjogYW55O1xyXG5cclxuICBwdWJsaWMgZ2V0IHVzZU5vZGVJZFRvTGluaygpIHtcclxuICAgIHJldHVybiB0aGlzLl91c2VOb2RlSWRUb0xpbms7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRDdXN0b21GbG9vckdyb3VwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFjdGl2ZVF1ZXN0aW9uOiBRdWVzdGlvbjtcclxuICBwdWJsaWMgYWN0aXZlQW5zd2VyczogQW5zd2VyW10gPSBbXTtcclxuXHJcbiAgcHVibGljIGdldCBzdGFuZEFsb25lKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YW5kQWxvbmU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHN0YW5kQWxvbmUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3N0YW5kQWxvbmUgPSB2YWx1ZTtcclxuICAgIGlmICh0aGlzLl9zdGFuZEFsb25lKSB7XHJcbiAgICAgIHRoaXMuX3ByZXBhcmVTdGFuZEFsb25lKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbnMoKTogU2VsZWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lPbmUuc2VsZWN0aW9ucztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGFuZEFsb25lRmlyc3RCdWlsZFJlYWR5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgZ2V0IHNjZW5lKCk6IFNjZW5lIHtcclxuICAgIHJldHVybiB0aGlzLl9zY2VuZVNlcnZpY2UuZ2V0U2NlbmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VzZU5vZGVJZFRvTGluazogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfc3RhbmRBbG9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF9hY3RpdmVDaGlsZEVsZW1lbnQ6IE1lc2g7XHJcblxyXG4gIHByaXZhdGUgX29yaWdpbmFsRWxlbWVudFBvc2l0aW9uOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcclxuICBwcml2YXRlIF9pbnRlZ3JhdGlvbkVuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9wbGFjZWRBZGp1c3RhYmxlczogYW55W10gPSBbXTtcclxuICBwcml2YXRlIF9wbGFjZWRBZGRhYmxlczogYW55W10gPSBbXTtcclxuICBwcml2YXRlIF9hZGp1c3RhYmxlczogYW55W10gPSBbXTtcclxuICBwcml2YXRlIF9hZGRhYmxlczogYW55W10gPSBbXTtcclxuICBwcml2YXRlIF9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cDogSXRlbTtcclxuICBwcml2YXRlIF9nZW5lcmljU2VsZWN0aW9uID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICBwcml2YXRlIF9hbnN3ZXJTZWxlY3RlZDogQW5zd2VyW10gPSBbXTtcclxuICBwcml2YXRlIF9mdXJuaXR1cmVDb25maWd1cmF0aW9uczogRnVybml0dXJlSW50ZWdyYXRpb25bXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX2RpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBfaU9uZTogSG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90aHJlZWRTZWxlY3RvclNlcnZpY2U6IFRocmVlZHNlbGVjdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgX2NvbGxpc2lvbk1hbmFnZXI6IENvbGxpc2lvbk1hbmFnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZUJ1czogTWVzc2FnZUJ1c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kaWN0aW9uYXJ5U2VydmljZTogSG9tZWRlY29yYXRvckRpY3Rpb25hcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaHVkU2VydmljZTogSHVkU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NjZW5lU2VydmljZTogU2NlbmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfY2FtZXJhU2VydmljZTogQ2FtZXJhU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NjZW5lRXZlbnRTZXJ2aWNlOiBTY2VuZUV2ZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgX2FwcEV2ZW50U2VydmljZTogSG9tZWRlY29yYXRvckFwcEV2ZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgX3ByZXNldFNlcnZpY2U6IFByZXNldHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaXRlbVNlcnZpY2U6IEl0ZW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZWxlbWVudFNlcnZpY2U6IEVsZW1lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcGVybWFuZW50U3RvcmVTZXJ2aWNlOiBQZXJtYW5lbnRTdG9yZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9nb29nbGVUYWdNYW5hZ2VyOiBHb29nbGVUYWdNYW5hZ2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NldHRpbmdzU2VydmljZTogSG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3V0aWxzU2VydmljZTogVXRpbHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdmFyaWF0aW9uU2VydmljZTogVmFyaWF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX2FwcFN0YXRlU2VydmljZTogQXBwU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZXJyb3JTZXJ2aWNlOiBFcnJvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pdGVtR3JvdXBTZXJ2aWNlOiBJdGVtR3JvdXBTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdmFyaWF0aW9uQ2FjaGVTZXJ2aWNlOiBWYXJpYXRpb25DYWNoZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9yZXNpemVTZXJ2aWNlOiBSZXNpemVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdmlld01vZGVTZXJ2aWNlOiBWaWV3TW9kZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9mbG9vclNlcnZpY2U6IEZsb29yU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLl9pT25lLmNvbm5lY3Rpb25SZXNldC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5faGFuZGxlQ29ubmVjdGlvblJlc2V0KCkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnN1YnNjcmliZShNZXNzYWdlVHlwZS5JdGVtUmVtb3ZlZCwgKHJlc3VsdDogeyBpdGVtOiBhbnksIGFkZGVkVG9Hcm91cDogYm9vbGVhbiB9KSA9PlxyXG4gICAgICAgIHRoaXMuX2hhbmRsZUl0ZW1SZW1vdmVkRnJvbVNjZW5lKHJlc3VsdCkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnN1YnNjcmliZShNZXNzYWdlVHlwZS5VbmRvLCAoKSA9PiB0aGlzLl9zdGFydFdpdGhOZXcoZmFsc2UpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuUmVkbywgKCkgPT4gdGhpcy5fc3RhcnRXaXRoTmV3KGZhbHNlKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlN0YXJ0V2l0aEVtcHR5Um9vbSwgKCkgPT4gdGhpcy5fc3RhcnRXaXRoTmV3KCkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnN1YnNjcmliZShNZXNzYWdlVHlwZS5TdGFydFdpdGhQcmVzZXQsICgpID0+IHRoaXMuX3N0YXJ0V2l0aE5ldygpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuTG9hZFJvb21Gcm9tUHJlc2V0LCAoKSA9PiB0aGlzLl9zdGFydFdpdGhOZXcoKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLkxvYWRSb29tRnJvbUNsb3VkLCAoKSA9PiB0aGlzLl9zdGFydFdpdGhOZXcoKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLk5ld1Jvb20sICgpID0+IHRoaXMuX3N0YXJ0V2l0aE5ldygpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuUmVzZXRSb29tcGxhbiwgKCkgPT4gdGhpcy5fc3RhcnRXaXRoTmV3KCkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnN1YnNjcmliZShNZXNzYWdlVHlwZS5Mb2FkU2NhbGVkRGlhZ3JhbSwgKCkgPT4gdGhpcy5fc3RhcnRXaXRoTmV3KCkpLFxyXG4gICAgICB0aGlzLl9hcHBFdmVudFNlcnZpY2UuZW5hYmxlSW50ZWdyYXRpb24uc3Vic2NyaWJlKChlbmFibGVkOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKGVuYWJsZWQpIHtcclxuICAgICAgICAgIHRoaXMuX2VuYWJsZUludGVncmF0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5fcHJlc2V0U2VydmljZS5iZWZvcmVMb2FkLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fY2xlYW51cEJlZm9yZVByZXNldExvYWQoKTtcclxuICAgICAgICB0aGlzLl9zdGFydFdpdGhOZXcoKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRoaXMuX3ByZXNldFNlcnZpY2UuYWZ0ZXJMb2FkLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9oYW5kbGVBZnRlclByZXNldExvYWQoKSksXHJcbiAgICAgIHRoaXMuX3Blcm1hbmVudFN0b3JlU2VydmljZS5jb2RlU2V0LnN1YnNjcmliZSgoY29kZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvZGUpIHtcclxuICAgICAgICAgIHRoaXMuX3NldENvZGVPbkZ1cm5pdHVyZUNvbmZpZ3VyYXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgdGhpcy5fY2xlYW51cCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGJ1aWxkKHJlc3VsdDogQ3VzdG9tRmxvb3JHcm91cFJlc3VsdCk6IFByb21pc2U8Q3VzdG9tRmxvb3JHcm91cFJlc3VsdD4ge1xyXG4gICAgdGhpcy5fZWxlbWVudFNlcnZpY2UucmVtb3ZlRWxlbWVudChyZXN1bHQuaW5zdGFuY2VJZCk7XHJcbiAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5tZXRhRGF0YSAmJiByZXN1bHQubWV0YURhdGEuaXRlbVR5cGUgPT09IEl0ZW1UeXBlLkZsb29yRGVjb3JhdGlvbikge1xyXG4gICAgICByZXR1cm4gdGhpcy5fYnVpbGRGbG9vcihyZXN1bHQpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmZ1bGwzRE9iamVjdFRvVXNlKSB7IC8vIHRoZXJlJ3Mgbm8gM2QgbW9kZWwgc28gZ2V0IG91dFxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgY29uc3QgYWRqdXN0YWJsZXM6IFNlbGVjdGlvbltdID0gdGhpcy5fZ2V0QWRqdXN0YWJsZXMoKTtcclxuICAgIGlmIChhZGp1c3RhYmxlcyAmJiBhZGp1c3RhYmxlcy5sZW5ndGggPT09IDApIHsgLy8gY2hlY2sgaWYgYXJ0aWNsZSBoYXMgYSBnYW1lT2JqZWN0XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbnNbMF0ubm9kZVR5cGUgPT09IE5vZGVUeXBlLkFydGljbGUgJiYgdGhpcy5zZWxlY3Rpb25zWzBdLmdhbWVPYmplY3QpIHtcclxuICAgICAgICBhZGp1c3RhYmxlcy5wdXNoKHRoaXMuc2VsZWN0aW9uc1swXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwID0gdGhpcy5fY3JlYXRlQ29uZmlndXJhYmxlSXRlbShyZXN1bHQuaW5zdGFuY2VJZCwgcmVzdWx0Lm1ldGFEYXRhKTtcclxuICAgIGNvbnN0IGl0ZW06IEl0ZW0gPSB0aGlzLl9jcmVhdGVDb25maWd1cmFibGVJdGVtKHJlc3VsdC5pbnN0YW5jZUlkLCByZXN1bHQubWV0YURhdGEpO1xyXG4gICAgaWYgKGFkanVzdGFibGVzICYmIGFkanVzdGFibGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGNvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICBmb3IgKGxldCBpID0gMCwgbGVuOiBudW1iZXIgPSBhZGp1c3RhYmxlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGFkanVzdGFibGU6IE9iamVjdDNEID0gdGhpcy5fY3JlYXRlQWRqdXN0YWJsZShpdGVtLCBhZGp1c3RhYmxlc1tpXSk7XHJcbiAgICAgICAgaWYgKGFkanVzdGFibGUpIHtcclxuICAgICAgICAgIGZvciAobGV0IGlpID0gdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoIC0gMTsgaWkgPj0gMDsgaWktLSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNNb3ZlYWJsZU9iamVjdChhZGp1c3RhYmxlKSkgeyAvLyB2cmlqZSB2ZXJwbGFhdHNpbmcgbW9nZWxpamssIGNvbm5lY3RlbiBhYW4gb3BnZXNsYWdlbiBjb25uZWN0b3JcclxuICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IGFkanVzdGFibGUudXNlckRhdGEuc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2FkZEVsZW1lbnRPbkNvbm5lY3RvcihcclxuICAgICAgICAgICAgICAgIGl0ZW0sIGFkanVzdGFibGUsIHNlbGVjdGlvbi5kZWNvQ29ubmVjdGlvbiA/IHNlbGVjdGlvbi5kZWNvQ29ubmVjdGlvbiA6IHRoaXMuYWN0aXZlQ29ubmVjdG9yLCB0aGlzLmJhc2VFbGVtZW50Tm9kZUlkKTtcclxuICAgICAgICAgICAgICBhZGp1c3RhYmxlLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKFNjZW5lM0RVdGlsLlRyeVNlbGVjdG9yQ29ubmVjdGlvbih0aGlzLnNjZW5lLFxyXG4gICAgICAgICAgICAgICAgaXRlbSwgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaWldLCBhZGp1c3RhYmxlLCBpID09PSAxKSkge1xyXG4gICAgICAgICAgICAgICAgYWRqdXN0YWJsZS52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY29ubmVjdGVkICYmIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLmxlbmd0aCA+IDEgJiYgIWVudmlyb25tZW50LnByb2R1Y3Rpb24pIHtcclxuICAgICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2VzLnB1c2gobmV3IEVycm9yTWVzc2FnZShcclxuICAgICAgICAgICAgYE5vIGNvbm5lY3Rpb24gZm91bmQgZm9yOiAke2FkanVzdGFibGUgPyBhZGp1c3RhYmxlLm5hbWUgOiBhZGp1c3RhYmxlc1tpXS5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZX1gKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3BsYWNlQWRkYWJsZXMoaXRlbSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuX2xvYWRWYXJpYXRpb25zKGl0ZW0sIHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQpO1xyXG4gICAgICB0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCA9IGF3YWl0IHRoaXMuX3JlcGxhY2VDdXJyZW50SXRlbShpdGVtLCByZXN1bHQubWV0YURhdGEsIHRydWUpO1xyXG4gICAgICBpZiAodGhpcy5fdmlld01vZGVTZXJ2aWNlLnZpZXdNb2RlICE9PSBWaWV3TW9kZS5JblBob3RvVmlldykge1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLnVwZGF0ZVBpdm90KCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVzdWx0LmZ1cm5pdHVyZSA9IHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwO1xyXG4gICAgICByZXN1bHQuaW5zdGFuY2VJZCA9IHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQ7XHJcbiAgICAgIHRoaXMuYXJQbGFjZW1lbnRVcGRhdGUubmV4dCh0cnVlKTtcclxuICAgICAgdGhpcy5faGFuZGxlSW50ZWdyYXRpb24ocmVzdWx0Lm1ldGFEYXRhLml0ZW1JZCwgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLml0ZW1Hcm91cCkge1xyXG4gICAgICAgIHRoaXMuX2l0ZW1Hcm91cFNlcnZpY2UucmVhdHRhY2hUb0l0ZW1Hcm91cChcclxuICAgICAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLFxyXG4gICAgICAgICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAuaXRlbUdyb3VwLFxyXG4gICAgICAgICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAucG9zaXRpb24pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2Fuc3dlclNlbGVjdGVkLmxlbmd0aCA9IDA7XHJcblxyXG4gICAgICBpZiAodGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLkdhbWVvYmplY3ROYW1lTWlzbWF0Y2hJblNvdXJjZTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzdWx0KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9odWRTZXJ2aWNlLnVwZGF0ZVNlbGVjdGVkSXRlbUh1ZCgpO1xyXG4gICAgICB0aGlzLmJ1aWxkRmluaXNoZWQubmV4dChyZXN1bHQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZXMucHVzaChuZXcgRXJyb3JNZXNzYWdlKCdOT19BREpVU1RBQkxFUycsICdOT19BREpVU1RBQkxFU19JTkZPJykpO1xyXG4gICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuTm9BZGp1c3RhYmxlcztcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3VsdCk7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzdWx0LnJlc3VsdFR5cGUgPT09IFJlc3VsdFR5cGUuTm9TZWxlY3Rpb25zKSB7XHJcbiAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Db25maWd1cmF0aW9uRml4ZWQ7XHJcbiAgICB9IGVsc2UgaWYgKHJlc3VsdC5yZXN1bHRUeXBlICE9PSBSZXN1bHRUeXBlLk9ic29sZXRlICYmIHJlc3VsdC5yZXN1bHRUeXBlICE9PSBSZXN1bHRUeXBlLkNvbmZpZ3VyYXRpb25GaXhlZCkgeyAvLyBkb24ndCBvdmVycmlkZSB0aGVzZVxyXG4gICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuTG9hZGVkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLnJlYWR5VG9SZW5kZXIubmV4dCh0aGlzLnN0YW5kQWxvbmVGaXJzdEJ1aWxkUmVhZHkpO1xyXG4gICAgdGhpcy5fc2NlbmVTZXJ2aWNlLnVwZGF0ZVBhdGhUcmFjZXIoKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc3RhcnRUb0J1aWxkKFxyXG4gICAgcmVzdWx0PzogQ3VzdG9tRmxvb3JHcm91cFJlc3VsdCxcclxuICAgIG1ldGFkYXRhPzogTWV0YWRhdGEsXHJcbiAgICBzaG91bGRDb3B5SW5zdGFuY2U6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIGxvb3NlT3JpZ2luYWxDb25maWd1cmF0aW9uOiBib29sZWFuID0gdHJ1ZSxcclxuICAgIHN0YW5kQWxvbmU/OiBib29sZWFuLFxyXG4gICAgZmlyc3RCdWlsZDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKTogUHJvbWlzZTxDdXN0b21GbG9vckdyb3VwUmVzdWx0PiB7XHJcbiAgICBpZiAoIWlzTmlsbChzdGFuZEFsb25lKSkge1xyXG4gICAgICB0aGlzLnN0YW5kQWxvbmUgPSBzdGFuZEFsb25lO1xyXG4gICAgfVxyXG4gICAgaWYgKGlzTmlsbChyZXN1bHQpKSB7XHJcbiAgICAgIHJlc3VsdCA9IG5ldyBDdXN0b21GbG9vckdyb3VwUmVzdWx0KFxyXG4gICAgICAgIG1ldGFkYXRhID8gbWV0YWRhdGEuaXRlbUlkZW50aWZpZXIgOiAnJyxcclxuICAgICAgICBtZXRhZGF0YSA/IG1ldGFkYXRhLml0ZW1OYW1lIDogJ3Vua25vd24nKTtcclxuICAgICAgcmVzdWx0Lm1ldGFEYXRhID0gbWV0YWRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNob3VsZENvcHlJbnN0YW5jZSkge1xyXG4gICAgICBjb25zdCBvcmlnaW5hbEluc3RhbmNlSWQ6IHN0cmluZyA9IHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQ7XHJcbiAgICAgIGlmIChsb29zZU9yaWdpbmFsQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQgPSBhd2FpdCB0aGlzLl9pT25lLmNvcHlJbnN0YW5jZUFuZExvc2VPcmlnaW5hbENvbmZpZ3VyYXRpb24ob3JpZ2luYWxJbnN0YW5jZUlkLCByZXN1bHQpXHJcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsSW5zdGFuY2VJZDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQgPSBhd2FpdCB0aGlzLl9pT25lLmNvcHlJbnN0YW5jZUFuZFNhdmVPcmlnaW5hbENvbmZpZ3VyYXRpb24ob3JpZ2luYWxJbnN0YW5jZUlkLCByZXN1bHQpXHJcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsSW5zdGFuY2VJZDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3VsdC5yZXN1bHRUeXBlICE9PSBSZXN1bHRUeXBlLkFydGljbGVOb3RGb3VuZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLl9zZXRJbnN0YW5jZVRvQ29uZmlndXJlKHJlc3VsdClcclxuICAgICAgICAuY2F0Y2goKGUpID0+IFByb21pc2UucmVqZWN0KHJlc3VsdCkpO1xyXG4gICAgfVxyXG4gICAgcmVzdWx0Lmluc3RhbmNlSWQgPSByZXN1bHQubWV0YURhdGEuaXRlbUlkO1xyXG4gICAgdGhpcy5zdGFydFBvc2l0aW9uID0gcmVzdWx0Lm1ldGFEYXRhLnBvc2l0aW9uID8gcmVzdWx0Lm1ldGFEYXRhLnBvc2l0aW9uLmNsb25lKCkgOiBuZXcgVmVjdG9yMygpO1xyXG5cclxuICAgIGNvbnN0IHF1ZXN0aW9uQW5kQW5zd2VyczogUXVlc3Rpb25BbmRBbnN3ZXJzID0gYXdhaXQgdGhpcy5faU9uZS5nZXRRdWVzdGlvbkFuZEFuc3dlcnNBc3luYygpOyAvLyBzZWUgaWYgdGhlcmUgaXMgdXNlciBpbnB1dCBuZWVkZWRcclxuICAgIGlmIChxdWVzdGlvbkFuZEFuc3dlcnMucXVlc3Rpb24gJiYgIXF1ZXN0aW9uQW5kQW5zd2Vycy5xdWVzdGlvbi5ncm91cGVkKSB7XHJcbiAgICAgIHRoaXMuX2lPbmUuaGFuZGxlQW5zd2Vyc1JlY2VpdmVkKHF1ZXN0aW9uQW5kQW5zd2Vycy5hbnN3ZXJzKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hbnN3ZXJDb3VudFJlY2VpdmVkLm5leHQocXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnMubGVuZ3RoKTtcclxuICAgIGlmIChxdWVzdGlvbkFuZEFuc3dlcnMuYW5zd2Vycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5hY3RpdmVBbnN3ZXJzID0gW107XHJcbiAgICAgIHRoaXMuYWN0aXZlUXVlc3Rpb24gPSB1bmRlZmluZWQ7XHJcbiAgICAgIGF3YWl0IHRoaXMuX3ByZXBhcmVTZWxlY3Rpb25zQW5kRGVjb3MocmVzdWx0KVxyXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gUHJvbWlzZS5yZWplY3QoZSkpO1xyXG4gICAgICByZXR1cm4gdGhpcy5idWlsZChyZXN1bHQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmVRdWVzdGlvbiA9IHF1ZXN0aW9uQW5kQW5zd2Vycy5xdWVzdGlvbjtcclxuICAgICAgdGhpcy5hY3RpdmVBbnN3ZXJzID0gcXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnM7XHJcbiAgICAgIGlmIChmaXJzdEJ1aWxkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fcHJlcGFyZVNlbGVjdGlvbnNBbmREZWNvcyhyZXN1bHQpXHJcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IFByb21pc2UucmVqZWN0KGUpKTtcclxuICAgICAgICBpZiAodGhpcy5faU9uZS5zZWxlY3Rpb25zLmxlbmd0aCA8IDEpIHtcclxuICAgICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5OZWVkc1VzZXJJbnB1dDtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2lPbmUuc2VsZWN0aW9ucy5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuQnVpbGRGcm9tU2NyYXRjaDtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2lPbmUuc2VsZWN0aW9ucy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuTmVlZHNVc2VySW5wdXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRPcHRpb25zRnJvbVNlbGVjdGlvbihiYXNlU2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBTZWxlY3Rpb25bXSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgbGV0IG5vZGVMZXZlbCA9IC0xO1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLnNlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uc1tpXTtcclxuICAgICAgY29uc3QgbGV2ZWw6IG51bWJlciA9IHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbDtcclxuICAgICAgaWYgKG5vZGVMZXZlbCAhPT0gLTEpIHtcclxuICAgICAgICBpZiAobm9kZUxldmVsIDwgbGV2ZWwgJiYgdGhpcy5fY2FuQ29ubmVjdFNlbGVjdGlvbnMoYmFzZVNlbGVjdGlvbiwgc2VsZWN0aW9uKSAmJiB0aGlzLl9zZWxlY3Rpb25QdWJsaXNoZWQoc2VsZWN0aW9uKSkge1xyXG4gICAgICAgICAgc2VsZWN0aW9ucy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChub2RlTGV2ZWwgPj0gbGV2ZWwpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VsZWN0aW9uLmlkID09PSBiYXNlU2VsZWN0aW9uLmlkICYmIHNlbGVjdGlvbi5ub2RlID09PSBiYXNlU2VsZWN0aW9uLm5vZGUpIHtcclxuICAgICAgICBub2RlTGV2ZWwgPSBsZXZlbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNlbGVjdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZG93bmxvYWRDdXJyZW50Q3VzdG9tRmxvb3Jncm91cCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9iamVjdFRvRXhwb3J0OiBPYmplY3QzRCA9IHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwID8gdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAgOiB0aGlzLl9pdGVtU2VydmljZS5pdGVtc1swXTtcclxuICAgIHRoaXMuX3V0aWxzU2VydmljZS5zaG93RXhwb3J0RGlhbG9nKG9iamVjdFRvRXhwb3J0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkb3dubG9hZFNjZW5lKCk6IHZvaWQge1xyXG4gICAgY29uc3QgYXNzZXRQYXRoOiBzdHJpbmcgPSB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuYXNzZXRQYXRoO1xyXG4gICAgLy8gVGhlIGdyb3VuZCBwbGFuZSBsb29rcyBvZGQgaW4gcmVuZGVycy5cclxuICAgIC8vIFRoZSBodWQtcmluZyBhbmQgaHVkLWNpcmNsZSBhcmUgdGhlIHdhbGt0aHJvdWdoIG1vZGUgbWFya2VyLFxyXG4gICAgLy8gd2hpY2ggaXMgbm90IHN1cHBvc2VkIHRvIGJlIHJlbmRlcmVkLlxyXG4gICAgY29uc3QgZWxlbWVudHNUb1JlbW92ZSA9IFsnZ3JvdW5kLXBsYW5lJywgJ2h1ZC1yaW5nJywgJ2h1ZC1jaXJjbGUnXTtcclxuXHJcbiAgICBsZXQgc2NlbmU6IFNjZW5lO1xyXG4gICAgc2NlbmUgPSB0aGlzLl9zY2VuZVNlcnZpY2Uuc2NlbmUuY2xvbmUoKTtcclxuXHJcbiAgICBlbGVtZW50c1RvUmVtb3ZlLmZvckVhY2goZWxlbWVudE5hbWUgPT4ge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZE9iamVjdDogT2JqZWN0M0QgPSBzY2VuZS5nZXRPYmplY3RCeU5hbWUoZWxlbWVudE5hbWUpO1xyXG4gICAgICBzY2VuZS5yZW1vdmUoc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgfSk7XHJcbiAgICBzY2VuZS5hZGQodGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEuY2xvbmUoKSk7XHJcblxyXG4gICAgdGhpcy5fdXRpbHNTZXJ2aWNlLnNob3dFeHBvcnREaWFsb2coc2NlbmUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZVNpbXBsZTNETW9kZWwocmVzdWx0OiBDdXN0b21GbG9vckdyb3VwUmVzdWx0LCBzdGFuZEFsb25lPzogYm9vbGVhbik6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQge1xyXG4gICAgaWYgKCFpc05pbGwoc3RhbmRBbG9uZSkpIHtcclxuICAgICAgdGhpcy5zdGFuZEFsb25lID0gc3RhbmRBbG9uZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5mdWxsM0RPYmplY3RUb1VzZSkgeyAvLyB0aGVyZSdzIG5vIDNkIG1vZGVsIHNvIGdldCBvdXRcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIC8vIHRoZXJlIGFyZSBubyBzZWxlY3Rpb25zIG9yIGRlY29zIGZvciBzaW1wbGUgYXJ0aWNsZXMsIHNvIGVtcHR5IGxpc3RzIGZvciBpbnRlZ3JhdGlvbiBwdXJwb3Nlc1xyXG4gICAgdGhpcy5faU9uZS5lbXB0eVNlbGVjdGlvbnMoKTtcclxuICAgIHRoaXMuZnVsbDNET2JqZWN0VG9Vc2UuY2hpbGRyZW4uZm9yRWFjaChjID0+IGMudmlzaWJsZSA9IHRydWUpO1xyXG4gICAgaWYgKCFyZXN1bHQubWV0YURhdGEucG9zaXRpb24pIHtcclxuICAgICAgcmVzdWx0Lm1ldGFEYXRhLnBvc2l0aW9uID0gdGhpcy5zdGFydFBvc2l0aW9uIHx8IGRlZmF1bHRQb3NpdGlvbjtcclxuICAgIH1cclxuICAgIGlmICghcmVzdWx0Lm1ldGFEYXRhLnJvdGF0aW9uKSB7XHJcbiAgICAgIHJlc3VsdC5tZXRhRGF0YS5yb3RhdGlvbiA9IHJlc3VsdC5tZXRhRGF0YS5kZWZhdWx0MTgwID8gZGVmYXVsdFJvdGF0aW9uIDogbmV3IEV1bGVyKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpdGVtQ29uc3RydWN0b3IgPSBGYWN0b3J5LmdldENsYXNzKHRoaXMuc3RhbmRBbG9uZSA/IEl0ZW1UeXBlLkZsb29yR3JvdXAgOiByZXN1bHQubWV0YURhdGEuaXRlbVR5cGUpO1xyXG4gICAgY29uc3QgaXRlbSA9IG5ldyBpdGVtQ29uc3RydWN0b3IoXHJcbiAgICAgIHJlc3VsdC5tZXRhRGF0YSxcclxuICAgICAgdGhpcy5mdWxsM0RPYmplY3RUb1VzZVxyXG4gICAgKTtcclxuICAgIHJlc3VsdC5tZXRhRGF0YS5vYmplY3RVVUlEID0gaXRlbS51dWlkO1xyXG4gICAgaXRlbS5hbGxvd1JvdGF0ZSA9ICF0aGlzLnN0YW5kQWxvbmU7XHJcbiAgICBpdGVtLmhpZ2hMaWdodERpc2FibGVkID0gIXRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLnVzZVN0YW5kYWxvbmVIaWdoTGlnaHQ7XHJcblxyXG4gICAgdGhpcy5faXRlbVNlcnZpY2UuYWRkSXRlbShpdGVtKTtcclxuICAgIGlmIChpdGVtLml0ZW1Hcm91cCkge1xyXG4gICAgICB0aGlzLl9pdGVtR3JvdXBTZXJ2aWNlLnJlYXR0YWNoVG9JdGVtR3JvdXAoaXRlbSwgaXRlbS5pdGVtR3JvdXAsIGl0ZW0ucG9zaXRpb24pO1xyXG4gICAgfVxyXG4gICAgLy8gRm9yIHNpbXBsZSBhcnRpY2xlcyB3ZSB1c2Ugb2JqZWN0IHV1aWQsIGJlY2F1c2UgdGhleSBkb24ndCBoYXZlIGFuIGluc3RhbmNlSWRcclxuICAgIHRoaXMuX3Vwc2VydEZ1cm5pdHVyZShpdGVtLnV1aWQsIHtCcmFuZElkZW50aWZpZXI6IHJlc3VsdC5tZXRhRGF0YS5pdGVtSWRlbnRpZmllcn0sIGl0ZW0pO1xyXG4gICAgdGhpcy5faGFuZGxlSW50ZWdyYXRpb24oaXRlbS51dWlkLCBpdGVtKTtcclxuXHJcbiAgICByZXN1bHQuZnVybml0dXJlID0gaXRlbTtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS51cGRhdGVQYXRoVHJhY2VyKCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfYnVpbGRGbG9vcihyZXN1bHQ6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQpOiBQcm9taXNlPEN1c3RvbUZsb29yR3JvdXBSZXN1bHQ+IHtcclxuICAgIGNvbnN0IGl0ZW06IEZsb29yUGxhbmVJdGVtID0gdGhpcy5fZmxvb3JTZXJ2aWNlLmZsb29yVG9Db25maWd1cmU7XHJcbiAgICBpdGVtLm1ldGFkYXRhID0gcmVzdWx0Lm1ldGFEYXRhO1xyXG4gICAgaXRlbS5jaGlsZHJlblswXS51c2VyRGF0YS5zZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbnNbMF07XHJcbiAgICBpdGVtLmNvbmZpZ3VyaW5nQ2hhbmdlSGFuZGxlciA9IHRoaXMuY2hhbmdlQ29uZmlndXJlTW9kZTtcclxuICAgIGl0ZW0uc2VsZWN0ZWRIYW5kbGVyID0gdGhpcy5zZWxlY3RJdGVtO1xyXG4gICAgaXRlbS51bnNlbGVjdGVkSGFuZGxlciA9IHRoaXMudW5TZWxlY3RJdGVtO1xyXG4gICAgYXdhaXQgdGhpcy5fbG9hZFZhcmlhdGlvbnMoaXRlbSwgcmVzdWx0Lm1ldGFEYXRhLml0ZW1JZCk7XHJcbiAgICB0aGlzLl9mbG9vclNlcnZpY2UudW5IaWdoTGlnaHRGbG9vcnMoKTtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCA9IGl0ZW07XHJcbiAgICByZXN1bHQuZnVybml0dXJlID0gdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXA7XHJcbiAgICByZXN1bHQuaW5zdGFuY2VJZCA9IHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQ7XHJcbiAgICB0aGlzLl9oYW5kbGVJbnRlZ3JhdGlvbihyZXN1bHQubWV0YURhdGEuaXRlbUlkLCB0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCk7XHJcbiAgICBpZiAodGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAuaXRlbUdyb3VwKSB7XHJcbiAgICAgIHRoaXMuX2l0ZW1Hcm91cFNlcnZpY2UucmVhdHRhY2hUb0l0ZW1Hcm91cChcclxuICAgICAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLFxyXG4gICAgICAgICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAuaXRlbUdyb3VwLFxyXG4gICAgICAgICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAucG9zaXRpb24pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fYW5zd2VyU2VsZWN0ZWQubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2h1ZFNlcnZpY2UudXBkYXRlU2VsZWN0ZWRJdGVtSHVkKCk7XHJcbiAgICB0aGlzLmJ1aWxkRmluaXNoZWQubmV4dChyZXN1bHQpO1xyXG4gICAgaWYgKHJlc3VsdC5yZXN1bHRUeXBlID09PSBSZXN1bHRUeXBlLk5vU2VsZWN0aW9ucykge1xyXG4gICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuQ29uZmlndXJhdGlvbkZpeGVkO1xyXG4gICAgfSBlbHNlIGlmIChyZXN1bHQucmVzdWx0VHlwZSAhPT0gUmVzdWx0VHlwZS5PYnNvbGV0ZSAmJiByZXN1bHQucmVzdWx0VHlwZSAhPT0gUmVzdWx0VHlwZS5Db25maWd1cmF0aW9uRml4ZWQpIHsgLy8gZG9uJ3Qgb3ZlcnJpZGUgdGhlc2VcclxuICAgICAgcmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLkxvYWRlZDtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zdGFydFRvQnVpbGRGcm9tQ29uZmlndXJhdG9yKG1ldGFkYXRhOiBNZXRhZGF0YSk6IFByb21pc2U8Q3VzdG9tRmxvb3JHcm91cFJlc3VsdD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhcnRUb0J1aWxkKG51bGwsIG1ldGFkYXRhKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3NldEluc3RhbmNlVG9Db25maWd1cmUocmVzdWx0OiBDdXN0b21GbG9vckdyb3VwUmVzdWx0KTogUHJvbWlzZTxDdXN0b21GbG9vckdyb3VwUmVzdWx0PiB7XHJcbiAgICBpZiAocmVzdWx0LnJlc3VsdFR5cGUgIT09IFJlc3VsdFR5cGUuVGltZW91dCkge1xyXG4gICAgICBpZiAocmVzdWx0Lm1ldGFEYXRhLml0ZW1JZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2lPbmUuc2V0SW5zdGFuY2UocmVzdWx0Lm1ldGFEYXRhLml0ZW1JZClcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlcy5wdXNoKG5ldyBFcnJvck1lc3NhZ2UoZSkpO1xyXG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdChyZXN1bHQpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9pT25lLmluaXROb2RlSW5zdGFuY2UocmVzdWx0Lm1ldGFEYXRhLml0ZW1JZGVudGlmaWVyKVxyXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2VzLnB1c2gobmV3IEVycm9yTWVzc2FnZShlKSk7XHJcbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KHJlc3VsdCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQgPSByZXNwb25zZS5yZXN1bHRPYmplY3Q7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIFByb21pc2UucmVqZWN0KHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuX2lPbmUuc2V0SW5zdGFuY2UocmVzdWx0Lm1ldGFEYXRhLml0ZW1JZClcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlcy5wdXNoKG5ldyBFcnJvck1lc3NhZ2UoZSkpO1xyXG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdChyZXN1bHQpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfcHJlcGFyZVNlbGVjdGlvbnNBbmREZWNvcyhyZXN1bHQ6IEN1c3RvbUZsb29yR3JvdXBSZXN1bHQpOiBQcm9taXNlPEN1c3RvbUZsb29yR3JvdXBSZXN1bHQ+IHtcclxuICAgIHRoaXMuX3Jlc2V0KCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb25zQW5kRGVjb1Byb21pc2U6IFByb21pc2U8YW55PltdID0gW107XHJcbiAgICAgIHNlbGVjdGlvbnNBbmREZWNvUHJvbWlzZS5wdXNoKHRoaXMuX2lPbmUuZ2V0U2VsZWN0aW9uc0FzeW5jKCksIHRoaXMuX2lPbmUuZ2V0RGVjb3NBc3luYygpKTtcclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoc2VsZWN0aW9uc0FuZERlY29Qcm9taXNlKTtcclxuICAgICAgdGhpcy5fcHJlbG9hZE1hdGVyaWFscyhyZXN1bHQubWV0YURhdGEuc2NoZW1hKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9pT25lLnNlbGVjdGlvbnMubGVuZ3RoIDwgMikgeyAvLyBubyBzZWxlY3Rpb25zLCBvbmx5IHNlbGVjdGlvbiBvZiB0eXBlICdBUlQnXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHRUeXBlICE9PSBSZXN1bHRUeXBlLkFydGljbGVOb3RGb3VuZCAmJiAhcmVzdWx0Lm1ldGFEYXRhLm9yaWdpbmFsSXRlbUlkKSB7IC8vIGFydGljbGUgZm91bmQsIHNvIGluaXQgdGhhdCBmaXJzdFxyXG4gICAgICAgICAgcmVzdWx0Lm1ldGFEYXRhLm9yaWdpbmFsSXRlbUlkID0gcmVzdWx0Lm1ldGFEYXRhLml0ZW1JZDtcclxuICAgICAgICAgIHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQgPSBudWxsO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5fc2V0SW5zdGFuY2VUb0NvbmZpZ3VyZShyZXN1bHQpO1xyXG4gICAgICAgICAgcmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLk5vU2VsZWN0aW9ucztcclxuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0VG9CdWlsZChyZXN1bHQpOyAvLyAncmVzdGFydCcgdGhlIGJ1aWxkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2dldFNlbGVjdGlvbnNBbmREZWNvc0Zyb21NZXRhZGF0YShyZXN1bHQpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pT25lLnNlbGVjdGlvbnMuZm9yRWFjaChzID0+IHtcclxuICAgICAgcy5zY2hlbWEgPSByZXN1bHQubWV0YURhdGEuc2NoZW1hO1xyXG4gICAgICBzLmluc3RhbmNlSWQgPSByZXN1bHQubWV0YURhdGEuaXRlbUlkO1xyXG4gICAgfSk7IC8vIGFkZCBzY2hlbWEgZm9yIG1hdGVyaWFsIGNyZWF0aW9uXHJcbiAgICB0aGlzLl9oYW5kbGVTZWxlY3Rpb25zUmVjZWl2ZWQocmVzdWx0Lm1ldGFEYXRhKTtcclxuICAgIHRoaXMuX2xpbmtTZWxlY3Rpb25zQW5kRGVjb3MoKTtcclxuICAgIHRoaXMuX3ByZXBhcmVUaGVTZWxlY3Rpb25zKHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJlbG9hZE1hdGVyaWFscyhzY2hlbWE6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fdmFyaWF0aW9uQ2FjaGVTZXJ2aWNlLnByZWxvYWRWYXJpYXRpb25zKHNjaGVtYSwgdGhpcy5faU9uZS5kZWNvTm9kZXMubWFwKGQgPT4gZC5nYW1lT2JqZWN0TmFtZSksIHRoaXMuYXJ0aWNsZUFzc2V0UGF0aCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRTZWxlY3Rpb25zQW5kRGVjb3NGcm9tTWV0YWRhdGEocmVzdWx0OiBDdXN0b21GbG9vckdyb3VwUmVzdWx0KTogdm9pZCB7XHJcbiAgICBpZiAocmVzdWx0Lm1ldGFEYXRhLnNlbGVjdGlvbnMgJiYgcmVzdWx0Lm1ldGFEYXRhLmRlY29zKSB7XHJcbiAgICAgIHRoaXMuX2lPbmUuc2V0U2VsZWN0aW9ucyhyZXN1bHQubWV0YURhdGEuc2VsZWN0aW9ucyk7XHJcbiAgICAgIHRoaXMuX2lPbmUuc2V0RGVjb05vZGVzKEFycmF5LmZyb20ocmVzdWx0Lm1ldGFEYXRhLmRlY29zLnZhbHVlcygpKSk7XHJcbiAgICAgIHJlc3VsdC5tZXRhRGF0YS5vYnNvbGV0ZSA9IHRydWU7XHJcbiAgICAgIGlmIChyZXN1bHQucmVzdWx0VHlwZSAhPT0gUmVzdWx0VHlwZS5Db25maWd1cmF0aW9uTm90Rml4ZWQpIHtcclxuICAgICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuT2Jzb2xldGU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9pT25lLnNlbGVjdGlvbnMubGVuZ3RoIDwgMiB8fCB0aGlzLl9pT25lLmRlY29Ob2Rlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlcy5wdXNoKG5ldyBFcnJvck1lc3NhZ2UoJ05PX1NFTEVDVElPTlNfT1JfREVDT1MnLCAnTk9fU0VMRUNUSU9OU19PUl9ERUNPU19JTkZPJykpO1xyXG4gICAgICB9XHJcbiAgICAgIHRocm93IHJlc3VsdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NlbGVjdGlvblB1Ymxpc2hlZChzZWxlY3Rpb246IFNlbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgoc2VsZWN0aW9uLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSA9PT0gbnVsbCkgfHwgKChzZWxlY3Rpb24uaGllcmFyY2hpY2FsUHVibGljYXRpb25Db2RlICYgMikgPiAwKSkgJiZcclxuICAgICAgKFxyXG4gICAgICAgIChzZWxlY3Rpb24ubm9kZVR5cGUgPT09IE5vZGVUeXBlLlF1ZXN0aW9uICYmXHJcbiAgICAgICAgICAoKChzZWxlY3Rpb24ucXVlc3Rpb25QdWJsaWNhdGlvbkNvZGUgJiAyKSA+IDApIHx8XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi5xdWVzdGlvblB1YmxpY2F0aW9uQ29kZSA9PT0gbnVsbCB8fCBzZWxlY3Rpb24ucXVlc3Rpb25QdWJsaWNhdGlvbkNvZGUgPT09IHVuZGVmaW5lZCkpIHx8XHJcbiAgICAgICAgKHNlbGVjdGlvbi5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuQW5zd2VyICYmXHJcbiAgICAgICAgICAoKChzZWxlY3Rpb24uYW5zd2VyUHVibGljYXRpb25Db2RlICYgMikgPiAwKSB8fFxyXG4gICAgICAgICAgICBzZWxlY3Rpb24uYW5zd2VyUHVibGljYXRpb25Db2RlID09PSBudWxsIHx8IHNlbGVjdGlvbi5hbnN3ZXJQdWJsaWNhdGlvbkNvZGUgPT09IHVuZGVmaW5lZCkpXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVJbnRlZ3JhdGlvbihpbnN0YW5jZUlkOiBzdHJpbmcsIG9iamVjdDogSXRlbSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ludGVncmF0aW9uRW5hYmxlZCAmJiAhb2JqZWN0Lm1ldGFkYXRhLm9ic29sZXRlKSB7XHJcbiAgICAgIGNvbnN0IGdlbmVyaWNWYXJpYXRpb25TZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9XHJcbiAgICAgICAgdGhpcy5faU9uZS5zZWxlY3Rpb25zLmZpbHRlcihzID0+IHMuZGVjb05vZGUgJiYgcy5nZW5lcmljICYmXHJcbiAgICAgICAgICAocy5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbiAmJiAocy5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi50eXBlID09PSBEZWNvTm9kZVR5cGUuVmFyaWF0aW9uKTtcclxuICAgICAgaWYgKGdlbmVyaWNWYXJpYXRpb25TZWxlY3Rpb25zICYmIGdlbmVyaWNWYXJpYXRpb25TZWxlY3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLl91cHNlcnRGdXJuaXR1cmUoaW5zdGFuY2VJZCwge1xyXG4gICAgICAgICAgVmFyaWF0aW9uOiAoZ2VuZXJpY1ZhcmlhdGlvblNlbGVjdGlvbnNbMF0uZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24uYnJhbmRJZCxcclxuICAgICAgICAgIFZhcmlhdGlvbkRlc2NyaXB0aW9uOiAoZ2VuZXJpY1ZhcmlhdGlvblNlbGVjdGlvbnNbMF0uZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24uZ2FtZU9iamVjdE5hbWUsXHJcbiAgICAgICAgICBTdXBwbGllckFydGljbGVOcjogKGdlbmVyaWNWYXJpYXRpb25TZWxlY3Rpb25zWzBdLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uLnN1cHBsaWVyQXJ0aWNsZU5yXHJcbiAgICAgICAgfSwgb2JqZWN0KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9oYW5kbGVJbnRlZ3JhdGlvbkNvbm5lY3Rpb25zKGluc3RhbmNlSWQsIG9iamVjdCk7XHJcbiAgICAgIHRoaXMuX3Vwc2VydEZ1cm5pdHVyZShpbnN0YW5jZUlkLCB7UG9zaXRpb246IG9iamVjdC5wb3NpdGlvbiwgUm90YXRpb246IG9iamVjdC5yb3RhdGlvbn0sIG9iamVjdCk7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuZW1pdChNZXNzYWdlVHlwZS5Db25maWd1cmF0aW9uQ2hhbmdlZCwgdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnMpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLl9mdXJuaXR1cmVDb25maWd1cmF0aW9ucyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zdGFydFdpdGhOZXcoY2xlYW51cDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLmxlbmd0aCA9IDA7XHJcbiAgICBpZiAoY2xlYW51cCkge1xyXG4gICAgICB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlcy5mb3JFYWNoKGEgPT4gVXRpbHMuRGlzcG9zZU9iamVjdChhKSk7XHJcbiAgICAgIHRoaXMuX3BsYWNlZEFkZGFibGVzLmZvckVhY2goYSA9PiBVdGlscy5EaXNwb3NlT2JqZWN0KGEpKTtcclxuICAgICAgdGhpcy5fY2xlYW51cCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2xlYW51cEJlZm9yZVByZXNldExvYWQoKTogdm9pZCB7XHJcbiAgICBNYXRlcmlhbFV0aWxzLkNsZWFyQ2FjaGVzKCk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENsZWFyIHZhcmlhYmxlcyB0byBsZXQgb2JqZWN0cyBiZWluZyBkaXNwb3NlZCBwcm9wZXJseVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2hhbmRsZUFmdGVyUHJlc2V0TG9hZCgpOiB2b2lkIHtcclxuICAgIC8vIG1ha2Ugc3VyZSBub3RoaW5nIGlzIGtlZXBpbmcgYSBsb2NrXHJcbiAgICB0aGlzLl9pT25lLnNldEluc3RhbmNlKG51bGwpO1xyXG4gICAgLy8gY2xlYW5cclxuICAgIHRoaXMuX2NsZWFudXAoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsZWFudXAoKTogdm9pZCB7XHJcbiAgICBVdGlscy5EaXNwb3NlT2JqZWN0KHRoaXMuZnVsbDNET2JqZWN0VG9Vc2UpO1xyXG4gICAgdGhpcy5mdWxsM0RPYmplY3RUb1VzZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwID0gdW5kZWZpbmVkO1xyXG4gICAgVXRpbHMuRGlzcG9zZU9iamVjdCh0aGlzLl9hY3RpdmVDaGlsZEVsZW1lbnQpO1xyXG4gICAgdGhpcy5fYWN0aXZlQ2hpbGRFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX3BsYWNlZEFkZGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9hZGp1c3RhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fYWRkYWJsZXMubGVuZ3RoID0gMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2VuYWJsZUludGVncmF0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5faW50ZWdyYXRpb25FbmFibGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUl0ZW1SZW1vdmVkRnJvbVNjZW5lKHJlc3VsdDogeyBpdGVtOiBhbnksIGFkZGVkVG9Hcm91cDogYm9vbGVhbiB9KTogdm9pZCB7XHJcbiAgICBpZiAocmVzdWx0LmFkZGVkVG9Hcm91cCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAocmVzdWx0Lml0ZW0gaW5zdGFuY2VvZiBJdGVtICYmICEocmVzdWx0Lml0ZW0gaW5zdGFuY2VvZiBGbG9vclBpbiB8fCByZXN1bHQuaXRlbSBpbnN0YW5jZW9mIFdhbGxQaW4pKSB7XHJcbiAgICAgIGlmICh0aGlzLl9pbnRlZ3JhdGlvbkVuYWJsZWQgJiYgcmVzdWx0Lml0ZW0udXNlckRhdGEpIHtcclxuICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gcmVzdWx0Lml0ZW0udXNlckRhdGEuaXRlbUlkID8gcmVzdWx0Lml0ZW0udXNlckRhdGEuaXRlbUlkIDogcmVzdWx0Lml0ZW0udXVpZDtcclxuICAgICAgICB0aGlzLl9mdXJuaXR1cmVDb25maWd1cmF0aW9ucy5zcGxpY2UodGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnMuZmluZEluZGV4KGYgPT4gZi5JZCA9PT0gaWQpLCAxKTtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlQnVzLmVtaXQoTWVzc2FnZVR5cGUuQ29uZmlndXJhdGlvbkNoYW5nZWQsIHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLl9mdXJuaXR1cmVDb25maWd1cmF0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fY2xlYXJFbGVtZW50cyhyZXN1bHQuaXRlbSk7XHJcbiAgICAgIHRoaXMuX2NsZWFudXAoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsZWFyRWxlbWVudHMoaXRlbTogSXRlbSk6IHZvaWQge1xyXG4gICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDdXN0b21GbG9vckl0ZW0gJiYgaXRlbS51c2VyRGF0YSAmJiBpdGVtLnVzZXJEYXRhLml0ZW1JZCkge1xyXG4gICAgICB0aGlzLmJhc2VFbGVtZW50Tm9kZUlkID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLl9vcmlnaW5hbEVsZW1lbnRQb3NpdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICAgIHRoaXMuX2VsZW1lbnRTZXJ2aWNlLnJlbW92ZUVsZW1lbnQoaXRlbS51c2VyRGF0YS5pdGVtSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGFuZGxlSW50ZWdyYXRpb25Db25uZWN0aW9ucyhpZDogc3RyaW5nLCBvYmplY3Q6IEl0ZW0pOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhcnRzOiBGdXJuaXR1cmVQYXJ0SW50ZWdyYXRpb25bXSA9IFtdO1xyXG4gICAgY29uc3QgY2hpbGRQYXJ0czogT2JqZWN0M0RbXSA9IG9iamVjdC5jb25maWd1cmFibGUgPyBvYmplY3QuY2hpbGRyZW4gOiBbb2JqZWN0XTtcclxuICAgIGNvbnN0IGxlbjogbnVtYmVyID0gY2hpbGRQYXJ0cy5sZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkOiBhbnkgPSA8Q3VzdG9tT2JqZWN0M0Q+Y2hpbGRQYXJ0c1tpXTtcclxuICAgICAgY29uc3QgY29ubmVjdGlvbjogRnVybml0dXJlUGFydEludGVncmF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRJbnRlZ3JhdGlvbigpO1xyXG4gICAgICBjb25zdCB2YXJpYXRpb25zOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uW10gPSBbXTtcclxuICAgICAgaWYgKGNoaWxkLnVzZXJEYXRhICYmIGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbiAmJiBjaGlsZC51c2VyRGF0YS5zZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAgICAgICBjb25uZWN0aW9uLklkID0gY2hpbGRQYXJ0cy5maW5kSW5kZXgoYyA9PiBjID09PSBjaGlsZCkudG9TdHJpbmcoKTtcclxuICAgICAgICBjb25uZWN0aW9uLlN1cHBsaWVyQXJ0aWNsZU5yID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnN1cHBsaWVyQXJ0aWNsZU5yO1xyXG4gICAgICAgIGNvbm5lY3Rpb24uQnJhbmRJZGVudGlmaWVyID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLmRlY29Ob2RlLmJyYW5kSWQ7XHJcbiAgICAgICAgY29ubmVjdGlvbi5CcmFuZERlc2NyaXB0aW9uID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lO1xyXG4gICAgICAgIGNvbm5lY3Rpb24uUG9zaXRpb24gPSBjaGlsZC5wb3NpdGlvbjtcclxuICAgICAgICBjb25uZWN0aW9uLlJvdGF0aW9uID0gY2hpbGQucm90YXRpb247XHJcbiAgICAgICAgaWYgKGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbi52YXJpYXRpb25zKSB7XHJcbiAgICAgICAgICBpZiAoY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnZhcmlhdGlvbnMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhdGlvbjogYW55ID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnZhcmlhdGlvbnNbMF07XHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb24uVmFyaWF0aW9uID0gdmFyaWF0aW9uLmJyYW5kSWQ7XHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb24uVmFyaWF0aW9uRGVzY3JpcHRpb24gPSB2YXJpYXRpb24uZ2FtZU9iamVjdE5hbWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbi52YXJpYXRpb25zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdmFyaWF0aW9uOiBhbnkgPSBjaGlsZC51c2VyRGF0YS5zZWxlY3Rpb24udmFyaWF0aW9uc1tqXTtcclxuICAgICAgICAgICAgICBjb25zdCB2YXJpYXRpb25QYXJ0OiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24oKTtcclxuICAgICAgICAgICAgICB2YXJpYXRpb25QYXJ0LlZhcmlhdGlvbiA9IHZhcmlhdGlvbi5icmFuZElkO1xyXG4gICAgICAgICAgICAgIHZhcmlhdGlvblBhcnQuVmFyaWF0aW9uRGVzY3JpcHRpb24gPSB2YXJpYXRpb24uZ2FtZU9iamVjdE5hbWU7XHJcbiAgICAgICAgICAgICAgdmFyaWF0aW9uUGFydC5NYXRlcmlhbElkID0gdmFyaWF0aW9uLm1hdGVyaWFsSWQ7XHJcbiAgICAgICAgICAgICAgdmFyaWF0aW9uUGFydC5TdXBwbGllckFydGljbGVOciA9IHZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICAgICAgICB2YXJpYXRpb25QYXJ0Lk9wdGlvbiA9IHZhcmlhdGlvbi5vcHRpb25UZXh0O1xyXG4gICAgICAgICAgICAgIHZhcmlhdGlvbnMucHVzaCh2YXJpYXRpb25QYXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25uZWN0aW9uLlZhcmlhdGlvbnMgPSB2YXJpYXRpb25zO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHsgLy8gYS1hcnRpa2VsXHJcbiAgICAgICAgY29ubmVjdGlvbi5JZCA9IGNoaWxkUGFydHMuZmluZEluZGV4KGMgPT4gYyA9PT0gY2hpbGQpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgY29ubmVjdGlvbi5CcmFuZElkZW50aWZpZXIgPSBjaGlsZC5tZXRhZGF0YS5pdGVtSWRlbnRpZmllcjtcclxuICAgICAgICBjb25uZWN0aW9uLkJyYW5kRGVzY3JpcHRpb24gPSBjaGlsZC5tZXRhZGF0YS5pdGVtTmFtZTtcclxuICAgICAgICBjb25uZWN0aW9uLlBvc2l0aW9uID0gY2hpbGQucG9zaXRpb247XHJcbiAgICAgICAgY29ubmVjdGlvbi5Sb3RhdGlvbiA9IGNoaWxkLnJvdGF0aW9uO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGNvbm5lY3RvcnM6IEZ1cm5pdHVyZUNvbm5lY3RlZFBhcnRJbnRlZ3JhdGlvbltdID0gW107XHJcbiAgICAgIGNvbnN0IGNsZW46IG51bWJlciA9IGNoaWxkLmNoaWxkcmVuLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjbGVuOyBqKyspIHtcclxuICAgICAgICBjb25zdCBjb25uZWN0b3I6IGFueSA9IGNoaWxkLmNoaWxkcmVuW2pdO1xyXG4gICAgICAgIGlmICgoY29ubmVjdG9yIGluc3RhbmNlb2YgQ3VzdG9tT2JqZWN0M0QgfHwgY29ubmVjdG9yIGluc3RhbmNlb2YgQ3VzdG9tTWVzaCkgJiYgKGNvbm5lY3RvciBhcyBhbnkpLmNvbm5lY3RlZFRvKSB7XHJcbiAgICAgICAgICBjb25zdCBjb25uOiBGdXJuaXR1cmVDb25uZWN0ZWRQYXJ0SW50ZWdyYXRpb24gPSBuZXcgRnVybml0dXJlQ29ubmVjdGVkUGFydEludGVncmF0aW9uKCk7XHJcbiAgICAgICAgICBjb25uLkNvbm5lY3Rpb25MYWJlbCA9IGNvbm5lY3Rvci5uYW1lO1xyXG4gICAgICAgICAgY29uc3QgZm9yZWlnblBhcnRJZHg6IG51bWJlciA9IHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmNoaWxkcmVuLmZpbmRJbmRleChjID0+IGMubmFtZSA9PT0gKGNvbm5lY3RvciBhcyBhbnkpLmNvbm5lY3RlZFRvKTtcclxuICAgICAgICAgIGNvbm4uRm9yZWlnbkNvbm5lY3Rpb25MYWJlbCA9IHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmNoaWxkcmVuW2ZvcmVpZ25QYXJ0SWR4XS51c2VyRGF0YS5zZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWU7XHJcbiAgICAgICAgICBjb25uLkZvcmVpZ25QYXJ0SWQgPSBmb3JlaWduUGFydElkeC50b1N0cmluZygpO1xyXG4gICAgICAgICAgY29ubi5Qb3NpdGlvbiA9IGNvbm5lY3Rvci5wb3NpdGlvbjtcclxuICAgICAgICAgIGNvbm4uUm90YXRpb24gPSBjb25uZWN0b3Iucm90YXRpb247XHJcbiAgICAgICAgICBjb25uZWN0b3JzLnB1c2goY29ubik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbm5lY3Rpb24uQ29ubmVjdGVkUGFydHMgPSBjb25uZWN0b3JzO1xyXG4gICAgICBwYXJ0cy5wdXNoKGNvbm5lY3Rpb24pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdXBzZXJ0RnVybml0dXJlKGlkLCB7UGFydHM6IHBhcnRzfSwgb2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Vwc2VydEZ1cm5pdHVyZShpZDogc3RyaW5nLCBvYmplY3Q6IGFueSwgaXRlbTogSXRlbSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ludGVncmF0aW9uRW5hYmxlZCAmJiAhaXRlbS5tZXRhZGF0YS5vYnNvbGV0ZSkge1xyXG4gICAgICBjb25zdCBpZHg6IG51bWJlciA9IHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLmZpbmRJbmRleChmID0+IGYuSWQgPT09IGlkKTtcclxuICAgICAgbGV0IGZ1cm5pdHVyZTogRnVybml0dXJlSW50ZWdyYXRpb247XHJcbiAgICAgIGlmIChpZHggPCAwKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnNbMF0uSWQpIHsgLy8gZW1wdHkgZW50cnkgZm9yIG1ycCBjb2RlLCByZS11c2UgdGhhdCBvbmVcclxuICAgICAgICAgIGZ1cm5pdHVyZSA9IHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zWzBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmdXJuaXR1cmUgPSBuZXcgRnVybml0dXJlSW50ZWdyYXRpb24oKTtcclxuICAgICAgICAgIHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLnB1c2goZnVybml0dXJlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnVybml0dXJlLklkID0gaWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZnVybml0dXJlID0gdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnNbaWR4XTtcclxuICAgICAgfVxyXG4gICAgICBmdXJuaXR1cmUuTXJwQ29kZSA9IHRoaXMuX3Blcm1hbmVudFN0b3JlU2VydmljZS5jb2RlO1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcclxuICAgICAgICBpZiAoZnVybml0dXJlLmhhc093blByb3BlcnR5KGtleSkgJiYgb2JqZWN0Lmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgIGZ1cm5pdHVyZVtrZXldID0gb2JqZWN0W2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRDb2RlT25GdXJuaXR1cmVDb25maWd1cmF0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2ludGVncmF0aW9uRW5hYmxlZCkge1xyXG4gICAgICBpZiAodGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnMubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgIGNvbnN0IGZ1cm5pdHVyZTogRnVybml0dXJlSW50ZWdyYXRpb24gPSBuZXcgRnVybml0dXJlSW50ZWdyYXRpb24oKTtcclxuICAgICAgICBmdXJuaXR1cmUuTXJwQ29kZSA9IHRoaXMuX3Blcm1hbmVudFN0b3JlU2VydmljZS5jb2RlO1xyXG4gICAgICAgIHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLnB1c2goZnVybml0dXJlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9mdXJuaXR1cmVDb25maWd1cmF0aW9ucy5mb3JFYWNoKGYgPT4gZi5NcnBDb2RlID0gdGhpcy5fcGVybWFuZW50U3RvcmVTZXJ2aWNlLmNvZGUpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMuZW1pdChNZXNzYWdlVHlwZS5Db25maWd1cmF0aW9uQ2hhbmdlZCwgdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FuQ29ubmVjdFNlbGVjdGlvbnMoc2VsMTogU2VsZWN0aW9uLCBzZWwyOiBTZWxlY3Rpb24pOiBib29sZWFuIHtcclxuICAgIGlmICghc2VsMS5kZWNvTm9kZSB8fCAhc2VsMi5kZWNvTm9kZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBsZXQgY2FuQ29ubmVjdDogYm9vbGVhbiA9IHNlbDIuZGVjb05vZGUudHlwZSAhPT0gRGVjb05vZGVUeXBlLlBhcnQ7XHJcbiAgICBpZiAoIWNhbkNvbm5lY3QpIHtcclxuICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSBzZWwxLmRlY29Ob2RlLmNvbm5lY3RvcnMubGVuZ3RoO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbGVuaTogbnVtYmVyID0gc2VsMi5kZWNvTm9kZS5jb25uZWN0b3JzLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgbGVuaTsgaWkrKykge1xyXG4gICAgICAgICAgY2FuQ29ubmVjdCA9IFNjZW5lM0RVdGlsLkNhblNlbGVjdG9yQ29ubmVjdChzZWwxLmRlY29Ob2RlLmNvbm5lY3RvcnMsIHNlbDEuZGVjb05vZGUuY29ubmVjdG9yc1tpXSwgc2VsMi5kZWNvTm9kZS5jb25uZWN0b3JzW2lpXSk7XHJcbiAgICAgICAgICBpZiAoY2FuQ29ubmVjdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNhbkNvbm5lY3Q7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVTZWxlY3Rpb25zUmVjZWl2ZWQobWV0YWRhdGE6IE1ldGFkYXRhKSB7XHJcbiAgICBpZiAodGhpcy5fYW5zd2VyU2VsZWN0ZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25zLmZpbmQocyA9PiBzLm5vZGVJZCA9PT0gdGhpcy5fYW5zd2VyU2VsZWN0ZWRbdGhpcy5fYW5zd2VyU2VsZWN0ZWQubGVuZ3RoIC0gMV0ubm9kZUlkKTtcclxuICAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICAgIGxldCBpdGVtTmFtZTogc3RyaW5nID0gJyc7XHJcbiAgICAgICAgaWYgKG1ldGFkYXRhLml0ZW1OYW1lID09PSAnJykge1xyXG4gICAgICAgICAgaWYgKG1ldGFkYXRhLml0ZW1EZXNjcmlwdGlvbiAhPT0gJycpIHtcclxuICAgICAgICAgICAgaXRlbU5hbWUgPSBtZXRhZGF0YS5pdGVtRGVzY3JpcHRpb247XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpdGVtTmFtZSA9IG1ldGFkYXRhLml0ZW1JZGVudGlmaWVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpdGVtTmFtZSA9IG1ldGFkYXRhLml0ZW1OYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9nb29nbGVUYWdNYW5hZ2VyLnNlbmRFdmVudChHb29nbGVUYWdNYW5hZ2VyRXZlbnQuQW5zd2VyQ2hvc2VuLCB7XHJcbiAgICAgICAgICAnYXJ0aWNsZU5yJzogbWV0YWRhdGEuaXRlbUlkZW50aWZpZXIsXHJcbiAgICAgICAgICAncHJvZHVjdCc6IGl0ZW1OYW1lLFxyXG4gICAgICAgICAgJ29wdGlvbkRlc2NyaXB0aW9uJzogc2VsZWN0aW9uLmNvbW1lcmNpYWxBbnN3ZXIgPyBzZWxlY3Rpb24uY29tbWVyY2lhbEFuc3dlciA6IHNlbGVjdGlvbi5hbnN3ZXIsXHJcbiAgICAgICAgICAnb3B0aW9uUGF0aCc6IHNlbGVjdGlvbi5zZWxlY3Rpb25cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGFuZGxlQ29ubmVjdGlvblJlc2V0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwKSB7XHJcbiAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLnNldFVuc2VsZWN0ZWQoKTtcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5lbWl0KE1lc3NhZ2VUeXBlLkl0ZW1VbnNlbGVjdGVkLCB1bmRlZmluZWQpO1xyXG4gICAgICB0aGlzLl9zaG93V2FybmluZyh7dGl0bGU6ICdXQVJOSU5HJywgbWVzc2FnZTogJ1JFRlJFU0hfRFVFX1RPX0lOQUNUSVZJVFknfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVBbnN3ZXJTZWxlY3RlZChhbnN3ZXI6IEFuc3dlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fYW5zd2VyU2VsZWN0ZWQucHVzaChhbnN3ZXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNhbmNlbEFuc3dlcihtZXRhZGF0YTogTWV0YWRhdGEsIHJlYnVpbGQ6IGJvb2xlYW4gPSB0cnVlLCBnZXRBbnN3ZXJzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuX2lPbmUuY2FuY2VsQW5zd2VyKCk7XHJcbiAgICBpZiAocmVidWlsZCkge1xyXG4gICAgICB0aGlzLl9zdGFydFRvQnVpbGRGcm9tQ29uZmlndXJhdG9yKG1ldGFkYXRhKTtcclxuICAgIH0gZWxzZSBpZiAoZ2V0QW5zd2VycykgeyAvLyBpZiBub3QgcmVidWlsZCB0aGVuIGNoZWNrIGlmIHdlIG5lZWQgdG8gZ2V0IGFuc3dlcnNcclxuICAgICAgY29uc3QgcXVlc3Rpb25BbmRBbnN3ZXJzOiBRdWVzdGlvbkFuZEFuc3dlcnMgPSBhd2FpdCB0aGlzLl9pT25lLmdldFF1ZXN0aW9uQW5kQW5zd2Vyc0FzeW5jKCk7IC8vIHNlZSBpZiB0aGVyZSBpcyB1c2VyIGlucHV0IG5lZWRlZFxyXG4gICAgICB0aGlzLl9pT25lLmhhbmRsZUFuc3dlcnNSZWNlaXZlZChxdWVzdGlvbkFuZEFuc3dlcnMuYW5zd2Vycyk7XHJcbiAgICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hbnN3ZXJDb3VudFJlY2VpdmVkLm5leHQocXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnMubGVuZ3RoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZWxlY3RTZWxlY3Rpb24oXHJcbiAgICBzZWxlY3Rpb246IFNlbGVjdGlvbiwgbWV0YWRhdGE6IE1ldGFkYXRhLCBmb3JjZUJhY2tUb05vZGU/OiBib29sZWFuLCBhZnRlcj86IGJvb2xlYW4sIGNvbm5lY3Rvcj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5faU9uZS5zZWxlY3RTZWxlY3Rpb24oc2VsZWN0aW9uLCBmb3JjZUJhY2tUb05vZGUsIGFmdGVyLCBjb25uZWN0b3IpO1xyXG4gICAgdGhpcy5fZ2VuZXJpY1NlbGVjdGlvbiA9IHNlbGVjdGlvbi5nZW5lcmljO1xyXG4gICAgdGhpcy5fc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihtZXRhZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBtZXRhZGF0YTogTWV0YWRhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX2VsZW1lbnRTZXJ2aWNlLnJlbW92ZUVsZW1lbnQoc2VsZWN0aW9uLmluc3RhbmNlSWQsIHNlbGVjdGlvbi5ub2RlKTtcclxuICAgIGF3YWl0IHRoaXMuX2lPbmUuZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICB0aGlzLl9zdGFydFRvQnVpbGRGcm9tQ29uZmlndXJhdG9yKG1ldGFkYXRhKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyByZXBsYWNlU2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBtZXRhZGF0YTogTWV0YWRhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuX2lPbmUucmVwbGFjZVNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gICAgdGhpcy5fc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihtZXRhZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2VsZWN0QW5zd2VyKGFuc3dlcjogQW5zd2VyLCBpbnB1dDogc3RyaW5nLCBtZXRhZGF0YTogTWV0YWRhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3ByZWxvYWRNYXRlcmlhbChhbnN3ZXIpO1xyXG4gICAgYXdhaXQgdGhpcy5faU9uZS5zZWxlY3RBbnN3ZXIoYW5zd2VyLCBpbnB1dCk7XHJcbiAgICB0aGlzLl9oYW5kbGVBbnN3ZXJTZWxlY3RlZChhbnN3ZXIpO1xyXG4gICAgY29uc3QgcmVzdWx0OiBDdXN0b21GbG9vckdyb3VwUmVzdWx0ID0gYXdhaXQgdGhpcy5fc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihtZXRhZGF0YSk7XHJcbiAgICB0aGlzLmFuc3dlclNlbGVjdGVkLm5leHQocmVzdWx0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEFjdGl2ZUZ1cm5pdHVyZShpbnN0YW5jZUlkOiBzdHJpbmcpOiBJdGVtIHtcclxuICAgIGNvbnN0IGNvbmZpZ3VyYWJsZXM6IGFueVtdID0gdGhpcy5faXRlbVNlcnZpY2UuZ2V0Q29uZmlndXJhYmxlcygpO1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSBjb25maWd1cmFibGVzLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgaWYgKGNvbmZpZ3VyYWJsZXNbaV0ubWV0YWRhdGEgJiYgY29uZmlndXJhYmxlc1tpXS5tZXRhZGF0YS5pdGVtSWQgPT09IGluc3RhbmNlSWQgJiYgIWNvbmZpZ3VyYWJsZXNbaV0udGVtcE9iamVjdCkge1xyXG4gICAgICAgIHJldHVybiBjb25maWd1cmFibGVzW2ldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9saW5rU2VsZWN0aW9uc0FuZERlY29zKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLnNlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAvLyBjb25zdCBpZDogc3RyaW5nID0gdGhpcy5zZWxlY3Rpb25zW2ldLmFydE5vZGVJZERlY287XHJcbiAgICAgIGxldCBkZWNvOiBhbnkgPSB0aGlzLl9pT25lLmRlY29Ob2Rlcy5maW5kKGQgPT4gZC5pZCA9PT0gdGhpcy5zZWxlY3Rpb25zW2ldLmFydE5vZGVJZERlY28pO1xyXG4gICAgICBpZiAoIWRlY28pIHtcclxuICAgICAgICBkZWNvID0gbmV3IERlY29Ob2RlKCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRlY28udHlwZSAhPT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IHZhcmlhdGlvbjogYW55ID0gdGhpcy5fZ2V0VmFyaWF0aW9ucygpLmZpbmQodiA9PiB2LnBhcmVudElkID09PSB0aGlzLnNlbGVjdGlvbnNbaV0uYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICAgICAgaWYgKHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgZGVjby52YXJpYXRpb24gPSB2YXJpYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uc1tpXS5kZWNvTm9kZSA9IGRlY287XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pT25lLnNlbGVjdGlvbnNBbmREZWNvc0xpbmtlZC5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVDb25maWd1cmFibGVJdGVtKGluc3RhbmNlSWQ6IHN0cmluZywgbWV0YWRhdGE6IE1ldGFkYXRhKTogSXRlbSB7XHJcbiAgICAvLyBjb25zdCBmdXJuaXR1cmU6IEl0ZW0gPSB0aGlzLl9nZXRBY3RpdmVGdXJuaXR1cmUoaW5zdGFuY2VJZCk7XHJcbiAgICAvLyBjb25zdCBjbG9uZVNlbGVjdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0aW9ucykpO1xyXG4gICAgLy8gY2xvbmVTZWxlY3Rpb25zLmZvckVhY2gocyA9PiB7XHJcbiAgICAvLyAgIHMuaW1hZ2VEYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gICBzLmltYWdlRGF0YUxhc3RBbnN3ZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAvLyB9KTtcclxuICAgIC8vIGlmIChmdXJuaXR1cmUpIHtcclxuICAgIC8vICAgZnVybml0dXJlLm1ldGFkYXRhLmRlY29zID0gQXJyYXkuZnJvbSh0aGlzLl9pT25lLmRlY29Ob2Rlcyk7XHJcbiAgICAvLyAgIGZ1cm5pdHVyZS5tZXRhZGF0YS5zZWxlY3Rpb25zID0gY2xvbmVTZWxlY3Rpb25zO1xyXG4gICAgLy8gICBmdXJuaXR1cmUubWFya0ZvckRlbGV0aW9uQ2hpbGRyZW4oKTtcclxuICAgIC8vICAgcmV0dXJuIGZ1cm5pdHVyZTtcclxuICAgIC8vIH1cclxuICAgIGlmICghbWV0YWRhdGEucG9zaXRpb24pIHtcclxuICAgICAgbWV0YWRhdGEucG9zaXRpb24gPSB0aGlzLnN0YXJ0UG9zaXRpb24gfHwgZGVmYXVsdFBvc2l0aW9uO1xyXG4gICAgfVxyXG4gICAgaWYgKCFtZXRhZGF0YS5yb3RhdGlvbikge1xyXG4gICAgICBtZXRhZGF0YS5yb3RhdGlvbiA9IG1ldGFkYXRhLmRlZmF1bHQxODAgPyBkZWZhdWx0Um90YXRpb24gOiBuZXcgRXVsZXIoKTtcclxuICAgIH1cclxuICAgIC8vIElmIGl0ZW1UeXBlIGlzIGRpZmZlcmVudCBpbiBhcnRpY2xlIGNvbXBhcmVkIHRvIHNhdmVkIHZhbHVlIGluIHRoZSAuanNvbiwgdGhlIGl0ZW1UeXBlIGluIGFydGljbGUgaXMgYXBwbGllZFxyXG4gICAgLy8gbWV0YWRhdGEuaXRlbVR5cGUgPSB0aGlzLml0ZW1UeXBlICYmIHRoaXMuaXRlbVR5cGUgIT09IG1ldGFkYXRhLml0ZW1UeXBlID8gdGhpcy5pdGVtVHlwZSA6IG1ldGFkYXRhLml0ZW1UeXBlO1xyXG4gICAgY29uc3QgaXRlbUNvbnN0cnVjdG9yID0gRmFjdG9yeS5nZXRDbGFzcyh0aGlzLnN0YW5kQWxvbmUgPyBJdGVtVHlwZS5DdXN0b21GbG9vckdyb3VwIDogbWV0YWRhdGEuaXRlbVR5cGUpO1xyXG4gICAgY29uc3QgaXRlbSA9IG5ldyBpdGVtQ29uc3RydWN0b3IoXHJcbiAgICAgIG1ldGFkYXRhLFxyXG4gICAgICB1bmRlZmluZWQsIC8vIGJhc2Ugb24gZW1wdHkgb2JqZWN0XHJcbiAgICAgIHtcclxuICAgICAgICBtb3VzZU92ZXI6IHRoaXMubW91c2VPdmVyLFxyXG4gICAgICAgIG1vdXNlT2ZmOiB0aGlzLm1vdXNlT2ZmLFxyXG4gICAgICAgIGl0ZW1TZWxlY3RlZDogdGhpcy5zZWxlY3RJdGVtLFxyXG4gICAgICAgIGl0ZW1VbnNlbGVjdGVkOiB0aGlzLnVuU2VsZWN0SXRlbSxcclxuICAgICAgICBlbGVtZW50U2VsZWN0ZWQ6IHRoaXMuc2VsZWN0RWxlbWVudCxcclxuICAgICAgICBlbGVtZW50VW5zZWxlY3RlZDogdGhpcy51blNlbGVjdEVsZW1lbnQsXHJcbiAgICAgICAgY29uZmlndXJpbmdDaGFuZ2VkOiB0aGlzLmNoYW5nZUNvbmZpZ3VyZU1vZGUsXHJcbiAgICAgICAgY2hpbGRFbGVtZW50UG9zaXRpb25DaGFuZ2VkSGFuZGxlcjogdGhpcy5tb3ZlQ2hpbGRFbGVtZW50LFxyXG4gICAgICAgIGNoaWxkRWxlbWVudFBsYWNlSGFuZGxlcjogdGhpcy5wbGFjZUNoaWxkRWxlbWVudFxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnRQb3NpdGlvbkNoYW5nZWRIYW5kbGVyOiBhZGp1c3RhYmxlID8gdGhpcy5tb3ZlQ2hpbGRFbGVtZW50IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50UGxhY2VIYW5kbGVyOiBhZGp1c3RhYmxlID8gdGhpcy5wbGFjZUNoaWxkRWxlbWVudCA6IHVuZGVmaW5lZFxyXG4gICAgICAgICovXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICBpdGVtLmNhbkRlbGV0ZSA9ICF0aGlzLnN0YW5kQWxvbmU7XHJcbiAgICBpdGVtLmNhbkNvcHkgPSAhdGhpcy5zdGFuZEFsb25lO1xyXG4gICAgaXRlbS5hbGx3YXlzQ29uZmlndXJlTW9kZSA9IHRoaXMuc3RhbmRBbG9uZTtcclxuICAgIGl0ZW0uaGlnaExpZ2h0RGlzYWJsZWQgPSAhdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMudXNlU3RhbmRhbG9uZUhpZ2hMaWdodDtcclxuICAgIGl0ZW0udGVtcE9iamVjdCA9IHRydWU7XHJcbiAgICBpdGVtLm5hbWUgPSBtZXRhZGF0YS5pdGVtTmFtZSArICdfY2xvbmUnO1xyXG4gICAgaXRlbS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLl9pdGVtU2VydmljZS5hZGRJdGVtKGl0ZW0pO1xyXG4gICAgLy8gdGhpcy5fdXBzZXJ0RnVybml0dXJlKG1ldGFkYXRhLml0ZW1JZCwge0JyYW5kSWRlbnRpZmllcjogbWV0YWRhdGEuaXRlbUlkZW50aWZpZXJ9LCBpdGVtKTtcclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlUG9zaXRpb25BbmltYXRpb24ob2JqZWN0OiBPYmplY3QzRCwgZnJvbTogVmVjdG9yMywgdG86IFZlY3RvcjMsIGVhc2luZzogVFdFRU4uRWFzaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB0d2VlbkZyb206IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygpLmNvcHkoZnJvbSk7XHJcbiAgICBjb25zdCB0d2VlbiA9IG5ldyBUV0VFTi5Ud2Vlbih0d2VlbkZyb20pXHJcbiAgICAgIC50byh0bywgMTAwMClcclxuICAgICAgLmVhc2luZyhlYXNpbmcpXHJcbiAgICAgIC5vblVwZGF0ZSgoKSA9PiB7XHJcbiAgICAgICAgb2JqZWN0LnBvc2l0aW9uLmNvcHkodHdlZW5Gcm9tKTtcclxuICAgICAgICB0aGlzLl9zY2VuZVNlcnZpY2UubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHR3ZWVuLm9uQ29tcGxldGUocmVzb2x2ZS5iaW5kKHRoaXMsIHR3ZWVuKSkub25TdG9wKHJlamVjdCkuc3RhcnQoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9hbmltYXRlQ2hhbmdlcyhmdXJuaXR1cmU6IEl0ZW0sIGNoYW5nZXM6IENoYW5nZXNJbnRlcmZhY2VbXSk6IFByb21pc2U8dm9pZFtdPiB7XHJcbiAgICAvLyBpdCdzIGNocmlzdG1hc3NzXHJcbiAgICBjb25zdCBhbmltYXRpb25zOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcclxuICAgIGlmIChmdXJuaXR1cmUgaW5zdGFuY2VvZiBDdXN0b21GbG9vckl0ZW0pIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgZWFzaW5nOiBUV0VFTi5FYXNpbmcgPSAhY2hhbmdlc1tpXS5vbGRQb3NpdGlvbiA/IFRXRUVOLkVhc2luZy5FeHBvbmVudGlhbC5PdXQgOlxyXG4gICAgICAgICAgKCFjaGFuZ2VzW2ldLm5ld1Bvc2l0aW9uID8gVFdFRU4uRWFzaW5nLkV4cG9uZW50aWFsLk91dCA6IFRXRUVOLkVhc2luZy5FeHBvbmVudGlhbC5Jbk91dCk7XHJcbiAgICAgICAgY29uc3QgZnJvbTogVmVjdG9yMyA9XHJcbiAgICAgICAgICBjaGFuZ2VzW2ldLm9sZFBvc2l0aW9uID8gbmV3IFZlY3RvcjMoKS5jb3B5KGNoYW5nZXNbaV0ub2xkUG9zaXRpb24pIDogbmV3IFZlY3RvcjMoKS5jb3B5KGNoYW5nZXNbaV0ubmV3UG9zaXRpb24pLnNldFkoMTApO1xyXG4gICAgICAgIGNvbnN0IHRvOiBWZWN0b3IzID1cclxuICAgICAgICAgIGNoYW5nZXNbaV0ubmV3UG9zaXRpb24gPyBuZXcgVmVjdG9yMygpLmNvcHkoY2hhbmdlc1tpXS5uZXdQb3NpdGlvbikgOiBuZXcgVmVjdG9yMygpLmNvcHkoY2hhbmdlc1tpXS5vbGRQb3NpdGlvbikuc2V0WSgxMCk7XHJcbiAgICAgICAgY29uc3Qgb2JqOiBPYmplY3QzRCA9IGZ1cm5pdHVyZS5nZXRPYmplY3RCeU5hbWUoY2hhbmdlc1tpXS5uYW1lKTtcclxuICAgICAgICBpZiAoIWZyb20uZXF1YWxzKHRvKSkge1xyXG4gICAgICAgICAgYW5pbWF0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVQb3NpdGlvbkFuaW1hdGlvbihvYmosIGZyb20sIHRvLCBlYXNpbmcpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGFuaW1hdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfcmVwbGFjZUN1cnJlbnRJdGVtKG5ld0l0ZW06IEl0ZW0sIG1ldGFkYXRhOiBNZXRhZGF0YSwgYW5pbWF0ZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxJdGVtPiB7XHJcbiAgICBjb25zdCBmdXJuaXR1cmU6IEl0ZW0gPSB0aGlzLl9nZXRBY3RpdmVGdXJuaXR1cmUobWV0YWRhdGEuaXRlbUlkKTtcclxuICAgIGNvbnN0IGNsb25lU2VsZWN0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3Rpb25zKSk7XHJcbiAgICBjbG9uZVNlbGVjdGlvbnMuZm9yRWFjaChzID0+IHtcclxuICAgICAgcy5pbWFnZURhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHMuaW1hZ2VEYXRhTGFzdEFuc3dlciA9IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKHMuYWRkYWJsZXMpIHtcclxuICAgICAgICBzLmFkZGFibGVzLmZvckVhY2goYSA9PiB7XHJcbiAgICAgICAgICBhLmltYWdlRGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAoZnVybml0dXJlKSB7XHJcbiAgICAgIGZ1cm5pdHVyZS5tZXRhZGF0YS5kZWNvcyA9IEFycmF5LmZyb20odGhpcy5faU9uZS5kZWNvTm9kZXMpO1xyXG4gICAgICBmdXJuaXR1cmUubWV0YWRhdGEuc2VsZWN0aW9ucyA9IGNsb25lU2VsZWN0aW9ucztcclxuICAgICAgaWYgKGZ1cm5pdHVyZSBpbnN0YW5jZW9mIEN1c3RvbVdhbGxGbG9vckl0ZW0pIHtcclxuICAgICAgICAobmV3SXRlbSBhcyBDdXN0b21XYWxsRmxvb3JJdGVtKS5jdXJyZW50V2FsbCA9IGZ1cm5pdHVyZS5jdXJyZW50V2FsbDtcclxuICAgICAgfVxyXG4gICAgICBuZXdJdGVtLnVwZGF0ZVBpdm90KCk7XHJcbiAgICAgIGNvbnN0IGNoYW5nZXM6IENoYW5nZXNJbnRlcmZhY2VbXSA9IGZ1cm5pdHVyZSBpbnN0YW5jZW9mIEN1c3RvbUZsb29ySXRlbSA/IE9iamVjdFV0aWxzLkdldENoYW5nZXMoZnVybml0dXJlLmNoaWxkcmVuLCBuZXdJdGVtLmNoaWxkcmVuKSA6IFtdO1xyXG4gICAgICAvLyBhbmltYXRlIHJlbW92ZWQgaXRlbXNcclxuICAgICAgY29uc3QgcmVtb3ZlZENoYW5nZXM6IENoYW5nZXNJbnRlcmZhY2VbXSA9IGNoYW5nZXMuZmlsdGVyKGMgPT4gIWMubmV3UG9zaXRpb24pO1xyXG4gICAgICBpZiAoYW5pbWF0ZSAmJiByZW1vdmVkQ2hhbmdlcyAmJiByZW1vdmVkQ2hhbmdlcy5sZW5ndGggPiAwKSB7IC8vIGFuaW1hdGUgY2hhbmdlcyB0byB0aGUgbW9kZWxcclxuICAgICAgICBhd2FpdCB0aGlzLl9hbmltYXRlQ2hhbmdlcyhmdXJuaXR1cmUsIHJlbW92ZWRDaGFuZ2VzKTtcclxuICAgICAgfVxyXG4gICAgICAvLyByZW1vdmUgY2hpbGRyZW4gZnJvbSBmdXJuaXR1cmVcclxuICAgICAgZnVybml0dXJlLmNsZWFyQ2hpbGRyZW4oKTtcclxuICAgICAgLy8gYWRkIG5ldyBjaGlsZHJlbiB0byBmdXJuaXR1cmVcclxuICAgICAgbmV3SXRlbS5jaGlsZHJlbi5tYXAoYyA9PiBmdXJuaXR1cmUuYWRkQ2hpbGQoYykpO1xyXG4gICAgICB0aGlzLl9pdGVtU2VydmljZS5yZW1vdmVJdGVtKG5ld0l0ZW0sIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgIC8vIGFuaW1hdGUgKG5ldykgaXRlbXNcclxuICAgICAgY29uc3Qgb3RoZXJDaGFuZ2VzOiBDaGFuZ2VzSW50ZXJmYWNlW10gPSBjaGFuZ2VzLmZpbHRlcihjID0+IGMubmV3UG9zaXRpb24pO1xyXG4gICAgICBpZiAoYW5pbWF0ZSAmJiBvdGhlckNoYW5nZXMgJiYgb3RoZXJDaGFuZ2VzLmxlbmd0aCA+IDApIHsgLy8gYW5pbWF0ZSBjaGFuZ2VzIHRvIHRoZSBtb2RlbFxyXG4gICAgICAgIGF3YWl0IHRoaXMuX2FuaW1hdGVDaGFuZ2VzKGZ1cm5pdHVyZSwgb3RoZXJDaGFuZ2VzKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZnVybml0dXJlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbmV3SXRlbS52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgbmV3SXRlbS50ZW1wT2JqZWN0ID0gZmFsc2U7XHJcbiAgICAgIG5ld0l0ZW0ubmFtZSA9IG1ldGFkYXRhLml0ZW1OYW1lO1xyXG4gICAgICB0aGlzLl91cHNlcnRGdXJuaXR1cmUobWV0YWRhdGEuaXRlbUlkLCB7QnJhbmRJZGVudGlmaWVyOiBtZXRhZGF0YS5pdGVtSWRlbnRpZmllcn0sIG5ld0l0ZW0pO1xyXG4gICAgICByZXR1cm4gbmV3SXRlbTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3VzZU92ZXIgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmlzTW91c2VPdmVyT2JqZWN0ID0gdHJ1ZTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgbW91c2VPZmYgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmlzTW91c2VPdmVyT2JqZWN0ID0gZmFsc2U7XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIHNlbGVjdEl0ZW0gPSAobWVzaDogTWVzaCkgPT4ge1xyXG4gICAgLy8gdGhpcy5hY3RpdmVJbnN0YW5jZSA9IG1lc2gudXNlckRhdGEuaXRlbUlkO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyB1blNlbGVjdEl0ZW0gPSAoKSA9PiB7XHJcbiAgICAvLyB0aGlzLnNob3dMaXRlU2VsZWN0b3IgPSBmYWxzZTtcclxuICAgIC8vIHRoaXMuc2hvd1NlbGVjdGlvbnMgPSBmYWxzZTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgc2VsZWN0RWxlbWVudCA9IChlbGVtZW50OiBNZXNoLCBtb3VzZVBvczogVmVjdG9yMykgPT4ge1xyXG4gICAgdGhpcy5fYWN0aXZlQ2hpbGRFbGVtZW50ID0gZWxlbWVudDtcclxuICAgIGlmIChlbGVtZW50LnBhcmVudCBpbnN0YW5jZW9mIEN1c3RvbU9iamVjdDNEKSB7XHJcbiAgICAgIHRoaXMuX29yaWdpbmFsRWxlbWVudFBvc2l0aW9uLmNvcHkoZWxlbWVudC5wYXJlbnQucG9zaXRpb24pO1xyXG4gICAgICAvLyBpZiAodGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAuYWRqdXN0YWJsZSkge1xyXG4gICAgICBpZiAodGhpcy5faXNNb3ZlYWJsZU9iamVjdChlbGVtZW50LnBhcmVudCkpIHtcclxuICAgICAgICBjb25zdCBjb25uZWN0b3I6IGFueSA9IGVsZW1lbnQucGFyZW50LmNoaWxkcmVuLmZpbmQoYyA9PiBjLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdjXycpID4gLTEpO1xyXG4gICAgICAgIGlmIChjb25uZWN0b3IuY29ubmVjdGVkVG8pIHtcclxuICAgICAgICAgIGNvbnN0IGJhc2VFbGVtZW50OiBPYmplY3QzRCA9IDxDdXN0b21PYmplY3QzRD50aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5nZXRPYmplY3RCeU5hbWUoY29ubmVjdG9yLmNvbm5lY3RlZFRvKTtcclxuICAgICAgICAgIHRoaXMuYmFzZUVsZW1lbnROb2RlSWQgPSBiYXNlRWxlbWVudC51c2VyRGF0YSAmJiBiYXNlRWxlbWVudC51c2VyRGF0YS5zZWxlY3Rpb24gPyBiYXNlRWxlbWVudC51c2VyRGF0YS5zZWxlY3Rpb24ubm9kZUlkIDogMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMudG9nZ2xlU2VsZWN0ZWRFbGVtZW50Lm5leHQoZWxlbWVudCk7XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIHVuU2VsZWN0RWxlbWVudCA9ICgpID0+IHtcclxuICAgIHRoaXMuX2FjdGl2ZUNoaWxkRWxlbWVudCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudG9nZ2xlU2VsZWN0ZWRFbGVtZW50Lm5leHQodW5kZWZpbmVkKTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgbW92ZUNoaWxkRWxlbWVudCA9IChlbGVtZW50OiBDdXN0b21PYmplY3QzRCwgcG9zOiBWZWN0b3IzKSA9PiB7XHJcbiAgICBjb25zdCB3b3JsZFRvTG9jYWxQb3M6IFZlY3RvcjMgPSB0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC53b3JsZFRvTG9jYWwocG9zLmNsb25lKCkpO1xyXG4gICAgdGhpcy5fbW92ZUNoaWxkRWxlbWVudFRvUG9zaXRpb24oZWxlbWVudCwgd29ybGRUb0xvY2FsUG9zKTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgcGxhY2VDaGlsZEVsZW1lbnQgPSBhc3luYyAoZWxlbWVudDogQ3VzdG9tT2JqZWN0M0QpID0+IHtcclxuICAgIGlmICh0aGlzLl9pc01vdmVhYmxlT2JqZWN0KGVsZW1lbnQpICYmIChlbGVtZW50IGFzIGFueSkubW92ZWQpIHtcclxuICAgICAgY29uc3QgYmFzZUVsZW1lbnQ6IE9iamVjdDNEW10gPVxyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmdldE9iamVjdHNCeVVzZXJEYXRhUHJvcCgnc2VsZWN0aW9uJywgJ25vZGVJZCcsIHRoaXMuYmFzZUVsZW1lbnROb2RlSWQpO1xyXG4gICAgICAvLyB1c2UgaW5zdGFuY2VJZCBmcm9tIHBhcmVudFxyXG4gICAgICBjb25zdCBpdGVtOiBJdGVtID0gT2JqZWN0VXRpbHMuR2V0UGFyZW50SXRlbShlbGVtZW50KTtcclxuICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICBjb25zdCBjb25uZWN0b3I6IHN0cmluZyA9XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLl9lbGVtZW50U2VydmljZS5wbGFjZUVsZW1lbnRPbkNvbm5lY3RvcihcclxuICAgICAgICAgICAgaXRlbS5tZXRhZGF0YS5pdGVtSWQsIGVsZW1lbnQsIGJhc2VFbGVtZW50Lmxlbmd0aCA+IDAgPyBiYXNlRWxlbWVudFswXSA6IG51bGwpO1xyXG4gICAgICAgIHRoaXMuX3NhdmVFbGVtZW50Q29ubmVjdG9yKGVsZW1lbnQsIGNvbm5lY3Rvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICBwdWJsaWMgY2hhbmdlQ29uZmlndXJlTW9kZSA9IGFzeW5jIChtZXRhZGF0YTogTWV0YWRhdGEsIGNvbmZpZ3VyaW5nOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbmZpZ3VyZU1vZGVDaGFuZ2VkLm5leHQoe21ldGFkYXRhOiBtZXRhZGF0YSwgY29uZmlndXJpbmc6IGNvbmZpZ3VyaW5nfSk7XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIGRyYWdDb25uZWN0b3IgPSBhc3luYyAoY29ubmVjdG9yOiBDdXN0b21NZXNoLCBwb3M6IFZlY3RvcjMpID0+IHtcclxuICAgIHRoaXMuX3Jlc2l6ZVNlcnZpY2UuZHJhZ0Nvbm5lY3RvclRvTmV3UG9zaXRpb24oY29ubmVjdG9yLCBwb3MpO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBjYW5jZWxDb25maWd1cmluZ0N1cnJlbnRJbnN0YW5jZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCkge1xyXG4gICAgICB0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5jb25maWd1cmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNNb3ZlYWJsZU9iamVjdChvYmo6IE9iamVjdDNEKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gb2JqLnVzZXJEYXRhICYmIG9iai51c2VyRGF0YS5zZWxlY3Rpb24gJiYgb2JqLnVzZXJEYXRhLnNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nID09PSBIZGVjb1Bvc2l0aW9uaW5nLlZhcmlhYmxlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfYWRkRWxlbWVudE9uQ29ubmVjdG9yKGN1cnJlbnRJdGVtOiBJdGVtLCBlbGVtZW50OiBPYmplY3QzRCwgY29ubmVjdG9yOiBzdHJpbmcsIGNvbm5lY3RlZE5vZGVJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBjb25zdCBjb246IE9iamVjdDNEID0gdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAuZ2V0T2JqZWN0QnlOYW1lKGNvbm5lY3Rvci5jb25uZWN0b3IpO1xyXG4gICAgLy8gaWYgKGNvbikge2VcclxuICAgIC8vIGNvbnN0IHBvczogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCkuY29weShjb24ucG9zaXRpb24pO1xyXG4gICAgLy8gY29uLmxvY2FsVG9Xb3JsZChwb3MpO1xyXG4gICAgY29uc3QgY29ubmVjdG9yRnJvbUVsZW1lbnQgPSBjdXJyZW50SXRlbS5jb25uZWN0b3JGcm9tRWxlbWVudChlbGVtZW50LnVzZXJEYXRhLnNlbGVjdGlvbik7XHJcbiAgICBjb25zdCBpZEZyb21CYXNlRWxlbWVudDogbnVtYmVyID0gY29ubmVjdGVkTm9kZUlkID8gY29ubmVjdGVkTm9kZUlkIDogY29ubmVjdG9yRnJvbUVsZW1lbnQuY29ubmVjdGVkTm9kZUlkO1xyXG4gICAgY29uc3QgYmFzZUVsZW1lbnQ6IE9iamVjdDNEW10gPSBjdXJyZW50SXRlbS5nZXRPYmplY3RzQnlVc2VyRGF0YVByb3AoJ3NlbGVjdGlvbicsICdub2RlSWQnLCBpZEZyb21CYXNlRWxlbWVudCk7XHJcblxyXG4gICAgY29uc3QgaXRlbTogSXRlbSA9IE9iamVjdFV0aWxzLkdldFBhcmVudEl0ZW0oZWxlbWVudCk7XHJcbiAgICBpZiAoaXRlbSkge1xyXG4gICAgICBjb25zdCBjb25uOiBzdHJpbmcgPVxyXG4gICAgICAgIGF3YWl0IHRoaXMuX2VsZW1lbnRTZXJ2aWNlLnBsYWNlRWxlbWVudE9uQ29ubmVjdG9yKFxyXG4gICAgICAgICAgaXRlbS5tZXRhZGF0YS5pdGVtSWQsIGVsZW1lbnQsIGJhc2VFbGVtZW50Lmxlbmd0aCA+IDAgPyBiYXNlRWxlbWVudFswXSA6IG51bGwsIGZhbHNlLCBjb25uZWN0b3IsIGZhbHNlKTtcclxuICAgICAgdGhpcy5fc2F2ZUVsZW1lbnRDb25uZWN0b3IoZWxlbWVudCwgY29ubik7XHJcbiAgICB9XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zYXZlRWxlbWVudENvbm5lY3RvcihlbGVtZW50OiBPYmplY3QzRCwgY29ubmVjdG9yOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQudXNlckRhdGEgJiYgZWxlbWVudC51c2VyRGF0YS5zZWxlY3Rpb24pIHtcclxuICAgICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAudXBkYXRlRWxlbWVudENvbm5lY3RvcihlbGVtZW50LnVzZXJEYXRhLnNlbGVjdGlvbiwgY29ubmVjdG9yLCB0aGlzLmJhc2VFbGVtZW50Tm9kZUlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIG1vdmVcclxuICAgKiBAcGFyYW0gcG9zIFRoZSBsb2NhbCBwb3NpdGlvblxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfbW92ZUNoaWxkRWxlbWVudFRvUG9zaXRpb24oZWxlbWVudDogT2JqZWN0M0QsIHBvczogVmVjdG9yMyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2lzTW92ZWFibGVPYmplY3QoZWxlbWVudCkpIHtcclxuICAgICAgY29uc3Qgd29ybGRUb0xvY2FsUG9zOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKS5jb3B5KHBvcykuYWRkKHRoaXMuX29yaWdpbmFsRWxlbWVudFBvc2l0aW9uKTtcclxuICAgICAgY29uc3QgYmFzZUVsZW1lbnQ6IE9iamVjdDNEW10gPVxyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmdldE9iamVjdHNCeVVzZXJEYXRhUHJvcCgnc2VsZWN0aW9uJywgJ25vZGVJZCcsIHRoaXMuYmFzZUVsZW1lbnROb2RlSWQpO1xyXG4gICAgICBjb25zdCBpdGVtOiBJdGVtID0gT2JqZWN0VXRpbHMuR2V0UGFyZW50SXRlbShlbGVtZW50KTtcclxuICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50U2VydmljZS5tb3ZlRWxlbWVudFRvTmV3UG9zaXRpb24oXHJcbiAgICAgICAgICBpdGVtLm1ldGFkYXRhLml0ZW1JZCwgZWxlbWVudCwgd29ybGRUb0xvY2FsUG9zLCBiYXNlRWxlbWVudC5sZW5ndGggPiAwID8gYmFzZUVsZW1lbnRbMF0gOiBudWxsKTtcclxuICAgICAgICAvLyB0aGlzLl9zYXZlRWxlbWVudENvbm5lY3RvcihlbGVtZW50LCBwb3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZXNldCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9wbGFjZWRBZGRhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fYWRqdXN0YWJsZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2FkZGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICAvLyB0aGlzLl9wcmVwYXJlVGhlU2VsZWN0aW9ucygpO1xyXG4gICAgLy8gdG9kbzogY2hlY2sgdGhpc1xyXG4gICAgLy8gdGhpcy5fZWxlbWVudFNlcnZpY2UucmVtb3ZlRWxlbWVudCh0aGlzLmFjdGl2ZUluc3RhbmNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG1hdGVyaWFsSWQgb2YgdGhlIHBhcmVudCB1cCB0aGUgdHJlZSB1bnRpbCBwcmVzZW50aW9ubGV2ZWwgMSBpcyByZWFjaGVkXHJcbiAgICogQHBhcmFtIGlkXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRNYXRlcmlhbElkRnJvbVBhcmVudChpZDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGlkeDogbnVtYmVyID0gdGhpcy5zZWxlY3Rpb25zLmZpbmRJbmRleChzID0+IHMubm9kZSA9PT0gaWQpO1xyXG4gICAgbGV0IGN1cnJlbnRMZXZlbDogbnVtYmVyID0gOTk5O1xyXG4gICAgaWYgKGlkeCA+IC0xKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSBpZHg7IGkgPiAwOyBpLS0pIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbnNbaV07XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA+PSBjdXJyZW50TGV2ZWwpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjdXJyZW50TGV2ZWwgPSBzZWxlY3Rpb24ucHJlc2VudGF0aW9uTGV2ZWw7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbi5oZGVjb0dhbWVPYmplY3QpIHtcclxuICAgICAgICAgIHJldHVybiBzZWxlY3Rpb24uaGRlY29HYW1lT2JqZWN0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ByZXBhcmVUaGVTZWxlY3Rpb25zKGluc3RhbmNlSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMuc2VsZWN0aW9ucy5zbGljZSgpO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uT2ZBcnRpY2xlOiBTZWxlY3Rpb24gPSBzZWxlY3Rpb25zLmZpbmQocyA9PiBzLm5vZGVUeXBlID09PSBOb2RlVHlwZS5BcnRpY2xlKTtcclxuICAgIGNvbnN0IGFkanVzdGFibGVTZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IHNlbGVjdGlvbnMuZmlsdGVyKHMgPT4gcy5hZGRBZGp1c3QgPT09ICcyJyk7XHJcbiAgICBjb25zdCBpc0FydGljbGVXaXRoTWF0ZXJpYWw6IGJvb2xlYW4gPVxyXG4gICAgICBhZGp1c3RhYmxlU2VsZWN0aW9ucy5sZW5ndGggPT09IDAgJiZcclxuICAgICAgc2VsZWN0aW9uT2ZBcnRpY2xlLmdhbWVPYmplY3QgJiZcclxuICAgICAgc2VsZWN0aW9uT2ZBcnRpY2xlLmdhbWVPYmplY3QubGVuZ3RoID4gMDtcclxuICAgIC8vIGdldCBnZW5lcmljIHZhcmlhdGlvbnNcclxuICAgIGNvbnN0IGdsb2JhbFZhcmlhdGlvbnM6IERlY29Ob2RlW10gPSB0aGlzLnNlbGVjdGlvbnNcclxuICAgICAgLmZpbHRlcihzID0+IChzLmdlbmVyaWMgfHwgYWRqdXN0YWJsZVNlbGVjdGlvbnMubGVuZ3RoID09PSAxKSAmJiAocy5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbiAmJiAhcy5kZWNvTm9kZS50eXBlKVxyXG4gICAgICAubWFwKCh2YWx1ZTogU2VsZWN0aW9uLCBpbmRleDogbnVtYmVyLCBhcnJheTogU2VsZWN0aW9uW10pID0+IHtcclxuICAgICAgICAvLyBmaW5kIHNlbGVjdGlvbiBvZiB2YXJpYXRpb25cclxuICAgICAgICBjb25zdCBzZWw6IFNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5hcnROb2RlSWREZWNvID09PSAodmFsdWUuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24ucGFyZW50SWQpO1xyXG4gICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOciA9IHNlbC5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uLm1hdGVyaWFsSWQgPSB0aGlzLl9nZXRNYXRlcmlhbElkRnJvbVBhcmVudCh2YWx1ZS5ub2RlKTtcclxuICAgICAgICByZXR1cm4gKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uO1xyXG4gICAgICB9KTtcclxuICAgIC8vIGNvbW1lbnRlZCBvdXQgZm9yIHRoZSBtb21lbnRcclxuICAgIC8vIGdsb2JhbFZhcmlhdGlvbnMuZm9yRWFjaChnID0+IHtcclxuICAgIC8vICAgY29uc3QgcGFyZW50SWR4ID0gc2VsZWN0aW9ucy5maW5kSW5kZXgocyA9PiBzLmRlY29Ob2RlICYmIHMuZGVjb05vZGUuaWQgPT09IGcucGFyZW50SWQpO1xyXG4gICAgLy8gICBpZiAocGFyZW50SWR4KSB7IC8vIHJlbW92ZSBwYXJlbnQgc2VsZWN0aW9uXHJcbiAgICAvLyAgICAgc2VsZWN0aW9ucy5zcGxpY2UocGFyZW50SWR4LCAxKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICBjb25zdCBpZHggPSBzZWxlY3Rpb25zLmZpbmRJbmRleChzID0+IHMuZGVjb05vZGUgJiYgcy5kZWNvTm9kZS5pZCA9PT0gZy5pZCk7XHJcbiAgICAvLyAgIGlmIChpZHgpIHsgLy8gbW92ZSBnZW5lcmljIHZhcmlhdGlvbnMgdG8gdG9wXHJcbiAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0aW9uc1tpZHhdO1xyXG4gICAgLy8gICAgIHNlbGVjdGlvbnMuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAvLyAgICAgc2VsZWN0aW9ucy51bnNoaWZ0KHNlbGVjdGlvbik7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pO1xyXG5cclxuICAgIGNvbnN0IHVzZWRWYXJpYXRpb25zOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uW10gPSBbXTtcclxuICAgIGxldCBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSBzZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgIGxldCBsYXN0QWRkZWQ6IFNlbGVjdGlvbjtcclxuICAgIGxldCBsYXN0QWRqdXN0YWJsZTogU2VsZWN0aW9uO1xyXG4gICAgbGV0IG5ld1BhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBwcmV2aW91c1ByZXNMZXZlbDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgcG9zaXRpb25pbmc6IGFueTtcclxuICAgIGxldCBvcHRpb25UZXh0OiBzdHJpbmc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gc2VsZWN0aW9uc1tpXTtcclxuICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSkge1xyXG4gICAgICAgIHBvc2l0aW9uaW5nID0gc2VsZWN0aW9uLmhkZWNvUG9zaXRpb25pbmc7XHJcbiAgICAgICAgb3B0aW9uVGV4dCA9IHNlbGVjdGlvbi5xdWVzdGlvbjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID4gcHJldmlvdXNQcmVzTGV2ZWwpIHtcclxuICAgICAgICBzZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZyA9IHNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nIHx8IHBvc2l0aW9uaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb24pIHtcclxuICAgICAgICAgIGNvbnN0IGRlY29Ob2RlID0gc2VsZWN0aW9uLmRlY29Ob2RlO1xyXG4gICAgICAgICAgKGRlY29Ob2RlIGFzIGFueSkub3B0aW9uVGV4dCA9IG9wdGlvblRleHQ7XHJcbiAgICAgICAgICAvLyBmaW5kIHNlbGVjdGlvbiBvZiB2YXJpYXRpb24gYW5kIHNldCBtYXRlcmlhbElkIGluIGNhc2Ugb2YgbXVsdGltYXRlcmlhbFxyXG4gICAgICAgICAgKGRlY29Ob2RlIGFzIGFueSkubWF0ZXJpYWxJZCA9IHRoaXMuX2dldE1hdGVyaWFsSWRGcm9tUGFyZW50KGRlY29Ob2RlLm5vZGVJZCk7XHJcbiAgICAgICAgICBpZiAobGFzdEFkZGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChuZXdQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKChkZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQpIHtcclxuICAgICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsYXN0QWRkZWQudmFyaWF0aW9ucyA9IFtkZWNvTm9kZV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5ld1BhcnQgPSBmYWxzZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChnbG9iYWxWYXJpYXRpb25zUmV3cml0ZSkge1xyXG4gICAgICAgICAgICAgIGdsb2JhbFZhcmlhdGlvbnMubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgICBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGdsb2JhbFZhcmlhdGlvbnMucHVzaChkZWNvTm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBjb25zdCB2YXJpYXRpb246IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24gPSBuZXcgRnVybml0dXJlUGFydFZhcmlhdGlvbigpO1xyXG4gICAgICAgICAgLy8gdmFyaWF0aW9uLkJyYW5kSWQgPSBzZWxlY3Rpb24uZGVjb05vZGUuYnJhbmRJZDtcclxuICAgICAgICAgIC8vIHZhcmlhdGlvbi5EZXNjcmlwdGlvbiA9IHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZTtcclxuICAgICAgICAgIC8vIHZhcmlhdGlvbi5NYXRlcmlhbElkID0gKHNlbGVjdGlvbi5kZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQ7XHJcbiAgICAgICAgICAvLyB2YXJpYXRpb24uU3VwcGxpZXJBcnRpY2xlTnIgPSAoc2VsZWN0aW9uLmRlY29Ob2RlIGFzIGFueSkuc3VwcGxpZXJBcnRpY2xlTnI7XHJcbiAgICAgICAgICAvLyB1c2VkVmFyaWF0aW9ucy5wdXNoKHZhcmlhdGlvbik7XHJcbiAgICAgICAgfSBlbHNlIGlmICgoc2VsZWN0aW9uLmRlY29Ob2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5QYXJ0ICYmXHJcbiAgICAgICAgICB0eXBlb2Ygc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lID09PSAnc3RyaW5nJyAmJlxyXG4gICAgICAgICAgc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lLmxlbmd0aCkgfHwgKGlzQXJ0aWNsZVdpdGhNYXRlcmlhbCkpIHtcclxuICAgICAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUua2luZCA9PT0gRGVjb05vZGVLaW5kLkFkanVzdGFibGUgfHwgKGlzQXJ0aWNsZVdpdGhNYXRlcmlhbCkpIHtcclxuICAgICAgICAgICAgc2VsZWN0aW9uLnZhcmlhdGlvbnMgPSBnbG9iYWxWYXJpYXRpb25zO1xyXG4gICAgICAgICAgICB0aGlzLl9hZGp1c3RhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgIGlmICghbGFzdEFkZGVkIHx8IChsYXN0QWRkZWQubm9kZUlkICE9PSBzZWxlY3Rpb24ubm9kZUlkIHx8IGxhc3RBZGRlZC5ub2RlICE9PSBzZWxlY3Rpb24ubm9kZSkpIHtcclxuICAgICAgICAgICAgICBuZXdQYXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsYXN0QWRkZWQgPSBzZWxlY3Rpb247XHJcbiAgICAgICAgICAgIGxhc3RBZGp1c3RhYmxlID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24uZGVjb05vZGUua2luZCA9PT0gRGVjb05vZGVLaW5kLkFkZGFibGUpIHtcclxuICAgICAgICAgICAgc2VsZWN0aW9uLnZhcmlhdGlvbnMgPSBsYXN0QWRqdXN0YWJsZSA/IGxhc3RBZGp1c3RhYmxlLnZhcmlhdGlvbnMgOiBnbG9iYWxWYXJpYXRpb25zO1xyXG4gICAgICAgICAgICBpZiAobGFzdEFkanVzdGFibGUpIHtcclxuICAgICAgICAgICAgICBsYXN0QWRqdXN0YWJsZS5hZGRhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fYWRkYWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCAobGFzdEFkZGVkLm5vZGVJZCAhPT0gc2VsZWN0aW9uLm5vZGVJZCB8fCBsYXN0QWRkZWQubm9kZSAhPT0gc2VsZWN0aW9uLm5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgbmV3UGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFzdEFkZGVkID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBwcmV2aW91c1ByZXNMZXZlbCA9IHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbDtcclxuICAgIH1cclxuICAgIC8vIHRoaXMuX3Vwc2VydEZ1cm5pdHVyZSh0aGlzLmFjdGl2ZUluc3RhbmNlLFxyXG4gICAgLy8gICB7VmFyaWF0aW9uczogdXNlZFZhcmlhdGlvbnN9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEFkanVzdGFibGVzKGNoZWNrR2FtZU9iamVjdDogYm9vbGVhbiA9IHRydWUsIGNoZWNrVHlwZTogYm9vbGVhbiA9IHRydWUpOiBTZWxlY3Rpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25zLmZpbHRlcihzID0+IHtcclxuICAgICAgY29uc3Qgbm9kZTogRGVjb05vZGUgPSBzLmRlY29Ob2RlO1xyXG4gICAgICByZXR1cm4gbm9kZSAmJiAoY2hlY2tHYW1lT2JqZWN0ID8gbm9kZS5nYW1lT2JqZWN0TmFtZSA6IHRydWUpICYmIChjaGVja1R5cGUgPyBub2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5QYXJ0IDogdHJ1ZSkgJiYgbm9kZS5raW5kID09PSBEZWNvTm9kZUtpbmQuQWRqdXN0YWJsZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0VmFyaWF0aW9ucygpOiBhbnlbXSB7XHJcbiAgICBpZiAodGhpcy5faU9uZS5kZWNvTm9kZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9pT25lLmRlY29Ob2Rlcy5maWx0ZXIoKGRlY286IERlY29Ob2RlKSA9PiB7XHJcbiAgICAgIHJldHVybiBkZWNvLnR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb247XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZUFkanVzdGFibGUoaXRlbTogSXRlbSwgYWRqOiBTZWxlY3Rpb24pOiBDdXN0b21PYmplY3QzRCB7XHJcbiAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlID8gdGhpcy5mdWxsM0RPYmplY3RUb1VzZS5nZXRPYmplY3RCeU5hbWUoYWRqLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lIHx8IGFkai5nYW1lT2JqZWN0KSA6IG51bGw7XHJcbiAgICBpZiAoIW9iaikge1xyXG4gICAgICAvLyBpbiBjYXNlIG9mIGdsYiBmaWxlcywgdGhlIGltcG9ydGVyIHJlbW92ZXMgZG90cyBmcm9tIG5hbWVzXHJcbiAgICAgIGNvbnN0IG5hbWUgPSBhZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUucmVwbGFjZSgvWy5dL2csICcnKTtcclxuICAgICAgb2JqID0gdGhpcy5mdWxsM0RPYmplY3RUb1VzZSA/IHRoaXMuZnVsbDNET2JqZWN0VG9Vc2UuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpIDogbnVsbDtcclxuICAgICAgaWYgKCFvYmopIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYE5vIG9iamVjdCB3aXRoIG5hbWUgJHthZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWV9IGZvdW5kIWApO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgYWRqdXN0YWJsZTogYW55ID0gb2JqLmNsb25lKCk7XHJcbiAgICBhZGp1c3RhYmxlLm5hbWUgPSB0aGlzLl9jcmVhdGVVbmlxdWVOYW1lKGl0ZW0sIG9iaik7XHJcbiAgICBhZGp1c3RhYmxlLnVzZXJEYXRhLnNlbGVjdGlvbiA9IGFkajtcclxuICAgIGFkanVzdGFibGUucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgYWRqdXN0YWJsZS50cmF2ZXJzZShjID0+IHtcclxuICAgICAgYy52aXNpYmxlID0gIWMubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2NfJyk7XHJcbiAgICB9KTtcclxuICAgIGl0ZW0uYWRkQ2hpbGQoYWRqdXN0YWJsZSk7XHJcbiAgICAvLyB0aGUgb2JqZWN0IGJlaW5nIGFkZGVkIHRvIHRoZSBjdXN0b21GbG9vckdyb3VwIGlzIGJlaW5nIHJlY3JlYXRlZCBzbyB3ZSBsb29zZSB0aGUgcmVmZXJlbmNlXHJcbiAgICAvLyB0aGVyZWZvciB3ZSBuZWVkIHRvIHJldHJpZXZlIHRoZSBjcmVhdGVkIG9iamVjdCBhZ2FpblxyXG4gICAgYWRqdXN0YWJsZSA9IGl0ZW0uZ2V0T2JqZWN0QnlOYW1lKGFkanVzdGFibGUubmFtZSk7XHJcbiAgICB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlcy5wdXNoKGFkanVzdGFibGUpO1xyXG4gICAgcmV0dXJuIGFkanVzdGFibGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVBZGRhYmxlKGl0ZW06IEl0ZW0sIGFkZDogU2VsZWN0aW9uLCBwYXJ0Mj86IGFueSwgcGFydDE/OiBhbnkpOiBDdXN0b21PYmplY3QzRCB7XHJcbiAgICBjb25zdCBvYmo6IGFueSA9IHRoaXMuZnVsbDNET2JqZWN0VG9Vc2UuZ2V0T2JqZWN0QnlOYW1lKGFkZC5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZSk7XHJcbiAgICBpZiAoIW9iaikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIC8vIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gdGhpcy5fZ2V0U2VsZWN0aW9uRnJvbUlkKGFkai5hcnROb2RlSWREZWNvKTtcclxuICAgIGNvbnN0IGFkZGFibGU6IGFueSA9IG9iai5jbG9uZSgpO1xyXG4gICAgYWRkYWJsZS5uYW1lID0gdGhpcy5fY3JlYXRlVW5pcXVlTmFtZShpdGVtLCBvYmopO1xyXG4gICAgYWRkYWJsZS51c2VyRGF0YS5zZWxlY3Rpb24gPSBhZGQ7XHJcbiAgICBhZGRhYmxlLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgIGFkZGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICBpZiAocGFydDEgJiYgcGFydDIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3BsYWNlQWRkYWJsZShpdGVtLCBhZGRhYmxlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBhZGRhYmxlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcGxhY2VBZGRhYmxlKGl0ZW06IEl0ZW0sIGFkZDogYW55KTogQ3VzdG9tT2JqZWN0M0Qge1xyXG4gICAgaXRlbS5hZGRDaGlsZChhZGQpO1xyXG4gICAgY29uc3QgYWRkYWJsZTogQ3VzdG9tT2JqZWN0M0QgPSBpdGVtLmdldE9iamVjdEJ5TmFtZShhZGQubmFtZSkgYXMgQ3VzdG9tT2JqZWN0M0Q7XHJcbiAgICB0aGlzLl9wbGFjZWRBZGRhYmxlcy5wdXNoKGFkZGFibGUpO1xyXG4gICAgcmV0dXJuIGFkZGFibGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVVbmlxdWVOYW1lKGl0ZW06IEl0ZW0sIG9iajogT2JqZWN0M0QpOiBzdHJpbmcge1xyXG4gICAgbGV0IGl0ZXJhdGlvbiA9IDA7XHJcbiAgICBsZXQgbmFtZSA9IGAke2l0ZW0ubmFtZX1fJHtvYmoubmFtZX1gO1xyXG4gICAgbGV0IGV4aXN0aW5nT2JqID0gaXRlbS5nZXRPYmplY3RCeU5hbWUobmFtZSk7XHJcbiAgICB3aGlsZSAoZXhpc3RpbmdPYmopIHtcclxuICAgICAgaXRlcmF0aW9uKys7XHJcbiAgICAgIG5hbWUgPSBgJHtpdGVtLm5hbWV9XyR7b2JqLm5hbWV9YCArIChpdGVyYXRpb24gIT09IDAgPyAoJ18nICsgaXRlcmF0aW9uKSA6ICcnKTtcclxuICAgICAgZXhpc3RpbmdPYmogPSBpdGVtLmdldE9iamVjdEJ5TmFtZShuYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuYW1lO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcGxhY2VBZGRhYmxlcyhpdGVtOiBJdGVtKTogdm9pZCB7XHJcbiAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLnVzZXJEYXRhLmhhc093blByb3BlcnR5KCdzZWxlY3Rpb24nKSAmJiB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5zZWxlY3Rpb24pIHtcclxuICAgICAgICBjb25zdCBhZGp1c3RhYmxlU2VsZWN0aW9uOiBTZWxlY3Rpb24gPSB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5zZWxlY3Rpb247XHJcbiAgICAgICAgaWYgKGFkanVzdGFibGVTZWxlY3Rpb24pIHtcclxuICAgICAgICAgIGNvbnN0IGxlbmE6IG51bWJlciA9IGFkanVzdGFibGVTZWxlY3Rpb24uYWRkYWJsZXMubGVuZ3RoO1xyXG4gICAgICAgICAgbGV0IGNvbkFkZGFibGU6IGFueTtcclxuICAgICAgICAgIGZvciAobGV0IGlhID0gMDsgaWEgPCBsZW5hOyBpYSsrKSB7XHJcbiAgICAgICAgICAgIFNjZW5lM0RVdGlsLlRyeVNlbGVjdG9yQ29ubmVjdGlvbih0aGlzLnNjZW5lLFxyXG4gICAgICAgICAgICAgIGl0ZW0sIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLCBhZGp1c3RhYmxlU2VsZWN0aW9uLmFkZGFibGVzW2lhXSwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgKGFkZCwgcGFydDI/LCBwYXJ0MT8pID0+IHRoaXMuX2NyZWF0ZUFkZGFibGUoaXRlbSwgYWRkLCBwYXJ0MiwgcGFydDEpKTtcclxuICAgICAgICAgICAgaWYgKGNvbkFkZGFibGUpIHtcclxuICAgICAgICAgICAgICBTY2VuZTNEVXRpbC5UcnlTZWxlY3RvckNvbm5lY3Rpb24odGhpcy5zY2VuZSxcclxuICAgICAgICAgICAgICAgIGl0ZW0sIGNvbkFkZGFibGUsIGFkanVzdGFibGVTZWxlY3Rpb24uYWRkYWJsZXNbaWFdLCBmYWxzZSxcclxuICAgICAgICAgICAgICAgIChhZGQsIHBhcnQyPywgcGFydDE/KSA9PiB0aGlzLl9jcmVhdGVBZGRhYmxlKGl0ZW0sIGFkZCwgcGFydDIsIHBhcnQxKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uQWRkYWJsZSA9IHRoaXMuX3BsYWNlZEFkZGFibGVzW3RoaXMuX3BsYWNlZEFkZGFibGVzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfbG9hZFZhcmlhdGlvbnMoaXRlbTogSXRlbSwgaW5zdGFuY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMudXNlVmFyaWF0aW9uT25QYXJ0KSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuX3ZhcmlhdGlvblNlcnZpY2UubG9hZFBhcnQodGhpcy5fYWRqdXN0YWJsZXMsIGluc3RhbmNlSWQsIGl0ZW0sIHRydWUpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5fdmFyaWF0aW9uU2VydmljZS5sb2FkVmFyaWF0aW9uKHRoaXMuX2FkanVzdGFibGVzLCBpbnN0YW5jZUlkLCBpdGVtLCB0cnVlKTtcclxuICAgIGF3YWl0IHRoaXMuX3ZhcmlhdGlvblNlcnZpY2UubG9hZFZhcmlhdGlvbih0aGlzLl9hZGRhYmxlcywgaW5zdGFuY2VJZCwgaXRlbSwgdHJ1ZSk7XHJcbiAgICB0aGlzLl92YXJpYXRpb25TZXJ2aWNlLmNsZWFyQ2FjaGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Nob3dXYXJuaW5nKGRhdGE6IEluZm9EaWFsb2dEYXRhKSB7XHJcbiAgICBjb25zdCBkaWFsb2dEYXRhOiBJbmZvRGlhbG9nRGF0YSA9IHtcclxuICAgICAgdGl0bGU6IHRoaXMuX2RpY3Rpb25hcnlTZXJ2aWNlLmdldChkYXRhLnRpdGxlKSwgbWVzc2FnZTogdGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuZ2V0KGRhdGEubWVzc2FnZSlcclxuICAgIH07XHJcbiAgICB0aGlzLl9kaWFsb2cub3BlbihJbmZvRGlhbG9nQ29tcG9uZW50LCB7ZGF0YTogZGlhbG9nRGF0YX0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJlcGFyZVN0YW5kQWxvbmUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb2xsaXNpb25NYW5hZ2VyLmNoZWNrQ29sbGlzaW9ucyA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLmNhbWVyYVBvc2l0aW9uRml4ZWQpIHtcclxuICAgICAgdGhpcy5fY2FtZXJhU2VydmljZS5sb2NrQ2FtZXJhKCk7XHJcbiAgICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UuZGlzYWJsZVJvdGF0ZUhvcml6b250YWwoKTtcclxuICAgICAgLy8gdGhpcy5fY2FtZXJhU2VydmljZS5kaXNhYmxlUm90YXRlVmVydGljYWwoKTtcclxuICAgICAgdGhpcy5fY2FtZXJhU2VydmljZS5kaXNhYmxlUGFuKCk7XHJcbiAgICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UuY29udHJvbHMudGFyZ2V0ID0gbmV3IFZlY3RvcjMoMCwgNTAsIDApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc2NlbmVFdmVudFNlcnZpY2Uucm90YXRlTm9EcmFnID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ByZWxvYWRNYXRlcmlhbChhbnN3ZXI6IEFuc3dlcik6IHZvaWQge1xyXG4gICAgaWYgKGFuc3dlci5lbGVtZW50VHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbiAmJiBhbnN3ZXIuZ2FtZU9iamVjdCkge1xyXG4gICAgICBjb25zdCB2YXJpYXRpb25EZWNvTm9kZTogRGVjb05vZGUgPSBuZXcgRGVjb05vZGUoKTtcclxuICAgICAgdmFyaWF0aW9uRGVjb05vZGUuZ2FtZU9iamVjdE5hbWUgPSBhbnN3ZXIuZ2FtZU9iamVjdDtcclxuICAgICAgY29uc3QgYWRqdXN0YWJsZXNDbG9uZTogU2VsZWN0aW9uW10gPSB0aGlzLl9hZGp1c3RhYmxlcy5tYXAocyA9PiBPYmplY3QuYXNzaWduKHt9LCBzKSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5fZ2VuZXJpY1NlbGVjdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwKSB7XHJcbiAgICAgICAgICBhZGp1c3RhYmxlc0Nsb25lLmZvckVhY2goKHNlbGVjdGlvbjogU2VsZWN0aW9uKSA9PiBzZWxlY3Rpb24udmFyaWF0aW9ucyA9IFt2YXJpYXRpb25EZWNvTm9kZV0pO1xyXG4gICAgICAgICAgdGhpcy5fdmFyaWF0aW9uQ2FjaGVTZXJ2aWNlLnByZWxvYWRWYXJpYXRpb25zQXN5bmMoYWRqdXN0YWJsZXNDbG9uZVswXS5zY2hlbWEsIFt2YXJpYXRpb25EZWNvTm9kZS5nYW1lT2JqZWN0TmFtZV0sIHRoaXMuYXJ0aWNsZUFzc2V0UGF0aClcclxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3ZhcmlhdGlvblNlcnZpY2UubG9hZFZhcmlhdGlvbihhZGp1c3RhYmxlc0Nsb25lLCAnJywgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCwgdHJ1ZSlcclxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fYWRqdXN0YWJsZXMuZm9yRWFjaCgoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHNlbGVjdGlvbi52YXJpYXRpb25zID0gW3ZhcmlhdGlvbkRlY29Ob2RlXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3Rpb246IFNlbGVjdGlvbiA9IE9iamVjdFV0aWxzLkdldFNlbGVjdGlvbkZyb21TZWxlY3RlZE9iamVjdCh0aGlzLl9hY3RpdmVDaGlsZEVsZW1lbnQpO1xyXG4gICAgICAgIGlmIChjdXJyZW50U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Gcm9tQWRqdXN0YWJsZXM6IFNlbGVjdGlvbiA9IGFkanVzdGFibGVzQ2xvbmVcclxuICAgICAgICAgICAgICAuZmluZCgoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHNlbGVjdGlvbi5ub2RlSWQgPT09IGN1cnJlbnRTZWxlY3Rpb24ubm9kZUlkKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkZyb21BZGp1c3RhYmxlcykge1xyXG4gICAgICAgICAgICAgIHNlbGVjdGlvbkZyb21BZGp1c3RhYmxlcy52YXJpYXRpb25zID0gW3ZhcmlhdGlvbkRlY29Ob2RlXTtcclxuICAgICAgICAgICAgICB0aGlzLl92YXJpYXRpb25DYWNoZVNlcnZpY2UucHJlbG9hZFZhcmlhdGlvbnNBc3luYyhhZGp1c3RhYmxlc0Nsb25lWzBdLnNjaGVtYSwgW3ZhcmlhdGlvbkRlY29Ob2RlLmdhbWVPYmplY3ROYW1lXSwgdGhpcy5hcnRpY2xlQXNzZXRQYXRoKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl92YXJpYXRpb25TZXJ2aWNlLmxvYWRWYXJpYXRpb24oYWRqdXN0YWJsZXNDbG9uZSwgJycsIHRoaXMuY3VycmVudEN1c3RvbUZsb29yR3JvdXAsIHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5fc2NlbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uRnJvbUFkanVzdGFibGVzOiBTZWxlY3Rpb24gPSB0aGlzLl9hZGp1c3RhYmxlc1xyXG4gICAgICAgICAgICAgIC5maW5kKChzZWxlY3Rpb246IFNlbGVjdGlvbikgPT4gc2VsZWN0aW9uLm5vZGVJZCA9PT0gY3VycmVudFNlbGVjdGlvbi5ub2RlSWQpO1xyXG4gICAgICAgICAgICBzZWxlY3Rpb25Gcm9tQWRqdXN0YWJsZXMudmFyaWF0aW9ucyA9IFt2YXJpYXRpb25EZWNvTm9kZV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==