@angular/compiler 19.0.0-next.1 → 19.0.0-next.3

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 (185) hide show
  1. package/fesm2022/compiler.mjs +4742 -4473
  2. package/fesm2022/compiler.mjs.map +1 -1
  3. package/index.d.ts +35 -3
  4. package/package.json +2 -4
  5. package/esm2022/compiler.mjs +0 -13
  6. package/esm2022/index.mjs +0 -13
  7. package/esm2022/public_api.mjs +0 -15
  8. package/esm2022/src/assertions.mjs +0 -31
  9. package/esm2022/src/chars.mjs +0 -90
  10. package/esm2022/src/compiler.mjs +0 -88
  11. package/esm2022/src/compiler_facade_interface.mjs +0 -29
  12. package/esm2022/src/config.mjs +0 -20
  13. package/esm2022/src/constant_pool.mjs +0 -285
  14. package/esm2022/src/core.mjs +0 -96
  15. package/esm2022/src/expression_parser/ast.mjs +0 -755
  16. package/esm2022/src/expression_parser/lexer.mjs +0 -421
  17. package/esm2022/src/expression_parser/parser.mjs +0 -1222
  18. package/esm2022/src/i18n/digest.mjs +0 -322
  19. package/esm2022/src/i18n/extractor_merger.mjs +0 -409
  20. package/esm2022/src/i18n/i18n_ast.mjs +0 -212
  21. package/esm2022/src/i18n/i18n_html_parser.mjs +0 -54
  22. package/esm2022/src/i18n/i18n_parser.mjs +0 -247
  23. package/esm2022/src/i18n/index.mjs +0 -16
  24. package/esm2022/src/i18n/message_bundle.mjs +0 -93
  25. package/esm2022/src/i18n/parse_util.mjs +0 -17
  26. package/esm2022/src/i18n/serializers/placeholder.mjs +0 -139
  27. package/esm2022/src/i18n/serializers/serializer.mjs +0 -77
  28. package/esm2022/src/i18n/serializers/xliff.mjs +0 -300
  29. package/esm2022/src/i18n/serializers/xliff2.mjs +0 -349
  30. package/esm2022/src/i18n/serializers/xmb.mjs +0 -188
  31. package/esm2022/src/i18n/serializers/xml_helper.mjs +0 -94
  32. package/esm2022/src/i18n/serializers/xtb.mjs +0 -186
  33. package/esm2022/src/i18n/translation_bundle.mjs +0 -164
  34. package/esm2022/src/injectable_compiler_2.mjs +0 -138
  35. package/esm2022/src/jit_compiler_facade.mjs +0 -681
  36. package/esm2022/src/ml_parser/ast.mjs +0 -167
  37. package/esm2022/src/ml_parser/defaults.mjs +0 -24
  38. package/esm2022/src/ml_parser/entities.mjs +0 -2144
  39. package/esm2022/src/ml_parser/html_parser.mjs +0 -18
  40. package/esm2022/src/ml_parser/html_tags.mjs +0 -156
  41. package/esm2022/src/ml_parser/html_whitespaces.mjs +0 -107
  42. package/esm2022/src/ml_parser/icu_ast_expander.mjs +0 -125
  43. package/esm2022/src/ml_parser/lexer.mjs +0 -1210
  44. package/esm2022/src/ml_parser/parser.mjs +0 -539
  45. package/esm2022/src/ml_parser/tags.mjs +0 -47
  46. package/esm2022/src/ml_parser/tokens.mjs +0 -9
  47. package/esm2022/src/ml_parser/xml_parser.mjs +0 -19
  48. package/esm2022/src/ml_parser/xml_tags.mjs +0 -32
  49. package/esm2022/src/output/abstract_emitter.mjs +0 -524
  50. package/esm2022/src/output/abstract_js_emitter.mjs +0 -130
  51. package/esm2022/src/output/map_util.mjs +0 -19
  52. package/esm2022/src/output/output_ast.mjs +0 -1301
  53. package/esm2022/src/output/output_jit.mjs +0 -138
  54. package/esm2022/src/output/output_jit_trusted_types.mjs +0 -100
  55. package/esm2022/src/output/source_map.mjs +0 -150
  56. package/esm2022/src/parse_util.mjs +0 -198
  57. package/esm2022/src/render3/partial/api.mjs +0 -9
  58. package/esm2022/src/render3/partial/class_metadata.mjs +0 -52
  59. package/esm2022/src/render3/partial/component.mjs +0 -197
  60. package/esm2022/src/render3/partial/directive.mjs +0 -264
  61. package/esm2022/src/render3/partial/factory.mjs +0 -35
  62. package/esm2022/src/render3/partial/injectable.mjs +0 -67
  63. package/esm2022/src/render3/partial/injector.mjs +0 -41
  64. package/esm2022/src/render3/partial/ng_module.mjs +0 -63
  65. package/esm2022/src/render3/partial/pipe.mjs +0 -50
  66. package/esm2022/src/render3/partial/util.mjs +0 -79
  67. package/esm2022/src/render3/r3_ast.mjs +0 -493
  68. package/esm2022/src/render3/r3_class_debug_info_compiler.mjs +0 -35
  69. package/esm2022/src/render3/r3_class_metadata_compiler.mjs +0 -92
  70. package/esm2022/src/render3/r3_control_flow.mjs +0 -421
  71. package/esm2022/src/render3/r3_deferred_blocks.mjs +0 -170
  72. package/esm2022/src/render3/r3_deferred_triggers.mjs +0 -316
  73. package/esm2022/src/render3/r3_factory.mjs +0 -200
  74. package/esm2022/src/render3/r3_identifiers.mjs +0 -480
  75. package/esm2022/src/render3/r3_injector_compiler.mjs +0 -28
  76. package/esm2022/src/render3/r3_jit.mjs +0 -29
  77. package/esm2022/src/render3/r3_module_compiler.mjs +0 -211
  78. package/esm2022/src/render3/r3_pipe_compiler.mjs +0 -35
  79. package/esm2022/src/render3/r3_template_transform.mjs +0 -560
  80. package/esm2022/src/render3/util.mjs +0 -90
  81. package/esm2022/src/render3/view/api.mjs +0 -14
  82. package/esm2022/src/render3/view/compiler.mjs +0 -546
  83. package/esm2022/src/render3/view/i18n/get_msg_utils.mjs +0 -113
  84. package/esm2022/src/render3/view/i18n/icu_serializer.mjs +0 -43
  85. package/esm2022/src/render3/view/i18n/localize_utils.mjs +0 -118
  86. package/esm2022/src/render3/view/i18n/meta.mjs +0 -259
  87. package/esm2022/src/render3/view/i18n/util.mjs +0 -70
  88. package/esm2022/src/render3/view/query_generation.mjs +0 -182
  89. package/esm2022/src/render3/view/t2_api.mjs +0 -9
  90. package/esm2022/src/render3/view/t2_binder.mjs +0 -823
  91. package/esm2022/src/render3/view/template.mjs +0 -113
  92. package/esm2022/src/render3/view/util.mjs +0 -192
  93. package/esm2022/src/resource_loader.mjs +0 -17
  94. package/esm2022/src/schema/dom_element_schema_registry.mjs +0 -471
  95. package/esm2022/src/schema/dom_security_schema.mjs +0 -96
  96. package/esm2022/src/schema/element_schema_registry.mjs +0 -10
  97. package/esm2022/src/schema/trusted_types_sinks.mjs +0 -41
  98. package/esm2022/src/selector.mjs +0 -400
  99. package/esm2022/src/shadow_css.mjs +0 -1053
  100. package/esm2022/src/style_url_resolver.mjs +0 -17
  101. package/esm2022/src/template/pipeline/ir/index.mjs +0 -18
  102. package/esm2022/src/template/pipeline/ir/src/enums.mjs +0 -503
  103. package/esm2022/src/template/pipeline/ir/src/expression.mjs +0 -997
  104. package/esm2022/src/template/pipeline/ir/src/handle.mjs +0 -13
  105. package/esm2022/src/template/pipeline/ir/src/operations.mjs +0 -261
  106. package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +0 -405
  107. package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +0 -25
  108. package/esm2022/src/template/pipeline/ir/src/ops/shared.mjs +0 -43
  109. package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +0 -277
  110. package/esm2022/src/template/pipeline/ir/src/traits.mjs +0 -64
  111. package/esm2022/src/template/pipeline/ir/src/variable.mjs +0 -13
  112. package/esm2022/src/template/pipeline/src/compilation.mjs +0 -194
  113. package/esm2022/src/template/pipeline/src/conversion.mjs +0 -64
  114. package/esm2022/src/template/pipeline/src/emit.mjs +0 -238
  115. package/esm2022/src/template/pipeline/src/ingest.mjs +0 -1058
  116. package/esm2022/src/template/pipeline/src/instruction.mjs +0 -564
  117. package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +0 -32
  118. package/esm2022/src/template/pipeline/src/phases/apply_i18n_expressions.mjs +0 -63
  119. package/esm2022/src/template/pipeline/src/phases/assign_i18n_slot_dependencies.mjs +0 -63
  120. package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +0 -138
  121. package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +0 -75
  122. package/esm2022/src/template/pipeline/src/phases/chaining.mjs +0 -112
  123. package/esm2022/src/template/pipeline/src/phases/collapse_singleton_interpolations.mjs +0 -32
  124. package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +0 -58
  125. package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +0 -214
  126. package/esm2022/src/template/pipeline/src/phases/convert_i18n_bindings.mjs +0 -52
  127. package/esm2022/src/template/pipeline/src/phases/create_i18n_contexts.mjs +0 -105
  128. package/esm2022/src/template/pipeline/src/phases/deduplicate_text_bindings.mjs +0 -40
  129. package/esm2022/src/template/pipeline/src/phases/defer_configs.mjs +0 -29
  130. package/esm2022/src/template/pipeline/src/phases/defer_resolve_targets.mjs +0 -113
  131. package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +0 -47
  132. package/esm2022/src/template/pipeline/src/phases/expand_safe_reads.mjs +0 -192
  133. package/esm2022/src/template/pipeline/src/phases/extract_i18n_messages.mjs +0 -218
  134. package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +0 -66
  135. package/esm2022/src/template/pipeline/src/phases/generate_local_let_references.mjs +0 -29
  136. package/esm2022/src/template/pipeline/src/phases/generate_projection_def.mjs +0 -46
  137. package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +0 -170
  138. package/esm2022/src/template/pipeline/src/phases/has_const_expression_collection.mjs +0 -28
  139. package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +0 -81
  140. package/esm2022/src/template/pipeline/src/phases/i18n_const_collection.mjs +0 -309
  141. package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +0 -97
  142. package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +0 -43
  143. package/esm2022/src/template/pipeline/src/phases/namespace.mjs +0 -26
  144. package/esm2022/src/template/pipeline/src/phases/naming.mjs +0 -179
  145. package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +0 -75
  146. package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +0 -29
  147. package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +0 -47
  148. package/esm2022/src/template/pipeline/src/phases/nullish_coalescing.mjs +0 -33
  149. package/esm2022/src/template/pipeline/src/phases/ordering.mjs +0 -140
  150. package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +0 -137
  151. package/esm2022/src/template/pipeline/src/phases/phase_remove_content_selectors.mjs +0 -42
  152. package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +0 -74
  153. package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +0 -30
  154. package/esm2022/src/template/pipeline/src/phases/propagate_i18n_blocks.mjs +0 -81
  155. package/esm2022/src/template/pipeline/src/phases/pure_function_extraction.mjs +0 -55
  156. package/esm2022/src/template/pipeline/src/phases/pure_literal_structures.mjs +0 -58
  157. package/esm2022/src/template/pipeline/src/phases/reify.mjs +0 -433
  158. package/esm2022/src/template/pipeline/src/phases/remove_empty_bindings.mjs +0 -31
  159. package/esm2022/src/template/pipeline/src/phases/remove_i18n_contexts.mjs +0 -27
  160. package/esm2022/src/template/pipeline/src/phases/remove_illegal_let_references.mjs +0 -36
  161. package/esm2022/src/template/pipeline/src/phases/remove_unused_i18n_attrs.mjs +0 -33
  162. package/esm2022/src/template/pipeline/src/phases/resolve_contexts.mjs +0 -60
  163. package/esm2022/src/template/pipeline/src/phases/resolve_defer_deps_fns.mjs +0 -31
  164. package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +0 -36
  165. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_element_placeholders.mjs +0 -266
  166. package/esm2022/src/template/pipeline/src/phases/resolve_i18n_expression_placeholders.mjs +0 -70
  167. package/esm2022/src/template/pipeline/src/phases/resolve_names.mjs +0 -124
  168. package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +0 -123
  169. package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +0 -64
  170. package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +0 -62
  171. package/esm2022/src/template/pipeline/src/phases/store_let_optimization.mjs +0 -35
  172. package/esm2022/src/template/pipeline/src/phases/style_binding_specialization.mjs +0 -42
  173. package/esm2022/src/template/pipeline/src/phases/temporary_variables.mjs +0 -87
  174. package/esm2022/src/template/pipeline/src/phases/track_fn_generation.mjs +0 -52
  175. package/esm2022/src/template/pipeline/src/phases/track_fn_optimization.mjs +0 -88
  176. package/esm2022/src/template/pipeline/src/phases/track_variables.mjs +0 -36
  177. package/esm2022/src/template/pipeline/src/phases/transform_two_way_binding_set.mjs +0 -43
  178. package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +0 -155
  179. package/esm2022/src/template/pipeline/src/phases/variable_optimization.mjs +0 -423
  180. package/esm2022/src/template/pipeline/src/phases/wrap_icus.mjs +0 -41
  181. package/esm2022/src/template/pipeline/src/util/elements.mjs +0 -29
  182. package/esm2022/src/template_parser/binding_parser.mjs +0 -465
  183. package/esm2022/src/template_parser/template_preparser.mjs +0 -84
  184. package/esm2022/src/util.mjs +0 -124
  185. package/esm2022/src/version.mjs +0 -15
@@ -1,423 +0,0 @@
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 * as o from '../../../../output/output_ast';
9
- import * as ir from '../../ir';
10
- /**
11
- * Optimize variables declared and used in the IR.
12
- *
13
- * Variables are eagerly generated by pipeline stages for all possible values that could be
14
- * referenced. This stage processes the list of declared variables and all variable usages,
15
- * and optimizes where possible. It performs 3 main optimizations:
16
- *
17
- * * It transforms variable declarations to side effectful expressions when the
18
- * variable is not used, but its initializer has global effects which other
19
- * operations rely upon.
20
- * * It removes variable declarations if those variables are not referenced and
21
- * either they do not have global effects, or nothing relies on them.
22
- * * It inlines variable declarations when those variables are only used once
23
- * and the inlining is semantically safe.
24
- *
25
- * To guarantee correctness, analysis of "fences" in the instruction lists is used to determine
26
- * which optimizations are safe to perform.
27
- */
28
- export function optimizeVariables(job) {
29
- for (const unit of job.units) {
30
- inlineAlwaysInlineVariables(unit.create);
31
- inlineAlwaysInlineVariables(unit.update);
32
- for (const op of unit.create) {
33
- if (op.kind === ir.OpKind.Listener || op.kind === ir.OpKind.TwoWayListener) {
34
- inlineAlwaysInlineVariables(op.handlerOps);
35
- }
36
- }
37
- optimizeVariablesInOpList(unit.create, job.compatibility);
38
- optimizeVariablesInOpList(unit.update, job.compatibility);
39
- for (const op of unit.create) {
40
- if (op.kind === ir.OpKind.Listener || op.kind === ir.OpKind.TwoWayListener) {
41
- optimizeVariablesInOpList(op.handlerOps, job.compatibility);
42
- }
43
- }
44
- }
45
- }
46
- /**
47
- * A [fence](https://en.wikipedia.org/wiki/Memory_barrier) flag for an expression which indicates
48
- * how that expression can be optimized in relation to other expressions or instructions.
49
- *
50
- * `Fence`s are a bitfield, so multiple flags may be set on a single expression.
51
- */
52
- var Fence;
53
- (function (Fence) {
54
- /**
55
- * Empty flag (no fence exists).
56
- */
57
- Fence[Fence["None"] = 0] = "None";
58
- /**
59
- * A context read fence, meaning that the expression in question reads from the "current view"
60
- * context of the runtime.
61
- */
62
- Fence[Fence["ViewContextRead"] = 1] = "ViewContextRead";
63
- /**
64
- * A context write fence, meaning that the expression in question writes to the "current view"
65
- * context of the runtime.
66
- *
67
- * Note that all `ContextWrite` fences are implicitly `ContextRead` fences as operations which
68
- * change the view context do so based on the current one.
69
- */
70
- Fence[Fence["ViewContextWrite"] = 2] = "ViewContextWrite";
71
- /**
72
- * Indicates that a call is required for its side-effects, even if nothing reads its result.
73
- *
74
- * This is also true of `ViewContextWrite` operations **if** they are followed by a
75
- * `ViewContextRead`.
76
- */
77
- Fence[Fence["SideEffectful"] = 4] = "SideEffectful";
78
- })(Fence || (Fence = {}));
79
- function inlineAlwaysInlineVariables(ops) {
80
- const vars = new Map();
81
- for (const op of ops) {
82
- if (op.kind === ir.OpKind.Variable && op.flags & ir.VariableFlags.AlwaysInline) {
83
- ir.visitExpressionsInOp(op, (expr) => {
84
- if (ir.isIrExpression(expr) && fencesForIrExpression(expr) !== Fence.None) {
85
- throw new Error(`AssertionError: A context-sensitive variable was marked AlwaysInline`);
86
- }
87
- });
88
- vars.set(op.xref, op);
89
- }
90
- ir.transformExpressionsInOp(op, (expr) => {
91
- if (expr instanceof ir.ReadVariableExpr && vars.has(expr.xref)) {
92
- const varOp = vars.get(expr.xref);
93
- // Inline by cloning, because we might inline into multiple places.
94
- return varOp.initializer.clone();
95
- }
96
- return expr;
97
- }, ir.VisitorContextFlag.None);
98
- }
99
- for (const op of vars.values()) {
100
- ir.OpList.remove(op);
101
- }
102
- }
103
- /**
104
- * Process a list of operations and optimize variables within that list.
105
- */
106
- function optimizeVariablesInOpList(ops, compatibility) {
107
- const varDecls = new Map();
108
- const varUsages = new Map();
109
- // Track variables that are used outside of the immediate operation list. For example, within
110
- // `ListenerOp` handler operations of listeners in the current operation list.
111
- const varRemoteUsages = new Set();
112
- const opMap = new Map();
113
- // First, extract information about variables declared or used within the whole list.
114
- for (const op of ops) {
115
- if (op.kind === ir.OpKind.Variable) {
116
- if (varDecls.has(op.xref) || varUsages.has(op.xref)) {
117
- throw new Error(`Should not see two declarations of the same variable: ${op.xref}`);
118
- }
119
- varDecls.set(op.xref, op);
120
- varUsages.set(op.xref, 0);
121
- }
122
- opMap.set(op, collectOpInfo(op));
123
- countVariableUsages(op, varUsages, varRemoteUsages);
124
- }
125
- // The next step is to remove any variable declarations for variables that aren't used. The
126
- // variable initializer expressions may be side-effectful, so they may need to be retained as
127
- // expression statements.
128
- // Track whether we've seen an operation which reads from the view context yet. This is used to
129
- // determine whether a write to the view context in a variable initializer can be observed.
130
- let contextIsUsed = false;
131
- // Note that iteration through the list happens in reverse, which guarantees that we'll process
132
- // all reads of a variable prior to processing its declaration.
133
- for (const op of ops.reversed()) {
134
- const opInfo = opMap.get(op);
135
- if (op.kind === ir.OpKind.Variable && varUsages.get(op.xref) === 0) {
136
- // This variable is unused and can be removed. We might need to keep the initializer around,
137
- // though, if something depends on it running.
138
- if ((contextIsUsed && opInfo.fences & Fence.ViewContextWrite) ||
139
- opInfo.fences & Fence.SideEffectful) {
140
- // This variable initializer has a side effect which must be retained. Either:
141
- // * it writes to the view context, and we know there is a future operation which depends
142
- // on that write, or
143
- // * it's an operation which is inherently side-effectful.
144
- // We can't remove the initializer, but we can remove the variable declaration itself and
145
- // replace it with a side-effectful statement.
146
- const stmtOp = ir.createStatementOp(op.initializer.toStmt());
147
- opMap.set(stmtOp, opInfo);
148
- ir.OpList.replace(op, stmtOp);
149
- }
150
- else {
151
- // It's safe to delete this entire variable declaration as nothing depends on it, even
152
- // side-effectfully. Note that doing this might make other variables unused. Since we're
153
- // iterating in reverse order, we should always be processing usages before declarations
154
- // and therefore by the time we get to a declaration, all removable usages will have been
155
- // removed.
156
- uncountVariableUsages(op, varUsages);
157
- ir.OpList.remove(op);
158
- }
159
- opMap.delete(op);
160
- varDecls.delete(op.xref);
161
- varUsages.delete(op.xref);
162
- continue;
163
- }
164
- // Does this operation depend on the view context?
165
- if (opInfo.fences & Fence.ViewContextRead) {
166
- contextIsUsed = true;
167
- }
168
- }
169
- // Next, inline any remaining variables with exactly one usage.
170
- const toInline = [];
171
- for (const [id, count] of varUsages) {
172
- const decl = varDecls.get(id);
173
- // We can inline variables that:
174
- // - are used exactly once, and
175
- // - are not used remotely
176
- // OR
177
- // - are marked for always inlining
178
- const isAlwaysInline = !!(decl.flags & ir.VariableFlags.AlwaysInline);
179
- if (count !== 1 || isAlwaysInline) {
180
- // We can't inline this variable as it's used more than once.
181
- continue;
182
- }
183
- if (varRemoteUsages.has(id)) {
184
- // This variable is used once, but across an operation boundary, so it can't be inlined.
185
- continue;
186
- }
187
- toInline.push(id);
188
- }
189
- let candidate;
190
- while ((candidate = toInline.pop())) {
191
- // We will attempt to inline this variable. If inlining fails (due to fences for example),
192
- // no future operation will make inlining legal.
193
- const decl = varDecls.get(candidate);
194
- const varInfo = opMap.get(decl);
195
- const isAlwaysInline = !!(decl.flags & ir.VariableFlags.AlwaysInline);
196
- if (isAlwaysInline) {
197
- throw new Error(`AssertionError: Found an 'AlwaysInline' variable after the always inlining pass.`);
198
- }
199
- // Scan operations following the variable declaration and look for the point where that variable
200
- // is used. There should only be one usage given the precondition above.
201
- for (let targetOp = decl.next; targetOp.kind !== ir.OpKind.ListEnd; targetOp = targetOp.next) {
202
- const opInfo = opMap.get(targetOp);
203
- // Is the variable used in this operation?
204
- if (opInfo.variablesUsed.has(candidate)) {
205
- if (compatibility === ir.CompatibilityMode.TemplateDefinitionBuilder &&
206
- !allowConservativeInlining(decl, targetOp)) {
207
- // We're in conservative mode, and this variable is not eligible for inlining into the
208
- // target operation in this mode.
209
- break;
210
- }
211
- // Yes, try to inline it. Inlining may not be successful if fences in this operation before
212
- // the variable's usage cannot be safely crossed.
213
- if (tryInlineVariableInitializer(candidate, decl.initializer, targetOp, varInfo.fences)) {
214
- // Inlining was successful! Update the tracking structures to reflect the inlined
215
- // variable.
216
- opInfo.variablesUsed.delete(candidate);
217
- // Add all variables used in the variable's initializer to its new usage site.
218
- for (const id of varInfo.variablesUsed) {
219
- opInfo.variablesUsed.add(id);
220
- }
221
- // Merge fences in the variable's initializer into its new usage site.
222
- opInfo.fences |= varInfo.fences;
223
- // Delete tracking info related to the declaration.
224
- varDecls.delete(candidate);
225
- varUsages.delete(candidate);
226
- opMap.delete(decl);
227
- // And finally, delete the original declaration from the operation list.
228
- ir.OpList.remove(decl);
229
- }
230
- // Whether inlining succeeded or failed, we're done processing this variable.
231
- break;
232
- }
233
- // If the variable is not used in this operation, then we'd need to inline across it. Check if
234
- // that's safe to do.
235
- if (!safeToInlinePastFences(opInfo.fences, varInfo.fences)) {
236
- // We can't safely inline this variable beyond this operation, so don't proceed with
237
- // inlining this variable.
238
- break;
239
- }
240
- }
241
- }
242
- }
243
- /**
244
- * Given an `ir.Expression`, returns the `Fence` flags for that expression type.
245
- */
246
- function fencesForIrExpression(expr) {
247
- switch (expr.kind) {
248
- case ir.ExpressionKind.NextContext:
249
- return Fence.ViewContextRead | Fence.ViewContextWrite;
250
- case ir.ExpressionKind.RestoreView:
251
- return Fence.ViewContextRead | Fence.ViewContextWrite | Fence.SideEffectful;
252
- case ir.ExpressionKind.StoreLet:
253
- return Fence.SideEffectful;
254
- case ir.ExpressionKind.Reference:
255
- case ir.ExpressionKind.ContextLetReference:
256
- return Fence.ViewContextRead;
257
- default:
258
- return Fence.None;
259
- }
260
- }
261
- /**
262
- * Build the `OpInfo` structure for the given `op`. This performs two operations:
263
- *
264
- * * It tracks which variables are used in the operation's expressions.
265
- * * It rolls up fence flags for expressions within the operation.
266
- */
267
- function collectOpInfo(op) {
268
- let fences = Fence.None;
269
- const variablesUsed = new Set();
270
- ir.visitExpressionsInOp(op, (expr) => {
271
- if (!ir.isIrExpression(expr)) {
272
- return;
273
- }
274
- switch (expr.kind) {
275
- case ir.ExpressionKind.ReadVariable:
276
- variablesUsed.add(expr.xref);
277
- break;
278
- default:
279
- fences |= fencesForIrExpression(expr);
280
- }
281
- });
282
- return { fences, variablesUsed };
283
- }
284
- /**
285
- * Count the number of usages of each variable, being careful to track whether those usages are
286
- * local or remote.
287
- */
288
- function countVariableUsages(op, varUsages, varRemoteUsage) {
289
- ir.visitExpressionsInOp(op, (expr, flags) => {
290
- if (!ir.isIrExpression(expr)) {
291
- return;
292
- }
293
- if (expr.kind !== ir.ExpressionKind.ReadVariable) {
294
- return;
295
- }
296
- const count = varUsages.get(expr.xref);
297
- if (count === undefined) {
298
- // This variable is declared outside the current scope of optimization.
299
- return;
300
- }
301
- varUsages.set(expr.xref, count + 1);
302
- if (flags & ir.VisitorContextFlag.InChildOperation) {
303
- varRemoteUsage.add(expr.xref);
304
- }
305
- });
306
- }
307
- /**
308
- * Remove usages of a variable in `op` from the `varUsages` tracking.
309
- */
310
- function uncountVariableUsages(op, varUsages) {
311
- ir.visitExpressionsInOp(op, (expr) => {
312
- if (!ir.isIrExpression(expr)) {
313
- return;
314
- }
315
- if (expr.kind !== ir.ExpressionKind.ReadVariable) {
316
- return;
317
- }
318
- const count = varUsages.get(expr.xref);
319
- if (count === undefined) {
320
- // This variable is declared outside the current scope of optimization.
321
- return;
322
- }
323
- else if (count === 0) {
324
- throw new Error(`Inaccurate variable count: ${expr.xref} - found another read but count is already 0`);
325
- }
326
- varUsages.set(expr.xref, count - 1);
327
- });
328
- }
329
- /**
330
- * Checks whether it's safe to inline a variable across a particular operation.
331
- *
332
- * @param fences the fences of the operation which the inlining will cross
333
- * @param declFences the fences of the variable being inlined.
334
- */
335
- function safeToInlinePastFences(fences, declFences) {
336
- if (fences & Fence.ViewContextWrite) {
337
- // It's not safe to inline context reads across context writes.
338
- if (declFences & Fence.ViewContextRead) {
339
- return false;
340
- }
341
- }
342
- else if (fences & Fence.ViewContextRead) {
343
- // It's not safe to inline context writes across context reads.
344
- if (declFences & Fence.ViewContextWrite) {
345
- return false;
346
- }
347
- }
348
- return true;
349
- }
350
- /**
351
- * Attempt to inline the initializer of a variable into a target operation's expressions.
352
- *
353
- * This may or may not be safe to do. For example, the variable could be read following the
354
- * execution of an expression with fences that don't permit the variable to be inlined across them.
355
- */
356
- function tryInlineVariableInitializer(id, initializer, target, declFences) {
357
- // We use `ir.transformExpressionsInOp` to walk the expressions and inline the variable if
358
- // possible. Since this operation is callback-based, once inlining succeeds or fails we can't
359
- // "stop" the expression processing, and have to keep track of whether inlining has succeeded or
360
- // is no longer allowed.
361
- let inlined = false;
362
- let inliningAllowed = true;
363
- ir.transformExpressionsInOp(target, (expr, flags) => {
364
- if (!ir.isIrExpression(expr)) {
365
- return expr;
366
- }
367
- if (inlined || !inliningAllowed) {
368
- // Either the inlining has already succeeded, or we've passed a fence that disallows inlining
369
- // at this point, so don't try.
370
- return expr;
371
- }
372
- else if (flags & ir.VisitorContextFlag.InChildOperation &&
373
- declFences & Fence.ViewContextRead) {
374
- // We cannot inline variables that are sensitive to the current context across operation
375
- // boundaries.
376
- return expr;
377
- }
378
- switch (expr.kind) {
379
- case ir.ExpressionKind.ReadVariable:
380
- if (expr.xref === id) {
381
- // This is the usage site of the variable. Since nothing has disallowed inlining, it's
382
- // safe to inline the initializer here.
383
- inlined = true;
384
- return initializer;
385
- }
386
- break;
387
- default:
388
- // For other types of `ir.Expression`s, whether inlining is allowed depends on their fences.
389
- const exprFences = fencesForIrExpression(expr);
390
- inliningAllowed = inliningAllowed && safeToInlinePastFences(exprFences, declFences);
391
- break;
392
- }
393
- return expr;
394
- }, ir.VisitorContextFlag.None);
395
- return inlined;
396
- }
397
- /**
398
- * Determines whether inlining of `decl` should be allowed in "conservative" mode.
399
- *
400
- * In conservative mode, inlining behavior is limited to those operations which the
401
- * `TemplateDefinitionBuilder` supported, with the goal of producing equivalent output.
402
- */
403
- function allowConservativeInlining(decl, target) {
404
- // TODO(alxhub): understand exactly how TemplateDefinitionBuilder approaches inlining, and record
405
- // that behavior here.
406
- switch (decl.variable.kind) {
407
- case ir.SemanticVariableKind.Identifier:
408
- if (decl.initializer instanceof o.ReadVarExpr && decl.initializer.name === 'ctx') {
409
- // Although TemplateDefinitionBuilder is cautious about inlining, we still want to do so
410
- // when the variable is the context, to imitate its behavior with aliases in control flow
411
- // blocks. This quirky behavior will become dead code once compatibility mode is no longer
412
- // supported.
413
- return true;
414
- }
415
- return false;
416
- case ir.SemanticVariableKind.Context:
417
- // Context can only be inlined into other variables.
418
- return target.kind === ir.OpKind.Variable;
419
- default:
420
- return true;
421
- }
422
- }
423
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVfb3B0aW1pemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvdmFyaWFibGVfb3B0aW1pemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxDQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHL0I7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQW1CO0lBQ25ELEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLDJCQUEyQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFekMsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDM0UsMkJBQTJCLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdDLENBQUM7UUFDSCxDQUFDO1FBRUQseUJBQXlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUQseUJBQXlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFMUQsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDM0UseUJBQXlCLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDOUQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsSUFBSyxLQTRCSjtBQTVCRCxXQUFLLEtBQUs7SUFDUjs7T0FFRztJQUNILGlDQUFZLENBQUE7SUFFWjs7O09BR0c7SUFDSCx1REFBdUIsQ0FBQTtJQUV2Qjs7Ozs7O09BTUc7SUFDSCx5REFBd0IsQ0FBQTtJQUV4Qjs7Ozs7T0FLRztJQUNILG1EQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUE1QkksS0FBSyxLQUFMLEtBQUssUUE0QlQ7QUFvQkQsU0FBUywyQkFBMkIsQ0FBQyxHQUF5QztJQUM1RSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBdUQsQ0FBQztJQUM1RSxLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDL0UsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNuQyxJQUFJLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUMxRSxNQUFNLElBQUksS0FBSyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7Z0JBQzFGLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBRUQsRUFBRSxDQUFDLHdCQUF3QixDQUN6QixFQUFFLEVBQ0YsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNQLElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMvRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUUsQ0FBQztnQkFDbkMsbUVBQW1FO2dCQUNuRSxPQUFPLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxFQUNELEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQzNCLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUMvQixFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUErQixDQUFDLENBQUM7SUFDcEQsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMseUJBQXlCLENBQ2hDLEdBQXlDLEVBQ3pDLGFBQW1DO0lBRW5DLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUF1RCxDQUFDO0lBQ2hGLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFxQixDQUFDO0lBRS9DLDZGQUE2RjtJQUM3Riw4RUFBOEU7SUFDOUUsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztJQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBcUMsQ0FBQztJQUUzRCxxRkFBcUY7SUFDckYsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7WUFDRCxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFFRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqQyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCwyRkFBMkY7SUFDM0YsNkZBQTZGO0lBQzdGLHlCQUF5QjtJQUV6QiwrRkFBK0Y7SUFDL0YsMkZBQTJGO0lBQzNGLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztJQUUxQiwrRkFBK0Y7SUFDL0YsK0RBQStEO0lBQy9ELEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDaEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUUsQ0FBQztRQUU5QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEUsNEZBQTRGO1lBQzVGLDhDQUE4QztZQUM5QyxJQUNFLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO2dCQUN6RCxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQ25DLENBQUM7Z0JBQ0QsOEVBQThFO2dCQUM5RSwwRkFBMEY7Z0JBQzFGLHVCQUF1QjtnQkFDdkIsMkRBQTJEO2dCQUMzRCx5RkFBeUY7Z0JBQ3pGLDhDQUE4QztnQkFDOUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQWdCLENBQUM7Z0JBQzVFLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQixFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLENBQUM7aUJBQU0sQ0FBQztnQkFDTixzRkFBc0Y7Z0JBQ3RGLHdGQUF3RjtnQkFDeEYsd0ZBQXdGO2dCQUN4Rix5RkFBeUY7Z0JBQ3pGLFdBQVc7Z0JBQ1gscUJBQXFCLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNyQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFpQixDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsU0FBUztRQUNYLENBQUM7UUFFRCxrREFBa0Q7UUFDbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMxQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRUQsK0RBQStEO0lBQy9ELE1BQU0sUUFBUSxHQUFnQixFQUFFLENBQUM7SUFDakMsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFFLENBQUM7UUFDL0IsZ0NBQWdDO1FBQ2hDLGdDQUFnQztRQUNoQywyQkFBMkI7UUFDM0IsS0FBSztRQUNMLG9DQUFvQztRQUNwQyxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEUsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ2xDLDZEQUE2RDtZQUM3RCxTQUFTO1FBQ1gsQ0FBQztRQUVELElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzVCLHdGQUF3RjtZQUN4RixTQUFTO1FBQ1gsQ0FBQztRQUVELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELElBQUksU0FBZ0MsQ0FBQztJQUNyQyxPQUFPLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDcEMsMEZBQTBGO1FBQzFGLGdEQUFnRDtRQUNoRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBRSxDQUFDO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBaUMsQ0FBRSxDQUFDO1FBQzlELE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV0RSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0ZBQWtGLENBQ25GLENBQUM7UUFDSixDQUFDO1FBRUQsZ0dBQWdHO1FBQ2hHLHdFQUF3RTtRQUN4RSxLQUNFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFLLEVBQ3pCLFFBQVEsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQ25DLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSyxFQUN6QixDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUUsQ0FBQztZQUVwQywwQ0FBMEM7WUFDMUMsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxJQUNFLGFBQWEsS0FBSyxFQUFFLENBQUMsaUJBQWlCLENBQUMseUJBQXlCO29CQUNoRSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFDMUMsQ0FBQztvQkFDRCxzRkFBc0Y7b0JBQ3RGLGlDQUFpQztvQkFDakMsTUFBTTtnQkFDUixDQUFDO2dCQUVELDJGQUEyRjtnQkFDM0YsaURBQWlEO2dCQUNqRCxJQUFJLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDeEYsaUZBQWlGO29CQUNqRixZQUFZO29CQUNaLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUV2Qyw4RUFBOEU7b0JBQzlFLEtBQUssTUFBTSxFQUFFLElBQUksT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUN2QyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDL0IsQ0FBQztvQkFFRCxzRUFBc0U7b0JBQ3RFLE1BQU0sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQztvQkFFaEMsbURBQW1EO29CQUNuRCxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUMzQixTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUM1QixLQUFLLENBQUMsTUFBTSxDQUFDLElBQWlDLENBQUMsQ0FBQztvQkFFaEQsd0VBQXdFO29CQUN4RSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFtQixDQUFDLENBQUM7Z0JBQ3hDLENBQUM7Z0JBRUQsNkVBQTZFO2dCQUM3RSxNQUFNO1lBQ1IsQ0FBQztZQUVELDhGQUE4RjtZQUM5RixxQkFBcUI7WUFDckIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzNELG9GQUFvRjtnQkFDcEYsMEJBQTBCO2dCQUMxQixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxJQUFtQjtJQUNoRCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixLQUFLLEVBQUUsQ0FBQyxjQUFjLENBQUMsV0FBVztZQUNoQyxPQUFPLEtBQUssQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1FBQ3hELEtBQUssRUFBRSxDQUFDLGNBQWMsQ0FBQyxXQUFXO1lBQ2hDLE9BQU8sS0FBSyxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUM5RSxLQUFLLEVBQUUsQ0FBQyxjQUFjLENBQUMsUUFBUTtZQUM3QixPQUFPLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDN0IsS0FBSyxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUNqQyxLQUFLLEVBQUUsQ0FBQyxjQUFjLENBQUMsbUJBQW1CO1lBQ3hDLE9BQU8sS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUMvQjtZQUNFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQztJQUN0QixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxhQUFhLENBQUMsRUFBNkI7SUFDbEQsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUN4QixNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBYSxDQUFDO0lBQzNDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNuQyxJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdCLE9BQU87UUFDVCxDQUFDO1FBRUQsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsS0FBSyxFQUFFLENBQUMsY0FBYyxDQUFDLFlBQVk7Z0JBQ2pDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFDLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQzFCLEVBQTZCLEVBQzdCLFNBQWlDLEVBQ2pDLGNBQThCO0lBRTlCLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDMUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2pELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsdUVBQXVFO1lBQ3ZFLE9BQU87UUFDVCxDQUFDO1FBQ0QsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVwQyxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNuRCxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixFQUE2QixFQUM3QixTQUFpQztJQUVqQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbkMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2pELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsdUVBQXVFO1lBQ3ZFLE9BQU87UUFDVCxDQUFDO2FBQU0sSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDYiw4QkFBOEIsSUFBSSxDQUFDLElBQUksOENBQThDLENBQ3RGLENBQUM7UUFDSixDQUFDO1FBQ0QsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsc0JBQXNCLENBQUMsTUFBYSxFQUFFLFVBQWlCO0lBQzlELElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3BDLCtEQUErRDtRQUMvRCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztTQUFNLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMxQywrREFBK0Q7UUFDL0QsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyw0QkFBNEIsQ0FDbkMsRUFBYSxFQUNiLFdBQXlCLEVBQ3pCLE1BQWlDLEVBQ2pDLFVBQWlCO0lBRWpCLDBGQUEwRjtJQUMxRiw2RkFBNkY7SUFDN0YsZ0dBQWdHO0lBQ2hHLHdCQUF3QjtJQUN4QixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDcEIsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBRTNCLEVBQUUsQ0FBQyx3QkFBd0IsQ0FDekIsTUFBTSxFQUNOLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ2QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2hDLDZGQUE2RjtZQUM3RiwrQkFBK0I7WUFDL0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFDTCxLQUFLLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQjtZQUM5QyxVQUFVLEdBQUcsS0FBSyxDQUFDLGVBQWUsRUFDbEMsQ0FBQztZQUNELHdGQUF3RjtZQUN4RixjQUFjO1lBQ2QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsS0FBSyxFQUFFLENBQUMsY0FBYyxDQUFDLFlBQVk7Z0JBQ2pDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQztvQkFDckIsc0ZBQXNGO29CQUN0Rix1Q0FBdUM7b0JBQ3ZDLE9BQU8sR0FBRyxJQUFJLENBQUM7b0JBQ2YsT0FBTyxXQUFXLENBQUM7Z0JBQ3JCLENBQUM7Z0JBQ0QsTUFBTTtZQUNSO2dCQUNFLDRGQUE0RjtnQkFDNUYsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9DLGVBQWUsR0FBRyxlQUFlLElBQUksc0JBQXNCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNwRixNQUFNO1FBQ1YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxFQUNELEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQzNCLENBQUM7SUFDRixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHlCQUF5QixDQUNoQyxJQUE4QyxFQUM5QyxNQUF3QztJQUV4QyxpR0FBaUc7SUFDakcsc0JBQXNCO0lBQ3RCLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQixLQUFLLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVO1lBQ3JDLElBQUksSUFBSSxDQUFDLFdBQVcsWUFBWSxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNqRix3RkFBd0Y7Z0JBQ3hGLHlGQUF5RjtnQkFDekYsMEZBQTBGO2dCQUMxRixhQUFhO2dCQUNiLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsS0FBSyxFQUFFLENBQUMsb0JBQW9CLENBQUMsT0FBTztZQUNsQyxvREFBb0Q7WUFDcEQsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQzVDO1lBQ0UsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgbyBmcm9tICcuLi8uLi8uLi8uLi9vdXRwdXQvb3V0cHV0X2FzdCc7XG5pbXBvcnQgKiBhcyBpciBmcm9tICcuLi8uLi9pcic7XG5pbXBvcnQge0NvbXBpbGF0aW9uSm9ifSBmcm9tICcuLi9jb21waWxhdGlvbic7XG5cbi8qKlxuICogT3B0aW1pemUgdmFyaWFibGVzIGRlY2xhcmVkIGFuZCB1c2VkIGluIHRoZSBJUi5cbiAqXG4gKiBWYXJpYWJsZXMgYXJlIGVhZ2VybHkgZ2VuZXJhdGVkIGJ5IHBpcGVsaW5lIHN0YWdlcyBmb3IgYWxsIHBvc3NpYmxlIHZhbHVlcyB0aGF0IGNvdWxkIGJlXG4gKiByZWZlcmVuY2VkLiBUaGlzIHN0YWdlIHByb2Nlc3NlcyB0aGUgbGlzdCBvZiBkZWNsYXJlZCB2YXJpYWJsZXMgYW5kIGFsbCB2YXJpYWJsZSB1c2FnZXMsXG4gKiBhbmQgb3B0aW1pemVzIHdoZXJlIHBvc3NpYmxlLiBJdCBwZXJmb3JtcyAzIG1haW4gb3B0aW1pemF0aW9uczpcbiAqXG4gKiAgICogSXQgdHJhbnNmb3JtcyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgdG8gc2lkZSBlZmZlY3RmdWwgZXhwcmVzc2lvbnMgd2hlbiB0aGVcbiAqICAgICB2YXJpYWJsZSBpcyBub3QgdXNlZCwgYnV0IGl0cyBpbml0aWFsaXplciBoYXMgZ2xvYmFsIGVmZmVjdHMgd2hpY2ggb3RoZXJcbiAqICAgICBvcGVyYXRpb25zIHJlbHkgdXBvbi5cbiAqICAgKiBJdCByZW1vdmVzIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBpZiB0aG9zZSB2YXJpYWJsZXMgYXJlIG5vdCByZWZlcmVuY2VkIGFuZFxuICogICAgIGVpdGhlciB0aGV5IGRvIG5vdCBoYXZlIGdsb2JhbCBlZmZlY3RzLCBvciBub3RoaW5nIHJlbGllcyBvbiB0aGVtLlxuICogICAqIEl0IGlubGluZXMgdmFyaWFibGUgZGVjbGFyYXRpb25zIHdoZW4gdGhvc2UgdmFyaWFibGVzIGFyZSBvbmx5IHVzZWQgb25jZVxuICogICAgIGFuZCB0aGUgaW5saW5pbmcgaXMgc2VtYW50aWNhbGx5IHNhZmUuXG4gKlxuICogVG8gZ3VhcmFudGVlIGNvcnJlY3RuZXNzLCBhbmFseXNpcyBvZiBcImZlbmNlc1wiIGluIHRoZSBpbnN0cnVjdGlvbiBsaXN0cyBpcyB1c2VkIHRvIGRldGVybWluZVxuICogd2hpY2ggb3B0aW1pemF0aW9ucyBhcmUgc2FmZSB0byBwZXJmb3JtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW1pemVWYXJpYWJsZXMoam9iOiBDb21waWxhdGlvbkpvYik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgaW5saW5lQWx3YXlzSW5saW5lVmFyaWFibGVzKHVuaXQuY3JlYXRlKTtcbiAgICBpbmxpbmVBbHdheXNJbmxpbmVWYXJpYWJsZXModW5pdC51cGRhdGUpO1xuXG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LmNyZWF0ZSkge1xuICAgICAgaWYgKG9wLmtpbmQgPT09IGlyLk9wS2luZC5MaXN0ZW5lciB8fCBvcC5raW5kID09PSBpci5PcEtpbmQuVHdvV2F5TGlzdGVuZXIpIHtcbiAgICAgICAgaW5saW5lQWx3YXlzSW5saW5lVmFyaWFibGVzKG9wLmhhbmRsZXJPcHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9wdGltaXplVmFyaWFibGVzSW5PcExpc3QodW5pdC5jcmVhdGUsIGpvYi5jb21wYXRpYmlsaXR5KTtcbiAgICBvcHRpbWl6ZVZhcmlhYmxlc0luT3BMaXN0KHVuaXQudXBkYXRlLCBqb2IuY29tcGF0aWJpbGl0eSk7XG5cbiAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQuY3JlYXRlKSB7XG4gICAgICBpZiAob3Aua2luZCA9PT0gaXIuT3BLaW5kLkxpc3RlbmVyIHx8IG9wLmtpbmQgPT09IGlyLk9wS2luZC5Ud29XYXlMaXN0ZW5lcikge1xuICAgICAgICBvcHRpbWl6ZVZhcmlhYmxlc0luT3BMaXN0KG9wLmhhbmRsZXJPcHMsIGpvYi5jb21wYXRpYmlsaXR5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIFtmZW5jZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWVtb3J5X2JhcnJpZXIpIGZsYWcgZm9yIGFuIGV4cHJlc3Npb24gd2hpY2ggaW5kaWNhdGVzXG4gKiBob3cgdGhhdCBleHByZXNzaW9uIGNhbiBiZSBvcHRpbWl6ZWQgaW4gcmVsYXRpb24gdG8gb3RoZXIgZXhwcmVzc2lvbnMgb3IgaW5zdHJ1Y3Rpb25zLlxuICpcbiAqIGBGZW5jZWBzIGFyZSBhIGJpdGZpZWxkLCBzbyBtdWx0aXBsZSBmbGFncyBtYXkgYmUgc2V0IG9uIGEgc2luZ2xlIGV4cHJlc3Npb24uXG4gKi9cbmVudW0gRmVuY2Uge1xuICAvKipcbiAgICogRW1wdHkgZmxhZyAobm8gZmVuY2UgZXhpc3RzKS5cbiAgICovXG4gIE5vbmUgPSAwYjAwMCxcblxuICAvKipcbiAgICogQSBjb250ZXh0IHJlYWQgZmVuY2UsIG1lYW5pbmcgdGhhdCB0aGUgZXhwcmVzc2lvbiBpbiBxdWVzdGlvbiByZWFkcyBmcm9tIHRoZSBcImN1cnJlbnQgdmlld1wiXG4gICAqIGNvbnRleHQgb2YgdGhlIHJ1bnRpbWUuXG4gICAqL1xuICBWaWV3Q29udGV4dFJlYWQgPSAwYjAwMSxcblxuICAvKipcbiAgICogQSBjb250ZXh0IHdyaXRlIGZlbmNlLCBtZWFuaW5nIHRoYXQgdGhlIGV4cHJlc3Npb24gaW4gcXVlc3Rpb24gd3JpdGVzIHRvIHRoZSBcImN1cnJlbnQgdmlld1wiXG4gICAqIGNvbnRleHQgb2YgdGhlIHJ1bnRpbWUuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBhbGwgYENvbnRleHRXcml0ZWAgZmVuY2VzIGFyZSBpbXBsaWNpdGx5IGBDb250ZXh0UmVhZGAgZmVuY2VzIGFzIG9wZXJhdGlvbnMgd2hpY2hcbiAgICogY2hhbmdlIHRoZSB2aWV3IGNvbnRleHQgZG8gc28gYmFzZWQgb24gdGhlIGN1cnJlbnQgb25lLlxuICAgKi9cbiAgVmlld0NvbnRleHRXcml0ZSA9IDBiMDEwLFxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCBhIGNhbGwgaXMgcmVxdWlyZWQgZm9yIGl0cyBzaWRlLWVmZmVjdHMsIGV2ZW4gaWYgbm90aGluZyByZWFkcyBpdHMgcmVzdWx0LlxuICAgKlxuICAgKiBUaGlzIGlzIGFsc28gdHJ1ZSBvZiBgVmlld0NvbnRleHRXcml0ZWAgb3BlcmF0aW9ucyAqKmlmKiogdGhleSBhcmUgZm9sbG93ZWQgYnkgYVxuICAgKiBgVmlld0NvbnRleHRSZWFkYC5cbiAgICovXG4gIFNpZGVFZmZlY3RmdWwgPSAwYjEwMCxcbn1cblxuLyoqXG4gKiBTdW1tYXJ5IGRhdGEgY29sbGVjdGVkIGZvciBlYWNoIGBPcGAgaW4gYSBsaXN0LlxuICpcbiAqIFRyYWNraW5nIHRoaXMgZGF0YSBwZXIgb3BlcmF0aW9uIGFsbG93cyB0aGUgb3B0aW1pemVyIHRvIHByb2Nlc3Mgb3BlcmF0aW9ucyBhdCBhIGhpZ2hlciBsZXZlbFxuICogdGhhbiBhbHdheXMgc2Nhbm5pbmcgZXhwcmVzc2lvbnMuXG4gKi9cbmludGVyZmFjZSBPcEluZm8ge1xuICAvKipcbiAgICogQSBgU2V0YCBvZiB2YXJpYWJsZXMgcmVmZXJlbmNlZCBieSBleHByZXNzaW9ucyBpbiB0aGlzIG9wZXJhdGlvbi5cbiAgICovXG4gIHZhcmlhYmxlc1VzZWQ6IFNldDxpci5YcmVmSWQ+O1xuXG4gIC8qKlxuICAgKiBGbGFncyBpbmRpY2F0aW5nIGFueSBgRmVuY2VgcyBwcmVzZW50IGZvciB0aGlzIG9wZXJhdGlvbi5cbiAgICovXG4gIGZlbmNlczogRmVuY2U7XG59XG5cbmZ1bmN0aW9uIGlubGluZUFsd2F5c0lubGluZVZhcmlhYmxlcyhvcHM6IGlyLk9wTGlzdDxpci5DcmVhdGVPcCB8IGlyLlVwZGF0ZU9wPik6IHZvaWQge1xuICBjb25zdCB2YXJzID0gbmV3IE1hcDxpci5YcmVmSWQsIGlyLlZhcmlhYmxlT3A8aXIuQ3JlYXRlT3AgfCBpci5VcGRhdGVPcD4+KCk7XG4gIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7XG4gICAgaWYgKG9wLmtpbmQgPT09IGlyLk9wS2luZC5WYXJpYWJsZSAmJiBvcC5mbGFncyAmIGlyLlZhcmlhYmxlRmxhZ3MuQWx3YXlzSW5saW5lKSB7XG4gICAgICBpci52aXNpdEV4cHJlc3Npb25zSW5PcChvcCwgKGV4cHIpID0+IHtcbiAgICAgICAgaWYgKGlyLmlzSXJFeHByZXNzaW9uKGV4cHIpICYmIGZlbmNlc0ZvcklyRXhwcmVzc2lvbihleHByKSAhPT0gRmVuY2UuTm9uZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzZXJ0aW9uRXJyb3I6IEEgY29udGV4dC1zZW5zaXRpdmUgdmFyaWFibGUgd2FzIG1hcmtlZCBBbHdheXNJbmxpbmVgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB2YXJzLnNldChvcC54cmVmLCBvcCk7XG4gICAgfVxuXG4gICAgaXIudHJhbnNmb3JtRXhwcmVzc2lvbnNJbk9wKFxuICAgICAgb3AsXG4gICAgICAoZXhwcikgPT4ge1xuICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIGlyLlJlYWRWYXJpYWJsZUV4cHIgJiYgdmFycy5oYXMoZXhwci54cmVmKSkge1xuICAgICAgICAgIGNvbnN0IHZhck9wID0gdmFycy5nZXQoZXhwci54cmVmKSE7XG4gICAgICAgICAgLy8gSW5saW5lIGJ5IGNsb25pbmcsIGJlY2F1c2Ugd2UgbWlnaHQgaW5saW5lIGludG8gbXVsdGlwbGUgcGxhY2VzLlxuICAgICAgICAgIHJldHVybiB2YXJPcC5pbml0aWFsaXplci5jbG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHByO1xuICAgICAgfSxcbiAgICAgIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5Ob25lLFxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IG9wIG9mIHZhcnMudmFsdWVzKCkpIHtcbiAgICBpci5PcExpc3QucmVtb3ZlKG9wIGFzIGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3ApO1xuICB9XG59XG5cbi8qKlxuICogUHJvY2VzcyBhIGxpc3Qgb2Ygb3BlcmF0aW9ucyBhbmQgb3B0aW1pemUgdmFyaWFibGVzIHdpdGhpbiB0aGF0IGxpc3QuXG4gKi9cbmZ1bmN0aW9uIG9wdGltaXplVmFyaWFibGVzSW5PcExpc3QoXG4gIG9wczogaXIuT3BMaXN0PGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3A+LFxuICBjb21wYXRpYmlsaXR5OiBpci5Db21wYXRpYmlsaXR5TW9kZSxcbik6IHZvaWQge1xuICBjb25zdCB2YXJEZWNscyA9IG5ldyBNYXA8aXIuWHJlZklkLCBpci5WYXJpYWJsZU9wPGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3A+PigpO1xuICBjb25zdCB2YXJVc2FnZXMgPSBuZXcgTWFwPGlyLlhyZWZJZCwgbnVtYmVyPigpO1xuXG4gIC8vIFRyYWNrIHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIG91dHNpZGUgb2YgdGhlIGltbWVkaWF0ZSBvcGVyYXRpb24gbGlzdC4gRm9yIGV4YW1wbGUsIHdpdGhpblxuICAvLyBgTGlzdGVuZXJPcGAgaGFuZGxlciBvcGVyYXRpb25zIG9mIGxpc3RlbmVycyBpbiB0aGUgY3VycmVudCBvcGVyYXRpb24gbGlzdC5cbiAgY29uc3QgdmFyUmVtb3RlVXNhZ2VzID0gbmV3IFNldDxpci5YcmVmSWQ+KCk7XG4gIGNvbnN0IG9wTWFwID0gbmV3IE1hcDxpci5DcmVhdGVPcCB8IGlyLlVwZGF0ZU9wLCBPcEluZm8+KCk7XG5cbiAgLy8gRmlyc3QsIGV4dHJhY3QgaW5mb3JtYXRpb24gYWJvdXQgdmFyaWFibGVzIGRlY2xhcmVkIG9yIHVzZWQgd2l0aGluIHRoZSB3aG9sZSBsaXN0LlxuICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgIGlmIChvcC5raW5kID09PSBpci5PcEtpbmQuVmFyaWFibGUpIHtcbiAgICAgIGlmICh2YXJEZWNscy5oYXMob3AueHJlZikgfHwgdmFyVXNhZ2VzLmhhcyhvcC54cmVmKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNob3VsZCBub3Qgc2VlIHR3byBkZWNsYXJhdGlvbnMgb2YgdGhlIHNhbWUgdmFyaWFibGU6ICR7b3AueHJlZn1gKTtcbiAgICAgIH1cbiAgICAgIHZhckRlY2xzLnNldChvcC54cmVmLCBvcCk7XG4gICAgICB2YXJVc2FnZXMuc2V0KG9wLnhyZWYsIDApO1xuICAgIH1cblxuICAgIG9wTWFwLnNldChvcCwgY29sbGVjdE9wSW5mbyhvcCkpO1xuICAgIGNvdW50VmFyaWFibGVVc2FnZXMob3AsIHZhclVzYWdlcywgdmFyUmVtb3RlVXNhZ2VzKTtcbiAgfVxuXG4gIC8vIFRoZSBuZXh0IHN0ZXAgaXMgdG8gcmVtb3ZlIGFueSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgZm9yIHZhcmlhYmxlcyB0aGF0IGFyZW4ndCB1c2VkLiBUaGVcbiAgLy8gdmFyaWFibGUgaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbnMgbWF5IGJlIHNpZGUtZWZmZWN0ZnVsLCBzbyB0aGV5IG1heSBuZWVkIHRvIGJlIHJldGFpbmVkIGFzXG4gIC8vIGV4cHJlc3Npb24gc3RhdGVtZW50cy5cblxuICAvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIHNlZW4gYW4gb3BlcmF0aW9uIHdoaWNoIHJlYWRzIGZyb20gdGhlIHZpZXcgY29udGV4dCB5ZXQuIFRoaXMgaXMgdXNlZCB0b1xuICAvLyBkZXRlcm1pbmUgd2hldGhlciBhIHdyaXRlIHRvIHRoZSB2aWV3IGNvbnRleHQgaW4gYSB2YXJpYWJsZSBpbml0aWFsaXplciBjYW4gYmUgb2JzZXJ2ZWQuXG4gIGxldCBjb250ZXh0SXNVc2VkID0gZmFsc2U7XG5cbiAgLy8gTm90ZSB0aGF0IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBsaXN0IGhhcHBlbnMgaW4gcmV2ZXJzZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGF0IHdlJ2xsIHByb2Nlc3NcbiAgLy8gYWxsIHJlYWRzIG9mIGEgdmFyaWFibGUgcHJpb3IgdG8gcHJvY2Vzc2luZyBpdHMgZGVjbGFyYXRpb24uXG4gIGZvciAoY29uc3Qgb3Agb2Ygb3BzLnJldmVyc2VkKCkpIHtcbiAgICBjb25zdCBvcEluZm8gPSBvcE1hcC5nZXQob3ApITtcblxuICAgIGlmIChvcC5raW5kID09PSBpci5PcEtpbmQuVmFyaWFibGUgJiYgdmFyVXNhZ2VzLmdldChvcC54cmVmKSEgPT09IDApIHtcbiAgICAgIC8vIFRoaXMgdmFyaWFibGUgaXMgdW51c2VkIGFuZCBjYW4gYmUgcmVtb3ZlZC4gV2UgbWlnaHQgbmVlZCB0byBrZWVwIHRoZSBpbml0aWFsaXplciBhcm91bmQsXG4gICAgICAvLyB0aG91Z2gsIGlmIHNvbWV0aGluZyBkZXBlbmRzIG9uIGl0IHJ1bm5pbmcuXG4gICAgICBpZiAoXG4gICAgICAgIChjb250ZXh0SXNVc2VkICYmIG9wSW5mby5mZW5jZXMgJiBGZW5jZS5WaWV3Q29udGV4dFdyaXRlKSB8fFxuICAgICAgICBvcEluZm8uZmVuY2VzICYgRmVuY2UuU2lkZUVmZmVjdGZ1bFxuICAgICAgKSB7XG4gICAgICAgIC8vIFRoaXMgdmFyaWFibGUgaW5pdGlhbGl6ZXIgaGFzIGEgc2lkZSBlZmZlY3Qgd2hpY2ggbXVzdCBiZSByZXRhaW5lZC4gRWl0aGVyOlxuICAgICAgICAvLyAgKiBpdCB3cml0ZXMgdG8gdGhlIHZpZXcgY29udGV4dCwgYW5kIHdlIGtub3cgdGhlcmUgaXMgYSBmdXR1cmUgb3BlcmF0aW9uIHdoaWNoIGRlcGVuZHNcbiAgICAgICAgLy8gICAgb24gdGhhdCB3cml0ZSwgb3JcbiAgICAgICAgLy8gICogaXQncyBhbiBvcGVyYXRpb24gd2hpY2ggaXMgaW5oZXJlbnRseSBzaWRlLWVmZmVjdGZ1bC5cbiAgICAgICAgLy8gV2UgY2FuJ3QgcmVtb3ZlIHRoZSBpbml0aWFsaXplciwgYnV0IHdlIGNhbiByZW1vdmUgdGhlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGl0c2VsZiBhbmRcbiAgICAgICAgLy8gcmVwbGFjZSBpdCB3aXRoIGEgc2lkZS1lZmZlY3RmdWwgc3RhdGVtZW50LlxuICAgICAgICBjb25zdCBzdG10T3AgPSBpci5jcmVhdGVTdGF0ZW1lbnRPcChvcC5pbml0aWFsaXplci50b1N0bXQoKSkgYXMgaXIuVXBkYXRlT3A7XG4gICAgICAgIG9wTWFwLnNldChzdG10T3AsIG9wSW5mbyk7XG4gICAgICAgIGlyLk9wTGlzdC5yZXBsYWNlKG9wIGFzIGlyLlVwZGF0ZU9wLCBzdG10T3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXQncyBzYWZlIHRvIGRlbGV0ZSB0aGlzIGVudGlyZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBhcyBub3RoaW5nIGRlcGVuZHMgb24gaXQsIGV2ZW5cbiAgICAgICAgLy8gc2lkZS1lZmZlY3RmdWxseS4gTm90ZSB0aGF0IGRvaW5nIHRoaXMgbWlnaHQgbWFrZSBvdGhlciB2YXJpYWJsZXMgdW51c2VkLiBTaW5jZSB3ZSdyZVxuICAgICAgICAvLyBpdGVyYXRpbmcgaW4gcmV2ZXJzZSBvcmRlciwgd2Ugc2hvdWxkIGFsd2F5cyBiZSBwcm9jZXNzaW5nIHVzYWdlcyBiZWZvcmUgZGVjbGFyYXRpb25zXG4gICAgICAgIC8vIGFuZCB0aGVyZWZvcmUgYnkgdGhlIHRpbWUgd2UgZ2V0IHRvIGEgZGVjbGFyYXRpb24sIGFsbCByZW1vdmFibGUgdXNhZ2VzIHdpbGwgaGF2ZSBiZWVuXG4gICAgICAgIC8vIHJlbW92ZWQuXG4gICAgICAgIHVuY291bnRWYXJpYWJsZVVzYWdlcyhvcCwgdmFyVXNhZ2VzKTtcbiAgICAgICAgaXIuT3BMaXN0LnJlbW92ZShvcCBhcyBpci5VcGRhdGVPcCk7XG4gICAgICB9XG5cbiAgICAgIG9wTWFwLmRlbGV0ZShvcCk7XG4gICAgICB2YXJEZWNscy5kZWxldGUob3AueHJlZik7XG4gICAgICB2YXJVc2FnZXMuZGVsZXRlKG9wLnhyZWYpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gRG9lcyB0aGlzIG9wZXJhdGlvbiBkZXBlbmQgb24gdGhlIHZpZXcgY29udGV4dD9cbiAgICBpZiAob3BJbmZvLmZlbmNlcyAmIEZlbmNlLlZpZXdDb250ZXh0UmVhZCkge1xuICAgICAgY29udGV4dElzVXNlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gTmV4dCwgaW5saW5lIGFueSByZW1haW5pbmcgdmFyaWFibGVzIHdpdGggZXhhY3RseSBvbmUgdXNhZ2UuXG4gIGNvbnN0IHRvSW5saW5lOiBpci5YcmVmSWRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtpZCwgY291bnRdIG9mIHZhclVzYWdlcykge1xuICAgIGNvbnN0IGRlY2wgPSB2YXJEZWNscy5nZXQoaWQpITtcbiAgICAvLyBXZSBjYW4gaW5saW5lIHZhcmlhYmxlcyB0aGF0OlxuICAgIC8vICAtIGFyZSB1c2VkIGV4YWN0bHkgb25jZSwgYW5kXG4gICAgLy8gIC0gYXJlIG5vdCB1c2VkIHJlbW90ZWx5XG4gICAgLy8gT1JcbiAgICAvLyAgLSBhcmUgbWFya2VkIGZvciBhbHdheXMgaW5saW5pbmdcbiAgICBjb25zdCBpc0Fsd2F5c0lubGluZSA9ICEhKGRlY2wuZmxhZ3MgJiBpci5WYXJpYWJsZUZsYWdzLkFsd2F5c0lubGluZSk7XG4gICAgaWYgKGNvdW50ICE9PSAxIHx8IGlzQWx3YXlzSW5saW5lKSB7XG4gICAgICAvLyBXZSBjYW4ndCBpbmxpbmUgdGhpcyB2YXJpYWJsZSBhcyBpdCdzIHVzZWQgbW9yZSB0aGFuIG9uY2UuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodmFyUmVtb3RlVXNhZ2VzLmhhcyhpZCkpIHtcbiAgICAgIC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBvbmNlLCBidXQgYWNyb3NzIGFuIG9wZXJhdGlvbiBib3VuZGFyeSwgc28gaXQgY2FuJ3QgYmUgaW5saW5lZC5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRvSW5saW5lLnB1c2goaWQpO1xuICB9XG5cbiAgbGV0IGNhbmRpZGF0ZTogaXIuWHJlZklkIHwgdW5kZWZpbmVkO1xuICB3aGlsZSAoKGNhbmRpZGF0ZSA9IHRvSW5saW5lLnBvcCgpKSkge1xuICAgIC8vIFdlIHdpbGwgYXR0ZW1wdCB0byBpbmxpbmUgdGhpcyB2YXJpYWJsZS4gSWYgaW5saW5pbmcgZmFpbHMgKGR1ZSB0byBmZW5jZXMgZm9yIGV4YW1wbGUpLFxuICAgIC8vIG5vIGZ1dHVyZSBvcGVyYXRpb24gd2lsbCBtYWtlIGlubGluaW5nIGxlZ2FsLlxuICAgIGNvbnN0IGRlY2wgPSB2YXJEZWNscy5nZXQoY2FuZGlkYXRlKSE7XG4gICAgY29uc3QgdmFySW5mbyA9IG9wTWFwLmdldChkZWNsIGFzIGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3ApITtcbiAgICBjb25zdCBpc0Fsd2F5c0lubGluZSA9ICEhKGRlY2wuZmxhZ3MgJiBpci5WYXJpYWJsZUZsYWdzLkFsd2F5c0lubGluZSk7XG5cbiAgICBpZiAoaXNBbHdheXNJbmxpbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFzc2VydGlvbkVycm9yOiBGb3VuZCBhbiAnQWx3YXlzSW5saW5lJyB2YXJpYWJsZSBhZnRlciB0aGUgYWx3YXlzIGlubGluaW5nIHBhc3MuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2NhbiBvcGVyYXRpb25zIGZvbGxvd2luZyB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gYW5kIGxvb2sgZm9yIHRoZSBwb2ludCB3aGVyZSB0aGF0IHZhcmlhYmxlXG4gICAgLy8gaXMgdXNlZC4gVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIHVzYWdlIGdpdmVuIHRoZSBwcmVjb25kaXRpb24gYWJvdmUuXG4gICAgZm9yIChcbiAgICAgIGxldCB0YXJnZXRPcCA9IGRlY2wubmV4dCE7XG4gICAgICB0YXJnZXRPcC5raW5kICE9PSBpci5PcEtpbmQuTGlzdEVuZDtcbiAgICAgIHRhcmdldE9wID0gdGFyZ2V0T3AubmV4dCFcbiAgICApIHtcbiAgICAgIGNvbnN0IG9wSW5mbyA9IG9wTWFwLmdldCh0YXJnZXRPcCkhO1xuXG4gICAgICAvLyBJcyB0aGUgdmFyaWFibGUgdXNlZCBpbiB0aGlzIG9wZXJhdGlvbj9cbiAgICAgIGlmIChvcEluZm8udmFyaWFibGVzVXNlZC5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY29tcGF0aWJpbGl0eSA9PT0gaXIuQ29tcGF0aWJpbGl0eU1vZGUuVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlciAmJlxuICAgICAgICAgICFhbGxvd0NvbnNlcnZhdGl2ZUlubGluaW5nKGRlY2wsIHRhcmdldE9wKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBXZSdyZSBpbiBjb25zZXJ2YXRpdmUgbW9kZSwgYW5kIHRoaXMgdmFyaWFibGUgaXMgbm90IGVsaWdpYmxlIGZvciBpbmxpbmluZyBpbnRvIHRoZVxuICAgICAgICAgIC8vIHRhcmdldCBvcGVyYXRpb24gaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWWVzLCB0cnkgdG8gaW5saW5lIGl0LiBJbmxpbmluZyBtYXkgbm90IGJlIHN1Y2Nlc3NmdWwgaWYgZmVuY2VzIGluIHRoaXMgb3BlcmF0aW9uIGJlZm9yZVxuICAgICAgICAvLyB0aGUgdmFyaWFibGUncyB1c2FnZSBjYW5ub3QgYmUgc2FmZWx5IGNyb3NzZWQuXG4gICAgICAgIGlmICh0cnlJbmxpbmVWYXJpYWJsZUluaXRpYWxpemVyKGNhbmRpZGF0ZSwgZGVjbC5pbml0aWFsaXplciwgdGFyZ2V0T3AsIHZhckluZm8uZmVuY2VzKSkge1xuICAgICAgICAgIC8vIElubGluaW5nIHdhcyBzdWNjZXNzZnVsISBVcGRhdGUgdGhlIHRyYWNraW5nIHN0cnVjdHVyZXMgdG8gcmVmbGVjdCB0aGUgaW5saW5lZFxuICAgICAgICAgIC8vIHZhcmlhYmxlLlxuICAgICAgICAgIG9wSW5mby52YXJpYWJsZXNVc2VkLmRlbGV0ZShjYW5kaWRhdGUpO1xuXG4gICAgICAgICAgLy8gQWRkIGFsbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgdmFyaWFibGUncyBpbml0aWFsaXplciB0byBpdHMgbmV3IHVzYWdlIHNpdGUuXG4gICAgICAgICAgZm9yIChjb25zdCBpZCBvZiB2YXJJbmZvLnZhcmlhYmxlc1VzZWQpIHtcbiAgICAgICAgICAgIG9wSW5mby52YXJpYWJsZXNVc2VkLmFkZChpZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTWVyZ2UgZmVuY2VzIGluIHRoZSB2YXJpYWJsZSdzIGluaXRpYWxpemVyIGludG8gaXRzIG5ldyB1c2FnZSBzaXRlLlxuICAgICAgICAgIG9wSW5mby5mZW5jZXMgfD0gdmFySW5mby5mZW5jZXM7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdHJhY2tpbmcgaW5mbyByZWxhdGVkIHRvIHRoZSBkZWNsYXJhdGlvbi5cbiAgICAgICAgICB2YXJEZWNscy5kZWxldGUoY2FuZGlkYXRlKTtcbiAgICAgICAgICB2YXJVc2FnZXMuZGVsZXRlKGNhbmRpZGF0ZSk7XG4gICAgICAgICAgb3BNYXAuZGVsZXRlKGRlY2wgYXMgaXIuQ3JlYXRlT3AgfCBpci5VcGRhdGVPcCk7XG5cbiAgICAgICAgICAvLyBBbmQgZmluYWxseSwgZGVsZXRlIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiBmcm9tIHRoZSBvcGVyYXRpb24gbGlzdC5cbiAgICAgICAgICBpci5PcExpc3QucmVtb3ZlKGRlY2wgYXMgaXIuVXBkYXRlT3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hldGhlciBpbmxpbmluZyBzdWNjZWVkZWQgb3IgZmFpbGVkLCB3ZSdyZSBkb25lIHByb2Nlc3NpbmcgdGhpcyB2YXJpYWJsZS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB2YXJpYWJsZSBpcyBub3QgdXNlZCBpbiB0aGlzIG9wZXJhdGlvbiwgdGhlbiB3ZSdkIG5lZWQgdG8gaW5saW5lIGFjcm9zcyBpdC4gQ2hlY2sgaWZcbiAgICAgIC8vIHRoYXQncyBzYWZlIHRvIGRvLlxuICAgICAgaWYgKCFzYWZlVG9JbmxpbmVQYXN0RmVuY2VzKG9wSW5mby5mZW5jZXMsIHZhckluZm8uZmVuY2VzKSkge1xuICAgICAgICAvLyBXZSBjYW4ndCBzYWZlbHkgaW5saW5lIHRoaXMgdmFyaWFibGUgYmV5b25kIHRoaXMgb3BlcmF0aW9uLCBzbyBkb24ndCBwcm9jZWVkIHdpdGhcbiAgICAgICAgLy8gaW5saW5pbmcgdGhpcyB2YXJpYWJsZS5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gYGlyLkV4cHJlc3Npb25gLCByZXR1cm5zIHRoZSBgRmVuY2VgIGZsYWdzIGZvciB0aGF0IGV4cHJlc3Npb24gdHlwZS5cbiAqL1xuZnVuY3Rpb24gZmVuY2VzRm9ySXJFeHByZXNzaW9uKGV4cHI6IGlyLkV4cHJlc3Npb24pOiBGZW5jZSB7XG4gIHN3aXRjaCAoZXhwci5raW5kKSB7XG4gICAgY2FzZSBpci5FeHByZXNzaW9uS2luZC5OZXh0Q29udGV4dDpcbiAgICAgIHJldHVybiBGZW5jZS5WaWV3Q29udGV4dFJlYWQgfCBGZW5jZS5WaWV3Q29udGV4dFdyaXRlO1xuICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVzdG9yZVZpZXc6XG4gICAgICByZXR1cm4gRmVuY2UuVmlld0NvbnRleHRSZWFkIHwgRmVuY2UuVmlld0NvbnRleHRXcml0ZSB8IEZlbmNlLlNpZGVFZmZlY3RmdWw7XG4gICAgY2FzZSBpci5FeHByZXNzaW9uS2luZC5TdG9yZUxldDpcbiAgICAgIHJldHVybiBGZW5jZS5TaWRlRWZmZWN0ZnVsO1xuICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVmZXJlbmNlOlxuICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuQ29udGV4dExldFJlZmVyZW5jZTpcbiAgICAgIHJldHVybiBGZW5jZS5WaWV3Q29udGV4dFJlYWQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBGZW5jZS5Ob25lO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGBPcEluZm9gIHN0cnVjdHVyZSBmb3IgdGhlIGdpdmVuIGBvcGAuIFRoaXMgcGVyZm9ybXMgdHdvIG9wZXJhdGlvbnM6XG4gKlxuICogICogSXQgdHJhY2tzIHdoaWNoIHZhcmlhYmxlcyBhcmUgdXNlZCBpbiB0aGUgb3BlcmF0aW9uJ3MgZXhwcmVzc2lvbnMuXG4gKiAgKiBJdCByb2xscyB1cCBmZW5jZSBmbGFncyBmb3IgZXhwcmVzc2lvbnMgd2l0aGluIHRoZSBvcGVyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RPcEluZm8ob3A6IGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3ApOiBPcEluZm8ge1xuICBsZXQgZmVuY2VzID0gRmVuY2UuTm9uZTtcbiAgY29uc3QgdmFyaWFibGVzVXNlZCA9IG5ldyBTZXQ8aXIuWHJlZklkPigpO1xuICBpci52aXNpdEV4cHJlc3Npb25zSW5PcChvcCwgKGV4cHIpID0+IHtcbiAgICBpZiAoIWlyLmlzSXJFeHByZXNzaW9uKGV4cHIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChleHByLmtpbmQpIHtcbiAgICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVhZFZhcmlhYmxlOlxuICAgICAgICB2YXJpYWJsZXNVc2VkLmFkZChleHByLnhyZWYpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGZlbmNlcyB8PSBmZW5jZXNGb3JJckV4cHJlc3Npb24oZXhwcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHtmZW5jZXMsIHZhcmlhYmxlc1VzZWR9O1xufVxuXG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgdXNhZ2VzIG9mIGVhY2ggdmFyaWFibGUsIGJlaW5nIGNhcmVmdWwgdG8gdHJhY2sgd2hldGhlciB0aG9zZSB1c2FnZXMgYXJlXG4gKiBsb2NhbCBvciByZW1vdGUuXG4gKi9cbmZ1bmN0aW9uIGNvdW50VmFyaWFibGVVc2FnZXMoXG4gIG9wOiBpci5DcmVhdGVPcCB8IGlyLlVwZGF0ZU9wLFxuICB2YXJVc2FnZXM6IE1hcDxpci5YcmVmSWQsIG51bWJlcj4sXG4gIHZhclJlbW90ZVVzYWdlOiBTZXQ8aXIuWHJlZklkPixcbik6IHZvaWQge1xuICBpci52aXNpdEV4cHJlc3Npb25zSW5PcChvcCwgKGV4cHIsIGZsYWdzKSA9PiB7XG4gICAgaWYgKCFpci5pc0lyRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChleHByLmtpbmQgIT09IGlyLkV4cHJlc3Npb25LaW5kLlJlYWRWYXJpYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gdmFyVXNhZ2VzLmdldChleHByLnhyZWYpO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIHZhcmlhYmxlIGlzIGRlY2xhcmVkIG91dHNpZGUgdGhlIGN1cnJlbnQgc2NvcGUgb2Ygb3B0aW1pemF0aW9uLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXJVc2FnZXMuc2V0KGV4cHIueHJlZiwgY291bnQgKyAxKTtcblxuICAgIGlmIChmbGFncyAmIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5JbkNoaWxkT3BlcmF0aW9uKSB7XG4gICAgICB2YXJSZW1vdGVVc2FnZS5hZGQoZXhwci54cmVmKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlbW92ZSB1c2FnZXMgb2YgYSB2YXJpYWJsZSBpbiBgb3BgIGZyb20gdGhlIGB2YXJVc2FnZXNgIHRyYWNraW5nLlxuICovXG5mdW5jdGlvbiB1bmNvdW50VmFyaWFibGVVc2FnZXMoXG4gIG9wOiBpci5DcmVhdGVPcCB8IGlyLlVwZGF0ZU9wLFxuICB2YXJVc2FnZXM6IE1hcDxpci5YcmVmSWQsIG51bWJlcj4sXG4pOiB2b2lkIHtcbiAgaXIudmlzaXRFeHByZXNzaW9uc0luT3Aob3AsIChleHByKSA9PiB7XG4gICAgaWYgKCFpci5pc0lyRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChleHByLmtpbmQgIT09IGlyLkV4cHJlc3Npb25LaW5kLlJlYWRWYXJpYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gdmFyVXNhZ2VzLmdldChleHByLnhyZWYpO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGlzIHZhcmlhYmxlIGlzIGRlY2xhcmVkIG91dHNpZGUgdGhlIGN1cnJlbnQgc2NvcGUgb2Ygb3B0aW1pemF0aW9uLlxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoY291bnQgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEluYWNjdXJhdGUgdmFyaWFibGUgY291bnQ6ICR7ZXhwci54cmVmfSAtIGZvdW5kIGFub3RoZXIgcmVhZCBidXQgY291bnQgaXMgYWxyZWFkeSAwYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHZhclVzYWdlcy5zZXQoZXhwci54cmVmLCBjb3VudCAtIDEpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBpdCdzIHNhZmUgdG8gaW5saW5lIGEgdmFyaWFibGUgYWNyb3NzIGEgcGFydGljdWxhciBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIGZlbmNlcyB0aGUgZmVuY2VzIG9mIHRoZSBvcGVyYXRpb24gd2hpY2ggdGhlIGlubGluaW5nIHdpbGwgY3Jvc3NcbiAqIEBwYXJhbSBkZWNsRmVuY2VzIHRoZSBmZW5jZXMgb2YgdGhlIHZhcmlhYmxlIGJlaW5nIGlubGluZWQuXG4gKi9cbmZ1bmN0aW9uIHNhZmVUb0lubGluZVBhc3RGZW5jZXMoZmVuY2VzOiBGZW5jZSwgZGVjbEZlbmNlczogRmVuY2UpOiBib29sZWFuIHtcbiAgaWYgKGZlbmNlcyAmIEZlbmNlLlZpZXdDb250ZXh0V3JpdGUpIHtcbiAgICAvLyBJdCdzIG5vdCBzYWZlIHRvIGlubGluZSBjb250ZXh0IHJlYWRzIGFjcm9zcyBjb250ZXh0IHdyaXRlcy5cbiAgICBpZiAoZGVjbEZlbmNlcyAmIEZlbmNlLlZpZXdDb250ZXh0UmVhZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChmZW5jZXMgJiBGZW5jZS5WaWV3Q29udGV4dFJlYWQpIHtcbiAgICAvLyBJdCdzIG5vdCBzYWZlIHRvIGlubGluZSBjb250ZXh0IHdyaXRlcyBhY3Jvc3MgY29udGV4dCByZWFkcy5cbiAgICBpZiAoZGVjbEZlbmNlcyAmIEZlbmNlLlZpZXdDb250ZXh0V3JpdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byBpbmxpbmUgdGhlIGluaXRpYWxpemVyIG9mIGEgdmFyaWFibGUgaW50byBhIHRhcmdldCBvcGVyYXRpb24ncyBleHByZXNzaW9ucy5cbiAqXG4gKiBUaGlzIG1heSBvciBtYXkgbm90IGJlIHNhZmUgdG8gZG8uIEZvciBleGFtcGxlLCB0aGUgdmFyaWFibGUgY291bGQgYmUgcmVhZCBmb2xsb3dpbmcgdGhlXG4gKiBleGVjdXRpb24gb2YgYW4gZXhwcmVzc2lvbiB3aXRoIGZlbmNlcyB0aGF0IGRvbid0IHBlcm1pdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5saW5lZCBhY3Jvc3MgdGhlbS5cbiAqL1xuZnVuY3Rpb24gdHJ5SW5saW5lVmFyaWFibGVJbml0aWFsaXplcihcbiAgaWQ6IGlyLlhyZWZJZCxcbiAgaW5pdGlhbGl6ZXI6IG8uRXhwcmVzc2lvbixcbiAgdGFyZ2V0OiBpci5DcmVhdGVPcCB8IGlyLlVwZGF0ZU9wLFxuICBkZWNsRmVuY2VzOiBGZW5jZSxcbik6IGJvb2xlYW4ge1xuICAvLyBXZSB1c2UgYGlyLnRyYW5zZm9ybUV4cHJlc3Npb25zSW5PcGAgdG8gd2FsayB0aGUgZXhwcmVzc2lvbnMgYW5kIGlubGluZSB0aGUgdmFyaWFibGUgaWZcbiAgLy8gcG9zc2libGUuIFNpbmNlIHRoaXMgb3BlcmF0aW9uIGlzIGNhbGxiYWNrLWJhc2VkLCBvbmNlIGlubGluaW5nIHN1Y2NlZWRzIG9yIGZhaWxzIHdlIGNhbid0XG4gIC8vIFwic3RvcFwiIHRoZSBleHByZXNzaW9uIHByb2Nlc3NpbmcsIGFuZCBoYXZlIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBpbmxpbmluZyBoYXMgc3VjY2VlZGVkIG9yXG4gIC8vIGlzIG5vIGxvbmdlciBhbGxvd2VkLlxuICBsZXQgaW5saW5lZCA9IGZhbHNlO1xuICBsZXQgaW5saW5pbmdBbGxvd2VkID0gdHJ1ZTtcblxuICBpci50cmFuc2Zvcm1FeHByZXNzaW9uc0luT3AoXG4gICAgdGFyZ2V0LFxuICAgIChleHByLCBmbGFncykgPT4ge1xuICAgICAgaWYgKCFpci5pc0lyRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlubGluZWQgfHwgIWlubGluaW5nQWxsb3dlZCkge1xuICAgICAgICAvLyBFaXRoZXIgdGhlIGlubGluaW5nIGhhcyBhbHJlYWR5IHN1Y2NlZWRlZCwgb3Igd2UndmUgcGFzc2VkIGEgZmVuY2UgdGhhdCBkaXNhbGxvd3MgaW5saW5pbmdcbiAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgc28gZG9uJ3QgdHJ5LlxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGZsYWdzICYgaXIuVmlzaXRvckNvbnRleHRGbGFnLkluQ2hpbGRPcGVyYXRpb24gJiZcbiAgICAgICAgZGVjbEZlbmNlcyAmIEZlbmNlLlZpZXdDb250ZXh0UmVhZFxuICAgICAgKSB7XG4gICAgICAgIC8vIFdlIGNhbm5vdCBpbmxpbmUgdmFyaWFibGVzIHRoYXQgYXJlIHNlbnNpdGl2ZSB0byB0aGUgY3VycmVudCBjb250ZXh0IGFjcm9zcyBvcGVyYXRpb25cbiAgICAgICAgLy8gYm91bmRhcmllcy5cbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZXhwci5raW5kKSB7XG4gICAgICAgIGNhc2UgaXIuRXhwcmVzc2lvbktpbmQuUmVhZFZhcmlhYmxlOlxuICAgICAgICAgIGlmIChleHByLnhyZWYgPT09IGlkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSB1c2FnZSBzaXRlIG9mIHRoZSB2YXJpYWJsZS4gU2luY2Ugbm90aGluZyBoYXMgZGlzYWxsb3dlZCBpbmxpbmluZywgaXQnc1xuICAgICAgICAgICAgLy8gc2FmZSB0byBpbmxpbmUgdGhlIGluaXRpYWxpemVyIGhlcmUuXG4gICAgICAgICAgICBpbmxpbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBpbml0aWFsaXplcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gRm9yIG90aGVyIHR5cGVzIG9mIGBpci5FeHByZXNzaW9uYHMsIHdoZXRoZXIgaW5saW5pbmcgaXMgYWxsb3dlZCBkZXBlbmRzIG9uIHRoZWlyIGZlbmNlcy5cbiAgICAgICAgICBjb25zdCBleHByRmVuY2VzID0gZmVuY2VzRm9ySXJFeHByZXNzaW9uKGV4cHIpO1xuICAgICAgICAgIGlubGluaW5nQWxsb3dlZCA9IGlubGluaW5nQWxsb3dlZCAmJiBzYWZlVG9JbmxpbmVQYXN0RmVuY2VzKGV4cHJGZW5jZXMsIGRlY2xGZW5jZXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfSxcbiAgICBpci5WaXNpdG9yQ29udGV4dEZsYWcuTm9uZSxcbiAgKTtcbiAgcmV0dXJuIGlubGluZWQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGlubGluaW5nIG9mIGBkZWNsYCBzaG91bGQgYmUgYWxsb3dlZCBpbiBcImNvbnNlcnZhdGl2ZVwiIG1vZGUuXG4gKlxuICogSW4gY29uc2VydmF0aXZlIG1vZGUsIGlubGluaW5nIGJlaGF2aW9yIGlzIGxpbWl0ZWQgdG8gdGhvc2Ugb3BlcmF0aW9ucyB3aGljaCB0aGVcbiAqIGBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyYCBzdXBwb3J0ZWQsIHdpdGggdGhlIGdvYWwgb2YgcHJvZHVjaW5nIGVxdWl2YWxlbnQgb3V0cHV0LlxuICovXG5mdW5jdGlvbiBhbGxvd0NvbnNlcnZhdGl2ZUlubGluaW5nKFxuICBkZWNsOiBpci5WYXJpYWJsZU9wPGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3A+LFxuICB0YXJnZXQ6IGlyLk9wPGlyLkNyZWF0ZU9wIHwgaXIuVXBkYXRlT3A+LFxuKTogYm9vbGVhbiB7XG4gIC8vIFRPRE8oYWx4aHViKTogdW5kZXJzdGFuZCBleGFjdGx5IGhvdyBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyIGFwcHJvYWNoZXMgaW5saW5pbmcsIGFuZCByZWNvcmRcbiAgLy8gdGhhdCBiZWhhdmlvciBoZXJlLlxuICBzd2l0Y2ggKGRlY2wudmFyaWFibGUua2luZCkge1xuICAgIGNhc2UgaXIuU2VtYW50aWNWYXJpYWJsZUtpbmQuSWRlbnRpZmllcjpcbiAgICAgIGlmIChkZWNsLmluaXRpYWxpemVyIGluc3RhbmNlb2Ygby5SZWFkVmFyRXhwciAmJiBkZWNsLmluaXRpYWxpemVyLm5hbWUgPT09ICdjdHgnKSB7XG4gICAgICAgIC8vIEFsdGhvdWdoIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIgaXMgY2F1dGlvdXMgYWJvdXQgaW5saW5pbmcsIHdlIHN0aWxsIHdhbnQgdG8gZG8gc29cbiAgICAgICAgLy8gd2hlbiB0aGUgdmFyaWFibGUgaXMgdGhlIGNvbnRleHQsIHRvIGltaXRhdGUgaXRzIGJlaGF2aW9yIHdpdGggYWxpYXNlcyBpbiBjb250cm9sIGZsb3dcbiAgICAgICAgLy8gYmxvY2tzLiBUaGlzIHF1aXJreSBiZWhhdmlvciB3aWxsIGJlY29tZSBkZWFkIGNvZGUgb25jZSBjb21wYXRpYmlsaXR5IG1vZGUgaXMgbm8gbG9uZ2VyXG4gICAgICAgIC8vIHN1cHBvcnRlZC5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSBpci5TZW1hbnRpY1ZhcmlhYmxlS2luZC5Db250ZXh0OlxuICAgICAgLy8gQ29udGV4dCBjYW4gb25seSBiZSBpbmxpbmVkIGludG8gb3RoZXIgdmFyaWFibGVzLlxuICAgICAgcmV0dXJuIHRhcmdldC5raW5kID09PSBpci5PcEtpbmQuVmFyaWFibGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=
@@ -1,41 +0,0 @@
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 * as ir from '../../ir';
9
- /**
10
- * Wraps ICUs that do not already belong to an i18n block in a new i18n block.
11
- */
12
- export function wrapI18nIcus(job) {
13
- for (const unit of job.units) {
14
- let currentI18nOp = null;
15
- let addedI18nId = null;
16
- for (const op of unit.create) {
17
- switch (op.kind) {
18
- case ir.OpKind.I18nStart:
19
- currentI18nOp = op;
20
- break;
21
- case ir.OpKind.I18nEnd:
22
- currentI18nOp = null;
23
- break;
24
- case ir.OpKind.IcuStart:
25
- if (currentI18nOp === null) {
26
- addedI18nId = job.allocateXrefId();
27
- // ICU i18n start/end ops should not receive source spans.
28
- ir.OpList.insertBefore(ir.createI18nStartOp(addedI18nId, op.message, undefined, null), op);
29
- }
30
- break;
31
- case ir.OpKind.IcuEnd:
32
- if (addedI18nId !== null) {
33
- ir.OpList.insertAfter(ir.createI18nEndOp(addedI18nId, null), op);
34
- addedI18nId = null;
35
- }
36
- break;
37
- }
38
- }
39
- }
40
- }
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JhcF9pY3VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvd3JhcF9pY3VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9COztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFtQjtJQUM5QyxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLGFBQWEsR0FBMEIsSUFBSSxDQUFDO1FBQ2hELElBQUksV0FBVyxHQUFxQixJQUFJLENBQUM7UUFDekMsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0IsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTO29CQUN0QixhQUFhLEdBQUcsRUFBRSxDQUFDO29CQUNuQixNQUFNO2dCQUNSLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPO29CQUNwQixhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUNyQixNQUFNO2dCQUNSLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRO29CQUNyQixJQUFJLGFBQWEsS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDM0IsV0FBVyxHQUFHLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDbkMsMERBQTBEO3dCQUMxRCxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FDcEIsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFDOUQsRUFBRSxDQUNILENBQUM7b0JBQ0osQ0FBQztvQkFDRCxNQUFNO2dCQUNSLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNO29CQUNuQixJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDekIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQWMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQzlFLFdBQVcsR0FBRyxJQUFJLENBQUM7b0JBQ3JCLENBQUM7b0JBQ0QsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgaXIgZnJvbSAnLi4vLi4vaXInO1xuaW1wb3J0IHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG4vKipcbiAqIFdyYXBzIElDVXMgdGhhdCBkbyBub3QgYWxyZWFkeSBiZWxvbmcgdG8gYW4gaTE4biBibG9jayBpbiBhIG5ldyBpMThuIGJsb2NrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcEkxOG5JY3VzKGpvYjogQ29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGxldCBjdXJyZW50STE4bk9wOiBpci5JMThuU3RhcnRPcCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBhZGRlZEkxOG5JZDogaXIuWHJlZklkIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LmNyZWF0ZSkge1xuICAgICAgc3dpdGNoIChvcC5raW5kKSB7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkkxOG5TdGFydDpcbiAgICAgICAgICBjdXJyZW50STE4bk9wID0gb3A7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkkxOG5FbmQ6XG4gICAgICAgICAgY3VycmVudEkxOG5PcCA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkljdVN0YXJ0OlxuICAgICAgICAgIGlmIChjdXJyZW50STE4bk9wID09PSBudWxsKSB7XG4gICAgICAgICAgICBhZGRlZEkxOG5JZCA9IGpvYi5hbGxvY2F0ZVhyZWZJZCgpO1xuICAgICAgICAgICAgLy8gSUNVIGkxOG4gc3RhcnQvZW5kIG9wcyBzaG91bGQgbm90IHJlY2VpdmUgc291cmNlIHNwYW5zLlxuICAgICAgICAgICAgaXIuT3BMaXN0Lmluc2VydEJlZm9yZTxpci5DcmVhdGVPcD4oXG4gICAgICAgICAgICAgIGlyLmNyZWF0ZUkxOG5TdGFydE9wKGFkZGVkSTE4bklkLCBvcC5tZXNzYWdlLCB1bmRlZmluZWQsIG51bGwpLFxuICAgICAgICAgICAgICBvcCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGlyLk9wS2luZC5JY3VFbmQ6XG4gICAgICAgICAgaWYgKGFkZGVkSTE4bklkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpci5PcExpc3QuaW5zZXJ0QWZ0ZXI8aXIuQ3JlYXRlT3A+KGlyLmNyZWF0ZUkxOG5FbmRPcChhZGRlZEkxOG5JZCwgbnVsbCksIG9wKTtcbiAgICAgICAgICAgIGFkZGVkSTE4bklkID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,29 +0,0 @@
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 * as ir from '../../ir';
9
- /**
10
- * Gets a map of all elements in the given view by their xref id.
11
- */
12
- export function createOpXrefMap(unit) {
13
- const map = new Map();
14
- for (const op of unit.create) {
15
- if (!ir.hasConsumesSlotTrait(op)) {
16
- continue;
17
- }
18
- map.set(op.xref, op);
19
- // TODO(dylhunn): `@for` loops with `@empty` blocks need to be special-cased here,
20
- // because the slot consumer trait currently only supports one slot per consumer and we
21
- // need two. This should be revisited when making the refactors mentioned in:
22
- // https://github.com/angular/angular/pull/53620#discussion_r1430918822
23
- if (op.kind === ir.OpKind.RepeaterCreate && op.emptyView !== null) {
24
- map.set(op.emptyView, op);
25
- }
26
- }
27
- return map;
28
- }
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvdGVtcGxhdGUvcGlwZWxpbmUvc3JjL3V0aWwvZWxlbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHL0I7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixJQUFxQjtJQUVyQixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBbUQsQ0FBQztJQUN2RSxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakMsU0FBUztRQUNYLENBQUM7UUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFckIsa0ZBQWtGO1FBQ2xGLHVGQUF1RjtRQUN2Riw2RUFBNkU7UUFDN0UsdUVBQXVFO1FBQ3ZFLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2xFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBpciBmcm9tICcuLi8uLi9pcic7XG5pbXBvcnQgdHlwZSB7Q29tcGlsYXRpb25Vbml0fSBmcm9tICcuLi9jb21waWxhdGlvbic7XG5cbi8qKlxuICogR2V0cyBhIG1hcCBvZiBhbGwgZWxlbWVudHMgaW4gdGhlIGdpdmVuIHZpZXcgYnkgdGhlaXIgeHJlZiBpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9wWHJlZk1hcChcbiAgdW5pdDogQ29tcGlsYXRpb25Vbml0LFxuKTogTWFwPGlyLlhyZWZJZCwgaXIuQ29uc3VtZXNTbG90T3BUcmFpdCAmIGlyLkNyZWF0ZU9wPiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8aXIuWHJlZklkLCBpci5Db25zdW1lc1Nsb3RPcFRyYWl0ICYgaXIuQ3JlYXRlT3A+KCk7XG4gIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5jcmVhdGUpIHtcbiAgICBpZiAoIWlyLmhhc0NvbnN1bWVzU2xvdFRyYWl0KG9wKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIG1hcC5zZXQob3AueHJlZiwgb3ApO1xuXG4gICAgLy8gVE9ETyhkeWxodW5uKTogYEBmb3JgIGxvb3BzIHdpdGggYEBlbXB0eWAgYmxvY2tzIG5lZWQgdG8gYmUgc3BlY2lhbC1jYXNlZCBoZXJlLFxuICAgIC8vIGJlY2F1c2UgdGhlIHNsb3QgY29uc3VtZXIgdHJhaXQgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgb25lIHNsb3QgcGVyIGNvbnN1bWVyIGFuZCB3ZVxuICAgIC8vIG5lZWQgdHdvLiBUaGlzIHNob3VsZCBiZSByZXZpc2l0ZWQgd2hlbiBtYWtpbmcgdGhlIHJlZmFjdG9ycyBtZW50aW9uZWQgaW46XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9wdWxsLzUzNjIwI2Rpc2N1c3Npb25fcjE0MzA5MTg4MjJcbiAgICBpZiAob3Aua2luZCA9PT0gaXIuT3BLaW5kLlJlcGVhdGVyQ3JlYXRlICYmIG9wLmVtcHR5VmlldyAhPT0gbnVsbCkge1xuICAgICAgbWFwLnNldChvcC5lbXB0eVZpZXcsIG9wKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn1cbiJdfQ==