angular-three-soba 2.0.0-beta.4 → 2.0.0-beta.40

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 (323) hide show
  1. package/abstractions/billboard/billboard.d.ts +12 -8
  2. package/abstractions/detailed/detailed.d.ts +26 -0
  3. package/abstractions/edges/edges.d.ts +24 -12
  4. package/abstractions/grid/grid.d.ts +42 -51
  5. package/abstractions/index.d.ts +1 -7
  6. package/abstractions/text/text.d.ts +10 -4
  7. package/abstractions/text-3d/text-3d.d.ts +51 -41
  8. package/cameras/camera/camera-content.d.ts +1 -1
  9. package/cameras/camera/camera.d.ts +16 -13
  10. package/cameras/cube-camera/cube-camera.d.ts +49 -23
  11. package/cameras/index.d.ts +0 -1
  12. package/cameras/orthographic-camera/orthographic-camera.d.ts +29 -18
  13. package/cameras/perspective-camera/perspective-camera.d.ts +10 -1
  14. package/controls/orbit-controls/orbit-controls.d.ts +34 -15
  15. package/esm2022/abstractions/billboard/billboard.mjs +36 -33
  16. package/esm2022/abstractions/detailed/detailed.mjs +64 -0
  17. package/esm2022/abstractions/edges/edges.mjs +58 -63
  18. package/esm2022/abstractions/grid/grid.mjs +140 -110
  19. package/esm2022/abstractions/index.mjs +2 -8
  20. package/esm2022/abstractions/text/text.mjs +123 -122
  21. package/esm2022/abstractions/text-3d/text-3d.mjs +120 -115
  22. package/esm2022/cameras/camera/camera-content.mjs +6 -6
  23. package/esm2022/cameras/camera/camera.mjs +48 -42
  24. package/esm2022/cameras/cube-camera/cube-camera.mjs +120 -100
  25. package/esm2022/cameras/index.mjs +1 -2
  26. package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +78 -75
  27. package/esm2022/cameras/perspective-camera/perspective-camera.mjs +25 -26
  28. package/esm2022/controls/orbit-controls/orbit-controls.mjs +109 -85
  29. package/esm2022/gizmos/angular-three-soba-gizmos.mjs +5 -0
  30. package/esm2022/gizmos/gizmo-helper/gizmo-helper.mjs +198 -0
  31. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/constants.mjs +31 -0
  32. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +93 -0
  33. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +151 -0
  34. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-input.mjs +66 -0
  35. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +71 -0
  36. package/esm2022/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +195 -0
  37. package/esm2022/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +272 -0
  38. package/esm2022/gizmos/index.mjs +4 -0
  39. package/esm2022/loaders/gltf-loader/gltf-loader.mjs +14 -9
  40. package/esm2022/loaders/loader/loader.mjs +92 -87
  41. package/esm2022/loaders/progress/progress.mjs +31 -30
  42. package/esm2022/loaders/texture-loader/texture-loader.mjs +20 -15
  43. package/esm2022/materials/index.mjs +2 -1
  44. package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +60 -51
  45. package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +239 -255
  46. package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +99 -97
  47. package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +164 -144
  48. package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +44 -42
  49. package/esm2022/materials/point-material/point-material.mjs +50 -0
  50. package/esm2022/misc/animations/animations.mjs +28 -23
  51. package/esm2022/misc/bake-shadows/bake-shadows.mjs +13 -13
  52. package/esm2022/misc/caustics/caustics.mjs +387 -0
  53. package/esm2022/misc/decal/decal.mjs +187 -0
  54. package/esm2022/misc/depth-buffer/depth-buffer.mjs +41 -37
  55. package/esm2022/misc/example/example.mjs +161 -0
  56. package/esm2022/misc/fbo/fbo.mjs +42 -36
  57. package/esm2022/misc/html/html-wrapper.mjs +478 -0
  58. package/esm2022/misc/html/html.mjs +305 -0
  59. package/esm2022/misc/index.mjs +10 -1
  60. package/esm2022/misc/sampler/sampler.mjs +132 -0
  61. package/esm2022/misc/shadow/shadow.mjs +111 -0
  62. package/esm2022/misc/stats-gl/stats-gl.mjs +61 -0
  63. package/esm2022/misc/trail/trail.mjs +204 -0
  64. package/esm2022/misc/trail-texture/inject-trail-texture.mjs +17 -0
  65. package/esm2022/misc/trail-texture/trail-texture.mjs +106 -0
  66. package/esm2022/modifiers/angular-three-soba-modifiers.mjs +5 -0
  67. package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +64 -0
  68. package/esm2022/modifiers/index.mjs +2 -0
  69. package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +44 -0
  70. package/esm2022/performances/adaptive-events/adaptive-events.mjs +27 -0
  71. package/esm2022/performances/angular-three-soba-performances.mjs +5 -0
  72. package/esm2022/performances/index.mjs +8 -0
  73. package/esm2022/performances/instances/instances.mjs +221 -0
  74. package/esm2022/performances/instances/position-mesh.mjs +52 -0
  75. package/esm2022/performances/points/points-input.mjs +64 -0
  76. package/esm2022/performances/points/points.mjs +327 -0
  77. package/esm2022/performances/points/position-point.mjs +54 -0
  78. package/esm2022/performances/segments/segment-object.mjs +9 -0
  79. package/esm2022/performances/segments/segments.mjs +183 -0
  80. package/esm2022/shaders/blur-pass/blur-pass.mjs +2 -2
  81. package/esm2022/shaders/caustics/caustics-material.mjs +130 -0
  82. package/esm2022/shaders/caustics/caustics-projection-material.mjs +32 -0
  83. package/esm2022/shaders/convolution-material/convolution-material.mjs +3 -2
  84. package/esm2022/shaders/discard-material/discard-material.mjs +1 -1
  85. package/esm2022/shaders/grid-material/grid-material.mjs +30 -14
  86. package/esm2022/shaders/index.mjs +5 -3
  87. package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +42 -41
  88. package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +2 -2
  89. package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +3 -2
  90. package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +7 -4
  91. package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +1 -1
  92. package/esm2022/shaders/shader-material/shader-material.mjs +3 -5
  93. package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +18 -25
  94. package/esm2022/shaders/sparkles-material/sparkles-material.mjs +32 -46
  95. package/esm2022/shaders/spot-light-material/spot-light-material.mjs +8 -7
  96. package/esm2022/shaders/star-field-material/star-field-material.mjs +3 -2
  97. package/esm2022/shaders/wireframe-material/wireframe-material.mjs +247 -0
  98. package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +161 -176
  99. package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +8 -8
  100. package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +129 -129
  101. package/esm2022/staging/backdrop/backdrop.mjs +77 -0
  102. package/esm2022/staging/bb-anchor/bb-anchor.mjs +69 -0
  103. package/esm2022/staging/bounds/bounds.mjs +145 -143
  104. package/esm2022/staging/camera-shake/camera-shake.mjs +86 -80
  105. package/esm2022/staging/center/center.mjs +129 -112
  106. package/esm2022/staging/cloud/cloud.mjs +118 -124
  107. package/esm2022/staging/contact-shadows/contact-shadows.mjs +131 -136
  108. package/esm2022/staging/environment/assets.mjs +12 -12
  109. package/esm2022/staging/environment/environment-cube.mjs +28 -30
  110. package/esm2022/staging/environment/environment-ground.mjs +17 -19
  111. package/esm2022/staging/environment/environment-input.mjs +98 -85
  112. package/esm2022/staging/environment/environment-map.mjs +33 -33
  113. package/esm2022/staging/environment/environment-portal.mjs +75 -97
  114. package/esm2022/staging/environment/environment.mjs +34 -51
  115. package/esm2022/staging/environment/utils.mjs +40 -17
  116. package/esm2022/staging/float/float.mjs +70 -58
  117. package/esm2022/staging/index.mjs +7 -3
  118. package/esm2022/staging/matcap-texture/matcap-texture.mjs +64 -0
  119. package/esm2022/staging/normal-texture/normal-texture.mjs +53 -0
  120. package/esm2022/staging/sky/sky.mjs +85 -80
  121. package/esm2022/staging/sparkles/sparkles.mjs +108 -105
  122. package/esm2022/staging/spot-light/shadow-mesh-input.mjs +63 -0
  123. package/esm2022/staging/spot-light/shadow-mesh.mjs +267 -0
  124. package/esm2022/staging/spot-light/spot-light-input.mjs +67 -58
  125. package/esm2022/staging/spot-light/spot-light.mjs +51 -63
  126. package/esm2022/staging/spot-light/volumetric-mesh.mjs +67 -70
  127. package/esm2022/staging/stage/stage.mjs +305 -290
  128. package/esm2022/staging/stars/stars.mjs +101 -102
  129. package/esm2022/staging/wireframe/wireframe-input.mjs +191 -0
  130. package/esm2022/staging/wireframe/wireframe.mjs +228 -0
  131. package/esm2022/utils/angular-three-soba-utils.mjs +5 -0
  132. package/esm2022/utils/constants.mjs +3 -0
  133. package/esm2022/utils/content/content.mjs +15 -0
  134. package/esm2022/utils/index.mjs +3 -0
  135. package/fesm2022/angular-three-soba-abstractions.mjs +504 -2079
  136. package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
  137. package/fesm2022/angular-three-soba-cameras.mjs +293 -260
  138. package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
  139. package/fesm2022/angular-three-soba-controls.mjs +108 -83
  140. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  141. package/fesm2022/angular-three-soba-gizmos.mjs +1045 -0
  142. package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -0
  143. package/fesm2022/angular-three-soba-loaders.mjs +148 -132
  144. package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
  145. package/fesm2022/angular-three-soba-materials.mjs +656 -588
  146. package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
  147. package/fesm2022/angular-three-soba-misc.mjs +2202 -99
  148. package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
  149. package/fesm2022/angular-three-soba-modifiers.mjs +71 -0
  150. package/fesm2022/angular-three-soba-modifiers.mjs.map +1 -0
  151. package/fesm2022/angular-three-soba-performances.mjs +957 -0
  152. package/fesm2022/angular-three-soba-performances.mjs.map +1 -0
  153. package/fesm2022/angular-three-soba-shaders.mjs +508 -269
  154. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
  155. package/fesm2022/angular-three-soba-staging.mjs +2910 -2573
  156. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  157. package/fesm2022/angular-three-soba-utils.mjs +25 -0
  158. package/fesm2022/angular-three-soba-utils.mjs.map +1 -0
  159. package/gizmos/README.md +3 -0
  160. package/gizmos/gizmo-helper/gizmo-helper.d.ts +73 -0
  161. package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +22 -0
  162. package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +29 -0
  163. package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-input.d.ts +33 -0
  164. package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +10 -0
  165. package/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +40 -0
  166. package/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +30 -0
  167. package/gizmos/index.d.ts +3 -0
  168. package/loaders/gltf-loader/gltf-loader.d.ts +15 -4
  169. package/loaders/loader/loader.d.ts +19 -17
  170. package/loaders/progress/progress.d.ts +1 -1
  171. package/loaders/texture-loader/texture-loader.d.ts +8 -3
  172. package/materials/index.d.ts +1 -0
  173. package/materials/mesh-distort-material/mesh-distort-material.d.ts +25 -15
  174. package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +74 -56
  175. package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +33 -21
  176. package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +55 -39
  177. package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +19 -10
  178. package/materials/point-material/point-material.d.ts +24 -0
  179. package/metadata.json +1 -0
  180. package/misc/animations/animations.d.ts +6 -4
  181. package/misc/caustics/caustics.d.ts +87 -0
  182. package/misc/decal/decal.d.ts +49 -0
  183. package/misc/depth-buffer/depth-buffer.d.ts +2 -2
  184. package/misc/example/example.d.ts +85 -0
  185. package/misc/fbo/fbo.d.ts +2 -2
  186. package/misc/html/html-wrapper.d.ts +559 -0
  187. package/misc/html/html.d.ts +218 -0
  188. package/misc/index.d.ts +9 -0
  189. package/misc/sampler/sampler.d.ts +67 -0
  190. package/misc/shadow/shadow.d.ts +37 -0
  191. package/misc/stats-gl/stats-gl.d.ts +24 -0
  192. package/misc/trail/trail.d.ts +57 -0
  193. package/misc/trail-texture/inject-trail-texture.d.ts +9 -0
  194. package/misc/trail-texture/trail-texture.d.ts +50 -0
  195. package/modifiers/README.md +3 -0
  196. package/modifiers/curve-modifier/curve-modifier.d.ts +23 -0
  197. package/modifiers/index.d.ts +1 -0
  198. package/package.json +36 -18
  199. package/performances/README.md +3 -0
  200. package/performances/adaptive-dpr/adaptive-dpr.d.ts +14 -0
  201. package/{performance/adaptive → performances/adaptive-events}/adaptive-events.d.ts +3 -0
  202. package/performances/index.d.ts +7 -0
  203. package/performances/instances/instances.d.ts +83 -0
  204. package/{performance → performances}/instances/position-mesh.d.ts +1 -1
  205. package/performances/points/points-input.d.ts +32 -0
  206. package/performances/points/points.d.ts +96 -0
  207. package/performances/points/position-point.d.ts +11 -0
  208. package/performances/segments/segment-object.d.ts +7 -0
  209. package/performances/segments/segments.d.ts +128 -0
  210. package/shaders/grid-material/grid-material.d.ts +33 -0
  211. package/shaders/index.d.ts +4 -2
  212. package/shaders/mesh-distort-material/mesh-distort-material.d.ts +173 -6
  213. package/shaders/mesh-transmission-material/mesh-transmission-material.d.ts +1 -1
  214. package/shaders/shader-material/shader-material.d.ts +2 -2
  215. package/shaders/soft-shadow-material/soft-shadow-material.d.ts +10 -1
  216. package/shaders/sparkles-material/sparkles-material.d.ts +13 -0
  217. package/shaders/spot-light-material/spot-light-material.d.ts +11 -2
  218. package/shaders/star-field-material/star-field-material.d.ts +9 -0
  219. package/shaders/wireframe-material/wireframe-material.d.ts +58 -0
  220. package/staging/accumulative-shadows/accumulative-shadows.d.ts +93 -39
  221. package/staging/accumulative-shadows/randomized-lights.d.ts +41 -28
  222. package/staging/backdrop/backdrop.d.ts +30 -0
  223. package/staging/bb-anchor/bb-anchor.d.ts +27 -0
  224. package/staging/bounds/bounds.d.ts +105 -25
  225. package/staging/camera-shake/camera-shake.d.ts +30 -19
  226. package/staging/center/center.d.ts +43 -35
  227. package/staging/cloud/cloud.d.ts +27 -24
  228. package/staging/contact-shadows/contact-shadows.d.ts +43 -30
  229. package/staging/environment/assets.d.ts +9 -9
  230. package/staging/environment/environment-cube.d.ts +9 -5
  231. package/staging/environment/environment-ground.d.ts +7 -7
  232. package/staging/environment/environment-input.d.ts +38 -38
  233. package/staging/environment/environment-map.d.ts +10 -5
  234. package/staging/environment/environment-portal.d.ts +10 -5
  235. package/staging/environment/environment.d.ts +0 -4
  236. package/staging/environment/utils.d.ts +2 -2
  237. package/staging/float/float.d.ts +15 -11
  238. package/staging/index.d.ts +6 -2
  239. package/staging/matcap-texture/matcap-texture.d.ts +13 -0
  240. package/staging/normal-texture/normal-texture.d.ts +16 -0
  241. package/staging/sky/sky.d.ts +28 -21
  242. package/staging/sparkles/sparkles.d.ts +36 -22
  243. package/staging/spot-light/shadow-mesh-input.d.ts +29 -0
  244. package/staging/spot-light/shadow-mesh.d.ts +37 -0
  245. package/staging/spot-light/spot-light-input.d.ts +25 -25
  246. package/staging/spot-light/spot-light.d.ts +35 -15
  247. package/staging/spot-light/volumetric-mesh.d.ts +15 -9
  248. package/staging/stage/stage.d.ts +89 -65
  249. package/staging/stars/stars.d.ts +28 -17
  250. package/staging/wireframe/wireframe-input.d.ts +65 -0
  251. package/staging/wireframe/wireframe.d.ts +28 -0
  252. package/utils/README.md +3 -0
  253. package/utils/constants.d.ts +1 -0
  254. package/utils/content/content.d.ts +8 -0
  255. package/utils/index.d.ts +2 -0
  256. package/web-types.json +1 -0
  257. package/abstractions/catmull-rom-line/catmull-rom-line.d.ts +0 -25
  258. package/abstractions/cubic-bezier-line/cubic-bezier-line.d.ts +0 -25
  259. package/abstractions/gizmo-helper/gizmo-helper.d.ts +0 -34
  260. package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +0 -22
  261. package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +0 -30
  262. package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +0 -32
  263. package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +0 -14
  264. package/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +0 -47
  265. package/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +0 -40
  266. package/abstractions/line/line-input.d.ts +0 -42
  267. package/abstractions/line/line.d.ts +0 -35
  268. package/abstractions/quadratic-bezier-line/quadratic-bezier-line.d.ts +0 -23
  269. package/esm2022/abstractions/catmull-rom-line/catmull-rom-line.mjs +0 -131
  270. package/esm2022/abstractions/cubic-bezier-line/cubic-bezier-line.mjs +0 -113
  271. package/esm2022/abstractions/gizmo-helper/gizmo-helper.mjs +0 -210
  272. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/constants.mjs +0 -31
  273. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -95
  274. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -155
  275. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -62
  276. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +0 -80
  277. package/esm2022/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -206
  278. package/esm2022/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +0 -273
  279. package/esm2022/abstractions/line/line-input.mjs +0 -113
  280. package/esm2022/abstractions/line/line.mjs +0 -165
  281. package/esm2022/abstractions/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -128
  282. package/esm2022/performance/adaptive/adaptive-dpr.mjs +0 -46
  283. package/esm2022/performance/adaptive/adaptive-events.mjs +0 -31
  284. package/esm2022/performance/angular-three-soba-performance.mjs +0 -5
  285. package/esm2022/performance/detailed/detailed.mjs +0 -61
  286. package/esm2022/performance/index.mjs +0 -7
  287. package/esm2022/performance/instances/instance.mjs +0 -48
  288. package/esm2022/performance/instances/instances.mjs +0 -189
  289. package/esm2022/performance/instances/position-mesh.mjs +0 -52
  290. package/esm2022/performance/stats/stats.mjs +0 -79
  291. package/esm2022/shaders/caustics-material/caustics-material.mjs +0 -128
  292. package/esm2022/shaders/caustics-material/caustics-projection-material.mjs +0 -33
  293. package/esm2022/staging/caustics/caustisc.mjs +0 -384
  294. package/esm2022/staging/spot-light/spot-light-shadow-mesh-input.mjs +0 -57
  295. package/esm2022/staging/spot-light/spot-light-shadow-mesh.mjs +0 -256
  296. package/fesm2022/angular-three-soba-performance.mjs +0 -487
  297. package/fesm2022/angular-three-soba-performance.mjs.map +0 -1
  298. package/performance/README.md +0 -3
  299. package/performance/adaptive/adaptive-dpr.d.ts +0 -8
  300. package/performance/detailed/detailed.d.ts +0 -20
  301. package/performance/index.d.ts +0 -6
  302. package/performance/instances/instance.d.ts +0 -9
  303. package/performance/instances/instances.d.ts +0 -35
  304. package/performance/stats/stats.d.ts +0 -18
  305. package/plugin/generators.json +0 -19
  306. package/plugin/libs/plugin/README.md +0 -11
  307. package/plugin/package.json +0 -9
  308. package/plugin/src/generators/init/compat.d.ts +0 -2
  309. package/plugin/src/generators/init/compat.js +0 -6
  310. package/plugin/src/generators/init/compat.js.map +0 -1
  311. package/plugin/src/generators/init/init.d.ts +0 -7
  312. package/plugin/src/generators/init/init.js +0 -28
  313. package/plugin/src/generators/init/init.js.map +0 -1
  314. package/plugin/src/generators/init/schema.json +0 -6
  315. package/plugin/src/index.d.ts +0 -1
  316. package/plugin/src/index.js +0 -6
  317. package/plugin/src/index.js.map +0 -1
  318. package/staging/caustics/caustisc.d.ts +0 -70
  319. package/staging/spot-light/spot-light-shadow-mesh-input.d.ts +0 -29
  320. package/staging/spot-light/spot-light-shadow-mesh.d.ts +0 -38
  321. /package/{abstractions → gizmos}/gizmo-helper/gizmo-viewcube/constants.d.ts +0 -0
  322. /package/shaders/{caustics-material → caustics}/caustics-material.d.ts +0 -0
  323. /package/shaders/{caustics-material → caustics}/caustics-projection-material.d.ts +0 -0
@@ -1,9 +1,11 @@
1
- import { Component, computed, CUSTOM_ELEMENTS_SCHEMA, effect, EventEmitter, inject, InjectionToken, Input, Output, untracked, } from '@angular/core';
2
- import { extend, injectBeforeRender, injectNgtRef, is, NgtSignalStore, NgtStore, requestAnimationInInjectionContext, } from 'angular-three';
1
+ import { CUSTOM_ELEMENTS_SCHEMA, Component, EventEmitter, Input, Output, computed, effect, forwardRef, untracked, } from '@angular/core';
2
+ import { extend, injectBeforeRender, injectNgtRef, injectNgtStore, is, signalStore, } from 'angular-three';
3
+ import { createInjectionToken } from 'ngxtension/create-injection-token';
3
4
  import * as THREE from 'three';
4
5
  import { Group } from 'three';
5
6
  import * as i0 from "@angular/core";
6
- const isBox3 = (def) => !!def && def.isBox3;
7
+ extend({ Group });
8
+ const isBox3 = (def) => def && def.isBox3;
7
9
  function equals(a, b, eps) {
8
10
  return Math.abs(a.x - b.x) < eps && Math.abs(a.y - b.y) < eps && Math.abs(a.z - b.z) < eps;
9
11
  }
@@ -12,70 +14,62 @@ function damp(v, t, lambda, delta) {
12
14
  v.y = THREE.MathUtils.damp(v.y, t.y, lambda, delta);
13
15
  v.z = THREE.MathUtils.damp(v.z, t.z, lambda, delta);
14
16
  }
15
- export const NGTS_BOUNDS_API = new InjectionToken('NgtsBounds API');
16
- extend({ Group });
17
- class NgtsBounds extends NgtSignalStore {
18
- set damping(damping) {
19
- this.set({ damping });
17
+ export const [injectNgtsBoundsApi, provideNgtsBoundsApi] = createInjectionToken((bounds) => bounds.api, {
18
+ isRoot: false,
19
+ deps: [forwardRef(() => NgtsBounds)],
20
+ });
21
+ export class NgtsBounds {
22
+ set _damping(damping) {
23
+ this.inputs.set({ damping });
20
24
  }
21
- set fit(fit) {
22
- this.set({ fit });
25
+ set _fit(fit) {
26
+ this.inputs.set({ fit });
23
27
  }
24
- set clip(clip) {
25
- this.set({ clip });
28
+ set _clip(clip) {
29
+ this.inputs.set({ clip });
26
30
  }
27
- set observe(observe) {
28
- this.set({ observe });
31
+ set _observe(observe) {
32
+ this.inputs.set({ observe });
29
33
  }
30
- set margin(margin) {
31
- this.set({ margin });
34
+ set _margin(margin) {
35
+ this.inputs.set({ margin });
32
36
  }
33
- set eps(eps) {
34
- this.set({ eps });
37
+ set _eps(eps) {
38
+ this.inputs.set({ eps });
35
39
  }
36
- #store;
37
- #controls;
38
- #camera;
39
- #invalidate;
40
- #size;
41
- #current;
42
- #goal;
43
- #box;
44
- #margin;
45
- #damping;
46
- #fit;
47
- #clip;
48
- #observe;
49
- #count;
50
40
  constructor() {
51
- super({ damping: 6, fit: false, clip: false, observe: false, margin: 1.2, eps: 0.01 });
41
+ this.inputs = signalStore({
42
+ damping: 6,
43
+ fit: false,
44
+ clip: false,
45
+ observe: false,
46
+ margin: 1.2,
47
+ eps: 0.01,
48
+ });
52
49
  this.boundsRef = injectNgtRef();
53
50
  this.fitted = new EventEmitter();
54
- this.#store = inject(NgtStore);
55
- this.#controls = this.#store.select('controls');
56
- this.#camera = this.#store.select('camera');
57
- this.#invalidate = this.#store.select('invalidate');
58
- this.#size = this.#store.select('size');
59
- this.#current = { animating: false, focus: new THREE.Vector3(), camera: new THREE.Vector3(), zoom: 1 };
60
- this.#goal = { focus: new THREE.Vector3(), camera: new THREE.Vector3(), zoom: 1 };
61
- this.#box = new THREE.Box3();
62
- this.#margin = this.select('margin');
63
- this.#damping = this.select('damping');
64
- this.#fit = this.select('fit');
65
- this.#clip = this.select('clip');
66
- this.#observe = this.select('observe');
67
- this.#count = 0;
51
+ this.store = injectNgtStore();
52
+ this.controls = this.store.select('controls');
53
+ this.size = this.store.select('size');
54
+ this.camera = this.store.select('camera');
55
+ this.invalidate = this.store.select('invalidate');
56
+ this.fit = this.inputs.select('fit');
57
+ this.clip = this.inputs.select('clip');
58
+ this.observe = this.inputs.select('observe');
59
+ this.margin = this.inputs.select('margin');
60
+ this.damping = this.inputs.select('damping');
61
+ this.current = { animating: false, focus: new THREE.Vector3(), camera: new THREE.Vector3(), zoom: 1 };
62
+ this.goal = { focus: new THREE.Vector3(), camera: new THREE.Vector3(), zoom: 1 };
63
+ this.box = new THREE.Box3();
68
64
  this.api = computed(() => {
69
- const margin = this.#margin();
70
- const damping = this.#damping();
71
- const camera = this.#camera();
72
- const controls = this.#controls();
73
- const invalidate = this.#invalidate();
74
- const current = this.#current;
75
- const goal = this.#goal;
76
- const box = this.#box;
77
- const ref = () => this.boundsRef.untracked;
78
- const fitted = this.fitted;
65
+ const { box, boundsRef, current, goal, fitted } = this;
66
+ const [camera, margin, controls, invalidate, damping] = [
67
+ this.camera(),
68
+ this.margin(),
69
+ this.controls(),
70
+ this.invalidate(),
71
+ this.damping(),
72
+ ];
79
73
  function getSize() {
80
74
  const size = box.getSize(new THREE.Vector3());
81
75
  const center = box.getCenter(new THREE.Vector3());
@@ -93,11 +87,11 @@ class NgtsBounds extends NgtSignalStore {
93
87
  if (isBox3(object))
94
88
  box.copy(object);
95
89
  else {
96
- const target = object || ref();
97
- if (target) {
98
- target.updateWorldMatrix(true, true);
99
- box.setFromObject(target);
100
- }
90
+ const target = object || boundsRef.nativeElement;
91
+ if (!target)
92
+ return this;
93
+ target.updateWorldMatrix(true, true);
94
+ box.setFromObject(target);
101
95
  }
102
96
  if (box.isEmpty()) {
103
97
  const max = camera.position.length() || 10;
@@ -191,32 +185,41 @@ class NgtsBounds extends NgtSignalStore {
191
185
  controls.update();
192
186
  }
193
187
  }
194
- if (fitted.observed)
188
+ if (fitted.observed) {
195
189
  fitted.emit(this.getSize());
190
+ }
196
191
  invalidate();
197
192
  return this;
198
193
  },
199
194
  };
200
195
  });
201
- this.#preventDragHijacking();
202
- requestAnimationInInjectionContext(() => {
203
- this.#scalePointer();
204
- injectBeforeRender(this.#onBeforeRender.bind(this));
196
+ this.preventDragHijacking();
197
+ this.scalePointer();
198
+ this.beforeRender();
199
+ }
200
+ preventDragHijacking() {
201
+ effect((onCleanup) => {
202
+ const controls = this.controls();
203
+ if (controls) {
204
+ const callback = () => (this.current.animating = false);
205
+ controls.addEventListener('start', callback);
206
+ onCleanup(() => controls.removeEventListener('start', callback));
207
+ }
205
208
  });
206
209
  }
207
- #scalePointer() {
208
- const trigger = computed(() => ({
209
- size: this.#size(),
210
- fit: this.#fit(),
211
- clip: this.#clip(),
212
- observe: this.#observe(),
213
- camera: this.#camera(),
214
- controls: this.#controls(),
215
- }));
210
+ scalePointer() {
211
+ let count = 0;
216
212
  effect(() => {
217
- const { observe, fit, clip } = trigger();
218
- const api = untracked(this.api);
219
- if (observe || this.#count++ === 0) {
213
+ const [observe, fit, clip, api] = [
214
+ this.observe(),
215
+ this.fit(),
216
+ this.clip(),
217
+ untracked(this.api),
218
+ this.camera(),
219
+ this.controls(),
220
+ this.size(),
221
+ ];
222
+ if (observe || count++ === 0) {
220
223
  api.refresh();
221
224
  if (fit)
222
225
  api.fit();
@@ -225,83 +228,82 @@ class NgtsBounds extends NgtSignalStore {
225
228
  }
226
229
  });
227
230
  }
228
- #onBeforeRender({ delta }) {
229
- const { damping, eps } = this.get();
230
- const invalidate = this.#invalidate();
231
- const camera = this.#camera();
232
- const controls = this.#controls();
233
- if (this.#current.animating) {
234
- damp(this.#current.focus, this.#goal.focus, damping, delta);
235
- damp(this.#current.camera, this.#goal.camera, damping, delta);
236
- this.#current.zoom = THREE.MathUtils.damp(this.#current.zoom, this.#goal.zoom, damping, delta);
237
- camera.position.copy(this.#current.camera);
238
- if (is.orthographicCamera(camera)) {
239
- camera.zoom = this.#current.zoom;
240
- camera.updateProjectionMatrix();
241
- }
242
- if (!controls) {
243
- camera.lookAt(this.#current.focus);
244
- }
245
- else {
246
- controls.target.copy(this.#current.focus);
247
- controls.update();
248
- }
249
- invalidate();
250
- if (is.orthographicCamera(camera) && !(Math.abs(this.#current.zoom - this.#goal.zoom) < eps))
251
- return;
252
- if (!is.orthographicCamera(camera) && !equals(this.#current.camera, this.#goal.camera, eps))
253
- return;
254
- if (controls && !equals(this.#current.focus, this.#goal.focus, eps))
255
- return;
256
- this.#current.animating = false;
257
- }
258
- }
259
- #preventDragHijacking() {
260
- effect((onCleanup) => {
261
- const controls = this.#controls();
262
- if (controls) {
263
- const callback = () => (this.#current.animating = false);
264
- controls.addEventListener('start', callback);
265
- onCleanup(() => controls.removeEventListener('start', callback));
231
+ beforeRender() {
232
+ injectBeforeRender(({ delta }) => {
233
+ const [{ damping, eps }, camera, controls, invalidate] = [
234
+ this.inputs.get(),
235
+ this.camera(),
236
+ this.controls(),
237
+ this.invalidate(),
238
+ ];
239
+ if (this.current.animating) {
240
+ damp(this.current.focus, this.goal.focus, damping, delta);
241
+ damp(this.current.camera, this.goal.camera, damping, delta);
242
+ this.current.zoom = THREE.MathUtils.damp(this.current.zoom, this.goal.zoom, damping, delta);
243
+ camera.position.copy(this.current.camera);
244
+ if (is.orthographicCamera(camera)) {
245
+ camera.zoom = this.current.zoom;
246
+ camera.updateProjectionMatrix();
247
+ }
248
+ if (!controls) {
249
+ camera.lookAt(this.current.focus);
250
+ }
251
+ else {
252
+ controls.target.copy(this.current.focus);
253
+ controls.update();
254
+ }
255
+ invalidate();
256
+ if (is.orthographicCamera(camera) && !(Math.abs(this.current.zoom - this.goal.zoom) < eps))
257
+ return;
258
+ if (!is.orthographicCamera(camera) && !equals(this.current.camera, this.goal.camera, eps))
259
+ return;
260
+ if (controls && !equals(this.current.focus, this.goal.focus, eps))
261
+ return;
262
+ this.current.animating = false;
266
263
  }
267
264
  });
268
265
  }
269
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsBounds, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
270
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtsBounds, isStandalone: true, selector: "ngts-bounds", inputs: { boundsRef: "boundsRef", damping: "damping", fit: "fit", clip: "clip", observe: "observe", margin: "margin", eps: "eps" }, outputs: { fitted: "fitted" }, providers: [{ provide: NGTS_BOUNDS_API, useFactory: (bounds) => bounds.api, deps: [NgtsBounds] }], usesInheritance: true, ngImport: i0, template: `
271
- <ngt-group ngtCompound [ref]="boundsRef">
272
- <ng-content />
273
- </ngt-group>
274
- `, isInline: true }); }
266
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.3", ngImport: i0, type: NgtsBounds, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
267
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.3", type: NgtsBounds, isStandalone: true, selector: "ngts-bounds", inputs: { boundsRef: "boundsRef", _damping: ["damping", "_damping"], _fit: ["fit", "_fit"], _clip: ["clip", "_clip"], _observe: ["observe", "_observe"], _margin: ["margin", "_margin"], _eps: ["eps", "_eps"] }, outputs: { fitted: "fitted" }, providers: [provideNgtsBoundsApi()], ngImport: i0, template: `
268
+ <ngt-group [ref]="boundsRef">
269
+ <ng-content />
270
+ </ngt-group>
271
+ `, isInline: true }); }
275
272
  }
276
- export { NgtsBounds };
277
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsBounds, decorators: [{
273
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.3", ngImport: i0, type: NgtsBounds, decorators: [{
278
274
  type: Component,
279
275
  args: [{
280
276
  selector: 'ngts-bounds',
281
277
  standalone: true,
282
278
  template: `
283
- <ngt-group ngtCompound [ref]="boundsRef">
284
- <ng-content />
285
- </ngt-group>
286
- `,
287
- providers: [{ provide: NGTS_BOUNDS_API, useFactory: (bounds) => bounds.api, deps: [NgtsBounds] }],
279
+ <ngt-group [ref]="boundsRef">
280
+ <ng-content />
281
+ </ngt-group>
282
+ `,
283
+ providers: [provideNgtsBoundsApi()],
288
284
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
289
285
  }]
290
286
  }], ctorParameters: function () { return []; }, propDecorators: { boundsRef: [{
291
287
  type: Input
292
- }], damping: [{
293
- type: Input
294
- }], fit: [{
295
- type: Input
296
- }], clip: [{
297
- type: Input
298
- }], observe: [{
299
- type: Input
300
- }], margin: [{
301
- type: Input
302
- }], eps: [{
303
- type: Input
288
+ }], _damping: [{
289
+ type: Input,
290
+ args: [{ alias: 'damping' }]
291
+ }], _fit: [{
292
+ type: Input,
293
+ args: [{ alias: 'fit' }]
294
+ }], _clip: [{
295
+ type: Input,
296
+ args: [{ alias: 'clip' }]
297
+ }], _observe: [{
298
+ type: Input,
299
+ args: [{ alias: 'observe' }]
300
+ }], _margin: [{
301
+ type: Input,
302
+ args: [{ alias: 'margin' }]
303
+ }], _eps: [{
304
+ type: Input,
305
+ args: [{ alias: 'eps' }]
304
306
  }], fitted: [{
305
307
  type: Output
306
308
  }] } });
307
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm91bmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2JvdW5kcy9ib3VuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLE1BQU0sRUFDTixZQUFZLEVBQ1osTUFBTSxFQUNOLGNBQWMsRUFDZCxLQUFLLEVBQ0wsTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsTUFBTSxFQUNOLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osRUFBRSxFQUNGLGNBQWMsRUFDZCxRQUFRLEVBQ1Isa0NBQWtDLEdBRXJDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7O0FBK0I5QixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQVksRUFBcUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUssR0FBa0IsQ0FBQyxNQUFNLENBQUM7QUFFeEYsU0FBUyxNQUFNLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLEdBQVc7SUFDM0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMvRixDQUFDO0FBRUQsU0FBUyxJQUFJLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLE1BQWMsRUFBRSxLQUFh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QyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUNsRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDbEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUNsRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDbEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3lCQUNyRCxDQUFDO3dCQUNGLHVEQUF1RDt3QkFDdkQsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQzt3QkFDL0MsS0FBSyxNQUFNLENBQUMsSUFBSSxRQUFRLEVBQUU7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STtzQkFBaEIsS0FBSztnQkFJTyxPQUFPO3NCQUFuQixLQUFLO2dCQUlPLE1BQU07c0JBQWxCLEtBQUs7Z0JBSU8sR0FBRztzQkFBZixLQUFLO2dCQUlJLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG4gICAgZWZmZWN0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBpbmplY3QsXG4gICAgSW5qZWN0aW9uVG9rZW4sXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFNpZ25hbCxcbiAgICB1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBleHRlbmQsXG4gICAgaW5qZWN0QmVmb3JlUmVuZGVyLFxuICAgIGluamVjdE5ndFJlZixcbiAgICBpcyxcbiAgICBOZ3RTaWduYWxTdG9yZSxcbiAgICBOZ3RTdG9yZSxcbiAgICByZXF1ZXN0QW5pbWF0aW9uSW5JbmplY3Rpb25Db250ZXh0LFxuICAgIHR5cGUgTmd0UmVuZGVyU3RhdGUsXG59IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCB0eXBlIE5ndHNCb3VuZHNTaXplID0ge1xuICAgIGJveDogVEhSRUUuQm94MztcbiAgICBzaXplOiBUSFJFRS5WZWN0b3IzO1xuICAgIGNlbnRlcjogVEhSRUUuVmVjdG9yMztcbiAgICBkaXN0YW5jZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0c0JvdW5kc0FwaSA9IHtcbiAgICBnZXRTaXplOiAoKSA9PiBOZ3RzQm91bmRzU2l6ZTtcbiAgICByZWZyZXNoOiAob2JqZWN0PzogVEhSRUUuT2JqZWN0M0QgfCBUSFJFRS5Cb3gzKSA9PiBOZ3RzQm91bmRzQXBpO1xuICAgIGNsaXA6ICgpID0+IE5ndHNCb3VuZHNBcGk7XG4gICAgZml0OiAoKSA9PiBOZ3RzQm91bmRzQXBpO1xuICAgIHRvOiAoe1xuICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgdGFyZ2V0LFxuICAgIH06IHtcbiAgICAgICAgcG9zaXRpb246IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICAgICAgdGFyZ2V0PzogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIH0pID0+IE5ndHNCb3VuZHNBcGk7XG59O1xuXG50eXBlIENvbnRyb2xzUHJvdG8gPSB7XG4gICAgdXBkYXRlKCk6IHZvaWQ7XG4gICAgdGFyZ2V0OiBUSFJFRS5WZWN0b3IzO1xuICAgIG1heERpc3RhbmNlOiBudW1iZXI7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoZXZlbnQ6IGFueSkgPT4gdm9pZCkgPT4gdm9pZDtcbiAgICByZW1vdmVFdmVudExpc3RlbmVyOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChldmVudDogYW55KSA9PiB2b2lkKSA9PiB2b2lkO1xufTtcblxuY29uc3QgaXNCb3gzID0gKGRlZjogdW5rbm93bik6IGRlZiBpcyBUSFJFRS5Cb3gzID0+ICEhZGVmICYmIChkZWYgYXMgVEhSRUUuQm94MykuaXNCb3gzO1xuXG5mdW5jdGlvbiBlcXVhbHMoYTogVEhSRUUuVmVjdG9yMywgYjogVEhSRUUuVmVjdG9yMywgZXBzOiBudW1iZXIpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoYS54IC0gYi54KSA8IGVwcyAmJiBNYXRoLmFicyhhLnkgLSBiLnkpIDwgZXBzICYmIE1hdGguYWJzKGEueiAtIGIueikgPCBlcHM7XG59XG5cbmZ1bmN0aW9uIGRhbXAodjogVEhSRUUuVmVjdG9yMywgdDogVEhSRUUuVmVjdG9yMywgbGFtYmRhOiBudW1iZXIsIGRlbHRhOiBudW1iZXIpIHtcbiAgICB2LnggPSBUSFJFRS5NYXRoVXRpbHMuZGFtcCh2LngsIHQueCwgbGFtYmRhLCBkZWx0YSk7XG4gICAgdi55ID0gVEhSRUUuTWF0aFV0aWxzLmRhbXAodi55LCB0LnksIGxhbWJkYSwgZGVsdGEpO1xuICAgIHYueiA9IFRIUkVFLk1hdGhVdGlscy5kYW1wKHYueiwgdC56LCBsYW1iZGEsIGRlbHRhKTtcbn1cblxuZXhwb3J0IGNvbnN0IE5HVFNfQk9VTkRTX0FQSSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxTaWduYWw8Tmd0c0JvdW5kc0FwaT4+KCdOZ3RzQm91bmRzIEFQSScpO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndHNCb3VuZHNTdGF0ZSB7XG4gICAgZGFtcGluZzogbnVtYmVyO1xuICAgIGZpdDogYm9vbGVhbjtcbiAgICBjbGlwOiBib29sZWFuO1xuICAgIG9ic2VydmU6IGJvb2xlYW47XG4gICAgbWFyZ2luOiBudW1iZXI7XG4gICAgZXBzOiBudW1iZXI7XG59XG5cbmV4dGVuZCh7IEdyb3VwIH0pO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndHMtYm91bmRzJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZ3QtZ3JvdXAgbmd0Q29tcG91bmQgW3JlZl09XCJib3VuZHNSZWZcIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IC8+XG4gICAgICAgIDwvbmd0LWdyb3VwPlxuICAgIGAsXG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBOR1RTX0JPVU5EU19BUEksIHVzZUZhY3Rvcnk6IChib3VuZHM6IE5ndHNCb3VuZHMpID0+IGJvdW5kcy5hcGksIGRlcHM6IFtOZ3RzQm91bmRzXSB9XSxcbiAgICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNCb3VuZHMgZXh0ZW5kcyBOZ3RTaWduYWxTdG9yZTxOZ3RzQm91bmRzU3RhdGU+IHtcbiAgICBASW5wdXQoKSBib3VuZHNSZWYgPSBpbmplY3ROZ3RSZWY8R3JvdXA+KCk7XG5cbiAgICBASW5wdXQoKSBzZXQgZGFtcGluZyhkYW1waW5nOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBkYW1waW5nIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBmaXQoZml0OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZml0IH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBjbGlwKGNsaXA6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBjbGlwIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBvYnNlcnZlKG9ic2VydmU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBvYnNlcnZlIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBtYXJnaW4obWFyZ2luOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBtYXJnaW4gfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IGVwcyhlcHM6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGVwcyB9KTtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgZml0dGVkID0gbmV3IEV2ZW50RW1pdHRlcjxOZ3RzQm91bmRzU2l6ZT4oKTtcblxuICAgIHJlYWRvbmx5ICNzdG9yZSA9IGluamVjdChOZ3RTdG9yZSk7XG4gICAgcmVhZG9ubHkgI2NvbnRyb2xzID0gdGhpcy4jc3RvcmUuc2VsZWN0KCdjb250cm9scycpO1xuICAgIHJlYWRvbmx5ICNjYW1lcmEgPSB0aGlzLiNzdG9yZS5zZWxlY3QoJ2NhbWVyYScpO1xuICAgIHJlYWRvbmx5ICNpbnZhbGlkYXRlID0gdGhpcy4jc3RvcmUuc2VsZWN0KCdpbnZhbGlkYXRlJyk7XG4gICAgcmVhZG9ubHkgI3NpemUgPSB0aGlzLiNzdG9yZS5zZWxlY3QoJ3NpemUnKTtcblxuICAgIHJlYWRvbmx5ICNjdXJyZW50ID0geyBhbmltYXRpbmc6IGZhbHNlLCBmb2N1czogbmV3IFRIUkVFLlZlY3RvcjMoKSwgY2FtZXJhOiBuZXcgVEhSRUUuVmVjdG9yMygpLCB6b29tOiAxIH07XG4gICAgcmVhZG9ubHkgI2dvYWwgPSB7IGZvY3VzOiBuZXcgVEhSRUUuVmVjdG9yMygpLCBjYW1lcmE6IG5ldyBUSFJFRS5WZWN0b3IzKCksIHpvb206IDEgfTtcblxuICAgIHJlYWRvbmx5ICNib3ggPSBuZXcgVEhSRUUuQm94MygpO1xuXG4gICAgcmVhZG9ubHkgI21hcmdpbiA9IHRoaXMuc2VsZWN0KCdtYXJnaW4nKTtcbiAgICByZWFkb25seSAjZGFtcGluZyA9IHRoaXMuc2VsZWN0KCdkYW1waW5nJyk7XG4gICAgcmVhZG9ubHkgI2ZpdCA9IHRoaXMuc2VsZWN0KCdmaXQnKTtcbiAgICByZWFkb25seSAjY2xpcCA9IHRoaXMuc2VsZWN0KCdjbGlwJyk7XG4gICAgcmVhZG9ubHkgI29ic2VydmUgPSB0aGlzLnNlbGVjdCgnb2JzZXJ2ZScpO1xuXG4gICAgI2NvdW50ID0gMDtcblxuICAgIHJlYWRvbmx5IGFwaSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWFyZ2luID0gdGhpcy4jbWFyZ2luKCk7XG4gICAgICAgIGNvbnN0IGRhbXBpbmcgPSB0aGlzLiNkYW1waW5nKCk7XG5cbiAgICAgICAgY29uc3QgY2FtZXJhID0gdGhpcy4jY2FtZXJhKCk7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcy4jY29udHJvbHMoKSBhcyB1bmtub3duIGFzIENvbnRyb2xzUHJvdG87XG4gICAgICAgIGNvbnN0IGludmFsaWRhdGUgPSB0aGlzLiNpbnZhbGlkYXRlKCk7XG5cbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuI2N1cnJlbnQ7XG4gICAgICAgIGNvbnN0IGdvYWwgPSB0aGlzLiNnb2FsO1xuXG4gICAgICAgIGNvbnN0IGJveCA9IHRoaXMuI2JveDtcbiAgICAgICAgY29uc3QgcmVmID0gKCkgPT4gdGhpcy5ib3VuZHNSZWYudW50cmFja2VkO1xuICAgICAgICBjb25zdCBmaXR0ZWQgPSB0aGlzLmZpdHRlZDtcblxuICAgICAgICBmdW5jdGlvbiBnZXRTaXplKCkge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGJveC5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xuICAgICAgICAgICAgY29uc3QgY2VudGVyID0gYm94LmdldENlbnRlcihuZXcgVEhSRUUuVmVjdG9yMygpKTtcbiAgICAgICAgICAgIGNvbnN0IG1heFNpemUgPSBNYXRoLm1heChzaXplLngsIHNpemUueSwgc2l6ZS56KTtcbiAgICAgICAgICAgIGNvbnN0IGZpdEhlaWdodERpc3RhbmNlID0gaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSlcbiAgICAgICAgICAgICAgICA/IG1heFNpemUgKiA0XG4gICAgICAgICAgICAgICAgOiBtYXhTaXplIC8gKDIgKiBNYXRoLmF0YW4oKE1hdGguUEkgKiBjYW1lcmEuZm92KSAvIDM2MCkpO1xuICAgICAgICAgICAgY29uc3QgZml0V2lkdGhEaXN0YW5jZSA9IGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpID8gbWF4U2l6ZSAqIDQgOiBmaXRIZWlnaHREaXN0YW5jZSAvIGNhbWVyYS5hc3BlY3Q7XG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IG1hcmdpbiAqIE1hdGgubWF4KGZpdEhlaWdodERpc3RhbmNlLCBmaXRXaWR0aERpc3RhbmNlKTtcbiAgICAgICAgICAgIHJldHVybiB7IGJveCwgc2l6ZSwgY2VudGVyLCBkaXN0YW5jZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdldFNpemUsXG4gICAgICAgICAgICByZWZyZXNoKG9iamVjdD86IFRIUkVFLk9iamVjdDNEIHwgVEhSRUUuQm94Mykge1xuICAgICAgICAgICAgICAgIGlmIChpc0JveDMob2JqZWN0KSkgYm94LmNvcHkob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gb2JqZWN0IHx8IHJlZigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3guc2V0RnJvbU9iamVjdCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChib3guaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heCA9IGNhbWVyYS5wb3NpdGlvbi5sZW5ndGgoKSB8fCAxMDtcbiAgICAgICAgICAgICAgICAgICAgYm94LnNldEZyb21DZW50ZXJBbmRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCksIG5ldyBUSFJFRS5WZWN0b3IzKG1heCwgbWF4LCBtYXgpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbHM/LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPcnRob2dyYXBoaWNUcmFja2JhbGxDb250cm9scycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHV0IGNhbWVyYSBvbiBhIHNwaGVyZSBhbG9uZyB3aGljaCBpdCBzaG91bGQgbW92ZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRpc3RhbmNlIH0gPSBnZXRTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGNhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLnN1Yihjb250cm9scy50YXJnZXQpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGRpc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UG9zID0gY29udHJvbHMudGFyZ2V0LmNsb25lKCkuYWRkKGRpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi5jb3B5KG5ld1Bvcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjbGlwKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZGlzdGFuY2UgfSA9IGdldFNpemUoKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbHMpIGNvbnRyb2xzLm1heERpc3RhbmNlID0gZGlzdGFuY2UgKiAxMDtcbiAgICAgICAgICAgICAgICBjYW1lcmEubmVhciA9IGRpc3RhbmNlIC8gMTAwO1xuICAgICAgICAgICAgICAgIGNhbWVyYS5mYXIgPSBkaXN0YW5jZSAqIDEwMDtcbiAgICAgICAgICAgICAgICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9scykgY29udHJvbHMudXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRvKHsgcG9zaXRpb24sIHRhcmdldCB9OiB7IHBvc2l0aW9uOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07IHRhcmdldD86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9KSB7XG4gICAgICAgICAgICAgICAgY3VycmVudC5jYW1lcmEuY29weShjYW1lcmEucG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY2VudGVyIH0gPSBnZXRTaXplKCk7XG4gICAgICAgICAgICAgICAgZ29hbC5jYW1lcmEuc2V0KC4uLnBvc2l0aW9uKTtcblxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ29hbC5mb2N1cy5zZXQoLi4udGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnb2FsLmZvY3VzLmNvcHkoY2VudGVyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZGFtcGluZykge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFuaW1hdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLnNldCguLi5wb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZml0KCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQuY2FtZXJhLmNvcHkoY2FtZXJhLnBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbHMpIGN1cnJlbnQuZm9jdXMuY29weShjb250cm9scy50YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjZW50ZXIsIGRpc3RhbmNlIH0gPSBnZXRTaXplKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gY2VudGVyLmNsb25lKCkuc3ViKGNhbWVyYS5wb3NpdGlvbikubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpO1xuXG4gICAgICAgICAgICAgICAgZ29hbC5jYW1lcmEuY29weShjZW50ZXIpLnN1YihkaXJlY3Rpb24pO1xuICAgICAgICAgICAgICAgIGdvYWwuZm9jdXMuY29weShjZW50ZXIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuem9vbSA9IGNhbWVyYS56b29tO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXhIZWlnaHQgPSAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGggPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5WZWN0b3IzKGJveC5taW4ueCwgYm94Lm1pbi55LCBib3gubWluLnopLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1pbi54LCBib3gubWF4LnksIGJveC5taW4ueiksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyhib3gubWluLngsIGJveC5taW4ueSwgYm94Lm1heC56KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5WZWN0b3IzKGJveC5taW4ueCwgYm94Lm1heC55LCBib3gubWF4LnopLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1heC54LCBib3gubWF4LnksIGJveC5tYXgueiksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyhib3gubWF4LngsIGJveC5tYXgueSwgYm94Lm1pbi56KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5WZWN0b3IzKGJveC5tYXgueCwgYm94Lm1pbi55LCBib3gubWF4LnopLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1heC54LCBib3gubWluLnksIGJveC5taW4ueiksXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgY2VudGVyIGFuZCBlYWNoIGNvcm5lciB0byBjYW1lcmEgc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgY2VudGVyLmFwcGx5TWF0cml4NChjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHZlcnRpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2LmFwcGx5TWF0cml4NChjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgTWF0aC5hYnModi55IC0gY2VudGVyLnkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIE1hdGguYWJzKHYueCAtIGNlbnRlci54KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0ICo9IDI7XG4gICAgICAgICAgICAgICAgICAgIG1heFdpZHRoICo9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHpvb21Gb3JIZWlnaHQgPSAoY2FtZXJhLnRvcCAtIGNhbWVyYS5ib3R0b20pIC8gbWF4SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB6b29tRm9yV2lkdGggPSAoY2FtZXJhLnJpZ2h0IC0gY2FtZXJhLmxlZnQpIC8gbWF4V2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGdvYWwuem9vbSA9IE1hdGgubWluKHpvb21Gb3JIZWlnaHQsIHpvb21Gb3JXaWR0aCkgLyBtYXJnaW47XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGFtcGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhLnpvb20gPSBnb2FsLnpvb207XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRhbXBpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hbmltYXRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi5jb3B5KGdvYWwuY2FtZXJhKTtcbiAgICAgICAgICAgICAgICAgICAgY2FtZXJhLmxvb2tBdChnb2FsLmZvY3VzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scy50YXJnZXQuY29weShnb2FsLmZvY3VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaXR0ZWQub2JzZXJ2ZWQpIGZpdHRlZC5lbWl0KHRoaXMuZ2V0U2l6ZSgpKTtcbiAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKHsgZGFtcGluZzogNiwgZml0OiBmYWxzZSwgY2xpcDogZmFsc2UsIG9ic2VydmU6IGZhbHNlLCBtYXJnaW46IDEuMiwgZXBzOiAwLjAxIH0pO1xuICAgICAgICB0aGlzLiNwcmV2ZW50RHJhZ0hpamFja2luZygpO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uSW5JbmplY3Rpb25Db250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3NjYWxlUG9pbnRlcigpO1xuICAgICAgICAgICAgaW5qZWN0QmVmb3JlUmVuZGVyKHRoaXMuI29uQmVmb3JlUmVuZGVyLmJpbmQodGhpcykpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAjc2NhbGVQb2ludGVyKCkge1xuICAgICAgICBjb25zdCB0cmlnZ2VyID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICAgICAgICAgIHNpemU6IHRoaXMuI3NpemUoKSxcbiAgICAgICAgICAgIGZpdDogdGhpcy4jZml0KCksXG4gICAgICAgICAgICBjbGlwOiB0aGlzLiNjbGlwKCksXG4gICAgICAgICAgICBvYnNlcnZlOiB0aGlzLiNvYnNlcnZlKCksXG4gICAgICAgICAgICBjYW1lcmE6IHRoaXMuI2NhbWVyYSgpLFxuICAgICAgICAgICAgY29udHJvbHM6IHRoaXMuI2NvbnRyb2xzKCksXG4gICAgICAgIH0pKTtcbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgb2JzZXJ2ZSwgZml0LCBjbGlwIH0gPSB0cmlnZ2VyKCk7XG4gICAgICAgICAgICBjb25zdCBhcGkgPSB1bnRyYWNrZWQodGhpcy5hcGkpO1xuICAgICAgICAgICAgaWYgKG9ic2VydmUgfHwgdGhpcy4jY291bnQrKyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGFwaS5yZWZyZXNoKCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpdCkgYXBpLmZpdCgpO1xuICAgICAgICAgICAgICAgIGlmIChjbGlwKSBhcGkuY2xpcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAjb25CZWZvcmVSZW5kZXIoeyBkZWx0YSB9OiBOZ3RSZW5kZXJTdGF0ZSkge1xuICAgICAgICBjb25zdCB7IGRhbXBpbmcsIGVwcyB9ID0gdGhpcy5nZXQoKTtcbiAgICAgICAgY29uc3QgaW52YWxpZGF0ZSA9IHRoaXMuI2ludmFsaWRhdGUoKTtcbiAgICAgICAgY29uc3QgY2FtZXJhID0gdGhpcy4jY2FtZXJhKCk7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcy4jY29udHJvbHMoKSBhcyB1bmtub3duIGFzIENvbnRyb2xzUHJvdG87XG5cbiAgICAgICAgaWYgKHRoaXMuI2N1cnJlbnQuYW5pbWF0aW5nKSB7XG4gICAgICAgICAgICBkYW1wKHRoaXMuI2N1cnJlbnQuZm9jdXMsIHRoaXMuI2dvYWwuZm9jdXMsIGRhbXBpbmcsIGRlbHRhKTtcbiAgICAgICAgICAgIGRhbXAodGhpcy4jY3VycmVudC5jYW1lcmEsIHRoaXMuI2dvYWwuY2FtZXJhLCBkYW1waW5nLCBkZWx0YSk7XG4gICAgICAgICAgICB0aGlzLiNjdXJyZW50Lnpvb20gPSBUSFJFRS5NYXRoVXRpbHMuZGFtcCh0aGlzLiNjdXJyZW50Lnpvb20sIHRoaXMuI2dvYWwuem9vbSwgZGFtcGluZywgZGVsdGEpO1xuICAgICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLmNvcHkodGhpcy4jY3VycmVudC5jYW1lcmEpO1xuXG4gICAgICAgICAgICBpZiAoaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkpIHtcbiAgICAgICAgICAgICAgICBjYW1lcmEuem9vbSA9IHRoaXMuI2N1cnJlbnQuem9vbTtcbiAgICAgICAgICAgICAgICBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWNvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgY2FtZXJhLmxvb2tBdCh0aGlzLiNjdXJyZW50LmZvY3VzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udHJvbHMudGFyZ2V0LmNvcHkodGhpcy4jY3VycmVudC5mb2N1cyk7XG4gICAgICAgICAgICAgICAgY29udHJvbHMudXBkYXRlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGludmFsaWRhdGUoKTtcbiAgICAgICAgICAgIGlmIChpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSAmJiAhKE1hdGguYWJzKHRoaXMuI2N1cnJlbnQuem9vbSAtIHRoaXMuI2dvYWwuem9vbSkgPCBlcHMpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIWlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpICYmICFlcXVhbHModGhpcy4jY3VycmVudC5jYW1lcmEsIHRoaXMuI2dvYWwuY2FtZXJhLCBlcHMpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoY29udHJvbHMgJiYgIWVxdWFscyh0aGlzLiNjdXJyZW50LmZvY3VzLCB0aGlzLiNnb2FsLmZvY3VzLCBlcHMpKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLiNjdXJyZW50LmFuaW1hdGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgI3ByZXZlbnREcmFnSGlqYWNraW5nKCkge1xuICAgICAgICBlZmZlY3QoKG9uQ2xlYW51cCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbHMgPSB0aGlzLiNjb250cm9scygpIGFzIHVua25vd24gYXMgQ29udHJvbHNQcm90bztcbiAgICAgICAgICAgIGlmIChjb250cm9scykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4gKHRoaXMuI2N1cnJlbnQuYW5pbWF0aW5nID0gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXJ0JywgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIG9uQ2xlYW51cCgoKSA9PiBjb250cm9scy5yZW1vdmVFdmVudExpc3RlbmVyKCdzdGFydCcsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
309
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm91bmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2JvdW5kcy9ib3VuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHNCQUFzQixFQUN0QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixVQUFVLEVBQ1YsU0FBUyxHQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTixNQUFNLEVBQ04sa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixjQUFjLEVBQ2QsRUFBRSxFQUNGLFdBQVcsR0FFWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDOztBQUU5QixNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBaUJsQixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQVEsRUFBcUIsRUFBRSxDQUFDLEdBQUcsSUFBSyxHQUFrQixDQUFDLE1BQU0sQ0FBQztBQUVsRixTQUFTLE1BQU0sQ0FBQyxDQUFnQixFQUFFLENBQWdCLEVBQUUsR0FBVztJQUM5RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzVGLENBQUM7QUFF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RSxHQUFHLENBQUM7b0JBQUUsT0FBTztnQkFDMUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2FBQy9CO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOzhHQXpRVyxVQUFVO2tHQUFWLFVBQVUsMlNBSFgsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLDBCQUx6Qjs7OztFQUlUOzsyRkFJVyxVQUFVO2tCQVh0QixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxhQUFhO29CQUN2QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7O0VBSVQ7b0JBQ0QsU0FBUyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDbkMsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7aUJBQ2pDOzBFQVdTLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRTJCLFFBQVE7c0JBQXhDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2dCQUlFLElBQUk7c0JBQWhDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO2dCQUlPLEtBQUs7c0JBQWxDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO2dCQUlTLFFBQVE7c0JBQXhDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2dCQUlLLE9BQU87c0JBQXRDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO2dCQUlHLElBQUk7c0JBQWhDLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO2dCQUliLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdENvbXBvbmVudCxcblx0RXZlbnRFbWl0dGVyLFxuXHRJbnB1dCxcblx0T3V0cHV0LFxuXHRjb21wdXRlZCxcblx0ZWZmZWN0LFxuXHRmb3J3YXJkUmVmLFxuXHR1bnRyYWNrZWQsXG5cdHR5cGUgU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG5cdGV4dGVuZCxcblx0aW5qZWN0QmVmb3JlUmVuZGVyLFxuXHRpbmplY3ROZ3RSZWYsXG5cdGluamVjdE5ndFN0b3JlLFxuXHRpcyxcblx0c2lnbmFsU3RvcmUsXG5cdHR5cGUgTmd0R3JvdXAsXG59IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgY3JlYXRlSW5qZWN0aW9uVG9rZW4gfSBmcm9tICduZ3h0ZW5zaW9uL2NyZWF0ZS1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICd0aHJlZSc7XG5cbmV4dGVuZCh7IEdyb3VwIH0pO1xuXG5leHBvcnQgdHlwZSBOZ3RzQm91bmRzU2l6ZSA9IHtcblx0Ym94OiBUSFJFRS5Cb3gzO1xuXHRzaXplOiBUSFJFRS5WZWN0b3IzO1xuXHRjZW50ZXI6IFRIUkVFLlZlY3RvcjM7XG5cdGRpc3RhbmNlOiBudW1iZXI7XG59O1xuXG50eXBlIENvbnRyb2xzUHJvdG8gPSB7XG5cdHVwZGF0ZSgpOiB2b2lkO1xuXHR0YXJnZXQ6IFRIUkVFLlZlY3RvcjM7XG5cdG1heERpc3RhbmNlOiBudW1iZXI7XG5cdGFkZEV2ZW50TGlzdGVuZXI6IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG59O1xuXG5jb25zdCBpc0JveDMgPSAoZGVmOiBhbnkpOiBkZWYgaXMgVEhSRUUuQm94MyA9PiBkZWYgJiYgKGRlZiBhcyBUSFJFRS5Cb3gzKS5pc0JveDM7XG5cbmZ1bmN0aW9uIGVxdWFscyhhOiBUSFJFRS5WZWN0b3IzLCBiOiBUSFJFRS5WZWN0b3IzLCBlcHM6IG51bWJlcikge1xuXHRyZXR1cm4gTWF0aC5hYnMoYS54IC0gYi54KSA8IGVwcyAmJiBNYXRoLmFicyhhLnkgLSBiLnkpIDwgZXBzICYmIE1hdGguYWJzKGEueiAtIGIueikgPCBlcHM7XG59XG5cbmZ1bmN0aW9uIGRhbXAodjogVEhSRUUuVmVjdG9yMywgdDogVEhSRUUuVmVjdG9yMywgbGFtYmRhOiBudW1iZXIsIGRlbHRhOiBudW1iZXIpIHtcblx0di54ID0gVEhSRUUuTWF0aFV0aWxzLmRhbXAodi54LCB0LngsIGxhbWJkYSwgZGVsdGEpO1xuXHR2LnkgPSBUSFJFRS5NYXRoVXRpbHMuZGFtcCh2LnksIHQueSwgbGFtYmRhLCBkZWx0YSk7XG5cdHYueiA9IFRIUkVFLk1hdGhVdGlscy5kYW1wKHYueiwgdC56LCBsYW1iZGEsIGRlbHRhKTtcbn1cblxuZXhwb3J0IHR5cGUgTmd0c0JvdW5kc1N0YXRlID0ge1xuXHRkYW1waW5nOiBudW1iZXI7XG5cdGZpdDogYm9vbGVhbjtcblx0Y2xpcDogYm9vbGVhbjtcblx0b2JzZXJ2ZTogYm9vbGVhbjtcblx0bWFyZ2luOiBudW1iZXI7XG5cdGVwczogbnVtYmVyO1xufTtcblxuZGVjbGFyZSBnbG9iYWwge1xuXHRpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcblx0XHQvKipcblx0XHQgKiBAZXh0ZW5kcyBuZ3QtZ3JvdXBcblx0XHQgKi9cblx0XHQnbmd0cy1ib3VuZHMnOiBOZ3RzQm91bmRzU3RhdGUgJiBOZ3RHcm91cDtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgW2luamVjdE5ndHNCb3VuZHNBcGksIHByb3ZpZGVOZ3RzQm91bmRzQXBpXSA9IGNyZWF0ZUluamVjdGlvblRva2VuKChib3VuZHM6IE5ndHNCb3VuZHMpID0+IGJvdW5kcy5hcGksIHtcblx0aXNSb290OiBmYWxzZSxcblx0ZGVwczogW2ZvcndhcmRSZWYoKCkgPT4gTmd0c0JvdW5kcyldLFxufSk7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtYm91bmRzJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LWdyb3VwIFtyZWZdPVwiYm91bmRzUmVmXCI+XG5cdFx0XHQ8bmctY29udGVudCAvPlxuXHRcdDwvbmd0LWdyb3VwPlxuXHRgLFxuXHRwcm92aWRlcnM6IFtwcm92aWRlTmd0c0JvdW5kc0FwaSgpXSxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzQm91bmRzIHtcblx0cHJpdmF0ZSBpbnB1dHMgPSBzaWduYWxTdG9yZTxOZ3RzQm91bmRzU3RhdGU+KHtcblx0XHRkYW1waW5nOiA2LFxuXHRcdGZpdDogZmFsc2UsXG5cdFx0Y2xpcDogZmFsc2UsXG5cdFx0b2JzZXJ2ZTogZmFsc2UsXG5cdFx0bWFyZ2luOiAxLjIsXG5cdFx0ZXBzOiAwLjAxLFxuXHR9KTtcblxuXHRASW5wdXQoKSBib3VuZHNSZWYgPSBpbmplY3ROZ3RSZWY8R3JvdXA+KCk7XG5cblx0QElucHV0KHsgYWxpYXM6ICdkYW1waW5nJyB9KSBzZXQgX2RhbXBpbmcoZGFtcGluZzogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgZGFtcGluZyB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnZml0JyB9KSBzZXQgX2ZpdChmaXQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBmaXQgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ2NsaXAnIH0pIHNldCBfY2xpcChjbGlwOiBib29sZWFuKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgY2xpcCB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnb2JzZXJ2ZScgfSkgc2V0IF9vYnNlcnZlKG9ic2VydmU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBvYnNlcnZlIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdtYXJnaW4nIH0pIHNldCBfbWFyZ2luKG1hcmdpbjogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgbWFyZ2luIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdlcHMnIH0pIHNldCBfZXBzKGVwczogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgZXBzIH0pO1xuXHR9XG5cblx0QE91dHB1dCgpIGZpdHRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Tmd0c0JvdW5kc1NpemU+KCk7XG5cblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdE5ndFN0b3JlKCk7XG5cdHByaXZhdGUgY29udHJvbHMgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY29udHJvbHMnKSBhcyB1bmtub3duIGFzIFNpZ25hbDxDb250cm9sc1Byb3RvPjtcblx0cHJpdmF0ZSBzaXplID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3NpemUnKTtcblx0cHJpdmF0ZSBjYW1lcmEgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG5cdHByaXZhdGUgaW52YWxpZGF0ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdpbnZhbGlkYXRlJyk7XG5cblx0cHJpdmF0ZSBmaXQgPSB0aGlzLmlucHV0cy5zZWxlY3QoJ2ZpdCcpO1xuXHRwcml2YXRlIGNsaXAgPSB0aGlzLmlucHV0cy5zZWxlY3QoJ2NsaXAnKTtcblx0cHJpdmF0ZSBvYnNlcnZlID0gdGhpcy5pbnB1dHMuc2VsZWN0KCdvYnNlcnZlJyk7XG5cdHByaXZhdGUgbWFyZ2luID0gdGhpcy5pbnB1dHMuc2VsZWN0KCdtYXJnaW4nKTtcblx0cHJpdmF0ZSBkYW1waW5nID0gdGhpcy5pbnB1dHMuc2VsZWN0KCdkYW1waW5nJyk7XG5cblx0cHJpdmF0ZSBjdXJyZW50ID0geyBhbmltYXRpbmc6IGZhbHNlLCBmb2N1czogbmV3IFRIUkVFLlZlY3RvcjMoKSwgY2FtZXJhOiBuZXcgVEhSRUUuVmVjdG9yMygpLCB6b29tOiAxIH07XG5cdHByaXZhdGUgZ29hbCA9IHsgZm9jdXM6IG5ldyBUSFJFRS5WZWN0b3IzKCksIGNhbWVyYTogbmV3IFRIUkVFLlZlY3RvcjMoKSwgem9vbTogMSB9O1xuXHRwcml2YXRlIGJveCA9IG5ldyBUSFJFRS5Cb3gzKCk7XG5cblx0YXBpID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHsgYm94LCBib3VuZHNSZWYsIGN1cnJlbnQsIGdvYWwsIGZpdHRlZCB9ID0gdGhpcztcblx0XHRjb25zdCBbY2FtZXJhLCBtYXJnaW4sIGNvbnRyb2xzLCBpbnZhbGlkYXRlLCBkYW1waW5nXSA9IFtcblx0XHRcdHRoaXMuY2FtZXJhKCksXG5cdFx0XHR0aGlzLm1hcmdpbigpLFxuXHRcdFx0dGhpcy5jb250cm9scygpLFxuXHRcdFx0dGhpcy5pbnZhbGlkYXRlKCksXG5cdFx0XHR0aGlzLmRhbXBpbmcoKSxcblx0XHRdO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0U2l6ZSgpIHtcblx0XHRcdGNvbnN0IHNpemUgPSBib3guZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpKTtcblx0XHRcdGNvbnN0IGNlbnRlciA9IGJveC5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSk7XG5cdFx0XHRjb25zdCBtYXhTaXplID0gTWF0aC5tYXgoc2l6ZS54LCBzaXplLnksIHNpemUueik7XG5cdFx0XHRjb25zdCBmaXRIZWlnaHREaXN0YW5jZSA9IGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpXG5cdFx0XHRcdD8gbWF4U2l6ZSAqIDRcblx0XHRcdFx0OiBtYXhTaXplIC8gKDIgKiBNYXRoLmF0YW4oKE1hdGguUEkgKiBjYW1lcmEuZm92KSAvIDM2MCkpO1xuXHRcdFx0Y29uc3QgZml0V2lkdGhEaXN0YW5jZSA9IGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpID8gbWF4U2l6ZSAqIDQgOiBmaXRIZWlnaHREaXN0YW5jZSAvIGNhbWVyYS5hc3BlY3Q7XG5cdFx0XHRjb25zdCBkaXN0YW5jZSA9IG1hcmdpbiAqIE1hdGgubWF4KGZpdEhlaWdodERpc3RhbmNlLCBmaXRXaWR0aERpc3RhbmNlKTtcblx0XHRcdHJldHVybiB7IGJveCwgc2l6ZSwgY2VudGVyLCBkaXN0YW5jZSB9O1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRnZXRTaXplLFxuXHRcdFx0cmVmcmVzaChvYmplY3Q/OiBUSFJFRS5PYmplY3QzRCB8IFRIUkVFLkJveDMpIHtcblx0XHRcdFx0aWYgKGlzQm94MyhvYmplY3QpKSBib3guY29weShvYmplY3QpO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRjb25zdCB0YXJnZXQgPSBvYmplY3QgfHwgYm91bmRzUmVmLm5hdGl2ZUVsZW1lbnQ7XG5cdFx0XHRcdFx0aWYgKCF0YXJnZXQpIHJldHVybiB0aGlzO1xuXHRcdFx0XHRcdHRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCB0cnVlKTtcblx0XHRcdFx0XHRib3guc2V0RnJvbU9iamVjdCh0YXJnZXQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChib3guaXNFbXB0eSgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbWF4ID0gY2FtZXJhLnBvc2l0aW9uLmxlbmd0aCgpIHx8IDEwO1xuXHRcdFx0XHRcdGJveC5zZXRGcm9tQ2VudGVyQW5kU2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpLCBuZXcgVEhSRUUuVmVjdG9yMyhtYXgsIG1heCwgbWF4KSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY29udHJvbHM/LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPcnRob2dyYXBoaWNUcmFja2JhbGxDb250cm9scycpIHtcblx0XHRcdFx0XHQvLyBQdXQgY2FtZXJhIG9uIGEgc3BoZXJlIGFsb25nIHdoaWNoIGl0IHNob3VsZCBtb3ZlXG5cdFx0XHRcdFx0Y29uc3QgeyBkaXN0YW5jZSB9ID0gZ2V0U2l6ZSgpO1xuXHRcdFx0XHRcdGNvbnN0IGRpcmVjdGlvbiA9IGNhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLnN1Yihjb250cm9scy50YXJnZXQpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGRpc3RhbmNlKTtcblx0XHRcdFx0XHRjb25zdCBuZXdQb3MgPSBjb250cm9scy50YXJnZXQuY2xvbmUoKS5hZGQoZGlyZWN0aW9uKTtcblx0XHRcdFx0XHRjYW1lcmEucG9zaXRpb24uY29weShuZXdQb3MpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Y2xpcCgpIHtcblx0XHRcdFx0Y29uc3QgeyBkaXN0YW5jZSB9ID0gZ2V0U2l6ZSgpO1xuXHRcdFx0XHRpZiAoY29udHJvbHMpIGNvbnRyb2xzLm1heERpc3RhbmNlID0gZGlzdGFuY2UgKiAxMDtcblx0XHRcdFx0Y2FtZXJhLm5lYXIgPSBkaXN0YW5jZSAvIDEwMDtcblx0XHRcdFx0Y2FtZXJhLmZhciA9IGRpc3RhbmNlICogMTAwO1xuXHRcdFx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXHRcdFx0XHRpZiAoY29udHJvbHMpIGNvbnRyb2xzLnVwZGF0ZSgpO1xuXHRcdFx0XHRpbnZhbGlkYXRlKCk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdHRvKHsgcG9zaXRpb24sIHRhcmdldCB9OiB7IHBvc2l0aW9uOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07IHRhcmdldD86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9KSB7XG5cdFx0XHRcdGN1cnJlbnQuY2FtZXJhLmNvcHkoY2FtZXJhLnBvc2l0aW9uKTtcblx0XHRcdFx0Y29uc3QgeyBjZW50ZXIgfSA9IGdldFNpemUoKTtcblx0XHRcdFx0Z29hbC5jYW1lcmEuc2V0KC4uLnBvc2l0aW9uKTtcblxuXHRcdFx0XHRpZiAodGFyZ2V0KSB7XG5cdFx0XHRcdFx0Z29hbC5mb2N1cy5zZXQoLi4udGFyZ2V0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRnb2FsLmZvY3VzLmNvcHkoY2VudGVyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkYW1waW5nKSB7XG5cdFx0XHRcdFx0Y3VycmVudC5hbmltYXRpbmcgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNhbWVyYS5wb3NpdGlvbi5zZXQoLi4ucG9zaXRpb24pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0Zml0KCkge1xuXHRcdFx0XHRjdXJyZW50LmNhbWVyYS5jb3B5KGNhbWVyYS5wb3NpdGlvbik7XG5cdFx0XHRcdGlmIChjb250cm9scykgY3VycmVudC5mb2N1cy5jb3B5KGNvbnRyb2xzLnRhcmdldCk7XG5cblx0XHRcdFx0Y29uc3QgeyBjZW50ZXIsIGRpc3RhbmNlIH0gPSBnZXRTaXplKCk7XG5cdFx0XHRcdGNvbnN0IGRpcmVjdGlvbiA9IGNlbnRlci5jbG9uZSgpLnN1YihjYW1lcmEucG9zaXRpb24pLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGRpc3RhbmNlKTtcblxuXHRcdFx0XHRnb2FsLmNhbWVyYS5jb3B5KGNlbnRlcikuc3ViKGRpcmVjdGlvbik7XG5cdFx0XHRcdGdvYWwuZm9jdXMuY29weShjZW50ZXIpO1xuXG5cdFx0XHRcdGlmIChpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSkge1xuXHRcdFx0XHRcdGN1cnJlbnQuem9vbSA9IGNhbWVyYS56b29tO1xuXG5cdFx0XHRcdFx0bGV0IG1heEhlaWdodCA9IDAsXG5cdFx0XHRcdFx0XHRtYXhXaWR0aCA9IDA7XG5cdFx0XHRcdFx0Y29uc3QgdmVydGljZXMgPSBbXG5cdFx0XHRcdFx0XHRuZXcgVEhSRUUuVmVjdG9yMyhib3gubWluLngsIGJveC5taW4ueSwgYm94Lm1pbi56KSxcblx0XHRcdFx0XHRcdG5ldyBUSFJFRS5WZWN0b3IzKGJveC5taW4ueCwgYm94Lm1heC55LCBib3gubWluLnopLFxuXHRcdFx0XHRcdFx0bmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1pbi54LCBib3gubWluLnksIGJveC5tYXgueiksXG5cdFx0XHRcdFx0XHRuZXcgVEhSRUUuVmVjdG9yMyhib3gubWluLngsIGJveC5tYXgueSwgYm94Lm1heC56KSxcblx0XHRcdFx0XHRcdG5ldyBUSFJFRS5WZWN0b3IzKGJveC5tYXgueCwgYm94Lm1heC55LCBib3gubWF4LnopLFxuXHRcdFx0XHRcdFx0bmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1heC54LCBib3gubWF4LnksIGJveC5taW4ueiksXG5cdFx0XHRcdFx0XHRuZXcgVEhSRUUuVmVjdG9yMyhib3gubWF4LngsIGJveC5taW4ueSwgYm94Lm1heC56KSxcblx0XHRcdFx0XHRcdG5ldyBUSFJFRS5WZWN0b3IzKGJveC5tYXgueCwgYm94Lm1pbi55LCBib3gubWluLnopLFxuXHRcdFx0XHRcdF07XG5cdFx0XHRcdFx0Ly8gVHJhbnNmb3JtIHRoZSBjZW50ZXIgYW5kIGVhY2ggY29ybmVyIHRvIGNhbWVyYSBzcGFjZVxuXHRcdFx0XHRcdGNlbnRlci5hcHBseU1hdHJpeDQoY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSk7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCB2IG9mIHZlcnRpY2VzKSB7XG5cdFx0XHRcdFx0XHR2LmFwcGx5TWF0cml4NChjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcblx0XHRcdFx0XHRcdG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgTWF0aC5hYnModi55IC0gY2VudGVyLnkpKTtcblx0XHRcdFx0XHRcdG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIE1hdGguYWJzKHYueCAtIGNlbnRlci54KSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1heEhlaWdodCAqPSAyO1xuXHRcdFx0XHRcdG1heFdpZHRoICo9IDI7XG5cdFx0XHRcdFx0Y29uc3Qgem9vbUZvckhlaWdodCA9IChjYW1lcmEudG9wIC0gY2FtZXJhLmJvdHRvbSkgLyBtYXhIZWlnaHQ7XG5cdFx0XHRcdFx0Y29uc3Qgem9vbUZvcldpZHRoID0gKGNhbWVyYS5yaWdodCAtIGNhbWVyYS5sZWZ0KSAvIG1heFdpZHRoO1xuXHRcdFx0XHRcdGdvYWwuem9vbSA9IE1hdGgubWluKHpvb21Gb3JIZWlnaHQsIHpvb21Gb3JXaWR0aCkgLyBtYXJnaW47XG5cdFx0XHRcdFx0aWYgKCFkYW1waW5nKSB7XG5cdFx0XHRcdFx0XHRjYW1lcmEuem9vbSA9IGdvYWwuem9vbTtcblx0XHRcdFx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGRhbXBpbmcpIHtcblx0XHRcdFx0XHRjdXJyZW50LmFuaW1hdGluZyA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y2FtZXJhLnBvc2l0aW9uLmNvcHkoZ29hbC5jYW1lcmEpO1xuXHRcdFx0XHRcdGNhbWVyYS5sb29rQXQoZ29hbC5mb2N1cyk7XG5cdFx0XHRcdFx0aWYgKGNvbnRyb2xzKSB7XG5cdFx0XHRcdFx0XHRjb250cm9scy50YXJnZXQuY29weShnb2FsLmZvY3VzKTtcblx0XHRcdFx0XHRcdGNvbnRyb2xzLnVwZGF0ZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChmaXR0ZWQub2JzZXJ2ZWQpIHtcblx0XHRcdFx0XHRmaXR0ZWQuZW1pdCh0aGlzLmdldFNpemUoKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW52YWxpZGF0ZSgpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0fTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5wcmV2ZW50RHJhZ0hpamFja2luZygpO1xuXHRcdHRoaXMuc2NhbGVQb2ludGVyKCk7XG5cdFx0dGhpcy5iZWZvcmVSZW5kZXIoKTtcblx0fVxuXG5cdHByaXZhdGUgcHJldmVudERyYWdIaWphY2tpbmcoKSB7XG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGNvbnN0IGNvbnRyb2xzID0gdGhpcy5jb250cm9scygpO1xuXHRcdFx0aWYgKGNvbnRyb2xzKSB7XG5cdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gKCkgPT4gKHRoaXMuY3VycmVudC5hbmltYXRpbmcgPSBmYWxzZSk7XG5cdFx0XHRcdGNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXJ0JywgY2FsbGJhY2spO1xuXHRcdFx0XHRvbkNsZWFudXAoKCkgPT4gY29udHJvbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3RhcnQnLCBjYWxsYmFjaykpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBzY2FsZVBvaW50ZXIoKSB7XG5cdFx0bGV0IGNvdW50ID0gMDtcblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgW29ic2VydmUsIGZpdCwgY2xpcCwgYXBpXSA9IFtcblx0XHRcdFx0dGhpcy5vYnNlcnZlKCksXG5cdFx0XHRcdHRoaXMuZml0KCksXG5cdFx0XHRcdHRoaXMuY2xpcCgpLFxuXHRcdFx0XHR1bnRyYWNrZWQodGhpcy5hcGkpLFxuXHRcdFx0XHR0aGlzLmNhbWVyYSgpLFxuXHRcdFx0XHR0aGlzLmNvbnRyb2xzKCksXG5cdFx0XHRcdHRoaXMuc2l6ZSgpLFxuXHRcdFx0XTtcblxuXHRcdFx0aWYgKG9ic2VydmUgfHwgY291bnQrKyA9PT0gMCkge1xuXHRcdFx0XHRhcGkucmVmcmVzaCgpO1xuXHRcdFx0XHRpZiAoZml0KSBhcGkuZml0KCk7XG5cdFx0XHRcdGlmIChjbGlwKSBhcGkuY2xpcCgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBiZWZvcmVSZW5kZXIoKSB7XG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCh7IGRlbHRhIH0pID0+IHtcblx0XHRcdGNvbnN0IFt7IGRhbXBpbmcsIGVwcyB9LCBjYW1lcmEsIGNvbnRyb2xzLCBpbnZhbGlkYXRlXSA9IFtcblx0XHRcdFx0dGhpcy5pbnB1dHMuZ2V0KCksXG5cdFx0XHRcdHRoaXMuY2FtZXJhKCksXG5cdFx0XHRcdHRoaXMuY29udHJvbHMoKSxcblx0XHRcdFx0dGhpcy5pbnZhbGlkYXRlKCksXG5cdFx0XHRdO1xuXG5cdFx0XHRpZiAodGhpcy5jdXJyZW50LmFuaW1hdGluZykge1xuXHRcdFx0XHRkYW1wKHRoaXMuY3VycmVudC5mb2N1cywgdGhpcy5nb2FsLmZvY3VzLCBkYW1waW5nLCBkZWx0YSk7XG5cdFx0XHRcdGRhbXAodGhpcy5jdXJyZW50LmNhbWVyYSwgdGhpcy5nb2FsLmNhbWVyYSwgZGFtcGluZywgZGVsdGEpO1xuXHRcdFx0XHR0aGlzLmN1cnJlbnQuem9vbSA9IFRIUkVFLk1hdGhVdGlscy5kYW1wKHRoaXMuY3VycmVudC56b29tLCB0aGlzLmdvYWwuem9vbSwgZGFtcGluZywgZGVsdGEpO1xuXHRcdFx0XHRjYW1lcmEucG9zaXRpb24uY29weSh0aGlzLmN1cnJlbnQuY2FtZXJhKTtcblxuXHRcdFx0XHRpZiAoaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkpIHtcblx0XHRcdFx0XHRjYW1lcmEuem9vbSA9IHRoaXMuY3VycmVudC56b29tO1xuXHRcdFx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIWNvbnRyb2xzKSB7XG5cdFx0XHRcdFx0Y2FtZXJhLmxvb2tBdCh0aGlzLmN1cnJlbnQuZm9jdXMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRyb2xzLnRhcmdldC5jb3B5KHRoaXMuY3VycmVudC5mb2N1cyk7XG5cdFx0XHRcdFx0Y29udHJvbHMudXBkYXRlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbnZhbGlkYXRlKCk7XG5cdFx0XHRcdGlmIChpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSAmJiAhKE1hdGguYWJzKHRoaXMuY3VycmVudC56b29tIC0gdGhpcy5nb2FsLnpvb20pIDwgZXBzKSkgcmV0dXJuO1xuXHRcdFx0XHRpZiAoIWlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpICYmICFlcXVhbHModGhpcy5jdXJyZW50LmNhbWVyYSwgdGhpcy5nb2FsLmNhbWVyYSwgZXBzKSkgcmV0dXJuO1xuXHRcdFx0XHRpZiAoY29udHJvbHMgJiYgIWVxdWFscyh0aGlzLmN1cnJlbnQuZm9jdXMsIHRoaXMuZ29hbC5mb2N1cywgZXBzKSkgcmV0dXJuO1xuXHRcdFx0XHR0aGlzLmN1cnJlbnQuYW5pbWF0aW5nID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==