@angular/compiler 19.0.0-next.0 → 19.0.0-next.10
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.
- package/LICENSE +21 -0
- package/README.md +1 -1
- package/fesm2022/compiler.mjs +5465 -4675
- package/fesm2022/compiler.mjs.map +1 -1
- package/index.d.ts +115 -15
- package/package.json +2 -4
- package/esm2022/compiler.mjs +0 -13
- package/esm2022/index.mjs +0 -13
- package/esm2022/public_api.mjs +0 -15
- package/esm2022/src/assertions.mjs +0 -31
- package/esm2022/src/chars.mjs +0 -90
- package/esm2022/src/compiler.mjs +0 -88
- package/esm2022/src/compiler_facade_interface.mjs +0 -29
- package/esm2022/src/config.mjs +0 -20
- package/esm2022/src/constant_pool.mjs +0 -285
- package/esm2022/src/core.mjs +0 -96
- package/esm2022/src/expression_parser/ast.mjs +0 -755
- package/esm2022/src/expression_parser/lexer.mjs +0 -421
- package/esm2022/src/expression_parser/parser.mjs +0 -1222
- package/esm2022/src/i18n/digest.mjs +0 -322
- package/esm2022/src/i18n/extractor_merger.mjs +0 -409
- package/esm2022/src/i18n/i18n_ast.mjs +0 -212
- package/esm2022/src/i18n/i18n_html_parser.mjs +0 -54
- package/esm2022/src/i18n/i18n_parser.mjs +0 -247
- package/esm2022/src/i18n/index.mjs +0 -16
- package/esm2022/src/i18n/message_bundle.mjs +0 -93
- package/esm2022/src/i18n/parse_util.mjs +0 -17
- package/esm2022/src/i18n/serializers/placeholder.mjs +0 -139
- package/esm2022/src/i18n/serializers/serializer.mjs +0 -77
- package/esm2022/src/i18n/serializers/xliff.mjs +0 -300
- package/esm2022/src/i18n/serializers/xliff2.mjs +0 -349
- package/esm2022/src/i18n/serializers/xmb.mjs +0 -188
- package/esm2022/src/i18n/serializers/xml_helper.mjs +0 -94
- package/esm2022/src/i18n/serializers/xtb.mjs +0 -186
- package/esm2022/src/i18n/translation_bundle.mjs +0 -164
- package/esm2022/src/injectable_compiler_2.mjs +0 -138
- package/esm2022/src/jit_compiler_facade.mjs +0 -681
- package/esm2022/src/ml_parser/ast.mjs +0 -167
- package/esm2022/src/ml_parser/defaults.mjs +0 -24
- package/esm2022/src/ml_parser/entities.mjs +0 -2144
- package/esm2022/src/ml_parser/html_parser.mjs +0 -18
- package/esm2022/src/ml_parser/html_tags.mjs +0 -156
- package/esm2022/src/ml_parser/html_whitespaces.mjs +0 -107
- package/esm2022/src/ml_parser/icu_ast_expander.mjs +0 -125
- package/esm2022/src/ml_parser/lexer.mjs +0 -1210
- package/esm2022/src/ml_parser/parser.mjs +0 -539
- package/esm2022/src/ml_parser/tags.mjs +0 -47
- package/esm2022/src/ml_parser/tokens.mjs +0 -9
- package/esm2022/src/ml_parser/xml_parser.mjs +0 -19
- package/esm2022/src/ml_parser/xml_tags.mjs +0 -32
- package/esm2022/src/output/abstract_emitter.mjs +0 -524
- package/esm2022/src/output/abstract_js_emitter.mjs +0 -130
- package/esm2022/src/output/map_util.mjs +0 -19
- package/esm2022/src/output/output_ast.mjs +0 -1301
- package/esm2022/src/output/output_jit.mjs +0 -138
- package/esm2022/src/output/output_jit_trusted_types.mjs +0 -100
- package/esm2022/src/output/source_map.mjs +0 -150
- package/esm2022/src/parse_util.mjs +0 -198
- package/esm2022/src/render3/partial/api.mjs +0 -9
- package/esm2022/src/render3/partial/class_metadata.mjs +0 -52
- package/esm2022/src/render3/partial/component.mjs +0 -197
- package/esm2022/src/render3/partial/directive.mjs +0 -264
- package/esm2022/src/render3/partial/factory.mjs +0 -35
- package/esm2022/src/render3/partial/injectable.mjs +0 -67
- package/esm2022/src/render3/partial/injector.mjs +0 -41
- package/esm2022/src/render3/partial/ng_module.mjs +0 -63
- package/esm2022/src/render3/partial/pipe.mjs +0 -50
- package/esm2022/src/render3/partial/util.mjs +0 -79
- package/esm2022/src/render3/r3_ast.mjs +0 -493
- package/esm2022/src/render3/r3_class_debug_info_compiler.mjs +0 -35
- package/esm2022/src/render3/r3_class_metadata_compiler.mjs +0 -92
- package/esm2022/src/render3/r3_control_flow.mjs +0 -421
- package/esm2022/src/render3/r3_deferred_blocks.mjs +0 -170
- package/esm2022/src/render3/r3_deferred_triggers.mjs +0 -316
- package/esm2022/src/render3/r3_factory.mjs +0 -200
- package/esm2022/src/render3/r3_identifiers.mjs +0 -480
- package/esm2022/src/render3/r3_injector_compiler.mjs +0 -28
- package/esm2022/src/render3/r3_jit.mjs +0 -29
- package/esm2022/src/render3/r3_module_compiler.mjs +0 -211
- package/esm2022/src/render3/r3_pipe_compiler.mjs +0 -35
- package/esm2022/src/render3/r3_template_transform.mjs +0 -560
- package/esm2022/src/render3/util.mjs +0 -90
- package/esm2022/src/render3/view/api.mjs +0 -14
- package/esm2022/src/render3/view/compiler.mjs +0 -546
- package/esm2022/src/render3/view/i18n/get_msg_utils.mjs +0 -113
- package/esm2022/src/render3/view/i18n/icu_serializer.mjs +0 -43
- package/esm2022/src/render3/view/i18n/localize_utils.mjs +0 -118
- package/esm2022/src/render3/view/i18n/meta.mjs +0 -259
- package/esm2022/src/render3/view/i18n/util.mjs +0 -70
- package/esm2022/src/render3/view/query_generation.mjs +0 -182
- package/esm2022/src/render3/view/t2_api.mjs +0 -9
- package/esm2022/src/render3/view/t2_binder.mjs +0 -823
- package/esm2022/src/render3/view/template.mjs +0 -113
- package/esm2022/src/render3/view/util.mjs +0 -192
- package/esm2022/src/resource_loader.mjs +0 -17
- package/esm2022/src/schema/dom_element_schema_registry.mjs +0 -471
- package/esm2022/src/schema/dom_security_schema.mjs +0 -96
- package/esm2022/src/schema/element_schema_registry.mjs +0 -10
- package/esm2022/src/schema/trusted_types_sinks.mjs +0 -41
- package/esm2022/src/selector.mjs +0 -400
- package/esm2022/src/shadow_css.mjs +0 -1053
- package/esm2022/src/style_url_resolver.mjs +0 -17
- package/esm2022/src/template/pipeline/ir/index.mjs +0 -18
- package/esm2022/src/template/pipeline/ir/src/enums.mjs +0 -503
- package/esm2022/src/template/pipeline/ir/src/expression.mjs +0 -997
- package/esm2022/src/template/pipeline/ir/src/handle.mjs +0 -13
- package/esm2022/src/template/pipeline/ir/src/operations.mjs +0 -261
- package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +0 -405
- package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +0 -25
- package/esm2022/src/template/pipeline/ir/src/ops/shared.mjs +0 -43
- package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +0 -277
- package/esm2022/src/template/pipeline/ir/src/traits.mjs +0 -64
- package/esm2022/src/template/pipeline/ir/src/variable.mjs +0 -13
- package/esm2022/src/template/pipeline/src/compilation.mjs +0 -194
- package/esm2022/src/template/pipeline/src/conversion.mjs +0 -64
- package/esm2022/src/template/pipeline/src/emit.mjs +0 -238
- package/esm2022/src/template/pipeline/src/ingest.mjs +0 -1058
- package/esm2022/src/template/pipeline/src/instruction.mjs +0 -564
- package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +0 -32
- package/esm2022/src/template/pipeline/src/phases/apply_i18n_expressions.mjs +0 -63
- package/esm2022/src/template/pipeline/src/phases/assign_i18n_slot_dependencies.mjs +0 -63
- package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +0 -138
- package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +0 -75
- package/esm2022/src/template/pipeline/src/phases/chaining.mjs +0 -112
- package/esm2022/src/template/pipeline/src/phases/collapse_singleton_interpolations.mjs +0 -32
- package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +0 -58
- package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +0 -214
- package/esm2022/src/template/pipeline/src/phases/convert_i18n_bindings.mjs +0 -52
- package/esm2022/src/template/pipeline/src/phases/create_i18n_contexts.mjs +0 -105
- package/esm2022/src/template/pipeline/src/phases/deduplicate_text_bindings.mjs +0 -40
- package/esm2022/src/template/pipeline/src/phases/defer_configs.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/defer_resolve_targets.mjs +0 -113
- package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +0 -47
- package/esm2022/src/template/pipeline/src/phases/expand_safe_reads.mjs +0 -192
- package/esm2022/src/template/pipeline/src/phases/extract_i18n_messages.mjs +0 -218
- package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +0 -66
- package/esm2022/src/template/pipeline/src/phases/generate_local_let_references.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/generate_projection_def.mjs +0 -46
- package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +0 -170
- package/esm2022/src/template/pipeline/src/phases/has_const_expression_collection.mjs +0 -28
- package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +0 -81
- package/esm2022/src/template/pipeline/src/phases/i18n_const_collection.mjs +0 -309
- package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +0 -97
- package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +0 -43
- package/esm2022/src/template/pipeline/src/phases/namespace.mjs +0 -26
- package/esm2022/src/template/pipeline/src/phases/naming.mjs +0 -179
- package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +0 -75
- package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +0 -47
- package/esm2022/src/template/pipeline/src/phases/nullish_coalescing.mjs +0 -33
- package/esm2022/src/template/pipeline/src/phases/ordering.mjs +0 -140
- package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +0 -137
- package/esm2022/src/template/pipeline/src/phases/phase_remove_content_selectors.mjs +0 -42
- package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +0 -74
- package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +0 -30
- package/esm2022/src/template/pipeline/src/phases/propagate_i18n_blocks.mjs +0 -81
- package/esm2022/src/template/pipeline/src/phases/pure_function_extraction.mjs +0 -55
- package/esm2022/src/template/pipeline/src/phases/pure_literal_structures.mjs +0 -58
- package/esm2022/src/template/pipeline/src/phases/reify.mjs +0 -433
- package/esm2022/src/template/pipeline/src/phases/remove_empty_bindings.mjs +0 -31
- package/esm2022/src/template/pipeline/src/phases/remove_i18n_contexts.mjs +0 -27
- package/esm2022/src/template/pipeline/src/phases/remove_illegal_let_references.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/remove_unused_i18n_attrs.mjs +0 -33
- package/esm2022/src/template/pipeline/src/phases/resolve_contexts.mjs +0 -60
- package/esm2022/src/template/pipeline/src/phases/resolve_defer_deps_fns.mjs +0 -31
- package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_element_placeholders.mjs +0 -266
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_expression_placeholders.mjs +0 -70
- package/esm2022/src/template/pipeline/src/phases/resolve_names.mjs +0 -124
- package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +0 -123
- package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +0 -64
- package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +0 -62
- package/esm2022/src/template/pipeline/src/phases/store_let_optimization.mjs +0 -35
- package/esm2022/src/template/pipeline/src/phases/style_binding_specialization.mjs +0 -42
- package/esm2022/src/template/pipeline/src/phases/temporary_variables.mjs +0 -87
- package/esm2022/src/template/pipeline/src/phases/track_fn_generation.mjs +0 -52
- package/esm2022/src/template/pipeline/src/phases/track_fn_optimization.mjs +0 -88
- package/esm2022/src/template/pipeline/src/phases/track_variables.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/transform_two_way_binding_set.mjs +0 -43
- package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +0 -155
- package/esm2022/src/template/pipeline/src/phases/variable_optimization.mjs +0 -423
- package/esm2022/src/template/pipeline/src/phases/wrap_icus.mjs +0 -41
- package/esm2022/src/template/pipeline/src/util/elements.mjs +0 -29
- package/esm2022/src/template_parser/binding_parser.mjs +0 -465
- package/esm2022/src/template_parser/template_preparser.mjs +0 -84
- package/esm2022/src/util.mjs +0 -124
- package/esm2022/src/version.mjs +0 -15
|
@@ -1,493 +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 { ParsedEventType, } from '../expression_parser/ast';
|
|
9
|
-
/**
|
|
10
|
-
* This is an R3 `Node`-like wrapper for a raw `html.Comment` node. We do not currently
|
|
11
|
-
* require the implementation of a visitor for Comments as they are only collected at
|
|
12
|
-
* the top-level of the R3 AST, and only if `Render3ParseOptions['collectCommentNodes']`
|
|
13
|
-
* is true.
|
|
14
|
-
*/
|
|
15
|
-
export class Comment {
|
|
16
|
-
constructor(value, sourceSpan) {
|
|
17
|
-
this.value = value;
|
|
18
|
-
this.sourceSpan = sourceSpan;
|
|
19
|
-
}
|
|
20
|
-
visit(_visitor) {
|
|
21
|
-
throw new Error('visit() not implemented for Comment');
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
export class Text {
|
|
25
|
-
constructor(value, sourceSpan) {
|
|
26
|
-
this.value = value;
|
|
27
|
-
this.sourceSpan = sourceSpan;
|
|
28
|
-
}
|
|
29
|
-
visit(visitor) {
|
|
30
|
-
return visitor.visitText(this);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
export class BoundText {
|
|
34
|
-
constructor(value, sourceSpan, i18n) {
|
|
35
|
-
this.value = value;
|
|
36
|
-
this.sourceSpan = sourceSpan;
|
|
37
|
-
this.i18n = i18n;
|
|
38
|
-
}
|
|
39
|
-
visit(visitor) {
|
|
40
|
-
return visitor.visitBoundText(this);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Represents a text attribute in the template.
|
|
45
|
-
*
|
|
46
|
-
* `valueSpan` may not be present in cases where there is no value `<div a></div>`.
|
|
47
|
-
* `keySpan` may also not be present for synthetic attributes from ICU expansions.
|
|
48
|
-
*/
|
|
49
|
-
export class TextAttribute {
|
|
50
|
-
constructor(name, value, sourceSpan, keySpan, valueSpan, i18n) {
|
|
51
|
-
this.name = name;
|
|
52
|
-
this.value = value;
|
|
53
|
-
this.sourceSpan = sourceSpan;
|
|
54
|
-
this.keySpan = keySpan;
|
|
55
|
-
this.valueSpan = valueSpan;
|
|
56
|
-
this.i18n = i18n;
|
|
57
|
-
}
|
|
58
|
-
visit(visitor) {
|
|
59
|
-
return visitor.visitTextAttribute(this);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
export class BoundAttribute {
|
|
63
|
-
constructor(name, type, securityContext, value, unit, sourceSpan, keySpan, valueSpan, i18n) {
|
|
64
|
-
this.name = name;
|
|
65
|
-
this.type = type;
|
|
66
|
-
this.securityContext = securityContext;
|
|
67
|
-
this.value = value;
|
|
68
|
-
this.unit = unit;
|
|
69
|
-
this.sourceSpan = sourceSpan;
|
|
70
|
-
this.keySpan = keySpan;
|
|
71
|
-
this.valueSpan = valueSpan;
|
|
72
|
-
this.i18n = i18n;
|
|
73
|
-
}
|
|
74
|
-
static fromBoundElementProperty(prop, i18n) {
|
|
75
|
-
if (prop.keySpan === undefined) {
|
|
76
|
-
throw new Error(`Unexpected state: keySpan must be defined for bound attributes but was not for ${prop.name}: ${prop.sourceSpan}`);
|
|
77
|
-
}
|
|
78
|
-
return new BoundAttribute(prop.name, prop.type, prop.securityContext, prop.value, prop.unit, prop.sourceSpan, prop.keySpan, prop.valueSpan, i18n);
|
|
79
|
-
}
|
|
80
|
-
visit(visitor) {
|
|
81
|
-
return visitor.visitBoundAttribute(this);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
export class BoundEvent {
|
|
85
|
-
constructor(name, type, handler, target, phase, sourceSpan, handlerSpan, keySpan) {
|
|
86
|
-
this.name = name;
|
|
87
|
-
this.type = type;
|
|
88
|
-
this.handler = handler;
|
|
89
|
-
this.target = target;
|
|
90
|
-
this.phase = phase;
|
|
91
|
-
this.sourceSpan = sourceSpan;
|
|
92
|
-
this.handlerSpan = handlerSpan;
|
|
93
|
-
this.keySpan = keySpan;
|
|
94
|
-
}
|
|
95
|
-
static fromParsedEvent(event) {
|
|
96
|
-
const target = event.type === ParsedEventType.Regular ? event.targetOrPhase : null;
|
|
97
|
-
const phase = event.type === ParsedEventType.Animation ? event.targetOrPhase : null;
|
|
98
|
-
if (event.keySpan === undefined) {
|
|
99
|
-
throw new Error(`Unexpected state: keySpan must be defined for bound event but was not for ${event.name}: ${event.sourceSpan}`);
|
|
100
|
-
}
|
|
101
|
-
return new BoundEvent(event.name, event.type, event.handler, target, phase, event.sourceSpan, event.handlerSpan, event.keySpan);
|
|
102
|
-
}
|
|
103
|
-
visit(visitor) {
|
|
104
|
-
return visitor.visitBoundEvent(this);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
export class Element {
|
|
108
|
-
constructor(name, attributes, inputs, outputs, children, references, sourceSpan, startSourceSpan, endSourceSpan, i18n) {
|
|
109
|
-
this.name = name;
|
|
110
|
-
this.attributes = attributes;
|
|
111
|
-
this.inputs = inputs;
|
|
112
|
-
this.outputs = outputs;
|
|
113
|
-
this.children = children;
|
|
114
|
-
this.references = references;
|
|
115
|
-
this.sourceSpan = sourceSpan;
|
|
116
|
-
this.startSourceSpan = startSourceSpan;
|
|
117
|
-
this.endSourceSpan = endSourceSpan;
|
|
118
|
-
this.i18n = i18n;
|
|
119
|
-
}
|
|
120
|
-
visit(visitor) {
|
|
121
|
-
return visitor.visitElement(this);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
export class DeferredTrigger {
|
|
125
|
-
constructor(nameSpan, sourceSpan, prefetchSpan, whenOrOnSourceSpan) {
|
|
126
|
-
this.nameSpan = nameSpan;
|
|
127
|
-
this.sourceSpan = sourceSpan;
|
|
128
|
-
this.prefetchSpan = prefetchSpan;
|
|
129
|
-
this.whenOrOnSourceSpan = whenOrOnSourceSpan;
|
|
130
|
-
}
|
|
131
|
-
visit(visitor) {
|
|
132
|
-
return visitor.visitDeferredTrigger(this);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
export class BoundDeferredTrigger extends DeferredTrigger {
|
|
136
|
-
constructor(value, sourceSpan, prefetchSpan, whenSourceSpan) {
|
|
137
|
-
// BoundDeferredTrigger is for 'when' triggers. These aren't really "triggers" and don't have a
|
|
138
|
-
// nameSpan. Trigger names are the built in event triggers like hover, interaction, etc.
|
|
139
|
-
super(/** nameSpan */ null, sourceSpan, prefetchSpan, whenSourceSpan);
|
|
140
|
-
this.value = value;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
export class IdleDeferredTrigger extends DeferredTrigger {
|
|
144
|
-
}
|
|
145
|
-
export class ImmediateDeferredTrigger extends DeferredTrigger {
|
|
146
|
-
}
|
|
147
|
-
export class HoverDeferredTrigger extends DeferredTrigger {
|
|
148
|
-
constructor(reference, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
|
|
149
|
-
super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
|
|
150
|
-
this.reference = reference;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
export class TimerDeferredTrigger extends DeferredTrigger {
|
|
154
|
-
constructor(delay, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
|
|
155
|
-
super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
|
|
156
|
-
this.delay = delay;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
export class InteractionDeferredTrigger extends DeferredTrigger {
|
|
160
|
-
constructor(reference, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
|
|
161
|
-
super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
|
|
162
|
-
this.reference = reference;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
export class ViewportDeferredTrigger extends DeferredTrigger {
|
|
166
|
-
constructor(reference, nameSpan, sourceSpan, prefetchSpan, onSourceSpan) {
|
|
167
|
-
super(nameSpan, sourceSpan, prefetchSpan, onSourceSpan);
|
|
168
|
-
this.reference = reference;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
export class BlockNode {
|
|
172
|
-
constructor(nameSpan, sourceSpan, startSourceSpan, endSourceSpan) {
|
|
173
|
-
this.nameSpan = nameSpan;
|
|
174
|
-
this.sourceSpan = sourceSpan;
|
|
175
|
-
this.startSourceSpan = startSourceSpan;
|
|
176
|
-
this.endSourceSpan = endSourceSpan;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
export class DeferredBlockPlaceholder extends BlockNode {
|
|
180
|
-
constructor(children, minimumTime, nameSpan, sourceSpan, startSourceSpan, endSourceSpan, i18n) {
|
|
181
|
-
super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
|
|
182
|
-
this.children = children;
|
|
183
|
-
this.minimumTime = minimumTime;
|
|
184
|
-
this.i18n = i18n;
|
|
185
|
-
}
|
|
186
|
-
visit(visitor) {
|
|
187
|
-
return visitor.visitDeferredBlockPlaceholder(this);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
export class DeferredBlockLoading extends BlockNode {
|
|
191
|
-
constructor(children, afterTime, minimumTime, nameSpan, sourceSpan, startSourceSpan, endSourceSpan, i18n) {
|
|
192
|
-
super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
|
|
193
|
-
this.children = children;
|
|
194
|
-
this.afterTime = afterTime;
|
|
195
|
-
this.minimumTime = minimumTime;
|
|
196
|
-
this.i18n = i18n;
|
|
197
|
-
}
|
|
198
|
-
visit(visitor) {
|
|
199
|
-
return visitor.visitDeferredBlockLoading(this);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
export class DeferredBlockError extends BlockNode {
|
|
203
|
-
constructor(children, nameSpan, sourceSpan, startSourceSpan, endSourceSpan, i18n) {
|
|
204
|
-
super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
|
|
205
|
-
this.children = children;
|
|
206
|
-
this.i18n = i18n;
|
|
207
|
-
}
|
|
208
|
-
visit(visitor) {
|
|
209
|
-
return visitor.visitDeferredBlockError(this);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
export class DeferredBlock extends BlockNode {
|
|
213
|
-
constructor(children, triggers, prefetchTriggers, placeholder, loading, error, nameSpan, sourceSpan, mainBlockSpan, startSourceSpan, endSourceSpan, i18n) {
|
|
214
|
-
super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
|
|
215
|
-
this.children = children;
|
|
216
|
-
this.placeholder = placeholder;
|
|
217
|
-
this.loading = loading;
|
|
218
|
-
this.error = error;
|
|
219
|
-
this.mainBlockSpan = mainBlockSpan;
|
|
220
|
-
this.i18n = i18n;
|
|
221
|
-
this.triggers = triggers;
|
|
222
|
-
this.prefetchTriggers = prefetchTriggers;
|
|
223
|
-
// We cache the keys since we know that they won't change and we
|
|
224
|
-
// don't want to enumarate them every time we're traversing the AST.
|
|
225
|
-
this.definedTriggers = Object.keys(triggers);
|
|
226
|
-
this.definedPrefetchTriggers = Object.keys(prefetchTriggers);
|
|
227
|
-
}
|
|
228
|
-
visit(visitor) {
|
|
229
|
-
return visitor.visitDeferredBlock(this);
|
|
230
|
-
}
|
|
231
|
-
visitAll(visitor) {
|
|
232
|
-
this.visitTriggers(this.definedTriggers, this.triggers, visitor);
|
|
233
|
-
this.visitTriggers(this.definedPrefetchTriggers, this.prefetchTriggers, visitor);
|
|
234
|
-
visitAll(visitor, this.children);
|
|
235
|
-
const remainingBlocks = [this.placeholder, this.loading, this.error].filter((x) => x !== null);
|
|
236
|
-
visitAll(visitor, remainingBlocks);
|
|
237
|
-
}
|
|
238
|
-
visitTriggers(keys, triggers, visitor) {
|
|
239
|
-
visitAll(visitor, keys.map((k) => triggers[k]));
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
export class SwitchBlock extends BlockNode {
|
|
243
|
-
constructor(expression, cases,
|
|
244
|
-
/**
|
|
245
|
-
* These blocks are only captured to allow for autocompletion in the language service. They
|
|
246
|
-
* aren't meant to be processed in any other way.
|
|
247
|
-
*/
|
|
248
|
-
unknownBlocks, sourceSpan, startSourceSpan, endSourceSpan, nameSpan) {
|
|
249
|
-
super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
|
|
250
|
-
this.expression = expression;
|
|
251
|
-
this.cases = cases;
|
|
252
|
-
this.unknownBlocks = unknownBlocks;
|
|
253
|
-
}
|
|
254
|
-
visit(visitor) {
|
|
255
|
-
return visitor.visitSwitchBlock(this);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
export class SwitchBlockCase extends BlockNode {
|
|
259
|
-
constructor(expression, children, sourceSpan, startSourceSpan, endSourceSpan, nameSpan, i18n) {
|
|
260
|
-
super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
|
|
261
|
-
this.expression = expression;
|
|
262
|
-
this.children = children;
|
|
263
|
-
this.i18n = i18n;
|
|
264
|
-
}
|
|
265
|
-
visit(visitor) {
|
|
266
|
-
return visitor.visitSwitchBlockCase(this);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
export class ForLoopBlock extends BlockNode {
|
|
270
|
-
constructor(item, expression, trackBy, trackKeywordSpan, contextVariables, children, empty, sourceSpan, mainBlockSpan, startSourceSpan, endSourceSpan, nameSpan, i18n) {
|
|
271
|
-
super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
|
|
272
|
-
this.item = item;
|
|
273
|
-
this.expression = expression;
|
|
274
|
-
this.trackBy = trackBy;
|
|
275
|
-
this.trackKeywordSpan = trackKeywordSpan;
|
|
276
|
-
this.contextVariables = contextVariables;
|
|
277
|
-
this.children = children;
|
|
278
|
-
this.empty = empty;
|
|
279
|
-
this.mainBlockSpan = mainBlockSpan;
|
|
280
|
-
this.i18n = i18n;
|
|
281
|
-
}
|
|
282
|
-
visit(visitor) {
|
|
283
|
-
return visitor.visitForLoopBlock(this);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
export class ForLoopBlockEmpty extends BlockNode {
|
|
287
|
-
constructor(children, sourceSpan, startSourceSpan, endSourceSpan, nameSpan, i18n) {
|
|
288
|
-
super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
|
|
289
|
-
this.children = children;
|
|
290
|
-
this.i18n = i18n;
|
|
291
|
-
}
|
|
292
|
-
visit(visitor) {
|
|
293
|
-
return visitor.visitForLoopBlockEmpty(this);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
export class IfBlock extends BlockNode {
|
|
297
|
-
constructor(branches, sourceSpan, startSourceSpan, endSourceSpan, nameSpan) {
|
|
298
|
-
super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
|
|
299
|
-
this.branches = branches;
|
|
300
|
-
}
|
|
301
|
-
visit(visitor) {
|
|
302
|
-
return visitor.visitIfBlock(this);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
export class IfBlockBranch extends BlockNode {
|
|
306
|
-
constructor(expression, children, expressionAlias, sourceSpan, startSourceSpan, endSourceSpan, nameSpan, i18n) {
|
|
307
|
-
super(nameSpan, sourceSpan, startSourceSpan, endSourceSpan);
|
|
308
|
-
this.expression = expression;
|
|
309
|
-
this.children = children;
|
|
310
|
-
this.expressionAlias = expressionAlias;
|
|
311
|
-
this.i18n = i18n;
|
|
312
|
-
}
|
|
313
|
-
visit(visitor) {
|
|
314
|
-
return visitor.visitIfBlockBranch(this);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
export class UnknownBlock {
|
|
318
|
-
constructor(name, sourceSpan, nameSpan) {
|
|
319
|
-
this.name = name;
|
|
320
|
-
this.sourceSpan = sourceSpan;
|
|
321
|
-
this.nameSpan = nameSpan;
|
|
322
|
-
}
|
|
323
|
-
visit(visitor) {
|
|
324
|
-
return visitor.visitUnknownBlock(this);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
export class LetDeclaration {
|
|
328
|
-
constructor(name, value, sourceSpan, nameSpan, valueSpan) {
|
|
329
|
-
this.name = name;
|
|
330
|
-
this.value = value;
|
|
331
|
-
this.sourceSpan = sourceSpan;
|
|
332
|
-
this.nameSpan = nameSpan;
|
|
333
|
-
this.valueSpan = valueSpan;
|
|
334
|
-
}
|
|
335
|
-
visit(visitor) {
|
|
336
|
-
return visitor.visitLetDeclaration(this);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
export class Template {
|
|
340
|
-
constructor(
|
|
341
|
-
// tagName is the name of the container element, if applicable.
|
|
342
|
-
// `null` is a special case for when there is a structural directive on an `ng-template` so
|
|
343
|
-
// the renderer can differentiate between the synthetic template and the one written in the
|
|
344
|
-
// file.
|
|
345
|
-
tagName, attributes, inputs, outputs, templateAttrs, children, references, variables, sourceSpan, startSourceSpan, endSourceSpan, i18n) {
|
|
346
|
-
this.tagName = tagName;
|
|
347
|
-
this.attributes = attributes;
|
|
348
|
-
this.inputs = inputs;
|
|
349
|
-
this.outputs = outputs;
|
|
350
|
-
this.templateAttrs = templateAttrs;
|
|
351
|
-
this.children = children;
|
|
352
|
-
this.references = references;
|
|
353
|
-
this.variables = variables;
|
|
354
|
-
this.sourceSpan = sourceSpan;
|
|
355
|
-
this.startSourceSpan = startSourceSpan;
|
|
356
|
-
this.endSourceSpan = endSourceSpan;
|
|
357
|
-
this.i18n = i18n;
|
|
358
|
-
}
|
|
359
|
-
visit(visitor) {
|
|
360
|
-
return visitor.visitTemplate(this);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
export class Content {
|
|
364
|
-
constructor(selector, attributes, children, sourceSpan, i18n) {
|
|
365
|
-
this.selector = selector;
|
|
366
|
-
this.attributes = attributes;
|
|
367
|
-
this.children = children;
|
|
368
|
-
this.sourceSpan = sourceSpan;
|
|
369
|
-
this.i18n = i18n;
|
|
370
|
-
this.name = 'ng-content';
|
|
371
|
-
}
|
|
372
|
-
visit(visitor) {
|
|
373
|
-
return visitor.visitContent(this);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
export class Variable {
|
|
377
|
-
constructor(name, value, sourceSpan, keySpan, valueSpan) {
|
|
378
|
-
this.name = name;
|
|
379
|
-
this.value = value;
|
|
380
|
-
this.sourceSpan = sourceSpan;
|
|
381
|
-
this.keySpan = keySpan;
|
|
382
|
-
this.valueSpan = valueSpan;
|
|
383
|
-
}
|
|
384
|
-
visit(visitor) {
|
|
385
|
-
return visitor.visitVariable(this);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
export class Reference {
|
|
389
|
-
constructor(name, value, sourceSpan, keySpan, valueSpan) {
|
|
390
|
-
this.name = name;
|
|
391
|
-
this.value = value;
|
|
392
|
-
this.sourceSpan = sourceSpan;
|
|
393
|
-
this.keySpan = keySpan;
|
|
394
|
-
this.valueSpan = valueSpan;
|
|
395
|
-
}
|
|
396
|
-
visit(visitor) {
|
|
397
|
-
return visitor.visitReference(this);
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
export class Icu {
|
|
401
|
-
constructor(vars, placeholders, sourceSpan, i18n) {
|
|
402
|
-
this.vars = vars;
|
|
403
|
-
this.placeholders = placeholders;
|
|
404
|
-
this.sourceSpan = sourceSpan;
|
|
405
|
-
this.i18n = i18n;
|
|
406
|
-
}
|
|
407
|
-
visit(visitor) {
|
|
408
|
-
return visitor.visitIcu(this);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
export class RecursiveVisitor {
|
|
412
|
-
visitElement(element) {
|
|
413
|
-
visitAll(this, element.attributes);
|
|
414
|
-
visitAll(this, element.inputs);
|
|
415
|
-
visitAll(this, element.outputs);
|
|
416
|
-
visitAll(this, element.children);
|
|
417
|
-
visitAll(this, element.references);
|
|
418
|
-
}
|
|
419
|
-
visitTemplate(template) {
|
|
420
|
-
visitAll(this, template.attributes);
|
|
421
|
-
visitAll(this, template.inputs);
|
|
422
|
-
visitAll(this, template.outputs);
|
|
423
|
-
visitAll(this, template.children);
|
|
424
|
-
visitAll(this, template.references);
|
|
425
|
-
visitAll(this, template.variables);
|
|
426
|
-
}
|
|
427
|
-
visitDeferredBlock(deferred) {
|
|
428
|
-
deferred.visitAll(this);
|
|
429
|
-
}
|
|
430
|
-
visitDeferredBlockPlaceholder(block) {
|
|
431
|
-
visitAll(this, block.children);
|
|
432
|
-
}
|
|
433
|
-
visitDeferredBlockError(block) {
|
|
434
|
-
visitAll(this, block.children);
|
|
435
|
-
}
|
|
436
|
-
visitDeferredBlockLoading(block) {
|
|
437
|
-
visitAll(this, block.children);
|
|
438
|
-
}
|
|
439
|
-
visitSwitchBlock(block) {
|
|
440
|
-
visitAll(this, block.cases);
|
|
441
|
-
}
|
|
442
|
-
visitSwitchBlockCase(block) {
|
|
443
|
-
visitAll(this, block.children);
|
|
444
|
-
}
|
|
445
|
-
visitForLoopBlock(block) {
|
|
446
|
-
const blockItems = [block.item, ...block.contextVariables, ...block.children];
|
|
447
|
-
block.empty && blockItems.push(block.empty);
|
|
448
|
-
visitAll(this, blockItems);
|
|
449
|
-
}
|
|
450
|
-
visitForLoopBlockEmpty(block) {
|
|
451
|
-
visitAll(this, block.children);
|
|
452
|
-
}
|
|
453
|
-
visitIfBlock(block) {
|
|
454
|
-
visitAll(this, block.branches);
|
|
455
|
-
}
|
|
456
|
-
visitIfBlockBranch(block) {
|
|
457
|
-
const blockItems = block.children;
|
|
458
|
-
block.expressionAlias && blockItems.push(block.expressionAlias);
|
|
459
|
-
visitAll(this, blockItems);
|
|
460
|
-
}
|
|
461
|
-
visitContent(content) {
|
|
462
|
-
visitAll(this, content.children);
|
|
463
|
-
}
|
|
464
|
-
visitVariable(variable) { }
|
|
465
|
-
visitReference(reference) { }
|
|
466
|
-
visitTextAttribute(attribute) { }
|
|
467
|
-
visitBoundAttribute(attribute) { }
|
|
468
|
-
visitBoundEvent(attribute) { }
|
|
469
|
-
visitText(text) { }
|
|
470
|
-
visitBoundText(text) { }
|
|
471
|
-
visitIcu(icu) { }
|
|
472
|
-
visitDeferredTrigger(trigger) { }
|
|
473
|
-
visitUnknownBlock(block) { }
|
|
474
|
-
visitLetDeclaration(decl) { }
|
|
475
|
-
}
|
|
476
|
-
export function visitAll(visitor, nodes) {
|
|
477
|
-
const result = [];
|
|
478
|
-
if (visitor.visit) {
|
|
479
|
-
for (const node of nodes) {
|
|
480
|
-
visitor.visit(node) || node.visit(visitor);
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
else {
|
|
484
|
-
for (const node of nodes) {
|
|
485
|
-
const newNode = node.visit(visitor);
|
|
486
|
-
if (newNode) {
|
|
487
|
-
result.push(newNode);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
return result;
|
|
492
|
-
}
|
|
493
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicjNfYXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3JlbmRlcjMvcjNfYXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUdILE9BQU8sRUFNTCxlQUFlLEdBQ2hCLE1BQU0sMEJBQTBCLENBQUM7QUFTbEM7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sT0FBTztJQUNsQixZQUNTLEtBQWEsRUFDYixVQUEyQjtRQUQzQixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsZUFBVSxHQUFWLFVBQVUsQ0FBaUI7SUFDakMsQ0FBQztJQUNKLEtBQUssQ0FBUyxRQUF5QjtRQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDekQsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLElBQUk7SUFDZixZQUNTLEtBQWEsRUFDYixVQUEyQjtRQUQzQixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsZUFBVSxHQUFWLFVBQVUsQ0FBaUI7SUFDakMsQ0FBQztJQUNKLEtBQUssQ0FBUyxPQUF3QjtRQUNwQyxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFNBQVM7SUFDcEIsWUFDUyxLQUFVLEVBQ1YsVUFBMkIsRUFDM0IsSUFBZTtRQUZmLFVBQUssR0FBTCxLQUFLLENBQUs7UUFDVixlQUFVLEdBQVYsVUFBVSxDQUFpQjtRQUMzQixTQUFJLEdBQUosSUFBSSxDQUFXO0lBQ3JCLENBQUM7SUFDSixLQUFLLENBQVMsT0FBd0I7UUFDcEMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFDeEIsWUFDUyxJQUFZLEVBQ1osS0FBYSxFQUNiLFVBQTJC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QixJQUFTLENBQUM7Q0FDbkQ7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFTLE9BQXdCLEVBQUUsS0FBYTtJQUN0RSxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04sS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7U2VjdXJpdHlDb250ZXh0fSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7XG4gIEFTVCxcbiAgQVNUV2l0aFNvdXJjZSxcbiAgQmluZGluZ1R5cGUsXG4gIEJvdW5kRWxlbWVudFByb3BlcnR5LFxuICBQYXJzZWRFdmVudCxcbiAgUGFyc2VkRXZlbnRUeXBlLFxufSBmcm9tICcuLi9leHByZXNzaW9uX3BhcnNlci9hc3QnO1xuaW1wb3J0IHtJMThuTWV0YX0gZnJvbSAnLi4vaTE4bi9pMThuX2FzdCc7XG5pbXBvcnQge1BhcnNlU291cmNlU3Bhbn0gZnJvbSAnLi4vcGFyc2VfdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZSB7XG4gIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbjtcbiAgdmlzaXQ8UmVzdWx0Pih2aXNpdG9yOiBWaXNpdG9yPFJlc3VsdD4pOiBSZXN1bHQ7XG59XG5cbi8qKlxuICogVGhpcyBpcyBhbiBSMyBgTm9kZWAtbGlrZSB3cmFwcGVyIGZvciBhIHJhdyBgaHRtbC5Db21tZW50YCBub2RlLiBXZSBkbyBub3QgY3VycmVudGx5XG4gKiByZXF1aXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHZpc2l0b3IgZm9yIENvbW1lbnRzIGFzIHRoZXkgYXJlIG9ubHkgY29sbGVjdGVkIGF0XG4gKiB0aGUgdG9wLWxldmVsIG9mIHRoZSBSMyBBU1QsIGFuZCBvbmx5IGlmIGBSZW5kZXIzUGFyc2VPcHRpb25zWydjb2xsZWN0Q29tbWVudE5vZGVzJ11gXG4gKiBpcyB0cnVlLlxuICovXG5leHBvcnQgY2xhc3MgQ29tbWVudCBpbXBsZW1lbnRzIE5vZGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZyxcbiAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICApIHt9XG4gIHZpc2l0PFJlc3VsdD4oX3Zpc2l0b3I6IFZpc2l0b3I8UmVzdWx0Pik6IFJlc3VsdCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd2aXNpdCgpIG5vdCBpbXBsZW1lbnRlZCBmb3IgQ29tbWVudCcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUZXh0IGltcGxlbWVudHMgTm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nLFxuICAgIHB1YmxpYyBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICkge31cbiAgdmlzaXQ8UmVzdWx0Pih2aXNpdG9yOiBWaXNpdG9yPFJlc3VsdD4pOiBSZXN1bHQge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VGV4dCh0aGlzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQm91bmRUZXh0IGltcGxlbWVudHMgTm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB2YWx1ZTogQVNULFxuICAgIHB1YmxpYyBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcHVibGljIGkxOG4/OiBJMThuTWV0YSxcbiAgKSB7fVxuICB2aXNpdDxSZXN1bHQ+KHZpc2l0b3I6IFZpc2l0b3I8UmVzdWx0Pik6IFJlc3VsdCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRCb3VuZFRleHQodGhpcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdGV4dCBhdHRyaWJ1dGUgaW4gdGhlIHRlbXBsYXRlLlxuICpcbiAqIGB2YWx1ZVNwYW5gIG1heSBub3QgYmUgcHJlc2VudCBpbiBjYXNlcyB3aGVyZSB0aGVyZSBpcyBubyB2YWx1ZSBgPGRpdiBhPjwvZGl2PmAuXG4gKiBga2V5U3BhbmAgbWF5IGFsc28gbm90IGJlIHByZXNlbnQgZm9yIHN5bnRoZXRpYyBhdHRyaWJ1dGVzIGZyb20gSUNVIGV4cGFuc2lvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXh0QXR0cmlidXRlIGltcGxlbWVudHMgTm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmcsXG4gICAgcHVibGljIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICByZWFkb25seSBrZXlTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHZhbHVlU3Bhbj86IFBhcnNlU291cmNlU3BhbixcbiAgICBwdWJsaWMgaTE4bj86IEkxOG5NZXRhLFxuICApIHt9XG4gIHZpc2l0PFJlc3VsdD4odmlzaXRvcjogVmlzaXRvcjxSZXN1bHQ+KTogUmVzdWx0IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdFRleHRBdHRyaWJ1dGUodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJvdW5kQXR0cmlidXRlIGltcGxlbWVudHMgTm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHR5cGU6IEJpbmRpbmdUeXBlLFxuICAgIHB1YmxpYyBzZWN1cml0eUNvbnRleHQ6IFNlY3VyaXR5Q29udGV4dCxcbiAgICBwdWJsaWMgdmFsdWU6IEFTVCxcbiAgICBwdWJsaWMgdW5pdDogc3RyaW5nIHwgbnVsbCxcbiAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHJlYWRvbmx5IGtleVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBwdWJsaWMgdmFsdWVTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCB1bmRlZmluZWQsXG4gICAgcHVibGljIGkxOG46IEkxOG5NZXRhIHwgdW5kZWZpbmVkLFxuICApIHt9XG5cbiAgc3RhdGljIGZyb21Cb3VuZEVsZW1lbnRQcm9wZXJ0eShwcm9wOiBCb3VuZEVsZW1lbnRQcm9wZXJ0eSwgaTE4bj86IEkxOG5NZXRhKTogQm91bmRBdHRyaWJ1dGUge1xuICAgIGlmIChwcm9wLmtleVNwYW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5leHBlY3RlZCBzdGF0ZToga2V5U3BhbiBtdXN0IGJlIGRlZmluZWQgZm9yIGJvdW5kIGF0dHJpYnV0ZXMgYnV0IHdhcyBub3QgZm9yICR7cHJvcC5uYW1lfTogJHtwcm9wLnNvdXJjZVNwYW59YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQm91bmRBdHRyaWJ1dGUoXG4gICAgICBwcm9wLm5hbWUsXG4gICAgICBwcm9wLnR5cGUsXG4gICAgICBwcm9wLnNlY3VyaXR5Q29udGV4dCxcbiAgICAgIHByb3AudmFsdWUsXG4gICAgICBwcm9wLnVuaXQsXG4gICAgICBwcm9wLnNvdXJjZVNwYW4sXG4gICAgICBwcm9wLmtleVNwYW4sXG4gICAgICBwcm9wLnZhbHVlU3BhbixcbiAgICAgIGkxOG4sXG4gICAgKTtcbiAgfVxuXG4gIHZpc2l0PFJlc3VsdD4odmlzaXRvcjogVmlzaXRvcjxSZXN1bHQ+KTogUmVzdWx0IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdEJvdW5kQXR0cmlidXRlKHRoaXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCb3VuZEV2ZW50IGltcGxlbWVudHMgTm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHR5cGU6IFBhcnNlZEV2ZW50VHlwZSxcbiAgICBwdWJsaWMgaGFuZGxlcjogQVNULFxuICAgIHB1YmxpYyB0YXJnZXQ6IHN0cmluZyB8IG51bGwsXG4gICAgcHVibGljIHBoYXNlOiBzdHJpbmcgfCBudWxsLFxuICAgIHB1YmxpYyBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcHVibGljIGhhbmRsZXJTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcmVhZG9ubHkga2V5U3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICApIHt9XG5cbiAgc3RhdGljIGZyb21QYXJzZWRFdmVudChldmVudDogUGFyc2VkRXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQ6IHN0cmluZyB8IG51bGwgPVxuICAgICAgZXZlbnQudHlwZSA9PT0gUGFyc2VkRXZlbnRUeXBlLlJlZ3VsYXIgPyBldmVudC50YXJnZXRPclBoYXNlIDogbnVsbDtcbiAgICBjb25zdCBwaGFzZTogc3RyaW5nIHwgbnVsbCA9XG4gICAgICBldmVudC50eXBlID09PSBQYXJzZWRFdmVudFR5cGUuQW5pbWF0aW9uID8gZXZlbnQudGFyZ2V0T3JQaGFzZSA6IG51bGw7XG4gICAgaWYgKGV2ZW50LmtleVNwYW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5leHBlY3RlZCBzdGF0ZToga2V5U3BhbiBtdXN0IGJlIGRlZmluZWQgZm9yIGJvdW5kIGV2ZW50IGJ1dCB3YXMgbm90IGZvciAke2V2ZW50Lm5hbWV9OiAke2V2ZW50LnNvdXJjZVNwYW59YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQm91bmRFdmVudChcbiAgICAgIGV2ZW50Lm5hbWUsXG4gICAgICBldmVudC50eXBlLFxuICAgICAgZXZlbnQuaGFuZGxlcixcbiAgICAgIHRhcmdldCxcbiAgICAgIHBoYXNlLFxuICAgICAgZXZlbnQuc291cmNlU3BhbixcbiAgICAgIGV2ZW50LmhhbmRsZXJTcGFuLFxuICAgICAgZXZlbnQua2V5U3BhbixcbiAgICApO1xuICB9XG5cbiAgdmlzaXQ8UmVzdWx0Pih2aXNpdG9yOiBWaXNpdG9yPFJlc3VsdD4pOiBSZXN1bHQge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Qm91bmRFdmVudCh0aGlzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRWxlbWVudCBpbXBsZW1lbnRzIE5vZGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyBhdHRyaWJ1dGVzOiBUZXh0QXR0cmlidXRlW10sXG4gICAgcHVibGljIGlucHV0czogQm91bmRBdHRyaWJ1dGVbXSxcbiAgICBwdWJsaWMgb3V0cHV0czogQm91bmRFdmVudFtdLFxuICAgIHB1YmxpYyBjaGlsZHJlbjogTm9kZVtdLFxuICAgIHB1YmxpYyByZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSxcbiAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHB1YmxpYyBzdGFydFNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBwdWJsaWMgZW5kU291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuIHwgbnVsbCxcbiAgICBwdWJsaWMgaTE4bj86IEkxOG5NZXRhLFxuICApIHt9XG4gIHZpc2l0PFJlc3VsdD4odmlzaXRvcjogVmlzaXRvcjxSZXN1bHQ+KTogUmVzdWx0IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdEVsZW1lbnQodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERlZmVycmVkVHJpZ2dlciBpbXBsZW1lbnRzIE5vZGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZVNwYW46IFBhcnNlU291cmNlU3BhbiB8IG51bGwsXG4gICAgcHVibGljIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBwdWJsaWMgcHJlZmV0Y2hTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICAgIHB1YmxpYyB3aGVuT3JPblNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbiB8IG51bGwsXG4gICkge31cblxuICB2aXNpdDxSZXN1bHQ+KHZpc2l0b3I6IFZpc2l0b3I8UmVzdWx0Pik6IFJlc3VsdCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXREZWZlcnJlZFRyaWdnZXIodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJvdW5kRGVmZXJyZWRUcmlnZ2VyIGV4dGVuZHMgRGVmZXJyZWRUcmlnZ2VyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZhbHVlOiBBU1QsXG4gICAgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHByZWZldGNoU3BhbjogUGFyc2VTb3VyY2VTcGFuIHwgbnVsbCxcbiAgICB3aGVuU291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICApIHtcbiAgICAvLyBCb3VuZERlZmVycmVkVHJpZ2dlciBpcyBmb3IgJ3doZW4nIHRyaWdnZXJzLiBUaGVzZSBhcmVuJ3QgcmVhbGx5IFwidHJpZ2dlcnNcIiBhbmQgZG9uJ3QgaGF2ZSBhXG4gICAgLy8gbmFtZVNwYW4uIFRyaWdnZXIgbmFtZXMgYXJlIHRoZSBidWlsdCBpbiBldmVudCB0cmlnZ2VycyBsaWtlIGhvdmVyLCBpbnRlcmFjdGlvbiwgZXRjLlxuICAgIHN1cGVyKC8qKiBuYW1lU3BhbiAqLyBudWxsLCBzb3VyY2VTcGFuLCBwcmVmZXRjaFNwYW4sIHdoZW5Tb3VyY2VTcGFuKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWRsZURlZmVycmVkVHJpZ2dlciBleHRlbmRzIERlZmVycmVkVHJpZ2dlciB7fVxuXG5leHBvcnQgY2xhc3MgSW1tZWRpYXRlRGVmZXJyZWRUcmlnZ2VyIGV4dGVuZHMgRGVmZXJyZWRUcmlnZ2VyIHt9XG5cbmV4cG9ydCBjbGFzcyBIb3ZlckRlZmVycmVkVHJpZ2dlciBleHRlbmRzIERlZmVycmVkVHJpZ2dlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWZlcmVuY2U6IHN0cmluZyB8IG51bGwsXG4gICAgbmFtZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcHJlZmV0Y2hTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICAgIG9uU291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuIHwgbnVsbCxcbiAgKSB7XG4gICAgc3VwZXIobmFtZVNwYW4sIHNvdXJjZVNwYW4sIHByZWZldGNoU3Bhbiwgb25Tb3VyY2VTcGFuKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGltZXJEZWZlcnJlZFRyaWdnZXIgZXh0ZW5kcyBEZWZlcnJlZFRyaWdnZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGVsYXk6IG51bWJlcixcbiAgICBuYW1lU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBwcmVmZXRjaFNwYW46IFBhcnNlU291cmNlU3BhbiB8IG51bGwsXG4gICAgb25Tb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICApIHtcbiAgICBzdXBlcihuYW1lU3Bhbiwgc291cmNlU3BhbiwgcHJlZmV0Y2hTcGFuLCBvblNvdXJjZVNwYW4pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnRlcmFjdGlvbkRlZmVycmVkVHJpZ2dlciBleHRlbmRzIERlZmVycmVkVHJpZ2dlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWZlcmVuY2U6IHN0cmluZyB8IG51bGwsXG4gICAgbmFtZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcHJlZmV0Y2hTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICAgIG9uU291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuIHwgbnVsbCxcbiAgKSB7XG4gICAgc3VwZXIobmFtZVNwYW4sIHNvdXJjZVNwYW4sIHByZWZldGNoU3Bhbiwgb25Tb3VyY2VTcGFuKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmlld3BvcnREZWZlcnJlZFRyaWdnZXIgZXh0ZW5kcyBEZWZlcnJlZFRyaWdnZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVmZXJlbmNlOiBzdHJpbmcgfCBudWxsLFxuICAgIG5hbWVTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHByZWZldGNoU3BhbjogUGFyc2VTb3VyY2VTcGFuIHwgbnVsbCxcbiAgICBvblNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbiB8IG51bGwsXG4gICkge1xuICAgIHN1cGVyKG5hbWVTcGFuLCBzb3VyY2VTcGFuLCBwcmVmZXRjaFNwYW4sIG9uU291cmNlU3Bhbik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJsb2NrTm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBuYW1lU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHB1YmxpYyBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcHVibGljIHN0YXJ0U291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHB1YmxpYyBlbmRTb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICApIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZEJsb2NrUGxhY2Vob2xkZXIgZXh0ZW5kcyBCbG9ja05vZGUgaW1wbGVtZW50cyBOb2RlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNoaWxkcmVuOiBOb2RlW10sXG4gICAgcHVibGljIG1pbmltdW1UaW1lOiBudW1iZXIgfCBudWxsLFxuICAgIG5hbWVTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHN0YXJ0U291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIGVuZFNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbiB8IG51bGwsXG4gICAgcHVibGljIGkxOG4/OiBJMThuTWV0YSxcbiAgKSB7XG4gICAgc3VwZXIobmFtZVNwYW4sIHNvdXJjZVNwYW4sIHN0YXJ0U291cmNlU3BhbiwgZW5kU291cmNlU3Bhbik7XG4gIH1cblxuICB2aXNpdDxSZXN1bHQ+KHZpc2l0b3I6IFZpc2l0b3I8UmVzdWx0Pik6IFJlc3VsdCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXREZWZlcnJlZEJsb2NrUGxhY2Vob2xkZXIodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlZmVycmVkQmxvY2tMb2FkaW5nIGV4dGVuZHMgQmxvY2tOb2RlIGltcGxlbWVudHMgTm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjaGlsZHJlbjogTm9kZVtdLFxuICAgIHB1YmxpYyBhZnRlclRpbWU6IG51bWJlciB8IG51bGwsXG4gICAgcHVibGljIG1pbmltdW1UaW1lOiBudW1iZXIgfCBudWxsLFxuICAgIG5hbWVTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHN0YXJ0U291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIGVuZFNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbiB8IG51bGwsXG4gICAgcHVibGljIGkxOG4/OiBJMThuTWV0YSxcbiAgKSB7XG4gICAgc3VwZXIobmFtZVNwYW4sIHNvdXJjZVNwYW4sIHN0YXJ0U291cmNlU3BhbiwgZW5kU291cmNlU3Bhbik7XG4gIH1cblxuICB2aXNpdDxSZXN1bHQ+KHZpc2l0b3I6IFZpc2l0b3I8UmVzdWx0Pik6IFJlc3VsdCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXREZWZlcnJlZEJsb2NrTG9hZGluZyh0aGlzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVmZXJyZWRCbG9ja0Vycm9yIGV4dGVuZHMgQmxvY2tOb2RlIGltcGxlbWVudHMgTm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjaGlsZHJlbjogTm9kZVtdLFxuICAgIG5hbWVTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHN0YXJ0U291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIGVuZFNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbiB8IG51bGwsXG4gICAgcHVibGljIGkxOG4/OiBJMThuTWV0YSxcbiAgKSB7XG4gICAgc3VwZXIobmFtZVNwYW4sIHNvdXJjZVNwYW4sIHN0YXJ0U291cmNlU3BhbiwgZW5kU291cmNlU3Bhbik7XG4gIH1cblxuICB2aXNpdDxSZXN1bHQ+KHZpc2l0b3I6IFZpc2l0b3I8UmVzdWx0Pik6IFJlc3VsdCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXREZWZlcnJlZEJsb2NrRXJyb3IodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZlcnJlZEJsb2NrVHJpZ2dlcnMge1xuICB3aGVuPzogQm91bmREZWZlcnJlZFRyaWdnZXI7XG4gIGlkbGU/OiBJZGxlRGVmZXJyZWRUcmlnZ2VyO1xuICBpbW1lZGlhdGU/OiBJbW1lZGlhdGVEZWZlcnJlZFRyaWdnZXI7XG4gIGhvdmVyPzogSG92ZXJEZWZlcnJlZFRyaWdnZXI7XG4gIHRpbWVyPzogVGltZXJEZWZlcnJlZFRyaWdnZXI7XG4gIGludGVyYWN0aW9uPzogSW50ZXJhY3Rpb25EZWZlcnJlZFRyaWdnZXI7XG4gIHZpZXdwb3J0PzogVmlld3BvcnREZWZlcnJlZFRyaWdnZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZEJsb2NrIGV4dGVuZHMgQmxvY2tOb2RlIGltcGxlbWVudHMgTm9kZSB7XG4gIHJlYWRvbmx5IHRyaWdnZXJzOiBSZWFkb25seTxEZWZlcnJlZEJsb2NrVHJpZ2dlcnM+O1xuICByZWFkb25seSBwcmVmZXRjaFRyaWdnZXJzOiBSZWFkb25seTxEZWZlcnJlZEJsb2NrVHJpZ2dlcnM+O1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmluZWRUcmlnZ2VyczogKGtleW9mIERlZmVycmVkQmxvY2tUcmlnZ2VycylbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZpbmVkUHJlZmV0Y2hUcmlnZ2VyczogKGtleW9mIERlZmVycmVkQmxvY2tUcmlnZ2VycylbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY2hpbGRyZW46IE5vZGVbXSxcbiAgICB0cmlnZ2VyczogRGVmZXJyZWRCbG9ja1RyaWdnZXJzLFxuICAgIHByZWZldGNoVHJpZ2dlcnM6IERlZmVycmVkQmxvY2tUcmlnZ2VycyxcbiAgICBwdWJsaWMgcGxhY2Vob2xkZXI6IERlZmVycmVkQmxvY2tQbGFjZWhvbGRlciB8IG51bGwsXG4gICAgcHVibGljIGxvYWRpbmc6IERlZmVycmVkQmxvY2tMb2FkaW5nIHwgbnVsbCxcbiAgICBwdWJsaWMgZXJyb3I6IERlZmVycmVkQmxvY2tFcnJvciB8IG51bGwsXG4gICAgbmFtZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcHVibGljIG1haW5CbG9ja1NwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBzdGFydFNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBlbmRTb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICAgIHB1YmxpYyBpMThuPzogSTE4bk1ldGEsXG4gICkge1xuICAgIHN1cGVyKG5hbWVTcGFuLCBzb3VyY2VTcGFuLCBzdGFydFNvdXJjZVNwYW4sIGVuZFNvdXJjZVNwYW4pO1xuICAgIHRoaXMudHJpZ2dlcnMgPSB0cmlnZ2VycztcbiAgICB0aGlzLnByZWZldGNoVHJpZ2dlcnMgPSBwcmVmZXRjaFRyaWdnZXJzO1xuICAgIC8vIFdlIGNhY2hlIHRoZSBrZXlzIHNpbmNlIHdlIGtub3cgdGhhdCB0aGV5IHdvbid0IGNoYW5nZSBhbmQgd2VcbiAgICAvLyBkb24ndCB3YW50IHRvIGVudW1hcmF0ZSB0aGVtIGV2ZXJ5IHRpbWUgd2UncmUgdHJhdmVyc2luZyB0aGUgQVNULlxuICAgIHRoaXMuZGVmaW5lZFRyaWdnZXJzID0gT2JqZWN0LmtleXModHJpZ2dlcnMpIGFzIChrZXlvZiBEZWZlcnJlZEJsb2NrVHJpZ2dlcnMpW107XG4gICAgdGhpcy5kZWZpbmVkUHJlZmV0Y2hUcmlnZ2VycyA9IE9iamVjdC5rZXlzKHByZWZldGNoVHJpZ2dlcnMpIGFzIChrZXlvZiBEZWZlcnJlZEJsb2NrVHJpZ2dlcnMpW107XG4gIH1cblxuICB2aXNpdDxSZXN1bHQ+KHZpc2l0b3I6IFZpc2l0b3I8UmVzdWx0Pik6IFJlc3VsdCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXREZWZlcnJlZEJsb2NrKHRoaXMpO1xuICB9XG5cbiAgdmlzaXRBbGwodmlzaXRvcjogVmlzaXRvcjx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMudmlzaXRUcmlnZ2Vycyh0aGlzLmRlZmluZWRUcmlnZ2VycywgdGhpcy50cmlnZ2VycywgdmlzaXRvcik7XG4gICAgdGhpcy52aXNpdFRyaWdnZXJzKHRoaXMuZGVmaW5lZFByZWZldGNoVHJpZ2dlcnMsIHRoaXMucHJlZmV0Y2hUcmlnZ2VycywgdmlzaXRvcik7XG4gICAgdmlzaXRBbGwodmlzaXRvciwgdGhpcy5jaGlsZHJlbik7XG4gICAgY29uc3QgcmVtYWluaW5nQmxvY2tzID0gW3RoaXMucGxhY2Vob2xkZXIsIHRoaXMubG9hZGluZywgdGhpcy5lcnJvcl0uZmlsdGVyKFxuICAgICAgKHgpID0+IHggIT09IG51bGwsXG4gICAgKSBhcyBBcnJheTxOb2RlPjtcbiAgICB2aXNpdEFsbCh2aXNpdG9yLCByZW1haW5pbmdCbG9ja3MpO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdFRyaWdnZXJzKFxuICAgIGtleXM6IChrZXlvZiBEZWZlcnJlZEJsb2NrVHJpZ2dlcnMpW10sXG4gICAgdHJpZ2dlcnM6IERlZmVycmVkQmxvY2tUcmlnZ2VycyxcbiAgICB2aXNpdG9yOiBWaXNpdG9yLFxuICApIHtcbiAgICB2aXNpdEFsbChcbiAgICAgIHZpc2l0b3IsXG4gICAgICBrZXlzLm1hcCgoaykgPT4gdHJpZ2dlcnNba10hKSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTd2l0Y2hCbG9jayBleHRlbmRzIEJsb2NrTm9kZSBpbXBsZW1lbnRzIE5vZGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZXhwcmVzc2lvbjogQVNULFxuICAgIHB1YmxpYyBjYXNlczogU3dpdGNoQmxvY2tDYXNlW10sXG4gICAgLyoqXG4gICAgICogVGhlc2UgYmxvY2tzIGFyZSBvbmx5IGNhcHR1cmVkIHRvIGFsbG93IGZvciBhdXRvY29tcGxldGlvbiBpbiB0aGUgbGFuZ3VhZ2Ugc2VydmljZS4gVGhleVxuICAgICAqIGFyZW4ndCBtZWFudCB0byBiZSBwcm9jZXNzZWQgaW4gYW55IG90aGVyIHdheS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdW5rbm93bkJsb2NrczogVW5rbm93bkJsb2NrW10sXG4gICAgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHN0YXJ0U291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIGVuZFNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbiB8IG51bGwsXG4gICAgbmFtZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgKSB7XG4gICAgc3VwZXIobmFtZVNwYW4sIHNvdXJjZVNwYW4sIHN0YXJ0U291cmNlU3BhbiwgZW5kU291cmNlU3Bhbik7XG4gIH1cblxuICB2aXNpdDxSZXN1bHQ+KHZpc2l0b3I6IFZpc2l0b3I8UmVzdWx0Pik6IFJlc3VsdCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTd2l0Y2hCbG9jayh0aGlzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3dpdGNoQmxvY2tDYXNlIGV4dGVuZHMgQmxvY2tOb2RlIGltcGxlbWVudHMgTm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBleHByZXNzaW9uOiBBU1QgfCBudWxsLFxuICAgIHB1YmxpYyBjaGlsZHJlbjogTm9kZVtdLFxuICAgIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBzdGFydFNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBlbmRTb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICAgIG5hbWVTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcHVibGljIGkxOG4/OiBJMThuTWV0YSxcbiAgKSB7XG4gICAgc3VwZXIobmFtZVNwYW4sIHNvdXJjZVNwYW4sIHN0YXJ0U291cmNlU3BhbiwgZW5kU291cmNlU3Bhbik7XG4gIH1cblxuICB2aXNpdDxSZXN1bHQ+KHZpc2l0b3I6IFZpc2l0b3I8UmVzdWx0Pik6IFJlc3VsdCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTd2l0Y2hCbG9ja0Nhc2UodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZvckxvb3BCbG9jayBleHRlbmRzIEJsb2NrTm9kZSBpbXBsZW1lbnRzIE5vZGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaXRlbTogVmFyaWFibGUsXG4gICAgcHVibGljIGV4cHJlc3Npb246IEFTVFdpdGhTb3VyY2UsXG4gICAgcHVibGljIHRyYWNrQnk6IEFTVFdpdGhTb3VyY2UsXG4gICAgcHVibGljIHRyYWNrS2V5d29yZFNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBwdWJsaWMgY29udGV4dFZhcmlhYmxlczogVmFyaWFibGVbXSxcbiAgICBwdWJsaWMgY2hpbGRyZW46IE5vZGVbXSxcbiAgICBwdWJsaWMgZW1wdHk6IEZvckxvb3BCbG9ja0VtcHR5IHwgbnVsbCxcbiAgICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcHVibGljIG1haW5CbG9ja1NwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBzdGFydFNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBlbmRTb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICAgIG5hbWVTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcHVibGljIGkxOG4/OiBJMThuTWV0YSxcbiAgKSB7XG4gICAgc3VwZXIobmFtZVNwYW4sIHNvdXJjZVNwYW4sIHN0YXJ0U291cmNlU3BhbiwgZW5kU291cmNlU3Bhbik7XG4gIH1cblxuICB2aXNpdDxSZXN1bHQ+KHZpc2l0b3I6IFZpc2l0b3I8UmVzdWx0Pik6IFJlc3VsdCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRGb3JMb29wQmxvY2sodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZvckxvb3BCbG9ja0VtcHR5IGV4dGVuZHMgQmxvY2tOb2RlIGltcGxlbWVudHMgTm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjaGlsZHJlbjogTm9kZVtdLFxuICAgIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBzdGFydFNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBlbmRTb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICAgIG5hbWVTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcHVibGljIGkxOG4/OiBJMThuTWV0YSxcbiAgKSB7XG4gICAgc3VwZXIobmFtZVNwYW4sIHNvdXJjZVNwYW4sIHN0YXJ0U291cmNlU3BhbiwgZW5kU291cmNlU3Bhbik7XG4gIH1cblxuICB2aXNpdDxSZXN1bHQ+KHZpc2l0b3I6IFZpc2l0b3I8UmVzdWx0Pik6IFJlc3VsdCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRGb3JMb29wQmxvY2tFbXB0eSh0aGlzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWZCbG9jayBleHRlbmRzIEJsb2NrTm9kZSBpbXBsZW1lbnRzIE5vZGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYnJhbmNoZXM6IElmQmxvY2tCcmFuY2hbXSxcbiAgICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgc3RhcnRTb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgZW5kU291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuIHwgbnVsbCxcbiAgICBuYW1lU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICApIHtcbiAgICBzdXBlcihuYW1lU3Bhbiwgc291cmNlU3Bhbiwgc3RhcnRTb3VyY2VTcGFuLCBlbmRTb3VyY2VTcGFuKTtcbiAgfVxuXG4gIHZpc2l0PFJlc3VsdD4odmlzaXRvcjogVmlzaXRvcjxSZXN1bHQ+KTogUmVzdWx0IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdElmQmxvY2sodGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIElmQmxvY2tCcmFuY2ggZXh0ZW5kcyBCbG9ja05vZGUgaW1wbGVtZW50cyBOb2RlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGV4cHJlc3Npb246IEFTVCB8IG51bGwsXG4gICAgcHVibGljIGNoaWxkcmVuOiBOb2RlW10sXG4gICAgcHVibGljIGV4cHJlc3Npb25BbGlhczogVmFyaWFibGUgfCBudWxsLFxuICAgIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBzdGFydFNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBlbmRTb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4gfCBudWxsLFxuICAgIG5hbWVTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcHVibGljIGkxOG4/OiBJMThuTWV0YSxcbiAgKSB7XG4gICAgc3VwZXIobmFtZVNwYW4sIHNvdXJjZVNwYW4sIHN0YXJ0U291cmNlU3BhbiwgZW5kU291cmNlU3Bhbik7XG4gIH1cblxuICB2aXNpdDxSZXN1bHQ+KHZpc2l0b3I6IFZpc2l0b3I8UmVzdWx0Pik6IFJlc3VsdCB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJZkJsb2NrQnJhbmNoKHRoaXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmtub3duQmxvY2sgaW1wbGVtZW50cyBOb2RlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHB1YmxpYyBuYW1lU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICApIHt9XG5cbiAgdmlzaXQ8UmVzdWx0Pih2aXNpdG9yOiBWaXNpdG9yPFJlc3VsdD4pOiBSZXN1bHQge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VW5rbm93bkJsb2NrKHRoaXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMZXREZWNsYXJhdGlvbiBpbXBsZW1lbnRzIE5vZGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyB2YWx1ZTogQVNULFxuICAgIHB1YmxpYyBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcHVibGljIG5hbWVTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgcHVibGljIHZhbHVlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICApIHt9XG5cbiAgdmlzaXQ8UmVzdWx0Pih2aXNpdG9yOiBWaXNpdG9yPFJlc3VsdD4pOiBSZXN1bHQge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TGV0RGVjbGFyYXRpb24odGhpcyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlIGltcGxlbWVudHMgTm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIC8vIHRhZ05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50LCBpZiBhcHBsaWNhYmxlLlxuICAgIC8vIGBudWxsYCBpcyBhIHNwZWNpYWwgY2FzZSBmb3Igd2hlbiB0aGVyZSBpcyBhIHN0cnVjdHVyYWwgZGlyZWN0aXZlIG9uIGFuIGBuZy10ZW1wbGF0ZWAgc29cbiAgICAvLyB0aGUgcmVuZGVyZXIgY2FuIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgc3ludGhldGljIHRlbXBsYXRlIGFuZCB0aGUgb25lIHdyaXR0ZW4gaW4gdGhlXG4gICAgLy8gZmlsZS5cbiAgICBwdWJsaWMgdGFnTmFtZTogc3RyaW5nIHwgbnVsbCxcbiAgICBwdWJsaWMgYXR0cmlidXRlczogVGV4dEF0dHJpYnV0ZVtdLFxuICAgIHB1YmxpYyBpbnB1dHM6IEJvdW5kQXR0cmlidXRlW10sXG4gICAgcHVibGljIG91dHB1dHM6IEJvdW5kRXZlbnRbXSxcbiAgICBwdWJsaWMgdGVtcGxhdGVBdHRyczogKEJvdW5kQXR0cmlidXRlIHwgVGV4dEF0dHJpYnV0ZSlbXSxcbiAgICBwdWJsaWMgY2hpbGRyZW46IE5vZGVbXSxcbiAgICBwdWJsaWMgcmVmZXJlbmNlczogUmVmZXJlbmNlW10sXG4gICAgcHVibGljIHZhcmlhYmxlczogVmFyaWFibGVbXSxcbiAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHB1YmxpYyBzdGFydFNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBwdWJsaWMgZW5kU291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuIHwgbnVsbCxcbiAgICBwdWJsaWMgaTE4bj86IEkxOG5NZXRhLFxuICApIHt9XG4gIHZpc2l0PFJlc3VsdD4odmlzaXRvcjogVmlzaXRvcjxSZXN1bHQ+KTogUmVzdWx0IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdFRlbXBsYXRlKHRoaXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb250ZW50IGltcGxlbWVudHMgTm9kZSB7XG4gIHJlYWRvbmx5IG5hbWUgPSAnbmctY29udGVudCc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHNlbGVjdG9yOiBzdHJpbmcsXG4gICAgcHVibGljIGF0dHJpYnV0ZXM6IFRleHRBdHRyaWJ1dGVbXSxcbiAgICBwdWJsaWMgY2hpbGRyZW46IE5vZGVbXSxcbiAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHB1YmxpYyBpMThuPzogSTE4bk1ldGEsXG4gICkge31cbiAgdmlzaXQ8UmVzdWx0Pih2aXNpdG9yOiBWaXNpdG9yPFJlc3VsdD4pOiBSZXN1bHQge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q29udGVudCh0aGlzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmFyaWFibGUgaW1wbGVtZW50cyBOb2RlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZyxcbiAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHJlYWRvbmx5IGtleVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBwdWJsaWMgdmFsdWVTcGFuPzogUGFyc2VTb3VyY2VTcGFuLFxuICApIHt9XG4gIHZpc2l0PFJlc3VsdD4odmlzaXRvcjogVmlzaXRvcjxSZXN1bHQ+KTogUmVzdWx0IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdFZhcmlhYmxlKHRoaXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWZlcmVuY2UgaW1wbGVtZW50cyBOb2RlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgdmFsdWU6IHN0cmluZyxcbiAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHJlYWRvbmx5IGtleVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICBwdWJsaWMgdmFsdWVTcGFuPzogUGFyc2VTb3VyY2VTcGFuLFxuICApIHt9XG4gIHZpc2l0PFJlc3VsdD4odmlzaXRvcjogVmlzaXRvcjxSZXN1bHQ+KTogUmVzdWx0IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdFJlZmVyZW5jZSh0aGlzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWN1IGltcGxlbWVudHMgTm9kZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB2YXJzOiB7W25hbWU6IHN0cmluZ106IEJvdW5kVGV4dH0sXG4gICAgcHVibGljIHBsYWNlaG9sZGVyczoge1tuYW1lOiBzdHJpbmddOiBUZXh0IHwgQm91bmRUZXh0fSxcbiAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgIHB1YmxpYyBpMThuPzogSTE4bk1ldGEsXG4gICkge31cbiAgdmlzaXQ8UmVzdWx0Pih2aXNpdG9yOiBWaXNpdG9yPFJlc3VsdD4pOiBSZXN1bHQge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SWN1KHRoaXMpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlzaXRvcjxSZXN1bHQgPSBhbnk+IHtcbiAgLy8gUmV0dXJuaW5nIGEgdHJ1dGh5IHZhbHVlIGZyb20gYHZpc2l0KClgIHdpbGwgcHJldmVudCBgdmlzaXRBbGwoKWAgZnJvbSB0aGUgY2FsbCB0byB0aGUgdHlwZWRcbiAgLy8gbWV0aG9kIGFuZCByZXN1bHQgcmV0dXJuZWQgd2lsbCBiZWNvbWUgdGhlIHJlc3VsdCBpbmNsdWRlZCBpbiBgdmlzaXRBbGwoKWBzIHJlc3VsdCBhcnJheS5cbiAgdmlzaXQ/KG5vZGU6IE5vZGUpOiBSZXN1bHQ7XG5cbiAgdmlzaXRFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpOiBSZXN1bHQ7XG4gIHZpc2l0VGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlKTogUmVzdWx0O1xuICB2aXNpdENvbnRlbnQoY29udGVudDogQ29udGVudCk6IFJlc3VsdDtcbiAgdmlzaXRWYXJpYWJsZSh2YXJpYWJsZTogVmFyaWFibGUpOiBSZXN1bHQ7XG4gIHZpc2l0UmVmZXJlbmNlKHJlZmVyZW5jZTogUmVmZXJlbmNlKTogUmVzdWx0O1xuICB2aXNpdFRleHRBdHRyaWJ1dGUoYXR0cmlidXRlOiBUZXh0QXR0cmlidXRlKTogUmVzdWx0O1xuICB2aXNpdEJvdW5kQXR0cmlidXRlKGF0dHJpYnV0ZTogQm91bmRBdHRyaWJ1dGUpOiBSZXN1bHQ7XG4gIHZpc2l0Qm91bmRFdmVudChhdHRyaWJ1dGU6IEJvdW5kRXZlbnQpOiBSZXN1bHQ7XG4gIHZpc2l0VGV4dCh0ZXh0OiBUZXh0KTogUmVzdWx0O1xuICB2aXNpdEJvdW5kVGV4dCh0ZXh0OiBCb3VuZFRleHQpOiBSZXN1bHQ7XG4gIHZpc2l0SWN1KGljdTogSWN1KTogUmVzdWx0O1xuICB2aXNpdERlZmVycmVkQmxvY2soZGVmZXJyZWQ6IERlZmVycmVkQmxvY2spOiBSZXN1bHQ7XG4gIHZpc2l0RGVmZXJyZWRCbG9ja1BsYWNlaG9sZGVyKGJsb2NrOiBEZWZlcnJlZEJsb2NrUGxhY2Vob2xkZXIpOiBSZXN1bHQ7XG4gIHZpc2l0RGVmZXJyZWRCbG9ja0Vycm9yKGJsb2NrOiBEZWZlcnJlZEJsb2NrRXJyb3IpOiBSZXN1bHQ7XG4gIHZpc2l0RGVmZXJyZWRCbG9ja0xvYWRpbmcoYmxvY2s6IERlZmVycmVkQmxvY2tMb2FkaW5nKTogUmVzdWx0O1xuICB2aXNpdERlZmVycmVkVHJpZ2dlcih0cmlnZ2VyOiBEZWZlcnJlZFRyaWdnZXIpOiBSZXN1bHQ7XG4gIHZpc2l0U3dpdGNoQmxvY2soYmxvY2s6IFN3aXRjaEJsb2NrKTogUmVzdWx0O1xuICB2aXNpdFN3aXRjaEJsb2NrQ2FzZShibG9jazogU3dpdGNoQmxvY2tDYXNlKTogUmVzdWx0O1xuICB2aXNpdEZvckxvb3BCbG9jayhibG9jazogRm9yTG9vcEJsb2NrKTogUmVzdWx0O1xuICB2aXNpdEZvckxvb3BCbG9ja0VtcHR5KGJsb2NrOiBGb3JMb29wQmxvY2tFbXB0eSk6IFJlc3VsdDtcbiAgdmlzaXRJZkJsb2NrKGJsb2NrOiBJZkJsb2NrKTogUmVzdWx0O1xuICB2aXNpdElmQmxvY2tCcmFuY2goYmxvY2s6IElmQmxvY2tCcmFuY2gpOiBSZXN1bHQ7XG4gIHZpc2l0VW5rbm93bkJsb2NrKGJsb2NrOiBVbmtub3duQmxvY2spOiBSZXN1bHQ7XG4gIHZpc2l0TGV0RGVjbGFyYXRpb24oZGVjbDogTGV0RGVjbGFyYXRpb24pOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWN1cnNpdmVWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvcjx2b2lkPiB7XG4gIHZpc2l0RWxlbWVudChlbGVtZW50OiBFbGVtZW50KTogdm9pZCB7XG4gICAgdmlzaXRBbGwodGhpcywgZWxlbWVudC5hdHRyaWJ1dGVzKTtcbiAgICB2aXNpdEFsbCh0aGlzLCBlbGVtZW50LmlucHV0cyk7XG4gICAgdmlzaXRBbGwodGhpcywgZWxlbWVudC5vdXRwdXRzKTtcbiAgICB2aXNpdEFsbCh0aGlzLCBlbGVtZW50LmNoaWxkcmVuKTtcbiAgICB2aXNpdEFsbCh0aGlzLCBlbGVtZW50LnJlZmVyZW5jZXMpO1xuICB9XG4gIHZpc2l0VGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlKTogdm9pZCB7XG4gICAgdmlzaXRBbGwodGhpcywgdGVtcGxhdGUuYXR0cmlidXRlcyk7XG4gICAgdmlzaXRBbGwodGhpcywgdGVtcGxhdGUuaW5wdXRzKTtcbiAgICB2aXNpdEFsbCh0aGlzLCB0ZW1wbGF0ZS5vdXRwdXRzKTtcbiAgICB2aXNpdEFsbCh0aGlzLCB0ZW1wbGF0ZS5jaGlsZHJlbik7XG4gICAgdmlzaXRBbGwodGhpcywgdGVtcGxhdGUucmVmZXJlbmNlcyk7XG4gICAgdmlzaXRBbGwodGhpcywgdGVtcGxhdGUudmFyaWFibGVzKTtcbiAgfVxuICB2aXNpdERlZmVycmVkQmxvY2soZGVmZXJyZWQ6IERlZmVycmVkQmxvY2spOiB2b2lkIHtcbiAgICBkZWZlcnJlZC52aXNpdEFsbCh0aGlzKTtcbiAgfVxuICB2aXNpdERlZmVycmVkQmxvY2tQbGFjZWhvbGRlcihibG9jazogRGVmZXJyZWRCbG9ja1BsYWNlaG9sZGVyKTogdm9pZCB7XG4gICAgdmlzaXRBbGwodGhpcywgYmxvY2suY2hpbGRyZW4pO1xuICB9XG4gIHZpc2l0RGVmZXJyZWRCbG9ja0Vycm9yKGJsb2NrOiBEZWZlcnJlZEJsb2NrRXJyb3IpOiB2b2lkIHtcbiAgICB2aXNpdEFsbCh0aGlzLCBibG9jay5jaGlsZHJlbik7XG4gIH1cbiAgdmlzaXREZWZlcnJlZEJsb2NrTG9hZGluZyhibG9jazogRGVmZXJyZWRCbG9ja0xvYWRpbmcpOiB2b2lkIHtcbiAgICB2aXNpdEFsbCh0aGlzLCBibG9jay5jaGlsZHJlbik7XG4gIH1cbiAgdmlzaXRTd2l0Y2hCbG9jayhibG9jazogU3dpdGNoQmxvY2spOiB2b2lkIHtcbiAgICB2aXNpdEFsbCh0aGlzLCBibG9jay5jYXNlcyk7XG4gIH1cbiAgdmlzaXRTd2l0Y2hCbG9ja0Nhc2UoYmxvY2s6IFN3aXRjaEJsb2NrQ2FzZSk6IHZvaWQge1xuICAgIHZpc2l0QWxsKHRoaXMsIGJsb2NrLmNoaWxkcmVuKTtcbiAgfVxuICB2aXNpdEZvckxvb3BCbG9jayhibG9jazogRm9yTG9vcEJsb2NrKTogdm9pZCB7XG4gICAgY29uc3QgYmxvY2tJdGVtcyA9IFtibG9jay5pdGVtLCAuLi5ibG9jay5jb250ZXh0VmFyaWFibGVzLCAuLi5ibG9jay5jaGlsZHJlbl07XG4gICAgYmxvY2suZW1wdHkgJiYgYmxvY2tJdGVtcy5wdXNoKGJsb2NrLmVtcHR5KTtcbiAgICB2aXNpdEFsbCh0aGlzLCBibG9ja0l0ZW1zKTtcbiAgfVxuICB2aXNpdEZvckxvb3BCbG9ja0VtcHR5KGJsb2NrOiBGb3JMb29wQmxvY2tFbXB0eSk6IHZvaWQge1xuICAgIHZpc2l0QWxsKHRoaXMsIGJsb2NrLmNoaWxkcmVuKTtcbiAgfVxuICB2aXNpdElmQmxvY2soYmxvY2s6IElmQmxvY2spOiB2b2lkIHtcbiAgICB2aXNpdEFsbCh0aGlzLCBibG9jay5icmFuY2hlcyk7XG4gIH1cbiAgdmlzaXRJZkJsb2NrQnJhbmNoKGJsb2NrOiBJZkJsb2NrQnJhbmNoKTogdm9pZCB7XG4gICAgY29uc3QgYmxvY2tJdGVtcyA9IGJsb2NrLmNoaWxkcmVuO1xuICAgIGJsb2NrLmV4cHJlc3Npb25BbGlhcyAmJiBibG9ja0l0ZW1zLnB1c2goYmxvY2suZXhwcmVzc2lvbkFsaWFzKTtcbiAgICB2aXNpdEFsbCh0aGlzLCBibG9ja0l0ZW1zKTtcbiAgfVxuICB2aXNpdENvbnRlbnQoY29udGVudDogQ29udGVudCk6IHZvaWQge1xuICAgIHZpc2l0QWxsKHRoaXMsIGNvbnRlbnQuY2hpbGRyZW4pO1xuICB9XG4gIHZpc2l0VmFyaWFibGUodmFyaWFibGU6IFZhcmlhYmxlKTogdm9pZCB7fVxuICB2aXNpdFJlZmVyZW5jZShyZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHZvaWQge31cbiAgdmlzaXRUZXh0QXR0cmlidXRlKGF0dHJpYnV0ZTogVGV4dEF0dHJpYnV0ZSk6IHZvaWQge31cbiAgdmlzaXRCb3VuZEF0dHJpYnV0ZShhdHRyaWJ1dGU6IEJvdW5kQXR0cmlidXRlKTogdm9pZCB7fVxuICB2aXNpdEJvdW5kRXZlbnQoYXR0cmlidXRlOiBCb3VuZEV2ZW50KTogdm9pZCB7fVxuICB2aXNpdFRleHQodGV4dDogVGV4dCk6IHZvaWQge31cbiAgdmlzaXRCb3VuZFRleHQodGV4dDogQm91bmRUZXh0KTogdm9pZCB7fVxuICB2aXNpdEljdShpY3U6IEljdSk6IHZvaWQge31cbiAgdmlzaXREZWZlcnJlZFRyaWdnZXIodHJpZ2dlcjogRGVmZXJyZWRUcmlnZ2VyKTogdm9pZCB7fVxuICB2aXNpdFVua25vd25CbG9jayhibG9jazogVW5rbm93bkJsb2NrKTogdm9pZCB7fVxuICB2aXNpdExldERlY2xhcmF0aW9uKGRlY2w6IExldERlY2xhcmF0aW9uKTogdm9pZCB7fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmlzaXRBbGw8UmVzdWx0Pih2aXNpdG9yOiBWaXNpdG9yPFJlc3VsdD4sIG5vZGVzOiBOb2RlW10pOiBSZXN1bHRbXSB7XG4gIGNvbnN0IHJlc3VsdDogUmVzdWx0W10gPSBbXTtcbiAgaWYgKHZpc2l0b3IudmlzaXQpIHtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIHZpc2l0b3IudmlzaXQobm9kZSkgfHwgbm9kZS52aXNpdCh2aXNpdG9yKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICBjb25zdCBuZXdOb2RlID0gbm9kZS52aXNpdCh2aXNpdG9yKTtcbiAgICAgIGlmIChuZXdOb2RlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG5ld05vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19
|
|
@@ -1,35 +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 { mapLiteral } from '../output/map_util';
|
|
9
|
-
import * as o from '../output/output_ast';
|
|
10
|
-
import { Identifiers as R3 } from './r3_identifiers';
|
|
11
|
-
import { devOnlyGuardedExpression } from './util';
|
|
12
|
-
/**
|
|
13
|
-
* Generate an ngDevMode guarded call to setClassDebugInfo with the debug info about the class
|
|
14
|
-
* (e.g., the file name in which the class is defined)
|
|
15
|
-
*/
|
|
16
|
-
export function compileClassDebugInfo(debugInfo) {
|
|
17
|
-
const debugInfoObject = {
|
|
18
|
-
className: debugInfo.className,
|
|
19
|
-
};
|
|
20
|
-
// Include file path and line number only if the file relative path is calculated successfully.
|
|
21
|
-
if (debugInfo.filePath) {
|
|
22
|
-
debugInfoObject.filePath = debugInfo.filePath;
|
|
23
|
-
debugInfoObject.lineNumber = debugInfo.lineNumber;
|
|
24
|
-
}
|
|
25
|
-
// Include forbidOrphanRendering only if it's set to true (to reduce generated code)
|
|
26
|
-
if (debugInfo.forbidOrphanRendering) {
|
|
27
|
-
debugInfoObject.forbidOrphanRendering = o.literal(true);
|
|
28
|
-
}
|
|
29
|
-
const fnCall = o
|
|
30
|
-
.importExpr(R3.setClassDebugInfo)
|
|
31
|
-
.callFn([debugInfo.type, mapLiteral(debugInfoObject)]);
|
|
32
|
-
const iife = o.arrowFn([], [devOnlyGuardedExpression(fnCall).toStmt()]);
|
|
33
|
-
return iife.callFn([]);
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicjNfY2xhc3NfZGVidWdfaW5mb19jb21waWxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyL3NyYy9yZW5kZXIzL3IzX2NsYXNzX2RlYnVnX2luZm9fY29tcGlsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxDQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFMUMsT0FBTyxFQUFDLFdBQVcsSUFBSSxFQUFFLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxRQUFRLENBQUM7QUF1Q2hEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxTQUEyQjtJQUMvRCxNQUFNLGVBQWUsR0FLakI7UUFDRixTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7S0FDL0IsQ0FBQztJQUVGLCtGQUErRjtJQUMvRixJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QixlQUFlLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7UUFDOUMsZUFBZSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDO0lBQ3BELENBQUM7SUFFRCxvRkFBb0Y7SUFDcEYsSUFBSSxTQUFTLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNwQyxlQUFlLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQztTQUNiLFVBQVUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUM7U0FDaEMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7bWFwTGl0ZXJhbH0gZnJvbSAnLi4vb3V0cHV0L21hcF91dGlsJztcbmltcG9ydCAqIGFzIG8gZnJvbSAnLi4vb3V0cHV0L291dHB1dF9hc3QnO1xuXG5pbXBvcnQge0lkZW50aWZpZXJzIGFzIFIzfSBmcm9tICcuL3IzX2lkZW50aWZpZXJzJztcbmltcG9ydCB7ZGV2T25seUd1YXJkZWRFeHByZXNzaW9ufSBmcm9tICcuL3V0aWwnO1xuXG4vKipcbiAqIEluZm8gbmVlZGVkIGZvciBydW50aW1lIGVycm9ycyByZWxhdGVkIHRvIGEgY2xhc3MsIHN1Y2ggYXMgdGhlIGxvY2F0aW9uIGluIHdoaWNoIHRoZSBjbGFzcyBpc1xuICogZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSM0NsYXNzRGVidWdJbmZvIHtcbiAgLyoqIFRoZSBjbGFzcyBpZGVudGlmaWVyICovXG4gIHR5cGU6IG8uRXhwcmVzc2lvbjtcblxuICAvKipcbiAgICogQSBzdHJpbmcgbGl0ZXJhbCBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBjbGFzcyBuYW1lIGFzIGFwcGVhcnMgaW4gaXRzIGRlZmluaXRpb24uXG4gICAqL1xuICBjbGFzc05hbWU6IG8uRXhwcmVzc2lvbjtcblxuICAvKipcbiAgICogQSBzdHJpbmcgbGl0ZXJhbCBjb250YWluaW5nIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBjbGFzcyBpcyBkZWZpbmVkLlxuICAgKlxuICAgKiBUaGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCByb290LiBUaGUgY29tcGlsZXIgZG9lcyB0aGUgYmVzdCBlZmZvcnQgdG8gZmluZCB0aGUgcHJvamVjdFxuICAgKiByb290IChlLmcuLCB1c2luZyB0aGUgcm9vdERpciBvZiB0c2NvbmZpZyksIGJ1dCBpZiBpdCBmYWlscyB0aGlzIGZpZWxkIGlzIHNldCB0byBudWxsLFxuICAgKiBpbmRpY2F0aW5nIHRoYXQgdGhlIGZpbGUgcGF0aCB3YXMgZmFpbGVkIHRvIGJlIGNvbXB1dGVkLiBJbiB0aGlzIGNhc2UsIHRoZSBkb3duc3RyZWFtIGNvbnN1bWVyc1xuICAgKiBvZiB0aGUgZGVidWcgaW5mbyB3aWxsIHVzdWFsbHkgaWdub3JlIHRoZSBgbGluZU51bWJlcmAgZmllbGQgYXMgd2VsbCBhbmQganVzdCBzaG93IHRoZVxuICAgKiBgY2xhc3NOYW1lYC4gRm9yIHNlY3VyaXR5IHJlYXNvbnMgd2UgbmV2ZXIgc2hvdyB0aGUgYWJzb2x1dGUgZmlsZSBwYXRoIGFuZCBwcmVmZXIgdG8ganVzdFxuICAgKiByZXR1cm4gbnVsbCBoZXJlLlxuICAgKi9cbiAgZmlsZVBhdGg6IG8uRXhwcmVzc2lvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgbnVtYmVyIGxpdGVyYWwgbnVtYmVyIGNvbnRhaW5pbmcgdGhlIGxpbmUgbnVtYmVyIGluIHdoaWNoIHRoaXMgY2xhc3MgaXMgZGVmaW5lZC5cbiAgICovXG4gIGxpbmVOdW1iZXI6IG8uRXhwcmVzc2lvbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjaGVjayBpZiB0aGlzIGNvbXBvbmVudCBpcyBiZWluZyByZW5kZXJlZCB3aXRob3V0IGl0cyBOZ01vZHVsZSBiZWluZyBsb2FkZWQgaW50byB0aGVcbiAgICogYnJvd3Nlci4gU3VjaCBjaGVja3MgaXMgY2FycmllZCBvdXQgb25seSBpbiBkZXYgbW9kZS5cbiAgICovXG4gIGZvcmJpZE9ycGhhblJlbmRlcmluZzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhbiBuZ0Rldk1vZGUgZ3VhcmRlZCBjYWxsIHRvIHNldENsYXNzRGVidWdJbmZvIHdpdGggdGhlIGRlYnVnIGluZm8gYWJvdXQgdGhlIGNsYXNzXG4gKiAoZS5nLiwgdGhlIGZpbGUgbmFtZSBpbiB3aGljaCB0aGUgY2xhc3MgaXMgZGVmaW5lZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVDbGFzc0RlYnVnSW5mbyhkZWJ1Z0luZm86IFIzQ2xhc3NEZWJ1Z0luZm8pOiBvLkV4cHJlc3Npb24ge1xuICBjb25zdCBkZWJ1Z0luZm9PYmplY3Q6IHtcbiAgICBjbGFzc05hbWU6IG8uRXhwcmVzc2lvbjtcbiAgICBmaWxlUGF0aD86IG8uRXhwcmVzc2lvbjtcbiAgICBsaW5lTnVtYmVyPzogby5FeHByZXNzaW9uO1xuICAgIGZvcmJpZE9ycGhhblJlbmRlcmluZz86IG8uRXhwcmVzc2lvbjtcbiAgfSA9IHtcbiAgICBjbGFzc05hbWU6IGRlYnVnSW5mby5jbGFzc05hbWUsXG4gIH07XG5cbiAgLy8gSW5jbHVkZSBmaWxlIHBhdGggYW5kIGxpbmUgbnVtYmVyIG9ubHkgaWYgdGhlIGZpbGUgcmVsYXRpdmUgcGF0aCBpcyBjYWxjdWxhdGVkIHN1Y2Nlc3NmdWxseS5cbiAgaWYgKGRlYnVnSW5mby5maWxlUGF0aCkge1xuICAgIGRlYnVnSW5mb09iamVjdC5maWxlUGF0aCA9IGRlYnVnSW5mby5maWxlUGF0aDtcbiAgICBkZWJ1Z0luZm9PYmplY3QubGluZU51bWJlciA9IGRlYnVnSW5mby5saW5lTnVtYmVyO1xuICB9XG5cbiAgLy8gSW5jbHVkZSBmb3JiaWRPcnBoYW5SZW5kZXJpbmcgb25seSBpZiBpdCdzIHNldCB0byB0cnVlICh0byByZWR1Y2UgZ2VuZXJhdGVkIGNvZGUpXG4gIGlmIChkZWJ1Z0luZm8uZm9yYmlkT3JwaGFuUmVuZGVyaW5nKSB7XG4gICAgZGVidWdJbmZvT2JqZWN0LmZvcmJpZE9ycGhhblJlbmRlcmluZyA9IG8ubGl0ZXJhbCh0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IGZuQ2FsbCA9IG9cbiAgICAuaW1wb3J0RXhwcihSMy5zZXRDbGFzc0RlYnVnSW5mbylcbiAgICAuY2FsbEZuKFtkZWJ1Z0luZm8udHlwZSwgbWFwTGl0ZXJhbChkZWJ1Z0luZm9PYmplY3QpXSk7XG4gIGNvbnN0IGlpZmUgPSBvLmFycm93Rm4oW10sIFtkZXZPbmx5R3VhcmRlZEV4cHJlc3Npb24oZm5DYWxsKS50b1N0bXQoKV0pO1xuICByZXR1cm4gaWlmZS5jYWxsRm4oW10pO1xufVxuIl19
|