@angular/core 16.0.0-next.4 → 16.0.0-next.6

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 (369) hide show
  1. package/esm2022/rxjs-interop/index.mjs +9 -0
  2. package/esm2022/rxjs-interop/public_api.mjs +15 -0
  3. package/esm2022/rxjs-interop/rxjs-interop.mjs +5 -0
  4. package/esm2022/rxjs-interop/src/from_observable.mjs +46 -0
  5. package/esm2022/rxjs-interop/src/from_signal.mjs +36 -0
  6. package/esm2022/rxjs-interop/src/index.mjs +11 -0
  7. package/esm2022/rxjs-interop/src/take_until_destroyed.mjs +33 -0
  8. package/{esm2020 → esm2022}/src/application_init.mjs +3 -3
  9. package/{esm2020 → esm2022}/src/application_module.mjs +4 -4
  10. package/esm2022/src/application_ref.mjs +969 -0
  11. package/{esm2020 → esm2022}/src/change_detection/change_detector_ref.mjs +6 -6
  12. package/esm2022/src/change_detection/differs/iterable_differs.mjs +81 -0
  13. package/esm2022/src/change_detection/differs/keyvalue_differs.mjs +74 -0
  14. package/{esm2020 → esm2022}/src/console.mjs +3 -3
  15. package/esm2022/src/core.mjs +56 -0
  16. package/esm2022/src/core_private_export.mjs +39 -0
  17. package/esm2022/src/core_reactivity_export_internal.mjs +12 -0
  18. package/esm2022/src/di/contextual.mjs +54 -0
  19. package/esm2022/src/di/index.mjs +29 -0
  20. package/esm2022/src/di/injector.mjs +62 -0
  21. package/esm2022/src/di/injector_compatibility.mjs +239 -0
  22. package/esm2022/src/di/provider_collection.mjs +279 -0
  23. package/esm2022/src/di/reflective_injector.mjs +311 -0
  24. package/esm2022/src/errors.mjs +49 -0
  25. package/esm2022/src/hydration/annotate.mjs +426 -0
  26. package/esm2022/src/hydration/api.mjs +176 -0
  27. package/esm2022/src/hydration/cleanup.mjs +95 -0
  28. package/esm2022/src/hydration/node_lookup_utils.mjs +273 -0
  29. package/esm2022/src/hydration/utils.mjs +219 -0
  30. package/esm2022/src/initial_render_pending_tasks.mjs +75 -0
  31. package/{esm2020 → esm2022}/src/linker/compiler.mjs +5 -5
  32. package/{esm2020 → esm2022}/src/linker/component_factory.mjs +1 -1
  33. package/esm2022/src/linker/component_factory_resolver.mjs +42 -0
  34. package/{esm2020 → esm2022}/src/linker/destroy_ref.mjs +11 -11
  35. package/{esm2020 → esm2022}/src/linker/element_ref.mjs +6 -6
  36. package/esm2022/src/linker/query_list.mjs +169 -0
  37. package/esm2022/src/linker/template_ref.mjs +102 -0
  38. package/{esm2020 → esm2022}/src/linker/view_container_ref.mjs +7 -7
  39. package/{esm2020 → esm2022}/src/linker/view_ref.mjs +2 -2
  40. package/esm2022/src/metadata/di.mjs +69 -0
  41. package/{esm2020 → esm2022}/src/metadata/directives.mjs +1 -1
  42. package/{esm2020 → esm2022}/src/metadata/do_boostrap.mjs +1 -1
  43. package/{esm2020 → esm2022}/src/metadata/ng_module.mjs +2 -2
  44. package/esm2022/src/metadata.mjs +18 -0
  45. package/{esm2020 → esm2022}/src/render/api.mjs +6 -6
  46. package/esm2022/src/render3/component_ref.mjs +393 -0
  47. package/{esm2020 → esm2022}/src/render3/context_discovery.mjs +1 -1
  48. package/esm2022/src/render3/features/standalone_feature.mjs +70 -0
  49. package/{esm2020 → esm2022}/src/render3/instructions/element.mjs +3 -2
  50. package/{esm2020 → esm2022}/src/render3/instructions/element_container.mjs +1 -2
  51. package/esm2022/src/render3/instructions/listener.mjs +244 -0
  52. package/esm2022/src/render3/instructions/mark_view_dirty.mjs +35 -0
  53. package/{esm2020 → esm2022}/src/render3/instructions/shared.mjs +26 -38
  54. package/{esm2020 → esm2022}/src/render3/instructions/styling.mjs +5 -2
  55. package/esm2022/src/render3/interfaces/view.mjs +48 -0
  56. package/esm2022/src/render3/jit/module.mjs +531 -0
  57. package/esm2022/src/render3/ng_module_ref.mjs +134 -0
  58. package/esm2022/src/render3/node_manipulation.mjs +960 -0
  59. package/esm2022/src/render3/reactive_lview_consumer.mjs +81 -0
  60. package/esm2022/src/render3/reactivity/effect.mjs +77 -0
  61. package/{esm2020 → esm2022}/src/render3/util/change_detection_utils.mjs +2 -2
  62. package/esm2022/src/render3/view_ref.mjs +307 -0
  63. package/{esm2020 → esm2022}/src/sanitization/sanitization.mjs +3 -3
  64. package/{esm2020 → esm2022}/src/sanitization/sanitizer.mjs +7 -7
  65. package/esm2022/src/signals/index.mjs +16 -0
  66. package/esm2022/src/signals/src/api.mjs +46 -0
  67. package/esm2022/src/signals/src/computed.mjs +140 -0
  68. package/esm2022/src/signals/src/errors.mjs +18 -0
  69. package/esm2022/src/signals/src/graph.mjs +189 -0
  70. package/esm2022/src/signals/src/signal.mjs +86 -0
  71. package/esm2022/src/signals/src/watch.mjs +63 -0
  72. package/esm2022/src/signals/src/weak_ref.mjs +35 -0
  73. package/{esm2020 → esm2022}/src/testability/testability.mjs +5 -5
  74. package/esm2022/src/transfer_state.mjs +153 -0
  75. package/esm2022/src/util/ng_dev_mode.mjs +80 -0
  76. package/{esm2020 → esm2022}/src/version.mjs +1 -1
  77. package/{esm2020 → esm2022}/testing/src/logger.mjs +4 -4
  78. package/{esm2020 → esm2022}/testing/src/ng_zone_mock.mjs +4 -4
  79. package/{esm2020 → esm2022}/testing/src/test_bed.mjs +2 -2
  80. package/esm2022/testing/src/test_bed_compiler.mjs +845 -0
  81. package/{fesm2020 → fesm2022}/core.mjs +15745 -15364
  82. package/fesm2022/core.mjs.map +1 -0
  83. package/fesm2022/rxjs-interop.mjs +104 -0
  84. package/fesm2022/rxjs-interop.mjs.map +1 -0
  85. package/{fesm2020 → fesm2022}/testing.mjs +913 -176
  86. package/fesm2022/testing.mjs.map +1 -0
  87. package/index.d.ts +459 -211
  88. package/package.json +14 -16
  89. package/rxjs-interop/index.d.ts +95 -0
  90. package/schematics/migrations/guard-and-resolve-interfaces/bundle.js +694 -0
  91. package/schematics/migrations/guard-and-resolve-interfaces/bundle.js.map +7 -0
  92. package/schematics/migrations/{router-link-with-href → remove-module-id}/bundle.js +153 -155
  93. package/schematics/migrations/remove-module-id/bundle.js.map +7 -0
  94. package/schematics/migrations.json +8 -8
  95. package/schematics/ng-generate/standalone-migration/bundle.js +928 -562
  96. package/schematics/ng-generate/standalone-migration/bundle.js.map +2 -2
  97. package/testing/index.d.ts +1 -1
  98. package/esm2020/src/application_ref.mjs +0 -907
  99. package/esm2020/src/change_detection/differs/iterable_differs.mjs +0 -81
  100. package/esm2020/src/change_detection/differs/keyvalue_differs.mjs +0 -74
  101. package/esm2020/src/core.mjs +0 -55
  102. package/esm2020/src/core_private_export.mjs +0 -38
  103. package/esm2020/src/core_reactivity_export_internal.mjs +0 -9
  104. package/esm2020/src/di/contextual.mjs +0 -37
  105. package/esm2020/src/di/index.mjs +0 -29
  106. package/esm2020/src/di/injector.mjs +0 -62
  107. package/esm2020/src/di/injector_compatibility.mjs +0 -236
  108. package/esm2020/src/di/provider_collection.mjs +0 -279
  109. package/esm2020/src/di/reflective_injector.mjs +0 -311
  110. package/esm2020/src/errors.mjs +0 -48
  111. package/esm2020/src/hydration/annotate.mjs +0 -384
  112. package/esm2020/src/hydration/api.mjs +0 -141
  113. package/esm2020/src/hydration/cleanup.mjs +0 -101
  114. package/esm2020/src/hydration/node_lookup_utils.mjs +0 -275
  115. package/esm2020/src/hydration/utils.mjs +0 -219
  116. package/esm2020/src/linker/component_factory_resolver.mjs +0 -42
  117. package/esm2020/src/linker/query_list.mjs +0 -169
  118. package/esm2020/src/linker/template_ref.mjs +0 -102
  119. package/esm2020/src/metadata/di.mjs +0 -108
  120. package/esm2020/src/metadata.mjs +0 -18
  121. package/esm2020/src/render3/component_ref.mjs +0 -377
  122. package/esm2020/src/render3/features/standalone_feature.mjs +0 -70
  123. package/esm2020/src/render3/instructions/listener.mjs +0 -243
  124. package/esm2020/src/render3/interfaces/view.mjs +0 -47
  125. package/esm2020/src/render3/jit/module.mjs +0 -544
  126. package/esm2020/src/render3/ng_module_ref.mjs +0 -132
  127. package/esm2020/src/render3/node_manipulation.mjs +0 -961
  128. package/esm2020/src/render3/view_ref.mjs +0 -306
  129. package/esm2020/src/signals/index.mjs +0 -16
  130. package/esm2020/src/signals/src/api.mjs +0 -46
  131. package/esm2020/src/signals/src/computed.mjs +0 -142
  132. package/esm2020/src/signals/src/effect.mjs +0 -67
  133. package/esm2020/src/signals/src/graph.mjs +0 -114
  134. package/esm2020/src/signals/src/signal.mjs +0 -78
  135. package/esm2020/src/signals/src/watch.mjs +0 -54
  136. package/esm2020/src/signals/src/weak_ref.mjs +0 -27
  137. package/esm2020/src/transfer_state.mjs +0 -153
  138. package/esm2020/src/util/ng_dev_mode.mjs +0 -79
  139. package/esm2020/testing/src/test_bed_compiler.mjs +0 -846
  140. package/fesm2015/core.mjs +0 -30473
  141. package/fesm2015/core.mjs.map +0 -1
  142. package/fesm2015/testing.mjs +0 -26417
  143. package/fesm2015/testing.mjs.map +0 -1
  144. package/fesm2020/core.mjs.map +0 -1
  145. package/fesm2020/testing.mjs.map +0 -1
  146. package/schematics/migrations/relative-link-resolution/bundle.js +0 -283
  147. package/schematics/migrations/relative-link-resolution/bundle.js.map +0 -7
  148. package/schematics/migrations/router-link-with-href/bundle.js.map +0 -7
  149. /package/{esm2020 → esm2022}/core.mjs +0 -0
  150. /package/{esm2020 → esm2022}/index.mjs +0 -0
  151. /package/{esm2020 → esm2022}/public_api.mjs +0 -0
  152. /package/{esm2020 → esm2022}/src/application_config.mjs +0 -0
  153. /package/{esm2020 → esm2022}/src/application_tokens.mjs +0 -0
  154. /package/{esm2020 → esm2022}/src/change_detection/change_detection.mjs +0 -0
  155. /package/{esm2020 → esm2022}/src/change_detection/constants.mjs +0 -0
  156. /package/{esm2020 → esm2022}/src/change_detection/differs/default_iterable_differ.mjs +0 -0
  157. /package/{esm2020 → esm2022}/src/change_detection/differs/default_keyvalue_differ.mjs +0 -0
  158. /package/{esm2020 → esm2022}/src/change_detection/pipe_transform.mjs +0 -0
  159. /package/{esm2020 → esm2022}/src/change_detection.mjs +0 -0
  160. /package/{esm2020 → esm2022}/src/compiler/compiler_facade.mjs +0 -0
  161. /package/{esm2020 → esm2022}/src/compiler/compiler_facade_interface.mjs +0 -0
  162. /package/{esm2020 → esm2022}/src/core_reactivity_export.mjs +0 -0
  163. /package/{esm2020 → esm2022}/src/core_render3_private_export.mjs +0 -0
  164. /package/{esm2020 → esm2022}/src/debug/debug_node.mjs +0 -0
  165. /package/{esm2020 → esm2022}/src/di/create_injector.mjs +0 -0
  166. /package/{esm2020 → esm2022}/src/di/forward_ref.mjs +0 -0
  167. /package/{esm2020 → esm2022}/src/di/initializer_token.mjs +0 -0
  168. /package/{esm2020 → esm2022}/src/di/inject_switch.mjs +0 -0
  169. /package/{esm2020 → esm2022}/src/di/injectable.mjs +0 -0
  170. /package/{esm2020 → esm2022}/src/di/injection_token.mjs +0 -0
  171. /package/{esm2020 → esm2022}/src/di/injector_marker.mjs +0 -0
  172. /package/{esm2020 → esm2022}/src/di/injector_token.mjs +0 -0
  173. /package/{esm2020 → esm2022}/src/di/interface/defs.mjs +0 -0
  174. /package/{esm2020 → esm2022}/src/di/interface/injector.mjs +0 -0
  175. /package/{esm2020 → esm2022}/src/di/interface/provider.mjs +0 -0
  176. /package/{esm2020 → esm2022}/src/di/internal_tokens.mjs +0 -0
  177. /package/{esm2020 → esm2022}/src/di/jit/environment.mjs +0 -0
  178. /package/{esm2020 → esm2022}/src/di/jit/injectable.mjs +0 -0
  179. /package/{esm2020 → esm2022}/src/di/jit/util.mjs +0 -0
  180. /package/{esm2020 → esm2022}/src/di/metadata.mjs +0 -0
  181. /package/{esm2020 → esm2022}/src/di/metadata_attr.mjs +0 -0
  182. /package/{esm2020 → esm2022}/src/di/null_injector.mjs +0 -0
  183. /package/{esm2020 → esm2022}/src/di/provider_token.mjs +0 -0
  184. /package/{esm2020 → esm2022}/src/di/r3_injector.mjs +0 -0
  185. /package/{esm2020 → esm2022}/src/di/reflective_errors.mjs +0 -0
  186. /package/{esm2020 → esm2022}/src/di/reflective_key.mjs +0 -0
  187. /package/{esm2020 → esm2022}/src/di/reflective_provider.mjs +0 -0
  188. /package/{esm2020 → esm2022}/src/di/scope.mjs +0 -0
  189. /package/{esm2020 → esm2022}/src/di.mjs +0 -0
  190. /package/{esm2020 → esm2022}/src/error_details_base_url.mjs +0 -0
  191. /package/{esm2020 → esm2022}/src/error_handler.mjs +0 -0
  192. /package/{esm2020 → esm2022}/src/event_emitter.mjs +0 -0
  193. /package/{esm2020 → esm2022}/src/hydration/compression.mjs +0 -0
  194. /package/{esm2020 → esm2022}/src/hydration/error_handling.mjs +0 -0
  195. /package/{esm2020 → esm2022}/src/hydration/interfaces.mjs +0 -0
  196. /package/{esm2020 → esm2022}/src/hydration/skip_hydration.mjs +0 -0
  197. /package/{esm2020 → esm2022}/src/hydration/tokens.mjs +0 -0
  198. /package/{esm2020 → esm2022}/src/hydration/views.mjs +0 -0
  199. /package/{esm2020 → esm2022}/src/i18n/locale_data_api.mjs +0 -0
  200. /package/{esm2020 → esm2022}/src/i18n/locale_en.mjs +0 -0
  201. /package/{esm2020 → esm2022}/src/i18n/localization.mjs +0 -0
  202. /package/{esm2020 → esm2022}/src/i18n/tokens.mjs +0 -0
  203. /package/{esm2020 → esm2022}/src/interface/lifecycle_hooks.mjs +0 -0
  204. /package/{esm2020 → esm2022}/src/interface/simple_change.mjs +0 -0
  205. /package/{esm2020 → esm2022}/src/interface/type.mjs +0 -0
  206. /package/{esm2020 → esm2022}/src/linker/ng_module_factory.mjs +0 -0
  207. /package/{esm2020 → esm2022}/src/linker/ng_module_factory_loader.mjs +0 -0
  208. /package/{esm2020 → esm2022}/src/linker/ng_module_factory_loader_impl.mjs +0 -0
  209. /package/{esm2020 → esm2022}/src/linker/ng_module_registration.mjs +0 -0
  210. /package/{esm2020 → esm2022}/src/linker.mjs +0 -0
  211. /package/{esm2020 → esm2022}/src/metadata/ng_module_def.mjs +0 -0
  212. /package/{esm2020 → esm2022}/src/metadata/resource_loading.mjs +0 -0
  213. /package/{esm2020 → esm2022}/src/metadata/schema.mjs +0 -0
  214. /package/{esm2020 → esm2022}/src/metadata/view.mjs +0 -0
  215. /package/{esm2020 → esm2022}/src/platform_core_providers.mjs +0 -0
  216. /package/{esm2020 → esm2022}/src/r3_symbols.mjs +0 -0
  217. /package/{esm2020 → esm2022}/src/reflection/platform_reflection_capabilities.mjs +0 -0
  218. /package/{esm2020 → esm2022}/src/reflection/reflection_capabilities.mjs +0 -0
  219. /package/{esm2020 → esm2022}/src/render/api_flags.mjs +0 -0
  220. /package/{esm2020 → esm2022}/src/render.mjs +0 -0
  221. /package/{esm2020 → esm2022}/src/render3/assert.mjs +0 -0
  222. /package/{esm2020 → esm2022}/src/render3/bindings.mjs +0 -0
  223. /package/{esm2020 → esm2022}/src/render3/collect_native_nodes.mjs +0 -0
  224. /package/{esm2020 → esm2022}/src/render3/component.mjs +0 -0
  225. /package/{esm2020 → esm2022}/src/render3/definition.mjs +0 -0
  226. /package/{esm2020 → esm2022}/src/render3/definition_factory.mjs +0 -0
  227. /package/{esm2020 → esm2022}/src/render3/di.mjs +0 -0
  228. /package/{esm2020 → esm2022}/src/render3/di_setup.mjs +0 -0
  229. /package/{esm2020 → esm2022}/src/render3/errors.mjs +0 -0
  230. /package/{esm2020 → esm2022}/src/render3/errors_di.mjs +0 -0
  231. /package/{esm2020 → esm2022}/src/render3/features/copy_definition_feature.mjs +0 -0
  232. /package/{esm2020 → esm2022}/src/render3/features/host_directives_feature.mjs +0 -0
  233. /package/{esm2020 → esm2022}/src/render3/features/inherit_definition_feature.mjs +0 -0
  234. /package/{esm2020 → esm2022}/src/render3/features/ng_onchanges_feature.mjs +0 -0
  235. /package/{esm2020 → esm2022}/src/render3/features/providers_feature.mjs +0 -0
  236. /package/{esm2020 → esm2022}/src/render3/fields.mjs +0 -0
  237. /package/{esm2020 → esm2022}/src/render3/global_utils_api.mjs +0 -0
  238. /package/{esm2020 → esm2022}/src/render3/hooks.mjs +0 -0
  239. /package/{esm2020 → esm2022}/src/render3/i18n/i18n_apply.mjs +0 -0
  240. /package/{esm2020 → esm2022}/src/render3/i18n/i18n_debug.mjs +0 -0
  241. /package/{esm2020 → esm2022}/src/render3/i18n/i18n_insert_before_index.mjs +0 -0
  242. /package/{esm2020 → esm2022}/src/render3/i18n/i18n_locale_id.mjs +0 -0
  243. /package/{esm2020 → esm2022}/src/render3/i18n/i18n_parse.mjs +0 -0
  244. /package/{esm2020 → esm2022}/src/render3/i18n/i18n_postprocess.mjs +0 -0
  245. /package/{esm2020 → esm2022}/src/render3/i18n/i18n_tree_shaking.mjs +0 -0
  246. /package/{esm2020 → esm2022}/src/render3/i18n/i18n_util.mjs +0 -0
  247. /package/{esm2020 → esm2022}/src/render3/index.mjs +0 -0
  248. /package/{esm2020 → esm2022}/src/render3/instructions/advance.mjs +0 -0
  249. /package/{esm2020 → esm2022}/src/render3/instructions/all.mjs +0 -0
  250. /package/{esm2020 → esm2022}/src/render3/instructions/attribute.mjs +0 -0
  251. /package/{esm2020 → esm2022}/src/render3/instructions/attribute_interpolation.mjs +0 -0
  252. /package/{esm2020 → esm2022}/src/render3/instructions/change_detection.mjs +0 -0
  253. /package/{esm2020 → esm2022}/src/render3/instructions/class_map_interpolation.mjs +0 -0
  254. /package/{esm2020 → esm2022}/src/render3/instructions/di.mjs +0 -0
  255. /package/{esm2020 → esm2022}/src/render3/instructions/di_attr.mjs +0 -0
  256. /package/{esm2020 → esm2022}/src/render3/instructions/element_validation.mjs +0 -0
  257. /package/{esm2020 → esm2022}/src/render3/instructions/get_current_view.mjs +0 -0
  258. /package/{esm2020 → esm2022}/src/render3/instructions/host_property.mjs +0 -0
  259. /package/{esm2020 → esm2022}/src/render3/instructions/i18n.mjs +0 -0
  260. /package/{esm2020 → esm2022}/src/render3/instructions/i18n_icu_container_visitor.mjs +0 -0
  261. /package/{esm2020 → esm2022}/src/render3/instructions/interpolation.mjs +0 -0
  262. /package/{esm2020 → esm2022}/src/render3/instructions/namespace.mjs +0 -0
  263. /package/{esm2020 → esm2022}/src/render3/instructions/next_context.mjs +0 -0
  264. /package/{esm2020 → esm2022}/src/render3/instructions/projection.mjs +0 -0
  265. /package/{esm2020 → esm2022}/src/render3/instructions/property.mjs +0 -0
  266. /package/{esm2020 → esm2022}/src/render3/instructions/property_interpolation.mjs +0 -0
  267. /package/{esm2020 → esm2022}/src/render3/instructions/storage.mjs +0 -0
  268. /package/{esm2020 → esm2022}/src/render3/instructions/style_map_interpolation.mjs +0 -0
  269. /package/{esm2020 → esm2022}/src/render3/instructions/style_prop_interpolation.mjs +0 -0
  270. /package/{esm2020 → esm2022}/src/render3/instructions/template.mjs +0 -0
  271. /package/{esm2020 → esm2022}/src/render3/instructions/text.mjs +0 -0
  272. /package/{esm2020 → esm2022}/src/render3/instructions/text_interpolation.mjs +0 -0
  273. /package/{esm2020 → esm2022}/src/render3/interfaces/container.mjs +0 -0
  274. /package/{esm2020 → esm2022}/src/render3/interfaces/context.mjs +0 -0
  275. /package/{esm2020 → esm2022}/src/render3/interfaces/definition.mjs +0 -0
  276. /package/{esm2020 → esm2022}/src/render3/interfaces/document.mjs +0 -0
  277. /package/{esm2020 → esm2022}/src/render3/interfaces/i18n.mjs +0 -0
  278. /package/{esm2020 → esm2022}/src/render3/interfaces/injector.mjs +0 -0
  279. /package/{esm2020 → esm2022}/src/render3/interfaces/lview_tracking.mjs +0 -0
  280. /package/{esm2020 → esm2022}/src/render3/interfaces/node.mjs +0 -0
  281. /package/{esm2020 → esm2022}/src/render3/interfaces/projection.mjs +0 -0
  282. /package/{esm2020 → esm2022}/src/render3/interfaces/public_definitions.mjs +0 -0
  283. /package/{esm2020 → esm2022}/src/render3/interfaces/query.mjs +0 -0
  284. /package/{esm2020 → esm2022}/src/render3/interfaces/renderer.mjs +0 -0
  285. /package/{esm2020 → esm2022}/src/render3/interfaces/renderer_dom.mjs +0 -0
  286. /package/{esm2020 → esm2022}/src/render3/interfaces/sanitization.mjs +0 -0
  287. /package/{esm2020 → esm2022}/src/render3/interfaces/styling.mjs +0 -0
  288. /package/{esm2020 → esm2022}/src/render3/interfaces/type_checks.mjs +0 -0
  289. /package/{esm2020 → esm2022}/src/render3/jit/directive.mjs +0 -0
  290. /package/{esm2020 → esm2022}/src/render3/jit/environment.mjs +0 -0
  291. /package/{esm2020 → esm2022}/src/render3/jit/jit_options.mjs +0 -0
  292. /package/{esm2020 → esm2022}/src/render3/jit/module_patch.mjs +0 -0
  293. /package/{esm2020 → esm2022}/src/render3/jit/partial.mjs +0 -0
  294. /package/{esm2020 → esm2022}/src/render3/jit/pipe.mjs +0 -0
  295. /package/{esm2020 → esm2022}/src/render3/jit/util.mjs +0 -0
  296. /package/{esm2020 → esm2022}/src/render3/metadata.mjs +0 -0
  297. /package/{esm2020 → esm2022}/src/render3/namespaces.mjs +0 -0
  298. /package/{esm2020 → esm2022}/src/render3/node_assert.mjs +0 -0
  299. /package/{esm2020 → esm2022}/src/render3/node_manipulation_i18n.mjs +0 -0
  300. /package/{esm2020 → esm2022}/src/render3/node_selector_matcher.mjs +0 -0
  301. /package/{esm2020 → esm2022}/src/render3/pipe.mjs +0 -0
  302. /package/{esm2020 → esm2022}/src/render3/profiler.mjs +0 -0
  303. /package/{esm2020 → esm2022}/src/render3/pure_function.mjs +0 -0
  304. /package/{esm2020 → esm2022}/src/render3/query.mjs +0 -0
  305. /package/{esm2020 → esm2022}/src/render3/state.mjs +0 -0
  306. /package/{esm2020 → esm2022}/src/render3/styling/class_differ.mjs +0 -0
  307. /package/{esm2020 → esm2022}/src/render3/styling/static_styling.mjs +0 -0
  308. /package/{esm2020 → esm2022}/src/render3/styling/style_binding_list.mjs +0 -0
  309. /package/{esm2020 → esm2022}/src/render3/styling/styling_parser.mjs +0 -0
  310. /package/{esm2020 → esm2022}/src/render3/tokens.mjs +0 -0
  311. /package/{esm2020 → esm2022}/src/render3/util/attrs_utils.mjs +0 -0
  312. /package/{esm2020 → esm2022}/src/render3/util/discovery_utils.mjs +0 -0
  313. /package/{esm2020 → esm2022}/src/render3/util/global_utils.mjs +0 -0
  314. /package/{esm2020 → esm2022}/src/render3/util/injector_utils.mjs +0 -0
  315. /package/{esm2020 → esm2022}/src/render3/util/misc_utils.mjs +0 -0
  316. /package/{esm2020 → esm2022}/src/render3/util/stringify_utils.mjs +0 -0
  317. /package/{esm2020 → esm2022}/src/render3/util/view_traversal_utils.mjs +0 -0
  318. /package/{esm2020 → esm2022}/src/render3/util/view_utils.mjs +0 -0
  319. /package/{esm2020 → esm2022}/src/render3/view_engine_compatibility_prebound.mjs +0 -0
  320. /package/{esm2020 → esm2022}/src/sanitization/bypass.mjs +0 -0
  321. /package/{esm2020 → esm2022}/src/sanitization/html_sanitizer.mjs +0 -0
  322. /package/{esm2020 → esm2022}/src/sanitization/iframe_attrs_validation.mjs +0 -0
  323. /package/{esm2020 → esm2022}/src/sanitization/inert_body.mjs +0 -0
  324. /package/{esm2020 → esm2022}/src/sanitization/security.mjs +0 -0
  325. /package/{esm2020 → esm2022}/src/sanitization/url_sanitizer.mjs +0 -0
  326. /package/{esm2020 → esm2022}/src/signals/src/untracked.mjs +0 -0
  327. /package/{esm2020 → esm2022}/src/util/array_utils.mjs +0 -0
  328. /package/{esm2020 → esm2022}/src/util/assert.mjs +0 -0
  329. /package/{esm2020 → esm2022}/src/util/char_code.mjs +0 -0
  330. /package/{esm2020 → esm2022}/src/util/closure.mjs +0 -0
  331. /package/{esm2020 → esm2022}/src/util/coercion.mjs +0 -0
  332. /package/{esm2020 → esm2022}/src/util/comparison.mjs +0 -0
  333. /package/{esm2020 → esm2022}/src/util/decorators.mjs +0 -0
  334. /package/{esm2020 → esm2022}/src/util/dom.mjs +0 -0
  335. /package/{esm2020 → esm2022}/src/util/empty.mjs +0 -0
  336. /package/{esm2020 → esm2022}/src/util/errors.mjs +0 -0
  337. /package/{esm2020 → esm2022}/src/util/global.mjs +0 -0
  338. /package/{esm2020 → esm2022}/src/util/is_dev_mode.mjs +0 -0
  339. /package/{esm2020 → esm2022}/src/util/iterable.mjs +0 -0
  340. /package/{esm2020 → esm2022}/src/util/lang.mjs +0 -0
  341. /package/{esm2020 → esm2022}/src/util/microtask.mjs +0 -0
  342. /package/{esm2020 → esm2022}/src/util/ng_i18n_closure_mode.mjs +0 -0
  343. /package/{esm2020 → esm2022}/src/util/ng_jit_mode.mjs +0 -0
  344. /package/{esm2020 → esm2022}/src/util/ng_reflect.mjs +0 -0
  345. /package/{esm2020 → esm2022}/src/util/noop.mjs +0 -0
  346. /package/{esm2020 → esm2022}/src/util/property.mjs +0 -0
  347. /package/{esm2020 → esm2022}/src/util/raf.mjs +0 -0
  348. /package/{esm2020 → esm2022}/src/util/security/trusted_type_defs.mjs +0 -0
  349. /package/{esm2020 → esm2022}/src/util/security/trusted_types.mjs +0 -0
  350. /package/{esm2020 → esm2022}/src/util/security/trusted_types_bypass.mjs +0 -0
  351. /package/{esm2020 → esm2022}/src/util/stringify.mjs +0 -0
  352. /package/{esm2020 → esm2022}/src/view/provider_flags.mjs +0 -0
  353. /package/{esm2020 → esm2022}/src/zone/async-stack-tagging.mjs +0 -0
  354. /package/{esm2020 → esm2022}/src/zone/ng_zone.mjs +0 -0
  355. /package/{esm2020 → esm2022}/src/zone.mjs +0 -0
  356. /package/{esm2020 → esm2022}/testing/index.mjs +0 -0
  357. /package/{esm2020 → esm2022}/testing/public_api.mjs +0 -0
  358. /package/{esm2020 → esm2022}/testing/src/async.mjs +0 -0
  359. /package/{esm2020 → esm2022}/testing/src/component_fixture.mjs +0 -0
  360. /package/{esm2020 → esm2022}/testing/src/fake_async.mjs +0 -0
  361. /package/{esm2020 → esm2022}/testing/src/metadata_override.mjs +0 -0
  362. /package/{esm2020 → esm2022}/testing/src/metadata_overrider.mjs +0 -0
  363. /package/{esm2020 → esm2022}/testing/src/resolvers.mjs +0 -0
  364. /package/{esm2020 → esm2022}/testing/src/styling.mjs +0 -0
  365. /package/{esm2020 → esm2022}/testing/src/test_bed_common.mjs +0 -0
  366. /package/{esm2020 → esm2022}/testing/src/test_hooks.mjs +0 -0
  367. /package/{esm2020 → esm2022}/testing/src/testing.mjs +0 -0
  368. /package/{esm2020 → esm2022}/testing/src/testing_internal.mjs +0 -0
  369. /package/{esm2020 → esm2022}/testing/testing.mjs +0 -0
@@ -0,0 +1,176 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { first } from 'rxjs/operators';
9
+ import { APP_BOOTSTRAP_LISTENER, ApplicationRef } from '../application_ref';
10
+ import { PLATFORM_ID } from '../application_tokens';
11
+ import { Console } from '../console';
12
+ import { ENVIRONMENT_INITIALIZER, makeEnvironmentProviders } from '../di';
13
+ import { inject } from '../di/injector_compatibility';
14
+ import { InitialRenderPendingTasks } from '../initial_render_pending_tasks';
15
+ import { enableLocateOrCreateContainerRefImpl } from '../linker/view_container_ref';
16
+ import { enableLocateOrCreateElementNodeImpl } from '../render3/instructions/element';
17
+ import { enableLocateOrCreateElementContainerNodeImpl } from '../render3/instructions/element_container';
18
+ import { enableApplyRootElementTransformImpl } from '../render3/instructions/shared';
19
+ import { enableLocateOrCreateContainerAnchorImpl } from '../render3/instructions/template';
20
+ import { enableLocateOrCreateTextNodeImpl } from '../render3/instructions/text';
21
+ import { cleanupDehydratedViews } from './cleanup';
22
+ import { IS_HYDRATION_FEATURE_ENABLED, PRESERVE_HOST_CONTENT } from './tokens';
23
+ import { enableRetrieveHydrationInfoImpl } from './utils';
24
+ import { enableFindMatchingDehydratedViewImpl } from './views';
25
+ /**
26
+ * Indicates whether the hydration-related code was added,
27
+ * prevents adding it multiple times.
28
+ */
29
+ let isHydrationSupportEnabled = false;
30
+ /**
31
+ * Brings the necessary hydration code in tree-shakable manner.
32
+ * The code is only present when the `provideHydrationSupport` is
33
+ * invoked. Otherwise, this code is tree-shaken away during the
34
+ * build optimization step.
35
+ *
36
+ * This technique allows us to swap implementations of methods so
37
+ * tree shaking works appropriately when hydration is disabled or
38
+ * enabled. It brings in the appropriate version of the method that
39
+ * supports hydration only when enabled.
40
+ */
41
+ function enableHydrationRuntimeSupport() {
42
+ if (!isHydrationSupportEnabled) {
43
+ isHydrationSupportEnabled = true;
44
+ enableRetrieveHydrationInfoImpl();
45
+ enableLocateOrCreateElementNodeImpl();
46
+ enableLocateOrCreateTextNodeImpl();
47
+ enableLocateOrCreateElementContainerNodeImpl();
48
+ enableLocateOrCreateContainerAnchorImpl();
49
+ enableLocateOrCreateContainerRefImpl();
50
+ enableFindMatchingDehydratedViewImpl();
51
+ enableApplyRootElementTransformImpl();
52
+ }
53
+ }
54
+ /**
55
+ * Detects whether the code is invoked in a browser.
56
+ * Later on, this check should be replaced with a tree-shakable
57
+ * flag (e.g. `!isServer`).
58
+ */
59
+ function isBrowser() {
60
+ return inject(PLATFORM_ID) === 'browser';
61
+ }
62
+ /**
63
+ * Outputs a message with hydration stats into a console.
64
+ */
65
+ function printHydrationStats(console) {
66
+ const message = `Angular hydrated ${ngDevMode.hydratedComponents} component(s) ` +
67
+ `and ${ngDevMode.hydratedNodes} node(s), ` +
68
+ `${ngDevMode.componentsSkippedHydration} component(s) were skipped. ` +
69
+ `Learn more at https://angular.io/guides/hydration.`;
70
+ // tslint:disable-next-line:no-console
71
+ console.log(message);
72
+ }
73
+ /**
74
+ * Returns a Promise that is resolved when an application becomes stable.
75
+ */
76
+ function whenStable(appRef, pendingTasks) {
77
+ const isStablePromise = appRef.isStable.pipe(first((isStable) => isStable)).toPromise();
78
+ const pendingTasksPromise = pendingTasks.whenAllTasksComplete;
79
+ return Promise.allSettled([isStablePromise, pendingTasksPromise]);
80
+ }
81
+ /**
82
+ * Returns a set of providers required to setup hydration support
83
+ * for an application that is server side rendered.
84
+ *
85
+ * ## NgModule-based bootstrap
86
+ *
87
+ * You can add the function call to the root AppModule of an application:
88
+ * ```
89
+ * import {provideHydrationSupport} from '@angular/core';
90
+ *
91
+ * @NgModule({
92
+ * providers: [
93
+ * // ... other providers ...
94
+ * provideHydrationSupport()
95
+ * ],
96
+ * declarations: [AppComponent],
97
+ * bootstrap: [AppComponent]
98
+ * })
99
+ * class AppModule {}
100
+ * ```
101
+ *
102
+ * ## Standalone-based bootstrap
103
+ *
104
+ * Add the function to the `bootstrapApplication` call:
105
+ * ```
106
+ * import {provideHydrationSupport} from '@angular/core';
107
+ *
108
+ * bootstrapApplication(RootComponent, {
109
+ * providers: [
110
+ * // ... other providers ...
111
+ * provideHydrationSupport()
112
+ * ]
113
+ * });
114
+ * ```
115
+ *
116
+ * The function sets up an internal flag that would be recognized during
117
+ * the server side rendering time as well, so there is no need to
118
+ * configure or change anything in NgUniversal to enable the feature.
119
+ *
120
+ * @publicApi
121
+ * @developerPreview
122
+ */
123
+ export function provideHydrationSupport() {
124
+ return makeEnvironmentProviders([
125
+ {
126
+ provide: ENVIRONMENT_INITIALIZER,
127
+ useValue: () => {
128
+ // Since this function is used across both server and client,
129
+ // make sure that the runtime code is only added when invoked
130
+ // on the client. Moving forward, the `isBrowser` check should
131
+ // be replaced with a tree-shakable alternative (e.g. `isServer`
132
+ // flag).
133
+ if (isBrowser()) {
134
+ enableHydrationRuntimeSupport();
135
+ }
136
+ },
137
+ multi: true,
138
+ },
139
+ {
140
+ provide: IS_HYDRATION_FEATURE_ENABLED,
141
+ useValue: true,
142
+ },
143
+ {
144
+ provide: PRESERVE_HOST_CONTENT,
145
+ // Preserve host element content only in a browser
146
+ // environment. On a server, an application is rendered
147
+ // from scratch, so the host content needs to be empty.
148
+ useFactory: () => isBrowser(),
149
+ },
150
+ {
151
+ provide: APP_BOOTSTRAP_LISTENER,
152
+ useFactory: () => {
153
+ if (isBrowser()) {
154
+ const appRef = inject(ApplicationRef);
155
+ const pendingTasks = inject(InitialRenderPendingTasks);
156
+ const console = inject(Console);
157
+ return () => {
158
+ whenStable(appRef, pendingTasks).then(() => {
159
+ // Wait until an app becomes stable and cleanup all views that
160
+ // were not claimed during the application bootstrap process.
161
+ // The timing is similar to when we start the serialization process
162
+ // on the server.
163
+ cleanupDehydratedViews(appRef);
164
+ if (typeof ngDevMode !== 'undefined' && ngDevMode) {
165
+ printHydrationStats(console);
166
+ }
167
+ });
168
+ };
169
+ }
170
+ return () => { }; // noop
171
+ },
172
+ multi: true,
173
+ }
174
+ ]);
175
+ }
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvaHlkcmF0aW9uL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFckMsT0FBTyxFQUFDLHNCQUFzQixFQUFFLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzFFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyx1QkFBdUIsRUFBd0Isd0JBQXdCLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDOUYsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3BELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxvQ0FBb0MsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ2xGLE9BQU8sRUFBQyxtQ0FBbUMsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BGLE9BQU8sRUFBQyw0Q0FBNEMsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3ZHLE9BQU8sRUFBQyxtQ0FBbUMsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ25GLE9BQU8sRUFBQyx1Q0FBdUMsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxnQ0FBZ0MsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRTlFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqRCxPQUFPLEVBQUMsNEJBQTRCLEVBQUUscUJBQXFCLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDN0UsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ3hELE9BQU8s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RCxtRUFBbUU7NEJBQ25FLGlCQUFpQjs0QkFDakIsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBRS9CLElBQUksT0FBTyxTQUFTLEtBQUssV0FBVyxJQUFJLFNBQVMsRUFBRTtnQ0FDakQsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7NkJBQzlCO3dCQUNILENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUMsQ0FBQztpQkFDSDtnQkFDRCxPQUFPLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFFLE9BQU87WUFDM0IsQ0FBQztZQUNELEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7Zmlyc3R9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtBUFBfQk9PVFNUUkFQX0xJU1RFTkVSLCBBcHBsaWNhdGlvblJlZn0gZnJvbSAnLi4vYXBwbGljYXRpb25fcmVmJztcbmltcG9ydCB7UExBVEZPUk1fSUR9IGZyb20gJy4uL2FwcGxpY2F0aW9uX3Rva2Vucyc7XG5pbXBvcnQge0NvbnNvbGV9IGZyb20gJy4uL2NvbnNvbGUnO1xuaW1wb3J0IHtFTlZJUk9OTUVOVF9JTklUSUFMSVpFUiwgRW52aXJvbm1lbnRQcm92aWRlcnMsIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVyc30gZnJvbSAnLi4vZGknO1xuaW1wb3J0IHtpbmplY3R9IGZyb20gJy4uL2RpL2luamVjdG9yX2NvbXBhdGliaWxpdHknO1xuaW1wb3J0IHtJbml0aWFsUmVuZGVyUGVuZGluZ1Rhc2tzfSBmcm9tICcuLi9pbml0aWFsX3JlbmRlcl9wZW5kaW5nX3Rhc2tzJztcbmltcG9ydCB7ZW5hYmxlTG9jYXRlT3JDcmVhdGVDb250YWluZXJSZWZJbXBsfSBmcm9tICcuLi9saW5rZXIvdmlld19jb250YWluZXJfcmVmJztcbmltcG9ydCB7ZW5hYmxlTG9jYXRlT3JDcmVhdGVFbGVtZW50Tm9kZUltcGx9IGZyb20gJy4uL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2VsZW1lbnQnO1xuaW1wb3J0IHtlbmFibGVMb2NhdGVPckNyZWF0ZUVsZW1lbnRDb250YWluZXJOb2RlSW1wbH0gZnJvbSAnLi4vcmVuZGVyMy9pbnN0cnVjdGlvbnMvZWxlbWVudF9jb250YWluZXInO1xuaW1wb3J0IHtlbmFibGVBcHBseVJvb3RFbGVtZW50VHJhbnNmb3JtSW1wbH0gZnJvbSAnLi4vcmVuZGVyMy9pbnN0cnVjdGlvbnMvc2hhcmVkJztcbmltcG9ydCB7ZW5hYmxlTG9jYXRlT3JDcmVhdGVDb250YWluZXJBbmNob3JJbXBsfSBmcm9tICcuLi9yZW5kZXIzL2luc3RydWN0aW9ucy90ZW1wbGF0ZSc7XG5pbXBvcnQge2VuYWJsZUxvY2F0ZU9yQ3JlYXRlVGV4dE5vZGVJbXBsfSBmcm9tICcuLi9yZW5kZXIzL2luc3RydWN0aW9ucy90ZXh0JztcblxuaW1wb3J0IHtjbGVhbnVwRGVoeWRyYXRlZFZpZXdzfSBmcm9tICcuL2NsZWFudXAnO1xuaW1wb3J0IHtJU19IWURSQVRJT05fRkVBVFVSRV9FTkFCTEVELCBQUkVTRVJWRV9IT1NUX0NPTlRFTlR9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7ZW5hYmxlUmV0cmlldmVIeWRyYXRpb25JbmZvSW1wbH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge2VuYWJsZUZpbmRNYXRjaGluZ0RlaHlkcmF0ZWRWaWV3SW1wbH0gZnJvbSAnLi92aWV3cyc7XG5cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaHlkcmF0aW9uLXJlbGF0ZWQgY29kZSB3YXMgYWRkZWQsXG4gKiBwcmV2ZW50cyBhZGRpbmcgaXQgbXVsdGlwbGUgdGltZXMuXG4gKi9cbmxldCBpc0h5ZHJhdGlvblN1cHBvcnRFbmFibGVkID0gZmFsc2U7XG5cbi8qKlxuICogQnJpbmdzIHRoZSBuZWNlc3NhcnkgaHlkcmF0aW9uIGNvZGUgaW4gdHJlZS1zaGFrYWJsZSBtYW5uZXIuXG4gKiBUaGUgY29kZSBpcyBvbmx5IHByZXNlbnQgd2hlbiB0aGUgYHByb3ZpZGVIeWRyYXRpb25TdXBwb3J0YCBpc1xuICogaW52b2tlZC4gT3RoZXJ3aXNlLCB0aGlzIGNvZGUgaXMgdHJlZS1zaGFrZW4gYXdheSBkdXJpbmcgdGhlXG4gKiBidWlsZCBvcHRpbWl6YXRpb24gc3RlcC5cbiAqXG4gKiBUaGlzIHRlY2huaXF1ZSBhbGxvd3MgdXMgdG8gc3dhcCBpbXBsZW1lbnRhdGlvbnMgb2YgbWV0aG9kcyBzb1xuICogdHJlZSBzaGFraW5nIHdvcmtzIGFwcHJvcHJpYXRlbHkgd2hlbiBoeWRyYXRpb24gaXMgZGlzYWJsZWQgb3JcbiAqIGVuYWJsZWQuIEl0IGJyaW5ncyBpbiB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbiBvZiB0aGUgbWV0aG9kIHRoYXRcbiAqIHN1cHBvcnRzIGh5ZHJhdGlvbiBvbmx5IHdoZW4gZW5hYmxlZC5cbiAqL1xuZnVuY3Rpb24gZW5hYmxlSHlkcmF0aW9uUnVudGltZVN1cHBvcnQoKSB7XG4gIGlmICghaXNIeWRyYXRpb25TdXBwb3J0RW5hYmxlZCkge1xuICAgIGlzSHlkcmF0aW9uU3VwcG9ydEVuYWJsZWQgPSB0cnVlO1xuICAgIGVuYWJsZVJldHJpZXZlSHlkcmF0aW9uSW5mb0ltcGwoKTtcbiAgICBlbmFibGVMb2NhdGVPckNyZWF0ZUVsZW1lbnROb2RlSW1wbCgpO1xuICAgIGVuYWJsZUxvY2F0ZU9yQ3JlYXRlVGV4dE5vZGVJbXBsKCk7XG4gICAgZW5hYmxlTG9jYXRlT3JDcmVhdGVFbGVtZW50Q29udGFpbmVyTm9kZUltcGwoKTtcbiAgICBlbmFibGVMb2NhdGVPckNyZWF0ZUNvbnRhaW5lckFuY2hvckltcGwoKTtcbiAgICBlbmFibGVMb2NhdGVPckNyZWF0ZUNvbnRhaW5lclJlZkltcGwoKTtcbiAgICBlbmFibGVGaW5kTWF0Y2hpbmdEZWh5ZHJhdGVkVmlld0ltcGwoKTtcbiAgICBlbmFibGVBcHBseVJvb3RFbGVtZW50VHJhbnNmb3JtSW1wbCgpO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIHRoZSBjb2RlIGlzIGludm9rZWQgaW4gYSBicm93c2VyLlxuICogTGF0ZXIgb24sIHRoaXMgY2hlY2sgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggYSB0cmVlLXNoYWthYmxlXG4gKiBmbGFnIChlLmcuIGAhaXNTZXJ2ZXJgKS5cbiAqL1xuZnVuY3Rpb24gaXNCcm93c2VyKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaW5qZWN0KFBMQVRGT1JNX0lEKSA9PT0gJ2Jyb3dzZXInO1xufVxuXG4vKipcbiAqIE91dHB1dHMgYSBtZXNzYWdlIHdpdGggaHlkcmF0aW9uIHN0YXRzIGludG8gYSBjb25zb2xlLlxuICovXG5mdW5jdGlvbiBwcmludEh5ZHJhdGlvblN0YXRzKGNvbnNvbGU6IENvbnNvbGUpIHtcbiAgY29uc3QgbWVzc2FnZSA9IGBBbmd1bGFyIGh5ZHJhdGVkICR7bmdEZXZNb2RlIS5oeWRyYXRlZENvbXBvbmVudHN9IGNvbXBvbmVudChzKSBgICtcbiAgICAgIGBhbmQgJHtuZ0Rldk1vZGUhLmh5ZHJhdGVkTm9kZXN9IG5vZGUocyksIGAgK1xuICAgICAgYCR7bmdEZXZNb2RlIS5jb21wb25lbnRzU2tpcHBlZEh5ZHJhdGlvbn0gY29tcG9uZW50KHMpIHdlcmUgc2tpcHBlZC4gYCArXG4gICAgICBgTGVhcm4gbW9yZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGVzL2h5ZHJhdGlvbi5gO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbn1cblxuXG4vKipcbiAqIFJldHVybnMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBhbiBhcHBsaWNhdGlvbiBiZWNvbWVzIHN0YWJsZS5cbiAqL1xuZnVuY3Rpb24gd2hlblN0YWJsZShcbiAgICBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLCBwZW5kaW5nVGFza3M6IEluaXRpYWxSZW5kZXJQZW5kaW5nVGFza3MpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgaXNTdGFibGVQcm9taXNlID0gYXBwUmVmLmlzU3RhYmxlLnBpcGUoZmlyc3QoKGlzU3RhYmxlOiBib29sZWFuKSA9PiBpc1N0YWJsZSkpLnRvUHJvbWlzZSgpO1xuICBjb25zdCBwZW5kaW5nVGFza3NQcm9taXNlID0gcGVuZGluZ1Rhc2tzLndoZW5BbGxUYXNrc0NvbXBsZXRlO1xuICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFtpc1N0YWJsZVByb21pc2UsIHBlbmRpbmdUYXNrc1Byb21pc2VdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2V0IG9mIHByb3ZpZGVycyByZXF1aXJlZCB0byBzZXR1cCBoeWRyYXRpb24gc3VwcG9ydFxuICogZm9yIGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgc2VydmVyIHNpZGUgcmVuZGVyZWQuXG4gKlxuICogIyMgTmdNb2R1bGUtYmFzZWQgYm9vdHN0cmFwXG4gKlxuICogWW91IGNhbiBhZGQgdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHJvb3QgQXBwTW9kdWxlIG9mIGFuIGFwcGxpY2F0aW9uOlxuICogYGBgXG4gKiBpbXBvcnQge3Byb3ZpZGVIeWRyYXRpb25TdXBwb3J0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAqXG4gKiBATmdNb2R1bGUoe1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICAvLyAuLi4gb3RoZXIgcHJvdmlkZXJzIC4uLlxuICogICAgIHByb3ZpZGVIeWRyYXRpb25TdXBwb3J0KClcbiAqICAgXSxcbiAqICAgZGVjbGFyYXRpb25zOiBbQXBwQ29tcG9uZW50XSxcbiAqICAgYm9vdHN0cmFwOiBbQXBwQ29tcG9uZW50XVxuICogfSlcbiAqIGNsYXNzIEFwcE1vZHVsZSB7fVxuICogYGBgXG4gKlxuICogIyMgU3RhbmRhbG9uZS1iYXNlZCBib290c3RyYXBcbiAqXG4gKiBBZGQgdGhlIGZ1bmN0aW9uIHRvIHRoZSBgYm9vdHN0cmFwQXBwbGljYXRpb25gIGNhbGw6XG4gKiBgYGBcbiAqIGltcG9ydCB7cHJvdmlkZUh5ZHJhdGlvblN1cHBvcnR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuICpcbiAqIGJvb3RzdHJhcEFwcGxpY2F0aW9uKFJvb3RDb21wb25lbnQsIHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgLy8gLi4uIG90aGVyIHByb3ZpZGVycyAuLi5cbiAqICAgICBwcm92aWRlSHlkcmF0aW9uU3VwcG9ydCgpXG4gKiAgIF1cbiAqIH0pO1xuICogYGBgXG4gKlxuICogVGhlIGZ1bmN0aW9uIHNldHMgdXAgYW4gaW50ZXJuYWwgZmxhZyB0aGF0IHdvdWxkIGJlIHJlY29nbml6ZWQgZHVyaW5nXG4gKiB0aGUgc2VydmVyIHNpZGUgcmVuZGVyaW5nIHRpbWUgYXMgd2VsbCwgc28gdGhlcmUgaXMgbm8gbmVlZCB0b1xuICogY29uZmlndXJlIG9yIGNoYW5nZSBhbnl0aGluZyBpbiBOZ1VuaXZlcnNhbCB0byBlbmFibGUgdGhlIGZlYXR1cmUuXG4gKlxuICogQHB1YmxpY0FwaVxuICogQGRldmVsb3BlclByZXZpZXdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVIeWRyYXRpb25TdXBwb3J0KCk6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAge1xuICAgICAgcHJvdmlkZTogRU5WSVJPTk1FTlRfSU5JVElBTElaRVIsXG4gICAgICB1c2VWYWx1ZTogKCkgPT4ge1xuICAgICAgICAvLyBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgYWNyb3NzIGJvdGggc2VydmVyIGFuZCBjbGllbnQsXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBydW50aW1lIGNvZGUgaXMgb25seSBhZGRlZCB3aGVuIGludm9rZWRcbiAgICAgICAgLy8gb24gdGhlIGNsaWVudC4gTW92aW5nIGZvcndhcmQsIHRoZSBgaXNCcm93c2VyYCBjaGVjayBzaG91bGRcbiAgICAgICAgLy8gYmUgcmVwbGFjZWQgd2l0aCBhIHRyZWUtc2hha2FibGUgYWx0ZXJuYXRpdmUgKGUuZy4gYGlzU2VydmVyYFxuICAgICAgICAvLyBmbGFnKS5cbiAgICAgICAgaWYgKGlzQnJvd3NlcigpKSB7XG4gICAgICAgICAgZW5hYmxlSHlkcmF0aW9uUnVudGltZVN1cHBvcnQoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogSVNfSFlEUkFUSU9OX0ZFQVRVUkVfRU5BQkxFRCxcbiAgICAgIHVzZVZhbHVlOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogUFJFU0VSVkVfSE9TVF9DT05URU5ULFxuICAgICAgLy8gUHJlc2VydmUgaG9zdCBlbGVtZW50IGNvbnRlbnQgb25seSBpbiBhIGJyb3dzZXJcbiAgICAgIC8vIGVudmlyb25tZW50LiBPbiBhIHNlcnZlciwgYW4gYXBwbGljYXRpb24gaXMgcmVuZGVyZWRcbiAgICAgIC8vIGZyb20gc2NyYXRjaCwgc28gdGhlIGhvc3QgY29udGVudCBuZWVkcyB0byBiZSBlbXB0eS5cbiAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IGlzQnJvd3NlcigpLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0JPT1RTVFJBUF9MSVNURU5FUixcbiAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IHtcbiAgICAgICAgaWYgKGlzQnJvd3NlcigpKSB7XG4gICAgICAgICAgY29uc3QgYXBwUmVmID0gaW5qZWN0KEFwcGxpY2F0aW9uUmVmKTtcbiAgICAgICAgICBjb25zdCBwZW5kaW5nVGFza3MgPSBpbmplY3QoSW5pdGlhbFJlbmRlclBlbmRpbmdUYXNrcyk7XG4gICAgICAgICAgY29uc3QgY29uc29sZSA9IGluamVjdChDb25zb2xlKTtcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgd2hlblN0YWJsZShhcHBSZWYsIHBlbmRpbmdUYXNrcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgYW4gYXBwIGJlY29tZXMgc3RhYmxlIGFuZCBjbGVhbnVwIGFsbCB2aWV3cyB0aGF0XG4gICAgICAgICAgICAgIC8vIHdlcmUgbm90IGNsYWltZWQgZHVyaW5nIHRoZSBhcHBsaWNhdGlvbiBib290c3RyYXAgcHJvY2Vzcy5cbiAgICAgICAgICAgICAgLy8gVGhlIHRpbWluZyBpcyBzaW1pbGFyIHRvIHdoZW4gd2Ugc3RhcnQgdGhlIHNlcmlhbGl6YXRpb24gcHJvY2Vzc1xuICAgICAgICAgICAgICAvLyBvbiB0aGUgc2VydmVyLlxuICAgICAgICAgICAgICBjbGVhbnVwRGVoeWRyYXRlZFZpZXdzKGFwcFJlZik7XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgIT09ICd1bmRlZmluZWQnICYmIG5nRGV2TW9kZSkge1xuICAgICAgICAgICAgICAgIHByaW50SHlkcmF0aW9uU3RhdHMoY29uc29sZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpID0+IHt9OyAgLy8gbm9vcFxuICAgICAgfSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH1cbiAgXSk7XG59XG4iXX0=
@@ -0,0 +1,95 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { CONTAINER_HEADER_OFFSET, DEHYDRATED_VIEWS } from '../render3/interfaces/container';
9
+ import { isLContainer } from '../render3/interfaces/type_checks';
10
+ import { HEADER_OFFSET, HOST, PARENT, RENDERER, TVIEW } from '../render3/interfaces/view';
11
+ import { nativeRemoveNode } from '../render3/node_manipulation';
12
+ import { EMPTY_ARRAY } from '../util/empty';
13
+ import { validateSiblingNodeExists } from './error_handling';
14
+ import { NUM_ROOT_NODES } from './interfaces';
15
+ import { getComponentLViewForHydration } from './utils';
16
+ /**
17
+ * Removes all dehydrated views from a given LContainer:
18
+ * both in internal data structure, as well as removing
19
+ * corresponding DOM nodes that belong to that dehydrated view.
20
+ */
21
+ export function removeDehydratedViews(lContainer) {
22
+ const views = lContainer[DEHYDRATED_VIEWS] ?? [];
23
+ const parentLView = lContainer[PARENT];
24
+ const renderer = parentLView[RENDERER];
25
+ for (const view of views) {
26
+ removeDehydratedView(view, renderer);
27
+ ngDevMode && ngDevMode.dehydratedViewsRemoved++;
28
+ }
29
+ // Reset the value to an empty array to indicate that no
30
+ // further processing of dehydrated views is needed for
31
+ // this view container (i.e. do not trigger the lookup process
32
+ // once again in case a `ViewContainerRef` is created later).
33
+ lContainer[DEHYDRATED_VIEWS] = EMPTY_ARRAY;
34
+ }
35
+ /**
36
+ * Helper function to remove all nodes from a dehydrated view.
37
+ */
38
+ function removeDehydratedView(dehydratedView, renderer) {
39
+ let nodesRemoved = 0;
40
+ let currentRNode = dehydratedView.firstChild;
41
+ if (currentRNode) {
42
+ const numNodes = dehydratedView.data[NUM_ROOT_NODES];
43
+ while (nodesRemoved < numNodes) {
44
+ ngDevMode && validateSiblingNodeExists(currentRNode);
45
+ const nextSibling = currentRNode.nextSibling;
46
+ nativeRemoveNode(renderer, currentRNode, false);
47
+ currentRNode = nextSibling;
48
+ nodesRemoved++;
49
+ }
50
+ }
51
+ }
52
+ /**
53
+ * Walks over all views within this LContainer invokes dehydrated views
54
+ * cleanup function for each one.
55
+ */
56
+ function cleanupLContainer(lContainer) {
57
+ removeDehydratedViews(lContainer);
58
+ for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
59
+ cleanupLView(lContainer[i]);
60
+ }
61
+ }
62
+ /**
63
+ * Walks over `LContainer`s and components registered within
64
+ * this LView and invokes dehydrated views cleanup function for each one.
65
+ */
66
+ function cleanupLView(lView) {
67
+ const tView = lView[TVIEW];
68
+ for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
69
+ if (isLContainer(lView[i])) {
70
+ const lContainer = lView[i];
71
+ cleanupLContainer(lContainer);
72
+ }
73
+ else if (Array.isArray(lView[i])) {
74
+ // This is a component, enter the `cleanupLView` recursively.
75
+ cleanupLView(lView[i]);
76
+ }
77
+ }
78
+ }
79
+ /**
80
+ * Walks over all views registered within the ApplicationRef and removes
81
+ * all dehydrated views from all `LContainer`s along the way.
82
+ */
83
+ export function cleanupDehydratedViews(appRef) {
84
+ const viewRefs = appRef._views;
85
+ for (const viewRef of viewRefs) {
86
+ const lView = getComponentLViewForHydration(viewRef);
87
+ // An `lView` might be `null` if a `ViewRef` represents
88
+ // an embedded view (not a component view).
89
+ if (lView !== null && lView[HOST] !== null) {
90
+ cleanupLView(lView);
91
+ ngDevMode && ngDevMode.dehydratedViewsCleanupRuns++;
92
+ }
93
+ }
94
+ }
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYW51cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL2h5ZHJhdGlvbi9jbGVhbnVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUdILE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxnQkFBZ0IsRUFBYSxNQUFNLGlDQUFpQyxDQUFDO0FBR3RHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRCxPQUFPLEVBQUMsYUFBYSxFQUFFLElBQUksRUFBUyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQy9GLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzlELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUEwQixjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDckUsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXREOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsVUFBc0I7SUFDMUQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7UUFDeEIsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLFNBQVMsSUFBSSxTQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztLQUNqRDtJQUNELHdEQUF3RDtJQUN4RCx1REFBdUQ7SUFDdkQsOERBQThEO0lBQzlELDZEQUE2RDtJQUM3RCxVQUFVLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxXQUFXLENBQUM7QUFDN0MsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxjQUF1QyxFQUFFLFFBQWtCO0lBQ3ZGLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztJQUNyQixJQUFJLFlBQVksR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDO0lBQzdDLElBQUksWUFBWSxFQUFFO1FBQ2hCLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckQsT0FBTyxZQUFZLEdBQUcsUUFBUSxFQUFFO1lBQzlCLFNBQVMsSUFBSSx5QkFBeUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNyRCxNQUFNLFdBQVcsR0FBVSxZQUFZLENBQUMsV0FBWSxDQUFDO1lBQ3JELGdCQUFnQixDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEQsWUFBWSxHQUFHLFdBQVcsQ0FBQztZQUMzQixZQUFZLEVBQUUsQ0FBQztTQUNoQjtLQUNGO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsaUJBQWlCLENBQUMsVUFBc0I7SUFDL0MscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyx1QkFBdUIsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNoRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBVSxDQUFDLENBQUM7S0FDdEM7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBWTtJQUNoQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxhQUFhLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM1RCxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMxQixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDL0I7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbEMsNkRBQTZEO1lBQzdELFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN4QjtLQUNGO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxNQUFzQjtJQUMzRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQy9CLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFO1FBQzlCLE1BQU0sS0FBSyxHQUFHLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELHVEQUF1RDtRQUN2RCwyQ0FBMkM7UUFDM0MsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDMUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BCLFNBQVMsSUFBSSxTQUFTLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztTQUNyRDtLQUNGO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0FwcGxpY2F0aW9uUmVmfSBmcm9tICcuLi9hcHBsaWNhdGlvbl9yZWYnO1xuaW1wb3J0IHtDT05UQUlORVJfSEVBREVSX09GRlNFVCwgREVIWURSQVRFRF9WSUVXUywgTENvbnRhaW5lcn0gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL2NvbnRhaW5lcic7XG5pbXBvcnQge1JlbmRlcmVyfSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvcmVuZGVyZXInO1xuaW1wb3J0IHtSTm9kZX0gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL3JlbmRlcmVyX2RvbSc7XG5pbXBvcnQge2lzTENvbnRhaW5lcn0gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL3R5cGVfY2hlY2tzJztcbmltcG9ydCB7SEVBREVSX09GRlNFVCwgSE9TVCwgTFZpZXcsIFBBUkVOVCwgUkVOREVSRVIsIFRWSUVXfSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvdmlldyc7XG5pbXBvcnQge25hdGl2ZVJlbW92ZU5vZGV9IGZyb20gJy4uL3JlbmRlcjMvbm9kZV9tYW5pcHVsYXRpb24nO1xuaW1wb3J0IHtFTVBUWV9BUlJBWX0gZnJvbSAnLi4vdXRpbC9lbXB0eSc7XG5cbmltcG9ydCB7dmFsaWRhdGVTaWJsaW5nTm9kZUV4aXN0c30gZnJvbSAnLi9lcnJvcl9oYW5kbGluZyc7XG5pbXBvcnQge0RlaHlkcmF0ZWRDb250YWluZXJWaWV3LCBOVU1fUk9PVF9OT0RFU30gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7Z2V0Q29tcG9uZW50TFZpZXdGb3JIeWRyYXRpb259IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGRlaHlkcmF0ZWQgdmlld3MgZnJvbSBhIGdpdmVuIExDb250YWluZXI6XG4gKiBib3RoIGluIGludGVybmFsIGRhdGEgc3RydWN0dXJlLCBhcyB3ZWxsIGFzIHJlbW92aW5nXG4gKiBjb3JyZXNwb25kaW5nIERPTSBub2RlcyB0aGF0IGJlbG9uZyB0byB0aGF0IGRlaHlkcmF0ZWQgdmlldy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURlaHlkcmF0ZWRWaWV3cyhsQ29udGFpbmVyOiBMQ29udGFpbmVyKSB7XG4gIGNvbnN0IHZpZXdzID0gbENvbnRhaW5lcltERUhZRFJBVEVEX1ZJRVdTXSA/PyBbXTtcbiAgY29uc3QgcGFyZW50TFZpZXcgPSBsQ29udGFpbmVyW1BBUkVOVF07XG4gIGNvbnN0IHJlbmRlcmVyID0gcGFyZW50TFZpZXdbUkVOREVSRVJdO1xuICBmb3IgKGNvbnN0IHZpZXcgb2Ygdmlld3MpIHtcbiAgICByZW1vdmVEZWh5ZHJhdGVkVmlldyh2aWV3LCByZW5kZXJlcik7XG4gICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5kZWh5ZHJhdGVkVmlld3NSZW1vdmVkKys7XG4gIH1cbiAgLy8gUmVzZXQgdGhlIHZhbHVlIHRvIGFuIGVtcHR5IGFycmF5IHRvIGluZGljYXRlIHRoYXQgbm9cbiAgLy8gZnVydGhlciBwcm9jZXNzaW5nIG9mIGRlaHlkcmF0ZWQgdmlld3MgaXMgbmVlZGVkIGZvclxuICAvLyB0aGlzIHZpZXcgY29udGFpbmVyIChpLmUuIGRvIG5vdCB0cmlnZ2VyIHRoZSBsb29rdXAgcHJvY2Vzc1xuICAvLyBvbmNlIGFnYWluIGluIGNhc2UgYSBgVmlld0NvbnRhaW5lclJlZmAgaXMgY3JlYXRlZCBsYXRlcikuXG4gIGxDb250YWluZXJbREVIWURSQVRFRF9WSUVXU10gPSBFTVBUWV9BUlJBWTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGFsbCBub2RlcyBmcm9tIGEgZGVoeWRyYXRlZCB2aWV3LlxuICovXG5mdW5jdGlvbiByZW1vdmVEZWh5ZHJhdGVkVmlldyhkZWh5ZHJhdGVkVmlldzogRGVoeWRyYXRlZENvbnRhaW5lclZpZXcsIHJlbmRlcmVyOiBSZW5kZXJlcikge1xuICBsZXQgbm9kZXNSZW1vdmVkID0gMDtcbiAgbGV0IGN1cnJlbnRSTm9kZSA9IGRlaHlkcmF0ZWRWaWV3LmZpcnN0Q2hpbGQ7XG4gIGlmIChjdXJyZW50Uk5vZGUpIHtcbiAgICBjb25zdCBudW1Ob2RlcyA9IGRlaHlkcmF0ZWRWaWV3LmRhdGFbTlVNX1JPT1RfTk9ERVNdO1xuICAgIHdoaWxlIChub2Rlc1JlbW92ZWQgPCBudW1Ob2Rlcykge1xuICAgICAgbmdEZXZNb2RlICYmIHZhbGlkYXRlU2libGluZ05vZGVFeGlzdHMoY3VycmVudFJOb2RlKTtcbiAgICAgIGNvbnN0IG5leHRTaWJsaW5nOiBSTm9kZSA9IGN1cnJlbnRSTm9kZS5uZXh0U2libGluZyE7XG4gICAgICBuYXRpdmVSZW1vdmVOb2RlKHJlbmRlcmVyLCBjdXJyZW50Uk5vZGUsIGZhbHNlKTtcbiAgICAgIGN1cnJlbnRSTm9kZSA9IG5leHRTaWJsaW5nO1xuICAgICAgbm9kZXNSZW1vdmVkKys7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogV2Fsa3Mgb3ZlciBhbGwgdmlld3Mgd2l0aGluIHRoaXMgTENvbnRhaW5lciBpbnZva2VzIGRlaHlkcmF0ZWQgdmlld3NcbiAqIGNsZWFudXAgZnVuY3Rpb24gZm9yIGVhY2ggb25lLlxuICovXG5mdW5jdGlvbiBjbGVhbnVwTENvbnRhaW5lcihsQ29udGFpbmVyOiBMQ29udGFpbmVyKSB7XG4gIHJlbW92ZURlaHlkcmF0ZWRWaWV3cyhsQ29udGFpbmVyKTtcbiAgZm9yIChsZXQgaSA9IENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUOyBpIDwgbENvbnRhaW5lci5sZW5ndGg7IGkrKykge1xuICAgIGNsZWFudXBMVmlldyhsQ29udGFpbmVyW2ldIGFzIExWaWV3KTtcbiAgfVxufVxuXG4vKipcbiAqIFdhbGtzIG92ZXIgYExDb250YWluZXJgcyBhbmQgY29tcG9uZW50cyByZWdpc3RlcmVkIHdpdGhpblxuICogdGhpcyBMVmlldyBhbmQgaW52b2tlcyBkZWh5ZHJhdGVkIHZpZXdzIGNsZWFudXAgZnVuY3Rpb24gZm9yIGVhY2ggb25lLlxuICovXG5mdW5jdGlvbiBjbGVhbnVwTFZpZXcobFZpZXc6IExWaWV3KSB7XG4gIGNvbnN0IHRWaWV3ID0gbFZpZXdbVFZJRVddO1xuICBmb3IgKGxldCBpID0gSEVBREVSX09GRlNFVDsgaSA8IHRWaWV3LmJpbmRpbmdTdGFydEluZGV4OyBpKyspIHtcbiAgICBpZiAoaXNMQ29udGFpbmVyKGxWaWV3W2ldKSkge1xuICAgICAgY29uc3QgbENvbnRhaW5lciA9IGxWaWV3W2ldO1xuICAgICAgY2xlYW51cExDb250YWluZXIobENvbnRhaW5lcik7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGxWaWV3W2ldKSkge1xuICAgICAgLy8gVGhpcyBpcyBhIGNvbXBvbmVudCwgZW50ZXIgdGhlIGBjbGVhbnVwTFZpZXdgIHJlY3Vyc2l2ZWx5LlxuICAgICAgY2xlYW51cExWaWV3KGxWaWV3W2ldKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBXYWxrcyBvdmVyIGFsbCB2aWV3cyByZWdpc3RlcmVkIHdpdGhpbiB0aGUgQXBwbGljYXRpb25SZWYgYW5kIHJlbW92ZXNcbiAqIGFsbCBkZWh5ZHJhdGVkIHZpZXdzIGZyb20gYWxsIGBMQ29udGFpbmVyYHMgYWxvbmcgdGhlIHdheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFudXBEZWh5ZHJhdGVkVmlld3MoYXBwUmVmOiBBcHBsaWNhdGlvblJlZikge1xuICBjb25zdCB2aWV3UmVmcyA9IGFwcFJlZi5fdmlld3M7XG4gIGZvciAoY29uc3Qgdmlld1JlZiBvZiB2aWV3UmVmcykge1xuICAgIGNvbnN0IGxWaWV3ID0gZ2V0Q29tcG9uZW50TFZpZXdGb3JIeWRyYXRpb24odmlld1JlZik7XG4gICAgLy8gQW4gYGxWaWV3YCBtaWdodCBiZSBgbnVsbGAgaWYgYSBgVmlld1JlZmAgcmVwcmVzZW50c1xuICAgIC8vIGFuIGVtYmVkZGVkIHZpZXcgKG5vdCBhIGNvbXBvbmVudCB2aWV3KS5cbiAgICBpZiAobFZpZXcgIT09IG51bGwgJiYgbFZpZXdbSE9TVF0gIT09IG51bGwpIHtcbiAgICAgIGNsZWFudXBMVmlldyhsVmlldyk7XG4gICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLmRlaHlkcmF0ZWRWaWV3c0NsZWFudXBSdW5zKys7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,273 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { HEADER_OFFSET, HOST } from '../render3/interfaces/view';
9
+ import { getFirstNativeNode } from '../render3/node_manipulation';
10
+ import { ɵɵresolveBody } from '../render3/util/misc_utils';
11
+ import { renderStringify } from '../render3/util/stringify_utils';
12
+ import { getNativeByTNode, unwrapRNode } from '../render3/util/view_utils';
13
+ import { assertDefined } from '../util/assert';
14
+ import { compressNodeLocation, decompressNodeLocation } from './compression';
15
+ import { nodeNotFoundAtPathError, nodeNotFoundError, validateSiblingNodeExists } from './error_handling';
16
+ import { NodeNavigationStep, NODES, REFERENCE_NODE_BODY, REFERENCE_NODE_HOST } from './interfaces';
17
+ import { calcSerializedContainerSize, getSegmentHead } from './utils';
18
+ /** Whether current TNode is a first node in an <ng-container>. */
19
+ function isFirstElementInNgContainer(tNode) {
20
+ return !tNode.prev && tNode.parent?.type === 8 /* TNodeType.ElementContainer */;
21
+ }
22
+ /** Returns an instruction index (subtracting HEADER_OFFSET). */
23
+ function getNoOffsetIndex(tNode) {
24
+ return tNode.index - HEADER_OFFSET;
25
+ }
26
+ /**
27
+ * Locate a node in DOM tree that corresponds to a given TNode.
28
+ *
29
+ * @param hydrationInfo The hydration annotation data
30
+ * @param tView the current tView
31
+ * @param lView the current lView
32
+ * @param tNode the current tNode
33
+ * @returns an RNode that represents a given tNode
34
+ */
35
+ export function locateNextRNode(hydrationInfo, tView, lView, tNode) {
36
+ let native = null;
37
+ const noOffsetIndex = getNoOffsetIndex(tNode);
38
+ const nodes = hydrationInfo.data[NODES];
39
+ if (nodes?.[noOffsetIndex]) {
40
+ // We know the exact location of the node.
41
+ native = locateRNodeByPath(nodes[noOffsetIndex], lView);
42
+ }
43
+ else if (tView.firstChild === tNode) {
44
+ // We create a first node in this view, so we use a reference
45
+ // to the first child in this DOM segment.
46
+ native = hydrationInfo.firstChild;
47
+ }
48
+ else {
49
+ // Locate a node based on a previous sibling or a parent node.
50
+ const previousTNodeParent = tNode.prev === null;
51
+ const previousTNode = (tNode.prev ?? tNode.parent);
52
+ ngDevMode &&
53
+ assertDefined(previousTNode, 'Unexpected state: current TNode does not have a connection ' +
54
+ 'to the previous node or a parent node.');
55
+ if (isFirstElementInNgContainer(tNode)) {
56
+ const noOffsetParentIndex = getNoOffsetIndex(tNode.parent);
57
+ native = getSegmentHead(hydrationInfo, noOffsetParentIndex);
58
+ }
59
+ else {
60
+ let previousRElement = getNativeByTNode(previousTNode, lView);
61
+ if (previousTNodeParent) {
62
+ native = previousRElement.firstChild;
63
+ }
64
+ else {
65
+ // If the previous node is an element, but it also has container info,
66
+ // this means that we are processing a node like `<div #vcrTarget>`, which is
67
+ // represented in the DOM as `<div></div>...<!--container-->`.
68
+ // In this case, there are nodes *after* this element and we need to skip
69
+ // all of them to reach an element that we are looking for.
70
+ const noOffsetPrevSiblingIndex = getNoOffsetIndex(previousTNode);
71
+ const segmentHead = getSegmentHead(hydrationInfo, noOffsetPrevSiblingIndex);
72
+ if (previousTNode.type === 2 /* TNodeType.Element */ && segmentHead) {
73
+ const numRootNodesToSkip = calcSerializedContainerSize(hydrationInfo, noOffsetPrevSiblingIndex);
74
+ // `+1` stands for an anchor comment node after all the views in this container.
75
+ const nodesToSkip = numRootNodesToSkip + 1;
76
+ // First node after this segment.
77
+ native = siblingAfter(nodesToSkip, segmentHead);
78
+ }
79
+ else {
80
+ native = previousRElement.nextSibling;
81
+ }
82
+ }
83
+ }
84
+ }
85
+ return native;
86
+ }
87
+ /**
88
+ * Skips over a specified number of nodes and returns the next sibling node after that.
89
+ */
90
+ export function siblingAfter(skip, from) {
91
+ let currentNode = from;
92
+ for (let i = 0; i < skip; i++) {
93
+ ngDevMode && validateSiblingNodeExists(currentNode);
94
+ currentNode = currentNode.nextSibling;
95
+ }
96
+ return currentNode;
97
+ }
98
+ /**
99
+ * Helper function to produce a string representation of the navigation steps
100
+ * (in terms of `nextSibling` and `firstChild` navigations). Used in error
101
+ * messages in dev mode.
102
+ */
103
+ function stringifyNavigationInstructions(instructions) {
104
+ const container = [];
105
+ for (let i = 0; i < instructions.length; i += 2) {
106
+ const step = instructions[i];
107
+ const repeat = instructions[i + 1];
108
+ for (let r = 0; r < repeat; r++) {
109
+ container.push(step === NodeNavigationStep.FirstChild ? 'firstChild' : 'nextSibling');
110
+ }
111
+ }
112
+ return container.join('.');
113
+ }
114
+ /**
115
+ * Helper function that navigates from a starting point node (the `from` node)
116
+ * using provided set of navigation instructions (within `path` argument).
117
+ */
118
+ function navigateToNode(from, instructions) {
119
+ let node = from;
120
+ for (let i = 0; i < instructions.length; i += 2) {
121
+ const step = instructions[i];
122
+ const repeat = instructions[i + 1];
123
+ for (let r = 0; r < repeat; r++) {
124
+ if (ngDevMode && !node) {
125
+ throw nodeNotFoundAtPathError(from, stringifyNavigationInstructions(instructions));
126
+ }
127
+ switch (step) {
128
+ case NodeNavigationStep.FirstChild:
129
+ node = node.firstChild;
130
+ break;
131
+ case NodeNavigationStep.NextSibling:
132
+ node = node.nextSibling;
133
+ break;
134
+ }
135
+ }
136
+ }
137
+ if (ngDevMode && !node) {
138
+ throw nodeNotFoundAtPathError(from, stringifyNavigationInstructions(instructions));
139
+ }
140
+ return node;
141
+ }
142
+ /**
143
+ * Locates an RNode given a set of navigation instructions (which also contains
144
+ * a starting point node info).
145
+ */
146
+ function locateRNodeByPath(path, lView) {
147
+ const [referenceNode, ...navigationInstructions] = decompressNodeLocation(path);
148
+ let ref;
149
+ if (referenceNode === REFERENCE_NODE_HOST) {
150
+ ref = lView[0];
151
+ }
152
+ else if (referenceNode === REFERENCE_NODE_BODY) {
153
+ ref = ɵɵresolveBody(lView[0]);
154
+ }
155
+ else {
156
+ const parentElementId = Number(referenceNode);
157
+ ref = unwrapRNode(lView[parentElementId + HEADER_OFFSET]);
158
+ }
159
+ return navigateToNode(ref, navigationInstructions);
160
+ }
161
+ /**
162
+ * Generate a list of DOM navigation operations to get from node `start` to node `finish`.
163
+ *
164
+ * Note: assumes that node `start` occurs before node `finish` in an in-order traversal of the DOM
165
+ * tree. That is, we should be able to get from `start` to `finish` purely by using `.firstChild`
166
+ * and `.nextSibling` operations.
167
+ */
168
+ export function navigateBetween(start, finish) {
169
+ if (start === finish) {
170
+ return [];
171
+ }
172
+ else if (start.parentElement == null || finish.parentElement == null) {
173
+ return null;
174
+ }
175
+ else if (start.parentElement === finish.parentElement) {
176
+ return navigateBetweenSiblings(start, finish);
177
+ }
178
+ else {
179
+ // `finish` is a child of its parent, so the parent will always have a child.
180
+ const parent = finish.parentElement;
181
+ const parentPath = navigateBetween(start, parent);
182
+ const childPath = navigateBetween(parent.firstChild, finish);
183
+ if (!parentPath || !childPath)
184
+ return null;
185
+ return [
186
+ // First navigate to `finish`'s parent
187
+ ...parentPath,
188
+ // Then to its first child.
189
+ NodeNavigationStep.FirstChild,
190
+ // And finally from that node to `finish` (maybe a no-op if we're already there).
191
+ ...childPath,
192
+ ];
193
+ }
194
+ }
195
+ /**
196
+ * Calculates a path between 2 sibling nodes (generates a number of `NextSibling` navigations).
197
+ */
198
+ function navigateBetweenSiblings(start, finish) {
199
+ const nav = [];
200
+ let node = null;
201
+ for (node = start; node != null && node !== finish; node = node.nextSibling) {
202
+ nav.push(NodeNavigationStep.NextSibling);
203
+ }
204
+ return node === null ? [] : nav;
205
+ }
206
+ /**
207
+ * Calculates a path between 2 nodes in terms of `nextSibling` and `firstChild`
208
+ * navigations:
209
+ * - the `from` node is a known node, used as an starting point for the lookup
210
+ * (the `fromNodeName` argument is a string representation of the node).
211
+ * - the `to` node is a node that the runtime logic would be looking up,
212
+ * using the path generated by this function.
213
+ */
214
+ export function calcPathBetween(from, to, fromNodeName) {
215
+ const path = navigateBetween(from, to);
216
+ return path === null ? null : compressNodeLocation(fromNodeName, path);
217
+ }
218
+ /**
219
+ * Invoked at serialization time (on the server) when a set of navigation
220
+ * instructions needs to be generated for a TNode.
221
+ */
222
+ export function calcPathForNode(tNode, lView) {
223
+ const parentTNode = tNode.parent;
224
+ let parentIndex;
225
+ let parentRNode;
226
+ let referenceNodeName;
227
+ if (parentTNode === null) {
228
+ // No parent TNode - use host element as a reference node.
229
+ parentIndex = referenceNodeName = REFERENCE_NODE_HOST;
230
+ parentRNode = lView[HOST];
231
+ }
232
+ else {
233
+ // Use parent TNode as a reference node.
234
+ parentIndex = parentTNode.index;
235
+ parentRNode = unwrapRNode(lView[parentIndex]);
236
+ referenceNodeName = renderStringify(parentIndex - HEADER_OFFSET);
237
+ }
238
+ let rNode = unwrapRNode(lView[tNode.index]);
239
+ if (tNode.type & 12 /* TNodeType.AnyContainer */) {
240
+ // For <ng-container> nodes, instead of serializing a reference
241
+ // to the anchor comment node, serialize a location of the first
242
+ // DOM element. Paired with the container size (serialized as a part
243
+ // of `ngh.containers`), it should give enough information for runtime
244
+ // to hydrate nodes in this container.
245
+ const firstRNode = getFirstNativeNode(lView, tNode);
246
+ // If container is not empty, use a reference to the first element,
247
+ // otherwise, rNode would point to an anchor comment node.
248
+ if (firstRNode) {
249
+ rNode = firstRNode;
250
+ }
251
+ }
252
+ let path = calcPathBetween(parentRNode, rNode, referenceNodeName);
253
+ if (path === null && parentRNode !== rNode) {
254
+ // Searching for a path between elements within a host node failed.
255
+ // Trying to find a path to an element starting from the `document.body` instead.
256
+ //
257
+ // Important note: this type of reference is relatively unstable, since Angular
258
+ // may not be able to control parts of the page that the runtime logic navigates
259
+ // through. This is mostly needed to cover "portals" use-case (like menus, dialog boxes,
260
+ // etc), where nodes are content-projected (including direct DOM manipulations) outside
261
+ // of the host node. The better solution is to provide APIs to work with "portals",
262
+ // at which point this code path would not be needed.
263
+ const body = parentRNode.ownerDocument.body;
264
+ path = calcPathBetween(body, rNode, REFERENCE_NODE_BODY);
265
+ if (path === null) {
266
+ // If the path is still empty, it's likely that this node is detached and
267
+ // won't be found during hydration.
268
+ throw nodeNotFoundError(lView, tNode);
269
+ }
270
+ }
271
+ return path;
272
+ }
273
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZV9sb29rdXBfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9oeWRyYXRpb24vbm9kZV9sb29rdXBfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBSUgsT0FBTyxFQUFDLGFBQWEsRUFBRSxJQUFJLEVBQWUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFDLG9CQUFvQixFQUFFLHNCQUFzQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZHLE9BQU8sRUFBaUIsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2pILE9BQU8sRUFBQywyQkFBMkIsRUFBRSxjQUFjLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFHcEUsa0VBQWtFO0FBQ2xFLFNBQVMsMkJBQTJCLENBQUMsS0FBWTtJQUMvQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksdUNBQStCLENBQUM7QUFDMUUsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLGdCQUFnQixDQUFDLEtBQVk7SUFDcEMsT0FBTyxLQUFLLENB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RUFBZ0U7UUFDaEUsb0VBQW9FO1FBQ3BFLHNFQUFzRTtRQUN0RSxzQ0FBc0M7UUFDdEMsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXBELG1FQUFtRTtRQUNuRSwwREFBMEQ7UUFDMUQsSUFBSSxVQUFVLEVBQUU7WUFDZCxLQUFLLEdBQUcsVUFBVSxDQUFDO1NBQ3BCO0tBQ0Y7SUFDRCxJQUFJLElBQUksR0FBZ0IsZUFBZSxDQUFDLFdBQW1CLEVBQUUsS0FBYSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDL0YsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLFdBQVcsS0FBSyxLQUFLLEVBQUU7UUFDMUMsbUVBQW1FO1FBQ25FLGlGQUFpRjtRQUNqRixFQUFFO1FBQ0YsK0VBQStFO1FBQy9FLGdGQUFnRjtRQUNoRix3RkFBd0Y7UUFDeEYsdUZBQXVGO1FBQ3ZGLG1GQUFtRjtRQUNuRixxREFBcUQ7UUFDckQsTUFBTSxJQUFJLEdBQUksV0FBb0IsQ0FBQyxhQUFjLENBQUMsSUFBWSxDQUFDO1FBQy9ELElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQWEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBRWpFLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUNqQix5RUFBeUU7WUFDekUsbUNBQW1DO1lBQ25DLE1BQU0saUJBQWlCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3ZDO0tBQ0Y7SUFDRCxPQUFPLElBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtUTm9kZSwgVE5vZGVUeXBlfSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvbm9kZSc7XG5pbXBvcnQge1JFbGVtZW50LCBSTm9kZX0gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL3JlbmRlcmVyX2RvbSc7XG5pbXBvcnQge0hFQURFUl9PRkZTRVQsIEhPU1QsIExWaWV3LCBUVmlld30gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL3ZpZXcnO1xuaW1wb3J0IHtnZXRGaXJzdE5hdGl2ZU5vZGV9IGZyb20gJy4uL3JlbmRlcjMvbm9kZV9tYW5pcHVsYXRpb24nO1xuaW1wb3J0IHvJtcm1cmVzb2x2ZUJvZHl9IGZyb20gJy4uL3JlbmRlcjMvdXRpbC9taXNjX3V0aWxzJztcbmltcG9ydCB7cmVuZGVyU3RyaW5naWZ5fSBmcm9tICcuLi9yZW5kZXIzL3V0aWwvc3RyaW5naWZ5X3V0aWxzJztcbmltcG9ydCB7Z2V0TmF0aXZlQnlUTm9kZSwgdW53cmFwUk5vZGV9IGZyb20gJy4uL3JlbmRlcjMvdXRpbC92aWV3X3V0aWxzJztcbmltcG9ydCB7YXNzZXJ0RGVmaW5lZH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuXG5pbXBvcnQge2NvbXByZXNzTm9kZUxvY2F0aW9uLCBkZWNvbXByZXNzTm9kZUxvY2F0aW9ufSBmcm9tICcuL2NvbXByZXNzaW9uJztcbmltcG9ydCB7bm9kZU5vdEZvdW5kQXRQYXRoRXJyb3IsIG5vZGVOb3RGb3VuZEVycm9yLCB2YWxpZGF0ZVNpYmxpbmdOb2RlRXhpc3RzfSBmcm9tICcuL2Vycm9yX2hhbmRsaW5nJztcbmltcG9ydCB7RGVoeWRyYXRlZFZpZXcsIE5vZGVOYXZpZ2F0aW9uU3RlcCwgTk9ERVMsIFJFRkVSRU5DRV9OT0RFX0JPRFksIFJFRkVSRU5DRV9OT0RFX0hPU1R9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge2NhbGNTZXJpYWxpemVkQ29udGFpbmVyU2l6ZSwgZ2V0U2VnbWVudEhlYWR9IGZyb20gJy4vdXRpbHMnO1xuXG5cbi8qKiBXaGV0aGVyIGN1cnJlbnQgVE5vZGUgaXMgYSBmaXJzdCBub2RlIGluIGFuIDxuZy1jb250YWluZXI+LiAqL1xuZnVuY3Rpb24gaXNGaXJzdEVsZW1lbnRJbk5nQ29udGFpbmVyKHROb2RlOiBUTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gIXROb2RlLnByZXYgJiYgdE5vZGUucGFyZW50Py50eXBlID09PSBUTm9kZVR5cGUuRWxlbWVudENvbnRhaW5lcjtcbn1cblxuLyoqIFJldHVybnMgYW4gaW5zdHJ1Y3Rpb24gaW5kZXggKHN1YnRyYWN0aW5nIEhFQURFUl9PRkZTRVQpLiAqL1xuZnVuY3Rpb24gZ2V0Tm9PZmZzZXRJbmRleCh0Tm9kZTogVE5vZGUpOiBudW1iZXIge1xuICByZXR1cm4gdE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUO1xufVxuXG4vKipcbiAqIExvY2F0ZSBhIG5vZGUgaW4gRE9NIHRyZWUgdGhhdCBjb3JyZXNwb25kcyB0byBhIGdpdmVuIFROb2RlLlxuICpcbiAqIEBwYXJhbSBoeWRyYXRpb25JbmZvIFRoZSBoeWRyYXRpb24gYW5ub3RhdGlvbiBkYXRhXG4gKiBAcGFyYW0gdFZpZXcgdGhlIGN1cnJlbnQgdFZpZXdcbiAqIEBwYXJhbSBsVmlldyB0aGUgY3VycmVudCBsVmlld1xuICogQHBhcmFtIHROb2RlIHRoZSBjdXJyZW50IHROb2RlXG4gKiBAcmV0dXJucyBhbiBSTm9kZSB0aGF0IHJlcHJlc2VudHMgYSBnaXZlbiB0Tm9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9jYXRlTmV4dFJOb2RlPFQgZXh0ZW5kcyBSTm9kZT4oXG4gICAgaHlkcmF0aW9uSW5mbzogRGVoeWRyYXRlZFZpZXcsIHRWaWV3OiBUVmlldywgbFZpZXc6IExWaWV3PHVua25vd24+LCB0Tm9kZTogVE5vZGUpOiBUfG51bGwge1xuICBsZXQgbmF0aXZlOiBSTm9kZXxudWxsID0gbnVsbDtcbiAgY29uc3Qgbm9PZmZzZXRJbmRleCA9IGdldE5vT2Zmc2V0SW5kZXgodE5vZGUpO1xuICBjb25zdCBub2RlcyA9IGh5ZHJhdGlvbkluZm8uZGF0YVtOT0RFU107XG4gIGlmIChub2Rlcz8uW25vT2Zmc2V0SW5kZXhdKSB7XG4gICAgLy8gV2Uga25vdyB0aGUgZXhhY3QgbG9jYXRpb24gb2YgdGhlIG5vZGUuXG4gICAgbmF0aXZlID0gbG9jYXRlUk5vZGVCeVBhdGgobm9kZXNbbm9PZmZzZXRJbmRleF0sIGxWaWV3KTtcbiAgfSBlbHNlIGlmICh0Vmlldy5maXJzdENoaWxkID09PSB0Tm9kZSkge1xuICAgIC8vIFdlIGNyZWF0ZSBhIGZpcnN0IG5vZGUgaW4gdGhpcyB2aWV3LCBzbyB3ZSB1c2UgYSByZWZlcmVuY2VcbiAgICAvLyB0byB0aGUgZmlyc3QgY2hpbGQgaW4gdGhpcyBET00gc2VnbWVudC5cbiAgICBuYXRpdmUgPSBoeWRyYXRpb25JbmZvLmZpcnN0Q2hpbGQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gTG9jYXRlIGEgbm9kZSBiYXNlZCBvbiBhIHByZXZpb3VzIHNpYmxpbmcgb3IgYSBwYXJlbnQgbm9kZS5cbiAgICBjb25zdCBwcmV2aW91c1ROb2RlUGFyZW50ID0gdE5vZGUucHJldiA9PT0gbnVsbDtcbiAgICBjb25zdCBwcmV2aW91c1ROb2RlID0gKHROb2RlLnByZXYgPz8gdE5vZGUucGFyZW50KSE7XG4gICAgbmdEZXZNb2RlICYmXG4gICAgICAgIGFzc2VydERlZmluZWQoXG4gICAgICAgICAgICBwcmV2aW91c1ROb2RlLFxuICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgc3RhdGU6IGN1cnJlbnQgVE5vZGUgZG9lcyBub3QgaGF2ZSBhIGNvbm5lY3Rpb24gJyArXG4gICAgICAgICAgICAgICAgJ3RvIHRoZSBwcmV2aW91cyBub2RlIG9yIGEgcGFyZW50IG5vZGUuJyk7XG4gICAgaWYgKGlzRmlyc3RFbGVtZW50SW5OZ0NvbnRhaW5lcih0Tm9kZSkpIHtcbiAgICAgIGNvbnN0IG5vT2Zmc2V0UGFyZW50SW5kZXggPSBnZXROb09mZnNldEluZGV4KHROb2RlLnBhcmVudCEpO1xuICAgICAgbmF0aXZlID0gZ2V0U2VnbWVudEhlYWQoaHlkcmF0aW9uSW5mbywgbm9PZmZzZXRQYXJlbnRJbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwcmV2aW91c1JFbGVtZW50ID0gZ2V0TmF0aXZlQnlUTm9kZShwcmV2aW91c1ROb2RlLCBsVmlldyk7XG4gICAgICBpZiAocHJldmlvdXNUTm9kZVBhcmVudCkge1xuICAgICAgICBuYXRpdmUgPSAocHJldmlvdXNSRWxlbWVudCBhcyBSRWxlbWVudCkuZmlyc3RDaGlsZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGFuIGVsZW1lbnQsIGJ1dCBpdCBhbHNvIGhhcyBjb250YWluZXIgaW5mbyxcbiAgICAgICAgLy8gdGhpcyBtZWFucyB0aGF0IHdlIGFyZSBwcm9jZXNzaW5nIGEgbm9kZSBsaWtlIGA8ZGl2ICN2Y3JUYXJnZXQ+YCwgd2hpY2ggaXNcbiAgICAgICAgLy8gcmVwcmVzZW50ZWQgaW4gdGhlIERPTSBhcyBgPGRpdj48L2Rpdj4uLi48IS0tY29udGFpbmVyLS0+YC5cbiAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGVyZSBhcmUgbm9kZXMgKmFmdGVyKiB0aGlzIGVsZW1lbnQgYW5kIHdlIG5lZWQgdG8gc2tpcFxuICAgICAgICAvLyBhbGwgb2YgdGhlbSB0byByZWFjaCBhbiBlbGVtZW50IHRoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLlxuICAgICAgICBjb25zdCBub09mZnNldFByZXZTaWJsaW5nSW5kZXggPSBnZXROb09mZnNldEluZGV4KHByZXZpb3VzVE5vZGUpO1xuICAgICAgICBjb25zdCBzZWdtZW50SGVhZCA9IGdldFNlZ21lbnRIZWFkKGh5ZHJhdGlvbkluZm8sIG5vT2Zmc2V0UHJldlNpYmxpbmdJbmRleCk7XG4gICAgICAgIGlmIChwcmV2aW91c1ROb2RlLnR5cGUgPT09IFROb2RlVHlwZS5FbGVtZW50ICYmIHNlZ21lbnRIZWFkKSB7XG4gICAgICAgICAgY29uc3QgbnVtUm9vdE5vZGVzVG9Ta2lwID1cbiAgICAgICAgICAgICAgY2FsY1NlcmlhbGl6ZWRDb250YWluZXJTaXplKGh5ZHJhdGlvbkluZm8sIG5vT2Zmc2V0UHJldlNpYmxpbmdJbmRleCk7XG4gICAgICAgICAgLy8gYCsxYCBzdGFuZHMgZm9yIGFuIGFuY2hvciBjb21tZW50IG5vZGUgYWZ0ZXIgYWxsIHRoZSB2aWV3cyBpbiB0aGlzIGNvbnRhaW5lci5cbiAgICAgICAgICBjb25zdCBub2Rlc1RvU2tpcCA9IG51bVJvb3ROb2Rlc1RvU2tpcCArIDE7XG4gICAgICAgICAgLy8gRmlyc3Qgbm9kZSBhZnRlciB0aGlzIHNlZ21lbnQuXG4gICAgICAgICAgbmF0aXZlID0gc2libGluZ0FmdGVyKG5vZGVzVG9Ta2lwLCBzZWdtZW50SGVhZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmF0aXZlID0gcHJldmlvdXNSRWxlbWVudC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbmF0aXZlIGFzIFQ7XG59XG5cbi8qKlxuICogU2tpcHMgb3ZlciBhIHNwZWNpZmllZCBudW1iZXIgb2Ygbm9kZXMgYW5kIHJldHVybnMgdGhlIG5leHQgc2libGluZyBub2RlIGFmdGVyIHRoYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWJsaW5nQWZ0ZXI8VCBleHRlbmRzIFJOb2RlPihza2lwOiBudW1iZXIsIGZyb206IFJOb2RlKTogVHxudWxsIHtcbiAgbGV0IGN1cnJlbnROb2RlID0gZnJvbTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBza2lwOyBpKyspIHtcbiAgICBuZ0Rldk1vZGUgJiYgdmFsaWRhdGVTaWJsaW5nTm9kZUV4aXN0cyhjdXJyZW50Tm9kZSk7XG4gICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0U2libGluZyE7XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnROb2RlIGFzIFQ7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb2R1Y2UgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5hdmlnYXRpb24gc3RlcHNcbiAqIChpbiB0ZXJtcyBvZiBgbmV4dFNpYmxpbmdgIGFuZCBgZmlyc3RDaGlsZGAgbmF2aWdhdGlvbnMpLiBVc2VkIGluIGVycm9yXG4gKiBtZXNzYWdlcyBpbiBkZXYgbW9kZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5TmF2aWdhdGlvbkluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IChudW1iZXJ8Tm9kZU5hdmlnYXRpb25TdGVwKVtdKTogc3RyaW5nIHtcbiAgY29uc3QgY29udGFpbmVyID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zdHJ1Y3Rpb25zLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgY29uc3Qgc3RlcCA9IGluc3RydWN0aW9uc1tpXTtcbiAgICBjb25zdCByZXBlYXQgPSBpbnN0cnVjdGlvbnNbaSArIDFdIGFzIG51bWJlcjtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IHJlcGVhdDsgcisrKSB7XG4gICAgICBjb250YWluZXIucHVzaChzdGVwID09PSBOb2RlTmF2aWdhdGlvblN0ZXAuRmlyc3RDaGlsZCA/ICdmaXJzdENoaWxkJyA6ICduZXh0U2libGluZycpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29udGFpbmVyLmpvaW4oJy4nKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBuYXZpZ2F0ZXMgZnJvbSBhIHN0YXJ0aW5nIHBvaW50IG5vZGUgKHRoZSBgZnJvbWAgbm9kZSlcbiAqIHVzaW5nIHByb3ZpZGVkIHNldCBvZiBuYXZpZ2F0aW9uIGluc3RydWN0aW9ucyAod2l0aGluIGBwYXRoYCBhcmd1bWVudCkuXG4gKi9cbmZ1bmN0aW9uIG5hdmlnYXRlVG9Ob2RlKGZyb206IE5vZGUsIGluc3RydWN0aW9uczogKG51bWJlcnxOb2RlTmF2aWdhdGlvblN0ZXApW10pOiBSTm9kZSB7XG4gIGxldCBub2RlID0gZnJvbTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnN0cnVjdGlvbnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBjb25zdCBzdGVwID0gaW5zdHJ1Y3Rpb25zW2ldO1xuICAgIGNvbnN0IHJlcGVhdCA9IGluc3RydWN0aW9uc1tpICsgMV0gYXMgbnVtYmVyO1xuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcmVwZWF0OyByKyspIHtcbiAgICAgIGlmIChuZ0Rldk1vZGUgJiYgIW5vZGUpIHtcbiAgICAgICAgdGhyb3cgbm9kZU5vdEZvdW5kQXRQYXRoRXJyb3IoZnJvbSwgc3RyaW5naWZ5TmF2aWdhdGlvbkluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpKTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoc3RlcCkge1xuICAgICAgICBjYXNlIE5vZGVOYXZpZ2F0aW9uU3RlcC5GaXJzdENoaWxkOlxuICAgICAgICAgIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQhO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE5vZGVOYXZpZ2F0aW9uU3RlcC5OZXh0U2libGluZzpcbiAgICAgICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZyE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChuZ0Rldk1vZGUgJiYgIW5vZGUpIHtcbiAgICB0aHJvdyBub2RlTm90Rm91bmRBdFBhdGhFcnJvcihmcm9tLCBzdHJpbmdpZnlOYXZpZ2F0aW9uSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucykpO1xuICB9XG4gIHJldHVybiBub2RlIGFzIFJOb2RlO1xufVxuXG4vKipcbiAqIExvY2F0ZXMgYW4gUk5vZGUgZ2l2ZW4gYSBzZXQgb2YgbmF2aWdhdGlvbiBpbnN0cnVjdGlvbnMgKHdoaWNoIGFsc28gY29udGFpbnNcbiAqIGEgc3RhcnRpbmcgcG9pbnQgbm9kZSBpbmZvKS5cbiAqL1xuZnVuY3Rpb24gbG9jYXRlUk5vZGVCeVBhdGgocGF0aDogc3RyaW5nLCBsVmlldzogTFZpZXcpOiBSTm9kZSB7XG4gIGNvbnN0IFtyZWZlcmVuY2VOb2RlLCAuLi5uYXZpZ2F0aW9uSW5zdHJ1Y3Rpb25zXSA9IGRlY29tcHJlc3NOb2RlTG9jYXRpb24ocGF0aCk7XG4gIGxldCByZWY6IEVsZW1lbnQ7XG4gIGlmIChyZWZlcmVuY2VOb2RlID09PSBSRUZFUkVOQ0VfTk9ERV9IT1NUKSB7XG4gICAgcmVmID0gbFZpZXdbMF0gYXMgdW5rbm93biBhcyBFbGVtZW50O1xuICB9IGVsc2UgaWYgKHJlZmVyZW5jZU5vZGUgPT09IFJFRkVSRU5DRV9OT0RFX0JPRFkpIHtcbiAgICByZWYgPSDJtcm1cmVzb2x2ZUJvZHkobFZpZXdbMF0gYXMgdW5rbm93biBhcyBSRWxlbWVudCAmIHtvd25lckRvY3VtZW50OiBEb2N1bWVudH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnRJZCA9IE51bWJlcihyZWZlcmVuY2VOb2RlKTtcbiAgICByZWYgPSB1bndyYXBSTm9kZSgobFZpZXcgYXMgYW55KVtwYXJlbnRFbGVtZW50SWQgKyBIRUFERVJfT0ZGU0VUXSkgYXMgRWxlbWVudDtcbiAgfVxuICByZXR1cm4gbmF2aWdhdGVUb05vZGUocmVmLCBuYXZpZ2F0aW9uSW5zdHJ1Y3Rpb25zKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGxpc3Qgb2YgRE9NIG5hdmlnYXRpb24gb3BlcmF0aW9ucyB0byBnZXQgZnJvbSBub2RlIGBzdGFydGAgdG8gbm9kZSBgZmluaXNoYC5cbiAqXG4gKiBOb3RlOiBhc3N1bWVzIHRoYXQgbm9kZSBgc3RhcnRgIG9jY3VycyBiZWZvcmUgbm9kZSBgZmluaXNoYCBpbiBhbiBpbi1vcmRlciB0cmF2ZXJzYWwgb2YgdGhlIERPTVxuICogdHJlZS4gVGhhdCBpcywgd2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGZyb20gYHN0YXJ0YCB0byBgZmluaXNoYCBwdXJlbHkgYnkgdXNpbmcgYC5maXJzdENoaWxkYFxuICogYW5kIGAubmV4dFNpYmxpbmdgIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXZpZ2F0ZUJldHdlZW4oc3RhcnQ6IE5vZGUsIGZpbmlzaDogTm9kZSk6IE5vZGVOYXZpZ2F0aW9uU3RlcFtdfG51bGwge1xuICBpZiAoc3RhcnQgPT09IGZpbmlzaCkge1xuICAgIHJldHVybiBbXTtcbiAgfSBlbHNlIGlmIChzdGFydC5wYXJlbnRFbGVtZW50ID09IG51bGwgfHwgZmluaXNoLnBhcmVudEVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKHN0YXJ0LnBhcmVudEVsZW1lbnQgPT09IGZpbmlzaC5wYXJlbnRFbGVtZW50KSB7XG4gICAgcmV0dXJuIG5hdmlnYXRlQmV0d2VlblNpYmxpbmdzKHN0YXJ0LCBmaW5pc2gpO1xuICB9IGVsc2Uge1xuICAgIC8vIGBmaW5pc2hgIGlzIGEgY2hpbGQgb2YgaXRzIHBhcmVudCwgc28gdGhlIHBhcmVudCB3aWxsIGFsd2F5cyBoYXZlIGEgY2hpbGQuXG4gICAgY29uc3QgcGFyZW50ID0gZmluaXNoLnBhcmVudEVsZW1lbnQhO1xuXG4gICAgY29uc3QgcGFyZW50UGF0aCA9IG5hdmlnYXRlQmV0d2VlbihzdGFydCwgcGFyZW50KTtcbiAgICBjb25zdCBjaGlsZFBhdGggPSBuYXZpZ2F0ZUJldHdlZW4ocGFyZW50LmZpcnN0Q2hpbGQhLCBmaW5pc2gpO1xuICAgIGlmICghcGFyZW50UGF0aCB8fCAhY2hpbGRQYXRoKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBbXG4gICAgICAvLyBGaXJzdCBuYXZpZ2F0ZSB0byBgZmluaXNoYCdzIHBhcmVudFxuICAgICAgLi4ucGFyZW50UGF0aCxcbiAgICAgIC8vIFRoZW4gdG8gaXRzIGZpcnN0IGNoaWxkLlxuICAgICAgTm9kZU5hdmlnYXRpb25TdGVwLkZpcnN0Q2hpbGQsXG4gICAgICAvLyBBbmQgZmluYWxseSBmcm9tIHRoYXQgbm9kZSB0byBgZmluaXNoYCAobWF5YmUgYSBuby1vcCBpZiB3ZSdyZSBhbHJlYWR5IHRoZXJlKS5cbiAgICAgIC4uLmNoaWxkUGF0aCxcbiAgICBdO1xuICB9XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhIHBhdGggYmV0d2VlbiAyIHNpYmxpbmcgbm9kZXMgKGdlbmVyYXRlcyBhIG51bWJlciBvZiBgTmV4dFNpYmxpbmdgIG5hdmlnYXRpb25zKS5cbiAqL1xuZnVuY3Rpb24gbmF2aWdhdGVCZXR3ZWVuU2libGluZ3Moc3RhcnQ6IE5vZGUsIGZpbmlzaDogTm9kZSk6IE5vZGVOYXZpZ2F0aW9uU3RlcFtdIHtcbiAgY29uc3QgbmF2OiBOb2RlTmF2aWdhdGlvblN0ZXBbXSA9IFtdO1xuICBsZXQgbm9kZTogTm9kZXxudWxsID0gbnVsbDtcbiAgZm9yIChub2RlID0gc3RhcnQ7IG5vZGUgIT0gbnVsbCAmJiBub2RlICE9PSBmaW5pc2g7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgbmF2LnB1c2goTm9kZU5hdmlnYXRpb25TdGVwLk5leHRTaWJsaW5nKTtcbiAgfVxuICByZXR1cm4gbm9kZSA9PT0gbnVsbCA/IFtdIDogbmF2O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgYSBwYXRoIGJldHdlZW4gMiBub2RlcyBpbiB0ZXJtcyBvZiBgbmV4dFNpYmxpbmdgIGFuZCBgZmlyc3RDaGlsZGBcbiAqIG5hdmlnYXRpb25zOlxuICogLSB0aGUgYGZyb21gIG5vZGUgaXMgYSBrbm93biBub2RlLCB1c2VkIGFzIGFuIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUgbG9va3VwXG4gKiAgICh0aGUgYGZyb21Ob2RlTmFtZWAgYXJndW1lbnQgaXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG5vZGUpLlxuICogLSB0aGUgYHRvYCBub2RlIGlzIGEgbm9kZSB0aGF0IHRoZSBydW50aW1lIGxvZ2ljIHdvdWxkIGJlIGxvb2tpbmcgdXAsXG4gKiAgIHVzaW5nIHRoZSBwYXRoIGdlbmVyYXRlZCBieSB0aGlzIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY1BhdGhCZXR3ZWVuKGZyb206IE5vZGUsIHRvOiBOb2RlLCBmcm9tTm9kZU5hbWU6IHN0cmluZyk6IHN0cmluZ3xudWxsIHtcbiAgY29uc3QgcGF0aCA9IG5hdmlnYXRlQmV0d2Vlbihmcm9tLCB0byk7XG4gIHJldHVybiBwYXRoID09PSBudWxsID8gbnVsbCA6IGNvbXByZXNzTm9kZUxvY2F0aW9uKGZyb21Ob2RlTmFtZSwgcGF0aCk7XG59XG5cbi8qKlxuICogSW52b2tlZCBhdCBzZXJpYWxpemF0aW9uIHRpbWUgKG9uIHRoZSBzZXJ2ZXIpIHdoZW4gYSBzZXQgb2YgbmF2aWdhdGlvblxuICogaW5zdHJ1Y3Rpb25zIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBmb3IgYSBUTm9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGNQYXRoRm9yTm9kZSh0Tm9kZTogVE5vZGUsIGxWaWV3OiBMVmlldyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcmVudFROb2RlID0gdE5vZGUucGFyZW50O1xuICBsZXQgcGFyZW50SW5kZXg6IG51bWJlcnxzdHJpbmc7XG4gIGxldCBwYXJlbnRSTm9kZTogUk5vZGU7XG4gIGxldCByZWZlcmVuY2VOb2RlTmFtZTogc3RyaW5nO1xuICBpZiAocGFyZW50VE5vZGUgPT09IG51bGwpIHtcbiAgICAvLyBObyBwYXJlbnQgVE5vZGUgLSB1c2UgaG9zdCBlbGVtZW50IGFzIGEgcmVmZXJlbmNlIG5vZGUuXG4gICAgcGFyZW50SW5kZXggPSByZWZlcmVuY2VOb2RlTmFtZSA9IFJFRkVSRU5DRV9OT0RFX0hPU1Q7XG4gICAgcGFyZW50Uk5vZGUgPSBsVmlld1tIT1NUXSE7XG4gIH0gZWxzZSB7XG4gICAgLy8gVXNlIHBhcmVudCBUTm9kZSBhcyBhIHJlZmVyZW5jZSBub2RlLlxuICAgIHBhcmVudEluZGV4ID0gcGFyZW50VE5vZGUuaW5kZXg7XG4gICAgcGFyZW50Uk5vZGUgPSB1bndyYXBSTm9kZShsVmlld1twYXJlbnRJbmRleF0pO1xuICAgIHJlZmVyZW5jZU5vZGVOYW1lID0gcmVuZGVyU3RyaW5naWZ5KHBhcmVudEluZGV4IC0gSEVBREVSX09GRlNFVCk7XG4gIH1cbiAgbGV0IHJOb2RlID0gdW53cmFwUk5vZGUobFZpZXdbdE5vZGUuaW5kZXhdKTtcbiAgaWYgKHROb2RlLnR5cGUgJiBUTm9kZVR5cGUuQW55Q29udGFpbmVyKSB7XG4gICAgLy8gRm9yIDxuZy1jb250YWluZXI+IG5vZGVzLCBpbnN0ZWFkIG9mIHNlcmlhbGl6aW5nIGEgcmVmZXJlbmNlXG4gICAgLy8gdG8gdGhlIGFuY2hvciBjb21tZW50IG5vZGUsIHNlcmlhbGl6ZSBhIGxvY2F0aW9uIG9mIHRoZSBmaXJzdFxuICAgIC8vIERPTSBlbGVtZW50LiBQYWlyZWQgd2l0aCB0aGUgY29udGFpbmVyIHNpemUgKHNlcmlhbGl6ZWQgYXMgYSBwYXJ0XG4gICAgLy8gb2YgYG5naC5jb250YWluZXJzYCksIGl0IHNob3VsZCBnaXZlIGVub3VnaCBpbmZvcm1hdGlvbiBmb3IgcnVudGltZVxuICAgIC8vIHRvIGh5ZHJhdGUgbm9kZXMgaW4gdGhpcyBjb250YWluZXIuXG4gICAgY29uc3QgZmlyc3RSTm9kZSA9IGdldEZpcnN0TmF0aXZlTm9kZShsVmlldywgdE5vZGUpO1xuXG4gICAgLy8gSWYgY29udGFpbmVyIGlzIG5vdCBlbXB0eSwgdXNlIGEgcmVmZXJlbmNlIHRvIHRoZSBmaXJzdCBlbGVtZW50LFxuICAgIC8vIG90aGVyd2lzZSwgck5vZGUgd291bGQgcG9pbnQgdG8gYW4gYW5jaG9yIGNvbW1lbnQgbm9kZS5cbiAgICBpZiAoZmlyc3RSTm9kZSkge1xuICAgICAgck5vZGUgPSBmaXJzdFJOb2RlO1xuICAgIH1cbiAgfVxuICBsZXQgcGF0aDogc3RyaW5nfG51bGwgPSBjYWxjUGF0aEJldHdlZW4ocGFyZW50Uk5vZGUgYXMgTm9kZSwgck5vZGUgYXMgTm9kZSwgcmVmZXJlbmNlTm9kZU5hbWUpO1xuICBpZiAocGF0aCA9PT0gbnVsbCAmJiBwYXJlbnRSTm9kZSAhPT0gck5vZGUpIHtcbiAgICAvLyBTZWFyY2hpbmcgZm9yIGEgcGF0aCBiZXR3ZWVuIGVsZW1lbnRzIHdpdGhpbiBhIGhvc3Qgbm9kZSBmYWlsZWQuXG4gICAgLy8gVHJ5aW5nIHRvIGZpbmQgYSBwYXRoIHRvIGFuIGVsZW1lbnQgc3RhcnRpbmcgZnJvbSB0aGUgYGRvY3VtZW50LmJvZHlgIGluc3RlYWQuXG4gICAgLy9cbiAgICAvLyBJbXBvcnRhbnQgbm90ZTogdGhpcyB0eXBlIG9mIHJlZmVyZW5jZSBpcyByZWxhdGl2ZWx5IHVuc3RhYmxlLCBzaW5jZSBBbmd1bGFyXG4gICAgLy8gbWF5IG5vdCBiZSBhYmxlIHRvIGNvbnRyb2wgcGFydHMgb2YgdGhlIHBhZ2UgdGhhdCB0aGUgcnVudGltZSBsb2dpYyBuYXZpZ2F0ZXNcbiAgICAvLyB0aHJvdWdoLiBUaGlzIGlzIG1vc3RseSBuZWVkZWQgdG8gY292ZXIgXCJwb3J0YWxzXCIgdXNlLWNhc2UgKGxpa2UgbWVudXMsIGRpYWxvZyBib3hlcyxcbiAgICAvLyBldGMpLCB3aGVyZSBub2RlcyBhcmUgY29udGVudC1wcm9qZWN0ZWQgKGluY2x1ZGluZyBkaXJlY3QgRE9NIG1hbmlwdWxhdGlvbnMpIG91dHNpZGVcbiAgICAvLyBvZiB0aGUgaG9zdCBub2RlLiBUaGUgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIHByb3ZpZGUgQVBJcyB0byB3b3JrIHdpdGggXCJwb3J0YWxzXCIsXG4gICAgLy8gYXQgd2hpY2ggcG9pbnQgdGhpcyBjb2RlIHBhdGggd291bGQgbm90IGJlIG5lZWRlZC5cbiAgICBjb25zdCBib2R5ID0gKHBhcmVudFJOb2RlIGFzIE5vZGUpLm93bmVyRG9jdW1lbnQhLmJvZHkgYXMgTm9kZTtcbiAgICBwYXRoID0gY2FsY1BhdGhCZXR3ZWVuKGJvZHksIHJOb2RlIGFzIE5vZGUsIFJFRkVSRU5DRV9OT0RFX0JPRFkpO1xuXG4gICAgaWYgKHBhdGggPT09IG51bGwpIHtcbiAgICAgIC8vIElmIHRoZSBwYXRoIGlzIHN0aWxsIGVtcHR5LCBpdCdzIGxpa2VseSB0aGF0IHRoaXMgbm9kZSBpcyBkZXRhY2hlZCBhbmRcbiAgICAgIC8vIHdvbid0IGJlIGZvdW5kIGR1cmluZyBoeWRyYXRpb24uXG4gICAgICB0aHJvdyBub2RlTm90Rm91bmRFcnJvcihsVmlldywgdE5vZGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGF0aCE7XG59XG4iXX0=